@aws-amplify/datastore 3.14.0 → 3.14.1-unstable.10

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.
Files changed (110) hide show
  1. package/dist/aws-amplify-datastore.js +2799 -1459
  2. package/dist/aws-amplify-datastore.js.map +1 -1
  3. package/dist/aws-amplify-datastore.min.js +10 -10
  4. package/dist/aws-amplify-datastore.min.js.map +1 -1
  5. package/lib/authModeStrategies/multiAuthStrategy.js +11 -0
  6. package/lib/authModeStrategies/multiAuthStrategy.js.map +1 -1
  7. package/lib/datastore/datastore.js +524 -323
  8. package/lib/datastore/datastore.js.map +1 -1
  9. package/lib/storage/adapter/IndexedDBAdapter.js +76 -25
  10. package/lib/storage/adapter/IndexedDBAdapter.js.map +1 -1
  11. package/lib/storage/storage.js +2 -2
  12. package/lib/storage/storage.js.map +1 -1
  13. package/lib/sync/datastoreConnectivity.js +45 -0
  14. package/lib/sync/datastoreConnectivity.js.map +1 -1
  15. package/lib/sync/index.js +518 -395
  16. package/lib/sync/index.js.map +1 -1
  17. package/lib/sync/merger.js +6 -0
  18. package/lib/sync/merger.js.map +1 -1
  19. package/lib/sync/outbox.js +66 -62
  20. package/lib/sync/outbox.js.map +1 -1
  21. package/lib/sync/processors/mutation.js +207 -165
  22. package/lib/sync/processors/mutation.js.map +1 -1
  23. package/lib/sync/processors/subscription.js +210 -175
  24. package/lib/sync/processors/subscription.js.map +1 -1
  25. package/lib/sync/processors/sync.js +95 -72
  26. package/lib/sync/processors/sync.js.map +1 -1
  27. package/lib/sync/utils.js +1 -3
  28. package/lib/sync/utils.js.map +1 -1
  29. package/lib/util.js +89 -0
  30. package/lib/util.js.map +1 -1
  31. package/lib-esm/authModeStrategies/multiAuthStrategy.d.ts +11 -0
  32. package/lib-esm/authModeStrategies/multiAuthStrategy.js +11 -0
  33. package/lib-esm/authModeStrategies/multiAuthStrategy.js.map +1 -1
  34. package/lib-esm/datastore/datastore.d.ts +95 -2
  35. package/lib-esm/datastore/datastore.js +524 -323
  36. package/lib-esm/datastore/datastore.js.map +1 -1
  37. package/lib-esm/storage/adapter/IndexedDBAdapter.d.ts +21 -0
  38. package/lib-esm/storage/adapter/IndexedDBAdapter.js +77 -26
  39. package/lib-esm/storage/adapter/IndexedDBAdapter.js.map +1 -1
  40. package/lib-esm/storage/storage.js +2 -2
  41. package/lib-esm/storage/storage.js.map +1 -1
  42. package/lib-esm/sync/datastoreConnectivity.d.ts +1 -0
  43. package/lib-esm/sync/datastoreConnectivity.js +45 -0
  44. package/lib-esm/sync/datastoreConnectivity.js.map +1 -1
  45. package/lib-esm/sync/index.d.ts +9 -1
  46. package/lib-esm/sync/index.js +519 -396
  47. package/lib-esm/sync/index.js.map +1 -1
  48. package/lib-esm/sync/merger.d.ts +6 -0
  49. package/lib-esm/sync/merger.js +6 -0
  50. package/lib-esm/sync/merger.js.map +1 -1
  51. package/lib-esm/sync/outbox.js +66 -62
  52. package/lib-esm/sync/outbox.js.map +1 -1
  53. package/lib-esm/sync/processors/mutation.d.ts +2 -0
  54. package/lib-esm/sync/processors/mutation.js +208 -166
  55. package/lib-esm/sync/processors/mutation.js.map +1 -1
  56. package/lib-esm/sync/processors/subscription.d.ts +2 -0
  57. package/lib-esm/sync/processors/subscription.js +211 -176
  58. package/lib-esm/sync/processors/subscription.js.map +1 -1
  59. package/lib-esm/sync/processors/sync.d.ts +2 -0
  60. package/lib-esm/sync/processors/sync.js +96 -73
  61. package/lib-esm/sync/processors/sync.js.map +1 -1
  62. package/lib-esm/sync/utils.js +1 -3
  63. package/lib-esm/sync/utils.js.map +1 -1
  64. package/lib-esm/util.d.ts +11 -0
  65. package/lib-esm/util.js +89 -0
  66. package/lib-esm/util.js.map +1 -1
  67. package/package.json +7 -7
  68. package/src/authModeStrategies/multiAuthStrategy.ts +11 -0
  69. package/src/datastore/datastore.ts +572 -366
  70. package/src/storage/adapter/IndexedDBAdapter.ts +50 -9
  71. package/src/storage/storage.ts +2 -2
  72. package/src/sync/datastoreConnectivity.ts +6 -0
  73. package/src/sync/index.ts +492 -400
  74. package/src/sync/merger.ts +6 -0
  75. package/src/sync/outbox.ts +1 -1
  76. package/src/sync/processors/mutation.ts +139 -104
  77. package/src/sync/processors/subscription.ts +287 -250
  78. package/src/sync/processors/sync.ts +88 -60
  79. package/src/sync/utils.ts +1 -3
  80. package/src/util.ts +92 -2
  81. package/lib/authModeStrategies/defaultAuthStrategy.d.ts +0 -2
  82. package/lib/authModeStrategies/index.d.ts +0 -2
  83. package/lib/authModeStrategies/multiAuthStrategy.d.ts +0 -2
  84. package/lib/datastore/datastore.d.ts +0 -63
  85. package/lib/index.d.ts +0 -15
  86. package/lib/predicates/index.d.ts +0 -16
  87. package/lib/predicates/sort.d.ts +0 -8
  88. package/lib/ssr/index.d.ts +0 -3
  89. package/lib/storage/adapter/AsyncStorageAdapter.d.ts +0 -41
  90. package/lib/storage/adapter/AsyncStorageDatabase.d.ts +0 -39
  91. package/lib/storage/adapter/InMemoryStore.d.ts +0 -11
  92. package/lib/storage/adapter/InMemoryStore.native.d.ts +0 -1
  93. package/lib/storage/adapter/IndexedDBAdapter.d.ts +0 -38
  94. package/lib/storage/adapter/getDefaultAdapter/index.d.ts +0 -3
  95. package/lib/storage/adapter/getDefaultAdapter/index.native.d.ts +0 -3
  96. package/lib/storage/adapter/index.d.ts +0 -9
  97. package/lib/storage/storage.d.ts +0 -49
  98. package/lib/sync/datastoreConnectivity.d.ts +0 -15
  99. package/lib/sync/datastoreReachability/index.d.ts +0 -3
  100. package/lib/sync/datastoreReachability/index.native.d.ts +0 -3
  101. package/lib/sync/index.d.ts +0 -81
  102. package/lib/sync/merger.d.ts +0 -11
  103. package/lib/sync/outbox.d.ts +0 -27
  104. package/lib/sync/processors/errorMaps.d.ts +0 -17
  105. package/lib/sync/processors/mutation.d.ts +0 -56
  106. package/lib/sync/processors/subscription.d.ts +0 -31
  107. package/lib/sync/processors/sync.d.ts +0 -26
  108. package/lib/sync/utils.d.ts +0 -42
  109. package/lib/types.d.ts +0 -501
  110. package/lib/util.d.ts +0 -145
