ZeroFrame.coffee 1.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869
  1. class ZeroFrame extends Class
  2. constructor: (url) ->
  3. @url = url
  4. @waiting_cb = {}
  5. @connect()
  6. @next_message_id = 1
  7. @init()
  8. init: ->
  9. @
  10. connect: ->
  11. @target = window.parent
  12. window.addEventListener("message", @onMessage, false)
  13. @cmd("innerReady")
  14. onMessage: (e) =>
  15. message = e.data
  16. cmd = message.cmd
  17. if cmd == "response"
  18. if @waiting_cb[message.to]?
  19. @waiting_cb[message.to](message.result)
  20. else
  21. @log "Websocket callback not found:", message
  22. else if cmd == "wrapperReady" # Wrapper inited later
  23. @cmd("innerReady")
  24. else if cmd == "ping"
  25. @response message.id, "pong"
  26. else if cmd == "wrapperOpenedWebsocket"
  27. @onOpenWebsocket()
  28. else if cmd == "wrapperClosedWebsocket"
  29. @onCloseWebsocket()
  30. else
  31. @onRequest cmd, message.params
  32. onRequest: (cmd, message) =>
  33. @log "Unknown request", message
  34. response: (to, result) ->
  35. @send {"cmd": "response", "to": to, "result": result}
  36. cmd: (cmd, params={}, cb=null) ->
  37. @send {"cmd": cmd, "params": params}, cb
  38. send: (message, cb=null) ->
  39. message.id = @next_message_id
  40. @next_message_id += 1
  41. @target.postMessage(message, "*")
  42. if cb
  43. @waiting_cb[message.id] = cb
  44. onOpenWebsocket: =>
  45. @log "Websocket open"
  46. onCloseWebsocket: =>
  47. @log "Websocket close"
  48. window.ZeroFrame = ZeroFrame