75 lines
1.5 KiB
Plaintext
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
|
|
|