@@ -65,7 +65,7 @@ var __spread = (this && this.__spread) || function () {
65
65
  for (var ar = [], i = 0; i < arguments.length; i++) ar = ar.concat(__read(arguments[i]));
66
66
  return ar;
67
67
  };
68
- import { browserOrNode, ConsoleLogger as Logger } from '@aws-amplify/core';
68
+ import { browserOrNode, ConsoleLogger as Logger, BackgroundProcessManager, } from '@aws-amplify/core';
69
69
  import { CONTROL_MSG as PUBSUB_CONTROL_MSG } from '@aws-amplify/pubsub';
70
70
  import Observable from 'zen-observable-ts';
71
71
  import { ModelPredicateCreator } from '../predicates';
@@ -95,7 +95,7 @@ export var ControlMessage;
95
95
  ControlMessage["SYNC_ENGINE_READY"] = "ready";
96
96
  })(ControlMessage || (ControlMessage = {}));
97
97
  var SyncEngine = /** @class */ (function () {
98
- function SyncEngine(schema, namespaceResolver, modelClasses, userModelClasses, storage, modelInstanceCreator, conflictHandler, errorHandler, syncPredicates, amplifyConfig, authModeStrategy, amplifyContext) {
98
+ function SyncEngine(schema, namespaceResolver, modelClasses, userModelClasses, storage, modelInstanceCreator, conflictHandler, errorHandler, syncPredicates, amplifyConfig, authModeStrategy, amplifyContext, connectivityMonitor) {
99
99
  if (amplifyConfig === void 0) { amplifyConfig = {}; }
100
100
  this.schema = schema;
101
101
  this.namespaceResolver = namespaceResolver;
@@ -107,15 +107,18 @@ var SyncEngine = /** @class */ (function () {
107
107
  this.amplifyConfig = amplifyConfig;
108
108
  this.authModeStrategy = authModeStrategy;
109
109
  this.amplifyContext = amplifyContext;
110
+ this.connectivityMonitor = connectivityMonitor;
110
111
  this.online = false;
111
112
  this.modelSyncedStatus = new WeakMap();
113
+ this.runningProcesses = new BackgroundProcessManager();
112
114
  var MutationEvent = this.modelClasses['MutationEvent'];
113
115
  this.outbox = new MutationEventOutbox(this.schema, MutationEvent, modelInstanceCreator, ownSymbol);
114
116
  this.modelMerger = new ModelMerger(this.outbox, ownSymbol);
115
117
  this.syncQueriesProcessor = new SyncProcessor(this.schema, this.syncPredicates, this.amplifyConfig, this.authModeStrategy, errorHandler, this.amplifyContext);
116
118
  this.subscriptionsProcessor = new SubscriptionProcessor(this.schema, this.syncPredicates, this.amplifyConfig, this.authModeStrategy, errorHandler, this.amplifyContext);
117
119
  this.mutationsProcessor = new MutationProcessor(this.schema, this.storage, this.userModelClasses, this.outbox, this.modelInstanceCreator, MutationEvent, this.amplifyConfig, this.authModeStrategy, errorHandler, conflictHandler, this.amplifyContext);
118
- this.datastoreConnectivity = new DataStoreConnectivity();
120
+ this.datastoreConnectivity =
121
+ this.connectivityMonitor || new DataStoreConnectivity();
119
122
  }
120
123
  SyncEngine.prototype.getModelSyncedStatus = function (modelConstructor) {
121
124
  return this.modelSyncedStatus.get(modelConstructor);
@@ -125,7 +128,7 @@ var SyncEngine = /** @class */ (function () {
125
128
  return new Observable(function (observer) {
126
129
  logger.log('starting sync engine...');
127
130
  var subscriptions = [];
128
- (function () { return __awaiter(_this, void 0, void 0, function () {
131
+ _this.runningProcesses.add(function () { return __awaiter(_this, void 0, void 0, function () {
129
132
  var err_1, startPromise, hasMutationsInOutbox;
130
133
  var _this = this;
131
134
  return __generator(this, function (_a) {
@@ -141,154 +144,188 @@ var SyncEngine = /** @class */ (function () {
141
144
  observer.error(err_1);
142
145
  return [2 /*return*/];
143
146
  case 3:
144
- startPromise = new Promise(function (resolve) {
147
+ startPromise = new Promise(function (doneStarting, failedStarting) {
145
148
  _this.datastoreConnectivity.status().subscribe(function (_a) {
146
149
  var online = _a.online;
147
150
  return __awaiter(_this, void 0, void 0, function () {
148
- var ctlSubsObservable_1, dataSubsObservable, err_2, error_1;
149
- var _b;
150
151
  var _this = this;
151
- return __generator(this, function (_c) {
152
- switch (_c.label) {
153
- case 0:
154
- if (!(online && !this.online)) return [3 /*break*/, 10];
155
- this.online = online;
156
- observer.next({
157
- type: ControlMessage.SYNC_ENGINE_NETWORK_STATUS,
158
- data: {
159
- active: this.online,
160
- },
161
- });
162
- dataSubsObservable = void 0;
163
- if (!isNode) return [3 /*break*/, 1];
164
- logger.warn('Realtime disabled when in a server-side environment');
165
- return [3 /*break*/, 6];
166
- case 1:
167
- //#region GraphQL Subscriptions
168
- _b = __read(this.subscriptionsProcessor.start(), 2),
169
- // const ctlObservable: Observable<CONTROL_MSG>
170
- ctlSubsObservable_1 = _b[0],
171
- // const dataObservable: Observable<[TransformerMutationType, SchemaModel, Readonly<{
172
- // id: string;
173
- // } & Record<string, any>>]>
174
- dataSubsObservable = _b[1];
175
- _c.label = 2;
176
- case 2:
177
- _c.trys.push([2, 4, , 5]);
178
- return [4 /*yield*/, new Promise(function (resolve, reject) {
179
- var ctlSubsSubscription = ctlSubsObservable_1.subscribe({
180
- next: function (msg) {
181
- if (msg === CONTROL_MSG.CONNECTED) {
182
- resolve();
152
+ return __generator(this, function (_b) {
153
+ return [2 /*return*/, this.runningProcesses.isOpen &&
154
+ this.runningProcesses.add(function (onTerminate) { return __awaiter(_this, void 0, void 0, function () {
155
+ var ctlSubsObservable_1, dataSubsObservable, err_2, error_1;
156
+ var _a;
157
+ var _this = this;
158
+ return __generator(this, function (_b) {
159
+ switch (_b.label) {
160
+ case 0:
161
+ if (!(online && !this.online)) return [3 /*break*/, 10];
162
+ this.online = online;
163
+ observer.next({
164
+ type: ControlMessage.SYNC_ENGINE_NETWORK_STATUS,
165
+ data: {
166
+ active: this.online,
167
+ },
168
+ });
169
+ dataSubsObservable = void 0;
170
+ if (!isNode) return [3 /*break*/, 1];
171
+ logger.warn('Realtime disabled when in a server-side environment');
172
+ return [3 /*break*/, 6];
173
+ case 1:
174
+ //#region GraphQL Subscriptions
175
+ _a = __read(this.subscriptionsProcessor.start(), 2),
176
+ // const ctlObservable: Observable<CONTROL_MSG>
177
+ ctlSubsObservable_1 = _a[0],
178
+ // const dataObservable: Observable<[TransformerMutationType, SchemaModel, Readonly<{
179
+ // id: string;
180
+ // } & Record<string, any>>]>
181
+ dataSubsObservable = _a[1];
182
+ _b.label = 2;
183
+ case 2:
184
+ _b.trys.push([2, 4, , 5]);
185
+ return [4 /*yield*/, new Promise(function (resolve, reject) {
186
+ onTerminate.then(reject);
187
+ var ctlSubsSubscription = ctlSubsObservable_1.subscribe({
188
+ next: function (msg) {
189
+ if (msg === CONTROL_MSG.CONNECTED) {
190
+ resolve();
191
+ }
192
+ },
193
+ error: function (err) {
194
+ reject(err);
195
+ var handleDisconnect = _this.disconnectionHandler();
196
+ handleDisconnect(err);
197
+ },
198
+ });
199
+ subscriptions.push(ctlSubsSubscription);
200
+ })];
201
+ case 3:
202
+ _b.sent();
203
+ return [3 /*break*/, 5];
204
+ case 4:
205
+ err_2 = _b.sent();
206
+ observer.error(err_2);
207
+ failedStarting();
208
+ return [2 /*return*/];
209
+ case 5:
210
+ logger.log('Realtime ready');
211
+ observer.next({
212
+ type: ControlMessage.SYNC_ENGINE_SUBSCRIPTIONS_ESTABLISHED,
213
+ });
214
+ _b.label = 6;
215
+ case 6:
216
+ _b.trys.push([6, 8, , 9]);
217
+ return [4 /*yield*/, new Promise(function (resolve, reject) {
218
+ var syncQuerySubscription = _this.syncQueriesObservable().subscribe({
219
+ next: function (message) {
220
+ var type = message.type;
221
+ if (type ===
222
+ ControlMessage.SYNC_ENGINE_SYNC_QUERIES_READY) {
223
+ resolve();
224
+ }
225
+ observer.next(message);
226
+ },
227
+ complete: function () {
228
+ resolve();
229
+ },
230
+ error: function (error) {
231
+ reject(error);
232
+ },
233
+ });
234
+ if (syncQuerySubscription) {
235
+ subscriptions.push(syncQuerySubscription);
236
+ }
237
+ })];
238
+ case 7:
239
+ _b.sent();
240
+ return [3 /*break*/, 9];
241
+ case 8:
242
+ error_1 = _b.sent();
243
+ observer.error(error_1);
244
+ failedStarting();
245
+ return [2 /*return*/];
246
+ case 9:
247
+ //#endregion
248
+ //#region process mutations (outbox)
249
+ subscriptions.push(this.mutationsProcessor
250
+ .start()
251
+ .subscribe(function (_a) {
252
+ var modelDefinition = _a.modelDefinition, item = _a.model, hasMore = _a.hasMore;
253
+ return _this.runningProcesses.add(function () { return __awaiter(_this, void 0, void 0, function () {
254
+ var modelConstructor, model;
255
+ var _this = this;
256
+ return __generator(this, function (_a) {
257
+ switch (_a.label) {
258
+ case 0:
259
+ modelConstructor = this.userModelClasses[modelDefinition.name];
260
+ model = this.modelInstanceCreator(modelConstructor, item);
261
+ return [4 /*yield*/, this.storage.runExclusive(function (storage) {
262
+ return _this.modelMerger.merge(storage, model, modelDefinition);
263
+ })];
264
+ case 1:
265
+ _a.sent();
266
+ observer.next({
267
+ type: ControlMessage.SYNC_ENGINE_OUTBOX_MUTATION_PROCESSED,
268
+ data: {
269
+ model: modelConstructor,
270
+ element: model,
271
+ },
272
+ });
273
+ observer.next({
274
+ type: ControlMessage.SYNC_ENGINE_OUTBOX_STATUS,
275
+ data: {
276
+ isEmpty: !hasMore,
277
+ },
278
+ });
279
+ return [2 /*return*/];
280
+ }
281
+ });
282
+ }); }, 'mutation processor event');
283
+ }));
284
+ //#endregion
285
+ //#region Merge subscriptions buffer
286
+ // TODO: extract to function
287
+ if (!isNode) {
288
+ subscriptions.push(dataSubsObservable.subscribe(function (_a) {
289
+ var _b = __read(_a, 3), _transformerMutationType = _b[0], modelDefinition = _b[1], item = _b[2];
290
+ return _this.runningProcesses.add(function () { return __awaiter(_this, void 0, void 0, function () {
291
+ var modelConstructor, model;
292
+ var _this = this;
293
+ return __generator(this, function (_a) {
294
+ switch (_a.label) {
295
+ case 0:
296
+ modelConstructor = this.userModelClasses[modelDefinition.name];
297
+ model = this.modelInstanceCreator(modelConstructor, item);
298
+ return [4 /*yield*/, this.storage.runExclusive(function (storage) {
299
+ return _this.modelMerger.merge(storage, model, modelDefinition);
300
+ })];
301
+ case 1:
302
+ _a.sent();
303
+ return [2 /*return*/];
304
+ }
305
+ });
306
+ }); }, 'subscription dataSubsObservable event');
307
+ }));
183
308
  }
184
- },
185
- error: function (err) {
186
- reject(err);
187
- var handleDisconnect = _this.disconnectionHandler();
188
- handleDisconnect(err);
189
- },
190
- });
191
- subscriptions.push(ctlSubsSubscription);
192
- })];
193
- case 3:
194
- _c.sent();
195
- return [3 /*break*/, 5];
196
- case 4:
197
- err_2 = _c.sent();
198
- observer.error(err_2);
199
- return [2 /*return*/];
200
- case 5:
201
- logger.log('Realtime ready');
202
- observer.next({
203
- type: ControlMessage.SYNC_ENGINE_SUBSCRIPTIONS_ESTABLISHED,
204
- });
205
- _c.label = 6;
206
- case 6:
207
- _c.trys.push([6, 8, , 9]);
208
- return [4 /*yield*/, new Promise(function (resolve, reject) {
209
- var syncQuerySubscription = _this.syncQueriesObservable().subscribe({
210
- next: function (message) {
211
- var type = message.type;
212
- if (type === ControlMessage.SYNC_ENGINE_SYNC_QUERIES_READY) {
213
- resolve();
309
+ return [3 /*break*/, 11];
310
+ case 10:
311
+ if (!online) {
312
+ this.online = online;
313
+ observer.next({
314
+ type: ControlMessage.SYNC_ENGINE_NETWORK_STATUS,
315
+ data: {
316
+ active: this.online,
317
+ },
318
+ });
319
+ subscriptions.forEach(function (sub) { return sub.unsubscribe(); });
320
+ subscriptions = [];
214
321
  }
215
- observer.next(message);
216
- },
217
- complete: function () {
218
- resolve();
219
- },
220
- error: function (error) {
221
- reject(error);
222
- },
223
- });
224
- if (syncQuerySubscription) {
225
- subscriptions.push(syncQuerySubscription);
322
+ _b.label = 11;
323
+ case 11:
324
+ doneStarting();
325
+ return [2 /*return*/];
226
326
  }
227
- })];
228
- case 7:
229
- _c.sent();
230
- return [3 /*break*/, 9];
231
- case 8:
232
- error_1 = _c.sent();
233
- observer.error(error_1);
234
- return [2 /*return*/];
235
- case 9:
236
- //#endregion
237
- //#region process mutations
238
- subscriptions.push(this.mutationsProcessor
239
- .start()
240
- .subscribe(function (_a) {
241
- var modelDefinition = _a.modelDefinition, item = _a.model, hasMore = _a.hasMore;
242
- var modelConstructor = _this.userModelClasses[modelDefinition.name];
243
- var model = _this.modelInstanceCreator(modelConstructor, item);
244
- _this.storage.runExclusive(function (storage) {
245
- return _this.modelMerger.merge(storage, model, modelDefinition);
246
- });
247
- observer.next({
248
- type: ControlMessage.SYNC_ENGINE_OUTBOX_MUTATION_PROCESSED,
249
- data: {
250
- model: modelConstructor,
251
- element: model,
252
- },
253
- });
254
- observer.next({
255
- type: ControlMessage.SYNC_ENGINE_OUTBOX_STATUS,
256
- data: {
257
- isEmpty: !hasMore,
258
- },
259
327
  });
260
- }));
261
- //#endregion
262
- //#region Merge subscriptions buffer
263
- // TODO: extract to function
264
- if (!isNode) {
265
- subscriptions.push(dataSubsObservable.subscribe(function (_a) {
266
- var _b = __read(_a, 3), _transformerMutationType = _b[0], modelDefinition = _b[1], item = _b[2];
267
- var modelConstructor = _this.userModelClasses[modelDefinition.name];
268
- var model = _this.modelInstanceCreator(modelConstructor, item);
269
- _this.storage.runExclusive(function (storage) {
270
- return _this.modelMerger.merge(storage, model, modelDefinition);
271
- });
272
- }));
273
- }
274
- return [3 /*break*/, 11];
275
- case 10:
276
- if (!online) {
277
- this.online = online;
278
- observer.next({
279
- type: ControlMessage.SYNC_ENGINE_NETWORK_STATUS,
280
- data: {
281
- active: this.online,
282
- },
283
- });
284
- subscriptions.forEach(function (sub) { return sub.unsubscribe(); });
285
- subscriptions = [];
286
- }
287
- _c.label = 11;
288
- case 11:
289
- resolve();
290
- return [2 /*return*/];
291
- }
328
+ }); }, 'datastore connectivity event')];
292
329
  });
293
330
  });
294
331
  });
@@ -304,39 +341,44 @@ var SyncEngine = /** @class */ (function () {
304
341
  next: function (_a) {
305
342
  var opType = _a.opType, model = _a.model, element = _a.element, condition = _a.condition;
306
343
  return __awaiter(_this, void 0, void 0, function () {
307
- var namespace, MutationEventConstructor, modelDefinition, graphQLCondition, mutationEvent;
344
+ var _this = this;
308
345
  return __generator(this, function (_b) {
309
- switch (_b.label) {
310
- case 0:
311
- namespace = this.schema.namespaces[this.namespaceResolver(model)];
312
- MutationEventConstructor = this.modelClasses['MutationEvent'];
313
- modelDefinition = this.getModelDefinition(model);
314
- graphQLCondition = predicateToGraphQLCondition(condition, modelDefinition);
315
- mutationEvent = createMutationInstanceFromModelOperation(namespace.relationships, this.getModelDefinition(model), opType, model, element, graphQLCondition, MutationEventConstructor, this.modelInstanceCreator);
316
- return [4 /*yield*/, this.outbox.enqueue(this.storage, mutationEvent)];
317
- case 1:
318
- _b.sent();
319
- observer.next({
320
- type: ControlMessage.SYNC_ENGINE_OUTBOX_MUTATION_ENQUEUED,
321
- data: {
322
- model: model,
323
- element: element,
324
- },
325
- });
326
- observer.next({
327
- type: ControlMessage.SYNC_ENGINE_OUTBOX_STATUS,
328
- data: {
329
- isEmpty: false,
330
- },
346
+ return [2 /*return*/, this.runningProcesses.add(function () { return __awaiter(_this, void 0, void 0, function () {
347
+ var namespace, MutationEventConstructor, modelDefinition, graphQLCondition, mutationEvent;
348
+ return __generator(this, function (_a) {
349
+ switch (_a.label) {
350
+ case 0:
351
+ namespace = this.schema.namespaces[this.namespaceResolver(model)];
352
+ MutationEventConstructor = this.modelClasses['MutationEvent'];
353
+ modelDefinition = this.getModelDefinition(model);
354
+ graphQLCondition = predicateToGraphQLCondition(condition, modelDefinition);
355
+ mutationEvent = createMutationInstanceFromModelOperation(namespace.relationships, this.getModelDefinition(model), opType, model, element, graphQLCondition, MutationEventConstructor, this.modelInstanceCreator);
356
+ return [4 /*yield*/, this.outbox.enqueue(this.storage, mutationEvent)];
357
+ case 1:
358
+ _a.sent();
359
+ observer.next({
360
+ type: ControlMessage.SYNC_ENGINE_OUTBOX_MUTATION_ENQUEUED,
361
+ data: {
362
+ model: model,
363
+ element: element,
364
+ },
365
+ });
366
+ observer.next({
367
+ type: ControlMessage.SYNC_ENGINE_OUTBOX_STATUS,
368
+ data: {
369
+ isEmpty: false,
370
+ },
371
+ });
372
+ return [4 /*yield*/, startPromise];
373
+ case 2:
374
+ _a.sent();
375
+ if (this.online) {
376
+ this.mutationsProcessor.resume();
377
+ }
378
+ return [2 /*return*/];
379
+ }
331
380
  });
332
- return [4 /*yield*/, startPromise];
333
- case 2:
334
- _b.sent();
335
- if (this.online) {
336
- this.mutationsProcessor.resume();
337
- }
338
- return [2 /*return*/];
339
- }
381
+ }); }, 'storage event')];
340
382
  });
341
383
  });
342
384
  },
@@ -362,10 +404,7 @@ var SyncEngine = /** @class */ (function () {
362
404
  return [2 /*return*/];
363
405
  }
364
406
  });
365
- }); })();
366
- return function () {
367
- subscriptions.forEach(function (sub) { return sub.unsubscribe(); });
368
- };
407
+ }); }, 'sync start');
369
408
  });
370
409
  };
371
410
  SyncEngine.prototype.getModelsMetadataWithNextFullSync = function (currentTimeStamp) {
@@ -376,7 +415,7 @@ var SyncEngine = /** @class */ (function () {
376
415
  switch (_b.label) {
377
416
  case 0:
378
417
  _a = Map.bind;
379
- return [4 /*yield*/, this.getModelsMetadata()];
418
+ return [4 /*yield*/, this.runningProcesses.add(function () { return _this.getModelsMetadata(); }, 'sync/index getModelsMetadataWithNextFullSync')];
380
419
  case 1:
381
420
  modelLastSync = new (_a.apply(Map, [void 0, (_b.sent()).map(function (_a) {
382
421
  var namespace = _a.namespace, model = _a.model, lastSync = _a.lastSync, lastFullSync = _a.lastFullSync, fullSyncInterval = _a.fullSyncInterval, lastSyncPredicate = _a.lastSyncPredicate;
@@ -401,228 +440,261 @@ var SyncEngine = /** @class */ (function () {
401
440
  }
402
441
  return new Observable(function (observer) {
403
442
  var syncQueriesSubscription;
404
- var waitTimeoutId;
405
- (function () { return __awaiter(_this, void 0, void 0, function () {
406
- var _loop_1, this_1;
407
- var _this = this;
408
- return __generator(this, function (_a) {
409
- switch (_a.label) {
410
- case 0:
411
- _loop_1 = function () {
412
- var count, modelLastSync, paginatingModels, newestFullSyncStartedAt, theInterval, start, duration, newestStartedAt, msNextFullSync;
413
- return __generator(this, function (_a) {
414
- switch (_a.label) {
415
- case 0:
416
- count = new WeakMap();
417
- return [4 /*yield*/, this_1.getModelsMetadataWithNextFullSync(Date.now())];
418
- case 1:
419
- modelLastSync = _a.sent();
420
- paginatingModels = new Set(modelLastSync.keys());
421
- return [4 /*yield*/, new Promise(function (resolve) {
422
- syncQueriesSubscription = _this.syncQueriesProcessor
423
- .start(modelLastSync)
424
- .subscribe({
425
- next: function (_a) {
426
- var namespace = _a.namespace, modelDefinition = _a.modelDefinition, items = _a.items, done = _a.done, startedAt = _a.startedAt, isFullSync = _a.isFullSync;
427
- return __awaiter(_this, void 0, void 0, function () {
428
- var modelConstructor, modelName, modelMetadata_1, lastFullSync, fullSyncInterval, counts;
429
- var _this = this;
430
- return __generator(this, function (_b) {
431
- switch (_b.label) {
432
- case 0:
433
- modelConstructor = this.userModelClasses[modelDefinition.name];
434
- if (!count.has(modelConstructor)) {
435
- count.set(modelConstructor, {
436
- new: 0,
437
- updated: 0,
438
- deleted: 0,
439
- });
440
- start = getNow();
441
- newestStartedAt =
442
- newestStartedAt === undefined
443
- ? startedAt
444
- : Math.max(newestStartedAt, startedAt);
445
- }
446
- /**
447
- * If there are mutations in the outbox for a given id, those need to be
448
- * merged individually. Otherwise, we can merge them in batches.
449
- */
450
- return [4 /*yield*/, this.storage.runExclusive(function (storage) { return __awaiter(_this, void 0, void 0, function () {
451
- var idsInOutbox, oneByOne, page, opTypeCount, oneByOne_1, oneByOne_1_1, item, opType, e_1_1, _a, _b, _c, counts;
452
- var e_1, _d;
453
- return __generator(this, function (_e) {
454
- switch (_e.label) {
455
- case 0: return [4 /*yield*/, this.outbox.getModelIds(storage)];
456
- case 1:
457
- idsInOutbox = _e.sent();
458
- oneByOne = [];
459
- page = items.filter(function (item) {
460
- var itemId = getIdentifierValue(modelDefinition, item);
461
- if (!idsInOutbox.has(itemId)) {
462
- return true;
443
+ _this.runningProcesses.isOpen &&
444
+ _this.runningProcesses.add(function (onTerminate) { return __awaiter(_this, void 0, void 0, function () {
445
+ var terminated, _loop_1, this_1;
446
+ var _this = this;
447
+ return __generator(this, function (_a) {
448
+ switch (_a.label) {
449
+ case 0:
450
+ terminated = false;
451
+ _loop_1 = function () {
452
+ var count, modelLastSync, paginatingModels, newestFullSyncStartedAt, theInterval, start, duration, newestStartedAt, msNextFullSync;
453
+ return __generator(this, function (_a) {
454
+ switch (_a.label) {
455
+ case 0:
456
+ count = new WeakMap();
457
+ return [4 /*yield*/, this_1.getModelsMetadataWithNextFullSync(Date.now())];
458
+ case 1:
459
+ modelLastSync = _a.sent();
460
+ paginatingModels = new Set(modelLastSync.keys());
461
+ return [4 /*yield*/, new Promise(function (resolve, reject) {
462
+ if (!_this.runningProcesses.isOpen)
463
+ resolve();
464
+ onTerminate.then(function () { return resolve(); });
465
+ syncQueriesSubscription = _this.syncQueriesProcessor
466
+ .start(modelLastSync)
467
+ .subscribe({
468
+ next: function (_a) {
469
+ var namespace = _a.namespace, modelDefinition = _a.modelDefinition, items = _a.items, done = _a.done, startedAt = _a.startedAt, isFullSync = _a.isFullSync;
470
+ return __awaiter(_this, void 0, void 0, function () {
471
+ var modelConstructor, modelName, modelMetadata_1, lastFullSync, fullSyncInterval, counts;
472
+ var _this = this;
473
+ return __generator(this, function (_b) {
474
+ switch (_b.label) {
475
+ case 0:
476
+ modelConstructor = this.userModelClasses[modelDefinition.name];
477
+ if (!count.has(modelConstructor)) {
478
+ count.set(modelConstructor, {
479
+ new: 0,
480
+ updated: 0,
481
+ deleted: 0,
482
+ });
483
+ start = getNow();
484
+ newestStartedAt =
485
+ newestStartedAt === undefined
486
+ ? startedAt
487
+ : Math.max(newestStartedAt, startedAt);
488
+ }
489
+ /**
490
+ * If there are mutations in the outbox for a given id, those need to be
491
+ * merged individually. Otherwise, we can merge them in batches.
492
+ */
493
+ return [4 /*yield*/, this.storage.runExclusive(function (storage) { return __awaiter(_this, void 0, void 0, function () {
494
+ var idsInOutbox, oneByOne, page, opTypeCount, oneByOne_1, oneByOne_1_1, item, opType, e_1_1, _a, _b, _c, counts;
495
+ var e_1, _d;
496
+ return __generator(this, function (_e) {
497
+ switch (_e.label) {
498
+ case 0: return [4 /*yield*/, this.outbox.getModelIds(storage)];
499
+ case 1:
500
+ idsInOutbox = _e.sent();
501
+ oneByOne = [];
502
+ page = items.filter(function (item) {
503
+ var itemId = getIdentifierValue(modelDefinition, item);
504
+ if (!idsInOutbox.has(itemId)) {
505
+ return true;
506
+ }
507
+ oneByOne.push(item);
508
+ return false;
509
+ });
510
+ opTypeCount = [];
511
+ _e.label = 2;
512
+ case 2:
513
+ _e.trys.push([2, 7, 8, 9]);
514
+ oneByOne_1 = __values(oneByOne), oneByOne_1_1 = oneByOne_1.next();
515
+ _e.label = 3;
516
+ case 3:
517
+ if (!!oneByOne_1_1.done) return [3 /*break*/, 6];
518
+ item = oneByOne_1_1.value;
519
+ return [4 /*yield*/, this.modelMerger.merge(storage, item, modelDefinition)];
520
+ case 4:
521
+ opType = _e.sent();
522
+ if (opType !== undefined) {
523
+ opTypeCount.push([item, opType]);
463
524
  }
464
- oneByOne.push(item);
465
- return false;
466
- });
467
- opTypeCount = [];
468
- _e.label = 2;
469
- case 2:
470
- _e.trys.push([2, 7, 8, 9]);
471
- oneByOne_1 = __values(oneByOne), oneByOne_1_1 = oneByOne_1.next();
472
- _e.label = 3;
473
- case 3:
474
- if (!!oneByOne_1_1.done) return [3 /*break*/, 6];
475
- item = oneByOne_1_1.value;
476
- return [4 /*yield*/, this.modelMerger.merge(storage, item, modelDefinition)];
477
- case 4:
478
- opType = _e.sent();
479
- if (opType !== undefined) {
480
- opTypeCount.push([item, opType]);
481
- }
482
- _e.label = 5;
483
- case 5:
484
- oneByOne_1_1 = oneByOne_1.next();
485
- return [3 /*break*/, 3];
486
- case 6: return [3 /*break*/, 9];
487
- case 7:
488
- e_1_1 = _e.sent();
489
- e_1 = { error: e_1_1 };
490
- return [3 /*break*/, 9];
491
- case 8:
492
- try {
493
- if (oneByOne_1_1 && !oneByOne_1_1.done && (_d = oneByOne_1.return)) _d.call(oneByOne_1);
494
- }
495
- finally { if (e_1) throw e_1.error; }
496
- return [7 /*endfinally*/];
497
- case 9:
498
- _b = (_a = opTypeCount.push).apply;
499
- _c = [opTypeCount];
500
- return [4 /*yield*/, this.modelMerger.mergePage(storage, modelConstructor, page, modelDefinition)];
501
- case 10:
502
- _b.apply(_a, _c.concat([__spread.apply(void 0, [(_e.sent())])]));
503
- counts = count.get(modelConstructor);
504
- opTypeCount.forEach(function (_a) {
505
- var _b = __read(_a, 2), opType = _b[1];
506
- switch (opType) {
507
- case OpType.INSERT:
508
- counts.new++;
509
- break;
510
- case OpType.UPDATE:
511
- counts.updated++;
512
- break;
513
- case OpType.DELETE:
514
- counts.deleted++;
515
- break;
516
- default:
517
- exhaustiveCheck(opType);
525
+ _e.label = 5;
526
+ case 5:
527
+ oneByOne_1_1 = oneByOne_1.next();
528
+ return [3 /*break*/, 3];
529
+ case 6: return [3 /*break*/, 9];
530
+ case 7:
531
+ e_1_1 = _e.sent();
532
+ e_1 = { error: e_1_1 };
533
+ return [3 /*break*/, 9];
534
+ case 8:
535
+ try {
536
+ if (oneByOne_1_1 && !oneByOne_1_1.done && (_d = oneByOne_1.return)) _d.call(oneByOne_1);
518
537
  }
519
- });
520
- return [2 /*return*/];
521
- }
522
- });
523
- }); })];
524
- case 1:
525
- /**
526
- * If there are mutations in the outbox for a given id, those need to be
527
- * merged individually. Otherwise, we can merge them in batches.
528
- */
529
- _b.sent();
530
- if (!done) return [3 /*break*/, 4];
531
- modelName = modelDefinition.name;
532
- return [4 /*yield*/, this.getModelMetadata(namespace, modelName)];
533
- case 2:
534
- modelMetadata_1 = _b.sent();
535
- lastFullSync = modelMetadata_1.lastFullSync, fullSyncInterval = modelMetadata_1.fullSyncInterval;
536
- theInterval = fullSyncInterval;
537
- newestFullSyncStartedAt =
538
- newestFullSyncStartedAt === undefined
539
- ? lastFullSync
540
- : Math.max(newestFullSyncStartedAt, isFullSync ? startedAt : lastFullSync);
541
- modelMetadata_1 = this.modelClasses
542
- .ModelMetadata.copyOf(modelMetadata_1, function (draft) {
543
- draft.lastSync = startedAt;
544
- draft.lastFullSync = isFullSync
545
- ? startedAt
546
- : modelMetadata_1.lastFullSync;
547
- });
548
- return [4 /*yield*/, this.storage.save(modelMetadata_1, undefined, ownSymbol)];
549
- case 3:
550
- _b.sent();
551
- counts = count.get(modelConstructor);
552
- this.modelSyncedStatus.set(modelConstructor, true);
553
- observer.next({
554
- type: ControlMessage.SYNC_ENGINE_MODEL_SYNCED,
555
- data: {
556
- model: modelConstructor,
557
- isFullSync: isFullSync,
558
- isDeltaSync: !isFullSync,
559
- counts: counts,
560
- },
561
- });
562
- paginatingModels.delete(modelDefinition);
563
- if (paginatingModels.size === 0) {
564
- duration = getNow() - start;
565
- resolve();
538
+ finally { if (e_1) throw e_1.error; }
539
+ return [7 /*endfinally*/];
540
+ case 9:
541
+ _b = (_a = opTypeCount.push).apply;
542
+ _c = [opTypeCount];
543
+ return [4 /*yield*/, this.modelMerger.mergePage(storage, modelConstructor, page, modelDefinition)];
544
+ case 10:
545
+ _b.apply(_a, _c.concat([__spread.apply(void 0, [(_e.sent())])]));
546
+ counts = count.get(modelConstructor);
547
+ opTypeCount.forEach(function (_a) {
548
+ var _b = __read(_a, 2), opType = _b[1];
549
+ switch (opType) {
550
+ case OpType.INSERT:
551
+ counts.new++;
552
+ break;
553
+ case OpType.UPDATE:
554
+ counts.updated++;
555
+ break;
556
+ case OpType.DELETE:
557
+ counts.deleted++;
558
+ break;
559
+ default:
560
+ exhaustiveCheck(opType);
561
+ }
562
+ });
563
+ return [2 /*return*/];
564
+ }
565
+ });
566
+ }); })];
567
+ case 1:
568
+ /**
569
+ * If there are mutations in the outbox for a given id, those need to be
570
+ * merged individually. Otherwise, we can merge them in batches.
571
+ */
572
+ _b.sent();
573
+ if (!done) return [3 /*break*/, 4];
574
+ modelName = modelDefinition.name;
575
+ return [4 /*yield*/, this.getModelMetadata(namespace, modelName)];
576
+ case 2:
577
+ modelMetadata_1 = _b.sent();
578
+ lastFullSync = modelMetadata_1.lastFullSync, fullSyncInterval = modelMetadata_1.fullSyncInterval;
579
+ theInterval = fullSyncInterval;
580
+ newestFullSyncStartedAt =
581
+ newestFullSyncStartedAt === undefined
582
+ ? lastFullSync
583
+ : Math.max(newestFullSyncStartedAt, isFullSync ? startedAt : lastFullSync);
584
+ modelMetadata_1 = this.modelClasses
585
+ .ModelMetadata.copyOf(modelMetadata_1, function (draft) {
586
+ draft.lastSync = startedAt;
587
+ draft.lastFullSync = isFullSync
588
+ ? startedAt
589
+ : modelMetadata_1.lastFullSync;
590
+ });
591
+ return [4 /*yield*/, this.storage.save(modelMetadata_1, undefined, ownSymbol)];
592
+ case 3:
593
+ _b.sent();
594
+ counts = count.get(modelConstructor);
595
+ this.modelSyncedStatus.set(modelConstructor, true);
566
596
  observer.next({
567
- type: ControlMessage.SYNC_ENGINE_SYNC_QUERIES_READY,
597
+ type: ControlMessage.SYNC_ENGINE_MODEL_SYNCED,
598
+ data: {
599
+ model: modelConstructor,
600
+ isFullSync: isFullSync,
601
+ isDeltaSync: !isFullSync,
602
+ counts: counts,
603
+ },
568
604
  });
569
- syncQueriesSubscription.unsubscribe();
570
- }
571
- _b.label = 4;
572
- case 4: return [2 /*return*/];
573
- }
605
+ paginatingModels.delete(modelDefinition);
606
+ if (paginatingModels.size === 0) {
607
+ duration = getNow() - start;
608
+ resolve();
609
+ observer.next({
610
+ type: ControlMessage.SYNC_ENGINE_SYNC_QUERIES_READY,
611
+ });
612
+ syncQueriesSubscription.unsubscribe();
613
+ }
614
+ _b.label = 4;
615
+ case 4: return [2 /*return*/];
616
+ }
617
+ });
574
618
  });
619
+ },
620
+ error: function (error) {
621
+ observer.error(error);
622
+ },
623
+ });
624
+ observer.next({
625
+ type: ControlMessage.SYNC_ENGINE_SYNC_QUERIES_STARTED,
626
+ data: {
627
+ models: Array.from(paginatingModels).map(function (_a) {
628
+ var name = _a.name;
629
+ return name;
630
+ }),
631
+ },
632
+ });
633
+ })];
634
+ case 2:
635
+ _a.sent();
636
+ msNextFullSync = newestFullSyncStartedAt +
637
+ theInterval -
638
+ (newestStartedAt + duration);
639
+ logger.debug("Next fullSync in " + msNextFullSync / 1000 + " seconds. (" + new Date(Date.now() + msNextFullSync) + ")");
640
+ // TODO: create `BackgroundProcessManager.sleep()` ... but, need to put
641
+ // a lot of thought into what that contract looks like to
642
+ // support possible use-cases:
643
+ //
644
+ // 1. non-cancelable
645
+ // 2. cancelable, unsleep on exit()
646
+ // 3. cancelable, throw Error on exit()
647
+ // 4. cancelable, callback first on exit()?
648
+ // 5. ... etc. ? ...
649
+ //
650
+ // TLDR; this is a lot of complexity here for a sleep(),
651
+ // but, it's not clear to me yet how to support an
652
+ // extensible, centralized cancelable `sleep()` elegantly.
653
+ return [4 /*yield*/, this_1.runningProcesses.add(function (onTerminate) { return __awaiter(_this, void 0, void 0, function () {
654
+ var sleepTimer, unsleep, sleep;
655
+ return __generator(this, function (_a) {
656
+ sleep = new Promise(function (_unsleep) {
657
+ unsleep = _unsleep;
658
+ sleepTimer = setTimeout(unsleep, msNextFullSync);
575
659
  });
576
- },
577
- error: function (error) {
578
- observer.error(error);
579
- },
580
- });
581
- observer.next({
582
- type: ControlMessage.SYNC_ENGINE_SYNC_QUERIES_STARTED,
583
- data: {
584
- models: Array.from(paginatingModels).map(function (_a) {
585
- var name = _a.name;
586
- return name;
587
- }),
588
- },
589
- });
590
- })];
591
- case 2:
592
- _a.sent();
593
- msNextFullSync = newestFullSyncStartedAt +
594
- theInterval -
595
- (newestStartedAt + duration);
596
- logger.debug("Next fullSync in " + msNextFullSync / 1000 + " seconds. (" + new Date(Date.now() + msNextFullSync) + ")");
597
- return [4 /*yield*/, new Promise(function (res) {
598
- waitTimeoutId = setTimeout(res, msNextFullSync);
599
- })];
600
- case 3:
601
- _a.sent();
602
- return [2 /*return*/];
603
- }
604
- });
605
- };
606
- this_1 = this;
607
- _a.label = 1;
608
- case 1:
609
- if (!!observer.closed) return [3 /*break*/, 3];
610
- return [5 /*yield**/, _loop_1()];
611
- case 2:
612
- _a.sent();
613
- return [3 /*break*/, 1];
614
- case 3: return [2 /*return*/];
615
- }
616
- });
617
- }); })();
618
- return function () {
619
- if (syncQueriesSubscription) {
620
- syncQueriesSubscription.unsubscribe();
621
- }
622
- if (waitTimeoutId) {
623
- clearTimeout(waitTimeoutId);
624
- }
625
- };
660
+ onTerminate.then(function () {
661
+ terminated = true;
662
+ unsleep();
663
+ });
664
+ return [2 /*return*/, sleep];
665
+ });
666
+ }); }, 'syncQueriesObservable sleep')];
667
+ case 3:
668
+ // TODO: create `BackgroundProcessManager.sleep()` ... but, need to put
669
+ // a lot of thought into what that contract looks like to
670
+ // support possible use-cases:
671
+ //
672
+ // 1. non-cancelable
673
+ // 2. cancelable, unsleep on exit()
674
+ // 3. cancelable, throw Error on exit()
675
+ // 4. cancelable, callback first on exit()?
676
+ // 5. ... etc. ? ...
677
+ //
678
+ // TLDR; this is a lot of complexity here for a sleep(),
679
+ // but, it's not clear to me yet how to support an
680
+ // extensible, centralized cancelable `sleep()` elegantly.
681
+ _a.sent();
682
+ return [2 /*return*/];
683
+ }
684
+ });
685
+ };
686
+ this_1 = this;
687
+ _a.label = 1;
688
+ case 1:
689
+ if (!(!observer.closed && !terminated)) return [3 /*break*/, 3];
690
+ return [5 /*yield**/, _loop_1()];
691
+ case 2:
692
+ _a.sent();
693
+ return [3 /*break*/, 1];
694
+ case 3: return [2 /*return*/];
695
+ }
696
+ });
697
+ }); }, 'syncQueriesObservable main');
626
698
  });
627
699
  };
628
700
  SyncEngine.prototype.disconnectionHandler = function () {
@@ -638,6 +710,57 @@ var SyncEngine = /** @class */ (function () {
638
710
  SyncEngine.prototype.unsubscribeConnectivity = function () {
639
711
  this.datastoreConnectivity.unsubscribe();
640
712
  };
713
+ /**
714
+ * Stops all subscription activities and resolves when all activies report
715
+ * that they're disconnected, done retrying, etc..
716
+ */
717
+ SyncEngine.prototype.stop = function () {
718
+ return __awaiter(this, void 0, void 0, function () {
719
+ return __generator(this, function (_a) {
720
+ switch (_a.label) {
721
+ case 0:
722
+ logger.debug('stopping sync engine');
723
+ /**
724
+ * Gracefully disconnecting subscribers first just prevents *more* work
725
+ * from entering the pipelines.
726
+ */
727
+ this.unsubscribeConnectivity();
728
+ /**
729
+ * aggressively shut down any lingering background processes.
730
+ * some of this might be semi-redundant with unsubscribing. however,
731
+ * unsubscribing doesn't allow us to wait for settling.
732
+ * (Whereas `stop()` does.)
733
+ */
734
+ return [4 /*yield*/, this.mutationsProcessor.stop()];
735
+ case 1:
736
+ /**
737
+ * aggressively shut down any lingering background processes.
738
+ * some of this might be semi-redundant with unsubscribing. however,
739
+ * unsubscribing doesn't allow us to wait for settling.
740
+ * (Whereas `stop()` does.)
741
+ */
742
+ _a.sent();
743
+ return [4 /*yield*/, this.subscriptionsProcessor.stop()];
744
+ case 2:
745
+ _a.sent();
746
+ return [4 /*yield*/, this.datastoreConnectivity.stop()];
747
+ case 3:
748
+ _a.sent();
749
+ return [4 /*yield*/, this.syncQueriesProcessor.stop()];
750
+ case 4:
751
+ _a.sent();
752
+ return [4 /*yield*/, this.runningProcesses.close()];
753
+ case 5:
754
+ _a.sent();
755
+ return [4 /*yield*/, this.runningProcesses.open()];
756
+ case 6:
757
+ _a.sent();
758
+ logger.debug('sync engine stopped and ready to restart');
759
+ return [2 /*return*/];
760
+ }
761
+ });
762
+ });
763
+ };
641
764
  SyncEngine.prototype.setupModels = function (params) {
642
765
  return __awaiter(this, void 0, void 0, function () {
643
766
  var fullSyncInterval, ModelMetadataConstructor, models, savedModel, promises, result, _a, _b, modelMetadata, modelName, e_2_1;