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.
Files changed (43) hide show
  1. package/dist/modern/dexie-cloud-addon.js +96 -36
  2. package/dist/modern/dexie-cloud-addon.js.map +1 -1
  3. package/dist/modern/dexie-cloud-addon.min.js +1 -1
  4. package/dist/modern/dexie-cloud-addon.min.js.map +1 -1
  5. package/dist/modern/service-worker.js +95 -35
  6. package/dist/modern/service-worker.js.map +1 -1
  7. package/dist/modern/service-worker.min.js +1 -1
  8. package/dist/modern/service-worker.min.js.map +1 -1
  9. package/dist/module-es5/dexie-cloud-addon.js +94 -31
  10. package/dist/module-es5/dexie-cloud-addon.js.map +1 -1
  11. package/dist/module-es5/dexie-cloud-addon.min.js +1 -1
  12. package/dist/module-es5/dexie-cloud-addon.min.js.map +1 -1
  13. package/dist/types/DexieCloudAPI.d.ts +4 -1
  14. package/dist/types/DexieCloudEntity.d.ts +8 -0
  15. package/dist/types/WSObservable.d.ts +1 -0
  16. package/dist/types/WebSocketStatus.d.ts +1 -0
  17. package/dist/types/createMyMembersObservable.d.ts +14 -0
  18. package/dist/types/currentUserObservable.d.ts +3 -0
  19. package/dist/types/getGlobalRolesObservable.d.ts +5 -0
  20. package/dist/types/getInvitesObservable.d.ts +1 -1
  21. package/dist/types/helpers/BroadcastedLocalEvent.d.ts +8 -0
  22. package/dist/types/helpers/visibleState.d.ts +1 -0
  23. package/dist/types/permissionsLookup.d.ts +9 -0
  24. package/dist/types/permissionsLookupObservable.d.ts +14 -0
  25. package/dist/types/sync/globalizePrivateIds.d.ts +4 -0
  26. package/dist/types/sync/syncServerToClientOnly.d.ts +3 -0
  27. package/dist/types/types/CloudConnectionStatus.d.ts +0 -0
  28. package/dist/types/types/ConnectionStatus.d.ts +0 -0
  29. package/dist/types/types/LoginState.d.ts +41 -0
  30. package/dist/types/types/SyncConnectionStatus.d.ts +1 -0
  31. package/dist/types/types/SyncFlowStatus.d.ts +6 -0
  32. package/dist/types/types/SyncStatus.d.ts +6 -0
  33. package/dist/umd/dexie-cloud-addon.js +94 -31
  34. package/dist/umd/dexie-cloud-addon.js.map +1 -1
  35. package/dist/umd/dexie-cloud-addon.min.js +1 -1
  36. package/dist/umd/dexie-cloud-addon.min.js.map +1 -1
  37. package/dist/umd/service-worker.js +95 -35
  38. package/dist/umd/service-worker.js.map +1 -1
  39. package/dist/umd/service-worker.min.js +1 -1
  40. package/dist/umd/service-worker.min.js.map +1 -1
  41. package/dist/umd-modern/dexie-cloud-addon.js +93 -33
  42. package/dist/umd-modern/dexie-cloud-addon.js.map +1 -1
  43. 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.15, Mon Dec 20 2021
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 = 300000; // 300_000;
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) { return isActive
5473
- ? of(true)
5474
- : of(false).pipe(delay(INACTIVE_WAIT_TIME)); }), distinctUntilChanged())
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("disconnected");
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.disconnect();
5583
- this.connect();
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', "2");
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
- var error = event.error || new Error('WebSocket Error');
5710
- _this_1.disconnect();
5711
- _this_1.subscriber.error(error);
5712
- _this_1.webSocketStatus.next("error");
5713
- reject(error);
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' && _this_1.webSocketStatus.value !== 'connected') {
5722
- _this_1.webSocketStatus.next("connected");
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) { return from$1(waitAndReconnectWhenUserDoesSomething(error)).pipe(switchMap(function () { return createObservable(); })); }));
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 = getInternalAccessControlObservable(db._novip);
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) { return (__assign(__assign({}, realm), { permissions: realm.owner === userId
6580
- ? { manage: '*' }
6581
- : mergePermissions.apply(void 0, selfMembers
6582
- .filter(function (m) { return m.realmId === realm.realmId; })
6583
- .map(function (m) { return m.permissions; })
6584
- .filter(function (p) { return p; })) })); })
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, !owner || owner === dexie.cloud.currentUserId);
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.15',
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.15';
7148
+ dexieCloud.version = '4.0.0-beta.16';
7086
7149
  Dexie.Cloud = dexieCloud;
7087
7150
 
7088
7151
  export { dexieCloud as default, dexieCloud, getTiedObjectId, getTiedRealmId };