@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.
- package/dist/aws-amplify-datastore.js +2799 -1459
- package/dist/aws-amplify-datastore.js.map +1 -1
- package/dist/aws-amplify-datastore.min.js +10 -10
- package/dist/aws-amplify-datastore.min.js.map +1 -1
- package/lib/authModeStrategies/multiAuthStrategy.js +11 -0
- package/lib/authModeStrategies/multiAuthStrategy.js.map +1 -1
- package/lib/datastore/datastore.js +524 -323
- package/lib/datastore/datastore.js.map +1 -1
- package/lib/storage/adapter/IndexedDBAdapter.js +76 -25
- package/lib/storage/adapter/IndexedDBAdapter.js.map +1 -1
- package/lib/storage/storage.js +2 -2
- package/lib/storage/storage.js.map +1 -1
- package/lib/sync/datastoreConnectivity.js +45 -0
- package/lib/sync/datastoreConnectivity.js.map +1 -1
- package/lib/sync/index.js +518 -395
- package/lib/sync/index.js.map +1 -1
- package/lib/sync/merger.js +6 -0
- package/lib/sync/merger.js.map +1 -1
- package/lib/sync/outbox.js +66 -62
- package/lib/sync/outbox.js.map +1 -1
- package/lib/sync/processors/mutation.js +207 -165
- package/lib/sync/processors/mutation.js.map +1 -1
- package/lib/sync/processors/subscription.js +210 -175
- package/lib/sync/processors/subscription.js.map +1 -1
- package/lib/sync/processors/sync.js +95 -72
- package/lib/sync/processors/sync.js.map +1 -1
- package/lib/sync/utils.js +1 -3
- package/lib/sync/utils.js.map +1 -1
- package/lib/util.js +89 -0
- package/lib/util.js.map +1 -1
- package/lib-esm/authModeStrategies/multiAuthStrategy.d.ts +11 -0
- package/lib-esm/authModeStrategies/multiAuthStrategy.js +11 -0
- package/lib-esm/authModeStrategies/multiAuthStrategy.js.map +1 -1
- package/lib-esm/datastore/datastore.d.ts +95 -2
- package/lib-esm/datastore/datastore.js +524 -323
- package/lib-esm/datastore/datastore.js.map +1 -1
- package/lib-esm/storage/adapter/IndexedDBAdapter.d.ts +21 -0
- package/lib-esm/storage/adapter/IndexedDBAdapter.js +77 -26
- package/lib-esm/storage/adapter/IndexedDBAdapter.js.map +1 -1
- package/lib-esm/storage/storage.js +2 -2
- package/lib-esm/storage/storage.js.map +1 -1
- package/lib-esm/sync/datastoreConnectivity.d.ts +1 -0
- package/lib-esm/sync/datastoreConnectivity.js +45 -0
- package/lib-esm/sync/datastoreConnectivity.js.map +1 -1
- package/lib-esm/sync/index.d.ts +9 -1
- package/lib-esm/sync/index.js +519 -396
- package/lib-esm/sync/index.js.map +1 -1
- package/lib-esm/sync/merger.d.ts +6 -0
- package/lib-esm/sync/merger.js +6 -0
- package/lib-esm/sync/merger.js.map +1 -1
- package/lib-esm/sync/outbox.js +66 -62
- package/lib-esm/sync/outbox.js.map +1 -1
- package/lib-esm/sync/processors/mutation.d.ts +2 -0
- package/lib-esm/sync/processors/mutation.js +208 -166
- package/lib-esm/sync/processors/mutation.js.map +1 -1
- package/lib-esm/sync/processors/subscription.d.ts +2 -0
- package/lib-esm/sync/processors/subscription.js +211 -176
- package/lib-esm/sync/processors/subscription.js.map +1 -1
- package/lib-esm/sync/processors/sync.d.ts +2 -0
- package/lib-esm/sync/processors/sync.js +96 -73
- package/lib-esm/sync/processors/sync.js.map +1 -1
- package/lib-esm/sync/utils.js +1 -3
- package/lib-esm/sync/utils.js.map +1 -1
- package/lib-esm/util.d.ts +11 -0
- package/lib-esm/util.js +89 -0
- package/lib-esm/util.js.map +1 -1
- package/package.json +7 -7
- package/src/authModeStrategies/multiAuthStrategy.ts +11 -0
- package/src/datastore/datastore.ts +572 -366
- package/src/storage/adapter/IndexedDBAdapter.ts +50 -9
- package/src/storage/storage.ts +2 -2
- package/src/sync/datastoreConnectivity.ts +6 -0
- package/src/sync/index.ts +492 -400
- package/src/sync/merger.ts +6 -0
- package/src/sync/outbox.ts +1 -1
- package/src/sync/processors/mutation.ts +139 -104
- package/src/sync/processors/subscription.ts +287 -250
- package/src/sync/processors/sync.ts +88 -60
- package/src/sync/utils.ts +1 -3
- package/src/util.ts +92 -2
- package/lib/authModeStrategies/defaultAuthStrategy.d.ts +0 -2
- package/lib/authModeStrategies/index.d.ts +0 -2
- package/lib/authModeStrategies/multiAuthStrategy.d.ts +0 -2
- package/lib/datastore/datastore.d.ts +0 -63
- package/lib/index.d.ts +0 -15
- package/lib/predicates/index.d.ts +0 -16
- package/lib/predicates/sort.d.ts +0 -8
- package/lib/ssr/index.d.ts +0 -3
- package/lib/storage/adapter/AsyncStorageAdapter.d.ts +0 -41
- package/lib/storage/adapter/AsyncStorageDatabase.d.ts +0 -39
- package/lib/storage/adapter/InMemoryStore.d.ts +0 -11
- package/lib/storage/adapter/InMemoryStore.native.d.ts +0 -1
- package/lib/storage/adapter/IndexedDBAdapter.d.ts +0 -38
- package/lib/storage/adapter/getDefaultAdapter/index.d.ts +0 -3
- package/lib/storage/adapter/getDefaultAdapter/index.native.d.ts +0 -3
- package/lib/storage/adapter/index.d.ts +0 -9
- package/lib/storage/storage.d.ts +0 -49
- package/lib/sync/datastoreConnectivity.d.ts +0 -15
- package/lib/sync/datastoreReachability/index.d.ts +0 -3
- package/lib/sync/datastoreReachability/index.native.d.ts +0 -3
- package/lib/sync/index.d.ts +0 -81
- package/lib/sync/merger.d.ts +0 -11
- package/lib/sync/outbox.d.ts +0 -27
- package/lib/sync/processors/errorMaps.d.ts +0 -17
- package/lib/sync/processors/mutation.d.ts +0 -56
- package/lib/sync/processors/subscription.d.ts +0 -31
- package/lib/sync/processors/sync.d.ts +0 -26
- package/lib/sync/utils.d.ts +0 -42
- package/lib/types.d.ts +0 -501
- package/lib/util.d.ts +0 -145
package/lib-esm/sync/index.js
CHANGED
|
@@ -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 =
|
|
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 (
|
|
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 (
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
|
|
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
|
-
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
|
|
195
|
-
|
|
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
|
-
|
|
216
|
-
|
|
217
|
-
|
|
218
|
-
|
|
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
|
|
344
|
+
var _this = this;
|
|
308
345
|
return __generator(this, function (_b) {
|
|
309
|
-
|
|
310
|
-
|
|
311
|
-
|
|
312
|
-
|
|
313
|
-
|
|
314
|
-
|
|
315
|
-
|
|
316
|
-
|
|
317
|
-
|
|
318
|
-
|
|
319
|
-
|
|
320
|
-
|
|
321
|
-
|
|
322
|
-
|
|
323
|
-
|
|
324
|
-
|
|
325
|
-
|
|
326
|
-
|
|
327
|
-
|
|
328
|
-
|
|
329
|
-
|
|
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
|
-
|
|
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
|
-
|
|
405
|
-
|
|
406
|
-
|
|
407
|
-
|
|
408
|
-
|
|
409
|
-
|
|
410
|
-
|
|
411
|
-
|
|
412
|
-
|
|
413
|
-
|
|
414
|
-
|
|
415
|
-
|
|
416
|
-
|
|
417
|
-
|
|
418
|
-
|
|
419
|
-
|
|
420
|
-
|
|
421
|
-
|
|
422
|
-
|
|
423
|
-
.
|
|
424
|
-
|
|
425
|
-
|
|
426
|
-
|
|
427
|
-
|
|
428
|
-
|
|
429
|
-
|
|
430
|
-
|
|
431
|
-
|
|
432
|
-
|
|
433
|
-
|
|
434
|
-
|
|
435
|
-
|
|
436
|
-
|
|
437
|
-
|
|
438
|
-
|
|
439
|
-
|
|
440
|
-
|
|
441
|
-
|
|
442
|
-
|
|
443
|
-
|
|
444
|
-
|
|
445
|
-
|
|
446
|
-
|
|
447
|
-
|
|
448
|
-
|
|
449
|
-
|
|
450
|
-
|
|
451
|
-
|
|
452
|
-
|
|
453
|
-
|
|
454
|
-
|
|
455
|
-
|
|
456
|
-
|
|
457
|
-
|
|
458
|
-
|
|
459
|
-
|
|
460
|
-
|
|
461
|
-
|
|
462
|
-
|
|
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
|
-
|
|
465
|
-
|
|
466
|
-
|
|
467
|
-
|
|
468
|
-
|
|
469
|
-
|
|
470
|
-
|
|
471
|
-
|
|
472
|
-
|
|
473
|
-
|
|
474
|
-
|
|
475
|
-
|
|
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
|
-
|
|
521
|
-
|
|
522
|
-
|
|
523
|
-
|
|
524
|
-
|
|
525
|
-
|
|
526
|
-
|
|
527
|
-
|
|
528
|
-
|
|
529
|
-
|
|
530
|
-
|
|
531
|
-
|
|
532
|
-
|
|
533
|
-
|
|
534
|
-
|
|
535
|
-
|
|
536
|
-
|
|
537
|
-
|
|
538
|
-
|
|
539
|
-
|
|
540
|
-
|
|
541
|
-
|
|
542
|
-
|
|
543
|
-
|
|
544
|
-
|
|
545
|
-
|
|
546
|
-
|
|
547
|
-
|
|
548
|
-
|
|
549
|
-
|
|
550
|
-
|
|
551
|
-
|
|
552
|
-
|
|
553
|
-
|
|
554
|
-
|
|
555
|
-
|
|
556
|
-
|
|
557
|
-
|
|
558
|
-
|
|
559
|
-
|
|
560
|
-
|
|
561
|
-
|
|
562
|
-
|
|
563
|
-
|
|
564
|
-
|
|
565
|
-
|
|
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.
|
|
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
|
-
|
|
570
|
-
|
|
571
|
-
|
|
572
|
-
|
|
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
|
-
|
|
578
|
-
|
|
579
|
-
|
|
580
|
-
|
|
581
|
-
|
|
582
|
-
|
|
583
|
-
|
|
584
|
-
|
|
585
|
-
|
|
586
|
-
|
|
587
|
-
|
|
588
|
-
|
|
589
|
-
|
|
590
|
-
|
|
591
|
-
|
|
592
|
-
|
|
593
|
-
|
|
594
|
-
|
|
595
|
-
|
|
596
|
-
|
|
597
|
-
|
|
598
|
-
|
|
599
|
-
|
|
600
|
-
|
|
601
|
-
|
|
602
|
-
|
|
603
|
-
|
|
604
|
-
|
|
605
|
-
|
|
606
|
-
|
|
607
|
-
|
|
608
|
-
|
|
609
|
-
|
|
610
|
-
return [
|
|
611
|
-
|
|
612
|
-
|
|
613
|
-
|
|
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;
|