ar_sync 1.0.5 → 1.1.0

Sign up to get free protection for your applications and to get access to all the features.
data/core/ArSyncStore.js CHANGED
@@ -32,51 +32,55 @@ var __spreadArrays = (this && this.__spreadArrays) || function () {
32
32
  };
33
33
  Object.defineProperty(exports, "__esModule", { value: true });
34
34
  var ArSyncApi_1 = require("./ArSyncApi");
35
- var ModelBatchRequest = {
36
- timer: null,
37
- apiRequests: {},
38
- fetch: function (api, query, id) {
35
+ var ModelBatchRequest = /** @class */ (function () {
36
+ function ModelBatchRequest() {
37
+ this.timer = null;
38
+ this.apiRequests = new Map();
39
+ }
40
+ ModelBatchRequest.prototype.fetch = function (api, query, id) {
39
41
  var _this = this;
40
42
  this.setTimer();
41
- return new Promise(function (resolve) {
43
+ return new Promise(function (resolve, reject) {
42
44
  var queryJSON = JSON.stringify(query);
43
- var apiRequest = _this.apiRequests[api] = _this.apiRequests[api] || {};
44
- var queryRequests = apiRequest[queryJSON] = apiRequest[queryJSON] || { query: query, requests: {} };
45
- var request = queryRequests.requests[id] = queryRequests.requests[id] || { id: id, callbacks: [] };
46
- request.callbacks.push(resolve);
45
+ var apiRequest = _this.apiRequests.get(api);
46
+ if (!apiRequest)
47
+ _this.apiRequests.set(api, apiRequest = new Map());
48
+ var queryRequests = apiRequest.get(queryJSON);
49
+ if (!queryRequests)
50
+ apiRequest.set(queryJSON, queryRequests = { query: query, requests: new Map() });
51
+ var request = queryRequests.requests.get(id);
52
+ if (!request)
53
+ queryRequests.requests.set(id, request = { id: id, callbacks: [] });
54
+ request.callbacks.push({ resolve: resolve, reject: reject });
47
55
  });
48
- },
49
- batchFetch: function () {
50
- var apiRequests = this.apiRequests;
51
- for (var api in apiRequests) {
52
- var apiRequest = apiRequests[api];
53
- var _loop_1 = function (query, requests) {
54
- var ids = Object.values(requests).map(function (_a) {
55
- var id = _a.id;
56
- return id;
57
- });
56
+ };
57
+ ModelBatchRequest.prototype.batchFetch = function () {
58
+ this.apiRequests.forEach(function (apiRequest, api) {
59
+ apiRequest.forEach(function (_a) {
60
+ var query = _a.query, requests = _a.requests;
61
+ var ids = Array.from(requests.keys());
58
62
  ArSyncApi_1.default.syncFetch({ api: api, query: query, params: { ids: ids } }).then(function (models) {
59
63
  for (var _i = 0, models_1 = models; _i < models_1.length; _i++) {
60
64
  var model = models_1[_i];
61
- requests[model.id].model = model;
62
- }
63
- for (var _a = 0, _b = Object.values(requests); _a < _b.length; _a++) {
64
- var _c = _b[_a], model = _c.model, callbacks = _c.callbacks;
65
- for (var _d = 0, callbacks_1 = callbacks; _d < callbacks_1.length; _d++) {
66
- var callback = callbacks_1[_d];
67
- callback(model);
68
- }
65
+ var req = requests.get(model.id);
66
+ if (req)
67
+ req.model = model;
69
68
  }
69
+ requests.forEach(function (_a) {
70
+ var model = _a.model, callbacks = _a.callbacks;
71
+ callbacks.forEach(function (cb) { return cb.resolve(model); });
72
+ });
73
+ }).catch(function (e) {
74
+ requests.forEach(function (_a) {
75
+ var callbacks = _a.callbacks;
76
+ callbacks.forEach(function (cb) { return cb.reject(e); });
77
+ });
70
78
  });
71
- };
72
- for (var _i = 0, _a = Object.values(apiRequest); _i < _a.length; _i++) {
73
- var _b = _a[_i], query = _b.query, requests = _b.requests;
74
- _loop_1(query, requests);
75
- }
76
- }
77
- this.apiRequests = {};
78
- },
79
- setTimer: function () {
79
+ });
80
+ });
81
+ this.apiRequests.clear();
82
+ };
83
+ ModelBatchRequest.prototype.setTimer = function () {
80
84
  var _this = this;
81
85
  if (this.timer)
82
86
  return;
@@ -84,8 +88,10 @@ var ModelBatchRequest = {
84
88
  _this.timer = null;
85
89
  _this.batchFetch();
86
90
  }, 20);
87
- }
88
- };
91
+ };
92
+ return ModelBatchRequest;
93
+ }());
94
+ var modelBatchRequest = new ModelBatchRequest;
89
95
  var ArSyncContainerBase = /** @class */ (function () {
90
96
  function ArSyncContainerBase() {
91
97
  this.listeners = [];
@@ -94,9 +100,14 @@ var ArSyncContainerBase = /** @class */ (function () {
94
100
  ArSyncContainerBase.prototype.initForReload = function (request) {
95
101
  var _this = this;
96
102
  this.networkSubscriber = ArSyncStore.connectionManager.subscribeNetwork(function (state) {
97
- if (state) {
98
- ArSyncApi_1.default.syncFetch(request).then(function (data) {
99
- if (_this.data) {
103
+ if (!state) {
104
+ if (_this.onConnectionChange)
105
+ _this.onConnectionChange(false);
106
+ return;
107
+ }
108
+ if (request.id != null) {
109
+ modelBatchRequest.fetch(request.api, request.query, request.id).then(function (data) {
110
+ if (_this.data && data) {
100
111
  _this.replaceData(data);
101
112
  if (_this.onConnectionChange)
102
113
  _this.onConnectionChange(true);
@@ -106,8 +117,17 @@ var ArSyncContainerBase = /** @class */ (function () {
106
117
  });
107
118
  }
108
119
  else {
109
- if (_this.onConnectionChange)
110
- _this.onConnectionChange(false);
120
+ ArSyncApi_1.default.syncFetch(request).then(function (data) {
121
+ if (_this.data && data) {
122
+ _this.replaceData(data);
123
+ if (_this.onConnectionChange)
124
+ _this.onConnectionChange(true);
125
+ if (_this.onChange)
126
+ _this.onChange([], _this.data);
127
+ }
128
+ }).catch(function (e) {
129
+ console.error("failed to reload. " + e);
130
+ });
111
131
  }
112
132
  });
113
133
  };
@@ -154,7 +174,7 @@ var ArSyncContainerBase = /** @class */ (function () {
154
174
  return [true, false];
155
175
  if (keys.length === 1)
156
176
  return [keys[0], false];
157
- return [keys];
177
+ return [keys, false];
158
178
  }
159
179
  var needsEscape = attrs['attributes'] || attrs['params'] || attrs['as'];
160
180
  if (keys.length === 0)
@@ -180,13 +200,8 @@ var ArSyncContainerBase = /** @class */ (function () {
180
200
  result.attributes = attributes;
181
201
  return result;
182
202
  }
183
- try {
184
- var result = compactQuery(query);
185
- return result === true ? {} : result;
186
- }
187
- catch (e) {
188
- throw JSON.stringify(query) + e.stack;
189
- }
203
+ var result = compactQuery(query);
204
+ return result === true ? {} : result;
190
205
  };
191
206
  ArSyncContainerBase.parseQuery = function (query, attrsonly) {
192
207
  var attributes = {};
@@ -233,13 +248,21 @@ var ArSyncContainerBase = /** @class */ (function () {
233
248
  var api = _a.api, id = _a.id, params = _a.params, query = _a.query;
234
249
  var parsedQuery = ArSyncRecord.parseQuery(query);
235
250
  var compactQuery = ArSyncRecord.compactQuery(parsedQuery);
236
- if (id) {
237
- return ModelBatchRequest.fetch(api, compactQuery, id).then(function (data) { return new ArSyncRecord(parsedQuery, data, null, root); });
251
+ if (id != null) {
252
+ return modelBatchRequest.fetch(api, compactQuery, id).then(function (data) {
253
+ if (!data)
254
+ throw { retry: false };
255
+ var request = { api: api, id: id, query: compactQuery };
256
+ return new ArSyncRecord(parsedQuery, data, request, root);
257
+ });
238
258
  }
239
259
  else {
240
260
  var request_1 = { api: api, query: compactQuery, params: params };
241
261
  return ArSyncApi_1.default.syncFetch(request_1).then(function (response) {
242
- if (response.collection && response.order) {
262
+ if (!response) {
263
+ throw { retry: false };
264
+ }
265
+ else if (response.collection && response.order) {
243
266
  return new ArSyncCollection(response.sync_keys, 'collection', parsedQuery, response, request_1, root);
244
267
  }
245
268
  else if (response instanceof Array) {
@@ -278,16 +301,14 @@ var ArSyncRecord = /** @class */ (function (_super) {
278
301
  if (request)
279
302
  _this.initForReload(request);
280
303
  _this.query = query;
304
+ _this.queryAttributes = query.attributes || {};
281
305
  _this.data = {};
282
306
  _this.children = {};
283
307
  _this.replaceData(data);
284
308
  return _this;
285
309
  }
286
310
  ArSyncRecord.prototype.setSyncKeys = function (sync_keys) {
287
- this.sync_keys = sync_keys;
288
- if (!this.sync_keys) {
289
- this.sync_keys = [];
290
- }
311
+ this.sync_keys = sync_keys !== null && sync_keys !== void 0 ? sync_keys : [];
291
312
  };
292
313
  ArSyncRecord.prototype.replaceData = function (data) {
293
314
  this.setSyncKeys(data.sync_keys);
@@ -297,8 +318,8 @@ var ArSyncRecord = /** @class */ (function (_super) {
297
318
  this.data.id = data.id;
298
319
  }
299
320
  this.paths = [];
300
- for (var key in this.query.attributes) {
301
- var subQuery = this.query.attributes[key];
321
+ for (var key in this.queryAttributes) {
322
+ var subQuery = this.queryAttributes[key];
302
323
  var aliasName = subQuery.as || key;
303
324
  var subData = data[aliasName];
304
325
  var child = this.children[aliasName];
@@ -345,9 +366,9 @@ var ArSyncRecord = /** @class */ (function (_super) {
345
366
  }
346
367
  }
347
368
  }
348
- if (this.query.attributes['*']) {
369
+ if (this.queryAttributes['*']) {
349
370
  for (var key in data) {
350
- if (!this.query.attributes[key] && this.data[key] !== data[key]) {
371
+ if (!this.queryAttributes[key] && this.data[key] !== data[key]) {
351
372
  this.mark();
352
373
  this.data[key] = data[key];
353
374
  }
@@ -357,8 +378,8 @@ var ArSyncRecord = /** @class */ (function (_super) {
357
378
  };
358
379
  ArSyncRecord.prototype.onNotify = function (notifyData, path) {
359
380
  var _this = this;
360
- var action = notifyData.action, class_name = notifyData.class_name, id = notifyData.id;
361
- var query = path && this.query.attributes[path];
381
+ var action = notifyData.action, className = notifyData.class_name, id = notifyData.id;
382
+ var query = path && this.queryAttributes[path];
362
383
  var aliasName = (query && query.as) || path;
363
384
  if (action === 'remove') {
364
385
  var child = this.children[aliasName];
@@ -372,7 +393,7 @@ var ArSyncRecord = /** @class */ (function (_super) {
372
393
  else if (action === 'add') {
373
394
  if (this.data[aliasName] && this.data[aliasName].id === id)
374
395
  return;
375
- ModelBatchRequest.fetch(class_name, ArSyncRecord.compactQuery(query), id).then(function (data) {
396
+ modelBatchRequest.fetch(className, ArSyncRecord.compactQuery(query), id).then(function (data) {
376
397
  if (!data || !_this.data)
377
398
  return;
378
399
  var model = new ArSyncRecord(query, data, null, _this.root);
@@ -385,16 +406,21 @@ var ArSyncRecord = /** @class */ (function (_super) {
385
406
  model.parentModel = _this;
386
407
  model.parentKey = aliasName;
387
408
  _this.onChange([aliasName], model.data);
409
+ }).catch(function (e) {
410
+ console.error("failed to load " + className + ":" + id + " " + e);
388
411
  });
389
412
  }
390
413
  else {
391
414
  var field = notifyData.field;
392
415
  var query_2 = field ? this.patchQuery(field) : this.reloadQuery();
393
- if (query_2)
394
- ModelBatchRequest.fetch(class_name, query_2, id).then(function (data) {
395
- if (_this.data)
396
- _this.update(data);
397
- });
416
+ if (!query_2)
417
+ return;
418
+ modelBatchRequest.fetch(className, query_2, id).then(function (data) {
419
+ if (_this.data)
420
+ _this.update(data);
421
+ }).catch(function (e) {
422
+ console.error("failed to load patch " + className + ":" + id + " " + e);
423
+ });
398
424
  }
399
425
  };
400
426
  ArSyncRecord.prototype.subscribeAll = function () {
@@ -404,7 +430,7 @@ var ArSyncRecord = /** @class */ (function (_super) {
404
430
  var key = _a[_i];
405
431
  this.subscribe(key, callback);
406
432
  }
407
- var _loop_2 = function (path) {
433
+ var _loop_1 = function (path) {
408
434
  var pathCallback = function (data) { return _this.onNotify(data, path); };
409
435
  for (var _i = 0, _a = this_1.sync_keys; _i < _a.length; _i++) {
410
436
  var key = _a[_i];
@@ -414,11 +440,11 @@ var ArSyncRecord = /** @class */ (function (_super) {
414
440
  var this_1 = this;
415
441
  for (var _b = 0, _c = this.paths; _b < _c.length; _b++) {
416
442
  var path = _c[_b];
417
- _loop_2(path);
443
+ _loop_1(path);
418
444
  }
419
445
  };
420
446
  ArSyncRecord.prototype.patchQuery = function (key) {
421
- var val = this.query.attributes[key];
447
+ var val = this.queryAttributes[key];
422
448
  if (!val)
423
449
  return;
424
450
  var attributes = val.attributes, as = val.as, params = val.params;
@@ -440,10 +466,10 @@ var ArSyncRecord = /** @class */ (function (_super) {
440
466
  if (this.reloadQueryCache)
441
467
  return this.reloadQueryCache;
442
468
  var reloadQuery = this.reloadQueryCache = { attributes: [] };
443
- for (var key in this.query.attributes) {
469
+ for (var key in this.queryAttributes) {
444
470
  if (key === 'sync_keys')
445
471
  continue;
446
- var val = this.query.attributes[key];
472
+ var val = this.queryAttributes[key];
447
473
  if (!val || !val.attributes) {
448
474
  reloadQuery.attributes.push(key);
449
475
  }
@@ -455,7 +481,7 @@ var ArSyncRecord = /** @class */ (function (_super) {
455
481
  };
456
482
  ArSyncRecord.prototype.update = function (data) {
457
483
  for (var key in data) {
458
- var subQuery = this.query.attributes[key];
484
+ var subQuery = this.queryAttributes[key];
459
485
  if (subQuery && subQuery.attributes && Object.keys(subQuery.attributes).length > 0)
460
486
  continue;
461
487
  if (this.data[key] === data[key])
@@ -483,42 +509,39 @@ var ArSyncCollection = /** @class */ (function (_super) {
483
509
  __extends(ArSyncCollection, _super);
484
510
  function ArSyncCollection(sync_keys, path, query, data, request, root) {
485
511
  var _this = _super.call(this) || this;
486
- _this.order = { limit: null, mode: 'asc', key: 'id' };
512
+ _this.ordering = { orderBy: 'id', direction: 'asc' };
487
513
  _this.aliasOrderKey = 'id';
488
514
  _this.root = root;
489
515
  _this.path = path;
490
516
  _this.query = query;
517
+ _this.queryAttributes = query.attributes || {};
491
518
  _this.compactQuery = ArSyncRecord.compactQuery(query);
492
519
  if (request)
493
520
  _this.initForReload(request);
494
- if (query.params && (query.params.order || query.params.limit)) {
495
- _this.setOrdering(query.params.limit, query.params.order);
521
+ if (query.params) {
522
+ _this.setOrdering(query.params);
496
523
  }
497
524
  _this.data = [];
498
525
  _this.children = [];
499
526
  _this.replaceData(data, sync_keys);
500
527
  return _this;
501
528
  }
502
- ArSyncCollection.prototype.setOrdering = function (limit, order) {
503
- var mode = 'asc';
504
- var key = 'id';
505
- if (order === 'asc' || order === 'desc') {
506
- mode = order;
507
- }
508
- else if (typeof order === 'object' && order) {
509
- var keys = Object.keys(order);
510
- if (keys.length > 1)
511
- throw 'multiple order keys are not supported';
512
- if (keys.length === 1)
513
- key = keys[0];
514
- mode = order[key] === 'asc' ? 'asc' : 'desc';
515
- }
516
- var limitNumber = (typeof limit === 'number') ? limit : null;
517
- if (limitNumber !== null && key !== 'id')
518
- throw 'limit with custom order key is not supported';
519
- var subQuery = this.query.attributes[key];
520
- this.aliasOrderKey = (subQuery && subQuery.as) || key;
521
- this.order = { limit: limitNumber, mode: mode, key: key };
529
+ ArSyncCollection.prototype.setOrdering = function (ordering) {
530
+ var direction = 'asc';
531
+ var orderBy = 'id';
532
+ var first = undefined;
533
+ var last = undefined;
534
+ if (ordering.direction === 'desc')
535
+ direction = ordering.direction;
536
+ if (typeof ordering.orderBy === 'string')
537
+ orderBy = ordering.orderBy;
538
+ if (typeof ordering.first === 'number')
539
+ first = ordering.first;
540
+ if (typeof ordering.last === 'number')
541
+ last = ordering.last;
542
+ var subQuery = this.queryAttributes[orderBy];
543
+ this.aliasOrderKey = (subQuery && subQuery.as) || orderBy;
544
+ this.ordering = { first: first, last: last, direction: direction, orderBy: orderBy };
522
545
  };
523
546
  ArSyncCollection.prototype.setSyncKeys = function (sync_keys) {
524
547
  var _this = this;
@@ -531,31 +554,31 @@ var ArSyncCollection = /** @class */ (function (_super) {
531
554
  };
532
555
  ArSyncCollection.prototype.replaceData = function (data, sync_keys) {
533
556
  this.setSyncKeys(sync_keys);
534
- var existings = {};
557
+ var existings = new Map();
535
558
  for (var _i = 0, _a = this.children; _i < _a.length; _i++) {
536
559
  var child = _a[_i];
537
- existings[child.data.id] = child;
560
+ existings.set(child.data.id, child);
538
561
  }
539
562
  var collection;
540
- if ('collection' in data && 'order' in data) {
541
- collection = data.collection;
542
- this.setOrdering(data.order.limit, data.order.mode);
563
+ if (Array.isArray(data)) {
564
+ collection = data;
543
565
  }
544
566
  else {
545
- collection = data;
567
+ collection = data.collection;
568
+ this.setOrdering(data.ordering);
546
569
  }
547
570
  var newChildren = [];
548
571
  var newData = [];
549
572
  for (var _b = 0, collection_1 = collection; _b < collection_1.length; _b++) {
550
573
  var subData = collection_1[_b];
551
- var model = null;
552
- if (typeof (subData) === 'object' && subData && 'id' in subData)
553
- model = existings[subData.id];
574
+ var model = undefined;
575
+ if (typeof (subData) === 'object' && subData && 'sync_keys' in subData)
576
+ model = existings.get(subData.id);
554
577
  var data_1 = subData;
555
578
  if (model) {
556
579
  model.replaceData(subData);
557
580
  }
558
- else if (subData.id) {
581
+ else if (subData.sync_keys) {
559
582
  model = new ArSyncRecord(this.query, subData, null, this.root);
560
583
  model.parentModel = this;
561
584
  model.parentKey = subData.id;
@@ -568,7 +591,7 @@ var ArSyncCollection = /** @class */ (function (_super) {
568
591
  }
569
592
  while (this.children.length) {
570
593
  var child = this.children.pop();
571
- if (!existings[child.data.id])
594
+ if (!existings.has(child.data.id))
572
595
  child.release();
573
596
  }
574
597
  if (this.data.length || newChildren.length)
@@ -587,63 +610,94 @@ var ArSyncCollection = /** @class */ (function (_super) {
587
610
  };
588
611
  ArSyncCollection.prototype.consumeAdd = function (className, id) {
589
612
  var _this = this;
613
+ var _a = this.ordering, first = _a.first, last = _a.last, direction = _a.direction;
614
+ var limit = first || last;
590
615
  if (this.data.findIndex(function (a) { return a.id === id; }) >= 0)
591
616
  return;
592
- if (this.order.limit === this.data.length) {
593
- if (this.order.mode === 'asc') {
594
- var last = this.data[this.data.length - 1];
595
- if (last && last.id < id)
596
- return;
617
+ if (limit && limit <= this.data.length) {
618
+ var lastItem = this.data[this.data.length - 1];
619
+ var firstItem = this.data[0];
620
+ if (direction === 'asc') {
621
+ if (first) {
622
+ if (lastItem && lastItem.id < id)
623
+ return;
624
+ }
625
+ else {
626
+ if (firstItem && id < firstItem.id)
627
+ return;
628
+ }
597
629
  }
598
630
  else {
599
- var last = this.data[this.data.length - 1];
600
- if (last && last.id > id)
601
- return;
631
+ if (first) {
632
+ if (lastItem && id < lastItem.id)
633
+ return;
634
+ }
635
+ else {
636
+ if (firstItem && firstItem.id < id)
637
+ return;
638
+ }
602
639
  }
603
640
  }
604
- ModelBatchRequest.fetch(className, this.compactQuery, id).then(function (data) {
641
+ modelBatchRequest.fetch(className, this.compactQuery, id).then(function (data) {
605
642
  if (!data || !_this.data)
606
643
  return;
607
644
  var model = new ArSyncRecord(_this.query, data, null, _this.root);
608
645
  model.parentModel = _this;
609
646
  model.parentKey = id;
610
- var overflow = _this.order.limit && _this.order.limit === _this.data.length;
647
+ var overflow = limit && limit <= _this.data.length;
611
648
  var rmodel;
612
649
  _this.mark();
613
650
  var orderKey = _this.aliasOrderKey;
614
- if (_this.order.mode === 'asc') {
615
- var last = _this.data[_this.data.length - 1];
616
- _this.children.push(model);
617
- _this.data.push(model.data);
618
- if (last && last[orderKey] > data[orderKey])
619
- _this.markAndSort();
620
- if (overflow) {
621
- rmodel = _this.children.shift();
622
- rmodel.release();
623
- _this.data.shift();
651
+ var firstItem = _this.data[0];
652
+ var lastItem = _this.data[_this.data.length - 1];
653
+ if (direction === 'asc') {
654
+ if (firstItem && data[orderKey] < firstItem[orderKey]) {
655
+ _this.children.unshift(model);
656
+ _this.data.unshift(model.data);
657
+ }
658
+ else {
659
+ var skipSort = lastItem && lastItem[orderKey] < data[orderKey];
660
+ _this.children.push(model);
661
+ _this.data.push(model.data);
662
+ if (!skipSort)
663
+ _this.markAndSort();
624
664
  }
625
665
  }
626
666
  else {
627
- var first = _this.data[0];
628
- _this.children.unshift(model);
629
- _this.data.unshift(model.data);
630
- if (first && first[orderKey] > data[orderKey])
631
- _this.markAndSort();
632
- if (overflow) {
667
+ if (firstItem && data[orderKey] > firstItem[orderKey]) {
668
+ _this.children.unshift(model);
669
+ _this.data.unshift(model.data);
670
+ }
671
+ else {
672
+ var skipSort = lastItem && lastItem[orderKey] > data[orderKey];
673
+ _this.children.push(model);
674
+ _this.data.push(model.data);
675
+ if (!skipSort)
676
+ _this.markAndSort();
677
+ }
678
+ }
679
+ if (overflow) {
680
+ if (first) {
633
681
  rmodel = _this.children.pop();
634
- rmodel.release();
635
682
  _this.data.pop();
636
683
  }
684
+ else {
685
+ rmodel = _this.children.shift();
686
+ _this.data.shift();
687
+ }
688
+ rmodel.release();
637
689
  }
638
690
  _this.onChange([model.id], model.data);
639
691
  if (rmodel)
640
692
  _this.onChange([rmodel.id], null);
693
+ }).catch(function (e) {
694
+ console.error("failed to load " + className + ":" + id + " " + e);
641
695
  });
642
696
  };
643
697
  ArSyncCollection.prototype.markAndSort = function () {
644
698
  this.mark();
645
699
  var orderKey = this.aliasOrderKey;
646
- if (this.order.mode === 'asc') {
700
+ if (this.ordering.direction === 'asc') {
647
701
  this.children.sort(function (a, b) { return a.data[orderKey] < b.data[orderKey] ? -1 : +1; });
648
702
  this.data.sort(function (a, b) { return a[orderKey] < b[orderKey] ? -1 : +1; });
649
703
  }
@@ -11,7 +11,7 @@ export default class ConnectionManager {
11
11
  unsubscribe: () => void;
12
12
  };
13
13
  subscribe(key: any, func: any): {
14
- unsubscribe: () => void;
14
+ unsubscribe(): void;
15
15
  };
16
16
  connect(key: any): any;
17
17
  disconnect(key: any): void;
@@ -40,6 +40,8 @@ var ConnectionManager = /** @class */ (function () {
40
40
  };
41
41
  ConnectionManager.prototype.subscribe = function (key, func) {
42
42
  var _this = this;
43
+ if (!this.networkStatus)
44
+ return { unsubscribe: function () { } };
43
45
  var subscription = this.connect(key);
44
46
  var id = subscription.serial++;
45
47
  subscription.ref++;
data/core/DataType.d.ts CHANGED
@@ -3,9 +3,7 @@ declare type RecordType = {
3
3
  query: any;
4
4
  };
5
5
  };
6
- declare type Values<T> = T extends {
7
- [K in keyof T]: infer U;
8
- } ? U : never;
6
+ declare type Values<T> = T[keyof T];
9
7
  declare type AddNullable<Test, Type> = null extends Test ? Type | null : Type;
10
8
  declare type DataTypeExtractField<BaseType, Key extends keyof BaseType> = Exclude<BaseType[Key], null> extends RecordType ? AddNullable<BaseType[Key], {}> : BaseType[Key] extends RecordType[] ? {}[] : BaseType[Key];
11
9
  declare type DataTypeExtractFieldsFromQuery<BaseType, Fields> = '*' extends Fields ? {
@@ -33,17 +31,24 @@ declare type CheckAttributesField<P, Q> = Q extends {
33
31
  declare type IsAnyCompareLeftType = {
34
32
  __any: never;
35
33
  };
36
- declare type CollectExtraFields<Type, Path> = IsAnyCompareLeftType extends Type ? null : Type extends ExtraFieldErrorType ? Path : Type extends (infer R)[] ? _CollectExtraFields<R> : _CollectExtraFields<Type>;
37
- declare type _CollectExtraFields<Type> = Type extends object ? (keyof (Type) extends never ? null : Values<{
38
- [key in keyof Type]: CollectExtraFields<Type[key], key>;
39
- }>) : null;
34
+ declare type CollectExtraFields<Type, Key> = IsAnyCompareLeftType extends Type ? never : Type extends ExtraFieldErrorType ? Key : Type extends (infer R)[] ? {
35
+ 0: Values<{
36
+ [key in keyof R]: CollectExtraFields<R[key], key>;
37
+ }>;
38
+ 1: never;
39
+ }[R extends object ? 0 : 1] : {
40
+ 0: Values<{
41
+ [key in keyof Type]: CollectExtraFields<Type[key], key>;
42
+ }>;
43
+ 1: never;
44
+ }[Type extends object ? 0 : 1];
40
45
  declare type SelectString<T> = T extends string ? T : never;
41
46
  declare type _ValidateDataTypeExtraFileds<Extra, Type> = SelectString<Extra> extends never ? Type : {
42
47
  error: {
43
- extraFields: SelectString<Extra>;
48
+ extraFields: Extra;
44
49
  };
45
50
  };
46
- declare type ValidateDataTypeExtraFileds<Type> = _ValidateDataTypeExtraFileds<CollectExtraFields<Type, []>, Type>;
51
+ declare type ValidateDataTypeExtraFileds<Type> = _ValidateDataTypeExtraFileds<CollectExtraFields<Type, never>, Type>;
47
52
  declare type RequestBase = {
48
53
  api: string;
49
54
  query: any;
data/core/hooks.d.ts CHANGED
@@ -20,6 +20,7 @@ export declare type DataAndStatus<T> = [T | null, ModelStatus];
20
20
  export interface Request {
21
21
  api: string;
22
22
  params?: any;
23
+ id?: number;
23
24
  query: any;
24
25
  }
25
26
  export declare function useArSyncModel<T>(request: Request | null): DataAndStatus<T>;