dexie-cloud-addon 4.0.0-beta.16 → 4.0.0-beta.19
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 +1641 -1591
- 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 +1705 -1649
- 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 +804 -780
- 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/DexieCloudOptions.d.ts +1 -0
- package/dist/umd/dexie-cloud-addon.js +804 -780
- 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 +1704 -1648
- 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 +1637 -1587
- package/dist/umd-modern/dexie-cloud-addon.js.map +1 -1
- package/package.json +2 -2
|
@@ -43,7 +43,7 @@ var __assign = function() {
|
|
|
43
43
|
return __assign.apply(this, arguments);
|
|
44
44
|
};
|
|
45
45
|
|
|
46
|
-
function __awaiter$
|
|
46
|
+
function __awaiter$2(thisArg, _arguments, P, generator) {
|
|
47
47
|
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
|
|
48
48
|
return new (P || (P = Promise))(function (resolve, reject) {
|
|
49
49
|
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
|
|
@@ -101,13 +101,46 @@ function __spreadArray$1(to, from, pack) {
|
|
|
101
101
|
*
|
|
102
102
|
* ==========================================================================
|
|
103
103
|
*
|
|
104
|
-
* Version 4.0.0-beta.
|
|
104
|
+
* Version 4.0.0-beta.19, Fri May 20 2022
|
|
105
105
|
*
|
|
106
106
|
* https://dexie.org
|
|
107
107
|
*
|
|
108
108
|
* Apache License Version 2.0, January 2004, http://www.apache.org/licenses/
|
|
109
109
|
*
|
|
110
110
|
*/
|
|
111
|
+
/*! *****************************************************************************
|
|
112
|
+
Copyright (c) Microsoft Corporation.
|
|
113
|
+
|
|
114
|
+
Permission to use, copy, modify, and/or distribute this software for any
|
|
115
|
+
purpose with or without fee is hereby granted.
|
|
116
|
+
|
|
117
|
+
THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH
|
|
118
|
+
REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
|
|
119
|
+
AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT,
|
|
120
|
+
INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM
|
|
121
|
+
LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR
|
|
122
|
+
OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
|
|
123
|
+
PERFORMANCE OF THIS SOFTWARE.
|
|
124
|
+
***************************************************************************** */
|
|
125
|
+
function __awaiter$1(thisArg, _arguments, P, generator) {
|
|
126
|
+
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
|
|
127
|
+
return new (P || (P = Promise))(function (resolve, reject) {
|
|
128
|
+
function fulfilled(value) { try {
|
|
129
|
+
step(generator.next(value));
|
|
130
|
+
}
|
|
131
|
+
catch (e) {
|
|
132
|
+
reject(e);
|
|
133
|
+
} }
|
|
134
|
+
function rejected(value) { try {
|
|
135
|
+
step(generator["throw"](value));
|
|
136
|
+
}
|
|
137
|
+
catch (e) {
|
|
138
|
+
reject(e);
|
|
139
|
+
} }
|
|
140
|
+
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
|
|
141
|
+
step((generator = generator.apply(thisArg, _arguments || [])).next());
|
|
142
|
+
});
|
|
143
|
+
}
|
|
111
144
|
//@ts-check
|
|
112
145
|
var randomFillSync = crypto.getRandomValues;
|
|
113
146
|
function assert(b) {
|
|
@@ -240,8 +273,8 @@ function applyOperation(target, table, op) {
|
|
|
240
273
|
switch (entry.type) {
|
|
241
274
|
case "ups":
|
|
242
275
|
// Adjust the existing upsert with additional updates
|
|
243
|
-
for (var
|
|
244
|
-
var
|
|
276
|
+
for (var _k = 0, _l = Object.entries(changeSpec); _k < _l.length; _k++) {
|
|
277
|
+
var _m = _l[_k], propPath = _m[0], value = _m[1];
|
|
245
278
|
setByKeyPath(entry.val, propPath, value);
|
|
246
279
|
}
|
|
247
280
|
break;
|
|
@@ -268,10 +301,10 @@ function applyOperation(target, table, op) {
|
|
|
268
301
|
return target;
|
|
269
302
|
}
|
|
270
303
|
function applyOperations(target, ops) {
|
|
271
|
-
for (var
|
|
272
|
-
var
|
|
273
|
-
for (var
|
|
274
|
-
var mut = muts_1[
|
|
304
|
+
for (var _k = 0, ops_1 = ops; _k < ops_1.length; _k++) {
|
|
305
|
+
var _l = ops_1[_k], table = _l.table, muts = _l.muts;
|
|
306
|
+
for (var _m = 0, muts_1 = muts; _m < muts_1.length; _m++) {
|
|
307
|
+
var mut = muts_1[_m];
|
|
275
308
|
applyOperation(target, table, mut);
|
|
276
309
|
}
|
|
277
310
|
}
|
|
@@ -280,10 +313,10 @@ function subtractChanges(target, // Server change set
|
|
|
280
313
|
changesToSubtract // additional mutations on client during syncWithServer()
|
|
281
314
|
) {
|
|
282
315
|
var _a, _b, _c;
|
|
283
|
-
for (var
|
|
284
|
-
var
|
|
285
|
-
for (var
|
|
286
|
-
var
|
|
316
|
+
for (var _k = 0, _l = Object.entries(changesToSubtract); _k < _l.length; _k++) {
|
|
317
|
+
var _m = _l[_k], table = _m[0], mutationSet = _m[1];
|
|
318
|
+
for (var _o = 0, _p = Object.entries(mutationSet); _o < _p.length; _o++) {
|
|
319
|
+
var _q = _p[_o], key = _q[0], mut = _q[1];
|
|
287
320
|
switch (mut.type) {
|
|
288
321
|
case 'ups':
|
|
289
322
|
{
|
|
@@ -313,8 +346,8 @@ changesToSubtract // additional mutations on client during syncWithServer()
|
|
|
313
346
|
switch (targetMut.type) {
|
|
314
347
|
case 'ups':
|
|
315
348
|
// Adjust the server upsert with locally updated values.
|
|
316
|
-
for (var
|
|
317
|
-
var
|
|
349
|
+
for (var _r = 0, _s = Object.entries(mut.mod); _r < _s.length; _r++) {
|
|
350
|
+
var _t = _s[_r], propPath = _t[0], value = _t[1];
|
|
318
351
|
setByKeyPath(targetMut.val, propPath, value);
|
|
319
352
|
}
|
|
320
353
|
break;
|
|
@@ -323,8 +356,8 @@ changesToSubtract // additional mutations on client during syncWithServer()
|
|
|
323
356
|
break;
|
|
324
357
|
case 'upd':
|
|
325
358
|
// Remove the local update props from the server update mutation.
|
|
326
|
-
for (var
|
|
327
|
-
var propPath =
|
|
359
|
+
for (var _u = 0, _v = Object.keys(mut.mod); _u < _v.length; _u++) {
|
|
360
|
+
var propPath = _v[_u];
|
|
328
361
|
delete targetMut.mod[propPath];
|
|
329
362
|
}
|
|
330
363
|
break;
|
|
@@ -347,10 +380,10 @@ function toDBOperationSet(inSet) {
|
|
|
347
380
|
var txid = randomString$1(16);
|
|
348
381
|
// Convert data into a temporary map to collect mutations of same table and type
|
|
349
382
|
var map = {};
|
|
350
|
-
for (var
|
|
351
|
-
var
|
|
352
|
-
for (var
|
|
353
|
-
var
|
|
383
|
+
for (var _k = 0, _l = Object.entries(inSet); _k < _l.length; _k++) {
|
|
384
|
+
var _m = _l[_k], table = _m[0], ops = _m[1];
|
|
385
|
+
for (var _o = 0, _p = Object.entries(ops); _o < _p.length; _o++) {
|
|
386
|
+
var _q = _p[_o], key = _q[0], op = _q[1];
|
|
354
387
|
var mapEntry = map[table] || (map[table] = {});
|
|
355
388
|
var ops_2 = mapEntry[op.type] || (mapEntry[op.type] = []);
|
|
356
389
|
ops_2.push(Object.assign({ key: key }, op)); // DBKeyMutation doesn't contain key, so we need to bring it in.
|
|
@@ -358,14 +391,14 @@ function toDBOperationSet(inSet) {
|
|
|
358
391
|
}
|
|
359
392
|
// Start computing the resulting format:
|
|
360
393
|
var result = [];
|
|
361
|
-
for (var
|
|
362
|
-
var
|
|
394
|
+
for (var _r = 0, _s = Object.entries(map); _r < _s.length; _r++) {
|
|
395
|
+
var _t = _s[_r], table = _t[0], ops = _t[1];
|
|
363
396
|
var resultEntry = {
|
|
364
397
|
table: table,
|
|
365
398
|
muts: [],
|
|
366
399
|
};
|
|
367
|
-
for (var
|
|
368
|
-
var
|
|
400
|
+
for (var _u = 0, _v = Object.entries(ops); _u < _v.length; _u++) {
|
|
401
|
+
var _w = _v[_u], optype = _w[0], muts = _w[1];
|
|
369
402
|
switch (optype) {
|
|
370
403
|
case "ups": {
|
|
371
404
|
var op = {
|
|
@@ -2012,18 +2045,18 @@ var hasComplainedAboutSyncEvent = false;
|
|
|
2012
2045
|
function registerSyncEvent(db, purpose) {
|
|
2013
2046
|
return __awaiter$1(this, void 0, void 0, function () {
|
|
2014
2047
|
var sw, e_3;
|
|
2015
|
-
return __generator$1(this, function (
|
|
2016
|
-
switch (
|
|
2048
|
+
return __generator$1(this, function (_k) {
|
|
2049
|
+
switch (_k.label) {
|
|
2017
2050
|
case 0:
|
|
2018
|
-
|
|
2051
|
+
_k.trys.push([0, 4, , 5]);
|
|
2019
2052
|
return [4 /*yield*/, navigator.serviceWorker.ready];
|
|
2020
2053
|
case 1:
|
|
2021
|
-
sw =
|
|
2054
|
+
sw = _k.sent();
|
|
2022
2055
|
if (!(purpose === "push" && sw.sync)) return [3 /*break*/, 3];
|
|
2023
2056
|
return [4 /*yield*/, sw.sync.register("dexie-cloud:".concat(db.name))];
|
|
2024
2057
|
case 2:
|
|
2025
|
-
|
|
2026
|
-
|
|
2058
|
+
_k.sent();
|
|
2059
|
+
_k.label = 3;
|
|
2027
2060
|
case 3:
|
|
2028
2061
|
if (sw.active) {
|
|
2029
2062
|
// Use postMessage for pull syncs and for browsers not supporting sync event (Firefox, Safari).
|
|
@@ -2039,7 +2072,7 @@ function registerSyncEvent(db, purpose) {
|
|
|
2039
2072
|
}
|
|
2040
2073
|
return [2 /*return*/];
|
|
2041
2074
|
case 4:
|
|
2042
|
-
e_3 =
|
|
2075
|
+
e_3 = _k.sent();
|
|
2043
2076
|
if (!hasComplainedAboutSyncEvent) {
|
|
2044
2077
|
console.debug("Dexie Cloud: Could not register sync event", e_3);
|
|
2045
2078
|
hasComplainedAboutSyncEvent = true;
|
|
@@ -2051,36 +2084,36 @@ function registerSyncEvent(db, purpose) {
|
|
|
2051
2084
|
});
|
|
2052
2085
|
}
|
|
2053
2086
|
function registerPeriodicSyncEvent(db) {
|
|
2054
|
-
var
|
|
2087
|
+
var _a;
|
|
2055
2088
|
return __awaiter$1(this, void 0, void 0, function () {
|
|
2056
2089
|
var periodicSync, e_4, e_5;
|
|
2057
|
-
return __generator$1(this, function (
|
|
2058
|
-
switch (
|
|
2090
|
+
return __generator$1(this, function (_k) {
|
|
2091
|
+
switch (_k.label) {
|
|
2059
2092
|
case 0:
|
|
2060
|
-
|
|
2093
|
+
_k.trys.push([0, 8, , 9]);
|
|
2061
2094
|
return [4 /*yield*/, navigator.serviceWorker.ready];
|
|
2062
2095
|
case 1:
|
|
2063
|
-
periodicSync = (
|
|
2096
|
+
periodicSync = (_k.sent()).periodicSync;
|
|
2064
2097
|
if (!periodicSync) return [3 /*break*/, 6];
|
|
2065
|
-
|
|
2098
|
+
_k.label = 2;
|
|
2066
2099
|
case 2:
|
|
2067
|
-
|
|
2068
|
-
return [4 /*yield*/, periodicSync.register("dexie-cloud:".concat(db.name), (
|
|
2100
|
+
_k.trys.push([2, 4, , 5]);
|
|
2101
|
+
return [4 /*yield*/, periodicSync.register("dexie-cloud:".concat(db.name), (_a = db.cloud.options) === null || _a === void 0 ? void 0 : _a.periodicSync)];
|
|
2069
2102
|
case 3:
|
|
2070
|
-
|
|
2103
|
+
_k.sent();
|
|
2071
2104
|
console.debug("Dexie Cloud: Successfully registered periodicsync event for ".concat(db.name));
|
|
2072
2105
|
return [3 /*break*/, 5];
|
|
2073
2106
|
case 4:
|
|
2074
|
-
e_4 =
|
|
2107
|
+
e_4 = _k.sent();
|
|
2075
2108
|
console.debug("Dexie Cloud: Failed to register periodic sync. Your PWA must be installed to allow background sync.", e_4);
|
|
2076
2109
|
return [3 /*break*/, 5];
|
|
2077
2110
|
case 5: return [3 /*break*/, 7];
|
|
2078
2111
|
case 6:
|
|
2079
2112
|
console.debug("Dexie Cloud: periodicSync not supported.");
|
|
2080
|
-
|
|
2113
|
+
_k.label = 7;
|
|
2081
2114
|
case 7: return [3 /*break*/, 9];
|
|
2082
2115
|
case 8:
|
|
2083
|
-
e_5 =
|
|
2116
|
+
e_5 = _k.sent();
|
|
2084
2117
|
console.debug("Dexie Cloud: Could not register periodicSync for ".concat(db.name), e_5);
|
|
2085
2118
|
return [3 /*break*/, 9];
|
|
2086
2119
|
case 9: return [2 /*return*/];
|
|
@@ -2114,7 +2147,7 @@ var b64encode = typeof Buffer !== "undefined"
|
|
|
2114
2147
|
: function (b) { return btoa(String.fromCharCode.apply(null, b)); };
|
|
2115
2148
|
function interactWithUser(userInteraction, req) {
|
|
2116
2149
|
return new Promise(function (resolve, reject) {
|
|
2117
|
-
var interactionProps =
|
|
2150
|
+
var interactionProps = Object.assign(Object.assign({}, req), { onSubmit: function (res) {
|
|
2118
2151
|
userInteraction.next(undefined);
|
|
2119
2152
|
resolve(res);
|
|
2120
2153
|
}, onCancel: function () {
|
|
@@ -2135,8 +2168,8 @@ function interactWithUser(userInteraction, req) {
|
|
|
2135
2168
|
}
|
|
2136
2169
|
function alertUser(userInteraction, title) {
|
|
2137
2170
|
var alerts = [];
|
|
2138
|
-
for (var
|
|
2139
|
-
alerts[
|
|
2171
|
+
for (var _k = 2; _k < arguments.length; _k++) {
|
|
2172
|
+
alerts[_k - 2] = arguments[_k];
|
|
2140
2173
|
}
|
|
2141
2174
|
return interactWithUser(userInteraction, {
|
|
2142
2175
|
type: 'message-alert',
|
|
@@ -2148,11 +2181,11 @@ function alertUser(userInteraction, title) {
|
|
|
2148
2181
|
function promptForEmail(userInteraction, title, emailHint) {
|
|
2149
2182
|
return __awaiter$1(this, void 0, void 0, function () {
|
|
2150
2183
|
var email;
|
|
2151
|
-
return __generator$1(this, function (
|
|
2152
|
-
switch (
|
|
2184
|
+
return __generator$1(this, function (_k) {
|
|
2185
|
+
switch (_k.label) {
|
|
2153
2186
|
case 0:
|
|
2154
2187
|
email = emailHint || '';
|
|
2155
|
-
|
|
2188
|
+
_k.label = 1;
|
|
2156
2189
|
case 1:
|
|
2157
2190
|
if (!(!email || !/^[\w-\.]+@([\w-]+\.)+[\w-]{2,10}$/.test(email))) return [3 /*break*/, 3];
|
|
2158
2191
|
return [4 /*yield*/, interactWithUser(userInteraction, {
|
|
@@ -2176,7 +2209,7 @@ function promptForEmail(userInteraction, title, emailHint) {
|
|
|
2176
2209
|
},
|
|
2177
2210
|
})];
|
|
2178
2211
|
case 2:
|
|
2179
|
-
email = (
|
|
2212
|
+
email = (_k.sent()).email;
|
|
2180
2213
|
return [3 /*break*/, 1];
|
|
2181
2214
|
case 3: return [2 /*return*/, email];
|
|
2182
2215
|
}
|
|
@@ -2186,8 +2219,8 @@ function promptForEmail(userInteraction, title, emailHint) {
|
|
|
2186
2219
|
function promptForOTP(userInteraction, email, alert) {
|
|
2187
2220
|
return __awaiter$1(this, void 0, void 0, function () {
|
|
2188
2221
|
var alerts, otp;
|
|
2189
|
-
return __generator$1(this, function (
|
|
2190
|
-
switch (
|
|
2222
|
+
return __generator$1(this, function (_k) {
|
|
2223
|
+
switch (_k.label) {
|
|
2191
2224
|
case 0:
|
|
2192
2225
|
alerts = [
|
|
2193
2226
|
{
|
|
@@ -2213,44 +2246,44 @@ function promptForOTP(userInteraction, email, alert) {
|
|
|
2213
2246
|
},
|
|
2214
2247
|
})];
|
|
2215
2248
|
case 1:
|
|
2216
|
-
otp = (
|
|
2249
|
+
otp = (_k.sent()).otp;
|
|
2217
2250
|
return [2 /*return*/, otp];
|
|
2218
2251
|
}
|
|
2219
2252
|
});
|
|
2220
2253
|
});
|
|
2221
2254
|
}
|
|
2222
2255
|
function loadAccessToken(db) {
|
|
2223
|
-
var
|
|
2256
|
+
var _a, _b;
|
|
2224
2257
|
return __awaiter$1(this, void 0, void 0, function () {
|
|
2225
2258
|
var currentUser, accessToken, accessTokenExpiration, refreshToken, refreshTokenExpiration, claims, expTime, refreshExpTime, refreshedLogin;
|
|
2226
|
-
return __generator$1(this, function (
|
|
2227
|
-
switch (
|
|
2259
|
+
return __generator$1(this, function (_k) {
|
|
2260
|
+
switch (_k.label) {
|
|
2228
2261
|
case 0: return [4 /*yield*/, db.getCurrentUser()];
|
|
2229
2262
|
case 1:
|
|
2230
|
-
currentUser =
|
|
2263
|
+
currentUser = _k.sent();
|
|
2231
2264
|
accessToken = currentUser.accessToken, accessTokenExpiration = currentUser.accessTokenExpiration, refreshToken = currentUser.refreshToken, refreshTokenExpiration = currentUser.refreshTokenExpiration, claims = currentUser.claims;
|
|
2232
2265
|
if (!accessToken)
|
|
2233
2266
|
return [2 /*return*/];
|
|
2234
|
-
expTime = (
|
|
2267
|
+
expTime = (_a = accessTokenExpiration === null || accessTokenExpiration === void 0 ? void 0 : accessTokenExpiration.getTime()) !== null && _a !== void 0 ? _a : Infinity;
|
|
2235
2268
|
if (expTime > Date.now()) {
|
|
2236
2269
|
return [2 /*return*/, accessToken];
|
|
2237
2270
|
}
|
|
2238
2271
|
if (!refreshToken) {
|
|
2239
2272
|
throw new Error("Refresh token missing");
|
|
2240
2273
|
}
|
|
2241
|
-
refreshExpTime = (
|
|
2274
|
+
refreshExpTime = (_b = refreshTokenExpiration === null || refreshTokenExpiration === void 0 ? void 0 : refreshTokenExpiration.getTime()) !== null && _b !== void 0 ? _b : Infinity;
|
|
2242
2275
|
if (refreshExpTime <= Date.now()) {
|
|
2243
2276
|
throw new Error("Refresh token has expired");
|
|
2244
2277
|
}
|
|
2245
2278
|
return [4 /*yield*/, refreshAccessToken(db.cloud.options.databaseUrl, currentUser)];
|
|
2246
2279
|
case 2:
|
|
2247
|
-
refreshedLogin =
|
|
2280
|
+
refreshedLogin = _k.sent();
|
|
2248
2281
|
return [4 /*yield*/, db.table('$logins').update(claims.sub, {
|
|
2249
2282
|
accessToken: refreshedLogin.accessToken,
|
|
2250
2283
|
accessTokenExpiration: refreshedLogin.accessTokenExpiration,
|
|
2251
2284
|
})];
|
|
2252
2285
|
case 3:
|
|
2253
|
-
|
|
2286
|
+
_k.sent();
|
|
2254
2287
|
return [2 /*return*/, refreshedLogin.accessToken];
|
|
2255
2288
|
}
|
|
2256
2289
|
});
|
|
@@ -2258,8 +2291,8 @@ function loadAccessToken(db) {
|
|
|
2258
2291
|
}
|
|
2259
2292
|
function authenticate(url, context, fetchToken, userInteraction, hints) {
|
|
2260
2293
|
return __awaiter$1(this, void 0, void 0, function () {
|
|
2261
|
-
return __generator$1(this, function (
|
|
2262
|
-
switch (
|
|
2294
|
+
return __generator$1(this, function (_k) {
|
|
2295
|
+
switch (_k.label) {
|
|
2263
2296
|
case 0:
|
|
2264
2297
|
if (!(context.accessToken &&
|
|
2265
2298
|
context.accessTokenExpiration.getTime() > Date.now())) return [3 /*break*/, 1];
|
|
@@ -2269,9 +2302,9 @@ function authenticate(url, context, fetchToken, userInteraction, hints) {
|
|
|
2269
2302
|
(!context.refreshTokenExpiration ||
|
|
2270
2303
|
context.refreshTokenExpiration.getTime() > Date.now()))) return [3 /*break*/, 3];
|
|
2271
2304
|
return [4 /*yield*/, refreshAccessToken(url, context)];
|
|
2272
|
-
case 2: return [2 /*return*/,
|
|
2305
|
+
case 2: return [2 /*return*/, _k.sent()];
|
|
2273
2306
|
case 3: return [4 /*yield*/, userAuthenticate(context, fetchToken, userInteraction, hints)];
|
|
2274
|
-
case 4: return [2 /*return*/,
|
|
2307
|
+
case 4: return [2 /*return*/, _k.sent()];
|
|
2275
2308
|
}
|
|
2276
2309
|
});
|
|
2277
2310
|
});
|
|
@@ -2279,8 +2312,8 @@ function authenticate(url, context, fetchToken, userInteraction, hints) {
|
|
|
2279
2312
|
function refreshAccessToken(url, login) {
|
|
2280
2313
|
return __awaiter$1(this, void 0, void 0, function () {
|
|
2281
2314
|
var time_stamp, signing_algorithm, textEncoder, data, binarySignature, signature, tokenRequest, res, response;
|
|
2282
|
-
return __generator$1(this, function (
|
|
2283
|
-
switch (
|
|
2315
|
+
return __generator$1(this, function (_k) {
|
|
2316
|
+
switch (_k.label) {
|
|
2284
2317
|
case 0:
|
|
2285
2318
|
if (!login.refreshToken)
|
|
2286
2319
|
throw new Error("Cannot refresh token - refresh token is missing.");
|
|
@@ -2292,7 +2325,7 @@ function refreshAccessToken(url, login) {
|
|
|
2292
2325
|
data = textEncoder.encode(login.refreshToken + time_stamp);
|
|
2293
2326
|
return [4 /*yield*/, crypto.subtle.sign(signing_algorithm, login.nonExportablePrivateKey, data)];
|
|
2294
2327
|
case 1:
|
|
2295
|
-
binarySignature =
|
|
2328
|
+
binarySignature = _k.sent();
|
|
2296
2329
|
signature = b64encode(binarySignature);
|
|
2297
2330
|
tokenRequest = {
|
|
2298
2331
|
grant_type: 'refresh_token',
|
|
@@ -2309,12 +2342,12 @@ function refreshAccessToken(url, login) {
|
|
|
2309
2342
|
mode: 'cors',
|
|
2310
2343
|
})];
|
|
2311
2344
|
case 2:
|
|
2312
|
-
res =
|
|
2345
|
+
res = _k.sent();
|
|
2313
2346
|
if (res.status !== 200)
|
|
2314
2347
|
throw new Error("RefreshToken: Status ".concat(res.status, " from ").concat(url, "/token"));
|
|
2315
2348
|
return [4 /*yield*/, res.json()];
|
|
2316
2349
|
case 3:
|
|
2317
|
-
response =
|
|
2350
|
+
response = _k.sent();
|
|
2318
2351
|
login.accessToken = response.accessToken;
|
|
2319
2352
|
login.accessTokenExpiration = response.accessTokenExpiration
|
|
2320
2353
|
? new Date(response.accessTokenExpiration)
|
|
@@ -2326,9 +2359,9 @@ function refreshAccessToken(url, login) {
|
|
|
2326
2359
|
}
|
|
2327
2360
|
function userAuthenticate(context, fetchToken, userInteraction, hints) {
|
|
2328
2361
|
return __awaiter$1(this, void 0, void 0, function () {
|
|
2329
|
-
var
|
|
2330
|
-
return __generator$1(this, function (
|
|
2331
|
-
switch (
|
|
2362
|
+
var _k, privateKey, publicKey, publicKeySPKI, publicKeyPEM, response2, error_1;
|
|
2363
|
+
return __generator$1(this, function (_l) {
|
|
2364
|
+
switch (_l.label) {
|
|
2332
2365
|
case 0: return [4 /*yield*/, crypto.subtle.generateKey({
|
|
2333
2366
|
name: 'RSASSA-PKCS1-v1_5',
|
|
2334
2367
|
modulusLength: 2048,
|
|
@@ -2337,24 +2370,24 @@ function userAuthenticate(context, fetchToken, userInteraction, hints) {
|
|
|
2337
2370
|
}, false, // Non-exportable...
|
|
2338
2371
|
['sign', 'verify'])];
|
|
2339
2372
|
case 1:
|
|
2340
|
-
|
|
2373
|
+
_k = _l.sent(), privateKey = _k.privateKey, publicKey = _k.publicKey;
|
|
2341
2374
|
if (!privateKey || !publicKey)
|
|
2342
2375
|
throw new Error("Could not generate RSA keypair"); // Typings suggest these can be undefined...
|
|
2343
2376
|
context.nonExportablePrivateKey = privateKey; //...but storable!
|
|
2344
2377
|
return [4 /*yield*/, crypto.subtle.exportKey('spki', publicKey)];
|
|
2345
2378
|
case 2:
|
|
2346
|
-
publicKeySPKI =
|
|
2379
|
+
publicKeySPKI = _l.sent();
|
|
2347
2380
|
publicKeyPEM = spkiToPEM(publicKeySPKI);
|
|
2348
2381
|
context.publicKey = publicKey;
|
|
2349
|
-
|
|
2382
|
+
_l.label = 3;
|
|
2350
2383
|
case 3:
|
|
2351
|
-
|
|
2384
|
+
_l.trys.push([3, 7, , 9]);
|
|
2352
2385
|
return [4 /*yield*/, fetchToken({
|
|
2353
2386
|
public_key: publicKeyPEM,
|
|
2354
2387
|
hints: hints,
|
|
2355
2388
|
})];
|
|
2356
2389
|
case 4:
|
|
2357
|
-
response2 =
|
|
2390
|
+
response2 = _l.sent();
|
|
2358
2391
|
if (response2.type !== 'tokens')
|
|
2359
2392
|
throw new Error("Unexpected response type from token endpoint: ".concat(response2.type));
|
|
2360
2393
|
context.accessToken = response2.accessToken;
|
|
@@ -2375,11 +2408,11 @@ function userAuthenticate(context, fetchToken, userInteraction, hints) {
|
|
|
2375
2408
|
alerts: response2.alerts,
|
|
2376
2409
|
})];
|
|
2377
2410
|
case 5:
|
|
2378
|
-
|
|
2379
|
-
|
|
2411
|
+
_l.sent();
|
|
2412
|
+
_l.label = 6;
|
|
2380
2413
|
case 6: return [2 /*return*/, context];
|
|
2381
2414
|
case 7:
|
|
2382
|
-
error_1 =
|
|
2415
|
+
error_1 = _l.sent();
|
|
2383
2416
|
return [4 /*yield*/, alertUser(userInteraction, 'Authentication Failed', {
|
|
2384
2417
|
type: 'error',
|
|
2385
2418
|
messageCode: 'GENERIC_ERROR',
|
|
@@ -2387,7 +2420,7 @@ function userAuthenticate(context, fetchToken, userInteraction, hints) {
|
|
|
2387
2420
|
messageParams: {}
|
|
2388
2421
|
}).catch(function () { })];
|
|
2389
2422
|
case 8:
|
|
2390
|
-
|
|
2423
|
+
_l.sent();
|
|
2391
2424
|
throw error_1;
|
|
2392
2425
|
case 9: return [2 /*return*/];
|
|
2393
2426
|
}
|
|
@@ -2430,7 +2463,7 @@ var AuthPersistedContext = /** @class */ (function () {
|
|
|
2430
2463
|
AuthPersistedContext.prototype.save = function () {
|
|
2431
2464
|
return __awaiter$1(this, void 0, void 0, function () {
|
|
2432
2465
|
var db;
|
|
2433
|
-
return __generator$1(this, function (
|
|
2466
|
+
return __generator$1(this, function (_k) {
|
|
2434
2467
|
db = wm$1.get(this);
|
|
2435
2468
|
db.table("$logins").put(this);
|
|
2436
2469
|
return [2 /*return*/];
|
|
@@ -2457,21 +2490,21 @@ var HttpError = /** @class */ (function (_super_1) {
|
|
|
2457
2490
|
}(Error));
|
|
2458
2491
|
function otpFetchTokenCallback(db) {
|
|
2459
2492
|
var userInteraction = db.cloud.userInteraction;
|
|
2460
|
-
return function otpAuthenticate(
|
|
2461
|
-
var
|
|
2462
|
-
var
|
|
2493
|
+
return function otpAuthenticate(_k) {
|
|
2494
|
+
var public_key = _k.public_key, hints = _k.hints;
|
|
2495
|
+
var _a;
|
|
2463
2496
|
return __awaiter$1(this, void 0, void 0, function () {
|
|
2464
|
-
var tokenRequest, url, demo_user, email, res1, errMsg, response, otp, res2, errorText,
|
|
2465
|
-
return __generator$1(this, function (
|
|
2466
|
-
switch (
|
|
2497
|
+
var tokenRequest, url, demo_user, email, res1, errMsg, response, otp, res2, errorText, _k, errMsg, response2;
|
|
2498
|
+
return __generator$1(this, function (_l) {
|
|
2499
|
+
switch (_l.label) {
|
|
2467
2500
|
case 0:
|
|
2468
|
-
url = (
|
|
2501
|
+
url = (_a = db.cloud.options) === null || _a === void 0 ? void 0 : _a.databaseUrl;
|
|
2469
2502
|
if (!url)
|
|
2470
2503
|
throw new Error("No database URL given.");
|
|
2471
2504
|
if (!((hints === null || hints === void 0 ? void 0 : hints.grant_type) === 'demo')) return [3 /*break*/, 2];
|
|
2472
2505
|
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))];
|
|
2473
2506
|
case 1:
|
|
2474
|
-
demo_user =
|
|
2507
|
+
demo_user = _l.sent();
|
|
2475
2508
|
tokenRequest = {
|
|
2476
2509
|
demo_user: demo_user,
|
|
2477
2510
|
grant_type: 'demo',
|
|
@@ -2481,25 +2514,25 @@ function otpFetchTokenCallback(db) {
|
|
|
2481
2514
|
return [3 /*break*/, 4];
|
|
2482
2515
|
case 2: return [4 /*yield*/, promptForEmail(userInteraction, 'Enter email address', hints === null || hints === void 0 ? void 0 : hints.email)];
|
|
2483
2516
|
case 3:
|
|
2484
|
-
email =
|
|
2517
|
+
email = _l.sent();
|
|
2485
2518
|
tokenRequest = {
|
|
2486
2519
|
email: email,
|
|
2487
2520
|
grant_type: 'otp',
|
|
2488
2521
|
scopes: ['ACCESS_DB'],
|
|
2489
2522
|
public_key: public_key,
|
|
2490
2523
|
};
|
|
2491
|
-
|
|
2524
|
+
_l.label = 4;
|
|
2492
2525
|
case 4: return [4 /*yield*/, fetch("".concat(url, "/token"), {
|
|
2493
2526
|
body: JSON.stringify(tokenRequest),
|
|
2494
2527
|
method: 'post',
|
|
2495
2528
|
headers: { 'Content-Type': 'application/json', mode: 'cors' },
|
|
2496
2529
|
})];
|
|
2497
2530
|
case 5:
|
|
2498
|
-
res1 =
|
|
2531
|
+
res1 = _l.sent();
|
|
2499
2532
|
if (!(res1.status !== 200)) return [3 /*break*/, 8];
|
|
2500
2533
|
return [4 /*yield*/, res1.text()];
|
|
2501
2534
|
case 6:
|
|
2502
|
-
errMsg =
|
|
2535
|
+
errMsg = _l.sent();
|
|
2503
2536
|
return [4 /*yield*/, alertUser(userInteraction, "Token request failed", {
|
|
2504
2537
|
type: 'error',
|
|
2505
2538
|
messageCode: 'GENERIC_ERROR',
|
|
@@ -2507,11 +2540,11 @@ function otpFetchTokenCallback(db) {
|
|
|
2507
2540
|
messageParams: {}
|
|
2508
2541
|
}).catch(function () { })];
|
|
2509
2542
|
case 7:
|
|
2510
|
-
|
|
2543
|
+
_l.sent();
|
|
2511
2544
|
throw new HttpError(res1, errMsg);
|
|
2512
2545
|
case 8: return [4 /*yield*/, res1.json()];
|
|
2513
2546
|
case 9:
|
|
2514
|
-
response =
|
|
2547
|
+
response = _l.sent();
|
|
2515
2548
|
if (!(response.type === 'tokens')) return [3 /*break*/, 10];
|
|
2516
2549
|
// Demo user request can get a "tokens" response right away
|
|
2517
2550
|
return [2 /*return*/, response];
|
|
@@ -2521,7 +2554,7 @@ function otpFetchTokenCallback(db) {
|
|
|
2521
2554
|
throw new Error("Unexpected response from ".concat(url, "/token"));
|
|
2522
2555
|
return [4 /*yield*/, promptForOTP(userInteraction, tokenRequest.email)];
|
|
2523
2556
|
case 11:
|
|
2524
|
-
otp =
|
|
2557
|
+
otp = _l.sent();
|
|
2525
2558
|
tokenRequest.otp = otp || '';
|
|
2526
2559
|
tokenRequest.otp_id = response.otp_id;
|
|
2527
2560
|
return [4 /*yield*/, fetch("".concat(url, "/token"), {
|
|
@@ -2531,14 +2564,14 @@ function otpFetchTokenCallback(db) {
|
|
|
2531
2564
|
mode: 'cors',
|
|
2532
2565
|
})];
|
|
2533
2566
|
case 12:
|
|
2534
|
-
res2 =
|
|
2535
|
-
|
|
2567
|
+
res2 = _l.sent();
|
|
2568
|
+
_l.label = 13;
|
|
2536
2569
|
case 13:
|
|
2537
2570
|
if (!(res2.status === 401)) return [3 /*break*/, 17];
|
|
2538
2571
|
return [4 /*yield*/, res2.text()];
|
|
2539
2572
|
case 14:
|
|
2540
|
-
errorText =
|
|
2541
|
-
|
|
2573
|
+
errorText = _l.sent();
|
|
2574
|
+
_k = tokenRequest;
|
|
2542
2575
|
return [4 /*yield*/, promptForOTP(userInteraction, tokenRequest.email, {
|
|
2543
2576
|
type: 'error',
|
|
2544
2577
|
messageCode: 'INVALID_OTP',
|
|
@@ -2546,7 +2579,7 @@ function otpFetchTokenCallback(db) {
|
|
|
2546
2579
|
messageParams: {}
|
|
2547
2580
|
})];
|
|
2548
2581
|
case 15:
|
|
2549
|
-
|
|
2582
|
+
_k.otp = _l.sent();
|
|
2550
2583
|
return [4 /*yield*/, fetch("".concat(url, "/token"), {
|
|
2551
2584
|
body: JSON.stringify(tokenRequest),
|
|
2552
2585
|
method: 'post',
|
|
@@ -2554,13 +2587,13 @@ function otpFetchTokenCallback(db) {
|
|
|
2554
2587
|
mode: 'cors',
|
|
2555
2588
|
})];
|
|
2556
2589
|
case 16:
|
|
2557
|
-
res2 =
|
|
2590
|
+
res2 = _l.sent();
|
|
2558
2591
|
return [3 /*break*/, 13];
|
|
2559
2592
|
case 17:
|
|
2560
2593
|
if (!(res2.status !== 200)) return [3 /*break*/, 20];
|
|
2561
2594
|
return [4 /*yield*/, res2.text()];
|
|
2562
2595
|
case 18:
|
|
2563
|
-
errMsg =
|
|
2596
|
+
errMsg = _l.sent();
|
|
2564
2597
|
return [4 /*yield*/, alertUser(userInteraction, "OTP Authentication Failed", {
|
|
2565
2598
|
type: 'error',
|
|
2566
2599
|
messageCode: 'GENERIC_ERROR',
|
|
@@ -2568,11 +2601,11 @@ function otpFetchTokenCallback(db) {
|
|
|
2568
2601
|
messageParams: {}
|
|
2569
2602
|
}).catch(function () { })];
|
|
2570
2603
|
case 19:
|
|
2571
|
-
|
|
2604
|
+
_l.sent();
|
|
2572
2605
|
throw new HttpError(res2, errMsg);
|
|
2573
2606
|
case 20: return [4 /*yield*/, res2.json()];
|
|
2574
2607
|
case 21:
|
|
2575
|
-
response2 =
|
|
2608
|
+
response2 = _l.sent();
|
|
2576
2609
|
return [2 /*return*/, response2];
|
|
2577
2610
|
case 22: throw new Error("Unexpected response from ".concat(url, "/token"));
|
|
2578
2611
|
}
|
|
@@ -2595,19 +2628,19 @@ function setCurrentUser(db, user) {
|
|
|
2595
2628
|
return __awaiter$1(this, void 0, void 0, function () {
|
|
2596
2629
|
var $logins;
|
|
2597
2630
|
var _this_1 = this;
|
|
2598
|
-
return __generator$1(this, function (
|
|
2599
|
-
switch (
|
|
2631
|
+
return __generator$1(this, function (_k) {
|
|
2632
|
+
switch (_k.label) {
|
|
2600
2633
|
case 0:
|
|
2601
2634
|
if (user.userId === db.cloud.currentUserId)
|
|
2602
2635
|
return [2 /*return*/]; // Already this user.
|
|
2603
2636
|
$logins = db.table('$logins');
|
|
2604
2637
|
return [4 /*yield*/, db.transaction('rw', $logins, function (tx) { return __awaiter$1(_this_1, void 0, void 0, function () {
|
|
2605
2638
|
var existingLogins;
|
|
2606
|
-
return __generator$1(this, function (
|
|
2607
|
-
switch (
|
|
2639
|
+
return __generator$1(this, function (_k) {
|
|
2640
|
+
switch (_k.label) {
|
|
2608
2641
|
case 0: return [4 /*yield*/, $logins.toArray()];
|
|
2609
2642
|
case 1:
|
|
2610
|
-
existingLogins =
|
|
2643
|
+
existingLogins = _k.sent();
|
|
2611
2644
|
return [4 /*yield*/, Promise.all(existingLogins
|
|
2612
2645
|
.filter(function (login) { return login.userId !== user.userId && login.isLoggedIn; })
|
|
2613
2646
|
.map(function (login) {
|
|
@@ -2615,19 +2648,19 @@ function setCurrentUser(db, user) {
|
|
|
2615
2648
|
return $logins.put(login);
|
|
2616
2649
|
}))];
|
|
2617
2650
|
case 2:
|
|
2618
|
-
|
|
2651
|
+
_k.sent();
|
|
2619
2652
|
user.isLoggedIn = true;
|
|
2620
2653
|
user.lastLogin = new Date();
|
|
2621
2654
|
return [4 /*yield*/, user.save()];
|
|
2622
2655
|
case 3:
|
|
2623
|
-
|
|
2656
|
+
_k.sent();
|
|
2624
2657
|
console.debug('Saved new user', user.email);
|
|
2625
2658
|
return [2 /*return*/];
|
|
2626
2659
|
}
|
|
2627
2660
|
});
|
|
2628
2661
|
}); })];
|
|
2629
2662
|
case 1:
|
|
2630
|
-
|
|
2663
|
+
_k.sent();
|
|
2631
2664
|
return [4 /*yield*/, new Promise(function (resolve) {
|
|
2632
2665
|
if (db.cloud.currentUserId === user.userId) {
|
|
2633
2666
|
resolve(null);
|
|
@@ -2642,7 +2675,7 @@ function setCurrentUser(db, user) {
|
|
|
2642
2675
|
}
|
|
2643
2676
|
})];
|
|
2644
2677
|
case 2:
|
|
2645
|
-
|
|
2678
|
+
_k.sent();
|
|
2646
2679
|
return [2 /*return*/];
|
|
2647
2680
|
}
|
|
2648
2681
|
});
|
|
@@ -2651,11 +2684,11 @@ function setCurrentUser(db, user) {
|
|
|
2651
2684
|
function login(db, hints) {
|
|
2652
2685
|
return __awaiter$1(this, void 0, void 0, function () {
|
|
2653
2686
|
var currentUser, context;
|
|
2654
|
-
return __generator$1(this, function (
|
|
2655
|
-
switch (
|
|
2687
|
+
return __generator$1(this, function (_k) {
|
|
2688
|
+
switch (_k.label) {
|
|
2656
2689
|
case 0: return [4 /*yield*/, db.getCurrentUser()];
|
|
2657
2690
|
case 1:
|
|
2658
|
-
currentUser =
|
|
2691
|
+
currentUser = _k.sent();
|
|
2659
2692
|
if (currentUser.isLoggedIn) {
|
|
2660
2693
|
if (hints) {
|
|
2661
2694
|
if (hints.email && db.cloud.currentUser.value.email !== hints.email) {
|
|
@@ -2674,13 +2707,13 @@ function login(db, hints) {
|
|
|
2674
2707
|
});
|
|
2675
2708
|
return [4 /*yield*/, authenticate(db.cloud.options.databaseUrl, context, db.cloud.options.fetchTokens || otpFetchTokenCallback(db), db.cloud.userInteraction, hints)];
|
|
2676
2709
|
case 2:
|
|
2677
|
-
|
|
2710
|
+
_k.sent();
|
|
2678
2711
|
return [4 /*yield*/, context.save()];
|
|
2679
2712
|
case 3:
|
|
2680
|
-
|
|
2713
|
+
_k.sent();
|
|
2681
2714
|
return [4 /*yield*/, setCurrentUser(db, context)];
|
|
2682
2715
|
case 4:
|
|
2683
|
-
|
|
2716
|
+
_k.sent();
|
|
2684
2717
|
// Make sure to resync as the new login will be authorized
|
|
2685
2718
|
// for new realms.
|
|
2686
2719
|
triggerSync(db, "pull");
|
|
@@ -2701,7 +2734,7 @@ try {
|
|
|
2701
2734
|
Object.freeze(UNAUTHORIZED_USER);
|
|
2702
2735
|
Object.freeze(UNAUTHORIZED_USER.claims);
|
|
2703
2736
|
}
|
|
2704
|
-
catch (
|
|
2737
|
+
catch (_a) { }
|
|
2705
2738
|
var swHolder = {};
|
|
2706
2739
|
var swContainer = self.document && navigator.serviceWorker; // self.document is to verify we're not the SW ourself
|
|
2707
2740
|
if (swContainer)
|
|
@@ -2709,9 +2742,9 @@ if (swContainer)
|
|
|
2709
2742
|
if (typeof self !== 'undefined' && 'clients' in self && !self.document) {
|
|
2710
2743
|
// We are the service worker. Propagate messages to all our clients.
|
|
2711
2744
|
addEventListener('message', function (ev) {
|
|
2712
|
-
var
|
|
2713
|
-
if ((
|
|
2714
|
-
__spreadArray$1([], self['clients'].matchAll({ includeUncontrolled: true }), true).forEach(function (client) { var
|
|
2745
|
+
var _a, _b;
|
|
2746
|
+
if ((_b = (_a = ev.data) === null || _a === void 0 ? void 0 : _a.type) === null || _b === void 0 ? void 0 : _b.startsWith('sw-broadcast-')) {
|
|
2747
|
+
__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); });
|
|
2715
2748
|
}
|
|
2716
2749
|
});
|
|
2717
2750
|
}
|
|
@@ -2724,8 +2757,8 @@ var SWBroadcastChannel = /** @class */ (function () {
|
|
|
2724
2757
|
if (!swContainer)
|
|
2725
2758
|
return function () { };
|
|
2726
2759
|
var forwarder = function (ev) {
|
|
2727
|
-
var
|
|
2728
|
-
if (((
|
|
2760
|
+
var _a;
|
|
2761
|
+
if (((_a = ev.data) === null || _a === void 0 ? void 0 : _a.type) === "sw-broadcast-".concat(_this_1.name)) {
|
|
2729
2762
|
listener(ev.data.message);
|
|
2730
2763
|
}
|
|
2731
2764
|
};
|
|
@@ -2734,7 +2767,7 @@ var SWBroadcastChannel = /** @class */ (function () {
|
|
|
2734
2767
|
};
|
|
2735
2768
|
SWBroadcastChannel.prototype.postMessage = function (message) {
|
|
2736
2769
|
var _this_1 = this;
|
|
2737
|
-
var
|
|
2770
|
+
var _a;
|
|
2738
2771
|
if (typeof self['clients'] === 'object') {
|
|
2739
2772
|
// We're a service worker. Propagate to our browser clients.
|
|
2740
2773
|
__spreadArray$1([], self['clients'].matchAll({ includeUncontrolled: true }), true).forEach(function (client) { return client.postMessage({
|
|
@@ -2745,7 +2778,7 @@ var SWBroadcastChannel = /** @class */ (function () {
|
|
|
2745
2778
|
else if (swHolder.registration) {
|
|
2746
2779
|
// We're a client (browser window or other worker)
|
|
2747
2780
|
// Post to SW so it can repost to all its clients and to itself
|
|
2748
|
-
(
|
|
2781
|
+
(_a = swHolder.registration.active) === null || _a === void 0 ? void 0 : _a.postMessage({
|
|
2749
2782
|
type: "sw-broadcast-".concat(this.name),
|
|
2750
2783
|
message: message
|
|
2751
2784
|
});
|
|
@@ -2791,25 +2824,25 @@ var BroadcastedAndLocalEvent = /** @class */ (function (_super_1) {
|
|
|
2791
2824
|
return _this_1;
|
|
2792
2825
|
}
|
|
2793
2826
|
BroadcastedAndLocalEvent.prototype.next = function (message) {
|
|
2794
|
-
console.debug("BroadcastedAndLocalEvent: bc.postMessage()",
|
|
2827
|
+
console.debug("BroadcastedAndLocalEvent: bc.postMessage()", Object.assign({}, message), "bc is a", this.bc);
|
|
2795
2828
|
this.bc.postMessage(message);
|
|
2796
2829
|
var ev = new CustomEvent("lbc-".concat(this.name), { detail: message });
|
|
2797
2830
|
self.dispatchEvent(ev);
|
|
2798
2831
|
};
|
|
2799
2832
|
return BroadcastedAndLocalEvent;
|
|
2800
2833
|
}(Observable$1));
|
|
2801
|
-
function computeRealmSetHash(
|
|
2802
|
-
var realms =
|
|
2834
|
+
function computeRealmSetHash(_k) {
|
|
2835
|
+
var realms = _k.realms, inviteRealms = _k.inviteRealms;
|
|
2803
2836
|
return __awaiter$1(this, void 0, void 0, function () {
|
|
2804
2837
|
var data, byteArray, digestBytes, base64;
|
|
2805
|
-
return __generator$1(this, function (
|
|
2806
|
-
switch (
|
|
2838
|
+
return __generator$1(this, function (_k) {
|
|
2839
|
+
switch (_k.label) {
|
|
2807
2840
|
case 0:
|
|
2808
2841
|
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; }));
|
|
2809
2842
|
byteArray = new TextEncoder().encode(data);
|
|
2810
2843
|
return [4 /*yield*/, crypto.subtle.digest('SHA-1', byteArray)];
|
|
2811
2844
|
case 1:
|
|
2812
|
-
digestBytes =
|
|
2845
|
+
digestBytes = _k.sent();
|
|
2813
2846
|
base64 = b64encode(digestBytes);
|
|
2814
2847
|
return [2 /*return*/, base64];
|
|
2815
2848
|
}
|
|
@@ -2818,14 +2851,14 @@ function computeRealmSetHash(_e) {
|
|
|
2818
2851
|
}
|
|
2819
2852
|
function getSyncableTables(db) {
|
|
2820
2853
|
return Object.entries(db.cloud.schema || {})
|
|
2821
|
-
.filter(function (
|
|
2822
|
-
var markedForSync =
|
|
2854
|
+
.filter(function (_k) {
|
|
2855
|
+
var markedForSync = _k[1].markedForSync;
|
|
2823
2856
|
return markedForSync;
|
|
2824
2857
|
})
|
|
2825
|
-
.map(function (
|
|
2826
|
-
var tbl =
|
|
2827
|
-
return db.tables.filter(function (
|
|
2828
|
-
var name =
|
|
2858
|
+
.map(function (_k) {
|
|
2859
|
+
var tbl = _k[0];
|
|
2860
|
+
return db.tables.filter(function (_k) {
|
|
2861
|
+
var name = _k.name;
|
|
2829
2862
|
return name === tbl;
|
|
2830
2863
|
})[0];
|
|
2831
2864
|
})
|
|
@@ -2835,8 +2868,8 @@ function getMutationTable(tableName) {
|
|
|
2835
2868
|
return "$".concat(tableName, "_mutations");
|
|
2836
2869
|
}
|
|
2837
2870
|
function getTableFromMutationTable(mutationTable) {
|
|
2838
|
-
var
|
|
2839
|
-
var tableName = (
|
|
2871
|
+
var _a;
|
|
2872
|
+
var tableName = (_a = /^\$(.*)_mutations$/.exec(mutationTable)) === null || _a === void 0 ? void 0 : _a[1];
|
|
2840
2873
|
if (!tableName)
|
|
2841
2874
|
throw new Error("Given mutationTable ".concat(mutationTable, " is not correct"));
|
|
2842
2875
|
return tableName;
|
|
@@ -2845,17 +2878,17 @@ var concat = [].concat;
|
|
|
2845
2878
|
function flatten(a) {
|
|
2846
2879
|
return concat.apply([], a);
|
|
2847
2880
|
}
|
|
2848
|
-
function listClientChanges(mutationTables, db,
|
|
2849
|
-
var
|
|
2881
|
+
function listClientChanges(mutationTables, db, _k) {
|
|
2882
|
+
var _l = _k === void 0 ? {} : _k, _m = _l.since, since = _m === void 0 ? {} : _m, _o = _l.limit, limit = _o === void 0 ? Infinity : _o;
|
|
2850
2883
|
return __awaiter$1(this, void 0, void 0, function () {
|
|
2851
|
-
var allMutsOnTables, sorted, result, currentEntry, currentTxid,
|
|
2884
|
+
var allMutsOnTables, sorted, result, currentEntry, currentTxid, _k, sorted_1, _l, table, mut;
|
|
2852
2885
|
var _this_1 = this;
|
|
2853
|
-
return __generator$1(this, function (
|
|
2854
|
-
switch (
|
|
2886
|
+
return __generator$1(this, function (_m) {
|
|
2887
|
+
switch (_m.label) {
|
|
2855
2888
|
case 0: return [4 /*yield*/, Promise.all(mutationTables.map(function (mutationTable) { return __awaiter$1(_this_1, void 0, void 0, function () {
|
|
2856
2889
|
var tableName, lastRevision, query, muts;
|
|
2857
|
-
return __generator$1(this, function (
|
|
2858
|
-
switch (
|
|
2890
|
+
return __generator$1(this, function (_k) {
|
|
2891
|
+
switch (_k.label) {
|
|
2859
2892
|
case 0:
|
|
2860
2893
|
tableName = getTableFromMutationTable(mutationTable.name);
|
|
2861
2894
|
lastRevision = since[tableName];
|
|
@@ -2866,7 +2899,7 @@ function listClientChanges(mutationTables, db, _e) {
|
|
|
2866
2899
|
query = query.limit(limit);
|
|
2867
2900
|
return [4 /*yield*/, query.toArray()];
|
|
2868
2901
|
case 1:
|
|
2869
|
-
muts =
|
|
2902
|
+
muts = _k.sent();
|
|
2870
2903
|
//const objTable = db.table(tableName);
|
|
2871
2904
|
/*for (const mut of muts) {
|
|
2872
2905
|
if (mut.type === "insert" || mut.type === "upsert") {
|
|
@@ -2881,13 +2914,13 @@ function listClientChanges(mutationTables, db, _e) {
|
|
|
2881
2914
|
});
|
|
2882
2915
|
}); }))];
|
|
2883
2916
|
case 1:
|
|
2884
|
-
allMutsOnTables =
|
|
2917
|
+
allMutsOnTables = _m.sent();
|
|
2885
2918
|
sorted = flatten(allMutsOnTables).sort(function (a, b) { return a.mut.ts - b.mut.ts; });
|
|
2886
2919
|
result = [];
|
|
2887
2920
|
currentEntry = null;
|
|
2888
2921
|
currentTxid = null;
|
|
2889
|
-
for (
|
|
2890
|
-
|
|
2922
|
+
for (_k = 0, sorted_1 = sorted; _k < sorted_1.length; _k++) {
|
|
2923
|
+
_l = sorted_1[_k], table = _l.table, mut = _l.mut;
|
|
2891
2924
|
if (currentEntry &&
|
|
2892
2925
|
currentEntry.table === table &&
|
|
2893
2926
|
currentTxid === mut.txid) {
|
|
@@ -2917,8 +2950,8 @@ function listSyncifiedChanges(tablesToSyncify, currentUser, schema, alreadySynce
|
|
|
2917
2950
|
return __awaiter$1(this, void 0, void 0, function () {
|
|
2918
2951
|
var txid, ignoredRealms_1, upserts;
|
|
2919
2952
|
var _this_1 = this;
|
|
2920
|
-
return __generator$1(this, function (
|
|
2921
|
-
switch (
|
|
2953
|
+
return __generator$1(this, function (_k) {
|
|
2954
|
+
switch (_k.label) {
|
|
2922
2955
|
case 0:
|
|
2923
2956
|
txid = "upload-".concat(randomString(8));
|
|
2924
2957
|
if (!currentUser.isLoggedIn) return [3 /*break*/, 2];
|
|
@@ -2926,8 +2959,8 @@ function listSyncifiedChanges(tablesToSyncify, currentUser, schema, alreadySynce
|
|
|
2926
2959
|
ignoredRealms_1 = new Set(alreadySyncedRealms || []);
|
|
2927
2960
|
return [4 /*yield*/, Promise.all(tablesToSyncify.map(function (table) { return __awaiter$1(_this_1, void 0, void 0, function () {
|
|
2928
2961
|
var extractKey, dexieCloudTableSchema, query, unsyncedObjects, mut;
|
|
2929
|
-
return __generator$1(this, function (
|
|
2930
|
-
switch (
|
|
2962
|
+
return __generator$1(this, function (_k) {
|
|
2963
|
+
switch (_k.label) {
|
|
2931
2964
|
case 0:
|
|
2932
2965
|
extractKey = table.core.schema.primaryKey.extractKey;
|
|
2933
2966
|
if (!extractKey)
|
|
@@ -2948,7 +2981,7 @@ function listSyncifiedChanges(tablesToSyncify, currentUser, schema, alreadySynce
|
|
|
2948
2981
|
});
|
|
2949
2982
|
return [4 /*yield*/, query.toArray()];
|
|
2950
2983
|
case 1:
|
|
2951
|
-
unsyncedObjects =
|
|
2984
|
+
unsyncedObjects = _k.sent();
|
|
2952
2985
|
if (unsyncedObjects.length > 0) {
|
|
2953
2986
|
mut = {
|
|
2954
2987
|
type: 'upsert',
|
|
@@ -2972,7 +3005,7 @@ function listSyncifiedChanges(tablesToSyncify, currentUser, schema, alreadySynce
|
|
|
2972
3005
|
});
|
|
2973
3006
|
}); }))];
|
|
2974
3007
|
case 1:
|
|
2975
|
-
upserts =
|
|
3008
|
+
upserts = _k.sent();
|
|
2976
3009
|
return [2 /*return*/, upserts.filter(function (op) { return op.muts.length > 0; })];
|
|
2977
3010
|
case 2: return [2 /*return*/, []];
|
|
2978
3011
|
}
|
|
@@ -3001,12 +3034,12 @@ function escapeDollarProps(value) {
|
|
|
3001
3034
|
if (!dollarKeys)
|
|
3002
3035
|
return value;
|
|
3003
3036
|
var clone = __assign({}, value);
|
|
3004
|
-
for (var
|
|
3005
|
-
var k_1 = dollarKeys_1[
|
|
3037
|
+
for (var _k = 0, dollarKeys_1 = dollarKeys; _k < dollarKeys_1.length; _k++) {
|
|
3038
|
+
var k_1 = dollarKeys_1[_k];
|
|
3006
3039
|
delete clone[k_1];
|
|
3007
3040
|
}
|
|
3008
|
-
for (var
|
|
3009
|
-
var k_2 = dollarKeys_2[
|
|
3041
|
+
for (var _l = 0, dollarKeys_2 = dollarKeys; _l < dollarKeys_2.length; _l++) {
|
|
3042
|
+
var k_2 = dollarKeys_2[_l];
|
|
3010
3043
|
clone["$" + k_2] = value[k_2];
|
|
3011
3044
|
}
|
|
3012
3045
|
return clone;
|
|
@@ -3016,8 +3049,8 @@ var ObjectDef = {
|
|
|
3016
3049
|
};
|
|
3017
3050
|
function TypesonSimplified() {
|
|
3018
3051
|
var typeDefsInputs = [];
|
|
3019
|
-
for (var
|
|
3020
|
-
typeDefsInputs[
|
|
3052
|
+
for (var _k = 0; _k < arguments.length; _k++) {
|
|
3053
|
+
typeDefsInputs[_k] = arguments[_k];
|
|
3021
3054
|
}
|
|
3022
3055
|
var typeDefs = typeDefsInputs.reduce(function (p, c) { return (__assign(__assign({}, p), c)); }, typeDefsInputs.reduce(function (p, c) { return (__assign(__assign({}, c), p)); }, {}));
|
|
3023
3056
|
var protoMap = new WeakMap();
|
|
@@ -3051,13 +3084,13 @@ function TypesonSimplified() {
|
|
|
3051
3084
|
// Unescape dollar props
|
|
3052
3085
|
value = __assign({}, value);
|
|
3053
3086
|
// Delete keys that children wanted us to delete
|
|
3054
|
-
for (var
|
|
3055
|
-
var k_3 =
|
|
3087
|
+
for (var _k = 0, _l = top[1]; _k < _l.length; _k++) {
|
|
3088
|
+
var k_3 = _l[_k];
|
|
3056
3089
|
delete value[k_3];
|
|
3057
3090
|
}
|
|
3058
3091
|
// Set keys that children wanted us to set
|
|
3059
|
-
for (var
|
|
3060
|
-
var
|
|
3092
|
+
for (var _m = 0, _o = Object.entries(top[2]); _m < _o.length; _m++) {
|
|
3093
|
+
var _p = _o[_m], k_4 = _p[0], v_1 = _p[1];
|
|
3061
3094
|
value[k_4] = v_1;
|
|
3062
3095
|
}
|
|
3063
3096
|
stack.pop();
|
|
@@ -3105,8 +3138,8 @@ function TypesonSimplified() {
|
|
|
3105
3138
|
if (typeDef !== undefined)
|
|
3106
3139
|
return typeDef; // Null counts to! So the caching of Array.prototype also counts.
|
|
3107
3140
|
var toStringTag_1 = getToStringTag(realVal);
|
|
3108
|
-
var entry = Object.entries(typeDefs).find(function (
|
|
3109
|
-
var typeName =
|
|
3141
|
+
var entry = Object.entries(typeDefs).find(function (_k) {
|
|
3142
|
+
var typeName = _k[0], typeDef = _k[1];
|
|
3110
3143
|
var _a, _b;
|
|
3111
3144
|
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;
|
|
3112
3145
|
});
|
|
@@ -3138,8 +3171,8 @@ var BisonBinaryTypes = {
|
|
|
3138
3171
|
i: i,
|
|
3139
3172
|
};
|
|
3140
3173
|
},
|
|
3141
|
-
revive: function (
|
|
3142
|
-
var i =
|
|
3174
|
+
revive: function (_k, altChannel) {
|
|
3175
|
+
var i = _k.i, mimeType = _k.mimeType;
|
|
3143
3176
|
return new Blob([altChannel[i]], { type: mimeType });
|
|
3144
3177
|
},
|
|
3145
3178
|
},
|
|
@@ -3158,8 +3191,8 @@ var numberDef = {
|
|
|
3158
3191
|
return num;
|
|
3159
3192
|
}
|
|
3160
3193
|
},
|
|
3161
|
-
revive: function (
|
|
3162
|
-
var v =
|
|
3194
|
+
revive: function (_k) {
|
|
3195
|
+
var v = _k.v;
|
|
3163
3196
|
return Number(v);
|
|
3164
3197
|
},
|
|
3165
3198
|
},
|
|
@@ -3178,8 +3211,8 @@ var DateDef = {
|
|
|
3178
3211
|
$t: "Date",
|
|
3179
3212
|
v: isNaN(date.getTime()) ? "NaN" : date.toISOString(),
|
|
3180
3213
|
}); },
|
|
3181
|
-
revive: function (
|
|
3182
|
-
var v =
|
|
3214
|
+
revive: function (_k) {
|
|
3215
|
+
var v = _k.v;
|
|
3183
3216
|
return new Date(v === "NaN" ? NaN : Date.parse(v));
|
|
3184
3217
|
},
|
|
3185
3218
|
},
|
|
@@ -3190,8 +3223,8 @@ var SetDef = {
|
|
|
3190
3223
|
$t: "Set",
|
|
3191
3224
|
v: Array.from(set.entries()),
|
|
3192
3225
|
}); },
|
|
3193
|
-
revive: function (
|
|
3194
|
-
var v =
|
|
3226
|
+
revive: function (_k) {
|
|
3227
|
+
var v = _k.v;
|
|
3195
3228
|
return new Set(v);
|
|
3196
3229
|
},
|
|
3197
3230
|
},
|
|
@@ -3202,8 +3235,8 @@ var MapDef = {
|
|
|
3202
3235
|
$t: "Map",
|
|
3203
3236
|
v: Array.from(map.entries()),
|
|
3204
3237
|
}); },
|
|
3205
|
-
revive: function (
|
|
3206
|
-
var v =
|
|
3238
|
+
revive: function (_k) {
|
|
3239
|
+
var v = _k.v;
|
|
3207
3240
|
return new Map(v);
|
|
3208
3241
|
},
|
|
3209
3242
|
},
|
|
@@ -3229,8 +3262,8 @@ var TypedArraysDefs = [
|
|
|
3229
3262
|
"BigInt64Array",
|
|
3230
3263
|
"BigUint64Array",
|
|
3231
3264
|
].reduce(function (specs, typeName) {
|
|
3232
|
-
var
|
|
3233
|
-
return (__assign(__assign({}, specs), (
|
|
3265
|
+
var _k;
|
|
3266
|
+
return (__assign(__assign({}, specs), (_k = {}, _k[typeName] = {
|
|
3234
3267
|
// Replace passes the the typed array into $t, buffer so that
|
|
3235
3268
|
// the ArrayBuffer typedef takes care of further handling of the buffer:
|
|
3236
3269
|
// {$t:"Uint8Array",buffer:{$t:"ArrayBuffer",idx:0}}
|
|
@@ -3245,13 +3278,13 @@ var TypedArraysDefs = [
|
|
|
3245
3278
|
};
|
|
3246
3279
|
return result;
|
|
3247
3280
|
},
|
|
3248
|
-
revive: function (
|
|
3249
|
-
var v =
|
|
3281
|
+
revive: function (_k, _, typeDefs) {
|
|
3282
|
+
var v = _k.v;
|
|
3250
3283
|
var TypedArray = _global[typeName];
|
|
3251
3284
|
return (TypedArray &&
|
|
3252
3285
|
new TypedArray(typeDefs.ArrayBuffer.revive({ v: v }, _, typeDefs)));
|
|
3253
3286
|
},
|
|
3254
|
-
},
|
|
3287
|
+
}, _k)));
|
|
3255
3288
|
}, {});
|
|
3256
3289
|
function b64LexEncode(b) {
|
|
3257
3290
|
return b64ToLex(b64encode(b));
|
|
@@ -3345,8 +3378,8 @@ var DECODE_TABLE = {
|
|
|
3345
3378
|
"|": "/",
|
|
3346
3379
|
};
|
|
3347
3380
|
var ENCODE_TABLE = {};
|
|
3348
|
-
for (var
|
|
3349
|
-
var c_1 =
|
|
3381
|
+
for (var _k = 0, _l = Object.keys(DECODE_TABLE); _k < _l.length; _k++) {
|
|
3382
|
+
var c_1 = _l[_k];
|
|
3350
3383
|
ENCODE_TABLE[DECODE_TABLE[c_1]] = c_1;
|
|
3351
3384
|
}
|
|
3352
3385
|
var ArrayBufferDef = {
|
|
@@ -3355,8 +3388,8 @@ var ArrayBufferDef = {
|
|
|
3355
3388
|
$t: "ArrayBuffer",
|
|
3356
3389
|
v: b64LexEncode(ab),
|
|
3357
3390
|
}); },
|
|
3358
|
-
revive: function (
|
|
3359
|
-
var v =
|
|
3391
|
+
revive: function (_k) {
|
|
3392
|
+
var v = _k.v;
|
|
3360
3393
|
var ba = b64LexDecode(v);
|
|
3361
3394
|
return ba.buffer.byteLength === ba.byteLength
|
|
3362
3395
|
? ba.buffer
|
|
@@ -3398,8 +3431,8 @@ var BlobDef = {
|
|
|
3398
3431
|
: b64encode(string2ArrayBuffer(readBlobSync(blob))),
|
|
3399
3432
|
type: blob.type,
|
|
3400
3433
|
}); },
|
|
3401
|
-
revive: function (
|
|
3402
|
-
var type =
|
|
3434
|
+
revive: function (_k) {
|
|
3435
|
+
var type = _k.type, v = _k.v;
|
|
3403
3436
|
var ab = b64decode(v);
|
|
3404
3437
|
return typeof Blob !== undefined
|
|
3405
3438
|
? new Blob([ab])
|
|
@@ -3410,13 +3443,13 @@ var BlobDef = {
|
|
|
3410
3443
|
var builtin = __assign(__assign(__assign(__assign(__assign(__assign(__assign(__assign({}, numberDef), bigIntDef), DateDef), SetDef), MapDef), TypedArraysDefs), ArrayBufferDef), BlobDef);
|
|
3411
3444
|
function Bison() {
|
|
3412
3445
|
var typeDefsInputs = [];
|
|
3413
|
-
for (var
|
|
3414
|
-
typeDefsInputs[
|
|
3446
|
+
for (var _k = 0; _k < arguments.length; _k++) {
|
|
3447
|
+
typeDefsInputs[_k] = arguments[_k];
|
|
3415
3448
|
}
|
|
3416
3449
|
var tson = TypesonSimplified.apply(void 0, __spreadArray$1([builtin, BisonBinaryTypes], typeDefsInputs, false));
|
|
3417
3450
|
return {
|
|
3418
3451
|
toBinary: function (value) {
|
|
3419
|
-
var
|
|
3452
|
+
var _k = this.stringify(value), blob = _k[0], json = _k[1];
|
|
3420
3453
|
var lenBuf = new ArrayBuffer(4);
|
|
3421
3454
|
new DataView(lenBuf).setUint32(0, blob.size);
|
|
3422
3455
|
return new Blob([lenBuf, blob, json]);
|
|
@@ -3432,16 +3465,16 @@ function Bison() {
|
|
|
3432
3465
|
return [blob, json];
|
|
3433
3466
|
},
|
|
3434
3467
|
parse: function (json, binData) {
|
|
3435
|
-
return __awaiter$
|
|
3468
|
+
return __awaiter$2(this, void 0, void 0, function () {
|
|
3436
3469
|
var pos, arrayBuffers, buf, view, len, ab;
|
|
3437
|
-
return __generator$1(this, function (
|
|
3438
|
-
switch (
|
|
3470
|
+
return __generator$1(this, function (_k) {
|
|
3471
|
+
switch (_k.label) {
|
|
3439
3472
|
case 0:
|
|
3440
3473
|
pos = 0;
|
|
3441
3474
|
arrayBuffers = [];
|
|
3442
3475
|
return [4 /*yield*/, readBlobBinary(binData)];
|
|
3443
3476
|
case 1:
|
|
3444
|
-
buf =
|
|
3477
|
+
buf = _k.sent();
|
|
3445
3478
|
view = new DataView(buf);
|
|
3446
3479
|
while (pos < buf.byteLength) {
|
|
3447
3480
|
len = view.getUint32(pos);
|
|
@@ -3456,21 +3489,21 @@ function Bison() {
|
|
|
3456
3489
|
});
|
|
3457
3490
|
},
|
|
3458
3491
|
fromBinary: function (blob) {
|
|
3459
|
-
return __awaiter$
|
|
3460
|
-
var len,
|
|
3461
|
-
return __generator$1(this, function (
|
|
3462
|
-
switch (
|
|
3492
|
+
return __awaiter$2(this, void 0, void 0, function () {
|
|
3493
|
+
var len, _k, binData, json;
|
|
3494
|
+
return __generator$1(this, function (_l) {
|
|
3495
|
+
switch (_l.label) {
|
|
3463
3496
|
case 0:
|
|
3464
|
-
|
|
3497
|
+
_k = DataView.bind;
|
|
3465
3498
|
return [4 /*yield*/, readBlobBinary(blob.slice(0, 4))];
|
|
3466
3499
|
case 1:
|
|
3467
|
-
len = new (
|
|
3500
|
+
len = new (_k.apply(DataView, [void 0, _l.sent()]))().getUint32(0);
|
|
3468
3501
|
binData = blob.slice(4, len + 4);
|
|
3469
3502
|
return [4 /*yield*/, readBlob(blob.slice(len + 4))];
|
|
3470
3503
|
case 2:
|
|
3471
|
-
json =
|
|
3504
|
+
json = _l.sent();
|
|
3472
3505
|
return [4 /*yield*/, this.parse(json, binData)];
|
|
3473
|
-
case 3: return [2 /*return*/,
|
|
3506
|
+
case 3: return [2 /*return*/, _l.sent()];
|
|
3474
3507
|
}
|
|
3475
3508
|
});
|
|
3476
3509
|
});
|
|
@@ -3536,16 +3569,16 @@ var FakeBigInt = /** @class */ (function () {
|
|
|
3536
3569
|
};
|
|
3537
3570
|
return FakeBigInt;
|
|
3538
3571
|
}());
|
|
3539
|
-
var defs =
|
|
3572
|
+
var defs = Object.assign(Object.assign({}, undefinedDef), (hasBigIntSupport
|
|
3540
3573
|
? {}
|
|
3541
3574
|
: {
|
|
3542
3575
|
bigint: {
|
|
3543
3576
|
test: function (val) { return val instanceof FakeBigInt; },
|
|
3544
3577
|
replace: function (fakeBigInt) {
|
|
3545
|
-
return
|
|
3578
|
+
return Object.assign({ $t: 'bigint' }, fakeBigInt);
|
|
3546
3579
|
},
|
|
3547
|
-
revive: function (
|
|
3548
|
-
var v =
|
|
3580
|
+
revive: function (_k) {
|
|
3581
|
+
var v = _k.v;
|
|
3549
3582
|
return new FakeBigInt(v);
|
|
3550
3583
|
}
|
|
3551
3584
|
}
|
|
@@ -3593,24 +3626,24 @@ function encodeIdsForServer(schema, currentUser, changes) {
|
|
|
3593
3626
|
});
|
|
3594
3627
|
rv.push(changeClone);
|
|
3595
3628
|
};
|
|
3596
|
-
for (var
|
|
3597
|
-
var change = changes_1[
|
|
3629
|
+
for (var _k = 0, changes_1 = changes; _k < changes_1.length; _k++) {
|
|
3630
|
+
var change = changes_1[_k];
|
|
3598
3631
|
_loop_2(change);
|
|
3599
3632
|
}
|
|
3600
3633
|
return rv;
|
|
3601
3634
|
}
|
|
3602
3635
|
function cloneChange(change, rewriteValues) {
|
|
3603
3636
|
// clone on demand:
|
|
3604
|
-
return
|
|
3605
|
-
? change.muts.map(function (m) { return (
|
|
3606
|
-
: change.muts.map(function (m) { return (
|
|
3637
|
+
return Object.assign(Object.assign({}, change), { muts: rewriteValues
|
|
3638
|
+
? change.muts.map(function (m) { return (Object.assign(Object.assign({}, m), { keys: m.keys.slice(), values: m.values.slice() })); })
|
|
3639
|
+
: change.muts.map(function (m) { return (Object.assign(Object.assign({}, m), { keys: m.keys.slice() })); }) });
|
|
3607
3640
|
}
|
|
3608
3641
|
//import {BisonWebStreamReader} from "dreambase-library/dist/typeson-simplified/BisonWebStreamReader";
|
|
3609
3642
|
function syncWithServer(changes, syncState, baseRevs, db, databaseUrl, schema, clientIdentity, currentUser) {
|
|
3610
3643
|
return __awaiter$1(this, void 0, void 0, function () {
|
|
3611
|
-
var headers, accessToken, syncRequest, res,
|
|
3612
|
-
return __generator$1(this, function (
|
|
3613
|
-
switch (
|
|
3644
|
+
var headers, accessToken, syncRequest, res, _k, _l, _m, text, syncRes;
|
|
3645
|
+
return __generator$1(this, function (_o) {
|
|
3646
|
+
switch (_o.label) {
|
|
3614
3647
|
case 0:
|
|
3615
3648
|
headers = {
|
|
3616
3649
|
Accept: 'application/json, application/x-bison, application/x-bison-stream',
|
|
@@ -3618,7 +3651,7 @@ function syncWithServer(changes, syncState, baseRevs, db, databaseUrl, schema, c
|
|
|
3618
3651
|
};
|
|
3619
3652
|
return [4 /*yield*/, loadAccessToken(db)];
|
|
3620
3653
|
case 1:
|
|
3621
|
-
accessToken =
|
|
3654
|
+
accessToken = _o.sent();
|
|
3622
3655
|
if (accessToken) {
|
|
3623
3656
|
headers.Authorization = "Bearer ".concat(accessToken);
|
|
3624
3657
|
}
|
|
@@ -3645,7 +3678,7 @@ function syncWithServer(changes, syncState, baseRevs, db, databaseUrl, schema, c
|
|
|
3645
3678
|
body: TSON.stringify(syncRequest)
|
|
3646
3679
|
})];
|
|
3647
3680
|
case 2:
|
|
3648
|
-
res =
|
|
3681
|
+
res = _o.sent();
|
|
3649
3682
|
//const contentLength = Number(res.headers.get('content-length'));
|
|
3650
3683
|
db.syncStateChangedEvent.next({
|
|
3651
3684
|
phase: 'pulling'
|
|
@@ -3653,20 +3686,20 @@ function syncWithServer(changes, syncState, baseRevs, db, databaseUrl, schema, c
|
|
|
3653
3686
|
if (!res.ok) {
|
|
3654
3687
|
throw new HttpError(res);
|
|
3655
3688
|
}
|
|
3656
|
-
|
|
3657
|
-
switch (
|
|
3689
|
+
_k = res.headers.get('content-type');
|
|
3690
|
+
switch (_k) {
|
|
3658
3691
|
case 'application/x-bison': return [3 /*break*/, 3];
|
|
3659
3692
|
case 'application/x-bison-stream': return [3 /*break*/, 5];
|
|
3660
3693
|
case 'application/json': return [3 /*break*/, 5];
|
|
3661
3694
|
}
|
|
3662
3695
|
return [3 /*break*/, 5];
|
|
3663
3696
|
case 3:
|
|
3664
|
-
|
|
3697
|
+
_m = (_l = BISON).fromBinary;
|
|
3665
3698
|
return [4 /*yield*/, res.blob()];
|
|
3666
|
-
case 4: return [2 /*return*/,
|
|
3699
|
+
case 4: return [2 /*return*/, _m.apply(_l, [_o.sent()])];
|
|
3667
3700
|
case 5: return [4 /*yield*/, res.text()];
|
|
3668
3701
|
case 6:
|
|
3669
|
-
text =
|
|
3702
|
+
text = _o.sent();
|
|
3670
3703
|
syncRes = TSON.parse(text);
|
|
3671
3704
|
return [2 /*return*/, syncRes];
|
|
3672
3705
|
}
|
|
@@ -3675,16 +3708,16 @@ function syncWithServer(changes, syncState, baseRevs, db, databaseUrl, schema, c
|
|
|
3675
3708
|
}
|
|
3676
3709
|
function modifyLocalObjectsWithNewUserId(syncifiedTables, currentUser, alreadySyncedRealms) {
|
|
3677
3710
|
return __awaiter$1(this, void 0, void 0, function () {
|
|
3678
|
-
var ignoredRealms,
|
|
3679
|
-
return __generator$1(this, function (
|
|
3680
|
-
switch (
|
|
3711
|
+
var ignoredRealms, _k, syncifiedTables_1, table;
|
|
3712
|
+
return __generator$1(this, function (_l) {
|
|
3713
|
+
switch (_l.label) {
|
|
3681
3714
|
case 0:
|
|
3682
3715
|
ignoredRealms = new Set(alreadySyncedRealms || []);
|
|
3683
|
-
|
|
3684
|
-
|
|
3716
|
+
_k = 0, syncifiedTables_1 = syncifiedTables;
|
|
3717
|
+
_l.label = 1;
|
|
3685
3718
|
case 1:
|
|
3686
|
-
if (!(
|
|
3687
|
-
table = syncifiedTables_1[
|
|
3719
|
+
if (!(_k < syncifiedTables_1.length)) return [3 /*break*/, 9];
|
|
3720
|
+
table = syncifiedTables_1[_k];
|
|
3688
3721
|
if (!(table.name === "members")) return [3 /*break*/, 3];
|
|
3689
3722
|
// members
|
|
3690
3723
|
return [4 /*yield*/, table.toCollection().modify(function (member) {
|
|
@@ -3694,7 +3727,7 @@ function modifyLocalObjectsWithNewUserId(syncifiedTables, currentUser, alreadySy
|
|
|
3694
3727
|
})];
|
|
3695
3728
|
case 2:
|
|
3696
3729
|
// members
|
|
3697
|
-
|
|
3730
|
+
_l.sent();
|
|
3698
3731
|
return [3 /*break*/, 8];
|
|
3699
3732
|
case 3:
|
|
3700
3733
|
if (!(table.name === "roles")) return [3 /*break*/, 4];
|
|
@@ -3709,7 +3742,7 @@ function modifyLocalObjectsWithNewUserId(syncifiedTables, currentUser, alreadySy
|
|
|
3709
3742
|
})];
|
|
3710
3743
|
case 5:
|
|
3711
3744
|
// realms
|
|
3712
|
-
|
|
3745
|
+
_l.sent();
|
|
3713
3746
|
return [3 /*break*/, 8];
|
|
3714
3747
|
case 6:
|
|
3715
3748
|
// application entities
|
|
@@ -3724,10 +3757,10 @@ function modifyLocalObjectsWithNewUserId(syncifiedTables, currentUser, alreadySy
|
|
|
3724
3757
|
})];
|
|
3725
3758
|
case 7:
|
|
3726
3759
|
// application entities
|
|
3727
|
-
|
|
3728
|
-
|
|
3760
|
+
_l.sent();
|
|
3761
|
+
_l.label = 8;
|
|
3729
3762
|
case 8:
|
|
3730
|
-
|
|
3763
|
+
_k++;
|
|
3731
3764
|
return [3 /*break*/, 1];
|
|
3732
3765
|
case 9: return [2 /*return*/];
|
|
3733
3766
|
}
|
|
@@ -3747,8 +3780,8 @@ self.addEventListener('online', function () { return isOnline = true; });
|
|
|
3747
3780
|
self.addEventListener('offline', function () { return isOnline = false; });
|
|
3748
3781
|
function updateBaseRevs(db, schema, latestRevisions, serverRev) {
|
|
3749
3782
|
return __awaiter$1(this, void 0, void 0, function () {
|
|
3750
|
-
return __generator$1(this, function (
|
|
3751
|
-
switch (
|
|
3783
|
+
return __generator$1(this, function (_k) {
|
|
3784
|
+
switch (_k.label) {
|
|
3752
3785
|
case 0: return [4 /*yield*/, db.$baseRevs.bulkPut(Object.keys(schema)
|
|
3753
3786
|
.filter(function (table) { return schema[table].markedForSync; })
|
|
3754
3787
|
.map(function (tableName) {
|
|
@@ -3760,7 +3793,7 @@ function updateBaseRevs(db, schema, latestRevisions, serverRev) {
|
|
|
3760
3793
|
};
|
|
3761
3794
|
}))];
|
|
3762
3795
|
case 1:
|
|
3763
|
-
|
|
3796
|
+
_k.sent();
|
|
3764
3797
|
return [2 /*return*/];
|
|
3765
3798
|
}
|
|
3766
3799
|
});
|
|
@@ -3768,8 +3801,8 @@ function updateBaseRevs(db, schema, latestRevisions, serverRev) {
|
|
|
3768
3801
|
}
|
|
3769
3802
|
function getLatestRevisionsPerTable(clientChangeSet, lastRevisions) {
|
|
3770
3803
|
if (lastRevisions === void 0) { lastRevisions = {}; }
|
|
3771
|
-
for (var
|
|
3772
|
-
var
|
|
3804
|
+
for (var _k = 0, clientChangeSet_1 = clientChangeSet; _k < clientChangeSet_1.length; _k++) {
|
|
3805
|
+
var _l = clientChangeSet_1[_k], table = _l.table, muts = _l.muts;
|
|
3773
3806
|
var lastRev = muts.length > 0 ? muts[muts.length - 1].rev : null;
|
|
3774
3807
|
lastRevisions[table] = lastRev || lastRevisions[table] || 0;
|
|
3775
3808
|
}
|
|
@@ -3778,18 +3811,18 @@ function getLatestRevisionsPerTable(clientChangeSet, lastRevisions) {
|
|
|
3778
3811
|
function bulkUpdate(table, keys, changeSpecs) {
|
|
3779
3812
|
return __awaiter$1(this, void 0, void 0, function () {
|
|
3780
3813
|
var objs, resultKeys, resultObjs;
|
|
3781
|
-
return __generator$1(this, function (
|
|
3782
|
-
switch (
|
|
3814
|
+
return __generator$1(this, function (_k) {
|
|
3815
|
+
switch (_k.label) {
|
|
3783
3816
|
case 0: return [4 /*yield*/, table.bulkGet(keys)];
|
|
3784
3817
|
case 1:
|
|
3785
|
-
objs =
|
|
3818
|
+
objs = _k.sent();
|
|
3786
3819
|
resultKeys = [];
|
|
3787
3820
|
resultObjs = [];
|
|
3788
3821
|
keys.forEach(function (key, idx) {
|
|
3789
3822
|
var obj = objs[idx];
|
|
3790
3823
|
if (obj) {
|
|
3791
|
-
for (var
|
|
3792
|
-
var
|
|
3824
|
+
for (var _k = 0, _l = Object.entries(changeSpecs[idx]); _k < _l.length; _k++) {
|
|
3825
|
+
var _m = _l[_k], keyPath = _m[0], value = _m[1];
|
|
3793
3826
|
if (keyPath === table.schema.primKey.keyPath) {
|
|
3794
3827
|
if (cmp(value, key) !== 0) {
|
|
3795
3828
|
throw new Error("Cannot change primary key");
|
|
@@ -3807,7 +3840,7 @@ function bulkUpdate(table, keys, changeSpecs) {
|
|
|
3807
3840
|
? table.bulkPut(resultObjs, resultKeys)
|
|
3808
3841
|
: table.bulkPut(resultObjs))];
|
|
3809
3842
|
case 2:
|
|
3810
|
-
|
|
3843
|
+
_k.sent();
|
|
3811
3844
|
return [2 /*return*/];
|
|
3812
3845
|
}
|
|
3813
3846
|
});
|
|
@@ -3815,15 +3848,15 @@ function bulkUpdate(table, keys, changeSpecs) {
|
|
|
3815
3848
|
}
|
|
3816
3849
|
function applyServerChanges(changes, db) {
|
|
3817
3850
|
return __awaiter$1(this, void 0, void 0, function () {
|
|
3818
|
-
var _loop_3,
|
|
3819
|
-
return __generator$1(this, function (
|
|
3820
|
-
switch (
|
|
3851
|
+
var _loop_3, _k, changes_2, _l, tableName, muts;
|
|
3852
|
+
return __generator$1(this, function (_m) {
|
|
3853
|
+
switch (_m.label) {
|
|
3821
3854
|
case 0:
|
|
3822
3855
|
console.debug('Applying server changes', changes, Dexie.currentTransaction);
|
|
3823
3856
|
_loop_3 = function (tableName, muts) {
|
|
3824
|
-
var table, primaryKey, keyDecoder, _loop_4,
|
|
3825
|
-
return __generator$1(this, function (
|
|
3826
|
-
switch (
|
|
3857
|
+
var table, primaryKey, keyDecoder, _loop_4, _o, muts_2, mut;
|
|
3858
|
+
return __generator$1(this, function (_p) {
|
|
3859
|
+
switch (_p.label) {
|
|
3827
3860
|
case 0:
|
|
3828
3861
|
table = db.table(tableName);
|
|
3829
3862
|
if (!table)
|
|
@@ -3838,7 +3871,7 @@ function applyServerChanges(changes, db) {
|
|
|
3838
3871
|
// On server, array keys are transformed to JSON string representation
|
|
3839
3872
|
return JSON.parse(key);
|
|
3840
3873
|
}
|
|
3841
|
-
catch (
|
|
3874
|
+
catch (_a) { }
|
|
3842
3875
|
return key;
|
|
3843
3876
|
case '#':
|
|
3844
3877
|
// Decode private ID (do the opposite from what's done in encodeIdsForServer())
|
|
@@ -3851,13 +3884,13 @@ function applyServerChanges(changes, db) {
|
|
|
3851
3884
|
}
|
|
3852
3885
|
};
|
|
3853
3886
|
_loop_4 = function (mut) {
|
|
3854
|
-
var keys,
|
|
3855
|
-
return __generator$1(this, function (
|
|
3856
|
-
switch (
|
|
3887
|
+
var keys, _q;
|
|
3888
|
+
return __generator$1(this, function (_r) {
|
|
3889
|
+
switch (_r.label) {
|
|
3857
3890
|
case 0:
|
|
3858
3891
|
keys = mut.keys.map(keyDecoder);
|
|
3859
|
-
|
|
3860
|
-
switch (
|
|
3892
|
+
_q = mut.type;
|
|
3893
|
+
switch (_q) {
|
|
3861
3894
|
case 'insert': return [3 /*break*/, 1];
|
|
3862
3895
|
case 'upsert': return [3 /*break*/, 6];
|
|
3863
3896
|
case 'modify': return [3 /*break*/, 11];
|
|
@@ -3869,7 +3902,7 @@ function applyServerChanges(changes, db) {
|
|
|
3869
3902
|
if (!primaryKey.outbound) return [3 /*break*/, 3];
|
|
3870
3903
|
return [4 /*yield*/, table.bulkAdd(mut.values, keys)];
|
|
3871
3904
|
case 2:
|
|
3872
|
-
|
|
3905
|
+
_r.sent();
|
|
3873
3906
|
return [3 /*break*/, 5];
|
|
3874
3907
|
case 3:
|
|
3875
3908
|
keys.forEach(function (key, i) {
|
|
@@ -3878,14 +3911,14 @@ function applyServerChanges(changes, db) {
|
|
|
3878
3911
|
});
|
|
3879
3912
|
return [4 /*yield*/, table.bulkAdd(mut.values)];
|
|
3880
3913
|
case 4:
|
|
3881
|
-
|
|
3882
|
-
|
|
3914
|
+
_r.sent();
|
|
3915
|
+
_r.label = 5;
|
|
3883
3916
|
case 5: return [3 /*break*/, 20];
|
|
3884
3917
|
case 6:
|
|
3885
3918
|
if (!primaryKey.outbound) return [3 /*break*/, 8];
|
|
3886
3919
|
return [4 /*yield*/, table.bulkPut(mut.values, keys)];
|
|
3887
3920
|
case 7:
|
|
3888
|
-
|
|
3921
|
+
_r.sent();
|
|
3889
3922
|
return [3 /*break*/, 10];
|
|
3890
3923
|
case 8:
|
|
3891
3924
|
keys.forEach(function (key, i) {
|
|
@@ -3894,59 +3927,59 @@ function applyServerChanges(changes, db) {
|
|
|
3894
3927
|
});
|
|
3895
3928
|
return [4 /*yield*/, table.bulkPut(mut.values)];
|
|
3896
3929
|
case 9:
|
|
3897
|
-
|
|
3898
|
-
|
|
3930
|
+
_r.sent();
|
|
3931
|
+
_r.label = 10;
|
|
3899
3932
|
case 10: return [3 /*break*/, 20];
|
|
3900
3933
|
case 11:
|
|
3901
3934
|
if (!(keys.length === 1)) return [3 /*break*/, 13];
|
|
3902
3935
|
return [4 /*yield*/, table.update(keys[0], mut.changeSpec)];
|
|
3903
3936
|
case 12:
|
|
3904
|
-
|
|
3937
|
+
_r.sent();
|
|
3905
3938
|
return [3 /*break*/, 15];
|
|
3906
3939
|
case 13: return [4 /*yield*/, table.where(':id').anyOf(keys).modify(mut.changeSpec)];
|
|
3907
3940
|
case 14:
|
|
3908
|
-
|
|
3909
|
-
|
|
3941
|
+
_r.sent();
|
|
3942
|
+
_r.label = 15;
|
|
3910
3943
|
case 15: return [3 /*break*/, 20];
|
|
3911
3944
|
case 16: return [4 /*yield*/, bulkUpdate(table, keys, mut.changeSpecs)];
|
|
3912
3945
|
case 17:
|
|
3913
|
-
|
|
3946
|
+
_r.sent();
|
|
3914
3947
|
return [3 /*break*/, 20];
|
|
3915
3948
|
case 18: return [4 /*yield*/, table.bulkDelete(keys)];
|
|
3916
3949
|
case 19:
|
|
3917
|
-
|
|
3950
|
+
_r.sent();
|
|
3918
3951
|
return [3 /*break*/, 20];
|
|
3919
3952
|
case 20: return [2 /*return*/];
|
|
3920
3953
|
}
|
|
3921
3954
|
});
|
|
3922
3955
|
};
|
|
3923
|
-
|
|
3924
|
-
|
|
3956
|
+
_o = 0, muts_2 = muts;
|
|
3957
|
+
_p.label = 1;
|
|
3925
3958
|
case 1:
|
|
3926
|
-
if (!(
|
|
3927
|
-
mut = muts_2[
|
|
3959
|
+
if (!(_o < muts_2.length)) return [3 /*break*/, 4];
|
|
3960
|
+
mut = muts_2[_o];
|
|
3928
3961
|
return [5 /*yield**/, _loop_4(mut)];
|
|
3929
3962
|
case 2:
|
|
3930
|
-
|
|
3931
|
-
|
|
3963
|
+
_p.sent();
|
|
3964
|
+
_p.label = 3;
|
|
3932
3965
|
case 3:
|
|
3933
|
-
|
|
3966
|
+
_o++;
|
|
3934
3967
|
return [3 /*break*/, 1];
|
|
3935
3968
|
case 4: return [2 /*return*/];
|
|
3936
3969
|
}
|
|
3937
3970
|
});
|
|
3938
3971
|
};
|
|
3939
|
-
|
|
3940
|
-
|
|
3972
|
+
_k = 0, changes_2 = changes;
|
|
3973
|
+
_m.label = 1;
|
|
3941
3974
|
case 1:
|
|
3942
|
-
if (!(
|
|
3943
|
-
|
|
3975
|
+
if (!(_k < changes_2.length)) return [3 /*break*/, 4];
|
|
3976
|
+
_l = changes_2[_k], tableName = _l.table, muts = _l.muts;
|
|
3944
3977
|
return [5 /*yield**/, _loop_3(tableName, muts)];
|
|
3945
3978
|
case 2:
|
|
3946
|
-
|
|
3947
|
-
|
|
3979
|
+
_m.sent();
|
|
3980
|
+
_m.label = 3;
|
|
3948
3981
|
case 3:
|
|
3949
|
-
|
|
3982
|
+
_k++;
|
|
3950
3983
|
return [3 /*break*/, 1];
|
|
3951
3984
|
case 4: return [2 /*return*/];
|
|
3952
3985
|
}
|
|
@@ -3966,8 +3999,8 @@ function sync(db, options, schema, syncOptions) {
|
|
|
3966
3999
|
}
|
|
3967
4000
|
})
|
|
3968
4001
|
.catch(function (error) { return __awaiter$1(_this_1, void 0, void 0, function () {
|
|
3969
|
-
return __generator$1(this, function (
|
|
3970
|
-
switch (
|
|
4002
|
+
return __generator$1(this, function (_k) {
|
|
4003
|
+
switch (_k.label) {
|
|
3971
4004
|
case 0:
|
|
3972
4005
|
if (syncOptions === null || syncOptions === void 0 ? void 0 : syncOptions.justCheckIfNeeded)
|
|
3973
4006
|
return [2 /*return*/, Promise.reject(error)]; // Just rethrow.
|
|
@@ -3988,9 +4021,9 @@ function sync(db, options, schema, syncOptions) {
|
|
|
3988
4021
|
return [4 /*yield*/, new Promise(function (resolve) { return setTimeout(resolve, 500); })];
|
|
3989
4022
|
case 1:
|
|
3990
4023
|
// Retry again in 500 ms but if it fails again, don't retry.
|
|
3991
|
-
|
|
3992
|
-
return [4 /*yield*/, sync(db, options, schema,
|
|
3993
|
-
case 2: return [2 /*return*/,
|
|
4024
|
+
_k.sent();
|
|
4025
|
+
return [4 /*yield*/, sync(db, options, schema, Object.assign(Object.assign({}, syncOptions), { retryImmediatelyOnFetchError: false }))];
|
|
4026
|
+
case 2: return [2 /*return*/, _k.sent()];
|
|
3994
4027
|
case 3:
|
|
3995
4028
|
// Make sure that no matter whether sync() explodes or not,
|
|
3996
4029
|
// always update the timestamp. Also store the error.
|
|
@@ -4001,7 +4034,7 @@ function sync(db, options, schema, syncOptions) {
|
|
|
4001
4034
|
case 4:
|
|
4002
4035
|
// Make sure that no matter whether sync() explodes or not,
|
|
4003
4036
|
// always update the timestamp. Also store the error.
|
|
4004
|
-
|
|
4037
|
+
_k.sent();
|
|
4005
4038
|
db.syncStateChangedEvent.next({
|
|
4006
4039
|
phase: isOnline ? 'error' : 'offline',
|
|
4007
4040
|
error: error,
|
|
@@ -4011,31 +4044,31 @@ function sync(db, options, schema, syncOptions) {
|
|
|
4011
4044
|
});
|
|
4012
4045
|
}); });
|
|
4013
4046
|
}
|
|
4014
|
-
function _sync(db, options, schema,
|
|
4015
|
-
var
|
|
4016
|
-
var _g = _e === void 0 ? {
|
|
4047
|
+
function _sync(db, options, schema, _k) {
|
|
4048
|
+
var _l = _k === void 0 ? {
|
|
4017
4049
|
isInitialSync: false,
|
|
4018
|
-
} :
|
|
4050
|
+
} : _k, isInitialSync = _l.isInitialSync, cancelToken = _l.cancelToken, justCheckIfNeeded = _l.justCheckIfNeeded, purpose = _l.purpose;
|
|
4051
|
+
var _a;
|
|
4019
4052
|
return __awaiter$1(this, void 0, void 0, function () {
|
|
4020
|
-
var databaseUrl, currentUser, tablesToSync, mutationTables, persistedSyncState, tablesToSyncify, doSyncify,
|
|
4053
|
+
var databaseUrl, currentUser, tablesToSync, mutationTables, persistedSyncState, tablesToSyncify, doSyncify, _k, clientChangeSet, syncState, baseRevs, syncIsNeeded, latestRevisions, clientIdentity, res, done;
|
|
4021
4054
|
var _this_1 = this;
|
|
4022
|
-
return __generator$1(this, function (
|
|
4023
|
-
switch (
|
|
4055
|
+
return __generator$1(this, function (_l) {
|
|
4056
|
+
switch (_l.label) {
|
|
4024
4057
|
case 0:
|
|
4025
4058
|
if (!justCheckIfNeeded) {
|
|
4026
4059
|
console.debug('SYNC STARTED', { isInitialSync: isInitialSync, purpose: purpose });
|
|
4027
4060
|
}
|
|
4028
|
-
if (!((
|
|
4061
|
+
if (!((_a = db.cloud.options) === null || _a === void 0 ? void 0 : _a.databaseUrl))
|
|
4029
4062
|
throw new Error("Internal error: sync must not be called when no databaseUrl is configured");
|
|
4030
4063
|
databaseUrl = options.databaseUrl;
|
|
4031
4064
|
return [4 /*yield*/, db.getCurrentUser()];
|
|
4032
4065
|
case 1:
|
|
4033
|
-
currentUser =
|
|
4066
|
+
currentUser = _l.sent();
|
|
4034
4067
|
tablesToSync = currentUser.isLoggedIn ? getSyncableTables(db) : [];
|
|
4035
4068
|
mutationTables = tablesToSync.map(function (tbl) { return db.table(getMutationTable(tbl.name)); });
|
|
4036
4069
|
return [4 /*yield*/, db.getPersistedSyncState()];
|
|
4037
4070
|
case 2:
|
|
4038
|
-
persistedSyncState =
|
|
4071
|
+
persistedSyncState = _l.sent();
|
|
4039
4072
|
tablesToSyncify = !isInitialSync && currentUser.isLoggedIn
|
|
4040
4073
|
? getTablesToSyncify(db, persistedSyncState)
|
|
4041
4074
|
: [];
|
|
@@ -4046,8 +4079,8 @@ function _sync(db, options, schema, _e) {
|
|
|
4046
4079
|
return [2 /*return*/, true];
|
|
4047
4080
|
//console.debug('sync doSyncify is true');
|
|
4048
4081
|
return [4 /*yield*/, db.transaction('rw', tablesToSyncify, function (tx) { return __awaiter$1(_this_1, void 0, void 0, function () {
|
|
4049
|
-
return __generator$1(this, function (
|
|
4050
|
-
switch (
|
|
4082
|
+
return __generator$1(this, function (_k) {
|
|
4083
|
+
switch (_k.label) {
|
|
4051
4084
|
case 0:
|
|
4052
4085
|
// @ts-ignore
|
|
4053
4086
|
tx.idbtrans.disableChangeTracking = true;
|
|
@@ -4055,35 +4088,35 @@ function _sync(db, options, schema, _e) {
|
|
|
4055
4088
|
tx.idbtrans.disableAccessControl = true; // TODO: Take care of this flag in access control middleware!
|
|
4056
4089
|
return [4 /*yield*/, modifyLocalObjectsWithNewUserId(tablesToSyncify, currentUser, persistedSyncState === null || persistedSyncState === void 0 ? void 0 : persistedSyncState.realms)];
|
|
4057
4090
|
case 1:
|
|
4058
|
-
|
|
4091
|
+
_k.sent();
|
|
4059
4092
|
return [2 /*return*/];
|
|
4060
4093
|
}
|
|
4061
4094
|
});
|
|
4062
4095
|
}); })];
|
|
4063
4096
|
case 3:
|
|
4064
4097
|
//console.debug('sync doSyncify is true');
|
|
4065
|
-
|
|
4098
|
+
_l.sent();
|
|
4066
4099
|
throwIfCancelled(cancelToken);
|
|
4067
|
-
|
|
4100
|
+
_l.label = 4;
|
|
4068
4101
|
case 4: return [4 /*yield*/, db.transaction('r', db.tables, function () { return __awaiter$1(_this_1, void 0, void 0, function () {
|
|
4069
4102
|
var syncState, baseRevs, clientChanges, alreadySyncedRealms, syncificationInserts;
|
|
4070
|
-
return __generator$1(this, function (
|
|
4071
|
-
switch (
|
|
4103
|
+
return __generator$1(this, function (_k) {
|
|
4104
|
+
switch (_k.label) {
|
|
4072
4105
|
case 0: return [4 /*yield*/, db.getPersistedSyncState()];
|
|
4073
4106
|
case 1:
|
|
4074
|
-
syncState =
|
|
4107
|
+
syncState = _k.sent();
|
|
4075
4108
|
return [4 /*yield*/, db.$baseRevs.toArray()];
|
|
4076
4109
|
case 2:
|
|
4077
|
-
baseRevs =
|
|
4110
|
+
baseRevs = _k.sent();
|
|
4078
4111
|
return [4 /*yield*/, listClientChanges(mutationTables)];
|
|
4079
4112
|
case 3:
|
|
4080
|
-
clientChanges =
|
|
4113
|
+
clientChanges = _k.sent();
|
|
4081
4114
|
throwIfCancelled(cancelToken);
|
|
4082
4115
|
if (!doSyncify) return [3 /*break*/, 5];
|
|
4083
4116
|
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);
|
|
4084
4117
|
return [4 /*yield*/, listSyncifiedChanges(tablesToSyncify, currentUser, schema, alreadySyncedRealms)];
|
|
4085
4118
|
case 4:
|
|
4086
|
-
syncificationInserts =
|
|
4119
|
+
syncificationInserts = _k.sent();
|
|
4087
4120
|
throwIfCancelled(cancelToken);
|
|
4088
4121
|
clientChanges = clientChanges.concat(syncificationInserts);
|
|
4089
4122
|
return [2 /*return*/, [clientChanges, syncState, baseRevs]];
|
|
@@ -4092,7 +4125,7 @@ function _sync(db, options, schema, _e) {
|
|
|
4092
4125
|
});
|
|
4093
4126
|
}); })];
|
|
4094
4127
|
case 5:
|
|
4095
|
-
|
|
4128
|
+
_k = _l.sent(), clientChangeSet = _k[0], syncState = _k[1], baseRevs = _k[2];
|
|
4096
4129
|
syncIsNeeded = clientChangeSet.some(function (set) { return set.muts.some(function (mut) { return mut.keys.length > 0; }); });
|
|
4097
4130
|
if (justCheckIfNeeded) {
|
|
4098
4131
|
console.debug('Sync is needed:', syncIsNeeded);
|
|
@@ -4110,12 +4143,12 @@ function _sync(db, options, schema, _e) {
|
|
|
4110
4143
|
throwIfCancelled(cancelToken);
|
|
4111
4144
|
return [4 /*yield*/, syncWithServer(clientChangeSet, syncState, baseRevs, db, databaseUrl, schema, clientIdentity, currentUser)];
|
|
4112
4145
|
case 6:
|
|
4113
|
-
res =
|
|
4146
|
+
res = _l.sent();
|
|
4114
4147
|
console.debug('Sync response', res);
|
|
4115
4148
|
return [4 /*yield*/, db.transaction('rw', db.tables, function (tx) { return __awaiter$1(_this_1, void 0, void 0, function () {
|
|
4116
|
-
var
|
|
4117
|
-
return __generator$1(this, function (
|
|
4118
|
-
switch (
|
|
4149
|
+
var _k, _l, tableName, addedClientChanges, _loop_5, _m, mutationTables_1, mutTable, syncState, newSyncState, filteredChanges;
|
|
4150
|
+
return __generator$1(this, function (_o) {
|
|
4151
|
+
switch (_o.label) {
|
|
4119
4152
|
case 0:
|
|
4120
4153
|
// @ts-ignore
|
|
4121
4154
|
tx.idbtrans.disableChangeTracking = true;
|
|
@@ -4123,8 +4156,8 @@ function _sync(db, options, schema, _e) {
|
|
|
4123
4156
|
tx.idbtrans.disableAccessControl = true; // TODO: Take care of this flag in access control middleware!
|
|
4124
4157
|
// Update db.cloud.schema from server response.
|
|
4125
4158
|
// Local schema MAY include a subset of tables, so do not force all tables into local schema.
|
|
4126
|
-
for (
|
|
4127
|
-
tableName =
|
|
4159
|
+
for (_k = 0, _l = Object.keys(schema); _k < _l.length; _k++) {
|
|
4160
|
+
tableName = _l[_k];
|
|
4128
4161
|
if (res.schema[tableName]) {
|
|
4129
4162
|
// Write directly into configured schema. This code can only be executed alone.
|
|
4130
4163
|
schema[tableName] = res.schema[tableName];
|
|
@@ -4132,16 +4165,16 @@ function _sync(db, options, schema, _e) {
|
|
|
4132
4165
|
}
|
|
4133
4166
|
return [4 /*yield*/, db.$syncState.put(schema, 'schema')];
|
|
4134
4167
|
case 1:
|
|
4135
|
-
|
|
4168
|
+
_o.sent();
|
|
4136
4169
|
return [4 /*yield*/, listClientChanges(mutationTables, db, {
|
|
4137
4170
|
since: latestRevisions,
|
|
4138
4171
|
})];
|
|
4139
4172
|
case 2:
|
|
4140
|
-
addedClientChanges =
|
|
4173
|
+
addedClientChanges = _o.sent();
|
|
4141
4174
|
_loop_5 = function (mutTable) {
|
|
4142
4175
|
var tableName, latestRev;
|
|
4143
|
-
return __generator$1(this, function (
|
|
4144
|
-
switch (
|
|
4176
|
+
return __generator$1(this, function (_p) {
|
|
4177
|
+
switch (_p.label) {
|
|
4145
4178
|
case 0:
|
|
4146
4179
|
tableName = getTableFromMutationTable(mutTable.name);
|
|
4147
4180
|
if (!!addedClientChanges.some(function (ch) { return ch.table === tableName && ch.muts.length > 0; })) return [3 /*break*/, 2];
|
|
@@ -4158,7 +4191,7 @@ function _sync(db, options, schema, _e) {
|
|
|
4158
4191
|
// to the server.
|
|
4159
4192
|
// It is therefore safe to clear all changes (which is faster than
|
|
4160
4193
|
// deleting a range)
|
|
4161
|
-
|
|
4194
|
+
_p.sent();
|
|
4162
4195
|
return [3 /*break*/, 5];
|
|
4163
4196
|
case 2:
|
|
4164
4197
|
if (!latestRevisions[tableName]) return [3 /*break*/, 4];
|
|
@@ -4173,25 +4206,25 @@ function _sync(db, options, schema, _e) {
|
|
|
4173
4206
|
.delete(),
|
|
4174
4207
|
])];
|
|
4175
4208
|
case 3:
|
|
4176
|
-
|
|
4209
|
+
_p.sent();
|
|
4177
4210
|
return [3 /*break*/, 5];
|
|
4178
4211
|
case 4:
|
|
4179
|
-
|
|
4212
|
+
_p.label = 5;
|
|
4180
4213
|
case 5: return [2 /*return*/];
|
|
4181
4214
|
}
|
|
4182
4215
|
});
|
|
4183
4216
|
};
|
|
4184
|
-
|
|
4185
|
-
|
|
4217
|
+
_m = 0, mutationTables_1 = mutationTables;
|
|
4218
|
+
_o.label = 3;
|
|
4186
4219
|
case 3:
|
|
4187
|
-
if (!(
|
|
4188
|
-
mutTable = mutationTables_1[
|
|
4220
|
+
if (!(_m < mutationTables_1.length)) return [3 /*break*/, 6];
|
|
4221
|
+
mutTable = mutationTables_1[_m];
|
|
4189
4222
|
return [5 /*yield**/, _loop_5(mutTable)];
|
|
4190
4223
|
case 4:
|
|
4191
|
-
|
|
4192
|
-
|
|
4224
|
+
_o.sent();
|
|
4225
|
+
_o.label = 5;
|
|
4193
4226
|
case 5:
|
|
4194
|
-
|
|
4227
|
+
_m++;
|
|
4195
4228
|
return [3 /*break*/, 3];
|
|
4196
4229
|
case 6:
|
|
4197
4230
|
// Update latestRevisions object according to additional changes:
|
|
@@ -4214,10 +4247,10 @@ function _sync(db, options, schema, _e) {
|
|
|
4214
4247
|
// The purpose of this operation is to mark a start revision (per table)
|
|
4215
4248
|
// so that all client-mutations that come after this, will be mapped to current
|
|
4216
4249
|
// server revision.
|
|
4217
|
-
|
|
4250
|
+
_o.sent();
|
|
4218
4251
|
return [4 /*yield*/, db.getPersistedSyncState()];
|
|
4219
4252
|
case 8:
|
|
4220
|
-
syncState =
|
|
4253
|
+
syncState = _o.sent();
|
|
4221
4254
|
//
|
|
4222
4255
|
// Delete objects from removed realms
|
|
4223
4256
|
//
|
|
@@ -4226,7 +4259,7 @@ function _sync(db, options, schema, _e) {
|
|
|
4226
4259
|
//
|
|
4227
4260
|
// Delete objects from removed realms
|
|
4228
4261
|
//
|
|
4229
|
-
|
|
4262
|
+
_o.sent();
|
|
4230
4263
|
newSyncState = syncState || {
|
|
4231
4264
|
syncedTables: [],
|
|
4232
4265
|
latestRevisions: {},
|
|
@@ -4254,7 +4287,7 @@ function _sync(db, options, schema, _e) {
|
|
|
4254
4287
|
//
|
|
4255
4288
|
// apply server changes
|
|
4256
4289
|
//
|
|
4257
|
-
|
|
4290
|
+
_o.sent();
|
|
4258
4291
|
//
|
|
4259
4292
|
// Update syncState
|
|
4260
4293
|
//
|
|
@@ -4264,11 +4297,11 @@ function _sync(db, options, schema, _e) {
|
|
|
4264
4297
|
});
|
|
4265
4298
|
}); })];
|
|
4266
4299
|
case 7:
|
|
4267
|
-
done =
|
|
4300
|
+
done = _l.sent();
|
|
4268
4301
|
if (!!done) return [3 /*break*/, 9];
|
|
4269
4302
|
console.debug('MORE SYNC NEEDED. Go for it again!');
|
|
4270
4303
|
return [4 /*yield*/, _sync(db, options, schema, { isInitialSync: isInitialSync, cancelToken: cancelToken })];
|
|
4271
|
-
case 8: return [2 /*return*/,
|
|
4304
|
+
case 8: return [2 /*return*/, _l.sent()];
|
|
4272
4305
|
case 9:
|
|
4273
4306
|
console.debug('SYNC DONE', { isInitialSync: isInitialSync });
|
|
4274
4307
|
return [2 /*return*/, false]; // Not needed anymore
|
|
@@ -4278,9 +4311,9 @@ function _sync(db, options, schema, _e) {
|
|
|
4278
4311
|
}
|
|
4279
4312
|
function deleteObjectsFromRemovedRealms(db, res, prevState) {
|
|
4280
4313
|
return __awaiter$1(this, void 0, void 0, function () {
|
|
4281
|
-
var deletedRealms, rejectedRealms, previousRealmSet, previousInviteRealmSet, updatedRealmSet, updatedTotalRealmSet,
|
|
4282
|
-
return __generator$1(this, function (
|
|
4283
|
-
switch (
|
|
4314
|
+
var deletedRealms, rejectedRealms, previousRealmSet, previousInviteRealmSet, updatedRealmSet, updatedTotalRealmSet, _k, previousRealmSet_1, realmId, _l, _m, realmId, tables, _loop_6, _o, tables_1, table;
|
|
4315
|
+
return __generator$1(this, function (_p) {
|
|
4316
|
+
switch (_p.label) {
|
|
4284
4317
|
case 0:
|
|
4285
4318
|
deletedRealms = new Set();
|
|
4286
4319
|
rejectedRealms = new Set();
|
|
@@ -4288,8 +4321,8 @@ function deleteObjectsFromRemovedRealms(db, res, prevState) {
|
|
|
4288
4321
|
previousInviteRealmSet = prevState ? prevState.inviteRealms : [];
|
|
4289
4322
|
updatedRealmSet = new Set(res.realms);
|
|
4290
4323
|
updatedTotalRealmSet = new Set(res.realms.concat(res.inviteRealms));
|
|
4291
|
-
for (
|
|
4292
|
-
realmId = previousRealmSet_1[
|
|
4324
|
+
for (_k = 0, previousRealmSet_1 = previousRealmSet; _k < previousRealmSet_1.length; _k++) {
|
|
4325
|
+
realmId = previousRealmSet_1[_k];
|
|
4293
4326
|
if (!updatedRealmSet.has(realmId)) {
|
|
4294
4327
|
rejectedRealms.add(realmId);
|
|
4295
4328
|
if (!updatedTotalRealmSet.has(realmId)) {
|
|
@@ -4297,8 +4330,8 @@ function deleteObjectsFromRemovedRealms(db, res, prevState) {
|
|
|
4297
4330
|
}
|
|
4298
4331
|
}
|
|
4299
4332
|
}
|
|
4300
|
-
for (
|
|
4301
|
-
realmId =
|
|
4333
|
+
for (_l = 0, _m = previousInviteRealmSet.concat(previousRealmSet); _l < _m.length; _l++) {
|
|
4334
|
+
realmId = _m[_l];
|
|
4302
4335
|
if (!updatedTotalRealmSet.has(realmId)) {
|
|
4303
4336
|
deletedRealms.add(realmId);
|
|
4304
4337
|
}
|
|
@@ -4307,8 +4340,8 @@ function deleteObjectsFromRemovedRealms(db, res, prevState) {
|
|
|
4307
4340
|
tables = getSyncableTables(db);
|
|
4308
4341
|
_loop_6 = function (table) {
|
|
4309
4342
|
var realmsToDelete;
|
|
4310
|
-
return __generator$1(this, function (
|
|
4311
|
-
switch (
|
|
4343
|
+
return __generator$1(this, function (_q) {
|
|
4344
|
+
switch (_q.label) {
|
|
4312
4345
|
case 0:
|
|
4313
4346
|
realmsToDelete = ['realms', 'members', 'roles'].includes(table.name)
|
|
4314
4347
|
? deletedRealms // These tables should spare rejected ones.
|
|
@@ -4326,7 +4359,7 @@ function deleteObjectsFromRemovedRealms(db, res, prevState) {
|
|
|
4326
4359
|
case 1:
|
|
4327
4360
|
// There's an index to use:
|
|
4328
4361
|
//console.debug(`REMOVAL: deleting all ${table.name} where realmId anyOf `, JSON.stringify([...realmsToDelete]));
|
|
4329
|
-
|
|
4362
|
+
_q.sent();
|
|
4330
4363
|
return [3 /*break*/, 4];
|
|
4331
4364
|
case 2:
|
|
4332
4365
|
// No index to use:
|
|
@@ -4337,23 +4370,23 @@ function deleteObjectsFromRemovedRealms(db, res, prevState) {
|
|
|
4337
4370
|
case 3:
|
|
4338
4371
|
// No index to use:
|
|
4339
4372
|
//console.debug(`REMOVAL: deleting all ${table.name} where realmId is any of `, JSON.stringify([...realmsToDelete]), realmsToDelete.size);
|
|
4340
|
-
|
|
4341
|
-
|
|
4373
|
+
_q.sent();
|
|
4374
|
+
_q.label = 4;
|
|
4342
4375
|
case 4: return [2 /*return*/];
|
|
4343
4376
|
}
|
|
4344
4377
|
});
|
|
4345
4378
|
};
|
|
4346
|
-
|
|
4347
|
-
|
|
4379
|
+
_o = 0, tables_1 = tables;
|
|
4380
|
+
_p.label = 1;
|
|
4348
4381
|
case 1:
|
|
4349
|
-
if (!(
|
|
4350
|
-
table = tables_1[
|
|
4382
|
+
if (!(_o < tables_1.length)) return [3 /*break*/, 4];
|
|
4383
|
+
table = tables_1[_o];
|
|
4351
4384
|
return [5 /*yield**/, _loop_6(table)];
|
|
4352
4385
|
case 2:
|
|
4353
|
-
|
|
4354
|
-
|
|
4386
|
+
_p.sent();
|
|
4387
|
+
_p.label = 3;
|
|
4355
4388
|
case 3:
|
|
4356
|
-
|
|
4389
|
+
_o++;
|
|
4357
4390
|
return [3 /*break*/, 1];
|
|
4358
4391
|
case 4: return [2 /*return*/];
|
|
4359
4392
|
}
|
|
@@ -4377,8 +4410,8 @@ function MessagesFromServerConsumer(db) {
|
|
|
4377
4410
|
var loopWarning = 0;
|
|
4378
4411
|
var loopDetection = [0, 0, 0, 0, 0, 0, 0, 0, 0, Date.now()];
|
|
4379
4412
|
event.subscribe(function () { return __awaiter$1(_this_1, void 0, void 0, function () {
|
|
4380
|
-
return __generator$1(this, function (
|
|
4381
|
-
switch (
|
|
4413
|
+
return __generator$1(this, function (_k) {
|
|
4414
|
+
switch (_k.label) {
|
|
4382
4415
|
case 0:
|
|
4383
4416
|
if (isWorking)
|
|
4384
4417
|
return [2 /*return*/];
|
|
@@ -4387,12 +4420,12 @@ function MessagesFromServerConsumer(db) {
|
|
|
4387
4420
|
loopDetection.shift();
|
|
4388
4421
|
loopDetection.push(Date.now());
|
|
4389
4422
|
readyToServe.next(false);
|
|
4390
|
-
|
|
4423
|
+
_k.label = 1;
|
|
4391
4424
|
case 1:
|
|
4392
|
-
|
|
4425
|
+
_k.trys.push([1, , 3, 8]);
|
|
4393
4426
|
return [4 /*yield*/, consumeQueue()];
|
|
4394
4427
|
case 2:
|
|
4395
|
-
|
|
4428
|
+
_k.sent();
|
|
4396
4429
|
return [3 /*break*/, 8];
|
|
4397
4430
|
case 3:
|
|
4398
4431
|
if (!(loopDetection[loopDetection.length - 1] - loopDetection[0] <
|
|
@@ -4403,7 +4436,7 @@ function MessagesFromServerConsumer(db) {
|
|
|
4403
4436
|
loopWarning = Date.now() + 60000;
|
|
4404
4437
|
return [4 /*yield*/, new Promise(function (resolve) { return setTimeout(resolve, 60000); })];
|
|
4405
4438
|
case 4:
|
|
4406
|
-
|
|
4439
|
+
_k.sent();
|
|
4407
4440
|
return [3 /*break*/, 7];
|
|
4408
4441
|
case 5:
|
|
4409
4442
|
// This is a one-time event. Just pause 10 seconds.
|
|
@@ -4411,8 +4444,8 @@ function MessagesFromServerConsumer(db) {
|
|
|
4411
4444
|
loopWarning = Date.now() + 10000;
|
|
4412
4445
|
return [4 /*yield*/, new Promise(function (resolve) { return setTimeout(resolve, 10000); })];
|
|
4413
4446
|
case 6:
|
|
4414
|
-
|
|
4415
|
-
|
|
4447
|
+
_k.sent();
|
|
4448
|
+
_k.label = 7;
|
|
4416
4449
|
case 7:
|
|
4417
4450
|
isWorking = false;
|
|
4418
4451
|
readyToServe.next(true);
|
|
@@ -4426,28 +4459,28 @@ function MessagesFromServerConsumer(db) {
|
|
|
4426
4459
|
event.next(null);
|
|
4427
4460
|
}
|
|
4428
4461
|
function consumeQueue() {
|
|
4429
|
-
var
|
|
4462
|
+
var _a, _b, _c;
|
|
4430
4463
|
return __awaiter$1(this, void 0, void 0, function () {
|
|
4431
4464
|
var _loop_7;
|
|
4432
4465
|
var _this_1 = this;
|
|
4433
|
-
return __generator$1(this, function (
|
|
4434
|
-
switch (
|
|
4466
|
+
return __generator$1(this, function (_k) {
|
|
4467
|
+
switch (_k.label) {
|
|
4435
4468
|
case 0:
|
|
4436
4469
|
_loop_7 = function () {
|
|
4437
|
-
var msg, persistedSyncState,
|
|
4438
|
-
return __generator$1(this, function (
|
|
4439
|
-
switch (
|
|
4470
|
+
var msg, persistedSyncState, _l, user, refreshedLogin, error_2;
|
|
4471
|
+
return __generator$1(this, function (_m) {
|
|
4472
|
+
switch (_m.label) {
|
|
4440
4473
|
case 0:
|
|
4441
4474
|
msg = queue.shift();
|
|
4442
|
-
|
|
4475
|
+
_m.label = 1;
|
|
4443
4476
|
case 1:
|
|
4444
|
-
|
|
4477
|
+
_m.trys.push([1, 13, , 14]);
|
|
4445
4478
|
// If the sync worker or service worker is syncing, wait 'til thei're done.
|
|
4446
4479
|
// It's no need to have two channels at the same time - even though it wouldnt
|
|
4447
4480
|
// be a problem - this is an optimization.
|
|
4448
4481
|
return [4 /*yield*/, db.cloud.syncState
|
|
4449
|
-
.pipe(filter(function (
|
|
4450
|
-
var phase =
|
|
4482
|
+
.pipe(filter(function (_k) {
|
|
4483
|
+
var phase = _k.phase;
|
|
4451
4484
|
return phase === 'in-sync' || phase === 'error';
|
|
4452
4485
|
}), take(1))
|
|
4453
4486
|
.toPromise()];
|
|
@@ -4455,14 +4488,14 @@ function MessagesFromServerConsumer(db) {
|
|
|
4455
4488
|
// If the sync worker or service worker is syncing, wait 'til thei're done.
|
|
4456
4489
|
// It's no need to have two channels at the same time - even though it wouldnt
|
|
4457
4490
|
// be a problem - this is an optimization.
|
|
4458
|
-
|
|
4491
|
+
_m.sent();
|
|
4459
4492
|
console.debug('processing msg', msg);
|
|
4460
4493
|
persistedSyncState = db.cloud.persistedSyncState.value;
|
|
4461
4494
|
//syncState.
|
|
4462
4495
|
if (!msg)
|
|
4463
4496
|
return [2 /*return*/, "continue"];
|
|
4464
|
-
|
|
4465
|
-
switch (
|
|
4497
|
+
_l = msg.type;
|
|
4498
|
+
switch (_l) {
|
|
4466
4499
|
case 'token-expired': return [3 /*break*/, 3];
|
|
4467
4500
|
case 'realm-added': return [3 /*break*/, 6];
|
|
4468
4501
|
case 'realm-accepted': return [3 /*break*/, 7];
|
|
@@ -4476,7 +4509,7 @@ function MessagesFromServerConsumer(db) {
|
|
|
4476
4509
|
user = db.cloud.currentUser.value;
|
|
4477
4510
|
return [4 /*yield*/, refreshAccessToken(db.cloud.options.databaseUrl, user)];
|
|
4478
4511
|
case 4:
|
|
4479
|
-
refreshedLogin =
|
|
4512
|
+
refreshedLogin = _m.sent();
|
|
4480
4513
|
// Persist updated access token
|
|
4481
4514
|
return [4 /*yield*/, db.table('$logins').update(user.userId, {
|
|
4482
4515
|
accessToken: refreshedLogin.accessToken,
|
|
@@ -4484,7 +4517,7 @@ function MessagesFromServerConsumer(db) {
|
|
|
4484
4517
|
})];
|
|
4485
4518
|
case 5:
|
|
4486
4519
|
// Persist updated access token
|
|
4487
|
-
|
|
4520
|
+
_m.sent();
|
|
4488
4521
|
// Updating $logins will trigger emission of db.cloud.currentUser observable, which
|
|
4489
4522
|
// in turn will lead to that connectWebSocket.ts will reconnect the socket with the
|
|
4490
4523
|
// new token. So we don't need to do anything more here.
|
|
@@ -4501,8 +4534,8 @@ function MessagesFromServerConsumer(db) {
|
|
|
4501
4534
|
return [3 /*break*/, 12];
|
|
4502
4535
|
case 8:
|
|
4503
4536
|
//if (
|
|
4504
|
-
((
|
|
4505
|
-
((
|
|
4537
|
+
((_a = persistedSyncState === null || persistedSyncState === void 0 ? void 0 : persistedSyncState.realms) === null || _a === void 0 ? void 0 : _a.includes(msg.realm)) ||
|
|
4538
|
+
((_b = persistedSyncState === null || persistedSyncState === void 0 ? void 0 : persistedSyncState.inviteRealms) === null || _b === void 0 ? void 0 : _b.includes(msg.realm));
|
|
4506
4539
|
//) {
|
|
4507
4540
|
triggerSync(db, 'pull');
|
|
4508
4541
|
//}
|
|
@@ -4512,14 +4545,14 @@ function MessagesFromServerConsumer(db) {
|
|
|
4512
4545
|
return [3 /*break*/, 12];
|
|
4513
4546
|
case 10:
|
|
4514
4547
|
console.debug('changes');
|
|
4515
|
-
if (((
|
|
4548
|
+
if (((_c = db.cloud.syncState.value) === null || _c === void 0 ? void 0 : _c.phase) === 'error') {
|
|
4516
4549
|
triggerSync(db, 'pull');
|
|
4517
4550
|
return [3 /*break*/, 12];
|
|
4518
4551
|
}
|
|
4519
4552
|
return [4 /*yield*/, db.transaction('rw', db.dx.tables, function (tx) { return __awaiter$1(_this_1, void 0, void 0, function () {
|
|
4520
|
-
var
|
|
4521
|
-
return __generator$1(this, function (
|
|
4522
|
-
switch (
|
|
4553
|
+
var _k, schema, syncState, currentUser, ourRealmSetHash, clientChanges, mutationTables, filteredChanges;
|
|
4554
|
+
return __generator$1(this, function (_l) {
|
|
4555
|
+
switch (_l.label) {
|
|
4523
4556
|
case 0:
|
|
4524
4557
|
// @ts-ignore
|
|
4525
4558
|
tx.idbtrans.disableChangeTracking = true;
|
|
@@ -4531,7 +4564,7 @@ function MessagesFromServerConsumer(db) {
|
|
|
4531
4564
|
db.getCurrentUser(),
|
|
4532
4565
|
])];
|
|
4533
4566
|
case 1:
|
|
4534
|
-
|
|
4567
|
+
_k = _l.sent(), schema = _k[0], syncState = _k[1], currentUser = _k[2];
|
|
4535
4568
|
console.debug('ws message queue: in transaction');
|
|
4536
4569
|
if (!syncState || !schema || !currentUser) {
|
|
4537
4570
|
console.debug('required vars not present', {
|
|
@@ -4566,7 +4599,7 @@ function MessagesFromServerConsumer(db) {
|
|
|
4566
4599
|
// Keep TX in non-IDB work
|
|
4567
4600
|
computeRealmSetHash(syncState))];
|
|
4568
4601
|
case 2:
|
|
4569
|
-
ourRealmSetHash =
|
|
4602
|
+
ourRealmSetHash = _l.sent();
|
|
4570
4603
|
console.debug('ourRealmSetHash', ourRealmSetHash);
|
|
4571
4604
|
if (ourRealmSetHash !== msg.realmSetHash) {
|
|
4572
4605
|
console.debug('not same realmSetHash', msg.realmSetHash);
|
|
@@ -4580,9 +4613,9 @@ function MessagesFromServerConsumer(db) {
|
|
|
4580
4613
|
mutationTables = getSyncableTables(db).map(function (tbl) { return db.table(getMutationTable(tbl.name)); });
|
|
4581
4614
|
return [4 /*yield*/, listClientChanges(mutationTables)];
|
|
4582
4615
|
case 3:
|
|
4583
|
-
clientChanges =
|
|
4616
|
+
clientChanges = _l.sent();
|
|
4584
4617
|
console.debug('msg queue: client changes', clientChanges);
|
|
4585
|
-
|
|
4618
|
+
_l.label = 4;
|
|
4586
4619
|
case 4:
|
|
4587
4620
|
if (!(msg.changes.length > 0)) return [3 /*break*/, 6];
|
|
4588
4621
|
filteredChanges = filterServerChangesThroughAddedClientChanges(msg.changes, clientChanges);
|
|
@@ -4592,8 +4625,8 @@ function MessagesFromServerConsumer(db) {
|
|
|
4592
4625
|
console.debug('applying filtered server changes', filteredChanges);
|
|
4593
4626
|
return [4 /*yield*/, applyServerChanges(filteredChanges, db)];
|
|
4594
4627
|
case 5:
|
|
4595
|
-
|
|
4596
|
-
|
|
4628
|
+
_l.sent();
|
|
4629
|
+
_l.label = 6;
|
|
4597
4630
|
case 6:
|
|
4598
4631
|
// Update latest revisions per table in case there are unsynced changes
|
|
4599
4632
|
// This can be a real case in future when we allow non-eagery sync.
|
|
@@ -4604,37 +4637,37 @@ function MessagesFromServerConsumer(db) {
|
|
|
4604
4637
|
console.debug('Updating baseRefs', syncState.latestRevisions);
|
|
4605
4638
|
return [4 /*yield*/, updateBaseRevs(db, schema, syncState.latestRevisions, msg.newRev)];
|
|
4606
4639
|
case 7:
|
|
4607
|
-
|
|
4640
|
+
_l.sent();
|
|
4608
4641
|
//
|
|
4609
4642
|
// Update syncState
|
|
4610
4643
|
//
|
|
4611
4644
|
console.debug('Updating syncState', syncState);
|
|
4612
4645
|
return [4 /*yield*/, db.$syncState.put(syncState, 'syncState')];
|
|
4613
4646
|
case 8:
|
|
4614
|
-
|
|
4647
|
+
_l.sent();
|
|
4615
4648
|
return [2 /*return*/];
|
|
4616
4649
|
}
|
|
4617
4650
|
});
|
|
4618
4651
|
}); })];
|
|
4619
4652
|
case 11:
|
|
4620
|
-
|
|
4653
|
+
_m.sent();
|
|
4621
4654
|
console.debug('msg queue: done with rw transaction');
|
|
4622
4655
|
return [3 /*break*/, 12];
|
|
4623
4656
|
case 12: return [3 /*break*/, 14];
|
|
4624
4657
|
case 13:
|
|
4625
|
-
error_2 =
|
|
4658
|
+
error_2 = _m.sent();
|
|
4626
4659
|
console.error("Error in msg queue", error_2);
|
|
4627
4660
|
return [3 /*break*/, 14];
|
|
4628
4661
|
case 14: return [2 /*return*/];
|
|
4629
4662
|
}
|
|
4630
4663
|
});
|
|
4631
4664
|
};
|
|
4632
|
-
|
|
4665
|
+
_k.label = 1;
|
|
4633
4666
|
case 1:
|
|
4634
4667
|
if (!(queue.length > 0)) return [3 /*break*/, 3];
|
|
4635
4668
|
return [5 /*yield**/, _loop_7()];
|
|
4636
4669
|
case 2:
|
|
4637
|
-
|
|
4670
|
+
_k.sent();
|
|
4638
4671
|
return [3 /*break*/, 1];
|
|
4639
4672
|
case 3: return [2 /*return*/];
|
|
4640
4673
|
}
|
|
@@ -4776,10 +4809,10 @@ function toStringTag(o) {
|
|
|
4776
4809
|
return toString.call(o).slice(8, -1);
|
|
4777
4810
|
}
|
|
4778
4811
|
function getEffectiveKeys(primaryKey, req) {
|
|
4779
|
-
var
|
|
4812
|
+
var _a;
|
|
4780
4813
|
if (req.type === 'delete')
|
|
4781
4814
|
return req.keys;
|
|
4782
|
-
return ((
|
|
4815
|
+
return ((_a = req.keys) === null || _a === void 0 ? void 0 : _a.slice()) || req.values.map(primaryKey.extractKey);
|
|
4783
4816
|
}
|
|
4784
4817
|
function applyToUpperBitFix(orig, bits) {
|
|
4785
4818
|
return ((bits & 1 ? orig[0].toUpperCase() : orig[0].toLowerCase()) +
|
|
@@ -4869,7 +4902,7 @@ function createIdGenerationMiddleware(db) {
|
|
|
4869
4902
|
name: 'idGenerationMiddleware',
|
|
4870
4903
|
level: 1,
|
|
4871
4904
|
create: function (core) {
|
|
4872
|
-
return
|
|
4905
|
+
return Object.assign(Object.assign({}, core), { table: function (tableName) {
|
|
4873
4906
|
var table = core.table(tableName);
|
|
4874
4907
|
function generateOrVerifyAtKeys(req, idPrefix) {
|
|
4875
4908
|
var valueClones = null;
|
|
@@ -4895,17 +4928,17 @@ function createIdGenerationMiddleware(db) {
|
|
|
4895
4928
|
"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.");
|
|
4896
4929
|
}
|
|
4897
4930
|
});
|
|
4898
|
-
return table.mutate(
|
|
4931
|
+
return table.mutate(Object.assign(Object.assign({}, req), { keys: keys, values: valueClones || req.values }));
|
|
4899
4932
|
}
|
|
4900
|
-
return
|
|
4901
|
-
var
|
|
4933
|
+
return Object.assign(Object.assign({}, table), { mutate: function (req) {
|
|
4934
|
+
var _a, _b;
|
|
4902
4935
|
// @ts-ignore
|
|
4903
4936
|
if (req.trans.disableChangeTracking) {
|
|
4904
4937
|
// Disable ID policy checks and ID generation
|
|
4905
4938
|
return table.mutate(req);
|
|
4906
4939
|
}
|
|
4907
4940
|
if (req.type === 'add' || req.type === 'put') {
|
|
4908
|
-
var cloudTableSchema = (
|
|
4941
|
+
var cloudTableSchema = (_a = db.cloud.schema) === null || _a === void 0 ? void 0 : _a[tableName];
|
|
4909
4942
|
if (!(cloudTableSchema === null || cloudTableSchema === void 0 ? void 0 : cloudTableSchema.generatedGlobalId)) {
|
|
4910
4943
|
if (cloudTableSchema === null || cloudTableSchema === void 0 ? void 0 : cloudTableSchema.markedForSync) {
|
|
4911
4944
|
// Just make sure primary key is of a supported type:
|
|
@@ -4921,7 +4954,7 @@ function createIdGenerationMiddleware(db) {
|
|
|
4921
4954
|
}
|
|
4922
4955
|
}
|
|
4923
4956
|
else {
|
|
4924
|
-
if (((
|
|
4957
|
+
if (((_b = db.cloud.options) === null || _b === void 0 ? void 0 : _b.databaseUrl) && !db.initiallySynced) {
|
|
4925
4958
|
// A database URL is configured but no initial sync has been performed.
|
|
4926
4959
|
var keys_1 = getEffectiveKeys(table.schema.primaryKey, req);
|
|
4927
4960
|
// Check if the operation would yield any INSERT. If so, complain! We never want wrong ID prefixes stored.
|
|
@@ -4953,31 +4986,31 @@ function createImplicitPropSetterMiddleware(db) {
|
|
|
4953
4986
|
name: 'implicitPropSetterMiddleware',
|
|
4954
4987
|
level: 1,
|
|
4955
4988
|
create: function (core) {
|
|
4956
|
-
return
|
|
4989
|
+
return Object.assign(Object.assign({}, core), { table: function (tableName) {
|
|
4957
4990
|
var table = core.table(tableName);
|
|
4958
|
-
return
|
|
4959
|
-
var
|
|
4991
|
+
return Object.assign(Object.assign({}, table), { mutate: function (req) {
|
|
4992
|
+
var _a, _b, _c, _d;
|
|
4960
4993
|
// @ts-ignore
|
|
4961
4994
|
if (req.trans.disableChangeTracking) {
|
|
4962
4995
|
return table.mutate(req);
|
|
4963
4996
|
}
|
|
4964
4997
|
var trans = req.trans;
|
|
4965
|
-
if ((
|
|
4998
|
+
if ((_b = (_a = db.cloud.schema) === null || _a === void 0 ? void 0 : _a[tableName]) === null || _b === void 0 ? void 0 : _b.markedForSync) {
|
|
4966
4999
|
if (req.type === 'add' || req.type === 'put') {
|
|
4967
5000
|
// No matter if user is logged in or not, make sure "owner" and "realmId" props are set properly.
|
|
4968
5001
|
// If not logged in, this will be changed upon syncification of the tables (next sync after login),
|
|
4969
5002
|
// however, application code will work better if we can always rely on that the properties realmId
|
|
4970
5003
|
// and owner are set. Application code may index them and query them based on db.cloud.currentUserId,
|
|
4971
5004
|
// and expect them to be returned. That scenario must work also when db.cloud.currentUserId === 'unauthorized'.
|
|
4972
|
-
for (var
|
|
4973
|
-
var obj = _k
|
|
5005
|
+
for (var _k = 0, _l = req.values; _k < _l.length; _k++) {
|
|
5006
|
+
var obj = _l[_k];
|
|
4974
5007
|
if (!obj.owner) {
|
|
4975
5008
|
obj.owner = trans.currentUser.userId;
|
|
4976
5009
|
}
|
|
4977
5010
|
if (!obj.realmId) {
|
|
4978
5011
|
obj.realmId = trans.currentUser.userId;
|
|
4979
5012
|
}
|
|
4980
|
-
var key = (
|
|
5013
|
+
var key = (_d = (_c = table.schema.primaryKey).extractKey) === null || _d === void 0 ? void 0 : _d.call(_c, obj);
|
|
4981
5014
|
if (typeof key === 'string' && key[0] === '#') {
|
|
4982
5015
|
// Add $ts prop for put operations and
|
|
4983
5016
|
// disable update operations as well as consistent
|
|
@@ -5022,11 +5055,11 @@ function allSettled(possiblePromises) {
|
|
|
5022
5055
|
var counter$1 = 0;
|
|
5023
5056
|
function guardedTable(table) {
|
|
5024
5057
|
var prop = "$lock" + (++counter$1);
|
|
5025
|
-
return
|
|
5058
|
+
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) });
|
|
5026
5059
|
}
|
|
5027
5060
|
function readLock(fn, prop) {
|
|
5028
5061
|
return function readLocker(req) {
|
|
5029
|
-
var
|
|
5062
|
+
var _k = req.trans[prop] || (req.trans[prop] = { writers: [], readers: [] }), readers = _k.readers, writers = _k.writers;
|
|
5030
5063
|
var numWriters = writers.length;
|
|
5031
5064
|
var promise = (numWriters > 0
|
|
5032
5065
|
? writers[numWriters - 1].then(function () { return fn(req); }, function () { return fn(req); })
|
|
@@ -5037,7 +5070,7 @@ function readLock(fn, prop) {
|
|
|
5037
5070
|
}
|
|
5038
5071
|
function writeLock(fn, prop) {
|
|
5039
5072
|
return function writeLocker(req) {
|
|
5040
|
-
var
|
|
5073
|
+
var _k = req.trans[prop] || (req.trans[prop] = { writers: [], readers: [] }), readers = _k.readers, writers = _k.writers;
|
|
5041
5074
|
var promise = (writers.length > 0
|
|
5042
5075
|
? writers[writers.length - 1].then(function () { return fn(req); }, function () { return fn(req); })
|
|
5043
5076
|
: readers.length > 0
|
|
@@ -5056,8 +5089,8 @@ var outstandingTransactions = new BehaviorSubject(new Set());
|
|
|
5056
5089
|
* changes to server and cleanup the tracked mutations once the server has
|
|
5057
5090
|
* ackowledged that it got them.
|
|
5058
5091
|
*/
|
|
5059
|
-
function createMutationTrackingMiddleware(
|
|
5060
|
-
var currentUserObservable =
|
|
5092
|
+
function createMutationTrackingMiddleware(_k) {
|
|
5093
|
+
var currentUserObservable = _k.currentUserObservable, db = _k.db;
|
|
5061
5094
|
return {
|
|
5062
5095
|
stack: 'dbcore',
|
|
5063
5096
|
name: 'MutationTrackingMiddleware',
|
|
@@ -5071,14 +5104,14 @@ function createMutationTrackingMiddleware(_e) {
|
|
|
5071
5104
|
core.table("$".concat(tbl.name, "_mutations"))
|
|
5072
5105
|
]; }));
|
|
5073
5106
|
}
|
|
5074
|
-
catch (
|
|
5107
|
+
catch (_a) {
|
|
5075
5108
|
throwVersionIncrementNeeded();
|
|
5076
5109
|
}
|
|
5077
|
-
return
|
|
5110
|
+
return Object.assign(Object.assign({}, core), { transaction: function (tables, mode) {
|
|
5078
5111
|
var tx;
|
|
5079
5112
|
if (mode === 'readwrite') {
|
|
5080
5113
|
var mutationTables = tables
|
|
5081
|
-
.filter(function (tbl) { var
|
|
5114
|
+
.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; })
|
|
5082
5115
|
.map(function (tbl) { return getMutationTable(tbl); });
|
|
5083
5116
|
tx = core.transaction(__spreadArray$1(__spreadArray$1([], tables, true), mutationTables, true), mode);
|
|
5084
5117
|
}
|
|
@@ -5101,8 +5134,8 @@ function createMutationTrackingMiddleware(_e) {
|
|
|
5101
5134
|
outstandingTransactions.next(outstandingTransactions.value);
|
|
5102
5135
|
};
|
|
5103
5136
|
var txComplete_1 = function () {
|
|
5104
|
-
var
|
|
5105
|
-
if (tx.mutationsAdded && ((
|
|
5137
|
+
var _a;
|
|
5138
|
+
if (tx.mutationsAdded && ((_a = db.cloud.options) === null || _a === void 0 ? void 0 : _a.databaseUrl)) {
|
|
5106
5139
|
if (db.cloud.usingServiceWorker) {
|
|
5107
5140
|
console.debug('registering sync event');
|
|
5108
5141
|
registerSyncEvent(db, "push");
|
|
@@ -5126,7 +5159,7 @@ function createMutationTrackingMiddleware(_e) {
|
|
|
5126
5159
|
// make sure to set the mutationsAdded flag on transaction.
|
|
5127
5160
|
// This is also done in mutateAndLog() as that function talks to a
|
|
5128
5161
|
// lower level DBCore and wouldn't be catched by this code.
|
|
5129
|
-
return
|
|
5162
|
+
return Object.assign(Object.assign({}, table), { mutate: function (req) {
|
|
5130
5163
|
if (req.type === 'add' || req.type === 'put') {
|
|
5131
5164
|
req.trans.mutationsAdded = true;
|
|
5132
5165
|
}
|
|
@@ -5134,7 +5167,7 @@ function createMutationTrackingMiddleware(_e) {
|
|
|
5134
5167
|
} });
|
|
5135
5168
|
}
|
|
5136
5169
|
else if (tableName === '$logins') {
|
|
5137
|
-
return
|
|
5170
|
+
return Object.assign(Object.assign({}, table), { mutate: function (req) {
|
|
5138
5171
|
//console.debug('Mutating $logins table', req);
|
|
5139
5172
|
return table
|
|
5140
5173
|
.mutate(req)
|
|
@@ -5156,16 +5189,16 @@ function createMutationTrackingMiddleware(_e) {
|
|
|
5156
5189
|
}
|
|
5157
5190
|
var schema = table.schema;
|
|
5158
5191
|
var mutsTable = mutTableMap.get(tableName);
|
|
5159
|
-
return guardedTable(
|
|
5160
|
-
var
|
|
5192
|
+
return guardedTable(Object.assign(Object.assign({}, table), { mutate: function (req) {
|
|
5193
|
+
var _a, _b, _c;
|
|
5161
5194
|
var trans = req.trans;
|
|
5162
5195
|
if (!trans.txid)
|
|
5163
5196
|
return table.mutate(req); // Upgrade transactions not guarded by us.
|
|
5164
5197
|
if (trans.disableChangeTracking)
|
|
5165
5198
|
return table.mutate(req);
|
|
5166
|
-
if (!((
|
|
5199
|
+
if (!((_b = (_a = db.cloud.schema) === null || _a === void 0 ? void 0 : _a[tableName]) === null || _b === void 0 ? void 0 : _b.markedForSync))
|
|
5167
5200
|
return table.mutate(req);
|
|
5168
|
-
if (!((
|
|
5201
|
+
if (!((_c = trans.currentUser) === null || _c === void 0 ? void 0 : _c.isLoggedIn)) {
|
|
5169
5202
|
// Unauthorized user should not log mutations.
|
|
5170
5203
|
// Instead, after login all local data should be logged at once.
|
|
5171
5204
|
return table.mutate(req);
|
|
@@ -5265,7 +5298,7 @@ function createMutationTrackingMiddleware(_e) {
|
|
|
5265
5298
|
}
|
|
5266
5299
|
function overrideParseStoresSpec(origFunc, dexie) {
|
|
5267
5300
|
return function (stores, dbSchema) {
|
|
5268
|
-
var storesClone =
|
|
5301
|
+
var storesClone = Object.assign(Object.assign({}, DEXIE_CLOUD_SCHEMA), stores);
|
|
5269
5302
|
var cloudSchema = dexie.cloud.schema || (dexie.cloud.schema = {});
|
|
5270
5303
|
var allPrefixes = new Set();
|
|
5271
5304
|
Object.keys(storesClone).forEach(function (tableName) {
|
|
@@ -5296,160 +5329,16 @@ function overrideParseStoresSpec(origFunc, dexie) {
|
|
|
5296
5329
|
return rv;
|
|
5297
5330
|
};
|
|
5298
5331
|
}
|
|
5299
|
-
var SECONDS = 1000;
|
|
5300
|
-
var MINUTES = 60 * SECONDS;
|
|
5301
|
-
var myId = randomString(16);
|
|
5302
|
-
var GUARDED_JOB_HEARTBEAT = 1 * SECONDS;
|
|
5303
|
-
var GUARDED_JOB_TIMEOUT = 1 * MINUTES;
|
|
5304
|
-
function performGuardedJob(db, jobName, jobsTableName, job, _e) {
|
|
5305
|
-
var _f = _e === void 0 ? {} : _e, awaitRemoteJob = _f.awaitRemoteJob;
|
|
5306
|
-
return __awaiter$1(this, void 0, void 0, function () {
|
|
5307
|
-
function aquireLock() {
|
|
5308
|
-
return __awaiter$1(this, void 0, void 0, function () {
|
|
5309
|
-
var gotTheLock, jobDoneObservable, err_1;
|
|
5310
|
-
var _this_1 = this;
|
|
5311
|
-
return __generator$1(this, function (_e) {
|
|
5312
|
-
switch (_e.label) {
|
|
5313
|
-
case 0: return [4 /*yield*/, db.transaction('rw!', jobsTableName, function () { return __awaiter$1(_this_1, void 0, void 0, function () {
|
|
5314
|
-
var currentWork;
|
|
5315
|
-
return __generator$1(this, function (_e) {
|
|
5316
|
-
switch (_e.label) {
|
|
5317
|
-
case 0: return [4 /*yield*/, jobsTable.get(jobName)];
|
|
5318
|
-
case 1:
|
|
5319
|
-
currentWork = _e.sent();
|
|
5320
|
-
if (!!currentWork) return [3 /*break*/, 3];
|
|
5321
|
-
// No one else is working. Let's record that we are.
|
|
5322
|
-
return [4 /*yield*/, jobsTable.add({
|
|
5323
|
-
nodeId: myId,
|
|
5324
|
-
started: new Date(),
|
|
5325
|
-
heartbeat: new Date()
|
|
5326
|
-
}, jobName)];
|
|
5327
|
-
case 2:
|
|
5328
|
-
// No one else is working. Let's record that we are.
|
|
5329
|
-
_e.sent();
|
|
5330
|
-
return [2 /*return*/, true];
|
|
5331
|
-
case 3:
|
|
5332
|
-
if (!(currentWork.heartbeat.getTime() <
|
|
5333
|
-
Date.now() - GUARDED_JOB_TIMEOUT)) return [3 /*break*/, 5];
|
|
5334
|
-
console.warn("Latest ".concat(jobName, " worker seem to have died.\n"), "The dead job started:", currentWork.started, "\n", "Last heart beat was:", currentWork.heartbeat, '\n', "We're now taking over!");
|
|
5335
|
-
// Now, take over!
|
|
5336
|
-
return [4 /*yield*/, jobsTable.put({
|
|
5337
|
-
nodeId: myId,
|
|
5338
|
-
started: new Date(),
|
|
5339
|
-
heartbeat: new Date()
|
|
5340
|
-
}, jobName)];
|
|
5341
|
-
case 4:
|
|
5342
|
-
// Now, take over!
|
|
5343
|
-
_e.sent();
|
|
5344
|
-
return [2 /*return*/, true];
|
|
5345
|
-
case 5: return [2 /*return*/, false];
|
|
5346
|
-
}
|
|
5347
|
-
});
|
|
5348
|
-
}); })];
|
|
5349
|
-
case 1:
|
|
5350
|
-
gotTheLock = _e.sent();
|
|
5351
|
-
if (gotTheLock)
|
|
5352
|
-
return [2 /*return*/, true];
|
|
5353
|
-
if (!awaitRemoteJob) return [3 /*break*/, 6];
|
|
5354
|
-
_e.label = 2;
|
|
5355
|
-
case 2:
|
|
5356
|
-
_e.trys.push([2, 4, , 6]);
|
|
5357
|
-
jobDoneObservable = from$1(liveQuery(function () { return jobsTable.get(jobName); })).pipe(timeout(GUARDED_JOB_TIMEOUT), filter(function (job) { return !job; }));
|
|
5358
|
-
return [4 /*yield*/, jobDoneObservable.toPromise()];
|
|
5359
|
-
case 3:
|
|
5360
|
-
_e.sent();
|
|
5361
|
-
return [2 /*return*/, false];
|
|
5362
|
-
case 4:
|
|
5363
|
-
err_1 = _e.sent();
|
|
5364
|
-
if (err_1.name !== 'TimeoutError') {
|
|
5365
|
-
throw err_1;
|
|
5366
|
-
}
|
|
5367
|
-
return [4 /*yield*/, aquireLock()];
|
|
5368
|
-
case 5:
|
|
5369
|
-
// Timeout stopped us! Try aquire the lock now.
|
|
5370
|
-
// It will likely succeed this time unless
|
|
5371
|
-
// another client took it.
|
|
5372
|
-
return [2 /*return*/, _e.sent()];
|
|
5373
|
-
case 6: return [2 /*return*/, false];
|
|
5374
|
-
}
|
|
5375
|
-
});
|
|
5376
|
-
});
|
|
5377
|
-
}
|
|
5378
|
-
var jobsTable, heartbeat;
|
|
5379
|
-
var _this_1 = this;
|
|
5380
|
-
return __generator$1(this, function (_g) {
|
|
5381
|
-
switch (_g.label) {
|
|
5382
|
-
case 0:
|
|
5383
|
-
jobsTable = db.table(jobsTableName);
|
|
5384
|
-
return [4 /*yield*/, aquireLock()];
|
|
5385
|
-
case 1:
|
|
5386
|
-
if (!_g.sent()) return [3 /*break*/, 6];
|
|
5387
|
-
heartbeat = setInterval(function () {
|
|
5388
|
-
jobsTable.update(jobName, function (job) {
|
|
5389
|
-
if (job.nodeId === myId) {
|
|
5390
|
-
job.heartbeat = new Date();
|
|
5391
|
-
}
|
|
5392
|
-
});
|
|
5393
|
-
}, GUARDED_JOB_HEARTBEAT);
|
|
5394
|
-
_g.label = 2;
|
|
5395
|
-
case 2:
|
|
5396
|
-
_g.trys.push([2, , 4, 6]);
|
|
5397
|
-
return [4 /*yield*/, job()];
|
|
5398
|
-
case 3: return [2 /*return*/, _g.sent()];
|
|
5399
|
-
case 4:
|
|
5400
|
-
// Stop heartbeat
|
|
5401
|
-
clearInterval(heartbeat);
|
|
5402
|
-
// Remove the persisted job state:
|
|
5403
|
-
return [4 /*yield*/, db.transaction('rw!', jobsTableName, function () { return __awaiter$1(_this_1, void 0, void 0, function () {
|
|
5404
|
-
var currentWork;
|
|
5405
|
-
return __generator$1(this, function (_e) {
|
|
5406
|
-
switch (_e.label) {
|
|
5407
|
-
case 0: return [4 /*yield*/, jobsTable.get(jobName)];
|
|
5408
|
-
case 1:
|
|
5409
|
-
currentWork = _e.sent();
|
|
5410
|
-
if (currentWork && currentWork.nodeId === myId) {
|
|
5411
|
-
jobsTable.delete(jobName);
|
|
5412
|
-
}
|
|
5413
|
-
return [2 /*return*/];
|
|
5414
|
-
}
|
|
5415
|
-
});
|
|
5416
|
-
}); })];
|
|
5417
|
-
case 5:
|
|
5418
|
-
// Remove the persisted job state:
|
|
5419
|
-
_g.sent();
|
|
5420
|
-
return [7 /*endfinally*/];
|
|
5421
|
-
case 6: return [2 /*return*/];
|
|
5422
|
-
}
|
|
5423
|
-
});
|
|
5424
|
-
});
|
|
5425
|
-
}
|
|
5426
5332
|
function performInitialSync(db, cloudOptions, cloudSchema) {
|
|
5427
5333
|
return __awaiter$1(this, void 0, void 0, function () {
|
|
5428
|
-
|
|
5429
|
-
|
|
5430
|
-
switch (_e.label) {
|
|
5334
|
+
return __generator$1(this, function (_k) {
|
|
5335
|
+
switch (_k.label) {
|
|
5431
5336
|
case 0:
|
|
5432
|
-
console.debug(
|
|
5433
|
-
return [4 /*yield*/,
|
|
5434
|
-
var syncState;
|
|
5435
|
-
return __generator$1(this, function (_e) {
|
|
5436
|
-
switch (_e.label) {
|
|
5437
|
-
case 0: return [4 /*yield*/, db.getPersistedSyncState()];
|
|
5438
|
-
case 1:
|
|
5439
|
-
syncState = _e.sent();
|
|
5440
|
-
if (!!(syncState === null || syncState === void 0 ? void 0 : syncState.initiallySynced)) return [3 /*break*/, 3];
|
|
5441
|
-
return [4 /*yield*/, sync(db, cloudOptions, cloudSchema, { isInitialSync: true })];
|
|
5442
|
-
case 2:
|
|
5443
|
-
_e.sent();
|
|
5444
|
-
_e.label = 3;
|
|
5445
|
-
case 3: return [2 /*return*/];
|
|
5446
|
-
}
|
|
5447
|
-
});
|
|
5448
|
-
}); }, { awaitRemoteJob: true } // Don't return until the job is done!
|
|
5449
|
-
)];
|
|
5337
|
+
console.debug('Performing initial sync');
|
|
5338
|
+
return [4 /*yield*/, sync(db, cloudOptions, cloudSchema, { isInitialSync: true })];
|
|
5450
5339
|
case 1:
|
|
5451
|
-
|
|
5452
|
-
console.debug(
|
|
5340
|
+
_k.sent();
|
|
5341
|
+
console.debug('Done initial sync');
|
|
5453
5342
|
return [2 /*return*/];
|
|
5454
5343
|
}
|
|
5455
5344
|
});
|
|
@@ -5574,7 +5463,7 @@ var WSConnection = /** @class */ (function (_super_1) {
|
|
|
5574
5463
|
try {
|
|
5575
5464
|
this.ws.close();
|
|
5576
5465
|
}
|
|
5577
|
-
catch (
|
|
5466
|
+
catch (_a) { }
|
|
5578
5467
|
}
|
|
5579
5468
|
this.ws = null;
|
|
5580
5469
|
if (this.messageProducerSubscription) {
|
|
@@ -5590,7 +5479,7 @@ var WSConnection = /** @class */ (function (_super_1) {
|
|
|
5590
5479
|
try {
|
|
5591
5480
|
this.disconnect();
|
|
5592
5481
|
}
|
|
5593
|
-
catch (
|
|
5482
|
+
catch (_a) { }
|
|
5594
5483
|
this.connect()
|
|
5595
5484
|
.catch(function () { })
|
|
5596
5485
|
.then(function () { return (_this_1.reconnecting = false); }); // finally()
|
|
@@ -5599,8 +5488,8 @@ var WSConnection = /** @class */ (function (_super_1) {
|
|
|
5599
5488
|
return __awaiter$1(this, void 0, void 0, function () {
|
|
5600
5489
|
var wsUrl, searchParams, ws, everConnected_1;
|
|
5601
5490
|
var _this_1 = this;
|
|
5602
|
-
return __generator$1(this, function (
|
|
5603
|
-
switch (
|
|
5491
|
+
return __generator$1(this, function (_k) {
|
|
5492
|
+
switch (_k.label) {
|
|
5604
5493
|
case 0:
|
|
5605
5494
|
this.lastServerActivity = new Date();
|
|
5606
5495
|
if (this.pauseUntil && this.pauseUntil > new Date()) {
|
|
@@ -5626,7 +5515,7 @@ var WSConnection = /** @class */ (function (_super_1) {
|
|
|
5626
5515
|
this.webSocketStatus.next('connecting');
|
|
5627
5516
|
this.pinger = setInterval(function () { return __awaiter$1(_this_1, void 0, void 0, function () {
|
|
5628
5517
|
var _this_1 = this;
|
|
5629
|
-
return __generator$1(this, function (
|
|
5518
|
+
return __generator$1(this, function (_k) {
|
|
5630
5519
|
if (this.closed) {
|
|
5631
5520
|
console.debug('pinger check', this.id, 'CLOSED.');
|
|
5632
5521
|
this.teardown();
|
|
@@ -5656,7 +5545,7 @@ var WSConnection = /** @class */ (function (_super_1) {
|
|
|
5656
5545
|
}
|
|
5657
5546
|
}, SERVER_PING_TIMEOUT);
|
|
5658
5547
|
}
|
|
5659
|
-
catch (
|
|
5548
|
+
catch (_a) {
|
|
5660
5549
|
console.debug('pinger catch error', this.id, 'reconnecting');
|
|
5661
5550
|
this.reconnect();
|
|
5662
5551
|
}
|
|
@@ -5711,9 +5600,9 @@ var WSConnection = /** @class */ (function (_super_1) {
|
|
|
5711
5600
|
_this_1.subscriber.error(e);
|
|
5712
5601
|
}
|
|
5713
5602
|
};
|
|
5714
|
-
|
|
5603
|
+
_k.label = 1;
|
|
5715
5604
|
case 1:
|
|
5716
|
-
|
|
5605
|
+
_k.trys.push([1, 3, , 4]);
|
|
5717
5606
|
everConnected_1 = false;
|
|
5718
5607
|
return [4 /*yield*/, new Promise(function (resolve, reject) {
|
|
5719
5608
|
ws.onopen = function (event) {
|
|
@@ -5734,20 +5623,20 @@ var WSConnection = /** @class */ (function (_super_1) {
|
|
|
5734
5623
|
};
|
|
5735
5624
|
})];
|
|
5736
5625
|
case 2:
|
|
5737
|
-
|
|
5626
|
+
_k.sent();
|
|
5738
5627
|
this.messageProducerSubscription = this.messageProducer.subscribe(function (msg) {
|
|
5739
|
-
var
|
|
5628
|
+
var _a;
|
|
5740
5629
|
if (!_this_1.closed) {
|
|
5741
5630
|
if (msg.type === 'ready' &&
|
|
5742
5631
|
_this_1.webSocketStatus.value !== 'connected') {
|
|
5743
5632
|
_this_1.webSocketStatus.next('connected');
|
|
5744
5633
|
}
|
|
5745
|
-
(
|
|
5634
|
+
(_a = _this_1.ws) === null || _a === void 0 ? void 0 : _a.send(TSON.stringify(msg));
|
|
5746
5635
|
}
|
|
5747
5636
|
});
|
|
5748
5637
|
return [3 /*break*/, 4];
|
|
5749
5638
|
case 3:
|
|
5750
|
-
|
|
5639
|
+
_k.sent();
|
|
5751
5640
|
this.pauseUntil = new Date(Date.now() + FAIL_RETRY_WAIT_TIME);
|
|
5752
5641
|
return [3 /*break*/, 4];
|
|
5753
5642
|
case 4: return [2 /*return*/];
|
|
@@ -5762,20 +5651,20 @@ function sleep(ms) {
|
|
|
5762
5651
|
}
|
|
5763
5652
|
function waitAndReconnectWhenUserDoesSomething(error) {
|
|
5764
5653
|
return __awaiter$1(this, void 0, void 0, function () {
|
|
5765
|
-
return __generator$1(this, function (
|
|
5766
|
-
switch (
|
|
5654
|
+
return __generator$1(this, function (_k) {
|
|
5655
|
+
switch (_k.label) {
|
|
5767
5656
|
case 0:
|
|
5768
5657
|
console.error("WebSocket observable: error but revive when user does some active thing...", error);
|
|
5769
5658
|
// Sleep some seconds...
|
|
5770
5659
|
return [4 /*yield*/, sleep(3000)];
|
|
5771
5660
|
case 1:
|
|
5772
5661
|
// Sleep some seconds...
|
|
5773
|
-
|
|
5662
|
+
_k.sent();
|
|
5774
5663
|
// Wait til user does something (move mouse, tap, scroll, click etc)
|
|
5775
5664
|
console.debug('waiting for someone to do something');
|
|
5776
5665
|
return [4 /*yield*/, userDoesSomething.pipe(take(1)).toPromise()];
|
|
5777
5666
|
case 2:
|
|
5778
|
-
|
|
5667
|
+
_k.sent();
|
|
5779
5668
|
console.debug('someone did something!');
|
|
5780
5669
|
return [2 /*return*/];
|
|
5781
5670
|
}
|
|
@@ -5783,8 +5672,8 @@ function waitAndReconnectWhenUserDoesSomething(error) {
|
|
|
5783
5672
|
});
|
|
5784
5673
|
}
|
|
5785
5674
|
function connectWebSocket(db) {
|
|
5786
|
-
var
|
|
5787
|
-
if (!((
|
|
5675
|
+
var _a;
|
|
5676
|
+
if (!((_a = db.cloud.options) === null || _a === void 0 ? void 0 : _a.databaseUrl)) {
|
|
5788
5677
|
throw new Error("No database URL to connect WebSocket to");
|
|
5789
5678
|
}
|
|
5790
5679
|
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
|
|
@@ -5799,21 +5688,21 @@ function connectWebSocket(db) {
|
|
|
5799
5688
|
var _this_1 = this;
|
|
5800
5689
|
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.
|
|
5801
5690
|
take(1), // Don't continue waking up whenever syncState change
|
|
5802
|
-
switchMap(function (syncState) { return db.cloud.currentUser.pipe(map(function (userLogin) { return [userLogin, syncState]; })); }), switchMap(function (
|
|
5803
|
-
var userLogin =
|
|
5691
|
+
switchMap(function (syncState) { return db.cloud.currentUser.pipe(map(function (userLogin) { return [userLogin, syncState]; })); }), switchMap(function (_k) {
|
|
5692
|
+
var userLogin = _k[0], syncState = _k[1];
|
|
5804
5693
|
return userIsReallyActive.pipe(map(function (isActive) { return [isActive ? userLogin : null, syncState]; }));
|
|
5805
|
-
}), switchMap(function (
|
|
5806
|
-
var userLogin =
|
|
5807
|
-
return __awaiter$1(_this_1, void 0, void 0, function () { var
|
|
5808
|
-
switch (
|
|
5694
|
+
}), switchMap(function (_k) {
|
|
5695
|
+
var userLogin = _k[0], syncState = _k[1];
|
|
5696
|
+
return __awaiter$1(_this_1, void 0, void 0, function () { var _k; return __generator$1(this, function (_l) {
|
|
5697
|
+
switch (_l.label) {
|
|
5809
5698
|
case 0:
|
|
5810
|
-
|
|
5699
|
+
_k = [userLogin];
|
|
5811
5700
|
return [4 /*yield*/, computeRealmSetHash(syncState)];
|
|
5812
|
-
case 1: return [2 /*return*/,
|
|
5701
|
+
case 1: return [2 /*return*/, _k.concat([_l.sent()])];
|
|
5813
5702
|
}
|
|
5814
5703
|
}); });
|
|
5815
|
-
}), switchMap(function (
|
|
5816
|
-
var userLogin =
|
|
5704
|
+
}), switchMap(function (_k) {
|
|
5705
|
+
var userLogin = _k[0], realmSetHash = _k[1];
|
|
5817
5706
|
// Let server end query changes from last entry of same client-ID and forward.
|
|
5818
5707
|
// If no new entries, server won't bother the client. If new entries, server sends only those
|
|
5819
5708
|
// and the baseRev of the last from same client-ID.
|
|
@@ -5825,14 +5714,14 @@ function connectWebSocket(db) {
|
|
|
5825
5714
|
console.debug('WebSocket observable: Token expired. Refreshing token...');
|
|
5826
5715
|
return of(true).pipe(switchMap(function () { return __awaiter$1(_this_1, void 0, void 0, function () {
|
|
5827
5716
|
var user, refreshedLogin;
|
|
5828
|
-
return __generator$1(this, function (
|
|
5829
|
-
switch (
|
|
5717
|
+
return __generator$1(this, function (_k) {
|
|
5718
|
+
switch (_k.label) {
|
|
5830
5719
|
case 0: return [4 /*yield*/, db.getCurrentUser()];
|
|
5831
5720
|
case 1:
|
|
5832
|
-
user =
|
|
5721
|
+
user = _k.sent();
|
|
5833
5722
|
return [4 /*yield*/, refreshAccessToken(db.cloud.options.databaseUrl, user)];
|
|
5834
5723
|
case 2:
|
|
5835
|
-
refreshedLogin =
|
|
5724
|
+
refreshedLogin = _k.sent();
|
|
5836
5725
|
// Persist updated access token
|
|
5837
5726
|
return [4 /*yield*/, db.table('$logins').update(user.userId, {
|
|
5838
5727
|
accessToken: refreshedLogin.accessToken,
|
|
@@ -5840,7 +5729,7 @@ function connectWebSocket(db) {
|
|
|
5840
5729
|
})];
|
|
5841
5730
|
case 3:
|
|
5842
5731
|
// Persist updated access token
|
|
5843
|
-
|
|
5732
|
+
_k.sent();
|
|
5844
5733
|
return [2 /*return*/];
|
|
5845
5734
|
}
|
|
5846
5735
|
});
|
|
@@ -5866,21 +5755,150 @@ function connectWebSocket(db) {
|
|
|
5866
5755
|
});
|
|
5867
5756
|
}
|
|
5868
5757
|
function isSyncNeeded(db) {
|
|
5869
|
-
var
|
|
5758
|
+
var _a;
|
|
5870
5759
|
return __awaiter$1(this, void 0, void 0, function () {
|
|
5871
|
-
var
|
|
5872
|
-
return __generator$1(this, function (
|
|
5873
|
-
switch (
|
|
5760
|
+
var _k;
|
|
5761
|
+
return __generator$1(this, function (_l) {
|
|
5762
|
+
switch (_l.label) {
|
|
5874
5763
|
case 0:
|
|
5875
|
-
if (!(((
|
|
5764
|
+
if (!(((_a = db.cloud.options) === null || _a === void 0 ? void 0 : _a.databaseUrl) && db.cloud.schema)) return [3 /*break*/, 2];
|
|
5876
5765
|
return [4 /*yield*/, sync(db, db.cloud.options, db.cloud.schema, { justCheckIfNeeded: true })];
|
|
5877
5766
|
case 1:
|
|
5878
|
-
|
|
5767
|
+
_k = _l.sent();
|
|
5879
5768
|
return [3 /*break*/, 3];
|
|
5880
5769
|
case 2:
|
|
5881
|
-
|
|
5882
|
-
|
|
5883
|
-
case 3: return [2 /*return*/,
|
|
5770
|
+
_k = false;
|
|
5771
|
+
_l.label = 3;
|
|
5772
|
+
case 3: return [2 /*return*/, _k];
|
|
5773
|
+
}
|
|
5774
|
+
});
|
|
5775
|
+
});
|
|
5776
|
+
}
|
|
5777
|
+
var SECONDS = 1000;
|
|
5778
|
+
var MINUTES = 60 * SECONDS;
|
|
5779
|
+
var myId = randomString(16);
|
|
5780
|
+
var GUARDED_JOB_HEARTBEAT = 1 * SECONDS;
|
|
5781
|
+
var GUARDED_JOB_TIMEOUT = 1 * MINUTES;
|
|
5782
|
+
function performGuardedJob(db, jobName, jobsTableName, job, _k) {
|
|
5783
|
+
var _l = _k === void 0 ? {} : _k, awaitRemoteJob = _l.awaitRemoteJob;
|
|
5784
|
+
return __awaiter$1(this, void 0, void 0, function () {
|
|
5785
|
+
function aquireLock() {
|
|
5786
|
+
return __awaiter$1(this, void 0, void 0, function () {
|
|
5787
|
+
var gotTheLock, jobDoneObservable, err_1;
|
|
5788
|
+
var _this_1 = this;
|
|
5789
|
+
return __generator$1(this, function (_k) {
|
|
5790
|
+
switch (_k.label) {
|
|
5791
|
+
case 0: return [4 /*yield*/, db.transaction('rw!', jobsTableName, function () { return __awaiter$1(_this_1, void 0, void 0, function () {
|
|
5792
|
+
var currentWork;
|
|
5793
|
+
return __generator$1(this, function (_k) {
|
|
5794
|
+
switch (_k.label) {
|
|
5795
|
+
case 0: return [4 /*yield*/, jobsTable.get(jobName)];
|
|
5796
|
+
case 1:
|
|
5797
|
+
currentWork = _k.sent();
|
|
5798
|
+
if (!!currentWork) return [3 /*break*/, 3];
|
|
5799
|
+
// No one else is working. Let's record that we are.
|
|
5800
|
+
return [4 /*yield*/, jobsTable.add({
|
|
5801
|
+
nodeId: myId,
|
|
5802
|
+
started: new Date(),
|
|
5803
|
+
heartbeat: new Date()
|
|
5804
|
+
}, jobName)];
|
|
5805
|
+
case 2:
|
|
5806
|
+
// No one else is working. Let's record that we are.
|
|
5807
|
+
_k.sent();
|
|
5808
|
+
return [2 /*return*/, true];
|
|
5809
|
+
case 3:
|
|
5810
|
+
if (!(currentWork.heartbeat.getTime() <
|
|
5811
|
+
Date.now() - GUARDED_JOB_TIMEOUT)) return [3 /*break*/, 5];
|
|
5812
|
+
console.warn("Latest ".concat(jobName, " worker seem to have died.\n"), "The dead job started:", currentWork.started, "\n", "Last heart beat was:", currentWork.heartbeat, '\n', "We're now taking over!");
|
|
5813
|
+
// Now, take over!
|
|
5814
|
+
return [4 /*yield*/, jobsTable.put({
|
|
5815
|
+
nodeId: myId,
|
|
5816
|
+
started: new Date(),
|
|
5817
|
+
heartbeat: new Date()
|
|
5818
|
+
}, jobName)];
|
|
5819
|
+
case 4:
|
|
5820
|
+
// Now, take over!
|
|
5821
|
+
_k.sent();
|
|
5822
|
+
return [2 /*return*/, true];
|
|
5823
|
+
case 5: return [2 /*return*/, false];
|
|
5824
|
+
}
|
|
5825
|
+
});
|
|
5826
|
+
}); })];
|
|
5827
|
+
case 1:
|
|
5828
|
+
gotTheLock = _k.sent();
|
|
5829
|
+
if (gotTheLock)
|
|
5830
|
+
return [2 /*return*/, true];
|
|
5831
|
+
if (!awaitRemoteJob) return [3 /*break*/, 6];
|
|
5832
|
+
_k.label = 2;
|
|
5833
|
+
case 2:
|
|
5834
|
+
_k.trys.push([2, 4, , 6]);
|
|
5835
|
+
jobDoneObservable = from$1(liveQuery(function () { return jobsTable.get(jobName); })).pipe(timeout(GUARDED_JOB_TIMEOUT), filter(function (job) { return !job; }));
|
|
5836
|
+
return [4 /*yield*/, jobDoneObservable.toPromise()];
|
|
5837
|
+
case 3:
|
|
5838
|
+
_k.sent();
|
|
5839
|
+
return [2 /*return*/, false];
|
|
5840
|
+
case 4:
|
|
5841
|
+
err_1 = _k.sent();
|
|
5842
|
+
if (err_1.name !== 'TimeoutError') {
|
|
5843
|
+
throw err_1;
|
|
5844
|
+
}
|
|
5845
|
+
return [4 /*yield*/, aquireLock()];
|
|
5846
|
+
case 5:
|
|
5847
|
+
// Timeout stopped us! Try aquire the lock now.
|
|
5848
|
+
// It will likely succeed this time unless
|
|
5849
|
+
// another client took it.
|
|
5850
|
+
return [2 /*return*/, _k.sent()];
|
|
5851
|
+
case 6: return [2 /*return*/, false];
|
|
5852
|
+
}
|
|
5853
|
+
});
|
|
5854
|
+
});
|
|
5855
|
+
}
|
|
5856
|
+
var jobsTable, heartbeat;
|
|
5857
|
+
var _this_1 = this;
|
|
5858
|
+
return __generator$1(this, function (_k) {
|
|
5859
|
+
switch (_k.label) {
|
|
5860
|
+
case 0:
|
|
5861
|
+
jobsTable = db.table(jobsTableName);
|
|
5862
|
+
return [4 /*yield*/, aquireLock()];
|
|
5863
|
+
case 1:
|
|
5864
|
+
if (!_k.sent()) return [3 /*break*/, 6];
|
|
5865
|
+
heartbeat = setInterval(function () {
|
|
5866
|
+
jobsTable.update(jobName, function (job) {
|
|
5867
|
+
if (job.nodeId === myId) {
|
|
5868
|
+
job.heartbeat = new Date();
|
|
5869
|
+
}
|
|
5870
|
+
});
|
|
5871
|
+
}, GUARDED_JOB_HEARTBEAT);
|
|
5872
|
+
_k.label = 2;
|
|
5873
|
+
case 2:
|
|
5874
|
+
_k.trys.push([2, , 4, 6]);
|
|
5875
|
+
return [4 /*yield*/, job()];
|
|
5876
|
+
case 3: return [2 /*return*/, _k.sent()];
|
|
5877
|
+
case 4:
|
|
5878
|
+
// Stop heartbeat
|
|
5879
|
+
clearInterval(heartbeat);
|
|
5880
|
+
// Remove the persisted job state:
|
|
5881
|
+
return [4 /*yield*/, db.transaction('rw!', jobsTableName, function () { return __awaiter$1(_this_1, void 0, void 0, function () {
|
|
5882
|
+
var currentWork;
|
|
5883
|
+
return __generator$1(this, function (_k) {
|
|
5884
|
+
switch (_k.label) {
|
|
5885
|
+
case 0: return [4 /*yield*/, jobsTable.get(jobName)];
|
|
5886
|
+
case 1:
|
|
5887
|
+
currentWork = _k.sent();
|
|
5888
|
+
if (!(currentWork && currentWork.nodeId === myId)) return [3 /*break*/, 3];
|
|
5889
|
+
return [4 /*yield*/, jobsTable.delete(jobName)];
|
|
5890
|
+
case 2:
|
|
5891
|
+
_k.sent();
|
|
5892
|
+
_k.label = 3;
|
|
5893
|
+
case 3: return [2 /*return*/];
|
|
5894
|
+
}
|
|
5895
|
+
});
|
|
5896
|
+
}); })];
|
|
5897
|
+
case 5:
|
|
5898
|
+
// Remove the persisted job state:
|
|
5899
|
+
_k.sent();
|
|
5900
|
+
return [7 /*endfinally*/];
|
|
5901
|
+
case 6: return [2 /*return*/];
|
|
5884
5902
|
}
|
|
5885
5903
|
});
|
|
5886
5904
|
});
|
|
@@ -5936,32 +5954,36 @@ function syncIfPossible(db, cloudOptions, cloudSchema, options) {
|
|
|
5936
5954
|
function _syncIfPossible() {
|
|
5937
5955
|
return __awaiter$1(this, void 0, void 0, function () {
|
|
5938
5956
|
var error_4;
|
|
5939
|
-
return __generator$1(this, function (
|
|
5940
|
-
switch (
|
|
5957
|
+
return __generator$1(this, function (_k) {
|
|
5958
|
+
switch (_k.label) {
|
|
5941
5959
|
case 0:
|
|
5942
|
-
|
|
5943
|
-
if (!db.cloud.
|
|
5944
|
-
|
|
5960
|
+
_k.trys.push([0, 6, , 7]);
|
|
5961
|
+
if (!db.cloud.isServiceWorkerDB) return [3 /*break*/, 2];
|
|
5962
|
+
// We are the dedicated sync SW:
|
|
5945
5963
|
return [4 /*yield*/, sync(db, cloudOptions, cloudSchema, options)];
|
|
5946
5964
|
case 1:
|
|
5947
|
-
|
|
5948
|
-
|
|
5949
|
-
|
|
5950
|
-
case
|
|
5951
|
-
|
|
5952
|
-
|
|
5953
|
-
|
|
5954
|
-
|
|
5965
|
+
// We are the dedicated sync SW:
|
|
5966
|
+
_k.sent();
|
|
5967
|
+
return [3 /*break*/, 5];
|
|
5968
|
+
case 2:
|
|
5969
|
+
if (!!db.cloud.usingServiceWorker) return [3 /*break*/, 4];
|
|
5970
|
+
// We use a flow that is better suited for the case when multiple workers want to
|
|
5971
|
+
// do the same thing.
|
|
5972
|
+
return [4 /*yield*/, performGuardedJob(db, CURRENT_SYNC_WORKER, '$jobs', function () { return sync(db, cloudOptions, cloudSchema, options); })];
|
|
5973
|
+
case 3:
|
|
5955
5974
|
// We use a flow that is better suited for the case when multiple workers want to
|
|
5956
5975
|
// do the same thing.
|
|
5957
|
-
|
|
5958
|
-
|
|
5976
|
+
_k.sent();
|
|
5977
|
+
return [3 /*break*/, 5];
|
|
5978
|
+
case 4:
|
|
5979
|
+
assert(false);
|
|
5980
|
+
throw new Error('Internal _syncIfPossible() - invalid precondition - should not have been called.');
|
|
5959
5981
|
case 5:
|
|
5960
5982
|
ongoingSyncs.delete(db);
|
|
5961
5983
|
console.debug('Done sync');
|
|
5962
5984
|
return [3 /*break*/, 7];
|
|
5963
5985
|
case 6:
|
|
5964
|
-
error_4 =
|
|
5986
|
+
error_4 = _k.sent();
|
|
5965
5987
|
ongoingSyncs.delete(db);
|
|
5966
5988
|
console.error("Failed to sync client changes", error_4);
|
|
5967
5989
|
throw error_4; // Make sure we rethrow error so that sync event is retried.
|
|
@@ -6003,8 +6025,8 @@ function LocalSyncWorker(db, cloudOptions, cloudSchema) {
|
|
|
6003
6025
|
// Sync eagerly whenever a change has happened (+ initially when there's no syncState yet)
|
|
6004
6026
|
// This initial subscribe will also trigger an sync also now.
|
|
6005
6027
|
console.debug('Starting LocalSyncWorker', db.localSyncEvent['id']);
|
|
6006
|
-
localSyncEventSubscription = db.localSyncEvent.subscribe(function (
|
|
6007
|
-
var purpose =
|
|
6028
|
+
localSyncEventSubscription = db.localSyncEvent.subscribe(function (_k) {
|
|
6029
|
+
var purpose = _k.purpose;
|
|
6008
6030
|
try {
|
|
6009
6031
|
syncAndRetry(purpose || 'pull');
|
|
6010
6032
|
}
|
|
@@ -6028,8 +6050,8 @@ function LocalSyncWorker(db, cloudOptions, cloudSchema) {
|
|
|
6028
6050
|
function updateSchemaFromOptions(schema, options) {
|
|
6029
6051
|
if (schema && options) {
|
|
6030
6052
|
if (options.unsyncedTables) {
|
|
6031
|
-
for (var
|
|
6032
|
-
var tableName =
|
|
6053
|
+
for (var _k = 0, _l = options.unsyncedTables; _k < _l.length; _k++) {
|
|
6054
|
+
var tableName = _l[_k];
|
|
6033
6055
|
if (schema[tableName]) {
|
|
6034
6056
|
schema[tableName].markedForSync = false;
|
|
6035
6057
|
}
|
|
@@ -6038,10 +6060,10 @@ function updateSchemaFromOptions(schema, options) {
|
|
|
6038
6060
|
}
|
|
6039
6061
|
}
|
|
6040
6062
|
function verifySchema(db) {
|
|
6041
|
-
var
|
|
6042
|
-
for (var
|
|
6043
|
-
var table =
|
|
6044
|
-
if ((
|
|
6063
|
+
var _a, _b;
|
|
6064
|
+
for (var _k = 0, _l = db.tables; _k < _l.length; _k++) {
|
|
6065
|
+
var table = _l[_k];
|
|
6066
|
+
if ((_b = (_a = db.cloud.schema) === null || _a === void 0 ? void 0 : _a[table.name]) === null || _b === void 0 ? void 0 : _b.markedForSync) {
|
|
6045
6067
|
if (table.schema.primKey.auto) {
|
|
6046
6068
|
throw new Dexie.SchemaError("Table ".concat(table.name, " is both autoIncremented and synced. ") +
|
|
6047
6069
|
"Use db.cloud.configure({unsyncedTables: [".concat(JSON.stringify(table.name), "]}) to blacklist it from sync"));
|
|
@@ -6283,8 +6305,8 @@ var Styles = {
|
|
|
6283
6305
|
padding: "8px"
|
|
6284
6306
|
}
|
|
6285
6307
|
};
|
|
6286
|
-
function Dialog(
|
|
6287
|
-
var children =
|
|
6308
|
+
function Dialog(_k) {
|
|
6309
|
+
var children = _k.children;
|
|
6288
6310
|
return (a$1("div", null, a$1("div", { style: Styles.Darken }), a$1("div", { style: Styles.DialogOuter }, a$1("div", { style: Styles.DialogInner }, children))));
|
|
6289
6311
|
}
|
|
6290
6312
|
var t, u, r, o = 0, i = [], c = n.__b, f = n.__r, e = n.diffed, a = n.__c, v = n.unmount;
|
|
@@ -6318,24 +6340,24 @@ function g(n) { var t = u; "function" == typeof n.__c && n.__c(), u = t; }
|
|
|
6318
6340
|
function j(n) { var t = u; n.__c = n.__(), u = t; }
|
|
6319
6341
|
function k(n, t) { return !n || n.length !== t.length || t.some(function (t, u) { return t !== n[u]; }); }
|
|
6320
6342
|
function w(n, t) { return "function" == typeof t ? t(n) : t; }
|
|
6321
|
-
function resolveText(
|
|
6322
|
-
var message =
|
|
6343
|
+
function resolveText(_k) {
|
|
6344
|
+
var message = _k.message; _k.messageCode; var messageParams = _k.messageParams;
|
|
6323
6345
|
return message.replace(/\{\w+\}/ig, function (n) { return messageParams[n.substr(1, n.length - 2)]; });
|
|
6324
6346
|
}
|
|
6325
|
-
function LoginDialog(
|
|
6326
|
-
var title =
|
|
6327
|
-
var
|
|
6347
|
+
function LoginDialog(_k) {
|
|
6348
|
+
var title = _k.title, alerts = _k.alerts, fields = _k.fields, onCancel = _k.onCancel, onSubmit = _k.onSubmit;
|
|
6349
|
+
var _l = l({}), params = _l[0], setParams = _l[1];
|
|
6328
6350
|
var firstFieldRef = s();
|
|
6329
|
-
h(function () { var
|
|
6351
|
+
h(function () { var _a; return (_a = firstFieldRef.current) === null || _a === void 0 ? void 0 : _a.focus(); }, []);
|
|
6330
6352
|
return (a$1(Dialog, null, 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) {
|
|
6331
6353
|
ev.preventDefault();
|
|
6332
6354
|
onSubmit(params);
|
|
6333
|
-
} }, Object.entries(fields).map(function (
|
|
6334
|
-
var fieldName =
|
|
6355
|
+
} }, Object.entries(fields).map(function (_k, idx) {
|
|
6356
|
+
var fieldName = _k[0], _l = _k[1], type = _l.type, label = _l.label, placeholder = _l.placeholder;
|
|
6335
6357
|
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) {
|
|
6336
|
-
var
|
|
6337
|
-
var
|
|
6338
|
-
return setParams(
|
|
6358
|
+
var _k;
|
|
6359
|
+
var _a;
|
|
6360
|
+
return setParams(Object.assign(Object.assign({}, params), (_k = {}, _k[fieldName] = valueTransformer(type, (_a = ev.target) === null || _a === void 0 ? void 0 : _a['value']), _k)));
|
|
6339
6361
|
} })));
|
|
6340
6362
|
}))), 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"))));
|
|
6341
6363
|
}
|
|
@@ -6363,12 +6385,12 @@ var LoginGui = /** @class */ (function (_super_1) {
|
|
|
6363
6385
|
delete this.subscription;
|
|
6364
6386
|
}
|
|
6365
6387
|
};
|
|
6366
|
-
LoginGui.prototype.render = function (props,
|
|
6367
|
-
var userInteraction =
|
|
6388
|
+
LoginGui.prototype.render = function (props, _k) {
|
|
6389
|
+
var userInteraction = _k.userInteraction;
|
|
6368
6390
|
if (!userInteraction)
|
|
6369
6391
|
return null;
|
|
6370
6392
|
//if (props.db.cloud.userInteraction.observers.length > 1) return null; // Someone else subscribes.
|
|
6371
|
-
return a$1(LoginDialog,
|
|
6393
|
+
return a$1(LoginDialog, Object.assign({}, userInteraction));
|
|
6372
6394
|
};
|
|
6373
6395
|
return LoginGui;
|
|
6374
6396
|
}(p$1));
|
|
@@ -6419,8 +6441,8 @@ function computeSyncState(db) {
|
|
|
6419
6441
|
lazyWebSocketStatus,
|
|
6420
6442
|
db.syncStateChangedEvent.pipe(startWith({ phase: 'initial' })),
|
|
6421
6443
|
userIsReallyActive
|
|
6422
|
-
]).pipe(map(function (
|
|
6423
|
-
var status =
|
|
6444
|
+
]).pipe(map(function (_k) {
|
|
6445
|
+
var status = _k[0], syncState = _k[1], userIsActive = _k[2];
|
|
6424
6446
|
var phase = syncState.phase, error = syncState.error, progress = syncState.progress;
|
|
6425
6447
|
var adjustedStatus = status;
|
|
6426
6448
|
if (phase === 'error') {
|
|
@@ -6499,10 +6521,10 @@ var getGlobalRolesObservable = associate(function (db) {
|
|
|
6499
6521
|
.toArray()
|
|
6500
6522
|
.then(function (roles) {
|
|
6501
6523
|
var rv = {};
|
|
6502
|
-
for (var
|
|
6524
|
+
for (var _k = 0, _l = roles
|
|
6503
6525
|
.slice()
|
|
6504
|
-
.sort(function (a, b) { return (a.sortOrder || 0) - (b.sortOrder || 0); });
|
|
6505
|
-
var role =
|
|
6526
|
+
.sort(function (a, b) { return (a.sortOrder || 0) - (b.sortOrder || 0); }); _k < _l.length; _k++) {
|
|
6527
|
+
var role = _l[_k];
|
|
6506
6528
|
rv[role.name] = role;
|
|
6507
6529
|
}
|
|
6508
6530
|
return rv;
|
|
@@ -6514,8 +6536,8 @@ var getInternalAccessControlObservable = associate(function (db) {
|
|
|
6514
6536
|
db.members.where({ userId: currentUser.userId }).toArray(),
|
|
6515
6537
|
db.realms.toArray(),
|
|
6516
6538
|
currentUser.userId,
|
|
6517
|
-
]).then(function (
|
|
6518
|
-
var selfMembers =
|
|
6539
|
+
]).then(function (_k) {
|
|
6540
|
+
var selfMembers = _k[0], realms = _k[1], userId = _k[2];
|
|
6519
6541
|
//console.debug(`PERMS: Result from liveQUery():`, JSON.stringify({selfMembers, realms, userId}, null, 2))
|
|
6520
6542
|
return { selfMembers: selfMembers, realms: realms, userId: userId };
|
|
6521
6543
|
}); }); }); })), {
|
|
@@ -6548,15 +6570,15 @@ function mapValueObservable(o, mapper) {
|
|
|
6548
6570
|
// TODO: Move to dexie-cloud-common
|
|
6549
6571
|
function mergePermissions() {
|
|
6550
6572
|
var permissions = [];
|
|
6551
|
-
for (var
|
|
6552
|
-
permissions[
|
|
6573
|
+
for (var _k = 0; _k < arguments.length; _k++) {
|
|
6574
|
+
permissions[_k] = arguments[_k];
|
|
6553
6575
|
}
|
|
6554
6576
|
if (permissions.length === 0)
|
|
6555
6577
|
return {};
|
|
6556
6578
|
var reduced = permissions.reduce(function (result, next) {
|
|
6557
|
-
var ret =
|
|
6558
|
-
for (var
|
|
6559
|
-
var
|
|
6579
|
+
var ret = Object.assign({}, result);
|
|
6580
|
+
for (var _k = 0, _l = Object.entries(next); _k < _l.length; _k++) {
|
|
6581
|
+
var _m = _l[_k], verb = _m[0], rights = _m[1];
|
|
6560
6582
|
if (verb in ret && ret[verb]) {
|
|
6561
6583
|
if (ret[verb] === '*')
|
|
6562
6584
|
continue;
|
|
@@ -6574,8 +6596,8 @@ function mergePermissions() {
|
|
|
6574
6596
|
typeof ret[verb] === 'object') {
|
|
6575
6597
|
// Both are objects (verb is 'update')
|
|
6576
6598
|
var mergedRights = ret[verb]; // because we've checked that typeof ret[verb] === 'object' and earlier that not ret[verb] === '*'.
|
|
6577
|
-
for (var
|
|
6578
|
-
var
|
|
6599
|
+
for (var _o = 0, _p = Object.entries(rights); _o < _p.length; _o++) {
|
|
6600
|
+
var _q = _p[_o], tableName = _q[0], tableRights = _q[1];
|
|
6579
6601
|
if (mergedRights[tableName] === '*')
|
|
6580
6602
|
continue;
|
|
6581
6603
|
if (tableRights === '*') {
|
|
@@ -6613,8 +6635,8 @@ var getPermissionsLookupObservable = associate(function (db) {
|
|
|
6613
6635
|
var o = createSharedValueObservable(combineLatest([
|
|
6614
6636
|
getInternalAccessControlObservable(db._novip),
|
|
6615
6637
|
getGlobalRolesObservable(db._novip),
|
|
6616
|
-
]).pipe(map(function (
|
|
6617
|
-
var
|
|
6638
|
+
]).pipe(map(function (_k) {
|
|
6639
|
+
var _l = _k[0], selfMembers = _l.selfMembers, realms = _l.realms, userId = _l.userId, globalRoles = _k[1];
|
|
6618
6640
|
return ({
|
|
6619
6641
|
selfMembers: selfMembers,
|
|
6620
6642
|
realms: realms,
|
|
@@ -6627,9 +6649,9 @@ var getPermissionsLookupObservable = associate(function (db) {
|
|
|
6627
6649
|
userId: UNAUTHORIZED_USER.userId,
|
|
6628
6650
|
globalRoles: {},
|
|
6629
6651
|
});
|
|
6630
|
-
return mapValueObservable(o, function (
|
|
6631
|
-
var
|
|
6632
|
-
var selfMembers =
|
|
6652
|
+
return mapValueObservable(o, function (_k) {
|
|
6653
|
+
var _l;
|
|
6654
|
+
var selfMembers = _k.selfMembers, realms = _k.realms, userId = _k.userId, globalRoles = _k.globalRoles;
|
|
6633
6655
|
var rv = realms
|
|
6634
6656
|
.map(function (realm) {
|
|
6635
6657
|
var selfRealmMembers = selfMembers.filter(function (m) { return m.realmId === realm.realmId; });
|
|
@@ -6640,21 +6662,21 @@ var getPermissionsLookupObservable = associate(function (db) {
|
|
|
6640
6662
|
.map(function (role) { return globalRoles[role]; })
|
|
6641
6663
|
.filter(function (role) { return role; })
|
|
6642
6664
|
.map(function (role) { return role.permissions; });
|
|
6643
|
-
return
|
|
6665
|
+
return Object.assign(Object.assign({}, realm), { permissions: realm.owner === userId
|
|
6644
6666
|
? { manage: '*' }
|
|
6645
6667
|
: mergePermissions.apply(void 0, __spreadArray$1(__spreadArray$1([], directPermissionSets, false), rolePermissionSets, false)) });
|
|
6646
6668
|
})
|
|
6647
6669
|
.reduce(function (p, c) {
|
|
6648
|
-
var
|
|
6649
|
-
return (
|
|
6650
|
-
}, (
|
|
6651
|
-
|
|
6670
|
+
var _k;
|
|
6671
|
+
return (Object.assign(Object.assign({}, p), (_k = {}, _k[c.realmId] = c, _k)));
|
|
6672
|
+
}, (_l = {},
|
|
6673
|
+
_l[userId] = {
|
|
6652
6674
|
realmId: userId,
|
|
6653
6675
|
owner: userId,
|
|
6654
6676
|
name: userId,
|
|
6655
6677
|
permissions: { manage: '*' },
|
|
6656
6678
|
},
|
|
6657
|
-
|
|
6679
|
+
_l));
|
|
6658
6680
|
return rv;
|
|
6659
6681
|
});
|
|
6660
6682
|
});
|
|
@@ -6666,44 +6688,44 @@ var PermissionChecker = /** @class */ (function () {
|
|
|
6666
6688
|
}
|
|
6667
6689
|
PermissionChecker.prototype.add = function () {
|
|
6668
6690
|
var _this_1 = this;
|
|
6669
|
-
var _e;
|
|
6670
6691
|
var tableNames = [];
|
|
6671
|
-
for (var
|
|
6672
|
-
tableNames[
|
|
6692
|
+
for (var _k = 0; _k < arguments.length; _k++) {
|
|
6693
|
+
tableNames[_k] = arguments[_k];
|
|
6673
6694
|
}
|
|
6695
|
+
var _a;
|
|
6674
6696
|
// If user can manage the whole realm, return true.
|
|
6675
6697
|
if (this.permissions.manage === '*')
|
|
6676
6698
|
return true;
|
|
6677
6699
|
// If user can manage given table in realm, return true
|
|
6678
|
-
if ((
|
|
6700
|
+
if ((_a = this.permissions.manage) === null || _a === void 0 ? void 0 : _a.includes(this.tableName))
|
|
6679
6701
|
return true;
|
|
6680
6702
|
// If user can add any type, return true
|
|
6681
6703
|
if (this.permissions.add === '*')
|
|
6682
6704
|
return true;
|
|
6683
6705
|
// If user can add objects into given table names in the realm, return true
|
|
6684
|
-
if (tableNames.every(function (tableName) { var
|
|
6706
|
+
if (tableNames.every(function (tableName) { var _a; return (_a = _this_1.permissions.add) === null || _a === void 0 ? void 0 : _a.includes(tableName); })) {
|
|
6685
6707
|
return true;
|
|
6686
6708
|
}
|
|
6687
6709
|
return false;
|
|
6688
6710
|
};
|
|
6689
6711
|
PermissionChecker.prototype.update = function () {
|
|
6690
|
-
var _e, _f;
|
|
6691
6712
|
var props = [];
|
|
6692
|
-
for (var
|
|
6693
|
-
props[
|
|
6713
|
+
for (var _k = 0; _k < arguments.length; _k++) {
|
|
6714
|
+
props[_k] = arguments[_k];
|
|
6694
6715
|
}
|
|
6716
|
+
var _a, _b;
|
|
6695
6717
|
// If user is owner of this object, or if user can manage the whole realm, return true.
|
|
6696
6718
|
if (this.isOwner || this.permissions.manage === '*')
|
|
6697
6719
|
return true;
|
|
6698
6720
|
// If user can manage given table in realm, return true
|
|
6699
|
-
if ((
|
|
6721
|
+
if ((_a = this.permissions.manage) === null || _a === void 0 ? void 0 : _a.includes(this.tableName))
|
|
6700
6722
|
return true;
|
|
6701
6723
|
// If user can update any prop in any table in this realm, return true unless
|
|
6702
6724
|
// it regards to ownership change:
|
|
6703
6725
|
if (this.permissions.update === '*') {
|
|
6704
6726
|
return props.every(function (prop) { return prop !== 'owner'; });
|
|
6705
6727
|
}
|
|
6706
|
-
var tablePermissions = (
|
|
6728
|
+
var tablePermissions = (_b = this.permissions.update) === null || _b === void 0 ? void 0 : _b[this.tableName];
|
|
6707
6729
|
// If user can update any prop in table and realm, return true unless
|
|
6708
6730
|
// accessing special props owner or realmId
|
|
6709
6731
|
if (tablePermissions === '*')
|
|
@@ -6712,12 +6734,12 @@ var PermissionChecker = /** @class */ (function () {
|
|
|
6712
6734
|
return props.every(function (prop) { return tablePermissions === null || tablePermissions === void 0 ? void 0 : tablePermissions.some(function (permittedProp) { return permittedProp === prop || (permittedProp === '*' && prop !== 'owner'); }); });
|
|
6713
6735
|
};
|
|
6714
6736
|
PermissionChecker.prototype.delete = function () {
|
|
6715
|
-
var
|
|
6737
|
+
var _a;
|
|
6716
6738
|
// If user is owner of this object, or if user can manage the whole realm, return true.
|
|
6717
6739
|
if (this.isOwner || this.permissions.manage === '*')
|
|
6718
6740
|
return true;
|
|
6719
6741
|
// If user can manage given table in realm, return true
|
|
6720
|
-
if ((
|
|
6742
|
+
if ((_a = this.permissions.manage) === null || _a === void 0 ? void 0 : _a.includes(this.tableName))
|
|
6721
6743
|
return true;
|
|
6722
6744
|
return false;
|
|
6723
6745
|
};
|
|
@@ -6751,11 +6773,11 @@ var getInvitesObservable = associate(function (db) {
|
|
|
6751
6773
|
var membersByEmail = getCurrentUserEmitter(db._novip).pipe(switchMap$1(function (currentUser) { return liveQuery(function () { return db.members.where({ email: currentUser.email || '' }).toArray(); }); }));
|
|
6752
6774
|
var permissions = getPermissionsLookupObservable(db._novip);
|
|
6753
6775
|
var accessControl = getInternalAccessControlObservable(db._novip);
|
|
6754
|
-
return createSharedValueObservable(combineLatest([membersByEmail, accessControl, permissions]).pipe(map$1(function (
|
|
6755
|
-
var membersByEmail =
|
|
6776
|
+
return createSharedValueObservable(combineLatest([membersByEmail, accessControl, permissions]).pipe(map$1(function (_k) {
|
|
6777
|
+
var membersByEmail = _k[0], accessControl = _k[1], realmLookup = _k[2];
|
|
6756
6778
|
var reducer = function (result, m) {
|
|
6757
|
-
var
|
|
6758
|
-
return (
|
|
6779
|
+
var _k;
|
|
6780
|
+
return (Object.assign(Object.assign({}, result), (_k = {}, _k[m.id] = Object.assign(Object.assign({}, m), { realm: realmLookup[m.realmId] }), _k)));
|
|
6759
6781
|
};
|
|
6760
6782
|
var emailMembersById = membersByEmail.reduce(reducer, {});
|
|
6761
6783
|
var membersById = accessControl.selfMembers.reduce(reducer, emailMembersById);
|
|
@@ -6784,16 +6806,16 @@ function dexieCloud(dexie) {
|
|
|
6784
6806
|
var localSyncWorker = null;
|
|
6785
6807
|
dexie.on('ready', function (dexie) { return __awaiter$1(_this_1, void 0, void 0, function () {
|
|
6786
6808
|
var error_5;
|
|
6787
|
-
return __generator$1(this, function (
|
|
6788
|
-
switch (
|
|
6809
|
+
return __generator$1(this, function (_k) {
|
|
6810
|
+
switch (_k.label) {
|
|
6789
6811
|
case 0:
|
|
6790
|
-
|
|
6812
|
+
_k.trys.push([0, 2, , 3]);
|
|
6791
6813
|
return [4 /*yield*/, onDbReady(dexie)];
|
|
6792
6814
|
case 1:
|
|
6793
|
-
|
|
6815
|
+
_k.sent();
|
|
6794
6816
|
return [3 /*break*/, 3];
|
|
6795
6817
|
case 2:
|
|
6796
|
-
error_5 =
|
|
6818
|
+
error_5 = _k.sent();
|
|
6797
6819
|
console.error(error_5);
|
|
6798
6820
|
return [3 /*break*/, 3];
|
|
6799
6821
|
case 3: return [2 /*return*/];
|
|
@@ -6815,8 +6837,8 @@ function dexieCloud(dexie) {
|
|
|
6815
6837
|
currentUserEmitter.next(UNAUTHORIZED_USER);
|
|
6816
6838
|
});
|
|
6817
6839
|
dexie.cloud = {
|
|
6818
|
-
version: '4.0.0-beta.
|
|
6819
|
-
options:
|
|
6840
|
+
version: '4.0.0-beta.19',
|
|
6841
|
+
options: Object.assign({}, DEFAULT_OPTIONS),
|
|
6820
6842
|
schema: null,
|
|
6821
6843
|
serverState: null,
|
|
6822
6844
|
get currentUserId() {
|
|
@@ -6833,16 +6855,16 @@ function dexieCloud(dexie) {
|
|
|
6833
6855
|
login: function (hint) {
|
|
6834
6856
|
return __awaiter$1(this, void 0, void 0, function () {
|
|
6835
6857
|
var db;
|
|
6836
|
-
return __generator$1(this, function (
|
|
6837
|
-
switch (
|
|
6858
|
+
return __generator$1(this, function (_k) {
|
|
6859
|
+
switch (_k.label) {
|
|
6838
6860
|
case 0:
|
|
6839
6861
|
db = DexieCloudDB(dexie);
|
|
6840
6862
|
return [4 /*yield*/, db.cloud.sync()];
|
|
6841
6863
|
case 1:
|
|
6842
|
-
|
|
6864
|
+
_k.sent();
|
|
6843
6865
|
return [4 /*yield*/, login(db, hint)];
|
|
6844
6866
|
case 2:
|
|
6845
|
-
|
|
6867
|
+
_k.sent();
|
|
6846
6868
|
return [2 /*return*/];
|
|
6847
6869
|
}
|
|
6848
6870
|
});
|
|
@@ -6851,7 +6873,7 @@ function dexieCloud(dexie) {
|
|
|
6851
6873
|
invites: getInvitesObservable(dexie),
|
|
6852
6874
|
roles: getGlobalRolesObservable(dexie),
|
|
6853
6875
|
configure: function (options) {
|
|
6854
|
-
options = dexie.cloud.options =
|
|
6876
|
+
options = dexie.cloud.options = Object.assign(Object.assign({}, dexie.cloud.options), options);
|
|
6855
6877
|
configuredProgramatically = true;
|
|
6856
6878
|
if (options.databaseUrl && options.nameSuffix) {
|
|
6857
6879
|
// @ts-ignore
|
|
@@ -6860,13 +6882,13 @@ function dexieCloud(dexie) {
|
|
|
6860
6882
|
}
|
|
6861
6883
|
updateSchemaFromOptions(dexie.cloud.schema, dexie.cloud.options);
|
|
6862
6884
|
},
|
|
6863
|
-
sync: function (
|
|
6864
|
-
var
|
|
6885
|
+
sync: function (_k) {
|
|
6886
|
+
var _l = _k === void 0 ? { wait: true, purpose: 'push' } : _k, wait = _l.wait, purpose = _l.purpose;
|
|
6865
6887
|
return __awaiter$1(this, void 0, void 0, function () {
|
|
6866
6888
|
var db, syncState_1, newSyncState, syncState_2;
|
|
6867
6889
|
var _this_1 = this;
|
|
6868
|
-
return __generator$1(this, function (
|
|
6869
|
-
switch (
|
|
6890
|
+
return __generator$1(this, function (_k) {
|
|
6891
|
+
switch (_k.label) {
|
|
6870
6892
|
case 0:
|
|
6871
6893
|
if (wait === undefined)
|
|
6872
6894
|
wait = true;
|
|
@@ -6880,29 +6902,29 @@ function dexieCloud(dexie) {
|
|
|
6880
6902
|
(!syncState_1 || newSyncState.timestamp > syncState_1.timestamp); }), take(1))
|
|
6881
6903
|
.toPromise()];
|
|
6882
6904
|
case 1:
|
|
6883
|
-
newSyncState =
|
|
6905
|
+
newSyncState = _k.sent();
|
|
6884
6906
|
if (newSyncState === null || newSyncState === void 0 ? void 0 : newSyncState.error) {
|
|
6885
6907
|
throw new Error("Sync error: " + newSyncState.error);
|
|
6886
6908
|
}
|
|
6887
|
-
|
|
6909
|
+
_k.label = 2;
|
|
6888
6910
|
case 2: return [3 /*break*/, 6];
|
|
6889
6911
|
case 3: return [4 /*yield*/, isSyncNeeded(db)];
|
|
6890
6912
|
case 4:
|
|
6891
|
-
if (!
|
|
6913
|
+
if (!_k.sent()) return [3 /*break*/, 6];
|
|
6892
6914
|
syncState_2 = db.cloud.persistedSyncState.value;
|
|
6893
6915
|
triggerSync(db, purpose);
|
|
6894
6916
|
if (!wait) return [3 /*break*/, 6];
|
|
6895
6917
|
console.debug('db.cloud.login() is waiting for sync completion...');
|
|
6896
6918
|
return [4 /*yield*/, from$1(liveQuery(function () { return __awaiter$1(_this_1, void 0, void 0, function () {
|
|
6897
6919
|
var syncNeeded, newSyncState;
|
|
6898
|
-
return __generator$1(this, function (
|
|
6899
|
-
switch (
|
|
6920
|
+
return __generator$1(this, function (_k) {
|
|
6921
|
+
switch (_k.label) {
|
|
6900
6922
|
case 0: return [4 /*yield*/, isSyncNeeded(db)];
|
|
6901
6923
|
case 1:
|
|
6902
|
-
syncNeeded =
|
|
6924
|
+
syncNeeded = _k.sent();
|
|
6903
6925
|
return [4 /*yield*/, db.getPersistedSyncState()];
|
|
6904
6926
|
case 2:
|
|
6905
|
-
newSyncState =
|
|
6927
|
+
newSyncState = _k.sent();
|
|
6906
6928
|
if ((newSyncState === null || newSyncState === void 0 ? void 0 : newSyncState.timestamp) !== (syncState_2 === null || syncState_2 === void 0 ? void 0 : syncState_2.timestamp) &&
|
|
6907
6929
|
(newSyncState === null || newSyncState === void 0 ? void 0 : newSyncState.error))
|
|
6908
6930
|
throw new Error("Sync error: " + newSyncState.error);
|
|
@@ -6913,9 +6935,9 @@ function dexieCloud(dexie) {
|
|
|
6913
6935
|
.pipe(filter(function (isNeeded) { return !isNeeded; }), take(1))
|
|
6914
6936
|
.toPromise()];
|
|
6915
6937
|
case 5:
|
|
6916
|
-
|
|
6938
|
+
_k.sent();
|
|
6917
6939
|
console.debug('Done waiting for sync completion because we have nothing to push anymore');
|
|
6918
|
-
|
|
6940
|
+
_k.label = 6;
|
|
6919
6941
|
case 6: return [2 /*return*/];
|
|
6920
6942
|
}
|
|
6921
6943
|
});
|
|
@@ -6926,14 +6948,14 @@ function dexieCloud(dexie) {
|
|
|
6926
6948
|
},
|
|
6927
6949
|
};
|
|
6928
6950
|
dexie.Version.prototype['_parseStoresSpec'] = Dexie.override(dexie.Version.prototype['_parseStoresSpec'], function (origFunc) { return overrideParseStoresSpec(origFunc, dexie); });
|
|
6929
|
-
dexie.Table.prototype.newId = function (
|
|
6930
|
-
var
|
|
6951
|
+
dexie.Table.prototype.newId = function (_k) {
|
|
6952
|
+
var _l = _k === void 0 ? {} : _k, colocateWith = _l.colocateWith;
|
|
6931
6953
|
var shardKey = colocateWith && colocateWith.substr(colocateWith.length - 3);
|
|
6932
6954
|
return generateKey(dexie.cloud.schema[this.name].idPrefix || '', shardKey);
|
|
6933
6955
|
};
|
|
6934
6956
|
dexie.Table.prototype.idPrefix = function () {
|
|
6935
|
-
var
|
|
6936
|
-
return ((
|
|
6957
|
+
var _a, _b;
|
|
6958
|
+
return ((_b = (_a = this.db.cloud.schema) === null || _a === void 0 ? void 0 : _a[this.name]) === null || _b === void 0 ? void 0 : _b.idPrefix) || '';
|
|
6937
6959
|
};
|
|
6938
6960
|
dexie.use(createMutationTrackingMiddleware({
|
|
6939
6961
|
currentUserObservable: dexie.cloud.currentUser,
|
|
@@ -6942,20 +6964,22 @@ function dexieCloud(dexie) {
|
|
|
6942
6964
|
dexie.use(createImplicitPropSetterMiddleware(DexieCloudDB(dexie)));
|
|
6943
6965
|
dexie.use(createIdGenerationMiddleware(DexieCloudDB(dexie)));
|
|
6944
6966
|
function onDbReady(dexie) {
|
|
6945
|
-
var
|
|
6967
|
+
var _a, _b, _c, _d, _e, _f, _g;
|
|
6946
6968
|
return __awaiter$1(this, void 0, void 0, function () {
|
|
6947
|
-
var db, swRegistrations,
|
|
6969
|
+
var db, swRegistrations, _k, initiallySynced;
|
|
6948
6970
|
var _this_1 = this;
|
|
6949
|
-
return __generator$1(this, function (
|
|
6950
|
-
switch (
|
|
6971
|
+
return __generator$1(this, function (_l) {
|
|
6972
|
+
switch (_l.label) {
|
|
6951
6973
|
case 0:
|
|
6952
6974
|
closed = false; // As Dexie calls us, we are not closed anymore. Maybe reopened? Remember db.ready event is registered with sticky flag!
|
|
6953
6975
|
db = DexieCloudDB(dexie);
|
|
6954
6976
|
// Setup default GUI:
|
|
6955
|
-
if (
|
|
6956
|
-
if (!((
|
|
6977
|
+
if (typeof window !== 'undefined' && typeof document !== 'undefined') {
|
|
6978
|
+
if (!((_a = db.cloud.options) === null || _a === void 0 ? void 0 : _a.customLoginGui)) {
|
|
6957
6979
|
subscriptions.push(setupDefaultGUI(dexie));
|
|
6958
6980
|
}
|
|
6981
|
+
}
|
|
6982
|
+
if (!db.cloud.isServiceWorkerDB) {
|
|
6959
6983
|
subscriptions.push(computeSyncState(db).subscribe(dexie.cloud.syncState));
|
|
6960
6984
|
}
|
|
6961
6985
|
//verifyConfig(db.cloud.options); Not needed (yet at least!)
|
|
@@ -6966,27 +6990,26 @@ function dexieCloud(dexie) {
|
|
|
6966
6990
|
if (!('serviceWorker' in navigator)) return [3 /*break*/, 2];
|
|
6967
6991
|
return [4 /*yield*/, navigator.serviceWorker.getRegistrations()];
|
|
6968
6992
|
case 1:
|
|
6969
|
-
|
|
6993
|
+
_k = _l.sent();
|
|
6970
6994
|
return [3 /*break*/, 3];
|
|
6971
6995
|
case 2:
|
|
6972
|
-
|
|
6973
|
-
|
|
6996
|
+
_k = [];
|
|
6997
|
+
_l.label = 3;
|
|
6974
6998
|
case 3:
|
|
6975
|
-
swRegistrations =
|
|
6999
|
+
swRegistrations = _k;
|
|
6976
7000
|
return [4 /*yield*/, db.transaction('rw', db.$syncState, function () { return __awaiter$1(_this_1, void 0, void 0, function () {
|
|
6977
|
-
var
|
|
6978
|
-
|
|
6979
|
-
|
|
6980
|
-
switch (_m.label) {
|
|
7001
|
+
var _h, _j, _k, options, schema, _l, persistedOptions, persistedSchema, persistedSyncState, newPersistedSchema, _m, _o, _p, table, tblSchema, newTblSchema;
|
|
7002
|
+
return __generator$1(this, function (_q) {
|
|
7003
|
+
switch (_q.label) {
|
|
6981
7004
|
case 0:
|
|
6982
|
-
|
|
7005
|
+
_k = db.cloud, options = _k.options, schema = _k.schema;
|
|
6983
7006
|
return [4 /*yield*/, Promise.all([
|
|
6984
7007
|
db.getOptions(),
|
|
6985
7008
|
db.getSchema(),
|
|
6986
7009
|
db.getPersistedSyncState(),
|
|
6987
7010
|
])];
|
|
6988
7011
|
case 1:
|
|
6989
|
-
|
|
7012
|
+
_l = _q.sent(), persistedOptions = _l[0], persistedSchema = _l[1], persistedSyncState = _l[2];
|
|
6990
7013
|
if (!!configuredProgramatically) return [3 /*break*/, 2];
|
|
6991
7014
|
// Options not specified programatically (use case for SW!)
|
|
6992
7015
|
// Take persisted options:
|
|
@@ -7000,10 +7023,10 @@ function dexieCloud(dexie) {
|
|
|
7000
7023
|
throw new Error("Internal error"); // options cannot be null if configuredProgramatically is set.
|
|
7001
7024
|
return [4 /*yield*/, db.$syncState.put(options, 'options')];
|
|
7002
7025
|
case 3:
|
|
7003
|
-
|
|
7004
|
-
|
|
7026
|
+
_q.sent();
|
|
7027
|
+
_q.label = 4;
|
|
7005
7028
|
case 4:
|
|
7006
|
-
if (((
|
|
7029
|
+
if (((_h = db.cloud.options) === null || _h === void 0 ? void 0 : _h.tryUseServiceWorker) &&
|
|
7007
7030
|
'serviceWorker' in navigator &&
|
|
7008
7031
|
swRegistrations.length > 0 &&
|
|
7009
7032
|
!DISABLE_SERVICEWORKER_STRATEGY) {
|
|
@@ -7017,7 +7040,8 @@ function dexieCloud(dexie) {
|
|
|
7017
7040
|
// Not configured for using service worker or no service worker
|
|
7018
7041
|
// registration exists. Don't rely on service worker to do any job.
|
|
7019
7042
|
// Use LocalSyncWorker instead.
|
|
7020
|
-
if (((
|
|
7043
|
+
if (((_j = db.cloud.options) === null || _j === void 0 ? void 0 : _j.tryUseServiceWorker) &&
|
|
7044
|
+
!db.cloud.isServiceWorkerDB) {
|
|
7021
7045
|
console.debug('dexie-cloud-addon: Not using service worker.', swRegistrations.length === 0
|
|
7022
7046
|
? 'No SW registrations found.'
|
|
7023
7047
|
: 'serviceWorker' in navigator && DISABLE_SERVICEWORKER_STRATEGY
|
|
@@ -7037,11 +7061,11 @@ function dexieCloud(dexie) {
|
|
|
7037
7061
|
if (!(!persistedSchema ||
|
|
7038
7062
|
JSON.stringify(persistedSchema) !== JSON.stringify(schema))) return [3 /*break*/, 7];
|
|
7039
7063
|
newPersistedSchema = persistedSchema || {};
|
|
7040
|
-
for (
|
|
7041
|
-
|
|
7064
|
+
for (_m = 0, _o = Object.entries(schema); _m < _o.length; _m++) {
|
|
7065
|
+
_p = _o[_m], table = _p[0], tblSchema = _p[1];
|
|
7042
7066
|
newTblSchema = newPersistedSchema[table];
|
|
7043
7067
|
if (!newTblSchema) {
|
|
7044
|
-
newPersistedSchema[table] =
|
|
7068
|
+
newPersistedSchema[table] = Object.assign({}, tblSchema);
|
|
7045
7069
|
}
|
|
7046
7070
|
else {
|
|
7047
7071
|
newTblSchema.markedForSync = tblSchema.markedForSync;
|
|
@@ -7051,31 +7075,31 @@ function dexieCloud(dexie) {
|
|
|
7051
7075
|
}
|
|
7052
7076
|
return [4 /*yield*/, db.$syncState.put(newPersistedSchema, 'schema')];
|
|
7053
7077
|
case 6:
|
|
7054
|
-
|
|
7078
|
+
_q.sent();
|
|
7055
7079
|
// Make sure persisted table prefixes are being used instead of computed ones:
|
|
7056
7080
|
// Let's assign all props as the newPersistedSchems should be what we should be working with.
|
|
7057
7081
|
Object.assign(schema, newPersistedSchema);
|
|
7058
|
-
|
|
7082
|
+
_q.label = 7;
|
|
7059
7083
|
case 7: return [2 /*return*/, persistedSyncState === null || persistedSyncState === void 0 ? void 0 : persistedSyncState.initiallySynced];
|
|
7060
7084
|
}
|
|
7061
7085
|
});
|
|
7062
7086
|
}); })];
|
|
7063
7087
|
case 4:
|
|
7064
|
-
initiallySynced =
|
|
7088
|
+
initiallySynced = _l.sent();
|
|
7065
7089
|
if (initiallySynced) {
|
|
7066
7090
|
db.setInitiallySynced(true);
|
|
7067
7091
|
}
|
|
7068
7092
|
verifySchema(db);
|
|
7069
|
-
if (!(((
|
|
7093
|
+
if (!(((_b = db.cloud.options) === null || _b === void 0 ? void 0 : _b.databaseUrl) && !initiallySynced)) return [3 /*break*/, 6];
|
|
7070
7094
|
return [4 /*yield*/, performInitialSync(db, db.cloud.options, db.cloud.schema)];
|
|
7071
7095
|
case 5:
|
|
7072
|
-
|
|
7096
|
+
_l.sent();
|
|
7073
7097
|
db.setInitiallySynced(true);
|
|
7074
|
-
|
|
7098
|
+
_l.label = 6;
|
|
7075
7099
|
case 6:
|
|
7076
7100
|
// Manage CurrentUser observable:
|
|
7077
7101
|
throwIfClosed();
|
|
7078
|
-
if (!!
|
|
7102
|
+
if (!!db.cloud.isServiceWorkerDB) return [3 /*break*/, 8];
|
|
7079
7103
|
subscriptions.push(liveQuery(function () { return db.getCurrentUser(); }).subscribe(currentUserEmitter));
|
|
7080
7104
|
// Manage PersistendSyncState observable:
|
|
7081
7105
|
subscriptions.push(liveQuery(function () { return db.getPersistedSyncState(); }).subscribe(db.cloud.persistedSyncState));
|
|
@@ -7092,26 +7116,26 @@ function dexieCloud(dexie) {
|
|
|
7092
7116
|
// with things from the database and not just the default values.
|
|
7093
7117
|
// This is so that when db.open() completes, user should be safe
|
|
7094
7118
|
// to subscribe to these observables and get actual data.
|
|
7095
|
-
|
|
7096
|
-
|
|
7119
|
+
_l.sent();
|
|
7120
|
+
_l.label = 8;
|
|
7097
7121
|
case 8:
|
|
7098
|
-
if (!((
|
|
7122
|
+
if (!((_c = db.cloud.options) === null || _c === void 0 ? void 0 : _c.requireAuth)) return [3 /*break*/, 10];
|
|
7099
7123
|
return [4 /*yield*/, login(db)];
|
|
7100
7124
|
case 9:
|
|
7101
|
-
|
|
7102
|
-
|
|
7125
|
+
_l.sent();
|
|
7126
|
+
_l.label = 10;
|
|
7103
7127
|
case 10:
|
|
7104
7128
|
if (localSyncWorker)
|
|
7105
7129
|
localSyncWorker.stop();
|
|
7106
7130
|
localSyncWorker = null;
|
|
7107
7131
|
throwIfClosed();
|
|
7108
|
-
if (db.cloud.usingServiceWorker && ((
|
|
7132
|
+
if (db.cloud.usingServiceWorker && ((_d = db.cloud.options) === null || _d === void 0 ? void 0 : _d.databaseUrl)) {
|
|
7109
7133
|
registerSyncEvent(db, 'push').catch(function () { });
|
|
7110
7134
|
registerPeriodicSyncEvent(db).catch(function () { });
|
|
7111
7135
|
}
|
|
7112
|
-
else if (((
|
|
7136
|
+
else if (((_e = db.cloud.options) === null || _e === void 0 ? void 0 : _e.databaseUrl) &&
|
|
7113
7137
|
db.cloud.schema &&
|
|
7114
|
-
!
|
|
7138
|
+
!db.cloud.isServiceWorkerDB) {
|
|
7115
7139
|
// There's no SW. Start SyncWorker instead.
|
|
7116
7140
|
localSyncWorker = LocalSyncWorker(db, db.cloud.options, db.cloud.schema);
|
|
7117
7141
|
localSyncWorker.start();
|
|
@@ -7119,7 +7143,7 @@ function dexieCloud(dexie) {
|
|
|
7119
7143
|
}
|
|
7120
7144
|
// Listen to online event and do sync.
|
|
7121
7145
|
throwIfClosed();
|
|
7122
|
-
if (!
|
|
7146
|
+
if (!db.cloud.isServiceWorkerDB) {
|
|
7123
7147
|
subscriptions.push(fromEvent(self, 'online').subscribe(function () {
|
|
7124
7148
|
console.debug('online!');
|
|
7125
7149
|
db.syncStateChangedEvent.next({
|
|
@@ -7133,10 +7157,10 @@ function dexieCloud(dexie) {
|
|
|
7133
7157
|
});
|
|
7134
7158
|
}));
|
|
7135
7159
|
}
|
|
7136
|
-
// Connect WebSocket
|
|
7137
|
-
if (
|
|
7138
|
-
!
|
|
7139
|
-
|
|
7160
|
+
// Connect WebSocket unless we
|
|
7161
|
+
if (((_f = db.cloud.options) === null || _f === void 0 ? void 0 : _f.databaseUrl) &&
|
|
7162
|
+
!((_g = db.cloud.options) === null || _g === void 0 ? void 0 : _g.disableWebSocket) &&
|
|
7163
|
+
!IS_SERVICE_WORKER) {
|
|
7140
7164
|
subscriptions.push(connectWebSocket(db));
|
|
7141
7165
|
}
|
|
7142
7166
|
return [2 /*return*/];
|
|
@@ -7145,7 +7169,7 @@ function dexieCloud(dexie) {
|
|
|
7145
7169
|
});
|
|
7146
7170
|
}
|
|
7147
7171
|
}
|
|
7148
|
-
dexieCloud.version = '4.0.0-beta.
|
|
7172
|
+
dexieCloud.version = '4.0.0-beta.19';
|
|
7149
7173
|
Dexie.Cloud = dexieCloud;
|
|
7150
7174
|
|
|
7151
7175
|
export { dexieCloud as default, dexieCloud, getTiedObjectId, getTiedRealmId };
|