UNPKG

2.51 kBtext/coffeescriptView Raw
1## linda client for webbrowser
2
3class 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
13class 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 unless typeof callback == '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 unless typeof callback == '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 unless typeof callback == '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
83if window?
84 window.Linda = LindaClient
85else if module?.exports?
86 module.exports = LindaClient