dexie-cloud-addon 4.0.0-beta.17 → 4.0.0-beta.20
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/modern/dexie-cloud-addon.js +1630 -1572
- package/dist/modern/dexie-cloud-addon.js.map +1 -1
- package/dist/modern/dexie-cloud-addon.min.js +1 -1
- package/dist/modern/dexie-cloud-addon.min.js.map +1 -1
- package/dist/modern/service-worker.js +1694 -1630
- package/dist/modern/service-worker.js.map +1 -1
- package/dist/modern/service-worker.min.js +1 -1
- package/dist/modern/service-worker.min.js.map +1 -1
- package/dist/module-es5/dexie-cloud-addon.js +701 -662
- package/dist/module-es5/dexie-cloud-addon.js.map +1 -1
- package/dist/module-es5/dexie-cloud-addon.min.js +1 -1
- package/dist/module-es5/dexie-cloud-addon.min.js.map +1 -1
- package/dist/types/DexieCloudAPI.d.ts +1 -0
- package/dist/types/DexieCloudEntity.d.ts +8 -0
- package/dist/types/DexieCloudOptions.d.ts +1 -0
- package/dist/types/WebSocketStatus.d.ts +1 -0
- package/dist/types/createMyMembersObservable.d.ts +14 -0
- package/dist/types/currentUserObservable.d.ts +3 -0
- package/dist/types/default-ui/Dialog.d.ts +2 -1
- package/dist/types/helpers/BroadcastedLocalEvent.d.ts +8 -0
- package/dist/types/helpers/visibleState.d.ts +1 -0
- package/dist/types/permissionsLookup.d.ts +9 -0
- package/dist/types/permissionsLookupObservable.d.ts +14 -0
- package/dist/types/sync/globalizePrivateIds.d.ts +4 -0
- package/dist/types/sync/syncServerToClientOnly.d.ts +3 -0
- package/dist/types/types/CloudConnectionStatus.d.ts +0 -0
- package/dist/types/types/ConnectionStatus.d.ts +0 -0
- package/dist/types/types/LoginState.d.ts +41 -0
- package/dist/types/types/SyncConnectionStatus.d.ts +1 -0
- package/dist/types/types/SyncFlowStatus.d.ts +6 -0
- package/dist/types/types/SyncStatus.d.ts +6 -0
- package/dist/umd/dexie-cloud-addon.js +701 -662
- package/dist/umd/dexie-cloud-addon.js.map +1 -1
- package/dist/umd/dexie-cloud-addon.min.js +1 -1
- package/dist/umd/dexie-cloud-addon.min.js.map +1 -1
- package/dist/umd/service-worker.js +1694 -1630
- package/dist/umd/service-worker.js.map +1 -1
- package/dist/umd/service-worker.min.js +1 -1
- package/dist/umd/service-worker.min.js.map +1 -1
- package/dist/umd-modern/dexie-cloud-addon.js +1627 -1569
- package/dist/umd-modern/dexie-cloud-addon.js.map +1 -1
- package/package.json +2 -2
|
@@ -50,7 +50,7 @@
|
|
|
50
50
|
return __assign.apply(this, arguments);
|
|
51
51
|
};
|
|
52
52
|
|
|
53
|
-
function __awaiter$
|
|
53
|
+
function __awaiter$2(thisArg, _arguments, P, generator) {
|
|
54
54
|
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
|
|
55
55
|
return new (P || (P = Promise))(function (resolve, reject) {
|
|
56
56
|
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
|
|
@@ -108,13 +108,46 @@
|
|
|
108
108
|
*
|
|
109
109
|
* ==========================================================================
|
|
110
110
|
*
|
|
111
|
-
* Version 4.0.0-beta.
|
|
111
|
+
* Version 4.0.0-beta.20, Tue May 24 2022
|
|
112
112
|
*
|
|
113
113
|
* https://dexie.org
|
|
114
114
|
*
|
|
115
115
|
* Apache License Version 2.0, January 2004, http://www.apache.org/licenses/
|
|
116
116
|
*
|
|
117
117
|
*/
|
|
118
|
+
/*! *****************************************************************************
|
|
119
|
+
Copyright (c) Microsoft Corporation.
|
|
120
|
+
|
|
121
|
+
Permission to use, copy, modify, and/or distribute this software for any
|
|
122
|
+
purpose with or without fee is hereby granted.
|
|
123
|
+
|
|
124
|
+
THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH
|
|
125
|
+
REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
|
|
126
|
+
AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT,
|
|
127
|
+
INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM
|
|
128
|
+
LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR
|
|
129
|
+
OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
|
|
130
|
+
PERFORMANCE OF THIS SOFTWARE.
|
|
131
|
+
***************************************************************************** */
|
|
132
|
+
function __awaiter$1(thisArg, _arguments, P, generator) {
|
|
133
|
+
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
|
|
134
|
+
return new (P || (P = Promise))(function (resolve, reject) {
|
|
135
|
+
function fulfilled(value) { try {
|
|
136
|
+
step(generator.next(value));
|
|
137
|
+
}
|
|
138
|
+
catch (e) {
|
|
139
|
+
reject(e);
|
|
140
|
+
} }
|
|
141
|
+
function rejected(value) { try {
|
|
142
|
+
step(generator["throw"](value));
|
|
143
|
+
}
|
|
144
|
+
catch (e) {
|
|
145
|
+
reject(e);
|
|
146
|
+
} }
|
|
147
|
+
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
|
|
148
|
+
step((generator = generator.apply(thisArg, _arguments || [])).next());
|
|
149
|
+
});
|
|
150
|
+
}
|
|
118
151
|
//@ts-check
|
|
119
152
|
var randomFillSync = crypto.getRandomValues;
|
|
120
153
|
function assert(b) {
|
|
@@ -247,8 +280,8 @@
|
|
|
247
280
|
switch (entry.type) {
|
|
248
281
|
case "ups":
|
|
249
282
|
// Adjust the existing upsert with additional updates
|
|
250
|
-
for (var
|
|
251
|
-
var
|
|
283
|
+
for (var _k = 0, _l = Object.entries(changeSpec); _k < _l.length; _k++) {
|
|
284
|
+
var _m = _l[_k], propPath = _m[0], value = _m[1];
|
|
252
285
|
setByKeyPath(entry.val, propPath, value);
|
|
253
286
|
}
|
|
254
287
|
break;
|
|
@@ -275,10 +308,10 @@
|
|
|
275
308
|
return target;
|
|
276
309
|
}
|
|
277
310
|
function applyOperations(target, ops) {
|
|
278
|
-
for (var
|
|
279
|
-
var
|
|
280
|
-
for (var
|
|
281
|
-
var mut = muts_1[
|
|
311
|
+
for (var _k = 0, ops_1 = ops; _k < ops_1.length; _k++) {
|
|
312
|
+
var _l = ops_1[_k], table = _l.table, muts = _l.muts;
|
|
313
|
+
for (var _m = 0, muts_1 = muts; _m < muts_1.length; _m++) {
|
|
314
|
+
var mut = muts_1[_m];
|
|
282
315
|
applyOperation(target, table, mut);
|
|
283
316
|
}
|
|
284
317
|
}
|
|
@@ -287,10 +320,10 @@
|
|
|
287
320
|
changesToSubtract // additional mutations on client during syncWithServer()
|
|
288
321
|
) {
|
|
289
322
|
var _a, _b, _c;
|
|
290
|
-
for (var
|
|
291
|
-
var
|
|
292
|
-
for (var
|
|
293
|
-
var
|
|
323
|
+
for (var _k = 0, _l = Object.entries(changesToSubtract); _k < _l.length; _k++) {
|
|
324
|
+
var _m = _l[_k], table = _m[0], mutationSet = _m[1];
|
|
325
|
+
for (var _o = 0, _p = Object.entries(mutationSet); _o < _p.length; _o++) {
|
|
326
|
+
var _q = _p[_o], key = _q[0], mut = _q[1];
|
|
294
327
|
switch (mut.type) {
|
|
295
328
|
case 'ups':
|
|
296
329
|
{
|
|
@@ -320,8 +353,8 @@
|
|
|
320
353
|
switch (targetMut.type) {
|
|
321
354
|
case 'ups':
|
|
322
355
|
// Adjust the server upsert with locally updated values.
|
|
323
|
-
for (var
|
|
324
|
-
var
|
|
356
|
+
for (var _r = 0, _s = Object.entries(mut.mod); _r < _s.length; _r++) {
|
|
357
|
+
var _t = _s[_r], propPath = _t[0], value = _t[1];
|
|
325
358
|
setByKeyPath(targetMut.val, propPath, value);
|
|
326
359
|
}
|
|
327
360
|
break;
|
|
@@ -330,8 +363,8 @@
|
|
|
330
363
|
break;
|
|
331
364
|
case 'upd':
|
|
332
365
|
// Remove the local update props from the server update mutation.
|
|
333
|
-
for (var
|
|
334
|
-
var propPath =
|
|
366
|
+
for (var _u = 0, _v = Object.keys(mut.mod); _u < _v.length; _u++) {
|
|
367
|
+
var propPath = _v[_u];
|
|
335
368
|
delete targetMut.mod[propPath];
|
|
336
369
|
}
|
|
337
370
|
break;
|
|
@@ -354,10 +387,10 @@
|
|
|
354
387
|
var txid = randomString$1(16);
|
|
355
388
|
// Convert data into a temporary map to collect mutations of same table and type
|
|
356
389
|
var map = {};
|
|
357
|
-
for (var
|
|
358
|
-
var
|
|
359
|
-
for (var
|
|
360
|
-
var
|
|
390
|
+
for (var _k = 0, _l = Object.entries(inSet); _k < _l.length; _k++) {
|
|
391
|
+
var _m = _l[_k], table = _m[0], ops = _m[1];
|
|
392
|
+
for (var _o = 0, _p = Object.entries(ops); _o < _p.length; _o++) {
|
|
393
|
+
var _q = _p[_o], key = _q[0], op = _q[1];
|
|
361
394
|
var mapEntry = map[table] || (map[table] = {});
|
|
362
395
|
var ops_2 = mapEntry[op.type] || (mapEntry[op.type] = []);
|
|
363
396
|
ops_2.push(Object.assign({ key: key }, op)); // DBKeyMutation doesn't contain key, so we need to bring it in.
|
|
@@ -365,14 +398,14 @@
|
|
|
365
398
|
}
|
|
366
399
|
// Start computing the resulting format:
|
|
367
400
|
var result = [];
|
|
368
|
-
for (var
|
|
369
|
-
var
|
|
401
|
+
for (var _r = 0, _s = Object.entries(map); _r < _s.length; _r++) {
|
|
402
|
+
var _t = _s[_r], table = _t[0], ops = _t[1];
|
|
370
403
|
var resultEntry = {
|
|
371
404
|
table: table,
|
|
372
405
|
muts: [],
|
|
373
406
|
};
|
|
374
|
-
for (var
|
|
375
|
-
var
|
|
407
|
+
for (var _u = 0, _v = Object.entries(ops); _u < _v.length; _u++) {
|
|
408
|
+
var _w = _v[_u], optype = _w[0], muts = _w[1];
|
|
376
409
|
switch (optype) {
|
|
377
410
|
case "ups": {
|
|
378
411
|
var op = {
|
|
@@ -2019,18 +2052,18 @@
|
|
|
2019
2052
|
function registerSyncEvent(db, purpose) {
|
|
2020
2053
|
return __awaiter$1(this, void 0, void 0, function () {
|
|
2021
2054
|
var sw, e_3;
|
|
2022
|
-
return __generator$1(this, function (
|
|
2023
|
-
switch (
|
|
2055
|
+
return __generator$1(this, function (_k) {
|
|
2056
|
+
switch (_k.label) {
|
|
2024
2057
|
case 0:
|
|
2025
|
-
|
|
2058
|
+
_k.trys.push([0, 4, , 5]);
|
|
2026
2059
|
return [4 /*yield*/, navigator.serviceWorker.ready];
|
|
2027
2060
|
case 1:
|
|
2028
|
-
sw =
|
|
2061
|
+
sw = _k.sent();
|
|
2029
2062
|
if (!(purpose === "push" && sw.sync)) return [3 /*break*/, 3];
|
|
2030
2063
|
return [4 /*yield*/, sw.sync.register("dexie-cloud:".concat(db.name))];
|
|
2031
2064
|
case 2:
|
|
2032
|
-
|
|
2033
|
-
|
|
2065
|
+
_k.sent();
|
|
2066
|
+
_k.label = 3;
|
|
2034
2067
|
case 3:
|
|
2035
2068
|
if (sw.active) {
|
|
2036
2069
|
// Use postMessage for pull syncs and for browsers not supporting sync event (Firefox, Safari).
|
|
@@ -2046,7 +2079,7 @@
|
|
|
2046
2079
|
}
|
|
2047
2080
|
return [2 /*return*/];
|
|
2048
2081
|
case 4:
|
|
2049
|
-
e_3 =
|
|
2082
|
+
e_3 = _k.sent();
|
|
2050
2083
|
if (!hasComplainedAboutSyncEvent) {
|
|
2051
2084
|
console.debug("Dexie Cloud: Could not register sync event", e_3);
|
|
2052
2085
|
hasComplainedAboutSyncEvent = true;
|
|
@@ -2058,36 +2091,36 @@
|
|
|
2058
2091
|
});
|
|
2059
2092
|
}
|
|
2060
2093
|
function registerPeriodicSyncEvent(db) {
|
|
2061
|
-
var
|
|
2094
|
+
var _a;
|
|
2062
2095
|
return __awaiter$1(this, void 0, void 0, function () {
|
|
2063
2096
|
var periodicSync, e_4, e_5;
|
|
2064
|
-
return __generator$1(this, function (
|
|
2065
|
-
switch (
|
|
2097
|
+
return __generator$1(this, function (_k) {
|
|
2098
|
+
switch (_k.label) {
|
|
2066
2099
|
case 0:
|
|
2067
|
-
|
|
2100
|
+
_k.trys.push([0, 8, , 9]);
|
|
2068
2101
|
return [4 /*yield*/, navigator.serviceWorker.ready];
|
|
2069
2102
|
case 1:
|
|
2070
|
-
periodicSync = (
|
|
2103
|
+
periodicSync = (_k.sent()).periodicSync;
|
|
2071
2104
|
if (!periodicSync) return [3 /*break*/, 6];
|
|
2072
|
-
|
|
2105
|
+
_k.label = 2;
|
|
2073
2106
|
case 2:
|
|
2074
|
-
|
|
2075
|
-
return [4 /*yield*/, periodicSync.register("dexie-cloud:".concat(db.name), (
|
|
2107
|
+
_k.trys.push([2, 4, , 5]);
|
|
2108
|
+
return [4 /*yield*/, periodicSync.register("dexie-cloud:".concat(db.name), (_a = db.cloud.options) === null || _a === void 0 ? void 0 : _a.periodicSync)];
|
|
2076
2109
|
case 3:
|
|
2077
|
-
|
|
2110
|
+
_k.sent();
|
|
2078
2111
|
console.debug("Dexie Cloud: Successfully registered periodicsync event for ".concat(db.name));
|
|
2079
2112
|
return [3 /*break*/, 5];
|
|
2080
2113
|
case 4:
|
|
2081
|
-
e_4 =
|
|
2114
|
+
e_4 = _k.sent();
|
|
2082
2115
|
console.debug("Dexie Cloud: Failed to register periodic sync. Your PWA must be installed to allow background sync.", e_4);
|
|
2083
2116
|
return [3 /*break*/, 5];
|
|
2084
2117
|
case 5: return [3 /*break*/, 7];
|
|
2085
2118
|
case 6:
|
|
2086
2119
|
console.debug("Dexie Cloud: periodicSync not supported.");
|
|
2087
|
-
|
|
2120
|
+
_k.label = 7;
|
|
2088
2121
|
case 7: return [3 /*break*/, 9];
|
|
2089
2122
|
case 8:
|
|
2090
|
-
e_5 =
|
|
2123
|
+
e_5 = _k.sent();
|
|
2091
2124
|
console.debug("Dexie Cloud: Could not register periodicSync for ".concat(db.name), e_5);
|
|
2092
2125
|
return [3 /*break*/, 9];
|
|
2093
2126
|
case 9: return [2 /*return*/];
|
|
@@ -2121,7 +2154,7 @@
|
|
|
2121
2154
|
: function (b) { return btoa(String.fromCharCode.apply(null, b)); };
|
|
2122
2155
|
function interactWithUser(userInteraction, req) {
|
|
2123
2156
|
return new Promise(function (resolve, reject) {
|
|
2124
|
-
var interactionProps =
|
|
2157
|
+
var interactionProps = Object.assign(Object.assign({}, req), { onSubmit: function (res) {
|
|
2125
2158
|
userInteraction.next(undefined);
|
|
2126
2159
|
resolve(res);
|
|
2127
2160
|
}, onCancel: function () {
|
|
@@ -2142,8 +2175,8 @@
|
|
|
2142
2175
|
}
|
|
2143
2176
|
function alertUser(userInteraction, title) {
|
|
2144
2177
|
var alerts = [];
|
|
2145
|
-
for (var
|
|
2146
|
-
alerts[
|
|
2178
|
+
for (var _k = 2; _k < arguments.length; _k++) {
|
|
2179
|
+
alerts[_k - 2] = arguments[_k];
|
|
2147
2180
|
}
|
|
2148
2181
|
return interactWithUser(userInteraction, {
|
|
2149
2182
|
type: 'message-alert',
|
|
@@ -2155,11 +2188,11 @@
|
|
|
2155
2188
|
function promptForEmail(userInteraction, title, emailHint) {
|
|
2156
2189
|
return __awaiter$1(this, void 0, void 0, function () {
|
|
2157
2190
|
var email;
|
|
2158
|
-
return __generator$1(this, function (
|
|
2159
|
-
switch (
|
|
2191
|
+
return __generator$1(this, function (_k) {
|
|
2192
|
+
switch (_k.label) {
|
|
2160
2193
|
case 0:
|
|
2161
2194
|
email = emailHint || '';
|
|
2162
|
-
|
|
2195
|
+
_k.label = 1;
|
|
2163
2196
|
case 1:
|
|
2164
2197
|
if (!(!email || !/^[\w-\.]+@([\w-]+\.)+[\w-]{2,10}$/.test(email))) return [3 /*break*/, 3];
|
|
2165
2198
|
return [4 /*yield*/, interactWithUser(userInteraction, {
|
|
@@ -2183,7 +2216,7 @@
|
|
|
2183
2216
|
},
|
|
2184
2217
|
})];
|
|
2185
2218
|
case 2:
|
|
2186
|
-
email = (
|
|
2219
|
+
email = (_k.sent()).email;
|
|
2187
2220
|
return [3 /*break*/, 1];
|
|
2188
2221
|
case 3: return [2 /*return*/, email];
|
|
2189
2222
|
}
|
|
@@ -2193,8 +2226,8 @@
|
|
|
2193
2226
|
function promptForOTP(userInteraction, email, alert) {
|
|
2194
2227
|
return __awaiter$1(this, void 0, void 0, function () {
|
|
2195
2228
|
var alerts, otp;
|
|
2196
|
-
return __generator$1(this, function (
|
|
2197
|
-
switch (
|
|
2229
|
+
return __generator$1(this, function (_k) {
|
|
2230
|
+
switch (_k.label) {
|
|
2198
2231
|
case 0:
|
|
2199
2232
|
alerts = [
|
|
2200
2233
|
{
|
|
@@ -2220,44 +2253,44 @@
|
|
|
2220
2253
|
},
|
|
2221
2254
|
})];
|
|
2222
2255
|
case 1:
|
|
2223
|
-
otp = (
|
|
2256
|
+
otp = (_k.sent()).otp;
|
|
2224
2257
|
return [2 /*return*/, otp];
|
|
2225
2258
|
}
|
|
2226
2259
|
});
|
|
2227
2260
|
});
|
|
2228
2261
|
}
|
|
2229
2262
|
function loadAccessToken(db) {
|
|
2230
|
-
var
|
|
2263
|
+
var _a, _b;
|
|
2231
2264
|
return __awaiter$1(this, void 0, void 0, function () {
|
|
2232
2265
|
var currentUser, accessToken, accessTokenExpiration, refreshToken, refreshTokenExpiration, claims, expTime, refreshExpTime, refreshedLogin;
|
|
2233
|
-
return __generator$1(this, function (
|
|
2234
|
-
switch (
|
|
2266
|
+
return __generator$1(this, function (_k) {
|
|
2267
|
+
switch (_k.label) {
|
|
2235
2268
|
case 0: return [4 /*yield*/, db.getCurrentUser()];
|
|
2236
2269
|
case 1:
|
|
2237
|
-
currentUser =
|
|
2270
|
+
currentUser = _k.sent();
|
|
2238
2271
|
accessToken = currentUser.accessToken, accessTokenExpiration = currentUser.accessTokenExpiration, refreshToken = currentUser.refreshToken, refreshTokenExpiration = currentUser.refreshTokenExpiration, claims = currentUser.claims;
|
|
2239
2272
|
if (!accessToken)
|
|
2240
2273
|
return [2 /*return*/];
|
|
2241
|
-
expTime = (
|
|
2274
|
+
expTime = (_a = accessTokenExpiration === null || accessTokenExpiration === void 0 ? void 0 : accessTokenExpiration.getTime()) !== null && _a !== void 0 ? _a : Infinity;
|
|
2242
2275
|
if (expTime > Date.now()) {
|
|
2243
2276
|
return [2 /*return*/, accessToken];
|
|
2244
2277
|
}
|
|
2245
2278
|
if (!refreshToken) {
|
|
2246
2279
|
throw new Error("Refresh token missing");
|
|
2247
2280
|
}
|
|
2248
|
-
refreshExpTime = (
|
|
2281
|
+
refreshExpTime = (_b = refreshTokenExpiration === null || refreshTokenExpiration === void 0 ? void 0 : refreshTokenExpiration.getTime()) !== null && _b !== void 0 ? _b : Infinity;
|
|
2249
2282
|
if (refreshExpTime <= Date.now()) {
|
|
2250
2283
|
throw new Error("Refresh token has expired");
|
|
2251
2284
|
}
|
|
2252
2285
|
return [4 /*yield*/, refreshAccessToken(db.cloud.options.databaseUrl, currentUser)];
|
|
2253
2286
|
case 2:
|
|
2254
|
-
refreshedLogin =
|
|
2287
|
+
refreshedLogin = _k.sent();
|
|
2255
2288
|
return [4 /*yield*/, db.table('$logins').update(claims.sub, {
|
|
2256
2289
|
accessToken: refreshedLogin.accessToken,
|
|
2257
2290
|
accessTokenExpiration: refreshedLogin.accessTokenExpiration,
|
|
2258
2291
|
})];
|
|
2259
2292
|
case 3:
|
|
2260
|
-
|
|
2293
|
+
_k.sent();
|
|
2261
2294
|
return [2 /*return*/, refreshedLogin.accessToken];
|
|
2262
2295
|
}
|
|
2263
2296
|
});
|
|
@@ -2265,8 +2298,8 @@
|
|
|
2265
2298
|
}
|
|
2266
2299
|
function authenticate(url, context, fetchToken, userInteraction, hints) {
|
|
2267
2300
|
return __awaiter$1(this, void 0, void 0, function () {
|
|
2268
|
-
return __generator$1(this, function (
|
|
2269
|
-
switch (
|
|
2301
|
+
return __generator$1(this, function (_k) {
|
|
2302
|
+
switch (_k.label) {
|
|
2270
2303
|
case 0:
|
|
2271
2304
|
if (!(context.accessToken &&
|
|
2272
2305
|
context.accessTokenExpiration.getTime() > Date.now())) return [3 /*break*/, 1];
|
|
@@ -2276,9 +2309,9 @@
|
|
|
2276
2309
|
(!context.refreshTokenExpiration ||
|
|
2277
2310
|
context.refreshTokenExpiration.getTime() > Date.now()))) return [3 /*break*/, 3];
|
|
2278
2311
|
return [4 /*yield*/, refreshAccessToken(url, context)];
|
|
2279
|
-
case 2: return [2 /*return*/,
|
|
2312
|
+
case 2: return [2 /*return*/, _k.sent()];
|
|
2280
2313
|
case 3: return [4 /*yield*/, userAuthenticate(context, fetchToken, userInteraction, hints)];
|
|
2281
|
-
case 4: return [2 /*return*/,
|
|
2314
|
+
case 4: return [2 /*return*/, _k.sent()];
|
|
2282
2315
|
}
|
|
2283
2316
|
});
|
|
2284
2317
|
});
|
|
@@ -2286,8 +2319,8 @@
|
|
|
2286
2319
|
function refreshAccessToken(url, login) {
|
|
2287
2320
|
return __awaiter$1(this, void 0, void 0, function () {
|
|
2288
2321
|
var time_stamp, signing_algorithm, textEncoder, data, binarySignature, signature, tokenRequest, res, response;
|
|
2289
|
-
return __generator$1(this, function (
|
|
2290
|
-
switch (
|
|
2322
|
+
return __generator$1(this, function (_k) {
|
|
2323
|
+
switch (_k.label) {
|
|
2291
2324
|
case 0:
|
|
2292
2325
|
if (!login.refreshToken)
|
|
2293
2326
|
throw new Error("Cannot refresh token - refresh token is missing.");
|
|
@@ -2299,7 +2332,7 @@
|
|
|
2299
2332
|
data = textEncoder.encode(login.refreshToken + time_stamp);
|
|
2300
2333
|
return [4 /*yield*/, crypto.subtle.sign(signing_algorithm, login.nonExportablePrivateKey, data)];
|
|
2301
2334
|
case 1:
|
|
2302
|
-
binarySignature =
|
|
2335
|
+
binarySignature = _k.sent();
|
|
2303
2336
|
signature = b64encode(binarySignature);
|
|
2304
2337
|
tokenRequest = {
|
|
2305
2338
|
grant_type: 'refresh_token',
|
|
@@ -2316,12 +2349,12 @@
|
|
|
2316
2349
|
mode: 'cors',
|
|
2317
2350
|
})];
|
|
2318
2351
|
case 2:
|
|
2319
|
-
res =
|
|
2352
|
+
res = _k.sent();
|
|
2320
2353
|
if (res.status !== 200)
|
|
2321
2354
|
throw new Error("RefreshToken: Status ".concat(res.status, " from ").concat(url, "/token"));
|
|
2322
2355
|
return [4 /*yield*/, res.json()];
|
|
2323
2356
|
case 3:
|
|
2324
|
-
response =
|
|
2357
|
+
response = _k.sent();
|
|
2325
2358
|
login.accessToken = response.accessToken;
|
|
2326
2359
|
login.accessTokenExpiration = response.accessTokenExpiration
|
|
2327
2360
|
? new Date(response.accessTokenExpiration)
|
|
@@ -2333,9 +2366,9 @@
|
|
|
2333
2366
|
}
|
|
2334
2367
|
function userAuthenticate(context, fetchToken, userInteraction, hints) {
|
|
2335
2368
|
return __awaiter$1(this, void 0, void 0, function () {
|
|
2336
|
-
var
|
|
2337
|
-
return __generator$1(this, function (
|
|
2338
|
-
switch (
|
|
2369
|
+
var _k, privateKey, publicKey, publicKeySPKI, publicKeyPEM, response2, error_1;
|
|
2370
|
+
return __generator$1(this, function (_l) {
|
|
2371
|
+
switch (_l.label) {
|
|
2339
2372
|
case 0: return [4 /*yield*/, crypto.subtle.generateKey({
|
|
2340
2373
|
name: 'RSASSA-PKCS1-v1_5',
|
|
2341
2374
|
modulusLength: 2048,
|
|
@@ -2344,24 +2377,24 @@
|
|
|
2344
2377
|
}, false, // Non-exportable...
|
|
2345
2378
|
['sign', 'verify'])];
|
|
2346
2379
|
case 1:
|
|
2347
|
-
|
|
2380
|
+
_k = _l.sent(), privateKey = _k.privateKey, publicKey = _k.publicKey;
|
|
2348
2381
|
if (!privateKey || !publicKey)
|
|
2349
2382
|
throw new Error("Could not generate RSA keypair"); // Typings suggest these can be undefined...
|
|
2350
2383
|
context.nonExportablePrivateKey = privateKey; //...but storable!
|
|
2351
2384
|
return [4 /*yield*/, crypto.subtle.exportKey('spki', publicKey)];
|
|
2352
2385
|
case 2:
|
|
2353
|
-
publicKeySPKI =
|
|
2386
|
+
publicKeySPKI = _l.sent();
|
|
2354
2387
|
publicKeyPEM = spkiToPEM(publicKeySPKI);
|
|
2355
2388
|
context.publicKey = publicKey;
|
|
2356
|
-
|
|
2389
|
+
_l.label = 3;
|
|
2357
2390
|
case 3:
|
|
2358
|
-
|
|
2391
|
+
_l.trys.push([3, 7, , 9]);
|
|
2359
2392
|
return [4 /*yield*/, fetchToken({
|
|
2360
2393
|
public_key: publicKeyPEM,
|
|
2361
2394
|
hints: hints,
|
|
2362
2395
|
})];
|
|
2363
2396
|
case 4:
|
|
2364
|
-
response2 =
|
|
2397
|
+
response2 = _l.sent();
|
|
2365
2398
|
if (response2.type !== 'tokens')
|
|
2366
2399
|
throw new Error("Unexpected response type from token endpoint: ".concat(response2.type));
|
|
2367
2400
|
context.accessToken = response2.accessToken;
|
|
@@ -2382,11 +2415,11 @@
|
|
|
2382
2415
|
alerts: response2.alerts,
|
|
2383
2416
|
})];
|
|
2384
2417
|
case 5:
|
|
2385
|
-
|
|
2386
|
-
|
|
2418
|
+
_l.sent();
|
|
2419
|
+
_l.label = 6;
|
|
2387
2420
|
case 6: return [2 /*return*/, context];
|
|
2388
2421
|
case 7:
|
|
2389
|
-
error_1 =
|
|
2422
|
+
error_1 = _l.sent();
|
|
2390
2423
|
return [4 /*yield*/, alertUser(userInteraction, 'Authentication Failed', {
|
|
2391
2424
|
type: 'error',
|
|
2392
2425
|
messageCode: 'GENERIC_ERROR',
|
|
@@ -2394,7 +2427,7 @@
|
|
|
2394
2427
|
messageParams: {}
|
|
2395
2428
|
}).catch(function () { })];
|
|
2396
2429
|
case 8:
|
|
2397
|
-
|
|
2430
|
+
_l.sent();
|
|
2398
2431
|
throw error_1;
|
|
2399
2432
|
case 9: return [2 /*return*/];
|
|
2400
2433
|
}
|
|
@@ -2437,7 +2470,7 @@
|
|
|
2437
2470
|
AuthPersistedContext.prototype.save = function () {
|
|
2438
2471
|
return __awaiter$1(this, void 0, void 0, function () {
|
|
2439
2472
|
var db;
|
|
2440
|
-
return __generator$1(this, function (
|
|
2473
|
+
return __generator$1(this, function (_k) {
|
|
2441
2474
|
db = wm$1.get(this);
|
|
2442
2475
|
db.table("$logins").put(this);
|
|
2443
2476
|
return [2 /*return*/];
|
|
@@ -2464,21 +2497,21 @@
|
|
|
2464
2497
|
}(Error));
|
|
2465
2498
|
function otpFetchTokenCallback(db) {
|
|
2466
2499
|
var userInteraction = db.cloud.userInteraction;
|
|
2467
|
-
return function otpAuthenticate(
|
|
2468
|
-
var
|
|
2469
|
-
var
|
|
2500
|
+
return function otpAuthenticate(_k) {
|
|
2501
|
+
var public_key = _k.public_key, hints = _k.hints;
|
|
2502
|
+
var _a;
|
|
2470
2503
|
return __awaiter$1(this, void 0, void 0, function () {
|
|
2471
|
-
var tokenRequest, url, demo_user, email, res1, errMsg, response, otp, res2, errorText,
|
|
2472
|
-
return __generator$1(this, function (
|
|
2473
|
-
switch (
|
|
2504
|
+
var tokenRequest, url, demo_user, email, res1, errMsg, response, otp, res2, errorText, _k, errMsg, response2;
|
|
2505
|
+
return __generator$1(this, function (_l) {
|
|
2506
|
+
switch (_l.label) {
|
|
2474
2507
|
case 0:
|
|
2475
|
-
url = (
|
|
2508
|
+
url = (_a = db.cloud.options) === null || _a === void 0 ? void 0 : _a.databaseUrl;
|
|
2476
2509
|
if (!url)
|
|
2477
2510
|
throw new Error("No database URL given.");
|
|
2478
2511
|
if (!((hints === null || hints === void 0 ? void 0 : hints.grant_type) === 'demo')) return [3 /*break*/, 2];
|
|
2479
2512
|
return [4 /*yield*/, promptForEmail(userInteraction, 'Enter a demo user email', (hints === null || hints === void 0 ? void 0 : hints.email) || (hints === null || hints === void 0 ? void 0 : hints.userId))];
|
|
2480
2513
|
case 1:
|
|
2481
|
-
demo_user =
|
|
2514
|
+
demo_user = _l.sent();
|
|
2482
2515
|
tokenRequest = {
|
|
2483
2516
|
demo_user: demo_user,
|
|
2484
2517
|
grant_type: 'demo',
|
|
@@ -2488,25 +2521,25 @@
|
|
|
2488
2521
|
return [3 /*break*/, 4];
|
|
2489
2522
|
case 2: return [4 /*yield*/, promptForEmail(userInteraction, 'Enter email address', hints === null || hints === void 0 ? void 0 : hints.email)];
|
|
2490
2523
|
case 3:
|
|
2491
|
-
email =
|
|
2524
|
+
email = _l.sent();
|
|
2492
2525
|
tokenRequest = {
|
|
2493
2526
|
email: email,
|
|
2494
2527
|
grant_type: 'otp',
|
|
2495
2528
|
scopes: ['ACCESS_DB'],
|
|
2496
2529
|
public_key: public_key,
|
|
2497
2530
|
};
|
|
2498
|
-
|
|
2531
|
+
_l.label = 4;
|
|
2499
2532
|
case 4: return [4 /*yield*/, fetch("".concat(url, "/token"), {
|
|
2500
2533
|
body: JSON.stringify(tokenRequest),
|
|
2501
2534
|
method: 'post',
|
|
2502
2535
|
headers: { 'Content-Type': 'application/json', mode: 'cors' },
|
|
2503
2536
|
})];
|
|
2504
2537
|
case 5:
|
|
2505
|
-
res1 =
|
|
2538
|
+
res1 = _l.sent();
|
|
2506
2539
|
if (!(res1.status !== 200)) return [3 /*break*/, 8];
|
|
2507
2540
|
return [4 /*yield*/, res1.text()];
|
|
2508
2541
|
case 6:
|
|
2509
|
-
errMsg =
|
|
2542
|
+
errMsg = _l.sent();
|
|
2510
2543
|
return [4 /*yield*/, alertUser(userInteraction, "Token request failed", {
|
|
2511
2544
|
type: 'error',
|
|
2512
2545
|
messageCode: 'GENERIC_ERROR',
|
|
@@ -2514,11 +2547,11 @@
|
|
|
2514
2547
|
messageParams: {}
|
|
2515
2548
|
}).catch(function () { })];
|
|
2516
2549
|
case 7:
|
|
2517
|
-
|
|
2550
|
+
_l.sent();
|
|
2518
2551
|
throw new HttpError(res1, errMsg);
|
|
2519
2552
|
case 8: return [4 /*yield*/, res1.json()];
|
|
2520
2553
|
case 9:
|
|
2521
|
-
response =
|
|
2554
|
+
response = _l.sent();
|
|
2522
2555
|
if (!(response.type === 'tokens')) return [3 /*break*/, 10];
|
|
2523
2556
|
// Demo user request can get a "tokens" response right away
|
|
2524
2557
|
return [2 /*return*/, response];
|
|
@@ -2528,7 +2561,7 @@
|
|
|
2528
2561
|
throw new Error("Unexpected response from ".concat(url, "/token"));
|
|
2529
2562
|
return [4 /*yield*/, promptForOTP(userInteraction, tokenRequest.email)];
|
|
2530
2563
|
case 11:
|
|
2531
|
-
otp =
|
|
2564
|
+
otp = _l.sent();
|
|
2532
2565
|
tokenRequest.otp = otp || '';
|
|
2533
2566
|
tokenRequest.otp_id = response.otp_id;
|
|
2534
2567
|
return [4 /*yield*/, fetch("".concat(url, "/token"), {
|
|
@@ -2538,14 +2571,14 @@
|
|
|
2538
2571
|
mode: 'cors',
|
|
2539
2572
|
})];
|
|
2540
2573
|
case 12:
|
|
2541
|
-
res2 =
|
|
2542
|
-
|
|
2574
|
+
res2 = _l.sent();
|
|
2575
|
+
_l.label = 13;
|
|
2543
2576
|
case 13:
|
|
2544
2577
|
if (!(res2.status === 401)) return [3 /*break*/, 17];
|
|
2545
2578
|
return [4 /*yield*/, res2.text()];
|
|
2546
2579
|
case 14:
|
|
2547
|
-
errorText =
|
|
2548
|
-
|
|
2580
|
+
errorText = _l.sent();
|
|
2581
|
+
_k = tokenRequest;
|
|
2549
2582
|
return [4 /*yield*/, promptForOTP(userInteraction, tokenRequest.email, {
|
|
2550
2583
|
type: 'error',
|
|
2551
2584
|
messageCode: 'INVALID_OTP',
|
|
@@ -2553,7 +2586,7 @@
|
|
|
2553
2586
|
messageParams: {}
|
|
2554
2587
|
})];
|
|
2555
2588
|
case 15:
|
|
2556
|
-
|
|
2589
|
+
_k.otp = _l.sent();
|
|
2557
2590
|
return [4 /*yield*/, fetch("".concat(url, "/token"), {
|
|
2558
2591
|
body: JSON.stringify(tokenRequest),
|
|
2559
2592
|
method: 'post',
|
|
@@ -2561,13 +2594,13 @@
|
|
|
2561
2594
|
mode: 'cors',
|
|
2562
2595
|
})];
|
|
2563
2596
|
case 16:
|
|
2564
|
-
res2 =
|
|
2597
|
+
res2 = _l.sent();
|
|
2565
2598
|
return [3 /*break*/, 13];
|
|
2566
2599
|
case 17:
|
|
2567
2600
|
if (!(res2.status !== 200)) return [3 /*break*/, 20];
|
|
2568
2601
|
return [4 /*yield*/, res2.text()];
|
|
2569
2602
|
case 18:
|
|
2570
|
-
errMsg =
|
|
2603
|
+
errMsg = _l.sent();
|
|
2571
2604
|
return [4 /*yield*/, alertUser(userInteraction, "OTP Authentication Failed", {
|
|
2572
2605
|
type: 'error',
|
|
2573
2606
|
messageCode: 'GENERIC_ERROR',
|
|
@@ -2575,11 +2608,11 @@
|
|
|
2575
2608
|
messageParams: {}
|
|
2576
2609
|
}).catch(function () { })];
|
|
2577
2610
|
case 19:
|
|
2578
|
-
|
|
2611
|
+
_l.sent();
|
|
2579
2612
|
throw new HttpError(res2, errMsg);
|
|
2580
2613
|
case 20: return [4 /*yield*/, res2.json()];
|
|
2581
2614
|
case 21:
|
|
2582
|
-
response2 =
|
|
2615
|
+
response2 = _l.sent();
|
|
2583
2616
|
return [2 /*return*/, response2];
|
|
2584
2617
|
case 22: throw new Error("Unexpected response from ".concat(url, "/token"));
|
|
2585
2618
|
}
|
|
@@ -2602,19 +2635,19 @@
|
|
|
2602
2635
|
return __awaiter$1(this, void 0, void 0, function () {
|
|
2603
2636
|
var $logins;
|
|
2604
2637
|
var _this_1 = this;
|
|
2605
|
-
return __generator$1(this, function (
|
|
2606
|
-
switch (
|
|
2638
|
+
return __generator$1(this, function (_k) {
|
|
2639
|
+
switch (_k.label) {
|
|
2607
2640
|
case 0:
|
|
2608
2641
|
if (user.userId === db.cloud.currentUserId)
|
|
2609
2642
|
return [2 /*return*/]; // Already this user.
|
|
2610
2643
|
$logins = db.table('$logins');
|
|
2611
2644
|
return [4 /*yield*/, db.transaction('rw', $logins, function (tx) { return __awaiter$1(_this_1, void 0, void 0, function () {
|
|
2612
2645
|
var existingLogins;
|
|
2613
|
-
return __generator$1(this, function (
|
|
2614
|
-
switch (
|
|
2646
|
+
return __generator$1(this, function (_k) {
|
|
2647
|
+
switch (_k.label) {
|
|
2615
2648
|
case 0: return [4 /*yield*/, $logins.toArray()];
|
|
2616
2649
|
case 1:
|
|
2617
|
-
existingLogins =
|
|
2650
|
+
existingLogins = _k.sent();
|
|
2618
2651
|
return [4 /*yield*/, Promise.all(existingLogins
|
|
2619
2652
|
.filter(function (login) { return login.userId !== user.userId && login.isLoggedIn; })
|
|
2620
2653
|
.map(function (login) {
|
|
@@ -2622,19 +2655,19 @@
|
|
|
2622
2655
|
return $logins.put(login);
|
|
2623
2656
|
}))];
|
|
2624
2657
|
case 2:
|
|
2625
|
-
|
|
2658
|
+
_k.sent();
|
|
2626
2659
|
user.isLoggedIn = true;
|
|
2627
2660
|
user.lastLogin = new Date();
|
|
2628
2661
|
return [4 /*yield*/, user.save()];
|
|
2629
2662
|
case 3:
|
|
2630
|
-
|
|
2663
|
+
_k.sent();
|
|
2631
2664
|
console.debug('Saved new user', user.email);
|
|
2632
2665
|
return [2 /*return*/];
|
|
2633
2666
|
}
|
|
2634
2667
|
});
|
|
2635
2668
|
}); })];
|
|
2636
2669
|
case 1:
|
|
2637
|
-
|
|
2670
|
+
_k.sent();
|
|
2638
2671
|
return [4 /*yield*/, new Promise(function (resolve) {
|
|
2639
2672
|
if (db.cloud.currentUserId === user.userId) {
|
|
2640
2673
|
resolve(null);
|
|
@@ -2649,7 +2682,7 @@
|
|
|
2649
2682
|
}
|
|
2650
2683
|
})];
|
|
2651
2684
|
case 2:
|
|
2652
|
-
|
|
2685
|
+
_k.sent();
|
|
2653
2686
|
return [2 /*return*/];
|
|
2654
2687
|
}
|
|
2655
2688
|
});
|
|
@@ -2658,11 +2691,11 @@
|
|
|
2658
2691
|
function login(db, hints) {
|
|
2659
2692
|
return __awaiter$1(this, void 0, void 0, function () {
|
|
2660
2693
|
var currentUser, context;
|
|
2661
|
-
return __generator$1(this, function (
|
|
2662
|
-
switch (
|
|
2694
|
+
return __generator$1(this, function (_k) {
|
|
2695
|
+
switch (_k.label) {
|
|
2663
2696
|
case 0: return [4 /*yield*/, db.getCurrentUser()];
|
|
2664
2697
|
case 1:
|
|
2665
|
-
currentUser =
|
|
2698
|
+
currentUser = _k.sent();
|
|
2666
2699
|
if (currentUser.isLoggedIn) {
|
|
2667
2700
|
if (hints) {
|
|
2668
2701
|
if (hints.email && db.cloud.currentUser.value.email !== hints.email) {
|
|
@@ -2681,13 +2714,13 @@
|
|
|
2681
2714
|
});
|
|
2682
2715
|
return [4 /*yield*/, authenticate(db.cloud.options.databaseUrl, context, db.cloud.options.fetchTokens || otpFetchTokenCallback(db), db.cloud.userInteraction, hints)];
|
|
2683
2716
|
case 2:
|
|
2684
|
-
|
|
2717
|
+
_k.sent();
|
|
2685
2718
|
return [4 /*yield*/, context.save()];
|
|
2686
2719
|
case 3:
|
|
2687
|
-
|
|
2720
|
+
_k.sent();
|
|
2688
2721
|
return [4 /*yield*/, setCurrentUser(db, context)];
|
|
2689
2722
|
case 4:
|
|
2690
|
-
|
|
2723
|
+
_k.sent();
|
|
2691
2724
|
// Make sure to resync as the new login will be authorized
|
|
2692
2725
|
// for new realms.
|
|
2693
2726
|
triggerSync(db, "pull");
|
|
@@ -2708,7 +2741,7 @@
|
|
|
2708
2741
|
Object.freeze(UNAUTHORIZED_USER);
|
|
2709
2742
|
Object.freeze(UNAUTHORIZED_USER.claims);
|
|
2710
2743
|
}
|
|
2711
|
-
catch (
|
|
2744
|
+
catch (_a) { }
|
|
2712
2745
|
var swHolder = {};
|
|
2713
2746
|
var swContainer = self.document && navigator.serviceWorker; // self.document is to verify we're not the SW ourself
|
|
2714
2747
|
if (swContainer)
|
|
@@ -2716,9 +2749,9 @@
|
|
|
2716
2749
|
if (typeof self !== 'undefined' && 'clients' in self && !self.document) {
|
|
2717
2750
|
// We are the service worker. Propagate messages to all our clients.
|
|
2718
2751
|
addEventListener('message', function (ev) {
|
|
2719
|
-
var
|
|
2720
|
-
if ((
|
|
2721
|
-
__spreadArray$1([], self['clients'].matchAll({ includeUncontrolled: true }), true).forEach(function (client) { var
|
|
2752
|
+
var _a, _b;
|
|
2753
|
+
if ((_b = (_a = ev.data) === null || _a === void 0 ? void 0 : _a.type) === null || _b === void 0 ? void 0 : _b.startsWith('sw-broadcast-')) {
|
|
2754
|
+
__spreadArray$1([], self['clients'].matchAll({ includeUncontrolled: true }), true).forEach(function (client) { var _a; return client.id !== ((_a = ev.source) === null || _a === void 0 ? void 0 : _a.id) && client.postMessage(ev.data); });
|
|
2722
2755
|
}
|
|
2723
2756
|
});
|
|
2724
2757
|
}
|
|
@@ -2731,8 +2764,8 @@
|
|
|
2731
2764
|
if (!swContainer)
|
|
2732
2765
|
return function () { };
|
|
2733
2766
|
var forwarder = function (ev) {
|
|
2734
|
-
var
|
|
2735
|
-
if (((
|
|
2767
|
+
var _a;
|
|
2768
|
+
if (((_a = ev.data) === null || _a === void 0 ? void 0 : _a.type) === "sw-broadcast-".concat(_this_1.name)) {
|
|
2736
2769
|
listener(ev.data.message);
|
|
2737
2770
|
}
|
|
2738
2771
|
};
|
|
@@ -2741,7 +2774,7 @@
|
|
|
2741
2774
|
};
|
|
2742
2775
|
SWBroadcastChannel.prototype.postMessage = function (message) {
|
|
2743
2776
|
var _this_1 = this;
|
|
2744
|
-
var
|
|
2777
|
+
var _a;
|
|
2745
2778
|
if (typeof self['clients'] === 'object') {
|
|
2746
2779
|
// We're a service worker. Propagate to our browser clients.
|
|
2747
2780
|
__spreadArray$1([], self['clients'].matchAll({ includeUncontrolled: true }), true).forEach(function (client) { return client.postMessage({
|
|
@@ -2752,7 +2785,7 @@
|
|
|
2752
2785
|
else if (swHolder.registration) {
|
|
2753
2786
|
// We're a client (browser window or other worker)
|
|
2754
2787
|
// Post to SW so it can repost to all its clients and to itself
|
|
2755
|
-
(
|
|
2788
|
+
(_a = swHolder.registration.active) === null || _a === void 0 ? void 0 : _a.postMessage({
|
|
2756
2789
|
type: "sw-broadcast-".concat(this.name),
|
|
2757
2790
|
message: message
|
|
2758
2791
|
});
|
|
@@ -2798,25 +2831,25 @@
|
|
|
2798
2831
|
return _this_1;
|
|
2799
2832
|
}
|
|
2800
2833
|
BroadcastedAndLocalEvent.prototype.next = function (message) {
|
|
2801
|
-
console.debug("BroadcastedAndLocalEvent: bc.postMessage()",
|
|
2834
|
+
console.debug("BroadcastedAndLocalEvent: bc.postMessage()", Object.assign({}, message), "bc is a", this.bc);
|
|
2802
2835
|
this.bc.postMessage(message);
|
|
2803
2836
|
var ev = new CustomEvent("lbc-".concat(this.name), { detail: message });
|
|
2804
2837
|
self.dispatchEvent(ev);
|
|
2805
2838
|
};
|
|
2806
2839
|
return BroadcastedAndLocalEvent;
|
|
2807
2840
|
}(rxjs.Observable));
|
|
2808
|
-
function computeRealmSetHash(
|
|
2809
|
-
var realms =
|
|
2841
|
+
function computeRealmSetHash(_k) {
|
|
2842
|
+
var realms = _k.realms, inviteRealms = _k.inviteRealms;
|
|
2810
2843
|
return __awaiter$1(this, void 0, void 0, function () {
|
|
2811
2844
|
var data, byteArray, digestBytes, base64;
|
|
2812
|
-
return __generator$1(this, function (
|
|
2813
|
-
switch (
|
|
2845
|
+
return __generator$1(this, function (_k) {
|
|
2846
|
+
switch (_k.label) {
|
|
2814
2847
|
case 0:
|
|
2815
2848
|
data = JSON.stringify(__spreadArray$1(__spreadArray$1([], realms.map(function (realmId) { return ({ realmId: realmId, accepted: true }); }), true), inviteRealms.map(function (realmId) { return ({ realmId: realmId, accepted: false }); }), true).sort(function (a, b) { return a.realmId < b.realmId ? -1 : a.realmId > b.realmId ? 1 : 0; }));
|
|
2816
2849
|
byteArray = new TextEncoder().encode(data);
|
|
2817
2850
|
return [4 /*yield*/, crypto.subtle.digest('SHA-1', byteArray)];
|
|
2818
2851
|
case 1:
|
|
2819
|
-
digestBytes =
|
|
2852
|
+
digestBytes = _k.sent();
|
|
2820
2853
|
base64 = b64encode(digestBytes);
|
|
2821
2854
|
return [2 /*return*/, base64];
|
|
2822
2855
|
}
|
|
@@ -2825,14 +2858,14 @@
|
|
|
2825
2858
|
}
|
|
2826
2859
|
function getSyncableTables(db) {
|
|
2827
2860
|
return Object.entries(db.cloud.schema || {})
|
|
2828
|
-
.filter(function (
|
|
2829
|
-
var markedForSync =
|
|
2861
|
+
.filter(function (_k) {
|
|
2862
|
+
var markedForSync = _k[1].markedForSync;
|
|
2830
2863
|
return markedForSync;
|
|
2831
2864
|
})
|
|
2832
|
-
.map(function (
|
|
2833
|
-
var tbl =
|
|
2834
|
-
return db.tables.filter(function (
|
|
2835
|
-
var name =
|
|
2865
|
+
.map(function (_k) {
|
|
2866
|
+
var tbl = _k[0];
|
|
2867
|
+
return db.tables.filter(function (_k) {
|
|
2868
|
+
var name = _k.name;
|
|
2836
2869
|
return name === tbl;
|
|
2837
2870
|
})[0];
|
|
2838
2871
|
})
|
|
@@ -2842,8 +2875,8 @@
|
|
|
2842
2875
|
return "$".concat(tableName, "_mutations");
|
|
2843
2876
|
}
|
|
2844
2877
|
function getTableFromMutationTable(mutationTable) {
|
|
2845
|
-
var
|
|
2846
|
-
var tableName = (
|
|
2878
|
+
var _a;
|
|
2879
|
+
var tableName = (_a = /^\$(.*)_mutations$/.exec(mutationTable)) === null || _a === void 0 ? void 0 : _a[1];
|
|
2847
2880
|
if (!tableName)
|
|
2848
2881
|
throw new Error("Given mutationTable ".concat(mutationTable, " is not correct"));
|
|
2849
2882
|
return tableName;
|
|
@@ -2852,17 +2885,17 @@
|
|
|
2852
2885
|
function flatten(a) {
|
|
2853
2886
|
return concat.apply([], a);
|
|
2854
2887
|
}
|
|
2855
|
-
function listClientChanges(mutationTables, db,
|
|
2856
|
-
var
|
|
2888
|
+
function listClientChanges(mutationTables, db, _k) {
|
|
2889
|
+
var _l = _k === void 0 ? {} : _k, _m = _l.since, since = _m === void 0 ? {} : _m, _o = _l.limit, limit = _o === void 0 ? Infinity : _o;
|
|
2857
2890
|
return __awaiter$1(this, void 0, void 0, function () {
|
|
2858
|
-
var allMutsOnTables, sorted, result, currentEntry, currentTxid,
|
|
2891
|
+
var allMutsOnTables, sorted, result, currentEntry, currentTxid, _k, sorted_1, _l, table, mut;
|
|
2859
2892
|
var _this_1 = this;
|
|
2860
|
-
return __generator$1(this, function (
|
|
2861
|
-
switch (
|
|
2893
|
+
return __generator$1(this, function (_m) {
|
|
2894
|
+
switch (_m.label) {
|
|
2862
2895
|
case 0: return [4 /*yield*/, Promise.all(mutationTables.map(function (mutationTable) { return __awaiter$1(_this_1, void 0, void 0, function () {
|
|
2863
2896
|
var tableName, lastRevision, query, muts;
|
|
2864
|
-
return __generator$1(this, function (
|
|
2865
|
-
switch (
|
|
2897
|
+
return __generator$1(this, function (_k) {
|
|
2898
|
+
switch (_k.label) {
|
|
2866
2899
|
case 0:
|
|
2867
2900
|
tableName = getTableFromMutationTable(mutationTable.name);
|
|
2868
2901
|
lastRevision = since[tableName];
|
|
@@ -2873,7 +2906,7 @@
|
|
|
2873
2906
|
query = query.limit(limit);
|
|
2874
2907
|
return [4 /*yield*/, query.toArray()];
|
|
2875
2908
|
case 1:
|
|
2876
|
-
muts =
|
|
2909
|
+
muts = _k.sent();
|
|
2877
2910
|
//const objTable = db.table(tableName);
|
|
2878
2911
|
/*for (const mut of muts) {
|
|
2879
2912
|
if (mut.type === "insert" || mut.type === "upsert") {
|
|
@@ -2888,13 +2921,13 @@
|
|
|
2888
2921
|
});
|
|
2889
2922
|
}); }))];
|
|
2890
2923
|
case 1:
|
|
2891
|
-
allMutsOnTables =
|
|
2924
|
+
allMutsOnTables = _m.sent();
|
|
2892
2925
|
sorted = flatten(allMutsOnTables).sort(function (a, b) { return a.mut.ts - b.mut.ts; });
|
|
2893
2926
|
result = [];
|
|
2894
2927
|
currentEntry = null;
|
|
2895
2928
|
currentTxid = null;
|
|
2896
|
-
for (
|
|
2897
|
-
|
|
2929
|
+
for (_k = 0, sorted_1 = sorted; _k < sorted_1.length; _k++) {
|
|
2930
|
+
_l = sorted_1[_k], table = _l.table, mut = _l.mut;
|
|
2898
2931
|
if (currentEntry &&
|
|
2899
2932
|
currentEntry.table === table &&
|
|
2900
2933
|
currentTxid === mut.txid) {
|
|
@@ -2924,8 +2957,8 @@
|
|
|
2924
2957
|
return __awaiter$1(this, void 0, void 0, function () {
|
|
2925
2958
|
var txid, ignoredRealms_1, upserts;
|
|
2926
2959
|
var _this_1 = this;
|
|
2927
|
-
return __generator$1(this, function (
|
|
2928
|
-
switch (
|
|
2960
|
+
return __generator$1(this, function (_k) {
|
|
2961
|
+
switch (_k.label) {
|
|
2929
2962
|
case 0:
|
|
2930
2963
|
txid = "upload-".concat(randomString(8));
|
|
2931
2964
|
if (!currentUser.isLoggedIn) return [3 /*break*/, 2];
|
|
@@ -2933,8 +2966,8 @@
|
|
|
2933
2966
|
ignoredRealms_1 = new Set(alreadySyncedRealms || []);
|
|
2934
2967
|
return [4 /*yield*/, Promise.all(tablesToSyncify.map(function (table) { return __awaiter$1(_this_1, void 0, void 0, function () {
|
|
2935
2968
|
var extractKey, dexieCloudTableSchema, query, unsyncedObjects, mut;
|
|
2936
|
-
return __generator$1(this, function (
|
|
2937
|
-
switch (
|
|
2969
|
+
return __generator$1(this, function (_k) {
|
|
2970
|
+
switch (_k.label) {
|
|
2938
2971
|
case 0:
|
|
2939
2972
|
extractKey = table.core.schema.primaryKey.extractKey;
|
|
2940
2973
|
if (!extractKey)
|
|
@@ -2955,7 +2988,7 @@
|
|
|
2955
2988
|
});
|
|
2956
2989
|
return [4 /*yield*/, query.toArray()];
|
|
2957
2990
|
case 1:
|
|
2958
|
-
unsyncedObjects =
|
|
2991
|
+
unsyncedObjects = _k.sent();
|
|
2959
2992
|
if (unsyncedObjects.length > 0) {
|
|
2960
2993
|
mut = {
|
|
2961
2994
|
type: 'upsert',
|
|
@@ -2979,7 +3012,7 @@
|
|
|
2979
3012
|
});
|
|
2980
3013
|
}); }))];
|
|
2981
3014
|
case 1:
|
|
2982
|
-
upserts =
|
|
3015
|
+
upserts = _k.sent();
|
|
2983
3016
|
return [2 /*return*/, upserts.filter(function (op) { return op.muts.length > 0; })];
|
|
2984
3017
|
case 2: return [2 /*return*/, []];
|
|
2985
3018
|
}
|
|
@@ -3008,12 +3041,12 @@
|
|
|
3008
3041
|
if (!dollarKeys)
|
|
3009
3042
|
return value;
|
|
3010
3043
|
var clone = __assign({}, value);
|
|
3011
|
-
for (var
|
|
3012
|
-
var k_1 = dollarKeys_1[
|
|
3044
|
+
for (var _k = 0, dollarKeys_1 = dollarKeys; _k < dollarKeys_1.length; _k++) {
|
|
3045
|
+
var k_1 = dollarKeys_1[_k];
|
|
3013
3046
|
delete clone[k_1];
|
|
3014
3047
|
}
|
|
3015
|
-
for (var
|
|
3016
|
-
var k_2 = dollarKeys_2[
|
|
3048
|
+
for (var _l = 0, dollarKeys_2 = dollarKeys; _l < dollarKeys_2.length; _l++) {
|
|
3049
|
+
var k_2 = dollarKeys_2[_l];
|
|
3017
3050
|
clone["$" + k_2] = value[k_2];
|
|
3018
3051
|
}
|
|
3019
3052
|
return clone;
|
|
@@ -3023,8 +3056,8 @@
|
|
|
3023
3056
|
};
|
|
3024
3057
|
function TypesonSimplified() {
|
|
3025
3058
|
var typeDefsInputs = [];
|
|
3026
|
-
for (var
|
|
3027
|
-
typeDefsInputs[
|
|
3059
|
+
for (var _k = 0; _k < arguments.length; _k++) {
|
|
3060
|
+
typeDefsInputs[_k] = arguments[_k];
|
|
3028
3061
|
}
|
|
3029
3062
|
var typeDefs = typeDefsInputs.reduce(function (p, c) { return (__assign(__assign({}, p), c)); }, typeDefsInputs.reduce(function (p, c) { return (__assign(__assign({}, c), p)); }, {}));
|
|
3030
3063
|
var protoMap = new WeakMap();
|
|
@@ -3058,13 +3091,13 @@
|
|
|
3058
3091
|
// Unescape dollar props
|
|
3059
3092
|
value = __assign({}, value);
|
|
3060
3093
|
// Delete keys that children wanted us to delete
|
|
3061
|
-
for (var
|
|
3062
|
-
var k_3 =
|
|
3094
|
+
for (var _k = 0, _l = top[1]; _k < _l.length; _k++) {
|
|
3095
|
+
var k_3 = _l[_k];
|
|
3063
3096
|
delete value[k_3];
|
|
3064
3097
|
}
|
|
3065
3098
|
// Set keys that children wanted us to set
|
|
3066
|
-
for (var
|
|
3067
|
-
var
|
|
3099
|
+
for (var _m = 0, _o = Object.entries(top[2]); _m < _o.length; _m++) {
|
|
3100
|
+
var _p = _o[_m], k_4 = _p[0], v_1 = _p[1];
|
|
3068
3101
|
value[k_4] = v_1;
|
|
3069
3102
|
}
|
|
3070
3103
|
stack.pop();
|
|
@@ -3112,8 +3145,8 @@
|
|
|
3112
3145
|
if (typeDef !== undefined)
|
|
3113
3146
|
return typeDef; // Null counts to! So the caching of Array.prototype also counts.
|
|
3114
3147
|
var toStringTag_1 = getToStringTag(realVal);
|
|
3115
|
-
var entry = Object.entries(typeDefs).find(function (
|
|
3116
|
-
var typeName =
|
|
3148
|
+
var entry = Object.entries(typeDefs).find(function (_k) {
|
|
3149
|
+
var typeName = _k[0], typeDef = _k[1];
|
|
3117
3150
|
var _a, _b;
|
|
3118
3151
|
return (_b = (_a = typeDef === null || typeDef === void 0 ? void 0 : typeDef.test) === null || _a === void 0 ? void 0 : _a.call(typeDef, realVal, toStringTag_1)) !== null && _b !== void 0 ? _b : typeName === toStringTag_1;
|
|
3119
3152
|
});
|
|
@@ -3145,8 +3178,8 @@
|
|
|
3145
3178
|
i: i,
|
|
3146
3179
|
};
|
|
3147
3180
|
},
|
|
3148
|
-
revive: function (
|
|
3149
|
-
var i =
|
|
3181
|
+
revive: function (_k, altChannel) {
|
|
3182
|
+
var i = _k.i, mimeType = _k.mimeType;
|
|
3150
3183
|
return new Blob([altChannel[i]], { type: mimeType });
|
|
3151
3184
|
},
|
|
3152
3185
|
},
|
|
@@ -3165,8 +3198,8 @@
|
|
|
3165
3198
|
return num;
|
|
3166
3199
|
}
|
|
3167
3200
|
},
|
|
3168
|
-
revive: function (
|
|
3169
|
-
var v =
|
|
3201
|
+
revive: function (_k) {
|
|
3202
|
+
var v = _k.v;
|
|
3170
3203
|
return Number(v);
|
|
3171
3204
|
},
|
|
3172
3205
|
},
|
|
@@ -3185,8 +3218,8 @@
|
|
|
3185
3218
|
$t: "Date",
|
|
3186
3219
|
v: isNaN(date.getTime()) ? "NaN" : date.toISOString(),
|
|
3187
3220
|
}); },
|
|
3188
|
-
revive: function (
|
|
3189
|
-
var v =
|
|
3221
|
+
revive: function (_k) {
|
|
3222
|
+
var v = _k.v;
|
|
3190
3223
|
return new Date(v === "NaN" ? NaN : Date.parse(v));
|
|
3191
3224
|
},
|
|
3192
3225
|
},
|
|
@@ -3197,8 +3230,8 @@
|
|
|
3197
3230
|
$t: "Set",
|
|
3198
3231
|
v: Array.from(set.entries()),
|
|
3199
3232
|
}); },
|
|
3200
|
-
revive: function (
|
|
3201
|
-
var v =
|
|
3233
|
+
revive: function (_k) {
|
|
3234
|
+
var v = _k.v;
|
|
3202
3235
|
return new Set(v);
|
|
3203
3236
|
},
|
|
3204
3237
|
},
|
|
@@ -3209,8 +3242,8 @@
|
|
|
3209
3242
|
$t: "Map",
|
|
3210
3243
|
v: Array.from(map.entries()),
|
|
3211
3244
|
}); },
|
|
3212
|
-
revive: function (
|
|
3213
|
-
var v =
|
|
3245
|
+
revive: function (_k) {
|
|
3246
|
+
var v = _k.v;
|
|
3214
3247
|
return new Map(v);
|
|
3215
3248
|
},
|
|
3216
3249
|
},
|
|
@@ -3236,8 +3269,8 @@
|
|
|
3236
3269
|
"BigInt64Array",
|
|
3237
3270
|
"BigUint64Array",
|
|
3238
3271
|
].reduce(function (specs, typeName) {
|
|
3239
|
-
var
|
|
3240
|
-
return (__assign(__assign({}, specs), (
|
|
3272
|
+
var _k;
|
|
3273
|
+
return (__assign(__assign({}, specs), (_k = {}, _k[typeName] = {
|
|
3241
3274
|
// Replace passes the the typed array into $t, buffer so that
|
|
3242
3275
|
// the ArrayBuffer typedef takes care of further handling of the buffer:
|
|
3243
3276
|
// {$t:"Uint8Array",buffer:{$t:"ArrayBuffer",idx:0}}
|
|
@@ -3252,13 +3285,13 @@
|
|
|
3252
3285
|
};
|
|
3253
3286
|
return result;
|
|
3254
3287
|
},
|
|
3255
|
-
revive: function (
|
|
3256
|
-
var v =
|
|
3288
|
+
revive: function (_k, _, typeDefs) {
|
|
3289
|
+
var v = _k.v;
|
|
3257
3290
|
var TypedArray = _global[typeName];
|
|
3258
3291
|
return (TypedArray &&
|
|
3259
3292
|
new TypedArray(typeDefs.ArrayBuffer.revive({ v: v }, _, typeDefs)));
|
|
3260
3293
|
},
|
|
3261
|
-
},
|
|
3294
|
+
}, _k)));
|
|
3262
3295
|
}, {});
|
|
3263
3296
|
function b64LexEncode(b) {
|
|
3264
3297
|
return b64ToLex(b64encode(b));
|
|
@@ -3352,8 +3385,8 @@
|
|
|
3352
3385
|
"|": "/",
|
|
3353
3386
|
};
|
|
3354
3387
|
var ENCODE_TABLE = {};
|
|
3355
|
-
for (var
|
|
3356
|
-
var c_1 =
|
|
3388
|
+
for (var _k = 0, _l = Object.keys(DECODE_TABLE); _k < _l.length; _k++) {
|
|
3389
|
+
var c_1 = _l[_k];
|
|
3357
3390
|
ENCODE_TABLE[DECODE_TABLE[c_1]] = c_1;
|
|
3358
3391
|
}
|
|
3359
3392
|
var ArrayBufferDef = {
|
|
@@ -3362,8 +3395,8 @@
|
|
|
3362
3395
|
$t: "ArrayBuffer",
|
|
3363
3396
|
v: b64LexEncode(ab),
|
|
3364
3397
|
}); },
|
|
3365
|
-
revive: function (
|
|
3366
|
-
var v =
|
|
3398
|
+
revive: function (_k) {
|
|
3399
|
+
var v = _k.v;
|
|
3367
3400
|
var ba = b64LexDecode(v);
|
|
3368
3401
|
return ba.buffer.byteLength === ba.byteLength
|
|
3369
3402
|
? ba.buffer
|
|
@@ -3405,8 +3438,8 @@
|
|
|
3405
3438
|
: b64encode(string2ArrayBuffer(readBlobSync(blob))),
|
|
3406
3439
|
type: blob.type,
|
|
3407
3440
|
}); },
|
|
3408
|
-
revive: function (
|
|
3409
|
-
var type =
|
|
3441
|
+
revive: function (_k) {
|
|
3442
|
+
var type = _k.type, v = _k.v;
|
|
3410
3443
|
var ab = b64decode(v);
|
|
3411
3444
|
return typeof Blob !== undefined
|
|
3412
3445
|
? new Blob([ab])
|
|
@@ -3417,13 +3450,13 @@
|
|
|
3417
3450
|
var builtin = __assign(__assign(__assign(__assign(__assign(__assign(__assign(__assign({}, numberDef), bigIntDef), DateDef), SetDef), MapDef), TypedArraysDefs), ArrayBufferDef), BlobDef);
|
|
3418
3451
|
function Bison() {
|
|
3419
3452
|
var typeDefsInputs = [];
|
|
3420
|
-
for (var
|
|
3421
|
-
typeDefsInputs[
|
|
3453
|
+
for (var _k = 0; _k < arguments.length; _k++) {
|
|
3454
|
+
typeDefsInputs[_k] = arguments[_k];
|
|
3422
3455
|
}
|
|
3423
3456
|
var tson = TypesonSimplified.apply(void 0, __spreadArray$1([builtin, BisonBinaryTypes], typeDefsInputs, false));
|
|
3424
3457
|
return {
|
|
3425
3458
|
toBinary: function (value) {
|
|
3426
|
-
var
|
|
3459
|
+
var _k = this.stringify(value), blob = _k[0], json = _k[1];
|
|
3427
3460
|
var lenBuf = new ArrayBuffer(4);
|
|
3428
3461
|
new DataView(lenBuf).setUint32(0, blob.size);
|
|
3429
3462
|
return new Blob([lenBuf, blob, json]);
|
|
@@ -3439,16 +3472,16 @@
|
|
|
3439
3472
|
return [blob, json];
|
|
3440
3473
|
},
|
|
3441
3474
|
parse: function (json, binData) {
|
|
3442
|
-
return __awaiter$
|
|
3475
|
+
return __awaiter$2(this, void 0, void 0, function () {
|
|
3443
3476
|
var pos, arrayBuffers, buf, view, len, ab;
|
|
3444
|
-
return __generator$1(this, function (
|
|
3445
|
-
switch (
|
|
3477
|
+
return __generator$1(this, function (_k) {
|
|
3478
|
+
switch (_k.label) {
|
|
3446
3479
|
case 0:
|
|
3447
3480
|
pos = 0;
|
|
3448
3481
|
arrayBuffers = [];
|
|
3449
3482
|
return [4 /*yield*/, readBlobBinary(binData)];
|
|
3450
3483
|
case 1:
|
|
3451
|
-
buf =
|
|
3484
|
+
buf = _k.sent();
|
|
3452
3485
|
view = new DataView(buf);
|
|
3453
3486
|
while (pos < buf.byteLength) {
|
|
3454
3487
|
len = view.getUint32(pos);
|
|
@@ -3463,21 +3496,21 @@
|
|
|
3463
3496
|
});
|
|
3464
3497
|
},
|
|
3465
3498
|
fromBinary: function (blob) {
|
|
3466
|
-
return __awaiter$
|
|
3467
|
-
var len,
|
|
3468
|
-
return __generator$1(this, function (
|
|
3469
|
-
switch (
|
|
3499
|
+
return __awaiter$2(this, void 0, void 0, function () {
|
|
3500
|
+
var len, _k, binData, json;
|
|
3501
|
+
return __generator$1(this, function (_l) {
|
|
3502
|
+
switch (_l.label) {
|
|
3470
3503
|
case 0:
|
|
3471
|
-
|
|
3504
|
+
_k = DataView.bind;
|
|
3472
3505
|
return [4 /*yield*/, readBlobBinary(blob.slice(0, 4))];
|
|
3473
3506
|
case 1:
|
|
3474
|
-
len = new (
|
|
3507
|
+
len = new (_k.apply(DataView, [void 0, _l.sent()]))().getUint32(0);
|
|
3475
3508
|
binData = blob.slice(4, len + 4);
|
|
3476
3509
|
return [4 /*yield*/, readBlob(blob.slice(len + 4))];
|
|
3477
3510
|
case 2:
|
|
3478
|
-
json =
|
|
3511
|
+
json = _l.sent();
|
|
3479
3512
|
return [4 /*yield*/, this.parse(json, binData)];
|
|
3480
|
-
case 3: return [2 /*return*/,
|
|
3513
|
+
case 3: return [2 /*return*/, _l.sent()];
|
|
3481
3514
|
}
|
|
3482
3515
|
});
|
|
3483
3516
|
});
|
|
@@ -3543,16 +3576,16 @@
|
|
|
3543
3576
|
};
|
|
3544
3577
|
return FakeBigInt;
|
|
3545
3578
|
}());
|
|
3546
|
-
var defs =
|
|
3579
|
+
var defs = Object.assign(Object.assign({}, undefinedDef), (hasBigIntSupport
|
|
3547
3580
|
? {}
|
|
3548
3581
|
: {
|
|
3549
3582
|
bigint: {
|
|
3550
3583
|
test: function (val) { return val instanceof FakeBigInt; },
|
|
3551
3584
|
replace: function (fakeBigInt) {
|
|
3552
|
-
return
|
|
3585
|
+
return Object.assign({ $t: 'bigint' }, fakeBigInt);
|
|
3553
3586
|
},
|
|
3554
|
-
revive: function (
|
|
3555
|
-
var v =
|
|
3587
|
+
revive: function (_k) {
|
|
3588
|
+
var v = _k.v;
|
|
3556
3589
|
return new FakeBigInt(v);
|
|
3557
3590
|
}
|
|
3558
3591
|
}
|
|
@@ -3600,24 +3633,24 @@
|
|
|
3600
3633
|
});
|
|
3601
3634
|
rv.push(changeClone);
|
|
3602
3635
|
};
|
|
3603
|
-
for (var
|
|
3604
|
-
var change = changes_1[
|
|
3636
|
+
for (var _k = 0, changes_1 = changes; _k < changes_1.length; _k++) {
|
|
3637
|
+
var change = changes_1[_k];
|
|
3605
3638
|
_loop_2(change);
|
|
3606
3639
|
}
|
|
3607
3640
|
return rv;
|
|
3608
3641
|
}
|
|
3609
3642
|
function cloneChange(change, rewriteValues) {
|
|
3610
3643
|
// clone on demand:
|
|
3611
|
-
return
|
|
3612
|
-
? change.muts.map(function (m) { return (
|
|
3613
|
-
: change.muts.map(function (m) { return (
|
|
3644
|
+
return Object.assign(Object.assign({}, change), { muts: rewriteValues
|
|
3645
|
+
? change.muts.map(function (m) { return (Object.assign(Object.assign({}, m), { keys: m.keys.slice(), values: m.values.slice() })); })
|
|
3646
|
+
: change.muts.map(function (m) { return (Object.assign(Object.assign({}, m), { keys: m.keys.slice() })); }) });
|
|
3614
3647
|
}
|
|
3615
3648
|
//import {BisonWebStreamReader} from "dreambase-library/dist/typeson-simplified/BisonWebStreamReader";
|
|
3616
3649
|
function syncWithServer(changes, syncState, baseRevs, db, databaseUrl, schema, clientIdentity, currentUser) {
|
|
3617
3650
|
return __awaiter$1(this, void 0, void 0, function () {
|
|
3618
|
-
var headers, accessToken, syncRequest, res,
|
|
3619
|
-
return __generator$1(this, function (
|
|
3620
|
-
switch (
|
|
3651
|
+
var headers, accessToken, syncRequest, res, _k, _l, _m, text, syncRes;
|
|
3652
|
+
return __generator$1(this, function (_o) {
|
|
3653
|
+
switch (_o.label) {
|
|
3621
3654
|
case 0:
|
|
3622
3655
|
headers = {
|
|
3623
3656
|
Accept: 'application/json, application/x-bison, application/x-bison-stream',
|
|
@@ -3625,7 +3658,7 @@
|
|
|
3625
3658
|
};
|
|
3626
3659
|
return [4 /*yield*/, loadAccessToken(db)];
|
|
3627
3660
|
case 1:
|
|
3628
|
-
accessToken =
|
|
3661
|
+
accessToken = _o.sent();
|
|
3629
3662
|
if (accessToken) {
|
|
3630
3663
|
headers.Authorization = "Bearer ".concat(accessToken);
|
|
3631
3664
|
}
|
|
@@ -3652,7 +3685,7 @@
|
|
|
3652
3685
|
body: TSON.stringify(syncRequest)
|
|
3653
3686
|
})];
|
|
3654
3687
|
case 2:
|
|
3655
|
-
res =
|
|
3688
|
+
res = _o.sent();
|
|
3656
3689
|
//const contentLength = Number(res.headers.get('content-length'));
|
|
3657
3690
|
db.syncStateChangedEvent.next({
|
|
3658
3691
|
phase: 'pulling'
|
|
@@ -3660,20 +3693,20 @@
|
|
|
3660
3693
|
if (!res.ok) {
|
|
3661
3694
|
throw new HttpError(res);
|
|
3662
3695
|
}
|
|
3663
|
-
|
|
3664
|
-
switch (
|
|
3696
|
+
_k = res.headers.get('content-type');
|
|
3697
|
+
switch (_k) {
|
|
3665
3698
|
case 'application/x-bison': return [3 /*break*/, 3];
|
|
3666
3699
|
case 'application/x-bison-stream': return [3 /*break*/, 5];
|
|
3667
3700
|
case 'application/json': return [3 /*break*/, 5];
|
|
3668
3701
|
}
|
|
3669
3702
|
return [3 /*break*/, 5];
|
|
3670
3703
|
case 3:
|
|
3671
|
-
|
|
3704
|
+
_m = (_l = BISON).fromBinary;
|
|
3672
3705
|
return [4 /*yield*/, res.blob()];
|
|
3673
|
-
case 4: return [2 /*return*/,
|
|
3706
|
+
case 4: return [2 /*return*/, _m.apply(_l, [_o.sent()])];
|
|
3674
3707
|
case 5: return [4 /*yield*/, res.text()];
|
|
3675
3708
|
case 6:
|
|
3676
|
-
text =
|
|
3709
|
+
text = _o.sent();
|
|
3677
3710
|
syncRes = TSON.parse(text);
|
|
3678
3711
|
return [2 /*return*/, syncRes];
|
|
3679
3712
|
}
|
|
@@ -3682,16 +3715,16 @@
|
|
|
3682
3715
|
}
|
|
3683
3716
|
function modifyLocalObjectsWithNewUserId(syncifiedTables, currentUser, alreadySyncedRealms) {
|
|
3684
3717
|
return __awaiter$1(this, void 0, void 0, function () {
|
|
3685
|
-
var ignoredRealms,
|
|
3686
|
-
return __generator$1(this, function (
|
|
3687
|
-
switch (
|
|
3718
|
+
var ignoredRealms, _k, syncifiedTables_1, table;
|
|
3719
|
+
return __generator$1(this, function (_l) {
|
|
3720
|
+
switch (_l.label) {
|
|
3688
3721
|
case 0:
|
|
3689
3722
|
ignoredRealms = new Set(alreadySyncedRealms || []);
|
|
3690
|
-
|
|
3691
|
-
|
|
3723
|
+
_k = 0, syncifiedTables_1 = syncifiedTables;
|
|
3724
|
+
_l.label = 1;
|
|
3692
3725
|
case 1:
|
|
3693
|
-
if (!(
|
|
3694
|
-
table = syncifiedTables_1[
|
|
3726
|
+
if (!(_k < syncifiedTables_1.length)) return [3 /*break*/, 9];
|
|
3727
|
+
table = syncifiedTables_1[_k];
|
|
3695
3728
|
if (!(table.name === "members")) return [3 /*break*/, 3];
|
|
3696
3729
|
// members
|
|
3697
3730
|
return [4 /*yield*/, table.toCollection().modify(function (member) {
|
|
@@ -3701,7 +3734,7 @@
|
|
|
3701
3734
|
})];
|
|
3702
3735
|
case 2:
|
|
3703
3736
|
// members
|
|
3704
|
-
|
|
3737
|
+
_l.sent();
|
|
3705
3738
|
return [3 /*break*/, 8];
|
|
3706
3739
|
case 3:
|
|
3707
3740
|
if (!(table.name === "roles")) return [3 /*break*/, 4];
|
|
@@ -3716,7 +3749,7 @@
|
|
|
3716
3749
|
})];
|
|
3717
3750
|
case 5:
|
|
3718
3751
|
// realms
|
|
3719
|
-
|
|
3752
|
+
_l.sent();
|
|
3720
3753
|
return [3 /*break*/, 8];
|
|
3721
3754
|
case 6:
|
|
3722
3755
|
// application entities
|
|
@@ -3731,10 +3764,10 @@
|
|
|
3731
3764
|
})];
|
|
3732
3765
|
case 7:
|
|
3733
3766
|
// application entities
|
|
3734
|
-
|
|
3735
|
-
|
|
3767
|
+
_l.sent();
|
|
3768
|
+
_l.label = 8;
|
|
3736
3769
|
case 8:
|
|
3737
|
-
|
|
3770
|
+
_k++;
|
|
3738
3771
|
return [3 /*break*/, 1];
|
|
3739
3772
|
case 9: return [2 /*return*/];
|
|
3740
3773
|
}
|
|
@@ -3754,8 +3787,8 @@
|
|
|
3754
3787
|
self.addEventListener('offline', function () { return isOnline = false; });
|
|
3755
3788
|
function updateBaseRevs(db, schema, latestRevisions, serverRev) {
|
|
3756
3789
|
return __awaiter$1(this, void 0, void 0, function () {
|
|
3757
|
-
return __generator$1(this, function (
|
|
3758
|
-
switch (
|
|
3790
|
+
return __generator$1(this, function (_k) {
|
|
3791
|
+
switch (_k.label) {
|
|
3759
3792
|
case 0: return [4 /*yield*/, db.$baseRevs.bulkPut(Object.keys(schema)
|
|
3760
3793
|
.filter(function (table) { return schema[table].markedForSync; })
|
|
3761
3794
|
.map(function (tableName) {
|
|
@@ -3767,7 +3800,7 @@
|
|
|
3767
3800
|
};
|
|
3768
3801
|
}))];
|
|
3769
3802
|
case 1:
|
|
3770
|
-
|
|
3803
|
+
_k.sent();
|
|
3771
3804
|
return [2 /*return*/];
|
|
3772
3805
|
}
|
|
3773
3806
|
});
|
|
@@ -3775,8 +3808,8 @@
|
|
|
3775
3808
|
}
|
|
3776
3809
|
function getLatestRevisionsPerTable(clientChangeSet, lastRevisions) {
|
|
3777
3810
|
if (lastRevisions === void 0) { lastRevisions = {}; }
|
|
3778
|
-
for (var
|
|
3779
|
-
var
|
|
3811
|
+
for (var _k = 0, clientChangeSet_1 = clientChangeSet; _k < clientChangeSet_1.length; _k++) {
|
|
3812
|
+
var _l = clientChangeSet_1[_k], table = _l.table, muts = _l.muts;
|
|
3780
3813
|
var lastRev = muts.length > 0 ? muts[muts.length - 1].rev : null;
|
|
3781
3814
|
lastRevisions[table] = lastRev || lastRevisions[table] || 0;
|
|
3782
3815
|
}
|
|
@@ -3785,18 +3818,18 @@
|
|
|
3785
3818
|
function bulkUpdate(table, keys, changeSpecs) {
|
|
3786
3819
|
return __awaiter$1(this, void 0, void 0, function () {
|
|
3787
3820
|
var objs, resultKeys, resultObjs;
|
|
3788
|
-
return __generator$1(this, function (
|
|
3789
|
-
switch (
|
|
3821
|
+
return __generator$1(this, function (_k) {
|
|
3822
|
+
switch (_k.label) {
|
|
3790
3823
|
case 0: return [4 /*yield*/, table.bulkGet(keys)];
|
|
3791
3824
|
case 1:
|
|
3792
|
-
objs =
|
|
3825
|
+
objs = _k.sent();
|
|
3793
3826
|
resultKeys = [];
|
|
3794
3827
|
resultObjs = [];
|
|
3795
3828
|
keys.forEach(function (key, idx) {
|
|
3796
3829
|
var obj = objs[idx];
|
|
3797
3830
|
if (obj) {
|
|
3798
|
-
for (var
|
|
3799
|
-
var
|
|
3831
|
+
for (var _k = 0, _l = Object.entries(changeSpecs[idx]); _k < _l.length; _k++) {
|
|
3832
|
+
var _m = _l[_k], keyPath = _m[0], value = _m[1];
|
|
3800
3833
|
if (keyPath === table.schema.primKey.keyPath) {
|
|
3801
3834
|
if (Dexie.cmp(value, key) !== 0) {
|
|
3802
3835
|
throw new Error("Cannot change primary key");
|
|
@@ -3814,7 +3847,7 @@
|
|
|
3814
3847
|
? table.bulkPut(resultObjs, resultKeys)
|
|
3815
3848
|
: table.bulkPut(resultObjs))];
|
|
3816
3849
|
case 2:
|
|
3817
|
-
|
|
3850
|
+
_k.sent();
|
|
3818
3851
|
return [2 /*return*/];
|
|
3819
3852
|
}
|
|
3820
3853
|
});
|
|
@@ -3822,15 +3855,15 @@
|
|
|
3822
3855
|
}
|
|
3823
3856
|
function applyServerChanges(changes, db) {
|
|
3824
3857
|
return __awaiter$1(this, void 0, void 0, function () {
|
|
3825
|
-
var _loop_3,
|
|
3826
|
-
return __generator$1(this, function (
|
|
3827
|
-
switch (
|
|
3858
|
+
var _loop_3, _k, changes_2, _l, tableName, muts;
|
|
3859
|
+
return __generator$1(this, function (_m) {
|
|
3860
|
+
switch (_m.label) {
|
|
3828
3861
|
case 0:
|
|
3829
3862
|
console.debug('Applying server changes', changes, Dexie__default["default"].currentTransaction);
|
|
3830
3863
|
_loop_3 = function (tableName, muts) {
|
|
3831
|
-
var table, primaryKey, keyDecoder, _loop_4,
|
|
3832
|
-
return __generator$1(this, function (
|
|
3833
|
-
switch (
|
|
3864
|
+
var table, primaryKey, keyDecoder, _loop_4, _o, muts_2, mut;
|
|
3865
|
+
return __generator$1(this, function (_p) {
|
|
3866
|
+
switch (_p.label) {
|
|
3834
3867
|
case 0:
|
|
3835
3868
|
table = db.table(tableName);
|
|
3836
3869
|
if (!table)
|
|
@@ -3845,7 +3878,7 @@
|
|
|
3845
3878
|
// On server, array keys are transformed to JSON string representation
|
|
3846
3879
|
return JSON.parse(key);
|
|
3847
3880
|
}
|
|
3848
|
-
catch (
|
|
3881
|
+
catch (_a) { }
|
|
3849
3882
|
return key;
|
|
3850
3883
|
case '#':
|
|
3851
3884
|
// Decode private ID (do the opposite from what's done in encodeIdsForServer())
|
|
@@ -3858,13 +3891,13 @@
|
|
|
3858
3891
|
}
|
|
3859
3892
|
};
|
|
3860
3893
|
_loop_4 = function (mut) {
|
|
3861
|
-
var keys,
|
|
3862
|
-
return __generator$1(this, function (
|
|
3863
|
-
switch (
|
|
3894
|
+
var keys, _q;
|
|
3895
|
+
return __generator$1(this, function (_r) {
|
|
3896
|
+
switch (_r.label) {
|
|
3864
3897
|
case 0:
|
|
3865
3898
|
keys = mut.keys.map(keyDecoder);
|
|
3866
|
-
|
|
3867
|
-
switch (
|
|
3899
|
+
_q = mut.type;
|
|
3900
|
+
switch (_q) {
|
|
3868
3901
|
case 'insert': return [3 /*break*/, 1];
|
|
3869
3902
|
case 'upsert': return [3 /*break*/, 6];
|
|
3870
3903
|
case 'modify': return [3 /*break*/, 11];
|
|
@@ -3876,7 +3909,7 @@
|
|
|
3876
3909
|
if (!primaryKey.outbound) return [3 /*break*/, 3];
|
|
3877
3910
|
return [4 /*yield*/, table.bulkAdd(mut.values, keys)];
|
|
3878
3911
|
case 2:
|
|
3879
|
-
|
|
3912
|
+
_r.sent();
|
|
3880
3913
|
return [3 /*break*/, 5];
|
|
3881
3914
|
case 3:
|
|
3882
3915
|
keys.forEach(function (key, i) {
|
|
@@ -3885,14 +3918,14 @@
|
|
|
3885
3918
|
});
|
|
3886
3919
|
return [4 /*yield*/, table.bulkAdd(mut.values)];
|
|
3887
3920
|
case 4:
|
|
3888
|
-
|
|
3889
|
-
|
|
3921
|
+
_r.sent();
|
|
3922
|
+
_r.label = 5;
|
|
3890
3923
|
case 5: return [3 /*break*/, 20];
|
|
3891
3924
|
case 6:
|
|
3892
3925
|
if (!primaryKey.outbound) return [3 /*break*/, 8];
|
|
3893
3926
|
return [4 /*yield*/, table.bulkPut(mut.values, keys)];
|
|
3894
3927
|
case 7:
|
|
3895
|
-
|
|
3928
|
+
_r.sent();
|
|
3896
3929
|
return [3 /*break*/, 10];
|
|
3897
3930
|
case 8:
|
|
3898
3931
|
keys.forEach(function (key, i) {
|
|
@@ -3901,59 +3934,59 @@
|
|
|
3901
3934
|
});
|
|
3902
3935
|
return [4 /*yield*/, table.bulkPut(mut.values)];
|
|
3903
3936
|
case 9:
|
|
3904
|
-
|
|
3905
|
-
|
|
3937
|
+
_r.sent();
|
|
3938
|
+
_r.label = 10;
|
|
3906
3939
|
case 10: return [3 /*break*/, 20];
|
|
3907
3940
|
case 11:
|
|
3908
3941
|
if (!(keys.length === 1)) return [3 /*break*/, 13];
|
|
3909
3942
|
return [4 /*yield*/, table.update(keys[0], mut.changeSpec)];
|
|
3910
3943
|
case 12:
|
|
3911
|
-
|
|
3944
|
+
_r.sent();
|
|
3912
3945
|
return [3 /*break*/, 15];
|
|
3913
3946
|
case 13: return [4 /*yield*/, table.where(':id').anyOf(keys).modify(mut.changeSpec)];
|
|
3914
3947
|
case 14:
|
|
3915
|
-
|
|
3916
|
-
|
|
3948
|
+
_r.sent();
|
|
3949
|
+
_r.label = 15;
|
|
3917
3950
|
case 15: return [3 /*break*/, 20];
|
|
3918
3951
|
case 16: return [4 /*yield*/, bulkUpdate(table, keys, mut.changeSpecs)];
|
|
3919
3952
|
case 17:
|
|
3920
|
-
|
|
3953
|
+
_r.sent();
|
|
3921
3954
|
return [3 /*break*/, 20];
|
|
3922
3955
|
case 18: return [4 /*yield*/, table.bulkDelete(keys)];
|
|
3923
3956
|
case 19:
|
|
3924
|
-
|
|
3957
|
+
_r.sent();
|
|
3925
3958
|
return [3 /*break*/, 20];
|
|
3926
3959
|
case 20: return [2 /*return*/];
|
|
3927
3960
|
}
|
|
3928
3961
|
});
|
|
3929
3962
|
};
|
|
3930
|
-
|
|
3931
|
-
|
|
3963
|
+
_o = 0, muts_2 = muts;
|
|
3964
|
+
_p.label = 1;
|
|
3932
3965
|
case 1:
|
|
3933
|
-
if (!(
|
|
3934
|
-
mut = muts_2[
|
|
3966
|
+
if (!(_o < muts_2.length)) return [3 /*break*/, 4];
|
|
3967
|
+
mut = muts_2[_o];
|
|
3935
3968
|
return [5 /*yield**/, _loop_4(mut)];
|
|
3936
3969
|
case 2:
|
|
3937
|
-
|
|
3938
|
-
|
|
3970
|
+
_p.sent();
|
|
3971
|
+
_p.label = 3;
|
|
3939
3972
|
case 3:
|
|
3940
|
-
|
|
3973
|
+
_o++;
|
|
3941
3974
|
return [3 /*break*/, 1];
|
|
3942
3975
|
case 4: return [2 /*return*/];
|
|
3943
3976
|
}
|
|
3944
3977
|
});
|
|
3945
3978
|
};
|
|
3946
|
-
|
|
3947
|
-
|
|
3979
|
+
_k = 0, changes_2 = changes;
|
|
3980
|
+
_m.label = 1;
|
|
3948
3981
|
case 1:
|
|
3949
|
-
if (!(
|
|
3950
|
-
|
|
3982
|
+
if (!(_k < changes_2.length)) return [3 /*break*/, 4];
|
|
3983
|
+
_l = changes_2[_k], tableName = _l.table, muts = _l.muts;
|
|
3951
3984
|
return [5 /*yield**/, _loop_3(tableName, muts)];
|
|
3952
3985
|
case 2:
|
|
3953
|
-
|
|
3954
|
-
|
|
3986
|
+
_m.sent();
|
|
3987
|
+
_m.label = 3;
|
|
3955
3988
|
case 3:
|
|
3956
|
-
|
|
3989
|
+
_k++;
|
|
3957
3990
|
return [3 /*break*/, 1];
|
|
3958
3991
|
case 4: return [2 /*return*/];
|
|
3959
3992
|
}
|
|
@@ -3973,8 +4006,8 @@
|
|
|
3973
4006
|
}
|
|
3974
4007
|
})
|
|
3975
4008
|
.catch(function (error) { return __awaiter$1(_this_1, void 0, void 0, function () {
|
|
3976
|
-
return __generator$1(this, function (
|
|
3977
|
-
switch (
|
|
4009
|
+
return __generator$1(this, function (_k) {
|
|
4010
|
+
switch (_k.label) {
|
|
3978
4011
|
case 0:
|
|
3979
4012
|
if (syncOptions === null || syncOptions === void 0 ? void 0 : syncOptions.justCheckIfNeeded)
|
|
3980
4013
|
return [2 /*return*/, Promise.reject(error)]; // Just rethrow.
|
|
@@ -3995,9 +4028,9 @@
|
|
|
3995
4028
|
return [4 /*yield*/, new Promise(function (resolve) { return setTimeout(resolve, 500); })];
|
|
3996
4029
|
case 1:
|
|
3997
4030
|
// Retry again in 500 ms but if it fails again, don't retry.
|
|
3998
|
-
|
|
3999
|
-
return [4 /*yield*/, sync(db, options, schema,
|
|
4000
|
-
case 2: return [2 /*return*/,
|
|
4031
|
+
_k.sent();
|
|
4032
|
+
return [4 /*yield*/, sync(db, options, schema, Object.assign(Object.assign({}, syncOptions), { retryImmediatelyOnFetchError: false }))];
|
|
4033
|
+
case 2: return [2 /*return*/, _k.sent()];
|
|
4001
4034
|
case 3:
|
|
4002
4035
|
// Make sure that no matter whether sync() explodes or not,
|
|
4003
4036
|
// always update the timestamp. Also store the error.
|
|
@@ -4008,7 +4041,7 @@
|
|
|
4008
4041
|
case 4:
|
|
4009
4042
|
// Make sure that no matter whether sync() explodes or not,
|
|
4010
4043
|
// always update the timestamp. Also store the error.
|
|
4011
|
-
|
|
4044
|
+
_k.sent();
|
|
4012
4045
|
db.syncStateChangedEvent.next({
|
|
4013
4046
|
phase: isOnline ? 'error' : 'offline',
|
|
4014
4047
|
error: error,
|
|
@@ -4018,31 +4051,31 @@
|
|
|
4018
4051
|
});
|
|
4019
4052
|
}); });
|
|
4020
4053
|
}
|
|
4021
|
-
function _sync(db, options, schema,
|
|
4022
|
-
var
|
|
4023
|
-
var _g = _e === void 0 ? {
|
|
4054
|
+
function _sync(db, options, schema, _k) {
|
|
4055
|
+
var _l = _k === void 0 ? {
|
|
4024
4056
|
isInitialSync: false,
|
|
4025
|
-
} :
|
|
4057
|
+
} : _k, isInitialSync = _l.isInitialSync, cancelToken = _l.cancelToken, justCheckIfNeeded = _l.justCheckIfNeeded, purpose = _l.purpose;
|
|
4058
|
+
var _a;
|
|
4026
4059
|
return __awaiter$1(this, void 0, void 0, function () {
|
|
4027
|
-
var databaseUrl, currentUser, tablesToSync, mutationTables, persistedSyncState, tablesToSyncify, doSyncify,
|
|
4060
|
+
var databaseUrl, currentUser, tablesToSync, mutationTables, persistedSyncState, tablesToSyncify, doSyncify, _k, clientChangeSet, syncState, baseRevs, syncIsNeeded, latestRevisions, clientIdentity, res, done;
|
|
4028
4061
|
var _this_1 = this;
|
|
4029
|
-
return __generator$1(this, function (
|
|
4030
|
-
switch (
|
|
4062
|
+
return __generator$1(this, function (_l) {
|
|
4063
|
+
switch (_l.label) {
|
|
4031
4064
|
case 0:
|
|
4032
4065
|
if (!justCheckIfNeeded) {
|
|
4033
4066
|
console.debug('SYNC STARTED', { isInitialSync: isInitialSync, purpose: purpose });
|
|
4034
4067
|
}
|
|
4035
|
-
if (!((
|
|
4068
|
+
if (!((_a = db.cloud.options) === null || _a === void 0 ? void 0 : _a.databaseUrl))
|
|
4036
4069
|
throw new Error("Internal error: sync must not be called when no databaseUrl is configured");
|
|
4037
4070
|
databaseUrl = options.databaseUrl;
|
|
4038
4071
|
return [4 /*yield*/, db.getCurrentUser()];
|
|
4039
4072
|
case 1:
|
|
4040
|
-
currentUser =
|
|
4073
|
+
currentUser = _l.sent();
|
|
4041
4074
|
tablesToSync = currentUser.isLoggedIn ? getSyncableTables(db) : [];
|
|
4042
4075
|
mutationTables = tablesToSync.map(function (tbl) { return db.table(getMutationTable(tbl.name)); });
|
|
4043
4076
|
return [4 /*yield*/, db.getPersistedSyncState()];
|
|
4044
4077
|
case 2:
|
|
4045
|
-
persistedSyncState =
|
|
4078
|
+
persistedSyncState = _l.sent();
|
|
4046
4079
|
tablesToSyncify = !isInitialSync && currentUser.isLoggedIn
|
|
4047
4080
|
? getTablesToSyncify(db, persistedSyncState)
|
|
4048
4081
|
: [];
|
|
@@ -4053,8 +4086,8 @@
|
|
|
4053
4086
|
return [2 /*return*/, true];
|
|
4054
4087
|
//console.debug('sync doSyncify is true');
|
|
4055
4088
|
return [4 /*yield*/, db.transaction('rw', tablesToSyncify, function (tx) { return __awaiter$1(_this_1, void 0, void 0, function () {
|
|
4056
|
-
return __generator$1(this, function (
|
|
4057
|
-
switch (
|
|
4089
|
+
return __generator$1(this, function (_k) {
|
|
4090
|
+
switch (_k.label) {
|
|
4058
4091
|
case 0:
|
|
4059
4092
|
// @ts-ignore
|
|
4060
4093
|
tx.idbtrans.disableChangeTracking = true;
|
|
@@ -4062,35 +4095,35 @@
|
|
|
4062
4095
|
tx.idbtrans.disableAccessControl = true; // TODO: Take care of this flag in access control middleware!
|
|
4063
4096
|
return [4 /*yield*/, modifyLocalObjectsWithNewUserId(tablesToSyncify, currentUser, persistedSyncState === null || persistedSyncState === void 0 ? void 0 : persistedSyncState.realms)];
|
|
4064
4097
|
case 1:
|
|
4065
|
-
|
|
4098
|
+
_k.sent();
|
|
4066
4099
|
return [2 /*return*/];
|
|
4067
4100
|
}
|
|
4068
4101
|
});
|
|
4069
4102
|
}); })];
|
|
4070
4103
|
case 3:
|
|
4071
4104
|
//console.debug('sync doSyncify is true');
|
|
4072
|
-
|
|
4105
|
+
_l.sent();
|
|
4073
4106
|
throwIfCancelled(cancelToken);
|
|
4074
|
-
|
|
4107
|
+
_l.label = 4;
|
|
4075
4108
|
case 4: return [4 /*yield*/, db.transaction('r', db.tables, function () { return __awaiter$1(_this_1, void 0, void 0, function () {
|
|
4076
4109
|
var syncState, baseRevs, clientChanges, alreadySyncedRealms, syncificationInserts;
|
|
4077
|
-
return __generator$1(this, function (
|
|
4078
|
-
switch (
|
|
4110
|
+
return __generator$1(this, function (_k) {
|
|
4111
|
+
switch (_k.label) {
|
|
4079
4112
|
case 0: return [4 /*yield*/, db.getPersistedSyncState()];
|
|
4080
4113
|
case 1:
|
|
4081
|
-
syncState =
|
|
4114
|
+
syncState = _k.sent();
|
|
4082
4115
|
return [4 /*yield*/, db.$baseRevs.toArray()];
|
|
4083
4116
|
case 2:
|
|
4084
|
-
baseRevs =
|
|
4117
|
+
baseRevs = _k.sent();
|
|
4085
4118
|
return [4 /*yield*/, listClientChanges(mutationTables)];
|
|
4086
4119
|
case 3:
|
|
4087
|
-
clientChanges =
|
|
4120
|
+
clientChanges = _k.sent();
|
|
4088
4121
|
throwIfCancelled(cancelToken);
|
|
4089
4122
|
if (!doSyncify) return [3 /*break*/, 5];
|
|
4090
4123
|
alreadySyncedRealms = __spreadArray$1(__spreadArray$1([], ((persistedSyncState === null || persistedSyncState === void 0 ? void 0 : persistedSyncState.realms) || []), true), ((persistedSyncState === null || persistedSyncState === void 0 ? void 0 : persistedSyncState.inviteRealms) || []), true);
|
|
4091
4124
|
return [4 /*yield*/, listSyncifiedChanges(tablesToSyncify, currentUser, schema, alreadySyncedRealms)];
|
|
4092
4125
|
case 4:
|
|
4093
|
-
syncificationInserts =
|
|
4126
|
+
syncificationInserts = _k.sent();
|
|
4094
4127
|
throwIfCancelled(cancelToken);
|
|
4095
4128
|
clientChanges = clientChanges.concat(syncificationInserts);
|
|
4096
4129
|
return [2 /*return*/, [clientChanges, syncState, baseRevs]];
|
|
@@ -4099,7 +4132,7 @@
|
|
|
4099
4132
|
});
|
|
4100
4133
|
}); })];
|
|
4101
4134
|
case 5:
|
|
4102
|
-
|
|
4135
|
+
_k = _l.sent(), clientChangeSet = _k[0], syncState = _k[1], baseRevs = _k[2];
|
|
4103
4136
|
syncIsNeeded = clientChangeSet.some(function (set) { return set.muts.some(function (mut) { return mut.keys.length > 0; }); });
|
|
4104
4137
|
if (justCheckIfNeeded) {
|
|
4105
4138
|
console.debug('Sync is needed:', syncIsNeeded);
|
|
@@ -4117,12 +4150,12 @@
|
|
|
4117
4150
|
throwIfCancelled(cancelToken);
|
|
4118
4151
|
return [4 /*yield*/, syncWithServer(clientChangeSet, syncState, baseRevs, db, databaseUrl, schema, clientIdentity, currentUser)];
|
|
4119
4152
|
case 6:
|
|
4120
|
-
res =
|
|
4153
|
+
res = _l.sent();
|
|
4121
4154
|
console.debug('Sync response', res);
|
|
4122
4155
|
return [4 /*yield*/, db.transaction('rw', db.tables, function (tx) { return __awaiter$1(_this_1, void 0, void 0, function () {
|
|
4123
|
-
var
|
|
4124
|
-
return __generator$1(this, function (
|
|
4125
|
-
switch (
|
|
4156
|
+
var _k, _l, tableName, addedClientChanges, _loop_5, _m, mutationTables_1, mutTable, syncState, newSyncState, filteredChanges;
|
|
4157
|
+
return __generator$1(this, function (_o) {
|
|
4158
|
+
switch (_o.label) {
|
|
4126
4159
|
case 0:
|
|
4127
4160
|
// @ts-ignore
|
|
4128
4161
|
tx.idbtrans.disableChangeTracking = true;
|
|
@@ -4130,8 +4163,8 @@
|
|
|
4130
4163
|
tx.idbtrans.disableAccessControl = true; // TODO: Take care of this flag in access control middleware!
|
|
4131
4164
|
// Update db.cloud.schema from server response.
|
|
4132
4165
|
// Local schema MAY include a subset of tables, so do not force all tables into local schema.
|
|
4133
|
-
for (
|
|
4134
|
-
tableName =
|
|
4166
|
+
for (_k = 0, _l = Object.keys(schema); _k < _l.length; _k++) {
|
|
4167
|
+
tableName = _l[_k];
|
|
4135
4168
|
if (res.schema[tableName]) {
|
|
4136
4169
|
// Write directly into configured schema. This code can only be executed alone.
|
|
4137
4170
|
schema[tableName] = res.schema[tableName];
|
|
@@ -4139,16 +4172,16 @@
|
|
|
4139
4172
|
}
|
|
4140
4173
|
return [4 /*yield*/, db.$syncState.put(schema, 'schema')];
|
|
4141
4174
|
case 1:
|
|
4142
|
-
|
|
4175
|
+
_o.sent();
|
|
4143
4176
|
return [4 /*yield*/, listClientChanges(mutationTables, db, {
|
|
4144
4177
|
since: latestRevisions,
|
|
4145
4178
|
})];
|
|
4146
4179
|
case 2:
|
|
4147
|
-
addedClientChanges =
|
|
4180
|
+
addedClientChanges = _o.sent();
|
|
4148
4181
|
_loop_5 = function (mutTable) {
|
|
4149
4182
|
var tableName, latestRev;
|
|
4150
|
-
return __generator$1(this, function (
|
|
4151
|
-
switch (
|
|
4183
|
+
return __generator$1(this, function (_p) {
|
|
4184
|
+
switch (_p.label) {
|
|
4152
4185
|
case 0:
|
|
4153
4186
|
tableName = getTableFromMutationTable(mutTable.name);
|
|
4154
4187
|
if (!!addedClientChanges.some(function (ch) { return ch.table === tableName && ch.muts.length > 0; })) return [3 /*break*/, 2];
|
|
@@ -4165,7 +4198,7 @@
|
|
|
4165
4198
|
// to the server.
|
|
4166
4199
|
// It is therefore safe to clear all changes (which is faster than
|
|
4167
4200
|
// deleting a range)
|
|
4168
|
-
|
|
4201
|
+
_p.sent();
|
|
4169
4202
|
return [3 /*break*/, 5];
|
|
4170
4203
|
case 2:
|
|
4171
4204
|
if (!latestRevisions[tableName]) return [3 /*break*/, 4];
|
|
@@ -4180,25 +4213,25 @@
|
|
|
4180
4213
|
.delete(),
|
|
4181
4214
|
])];
|
|
4182
4215
|
case 3:
|
|
4183
|
-
|
|
4216
|
+
_p.sent();
|
|
4184
4217
|
return [3 /*break*/, 5];
|
|
4185
4218
|
case 4:
|
|
4186
|
-
|
|
4219
|
+
_p.label = 5;
|
|
4187
4220
|
case 5: return [2 /*return*/];
|
|
4188
4221
|
}
|
|
4189
4222
|
});
|
|
4190
4223
|
};
|
|
4191
|
-
|
|
4192
|
-
|
|
4224
|
+
_m = 0, mutationTables_1 = mutationTables;
|
|
4225
|
+
_o.label = 3;
|
|
4193
4226
|
case 3:
|
|
4194
|
-
if (!(
|
|
4195
|
-
mutTable = mutationTables_1[
|
|
4227
|
+
if (!(_m < mutationTables_1.length)) return [3 /*break*/, 6];
|
|
4228
|
+
mutTable = mutationTables_1[_m];
|
|
4196
4229
|
return [5 /*yield**/, _loop_5(mutTable)];
|
|
4197
4230
|
case 4:
|
|
4198
|
-
|
|
4199
|
-
|
|
4231
|
+
_o.sent();
|
|
4232
|
+
_o.label = 5;
|
|
4200
4233
|
case 5:
|
|
4201
|
-
|
|
4234
|
+
_m++;
|
|
4202
4235
|
return [3 /*break*/, 3];
|
|
4203
4236
|
case 6:
|
|
4204
4237
|
// Update latestRevisions object according to additional changes:
|
|
@@ -4221,10 +4254,10 @@
|
|
|
4221
4254
|
// The purpose of this operation is to mark a start revision (per table)
|
|
4222
4255
|
// so that all client-mutations that come after this, will be mapped to current
|
|
4223
4256
|
// server revision.
|
|
4224
|
-
|
|
4257
|
+
_o.sent();
|
|
4225
4258
|
return [4 /*yield*/, db.getPersistedSyncState()];
|
|
4226
4259
|
case 8:
|
|
4227
|
-
syncState =
|
|
4260
|
+
syncState = _o.sent();
|
|
4228
4261
|
//
|
|
4229
4262
|
// Delete objects from removed realms
|
|
4230
4263
|
//
|
|
@@ -4233,7 +4266,7 @@
|
|
|
4233
4266
|
//
|
|
4234
4267
|
// Delete objects from removed realms
|
|
4235
4268
|
//
|
|
4236
|
-
|
|
4269
|
+
_o.sent();
|
|
4237
4270
|
newSyncState = syncState || {
|
|
4238
4271
|
syncedTables: [],
|
|
4239
4272
|
latestRevisions: {},
|
|
@@ -4261,7 +4294,7 @@
|
|
|
4261
4294
|
//
|
|
4262
4295
|
// apply server changes
|
|
4263
4296
|
//
|
|
4264
|
-
|
|
4297
|
+
_o.sent();
|
|
4265
4298
|
//
|
|
4266
4299
|
// Update syncState
|
|
4267
4300
|
//
|
|
@@ -4271,11 +4304,11 @@
|
|
|
4271
4304
|
});
|
|
4272
4305
|
}); })];
|
|
4273
4306
|
case 7:
|
|
4274
|
-
done =
|
|
4307
|
+
done = _l.sent();
|
|
4275
4308
|
if (!!done) return [3 /*break*/, 9];
|
|
4276
4309
|
console.debug('MORE SYNC NEEDED. Go for it again!');
|
|
4277
4310
|
return [4 /*yield*/, _sync(db, options, schema, { isInitialSync: isInitialSync, cancelToken: cancelToken })];
|
|
4278
|
-
case 8: return [2 /*return*/,
|
|
4311
|
+
case 8: return [2 /*return*/, _l.sent()];
|
|
4279
4312
|
case 9:
|
|
4280
4313
|
console.debug('SYNC DONE', { isInitialSync: isInitialSync });
|
|
4281
4314
|
return [2 /*return*/, false]; // Not needed anymore
|
|
@@ -4285,9 +4318,9 @@
|
|
|
4285
4318
|
}
|
|
4286
4319
|
function deleteObjectsFromRemovedRealms(db, res, prevState) {
|
|
4287
4320
|
return __awaiter$1(this, void 0, void 0, function () {
|
|
4288
|
-
var deletedRealms, rejectedRealms, previousRealmSet, previousInviteRealmSet, updatedRealmSet, updatedTotalRealmSet,
|
|
4289
|
-
return __generator$1(this, function (
|
|
4290
|
-
switch (
|
|
4321
|
+
var deletedRealms, rejectedRealms, previousRealmSet, previousInviteRealmSet, updatedRealmSet, updatedTotalRealmSet, _k, previousRealmSet_1, realmId, _l, _m, realmId, tables, _loop_6, _o, tables_1, table;
|
|
4322
|
+
return __generator$1(this, function (_p) {
|
|
4323
|
+
switch (_p.label) {
|
|
4291
4324
|
case 0:
|
|
4292
4325
|
deletedRealms = new Set();
|
|
4293
4326
|
rejectedRealms = new Set();
|
|
@@ -4295,8 +4328,8 @@
|
|
|
4295
4328
|
previousInviteRealmSet = prevState ? prevState.inviteRealms : [];
|
|
4296
4329
|
updatedRealmSet = new Set(res.realms);
|
|
4297
4330
|
updatedTotalRealmSet = new Set(res.realms.concat(res.inviteRealms));
|
|
4298
|
-
for (
|
|
4299
|
-
realmId = previousRealmSet_1[
|
|
4331
|
+
for (_k = 0, previousRealmSet_1 = previousRealmSet; _k < previousRealmSet_1.length; _k++) {
|
|
4332
|
+
realmId = previousRealmSet_1[_k];
|
|
4300
4333
|
if (!updatedRealmSet.has(realmId)) {
|
|
4301
4334
|
rejectedRealms.add(realmId);
|
|
4302
4335
|
if (!updatedTotalRealmSet.has(realmId)) {
|
|
@@ -4304,8 +4337,8 @@
|
|
|
4304
4337
|
}
|
|
4305
4338
|
}
|
|
4306
4339
|
}
|
|
4307
|
-
for (
|
|
4308
|
-
realmId =
|
|
4340
|
+
for (_l = 0, _m = previousInviteRealmSet.concat(previousRealmSet); _l < _m.length; _l++) {
|
|
4341
|
+
realmId = _m[_l];
|
|
4309
4342
|
if (!updatedTotalRealmSet.has(realmId)) {
|
|
4310
4343
|
deletedRealms.add(realmId);
|
|
4311
4344
|
}
|
|
@@ -4314,8 +4347,8 @@
|
|
|
4314
4347
|
tables = getSyncableTables(db);
|
|
4315
4348
|
_loop_6 = function (table) {
|
|
4316
4349
|
var realmsToDelete;
|
|
4317
|
-
return __generator$1(this, function (
|
|
4318
|
-
switch (
|
|
4350
|
+
return __generator$1(this, function (_q) {
|
|
4351
|
+
switch (_q.label) {
|
|
4319
4352
|
case 0:
|
|
4320
4353
|
realmsToDelete = ['realms', 'members', 'roles'].includes(table.name)
|
|
4321
4354
|
? deletedRealms // These tables should spare rejected ones.
|
|
@@ -4333,7 +4366,7 @@
|
|
|
4333
4366
|
case 1:
|
|
4334
4367
|
// There's an index to use:
|
|
4335
4368
|
//console.debug(`REMOVAL: deleting all ${table.name} where realmId anyOf `, JSON.stringify([...realmsToDelete]));
|
|
4336
|
-
|
|
4369
|
+
_q.sent();
|
|
4337
4370
|
return [3 /*break*/, 4];
|
|
4338
4371
|
case 2:
|
|
4339
4372
|
// No index to use:
|
|
@@ -4344,23 +4377,23 @@
|
|
|
4344
4377
|
case 3:
|
|
4345
4378
|
// No index to use:
|
|
4346
4379
|
//console.debug(`REMOVAL: deleting all ${table.name} where realmId is any of `, JSON.stringify([...realmsToDelete]), realmsToDelete.size);
|
|
4347
|
-
|
|
4348
|
-
|
|
4380
|
+
_q.sent();
|
|
4381
|
+
_q.label = 4;
|
|
4349
4382
|
case 4: return [2 /*return*/];
|
|
4350
4383
|
}
|
|
4351
4384
|
});
|
|
4352
4385
|
};
|
|
4353
|
-
|
|
4354
|
-
|
|
4386
|
+
_o = 0, tables_1 = tables;
|
|
4387
|
+
_p.label = 1;
|
|
4355
4388
|
case 1:
|
|
4356
|
-
if (!(
|
|
4357
|
-
table = tables_1[
|
|
4389
|
+
if (!(_o < tables_1.length)) return [3 /*break*/, 4];
|
|
4390
|
+
table = tables_1[_o];
|
|
4358
4391
|
return [5 /*yield**/, _loop_6(table)];
|
|
4359
4392
|
case 2:
|
|
4360
|
-
|
|
4361
|
-
|
|
4393
|
+
_p.sent();
|
|
4394
|
+
_p.label = 3;
|
|
4362
4395
|
case 3:
|
|
4363
|
-
|
|
4396
|
+
_o++;
|
|
4364
4397
|
return [3 /*break*/, 1];
|
|
4365
4398
|
case 4: return [2 /*return*/];
|
|
4366
4399
|
}
|
|
@@ -4384,8 +4417,8 @@
|
|
|
4384
4417
|
var loopWarning = 0;
|
|
4385
4418
|
var loopDetection = [0, 0, 0, 0, 0, 0, 0, 0, 0, Date.now()];
|
|
4386
4419
|
event.subscribe(function () { return __awaiter$1(_this_1, void 0, void 0, function () {
|
|
4387
|
-
return __generator$1(this, function (
|
|
4388
|
-
switch (
|
|
4420
|
+
return __generator$1(this, function (_k) {
|
|
4421
|
+
switch (_k.label) {
|
|
4389
4422
|
case 0:
|
|
4390
4423
|
if (isWorking)
|
|
4391
4424
|
return [2 /*return*/];
|
|
@@ -4394,12 +4427,12 @@
|
|
|
4394
4427
|
loopDetection.shift();
|
|
4395
4428
|
loopDetection.push(Date.now());
|
|
4396
4429
|
readyToServe.next(false);
|
|
4397
|
-
|
|
4430
|
+
_k.label = 1;
|
|
4398
4431
|
case 1:
|
|
4399
|
-
|
|
4432
|
+
_k.trys.push([1, , 3, 8]);
|
|
4400
4433
|
return [4 /*yield*/, consumeQueue()];
|
|
4401
4434
|
case 2:
|
|
4402
|
-
|
|
4435
|
+
_k.sent();
|
|
4403
4436
|
return [3 /*break*/, 8];
|
|
4404
4437
|
case 3:
|
|
4405
4438
|
if (!(loopDetection[loopDetection.length - 1] - loopDetection[0] <
|
|
@@ -4410,7 +4443,7 @@
|
|
|
4410
4443
|
loopWarning = Date.now() + 60000;
|
|
4411
4444
|
return [4 /*yield*/, new Promise(function (resolve) { return setTimeout(resolve, 60000); })];
|
|
4412
4445
|
case 4:
|
|
4413
|
-
|
|
4446
|
+
_k.sent();
|
|
4414
4447
|
return [3 /*break*/, 7];
|
|
4415
4448
|
case 5:
|
|
4416
4449
|
// This is a one-time event. Just pause 10 seconds.
|
|
@@ -4418,8 +4451,8 @@
|
|
|
4418
4451
|
loopWarning = Date.now() + 10000;
|
|
4419
4452
|
return [4 /*yield*/, new Promise(function (resolve) { return setTimeout(resolve, 10000); })];
|
|
4420
4453
|
case 6:
|
|
4421
|
-
|
|
4422
|
-
|
|
4454
|
+
_k.sent();
|
|
4455
|
+
_k.label = 7;
|
|
4423
4456
|
case 7:
|
|
4424
4457
|
isWorking = false;
|
|
4425
4458
|
readyToServe.next(true);
|
|
@@ -4433,28 +4466,28 @@
|
|
|
4433
4466
|
event.next(null);
|
|
4434
4467
|
}
|
|
4435
4468
|
function consumeQueue() {
|
|
4436
|
-
var
|
|
4469
|
+
var _a, _b, _c;
|
|
4437
4470
|
return __awaiter$1(this, void 0, void 0, function () {
|
|
4438
4471
|
var _loop_7;
|
|
4439
4472
|
var _this_1 = this;
|
|
4440
|
-
return __generator$1(this, function (
|
|
4441
|
-
switch (
|
|
4473
|
+
return __generator$1(this, function (_k) {
|
|
4474
|
+
switch (_k.label) {
|
|
4442
4475
|
case 0:
|
|
4443
4476
|
_loop_7 = function () {
|
|
4444
|
-
var msg, persistedSyncState,
|
|
4445
|
-
return __generator$1(this, function (
|
|
4446
|
-
switch (
|
|
4477
|
+
var msg, persistedSyncState, _l, user, refreshedLogin, error_2;
|
|
4478
|
+
return __generator$1(this, function (_m) {
|
|
4479
|
+
switch (_m.label) {
|
|
4447
4480
|
case 0:
|
|
4448
4481
|
msg = queue.shift();
|
|
4449
|
-
|
|
4482
|
+
_m.label = 1;
|
|
4450
4483
|
case 1:
|
|
4451
|
-
|
|
4484
|
+
_m.trys.push([1, 13, , 14]);
|
|
4452
4485
|
// If the sync worker or service worker is syncing, wait 'til thei're done.
|
|
4453
4486
|
// It's no need to have two channels at the same time - even though it wouldnt
|
|
4454
4487
|
// be a problem - this is an optimization.
|
|
4455
4488
|
return [4 /*yield*/, db.cloud.syncState
|
|
4456
|
-
.pipe(filter(function (
|
|
4457
|
-
var phase =
|
|
4489
|
+
.pipe(filter(function (_k) {
|
|
4490
|
+
var phase = _k.phase;
|
|
4458
4491
|
return phase === 'in-sync' || phase === 'error';
|
|
4459
4492
|
}), take(1))
|
|
4460
4493
|
.toPromise()];
|
|
@@ -4462,14 +4495,14 @@
|
|
|
4462
4495
|
// If the sync worker or service worker is syncing, wait 'til thei're done.
|
|
4463
4496
|
// It's no need to have two channels at the same time - even though it wouldnt
|
|
4464
4497
|
// be a problem - this is an optimization.
|
|
4465
|
-
|
|
4498
|
+
_m.sent();
|
|
4466
4499
|
console.debug('processing msg', msg);
|
|
4467
4500
|
persistedSyncState = db.cloud.persistedSyncState.value;
|
|
4468
4501
|
//syncState.
|
|
4469
4502
|
if (!msg)
|
|
4470
4503
|
return [2 /*return*/, "continue"];
|
|
4471
|
-
|
|
4472
|
-
switch (
|
|
4504
|
+
_l = msg.type;
|
|
4505
|
+
switch (_l) {
|
|
4473
4506
|
case 'token-expired': return [3 /*break*/, 3];
|
|
4474
4507
|
case 'realm-added': return [3 /*break*/, 6];
|
|
4475
4508
|
case 'realm-accepted': return [3 /*break*/, 7];
|
|
@@ -4483,7 +4516,7 @@
|
|
|
4483
4516
|
user = db.cloud.currentUser.value;
|
|
4484
4517
|
return [4 /*yield*/, refreshAccessToken(db.cloud.options.databaseUrl, user)];
|
|
4485
4518
|
case 4:
|
|
4486
|
-
refreshedLogin =
|
|
4519
|
+
refreshedLogin = _m.sent();
|
|
4487
4520
|
// Persist updated access token
|
|
4488
4521
|
return [4 /*yield*/, db.table('$logins').update(user.userId, {
|
|
4489
4522
|
accessToken: refreshedLogin.accessToken,
|
|
@@ -4491,7 +4524,7 @@
|
|
|
4491
4524
|
})];
|
|
4492
4525
|
case 5:
|
|
4493
4526
|
// Persist updated access token
|
|
4494
|
-
|
|
4527
|
+
_m.sent();
|
|
4495
4528
|
// Updating $logins will trigger emission of db.cloud.currentUser observable, which
|
|
4496
4529
|
// in turn will lead to that connectWebSocket.ts will reconnect the socket with the
|
|
4497
4530
|
// new token. So we don't need to do anything more here.
|
|
@@ -4508,8 +4541,8 @@
|
|
|
4508
4541
|
return [3 /*break*/, 12];
|
|
4509
4542
|
case 8:
|
|
4510
4543
|
//if (
|
|
4511
|
-
((
|
|
4512
|
-
((
|
|
4544
|
+
((_a = persistedSyncState === null || persistedSyncState === void 0 ? void 0 : persistedSyncState.realms) === null || _a === void 0 ? void 0 : _a.includes(msg.realm)) ||
|
|
4545
|
+
((_b = persistedSyncState === null || persistedSyncState === void 0 ? void 0 : persistedSyncState.inviteRealms) === null || _b === void 0 ? void 0 : _b.includes(msg.realm));
|
|
4513
4546
|
//) {
|
|
4514
4547
|
triggerSync(db, 'pull');
|
|
4515
4548
|
//}
|
|
@@ -4519,14 +4552,14 @@
|
|
|
4519
4552
|
return [3 /*break*/, 12];
|
|
4520
4553
|
case 10:
|
|
4521
4554
|
console.debug('changes');
|
|
4522
|
-
if (((
|
|
4555
|
+
if (((_c = db.cloud.syncState.value) === null || _c === void 0 ? void 0 : _c.phase) === 'error') {
|
|
4523
4556
|
triggerSync(db, 'pull');
|
|
4524
4557
|
return [3 /*break*/, 12];
|
|
4525
4558
|
}
|
|
4526
4559
|
return [4 /*yield*/, db.transaction('rw', db.dx.tables, function (tx) { return __awaiter$1(_this_1, void 0, void 0, function () {
|
|
4527
|
-
var
|
|
4528
|
-
return __generator$1(this, function (
|
|
4529
|
-
switch (
|
|
4560
|
+
var _k, schema, syncState, currentUser, ourRealmSetHash, clientChanges, mutationTables, filteredChanges;
|
|
4561
|
+
return __generator$1(this, function (_l) {
|
|
4562
|
+
switch (_l.label) {
|
|
4530
4563
|
case 0:
|
|
4531
4564
|
// @ts-ignore
|
|
4532
4565
|
tx.idbtrans.disableChangeTracking = true;
|
|
@@ -4538,7 +4571,7 @@
|
|
|
4538
4571
|
db.getCurrentUser(),
|
|
4539
4572
|
])];
|
|
4540
4573
|
case 1:
|
|
4541
|
-
|
|
4574
|
+
_k = _l.sent(), schema = _k[0], syncState = _k[1], currentUser = _k[2];
|
|
4542
4575
|
console.debug('ws message queue: in transaction');
|
|
4543
4576
|
if (!syncState || !schema || !currentUser) {
|
|
4544
4577
|
console.debug('required vars not present', {
|
|
@@ -4573,7 +4606,7 @@
|
|
|
4573
4606
|
// Keep TX in non-IDB work
|
|
4574
4607
|
computeRealmSetHash(syncState))];
|
|
4575
4608
|
case 2:
|
|
4576
|
-
ourRealmSetHash =
|
|
4609
|
+
ourRealmSetHash = _l.sent();
|
|
4577
4610
|
console.debug('ourRealmSetHash', ourRealmSetHash);
|
|
4578
4611
|
if (ourRealmSetHash !== msg.realmSetHash) {
|
|
4579
4612
|
console.debug('not same realmSetHash', msg.realmSetHash);
|
|
@@ -4587,9 +4620,9 @@
|
|
|
4587
4620
|
mutationTables = getSyncableTables(db).map(function (tbl) { return db.table(getMutationTable(tbl.name)); });
|
|
4588
4621
|
return [4 /*yield*/, listClientChanges(mutationTables)];
|
|
4589
4622
|
case 3:
|
|
4590
|
-
clientChanges =
|
|
4623
|
+
clientChanges = _l.sent();
|
|
4591
4624
|
console.debug('msg queue: client changes', clientChanges);
|
|
4592
|
-
|
|
4625
|
+
_l.label = 4;
|
|
4593
4626
|
case 4:
|
|
4594
4627
|
if (!(msg.changes.length > 0)) return [3 /*break*/, 6];
|
|
4595
4628
|
filteredChanges = filterServerChangesThroughAddedClientChanges(msg.changes, clientChanges);
|
|
@@ -4599,8 +4632,8 @@
|
|
|
4599
4632
|
console.debug('applying filtered server changes', filteredChanges);
|
|
4600
4633
|
return [4 /*yield*/, applyServerChanges(filteredChanges, db)];
|
|
4601
4634
|
case 5:
|
|
4602
|
-
|
|
4603
|
-
|
|
4635
|
+
_l.sent();
|
|
4636
|
+
_l.label = 6;
|
|
4604
4637
|
case 6:
|
|
4605
4638
|
// Update latest revisions per table in case there are unsynced changes
|
|
4606
4639
|
// This can be a real case in future when we allow non-eagery sync.
|
|
@@ -4611,37 +4644,37 @@
|
|
|
4611
4644
|
console.debug('Updating baseRefs', syncState.latestRevisions);
|
|
4612
4645
|
return [4 /*yield*/, updateBaseRevs(db, schema, syncState.latestRevisions, msg.newRev)];
|
|
4613
4646
|
case 7:
|
|
4614
|
-
|
|
4647
|
+
_l.sent();
|
|
4615
4648
|
//
|
|
4616
4649
|
// Update syncState
|
|
4617
4650
|
//
|
|
4618
4651
|
console.debug('Updating syncState', syncState);
|
|
4619
4652
|
return [4 /*yield*/, db.$syncState.put(syncState, 'syncState')];
|
|
4620
4653
|
case 8:
|
|
4621
|
-
|
|
4654
|
+
_l.sent();
|
|
4622
4655
|
return [2 /*return*/];
|
|
4623
4656
|
}
|
|
4624
4657
|
});
|
|
4625
4658
|
}); })];
|
|
4626
4659
|
case 11:
|
|
4627
|
-
|
|
4660
|
+
_m.sent();
|
|
4628
4661
|
console.debug('msg queue: done with rw transaction');
|
|
4629
4662
|
return [3 /*break*/, 12];
|
|
4630
4663
|
case 12: return [3 /*break*/, 14];
|
|
4631
4664
|
case 13:
|
|
4632
|
-
error_2 =
|
|
4665
|
+
error_2 = _m.sent();
|
|
4633
4666
|
console.error("Error in msg queue", error_2);
|
|
4634
4667
|
return [3 /*break*/, 14];
|
|
4635
4668
|
case 14: return [2 /*return*/];
|
|
4636
4669
|
}
|
|
4637
4670
|
});
|
|
4638
4671
|
};
|
|
4639
|
-
|
|
4672
|
+
_k.label = 1;
|
|
4640
4673
|
case 1:
|
|
4641
4674
|
if (!(queue.length > 0)) return [3 /*break*/, 3];
|
|
4642
4675
|
return [5 /*yield**/, _loop_7()];
|
|
4643
4676
|
case 2:
|
|
4644
|
-
|
|
4677
|
+
_k.sent();
|
|
4645
4678
|
return [3 /*break*/, 1];
|
|
4646
4679
|
case 3: return [2 /*return*/];
|
|
4647
4680
|
}
|
|
@@ -4783,10 +4816,10 @@
|
|
|
4783
4816
|
return toString.call(o).slice(8, -1);
|
|
4784
4817
|
}
|
|
4785
4818
|
function getEffectiveKeys(primaryKey, req) {
|
|
4786
|
-
var
|
|
4819
|
+
var _a;
|
|
4787
4820
|
if (req.type === 'delete')
|
|
4788
4821
|
return req.keys;
|
|
4789
|
-
return ((
|
|
4822
|
+
return ((_a = req.keys) === null || _a === void 0 ? void 0 : _a.slice()) || req.values.map(primaryKey.extractKey);
|
|
4790
4823
|
}
|
|
4791
4824
|
function applyToUpperBitFix(orig, bits) {
|
|
4792
4825
|
return ((bits & 1 ? orig[0].toUpperCase() : orig[0].toLowerCase()) +
|
|
@@ -4876,7 +4909,7 @@
|
|
|
4876
4909
|
name: 'idGenerationMiddleware',
|
|
4877
4910
|
level: 1,
|
|
4878
4911
|
create: function (core) {
|
|
4879
|
-
return
|
|
4912
|
+
return Object.assign(Object.assign({}, core), { table: function (tableName) {
|
|
4880
4913
|
var table = core.table(tableName);
|
|
4881
4914
|
function generateOrVerifyAtKeys(req, idPrefix) {
|
|
4882
4915
|
var valueClones = null;
|
|
@@ -4902,17 +4935,17 @@
|
|
|
4902
4935
|
"If you want to generate IDs programmatically, remove '@' from the schema to get rid of this constraint. Dexie Cloud supports custom IDs as long as they are random and globally unique.");
|
|
4903
4936
|
}
|
|
4904
4937
|
});
|
|
4905
|
-
return table.mutate(
|
|
4938
|
+
return table.mutate(Object.assign(Object.assign({}, req), { keys: keys, values: valueClones || req.values }));
|
|
4906
4939
|
}
|
|
4907
|
-
return
|
|
4908
|
-
var
|
|
4940
|
+
return Object.assign(Object.assign({}, table), { mutate: function (req) {
|
|
4941
|
+
var _a, _b;
|
|
4909
4942
|
// @ts-ignore
|
|
4910
4943
|
if (req.trans.disableChangeTracking) {
|
|
4911
4944
|
// Disable ID policy checks and ID generation
|
|
4912
4945
|
return table.mutate(req);
|
|
4913
4946
|
}
|
|
4914
4947
|
if (req.type === 'add' || req.type === 'put') {
|
|
4915
|
-
var cloudTableSchema = (
|
|
4948
|
+
var cloudTableSchema = (_a = db.cloud.schema) === null || _a === void 0 ? void 0 : _a[tableName];
|
|
4916
4949
|
if (!(cloudTableSchema === null || cloudTableSchema === void 0 ? void 0 : cloudTableSchema.generatedGlobalId)) {
|
|
4917
4950
|
if (cloudTableSchema === null || cloudTableSchema === void 0 ? void 0 : cloudTableSchema.markedForSync) {
|
|
4918
4951
|
// Just make sure primary key is of a supported type:
|
|
@@ -4928,7 +4961,7 @@
|
|
|
4928
4961
|
}
|
|
4929
4962
|
}
|
|
4930
4963
|
else {
|
|
4931
|
-
if (((
|
|
4964
|
+
if (((_b = db.cloud.options) === null || _b === void 0 ? void 0 : _b.databaseUrl) && !db.initiallySynced) {
|
|
4932
4965
|
// A database URL is configured but no initial sync has been performed.
|
|
4933
4966
|
var keys_1 = getEffectiveKeys(table.schema.primaryKey, req);
|
|
4934
4967
|
// Check if the operation would yield any INSERT. If so, complain! We never want wrong ID prefixes stored.
|
|
@@ -4960,31 +4993,31 @@
|
|
|
4960
4993
|
name: 'implicitPropSetterMiddleware',
|
|
4961
4994
|
level: 1,
|
|
4962
4995
|
create: function (core) {
|
|
4963
|
-
return
|
|
4996
|
+
return Object.assign(Object.assign({}, core), { table: function (tableName) {
|
|
4964
4997
|
var table = core.table(tableName);
|
|
4965
|
-
return
|
|
4966
|
-
var
|
|
4998
|
+
return Object.assign(Object.assign({}, table), { mutate: function (req) {
|
|
4999
|
+
var _a, _b, _c, _d;
|
|
4967
5000
|
// @ts-ignore
|
|
4968
5001
|
if (req.trans.disableChangeTracking) {
|
|
4969
5002
|
return table.mutate(req);
|
|
4970
5003
|
}
|
|
4971
5004
|
var trans = req.trans;
|
|
4972
|
-
if ((
|
|
5005
|
+
if ((_b = (_a = db.cloud.schema) === null || _a === void 0 ? void 0 : _a[tableName]) === null || _b === void 0 ? void 0 : _b.markedForSync) {
|
|
4973
5006
|
if (req.type === 'add' || req.type === 'put') {
|
|
4974
5007
|
// No matter if user is logged in or not, make sure "owner" and "realmId" props are set properly.
|
|
4975
5008
|
// If not logged in, this will be changed upon syncification of the tables (next sync after login),
|
|
4976
5009
|
// however, application code will work better if we can always rely on that the properties realmId
|
|
4977
5010
|
// and owner are set. Application code may index them and query them based on db.cloud.currentUserId,
|
|
4978
5011
|
// and expect them to be returned. That scenario must work also when db.cloud.currentUserId === 'unauthorized'.
|
|
4979
|
-
for (var
|
|
4980
|
-
var obj = _k
|
|
5012
|
+
for (var _k = 0, _l = req.values; _k < _l.length; _k++) {
|
|
5013
|
+
var obj = _l[_k];
|
|
4981
5014
|
if (!obj.owner) {
|
|
4982
5015
|
obj.owner = trans.currentUser.userId;
|
|
4983
5016
|
}
|
|
4984
5017
|
if (!obj.realmId) {
|
|
4985
5018
|
obj.realmId = trans.currentUser.userId;
|
|
4986
5019
|
}
|
|
4987
|
-
var key = (
|
|
5020
|
+
var key = (_d = (_c = table.schema.primaryKey).extractKey) === null || _d === void 0 ? void 0 : _d.call(_c, obj);
|
|
4988
5021
|
if (typeof key === 'string' && key[0] === '#') {
|
|
4989
5022
|
// Add $ts prop for put operations and
|
|
4990
5023
|
// disable update operations as well as consistent
|
|
@@ -5029,11 +5062,11 @@
|
|
|
5029
5062
|
var counter$1 = 0;
|
|
5030
5063
|
function guardedTable(table) {
|
|
5031
5064
|
var prop = "$lock" + (++counter$1);
|
|
5032
|
-
return
|
|
5065
|
+
return Object.assign(Object.assign({}, table), { count: readLock(table.count, prop), get: readLock(table.get, prop), getMany: readLock(table.getMany, prop), openCursor: readLock(table.openCursor, prop), query: readLock(table.query, prop), mutate: writeLock(table.mutate, prop) });
|
|
5033
5066
|
}
|
|
5034
5067
|
function readLock(fn, prop) {
|
|
5035
5068
|
return function readLocker(req) {
|
|
5036
|
-
var
|
|
5069
|
+
var _k = req.trans[prop] || (req.trans[prop] = { writers: [], readers: [] }), readers = _k.readers, writers = _k.writers;
|
|
5037
5070
|
var numWriters = writers.length;
|
|
5038
5071
|
var promise = (numWriters > 0
|
|
5039
5072
|
? writers[numWriters - 1].then(function () { return fn(req); }, function () { return fn(req); })
|
|
@@ -5044,7 +5077,7 @@
|
|
|
5044
5077
|
}
|
|
5045
5078
|
function writeLock(fn, prop) {
|
|
5046
5079
|
return function writeLocker(req) {
|
|
5047
|
-
var
|
|
5080
|
+
var _k = req.trans[prop] || (req.trans[prop] = { writers: [], readers: [] }), readers = _k.readers, writers = _k.writers;
|
|
5048
5081
|
var promise = (writers.length > 0
|
|
5049
5082
|
? writers[writers.length - 1].then(function () { return fn(req); }, function () { return fn(req); })
|
|
5050
5083
|
: readers.length > 0
|
|
@@ -5063,8 +5096,8 @@
|
|
|
5063
5096
|
* changes to server and cleanup the tracked mutations once the server has
|
|
5064
5097
|
* ackowledged that it got them.
|
|
5065
5098
|
*/
|
|
5066
|
-
function createMutationTrackingMiddleware(
|
|
5067
|
-
var currentUserObservable =
|
|
5099
|
+
function createMutationTrackingMiddleware(_k) {
|
|
5100
|
+
var currentUserObservable = _k.currentUserObservable, db = _k.db;
|
|
5068
5101
|
return {
|
|
5069
5102
|
stack: 'dbcore',
|
|
5070
5103
|
name: 'MutationTrackingMiddleware',
|
|
@@ -5078,14 +5111,14 @@
|
|
|
5078
5111
|
core.table("$".concat(tbl.name, "_mutations"))
|
|
5079
5112
|
]; }));
|
|
5080
5113
|
}
|
|
5081
|
-
catch (
|
|
5114
|
+
catch (_a) {
|
|
5082
5115
|
throwVersionIncrementNeeded();
|
|
5083
5116
|
}
|
|
5084
|
-
return
|
|
5117
|
+
return Object.assign(Object.assign({}, core), { transaction: function (tables, mode) {
|
|
5085
5118
|
var tx;
|
|
5086
5119
|
if (mode === 'readwrite') {
|
|
5087
5120
|
var mutationTables = tables
|
|
5088
|
-
.filter(function (tbl) { var
|
|
5121
|
+
.filter(function (tbl) { var _a, _b; return (_b = (_a = db.cloud.schema) === null || _a === void 0 ? void 0 : _a[tbl]) === null || _b === void 0 ? void 0 : _b.markedForSync; })
|
|
5089
5122
|
.map(function (tbl) { return getMutationTable(tbl); });
|
|
5090
5123
|
tx = core.transaction(__spreadArray$1(__spreadArray$1([], tables, true), mutationTables, true), mode);
|
|
5091
5124
|
}
|
|
@@ -5108,8 +5141,8 @@
|
|
|
5108
5141
|
outstandingTransactions.next(outstandingTransactions.value);
|
|
5109
5142
|
};
|
|
5110
5143
|
var txComplete_1 = function () {
|
|
5111
|
-
var
|
|
5112
|
-
if (tx.mutationsAdded && ((
|
|
5144
|
+
var _a;
|
|
5145
|
+
if (tx.mutationsAdded && ((_a = db.cloud.options) === null || _a === void 0 ? void 0 : _a.databaseUrl)) {
|
|
5113
5146
|
if (db.cloud.usingServiceWorker) {
|
|
5114
5147
|
console.debug('registering sync event');
|
|
5115
5148
|
registerSyncEvent(db, "push");
|
|
@@ -5133,7 +5166,7 @@
|
|
|
5133
5166
|
// make sure to set the mutationsAdded flag on transaction.
|
|
5134
5167
|
// This is also done in mutateAndLog() as that function talks to a
|
|
5135
5168
|
// lower level DBCore and wouldn't be catched by this code.
|
|
5136
|
-
return
|
|
5169
|
+
return Object.assign(Object.assign({}, table), { mutate: function (req) {
|
|
5137
5170
|
if (req.type === 'add' || req.type === 'put') {
|
|
5138
5171
|
req.trans.mutationsAdded = true;
|
|
5139
5172
|
}
|
|
@@ -5141,7 +5174,7 @@
|
|
|
5141
5174
|
} });
|
|
5142
5175
|
}
|
|
5143
5176
|
else if (tableName === '$logins') {
|
|
5144
|
-
return
|
|
5177
|
+
return Object.assign(Object.assign({}, table), { mutate: function (req) {
|
|
5145
5178
|
//console.debug('Mutating $logins table', req);
|
|
5146
5179
|
return table
|
|
5147
5180
|
.mutate(req)
|
|
@@ -5163,16 +5196,16 @@
|
|
|
5163
5196
|
}
|
|
5164
5197
|
var schema = table.schema;
|
|
5165
5198
|
var mutsTable = mutTableMap.get(tableName);
|
|
5166
|
-
return guardedTable(
|
|
5167
|
-
var
|
|
5199
|
+
return guardedTable(Object.assign(Object.assign({}, table), { mutate: function (req) {
|
|
5200
|
+
var _a, _b, _c;
|
|
5168
5201
|
var trans = req.trans;
|
|
5169
5202
|
if (!trans.txid)
|
|
5170
5203
|
return table.mutate(req); // Upgrade transactions not guarded by us.
|
|
5171
5204
|
if (trans.disableChangeTracking)
|
|
5172
5205
|
return table.mutate(req);
|
|
5173
|
-
if (!((
|
|
5206
|
+
if (!((_b = (_a = db.cloud.schema) === null || _a === void 0 ? void 0 : _a[tableName]) === null || _b === void 0 ? void 0 : _b.markedForSync))
|
|
5174
5207
|
return table.mutate(req);
|
|
5175
|
-
if (!((
|
|
5208
|
+
if (!((_c = trans.currentUser) === null || _c === void 0 ? void 0 : _c.isLoggedIn)) {
|
|
5176
5209
|
// Unauthorized user should not log mutations.
|
|
5177
5210
|
// Instead, after login all local data should be logged at once.
|
|
5178
5211
|
return table.mutate(req);
|
|
@@ -5272,7 +5305,7 @@
|
|
|
5272
5305
|
}
|
|
5273
5306
|
function overrideParseStoresSpec(origFunc, dexie) {
|
|
5274
5307
|
return function (stores, dbSchema) {
|
|
5275
|
-
var storesClone =
|
|
5308
|
+
var storesClone = Object.assign(Object.assign({}, DEXIE_CLOUD_SCHEMA), stores);
|
|
5276
5309
|
var cloudSchema = dexie.cloud.schema || (dexie.cloud.schema = {});
|
|
5277
5310
|
var allPrefixes = new Set();
|
|
5278
5311
|
Object.keys(storesClone).forEach(function (tableName) {
|
|
@@ -5305,13 +5338,13 @@
|
|
|
5305
5338
|
}
|
|
5306
5339
|
function performInitialSync(db, cloudOptions, cloudSchema) {
|
|
5307
5340
|
return __awaiter$1(this, void 0, void 0, function () {
|
|
5308
|
-
return __generator$1(this, function (
|
|
5309
|
-
switch (
|
|
5341
|
+
return __generator$1(this, function (_k) {
|
|
5342
|
+
switch (_k.label) {
|
|
5310
5343
|
case 0:
|
|
5311
5344
|
console.debug('Performing initial sync');
|
|
5312
5345
|
return [4 /*yield*/, sync(db, cloudOptions, cloudSchema, { isInitialSync: true })];
|
|
5313
5346
|
case 1:
|
|
5314
|
-
|
|
5347
|
+
_k.sent();
|
|
5315
5348
|
console.debug('Done initial sync');
|
|
5316
5349
|
return [2 /*return*/];
|
|
5317
5350
|
}
|
|
@@ -5437,7 +5470,7 @@
|
|
|
5437
5470
|
try {
|
|
5438
5471
|
this.ws.close();
|
|
5439
5472
|
}
|
|
5440
|
-
catch (
|
|
5473
|
+
catch (_a) { }
|
|
5441
5474
|
}
|
|
5442
5475
|
this.ws = null;
|
|
5443
5476
|
if (this.messageProducerSubscription) {
|
|
@@ -5453,7 +5486,7 @@
|
|
|
5453
5486
|
try {
|
|
5454
5487
|
this.disconnect();
|
|
5455
5488
|
}
|
|
5456
|
-
catch (
|
|
5489
|
+
catch (_a) { }
|
|
5457
5490
|
this.connect()
|
|
5458
5491
|
.catch(function () { })
|
|
5459
5492
|
.then(function () { return (_this_1.reconnecting = false); }); // finally()
|
|
@@ -5462,8 +5495,8 @@
|
|
|
5462
5495
|
return __awaiter$1(this, void 0, void 0, function () {
|
|
5463
5496
|
var wsUrl, searchParams, ws, everConnected_1;
|
|
5464
5497
|
var _this_1 = this;
|
|
5465
|
-
return __generator$1(this, function (
|
|
5466
|
-
switch (
|
|
5498
|
+
return __generator$1(this, function (_k) {
|
|
5499
|
+
switch (_k.label) {
|
|
5467
5500
|
case 0:
|
|
5468
5501
|
this.lastServerActivity = new Date();
|
|
5469
5502
|
if (this.pauseUntil && this.pauseUntil > new Date()) {
|
|
@@ -5489,7 +5522,7 @@
|
|
|
5489
5522
|
this.webSocketStatus.next('connecting');
|
|
5490
5523
|
this.pinger = setInterval(function () { return __awaiter$1(_this_1, void 0, void 0, function () {
|
|
5491
5524
|
var _this_1 = this;
|
|
5492
|
-
return __generator$1(this, function (
|
|
5525
|
+
return __generator$1(this, function (_k) {
|
|
5493
5526
|
if (this.closed) {
|
|
5494
5527
|
console.debug('pinger check', this.id, 'CLOSED.');
|
|
5495
5528
|
this.teardown();
|
|
@@ -5519,7 +5552,7 @@
|
|
|
5519
5552
|
}
|
|
5520
5553
|
}, SERVER_PING_TIMEOUT);
|
|
5521
5554
|
}
|
|
5522
|
-
catch (
|
|
5555
|
+
catch (_a) {
|
|
5523
5556
|
console.debug('pinger catch error', this.id, 'reconnecting');
|
|
5524
5557
|
this.reconnect();
|
|
5525
5558
|
}
|
|
@@ -5574,9 +5607,9 @@
|
|
|
5574
5607
|
_this_1.subscriber.error(e);
|
|
5575
5608
|
}
|
|
5576
5609
|
};
|
|
5577
|
-
|
|
5610
|
+
_k.label = 1;
|
|
5578
5611
|
case 1:
|
|
5579
|
-
|
|
5612
|
+
_k.trys.push([1, 3, , 4]);
|
|
5580
5613
|
everConnected_1 = false;
|
|
5581
5614
|
return [4 /*yield*/, new Promise(function (resolve, reject) {
|
|
5582
5615
|
ws.onopen = function (event) {
|
|
@@ -5597,20 +5630,20 @@
|
|
|
5597
5630
|
};
|
|
5598
5631
|
})];
|
|
5599
5632
|
case 2:
|
|
5600
|
-
|
|
5633
|
+
_k.sent();
|
|
5601
5634
|
this.messageProducerSubscription = this.messageProducer.subscribe(function (msg) {
|
|
5602
|
-
var
|
|
5635
|
+
var _a;
|
|
5603
5636
|
if (!_this_1.closed) {
|
|
5604
5637
|
if (msg.type === 'ready' &&
|
|
5605
5638
|
_this_1.webSocketStatus.value !== 'connected') {
|
|
5606
5639
|
_this_1.webSocketStatus.next('connected');
|
|
5607
5640
|
}
|
|
5608
|
-
(
|
|
5641
|
+
(_a = _this_1.ws) === null || _a === void 0 ? void 0 : _a.send(TSON.stringify(msg));
|
|
5609
5642
|
}
|
|
5610
5643
|
});
|
|
5611
5644
|
return [3 /*break*/, 4];
|
|
5612
5645
|
case 3:
|
|
5613
|
-
|
|
5646
|
+
_k.sent();
|
|
5614
5647
|
this.pauseUntil = new Date(Date.now() + FAIL_RETRY_WAIT_TIME);
|
|
5615
5648
|
return [3 /*break*/, 4];
|
|
5616
5649
|
case 4: return [2 /*return*/];
|
|
@@ -5625,20 +5658,20 @@
|
|
|
5625
5658
|
}
|
|
5626
5659
|
function waitAndReconnectWhenUserDoesSomething(error) {
|
|
5627
5660
|
return __awaiter$1(this, void 0, void 0, function () {
|
|
5628
|
-
return __generator$1(this, function (
|
|
5629
|
-
switch (
|
|
5661
|
+
return __generator$1(this, function (_k) {
|
|
5662
|
+
switch (_k.label) {
|
|
5630
5663
|
case 0:
|
|
5631
5664
|
console.error("WebSocket observable: error but revive when user does some active thing...", error);
|
|
5632
5665
|
// Sleep some seconds...
|
|
5633
5666
|
return [4 /*yield*/, sleep(3000)];
|
|
5634
5667
|
case 1:
|
|
5635
5668
|
// Sleep some seconds...
|
|
5636
|
-
|
|
5669
|
+
_k.sent();
|
|
5637
5670
|
// Wait til user does something (move mouse, tap, scroll, click etc)
|
|
5638
5671
|
console.debug('waiting for someone to do something');
|
|
5639
5672
|
return [4 /*yield*/, userDoesSomething.pipe(take(1)).toPromise()];
|
|
5640
5673
|
case 2:
|
|
5641
|
-
|
|
5674
|
+
_k.sent();
|
|
5642
5675
|
console.debug('someone did something!');
|
|
5643
5676
|
return [2 /*return*/];
|
|
5644
5677
|
}
|
|
@@ -5646,8 +5679,8 @@
|
|
|
5646
5679
|
});
|
|
5647
5680
|
}
|
|
5648
5681
|
function connectWebSocket(db) {
|
|
5649
|
-
var
|
|
5650
|
-
if (!((
|
|
5682
|
+
var _a;
|
|
5683
|
+
if (!((_a = db.cloud.options) === null || _a === void 0 ? void 0 : _a.databaseUrl)) {
|
|
5651
5684
|
throw new Error("No database URL to connect WebSocket to");
|
|
5652
5685
|
}
|
|
5653
5686
|
var messageProducer = db.messageConsumer.readyToServe.pipe(filter(function (isReady) { return isReady; }), // When consumer is ready for new messages, produce such a message to inform server about it
|
|
@@ -5662,21 +5695,21 @@
|
|
|
5662
5695
|
var _this_1 = this;
|
|
5663
5696
|
return db.cloud.persistedSyncState.pipe(filter(function (syncState) { return syncState === null || syncState === void 0 ? void 0 : syncState.serverRevision; }), // Don't connect before there's no initial sync performed.
|
|
5664
5697
|
take(1), // Don't continue waking up whenever syncState change
|
|
5665
|
-
switchMap(function (syncState) { return db.cloud.currentUser.pipe(map(function (userLogin) { return [userLogin, syncState]; })); }), switchMap(function (
|
|
5666
|
-
var userLogin =
|
|
5698
|
+
switchMap(function (syncState) { return db.cloud.currentUser.pipe(map(function (userLogin) { return [userLogin, syncState]; })); }), switchMap(function (_k) {
|
|
5699
|
+
var userLogin = _k[0], syncState = _k[1];
|
|
5667
5700
|
return userIsReallyActive.pipe(map(function (isActive) { return [isActive ? userLogin : null, syncState]; }));
|
|
5668
|
-
}), switchMap(function (
|
|
5669
|
-
var userLogin =
|
|
5670
|
-
return __awaiter$1(_this_1, void 0, void 0, function () { var
|
|
5671
|
-
switch (
|
|
5701
|
+
}), switchMap(function (_k) {
|
|
5702
|
+
var userLogin = _k[0], syncState = _k[1];
|
|
5703
|
+
return __awaiter$1(_this_1, void 0, void 0, function () { var _k; return __generator$1(this, function (_l) {
|
|
5704
|
+
switch (_l.label) {
|
|
5672
5705
|
case 0:
|
|
5673
|
-
|
|
5706
|
+
_k = [userLogin];
|
|
5674
5707
|
return [4 /*yield*/, computeRealmSetHash(syncState)];
|
|
5675
|
-
case 1: return [2 /*return*/,
|
|
5708
|
+
case 1: return [2 /*return*/, _k.concat([_l.sent()])];
|
|
5676
5709
|
}
|
|
5677
5710
|
}); });
|
|
5678
|
-
}), switchMap(function (
|
|
5679
|
-
var userLogin =
|
|
5711
|
+
}), switchMap(function (_k) {
|
|
5712
|
+
var userLogin = _k[0], realmSetHash = _k[1];
|
|
5680
5713
|
// Let server end query changes from last entry of same client-ID and forward.
|
|
5681
5714
|
// If no new entries, server won't bother the client. If new entries, server sends only those
|
|
5682
5715
|
// and the baseRev of the last from same client-ID.
|
|
@@ -5688,14 +5721,14 @@
|
|
|
5688
5721
|
console.debug('WebSocket observable: Token expired. Refreshing token...');
|
|
5689
5722
|
return rxjs.of(true).pipe(switchMap(function () { return __awaiter$1(_this_1, void 0, void 0, function () {
|
|
5690
5723
|
var user, refreshedLogin;
|
|
5691
|
-
return __generator$1(this, function (
|
|
5692
|
-
switch (
|
|
5724
|
+
return __generator$1(this, function (_k) {
|
|
5725
|
+
switch (_k.label) {
|
|
5693
5726
|
case 0: return [4 /*yield*/, db.getCurrentUser()];
|
|
5694
5727
|
case 1:
|
|
5695
|
-
user =
|
|
5728
|
+
user = _k.sent();
|
|
5696
5729
|
return [4 /*yield*/, refreshAccessToken(db.cloud.options.databaseUrl, user)];
|
|
5697
5730
|
case 2:
|
|
5698
|
-
refreshedLogin =
|
|
5731
|
+
refreshedLogin = _k.sent();
|
|
5699
5732
|
// Persist updated access token
|
|
5700
5733
|
return [4 /*yield*/, db.table('$logins').update(user.userId, {
|
|
5701
5734
|
accessToken: refreshedLogin.accessToken,
|
|
@@ -5703,7 +5736,7 @@
|
|
|
5703
5736
|
})];
|
|
5704
5737
|
case 3:
|
|
5705
5738
|
// Persist updated access token
|
|
5706
|
-
|
|
5739
|
+
_k.sent();
|
|
5707
5740
|
return [2 /*return*/];
|
|
5708
5741
|
}
|
|
5709
5742
|
});
|
|
@@ -5729,21 +5762,21 @@
|
|
|
5729
5762
|
});
|
|
5730
5763
|
}
|
|
5731
5764
|
function isSyncNeeded(db) {
|
|
5732
|
-
var
|
|
5765
|
+
var _a;
|
|
5733
5766
|
return __awaiter$1(this, void 0, void 0, function () {
|
|
5734
|
-
var
|
|
5735
|
-
return __generator$1(this, function (
|
|
5736
|
-
switch (
|
|
5767
|
+
var _k;
|
|
5768
|
+
return __generator$1(this, function (_l) {
|
|
5769
|
+
switch (_l.label) {
|
|
5737
5770
|
case 0:
|
|
5738
|
-
if (!(((
|
|
5771
|
+
if (!(((_a = db.cloud.options) === null || _a === void 0 ? void 0 : _a.databaseUrl) && db.cloud.schema)) return [3 /*break*/, 2];
|
|
5739
5772
|
return [4 /*yield*/, sync(db, db.cloud.options, db.cloud.schema, { justCheckIfNeeded: true })];
|
|
5740
5773
|
case 1:
|
|
5741
|
-
|
|
5774
|
+
_k = _l.sent();
|
|
5742
5775
|
return [3 /*break*/, 3];
|
|
5743
5776
|
case 2:
|
|
5744
|
-
|
|
5745
|
-
|
|
5746
|
-
case 3: return [2 /*return*/,
|
|
5777
|
+
_k = false;
|
|
5778
|
+
_l.label = 3;
|
|
5779
|
+
case 3: return [2 /*return*/, _k];
|
|
5747
5780
|
}
|
|
5748
5781
|
});
|
|
5749
5782
|
});
|
|
@@ -5753,22 +5786,22 @@
|
|
|
5753
5786
|
var myId = randomString(16);
|
|
5754
5787
|
var GUARDED_JOB_HEARTBEAT = 1 * SECONDS;
|
|
5755
5788
|
var GUARDED_JOB_TIMEOUT = 1 * MINUTES;
|
|
5756
|
-
function performGuardedJob(db, jobName, jobsTableName, job,
|
|
5757
|
-
var
|
|
5789
|
+
function performGuardedJob(db, jobName, jobsTableName, job, _k) {
|
|
5790
|
+
var _l = _k === void 0 ? {} : _k, awaitRemoteJob = _l.awaitRemoteJob;
|
|
5758
5791
|
return __awaiter$1(this, void 0, void 0, function () {
|
|
5759
5792
|
function aquireLock() {
|
|
5760
5793
|
return __awaiter$1(this, void 0, void 0, function () {
|
|
5761
5794
|
var gotTheLock, jobDoneObservable, err_1;
|
|
5762
5795
|
var _this_1 = this;
|
|
5763
|
-
return __generator$1(this, function (
|
|
5764
|
-
switch (
|
|
5796
|
+
return __generator$1(this, function (_k) {
|
|
5797
|
+
switch (_k.label) {
|
|
5765
5798
|
case 0: return [4 /*yield*/, db.transaction('rw!', jobsTableName, function () { return __awaiter$1(_this_1, void 0, void 0, function () {
|
|
5766
5799
|
var currentWork;
|
|
5767
|
-
return __generator$1(this, function (
|
|
5768
|
-
switch (
|
|
5800
|
+
return __generator$1(this, function (_k) {
|
|
5801
|
+
switch (_k.label) {
|
|
5769
5802
|
case 0: return [4 /*yield*/, jobsTable.get(jobName)];
|
|
5770
5803
|
case 1:
|
|
5771
|
-
currentWork =
|
|
5804
|
+
currentWork = _k.sent();
|
|
5772
5805
|
if (!!currentWork) return [3 /*break*/, 3];
|
|
5773
5806
|
// No one else is working. Let's record that we are.
|
|
5774
5807
|
return [4 /*yield*/, jobsTable.add({
|
|
@@ -5778,7 +5811,7 @@
|
|
|
5778
5811
|
}, jobName)];
|
|
5779
5812
|
case 2:
|
|
5780
5813
|
// No one else is working. Let's record that we are.
|
|
5781
|
-
|
|
5814
|
+
_k.sent();
|
|
5782
5815
|
return [2 /*return*/, true];
|
|
5783
5816
|
case 3:
|
|
5784
5817
|
if (!(currentWork.heartbeat.getTime() <
|
|
@@ -5792,27 +5825,27 @@
|
|
|
5792
5825
|
}, jobName)];
|
|
5793
5826
|
case 4:
|
|
5794
5827
|
// Now, take over!
|
|
5795
|
-
|
|
5828
|
+
_k.sent();
|
|
5796
5829
|
return [2 /*return*/, true];
|
|
5797
5830
|
case 5: return [2 /*return*/, false];
|
|
5798
5831
|
}
|
|
5799
5832
|
});
|
|
5800
5833
|
}); })];
|
|
5801
5834
|
case 1:
|
|
5802
|
-
gotTheLock =
|
|
5835
|
+
gotTheLock = _k.sent();
|
|
5803
5836
|
if (gotTheLock)
|
|
5804
5837
|
return [2 /*return*/, true];
|
|
5805
5838
|
if (!awaitRemoteJob) return [3 /*break*/, 6];
|
|
5806
|
-
|
|
5839
|
+
_k.label = 2;
|
|
5807
5840
|
case 2:
|
|
5808
|
-
|
|
5841
|
+
_k.trys.push([2, 4, , 6]);
|
|
5809
5842
|
jobDoneObservable = rxjs.from(Dexie.liveQuery(function () { return jobsTable.get(jobName); })).pipe(timeout(GUARDED_JOB_TIMEOUT), filter(function (job) { return !job; }));
|
|
5810
5843
|
return [4 /*yield*/, jobDoneObservable.toPromise()];
|
|
5811
5844
|
case 3:
|
|
5812
|
-
|
|
5845
|
+
_k.sent();
|
|
5813
5846
|
return [2 /*return*/, false];
|
|
5814
5847
|
case 4:
|
|
5815
|
-
err_1 =
|
|
5848
|
+
err_1 = _k.sent();
|
|
5816
5849
|
if (err_1.name !== 'TimeoutError') {
|
|
5817
5850
|
throw err_1;
|
|
5818
5851
|
}
|
|
@@ -5821,7 +5854,7 @@
|
|
|
5821
5854
|
// Timeout stopped us! Try aquire the lock now.
|
|
5822
5855
|
// It will likely succeed this time unless
|
|
5823
5856
|
// another client took it.
|
|
5824
|
-
return [2 /*return*/,
|
|
5857
|
+
return [2 /*return*/, _k.sent()];
|
|
5825
5858
|
case 6: return [2 /*return*/, false];
|
|
5826
5859
|
}
|
|
5827
5860
|
});
|
|
@@ -5829,13 +5862,13 @@
|
|
|
5829
5862
|
}
|
|
5830
5863
|
var jobsTable, heartbeat;
|
|
5831
5864
|
var _this_1 = this;
|
|
5832
|
-
return __generator$1(this, function (
|
|
5833
|
-
switch (
|
|
5865
|
+
return __generator$1(this, function (_k) {
|
|
5866
|
+
switch (_k.label) {
|
|
5834
5867
|
case 0:
|
|
5835
5868
|
jobsTable = db.table(jobsTableName);
|
|
5836
5869
|
return [4 /*yield*/, aquireLock()];
|
|
5837
5870
|
case 1:
|
|
5838
|
-
if (!
|
|
5871
|
+
if (!_k.sent()) return [3 /*break*/, 6];
|
|
5839
5872
|
heartbeat = setInterval(function () {
|
|
5840
5873
|
jobsTable.update(jobName, function (job) {
|
|
5841
5874
|
if (job.nodeId === myId) {
|
|
@@ -5843,34 +5876,34 @@
|
|
|
5843
5876
|
}
|
|
5844
5877
|
});
|
|
5845
5878
|
}, GUARDED_JOB_HEARTBEAT);
|
|
5846
|
-
|
|
5879
|
+
_k.label = 2;
|
|
5847
5880
|
case 2:
|
|
5848
|
-
|
|
5881
|
+
_k.trys.push([2, , 4, 6]);
|
|
5849
5882
|
return [4 /*yield*/, job()];
|
|
5850
|
-
case 3: return [2 /*return*/,
|
|
5883
|
+
case 3: return [2 /*return*/, _k.sent()];
|
|
5851
5884
|
case 4:
|
|
5852
5885
|
// Stop heartbeat
|
|
5853
5886
|
clearInterval(heartbeat);
|
|
5854
5887
|
// Remove the persisted job state:
|
|
5855
5888
|
return [4 /*yield*/, db.transaction('rw!', jobsTableName, function () { return __awaiter$1(_this_1, void 0, void 0, function () {
|
|
5856
5889
|
var currentWork;
|
|
5857
|
-
return __generator$1(this, function (
|
|
5858
|
-
switch (
|
|
5890
|
+
return __generator$1(this, function (_k) {
|
|
5891
|
+
switch (_k.label) {
|
|
5859
5892
|
case 0: return [4 /*yield*/, jobsTable.get(jobName)];
|
|
5860
5893
|
case 1:
|
|
5861
|
-
currentWork =
|
|
5894
|
+
currentWork = _k.sent();
|
|
5862
5895
|
if (!(currentWork && currentWork.nodeId === myId)) return [3 /*break*/, 3];
|
|
5863
5896
|
return [4 /*yield*/, jobsTable.delete(jobName)];
|
|
5864
5897
|
case 2:
|
|
5865
|
-
|
|
5866
|
-
|
|
5898
|
+
_k.sent();
|
|
5899
|
+
_k.label = 3;
|
|
5867
5900
|
case 3: return [2 /*return*/];
|
|
5868
5901
|
}
|
|
5869
5902
|
});
|
|
5870
5903
|
}); })];
|
|
5871
5904
|
case 5:
|
|
5872
5905
|
// Remove the persisted job state:
|
|
5873
|
-
|
|
5906
|
+
_k.sent();
|
|
5874
5907
|
return [7 /*endfinally*/];
|
|
5875
5908
|
case 6: return [2 /*return*/];
|
|
5876
5909
|
}
|
|
@@ -5928,32 +5961,36 @@
|
|
|
5928
5961
|
function _syncIfPossible() {
|
|
5929
5962
|
return __awaiter$1(this, void 0, void 0, function () {
|
|
5930
5963
|
var error_4;
|
|
5931
|
-
return __generator$1(this, function (
|
|
5932
|
-
switch (
|
|
5964
|
+
return __generator$1(this, function (_k) {
|
|
5965
|
+
switch (_k.label) {
|
|
5933
5966
|
case 0:
|
|
5934
|
-
|
|
5935
|
-
if (!db.cloud.
|
|
5936
|
-
|
|
5967
|
+
_k.trys.push([0, 6, , 7]);
|
|
5968
|
+
if (!db.cloud.isServiceWorkerDB) return [3 /*break*/, 2];
|
|
5969
|
+
// We are the dedicated sync SW:
|
|
5937
5970
|
return [4 /*yield*/, sync(db, cloudOptions, cloudSchema, options)];
|
|
5938
5971
|
case 1:
|
|
5939
|
-
|
|
5940
|
-
|
|
5941
|
-
|
|
5942
|
-
case
|
|
5943
|
-
|
|
5944
|
-
|
|
5945
|
-
|
|
5946
|
-
|
|
5972
|
+
// We are the dedicated sync SW:
|
|
5973
|
+
_k.sent();
|
|
5974
|
+
return [3 /*break*/, 5];
|
|
5975
|
+
case 2:
|
|
5976
|
+
if (!!db.cloud.usingServiceWorker) return [3 /*break*/, 4];
|
|
5977
|
+
// We use a flow that is better suited for the case when multiple workers want to
|
|
5978
|
+
// do the same thing.
|
|
5979
|
+
return [4 /*yield*/, performGuardedJob(db, CURRENT_SYNC_WORKER, '$jobs', function () { return sync(db, cloudOptions, cloudSchema, options); })];
|
|
5980
|
+
case 3:
|
|
5947
5981
|
// We use a flow that is better suited for the case when multiple workers want to
|
|
5948
5982
|
// do the same thing.
|
|
5949
|
-
|
|
5950
|
-
|
|
5983
|
+
_k.sent();
|
|
5984
|
+
return [3 /*break*/, 5];
|
|
5985
|
+
case 4:
|
|
5986
|
+
assert(false);
|
|
5987
|
+
throw new Error('Internal _syncIfPossible() - invalid precondition - should not have been called.');
|
|
5951
5988
|
case 5:
|
|
5952
5989
|
ongoingSyncs.delete(db);
|
|
5953
5990
|
console.debug('Done sync');
|
|
5954
5991
|
return [3 /*break*/, 7];
|
|
5955
5992
|
case 6:
|
|
5956
|
-
error_4 =
|
|
5993
|
+
error_4 = _k.sent();
|
|
5957
5994
|
ongoingSyncs.delete(db);
|
|
5958
5995
|
console.error("Failed to sync client changes", error_4);
|
|
5959
5996
|
throw error_4; // Make sure we rethrow error so that sync event is retried.
|
|
@@ -5995,8 +6032,8 @@
|
|
|
5995
6032
|
// Sync eagerly whenever a change has happened (+ initially when there's no syncState yet)
|
|
5996
6033
|
// This initial subscribe will also trigger an sync also now.
|
|
5997
6034
|
console.debug('Starting LocalSyncWorker', db.localSyncEvent['id']);
|
|
5998
|
-
localSyncEventSubscription = db.localSyncEvent.subscribe(function (
|
|
5999
|
-
var purpose =
|
|
6035
|
+
localSyncEventSubscription = db.localSyncEvent.subscribe(function (_k) {
|
|
6036
|
+
var purpose = _k.purpose;
|
|
6000
6037
|
try {
|
|
6001
6038
|
syncAndRetry(purpose || 'pull');
|
|
6002
6039
|
}
|
|
@@ -6020,8 +6057,8 @@
|
|
|
6020
6057
|
function updateSchemaFromOptions(schema, options) {
|
|
6021
6058
|
if (schema && options) {
|
|
6022
6059
|
if (options.unsyncedTables) {
|
|
6023
|
-
for (var
|
|
6024
|
-
var tableName =
|
|
6060
|
+
for (var _k = 0, _l = options.unsyncedTables; _k < _l.length; _k++) {
|
|
6061
|
+
var tableName = _l[_k];
|
|
6025
6062
|
if (schema[tableName]) {
|
|
6026
6063
|
schema[tableName].markedForSync = false;
|
|
6027
6064
|
}
|
|
@@ -6030,10 +6067,10 @@
|
|
|
6030
6067
|
}
|
|
6031
6068
|
}
|
|
6032
6069
|
function verifySchema(db) {
|
|
6033
|
-
var
|
|
6034
|
-
for (var
|
|
6035
|
-
var table =
|
|
6036
|
-
if ((
|
|
6070
|
+
var _a, _b;
|
|
6071
|
+
for (var _k = 0, _l = db.tables; _k < _l.length; _k++) {
|
|
6072
|
+
var table = _l[_k];
|
|
6073
|
+
if ((_b = (_a = db.cloud.schema) === null || _a === void 0 ? void 0 : _a[table.name]) === null || _b === void 0 ? void 0 : _b.markedForSync) {
|
|
6037
6074
|
if (table.schema.primKey.auto) {
|
|
6038
6075
|
throw new Dexie__default["default"].SchemaError("Table ".concat(table.name, " is both autoIncremented and synced. ") +
|
|
6039
6076
|
"Use db.cloud.configure({unsyncedTables: [".concat(JSON.stringify(table.name), "]}) to blacklist it from sync"));
|
|
@@ -6275,9 +6312,9 @@
|
|
|
6275
6312
|
padding: "8px"
|
|
6276
6313
|
}
|
|
6277
6314
|
};
|
|
6278
|
-
function Dialog(
|
|
6279
|
-
var children =
|
|
6280
|
-
return (a$1("div",
|
|
6315
|
+
function Dialog(_k) {
|
|
6316
|
+
var children = _k.children, className = _k.className;
|
|
6317
|
+
return (a$1("div", { className: className }, a$1("div", { style: Styles.Darken }), a$1("div", { style: Styles.DialogOuter }, a$1("div", { style: Styles.DialogInner }, children))));
|
|
6281
6318
|
}
|
|
6282
6319
|
var t, u, r, o = 0, i = [], c = n.__b, f = n.__r, e = n.diffed, a = n.__c, v = n.unmount;
|
|
6283
6320
|
function m(t, r) { n.__h && n.__h(u, t, o || r), o = 0; var i = u.__H || (u.__H = { __: [], __h: [] }); return t >= i.__.length && i.__.push({}), i.__[t]; }
|
|
@@ -6310,24 +6347,24 @@
|
|
|
6310
6347
|
function j(n) { var t = u; n.__c = n.__(), u = t; }
|
|
6311
6348
|
function k(n, t) { return !n || n.length !== t.length || t.some(function (t, u) { return t !== n[u]; }); }
|
|
6312
6349
|
function w(n, t) { return "function" == typeof t ? t(n) : t; }
|
|
6313
|
-
function resolveText(
|
|
6314
|
-
var message =
|
|
6350
|
+
function resolveText(_k) {
|
|
6351
|
+
var message = _k.message; _k.messageCode; var messageParams = _k.messageParams;
|
|
6315
6352
|
return message.replace(/\{\w+\}/ig, function (n) { return messageParams[n.substr(1, n.length - 2)]; });
|
|
6316
6353
|
}
|
|
6317
|
-
function LoginDialog(
|
|
6318
|
-
var title =
|
|
6319
|
-
var
|
|
6354
|
+
function LoginDialog(_k) {
|
|
6355
|
+
var title = _k.title, alerts = _k.alerts, fields = _k.fields, onCancel = _k.onCancel, onSubmit = _k.onSubmit;
|
|
6356
|
+
var _l = l({}), params = _l[0], setParams = _l[1];
|
|
6320
6357
|
var firstFieldRef = s();
|
|
6321
|
-
h(function () { var
|
|
6322
|
-
return (a$1(Dialog,
|
|
6358
|
+
h(function () { var _a; return (_a = firstFieldRef.current) === null || _a === void 0 ? void 0 : _a.focus(); }, []);
|
|
6359
|
+
return (a$1(Dialog, { className: "dxc-login-dlg" }, a$1(y, null, a$1("h3", { style: Styles.WindowHeader }, title), alerts.map(function (alert) { return (a$1("p", { style: Styles.Alert[alert.type] }, resolveText(alert))); }), a$1("form", { onSubmit: function (ev) {
|
|
6323
6360
|
ev.preventDefault();
|
|
6324
6361
|
onSubmit(params);
|
|
6325
|
-
} }, Object.entries(fields).map(function (
|
|
6326
|
-
var fieldName =
|
|
6362
|
+
} }, Object.entries(fields).map(function (_k, idx) {
|
|
6363
|
+
var fieldName = _k[0], _l = _k[1], type = _l.type, label = _l.label, placeholder = _l.placeholder;
|
|
6327
6364
|
return (a$1("label", { style: Styles.Label }, label ? "".concat(label, ": ") : '', a$1("input", { ref: idx === 0 ? firstFieldRef : undefined, type: type, name: fieldName, autoComplete: "on", style: Styles.Input, autoFocus: true, placeholder: placeholder, value: params[fieldName] || '', onInput: function (ev) {
|
|
6328
|
-
var
|
|
6329
|
-
var
|
|
6330
|
-
return setParams(
|
|
6365
|
+
var _k;
|
|
6366
|
+
var _a;
|
|
6367
|
+
return setParams(Object.assign(Object.assign({}, params), (_k = {}, _k[fieldName] = valueTransformer(type, (_a = ev.target) === null || _a === void 0 ? void 0 : _a['value']), _k)));
|
|
6331
6368
|
} })));
|
|
6332
6369
|
}))), a$1("div", { style: Styles.ButtonsDiv }, a$1("button", { type: "submit", style: Styles.Button, onClick: function () { return onSubmit(params); } }, "Submit"), a$1("button", { style: Styles.Button, onClick: onCancel }, "Cancel"))));
|
|
6333
6370
|
}
|
|
@@ -6355,12 +6392,12 @@
|
|
|
6355
6392
|
delete this.subscription;
|
|
6356
6393
|
}
|
|
6357
6394
|
};
|
|
6358
|
-
LoginGui.prototype.render = function (props,
|
|
6359
|
-
var userInteraction =
|
|
6395
|
+
LoginGui.prototype.render = function (props, _k) {
|
|
6396
|
+
var userInteraction = _k.userInteraction;
|
|
6360
6397
|
if (!userInteraction)
|
|
6361
6398
|
return null;
|
|
6362
6399
|
//if (props.db.cloud.userInteraction.observers.length > 1) return null; // Someone else subscribes.
|
|
6363
|
-
return a$1(LoginDialog,
|
|
6400
|
+
return a$1(LoginDialog, Object.assign({}, userInteraction));
|
|
6364
6401
|
};
|
|
6365
6402
|
return LoginGui;
|
|
6366
6403
|
}(p$1));
|
|
@@ -6411,8 +6448,8 @@
|
|
|
6411
6448
|
lazyWebSocketStatus,
|
|
6412
6449
|
db.syncStateChangedEvent.pipe(startWith({ phase: 'initial' })),
|
|
6413
6450
|
userIsReallyActive
|
|
6414
|
-
]).pipe(map(function (
|
|
6415
|
-
var status =
|
|
6451
|
+
]).pipe(map(function (_k) {
|
|
6452
|
+
var status = _k[0], syncState = _k[1], userIsActive = _k[2];
|
|
6416
6453
|
var phase = syncState.phase, error = syncState.error, progress = syncState.progress;
|
|
6417
6454
|
var adjustedStatus = status;
|
|
6418
6455
|
if (phase === 'error') {
|
|
@@ -6491,10 +6528,10 @@
|
|
|
6491
6528
|
.toArray()
|
|
6492
6529
|
.then(function (roles) {
|
|
6493
6530
|
var rv = {};
|
|
6494
|
-
for (var
|
|
6531
|
+
for (var _k = 0, _l = roles
|
|
6495
6532
|
.slice()
|
|
6496
|
-
.sort(function (a, b) { return (a.sortOrder || 0) - (b.sortOrder || 0); });
|
|
6497
|
-
var role =
|
|
6533
|
+
.sort(function (a, b) { return (a.sortOrder || 0) - (b.sortOrder || 0); }); _k < _l.length; _k++) {
|
|
6534
|
+
var role = _l[_k];
|
|
6498
6535
|
rv[role.name] = role;
|
|
6499
6536
|
}
|
|
6500
6537
|
return rv;
|
|
@@ -6506,8 +6543,8 @@
|
|
|
6506
6543
|
db.members.where({ userId: currentUser.userId }).toArray(),
|
|
6507
6544
|
db.realms.toArray(),
|
|
6508
6545
|
currentUser.userId,
|
|
6509
|
-
]).then(function (
|
|
6510
|
-
var selfMembers =
|
|
6546
|
+
]).then(function (_k) {
|
|
6547
|
+
var selfMembers = _k[0], realms = _k[1], userId = _k[2];
|
|
6511
6548
|
//console.debug(`PERMS: Result from liveQUery():`, JSON.stringify({selfMembers, realms, userId}, null, 2))
|
|
6512
6549
|
return { selfMembers: selfMembers, realms: realms, userId: userId };
|
|
6513
6550
|
}); }); }); })), {
|
|
@@ -6540,15 +6577,15 @@
|
|
|
6540
6577
|
// TODO: Move to dexie-cloud-common
|
|
6541
6578
|
function mergePermissions() {
|
|
6542
6579
|
var permissions = [];
|
|
6543
|
-
for (var
|
|
6544
|
-
permissions[
|
|
6580
|
+
for (var _k = 0; _k < arguments.length; _k++) {
|
|
6581
|
+
permissions[_k] = arguments[_k];
|
|
6545
6582
|
}
|
|
6546
6583
|
if (permissions.length === 0)
|
|
6547
6584
|
return {};
|
|
6548
6585
|
var reduced = permissions.reduce(function (result, next) {
|
|
6549
|
-
var ret =
|
|
6550
|
-
for (var
|
|
6551
|
-
var
|
|
6586
|
+
var ret = Object.assign({}, result);
|
|
6587
|
+
for (var _k = 0, _l = Object.entries(next); _k < _l.length; _k++) {
|
|
6588
|
+
var _m = _l[_k], verb = _m[0], rights = _m[1];
|
|
6552
6589
|
if (verb in ret && ret[verb]) {
|
|
6553
6590
|
if (ret[verb] === '*')
|
|
6554
6591
|
continue;
|
|
@@ -6566,8 +6603,8 @@
|
|
|
6566
6603
|
typeof ret[verb] === 'object') {
|
|
6567
6604
|
// Both are objects (verb is 'update')
|
|
6568
6605
|
var mergedRights = ret[verb]; // because we've checked that typeof ret[verb] === 'object' and earlier that not ret[verb] === '*'.
|
|
6569
|
-
for (var
|
|
6570
|
-
var
|
|
6606
|
+
for (var _o = 0, _p = Object.entries(rights); _o < _p.length; _o++) {
|
|
6607
|
+
var _q = _p[_o], tableName = _q[0], tableRights = _q[1];
|
|
6571
6608
|
if (mergedRights[tableName] === '*')
|
|
6572
6609
|
continue;
|
|
6573
6610
|
if (tableRights === '*') {
|
|
@@ -6605,8 +6642,8 @@
|
|
|
6605
6642
|
var o = createSharedValueObservable(rxjs.combineLatest([
|
|
6606
6643
|
getInternalAccessControlObservable(db._novip),
|
|
6607
6644
|
getGlobalRolesObservable(db._novip),
|
|
6608
|
-
]).pipe(map(function (
|
|
6609
|
-
var
|
|
6645
|
+
]).pipe(map(function (_k) {
|
|
6646
|
+
var _l = _k[0], selfMembers = _l.selfMembers, realms = _l.realms, userId = _l.userId, globalRoles = _k[1];
|
|
6610
6647
|
return ({
|
|
6611
6648
|
selfMembers: selfMembers,
|
|
6612
6649
|
realms: realms,
|
|
@@ -6619,9 +6656,9 @@
|
|
|
6619
6656
|
userId: UNAUTHORIZED_USER.userId,
|
|
6620
6657
|
globalRoles: {},
|
|
6621
6658
|
});
|
|
6622
|
-
return mapValueObservable(o, function (
|
|
6623
|
-
var
|
|
6624
|
-
var selfMembers =
|
|
6659
|
+
return mapValueObservable(o, function (_k) {
|
|
6660
|
+
var _l;
|
|
6661
|
+
var selfMembers = _k.selfMembers, realms = _k.realms, userId = _k.userId, globalRoles = _k.globalRoles;
|
|
6625
6662
|
var rv = realms
|
|
6626
6663
|
.map(function (realm) {
|
|
6627
6664
|
var selfRealmMembers = selfMembers.filter(function (m) { return m.realmId === realm.realmId; });
|
|
@@ -6632,21 +6669,21 @@
|
|
|
6632
6669
|
.map(function (role) { return globalRoles[role]; })
|
|
6633
6670
|
.filter(function (role) { return role; })
|
|
6634
6671
|
.map(function (role) { return role.permissions; });
|
|
6635
|
-
return
|
|
6672
|
+
return Object.assign(Object.assign({}, realm), { permissions: realm.owner === userId
|
|
6636
6673
|
? { manage: '*' }
|
|
6637
6674
|
: mergePermissions.apply(void 0, __spreadArray$1(__spreadArray$1([], directPermissionSets, false), rolePermissionSets, false)) });
|
|
6638
6675
|
})
|
|
6639
6676
|
.reduce(function (p, c) {
|
|
6640
|
-
var
|
|
6641
|
-
return (
|
|
6642
|
-
}, (
|
|
6643
|
-
|
|
6677
|
+
var _k;
|
|
6678
|
+
return (Object.assign(Object.assign({}, p), (_k = {}, _k[c.realmId] = c, _k)));
|
|
6679
|
+
}, (_l = {},
|
|
6680
|
+
_l[userId] = {
|
|
6644
6681
|
realmId: userId,
|
|
6645
6682
|
owner: userId,
|
|
6646
6683
|
name: userId,
|
|
6647
6684
|
permissions: { manage: '*' },
|
|
6648
6685
|
},
|
|
6649
|
-
|
|
6686
|
+
_l));
|
|
6650
6687
|
return rv;
|
|
6651
6688
|
});
|
|
6652
6689
|
});
|
|
@@ -6658,44 +6695,44 @@
|
|
|
6658
6695
|
}
|
|
6659
6696
|
PermissionChecker.prototype.add = function () {
|
|
6660
6697
|
var _this_1 = this;
|
|
6661
|
-
var _e;
|
|
6662
6698
|
var tableNames = [];
|
|
6663
|
-
for (var
|
|
6664
|
-
tableNames[
|
|
6699
|
+
for (var _k = 0; _k < arguments.length; _k++) {
|
|
6700
|
+
tableNames[_k] = arguments[_k];
|
|
6665
6701
|
}
|
|
6702
|
+
var _a;
|
|
6666
6703
|
// If user can manage the whole realm, return true.
|
|
6667
6704
|
if (this.permissions.manage === '*')
|
|
6668
6705
|
return true;
|
|
6669
6706
|
// If user can manage given table in realm, return true
|
|
6670
|
-
if ((
|
|
6707
|
+
if ((_a = this.permissions.manage) === null || _a === void 0 ? void 0 : _a.includes(this.tableName))
|
|
6671
6708
|
return true;
|
|
6672
6709
|
// If user can add any type, return true
|
|
6673
6710
|
if (this.permissions.add === '*')
|
|
6674
6711
|
return true;
|
|
6675
6712
|
// If user can add objects into given table names in the realm, return true
|
|
6676
|
-
if (tableNames.every(function (tableName) { var
|
|
6713
|
+
if (tableNames.every(function (tableName) { var _a; return (_a = _this_1.permissions.add) === null || _a === void 0 ? void 0 : _a.includes(tableName); })) {
|
|
6677
6714
|
return true;
|
|
6678
6715
|
}
|
|
6679
6716
|
return false;
|
|
6680
6717
|
};
|
|
6681
6718
|
PermissionChecker.prototype.update = function () {
|
|
6682
|
-
var _e, _f;
|
|
6683
6719
|
var props = [];
|
|
6684
|
-
for (var
|
|
6685
|
-
props[
|
|
6720
|
+
for (var _k = 0; _k < arguments.length; _k++) {
|
|
6721
|
+
props[_k] = arguments[_k];
|
|
6686
6722
|
}
|
|
6723
|
+
var _a, _b;
|
|
6687
6724
|
// If user is owner of this object, or if user can manage the whole realm, return true.
|
|
6688
6725
|
if (this.isOwner || this.permissions.manage === '*')
|
|
6689
6726
|
return true;
|
|
6690
6727
|
// If user can manage given table in realm, return true
|
|
6691
|
-
if ((
|
|
6728
|
+
if ((_a = this.permissions.manage) === null || _a === void 0 ? void 0 : _a.includes(this.tableName))
|
|
6692
6729
|
return true;
|
|
6693
6730
|
// If user can update any prop in any table in this realm, return true unless
|
|
6694
6731
|
// it regards to ownership change:
|
|
6695
6732
|
if (this.permissions.update === '*') {
|
|
6696
6733
|
return props.every(function (prop) { return prop !== 'owner'; });
|
|
6697
6734
|
}
|
|
6698
|
-
var tablePermissions = (
|
|
6735
|
+
var tablePermissions = (_b = this.permissions.update) === null || _b === void 0 ? void 0 : _b[this.tableName];
|
|
6699
6736
|
// If user can update any prop in table and realm, return true unless
|
|
6700
6737
|
// accessing special props owner or realmId
|
|
6701
6738
|
if (tablePermissions === '*')
|
|
@@ -6704,12 +6741,12 @@
|
|
|
6704
6741
|
return props.every(function (prop) { return tablePermissions === null || tablePermissions === void 0 ? void 0 : tablePermissions.some(function (permittedProp) { return permittedProp === prop || (permittedProp === '*' && prop !== 'owner'); }); });
|
|
6705
6742
|
};
|
|
6706
6743
|
PermissionChecker.prototype.delete = function () {
|
|
6707
|
-
var
|
|
6744
|
+
var _a;
|
|
6708
6745
|
// If user is owner of this object, or if user can manage the whole realm, return true.
|
|
6709
6746
|
if (this.isOwner || this.permissions.manage === '*')
|
|
6710
6747
|
return true;
|
|
6711
6748
|
// If user can manage given table in realm, return true
|
|
6712
|
-
if ((
|
|
6749
|
+
if ((_a = this.permissions.manage) === null || _a === void 0 ? void 0 : _a.includes(this.tableName))
|
|
6713
6750
|
return true;
|
|
6714
6751
|
return false;
|
|
6715
6752
|
};
|
|
@@ -6743,11 +6780,11 @@
|
|
|
6743
6780
|
var membersByEmail = getCurrentUserEmitter(db._novip).pipe(rxjs.switchMap(function (currentUser) { return Dexie.liveQuery(function () { return db.members.where({ email: currentUser.email || '' }).toArray(); }); }));
|
|
6744
6781
|
var permissions = getPermissionsLookupObservable(db._novip);
|
|
6745
6782
|
var accessControl = getInternalAccessControlObservable(db._novip);
|
|
6746
|
-
return createSharedValueObservable(rxjs.combineLatest([membersByEmail, accessControl, permissions]).pipe(rxjs.map(function (
|
|
6747
|
-
var membersByEmail =
|
|
6783
|
+
return createSharedValueObservable(rxjs.combineLatest([membersByEmail, accessControl, permissions]).pipe(rxjs.map(function (_k) {
|
|
6784
|
+
var membersByEmail = _k[0], accessControl = _k[1], realmLookup = _k[2];
|
|
6748
6785
|
var reducer = function (result, m) {
|
|
6749
|
-
var
|
|
6750
|
-
return (
|
|
6786
|
+
var _k;
|
|
6787
|
+
return (Object.assign(Object.assign({}, result), (_k = {}, _k[m.id] = Object.assign(Object.assign({}, m), { realm: realmLookup[m.realmId] }), _k)));
|
|
6751
6788
|
};
|
|
6752
6789
|
var emailMembersById = membersByEmail.reduce(reducer, {});
|
|
6753
6790
|
var membersById = accessControl.selfMembers.reduce(reducer, emailMembersById);
|
|
@@ -6776,16 +6813,16 @@
|
|
|
6776
6813
|
var localSyncWorker = null;
|
|
6777
6814
|
dexie.on('ready', function (dexie) { return __awaiter$1(_this_1, void 0, void 0, function () {
|
|
6778
6815
|
var error_5;
|
|
6779
|
-
return __generator$1(this, function (
|
|
6780
|
-
switch (
|
|
6816
|
+
return __generator$1(this, function (_k) {
|
|
6817
|
+
switch (_k.label) {
|
|
6781
6818
|
case 0:
|
|
6782
|
-
|
|
6819
|
+
_k.trys.push([0, 2, , 3]);
|
|
6783
6820
|
return [4 /*yield*/, onDbReady(dexie)];
|
|
6784
6821
|
case 1:
|
|
6785
|
-
|
|
6822
|
+
_k.sent();
|
|
6786
6823
|
return [3 /*break*/, 3];
|
|
6787
6824
|
case 2:
|
|
6788
|
-
error_5 =
|
|
6825
|
+
error_5 = _k.sent();
|
|
6789
6826
|
console.error(error_5);
|
|
6790
6827
|
return [3 /*break*/, 3];
|
|
6791
6828
|
case 3: return [2 /*return*/];
|
|
@@ -6807,8 +6844,8 @@
|
|
|
6807
6844
|
currentUserEmitter.next(UNAUTHORIZED_USER);
|
|
6808
6845
|
});
|
|
6809
6846
|
dexie.cloud = {
|
|
6810
|
-
version: '4.0.0-beta.
|
|
6811
|
-
options:
|
|
6847
|
+
version: '4.0.0-beta.20',
|
|
6848
|
+
options: Object.assign({}, DEFAULT_OPTIONS),
|
|
6812
6849
|
schema: null,
|
|
6813
6850
|
serverState: null,
|
|
6814
6851
|
get currentUserId() {
|
|
@@ -6825,16 +6862,16 @@
|
|
|
6825
6862
|
login: function (hint) {
|
|
6826
6863
|
return __awaiter$1(this, void 0, void 0, function () {
|
|
6827
6864
|
var db;
|
|
6828
|
-
return __generator$1(this, function (
|
|
6829
|
-
switch (
|
|
6865
|
+
return __generator$1(this, function (_k) {
|
|
6866
|
+
switch (_k.label) {
|
|
6830
6867
|
case 0:
|
|
6831
6868
|
db = DexieCloudDB(dexie);
|
|
6832
6869
|
return [4 /*yield*/, db.cloud.sync()];
|
|
6833
6870
|
case 1:
|
|
6834
|
-
|
|
6871
|
+
_k.sent();
|
|
6835
6872
|
return [4 /*yield*/, login(db, hint)];
|
|
6836
6873
|
case 2:
|
|
6837
|
-
|
|
6874
|
+
_k.sent();
|
|
6838
6875
|
return [2 /*return*/];
|
|
6839
6876
|
}
|
|
6840
6877
|
});
|
|
@@ -6843,7 +6880,7 @@
|
|
|
6843
6880
|
invites: getInvitesObservable(dexie),
|
|
6844
6881
|
roles: getGlobalRolesObservable(dexie),
|
|
6845
6882
|
configure: function (options) {
|
|
6846
|
-
options = dexie.cloud.options =
|
|
6883
|
+
options = dexie.cloud.options = Object.assign(Object.assign({}, dexie.cloud.options), options);
|
|
6847
6884
|
configuredProgramatically = true;
|
|
6848
6885
|
if (options.databaseUrl && options.nameSuffix) {
|
|
6849
6886
|
// @ts-ignore
|
|
@@ -6852,13 +6889,13 @@
|
|
|
6852
6889
|
}
|
|
6853
6890
|
updateSchemaFromOptions(dexie.cloud.schema, dexie.cloud.options);
|
|
6854
6891
|
},
|
|
6855
|
-
sync: function (
|
|
6856
|
-
var
|
|
6892
|
+
sync: function (_k) {
|
|
6893
|
+
var _l = _k === void 0 ? { wait: true, purpose: 'push' } : _k, wait = _l.wait, purpose = _l.purpose;
|
|
6857
6894
|
return __awaiter$1(this, void 0, void 0, function () {
|
|
6858
6895
|
var db, syncState_1, newSyncState, syncState_2;
|
|
6859
6896
|
var _this_1 = this;
|
|
6860
|
-
return __generator$1(this, function (
|
|
6861
|
-
switch (
|
|
6897
|
+
return __generator$1(this, function (_k) {
|
|
6898
|
+
switch (_k.label) {
|
|
6862
6899
|
case 0:
|
|
6863
6900
|
if (wait === undefined)
|
|
6864
6901
|
wait = true;
|
|
@@ -6872,29 +6909,29 @@
|
|
|
6872
6909
|
(!syncState_1 || newSyncState.timestamp > syncState_1.timestamp); }), take(1))
|
|
6873
6910
|
.toPromise()];
|
|
6874
6911
|
case 1:
|
|
6875
|
-
newSyncState =
|
|
6912
|
+
newSyncState = _k.sent();
|
|
6876
6913
|
if (newSyncState === null || newSyncState === void 0 ? void 0 : newSyncState.error) {
|
|
6877
6914
|
throw new Error("Sync error: " + newSyncState.error);
|
|
6878
6915
|
}
|
|
6879
|
-
|
|
6916
|
+
_k.label = 2;
|
|
6880
6917
|
case 2: return [3 /*break*/, 6];
|
|
6881
6918
|
case 3: return [4 /*yield*/, isSyncNeeded(db)];
|
|
6882
6919
|
case 4:
|
|
6883
|
-
if (!
|
|
6920
|
+
if (!_k.sent()) return [3 /*break*/, 6];
|
|
6884
6921
|
syncState_2 = db.cloud.persistedSyncState.value;
|
|
6885
6922
|
triggerSync(db, purpose);
|
|
6886
6923
|
if (!wait) return [3 /*break*/, 6];
|
|
6887
6924
|
console.debug('db.cloud.login() is waiting for sync completion...');
|
|
6888
6925
|
return [4 /*yield*/, rxjs.from(Dexie.liveQuery(function () { return __awaiter$1(_this_1, void 0, void 0, function () {
|
|
6889
6926
|
var syncNeeded, newSyncState;
|
|
6890
|
-
return __generator$1(this, function (
|
|
6891
|
-
switch (
|
|
6927
|
+
return __generator$1(this, function (_k) {
|
|
6928
|
+
switch (_k.label) {
|
|
6892
6929
|
case 0: return [4 /*yield*/, isSyncNeeded(db)];
|
|
6893
6930
|
case 1:
|
|
6894
|
-
syncNeeded =
|
|
6931
|
+
syncNeeded = _k.sent();
|
|
6895
6932
|
return [4 /*yield*/, db.getPersistedSyncState()];
|
|
6896
6933
|
case 2:
|
|
6897
|
-
newSyncState =
|
|
6934
|
+
newSyncState = _k.sent();
|
|
6898
6935
|
if ((newSyncState === null || newSyncState === void 0 ? void 0 : newSyncState.timestamp) !== (syncState_2 === null || syncState_2 === void 0 ? void 0 : syncState_2.timestamp) &&
|
|
6899
6936
|
(newSyncState === null || newSyncState === void 0 ? void 0 : newSyncState.error))
|
|
6900
6937
|
throw new Error("Sync error: " + newSyncState.error);
|
|
@@ -6905,9 +6942,9 @@
|
|
|
6905
6942
|
.pipe(filter(function (isNeeded) { return !isNeeded; }), take(1))
|
|
6906
6943
|
.toPromise()];
|
|
6907
6944
|
case 5:
|
|
6908
|
-
|
|
6945
|
+
_k.sent();
|
|
6909
6946
|
console.debug('Done waiting for sync completion because we have nothing to push anymore');
|
|
6910
|
-
|
|
6947
|
+
_k.label = 6;
|
|
6911
6948
|
case 6: return [2 /*return*/];
|
|
6912
6949
|
}
|
|
6913
6950
|
});
|
|
@@ -6918,14 +6955,14 @@
|
|
|
6918
6955
|
},
|
|
6919
6956
|
};
|
|
6920
6957
|
dexie.Version.prototype['_parseStoresSpec'] = Dexie__default["default"].override(dexie.Version.prototype['_parseStoresSpec'], function (origFunc) { return overrideParseStoresSpec(origFunc, dexie); });
|
|
6921
|
-
dexie.Table.prototype.newId = function (
|
|
6922
|
-
var
|
|
6958
|
+
dexie.Table.prototype.newId = function (_k) {
|
|
6959
|
+
var _l = _k === void 0 ? {} : _k, colocateWith = _l.colocateWith;
|
|
6923
6960
|
var shardKey = colocateWith && colocateWith.substr(colocateWith.length - 3);
|
|
6924
6961
|
return generateKey(dexie.cloud.schema[this.name].idPrefix || '', shardKey);
|
|
6925
6962
|
};
|
|
6926
6963
|
dexie.Table.prototype.idPrefix = function () {
|
|
6927
|
-
var
|
|
6928
|
-
return ((
|
|
6964
|
+
var _a, _b;
|
|
6965
|
+
return ((_b = (_a = this.db.cloud.schema) === null || _a === void 0 ? void 0 : _a[this.name]) === null || _b === void 0 ? void 0 : _b.idPrefix) || '';
|
|
6929
6966
|
};
|
|
6930
6967
|
dexie.use(createMutationTrackingMiddleware({
|
|
6931
6968
|
currentUserObservable: dexie.cloud.currentUser,
|
|
@@ -6934,20 +6971,22 @@
|
|
|
6934
6971
|
dexie.use(createImplicitPropSetterMiddleware(DexieCloudDB(dexie)));
|
|
6935
6972
|
dexie.use(createIdGenerationMiddleware(DexieCloudDB(dexie)));
|
|
6936
6973
|
function onDbReady(dexie) {
|
|
6937
|
-
var
|
|
6974
|
+
var _a, _b, _c, _d, _e, _f, _g;
|
|
6938
6975
|
return __awaiter$1(this, void 0, void 0, function () {
|
|
6939
|
-
var db, swRegistrations,
|
|
6976
|
+
var db, swRegistrations, _k, initiallySynced;
|
|
6940
6977
|
var _this_1 = this;
|
|
6941
|
-
return __generator$1(this, function (
|
|
6942
|
-
switch (
|
|
6978
|
+
return __generator$1(this, function (_l) {
|
|
6979
|
+
switch (_l.label) {
|
|
6943
6980
|
case 0:
|
|
6944
6981
|
closed = false; // As Dexie calls us, we are not closed anymore. Maybe reopened? Remember db.ready event is registered with sticky flag!
|
|
6945
6982
|
db = DexieCloudDB(dexie);
|
|
6946
6983
|
// Setup default GUI:
|
|
6947
|
-
if (
|
|
6948
|
-
if (!((
|
|
6984
|
+
if (typeof window !== 'undefined' && typeof document !== 'undefined') {
|
|
6985
|
+
if (!((_a = db.cloud.options) === null || _a === void 0 ? void 0 : _a.customLoginGui)) {
|
|
6949
6986
|
subscriptions.push(setupDefaultGUI(dexie));
|
|
6950
6987
|
}
|
|
6988
|
+
}
|
|
6989
|
+
if (!db.cloud.isServiceWorkerDB) {
|
|
6951
6990
|
subscriptions.push(computeSyncState(db).subscribe(dexie.cloud.syncState));
|
|
6952
6991
|
}
|
|
6953
6992
|
//verifyConfig(db.cloud.options); Not needed (yet at least!)
|
|
@@ -6958,27 +6997,26 @@
|
|
|
6958
6997
|
if (!('serviceWorker' in navigator)) return [3 /*break*/, 2];
|
|
6959
6998
|
return [4 /*yield*/, navigator.serviceWorker.getRegistrations()];
|
|
6960
6999
|
case 1:
|
|
6961
|
-
|
|
7000
|
+
_k = _l.sent();
|
|
6962
7001
|
return [3 /*break*/, 3];
|
|
6963
7002
|
case 2:
|
|
6964
|
-
|
|
6965
|
-
|
|
7003
|
+
_k = [];
|
|
7004
|
+
_l.label = 3;
|
|
6966
7005
|
case 3:
|
|
6967
|
-
swRegistrations =
|
|
7006
|
+
swRegistrations = _k;
|
|
6968
7007
|
return [4 /*yield*/, db.transaction('rw', db.$syncState, function () { return __awaiter$1(_this_1, void 0, void 0, function () {
|
|
6969
|
-
var
|
|
6970
|
-
|
|
6971
|
-
|
|
6972
|
-
switch (_m.label) {
|
|
7008
|
+
var _h, _j, _k, options, schema, _l, persistedOptions, persistedSchema, persistedSyncState, newPersistedSchema, _m, _o, _p, table, tblSchema, newTblSchema;
|
|
7009
|
+
return __generator$1(this, function (_q) {
|
|
7010
|
+
switch (_q.label) {
|
|
6973
7011
|
case 0:
|
|
6974
|
-
|
|
7012
|
+
_k = db.cloud, options = _k.options, schema = _k.schema;
|
|
6975
7013
|
return [4 /*yield*/, Promise.all([
|
|
6976
7014
|
db.getOptions(),
|
|
6977
7015
|
db.getSchema(),
|
|
6978
7016
|
db.getPersistedSyncState(),
|
|
6979
7017
|
])];
|
|
6980
7018
|
case 1:
|
|
6981
|
-
|
|
7019
|
+
_l = _q.sent(), persistedOptions = _l[0], persistedSchema = _l[1], persistedSyncState = _l[2];
|
|
6982
7020
|
if (!!configuredProgramatically) return [3 /*break*/, 2];
|
|
6983
7021
|
// Options not specified programatically (use case for SW!)
|
|
6984
7022
|
// Take persisted options:
|
|
@@ -6992,10 +7030,10 @@
|
|
|
6992
7030
|
throw new Error("Internal error"); // options cannot be null if configuredProgramatically is set.
|
|
6993
7031
|
return [4 /*yield*/, db.$syncState.put(options, 'options')];
|
|
6994
7032
|
case 3:
|
|
6995
|
-
|
|
6996
|
-
|
|
7033
|
+
_q.sent();
|
|
7034
|
+
_q.label = 4;
|
|
6997
7035
|
case 4:
|
|
6998
|
-
if (((
|
|
7036
|
+
if (((_h = db.cloud.options) === null || _h === void 0 ? void 0 : _h.tryUseServiceWorker) &&
|
|
6999
7037
|
'serviceWorker' in navigator &&
|
|
7000
7038
|
swRegistrations.length > 0 &&
|
|
7001
7039
|
!DISABLE_SERVICEWORKER_STRATEGY) {
|
|
@@ -7009,7 +7047,8 @@
|
|
|
7009
7047
|
// Not configured for using service worker or no service worker
|
|
7010
7048
|
// registration exists. Don't rely on service worker to do any job.
|
|
7011
7049
|
// Use LocalSyncWorker instead.
|
|
7012
|
-
if (((
|
|
7050
|
+
if (((_j = db.cloud.options) === null || _j === void 0 ? void 0 : _j.tryUseServiceWorker) &&
|
|
7051
|
+
!db.cloud.isServiceWorkerDB) {
|
|
7013
7052
|
console.debug('dexie-cloud-addon: Not using service worker.', swRegistrations.length === 0
|
|
7014
7053
|
? 'No SW registrations found.'
|
|
7015
7054
|
: 'serviceWorker' in navigator && DISABLE_SERVICEWORKER_STRATEGY
|
|
@@ -7029,11 +7068,11 @@
|
|
|
7029
7068
|
if (!(!persistedSchema ||
|
|
7030
7069
|
JSON.stringify(persistedSchema) !== JSON.stringify(schema))) return [3 /*break*/, 7];
|
|
7031
7070
|
newPersistedSchema = persistedSchema || {};
|
|
7032
|
-
for (
|
|
7033
|
-
|
|
7071
|
+
for (_m = 0, _o = Object.entries(schema); _m < _o.length; _m++) {
|
|
7072
|
+
_p = _o[_m], table = _p[0], tblSchema = _p[1];
|
|
7034
7073
|
newTblSchema = newPersistedSchema[table];
|
|
7035
7074
|
if (!newTblSchema) {
|
|
7036
|
-
newPersistedSchema[table] =
|
|
7075
|
+
newPersistedSchema[table] = Object.assign({}, tblSchema);
|
|
7037
7076
|
}
|
|
7038
7077
|
else {
|
|
7039
7078
|
newTblSchema.markedForSync = tblSchema.markedForSync;
|
|
@@ -7043,31 +7082,31 @@
|
|
|
7043
7082
|
}
|
|
7044
7083
|
return [4 /*yield*/, db.$syncState.put(newPersistedSchema, 'schema')];
|
|
7045
7084
|
case 6:
|
|
7046
|
-
|
|
7085
|
+
_q.sent();
|
|
7047
7086
|
// Make sure persisted table prefixes are being used instead of computed ones:
|
|
7048
7087
|
// Let's assign all props as the newPersistedSchems should be what we should be working with.
|
|
7049
7088
|
Object.assign(schema, newPersistedSchema);
|
|
7050
|
-
|
|
7089
|
+
_q.label = 7;
|
|
7051
7090
|
case 7: return [2 /*return*/, persistedSyncState === null || persistedSyncState === void 0 ? void 0 : persistedSyncState.initiallySynced];
|
|
7052
7091
|
}
|
|
7053
7092
|
});
|
|
7054
7093
|
}); })];
|
|
7055
7094
|
case 4:
|
|
7056
|
-
initiallySynced =
|
|
7095
|
+
initiallySynced = _l.sent();
|
|
7057
7096
|
if (initiallySynced) {
|
|
7058
7097
|
db.setInitiallySynced(true);
|
|
7059
7098
|
}
|
|
7060
7099
|
verifySchema(db);
|
|
7061
|
-
if (!(((
|
|
7100
|
+
if (!(((_b = db.cloud.options) === null || _b === void 0 ? void 0 : _b.databaseUrl) && !initiallySynced)) return [3 /*break*/, 6];
|
|
7062
7101
|
return [4 /*yield*/, performInitialSync(db, db.cloud.options, db.cloud.schema)];
|
|
7063
7102
|
case 5:
|
|
7064
|
-
|
|
7103
|
+
_l.sent();
|
|
7065
7104
|
db.setInitiallySynced(true);
|
|
7066
|
-
|
|
7105
|
+
_l.label = 6;
|
|
7067
7106
|
case 6:
|
|
7068
7107
|
// Manage CurrentUser observable:
|
|
7069
7108
|
throwIfClosed();
|
|
7070
|
-
if (!!
|
|
7109
|
+
if (!!db.cloud.isServiceWorkerDB) return [3 /*break*/, 8];
|
|
7071
7110
|
subscriptions.push(Dexie.liveQuery(function () { return db.getCurrentUser(); }).subscribe(currentUserEmitter));
|
|
7072
7111
|
// Manage PersistendSyncState observable:
|
|
7073
7112
|
subscriptions.push(Dexie.liveQuery(function () { return db.getPersistedSyncState(); }).subscribe(db.cloud.persistedSyncState));
|
|
@@ -7084,26 +7123,26 @@
|
|
|
7084
7123
|
// with things from the database and not just the default values.
|
|
7085
7124
|
// This is so that when db.open() completes, user should be safe
|
|
7086
7125
|
// to subscribe to these observables and get actual data.
|
|
7087
|
-
|
|
7088
|
-
|
|
7126
|
+
_l.sent();
|
|
7127
|
+
_l.label = 8;
|
|
7089
7128
|
case 8:
|
|
7090
|
-
if (!((
|
|
7129
|
+
if (!((_c = db.cloud.options) === null || _c === void 0 ? void 0 : _c.requireAuth)) return [3 /*break*/, 10];
|
|
7091
7130
|
return [4 /*yield*/, login(db)];
|
|
7092
7131
|
case 9:
|
|
7093
|
-
|
|
7094
|
-
|
|
7132
|
+
_l.sent();
|
|
7133
|
+
_l.label = 10;
|
|
7095
7134
|
case 10:
|
|
7096
7135
|
if (localSyncWorker)
|
|
7097
7136
|
localSyncWorker.stop();
|
|
7098
7137
|
localSyncWorker = null;
|
|
7099
7138
|
throwIfClosed();
|
|
7100
|
-
if (db.cloud.usingServiceWorker && ((
|
|
7139
|
+
if (db.cloud.usingServiceWorker && ((_d = db.cloud.options) === null || _d === void 0 ? void 0 : _d.databaseUrl)) {
|
|
7101
7140
|
registerSyncEvent(db, 'push').catch(function () { });
|
|
7102
7141
|
registerPeriodicSyncEvent(db).catch(function () { });
|
|
7103
7142
|
}
|
|
7104
|
-
else if (((
|
|
7143
|
+
else if (((_e = db.cloud.options) === null || _e === void 0 ? void 0 : _e.databaseUrl) &&
|
|
7105
7144
|
db.cloud.schema &&
|
|
7106
|
-
!
|
|
7145
|
+
!db.cloud.isServiceWorkerDB) {
|
|
7107
7146
|
// There's no SW. Start SyncWorker instead.
|
|
7108
7147
|
localSyncWorker = LocalSyncWorker(db, db.cloud.options, db.cloud.schema);
|
|
7109
7148
|
localSyncWorker.start();
|
|
@@ -7111,7 +7150,7 @@
|
|
|
7111
7150
|
}
|
|
7112
7151
|
// Listen to online event and do sync.
|
|
7113
7152
|
throwIfClosed();
|
|
7114
|
-
if (!
|
|
7153
|
+
if (!db.cloud.isServiceWorkerDB) {
|
|
7115
7154
|
subscriptions.push(rxjs.fromEvent(self, 'online').subscribe(function () {
|
|
7116
7155
|
console.debug('online!');
|
|
7117
7156
|
db.syncStateChangedEvent.next({
|
|
@@ -7125,10 +7164,10 @@
|
|
|
7125
7164
|
});
|
|
7126
7165
|
}));
|
|
7127
7166
|
}
|
|
7128
|
-
// Connect WebSocket
|
|
7129
|
-
if (
|
|
7130
|
-
!
|
|
7131
|
-
|
|
7167
|
+
// Connect WebSocket unless we
|
|
7168
|
+
if (((_f = db.cloud.options) === null || _f === void 0 ? void 0 : _f.databaseUrl) &&
|
|
7169
|
+
!((_g = db.cloud.options) === null || _g === void 0 ? void 0 : _g.disableWebSocket) &&
|
|
7170
|
+
!IS_SERVICE_WORKER) {
|
|
7132
7171
|
subscriptions.push(connectWebSocket(db));
|
|
7133
7172
|
}
|
|
7134
7173
|
return [2 /*return*/];
|
|
@@ -7137,7 +7176,7 @@
|
|
|
7137
7176
|
});
|
|
7138
7177
|
}
|
|
7139
7178
|
}
|
|
7140
|
-
dexieCloud.version = '4.0.0-beta.
|
|
7179
|
+
dexieCloud.version = '4.0.0-beta.20';
|
|
7141
7180
|
Dexie__default["default"].Cloud = dexieCloud;
|
|
7142
7181
|
|
|
7143
7182
|
exports["default"] = dexieCloud;
|