1 |
|
2 |
|
3 | class LindaClient
|
4 | connect: (@io) ->
|
5 | return @
|
6 |
|
7 | tuplespace: (name) ->
|
8 | return new TupleSpace @, name
|
9 |
|
10 | requestKeepalive: (url) ->
|
11 | @tuplespace('__linda').write {type: 'keepalive', to: url}
|
12 |
|
13 | class TupleSpace
|
14 |
|
15 | constructor: (@linda, @name) ->
|
16 | @watch_callback_ids = {}
|
17 | @io_callbacks = []
|
18 | @linda.io.on 'disconnect', =>
|
19 | @remove_io_callbacks()
|
20 |
|
21 | create_callback_id: ->
|
22 | return Date.now() - Math.random()
|
23 |
|
24 | create_watch_callback_id: (tuple) ->
|
25 | key = JSON.stringify tuple
|
26 | return @watch_callback_ids[key] or
|
27 | @watch_callback_ids[key] = @create_callback_id()
|
28 |
|
29 | remove_io_callbacks: ->
|
30 | for c in @io_callbacks
|
31 | @linda.io.removeListener c.name, c.listener
|
32 | @io_callbacks = []
|
33 |
|
34 | write: (tuple, options={expire: null}) ->
|
35 | data = { tuplespace: @name, tuple: tuple, options: options }
|
36 | @linda.io.emit '__linda_write', data
|
37 |
|
38 | take: (tuple, callback) ->
|
39 | return if typeof callback isnt 'function'
|
40 | id = @create_callback_id()
|
41 | name = "__linda_take_#{id}"
|
42 | listener = (err, tuple) ->
|
43 | callback err, tuple
|
44 | @io_callbacks.push {name: name, listener: listener}
|
45 | @linda.io.once name, listener
|
46 | @linda.io.emit '__linda_take', {tuplespace: @name, tuple: tuple, id: id}
|
47 | return id
|
48 |
|
49 | read: (tuple, callback) ->
|
50 | return if typeof callback isnt 'function'
|
51 | id = @create_callback_id()
|
52 | name = "__linda_read_#{id}"
|
53 | listener = (err, tuple) ->
|
54 | callback err, tuple
|
55 | @io_callbacks.push {name: name, listener: listener}
|
56 | @linda.io.once name, listener
|
57 | @linda.io.emit '__linda_read', {tuplespace: @name, tuple: tuple, id: id}
|
58 | return id
|
59 |
|
60 | watch: (tuple, callback) ->
|
61 | return if typeof callback isnt 'function'
|
62 | id = @create_watch_callback_id tuple
|
63 | name = "__linda_watch_#{id}"
|
64 | listener = (err, tuple) ->
|
65 | callback err, tuple
|
66 | @io_callbacks.push {name: name, listener: listener}
|
67 | @linda.io.on name, listener
|
68 | @linda.io.emit '__linda_watch', {tuplespace: @name, tuple: tuple, id: id}
|
69 | return id
|
70 |
|
71 | cancel: (id) ->
|
72 | if @linda.io.connected
|
73 | @linda.io.emit '__linda_cancel', {tuplespace: @name, id: id}
|
74 | setTimeout =>
|
75 | for i in [(@io_callbacks.length-1)..0]
|
76 | c = @io_callbacks[i]
|
77 | if c.name.match(new RegExp "_#{id}$")
|
78 | @linda.io.removeListener c.name, c.listener
|
79 | @io_callbacks.splice i, 1
|
80 | , 100
|
81 |
|
82 |
|
83 | if window?
|
84 | window.Linda = LindaClient
|
85 | else if module?.exports?
|
86 | module.exports = LindaClient
|