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
@@ -1,5 +1,5 @@
1
1
  import { DexieCloudOptions } from './DexieCloudOptions';
2
- import { DexieCloudSchema } from 'dexie-cloud-common';
2
+ import { DBRealmRole, DexieCloudSchema } from 'dexie-cloud-common';
3
3
  import { UserLogin } from './db/entities/UserLogin';
4
4
  import * as Rx from 'rxjs';
5
5
  import { PersistedSyncState } from './db/entities/PersistedSyncState';
@@ -22,6 +22,9 @@ export interface DexieCloudAPI {
22
22
  persistedSyncState: Rx.BehaviorSubject<PersistedSyncState | undefined>;
23
23
  userInteraction: Rx.BehaviorSubject<DXCUserInteraction | undefined>;
24
24
  invites: Rx.Observable<Invite[]>;
25
+ roles: Rx.Observable<{
26
+ [roleName: string]: DBRealmRole;
27
+ }>;
25
28
  usingServiceWorker?: boolean;
26
29
  /** Login using Dexie Cloud OTP or Demo user.
27
30
  *
@@ -0,0 +1,8 @@
1
+ import Dexie, { Entity, IndexableType, OwnClonableProperties, TableProp } from 'dexie';
2
+ export declare class DexieCloudEntity<DexieSubClass extends Dexie = Dexie> extends Entity<DexieSubClass> {
3
+ realmId: string;
4
+ owner: string;
5
+ can(...args: [verb: 'add', table: TableProp<DexieSubClass> | string] | [verb: 'update', ...fields: (keyof OwnClonableProperties<this>)[]] | [verb: 'delete']): boolean;
6
+ $id(): IndexableType;
7
+ isRealm(): boolean;
8
+ }
@@ -61,6 +61,7 @@ export declare class WSConnection extends Subscription {
61
61
  constructor(databaseUrl: string, rev: string, realmSetHash: string, clientIdentity: string, token: string | undefined, tokenExpiration: Date | undefined, subscriber: Subscriber<WSConnectionMsg>, messageProducer: Observable<WSClientToServerMsg>, webSocketStatus: BehaviorSubject<DXCWebSocketStatus>);
62
62
  private teardown;
63
63
  private disconnect;
64
+ reconnecting: boolean;
64
65
  reconnect(): void;
65
66
  connect(): Promise<void>;
66
67
  }
@@ -0,0 +1 @@
1
+ export declare type WebSocketStatus = "not-started" | "connecting" | "connected" | "error" | "asleep";
@@ -0,0 +1,14 @@
1
+ import Dexie from 'dexie';
2
+ import { DBPermissionSet, DBRealm, DBRealmMember } from 'dexie-cloud-common';
3
+ import { Observable } from 'rxjs';
4
+ import { UserLogin } from './db/entities/UserLogin';
5
+ export declare function createMyMembersObservable(db: Dexie, currentUserObservable: Observable<UserLogin>): Observable<{
6
+ invites: Array<DBRealmMember & {
7
+ realm: DBRealm;
8
+ }>;
9
+ permissions: {
10
+ [realmId: string]: DBRealm & {
11
+ permissions: DBPermissionSet;
12
+ };
13
+ };
14
+ }>;
@@ -0,0 +1,3 @@
1
+ import Dexie from "dexie";
2
+ import { BehaviorSubject } from "rxjs";
3
+ export declare const currentUserEmitter: (x: Dexie) => BehaviorSubject<import("./db/entities/UserLogin").UserLogin>;
@@ -0,0 +1,5 @@
1
+ import Dexie from 'dexie';
2
+ import { DBRealmRole } from 'dexie-cloud-common';
3
+ export declare const getGlobalRolesObservable: (x: Dexie) => import("./mapValueObservable").ObservableWithCurrentValue<{
4
+ [roleName: string]: DBRealmRole;
5
+ }>;
@@ -4,7 +4,7 @@ export declare const getInvitesObservable: (x: Dexie) => import("./mapValueObser
4
4
  realm: import("dexie-cloud-common").DBRealm & {
5
5
  permissions: import("dexie-cloud-common").DBPermissionSet;
6
6
  };
7
- id?: string | undefined;
7
+ id: string;
8
8
  userId?: string | undefined;
9
9
  email?: string | undefined;
10
10
  name?: string | undefined;
@@ -0,0 +1,8 @@
1
+ import { Observable } from "rxjs";
2
+ import { SWBroadcastChannel } from "./SWBroadcastChannel";
3
+ export declare class BroadcastedAndLocalEvent<T> extends Observable<T> {
4
+ name: string;
5
+ bc: BroadcastChannel | SWBroadcastChannel;
6
+ constructor(name: string);
7
+ next(message: T): void;
8
+ }
@@ -0,0 +1 @@
1
+ export declare function getVisibilityStateObservable(): import("rxjs").Observable<VisibilityState>;
@@ -0,0 +1,9 @@
1
+ import Dexie from 'dexie';
2
+ import { DBPermissionSet, DBRealm } from 'dexie-cloud-common';
3
+ import { Observable } from 'rxjs';
4
+ export declare type PermissionsLookupObservable = Observable<{
5
+ [realmId: string]: DBRealm & {
6
+ permissions: DBPermissionSet;
7
+ };
8
+ }>;
9
+ export declare const getPermissionsLookupObservable: (x: Dexie) => PermissionsLookupObservable;
@@ -0,0 +1,14 @@
1
+ import Dexie from 'dexie';
2
+ import { DBPermissionSet, DBRealm, DBRealmMember } from 'dexie-cloud-common';
3
+ import { Observable } from 'rxjs';
4
+ import { UserLogin } from './db/entities/UserLogin';
5
+ export declare function createMyMembersObservable(db: Dexie, currentUserObservable: Observable<UserLogin>): Observable<{
6
+ invites: Array<DBRealmMember & {
7
+ realm: DBRealm;
8
+ }>;
9
+ permissions: {
10
+ [realmId: string]: DBRealm & {
11
+ permissions: DBPermissionSet;
12
+ };
13
+ };
14
+ }>;
@@ -0,0 +1,4 @@
1
+ import { DBCoreSchema } from 'dexie';
2
+ import { DBOperationsSet } from 'dexie-cloud-common';
3
+ import { UserLogin } from '../db/entities/UserLogin';
4
+ export declare function encodePrimaryKeys(schema: DBCoreSchema, currentUser: UserLogin, changes: DBOperationsSet): DBOperationsSet;
@@ -0,0 +1,3 @@
1
+ import { DexieCloudDB } from '../db/DexieCloudDB';
2
+ import { ChangesFromServerMessage } from '../WSObservable';
3
+ export declare function syncServerToClientOnly(db: DexieCloudDB, { baseRev, newRev, changes, realmSetHash }: ChangesFromServerMessage): import("rxjs").Observable<void>;
File without changes
File without changes
@@ -0,0 +1,41 @@
1
+ export declare type LoginState = LoginStateSilent | LoginStateInteraction | LoginStateError;
2
+ export interface LoginStateSilent {
3
+ type: 'silent';
4
+ }
5
+ export declare type LoginStateInteraction = (Alert | EmailRequested | OTPRequested) & {
6
+ type: 'interaction';
7
+ alerts?: {
8
+ type: 'error' | 'warning' | 'info';
9
+ message: string;
10
+ }[];
11
+ isWorking?: boolean;
12
+ onSubmit: (params: LoginPromptReply) => void;
13
+ onCancel: () => void;
14
+ };
15
+ export declare type LoginPromptReply = {
16
+ email?: string;
17
+ otp?: string;
18
+ name?: string;
19
+ };
20
+ export interface LoginStateError {
21
+ type: 'error';
22
+ message: string;
23
+ }
24
+ interface Alert {
25
+ interactionType: 'alert';
26
+ alerts: {
27
+ type: 'error' | 'warning' | 'info';
28
+ message: string;
29
+ }[];
30
+ submitText: 'OK';
31
+ }
32
+ interface EmailRequested {
33
+ interactionType: 'emailRequested';
34
+ submitText: 'Send OTP';
35
+ }
36
+ interface OTPRequested {
37
+ interactionType: 'otpRequested';
38
+ isWorking: boolean;
39
+ submitText: 'Login';
40
+ }
41
+ export {};
@@ -0,0 +1 @@
1
+ export declare type SyncConnectionStatus = "not-started" | "connecting" | "connected" | "disconnected" | "error" | "offline";
@@ -0,0 +1,6 @@
1
+ export declare type SyncPhase = "initial" | "not-in-sync" | "pushing" | "pulling" | "in-sync" | 'error' | 'offline';
2
+ export interface SyncFlowStatus {
3
+ phase: SyncPhase;
4
+ progress?: number;
5
+ error?: Error;
6
+ }
@@ -0,0 +1,6 @@
1
+ export declare type SyncPhase = "initial" | "not-in-sync" | "pushing" | "pulling" | "in-sync" | 'error' | 'offline';
2
+ export interface SyncStatus {
3
+ phase: SyncPhase;
4
+ progress?: number;
5
+ error?: Error;
6
+ }
@@ -108,7 +108,7 @@
108
108
  *
109
109
  * ==========================================================================
110
110
  *
111
- * Version 4.0.0-beta.15, Mon Dec 20 2021
111
+ * Version 4.0.0-beta.16, Fri Apr 01 2022
112
112
  *
113
113
  * https://dexie.org
114
114
  *
@@ -5462,7 +5462,7 @@
5462
5462
  });
5463
5463
  });
5464
5464
  }
5465
- var USER_INACTIVITY_TIMEOUT = 300000; // 300_000;
5465
+ var USER_INACTIVITY_TIMEOUT = 180000; // 3 minutes
5466
5466
  var INACTIVE_WAIT_TIME = 20000;
5467
5467
  // This observable will be emitted to later down....
5468
5468
  var userIsActive = new rxjs.BehaviorSubject(true);
@@ -5476,9 +5476,12 @@
5476
5476
  // for just a short time.
5477
5477
  var userIsReallyActive = new rxjs.BehaviorSubject(true);
5478
5478
  userIsActive
5479
- .pipe(switchMap(function (isActive) { return isActive
5480
- ? rxjs.of(true)
5481
- : rxjs.of(false).pipe(delay(INACTIVE_WAIT_TIME)); }), distinctUntilChanged())
5479
+ .pipe(switchMap(function (isActive) {
5480
+ //console.debug('SyncStatus: DUBB: isActive changed to', isActive);
5481
+ return isActive
5482
+ ? rxjs.of(true)
5483
+ : rxjs.of(false).pipe(delay(INACTIVE_WAIT_TIME));
5484
+ }), distinctUntilChanged())
5482
5485
  .subscribe(userIsReallyActive);
5483
5486
  //
5484
5487
  // First create some corner-stone observables to build the flow on
@@ -5493,7 +5496,7 @@
5493
5496
  var documentBecomesVisible = visibilityStateIsChanged.pipe(filter(function () { return document.visibilityState === 'visible'; }));
5494
5497
  // Any of various user-activity-related events happen:
5495
5498
  var userDoesSomething = typeof window !== 'undefined'
5496
- ? rxjs.merge(documentBecomesVisible, rxjs.fromEvent(window, 'mousemove'), rxjs.fromEvent(window, 'keydown'), rxjs.fromEvent(window, 'wheel'), rxjs.fromEvent(window, 'touchmove'))
5499
+ ? rxjs.merge(documentBecomesVisible, rxjs.fromEvent(window, 'mousedown'), rxjs.fromEvent(window, 'mousemove'), rxjs.fromEvent(window, 'keydown'), rxjs.fromEvent(window, 'wheel'), rxjs.fromEvent(window, 'touchmove'))
5497
5500
  : rxjs.of({});
5498
5501
  if (typeof document !== 'undefined') {
5499
5502
  //
@@ -5548,6 +5551,7 @@
5548
5551
  function WSConnection(databaseUrl, rev, realmSetHash, clientIdentity, token, tokenExpiration, subscriber, messageProducer, webSocketStatus) {
5549
5552
  var _this_1 = _super_1.call(this, function () { return _this_1.teardown(); }) || this;
5550
5553
  _this_1.id = ++counter;
5554
+ _this_1.reconnecting = false;
5551
5555
  console.debug('New WebSocket Connection', _this_1.id, token ? 'authorized' : 'unauthorized');
5552
5556
  _this_1.databaseUrl = databaseUrl;
5553
5557
  _this_1.rev = rev;
@@ -5568,7 +5572,7 @@
5568
5572
  this.disconnect();
5569
5573
  };
5570
5574
  WSConnection.prototype.disconnect = function () {
5571
- this.webSocketStatus.next("disconnected");
5575
+ this.webSocketStatus.next('disconnected');
5572
5576
  if (this.pinger) {
5573
5577
  clearInterval(this.pinger);
5574
5578
  this.pinger = null;
@@ -5586,17 +5590,25 @@
5586
5590
  }
5587
5591
  };
5588
5592
  WSConnection.prototype.reconnect = function () {
5589
- this.disconnect();
5590
- this.connect();
5593
+ var _this_1 = this;
5594
+ if (this.reconnecting)
5595
+ return;
5596
+ this.reconnecting = true;
5597
+ try {
5598
+ this.disconnect();
5599
+ }
5600
+ catch (_e) { }
5601
+ this.connect()
5602
+ .catch(function () { })
5603
+ .then(function () { return (_this_1.reconnecting = false); }); // finally()
5591
5604
  };
5592
5605
  WSConnection.prototype.connect = function () {
5593
5606
  return __awaiter$1(this, void 0, void 0, function () {
5594
- var wsUrl, searchParams, ws;
5607
+ var wsUrl, searchParams, ws, everConnected_1;
5595
5608
  var _this_1 = this;
5596
5609
  return __generator$1(this, function (_e) {
5597
5610
  switch (_e.label) {
5598
5611
  case 0:
5599
- this.webSocketStatus.next("connecting");
5600
5612
  this.lastServerActivity = new Date();
5601
5613
  if (this.pauseUntil && this.pauseUntil > new Date()) {
5602
5614
  console.debug('WS not reconnecting just yet', {
@@ -5611,12 +5623,14 @@
5611
5623
  if (!this.databaseUrl)
5612
5624
  throw new Error("Cannot connect without a database URL");
5613
5625
  if (this.closed) {
5626
+ //console.debug('SyncStatus: DUBB: Ooops it was closed!');
5614
5627
  return [2 /*return*/];
