dexie-cloud-addon 4.0.0-beta.15 → 4.0.0-beta.16
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 +96 -36
- 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 +95 -35
- 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 +94 -31
- 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 +4 -1
- package/dist/types/DexieCloudEntity.d.ts +8 -0
- package/dist/types/WSObservable.d.ts +1 -0
- package/dist/types/WebSocketStatus.d.ts +1 -0
- package/dist/types/createMyMembersObservable.d.ts +14 -0
- package/dist/types/currentUserObservable.d.ts +3 -0
- package/dist/types/getGlobalRolesObservable.d.ts +5 -0
- package/dist/types/getInvitesObservable.d.ts +1 -1
- package/dist/types/helpers/BroadcastedLocalEvent.d.ts +8 -0
- package/dist/types/helpers/visibleState.d.ts +1 -0
- package/dist/types/permissionsLookup.d.ts +9 -0
- package/dist/types/permissionsLookupObservable.d.ts +14 -0
- package/dist/types/sync/globalizePrivateIds.d.ts +4 -0
- package/dist/types/sync/syncServerToClientOnly.d.ts +3 -0
- package/dist/types/types/CloudConnectionStatus.d.ts +0 -0
- package/dist/types/types/ConnectionStatus.d.ts +0 -0
- package/dist/types/types/LoginState.d.ts +41 -0
- package/dist/types/types/SyncConnectionStatus.d.ts +1 -0
- package/dist/types/types/SyncFlowStatus.d.ts +6 -0
- package/dist/types/types/SyncStatus.d.ts +6 -0
- package/dist/umd/dexie-cloud-addon.js +94 -31
- 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 +95 -35
- 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 +93 -33
- package/dist/umd-modern/dexie-cloud-addon.js.map +1 -1
- package/package.json +2 -2
|
@@ -101,7 +101,7 @@ function __spreadArray$1(to, from, pack) {
|
|
|
101
101
|
*
|
|
102
102
|
* ==========================================================================
|
|
103
103
|
*
|
|
104
|
-
* Version 4.0.0-beta.
|
|
104
|
+
* Version 4.0.0-beta.16, Fri Apr 01 2022
|
|
105
105
|
*
|
|
106
106
|
* https://dexie.org
|
|
107
107
|
*
|
|
@@ -5455,7 +5455,7 @@ function performInitialSync(db, cloudOptions, cloudSchema) {
|
|
|
5455
5455
|
});
|
|
5456
5456
|
});
|
|
5457
5457
|
}
|
|
5458
|
-
var USER_INACTIVITY_TIMEOUT =
|
|
5458
|
+
var USER_INACTIVITY_TIMEOUT = 180000; // 3 minutes
|
|
5459
5459
|
var INACTIVE_WAIT_TIME = 20000;
|
|
5460
5460
|
// This observable will be emitted to later down....
|
|
5461
5461
|
var userIsActive = new BehaviorSubject(true);
|
|
@@ -5469,9 +5469,12 @@ var userIsActive = new BehaviorSubject(true);
|
|
|
5469
5469
|
// for just a short time.
|
|
5470
5470
|
var userIsReallyActive = new BehaviorSubject(true);
|
|
5471
5471
|
userIsActive
|
|
5472
|
-
.pipe(switchMap(function (isActive) {
|
|
5473
|
-
|
|
5474
|
-
|
|
5472
|
+
.pipe(switchMap(function (isActive) {
|
|
5473
|
+
//console.debug('SyncStatus: DUBB: isActive changed to', isActive);
|
|
5474
|
+
return isActive
|
|
5475
|
+
? of(true)
|
|
5476
|
+
: of(false).pipe(delay(INACTIVE_WAIT_TIME));
|
|
5477
|
+
}), distinctUntilChanged())
|
|
5475
5478
|
.subscribe(userIsReallyActive);
|
|
5476
5479
|
//
|
|
5477
5480
|
// First create some corner-stone observables to build the flow on
|
|
@@ -5486,7 +5489,7 @@ var documentBecomesHidden = visibilityStateIsChanged.pipe(filter(function () { r
|
|
|
5486
5489
|
var documentBecomesVisible = visibilityStateIsChanged.pipe(filter(function () { return document.visibilityState === 'visible'; }));
|
|
5487
5490
|
// Any of various user-activity-related events happen:
|
|
5488
5491
|
var userDoesSomething = typeof window !== 'undefined'
|
|
5489
|
-
? merge(documentBecomesVisible, fromEvent(window, 'mousemove'), fromEvent(window, 'keydown'), fromEvent(window, 'wheel'), fromEvent(window, 'touchmove'))
|
|
5492
|
+
? merge(documentBecomesVisible, fromEvent(window, 'mousedown'), fromEvent(window, 'mousemove'), fromEvent(window, 'keydown'), fromEvent(window, 'wheel'), fromEvent(window, 'touchmove'))
|
|
5490
5493
|
: of({});
|
|
5491
5494
|
if (typeof document !== 'undefined') {
|
|
5492
5495
|
//
|
|
@@ -5541,6 +5544,7 @@ var WSConnection = /** @class */ (function (_super_1) {
|
|
|
5541
5544
|
function WSConnection(databaseUrl, rev, realmSetHash, clientIdentity, token, tokenExpiration, subscriber, messageProducer, webSocketStatus) {
|
|
5542
5545
|
var _this_1 = _super_1.call(this, function () { return _this_1.teardown(); }) || this;
|
|
5543
5546
|
_this_1.id = ++counter;
|
|
5547
|
+
_this_1.reconnecting = false;
|
|
5544
5548
|
console.debug('New WebSocket Connection', _this_1.id, token ? 'authorized' : 'unauthorized');
|
|
5545
5549
|
_this_1.databaseUrl = databaseUrl;
|
|
5546
5550
|
_this_1.rev = rev;
|
|
@@ -5561,7 +5565,7 @@ var WSConnection = /** @class */ (function (_super_1) {
|
|
|
5561
5565
|
this.disconnect();
|
|
5562
5566
|
};
|
|
5563
5567
|
WSConnection.prototype.disconnect = function () {
|
|
5564
|
-
this.webSocketStatus.next(
|
|
5568
|
+
this.webSocketStatus.next('disconnected');
|
|
5565
5569
|
if (this.pinger) {
|
|
5566
5570
|
clearInterval(this.pinger);
|
|
5567
5571
|
this.pinger = null;
|
|
@@ -5579,17 +5583,25 @@ var WSConnection = /** @class */ (function (_super_1) {
|
|
|
5579
5583
|
}
|
|
5580
5584
|
};
|
|
5581
5585
|
WSConnection.prototype.reconnect = function () {
|
|
5582
|
-
this
|
|
5583
|
-
this.
|
|
5586
|
+
var _this_1 = this;
|
|
5587
|
+
if (this.reconnecting)
|
|
5588
|
+
return;
|
|
5589
|
+
this.reconnecting = true;
|
|
5590
|
+
try {
|
|
5591
|
+
this.disconnect();
|
|
5592
|
+
}
|
|
5593
|
+
catch (_e) { }
|
|
5594
|
+
this.connect()
|
|
5595
|
+
.catch(function () { })
|
|
5596
|
+
.then(function () { return (_this_1.reconnecting = false); }); // finally()
|
|
5584
5597
|
};
|
|
5585
5598
|
WSConnection.prototype.connect = function () {
|
|
5586
5599
|
return __awaiter$1(this, void 0, void 0, function () {
|
|
5587
|
-
var wsUrl, searchParams, ws;
|
|
5600
|
+
var wsUrl, searchParams, ws, everConnected_1;
|
|
5588
5601
|
var _this_1 = this;
|
|
5589
5602
|
return __generator$1(this, function (_e) {
|
|
5590
5603
|
switch (_e.label) {
|
|
5591
5604
|
case 0:
|
|
5592
|
-
this.webSocketStatus.next("connecting");
|
|
5593
5605
|
this.lastServerActivity = new Date();
|
|
5594
5606
|
if (this.pauseUntil && this.pauseUntil > new Date()) {
|
|
5595
5607
|
console.debug('WS not reconnecting just yet', {
|
|
@@ -5604,12 +5616,14 @@ var WSConnection = /** @class */ (function (_super_1) {
|
|
|
5604
5616
|
if (!this.databaseUrl)
|
|
5605
5617
|
throw new Error("Cannot connect without a database URL");
|
|
5606
5618
|
if (this.closed) {
|
|
5619
|
+
//console.debug('SyncStatus: DUBB: Ooops it was closed!');
|
|
5607
5620
|
return [2 /*return*/];
|
|
5608
5621
|
}
|
|
5609
5622
|
if (this.tokenExpiration && this.tokenExpiration < new Date()) {
|
|
5610
5623
|
this.subscriber.error(new TokenExpiredError()); // Will be handled in connectWebSocket.ts.
|
|
5611
5624
|
return [2 /*return*/];
|
|
5612
5625
|
}
|
|
5626
|
+
this.webSocketStatus.next('connecting');
|
|
5613
5627
|
this.pinger = setInterval(function () { return __awaiter$1(_this_1, void 0, void 0, function () {
|
|
5614
5628
|
var _this_1 = this;
|
|
5615
5629
|
return __generator$1(this, function (_e) {
|
|
@@ -5659,7 +5673,7 @@ var WSConnection = /** @class */ (function (_super_1) {
|
|
|
5659
5673
|
searchParams = new URLSearchParams();
|
|
5660
5674
|
if (this.subscriber.closed)
|
|
5661
5675
|
return [2 /*return*/];
|
|
5662
|
-
searchParams.set('v',
|
|
5676
|
+
searchParams.set('v', '2');
|
|
5663
5677
|
searchParams.set('rev', this.rev);
|
|
5664
5678
|
searchParams.set('realmsHash', this.realmSetHash);
|
|
5665
5679
|
searchParams.set('clientId', this.clientIdentity);
|
|
@@ -5700,17 +5714,23 @@ var WSConnection = /** @class */ (function (_super_1) {
|
|
|
5700
5714
|
_e.label = 1;
|
|
5701
5715
|
case 1:
|
|
5702
5716
|
_e.trys.push([1, 3, , 4]);
|
|
5717
|
+
everConnected_1 = false;
|
|
5703
5718
|
return [4 /*yield*/, new Promise(function (resolve, reject) {
|
|
5704
5719
|
ws.onopen = function (event) {
|
|
5705
5720
|
console.debug('dexie-cloud WebSocket onopen');
|
|
5721
|
+
everConnected_1 = true;
|
|
5706
5722
|
resolve(null);
|
|
5707
5723
|
};
|
|
5708
5724
|
ws.onerror = function (event) {
|
|
5709
|
-
|
|
5710
|
-
|
|
5711
|
-
|
|
5712
|
-
|
|
5713
|
-
|
|
5725
|
+
if (!everConnected_1) {
|
|
5726
|
+
var error = event.error || new Error('WebSocket Error');
|
|
5727
|
+
_this_1.subscriber.error(error);
|
|
5728
|
+
_this_1.webSocketStatus.next('error');
|
|
5729
|
+
reject(error);
|
|
5730
|
+
}
|
|
5731
|
+
else {
|
|
5732
|
+
_this_1.reconnect();
|
|
5733
|
+
}
|
|
5714
5734
|
};
|
|
5715
5735
|
})];
|
|
5716
5736
|
case 2:
|
|
@@ -5718,8 +5738,9 @@ var WSConnection = /** @class */ (function (_super_1) {
|
|
|
5718
5738
|
this.messageProducerSubscription = this.messageProducer.subscribe(function (msg) {
|
|
5719
5739
|
var _e;
|
|
5720
5740
|
if (!_this_1.closed) {
|
|
5721
|
-
if (msg.type === 'ready' &&
|
|
5722
|
-
_this_1.webSocketStatus.
|
|
5741
|
+
if (msg.type === 'ready' &&
|
|
5742
|
+
_this_1.webSocketStatus.value !== 'connected') {
|
|
5743
|
+
_this_1.webSocketStatus.next('connected');
|
|
5723
5744
|
}
|
|
5724
5745
|
(_e = _this_1.ws) === null || _e === void 0 ? void 0 : _e.send(TSON.stringify(msg));
|
|
5725
5746
|
}
|
|
@@ -5828,7 +5849,10 @@ function connectWebSocket(db) {
|
|
|
5828
5849
|
else {
|
|
5829
5850
|
return throwError(error);
|
|
5830
5851
|
}
|
|
5831
|
-
}), catchError(function (error) {
|
|
5852
|
+
}), catchError(function (error) {
|
|
5853
|
+
db.cloud.webSocketStatus.next("error");
|
|
5854
|
+
return from$1(waitAndReconnectWhenUserDoesSomething(error)).pipe(switchMap(function () { return createObservable(); }));
|
|
5855
|
+
}));
|
|
5832
5856
|
}
|
|
5833
5857
|
return createObservable().subscribe(function (msg) {
|
|
5834
5858
|
if (msg) {
|
|
@@ -6469,6 +6493,21 @@ function createSharedValueObservable(o, defaultValue) {
|
|
|
6469
6493
|
rv.getValue = function () { return currentValue; };
|
|
6470
6494
|
return rv;
|
|
6471
6495
|
}
|
|
6496
|
+
var getGlobalRolesObservable = associate(function (db) {
|
|
6497
|
+
return createSharedValueObservable(liveQuery(function () { return db.roles
|
|
6498
|
+
.where({ realmId: 'rlm-public' })
|
|
6499
|
+
.toArray()
|
|
6500
|
+
.then(function (roles) {
|
|
6501
|
+
var rv = {};
|
|
6502
|
+
for (var _e = 0, _f = roles
|
|
6503
|
+
.slice()
|
|
6504
|
+
.sort(function (a, b) { return (a.sortOrder || 0) - (b.sortOrder || 0); }); _e < _f.length; _e++) {
|
|
6505
|
+
var role = _f[_e];
|
|
6506
|
+
rv[role.name] = role;
|
|
6507
|
+
}
|
|
6508
|
+
return rv;
|
|
6509
|
+
}); }), {});
|
|
6510
|
+
});
|
|
6472
6511
|
var getCurrentUserEmitter = associate(function (db) { return new BehaviorSubject(UNAUTHORIZED_USER); });
|
|
6473
6512
|
var getInternalAccessControlObservable = associate(function (db) {
|
|
6474
6513
|
return createSharedValueObservable(getCurrentUserEmitter(db._novip).pipe(switchMap(function (currentUser) { return liveQuery(function () { return db.transaction('r', 'realms', 'members', function () { return Promise.all([
|
|
@@ -6571,17 +6610,40 @@ function mergePermissions() {
|
|
|
6571
6610
|
return reduced;
|
|
6572
6611
|
}
|
|
6573
6612
|
var getPermissionsLookupObservable = associate(function (db) {
|
|
6574
|
-
var o =
|
|
6613
|
+
var o = createSharedValueObservable(combineLatest([
|
|
6614
|
+
getInternalAccessControlObservable(db._novip),
|
|
6615
|
+
getGlobalRolesObservable(db._novip),
|
|
6616
|
+
]).pipe(map(function (_e) {
|
|
6617
|
+
var _f = _e[0], selfMembers = _f.selfMembers, realms = _f.realms, userId = _f.userId, globalRoles = _e[1];
|
|
6618
|
+
return ({
|
|
6619
|
+
selfMembers: selfMembers,
|
|
6620
|
+
realms: realms,
|
|
6621
|
+
userId: userId,
|
|
6622
|
+
globalRoles: globalRoles,
|
|
6623
|
+
});
|
|
6624
|
+
})), {
|
|
6625
|
+
selfMembers: [],
|
|
6626
|
+
realms: [],
|
|
6627
|
+
userId: UNAUTHORIZED_USER.userId,
|
|
6628
|
+
globalRoles: {},
|
|
6629
|
+
});
|
|
6575
6630
|
return mapValueObservable(o, function (_e) {
|
|
6576
6631
|
var _f;
|
|
6577
|
-
var selfMembers = _e.selfMembers, realms = _e.realms, userId = _e.userId;
|
|
6632
|
+
var selfMembers = _e.selfMembers, realms = _e.realms, userId = _e.userId, globalRoles = _e.globalRoles;
|
|
6578
6633
|
var rv = realms
|
|
6579
|
-
.map(function (realm) {
|
|
6580
|
-
|
|
6581
|
-
|
|
6582
|
-
|
|
6583
|
-
|
|
6584
|
-
|
|
6634
|
+
.map(function (realm) {
|
|
6635
|
+
var selfRealmMembers = selfMembers.filter(function (m) { return m.realmId === realm.realmId; });
|
|
6636
|
+
var directPermissionSets = selfRealmMembers
|
|
6637
|
+
.map(function (m) { return m.permissions; })
|
|
6638
|
+
.filter(function (p) { return p; });
|
|
6639
|
+
var rolePermissionSets = flatten(selfRealmMembers.map(function (m) { return m.roles; }).filter(function (roleName) { return roleName; }))
|
|
6640
|
+
.map(function (role) { return globalRoles[role]; })
|
|
6641
|
+
.filter(function (role) { return role; })
|
|
6642
|
+
.map(function (role) { return role.permissions; });
|
|
6643
|
+
return __assign(__assign({}, realm), { permissions: realm.owner === userId
|
|
6644
|
+
? { manage: '*' }
|
|
6645
|
+
: mergePermissions.apply(void 0, __spreadArray$1(__spreadArray$1([], directPermissionSets, false), rolePermissionSets, false)) });
|
|
6646
|
+
})
|
|
6585
6647
|
.reduce(function (p, c) {
|
|
6586
6648
|
var _e;
|
|
6587
6649
|
return (__assign(__assign({}, p), (_e = {}, _e[c.realmId] = c, _e)));
|
|
@@ -6679,7 +6741,7 @@ function permissions(dexie, obj, tableName) {
|
|
|
6679
6741
|
var realm = permissionsLookup[realmId || dexie.cloud.currentUserId];
|
|
6680
6742
|
if (!realm)
|
|
6681
6743
|
return new PermissionChecker({}, tableName, !owner || owner === dexie.cloud.currentUserId);
|
|
6682
|
-
return new PermissionChecker(realm.permissions, tableName,
|
|
6744
|
+
return new PermissionChecker(realm.permissions, tableName, realmId === dexie.cloud.currentUserId || owner === dexie.cloud.currentUserId);
|
|
6683
6745
|
};
|
|
6684
6746
|
var o = source.pipe(map(mapper));
|
|
6685
6747
|
o.getValue = function () { return mapper(source.getValue()); };
|
|
@@ -6753,7 +6815,7 @@ function dexieCloud(dexie) {
|
|
|
6753
6815
|
currentUserEmitter.next(UNAUTHORIZED_USER);
|
|
6754
6816
|
});
|
|
6755
6817
|
dexie.cloud = {
|
|
6756
|
-
version: '4.0.0-beta.
|
|
6818
|
+
version: '4.0.0-beta.16',
|
|
6757
6819
|
options: __assign({}, DEFAULT_OPTIONS),
|
|
6758
6820
|
schema: null,
|
|
6759
6821
|
serverState: null,
|
|
@@ -6787,6 +6849,7 @@ function dexieCloud(dexie) {
|
|
|
6787
6849
|
});
|
|
6788
6850
|
},
|
|
6789
6851
|
invites: getInvitesObservable(dexie),
|
|
6852
|
+
roles: getGlobalRolesObservable(dexie),
|
|
6790
6853
|
configure: function (options) {
|
|
6791
6854
|
options = dexie.cloud.options = __assign(__assign({}, dexie.cloud.options), options);
|
|
6792
6855
|
configuredProgramatically = true;
|
|
@@ -7082,7 +7145,7 @@ function dexieCloud(dexie) {
|
|
|
7082
7145
|
});
|
|
7083
7146
|
}
|
|
7084
7147
|
}
|
|
7085
|
-
dexieCloud.version = '4.0.0-beta.
|
|
7148
|
+
dexieCloud.version = '4.0.0-beta.16';
|
|
7086
7149
|
Dexie.Cloud = dexieCloud;
|
|
7087
7150
|
|
|
7088
7151
|
export { dexieCloud as default, dexieCloud, getTiedObjectId, getTiedRealmId };
|