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