index.jsView |
---|
42 | 42 … | function toEnd(err) { |
43 | 43 … | return err === true ? null : err |
44 | 44 … | } |
45 | 45 … | |
46 | | -module.exports = function (seqs, get, append, onChange, callback) { |
| 46 … | + |
| 47 … | + |
| 48 … | +module.exports = function (get, append) { |
47 | 49 … | |
48 | | - var readyMsg = [], readyNote = {} |
49 | | - onChange = onChange || require('./bounce')(function () { |
50 | | - console.log(progress(states)) |
51 | | - }, 1000) |
| 50 … | + return function (opts, callback) { |
| 51 … | + if('function' === typeof opts) |
| 52 … | + callback = opts, opts = {} |
52 | 53 … | |
53 | | - function maybeQueue(key, state) { |
54 | | - if('string' !== typeof key) throw new Error('key should be string') |
55 | | - if('object' !== typeof state) |
56 | | - throw new Error('state should be object') |
| 54 … | + var readyMsg = [], readyNote = {} |
| 55 … | + onChange = opts.onChange || require('./bounce')(function () { |
| 56 … | + console.log(progress(states)) |
| 57 … | + }, 1000) |
57 | 58 … | |
58 | | - if(isMessage(state.ready)) |
59 | | - readyMsg.push(state) |
60 | | - else if(isNote(state.ready)) |
61 | | - readyNote[key] = true |
62 | | - } |
| 59 … | + |
| 60 … | + var onRequest = opts.onRequest || function (id, seq) { |
| 61 … | + stream.request(id, 0) |
| 62 … | + } |
63 | 63 … | |
64 | | - var states = {}, error |
65 | | - for(var k in seqs) |
66 | | - states[k] = S.init(seqs[k]) |
| 64 … | + function maybeQueue(key, state) { |
| 65 … | + if('string' !== typeof key) throw new Error('key should be string') |
| 66 … | + if('object' !== typeof state) |
| 67 … | + throw new Error('state should be object') |
67 | 68 … | |
68 | | - var next = Next() |
69 | | - function checkNote (k) { |
70 | | - if(isNote(states[k].effect)) { |
71 | | - get(k, states[k].effect, function (err, msg) { |
72 | | - if(msg) { |
73 | | - maybeQueue(k, states[k] = S.gotMessage(states[k], msg)) |
74 | | - if(states[k].ready) next() |
75 | | - } |
76 | | - }) |
| 69 … | + if(isMessage(state.ready)) |
| 70 … | + readyMsg.push(state) |
| 71 … | + else if(isNote(state.ready)) |
| 72 … | + readyNote[key] = true |
77 | 73 … | } |
78 | | - } |
79 | | - for(var k in seqs) |
80 | | - readyNote[k] = true |
81 | 74 … | |
82 | | - var stream |
83 | | - return stream = { |
84 | | - sink: function (read) { |
85 | | - read(null, function cb (err, data) { |
86 | | - |
87 | | - if(err && !error) { |
88 | | - callback(toEnd(error = err)) |
89 | | - } |
90 | | - if(error) return read(error, function () {}) |
| 75 … | + var states = {}, error |
91 | 76 … | |
92 | | - if(isMessage(data)) { |
93 | | - if(!states[data.author]) throw new Error('received strange author') |
94 | | - maybeQueue(data.author, states[data.author] = S.receiveMessage(states[data.author], data)) |
95 | | - if(isMessage(states[data.author].effect)) { |
96 | | - states[data.author].effect = null |
97 | | - |
98 | | - |
99 | | - |
100 | | - |
101 | | - |
102 | | - append(data, function (err) { |
103 | | - onChange() |
104 | | - read(null, cb) |
105 | | - next() |
106 | | - }) |
| 77 … | + var next = Next() |
| 78 … | + function checkNote (k) { |
| 79 … | + if(isNote(states[k].effect)) { |
| 80 … | + get(k, states[k].effect, function (err, msg) { |
| 81 … | + if(msg) { |
| 82 … | + maybeQueue(k, states[k] = S.gotMessage(states[k], msg)) |
| 83 … | + if(states[k].ready) next() |
107 | 84 … | } |
108 | | - else |
109 | | - read(null, cb) |
| 85 … | + }) |
| 86 … | + } |
| 87 … | + } |
110 | 88 … | |
111 | | - next() |
112 | | - } |
113 | | - else { |
114 | | - var ready = false |
| 89 … | + var stream = { |
| 90 … | + sink: function (read) { |
| 91 … | + read(null, function cb (err, data) { |
| 92 … | + |
| 93 … | + if(err && !error) { |
| 94 … | + callback(toEnd(error = err)) |
| 95 … | + } |
| 96 … | + if(error) return read(error, function () {}) |
115 | 97 … | |
116 | | - for(var k in data) { |
117 | | - |
118 | | - if(!states[k]) states[k] = S.init(0) |
119 | | - maybeQueue(k, states[k] = S.receiveNote(states[k], data[k])) |
120 | | - if(states[k].ready != null) |
121 | | - ready = true |
122 | | - checkNote(k) |
| 98 … | + if(isMessage(data)) { |
| 99 … | + if(!states[data.author]) throw new Error('received strange author') |
| 100 … | + maybeQueue(data.author, states[data.author] = S.receiveMessage(states[data.author], data)) |
| 101 … | + if(isMessage(states[data.author].effect)) { |
| 102 … | + states[data.author].effect = null |
| 103 … | + |
| 104 … | + |
| 105 … | + |
| 106 … | + |
| 107 … | + |
| 108 … | + append(data, function (err) { |
| 109 … | + onChange() |
| 110 … | + read(null, cb) |
| 111 … | + next() |
| 112 … | + }) |
| 113 … | + } |
| 114 … | + else |
| 115 … | + read(null, cb) |
| 116 … | + |
| 117 … | + next() |
123 | 118 … | } |
| 119 … | + else { |
| 120 … | + var ready = false |
124 | 121 … | |
125 | | - if(ready) next() |
126 | | - onChange() |
127 | | - read(null, cb) |
128 | | - } |
129 | | - }) |
130 | | - }, |
131 | | - source: function (abort, cb) { |
132 | | - |
133 | | - |
134 | | - |
135 | | - if(abort) { |
136 | | - if(!error) |
137 | | - return callback(toEnd(error = abort)) |
138 | | - else |
139 | | - error = abort |
140 | | - } |
141 | | - ;(function read () { |
142 | | - |
143 | | - if(error) return cb(error) |
| 122 … | + for(var k in data) { |
| 123 … | + |
| 124 … | + |
| 125 … | + |
| 126 … | + if(!states[k]) onRequest(k, data[k]) |
144 | 127 … | |
145 | | - var state |
146 | | - if(readyMsg.length && (state = oldest(readyMsg)) && isMessage(state.ready)) { |
147 | | - var msg = state.ready |
148 | | - maybeQueue(msg.author, state = S.read(state)) |
149 | | - checkNote(msg.author) |
150 | | - onChange() |
151 | | - cb(null, msg) |
152 | | - } |
153 | | - else { |
154 | | - var notes = {}, n = 0 |
155 | | - |
156 | | - for(k in readyNote) { |
157 | | - if(isNote(states[k].ready)) { |
158 | | - n ++ |
159 | | - notes[k] = states[k].ready |
160 | | - states[k] = S.read(states[k]) |
| 128 … | + maybeQueue(k, states[k] = S.receiveNote(states[k], data[k])) |
| 129 … | + if(states[k].ready != null) |
| 130 … | + ready = true |
161 | 131 … | checkNote(k) |
162 | 132 … | } |
| 133 … | + |
| 134 … | + if(ready) next() |
| 135 … | + onChange() |
| 136 … | + read(null, cb) |
163 | 137 … | } |
| 138 … | + }) |
| 139 … | + }, |
| 140 … | + source: function (abort, cb) { |
| 141 … | + |
| 142 … | + |
| 143 … | + |
| 144 … | + if(abort) { |
| 145 … | + if(!error) |
| 146 … | + return callback(toEnd(error = abort)) |
| 147 … | + else |
| 148 … | + error = abort |
| 149 … | + } |
| 150 … | + ;(function read () { |
| 151 … | + |
| 152 … | + if(error) return cb(error) |
164 | 153 … | |
165 | | - readyNote = {} |
| 154 … | + var state |
| 155 … | + if(readyMsg.length && (state = oldest(readyMsg)) && isMessage(state.ready)) { |
| 156 … | + var msg = state.ready |
| 157 … | + maybeQueue(msg.author, state = S.read(state)) |
| 158 … | + checkNote(msg.author) |
| 159 … | + onChange() |
| 160 … | + cb(null, msg) |
| 161 … | + } |
| 162 … | + else { |
| 163 … | + var notes = {}, n = 0 |
166 | 164 … | |
167 | | - onChange() |
168 | | - if(n) cb(null, notes) |
169 | | - else next(read) |
| 165 … | + for(k in readyNote) { |
| 166 … | + if(isNote(states[k].ready)) { |
| 167 … | + n ++ |
| 168 … | + notes[k] = states[k].ready |
| 169 … | + states[k] = S.read(states[k]) |
| 170 … | + checkNote(k) |
| 171 … | + } |
| 172 … | + } |
| 173 … | + |
| 174 … | + readyNote = {} |
| 175 … | + |
| 176 … | + onChange() |
| 177 … | + if(n) cb(null, notes) |
| 178 … | + else next(read) |
| 179 … | + } |
| 180 … | + })() |
| 181 … | + }, |
| 182 … | + progress: function () { |
| 183 … | + return progress(states) |
| 184 … | + }, |
| 185 … | + onAppend: function (msg) { |
| 186 … | + var k = msg.author |
| 187 … | + |
| 188 … | + if(!states[k]) maybeQueue(k, states[k] = S.init(msg.sequence)) |
| 189 … | + if(states[k]) { |
| 190 … | + maybeQueue(k, states[k] = S.appendMessage(states[k], msg)) |
| 191 … | + checkNote(k) |
| 192 … | + next() |
170 | 193 … | } |
171 | | - })() |
172 | | - }, |
173 | | - progress: function () { |
174 | | - return progress(states) |
175 | | - }, |
176 | | - onAppend: function (msg) { |
177 | | - var k = msg.author |
178 | | - |
179 | | - if(!states[k]) maybeQueue(k, states[k] = S.init(msg.sequence)) |
180 | | - if(states[k]) { |
181 | | - maybeQueue(k, states[k] = S.appendMessage(states[k], msg)) |
182 | | - checkNote(k) |
183 | | - next() |
184 | | - } |
| 194 … | + }, |
| 195 … | + request: function (id, seq) { |
| 196 … | + if(!states[id]) { |
| 197 … | + states[id] = S.init(seq) |
| 198 … | + readyNote[id] = true |
| 199 … | + } |
| 200 … | + }, |
| 201 … | + states: states |
185 | 202 … | } |
| 203 … | + |
| 204 … | + if(opts.seqs) { |
| 205 … | + for(var k in opts.seqs) |
| 206 … | + stream.request(k, opts.seqs[k]) |
| 207 … | + } |
| 208 … | + return stream |
| 209 … | + |
186 | 210 … | } |
187 | 211 … | } |
188 | 212 … | |
| 213 … | + |
| 214 … | + |
| 215 … | + |
| 216 … | + |
| 217 … | + |
| 218 … | + |
| 219 … | + |