@nxtedition/deepstream.io-client-js 24.0.6 → 24.0.7

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@nxtedition/deepstream.io-client-js",
3
- "version": "24.0.6",
3
+ "version": "24.0.7",
4
4
  "description": "the javascript client for deepstream.io",
5
5
  "homepage": "http://deepstream.io",
6
6
  "bugs": {
@@ -63,6 +63,8 @@ class RecordHandler {
63
63
  this._records = new Map()
64
64
  this._listeners = new Map()
65
65
  this._pruning = new Set()
66
+ this._patching = new Map()
67
+ this._updating = new Map()
66
68
 
67
69
  this._connected = 0
68
70
  this._stats = {
@@ -124,16 +126,30 @@ class RecordHandler {
124
126
  _onUpdating(rec, value) {
125
127
  if (value) {
126
128
  this._stats.updating += 1
129
+ this._updating.set(rec, [])
127
130
  } else {
128
131
  this._stats.updating -= 1
132
+
133
+ const callbacks = this._updating.get(rec)
134
+ this._updating.delete(rec)
135
+ for (const callback of callbacks) {
136
+ callback()
137
+ }
129
138
  }
130
139
  }
131
140
 
132
141
  _onPatching(rec, value) {
133
142
  if (value) {
134
143
  this._stats.patching += 1
144
+ this._patching.set(rec, [])
135
145
  } else {
136
146
  this._stats.patching -= 1
147
+
148
+ const callbacks = this._patching.get(rec)
149
+ this._patching.delete(rec)
150
+ for (const callback of callbacks) {
151
+ callback()
152
+ }
137
153
  }
138
154
  }
139
155
 
@@ -202,13 +218,66 @@ class RecordHandler {
202
218
  }
203
219
  }
204
220
 
205
- sync() {
206
- // TODO (fix): Sync patching & updating?
207
- // TODO (fix): Ensure no pending?
208
- return new Promise((resolve) => {
209
- const token = xuid()
210
- this._syncEmitter.once(token, resolve)
211
- this._connection.sendMsg(C.TOPIC.RECORD, C.ACTIONS.SYNC, [token])
221
+ async sync() {
222
+ // TODO (fix): Sync pending? What about VOID state?
223
+
224
+ let patchingTimeout
225
+ await Promise.race([
226
+ Promise.all(
227
+ [...this._patching.values()].map(
228
+ (callbacks) => new Promise((resolve) => callbacks.push(resolve))
229
+ )
230
+ ),
231
+ new Promise((resolve) => {
232
+ patchingTimeout = timers.setTimeout(() => {
233
+ this._client._$onError(
234
+ C.TOPIC.RECORD,
235
+ C.EVENT.TIMEOUT,
236
+ new Error('sync patching timeout')
237
+ )
238
+ resolve(null)
239
+ }, 2 * 60e3)
240
+ }),
241
+ ]).finally(() => {
242
+ timers.clearTimeout(patchingTimeout)
243
+ })
244
+
245
+ let updatingTimeout
246
+ await Promise.race([
247
+ Promise.all(
248
+ [...this._updating.values()].map(
249
+ (callbacks) => new Promise((resolve) => callbacks.push(resolve))
250
+ )
251
+ ),
252
+ new Promise((resolve) => {
253
+ updatingTimeout = timers.setTimeout(() => {
254
+ this._client._$onError(
255
+ C.TOPIC.RECORD,
256
+ C.EVENT.TIMEOUT,
257
+ new Error('sync updating timeout')
258
+ )
259
+ resolve(null)
260
+ }, 2 * 60e3)
261
+ }),
262
+ ]).finally(() => {
263
+ timers.clearTimeout(updatingTimeout)
264
+ })
265
+
266
+ let serverTimeout
267
+ await Promise.race([
268
+ await new Promise((resolve) => {
269
+ const token = xuid()
270
+ this._syncEmitter.once(token, resolve)
271
+ this._connection.sendMsg(C.TOPIC.RECORD, C.ACTIONS.SYNC, [token])
272
+ }),
273
+ new Promise((resolve) => {
274
+ serverTimeout = timers.setTimeout(() => {
275
+ this._client._$onError(C.TOPIC.RECORD, C.EVENT.TIMEOUT, new Error('sync server timeout'))
276
+ resolve(null)
277
+ }, 2 * 60e3)
278
+ }),
279
+ ]).finally(() => {
280
+ timers.clearTimeout(serverTimeout)
212
281
  })
213
282
  }
214
283