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