2019-11-20 19:22:51 +01:00
|
|
|
# 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 = {}
|
|
|
|
|
2019-12-03 05:29:09 +01:00
|
|
|
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
|
|
|
|
}
|
|
|
|
|
2019-11-22 16:52:50 +01:00
|
|
|
# users can record functions to run on events
|
2019-12-03 05:29:09 +01:00
|
|
|
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) ->
|
2019-12-04 04:17:38 +01:00
|
|
|
# console.log "add event listener", type, callback, response-types[type]
|
2019-12-03 05:29:09 +01:00
|
|
|
type = response-types[type]
|
|
|
|
|
|
|
|
self.callbacks[type] ++= [callback]
|
2019-11-22 16:52:50 +01:00
|
|
|
|
2019-11-20 19:22:51 +01:00
|
|
|
self.open-socket = ->
|
|
|
|
console.log "Opening socket to #{socket-url}"
|
|
|
|
self.socket := new WebSocket socket-url
|
|
|
|
|
|
|
|
self.socket.onerror = (event) ->
|
2019-12-03 05:29:09 +01:00
|
|
|
for f in self.user-on-socket-error
|
2019-11-22 16:52:50 +01:00
|
|
|
f event
|
2019-11-20 19:22:51 +01:00
|
|
|
self.socket.close!
|
|
|
|
|
|
|
|
self.socket.onclose = (event) ->
|
2019-12-03 05:29:09 +01:00
|
|
|
for f in self.user-on-socket-close
|
2019-11-22 16:52:50 +01:00
|
|
|
f event
|
2019-11-20 19:22:51 +01:00
|
|
|
|
|
|
|
self.socket.onmessage = (event) ->
|
2019-12-03 05:29:09 +01:00
|
|
|
message = JSON.parse(event.data)
|
|
|
|
console.log "todod message received: ", message
|
2019-11-20 19:22:51 +01:00
|
|
|
|
2019-12-03 05:29:09 +01:00
|
|
|
for f in self.callbacks[message.mtype]
|
|
|
|
f JSON.parse(message.payload)
|
2019-11-20 19:22:51 +01:00
|
|
|
|
|
|
|
self.reopen = ->
|
|
|
|
self.socket.close!
|
|
|
|
self.open-socket!
|
|
|
|
|
|
|
|
self.open-socket!
|
|
|
|
|
2019-12-03 05:29:09 +01:00
|
|
|
self.send = (type, opts) ->
|
|
|
|
console.log JSON.stringify { mtype: type, payload: opts }
|
|
|
|
self.socket.send JSON.stringify { mtype: type, payload: opts }
|
2019-11-20 19:22:51 +01:00
|
|
|
|
|
|
|
|
2019-12-03 05:29:09 +01:00
|
|
|
self.list-lists = (token) ->
|
|
|
|
self.send request-types[\list-lists], JSON.stringify {
|
|
|
|
token: token
|
2019-11-20 19:22:51 +01:00
|
|
|
}
|
|
|
|
|
2019-12-04 04:17:38 +01:00
|
|
|
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
|
2019-11-20 19:22:51 +01:00
|
|
|
|
|
|
|
self
|
|
|
|
}
|