ZeroFrame.coffee 1.4 KB

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