5615
5628
  }
5616
5629
  if (this.tokenExpiration && this.tokenExpiration < new Date()) {
5617
5630
  this.subscriber.error(new TokenExpiredError()); // Will be handled in connectWebSocket.ts.
5618
5631
  return [2 /*return*/];
5619
5632
  }
5633
+ this.webSocketStatus.next('connecting');
5620
5634
  this.pinger = setInterval(function () { return __awaiter$1(_this_1, void 0, void 0, function () {
5621
5635
  var _this_1 = this;
5622
5636
  return __generator$1(this, function (_e) {
@@ -5666,7 +5680,7 @@
5666
5680
  searchParams = new URLSearchParams();
5667
5681
  if (this.subscriber.closed)
5668
5682
  return [2 /*return*/];
5669
- searchParams.set('v', "2");
5683
+ searchParams.set('v', '2');
5670
5684
  searchParams.set('rev', this.rev);
5671
5685
  searchParams.set('realmsHash', this.realmSetHash);
5672
5686
  searchParams.set('clientId', this.clientIdentity);
@@ -5707,17 +5721,23 @@
5707
5721
  _e.label = 1;
5708
5722
  case 1:
5709
5723
  _e.trys.push([1, 3, , 4]);
5724
+ everConnected_1 = false;
5710
5725
  return [4 /*yield*/, new Promise(function (resolve, reject) {
5711
5726
  ws.onopen = function (event) {
5712
5727
  console.debug('dexie-cloud WebSocket onopen');
5728
+ everConnected_1 = true;
5713
5729
  resolve(null);
5714
5730
  };
5715
5731
  ws.onerror = function (event) {
5716
- var error = event.error || new Error('WebSocket Error');
5717
- _this_1.disconnect();
5718
- _this_1.subscriber.error(error);
5719
- _this_1.webSocketStatus.next("error");
5720
- reject(error);
5732
+ if (!everConnected_1) {
5733
+ var error = event.error || new Error('WebSocket Error');
5734
+ _this_1.subscriber.error(error);
5735
+ _this_1.webSocketStatus.next('error');
5736
+ reject(error);
5737
+ }
5738
+ else {
5739
+ _this_1.reconnect();
5740
+ }
5721
5741
  };
5722
5742
  })];
5723
5743
  case 2:
@@ -5725,8 +5745,9 @@
5725
5745
  this.messageProducerSubscription = this.messageProducer.subscribe(function (msg) {
5726
5746
  var _e;
5727
5747
  if (!_this_1.closed) {
5728
- if (msg.type === 'ready' && _this_1.webSocketStatus.value !== 'connected') {
5729
- _this_1.webSocketStatus.next("connected");
5748
+ if (msg.type === 'ready' &&
5749
+ _this_1.webSocketStatus.value !== 'connected') {
5750
+ _this_1.webSocketStatus.next('connected');
5730
5751
  }
5731
5752
  (_e = _this_1.ws) === null || _e === void 0 ? void 0 : _e.send(TSON.stringify(msg));
5732
5753
  }
@@ -5835,7 +5856,10 @@
5835
5856
  else {
5836
5857
  return rxjs.throwError(error);
5837
5858
  }
5838
- }), catchError(function (error) { return rxjs.from(waitAndReconnectWhenUserDoesSomething(error)).pipe(switchMap(function () { return createObservable(); })); }));
5859
+ }), catchError(function (error) {
5860
+ db.cloud.webSocketStatus.next("error");
5861
+ return rxjs.from(waitAndReconnectWhenUserDoesSomething(error)).pipe(switchMap(function () { return createObservable(); }));
5862
+ }));
5839
5863
  }
5840
5864
  return createObservable().subscribe(function (msg) {
5841
5865
  if (msg) {
@@ -6476,6 +6500,21 @@
6476
6500
  rv.getValue = function () { return currentValue; };
6477
6501
  return rv;
6478
6502
  }
6503
+ var getGlobalRolesObservable = associate(function (db) {
6504
+ return createSharedValueObservable(Dexie.liveQuery(function () { return db.roles
6505
+ .where({ realmId: 'rlm-public' })
6506
+ .toArray()
6507
+ .then(function (roles) {
6508
+ var rv = {};
6509
+ for (var _e = 0, _f = roles
6510
+ .slice()
6511
+ .sort(function (a, b) { return (a.sortOrder || 0) - (b.sortOrder || 0); }); _e < _f.length; _e++) {
6512
+ var role = _f[_e];
6513
+ rv[role.name] = role;
6514
+ }
6515
+ return rv;
6516
+ }); }), {});
6517
+ });
6479
6518
  var getCurrentUserEmitter = associate(function (db) { return new rxjs.BehaviorSubject(UNAUTHORIZED_USER); });
6480
6519
  var getInternalAccessControlObservable = associate(function (db) {
6481
6520
  return createSharedValueObservable(getCurrentUserEmitter(db._novip).pipe(switchMap(function (currentUser) { return Dexie.liveQuery(function () { return db.transaction('r', 'realms', 'members', function () { return Promise.all([
@@ -6578,17 +6617,40 @@
6578
6617
  return reduced;
6579
6618
  }
6580
6619
  var getPermissionsLookupObservable = associate(function (db) {
6581
- var o = getInternalAccessControlObservable(db._novip);
6620
+ var o = createSharedValueObservable(rxjs.combineLatest([
6621
+ getInternalAccessControlObservable(db._novip),
6622
+ getGlobalRolesObservable(db._novip),
6623
+ ]).pipe(map(function (_e) {
6624
+ var _f = _e[0], selfMembers = _f.selfMembers, realms = _f.realms, userId = _f.userId, globalRoles = _e[1];
6625
+ return ({
6626
+ selfMembers: selfMembers,
6627
+ realms: realms,
6628
+ userId: userId,
6629
+ globalRoles: globalRoles,
6630
+ });
6631
+ })), {
6632
+ selfMembers: [],
6633
+ realms: [],
6634
+ userId: UNAUTHORIZED_USER.userId,
6635
+ globalRoles: {},
6636
+ });
6582
6637
  return mapValueObservable(o, function (_e) {
6583
6638
  var _f;
6584
- var selfMembers = _e.selfMembers, realms = _e.realms, userId = _e.userId;
6639
+ var selfMembers = _e.selfMembers, realms = _e.realms, userId = _e.userId, globalRoles = _e.globalRoles;
6585
6640
  var rv = realms
6586
- .map(function (realm) { return (__assign(__assign({}, realm), { permissions: realm.owner === userId
6587
- ? { manage: '*' }
6588
- : mergePermissions.apply(void 0, selfMembers
6589
- .filter(function (m) { return m.realmId === realm.realmId; })
6590
- .map(function (m) { return m.permissions; })
6591
- .filter(function (p) { return p; })) })); })
6641
+ .map(function (realm) {
6642
+ var selfRealmMembers = selfMembers.filter(function (m) { return m.realmId === realm.realmId; });
6643
+ var directPermissionSets = selfRealmMembers
6644
+ .map(function (m) { return m.permissions; })
6645
+ .filter(function (p) { return p; });
6646
+ var rolePermissionSets = flatten(selfRealmMembers.map(function (m) { return m.roles; }).filter(function (roleName) { return roleName; }))
6647
+ .map(function (role) { return globalRoles[role]; })
6648
+ .filter(function (role) { return role; })
6649
+ .map(function (role) { return role.permissions; });
6650
+ return __assign(__assign({}, realm), { permissions: realm.owner === userId
6651
+ ? { manage: '*' }
6652
+ : mergePermissions.apply(void 0, __spreadArray$1(__spreadArray$1([], directPermissionSets, false), rolePermissionSets, false)) });
6653
+ })
6592
6654
  .reduce(function (p, c) {
6593
6655
  var _e;
6594
6656
  return (__assign(__assign({}, p), (_e = {}, _e[c.realmId] = c, _e)));
@@ -6686,7 +6748,7 @@
6686
6748
  var realm = permissionsLookup[realmId || dexie.cloud.currentUserId];
6687
6749
  if (!realm)
6688
6750
  return new PermissionChecker({}, tableName, !owner || owner === dexie.cloud.currentUserId);
6689
- return new PermissionChecker(realm.permissions, tableName, !owner || owner === dexie.cloud.currentUserId);
6751
+ return new PermissionChecker(realm.permissions, tableName, realmId === dexie.cloud.currentUserId || owner === dexie.cloud.currentUserId);
6690
6752
  };
6691
6753
  var o = source.pipe(map(mapper));
6692
6754
  o.getValue = function () { return mapper(source.getValue()); };
@@ -6760,7 +6822,7 @@
6760
6822
  currentUserEmitter.next(UNAUTHORIZED_USER);
6761
6823
  });
6762
6824
  dexie.cloud = {
6763
- version: '4.0.0-beta.15',
6825
+ version: '4.0.0-beta.16',
6764
6826
  options: __assign({}, DEFAULT_OPTIONS),
6765
6827
  schema: null,
6766
6828
  serverState: null,
@@ -6794,6 +6856,7 @@
6794
6856
  });
6795
6857
  },
6796
6858
  invites: getInvitesObservable(dexie),
6859
+ roles: getGlobalRolesObservable(dexie),
6797
6860
  configure: function (options) {
6798
6861
  options = dexie.cloud.options = __assign(__assign({}, dexie.cloud.options), options);
6799
6862
  configuredProgramatically = true;
@@ -7089,7 +7152,7 @@
7089
7152
  });
7090
7153
  }
7091
7154
  }
7092
- dexieCloud.version = '4.0.0-beta.15';
7155
+ dexieCloud.version = '4.0.0-beta.16';
7093
7156
  Dexie__default["default"].Cloud = dexieCloud;
7094
7157
 
7095
7158
  exports["default"] = dexieCloud;