test_broswer_plugin/src/websocketd-ws.ls

75 lines
1.5 KiB
Plaintext

pascal-case = (string) ->
string.replace /^./g, ((.to-upper-case!))
.replace /-(.)/g, (m, m1) -> m1.to-upper-case!
module.exports = (socket-name, socket-url) ->
self = {}
request-types = {}
response-types = {}
delayed-messages = []
# TODO: naming convention
# users can record functions to run on events
self.user-on-socket-error = []
self.user-on-socket-close = []
self.open-socket = ->
self.socket := new WebSocket socket-url
self.socket.onerror = (event) ->
for f in self.user-on-socket-error
f event
self.socket.close!
self.socket.onclose = (event) ->
for f in self.user-on-socket-close
f event
self.socket.onmessage = (event) ->
message = JSON.parse(event.data)
key = "on" + pascal-case (response-types[message.utype] || "unknown-message")
payload = JSON.parse message.payload
console.log socket-name, message.utype, key, payload
if callback = self[key]
callback payload
self.socket.onopen = ->
delayed-messages.for-each (pair) ->
[type, opts] = pair
self.real-send type, opts
delayed-messages := []
self.reopen = ->
self.socket.close!
self.open-socket!
self.open-socket!
self.send = (type, opts) ->
if self.socket.ready-state
self.real-send type, opts
else
delayed-messages.push [type, opts]
self.real-send = (type, opts) ->
self.socket.send JSON.stringify { utype: type, payload: opts }
self.register-response-type = (type, type-name) ->
response-types[type] = type-name
self.close = ->
self.socket.close!
self