# todod module # 1. create a socket # 2. the socket parses and serialize data # 3. the socket handles network errors module.exports = { create-socket: (socket-url) -> self = {} request-types = { "list-lists": 0 "get-list": 1 "add-list": 2 "edit-list": 3 "remove-list": 4 "get-tasks": 5 "get-task": 6 "add-task": 7 "remove-task": 8 "edit-task": 9 } response-types = { "ok": 0 "error": 1 "lists-list": 2 "new-list": 3 "list-removed": 4 "list-updated": 5 "tasks": 6 "task": 7 "task-created": 8 "task-removed": 9 "task-updated": 10 } # users can record functions to run on events self.user-on-socket-error = [] self.user-on-socket-close = [] self.callbacks = {} for key, value of response-types self.callbacks[value] = [] self.add-event-listener = (type, callback) -> # console.log "add event listener", type, callback, response-types[type] type = response-types[type] self.callbacks[type] ++= [callback] self.open-socket = -> console.log "Opening socket to #{socket-url}" 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) console.log "todod message received: ", message for f in self.callbacks[message.mtype] f JSON.parse(message.payload) self.reopen = -> self.socket.close! self.open-socket! self.open-socket! self.send = (type, opts) -> console.log JSON.stringify { mtype: type, payload: opts } self.socket.send JSON.stringify { mtype: type, payload: opts } self.list-lists = (token) -> self.send request-types[\list-lists], JSON.stringify { token: token } self.get-list = (token, list-id) -> self.send request-types[\get-list], JSON.stringify { token: token list: list-id } self.get-tasks = (token, list-id) -> self.send request-types[\get-tasks], JSON.stringify { token: token list: list-id } self.get-task = (token, task-id) -> self.send request-types[\get-task], JSON.stringify { token: token task: task-id } self.remove-list = (token, list-id) -> self.send request-types[\remove-list], JSON.stringify { token: token list: list-id } # TODO: extra properties self.add-list = (token, title, opts) -> payload = { token: token title: title } for key, value of opts payload[key] = value self.send request-types[\add-list], JSON.stringify payload self.edit-list = (token, list-id, opts) -> payload = { token: token list: list-id } for key, value of opts payload[key] = value self.send request-types[\edit-list], JSON.stringify payload self.remove-task = (token, task-id) -> self.send request-types[\remove-task], JSON.stringify { token: token task: task-id } # TODO: extra properties self.add-task = (token, list-id, title, opts) -> payload = { token: token list: list-id title: title } for key, value of opts payload[key] = value self.send request-types[\add-task], JSON.stringify payload self.edit-task = (token, id, opts) -> payload = { token: token list: list-id } for key, value of opts payload[key] = value self.send request-types[\edit-task], JSON.stringify payload self }