dexie-cloud-addon 4.1.0-beta.48 → 4.2.0-alpha.1
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/define-ydoc-trigger.d.ts +2 -1
- package/dist/modern/dexie-cloud-addon.js +11098 -331
- 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 +10998 -231
- 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/modern/yjs/YDexieCloudSyncState.d.ts +1 -1
- package/dist/modern/yjs/YTable.d.ts +2 -1
- package/dist/modern/yjs/createYHandler.d.ts +1 -4
- package/dist/modern/yjs/importDexieYProvider.d.ts +1 -0
- package/dist/modern/yjs/listUpdatesSince.d.ts +2 -1
- package/dist/modern/yjs/reopenDocSignal.d.ts +1 -1
- package/dist/umd/define-ydoc-trigger.d.ts +2 -1
- package/dist/umd/dexie-cloud-addon.js +11097 -330
- 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 +11100 -333
- 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/yjs/YDexieCloudSyncState.d.ts +1 -1
- package/dist/umd/yjs/YTable.d.ts +2 -1
- package/dist/umd/yjs/createYHandler.d.ts +1 -4
- package/dist/umd/yjs/importDexieYProvider.d.ts +1 -0
- package/dist/umd/yjs/listUpdatesSince.d.ts +2 -1
- package/dist/umd/yjs/reopenDocSignal.d.ts +1 -1
- package/package.json +7 -3
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"service-worker.min.js","sources":["../../../../node_modules/.pnpm/@rollup+plugin-typescript@11.1.5_rollup@4.1.4_tslib@2.4.0_typescript@5.6.3/node_modules/tslib/tslib.es6.js","../../src/authentication/UNAUTHORIZED_USER.ts","../../src/helpers/SWBroadcastChannel.ts","../../src/helpers/BroadcastedAndLocalEvent.ts","../../../../node_modules/.pnpm/rxjs@7.5.6/node_modules/rxjs/dist/esm5/internal/util/isFunction.js","../../../../node_modules/.pnpm/rxjs@7.5.6/node_modules/rxjs/dist/esm5/internal/util/lift.js","../../../../node_modules/.pnpm/rxjs@7.5.6/node_modules/rxjs/dist/esm5/internal/util/isArrayLike.js","../../../../node_modules/.pnpm/rxjs@7.5.6/node_modules/rxjs/dist/esm5/internal/util/isPromise.js","../../../../node_modules/.pnpm/rxjs@7.5.6/node_modules/rxjs/dist/esm5/internal/util/UnsubscriptionError.js","../../../../node_modules/.pnpm/rxjs@7.5.6/node_modules/rxjs/dist/esm5/internal/util/createErrorClass.js","../../../../node_modules/.pnpm/rxjs@7.5.6/node_modules/rxjs/dist/esm5/internal/util/arrRemove.js","../../../../node_modules/.pnpm/rxjs@7.5.6/node_modules/rxjs/dist/esm5/internal/Subscription.js","../../../../node_modules/.pnpm/rxjs@7.5.6/node_modules/rxjs/dist/esm5/internal/config.js","../../../../node_modules/.pnpm/rxjs@7.5.6/node_modules/rxjs/dist/esm5/internal/scheduler/timeoutProvider.js","../../../../node_modules/.pnpm/rxjs@7.5.6/node_modules/rxjs/dist/esm5/internal/util/reportUnhandledError.js","../../../../node_modules/.pnpm/rxjs@7.5.6/node_modules/rxjs/dist/esm5/internal/util/noop.js","../../../../node_modules/.pnpm/rxjs@7.5.6/node_modules/rxjs/dist/esm5/internal/Subscriber.js","../../../../node_modules/.pnpm/rxjs@7.5.6/node_modules/rxjs/dist/esm5/internal/symbol/observable.js","../../../../node_modules/.pnpm/rxjs@7.5.6/node_modules/rxjs/dist/esm5/internal/util/identity.js","../../../../node_modules/.pnpm/rxjs@7.5.6/node_modules/rxjs/dist/esm5/internal/Observable.js","../../../../node_modules/.pnpm/rxjs@7.5.6/node_modules/rxjs/dist/esm5/internal/util/errorContext.js","../../../../node_modules/.pnpm/rxjs@7.5.6/node_modules/rxjs/dist/esm5/internal/util/pipe.js","../../../../node_modules/.pnpm/rxjs@7.5.6/node_modules/rxjs/dist/esm5/internal/util/isInteropObservable.js","../../../../node_modules/.pnpm/rxjs@7.5.6/node_modules/rxjs/dist/esm5/internal/util/isAsyncIterable.js","../../../../node_modules/.pnpm/rxjs@7.5.6/node_modules/rxjs/dist/esm5/internal/util/throwUnobservableError.js","../../../../node_modules/.pnpm/rxjs@7.5.6/node_modules/rxjs/dist/esm5/internal/symbol/iterator.js","../../../../node_modules/.pnpm/rxjs@7.5.6/node_modules/rxjs/dist/esm5/internal/util/isIterable.js","../../../../node_modules/.pnpm/rxjs@7.5.6/node_modules/rxjs/dist/esm5/internal/util/isReadableStreamLike.js","../../../../node_modules/.pnpm/rxjs@7.5.6/node_modules/rxjs/dist/esm5/internal/observable/innerFrom.js","../../../../node_modules/.pnpm/rxjs@7.5.6/node_modules/rxjs/dist/esm5/internal/operators/OperatorSubscriber.js","../../../../node_modules/.pnpm/rxjs@7.5.6/node_modules/rxjs/dist/esm5/internal/scheduler/Action.js","../../../../node_modules/.pnpm/rxjs@7.5.6/node_modules/rxjs/dist/esm5/internal/scheduler/intervalProvider.js","../../../../node_modules/.pnpm/rxjs@7.5.6/node_modules/rxjs/dist/esm5/internal/scheduler/AsyncAction.js","../../../../node_modules/.pnpm/rxjs@7.5.6/node_modules/rxjs/dist/esm5/internal/scheduler/dateTimestampProvider.js","../../../../node_modules/.pnpm/rxjs@7.5.6/node_modules/rxjs/dist/esm5/internal/Scheduler.js","../../../../node_modules/.pnpm/rxjs@7.5.6/node_modules/rxjs/dist/esm5/internal/scheduler/async.js","../../../../node_modules/.pnpm/rxjs@7.5.6/node_modules/rxjs/dist/esm5/internal/scheduler/AsyncScheduler.js","../../../../node_modules/.pnpm/rxjs@7.5.6/node_modules/rxjs/dist/esm5/internal/util/isScheduler.js","../../../../node_modules/.pnpm/rxjs@7.5.6/node_modules/rxjs/dist/esm5/internal/observable/timer.js","../../../../node_modules/.pnpm/rxjs@7.5.6/node_modules/rxjs/dist/esm5/internal/util/isDate.js","../../../../node_modules/.pnpm/rxjs@7.5.6/node_modules/rxjs/dist/esm5/internal/util/args.js","../../../../node_modules/.pnpm/rxjs@7.5.6/node_modules/rxjs/dist/esm5/internal/util/executeSchedule.js","../../../../node_modules/.pnpm/rxjs@7.5.6/node_modules/rxjs/dist/esm5/internal/operators/catchError.js","../../../../node_modules/.pnpm/rxjs@7.5.6/node_modules/rxjs/dist/esm5/internal/operators/observeOn.js","../../../../node_modules/.pnpm/rxjs@7.5.6/node_modules/rxjs/dist/esm5/internal/operators/subscribeOn.js","../../../../node_modules/.pnpm/rxjs@7.5.6/node_modules/rxjs/dist/esm5/internal/scheduled/scheduleAsyncIterable.js","../../../../node_modules/.pnpm/rxjs@7.5.6/node_modules/rxjs/dist/esm5/internal/scheduled/scheduled.js","../../../../node_modules/.pnpm/rxjs@7.5.6/node_modules/rxjs/dist/esm5/internal/scheduled/scheduleObservable.js","../../../../node_modules/.pnpm/rxjs@7.5.6/node_modules/rxjs/dist/esm5/internal/scheduled/scheduleArray.js","../../../../node_modules/.pnpm/rxjs@7.5.6/node_modules/rxjs/dist/esm5/internal/scheduled/schedulePromise.js","../../../../node_modules/.pnpm/rxjs@7.5.6/node_modules/rxjs/dist/esm5/internal/scheduled/scheduleIterable.js","../../../../node_modules/.pnpm/rxjs@7.5.6/node_modules/rxjs/dist/esm5/internal/scheduled/scheduleReadableStreamLike.js","../../../../node_modules/.pnpm/rxjs@7.5.6/node_modules/rxjs/dist/esm5/internal/operators/map.js","../../../../node_modules/.pnpm/rxjs@7.5.6/node_modules/rxjs/dist/esm5/internal/operators/mergeMap.js","../../../../node_modules/.pnpm/rxjs@7.5.6/node_modules/rxjs/dist/esm5/internal/operators/mergeInternals.js","../../../../node_modules/.pnpm/rxjs@7.5.6/node_modules/rxjs/dist/esm5/internal/operators/concatAll.js","../../../../node_modules/.pnpm/rxjs@7.5.6/node_modules/rxjs/dist/esm5/internal/operators/mergeAll.js","../../../../node_modules/.pnpm/rxjs@7.5.6/node_modules/rxjs/dist/esm5/internal/operators/debounceTime.js","../../../../node_modules/.pnpm/rxjs@7.5.6/node_modules/rxjs/dist/esm5/internal/observable/concat.js","../../../../node_modules/.pnpm/rxjs@7.5.6/node_modules/rxjs/dist/esm5/internal/observable/from.js","../../../../node_modules/.pnpm/rxjs@7.5.6/node_modules/rxjs/dist/esm5/internal/observable/empty.js","../../../../node_modules/.pnpm/rxjs@7.5.6/node_modules/rxjs/dist/esm5/internal/operators/take.js","../../../../node_modules/.pnpm/rxjs@7.5.6/node_modules/rxjs/dist/esm5/internal/operators/delayWhen.js","../../../../node_modules/.pnpm/rxjs@7.5.6/node_modules/rxjs/dist/esm5/internal/operators/ignoreElements.js","../../../../node_modules/.pnpm/rxjs@7.5.6/node_modules/rxjs/dist/esm5/internal/operators/mapTo.js","../../../../node_modules/.pnpm/rxjs@7.5.6/node_modules/rxjs/dist/esm5/internal/operators/delay.js","../../../../node_modules/.pnpm/rxjs@7.5.6/node_modules/rxjs/dist/esm5/internal/operators/distinctUntilChanged.js","../../../../node_modules/.pnpm/rxjs@7.5.6/node_modules/rxjs/dist/esm5/internal/operators/filter.js","../../../../node_modules/.pnpm/rxjs@7.5.6/node_modules/rxjs/dist/esm5/internal/operators/skip.js","../../../../node_modules/.pnpm/rxjs@7.5.6/node_modules/rxjs/dist/esm5/internal/operators/startWith.js","../../../../node_modules/.pnpm/rxjs@7.5.6/node_modules/rxjs/dist/esm5/internal/operators/switchMap.js","../../../../node_modules/.pnpm/rxjs@7.5.6/node_modules/rxjs/dist/esm5/internal/operators/tap.js","../../src/sync/registerSyncEvent.ts","../../src/sync/triggerSync.ts","../../../../node_modules/.pnpm/dreambase-library@1.0.26/node_modules/dreambase-library/dist/common/base64.js","../../src/helpers/computeRealmSetHash.ts","../../src/helpers/getSyncableTables.ts","../../src/helpers/getMutationTable.ts","../../src/helpers/getTableFromMutationTable.ts","../../src/helpers/flatten.ts","../../src/sync/listClientChanges.ts","../../src/helpers/randomString.ts","../../../../libs/dexie-cloud-common/dist/utils.js","../../../../libs/dexie-cloud-common/dist/validation/isValidSyncableID.js","../../../../libs/dexie-cloud-common/dist/change-processing/applyOperation.js","../../../../libs/dexie-cloud-common/dist/change-processing/applyOperations.js","../../../../node_modules/.pnpm/lib0@0.2.97/node_modules/lib0/math.js","../../../../node_modules/.pnpm/lib0@0.2.97/node_modules/lib0/binary.js","../../../../node_modules/.pnpm/lib0@0.2.97/node_modules/lib0/number.js","../../../../node_modules/.pnpm/lib0@0.2.97/node_modules/lib0/array.js","../../../../node_modules/.pnpm/lib0@0.2.97/node_modules/lib0/string.js","../../../../node_modules/.pnpm/lib0@0.2.97/node_modules/lib0/encoding.js","../../../../libs/dexie-cloud-common/dist/yjs/encoding.js","../../../../node_modules/.pnpm/lib0@0.2.97/node_modules/lib0/error.js","../../../../node_modules/.pnpm/lib0@0.2.97/node_modules/lib0/decoding.js","../../../../libs/dexie-cloud-common/dist/async-generators/consumeChunkedBinaryStream.js","../../src/authentication/TokenErrorResponseError.ts","../../src/authentication/interactWithUser.ts","../../src/authentication/authenticate.ts","../../../../node_modules/.pnpm/dreambase-library@1.0.26/node_modules/dreambase-library/dist/typeson-simplified/TypesonSimplified.js","../../../../node_modules/.pnpm/dreambase-library@1.0.26/node_modules/dreambase-library/dist/typeson-simplified/BisonBinaryTypes.js","../../../../node_modules/.pnpm/dreambase-library@1.0.26/node_modules/dreambase-library/dist/typeson-simplified/types/number.js","../../../../node_modules/.pnpm/dreambase-library@1.0.26/node_modules/dreambase-library/dist/typeson-simplified/types/bigint.js","../../../../node_modules/.pnpm/dreambase-library@1.0.26/node_modules/dreambase-library/dist/typeson-simplified/types/Date.js","../../../../node_modules/.pnpm/dreambase-library@1.0.26/node_modules/dreambase-library/dist/typeson-simplified/types/Set.js","../../../../node_modules/.pnpm/dreambase-library@1.0.26/node_modules/dreambase-library/dist/typeson-simplified/types/Map.js","../../../../node_modules/.pnpm/dreambase-library@1.0.26/node_modules/dreambase-library/dist/common/_global.js","../../../../node_modules/.pnpm/dreambase-library@1.0.26/node_modules/dreambase-library/dist/typeson-simplified/types/TypedArray.js","../../../../node_modules/.pnpm/dreambase-library@1.0.26/node_modules/dreambase-library/dist/common/b64lex.js","../../../../node_modules/.pnpm/dreambase-library@1.0.26/node_modules/dreambase-library/dist/typeson-simplified/types/ArrayBuffer.js","../../../../node_modules/.pnpm/dreambase-library@1.0.26/node_modules/dreambase-library/dist/typeson-simplified/FakeBlob.js","../../../../node_modules/.pnpm/dreambase-library@1.0.26/node_modules/dreambase-library/dist/typeson-simplified/readBlobSync.js","../../../../node_modules/.pnpm/dreambase-library@1.0.26/node_modules/dreambase-library/dist/typeson-simplified/string2ArrayBuffer.js","../../../../node_modules/.pnpm/dreambase-library@1.0.26/node_modules/dreambase-library/dist/typeson-simplified/types/Blob.js","../../../../node_modules/.pnpm/dreambase-library@1.0.26/node_modules/dreambase-library/dist/typeson-simplified/presets/builtin.js","../../../../node_modules/.pnpm/dreambase-library@1.0.26/node_modules/dreambase-library/dist/typeson-simplified/Bison.js","../../../../node_modules/.pnpm/dreambase-library@1.0.26/node_modules/dreambase-library/dist/typeson-simplified/types/undefined.js","../../../../node_modules/.pnpm/dreambase-library@1.0.26/node_modules/dreambase-library/dist/typeson-simplified/types/File.js","../../src/TSON.ts","../../src/errors/HttpError.ts","../../src/sync/encodeIdsForServer.ts","../../src/sync/ratelimit.ts","../../src/sync/syncWithServer.ts","../../src/helpers/CancelToken.ts","../../src/sync/isOnline.ts","../../src/sync/updateBaseRevs.ts","../../src/sync/getLatestRevisionsPerTable.ts","../../src/helpers/bulkUpdate.ts","../../src/sync/applyServerChanges.ts","../../src/sync/DEXIE_CLOUD_SYNCER_ID.ts","../../src/yjs/listUpdatesSince.ts","../../src/yjs/Y.ts","../../src/yjs/getUpdatesTable.ts","../../src/yjs/applyYMessages.ts","../../src/yjs/downloadYDocsFromServer.ts","../../../../libs/dexie-cloud-common/dist/async-generators/asyncIterablePipeline.js","../../../../libs/dexie-cloud-common/dist/async-generators/getFetchResponseBodyGenerator.js","../../src/sync/sync.ts","../../src/sync/getTablesToSyncify.ts","../../src/sync/modifyLocalObjectsWithNewUserId.ts","../../src/yjs/listYClientMessagesAndStateVector.ts","../../src/sync/listSyncifiedChanges.ts","../../src/yjs/updateYSyncStates.ts","../../../../libs/dexie-cloud-common/dist/change-processing/subtractChanges.js","../../../../libs/dexie-cloud-common/dist/change-processing/toDBOperationSet.js","../../src/sync/messagesFromServerQueue.ts","../../src/db/DexieCloudDB.ts","../../src/authentication/AuthPersistedContext.ts","../../src/authentication/waitUntil.ts","../../src/authentication/logout.ts","../../src/prodLog.ts","../../src/authentication/login.ts","../../src/authentication/otpFetchTokenCallback.ts","../../src/authentication/setCurrentUser.ts","../../src/isFirefox.ts","../../src/isSafari.ts","../../src/DISABLE_SERVICEWORKER_STRATEGY.ts","../../src/helpers/IS_SERVICE_WORKER.ts","../../src/middleware-helpers/idGenerationHelpers.ts","../../src/middlewares/createIdGenerationMiddleware.ts","../../src/middleware-helpers/guardedTable.ts","../../src/helpers/allSettled.ts","../../src/middlewares/outstandingTransaction.ts","../../src/isEagerSyncDisabled.ts","../../src/middlewares/createMutationTrackingMiddleware.ts","../../src/overrideParseStoresSpec.ts","../../src/sync/performGuardedJob.ts","../../src/userIsActive.ts","../../src/authentication/TokenExpiredError.ts","../../src/yjs/awareness.ts","../../src/yjs/reopenDocSignal.ts","../../src/WSObservable.ts","../../../../libs/dexie-cloud-common/dist/yjs/decoding.js","../../src/yjs/createYClientUpdateObservable.ts","../../src/InvalidLicenseError.ts","../../src/sync/connectWebSocket.ts","../../src/sync/isSyncNeeded.ts","../../src/sync/syncIfPossible.ts","../../src/helpers/date-constants.ts","../../src/sync/LocalSyncWorker.ts","../../src/updateSchemaFromOptions.ts","../../../../node_modules/.pnpm/preact@10.10.6/node_modules/preact/dist/preact.module.js","../../src/default-ui/Styles.ts","../../src/default-ui/Dialog.tsx","../../../../node_modules/.pnpm/preact@10.10.6/node_modules/preact/hooks/dist/hooks.module.js","../../src/default-ui/LoginDialog.tsx","../../src/helpers/resolveText.ts","../../src/default-ui/index.tsx","../../src/associate.ts","../../src/currentUserEmitter.ts","../../src/createSharedValueObservable.ts","../../src/getGlobalRolesObservable.ts","../../src/getInternalAccessControlObservable.ts","../../src/mergePermissions.ts","../../src/getPermissionsLookupObservable.ts","../../src/mapValueObservable.ts","../../src/PermissionChecker.ts","../../src/getInvitesObservable.ts","../../src/yjs/createYHandler.ts","../../src/dexie-cloud-client.ts","../../src/computeSyncState.ts","../../src/helpers/throwVersionIncrementNeeded.ts","../../src/verifySchema.ts","../../src/performInitialSync.ts","../../src/middlewares/createImplicitPropSetterMiddleware.ts","../../../../libs/dexie-cloud-common/dist/getDbNameFromDbUrl.js","../../src/permissions.ts","../../src/service-worker.ts"],"sourcesContent":["/******************************************************************************\r\nCopyright (c) Microsoft Corporation.\r\n\r\nPermission to use, copy, modify, and/or distribute this software for any\r\npurpose with or without fee is hereby granted.\r\n\r\nTHE SOFTWARE IS PROVIDED \"AS IS\" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH\r\nREGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY\r\nAND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT,\r\nINDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM\r\nLOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR\r\nOTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR\r\nPERFORMANCE OF THIS SOFTWARE.\r\n***************************************************************************** */\r\n/* global Reflect, Promise */\r\n\r\nvar extendStatics = function(d, b) {\r\n extendStatics = Object.setPrototypeOf ||\r\n ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||\r\n function (d, b) { for (var p in b) if (Object.prototype.hasOwnProperty.call(b, p)) d[p] = b[p]; };\r\n return extendStatics(d, b);\r\n};\r\n\r\nexport function __extends(d, b) {\r\n if (typeof b !== \"function\" && b !== null)\r\n throw new TypeError(\"Class extends value \" + String(b) + \" is not a constructor or null\");\r\n extendStatics(d, b);\r\n function __() { this.constructor = d; }\r\n d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\r\n}\r\n\r\nexport var __assign = function() {\r\n __assign = Object.assign || function __assign(t) {\r\n for (var s, i = 1, n = arguments.length; i < n; i++) {\r\n s = arguments[i];\r\n for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p)) t[p] = s[p];\r\n }\r\n return t;\r\n }\r\n return __assign.apply(this, arguments);\r\n}\r\n\r\nexport function __rest(s, e) {\r\n var t = {};\r\n for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0)\r\n t[p] = s[p];\r\n if (s != null && typeof Object.getOwnPropertySymbols === \"function\")\r\n for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) {\r\n if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i]))\r\n t[p[i]] = s[p[i]];\r\n }\r\n return t;\r\n}\r\n\r\nexport function __decorate(decorators, target, key, desc) {\r\n var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;\r\n if (typeof Reflect === \"object\" && typeof Reflect.decorate === \"function\") r = Reflect.decorate(decorators, target, key, desc);\r\n else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;\r\n return c > 3 && r && Object.defineProperty(target, key, r), r;\r\n}\r\n\r\nexport function __param(paramIndex, decorator) {\r\n return function (target, key) { decorator(target, key, paramIndex); }\r\n}\r\n\r\nexport function __metadata(metadataKey, metadataValue) {\r\n if (typeof Reflect === \"object\" && typeof Reflect.metadata === \"function\") return Reflect.metadata(metadataKey, metadataValue);\r\n}\r\n\r\nexport function __awaiter(thisArg, _arguments, P, generator) {\r\n function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }\r\n return new (P || (P = Promise))(function (resolve, reject) {\r\n function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }\r\n function rejected(value) { try { step(generator[\"throw\"](value)); } catch (e) { reject(e); } }\r\n function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }\r\n step((generator = generator.apply(thisArg, _arguments || [])).next());\r\n });\r\n}\r\n\r\nexport function __generator(thisArg, body) {\r\n var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g;\r\n return g = { next: verb(0), \"throw\": verb(1), \"return\": verb(2) }, typeof Symbol === \"function\" && (g[Symbol.iterator] = function() { return this; }), g;\r\n function verb(n) { return function (v) { return step([n, v]); }; }\r\n function step(op) {\r\n if (f) throw new TypeError(\"Generator is already executing.\");\r\n while (_) try {\r\n if (f = 1, y && (t = op[0] & 2 ? y[\"return\"] : op[0] ? y[\"throw\"] || ((t = y[\"return\"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t;\r\n if (y = 0, t) op = [op[0] & 2, t.value];\r\n switch (op[0]) {\r\n case 0: case 1: t = op; break;\r\n case 4: _.label++; return { value: op[1], done: false };\r\n case 5: _.label++; y = op[1]; op = [0]; continue;\r\n case 7: op = _.ops.pop(); _.trys.pop(); continue;\r\n default:\r\n if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }\r\n if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }\r\n if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }\r\n if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }\r\n if (t[2]) _.ops.pop();\r\n _.trys.pop(); continue;\r\n }\r\n op = body.call(thisArg, _);\r\n } catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }\r\n if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };\r\n }\r\n}\r\n\r\nexport var __createBinding = Object.create ? (function(o, m, k, k2) {\r\n if (k2 === undefined) k2 = k;\r\n var desc = Object.getOwnPropertyDescriptor(m, k);\r\n if (!desc || (\"get\" in desc ? !m.__esModule : desc.writable || desc.configurable)) {\r\n desc = { enumerable: true, get: function() { return m[k]; } };\r\n }\r\n Object.defineProperty(o, k2, desc);\r\n}) : (function(o, m, k, k2) {\r\n if (k2 === undefined) k2 = k;\r\n o[k2] = m[k];\r\n});\r\n\r\nexport function __exportStar(m, o) {\r\n for (var p in m) if (p !== \"default\" && !Object.prototype.hasOwnProperty.call(o, p)) __createBinding(o, m, p);\r\n}\r\n\r\nexport function __values(o) {\r\n var s = typeof Symbol === \"function\" && Symbol.iterator, m = s && o[s], i = 0;\r\n if (m) return m.call(o);\r\n if (o && typeof o.length === \"number\") return {\r\n next: function () {\r\n if (o && i >= o.length) o = void 0;\r\n return { value: o && o[i++], done: !o };\r\n }\r\n };\r\n throw new TypeError(s ? \"Object is not iterable.\" : \"Symbol.iterator is not defined.\");\r\n}\r\n\r\nexport function __read(o, n) {\r\n var m = typeof Symbol === \"function\" && o[Symbol.iterator];\r\n if (!m) return o;\r\n var i = m.call(o), r, ar = [], e;\r\n try {\r\n while ((n === void 0 || n-- > 0) && !(r = i.next()).done) ar.push(r.value);\r\n }\r\n catch (error) { e = { error: error }; }\r\n finally {\r\n try {\r\n if (r && !r.done && (m = i[\"return\"])) m.call(i);\r\n }\r\n finally { if (e) throw e.error; }\r\n }\r\n return ar;\r\n}\r\n\r\n/** @deprecated */\r\nexport function __spread() {\r\n for (var ar = [], i = 0; i < arguments.length; i++)\r\n ar = ar.concat(__read(arguments[i]));\r\n return ar;\r\n}\r\n\r\n/** @deprecated */\r\nexport function __spreadArrays() {\r\n for (var s = 0, i = 0, il = arguments.length; i < il; i++) s += arguments[i].length;\r\n for (var r = Array(s), k = 0, i = 0; i < il; i++)\r\n for (var a = arguments[i], j = 0, jl = a.length; j < jl; j++, k++)\r\n r[k] = a[j];\r\n return r;\r\n}\r\n\r\nexport function __spreadArray(to, from, pack) {\r\n if (pack || arguments.length === 2) for (var i = 0, l = from.length, ar; i < l; i++) {\r\n if (ar || !(i in from)) {\r\n if (!ar) ar = Array.prototype.slice.call(from, 0, i);\r\n ar[i] = from[i];\r\n }\r\n }\r\n return to.concat(ar || Array.prototype.slice.call(from));\r\n}\r\n\r\nexport function __await(v) {\r\n return this instanceof __await ? (this.v = v, this) : new __await(v);\r\n}\r\n\r\nexport function __asyncGenerator(thisArg, _arguments, generator) {\r\n if (!Symbol.asyncIterator) throw new TypeError(\"Symbol.asyncIterator is not defined.\");\r\n var g = generator.apply(thisArg, _arguments || []), i, q = [];\r\n return i = {}, verb(\"next\"), verb(\"throw\"), verb(\"return\"), i[Symbol.asyncIterator] = function () { return this; }, i;\r\n function verb(n) { if (g[n]) i[n] = function (v) { return new Promise(function (a, b) { q.push([n, v, a, b]) > 1 || resume(n, v); }); }; }\r\n function resume(n, v) { try { step(g[n](v)); } catch (e) { settle(q[0][3], e); } }\r\n function step(r) { r.value instanceof __await ? Promise.resolve(r.value.v).then(fulfill, reject) : settle(q[0][2], r); }\r\n function fulfill(value) { resume(\"next\", value); }\r\n function reject(value) { resume(\"throw\", value); }\r\n function settle(f, v) { if (f(v), q.shift(), q.length) resume(q[0][0], q[0][1]); }\r\n}\r\n\r\nexport function __asyncDelegator(o) {\r\n var i, p;\r\n return i = {}, verb(\"next\"), verb(\"throw\", function (e) { throw e; }), verb(\"return\"), i[Symbol.iterator] = function () { return this; }, i;\r\n function verb(n, f) { i[n] = o[n] ? function (v) { return (p = !p) ? { value: __await(o[n](v)), done: n === \"return\" } : f ? f(v) : v; } : f; }\r\n}\r\n\r\nexport function __asyncValues(o) {\r\n if (!Symbol.asyncIterator) throw new TypeError(\"Symbol.asyncIterator is not defined.\");\r\n var m = o[Symbol.asyncIterator], i;\r\n return m ? m.call(o) : (o = typeof __values === \"function\" ? __values(o) : o[Symbol.iterator](), i = {}, verb(\"next\"), verb(\"throw\"), verb(\"return\"), i[Symbol.asyncIterator] = function () { return this; }, i);\r\n function verb(n) { i[n] = o[n] && function (v) { return new Promise(function (resolve, reject) { v = o[n](v), settle(resolve, reject, v.done, v.value); }); }; }\r\n function settle(resolve, reject, d, v) { Promise.resolve(v).then(function(v) { resolve({ value: v, done: d }); }, reject); }\r\n}\r\n\r\nexport function __makeTemplateObject(cooked, raw) {\r\n if (Object.defineProperty) { Object.defineProperty(cooked, \"raw\", { value: raw }); } else { cooked.raw = raw; }\r\n return cooked;\r\n};\r\n\r\nvar __setModuleDefault = Object.create ? (function(o, v) {\r\n Object.defineProperty(o, \"default\", { enumerable: true, value: v });\r\n}) : function(o, v) {\r\n o[\"default\"] = v;\r\n};\r\n\r\nexport function __importStar(mod) {\r\n if (mod && mod.__esModule) return mod;\r\n var result = {};\r\n if (mod != null) for (var k in mod) if (k !== \"default\" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);\r\n __setModuleDefault(result, mod);\r\n return result;\r\n}\r\n\r\nexport function __importDefault(mod) {\r\n return (mod && mod.__esModule) ? mod : { default: mod };\r\n}\r\n\r\nexport function __classPrivateFieldGet(receiver, state, kind, f) {\r\n if (kind === \"a\" && !f) throw new TypeError(\"Private accessor was defined without a getter\");\r\n if (typeof state === \"function\" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError(\"Cannot read private member from an object whose class did not declare it\");\r\n return kind === \"m\" ? f : kind === \"a\" ? f.call(receiver) : f ? f.value : state.get(receiver);\r\n}\r\n\r\nexport function __classPrivateFieldSet(receiver, state, value, kind, f) {\r\n if (kind === \"m\") throw new TypeError(\"Private method is not writable\");\r\n if (kind === \"a\" && !f) throw new TypeError(\"Private accessor was defined without a setter\");\r\n if (typeof state === \"function\" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError(\"Cannot write private member to an object whose class did not declare it\");\r\n return (kind === \"a\" ? f.call(receiver, value) : f ? f.value = value : state.set(receiver, value)), value;\r\n}\r\n\r\nexport function __classPrivateFieldIn(state, receiver) {\r\n if (receiver === null || (typeof receiver !== \"object\" && typeof receiver !== \"function\")) throw new TypeError(\"Cannot use 'in' operator on non-object\");\r\n return typeof state === \"function\" ? receiver === state : state.has(receiver);\r\n}\r\n","import { UserLogin } from '../db/entities/UserLogin';\n\nexport const UNAUTHORIZED_USER: UserLogin = {\n userId: \"unauthorized\",\n name: \"Unauthorized\",\n claims: {\n sub: \"unauthorized\",\n },\n lastLogin: new Date(0)\n}\n\ntry {\n Object.freeze(UNAUTHORIZED_USER);\n Object.freeze(UNAUTHORIZED_USER.claims);\n} catch {}\n","const swHolder: { registration?: ServiceWorkerRegistration } = {};\nconst swContainer = typeof self !== 'undefined' && self.document && // self.document is to verify we're not the SW ourself\n typeof navigator !== 'undefined' && navigator.serviceWorker; \nif (swContainer)\n swContainer.ready.then(\n (registration) => (swHolder.registration = registration)\n );\n\nif (typeof self !== 'undefined' && 'clients' in self && !self.document) {\n // We are the service worker. Propagate messages to all our clients.\n addEventListener('message', (ev: any) => {\n if (ev.data?.type?.startsWith('sw-broadcast-')) {\n [...self['clients'].matchAll({ includeUncontrolled: true })].forEach(\n (client) => client.id !== ev.source?.id && client.postMessage(ev.data)\n );\n }\n });\n}\n\n/** This class is a fallback for browsers that lacks BroadcastChannel but have\n * service workers (which is Safari versions 11.1 through 15.3).\n * Safari 15.4 with BroadcastChannel was released on 2022-03-14.\n * We might be able to remove this class in a near future as Safari < 15.4 is\n * already very low in market share as of 2023-03-10.\n */\nexport class SWBroadcastChannel {\n name: string;\n constructor(name: string) {\n this.name = name;\n }\n subscribe(listener: (message: any) => void) {\n if (!swContainer) return () => {};\n const forwarder = (ev: MessageEvent) => {\n if (ev.data?.type === `sw-broadcast-${this.name}`) {\n listener(ev.data.message);\n }\n };\n swContainer.addEventListener('message', forwarder);\n return () => swContainer.removeEventListener('message', forwarder);\n }\n postMessage(message: any) {\n if (typeof self['clients'] === 'object') {\n // We're a service worker. Propagate to our browser clients.\n [...self['clients'].matchAll({ includeUncontrolled: true })].forEach(\n (client) =>\n client.postMessage({\n type: `sw-broadcast-${this.name}`,\n message,\n })\n );\n } else if (swHolder.registration) {\n // We're a client (browser window or other worker)\n // Post to SW so it can repost to all its clients and to itself\n swHolder.registration.active?.postMessage({\n type: `sw-broadcast-${this.name}`,\n message,\n });\n }\n }\n}\n","import { Observable } from \"rxjs\";\nimport { SWBroadcastChannel } from \"./SWBroadcastChannel\";\n\nconst events: Map<string, Array<(ev: CustomEvent)=>void>> =\n globalThis['lbc-events'] || (globalThis['lbc-events'] = new Map<string, Array<(ev: CustomEvent)=>void>>());\n\nfunction addListener(name: string, listener: (ev: CustomEvent)=>void) {\n if (events.has(name)) {\n events.get(name)!.push(listener);\n } else {\n events.set(name, [listener]);\n }\n}\nfunction removeListener(name: string, listener: (ev: CustomEvent)=>void) {\n const listeners = events.get(name);\n if (listeners) {\n const idx = listeners.indexOf(listener);\n if (idx !== -1) {\n listeners.splice(idx, 1);\n }\n }\n}\nfunction dispatch(ev: CustomEvent) {\n const listeners = events.get(ev.type);\n if (listeners) {\n listeners.forEach(listener => {\n try {\n listener(ev);\n } catch {\n }\n });\n }\n}\n\nexport class BroadcastedAndLocalEvent<T> extends Observable<T>{\n name: string;\n bc: BroadcastChannel | SWBroadcastChannel\n\n constructor(name: string) {\n const bc = typeof BroadcastChannel === \"undefined\"\n ? new SWBroadcastChannel(name) : new BroadcastChannel(name);\n super(subscriber => {\n function onCustomEvent(ev: CustomEvent) {\n subscriber.next(ev.detail);\n }\n function onMessageEvent(ev: MessageEvent) {\n console.debug(\"BroadcastedAndLocalEvent: onMessageEvent\", ev);\n subscriber.next(ev.data);\n }\n let unsubscribe: ()=>void;\n //self.addEventListener(`lbc-${name}`, onCustomEvent); // Fails in service workers\n addListener(`lbc-${name}`, onCustomEvent); // Works better in service worker\n\n try { \n if (bc instanceof SWBroadcastChannel) {\n unsubscribe = bc.subscribe(message => subscriber.next(message));\n } else {\n console.debug(\"BroadcastedAndLocalEvent: bc.addEventListener()\", name, \"bc is a\", bc);\n bc.addEventListener(\"message\", onMessageEvent);\n }\n } catch (err) {\n // Service workers might fail to subscribe outside its initial script.\n console.warn('Failed to subscribe to broadcast channel', err);\n }\n return () => {\n //self.removeEventListener(`lbc-${name}`, onCustomEvent);\n removeListener(`lbc-${name}`, onCustomEvent);\n if (bc instanceof SWBroadcastChannel) {\n unsubscribe!();\n } else {\n bc.removeEventListener(\"message\", onMessageEvent);\n }\n }\n });\n this.name = name;\n this.bc = bc;\n }\n\n next(message: T) {\n console.debug(\"BroadcastedAndLocalEvent: bc.postMessage()\", {...message}, \"bc is a\", this.bc);\n this.bc.postMessage(message);\n const ev = new CustomEvent(`lbc-${this.name}`, { detail: message });\n //self.dispatchEvent(ev);\n dispatch(ev);\n }\n}\n","export function isFunction(value) {\n return typeof value === 'function';\n}\n//# sourceMappingURL=isFunction.js.map","import { isFunction } from './isFunction';\nexport function hasLift(source) {\n return isFunction(source === null || source === void 0 ? void 0 : source.lift);\n}\nexport function operate(init) {\n return function (source) {\n if (hasLift(source)) {\n return source.lift(function (liftedSource) {\n try {\n return init(liftedSource, this);\n }\n catch (err) {\n this.error(err);\n }\n });\n }\n throw new TypeError('Unable to lift unknown Observable type');\n };\n}\n//# sourceMappingURL=lift.js.map","export var isArrayLike = (function (x) { return x && typeof x.length === 'number' && typeof x !== 'function'; });\n//# sourceMappingURL=isArrayLike.js.map","import { isFunction } from \"./isFunction\";\nexport function isPromise(value) {\n return isFunction(value === null || value === void 0 ? void 0 : value.then);\n}\n//# sourceMappingURL=isPromise.js.map","import { createErrorClass } from './createErrorClass';\nexport var UnsubscriptionError = createErrorClass(function (_super) {\n return function UnsubscriptionErrorImpl(errors) {\n _super(this);\n this.message = errors\n ? errors.length + \" errors occurred during unsubscription:\\n\" + errors.map(function (err, i) { return i + 1 + \") \" + err.toString(); }).join('\\n ')\n : '';\n this.name = 'UnsubscriptionError';\n this.errors = errors;\n };\n});\n//# sourceMappingURL=UnsubscriptionError.js.map","export function createErrorClass(createImpl) {\n var _super = function (instance) {\n Error.call(instance);\n instance.stack = new Error().stack;\n };\n var ctorFunc = createImpl(_super);\n ctorFunc.prototype = Object.create(Error.prototype);\n ctorFunc.prototype.constructor = ctorFunc;\n return ctorFunc;\n}\n//# sourceMappingURL=createErrorClass.js.map","export function arrRemove(arr, item) {\n if (arr) {\n var index = arr.indexOf(item);\n 0 <= index && arr.splice(index, 1);\n }\n}\n//# sourceMappingURL=arrRemove.js.map","import { __read, __spreadArray, __values } from \"tslib\";\nimport { isFunction } from './util/isFunction';\nimport { UnsubscriptionError } from './util/UnsubscriptionError';\nimport { arrRemove } from './util/arrRemove';\nvar Subscription = (function () {\n function Subscription(initialTeardown) {\n this.initialTeardown = initialTeardown;\n this.closed = false;\n this._parentage = null;\n this._finalizers = null;\n }\n Subscription.prototype.unsubscribe = function () {\n var e_1, _a, e_2, _b;\n var errors;\n if (!this.closed) {\n this.closed = true;\n var _parentage = this._parentage;\n if (_parentage) {\n this._parentage = null;\n if (Array.isArray(_parentage)) {\n try {\n for (var _parentage_1 = __values(_parentage), _parentage_1_1 = _parentage_1.next(); !_parentage_1_1.done; _parentage_1_1 = _parentage_1.next()) {\n var parent_1 = _parentage_1_1.value;\n parent_1.remove(this);\n }\n }\n catch (e_1_1) { e_1 = { error: e_1_1 }; }\n finally {\n try {\n if (_parentage_1_1 && !_parentage_1_1.done && (_a = _parentage_1.return)) _a.call(_parentage_1);\n }\n finally { if (e_1) throw e_1.error; }\n }\n }\n else {\n _parentage.remove(this);\n }\n }\n var initialFinalizer = this.initialTeardown;\n if (isFunction(initialFinalizer)) {\n try {\n initialFinalizer();\n }\n catch (e) {\n errors = e instanceof UnsubscriptionError ? e.errors : [e];\n }\n }\n var _finalizers = this._finalizers;\n if (_finalizers) {\n this._finalizers = null;\n try {\n for (var _finalizers_1 = __values(_finalizers), _finalizers_1_1 = _finalizers_1.next(); !_finalizers_1_1.done; _finalizers_1_1 = _finalizers_1.next()) {\n var finalizer = _finalizers_1_1.value;\n try {\n execFinalizer(finalizer);\n }\n catch (err) {\n errors = errors !== null && errors !== void 0 ? errors : [];\n if (err instanceof UnsubscriptionError) {\n errors = __spreadArray(__spreadArray([], __read(errors)), __read(err.errors));\n }\n else {\n errors.push(err);\n }\n }\n }\n }\n catch (e_2_1) { e_2 = { error: e_2_1 }; }\n finally {\n try {\n if (_finalizers_1_1 && !_finalizers_1_1.done && (_b = _finalizers_1.return)) _b.call(_finalizers_1);\n }\n finally { if (e_2) throw e_2.error; }\n }\n }\n if (errors) {\n throw new UnsubscriptionError(errors);\n }\n }\n };\n Subscription.prototype.add = function (teardown) {\n var _a;\n if (teardown && teardown !== this) {\n if (this.closed) {\n execFinalizer(teardown);\n }\n else {\n if (teardown instanceof Subscription) {\n if (teardown.closed || teardown._hasParent(this)) {\n return;\n }\n teardown._addParent(this);\n }\n (this._finalizers = (_a = this._finalizers) !== null && _a !== void 0 ? _a : []).push(teardown);\n }\n }\n };\n Subscription.prototype._hasParent = function (parent) {\n var _parentage = this._parentage;\n return _parentage === parent || (Array.isArray(_parentage) && _parentage.includes(parent));\n };\n Subscription.prototype._addParent = function (parent) {\n var _parentage = this._parentage;\n this._parentage = Array.isArray(_parentage) ? (_parentage.push(parent), _parentage) : _parentage ? [_parentage, parent] : parent;\n };\n Subscription.prototype._removeParent = function (parent) {\n var _parentage = this._parentage;\n if (_parentage === parent) {\n this._parentage = null;\n }\n else if (Array.isArray(_parentage)) {\n arrRemove(_parentage, parent);\n }\n };\n Subscription.prototype.remove = function (teardown) {\n var _finalizers = this._finalizers;\n _finalizers && arrRemove(_finalizers, teardown);\n if (teardown instanceof Subscription) {\n teardown._removeParent(this);\n }\n };\n Subscription.EMPTY = (function () {\n var empty = new Subscription();\n empty.closed = true;\n return empty;\n })();\n return Subscription;\n}());\nexport { Subscription };\nexport var EMPTY_SUBSCRIPTION = Subscription.EMPTY;\nexport function isSubscription(value) {\n return (value instanceof Subscription ||\n (value && 'closed' in value && isFunction(value.remove) && isFunction(value.add) && isFunction(value.unsubscribe)));\n}\nfunction execFinalizer(finalizer) {\n if (isFunction(finalizer)) {\n finalizer();\n }\n else {\n finalizer.unsubscribe();\n }\n}\n//# sourceMappingURL=Subscription.js.map","export var config = {\n onUnhandledError: null,\n onStoppedNotification: null,\n Promise: undefined,\n useDeprecatedSynchronousErrorHandling: false,\n useDeprecatedNextContext: false,\n};\n//# sourceMappingURL=config.js.map","import { __read, __spreadArray } from \"tslib\";\nexport var timeoutProvider = {\n setTimeout: function (handler, timeout) {\n var args = [];\n for (var _i = 2; _i < arguments.length; _i++) {\n args[_i - 2] = arguments[_i];\n }\n var delegate = timeoutProvider.delegate;\n if (delegate === null || delegate === void 0 ? void 0 : delegate.setTimeout) {\n return delegate.setTimeout.apply(delegate, __spreadArray([handler, timeout], __read(args)));\n }\n return setTimeout.apply(void 0, __spreadArray([handler, timeout], __read(args)));\n },\n clearTimeout: function (handle) {\n var delegate = timeoutProvider.delegate;\n return ((delegate === null || delegate === void 0 ? void 0 : delegate.clearTimeout) || clearTimeout)(handle);\n },\n delegate: undefined,\n};\n//# sourceMappingURL=timeoutProvider.js.map","import { config } from '../config';\nimport { timeoutProvider } from '../scheduler/timeoutProvider';\nexport function reportUnhandledError(err) {\n timeoutProvider.setTimeout(function () {\n var onUnhandledError = config.onUnhandledError;\n if (onUnhandledError) {\n onUnhandledError(err);\n }\n else {\n throw err;\n }\n });\n}\n//# sourceMappingURL=reportUnhandledError.js.map","export function noop() { }\n//# sourceMappingURL=noop.js.map","import { __extends } from \"tslib\";\nimport { isFunction } from './util/isFunction';\nimport { isSubscription, Subscription } from './Subscription';\nimport { config } from './config';\nimport { reportUnhandledError } from './util/reportUnhandledError';\nimport { noop } from './util/noop';\nimport { nextNotification, errorNotification, COMPLETE_NOTIFICATION } from './NotificationFactories';\nimport { timeoutProvider } from './scheduler/timeoutProvider';\nimport { captureError } from './util/errorContext';\nvar Subscriber = (function (_super) {\n __extends(Subscriber, _super);\n function Subscriber(destination) {\n var _this = _super.call(this) || this;\n _this.isStopped = false;\n if (destination) {\n _this.destination = destination;\n if (isSubscription(destination)) {\n destination.add(_this);\n }\n }\n else {\n _this.destination = EMPTY_OBSERVER;\n }\n return _this;\n }\n Subscriber.create = function (next, error, complete) {\n return new SafeSubscriber(next, error, complete);\n };\n Subscriber.prototype.next = function (value) {\n if (this.isStopped) {\n handleStoppedNotification(nextNotification(value), this);\n }\n else {\n this._next(value);\n }\n };\n Subscriber.prototype.error = function (err) {\n if (this.isStopped) {\n handleStoppedNotification(errorNotification(err), this);\n }\n else {\n this.isStopped = true;\n this._error(err);\n }\n };\n Subscriber.prototype.complete = function () {\n if (this.isStopped) {\n handleStoppedNotification(COMPLETE_NOTIFICATION, this);\n }\n else {\n this.isStopped = true;\n this._complete();\n }\n };\n Subscriber.prototype.unsubscribe = function () {\n if (!this.closed) {\n this.isStopped = true;\n _super.prototype.unsubscribe.call(this);\n this.destination = null;\n }\n };\n Subscriber.prototype._next = function (value) {\n this.destination.next(value);\n };\n Subscriber.prototype._error = function (err) {\n try {\n this.destination.error(err);\n }\n finally {\n this.unsubscribe();\n }\n };\n Subscriber.prototype._complete = function () {\n try {\n this.destination.complete();\n }\n finally {\n this.unsubscribe();\n }\n };\n return Subscriber;\n}(Subscription));\nexport { Subscriber };\nvar _bind = Function.prototype.bind;\nfunction bind(fn, thisArg) {\n return _bind.call(fn, thisArg);\n}\nvar ConsumerObserver = (function () {\n function ConsumerObserver(partialObserver) {\n this.partialObserver = partialObserver;\n }\n ConsumerObserver.prototype.next = function (value) {\n var partialObserver = this.partialObserver;\n if (partialObserver.next) {\n try {\n partialObserver.next(value);\n }\n catch (error) {\n handleUnhandledError(error);\n }\n }\n };\n ConsumerObserver.prototype.error = function (err) {\n var partialObserver = this.partialObserver;\n if (partialObserver.error) {\n try {\n partialObserver.error(err);\n }\n catch (error) {\n handleUnhandledError(error);\n }\n }\n else {\n handleUnhandledError(err);\n }\n };\n ConsumerObserver.prototype.complete = function () {\n var partialObserver = this.partialObserver;\n if (partialObserver.complete) {\n try {\n partialObserver.complete();\n }\n catch (error) {\n handleUnhandledError(error);\n }\n }\n };\n return ConsumerObserver;\n}());\nvar SafeSubscriber = (function (_super) {\n __extends(SafeSubscriber, _super);\n function SafeSubscriber(observerOrNext, error, complete) {\n var _this = _super.call(this) || this;\n var partialObserver;\n if (isFunction(observerOrNext) || !observerOrNext) {\n partialObserver = {\n next: (observerOrNext !== null && observerOrNext !== void 0 ? observerOrNext : undefined),\n error: error !== null && error !== void 0 ? error : undefined,\n complete: complete !== null && complete !== void 0 ? complete : undefined,\n };\n }\n else {\n var context_1;\n if (_this && config.useDeprecatedNextContext) {\n context_1 = Object.create(observerOrNext);\n context_1.unsubscribe = function () { return _this.unsubscribe(); };\n partialObserver = {\n next: observerOrNext.next && bind(observerOrNext.next, context_1),\n error: observerOrNext.error && bind(observerOrNext.error, context_1),\n complete: observerOrNext.complete && bind(observerOrNext.complete, context_1),\n };\n }\n else {\n partialObserver = observerOrNext;\n }\n }\n _this.destination = new ConsumerObserver(partialObserver);\n return _this;\n }\n return SafeSubscriber;\n}(Subscriber));\nexport { SafeSubscriber };\nfunction handleUnhandledError(error) {\n if (config.useDeprecatedSynchronousErrorHandling) {\n captureError(error);\n }\n else {\n reportUnhandledError(error);\n }\n}\nfunction defaultErrorHandler(err) {\n throw err;\n}\nfunction handleStoppedNotification(notification, subscriber) {\n var onStoppedNotification = config.onStoppedNotification;\n onStoppedNotification && timeoutProvider.setTimeout(function () { return onStoppedNotification(notification, subscriber); });\n}\nexport var EMPTY_OBSERVER = {\n closed: true,\n next: noop,\n error: defaultErrorHandler,\n complete: noop,\n};\n//# sourceMappingURL=Subscriber.js.map","export var observable = (function () { return (typeof Symbol === 'function' && Symbol.observable) || '@@observable'; })();\n//# sourceMappingURL=observable.js.map","export function identity(x) {\n return x;\n}\n//# sourceMappingURL=identity.js.map","import { SafeSubscriber, Subscriber } from './Subscriber';\nimport { isSubscription } from './Subscription';\nimport { observable as Symbol_observable } from './symbol/observable';\nimport { pipeFromArray } from './util/pipe';\nimport { config } from './config';\nimport { isFunction } from './util/isFunction';\nimport { errorContext } from './util/errorContext';\nvar Observable = (function () {\n function Observable(subscribe) {\n if (subscribe) {\n this._subscribe = subscribe;\n }\n }\n Observable.prototype.lift = function (operator) {\n var observable = new Observable();\n observable.source = this;\n observable.operator = operator;\n return observable;\n };\n Observable.prototype.subscribe = function (observerOrNext, error, complete) {\n var _this = this;\n var subscriber = isSubscriber(observerOrNext) ? observerOrNext : new SafeSubscriber(observerOrNext, error, complete);\n errorContext(function () {\n var _a = _this, operator = _a.operator, source = _a.source;\n subscriber.add(operator\n ?\n operator.call(subscriber, source)\n : source\n ?\n _this._subscribe(subscriber)\n :\n _this._trySubscribe(subscriber));\n });\n return subscriber;\n };\n Observable.prototype._trySubscribe = function (sink) {\n try {\n return this._subscribe(sink);\n }\n catch (err) {\n sink.error(err);\n }\n };\n Observable.prototype.forEach = function (next, promiseCtor) {\n var _this = this;\n promiseCtor = getPromiseCtor(promiseCtor);\n return new promiseCtor(function (resolve, reject) {\n var subscriber = new SafeSubscriber({\n next: function (value) {\n try {\n next(value);\n }\n catch (err) {\n reject(err);\n subscriber.unsubscribe();\n }\n },\n error: reject,\n complete: resolve,\n });\n _this.subscribe(subscriber);\n });\n };\n Observable.prototype._subscribe = function (subscriber) {\n var _a;\n return (_a = this.source) === null || _a === void 0 ? void 0 : _a.subscribe(subscriber);\n };\n Observable.prototype[Symbol_observable] = function () {\n return this;\n };\n Observable.prototype.pipe = function () {\n var operations = [];\n for (var _i = 0; _i < arguments.length; _i++) {\n operations[_i] = arguments[_i];\n }\n return pipeFromArray(operations)(this);\n };\n Observable.prototype.toPromise = function (promiseCtor) {\n var _this = this;\n promiseCtor = getPromiseCtor(promiseCtor);\n return new promiseCtor(function (resolve, reject) {\n var value;\n _this.subscribe(function (x) { return (value = x); }, function (err) { return reject(err); }, function () { return resolve(value); });\n });\n };\n Observable.create = function (subscribe) {\n return new Observable(subscribe);\n };\n return Observable;\n}());\nexport { Observable };\nfunction getPromiseCtor(promiseCtor) {\n var _a;\n return (_a = promiseCtor !== null && promiseCtor !== void 0 ? promiseCtor : config.Promise) !== null && _a !== void 0 ? _a : Promise;\n}\nfunction isObserver(value) {\n return value && isFunction(value.next) && isFunction(value.error) && isFunction(value.complete);\n}\nfunction isSubscriber(value) {\n return (value && value instanceof Subscriber) || (isObserver(value) && isSubscription(value));\n}\n//# sourceMappingURL=Observable.js.map","import { config } from '../config';\nvar context = null;\nexport function errorContext(cb) {\n if (config.useDeprecatedSynchronousErrorHandling) {\n var isRoot = !context;\n if (isRoot) {\n context = { errorThrown: false, error: null };\n }\n cb();\n if (isRoot) {\n var _a = context, errorThrown = _a.errorThrown, error = _a.error;\n context = null;\n if (errorThrown) {\n throw error;\n }\n }\n }\n else {\n cb();\n }\n}\nexport function captureError(err) {\n if (config.useDeprecatedSynchronousErrorHandling && context) {\n context.errorThrown = true;\n context.error = err;\n }\n}\n//# sourceMappingURL=errorContext.js.map","import { identity } from './identity';\nexport function pipe() {\n var fns = [];\n for (var _i = 0; _i < arguments.length; _i++) {\n fns[_i] = arguments[_i];\n }\n return pipeFromArray(fns);\n}\nexport function pipeFromArray(fns) {\n if (fns.length === 0) {\n return identity;\n }\n if (fns.length === 1) {\n return fns[0];\n }\n return function piped(input) {\n return fns.reduce(function (prev, fn) { return fn(prev); }, input);\n };\n}\n//# sourceMappingURL=pipe.js.map","import { observable as Symbol_observable } from '../symbol/observable';\nimport { isFunction } from './isFunction';\nexport function isInteropObservable(input) {\n return isFunction(input[Symbol_observable]);\n}\n//# sourceMappingURL=isInteropObservable.js.map","import { isFunction } from './isFunction';\nexport function isAsyncIterable(obj) {\n return Symbol.asyncIterator && isFunction(obj === null || obj === void 0 ? void 0 : obj[Symbol.asyncIterator]);\n}\n//# sourceMappingURL=isAsyncIterable.js.map","export function createInvalidObservableTypeError(input) {\n return new TypeError(\"You provided \" + (input !== null && typeof input === 'object' ? 'an invalid object' : \"'\" + input + \"'\") + \" where a stream was expected. You can provide an Observable, Promise, ReadableStream, Array, AsyncIterable, or Iterable.\");\n}\n//# sourceMappingURL=throwUnobservableError.js.map","export function getSymbolIterator() {\n if (typeof Symbol !== 'function' || !Symbol.iterator) {\n return '@@iterator';\n }\n return Symbol.iterator;\n}\nexport var iterator = getSymbolIterator();\n//# sourceMappingURL=iterator.js.map","import { iterator as Symbol_iterator } from '../symbol/iterator';\nimport { isFunction } from './isFunction';\nexport function isIterable(input) {\n return isFunction(input === null || input === void 0 ? void 0 : input[Symbol_iterator]);\n}\n//# sourceMappingURL=isIterable.js.map","import { __asyncGenerator, __await, __generator } from \"tslib\";\nimport { isFunction } from './isFunction';\nexport function readableStreamLikeToAsyncGenerator(readableStream) {\n return __asyncGenerator(this, arguments, function readableStreamLikeToAsyncGenerator_1() {\n var reader, _a, value, done;\n return __generator(this, function (_b) {\n switch (_b.label) {\n case 0:\n reader = readableStream.getReader();\n _b.label = 1;\n case 1:\n _b.trys.push([1, , 9, 10]);\n _b.label = 2;\n case 2:\n if (!true) return [3, 8];\n return [4, __await(reader.read())];\n case 3:\n _a = _b.sent(), value = _a.value, done = _a.done;\n if (!done) return [3, 5];\n return [4, __await(void 0)];\n case 4: return [2, _b.sent()];\n case 5: return [4, __await(value)];\n case 6: return [4, _b.sent()];\n case 7:\n _b.sent();\n return [3, 2];\n case 8: return [3, 10];\n case 9:\n reader.releaseLock();\n return [7];\n case 10: return [2];\n }\n });\n });\n}\nexport function isReadableStreamLike(obj) {\n return isFunction(obj === null || obj === void 0 ? void 0 : obj.getReader);\n}\n//# sourceMappingURL=isReadableStreamLike.js.map","import { __asyncValues, __awaiter, __generator, __values } from \"tslib\";\nimport { isArrayLike } from '../util/isArrayLike';\nimport { isPromise } from '../util/isPromise';\nimport { Observable } from '../Observable';\nimport { isInteropObservable } from '../util/isInteropObservable';\nimport { isAsyncIterable } from '../util/isAsyncIterable';\nimport { createInvalidObservableTypeError } from '../util/throwUnobservableError';\nimport { isIterable } from '../util/isIterable';\nimport { isReadableStreamLike, readableStreamLikeToAsyncGenerator } from '../util/isReadableStreamLike';\nimport { isFunction } from '../util/isFunction';\nimport { reportUnhandledError } from '../util/reportUnhandledError';\nimport { observable as Symbol_observable } from '../symbol/observable';\nexport function innerFrom(input) {\n if (input instanceof Observable) {\n return input;\n }\n if (input != null) {\n if (isInteropObservable(input)) {\n return fromInteropObservable(input);\n }\n if (isArrayLike(input)) {\n return fromArrayLike(input);\n }\n if (isPromise(input)) {\n return fromPromise(input);\n }\n if (isAsyncIterable(input)) {\n return fromAsyncIterable(input);\n }\n if (isIterable(input)) {\n return fromIterable(input);\n }\n if (isReadableStreamLike(input)) {\n return fromReadableStreamLike(input);\n }\n }\n throw createInvalidObservableTypeError(input);\n}\nexport function fromInteropObservable(obj) {\n return new Observable(function (subscriber) {\n var obs = obj[Symbol_observable]();\n if (isFunction(obs.subscribe)) {\n return obs.subscribe(subscriber);\n }\n throw new TypeError('Provided object does not correctly implement Symbol.observable');\n });\n}\nexport function fromArrayLike(array) {\n return new Observable(function (subscriber) {\n for (var i = 0; i < array.length && !subscriber.closed; i++) {\n subscriber.next(array[i]);\n }\n subscriber.complete();\n });\n}\nexport function fromPromise(promise) {\n return new Observable(function (subscriber) {\n promise\n .then(function (value) {\n if (!subscriber.closed) {\n subscriber.next(value);\n subscriber.complete();\n }\n }, function (err) { return subscriber.error(err); })\n .then(null, reportUnhandledError);\n });\n}\nexport function fromIterable(iterable) {\n return new Observable(function (subscriber) {\n var e_1, _a;\n try {\n for (var iterable_1 = __values(iterable), iterable_1_1 = iterable_1.next(); !iterable_1_1.done; iterable_1_1 = iterable_1.next()) {\n var value = iterable_1_1.value;\n subscriber.next(value);\n if (subscriber.closed) {\n return;\n }\n }\n }\n catch (e_1_1) { e_1 = { error: e_1_1 }; }\n finally {\n try {\n if (iterable_1_1 && !iterable_1_1.done && (_a = iterable_1.return)) _a.call(iterable_1);\n }\n finally { if (e_1) throw e_1.error; }\n }\n subscriber.complete();\n });\n}\nexport function fromAsyncIterable(asyncIterable) {\n return new Observable(function (subscriber) {\n process(asyncIterable, subscriber).catch(function (err) { return subscriber.error(err); });\n });\n}\nexport function fromReadableStreamLike(readableStream) {\n return fromAsyncIterable(readableStreamLikeToAsyncGenerator(readableStream));\n}\nfunction process(asyncIterable, subscriber) {\n var asyncIterable_1, asyncIterable_1_1;\n var e_2, _a;\n return __awaiter(this, void 0, void 0, function () {\n var value, e_2_1;\n return __generator(this, function (_b) {\n switch (_b.label) {\n case 0:\n _b.trys.push([0, 5, 6, 11]);\n asyncIterable_1 = __asyncValues(asyncIterable);\n _b.label = 1;\n case 1: return [4, asyncIterable_1.next()];\n case 2:\n if (!(asyncIterable_1_1 = _b.sent(), !asyncIterable_1_1.done)) return [3, 4];\n value = asyncIterable_1_1.value;\n subscriber.next(value);\n if (subscriber.closed) {\n return [2];\n }\n _b.label = 3;\n case 3: return [3, 1];\n case 4: return [3, 11];\n case 5:\n e_2_1 = _b.sent();\n e_2 = { error: e_2_1 };\n return [3, 11];\n case 6:\n _b.trys.push([6, , 9, 10]);\n if (!(asyncIterable_1_1 && !asyncIterable_1_1.done && (_a = asyncIterable_1.return))) return [3, 8];\n return [4, _a.call(asyncIterable_1)];\n case 7:\n _b.sent();\n _b.label = 8;\n case 8: return [3, 10];\n case 9:\n if (e_2) throw e_2.error;\n return [7];\n case 10: return [7];\n case 11:\n subscriber.complete();\n return [2];\n }\n });\n });\n}\n//# sourceMappingURL=innerFrom.js.map","import { __extends } from \"tslib\";\nimport { Subscriber } from '../Subscriber';\nexport function createOperatorSubscriber(destination, onNext, onComplete, onError, onFinalize) {\n return new OperatorSubscriber(destination, onNext, onComplete, onError, onFinalize);\n}\nvar OperatorSubscriber = (function (_super) {\n __extends(OperatorSubscriber, _super);\n function OperatorSubscriber(destination, onNext, onComplete, onError, onFinalize, shouldUnsubscribe) {\n var _this = _super.call(this, destination) || this;\n _this.onFinalize = onFinalize;\n _this.shouldUnsubscribe = shouldUnsubscribe;\n _this._next = onNext\n ? function (value) {\n try {\n onNext(value);\n }\n catch (err) {\n destination.error(err);\n }\n }\n : _super.prototype._next;\n _this._error = onError\n ? function (err) {\n try {\n onError(err);\n }\n catch (err) {\n destination.error(err);\n }\n finally {\n this.unsubscribe();\n }\n }\n : _super.prototype._error;\n _this._complete = onComplete\n ? function () {\n try {\n onComplete();\n }\n catch (err) {\n destination.error(err);\n }\n finally {\n this.unsubscribe();\n }\n }\n : _super.prototype._complete;\n return _this;\n }\n OperatorSubscriber.prototype.unsubscribe = function () {\n var _a;\n if (!this.shouldUnsubscribe || this.shouldUnsubscribe()) {\n var closed_1 = this.closed;\n _super.prototype.unsubscribe.call(this);\n !closed_1 && ((_a = this.onFinalize) === null || _a === void 0 ? void 0 : _a.call(this));\n }\n };\n return OperatorSubscriber;\n}(Subscriber));\nexport { OperatorSubscriber };\n//# sourceMappingURL=OperatorSubscriber.js.map","import { __extends } from \"tslib\";\nimport { Subscription } from '../Subscription';\nvar Action = (function (_super) {\n __extends(Action, _super);\n function Action(scheduler, work) {\n return _super.call(this) || this;\n }\n Action.prototype.schedule = function (state, delay) {\n if (delay === void 0) { delay = 0; }\n return this;\n };\n return Action;\n}(Subscription));\nexport { Action };\n//# sourceMappingURL=Action.js.map","import { __read, __spreadArray } from \"tslib\";\nexport var intervalProvider = {\n setInterval: function (handler, timeout) {\n var args = [];\n for (var _i = 2; _i < arguments.length; _i++) {\n args[_i - 2] = arguments[_i];\n }\n var delegate = intervalProvider.delegate;\n if (delegate === null || delegate === void 0 ? void 0 : delegate.setInterval) {\n return delegate.setInterval.apply(delegate, __spreadArray([handler, timeout], __read(args)));\n }\n return setInterval.apply(void 0, __spreadArray([handler, timeout], __read(args)));\n },\n clearInterval: function (handle) {\n var delegate = intervalProvider.delegate;\n return ((delegate === null || delegate === void 0 ? void 0 : delegate.clearInterval) || clearInterval)(handle);\n },\n delegate: undefined,\n};\n//# sourceMappingURL=intervalProvider.js.map","import { __extends } from \"tslib\";\nimport { Action } from './Action';\nimport { intervalProvider } from './intervalProvider';\nimport { arrRemove } from '../util/arrRemove';\nvar AsyncAction = (function (_super) {\n __extends(AsyncAction, _super);\n function AsyncAction(scheduler, work) {\n var _this = _super.call(this, scheduler, work) || this;\n _this.scheduler = scheduler;\n _this.work = work;\n _this.pending = false;\n return _this;\n }\n AsyncAction.prototype.schedule = function (state, delay) {\n if (delay === void 0) { delay = 0; }\n if (this.closed) {\n return this;\n }\n this.state = state;\n var id = this.id;\n var scheduler = this.scheduler;\n if (id != null) {\n this.id = this.recycleAsyncId(scheduler, id, delay);\n }\n this.pending = true;\n this.delay = delay;\n this.id = this.id || this.requestAsyncId(scheduler, this.id, delay);\n return this;\n };\n AsyncAction.prototype.requestAsyncId = function (scheduler, _id, delay) {\n if (delay === void 0) { delay = 0; }\n return intervalProvider.setInterval(scheduler.flush.bind(scheduler, this), delay);\n };\n AsyncAction.prototype.recycleAsyncId = function (_scheduler, id, delay) {\n if (delay === void 0) { delay = 0; }\n if (delay != null && this.delay === delay && this.pending === false) {\n return id;\n }\n intervalProvider.clearInterval(id);\n return undefined;\n };\n AsyncAction.prototype.execute = function (state, delay) {\n if (this.closed) {\n return new Error('executing a cancelled action');\n }\n this.pending = false;\n var error = this._execute(state, delay);\n if (error) {\n return error;\n }\n else if (this.pending === false && this.id != null) {\n this.id = this.recycleAsyncId(this.scheduler, this.id, null);\n }\n };\n AsyncAction.prototype._execute = function (state, _delay) {\n var errored = false;\n var errorValue;\n try {\n this.work(state);\n }\n catch (e) {\n errored = true;\n errorValue = e ? e : new Error('Scheduled action threw falsy error');\n }\n if (errored) {\n this.unsubscribe();\n return errorValue;\n }\n };\n AsyncAction.prototype.unsubscribe = function () {\n if (!this.closed) {\n var _a = this, id = _a.id, scheduler = _a.scheduler;\n var actions = scheduler.actions;\n this.work = this.state = this.scheduler = null;\n this.pending = false;\n arrRemove(actions, this);\n if (id != null) {\n this.id = this.recycleAsyncId(scheduler, id, null);\n }\n this.delay = null;\n _super.prototype.unsubscribe.call(this);\n }\n };\n return AsyncAction;\n}(Action));\nexport { AsyncAction };\n//# sourceMappingURL=AsyncAction.js.map","export var dateTimestampProvider = {\n now: function () {\n return (dateTimestampProvider.delegate || Date).now();\n },\n delegate: undefined,\n};\n//# sourceMappingURL=dateTimestampProvider.js.map","import { dateTimestampProvider } from './scheduler/dateTimestampProvider';\nvar Scheduler = (function () {\n function Scheduler(schedulerActionCtor, now) {\n if (now === void 0) { now = Scheduler.now; }\n this.schedulerActionCtor = schedulerActionCtor;\n this.now = now;\n }\n Scheduler.prototype.schedule = function (work, delay, state) {\n if (delay === void 0) { delay = 0; }\n return new this.schedulerActionCtor(this, work).schedule(state, delay);\n };\n Scheduler.now = dateTimestampProvider.now;\n return Scheduler;\n}());\nexport { Scheduler };\n//# sourceMappingURL=Scheduler.js.map","import { AsyncAction } from './AsyncAction';\nimport { AsyncScheduler } from './AsyncScheduler';\nexport var asyncScheduler = new AsyncScheduler(AsyncAction);\nexport var async = asyncScheduler;\n//# sourceMappingURL=async.js.map","import { __extends } from \"tslib\";\nimport { Scheduler } from '../Scheduler';\nvar AsyncScheduler = (function (_super) {\n __extends(AsyncScheduler, _super);\n function AsyncScheduler(SchedulerAction, now) {\n if (now === void 0) { now = Scheduler.now; }\n var _this = _super.call(this, SchedulerAction, now) || this;\n _this.actions = [];\n _this._active = false;\n _this._scheduled = undefined;\n return _this;\n }\n AsyncScheduler.prototype.flush = function (action) {\n var actions = this.actions;\n if (this._active) {\n actions.push(action);\n return;\n }\n var error;\n this._active = true;\n do {\n if ((error = action.execute(action.state, action.delay))) {\n break;\n }\n } while ((action = actions.shift()));\n this._active = false;\n if (error) {\n while ((action = actions.shift())) {\n action.unsubscribe();\n }\n throw error;\n }\n };\n return AsyncScheduler;\n}(Scheduler));\nexport { AsyncScheduler };\n//# sourceMappingURL=AsyncScheduler.js.map","import { isFunction } from './isFunction';\nexport function isScheduler(value) {\n return value && isFunction(value.schedule);\n}\n//# sourceMappingURL=isScheduler.js.map","import { Observable } from '../Observable';\nimport { async as asyncScheduler } from '../scheduler/async';\nimport { isScheduler } from '../util/isScheduler';\nimport { isValidDate } from '../util/isDate';\nexport function timer(dueTime, intervalOrScheduler, scheduler) {\n if (dueTime === void 0) { dueTime = 0; }\n if (scheduler === void 0) { scheduler = asyncScheduler; }\n var intervalDuration = -1;\n if (intervalOrScheduler != null) {\n if (isScheduler(intervalOrScheduler)) {\n scheduler = intervalOrScheduler;\n }\n else {\n intervalDuration = intervalOrScheduler;\n }\n }\n return new Observable(function (subscriber) {\n var due = isValidDate(dueTime) ? +dueTime - scheduler.now() : dueTime;\n if (due < 0) {\n due = 0;\n }\n var n = 0;\n return scheduler.schedule(function () {\n if (!subscriber.closed) {\n subscriber.next(n++);\n if (0 <= intervalDuration) {\n this.schedule(undefined, intervalDuration);\n }\n else {\n subscriber.complete();\n }\n }\n }, due);\n });\n}\n//# sourceMappingURL=timer.js.map","export function isValidDate(value) {\n return value instanceof Date && !isNaN(value);\n}\n//# sourceMappingURL=isDate.js.map","import { isFunction } from './isFunction';\nimport { isScheduler } from './isScheduler';\nfunction last(arr) {\n return arr[arr.length - 1];\n}\nexport function popResultSelector(args) {\n return isFunction(last(args)) ? args.pop() : undefined;\n}\nexport function popScheduler(args) {\n return isScheduler(last(args)) ? args.pop() : undefined;\n}\nexport function popNumber(args, defaultValue) {\n return typeof last(args) === 'number' ? args.pop() : defaultValue;\n}\n//# sourceMappingURL=args.js.map","export function executeSchedule(parentSubscription, scheduler, work, delay, repeat) {\n if (delay === void 0) { delay = 0; }\n if (repeat === void 0) { repeat = false; }\n var scheduleSubscription = scheduler.schedule(function () {\n work();\n if (repeat) {\n parentSubscription.add(this.schedule(null, delay));\n }\n else {\n this.unsubscribe();\n }\n }, delay);\n parentSubscription.add(scheduleSubscription);\n if (!repeat) {\n return scheduleSubscription;\n }\n}\n//# sourceMappingURL=executeSchedule.js.map","import { innerFrom } from '../observable/innerFrom';\nimport { createOperatorSubscriber } from './OperatorSubscriber';\nimport { operate } from '../util/lift';\nexport function catchError(selector) {\n return operate(function (source, subscriber) {\n var innerSub = null;\n var syncUnsub = false;\n var handledResult;\n innerSub = source.subscribe(createOperatorSubscriber(subscriber, undefined, undefined, function (err) {\n handledResult = innerFrom(selector(err, catchError(selector)(source)));\n if (innerSub) {\n innerSub.unsubscribe();\n innerSub = null;\n handledResult.subscribe(subscriber);\n }\n else {\n syncUnsub = true;\n }\n }));\n if (syncUnsub) {\n innerSub.unsubscribe();\n innerSub = null;\n handledResult.subscribe(subscriber);\n }\n });\n}\n//# sourceMappingURL=catchError.js.map","import { executeSchedule } from '../util/executeSchedule';\nimport { operate } from '../util/lift';\nimport { createOperatorSubscriber } from './OperatorSubscriber';\nexport function observeOn(scheduler, delay) {\n if (delay === void 0) { delay = 0; }\n return operate(function (source, subscriber) {\n source.subscribe(createOperatorSubscriber(subscriber, function (value) { return executeSchedule(subscriber, scheduler, function () { return subscriber.next(value); }, delay); }, function () { return executeSchedule(subscriber, scheduler, function () { return subscriber.complete(); }, delay); }, function (err) { return executeSchedule(subscriber, scheduler, function () { return subscriber.error(err); }, delay); }));\n });\n}\n//# sourceMappingURL=observeOn.js.map","import { operate } from '../util/lift';\nexport function subscribeOn(scheduler, delay) {\n if (delay === void 0) { delay = 0; }\n return operate(function (source, subscriber) {\n subscriber.add(scheduler.schedule(function () { return source.subscribe(subscriber); }, delay));\n });\n}\n//# sourceMappingURL=subscribeOn.js.map","import { Observable } from '../Observable';\nimport { executeSchedule } from '../util/executeSchedule';\nexport function scheduleAsyncIterable(input, scheduler) {\n if (!input) {\n throw new Error('Iterable cannot be null');\n }\n return new Observable(function (subscriber) {\n executeSchedule(subscriber, scheduler, function () {\n var iterator = input[Symbol.asyncIterator]();\n executeSchedule(subscriber, scheduler, function () {\n iterator.next().then(function (result) {\n if (result.done) {\n subscriber.complete();\n }\n else {\n subscriber.next(result.value);\n }\n });\n }, 0, true);\n });\n });\n}\n//# sourceMappingURL=scheduleAsyncIterable.js.map","import { scheduleObservable } from './scheduleObservable';\nimport { schedulePromise } from './schedulePromise';\nimport { scheduleArray } from './scheduleArray';\nimport { scheduleIterable } from './scheduleIterable';\nimport { scheduleAsyncIterable } from './scheduleAsyncIterable';\nimport { isInteropObservable } from '../util/isInteropObservable';\nimport { isPromise } from '../util/isPromise';\nimport { isArrayLike } from '../util/isArrayLike';\nimport { isIterable } from '../util/isIterable';\nimport { isAsyncIterable } from '../util/isAsyncIterable';\nimport { createInvalidObservableTypeError } from '../util/throwUnobservableError';\nimport { isReadableStreamLike } from '../util/isReadableStreamLike';\nimport { scheduleReadableStreamLike } from './scheduleReadableStreamLike';\nexport function scheduled(input, scheduler) {\n if (input != null) {\n if (isInteropObservable(input)) {\n return scheduleObservable(input, scheduler);\n }\n if (isArrayLike(input)) {\n return scheduleArray(input, scheduler);\n }\n if (isPromise(input)) {\n return schedulePromise(input, scheduler);\n }\n if (isAsyncIterable(input)) {\n return scheduleAsyncIterable(input, scheduler);\n }\n if (isIterable(input)) {\n return scheduleIterable(input, scheduler);\n }\n if (isReadableStreamLike(input)) {\n return scheduleReadableStreamLike(input, scheduler);\n }\n }\n throw createInvalidObservableTypeError(input);\n}\n//# sourceMappingURL=scheduled.js.map","import { innerFrom } from '../observable/innerFrom';\nimport { observeOn } from '../operators/observeOn';\nimport { subscribeOn } from '../operators/subscribeOn';\nexport function scheduleObservable(input, scheduler) {\n return innerFrom(input).pipe(subscribeOn(scheduler), observeOn(scheduler));\n}\n//# sourceMappingURL=scheduleObservable.js.map","import { Observable } from '../Observable';\nexport function scheduleArray(input, scheduler) {\n return new Observable(function (subscriber) {\n var i = 0;\n return scheduler.schedule(function () {\n if (i === input.length) {\n subscriber.complete();\n }\n else {\n subscriber.next(input[i++]);\n if (!subscriber.closed) {\n this.schedule();\n }\n }\n });\n });\n}\n//# sourceMappingURL=scheduleArray.js.map","import { innerFrom } from '../observable/innerFrom';\nimport { observeOn } from '../operators/observeOn';\nimport { subscribeOn } from '../operators/subscribeOn';\nexport function schedulePromise(input, scheduler) {\n return innerFrom(input).pipe(subscribeOn(scheduler), observeOn(scheduler));\n}\n//# sourceMappingURL=schedulePromise.js.map","import { Observable } from '../Observable';\nimport { iterator as Symbol_iterator } from '../symbol/iterator';\nimport { isFunction } from '../util/isFunction';\nimport { executeSchedule } from '../util/executeSchedule';\nexport function scheduleIterable(input, scheduler) {\n return new Observable(function (subscriber) {\n var iterator;\n executeSchedule(subscriber, scheduler, function () {\n iterator = input[Symbol_iterator]();\n executeSchedule(subscriber, scheduler, function () {\n var _a;\n var value;\n var done;\n try {\n (_a = iterator.next(), value = _a.value, done = _a.done);\n }\n catch (err) {\n subscriber.error(err);\n return;\n }\n if (done) {\n subscriber.complete();\n }\n else {\n subscriber.next(value);\n }\n }, 0, true);\n });\n return function () { return isFunction(iterator === null || iterator === void 0 ? void 0 : iterator.return) && iterator.return(); };\n });\n}\n//# sourceMappingURL=scheduleIterable.js.map","import { scheduleAsyncIterable } from './scheduleAsyncIterable';\nimport { readableStreamLikeToAsyncGenerator } from '../util/isReadableStreamLike';\nexport function scheduleReadableStreamLike(input, scheduler) {\n return scheduleAsyncIterable(readableStreamLikeToAsyncGenerator(input), scheduler);\n}\n//# sourceMappingURL=scheduleReadableStreamLike.js.map","import { operate } from '../util/lift';\nimport { createOperatorSubscriber } from './OperatorSubscriber';\nexport function map(project, thisArg) {\n return operate(function (source, subscriber) {\n var index = 0;\n source.subscribe(createOperatorSubscriber(subscriber, function (value) {\n subscriber.next(project.call(thisArg, value, index++));\n }));\n });\n}\n//# sourceMappingURL=map.js.map","import { map } from './map';\nimport { innerFrom } from '../observable/innerFrom';\nimport { operate } from '../util/lift';\nimport { mergeInternals } from './mergeInternals';\nimport { isFunction } from '../util/isFunction';\nexport function mergeMap(project, resultSelector, concurrent) {\n if (concurrent === void 0) { concurrent = Infinity; }\n if (isFunction(resultSelector)) {\n return mergeMap(function (a, i) { return map(function (b, ii) { return resultSelector(a, b, i, ii); })(innerFrom(project(a, i))); }, concurrent);\n }\n else if (typeof resultSelector === 'number') {\n concurrent = resultSelector;\n }\n return operate(function (source, subscriber) { return mergeInternals(source, subscriber, project, concurrent); });\n}\n//# sourceMappingURL=mergeMap.js.map","import { innerFrom } from '../observable/innerFrom';\nimport { executeSchedule } from '../util/executeSchedule';\nimport { createOperatorSubscriber } from './OperatorSubscriber';\nexport function mergeInternals(source, subscriber, project, concurrent, onBeforeNext, expand, innerSubScheduler, additionalFinalizer) {\n var buffer = [];\n var active = 0;\n var index = 0;\n var isComplete = false;\n var checkComplete = function () {\n if (isComplete && !buffer.length && !active) {\n subscriber.complete();\n }\n };\n var outerNext = function (value) { return (active < concurrent ? doInnerSub(value) : buffer.push(value)); };\n var doInnerSub = function (value) {\n expand && subscriber.next(value);\n active++;\n var innerComplete = false;\n innerFrom(project(value, index++)).subscribe(createOperatorSubscriber(subscriber, function (innerValue) {\n onBeforeNext === null || onBeforeNext === void 0 ? void 0 : onBeforeNext(innerValue);\n if (expand) {\n outerNext(innerValue);\n }\n else {\n subscriber.next(innerValue);\n }\n }, function () {\n innerComplete = true;\n }, undefined, function () {\n if (innerComplete) {\n try {\n active--;\n var _loop_1 = function () {\n var bufferedValue = buffer.shift();\n if (innerSubScheduler) {\n executeSchedule(subscriber, innerSubScheduler, function () { return doInnerSub(bufferedValue); });\n }\n else {\n doInnerSub(bufferedValue);\n }\n };\n while (buffer.length && active < concurrent) {\n _loop_1();\n }\n checkComplete();\n }\n catch (err) {\n subscriber.error(err);\n }\n }\n }));\n };\n source.subscribe(createOperatorSubscriber(subscriber, outerNext, function () {\n isComplete = true;\n checkComplete();\n }));\n return function () {\n additionalFinalizer === null || additionalFinalizer === void 0 ? void 0 : additionalFinalizer();\n };\n}\n//# sourceMappingURL=mergeInternals.js.map","import { mergeAll } from './mergeAll';\nexport function concatAll() {\n return mergeAll(1);\n}\n//# sourceMappingURL=concatAll.js.map","import { mergeMap } from './mergeMap';\nimport { identity } from '../util/identity';\nexport function mergeAll(concurrent) {\n if (concurrent === void 0) { concurrent = Infinity; }\n return mergeMap(identity, concurrent);\n}\n//# sourceMappingURL=mergeAll.js.map","import { asyncScheduler } from '../scheduler/async';\nimport { operate } from '../util/lift';\nimport { createOperatorSubscriber } from './OperatorSubscriber';\nexport function debounceTime(dueTime, scheduler) {\n if (scheduler === void 0) { scheduler = asyncScheduler; }\n return operate(function (source, subscriber) {\n var activeTask = null;\n var lastValue = null;\n var lastTime = null;\n var emit = function () {\n if (activeTask) {\n activeTask.unsubscribe();\n activeTask = null;\n var value = lastValue;\n lastValue = null;\n subscriber.next(value);\n }\n };\n function emitWhenIdle() {\n var targetTime = lastTime + dueTime;\n var now = scheduler.now();\n if (now < targetTime) {\n activeTask = this.schedule(undefined, targetTime - now);\n subscriber.add(activeTask);\n return;\n }\n emit();\n }\n source.subscribe(createOperatorSubscriber(subscriber, function (value) {\n lastValue = value;\n lastTime = scheduler.now();\n if (!activeTask) {\n activeTask = scheduler.schedule(emitWhenIdle, dueTime);\n subscriber.add(activeTask);\n }\n }, function () {\n emit();\n subscriber.complete();\n }, undefined, function () {\n lastValue = activeTask = null;\n }));\n });\n}\n//# sourceMappingURL=debounceTime.js.map","import { concatAll } from '../operators/concatAll';\nimport { popScheduler } from '../util/args';\nimport { from } from './from';\nexport function concat() {\n var args = [];\n for (var _i = 0; _i < arguments.length; _i++) {\n args[_i] = arguments[_i];\n }\n return concatAll()(from(args, popScheduler(args)));\n}\n//# sourceMappingURL=concat.js.map","import { scheduled } from '../scheduled/scheduled';\nimport { innerFrom } from './innerFrom';\nexport function from(input, scheduler) {\n return scheduler ? scheduled(input, scheduler) : innerFrom(input);\n}\n//# sourceMappingURL=from.js.map","import { Observable } from '../Observable';\nexport var EMPTY = new Observable(function (subscriber) { return subscriber.complete(); });\nexport function empty(scheduler) {\n return scheduler ? emptyScheduled(scheduler) : EMPTY;\n}\nfunction emptyScheduled(scheduler) {\n return new Observable(function (subscriber) { return scheduler.schedule(function () { return subscriber.complete(); }); });\n}\n//# sourceMappingURL=empty.js.map","import { EMPTY } from '../observable/empty';\nimport { operate } from '../util/lift';\nimport { createOperatorSubscriber } from './OperatorSubscriber';\nexport function take(count) {\n return count <= 0\n ?\n function () { return EMPTY; }\n : operate(function (source, subscriber) {\n var seen = 0;\n source.subscribe(createOperatorSubscriber(subscriber, function (value) {\n if (++seen <= count) {\n subscriber.next(value);\n if (count <= seen) {\n subscriber.complete();\n }\n }\n }));\n });\n}\n//# sourceMappingURL=take.js.map","import { concat } from '../observable/concat';\nimport { take } from './take';\nimport { ignoreElements } from './ignoreElements';\nimport { mapTo } from './mapTo';\nimport { mergeMap } from './mergeMap';\nexport function delayWhen(delayDurationSelector, subscriptionDelay) {\n if (subscriptionDelay) {\n return function (source) {\n return concat(subscriptionDelay.pipe(take(1), ignoreElements()), source.pipe(delayWhen(delayDurationSelector)));\n };\n }\n return mergeMap(function (value, index) { return delayDurationSelector(value, index).pipe(take(1), mapTo(value)); });\n}\n//# sourceMappingURL=delayWhen.js.map","import { operate } from '../util/lift';\nimport { createOperatorSubscriber } from './OperatorSubscriber';\nimport { noop } from '../util/noop';\nexport function ignoreElements() {\n return operate(function (source, subscriber) {\n source.subscribe(createOperatorSubscriber(subscriber, noop));\n });\n}\n//# sourceMappingURL=ignoreElements.js.map","import { map } from './map';\nexport function mapTo(value) {\n return map(function () { return value; });\n}\n//# sourceMappingURL=mapTo.js.map","import { asyncScheduler } from '../scheduler/async';\nimport { delayWhen } from './delayWhen';\nimport { timer } from '../observable/timer';\nexport function delay(due, scheduler) {\n if (scheduler === void 0) { scheduler = asyncScheduler; }\n var duration = timer(due, scheduler);\n return delayWhen(function () { return duration; });\n}\n//# sourceMappingURL=delay.js.map","import { identity } from '../util/identity';\nimport { operate } from '../util/lift';\nimport { createOperatorSubscriber } from './OperatorSubscriber';\nexport function distinctUntilChanged(comparator, keySelector) {\n if (keySelector === void 0) { keySelector = identity; }\n comparator = comparator !== null && comparator !== void 0 ? comparator : defaultCompare;\n return operate(function (source, subscriber) {\n var previousKey;\n var first = true;\n source.subscribe(createOperatorSubscriber(subscriber, function (value) {\n var currentKey = keySelector(value);\n if (first || !comparator(previousKey, currentKey)) {\n first = false;\n previousKey = currentKey;\n subscriber.next(value);\n }\n }));\n });\n}\nfunction defaultCompare(a, b) {\n return a === b;\n}\n//# sourceMappingURL=distinctUntilChanged.js.map","import { operate } from '../util/lift';\nimport { createOperatorSubscriber } from './OperatorSubscriber';\nexport function filter(predicate, thisArg) {\n return operate(function (source, subscriber) {\n var index = 0;\n source.subscribe(createOperatorSubscriber(subscriber, function (value) { return predicate.call(thisArg, value, index++) && subscriber.next(value); }));\n });\n}\n//# sourceMappingURL=filter.js.map","import { filter } from './filter';\nexport function skip(count) {\n return filter(function (_, index) { return count <= index; });\n}\n//# sourceMappingURL=skip.js.map","import { concat } from '../observable/concat';\nimport { popScheduler } from '../util/args';\nimport { operate } from '../util/lift';\nexport function startWith() {\n var values = [];\n for (var _i = 0; _i < arguments.length; _i++) {\n values[_i] = arguments[_i];\n }\n var scheduler = popScheduler(values);\n return operate(function (source, subscriber) {\n (scheduler ? concat(values, source, scheduler) : concat(values, source)).subscribe(subscriber);\n });\n}\n//# sourceMappingURL=startWith.js.map","import { innerFrom } from '../observable/innerFrom';\nimport { operate } from '../util/lift';\nimport { createOperatorSubscriber } from './OperatorSubscriber';\nexport function switchMap(project, resultSelector) {\n return operate(function (source, subscriber) {\n var innerSubscriber = null;\n var index = 0;\n var isComplete = false;\n var checkComplete = function () { return isComplete && !innerSubscriber && subscriber.complete(); };\n source.subscribe(createOperatorSubscriber(subscriber, function (value) {\n innerSubscriber === null || innerSubscriber === void 0 ? void 0 : innerSubscriber.unsubscribe();\n var innerIndex = 0;\n var outerIndex = index++;\n innerFrom(project(value, outerIndex)).subscribe((innerSubscriber = createOperatorSubscriber(subscriber, function (innerValue) { return subscriber.next(resultSelector ? resultSelector(value, innerValue, outerIndex, innerIndex++) : innerValue); }, function () {\n innerSubscriber = null;\n checkComplete();\n })));\n }, function () {\n isComplete = true;\n checkComplete();\n }));\n });\n}\n//# sourceMappingURL=switchMap.js.map","import { isFunction } from '../util/isFunction';\nimport { operate } from '../util/lift';\nimport { createOperatorSubscriber } from './OperatorSubscriber';\nimport { identity } from '../util/identity';\nexport function tap(observerOrNext, error, complete) {\n var tapObserver = isFunction(observerOrNext) || error || complete\n ?\n { next: observerOrNext, error: error, complete: complete }\n : observerOrNext;\n return tapObserver\n ? operate(function (source, subscriber) {\n var _a;\n (_a = tapObserver.subscribe) === null || _a === void 0 ? void 0 : _a.call(tapObserver);\n var isUnsub = true;\n source.subscribe(createOperatorSubscriber(subscriber, function (value) {\n var _a;\n (_a = tapObserver.next) === null || _a === void 0 ? void 0 : _a.call(tapObserver, value);\n subscriber.next(value);\n }, function () {\n var _a;\n isUnsub = false;\n (_a = tapObserver.complete) === null || _a === void 0 ? void 0 : _a.call(tapObserver);\n subscriber.complete();\n }, function (err) {\n var _a;\n isUnsub = false;\n (_a = tapObserver.error) === null || _a === void 0 ? void 0 : _a.call(tapObserver, err);\n subscriber.error(err);\n }, function () {\n var _a, _b;\n if (isUnsub) {\n (_a = tapObserver.unsubscribe) === null || _a === void 0 ? void 0 : _a.call(tapObserver);\n }\n (_b = tapObserver.finalize) === null || _b === void 0 ? void 0 : _b.call(tapObserver);\n }));\n })\n :\n identity;\n}\n//# sourceMappingURL=tap.js.map","import { DexieCloudDB } from '../db/DexieCloudDB';\n\n//const hasSW = 'serviceWorker' in navigator;\nlet hasComplainedAboutSyncEvent = false;\n\nexport async function registerSyncEvent(db: DexieCloudDB, purpose: \"push\" | \"pull\") {\n try {\n // Send sync event to SW:\n const sw: ServiceWorkerRegistration & {sync?: any} = await navigator.serviceWorker.ready;\n if (purpose === \"push\" && sw.sync) {\n await sw.sync.register(`dexie-cloud:${db.name}`);\n }\n if (sw.active) {\n // Use postMessage for pull syncs and for browsers not supporting sync event (Firefox, Safari).\n // Also chromium based browsers with sw.sync as a fallback for sleepy sync events not taking action for a while.\n sw.active.postMessage({\n type: 'dexie-cloud-sync',\n dbName: db.name,\n purpose\n });\n } else {\n throw new Error(`Failed to trigger sync - there's no active service worker`);\n }\n return;\n } catch (e) {\n if (!hasComplainedAboutSyncEvent) {\n console.debug(`Dexie Cloud: Could not register sync event`, e);\n hasComplainedAboutSyncEvent = true;\n }\n }\n}\n\nexport async function registerPeriodicSyncEvent(db: DexieCloudDB) {\n try {\n // Register periodicSync event to SW:\n // @ts-ignore\n const { periodicSync } = await navigator.serviceWorker.ready;\n if (periodicSync) {\n try {\n await periodicSync.register(\n `dexie-cloud:${db.name}`,\n db.cloud.options?.periodicSync\n );\n console.debug(\n `Dexie Cloud: Successfully registered periodicsync event for ${db.name}`\n );\n } catch (e) {\n console.debug(`Dexie Cloud: Failed to register periodic sync. Your PWA must be installed to allow background sync.`, e);\n }\n } else {\n console.debug(`Dexie Cloud: periodicSync not supported.`);\n }\n } catch (e) {\n console.debug(\n `Dexie Cloud: Could not register periodicSync for ${db.name}`,\n e\n );\n }\n}\n","import { DexieCloudDB } from \"../db/DexieCloudDB\";\nimport { registerSyncEvent } from \"./registerSyncEvent\";\n\nexport function triggerSync(db: DexieCloudDB, purpose: \"push\" | \"pull\") {\n if (db.cloud.usingServiceWorker) {\n console.debug('registering sync event');\n registerSyncEvent(db, purpose);\n } else {\n db.localSyncEvent.next({purpose});\n }\n}","const hasArrayBufferFromBase64 = \"fromBase64\" in Uint8Array; // https://github.com/tc39/proposal-arraybuffer-base64;\nconst hasArrayBufferToBase64 = \"toBase64\" in Uint8Array.prototype; // https://github.com/tc39/proposal-arraybuffer-base64;\nexport const b64decode = typeof Buffer !== \"undefined\"\n ? (base64) => Buffer.from(base64, \"base64\") // Node\n : hasArrayBufferFromBase64\n ? // @ts-ignore: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Uint8Array/fromBase64\n (base64) => Uint8Array.fromBase64(base64) // Modern javascript standard\n : (base64) => {\n // Legacy DOM workaround\n const binary_string = atob(base64);\n const len = binary_string.length;\n const bytes = new Uint8Array(len);\n for (var i = 0; i < len; i++) {\n bytes[i] = binary_string.charCodeAt(i);\n }\n return bytes;\n };\nexport const b64encode = typeof Buffer !== \"undefined\"\n ? (b) => {\n // Node\n if (ArrayBuffer.isView(b)) {\n return Buffer.from(b.buffer, b.byteOffset, b.byteLength).toString(\"base64\");\n }\n else {\n return Buffer.from(b).toString(\"base64\");\n }\n }\n : hasArrayBufferToBase64\n ? (b) => {\n // Uint8Array.prototype.toBase64 is available in modern browsers\n const u8a = ArrayBuffer.isView(b) ? b : new Uint8Array(b);\n // @ts-ignore: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Uint8Array/toBase64\n return u8a.toBase64();\n }\n : (b) => {\n // Legacy DOM workaround\n const u8a = ArrayBuffer.isView(b) ? b : new Uint8Array(b);\n const CHUNK_SIZE = 0x1000;\n const strs = [];\n for (let i = 0, l = u8a.length; i < l; i += CHUNK_SIZE) {\n const chunk = u8a.subarray(i, i + CHUNK_SIZE);\n strs.push(String.fromCharCode.apply(null, chunk));\n }\n return btoa(strs.join(\"\"));\n };\n","import { PersistedSyncState } from '../db/entities/PersistedSyncState';\nimport { b64encode } from 'dreambase-library/dist/common/base64';\n\nexport async function computeRealmSetHash({\n realms,\n inviteRealms,\n}: PersistedSyncState) {\n const data = JSON.stringify(\n [\n ...realms.map((realmId) => ({ realmId, accepted: true })),\n ...inviteRealms.map((realmId) => ({ realmId, accepted: false })),\n ].sort((a, b) =>\n a.realmId < b.realmId ? -1 : a.realmId > b.realmId ? 1 : 0\n )\n );\n const byteArray = new TextEncoder().encode(data);\n const digestBytes = await crypto.subtle.digest('SHA-1', byteArray);\n const base64 = b64encode(digestBytes);\n return base64;\n}\n","import { IndexableType, Table } from \"dexie\";\nimport { DexieCloudDB } from \"../db/DexieCloudDB\";\nimport { EntityCommon } from \"../db/entities/EntityCommon\";\n\nexport function getSyncableTables(db: DexieCloudDB): Table<EntityCommon>[] {\n return Object.entries(db.cloud.schema || {})\n .filter(([, { markedForSync }]) => markedForSync)\n .map(([tbl]) => db.tables.filter(({name}) => name === tbl)[0])\n .filter(cloudTableSchema => cloudTableSchema);\n}\n","\n\nexport function getMutationTable(tableName: string) {\n return `$${tableName}_mutations`;\n}\n","\n\nexport function getTableFromMutationTable(mutationTable: string) {\n const tableName = /^\\$(.*)_mutations$/.exec(mutationTable)?.[1];\n if (!tableName) throw new Error(`Given mutationTable ${mutationTable} is not correct`);\n return tableName;\n}\n","const concat = [].concat;\nexport function flatten<T>(a: (T | T[])[]): T[] {\n return concat.apply([], a);\n}\n","import { Table } from 'dexie';\nimport { getTableFromMutationTable } from '../helpers/getTableFromMutationTable';\nimport { DexieCloudDB } from '../db/DexieCloudDB';\nimport { DBOperation, DBOperationsSet } from 'dexie-cloud-common';\nimport { flatten } from '../helpers/flatten';\n\nexport async function listClientChanges(\n mutationTables: Table[],\n db: DexieCloudDB,\n { since = {} as { [table: string]: number }, limit = Infinity } = {}\n): Promise<DBOperationsSet> {\n const allMutsOnTables = await Promise.all(\n mutationTables.map(async (mutationTable) => {\n const tableName = getTableFromMutationTable(mutationTable.name);\n const lastRevision = since[tableName];\n\n let query = lastRevision\n ? mutationTable.where('rev').above(lastRevision)\n : mutationTable;\n\n if (limit < Infinity) query = query.limit(limit);\n\n const muts: DBOperation[] = await query.toArray();\n\n //const objTable = db.table(tableName);\n /*for (const mut of muts) {\n if (mut.type === \"insert\" || mut.type === \"upsert\") {\n mut.values = await objTable.bulkGet(mut.keys);\n }\n }*/\n return muts.map((mut) => ({\n table: tableName,\n mut,\n }));\n })\n );\n\n // Sort by time to get a true order of the operations (between tables)\n const sorted = flatten(allMutsOnTables).sort((a, b) => a.mut.txid === b.mut.txid\n ? a.mut.opNo! - b.mut.opNo! // Within same transaction, sort by opNo\n : a.mut.ts! - b.mut.ts! // Different transactions - sort by timestamp when mutation resolved\n );\n const result: DBOperationsSet = [];\n let currentEntry: {\n table: string;\n muts: DBOperation[];\n } | null = null;\n let currentTxid: string | null = null;\n for (const { table, mut } of sorted) {\n if (\n currentEntry &&\n currentEntry.table === table &&\n currentTxid === mut.txid\n ) {\n currentEntry.muts.push(mut);\n } else {\n currentEntry = {\n table,\n muts: [mut],\n };\n currentTxid = mut.txid!;\n result.push(currentEntry);\n }\n }\n\n // Filter out those tables that doesn't have any mutations:\n return result;\n}\n","export function randomString(bytes: number) {\n const buf = new Uint8Array(bytes);\n if (typeof crypto !== 'undefined') {\n crypto.getRandomValues(buf);\n } else {\n for (let i = 0; i < bytes; i++) buf[i] = Math.floor(Math.random() * 256);\n }\n if (typeof Buffer !== 'undefined' && Buffer.from) {\n return Buffer.from(buf).toString('base64');\n } else if (typeof btoa !== 'undefined') {\n return btoa(String.fromCharCode.apply(null, buf));\n } else {\n throw new Error('No btoa or Buffer available');\n }\n}\n","export function assert(b) {\n if (!b)\n throw new Error('Assertion Failed');\n}\nconst _hasOwn = {}.hasOwnProperty;\nexport function hasOwn(obj, prop) {\n return _hasOwn.call(obj, prop);\n}\nexport function setByKeyPath(obj, keyPath, value) {\n if (!obj || keyPath === undefined)\n return;\n if ('isFrozen' in Object && Object.isFrozen(obj))\n return;\n if (typeof keyPath !== 'string' && 'length' in keyPath) {\n assert(typeof value !== 'string' && 'length' in value);\n for (var i = 0, l = keyPath.length; i < l; ++i) {\n setByKeyPath(obj, keyPath[i], value[i]);\n }\n }\n else {\n var period = keyPath.indexOf('.');\n if (period !== -1) {\n var currentKeyPath = keyPath.substr(0, period);\n var remainingKeyPath = keyPath.substr(period + 1);\n if (remainingKeyPath === '')\n if (value === undefined) {\n if (Array.isArray(obj)) {\n if (!isNaN(parseInt(currentKeyPath)))\n obj.splice(parseInt(currentKeyPath), 1);\n }\n else\n delete obj[currentKeyPath];\n // @ts-ignore: even if currentKeyPath would be numeric string and obj would be array - it works.\n }\n else\n obj[currentKeyPath] = value;\n else {\n //@ts-ignore: even if currentKeyPath would be numeric string and obj would be array - it works.\n var innerObj = obj[currentKeyPath];\n //@ts-ignore: even if currentKeyPath would be numeric string and obj would be array - it works.\n if (!innerObj || !hasOwn(obj, currentKeyPath))\n innerObj = (obj[currentKeyPath] = {});\n setByKeyPath(innerObj, remainingKeyPath, value);\n }\n }\n else {\n if (value === undefined) {\n if (Array.isArray(obj) && !isNaN(parseInt(keyPath)))\n // @ts-ignore: even if currentKeyPath would be numeric string and obj would be array - it works.\n obj.splice(keyPath, 1);\n //@ts-ignore: even if currentKeyPath would be numeric string and obj would be array - it works.\n else\n delete obj[keyPath];\n //@ts-ignore: even if currentKeyPath would be numeric string and obj would be array - it works.\n }\n else\n obj[keyPath] = value;\n }\n }\n}\nexport const randomString = typeof self !== 'undefined' && typeof crypto !== 'undefined' ? (bytes, randomFill = crypto.getRandomValues.bind(crypto)) => {\n // Web\n const buf = new Uint8Array(bytes);\n randomFill(buf);\n return self.btoa(String.fromCharCode.apply(null, buf));\n} : typeof Buffer !== 'undefined' ? (bytes, randomFill = simpleRandomFill) => {\n // Node\n const buf = Buffer.alloc(bytes);\n randomFill(buf);\n return buf.toString(\"base64\");\n} : () => { throw new Error(\"No implementation of randomString was found\"); };\nfunction simpleRandomFill(buf) {\n for (let i = 0; i < buf.length; ++i) {\n buf[i] = Math.floor(Math.random() * 256);\n }\n}\n","const validIDTypes = {\n Uint8Array,\n};\n/** Verifies that given primary key is valid.\n * The reason we narrow validity for valid keys are twofold:\n * 1: Make sure to only support types that can be used as an object index in DBKeyMutationSet.\n * For example, ArrayBuffer cannot be used (gives \"object ArrayBuffer\") but Uint8Array can be\n * used (gives comma-delimited list of included bytes).\n * 2: Avoid using plain numbers and Dates as keys when they are synced, as they are not globally unique.\n * 3: Since we store the key as a VARCHAR server side in current version, try not promote types that stringifies to become very long server side.\n *\n * @param id\n * @returns\n */\nexport function isValidSyncableID(id) {\n if (typeof id === \"string\")\n return true;\n //if (validIDTypes[toStringTag(id)]) return true;\n //if (Array.isArray(id)) return id.every((part) => isValidSyncableID(part));\n if (Array.isArray(id) && id.some(key => isValidSyncableID(key)) && id.every(isValidSyncableIDPart))\n return true;\n return false;\n}\n/** Verifies that given key part is valid.\n * 1: Make sure that arrays of this types are stringified correclty and works with DBKeyMutationSet.\n * For example, ArrayBuffer cannot be used (gives \"object ArrayBuffer\") but Uint8Array can be\n * used (gives comma-delimited list of included bytes).\n * 2: Since we store the key as a VARCHAR server side in current version, try not promote types that stringifies to become very long server side.\n*/\nfunction isValidSyncableIDPart(part) {\n return typeof part === \"string\" || typeof part === \"number\" || Array.isArray(part) && part.every(isValidSyncableIDPart);\n}\nexport function isValidAtID(id, idPrefix) {\n return !idPrefix || (typeof id === \"string\" && id.startsWith(idPrefix));\n}\n","import { setByKeyPath } from \"../utils.js\";\nexport function applyOperation(target, table, op) {\n const tbl = target[table] || (target[table] = {});\n const keys = op.keys.map(key => typeof key === 'string' ? key : JSON.stringify(key));\n switch (op.type) {\n case \"insert\":\n // TODO: Don't treat insert and upsert the same?\n case \"upsert\":\n keys.forEach((key, idx) => {\n tbl[key] = {\n type: \"ups\",\n val: op.values[idx],\n };\n });\n break;\n case \"update\":\n case \"modify\": {\n keys.forEach((key, idx) => {\n const changeSpec = op.type === \"update\"\n ? op.changeSpecs[idx]\n : op.changeSpec;\n const entry = tbl[key];\n if (!entry) {\n tbl[key] = {\n type: \"upd\",\n mod: changeSpec,\n };\n }\n else {\n switch (entry.type) {\n case \"ups\":\n // Adjust the existing upsert with additional updates\n for (const [propPath, value] of Object.entries(changeSpec)) {\n setByKeyPath(entry.val, propPath, value);\n }\n break;\n case \"del\":\n // No action.\n break;\n case \"upd\":\n // Adjust existing update with additional updates\n Object.assign(entry.mod, changeSpec); // May work for deep props as well - new keys is added later, right? Does the prop order persist along TSON and all? But it will not be 100% when combined with some server code (seach for \"address.city\": \"Stockholm\" comment)\n break;\n }\n }\n });\n break;\n }\n case \"delete\":\n keys.forEach((key) => {\n tbl[key] = {\n type: \"del\",\n };\n });\n break;\n }\n return target;\n}\n","import { applyOperation } from \"./applyOperation.js\";\nexport function applyOperations(target, ops) {\n for (const { table, muts } of ops) {\n for (const mut of muts) {\n applyOperation(target, table, mut);\n }\n }\n}\n","/**\n * Common Math expressions.\n *\n * @module math\n */\n\nexport const floor = Math.floor\nexport const ceil = Math.ceil\nexport const abs = Math.abs\nexport const imul = Math.imul\nexport const round = Math.round\nexport const log10 = Math.log10\nexport const log2 = Math.log2\nexport const log = Math.log\nexport const sqrt = Math.sqrt\n\n/**\n * @function\n * @param {number} a\n * @param {number} b\n * @return {number} The sum of a and b\n */\nexport const add = (a, b) => a + b\n\n/**\n * @function\n * @param {number} a\n * @param {number} b\n * @return {number} The smaller element of a and b\n */\nexport const min = (a, b) => a < b ? a : b\n\n/**\n * @function\n * @param {number} a\n * @param {number} b\n * @return {number} The bigger element of a and b\n */\nexport const max = (a, b) => a > b ? a : b\n\nexport const isNaN = Number.isNaN\n\nexport const pow = Math.pow\n/**\n * Base 10 exponential function. Returns the value of 10 raised to the power of pow.\n *\n * @param {number} exp\n * @return {number}\n */\nexport const exp10 = exp => Math.pow(10, exp)\n\nexport const sign = Math.sign\n\n/**\n * @param {number} n\n * @return {boolean} Wether n is negative. This function also differentiates between -0 and +0\n */\nexport const isNegativeZero = n => n !== 0 ? n < 0 : 1 / n < 0\n","/* eslint-env browser */\n\n/**\n * Binary data constants.\n *\n * @module binary\n */\n\n/**\n * n-th bit activated.\n *\n * @type {number}\n */\nexport const BIT1 = 1\nexport const BIT2 = 2\nexport const BIT3 = 4\nexport const BIT4 = 8\nexport const BIT5 = 16\nexport const BIT6 = 32\nexport const BIT7 = 64\nexport const BIT8 = 128\nexport const BIT9 = 256\nexport const BIT10 = 512\nexport const BIT11 = 1024\nexport const BIT12 = 2048\nexport const BIT13 = 4096\nexport const BIT14 = 8192\nexport const BIT15 = 16384\nexport const BIT16 = 32768\nexport const BIT17 = 65536\nexport const BIT18 = 1 << 17\nexport const BIT19 = 1 << 18\nexport const BIT20 = 1 << 19\nexport const BIT21 = 1 << 20\nexport const BIT22 = 1 << 21\nexport const BIT23 = 1 << 22\nexport const BIT24 = 1 << 23\nexport const BIT25 = 1 << 24\nexport const BIT26 = 1 << 25\nexport const BIT27 = 1 << 26\nexport const BIT28 = 1 << 27\nexport const BIT29 = 1 << 28\nexport const BIT30 = 1 << 29\nexport const BIT31 = 1 << 30\nexport const BIT32 = 1 << 31\n\n/**\n * First n bits activated.\n *\n * @type {number}\n */\nexport const BITS0 = 0\nexport const BITS1 = 1\nexport const BITS2 = 3\nexport const BITS3 = 7\nexport const BITS4 = 15\nexport const BITS5 = 31\nexport const BITS6 = 63\nexport const BITS7 = 127\nexport const BITS8 = 255\nexport const BITS9 = 511\nexport const BITS10 = 1023\nexport const BITS11 = 2047\nexport const BITS12 = 4095\nexport const BITS13 = 8191\nexport const BITS14 = 16383\nexport const BITS15 = 32767\nexport const BITS16 = 65535\nexport const BITS17 = BIT18 - 1\nexport const BITS18 = BIT19 - 1\nexport const BITS19 = BIT20 - 1\nexport const BITS20 = BIT21 - 1\nexport const BITS21 = BIT22 - 1\nexport const BITS22 = BIT23 - 1\nexport const BITS23 = BIT24 - 1\nexport const BITS24 = BIT25 - 1\nexport const BITS25 = BIT26 - 1\nexport const BITS26 = BIT27 - 1\nexport const BITS27 = BIT28 - 1\nexport const BITS28 = BIT29 - 1\nexport const BITS29 = BIT30 - 1\nexport const BITS30 = BIT31 - 1\n/**\n * @type {number}\n */\nexport const BITS31 = 0x7FFFFFFF\n/**\n * @type {number}\n */\nexport const BITS32 = 0xFFFFFFFF\n","/**\n * Utility helpers for working with numbers.\n *\n * @module number\n */\n\nimport * as math from './math.js'\nimport * as binary from './binary.js'\n\nexport const MAX_SAFE_INTEGER = Number.MAX_SAFE_INTEGER\nexport const MIN_SAFE_INTEGER = Number.MIN_SAFE_INTEGER\n\nexport const LOWEST_INT32 = 1 << 31\nexport const HIGHEST_INT32 = binary.BITS31\nexport const HIGHEST_UINT32 = binary.BITS32\n\n/* c8 ignore next */\nexport const isInteger = Number.isInteger || (num => typeof num === 'number' && isFinite(num) && math.floor(num) === num)\nexport const isNaN = Number.isNaN\nexport const parseInt = Number.parseInt\n\n/**\n * Count the number of \"1\" bits in an unsigned 32bit number.\n *\n * Super fun bitcount algorithm by Brian Kernighan.\n *\n * @param {number} n\n */\nexport const countBits = n => {\n n &= binary.BITS32\n let count = 0\n while (n) {\n n &= (n - 1)\n count++\n }\n return count\n}\n","/**\n * Utility module to work with Arrays.\n *\n * @module array\n */\n\nimport * as set from './set.js'\n\n/**\n * Return the last element of an array. The element must exist\n *\n * @template L\n * @param {ArrayLike<L>} arr\n * @return {L}\n */\nexport const last = arr => arr[arr.length - 1]\n\n/**\n * @template C\n * @return {Array<C>}\n */\nexport const create = () => /** @type {Array<C>} */ ([])\n\n/**\n * @template D\n * @param {Array<D>} a\n * @return {Array<D>}\n */\nexport const copy = a => /** @type {Array<D>} */ (a.slice())\n\n/**\n * Append elements from src to dest\n *\n * @template M\n * @param {Array<M>} dest\n * @param {Array<M>} src\n */\nexport const appendTo = (dest, src) => {\n for (let i = 0; i < src.length; i++) {\n dest.push(src[i])\n }\n}\n\n/**\n * Transforms something array-like to an actual Array.\n *\n * @function\n * @template T\n * @param {ArrayLike<T>|Iterable<T>} arraylike\n * @return {T}\n */\nexport const from = Array.from\n\n/**\n * True iff condition holds on every element in the Array.\n *\n * @function\n * @template ITEM\n * @template {ArrayLike<ITEM>} ARR\n *\n * @param {ARR} arr\n * @param {function(ITEM, number, ARR):boolean} f\n * @return {boolean}\n */\nexport const every = (arr, f) => {\n for (let i = 0; i < arr.length; i++) {\n if (!f(arr[i], i, arr)) {\n return false\n }\n }\n return true\n}\n\n/**\n * True iff condition holds on some element in the Array.\n *\n * @function\n * @template S\n * @template {ArrayLike<S>} ARR\n * @param {ARR} arr\n * @param {function(S, number, ARR):boolean} f\n * @return {boolean}\n */\nexport const some = (arr, f) => {\n for (let i = 0; i < arr.length; i++) {\n if (f(arr[i], i, arr)) {\n return true\n }\n }\n return false\n}\n\n/**\n * @template ELEM\n *\n * @param {ArrayLike<ELEM>} a\n * @param {ArrayLike<ELEM>} b\n * @return {boolean}\n */\nexport const equalFlat = (a, b) => a.length === b.length && every(a, (item, index) => item === b[index])\n\n/**\n * @template ELEM\n * @param {Array<Array<ELEM>>} arr\n * @return {Array<ELEM>}\n */\nexport const flatten = arr => fold(arr, /** @type {Array<ELEM>} */ ([]), (acc, val) => acc.concat(val))\n\n/**\n * @template T\n * @param {number} len\n * @param {function(number, Array<T>):T} f\n * @return {Array<T>}\n */\nexport const unfold = (len, f) => {\n const array = new Array(len)\n for (let i = 0; i < len; i++) {\n array[i] = f(i, array)\n }\n return array\n}\n\n/**\n * @template T\n * @template RESULT\n * @param {Array<T>} arr\n * @param {RESULT} seed\n * @param {function(RESULT, T, number):RESULT} folder\n */\nexport const fold = (arr, seed, folder) => arr.reduce(folder, seed)\n\nexport const isArray = Array.isArray\n\n/**\n * @template T\n * @param {Array<T>} arr\n * @return {Array<T>}\n */\nexport const unique = arr => from(set.from(arr))\n\n/**\n * @template T\n * @template M\n * @param {ArrayLike<T>} arr\n * @param {function(T):M} mapper\n * @return {Array<T>}\n */\nexport const uniqueBy = (arr, mapper) => {\n /**\n * @type {Set<M>}\n */\n const happened = set.create()\n /**\n * @type {Array<T>}\n */\n const result = []\n for (let i = 0; i < arr.length; i++) {\n const el = arr[i]\n const mapped = mapper(el)\n if (!happened.has(mapped)) {\n happened.add(mapped)\n result.push(el)\n }\n }\n return result\n}\n\n/**\n * @template {ArrayLike<any>} ARR\n * @template {function(ARR extends ArrayLike<infer T> ? T : never, number, ARR):any} MAPPER\n * @param {ARR} arr\n * @param {MAPPER} mapper\n * @return {Array<MAPPER extends function(...any): infer M ? M : never>}\n */\nexport const map = (arr, mapper) => {\n /**\n * @type {Array<any>}\n */\n const res = Array(arr.length)\n for (let i = 0; i < arr.length; i++) {\n res[i] = mapper(/** @type {any} */ (arr[i]), i, /** @type {any} */ (arr))\n }\n return /** @type {any} */ (res)\n}\n","import * as array from './array.js'\n\n/**\n * Utility module to work with strings.\n *\n * @module string\n */\n\nexport const fromCharCode = String.fromCharCode\nexport const fromCodePoint = String.fromCodePoint\n\n/**\n * The largest utf16 character.\n * Corresponds to Uint8Array([255, 255]) or charcodeof(2x2^8)\n */\nexport const MAX_UTF16_CHARACTER = fromCharCode(65535)\n\n/**\n * @param {string} s\n * @return {string}\n */\nconst toLowerCase = s => s.toLowerCase()\n\nconst trimLeftRegex = /^\\s*/g\n\n/**\n * @param {string} s\n * @return {string}\n */\nexport const trimLeft = s => s.replace(trimLeftRegex, '')\n\nconst fromCamelCaseRegex = /([A-Z])/g\n\n/**\n * @param {string} s\n * @param {string} separator\n * @return {string}\n */\nexport const fromCamelCase = (s, separator) => trimLeft(s.replace(fromCamelCaseRegex, match => `${separator}${toLowerCase(match)}`))\n\n/**\n * Compute the utf8ByteLength\n * @param {string} str\n * @return {number}\n */\nexport const utf8ByteLength = str => unescape(encodeURIComponent(str)).length\n\n/**\n * @param {string} str\n * @return {Uint8Array}\n */\nexport const _encodeUtf8Polyfill = str => {\n const encodedString = unescape(encodeURIComponent(str))\n const len = encodedString.length\n const buf = new Uint8Array(len)\n for (let i = 0; i < len; i++) {\n buf[i] = /** @type {number} */ (encodedString.codePointAt(i))\n }\n return buf\n}\n\n/* c8 ignore next */\nexport const utf8TextEncoder = /** @type {TextEncoder} */ (typeof TextEncoder !== 'undefined' ? new TextEncoder() : null)\n\n/**\n * @param {string} str\n * @return {Uint8Array}\n */\nexport const _encodeUtf8Native = str => utf8TextEncoder.encode(str)\n\n/**\n * @param {string} str\n * @return {Uint8Array}\n */\n/* c8 ignore next */\nexport const encodeUtf8 = utf8TextEncoder ? _encodeUtf8Native : _encodeUtf8Polyfill\n\n/**\n * @param {Uint8Array} buf\n * @return {string}\n */\nexport const _decodeUtf8Polyfill = buf => {\n let remainingLen = buf.length\n let encodedString = ''\n let bufPos = 0\n while (remainingLen > 0) {\n const nextLen = remainingLen < 10000 ? remainingLen : 10000\n const bytes = buf.subarray(bufPos, bufPos + nextLen)\n bufPos += nextLen\n // Starting with ES5.1 we can supply a generic array-like object as arguments\n encodedString += String.fromCodePoint.apply(null, /** @type {any} */ (bytes))\n remainingLen -= nextLen\n }\n return decodeURIComponent(escape(encodedString))\n}\n\n/* c8 ignore next */\nexport let utf8TextDecoder = typeof TextDecoder === 'undefined' ? null : new TextDecoder('utf-8', { fatal: true, ignoreBOM: true })\n\n/* c8 ignore start */\nif (utf8TextDecoder && utf8TextDecoder.decode(new Uint8Array()).length === 1) {\n // Safari doesn't handle BOM correctly.\n // This fixes a bug in Safari 13.0.5 where it produces a BOM the first time it is called.\n // utf8TextDecoder.decode(new Uint8Array()).length === 1 on the first call and\n // utf8TextDecoder.decode(new Uint8Array()).length === 1 on the second call\n // Another issue is that from then on no BOM chars are recognized anymore\n /* c8 ignore next */\n utf8TextDecoder = null\n}\n/* c8 ignore stop */\n\n/**\n * @param {Uint8Array} buf\n * @return {string}\n */\nexport const _decodeUtf8Native = buf => /** @type {TextDecoder} */ (utf8TextDecoder).decode(buf)\n\n/**\n * @param {Uint8Array} buf\n * @return {string}\n */\n/* c8 ignore next */\nexport const decodeUtf8 = utf8TextDecoder ? _decodeUtf8Native : _decodeUtf8Polyfill\n\n/**\n * @param {string} str The initial string\n * @param {number} index Starting position\n * @param {number} remove Number of characters to remove\n * @param {string} insert New content to insert\n */\nexport const splice = (str, index, remove, insert = '') => str.slice(0, index) + insert + str.slice(index + remove)\n\n/**\n * @param {string} source\n * @param {number} n\n */\nexport const repeat = (source, n) => array.unfold(n, () => source).join('')\n","/**\n * Efficient schema-less binary encoding with support for variable length encoding.\n *\n * Use [lib0/encoding] with [lib0/decoding]. Every encoding function has a corresponding decoding function.\n *\n * Encodes numbers in little-endian order (least to most significant byte order)\n * and is compatible with Golang's binary encoding (https://golang.org/pkg/encoding/binary/)\n * which is also used in Protocol Buffers.\n *\n * ```js\n * // encoding step\n * const encoder = encoding.createEncoder()\n * encoding.writeVarUint(encoder, 256)\n * encoding.writeVarString(encoder, 'Hello world!')\n * const buf = encoding.toUint8Array(encoder)\n * ```\n *\n * ```js\n * // decoding step\n * const decoder = decoding.createDecoder(buf)\n * decoding.readVarUint(decoder) // => 256\n * decoding.readVarString(decoder) // => 'Hello world!'\n * decoding.hasContent(decoder) // => false - all data is read\n * ```\n *\n * @module encoding\n */\n\nimport * as math from './math.js'\nimport * as number from './number.js'\nimport * as binary from './binary.js'\nimport * as string from './string.js'\nimport * as array from './array.js'\n\n/**\n * A BinaryEncoder handles the encoding to an Uint8Array.\n */\nexport class Encoder {\n constructor () {\n this.cpos = 0\n this.cbuf = new Uint8Array(100)\n /**\n * @type {Array<Uint8Array>}\n */\n this.bufs = []\n }\n}\n\n/**\n * @function\n * @return {Encoder}\n */\nexport const createEncoder = () => new Encoder()\n\n/**\n * @param {function(Encoder):void} f\n */\nexport const encode = (f) => {\n const encoder = createEncoder()\n f(encoder)\n return toUint8Array(encoder)\n}\n\n/**\n * The current length of the encoded data.\n *\n * @function\n * @param {Encoder} encoder\n * @return {number}\n */\nexport const length = encoder => {\n let len = encoder.cpos\n for (let i = 0; i < encoder.bufs.length; i++) {\n len += encoder.bufs[i].length\n }\n return len\n}\n\n/**\n * Check whether encoder is empty.\n *\n * @function\n * @param {Encoder} encoder\n * @return {boolean}\n */\nexport const hasContent = encoder => encoder.cpos > 0 || encoder.bufs.length > 0\n\n/**\n * Transform to Uint8Array.\n *\n * @function\n * @param {Encoder} encoder\n * @return {Uint8Array} The created ArrayBuffer.\n */\nexport const toUint8Array = encoder => {\n const uint8arr = new Uint8Array(length(encoder))\n let curPos = 0\n for (let i = 0; i < encoder.bufs.length; i++) {\n const d = encoder.bufs[i]\n uint8arr.set(d, curPos)\n curPos += d.length\n }\n uint8arr.set(new Uint8Array(encoder.cbuf.buffer, 0, encoder.cpos), curPos)\n return uint8arr\n}\n\n/**\n * Verify that it is possible to write `len` bytes wtihout checking. If\n * necessary, a new Buffer with the required length is attached.\n *\n * @param {Encoder} encoder\n * @param {number} len\n */\nexport const verifyLen = (encoder, len) => {\n const bufferLen = encoder.cbuf.length\n if (bufferLen - encoder.cpos < len) {\n encoder.bufs.push(new Uint8Array(encoder.cbuf.buffer, 0, encoder.cpos))\n encoder.cbuf = new Uint8Array(math.max(bufferLen, len) * 2)\n encoder.cpos = 0\n }\n}\n\n/**\n * Write one byte to the encoder.\n *\n * @function\n * @param {Encoder} encoder\n * @param {number} num The byte that is to be encoded.\n */\nexport const write = (encoder, num) => {\n const bufferLen = encoder.cbuf.length\n if (encoder.cpos === bufferLen) {\n encoder.bufs.push(encoder.cbuf)\n encoder.cbuf = new Uint8Array(bufferLen * 2)\n encoder.cpos = 0\n }\n encoder.cbuf[encoder.cpos++] = num\n}\n\n/**\n * Write one byte at a specific position.\n * Position must already be written (i.e. encoder.length > pos)\n *\n * @function\n * @param {Encoder} encoder\n * @param {number} pos Position to which to write data\n * @param {number} num Unsigned 8-bit integer\n */\nexport const set = (encoder, pos, num) => {\n let buffer = null\n // iterate all buffers and adjust position\n for (let i = 0; i < encoder.bufs.length && buffer === null; i++) {\n const b = encoder.bufs[i]\n if (pos < b.length) {\n buffer = b // found buffer\n } else {\n pos -= b.length\n }\n }\n if (buffer === null) {\n // use current buffer\n buffer = encoder.cbuf\n }\n buffer[pos] = num\n}\n\n/**\n * Write one byte as an unsigned integer.\n *\n * @function\n * @param {Encoder} encoder\n * @param {number} num The number that is to be encoded.\n */\nexport const writeUint8 = write\n\n/**\n * Write one byte as an unsigned Integer at a specific location.\n *\n * @function\n * @param {Encoder} encoder\n * @param {number} pos The location where the data will be written.\n * @param {number} num The number that is to be encoded.\n */\nexport const setUint8 = set\n\n/**\n * Write two bytes as an unsigned integer.\n *\n * @function\n * @param {Encoder} encoder\n * @param {number} num The number that is to be encoded.\n */\nexport const writeUint16 = (encoder, num) => {\n write(encoder, num & binary.BITS8)\n write(encoder, (num >>> 8) & binary.BITS8)\n}\n/**\n * Write two bytes as an unsigned integer at a specific location.\n *\n * @function\n * @param {Encoder} encoder\n * @param {number} pos The location where the data will be written.\n * @param {number} num The number that is to be encoded.\n */\nexport const setUint16 = (encoder, pos, num) => {\n set(encoder, pos, num & binary.BITS8)\n set(encoder, pos + 1, (num >>> 8) & binary.BITS8)\n}\n\n/**\n * Write two bytes as an unsigned integer\n *\n * @function\n * @param {Encoder} encoder\n * @param {number} num The number that is to be encoded.\n */\nexport const writeUint32 = (encoder, num) => {\n for (let i = 0; i < 4; i++) {\n write(encoder, num & binary.BITS8)\n num >>>= 8\n }\n}\n\n/**\n * Write two bytes as an unsigned integer in big endian order.\n * (most significant byte first)\n *\n * @function\n * @param {Encoder} encoder\n * @param {number} num The number that is to be encoded.\n */\nexport const writeUint32BigEndian = (encoder, num) => {\n for (let i = 3; i >= 0; i--) {\n write(encoder, (num >>> (8 * i)) & binary.BITS8)\n }\n}\n\n/**\n * Write two bytes as an unsigned integer at a specific location.\n *\n * @function\n * @param {Encoder} encoder\n * @param {number} pos The location where the data will be written.\n * @param {number} num The number that is to be encoded.\n */\nexport const setUint32 = (encoder, pos, num) => {\n for (let i = 0; i < 4; i++) {\n set(encoder, pos + i, num & binary.BITS8)\n num >>>= 8\n }\n}\n\n/**\n * Write a variable length unsigned integer. Max encodable integer is 2^53.\n *\n * @function\n * @param {Encoder} encoder\n * @param {number} num The number that is to be encoded.\n */\nexport const writeVarUint = (encoder, num) => {\n while (num > binary.BITS7) {\n write(encoder, binary.BIT8 | (binary.BITS7 & num))\n num = math.floor(num / 128) // shift >>> 7\n }\n write(encoder, binary.BITS7 & num)\n}\n\n/**\n * Write a variable length integer.\n *\n * We use the 7th bit instead for signaling that this is a negative number.\n *\n * @function\n * @param {Encoder} encoder\n * @param {number} num The number that is to be encoded.\n */\nexport const writeVarInt = (encoder, num) => {\n const isNegative = math.isNegativeZero(num)\n if (isNegative) {\n num = -num\n }\n // |- whether to continue reading |- whether is negative |- number\n write(encoder, (num > binary.BITS6 ? binary.BIT8 : 0) | (isNegative ? binary.BIT7 : 0) | (binary.BITS6 & num))\n num = math.floor(num / 64) // shift >>> 6\n // We don't need to consider the case of num === 0 so we can use a different\n // pattern here than above.\n while (num > 0) {\n write(encoder, (num > binary.BITS7 ? binary.BIT8 : 0) | (binary.BITS7 & num))\n num = math.floor(num / 128) // shift >>> 7\n }\n}\n\n/**\n * A cache to store strings temporarily\n */\nconst _strBuffer = new Uint8Array(30000)\nconst _maxStrBSize = _strBuffer.length / 3\n\n/**\n * Write a variable length string.\n *\n * @function\n * @param {Encoder} encoder\n * @param {String} str The string that is to be encoded.\n */\nexport const _writeVarStringNative = (encoder, str) => {\n if (str.length < _maxStrBSize) {\n // We can encode the string into the existing buffer\n /* c8 ignore next */\n const written = string.utf8TextEncoder.encodeInto(str, _strBuffer).written || 0\n writeVarUint(encoder, written)\n for (let i = 0; i < written; i++) {\n write(encoder, _strBuffer[i])\n }\n } else {\n writeVarUint8Array(encoder, string.encodeUtf8(str))\n }\n}\n\n/**\n * Write a variable length string.\n *\n * @function\n * @param {Encoder} encoder\n * @param {String} str The string that is to be encoded.\n */\nexport const _writeVarStringPolyfill = (encoder, str) => {\n const encodedString = unescape(encodeURIComponent(str))\n const len = encodedString.length\n writeVarUint(encoder, len)\n for (let i = 0; i < len; i++) {\n write(encoder, /** @type {number} */ (encodedString.codePointAt(i)))\n }\n}\n\n/**\n * Write a variable length string.\n *\n * @function\n * @param {Encoder} encoder\n * @param {String} str The string that is to be encoded.\n */\n/* c8 ignore next */\nexport const writeVarString = (string.utf8TextEncoder && /** @type {any} */ (string.utf8TextEncoder).encodeInto) ? _writeVarStringNative : _writeVarStringPolyfill\n\n/**\n * Write a string terminated by a special byte sequence. This is not very performant and is\n * generally discouraged. However, the resulting byte arrays are lexiographically ordered which\n * makes this a nice feature for databases.\n *\n * The string will be encoded using utf8 and then terminated and escaped using writeTerminatingUint8Array.\n *\n * @function\n * @param {Encoder} encoder\n * @param {String} str The string that is to be encoded.\n */\nexport const writeTerminatedString = (encoder, str) =>\n writeTerminatedUint8Array(encoder, string.encodeUtf8(str))\n\n/**\n * Write a terminating Uint8Array. Note that this is not performant and is generally\n * discouraged. There are few situations when this is needed.\n *\n * We use 0x0 as a terminating character. 0x1 serves as an escape character for 0x0 and 0x1.\n *\n * Example: [0,1,2] is encoded to [1,0,1,1,2,0]. 0x0, and 0x1 needed to be escaped using 0x1. Then\n * the result is terminated using the 0x0 character.\n *\n * This is basically how many systems implement null terminated strings. However, we use an escape\n * character 0x1 to avoid issues and potenial attacks on our database (if this is used as a key\n * encoder for NoSql databases).\n *\n * @function\n * @param {Encoder} encoder\n * @param {Uint8Array} buf The string that is to be encoded.\n */\nexport const writeTerminatedUint8Array = (encoder, buf) => {\n for (let i = 0; i < buf.length; i++) {\n const b = buf[i]\n if (b === 0 || b === 1) {\n write(encoder, 1)\n }\n write(encoder, buf[i])\n }\n write(encoder, 0)\n}\n\n/**\n * Write the content of another Encoder.\n *\n * @TODO: can be improved!\n * - Note: Should consider that when appending a lot of small Encoders, we should rather clone than referencing the old structure.\n * Encoders start with a rather big initial buffer.\n *\n * @function\n * @param {Encoder} encoder The enUint8Arr\n * @param {Encoder} append The BinaryEncoder to be written.\n */\nexport const writeBinaryEncoder = (encoder, append) => writeUint8Array(encoder, toUint8Array(append))\n\n/**\n * Append fixed-length Uint8Array to the encoder.\n *\n * @function\n * @param {Encoder} encoder\n * @param {Uint8Array} uint8Array\n */\nexport const writeUint8Array = (encoder, uint8Array) => {\n const bufferLen = encoder.cbuf.length\n const cpos = encoder.cpos\n const leftCopyLen = math.min(bufferLen - cpos, uint8Array.length)\n const rightCopyLen = uint8Array.length - leftCopyLen\n encoder.cbuf.set(uint8Array.subarray(0, leftCopyLen), cpos)\n encoder.cpos += leftCopyLen\n if (rightCopyLen > 0) {\n // Still something to write, write right half..\n // Append new buffer\n encoder.bufs.push(encoder.cbuf)\n // must have at least size of remaining buffer\n encoder.cbuf = new Uint8Array(math.max(bufferLen * 2, rightCopyLen))\n // copy array\n encoder.cbuf.set(uint8Array.subarray(leftCopyLen))\n encoder.cpos = rightCopyLen\n }\n}\n\n/**\n * Append an Uint8Array to Encoder.\n *\n * @function\n * @param {Encoder} encoder\n * @param {Uint8Array} uint8Array\n */\nexport const writeVarUint8Array = (encoder, uint8Array) => {\n writeVarUint(encoder, uint8Array.byteLength)\n writeUint8Array(encoder, uint8Array)\n}\n\n/**\n * Create an DataView of the next `len` bytes. Use it to write data after\n * calling this function.\n *\n * ```js\n * // write float32 using DataView\n * const dv = writeOnDataView(encoder, 4)\n * dv.setFloat32(0, 1.1)\n * // read float32 using DataView\n * const dv = readFromDataView(encoder, 4)\n * dv.getFloat32(0) // => 1.100000023841858 (leaving it to the reader to find out why this is the correct result)\n * ```\n *\n * @param {Encoder} encoder\n * @param {number} len\n * @return {DataView}\n */\nexport const writeOnDataView = (encoder, len) => {\n verifyLen(encoder, len)\n const dview = new DataView(encoder.cbuf.buffer, encoder.cpos, len)\n encoder.cpos += len\n return dview\n}\n\n/**\n * @param {Encoder} encoder\n * @param {number} num\n */\nexport const writeFloat32 = (encoder, num) => writeOnDataView(encoder, 4).setFloat32(0, num, false)\n\n/**\n * @param {Encoder} encoder\n * @param {number} num\n */\nexport const writeFloat64 = (encoder, num) => writeOnDataView(encoder, 8).setFloat64(0, num, false)\n\n/**\n * @param {Encoder} encoder\n * @param {bigint} num\n */\nexport const writeBigInt64 = (encoder, num) => /** @type {any} */ (writeOnDataView(encoder, 8)).setBigInt64(0, num, false)\n\n/**\n * @param {Encoder} encoder\n * @param {bigint} num\n */\nexport const writeBigUint64 = (encoder, num) => /** @type {any} */ (writeOnDataView(encoder, 8)).setBigUint64(0, num, false)\n\nconst floatTestBed = new DataView(new ArrayBuffer(4))\n/**\n * Check if a number can be encoded as a 32 bit float.\n *\n * @param {number} num\n * @return {boolean}\n */\nconst isFloat32 = num => {\n floatTestBed.setFloat32(0, num)\n return floatTestBed.getFloat32(0) === num\n}\n\n/**\n * Encode data with efficient binary format.\n *\n * Differences to JSON:\n * • Transforms data to a binary format (not to a string)\n * • Encodes undefined, NaN, and ArrayBuffer (these can't be represented in JSON)\n * • Numbers are efficiently encoded either as a variable length integer, as a\n * 32 bit float, as a 64 bit float, or as a 64 bit bigint.\n *\n * Encoding table:\n *\n * | Data Type | Prefix | Encoding Method | Comment |\n * | ------------------- | -------- | ------------------ | ------- |\n * | undefined | 127 | | Functions, symbol, and everything that cannot be identified is encoded as undefined |\n * | null | 126 | | |\n * | integer | 125 | writeVarInt | Only encodes 32 bit signed integers |\n * | float32 | 124 | writeFloat32 | |\n * | float64 | 123 | writeFloat64 | |\n * | bigint | 122 | writeBigInt64 | |\n * | boolean (false) | 121 | | True and false are different data types so we save the following byte |\n * | boolean (true) | 120 | | - 0b01111000 so the last bit determines whether true or false |\n * | string | 119 | writeVarString | |\n * | object<string,any> | 118 | custom | Writes {length} then {length} key-value pairs |\n * | array<any> | 117 | custom | Writes {length} then {length} json values |\n * | Uint8Array | 116 | writeVarUint8Array | We use Uint8Array for any kind of binary data |\n *\n * Reasons for the decreasing prefix:\n * We need the first bit for extendability (later we may want to encode the\n * prefix with writeVarUint). The remaining 7 bits are divided as follows:\n * [0-30] the beginning of the data range is used for custom purposes\n * (defined by the function that uses this library)\n * [31-127] the end of the data range is used for data encoding by\n * lib0/encoding.js\n *\n * @param {Encoder} encoder\n * @param {undefined|null|number|bigint|boolean|string|Object<string,any>|Array<any>|Uint8Array} data\n */\nexport const writeAny = (encoder, data) => {\n switch (typeof data) {\n case 'string':\n // TYPE 119: STRING\n write(encoder, 119)\n writeVarString(encoder, data)\n break\n case 'number':\n if (number.isInteger(data) && math.abs(data) <= binary.BITS31) {\n // TYPE 125: INTEGER\n write(encoder, 125)\n writeVarInt(encoder, data)\n } else if (isFloat32(data)) {\n // TYPE 124: FLOAT32\n write(encoder, 124)\n writeFloat32(encoder, data)\n } else {\n // TYPE 123: FLOAT64\n write(encoder, 123)\n writeFloat64(encoder, data)\n }\n break\n case 'bigint':\n // TYPE 122: BigInt\n write(encoder, 122)\n writeBigInt64(encoder, data)\n break\n case 'object':\n if (data === null) {\n // TYPE 126: null\n write(encoder, 126)\n } else if (array.isArray(data)) {\n // TYPE 117: Array\n write(encoder, 117)\n writeVarUint(encoder, data.length)\n for (let i = 0; i < data.length; i++) {\n writeAny(encoder, data[i])\n }\n } else if (data instanceof Uint8Array) {\n // TYPE 116: ArrayBuffer\n write(encoder, 116)\n writeVarUint8Array(encoder, data)\n } else {\n // TYPE 118: Object\n write(encoder, 118)\n const keys = Object.keys(data)\n writeVarUint(encoder, keys.length)\n for (let i = 0; i < keys.length; i++) {\n const key = keys[i]\n writeVarString(encoder, key)\n writeAny(encoder, data[key])\n }\n }\n break\n case 'boolean':\n // TYPE 120/121: boolean (true/false)\n write(encoder, data ? 120 : 121)\n break\n default:\n // TYPE 127: undefined\n write(encoder, 127)\n }\n}\n\n/**\n * Now come a few stateful encoder that have their own classes.\n */\n\n/**\n * Basic Run Length Encoder - a basic compression implementation.\n *\n * Encodes [1,1,1,7] to [1,3,7,1] (3 times 1, 1 time 7). This encoder might do more harm than good if there are a lot of values that are not repeated.\n *\n * It was originally used for image compression. Cool .. article http://csbruce.com/cbm/transactor/pdfs/trans_v7_i06.pdf\n *\n * @note T must not be null!\n *\n * @template T\n */\nexport class RleEncoder extends Encoder {\n /**\n * @param {function(Encoder, T):void} writer\n */\n constructor (writer) {\n super()\n /**\n * The writer\n */\n this.w = writer\n /**\n * Current state\n * @type {T|null}\n */\n this.s = null\n this.count = 0\n }\n\n /**\n * @param {T} v\n */\n write (v) {\n if (this.s === v) {\n this.count++\n } else {\n if (this.count > 0) {\n // flush counter, unless this is the first value (count = 0)\n writeVarUint(this, this.count - 1) // since count is always > 0, we can decrement by one. non-standard encoding ftw\n }\n this.count = 1\n // write first value\n this.w(this, v)\n this.s = v\n }\n }\n}\n\n/**\n * Basic diff decoder using variable length encoding.\n *\n * Encodes the values [3, 1100, 1101, 1050, 0] to [3, 1097, 1, -51, -1050] using writeVarInt.\n */\nexport class IntDiffEncoder extends Encoder {\n /**\n * @param {number} start\n */\n constructor (start) {\n super()\n /**\n * Current state\n * @type {number}\n */\n this.s = start\n }\n\n /**\n * @param {number} v\n */\n write (v) {\n writeVarInt(this, v - this.s)\n this.s = v\n }\n}\n\n/**\n * A combination of IntDiffEncoder and RleEncoder.\n *\n * Basically first writes the IntDiffEncoder and then counts duplicate diffs using RleEncoding.\n *\n * Encodes the values [1,1,1,2,3,4,5,6] as [1,1,0,2,1,5] (RLE([1,0,0,1,1,1,1,1]) ⇒ RleIntDiff[1,1,0,2,1,5])\n */\nexport class RleIntDiffEncoder extends Encoder {\n /**\n * @param {number} start\n */\n constructor (start) {\n super()\n /**\n * Current state\n * @type {number}\n */\n this.s = start\n this.count = 0\n }\n\n /**\n * @param {number} v\n */\n write (v) {\n if (this.s === v && this.count > 0) {\n this.count++\n } else {\n if (this.count > 0) {\n // flush counter, unless this is the first value (count = 0)\n writeVarUint(this, this.count - 1) // since count is always > 0, we can decrement by one. non-standard encoding ftw\n }\n this.count = 1\n // write first value\n writeVarInt(this, v - this.s)\n this.s = v\n }\n }\n}\n\n/**\n * @param {UintOptRleEncoder} encoder\n */\nconst flushUintOptRleEncoder = encoder => {\n if (encoder.count > 0) {\n // flush counter, unless this is the first value (count = 0)\n // case 1: just a single value. set sign to positive\n // case 2: write several values. set sign to negative to indicate that there is a length coming\n writeVarInt(encoder.encoder, encoder.count === 1 ? encoder.s : -encoder.s)\n if (encoder.count > 1) {\n writeVarUint(encoder.encoder, encoder.count - 2) // since count is always > 1, we can decrement by one. non-standard encoding ftw\n }\n }\n}\n\n/**\n * Optimized Rle encoder that does not suffer from the mentioned problem of the basic Rle encoder.\n *\n * Internally uses VarInt encoder to write unsigned integers. If the input occurs multiple times, we write\n * write it as a negative number. The UintOptRleDecoder then understands that it needs to read a count.\n *\n * Encodes [1,2,3,3,3] as [1,2,-3,3] (once 1, once 2, three times 3)\n */\nexport class UintOptRleEncoder {\n constructor () {\n this.encoder = new Encoder()\n /**\n * @type {number}\n */\n this.s = 0\n this.count = 0\n }\n\n /**\n * @param {number} v\n */\n write (v) {\n if (this.s === v) {\n this.count++\n } else {\n flushUintOptRleEncoder(this)\n this.count = 1\n this.s = v\n }\n }\n\n /**\n * Flush the encoded state and transform this to a Uint8Array.\n *\n * Note that this should only be called once.\n */\n toUint8Array () {\n flushUintOptRleEncoder(this)\n return toUint8Array(this.encoder)\n }\n}\n\n/**\n * Increasing Uint Optimized RLE Encoder\n *\n * The RLE encoder counts the number of same occurences of the same value.\n * The IncUintOptRle encoder counts if the value increases.\n * I.e. 7, 8, 9, 10 will be encoded as [-7, 4]. 1, 3, 5 will be encoded\n * as [1, 3, 5].\n */\nexport class IncUintOptRleEncoder {\n constructor () {\n this.encoder = new Encoder()\n /**\n * @type {number}\n */\n this.s = 0\n this.count = 0\n }\n\n /**\n * @param {number} v\n */\n write (v) {\n if (this.s + this.count === v) {\n this.count++\n } else {\n flushUintOptRleEncoder(this)\n this.count = 1\n this.s = v\n }\n }\n\n /**\n * Flush the encoded state and transform this to a Uint8Array.\n *\n * Note that this should only be called once.\n */\n toUint8Array () {\n flushUintOptRleEncoder(this)\n return toUint8Array(this.encoder)\n }\n}\n\n/**\n * @param {IntDiffOptRleEncoder} encoder\n */\nconst flushIntDiffOptRleEncoder = encoder => {\n if (encoder.count > 0) {\n // 31 bit making up the diff | wether to write the counter\n // const encodedDiff = encoder.diff << 1 | (encoder.count === 1 ? 0 : 1)\n const encodedDiff = encoder.diff * 2 + (encoder.count === 1 ? 0 : 1)\n // flush counter, unless this is the first value (count = 0)\n // case 1: just a single value. set first bit to positive\n // case 2: write several values. set first bit to negative to indicate that there is a length coming\n writeVarInt(encoder.encoder, encodedDiff)\n if (encoder.count > 1) {\n writeVarUint(encoder.encoder, encoder.count - 2) // since count is always > 1, we can decrement by one. non-standard encoding ftw\n }\n }\n}\n\n/**\n * A combination of the IntDiffEncoder and the UintOptRleEncoder.\n *\n * The count approach is similar to the UintDiffOptRleEncoder, but instead of using the negative bitflag, it encodes\n * in the LSB whether a count is to be read. Therefore this Encoder only supports 31 bit integers!\n *\n * Encodes [1, 2, 3, 2] as [3, 1, 6, -1] (more specifically [(1 << 1) | 1, (3 << 0) | 0, -1])\n *\n * Internally uses variable length encoding. Contrary to normal UintVar encoding, the first byte contains:\n * * 1 bit that denotes whether the next value is a count (LSB)\n * * 1 bit that denotes whether this value is negative (MSB - 1)\n * * 1 bit that denotes whether to continue reading the variable length integer (MSB)\n *\n * Therefore, only five bits remain to encode diff ranges.\n *\n * Use this Encoder only when appropriate. In most cases, this is probably a bad idea.\n */\nexport class IntDiffOptRleEncoder {\n constructor () {\n this.encoder = new Encoder()\n /**\n * @type {number}\n */\n this.s = 0\n this.count = 0\n this.diff = 0\n }\n\n /**\n * @param {number} v\n */\n write (v) {\n if (this.diff === v - this.s) {\n this.s = v\n this.count++\n } else {\n flushIntDiffOptRleEncoder(this)\n this.count = 1\n this.diff = v - this.s\n this.s = v\n }\n }\n\n /**\n * Flush the encoded state and transform this to a Uint8Array.\n *\n * Note that this should only be called once.\n */\n toUint8Array () {\n flushIntDiffOptRleEncoder(this)\n return toUint8Array(this.encoder)\n }\n}\n\n/**\n * Optimized String Encoder.\n *\n * Encoding many small strings in a simple Encoder is not very efficient. The function call to decode a string takes some time and creates references that must be eventually deleted.\n * In practice, when decoding several million small strings, the GC will kick in more and more often to collect orphaned string objects (or maybe there is another reason?).\n *\n * This string encoder solves the above problem. All strings are concatenated and written as a single string using a single encoding call.\n *\n * The lengths are encoded using a UintOptRleEncoder.\n */\nexport class StringEncoder {\n constructor () {\n /**\n * @type {Array<string>}\n */\n this.sarr = []\n this.s = ''\n this.lensE = new UintOptRleEncoder()\n }\n\n /**\n * @param {string} string\n */\n write (string) {\n this.s += string\n if (this.s.length > 19) {\n this.sarr.push(this.s)\n this.s = ''\n }\n this.lensE.write(string.length)\n }\n\n toUint8Array () {\n const encoder = new Encoder()\n this.sarr.push(this.s)\n this.s = ''\n writeVarString(encoder, this.sarr.join(''))\n writeUint8Array(encoder, this.lensE.toUint8Array())\n return toUint8Array(encoder)\n }\n}\n","import { Encoder, writeVarString, writeBigUint64, writeAny, toUint8Array, writeVarUint8Array, } from 'lib0/encoding.js';\nexport function encodeYMessage(msg) {\n const encoder = new Encoder();\n writeVarString(encoder, msg.type);\n if ('table' in msg)\n writeVarString(encoder, msg.table);\n if ('prop' in msg)\n writeVarString(encoder, msg.prop);\n switch (msg.type) {\n case 'u-ack':\n case 'u-reject':\n writeBigUint64(encoder, BigInt(msg.i));\n break;\n case 'outdated-server-rev':\n break;\n case 'y-complete-sync-done':\n writeVarString(encoder, msg.yServerRev);\n break;\n default:\n writeAny(encoder, msg.k);\n switch (msg.type) {\n case 'aware':\n writeVarUint8Array(encoder, msg.u);\n break;\n case 'doc-open':\n writeAny(encoder, msg.serverRev);\n writeAny(encoder, msg.sv);\n break;\n case 'doc-close':\n break;\n case 'sv':\n writeVarUint8Array(encoder, msg.sv);\n break;\n case 'u-c':\n writeVarUint8Array(encoder, msg.u);\n writeBigUint64(encoder, BigInt(msg.i));\n break;\n case 'u-s':\n writeVarUint8Array(encoder, msg.u);\n writeVarString(encoder, msg.r || '');\n break;\n case 'in-sync':\n break;\n }\n }\n return toUint8Array(encoder);\n}\n","/**\n * Error helpers.\n *\n * @module error\n */\n\n/**\n * @param {string} s\n * @return {Error}\n */\n/* c8 ignore next */\nexport const create = s => new Error(s)\n\n/**\n * @throws {Error}\n * @return {never}\n */\n/* c8 ignore next 3 */\nexport const methodUnimplemented = () => {\n throw create('Method unimplemented')\n}\n\n/**\n * @throws {Error}\n * @return {never}\n */\n/* c8 ignore next 3 */\nexport const unexpectedCase = () => {\n throw create('Unexpected case')\n}\n","/**\n * Efficient schema-less binary decoding with support for variable length encoding.\n *\n * Use [lib0/decoding] with [lib0/encoding]. Every encoding function has a corresponding decoding function.\n *\n * Encodes numbers in little-endian order (least to most significant byte order)\n * and is compatible with Golang's binary encoding (https://golang.org/pkg/encoding/binary/)\n * which is also used in Protocol Buffers.\n *\n * ```js\n * // encoding step\n * const encoder = encoding.createEncoder()\n * encoding.writeVarUint(encoder, 256)\n * encoding.writeVarString(encoder, 'Hello world!')\n * const buf = encoding.toUint8Array(encoder)\n * ```\n *\n * ```js\n * // decoding step\n * const decoder = decoding.createDecoder(buf)\n * decoding.readVarUint(decoder) // => 256\n * decoding.readVarString(decoder) // => 'Hello world!'\n * decoding.hasContent(decoder) // => false - all data is read\n * ```\n *\n * @module decoding\n */\n\nimport * as binary from './binary.js'\nimport * as math from './math.js'\nimport * as number from './number.js'\nimport * as string from './string.js'\nimport * as error from './error.js'\nimport * as encoding from './encoding.js'\n\nconst errorUnexpectedEndOfArray = error.create('Unexpected end of array')\nconst errorIntegerOutOfRange = error.create('Integer out of Range')\n\n/**\n * A Decoder handles the decoding of an Uint8Array.\n */\nexport class Decoder {\n /**\n * @param {Uint8Array} uint8Array Binary data to decode\n */\n constructor (uint8Array) {\n /**\n * Decoding target.\n *\n * @type {Uint8Array}\n */\n this.arr = uint8Array\n /**\n * Current decoding position.\n *\n * @type {number}\n */\n this.pos = 0\n }\n}\n\n/**\n * @function\n * @param {Uint8Array} uint8Array\n * @return {Decoder}\n */\nexport const createDecoder = uint8Array => new Decoder(uint8Array)\n\n/**\n * @function\n * @param {Decoder} decoder\n * @return {boolean}\n */\nexport const hasContent = decoder => decoder.pos !== decoder.arr.length\n\n/**\n * Clone a decoder instance.\n * Optionally set a new position parameter.\n *\n * @function\n * @param {Decoder} decoder The decoder instance\n * @param {number} [newPos] Defaults to current position\n * @return {Decoder} A clone of `decoder`\n */\nexport const clone = (decoder, newPos = decoder.pos) => {\n const _decoder = createDecoder(decoder.arr)\n _decoder.pos = newPos\n return _decoder\n}\n\n/**\n * Create an Uint8Array view of the next `len` bytes and advance the position by `len`.\n *\n * Important: The Uint8Array still points to the underlying ArrayBuffer. Make sure to discard the result as soon as possible to prevent any memory leaks.\n * Use `buffer.copyUint8Array` to copy the result into a new Uint8Array.\n *\n * @function\n * @param {Decoder} decoder The decoder instance\n * @param {number} len The length of bytes to read\n * @return {Uint8Array}\n */\nexport const readUint8Array = (decoder, len) => {\n const view = new Uint8Array(decoder.arr.buffer, decoder.pos + decoder.arr.byteOffset, len)\n decoder.pos += len\n return view\n}\n\n/**\n * Read variable length Uint8Array.\n *\n * Important: The Uint8Array still points to the underlying ArrayBuffer. Make sure to discard the result as soon as possible to prevent any memory leaks.\n * Use `buffer.copyUint8Array` to copy the result into a new Uint8Array.\n *\n * @function\n * @param {Decoder} decoder\n * @return {Uint8Array}\n */\nexport const readVarUint8Array = decoder => readUint8Array(decoder, readVarUint(decoder))\n\n/**\n * Read the rest of the content as an ArrayBuffer\n * @function\n * @param {Decoder} decoder\n * @return {Uint8Array}\n */\nexport const readTailAsUint8Array = decoder => readUint8Array(decoder, decoder.arr.length - decoder.pos)\n\n/**\n * Skip one byte, jump to the next position.\n * @function\n * @param {Decoder} decoder The decoder instance\n * @return {number} The next position\n */\nexport const skip8 = decoder => decoder.pos++\n\n/**\n * Read one byte as unsigned integer.\n * @function\n * @param {Decoder} decoder The decoder instance\n * @return {number} Unsigned 8-bit integer\n */\nexport const readUint8 = decoder => decoder.arr[decoder.pos++]\n\n/**\n * Read 2 bytes as unsigned integer.\n *\n * @function\n * @param {Decoder} decoder\n * @return {number} An unsigned integer.\n */\nexport const readUint16 = decoder => {\n const uint =\n decoder.arr[decoder.pos] +\n (decoder.arr[decoder.pos + 1] << 8)\n decoder.pos += 2\n return uint\n}\n\n/**\n * Read 4 bytes as unsigned integer.\n *\n * @function\n * @param {Decoder} decoder\n * @return {number} An unsigned integer.\n */\nexport const readUint32 = decoder => {\n const uint =\n (decoder.arr[decoder.pos] +\n (decoder.arr[decoder.pos + 1] << 8) +\n (decoder.arr[decoder.pos + 2] << 16) +\n (decoder.arr[decoder.pos + 3] << 24)) >>> 0\n decoder.pos += 4\n return uint\n}\n\n/**\n * Read 4 bytes as unsigned integer in big endian order.\n * (most significant byte first)\n *\n * @function\n * @param {Decoder} decoder\n * @return {number} An unsigned integer.\n */\nexport const readUint32BigEndian = decoder => {\n const uint =\n (decoder.arr[decoder.pos + 3] +\n (decoder.arr[decoder.pos + 2] << 8) +\n (decoder.arr[decoder.pos + 1] << 16) +\n (decoder.arr[decoder.pos] << 24)) >>> 0\n decoder.pos += 4\n return uint\n}\n\n/**\n * Look ahead without incrementing the position\n * to the next byte and read it as unsigned integer.\n *\n * @function\n * @param {Decoder} decoder\n * @return {number} An unsigned integer.\n */\nexport const peekUint8 = decoder => decoder.arr[decoder.pos]\n\n/**\n * Look ahead without incrementing the position\n * to the next byte and read it as unsigned integer.\n *\n * @function\n * @param {Decoder} decoder\n * @return {number} An unsigned integer.\n */\nexport const peekUint16 = decoder =>\n decoder.arr[decoder.pos] +\n (decoder.arr[decoder.pos + 1] << 8)\n\n/**\n * Look ahead without incrementing the position\n * to the next byte and read it as unsigned integer.\n *\n * @function\n * @param {Decoder} decoder\n * @return {number} An unsigned integer.\n */\nexport const peekUint32 = decoder => (\n decoder.arr[decoder.pos] +\n (decoder.arr[decoder.pos + 1] << 8) +\n (decoder.arr[decoder.pos + 2] << 16) +\n (decoder.arr[decoder.pos + 3] << 24)\n) >>> 0\n\n/**\n * Read unsigned integer (32bit) with variable length.\n * 1/8th of the storage is used as encoding overhead.\n * * numbers < 2^7 is stored in one bytlength\n * * numbers < 2^14 is stored in two bylength\n *\n * @function\n * @param {Decoder} decoder\n * @return {number} An unsigned integer.length\n */\nexport const readVarUint = decoder => {\n let num = 0\n let mult = 1\n const len = decoder.arr.length\n while (decoder.pos < len) {\n const r = decoder.arr[decoder.pos++]\n // num = num | ((r & binary.BITS7) << len)\n num = num + (r & binary.BITS7) * mult // shift $r << (7*#iterations) and add it to num\n mult *= 128 // next iteration, shift 7 \"more\" to the left\n if (r < binary.BIT8) {\n return num\n }\n /* c8 ignore start */\n if (num > number.MAX_SAFE_INTEGER) {\n throw errorIntegerOutOfRange\n }\n /* c8 ignore stop */\n }\n throw errorUnexpectedEndOfArray\n}\n\n/**\n * Read signed integer (32bit) with variable length.\n * 1/8th of the storage is used as encoding overhead.\n * * numbers < 2^7 is stored in one bytlength\n * * numbers < 2^14 is stored in two bylength\n * @todo This should probably create the inverse ~num if number is negative - but this would be a breaking change.\n *\n * @function\n * @param {Decoder} decoder\n * @return {number} An unsigned integer.length\n */\nexport const readVarInt = decoder => {\n let r = decoder.arr[decoder.pos++]\n let num = r & binary.BITS6\n let mult = 64\n const sign = (r & binary.BIT7) > 0 ? -1 : 1\n if ((r & binary.BIT8) === 0) {\n // don't continue reading\n return sign * num\n }\n const len = decoder.arr.length\n while (decoder.pos < len) {\n r = decoder.arr[decoder.pos++]\n // num = num | ((r & binary.BITS7) << len)\n num = num + (r & binary.BITS7) * mult\n mult *= 128\n if (r < binary.BIT8) {\n return sign * num\n }\n /* c8 ignore start */\n if (num > number.MAX_SAFE_INTEGER) {\n throw errorIntegerOutOfRange\n }\n /* c8 ignore stop */\n }\n throw errorUnexpectedEndOfArray\n}\n\n/**\n * Look ahead and read varUint without incrementing position\n *\n * @function\n * @param {Decoder} decoder\n * @return {number}\n */\nexport const peekVarUint = decoder => {\n const pos = decoder.pos\n const s = readVarUint(decoder)\n decoder.pos = pos\n return s\n}\n\n/**\n * Look ahead and read varUint without incrementing position\n *\n * @function\n * @param {Decoder} decoder\n * @return {number}\n */\nexport const peekVarInt = decoder => {\n const pos = decoder.pos\n const s = readVarInt(decoder)\n decoder.pos = pos\n return s\n}\n\n/**\n * We don't test this function anymore as we use native decoding/encoding by default now.\n * Better not modify this anymore..\n *\n * Transforming utf8 to a string is pretty expensive. The code performs 10x better\n * when String.fromCodePoint is fed with all characters as arguments.\n * But most environments have a maximum number of arguments per functions.\n * For effiency reasons we apply a maximum of 10000 characters at once.\n *\n * @function\n * @param {Decoder} decoder\n * @return {String} The read String.\n */\n/* c8 ignore start */\nexport const _readVarStringPolyfill = decoder => {\n let remainingLen = readVarUint(decoder)\n if (remainingLen === 0) {\n return ''\n } else {\n let encodedString = String.fromCodePoint(readUint8(decoder)) // remember to decrease remainingLen\n if (--remainingLen < 100) { // do not create a Uint8Array for small strings\n while (remainingLen--) {\n encodedString += String.fromCodePoint(readUint8(decoder))\n }\n } else {\n while (remainingLen > 0) {\n const nextLen = remainingLen < 10000 ? remainingLen : 10000\n // this is dangerous, we create a fresh array view from the existing buffer\n const bytes = decoder.arr.subarray(decoder.pos, decoder.pos + nextLen)\n decoder.pos += nextLen\n // Starting with ES5.1 we can supply a generic array-like object as arguments\n encodedString += String.fromCodePoint.apply(null, /** @type {any} */ (bytes))\n remainingLen -= nextLen\n }\n }\n return decodeURIComponent(escape(encodedString))\n }\n}\n/* c8 ignore stop */\n\n/**\n * @function\n * @param {Decoder} decoder\n * @return {String} The read String\n */\nexport const _readVarStringNative = decoder =>\n /** @type any */ (string.utf8TextDecoder).decode(readVarUint8Array(decoder))\n\n/**\n * Read string of variable length\n * * varUint is used to store the length of the string\n *\n * @function\n * @param {Decoder} decoder\n * @return {String} The read String\n *\n */\n/* c8 ignore next */\nexport const readVarString = string.utf8TextDecoder ? _readVarStringNative : _readVarStringPolyfill\n\n/**\n * @param {Decoder} decoder\n * @return {Uint8Array}\n */\nexport const readTerminatedUint8Array = decoder => {\n const encoder = encoding.createEncoder()\n let b\n while (true) {\n b = readUint8(decoder)\n if (b === 0) {\n return encoding.toUint8Array(encoder)\n }\n if (b === 1) {\n b = readUint8(decoder)\n }\n encoding.write(encoder, b)\n }\n}\n\n/**\n * @param {Decoder} decoder\n * @return {string}\n */\nexport const readTerminatedString = decoder => string.decodeUtf8(readTerminatedUint8Array(decoder))\n\n/**\n * Look ahead and read varString without incrementing position\n *\n * @function\n * @param {Decoder} decoder\n * @return {string}\n */\nexport const peekVarString = decoder => {\n const pos = decoder.pos\n const s = readVarString(decoder)\n decoder.pos = pos\n return s\n}\n\n/**\n * @param {Decoder} decoder\n * @param {number} len\n * @return {DataView}\n */\nexport const readFromDataView = (decoder, len) => {\n const dv = new DataView(decoder.arr.buffer, decoder.arr.byteOffset + decoder.pos, len)\n decoder.pos += len\n return dv\n}\n\n/**\n * @param {Decoder} decoder\n */\nexport const readFloat32 = decoder => readFromDataView(decoder, 4).getFloat32(0, false)\n\n/**\n * @param {Decoder} decoder\n */\nexport const readFloat64 = decoder => readFromDataView(decoder, 8).getFloat64(0, false)\n\n/**\n * @param {Decoder} decoder\n */\nexport const readBigInt64 = decoder => /** @type {any} */ (readFromDataView(decoder, 8)).getBigInt64(0, false)\n\n/**\n * @param {Decoder} decoder\n */\nexport const readBigUint64 = decoder => /** @type {any} */ (readFromDataView(decoder, 8)).getBigUint64(0, false)\n\n/**\n * @type {Array<function(Decoder):any>}\n */\nconst readAnyLookupTable = [\n decoder => undefined, // CASE 127: undefined\n decoder => null, // CASE 126: null\n readVarInt, // CASE 125: integer\n readFloat32, // CASE 124: float32\n readFloat64, // CASE 123: float64\n readBigInt64, // CASE 122: bigint\n decoder => false, // CASE 121: boolean (false)\n decoder => true, // CASE 120: boolean (true)\n readVarString, // CASE 119: string\n decoder => { // CASE 118: object<string,any>\n const len = readVarUint(decoder)\n /**\n * @type {Object<string,any>}\n */\n const obj = {}\n for (let i = 0; i < len; i++) {\n const key = readVarString(decoder)\n obj[key] = readAny(decoder)\n }\n return obj\n },\n decoder => { // CASE 117: array<any>\n const len = readVarUint(decoder)\n const arr = []\n for (let i = 0; i < len; i++) {\n arr.push(readAny(decoder))\n }\n return arr\n },\n readVarUint8Array // CASE 116: Uint8Array\n]\n\n/**\n * @param {Decoder} decoder\n */\nexport const readAny = decoder => readAnyLookupTable[127 - readUint8(decoder)](decoder)\n\n/**\n * T must not be null.\n *\n * @template T\n */\nexport class RleDecoder extends Decoder {\n /**\n * @param {Uint8Array} uint8Array\n * @param {function(Decoder):T} reader\n */\n constructor (uint8Array, reader) {\n super(uint8Array)\n /**\n * The reader\n */\n this.reader = reader\n /**\n * Current state\n * @type {T|null}\n */\n this.s = null\n this.count = 0\n }\n\n read () {\n if (this.count === 0) {\n this.s = this.reader(this)\n if (hasContent(this)) {\n this.count = readVarUint(this) + 1 // see encoder implementation for the reason why this is incremented\n } else {\n this.count = -1 // read the current value forever\n }\n }\n this.count--\n return /** @type {T} */ (this.s)\n }\n}\n\nexport class IntDiffDecoder extends Decoder {\n /**\n * @param {Uint8Array} uint8Array\n * @param {number} start\n */\n constructor (uint8Array, start) {\n super(uint8Array)\n /**\n * Current state\n * @type {number}\n */\n this.s = start\n }\n\n /**\n * @return {number}\n */\n read () {\n this.s += readVarInt(this)\n return this.s\n }\n}\n\nexport class RleIntDiffDecoder extends Decoder {\n /**\n * @param {Uint8Array} uint8Array\n * @param {number} start\n */\n constructor (uint8Array, start) {\n super(uint8Array)\n /**\n * Current state\n * @type {number}\n */\n this.s = start\n this.count = 0\n }\n\n /**\n * @return {number}\n */\n read () {\n if (this.count === 0) {\n this.s += readVarInt(this)\n if (hasContent(this)) {\n this.count = readVarUint(this) + 1 // see encoder implementation for the reason why this is incremented\n } else {\n this.count = -1 // read the current value forever\n }\n }\n this.count--\n return /** @type {number} */ (this.s)\n }\n}\n\nexport class UintOptRleDecoder extends Decoder {\n /**\n * @param {Uint8Array} uint8Array\n */\n constructor (uint8Array) {\n super(uint8Array)\n /**\n * @type {number}\n */\n this.s = 0\n this.count = 0\n }\n\n read () {\n if (this.count === 0) {\n this.s = readVarInt(this)\n // if the sign is negative, we read the count too, otherwise count is 1\n const isNegative = math.isNegativeZero(this.s)\n this.count = 1\n if (isNegative) {\n this.s = -this.s\n this.count = readVarUint(this) + 2\n }\n }\n this.count--\n return /** @type {number} */ (this.s)\n }\n}\n\nexport class IncUintOptRleDecoder extends Decoder {\n /**\n * @param {Uint8Array} uint8Array\n */\n constructor (uint8Array) {\n super(uint8Array)\n /**\n * @type {number}\n */\n this.s = 0\n this.count = 0\n }\n\n read () {\n if (this.count === 0) {\n this.s = readVarInt(this)\n // if the sign is negative, we read the count too, otherwise count is 1\n const isNegative = math.isNegativeZero(this.s)\n this.count = 1\n if (isNegative) {\n this.s = -this.s\n this.count = readVarUint(this) + 2\n }\n }\n this.count--\n return /** @type {number} */ (this.s++)\n }\n}\n\nexport class IntDiffOptRleDecoder extends Decoder {\n /**\n * @param {Uint8Array} uint8Array\n */\n constructor (uint8Array) {\n super(uint8Array)\n /**\n * @type {number}\n */\n this.s = 0\n this.count = 0\n this.diff = 0\n }\n\n /**\n * @return {number}\n */\n read () {\n if (this.count === 0) {\n const diff = readVarInt(this)\n // if the first bit is set, we read more data\n const hasCount = diff & 1\n this.diff = math.floor(diff / 2) // shift >> 1\n this.count = 1\n if (hasCount) {\n this.count = readVarUint(this) + 2\n }\n }\n this.s += this.diff\n this.count--\n return this.s\n }\n}\n\nexport class StringDecoder {\n /**\n * @param {Uint8Array} uint8Array\n */\n constructor (uint8Array) {\n this.decoder = new UintOptRleDecoder(uint8Array)\n this.str = readVarString(this.decoder)\n /**\n * @type {number}\n */\n this.spos = 0\n }\n\n /**\n * @return {string}\n */\n read () {\n const end = this.spos + this.decoder.read()\n const res = this.str.slice(this.spos, end)\n this.spos = end\n return res\n }\n}\n","import { __asyncGenerator, __asyncValues, __await } from \"tslib\";\nexport function consumeChunkedBinaryStream(source) {\n return __asyncGenerator(this, arguments, function* consumeChunkedBinaryStream_1() {\n var _a, e_1, _b, _c;\n let state = 0;\n let sizeBuf = new Uint8Array(4);\n let sizeBufPos = 0;\n let bufs = [];\n let len = 0;\n try {\n for (var _d = true, source_1 = __asyncValues(source), source_1_1; source_1_1 = yield __await(source_1.next()), _a = source_1_1.done, !_a; _d = true) {\n _c = source_1_1.value;\n _d = false;\n const chunk = _c;\n const dw = new DataView(chunk.buffer, chunk.byteOffset, chunk.byteLength);\n let pos = 0;\n while (pos < chunk.byteLength) {\n switch (state) {\n case 0:\n // Beginning of a size header\n if (pos + 4 > chunk.byteLength) {\n for (const b of chunk.slice(pos)) {\n if (sizeBufPos === 4)\n break;\n sizeBuf[sizeBufPos++] = b;\n ++pos;\n }\n if (sizeBufPos < 4) {\n // Need more bytes in order to read length.\n // Will go out from while loop as well because pos is defenitely = chunk.byteLength here.\n break;\n }\n }\n else if (sizeBufPos > 0 && sizeBufPos < 4) {\n for (const b of chunk.slice(pos, pos + 4 - sizeBufPos)) {\n sizeBuf[sizeBufPos++] = b;\n ++pos;\n }\n }\n // Intentional fall-through...\n case 1:\n len =\n sizeBufPos === 4\n ? new DataView(sizeBuf.buffer, 0, 4).getUint32(0, false)\n : dw.getUint32(pos, false);\n if (sizeBufPos)\n sizeBufPos = 0; // in this case pos is already forwarded\n else\n pos += 4; // else pos is not yet forwarded - that's why we do it now\n // Intentional fall-through...\n case 2:\n // Eat the chunk\n if (pos >= chunk.byteLength) {\n state = 2;\n break;\n }\n if (pos + len > chunk.byteLength) {\n bufs.push(chunk.slice(pos));\n len -= (chunk.byteLength - pos);\n state = 2;\n pos = chunk.byteLength; // will break while loop.\n }\n else {\n if (bufs.length > 0) {\n const concats = new Uint8Array(bufs.reduce((p, c) => p + c.byteLength, len));\n let p = 0;\n for (const buf of bufs) {\n concats.set(buf, p);\n p += buf.byteLength;\n }\n concats.set(chunk.slice(pos, pos + len), p);\n bufs = [];\n yield yield __await(concats);\n }\n else {\n yield yield __await(chunk.slice(pos, pos + len));\n }\n pos += len;\n state = 0;\n }\n break;\n }\n }\n }\n }\n catch (e_1_1) { e_1 = { error: e_1_1 }; }\n finally {\n try {\n if (!_d && !_a && (_b = source_1.return)) yield __await(_b.call(source_1));\n }\n finally { if (e_1) throw e_1.error; }\n }\n });\n}\n","import { TokenErrorResponse } from 'dexie-cloud-common';\n\nexport class TokenErrorResponseError extends Error {\n title: string;\n messageCode:\n | 'INVALID_OTP'\n | 'INVALID_EMAIL'\n | 'LICENSE_LIMIT_REACHED'\n | 'GENERIC_ERROR';\n message: string;\n messageParams?: { [param: string]: string };\n\n constructor({\n title,\n message,\n messageCode,\n messageParams,\n }: TokenErrorResponse) {\n super(message);\n this.name = 'TokenErrorResponseError';\n this.title = title;\n this.messageCode = messageCode;\n this.messageParams = messageParams;\n }\n}\n","import Dexie from 'dexie';\nimport { BehaviorSubject } from 'rxjs';\nimport { take } from 'rxjs/operators';\nimport { DexieCloudDB } from '../db/DexieCloudDB';\nimport { DXCAlert } from '../types/DXCAlert';\nimport { DXCInputField } from '../types/DXCInputField';\nimport { DXCUserInteraction } from '../types/DXCUserInteraction';\n\nexport interface DXCUserInteractionRequest {\n type: DXCUserInteraction['type'];\n title: string;\n alerts: DXCAlert[];\n submitLabel?: string;\n cancelLabel?: string | null;\n fields: { [name: string]: DXCInputField };\n}\n\nexport function interactWithUser<T extends DXCUserInteractionRequest>(\n userInteraction: BehaviorSubject<DXCUserInteraction | undefined>,\n req: T\n): Promise<{\n [P in keyof T['fields']]: string;\n}> {\n let done = false;\n return new Promise<{\n [P in keyof T['fields']]: string;\n }>((resolve, reject) => {\n const interactionProps = {\n submitLabel: 'Submit',\n cancelLabel: 'Cancel',\n ...req,\n onSubmit: (res: {\n [P in keyof T['fields']]: string;\n }) => {\n userInteraction.next(undefined);\n done = true;\n resolve(res);\n },\n onCancel: () => {\n userInteraction.next(undefined);\n done = true;\n reject(new Dexie.AbortError('User cancelled'));\n },\n } as DXCUserInteraction;\n userInteraction.next(interactionProps);\n // Start subscribing for external updates to db.cloud.userInteraction, and if so, cancel this request.\n /*const subscription = userInteraction.subscribe((currentInteractionProps) => {\n if (currentInteractionProps !== interactionProps) {\n if (subscription) subscription.unsubscribe();\n if (!done) {\n reject(new Dexie.AbortError(\"User cancelled\"));\n }\n }\n });*/\n });\n}\n\nexport function alertUser(\n userInteraction: BehaviorSubject<DXCUserInteraction | undefined>,\n title: string,\n ...alerts: DXCAlert[]\n) {\n return interactWithUser(userInteraction, {\n type: 'message-alert',\n title,\n alerts,\n fields: {},\n submitLabel: 'OK',\n cancelLabel: null,\n });\n}\n\nexport async function promptForEmail(\n userInteraction: BehaviorSubject<DXCUserInteraction | undefined>,\n title: string,\n emailHint?: string\n) {\n let email = emailHint || '';\n // Regular expression for email validation\n // ^[\\w-+.]+@([\\w-]+\\.)+[\\w-]{2,10}(\\sas\\s[\\w-+.]+@([\\w-]+\\.)+[\\w-]{2,10})?$\n //\n // ^[\\w-+.]+ : Matches the start of the string. Allows one or more word characters\n // (a-z, A-Z, 0-9, and underscore), hyphen, plus, or dot.\n //\n // @ : Matches the @ symbol.\n // ([\\w-]+\\.)+ : Matches one or more word characters or hyphens followed by a dot.\n // The plus sign outside the parentheses means this pattern can repeat one or more times,\n // allowing for subdomains.\n // [\\w-]{2,10} : Matches between 2 and 10 word characters or hyphens. This is typically for\n // the domain extension like .com, .net, etc.\n // (\\sas\\s[\\w-+.]+@([\\w-]+\\.)+[\\w-]{2,10})?$ : This part is optional (due to the ? at the end).\n // If present, it matches \" as \" followed by another valid email address. This allows for the\n // input to be either a single email address or two email addresses separated by \" as \". \n //\n // The use case for \"<email1> as <email2>\"\" is for when a database owner with full access to the\n // database needs to impersonate another user in the database in order to troubleshoot. This\n // format will only be possible to use when email1 is the owner of an API client with GLOBAL_READ\n // and GLOBAL_WRITE permissions on the database. The email will be checked on the server before\n // allowing it and giving out a token for email2, using the OTP sent to email1.\n while (!email || !/^[\\w-+.]+@([\\w-]+\\.)+[\\w-]{2,10}(\\sas\\s[\\w-+.]+@([\\w-]+\\.)+[\\w-]{2,10})?$/.test(email)) {\n email = (\n await interactWithUser(userInteraction, {\n type: 'email',\n title,\n alerts: email\n ? [\n {\n type: 'error',\n messageCode: 'INVALID_EMAIL',\n message: 'Please enter a valid email address',\n messageParams: {},\n },\n ]\n : [],\n fields: {\n email: {\n type: 'email',\n placeholder: 'you@somedomain.com',\n },\n },\n })\n ).email;\n }\n return email;\n}\n\nexport async function promptForOTP(\n userInteraction: BehaviorSubject<DXCUserInteraction | undefined>,\n email: string,\n alert?: DXCAlert\n) {\n const alerts: DXCAlert[] = [\n {\n type: 'info',\n messageCode: 'OTP_SENT',\n message: `A One-Time password has been sent to {email}`,\n messageParams: { email },\n },\n ];\n if (alert) {\n alerts.push(alert);\n }\n const { otp } = await interactWithUser(userInteraction, {\n type: 'otp',\n title: 'Enter OTP',\n alerts,\n fields: {\n otp: {\n type: 'otp',\n label: 'OTP',\n placeholder: 'Paste OTP here',\n },\n },\n });\n return otp;\n}\n\nexport async function confirmLogout(\n userInteraction: BehaviorSubject<DXCUserInteraction | undefined>,\n currentUserId: string,\n numUnsyncedChanges: number\n) {\n const alerts: DXCAlert[] = [\n {\n type: 'warning',\n messageCode: 'LOGOUT_CONFIRMATION',\n message: `{numUnsyncedChanges} unsynced changes will get lost!\n Logout anyway?`,\n messageParams: {\n currentUserId,\n numUnsyncedChanges: numUnsyncedChanges.toString(),\n }\n },\n ];\n return await interactWithUser(userInteraction, {\n type: 'logout-confirmation',\n title: 'Confirm Logout',\n alerts,\n fields: {},\n submitLabel: 'Confirm logout',\n cancelLabel: 'Cancel'\n })\n .then(() => true)\n .catch(() => false);\n}\n","import Dexie from 'dexie';\nimport type {\n RefreshTokenRequest,\n TokenErrorResponse,\n TokenFinalResponse,\n} from 'dexie-cloud-common';\nimport { b64encode } from 'dreambase-library/dist/common/base64';\nimport { BehaviorSubject } from 'rxjs';\nimport { DexieCloudDB } from '../db/DexieCloudDB';\nimport { UserLogin } from '../db/entities/UserLogin';\nimport { DXCAlert } from '../types/DXCAlert';\nimport {\n DXCMessageAlert,\n DXCUserInteraction,\n} from '../types/DXCUserInteraction';\nimport { TokenErrorResponseError } from './TokenErrorResponseError';\nimport { alertUser, interactWithUser } from './interactWithUser';\nimport { InvalidLicenseError } from '../InvalidLicenseError';\nimport { LoginHints } from '../DexieCloudAPI';\n\nexport type FetchTokenCallback = (tokenParams: {\n public_key: string;\n hints?: LoginHints;\n}) => Promise<TokenFinalResponse | TokenErrorResponse>;\n\nexport async function loadAccessToken(\n db: DexieCloudDB\n): Promise<UserLogin | null> {\n const currentUser = await db.getCurrentUser();\n const {\n accessToken,\n accessTokenExpiration,\n refreshToken,\n refreshTokenExpiration,\n claims,\n } = currentUser;\n if (!accessToken) return null;\n const expTime = accessTokenExpiration?.getTime() ?? Infinity;\n if (expTime > Date.now() && (currentUser.license?.status || 'ok') === 'ok') {\n return currentUser;\n }\n if (!refreshToken) {\n throw new Error(`Refresh token missing`);\n }\n const refreshExpTime = refreshTokenExpiration?.getTime() ?? Infinity;\n if (refreshExpTime <= Date.now()) {\n throw new Error(`Refresh token has expired`);\n }\n const refreshedLogin = await refreshAccessToken(\n db.cloud.options!.databaseUrl,\n currentUser\n );\n await db.table('$logins').update(claims.sub, {\n accessToken: refreshedLogin.accessToken,\n accessTokenExpiration: refreshedLogin.accessTokenExpiration,\n claims: refreshedLogin.claims,\n license: refreshedLogin.license,\n data: refreshedLogin.data,\n });\n return refreshedLogin;\n}\n\nexport async function authenticate(\n url: string,\n context: UserLogin,\n fetchToken: FetchTokenCallback,\n userInteraction: BehaviorSubject<DXCUserInteraction | undefined>,\n hints?: LoginHints\n): Promise<UserLogin> {\n if (\n context.accessToken &&\n context.accessTokenExpiration!.getTime() > Date.now()\n ) {\n return context;\n } else if (\n context.refreshToken &&\n (!context.refreshTokenExpiration ||\n context.refreshTokenExpiration.getTime() > Date.now())\n ) {\n return await refreshAccessToken(url, context);\n } else {\n return await userAuthenticate(context, fetchToken, userInteraction, hints);\n }\n}\n\nexport async function refreshAccessToken(\n url: string,\n login: UserLogin\n): Promise<UserLogin> {\n if (!login.refreshToken)\n throw new Error(`Cannot refresh token - refresh token is missing.`);\n if (!login.nonExportablePrivateKey)\n throw new Error(\n `login.nonExportablePrivateKey is missing - cannot sign refresh token without a private key.`\n );\n\n const time_stamp = Date.now();\n const signing_algorithm = 'RSASSA-PKCS1-v1_5';\n const textEncoder = new TextEncoder();\n const data = textEncoder.encode(login.refreshToken + time_stamp);\n const binarySignature = await crypto.subtle.sign(\n signing_algorithm,\n login.nonExportablePrivateKey,\n data\n );\n const signature = b64encode(binarySignature);\n\n const tokenRequest: RefreshTokenRequest = {\n grant_type: 'refresh_token',\n refresh_token: login.refreshToken,\n scopes: ['ACCESS_DB'],\n signature,\n signing_algorithm,\n time_stamp,\n };\n const res = await fetch(`${url}/token`, {\n body: JSON.stringify(tokenRequest),\n method: 'post',\n headers: { 'Content-Type': 'application/json' },\n mode: 'cors',\n });\n if (res.status !== 200)\n throw new Error(`RefreshToken: Status ${res.status} from ${url}/token`);\n const response: TokenFinalResponse | TokenErrorResponse = await res.json();\n if (response.type === 'error') {\n throw new TokenErrorResponseError(response);\n }\n login.accessToken = response.accessToken;\n login.accessTokenExpiration = response.accessTokenExpiration\n ? new Date(response.accessTokenExpiration)\n : undefined;\n login.claims = response.claims;\n login.license = {\n type: response.userType,\n status: response.claims.license || 'ok',\n }\n if (response.evalDaysLeft != null) {\n login.license.evalDaysLeft = response.evalDaysLeft;\n }\n if (response.userValidUntil != null) {\n login.license.validUntil = new Date(response.userValidUntil);\n }\n if (response.data) {\n login.data = response.data;\n }\n return login;\n}\n\nasync function userAuthenticate(\n context: UserLogin,\n fetchToken: FetchTokenCallback,\n userInteraction: BehaviorSubject<DXCUserInteraction | undefined>,\n hints?: LoginHints\n) {\n if (!crypto.subtle) {\n if (typeof location !== 'undefined' && location.protocol === 'http:') {\n throw new Error(`Dexie Cloud Addon needs to use WebCrypto, but your browser has disabled it due to being served from an insecure location. Please serve it from https or http://localhost:<port> (See https://stackoverflow.com/questions/46670556/how-to-enable-crypto-subtle-for-unsecure-origins-in-chrome/46671627#46671627)`);\n } else {\n throw new Error(`This browser does not support WebCrypto.`);\n }\n }\n const { privateKey, publicKey } = await crypto.subtle.generateKey(\n {\n name: 'RSASSA-PKCS1-v1_5',\n modulusLength: 2048,\n publicExponent: new Uint8Array([0x01, 0x00, 0x01]),\n hash: { name: 'SHA-256' },\n },\n false, // Non-exportable...\n ['sign', 'verify']\n );\n if (!privateKey || !publicKey)\n throw new Error(`Could not generate RSA keypair`); // Typings suggest these can be undefined...\n context.nonExportablePrivateKey = privateKey; //...but storable!\n const publicKeySPKI = await crypto.subtle.exportKey('spki', publicKey);\n const publicKeyPEM = spkiToPEM(publicKeySPKI);\n context.publicKey = publicKey;\n\n try {\n const response2 = await fetchToken({\n public_key: publicKeyPEM,\n hints,\n });\n\n if (response2.type === 'error') {\n throw new TokenErrorResponseError(response2);\n }\n\n if (response2.type !== 'tokens')\n throw new Error(\n `Unexpected response type from token endpoint: ${(response2 as any).type}`\n );\n\n /*const licenseStatus = response2.claims.license || 'ok';\n if (licenseStatus !== 'ok') {\n throw new InvalidLicenseError(licenseStatus);\n }*/\n\n context.accessToken = response2.accessToken;\n context.accessTokenExpiration = new Date(response2.accessTokenExpiration);\n context.refreshToken = response2.refreshToken;\n if (response2.refreshTokenExpiration) {\n context.refreshTokenExpiration = new Date(\n response2.refreshTokenExpiration\n );\n }\n context.userId = response2.claims.sub;\n context.email = response2.claims.email;\n context.name = response2.claims.name;\n context.claims = response2.claims;\n context.license = {\n type: response2.userType,\n status: response2.claims.license || 'ok',\n }\n context.data = response2.data;\n if (response2.evalDaysLeft != null) {\n context.license.evalDaysLeft = response2.evalDaysLeft;\n }\n if (response2.userValidUntil != null) {\n context.license.validUntil = new Date(response2.userValidUntil);\n }\n\n if (response2.alerts && response2.alerts.length > 0) {\n await interactWithUser(userInteraction, {\n type: 'message-alert',\n title: 'Authentication Alert',\n fields: {},\n alerts: response2.alerts as DXCAlert[],\n });\n }\n return context;\n } catch (error) {\n if (error instanceof TokenErrorResponseError) {\n await alertUser(userInteraction, error.title, {\n type: 'error',\n messageCode: error.messageCode,\n message: error.message,\n messageParams: {},\n });\n throw error;\n }\n let message = `We're having a problem authenticating right now.`;\n console.error (`Error authenticating`, error);\n if (error instanceof TypeError) {\n const isOffline = typeof navigator !== undefined && !navigator.onLine;\n if (isOffline) {\n message = `You seem to be offline. Please connect to the internet and try again.`;\n } else if (Dexie.debug || (typeof location !== 'undefined' && (location.hostname === 'localhost' || location.hostname === '127.0.0.1'))) {\n // The audience is most likely the developer. Suggest to whitelist the localhost origin:\n message = `Could not connect to server. Please verify that your origin '${location.origin}' is whitelisted using \\`npx dexie-cloud whitelist\\``;\n } else {\n message = `Could not connect to server. Please verify the connection.`;\n }\n await alertUser(userInteraction, 'Authentication Failed', {\n type: 'error',\n messageCode: 'GENERIC_ERROR',\n message,\n messageParams: {},\n }).catch(() => {}); \n }\n\n throw error;\n }\n}\n\nfunction spkiToPEM(keydata: ArrayBuffer) {\n const keydataB64 = b64encode(keydata);\n const keydataB64Pem = formatAsPem(keydataB64);\n return keydataB64Pem;\n}\n\nfunction formatAsPem(str: string) {\n let finalString = '-----BEGIN PUBLIC KEY-----\\n';\n\n while (str.length > 0) {\n finalString += str.substring(0, 64) + '\\n';\n str = str.substring(64);\n }\n\n finalString = finalString + '-----END PUBLIC KEY-----';\n\n return finalString;\n}\n","const { toString: toStr } = {};\nfunction getToStringTag(val) {\n return toStr.call(val).slice(8, -1);\n}\nexport function escapeDollarProps(value) {\n const keys = Object.keys(value);\n let dollarKeys = null;\n for (let i = 0, l = keys.length; i < l; ++i) {\n if (keys[i][0] === \"$\") {\n dollarKeys = dollarKeys || [];\n dollarKeys.push(keys[i]);\n }\n }\n if (!dollarKeys)\n return value;\n const clone = { ...value };\n for (const k of dollarKeys) {\n delete clone[k];\n }\n for (const k of dollarKeys) {\n clone[\"$\" + k] = value[k];\n }\n return clone;\n}\nconst ObjectDef = {\n replace: escapeDollarProps,\n};\nexport function TypesonSimplified(...typeDefsInputs) {\n const typeDefs = typeDefsInputs.reduce((p, c) => ({ ...p, ...c }), typeDefsInputs.reduce((p, c) => ({ ...c, ...p }), {}));\n const protoMap = new WeakMap();\n return {\n stringify(value, alternateChannel, space) {\n const json = JSON.stringify(value, function (key) {\n const realVal = this[key];\n const typeDef = getTypeDef(realVal);\n return typeDef\n ? typeDef.replace(realVal, alternateChannel, typeDefs)\n : realVal;\n }, space);\n return json;\n },\n parse(tson, alternateChannel) {\n const stack = [];\n return JSON.parse(tson, function (key, value) {\n //\n // Parent Part\n //\n const type = value === null || value === void 0 ? void 0 : value.$t;\n if (type) {\n const typeDef = typeDefs[type];\n value = typeDef\n ? typeDef.revive(value, alternateChannel, typeDefs)\n : value;\n }\n let top = stack[stack.length - 1];\n if (top && top[0] === value) {\n // Do what the kid told us to\n // Unescape dollar props\n value = { ...value };\n // Delete keys that children wanted us to delete\n for (const k of top[1])\n delete value[k];\n // Set keys that children wanted us to set\n for (const [k, v] of Object.entries(top[2])) {\n value[k] = v;\n }\n stack.pop();\n }\n //\n // Child part\n //\n if (value === undefined || (key[0] === \"$\" && key !== \"$t\")) {\n top = stack[stack.length - 1];\n let deletes;\n let mods;\n if (top && top[0] === this) {\n deletes = top[1];\n mods = top[2];\n }\n else {\n stack.push([this, (deletes = []), (mods = {})]);\n }\n if (key[0] === \"$\" && key !== \"$t\") {\n // Unescape props (also preserves undefined if this is a combo)\n deletes.push(key);\n mods[key.substr(1)] = value;\n }\n else {\n // Preserve undefined\n mods[key] = undefined;\n }\n }\n return value;\n });\n },\n };\n function getTypeDef(realVal) {\n const type = typeof realVal;\n switch (typeof realVal) {\n case \"object\":\n case \"function\": {\n // \"object\", \"function\", null\n if (realVal === null)\n return null;\n const proto = Object.getPrototypeOf(realVal);\n if (!proto)\n return ObjectDef;\n let typeDef = protoMap.get(proto);\n if (typeDef !== undefined)\n return typeDef; // Null counts to! So the caching of Array.prototype also counts.\n const toStringTag = getToStringTag(realVal);\n const entry = Object.entries(typeDefs).find(([typeName, typeDef]) => { var _a, _b; return (_b = (_a = typeDef === null || typeDef === void 0 ? void 0 : typeDef.test) === null || _a === void 0 ? void 0 : _a.call(typeDef, realVal, toStringTag)) !== null && _b !== void 0 ? _b : typeName === toStringTag; });\n typeDef = entry === null || entry === void 0 ? void 0 : entry[1];\n if (!typeDef) {\n typeDef = Array.isArray(realVal)\n ? null\n : typeof realVal === \"function\"\n ? typeDefs.function || null\n : ObjectDef;\n }\n protoMap.set(proto, typeDef);\n return typeDef;\n }\n default:\n return typeDefs[type];\n }\n }\n}\n","export const BisonBinaryTypes = {\n Blob: {\n test: (blob, toStringTag) => toStringTag === \"Blob\",\n replace: (blob, altChannel) => {\n const i = altChannel.length;\n altChannel.push(blob);\n return {\n $t: \"Blob\",\n mimeType: blob.type,\n i,\n };\n },\n revive: ({ i, mimeType }, altChannel) => new Blob([altChannel[i]], { type: mimeType }),\n },\n};\n","export default {\n number: {\n replace: (num) => {\n switch (true) {\n case isNaN(num):\n return { $t: \"number\", v: \"NaN\" };\n case num === Infinity:\n return { $t: \"number\", v: \"Infinity\" };\n case num === -Infinity:\n return { $t: \"number\", v: \"-Infinity\" };\n default:\n return num;\n }\n },\n revive: ({ v }) => Number(v),\n },\n};\n","const bigIntDef = {\n bigint: {\n replace: (realVal) => {\n return { $t: \"bigint\", v: \"\" + realVal };\n },\n revive: (obj) => BigInt(obj.v),\n },\n};\nexport default bigIntDef;\n","export default {\n Date: {\n replace: (date) => ({\n $t: \"Date\",\n v: isNaN(date.getTime()) ? \"NaN\" : date.toISOString(),\n }),\n revive: ({ v }) => new Date(v === \"NaN\" ? NaN : Date.parse(v)),\n },\n};\n","export default {\n Set: {\n replace: (set) => ({\n $t: \"Set\",\n v: Array.from(set.entries()),\n }),\n revive: ({ v }) => new Set(v),\n },\n};\n","export default {\n Map: {\n replace: (map) => ({\n $t: \"Map\",\n v: Array.from(map.entries()),\n }),\n revive: ({ v }) => new Map(v),\n },\n};\n","export const _global = typeof globalThis !== \"undefined\" // All modern environments (node, bun, deno, browser, workers, webview etc)\n ? globalThis\n : typeof self !== \"undefined\" // Older browsers, workers, webview, window etc\n ? self\n : typeof global !== \"undefined\" // Older versions of node\n ? global\n : undefined; // Unsupported environment. No idea to return 'this' since we are in a module or a function scope anyway.\n","import { _global } from \"../../common/_global.js\";\nexport default [\n \"Int8Array\",\n \"Uint8Array\",\n \"Uint8ClampedArray\",\n \"Int16Array\",\n \"Uint16Array\",\n \"Int32Array\",\n \"Uint32Array\",\n \"Float32Array\",\n \"Float64Array\",\n \"DataView\",\n \"BigInt64Array\",\n \"BigUint64Array\",\n].reduce((specs, typeName) => ({\n ...specs,\n [typeName]: {\n // Replace passes the the typed array into $t, buffer so that\n // the ArrayBuffer typedef takes care of further handling of the buffer:\n // {$t:\"Uint8Array\",buffer:{$t:\"ArrayBuffer\",idx:0}}\n // CHANGED ABOVE! Now shortcutting that for more sparse format of the typed arrays\n // to contain the b64 property directly.\n replace: (a, _, typeDefs) => {\n const result = {\n $t: typeName,\n v: typeDefs.ArrayBuffer.replace(a.byteOffset === 0 && a.byteLength === a.buffer.byteLength\n ? a.buffer\n : a.buffer.slice(a.byteOffset, a.byteOffset + a.byteLength), _, typeDefs).v,\n };\n return result;\n },\n revive: ({ v }, _, typeDefs) => {\n const TypedArray = _global[typeName];\n return (TypedArray &&\n new TypedArray(typeDefs.ArrayBuffer.revive({ v }, _, typeDefs)));\n },\n },\n}), {});\n","import { b64decode, b64encode } from \"./base64.js\";\nexport function b64LexEncode(b) {\n return b64ToLex(b64encode(b));\n}\nexport function b64LexDecode(b64Lex) {\n return b64decode(lexToB64(b64Lex));\n}\nexport function b64ToLex(base64) {\n var encoded = \"\";\n for (var i = 0, length = base64.length; i < length; i++) {\n encoded += ENCODE_TABLE[base64[i]];\n }\n return encoded;\n}\nexport function lexToB64(base64lex) {\n // only accept string input\n if (typeof base64lex !== \"string\") {\n throw new Error(\"invalid decoder input: \" + base64lex);\n }\n var base64 = \"\";\n for (var i = 0, length = base64lex.length; i < length; i++) {\n base64 += DECODE_TABLE[base64lex[i]];\n }\n return base64;\n}\nconst DECODE_TABLE = {\n \"-\": \"=\",\n \"0\": \"A\",\n \"1\": \"B\",\n \"2\": \"C\",\n \"3\": \"D\",\n \"4\": \"E\",\n \"5\": \"F\",\n \"6\": \"G\",\n \"7\": \"H\",\n \"8\": \"I\",\n \"9\": \"J\",\n A: \"K\",\n B: \"L\",\n C: \"M\",\n D: \"N\",\n E: \"O\",\n F: \"P\",\n G: \"Q\",\n H: \"R\",\n I: \"S\",\n J: \"T\",\n K: \"U\",\n L: \"V\",\n M: \"W\",\n N: \"X\",\n O: \"Y\",\n P: \"Z\",\n Q: \"a\",\n R: \"b\",\n S: \"c\",\n T: \"d\",\n U: \"e\",\n V: \"f\",\n W: \"g\",\n X: \"h\",\n Y: \"i\",\n Z: \"j\",\n _: \"k\",\n a: \"l\",\n b: \"m\",\n c: \"n\",\n d: \"o\",\n e: \"p\",\n f: \"q\",\n g: \"r\",\n h: \"s\",\n i: \"t\",\n j: \"u\",\n k: \"v\",\n l: \"w\",\n m: \"x\",\n n: \"y\",\n o: \"z\",\n p: \"0\",\n q: \"1\",\n r: \"2\",\n s: \"3\",\n t: \"4\",\n u: \"5\",\n v: \"6\",\n w: \"7\",\n x: \"8\",\n y: \"9\",\n z: \"+\",\n \"|\": \"/\",\n};\nconst ENCODE_TABLE = {};\nfor (const c of Object.keys(DECODE_TABLE)) {\n ENCODE_TABLE[DECODE_TABLE[c]] = c;\n}\n","import { b64LexDecode, b64LexEncode } from \"../../common/b64lex.js\";\nexport default {\n ArrayBuffer: {\n replace: (ab) => ({\n $t: \"ArrayBuffer\",\n v: b64LexEncode(ab),\n }),\n revive: ({ v }) => {\n const ba = b64LexDecode(v);\n return ba.buffer.byteLength === ba.byteLength\n ? ba.buffer\n : ba.buffer.slice(ba.byteOffset, ba.byteOffset + ba.byteLength);\n },\n },\n};\n","export class FakeBlob {\n constructor(buf, type) {\n this.buf = buf;\n this.type = type;\n }\n}\n","export function readBlobSync(b) {\n const req = new XMLHttpRequest();\n req.overrideMimeType(\"text/plain; charset=x-user-defined\");\n req.open(\"GET\", URL.createObjectURL(b), false); // Sync\n req.send();\n if (req.status !== 200 && req.status !== 0) {\n throw new Error(\"Bad Blob access: \" + req.status);\n }\n return req.responseText;\n}\n","export function string2ArrayBuffer(str) {\n const array = new Uint8Array(str.length);\n for (let i = 0; i < str.length; ++i) {\n array[i] = str.charCodeAt(i); // & 0xff;\n }\n return array.buffer;\n}\nexport function arrayBuffer2String(buf) {\n // TODO: Optimize\n return new Uint8Array(buf).reduce((s, byte) => s + String.fromCharCode(byte), \"\");\n}\n","import { b64decode, b64encode } from \"../../common/base64.js\";\nimport { FakeBlob } from \"../FakeBlob.js\";\nimport { readBlobSync } from \"../readBlobSync.js\";\nimport { string2ArrayBuffer } from \"../string2ArrayBuffer.js\";\nexport default {\n Blob: {\n test: (blob, toStringTag) => toStringTag === \"Blob\" || blob instanceof FakeBlob,\n replace: (blob) => ({\n $t: \"Blob\",\n v: blob instanceof FakeBlob\n ? b64encode(blob.buf)\n : b64encode(string2ArrayBuffer(readBlobSync(blob))),\n type: blob.type,\n }),\n revive: ({ type, v }) => {\n const ab = b64decode(v);\n return typeof Blob !== undefined\n ? new Blob([ab])\n : new FakeBlob(ab.buffer, type);\n },\n },\n};\n","import numberDef from \"../types/number.js\";\nimport bigintDef from \"../types/bigint.js\";\nimport DateDef from \"../types/Date.js\";\nimport SetDef from \"../types/Set.js\";\nimport MapDef from \"../types/Map.js\";\nimport TypedArraysDefs from \"../types/TypedArray.js\";\nimport ArrayBufferDef from \"../types/ArrayBuffer.js\";\nimport BlobDef from \"../types/Blob.js\";\nconst builtin = {\n ...numberDef,\n ...bigintDef,\n ...DateDef,\n ...SetDef,\n ...MapDef,\n ...TypedArraysDefs,\n ...ArrayBufferDef,\n ...BlobDef, // Should be moved to another preset for DOM types (or universal? since it supports node as well with FakeBlob)\n};\nexport default builtin;\n","import { BisonBinaryTypes } from \"./BisonBinaryTypes.js\";\nimport builtin from \"./presets/builtin.js\";\nimport { TypesonSimplified } from \"./TypesonSimplified.js\";\nexport function Bison(...typeDefsInputs) {\n const tson = TypesonSimplified(builtin, BisonBinaryTypes, ...typeDefsInputs);\n return {\n toBinary(value) {\n const [blob, json] = this.stringify(value);\n const lenBuf = new ArrayBuffer(4);\n new DataView(lenBuf).setUint32(0, blob.size);\n return new Blob([lenBuf, blob, json]);\n },\n stringify(value) {\n const binaries = [];\n const json = tson.stringify(value, binaries);\n const blob = new Blob(binaries.map((b) => {\n const lenBuf = new ArrayBuffer(4);\n new DataView(lenBuf).setUint32(0, \"byteLength\" in b ? b.byteLength : b.size);\n return new Blob([lenBuf, b]);\n }));\n return [blob, json];\n },\n async parse(json, binData) {\n let pos = 0;\n const arrayBuffers = [];\n const buf = await readBlobBinary(binData);\n const view = new DataView(buf);\n while (pos < buf.byteLength) {\n const len = view.getUint32(pos);\n pos += 4;\n const ab = buf.slice(pos, pos + len);\n pos += len;\n arrayBuffers.push(ab);\n }\n return tson.parse(json, arrayBuffers);\n },\n async fromBinary(blob) {\n const len = new DataView(await readBlobBinary(blob.slice(0, 4))).getUint32(0);\n const binData = blob.slice(4, len + 4);\n const json = await readBlob(blob.slice(len + 4));\n return await this.parse(json, binData);\n },\n };\n}\nexport function readBlob(blob) {\n return new Promise((resolve, reject) => {\n const reader = new FileReader();\n reader.onabort = (ev) => reject(new Error(\"file read aborted\"));\n reader.onerror = (ev) => reject(ev.target.error);\n reader.onload = (ev) => resolve(ev.target.result);\n reader.readAsText(blob);\n });\n}\nexport function readBlobBinary(blob) {\n return new Promise((resolve, reject) => {\n const reader = new FileReader();\n reader.onabort = (ev) => reject(new Error(\"file read aborted\"));\n reader.onerror = (ev) => reject(ev.target.error);\n reader.onload = (ev) => resolve(ev.target.result);\n reader.readAsArrayBuffer(blob);\n });\n}\n","/** The undefined type is not part of builtin but can be manually added.\n * The reason for supporting undefined is if the following object should be revived correctly:\n *\n * {foo: undefined}\n *\n * Without including this typedef, the revived object would just be {}.\n * If including this typedef, the revived object would be {foo: undefined}.\n */\nexport default {\n undefined: {\n replace: () => ({\n $t: \"undefined\"\n }),\n revive: () => undefined,\n },\n};\n","import { b64decode, b64encode } from \"../../common/base64.js\";\nimport { readBlobSync } from \"../readBlobSync.js\";\nimport { string2ArrayBuffer } from \"../string2ArrayBuffer.js\";\nexport default {\n File: {\n test: (file, toStringTag) => toStringTag === \"File\",\n replace: (file) => ({\n $t: \"File\",\n v: b64encode(string2ArrayBuffer(readBlobSync(file))),\n type: file.type,\n name: file.name,\n lastModified: new Date(file.lastModified).toISOString(),\n }),\n revive: ({ type, v, name, lastModified }) => {\n const ab = b64decode(v);\n return new File([ab], name, {\n type,\n lastModified: new Date(lastModified).getTime(),\n });\n },\n },\n};\n","import { TypesonSimplified } from 'dreambase-library/dist/typeson-simplified/TypesonSimplified';\nimport { Bison } from 'dreambase-library/dist/typeson-simplified/Bison';\nimport undefinedDef from 'dreambase-library/dist/typeson-simplified/types/undefined.js';\nimport tsonBuiltinDefs from 'dreambase-library/dist/typeson-simplified/presets/builtin.js';\nimport { TypeDefSet } from 'dreambase-library/dist/typeson-simplified/TypeDefSet';\nimport { PropModSpec, PropModification } from 'dexie';\nimport FileDef from \"dreambase-library/dist/typeson-simplified/types/File.js\";\n\n// Since server revisions are stored in bigints, we need to handle clients without\n// bigint support to not fail when serverRevision is passed over to client.\n// We need to not fail when reviving it and we need to somehow store the information.\n// Since the revived version will later on be put into indexedDB we have another\n// issue: When reading it back from indexedDB we will get a poco object that we\n// cannot replace correctly when sending it to server. So we will also need\n// to do an explicit workaround in the protocol where a bigint is supported.\n// The workaround should be there regardless if browser supports BigInt or not, because\n// the serverRev might have been stored in IDB before the browser was upgraded to support bigint.\n//\n// if (typeof serverRev.rev !== \"bigint\")\n// if (hasBigIntSupport)\n// serverRev.rev = bigIntDef.bigint.revive(server.rev)\n// else\n// serverRev.rev = new FakeBigInt(server.rev)\nexport const hasBigIntSupport =\n typeof BigInt === 'function' && typeof BigInt(0) === 'bigint';\n\nfunction getValueOfBigInt(x: bigint | FakeBigInt | string) {\n if (typeof x === 'bigint') {\n return x;\n }\n if (hasBigIntSupport) {\n return typeof x === 'string' ? BigInt(x) : BigInt(x.v);\n } else {\n return typeof x === 'string' ? Number(x) : Number(x.v);\n }\n}\n\nexport function compareBigInts(\n a: bigint | FakeBigInt | string,\n b: bigint | FakeBigInt | string\n) {\n const valA = getValueOfBigInt(a);\n const valB = getValueOfBigInt(b);\n return valA < valB ? -1 : valA > valB ? 1 : 0;\n}\nexport class FakeBigInt {\n v: string;\n toString() {\n return this.v;\n }\n constructor(value: string) {\n this.v = value;\n }\n}\n\nconst bigIntDef = hasBigIntSupport\n ? {}\n : {\n bigint: {\n test: (val: any) => val instanceof FakeBigInt,\n replace: (fakeBigInt: any) => {\n return {\n $t: 'bigint',\n ...fakeBigInt,\n };\n },\n revive: ({ v }: { $t: 'bigint'; v: string }) =>\n new FakeBigInt(v) as any as bigint,\n },\n };\n\nconst defs: TypeDefSet = {\n ...undefinedDef,\n ...bigIntDef,\n ...FileDef,\n PropModification: {\n test: (val: any) => val instanceof PropModification,\n replace: (propModification: any) => {\n return {\n $t: 'PropModification',\n ...propModification['@@propmod'],\n };\n },\n revive: ({\n $t, // strip '$t'\n ...propModSpec // keep the rest\n }: {\n $t: 'PropModification';\n } & PropModSpec) => new PropModification(propModSpec),\n },\n};\n\nexport const TSON = TypesonSimplified(tsonBuiltinDefs, defs);\n\nexport const BISON = Bison(defs);\n","export class HttpError extends Error {\n httpStatus: number;\n constructor(\n res: Response,\n message?: string)\n {\n super(message || `${res.status} ${res.statusText}`);\n this.httpStatus = res.status;\n }\n\n get name() {\n return \"HttpError\";\n }\n}\n","import Dexie, { DBCoreSchema } from 'dexie';\nimport {\n DBInsertOperation,\n DBOperation,\n DBOperationsSet,\n DBOpPrimaryKey,\n} from 'dexie-cloud-common';\nimport { UserLogin } from '../db/entities/UserLogin';\n\nexport function encodeIdsForServer(\n schema: DBCoreSchema,\n currentUser: UserLogin,\n changes: DBOperationsSet\n): DBOperationsSet {\n const rv: DBOperationsSet = [];\n for (let change of changes) {\n const { table, muts } = change;\n const tableSchema = schema.tables.find((t) => t.name === table);\n if (!tableSchema)\n throw new Error(\n `Internal error: table ${table} not found in DBCore schema`\n );\n const { primaryKey } = tableSchema;\n let changeClone = change;\n muts.forEach((mut, mutIndex) => {\n const rewriteValues =\n !primaryKey.outbound &&\n (mut.type === 'upsert' || mut.type === 'insert');\n mut.keys.forEach((key, keyIndex) => {\n if (Array.isArray(key)) {\n // Server only support string keys. Dexie Cloud client support strings or array of strings.\n if (changeClone === change)\n changeClone = cloneChange(change, rewriteValues);\n const mutClone = changeClone.muts[mutIndex];\n const rewrittenKey = JSON.stringify(key);\n mutClone.keys[keyIndex] = rewrittenKey;\n /* Bug (#1777)\n We should not rewrite values. It will fail because the key is array and the value is string.\n Only the keys should be rewritten and it's already done on the server.\n We should take another round of revieweing how key transformations are being done between\n client and server and let the server do the key transformations entirely instead now that\n we have the primary key schema on the server making it possible to do so.\n if (rewriteValues) {\n Dexie.setByKeyPath(\n (mutClone as DBInsertOperation).values[keyIndex],\n primaryKey.keyPath!,\n rewrittenKey\n );\n }*/\n } else if (key[0] === '#') {\n // Private ID - translate!\n if (changeClone === change)\n changeClone = cloneChange(change, rewriteValues);\n const mutClone = changeClone.muts[mutIndex];\n if (!currentUser.isLoggedIn)\n throw new Error(\n `Internal error: Cannot sync private IDs before authenticated`\n );\n const rewrittenKey = `${key}:${currentUser.userId}`;\n mutClone.keys[keyIndex] = rewrittenKey;\n if (rewriteValues) {\n Dexie.setByKeyPath(\n (mutClone as DBInsertOperation).values[keyIndex],\n primaryKey.keyPath!,\n rewrittenKey\n );\n }\n }\n });\n });\n rv.push(changeClone);\n }\n return rv;\n}\n\nfunction cloneChange(change: DBOperationsSet[number], rewriteValues: boolean) {\n // clone on demand:\n return {\n ...change,\n muts: rewriteValues\n ? change.muts.map((m) => {\n return (m.type === 'insert' || m.type === 'upsert') && m.values\n ? {\n ...m,\n keys: m.keys.slice(),\n values: m.values.slice(),\n }\n : {\n ...m,\n keys: m.keys.slice(),\n };\n })\n : change.muts.map((m) => ({ ...m, keys: m.keys.slice() })),\n };\n}\n","import { DexieCloudDB } from '../db/DexieCloudDB';\n\n// If we get Ratelimit-Limit and Ratelimit-Remaining where Ratelimit-Remaining is below\n// (Ratelimit-Limit / 2), we should delay the next sync by (Ratelimit-Reset / Ratelimit-Remaining)\n// seconds (given that there is a Ratelimit-Reset header).\n\nlet syncRatelimitDelays = new WeakMap<DexieCloudDB, Date>();\n\nexport async function checkSyncRateLimitDelay(db: DexieCloudDB) {\n const delatMilliseconds = (syncRatelimitDelays.get(db)?.getTime() ?? 0) - Date.now();\n if (delatMilliseconds > 0) {\n console.debug(`Stalling sync request ${delatMilliseconds} ms to spare ratelimits`);\n await new Promise(resolve => setTimeout(resolve, delatMilliseconds));\n }\n}\n\nexport function updateSyncRateLimitDelays(db: DexieCloudDB, res: Response) {\n const limit = res.headers.get('Ratelimit-Limit');\n const remaining = res.headers.get('Ratelimit-Remaining');\n const reset = res.headers.get('Ratelimit-Reset');\n if (limit && remaining && reset) {\n const limitNum = Number(limit);\n const remainingNum = Math.max(0, Number(remaining));\n const willResetInSeconds = Number(reset);\n if (remainingNum < limitNum / 2) {\n const delay = Math.ceil(willResetInSeconds / (remainingNum + 1));\n syncRatelimitDelays.set(db, new Date(Date.now() + delay * 1000));\n console.debug(`Sync ratelimit delay set to ${delay} seconds`);\n } else {\n syncRatelimitDelays.delete(db);\n console.debug(`Sync ratelimit delay cleared`);\n }\n }\n}\n","import { DexieCloudDB } from '../db/DexieCloudDB';\nimport { PersistedSyncState } from '../db/entities/PersistedSyncState';\nimport { loadAccessToken } from '../authentication/authenticate';\nimport { BISON, TSON } from '../TSON';\nimport { getSyncableTables } from '../helpers/getSyncableTables';\nimport { BaseRevisionMapEntry } from '../db/entities/BaseRevisionMapEntry';\nimport { HttpError } from '../errors/HttpError';\nimport {\n DBOperationsSet,\n DexieCloudSchema,\n SyncRequest,\n SyncResponse,\n YClientMessage,\n} from 'dexie-cloud-common';\nimport { encodeIdsForServer } from './encodeIdsForServer';\nimport { UserLogin } from '../db/entities/UserLogin';\nimport { updateSyncRateLimitDelays } from './ratelimit';\n//import {BisonWebStreamReader} from \"dreambase-library/dist/typeson-simplified/BisonWebStreamReader\";\n\nexport async function syncWithServer(\n changes: DBOperationsSet,\n y: YClientMessage[],\n syncState: PersistedSyncState | undefined,\n baseRevs: BaseRevisionMapEntry[],\n db: DexieCloudDB,\n databaseUrl: string,\n schema: DexieCloudSchema | null,\n clientIdentity: string,\n currentUser: UserLogin\n): Promise<SyncResponse> {\n //\n // Push changes to server using fetch\n //\n const headers: HeadersInit = {\n Accept: 'application/json, application/x-bison, application/x-bison-stream',\n 'Content-Type': 'application/tson',\n };\n const updatedUser = await loadAccessToken(db);\n /*\n if (updatedUser?.license && changes.length > 0) {\n if (updatedUser.license.status === 'expired') {\n throw new Error(`License has expired`);\n }\n if (updatedUser.license.status === 'deactivated') {\n throw new Error(`License deactivated`);\n }\n }\n */\n const accessToken = updatedUser?.accessToken;\n if (accessToken) {\n headers.Authorization = `Bearer ${accessToken}`;\n }\n\n const syncRequest: SyncRequest = {\n v: 2,\n dbID: syncState?.remoteDbId,\n clientIdentity,\n schema: schema || {},\n lastPull: syncState\n ? {\n serverRevision: syncState.serverRevision!,\n yServerRevision: syncState.yServerRevision,\n realms: syncState.realms,\n inviteRealms: syncState.inviteRealms,\n }\n : undefined,\n baseRevs,\n changes: encodeIdsForServer(db.dx.core.schema, currentUser, changes),\n y,\n dxcv: db.cloud.version\n };\n console.debug('Sync request', syncRequest);\n db.syncStateChangedEvent.next({\n phase: 'pushing',\n });\n const body = TSON.stringify(syncRequest);\n const res = await fetch(`${databaseUrl}/sync`, {\n method: 'post',\n headers,\n credentials: 'include', // For Arr Affinity cookie only, for better Rate-Limit counting only.\n body,\n });\n //const contentLength = Number(res.headers.get('content-length'));\n db.syncStateChangedEvent.next({\n phase: 'pulling',\n });\n\n updateSyncRateLimitDelays(db, res);\n\n if (!res.ok) {\n throw new HttpError(res);\n }\n\n switch (res.headers.get('content-type')) {\n case 'application/x-bison':\n return BISON.fromBinary(await res.blob());\n case 'application/x-bison-stream': //return BisonWebStreamReader(BISON, res);\n default:\n case 'application/json': {\n const text = await res.text();\n const syncRes = TSON.parse(text);\n return syncRes;\n }\n }\n}\n","import Dexie from \"dexie\";\n\nexport interface CancelToken {\n cancelled: boolean;\n}\n\nexport function throwIfCancelled(cancelToken?: CancelToken) {\n if (cancelToken?.cancelled) throw new Dexie.AbortError(`Operation was cancelled`);\n}\n","/* Need this because navigator.onLine seems to say \"false\" when it is actually online.\n This function relies initially on navigator.onLine but then uses online and offline events\n which seem to be more reliable.\n*/\nexport let isOnline = false;\nif (typeof self !== 'undefined' && typeof navigator !== 'undefined') {\n isOnline = navigator.onLine;\n self.addEventListener('online', ()=>isOnline = true);\n self.addEventListener('offline', ()=>isOnline = false);\n}\n","import { DexieCloudDB } from '../db/DexieCloudDB';\nimport { DexieCloudSchema, SyncResponse } from 'dexie-cloud-common';\n\nexport async function updateBaseRevs(db: DexieCloudDB, schema: DexieCloudSchema, latestRevisions: { [table: string]: number; }, serverRev: any) {\n await db.$baseRevs.bulkPut(\n Object.keys(schema)\n .filter((table) => schema[table].markedForSync)\n .map((tableName) => {\n const lastClientRevOnPreviousServerRev = latestRevisions[tableName] || 0;\n return {\n tableName,\n clientRev: lastClientRevOnPreviousServerRev + 1,\n serverRev,\n };\n })\n );\n}\n","import { DBOperationsSet } from 'dexie-cloud-common';\n\nexport function getLatestRevisionsPerTable(\n clientChangeSet: DBOperationsSet,\n lastRevisions = {} as { [table: string]: number; }) {\n for (const { table, muts } of clientChangeSet) {\n const lastRev = muts.length > 0 ? muts[muts.length - 1].rev : null;\n lastRevisions[table] = lastRev || lastRevisions[table] || 0;\n }\n return lastRevisions;\n}\n","import Dexie, { Table, cmp } from 'dexie';\n\nexport async function bulkUpdate(\n table: Table,\n keys: any[],\n changeSpecs: { [keyPath: string]: any }[]\n) {\n const objs = await table.bulkGet(keys);\n const resultKeys: any[] = [];\n const resultObjs: any[] = [];\n keys.forEach((key, idx) => {\n const obj = objs[idx];\n if (obj) {\n for (const [keyPath, value] of Object.entries(changeSpecs[idx])) {\n if (keyPath === table.schema.primKey.keyPath) {\n if (cmp(value, key) !== 0) {\n throw new Error(`Cannot change primary key`);\n }\n } else {\n Dexie.setByKeyPath(obj, keyPath, value);\n }\n }\n resultKeys.push(key);\n resultObjs.push(obj);\n }\n });\n await (table.schema.primKey.keyPath == null\n ? table.bulkPut(resultObjs, resultKeys)\n : table.bulkPut(resultObjs));\n}\n","import { DexieCloudDB } from '../db/DexieCloudDB';\nimport Dexie from 'dexie';\nimport { bulkUpdate } from '../helpers/bulkUpdate';\nimport { DBOperationsSet } from 'dexie-cloud-common';\n\nexport async function applyServerChanges(\n changes: DBOperationsSet<string>,\n db: DexieCloudDB\n) {\n console.debug('Applying server changes', changes, Dexie.currentTransaction);\n for (const { table: tableName, muts } of changes) {\n if (!db.dx._allTables[tableName]) {\n console.debug(\n `Server sent changes for table ${tableName} that we don't have. Ignoring.`\n );\n continue;\n }\n const table = db.table(tableName);\n const { primaryKey } = table.core.schema;\n const keyDecoder = (key: string) => {\n switch (key[0]) {\n case '[':\n // Decode JSON array\n if (key.endsWith(']'))\n try {\n // On server, array keys are transformed to JSON string representation\n return JSON.parse(key);\n } catch {}\n return key;\n case '#':\n // Decode private ID (do the opposite from what's done in encodeIdsForServer())\n if (key.endsWith(':' + db.cloud.currentUserId)) {\n return key.substr(\n 0,\n key.length - db.cloud.currentUserId.length - 1\n );\n }\n return key;\n default:\n return key;\n }\n };\n for (const mut of muts) {\n const keys = mut.keys.map(keyDecoder);\n switch (mut.type) {\n case 'insert':\n if (primaryKey.outbound) {\n await table.bulkAdd(mut.values, keys);\n } else {\n keys.forEach((key, i) => {\n // Make sure inbound keys are consistent\n Dexie.setByKeyPath(mut.values[i], primaryKey.keyPath!, key);\n });\n await table.bulkAdd(mut.values);\n }\n break;\n case 'upsert':\n if (primaryKey.outbound) {\n await table.bulkPut(mut.values, keys);\n } else {\n keys.forEach((key, i) => {\n // Make sure inbound keys are consistent\n Dexie.setByKeyPath(mut.values[i], primaryKey.keyPath!, key);\n });\n await table.bulkPut(mut.values);\n }\n break;\n case 'modify':\n if (keys.length === 1) {\n await table.update(keys[0], mut.changeSpec);\n } else {\n await table.where(':id').anyOf(keys).modify(mut.changeSpec);\n }\n break;\n case 'update':\n await bulkUpdate(table, keys, mut.changeSpecs);\n break;\n case 'delete':\n await table.bulkDelete(keys);\n break;\n }\n }\n }\n}\n","\nexport const DEXIE_CLOUD_SYNCER_ID = 'dexie-cloud-syncer';\n","import type { Table, YUpdateRow } from 'dexie';\n\nexport function listUpdatesSince(yTable: Table, sinceIncluding: number): Promise<YUpdateRow[]> {\n return yTable\n .where('i')\n .between(sinceIncluding, Infinity, true)\n .toArray();\n}\n","import type * as Y from 'yjs';\nimport type { DexieCloudDB } from '../db/DexieCloudDB';\n\nexport function $Y(db: DexieCloudDB): typeof Y {\n const $Y = db.dx._options.Y;\n if (!$Y) throw new Error('Y library not supplied to Dexie constructor');\n return $Y as typeof Y;\n}\n\n","import { DexieCloudDB } from \"../db/DexieCloudDB\";\nimport { YTable } from \"./YTable\";\n\nexport function getUpdatesTable(db: DexieCloudDB, table: string, ydocProp: string): YTable | undefined {\n if (!db.dx._allTables[table]) return undefined;\n const utbl = db.table(table)?.schema.yProps?.find(p => p.prop === ydocProp)?.updatesTable;\n if (!utbl) {\n console.debug(`No updatesTable found for ${table}.${ydocProp}`);\n return undefined;\n }\n if (!db.dx._allTables[utbl]) return undefined;\n return db.table(utbl);\n}\n","import { cmp, DexieYProvider, InsertType, YSyncState, YUpdateRow } from 'dexie';\nimport { DexieCloudDB } from '../db/DexieCloudDB';\nimport { YServerMessage } from 'dexie-cloud-common';\nimport { DEXIE_CLOUD_SYNCER_ID } from '../sync/DEXIE_CLOUD_SYNCER_ID';\nimport { getUpdatesTable } from './getUpdatesTable';\n\nexport async function applyYServerMessages(\n yMessages: YServerMessage[],\n db: DexieCloudDB\n): Promise<{\n receivedUntils: { [yTable: string]: number };\n resyncNeeded: boolean;\n yServerRevision?: string;\n}> {\n const receivedUntils: { [yTable: string]: number } = {};\n let resyncNeeded = false;\n let yServerRevision: string | undefined;\n for (const m of yMessages) {\n try {\n switch (m.type) {\n case 'u-s': {\n const utbl = getUpdatesTable(db, m.table, m.prop);\n if (utbl) {\n const updateRow: InsertType<YUpdateRow, 'i'> = {\n k: m.k,\n u: m.u,\n };\n if (m.r) {\n // @ts-ignore\n updateRow.r = m.r;\n yServerRevision = m.r;\n }\n receivedUntils[utbl.name] = await utbl.add(updateRow);\n }\n break;\n }\n case 'u-ack': {\n const utbl = getUpdatesTable(db, m.table, m.prop);\n if (utbl) {\n await db.transaction('rw', utbl, async (tx) => {\n let syncer = (await tx\n .table(utbl.name)\n .get(DEXIE_CLOUD_SYNCER_ID)) as YSyncState | undefined;\n await tx.table(utbl.name).put({\n ...(syncer || { i: DEXIE_CLOUD_SYNCER_ID }),\n unsentFrom: Math.max(syncer?.unsentFrom || 1, m.i + 1),\n } as YSyncState);\n });\n }\n break;\n }\n case 'u-reject': {\n // Acces control or constraint rejected the update.\n // We delete it. It's not going to be sent again.\n // What's missing is a way to notify consumers, such as Tiptap editor, that the update was rejected.\n // This is only an issue when the document is open. We could find the open document and\n // in a perfect world, we should send a reverse update to the open document to undo the change.\n // See my question in https://discuss.yjs.dev/t/generate-an-inverse-update/2765\n console.debug(`Y update rejected. Deleting it.`);\n const utbl = getUpdatesTable(db, m.table, m.prop);\n if (!utbl) break;\n // Delete the rejected update and all local updates since (avoid holes in the CRDT)\n // and destroy it's open document if there is one.\n const primaryKey = (await utbl.get(m.i))?.k;\n if (primaryKey != null) {\n await db.transaction('rw', utbl, (tx) => {\n // @ts-ignore\n tx.idbtrans._rejecting_y_ypdate = true; // Inform ydoc triggers that we delete because of a rejection and not GC\n return utbl\n .where('i')\n .aboveOrEqual(m.i)\n .filter(\n (u) => cmp(u.k, primaryKey) === 0 && ((u.f || 0) & 1) === 1\n )\n .delete();\n });\n // Destroy active doc\n const activeDoc = DexieYProvider.getDocCache(db.dx).find(\n m.table,\n primaryKey,\n m.prop\n );\n if (activeDoc) activeDoc.destroy(); // Destroy the document so that editors don't continue to work on it\n }\n break;\n }\n case 'in-sync': {\n const doc = DexieYProvider.getDocCache(db.dx).find(\n m.table,\n m.k,\n m.prop\n );\n if (doc && !doc.isSynced) {\n doc.emit('sync', [true]);\n }\n break;\n }\n case 'y-complete-sync-done': {\n yServerRevision = m.yServerRev;\n break;\n }\n case 'outdated-server-rev':\n resyncNeeded = true;\n break;\n }\n } catch (e) {\n console.error(`Failed to apply YMessage`, m, e);\n }\n }\n\n return {\n receivedUntils,\n resyncNeeded,\n yServerRevision,\n };\n}\n","import {\n asyncIterablePipeline,\n consumeChunkedBinaryStream,\n getFetchResponseBodyGenerator,\n} from 'dexie-cloud-common';\nimport { DexieCloudDB } from '../db/DexieCloudDB';\nimport { PersistedSyncState } from '../db/entities/PersistedSyncState';\nimport { TSON } from '../TSON';\nimport { loadAccessToken } from '../authentication/authenticate';\nimport {\n Decoder,\n readUint8,\n readVarString,\n readAny,\n readVarUint8Array,\n hasContent,\n} from 'lib0/decoding';\nimport { getUpdatesTable } from './getUpdatesTable';\nimport Dexie, { InsertType, YUpdateRow } from 'dexie';\n\nconst BINSTREAM_TYPE_REALMID = 1;\nconst BINSTREAM_TYPE_TABLE_AND_PROP = 2;\nconst BINSTREAM_TYPE_DOCUMENT = 3;\n\nexport async function downloadYDocsFromServer(\n db: DexieCloudDB,\n databaseUrl: string,\n { yDownloadedRealms, realms }: PersistedSyncState\n) {\n if (\n yDownloadedRealms &&\n realms &&\n realms.every((realmId) => yDownloadedRealms[realmId] === '*')\n ) {\n return; // Already done!\n }\n console.debug('Downloading Y.Docs from added realms');\n const user = await loadAccessToken(db);\n const headers: HeadersInit = {\n 'Content-Type': 'application/json',\n Accept: 'application/octet-stream',\n };\n if (user) {\n headers.Authorization = `Bearer ${user.accessToken}`;\n }\n const res = await fetch(`${databaseUrl}/y/download`, {\n body: TSON.stringify({ downloadedRealms: yDownloadedRealms || {} }),\n method: 'POST',\n headers,\n credentials: 'include',\n });\n if (!res.ok) {\n throw new Error(\n `Failed to download Yjs documents from server. Status: ${res.status}`\n );\n }\n await asyncIterablePipeline(\n getFetchResponseBodyGenerator(res),\n consumeChunkedBinaryStream,\n consumeDownloadChunks\n );\n\n async function* consumeDownloadChunks(chunks: AsyncIterable<Uint8Array>) {\n let currentRealmId: string | null = null;\n let currentTable: string | null = null;\n let currentProp: string | null = null;\n let docsToInsert: InsertType<YUpdateRow, 'i'>[] = [];\n\n async function storeCollectedDocs(completedRealm: boolean) {\n const lastDoc = docsToInsert[docsToInsert.length - 1];\n if (docsToInsert.length > 0) {\n if (!currentRealmId || !currentTable || !currentProp) {\n throw new Error(`Protocol error from ${databaseUrl}/y/download`);\n }\n const yTable = getUpdatesTable(db, currentTable, currentProp);\n if (yTable) {\n await yTable.bulkAdd(docsToInsert);\n }\n docsToInsert = [];\n }\n if (\n currentRealmId &&\n ((currentTable && currentProp && lastDoc) || completedRealm)\n ) {\n await db.$syncState.update('syncState', (syncState: PersistedSyncState) => {\n const yDownloadedRealms = syncState.yDownloadedRealms || {};\n yDownloadedRealms[currentRealmId!] = completedRealm\n ? '*'\n : {\n tbl: currentTable!,\n prop: currentProp!,\n key: lastDoc.k!,\n };\n syncState.yDownloadedRealms = yDownloadedRealms;\n });\n }\n }\n\n try {\n for await (const chunk of chunks) {\n const decoder = new Decoder(chunk);\n while (hasContent(decoder)) {\n switch (readUint8(decoder)) {\n case BINSTREAM_TYPE_REALMID:\n await storeCollectedDocs(true);\n currentRealmId = readVarString(decoder);\n break;\n case BINSTREAM_TYPE_TABLE_AND_PROP:\n await storeCollectedDocs(false); // still on same realm\n currentTable = readVarString(decoder);\n currentProp = readVarString(decoder);\n break;\n case BINSTREAM_TYPE_DOCUMENT: {\n const k = readAny(decoder);\n const u = readVarUint8Array(decoder);\n docsToInsert.push({\n k,\n u,\n });\n break;\n }\n }\n }\n await storeCollectedDocs(false); // Chunk full - migth still be on same realm\n }\n await storeCollectedDocs(true); // Everything downloaded - finalize last downloaded realm to \"*\"\n } catch (error) {\n if (!(error instanceof Dexie.DexieError)) {\n // Network error might have happened.\n // Store what we've collected so far:\n await storeCollectedDocs(false);\n }\n throw error;\n }\n }\n}\n","import { __asyncValues } from \"tslib\";\nexport async function asyncIterablePipeline(source, ...stages) {\n var _a, e_1, _b, _c;\n // Chain generators by sending outdata from one to another\n let result = source(); // Start with the source generator\n for (let i = 0; i < stages.length; i++) {\n result = stages[i](result); // Pass on the result to next generator\n }\n try {\n // Start running the machine. If the last stage is a sink, it will consume the data and never emit anything\n // to us here...\n for (var _d = true, result_1 = __asyncValues(result), result_1_1; result_1_1 = await result_1.next(), _a = result_1_1.done, !_a; _d = true) {\n _c = result_1_1.value;\n _d = false;\n const chunk = _c;\n }\n }\n catch (e_1_1) { e_1 = { error: e_1_1 }; }\n finally {\n try {\n if (!_d && !_a && (_b = result_1.return)) await _b.call(result_1);\n }\n finally { if (e_1) throw e_1.error; }\n }\n}\n","import { __asyncGenerator, __await } from \"tslib\";\nexport function getFetchResponseBodyGenerator(res) {\n return function () {\n return __asyncGenerator(this, arguments, function* () {\n if (!res.body)\n throw new Error(\"Response body is not readable\");\n const reader = res.body.getReader();\n try {\n while (true) {\n const { done, value } = yield __await(reader.read());\n if (done)\n return yield __await(void 0);\n yield yield __await(value);\n }\n }\n finally {\n reader.releaseLock();\n }\n });\n };\n}\n","import { getMutationTable } from '../helpers/getMutationTable';\nimport { getSyncableTables } from '../helpers/getSyncableTables';\nimport { DexieCloudDB } from '../db/DexieCloudDB';\nimport { listSyncifiedChanges } from './listSyncifiedChanges';\nimport { getTablesToSyncify } from './getTablesToSyncify';\nimport { listClientChanges } from './listClientChanges';\nimport { syncWithServer } from './syncWithServer';\nimport { modifyLocalObjectsWithNewUserId } from './modifyLocalObjectsWithNewUserId';\nimport { throwIfCancelled } from '../helpers/CancelToken';\nimport { DexieCloudOptions } from '../DexieCloudOptions';\nimport { BaseRevisionMapEntry } from '../db/entities/BaseRevisionMapEntry';\nimport { getTableFromMutationTable } from '../helpers/getTableFromMutationTable';\nimport {\n applyOperations,\n DBKeyMutationSet,\n DBOperationsSet,\n DexieCloudSchema,\n randomString,\n subtractChanges,\n SyncResponse,\n toDBOperationSet,\n} from 'dexie-cloud-common';\nimport { PersistedSyncState } from '../db/entities/PersistedSyncState';\nimport { isOnline } from './isOnline';\nimport { updateBaseRevs } from './updateBaseRevs';\nimport { getLatestRevisionsPerTable } from './getLatestRevisionsPerTable';\nimport { applyServerChanges } from './applyServerChanges';\nimport { checkSyncRateLimitDelay } from './ratelimit';\nimport { listYClientMessagesAndStateVector } from '../yjs/listYClientMessagesAndStateVector';\nimport { applyYServerMessages } from '../yjs/applyYMessages';\nimport { updateYSyncStates } from '../yjs/updateYSyncStates';\nimport { downloadYDocsFromServer } from '../yjs/downloadYDocsFromServer';\nimport { UpdateSpec } from 'dexie';\n\nexport const CURRENT_SYNC_WORKER = 'currentSyncWorker';\n\nexport interface SyncOptions {\n isInitialSync?: boolean;\n cancelToken?: { cancelled: boolean };\n justCheckIfNeeded?: boolean;\n retryImmediatelyOnFetchError?: boolean;\n purpose?: 'pull' | 'push';\n}\n\nexport function sync(\n db: DexieCloudDB,\n options: DexieCloudOptions,\n schema: DexieCloudSchema,\n syncOptions?: SyncOptions\n): Promise<boolean> {\n return _sync(db, options, schema, syncOptions)\n .then((result) => {\n if (!syncOptions?.justCheckIfNeeded) { // && syncOptions?.purpose !== 'push') {\n db.syncStateChangedEvent.next({\n phase: 'in-sync',\n });\n }\n return result;\n })\n .catch(async (error: any) => {\n if (syncOptions?.justCheckIfNeeded) return Promise.reject(error); // Just rethrow.\n console.debug('Error from _sync', {\n isOnline,\n syncOptions,\n error,\n });\n if (\n isOnline &&\n syncOptions?.retryImmediatelyOnFetchError &&\n error?.name === 'TypeError' &&\n /fetch/.test(error?.message)\n ) {\n db.syncStateChangedEvent.next({\n phase: 'error',\n error,\n });\n // Retry again in 500 ms but if it fails again, don't retry.\n await new Promise((resolve) => setTimeout(resolve, 500));\n return await sync(db, options, schema, {\n ...syncOptions,\n retryImmediatelyOnFetchError: false,\n });\n }\n // Make sure that no matter whether sync() explodes or not,\n // always update the timestamp. Also store the error.\n await db.$syncState.update('syncState', {\n timestamp: new Date(),\n error: '' + error,\n });\n db.syncStateChangedEvent.next({\n phase: isOnline ? 'error' : 'offline',\n error: new Error('' + error?.message || error),\n });\n return Promise.reject(error);\n });\n}\n\nasync function _sync(\n db: DexieCloudDB,\n options: DexieCloudOptions,\n schema: DexieCloudSchema,\n { isInitialSync, cancelToken, justCheckIfNeeded, purpose }: SyncOptions = {\n isInitialSync: false,\n }\n): Promise<boolean> {\n if (!justCheckIfNeeded) {\n console.debug('SYNC STARTED', { isInitialSync, purpose });\n }\n if (!db.cloud.options?.databaseUrl)\n throw new Error(\n `Internal error: sync must not be called when no databaseUrl is configured`\n );\n const { databaseUrl } = options;\n const currentUser = await db.getCurrentUser(); // Keep same value across entire sync flow:\n const tablesToSync = currentUser.isLoggedIn ? getSyncableTables(db) : [];\n\n const mutationTables = tablesToSync.map((tbl) =>\n db.table(getMutationTable(tbl.name))\n );\n\n // If this is not the initial sync,\n // go through tables that were previously not synced but should now be according to\n // logged in state and the sync table whitelist in db.cloud.options.\n //\n // Prepare for syncification by modifying locally unauthorized objects:\n //\n const persistedSyncState = await db.getPersistedSyncState();\n const readyForSyncification = currentUser.isLoggedIn;\n const tablesToSyncify = readyForSyncification\n ? getTablesToSyncify(db, persistedSyncState)\n : [];\n throwIfCancelled(cancelToken);\n const doSyncify = tablesToSyncify.length > 0;\n\n if (doSyncify) {\n if (justCheckIfNeeded) return true;\n //console.debug('sync doSyncify is true');\n await db.transaction('rw', tablesToSyncify, async (tx) => {\n // @ts-ignore\n tx.idbtrans.disableChangeTracking = true;\n // @ts-ignore\n tx.idbtrans.disableAccessControl = true; // TODO: Take care of this flag in access control middleware!\n await modifyLocalObjectsWithNewUserId(\n tablesToSyncify,\n currentUser,\n persistedSyncState?.realms\n );\n });\n throwIfCancelled(cancelToken);\n }\n //\n // List changes to sync\n //\n const [clientChangeSet, syncState, baseRevs, {yMessages, lastUpdateIds}] = await db.transaction(\n 'r',\n db.tables,\n async () => {\n const syncState = await db.getPersistedSyncState();\n const baseRevs = await db.$baseRevs.toArray();\n let clientChanges = await listClientChanges(mutationTables, db);\n const yResults = await listYClientMessagesAndStateVector(db, tablesToSync);\n throwIfCancelled(cancelToken);\n if (doSyncify) {\n const alreadySyncedRealms = [\n ...(persistedSyncState?.realms || []),\n ...(persistedSyncState?.inviteRealms || []),\n ];\n const syncificationInserts = await listSyncifiedChanges(\n tablesToSyncify,\n currentUser,\n schema!,\n alreadySyncedRealms\n );\n throwIfCancelled(cancelToken);\n clientChanges = clientChanges.concat(syncificationInserts);\n return [clientChanges, syncState, baseRevs, yResults];\n }\n return [clientChanges, syncState, baseRevs, yResults];\n }\n );\n\n const pushSyncIsNeeded = clientChangeSet.some((set) =>\n set.muts.some((mut) => mut.keys.length > 0)\n ) || yMessages.some(m => m.type === 'u-c');\n if (justCheckIfNeeded) {\n console.debug('Sync is needed:', pushSyncIsNeeded);\n return pushSyncIsNeeded;\n }\n if (purpose === 'push' && !pushSyncIsNeeded) {\n // The purpose of this request was to push changes\n return false;\n }\n\n const latestRevisions = getLatestRevisionsPerTable(\n clientChangeSet,\n syncState?.latestRevisions\n );\n\n const clientIdentity = syncState?.clientIdentity || randomString(16);\n\n //\n // Push changes to server\n //\n throwIfCancelled(cancelToken);\n const res = await syncWithServer(\n clientChangeSet,\n yMessages,\n syncState,\n baseRevs,\n db,\n databaseUrl,\n schema,\n clientIdentity,\n currentUser\n );\n console.debug('Sync response', res);\n\n //\n // Apply changes locally and clear old change entries:\n //\n const {done, newSyncState} = await db.transaction('rw', db.tables, async (tx) => {\n // @ts-ignore\n tx.idbtrans.disableChangeTracking = true;\n // @ts-ignore\n tx.idbtrans.disableAccessControl = true; // TODO: Take care of this flag in access control middleware!\n\n // Update db.cloud.schema from server response.\n // Local schema MAY include a subset of tables, so do not force all tables into local schema.\n for (const tableName of Object.keys(schema)) {\n if (res.schema[tableName]) {\n // Write directly into configured schema. This code can only be executed alone.\n schema[tableName] = res.schema[tableName];\n }\n }\n await db.$syncState.put(schema, 'schema');\n\n // List mutations that happened during our exchange with the server:\n const addedClientChanges = await listClientChanges(mutationTables, db, {\n since: latestRevisions,\n });\n\n //\n // Delete changes now as server has return success\n // (but keep changes that haven't reached server yet)\n //\n for (const mutTable of mutationTables) {\n const tableName = getTableFromMutationTable(mutTable.name);\n if (\n !addedClientChanges.some(\n (ch) => ch.table === tableName && ch.muts.length > 0\n )\n ) {\n // No added mutations for this table during the time we sent changes\n // to the server.\n // It is therefore safe to clear all changes (which is faster than\n // deleting a range)\n await Promise.all([\n mutTable.clear(),\n db.$baseRevs.where({ tableName }).delete(),\n ]);\n } else if (latestRevisions[tableName]) {\n const latestRev = latestRevisions[tableName] || 0;\n await Promise.all([\n mutTable.where('rev').belowOrEqual(latestRev).delete(),\n db.$baseRevs\n .where(':id')\n .between(\n [tableName, -Infinity],\n [tableName, latestRev + 1],\n true,\n true\n )\n .reverse()\n .offset(1) // Keep one entry (the one mapping muts that came during fetch --> previous server revision)\n .delete(),\n ]);\n } else {\n // In this case, the mutation table only contains added items after sending empty changeset to server.\n // We should not clear out anything now.\n }\n }\n\n // Update latestRevisions object according to additional changes:\n getLatestRevisionsPerTable(addedClientChanges, latestRevisions);\n\n // Update/add new entries into baseRevs map.\n // * On tables without mutations since last serverRevision,\n // this will update existing entry.\n // * On tables where mutations have been recorded since last\n // serverRevision, this will create a new entry.\n // The purpose of this operation is to mark a start revision (per table)\n // so that all client-mutations that come after this, will be mapped to current\n // server revision.\n await updateBaseRevs(db, schema, latestRevisions, res.serverRevision);\n\n const syncState = await db.getPersistedSyncState();\n\n //\n // Delete objects from removed realms\n //\n await deleteObjectsFromRemovedRealms(db, res, syncState);\n\n //\n // Update syncState\n //\n const newSyncState: PersistedSyncState = syncState || {\n syncedTables: [],\n latestRevisions: {},\n realms: [],\n inviteRealms: [],\n clientIdentity,\n };\n if (readyForSyncification) {\n newSyncState.syncedTables = tablesToSync\n .map((tbl) => tbl.name)\n .concat(tablesToSyncify.map((tbl) => tbl.name));\n }\n newSyncState.latestRevisions = latestRevisions;\n newSyncState.remoteDbId = res.dbId;\n newSyncState.initiallySynced = true;\n newSyncState.realms = res.realms;\n newSyncState.inviteRealms = res.inviteRealms;\n newSyncState.serverRevision = res.serverRevision;\n newSyncState.yServerRevision = res.serverRevision;\n newSyncState.timestamp = new Date();\n delete newSyncState.error;\n\n const filteredChanges = filterServerChangesThroughAddedClientChanges(\n res.changes,\n addedClientChanges\n );\n\n //\n // apply server changes\n //\n await applyServerChanges(filteredChanges, db);\n\n if (res.yMessages) {\n //\n // apply yMessages\n //\n const {receivedUntils, resyncNeeded, yServerRevision} = await applyYServerMessages(res.yMessages, db);\n if (yServerRevision) {\n newSyncState.yServerRevision = yServerRevision;\n }\n\n //\n // update Y SyncStates\n //\n await updateYSyncStates(lastUpdateIds, receivedUntils, db);\n\n if (resyncNeeded) {\n newSyncState.yDownloadedRealms = {}; // Will trigger a full download of Y-documents below...\n }\n }\n\n //\n // Update regular syncState\n //\n db.$syncState.put(newSyncState, 'syncState');\n\n return {\n done: addedClientChanges.length === 0,\n newSyncState\n };\n });\n if (!done) {\n console.debug('MORE SYNC NEEDED. Go for it again!');\n await checkSyncRateLimitDelay(db);\n return await _sync(db, options, schema, { isInitialSync, cancelToken });\n }\n const usingYProps = Object.values(schema).some(tbl => tbl.yProps?.length);\n const serverSupportsYprops = !!res.yMessages;\n if (usingYProps && serverSupportsYprops) {\n try {\n await downloadYDocsFromServer(db, databaseUrl, newSyncState);\n } catch (error) {\n console.error('Failed to download Yjs documents from server', error);\n }\n }\n console.debug('SYNC DONE', { isInitialSync });\n db.syncCompleteEvent.next();\n return false; // Not needed anymore\n}\n\nasync function deleteObjectsFromRemovedRealms(\n db: DexieCloudDB,\n res: SyncResponse,\n syncState: PersistedSyncState | undefined\n) {\n const deletedRealms = new Set<string>();\n const rejectedRealms = new Set<string>();\n const previousRealmSet = syncState ? syncState.realms : [];\n const previousInviteRealmSet = syncState ? syncState.inviteRealms : [];\n const updatedRealmSet = new Set(res.realms);\n const updatedTotalRealmSet = new Set(res.realms.concat(res.inviteRealms));\n for (const realmId of previousRealmSet) {\n if (!updatedRealmSet.has(realmId)) {\n rejectedRealms.add(realmId);\n if (!updatedTotalRealmSet.has(realmId)) {\n deletedRealms.add(realmId);\n }\n }\n }\n for (const realmId of previousInviteRealmSet.concat(previousRealmSet)) {\n if (!updatedTotalRealmSet.has(realmId)) {\n deletedRealms.add(realmId);\n }\n }\n if (deletedRealms.size > 0 || rejectedRealms.size > 0) {\n const tables = getSyncableTables(db);\n for (const table of tables) {\n let realmsToDelete = ['realms', 'members', 'roles'].includes(table.name)\n ? deletedRealms // These tables should spare rejected ones.\n : rejectedRealms; // All other tables shoudl delete rejected+deleted ones\n if (realmsToDelete.size === 0) continue;\n if (\n table.schema.indexes.some(\n (idx) =>\n idx.keyPath === 'realmId' ||\n (Array.isArray(idx.keyPath) && idx.keyPath[0] === 'realmId')\n )\n ) {\n // There's an index to use:\n //console.debug(`REMOVAL: deleting all ${table.name} where realmId anyOf `, JSON.stringify([...realmsToDelete]));\n await table\n .where('realmId')\n .anyOf([...realmsToDelete])\n .delete();\n } else {\n // No index to use:\n //console.debug(`REMOVAL: deleting all ${table.name} where realmId is any of `, JSON.stringify([...realmsToDelete]), realmsToDelete.size);\n await table\n .filter((obj) => !!obj?.realmId && realmsToDelete.has(obj.realmId))\n .delete();\n }\n }\n }\n if (rejectedRealms.size > 0 && syncState?.yDownloadedRealms) {\n // Remove rejected/deleted realms from yDownloadedRealms because of the following use case:\n // 1. User becomes added to the realm\n // 2. User syncs and all documents of the realm is downloaded (downloadYDocsFromServer.ts)\n // 3. User leaves the realm and all docs are deleted locally (built-in-trigger of deleting their rows in this file)\n // 4. User is yet again added to the realm. At this point, we must make sure the docs are not considered already downloaded.\n const updateSpec: UpdateSpec<PersistedSyncState> = {};\n for (const realmId of rejectedRealms) {\n delete syncState.yDownloadedRealms[realmId];\n } \n }\n}\n\nexport function filterServerChangesThroughAddedClientChanges(\n serverChanges: DBOperationsSet<string>,\n addedClientChanges: DBOperationsSet\n): DBOperationsSet<string> {\n const changes: DBKeyMutationSet = {};\n applyOperations(changes, serverChanges);\n const localPostChanges: DBKeyMutationSet = {};\n applyOperations(localPostChanges, addedClientChanges);\n subtractChanges(changes, localPostChanges);\n return toDBOperationSet(changes);\n}\n","import { getSyncableTables } from \"../helpers/getSyncableTables\";\nimport { DexieCloudDB } from \"../db/DexieCloudDB\";\nimport { PersistedSyncState } from \"../db/entities/PersistedSyncState\";\n\nexport function getTablesToSyncify(db: DexieCloudDB, syncState: PersistedSyncState | undefined) {\n const syncedTables = syncState?.syncedTables || [];\n const syncableTables = getSyncableTables(db);\n const tablesToSyncify = syncableTables.filter(\n (tbl) => !syncedTables.includes(tbl.name)\n );\n return tablesToSyncify;\n}\n","import { Table } from \"dexie\";\nimport { EntityCommon } from \"../db/entities/EntityCommon\";\nimport { UserLogin } from \"../db/entities/UserLogin\";\nimport { Member } from \"../db/entities/Member\";\nimport { UNAUTHORIZED_USER } from \"../authentication/UNAUTHORIZED_USER\";\nimport { Realm } from \"../db/entities/Realm\";\n\nexport async function modifyLocalObjectsWithNewUserId(\n syncifiedTables: Table<EntityCommon>[],\n currentUser: UserLogin,\n alreadySyncedRealms?: string[]) {\n const ignoredRealms = new Set(alreadySyncedRealms || []);\n for (const table of syncifiedTables) {\n if (table.name === \"members\") {\n // members\n await table.toCollection().modify((member: Member) => {\n if (!ignoredRealms.has(member.realmId) && (!member.userId || member.userId === UNAUTHORIZED_USER.userId)) {\n member.userId = currentUser.userId;\n }\n });\n } else if (table.name === \"roles\") {\n // roles\n // No changes needed.\n } else if (table.name === \"realms\") {\n // realms\n await table.toCollection().modify((realm: Realm) => {\n if (!ignoredRealms.has(realm.realmId) && (realm.owner === undefined || realm.owner === UNAUTHORIZED_USER.userId)) {\n realm.owner = currentUser.userId;\n }\n });\n } else {\n // application entities\n await table.toCollection().modify((obj) => {\n if (!obj.realmId || !ignoredRealms.has(obj.realmId)) {\n if (!obj.owner || obj.owner === UNAUTHORIZED_USER.userId)\n obj.owner = currentUser.userId;\n if (!obj.realmId || obj.realmId === UNAUTHORIZED_USER.userId) {\n obj.realmId = currentUser.userId;\n }\n }\n });\n }\n }\n}\n","import type { Table, YSyncState, YUpdateRow } from 'dexie';\nimport type { YClientMessage } from 'dexie-cloud-common';\nimport { DexieCloudDB } from '../db/DexieCloudDB';\nimport { DEXIE_CLOUD_SYNCER_ID } from '../sync/DEXIE_CLOUD_SYNCER_ID';\nimport { listUpdatesSince } from './listUpdatesSince';\nimport { $Y } from './Y';\nimport { EntityCommon } from '../db/entities/EntityCommon';\n\n/** Queries the local database for YMessages to send to server.\n * \n * There are 2 messages that this function can provide:\n * YUpdateFromClientRequest ( for local updates )\n * YStateVector ( for state vector of foreign updates so that server can reduce the number of udpates to send back )\n *\n * Notice that we do not do a step 1 sync phase here to get a state vector from the server. Reason we can avoid\n * the 2-step sync is that we are client-server and not client-client here and we keep track of the client changes\n * sent to server by letting server acknowledge them. There is always a chance that some client update has already\n * been sent and that the client failed to receive the ack. However, if this happens it does not matter - the change\n * would be sent again and Yjs handles duplicate changes anyway. And it's rare so we earn the cost of roundtrips by\n * avoiding the step1 sync and instead keep track of this in the `unsentFrom` property of the SyncState.\n * \n * @param db \n * @returns \n */\nexport async function listYClientMessagesAndStateVector(\n db: DexieCloudDB,\n tablesToSync: Table<EntityCommon>[]\n): Promise<{yMessages: YClientMessage[], lastUpdateIds: {[yTable: string]: number}}> {\n const result: YClientMessage[] = [];\n const lastUpdateIds: {[yTable: string]: number} = {};\n for (const table of tablesToSync) {\n if (table.schema.yProps) {\n for (const yProp of table.schema.yProps) {\n const Y = $Y(db); // This is how we retrieve the user-provided Y library\n const yTable = db.table(yProp.updatesTable); // the updates-table for this combo of table+propName\n const syncState = (await yTable.get(DEXIE_CLOUD_SYNCER_ID)) as\n | YSyncState\n | undefined;\n\n // unsentFrom = the `i` value of updates that aren't yet sent to server (or at least not acked by the server yet)\n const unsentFrom = syncState?.unsentFrom || 1;\n // receivedUntil = the `i` value of updates that both we and the server knows we already have (we know it by the outcome from last syncWithServer() because server keep track of its revision numbers\n const receivedUntil = syncState?.receivedUntil || 0;\n // Compute the least value of these two (but since receivedUntil is inclusive we need to add +1 to it)\n const unsyncedFrom = Math.min(unsentFrom, receivedUntil + 1);\n // Query all these updates for all docs of this table+prop combination\n const updates = await listUpdatesSince(yTable, unsyncedFrom);\n if (updates.length > 0) lastUpdateIds[yTable.name] = updates[updates.length -1].i;\n\n // Now sort them by document and whether they are local or not + ignore local updates already sent:\n const perDoc: {\n [docKey: string]: {\n i: number;\n k: any;\n isLocal: boolean;\n u: Uint8Array[];\n };\n } = {};\n for (const update of updates) {\n // Sort updates into buckets of the doc primary key + the flag (whether it's local or foreign)\n const isLocal = ((update.f || 0) & 0x01) === 0x01;\n if (isLocal && update.i < unsentFrom) continue; // This local update has already been sent and acked.\n const docKey = JSON.stringify(update.k) + '/' + isLocal;\n let entry = perDoc[docKey];\n if (!entry) {\n perDoc[docKey] = entry = {\n i: update.i,\n k: update.k,\n isLocal,\n u: [],\n };\n entry.u.push(update.u);\n } else {\n entry.u.push(update.u);\n entry.i = Math.max(update.i, entry.i);\n }\n }\n\n // Now, go through all these and:\n // * For local updates, compute a merged update per document.\n // * For foreign updates, compute a state vector to pass to server, so that server can\n // avoid re-sending updates that we already have (they might have been sent of websocket\n // and when that happens, we do not mark them in any way nor do we update receivedUntil -\n // we only update receivedUntil after a \"full sync\" (syncWithServer()))\n for (const { k, isLocal, u, i } of Object.values(perDoc)) {\n const mergedUpdate = u.length === 1 ? u[0] : Y.mergeUpdatesV2(u);\n if (isLocal) {\n result.push({\n type: 'u-c',\n table: table.name,\n prop: yProp.prop,\n k,\n u: mergedUpdate,\n i,\n });\n } else {\n const stateVector = Y.encodeStateVectorFromUpdateV2(mergedUpdate);\n result.push({\n type: 'sv',\n table: table.name,\n prop: yProp.prop,\n k,\n sv: stateVector,\n });\n }\n }\n }\n }\n }\n return {\n yMessages: result,\n lastUpdateIds\n };\n}\n","import { UserLogin } from '../db/entities/UserLogin';\nimport { randomString } from '../helpers/randomString';\nimport { EntityCommon } from '../db/entities/EntityCommon';\nimport { Table } from 'dexie';\nimport {\n DBOperationsSet,\n DBUpsertOperation,\n DexieCloudSchema,\n isValidAtID,\n isValidSyncableID,\n} from 'dexie-cloud-common';\n\nexport async function listSyncifiedChanges(\n tablesToSyncify: Table<EntityCommon>[],\n currentUser: UserLogin,\n schema: DexieCloudSchema,\n alreadySyncedRealms?: string[]\n): Promise<DBOperationsSet> {\n const txid = `upload-${randomString(8)}`;\n if (currentUser.isLoggedIn) {\n if (tablesToSyncify.length > 0) {\n const ignoredRealms = new Set(alreadySyncedRealms || []);\n const upserts = await Promise.all(\n tablesToSyncify.map(async (table) => {\n const { extractKey } = table.core.schema.primaryKey;\n if (!extractKey) return { table: table.name, muts: [] }; // Outbound tables are not synced.\n\n const dexieCloudTableSchema = schema[table.name];\n const query = dexieCloudTableSchema?.generatedGlobalId\n ? table.filter((item) => {\n const id = extractKey(item);\n return (\n !ignoredRealms.has(item.realmId || '') &&\n //(id[0] !== '#' || !!item.$ts) && // Private obj need no sync if not changed\n isValidAtID(extractKey(item), dexieCloudTableSchema?.idPrefix)\n );\n })\n : table.filter((item) => {\n const id = extractKey(item);\n\n return (\n !ignoredRealms.has(item.realmId || '') &&\n //(id[0] !== '#' || !!item.$ts) && // Private obj need no sync if not changed\n isValidSyncableID(id)\n );\n });\n const unsyncedObjects = await query.toArray();\n if (unsyncedObjects.length > 0) {\n const mut: DBUpsertOperation = {\n type: 'upsert',\n values: unsyncedObjects,\n keys: unsyncedObjects.map(extractKey),\n userId: currentUser.userId,\n txid,\n };\n return {\n table: table.name,\n muts: [mut],\n };\n } else {\n return {\n table: table.name,\n muts: [],\n };\n }\n })\n );\n return upserts.filter((op) => op.muts.length > 0);\n }\n }\n return [];\n}\n","import { UpdateSpec } from 'dexie';\nimport { DexieCloudDB } from '../db/DexieCloudDB';\nimport { PersistedSyncState } from '../db/entities/PersistedSyncState';\nimport { DEXIE_CLOUD_SYNCER_ID } from '../sync/DEXIE_CLOUD_SYNCER_ID';\nimport { YDexieCloudSyncState } from './YDexieCloudSyncState';\n\nexport async function updateYSyncStates(\n lastUpdateIdsBeforeSync: { [yTable: string]: number },\n receivedUntilsAfterSync: { [yTable: string]: number },\n db: DexieCloudDB\n) {\n // We want to update unsentFrom for each yTable to the value specified in first argument\n // because we got those values before we synced with server and here we are back from server\n // that has successfully received all those messages - no matter if the last update was a client or server update,\n // we can safely store unsentFrom to a value of the last update + 1 here.\n // We also want to update receivedUntil for each yTable to the value specified in the second argument,\n // because that contains the highest resulted id of each update from server after storing it.\n // We could do these two tasks separately, but that would require two update calls on the same YSyncState, so\n // to optimize the dexie calls, we merge these two maps into a single one so we can do a single update request\n // per yTable.\n const mergedSpec: {\n [yTable: string]: { unsentFrom?: number; receivedUntil?: number };\n } = {};\n for (const [yTable, lastUpdateId] of Object.entries(\n lastUpdateIdsBeforeSync\n )) {\n mergedSpec[yTable] ??= {};\n mergedSpec[yTable].unsentFrom = lastUpdateId + 1;\n }\n for (const [yTable, lastUpdateId] of Object.entries(\n receivedUntilsAfterSync\n )) {\n mergedSpec[yTable] ??= {};\n mergedSpec[yTable].receivedUntil = lastUpdateId;\n }\n\n // Now go through all yTables and update their YSyncStates:\n const allYTables = Object.values(db.dx._dbSchema)\n .filter((tblSchema) => tblSchema.yProps)\n .map((tblSchema) => tblSchema.yProps!.map((yProp) => yProp.updatesTable))\n .flat();\n for (const yTable of allYTables) {\n const mergedEntry = mergedSpec[yTable];\n const unsentFrom = mergedEntry?.unsentFrom ?? 1;\n const receivedUntil =\n mergedEntry?.receivedUntil ?? // If not received anything on this table, pick the current last update id\n // from local because we are in the same parent transaction (in sync.ts) that\n // applied all updates from the server\n ((\n await db\n .table(yTable)\n .where('i')\n .between(1, Infinity) // Because i might be string DEXIE_CLOUD_SYNCER_ID if not a number.\n .reverse()\n .limit(1)\n .primaryKeys()\n )[0] as number) ??\n 0;\n // We're already in a transaction, but for the sake of\n // code readability and correctness, let's launch an atomic sub transaction:\n await db.transaction('rw', yTable, async () => {\n const state: YDexieCloudSyncState | undefined = await db\n .table(yTable)\n .get(DEXIE_CLOUD_SYNCER_ID);\n if (!state) {\n await db.table<YDexieCloudSyncState>(yTable).add({\n i: DEXIE_CLOUD_SYNCER_ID,\n unsentFrom,\n receivedUntil\n });\n } else {\n state.unsentFrom = Math.max(unsentFrom, state.unsentFrom || 1);\n state.receivedUntil = Math.max(receivedUntil, state.receivedUntil || 0);\n await db.table(yTable).put(state);\n }\n });\n }\n}\n","import { setByKeyPath } from '../utils.js';\nexport function subtractChanges(target, // Server change set\nchangesToSubtract // additional mutations on client during syncWithServer()\n) {\n var _a, _b, _c;\n for (const [table, mutationSet] of Object.entries(changesToSubtract)) {\n for (const [key, mut] of Object.entries(mutationSet)) {\n switch (mut.type) {\n case 'ups':\n {\n const targetMut = (_a = target[table]) === null || _a === void 0 ? void 0 : _a[key];\n if (targetMut) {\n switch (targetMut.type) {\n case 'ups':\n delete target[table][key];\n break;\n case 'del':\n // Leave delete operation.\n // (Don't resurrect objects unintenionally (using tx(get, put) pattern locally))\n break;\n case 'upd':\n delete target[table][key];\n break;\n }\n }\n }\n break;\n case 'del':\n (_b = target[table]) === null || _b === void 0 ? true : delete _b[key];\n break;\n case 'upd': {\n const targetMut = (_c = target[table]) === null || _c === void 0 ? void 0 : _c[key];\n if (targetMut) {\n switch (targetMut.type) {\n case 'ups':\n // Adjust the server upsert with locally updated values.\n for (const [propPath, value] of Object.entries(mut.mod)) {\n setByKeyPath(targetMut.val, propPath, value);\n }\n break;\n case 'del':\n // Leave delete.\n break;\n case 'upd':\n // Remove the local update props from the server update mutation.\n for (const propPath of Object.keys(mut.mod)) {\n delete targetMut.mod[propPath];\n }\n break;\n }\n }\n break;\n }\n }\n }\n }\n}\n","import { randomString } from \"../utils.js\";\n/** Convert a DBKeyMutationSet (which is an internal format capable of looking up changes per ID)\n * ...into a DBOperationsSet (which is more optimal for performing DB operations into DB (bulkAdd() etc))\n *\n * @param inSet\n * @returns DBOperationsSet representing inSet\n */\nexport function toDBOperationSet(inSet, txid = \"\") {\n // Fictive transaction:\n if (!txid)\n txid = randomString(16);\n // Convert data into a temporary map to collect mutations of same table and type\n const map = {};\n for (const [table, ops] of Object.entries(inSet)) {\n for (const [key, op] of Object.entries(ops)) {\n const mapEntry = map[table] || (map[table] = {});\n const ops = mapEntry[op.type] || (mapEntry[op.type] = []);\n ops.push(Object.assign({ key }, op)); // DBKeyMutation doesn't contain key, so we need to bring it in.\n }\n }\n // Start computing the resulting format:\n const result = [];\n for (const [table, ops] of Object.entries(map)) {\n const resultEntry = {\n table,\n muts: [],\n };\n for (const [optype, muts] of Object.entries(ops)) {\n switch (optype) {\n case \"ups\": {\n const op = {\n type: \"upsert\",\n keys: muts.map(mut => mut.key),\n values: muts.map(mut => mut.val),\n txid\n };\n resultEntry.muts.push(op);\n break;\n }\n case \"upd\": {\n const op = {\n type: \"update\",\n keys: muts.map(mut => mut.key),\n changeSpecs: muts.map(mut => mut.mod),\n txid\n };\n resultEntry.muts.push(op);\n break;\n }\n case \"del\": {\n const op = {\n type: \"delete\",\n keys: muts.map(mut => mut.key),\n txid,\n };\n resultEntry.muts.push(op);\n break;\n }\n }\n }\n result.push(resultEntry);\n }\n return result;\n}\n","import { BehaviorSubject, firstValueFrom } from 'rxjs';\nimport { filter, take } from 'rxjs/operators';\nimport { DexieCloudDB } from '../db/DexieCloudDB';\nimport { WSConnectionMsg } from '../WSObservable';\nimport { triggerSync } from './triggerSync';\nimport Dexie from 'dexie';\nimport { computeRealmSetHash } from '../helpers/computeRealmSetHash';\nimport { DBOperationsSet } from 'dexie-cloud-common';\nimport { getSyncableTables } from '../helpers/getSyncableTables';\nimport { getMutationTable } from '../helpers/getMutationTable';\nimport { listClientChanges } from './listClientChanges';\nimport { filterServerChangesThroughAddedClientChanges } from './sync';\nimport { applyServerChanges } from './applyServerChanges';\nimport { updateBaseRevs } from './updateBaseRevs';\nimport { getLatestRevisionsPerTable } from './getLatestRevisionsPerTable';\nimport { refreshAccessToken } from '../authentication/authenticate';\n\nconst LIMIT_NUM_MESSAGES_PER_TIME = 10; // Allow a maximum of 10 messages per...\nconst TIME_WINDOW = 10_000; // ...10 seconds.\nconst PAUSE_PERIOD = 1_000; // Pause for 1 second if reached\n\nexport type MessagesFromServerConsumer = ReturnType<\n typeof MessagesFromServerConsumer\n>;\n\nexport function MessagesFromServerConsumer(db: DexieCloudDB) {\n const queue: WSConnectionMsg[] = [];\n const readyToServe = new BehaviorSubject(true);\n const event = new BehaviorSubject(null);\n let isWorking = false;\n\n let loopDetection = new Array(LIMIT_NUM_MESSAGES_PER_TIME).fill(0);\n\n event.subscribe(async () => {\n if (isWorking) return;\n if (queue.length > 0) {\n isWorking = true;\n loopDetection.shift();\n loopDetection.push(Date.now());\n readyToServe.next(false);\n try {\n await consumeQueue();\n } finally {\n if (\n loopDetection[loopDetection.length - 1] - loopDetection[0] <\n TIME_WINDOW\n ) {\n // Ten loops within 10 seconds. Slow down!\n // This is a one-time event. Just pause 10 seconds.\n console.warn(`Slowing down websocket loop for ${PAUSE_PERIOD} milliseconds`);\n await new Promise((resolve) => setTimeout(resolve, PAUSE_PERIOD));\n }\n isWorking = false;\n readyToServe.next(true);\n }\n }\n });\n\n function enqueue(msg: WSConnectionMsg) {\n queue.push(msg);\n event.next(null);\n }\n\n async function consumeQueue() {\n while (queue.length > 0) {\n const msg = queue.shift();\n try {\n // If the sync worker or service worker is syncing, wait 'til thei're done.\n // It's no need to have two channels at the same time - even though it wouldnt\n // be a problem - this is an optimization.\n await firstValueFrom(\n db.cloud.syncState.pipe(\n filter(({ phase }) => phase === 'in-sync' || phase === 'error')\n )\n );\n console.debug('processing msg', msg);\n const persistedSyncState = db.cloud.persistedSyncState.value;\n //syncState.\n if (!msg) continue;\n switch (msg.type) {\n case 'token-expired':\n console.debug(\n 'WebSocket observable: Token expired. Refreshing token...'\n );\n const user = db.cloud.currentUser.value;\n // Refresh access token\n const refreshedLogin = await refreshAccessToken(\n db.cloud.options!.databaseUrl,\n user\n );\n // Persist updated access token\n await db.table('$logins').update(user.userId, {\n accessToken: refreshedLogin.accessToken,\n accessTokenExpiration: refreshedLogin.accessTokenExpiration,\n claims: refreshedLogin.claims,\n license: refreshedLogin.license,\n data: refreshedLogin.data,\n });\n // Updating $logins will trigger emission of db.cloud.currentUser observable, which\n // in turn will lead to that connectWebSocket.ts will reconnect the socket with the\n // new token. So we don't need to do anything more here.\n break;\n case 'realm-added':\n if (\n !persistedSyncState?.realms?.includes(msg.realm) &&\n !persistedSyncState?.inviteRealms?.includes(msg.realm)\n ) {\n await db.cloud.sync({ purpose: 'pull', wait: true });\n //triggerSync(db, 'pull');\n }\n break;\n case 'realm-accepted':\n if (!persistedSyncState?.realms?.includes(msg.realm)) {\n await db.cloud.sync({ purpose: 'pull', wait: true });\n //triggerSync(db, 'pull');\n }\n break;\n case 'realm-removed':\n if (\n persistedSyncState?.realms?.includes(msg.realm) ||\n persistedSyncState?.inviteRealms?.includes(msg.realm)\n ) {\n await db.cloud.sync({ purpose: 'pull', wait: true });\n //triggerSync(db, 'pull');\n }\n break;\n case 'realms-changed':\n //triggerSync(db, 'pull');\n await db.cloud.sync({ purpose: 'pull', wait: true });\n break;\n case 'changes':\n console.debug('changes');\n if (db.cloud.syncState.value?.phase === 'error') {\n triggerSync(db, 'pull');\n break;\n }\n await db.transaction('rw', db.dx.tables, async (tx) => {\n // @ts-ignore\n tx.idbtrans.disableChangeTracking = true;\n // @ts-ignore\n tx.idbtrans.disableAccessControl = true;\n const [schema, syncState, currentUser] = await Promise.all([\n db.getSchema(),\n db.getPersistedSyncState(),\n db.getCurrentUser(),\n ]);\n console.debug('ws message queue: in transaction');\n if (!syncState || !schema || !currentUser) {\n console.debug('required vars not present', {\n syncState,\n schema,\n currentUser,\n });\n return; // Initial sync must have taken place - otherwise, ignore this.\n }\n // Verify again in ACID tx that we're on same server revision.\n if (msg.baseRev !== syncState.serverRevision) {\n console.debug(\n `baseRev (${msg.baseRev}) differs from our serverRevision in syncState (${syncState.serverRevision})`\n );\n // Should we trigger a sync now? No. This is a normal case\n // when another local peer (such as the SW or a websocket channel on other tab) has\n // updated syncState from new server information but we are not aware yet. It would\n // be unnescessary to do a sync in that case. Instead, the caller of this consumeQueue()\n // function will do readyToServe.next(true) right after this return, which will lead\n // to a \"ready\" message being sent to server with the new accurate serverRev we have,\n // so that the next message indeed will be correct.\n if (\n typeof msg.baseRev === 'string' && // v2 format\n (typeof syncState.serverRevision === 'bigint' || // v1 format\n typeof syncState.serverRevision === 'object') // v1 format old browser\n ) {\n // The reason for the diff seems to be that server has migrated the revision format.\n // Do a full sync to update revision format.\n // If we don't do a sync request now, we could stuck in an endless loop.\n triggerSync(db, 'pull');\n }\n return; // Ignore message\n }\n // Verify also that the message is based on the exact same set of realms\n const ourRealmSetHash = await Dexie.waitFor(\n // Keep TX in non-IDB work\n computeRealmSetHash(syncState)\n );\n console.debug('ourRealmSetHash', ourRealmSetHash);\n if (ourRealmSetHash !== msg.realmSetHash) {\n console.debug('not same realmSetHash', msg.realmSetHash);\n triggerSync(db, 'pull');\n // The message isn't based on the same realms.\n // Trigger a sync instead to resolve all things up.\n return;\n }\n\n // Get clientChanges\n let clientChanges: DBOperationsSet = [];\n if (currentUser.isLoggedIn) {\n const mutationTables = getSyncableTables(db).map((tbl) =>\n db.table(getMutationTable(tbl.name))\n );\n clientChanges = await listClientChanges(mutationTables, db);\n console.debug('msg queue: client changes', clientChanges);\n }\n if (msg.changes.length > 0) {\n const filteredChanges =\n filterServerChangesThroughAddedClientChanges(\n msg.changes,\n clientChanges\n );\n\n //\n // apply server changes\n //\n console.debug(\n 'applying filtered server changes',\n filteredChanges\n );\n await applyServerChanges(filteredChanges, db);\n }\n\n // Update latest revisions per table in case there are unsynced changes\n // This can be a real case in future when we allow non-eagery sync.\n // And it can actually be realistic now also, but very rare.\n syncState.latestRevisions = getLatestRevisionsPerTable(\n clientChanges,\n syncState.latestRevisions\n );\n\n syncState.serverRevision = msg.newRev;\n\n // Update base revs\n console.debug('Updating baseRefs', syncState.latestRevisions);\n await updateBaseRevs(\n db,\n schema!,\n syncState.latestRevisions,\n msg.newRev\n );\n\n //\n // Update syncState\n //\n console.debug('Updating syncState', syncState);\n await db.$syncState.put(syncState, 'syncState');\n });\n console.debug('msg queue: done with rw transaction');\n break;\n }\n } catch (error) {\n console.error(`Error in msg queue`, error);\n }\n }\n }\n\n return {\n enqueue,\n readyToServe,\n };\n}\n","import Dexie, { Table } from 'dexie';\nimport { GuardedJob } from './entities/GuardedJob';\nimport { UserLogin } from './entities/UserLogin';\nimport { PersistedSyncState } from './entities/PersistedSyncState';\nimport { UNAUTHORIZED_USER } from '../authentication/UNAUTHORIZED_USER';\nimport { DexieCloudOptions } from '../DexieCloudOptions';\nimport { BehaviorSubject, Subject } from 'rxjs';\nimport { BaseRevisionMapEntry } from './entities/BaseRevisionMapEntry';\nimport {\n DBRealm,\n DBRealmMember,\n DBRealmRole,\n DexieCloudSchema,\n} from 'dexie-cloud-common';\nimport { BroadcastedAndLocalEvent } from '../helpers/BroadcastedAndLocalEvent';\nimport { SyncState, SyncStatePhase } from '../types/SyncState';\nimport { MessagesFromServerConsumer } from '../sync/messagesFromServerQueue';\nimport { YClientMessage } from 'dexie-cloud-common';\n\n/*export interface DexieCloudDB extends Dexie {\n table(name: string): Table<any, any>;\n table(name: \"$jobs\"): Table<GuardedJob, string>;\n table(name: \"$logins\"): Table<UserLogin, string>;\n table(name: \"$syncState\"): Table<SyncState, \"syncState\">;\n //table(name: \"$pendingChangesFromServer\"): Table<DBOperationsSet, number>;\n}\n*/\n\nexport interface SyncStateChangedEventData {\n phase: SyncStatePhase;\n error?: Error;\n progress?: number;\n}\n\ntype SyncStateTable = Table<\n PersistedSyncState | DexieCloudSchema | DexieCloudOptions,\n 'syncState' | 'options' | 'schema'\n>;\nexport interface DexieCloudDBBase {\n readonly name: Dexie['name'];\n readonly close: Dexie['close'];\n transaction: Dexie['transaction'];\n table: Dexie['table'];\n readonly tables: Dexie['tables'];\n readonly cloud: Dexie['cloud'];\n readonly $jobs: Table<GuardedJob, string>;\n readonly $logins: Table<UserLogin, string>;\n readonly $syncState: SyncStateTable;\n readonly $baseRevs: Table<BaseRevisionMapEntry, [string, number]>;\n\n readonly realms: Table<DBRealm, string>;\n readonly members: Table<DBRealmMember, string>;\n readonly roles: Table<DBRealmRole, [string, string]>;\n\n readonly localSyncEvent: Subject<{ purpose?: 'pull' | 'push' }>;\n readonly syncStateChangedEvent: BroadcastedAndLocalEvent<SyncStateChangedEventData>;\n readonly syncCompleteEvent: BroadcastedAndLocalEvent<void>;\n readonly dx: Dexie;\n readonly initiallySynced: boolean;\n}\n\nexport interface DexieCloudDB extends DexieCloudDBBase {\n getCurrentUser(): Promise<UserLogin>;\n getSchema(): Promise<DexieCloudSchema | undefined>;\n getOptions(): Promise<DexieCloudOptions | undefined>;\n getPersistedSyncState(): Promise<PersistedSyncState | undefined>;\n setInitiallySynced(initiallySynced: boolean): void;\n reconfigure(): void;\n messageConsumer: MessagesFromServerConsumer;\n messageProducer: Subject<YClientMessage>;\n}\n\nconst wm = new WeakMap<object, DexieCloudDB>();\n\nexport const DEXIE_CLOUD_SCHEMA = {\n members: '@id, [userId+realmId], [email+realmId], realmId',\n roles: '[realmId+name]',\n realms: '@realmId',\n $jobs: '',\n $syncState: '',\n $baseRevs: '[tableName+clientRev]',\n $logins: 'claims.sub, lastLogin',\n};\n\nlet static_counter = 0;\nexport function DexieCloudDB(dx: Dexie): DexieCloudDB {\n if ('vip' in dx) dx = dx['vip']; // Avoid race condition. Always map to a vipped dexie that don't block during db.on.ready().\n let db = wm.get(dx.cloud);\n if (!db) {\n const localSyncEvent = new Subject<{ purpose: 'push' | 'pull' }>();\n let syncStateChangedEvent =\n new BroadcastedAndLocalEvent<SyncStateChangedEventData>(\n `syncstatechanged-${dx.name}`\n );\n let syncCompleteEvent = new BroadcastedAndLocalEvent<void>(\n `synccomplete-${dx.name}`\n );\n localSyncEvent['id'] = ++static_counter;\n let initiallySynced = false;\n db = {\n get name() {\n return dx.name;\n },\n close() {\n return dx.close();\n },\n transaction: dx.transaction.bind(dx),\n table: dx.table.bind(dx),\n get tables() {\n return dx.tables;\n },\n cloud: dx.cloud,\n get $jobs() {\n return dx.table('$jobs') as Table<GuardedJob, string>;\n },\n get $syncState() {\n return dx.table('$syncState') as SyncStateTable;\n },\n get $baseRevs() {\n return dx.table('$baseRevs') as Table<\n BaseRevisionMapEntry,\n [string, number]\n >;\n },\n get $logins() {\n return dx.table('$logins') as Table<UserLogin, string>;\n },\n\n get realms() {\n return dx.realms;\n },\n get members() {\n return dx.members;\n },\n get roles() {\n return dx.roles;\n },\n get initiallySynced() {\n return initiallySynced;\n },\n localSyncEvent,\n get syncStateChangedEvent() {\n return syncStateChangedEvent;\n },\n get syncCompleteEvent() {\n return syncCompleteEvent;\n },\n dx,\n } as DexieCloudDB;\n\n const helperMethods: Partial<DexieCloudDB> = {\n getCurrentUser() {\n return db!.$logins\n .toArray()\n .then(\n (logins) => logins.find((l) => l.isLoggedIn) || UNAUTHORIZED_USER\n );\n },\n getPersistedSyncState() {\n return db!.$syncState.get('syncState') as Promise<\n PersistedSyncState | undefined\n >;\n },\n getSchema() {\n return db!.$syncState.get('schema').then((schema: DexieCloudSchema) => {\n if (schema) {\n for (const table of db!.tables) {\n if (table.schema.primKey && table.schema.primKey.keyPath && schema[table.name]) {\n schema[table.name].primaryKey = nameFromKeyPath(\n table.schema.primKey.keyPath\n );\n }\n }\n }\n return schema;\n }) as Promise<DexieCloudSchema | undefined>;\n },\n getOptions() {\n return db!.$syncState.get('options') as Promise<\n DexieCloudOptions | undefined\n >;\n },\n setInitiallySynced(value) {\n initiallySynced = value;\n },\n reconfigure() {\n syncStateChangedEvent = new BroadcastedAndLocalEvent<SyncState>(\n `syncstatechanged-${dx.name}`\n );\n syncCompleteEvent = new BroadcastedAndLocalEvent<void>(\n `synccomplete-${dx.name}`\n );\n },\n };\n\n Object.assign(db, helperMethods);\n db.messageConsumer = MessagesFromServerConsumer(db);\n db.messageProducer = new Subject<YClientMessage>();\n wm.set(dx.cloud, db);\n }\n return db;\n}\n\nfunction nameFromKeyPath (keyPath?: string | string[]): string {\n return typeof keyPath === 'string' ?\n keyPath :\n keyPath ? ('[' + [].join.call(keyPath, '+') + ']') : \"\";\n}\n","import { DexieCloudDB } from \"../db/DexieCloudDB\";\nimport { UserLogin } from \"../db/entities/UserLogin\";\n\nexport interface AuthPersistedContext extends UserLogin {\n save(): Promise<void>;\n}\n\n// Emulate true-private property db. Why? So it's not stored in DB.\nconst wm = new WeakMap<AuthPersistedContext, DexieCloudDB>();\n\nexport class AuthPersistedContext {\n constructor(db: DexieCloudDB, userLogin: UserLogin) {\n wm.set(this, db);\n Object.assign(this, userLogin);\n }\n\n static load(db: DexieCloudDB, userId: string) {\n return db\n .table(\"$logins\")\n .get(userId)\n .then(\n (userLogin) => new AuthPersistedContext(db, userLogin || {\n userId,\n claims: {\n sub: userId\n },\n lastLogin: new Date(0)\n })\n );\n }\n\n async save() {\n const db = wm.get(this)!;\n db.table(\"$logins\").put(this);\n }\n}\n","import { filter, firstValueFrom, from, InteropObservable, Observable } from 'rxjs';\n\nexport function waitUntil<T>(\n o: Observable<T> | InteropObservable<T>, // Works with Dexie's liveQuery observables if we'd need that\n predicate: (value: T) => boolean\n) {\n return firstValueFrom(from(o).pipe(\n filter(predicate),\n ));\n}\n","import { DexieCloudDB } from '../db/DexieCloudDB';\nimport { TXExpandos } from '../types/TXExpandos';\nimport { confirmLogout } from './interactWithUser';\nimport { UNAUTHORIZED_USER } from './UNAUTHORIZED_USER';\nimport { waitUntil } from './waitUntil';\n\nexport async function logout(db: DexieCloudDB) {\n const numUnsyncedChanges = await _logout(db);\n if (numUnsyncedChanges) {\n if (\n await confirmLogout(\n db.cloud.userInteraction,\n db.cloud.currentUserId,\n numUnsyncedChanges\n )\n ) {\n await _logout(db, { deleteUnsyncedData: true });\n } else {\n throw new Error(`User cancelled logout due to unsynced changes`);\n }\n }\n}\n\nexport async function _logout(db: DexieCloudDB, { deleteUnsyncedData = false } = {}) {\n // Clear the database without emptying configuration options.\n const [numUnsynced, loggedOut] = await db.dx.transaction('rw', db.dx.tables, async (tx) => {\n // @ts-ignore\n const idbtrans: IDBTransaction & TXExpandos = tx.idbtrans;\n idbtrans.disableChangeTracking = true;\n idbtrans.disableAccessControl = true;\n const mutationTables = tx.storeNames.filter((tableName) =>\n tableName.endsWith('_mutations')\n );\n\n // Count unsynced changes\n const unsyncCounts = await Promise.all(\n mutationTables.map((mutationTable) => tx.table(mutationTable).count())\n );\n const sumUnSynced = unsyncCounts.reduce((a, b) => a + b, 0);\n\n if (sumUnSynced > 0 && !deleteUnsyncedData) {\n // Let caller ask user if they want to delete unsynced data.\n return [sumUnSynced, false];\n }\n \n // Either there are no unsynched changes, or caller provided flag deleteUnsynchedData = true.\n // Clear all tables except $jobs and $syncState (except the persisted sync state which is\n // also cleared because we're going to rebuild it using a fresh sync).\n db.$syncState.delete('syncState');\n for (const table of db.dx.tables) {\n if (table.name !== '$jobs' && table.name !== '$syncState') {\n table.clear();\n }\n }\n return [sumUnSynced, true];\n });\n\n if (loggedOut) {\n // Wait for currentUser observable to emit UNAUTHORIZED_USER\n await waitUntil(db.cloud.currentUser, (user) => user.userId === UNAUTHORIZED_USER.userId);\n // Then perform an initial sync\n await db.cloud.sync({purpose: 'pull', wait: true});\n }\n return numUnsynced;\n}\n","/** A way to log to console in production without terser stripping out\n * it from the release bundle.\n * This should be used very rarely and only in places where it's\n * absolutely necessary to log something in production.\n * \n * @param level \n * @param args \n */\nexport function prodLog(level: 'log' | 'warn' | 'error' | 'debug', ...args: any[]) {\n globalThis[\"con\"+\"sole\"][level](...args);\n}\n","import { DexieCloudDB } from '../db/DexieCloudDB';\nimport { LoginHints } from '../DexieCloudAPI';\nimport { triggerSync } from '../sync/triggerSync';\nimport { authenticate, loadAccessToken } from './authenticate';\nimport { AuthPersistedContext } from './AuthPersistedContext';\nimport { logout } from './logout';\nimport { otpFetchTokenCallback } from './otpFetchTokenCallback';\nimport { setCurrentUser } from './setCurrentUser';\nimport { UNAUTHORIZED_USER } from './UNAUTHORIZED_USER';\n\nexport async function login(\n db: DexieCloudDB,\n hints?: LoginHints\n) {\n const currentUser = await db.getCurrentUser();\n const origUserId = currentUser.userId;\n if (currentUser.isLoggedIn && (!hints || (!hints.email && !hints.userId))) {\n const licenseStatus = currentUser.license?.status || 'ok';\n if (\n licenseStatus === 'ok' &&\n currentUser.accessToken &&\n (!currentUser.accessTokenExpiration ||\n currentUser.accessTokenExpiration.getTime() > Date.now())\n ) {\n // Already authenticated according to given hints. And license is valid.\n return false;\n }\n if (\n currentUser.refreshToken &&\n (!currentUser.refreshTokenExpiration ||\n currentUser.refreshTokenExpiration.getTime() > Date.now())\n ) {\n // Refresh the token\n await loadAccessToken(db);\n return false;\n }\n // No refresh token - must re-authenticate:\n }\n const context = new AuthPersistedContext(db, {\n claims: {},\n lastLogin: new Date(0),\n });\n await authenticate(\n db.cloud.options!.databaseUrl,\n context,\n db.cloud.options!.fetchTokens || otpFetchTokenCallback(db),\n db.cloud.userInteraction,\n hints\n );\n if (\n origUserId !== UNAUTHORIZED_USER.userId &&\n context.userId !== origUserId\n ) {\n // User was logged in before, but now logged in as another user.\n await logout(db);\n }\n\n /*try {\n await context.save();\n } catch (e) {\n try {\n if (e.name === 'DataCloneError') {\n console.debug(`Login context property names:`, Object.keys(context));\n console.debug(`Login context:`, context);\n console.debug(`Login context JSON:`, JSON.stringify(context));\n }\n } catch {}\n throw e;\n }*/\n await setCurrentUser(db, context);\n // Make sure to resync as the new login will be authorized\n // for new realms.\n triggerSync(db, 'pull');\n return context.userId !== origUserId;\n}\n","import {\n DemoTokenRequest,\n OTPTokenRequest1,\n OTPTokenRequest2,\n TokenErrorResponse,\n TokenFinalResponse,\n TokenRequest,\n TokenResponse,\n} from 'dexie-cloud-common';\nimport { DexieCloudDB } from '../db/DexieCloudDB';\nimport { HttpError } from '../errors/HttpError';\nimport { FetchTokenCallback } from './authenticate';\nimport { alertUser, promptForEmail, promptForOTP } from './interactWithUser';\n\nexport function otpFetchTokenCallback(db: DexieCloudDB): FetchTokenCallback {\n const { userInteraction } = db.cloud;\n return async function otpAuthenticate({ public_key, hints }) {\n let tokenRequest: TokenRequest;\n const url = db.cloud.options?.databaseUrl;\n if (!url) throw new Error(`No database URL given.`);\n if (hints?.grant_type === 'demo') {\n const demo_user = await promptForEmail(\n userInteraction,\n 'Enter a demo user email',\n hints?.email || hints?.userId\n );\n tokenRequest = {\n demo_user,\n grant_type: 'demo',\n scopes: ['ACCESS_DB'],\n public_key\n } satisfies DemoTokenRequest;\n } else if (hints?.otpId && hints.otp) {\n // User provided OTP ID and OTP code. This means that the OTP email\n // has already gone out and the user may have clicked a magic link\n // in the email with otp and otpId in query and the app has picked\n // up those values and passed them to db.cloud.login().\n tokenRequest = {\n grant_type: 'otp',\n otp_id: hints.otpId,\n otp: hints.otp,\n scopes: ['ACCESS_DB'],\n public_key,\n } satisfies OTPTokenRequest2;\n } else {\n const email = await promptForEmail(\n userInteraction,\n 'Enter email address',\n hints?.email\n );\n if (/@demo.local$/.test(email)) {\n tokenRequest = {\n demo_user: email,\n grant_type: 'demo',\n scopes: ['ACCESS_DB'],\n public_key\n } satisfies DemoTokenRequest;\n } else {\n tokenRequest = {\n email,\n grant_type: 'otp',\n scopes: ['ACCESS_DB'],\n } satisfies OTPTokenRequest1;\n }\n }\n const res1 = await fetch(`${url}/token`, {\n body: JSON.stringify(tokenRequest),\n method: 'post',\n headers: { 'Content-Type': 'application/json', mode: 'cors' },\n });\n if (res1.status !== 200) {\n const errMsg = await res1.text();\n await alertUser(userInteraction, \"Token request failed\", {\n type: 'error',\n messageCode: 'GENERIC_ERROR',\n message: errMsg,\n messageParams: {}\n }).catch(()=>{});\n throw new HttpError(res1, errMsg);\n }\n const response: TokenResponse = await res1.json();\n if (response.type === 'tokens' || response.type === 'error') {\n // Demo user request can get a \"tokens\" response right away\n // Error can also be returned right away.\n return response;\n } else if (tokenRequest.grant_type === 'otp' && 'email' in tokenRequest) {\n if (response.type !== 'otp-sent')\n throw new Error(`Unexpected response from ${url}/token`);\n const otp = await promptForOTP(userInteraction, tokenRequest.email);\n const tokenRequest2 = {\n ...tokenRequest,\n otp: otp || '',\n otp_id: response.otp_id,\n public_key\n } satisfies OTPTokenRequest2;\n\n let res2 = await fetch(`${url}/token`, {\n body: JSON.stringify(tokenRequest2),\n method: 'post',\n headers: { 'Content-Type': 'application/json' },\n mode: 'cors',\n });\n while (res2.status === 401) {\n const errorText = await res2.text();\n tokenRequest2.otp = await promptForOTP(userInteraction, tokenRequest.email, {\n type: 'error',\n messageCode: 'INVALID_OTP',\n message: errorText,\n messageParams: {}\n });\n res2 = await fetch(`${url}/token`, {\n body: JSON.stringify(tokenRequest2),\n method: 'post',\n headers: { 'Content-Type': 'application/json' },\n mode: 'cors',\n });\n }\n if (res2.status !== 200) {\n const errMsg = await res2.text();\n throw new HttpError(res2, errMsg);\n }\n const response2: TokenFinalResponse | TokenErrorResponse = await res2.json();\n return response2;\n } else {\n throw new Error(`Unexpected response from ${url}/token`);\n }\n };\n}\n","import { DexieCloudDB } from '../db/DexieCloudDB';\nimport { prodLog } from '../prodLog';\nimport { AuthPersistedContext } from './AuthPersistedContext';\nimport { waitUntil } from './waitUntil';\n\n/** This function changes or sets the current user as requested.\n *\n * Use cases:\n * * Initially on db.ready after reading the current user from db.$logins.\n * This will make sure that any unsynced operations from the previous user is synced before\n * changing the user.\n * * Upon user request\n *\n * @param db\n * @param newUser\n */\nexport async function setCurrentUser(\n db: DexieCloudDB,\n user: AuthPersistedContext\n) {\n const $logins = db.table('$logins');\n await db.transaction('rw', $logins, async (tx) => {\n const existingLogins = await $logins.toArray();\n await Promise.all(\n existingLogins\n .filter((login) => login.userId !== user.userId && login.isLoggedIn)\n .map((login) => {\n login.isLoggedIn = false;\n return $logins.put(login);\n })\n );\n user.isLoggedIn = true;\n user.lastLogin = new Date();\n try {\n await user.save();\n } catch (e) {\n try {\n if (e.name === 'DataCloneError') {\n // We've seen this buggy behavior in some browsers and in case it happens\n // again we really need to collect the details to understand what's going on.\n prodLog('debug', `Login context property names:`, Object.keys(user));\n prodLog('debug', `Login context property names:`, Object.keys(user));\n prodLog('debug', `Login context:`, user);\n prodLog('debug', `Login context JSON:`, JSON.stringify(user));\n }\n } catch {}\n throw e;\n }\n console.debug('Saved new user', user.email);\n });\n await waitUntil(\n db.cloud.currentUser,\n (currentUser) => currentUser.userId === user.userId\n );\n}\n","// @ts-ignore\nexport const isFirefox = typeof InstallTrigger !== 'undefined';\n","export const isSafari =\n typeof navigator !== 'undefined' &&\n /Safari\\//.test(navigator.userAgent) &&\n !/Chrom(e|ium)\\/|Edge\\//.test(navigator.userAgent);\n\nexport const safariVersion = isSafari\n ? // @ts-ignore\n [].concat(navigator.userAgent.match(/Safari\\/(\\d*)/))[1]\n : NaN;\n","import { isFirefox } from './isFirefox';\nimport { isSafari, safariVersion } from './isSafari';\n\n// What we know: Safari 14.1 (version 605) crashes when using dexie-cloud's service worker.\n// We don't know what exact call is causing this. Have tried safari-14-idb-fix with no luck.\n// Something we do in the service worker is triggering the crash.\n// When next Safari version (606) is out we will start enabling SW again, hoping that the bug is solved.\n// If not, we might increment 605 to 606.\nexport const DISABLE_SERVICEWORKER_STRATEGY =\n (isSafari && safariVersion <= 605) || // Disable for Safari for now.\n isFirefox; // Disable for Firefox for now. Seems to have a bug in reading CryptoKeys from IDB from service workers\n","export const IS_SERVICE_WORKER =\n typeof self !== \"undefined\" && \"clients\" in self && !self.document;\n","import {\n DBCoreAddRequest,\n DBCoreDeleteRequest,\n DBCoreIndex, DBCorePutRequest\n} from 'dexie';\nimport { b64LexEncode } from 'dreambase-library/dist/common/b64lex';\n\nconst { toString } = {};\nexport function toStringTag(o: Object) {\n return toString.call(o).slice(8, -1);\n}\n\nexport function getEffectiveKeys(\n primaryKey: DBCoreIndex,\n req: (Pick<DBCoreAddRequest | DBCorePutRequest, 'type' | 'values'> & {\n keys?: any[];\n }) |\n Pick<DBCoreDeleteRequest, 'keys' | 'type'>\n) {\n if (req.type === 'delete')\n return req.keys;\n return req.keys?.slice() || req.values.map(primaryKey.extractKey!);\n}\nfunction applyToUpperBitFix(orig: string, bits: number) {\n return (\n (bits & 1 ? orig[0].toUpperCase() : orig[0].toLowerCase()) +\n (bits & 2 ? orig[1].toUpperCase() : orig[1].toLowerCase()) +\n (bits & 4 ? orig[2].toUpperCase() : orig[2].toLowerCase())\n );\n}\nconst consonants = /b|c|d|f|g|h|j|k|l|m|n|p|q|r|s|t|v|x|y|z/i;\nfunction isUpperCase(ch: string) {\n return ch >= 'A' && ch <= 'Z';\n}\n\nexport function generateTablePrefix(\n tableName: string,\n allPrefixes: Set<string>\n) {\n let rv = tableName[0].toLocaleLowerCase(); // \"users\" = \"usr\", \"friends\" = \"frn\", \"realms\" = \"rlm\", etc.\n for (let i = 1, l = tableName.length; i < l && rv.length < 3; ++i) {\n if (consonants.test(tableName[i]) || isUpperCase(tableName[i]))\n rv += tableName[i].toLowerCase();\n }\n while (allPrefixes.has(rv)) {\n if (/\\d/g.test(rv)) {\n rv = rv.substr(0, rv.length - 1) + (rv[rv.length - 1] + 1);\n if (rv.length > 3)\n rv = rv.substr(0, 3);\n else\n continue;\n } else if (rv.length < 3) {\n rv = rv + '2';\n continue;\n }\n let bitFix = 1;\n let upperFixed = rv;\n while (allPrefixes.has(upperFixed) && bitFix < 8) {\n upperFixed = applyToUpperBitFix(rv, bitFix);\n ++bitFix;\n }\n if (bitFix < 8)\n rv = upperFixed;\n else {\n let nextChar = (rv.charCodeAt(2) + 1) & 127;\n rv = rv.substr(0, 2) + String.fromCharCode(nextChar);\n // Here, in theory we could get an infinite loop if having 127*8 table names with identical 3 first consonants.\n }\n }\n return rv;\n}\nlet time = 0;\n/**\n *\n * @param prefix A unique 3-letter short-name of the table.\n * @param shardKey 3 last letters from another ID if colocation is requested. Verified on server on inserts - guarantees unique IDs across shards.\n * The shardKey part of the key represent the shardId where it was first created. An object with this\n * primary key can later on be moved to another shard without being altered. The reason for having\n * the origin shardKey as part of the key, is that the server will not need to check uniqueness constraint\n * across all shards on every insert. Updates / moves across shards are already controlled by the server\n * in the sense that the objects needs to be there already - we only need this part for inserts.\n * @returns\n */\nexport function generateKey(prefix: string, shardKey?: string) {\n const a = new Uint8Array(18);\n const timePart = new Uint8Array(a.buffer, 0, 6);\n const now = Date.now(); // Will fit into 6 bytes until year 10 895.\n if (time >= now) {\n // User is bulk-creating objects the same millisecond.\n // Increment the time part by one millisecond for each item.\n // If bulk-creating 1,000,000 rows client-side in 10 seconds,\n // the last time-stamp will be 990 seconds in future, which is no biggie at all.\n // The point is to create a nice order of the generated IDs instead of\n // using random ids.\n ++time;\n } else {\n time = now;\n }\n timePart[0] = time / 1099511627776; // Normal division (no bitwise operator) --> works with >= 32 bits.\n timePart[1] = time / 4294967296;\n timePart[2] = time / 16777216;\n timePart[3] = time / 65536;\n timePart[4] = time / 256;\n timePart[5] = time;\n const randomPart = new Uint8Array(a.buffer, 6);\n crypto.getRandomValues(randomPart);\n const id = new Uint8Array(a.buffer);\n return prefix + b64LexEncode(id) + (shardKey || '');\n}\n","import Dexie, {\n DBCore,\n DBCoreAddRequest,\n DBCoreMutateRequest,\n DBCorePutRequest,\n DBCoreTransaction,\n Middleware,\n} from 'dexie';\nimport { isValidSyncableID } from 'dexie-cloud-common';\nimport { DexieCloudDB } from '../db/DexieCloudDB';\nimport {\n getEffectiveKeys,\n generateKey,\n toStringTag,\n} from '../middleware-helpers/idGenerationHelpers';\nimport { TXExpandos } from '../types/TXExpandos';\n\nexport function createIdGenerationMiddleware(\n db: DexieCloudDB\n): Middleware<DBCore> {\n return {\n stack: 'dbcore',\n name: 'idGenerationMiddleware',\n level: 1,\n create: (core) => {\n return {\n ...core,\n table: (tableName) => {\n const table = core.table(tableName);\n\n function generateOrVerifyAtKeys(\n req: DBCoreAddRequest | DBCorePutRequest,\n idPrefix: string\n ) {\n let valueClones: null | object[] = null;\n const keys = getEffectiveKeys(table.schema.primaryKey, req);\n keys.forEach((key, idx) => {\n if (key === undefined) {\n // Generate the key\n const colocatedId =\n req.values[idx].realmId || db.cloud.currentUserId;\n const shardKey = colocatedId.substr(colocatedId.length - 3);\n keys[idx] = generateKey(idPrefix, shardKey);\n if (!table.schema.primaryKey.outbound) {\n if (!valueClones) valueClones = req.values.slice();\n valueClones[idx] = Dexie.deepClone(valueClones[idx]);\n Dexie.setByKeyPath(\n valueClones[idx],\n table.schema.primaryKey.keyPath!,\n keys[idx]\n );\n }\n } else if (\n typeof key !== 'string' ||\n (!key.startsWith(idPrefix) && !key.startsWith('#' + idPrefix))\n ) {\n // Key was specified by caller. Verify it complies with id prefix.\n throw new Dexie.ConstraintError(\n `The ID \"${key}\" is not valid for table \"${tableName}\". ` +\n `Primary '@' keys requires the key to be prefixed with \"${idPrefix}\" (or \"#${idPrefix}).\\n` +\n `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.`\n );\n }\n });\n return table.mutate({\n ...req,\n keys,\n values: valueClones || req.values,\n });\n }\n\n return {\n ...table,\n mutate: (req) => {\n const idbtrans = req.trans as DBCoreTransaction & IDBTransaction & TXExpandos;\n if (idbtrans.mode === 'versionchange') {\n // Tell all the other middlewares to skip bothering. We're in versionchange mode.\n // dexie-cloud is not initialized yet.\n idbtrans.disableChangeTracking = true;\n idbtrans.disableAccessControl = true;\n }\n if (idbtrans.disableChangeTracking) {\n // Disable ID policy checks and ID generation\n return table.mutate(req);\n }\n if (req.type === 'add' || req.type === 'put') {\n const cloudTableSchema = db.cloud.schema?.[tableName];\n if (!cloudTableSchema?.generatedGlobalId) {\n if (cloudTableSchema?.markedForSync) {\n // Just make sure primary key is of a supported type:\n const keys = getEffectiveKeys(table.schema.primaryKey, req);\n keys.forEach((key, idx) => {\n if (!isValidSyncableID(key)) {\n const type = Array.isArray(key)\n ? key.map(toStringTag).join(',')\n : toStringTag(key);\n throw new Dexie.ConstraintError(\n `Invalid primary key type ${type} for table ${tableName}. Tables marked for sync has primary keys of type string or Array of string (and optional numbers)`\n );\n }\n });\n }\n } else {\n if (db.cloud.options?.databaseUrl && !db.initiallySynced) {\n // A database URL is configured but no initial sync has been performed.\n const keys = getEffectiveKeys(table.schema.primaryKey, req);\n // Check if the operation would yield any INSERT. If so, complain! We never want wrong ID prefixes stored.\n return table\n .getMany({ keys, trans: req.trans, cache: 'immutable' })\n .then((results) => {\n if (results.length < keys.length) {\n // At least one of the given objects would be created. Complain since\n // the generated ID would be based on a locally computed ID prefix only - we wouldn't\n // know if the server would give the same ID prefix until an initial sync has been\n // performed.\n throw new Error(\n `Unable to create new objects without an initial sync having been performed.`\n );\n }\n return table.mutate(req);\n });\n }\n return generateOrVerifyAtKeys(\n req,\n cloudTableSchema.idPrefix!\n );\n }\n }\n return table.mutate(req);\n },\n };\n },\n };\n },\n };\n}\n","import { DBCoreTable, DBCoreTransaction } from \"dexie\";\nimport { allSettled } from \"../helpers/allSettled\";\n\nlet counter = 0;\n\nexport function guardedTable(table: DBCoreTable) {\n const prop = \"$lock\"+ (++counter);\n return {\n ...table,\n count: readLock(table.count, prop),\n get: readLock(table.get, prop),\n getMany: readLock(table.getMany, prop),\n openCursor: readLock(table.openCursor, prop),\n query: readLock(table.query, prop),\n mutate: writeLock(table.mutate, prop),\n };\n}\n\nfunction readLock<TReq extends { trans: DBCoreTransaction }, TRes>(\n fn: (req: TReq) => Promise<TRes>,\n prop: string\n): (req: TReq) => Promise<TRes> {\n return function readLocker(req): Promise<TRes> {\n const {\n readers,\n writers,\n }: { writers: Promise<any>[]; readers: Promise<any>[] } =\n req.trans[prop] || (req.trans[prop] = { writers: [], readers: [] });\n const numWriters = writers.length;\n const promise = (numWriters > 0\n ? writers[numWriters - 1].then(() => fn(req), () => fn(req))\n : fn(req)\n ).finally(() => {readers.splice(readers.indexOf(promise))});\n readers.push(promise);\n return promise;\n };\n}\n\nfunction writeLock<TReq extends { trans: DBCoreTransaction }, TRes>(\n fn: (req: TReq) => Promise<TRes>,\n prop: string\n): (req: TReq) => Promise<TRes> {\n return function writeLocker(req): Promise<TRes> {\n const {\n readers,\n writers,\n }: { writers: Promise<any>[]; readers: Promise<any>[] } =\n req.trans[prop] || (req.trans[prop] = { writers: [], readers: [] });\n let promise = (writers.length > 0\n ? writers[writers.length - 1].then(() => fn(req), () => fn(req))\n : readers.length > 0\n ? allSettled(readers).then(() => fn(req))\n : fn(req)\n ).finally(() => {writers.shift();});\n writers.push(promise);\n return promise;\n };\n}\n","\nexport function allSettled(possiblePromises: any[]) {\n return new Promise(resolve => {\n if (possiblePromises.length === 0) resolve([]);\n let remaining = possiblePromises.length;\n const results = new Array(remaining);\n possiblePromises.forEach((p, i) => Promise.resolve(p).then(\n value => results[i] = {status: \"fulfilled\", value},\n reason => results[i] = {status: \"rejected\", reason})\n .then(()=>--remaining || resolve(results)));\n });\n}\n","import { DBCoreTransaction } from 'dexie';\nimport { BehaviorSubject } from 'rxjs';\nimport { TXExpandos } from '../types/TXExpandos';\n\nexport const outstandingTransactions = new BehaviorSubject<Set<DBCoreTransaction & IDBTransaction & TXExpandos>>(new Set());\n","import { DexieCloudDB } from './db/DexieCloudDB';\n\nexport function isEagerSyncDisabled(db: DexieCloudDB) {\n return (\n db.cloud.options?.disableEagerSync ||\n db.cloud.currentUser.value?.license?.status !== 'ok' ||\n !db.cloud.options?.databaseUrl\n );\n}\n","import {\n DBCore,\n DBCoreAddRequest,\n DBCoreDeleteRequest,\n DBCoreMutateResponse,\n DBCorePutRequest,\n DBCoreTable,\n DBCoreTransaction,\n Middleware,\n RangeSet,\n} from 'dexie';\nimport { DBOperation, DBUpdateOperation } from 'dexie-cloud-common';\nimport { BehaviorSubject } from 'rxjs';\nimport { DexieCloudDB } from '../db/DexieCloudDB';\nimport { UserLogin } from '../db/entities/UserLogin';\nimport { getMutationTable } from '../helpers/getMutationTable';\nimport { randomString } from '../helpers/randomString';\nimport { throwVersionIncrementNeeded } from '../helpers/throwVersionIncrementNeeded';\nimport { guardedTable } from '../middleware-helpers/guardedTable';\nimport { registerSyncEvent } from '../sync/registerSyncEvent';\nimport { TXExpandos } from '../types/TXExpandos';\nimport { outstandingTransactions } from './outstandingTransaction';\nimport { isEagerSyncDisabled } from '../isEagerSyncDisabled';\nimport { triggerSync } from '../sync/triggerSync';\n\nexport interface MutationTrackingMiddlewareArgs {\n currentUserObservable: BehaviorSubject<UserLogin>;\n db: DexieCloudDB;\n}\n\n/** Tracks all mutations in the same transaction as the mutations -\n * so it is guaranteed that no mutation goes untracked - and if transaction\n * aborts, the mutations won't be tracked.\n *\n * The sync job will use the tracked mutations as the source of truth when pushing\n * changes to server and cleanup the tracked mutations once the server has\n * ackowledged that it got them.\n */\nexport function createMutationTrackingMiddleware({\n currentUserObservable,\n db,\n}: MutationTrackingMiddlewareArgs): Middleware<DBCore> {\n return {\n stack: 'dbcore',\n name: 'MutationTrackingMiddleware',\n level: 1,\n create: (core) => {\n const allTableNames = new Set(core.schema.tables.map((t) => t.name));\n const ordinaryTables = core.schema.tables.filter(\n (t) => !/^\\$/.test(t.name)\n );\n const mutTableMap = new Map<string, DBCoreTable>();\n for (const tbl of ordinaryTables) {\n const mutationTableName = `$${tbl.name}_mutations`;\n if (allTableNames.has(mutationTableName)) {\n mutTableMap.set(tbl.name, core.table(mutationTableName));\n }\n }\n\n return {\n ...core,\n transaction: (tables, mode) => {\n let tx: DBCoreTransaction & IDBTransaction & TXExpandos;\n if (mode === 'readwrite') {\n const mutationTables = tables\n .filter((tbl) => db.cloud.schema?.[tbl]?.markedForSync)\n .map((tbl) => getMutationTable(tbl));\n tx = core.transaction(\n [...tables, ...mutationTables],\n mode\n ) as DBCoreTransaction & IDBTransaction & TXExpandos;\n } else {\n tx = core.transaction(tables, mode) as DBCoreTransaction &\n IDBTransaction &\n TXExpandos;\n }\n\n if (mode === 'readwrite') {\n // Give each transaction a globally unique id.\n tx.txid = randomString(16);\n tx.opCount = 0;\n // Introduce the concept of current user that lasts through the entire transaction.\n // This is important because the tracked mutations must be connected to the user.\n tx.currentUser = currentUserObservable.value;\n outstandingTransactions.value.add(tx);\n outstandingTransactions.next(outstandingTransactions.value);\n const removeTransaction = () => {\n tx.removeEventListener('complete', txComplete);\n tx.removeEventListener('error', removeTransaction);\n tx.removeEventListener('abort', removeTransaction);\n outstandingTransactions.value.delete(tx);\n outstandingTransactions.next(outstandingTransactions.value);\n };\n const txComplete = () => {\n if (tx.mutationsAdded && !isEagerSyncDisabled(db)) {\n triggerSync(db, 'push');\n }\n removeTransaction();\n };\n tx.addEventListener('complete', txComplete);\n tx.addEventListener('error', removeTransaction);\n tx.addEventListener('abort', removeTransaction);\n }\n return tx;\n },\n table: (tableName) => {\n const table = core.table(tableName);\n if (/^\\$/.test(tableName)) {\n if (tableName.endsWith('_mutations')) {\n // In case application code adds items to ..._mutations tables,\n // make sure to set the mutationsAdded flag on transaction.\n // This is also done in mutateAndLog() as that function talks to a\n // lower level DBCore and wouldn't be catched by this code.\n return {\n ...table,\n mutate: (req) => {\n if (req.type === 'add' || req.type === 'put') {\n (\n req.trans as DBCoreTransaction & TXExpandos\n ).mutationsAdded = true;\n }\n return table.mutate(req);\n },\n };\n } else if (tableName === '$logins') {\n return {\n ...table,\n mutate: (req) => {\n //console.debug('Mutating $logins table', req);\n return table\n .mutate(req)\n .then((res) => {\n //console.debug('Mutating $logins');\n (\n req.trans as DBCoreTransaction & TXExpandos\n ).mutationsAdded = true;\n //console.debug('$logins mutated');\n return res;\n })\n .catch((err) => {\n console.debug('Failed mutation $logins', err);\n return Promise.reject(err);\n });\n },\n };\n } else {\n return table;\n }\n }\n const { schema } = table;\n const mutsTable = mutTableMap.get(tableName)!;\n if (!mutsTable) {\n // We cannot track mutations on this table because there is no mutations table for it.\n // This might happen in upgraders that executes before cloud schema is applied.\n return table; \n }\n return guardedTable({\n ...table,\n mutate: (req) => {\n const trans = req.trans as DBCoreTransaction & TXExpandos;\n if (!trans.txid) return table.mutate(req); // Upgrade transactions not guarded by us.\n if (trans.disableChangeTracking) return table.mutate(req);\n if (!db.cloud.schema?.[tableName]?.markedForSync)\n return table.mutate(req);\n if (!trans.currentUser?.isLoggedIn) {\n // Unauthorized user should not log mutations.\n // Instead, after login all local data should be logged at once.\n return table.mutate(req);\n }\n\n return req.type === 'deleteRange'\n ? table\n // Query the actual keys (needed for server sending correct rollback to us)\n .query({\n query: { range: req.range, index: schema.primaryKey },\n trans: req.trans,\n values: false,\n })\n // Do a delete request instead, but keep the criteria info for the server to execute\n .then((res) => {\n return mutateAndLog({\n type: 'delete',\n keys: res.result,\n trans: req.trans,\n criteria: { index: null, range: req.range },\n });\n })\n : mutateAndLog(req);\n },\n });\n\n function mutateAndLog(\n req: DBCoreDeleteRequest | DBCoreAddRequest | DBCorePutRequest\n ): Promise<DBCoreMutateResponse> {\n const trans = req.trans as DBCoreTransaction & TXExpandos;\n const unsyncedProps =\n db.cloud.options?.unsyncedProperties?.[tableName];\n const {\n txid,\n currentUser: { userId },\n } = trans;\n const { type } = req;\n const opNo = ++trans.opCount;\n\n function stripChangeSpec(changeSpec: { [keyPath: string]: any }) {\n if (!unsyncedProps) return changeSpec;\n let rv = changeSpec;\n for (const keyPath of Object.keys(changeSpec)) {\n if (\n unsyncedProps.some(\n (p) => keyPath === p || keyPath.startsWith(p + '.')\n )\n ) {\n if (rv === changeSpec) rv = { ...changeSpec }; // clone on demand\n delete rv[keyPath];\n }\n }\n return rv;\n }\n\n return table.mutate(req).then((res) => {\n const { numFailures: hasFailures, failures } = res;\n let keys = type === 'delete' ? req.keys! : res.results!;\n let values = 'values' in req ? req.values : [];\n let changeSpec = 'changeSpec' in req ? req.changeSpec : undefined;\n let updates = 'updates' in req ? req.updates : undefined;\n\n if (hasFailures) {\n keys = keys.filter((_, idx) => !failures[idx]);\n values = values.filter((_, idx) => !failures[idx]);\n }\n if (unsyncedProps) {\n // Filter out unsynced properties\n values = values.map((value) => {\n const newValue = { ...value };\n for (const prop of unsyncedProps) {\n delete newValue[prop];\n }\n return newValue;\n });\n if (changeSpec) {\n // modify operation with criteria and changeSpec.\n // We must strip out unsynced properties from changeSpec.\n // We deal with criteria later.\n changeSpec = stripChangeSpec(changeSpec);\n if (Object.keys(changeSpec).length === 0) {\n // Nothing to change on server\n return res;\n }\n }\n if (updates) {\n let strippedChangeSpecs =\n updates.changeSpecs.map(stripChangeSpec);\n let newUpdates: DBCorePutRequest['updates'] = {\n keys: [],\n changeSpecs: [],\n };\n const validKeys = new RangeSet();\n let anyChangeSpecBecameEmpty = false;\n for (let i = 0, l = strippedChangeSpecs.length; i < l; ++i) {\n if (Object.keys(strippedChangeSpecs[i]).length > 0) {\n newUpdates.keys.push(updates.keys[i]);\n newUpdates.changeSpecs.push(strippedChangeSpecs[i]);\n validKeys.addKey(updates.keys[i]);\n } else {\n anyChangeSpecBecameEmpty = true;\n }\n }\n updates = newUpdates;\n if (anyChangeSpecBecameEmpty) {\n // Some keys were stripped. We must also strip them from keys and values\n let newKeys: any[] = [];\n let newValues: any[] = [];\n for (let i = 0, l = keys.length; i < l; ++i) {\n if (validKeys.hasKey(keys[i])) {\n newKeys.push(keys[i]);\n newValues.push(values[i]);\n }\n }\n keys = newKeys;\n values = newValues;\n }\n }\n }\n const ts = Date.now();\n // Canonicalize req.criteria.index to null if it's on the primary key.\n let criteria =\n 'criteria' in req && req.criteria\n ? {\n ...req.criteria,\n index:\n req.criteria.index === schema.primaryKey.keyPath // Use null to inform server that criteria is on primary key\n ? null // This will disable the server from trying to log consistent operations where it shouldnt.\n : req.criteria.index,\n }\n : undefined;\n if (unsyncedProps && criteria?.index) {\n const keyPaths = schema.indexes.find(\n (idx) => idx.name === criteria!.index\n )?.keyPath;\n const involvedProps = keyPaths\n ? typeof keyPaths === 'string'\n ? [keyPaths]\n : keyPaths\n : [];\n if (involvedProps.some((p) => unsyncedProps?.includes(p))) {\n // Don't log criteria on unsynced properties as the server could not test them.\n criteria = undefined;\n }\n }\n\n const mut: DBOperation =\n req.type === 'delete'\n ? {\n type: 'delete',\n ts,\n opNo,\n keys,\n criteria,\n txid,\n userId,\n }\n : req.type === 'add'\n ? {\n type: 'insert',\n ts,\n opNo,\n keys,\n txid,\n userId,\n values,\n }\n : criteria && changeSpec\n ? {\n // Common changeSpec for all keys\n type: 'modify',\n ts,\n opNo,\n keys,\n criteria,\n changeSpec,\n txid,\n userId,\n }\n : changeSpec\n ? {\n // In case criteria involved an unsynced property, we go for keys instead.\n type: 'update',\n ts,\n opNo,\n keys,\n changeSpecs: keys.map(() => changeSpec!),\n txid,\n userId,\n }\n : updates\n ? {\n // One changeSpec per key\n type: 'update',\n ts,\n opNo,\n keys: updates.keys,\n changeSpecs: updates.changeSpecs,\n txid,\n userId,\n }\n : {\n type: 'upsert',\n ts,\n opNo,\n keys,\n values,\n txid,\n userId,\n };\n\n if ('isAdditionalChunk' in req && req.isAdditionalChunk) {\n mut.isAdditionalChunk = true;\n }\n return keys.length > 0 || criteria\n ? mutsTable\n .mutate({ type: 'add', trans, values: [mut] }) // Log entry\n .then(() => {\n trans.mutationsAdded = true; // Mark transaction as having added mutations to trigger eager sync\n return res; // Return original response\n })\n : res;\n });\n }\n },\n };\n },\n };\n}\n","import Dexie, { DbSchema } from 'dexie';\nimport { DEXIE_CLOUD_SCHEMA } from './db/DexieCloudDB';\nimport { generateTablePrefix } from './middleware-helpers/idGenerationHelpers';\n\nexport function overrideParseStoresSpec(origFunc: Function, dexie: Dexie) {\n return function(stores: {[tableName: string]: string}, dbSchema: DbSchema) {\n const storesClone = {\n ...DEXIE_CLOUD_SCHEMA,\n ...stores,\n };\n // Merge indexes of DEXIE_CLOUD_SCHEMA with stores\n Object.keys(DEXIE_CLOUD_SCHEMA).forEach((tableName: keyof typeof DEXIE_CLOUD_SCHEMA) => {\n const schemaSrc = storesClone[tableName];\n // Verify that they don't try to delete a table that is needed for access control of Dexie Cloud\n if (schemaSrc == null) {\n // They try to delete one of the built-in schema tables.\n throw new Error(`Cannot delete table ${tableName} as it is needed for access control of Dexie Cloud`);\n }\n // If not trying to override a built-in table, then we can skip this and continue to next table.\n if (!stores[tableName]) {\n // They haven't tried to declare this table. No need to merge indexes.\n return; // Continue\n }\n\n // They have declared this table. Merge indexes in case they didn't declare all indexes we need.\n const requestedIndexes = schemaSrc.split(',').map(spec => spec.trim());\n const builtInIndexes = DEXIE_CLOUD_SCHEMA[tableName].split(',').map(spec => spec.trim());\n const requestedIndexSet = new Set(requestedIndexes.map(index => index.replace(/([&*]|\\+\\+)/g, \"\")));\n // Verify that primary key is unchanged\n if (requestedIndexes[0] !== builtInIndexes[0]) {\n // Primary key must match exactly\n throw new Error(`Cannot override primary key of table ${tableName}. Please declare it as {${\n tableName}: ${\n JSON.stringify(DEXIE_CLOUD_SCHEMA[tableName])\n }`);\n }\n // Merge indexes\n for (let i=1; i<builtInIndexes.length; ++i) {\n const builtInIndex = builtInIndexes[i];\n if (!requestedIndexSet.has(builtInIndex.replace(/([&*]|\\+\\+)/g, \"\"))) {\n // Add built-in index if not already requested\n storesClone[tableName] += `,${builtInIndex}`;\n }\n }\n });\n\n // Populate dexie.cloud.schema\n const cloudSchema = dexie.cloud.schema || (dexie.cloud.schema = {});\n const allPrefixes = new Set<string>();\n Object.keys(storesClone).forEach(tableName => {\n const schemaSrc = storesClone[tableName];\n const cloudTableSchema = cloudSchema[tableName] || (cloudSchema[tableName] = {});\n if (schemaSrc != null) {\n if (/^\\@/.test(schemaSrc)) {\n storesClone[tableName] = storesClone[tableName].substr(1);\n cloudTableSchema.generatedGlobalId = true;\n cloudTableSchema.idPrefix = generateTablePrefix(tableName, allPrefixes);\n allPrefixes.add(cloudTableSchema.idPrefix);\n }\n if (!/^\\$/.test(tableName)) {\n storesClone[`$${tableName}_mutations`] = '++rev';\n cloudTableSchema.markedForSync = true;\n }\n if (cloudTableSchema.deleted) {\n cloudTableSchema.deleted = false;\n }\n } else {\n cloudTableSchema.deleted = true;\n cloudTableSchema.markedForSync = false;\n storesClone[`$${tableName}_mutations`] = null;\n }\n });\n const rv = origFunc.call(this, storesClone, dbSchema);\n for (const [tableName, spec] of Object.entries(dbSchema)) {\n if (spec.yProps?.length) {\n const cloudTableSchema = cloudSchema[tableName];\n if (cloudTableSchema) {\n cloudTableSchema.yProps = spec.yProps.map((yProp) => yProp.prop);\n }\n }\n }\n return rv;\n }\n}\n","import { DexieCloudDB } from \"../db/DexieCloudDB\";\n\nexport function performGuardedJob<T>(\n db: DexieCloudDB,\n jobName: string,\n job: () => Promise<T>\n): Promise<T> {\n if (typeof navigator === 'undefined' || !navigator.locks) {\n // No support for guarding jobs. IE11, node.js, etc.\n return job();\n }\n return navigator.locks.request(db.name + '|' + jobName, () => job());\n}\n","import { BehaviorSubject, fromEvent, merge, of } from 'rxjs';\nimport {\n debounceTime,\n delay,\n distinctUntilChanged,\n filter,\n map,\n skip,\n startWith,\n switchMap,\n tap,\n} from 'rxjs/operators';\n\nconst USER_INACTIVITY_TIMEOUT = 180_000; // 3 minutes\nconst ACTIVE_WAIT_TIME = 0; // For now, it's nicer to react instantly on user activity\nconst INACTIVE_WAIT_TIME = 20_000;\n\n// This observable will be emitted to later down....\nexport const userIsActive = new BehaviorSubject<boolean>(true);\n\n// A refined version that waits before changing state:\n// * Wait another INACTIVE_WAIT_TIME before accepting that the user is inactive.\n// Reason 1: Spare resources - no need to setup the entire websocket flow when\n// switching tabs back and forth.\n// Reason 2: Less flickering for the end user when switching tabs back and forth.\n// * Wait another ACTIVE_WAIT_TIME before accepting that the user is active.\n// Possible reason to have a value here: Sparing resources if users often temporary click the tab\n// for just a short time.\nexport const userIsReallyActive = new BehaviorSubject<boolean>(true);\nuserIsActive\n .pipe(\n switchMap((isActive) => {\n //console.debug('SyncStatus: DUBB: isActive changed to', isActive);\n return isActive\n ? ACTIVE_WAIT_TIME\n ? of(true).pipe(delay(ACTIVE_WAIT_TIME))\n : of(true)\n : INACTIVE_WAIT_TIME\n ? of(false).pipe(delay(INACTIVE_WAIT_TIME))\n : of(false);}\n ),\n distinctUntilChanged()\n )\n .subscribe(userIsReallyActive);\n\n//\n// First create some corner-stone observables to build the flow on\n//\n\n// document.onvisibilitychange:\nexport const visibilityStateIsChanged =\n typeof document !== 'undefined'\n ? fromEvent(document, 'visibilitychange')\n : of({});\n\n// document.onvisibilitychange makes document hidden:\nexport const documentBecomesHidden = visibilityStateIsChanged.pipe(\n filter(() => document.visibilityState === 'hidden')\n);\n\n// document.onvisibilitychange makes document visible\nexport const documentBecomesVisible = visibilityStateIsChanged.pipe(\n filter(() => document.visibilityState === 'visible')\n);\n\n// Any of various user-activity-related events happen:\nexport const userDoesSomething =\n typeof window !== 'undefined'\n ? merge(\n documentBecomesVisible,\n fromEvent(window, 'mousedown'),\n fromEvent(window, 'mousemove'),\n fromEvent(window, 'keydown'),\n fromEvent(window, 'wheel'),\n fromEvent(window, 'touchmove')\n )\n : of({});\n\nif (typeof document !== 'undefined') {\n //\n // Now, create a final observable and start subscribing to it in order\n // to make it emit values to userIsActive BehaviourSubject (which is the\n // most important global hot observable we have here)\n //\n // Live test: https://jsitor.com/LboCDHgbn\n //\n merge(\n of(true), // Make sure something is always emitted from start\n documentBecomesHidden, // so that we can eagerly emit false!\n userDoesSomething\n )\n .pipe(\n // No matter event source, compute whether user is visible using visibilityState:\n map(() => document.visibilityState === 'visible'),\n // Make sure to emit it\n tap((isActive) => {\n if (userIsActive.value !== isActive) {\n // Emit new value unless it already has that value\n userIsActive.next(isActive);\n }\n }),\n // Now, if true was emitted, make sure to set a timeout to emit false\n // unless new user activity things happen (in that case, the timeout will be cancelled!)\n switchMap((isActive) =>\n isActive\n ? of(0).pipe(\n delay(USER_INACTIVITY_TIMEOUT - INACTIVE_WAIT_TIME),\n tap(() => userIsActive.next(false))\n )\n : of(0)\n )\n )\n .subscribe(() => {}); // Unless we subscribe nothing will be propagated to userIsActive observable\n}\n","export class TokenExpiredError extends Error {\n name = \"TokenExpiredError\";\n}\n","import Dexie from \"dexie\";\nimport { type DexieCloudDB } from \"../db/DexieCloudDB\";\n\nexport function getAwarenessLibrary(db: DexieCloudDB): typeof import ('y-protocols/awareness') {\n if (!db.cloud.options?.awarenessProtocol) {\n throw new Dexie.MissingAPIError('awarenessProtocol was not provided to db.cloud.configure(). Please import * as awarenessProtocol from \"y-protocols/awareness\".');\n }\n return db.cloud.options?.awarenessProtocol;\n}\n\nexport const awarenessWeakMap = new WeakMap<any, import('y-protocols/awareness').Awareness>();\n\nexport const getDocAwareness = (doc: any) => awarenessWeakMap.get(doc);\n\n\n","import { YjsDoc } from \"dexie\";\nimport { Subject } from \"rxjs\";\n\n\nconst wm = new WeakMap<YjsDoc, Subject<void>>();\n\n/** A property (package-private) on Y.Doc that is used\n * to signal that the server wants us to send a 'doc-open' message\n * to the server for this document.\n * \n * @param doc \n * @returns \n */\nexport function getOpenDocSignal(doc: YjsDoc) {\n let signal = wm.get(doc);\n if (!signal) {\n signal = new Subject<void>();\n wm.set(doc, signal);\n }\n return signal;\n}","import { DBOperationsSet } from 'dexie-cloud-common';\nimport { BehaviorSubject, Observable, Subscriber, Subscription, tap } from 'rxjs';\nimport { TokenExpiredError } from './authentication/TokenExpiredError';\nimport { DXCWebSocketStatus } from './DXCWebSocketStatus';\nimport { TSON } from './TSON';\nimport type { YClientMessage, YServerMessage } from 'dexie-cloud-common';\nimport { DexieCloudDB } from './db/DexieCloudDB';\nimport { createYClientUpdateObservable } from './yjs/createYClientUpdateObservable';\nimport { applyYServerMessages } from './yjs/applyYMessages';\nimport { DexieYProvider, Table, YSyncState } from 'dexie';\nimport { getAwarenessLibrary, getDocAwareness } from './yjs/awareness';\nimport { encodeYMessage, decodeYMessage } from 'dexie-cloud-common';\nimport { UserLogin } from './dexie-cloud-client';\nimport { isEagerSyncDisabled } from './isEagerSyncDisabled';\nimport { getOpenDocSignal } from './yjs/reopenDocSignal';\nimport { getUpdatesTable } from './yjs/getUpdatesTable';\nimport { DEXIE_CLOUD_SYNCER_ID } from './sync/DEXIE_CLOUD_SYNCER_ID';\n\nconst SERVER_PING_TIMEOUT = 20000;\nconst CLIENT_PING_INTERVAL = 30000;\nconst FAIL_RETRY_WAIT_TIME = 60000;\n\nexport type WSClientToServerMsg = ReadyForChangesMessage | YClientMessage;\nexport interface ReadyForChangesMessage {\n type: 'ready';\n realmSetHash: string;\n rev: string;\n}\n\nexport type WSConnectionMsg =\n | RevisionChangedMessage\n | RealmAddedMessage\n | RealmAcceptedMessage\n | RealmRemovedMessage\n | RealmsChangedMessage\n | ChangesFromServerMessage\n | TokenExpiredMessage;\ninterface PingMessage {\n type: 'ping';\n}\n\ninterface PongMessage {\n type: 'pong';\n}\n\ninterface ErrorMessage {\n type: 'error';\n error: string;\n}\n\nexport interface ChangesFromServerMessage {\n type: 'changes';\n baseRev: string;\n realmSetHash: string;\n newRev: string;\n changes: DBOperationsSet<string>;\n}\nexport interface RevisionChangedMessage {\n type: 'rev';\n rev: string;\n}\n\nexport interface RealmAddedMessage {\n type: 'realm-added';\n realm: string;\n}\n\nexport interface RealmAcceptedMessage {\n type: 'realm-accepted';\n realm: string;\n}\n\nexport interface RealmRemovedMessage {\n type: 'realm-removed';\n realm: string;\n}\n\nexport interface RealmsChangedMessage {\n type: 'realms-changed';\n realmsHash: string;\n}\nexport interface TokenExpiredMessage {\n type: 'token-expired';\n}\n\nexport class WSObservable extends Observable<WSConnectionMsg> {\n constructor(\n db: DexieCloudDB,\n rev: string | undefined,\n yrev: string | undefined,\n realmSetHash: string,\n clientIdentity: string,\n messageProducer: Observable<WSClientToServerMsg>,\n webSocketStatus: BehaviorSubject<DXCWebSocketStatus>,\n user: UserLogin\n ) {\n super(\n (subscriber) =>\n new WSConnection(\n db,\n rev,\n yrev,\n realmSetHash,\n clientIdentity,\n user,\n subscriber,\n messageProducer,\n webSocketStatus\n )\n );\n }\n}\n\nlet counter = 0;\n\nexport class WSConnection extends Subscription {\n db: DexieCloudDB;\n ws: WebSocket | null;\n lastServerActivity: Date;\n lastUserActivity: Date;\n lastPing: Date;\n databaseUrl: string;\n rev: string | undefined;\n yrev: string | undefined;\n realmSetHash: string;\n clientIdentity: string;\n user: UserLogin;\n subscriber: Subscriber<WSConnectionMsg>;\n pauseUntil?: Date;\n messageProducer: Observable<WSClientToServerMsg>;\n webSocketStatus: BehaviorSubject<DXCWebSocketStatus>;\n id = ++counter;\n\n private pinger: any;\n private subscriptions: Set<Subscription> = new Set();\n\n constructor(\n db: DexieCloudDB,\n rev: string | undefined,\n yrev: string | undefined,\n realmSetHash: string,\n clientIdentity: string,\n user: UserLogin,\n subscriber: Subscriber<WSConnectionMsg>,\n messageProducer: Observable<WSClientToServerMsg>,\n webSocketStatus: BehaviorSubject<DXCWebSocketStatus>\n ) {\n super(() => this.teardown());\n console.debug(\n 'New WebSocket Connection',\n this.id,\n user.accessToken ? 'authorized' : 'unauthorized'\n );\n this.db = db;\n this.databaseUrl = db.cloud.options!.databaseUrl;\n this.rev = rev;\n this.yrev = yrev;\n this.realmSetHash = realmSetHash;\n this.clientIdentity = clientIdentity;\n this.user = user;\n this.subscriber = subscriber;\n this.lastUserActivity = new Date();\n this.messageProducer = messageProducer;\n this.webSocketStatus = webSocketStatus;\n this.connect();\n }\n\n private teardown() {\n console.debug('Teardown WebSocket Connection', this.id);\n this.disconnect();\n }\n\n private disconnect() {\n this.webSocketStatus.next('disconnected');\n if (this.pinger) {\n clearInterval(this.pinger);\n this.pinger = null;\n }\n if (this.ws) {\n try {\n this.ws.close();\n } catch {}\n }\n this.ws = null;\n for (const sub of this.subscriptions) {\n sub.unsubscribe();\n }\n this.subscriptions.clear();\n }\n\n reconnecting = false;\n reconnect() {\n if (this.reconnecting) return;\n this.reconnecting = true;\n try {\n this.disconnect();\n } catch {}\n this.connect()\n .catch(() => {})\n .then(() => (this.reconnecting = false)); // finally()\n }\n\n async connect() {\n this.lastServerActivity = new Date();\n if (this.pauseUntil && this.pauseUntil > new Date()) {\n console.debug('WS not reconnecting just yet', {\n id: this.id,\n pauseUntil: this.pauseUntil,\n });\n return;\n }\n if (this.ws) {\n throw new Error(`Called connect() when a connection is already open`);\n }\n if (!this.databaseUrl)\n throw new Error(`Cannot connect without a database URL`);\n if (this.closed) {\n //console.debug('SyncStatus: DUBB: Ooops it was closed!');\n return;\n }\n const tokenExpiration = this.user.accessTokenExpiration;\n if (tokenExpiration && tokenExpiration < new Date()) {\n this.subscriber.error(new TokenExpiredError()); // Will be handled in connectWebSocket.ts.\n return;\n }\n this.webSocketStatus.next('connecting');\n this.pinger = setInterval(async () => {\n // setInterval here causes unnecessary pings when server is proved active anyway.\n // TODO: Use setTimout() here instead. When triggered, check if we really need to ping.\n // In case we've had server activity, we don't need to ping. Then schedule then next ping\n // to the time when we should ping next time (based on lastServerActivity + CLIENT_PING_INTERVAL).\n // Else, ping now and schedule next ping to CLIENT_PING_INTERVAL from now.\n if (this.closed) {\n console.debug('pinger check', this.id, 'CLOSED.');\n this.teardown();\n return;\n }\n if (this.ws) {\n try {\n this.ws.send(JSON.stringify({ type: 'ping' } as PingMessage));\n setTimeout(() => {\n console.debug(\n 'pinger setTimeout',\n this.id,\n this.pinger ? `alive` : 'dead'\n );\n if (!this.pinger) return;\n if (this.closed) {\n console.debug(\n 'pinger setTimeout',\n this.id,\n 'subscription is closed'\n );\n this.teardown();\n return;\n }\n if (\n this.lastServerActivity <\n new Date(Date.now() - SERVER_PING_TIMEOUT)\n ) {\n // Server inactive. Reconnect if user is active.\n console.debug('pinger: server is inactive');\n console.debug('pinger reconnecting');\n this.reconnect();\n } else {\n console.debug('pinger: server still active');\n }\n }, SERVER_PING_TIMEOUT);\n } catch {\n console.debug('pinger catch error', this.id, 'reconnecting');\n this.reconnect();\n }\n } else {\n console.debug('pinger', this.id, 'reconnecting');\n this.reconnect();\n }\n }, CLIENT_PING_INTERVAL);\n\n // The following vars are needed because we must know which callback to ack when server sends it's ack to us.\n const wsUrl = new URL(this.databaseUrl);\n wsUrl.protocol = wsUrl.protocol === 'http:' ? 'ws' : 'wss';\n const searchParams = new URLSearchParams();\n if (this.subscriber.closed) return;\n searchParams.set('v', '2');\n if (this.rev) searchParams.set('rev', this.rev);\n if (this.yrev) searchParams.set('yrev', this.yrev);\n searchParams.set('realmsHash', this.realmSetHash);\n searchParams.set('clientId', this.clientIdentity);\n searchParams.set('dxcv', this.db.cloud.version);\n if (this.user.accessToken) {\n searchParams.set('token', this.user.accessToken);\n }\n\n // Connect the WebSocket to given url:\n console.debug('dexie-cloud WebSocket create');\n const ws = (this.ws = new WebSocket(`${wsUrl}/changes?${searchParams}`));\n ws.binaryType = \"arraybuffer\";\n\n ws.onclose = (event: Event) => {\n if (!this.pinger) return;\n console.debug('dexie-cloud WebSocket onclosed', this.id);\n this.reconnect();\n };\n\n ws.onmessage = (event: MessageEvent) => {\n if (!this.pinger) return;\n\n this.lastServerActivity = new Date();\n try {\n const msg = typeof event.data === 'string'\n ? TSON.parse(event.data) as\n | WSConnectionMsg\n | PongMessage\n | ErrorMessage\n | YServerMessage \n : decodeYMessage(new Uint8Array(event.data)) as\n | YServerMessage;\n console.debug('dexie-cloud WebSocket onmessage', msg.type, msg);\n if (msg.type === 'error') {\n throw new Error(`Error message from dexie-cloud: ${msg.error}`);\n } else if (msg.type === 'aware') {\n const docCache = DexieYProvider.getDocCache(this.db.dx);\n const doc = docCache.find(msg.table, msg.k, msg.prop);\n if (doc) {\n const awareness = getDocAwareness(doc);\n if (awareness) {\n const awap = getAwarenessLibrary(this.db);\n awap.applyAwarenessUpdate(\n awareness,\n msg.u,\n 'server',\n );\n }\n }\n } else if (msg.type === 'pong') {\n // Do nothing\n } else if (msg.type === 'doc-open') {\n const docCache = DexieYProvider.getDocCache(this.db.dx);\n const doc = docCache.find(msg.table, msg.k, msg.prop);\n if (doc) {\n getOpenDocSignal(doc).next(); // Make yHandler reopen the document on server.\n }\n } else if (msg.type === 'u-ack' || msg.type === 'u-reject' || msg.type === 'u-s' || msg.type === 'in-sync' || msg.type === 'outdated-server-rev' || msg.type === 'y-complete-sync-done') {\n applyYServerMessages([msg], this.db).then(async ({resyncNeeded, yServerRevision, receivedUntils}) => {\n if (yServerRevision) {\n await this.db.$syncState.update('syncState', { yServerRevision: yServerRevision });\n }\n if (msg.type === 'u-s' && receivedUntils) {\n const utbl = getUpdatesTable(this.db, msg.table, msg.prop) as any as Table<YSyncState, string>;\n if (utbl) {\n const receivedUntil = receivedUntils[utbl.name];\n if (receivedUntil) {\n await utbl.update(DEXIE_CLOUD_SYNCER_ID, { receivedUntil });\n }\n }\n }\n if (resyncNeeded) {\n await this.db.cloud.sync({ purpose: 'pull', wait: true });\n }\n })\n } else {\n // Forward the request to our subscriber, wich is in messageFromServerQueue.ts (via connectWebSocket's subscribe() at the end!)\n this.subscriber.next(msg);\n }\n } catch (e) {\n this.subscriber.error(e);\n }\n };\n\n try {\n let everConnected = false;\n await new Promise((resolve, reject) => {\n ws.onopen = (event) => {\n console.debug('dexie-cloud WebSocket onopen');\n everConnected = true;\n resolve(null);\n };\n ws.onerror = (event: ErrorEvent) => {\n if (!everConnected) {\n const error = event.error || new Error('WebSocket Error');\n this.subscriber.error(error);\n this.webSocketStatus.next('error');\n reject(error);\n } else {\n this.reconnect();\n }\n };\n });\n this.subscriptions.add(this.messageProducer.subscribe(\n (msg) => {\n if (!this.closed) {\n if (\n msg.type === 'ready' &&\n this.webSocketStatus.value !== 'connected'\n ) {\n this.webSocketStatus.next('connected');\n }\n console.debug('dexie-cloud WebSocket send', msg.type, msg);\n if (msg.type === 'ready') {\n // Ok, we are certain to have stored everything up until revision msg.rev.\n // Update this.rev in case of reconnect - remember where we were and don't just start over!\n this.rev = msg.rev; \n // ... and then send along the request to the server so it would also be updated!\n this.ws?.send(TSON.stringify(msg));\n } else {\n // If it's not a \"ready\" message, it's an YMessage.\n // YMessages can be sent binary encoded.\n this.ws?.send(encodeYMessage(msg));\n }\n }\n }\n ));\n if (this.user.isLoggedIn && !isEagerSyncDisabled(this.db)) {\n this.subscriptions.add(\n createYClientUpdateObservable(this.db).subscribe(\n this.db.messageProducer\n )\n );\n }\n } catch (error) {\n this.pauseUntil = new Date(Date.now() + FAIL_RETRY_WAIT_TIME);\n }\n }\n}\n","import { Decoder, readAny, readBigUint64, readVarString, readVarUint8Array, } from 'lib0/decoding';\nexport function decodeYMessage(a) {\n const decoder = new Decoder(a);\n const type = readVarString(decoder);\n if (type === 'outdated-server-rev') {\n return { type };\n }\n if (type === 'y-complete-sync-done') {\n return { type, yServerRev: readVarString(decoder) };\n }\n const table = readVarString(decoder);\n const prop = readVarString(decoder);\n switch (type) {\n case 'u-ack':\n case 'u-reject':\n return {\n type,\n table,\n prop,\n i: Number(readBigUint64(decoder)),\n };\n default: {\n const k = readAny(decoder);\n switch (type) {\n case 'in-sync':\n return { type, table, prop, k };\n case 'aware':\n return {\n type,\n table,\n prop,\n k,\n u: readVarUint8Array(decoder),\n };\n case 'doc-open':\n return {\n type,\n table,\n prop,\n k,\n serverRev: readAny(decoder),\n sv: readAny(decoder),\n };\n case 'doc-close':\n return { type, table, prop, k };\n case 'sv':\n return {\n type,\n table,\n prop,\n k,\n sv: readVarUint8Array(decoder),\n };\n case 'u-c':\n return {\n type,\n table,\n prop,\n k,\n u: readVarUint8Array(decoder),\n i: Number(readBigUint64(decoder)),\n };\n case 'u-s':\n return {\n type,\n table,\n prop,\n k,\n u: readVarUint8Array(decoder),\n r: (decoder.pos < decoder.arr.length && readVarString(decoder)) || undefined,\n };\n default:\n throw new TypeError(`Unknown message type: ${type}`);\n }\n }\n }\n}\n","import { Observable, from, merge, mergeMap, switchMap, tap } from 'rxjs';\nimport { YClientMessage, YUpdateFromClientRequest } from 'dexie-cloud-common';\nimport { DexieCloudDB } from '../db/DexieCloudDB';\nimport { flatten } from '../helpers/flatten';\nimport { liveQuery } from 'dexie';\nimport { DEXIE_CLOUD_SYNCER_ID } from '../sync/DEXIE_CLOUD_SYNCER_ID';\nimport { listUpdatesSince } from './listUpdatesSince';\nimport { YDexieCloudSyncState } from './YDexieCloudSyncState';\n\nexport function createYClientUpdateObservable(\n db: DexieCloudDB\n): Observable<YClientMessage> {\n const yTableRecords = flatten(\n db.tables\n .filter(\n (table) =>\n db.cloud.schema?.[table.name]?.markedForSync && table.schema.yProps\n )\n .map((table) =>\n table.schema.yProps!.map((p) => ({\n table: table.name,\n ydocProp: p.prop,\n updatesTable: p.updatesTable,\n }))\n )\n );\n return merge(\n ...yTableRecords.map(({ table, ydocProp, updatesTable }) => {\n // Per updates table (table+prop combo), we first read syncer.unsentFrom,\n // and then start listening for updates since that number.\n const yTbl = db.table(updatesTable);\n return from(yTbl.get(DEXIE_CLOUD_SYNCER_ID)).pipe(\n switchMap((syncer: YDexieCloudSyncState) => {\n let currentUnsentFrom = syncer?.unsentFrom || 1;\n return from(\n liveQuery(async () => {\n const addedUpdates = await listUpdatesSince(\n yTbl,\n currentUnsentFrom\n );\n return addedUpdates\n .filter((update) => update.f && update.f & 1) // Only include local updates\n .map((update) => {\n return {\n type: 'u-c',\n table,\n prop: ydocProp,\n k: update.k,\n u: update.u,\n i: update.i,\n } satisfies YUpdateFromClientRequest;\n });\n })\n ).pipe(\n tap((addedUpdates) => {\n // Update currentUnsentFrom to only listen for updates that will be newer than the ones we emitted.\n // (Before, we did this within the liveQuery, but that caused a bug because\n // a cancelled emittion of a liveQuery would update the currentUnsentFrom without\n // emitting anything, leading to that we jumped over some updates. Here we update it\n // after the liveQuery has emitted its updates)\n if (addedUpdates.length > 0) {\n currentUnsentFrom = addedUpdates.at(-1)!.i + 1;\n }\n })\n );\n })\n );\n })\n ).pipe(\n // Flatten the array of messages.\n // If messageProducer emits empty array, nothing is emitted\n // but if messageProducer emits array of messages, they are\n // emitted one by one.\n mergeMap((messages) => messages)\n );\n}\n","export class InvalidLicenseError extends Error {\n name = 'InvalidLicenseError';\n license?: 'expired' | 'deactivated';\n constructor(license?: 'expired' | 'deactivated') {\n super(\n license === 'expired'\n ? `License expired`\n : license === 'deactivated'\n ? `User deactivated`\n : 'Invalid license'\n );\n if (license) {\n this.license = license;\n }\n }\n}\n","import { BehaviorSubject, firstValueFrom, from, Observable, of, throwError, merge } from 'rxjs';\nimport {\n catchError,\n combineLatestAll,\n debounceTime,\n delay,\n distinctUntilChanged,\n filter,\n map,\n mergeMap,\n switchMap,\n take,\n tap,\n} from 'rxjs/operators';\nimport { refreshAccessToken } from '../authentication/authenticate';\nimport { DexieCloudDB } from '../db/DexieCloudDB';\nimport { PersistedSyncState } from '../db/entities/PersistedSyncState';\nimport { computeRealmSetHash } from '../helpers/computeRealmSetHash';\nimport {\n userDoesSomething,\n userIsActive,\n userIsReallyActive,\n} from '../userIsActive';\nimport {\n ReadyForChangesMessage,\n WSConnectionMsg,\n WSObservable,\n} from '../WSObservable';\nimport { InvalidLicenseError } from '../InvalidLicenseError';\nimport { read } from 'fs';\n\nfunction sleep(ms: number) {\n return new Promise((resolve) => setTimeout(resolve, ms));\n}\n\nasync function waitAndReconnectWhenUserDoesSomething(error: Error) {\n console.error(\n `WebSocket observable: error but revive when user does some active thing...`,\n error\n );\n // Sleep some seconds...\n await sleep(3000);\n // Wait til user does something (move mouse, tap, scroll, click etc)\n console.debug('waiting for someone to do something');\n await firstValueFrom(userDoesSomething);\n console.debug('someone did something!');\n}\n\nexport function connectWebSocket(db: DexieCloudDB) {\n if (!db.cloud.options?.databaseUrl) {\n throw new Error(`No database URL to connect WebSocket to`);\n }\n\n const readyForChangesMessage = db.messageConsumer.readyToServe.pipe(\n filter((isReady) => isReady), // When consumer is ready for new messages, produce such a message to inform server about it\n switchMap(() => db.getPersistedSyncState()), // We need the info on which server revision we are at:\n filter((syncState) => syncState && syncState.serverRevision), // We wont send anything to server before inital sync has taken place\n switchMap<PersistedSyncState, Promise<ReadyForChangesMessage>>(async (syncState) => ({\n // Produce the message to trigger server to send us new messages to consume:\n type: 'ready',\n rev: syncState.serverRevision,\n realmSetHash: await computeRealmSetHash(syncState)\n } satisfies ReadyForChangesMessage))\n );\n\n const messageProducer = merge(\n readyForChangesMessage,\n db.messageProducer\n );\n\n function createObservable(): Observable<WSConnectionMsg | null> {\n return db.cloud.persistedSyncState.pipe(\n filter((syncState) => syncState?.serverRevision), // Don't connect before there's no initial sync performed.\n take(1), // Don't continue waking up whenever syncState change\n switchMap((syncState) =>\n db.cloud.currentUser.pipe(\n map((userLogin) => [userLogin, syncState] as const)\n )\n ),\n switchMap(([userLogin, syncState]) => {\n /*if (userLogin.license?.status && userLogin.license.status !== 'ok') {\n throw new InvalidLicenseError();\n }*/\n return userIsReallyActive.pipe(\n map((isActive) => [isActive ? userLogin : null, syncState] as const)\n );\n }),\n switchMap(([userLogin, syncState]) => {\n if (userLogin?.isLoggedIn && !syncState?.realms.includes(userLogin.userId!)) {\n // We're in an in-between state when user is logged in but the user's realms are not yet synced.\n // Don't make this change reconnect the websocket just yet. Wait till syncState is updated\n // to iclude the user's realm.\n return db.cloud.persistedSyncState.pipe(\n filter((syncState) => syncState?.realms.includes(userLogin!.userId!) || false),\n take(1),\n map((syncState) => [userLogin, syncState] as const)\n );\n }\n return new BehaviorSubject([userLogin, syncState] as const);\n }),\n switchMap(\n async ([userLogin, syncState]) =>\n [userLogin, await computeRealmSetHash(syncState!)] as const\n ),\n distinctUntilChanged(([prevUser, prevHash], [currUser, currHash]) => prevUser === currUser && prevHash === currHash ),\n switchMap(([userLogin, realmSetHash]) => {\n if (!db.cloud.persistedSyncState?.value) {\n // Restart the flow if persistedSyncState is not yet available.\n return createObservable();\n }\n // Let server end query changes from last entry of same client-ID and forward.\n // If no new entries, server won't bother the client. If new entries, server sends only those\n // and the baseRev of the last from same client-ID.\n if (userLogin) {\n return new WSObservable(\n db,\n db.cloud.persistedSyncState!.value!.serverRevision,\n db.cloud.persistedSyncState!.value!.yServerRevision,\n realmSetHash,\n db.cloud.persistedSyncState!.value!.clientIdentity,\n messageProducer,\n db.cloud.webSocketStatus,\n userLogin\n );\n } else {\n return from([] as WSConnectionMsg[]);\n }}),\n catchError((error) => {\n if (error?.name === 'TokenExpiredError') {\n console.debug(\n 'WebSocket observable: Token expired. Refreshing token...'\n );\n return of(true).pipe(\n switchMap(async () => {\n // Refresh access token\n const user = await db.getCurrentUser();\n const refreshedLogin = await refreshAccessToken(\n db.cloud.options!.databaseUrl,\n user\n );\n // Persist updated access token\n await db.table('$logins').update(user.userId, {\n accessToken: refreshedLogin.accessToken,\n accessTokenExpiration: refreshedLogin.accessTokenExpiration,\n claims: refreshedLogin.claims,\n license: refreshedLogin.license,\n data: refreshedLogin.data\n });\n }),\n switchMap(() => createObservable())\n );\n } else {\n return throwError(()=>error);\n }\n }),\n catchError((error) => {\n db.cloud.webSocketStatus.next(\"error\");\n if (error instanceof InvalidLicenseError) {\n // Don't retry. Just throw and don't try connect again.\n return throwError(() => error);\n }\n return from(waitAndReconnectWhenUserDoesSomething(error)).pipe(\n switchMap(() => createObservable())\n );\n })\n ) as Observable<WSConnectionMsg | null>;\n }\n\n return createObservable().subscribe({\n next: (msg) => {\n if (msg) {\n console.debug('WS got message', msg);\n db.messageConsumer.enqueue(msg);\n }\n },\n error: (error) => {\n console.error('WS got error', error);\n },\n complete: () => {\n console.debug('WS observable completed');\n },\n });\n}\n","import { DexieCloudDB } from \"../db/DexieCloudDB\";\nimport { sync } from \"./sync\";\n\nexport async function isSyncNeeded(db: DexieCloudDB) {\n return db.cloud.options?.databaseUrl && db.cloud.schema\n ? await sync(db, db.cloud.options, db.cloud.schema, {justCheckIfNeeded: true})\n : false;\n}\n","import { IS_SERVICE_WORKER } from '../helpers/IS_SERVICE_WORKER';\nimport { performGuardedJob } from './performGuardedJob';\nimport { DexieCloudDB } from '../db/DexieCloudDB';\nimport { sync, CURRENT_SYNC_WORKER, SyncOptions } from './sync';\nimport { DexieCloudOptions } from '../DexieCloudOptions';\nimport { assert, DexieCloudSchema } from 'dexie-cloud-common';\nimport { checkSyncRateLimitDelay } from './ratelimit';\n\nconst ongoingSyncs = new WeakMap<\n DexieCloudDB,\n { promise: Promise<void>; pull: boolean }\n>();\n\nexport function syncIfPossible(\n db: DexieCloudDB,\n cloudOptions: DexieCloudOptions,\n cloudSchema: DexieCloudSchema,\n options?: SyncOptions\n) {\n const ongoing = ongoingSyncs.get(db);\n if (ongoing) {\n if (ongoing.pull || options?.purpose === 'push') {\n console.debug('syncIfPossible(): returning the ongoing sync promise.');\n return ongoing.promise;\n } else {\n // Ongoing sync may never do anything in case there are no outstanding changes\n // to sync (because its purpose was \"push\" not \"pull\")\n // Now, however, we are asked to do a sync with the purpose of \"pull\"\n // We want to optimize here. We must wait for the ongoing to complete\n // and then, if the ongoing sync never resulted in a sync request,\n // we must redo the sync.\n\n // To inspect what is happening in the ongoing request, let's subscribe\n // to db.cloud.syncState and look for if it is doing any \"pulling\" phase:\n let hasPullTakenPlace = false;\n const subscription = db.cloud.syncState.subscribe((syncState) => {\n if (syncState.phase === 'pulling') {\n hasPullTakenPlace = true;\n }\n });\n // Ok, so now we are watching. At the same time, wait for the ongoing to complete\n // and when it has completed, check if we're all set or if we need to redo\n // the call:\n return (\n ongoing.promise\n // This is a finally block but we are still running tests on\n // browsers that don't support it, so need to do it like this:\n .then(() => {\n subscription.unsubscribe();\n })\n .catch((error) => {\n subscription.unsubscribe();\n return Promise.reject(error);\n })\n .then(() => {\n if (!hasPullTakenPlace) {\n // No pull took place in the ongoing sync but the caller had \"pull\" as\n // an explicit purpose of this call - so we need to redo the call!\n return syncIfPossible(db, cloudOptions, cloudSchema, options);\n }\n })\n );\n }\n }\n\n const promise = _syncIfPossible();\n ongoingSyncs.set(db, { promise, pull: options?.purpose !== 'push' });\n return promise;\n\n async function _syncIfPossible() {\n try {\n // Check if should delay sync due to ratelimit:\n await checkSyncRateLimitDelay(db); \n await performGuardedJob(db, CURRENT_SYNC_WORKER, () =>\n sync(db, cloudOptions, cloudSchema, options)\n );\n ongoingSyncs.delete(db);\n console.debug('Done sync');\n } catch (error) {\n ongoingSyncs.delete(db);\n console.error(`Failed to sync client changes`, error);\n throw error; // Make sure we rethrow error so that sync event is retried.\n // I don't think we should setTimout or so here.\n // Unless server tells us to in some response.\n // Then we could follow that advice but not by waiting here but by registering\n // Something that triggers an event listened to in startPushWorker()\n }\n }\n}\n","export const SECONDS = 1000;\nexport const MINUTES = 60 * SECONDS;\nexport const HOURS = 60 * MINUTES;\nexport const DAYS = 24 * HOURS;\nexport const WEEKS = 7 * DAYS;\n","import { Subscription } from 'rxjs';\nimport { syncIfPossible } from './syncIfPossible';\nimport { DexieCloudDB } from '../db/DexieCloudDB';\nimport { SECONDS } from '../helpers/date-constants';\nimport { DexieCloudOptions } from '../DexieCloudOptions';\nimport { DexieCloudSchema } from 'dexie-cloud-common';\n\nexport function LocalSyncWorker(\n db: DexieCloudDB,\n cloudOptions: DexieCloudOptions,\n cloudSchema: DexieCloudSchema\n) {\n let localSyncEventSubscription: Subscription | null = null;\n let cancelToken = { cancelled: false };\n let nextRetryTime = 0;\n let syncStartTime = 0;\n\n function syncAndRetry(retryNum = 1) {\n // Use setTimeout() to get onto a clean stack and\n // break free from possible active transaction:\n setTimeout(() => {\n const purpose = pullSignalled ? 'pull' : 'push';\n syncStartTime = Date.now();\n syncIfPossible(db, cloudOptions, cloudSchema, {\n cancelToken,\n retryImmediatelyOnFetchError: true, // workaround for \"net::ERR_NETWORK_CHANGED\" in chrome.\n purpose,\n }).then(()=>{\n if (cancelToken.cancelled) {\n stop();\n } else {\n if (pullSignalled || pushSignalled) {\n // If we have signalled for more sync, do it now.\n pullSignalled = false;\n pushSignalled = false;\n return syncAndRetry();\n }\n }\n ongoingSync = false;\n nextRetryTime = 0;\n syncStartTime = 0;\n }).catch((error: unknown) => {\n console.error('error in syncIfPossible()', error);\n if (cancelToken.cancelled) {\n stop();\n ongoingSync = false;\n nextRetryTime = 0;\n syncStartTime = 0;\n } else if (retryNum < 5) {\n // Mimic service worker sync event but a bit more eager: retry 4 times\n // * first retry after 20 seconds\n // * second retry 40 seconds later\n // * third retry 5 minutes later\n // * last retry 15 minutes later\n const retryIn = [0, 20, 40, 300, 900][retryNum] * SECONDS\n nextRetryTime = Date.now() + retryIn;\n syncStartTime = 0;\n setTimeout(\n () => syncAndRetry(retryNum + 1),\n retryIn\n );\n } else {\n ongoingSync = false;\n nextRetryTime = 0;\n syncStartTime = 0;\n }\n });\n }, 0);\n }\n\n let pullSignalled = false;\n let pushSignalled = false;\n let ongoingSync = false;\n const consumer = (purpose: 'pull' | 'push') =>{\n if (cancelToken.cancelled) return;\n if (purpose === 'pull') {\n pullSignalled = true;\n }\n if (purpose === 'push') {\n pushSignalled = true;\n }\n if (ongoingSync) {\n if (nextRetryTime) {\n console.debug(`Sync is paused until ${new Date(nextRetryTime).toISOString()} due to error in last sync attempt`);\n } else if (syncStartTime > 0 && Date.now() - syncStartTime > 20 * SECONDS) {\n console.debug(`An existing sync operation is taking more than 20 seconds. Will resync when done.`)\n }\n return;\n }\n ongoingSync = true;\n syncAndRetry();\n };\n\n const start = () => {\n // Sync eagerly whenever a change has happened (+ initially when there's no syncState yet)\n // This initial subscribe will also trigger an sync also now.\n console.debug('Starting LocalSyncWorker', db.localSyncEvent['id']);\n localSyncEventSubscription = db.localSyncEvent.subscribe(({ purpose }) => {\n consumer(purpose || 'pull');\n });\n };\n\n const stop = () => {\n console.debug('Stopping LocalSyncWorker');\n cancelToken.cancelled = true;\n if (localSyncEventSubscription) localSyncEventSubscription.unsubscribe();\n };\n\n return {\n start,\n stop,\n };\n}\n","import { DexieCloudSchema } from \"dexie-cloud-common\";\nimport { DexieCloudOptions } from \"./DexieCloudOptions\";\n\nexport function updateSchemaFromOptions(schema?: DexieCloudSchema | null, options?: DexieCloudOptions | null) {\n if (schema && options) {\n if (options.unsyncedTables) {\n for (const tableName of options.unsyncedTables) {\n if (schema[tableName]) {\n schema[tableName].markedForSync = false;\n }\n }\n }\n }\n}","var n,l,u,i,t,o,r,f={},e=[],c=/acit|ex(?:s|g|n|p|$)|rph|grid|ows|mnc|ntw|ine[ch]|zoo|^ord|itera/i;function s(n,l){for(var u in l)n[u]=l[u];return n}function a(n){var l=n.parentNode;l&&l.removeChild(n)}function h(l,u,i){var t,o,r,f={};for(r in u)\"key\"==r?t=u[r]:\"ref\"==r?o=u[r]:f[r]=u[r];if(arguments.length>2&&(f.children=arguments.length>3?n.call(arguments,2):i),\"function\"==typeof l&&null!=l.defaultProps)for(r in l.defaultProps)void 0===f[r]&&(f[r]=l.defaultProps[r]);return v(l,f,t,o,null)}function v(n,i,t,o,r){var f={type:n,props:i,key:t,ref:o,__k:null,__:null,__b:0,__e:null,__d:void 0,__c:null,__h:null,constructor:void 0,__v:null==r?++u:r};return null==r&&null!=l.vnode&&l.vnode(f),f}function y(){return{current:null}}function p(n){return n.children}function d(n,l){this.props=n,this.context=l}function _(n,l){if(null==l)return n.__?_(n.__,n.__.__k.indexOf(n)+1):null;for(var u;l<n.__k.length;l++)if(null!=(u=n.__k[l])&&null!=u.__e)return u.__e;return\"function\"==typeof n.type?_(n):null}function k(n){var l,u;if(null!=(n=n.__)&&null!=n.__c){for(n.__e=n.__c.base=null,l=0;l<n.__k.length;l++)if(null!=(u=n.__k[l])&&null!=u.__e){n.__e=n.__c.base=u.__e;break}return k(n)}}function b(n){(!n.__d&&(n.__d=!0)&&t.push(n)&&!g.__r++||o!==l.debounceRendering)&&((o=l.debounceRendering)||setTimeout)(g)}function g(){for(var n;g.__r=t.length;)n=t.sort(function(n,l){return n.__v.__b-l.__v.__b}),t=[],n.some(function(n){var l,u,i,t,o,r;n.__d&&(o=(t=(l=n).__v).__e,(r=l.__P)&&(u=[],(i=s({},t)).__v=t.__v+1,j(r,t,i,l.__n,void 0!==r.ownerSVGElement,null!=t.__h?[o]:null,u,null==o?_(t):o,t.__h),z(u,t),t.__e!=o&&k(t)))})}function w(n,l,u,i,t,o,r,c,s,a){var h,y,d,k,b,g,w,x=i&&i.__k||e,C=x.length;for(u.__k=[],h=0;h<l.length;h++)if(null!=(k=u.__k[h]=null==(k=l[h])||\"boolean\"==typeof k?null:\"string\"==typeof k||\"number\"==typeof k||\"bigint\"==typeof k?v(null,k,null,null,k):Array.isArray(k)?v(p,{children:k},null,null,null):k.__b>0?v(k.type,k.props,k.key,null,k.__v):k)){if(k.__=u,k.__b=u.__b+1,null===(d=x[h])||d&&k.key==d.key&&k.type===d.type)x[h]=void 0;else for(y=0;y<C;y++){if((d=x[y])&&k.key==d.key&&k.type===d.type){x[y]=void 0;break}d=null}j(n,k,d=d||f,t,o,r,c,s,a),b=k.__e,(y=k.ref)&&d.ref!=y&&(w||(w=[]),d.ref&&w.push(d.ref,null,k),w.push(y,k.__c||b,k)),null!=b?(null==g&&(g=b),\"function\"==typeof k.type&&k.__k===d.__k?k.__d=s=m(k,s,n):s=A(n,k,d,x,b,s),\"function\"==typeof u.type&&(u.__d=s)):s&&d.__e==s&&s.parentNode!=n&&(s=_(d))}for(u.__e=g,h=C;h--;)null!=x[h]&&(\"function\"==typeof u.type&&null!=x[h].__e&&x[h].__e==u.__d&&(u.__d=_(i,h+1)),N(x[h],x[h]));if(w)for(h=0;h<w.length;h++)M(w[h],w[++h],w[++h])}function m(n,l,u){for(var i,t=n.__k,o=0;t&&o<t.length;o++)(i=t[o])&&(i.__=n,l=\"function\"==typeof i.type?m(i,l,u):A(u,i,i,t,i.__e,l));return l}function x(n,l){return l=l||[],null==n||\"boolean\"==typeof n||(Array.isArray(n)?n.some(function(n){x(n,l)}):l.push(n)),l}function A(n,l,u,i,t,o){var r,f,e;if(void 0!==l.__d)r=l.__d,l.__d=void 0;else if(null==u||t!=o||null==t.parentNode)n:if(null==o||o.parentNode!==n)n.appendChild(t),r=null;else{for(f=o,e=0;(f=f.nextSibling)&&e<i.length;e+=2)if(f==t)break n;n.insertBefore(t,o),r=o}return void 0!==r?r:t.nextSibling}function C(n,l,u,i,t){var o;for(o in u)\"children\"===o||\"key\"===o||o in l||H(n,o,null,u[o],i);for(o in l)t&&\"function\"!=typeof l[o]||\"children\"===o||\"key\"===o||\"value\"===o||\"checked\"===o||u[o]===l[o]||H(n,o,l[o],u[o],i)}function $(n,l,u){\"-\"===l[0]?n.setProperty(l,u):n[l]=null==u?\"\":\"number\"!=typeof u||c.test(l)?u:u+\"px\"}function H(n,l,u,i,t){var o;n:if(\"style\"===l)if(\"string\"==typeof u)n.style.cssText=u;else{if(\"string\"==typeof i&&(n.style.cssText=i=\"\"),i)for(l in i)u&&l in u||$(n.style,l,\"\");if(u)for(l in u)i&&u[l]===i[l]||$(n.style,l,u[l])}else if(\"o\"===l[0]&&\"n\"===l[1])o=l!==(l=l.replace(/Capture$/,\"\")),l=l.toLowerCase()in n?l.toLowerCase().slice(2):l.slice(2),n.l||(n.l={}),n.l[l+o]=u,u?i||n.addEventListener(l,o?T:I,o):n.removeEventListener(l,o?T:I,o);else if(\"dangerouslySetInnerHTML\"!==l){if(t)l=l.replace(/xlink(H|:h)/,\"h\").replace(/sName$/,\"s\");else if(\"href\"!==l&&\"list\"!==l&&\"form\"!==l&&\"tabIndex\"!==l&&\"download\"!==l&&l in n)try{n[l]=null==u?\"\":u;break n}catch(n){}\"function\"==typeof u||(null!=u&&(!1!==u||\"a\"===l[0]&&\"r\"===l[1])?n.setAttribute(l,u):n.removeAttribute(l))}}function I(n){this.l[n.type+!1](l.event?l.event(n):n)}function T(n){this.l[n.type+!0](l.event?l.event(n):n)}function j(n,u,i,t,o,r,f,e,c){var a,h,v,y,_,k,b,g,m,x,A,C,$,H=u.type;if(void 0!==u.constructor)return null;null!=i.__h&&(c=i.__h,e=u.__e=i.__e,u.__h=null,r=[e]),(a=l.__b)&&a(u);try{n:if(\"function\"==typeof H){if(g=u.props,m=(a=H.contextType)&&t[a.__c],x=a?m?m.props.value:a.__:t,i.__c?b=(h=u.__c=i.__c).__=h.__E:(\"prototype\"in H&&H.prototype.render?u.__c=h=new H(g,x):(u.__c=h=new d(g,x),h.constructor=H,h.render=O),m&&m.sub(h),h.props=g,h.state||(h.state={}),h.context=x,h.__n=t,v=h.__d=!0,h.__h=[]),null==h.__s&&(h.__s=h.state),null!=H.getDerivedStateFromProps&&(h.__s==h.state&&(h.__s=s({},h.__s)),s(h.__s,H.getDerivedStateFromProps(g,h.__s))),y=h.props,_=h.state,v)null==H.getDerivedStateFromProps&&null!=h.componentWillMount&&h.componentWillMount(),null!=h.componentDidMount&&h.__h.push(h.componentDidMount);else{if(null==H.getDerivedStateFromProps&&g!==y&&null!=h.componentWillReceiveProps&&h.componentWillReceiveProps(g,x),!h.__e&&null!=h.shouldComponentUpdate&&!1===h.shouldComponentUpdate(g,h.__s,x)||u.__v===i.__v){h.props=g,h.state=h.__s,u.__v!==i.__v&&(h.__d=!1),h.__v=u,u.__e=i.__e,u.__k=i.__k,u.__k.forEach(function(n){n&&(n.__=u)}),h.__h.length&&f.push(h);break n}null!=h.componentWillUpdate&&h.componentWillUpdate(g,h.__s,x),null!=h.componentDidUpdate&&h.__h.push(function(){h.componentDidUpdate(y,_,k)})}if(h.context=x,h.props=g,h.__v=u,h.__P=n,A=l.__r,C=0,\"prototype\"in H&&H.prototype.render)h.state=h.__s,h.__d=!1,A&&A(u),a=h.render(h.props,h.state,h.context);else do{h.__d=!1,A&&A(u),a=h.render(h.props,h.state,h.context),h.state=h.__s}while(h.__d&&++C<25);h.state=h.__s,null!=h.getChildContext&&(t=s(s({},t),h.getChildContext())),v||null==h.getSnapshotBeforeUpdate||(k=h.getSnapshotBeforeUpdate(y,_)),$=null!=a&&a.type===p&&null==a.key?a.props.children:a,w(n,Array.isArray($)?$:[$],u,i,t,o,r,f,e,c),h.base=u.__e,u.__h=null,h.__h.length&&f.push(h),b&&(h.__E=h.__=null),h.__e=!1}else null==r&&u.__v===i.__v?(u.__k=i.__k,u.__e=i.__e):u.__e=L(i.__e,u,i,t,o,r,f,c);(a=l.diffed)&&a(u)}catch(n){u.__v=null,(c||null!=r)&&(u.__e=e,u.__h=!!c,r[r.indexOf(e)]=null),l.__e(n,u,i)}}function z(n,u){l.__c&&l.__c(u,n),n.some(function(u){try{n=u.__h,u.__h=[],n.some(function(n){n.call(u)})}catch(n){l.__e(n,u.__v)}})}function L(l,u,i,t,o,r,e,c){var s,h,v,y=i.props,p=u.props,d=u.type,k=0;if(\"svg\"===d&&(o=!0),null!=r)for(;k<r.length;k++)if((s=r[k])&&\"setAttribute\"in s==!!d&&(d?s.localName===d:3===s.nodeType)){l=s,r[k]=null;break}if(null==l){if(null===d)return document.createTextNode(p);l=o?document.createElementNS(\"http://www.w3.org/2000/svg\",d):document.createElement(d,p.is&&p),r=null,c=!1}if(null===d)y===p||c&&l.data===p||(l.data=p);else{if(r=r&&n.call(l.childNodes),h=(y=i.props||f).dangerouslySetInnerHTML,v=p.dangerouslySetInnerHTML,!c){if(null!=r)for(y={},k=0;k<l.attributes.length;k++)y[l.attributes[k].name]=l.attributes[k].value;(v||h)&&(v&&(h&&v.__html==h.__html||v.__html===l.innerHTML)||(l.innerHTML=v&&v.__html||\"\"))}if(C(l,p,y,o,c),v)u.__k=[];else if(k=u.props.children,w(l,Array.isArray(k)?k:[k],u,i,t,o&&\"foreignObject\"!==d,r,e,r?r[0]:i.__k&&_(i,0),c),null!=r)for(k=r.length;k--;)null!=r[k]&&a(r[k]);c||(\"value\"in p&&void 0!==(k=p.value)&&(k!==l.value||\"progress\"===d&&!k||\"option\"===d&&k!==y.value)&&H(l,\"value\",k,y.value,!1),\"checked\"in p&&void 0!==(k=p.checked)&&k!==l.checked&&H(l,\"checked\",k,y.checked,!1))}return l}function M(n,u,i){try{\"function\"==typeof n?n(u):n.current=u}catch(n){l.__e(n,i)}}function N(n,u,i){var t,o;if(l.unmount&&l.unmount(n),(t=n.ref)&&(t.current&&t.current!==n.__e||M(t,null,u)),null!=(t=n.__c)){if(t.componentWillUnmount)try{t.componentWillUnmount()}catch(n){l.__e(n,u)}t.base=t.__P=null}if(t=n.__k)for(o=0;o<t.length;o++)t[o]&&N(t[o],u,\"function\"!=typeof n.type);i||null==n.__e||a(n.__e),n.__e=n.__d=void 0}function O(n,l,u){return this.constructor(n,u)}function P(u,i,t){var o,r,e;l.__&&l.__(u,i),r=(o=\"function\"==typeof t)?null:t&&t.__k||i.__k,e=[],j(i,u=(!o&&t||i).__k=h(p,null,[u]),r||f,f,void 0!==i.ownerSVGElement,!o&&t?[t]:r?null:i.firstChild?n.call(i.childNodes):null,e,!o&&t?t:r?r.__e:i.firstChild,o),z(e,u)}function S(n,l){P(n,l,S)}function q(l,u,i){var t,o,r,f=s({},l.props);for(r in u)\"key\"==r?t=u[r]:\"ref\"==r?o=u[r]:f[r]=u[r];return arguments.length>2&&(f.children=arguments.length>3?n.call(arguments,2):i),v(l.type,f,t||l.key,o||l.ref,null)}function B(n,l){var u={__c:l=\"__cC\"+r++,__:n,Consumer:function(n,l){return n.children(l)},Provider:function(n){var u,i;return this.getChildContext||(u=[],(i={})[l]=this,this.getChildContext=function(){return i},this.shouldComponentUpdate=function(n){this.props.value!==n.value&&u.some(b)},this.sub=function(n){u.push(n);var l=n.componentWillUnmount;n.componentWillUnmount=function(){u.splice(u.indexOf(n),1),l&&l.call(n)}}),n.children}};return u.Provider.__=u.Consumer.contextType=u}n=e.slice,l={__e:function(n,l,u,i){for(var t,o,r;l=l.__;)if((t=l.__c)&&!t.__)try{if((o=t.constructor)&&null!=o.getDerivedStateFromError&&(t.setState(o.getDerivedStateFromError(n)),r=t.__d),null!=t.componentDidCatch&&(t.componentDidCatch(n,i||{}),r=t.__d),r)return t.__E=t}catch(l){n=l}throw n}},u=0,i=function(n){return null!=n&&void 0===n.constructor},d.prototype.setState=function(n,l){var u;u=null!=this.__s&&this.__s!==this.state?this.__s:this.__s=s({},this.state),\"function\"==typeof n&&(n=n(s({},u),this.props)),n&&s(u,n),null!=n&&this.__v&&(l&&this.__h.push(l),b(this))},d.prototype.forceUpdate=function(n){this.__v&&(this.__e=!0,n&&this.__h.push(n),b(this))},d.prototype.render=p,t=[],g.__r=0,r=0;export{P as render,S as hydrate,h as createElement,h,p as Fragment,y as createRef,i as isValidElement,d as Component,q as cloneElement,B as createContext,x as toChildArray,l as options};\n//# sourceMappingURL=preact.module.js.map\n","export const Styles: { [styleAlias: string]: Partial<CSSStyleDeclaration> | any} = {\n Error: {\n color: \"red\",\n },\n Alert: {\n error: {\n color: \"red\",\n fontWeight: \"bold\"\n },\n warning: {\n color: \"#f80\",\n fontWeight: \"bold\"\n },\n info: {\n color: \"black\"\n }\n },\n Darken: {\n position: \"fixed\",\n top: 0,\n left: 0,\n opacity: 0.5,\n backgroundColor: \"#000\",\n width: \"100vw\",\n height: \"100vh\",\n zIndex: 150,\n webkitBackdropFilter: \"blur(2px)\",\n backdropFilter: \"blur(2px)\",\n },\n DialogOuter: {\n position: \"fixed\",\n top: 0,\n left: 0,\n width: \"100vw\",\n height: \"100vh\",\n zIndex: 150,\n alignItems: \"center\",\n display: \"flex\",\n justifyContent: \"center\",\n },\n DialogInner: {\n position: \"relative\",\n color: \"#222\",\n backgroundColor: \"#fff\",\n padding: \"30px\",\n marginBottom: \"2em\",\n maxWidth: \"90%\",\n maxHeight: \"90%\",\n overflowY: \"auto\",\n border: \"3px solid #3d3d5d\",\n borderRadius: \"8px\",\n boxShadow: \"0 0 80px 10px #666\",\n width: \"auto\",\n fontFamily: \"sans-serif\",\n },\n Input: {\n height: \"35px\",\n width: \"17em\",\n borderColor: \"#ccf4\",\n outline: \"none\",\n fontSize: \"17pt\",\n padding: \"8px\"\n \n }\n};\n","import { Styles } from './Styles';\nimport { ComponentChildren, h } from 'preact';\n\nexport function Dialog({ children, className }: { children?: ComponentChildren, className?: string }) {\n return (\n <div className={className}>\n <div style={Styles.Darken} />\n <div style={Styles.DialogOuter}>\n <div style={Styles.DialogInner}>{children}</div>\n </div>\n </div>\n );\n}\n","import{options as n}from\"preact\";var t,r,u,i,o=0,c=[],f=[],e=n.__b,a=n.__r,v=n.diffed,l=n.__c,m=n.unmount;function d(t,u){n.__h&&n.__h(r,t,o||u),o=0;var i=r.__H||(r.__H={__:[],__h:[]});return t>=i.__.length&&i.__.push({__V:f}),i.__[t]}function p(n){return o=1,y(z,n)}function y(n,u,i){var o=d(t++,2);if(o.t=n,!o.__c&&(o.__=[i?i(u):z(void 0,u),function(n){var t=o.__N?o.__N[0]:o.__[0],r=o.t(t,n);t!==r&&(o.__N=[r,o.__[1]],o.__c.setState({}))}],o.__c=r,!r.u)){r.u=!0;var c=r.shouldComponentUpdate;r.shouldComponentUpdate=function(n,t,r){if(!o.__c.__H)return!0;var u=o.__c.__H.__.filter(function(n){return n.__c});if(u.every(function(n){return!n.__N}))return!c||c.call(this,n,t,r);var i=!1;return u.forEach(function(n){if(n.__N){var t=n.__[0];n.__=n.__N,n.__N=void 0,t!==n.__[0]&&(i=!0)}}),!!i&&(!c||c.call(this,n,t,r))}}return o.__N||o.__}function h(u,i){var o=d(t++,3);!n.__s&&w(o.__H,i)&&(o.__=u,o.i=i,r.__H.__h.push(o))}function s(u,i){var o=d(t++,4);!n.__s&&w(o.__H,i)&&(o.__=u,o.i=i,r.__h.push(o))}function _(n){return o=5,F(function(){return{current:n}},[])}function A(n,t,r){o=6,s(function(){return\"function\"==typeof n?(n(t()),function(){return n(null)}):n?(n.current=t(),function(){return n.current=null}):void 0},null==r?r:r.concat(n))}function F(n,r){var u=d(t++,7);return w(u.__H,r)?(u.__V=n(),u.i=r,u.__h=n,u.__V):u.__}function T(n,t){return o=8,F(function(){return n},t)}function q(n){var u=r.context[n.__c],i=d(t++,9);return i.c=n,u?(null==i.__&&(i.__=!0,u.sub(r)),u.props.value):n.__}function x(t,r){n.useDebugValue&&n.useDebugValue(r?r(t):t)}function V(n){var u=d(t++,10),i=p();return u.__=n,r.componentDidCatch||(r.componentDidCatch=function(n){u.__&&u.__(n),i[1](n)}),[i[0],function(){i[1](void 0)}]}function b(){for(var t;t=c.shift();)if(t.__P&&t.__H)try{t.__H.__h.forEach(j),t.__H.__h.forEach(k),t.__H.__h=[]}catch(r){t.__H.__h=[],n.__e(r,t.__v)}}n.__b=function(n){r=null,e&&e(n)},n.__r=function(n){a&&a(n),t=0;var i=(r=n.__c).__H;i&&(u===r?(i.__h=[],r.__h=[],i.__.forEach(function(n){n.__N&&(n.__=n.__N),n.__V=f,n.__N=n.i=void 0})):(i.__h.forEach(j),i.__h.forEach(k),i.__h=[])),u=r},n.diffed=function(t){v&&v(t);var o=t.__c;o&&o.__H&&(o.__H.__h.length&&(1!==c.push(o)&&i===n.requestAnimationFrame||((i=n.requestAnimationFrame)||function(n){var t,r=function(){clearTimeout(u),g&&cancelAnimationFrame(t),setTimeout(n)},u=setTimeout(r,100);g&&(t=requestAnimationFrame(r))})(b)),o.__H.__.forEach(function(n){n.i&&(n.__H=n.i),n.__V!==f&&(n.__=n.__V),n.i=void 0,n.__V=f})),u=r=null},n.__c=function(t,r){r.some(function(t){try{t.__h.forEach(j),t.__h=t.__h.filter(function(n){return!n.__||k(n)})}catch(u){r.some(function(n){n.__h&&(n.__h=[])}),r=[],n.__e(u,t.__v)}}),l&&l(t,r)},n.unmount=function(t){m&&m(t);var r,u=t.__c;u&&u.__H&&(u.__H.__.forEach(function(n){try{j(n)}catch(n){r=n}}),r&&n.__e(r,u.__v))};var g=\"function\"==typeof requestAnimationFrame;function j(n){var t=r,u=n.__c;\"function\"==typeof u&&(n.__c=void 0,u()),r=t}function k(n){var t=r;n.__c=n.__(),r=t}function w(n,t){return!n||n.length!==t.length||t.some(function(t,r){return t!==n[r]})}function z(n,t){return\"function\"==typeof t?t(n):t}export{p as useState,y as useReducer,h as useEffect,s as useLayoutEffect,_ as useRef,A as useImperativeHandle,F as useMemo,T as useCallback,q as useContext,x as useDebugValue,V as useErrorBoundary};\n//# sourceMappingURL=hooks.module.js.map\n","import { Dialog } from './Dialog';\nimport { Styles } from './Styles';\nimport { h, Fragment } from 'preact';\nimport { useLayoutEffect, useRef, useState } from 'preact/hooks';\nimport { DXCUserInteraction } from '../types/DXCUserInteraction';\nimport { resolveText } from '../helpers/resolveText';\nimport { DXCInputField } from '../types/DXCInputField';\n\nconst OTP_LENGTH = 8;\n\nexport function LoginDialog({\n title,\n type,\n alerts,\n fields,\n submitLabel,\n cancelLabel,\n onCancel,\n onSubmit,\n}: DXCUserInteraction) {\n const [params, setParams] = useState<{ [param: string]: string }>({});\n\n const firstFieldRef = useRef<HTMLInputElement>(null);\n useLayoutEffect(() => firstFieldRef.current?.focus(), []);\n\n return (\n <Dialog className=\"dxc-login-dlg\">\n <>\n <h3 style={Styles.WindowHeader}>{title}</h3>\n {alerts.map((alert) => (\n <p style={Styles.Alert[alert.type]}>{resolveText(alert)}</p>\n ))}\n <form\n onSubmit={(ev) => {\n ev.preventDefault();\n onSubmit(params);\n }}\n >\n {(Object.entries(fields) as [string, DXCInputField][]).map(\n ([fieldName, { type, label, placeholder }], idx) => (\n <label style={Styles.Label} key={idx}>\n {label ? `${label}: ` : ''}\n <input\n ref={idx === 0 ? firstFieldRef : undefined}\n type={type}\n name={fieldName}\n autoComplete=\"on\"\n style={Styles.Input}\n autoFocus\n placeholder={placeholder}\n value={params[fieldName] || ''}\n onInput={(ev) => {\n const value = valueTransformer(type, ev.target?.['value']);\n let updatedParams = {\n ...params,\n [fieldName]: value,\n };\n setParams(updatedParams);\n if (type === 'otp' && value?.trim().length === OTP_LENGTH) {\n // Auto-submit when OTP is filled in.\n onSubmit(updatedParams);\n }\n }}\n />\n </label>\n )\n )}\n </form>\n </>\n <div style={Styles.ButtonsDiv}>\n <>\n <button\n type=\"submit\"\n style={Styles.Button}\n onClick={() => onSubmit(params)}\n >\n {submitLabel}\n </button>\n {cancelLabel && (\n <button style={Styles.Button} onClick={onCancel}>\n {cancelLabel}\n </button>\n )}\n </>\n </div>\n </Dialog>\n );\n}\n\nfunction valueTransformer(type: string, value: string) {\n switch (type) {\n case 'email':\n return value.toLowerCase();\n case 'otp':\n return value.toUpperCase();\n default:\n return value;\n }\n}\n","import { DXCAlert } from \"../types/DXCAlert\";\n\n/** Resolve a message template with parameters.\n * \n * Example:\n * resolveText({\n * message: \"Hello {name}!\",\n * messageCode: \"HELLO\",\n * messageParams: {name: \"David\"}\n * }) => \"Hello David!\"\n * \n * @param message Template message with {vars} in it.\n * @param messageCode Unique code for the message. Can be used for translation.\n * @param messageParams Parameters to be used in the message.\n * @returns A final message where parameters have been replaced with values.\n */\nexport function resolveText({message, messageCode, messageParams}: DXCAlert) {\n return message.replace(/\\{\\w+\\}/ig, n => messageParams[n.substring(1, n.length-1)]);\n}\n","import Dexie from \"dexie\";\nimport \"../extend-dexie-interface\";\nimport { h, Component } from \"preact\";\nimport { from, Subscription } from \"rxjs\";\nimport { LoginDialog } from './LoginDialog';\nimport { DXCUserInteraction } from \"../types/DXCUserInteraction\";\nimport * as preact from \"preact\";\n\nexport interface Props {\n db: Dexie;\n}\n\ninterface State {\n userInteraction: DXCUserInteraction | undefined;\n}\n\nexport default class LoginGui extends Component<Props, State> {\n subscription?: Subscription;\n observer = (userInteraction: DXCUserInteraction | undefined) => this.setState({userInteraction});\n\n constructor(props: Props) {\n super(props);\n this.state = { userInteraction: undefined };\n }\n\n componentDidMount() {\n this.subscription = from(this.props.db.cloud.userInteraction).subscribe(this.observer);\n }\n\n componentWillUnmount() {\n if (this.subscription) {\n this.subscription.unsubscribe();\n delete this.subscription;\n }\n }\n\n render(props: Props, {userInteraction}: State) {\n if (!userInteraction) return null;\n //if (props.db.cloud.userInteraction.observers.length > 1) return null; // Someone else subscribes.\n return <LoginDialog {...userInteraction} />;\n }\n}\n\nexport function setupDefaultGUI(db: Dexie) {\n let closed = false;\n\n const el = document.createElement('div');\n if (document.body) {\n document.body.appendChild(el);\n preact.render(<LoginGui db={db.vip} />, el);\n } else {\n addEventListener('DOMContentLoaded', ()=>{\n if (!closed) {\n document.body.appendChild(el);\n preact.render(<LoginGui db={db.vip} />, el);\n }\n });\n }\n\n return {\n unsubscribe() {\n try { el.remove(); } catch {}\n closed = true;\n },\n get closed() {\n return closed;\n }\n }\n}\n","export function associate<T extends object,M>(factory: (x: T)=>M): (x: T) => M {\n const wm = new WeakMap<T, M>();\n return (x: T) => {\n let rv = wm.get(x);\n if (!rv) {\n rv = factory(x);\n wm.set(x, rv);\n }\n return rv;\n }\n}\n","import Dexie from \"dexie\";\nimport { BehaviorSubject } from \"rxjs\";\nimport { associate } from \"./associate\";\nimport { UNAUTHORIZED_USER } from \"./authentication/UNAUTHORIZED_USER\";\n\nexport const getCurrentUserEmitter = associate((db: Dexie) => new BehaviorSubject(UNAUTHORIZED_USER));\n","import {\n concat,\n from,\n InteropObservable,\n map,\n Observable,\n ObservableInput,\n share,\n timer,\n} from 'rxjs';\nimport { ObservableWithCurrentValue } from './mapValueObservable';\n\nexport function createSharedValueObservable<T>(\n o: ObservableInput<T>,\n defaultValue: T\n): ObservableWithCurrentValue<T> {\n let currentValue = defaultValue;\n let shared = from(o).pipe(\n map((x) => (currentValue = x)),\n share({ resetOnRefCountZero: () => timer(1000) })\n ) as ObservableWithCurrentValue<T>;\n\n const rv = new Observable((observer) => {\n let didEmit = false;\n const subscription = shared.subscribe({\n next(value) {\n didEmit = true;\n observer.next(value);\n },\n error(error) {\n observer.error(error);\n },\n complete() {\n observer.complete();\n }\n });\n if (!didEmit && !subscription.closed) {\n observer.next(currentValue);\n }\n return subscription;\n }) as ObservableWithCurrentValue<T>;\n\n rv.getValue = () => currentValue;\n return rv;\n}\n","import Dexie, { liveQuery } from 'dexie';\nimport { DBRealmRole } from 'dexie-cloud-common';\nimport { associate } from './associate';\nimport { createSharedValueObservable } from './createSharedValueObservable';\n\nexport const getGlobalRolesObservable = associate((db: Dexie) => {\n return createSharedValueObservable(\n liveQuery(() =>\n db.roles\n .where({ realmId: 'rlm-public' })\n .toArray()\n .then((roles) => {\n const rv: { [roleName: string]: DBRealmRole } = {};\n for (const role of roles\n .slice()\n .sort((a, b) => (a.sortOrder || 0) - (b.sortOrder || 0))) {\n rv[role.name] = role;\n }\n return rv;\n })\n ),\n {}\n );\n});\n","import Dexie, { liveQuery } from 'dexie';\nimport { DBRealm, DBRealmMember } from 'dexie-cloud-common';\nimport { concat, Observable, timer } from 'rxjs';\nimport { share, switchMap } from 'rxjs/operators';\nimport { associate } from './associate';\nimport { createSharedValueObservable } from './createSharedValueObservable';\nimport { getCurrentUserEmitter } from './currentUserEmitter';\n\nexport type InternalAccessControlData = {\n readonly selfMembers: DBRealmMember[];\n readonly realms: DBRealm[];\n readonly userId: string;\n};\n\nexport const getInternalAccessControlObservable = associate((db: Dexie) => {\n return createSharedValueObservable(\n getCurrentUserEmitter(db._novip).pipe(\n switchMap((currentUser) =>\n liveQuery(() =>\n db.transaction('r', 'realms', 'members', () =>\n Promise.all([\n db.members.where({ userId: currentUser.userId }).toArray(),\n db.realms.toArray(),\n currentUser.userId!,\n ] as const).then(([selfMembers, realms, userId]) => {\n //console.debug(`PERMS: Result from liveQUery():`, JSON.stringify({selfMembers, realms, userId}, null, 2))\n return { selfMembers, realms, userId };\n })\n )\n )\n )\n ), {\n selfMembers: [],\n realms: [],\n get userId() {\n return db.cloud.currentUserId;\n },\n }\n );\n /* let refCount = 0;\n return new Observable(observer => {\n const subscription = o.subscribe(observer);\n console.debug ('PERMS subscribe', ++refCount);\n return {\n unsubscribe() {\n console.debug ('PERMS unsubscribe', --refCount);\n subscription.unsubscribe();\n }\n }\n })*/\n});\n","// TODO: Move to dexie-cloud-common\n\nimport { DBPermissionSet } from 'dexie-cloud-common';\n\nexport function mergePermissions(\n ...permissions: DBPermissionSet[]\n): DBPermissionSet {\n if (permissions.length === 0) return {};\n const reduced = permissions.reduce((result, next) => {\n const ret = { ...result } as DBPermissionSet;\n for (const [verb, rights] of Object.entries(next) as [\n keyof DBPermissionSet,\n DBPermissionSet[keyof DBPermissionSet]\n ][]) {\n if (verb in ret && ret[verb]) {\n if (ret[verb] === '*') continue;\n if (rights === '*') {\n ret[verb] = '*';\n } else if (Array.isArray(rights) && Array.isArray(ret[verb])) {\n // Both are arrays (verb is 'add' or 'manage')\n const r = ret as { [v in typeof verb]?: string[] };\n const retVerb = r[verb]!; // \"!\" because Array.isArray(ret[verb])\n r[verb] = [...new Set([...retVerb, ...rights])];\n } else if (\n typeof rights === 'object' &&\n rights &&\n typeof ret[verb] === 'object'\n ) {\n // Both are objects (verb is 'update')\n const mergedRights = ret[verb] as {\n [tableName: string]: '*' | string[];\n }; // because we've checked that typeof ret[verb] === 'object' and earlier that not ret[verb] === '*'.\n for (const [tableName, tableRights] of Object.entries(rights) as [\n string,\n string[] | '*'\n ][]) {\n if (mergedRights[tableName] === '*') continue;\n if (tableRights === '*') {\n mergedRights[tableName] = '*';\n } else if (\n Array.isArray(mergedRights[tableName]) &&\n Array.isArray(tableRights)\n ) {\n mergedRights[tableName] = [\n ...new Set([...mergedRights[tableName], ...tableRights]),\n ];\n }\n }\n }\n } else {\n /* This compiles without type assertions. Keeping the comment to\n explain why we do tsignore on the next statement.\n if (verb === \"add\") {\n ret[verb] = next[verb];\n } else if (verb === \"update\") {\n ret[verb] = next[verb];\n } else if (verb === \"manage\") {\n ret[verb] = next[verb];\n } else {\n ret[verb] = next[verb];\n }\n */\n //@ts-ignore\n ret[verb] = next[verb];\n }\n }\n return ret;\n });\n return reduced;\n}\n","import Dexie from 'dexie';\nimport { DBPermissionSet, DBRealm, DBRealmMember } from 'dexie-cloud-common';\nimport { combineLatest, Observable } from 'rxjs';\nimport { map, startWith, tap } from 'rxjs/operators';\nimport { associate } from './associate';\nimport { UNAUTHORIZED_USER } from './authentication/UNAUTHORIZED_USER';\nimport { createSharedValueObservable } from './createSharedValueObservable';\nimport { getGlobalRolesObservable } from './getGlobalRolesObservable';\nimport { getInternalAccessControlObservable } from './getInternalAccessControlObservable';\nimport { flatten } from './helpers/flatten';\nimport { mapValueObservable } from './mapValueObservable';\nimport { mergePermissions } from './mergePermissions';\n\nexport type PermissionsLookup = {\n [realmId: string]: DBRealm & { permissions: DBPermissionSet };\n};\n\nexport type PermissionsLookupObservable = Observable<PermissionsLookup> & {\n getValue(): PermissionsLookup;\n};\n\nexport const getPermissionsLookupObservable = associate((db: Dexie) => {\n const o = createSharedValueObservable(\n combineLatest([\n getInternalAccessControlObservable(db._novip),\n getGlobalRolesObservable(db._novip),\n ]).pipe(\n map(([{ selfMembers, realms, userId }, globalRoles]) => ({\n selfMembers,\n realms,\n userId,\n globalRoles,\n }))\n ),\n {\n selfMembers: [],\n realms: [],\n userId: UNAUTHORIZED_USER.userId!,\n globalRoles: {},\n }\n );\n\n return mapValueObservable(\n o,\n ({ selfMembers, realms, userId, globalRoles }) => {\n const rv = realms\n .map((realm) => {\n const selfRealmMembers = selfMembers.filter(\n (m) => m.realmId === realm.realmId\n );\n const directPermissionSets = selfRealmMembers\n .map((m) => m.permissions!)\n .filter((p) => p);\n const rolePermissionSets = flatten(\n selfRealmMembers.map((m) => m.roles!).filter((roleName) => roleName)\n )\n .map((role) => globalRoles[role]!)\n .filter((role) => role)\n .map((role) => role.permissions);\n\n return {\n ...realm,\n permissions:\n realm.owner === userId\n ? ({ manage: '*' } as DBPermissionSet)\n : mergePermissions(\n ...directPermissionSets,\n ...rolePermissionSets\n ),\n };\n })\n .reduce((p, c) => ({ ...p, [c.realmId]: c }), {\n [userId!]: {\n realmId: userId,\n owner: userId,\n name: userId,\n permissions: { manage: '*' },\n } as DBRealm & { permissions: DBPermissionSet },\n });\n return rv;\n }\n );\n});\n","import { map, Observable } from 'rxjs';\n\nexport interface ObservableWithCurrentValue<T> extends Observable<T> {\n getValue(): T;\n}\n\nexport function mapValueObservable<T, R>(\n o: ObservableWithCurrentValue<T>,\n mapper: (x: T) => R\n): ObservableWithCurrentValue<R> {\n let currentValue: R | undefined;\n const rv = o.pipe(\n map((x) => (currentValue = mapper(x)))\n ) as ObservableWithCurrentValue<R>;\n rv.getValue = () =>\n currentValue !== undefined\n ? currentValue\n : (currentValue = mapper(o.getValue()));\n return rv;\n}\n","import { KeyPaths } from 'dexie';\nimport { DBPermissionSet } from 'dexie-cloud-common';\n\ntype TableName<T> = T extends {table: ()=>infer TABLE} ? TABLE extends string ? TABLE : string : string;\n\nexport class PermissionChecker<T, TableNames extends string = TableName<T>> {\n private permissions: DBPermissionSet;\n private tableName: TableNames;\n private isOwner: boolean;\n\n constructor(\n permissions: DBPermissionSet,\n tableName: TableNames,\n isOwner: boolean\n ) {\n this.permissions = permissions || {};\n this.tableName = tableName;\n this.isOwner = isOwner;\n }\n\n add(...tableNames: TableNames[]): boolean {\n // If user can manage the whole realm, return true.\n if (this.permissions.manage === '*') return true;\n // If user can manage given table in realm, return true\n if (this.permissions.manage?.includes(this.tableName)) return true;\n // If user can add any type, return true\n if (this.permissions.add === '*') return true;\n // If user can add objects into given table names in the realm, return true\n if (\n tableNames.every((tableName) => this.permissions.add?.includes(tableName))\n ) {\n return true;\n }\n return false;\n }\n\n update(...props: KeyPaths<T>[]): boolean {\n // If user is owner of this object, or if user can manage the whole realm, return true.\n if (this.isOwner || this.permissions.manage === '*') return true;\n // If user can manage given table in realm, return true\n if (this.permissions.manage?.includes(this.tableName)) return true;\n // If user can update any prop in any table in this realm, return true unless\n // it regards to ownership change:\n if (this.permissions.update === '*') {\n // @ts-ignore\n return props.every((prop) => prop !== 'owner');\n }\n const tablePermissions = this.permissions.update?.[this.tableName];\n // If user can update any prop in table and realm, return true unless\n // accessing special props owner or realmId\n if (tablePermissions === '*')\n return props.every((prop) => prop !== 'owner');\n\n // Explicitely listed properties to allow updates on:\n return props.every((prop) =>\n tablePermissions?.some(\n (permittedProp) =>\n permittedProp === prop || (permittedProp === '*' && prop !== 'owner')\n )\n );\n }\n\n delete(): boolean {\n // If user is owner of this object, or if user can manage the whole realm, return true.\n if (this.isOwner || this.permissions.manage === '*') return true;\n // If user can manage given table in realm, return true\n if (this.permissions.manage?.includes(this.tableName)) return true;\n return false;\n }\n}\n","import { Dexie, liveQuery } from 'dexie';\nimport { DBRealmMember } from 'dexie-cloud-common';\nimport { combineLatest } from 'rxjs';\nimport { map, switchMap } from 'rxjs/operators';\nimport { associate } from './associate';\nimport { createSharedValueObservable } from './createSharedValueObservable';\nimport { getCurrentUserEmitter } from './currentUserEmitter';\nimport { getInternalAccessControlObservable } from './getInternalAccessControlObservable';\nimport { getPermissionsLookupObservable } from './getPermissionsLookupObservable';\nimport { Invite } from './Invite';\nimport { mapValueObservable } from './mapValueObservable';\n\nexport const getInvitesObservable = associate((db: Dexie) => {\n const membersByEmail = getCurrentUserEmitter(db._novip).pipe(\n switchMap((currentUser) =>\n liveQuery(() =>\n db.members.where({ email: currentUser.email || '' }).toArray()\n )\n )\n );\n const permissions = getPermissionsLookupObservable(db._novip);\n const accessControl = getInternalAccessControlObservable(db._novip);\n return createSharedValueObservable(\n combineLatest([membersByEmail, accessControl, permissions]).pipe(\n map(([membersByEmail, accessControl, realmLookup]) => {\n const reducer = (\n result: { [id: string]: Invite },\n m: DBRealmMember\n ) => ({ ...result, [m.id!]: { ...m, realm: realmLookup[m.realmId] } });\n const emailMembersById = membersByEmail.reduce(reducer, {});\n const membersById = accessControl.selfMembers.reduce(\n reducer,\n emailMembersById\n );\n return Object.values(membersById)\n .filter((invite: DBRealmMember) => !invite.accepted)\n .map(\n (invite: DBRealmMember) =>\n ({\n ...invite,\n async accept() {\n await db.members.update(invite.id!, { accepted: new Date() });\n },\n async reject() {\n await db.members.update(invite.id!, { rejected: new Date() });\n },\n } satisfies Invite)\n );\n })\n ),\n []\n );\n});\n","import { DexieYProvider, DexieYDocMeta, cmp, Table } from 'dexie';\nimport type { DexieCloudDB } from '../db/DexieCloudDB';\nimport { getAwarenessLibrary, awarenessWeakMap } from './awareness';\nimport { DEXIE_CLOUD_SYNCER_ID } from '../sync/DEXIE_CLOUD_SYNCER_ID';\nimport { $Y } from './Y';\nimport { combineLatest, startWith } from 'rxjs';\nimport { YDocumentOpen } from 'dexie-cloud-common';\nimport { isEagerSyncDisabled } from '../isEagerSyncDisabled';\nimport { PersistedSyncState } from '../db/entities/PersistedSyncState';\nimport { getOpenDocSignal } from './reopenDocSignal';\n\ntype YDoc = import('yjs').Doc;\n\nexport function createYHandler(db: DexieCloudDB) {\n return (provider: DexieYProvider<YDoc>) => {\n const doc = provider.doc;\n const { parentTable } = doc.meta || ({} as DexieYDocMeta);\n if (!db.cloud.schema?.[parentTable].markedForSync) {\n return; // The table that holds the doc is not marked for sync - leave it to dexie. No syncing, no awareness.\n }\n let awareness: import('y-protocols/awareness').Awareness;\n Object.defineProperty(provider, 'awareness', {\n get() {\n if (awareness) return awareness;\n awareness = createAwareness(db, doc, provider);\n awarenessWeakMap.set(doc, awareness);\n return awareness;\n },\n });\n };\n}\n\nfunction createAwareness(\n db: DexieCloudDB,\n doc: YDoc,\n provider: DexieYProvider\n) {\n const { parentTable, parentId, parentProp, updatesTable } =\n doc.meta as DexieYDocMeta;\n const awap = getAwarenessLibrary(db);\n const awareness = new awap.Awareness(doc);\n const reopenDocSignal = getOpenDocSignal(doc);\n\n awareness.on('update', ({ added, updated, removed }, origin: any) => {\n // Send the update\n const changedClients = added.concat(updated).concat(removed);\n const user = db.cloud.currentUser.value;\n if (origin !== 'server' && user.isLoggedIn && !isEagerSyncDisabled(db)) {\n const update = awap.encodeAwarenessUpdate(awareness!, changedClients);\n db.messageProducer.next({\n type: 'aware',\n table: parentTable,\n prop: parentProp,\n k: doc.meta.parentId,\n u: update,\n });\n if (provider.destroyed) {\n // We're called from awareness.on('destroy') that did\n // removeAwarenessStates.\n // It's time to also send the doc-close message that dexie-cloud understands\n // and uses to stop subscribing for updates and awareness updates and brings\n // down the cached information in memory on the WS connection for this.\n db.messageProducer.next({\n type: 'doc-close',\n table: parentTable,\n prop: parentProp,\n k: doc.meta.parentId,\n });\n }\n }\n });\n awareness.on('destroy', () => {\n // Signal to server that this provider is destroyed (the update event will be triggered, which\n // in turn will trigger db.messageProducer that will send the message to the server if WS is connected)\n awap.removeAwarenessStates(\n awareness!,\n [doc.clientID],\n 'provider destroyed'\n );\n });\n\n // Open the document on the server\n (async () => {\n if (provider.destroyed) return;\n let connected = false;\n let currentFlowId = 1;\n const subscription = combineLatest([\n db.cloud.webSocketStatus, // Wake up when webSocket status changes\n reopenDocSignal.pipe(startWith(null)), // Wake up when reopenDocSignal emits\n ]).subscribe(([wsStatus]) => {\n if (provider.destroyed) return;\n // Keep \"connected\" state in a variable so we can check it after async operations\n connected = wsStatus === 'connected';\n\n // We are or got connected. Open the document on the server.\n const user = db.cloud.currentUser.value;\n if (\n wsStatus === 'connected' &&\n user.isLoggedIn &&\n !isEagerSyncDisabled(db)\n ) {\n ++currentFlowId;\n openDocumentOnServer().catch((error) => {\n console.warn(`Error catched in createYHandler.ts: ${error}`);\n });\n }\n });\n // Wait until WebSocket is connected\n provider.addCleanupHandler(subscription);\n\n /** Sends an 'doc-open' message to server whenever websocket becomes\n * connected, or if it is already connected.\n * The flow is aborted in case websocket is disconnected while querying\n * information required to compute the state vector. Flow is also\n * aborted in case document or provider has been destroyed during\n * the async parts of the task.\n *\n * The state vector is only computed from the updates that have occured\n * after the last full sync - which could very often be zero - in which\n * case no state vector is sent (then the server already knows us by\n * revision)\n *\n * When server gets the doc-open message, it will authorize us for\n * whether we are allowed to read / write to this document, and then\n * keep the cached information in memory on the WS connection for this\n * particular document, as well as subscribe to updates and awareness updates\n * from other clients on the document.\n */\n async function openDocumentOnServer() {\n const myFlow = currentFlowId; // So we can abort when a new flow is started\n const yTbl = db.table(updatesTable);\n const syncStateTbl = db.$syncState as Table<\n PersistedSyncState,\n 'syncState'\n >;\n const [receivedUntil, yServerRev] = await db.transaction(\n 'r',\n syncStateTbl,\n yTbl,\n async () => {\n const syncState = await yTbl.get(DEXIE_CLOUD_SYNCER_ID);\n const persistedSyncState = await syncStateTbl.get('syncState');\n return [\n syncState?.receivedUntil || 0,\n persistedSyncState?.yServerRevision ||\n persistedSyncState?.serverRevision,\n ];\n }\n );\n\n // After every await, check if we still should be working on this task.\n if (provider.destroyed || currentFlowId !== myFlow || !connected) return;\n\n const docOpenMsg: YDocumentOpen = {\n type: 'doc-open',\n table: parentTable,\n prop: parentProp,\n k: parentId,\n serverRev: yServerRev,\n };\n const serverUpdatesSinceLastSync = await yTbl\n .where('i')\n .between(receivedUntil, Infinity, false)\n .filter(\n (update) =>\n cmp(update.k, parentId) === 0 && // Only updates for this document\n ((update.f || 0) & 1) === 0 // Don't include local changes\n )\n .toArray();\n // After every await, check if we still should be working on this task.\n if (provider.destroyed || currentFlowId !== myFlow || !connected) return;\n\n if (serverUpdatesSinceLastSync.length > 0) {\n const Y = $Y(db); // Get the Yjs library from Dexie constructor options\n const mergedUpdate = Y.mergeUpdatesV2(\n serverUpdatesSinceLastSync.map((update) => update.u)\n );\n const stateVector = Y.encodeStateVectorFromUpdateV2(mergedUpdate);\n docOpenMsg.sv = stateVector;\n }\n db.messageProducer.next(docOpenMsg);\n }\n })();\n return awareness;\n}\n","import Dexie, { liveQuery, Subscription, Table } from 'dexie';\nimport {\n DBPermissionSet,\n DBRealmMember,\n getDbNameFromDbUrl,\n} from 'dexie-cloud-common';\nimport { BehaviorSubject, combineLatest, firstValueFrom, from, fromEvent, Subject } from 'rxjs';\nimport { filter, map, skip, startWith, switchMap, take } from 'rxjs/operators';\nimport { login } from './authentication/login';\nimport { UNAUTHORIZED_USER } from './authentication/UNAUTHORIZED_USER';\nimport { DexieCloudDB } from './db/DexieCloudDB';\nimport { PersistedSyncState } from './db/entities/PersistedSyncState';\nimport { DexieCloudOptions } from './DexieCloudOptions';\nimport { DISABLE_SERVICEWORKER_STRATEGY } from './DISABLE_SERVICEWORKER_STRATEGY';\nimport './extend-dexie-interface';\nimport { DexieCloudSyncOptions } from './DexieCloudSyncOptions';\nimport { IS_SERVICE_WORKER } from './helpers/IS_SERVICE_WORKER';\nimport { throwVersionIncrementNeeded } from './helpers/throwVersionIncrementNeeded';\nimport { createIdGenerationMiddleware } from './middlewares/createIdGenerationMiddleware';\nimport { createImplicitPropSetterMiddleware } from './middlewares/createImplicitPropSetterMiddleware';\nimport { createMutationTrackingMiddleware } from './middlewares/createMutationTrackingMiddleware';\n//import { dexieCloudSyncProtocol } from \"./dexieCloudSyncProtocol\";\nimport { overrideParseStoresSpec } from './overrideParseStoresSpec';\nimport { performInitialSync } from './performInitialSync';\nimport { connectWebSocket } from './sync/connectWebSocket';\nimport { isSyncNeeded } from './sync/isSyncNeeded';\nimport { LocalSyncWorker } from './sync/LocalSyncWorker';\nimport {\n registerPeriodicSyncEvent,\n registerSyncEvent,\n} from './sync/registerSyncEvent';\nimport { triggerSync } from './sync/triggerSync';\nimport { DXCUserInteraction } from './types/DXCUserInteraction';\nimport { SyncState } from './types/SyncState';\nimport { updateSchemaFromOptions } from './updateSchemaFromOptions';\nimport { verifySchema } from './verifySchema';\nimport { setupDefaultGUI } from './default-ui';\nimport { DXCWebSocketStatus } from './DXCWebSocketStatus';\nimport { computeSyncState } from './computeSyncState';\nimport { generateKey } from './middleware-helpers/idGenerationHelpers';\nimport { permissions } from './permissions';\nimport { getCurrentUserEmitter } from './currentUserEmitter';\nimport { NewIdOptions } from './types/NewIdOptions';\nimport { getInvitesObservable } from './getInvitesObservable';\nimport { getGlobalRolesObservable } from './getGlobalRolesObservable';\nimport { UserLogin } from './db/entities/UserLogin';\nimport { InvalidLicenseError } from './InvalidLicenseError';\nimport { logout, _logout } from './authentication/logout';\nimport { loadAccessToken } from './authentication/authenticate';\nimport { isEagerSyncDisabled } from './isEagerSyncDisabled';\nimport { createYHandler } from \"./yjs/createYHandler\";\nexport { DexieCloudTable } from './DexieCloudTable';\nexport * from './getTiedRealmId';\nexport {\n DBRealm,\n DBRealmMember,\n DBRealmRole,\n DBSyncedObject,\n DBPermissionSet,\n} from 'dexie-cloud-common';\nexport { resolveText } from './helpers/resolveText';\nexport { Invite } from './Invite';\nexport type { UserLogin, DXCWebSocketStatus, SyncState };\nexport type { DexieCloudSyncOptions };\nexport type { DexieCloudOptions, PeriodicSyncOptions } from './DexieCloudOptions';\nexport * from './types/DXCAlert';\nexport * from './types/DXCInputField';\nexport * from './types/DXCUserInteraction';\nexport { defineYDocTrigger } from './define-ydoc-trigger';\n\nconst DEFAULT_OPTIONS: Partial<DexieCloudOptions> = {\n nameSuffix: true,\n};\n\nexport function dexieCloud(dexie: Dexie) {\n const origIdbName = dexie.name;\n //\n //\n //\n const currentUserEmitter = getCurrentUserEmitter(dexie);\n const subscriptions: Subscription[] = [];\n let configuredProgramatically = false;\n\n // local sync worker - used when there's no service worker.\n let localSyncWorker: { start: () => void; stop: () => void } | null = null;\n dexie.on(\n 'ready',\n async (dexie: Dexie) => {\n try {\n await onDbReady(dexie);\n } catch (error) {\n console.error(error);\n // Make sure to succeed with database open even if network is down.\n }\n },\n true // true = sticky\n );\n\n /** Void starting subscribers after a close has happened. */\n let closed = false;\n function throwIfClosed() {\n if (closed) throw new Dexie.DatabaseClosedError();\n }\n\n dexie.once('close', () => {\n subscriptions.forEach((subscription) => subscription.unsubscribe());\n subscriptions.splice(0, subscriptions.length);\n closed = true;\n localSyncWorker && localSyncWorker.stop();\n localSyncWorker = null;\n currentUserEmitter.next(UNAUTHORIZED_USER);\n });\n\n const syncComplete = new Subject<void>();\n\n dexie.cloud = {\n // @ts-ignore\n version: __VERSION__,\n options: { ...DEFAULT_OPTIONS } as DexieCloudOptions,\n schema: null,\n get currentUserId() {\n return currentUserEmitter.value.userId || UNAUTHORIZED_USER.userId!;\n },\n currentUser: currentUserEmitter,\n syncState: new BehaviorSubject<SyncState>({\n phase: 'initial',\n status: 'not-started',\n }),\n\n events: {\n syncComplete,\n },\n\n persistedSyncState: new BehaviorSubject<PersistedSyncState | undefined>(\n undefined\n ),\n userInteraction: new BehaviorSubject<DXCUserInteraction | undefined>(\n undefined\n ),\n webSocketStatus: new BehaviorSubject<DXCWebSocketStatus>('not-started'),\n async login(hint) {\n const db = DexieCloudDB(dexie);\n await db.cloud.sync();\n await login(db, hint);\n },\n invites: getInvitesObservable(dexie),\n roles: getGlobalRolesObservable(dexie),\n configure(options: DexieCloudOptions) {\n options = dexie.cloud.options = { ...dexie.cloud.options, ...options };\n configuredProgramatically = true;\n if (options.databaseUrl && options.nameSuffix) {\n // @ts-ignore\n dexie.name = `${origIdbName}-${getDbNameFromDbUrl(\n options.databaseUrl\n )}`;\n DexieCloudDB(dexie).reconfigure(); // Update observable from new dexie.name\n }\n updateSchemaFromOptions(dexie.cloud.schema, dexie.cloud.options);\n },\n async logout({ force } = {}) {\n force\n ? await _logout(DexieCloudDB(dexie), { deleteUnsyncedData: true })\n : await logout(DexieCloudDB(dexie));\n },\n async sync(\n { wait, purpose }: DexieCloudSyncOptions = { wait: true, purpose: 'push' }\n ) {\n if (wait === undefined) wait = true;\n const db = DexieCloudDB(dexie);\n const licenseStatus = db.cloud.currentUser.value.license?.status || 'ok';\n if (licenseStatus !== 'ok') {\n // Refresh access token to check for updated license\n await loadAccessToken(db);\n }\n if (purpose === 'pull') {\n const syncState = db.cloud.persistedSyncState.value;\n triggerSync(db, purpose);\n if (wait) {\n const newSyncState = await firstValueFrom(\n db.cloud.persistedSyncState.pipe(\n filter(\n (newSyncState) =>\n newSyncState?.timestamp != null &&\n (!syncState || newSyncState.timestamp > syncState.timestamp!)\n )\n )\n );\n if (newSyncState?.error) {\n throw new Error(`Sync error: ` + newSyncState.error);\n }\n }\n } else if (await isSyncNeeded(db)) {\n const syncState = db.cloud.persistedSyncState.value;\n triggerSync(db, purpose);\n if (wait) {\n console.debug('db.cloud.login() is waiting for sync completion...');\n await firstValueFrom(\n from(\n liveQuery(async () => {\n const syncNeeded = await isSyncNeeded(db);\n const newSyncState = await db.getPersistedSyncState();\n if (\n newSyncState?.timestamp !== syncState?.timestamp &&\n newSyncState?.error\n )\n throw new Error(`Sync error: ` + newSyncState.error);\n return syncNeeded;\n })\n ).pipe(filter((isNeeded) => !isNeeded))\n );\n console.debug(\n 'Done waiting for sync completion because we have nothing to push anymore'\n );\n }\n }\n },\n permissions(\n obj: { owner: string; realmId: string; table?: () => string },\n tableName?: string\n ) {\n return permissions(dexie._novip, obj, tableName);\n },\n };\n\n dexie.Version.prototype['_parseStoresSpec'] = Dexie.override(\n dexie.Version.prototype['_parseStoresSpec'],\n (origFunc) => overrideParseStoresSpec(origFunc, dexie)\n );\n\n dexie.Table.prototype.newId = function (\n this: Table<any>,\n { colocateWith }: NewIdOptions = {}\n ) {\n const shardKey =\n colocateWith && colocateWith.substr(colocateWith.length - 3);\n return generateKey(dexie.cloud.schema![this.name].idPrefix || '', shardKey);\n };\n\n dexie.Table.prototype.idPrefix = function (this: Table<any>) {\n return this.db.cloud.schema?.[this.name]?.idPrefix || '';\n };\n\n dexie.use(\n createMutationTrackingMiddleware({\n currentUserObservable: dexie.cloud.currentUser,\n db: DexieCloudDB(dexie),\n })\n );\n dexie.use(createImplicitPropSetterMiddleware(DexieCloudDB(dexie)));\n dexie.use(createIdGenerationMiddleware(DexieCloudDB(dexie)));\n\n async function onDbReady(dexie: Dexie) {\n closed = false; // As Dexie calls us, we are not closed anymore. Maybe reopened? Remember db.ready event is registered with sticky flag!\n const db = DexieCloudDB(dexie);\n // Setup default GUI:\n if (typeof window !== 'undefined' && typeof document !== 'undefined') {\n if (!db.cloud.options?.customLoginGui) {\n subscriptions.push(setupDefaultGUI(dexie));\n }\n }\n if (!db.cloud.isServiceWorkerDB) {\n subscriptions.push(computeSyncState(db).subscribe(dexie.cloud.syncState));\n }\n\n // Forward db.syncCompleteEvent to be publicly consumable via db.cloud.events.syncComplete:\n subscriptions.push(db.syncCompleteEvent.subscribe(syncComplete));\n\n //verifyConfig(db.cloud.options); Not needed (yet at least!)\n // Verify the user has allowed version increment.\n if (!db.tables.every((table) => table.core)) {\n throwVersionIncrementNeeded();\n }\n const swRegistrations =\n 'serviceWorker' in navigator\n ? await navigator.serviceWorker.getRegistrations()\n : [];\n\n const [initiallySynced, lastSyncedRealms] = await db.transaction(\n 'rw',\n db.$syncState,\n async () => {\n const { options, schema } = db.cloud;\n const [persistedOptions, persistedSchema, persistedSyncState] =\n await Promise.all([\n db.getOptions(),\n db.getSchema(),\n db.getPersistedSyncState(),\n ]);\n if (!configuredProgramatically) {\n // Options not specified programatically (use case for SW!)\n // Take persisted options:\n db.cloud.options = persistedOptions || null;\n } else if (\n !persistedOptions ||\n JSON.stringify(persistedOptions) !== JSON.stringify(options)\n ) {\n // Update persisted options:\n if (!options) throw new Error(`Internal error`); // options cannot be null if configuredProgramatically is set.\n const newPersistedOptions: DexieCloudOptions = {\n ...options,\n };\n delete newPersistedOptions.fetchTokens;\n delete newPersistedOptions.awarenessProtocol;\n await db.$syncState.put(newPersistedOptions, 'options');\n }\n if (\n db.cloud.options?.tryUseServiceWorker &&\n 'serviceWorker' in navigator &&\n swRegistrations.length > 0 &&\n !DISABLE_SERVICEWORKER_STRATEGY\n ) {\n // * Configured for using service worker if available.\n // * Browser supports service workers\n // * There are at least one service worker registration\n console.debug('Dexie Cloud Addon: Using service worker');\n db.cloud.usingServiceWorker = true;\n } else {\n // Not configured for using service worker or no service worker\n // registration exists. Don't rely on service worker to do any job.\n // Use LocalSyncWorker instead.\n if (\n db.cloud.options?.tryUseServiceWorker &&\n !db.cloud.isServiceWorkerDB\n ) {\n console.debug(\n 'dexie-cloud-addon: Not using service worker.',\n swRegistrations.length === 0\n ? 'No SW registrations found.'\n : 'serviceWorker' in navigator && DISABLE_SERVICEWORKER_STRATEGY\n ? 'Avoiding SW background sync and SW periodic bg sync for this browser due to browser bugs.'\n : 'navigator.serviceWorker not present'\n );\n }\n db.cloud.usingServiceWorker = false;\n }\n updateSchemaFromOptions(schema, db.cloud.options);\n updateSchemaFromOptions(persistedSchema, db.cloud.options);\n if (!schema) {\n // Database opened dynamically (use case for SW!)\n // Take persisted schema:\n db.cloud.schema = persistedSchema || null;\n } else if (\n !persistedSchema ||\n JSON.stringify(persistedSchema) !== JSON.stringify(schema)\n ) {\n // Update persisted schema (but don't overwrite table prefixes)\n const newPersistedSchema = persistedSchema || {};\n for (const [table, tblSchema] of Object.entries(schema)) {\n const newTblSchema = newPersistedSchema[table];\n if (!newTblSchema) {\n newPersistedSchema[table] = { ...tblSchema };\n } else {\n newTblSchema.markedForSync = tblSchema.markedForSync;\n tblSchema.deleted = newTblSchema.deleted;\n newTblSchema.generatedGlobalId = tblSchema.generatedGlobalId;\n }\n }\n await db.$syncState.put(newPersistedSchema, 'schema');\n\n // Make sure persisted table prefixes are being used instead of computed ones:\n // Let's assign all props as the newPersistedSchems should be what we should be working with.\n Object.assign(schema, newPersistedSchema);\n }\n return [persistedSyncState?.initiallySynced, persistedSyncState?.realms];\n }\n );\n\n if (initiallySynced) {\n db.setInitiallySynced(true);\n }\n\n verifySchema(db);\n\n // Manage CurrentUser observable:\n throwIfClosed();\n if (!db.cloud.isServiceWorkerDB) {\n subscriptions.push(\n liveQuery(() => db.getCurrentUser()).subscribe(currentUserEmitter)\n );\n // Manage PersistendSyncState observable:\n subscriptions.push(\n liveQuery(() => db.getPersistedSyncState()).subscribe(\n db.cloud.persistedSyncState\n )\n );\n // Wait till currentUser and persistedSyncState gets populated\n // with things from the database and not just the default values.\n // This is so that when db.open() completes, user should be safe\n // to subscribe to these observables and get actual data.\n await firstValueFrom(combineLatest([\n currentUserEmitter.pipe(skip(1), take(1)),\n db.cloud.persistedSyncState.pipe(skip(1), take(1)),\n ]));\n\n const yHandler = createYHandler(db);\n db.dx.on('y', yHandler);\n db.dx.once('close', () => {\n db.dx.on.y?.unsubscribe(yHandler);\n });\n }\n\n // HERE: If requireAuth, do athentication now.\n let changedUser = false;\n const user = await db.getCurrentUser();\n const requireAuth = db.cloud.options?.requireAuth;\n if (requireAuth) {\n if (db.cloud.isServiceWorkerDB) {\n // If this is a service worker DB, we can't do authentication here,\n // we just wait until the application has done it.\n console.debug('Dexie Cloud Service worker. Waiting for application to authenticate.');\n await firstValueFrom(currentUserEmitter.pipe(filter((user) => !!user.isLoggedIn), take(1)));\n console.debug('Dexie Cloud Service worker. Application has authenticated.');\n } else {\n if (typeof requireAuth === 'object') {\n // requireAuth contains login hints. Check if we already fulfil it:\n if (\n !user.isLoggedIn ||\n (requireAuth.userId && user.userId !== requireAuth.userId) ||\n (requireAuth.email && user.email !== requireAuth.email)\n ) {\n // If not, login the configured user:\n changedUser = await login(db, requireAuth);\n }\n } else if (!user.isLoggedIn) {\n // requireAuth is true and user is not logged in\n changedUser = await login(db);\n }\n }\n }\n if (user.isLoggedIn && (!lastSyncedRealms || !lastSyncedRealms.includes(user.userId!))) {\n // User has been logged in but this is not reflected in the sync state.\n // This can happen if page is reloaded after login but before the sync call following\n // the login was complete.\n // The user is to be viewed as changed becuase current syncState does not reflect the presence\n // of the logged-in user.\n changedUser = true; // Set changedUser to true to trigger a pull-sync later down.\n }\n\n if (localSyncWorker) localSyncWorker.stop();\n localSyncWorker = null;\n throwIfClosed();\n\n const doInitialSync = db.cloud.options?.databaseUrl && (!initiallySynced || changedUser);\n if (doInitialSync) {\n // Do the initial sync directly in the browser thread no matter if we are using service worker or not.\n await performInitialSync(db, db.cloud.options!, db.cloud.schema!);\n db.setInitiallySynced(true);\n }\n\n throwIfClosed();\n if (db.cloud.usingServiceWorker && db.cloud.options?.databaseUrl) {\n if (!doInitialSync) {\n registerSyncEvent(db, 'push').catch(() => {});\n }\n registerPeriodicSyncEvent(db).catch(() => {});\n } else if (\n db.cloud.options?.databaseUrl &&\n db.cloud.schema &&\n !db.cloud.isServiceWorkerDB\n ) {\n // There's no SW. Start SyncWorker instead.\n localSyncWorker = LocalSyncWorker(db, db.cloud.options, db.cloud.schema!);\n localSyncWorker.start();\n if (!doInitialSync) {\n triggerSync(db, 'push');\n }\n }\n\n // Listen to online event and do sync.\n throwIfClosed();\n if (!db.cloud.isServiceWorkerDB) {\n subscriptions.push(\n fromEvent(self, 'online').subscribe(() => {\n console.debug('online!');\n db.syncStateChangedEvent.next({\n phase: 'not-in-sync',\n });\n if (!isEagerSyncDisabled(db)) {\n triggerSync(db, 'push');\n }\n }),\n fromEvent(self, 'offline').subscribe(() => {\n console.debug('offline!');\n db.syncStateChangedEvent.next({\n phase: 'offline',\n });\n })\n );\n }\n\n // Connect WebSocket unless we are in a service worker or websocket is disabled.\n if (\n db.cloud.options?.databaseUrl &&\n !db.cloud.options?.disableWebSocket &&\n !IS_SERVICE_WORKER\n ) {\n subscriptions.push(connectWebSocket(db));\n }\n }\n}\n\n// @ts-ignore\ndexieCloud.version = __VERSION__;\n\nDexie.Cloud = dexieCloud;\n\n//Dexie.addons.push(dexieCloud);\n\nexport default dexieCloud;\n","import { combineLatest, Observable, of } from 'rxjs';\nimport { debounceTime, map, startWith, switchMap } from 'rxjs/operators';\nimport { getCurrentUserEmitter } from './currentUserEmitter';\nimport { DexieCloudDB, SyncStateChangedEventData } from './db/DexieCloudDB';\nimport { isOnline } from './sync/isOnline';\nimport { SyncState } from './types/SyncState';\nimport { userIsActive, userIsReallyActive } from './userIsActive';\n\nexport function computeSyncState(db: DexieCloudDB): Observable<SyncState> {\n let _prevStatus = db.cloud.webSocketStatus.value;\n const lazyWebSocketStatus = db.cloud.webSocketStatus.pipe(\n switchMap((status) => {\n const prevStatus = _prevStatus;\n _prevStatus = status;\n const rv = of(status);\n switch (status) {\n // A normal scenario is that the WS reconnects and falls shortly in disconnected-->connection-->connected.\n // Don't distract user with this unless these things take more time than normal:\n\n // Only show disconnected if disconnected more than 500ms, or if we can\n // see that the user is indeed not active.\n case 'disconnected':\n return userIsActive.value ? rv.pipe(debounceTime(500)) : rv;\n\n // Only show connecting if previous state was 'not-started' or 'error', or if\n // the time it takes to connect goes beyond 4 seconds.\n case 'connecting':\n return prevStatus === 'not-started' || prevStatus === 'error'\n ? rv\n : rv.pipe(debounceTime(4000));\n default:\n return rv;\n }\n })\n );\n return combineLatest([\n lazyWebSocketStatus,\n db.syncStateChangedEvent.pipe(startWith({ phase: 'initial' } as SyncStateChangedEventData)),\n getCurrentUserEmitter(db.dx._novip),\n userIsReallyActive\n ]).pipe(\n map(([status, syncState, user, userIsActive]) => {\n if (user.license?.status && user.license.status !== 'ok') {\n return {\n phase: 'offline',\n status: 'offline',\n license: user.license.status\n } satisfies SyncState;\n }\n let { phase, error, progress } = syncState;\n let adjustedStatus = status;\n if (phase === 'error') {\n // Let users only rely on the status property to display an icon.\n // If there's an error in the sync phase, let it show on that\n // status icon also.\n adjustedStatus = 'error';\n }\n if (status === 'not-started') {\n // If websocket isn't yet connected becase we're doing\n // the startup sync, let the icon show the symbol for connecting.\n if (phase === 'pushing' || phase === 'pulling') {\n adjustedStatus = 'connecting';\n }\n } \n const previousPhase = db.cloud.syncState.value.phase;\n //const previousStatus = db.cloud.syncState.value.status;\n if (previousPhase === 'error' && (syncState.phase === 'pushing' || syncState.phase === 'pulling')) {\n // We were in an errored state but is now doing sync. Show \"connecting\" icon.\n adjustedStatus = 'connecting';\n }\n /*if (syncState.phase === 'in-sync' && adjustedStatus === 'connecting') {\n adjustedStatus = 'connected';\n }*/\n \n if (!userIsActive) {\n adjustedStatus = 'disconnected';\n }\n\n const retState: SyncState = {\n phase,\n error,\n progress,\n status: isOnline ? adjustedStatus : 'offline',\n license: 'ok'\n };\n\n return retState;\n })\n );\n}\n","import Dexie from \"dexie\";\n\nexport function throwVersionIncrementNeeded() {\n throw new Dexie.SchemaError(\n `Version increment needed to allow dexie-cloud change tracking`\n );\n}\n","import Dexie from \"dexie\";\nimport { DexieCloudDB } from \"./db/DexieCloudDB\";\n\nexport function verifySchema(db: DexieCloudDB) {\n for (const table of db.tables) {\n if (db.cloud.schema?.[table.name]?.markedForSync) {\n if (table.schema.primKey.auto) {\n throw new Dexie.SchemaError(\n `Table ${table.name} is both autoIncremented and synced. ` +\n `Use db.cloud.configure({unsyncedTables: [${JSON.stringify(\n table.name\n )}]}) to blacklist it from sync`\n );\n }\n if (!table.schema.primKey.keyPath) {\n throw new Dexie.SchemaError(\n `Table ${table.name} cannot be both synced and outbound. ` +\n `Use db.cloud.configure({unsyncedTables: [${JSON.stringify(\n table.name\n )}]}) to blacklist it from sync`\n );\n }\n }\n }\n}\n","import { DexieCloudSchema } from 'dexie-cloud-common';\nimport { DexieCloudDB } from './db/DexieCloudDB';\nimport { DexieCloudOptions } from './DexieCloudOptions';\nimport { CURRENT_SYNC_WORKER, sync } from './sync/sync';\nimport { performGuardedJob } from './sync/performGuardedJob';\n\nexport async function performInitialSync(\n db: DexieCloudDB,\n cloudOptions: DexieCloudOptions,\n cloudSchema: DexieCloudSchema\n) {\n console.debug('Performing initial sync'); \n await performGuardedJob(\n db,\n CURRENT_SYNC_WORKER,\n () => sync(db, cloudOptions, cloudSchema, { isInitialSync: true })\n );\n console.debug('Done initial sync');\n}\n","import Dexie, { DBCore, DBCoreTransaction, Middleware } from 'dexie';\nimport { DexieCloudDB } from '../db/DexieCloudDB';\nimport { TXExpandos } from '../types/TXExpandos';\nimport { UNAUTHORIZED_USER } from '../authentication/UNAUTHORIZED_USER';\n\nexport function createImplicitPropSetterMiddleware(\n db: DexieCloudDB\n): Middleware<DBCore> {\n return {\n stack: 'dbcore',\n name: 'implicitPropSetterMiddleware',\n level: 1,\n create: (core) => {\n return {\n ...core,\n table: (tableName) => {\n const table = core.table(tableName);\n return {\n ...table,\n mutate: (req) => {\n const trans = req.trans as DBCoreTransaction & TXExpandos & IDBTransaction;\n\n if (trans.disableChangeTracking) {\n return table.mutate(req);\n }\n\n const currentUserId = trans.currentUser?.userId ?? UNAUTHORIZED_USER.userId;\n\n if (db.cloud.schema?.[tableName]?.markedForSync) {\n if (req.type === 'add' || req.type === 'put') {\n if (tableName === 'members') {\n for (const member of req.values) {\n if (typeof member.email === 'string') {\n // Resolve https://github.com/dexie/dexie-cloud/issues/4\n // If adding a member, make sure email is lowercase and trimmed.\n // This is to avoid issues where the APP does not check this\n // and just allows the user to enter an email address that might\n // have been pasted by the user from a source that had a trailing\n // space or was in uppercase. We want to avoid that the user\n // creates a new member with a different email address than\n // the one he/she intended to create.\n member.email = member.email.trim().toLowerCase();\n }\n }\n }\n // No matter if user is logged in or not, make sure \"owner\" and \"realmId\" props are set properly.\n // If not logged in, this will be changed upon syncification of the tables (next sync after login),\n // however, application code will work better if we can always rely on that the properties realmId\n // and owner are set. Application code may index them and query them based on db.cloud.currentUserId,\n // and expect them to be returned. That scenario must work also when db.cloud.currentUserId === 'unauthorized'.\n for (const obj of req.values) {\n if (!obj.owner) {\n obj.owner = currentUserId;\n }\n if (!obj.realmId) {\n obj.realmId = currentUserId;\n }\n const key = table.schema.primaryKey.extractKey?.(obj);\n if (typeof key === 'string' && key[0] === '#') {\n // Add $ts prop for put operations and\n // disable update operations as well as consistent\n // modify operations. Reason: Server may not have\n // the object. Object should be created on server only\n // if is being updated. An update operation won't create it\n // so we must delete req.changeSpec to degrade operation to\n // an upsert operation with timestamp so that it will be created.\n // We must also degrade from consistent modify operations for the\n // same reason - object might be there on server. Must but put up instead.\n\n // FUTURE: This clumpsy behavior of private IDs could be refined later.\n // Suggestion is to in future, treat private IDs as we treat all objects \n // and sync operations normally. Only that deletions should become soft deletes\n // for them - so that server knows when a private ID has been deleted on server\n // not accept insert/upserts on them.\n if (req.type === 'put') {\n const now = Date.now();\n delete req.criteria;\n delete req.changeSpec;\n delete req.updates;\n obj.$ts = Date.now();\n }\n }\n }\n }\n }\n return table.mutate(req);\n },\n };\n },\n };\n },\n };\n}\n","export function getDbNameFromDbUrl(dbUrl) {\n const url = new URL(dbUrl);\n return url.pathname === \"/\"\n ? url.hostname.split('.')[0]\n : url.pathname.split('/')[1];\n}\n","import Dexie, { liveQuery } from 'dexie';\nimport { DBRealmMember } from 'dexie-cloud-common';\nimport { from, Observable } from 'rxjs';\nimport { map, startWith } from 'rxjs/operators';\nimport { mergePermissions } from './mergePermissions';\nimport {\n getPermissionsLookupObservable,\n PermissionsLookup,\n} from './getPermissionsLookupObservable';\nimport { PermissionChecker } from './PermissionChecker';\nimport './extend-dexie-interface';\n\nexport function permissions(\n dexie: Dexie,\n obj: { owner?: string; realmId?: string; table?: () => string },\n tableName?: string\n): Observable<PermissionChecker<any>> {\n if (!obj)\n throw new TypeError(\n `Cannot check permissions of undefined or null. A Dexie Cloud object with realmId and owner expected.`\n );\n const { owner, realmId } = obj;\n if (!tableName) {\n if (typeof obj.table !== 'function') {\n throw new TypeError(\n `Missing 'table' argument to permissions and table could not be extracted from entity`\n );\n }\n tableName = obj.table();\n }\n const source = getPermissionsLookupObservable(dexie);\n const mapper = (permissionsLookup: PermissionsLookup) => {\n // If realmId is undefined, it can be due to that the object is not yet syncified - it exists\n // locally only as the user might not yet be authenticated. This is ok and we shall treat it\n // as if the realmId is dexie.cloud.currentUserId (which is \"unauthorized\" by the way)\n const realm = permissionsLookup[realmId || dexie.cloud.currentUserId];\n if (!realm)\n return new PermissionChecker(\n {},\n tableName!,\n !owner || owner === dexie.cloud.currentUserId\n );\n return new PermissionChecker(\n realm.permissions,\n tableName!,\n realmId === undefined || realmId === dexie.cloud.currentUserId || owner === dexie.cloud.currentUserId\n );\n };\n const o = source.pipe(map(mapper)) as Observable<PermissionChecker<any>> & {\n getValue: () => PermissionChecker<any>;\n };\n o.getValue = () => mapper(source.getValue());\n return o;\n}\n","import Dexie from 'dexie';\nimport { DexieCloudDB } from './db/DexieCloudDB';\nimport dexieCloud from './dexie-cloud-client';\nimport { DISABLE_SERVICEWORKER_STRATEGY } from './DISABLE_SERVICEWORKER_STRATEGY';\nimport { isSafari, safariVersion } from './isSafari';\nimport { syncIfPossible } from './sync/syncIfPossible';\nimport { SWMessageEvent } from './types/SWMessageEvent';\nimport { SyncEvent } from './types/SWSyncEvent';\n\n// In case the SW lives for a while, let it reuse already opened connections:\nconst managedDBs = new Map<string, DexieCloudDB>();\n\nfunction getDbNameFromTag(tag: string) {\n return tag.startsWith('dexie-cloud:') && tag.split(':')[1];\n}\n\nconst syncDBSemaphore = new Map<string, Promise<void>>();\n\nfunction syncDB(dbName: string, purpose: 'push' | 'pull') {\n // We're taking hight for being double-signalled both\n // via message event and sync event.\n // Which one comes first doesnt matter, just\n // that we return the existing promise if there is\n // an ongoing sync.\n let promise = syncDBSemaphore.get(dbName + '/' + purpose);\n if (!promise) {\n promise = _syncDB(dbName, purpose)\n .then(() => {\n // When legacy enough across browsers, use .finally() instead of then() and catch():\n syncDBSemaphore.delete(dbName + '/' + purpose);\n })\n .catch((error) => {\n syncDBSemaphore.delete(dbName + '/' + purpose);\n return Promise.reject(error);\n });\n syncDBSemaphore.set(dbName + '/' + purpose, promise!);\n }\n return promise!;\n\n async function _syncDB(dbName: string, purpose: 'push' | 'pull') {\n let db = managedDBs.get(dbName);\n\n if (!db) {\n console.debug('Dexie Cloud SW: Creating new Dexie instance for', dbName);\n const dexie = new Dexie(dbName, { addons: [dexieCloud] });\n db = DexieCloudDB(dexie);\n db.cloud.isServiceWorkerDB = true;\n dexie.on('versionchange', stopManagingDB);\n await db.dx.open(); // Makes sure db.cloud.options and db.cloud.schema are read from db,\n if (managedDBs.get(dbName)) {\n // Avoid race conditions.\n db.close();\n return await _syncDB(dbName, purpose);\n }\n managedDBs.set(dbName, db);\n }\n if (!db.cloud.options?.databaseUrl) {\n console.error(`Dexie Cloud: No databaseUrl configured`);\n return; // Nothing to sync.\n }\n if (!db.cloud.schema) {\n console.error(`Dexie Cloud: No schema persisted`);\n return; // Nothing to sync.\n }\n\n function stopManagingDB() {\n db!.dx.on.versionchange.unsubscribe(stopManagingDB);\n if (managedDBs.get(db!.name) === db) {\n // Avoid race conditions.\n managedDBs.delete(db!.name);\n }\n console.debug(`Dexie Cloud SW: Closing Dexie instance for ${dbName}`);\n db!.dx.close();\n return false;\n }\n\n try {\n console.debug('Dexie Cloud SW: Syncing');\n await syncIfPossible(db, db.cloud.options, db.cloud.schema, {\n retryImmediatelyOnFetchError: true,\n purpose,\n });\n console.debug('Dexie Cloud SW: Done Syncing');\n } catch (e) {\n console.error(`Dexie Cloud SW Error`, e);\n // Error occured. Stop managing this DB until we wake up again by a sync event,\n // which will open a new Dexie and start trying to sync it.\n stopManagingDB();\n if (e.name !== Dexie.errnames.NoSuchDatabase) {\n // Unless the error was that DB doesn't exist, rethrow to trigger sync retry.\n throw e; // Throw e to make syncEvent.waitUntil() receive a rejected promis, so it will retry.\n }\n }\n }\n}\n\n// Avoid taking care of events if browser bugs out by using dexie cloud from a service worker.\nif (!DISABLE_SERVICEWORKER_STRATEGY) {\n self.addEventListener('sync', (event: SyncEvent) => {\n console.debug('SW \"sync\" Event', event.tag);\n const dbName = getDbNameFromTag(event.tag);\n if (dbName) {\n event.waitUntil(syncDB(dbName, \"push\")); // The purpose of sync events are \"push\"\n }\n });\n\n self.addEventListener('periodicsync', (event: SyncEvent) => {\n console.debug('SW \"periodicsync\" Event', event.tag);\n const dbName = getDbNameFromTag(event.tag);\n if (dbName) {\n event.waitUntil(syncDB(dbName, \"pull\")); // The purpose of periodic sync events are \"pull\"\n }\n });\n\n self.addEventListener('message', (event: SWMessageEvent) => {\n console.debug('SW \"message\" Event', event.data);\n if (event.data.type === 'dexie-cloud-sync') {\n const { dbName } = event.data;\n // Mimic background sync behavior - retry in X minutes on failure.\n // But lesser timeout and more number of times.\n const syncAndRetry = (num = 1) => {\n return syncDB(dbName, event.data.purpose || \"pull\").catch(async (e) => {\n if (num === 3) throw e;\n await sleep(60_000); // 1 minute\n syncAndRetry(num + 1);\n });\n };\n if ('waitUntil' in event) {\n event.waitUntil(syncAndRetry().catch(error => console.error(error)));\n } else {\n syncAndRetry().catch(error => console.error(error));\n }\n }\n });\n}\n\nfunction sleep(ms: number) {\n return new Promise((resolve) => setTimeout(resolve, ms));\n}\n"],"names":["extendStatics","d","b","Object","setPrototypeOf","__proto__","Array","p","prototype","hasOwnProperty","call","__extends","TypeError","String","__","this","constructor","create","__awaiter","thisArg","_arguments","P","generator","Promise","resolve","reject","fulfilled","value","step","next","e","rejected","result","done","then","apply","__generator","body","f","y","t","g","_","label","sent","trys","ops","verb","throw","return","Symbol","iterator","n","v","op","pop","length","push","__values","o","s","m","i","__read","r","ar","error","__spreadArray","to","from","pack","arguments","l","slice","concat","__await","__asyncGenerator","asyncIterator","q","a","resume","fulfill","settle","shift","__asyncValues","UNAUTHORIZED_USER","userId","name","claims","sub","lastLogin","Date","freeze","_a","swHolder","swContainer","self","document","navigator","serviceWorker","ready","registration","addEventListener","ev","_b","data","type","startsWith","matchAll","includeUncontrolled","forEach","client","id","source","postMessage","SWBroadcastChannel","subscribe","listener","forwarder","message","removeEventListener","active","events","globalThis","Map","BroadcastedAndLocalEvent","Observable","bc","BroadcastChannel","super","subscriber","onCustomEvent","detail","onMessageEvent","unsubscribe","has","get","set","addListener","err","listeners","idx","indexOf","splice","removeListener","dispatch","CustomEvent","isFunction","operate","init","lift","hasLift","liftedSource","isArrayLike","x","isPromise","createImpl","ctorFunc","UnsubscriptionError","_super","errors","map","toString","join","instance","Error","stack","arrRemove","arr","item","index","Subscription","initialTeardown","closed","_parentage","_finalizers","empty","e_1","e_2","isArray","_parentage_1","_parentage_1_1","remove","e_1_1","initialFinalizer","_finalizers_1","_finalizers_1_1","finalizer","execFinalizer","e_2_1","add","teardown","_hasParent","_addParent","parent","includes","_removeParent","EMPTY","isSubscription","config","onUnhandledError","onStoppedNotification","undefined","useDeprecatedSynchronousErrorHandling","useDeprecatedNextContext","timeoutProvider","setTimeout","handler","timeout","args","_i","delegate","clearTimeout","handle","reportUnhandledError","noop","Subscriber","destination","_this","isStopped","EMPTY_OBSERVER","complete","SafeSubscriber","_next","_error","_complete","_bind","Function","bind","fn","ConsumerObserver","partialObserver","handleUnhandledError","observerOrNext","context_1","observable","identity","_subscribe","operator","isObserver","_trySubscribe","cb","sink","promiseCtor","getPromiseCtor","Symbol_observable","pipe","fns","operations","input","reduce","prev","toPromise","isInteropObservable","isAsyncIterable","obj","createInvalidObservableTypeError","isIterable","Symbol_iterator","readableStreamLikeToAsyncGenerator","readableStream","reader","getReader","read","releaseLock","isReadableStreamLike","innerFrom","obs","array","promise","fromAsyncIterable","iterable","iterable_1","iterable_1_1","asyncIterable","asyncIterable_1","asyncIterable_1_1","process","catch","createOperatorSubscriber","onNext","onComplete","onError","onFinalize","OperatorSubscriber","shouldUnsubscribe","closed_1","Action","scheduler","work","schedule","state","delay","intervalProvider","setInterval","clearInterval","AsyncAction","pending","recycleAsyncId","requestAsyncId","_id","flush","_scheduler","execute","_execute","_delay","errorValue","errored","actions","dateTimestampProvider","now","Scheduler","schedulerActionCtor","asyncScheduler","AsyncScheduler","SchedulerAction","_active","_scheduled","action","async","isScheduler","timer","dueTime","intervalOrScheduler","intervalDuration","due","isNaN","popScheduler","executeSchedule","parentSubscription","repeat","scheduleSubscription","catchError","selector","handledResult","innerSub","syncUnsub","observeOn","subscribeOn","scheduleAsyncIterable","scheduled","scheduleObservable","scheduleArray","schedulePromise","scheduleIterable","scheduleReadableStreamLike","project","mergeMap","resultSelector","concurrent","Infinity","ii","onBeforeNext","expand","innerSubScheduler","additionalFinalizer","buffer","isComplete","checkComplete","outerNext","doInnerSub","innerComplete","innerValue","_loop_1","bufferedValue","mergeInternals","concatAll","debounceTime","activeTask","lastValue","lastTime","emit","emitWhenIdle","targetTime","take","count","seen","delayWhen","delayDurationSelector","subscriptionDelay","mapTo","duration","distinctUntilChanged","comparator","keySelector","defaultCompare","previousKey","first","currentKey","filter","predicate","skip","startWith","values","switchMap","innerSubscriber","innerIndex","outerIndex","tap","tapObserver","isUnsub","finalize","hasComplainedAboutSyncEvent","registerSyncEvent","db","purpose","sw","sync","register","dbName","triggerSync","cloud","usingServiceWorker","localSyncEvent","hasArrayBufferFromBase64","Uint8Array","hasArrayBufferToBase64","b64decode","Buffer","base64","fromBase64","binary_string","atob","len","bytes","charCodeAt","b64encode","ArrayBuffer","isView","byteOffset","byteLength","toBase64","u8a","strs","chunk","subarray","fromCharCode","btoa","computeRealmSetHash","realms","inviteRealms","JSON","stringify","realmId","accepted","sort","byteArray","TextEncoder","encode","digestBytes","crypto","subtle","digest","getSyncableTables","entries","schema","markedForSync","tbl","tables","cloudTableSchema","getMutationTable","tableName","getTableFromMutationTable","mutationTable","exec","flatten","listClientChanges","mutationTables_1","db_1","mutationTables","since","limit","sorted","all","lastRevision","query","where","above","toArray","mut","table","txid","opNo","ts","currentEntry","currentTxid","muts","randomString","buf","getRandomValues","Math","floor","random","_hasOwn","setByKeyPath","keyPath","isFrozen","assert","period","currentKeyPath","substr","remainingKeyPath","parseInt","innerObj","prop","hasOwn","randomFill","simpleRandomFill","alloc","isValidSyncableID","some","key","every","isValidSyncableIDPart","part","applyOperation","target","keys","val","changeSpec","changeSpecs","entry","propPath","assign","mod","applyOperations","abs","max","BIT8","BITS7","MAX_SAFE_INTEGER","Number","isInteger","num","isFinite","math.floor","utf8TextEncoder","encodeUtf8","str","encodedString","unescape","encodeURIComponent","codePointAt","utf8TextDecoder","TextDecoder","fatal","ignoreBOM","decode","Encoder","cpos","cbuf","bufs","write","encoder","bufferLen","writeVarUint","binary.BITS7","binary.BIT8","_strBuffer","_maxStrBSize","writeVarString","string.utf8TextEncoder","encodeInto","written","writeVarUint8Array","string.encodeUtf8","uint8Array","leftCopyLen","math.min","rightCopyLen","math.max","writeUint8Array","writeOnDataView","verifyLen","dview","DataView","writeBigUint64","setBigUint64","floatTestBed","writeAny","number.isInteger","math.abs","isNegative","math.isNegativeZero","writeVarInt","setFloat32","getFloat32","writeFloat32","setFloat64","writeFloat64","setBigInt64","writeBigInt64","array.isArray","encodeYMessage","msg","BigInt","yServerRev","k","u","serverRev","sv","uint8arr","curPos","toUint8Array","errorUnexpectedEndOfArray","error.create","errorIntegerOutOfRange","Decoder","pos","hasContent","decoder","readVarUint8Array","view","readUint8Array","readVarUint","readUint8","mult","number.MAX_SAFE_INTEGER","readVarString","string.utf8TextDecoder","remainingLen","fromCodePoint","nextLen","decodeURIComponent","escape","readFromDataView","dv","readBigUint64","getBigUint64","readAnyLookupTable","sign","getFloat64","getBigInt64","readAny","consumeChunkedBinaryStream","_c","sizeBuf","sizeBufPos","source_1_1","_d","source_1","dw","getUint32","concats","c","TokenErrorResponseError","title","messageCode","messageParams","interactWithUser","userInteraction","req","interactionProps","submitLabel","cancelLabel","onSubmit","res","onCancel","Dexie","AbortError","alertUser","alerts","fields","promptForEmail","emailHint","email","test","placeholder","promptForOTP","alert","otp","loadAccessToken","currentUser","getCurrentUser","accessToken","accessTokenExpiration","refreshToken","refreshTokenExpiration","getTime","license","status","refreshedLogin","refreshAccessToken","options","databaseUrl","update","authenticate","url","context","fetchToken","hints","location","protocol","privateKey","publicKey","generateKey","modulusLength","publicExponent","hash","nonExportablePrivateKey","publicKeyPEM","keydata","keydataB64","finalString","substring","formatAsPem","spkiToPEM","exportKey","response2","public_key","userType","evalDaysLeft","userValidUntil","validUntil","onLine","debug","hostname","origin","userAuthenticate","login","time_stamp","signing_algorithm","binarySignature","signature","tokenRequest","grant_type","refresh_token","scopes","fetch","method","headers","mode","response","json","toStr","ObjectDef","replace","dollarKeys","clone","TypesonSimplified","typeDefsInputs","typeDefs","protoMap","WeakMap","alternateChannel","space","realVal","typeDef","proto","getPrototypeOf","toStringTag","find","typeName","function","getTypeDef","parse","tson","$t","revive","top","deletes","mods","BisonBinaryTypes","Blob","blob","altChannel","mimeType","numberDef","number","bigIntDef","bigint","DateDef","date","toISOString","NaN","SetDef","Set","MapDef","_global","global","TypedArraysDefs","specs","TypedArray","b64LexEncode","encoded","ENCODE_TABLE","b64ToLex","b64LexDecode","b64Lex","base64lex","DECODE_TABLE","lexToB64","A","B","C","D","E","F","G","H","I","J","K","L","M","N","O","Q","R","S","T","U","V","W","X","Y","Z","h","j","w","z","ArrayBufferDef","ab","ba","FakeBlob","readBlobSync","XMLHttpRequest","overrideMimeType","open","URL","createObjectURL","send","responseText","string2ArrayBuffer","BlobDef","builtin","bigintDef","readBlobBinary","FileReader","onabort","onerror","onload","readAsArrayBuffer","undefinedDef","FileDef","File","file","lastModified","hasBigIntSupport","FakeBigInt","fakeBigInt","defs","PropModification","propModification","propModSpec","getOwnPropertySymbols","propertyIsEnumerable","__rest","TSON","tsonBuiltinDefs","BISON","toBinary","lenBuf","setUint32","size","binaries","binData","arrayBuffers","fromBinary","readAsText","readBlob","Bison","HttpError","statusText","httpStatus","encodeIdsForServer","changes","rv","change","tableSchema","primaryKey","changeClone","mutIndex","rewriteValues","outbound","keyIndex","cloneChange","mutClone","rewrittenKey","isLoggedIn","syncRatelimitDelays","checkSyncRateLimitDelay","delatMilliseconds","syncWithServer","syncState","baseRevs","clientIdentity","Accept","updatedUser","Authorization","syncRequest","dbID","remoteDbId","lastPull","serverRevision","yServerRevision","dx","core","dxcv","version","syncStateChangedEvent","phase","credentials","remaining","reset","limitNum","remainingNum","willResetInSeconds","ceil","delete","updateSyncRateLimitDelays","ok","text","throwIfCancelled","cancelToken","cancelled","isOnline","updateBaseRevs","latestRevisions","$baseRevs","bulkPut","clientRev","getLatestRevisionsPerTable","clientChangeSet","lastRevisions","lastRev","rev","bulkUpdate","objs","bulkGet","resultKeys","resultObjs","primKey","cmp","applyServerChanges","_allTables","keyDecoder","endsWith","currentUserId","bulkAdd","anyOf","modify","bulkDelete","DEXIE_CLOUD_SYNCER_ID","listUpdatesSince","yTable","sinceIncluding","between","$Y","_options","getUpdatesTable","ydocProp","utbl","yProps","updatesTable","applyYServerMessages","yMessages","receivedUntils","resyncNeeded","updateRow","transaction","tx","syncer","put","unsentFrom","idbtrans","_rejecting_y_ypdate","aboveOrEqual","activeDoc","DexieYProvider","getDocCache","destroy","doc","isSynced","BINSTREAM_TYPE_REALMID","BINSTREAM_TYPE_TABLE_AND_PROP","BINSTREAM_TYPE_DOCUMENT","downloadYDocsFromServer","databaseUrl_1","yDownloadedRealms","user","downloadedRealms","stages","result_1_1","result_1","asyncIterablePipeline","getFetchResponseBodyGenerator","chunks","currentRealmId","currentTable","currentProp","docsToInsert","storeCollectedDocs","completedRealm","lastDoc","$syncState","chunks_1_1","chunks_1","DexieError","CURRENT_SYNC_WORKER","syncOptions","_sync","justCheckIfNeeded","retryImmediatelyOnFetchError","timestamp","options_1","schema_1","isInitialSync","tablesToSync","persistedSyncState","getPersistedSyncState","readyForSyncification","tablesToSyncify","syncedTables","getTablesToSyncify","doSyncify","disableChangeTracking","disableAccessControl","syncifiedTables","alreadySyncedRealms","ignoredRealms","toCollection","member","realm","owner","modifyLocalObjectsWithNewUserId","lastUpdateIds","clientChanges","yResults","yProp","receivedUntil","unsyncedFrom","min","updates","perDoc","isLocal","docKey","mergedUpdate","mergeUpdatesV2","stateVector","encodeStateVectorFromUpdateV2","listYClientMessagesAndStateVector","syncificationInserts","extractKey","dexieCloudTableSchema","generatedGlobalId","idPrefix","unsyncedObjects","listSyncifiedChanges","pushSyncIsNeeded","newSyncState","addedClientChanges","mutTable","ch","latestRev","belowOrEqual","reverse","offset","clear","deletedRealms","rejectedRealms","previousRealmSet","previousInviteRealmSet","updatedRealmSet","updatedTotalRealmSet","realmsToDelete","indexes","deleteObjectsFromRemovedRealms","dbId","initiallySynced","filteredChanges","filterServerChangesThroughAddedClientChanges","lastUpdateIdsBeforeSync","receivedUntilsAfterSync","mergedSpec","lastUpdateId","allYTables","_dbSchema","tblSchema","flat","mergedEntry","_e","primaryKeys","updateYSyncStates","usingYProps","serverSupportsYprops","syncCompleteEvent","serverChanges","localPostChanges","changesToSubtract","mutationSet","targetMut","subtractChanges","inSet","mapEntry","resultEntry","optype","toDBOperationSet","LIMIT_NUM_MESSAGES_PER_TIME","TIME_WINDOW","PAUSE_PERIOD","MessagesFromServerConsumer","queue","readyToServe","BehaviorSubject","event","isWorking","loopDetection","fill","firstValueFrom","wait","_f","getSchema","baseRev","waitFor","realmSetHash","newRev","consumeQueue","enqueue","wm","DEXIE_CLOUD_SCHEMA","members","roles","$jobs","$logins","static_counter","DexieCloudDB","Subject","close","helperMethods","logins","getOptions","setInitiallySynced","reconfigure","messageConsumer","messageProducer","AuthPersistedContext","userLogin","load","save","waitUntil","logout","numUnsyncedChanges","_logout","confirmLogout","deleteUnsyncedData","numUnsynced","loggedOut","storeNames","sumUnSynced","prodLog","level","origUserId","fetchTokens","demo_user","otpId","otp_id","res1","errMsg","tokenRequest2","res2","errorText","otpFetchTokenCallback","existingLogins","setCurrentUser","isFirefox","InstallTrigger","isSafari","userAgent","safariVersion","match","DISABLE_SERVICEWORKER_STRATEGY","IS_SERVICE_WORKER","getEffectiveKeys","consonants","time","prefix","shardKey","timePart","randomPart","createIdGenerationMiddleware","mutate","trans","getMany","cache","results","valueClones","colocatedId","deepClone","ConstraintError","generateOrVerifyAtKeys","counter","readLock","readers","writers","numWriters","finally","writeLock","possiblePromises","reason","outstandingTransactions","isEagerSyncDisabled","disableEagerSync","createMutationTrackingMiddleware","currentUserObservable","allTableNames","ordinaryTables","mutTableMap","mutationTableName","opCount","removeTransaction","txComplete","mutationsAdded","mutsTable","openCursor","guardedTable","range","mutateAndLog","criteria","unsyncedProps","unsyncedProperties","stripChangeSpec","numFailures","hasFailures","failures","newValue","strippedChangeSpecs","newUpdates","validKeys","RangeSet","anyChangeSpecBecameEmpty","addKey","newKeys","newValues","hasKey","keyPaths","isAdditionalChunk","overrideParseStoresSpec","origFunc","dexie","stores","dbSchema","storesClone","schemaSrc","requestedIndexes","split","spec","trim","builtInIndexes","requestedIndexSet","builtInIndex","cloudSchema","allPrefixes","toLocaleLowerCase","toLowerCase","orig","bits","bitFix","upperFixed","toUpperCase","nextChar","generateTablePrefix","deleted","performGuardedJob","jobName","job","locks","request","userIsActive","userIsReallyActive","isActive","of","visibilityStateIsChanged","fromEvent","documentBecomesHidden","visibilityState","documentBecomesVisible","userDoesSomething","window","merge","USER_INACTIVITY_TIMEOUT","TokenExpiredError","getAwarenessLibrary","awarenessProtocol","MissingAPIError","awarenessWeakMap","getOpenDocSignal","signal","WSObservable","yrev","webSocketStatus","WSConnection","subscriptions","reconnecting","lastUserActivity","connect","disconnect","pinger","ws","reconnect","lastServerActivity","pauseUntil","tokenExpiration","wsUrl","searchParams","URLSearchParams","WebSocket","binaryType","onclose","onmessage","decodeYMessage","awareness","getDocAwareness","applyAwarenessUpdate","everConnected","onopen","yTableRecords","yTbl","currentUnsentFrom","liveQuery","addedUpdates","at","messages","createYClientUpdateObservable","InvalidLicenseError","waitAndReconnectWhenUserDoesSomething","ms","isSyncNeeded","ongoingSyncs","syncIfPossible","cloudOptions","ongoing","pull","hasPullTakenPlace","subscription","_syncIfPossible","SECONDS","LocalSyncWorker","localSyncEventSubscription","nextRetryTime","syncStartTime","syncAndRetry","retryNum","pullSignalled","stop","pushSignalled","ongoingSync","retryIn","consumer","start","updateSchemaFromOptions","unsyncedTables","parentNode","removeChild","children","defaultProps","props","ref","__k","__b","__e","__d","__c","__h","__v","vnode","base","__r","debounceRendering","__P","__n","ownerSVGElement","appendChild","nextSibling","insertBefore","$","setProperty","style","cssText","setAttribute","removeAttribute","contextType","__E","render","__s","getDerivedStateFromProps","componentWillMount","componentDidMount","componentWillReceiveProps","shouldComponentUpdate","componentWillUpdate","componentDidUpdate","getChildContext","getSnapshotBeforeUpdate","diffed","localName","nodeType","createTextNode","createElementNS","createElement","is","childNodes","dangerouslySetInnerHTML","attributes","__html","innerHTML","checked","current","unmount","componentWillUnmount","firstChild","getDerivedStateFromError","setState","componentDidCatch","forceUpdate","Styles","color","Alert","fontWeight","warning","info","Darken","position","left","opacity","backgroundColor","width","height","zIndex","webkitBackdropFilter","backdropFilter","DialogOuter","alignItems","display","justifyContent","DialogInner","padding","marginBottom","maxWidth","maxHeight","overflowY","border","borderRadius","boxShadow","fontFamily","Input","borderColor","outline","fontSize","Dialog","className","__H","__V","__N","requestAnimationFrame","cancelAnimationFrame","LoginDialog","params","setParams","useState","firstFieldRef","useRef","useLayoutEffect","focus","Fragment","WindowHeader","resolveText","preventDefault","fieldName","Label","autoComplete","autoFocus","onInput","valueTransformer","updatedParams","ButtonsDiv","Button","onClick","LoginGui","Component","observer","associate","factory","getCurrentUserEmitter","createSharedValueObservable","defaultValue","currentValue","shared","share","resetOnRefCountZero","didEmit","getValue","getGlobalRolesObservable","role","sortOrder","getInternalAccessControlObservable","_novip","selfMembers","mergePermissions","permissions","reduced","ret","rights","retVerb","mergedRights","tableRights","getPermissionsLookupObservable","mapper","mapValueObservable","combineLatest","globalRoles","selfRealmMembers","directPermissionSets","rolePermissionSets","roleName","manage","PermissionChecker","isOwner","tableNames","tablePermissions","permittedProp","getInvitesObservable","membersByEmail","accessControl","realmLookup","reducer","emailMembersById","membersById","invite","accept","createYHandler","provider","parentTable","meta","defineProperty","parentId","parentProp","awap","Awareness","reopenDocSignal","on","added","updated","removed","changedClients","encodeAwarenessUpdate","destroyed","removeAwarenessStates","clientID","connected","currentFlowId","wsStatus","openDocumentOnServer","myFlow","syncStateTbl","docOpenMsg","serverUpdatesSinceLastSync","addCleanupHandler","createAwareness","DEFAULT_OPTIONS","nameSuffix","dexieCloud","origIdbName","currentUserEmitter","configuredProgramatically","localSyncWorker","customLoginGui","el","preact.render","vip","setupDefaultGUI","isServiceWorkerDB","_prevStatus","lazyWebSocketStatus","prevStatus","progress","adjustedStatus","computeSyncState","syncComplete","SchemaError","throwVersionIncrementNeeded","swRegistrations","getRegistrations","lastSyncedRealms","persistedOptions","persistedSchema","newPersistedOptions","tryUseServiceWorker","newPersistedSchema","newTblSchema","auto","verifySchema","throwIfClosed","yHandler","once","changedUser","requireAuth","doInitialSync","performInitialSync","periodicSync","registerPeriodicSyncEvent","_g","disableWebSocket","readyForChangesMessage","isReady","createObservable","prevUser","prevHash","currUser","currHash","throwError","connectWebSocket","onDbReady","DatabaseClosedError","hint","invites","configure","dbUrl","pathname","getDbNameFromDbUrl","force","syncNeeded","isNeeded","permissionsLookup","Version","override","Table","newId","colocateWith","use","$ts","Cloud","managedDBs","getDbNameFromTag","tag","syncDBSemaphore","syncDB","_syncDB","addons","stopManagingDB","errnames","NoSuchDatabase","versionchange"],"mappings":"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","x_google_ignoreList":[0,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,70,71,74,86,87,88,89,90,91,93,94,99,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,181,184]}
|
|
1
|
+
{"version":3,"file":"service-worker.min.js","sources":["../../../../node_modules/.pnpm/@rollup+plugin-typescript@11.1.5_rollup@4.1.4_tslib@2.4.0_typescript@5.6.3/node_modules/tslib/tslib.es6.js","../../src/authentication/UNAUTHORIZED_USER.ts","../../src/helpers/SWBroadcastChannel.ts","../../src/helpers/BroadcastedAndLocalEvent.ts","../../../../node_modules/.pnpm/rxjs@7.5.6/node_modules/rxjs/dist/esm5/internal/util/isFunction.js","../../../../node_modules/.pnpm/rxjs@7.5.6/node_modules/rxjs/dist/esm5/internal/util/lift.js","../../../../node_modules/.pnpm/rxjs@7.5.6/node_modules/rxjs/dist/esm5/internal/util/isArrayLike.js","../../../../node_modules/.pnpm/rxjs@7.5.6/node_modules/rxjs/dist/esm5/internal/util/isPromise.js","../../../../node_modules/.pnpm/rxjs@7.5.6/node_modules/rxjs/dist/esm5/internal/util/UnsubscriptionError.js","../../../../node_modules/.pnpm/rxjs@7.5.6/node_modules/rxjs/dist/esm5/internal/util/createErrorClass.js","../../../../node_modules/.pnpm/rxjs@7.5.6/node_modules/rxjs/dist/esm5/internal/util/arrRemove.js","../../../../node_modules/.pnpm/rxjs@7.5.6/node_modules/rxjs/dist/esm5/internal/Subscription.js","../../../../node_modules/.pnpm/rxjs@7.5.6/node_modules/rxjs/dist/esm5/internal/config.js","../../../../node_modules/.pnpm/rxjs@7.5.6/node_modules/rxjs/dist/esm5/internal/scheduler/timeoutProvider.js","../../../../node_modules/.pnpm/rxjs@7.5.6/node_modules/rxjs/dist/esm5/internal/util/reportUnhandledError.js","../../../../node_modules/.pnpm/rxjs@7.5.6/node_modules/rxjs/dist/esm5/internal/util/noop.js","../../../../node_modules/.pnpm/rxjs@7.5.6/node_modules/rxjs/dist/esm5/internal/Subscriber.js","../../../../node_modules/.pnpm/rxjs@7.5.6/node_modules/rxjs/dist/esm5/internal/symbol/observable.js","../../../../node_modules/.pnpm/rxjs@7.5.6/node_modules/rxjs/dist/esm5/internal/util/identity.js","../../../../node_modules/.pnpm/rxjs@7.5.6/node_modules/rxjs/dist/esm5/internal/Observable.js","../../../../node_modules/.pnpm/rxjs@7.5.6/node_modules/rxjs/dist/esm5/internal/util/errorContext.js","../../../../node_modules/.pnpm/rxjs@7.5.6/node_modules/rxjs/dist/esm5/internal/util/pipe.js","../../../../node_modules/.pnpm/rxjs@7.5.6/node_modules/rxjs/dist/esm5/internal/util/isInteropObservable.js","../../../../node_modules/.pnpm/rxjs@7.5.6/node_modules/rxjs/dist/esm5/internal/util/isAsyncIterable.js","../../../../node_modules/.pnpm/rxjs@7.5.6/node_modules/rxjs/dist/esm5/internal/util/throwUnobservableError.js","../../../../node_modules/.pnpm/rxjs@7.5.6/node_modules/rxjs/dist/esm5/internal/symbol/iterator.js","../../../../node_modules/.pnpm/rxjs@7.5.6/node_modules/rxjs/dist/esm5/internal/util/isIterable.js","../../../../node_modules/.pnpm/rxjs@7.5.6/node_modules/rxjs/dist/esm5/internal/util/isReadableStreamLike.js","../../../../node_modules/.pnpm/rxjs@7.5.6/node_modules/rxjs/dist/esm5/internal/observable/innerFrom.js","../../../../node_modules/.pnpm/rxjs@7.5.6/node_modules/rxjs/dist/esm5/internal/operators/OperatorSubscriber.js","../../../../node_modules/.pnpm/rxjs@7.5.6/node_modules/rxjs/dist/esm5/internal/scheduler/Action.js","../../../../node_modules/.pnpm/rxjs@7.5.6/node_modules/rxjs/dist/esm5/internal/scheduler/intervalProvider.js","../../../../node_modules/.pnpm/rxjs@7.5.6/node_modules/rxjs/dist/esm5/internal/scheduler/AsyncAction.js","../../../../node_modules/.pnpm/rxjs@7.5.6/node_modules/rxjs/dist/esm5/internal/scheduler/dateTimestampProvider.js","../../../../node_modules/.pnpm/rxjs@7.5.6/node_modules/rxjs/dist/esm5/internal/Scheduler.js","../../../../node_modules/.pnpm/rxjs@7.5.6/node_modules/rxjs/dist/esm5/internal/scheduler/async.js","../../../../node_modules/.pnpm/rxjs@7.5.6/node_modules/rxjs/dist/esm5/internal/scheduler/AsyncScheduler.js","../../../../node_modules/.pnpm/rxjs@7.5.6/node_modules/rxjs/dist/esm5/internal/util/isScheduler.js","../../../../node_modules/.pnpm/rxjs@7.5.6/node_modules/rxjs/dist/esm5/internal/observable/timer.js","../../../../node_modules/.pnpm/rxjs@7.5.6/node_modules/rxjs/dist/esm5/internal/util/isDate.js","../../../../node_modules/.pnpm/rxjs@7.5.6/node_modules/rxjs/dist/esm5/internal/util/args.js","../../../../node_modules/.pnpm/rxjs@7.5.6/node_modules/rxjs/dist/esm5/internal/util/executeSchedule.js","../../../../node_modules/.pnpm/rxjs@7.5.6/node_modules/rxjs/dist/esm5/internal/operators/catchError.js","../../../../node_modules/.pnpm/rxjs@7.5.6/node_modules/rxjs/dist/esm5/internal/operators/observeOn.js","../../../../node_modules/.pnpm/rxjs@7.5.6/node_modules/rxjs/dist/esm5/internal/operators/subscribeOn.js","../../../../node_modules/.pnpm/rxjs@7.5.6/node_modules/rxjs/dist/esm5/internal/scheduled/scheduleAsyncIterable.js","../../../../node_modules/.pnpm/rxjs@7.5.6/node_modules/rxjs/dist/esm5/internal/scheduled/scheduled.js","../../../../node_modules/.pnpm/rxjs@7.5.6/node_modules/rxjs/dist/esm5/internal/scheduled/scheduleObservable.js","../../../../node_modules/.pnpm/rxjs@7.5.6/node_modules/rxjs/dist/esm5/internal/scheduled/scheduleArray.js","../../../../node_modules/.pnpm/rxjs@7.5.6/node_modules/rxjs/dist/esm5/internal/scheduled/schedulePromise.js","../../../../node_modules/.pnpm/rxjs@7.5.6/node_modules/rxjs/dist/esm5/internal/scheduled/scheduleIterable.js","../../../../node_modules/.pnpm/rxjs@7.5.6/node_modules/rxjs/dist/esm5/internal/scheduled/scheduleReadableStreamLike.js","../../../../node_modules/.pnpm/rxjs@7.5.6/node_modules/rxjs/dist/esm5/internal/operators/map.js","../../../../node_modules/.pnpm/rxjs@7.5.6/node_modules/rxjs/dist/esm5/internal/operators/mergeMap.js","../../../../node_modules/.pnpm/rxjs@7.5.6/node_modules/rxjs/dist/esm5/internal/operators/mergeInternals.js","../../../../node_modules/.pnpm/rxjs@7.5.6/node_modules/rxjs/dist/esm5/internal/operators/concatAll.js","../../../../node_modules/.pnpm/rxjs@7.5.6/node_modules/rxjs/dist/esm5/internal/operators/mergeAll.js","../../../../node_modules/.pnpm/rxjs@7.5.6/node_modules/rxjs/dist/esm5/internal/operators/debounceTime.js","../../../../node_modules/.pnpm/rxjs@7.5.6/node_modules/rxjs/dist/esm5/internal/observable/concat.js","../../../../node_modules/.pnpm/rxjs@7.5.6/node_modules/rxjs/dist/esm5/internal/observable/from.js","../../../../node_modules/.pnpm/rxjs@7.5.6/node_modules/rxjs/dist/esm5/internal/observable/empty.js","../../../../node_modules/.pnpm/rxjs@7.5.6/node_modules/rxjs/dist/esm5/internal/operators/take.js","../../../../node_modules/.pnpm/rxjs@7.5.6/node_modules/rxjs/dist/esm5/internal/operators/delayWhen.js","../../../../node_modules/.pnpm/rxjs@7.5.6/node_modules/rxjs/dist/esm5/internal/operators/ignoreElements.js","../../../../node_modules/.pnpm/rxjs@7.5.6/node_modules/rxjs/dist/esm5/internal/operators/mapTo.js","../../../../node_modules/.pnpm/rxjs@7.5.6/node_modules/rxjs/dist/esm5/internal/operators/delay.js","../../../../node_modules/.pnpm/rxjs@7.5.6/node_modules/rxjs/dist/esm5/internal/operators/distinctUntilChanged.js","../../../../node_modules/.pnpm/rxjs@7.5.6/node_modules/rxjs/dist/esm5/internal/operators/filter.js","../../../../node_modules/.pnpm/rxjs@7.5.6/node_modules/rxjs/dist/esm5/internal/operators/skip.js","../../../../node_modules/.pnpm/rxjs@7.5.6/node_modules/rxjs/dist/esm5/internal/operators/startWith.js","../../../../node_modules/.pnpm/rxjs@7.5.6/node_modules/rxjs/dist/esm5/internal/operators/switchMap.js","../../../../node_modules/.pnpm/rxjs@7.5.6/node_modules/rxjs/dist/esm5/internal/operators/tap.js","../../src/sync/registerSyncEvent.ts","../../src/sync/triggerSync.ts","../../../../node_modules/.pnpm/dreambase-library@1.0.26/node_modules/dreambase-library/dist/common/base64.js","../../src/helpers/computeRealmSetHash.ts","../../src/helpers/getSyncableTables.ts","../../src/helpers/getMutationTable.ts","../../src/helpers/getTableFromMutationTable.ts","../../src/helpers/flatten.ts","../../src/sync/listClientChanges.ts","../../src/helpers/randomString.ts","../../../../libs/dexie-cloud-common/dist/utils.js","../../../../libs/dexie-cloud-common/dist/validation/isValidSyncableID.js","../../../../libs/dexie-cloud-common/dist/change-processing/applyOperation.js","../../../../libs/dexie-cloud-common/dist/change-processing/applyOperations.js","../../../../node_modules/.pnpm/lib0@0.2.97/node_modules/lib0/math.js","../../../../node_modules/.pnpm/lib0@0.2.97/node_modules/lib0/binary.js","../../../../node_modules/.pnpm/lib0@0.2.97/node_modules/lib0/number.js","../../../../node_modules/.pnpm/lib0@0.2.97/node_modules/lib0/array.js","../../../../node_modules/.pnpm/lib0@0.2.97/node_modules/lib0/string.js","../../../../node_modules/.pnpm/lib0@0.2.97/node_modules/lib0/encoding.js","../../../../libs/dexie-cloud-common/dist/yjs/encoding.js","../../../../node_modules/.pnpm/lib0@0.2.97/node_modules/lib0/error.js","../../../../node_modules/.pnpm/lib0@0.2.97/node_modules/lib0/decoding.js","../../../../libs/dexie-cloud-common/dist/async-generators/consumeChunkedBinaryStream.js","../../src/authentication/TokenErrorResponseError.ts","../../src/authentication/interactWithUser.ts","../../src/authentication/authenticate.ts","../../../../node_modules/.pnpm/dreambase-library@1.0.26/node_modules/dreambase-library/dist/typeson-simplified/TypesonSimplified.js","../../../../node_modules/.pnpm/dreambase-library@1.0.26/node_modules/dreambase-library/dist/typeson-simplified/BisonBinaryTypes.js","../../../../node_modules/.pnpm/dreambase-library@1.0.26/node_modules/dreambase-library/dist/typeson-simplified/types/number.js","../../../../node_modules/.pnpm/dreambase-library@1.0.26/node_modules/dreambase-library/dist/typeson-simplified/types/bigint.js","../../../../node_modules/.pnpm/dreambase-library@1.0.26/node_modules/dreambase-library/dist/typeson-simplified/types/Date.js","../../../../node_modules/.pnpm/dreambase-library@1.0.26/node_modules/dreambase-library/dist/typeson-simplified/types/Set.js","../../../../node_modules/.pnpm/dreambase-library@1.0.26/node_modules/dreambase-library/dist/typeson-simplified/types/Map.js","../../../../node_modules/.pnpm/dreambase-library@1.0.26/node_modules/dreambase-library/dist/common/_global.js","../../../../node_modules/.pnpm/dreambase-library@1.0.26/node_modules/dreambase-library/dist/typeson-simplified/types/TypedArray.js","../../../../node_modules/.pnpm/dreambase-library@1.0.26/node_modules/dreambase-library/dist/common/b64lex.js","../../../../node_modules/.pnpm/dreambase-library@1.0.26/node_modules/dreambase-library/dist/typeson-simplified/types/ArrayBuffer.js","../../../../node_modules/.pnpm/dreambase-library@1.0.26/node_modules/dreambase-library/dist/typeson-simplified/FakeBlob.js","../../../../node_modules/.pnpm/dreambase-library@1.0.26/node_modules/dreambase-library/dist/typeson-simplified/readBlobSync.js","../../../../node_modules/.pnpm/dreambase-library@1.0.26/node_modules/dreambase-library/dist/typeson-simplified/string2ArrayBuffer.js","../../../../node_modules/.pnpm/dreambase-library@1.0.26/node_modules/dreambase-library/dist/typeson-simplified/types/Blob.js","../../../../node_modules/.pnpm/dreambase-library@1.0.26/node_modules/dreambase-library/dist/typeson-simplified/presets/builtin.js","../../../../node_modules/.pnpm/dreambase-library@1.0.26/node_modules/dreambase-library/dist/typeson-simplified/Bison.js","../../../../node_modules/.pnpm/dreambase-library@1.0.26/node_modules/dreambase-library/dist/typeson-simplified/types/undefined.js","../../../../node_modules/.pnpm/dreambase-library@1.0.26/node_modules/dreambase-library/dist/typeson-simplified/types/File.js","../../src/TSON.ts","../../src/errors/HttpError.ts","../../src/sync/encodeIdsForServer.ts","../../src/sync/ratelimit.ts","../../src/sync/syncWithServer.ts","../../src/helpers/CancelToken.ts","../../src/sync/isOnline.ts","../../src/sync/updateBaseRevs.ts","../../src/sync/getLatestRevisionsPerTable.ts","../../src/helpers/bulkUpdate.ts","../../src/sync/applyServerChanges.ts","../../src/sync/DEXIE_CLOUD_SYNCER_ID.ts","../../src/yjs/listUpdatesSince.ts","../../../../node_modules/.pnpm/lib0@0.2.99/node_modules/lib0/map.js","../../../../node_modules/.pnpm/lib0@0.2.99/node_modules/lib0/set.js","../../../../node_modules/.pnpm/lib0@0.2.99/node_modules/lib0/array.js","../../../../node_modules/.pnpm/lib0@0.2.99/node_modules/lib0/observable.js","../../../../node_modules/.pnpm/lib0@0.2.99/node_modules/lib0/math.js","../../../../node_modules/.pnpm/lib0@0.2.99/node_modules/lib0/binary.js","../../../../node_modules/.pnpm/lib0@0.2.99/node_modules/lib0/number.js","../../../../node_modules/.pnpm/lib0@0.2.99/node_modules/lib0/string.js","../../../../node_modules/.pnpm/lib0@0.2.99/node_modules/lib0/encoding.js","../../../../node_modules/.pnpm/lib0@0.2.99/node_modules/lib0/error.js","../../../../node_modules/.pnpm/lib0@0.2.99/node_modules/lib0/decoding.js","../../../../node_modules/.pnpm/lib0@0.2.99/node_modules/lib0/webcrypto.js","../../../../node_modules/.pnpm/lib0@0.2.99/node_modules/lib0/random.js","../../../../node_modules/.pnpm/lib0@0.2.99/node_modules/lib0/promise.js","../../../../node_modules/.pnpm/lib0@0.2.99/node_modules/lib0/conditions.js","../../../../node_modules/.pnpm/lib0@0.2.99/node_modules/lib0/storage.js","../../../../node_modules/.pnpm/lib0@0.2.99/node_modules/lib0/object.js","../../../../node_modules/.pnpm/lib0@0.2.99/node_modules/lib0/function.js","../../../../node_modules/.pnpm/lib0@0.2.99/node_modules/lib0/environment.js","../../../../node_modules/.pnpm/lib0@0.2.99/node_modules/lib0/pair.js","../../../../node_modules/.pnpm/lib0@0.2.99/node_modules/lib0/dom.js","../../../../node_modules/.pnpm/lib0@0.2.99/node_modules/lib0/symbol.js","../../../../node_modules/.pnpm/lib0@0.2.99/node_modules/lib0/logging.common.js","../../../../node_modules/.pnpm/lib0@0.2.99/node_modules/lib0/logging.js","../../../../node_modules/.pnpm/lib0@0.2.99/node_modules/lib0/iterator.js","../../../../node_modules/.pnpm/yjs@13.6.27/node_modules/yjs/dist/yjs.mjs","../../src/yjs/getUpdatesTable.ts","../../../y-dexie/dist/y-dexie.js","../../src/yjs/applyYMessages.ts","../../src/yjs/downloadYDocsFromServer.ts","../../../../libs/dexie-cloud-common/dist/async-generators/asyncIterablePipeline.js","../../../../libs/dexie-cloud-common/dist/async-generators/getFetchResponseBodyGenerator.js","../../src/sync/sync.ts","../../src/sync/getTablesToSyncify.ts","../../src/sync/modifyLocalObjectsWithNewUserId.ts","../../src/yjs/listYClientMessagesAndStateVector.ts","../../src/sync/listSyncifiedChanges.ts","../../src/yjs/updateYSyncStates.ts","../../../../libs/dexie-cloud-common/dist/change-processing/subtractChanges.js","../../../../libs/dexie-cloud-common/dist/change-processing/toDBOperationSet.js","../../src/sync/messagesFromServerQueue.ts","../../src/db/DexieCloudDB.ts","../../src/authentication/AuthPersistedContext.ts","../../src/authentication/waitUntil.ts","../../src/authentication/logout.ts","../../src/prodLog.ts","../../src/authentication/login.ts","../../src/authentication/otpFetchTokenCallback.ts","../../src/authentication/setCurrentUser.ts","../../src/isFirefox.ts","../../src/isSafari.ts","../../src/DISABLE_SERVICEWORKER_STRATEGY.ts","../../src/helpers/IS_SERVICE_WORKER.ts","../../src/middleware-helpers/idGenerationHelpers.ts","../../src/middlewares/createIdGenerationMiddleware.ts","../../src/middleware-helpers/guardedTable.ts","../../src/helpers/allSettled.ts","../../src/middlewares/outstandingTransaction.ts","../../src/isEagerSyncDisabled.ts","../../src/middlewares/createMutationTrackingMiddleware.ts","../../src/overrideParseStoresSpec.ts","../../src/sync/performGuardedJob.ts","../../src/userIsActive.ts","../../src/authentication/TokenExpiredError.ts","../../src/yjs/awareness.ts","../../src/yjs/reopenDocSignal.ts","../../src/WSObservable.ts","../../../../libs/dexie-cloud-common/dist/yjs/decoding.js","../../src/yjs/createYClientUpdateObservable.ts","../../src/InvalidLicenseError.ts","../../src/sync/connectWebSocket.ts","../../src/sync/isSyncNeeded.ts","../../src/sync/syncIfPossible.ts","../../src/helpers/date-constants.ts","../../src/sync/LocalSyncWorker.ts","../../src/updateSchemaFromOptions.ts","../../../../node_modules/.pnpm/preact@10.10.6/node_modules/preact/dist/preact.module.js","../../src/default-ui/Styles.ts","../../src/default-ui/Dialog.tsx","../../../../node_modules/.pnpm/preact@10.10.6/node_modules/preact/hooks/dist/hooks.module.js","../../src/default-ui/LoginDialog.tsx","../../src/helpers/resolveText.ts","../../src/default-ui/index.tsx","../../src/associate.ts","../../src/currentUserEmitter.ts","../../src/createSharedValueObservable.ts","../../src/getGlobalRolesObservable.ts","../../src/getInternalAccessControlObservable.ts","../../src/mergePermissions.ts","../../src/getPermissionsLookupObservable.ts","../../src/mapValueObservable.ts","../../src/PermissionChecker.ts","../../src/getInvitesObservable.ts","../../src/yjs/createYHandler.ts","../../src/dexie-cloud-client.ts","../../src/computeSyncState.ts","../../src/helpers/throwVersionIncrementNeeded.ts","../../src/verifySchema.ts","../../src/performInitialSync.ts","../../src/middlewares/createImplicitPropSetterMiddleware.ts","../../../../libs/dexie-cloud-common/dist/getDbNameFromDbUrl.js","../../src/permissions.ts","../../src/service-worker.ts"],"sourcesContent":["/******************************************************************************\r\nCopyright (c) Microsoft Corporation.\r\n\r\nPermission to use, copy, modify, and/or distribute this software for any\r\npurpose with or without fee is hereby granted.\r\n\r\nTHE SOFTWARE IS PROVIDED \"AS IS\" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH\r\nREGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY\r\nAND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT,\r\nINDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM\r\nLOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR\r\nOTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR\r\nPERFORMANCE OF THIS SOFTWARE.\r\n***************************************************************************** */\r\n/* global Reflect, Promise */\r\n\r\nvar extendStatics = function(d, b) {\r\n extendStatics = Object.setPrototypeOf ||\r\n ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||\r\n function (d, b) { for (var p in b) if (Object.prototype.hasOwnProperty.call(b, p)) d[p] = b[p]; };\r\n return extendStatics(d, b);\r\n};\r\n\r\nexport function __extends(d, b) {\r\n if (typeof b !== \"function\" && b !== null)\r\n throw new TypeError(\"Class extends value \" + String(b) + \" is not a constructor or null\");\r\n extendStatics(d, b);\r\n function __() { this.constructor = d; }\r\n d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\r\n}\r\n\r\nexport var __assign = function() {\r\n __assign = Object.assign || function __assign(t) {\r\n for (var s, i = 1, n = arguments.length; i < n; i++) {\r\n s = arguments[i];\r\n for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p)) t[p] = s[p];\r\n }\r\n return t;\r\n }\r\n return __assign.apply(this, arguments);\r\n}\r\n\r\nexport function __rest(s, e) {\r\n var t = {};\r\n for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0)\r\n t[p] = s[p];\r\n if (s != null && typeof Object.getOwnPropertySymbols === \"function\")\r\n for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) {\r\n if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i]))\r\n t[p[i]] = s[p[i]];\r\n }\r\n return t;\r\n}\r\n\r\nexport function __decorate(decorators, target, key, desc) {\r\n var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;\r\n if (typeof Reflect === \"object\" && typeof Reflect.decorate === \"function\") r = Reflect.decorate(decorators, target, key, desc);\r\n else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;\r\n return c > 3 && r && Object.defineProperty(target, key, r), r;\r\n}\r\n\r\nexport function __param(paramIndex, decorator) {\r\n return function (target, key) { decorator(target, key, paramIndex); }\r\n}\r\n\r\nexport function __metadata(metadataKey, metadataValue) {\r\n if (typeof Reflect === \"object\" && typeof Reflect.metadata === \"function\") return Reflect.metadata(metadataKey, metadataValue);\r\n}\r\n\r\nexport function __awaiter(thisArg, _arguments, P, generator) {\r\n function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }\r\n return new (P || (P = Promise))(function (resolve, reject) {\r\n function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }\r\n function rejected(value) { try { step(generator[\"throw\"](value)); } catch (e) { reject(e); } }\r\n function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }\r\n step((generator = generator.apply(thisArg, _arguments || [])).next());\r\n });\r\n}\r\n\r\nexport function __generator(thisArg, body) {\r\n var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g;\r\n return g = { next: verb(0), \"throw\": verb(1), \"return\": verb(2) }, typeof Symbol === \"function\" && (g[Symbol.iterator] = function() { return this; }), g;\r\n function verb(n) { return function (v) { return step([n, v]); }; }\r\n function step(op) {\r\n if (f) throw new TypeError(\"Generator is already executing.\");\r\n while (_) try {\r\n if (f = 1, y && (t = op[0] & 2 ? y[\"return\"] : op[0] ? y[\"throw\"] || ((t = y[\"return\"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t;\r\n if (y = 0, t) op = [op[0] & 2, t.value];\r\n switch (op[0]) {\r\n case 0: case 1: t = op; break;\r\n case 4: _.label++; return { value: op[1], done: false };\r\n case 5: _.label++; y = op[1]; op = [0]; continue;\r\n case 7: op = _.ops.pop(); _.trys.pop(); continue;\r\n default:\r\n if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }\r\n if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }\r\n if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }\r\n if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }\r\n if (t[2]) _.ops.pop();\r\n _.trys.pop(); continue;\r\n }\r\n op = body.call(thisArg, _);\r\n } catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }\r\n if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };\r\n }\r\n}\r\n\r\nexport var __createBinding = Object.create ? (function(o, m, k, k2) {\r\n if (k2 === undefined) k2 = k;\r\n var desc = Object.getOwnPropertyDescriptor(m, k);\r\n if (!desc || (\"get\" in desc ? !m.__esModule : desc.writable || desc.configurable)) {\r\n desc = { enumerable: true, get: function() { return m[k]; } };\r\n }\r\n Object.defineProperty(o, k2, desc);\r\n}) : (function(o, m, k, k2) {\r\n if (k2 === undefined) k2 = k;\r\n o[k2] = m[k];\r\n});\r\n\r\nexport function __exportStar(m, o) {\r\n for (var p in m) if (p !== \"default\" && !Object.prototype.hasOwnProperty.call(o, p)) __createBinding(o, m, p);\r\n}\r\n\r\nexport function __values(o) {\r\n var s = typeof Symbol === \"function\" && Symbol.iterator, m = s && o[s], i = 0;\r\n if (m) return m.call(o);\r\n if (o && typeof o.length === \"number\") return {\r\n next: function () {\r\n if (o && i >= o.length) o = void 0;\r\n return { value: o && o[i++], done: !o };\r\n }\r\n };\r\n throw new TypeError(s ? \"Object is not iterable.\" : \"Symbol.iterator is not defined.\");\r\n}\r\n\r\nexport function __read(o, n) {\r\n var m = typeof Symbol === \"function\" && o[Symbol.iterator];\r\n if (!m) return o;\r\n var i = m.call(o), r, ar = [], e;\r\n try {\r\n while ((n === void 0 || n-- > 0) && !(r = i.next()).done) ar.push(r.value);\r\n }\r\n catch (error) { e = { error: error }; }\r\n finally {\r\n try {\r\n if (r && !r.done && (m = i[\"return\"])) m.call(i);\r\n }\r\n finally { if (e) throw e.error; }\r\n }\r\n return ar;\r\n}\r\n\r\n/** @deprecated */\r\nexport function __spread() {\r\n for (var ar = [], i = 0; i < arguments.length; i++)\r\n ar = ar.concat(__read(arguments[i]));\r\n return ar;\r\n}\r\n\r\n/** @deprecated */\r\nexport function __spreadArrays() {\r\n for (var s = 0, i = 0, il = arguments.length; i < il; i++) s += arguments[i].length;\r\n for (var r = Array(s), k = 0, i = 0; i < il; i++)\r\n for (var a = arguments[i], j = 0, jl = a.length; j < jl; j++, k++)\r\n r[k] = a[j];\r\n return r;\r\n}\r\n\r\nexport function __spreadArray(to, from, pack) {\r\n if (pack || arguments.length === 2) for (var i = 0, l = from.length, ar; i < l; i++) {\r\n if (ar || !(i in from)) {\r\n if (!ar) ar = Array.prototype.slice.call(from, 0, i);\r\n ar[i] = from[i];\r\n }\r\n }\r\n return to.concat(ar || Array.prototype.slice.call(from));\r\n}\r\n\r\nexport function __await(v) {\r\n return this instanceof __await ? (this.v = v, this) : new __await(v);\r\n}\r\n\r\nexport function __asyncGenerator(thisArg, _arguments, generator) {\r\n if (!Symbol.asyncIterator) throw new TypeError(\"Symbol.asyncIterator is not defined.\");\r\n var g = generator.apply(thisArg, _arguments || []), i, q = [];\r\n return i = {}, verb(\"next\"), verb(\"throw\"), verb(\"return\"), i[Symbol.asyncIterator] = function () { return this; }, i;\r\n function verb(n) { if (g[n]) i[n] = function (v) { return new Promise(function (a, b) { q.push([n, v, a, b]) > 1 || resume(n, v); }); }; }\r\n function resume(n, v) { try { step(g[n](v)); } catch (e) { settle(q[0][3], e); } }\r\n function step(r) { r.value instanceof __await ? Promise.resolve(r.value.v).then(fulfill, reject) : settle(q[0][2], r); }\r\n function fulfill(value) { resume(\"next\", value); }\r\n function reject(value) { resume(\"throw\", value); }\r\n function settle(f, v) { if (f(v), q.shift(), q.length) resume(q[0][0], q[0][1]); }\r\n}\r\n\r\nexport function __asyncDelegator(o) {\r\n var i, p;\r\n return i = {}, verb(\"next\"), verb(\"throw\", function (e) { throw e; }), verb(\"return\"), i[Symbol.iterator] = function () { return this; }, i;\r\n function verb(n, f) { i[n] = o[n] ? function (v) { return (p = !p) ? { value: __await(o[n](v)), done: n === \"return\" } : f ? f(v) : v; } : f; }\r\n}\r\n\r\nexport function __asyncValues(o) {\r\n if (!Symbol.asyncIterator) throw new TypeError(\"Symbol.asyncIterator is not defined.\");\r\n var m = o[Symbol.asyncIterator], i;\r\n return m ? m.call(o) : (o = typeof __values === \"function\" ? __values(o) : o[Symbol.iterator](), i = {}, verb(\"next\"), verb(\"throw\"), verb(\"return\"), i[Symbol.asyncIterator] = function () { return this; }, i);\r\n function verb(n) { i[n] = o[n] && function (v) { return new Promise(function (resolve, reject) { v = o[n](v), settle(resolve, reject, v.done, v.value); }); }; }\r\n function settle(resolve, reject, d, v) { Promise.resolve(v).then(function(v) { resolve({ value: v, done: d }); }, reject); }\r\n}\r\n\r\nexport function __makeTemplateObject(cooked, raw) {\r\n if (Object.defineProperty) { Object.defineProperty(cooked, \"raw\", { value: raw }); } else { cooked.raw = raw; }\r\n return cooked;\r\n};\r\n\r\nvar __setModuleDefault = Object.create ? (function(o, v) {\r\n Object.defineProperty(o, \"default\", { enumerable: true, value: v });\r\n}) : function(o, v) {\r\n o[\"default\"] = v;\r\n};\r\n\r\nexport function __importStar(mod) {\r\n if (mod && mod.__esModule) return mod;\r\n var result = {};\r\n if (mod != null) for (var k in mod) if (k !== \"default\" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);\r\n __setModuleDefault(result, mod);\r\n return result;\r\n}\r\n\r\nexport function __importDefault(mod) {\r\n return (mod && mod.__esModule) ? mod : { default: mod };\r\n}\r\n\r\nexport function __classPrivateFieldGet(receiver, state, kind, f) {\r\n if (kind === \"a\" && !f) throw new TypeError(\"Private accessor was defined without a getter\");\r\n if (typeof state === \"function\" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError(\"Cannot read private member from an object whose class did not declare it\");\r\n return kind === \"m\" ? f : kind === \"a\" ? f.call(receiver) : f ? f.value : state.get(receiver);\r\n}\r\n\r\nexport function __classPrivateFieldSet(receiver, state, value, kind, f) {\r\n if (kind === \"m\") throw new TypeError(\"Private method is not writable\");\r\n if (kind === \"a\" && !f) throw new TypeError(\"Private accessor was defined without a setter\");\r\n if (typeof state === \"function\" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError(\"Cannot write private member to an object whose class did not declare it\");\r\n return (kind === \"a\" ? f.call(receiver, value) : f ? f.value = value : state.set(receiver, value)), value;\r\n}\r\n\r\nexport function __classPrivateFieldIn(state, receiver) {\r\n if (receiver === null || (typeof receiver !== \"object\" && typeof receiver !== \"function\")) throw new TypeError(\"Cannot use 'in' operator on non-object\");\r\n return typeof state === \"function\" ? receiver === state : state.has(receiver);\r\n}\r\n","import { UserLogin } from '../db/entities/UserLogin';\n\nexport const UNAUTHORIZED_USER: UserLogin = {\n userId: \"unauthorized\",\n name: \"Unauthorized\",\n claims: {\n sub: \"unauthorized\",\n },\n lastLogin: new Date(0)\n}\n\ntry {\n Object.freeze(UNAUTHORIZED_USER);\n Object.freeze(UNAUTHORIZED_USER.claims);\n} catch {}\n","const swHolder: { registration?: ServiceWorkerRegistration } = {};\nconst swContainer = typeof self !== 'undefined' && self.document && // self.document is to verify we're not the SW ourself\n typeof navigator !== 'undefined' && navigator.serviceWorker; \nif (swContainer)\n swContainer.ready.then(\n (registration) => (swHolder.registration = registration)\n );\n\nif (typeof self !== 'undefined' && 'clients' in self && !self.document) {\n // We are the service worker. Propagate messages to all our clients.\n addEventListener('message', (ev: any) => {\n if (ev.data?.type?.startsWith('sw-broadcast-')) {\n [...self['clients'].matchAll({ includeUncontrolled: true })].forEach(\n (client) => client.id !== ev.source?.id && client.postMessage(ev.data)\n );\n }\n });\n}\n\n/** This class is a fallback for browsers that lacks BroadcastChannel but have\n * service workers (which is Safari versions 11.1 through 15.3).\n * Safari 15.4 with BroadcastChannel was released on 2022-03-14.\n * We might be able to remove this class in a near future as Safari < 15.4 is\n * already very low in market share as of 2023-03-10.\n */\nexport class SWBroadcastChannel {\n name: string;\n constructor(name: string) {\n this.name = name;\n }\n subscribe(listener: (message: any) => void) {\n if (!swContainer) return () => {};\n const forwarder = (ev: MessageEvent) => {\n if (ev.data?.type === `sw-broadcast-${this.name}`) {\n listener(ev.data.message);\n }\n };\n swContainer.addEventListener('message', forwarder);\n return () => swContainer.removeEventListener('message', forwarder);\n }\n postMessage(message: any) {\n if (typeof self['clients'] === 'object') {\n // We're a service worker. Propagate to our browser clients.\n [...self['clients'].matchAll({ includeUncontrolled: true })].forEach(\n (client) =>\n client.postMessage({\n type: `sw-broadcast-${this.name}`,\n message,\n })\n );\n } else if (swHolder.registration) {\n // We're a client (browser window or other worker)\n // Post to SW so it can repost to all its clients and to itself\n swHolder.registration.active?.postMessage({\n type: `sw-broadcast-${this.name}`,\n message,\n });\n }\n }\n}\n","import { Observable } from \"rxjs\";\nimport { SWBroadcastChannel } from \"./SWBroadcastChannel\";\n\nconst events: Map<string, Array<(ev: CustomEvent)=>void>> =\n globalThis['lbc-events'] || (globalThis['lbc-events'] = new Map<string, Array<(ev: CustomEvent)=>void>>());\n\nfunction addListener(name: string, listener: (ev: CustomEvent)=>void) {\n if (events.has(name)) {\n events.get(name)!.push(listener);\n } else {\n events.set(name, [listener]);\n }\n}\nfunction removeListener(name: string, listener: (ev: CustomEvent)=>void) {\n const listeners = events.get(name);\n if (listeners) {\n const idx = listeners.indexOf(listener);\n if (idx !== -1) {\n listeners.splice(idx, 1);\n }\n }\n}\nfunction dispatch(ev: CustomEvent) {\n const listeners = events.get(ev.type);\n if (listeners) {\n listeners.forEach(listener => {\n try {\n listener(ev);\n } catch {\n }\n });\n }\n}\n\nexport class BroadcastedAndLocalEvent<T> extends Observable<T>{\n name: string;\n bc: BroadcastChannel | SWBroadcastChannel\n\n constructor(name: string) {\n const bc = typeof BroadcastChannel === \"undefined\"\n ? new SWBroadcastChannel(name) : new BroadcastChannel(name);\n super(subscriber => {\n function onCustomEvent(ev: CustomEvent) {\n subscriber.next(ev.detail);\n }\n function onMessageEvent(ev: MessageEvent) {\n console.debug(\"BroadcastedAndLocalEvent: onMessageEvent\", ev);\n subscriber.next(ev.data);\n }\n let unsubscribe: ()=>void;\n //self.addEventListener(`lbc-${name}`, onCustomEvent); // Fails in service workers\n addListener(`lbc-${name}`, onCustomEvent); // Works better in service worker\n\n try { \n if (bc instanceof SWBroadcastChannel) {\n unsubscribe = bc.subscribe(message => subscriber.next(message));\n } else {\n console.debug(\"BroadcastedAndLocalEvent: bc.addEventListener()\", name, \"bc is a\", bc);\n bc.addEventListener(\"message\", onMessageEvent);\n }\n } catch (err) {\n // Service workers might fail to subscribe outside its initial script.\n console.warn('Failed to subscribe to broadcast channel', err);\n }\n return () => {\n //self.removeEventListener(`lbc-${name}`, onCustomEvent);\n removeListener(`lbc-${name}`, onCustomEvent);\n if (bc instanceof SWBroadcastChannel) {\n unsubscribe!();\n } else {\n bc.removeEventListener(\"message\", onMessageEvent);\n }\n }\n });\n this.name = name;\n this.bc = bc;\n }\n\n next(message: T) {\n console.debug(\"BroadcastedAndLocalEvent: bc.postMessage()\", {...message}, \"bc is a\", this.bc);\n this.bc.postMessage(message);\n const ev = new CustomEvent(`lbc-${this.name}`, { detail: message });\n //self.dispatchEvent(ev);\n dispatch(ev);\n }\n}\n","export function isFunction(value) {\n return typeof value === 'function';\n}\n//# sourceMappingURL=isFunction.js.map","import { isFunction } from './isFunction';\nexport function hasLift(source) {\n return isFunction(source === null || source === void 0 ? void 0 : source.lift);\n}\nexport function operate(init) {\n return function (source) {\n if (hasLift(source)) {\n return source.lift(function (liftedSource) {\n try {\n return init(liftedSource, this);\n }\n catch (err) {\n this.error(err);\n }\n });\n }\n throw new TypeError('Unable to lift unknown Observable type');\n };\n}\n//# sourceMappingURL=lift.js.map","export var isArrayLike = (function (x) { return x && typeof x.length === 'number' && typeof x !== 'function'; });\n//# sourceMappingURL=isArrayLike.js.map","import { isFunction } from \"./isFunction\";\nexport function isPromise(value) {\n return isFunction(value === null || value === void 0 ? void 0 : value.then);\n}\n//# sourceMappingURL=isPromise.js.map","import { createErrorClass } from './createErrorClass';\nexport var UnsubscriptionError = createErrorClass(function (_super) {\n return function UnsubscriptionErrorImpl(errors) {\n _super(this);\n this.message = errors\n ? errors.length + \" errors occurred during unsubscription:\\n\" + errors.map(function (err, i) { return i + 1 + \") \" + err.toString(); }).join('\\n ')\n : '';\n this.name = 'UnsubscriptionError';\n this.errors = errors;\n };\n});\n//# sourceMappingURL=UnsubscriptionError.js.map","export function createErrorClass(createImpl) {\n var _super = function (instance) {\n Error.call(instance);\n instance.stack = new Error().stack;\n };\n var ctorFunc = createImpl(_super);\n ctorFunc.prototype = Object.create(Error.prototype);\n ctorFunc.prototype.constructor = ctorFunc;\n return ctorFunc;\n}\n//# sourceMappingURL=createErrorClass.js.map","export function arrRemove(arr, item) {\n if (arr) {\n var index = arr.indexOf(item);\n 0 <= index && arr.splice(index, 1);\n }\n}\n//# sourceMappingURL=arrRemove.js.map","import { __read, __spreadArray, __values } from \"tslib\";\nimport { isFunction } from './util/isFunction';\nimport { UnsubscriptionError } from './util/UnsubscriptionError';\nimport { arrRemove } from './util/arrRemove';\nvar Subscription = (function () {\n function Subscription(initialTeardown) {\n this.initialTeardown = initialTeardown;\n this.closed = false;\n this._parentage = null;\n this._finalizers = null;\n }\n Subscription.prototype.unsubscribe = function () {\n var e_1, _a, e_2, _b;\n var errors;\n if (!this.closed) {\n this.closed = true;\n var _parentage = this._parentage;\n if (_parentage) {\n this._parentage = null;\n if (Array.isArray(_parentage)) {\n try {\n for (var _parentage_1 = __values(_parentage), _parentage_1_1 = _parentage_1.next(); !_parentage_1_1.done; _parentage_1_1 = _parentage_1.next()) {\n var parent_1 = _parentage_1_1.value;\n parent_1.remove(this);\n }\n }\n catch (e_1_1) { e_1 = { error: e_1_1 }; }\n finally {\n try {\n if (_parentage_1_1 && !_parentage_1_1.done && (_a = _parentage_1.return)) _a.call(_parentage_1);\n }\n finally { if (e_1) throw e_1.error; }\n }\n }\n else {\n _parentage.remove(this);\n }\n }\n var initialFinalizer = this.initialTeardown;\n if (isFunction(initialFinalizer)) {\n try {\n initialFinalizer();\n }\n catch (e) {\n errors = e instanceof UnsubscriptionError ? e.errors : [e];\n }\n }\n var _finalizers = this._finalizers;\n if (_finalizers) {\n this._finalizers = null;\n try {\n for (var _finalizers_1 = __values(_finalizers), _finalizers_1_1 = _finalizers_1.next(); !_finalizers_1_1.done; _finalizers_1_1 = _finalizers_1.next()) {\n var finalizer = _finalizers_1_1.value;\n try {\n execFinalizer(finalizer);\n }\n catch (err) {\n errors = errors !== null && errors !== void 0 ? errors : [];\n if (err instanceof UnsubscriptionError) {\n errors = __spreadArray(__spreadArray([], __read(errors)), __read(err.errors));\n }\n else {\n errors.push(err);\n }\n }\n }\n }\n catch (e_2_1) { e_2 = { error: e_2_1 }; }\n finally {\n try {\n if (_finalizers_1_1 && !_finalizers_1_1.done && (_b = _finalizers_1.return)) _b.call(_finalizers_1);\n }\n finally { if (e_2) throw e_2.error; }\n }\n }\n if (errors) {\n throw new UnsubscriptionError(errors);\n }\n }\n };\n Subscription.prototype.add = function (teardown) {\n var _a;\n if (teardown && teardown !== this) {\n if (this.closed) {\n execFinalizer(teardown);\n }\n else {\n if (teardown instanceof Subscription) {\n if (teardown.closed || teardown._hasParent(this)) {\n return;\n }\n teardown._addParent(this);\n }\n (this._finalizers = (_a = this._finalizers) !== null && _a !== void 0 ? _a : []).push(teardown);\n }\n }\n };\n Subscription.prototype._hasParent = function (parent) {\n var _parentage = this._parentage;\n return _parentage === parent || (Array.isArray(_parentage) && _parentage.includes(parent));\n };\n Subscription.prototype._addParent = function (parent) {\n var _parentage = this._parentage;\n this._parentage = Array.isArray(_parentage) ? (_parentage.push(parent), _parentage) : _parentage ? [_parentage, parent] : parent;\n };\n Subscription.prototype._removeParent = function (parent) {\n var _parentage = this._parentage;\n if (_parentage === parent) {\n this._parentage = null;\n }\n else if (Array.isArray(_parentage)) {\n arrRemove(_parentage, parent);\n }\n };\n Subscription.prototype.remove = function (teardown) {\n var _finalizers = this._finalizers;\n _finalizers && arrRemove(_finalizers, teardown);\n if (teardown instanceof Subscription) {\n teardown._removeParent(this);\n }\n };\n Subscription.EMPTY = (function () {\n var empty = new Subscription();\n empty.closed = true;\n return empty;\n })();\n return Subscription;\n}());\nexport { Subscription };\nexport var EMPTY_SUBSCRIPTION = Subscription.EMPTY;\nexport function isSubscription(value) {\n return (value instanceof Subscription ||\n (value && 'closed' in value && isFunction(value.remove) && isFunction(value.add) && isFunction(value.unsubscribe)));\n}\nfunction execFinalizer(finalizer) {\n if (isFunction(finalizer)) {\n finalizer();\n }\n else {\n finalizer.unsubscribe();\n }\n}\n//# sourceMappingURL=Subscription.js.map","export var config = {\n onUnhandledError: null,\n onStoppedNotification: null,\n Promise: undefined,\n useDeprecatedSynchronousErrorHandling: false,\n useDeprecatedNextContext: false,\n};\n//# sourceMappingURL=config.js.map","import { __read, __spreadArray } from \"tslib\";\nexport var timeoutProvider = {\n setTimeout: function (handler, timeout) {\n var args = [];\n for (var _i = 2; _i < arguments.length; _i++) {\n args[_i - 2] = arguments[_i];\n }\n var delegate = timeoutProvider.delegate;\n if (delegate === null || delegate === void 0 ? void 0 : delegate.setTimeout) {\n return delegate.setTimeout.apply(delegate, __spreadArray([handler, timeout], __read(args)));\n }\n return setTimeout.apply(void 0, __spreadArray([handler, timeout], __read(args)));\n },\n clearTimeout: function (handle) {\n var delegate = timeoutProvider.delegate;\n return ((delegate === null || delegate === void 0 ? void 0 : delegate.clearTimeout) || clearTimeout)(handle);\n },\n delegate: undefined,\n};\n//# sourceMappingURL=timeoutProvider.js.map","import { config } from '../config';\nimport { timeoutProvider } from '../scheduler/timeoutProvider';\nexport function reportUnhandledError(err) {\n timeoutProvider.setTimeout(function () {\n var onUnhandledError = config.onUnhandledError;\n if (onUnhandledError) {\n onUnhandledError(err);\n }\n else {\n throw err;\n }\n });\n}\n//# sourceMappingURL=reportUnhandledError.js.map","export function noop() { }\n//# sourceMappingURL=noop.js.map","import { __extends } from \"tslib\";\nimport { isFunction } from './util/isFunction';\nimport { isSubscription, Subscription } from './Subscription';\nimport { config } from './config';\nimport { reportUnhandledError } from './util/reportUnhandledError';\nimport { noop } from './util/noop';\nimport { nextNotification, errorNotification, COMPLETE_NOTIFICATION } from './NotificationFactories';\nimport { timeoutProvider } from './scheduler/timeoutProvider';\nimport { captureError } from './util/errorContext';\nvar Subscriber = (function (_super) {\n __extends(Subscriber, _super);\n function Subscriber(destination) {\n var _this = _super.call(this) || this;\n _this.isStopped = false;\n if (destination) {\n _this.destination = destination;\n if (isSubscription(destination)) {\n destination.add(_this);\n }\n }\n else {\n _this.destination = EMPTY_OBSERVER;\n }\n return _this;\n }\n Subscriber.create = function (next, error, complete) {\n return new SafeSubscriber(next, error, complete);\n };\n Subscriber.prototype.next = function (value) {\n if (this.isStopped) {\n handleStoppedNotification(nextNotification(value), this);\n }\n else {\n this._next(value);\n }\n };\n Subscriber.prototype.error = function (err) {\n if (this.isStopped) {\n handleStoppedNotification(errorNotification(err), this);\n }\n else {\n this.isStopped = true;\n this._error(err);\n }\n };\n Subscriber.prototype.complete = function () {\n if (this.isStopped) {\n handleStoppedNotification(COMPLETE_NOTIFICATION, this);\n }\n else {\n this.isStopped = true;\n this._complete();\n }\n };\n Subscriber.prototype.unsubscribe = function () {\n if (!this.closed) {\n this.isStopped = true;\n _super.prototype.unsubscribe.call(this);\n this.destination = null;\n }\n };\n Subscriber.prototype._next = function (value) {\n this.destination.next(value);\n };\n Subscriber.prototype._error = function (err) {\n try {\n this.destination.error(err);\n }\n finally {\n this.unsubscribe();\n }\n };\n Subscriber.prototype._complete = function () {\n try {\n this.destination.complete();\n }\n finally {\n this.unsubscribe();\n }\n };\n return Subscriber;\n}(Subscription));\nexport { Subscriber };\nvar _bind = Function.prototype.bind;\nfunction bind(fn, thisArg) {\n return _bind.call(fn, thisArg);\n}\nvar ConsumerObserver = (function () {\n function ConsumerObserver(partialObserver) {\n this.partialObserver = partialObserver;\n }\n ConsumerObserver.prototype.next = function (value) {\n var partialObserver = this.partialObserver;\n if (partialObserver.next) {\n try {\n partialObserver.next(value);\n }\n catch (error) {\n handleUnhandledError(error);\n }\n }\n };\n ConsumerObserver.prototype.error = function (err) {\n var partialObserver = this.partialObserver;\n if (partialObserver.error) {\n try {\n partialObserver.error(err);\n }\n catch (error) {\n handleUnhandledError(error);\n }\n }\n else {\n handleUnhandledError(err);\n }\n };\n ConsumerObserver.prototype.complete = function () {\n var partialObserver = this.partialObserver;\n if (partialObserver.complete) {\n try {\n partialObserver.complete();\n }\n catch (error) {\n handleUnhandledError(error);\n }\n }\n };\n return ConsumerObserver;\n}());\nvar SafeSubscriber = (function (_super) {\n __extends(SafeSubscriber, _super);\n function SafeSubscriber(observerOrNext, error, complete) {\n var _this = _super.call(this) || this;\n var partialObserver;\n if (isFunction(observerOrNext) || !observerOrNext) {\n partialObserver = {\n next: (observerOrNext !== null && observerOrNext !== void 0 ? observerOrNext : undefined),\n error: error !== null && error !== void 0 ? error : undefined,\n complete: complete !== null && complete !== void 0 ? complete : undefined,\n };\n }\n else {\n var context_1;\n if (_this && config.useDeprecatedNextContext) {\n context_1 = Object.create(observerOrNext);\n context_1.unsubscribe = function () { return _this.unsubscribe(); };\n partialObserver = {\n next: observerOrNext.next && bind(observerOrNext.next, context_1),\n error: observerOrNext.error && bind(observerOrNext.error, context_1),\n complete: observerOrNext.complete && bind(observerOrNext.complete, context_1),\n };\n }\n else {\n partialObserver = observerOrNext;\n }\n }\n _this.destination = new ConsumerObserver(partialObserver);\n return _this;\n }\n return SafeSubscriber;\n}(Subscriber));\nexport { SafeSubscriber };\nfunction handleUnhandledError(error) {\n if (config.useDeprecatedSynchronousErrorHandling) {\n captureError(error);\n }\n else {\n reportUnhandledError(error);\n }\n}\nfunction defaultErrorHandler(err) {\n throw err;\n}\nfunction handleStoppedNotification(notification, subscriber) {\n var onStoppedNotification = config.onStoppedNotification;\n onStoppedNotification && timeoutProvider.setTimeout(function () { return onStoppedNotification(notification, subscriber); });\n}\nexport var EMPTY_OBSERVER = {\n closed: true,\n next: noop,\n error: defaultErrorHandler,\n complete: noop,\n};\n//# sourceMappingURL=Subscriber.js.map","export var observable = (function () { return (typeof Symbol === 'function' && Symbol.observable) || '@@observable'; })();\n//# sourceMappingURL=observable.js.map","export function identity(x) {\n return x;\n}\n//# sourceMappingURL=identity.js.map","import { SafeSubscriber, Subscriber } from './Subscriber';\nimport { isSubscription } from './Subscription';\nimport { observable as Symbol_observable } from './symbol/observable';\nimport { pipeFromArray } from './util/pipe';\nimport { config } from './config';\nimport { isFunction } from './util/isFunction';\nimport { errorContext } from './util/errorContext';\nvar Observable = (function () {\n function Observable(subscribe) {\n if (subscribe) {\n this._subscribe = subscribe;\n }\n }\n Observable.prototype.lift = function (operator) {\n var observable = new Observable();\n observable.source = this;\n observable.operator = operator;\n return observable;\n };\n Observable.prototype.subscribe = function (observerOrNext, error, complete) {\n var _this = this;\n var subscriber = isSubscriber(observerOrNext) ? observerOrNext : new SafeSubscriber(observerOrNext, error, complete);\n errorContext(function () {\n var _a = _this, operator = _a.operator, source = _a.source;\n subscriber.add(operator\n ?\n operator.call(subscriber, source)\n : source\n ?\n _this._subscribe(subscriber)\n :\n _this._trySubscribe(subscriber));\n });\n return subscriber;\n };\n Observable.prototype._trySubscribe = function (sink) {\n try {\n return this._subscribe(sink);\n }\n catch (err) {\n sink.error(err);\n }\n };\n Observable.prototype.forEach = function (next, promiseCtor) {\n var _this = this;\n promiseCtor = getPromiseCtor(promiseCtor);\n return new promiseCtor(function (resolve, reject) {\n var subscriber = new SafeSubscriber({\n next: function (value) {\n try {\n next(value);\n }\n catch (err) {\n reject(err);\n subscriber.unsubscribe();\n }\n },\n error: reject,\n complete: resolve,\n });\n _this.subscribe(subscriber);\n });\n };\n Observable.prototype._subscribe = function (subscriber) {\n var _a;\n return (_a = this.source) === null || _a === void 0 ? void 0 : _a.subscribe(subscriber);\n };\n Observable.prototype[Symbol_observable] = function () {\n return this;\n };\n Observable.prototype.pipe = function () {\n var operations = [];\n for (var _i = 0; _i < arguments.length; _i++) {\n operations[_i] = arguments[_i];\n }\n return pipeFromArray(operations)(this);\n };\n Observable.prototype.toPromise = function (promiseCtor) {\n var _this = this;\n promiseCtor = getPromiseCtor(promiseCtor);\n return new promiseCtor(function (resolve, reject) {\n var value;\n _this.subscribe(function (x) { return (value = x); }, function (err) { return reject(err); }, function () { return resolve(value); });\n });\n };\n Observable.create = function (subscribe) {\n return new Observable(subscribe);\n };\n return Observable;\n}());\nexport { Observable };\nfunction getPromiseCtor(promiseCtor) {\n var _a;\n return (_a = promiseCtor !== null && promiseCtor !== void 0 ? promiseCtor : config.Promise) !== null && _a !== void 0 ? _a : Promise;\n}\nfunction isObserver(value) {\n return value && isFunction(value.next) && isFunction(value.error) && isFunction(value.complete);\n}\nfunction isSubscriber(value) {\n return (value && value instanceof Subscriber) || (isObserver(value) && isSubscription(value));\n}\n//# sourceMappingURL=Observable.js.map","import { config } from '../config';\nvar context = null;\nexport function errorContext(cb) {\n if (config.useDeprecatedSynchronousErrorHandling) {\n var isRoot = !context;\n if (isRoot) {\n context = { errorThrown: false, error: null };\n }\n cb();\n if (isRoot) {\n var _a = context, errorThrown = _a.errorThrown, error = _a.error;\n context = null;\n if (errorThrown) {\n throw error;\n }\n }\n }\n else {\n cb();\n }\n}\nexport function captureError(err) {\n if (config.useDeprecatedSynchronousErrorHandling && context) {\n context.errorThrown = true;\n context.error = err;\n }\n}\n//# sourceMappingURL=errorContext.js.map","import { identity } from './identity';\nexport function pipe() {\n var fns = [];\n for (var _i = 0; _i < arguments.length; _i++) {\n fns[_i] = arguments[_i];\n }\n return pipeFromArray(fns);\n}\nexport function pipeFromArray(fns) {\n if (fns.length === 0) {\n return identity;\n }\n if (fns.length === 1) {\n return fns[0];\n }\n return function piped(input) {\n return fns.reduce(function (prev, fn) { return fn(prev); }, input);\n };\n}\n//# sourceMappingURL=pipe.js.map","import { observable as Symbol_observable } from '../symbol/observable';\nimport { isFunction } from './isFunction';\nexport function isInteropObservable(input) {\n return isFunction(input[Symbol_observable]);\n}\n//# sourceMappingURL=isInteropObservable.js.map","import { isFunction } from './isFunction';\nexport function isAsyncIterable(obj) {\n return Symbol.asyncIterator && isFunction(obj === null || obj === void 0 ? void 0 : obj[Symbol.asyncIterator]);\n}\n//# sourceMappingURL=isAsyncIterable.js.map","export function createInvalidObservableTypeError(input) {\n return new TypeError(\"You provided \" + (input !== null && typeof input === 'object' ? 'an invalid object' : \"'\" + input + \"'\") + \" where a stream was expected. You can provide an Observable, Promise, ReadableStream, Array, AsyncIterable, or Iterable.\");\n}\n//# sourceMappingURL=throwUnobservableError.js.map","export function getSymbolIterator() {\n if (typeof Symbol !== 'function' || !Symbol.iterator) {\n return '@@iterator';\n }\n return Symbol.iterator;\n}\nexport var iterator = getSymbolIterator();\n//# sourceMappingURL=iterator.js.map","import { iterator as Symbol_iterator } from '../symbol/iterator';\nimport { isFunction } from './isFunction';\nexport function isIterable(input) {\n return isFunction(input === null || input === void 0 ? void 0 : input[Symbol_iterator]);\n}\n//# sourceMappingURL=isIterable.js.map","import { __asyncGenerator, __await, __generator } from \"tslib\";\nimport { isFunction } from './isFunction';\nexport function readableStreamLikeToAsyncGenerator(readableStream) {\n return __asyncGenerator(this, arguments, function readableStreamLikeToAsyncGenerator_1() {\n var reader, _a, value, done;\n return __generator(this, function (_b) {\n switch (_b.label) {\n case 0:\n reader = readableStream.getReader();\n _b.label = 1;\n case 1:\n _b.trys.push([1, , 9, 10]);\n _b.label = 2;\n case 2:\n if (!true) return [3, 8];\n return [4, __await(reader.read())];\n case 3:\n _a = _b.sent(), value = _a.value, done = _a.done;\n if (!done) return [3, 5];\n return [4, __await(void 0)];\n case 4: return [2, _b.sent()];\n case 5: return [4, __await(value)];\n case 6: return [4, _b.sent()];\n case 7:\n _b.sent();\n return [3, 2];\n case 8: return [3, 10];\n case 9:\n reader.releaseLock();\n return [7];\n case 10: return [2];\n }\n });\n });\n}\nexport function isReadableStreamLike(obj) {\n return isFunction(obj === null || obj === void 0 ? void 0 : obj.getReader);\n}\n//# sourceMappingURL=isReadableStreamLike.js.map","import { __asyncValues, __awaiter, __generator, __values } from \"tslib\";\nimport { isArrayLike } from '../util/isArrayLike';\nimport { isPromise } from '../util/isPromise';\nimport { Observable } from '../Observable';\nimport { isInteropObservable } from '../util/isInteropObservable';\nimport { isAsyncIterable } from '../util/isAsyncIterable';\nimport { createInvalidObservableTypeError } from '../util/throwUnobservableError';\nimport { isIterable } from '../util/isIterable';\nimport { isReadableStreamLike, readableStreamLikeToAsyncGenerator } from '../util/isReadableStreamLike';\nimport { isFunction } from '../util/isFunction';\nimport { reportUnhandledError } from '../util/reportUnhandledError';\nimport { observable as Symbol_observable } from '../symbol/observable';\nexport function innerFrom(input) {\n if (input instanceof Observable) {\n return input;\n }\n if (input != null) {\n if (isInteropObservable(input)) {\n return fromInteropObservable(input);\n }\n if (isArrayLike(input)) {\n return fromArrayLike(input);\n }\n if (isPromise(input)) {\n return fromPromise(input);\n }\n if (isAsyncIterable(input)) {\n return fromAsyncIterable(input);\n }\n if (isIterable(input)) {\n return fromIterable(input);\n }\n if (isReadableStreamLike(input)) {\n return fromReadableStreamLike(input);\n }\n }\n throw createInvalidObservableTypeError(input);\n}\nexport function fromInteropObservable(obj) {\n return new Observable(function (subscriber) {\n var obs = obj[Symbol_observable]();\n if (isFunction(obs.subscribe)) {\n return obs.subscribe(subscriber);\n }\n throw new TypeError('Provided object does not correctly implement Symbol.observable');\n });\n}\nexport function fromArrayLike(array) {\n return new Observable(function (subscriber) {\n for (var i = 0; i < array.length && !subscriber.closed; i++) {\n subscriber.next(array[i]);\n }\n subscriber.complete();\n });\n}\nexport function fromPromise(promise) {\n return new Observable(function (subscriber) {\n promise\n .then(function (value) {\n if (!subscriber.closed) {\n subscriber.next(value);\n subscriber.complete();\n }\n }, function (err) { return subscriber.error(err); })\n .then(null, reportUnhandledError);\n });\n}\nexport function fromIterable(iterable) {\n return new Observable(function (subscriber) {\n var e_1, _a;\n try {\n for (var iterable_1 = __values(iterable), iterable_1_1 = iterable_1.next(); !iterable_1_1.done; iterable_1_1 = iterable_1.next()) {\n var value = iterable_1_1.value;\n subscriber.next(value);\n if (subscriber.closed) {\n return;\n }\n }\n }\n catch (e_1_1) { e_1 = { error: e_1_1 }; }\n finally {\n try {\n if (iterable_1_1 && !iterable_1_1.done && (_a = iterable_1.return)) _a.call(iterable_1);\n }\n finally { if (e_1) throw e_1.error; }\n }\n subscriber.complete();\n });\n}\nexport function fromAsyncIterable(asyncIterable) {\n return new Observable(function (subscriber) {\n process(asyncIterable, subscriber).catch(function (err) { return subscriber.error(err); });\n });\n}\nexport function fromReadableStreamLike(readableStream) {\n return fromAsyncIterable(readableStreamLikeToAsyncGenerator(readableStream));\n}\nfunction process(asyncIterable, subscriber) {\n var asyncIterable_1, asyncIterable_1_1;\n var e_2, _a;\n return __awaiter(this, void 0, void 0, function () {\n var value, e_2_1;\n return __generator(this, function (_b) {\n switch (_b.label) {\n case 0:\n _b.trys.push([0, 5, 6, 11]);\n asyncIterable_1 = __asyncValues(asyncIterable);\n _b.label = 1;\n case 1: return [4, asyncIterable_1.next()];\n case 2:\n if (!(asyncIterable_1_1 = _b.sent(), !asyncIterable_1_1.done)) return [3, 4];\n value = asyncIterable_1_1.value;\n subscriber.next(value);\n if (subscriber.closed) {\n return [2];\n }\n _b.label = 3;\n case 3: return [3, 1];\n case 4: return [3, 11];\n case 5:\n e_2_1 = _b.sent();\n e_2 = { error: e_2_1 };\n return [3, 11];\n case 6:\n _b.trys.push([6, , 9, 10]);\n if (!(asyncIterable_1_1 && !asyncIterable_1_1.done && (_a = asyncIterable_1.return))) return [3, 8];\n return [4, _a.call(asyncIterable_1)];\n case 7:\n _b.sent();\n _b.label = 8;\n case 8: return [3, 10];\n case 9:\n if (e_2) throw e_2.error;\n return [7];\n case 10: return [7];\n case 11:\n subscriber.complete();\n return [2];\n }\n });\n });\n}\n//# sourceMappingURL=innerFrom.js.map","import { __extends } from \"tslib\";\nimport { Subscriber } from '../Subscriber';\nexport function createOperatorSubscriber(destination, onNext, onComplete, onError, onFinalize) {\n return new OperatorSubscriber(destination, onNext, onComplete, onError, onFinalize);\n}\nvar OperatorSubscriber = (function (_super) {\n __extends(OperatorSubscriber, _super);\n function OperatorSubscriber(destination, onNext, onComplete, onError, onFinalize, shouldUnsubscribe) {\n var _this = _super.call(this, destination) || this;\n _this.onFinalize = onFinalize;\n _this.shouldUnsubscribe = shouldUnsubscribe;\n _this._next = onNext\n ? function (value) {\n try {\n onNext(value);\n }\n catch (err) {\n destination.error(err);\n }\n }\n : _super.prototype._next;\n _this._error = onError\n ? function (err) {\n try {\n onError(err);\n }\n catch (err) {\n destination.error(err);\n }\n finally {\n this.unsubscribe();\n }\n }\n : _super.prototype._error;\n _this._complete = onComplete\n ? function () {\n try {\n onComplete();\n }\n catch (err) {\n destination.error(err);\n }\n finally {\n this.unsubscribe();\n }\n }\n : _super.prototype._complete;\n return _this;\n }\n OperatorSubscriber.prototype.unsubscribe = function () {\n var _a;\n if (!this.shouldUnsubscribe || this.shouldUnsubscribe()) {\n var closed_1 = this.closed;\n _super.prototype.unsubscribe.call(this);\n !closed_1 && ((_a = this.onFinalize) === null || _a === void 0 ? void 0 : _a.call(this));\n }\n };\n return OperatorSubscriber;\n}(Subscriber));\nexport { OperatorSubscriber };\n//# sourceMappingURL=OperatorSubscriber.js.map","import { __extends } from \"tslib\";\nimport { Subscription } from '../Subscription';\nvar Action = (function (_super) {\n __extends(Action, _super);\n function Action(scheduler, work) {\n return _super.call(this) || this;\n }\n Action.prototype.schedule = function (state, delay) {\n if (delay === void 0) { delay = 0; }\n return this;\n };\n return Action;\n}(Subscription));\nexport { Action };\n//# sourceMappingURL=Action.js.map","import { __read, __spreadArray } from \"tslib\";\nexport var intervalProvider = {\n setInterval: function (handler, timeout) {\n var args = [];\n for (var _i = 2; _i < arguments.length; _i++) {\n args[_i - 2] = arguments[_i];\n }\n var delegate = intervalProvider.delegate;\n if (delegate === null || delegate === void 0 ? void 0 : delegate.setInterval) {\n return delegate.setInterval.apply(delegate, __spreadArray([handler, timeout], __read(args)));\n }\n return setInterval.apply(void 0, __spreadArray([handler, timeout], __read(args)));\n },\n clearInterval: function (handle) {\n var delegate = intervalProvider.delegate;\n return ((delegate === null || delegate === void 0 ? void 0 : delegate.clearInterval) || clearInterval)(handle);\n },\n delegate: undefined,\n};\n//# sourceMappingURL=intervalProvider.js.map","import { __extends } from \"tslib\";\nimport { Action } from './Action';\nimport { intervalProvider } from './intervalProvider';\nimport { arrRemove } from '../util/arrRemove';\nvar AsyncAction = (function (_super) {\n __extends(AsyncAction, _super);\n function AsyncAction(scheduler, work) {\n var _this = _super.call(this, scheduler, work) || this;\n _this.scheduler = scheduler;\n _this.work = work;\n _this.pending = false;\n return _this;\n }\n AsyncAction.prototype.schedule = function (state, delay) {\n if (delay === void 0) { delay = 0; }\n if (this.closed) {\n return this;\n }\n this.state = state;\n var id = this.id;\n var scheduler = this.scheduler;\n if (id != null) {\n this.id = this.recycleAsyncId(scheduler, id, delay);\n }\n this.pending = true;\n this.delay = delay;\n this.id = this.id || this.requestAsyncId(scheduler, this.id, delay);\n return this;\n };\n AsyncAction.prototype.requestAsyncId = function (scheduler, _id, delay) {\n if (delay === void 0) { delay = 0; }\n return intervalProvider.setInterval(scheduler.flush.bind(scheduler, this), delay);\n };\n AsyncAction.prototype.recycleAsyncId = function (_scheduler, id, delay) {\n if (delay === void 0) { delay = 0; }\n if (delay != null && this.delay === delay && this.pending === false) {\n return id;\n }\n intervalProvider.clearInterval(id);\n return undefined;\n };\n AsyncAction.prototype.execute = function (state, delay) {\n if (this.closed) {\n return new Error('executing a cancelled action');\n }\n this.pending = false;\n var error = this._execute(state, delay);\n if (error) {\n return error;\n }\n else if (this.pending === false && this.id != null) {\n this.id = this.recycleAsyncId(this.scheduler, this.id, null);\n }\n };\n AsyncAction.prototype._execute = function (state, _delay) {\n var errored = false;\n var errorValue;\n try {\n this.work(state);\n }\n catch (e) {\n errored = true;\n errorValue = e ? e : new Error('Scheduled action threw falsy error');\n }\n if (errored) {\n this.unsubscribe();\n return errorValue;\n }\n };\n AsyncAction.prototype.unsubscribe = function () {\n if (!this.closed) {\n var _a = this, id = _a.id, scheduler = _a.scheduler;\n var actions = scheduler.actions;\n this.work = this.state = this.scheduler = null;\n this.pending = false;\n arrRemove(actions, this);\n if (id != null) {\n this.id = this.recycleAsyncId(scheduler, id, null);\n }\n this.delay = null;\n _super.prototype.unsubscribe.call(this);\n }\n };\n return AsyncAction;\n}(Action));\nexport { AsyncAction };\n//# sourceMappingURL=AsyncAction.js.map","export var dateTimestampProvider = {\n now: function () {\n return (dateTimestampProvider.delegate || Date).now();\n },\n delegate: undefined,\n};\n//# sourceMappingURL=dateTimestampProvider.js.map","import { dateTimestampProvider } from './scheduler/dateTimestampProvider';\nvar Scheduler = (function () {\n function Scheduler(schedulerActionCtor, now) {\n if (now === void 0) { now = Scheduler.now; }\n this.schedulerActionCtor = schedulerActionCtor;\n this.now = now;\n }\n Scheduler.prototype.schedule = function (work, delay, state) {\n if (delay === void 0) { delay = 0; }\n return new this.schedulerActionCtor(this, work).schedule(state, delay);\n };\n Scheduler.now = dateTimestampProvider.now;\n return Scheduler;\n}());\nexport { Scheduler };\n//# sourceMappingURL=Scheduler.js.map","import { AsyncAction } from './AsyncAction';\nimport { AsyncScheduler } from './AsyncScheduler';\nexport var asyncScheduler = new AsyncScheduler(AsyncAction);\nexport var async = asyncScheduler;\n//# sourceMappingURL=async.js.map","import { __extends } from \"tslib\";\nimport { Scheduler } from '../Scheduler';\nvar AsyncScheduler = (function (_super) {\n __extends(AsyncScheduler, _super);\n function AsyncScheduler(SchedulerAction, now) {\n if (now === void 0) { now = Scheduler.now; }\n var _this = _super.call(this, SchedulerAction, now) || this;\n _this.actions = [];\n _this._active = false;\n _this._scheduled = undefined;\n return _this;\n }\n AsyncScheduler.prototype.flush = function (action) {\n var actions = this.actions;\n if (this._active) {\n actions.push(action);\n return;\n }\n var error;\n this._active = true;\n do {\n if ((error = action.execute(action.state, action.delay))) {\n break;\n }\n } while ((action = actions.shift()));\n this._active = false;\n if (error) {\n while ((action = actions.shift())) {\n action.unsubscribe();\n }\n throw error;\n }\n };\n return AsyncScheduler;\n}(Scheduler));\nexport { AsyncScheduler };\n//# sourceMappingURL=AsyncScheduler.js.map","import { isFunction } from './isFunction';\nexport function isScheduler(value) {\n return value && isFunction(value.schedule);\n}\n//# sourceMappingURL=isScheduler.js.map","import { Observable } from '../Observable';\nimport { async as asyncScheduler } from '../scheduler/async';\nimport { isScheduler } from '../util/isScheduler';\nimport { isValidDate } from '../util/isDate';\nexport function timer(dueTime, intervalOrScheduler, scheduler) {\n if (dueTime === void 0) { dueTime = 0; }\n if (scheduler === void 0) { scheduler = asyncScheduler; }\n var intervalDuration = -1;\n if (intervalOrScheduler != null) {\n if (isScheduler(intervalOrScheduler)) {\n scheduler = intervalOrScheduler;\n }\n else {\n intervalDuration = intervalOrScheduler;\n }\n }\n return new Observable(function (subscriber) {\n var due = isValidDate(dueTime) ? +dueTime - scheduler.now() : dueTime;\n if (due < 0) {\n due = 0;\n }\n var n = 0;\n return scheduler.schedule(function () {\n if (!subscriber.closed) {\n subscriber.next(n++);\n if (0 <= intervalDuration) {\n this.schedule(undefined, intervalDuration);\n }\n else {\n subscriber.complete();\n }\n }\n }, due);\n });\n}\n//# sourceMappingURL=timer.js.map","export function isValidDate(value) {\n return value instanceof Date && !isNaN(value);\n}\n//# sourceMappingURL=isDate.js.map","import { isFunction } from './isFunction';\nimport { isScheduler } from './isScheduler';\nfunction last(arr) {\n return arr[arr.length - 1];\n}\nexport function popResultSelector(args) {\n return isFunction(last(args)) ? args.pop() : undefined;\n}\nexport function popScheduler(args) {\n return isScheduler(last(args)) ? args.pop() : undefined;\n}\nexport function popNumber(args, defaultValue) {\n return typeof last(args) === 'number' ? args.pop() : defaultValue;\n}\n//# sourceMappingURL=args.js.map","export function executeSchedule(parentSubscription, scheduler, work, delay, repeat) {\n if (delay === void 0) { delay = 0; }\n if (repeat === void 0) { repeat = false; }\n var scheduleSubscription = scheduler.schedule(function () {\n work();\n if (repeat) {\n parentSubscription.add(this.schedule(null, delay));\n }\n else {\n this.unsubscribe();\n }\n }, delay);\n parentSubscription.add(scheduleSubscription);\n if (!repeat) {\n return scheduleSubscription;\n }\n}\n//# sourceMappingURL=executeSchedule.js.map","import { innerFrom } from '../observable/innerFrom';\nimport { createOperatorSubscriber } from './OperatorSubscriber';\nimport { operate } from '../util/lift';\nexport function catchError(selector) {\n return operate(function (source, subscriber) {\n var innerSub = null;\n var syncUnsub = false;\n var handledResult;\n innerSub = source.subscribe(createOperatorSubscriber(subscriber, undefined, undefined, function (err) {\n handledResult = innerFrom(selector(err, catchError(selector)(source)));\n if (innerSub) {\n innerSub.unsubscribe();\n innerSub = null;\n handledResult.subscribe(subscriber);\n }\n else {\n syncUnsub = true;\n }\n }));\n if (syncUnsub) {\n innerSub.unsubscribe();\n innerSub = null;\n handledResult.subscribe(subscriber);\n }\n });\n}\n//# sourceMappingURL=catchError.js.map","import { executeSchedule } from '../util/executeSchedule';\nimport { operate } from '../util/lift';\nimport { createOperatorSubscriber } from './OperatorSubscriber';\nexport function observeOn(scheduler, delay) {\n if (delay === void 0) { delay = 0; }\n return operate(function (source, subscriber) {\n source.subscribe(createOperatorSubscriber(subscriber, function (value) { return executeSchedule(subscriber, scheduler, function () { return subscriber.next(value); }, delay); }, function () { return executeSchedule(subscriber, scheduler, function () { return subscriber.complete(); }, delay); }, function (err) { return executeSchedule(subscriber, scheduler, function () { return subscriber.error(err); }, delay); }));\n });\n}\n//# sourceMappingURL=observeOn.js.map","import { operate } from '../util/lift';\nexport function subscribeOn(scheduler, delay) {\n if (delay === void 0) { delay = 0; }\n return operate(function (source, subscriber) {\n subscriber.add(scheduler.schedule(function () { return source.subscribe(subscriber); }, delay));\n });\n}\n//# sourceMappingURL=subscribeOn.js.map","import { Observable } from '../Observable';\nimport { executeSchedule } from '../util/executeSchedule';\nexport function scheduleAsyncIterable(input, scheduler) {\n if (!input) {\n throw new Error('Iterable cannot be null');\n }\n return new Observable(function (subscriber) {\n executeSchedule(subscriber, scheduler, function () {\n var iterator = input[Symbol.asyncIterator]();\n executeSchedule(subscriber, scheduler, function () {\n iterator.next().then(function (result) {\n if (result.done) {\n subscriber.complete();\n }\n else {\n subscriber.next(result.value);\n }\n });\n }, 0, true);\n });\n });\n}\n//# sourceMappingURL=scheduleAsyncIterable.js.map","import { scheduleObservable } from './scheduleObservable';\nimport { schedulePromise } from './schedulePromise';\nimport { scheduleArray } from './scheduleArray';\nimport { scheduleIterable } from './scheduleIterable';\nimport { scheduleAsyncIterable } from './scheduleAsyncIterable';\nimport { isInteropObservable } from '../util/isInteropObservable';\nimport { isPromise } from '../util/isPromise';\nimport { isArrayLike } from '../util/isArrayLike';\nimport { isIterable } from '../util/isIterable';\nimport { isAsyncIterable } from '../util/isAsyncIterable';\nimport { createInvalidObservableTypeError } from '../util/throwUnobservableError';\nimport { isReadableStreamLike } from '../util/isReadableStreamLike';\nimport { scheduleReadableStreamLike } from './scheduleReadableStreamLike';\nexport function scheduled(input, scheduler) {\n if (input != null) {\n if (isInteropObservable(input)) {\n return scheduleObservable(input, scheduler);\n }\n if (isArrayLike(input)) {\n return scheduleArray(input, scheduler);\n }\n if (isPromise(input)) {\n return schedulePromise(input, scheduler);\n }\n if (isAsyncIterable(input)) {\n return scheduleAsyncIterable(input, scheduler);\n }\n if (isIterable(input)) {\n return scheduleIterable(input, scheduler);\n }\n if (isReadableStreamLike(input)) {\n return scheduleReadableStreamLike(input, scheduler);\n }\n }\n throw createInvalidObservableTypeError(input);\n}\n//# sourceMappingURL=scheduled.js.map","import { innerFrom } from '../observable/innerFrom';\nimport { observeOn } from '../operators/observeOn';\nimport { subscribeOn } from '../operators/subscribeOn';\nexport function scheduleObservable(input, scheduler) {\n return innerFrom(input).pipe(subscribeOn(scheduler), observeOn(scheduler));\n}\n//# sourceMappingURL=scheduleObservable.js.map","import { Observable } from '../Observable';\nexport function scheduleArray(input, scheduler) {\n return new Observable(function (subscriber) {\n var i = 0;\n return scheduler.schedule(function () {\n if (i === input.length) {\n subscriber.complete();\n }\n else {\n subscriber.next(input[i++]);\n if (!subscriber.closed) {\n this.schedule();\n }\n }\n });\n });\n}\n//# sourceMappingURL=scheduleArray.js.map","import { innerFrom } from '../observable/innerFrom';\nimport { observeOn } from '../operators/observeOn';\nimport { subscribeOn } from '../operators/subscribeOn';\nexport function schedulePromise(input, scheduler) {\n return innerFrom(input).pipe(subscribeOn(scheduler), observeOn(scheduler));\n}\n//# sourceMappingURL=schedulePromise.js.map","import { Observable } from '../Observable';\nimport { iterator as Symbol_iterator } from '../symbol/iterator';\nimport { isFunction } from '../util/isFunction';\nimport { executeSchedule } from '../util/executeSchedule';\nexport function scheduleIterable(input, scheduler) {\n return new Observable(function (subscriber) {\n var iterator;\n executeSchedule(subscriber, scheduler, function () {\n iterator = input[Symbol_iterator]();\n executeSchedule(subscriber, scheduler, function () {\n var _a;\n var value;\n var done;\n try {\n (_a = iterator.next(), value = _a.value, done = _a.done);\n }\n catch (err) {\n subscriber.error(err);\n return;\n }\n if (done) {\n subscriber.complete();\n }\n else {\n subscriber.next(value);\n }\n }, 0, true);\n });\n return function () { return isFunction(iterator === null || iterator === void 0 ? void 0 : iterator.return) && iterator.return(); };\n });\n}\n//# sourceMappingURL=scheduleIterable.js.map","import { scheduleAsyncIterable } from './scheduleAsyncIterable';\nimport { readableStreamLikeToAsyncGenerator } from '../util/isReadableStreamLike';\nexport function scheduleReadableStreamLike(input, scheduler) {\n return scheduleAsyncIterable(readableStreamLikeToAsyncGenerator(input), scheduler);\n}\n//# sourceMappingURL=scheduleReadableStreamLike.js.map","import { operate } from '../util/lift';\nimport { createOperatorSubscriber } from './OperatorSubscriber';\nexport function map(project, thisArg) {\n return operate(function (source, subscriber) {\n var index = 0;\n source.subscribe(createOperatorSubscriber(subscriber, function (value) {\n subscriber.next(project.call(thisArg, value, index++));\n }));\n });\n}\n//# sourceMappingURL=map.js.map","import { map } from './map';\nimport { innerFrom } from '../observable/innerFrom';\nimport { operate } from '../util/lift';\nimport { mergeInternals } from './mergeInternals';\nimport { isFunction } from '../util/isFunction';\nexport function mergeMap(project, resultSelector, concurrent) {\n if (concurrent === void 0) { concurrent = Infinity; }\n if (isFunction(resultSelector)) {\n return mergeMap(function (a, i) { return map(function (b, ii) { return resultSelector(a, b, i, ii); })(innerFrom(project(a, i))); }, concurrent);\n }\n else if (typeof resultSelector === 'number') {\n concurrent = resultSelector;\n }\n return operate(function (source, subscriber) { return mergeInternals(source, subscriber, project, concurrent); });\n}\n//# sourceMappingURL=mergeMap.js.map","import { innerFrom } from '../observable/innerFrom';\nimport { executeSchedule } from '../util/executeSchedule';\nimport { createOperatorSubscriber } from './OperatorSubscriber';\nexport function mergeInternals(source, subscriber, project, concurrent, onBeforeNext, expand, innerSubScheduler, additionalFinalizer) {\n var buffer = [];\n var active = 0;\n var index = 0;\n var isComplete = false;\n var checkComplete = function () {\n if (isComplete && !buffer.length && !active) {\n subscriber.complete();\n }\n };\n var outerNext = function (value) { return (active < concurrent ? doInnerSub(value) : buffer.push(value)); };\n var doInnerSub = function (value) {\n expand && subscriber.next(value);\n active++;\n var innerComplete = false;\n innerFrom(project(value, index++)).subscribe(createOperatorSubscriber(subscriber, function (innerValue) {\n onBeforeNext === null || onBeforeNext === void 0 ? void 0 : onBeforeNext(innerValue);\n if (expand) {\n outerNext(innerValue);\n }\n else {\n subscriber.next(innerValue);\n }\n }, function () {\n innerComplete = true;\n }, undefined, function () {\n if (innerComplete) {\n try {\n active--;\n var _loop_1 = function () {\n var bufferedValue = buffer.shift();\n if (innerSubScheduler) {\n executeSchedule(subscriber, innerSubScheduler, function () { return doInnerSub(bufferedValue); });\n }\n else {\n doInnerSub(bufferedValue);\n }\n };\n while (buffer.length && active < concurrent) {\n _loop_1();\n }\n checkComplete();\n }\n catch (err) {\n subscriber.error(err);\n }\n }\n }));\n };\n source.subscribe(createOperatorSubscriber(subscriber, outerNext, function () {\n isComplete = true;\n checkComplete();\n }));\n return function () {\n additionalFinalizer === null || additionalFinalizer === void 0 ? void 0 : additionalFinalizer();\n };\n}\n//# sourceMappingURL=mergeInternals.js.map","import { mergeAll } from './mergeAll';\nexport function concatAll() {\n return mergeAll(1);\n}\n//# sourceMappingURL=concatAll.js.map","import { mergeMap } from './mergeMap';\nimport { identity } from '../util/identity';\nexport function mergeAll(concurrent) {\n if (concurrent === void 0) { concurrent = Infinity; }\n return mergeMap(identity, concurrent);\n}\n//# sourceMappingURL=mergeAll.js.map","import { asyncScheduler } from '../scheduler/async';\nimport { operate } from '../util/lift';\nimport { createOperatorSubscriber } from './OperatorSubscriber';\nexport function debounceTime(dueTime, scheduler) {\n if (scheduler === void 0) { scheduler = asyncScheduler; }\n return operate(function (source, subscriber) {\n var activeTask = null;\n var lastValue = null;\n var lastTime = null;\n var emit = function () {\n if (activeTask) {\n activeTask.unsubscribe();\n activeTask = null;\n var value = lastValue;\n lastValue = null;\n subscriber.next(value);\n }\n };\n function emitWhenIdle() {\n var targetTime = lastTime + dueTime;\n var now = scheduler.now();\n if (now < targetTime) {\n activeTask = this.schedule(undefined, targetTime - now);\n subscriber.add(activeTask);\n return;\n }\n emit();\n }\n source.subscribe(createOperatorSubscriber(subscriber, function (value) {\n lastValue = value;\n lastTime = scheduler.now();\n if (!activeTask) {\n activeTask = scheduler.schedule(emitWhenIdle, dueTime);\n subscriber.add(activeTask);\n }\n }, function () {\n emit();\n subscriber.complete();\n }, undefined, function () {\n lastValue = activeTask = null;\n }));\n });\n}\n//# sourceMappingURL=debounceTime.js.map","import { concatAll } from '../operators/concatAll';\nimport { popScheduler } from '../util/args';\nimport { from } from './from';\nexport function concat() {\n var args = [];\n for (var _i = 0; _i < arguments.length; _i++) {\n args[_i] = arguments[_i];\n }\n return concatAll()(from(args, popScheduler(args)));\n}\n//# sourceMappingURL=concat.js.map","import { scheduled } from '../scheduled/scheduled';\nimport { innerFrom } from './innerFrom';\nexport function from(input, scheduler) {\n return scheduler ? scheduled(input, scheduler) : innerFrom(input);\n}\n//# sourceMappingURL=from.js.map","import { Observable } from '../Observable';\nexport var EMPTY = new Observable(function (subscriber) { return subscriber.complete(); });\nexport function empty(scheduler) {\n return scheduler ? emptyScheduled(scheduler) : EMPTY;\n}\nfunction emptyScheduled(scheduler) {\n return new Observable(function (subscriber) { return scheduler.schedule(function () { return subscriber.complete(); }); });\n}\n//# sourceMappingURL=empty.js.map","import { EMPTY } from '../observable/empty';\nimport { operate } from '../util/lift';\nimport { createOperatorSubscriber } from './OperatorSubscriber';\nexport function take(count) {\n return count <= 0\n ?\n function () { return EMPTY; }\n : operate(function (source, subscriber) {\n var seen = 0;\n source.subscribe(createOperatorSubscriber(subscriber, function (value) {\n if (++seen <= count) {\n subscriber.next(value);\n if (count <= seen) {\n subscriber.complete();\n }\n }\n }));\n });\n}\n//# sourceMappingURL=take.js.map","import { concat } from '../observable/concat';\nimport { take } from './take';\nimport { ignoreElements } from './ignoreElements';\nimport { mapTo } from './mapTo';\nimport { mergeMap } from './mergeMap';\nexport function delayWhen(delayDurationSelector, subscriptionDelay) {\n if (subscriptionDelay) {\n return function (source) {\n return concat(subscriptionDelay.pipe(take(1), ignoreElements()), source.pipe(delayWhen(delayDurationSelector)));\n };\n }\n return mergeMap(function (value, index) { return delayDurationSelector(value, index).pipe(take(1), mapTo(value)); });\n}\n//# sourceMappingURL=delayWhen.js.map","import { operate } from '../util/lift';\nimport { createOperatorSubscriber } from './OperatorSubscriber';\nimport { noop } from '../util/noop';\nexport function ignoreElements() {\n return operate(function (source, subscriber) {\n source.subscribe(createOperatorSubscriber(subscriber, noop));\n });\n}\n//# sourceMappingURL=ignoreElements.js.map","import { map } from './map';\nexport function mapTo(value) {\n return map(function () { return value; });\n}\n//# sourceMappingURL=mapTo.js.map","import { asyncScheduler } from '../scheduler/async';\nimport { delayWhen } from './delayWhen';\nimport { timer } from '../observable/timer';\nexport function delay(due, scheduler) {\n if (scheduler === void 0) { scheduler = asyncScheduler; }\n var duration = timer(due, scheduler);\n return delayWhen(function () { return duration; });\n}\n//# sourceMappingURL=delay.js.map","import { identity } from '../util/identity';\nimport { operate } from '../util/lift';\nimport { createOperatorSubscriber } from './OperatorSubscriber';\nexport function distinctUntilChanged(comparator, keySelector) {\n if (keySelector === void 0) { keySelector = identity; }\n comparator = comparator !== null && comparator !== void 0 ? comparator : defaultCompare;\n return operate(function (source, subscriber) {\n var previousKey;\n var first = true;\n source.subscribe(createOperatorSubscriber(subscriber, function (value) {\n var currentKey = keySelector(value);\n if (first || !comparator(previousKey, currentKey)) {\n first = false;\n previousKey = currentKey;\n subscriber.next(value);\n }\n }));\n });\n}\nfunction defaultCompare(a, b) {\n return a === b;\n}\n//# sourceMappingURL=distinctUntilChanged.js.map","import { operate } from '../util/lift';\nimport { createOperatorSubscriber } from './OperatorSubscriber';\nexport function filter(predicate, thisArg) {\n return operate(function (source, subscriber) {\n var index = 0;\n source.subscribe(createOperatorSubscriber(subscriber, function (value) { return predicate.call(thisArg, value, index++) && subscriber.next(value); }));\n });\n}\n//# sourceMappingURL=filter.js.map","import { filter } from './filter';\nexport function skip(count) {\n return filter(function (_, index) { return count <= index; });\n}\n//# sourceMappingURL=skip.js.map","import { concat } from '../observable/concat';\nimport { popScheduler } from '../util/args';\nimport { operate } from '../util/lift';\nexport function startWith() {\n var values = [];\n for (var _i = 0; _i < arguments.length; _i++) {\n values[_i] = arguments[_i];\n }\n var scheduler = popScheduler(values);\n return operate(function (source, subscriber) {\n (scheduler ? concat(values, source, scheduler) : concat(values, source)).subscribe(subscriber);\n });\n}\n//# sourceMappingURL=startWith.js.map","import { innerFrom } from '../observable/innerFrom';\nimport { operate } from '../util/lift';\nimport { createOperatorSubscriber } from './OperatorSubscriber';\nexport function switchMap(project, resultSelector) {\n return operate(function (source, subscriber) {\n var innerSubscriber = null;\n var index = 0;\n var isComplete = false;\n var checkComplete = function () { return isComplete && !innerSubscriber && subscriber.complete(); };\n source.subscribe(createOperatorSubscriber(subscriber, function (value) {\n innerSubscriber === null || innerSubscriber === void 0 ? void 0 : innerSubscriber.unsubscribe();\n var innerIndex = 0;\n var outerIndex = index++;\n innerFrom(project(value, outerIndex)).subscribe((innerSubscriber = createOperatorSubscriber(subscriber, function (innerValue) { return subscriber.next(resultSelector ? resultSelector(value, innerValue, outerIndex, innerIndex++) : innerValue); }, function () {\n innerSubscriber = null;\n checkComplete();\n })));\n }, function () {\n isComplete = true;\n checkComplete();\n }));\n });\n}\n//# sourceMappingURL=switchMap.js.map","import { isFunction } from '../util/isFunction';\nimport { operate } from '../util/lift';\nimport { createOperatorSubscriber } from './OperatorSubscriber';\nimport { identity } from '../util/identity';\nexport function tap(observerOrNext, error, complete) {\n var tapObserver = isFunction(observerOrNext) || error || complete\n ?\n { next: observerOrNext, error: error, complete: complete }\n : observerOrNext;\n return tapObserver\n ? operate(function (source, subscriber) {\n var _a;\n (_a = tapObserver.subscribe) === null || _a === void 0 ? void 0 : _a.call(tapObserver);\n var isUnsub = true;\n source.subscribe(createOperatorSubscriber(subscriber, function (value) {\n var _a;\n (_a = tapObserver.next) === null || _a === void 0 ? void 0 : _a.call(tapObserver, value);\n subscriber.next(value);\n }, function () {\n var _a;\n isUnsub = false;\n (_a = tapObserver.complete) === null || _a === void 0 ? void 0 : _a.call(tapObserver);\n subscriber.complete();\n }, function (err) {\n var _a;\n isUnsub = false;\n (_a = tapObserver.error) === null || _a === void 0 ? void 0 : _a.call(tapObserver, err);\n subscriber.error(err);\n }, function () {\n var _a, _b;\n if (isUnsub) {\n (_a = tapObserver.unsubscribe) === null || _a === void 0 ? void 0 : _a.call(tapObserver);\n }\n (_b = tapObserver.finalize) === null || _b === void 0 ? void 0 : _b.call(tapObserver);\n }));\n })\n :\n identity;\n}\n//# sourceMappingURL=tap.js.map","import { DexieCloudDB } from '../db/DexieCloudDB';\n\n//const hasSW = 'serviceWorker' in navigator;\nlet hasComplainedAboutSyncEvent = false;\n\nexport async function registerSyncEvent(db: DexieCloudDB, purpose: \"push\" | \"pull\") {\n try {\n // Send sync event to SW:\n const sw: ServiceWorkerRegistration & {sync?: any} = await navigator.serviceWorker.ready;\n if (purpose === \"push\" && sw.sync) {\n await sw.sync.register(`dexie-cloud:${db.name}`);\n }\n if (sw.active) {\n // Use postMessage for pull syncs and for browsers not supporting sync event (Firefox, Safari).\n // Also chromium based browsers with sw.sync as a fallback for sleepy sync events not taking action for a while.\n sw.active.postMessage({\n type: 'dexie-cloud-sync',\n dbName: db.name,\n purpose\n });\n } else {\n throw new Error(`Failed to trigger sync - there's no active service worker`);\n }\n return;\n } catch (e) {\n if (!hasComplainedAboutSyncEvent) {\n console.debug(`Dexie Cloud: Could not register sync event`, e);\n hasComplainedAboutSyncEvent = true;\n }\n }\n}\n\nexport async function registerPeriodicSyncEvent(db: DexieCloudDB) {\n try {\n // Register periodicSync event to SW:\n // @ts-ignore\n const { periodicSync } = await navigator.serviceWorker.ready;\n if (periodicSync) {\n try {\n await periodicSync.register(\n `dexie-cloud:${db.name}`,\n db.cloud.options?.periodicSync\n );\n console.debug(\n `Dexie Cloud: Successfully registered periodicsync event for ${db.name}`\n );\n } catch (e) {\n console.debug(`Dexie Cloud: Failed to register periodic sync. Your PWA must be installed to allow background sync.`, e);\n }\n } else {\n console.debug(`Dexie Cloud: periodicSync not supported.`);\n }\n } catch (e) {\n console.debug(\n `Dexie Cloud: Could not register periodicSync for ${db.name}`,\n e\n );\n }\n}\n","import { DexieCloudDB } from \"../db/DexieCloudDB\";\nimport { registerSyncEvent } from \"./registerSyncEvent\";\n\nexport function triggerSync(db: DexieCloudDB, purpose: \"push\" | \"pull\") {\n if (db.cloud.usingServiceWorker) {\n console.debug('registering sync event');\n registerSyncEvent(db, purpose);\n } else {\n db.localSyncEvent.next({purpose});\n }\n}","const hasArrayBufferFromBase64 = \"fromBase64\" in Uint8Array; // https://github.com/tc39/proposal-arraybuffer-base64;\nconst hasArrayBufferToBase64 = \"toBase64\" in Uint8Array.prototype; // https://github.com/tc39/proposal-arraybuffer-base64;\nexport const b64decode = typeof Buffer !== \"undefined\"\n ? (base64) => Buffer.from(base64, \"base64\") // Node\n : hasArrayBufferFromBase64\n ? // @ts-ignore: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Uint8Array/fromBase64\n (base64) => Uint8Array.fromBase64(base64) // Modern javascript standard\n : (base64) => {\n // Legacy DOM workaround\n const binary_string = atob(base64);\n const len = binary_string.length;\n const bytes = new Uint8Array(len);\n for (var i = 0; i < len; i++) {\n bytes[i] = binary_string.charCodeAt(i);\n }\n return bytes;\n };\nexport const b64encode = typeof Buffer !== \"undefined\"\n ? (b) => {\n // Node\n if (ArrayBuffer.isView(b)) {\n return Buffer.from(b.buffer, b.byteOffset, b.byteLength).toString(\"base64\");\n }\n else {\n return Buffer.from(b).toString(\"base64\");\n }\n }\n : hasArrayBufferToBase64\n ? (b) => {\n // Uint8Array.prototype.toBase64 is available in modern browsers\n const u8a = ArrayBuffer.isView(b) ? b : new Uint8Array(b);\n // @ts-ignore: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Uint8Array/toBase64\n return u8a.toBase64();\n }\n : (b) => {\n // Legacy DOM workaround\n const u8a = ArrayBuffer.isView(b) ? b : new Uint8Array(b);\n const CHUNK_SIZE = 0x1000;\n const strs = [];\n for (let i = 0, l = u8a.length; i < l; i += CHUNK_SIZE) {\n const chunk = u8a.subarray(i, i + CHUNK_SIZE);\n strs.push(String.fromCharCode.apply(null, chunk));\n }\n return btoa(strs.join(\"\"));\n };\n","import { PersistedSyncState } from '../db/entities/PersistedSyncState';\nimport { b64encode } from 'dreambase-library/dist/common/base64';\n\nexport async function computeRealmSetHash({\n realms,\n inviteRealms,\n}: PersistedSyncState) {\n const data = JSON.stringify(\n [\n ...realms.map((realmId) => ({ realmId, accepted: true })),\n ...inviteRealms.map((realmId) => ({ realmId, accepted: false })),\n ].sort((a, b) =>\n a.realmId < b.realmId ? -1 : a.realmId > b.realmId ? 1 : 0\n )\n );\n const byteArray = new TextEncoder().encode(data);\n const digestBytes = await crypto.subtle.digest('SHA-1', byteArray);\n const base64 = b64encode(digestBytes);\n return base64;\n}\n","import { IndexableType, Table } from \"dexie\";\nimport { DexieCloudDB } from \"../db/DexieCloudDB\";\nimport { EntityCommon } from \"../db/entities/EntityCommon\";\n\nexport function getSyncableTables(db: DexieCloudDB): Table<EntityCommon>[] {\n return Object.entries(db.cloud.schema || {})\n .filter(([, { markedForSync }]) => markedForSync)\n .map(([tbl]) => db.tables.filter(({name}) => name === tbl)[0])\n .filter(cloudTableSchema => cloudTableSchema);\n}\n","\n\nexport function getMutationTable(tableName: string) {\n return `$${tableName}_mutations`;\n}\n","\n\nexport function getTableFromMutationTable(mutationTable: string) {\n const tableName = /^\\$(.*)_mutations$/.exec(mutationTable)?.[1];\n if (!tableName) throw new Error(`Given mutationTable ${mutationTable} is not correct`);\n return tableName;\n}\n","const concat = [].concat;\nexport function flatten<T>(a: (T | T[])[]): T[] {\n return concat.apply([], a);\n}\n","import { Table } from 'dexie';\nimport { getTableFromMutationTable } from '../helpers/getTableFromMutationTable';\nimport { DexieCloudDB } from '../db/DexieCloudDB';\nimport { DBOperation, DBOperationsSet } from 'dexie-cloud-common';\nimport { flatten } from '../helpers/flatten';\n\nexport async function listClientChanges(\n mutationTables: Table[],\n db: DexieCloudDB,\n { since = {} as { [table: string]: number }, limit = Infinity } = {}\n): Promise<DBOperationsSet> {\n const allMutsOnTables = await Promise.all(\n mutationTables.map(async (mutationTable) => {\n const tableName = getTableFromMutationTable(mutationTable.name);\n const lastRevision = since[tableName];\n\n let query = lastRevision\n ? mutationTable.where('rev').above(lastRevision)\n : mutationTable;\n\n if (limit < Infinity) query = query.limit(limit);\n\n const muts: DBOperation[] = await query.toArray();\n\n //const objTable = db.table(tableName);\n /*for (const mut of muts) {\n if (mut.type === \"insert\" || mut.type === \"upsert\") {\n mut.values = await objTable.bulkGet(mut.keys);\n }\n }*/\n return muts.map((mut) => ({\n table: tableName,\n mut,\n }));\n })\n );\n\n // Sort by time to get a true order of the operations (between tables)\n const sorted = flatten(allMutsOnTables).sort((a, b) => a.mut.txid === b.mut.txid\n ? a.mut.opNo! - b.mut.opNo! // Within same transaction, sort by opNo\n : a.mut.ts! - b.mut.ts! // Different transactions - sort by timestamp when mutation resolved\n );\n const result: DBOperationsSet = [];\n let currentEntry: {\n table: string;\n muts: DBOperation[];\n } | null = null;\n let currentTxid: string | null = null;\n for (const { table, mut } of sorted) {\n if (\n currentEntry &&\n currentEntry.table === table &&\n currentTxid === mut.txid\n ) {\n currentEntry.muts.push(mut);\n } else {\n currentEntry = {\n table,\n muts: [mut],\n };\n currentTxid = mut.txid!;\n result.push(currentEntry);\n }\n }\n\n // Filter out those tables that doesn't have any mutations:\n return result;\n}\n","export function randomString(bytes: number) {\n const buf = new Uint8Array(bytes);\n if (typeof crypto !== 'undefined') {\n crypto.getRandomValues(buf);\n } else {\n for (let i = 0; i < bytes; i++) buf[i] = Math.floor(Math.random() * 256);\n }\n if (typeof Buffer !== 'undefined' && Buffer.from) {\n return Buffer.from(buf).toString('base64');\n } else if (typeof btoa !== 'undefined') {\n return btoa(String.fromCharCode.apply(null, buf));\n } else {\n throw new Error('No btoa or Buffer available');\n }\n}\n","export function assert(b) {\n if (!b)\n throw new Error('Assertion Failed');\n}\nconst _hasOwn = {}.hasOwnProperty;\nexport function hasOwn(obj, prop) {\n return _hasOwn.call(obj, prop);\n}\nexport function setByKeyPath(obj, keyPath, value) {\n if (!obj || keyPath === undefined)\n return;\n if ('isFrozen' in Object && Object.isFrozen(obj))\n return;\n if (typeof keyPath !== 'string' && 'length' in keyPath) {\n assert(typeof value !== 'string' && 'length' in value);\n for (var i = 0, l = keyPath.length; i < l; ++i) {\n setByKeyPath(obj, keyPath[i], value[i]);\n }\n }\n else {\n var period = keyPath.indexOf('.');\n if (period !== -1) {\n var currentKeyPath = keyPath.substr(0, period);\n var remainingKeyPath = keyPath.substr(period + 1);\n if (remainingKeyPath === '')\n if (value === undefined) {\n if (Array.isArray(obj)) {\n if (!isNaN(parseInt(currentKeyPath)))\n obj.splice(parseInt(currentKeyPath), 1);\n }\n else\n delete obj[currentKeyPath];\n // @ts-ignore: even if currentKeyPath would be numeric string and obj would be array - it works.\n }\n else\n obj[currentKeyPath] = value;\n else {\n //@ts-ignore: even if currentKeyPath would be numeric string and obj would be array - it works.\n var innerObj = obj[currentKeyPath];\n //@ts-ignore: even if currentKeyPath would be numeric string and obj would be array - it works.\n if (!innerObj || !hasOwn(obj, currentKeyPath))\n innerObj = (obj[currentKeyPath] = {});\n setByKeyPath(innerObj, remainingKeyPath, value);\n }\n }\n else {\n if (value === undefined) {\n if (Array.isArray(obj) && !isNaN(parseInt(keyPath)))\n // @ts-ignore: even if currentKeyPath would be numeric string and obj would be array - it works.\n obj.splice(keyPath, 1);\n //@ts-ignore: even if currentKeyPath would be numeric string and obj would be array - it works.\n else\n delete obj[keyPath];\n //@ts-ignore: even if currentKeyPath would be numeric string and obj would be array - it works.\n }\n else\n obj[keyPath] = value;\n }\n }\n}\nexport const randomString = typeof self !== 'undefined' && typeof crypto !== 'undefined' ? (bytes, randomFill = crypto.getRandomValues.bind(crypto)) => {\n // Web\n const buf = new Uint8Array(bytes);\n randomFill(buf);\n return self.btoa(String.fromCharCode.apply(null, buf));\n} : typeof Buffer !== 'undefined' ? (bytes, randomFill = simpleRandomFill) => {\n // Node\n const buf = Buffer.alloc(bytes);\n randomFill(buf);\n return buf.toString(\"base64\");\n} : () => { throw new Error(\"No implementation of randomString was found\"); };\nfunction simpleRandomFill(buf) {\n for (let i = 0; i < buf.length; ++i) {\n buf[i] = Math.floor(Math.random() * 256);\n }\n}\n","const validIDTypes = {\n Uint8Array,\n};\n/** Verifies that given primary key is valid.\n * The reason we narrow validity for valid keys are twofold:\n * 1: Make sure to only support types that can be used as an object index in DBKeyMutationSet.\n * For example, ArrayBuffer cannot be used (gives \"object ArrayBuffer\") but Uint8Array can be\n * used (gives comma-delimited list of included bytes).\n * 2: Avoid using plain numbers and Dates as keys when they are synced, as they are not globally unique.\n * 3: Since we store the key as a VARCHAR server side in current version, try not promote types that stringifies to become very long server side.\n *\n * @param id\n * @returns\n */\nexport function isValidSyncableID(id) {\n if (typeof id === \"string\")\n return true;\n //if (validIDTypes[toStringTag(id)]) return true;\n //if (Array.isArray(id)) return id.every((part) => isValidSyncableID(part));\n if (Array.isArray(id) && id.some(key => isValidSyncableID(key)) && id.every(isValidSyncableIDPart))\n return true;\n return false;\n}\n/** Verifies that given key part is valid.\n * 1: Make sure that arrays of this types are stringified correclty and works with DBKeyMutationSet.\n * For example, ArrayBuffer cannot be used (gives \"object ArrayBuffer\") but Uint8Array can be\n * used (gives comma-delimited list of included bytes).\n * 2: Since we store the key as a VARCHAR server side in current version, try not promote types that stringifies to become very long server side.\n*/\nfunction isValidSyncableIDPart(part) {\n return typeof part === \"string\" || typeof part === \"number\" || Array.isArray(part) && part.every(isValidSyncableIDPart);\n}\nexport function isValidAtID(id, idPrefix) {\n return !idPrefix || (typeof id === \"string\" && id.startsWith(idPrefix));\n}\n","import { setByKeyPath } from \"../utils.js\";\nexport function applyOperation(target, table, op) {\n const tbl = target[table] || (target[table] = {});\n const keys = op.keys.map(key => typeof key === 'string' ? key : JSON.stringify(key));\n switch (op.type) {\n case \"insert\":\n // TODO: Don't treat insert and upsert the same?\n case \"upsert\":\n keys.forEach((key, idx) => {\n tbl[key] = {\n type: \"ups\",\n val: op.values[idx],\n };\n });\n break;\n case \"update\":\n case \"modify\": {\n keys.forEach((key, idx) => {\n const changeSpec = op.type === \"update\"\n ? op.changeSpecs[idx]\n : op.changeSpec;\n const entry = tbl[key];\n if (!entry) {\n tbl[key] = {\n type: \"upd\",\n mod: changeSpec,\n };\n }\n else {\n switch (entry.type) {\n case \"ups\":\n // Adjust the existing upsert with additional updates\n for (const [propPath, value] of Object.entries(changeSpec)) {\n setByKeyPath(entry.val, propPath, value);\n }\n break;\n case \"del\":\n // No action.\n break;\n case \"upd\":\n // Adjust existing update with additional updates\n Object.assign(entry.mod, changeSpec); // May work for deep props as well - new keys is added later, right? Does the prop order persist along TSON and all? But it will not be 100% when combined with some server code (seach for \"address.city\": \"Stockholm\" comment)\n break;\n }\n }\n });\n break;\n }\n case \"delete\":\n keys.forEach((key) => {\n tbl[key] = {\n type: \"del\",\n };\n });\n break;\n }\n return target;\n}\n","import { applyOperation } from \"./applyOperation.js\";\nexport function applyOperations(target, ops) {\n for (const { table, muts } of ops) {\n for (const mut of muts) {\n applyOperation(target, table, mut);\n }\n }\n}\n","/**\n * Common Math expressions.\n *\n * @module math\n */\n\nexport const floor = Math.floor\nexport const ceil = Math.ceil\nexport const abs = Math.abs\nexport const imul = Math.imul\nexport const round = Math.round\nexport const log10 = Math.log10\nexport const log2 = Math.log2\nexport const log = Math.log\nexport const sqrt = Math.sqrt\n\n/**\n * @function\n * @param {number} a\n * @param {number} b\n * @return {number} The sum of a and b\n */\nexport const add = (a, b) => a + b\n\n/**\n * @function\n * @param {number} a\n * @param {number} b\n * @return {number} The smaller element of a and b\n */\nexport const min = (a, b) => a < b ? a : b\n\n/**\n * @function\n * @param {number} a\n * @param {number} b\n * @return {number} The bigger element of a and b\n */\nexport const max = (a, b) => a > b ? a : b\n\nexport const isNaN = Number.isNaN\n\nexport const pow = Math.pow\n/**\n * Base 10 exponential function. Returns the value of 10 raised to the power of pow.\n *\n * @param {number} exp\n * @return {number}\n */\nexport const exp10 = exp => Math.pow(10, exp)\n\nexport const sign = Math.sign\n\n/**\n * @param {number} n\n * @return {boolean} Wether n is negative. This function also differentiates between -0 and +0\n */\nexport const isNegativeZero = n => n !== 0 ? n < 0 : 1 / n < 0\n","/* eslint-env browser */\n\n/**\n * Binary data constants.\n *\n * @module binary\n */\n\n/**\n * n-th bit activated.\n *\n * @type {number}\n */\nexport const BIT1 = 1\nexport const BIT2 = 2\nexport const BIT3 = 4\nexport const BIT4 = 8\nexport const BIT5 = 16\nexport const BIT6 = 32\nexport const BIT7 = 64\nexport const BIT8 = 128\nexport const BIT9 = 256\nexport const BIT10 = 512\nexport const BIT11 = 1024\nexport const BIT12 = 2048\nexport const BIT13 = 4096\nexport const BIT14 = 8192\nexport const BIT15 = 16384\nexport const BIT16 = 32768\nexport const BIT17 = 65536\nexport const BIT18 = 1 << 17\nexport const BIT19 = 1 << 18\nexport const BIT20 = 1 << 19\nexport const BIT21 = 1 << 20\nexport const BIT22 = 1 << 21\nexport const BIT23 = 1 << 22\nexport const BIT24 = 1 << 23\nexport const BIT25 = 1 << 24\nexport const BIT26 = 1 << 25\nexport const BIT27 = 1 << 26\nexport const BIT28 = 1 << 27\nexport const BIT29 = 1 << 28\nexport const BIT30 = 1 << 29\nexport const BIT31 = 1 << 30\nexport const BIT32 = 1 << 31\n\n/**\n * First n bits activated.\n *\n * @type {number}\n */\nexport const BITS0 = 0\nexport const BITS1 = 1\nexport const BITS2 = 3\nexport const BITS3 = 7\nexport const BITS4 = 15\nexport const BITS5 = 31\nexport const BITS6 = 63\nexport const BITS7 = 127\nexport const BITS8 = 255\nexport const BITS9 = 511\nexport const BITS10 = 1023\nexport const BITS11 = 2047\nexport const BITS12 = 4095\nexport const BITS13 = 8191\nexport const BITS14 = 16383\nexport const BITS15 = 32767\nexport const BITS16 = 65535\nexport const BITS17 = BIT18 - 1\nexport const BITS18 = BIT19 - 1\nexport const BITS19 = BIT20 - 1\nexport const BITS20 = BIT21 - 1\nexport const BITS21 = BIT22 - 1\nexport const BITS22 = BIT23 - 1\nexport const BITS23 = BIT24 - 1\nexport const BITS24 = BIT25 - 1\nexport const BITS25 = BIT26 - 1\nexport const BITS26 = BIT27 - 1\nexport const BITS27 = BIT28 - 1\nexport const BITS28 = BIT29 - 1\nexport const BITS29 = BIT30 - 1\nexport const BITS30 = BIT31 - 1\n/**\n * @type {number}\n */\nexport const BITS31 = 0x7FFFFFFF\n/**\n * @type {number}\n */\nexport const BITS32 = 0xFFFFFFFF\n","/**\n * Utility helpers for working with numbers.\n *\n * @module number\n */\n\nimport * as math from './math.js'\nimport * as binary from './binary.js'\n\nexport const MAX_SAFE_INTEGER = Number.MAX_SAFE_INTEGER\nexport const MIN_SAFE_INTEGER = Number.MIN_SAFE_INTEGER\n\nexport const LOWEST_INT32 = 1 << 31\nexport const HIGHEST_INT32 = binary.BITS31\nexport const HIGHEST_UINT32 = binary.BITS32\n\n/* c8 ignore next */\nexport const isInteger = Number.isInteger || (num => typeof num === 'number' && isFinite(num) && math.floor(num) === num)\nexport const isNaN = Number.isNaN\nexport const parseInt = Number.parseInt\n\n/**\n * Count the number of \"1\" bits in an unsigned 32bit number.\n *\n * Super fun bitcount algorithm by Brian Kernighan.\n *\n * @param {number} n\n */\nexport const countBits = n => {\n n &= binary.BITS32\n let count = 0\n while (n) {\n n &= (n - 1)\n count++\n }\n return count\n}\n","/**\n * Utility module to work with Arrays.\n *\n * @module array\n */\n\nimport * as set from './set.js'\n\n/**\n * Return the last element of an array. The element must exist\n *\n * @template L\n * @param {ArrayLike<L>} arr\n * @return {L}\n */\nexport const last = arr => arr[arr.length - 1]\n\n/**\n * @template C\n * @return {Array<C>}\n */\nexport const create = () => /** @type {Array<C>} */ ([])\n\n/**\n * @template D\n * @param {Array<D>} a\n * @return {Array<D>}\n */\nexport const copy = a => /** @type {Array<D>} */ (a.slice())\n\n/**\n * Append elements from src to dest\n *\n * @template M\n * @param {Array<M>} dest\n * @param {Array<M>} src\n */\nexport const appendTo = (dest, src) => {\n for (let i = 0; i < src.length; i++) {\n dest.push(src[i])\n }\n}\n\n/**\n * Transforms something array-like to an actual Array.\n *\n * @function\n * @template T\n * @param {ArrayLike<T>|Iterable<T>} arraylike\n * @return {T}\n */\nexport const from = Array.from\n\n/**\n * True iff condition holds on every element in the Array.\n *\n * @function\n * @template ITEM\n * @template {ArrayLike<ITEM>} ARR\n *\n * @param {ARR} arr\n * @param {function(ITEM, number, ARR):boolean} f\n * @return {boolean}\n */\nexport const every = (arr, f) => {\n for (let i = 0; i < arr.length; i++) {\n if (!f(arr[i], i, arr)) {\n return false\n }\n }\n return true\n}\n\n/**\n * True iff condition holds on some element in the Array.\n *\n * @function\n * @template S\n * @template {ArrayLike<S>} ARR\n * @param {ARR} arr\n * @param {function(S, number, ARR):boolean} f\n * @return {boolean}\n */\nexport const some = (arr, f) => {\n for (let i = 0; i < arr.length; i++) {\n if (f(arr[i], i, arr)) {\n return true\n }\n }\n return false\n}\n\n/**\n * @template ELEM\n *\n * @param {ArrayLike<ELEM>} a\n * @param {ArrayLike<ELEM>} b\n * @return {boolean}\n */\nexport const equalFlat = (a, b) => a.length === b.length && every(a, (item, index) => item === b[index])\n\n/**\n * @template ELEM\n * @param {Array<Array<ELEM>>} arr\n * @return {Array<ELEM>}\n */\nexport const flatten = arr => fold(arr, /** @type {Array<ELEM>} */ ([]), (acc, val) => acc.concat(val))\n\n/**\n * @template T\n * @param {number} len\n * @param {function(number, Array<T>):T} f\n * @return {Array<T>}\n */\nexport const unfold = (len, f) => {\n const array = new Array(len)\n for (let i = 0; i < len; i++) {\n array[i] = f(i, array)\n }\n return array\n}\n\n/**\n * @template T\n * @template RESULT\n * @param {Array<T>} arr\n * @param {RESULT} seed\n * @param {function(RESULT, T, number):RESULT} folder\n */\nexport const fold = (arr, seed, folder) => arr.reduce(folder, seed)\n\nexport const isArray = Array.isArray\n\n/**\n * @template T\n * @param {Array<T>} arr\n * @return {Array<T>}\n */\nexport const unique = arr => from(set.from(arr))\n\n/**\n * @template T\n * @template M\n * @param {ArrayLike<T>} arr\n * @param {function(T):M} mapper\n * @return {Array<T>}\n */\nexport const uniqueBy = (arr, mapper) => {\n /**\n * @type {Set<M>}\n */\n const happened = set.create()\n /**\n * @type {Array<T>}\n */\n const result = []\n for (let i = 0; i < arr.length; i++) {\n const el = arr[i]\n const mapped = mapper(el)\n if (!happened.has(mapped)) {\n happened.add(mapped)\n result.push(el)\n }\n }\n return result\n}\n\n/**\n * @template {ArrayLike<any>} ARR\n * @template {function(ARR extends ArrayLike<infer T> ? T : never, number, ARR):any} MAPPER\n * @param {ARR} arr\n * @param {MAPPER} mapper\n * @return {Array<MAPPER extends function(...any): infer M ? M : never>}\n */\nexport const map = (arr, mapper) => {\n /**\n * @type {Array<any>}\n */\n const res = Array(arr.length)\n for (let i = 0; i < arr.length; i++) {\n res[i] = mapper(/** @type {any} */ (arr[i]), i, /** @type {any} */ (arr))\n }\n return /** @type {any} */ (res)\n}\n","import * as array from './array.js'\n\n/**\n * Utility module to work with strings.\n *\n * @module string\n */\n\nexport const fromCharCode = String.fromCharCode\nexport const fromCodePoint = String.fromCodePoint\n\n/**\n * The largest utf16 character.\n * Corresponds to Uint8Array([255, 255]) or charcodeof(2x2^8)\n */\nexport const MAX_UTF16_CHARACTER = fromCharCode(65535)\n\n/**\n * @param {string} s\n * @return {string}\n */\nconst toLowerCase = s => s.toLowerCase()\n\nconst trimLeftRegex = /^\\s*/g\n\n/**\n * @param {string} s\n * @return {string}\n */\nexport const trimLeft = s => s.replace(trimLeftRegex, '')\n\nconst fromCamelCaseRegex = /([A-Z])/g\n\n/**\n * @param {string} s\n * @param {string} separator\n * @return {string}\n */\nexport const fromCamelCase = (s, separator) => trimLeft(s.replace(fromCamelCaseRegex, match => `${separator}${toLowerCase(match)}`))\n\n/**\n * Compute the utf8ByteLength\n * @param {string} str\n * @return {number}\n */\nexport const utf8ByteLength = str => unescape(encodeURIComponent(str)).length\n\n/**\n * @param {string} str\n * @return {Uint8Array}\n */\nexport const _encodeUtf8Polyfill = str => {\n const encodedString = unescape(encodeURIComponent(str))\n const len = encodedString.length\n const buf = new Uint8Array(len)\n for (let i = 0; i < len; i++) {\n buf[i] = /** @type {number} */ (encodedString.codePointAt(i))\n }\n return buf\n}\n\n/* c8 ignore next */\nexport const utf8TextEncoder = /** @type {TextEncoder} */ (typeof TextEncoder !== 'undefined' ? new TextEncoder() : null)\n\n/**\n * @param {string} str\n * @return {Uint8Array}\n */\nexport const _encodeUtf8Native = str => utf8TextEncoder.encode(str)\n\n/**\n * @param {string} str\n * @return {Uint8Array}\n */\n/* c8 ignore next */\nexport const encodeUtf8 = utf8TextEncoder ? _encodeUtf8Native : _encodeUtf8Polyfill\n\n/**\n * @param {Uint8Array} buf\n * @return {string}\n */\nexport const _decodeUtf8Polyfill = buf => {\n let remainingLen = buf.length\n let encodedString = ''\n let bufPos = 0\n while (remainingLen > 0) {\n const nextLen = remainingLen < 10000 ? remainingLen : 10000\n const bytes = buf.subarray(bufPos, bufPos + nextLen)\n bufPos += nextLen\n // Starting with ES5.1 we can supply a generic array-like object as arguments\n encodedString += String.fromCodePoint.apply(null, /** @type {any} */ (bytes))\n remainingLen -= nextLen\n }\n return decodeURIComponent(escape(encodedString))\n}\n\n/* c8 ignore next */\nexport let utf8TextDecoder = typeof TextDecoder === 'undefined' ? null : new TextDecoder('utf-8', { fatal: true, ignoreBOM: true })\n\n/* c8 ignore start */\nif (utf8TextDecoder && utf8TextDecoder.decode(new Uint8Array()).length === 1) {\n // Safari doesn't handle BOM correctly.\n // This fixes a bug in Safari 13.0.5 where it produces a BOM the first time it is called.\n // utf8TextDecoder.decode(new Uint8Array()).length === 1 on the first call and\n // utf8TextDecoder.decode(new Uint8Array()).length === 1 on the second call\n // Another issue is that from then on no BOM chars are recognized anymore\n /* c8 ignore next */\n utf8TextDecoder = null\n}\n/* c8 ignore stop */\n\n/**\n * @param {Uint8Array} buf\n * @return {string}\n */\nexport const _decodeUtf8Native = buf => /** @type {TextDecoder} */ (utf8TextDecoder).decode(buf)\n\n/**\n * @param {Uint8Array} buf\n * @return {string}\n */\n/* c8 ignore next */\nexport const decodeUtf8 = utf8TextDecoder ? _decodeUtf8Native : _decodeUtf8Polyfill\n\n/**\n * @param {string} str The initial string\n * @param {number} index Starting position\n * @param {number} remove Number of characters to remove\n * @param {string} insert New content to insert\n */\nexport const splice = (str, index, remove, insert = '') => str.slice(0, index) + insert + str.slice(index + remove)\n\n/**\n * @param {string} source\n * @param {number} n\n */\nexport const repeat = (source, n) => array.unfold(n, () => source).join('')\n","/**\n * Efficient schema-less binary encoding with support for variable length encoding.\n *\n * Use [lib0/encoding] with [lib0/decoding]. Every encoding function has a corresponding decoding function.\n *\n * Encodes numbers in little-endian order (least to most significant byte order)\n * and is compatible with Golang's binary encoding (https://golang.org/pkg/encoding/binary/)\n * which is also used in Protocol Buffers.\n *\n * ```js\n * // encoding step\n * const encoder = encoding.createEncoder()\n * encoding.writeVarUint(encoder, 256)\n * encoding.writeVarString(encoder, 'Hello world!')\n * const buf = encoding.toUint8Array(encoder)\n * ```\n *\n * ```js\n * // decoding step\n * const decoder = decoding.createDecoder(buf)\n * decoding.readVarUint(decoder) // => 256\n * decoding.readVarString(decoder) // => 'Hello world!'\n * decoding.hasContent(decoder) // => false - all data is read\n * ```\n *\n * @module encoding\n */\n\nimport * as math from './math.js'\nimport * as number from './number.js'\nimport * as binary from './binary.js'\nimport * as string from './string.js'\nimport * as array from './array.js'\n\n/**\n * A BinaryEncoder handles the encoding to an Uint8Array.\n */\nexport class Encoder {\n constructor () {\n this.cpos = 0\n this.cbuf = new Uint8Array(100)\n /**\n * @type {Array<Uint8Array>}\n */\n this.bufs = []\n }\n}\n\n/**\n * @function\n * @return {Encoder}\n */\nexport const createEncoder = () => new Encoder()\n\n/**\n * @param {function(Encoder):void} f\n */\nexport const encode = (f) => {\n const encoder = createEncoder()\n f(encoder)\n return toUint8Array(encoder)\n}\n\n/**\n * The current length of the encoded data.\n *\n * @function\n * @param {Encoder} encoder\n * @return {number}\n */\nexport const length = encoder => {\n let len = encoder.cpos\n for (let i = 0; i < encoder.bufs.length; i++) {\n len += encoder.bufs[i].length\n }\n return len\n}\n\n/**\n * Check whether encoder is empty.\n *\n * @function\n * @param {Encoder} encoder\n * @return {boolean}\n */\nexport const hasContent = encoder => encoder.cpos > 0 || encoder.bufs.length > 0\n\n/**\n * Transform to Uint8Array.\n *\n * @function\n * @param {Encoder} encoder\n * @return {Uint8Array} The created ArrayBuffer.\n */\nexport const toUint8Array = encoder => {\n const uint8arr = new Uint8Array(length(encoder))\n let curPos = 0\n for (let i = 0; i < encoder.bufs.length; i++) {\n const d = encoder.bufs[i]\n uint8arr.set(d, curPos)\n curPos += d.length\n }\n uint8arr.set(new Uint8Array(encoder.cbuf.buffer, 0, encoder.cpos), curPos)\n return uint8arr\n}\n\n/**\n * Verify that it is possible to write `len` bytes wtihout checking. If\n * necessary, a new Buffer with the required length is attached.\n *\n * @param {Encoder} encoder\n * @param {number} len\n */\nexport const verifyLen = (encoder, len) => {\n const bufferLen = encoder.cbuf.length\n if (bufferLen - encoder.cpos < len) {\n encoder.bufs.push(new Uint8Array(encoder.cbuf.buffer, 0, encoder.cpos))\n encoder.cbuf = new Uint8Array(math.max(bufferLen, len) * 2)\n encoder.cpos = 0\n }\n}\n\n/**\n * Write one byte to the encoder.\n *\n * @function\n * @param {Encoder} encoder\n * @param {number} num The byte that is to be encoded.\n */\nexport const write = (encoder, num) => {\n const bufferLen = encoder.cbuf.length\n if (encoder.cpos === bufferLen) {\n encoder.bufs.push(encoder.cbuf)\n encoder.cbuf = new Uint8Array(bufferLen * 2)\n encoder.cpos = 0\n }\n encoder.cbuf[encoder.cpos++] = num\n}\n\n/**\n * Write one byte at a specific position.\n * Position must already be written (i.e. encoder.length > pos)\n *\n * @function\n * @param {Encoder} encoder\n * @param {number} pos Position to which to write data\n * @param {number} num Unsigned 8-bit integer\n */\nexport const set = (encoder, pos, num) => {\n let buffer = null\n // iterate all buffers and adjust position\n for (let i = 0; i < encoder.bufs.length && buffer === null; i++) {\n const b = encoder.bufs[i]\n if (pos < b.length) {\n buffer = b // found buffer\n } else {\n pos -= b.length\n }\n }\n if (buffer === null) {\n // use current buffer\n buffer = encoder.cbuf\n }\n buffer[pos] = num\n}\n\n/**\n * Write one byte as an unsigned integer.\n *\n * @function\n * @param {Encoder} encoder\n * @param {number} num The number that is to be encoded.\n */\nexport const writeUint8 = write\n\n/**\n * Write one byte as an unsigned Integer at a specific location.\n *\n * @function\n * @param {Encoder} encoder\n * @param {number} pos The location where the data will be written.\n * @param {number} num The number that is to be encoded.\n */\nexport const setUint8 = set\n\n/**\n * Write two bytes as an unsigned integer.\n *\n * @function\n * @param {Encoder} encoder\n * @param {number} num The number that is to be encoded.\n */\nexport const writeUint16 = (encoder, num) => {\n write(encoder, num & binary.BITS8)\n write(encoder, (num >>> 8) & binary.BITS8)\n}\n/**\n * Write two bytes as an unsigned integer at a specific location.\n *\n * @function\n * @param {Encoder} encoder\n * @param {number} pos The location where the data will be written.\n * @param {number} num The number that is to be encoded.\n */\nexport const setUint16 = (encoder, pos, num) => {\n set(encoder, pos, num & binary.BITS8)\n set(encoder, pos + 1, (num >>> 8) & binary.BITS8)\n}\n\n/**\n * Write two bytes as an unsigned integer\n *\n * @function\n * @param {Encoder} encoder\n * @param {number} num The number that is to be encoded.\n */\nexport const writeUint32 = (encoder, num) => {\n for (let i = 0; i < 4; i++) {\n write(encoder, num & binary.BITS8)\n num >>>= 8\n }\n}\n\n/**\n * Write two bytes as an unsigned integer in big endian order.\n * (most significant byte first)\n *\n * @function\n * @param {Encoder} encoder\n * @param {number} num The number that is to be encoded.\n */\nexport const writeUint32BigEndian = (encoder, num) => {\n for (let i = 3; i >= 0; i--) {\n write(encoder, (num >>> (8 * i)) & binary.BITS8)\n }\n}\n\n/**\n * Write two bytes as an unsigned integer at a specific location.\n *\n * @function\n * @param {Encoder} encoder\n * @param {number} pos The location where the data will be written.\n * @param {number} num The number that is to be encoded.\n */\nexport const setUint32 = (encoder, pos, num) => {\n for (let i = 0; i < 4; i++) {\n set(encoder, pos + i, num & binary.BITS8)\n num >>>= 8\n }\n}\n\n/**\n * Write a variable length unsigned integer. Max encodable integer is 2^53.\n *\n * @function\n * @param {Encoder} encoder\n * @param {number} num The number that is to be encoded.\n */\nexport const writeVarUint = (encoder, num) => {\n while (num > binary.BITS7) {\n write(encoder, binary.BIT8 | (binary.BITS7 & num))\n num = math.floor(num / 128) // shift >>> 7\n }\n write(encoder, binary.BITS7 & num)\n}\n\n/**\n * Write a variable length integer.\n *\n * We use the 7th bit instead for signaling that this is a negative number.\n *\n * @function\n * @param {Encoder} encoder\n * @param {number} num The number that is to be encoded.\n */\nexport const writeVarInt = (encoder, num) => {\n const isNegative = math.isNegativeZero(num)\n if (isNegative) {\n num = -num\n }\n // |- whether to continue reading |- whether is negative |- number\n write(encoder, (num > binary.BITS6 ? binary.BIT8 : 0) | (isNegative ? binary.BIT7 : 0) | (binary.BITS6 & num))\n num = math.floor(num / 64) // shift >>> 6\n // We don't need to consider the case of num === 0 so we can use a different\n // pattern here than above.\n while (num > 0) {\n write(encoder, (num > binary.BITS7 ? binary.BIT8 : 0) | (binary.BITS7 & num))\n num = math.floor(num / 128) // shift >>> 7\n }\n}\n\n/**\n * A cache to store strings temporarily\n */\nconst _strBuffer = new Uint8Array(30000)\nconst _maxStrBSize = _strBuffer.length / 3\n\n/**\n * Write a variable length string.\n *\n * @function\n * @param {Encoder} encoder\n * @param {String} str The string that is to be encoded.\n */\nexport const _writeVarStringNative = (encoder, str) => {\n if (str.length < _maxStrBSize) {\n // We can encode the string into the existing buffer\n /* c8 ignore next */\n const written = string.utf8TextEncoder.encodeInto(str, _strBuffer).written || 0\n writeVarUint(encoder, written)\n for (let i = 0; i < written; i++) {\n write(encoder, _strBuffer[i])\n }\n } else {\n writeVarUint8Array(encoder, string.encodeUtf8(str))\n }\n}\n\n/**\n * Write a variable length string.\n *\n * @function\n * @param {Encoder} encoder\n * @param {String} str The string that is to be encoded.\n */\nexport const _writeVarStringPolyfill = (encoder, str) => {\n const encodedString = unescape(encodeURIComponent(str))\n const len = encodedString.length\n writeVarUint(encoder, len)\n for (let i = 0; i < len; i++) {\n write(encoder, /** @type {number} */ (encodedString.codePointAt(i)))\n }\n}\n\n/**\n * Write a variable length string.\n *\n * @function\n * @param {Encoder} encoder\n * @param {String} str The string that is to be encoded.\n */\n/* c8 ignore next */\nexport const writeVarString = (string.utf8TextEncoder && /** @type {any} */ (string.utf8TextEncoder).encodeInto) ? _writeVarStringNative : _writeVarStringPolyfill\n\n/**\n * Write a string terminated by a special byte sequence. This is not very performant and is\n * generally discouraged. However, the resulting byte arrays are lexiographically ordered which\n * makes this a nice feature for databases.\n *\n * The string will be encoded using utf8 and then terminated and escaped using writeTerminatingUint8Array.\n *\n * @function\n * @param {Encoder} encoder\n * @param {String} str The string that is to be encoded.\n */\nexport const writeTerminatedString = (encoder, str) =>\n writeTerminatedUint8Array(encoder, string.encodeUtf8(str))\n\n/**\n * Write a terminating Uint8Array. Note that this is not performant and is generally\n * discouraged. There are few situations when this is needed.\n *\n * We use 0x0 as a terminating character. 0x1 serves as an escape character for 0x0 and 0x1.\n *\n * Example: [0,1,2] is encoded to [1,0,1,1,2,0]. 0x0, and 0x1 needed to be escaped using 0x1. Then\n * the result is terminated using the 0x0 character.\n *\n * This is basically how many systems implement null terminated strings. However, we use an escape\n * character 0x1 to avoid issues and potenial attacks on our database (if this is used as a key\n * encoder for NoSql databases).\n *\n * @function\n * @param {Encoder} encoder\n * @param {Uint8Array} buf The string that is to be encoded.\n */\nexport const writeTerminatedUint8Array = (encoder, buf) => {\n for (let i = 0; i < buf.length; i++) {\n const b = buf[i]\n if (b === 0 || b === 1) {\n write(encoder, 1)\n }\n write(encoder, buf[i])\n }\n write(encoder, 0)\n}\n\n/**\n * Write the content of another Encoder.\n *\n * @TODO: can be improved!\n * - Note: Should consider that when appending a lot of small Encoders, we should rather clone than referencing the old structure.\n * Encoders start with a rather big initial buffer.\n *\n * @function\n * @param {Encoder} encoder The enUint8Arr\n * @param {Encoder} append The BinaryEncoder to be written.\n */\nexport const writeBinaryEncoder = (encoder, append) => writeUint8Array(encoder, toUint8Array(append))\n\n/**\n * Append fixed-length Uint8Array to the encoder.\n *\n * @function\n * @param {Encoder} encoder\n * @param {Uint8Array} uint8Array\n */\nexport const writeUint8Array = (encoder, uint8Array) => {\n const bufferLen = encoder.cbuf.length\n const cpos = encoder.cpos\n const leftCopyLen = math.min(bufferLen - cpos, uint8Array.length)\n const rightCopyLen = uint8Array.length - leftCopyLen\n encoder.cbuf.set(uint8Array.subarray(0, leftCopyLen), cpos)\n encoder.cpos += leftCopyLen\n if (rightCopyLen > 0) {\n // Still something to write, write right half..\n // Append new buffer\n encoder.bufs.push(encoder.cbuf)\n // must have at least size of remaining buffer\n encoder.cbuf = new Uint8Array(math.max(bufferLen * 2, rightCopyLen))\n // copy array\n encoder.cbuf.set(uint8Array.subarray(leftCopyLen))\n encoder.cpos = rightCopyLen\n }\n}\n\n/**\n * Append an Uint8Array to Encoder.\n *\n * @function\n * @param {Encoder} encoder\n * @param {Uint8Array} uint8Array\n */\nexport const writeVarUint8Array = (encoder, uint8Array) => {\n writeVarUint(encoder, uint8Array.byteLength)\n writeUint8Array(encoder, uint8Array)\n}\n\n/**\n * Create an DataView of the next `len` bytes. Use it to write data after\n * calling this function.\n *\n * ```js\n * // write float32 using DataView\n * const dv = writeOnDataView(encoder, 4)\n * dv.setFloat32(0, 1.1)\n * // read float32 using DataView\n * const dv = readFromDataView(encoder, 4)\n * dv.getFloat32(0) // => 1.100000023841858 (leaving it to the reader to find out why this is the correct result)\n * ```\n *\n * @param {Encoder} encoder\n * @param {number} len\n * @return {DataView}\n */\nexport const writeOnDataView = (encoder, len) => {\n verifyLen(encoder, len)\n const dview = new DataView(encoder.cbuf.buffer, encoder.cpos, len)\n encoder.cpos += len\n return dview\n}\n\n/**\n * @param {Encoder} encoder\n * @param {number} num\n */\nexport const writeFloat32 = (encoder, num) => writeOnDataView(encoder, 4).setFloat32(0, num, false)\n\n/**\n * @param {Encoder} encoder\n * @param {number} num\n */\nexport const writeFloat64 = (encoder, num) => writeOnDataView(encoder, 8).setFloat64(0, num, false)\n\n/**\n * @param {Encoder} encoder\n * @param {bigint} num\n */\nexport const writeBigInt64 = (encoder, num) => /** @type {any} */ (writeOnDataView(encoder, 8)).setBigInt64(0, num, false)\n\n/**\n * @param {Encoder} encoder\n * @param {bigint} num\n */\nexport const writeBigUint64 = (encoder, num) => /** @type {any} */ (writeOnDataView(encoder, 8)).setBigUint64(0, num, false)\n\nconst floatTestBed = new DataView(new ArrayBuffer(4))\n/**\n * Check if a number can be encoded as a 32 bit float.\n *\n * @param {number} num\n * @return {boolean}\n */\nconst isFloat32 = num => {\n floatTestBed.setFloat32(0, num)\n return floatTestBed.getFloat32(0) === num\n}\n\n/**\n * Encode data with efficient binary format.\n *\n * Differences to JSON:\n * • Transforms data to a binary format (not to a string)\n * • Encodes undefined, NaN, and ArrayBuffer (these can't be represented in JSON)\n * • Numbers are efficiently encoded either as a variable length integer, as a\n * 32 bit float, as a 64 bit float, or as a 64 bit bigint.\n *\n * Encoding table:\n *\n * | Data Type | Prefix | Encoding Method | Comment |\n * | ------------------- | -------- | ------------------ | ------- |\n * | undefined | 127 | | Functions, symbol, and everything that cannot be identified is encoded as undefined |\n * | null | 126 | | |\n * | integer | 125 | writeVarInt | Only encodes 32 bit signed integers |\n * | float32 | 124 | writeFloat32 | |\n * | float64 | 123 | writeFloat64 | |\n * | bigint | 122 | writeBigInt64 | |\n * | boolean (false) | 121 | | True and false are different data types so we save the following byte |\n * | boolean (true) | 120 | | - 0b01111000 so the last bit determines whether true or false |\n * | string | 119 | writeVarString | |\n * | object<string,any> | 118 | custom | Writes {length} then {length} key-value pairs |\n * | array<any> | 117 | custom | Writes {length} then {length} json values |\n * | Uint8Array | 116 | writeVarUint8Array | We use Uint8Array for any kind of binary data |\n *\n * Reasons for the decreasing prefix:\n * We need the first bit for extendability (later we may want to encode the\n * prefix with writeVarUint). The remaining 7 bits are divided as follows:\n * [0-30] the beginning of the data range is used for custom purposes\n * (defined by the function that uses this library)\n * [31-127] the end of the data range is used for data encoding by\n * lib0/encoding.js\n *\n * @param {Encoder} encoder\n * @param {undefined|null|number|bigint|boolean|string|Object<string,any>|Array<any>|Uint8Array} data\n */\nexport const writeAny = (encoder, data) => {\n switch (typeof data) {\n case 'string':\n // TYPE 119: STRING\n write(encoder, 119)\n writeVarString(encoder, data)\n break\n case 'number':\n if (number.isInteger(data) && math.abs(data) <= binary.BITS31) {\n // TYPE 125: INTEGER\n write(encoder, 125)\n writeVarInt(encoder, data)\n } else if (isFloat32(data)) {\n // TYPE 124: FLOAT32\n write(encoder, 124)\n writeFloat32(encoder, data)\n } else {\n // TYPE 123: FLOAT64\n write(encoder, 123)\n writeFloat64(encoder, data)\n }\n break\n case 'bigint':\n // TYPE 122: BigInt\n write(encoder, 122)\n writeBigInt64(encoder, data)\n break\n case 'object':\n if (data === null) {\n // TYPE 126: null\n write(encoder, 126)\n } else if (array.isArray(data)) {\n // TYPE 117: Array\n write(encoder, 117)\n writeVarUint(encoder, data.length)\n for (let i = 0; i < data.length; i++) {\n writeAny(encoder, data[i])\n }\n } else if (data instanceof Uint8Array) {\n // TYPE 116: ArrayBuffer\n write(encoder, 116)\n writeVarUint8Array(encoder, data)\n } else {\n // TYPE 118: Object\n write(encoder, 118)\n const keys = Object.keys(data)\n writeVarUint(encoder, keys.length)\n for (let i = 0; i < keys.length; i++) {\n const key = keys[i]\n writeVarString(encoder, key)\n writeAny(encoder, data[key])\n }\n }\n break\n case 'boolean':\n // TYPE 120/121: boolean (true/false)\n write(encoder, data ? 120 : 121)\n break\n default:\n // TYPE 127: undefined\n write(encoder, 127)\n }\n}\n\n/**\n * Now come a few stateful encoder that have their own classes.\n */\n\n/**\n * Basic Run Length Encoder - a basic compression implementation.\n *\n * Encodes [1,1,1,7] to [1,3,7,1] (3 times 1, 1 time 7). This encoder might do more harm than good if there are a lot of values that are not repeated.\n *\n * It was originally used for image compression. Cool .. article http://csbruce.com/cbm/transactor/pdfs/trans_v7_i06.pdf\n *\n * @note T must not be null!\n *\n * @template T\n */\nexport class RleEncoder extends Encoder {\n /**\n * @param {function(Encoder, T):void} writer\n */\n constructor (writer) {\n super()\n /**\n * The writer\n */\n this.w = writer\n /**\n * Current state\n * @type {T|null}\n */\n this.s = null\n this.count = 0\n }\n\n /**\n * @param {T} v\n */\n write (v) {\n if (this.s === v) {\n this.count++\n } else {\n if (this.count > 0) {\n // flush counter, unless this is the first value (count = 0)\n writeVarUint(this, this.count - 1) // since count is always > 0, we can decrement by one. non-standard encoding ftw\n }\n this.count = 1\n // write first value\n this.w(this, v)\n this.s = v\n }\n }\n}\n\n/**\n * Basic diff decoder using variable length encoding.\n *\n * Encodes the values [3, 1100, 1101, 1050, 0] to [3, 1097, 1, -51, -1050] using writeVarInt.\n */\nexport class IntDiffEncoder extends Encoder {\n /**\n * @param {number} start\n */\n constructor (start) {\n super()\n /**\n * Current state\n * @type {number}\n */\n this.s = start\n }\n\n /**\n * @param {number} v\n */\n write (v) {\n writeVarInt(this, v - this.s)\n this.s = v\n }\n}\n\n/**\n * A combination of IntDiffEncoder and RleEncoder.\n *\n * Basically first writes the IntDiffEncoder and then counts duplicate diffs using RleEncoding.\n *\n * Encodes the values [1,1,1,2,3,4,5,6] as [1,1,0,2,1,5] (RLE([1,0,0,1,1,1,1,1]) ⇒ RleIntDiff[1,1,0,2,1,5])\n */\nexport class RleIntDiffEncoder extends Encoder {\n /**\n * @param {number} start\n */\n constructor (start) {\n super()\n /**\n * Current state\n * @type {number}\n */\n this.s = start\n this.count = 0\n }\n\n /**\n * @param {number} v\n */\n write (v) {\n if (this.s === v && this.count > 0) {\n this.count++\n } else {\n if (this.count > 0) {\n // flush counter, unless this is the first value (count = 0)\n writeVarUint(this, this.count - 1) // since count is always > 0, we can decrement by one. non-standard encoding ftw\n }\n this.count = 1\n // write first value\n writeVarInt(this, v - this.s)\n this.s = v\n }\n }\n}\n\n/**\n * @param {UintOptRleEncoder} encoder\n */\nconst flushUintOptRleEncoder = encoder => {\n if (encoder.count > 0) {\n // flush counter, unless this is the first value (count = 0)\n // case 1: just a single value. set sign to positive\n // case 2: write several values. set sign to negative to indicate that there is a length coming\n writeVarInt(encoder.encoder, encoder.count === 1 ? encoder.s : -encoder.s)\n if (encoder.count > 1) {\n writeVarUint(encoder.encoder, encoder.count - 2) // since count is always > 1, we can decrement by one. non-standard encoding ftw\n }\n }\n}\n\n/**\n * Optimized Rle encoder that does not suffer from the mentioned problem of the basic Rle encoder.\n *\n * Internally uses VarInt encoder to write unsigned integers. If the input occurs multiple times, we write\n * write it as a negative number. The UintOptRleDecoder then understands that it needs to read a count.\n *\n * Encodes [1,2,3,3,3] as [1,2,-3,3] (once 1, once 2, three times 3)\n */\nexport class UintOptRleEncoder {\n constructor () {\n this.encoder = new Encoder()\n /**\n * @type {number}\n */\n this.s = 0\n this.count = 0\n }\n\n /**\n * @param {number} v\n */\n write (v) {\n if (this.s === v) {\n this.count++\n } else {\n flushUintOptRleEncoder(this)\n this.count = 1\n this.s = v\n }\n }\n\n /**\n * Flush the encoded state and transform this to a Uint8Array.\n *\n * Note that this should only be called once.\n */\n toUint8Array () {\n flushUintOptRleEncoder(this)\n return toUint8Array(this.encoder)\n }\n}\n\n/**\n * Increasing Uint Optimized RLE Encoder\n *\n * The RLE encoder counts the number of same occurences of the same value.\n * The IncUintOptRle encoder counts if the value increases.\n * I.e. 7, 8, 9, 10 will be encoded as [-7, 4]. 1, 3, 5 will be encoded\n * as [1, 3, 5].\n */\nexport class IncUintOptRleEncoder {\n constructor () {\n this.encoder = new Encoder()\n /**\n * @type {number}\n */\n this.s = 0\n this.count = 0\n }\n\n /**\n * @param {number} v\n */\n write (v) {\n if (this.s + this.count === v) {\n this.count++\n } else {\n flushUintOptRleEncoder(this)\n this.count = 1\n this.s = v\n }\n }\n\n /**\n * Flush the encoded state and transform this to a Uint8Array.\n *\n * Note that this should only be called once.\n */\n toUint8Array () {\n flushUintOptRleEncoder(this)\n return toUint8Array(this.encoder)\n }\n}\n\n/**\n * @param {IntDiffOptRleEncoder} encoder\n */\nconst flushIntDiffOptRleEncoder = encoder => {\n if (encoder.count > 0) {\n // 31 bit making up the diff | wether to write the counter\n // const encodedDiff = encoder.diff << 1 | (encoder.count === 1 ? 0 : 1)\n const encodedDiff = encoder.diff * 2 + (encoder.count === 1 ? 0 : 1)\n // flush counter, unless this is the first value (count = 0)\n // case 1: just a single value. set first bit to positive\n // case 2: write several values. set first bit to negative to indicate that there is a length coming\n writeVarInt(encoder.encoder, encodedDiff)\n if (encoder.count > 1) {\n writeVarUint(encoder.encoder, encoder.count - 2) // since count is always > 1, we can decrement by one. non-standard encoding ftw\n }\n }\n}\n\n/**\n * A combination of the IntDiffEncoder and the UintOptRleEncoder.\n *\n * The count approach is similar to the UintDiffOptRleEncoder, but instead of using the negative bitflag, it encodes\n * in the LSB whether a count is to be read. Therefore this Encoder only supports 31 bit integers!\n *\n * Encodes [1, 2, 3, 2] as [3, 1, 6, -1] (more specifically [(1 << 1) | 1, (3 << 0) | 0, -1])\n *\n * Internally uses variable length encoding. Contrary to normal UintVar encoding, the first byte contains:\n * * 1 bit that denotes whether the next value is a count (LSB)\n * * 1 bit that denotes whether this value is negative (MSB - 1)\n * * 1 bit that denotes whether to continue reading the variable length integer (MSB)\n *\n * Therefore, only five bits remain to encode diff ranges.\n *\n * Use this Encoder only when appropriate. In most cases, this is probably a bad idea.\n */\nexport class IntDiffOptRleEncoder {\n constructor () {\n this.encoder = new Encoder()\n /**\n * @type {number}\n */\n this.s = 0\n this.count = 0\n this.diff = 0\n }\n\n /**\n * @param {number} v\n */\n write (v) {\n if (this.diff === v - this.s) {\n this.s = v\n this.count++\n } else {\n flushIntDiffOptRleEncoder(this)\n this.count = 1\n this.diff = v - this.s\n this.s = v\n }\n }\n\n /**\n * Flush the encoded state and transform this to a Uint8Array.\n *\n * Note that this should only be called once.\n */\n toUint8Array () {\n flushIntDiffOptRleEncoder(this)\n return toUint8Array(this.encoder)\n }\n}\n\n/**\n * Optimized String Encoder.\n *\n * Encoding many small strings in a simple Encoder is not very efficient. The function call to decode a string takes some time and creates references that must be eventually deleted.\n * In practice, when decoding several million small strings, the GC will kick in more and more often to collect orphaned string objects (or maybe there is another reason?).\n *\n * This string encoder solves the above problem. All strings are concatenated and written as a single string using a single encoding call.\n *\n * The lengths are encoded using a UintOptRleEncoder.\n */\nexport class StringEncoder {\n constructor () {\n /**\n * @type {Array<string>}\n */\n this.sarr = []\n this.s = ''\n this.lensE = new UintOptRleEncoder()\n }\n\n /**\n * @param {string} string\n */\n write (string) {\n this.s += string\n if (this.s.length > 19) {\n this.sarr.push(this.s)\n this.s = ''\n }\n this.lensE.write(string.length)\n }\n\n toUint8Array () {\n const encoder = new Encoder()\n this.sarr.push(this.s)\n this.s = ''\n writeVarString(encoder, this.sarr.join(''))\n writeUint8Array(encoder, this.lensE.toUint8Array())\n return toUint8Array(encoder)\n }\n}\n","import { Encoder, writeVarString, writeBigUint64, writeAny, toUint8Array, writeVarUint8Array, } from 'lib0/encoding.js';\nexport function encodeYMessage(msg) {\n const encoder = new Encoder();\n writeVarString(encoder, msg.type);\n if ('table' in msg)\n writeVarString(encoder, msg.table);\n if ('prop' in msg)\n writeVarString(encoder, msg.prop);\n switch (msg.type) {\n case 'u-ack':\n case 'u-reject':\n writeBigUint64(encoder, BigInt(msg.i));\n break;\n case 'outdated-server-rev':\n break;\n case 'y-complete-sync-done':\n writeVarString(encoder, msg.yServerRev);\n break;\n default:\n writeAny(encoder, msg.k);\n switch (msg.type) {\n case 'aware':\n writeVarUint8Array(encoder, msg.u);\n break;\n case 'doc-open':\n writeAny(encoder, msg.serverRev);\n writeAny(encoder, msg.sv);\n break;\n case 'doc-close':\n break;\n case 'sv':\n writeVarUint8Array(encoder, msg.sv);\n break;\n case 'u-c':\n writeVarUint8Array(encoder, msg.u);\n writeBigUint64(encoder, BigInt(msg.i));\n break;\n case 'u-s':\n writeVarUint8Array(encoder, msg.u);\n writeVarString(encoder, msg.r || '');\n break;\n case 'in-sync':\n break;\n }\n }\n return toUint8Array(encoder);\n}\n","/**\n * Error helpers.\n *\n * @module error\n */\n\n/**\n * @param {string} s\n * @return {Error}\n */\n/* c8 ignore next */\nexport const create = s => new Error(s)\n\n/**\n * @throws {Error}\n * @return {never}\n */\n/* c8 ignore next 3 */\nexport const methodUnimplemented = () => {\n throw create('Method unimplemented')\n}\n\n/**\n * @throws {Error}\n * @return {never}\n */\n/* c8 ignore next 3 */\nexport const unexpectedCase = () => {\n throw create('Unexpected case')\n}\n","/**\n * Efficient schema-less binary decoding with support for variable length encoding.\n *\n * Use [lib0/decoding] with [lib0/encoding]. Every encoding function has a corresponding decoding function.\n *\n * Encodes numbers in little-endian order (least to most significant byte order)\n * and is compatible with Golang's binary encoding (https://golang.org/pkg/encoding/binary/)\n * which is also used in Protocol Buffers.\n *\n * ```js\n * // encoding step\n * const encoder = encoding.createEncoder()\n * encoding.writeVarUint(encoder, 256)\n * encoding.writeVarString(encoder, 'Hello world!')\n * const buf = encoding.toUint8Array(encoder)\n * ```\n *\n * ```js\n * // decoding step\n * const decoder = decoding.createDecoder(buf)\n * decoding.readVarUint(decoder) // => 256\n * decoding.readVarString(decoder) // => 'Hello world!'\n * decoding.hasContent(decoder) // => false - all data is read\n * ```\n *\n * @module decoding\n */\n\nimport * as binary from './binary.js'\nimport * as math from './math.js'\nimport * as number from './number.js'\nimport * as string from './string.js'\nimport * as error from './error.js'\nimport * as encoding from './encoding.js'\n\nconst errorUnexpectedEndOfArray = error.create('Unexpected end of array')\nconst errorIntegerOutOfRange = error.create('Integer out of Range')\n\n/**\n * A Decoder handles the decoding of an Uint8Array.\n */\nexport class Decoder {\n /**\n * @param {Uint8Array} uint8Array Binary data to decode\n */\n constructor (uint8Array) {\n /**\n * Decoding target.\n *\n * @type {Uint8Array}\n */\n this.arr = uint8Array\n /**\n * Current decoding position.\n *\n * @type {number}\n */\n this.pos = 0\n }\n}\n\n/**\n * @function\n * @param {Uint8Array} uint8Array\n * @return {Decoder}\n */\nexport const createDecoder = uint8Array => new Decoder(uint8Array)\n\n/**\n * @function\n * @param {Decoder} decoder\n * @return {boolean}\n */\nexport const hasContent = decoder => decoder.pos !== decoder.arr.length\n\n/**\n * Clone a decoder instance.\n * Optionally set a new position parameter.\n *\n * @function\n * @param {Decoder} decoder The decoder instance\n * @param {number} [newPos] Defaults to current position\n * @return {Decoder} A clone of `decoder`\n */\nexport const clone = (decoder, newPos = decoder.pos) => {\n const _decoder = createDecoder(decoder.arr)\n _decoder.pos = newPos\n return _decoder\n}\n\n/**\n * Create an Uint8Array view of the next `len` bytes and advance the position by `len`.\n *\n * Important: The Uint8Array still points to the underlying ArrayBuffer. Make sure to discard the result as soon as possible to prevent any memory leaks.\n * Use `buffer.copyUint8Array` to copy the result into a new Uint8Array.\n *\n * @function\n * @param {Decoder} decoder The decoder instance\n * @param {number} len The length of bytes to read\n * @return {Uint8Array}\n */\nexport const readUint8Array = (decoder, len) => {\n const view = new Uint8Array(decoder.arr.buffer, decoder.pos + decoder.arr.byteOffset, len)\n decoder.pos += len\n return view\n}\n\n/**\n * Read variable length Uint8Array.\n *\n * Important: The Uint8Array still points to the underlying ArrayBuffer. Make sure to discard the result as soon as possible to prevent any memory leaks.\n * Use `buffer.copyUint8Array` to copy the result into a new Uint8Array.\n *\n * @function\n * @param {Decoder} decoder\n * @return {Uint8Array}\n */\nexport const readVarUint8Array = decoder => readUint8Array(decoder, readVarUint(decoder))\n\n/**\n * Read the rest of the content as an ArrayBuffer\n * @function\n * @param {Decoder} decoder\n * @return {Uint8Array}\n */\nexport const readTailAsUint8Array = decoder => readUint8Array(decoder, decoder.arr.length - decoder.pos)\n\n/**\n * Skip one byte, jump to the next position.\n * @function\n * @param {Decoder} decoder The decoder instance\n * @return {number} The next position\n */\nexport const skip8 = decoder => decoder.pos++\n\n/**\n * Read one byte as unsigned integer.\n * @function\n * @param {Decoder} decoder The decoder instance\n * @return {number} Unsigned 8-bit integer\n */\nexport const readUint8 = decoder => decoder.arr[decoder.pos++]\n\n/**\n * Read 2 bytes as unsigned integer.\n *\n * @function\n * @param {Decoder} decoder\n * @return {number} An unsigned integer.\n */\nexport const readUint16 = decoder => {\n const uint =\n decoder.arr[decoder.pos] +\n (decoder.arr[decoder.pos + 1] << 8)\n decoder.pos += 2\n return uint\n}\n\n/**\n * Read 4 bytes as unsigned integer.\n *\n * @function\n * @param {Decoder} decoder\n * @return {number} An unsigned integer.\n */\nexport const readUint32 = decoder => {\n const uint =\n (decoder.arr[decoder.pos] +\n (decoder.arr[decoder.pos + 1] << 8) +\n (decoder.arr[decoder.pos + 2] << 16) +\n (decoder.arr[decoder.pos + 3] << 24)) >>> 0\n decoder.pos += 4\n return uint\n}\n\n/**\n * Read 4 bytes as unsigned integer in big endian order.\n * (most significant byte first)\n *\n * @function\n * @param {Decoder} decoder\n * @return {number} An unsigned integer.\n */\nexport const readUint32BigEndian = decoder => {\n const uint =\n (decoder.arr[decoder.pos + 3] +\n (decoder.arr[decoder.pos + 2] << 8) +\n (decoder.arr[decoder.pos + 1] << 16) +\n (decoder.arr[decoder.pos] << 24)) >>> 0\n decoder.pos += 4\n return uint\n}\n\n/**\n * Look ahead without incrementing the position\n * to the next byte and read it as unsigned integer.\n *\n * @function\n * @param {Decoder} decoder\n * @return {number} An unsigned integer.\n */\nexport const peekUint8 = decoder => decoder.arr[decoder.pos]\n\n/**\n * Look ahead without incrementing the position\n * to the next byte and read it as unsigned integer.\n *\n * @function\n * @param {Decoder} decoder\n * @return {number} An unsigned integer.\n */\nexport const peekUint16 = decoder =>\n decoder.arr[decoder.pos] +\n (decoder.arr[decoder.pos + 1] << 8)\n\n/**\n * Look ahead without incrementing the position\n * to the next byte and read it as unsigned integer.\n *\n * @function\n * @param {Decoder} decoder\n * @return {number} An unsigned integer.\n */\nexport const peekUint32 = decoder => (\n decoder.arr[decoder.pos] +\n (decoder.arr[decoder.pos + 1] << 8) +\n (decoder.arr[decoder.pos + 2] << 16) +\n (decoder.arr[decoder.pos + 3] << 24)\n) >>> 0\n\n/**\n * Read unsigned integer (32bit) with variable length.\n * 1/8th of the storage is used as encoding overhead.\n * * numbers < 2^7 is stored in one bytlength\n * * numbers < 2^14 is stored in two bylength\n *\n * @function\n * @param {Decoder} decoder\n * @return {number} An unsigned integer.length\n */\nexport const readVarUint = decoder => {\n let num = 0\n let mult = 1\n const len = decoder.arr.length\n while (decoder.pos < len) {\n const r = decoder.arr[decoder.pos++]\n // num = num | ((r & binary.BITS7) << len)\n num = num + (r & binary.BITS7) * mult // shift $r << (7*#iterations) and add it to num\n mult *= 128 // next iteration, shift 7 \"more\" to the left\n if (r < binary.BIT8) {\n return num\n }\n /* c8 ignore start */\n if (num > number.MAX_SAFE_INTEGER) {\n throw errorIntegerOutOfRange\n }\n /* c8 ignore stop */\n }\n throw errorUnexpectedEndOfArray\n}\n\n/**\n * Read signed integer (32bit) with variable length.\n * 1/8th of the storage is used as encoding overhead.\n * * numbers < 2^7 is stored in one bytlength\n * * numbers < 2^14 is stored in two bylength\n * @todo This should probably create the inverse ~num if number is negative - but this would be a breaking change.\n *\n * @function\n * @param {Decoder} decoder\n * @return {number} An unsigned integer.length\n */\nexport const readVarInt = decoder => {\n let r = decoder.arr[decoder.pos++]\n let num = r & binary.BITS6\n let mult = 64\n const sign = (r & binary.BIT7) > 0 ? -1 : 1\n if ((r & binary.BIT8) === 0) {\n // don't continue reading\n return sign * num\n }\n const len = decoder.arr.length\n while (decoder.pos < len) {\n r = decoder.arr[decoder.pos++]\n // num = num | ((r & binary.BITS7) << len)\n num = num + (r & binary.BITS7) * mult\n mult *= 128\n if (r < binary.BIT8) {\n return sign * num\n }\n /* c8 ignore start */\n if (num > number.MAX_SAFE_INTEGER) {\n throw errorIntegerOutOfRange\n }\n /* c8 ignore stop */\n }\n throw errorUnexpectedEndOfArray\n}\n\n/**\n * Look ahead and read varUint without incrementing position\n *\n * @function\n * @param {Decoder} decoder\n * @return {number}\n */\nexport const peekVarUint = decoder => {\n const pos = decoder.pos\n const s = readVarUint(decoder)\n decoder.pos = pos\n return s\n}\n\n/**\n * Look ahead and read varUint without incrementing position\n *\n * @function\n * @param {Decoder} decoder\n * @return {number}\n */\nexport const peekVarInt = decoder => {\n const pos = decoder.pos\n const s = readVarInt(decoder)\n decoder.pos = pos\n return s\n}\n\n/**\n * We don't test this function anymore as we use native decoding/encoding by default now.\n * Better not modify this anymore..\n *\n * Transforming utf8 to a string is pretty expensive. The code performs 10x better\n * when String.fromCodePoint is fed with all characters as arguments.\n * But most environments have a maximum number of arguments per functions.\n * For effiency reasons we apply a maximum of 10000 characters at once.\n *\n * @function\n * @param {Decoder} decoder\n * @return {String} The read String.\n */\n/* c8 ignore start */\nexport const _readVarStringPolyfill = decoder => {\n let remainingLen = readVarUint(decoder)\n if (remainingLen === 0) {\n return ''\n } else {\n let encodedString = String.fromCodePoint(readUint8(decoder)) // remember to decrease remainingLen\n if (--remainingLen < 100) { // do not create a Uint8Array for small strings\n while (remainingLen--) {\n encodedString += String.fromCodePoint(readUint8(decoder))\n }\n } else {\n while (remainingLen > 0) {\n const nextLen = remainingLen < 10000 ? remainingLen : 10000\n // this is dangerous, we create a fresh array view from the existing buffer\n const bytes = decoder.arr.subarray(decoder.pos, decoder.pos + nextLen)\n decoder.pos += nextLen\n // Starting with ES5.1 we can supply a generic array-like object as arguments\n encodedString += String.fromCodePoint.apply(null, /** @type {any} */ (bytes))\n remainingLen -= nextLen\n }\n }\n return decodeURIComponent(escape(encodedString))\n }\n}\n/* c8 ignore stop */\n\n/**\n * @function\n * @param {Decoder} decoder\n * @return {String} The read String\n */\nexport const _readVarStringNative = decoder =>\n /** @type any */ (string.utf8TextDecoder).decode(readVarUint8Array(decoder))\n\n/**\n * Read string of variable length\n * * varUint is used to store the length of the string\n *\n * @function\n * @param {Decoder} decoder\n * @return {String} The read String\n *\n */\n/* c8 ignore next */\nexport const readVarString = string.utf8TextDecoder ? _readVarStringNative : _readVarStringPolyfill\n\n/**\n * @param {Decoder} decoder\n * @return {Uint8Array}\n */\nexport const readTerminatedUint8Array = decoder => {\n const encoder = encoding.createEncoder()\n let b\n while (true) {\n b = readUint8(decoder)\n if (b === 0) {\n return encoding.toUint8Array(encoder)\n }\n if (b === 1) {\n b = readUint8(decoder)\n }\n encoding.write(encoder, b)\n }\n}\n\n/**\n * @param {Decoder} decoder\n * @return {string}\n */\nexport const readTerminatedString = decoder => string.decodeUtf8(readTerminatedUint8Array(decoder))\n\n/**\n * Look ahead and read varString without incrementing position\n *\n * @function\n * @param {Decoder} decoder\n * @return {string}\n */\nexport const peekVarString = decoder => {\n const pos = decoder.pos\n const s = readVarString(decoder)\n decoder.pos = pos\n return s\n}\n\n/**\n * @param {Decoder} decoder\n * @param {number} len\n * @return {DataView}\n */\nexport const readFromDataView = (decoder, len) => {\n const dv = new DataView(decoder.arr.buffer, decoder.arr.byteOffset + decoder.pos, len)\n decoder.pos += len\n return dv\n}\n\n/**\n * @param {Decoder} decoder\n */\nexport const readFloat32 = decoder => readFromDataView(decoder, 4).getFloat32(0, false)\n\n/**\n * @param {Decoder} decoder\n */\nexport const readFloat64 = decoder => readFromDataView(decoder, 8).getFloat64(0, false)\n\n/**\n * @param {Decoder} decoder\n */\nexport const readBigInt64 = decoder => /** @type {any} */ (readFromDataView(decoder, 8)).getBigInt64(0, false)\n\n/**\n * @param {Decoder} decoder\n */\nexport const readBigUint64 = decoder => /** @type {any} */ (readFromDataView(decoder, 8)).getBigUint64(0, false)\n\n/**\n * @type {Array<function(Decoder):any>}\n */\nconst readAnyLookupTable = [\n decoder => undefined, // CASE 127: undefined\n decoder => null, // CASE 126: null\n readVarInt, // CASE 125: integer\n readFloat32, // CASE 124: float32\n readFloat64, // CASE 123: float64\n readBigInt64, // CASE 122: bigint\n decoder => false, // CASE 121: boolean (false)\n decoder => true, // CASE 120: boolean (true)\n readVarString, // CASE 119: string\n decoder => { // CASE 118: object<string,any>\n const len = readVarUint(decoder)\n /**\n * @type {Object<string,any>}\n */\n const obj = {}\n for (let i = 0; i < len; i++) {\n const key = readVarString(decoder)\n obj[key] = readAny(decoder)\n }\n return obj\n },\n decoder => { // CASE 117: array<any>\n const len = readVarUint(decoder)\n const arr = []\n for (let i = 0; i < len; i++) {\n arr.push(readAny(decoder))\n }\n return arr\n },\n readVarUint8Array // CASE 116: Uint8Array\n]\n\n/**\n * @param {Decoder} decoder\n */\nexport const readAny = decoder => readAnyLookupTable[127 - readUint8(decoder)](decoder)\n\n/**\n * T must not be null.\n *\n * @template T\n */\nexport class RleDecoder extends Decoder {\n /**\n * @param {Uint8Array} uint8Array\n * @param {function(Decoder):T} reader\n */\n constructor (uint8Array, reader) {\n super(uint8Array)\n /**\n * The reader\n */\n this.reader = reader\n /**\n * Current state\n * @type {T|null}\n */\n this.s = null\n this.count = 0\n }\n\n read () {\n if (this.count === 0) {\n this.s = this.reader(this)\n if (hasContent(this)) {\n this.count = readVarUint(this) + 1 // see encoder implementation for the reason why this is incremented\n } else {\n this.count = -1 // read the current value forever\n }\n }\n this.count--\n return /** @type {T} */ (this.s)\n }\n}\n\nexport class IntDiffDecoder extends Decoder {\n /**\n * @param {Uint8Array} uint8Array\n * @param {number} start\n */\n constructor (uint8Array, start) {\n super(uint8Array)\n /**\n * Current state\n * @type {number}\n */\n this.s = start\n }\n\n /**\n * @return {number}\n */\n read () {\n this.s += readVarInt(this)\n return this.s\n }\n}\n\nexport class RleIntDiffDecoder extends Decoder {\n /**\n * @param {Uint8Array} uint8Array\n * @param {number} start\n */\n constructor (uint8Array, start) {\n super(uint8Array)\n /**\n * Current state\n * @type {number}\n */\n this.s = start\n this.count = 0\n }\n\n /**\n * @return {number}\n */\n read () {\n if (this.count === 0) {\n this.s += readVarInt(this)\n if (hasContent(this)) {\n this.count = readVarUint(this) + 1 // see encoder implementation for the reason why this is incremented\n } else {\n this.count = -1 // read the current value forever\n }\n }\n this.count--\n return /** @type {number} */ (this.s)\n }\n}\n\nexport class UintOptRleDecoder extends Decoder {\n /**\n * @param {Uint8Array} uint8Array\n */\n constructor (uint8Array) {\n super(uint8Array)\n /**\n * @type {number}\n */\n this.s = 0\n this.count = 0\n }\n\n read () {\n if (this.count === 0) {\n this.s = readVarInt(this)\n // if the sign is negative, we read the count too, otherwise count is 1\n const isNegative = math.isNegativeZero(this.s)\n this.count = 1\n if (isNegative) {\n this.s = -this.s\n this.count = readVarUint(this) + 2\n }\n }\n this.count--\n return /** @type {number} */ (this.s)\n }\n}\n\nexport class IncUintOptRleDecoder extends Decoder {\n /**\n * @param {Uint8Array} uint8Array\n */\n constructor (uint8Array) {\n super(uint8Array)\n /**\n * @type {number}\n */\n this.s = 0\n this.count = 0\n }\n\n read () {\n if (this.count === 0) {\n this.s = readVarInt(this)\n // if the sign is negative, we read the count too, otherwise count is 1\n const isNegative = math.isNegativeZero(this.s)\n this.count = 1\n if (isNegative) {\n this.s = -this.s\n this.count = readVarUint(this) + 2\n }\n }\n this.count--\n return /** @type {number} */ (this.s++)\n }\n}\n\nexport class IntDiffOptRleDecoder extends Decoder {\n /**\n * @param {Uint8Array} uint8Array\n */\n constructor (uint8Array) {\n super(uint8Array)\n /**\n * @type {number}\n */\n this.s = 0\n this.count = 0\n this.diff = 0\n }\n\n /**\n * @return {number}\n */\n read () {\n if (this.count === 0) {\n const diff = readVarInt(this)\n // if the first bit is set, we read more data\n const hasCount = diff & 1\n this.diff = math.floor(diff / 2) // shift >> 1\n this.count = 1\n if (hasCount) {\n this.count = readVarUint(this) + 2\n }\n }\n this.s += this.diff\n this.count--\n return this.s\n }\n}\n\nexport class StringDecoder {\n /**\n * @param {Uint8Array} uint8Array\n */\n constructor (uint8Array) {\n this.decoder = new UintOptRleDecoder(uint8Array)\n this.str = readVarString(this.decoder)\n /**\n * @type {number}\n */\n this.spos = 0\n }\n\n /**\n * @return {string}\n */\n read () {\n const end = this.spos + this.decoder.read()\n const res = this.str.slice(this.spos, end)\n this.spos = end\n return res\n }\n}\n","import { __asyncGenerator, __asyncValues, __await } from \"tslib\";\nexport function consumeChunkedBinaryStream(source) {\n return __asyncGenerator(this, arguments, function* consumeChunkedBinaryStream_1() {\n var _a, e_1, _b, _c;\n let state = 0;\n let sizeBuf = new Uint8Array(4);\n let sizeBufPos = 0;\n let bufs = [];\n let len = 0;\n try {\n for (var _d = true, source_1 = __asyncValues(source), source_1_1; source_1_1 = yield __await(source_1.next()), _a = source_1_1.done, !_a; _d = true) {\n _c = source_1_1.value;\n _d = false;\n const chunk = _c;\n const dw = new DataView(chunk.buffer, chunk.byteOffset, chunk.byteLength);\n let pos = 0;\n while (pos < chunk.byteLength) {\n switch (state) {\n case 0:\n // Beginning of a size header\n if (pos + 4 > chunk.byteLength) {\n for (const b of chunk.slice(pos)) {\n if (sizeBufPos === 4)\n break;\n sizeBuf[sizeBufPos++] = b;\n ++pos;\n }\n if (sizeBufPos < 4) {\n // Need more bytes in order to read length.\n // Will go out from while loop as well because pos is defenitely = chunk.byteLength here.\n break;\n }\n }\n else if (sizeBufPos > 0 && sizeBufPos < 4) {\n for (const b of chunk.slice(pos, pos + 4 - sizeBufPos)) {\n sizeBuf[sizeBufPos++] = b;\n ++pos;\n }\n }\n // Intentional fall-through...\n case 1:\n len =\n sizeBufPos === 4\n ? new DataView(sizeBuf.buffer, 0, 4).getUint32(0, false)\n : dw.getUint32(pos, false);\n if (sizeBufPos)\n sizeBufPos = 0; // in this case pos is already forwarded\n else\n pos += 4; // else pos is not yet forwarded - that's why we do it now\n // Intentional fall-through...\n case 2:\n // Eat the chunk\n if (pos >= chunk.byteLength) {\n state = 2;\n break;\n }\n if (pos + len > chunk.byteLength) {\n bufs.push(chunk.slice(pos));\n len -= (chunk.byteLength - pos);\n state = 2;\n pos = chunk.byteLength; // will break while loop.\n }\n else {\n if (bufs.length > 0) {\n const concats = new Uint8Array(bufs.reduce((p, c) => p + c.byteLength, len));\n let p = 0;\n for (const buf of bufs) {\n concats.set(buf, p);\n p += buf.byteLength;\n }\n concats.set(chunk.slice(pos, pos + len), p);\n bufs = [];\n yield yield __await(concats);\n }\n else {\n yield yield __await(chunk.slice(pos, pos + len));\n }\n pos += len;\n state = 0;\n }\n break;\n }\n }\n }\n }\n catch (e_1_1) { e_1 = { error: e_1_1 }; }\n finally {\n try {\n if (!_d && !_a && (_b = source_1.return)) yield __await(_b.call(source_1));\n }\n finally { if (e_1) throw e_1.error; }\n }\n });\n}\n","import { TokenErrorResponse } from 'dexie-cloud-common';\n\nexport class TokenErrorResponseError extends Error {\n title: string;\n messageCode:\n | 'INVALID_OTP'\n | 'INVALID_EMAIL'\n | 'LICENSE_LIMIT_REACHED'\n | 'GENERIC_ERROR';\n message: string;\n messageParams?: { [param: string]: string };\n\n constructor({\n title,\n message,\n messageCode,\n messageParams,\n }: TokenErrorResponse) {\n super(message);\n this.name = 'TokenErrorResponseError';\n this.title = title;\n this.messageCode = messageCode;\n this.messageParams = messageParams;\n }\n}\n","import Dexie from 'dexie';\nimport { BehaviorSubject } from 'rxjs';\nimport { take } from 'rxjs/operators';\nimport { DexieCloudDB } from '../db/DexieCloudDB';\nimport { DXCAlert } from '../types/DXCAlert';\nimport { DXCInputField } from '../types/DXCInputField';\nimport { DXCUserInteraction } from '../types/DXCUserInteraction';\n\nexport interface DXCUserInteractionRequest {\n type: DXCUserInteraction['type'];\n title: string;\n alerts: DXCAlert[];\n submitLabel?: string;\n cancelLabel?: string | null;\n fields: { [name: string]: DXCInputField };\n}\n\nexport function interactWithUser<T extends DXCUserInteractionRequest>(\n userInteraction: BehaviorSubject<DXCUserInteraction | undefined>,\n req: T\n): Promise<{\n [P in keyof T['fields']]: string;\n}> {\n let done = false;\n return new Promise<{\n [P in keyof T['fields']]: string;\n }>((resolve, reject) => {\n const interactionProps = {\n submitLabel: 'Submit',\n cancelLabel: 'Cancel',\n ...req,\n onSubmit: (res: {\n [P in keyof T['fields']]: string;\n }) => {\n userInteraction.next(undefined);\n done = true;\n resolve(res);\n },\n onCancel: () => {\n userInteraction.next(undefined);\n done = true;\n reject(new Dexie.AbortError('User cancelled'));\n },\n } as DXCUserInteraction;\n userInteraction.next(interactionProps);\n // Start subscribing for external updates to db.cloud.userInteraction, and if so, cancel this request.\n /*const subscription = userInteraction.subscribe((currentInteractionProps) => {\n if (currentInteractionProps !== interactionProps) {\n if (subscription) subscription.unsubscribe();\n if (!done) {\n reject(new Dexie.AbortError(\"User cancelled\"));\n }\n }\n });*/\n });\n}\n\nexport function alertUser(\n userInteraction: BehaviorSubject<DXCUserInteraction | undefined>,\n title: string,\n ...alerts: DXCAlert[]\n) {\n return interactWithUser(userInteraction, {\n type: 'message-alert',\n title,\n alerts,\n fields: {},\n submitLabel: 'OK',\n cancelLabel: null,\n });\n}\n\nexport async function promptForEmail(\n userInteraction: BehaviorSubject<DXCUserInteraction | undefined>,\n title: string,\n emailHint?: string\n) {\n let email = emailHint || '';\n // Regular expression for email validation\n // ^[\\w-+.]+@([\\w-]+\\.)+[\\w-]{2,10}(\\sas\\s[\\w-+.]+@([\\w-]+\\.)+[\\w-]{2,10})?$\n //\n // ^[\\w-+.]+ : Matches the start of the string. Allows one or more word characters\n // (a-z, A-Z, 0-9, and underscore), hyphen, plus, or dot.\n //\n // @ : Matches the @ symbol.\n // ([\\w-]+\\.)+ : Matches one or more word characters or hyphens followed by a dot.\n // The plus sign outside the parentheses means this pattern can repeat one or more times,\n // allowing for subdomains.\n // [\\w-]{2,10} : Matches between 2 and 10 word characters or hyphens. This is typically for\n // the domain extension like .com, .net, etc.\n // (\\sas\\s[\\w-+.]+@([\\w-]+\\.)+[\\w-]{2,10})?$ : This part is optional (due to the ? at the end).\n // If present, it matches \" as \" followed by another valid email address. This allows for the\n // input to be either a single email address or two email addresses separated by \" as \". \n //\n // The use case for \"<email1> as <email2>\"\" is for when a database owner with full access to the\n // database needs to impersonate another user in the database in order to troubleshoot. This\n // format will only be possible to use when email1 is the owner of an API client with GLOBAL_READ\n // and GLOBAL_WRITE permissions on the database. The email will be checked on the server before\n // allowing it and giving out a token for email2, using the OTP sent to email1.\n while (!email || !/^[\\w-+.]+@([\\w-]+\\.)+[\\w-]{2,10}(\\sas\\s[\\w-+.]+@([\\w-]+\\.)+[\\w-]{2,10})?$/.test(email)) {\n email = (\n await interactWithUser(userInteraction, {\n type: 'email',\n title,\n alerts: email\n ? [\n {\n type: 'error',\n messageCode: 'INVALID_EMAIL',\n message: 'Please enter a valid email address',\n messageParams: {},\n },\n ]\n : [],\n fields: {\n email: {\n type: 'email',\n placeholder: 'you@somedomain.com',\n },\n },\n })\n ).email;\n }\n return email;\n}\n\nexport async function promptForOTP(\n userInteraction: BehaviorSubject<DXCUserInteraction | undefined>,\n email: string,\n alert?: DXCAlert\n) {\n const alerts: DXCAlert[] = [\n {\n type: 'info',\n messageCode: 'OTP_SENT',\n message: `A One-Time password has been sent to {email}`,\n messageParams: { email },\n },\n ];\n if (alert) {\n alerts.push(alert);\n }\n const { otp } = await interactWithUser(userInteraction, {\n type: 'otp',\n title: 'Enter OTP',\n alerts,\n fields: {\n otp: {\n type: 'otp',\n label: 'OTP',\n placeholder: 'Paste OTP here',\n },\n },\n });\n return otp;\n}\n\nexport async function confirmLogout(\n userInteraction: BehaviorSubject<DXCUserInteraction | undefined>,\n currentUserId: string,\n numUnsyncedChanges: number\n) {\n const alerts: DXCAlert[] = [\n {\n type: 'warning',\n messageCode: 'LOGOUT_CONFIRMATION',\n message: `{numUnsyncedChanges} unsynced changes will get lost!\n Logout anyway?`,\n messageParams: {\n currentUserId,\n numUnsyncedChanges: numUnsyncedChanges.toString(),\n }\n },\n ];\n return await interactWithUser(userInteraction, {\n type: 'logout-confirmation',\n title: 'Confirm Logout',\n alerts,\n fields: {},\n submitLabel: 'Confirm logout',\n cancelLabel: 'Cancel'\n })\n .then(() => true)\n .catch(() => false);\n}\n","import Dexie from 'dexie';\nimport type {\n RefreshTokenRequest,\n TokenErrorResponse,\n TokenFinalResponse,\n} from 'dexie-cloud-common';\nimport { b64encode } from 'dreambase-library/dist/common/base64';\nimport { BehaviorSubject } from 'rxjs';\nimport { DexieCloudDB } from '../db/DexieCloudDB';\nimport { UserLogin } from '../db/entities/UserLogin';\nimport { DXCAlert } from '../types/DXCAlert';\nimport {\n DXCMessageAlert,\n DXCUserInteraction,\n} from '../types/DXCUserInteraction';\nimport { TokenErrorResponseError } from './TokenErrorResponseError';\nimport { alertUser, interactWithUser } from './interactWithUser';\nimport { InvalidLicenseError } from '../InvalidLicenseError';\nimport { LoginHints } from '../DexieCloudAPI';\n\nexport type FetchTokenCallback = (tokenParams: {\n public_key: string;\n hints?: LoginHints;\n}) => Promise<TokenFinalResponse | TokenErrorResponse>;\n\nexport async function loadAccessToken(\n db: DexieCloudDB\n): Promise<UserLogin | null> {\n const currentUser = await db.getCurrentUser();\n const {\n accessToken,\n accessTokenExpiration,\n refreshToken,\n refreshTokenExpiration,\n claims,\n } = currentUser;\n if (!accessToken) return null;\n const expTime = accessTokenExpiration?.getTime() ?? Infinity;\n if (expTime > Date.now() && (currentUser.license?.status || 'ok') === 'ok') {\n return currentUser;\n }\n if (!refreshToken) {\n throw new Error(`Refresh token missing`);\n }\n const refreshExpTime = refreshTokenExpiration?.getTime() ?? Infinity;\n if (refreshExpTime <= Date.now()) {\n throw new Error(`Refresh token has expired`);\n }\n const refreshedLogin = await refreshAccessToken(\n db.cloud.options!.databaseUrl,\n currentUser\n );\n await db.table('$logins').update(claims.sub, {\n accessToken: refreshedLogin.accessToken,\n accessTokenExpiration: refreshedLogin.accessTokenExpiration,\n claims: refreshedLogin.claims,\n license: refreshedLogin.license,\n data: refreshedLogin.data,\n });\n return refreshedLogin;\n}\n\nexport async function authenticate(\n url: string,\n context: UserLogin,\n fetchToken: FetchTokenCallback,\n userInteraction: BehaviorSubject<DXCUserInteraction | undefined>,\n hints?: LoginHints\n): Promise<UserLogin> {\n if (\n context.accessToken &&\n context.accessTokenExpiration!.getTime() > Date.now()\n ) {\n return context;\n } else if (\n context.refreshToken &&\n (!context.refreshTokenExpiration ||\n context.refreshTokenExpiration.getTime() > Date.now())\n ) {\n return await refreshAccessToken(url, context);\n } else {\n return await userAuthenticate(context, fetchToken, userInteraction, hints);\n }\n}\n\nexport async function refreshAccessToken(\n url: string,\n login: UserLogin\n): Promise<UserLogin> {\n if (!login.refreshToken)\n throw new Error(`Cannot refresh token - refresh token is missing.`);\n if (!login.nonExportablePrivateKey)\n throw new Error(\n `login.nonExportablePrivateKey is missing - cannot sign refresh token without a private key.`\n );\n\n const time_stamp = Date.now();\n const signing_algorithm = 'RSASSA-PKCS1-v1_5';\n const textEncoder = new TextEncoder();\n const data = textEncoder.encode(login.refreshToken + time_stamp);\n const binarySignature = await crypto.subtle.sign(\n signing_algorithm,\n login.nonExportablePrivateKey,\n data\n );\n const signature = b64encode(binarySignature);\n\n const tokenRequest: RefreshTokenRequest = {\n grant_type: 'refresh_token',\n refresh_token: login.refreshToken,\n scopes: ['ACCESS_DB'],\n signature,\n signing_algorithm,\n time_stamp,\n };\n const res = await fetch(`${url}/token`, {\n body: JSON.stringify(tokenRequest),\n method: 'post',\n headers: { 'Content-Type': 'application/json' },\n mode: 'cors',\n });\n if (res.status !== 200)\n throw new Error(`RefreshToken: Status ${res.status} from ${url}/token`);\n const response: TokenFinalResponse | TokenErrorResponse = await res.json();\n if (response.type === 'error') {\n throw new TokenErrorResponseError(response);\n }\n login.accessToken = response.accessToken;\n login.accessTokenExpiration = response.accessTokenExpiration\n ? new Date(response.accessTokenExpiration)\n : undefined;\n login.claims = response.claims;\n login.license = {\n type: response.userType,\n status: response.claims.license || 'ok',\n }\n if (response.evalDaysLeft != null) {\n login.license.evalDaysLeft = response.evalDaysLeft;\n }\n if (response.userValidUntil != null) {\n login.license.validUntil = new Date(response.userValidUntil);\n }\n if (response.data) {\n login.data = response.data;\n }\n return login;\n}\n\nasync function userAuthenticate(\n context: UserLogin,\n fetchToken: FetchTokenCallback,\n userInteraction: BehaviorSubject<DXCUserInteraction | undefined>,\n hints?: LoginHints\n) {\n if (!crypto.subtle) {\n if (typeof location !== 'undefined' && location.protocol === 'http:') {\n throw new Error(`Dexie Cloud Addon needs to use WebCrypto, but your browser has disabled it due to being served from an insecure location. Please serve it from https or http://localhost:<port> (See https://stackoverflow.com/questions/46670556/how-to-enable-crypto-subtle-for-unsecure-origins-in-chrome/46671627#46671627)`);\n } else {\n throw new Error(`This browser does not support WebCrypto.`);\n }\n }\n const { privateKey, publicKey } = await crypto.subtle.generateKey(\n {\n name: 'RSASSA-PKCS1-v1_5',\n modulusLength: 2048,\n publicExponent: new Uint8Array([0x01, 0x00, 0x01]),\n hash: { name: 'SHA-256' },\n },\n false, // Non-exportable...\n ['sign', 'verify']\n );\n if (!privateKey || !publicKey)\n throw new Error(`Could not generate RSA keypair`); // Typings suggest these can be undefined...\n context.nonExportablePrivateKey = privateKey; //...but storable!\n const publicKeySPKI = await crypto.subtle.exportKey('spki', publicKey);\n const publicKeyPEM = spkiToPEM(publicKeySPKI);\n context.publicKey = publicKey;\n\n try {\n const response2 = await fetchToken({\n public_key: publicKeyPEM,\n hints,\n });\n\n if (response2.type === 'error') {\n throw new TokenErrorResponseError(response2);\n }\n\n if (response2.type !== 'tokens')\n throw new Error(\n `Unexpected response type from token endpoint: ${(response2 as any).type}`\n );\n\n /*const licenseStatus = response2.claims.license || 'ok';\n if (licenseStatus !== 'ok') {\n throw new InvalidLicenseError(licenseStatus);\n }*/\n\n context.accessToken = response2.accessToken;\n context.accessTokenExpiration = new Date(response2.accessTokenExpiration);\n context.refreshToken = response2.refreshToken;\n if (response2.refreshTokenExpiration) {\n context.refreshTokenExpiration = new Date(\n response2.refreshTokenExpiration\n );\n }\n context.userId = response2.claims.sub;\n context.email = response2.claims.email;\n context.name = response2.claims.name;\n context.claims = response2.claims;\n context.license = {\n type: response2.userType,\n status: response2.claims.license || 'ok',\n }\n context.data = response2.data;\n if (response2.evalDaysLeft != null) {\n context.license.evalDaysLeft = response2.evalDaysLeft;\n }\n if (response2.userValidUntil != null) {\n context.license.validUntil = new Date(response2.userValidUntil);\n }\n\n if (response2.alerts && response2.alerts.length > 0) {\n await interactWithUser(userInteraction, {\n type: 'message-alert',\n title: 'Authentication Alert',\n fields: {},\n alerts: response2.alerts as DXCAlert[],\n });\n }\n return context;\n } catch (error) {\n if (error instanceof TokenErrorResponseError) {\n await alertUser(userInteraction, error.title, {\n type: 'error',\n messageCode: error.messageCode,\n message: error.message,\n messageParams: {},\n });\n throw error;\n }\n let message = `We're having a problem authenticating right now.`;\n console.error (`Error authenticating`, error);\n if (error instanceof TypeError) {\n const isOffline = typeof navigator !== undefined && !navigator.onLine;\n if (isOffline) {\n message = `You seem to be offline. Please connect to the internet and try again.`;\n } else if (Dexie.debug || (typeof location !== 'undefined' && (location.hostname === 'localhost' || location.hostname === '127.0.0.1'))) {\n // The audience is most likely the developer. Suggest to whitelist the localhost origin:\n message = `Could not connect to server. Please verify that your origin '${location.origin}' is whitelisted using \\`npx dexie-cloud whitelist\\``;\n } else {\n message = `Could not connect to server. Please verify the connection.`;\n }\n await alertUser(userInteraction, 'Authentication Failed', {\n type: 'error',\n messageCode: 'GENERIC_ERROR',\n message,\n messageParams: {},\n }).catch(() => {}); \n }\n\n throw error;\n }\n}\n\nfunction spkiToPEM(keydata: ArrayBuffer) {\n const keydataB64 = b64encode(keydata);\n const keydataB64Pem = formatAsPem(keydataB64);\n return keydataB64Pem;\n}\n\nfunction formatAsPem(str: string) {\n let finalString = '-----BEGIN PUBLIC KEY-----\\n';\n\n while (str.length > 0) {\n finalString += str.substring(0, 64) + '\\n';\n str = str.substring(64);\n }\n\n finalString = finalString + '-----END PUBLIC KEY-----';\n\n return finalString;\n}\n","const { toString: toStr } = {};\nfunction getToStringTag(val) {\n return toStr.call(val).slice(8, -1);\n}\nexport function escapeDollarProps(value) {\n const keys = Object.keys(value);\n let dollarKeys = null;\n for (let i = 0, l = keys.length; i < l; ++i) {\n if (keys[i][0] === \"$\") {\n dollarKeys = dollarKeys || [];\n dollarKeys.push(keys[i]);\n }\n }\n if (!dollarKeys)\n return value;\n const clone = { ...value };\n for (const k of dollarKeys) {\n delete clone[k];\n }\n for (const k of dollarKeys) {\n clone[\"$\" + k] = value[k];\n }\n return clone;\n}\nconst ObjectDef = {\n replace: escapeDollarProps,\n};\nexport function TypesonSimplified(...typeDefsInputs) {\n const typeDefs = typeDefsInputs.reduce((p, c) => ({ ...p, ...c }), typeDefsInputs.reduce((p, c) => ({ ...c, ...p }), {}));\n const protoMap = new WeakMap();\n return {\n stringify(value, alternateChannel, space) {\n const json = JSON.stringify(value, function (key) {\n const realVal = this[key];\n const typeDef = getTypeDef(realVal);\n return typeDef\n ? typeDef.replace(realVal, alternateChannel, typeDefs)\n : realVal;\n }, space);\n return json;\n },\n parse(tson, alternateChannel) {\n const stack = [];\n return JSON.parse(tson, function (key, value) {\n //\n // Parent Part\n //\n const type = value === null || value === void 0 ? void 0 : value.$t;\n if (type) {\n const typeDef = typeDefs[type];\n value = typeDef\n ? typeDef.revive(value, alternateChannel, typeDefs)\n : value;\n }\n let top = stack[stack.length - 1];\n if (top && top[0] === value) {\n // Do what the kid told us to\n // Unescape dollar props\n value = { ...value };\n // Delete keys that children wanted us to delete\n for (const k of top[1])\n delete value[k];\n // Set keys that children wanted us to set\n for (const [k, v] of Object.entries(top[2])) {\n value[k] = v;\n }\n stack.pop();\n }\n //\n // Child part\n //\n if (value === undefined || (key[0] === \"$\" && key !== \"$t\")) {\n top = stack[stack.length - 1];\n let deletes;\n let mods;\n if (top && top[0] === this) {\n deletes = top[1];\n mods = top[2];\n }\n else {\n stack.push([this, (deletes = []), (mods = {})]);\n }\n if (key[0] === \"$\" && key !== \"$t\") {\n // Unescape props (also preserves undefined if this is a combo)\n deletes.push(key);\n mods[key.substr(1)] = value;\n }\n else {\n // Preserve undefined\n mods[key] = undefined;\n }\n }\n return value;\n });\n },\n };\n function getTypeDef(realVal) {\n const type = typeof realVal;\n switch (typeof realVal) {\n case \"object\":\n case \"function\": {\n // \"object\", \"function\", null\n if (realVal === null)\n return null;\n const proto = Object.getPrototypeOf(realVal);\n if (!proto)\n return ObjectDef;\n let typeDef = protoMap.get(proto);\n if (typeDef !== undefined)\n return typeDef; // Null counts to! So the caching of Array.prototype also counts.\n const toStringTag = getToStringTag(realVal);\n const entry = Object.entries(typeDefs).find(([typeName, typeDef]) => { var _a, _b; return (_b = (_a = typeDef === null || typeDef === void 0 ? void 0 : typeDef.test) === null || _a === void 0 ? void 0 : _a.call(typeDef, realVal, toStringTag)) !== null && _b !== void 0 ? _b : typeName === toStringTag; });\n typeDef = entry === null || entry === void 0 ? void 0 : entry[1];\n if (!typeDef) {\n typeDef = Array.isArray(realVal)\n ? null\n : typeof realVal === \"function\"\n ? typeDefs.function || null\n : ObjectDef;\n }\n protoMap.set(proto, typeDef);\n return typeDef;\n }\n default:\n return typeDefs[type];\n }\n }\n}\n","export const BisonBinaryTypes = {\n Blob: {\n test: (blob, toStringTag) => toStringTag === \"Blob\",\n replace: (blob, altChannel) => {\n const i = altChannel.length;\n altChannel.push(blob);\n return {\n $t: \"Blob\",\n mimeType: blob.type,\n i,\n };\n },\n revive: ({ i, mimeType }, altChannel) => new Blob([altChannel[i]], { type: mimeType }),\n },\n};\n","export default {\n number: {\n replace: (num) => {\n switch (true) {\n case isNaN(num):\n return { $t: \"number\", v: \"NaN\" };\n case num === Infinity:\n return { $t: \"number\", v: \"Infinity\" };\n case num === -Infinity:\n return { $t: \"number\", v: \"-Infinity\" };\n default:\n return num;\n }\n },\n revive: ({ v }) => Number(v),\n },\n};\n","const bigIntDef = {\n bigint: {\n replace: (realVal) => {\n return { $t: \"bigint\", v: \"\" + realVal };\n },\n revive: (obj) => BigInt(obj.v),\n },\n};\nexport default bigIntDef;\n","export default {\n Date: {\n replace: (date) => ({\n $t: \"Date\",\n v: isNaN(date.getTime()) ? \"NaN\" : date.toISOString(),\n }),\n revive: ({ v }) => new Date(v === \"NaN\" ? NaN : Date.parse(v)),\n },\n};\n","export default {\n Set: {\n replace: (set) => ({\n $t: \"Set\",\n v: Array.from(set.entries()),\n }),\n revive: ({ v }) => new Set(v),\n },\n};\n","export default {\n Map: {\n replace: (map) => ({\n $t: \"Map\",\n v: Array.from(map.entries()),\n }),\n revive: ({ v }) => new Map(v),\n },\n};\n","export const _global = typeof globalThis !== \"undefined\" // All modern environments (node, bun, deno, browser, workers, webview etc)\n ? globalThis\n : typeof self !== \"undefined\" // Older browsers, workers, webview, window etc\n ? self\n : typeof global !== \"undefined\" // Older versions of node\n ? global\n : undefined; // Unsupported environment. No idea to return 'this' since we are in a module or a function scope anyway.\n","import { _global } from \"../../common/_global.js\";\nexport default [\n \"Int8Array\",\n \"Uint8Array\",\n \"Uint8ClampedArray\",\n \"Int16Array\",\n \"Uint16Array\",\n \"Int32Array\",\n \"Uint32Array\",\n \"Float32Array\",\n \"Float64Array\",\n \"DataView\",\n \"BigInt64Array\",\n \"BigUint64Array\",\n].reduce((specs, typeName) => ({\n ...specs,\n [typeName]: {\n // Replace passes the the typed array into $t, buffer so that\n // the ArrayBuffer typedef takes care of further handling of the buffer:\n // {$t:\"Uint8Array\",buffer:{$t:\"ArrayBuffer\",idx:0}}\n // CHANGED ABOVE! Now shortcutting that for more sparse format of the typed arrays\n // to contain the b64 property directly.\n replace: (a, _, typeDefs) => {\n const result = {\n $t: typeName,\n v: typeDefs.ArrayBuffer.replace(a.byteOffset === 0 && a.byteLength === a.buffer.byteLength\n ? a.buffer\n : a.buffer.slice(a.byteOffset, a.byteOffset + a.byteLength), _, typeDefs).v,\n };\n return result;\n },\n revive: ({ v }, _, typeDefs) => {\n const TypedArray = _global[typeName];\n return (TypedArray &&\n new TypedArray(typeDefs.ArrayBuffer.revive({ v }, _, typeDefs)));\n },\n },\n}), {});\n","import { b64decode, b64encode } from \"./base64.js\";\nexport function b64LexEncode(b) {\n return b64ToLex(b64encode(b));\n}\nexport function b64LexDecode(b64Lex) {\n return b64decode(lexToB64(b64Lex));\n}\nexport function b64ToLex(base64) {\n var encoded = \"\";\n for (var i = 0, length = base64.length; i < length; i++) {\n encoded += ENCODE_TABLE[base64[i]];\n }\n return encoded;\n}\nexport function lexToB64(base64lex) {\n // only accept string input\n if (typeof base64lex !== \"string\") {\n throw new Error(\"invalid decoder input: \" + base64lex);\n }\n var base64 = \"\";\n for (var i = 0, length = base64lex.length; i < length; i++) {\n base64 += DECODE_TABLE[base64lex[i]];\n }\n return base64;\n}\nconst DECODE_TABLE = {\n \"-\": \"=\",\n \"0\": \"A\",\n \"1\": \"B\",\n \"2\": \"C\",\n \"3\": \"D\",\n \"4\": \"E\",\n \"5\": \"F\",\n \"6\": \"G\",\n \"7\": \"H\",\n \"8\": \"I\",\n \"9\": \"J\",\n A: \"K\",\n B: \"L\",\n C: \"M\",\n D: \"N\",\n E: \"O\",\n F: \"P\",\n G: \"Q\",\n H: \"R\",\n I: \"S\",\n J: \"T\",\n K: \"U\",\n L: \"V\",\n M: \"W\",\n N: \"X\",\n O: \"Y\",\n P: \"Z\",\n Q: \"a\",\n R: \"b\",\n S: \"c\",\n T: \"d\",\n U: \"e\",\n V: \"f\",\n W: \"g\",\n X: \"h\",\n Y: \"i\",\n Z: \"j\",\n _: \"k\",\n a: \"l\",\n b: \"m\",\n c: \"n\",\n d: \"o\",\n e: \"p\",\n f: \"q\",\n g: \"r\",\n h: \"s\",\n i: \"t\",\n j: \"u\",\n k: \"v\",\n l: \"w\",\n m: \"x\",\n n: \"y\",\n o: \"z\",\n p: \"0\",\n q: \"1\",\n r: \"2\",\n s: \"3\",\n t: \"4\",\n u: \"5\",\n v: \"6\",\n w: \"7\",\n x: \"8\",\n y: \"9\",\n z: \"+\",\n \"|\": \"/\",\n};\nconst ENCODE_TABLE = {};\nfor (const c of Object.keys(DECODE_TABLE)) {\n ENCODE_TABLE[DECODE_TABLE[c]] = c;\n}\n","import { b64LexDecode, b64LexEncode } from \"../../common/b64lex.js\";\nexport default {\n ArrayBuffer: {\n replace: (ab) => ({\n $t: \"ArrayBuffer\",\n v: b64LexEncode(ab),\n }),\n revive: ({ v }) => {\n const ba = b64LexDecode(v);\n return ba.buffer.byteLength === ba.byteLength\n ? ba.buffer\n : ba.buffer.slice(ba.byteOffset, ba.byteOffset + ba.byteLength);\n },\n },\n};\n","export class FakeBlob {\n constructor(buf, type) {\n this.buf = buf;\n this.type = type;\n }\n}\n","export function readBlobSync(b) {\n const req = new XMLHttpRequest();\n req.overrideMimeType(\"text/plain; charset=x-user-defined\");\n req.open(\"GET\", URL.createObjectURL(b), false); // Sync\n req.send();\n if (req.status !== 200 && req.status !== 0) {\n throw new Error(\"Bad Blob access: \" + req.status);\n }\n return req.responseText;\n}\n","export function string2ArrayBuffer(str) {\n const array = new Uint8Array(str.length);\n for (let i = 0; i < str.length; ++i) {\n array[i] = str.charCodeAt(i); // & 0xff;\n }\n return array.buffer;\n}\nexport function arrayBuffer2String(buf) {\n // TODO: Optimize\n return new Uint8Array(buf).reduce((s, byte) => s + String.fromCharCode(byte), \"\");\n}\n","import { b64decode, b64encode } from \"../../common/base64.js\";\nimport { FakeBlob } from \"../FakeBlob.js\";\nimport { readBlobSync } from \"../readBlobSync.js\";\nimport { string2ArrayBuffer } from \"../string2ArrayBuffer.js\";\nexport default {\n Blob: {\n test: (blob, toStringTag) => toStringTag === \"Blob\" || blob instanceof FakeBlob,\n replace: (blob) => ({\n $t: \"Blob\",\n v: blob instanceof FakeBlob\n ? b64encode(blob.buf)\n : b64encode(string2ArrayBuffer(readBlobSync(blob))),\n type: blob.type,\n }),\n revive: ({ type, v }) => {\n const ab = b64decode(v);\n return typeof Blob !== undefined\n ? new Blob([ab])\n : new FakeBlob(ab.buffer, type);\n },\n },\n};\n","import numberDef from \"../types/number.js\";\nimport bigintDef from \"../types/bigint.js\";\nimport DateDef from \"../types/Date.js\";\nimport SetDef from \"../types/Set.js\";\nimport MapDef from \"../types/Map.js\";\nimport TypedArraysDefs from \"../types/TypedArray.js\";\nimport ArrayBufferDef from \"../types/ArrayBuffer.js\";\nimport BlobDef from \"../types/Blob.js\";\nconst builtin = {\n ...numberDef,\n ...bigintDef,\n ...DateDef,\n ...SetDef,\n ...MapDef,\n ...TypedArraysDefs,\n ...ArrayBufferDef,\n ...BlobDef, // Should be moved to another preset for DOM types (or universal? since it supports node as well with FakeBlob)\n};\nexport default builtin;\n","import { BisonBinaryTypes } from \"./BisonBinaryTypes.js\";\nimport builtin from \"./presets/builtin.js\";\nimport { TypesonSimplified } from \"./TypesonSimplified.js\";\nexport function Bison(...typeDefsInputs) {\n const tson = TypesonSimplified(builtin, BisonBinaryTypes, ...typeDefsInputs);\n return {\n toBinary(value) {\n const [blob, json] = this.stringify(value);\n const lenBuf = new ArrayBuffer(4);\n new DataView(lenBuf).setUint32(0, blob.size);\n return new Blob([lenBuf, blob, json]);\n },\n stringify(value) {\n const binaries = [];\n const json = tson.stringify(value, binaries);\n const blob = new Blob(binaries.map((b) => {\n const lenBuf = new ArrayBuffer(4);\n new DataView(lenBuf).setUint32(0, \"byteLength\" in b ? b.byteLength : b.size);\n return new Blob([lenBuf, b]);\n }));\n return [blob, json];\n },\n async parse(json, binData) {\n let pos = 0;\n const arrayBuffers = [];\n const buf = await readBlobBinary(binData);\n const view = new DataView(buf);\n while (pos < buf.byteLength) {\n const len = view.getUint32(pos);\n pos += 4;\n const ab = buf.slice(pos, pos + len);\n pos += len;\n arrayBuffers.push(ab);\n }\n return tson.parse(json, arrayBuffers);\n },\n async fromBinary(blob) {\n const len = new DataView(await readBlobBinary(blob.slice(0, 4))).getUint32(0);\n const binData = blob.slice(4, len + 4);\n const json = await readBlob(blob.slice(len + 4));\n return await this.parse(json, binData);\n },\n };\n}\nexport function readBlob(blob) {\n return new Promise((resolve, reject) => {\n const reader = new FileReader();\n reader.onabort = (ev) => reject(new Error(\"file read aborted\"));\n reader.onerror = (ev) => reject(ev.target.error);\n reader.onload = (ev) => resolve(ev.target.result);\n reader.readAsText(blob);\n });\n}\nexport function readBlobBinary(blob) {\n return new Promise((resolve, reject) => {\n const reader = new FileReader();\n reader.onabort = (ev) => reject(new Error(\"file read aborted\"));\n reader.onerror = (ev) => reject(ev.target.error);\n reader.onload = (ev) => resolve(ev.target.result);\n reader.readAsArrayBuffer(blob);\n });\n}\n","/** The undefined type is not part of builtin but can be manually added.\n * The reason for supporting undefined is if the following object should be revived correctly:\n *\n * {foo: undefined}\n *\n * Without including this typedef, the revived object would just be {}.\n * If including this typedef, the revived object would be {foo: undefined}.\n */\nexport default {\n undefined: {\n replace: () => ({\n $t: \"undefined\"\n }),\n revive: () => undefined,\n },\n};\n","import { b64decode, b64encode } from \"../../common/base64.js\";\nimport { readBlobSync } from \"../readBlobSync.js\";\nimport { string2ArrayBuffer } from \"../string2ArrayBuffer.js\";\nexport default {\n File: {\n test: (file, toStringTag) => toStringTag === \"File\",\n replace: (file) => ({\n $t: \"File\",\n v: b64encode(string2ArrayBuffer(readBlobSync(file))),\n type: file.type,\n name: file.name,\n lastModified: new Date(file.lastModified).toISOString(),\n }),\n revive: ({ type, v, name, lastModified }) => {\n const ab = b64decode(v);\n return new File([ab], name, {\n type,\n lastModified: new Date(lastModified).getTime(),\n });\n },\n },\n};\n","import { TypesonSimplified } from 'dreambase-library/dist/typeson-simplified/TypesonSimplified';\nimport { Bison } from 'dreambase-library/dist/typeson-simplified/Bison';\nimport undefinedDef from 'dreambase-library/dist/typeson-simplified/types/undefined.js';\nimport tsonBuiltinDefs from 'dreambase-library/dist/typeson-simplified/presets/builtin.js';\nimport { TypeDefSet } from 'dreambase-library/dist/typeson-simplified/TypeDefSet';\nimport { PropModSpec, PropModification } from 'dexie';\nimport FileDef from \"dreambase-library/dist/typeson-simplified/types/File.js\";\n\n// Since server revisions are stored in bigints, we need to handle clients without\n// bigint support to not fail when serverRevision is passed over to client.\n// We need to not fail when reviving it and we need to somehow store the information.\n// Since the revived version will later on be put into indexedDB we have another\n// issue: When reading it back from indexedDB we will get a poco object that we\n// cannot replace correctly when sending it to server. So we will also need\n// to do an explicit workaround in the protocol where a bigint is supported.\n// The workaround should be there regardless if browser supports BigInt or not, because\n// the serverRev might have been stored in IDB before the browser was upgraded to support bigint.\n//\n// if (typeof serverRev.rev !== \"bigint\")\n// if (hasBigIntSupport)\n// serverRev.rev = bigIntDef.bigint.revive(server.rev)\n// else\n// serverRev.rev = new FakeBigInt(server.rev)\nexport const hasBigIntSupport =\n typeof BigInt === 'function' && typeof BigInt(0) === 'bigint';\n\nfunction getValueOfBigInt(x: bigint | FakeBigInt | string) {\n if (typeof x === 'bigint') {\n return x;\n }\n if (hasBigIntSupport) {\n return typeof x === 'string' ? BigInt(x) : BigInt(x.v);\n } else {\n return typeof x === 'string' ? Number(x) : Number(x.v);\n }\n}\n\nexport function compareBigInts(\n a: bigint | FakeBigInt | string,\n b: bigint | FakeBigInt | string\n) {\n const valA = getValueOfBigInt(a);\n const valB = getValueOfBigInt(b);\n return valA < valB ? -1 : valA > valB ? 1 : 0;\n}\nexport class FakeBigInt {\n v: string;\n toString() {\n return this.v;\n }\n constructor(value: string) {\n this.v = value;\n }\n}\n\nconst bigIntDef = hasBigIntSupport\n ? {}\n : {\n bigint: {\n test: (val: any) => val instanceof FakeBigInt,\n replace: (fakeBigInt: any) => {\n return {\n $t: 'bigint',\n ...fakeBigInt,\n };\n },\n revive: ({ v }: { $t: 'bigint'; v: string }) =>\n new FakeBigInt(v) as any as bigint,\n },\n };\n\nconst defs: TypeDefSet = {\n ...undefinedDef,\n ...bigIntDef,\n ...FileDef,\n PropModification: {\n test: (val: any) => val instanceof PropModification,\n replace: (propModification: any) => {\n return {\n $t: 'PropModification',\n ...propModification['@@propmod'],\n };\n },\n revive: ({\n $t, // strip '$t'\n ...propModSpec // keep the rest\n }: {\n $t: 'PropModification';\n } & PropModSpec) => new PropModification(propModSpec),\n },\n};\n\nexport const TSON = TypesonSimplified(tsonBuiltinDefs, defs);\n\nexport const BISON = Bison(defs);\n","export class HttpError extends Error {\n httpStatus: number;\n constructor(\n res: Response,\n message?: string)\n {\n super(message || `${res.status} ${res.statusText}`);\n this.httpStatus = res.status;\n }\n\n get name() {\n return \"HttpError\";\n }\n}\n","import Dexie, { DBCoreSchema } from 'dexie';\nimport {\n DBInsertOperation,\n DBOperation,\n DBOperationsSet,\n DBOpPrimaryKey,\n} from 'dexie-cloud-common';\nimport { UserLogin } from '../db/entities/UserLogin';\n\nexport function encodeIdsForServer(\n schema: DBCoreSchema,\n currentUser: UserLogin,\n changes: DBOperationsSet\n): DBOperationsSet {\n const rv: DBOperationsSet = [];\n for (let change of changes) {\n const { table, muts } = change;\n const tableSchema = schema.tables.find((t) => t.name === table);\n if (!tableSchema)\n throw new Error(\n `Internal error: table ${table} not found in DBCore schema`\n );\n const { primaryKey } = tableSchema;\n let changeClone = change;\n muts.forEach((mut, mutIndex) => {\n const rewriteValues =\n !primaryKey.outbound &&\n (mut.type === 'upsert' || mut.type === 'insert');\n mut.keys.forEach((key, keyIndex) => {\n if (Array.isArray(key)) {\n // Server only support string keys. Dexie Cloud client support strings or array of strings.\n if (changeClone === change)\n changeClone = cloneChange(change, rewriteValues);\n const mutClone = changeClone.muts[mutIndex];\n const rewrittenKey = JSON.stringify(key);\n mutClone.keys[keyIndex] = rewrittenKey;\n /* Bug (#1777)\n We should not rewrite values. It will fail because the key is array and the value is string.\n Only the keys should be rewritten and it's already done on the server.\n We should take another round of revieweing how key transformations are being done between\n client and server and let the server do the key transformations entirely instead now that\n we have the primary key schema on the server making it possible to do so.\n if (rewriteValues) {\n Dexie.setByKeyPath(\n (mutClone as DBInsertOperation).values[keyIndex],\n primaryKey.keyPath!,\n rewrittenKey\n );\n }*/\n } else if (key[0] === '#') {\n // Private ID - translate!\n if (changeClone === change)\n changeClone = cloneChange(change, rewriteValues);\n const mutClone = changeClone.muts[mutIndex];\n if (!currentUser.isLoggedIn)\n throw new Error(\n `Internal error: Cannot sync private IDs before authenticated`\n );\n const rewrittenKey = `${key}:${currentUser.userId}`;\n mutClone.keys[keyIndex] = rewrittenKey;\n if (rewriteValues) {\n Dexie.setByKeyPath(\n (mutClone as DBInsertOperation).values[keyIndex],\n primaryKey.keyPath!,\n rewrittenKey\n );\n }\n }\n });\n });\n rv.push(changeClone);\n }\n return rv;\n}\n\nfunction cloneChange(change: DBOperationsSet[number], rewriteValues: boolean) {\n // clone on demand:\n return {\n ...change,\n muts: rewriteValues\n ? change.muts.map((m) => {\n return (m.type === 'insert' || m.type === 'upsert') && m.values\n ? {\n ...m,\n keys: m.keys.slice(),\n values: m.values.slice(),\n }\n : {\n ...m,\n keys: m.keys.slice(),\n };\n })\n : change.muts.map((m) => ({ ...m, keys: m.keys.slice() })),\n };\n}\n","import { DexieCloudDB } from '../db/DexieCloudDB';\n\n// If we get Ratelimit-Limit and Ratelimit-Remaining where Ratelimit-Remaining is below\n// (Ratelimit-Limit / 2), we should delay the next sync by (Ratelimit-Reset / Ratelimit-Remaining)\n// seconds (given that there is a Ratelimit-Reset header).\n\nlet syncRatelimitDelays = new WeakMap<DexieCloudDB, Date>();\n\nexport async function checkSyncRateLimitDelay(db: DexieCloudDB) {\n const delatMilliseconds = (syncRatelimitDelays.get(db)?.getTime() ?? 0) - Date.now();\n if (delatMilliseconds > 0) {\n console.debug(`Stalling sync request ${delatMilliseconds} ms to spare ratelimits`);\n await new Promise(resolve => setTimeout(resolve, delatMilliseconds));\n }\n}\n\nexport function updateSyncRateLimitDelays(db: DexieCloudDB, res: Response) {\n const limit = res.headers.get('Ratelimit-Limit');\n const remaining = res.headers.get('Ratelimit-Remaining');\n const reset = res.headers.get('Ratelimit-Reset');\n if (limit && remaining && reset) {\n const limitNum = Number(limit);\n const remainingNum = Math.max(0, Number(remaining));\n const willResetInSeconds = Number(reset);\n if (remainingNum < limitNum / 2) {\n const delay = Math.ceil(willResetInSeconds / (remainingNum + 1));\n syncRatelimitDelays.set(db, new Date(Date.now() + delay * 1000));\n console.debug(`Sync ratelimit delay set to ${delay} seconds`);\n } else {\n syncRatelimitDelays.delete(db);\n console.debug(`Sync ratelimit delay cleared`);\n }\n }\n}\n","import { DexieCloudDB } from '../db/DexieCloudDB';\nimport { PersistedSyncState } from '../db/entities/PersistedSyncState';\nimport { loadAccessToken } from '../authentication/authenticate';\nimport { BISON, TSON } from '../TSON';\nimport { getSyncableTables } from '../helpers/getSyncableTables';\nimport { BaseRevisionMapEntry } from '../db/entities/BaseRevisionMapEntry';\nimport { HttpError } from '../errors/HttpError';\nimport {\n DBOperationsSet,\n DexieCloudSchema,\n SyncRequest,\n SyncResponse,\n YClientMessage,\n} from 'dexie-cloud-common';\nimport { encodeIdsForServer } from './encodeIdsForServer';\nimport { UserLogin } from '../db/entities/UserLogin';\nimport { updateSyncRateLimitDelays } from './ratelimit';\n//import {BisonWebStreamReader} from \"dreambase-library/dist/typeson-simplified/BisonWebStreamReader\";\n\nexport async function syncWithServer(\n changes: DBOperationsSet,\n y: YClientMessage[],\n syncState: PersistedSyncState | undefined,\n baseRevs: BaseRevisionMapEntry[],\n db: DexieCloudDB,\n databaseUrl: string,\n schema: DexieCloudSchema | null,\n clientIdentity: string,\n currentUser: UserLogin\n): Promise<SyncResponse> {\n //\n // Push changes to server using fetch\n //\n const headers: HeadersInit = {\n Accept: 'application/json, application/x-bison, application/x-bison-stream',\n 'Content-Type': 'application/tson',\n };\n const updatedUser = await loadAccessToken(db);\n /*\n if (updatedUser?.license && changes.length > 0) {\n if (updatedUser.license.status === 'expired') {\n throw new Error(`License has expired`);\n }\n if (updatedUser.license.status === 'deactivated') {\n throw new Error(`License deactivated`);\n }\n }\n */\n const accessToken = updatedUser?.accessToken;\n if (accessToken) {\n headers.Authorization = `Bearer ${accessToken}`;\n }\n\n const syncRequest: SyncRequest = {\n v: 2,\n dbID: syncState?.remoteDbId,\n clientIdentity,\n schema: schema || {},\n lastPull: syncState\n ? {\n serverRevision: syncState.serverRevision!,\n yServerRevision: syncState.yServerRevision,\n realms: syncState.realms,\n inviteRealms: syncState.inviteRealms,\n }\n : undefined,\n baseRevs,\n changes: encodeIdsForServer(db.dx.core.schema, currentUser, changes),\n y,\n dxcv: db.cloud.version\n };\n console.debug('Sync request', syncRequest);\n db.syncStateChangedEvent.next({\n phase: 'pushing',\n });\n const body = TSON.stringify(syncRequest);\n const res = await fetch(`${databaseUrl}/sync`, {\n method: 'post',\n headers,\n credentials: 'include', // For Arr Affinity cookie only, for better Rate-Limit counting only.\n body,\n });\n //const contentLength = Number(res.headers.get('content-length'));\n db.syncStateChangedEvent.next({\n phase: 'pulling',\n });\n\n updateSyncRateLimitDelays(db, res);\n\n if (!res.ok) {\n throw new HttpError(res);\n }\n\n switch (res.headers.get('content-type')) {\n case 'application/x-bison':\n return BISON.fromBinary(await res.blob());\n case 'application/x-bison-stream': //return BisonWebStreamReader(BISON, res);\n default:\n case 'application/json': {\n const text = await res.text();\n const syncRes = TSON.parse(text);\n return syncRes;\n }\n }\n}\n","import Dexie from \"dexie\";\n\nexport interface CancelToken {\n cancelled: boolean;\n}\n\nexport function throwIfCancelled(cancelToken?: CancelToken) {\n if (cancelToken?.cancelled) throw new Dexie.AbortError(`Operation was cancelled`);\n}\n","/* Need this because navigator.onLine seems to say \"false\" when it is actually online.\n This function relies initially on navigator.onLine but then uses online and offline events\n which seem to be more reliable.\n*/\nexport let isOnline = false;\nif (typeof self !== 'undefined' && typeof navigator !== 'undefined') {\n isOnline = navigator.onLine;\n self.addEventListener('online', ()=>isOnline = true);\n self.addEventListener('offline', ()=>isOnline = false);\n}\n","import { DexieCloudDB } from '../db/DexieCloudDB';\nimport { DexieCloudSchema, SyncResponse } from 'dexie-cloud-common';\n\nexport async function updateBaseRevs(db: DexieCloudDB, schema: DexieCloudSchema, latestRevisions: { [table: string]: number; }, serverRev: any) {\n await db.$baseRevs.bulkPut(\n Object.keys(schema)\n .filter((table) => schema[table].markedForSync)\n .map((tableName) => {\n const lastClientRevOnPreviousServerRev = latestRevisions[tableName] || 0;\n return {\n tableName,\n clientRev: lastClientRevOnPreviousServerRev + 1,\n serverRev,\n };\n })\n );\n // Clean up baseRevs for tables that do not exist anymore or are no longer marked for sync\n // Resolve #2168 by also cleaning up baseRevs for tables that are not marked for sync\n await db.$baseRevs.where('tableName').noneOf(\n Object.keys(schema).filter((table) => schema[table].markedForSync)\n ).delete();\n}\n","import { DBOperationsSet } from 'dexie-cloud-common';\n\nexport function getLatestRevisionsPerTable(\n clientChangeSet: DBOperationsSet,\n lastRevisions = {} as { [table: string]: number; }) {\n for (const { table, muts } of clientChangeSet) {\n const lastRev = muts.length > 0 ? muts[muts.length - 1].rev : null;\n lastRevisions[table] = lastRev || lastRevisions[table] || 0;\n }\n return lastRevisions;\n}\n","import Dexie, { Table, cmp } from 'dexie';\n\nexport async function bulkUpdate(\n table: Table,\n keys: any[],\n changeSpecs: { [keyPath: string]: any }[]\n) {\n const objs = await table.bulkGet(keys);\n const resultKeys: any[] = [];\n const resultObjs: any[] = [];\n keys.forEach((key, idx) => {\n const obj = objs[idx];\n if (obj) {\n for (const [keyPath, value] of Object.entries(changeSpecs[idx])) {\n if (keyPath === table.schema.primKey.keyPath) {\n if (cmp(value, key) !== 0) {\n throw new Error(`Cannot change primary key`);\n }\n } else {\n Dexie.setByKeyPath(obj, keyPath, value);\n }\n }\n resultKeys.push(key);\n resultObjs.push(obj);\n }\n });\n await (table.schema.primKey.keyPath == null\n ? table.bulkPut(resultObjs, resultKeys)\n : table.bulkPut(resultObjs));\n}\n","import { DexieCloudDB } from '../db/DexieCloudDB';\nimport Dexie from 'dexie';\nimport { bulkUpdate } from '../helpers/bulkUpdate';\nimport { DBOperationsSet } from 'dexie-cloud-common';\n\nexport async function applyServerChanges(\n changes: DBOperationsSet<string>,\n db: DexieCloudDB\n) {\n console.debug('Applying server changes', changes, Dexie.currentTransaction);\n for (const { table: tableName, muts } of changes) {\n if (!db.dx._allTables[tableName]) {\n console.debug(\n `Server sent changes for table ${tableName} that we don't have. Ignoring.`\n );\n continue;\n }\n const table = db.table(tableName);\n const { primaryKey } = table.core.schema;\n const keyDecoder = (key: string) => {\n switch (key[0]) {\n case '[':\n // Decode JSON array\n if (key.endsWith(']'))\n try {\n // On server, array keys are transformed to JSON string representation\n return JSON.parse(key);\n } catch {}\n return key;\n case '#':\n // Decode private ID (do the opposite from what's done in encodeIdsForServer())\n if (key.endsWith(':' + db.cloud.currentUserId)) {\n return key.substr(\n 0,\n key.length - db.cloud.currentUserId.length - 1\n );\n }\n return key;\n default:\n return key;\n }\n };\n for (const mut of muts) {\n const keys = mut.keys.map(keyDecoder);\n switch (mut.type) {\n case 'insert':\n if (primaryKey.outbound) {\n await table.bulkAdd(mut.values, keys);\n } else {\n keys.forEach((key, i) => {\n // Make sure inbound keys are consistent\n Dexie.setByKeyPath(mut.values[i], primaryKey.keyPath!, key);\n });\n await table.bulkAdd(mut.values);\n }\n break;\n case 'upsert':\n if (primaryKey.outbound) {\n await table.bulkPut(mut.values, keys);\n } else {\n keys.forEach((key, i) => {\n // Make sure inbound keys are consistent\n Dexie.setByKeyPath(mut.values[i], primaryKey.keyPath!, key);\n });\n await table.bulkPut(mut.values);\n }\n break;\n case 'modify':\n if (keys.length === 1) {\n await table.update(keys[0], mut.changeSpec);\n } else {\n await table.where(':id').anyOf(keys).modify(mut.changeSpec);\n }\n break;\n case 'update':\n await bulkUpdate(table, keys, mut.changeSpecs);\n break;\n case 'delete':\n await table.bulkDelete(keys);\n break;\n }\n }\n }\n}\n","\nexport const DEXIE_CLOUD_SYNCER_ID = 'dexie-cloud-syncer';\n","import type { Table } from 'dexie';\nimport type { YUpdateRow } from 'y-dexie';\n\nexport function listUpdatesSince(yTable: Table, sinceIncluding: number): Promise<YUpdateRow[]> {\n return yTable\n .where('i')\n .between(sinceIncluding, Infinity, true)\n .toArray();\n}\n","/**\n * Utility module to work with key-value stores.\n *\n * @module map\n */\n\n/**\n * Creates a new Map instance.\n *\n * @function\n * @return {Map<any, any>}\n *\n * @function\n */\nexport const create = () => new Map()\n\n/**\n * Copy a Map object into a fresh Map object.\n *\n * @function\n * @template K,V\n * @param {Map<K,V>} m\n * @return {Map<K,V>}\n */\nexport const copy = m => {\n const r = create()\n m.forEach((v, k) => { r.set(k, v) })\n return r\n}\n\n/**\n * Get map property. Create T if property is undefined and set T on map.\n *\n * ```js\n * const listeners = map.setIfUndefined(events, 'eventName', set.create)\n * listeners.add(listener)\n * ```\n *\n * @function\n * @template {Map<any, any>} MAP\n * @template {MAP extends Map<any,infer V> ? function():V : unknown} CF\n * @param {MAP} map\n * @param {MAP extends Map<infer K,any> ? K : unknown} key\n * @param {CF} createT\n * @return {ReturnType<CF>}\n */\nexport const setIfUndefined = (map, key, createT) => {\n let set = map.get(key)\n if (set === undefined) {\n map.set(key, set = createT())\n }\n return set\n}\n\n/**\n * Creates an Array and populates it with the content of all key-value pairs using the `f(value, key)` function.\n *\n * @function\n * @template K\n * @template V\n * @template R\n * @param {Map<K,V>} m\n * @param {function(V,K):R} f\n * @return {Array<R>}\n */\nexport const map = (m, f) => {\n const res = []\n for (const [key, value] of m) {\n res.push(f(value, key))\n }\n return res\n}\n\n/**\n * Tests whether any key-value pairs pass the test implemented by `f(value, key)`.\n *\n * @todo should rename to some - similarly to Array.some\n *\n * @function\n * @template K\n * @template V\n * @param {Map<K,V>} m\n * @param {function(V,K):boolean} f\n * @return {boolean}\n */\nexport const any = (m, f) => {\n for (const [key, value] of m) {\n if (f(value, key)) {\n return true\n }\n }\n return false\n}\n\n/**\n * Tests whether all key-value pairs pass the test implemented by `f(value, key)`.\n *\n * @function\n * @template K\n * @template V\n * @param {Map<K,V>} m\n * @param {function(V,K):boolean} f\n * @return {boolean}\n */\nexport const all = (m, f) => {\n for (const [key, value] of m) {\n if (!f(value, key)) {\n return false\n }\n }\n return true\n}\n","/**\n * Utility module to work with sets.\n *\n * @module set\n */\n\nexport const create = () => new Set()\n\n/**\n * @template T\n * @param {Set<T>} set\n * @return {Array<T>}\n */\nexport const toArray = set => Array.from(set)\n\n/**\n * @template T\n * @param {Set<T>} set\n * @return {T}\n */\nexport const first = set =>\n set.values().next().value ?? undefined\n\n/**\n * @template T\n * @param {Iterable<T>} entries\n * @return {Set<T>}\n */\nexport const from = entries => new Set(entries)\n","/**\n * Utility module to work with Arrays.\n *\n * @module array\n */\n\nimport * as set from './set.js'\n\n/**\n * Return the last element of an array. The element must exist\n *\n * @template L\n * @param {ArrayLike<L>} arr\n * @return {L}\n */\nexport const last = arr => arr[arr.length - 1]\n\n/**\n * @template C\n * @return {Array<C>}\n */\nexport const create = () => /** @type {Array<C>} */ ([])\n\n/**\n * @template D\n * @param {Array<D>} a\n * @return {Array<D>}\n */\nexport const copy = a => /** @type {Array<D>} */ (a.slice())\n\n/**\n * Append elements from src to dest\n *\n * @template M\n * @param {Array<M>} dest\n * @param {Array<M>} src\n */\nexport const appendTo = (dest, src) => {\n for (let i = 0; i < src.length; i++) {\n dest.push(src[i])\n }\n}\n\n/**\n * Transforms something array-like to an actual Array.\n *\n * @function\n * @template T\n * @param {ArrayLike<T>|Iterable<T>} arraylike\n * @return {T}\n */\nexport const from = Array.from\n\n/**\n * True iff condition holds on every element in the Array.\n *\n * @function\n * @template ITEM\n * @template {ArrayLike<ITEM>} ARR\n *\n * @param {ARR} arr\n * @param {function(ITEM, number, ARR):boolean} f\n * @return {boolean}\n */\nexport const every = (arr, f) => {\n for (let i = 0; i < arr.length; i++) {\n if (!f(arr[i], i, arr)) {\n return false\n }\n }\n return true\n}\n\n/**\n * True iff condition holds on some element in the Array.\n *\n * @function\n * @template S\n * @template {ArrayLike<S>} ARR\n * @param {ARR} arr\n * @param {function(S, number, ARR):boolean} f\n * @return {boolean}\n */\nexport const some = (arr, f) => {\n for (let i = 0; i < arr.length; i++) {\n if (f(arr[i], i, arr)) {\n return true\n }\n }\n return false\n}\n\n/**\n * @template ELEM\n *\n * @param {ArrayLike<ELEM>} a\n * @param {ArrayLike<ELEM>} b\n * @return {boolean}\n */\nexport const equalFlat = (a, b) => a.length === b.length && every(a, (item, index) => item === b[index])\n\n/**\n * @template ELEM\n * @param {Array<Array<ELEM>>} arr\n * @return {Array<ELEM>}\n */\nexport const flatten = arr => fold(arr, /** @type {Array<ELEM>} */ ([]), (acc, val) => acc.concat(val))\n\n/**\n * @template T\n * @param {number} len\n * @param {function(number, Array<T>):T} f\n * @return {Array<T>}\n */\nexport const unfold = (len, f) => {\n const array = new Array(len)\n for (let i = 0; i < len; i++) {\n array[i] = f(i, array)\n }\n return array\n}\n\n/**\n * @template T\n * @template RESULT\n * @param {Array<T>} arr\n * @param {RESULT} seed\n * @param {function(RESULT, T, number):RESULT} folder\n */\nexport const fold = (arr, seed, folder) => arr.reduce(folder, seed)\n\nexport const isArray = Array.isArray\n\n/**\n * @template T\n * @param {Array<T>} arr\n * @return {Array<T>}\n */\nexport const unique = arr => from(set.from(arr))\n\n/**\n * @template T\n * @template M\n * @param {ArrayLike<T>} arr\n * @param {function(T):M} mapper\n * @return {Array<T>}\n */\nexport const uniqueBy = (arr, mapper) => {\n /**\n * @type {Set<M>}\n */\n const happened = set.create()\n /**\n * @type {Array<T>}\n */\n const result = []\n for (let i = 0; i < arr.length; i++) {\n const el = arr[i]\n const mapped = mapper(el)\n if (!happened.has(mapped)) {\n happened.add(mapped)\n result.push(el)\n }\n }\n return result\n}\n\n/**\n * @template {ArrayLike<any>} ARR\n * @template {function(ARR extends ArrayLike<infer T> ? T : never, number, ARR):any} MAPPER\n * @param {ARR} arr\n * @param {MAPPER} mapper\n * @return {Array<MAPPER extends function(...any): infer M ? M : never>}\n */\nexport const map = (arr, mapper) => {\n /**\n * @type {Array<any>}\n */\n const res = Array(arr.length)\n for (let i = 0; i < arr.length; i++) {\n res[i] = mapper(/** @type {any} */ (arr[i]), i, /** @type {any} */ (arr))\n }\n return /** @type {any} */ (res)\n}\n","/**\n * Observable class prototype.\n *\n * @module observable\n */\n\nimport * as map from './map.js'\nimport * as set from './set.js'\nimport * as array from './array.js'\n\n/**\n * Handles named events.\n * @experimental\n *\n * This is basically a (better typed) duplicate of Observable, which will replace Observable in the\n * next release.\n *\n * @template {{[key in keyof EVENTS]: function(...any):void}} EVENTS\n */\nexport class ObservableV2 {\n constructor () {\n /**\n * Some desc.\n * @type {Map<string, Set<any>>}\n */\n this._observers = map.create()\n }\n\n /**\n * @template {keyof EVENTS & string} NAME\n * @param {NAME} name\n * @param {EVENTS[NAME]} f\n */\n on (name, f) {\n map.setIfUndefined(this._observers, /** @type {string} */ (name), set.create).add(f)\n return f\n }\n\n /**\n * @template {keyof EVENTS & string} NAME\n * @param {NAME} name\n * @param {EVENTS[NAME]} f\n */\n once (name, f) {\n /**\n * @param {...any} args\n */\n const _f = (...args) => {\n this.off(name, /** @type {any} */ (_f))\n f(...args)\n }\n this.on(name, /** @type {any} */ (_f))\n }\n\n /**\n * @template {keyof EVENTS & string} NAME\n * @param {NAME} name\n * @param {EVENTS[NAME]} f\n */\n off (name, f) {\n const observers = this._observers.get(name)\n if (observers !== undefined) {\n observers.delete(f)\n if (observers.size === 0) {\n this._observers.delete(name)\n }\n }\n }\n\n /**\n * Emit a named event. All registered event listeners that listen to the\n * specified name will receive the event.\n *\n * @todo This should catch exceptions\n *\n * @template {keyof EVENTS & string} NAME\n * @param {NAME} name The event name.\n * @param {Parameters<EVENTS[NAME]>} args The arguments that are applied to the event listener.\n */\n emit (name, args) {\n // copy all listeners to an array first to make sure that no event is emitted to listeners that are subscribed while the event handler is called.\n return array.from((this._observers.get(name) || map.create()).values()).forEach(f => f(...args))\n }\n\n destroy () {\n this._observers = map.create()\n }\n}\n\n/* c8 ignore start */\n/**\n * Handles named events.\n *\n * @deprecated\n * @template N\n */\nexport class Observable {\n constructor () {\n /**\n * Some desc.\n * @type {Map<N, any>}\n */\n this._observers = map.create()\n }\n\n /**\n * @param {N} name\n * @param {function} f\n */\n on (name, f) {\n map.setIfUndefined(this._observers, name, set.create).add(f)\n }\n\n /**\n * @param {N} name\n * @param {function} f\n */\n once (name, f) {\n /**\n * @param {...any} args\n */\n const _f = (...args) => {\n this.off(name, _f)\n f(...args)\n }\n this.on(name, _f)\n }\n\n /**\n * @param {N} name\n * @param {function} f\n */\n off (name, f) {\n const observers = this._observers.get(name)\n if (observers !== undefined) {\n observers.delete(f)\n if (observers.size === 0) {\n this._observers.delete(name)\n }\n }\n }\n\n /**\n * Emit a named event. All registered event listeners that listen to the\n * specified name will receive the event.\n *\n * @todo This should catch exceptions\n *\n * @param {N} name The event name.\n * @param {Array<any>} args The arguments that are applied to the event listener.\n */\n emit (name, args) {\n // copy all listeners to an array first to make sure that no event is emitted to listeners that are subscribed while the event handler is called.\n return array.from((this._observers.get(name) || map.create()).values()).forEach(f => f(...args))\n }\n\n destroy () {\n this._observers = map.create()\n }\n}\n/* c8 ignore end */\n","/**\n * Common Math expressions.\n *\n * @module math\n */\n\nexport const floor = Math.floor\nexport const ceil = Math.ceil\nexport const abs = Math.abs\nexport const imul = Math.imul\nexport const round = Math.round\nexport const log10 = Math.log10\nexport const log2 = Math.log2\nexport const log = Math.log\nexport const sqrt = Math.sqrt\n\n/**\n * @function\n * @param {number} a\n * @param {number} b\n * @return {number} The sum of a and b\n */\nexport const add = (a, b) => a + b\n\n/**\n * @function\n * @param {number} a\n * @param {number} b\n * @return {number} The smaller element of a and b\n */\nexport const min = (a, b) => a < b ? a : b\n\n/**\n * @function\n * @param {number} a\n * @param {number} b\n * @return {number} The bigger element of a and b\n */\nexport const max = (a, b) => a > b ? a : b\n\nexport const isNaN = Number.isNaN\n\nexport const pow = Math.pow\n/**\n * Base 10 exponential function. Returns the value of 10 raised to the power of pow.\n *\n * @param {number} exp\n * @return {number}\n */\nexport const exp10 = exp => Math.pow(10, exp)\n\nexport const sign = Math.sign\n\n/**\n * @param {number} n\n * @return {boolean} Wether n is negative. This function also differentiates between -0 and +0\n */\nexport const isNegativeZero = n => n !== 0 ? n < 0 : 1 / n < 0\n","/* eslint-env browser */\n\n/**\n * Binary data constants.\n *\n * @module binary\n */\n\n/**\n * n-th bit activated.\n *\n * @type {number}\n */\nexport const BIT1 = 1\nexport const BIT2 = 2\nexport const BIT3 = 4\nexport const BIT4 = 8\nexport const BIT5 = 16\nexport const BIT6 = 32\nexport const BIT7 = 64\nexport const BIT8 = 128\nexport const BIT9 = 256\nexport const BIT10 = 512\nexport const BIT11 = 1024\nexport const BIT12 = 2048\nexport const BIT13 = 4096\nexport const BIT14 = 8192\nexport const BIT15 = 16384\nexport const BIT16 = 32768\nexport const BIT17 = 65536\nexport const BIT18 = 1 << 17\nexport const BIT19 = 1 << 18\nexport const BIT20 = 1 << 19\nexport const BIT21 = 1 << 20\nexport const BIT22 = 1 << 21\nexport const BIT23 = 1 << 22\nexport const BIT24 = 1 << 23\nexport const BIT25 = 1 << 24\nexport const BIT26 = 1 << 25\nexport const BIT27 = 1 << 26\nexport const BIT28 = 1 << 27\nexport const BIT29 = 1 << 28\nexport const BIT30 = 1 << 29\nexport const BIT31 = 1 << 30\nexport const BIT32 = 1 << 31\n\n/**\n * First n bits activated.\n *\n * @type {number}\n */\nexport const BITS0 = 0\nexport const BITS1 = 1\nexport const BITS2 = 3\nexport const BITS3 = 7\nexport const BITS4 = 15\nexport const BITS5 = 31\nexport const BITS6 = 63\nexport const BITS7 = 127\nexport const BITS8 = 255\nexport const BITS9 = 511\nexport const BITS10 = 1023\nexport const BITS11 = 2047\nexport const BITS12 = 4095\nexport const BITS13 = 8191\nexport const BITS14 = 16383\nexport const BITS15 = 32767\nexport const BITS16 = 65535\nexport const BITS17 = BIT18 - 1\nexport const BITS18 = BIT19 - 1\nexport const BITS19 = BIT20 - 1\nexport const BITS20 = BIT21 - 1\nexport const BITS21 = BIT22 - 1\nexport const BITS22 = BIT23 - 1\nexport const BITS23 = BIT24 - 1\nexport const BITS24 = BIT25 - 1\nexport const BITS25 = BIT26 - 1\nexport const BITS26 = BIT27 - 1\nexport const BITS27 = BIT28 - 1\nexport const BITS28 = BIT29 - 1\nexport const BITS29 = BIT30 - 1\nexport const BITS30 = BIT31 - 1\n/**\n * @type {number}\n */\nexport const BITS31 = 0x7FFFFFFF\n/**\n * @type {number}\n */\nexport const BITS32 = 0xFFFFFFFF\n","/**\n * Utility helpers for working with numbers.\n *\n * @module number\n */\n\nimport * as math from './math.js'\nimport * as binary from './binary.js'\n\nexport const MAX_SAFE_INTEGER = Number.MAX_SAFE_INTEGER\nexport const MIN_SAFE_INTEGER = Number.MIN_SAFE_INTEGER\n\nexport const LOWEST_INT32 = 1 << 31\nexport const HIGHEST_INT32 = binary.BITS31\nexport const HIGHEST_UINT32 = binary.BITS32\n\n/* c8 ignore next */\nexport const isInteger = Number.isInteger || (num => typeof num === 'number' && isFinite(num) && math.floor(num) === num)\nexport const isNaN = Number.isNaN\nexport const parseInt = Number.parseInt\n\n/**\n * Count the number of \"1\" bits in an unsigned 32bit number.\n *\n * Super fun bitcount algorithm by Brian Kernighan.\n *\n * @param {number} n\n */\nexport const countBits = n => {\n n &= binary.BITS32\n let count = 0\n while (n) {\n n &= (n - 1)\n count++\n }\n return count\n}\n","import * as array from './array.js'\n\n/**\n * Utility module to work with strings.\n *\n * @module string\n */\n\nexport const fromCharCode = String.fromCharCode\nexport const fromCodePoint = String.fromCodePoint\n\n/**\n * The largest utf16 character.\n * Corresponds to Uint8Array([255, 255]) or charcodeof(2x2^8)\n */\nexport const MAX_UTF16_CHARACTER = fromCharCode(65535)\n\n/**\n * @param {string} s\n * @return {string}\n */\nconst toLowerCase = s => s.toLowerCase()\n\nconst trimLeftRegex = /^\\s*/g\n\n/**\n * @param {string} s\n * @return {string}\n */\nexport const trimLeft = s => s.replace(trimLeftRegex, '')\n\nconst fromCamelCaseRegex = /([A-Z])/g\n\n/**\n * @param {string} s\n * @param {string} separator\n * @return {string}\n */\nexport const fromCamelCase = (s, separator) => trimLeft(s.replace(fromCamelCaseRegex, match => `${separator}${toLowerCase(match)}`))\n\n/**\n * Compute the utf8ByteLength\n * @param {string} str\n * @return {number}\n */\nexport const utf8ByteLength = str => unescape(encodeURIComponent(str)).length\n\n/**\n * @param {string} str\n * @return {Uint8Array}\n */\nexport const _encodeUtf8Polyfill = str => {\n const encodedString = unescape(encodeURIComponent(str))\n const len = encodedString.length\n const buf = new Uint8Array(len)\n for (let i = 0; i < len; i++) {\n buf[i] = /** @type {number} */ (encodedString.codePointAt(i))\n }\n return buf\n}\n\n/* c8 ignore next */\nexport const utf8TextEncoder = /** @type {TextEncoder} */ (typeof TextEncoder !== 'undefined' ? new TextEncoder() : null)\n\n/**\n * @param {string} str\n * @return {Uint8Array}\n */\nexport const _encodeUtf8Native = str => utf8TextEncoder.encode(str)\n\n/**\n * @param {string} str\n * @return {Uint8Array}\n */\n/* c8 ignore next */\nexport const encodeUtf8 = utf8TextEncoder ? _encodeUtf8Native : _encodeUtf8Polyfill\n\n/**\n * @param {Uint8Array} buf\n * @return {string}\n */\nexport const _decodeUtf8Polyfill = buf => {\n let remainingLen = buf.length\n let encodedString = ''\n let bufPos = 0\n while (remainingLen > 0) {\n const nextLen = remainingLen < 10000 ? remainingLen : 10000\n const bytes = buf.subarray(bufPos, bufPos + nextLen)\n bufPos += nextLen\n // Starting with ES5.1 we can supply a generic array-like object as arguments\n encodedString += String.fromCodePoint.apply(null, /** @type {any} */ (bytes))\n remainingLen -= nextLen\n }\n return decodeURIComponent(escape(encodedString))\n}\n\n/* c8 ignore next */\nexport let utf8TextDecoder = typeof TextDecoder === 'undefined' ? null : new TextDecoder('utf-8', { fatal: true, ignoreBOM: true })\n\n/* c8 ignore start */\nif (utf8TextDecoder && utf8TextDecoder.decode(new Uint8Array()).length === 1) {\n // Safari doesn't handle BOM correctly.\n // This fixes a bug in Safari 13.0.5 where it produces a BOM the first time it is called.\n // utf8TextDecoder.decode(new Uint8Array()).length === 1 on the first call and\n // utf8TextDecoder.decode(new Uint8Array()).length === 1 on the second call\n // Another issue is that from then on no BOM chars are recognized anymore\n /* c8 ignore next */\n utf8TextDecoder = null\n}\n/* c8 ignore stop */\n\n/**\n * @param {Uint8Array} buf\n * @return {string}\n */\nexport const _decodeUtf8Native = buf => /** @type {TextDecoder} */ (utf8TextDecoder).decode(buf)\n\n/**\n * @param {Uint8Array} buf\n * @return {string}\n */\n/* c8 ignore next */\nexport const decodeUtf8 = utf8TextDecoder ? _decodeUtf8Native : _decodeUtf8Polyfill\n\n/**\n * @param {string} str The initial string\n * @param {number} index Starting position\n * @param {number} remove Number of characters to remove\n * @param {string} insert New content to insert\n */\nexport const splice = (str, index, remove, insert = '') => str.slice(0, index) + insert + str.slice(index + remove)\n\n/**\n * @param {string} source\n * @param {number} n\n */\nexport const repeat = (source, n) => array.unfold(n, () => source).join('')\n","/**\n * Efficient schema-less binary encoding with support for variable length encoding.\n *\n * Use [lib0/encoding] with [lib0/decoding]. Every encoding function has a corresponding decoding function.\n *\n * Encodes numbers in little-endian order (least to most significant byte order)\n * and is compatible with Golang's binary encoding (https://golang.org/pkg/encoding/binary/)\n * which is also used in Protocol Buffers.\n *\n * ```js\n * // encoding step\n * const encoder = encoding.createEncoder()\n * encoding.writeVarUint(encoder, 256)\n * encoding.writeVarString(encoder, 'Hello world!')\n * const buf = encoding.toUint8Array(encoder)\n * ```\n *\n * ```js\n * // decoding step\n * const decoder = decoding.createDecoder(buf)\n * decoding.readVarUint(decoder) // => 256\n * decoding.readVarString(decoder) // => 'Hello world!'\n * decoding.hasContent(decoder) // => false - all data is read\n * ```\n *\n * @module encoding\n */\n\nimport * as math from './math.js'\nimport * as number from './number.js'\nimport * as binary from './binary.js'\nimport * as string from './string.js'\nimport * as array from './array.js'\n\n/**\n * A BinaryEncoder handles the encoding to an Uint8Array.\n */\nexport class Encoder {\n constructor () {\n this.cpos = 0\n this.cbuf = new Uint8Array(100)\n /**\n * @type {Array<Uint8Array>}\n */\n this.bufs = []\n }\n}\n\n/**\n * @function\n * @return {Encoder}\n */\nexport const createEncoder = () => new Encoder()\n\n/**\n * @param {function(Encoder):void} f\n */\nexport const encode = (f) => {\n const encoder = createEncoder()\n f(encoder)\n return toUint8Array(encoder)\n}\n\n/**\n * The current length of the encoded data.\n *\n * @function\n * @param {Encoder} encoder\n * @return {number}\n */\nexport const length = encoder => {\n let len = encoder.cpos\n for (let i = 0; i < encoder.bufs.length; i++) {\n len += encoder.bufs[i].length\n }\n return len\n}\n\n/**\n * Check whether encoder is empty.\n *\n * @function\n * @param {Encoder} encoder\n * @return {boolean}\n */\nexport const hasContent = encoder => encoder.cpos > 0 || encoder.bufs.length > 0\n\n/**\n * Transform to Uint8Array.\n *\n * @function\n * @param {Encoder} encoder\n * @return {Uint8Array} The created ArrayBuffer.\n */\nexport const toUint8Array = encoder => {\n const uint8arr = new Uint8Array(length(encoder))\n let curPos = 0\n for (let i = 0; i < encoder.bufs.length; i++) {\n const d = encoder.bufs[i]\n uint8arr.set(d, curPos)\n curPos += d.length\n }\n uint8arr.set(new Uint8Array(encoder.cbuf.buffer, 0, encoder.cpos), curPos)\n return uint8arr\n}\n\n/**\n * Verify that it is possible to write `len` bytes wtihout checking. If\n * necessary, a new Buffer with the required length is attached.\n *\n * @param {Encoder} encoder\n * @param {number} len\n */\nexport const verifyLen = (encoder, len) => {\n const bufferLen = encoder.cbuf.length\n if (bufferLen - encoder.cpos < len) {\n encoder.bufs.push(new Uint8Array(encoder.cbuf.buffer, 0, encoder.cpos))\n encoder.cbuf = new Uint8Array(math.max(bufferLen, len) * 2)\n encoder.cpos = 0\n }\n}\n\n/**\n * Write one byte to the encoder.\n *\n * @function\n * @param {Encoder} encoder\n * @param {number} num The byte that is to be encoded.\n */\nexport const write = (encoder, num) => {\n const bufferLen = encoder.cbuf.length\n if (encoder.cpos === bufferLen) {\n encoder.bufs.push(encoder.cbuf)\n encoder.cbuf = new Uint8Array(bufferLen * 2)\n encoder.cpos = 0\n }\n encoder.cbuf[encoder.cpos++] = num\n}\n\n/**\n * Write one byte at a specific position.\n * Position must already be written (i.e. encoder.length > pos)\n *\n * @function\n * @param {Encoder} encoder\n * @param {number} pos Position to which to write data\n * @param {number} num Unsigned 8-bit integer\n */\nexport const set = (encoder, pos, num) => {\n let buffer = null\n // iterate all buffers and adjust position\n for (let i = 0; i < encoder.bufs.length && buffer === null; i++) {\n const b = encoder.bufs[i]\n if (pos < b.length) {\n buffer = b // found buffer\n } else {\n pos -= b.length\n }\n }\n if (buffer === null) {\n // use current buffer\n buffer = encoder.cbuf\n }\n buffer[pos] = num\n}\n\n/**\n * Write one byte as an unsigned integer.\n *\n * @function\n * @param {Encoder} encoder\n * @param {number} num The number that is to be encoded.\n */\nexport const writeUint8 = write\n\n/**\n * Write one byte as an unsigned Integer at a specific location.\n *\n * @function\n * @param {Encoder} encoder\n * @param {number} pos The location where the data will be written.\n * @param {number} num The number that is to be encoded.\n */\nexport const setUint8 = set\n\n/**\n * Write two bytes as an unsigned integer.\n *\n * @function\n * @param {Encoder} encoder\n * @param {number} num The number that is to be encoded.\n */\nexport const writeUint16 = (encoder, num) => {\n write(encoder, num & binary.BITS8)\n write(encoder, (num >>> 8) & binary.BITS8)\n}\n/**\n * Write two bytes as an unsigned integer at a specific location.\n *\n * @function\n * @param {Encoder} encoder\n * @param {number} pos The location where the data will be written.\n * @param {number} num The number that is to be encoded.\n */\nexport const setUint16 = (encoder, pos, num) => {\n set(encoder, pos, num & binary.BITS8)\n set(encoder, pos + 1, (num >>> 8) & binary.BITS8)\n}\n\n/**\n * Write two bytes as an unsigned integer\n *\n * @function\n * @param {Encoder} encoder\n * @param {number} num The number that is to be encoded.\n */\nexport const writeUint32 = (encoder, num) => {\n for (let i = 0; i < 4; i++) {\n write(encoder, num & binary.BITS8)\n num >>>= 8\n }\n}\n\n/**\n * Write two bytes as an unsigned integer in big endian order.\n * (most significant byte first)\n *\n * @function\n * @param {Encoder} encoder\n * @param {number} num The number that is to be encoded.\n */\nexport const writeUint32BigEndian = (encoder, num) => {\n for (let i = 3; i >= 0; i--) {\n write(encoder, (num >>> (8 * i)) & binary.BITS8)\n }\n}\n\n/**\n * Write two bytes as an unsigned integer at a specific location.\n *\n * @function\n * @param {Encoder} encoder\n * @param {number} pos The location where the data will be written.\n * @param {number} num The number that is to be encoded.\n */\nexport const setUint32 = (encoder, pos, num) => {\n for (let i = 0; i < 4; i++) {\n set(encoder, pos + i, num & binary.BITS8)\n num >>>= 8\n }\n}\n\n/**\n * Write a variable length unsigned integer. Max encodable integer is 2^53.\n *\n * @function\n * @param {Encoder} encoder\n * @param {number} num The number that is to be encoded.\n */\nexport const writeVarUint = (encoder, num) => {\n while (num > binary.BITS7) {\n write(encoder, binary.BIT8 | (binary.BITS7 & num))\n num = math.floor(num / 128) // shift >>> 7\n }\n write(encoder, binary.BITS7 & num)\n}\n\n/**\n * Write a variable length integer.\n *\n * We use the 7th bit instead for signaling that this is a negative number.\n *\n * @function\n * @param {Encoder} encoder\n * @param {number} num The number that is to be encoded.\n */\nexport const writeVarInt = (encoder, num) => {\n const isNegative = math.isNegativeZero(num)\n if (isNegative) {\n num = -num\n }\n // |- whether to continue reading |- whether is negative |- number\n write(encoder, (num > binary.BITS6 ? binary.BIT8 : 0) | (isNegative ? binary.BIT7 : 0) | (binary.BITS6 & num))\n num = math.floor(num / 64) // shift >>> 6\n // We don't need to consider the case of num === 0 so we can use a different\n // pattern here than above.\n while (num > 0) {\n write(encoder, (num > binary.BITS7 ? binary.BIT8 : 0) | (binary.BITS7 & num))\n num = math.floor(num / 128) // shift >>> 7\n }\n}\n\n/**\n * A cache to store strings temporarily\n */\nconst _strBuffer = new Uint8Array(30000)\nconst _maxStrBSize = _strBuffer.length / 3\n\n/**\n * Write a variable length string.\n *\n * @function\n * @param {Encoder} encoder\n * @param {String} str The string that is to be encoded.\n */\nexport const _writeVarStringNative = (encoder, str) => {\n if (str.length < _maxStrBSize) {\n // We can encode the string into the existing buffer\n /* c8 ignore next */\n const written = string.utf8TextEncoder.encodeInto(str, _strBuffer).written || 0\n writeVarUint(encoder, written)\n for (let i = 0; i < written; i++) {\n write(encoder, _strBuffer[i])\n }\n } else {\n writeVarUint8Array(encoder, string.encodeUtf8(str))\n }\n}\n\n/**\n * Write a variable length string.\n *\n * @function\n * @param {Encoder} encoder\n * @param {String} str The string that is to be encoded.\n */\nexport const _writeVarStringPolyfill = (encoder, str) => {\n const encodedString = unescape(encodeURIComponent(str))\n const len = encodedString.length\n writeVarUint(encoder, len)\n for (let i = 0; i < len; i++) {\n write(encoder, /** @type {number} */ (encodedString.codePointAt(i)))\n }\n}\n\n/**\n * Write a variable length string.\n *\n * @function\n * @param {Encoder} encoder\n * @param {String} str The string that is to be encoded.\n */\n/* c8 ignore next */\nexport const writeVarString = (string.utf8TextEncoder && /** @type {any} */ (string.utf8TextEncoder).encodeInto) ? _writeVarStringNative : _writeVarStringPolyfill\n\n/**\n * Write a string terminated by a special byte sequence. This is not very performant and is\n * generally discouraged. However, the resulting byte arrays are lexiographically ordered which\n * makes this a nice feature for databases.\n *\n * The string will be encoded using utf8 and then terminated and escaped using writeTerminatingUint8Array.\n *\n * @function\n * @param {Encoder} encoder\n * @param {String} str The string that is to be encoded.\n */\nexport const writeTerminatedString = (encoder, str) =>\n writeTerminatedUint8Array(encoder, string.encodeUtf8(str))\n\n/**\n * Write a terminating Uint8Array. Note that this is not performant and is generally\n * discouraged. There are few situations when this is needed.\n *\n * We use 0x0 as a terminating character. 0x1 serves as an escape character for 0x0 and 0x1.\n *\n * Example: [0,1,2] is encoded to [1,0,1,1,2,0]. 0x0, and 0x1 needed to be escaped using 0x1. Then\n * the result is terminated using the 0x0 character.\n *\n * This is basically how many systems implement null terminated strings. However, we use an escape\n * character 0x1 to avoid issues and potenial attacks on our database (if this is used as a key\n * encoder for NoSql databases).\n *\n * @function\n * @param {Encoder} encoder\n * @param {Uint8Array} buf The string that is to be encoded.\n */\nexport const writeTerminatedUint8Array = (encoder, buf) => {\n for (let i = 0; i < buf.length; i++) {\n const b = buf[i]\n if (b === 0 || b === 1) {\n write(encoder, 1)\n }\n write(encoder, buf[i])\n }\n write(encoder, 0)\n}\n\n/**\n * Write the content of another Encoder.\n *\n * @TODO: can be improved!\n * - Note: Should consider that when appending a lot of small Encoders, we should rather clone than referencing the old structure.\n * Encoders start with a rather big initial buffer.\n *\n * @function\n * @param {Encoder} encoder The enUint8Arr\n * @param {Encoder} append The BinaryEncoder to be written.\n */\nexport const writeBinaryEncoder = (encoder, append) => writeUint8Array(encoder, toUint8Array(append))\n\n/**\n * Append fixed-length Uint8Array to the encoder.\n *\n * @function\n * @param {Encoder} encoder\n * @param {Uint8Array} uint8Array\n */\nexport const writeUint8Array = (encoder, uint8Array) => {\n const bufferLen = encoder.cbuf.length\n const cpos = encoder.cpos\n const leftCopyLen = math.min(bufferLen - cpos, uint8Array.length)\n const rightCopyLen = uint8Array.length - leftCopyLen\n encoder.cbuf.set(uint8Array.subarray(0, leftCopyLen), cpos)\n encoder.cpos += leftCopyLen\n if (rightCopyLen > 0) {\n // Still something to write, write right half..\n // Append new buffer\n encoder.bufs.push(encoder.cbuf)\n // must have at least size of remaining buffer\n encoder.cbuf = new Uint8Array(math.max(bufferLen * 2, rightCopyLen))\n // copy array\n encoder.cbuf.set(uint8Array.subarray(leftCopyLen))\n encoder.cpos = rightCopyLen\n }\n}\n\n/**\n * Append an Uint8Array to Encoder.\n *\n * @function\n * @param {Encoder} encoder\n * @param {Uint8Array} uint8Array\n */\nexport const writeVarUint8Array = (encoder, uint8Array) => {\n writeVarUint(encoder, uint8Array.byteLength)\n writeUint8Array(encoder, uint8Array)\n}\n\n/**\n * Create an DataView of the next `len` bytes. Use it to write data after\n * calling this function.\n *\n * ```js\n * // write float32 using DataView\n * const dv = writeOnDataView(encoder, 4)\n * dv.setFloat32(0, 1.1)\n * // read float32 using DataView\n * const dv = readFromDataView(encoder, 4)\n * dv.getFloat32(0) // => 1.100000023841858 (leaving it to the reader to find out why this is the correct result)\n * ```\n *\n * @param {Encoder} encoder\n * @param {number} len\n * @return {DataView}\n */\nexport const writeOnDataView = (encoder, len) => {\n verifyLen(encoder, len)\n const dview = new DataView(encoder.cbuf.buffer, encoder.cpos, len)\n encoder.cpos += len\n return dview\n}\n\n/**\n * @param {Encoder} encoder\n * @param {number} num\n */\nexport const writeFloat32 = (encoder, num) => writeOnDataView(encoder, 4).setFloat32(0, num, false)\n\n/**\n * @param {Encoder} encoder\n * @param {number} num\n */\nexport const writeFloat64 = (encoder, num) => writeOnDataView(encoder, 8).setFloat64(0, num, false)\n\n/**\n * @param {Encoder} encoder\n * @param {bigint} num\n */\nexport const writeBigInt64 = (encoder, num) => /** @type {any} */ (writeOnDataView(encoder, 8)).setBigInt64(0, num, false)\n\n/**\n * @param {Encoder} encoder\n * @param {bigint} num\n */\nexport const writeBigUint64 = (encoder, num) => /** @type {any} */ (writeOnDataView(encoder, 8)).setBigUint64(0, num, false)\n\nconst floatTestBed = new DataView(new ArrayBuffer(4))\n/**\n * Check if a number can be encoded as a 32 bit float.\n *\n * @param {number} num\n * @return {boolean}\n */\nconst isFloat32 = num => {\n floatTestBed.setFloat32(0, num)\n return floatTestBed.getFloat32(0) === num\n}\n\n/**\n * Encode data with efficient binary format.\n *\n * Differences to JSON:\n * • Transforms data to a binary format (not to a string)\n * • Encodes undefined, NaN, and ArrayBuffer (these can't be represented in JSON)\n * • Numbers are efficiently encoded either as a variable length integer, as a\n * 32 bit float, as a 64 bit float, or as a 64 bit bigint.\n *\n * Encoding table:\n *\n * | Data Type | Prefix | Encoding Method | Comment |\n * | ------------------- | -------- | ------------------ | ------- |\n * | undefined | 127 | | Functions, symbol, and everything that cannot be identified is encoded as undefined |\n * | null | 126 | | |\n * | integer | 125 | writeVarInt | Only encodes 32 bit signed integers |\n * | float32 | 124 | writeFloat32 | |\n * | float64 | 123 | writeFloat64 | |\n * | bigint | 122 | writeBigInt64 | |\n * | boolean (false) | 121 | | True and false are different data types so we save the following byte |\n * | boolean (true) | 120 | | - 0b01111000 so the last bit determines whether true or false |\n * | string | 119 | writeVarString | |\n * | object<string,any> | 118 | custom | Writes {length} then {length} key-value pairs |\n * | array<any> | 117 | custom | Writes {length} then {length} json values |\n * | Uint8Array | 116 | writeVarUint8Array | We use Uint8Array for any kind of binary data |\n *\n * Reasons for the decreasing prefix:\n * We need the first bit for extendability (later we may want to encode the\n * prefix with writeVarUint). The remaining 7 bits are divided as follows:\n * [0-30] the beginning of the data range is used for custom purposes\n * (defined by the function that uses this library)\n * [31-127] the end of the data range is used for data encoding by\n * lib0/encoding.js\n *\n * @param {Encoder} encoder\n * @param {undefined|null|number|bigint|boolean|string|Object<string,any>|Array<any>|Uint8Array} data\n */\nexport const writeAny = (encoder, data) => {\n switch (typeof data) {\n case 'string':\n // TYPE 119: STRING\n write(encoder, 119)\n writeVarString(encoder, data)\n break\n case 'number':\n if (number.isInteger(data) && math.abs(data) <= binary.BITS31) {\n // TYPE 125: INTEGER\n write(encoder, 125)\n writeVarInt(encoder, data)\n } else if (isFloat32(data)) {\n // TYPE 124: FLOAT32\n write(encoder, 124)\n writeFloat32(encoder, data)\n } else {\n // TYPE 123: FLOAT64\n write(encoder, 123)\n writeFloat64(encoder, data)\n }\n break\n case 'bigint':\n // TYPE 122: BigInt\n write(encoder, 122)\n writeBigInt64(encoder, data)\n break\n case 'object':\n if (data === null) {\n // TYPE 126: null\n write(encoder, 126)\n } else if (array.isArray(data)) {\n // TYPE 117: Array\n write(encoder, 117)\n writeVarUint(encoder, data.length)\n for (let i = 0; i < data.length; i++) {\n writeAny(encoder, data[i])\n }\n } else if (data instanceof Uint8Array) {\n // TYPE 116: ArrayBuffer\n write(encoder, 116)\n writeVarUint8Array(encoder, data)\n } else {\n // TYPE 118: Object\n write(encoder, 118)\n const keys = Object.keys(data)\n writeVarUint(encoder, keys.length)\n for (let i = 0; i < keys.length; i++) {\n const key = keys[i]\n writeVarString(encoder, key)\n writeAny(encoder, data[key])\n }\n }\n break\n case 'boolean':\n // TYPE 120/121: boolean (true/false)\n write(encoder, data ? 120 : 121)\n break\n default:\n // TYPE 127: undefined\n write(encoder, 127)\n }\n}\n\n/**\n * Now come a few stateful encoder that have their own classes.\n */\n\n/**\n * Basic Run Length Encoder - a basic compression implementation.\n *\n * Encodes [1,1,1,7] to [1,3,7,1] (3 times 1, 1 time 7). This encoder might do more harm than good if there are a lot of values that are not repeated.\n *\n * It was originally used for image compression. Cool .. article http://csbruce.com/cbm/transactor/pdfs/trans_v7_i06.pdf\n *\n * @note T must not be null!\n *\n * @template T\n */\nexport class RleEncoder extends Encoder {\n /**\n * @param {function(Encoder, T):void} writer\n */\n constructor (writer) {\n super()\n /**\n * The writer\n */\n this.w = writer\n /**\n * Current state\n * @type {T|null}\n */\n this.s = null\n this.count = 0\n }\n\n /**\n * @param {T} v\n */\n write (v) {\n if (this.s === v) {\n this.count++\n } else {\n if (this.count > 0) {\n // flush counter, unless this is the first value (count = 0)\n writeVarUint(this, this.count - 1) // since count is always > 0, we can decrement by one. non-standard encoding ftw\n }\n this.count = 1\n // write first value\n this.w(this, v)\n this.s = v\n }\n }\n}\n\n/**\n * Basic diff decoder using variable length encoding.\n *\n * Encodes the values [3, 1100, 1101, 1050, 0] to [3, 1097, 1, -51, -1050] using writeVarInt.\n */\nexport class IntDiffEncoder extends Encoder {\n /**\n * @param {number} start\n */\n constructor (start) {\n super()\n /**\n * Current state\n * @type {number}\n */\n this.s = start\n }\n\n /**\n * @param {number} v\n */\n write (v) {\n writeVarInt(this, v - this.s)\n this.s = v\n }\n}\n\n/**\n * A combination of IntDiffEncoder and RleEncoder.\n *\n * Basically first writes the IntDiffEncoder and then counts duplicate diffs using RleEncoding.\n *\n * Encodes the values [1,1,1,2,3,4,5,6] as [1,1,0,2,1,5] (RLE([1,0,0,1,1,1,1,1]) ⇒ RleIntDiff[1,1,0,2,1,5])\n */\nexport class RleIntDiffEncoder extends Encoder {\n /**\n * @param {number} start\n */\n constructor (start) {\n super()\n /**\n * Current state\n * @type {number}\n */\n this.s = start\n this.count = 0\n }\n\n /**\n * @param {number} v\n */\n write (v) {\n if (this.s === v && this.count > 0) {\n this.count++\n } else {\n if (this.count > 0) {\n // flush counter, unless this is the first value (count = 0)\n writeVarUint(this, this.count - 1) // since count is always > 0, we can decrement by one. non-standard encoding ftw\n }\n this.count = 1\n // write first value\n writeVarInt(this, v - this.s)\n this.s = v\n }\n }\n}\n\n/**\n * @param {UintOptRleEncoder} encoder\n */\nconst flushUintOptRleEncoder = encoder => {\n if (encoder.count > 0) {\n // flush counter, unless this is the first value (count = 0)\n // case 1: just a single value. set sign to positive\n // case 2: write several values. set sign to negative to indicate that there is a length coming\n writeVarInt(encoder.encoder, encoder.count === 1 ? encoder.s : -encoder.s)\n if (encoder.count > 1) {\n writeVarUint(encoder.encoder, encoder.count - 2) // since count is always > 1, we can decrement by one. non-standard encoding ftw\n }\n }\n}\n\n/**\n * Optimized Rle encoder that does not suffer from the mentioned problem of the basic Rle encoder.\n *\n * Internally uses VarInt encoder to write unsigned integers. If the input occurs multiple times, we write\n * write it as a negative number. The UintOptRleDecoder then understands that it needs to read a count.\n *\n * Encodes [1,2,3,3,3] as [1,2,-3,3] (once 1, once 2, three times 3)\n */\nexport class UintOptRleEncoder {\n constructor () {\n this.encoder = new Encoder()\n /**\n * @type {number}\n */\n this.s = 0\n this.count = 0\n }\n\n /**\n * @param {number} v\n */\n write (v) {\n if (this.s === v) {\n this.count++\n } else {\n flushUintOptRleEncoder(this)\n this.count = 1\n this.s = v\n }\n }\n\n /**\n * Flush the encoded state and transform this to a Uint8Array.\n *\n * Note that this should only be called once.\n */\n toUint8Array () {\n flushUintOptRleEncoder(this)\n return toUint8Array(this.encoder)\n }\n}\n\n/**\n * Increasing Uint Optimized RLE Encoder\n *\n * The RLE encoder counts the number of same occurences of the same value.\n * The IncUintOptRle encoder counts if the value increases.\n * I.e. 7, 8, 9, 10 will be encoded as [-7, 4]. 1, 3, 5 will be encoded\n * as [1, 3, 5].\n */\nexport class IncUintOptRleEncoder {\n constructor () {\n this.encoder = new Encoder()\n /**\n * @type {number}\n */\n this.s = 0\n this.count = 0\n }\n\n /**\n * @param {number} v\n */\n write (v) {\n if (this.s + this.count === v) {\n this.count++\n } else {\n flushUintOptRleEncoder(this)\n this.count = 1\n this.s = v\n }\n }\n\n /**\n * Flush the encoded state and transform this to a Uint8Array.\n *\n * Note that this should only be called once.\n */\n toUint8Array () {\n flushUintOptRleEncoder(this)\n return toUint8Array(this.encoder)\n }\n}\n\n/**\n * @param {IntDiffOptRleEncoder} encoder\n */\nconst flushIntDiffOptRleEncoder = encoder => {\n if (encoder.count > 0) {\n // 31 bit making up the diff | wether to write the counter\n // const encodedDiff = encoder.diff << 1 | (encoder.count === 1 ? 0 : 1)\n const encodedDiff = encoder.diff * 2 + (encoder.count === 1 ? 0 : 1)\n // flush counter, unless this is the first value (count = 0)\n // case 1: just a single value. set first bit to positive\n // case 2: write several values. set first bit to negative to indicate that there is a length coming\n writeVarInt(encoder.encoder, encodedDiff)\n if (encoder.count > 1) {\n writeVarUint(encoder.encoder, encoder.count - 2) // since count is always > 1, we can decrement by one. non-standard encoding ftw\n }\n }\n}\n\n/**\n * A combination of the IntDiffEncoder and the UintOptRleEncoder.\n *\n * The count approach is similar to the UintDiffOptRleEncoder, but instead of using the negative bitflag, it encodes\n * in the LSB whether a count is to be read. Therefore this Encoder only supports 31 bit integers!\n *\n * Encodes [1, 2, 3, 2] as [3, 1, 6, -1] (more specifically [(1 << 1) | 1, (3 << 0) | 0, -1])\n *\n * Internally uses variable length encoding. Contrary to normal UintVar encoding, the first byte contains:\n * * 1 bit that denotes whether the next value is a count (LSB)\n * * 1 bit that denotes whether this value is negative (MSB - 1)\n * * 1 bit that denotes whether to continue reading the variable length integer (MSB)\n *\n * Therefore, only five bits remain to encode diff ranges.\n *\n * Use this Encoder only when appropriate. In most cases, this is probably a bad idea.\n */\nexport class IntDiffOptRleEncoder {\n constructor () {\n this.encoder = new Encoder()\n /**\n * @type {number}\n */\n this.s = 0\n this.count = 0\n this.diff = 0\n }\n\n /**\n * @param {number} v\n */\n write (v) {\n if (this.diff === v - this.s) {\n this.s = v\n this.count++\n } else {\n flushIntDiffOptRleEncoder(this)\n this.count = 1\n this.diff = v - this.s\n this.s = v\n }\n }\n\n /**\n * Flush the encoded state and transform this to a Uint8Array.\n *\n * Note that this should only be called once.\n */\n toUint8Array () {\n flushIntDiffOptRleEncoder(this)\n return toUint8Array(this.encoder)\n }\n}\n\n/**\n * Optimized String Encoder.\n *\n * Encoding many small strings in a simple Encoder is not very efficient. The function call to decode a string takes some time and creates references that must be eventually deleted.\n * In practice, when decoding several million small strings, the GC will kick in more and more often to collect orphaned string objects (or maybe there is another reason?).\n *\n * This string encoder solves the above problem. All strings are concatenated and written as a single string using a single encoding call.\n *\n * The lengths are encoded using a UintOptRleEncoder.\n */\nexport class StringEncoder {\n constructor () {\n /**\n * @type {Array<string>}\n */\n this.sarr = []\n this.s = ''\n this.lensE = new UintOptRleEncoder()\n }\n\n /**\n * @param {string} string\n */\n write (string) {\n this.s += string\n if (this.s.length > 19) {\n this.sarr.push(this.s)\n this.s = ''\n }\n this.lensE.write(string.length)\n }\n\n toUint8Array () {\n const encoder = new Encoder()\n this.sarr.push(this.s)\n this.s = ''\n writeVarString(encoder, this.sarr.join(''))\n writeUint8Array(encoder, this.lensE.toUint8Array())\n return toUint8Array(encoder)\n }\n}\n","/**\n * Error helpers.\n *\n * @module error\n */\n\n/**\n * @param {string} s\n * @return {Error}\n */\n/* c8 ignore next */\nexport const create = s => new Error(s)\n\n/**\n * @throws {Error}\n * @return {never}\n */\n/* c8 ignore next 3 */\nexport const methodUnimplemented = () => {\n throw create('Method unimplemented')\n}\n\n/**\n * @throws {Error}\n * @return {never}\n */\n/* c8 ignore next 3 */\nexport const unexpectedCase = () => {\n throw create('Unexpected case')\n}\n","/**\n * Efficient schema-less binary decoding with support for variable length encoding.\n *\n * Use [lib0/decoding] with [lib0/encoding]. Every encoding function has a corresponding decoding function.\n *\n * Encodes numbers in little-endian order (least to most significant byte order)\n * and is compatible with Golang's binary encoding (https://golang.org/pkg/encoding/binary/)\n * which is also used in Protocol Buffers.\n *\n * ```js\n * // encoding step\n * const encoder = encoding.createEncoder()\n * encoding.writeVarUint(encoder, 256)\n * encoding.writeVarString(encoder, 'Hello world!')\n * const buf = encoding.toUint8Array(encoder)\n * ```\n *\n * ```js\n * // decoding step\n * const decoder = decoding.createDecoder(buf)\n * decoding.readVarUint(decoder) // => 256\n * decoding.readVarString(decoder) // => 'Hello world!'\n * decoding.hasContent(decoder) // => false - all data is read\n * ```\n *\n * @module decoding\n */\n\nimport * as binary from './binary.js'\nimport * as math from './math.js'\nimport * as number from './number.js'\nimport * as string from './string.js'\nimport * as error from './error.js'\nimport * as encoding from './encoding.js'\n\nconst errorUnexpectedEndOfArray = error.create('Unexpected end of array')\nconst errorIntegerOutOfRange = error.create('Integer out of Range')\n\n/**\n * A Decoder handles the decoding of an Uint8Array.\n */\nexport class Decoder {\n /**\n * @param {Uint8Array} uint8Array Binary data to decode\n */\n constructor (uint8Array) {\n /**\n * Decoding target.\n *\n * @type {Uint8Array}\n */\n this.arr = uint8Array\n /**\n * Current decoding position.\n *\n * @type {number}\n */\n this.pos = 0\n }\n}\n\n/**\n * @function\n * @param {Uint8Array} uint8Array\n * @return {Decoder}\n */\nexport const createDecoder = uint8Array => new Decoder(uint8Array)\n\n/**\n * @function\n * @param {Decoder} decoder\n * @return {boolean}\n */\nexport const hasContent = decoder => decoder.pos !== decoder.arr.length\n\n/**\n * Clone a decoder instance.\n * Optionally set a new position parameter.\n *\n * @function\n * @param {Decoder} decoder The decoder instance\n * @param {number} [newPos] Defaults to current position\n * @return {Decoder} A clone of `decoder`\n */\nexport const clone = (decoder, newPos = decoder.pos) => {\n const _decoder = createDecoder(decoder.arr)\n _decoder.pos = newPos\n return _decoder\n}\n\n/**\n * Create an Uint8Array view of the next `len` bytes and advance the position by `len`.\n *\n * Important: The Uint8Array still points to the underlying ArrayBuffer. Make sure to discard the result as soon as possible to prevent any memory leaks.\n * Use `buffer.copyUint8Array` to copy the result into a new Uint8Array.\n *\n * @function\n * @param {Decoder} decoder The decoder instance\n * @param {number} len The length of bytes to read\n * @return {Uint8Array}\n */\nexport const readUint8Array = (decoder, len) => {\n const view = new Uint8Array(decoder.arr.buffer, decoder.pos + decoder.arr.byteOffset, len)\n decoder.pos += len\n return view\n}\n\n/**\n * Read variable length Uint8Array.\n *\n * Important: The Uint8Array still points to the underlying ArrayBuffer. Make sure to discard the result as soon as possible to prevent any memory leaks.\n * Use `buffer.copyUint8Array` to copy the result into a new Uint8Array.\n *\n * @function\n * @param {Decoder} decoder\n * @return {Uint8Array}\n */\nexport const readVarUint8Array = decoder => readUint8Array(decoder, readVarUint(decoder))\n\n/**\n * Read the rest of the content as an ArrayBuffer\n * @function\n * @param {Decoder} decoder\n * @return {Uint8Array}\n */\nexport const readTailAsUint8Array = decoder => readUint8Array(decoder, decoder.arr.length - decoder.pos)\n\n/**\n * Skip one byte, jump to the next position.\n * @function\n * @param {Decoder} decoder The decoder instance\n * @return {number} The next position\n */\nexport const skip8 = decoder => decoder.pos++\n\n/**\n * Read one byte as unsigned integer.\n * @function\n * @param {Decoder} decoder The decoder instance\n * @return {number} Unsigned 8-bit integer\n */\nexport const readUint8 = decoder => decoder.arr[decoder.pos++]\n\n/**\n * Read 2 bytes as unsigned integer.\n *\n * @function\n * @param {Decoder} decoder\n * @return {number} An unsigned integer.\n */\nexport const readUint16 = decoder => {\n const uint =\n decoder.arr[decoder.pos] +\n (decoder.arr[decoder.pos + 1] << 8)\n decoder.pos += 2\n return uint\n}\n\n/**\n * Read 4 bytes as unsigned integer.\n *\n * @function\n * @param {Decoder} decoder\n * @return {number} An unsigned integer.\n */\nexport const readUint32 = decoder => {\n const uint =\n (decoder.arr[decoder.pos] +\n (decoder.arr[decoder.pos + 1] << 8) +\n (decoder.arr[decoder.pos + 2] << 16) +\n (decoder.arr[decoder.pos + 3] << 24)) >>> 0\n decoder.pos += 4\n return uint\n}\n\n/**\n * Read 4 bytes as unsigned integer in big endian order.\n * (most significant byte first)\n *\n * @function\n * @param {Decoder} decoder\n * @return {number} An unsigned integer.\n */\nexport const readUint32BigEndian = decoder => {\n const uint =\n (decoder.arr[decoder.pos + 3] +\n (decoder.arr[decoder.pos + 2] << 8) +\n (decoder.arr[decoder.pos + 1] << 16) +\n (decoder.arr[decoder.pos] << 24)) >>> 0\n decoder.pos += 4\n return uint\n}\n\n/**\n * Look ahead without incrementing the position\n * to the next byte and read it as unsigned integer.\n *\n * @function\n * @param {Decoder} decoder\n * @return {number} An unsigned integer.\n */\nexport const peekUint8 = decoder => decoder.arr[decoder.pos]\n\n/**\n * Look ahead without incrementing the position\n * to the next byte and read it as unsigned integer.\n *\n * @function\n * @param {Decoder} decoder\n * @return {number} An unsigned integer.\n */\nexport const peekUint16 = decoder =>\n decoder.arr[decoder.pos] +\n (decoder.arr[decoder.pos + 1] << 8)\n\n/**\n * Look ahead without incrementing the position\n * to the next byte and read it as unsigned integer.\n *\n * @function\n * @param {Decoder} decoder\n * @return {number} An unsigned integer.\n */\nexport const peekUint32 = decoder => (\n decoder.arr[decoder.pos] +\n (decoder.arr[decoder.pos + 1] << 8) +\n (decoder.arr[decoder.pos + 2] << 16) +\n (decoder.arr[decoder.pos + 3] << 24)\n) >>> 0\n\n/**\n * Read unsigned integer (32bit) with variable length.\n * 1/8th of the storage is used as encoding overhead.\n * * numbers < 2^7 is stored in one bytlength\n * * numbers < 2^14 is stored in two bylength\n *\n * @function\n * @param {Decoder} decoder\n * @return {number} An unsigned integer.length\n */\nexport const readVarUint = decoder => {\n let num = 0\n let mult = 1\n const len = decoder.arr.length\n while (decoder.pos < len) {\n const r = decoder.arr[decoder.pos++]\n // num = num | ((r & binary.BITS7) << len)\n num = num + (r & binary.BITS7) * mult // shift $r << (7*#iterations) and add it to num\n mult *= 128 // next iteration, shift 7 \"more\" to the left\n if (r < binary.BIT8) {\n return num\n }\n /* c8 ignore start */\n if (num > number.MAX_SAFE_INTEGER) {\n throw errorIntegerOutOfRange\n }\n /* c8 ignore stop */\n }\n throw errorUnexpectedEndOfArray\n}\n\n/**\n * Read signed integer (32bit) with variable length.\n * 1/8th of the storage is used as encoding overhead.\n * * numbers < 2^7 is stored in one bytlength\n * * numbers < 2^14 is stored in two bylength\n * @todo This should probably create the inverse ~num if number is negative - but this would be a breaking change.\n *\n * @function\n * @param {Decoder} decoder\n * @return {number} An unsigned integer.length\n */\nexport const readVarInt = decoder => {\n let r = decoder.arr[decoder.pos++]\n let num = r & binary.BITS6\n let mult = 64\n const sign = (r & binary.BIT7) > 0 ? -1 : 1\n if ((r & binary.BIT8) === 0) {\n // don't continue reading\n return sign * num\n }\n const len = decoder.arr.length\n while (decoder.pos < len) {\n r = decoder.arr[decoder.pos++]\n // num = num | ((r & binary.BITS7) << len)\n num = num + (r & binary.BITS7) * mult\n mult *= 128\n if (r < binary.BIT8) {\n return sign * num\n }\n /* c8 ignore start */\n if (num > number.MAX_SAFE_INTEGER) {\n throw errorIntegerOutOfRange\n }\n /* c8 ignore stop */\n }\n throw errorUnexpectedEndOfArray\n}\n\n/**\n * Look ahead and read varUint without incrementing position\n *\n * @function\n * @param {Decoder} decoder\n * @return {number}\n */\nexport const peekVarUint = decoder => {\n const pos = decoder.pos\n const s = readVarUint(decoder)\n decoder.pos = pos\n return s\n}\n\n/**\n * Look ahead and read varUint without incrementing position\n *\n * @function\n * @param {Decoder} decoder\n * @return {number}\n */\nexport const peekVarInt = decoder => {\n const pos = decoder.pos\n const s = readVarInt(decoder)\n decoder.pos = pos\n return s\n}\n\n/**\n * We don't test this function anymore as we use native decoding/encoding by default now.\n * Better not modify this anymore..\n *\n * Transforming utf8 to a string is pretty expensive. The code performs 10x better\n * when String.fromCodePoint is fed with all characters as arguments.\n * But most environments have a maximum number of arguments per functions.\n * For effiency reasons we apply a maximum of 10000 characters at once.\n *\n * @function\n * @param {Decoder} decoder\n * @return {String} The read String.\n */\n/* c8 ignore start */\nexport const _readVarStringPolyfill = decoder => {\n let remainingLen = readVarUint(decoder)\n if (remainingLen === 0) {\n return ''\n } else {\n let encodedString = String.fromCodePoint(readUint8(decoder)) // remember to decrease remainingLen\n if (--remainingLen < 100) { // do not create a Uint8Array for small strings\n while (remainingLen--) {\n encodedString += String.fromCodePoint(readUint8(decoder))\n }\n } else {\n while (remainingLen > 0) {\n const nextLen = remainingLen < 10000 ? remainingLen : 10000\n // this is dangerous, we create a fresh array view from the existing buffer\n const bytes = decoder.arr.subarray(decoder.pos, decoder.pos + nextLen)\n decoder.pos += nextLen\n // Starting with ES5.1 we can supply a generic array-like object as arguments\n encodedString += String.fromCodePoint.apply(null, /** @type {any} */ (bytes))\n remainingLen -= nextLen\n }\n }\n return decodeURIComponent(escape(encodedString))\n }\n}\n/* c8 ignore stop */\n\n/**\n * @function\n * @param {Decoder} decoder\n * @return {String} The read String\n */\nexport const _readVarStringNative = decoder =>\n /** @type any */ (string.utf8TextDecoder).decode(readVarUint8Array(decoder))\n\n/**\n * Read string of variable length\n * * varUint is used to store the length of the string\n *\n * @function\n * @param {Decoder} decoder\n * @return {String} The read String\n *\n */\n/* c8 ignore next */\nexport const readVarString = string.utf8TextDecoder ? _readVarStringNative : _readVarStringPolyfill\n\n/**\n * @param {Decoder} decoder\n * @return {Uint8Array}\n */\nexport const readTerminatedUint8Array = decoder => {\n const encoder = encoding.createEncoder()\n let b\n while (true) {\n b = readUint8(decoder)\n if (b === 0) {\n return encoding.toUint8Array(encoder)\n }\n if (b === 1) {\n b = readUint8(decoder)\n }\n encoding.write(encoder, b)\n }\n}\n\n/**\n * @param {Decoder} decoder\n * @return {string}\n */\nexport const readTerminatedString = decoder => string.decodeUtf8(readTerminatedUint8Array(decoder))\n\n/**\n * Look ahead and read varString without incrementing position\n *\n * @function\n * @param {Decoder} decoder\n * @return {string}\n */\nexport const peekVarString = decoder => {\n const pos = decoder.pos\n const s = readVarString(decoder)\n decoder.pos = pos\n return s\n}\n\n/**\n * @param {Decoder} decoder\n * @param {number} len\n * @return {DataView}\n */\nexport const readFromDataView = (decoder, len) => {\n const dv = new DataView(decoder.arr.buffer, decoder.arr.byteOffset + decoder.pos, len)\n decoder.pos += len\n return dv\n}\n\n/**\n * @param {Decoder} decoder\n */\nexport const readFloat32 = decoder => readFromDataView(decoder, 4).getFloat32(0, false)\n\n/**\n * @param {Decoder} decoder\n */\nexport const readFloat64 = decoder => readFromDataView(decoder, 8).getFloat64(0, false)\n\n/**\n * @param {Decoder} decoder\n */\nexport const readBigInt64 = decoder => /** @type {any} */ (readFromDataView(decoder, 8)).getBigInt64(0, false)\n\n/**\n * @param {Decoder} decoder\n */\nexport const readBigUint64 = decoder => /** @type {any} */ (readFromDataView(decoder, 8)).getBigUint64(0, false)\n\n/**\n * @type {Array<function(Decoder):any>}\n */\nconst readAnyLookupTable = [\n decoder => undefined, // CASE 127: undefined\n decoder => null, // CASE 126: null\n readVarInt, // CASE 125: integer\n readFloat32, // CASE 124: float32\n readFloat64, // CASE 123: float64\n readBigInt64, // CASE 122: bigint\n decoder => false, // CASE 121: boolean (false)\n decoder => true, // CASE 120: boolean (true)\n readVarString, // CASE 119: string\n decoder => { // CASE 118: object<string,any>\n const len = readVarUint(decoder)\n /**\n * @type {Object<string,any>}\n */\n const obj = {}\n for (let i = 0; i < len; i++) {\n const key = readVarString(decoder)\n obj[key] = readAny(decoder)\n }\n return obj\n },\n decoder => { // CASE 117: array<any>\n const len = readVarUint(decoder)\n const arr = []\n for (let i = 0; i < len; i++) {\n arr.push(readAny(decoder))\n }\n return arr\n },\n readVarUint8Array // CASE 116: Uint8Array\n]\n\n/**\n * @param {Decoder} decoder\n */\nexport const readAny = decoder => readAnyLookupTable[127 - readUint8(decoder)](decoder)\n\n/**\n * T must not be null.\n *\n * @template T\n */\nexport class RleDecoder extends Decoder {\n /**\n * @param {Uint8Array} uint8Array\n * @param {function(Decoder):T} reader\n */\n constructor (uint8Array, reader) {\n super(uint8Array)\n /**\n * The reader\n */\n this.reader = reader\n /**\n * Current state\n * @type {T|null}\n */\n this.s = null\n this.count = 0\n }\n\n read () {\n if (this.count === 0) {\n this.s = this.reader(this)\n if (hasContent(this)) {\n this.count = readVarUint(this) + 1 // see encoder implementation for the reason why this is incremented\n } else {\n this.count = -1 // read the current value forever\n }\n }\n this.count--\n return /** @type {T} */ (this.s)\n }\n}\n\nexport class IntDiffDecoder extends Decoder {\n /**\n * @param {Uint8Array} uint8Array\n * @param {number} start\n */\n constructor (uint8Array, start) {\n super(uint8Array)\n /**\n * Current state\n * @type {number}\n */\n this.s = start\n }\n\n /**\n * @return {number}\n */\n read () {\n this.s += readVarInt(this)\n return this.s\n }\n}\n\nexport class RleIntDiffDecoder extends Decoder {\n /**\n * @param {Uint8Array} uint8Array\n * @param {number} start\n */\n constructor (uint8Array, start) {\n super(uint8Array)\n /**\n * Current state\n * @type {number}\n */\n this.s = start\n this.count = 0\n }\n\n /**\n * @return {number}\n */\n read () {\n if (this.count === 0) {\n this.s += readVarInt(this)\n if (hasContent(this)) {\n this.count = readVarUint(this) + 1 // see encoder implementation for the reason why this is incremented\n } else {\n this.count = -1 // read the current value forever\n }\n }\n this.count--\n return /** @type {number} */ (this.s)\n }\n}\n\nexport class UintOptRleDecoder extends Decoder {\n /**\n * @param {Uint8Array} uint8Array\n */\n constructor (uint8Array) {\n super(uint8Array)\n /**\n * @type {number}\n */\n this.s = 0\n this.count = 0\n }\n\n read () {\n if (this.count === 0) {\n this.s = readVarInt(this)\n // if the sign is negative, we read the count too, otherwise count is 1\n const isNegative = math.isNegativeZero(this.s)\n this.count = 1\n if (isNegative) {\n this.s = -this.s\n this.count = readVarUint(this) + 2\n }\n }\n this.count--\n return /** @type {number} */ (this.s)\n }\n}\n\nexport class IncUintOptRleDecoder extends Decoder {\n /**\n * @param {Uint8Array} uint8Array\n */\n constructor (uint8Array) {\n super(uint8Array)\n /**\n * @type {number}\n */\n this.s = 0\n this.count = 0\n }\n\n read () {\n if (this.count === 0) {\n this.s = readVarInt(this)\n // if the sign is negative, we read the count too, otherwise count is 1\n const isNegative = math.isNegativeZero(this.s)\n this.count = 1\n if (isNegative) {\n this.s = -this.s\n this.count = readVarUint(this) + 2\n }\n }\n this.count--\n return /** @type {number} */ (this.s++)\n }\n}\n\nexport class IntDiffOptRleDecoder extends Decoder {\n /**\n * @param {Uint8Array} uint8Array\n */\n constructor (uint8Array) {\n super(uint8Array)\n /**\n * @type {number}\n */\n this.s = 0\n this.count = 0\n this.diff = 0\n }\n\n /**\n * @return {number}\n */\n read () {\n if (this.count === 0) {\n const diff = readVarInt(this)\n // if the first bit is set, we read more data\n const hasCount = diff & 1\n this.diff = math.floor(diff / 2) // shift >> 1\n this.count = 1\n if (hasCount) {\n this.count = readVarUint(this) + 2\n }\n }\n this.s += this.diff\n this.count--\n return this.s\n }\n}\n\nexport class StringDecoder {\n /**\n * @param {Uint8Array} uint8Array\n */\n constructor (uint8Array) {\n this.decoder = new UintOptRleDecoder(uint8Array)\n this.str = readVarString(this.decoder)\n /**\n * @type {number}\n */\n this.spos = 0\n }\n\n /**\n * @return {string}\n */\n read () {\n const end = this.spos + this.decoder.read()\n const res = this.str.slice(this.spos, end)\n this.spos = end\n return res\n }\n}\n","/* eslint-env browser */\n\nexport const subtle = crypto.subtle\nexport const getRandomValues = crypto.getRandomValues.bind(crypto)\n","/**\n * Isomorphic module for true random numbers / buffers / uuids.\n *\n * Attention: falls back to Math.random if the browser does not support crypto.\n *\n * @module random\n */\n\nimport * as math from './math.js'\nimport * as binary from './binary.js'\nimport { getRandomValues } from 'lib0/webcrypto'\n\nexport const rand = Math.random\n\nexport const uint32 = () => getRandomValues(new Uint32Array(1))[0]\n\nexport const uint53 = () => {\n const arr = getRandomValues(new Uint32Array(8))\n return (arr[0] & binary.BITS21) * (binary.BITS32 + 1) + (arr[1] >>> 0)\n}\n\n/**\n * @template T\n * @param {Array<T>} arr\n * @return {T}\n */\nexport const oneOf = arr => arr[math.floor(rand() * arr.length)]\n\n// @ts-ignore\nconst uuidv4Template = [1e7] + -1e3 + -4e3 + -8e3 + -1e11\n\n/**\n * @return {string}\n */\nexport const uuidv4 = () => uuidv4Template.replace(/[018]/g, /** @param {number} c */ c =>\n (c ^ uint32() & 15 >> c / 4).toString(16)\n)\n","/**\n * Utility helpers to work with promises.\n *\n * @module promise\n */\n\nimport * as time from './time.js'\n\n/**\n * @template T\n * @callback PromiseResolve\n * @param {T|PromiseLike<T>} [result]\n */\n\n/**\n * @template T\n * @param {function(PromiseResolve<T>,function(Error):void):any} f\n * @return {Promise<T>}\n */\nexport const create = f => /** @type {Promise<T>} */ (new Promise(f))\n\n/**\n * @param {function(function():void,function(Error):void):void} f\n * @return {Promise<void>}\n */\nexport const createEmpty = f => new Promise(f)\n\n/**\n * `Promise.all` wait for all promises in the array to resolve and return the result\n * @template {unknown[] | []} PS\n *\n * @param {PS} ps\n * @return {Promise<{ -readonly [P in keyof PS]: Awaited<PS[P]> }>}\n */\nexport const all = Promise.all.bind(Promise)\n\n/**\n * @param {Error} [reason]\n * @return {Promise<never>}\n */\nexport const reject = reason => Promise.reject(reason)\n\n/**\n * @template T\n * @param {T|void} res\n * @return {Promise<T|void>}\n */\nexport const resolve = res => Promise.resolve(res)\n\n/**\n * @template T\n * @param {T} res\n * @return {Promise<T>}\n */\nexport const resolveWith = res => Promise.resolve(res)\n\n/**\n * @todo Next version, reorder parameters: check, [timeout, [intervalResolution]]\n * @deprecated use untilAsync instead\n *\n * @param {number} timeout\n * @param {function():boolean} check\n * @param {number} [intervalResolution]\n * @return {Promise<void>}\n */\nexport const until = (timeout, check, intervalResolution = 10) => create((resolve, reject) => {\n const startTime = time.getUnixTime()\n const hasTimeout = timeout > 0\n const untilInterval = () => {\n if (check()) {\n clearInterval(intervalHandle)\n resolve()\n } else if (hasTimeout) {\n /* c8 ignore else */\n if (time.getUnixTime() - startTime > timeout) {\n clearInterval(intervalHandle)\n reject(new Error('Timeout'))\n }\n }\n }\n const intervalHandle = setInterval(untilInterval, intervalResolution)\n})\n\n/**\n * @param {()=>Promise<boolean>|boolean} check\n * @param {number} timeout\n * @param {number} intervalResolution\n * @return {Promise<void>}\n */\nexport const untilAsync = async (check, timeout = 0, intervalResolution = 10) => {\n const startTime = time.getUnixTime()\n const noTimeout = timeout <= 0\n // eslint-disable-next-line no-unmodified-loop-condition\n while (noTimeout || time.getUnixTime() - startTime <= timeout) {\n if (await check()) return\n await wait(intervalResolution)\n }\n throw new Error('Timeout')\n}\n\n/**\n * @param {number} timeout\n * @return {Promise<undefined>}\n */\nexport const wait = timeout => create((resolve, _reject) => setTimeout(resolve, timeout))\n\n/**\n * Checks if an object is a promise using ducktyping.\n *\n * Promises are often polyfilled, so it makes sense to add some additional guarantees if the user of this\n * library has some insane environment where global Promise objects are overwritten.\n *\n * @param {any} p\n * @return {boolean}\n */\nexport const isPromise = p => p instanceof Promise || (p && p.then && p.catch && p.finally)\n","/**\n * Often used conditions.\n *\n * @module conditions\n */\n\n/**\n * @template T\n * @param {T|null|undefined} v\n * @return {T|null}\n */\n/* c8 ignore next */\nexport const undefinedToNull = v => v === undefined ? null : v\n","/* eslint-env browser */\n\n/**\n * Isomorphic variable storage.\n *\n * Uses LocalStorage in the browser and falls back to in-memory storage.\n *\n * @module storage\n */\n\n/* c8 ignore start */\nclass VarStoragePolyfill {\n constructor () {\n this.map = new Map()\n }\n\n /**\n * @param {string} key\n * @param {any} newValue\n */\n setItem (key, newValue) {\n this.map.set(key, newValue)\n }\n\n /**\n * @param {string} key\n */\n getItem (key) {\n return this.map.get(key)\n }\n}\n/* c8 ignore stop */\n\n/**\n * @type {any}\n */\nlet _localStorage = new VarStoragePolyfill()\nlet usePolyfill = true\n\n/* c8 ignore start */\ntry {\n // if the same-origin rule is violated, accessing localStorage might thrown an error\n if (typeof localStorage !== 'undefined' && localStorage) {\n _localStorage = localStorage\n usePolyfill = false\n }\n} catch (e) { }\n/* c8 ignore stop */\n\n/**\n * This is basically localStorage in browser, or a polyfill in nodejs\n */\n/* c8 ignore next */\nexport const varStorage = _localStorage\n\n/**\n * A polyfill for `addEventListener('storage', event => {..})` that does nothing if the polyfill is being used.\n *\n * @param {function({ key: string, newValue: string, oldValue: string }): void} eventHandler\n * @function\n */\n/* c8 ignore next */\nexport const onChange = eventHandler => usePolyfill || addEventListener('storage', /** @type {any} */ (eventHandler))\n\n/**\n * A polyfill for `removeEventListener('storage', event => {..})` that does nothing if the polyfill is being used.\n *\n * @param {function({ key: string, newValue: string, oldValue: string }): void} eventHandler\n * @function\n */\n/* c8 ignore next */\nexport const offChange = eventHandler => usePolyfill || removeEventListener('storage', /** @type {any} */ (eventHandler))\n","/**\n * Utility functions for working with EcmaScript objects.\n *\n * @module object\n */\n\n/**\n * @return {Object<string,any>} obj\n */\nexport const create = () => Object.create(null)\n\n/**\n * Object.assign\n */\nexport const assign = Object.assign\n\n/**\n * @param {Object<string,any>} obj\n */\nexport const keys = Object.keys\n\n/**\n * @template V\n * @param {{[k:string]:V}} obj\n * @param {function(V,string):any} f\n */\nexport const forEach = (obj, f) => {\n for (const key in obj) {\n f(obj[key], key)\n }\n}\n\n/**\n * @todo implement mapToArray & map\n *\n * @template R\n * @param {Object<string,any>} obj\n * @param {function(any,string):R} f\n * @return {Array<R>}\n */\nexport const map = (obj, f) => {\n const results = []\n for (const key in obj) {\n results.push(f(obj[key], key))\n }\n return results\n}\n\n/**\n * @deprecated use object.size instead\n * @param {Object<string,any>} obj\n * @return {number}\n */\nexport const length = obj => keys(obj).length\n\n/**\n * @param {Object<string,any>} obj\n * @return {number}\n */\nexport const size = obj => keys(obj).length\n\n/**\n * @param {Object<string,any>} obj\n * @param {function(any,string):boolean} f\n * @return {boolean}\n */\nexport const some = (obj, f) => {\n for (const key in obj) {\n if (f(obj[key], key)) {\n return true\n }\n }\n return false\n}\n\n/**\n * @param {Object|undefined} obj\n */\nexport const isEmpty = obj => {\n // eslint-disable-next-line\n for (const _k in obj) {\n return false\n }\n return true\n}\n\n/**\n * @param {Object<string,any>} obj\n * @param {function(any,string):boolean} f\n * @return {boolean}\n */\nexport const every = (obj, f) => {\n for (const key in obj) {\n if (!f(obj[key], key)) {\n return false\n }\n }\n return true\n}\n\n/**\n * Calls `Object.prototype.hasOwnProperty`.\n *\n * @param {any} obj\n * @param {string|symbol} key\n * @return {boolean}\n */\nexport const hasProperty = (obj, key) => Object.prototype.hasOwnProperty.call(obj, key)\n\n/**\n * @param {Object<string,any>} a\n * @param {Object<string,any>} b\n * @return {boolean}\n */\nexport const equalFlat = (a, b) => a === b || (size(a) === size(b) && every(a, (val, key) => (val !== undefined || hasProperty(b, key)) && b[key] === val))\n\n/**\n * Make an object immutable. This hurts performance and is usually not needed if you perform good\n * coding practices.\n */\nexport const freeze = Object.freeze\n\n/**\n * Make an object and all its children immutable.\n * This *really* hurts performance and is usually not needed if you perform good coding practices.\n *\n * @template {any} T\n * @param {T} o\n * @return {Readonly<T>}\n */\nexport const deepFreeze = (o) => {\n for (const key in o) {\n const c = o[key]\n if (typeof c === 'object' || typeof c === 'function') {\n deepFreeze(o[key])\n }\n }\n return freeze(o)\n}\n","/**\n * Common functions and function call helpers.\n *\n * @module function\n */\n\nimport * as array from './array.js'\nimport * as object from './object.js'\n\n/**\n * Calls all functions in `fs` with args. Only throws after all functions were called.\n *\n * @param {Array<function>} fs\n * @param {Array<any>} args\n */\nexport const callAll = (fs, args, i = 0) => {\n try {\n for (; i < fs.length; i++) {\n fs[i](...args)\n }\n } finally {\n if (i < fs.length) {\n callAll(fs, args, i + 1)\n }\n }\n}\n\nexport const nop = () => {}\n\n/**\n * @template T\n * @param {function():T} f\n * @return {T}\n */\nexport const apply = f => f()\n\n/**\n * @template A\n *\n * @param {A} a\n * @return {A}\n */\nexport const id = a => a\n\n/**\n * @template T\n *\n * @param {T} a\n * @param {T} b\n * @return {boolean}\n */\nexport const equalityStrict = (a, b) => a === b\n\n/**\n * @template T\n *\n * @param {Array<T>|object} a\n * @param {Array<T>|object} b\n * @return {boolean}\n */\nexport const equalityFlat = (a, b) => a === b || (a != null && b != null && a.constructor === b.constructor && ((array.isArray(a) && array.equalFlat(a, /** @type {Array<T>} */ (b))) || (typeof a === 'object' && object.equalFlat(a, b))))\n\n/* c8 ignore start */\n\n/**\n * @param {any} a\n * @param {any} b\n * @return {boolean}\n */\nexport const equalityDeep = (a, b) => {\n if (a == null || b == null) {\n return equalityStrict(a, b)\n }\n if (a.constructor !== b.constructor) {\n return false\n }\n if (a === b) {\n return true\n }\n switch (a.constructor) {\n case ArrayBuffer:\n a = new Uint8Array(a)\n b = new Uint8Array(b)\n // eslint-disable-next-line no-fallthrough\n case Uint8Array: {\n if (a.byteLength !== b.byteLength) {\n return false\n }\n for (let i = 0; i < a.length; i++) {\n if (a[i] !== b[i]) {\n return false\n }\n }\n break\n }\n case Set: {\n if (a.size !== b.size) {\n return false\n }\n for (const value of a) {\n if (!b.has(value)) {\n return false\n }\n }\n break\n }\n case Map: {\n if (a.size !== b.size) {\n return false\n }\n for (const key of a.keys()) {\n if (!b.has(key) || !equalityDeep(a.get(key), b.get(key))) {\n return false\n }\n }\n break\n }\n case Object:\n if (object.length(a) !== object.length(b)) {\n return false\n }\n for (const key in a) {\n if (!object.hasProperty(a, key) || !equalityDeep(a[key], b[key])) {\n return false\n }\n }\n break\n case Array:\n if (a.length !== b.length) {\n return false\n }\n for (let i = 0; i < a.length; i++) {\n if (!equalityDeep(a[i], b[i])) {\n return false\n }\n }\n break\n default:\n return false\n }\n return true\n}\n\n/**\n * @template V\n * @template {V} OPTS\n *\n * @param {V} value\n * @param {Array<OPTS>} options\n */\n// @ts-ignore\nexport const isOneOf = (value, options) => options.includes(value)\n/* c8 ignore stop */\n\nexport const isArray = array.isArray\n\n/**\n * @param {any} s\n * @return {s is String}\n */\nexport const isString = (s) => s && s.constructor === String\n\n/**\n * @param {any} n\n * @return {n is Number}\n */\nexport const isNumber = n => n != null && n.constructor === Number\n\n/**\n * @template {abstract new (...args: any) => any} TYPE\n * @param {any} n\n * @param {TYPE} T\n * @return {n is InstanceType<TYPE>}\n */\nexport const is = (n, T) => n && n.constructor === T\n\n/**\n * @template {abstract new (...args: any) => any} TYPE\n * @param {TYPE} T\n */\nexport const isTemplate = (T) =>\n /**\n * @param {any} n\n * @return {n is InstanceType<TYPE>}\n **/\n n => n && n.constructor === T\n","/**\n * Isomorphic module to work access the environment (query params, env variables).\n *\n * @module environment\n */\n\nimport * as map from './map.js'\nimport * as string from './string.js'\nimport * as conditions from './conditions.js'\nimport * as storage from './storage.js'\nimport * as f from './function.js'\n\n/* c8 ignore next 2 */\n// @ts-ignore\nexport const isNode = typeof process !== 'undefined' && process.release && /node|io\\.js/.test(process.release.name) && Object.prototype.toString.call(typeof process !== 'undefined' ? process : 0) === '[object process]'\n\n/* c8 ignore next */\nexport const isBrowser = typeof window !== 'undefined' && typeof document !== 'undefined' && !isNode\n/* c8 ignore next 3 */\nexport const isMac = typeof navigator !== 'undefined'\n ? /Mac/.test(navigator.platform)\n : false\n\n/**\n * @type {Map<string,string>}\n */\nlet params\nconst args = []\n\n/* c8 ignore start */\nconst computeParams = () => {\n if (params === undefined) {\n if (isNode) {\n params = map.create()\n const pargs = process.argv\n let currParamName = null\n for (let i = 0; i < pargs.length; i++) {\n const parg = pargs[i]\n if (parg[0] === '-') {\n if (currParamName !== null) {\n params.set(currParamName, '')\n }\n currParamName = parg\n } else {\n if (currParamName !== null) {\n params.set(currParamName, parg)\n currParamName = null\n } else {\n args.push(parg)\n }\n }\n }\n if (currParamName !== null) {\n params.set(currParamName, '')\n }\n // in ReactNative for example this would not be true (unless connected to the Remote Debugger)\n } else if (typeof location === 'object') {\n params = map.create(); // eslint-disable-next-line no-undef\n (location.search || '?').slice(1).split('&').forEach((kv) => {\n if (kv.length !== 0) {\n const [key, value] = kv.split('=')\n params.set(`--${string.fromCamelCase(key, '-')}`, value)\n params.set(`-${string.fromCamelCase(key, '-')}`, value)\n }\n })\n } else {\n params = map.create()\n }\n }\n return params\n}\n/* c8 ignore stop */\n\n/**\n * @param {string} name\n * @return {boolean}\n */\n/* c8 ignore next */\nexport const hasParam = (name) => computeParams().has(name)\n\n/**\n * @param {string} name\n * @param {string} defaultVal\n * @return {string}\n */\n/* c8 ignore next 2 */\nexport const getParam = (name, defaultVal) =>\n computeParams().get(name) || defaultVal\n\n/**\n * @param {string} name\n * @return {string|null}\n */\n/* c8 ignore next 4 */\nexport const getVariable = (name) =>\n isNode\n ? conditions.undefinedToNull(process.env[name.toUpperCase().replaceAll('-', '_')])\n : conditions.undefinedToNull(storage.varStorage.getItem(name))\n\n/**\n * @param {string} name\n * @return {string|null}\n */\n/* c8 ignore next 2 */\nexport const getConf = (name) =>\n computeParams().get('--' + name) || getVariable(name)\n\n/**\n * @param {string} name\n * @return {string}\n */\n/* c8 ignore next 5 */\nexport const ensureConf = (name) => {\n const c = getConf(name)\n if (c == null) throw new Error(`Expected configuration \"${name.toUpperCase().replaceAll('-', '_')}\"`)\n return c\n}\n\n/**\n * @param {string} name\n * @return {boolean}\n */\n/* c8 ignore next 2 */\nexport const hasConf = (name) =>\n hasParam('--' + name) || getVariable(name) !== null\n\n/* c8 ignore next */\nexport const production = hasConf('production')\n\n/* c8 ignore next 2 */\nconst forceColor = isNode &&\n f.isOneOf(process.env.FORCE_COLOR, ['true', '1', '2'])\n\n/* c8 ignore start */\n/**\n * Color is enabled by default if the terminal supports it.\n *\n * Explicitly enable color using `--color` parameter\n * Disable color using `--no-color` parameter or using `NO_COLOR=1` environment variable.\n * `FORCE_COLOR=1` enables color and takes precedence over all.\n */\nexport const supportsColor = forceColor || (\n !hasParam('--no-colors') && // @todo deprecate --no-colors\n !hasConf('no-color') &&\n (!isNode || process.stdout.isTTY) && (\n !isNode ||\n hasParam('--color') ||\n getVariable('COLORTERM') !== null ||\n (getVariable('TERM') || '').includes('color')\n )\n)\n/* c8 ignore stop */\n","/**\n * Working with value pairs.\n *\n * @module pair\n */\n\n/**\n * @template L,R\n */\nexport class Pair {\n /**\n * @param {L} left\n * @param {R} right\n */\n constructor (left, right) {\n this.left = left\n this.right = right\n }\n}\n\n/**\n * @template L,R\n * @param {L} left\n * @param {R} right\n * @return {Pair<L,R>}\n */\nexport const create = (left, right) => new Pair(left, right)\n\n/**\n * @template L,R\n * @param {R} right\n * @param {L} left\n * @return {Pair<L,R>}\n */\nexport const createReversed = (right, left) => new Pair(left, right)\n\n/**\n * @template L,R\n * @param {Array<Pair<L,R>>} arr\n * @param {function(L, R):any} f\n */\nexport const forEach = (arr, f) => arr.forEach(p => f(p.left, p.right))\n\n/**\n * @template L,R,X\n * @param {Array<Pair<L,R>>} arr\n * @param {function(L, R):X} f\n * @return {Array<X>}\n */\nexport const map = (arr, f) => arr.map(p => f(p.left, p.right))\n","/* eslint-env browser */\n\n/**\n * Utility module to work with the DOM.\n *\n * @module dom\n */\n\nimport * as pair from './pair.js'\nimport * as map from './map.js'\n\n/* c8 ignore start */\n/**\n * @type {Document}\n */\nexport const doc = /** @type {Document} */ (typeof document !== 'undefined' ? document : {})\n\n/**\n * @param {string} name\n * @return {HTMLElement}\n */\nexport const createElement = name => doc.createElement(name)\n\n/**\n * @return {DocumentFragment}\n */\nexport const createDocumentFragment = () => doc.createDocumentFragment()\n\n/**\n * @param {string} text\n * @return {Text}\n */\nexport const createTextNode = text => doc.createTextNode(text)\n\nexport const domParser = /** @type {DOMParser} */ (typeof DOMParser !== 'undefined' ? new DOMParser() : null)\n\n/**\n * @param {HTMLElement} el\n * @param {string} name\n * @param {Object} opts\n */\nexport const emitCustomEvent = (el, name, opts) => el.dispatchEvent(new CustomEvent(name, opts))\n\n/**\n * @param {Element} el\n * @param {Array<pair.Pair<string,string|boolean>>} attrs Array of key-value pairs\n * @return {Element}\n */\nexport const setAttributes = (el, attrs) => {\n pair.forEach(attrs, (key, value) => {\n if (value === false) {\n el.removeAttribute(key)\n } else if (value === true) {\n el.setAttribute(key, '')\n } else {\n // @ts-ignore\n el.setAttribute(key, value)\n }\n })\n return el\n}\n\n/**\n * @param {Element} el\n * @param {Map<string, string>} attrs Array of key-value pairs\n * @return {Element}\n */\nexport const setAttributesMap = (el, attrs) => {\n attrs.forEach((value, key) => { el.setAttribute(key, value) })\n return el\n}\n\n/**\n * @param {Array<Node>|HTMLCollection} children\n * @return {DocumentFragment}\n */\nexport const fragment = children => {\n const fragment = createDocumentFragment()\n for (let i = 0; i < children.length; i++) {\n appendChild(fragment, children[i])\n }\n return fragment\n}\n\n/**\n * @param {Element} parent\n * @param {Array<Node>} nodes\n * @return {Element}\n */\nexport const append = (parent, nodes) => {\n appendChild(parent, fragment(nodes))\n return parent\n}\n\n/**\n * @param {HTMLElement} el\n */\nexport const remove = el => el.remove()\n\n/**\n * @param {EventTarget} el\n * @param {string} name\n * @param {EventListener} f\n */\nexport const addEventListener = (el, name, f) => el.addEventListener(name, f)\n\n/**\n * @param {EventTarget} el\n * @param {string} name\n * @param {EventListener} f\n */\nexport const removeEventListener = (el, name, f) => el.removeEventListener(name, f)\n\n/**\n * @param {Node} node\n * @param {Array<pair.Pair<string,EventListener>>} listeners\n * @return {Node}\n */\nexport const addEventListeners = (node, listeners) => {\n pair.forEach(listeners, (name, f) => addEventListener(node, name, f))\n return node\n}\n\n/**\n * @param {Node} node\n * @param {Array<pair.Pair<string,EventListener>>} listeners\n * @return {Node}\n */\nexport const removeEventListeners = (node, listeners) => {\n pair.forEach(listeners, (name, f) => removeEventListener(node, name, f))\n return node\n}\n\n/**\n * @param {string} name\n * @param {Array<pair.Pair<string,string>|pair.Pair<string,boolean>>} attrs Array of key-value pairs\n * @param {Array<Node>} children\n * @return {Element}\n */\nexport const element = (name, attrs = [], children = []) =>\n append(setAttributes(createElement(name), attrs), children)\n\n/**\n * @param {number} width\n * @param {number} height\n */\nexport const canvas = (width, height) => {\n const c = /** @type {HTMLCanvasElement} */ (createElement('canvas'))\n c.height = height\n c.width = width\n return c\n}\n\n/**\n * @param {string} t\n * @return {Text}\n */\nexport const text = createTextNode\n\n/**\n * @param {pair.Pair<string,string>} pair\n */\nexport const pairToStyleString = pair => `${pair.left}:${pair.right};`\n\n/**\n * @param {Array<pair.Pair<string,string>>} pairs\n * @return {string}\n */\nexport const pairsToStyleString = pairs => pairs.map(pairToStyleString).join('')\n\n/**\n * @param {Map<string,string>} m\n * @return {string}\n */\nexport const mapToStyleString = m => map.map(m, (value, key) => `${key}:${value};`).join('')\n\n/**\n * @todo should always query on a dom element\n *\n * @param {HTMLElement|ShadowRoot} el\n * @param {string} query\n * @return {HTMLElement | null}\n */\nexport const querySelector = (el, query) => el.querySelector(query)\n\n/**\n * @param {HTMLElement|ShadowRoot} el\n * @param {string} query\n * @return {NodeListOf<HTMLElement>}\n */\nexport const querySelectorAll = (el, query) => el.querySelectorAll(query)\n\n/**\n * @param {string} id\n * @return {HTMLElement}\n */\nexport const getElementById = id => /** @type {HTMLElement} */ (doc.getElementById(id))\n\n/**\n * @param {string} html\n * @return {HTMLElement}\n */\nconst _parse = html => domParser.parseFromString(`<html><body>${html}</body></html>`, 'text/html').body\n\n/**\n * @param {string} html\n * @return {DocumentFragment}\n */\nexport const parseFragment = html => fragment(/** @type {any} */ (_parse(html).childNodes))\n\n/**\n * @param {string} html\n * @return {HTMLElement}\n */\nexport const parseElement = html => /** @type HTMLElement */ (_parse(html).firstElementChild)\n\n/**\n * @param {HTMLElement} oldEl\n * @param {HTMLElement|DocumentFragment} newEl\n */\nexport const replaceWith = (oldEl, newEl) => oldEl.replaceWith(newEl)\n\n/**\n * @param {HTMLElement} parent\n * @param {HTMLElement} el\n * @param {Node|null} ref\n * @return {HTMLElement}\n */\nexport const insertBefore = (parent, el, ref) => parent.insertBefore(el, ref)\n\n/**\n * @param {Node} parent\n * @param {Node} child\n * @return {Node}\n */\nexport const appendChild = (parent, child) => parent.appendChild(child)\n\nexport const ELEMENT_NODE = doc.ELEMENT_NODE\nexport const TEXT_NODE = doc.TEXT_NODE\nexport const CDATA_SECTION_NODE = doc.CDATA_SECTION_NODE\nexport const COMMENT_NODE = doc.COMMENT_NODE\nexport const DOCUMENT_NODE = doc.DOCUMENT_NODE\nexport const DOCUMENT_TYPE_NODE = doc.DOCUMENT_TYPE_NODE\nexport const DOCUMENT_FRAGMENT_NODE = doc.DOCUMENT_FRAGMENT_NODE\n\n/**\n * @param {any} node\n * @param {number} type\n */\nexport const checkNodeType = (node, type) => node.nodeType === type\n\n/**\n * @param {Node} parent\n * @param {HTMLElement} child\n */\nexport const isParentOf = (parent, child) => {\n let p = child.parentNode\n while (p && p !== parent) {\n p = p.parentNode\n }\n return p === parent\n}\n/* c8 ignore stop */\n","/**\n * Utility module to work with EcmaScript Symbols.\n *\n * @module symbol\n */\n\n/**\n * Return fresh symbol.\n *\n * @return {Symbol}\n */\nexport const create = Symbol\n\n/**\n * @param {any} s\n * @return {boolean}\n */\nexport const isSymbol = s => typeof s === 'symbol'\n","import * as symbol from './symbol.js'\nimport * as time from './time.js'\nimport * as env from './environment.js'\nimport * as func from './function.js'\nimport * as json from './json.js'\n\nexport const BOLD = symbol.create()\nexport const UNBOLD = symbol.create()\nexport const BLUE = symbol.create()\nexport const GREY = symbol.create()\nexport const GREEN = symbol.create()\nexport const RED = symbol.create()\nexport const PURPLE = symbol.create()\nexport const ORANGE = symbol.create()\nexport const UNCOLOR = symbol.create()\n\n/* c8 ignore start */\n/**\n * @param {Array<undefined|string|Symbol|Object|number|function():any>} args\n * @return {Array<string|object|number|undefined>}\n */\nexport const computeNoColorLoggingArgs = args => {\n if (args.length === 1 && args[0]?.constructor === Function) {\n args = /** @type {Array<string|Symbol|Object|number>} */ (/** @type {[function]} */ (args)[0]())\n }\n const strBuilder = []\n const logArgs = []\n // try with formatting until we find something unsupported\n let i = 0\n for (; i < args.length; i++) {\n const arg = args[i]\n if (arg === undefined) {\n break\n } else if (arg.constructor === String || arg.constructor === Number) {\n strBuilder.push(arg)\n } else if (arg.constructor === Object) {\n break\n }\n }\n if (i > 0) {\n // create logArgs with what we have so far\n logArgs.push(strBuilder.join(''))\n }\n // append the rest\n for (; i < args.length; i++) {\n const arg = args[i]\n if (!(arg instanceof Symbol)) {\n logArgs.push(arg)\n }\n }\n return logArgs\n}\n/* c8 ignore stop */\n\nconst loggingColors = [GREEN, PURPLE, ORANGE, BLUE]\nlet nextColor = 0\nlet lastLoggingTime = time.getUnixTime()\n\n/* c8 ignore start */\n/**\n * @param {function(...any):void} _print\n * @param {string} moduleName\n * @return {function(...any):void}\n */\nexport const createModuleLogger = (_print, moduleName) => {\n const color = loggingColors[nextColor]\n const debugRegexVar = env.getVariable('log')\n const doLogging = debugRegexVar !== null &&\n (debugRegexVar === '*' || debugRegexVar === 'true' ||\n new RegExp(debugRegexVar, 'gi').test(moduleName))\n nextColor = (nextColor + 1) % loggingColors.length\n moduleName += ': '\n return !doLogging\n ? func.nop\n : (...args) => {\n if (args.length === 1 && args[0]?.constructor === Function) {\n args = args[0]()\n }\n const timeNow = time.getUnixTime()\n const timeDiff = timeNow - lastLoggingTime\n lastLoggingTime = timeNow\n _print(\n color,\n moduleName,\n UNCOLOR,\n ...args.map((arg) => {\n if (arg != null && arg.constructor === Uint8Array) {\n arg = Array.from(arg)\n }\n const t = typeof arg\n switch (t) {\n case 'string':\n case 'symbol':\n return arg\n default: {\n return json.stringify(arg)\n }\n }\n }),\n color,\n ' +' + timeDiff + 'ms'\n )\n }\n}\n/* c8 ignore stop */\n","/**\n * Isomorphic logging module with support for colors!\n *\n * @module logging\n */\n\nimport * as env from './environment.js'\nimport * as set from './set.js'\nimport * as pair from './pair.js'\nimport * as dom from './dom.js'\nimport * as json from './json.js'\nimport * as map from './map.js'\nimport * as eventloop from './eventloop.js'\nimport * as math from './math.js'\nimport * as common from './logging.common.js'\n\nexport { BOLD, UNBOLD, BLUE, GREY, GREEN, RED, PURPLE, ORANGE, UNCOLOR } from './logging.common.js'\n\n/**\n * @type {Object<Symbol,pair.Pair<string,string>>}\n */\nconst _browserStyleMap = {\n [common.BOLD]: pair.create('font-weight', 'bold'),\n [common.UNBOLD]: pair.create('font-weight', 'normal'),\n [common.BLUE]: pair.create('color', 'blue'),\n [common.GREEN]: pair.create('color', 'green'),\n [common.GREY]: pair.create('color', 'grey'),\n [common.RED]: pair.create('color', 'red'),\n [common.PURPLE]: pair.create('color', 'purple'),\n [common.ORANGE]: pair.create('color', 'orange'), // not well supported in chrome when debugging node with inspector - TODO: deprecate\n [common.UNCOLOR]: pair.create('color', 'black')\n}\n\n/**\n * @param {Array<string|Symbol|Object|number|function():any>} args\n * @return {Array<string|object|number>}\n */\n/* c8 ignore start */\nconst computeBrowserLoggingArgs = (args) => {\n if (args.length === 1 && args[0]?.constructor === Function) {\n args = /** @type {Array<string|Symbol|Object|number>} */ (/** @type {[function]} */ (args)[0]())\n }\n const strBuilder = []\n const styles = []\n const currentStyle = map.create()\n /**\n * @type {Array<string|Object|number>}\n */\n let logArgs = []\n // try with formatting until we find something unsupported\n let i = 0\n for (; i < args.length; i++) {\n const arg = args[i]\n // @ts-ignore\n const style = _browserStyleMap[arg]\n if (style !== undefined) {\n currentStyle.set(style.left, style.right)\n } else {\n if (arg === undefined) {\n break\n }\n if (arg.constructor === String || arg.constructor === Number) {\n const style = dom.mapToStyleString(currentStyle)\n if (i > 0 || style.length > 0) {\n strBuilder.push('%c' + arg)\n styles.push(style)\n } else {\n strBuilder.push(arg)\n }\n } else {\n break\n }\n }\n }\n if (i > 0) {\n // create logArgs with what we have so far\n logArgs = styles\n logArgs.unshift(strBuilder.join(''))\n }\n // append the rest\n for (; i < args.length; i++) {\n const arg = args[i]\n if (!(arg instanceof Symbol)) {\n logArgs.push(arg)\n }\n }\n return logArgs\n}\n/* c8 ignore stop */\n\n/* c8 ignore start */\nconst computeLoggingArgs = env.supportsColor\n ? computeBrowserLoggingArgs\n : common.computeNoColorLoggingArgs\n/* c8 ignore stop */\n\n/**\n * @param {Array<string|Symbol|Object|number>} args\n */\nexport const print = (...args) => {\n console.log(...computeLoggingArgs(args))\n /* c8 ignore next */\n vconsoles.forEach((vc) => vc.print(args))\n}\n\n/* c8 ignore start */\n/**\n * @param {Array<string|Symbol|Object|number>} args\n */\nexport const warn = (...args) => {\n console.warn(...computeLoggingArgs(args))\n args.unshift(common.ORANGE)\n vconsoles.forEach((vc) => vc.print(args))\n}\n/* c8 ignore stop */\n\n/**\n * @param {Error} err\n */\n/* c8 ignore start */\nexport const printError = (err) => {\n console.error(err)\n vconsoles.forEach((vc) => vc.printError(err))\n}\n/* c8 ignore stop */\n\n/**\n * @param {string} url image location\n * @param {number} height height of the image in pixel\n */\n/* c8 ignore start */\nexport const printImg = (url, height) => {\n if (env.isBrowser) {\n console.log(\n '%c ',\n `font-size: ${height}px; background-size: contain; background-repeat: no-repeat; background-image: url(${url})`\n )\n // console.log('%c ', `font-size: ${height}x; background: url(${url}) no-repeat;`)\n }\n vconsoles.forEach((vc) => vc.printImg(url, height))\n}\n/* c8 ignore stop */\n\n/**\n * @param {string} base64\n * @param {number} height\n */\n/* c8 ignore next 2 */\nexport const printImgBase64 = (base64, height) =>\n printImg(`data:image/gif;base64,${base64}`, height)\n\n/**\n * @param {Array<string|Symbol|Object|number>} args\n */\nexport const group = (...args) => {\n console.group(...computeLoggingArgs(args))\n /* c8 ignore next */\n vconsoles.forEach((vc) => vc.group(args))\n}\n\n/**\n * @param {Array<string|Symbol|Object|number>} args\n */\nexport const groupCollapsed = (...args) => {\n console.groupCollapsed(...computeLoggingArgs(args))\n /* c8 ignore next */\n vconsoles.forEach((vc) => vc.groupCollapsed(args))\n}\n\nexport const groupEnd = () => {\n console.groupEnd()\n /* c8 ignore next */\n vconsoles.forEach((vc) => vc.groupEnd())\n}\n\n/**\n * @param {function():Node} createNode\n */\n/* c8 ignore next 2 */\nexport const printDom = (createNode) =>\n vconsoles.forEach((vc) => vc.printDom(createNode()))\n\n/**\n * @param {HTMLCanvasElement} canvas\n * @param {number} height\n */\n/* c8 ignore next 2 */\nexport const printCanvas = (canvas, height) =>\n printImg(canvas.toDataURL(), height)\n\nexport const vconsoles = set.create()\n\n/**\n * @param {Array<string|Symbol|Object|number>} args\n * @return {Array<Element>}\n */\n/* c8 ignore start */\nconst _computeLineSpans = (args) => {\n const spans = []\n const currentStyle = new Map()\n // try with formatting until we find something unsupported\n let i = 0\n for (; i < args.length; i++) {\n let arg = args[i]\n // @ts-ignore\n const style = _browserStyleMap[arg]\n if (style !== undefined) {\n currentStyle.set(style.left, style.right)\n } else {\n if (arg === undefined) {\n arg = 'undefined '\n }\n if (arg.constructor === String || arg.constructor === Number) {\n // @ts-ignore\n const span = dom.element('span', [\n pair.create('style', dom.mapToStyleString(currentStyle))\n ], [dom.text(arg.toString())])\n if (span.innerHTML === '') {\n span.innerHTML = ' '\n }\n spans.push(span)\n } else {\n break\n }\n }\n }\n // append the rest\n for (; i < args.length; i++) {\n let content = args[i]\n if (!(content instanceof Symbol)) {\n if (content.constructor !== String && content.constructor !== Number) {\n content = ' ' + json.stringify(content) + ' '\n }\n spans.push(\n dom.element('span', [], [dom.text(/** @type {string} */ (content))])\n )\n }\n }\n return spans\n}\n/* c8 ignore stop */\n\nconst lineStyle =\n 'font-family:monospace;border-bottom:1px solid #e2e2e2;padding:2px;'\n\n/* c8 ignore start */\nexport class VConsole {\n /**\n * @param {Element} dom\n */\n constructor (dom) {\n this.dom = dom\n /**\n * @type {Element}\n */\n this.ccontainer = this.dom\n this.depth = 0\n vconsoles.add(this)\n }\n\n /**\n * @param {Array<string|Symbol|Object|number>} args\n * @param {boolean} collapsed\n */\n group (args, collapsed = false) {\n eventloop.enqueue(() => {\n const triangleDown = dom.element('span', [\n pair.create('hidden', collapsed),\n pair.create('style', 'color:grey;font-size:120%;')\n ], [dom.text('▼')])\n const triangleRight = dom.element('span', [\n pair.create('hidden', !collapsed),\n pair.create('style', 'color:grey;font-size:125%;')\n ], [dom.text('▶')])\n const content = dom.element(\n 'div',\n [pair.create(\n 'style',\n `${lineStyle};padding-left:${this.depth * 10}px`\n )],\n [triangleDown, triangleRight, dom.text(' ')].concat(\n _computeLineSpans(args)\n )\n )\n const nextContainer = dom.element('div', [\n pair.create('hidden', collapsed)\n ])\n const nextLine = dom.element('div', [], [content, nextContainer])\n dom.append(this.ccontainer, [nextLine])\n this.ccontainer = nextContainer\n this.depth++\n // when header is clicked, collapse/uncollapse container\n dom.addEventListener(content, 'click', (_event) => {\n nextContainer.toggleAttribute('hidden')\n triangleDown.toggleAttribute('hidden')\n triangleRight.toggleAttribute('hidden')\n })\n })\n }\n\n /**\n * @param {Array<string|Symbol|Object|number>} args\n */\n groupCollapsed (args) {\n this.group(args, true)\n }\n\n groupEnd () {\n eventloop.enqueue(() => {\n if (this.depth > 0) {\n this.depth--\n // @ts-ignore\n this.ccontainer = this.ccontainer.parentElement.parentElement\n }\n })\n }\n\n /**\n * @param {Array<string|Symbol|Object|number>} args\n */\n print (args) {\n eventloop.enqueue(() => {\n dom.append(this.ccontainer, [\n dom.element('div', [\n pair.create(\n 'style',\n `${lineStyle};padding-left:${this.depth * 10}px`\n )\n ], _computeLineSpans(args))\n ])\n })\n }\n\n /**\n * @param {Error} err\n */\n printError (err) {\n this.print([common.RED, common.BOLD, err.toString()])\n }\n\n /**\n * @param {string} url\n * @param {number} height\n */\n printImg (url, height) {\n eventloop.enqueue(() => {\n dom.append(this.ccontainer, [\n dom.element('img', [\n pair.create('src', url),\n pair.create('height', `${math.round(height * 1.5)}px`)\n ])\n ])\n })\n }\n\n /**\n * @param {Node} node\n */\n printDom (node) {\n eventloop.enqueue(() => {\n dom.append(this.ccontainer, [node])\n })\n }\n\n destroy () {\n eventloop.enqueue(() => {\n vconsoles.delete(this)\n })\n }\n}\n/* c8 ignore stop */\n\n/**\n * @param {Element} dom\n */\n/* c8 ignore next */\nexport const createVConsole = (dom) => new VConsole(dom)\n\n/**\n * @param {string} moduleName\n * @return {function(...any):void}\n */\nexport const createModuleLogger = (moduleName) => common.createModuleLogger(print, moduleName)\n","/**\n * Utility module to create and manipulate Iterators.\n *\n * @module iterator\n */\n\n/**\n * @template T,R\n * @param {Iterator<T>} iterator\n * @param {function(T):R} f\n * @return {IterableIterator<R>}\n */\nexport const mapIterator = (iterator, f) => ({\n [Symbol.iterator] () {\n return this\n },\n // @ts-ignore\n next () {\n const r = iterator.next()\n return { value: r.done ? undefined : f(r.value), done: r.done }\n }\n})\n\n/**\n * @template T\n * @param {function():IteratorResult<T>} next\n * @return {IterableIterator<T>}\n */\nexport const createIterator = next => ({\n /**\n * @return {IterableIterator<T>}\n */\n [Symbol.iterator] () {\n return this\n },\n // @ts-ignore\n next\n})\n\n/**\n * @template T\n * @param {Iterator<T>} iterator\n * @param {function(T):boolean} filter\n */\nexport const iteratorFilter = (iterator, filter) => createIterator(() => {\n let res\n do {\n res = iterator.next()\n } while (!res.done && !filter(res.value))\n return res\n})\n\n/**\n * @template T,M\n * @param {Iterator<T>} iterator\n * @param {function(T):M} fmap\n */\nexport const iteratorMap = (iterator, fmap) => createIterator(() => {\n const { done, value } = iterator.next()\n return { done, value: done ? undefined : fmap(value) }\n})\n","import { ObservableV2 } from 'lib0/observable';\nimport * as array from 'lib0/array';\nimport * as math from 'lib0/math';\nimport * as map from 'lib0/map';\nimport * as encoding from 'lib0/encoding';\nimport * as decoding from 'lib0/decoding';\nimport * as random from 'lib0/random';\nimport * as promise from 'lib0/promise';\nimport * as buffer from 'lib0/buffer';\nimport * as error from 'lib0/error';\nimport * as binary from 'lib0/binary';\nimport * as f from 'lib0/function';\nimport { callAll } from 'lib0/function';\nimport * as set from 'lib0/set';\nimport * as logging from 'lib0/logging';\nimport * as time from 'lib0/time';\nimport * as string from 'lib0/string';\nimport * as iterator from 'lib0/iterator';\nimport * as object from 'lib0/object';\nimport * as env from 'lib0/environment';\n\n/**\n * This is an abstract interface that all Connectors should implement to keep them interchangeable.\n *\n * @note This interface is experimental and it is not advised to actually inherit this class.\n * It just serves as typing information.\n *\n * @extends {ObservableV2<any>}\n */\nclass AbstractConnector extends ObservableV2 {\n /**\n * @param {Doc} ydoc\n * @param {any} awareness\n */\n constructor (ydoc, awareness) {\n super();\n this.doc = ydoc;\n this.awareness = awareness;\n }\n}\n\nclass DeleteItem {\n /**\n * @param {number} clock\n * @param {number} len\n */\n constructor (clock, len) {\n /**\n * @type {number}\n */\n this.clock = clock;\n /**\n * @type {number}\n */\n this.len = len;\n }\n}\n\n/**\n * We no longer maintain a DeleteStore. DeleteSet is a temporary object that is created when needed.\n * - When created in a transaction, it must only be accessed after sorting, and merging\n * - This DeleteSet is send to other clients\n * - We do not create a DeleteSet when we send a sync message. The DeleteSet message is created directly from StructStore\n * - We read a DeleteSet as part of a sync/update message. In this case the DeleteSet is already sorted and merged.\n */\nclass DeleteSet {\n constructor () {\n /**\n * @type {Map<number,Array<DeleteItem>>}\n */\n this.clients = new Map();\n }\n}\n\n/**\n * Iterate over all structs that the DeleteSet gc's.\n *\n * @param {Transaction} transaction\n * @param {DeleteSet} ds\n * @param {function(GC|Item):void} f\n *\n * @function\n */\nconst iterateDeletedStructs = (transaction, ds, f) =>\n ds.clients.forEach((deletes, clientid) => {\n const structs = /** @type {Array<GC|Item>} */ (transaction.doc.store.clients.get(clientid));\n if (structs != null) {\n const lastStruct = structs[structs.length - 1];\n const clockState = lastStruct.id.clock + lastStruct.length;\n for (let i = 0, del = deletes[i]; i < deletes.length && del.clock < clockState; del = deletes[++i]) {\n iterateStructs(transaction, structs, del.clock, del.len, f);\n }\n }\n });\n\n/**\n * @param {Array<DeleteItem>} dis\n * @param {number} clock\n * @return {number|null}\n *\n * @private\n * @function\n */\nconst findIndexDS = (dis, clock) => {\n let left = 0;\n let right = dis.length - 1;\n while (left <= right) {\n const midindex = math.floor((left + right) / 2);\n const mid = dis[midindex];\n const midclock = mid.clock;\n if (midclock <= clock) {\n if (clock < midclock + mid.len) {\n return midindex\n }\n left = midindex + 1;\n } else {\n right = midindex - 1;\n }\n }\n return null\n};\n\n/**\n * @param {DeleteSet} ds\n * @param {ID} id\n * @return {boolean}\n *\n * @private\n * @function\n */\nconst isDeleted = (ds, id) => {\n const dis = ds.clients.get(id.client);\n return dis !== undefined && findIndexDS(dis, id.clock) !== null\n};\n\n/**\n * @param {DeleteSet} ds\n *\n * @private\n * @function\n */\nconst sortAndMergeDeleteSet = ds => {\n ds.clients.forEach(dels => {\n dels.sort((a, b) => a.clock - b.clock);\n // merge items without filtering or splicing the array\n // i is the current pointer\n // j refers to the current insert position for the pointed item\n // try to merge dels[i] into dels[j-1] or set dels[j]=dels[i]\n let i, j;\n for (i = 1, j = 1; i < dels.length; i++) {\n const left = dels[j - 1];\n const right = dels[i];\n if (left.clock + left.len >= right.clock) {\n left.len = math.max(left.len, right.clock + right.len - left.clock);\n } else {\n if (j < i) {\n dels[j] = right;\n }\n j++;\n }\n }\n dels.length = j;\n });\n};\n\n/**\n * @param {Array<DeleteSet>} dss\n * @return {DeleteSet} A fresh DeleteSet\n */\nconst mergeDeleteSets = dss => {\n const merged = new DeleteSet();\n for (let dssI = 0; dssI < dss.length; dssI++) {\n dss[dssI].clients.forEach((delsLeft, client) => {\n if (!merged.clients.has(client)) {\n // Write all missing keys from current ds and all following.\n // If merged already contains `client` current ds has already been added.\n /**\n * @type {Array<DeleteItem>}\n */\n const dels = delsLeft.slice();\n for (let i = dssI + 1; i < dss.length; i++) {\n array.appendTo(dels, dss[i].clients.get(client) || []);\n }\n merged.clients.set(client, dels);\n }\n });\n }\n sortAndMergeDeleteSet(merged);\n return merged\n};\n\n/**\n * @param {DeleteSet} ds\n * @param {number} client\n * @param {number} clock\n * @param {number} length\n *\n * @private\n * @function\n */\nconst addToDeleteSet = (ds, client, clock, length) => {\n map.setIfUndefined(ds.clients, client, () => /** @type {Array<DeleteItem>} */ ([])).push(new DeleteItem(clock, length));\n};\n\nconst createDeleteSet = () => new DeleteSet();\n\n/**\n * @param {StructStore} ss\n * @return {DeleteSet} Merged and sorted DeleteSet\n *\n * @private\n * @function\n */\nconst createDeleteSetFromStructStore = ss => {\n const ds = createDeleteSet();\n ss.clients.forEach((structs, client) => {\n /**\n * @type {Array<DeleteItem>}\n */\n const dsitems = [];\n for (let i = 0; i < structs.length; i++) {\n const struct = structs[i];\n if (struct.deleted) {\n const clock = struct.id.clock;\n let len = struct.length;\n if (i + 1 < structs.length) {\n for (let next = structs[i + 1]; i + 1 < structs.length && next.deleted; next = structs[++i + 1]) {\n len += next.length;\n }\n }\n dsitems.push(new DeleteItem(clock, len));\n }\n }\n if (dsitems.length > 0) {\n ds.clients.set(client, dsitems);\n }\n });\n return ds\n};\n\n/**\n * @param {DSEncoderV1 | DSEncoderV2} encoder\n * @param {DeleteSet} ds\n *\n * @private\n * @function\n */\nconst writeDeleteSet = (encoder, ds) => {\n encoding.writeVarUint(encoder.restEncoder, ds.clients.size);\n\n // Ensure that the delete set is written in a deterministic order\n array.from(ds.clients.entries())\n .sort((a, b) => b[0] - a[0])\n .forEach(([client, dsitems]) => {\n encoder.resetDsCurVal();\n encoding.writeVarUint(encoder.restEncoder, client);\n const len = dsitems.length;\n encoding.writeVarUint(encoder.restEncoder, len);\n for (let i = 0; i < len; i++) {\n const item = dsitems[i];\n encoder.writeDsClock(item.clock);\n encoder.writeDsLen(item.len);\n }\n });\n};\n\n/**\n * @param {DSDecoderV1 | DSDecoderV2} decoder\n * @return {DeleteSet}\n *\n * @private\n * @function\n */\nconst readDeleteSet = decoder => {\n const ds = new DeleteSet();\n const numClients = decoding.readVarUint(decoder.restDecoder);\n for (let i = 0; i < numClients; i++) {\n decoder.resetDsCurVal();\n const client = decoding.readVarUint(decoder.restDecoder);\n const numberOfDeletes = decoding.readVarUint(decoder.restDecoder);\n if (numberOfDeletes > 0) {\n const dsField = map.setIfUndefined(ds.clients, client, () => /** @type {Array<DeleteItem>} */ ([]));\n for (let i = 0; i < numberOfDeletes; i++) {\n dsField.push(new DeleteItem(decoder.readDsClock(), decoder.readDsLen()));\n }\n }\n }\n return ds\n};\n\n/**\n * @todo YDecoder also contains references to String and other Decoders. Would make sense to exchange YDecoder.toUint8Array for YDecoder.DsToUint8Array()..\n */\n\n/**\n * @param {DSDecoderV1 | DSDecoderV2} decoder\n * @param {Transaction} transaction\n * @param {StructStore} store\n * @return {Uint8Array|null} Returns a v2 update containing all deletes that couldn't be applied yet; or null if all deletes were applied successfully.\n *\n * @private\n * @function\n */\nconst readAndApplyDeleteSet = (decoder, transaction, store) => {\n const unappliedDS = new DeleteSet();\n const numClients = decoding.readVarUint(decoder.restDecoder);\n for (let i = 0; i < numClients; i++) {\n decoder.resetDsCurVal();\n const client = decoding.readVarUint(decoder.restDecoder);\n const numberOfDeletes = decoding.readVarUint(decoder.restDecoder);\n const structs = store.clients.get(client) || [];\n const state = getState(store, client);\n for (let i = 0; i < numberOfDeletes; i++) {\n const clock = decoder.readDsClock();\n const clockEnd = clock + decoder.readDsLen();\n if (clock < state) {\n if (state < clockEnd) {\n addToDeleteSet(unappliedDS, client, state, clockEnd - state);\n }\n let index = findIndexSS(structs, clock);\n /**\n * We can ignore the case of GC and Delete structs, because we are going to skip them\n * @type {Item}\n */\n // @ts-ignore\n let struct = structs[index];\n // split the first item if necessary\n if (!struct.deleted && struct.id.clock < clock) {\n structs.splice(index + 1, 0, splitItem(transaction, struct, clock - struct.id.clock));\n index++; // increase we now want to use the next struct\n }\n while (index < structs.length) {\n // @ts-ignore\n struct = structs[index++];\n if (struct.id.clock < clockEnd) {\n if (!struct.deleted) {\n if (clockEnd < struct.id.clock + struct.length) {\n structs.splice(index, 0, splitItem(transaction, struct, clockEnd - struct.id.clock));\n }\n struct.delete(transaction);\n }\n } else {\n break\n }\n }\n } else {\n addToDeleteSet(unappliedDS, client, clock, clockEnd - clock);\n }\n }\n }\n if (unappliedDS.clients.size > 0) {\n const ds = new UpdateEncoderV2();\n encoding.writeVarUint(ds.restEncoder, 0); // encode 0 structs\n writeDeleteSet(ds, unappliedDS);\n return ds.toUint8Array()\n }\n return null\n};\n\n/**\n * @param {DeleteSet} ds1\n * @param {DeleteSet} ds2\n */\nconst equalDeleteSets = (ds1, ds2) => {\n if (ds1.clients.size !== ds2.clients.size) return false\n for (const [client, deleteItems1] of ds1.clients.entries()) {\n const deleteItems2 = /** @type {Array<import('../internals.js').DeleteItem>} */ (ds2.clients.get(client));\n if (deleteItems2 === undefined || deleteItems1.length !== deleteItems2.length) return false\n for (let i = 0; i < deleteItems1.length; i++) {\n const di1 = deleteItems1[i];\n const di2 = deleteItems2[i];\n if (di1.clock !== di2.clock || di1.len !== di2.len) {\n return false\n }\n }\n }\n return true\n};\n\n/**\n * @module Y\n */\n\n\nconst generateNewClientId = random.uint32;\n\n/**\n * @typedef {Object} DocOpts\n * @property {boolean} [DocOpts.gc=true] Disable garbage collection (default: gc=true)\n * @property {function(Item):boolean} [DocOpts.gcFilter] Will be called before an Item is garbage collected. Return false to keep the Item.\n * @property {string} [DocOpts.guid] Define a globally unique identifier for this document\n * @property {string | null} [DocOpts.collectionid] Associate this document with a collection. This only plays a role if your provider has a concept of collection.\n * @property {any} [DocOpts.meta] Any kind of meta information you want to associate with this document. If this is a subdocument, remote peers will store the meta information as well.\n * @property {boolean} [DocOpts.autoLoad] If a subdocument, automatically load document. If this is a subdocument, remote peers will load the document as well automatically.\n * @property {boolean} [DocOpts.shouldLoad] Whether the document should be synced by the provider now. This is toggled to true when you call ydoc.load()\n */\n\n/**\n * @typedef {Object} DocEvents\n * @property {function(Doc):void} DocEvents.destroy\n * @property {function(Doc):void} DocEvents.load\n * @property {function(boolean, Doc):void} DocEvents.sync\n * @property {function(Uint8Array, any, Doc, Transaction):void} DocEvents.update\n * @property {function(Uint8Array, any, Doc, Transaction):void} DocEvents.updateV2\n * @property {function(Doc):void} DocEvents.beforeAllTransactions\n * @property {function(Transaction, Doc):void} DocEvents.beforeTransaction\n * @property {function(Transaction, Doc):void} DocEvents.beforeObserverCalls\n * @property {function(Transaction, Doc):void} DocEvents.afterTransaction\n * @property {function(Transaction, Doc):void} DocEvents.afterTransactionCleanup\n * @property {function(Doc, Array<Transaction>):void} DocEvents.afterAllTransactions\n * @property {function({ loaded: Set<Doc>, added: Set<Doc>, removed: Set<Doc> }, Doc, Transaction):void} DocEvents.subdocs\n */\n\n/**\n * A Yjs instance handles the state of shared data.\n * @extends ObservableV2<DocEvents>\n */\nclass Doc extends ObservableV2 {\n /**\n * @param {DocOpts} opts configuration\n */\n constructor ({ guid = random.uuidv4(), collectionid = null, gc = true, gcFilter = () => true, meta = null, autoLoad = false, shouldLoad = true } = {}) {\n super();\n this.gc = gc;\n this.gcFilter = gcFilter;\n this.clientID = generateNewClientId();\n this.guid = guid;\n this.collectionid = collectionid;\n /**\n * @type {Map<string, AbstractType<YEvent<any>>>}\n */\n this.share = new Map();\n this.store = new StructStore();\n /**\n * @type {Transaction | null}\n */\n this._transaction = null;\n /**\n * @type {Array<Transaction>}\n */\n this._transactionCleanups = [];\n /**\n * @type {Set<Doc>}\n */\n this.subdocs = new Set();\n /**\n * If this document is a subdocument - a document integrated into another document - then _item is defined.\n * @type {Item?}\n */\n this._item = null;\n this.shouldLoad = shouldLoad;\n this.autoLoad = autoLoad;\n this.meta = meta;\n /**\n * This is set to true when the persistence provider loaded the document from the database or when the `sync` event fires.\n * Note that not all providers implement this feature. Provider authors are encouraged to fire the `load` event when the doc content is loaded from the database.\n *\n * @type {boolean}\n */\n this.isLoaded = false;\n /**\n * This is set to true when the connection provider has successfully synced with a backend.\n * Note that when using peer-to-peer providers this event may not provide very useful.\n * Also note that not all providers implement this feature. Provider authors are encouraged to fire\n * the `sync` event when the doc has been synced (with `true` as a parameter) or if connection is\n * lost (with false as a parameter).\n */\n this.isSynced = false;\n this.isDestroyed = false;\n /**\n * Promise that resolves once the document has been loaded from a persistence provider.\n */\n this.whenLoaded = promise.create(resolve => {\n this.on('load', () => {\n this.isLoaded = true;\n resolve(this);\n });\n });\n const provideSyncedPromise = () => promise.create(resolve => {\n /**\n * @param {boolean} isSynced\n */\n const eventHandler = (isSynced) => {\n if (isSynced === undefined || isSynced === true) {\n this.off('sync', eventHandler);\n resolve();\n }\n };\n this.on('sync', eventHandler);\n });\n this.on('sync', isSynced => {\n if (isSynced === false && this.isSynced) {\n this.whenSynced = provideSyncedPromise();\n }\n this.isSynced = isSynced === undefined || isSynced === true;\n if (this.isSynced && !this.isLoaded) {\n this.emit('load', [this]);\n }\n });\n /**\n * Promise that resolves once the document has been synced with a backend.\n * This promise is recreated when the connection is lost.\n * Note the documentation about the `isSynced` property.\n */\n this.whenSynced = provideSyncedPromise();\n }\n\n /**\n * Notify the parent document that you request to load data into this subdocument (if it is a subdocument).\n *\n * `load()` might be used in the future to request any provider to load the most current data.\n *\n * It is safe to call `load()` multiple times.\n */\n load () {\n const item = this._item;\n if (item !== null && !this.shouldLoad) {\n transact(/** @type {any} */ (item.parent).doc, transaction => {\n transaction.subdocsLoaded.add(this);\n }, null, true);\n }\n this.shouldLoad = true;\n }\n\n getSubdocs () {\n return this.subdocs\n }\n\n getSubdocGuids () {\n return new Set(array.from(this.subdocs).map(doc => doc.guid))\n }\n\n /**\n * Changes that happen inside of a transaction are bundled. This means that\n * the observer fires _after_ the transaction is finished and that all changes\n * that happened inside of the transaction are sent as one message to the\n * other peers.\n *\n * @template T\n * @param {function(Transaction):T} f The function that should be executed as a transaction\n * @param {any} [origin] Origin of who started the transaction. Will be stored on transaction.origin\n * @return T\n *\n * @public\n */\n transact (f, origin = null) {\n return transact(this, f, origin)\n }\n\n /**\n * Define a shared data type.\n *\n * Multiple calls of `ydoc.get(name, TypeConstructor)` yield the same result\n * and do not overwrite each other. I.e.\n * `ydoc.get(name, Y.Array) === ydoc.get(name, Y.Array)`\n *\n * After this method is called, the type is also available on `ydoc.share.get(name)`.\n *\n * *Best Practices:*\n * Define all types right after the Y.Doc instance is created and store them in a separate object.\n * Also use the typed methods `getText(name)`, `getArray(name)`, ..\n *\n * @template {typeof AbstractType<any>} Type\n * @example\n * const ydoc = new Y.Doc(..)\n * const appState = {\n * document: ydoc.getText('document')\n * comments: ydoc.getArray('comments')\n * }\n *\n * @param {string} name\n * @param {Type} TypeConstructor The constructor of the type definition. E.g. Y.Text, Y.Array, Y.Map, ...\n * @return {InstanceType<Type>} The created type. Constructed with TypeConstructor\n *\n * @public\n */\n get (name, TypeConstructor = /** @type {any} */ (AbstractType)) {\n const type = map.setIfUndefined(this.share, name, () => {\n // @ts-ignore\n const t = new TypeConstructor();\n t._integrate(this, null);\n return t\n });\n const Constr = type.constructor;\n if (TypeConstructor !== AbstractType && Constr !== TypeConstructor) {\n if (Constr === AbstractType) {\n // @ts-ignore\n const t = new TypeConstructor();\n t._map = type._map;\n type._map.forEach(/** @param {Item?} n */ n => {\n for (; n !== null; n = n.left) {\n // @ts-ignore\n n.parent = t;\n }\n });\n t._start = type._start;\n for (let n = t._start; n !== null; n = n.right) {\n n.parent = t;\n }\n t._length = type._length;\n this.share.set(name, t);\n t._integrate(this, null);\n return /** @type {InstanceType<Type>} */ (t)\n } else {\n throw new Error(`Type with the name ${name} has already been defined with a different constructor`)\n }\n }\n return /** @type {InstanceType<Type>} */ (type)\n }\n\n /**\n * @template T\n * @param {string} [name]\n * @return {YArray<T>}\n *\n * @public\n */\n getArray (name = '') {\n return /** @type {YArray<T>} */ (this.get(name, YArray))\n }\n\n /**\n * @param {string} [name]\n * @return {YText}\n *\n * @public\n */\n getText (name = '') {\n return this.get(name, YText)\n }\n\n /**\n * @template T\n * @param {string} [name]\n * @return {YMap<T>}\n *\n * @public\n */\n getMap (name = '') {\n return /** @type {YMap<T>} */ (this.get(name, YMap))\n }\n\n /**\n * @param {string} [name]\n * @return {YXmlElement}\n *\n * @public\n */\n getXmlElement (name = '') {\n return /** @type {YXmlElement<{[key:string]:string}>} */ (this.get(name, YXmlElement))\n }\n\n /**\n * @param {string} [name]\n * @return {YXmlFragment}\n *\n * @public\n */\n getXmlFragment (name = '') {\n return this.get(name, YXmlFragment)\n }\n\n /**\n * Converts the entire document into a js object, recursively traversing each yjs type\n * Doesn't log types that have not been defined (using ydoc.getType(..)).\n *\n * @deprecated Do not use this method and rather call toJSON directly on the shared types.\n *\n * @return {Object<string, any>}\n */\n toJSON () {\n /**\n * @type {Object<string, any>}\n */\n const doc = {};\n\n this.share.forEach((value, key) => {\n doc[key] = value.toJSON();\n });\n\n return doc\n }\n\n /**\n * Emit `destroy` event and unregister all event handlers.\n */\n destroy () {\n this.isDestroyed = true;\n array.from(this.subdocs).forEach(subdoc => subdoc.destroy());\n const item = this._item;\n if (item !== null) {\n this._item = null;\n const content = /** @type {ContentDoc} */ (item.content);\n content.doc = new Doc({ guid: this.guid, ...content.opts, shouldLoad: false });\n content.doc._item = item;\n transact(/** @type {any} */ (item).parent.doc, transaction => {\n const doc = content.doc;\n if (!item.deleted) {\n transaction.subdocsAdded.add(doc);\n }\n transaction.subdocsRemoved.add(this);\n }, null, true);\n }\n // @ts-ignore\n this.emit('destroyed', [true]); // DEPRECATED!\n this.emit('destroy', [this]);\n super.destroy();\n }\n}\n\nclass DSDecoderV1 {\n /**\n * @param {decoding.Decoder} decoder\n */\n constructor (decoder) {\n this.restDecoder = decoder;\n }\n\n resetDsCurVal () {\n // nop\n }\n\n /**\n * @return {number}\n */\n readDsClock () {\n return decoding.readVarUint(this.restDecoder)\n }\n\n /**\n * @return {number}\n */\n readDsLen () {\n return decoding.readVarUint(this.restDecoder)\n }\n}\n\nclass UpdateDecoderV1 extends DSDecoderV1 {\n /**\n * @return {ID}\n */\n readLeftID () {\n return createID(decoding.readVarUint(this.restDecoder), decoding.readVarUint(this.restDecoder))\n }\n\n /**\n * @return {ID}\n */\n readRightID () {\n return createID(decoding.readVarUint(this.restDecoder), decoding.readVarUint(this.restDecoder))\n }\n\n /**\n * Read the next client id.\n * Use this in favor of readID whenever possible to reduce the number of objects created.\n */\n readClient () {\n return decoding.readVarUint(this.restDecoder)\n }\n\n /**\n * @return {number} info An unsigned 8-bit integer\n */\n readInfo () {\n return decoding.readUint8(this.restDecoder)\n }\n\n /**\n * @return {string}\n */\n readString () {\n return decoding.readVarString(this.restDecoder)\n }\n\n /**\n * @return {boolean} isKey\n */\n readParentInfo () {\n return decoding.readVarUint(this.restDecoder) === 1\n }\n\n /**\n * @return {number} info An unsigned 8-bit integer\n */\n readTypeRef () {\n return decoding.readVarUint(this.restDecoder)\n }\n\n /**\n * Write len of a struct - well suited for Opt RLE encoder.\n *\n * @return {number} len\n */\n readLen () {\n return decoding.readVarUint(this.restDecoder)\n }\n\n /**\n * @return {any}\n */\n readAny () {\n return decoding.readAny(this.restDecoder)\n }\n\n /**\n * @return {Uint8Array}\n */\n readBuf () {\n return buffer.copyUint8Array(decoding.readVarUint8Array(this.restDecoder))\n }\n\n /**\n * Legacy implementation uses JSON parse. We use any-decoding in v2.\n *\n * @return {any}\n */\n readJSON () {\n return JSON.parse(decoding.readVarString(this.restDecoder))\n }\n\n /**\n * @return {string}\n */\n readKey () {\n return decoding.readVarString(this.restDecoder)\n }\n}\n\nclass DSDecoderV2 {\n /**\n * @param {decoding.Decoder} decoder\n */\n constructor (decoder) {\n /**\n * @private\n */\n this.dsCurrVal = 0;\n this.restDecoder = decoder;\n }\n\n resetDsCurVal () {\n this.dsCurrVal = 0;\n }\n\n /**\n * @return {number}\n */\n readDsClock () {\n this.dsCurrVal += decoding.readVarUint(this.restDecoder);\n return this.dsCurrVal\n }\n\n /**\n * @return {number}\n */\n readDsLen () {\n const diff = decoding.readVarUint(this.restDecoder) + 1;\n this.dsCurrVal += diff;\n return diff\n }\n}\n\nclass UpdateDecoderV2 extends DSDecoderV2 {\n /**\n * @param {decoding.Decoder} decoder\n */\n constructor (decoder) {\n super(decoder);\n /**\n * List of cached keys. If the keys[id] does not exist, we read a new key\n * from stringEncoder and push it to keys.\n *\n * @type {Array<string>}\n */\n this.keys = [];\n decoding.readVarUint(decoder); // read feature flag - currently unused\n this.keyClockDecoder = new decoding.IntDiffOptRleDecoder(decoding.readVarUint8Array(decoder));\n this.clientDecoder = new decoding.UintOptRleDecoder(decoding.readVarUint8Array(decoder));\n this.leftClockDecoder = new decoding.IntDiffOptRleDecoder(decoding.readVarUint8Array(decoder));\n this.rightClockDecoder = new decoding.IntDiffOptRleDecoder(decoding.readVarUint8Array(decoder));\n this.infoDecoder = new decoding.RleDecoder(decoding.readVarUint8Array(decoder), decoding.readUint8);\n this.stringDecoder = new decoding.StringDecoder(decoding.readVarUint8Array(decoder));\n this.parentInfoDecoder = new decoding.RleDecoder(decoding.readVarUint8Array(decoder), decoding.readUint8);\n this.typeRefDecoder = new decoding.UintOptRleDecoder(decoding.readVarUint8Array(decoder));\n this.lenDecoder = new decoding.UintOptRleDecoder(decoding.readVarUint8Array(decoder));\n }\n\n /**\n * @return {ID}\n */\n readLeftID () {\n return new ID(this.clientDecoder.read(), this.leftClockDecoder.read())\n }\n\n /**\n * @return {ID}\n */\n readRightID () {\n return new ID(this.clientDecoder.read(), this.rightClockDecoder.read())\n }\n\n /**\n * Read the next client id.\n * Use this in favor of readID whenever possible to reduce the number of objects created.\n */\n readClient () {\n return this.clientDecoder.read()\n }\n\n /**\n * @return {number} info An unsigned 8-bit integer\n */\n readInfo () {\n return /** @type {number} */ (this.infoDecoder.read())\n }\n\n /**\n * @return {string}\n */\n readString () {\n return this.stringDecoder.read()\n }\n\n /**\n * @return {boolean}\n */\n readParentInfo () {\n return this.parentInfoDecoder.read() === 1\n }\n\n /**\n * @return {number} An unsigned 8-bit integer\n */\n readTypeRef () {\n return this.typeRefDecoder.read()\n }\n\n /**\n * Write len of a struct - well suited for Opt RLE encoder.\n *\n * @return {number}\n */\n readLen () {\n return this.lenDecoder.read()\n }\n\n /**\n * @return {any}\n */\n readAny () {\n return decoding.readAny(this.restDecoder)\n }\n\n /**\n * @return {Uint8Array}\n */\n readBuf () {\n return decoding.readVarUint8Array(this.restDecoder)\n }\n\n /**\n * This is mainly here for legacy purposes.\n *\n * Initial we incoded objects using JSON. Now we use the much faster lib0/any-encoder. This method mainly exists for legacy purposes for the v1 encoder.\n *\n * @return {any}\n */\n readJSON () {\n return decoding.readAny(this.restDecoder)\n }\n\n /**\n * @return {string}\n */\n readKey () {\n const keyClock = this.keyClockDecoder.read();\n if (keyClock < this.keys.length) {\n return this.keys[keyClock]\n } else {\n const key = this.stringDecoder.read();\n this.keys.push(key);\n return key\n }\n }\n}\n\nclass DSEncoderV1 {\n constructor () {\n this.restEncoder = encoding.createEncoder();\n }\n\n toUint8Array () {\n return encoding.toUint8Array(this.restEncoder)\n }\n\n resetDsCurVal () {\n // nop\n }\n\n /**\n * @param {number} clock\n */\n writeDsClock (clock) {\n encoding.writeVarUint(this.restEncoder, clock);\n }\n\n /**\n * @param {number} len\n */\n writeDsLen (len) {\n encoding.writeVarUint(this.restEncoder, len);\n }\n}\n\nclass UpdateEncoderV1 extends DSEncoderV1 {\n /**\n * @param {ID} id\n */\n writeLeftID (id) {\n encoding.writeVarUint(this.restEncoder, id.client);\n encoding.writeVarUint(this.restEncoder, id.clock);\n }\n\n /**\n * @param {ID} id\n */\n writeRightID (id) {\n encoding.writeVarUint(this.restEncoder, id.client);\n encoding.writeVarUint(this.restEncoder, id.clock);\n }\n\n /**\n * Use writeClient and writeClock instead of writeID if possible.\n * @param {number} client\n */\n writeClient (client) {\n encoding.writeVarUint(this.restEncoder, client);\n }\n\n /**\n * @param {number} info An unsigned 8-bit integer\n */\n writeInfo (info) {\n encoding.writeUint8(this.restEncoder, info);\n }\n\n /**\n * @param {string} s\n */\n writeString (s) {\n encoding.writeVarString(this.restEncoder, s);\n }\n\n /**\n * @param {boolean} isYKey\n */\n writeParentInfo (isYKey) {\n encoding.writeVarUint(this.restEncoder, isYKey ? 1 : 0);\n }\n\n /**\n * @param {number} info An unsigned 8-bit integer\n */\n writeTypeRef (info) {\n encoding.writeVarUint(this.restEncoder, info);\n }\n\n /**\n * Write len of a struct - well suited for Opt RLE encoder.\n *\n * @param {number} len\n */\n writeLen (len) {\n encoding.writeVarUint(this.restEncoder, len);\n }\n\n /**\n * @param {any} any\n */\n writeAny (any) {\n encoding.writeAny(this.restEncoder, any);\n }\n\n /**\n * @param {Uint8Array} buf\n */\n writeBuf (buf) {\n encoding.writeVarUint8Array(this.restEncoder, buf);\n }\n\n /**\n * @param {any} embed\n */\n writeJSON (embed) {\n encoding.writeVarString(this.restEncoder, JSON.stringify(embed));\n }\n\n /**\n * @param {string} key\n */\n writeKey (key) {\n encoding.writeVarString(this.restEncoder, key);\n }\n}\n\nclass DSEncoderV2 {\n constructor () {\n this.restEncoder = encoding.createEncoder(); // encodes all the rest / non-optimized\n this.dsCurrVal = 0;\n }\n\n toUint8Array () {\n return encoding.toUint8Array(this.restEncoder)\n }\n\n resetDsCurVal () {\n this.dsCurrVal = 0;\n }\n\n /**\n * @param {number} clock\n */\n writeDsClock (clock) {\n const diff = clock - this.dsCurrVal;\n this.dsCurrVal = clock;\n encoding.writeVarUint(this.restEncoder, diff);\n }\n\n /**\n * @param {number} len\n */\n writeDsLen (len) {\n if (len === 0) {\n error.unexpectedCase();\n }\n encoding.writeVarUint(this.restEncoder, len - 1);\n this.dsCurrVal += len;\n }\n}\n\nclass UpdateEncoderV2 extends DSEncoderV2 {\n constructor () {\n super();\n /**\n * @type {Map<string,number>}\n */\n this.keyMap = new Map();\n /**\n * Refers to the next unique key-identifier to me used.\n * See writeKey method for more information.\n *\n * @type {number}\n */\n this.keyClock = 0;\n this.keyClockEncoder = new encoding.IntDiffOptRleEncoder();\n this.clientEncoder = new encoding.UintOptRleEncoder();\n this.leftClockEncoder = new encoding.IntDiffOptRleEncoder();\n this.rightClockEncoder = new encoding.IntDiffOptRleEncoder();\n this.infoEncoder = new encoding.RleEncoder(encoding.writeUint8);\n this.stringEncoder = new encoding.StringEncoder();\n this.parentInfoEncoder = new encoding.RleEncoder(encoding.writeUint8);\n this.typeRefEncoder = new encoding.UintOptRleEncoder();\n this.lenEncoder = new encoding.UintOptRleEncoder();\n }\n\n toUint8Array () {\n const encoder = encoding.createEncoder();\n encoding.writeVarUint(encoder, 0); // this is a feature flag that we might use in the future\n encoding.writeVarUint8Array(encoder, this.keyClockEncoder.toUint8Array());\n encoding.writeVarUint8Array(encoder, this.clientEncoder.toUint8Array());\n encoding.writeVarUint8Array(encoder, this.leftClockEncoder.toUint8Array());\n encoding.writeVarUint8Array(encoder, this.rightClockEncoder.toUint8Array());\n encoding.writeVarUint8Array(encoder, encoding.toUint8Array(this.infoEncoder));\n encoding.writeVarUint8Array(encoder, this.stringEncoder.toUint8Array());\n encoding.writeVarUint8Array(encoder, encoding.toUint8Array(this.parentInfoEncoder));\n encoding.writeVarUint8Array(encoder, this.typeRefEncoder.toUint8Array());\n encoding.writeVarUint8Array(encoder, this.lenEncoder.toUint8Array());\n // @note The rest encoder is appended! (note the missing var)\n encoding.writeUint8Array(encoder, encoding.toUint8Array(this.restEncoder));\n return encoding.toUint8Array(encoder)\n }\n\n /**\n * @param {ID} id\n */\n writeLeftID (id) {\n this.clientEncoder.write(id.client);\n this.leftClockEncoder.write(id.clock);\n }\n\n /**\n * @param {ID} id\n */\n writeRightID (id) {\n this.clientEncoder.write(id.client);\n this.rightClockEncoder.write(id.clock);\n }\n\n /**\n * @param {number} client\n */\n writeClient (client) {\n this.clientEncoder.write(client);\n }\n\n /**\n * @param {number} info An unsigned 8-bit integer\n */\n writeInfo (info) {\n this.infoEncoder.write(info);\n }\n\n /**\n * @param {string} s\n */\n writeString (s) {\n this.stringEncoder.write(s);\n }\n\n /**\n * @param {boolean} isYKey\n */\n writeParentInfo (isYKey) {\n this.parentInfoEncoder.write(isYKey ? 1 : 0);\n }\n\n /**\n * @param {number} info An unsigned 8-bit integer\n */\n writeTypeRef (info) {\n this.typeRefEncoder.write(info);\n }\n\n /**\n * Write len of a struct - well suited for Opt RLE encoder.\n *\n * @param {number} len\n */\n writeLen (len) {\n this.lenEncoder.write(len);\n }\n\n /**\n * @param {any} any\n */\n writeAny (any) {\n encoding.writeAny(this.restEncoder, any);\n }\n\n /**\n * @param {Uint8Array} buf\n */\n writeBuf (buf) {\n encoding.writeVarUint8Array(this.restEncoder, buf);\n }\n\n /**\n * This is mainly here for legacy purposes.\n *\n * Initial we incoded objects using JSON. Now we use the much faster lib0/any-encoder. This method mainly exists for legacy purposes for the v1 encoder.\n *\n * @param {any} embed\n */\n writeJSON (embed) {\n encoding.writeAny(this.restEncoder, embed);\n }\n\n /**\n * Property keys are often reused. For example, in y-prosemirror the key `bold` might\n * occur very often. For a 3d application, the key `position` might occur very often.\n *\n * We cache these keys in a Map and refer to them via a unique number.\n *\n * @param {string} key\n */\n writeKey (key) {\n const clock = this.keyMap.get(key);\n if (clock === undefined) {\n /**\n * @todo uncomment to introduce this feature finally\n *\n * Background. The ContentFormat object was always encoded using writeKey, but the decoder used to use readString.\n * Furthermore, I forgot to set the keyclock. So everything was working fine.\n *\n * However, this feature here is basically useless as it is not being used (it actually only consumes extra memory).\n *\n * I don't know yet how to reintroduce this feature..\n *\n * Older clients won't be able to read updates when we reintroduce this feature. So this should probably be done using a flag.\n *\n */\n // this.keyMap.set(key, this.keyClock)\n this.keyClockEncoder.write(this.keyClock++);\n this.stringEncoder.write(key);\n } else {\n this.keyClockEncoder.write(clock);\n }\n }\n}\n\n/**\n * @module encoding\n */\n/*\n * We use the first five bits in the info flag for determining the type of the struct.\n *\n * 0: GC\n * 1: Item with Deleted content\n * 2: Item with JSON content\n * 3: Item with Binary content\n * 4: Item with String content\n * 5: Item with Embed content (for richtext content)\n * 6: Item with Format content (a formatting marker for richtext content)\n * 7: Item with Type\n */\n\n\n/**\n * @param {UpdateEncoderV1 | UpdateEncoderV2} encoder\n * @param {Array<GC|Item>} structs All structs by `client`\n * @param {number} client\n * @param {number} clock write structs starting with `ID(client,clock)`\n *\n * @function\n */\nconst writeStructs = (encoder, structs, client, clock) => {\n // write first id\n clock = math.max(clock, structs[0].id.clock); // make sure the first id exists\n const startNewStructs = findIndexSS(structs, clock);\n // write # encoded structs\n encoding.writeVarUint(encoder.restEncoder, structs.length - startNewStructs);\n encoder.writeClient(client);\n encoding.writeVarUint(encoder.restEncoder, clock);\n const firstStruct = structs[startNewStructs];\n // write first struct with an offset\n firstStruct.write(encoder, clock - firstStruct.id.clock);\n for (let i = startNewStructs + 1; i < structs.length; i++) {\n structs[i].write(encoder, 0);\n }\n};\n\n/**\n * @param {UpdateEncoderV1 | UpdateEncoderV2} encoder\n * @param {StructStore} store\n * @param {Map<number,number>} _sm\n *\n * @private\n * @function\n */\nconst writeClientsStructs = (encoder, store, _sm) => {\n // we filter all valid _sm entries into sm\n const sm = new Map();\n _sm.forEach((clock, client) => {\n // only write if new structs are available\n if (getState(store, client) > clock) {\n sm.set(client, clock);\n }\n });\n getStateVector(store).forEach((_clock, client) => {\n if (!_sm.has(client)) {\n sm.set(client, 0);\n }\n });\n // write # states that were updated\n encoding.writeVarUint(encoder.restEncoder, sm.size);\n // Write items with higher client ids first\n // This heavily improves the conflict algorithm.\n array.from(sm.entries()).sort((a, b) => b[0] - a[0]).forEach(([client, clock]) => {\n writeStructs(encoder, /** @type {Array<GC|Item>} */ (store.clients.get(client)), client, clock);\n });\n};\n\n/**\n * @param {UpdateDecoderV1 | UpdateDecoderV2} decoder The decoder object to read data from.\n * @param {Doc} doc\n * @return {Map<number, { i: number, refs: Array<Item | GC> }>}\n *\n * @private\n * @function\n */\nconst readClientsStructRefs = (decoder, doc) => {\n /**\n * @type {Map<number, { i: number, refs: Array<Item | GC> }>}\n */\n const clientRefs = map.create();\n const numOfStateUpdates = decoding.readVarUint(decoder.restDecoder);\n for (let i = 0; i < numOfStateUpdates; i++) {\n const numberOfStructs = decoding.readVarUint(decoder.restDecoder);\n /**\n * @type {Array<GC|Item>}\n */\n const refs = new Array(numberOfStructs);\n const client = decoder.readClient();\n let clock = decoding.readVarUint(decoder.restDecoder);\n // const start = performance.now()\n clientRefs.set(client, { i: 0, refs });\n for (let i = 0; i < numberOfStructs; i++) {\n const info = decoder.readInfo();\n switch (binary.BITS5 & info) {\n case 0: { // GC\n const len = decoder.readLen();\n refs[i] = new GC(createID(client, clock), len);\n clock += len;\n break\n }\n case 10: { // Skip Struct (nothing to apply)\n // @todo we could reduce the amount of checks by adding Skip struct to clientRefs so we know that something is missing.\n const len = decoding.readVarUint(decoder.restDecoder);\n refs[i] = new Skip(createID(client, clock), len);\n clock += len;\n break\n }\n default: { // Item with content\n /**\n * The optimized implementation doesn't use any variables because inlining variables is faster.\n * Below a non-optimized version is shown that implements the basic algorithm with\n * a few comments\n */\n const cantCopyParentInfo = (info & (binary.BIT7 | binary.BIT8)) === 0;\n // If parent = null and neither left nor right are defined, then we know that `parent` is child of `y`\n // and we read the next string as parentYKey.\n // It indicates how we store/retrieve parent from `y.share`\n // @type {string|null}\n const struct = new Item(\n createID(client, clock),\n null, // left\n (info & binary.BIT8) === binary.BIT8 ? decoder.readLeftID() : null, // origin\n null, // right\n (info & binary.BIT7) === binary.BIT7 ? decoder.readRightID() : null, // right origin\n cantCopyParentInfo ? (decoder.readParentInfo() ? doc.get(decoder.readString()) : decoder.readLeftID()) : null, // parent\n cantCopyParentInfo && (info & binary.BIT6) === binary.BIT6 ? decoder.readString() : null, // parentSub\n readItemContent(decoder, info) // item content\n );\n /* A non-optimized implementation of the above algorithm:\n\n // The item that was originally to the left of this item.\n const origin = (info & binary.BIT8) === binary.BIT8 ? decoder.readLeftID() : null\n // The item that was originally to the right of this item.\n const rightOrigin = (info & binary.BIT7) === binary.BIT7 ? decoder.readRightID() : null\n const cantCopyParentInfo = (info & (binary.BIT7 | binary.BIT8)) === 0\n const hasParentYKey = cantCopyParentInfo ? decoder.readParentInfo() : false\n // If parent = null and neither left nor right are defined, then we know that `parent` is child of `y`\n // and we read the next string as parentYKey.\n // It indicates how we store/retrieve parent from `y.share`\n // @type {string|null}\n const parentYKey = cantCopyParentInfo && hasParentYKey ? decoder.readString() : null\n\n const struct = new Item(\n createID(client, clock),\n null, // left\n origin, // origin\n null, // right\n rightOrigin, // right origin\n cantCopyParentInfo && !hasParentYKey ? decoder.readLeftID() : (parentYKey !== null ? doc.get(parentYKey) : null), // parent\n cantCopyParentInfo && (info & binary.BIT6) === binary.BIT6 ? decoder.readString() : null, // parentSub\n readItemContent(decoder, info) // item content\n )\n */\n refs[i] = struct;\n clock += struct.length;\n }\n }\n }\n // console.log('time to read: ', performance.now() - start) // @todo remove\n }\n return clientRefs\n};\n\n/**\n * Resume computing structs generated by struct readers.\n *\n * While there is something to do, we integrate structs in this order\n * 1. top element on stack, if stack is not empty\n * 2. next element from current struct reader (if empty, use next struct reader)\n *\n * If struct causally depends on another struct (ref.missing), we put next reader of\n * `ref.id.client` on top of stack.\n *\n * At some point we find a struct that has no causal dependencies,\n * then we start emptying the stack.\n *\n * It is not possible to have circles: i.e. struct1 (from client1) depends on struct2 (from client2)\n * depends on struct3 (from client1). Therefore the max stack size is equal to `structReaders.length`.\n *\n * This method is implemented in a way so that we can resume computation if this update\n * causally depends on another update.\n *\n * @param {Transaction} transaction\n * @param {StructStore} store\n * @param {Map<number, { i: number, refs: (GC | Item)[] }>} clientsStructRefs\n * @return { null | { update: Uint8Array, missing: Map<number,number> } }\n *\n * @private\n * @function\n */\nconst integrateStructs = (transaction, store, clientsStructRefs) => {\n /**\n * @type {Array<Item | GC>}\n */\n const stack = [];\n // sort them so that we take the higher id first, in case of conflicts the lower id will probably not conflict with the id from the higher user.\n let clientsStructRefsIds = array.from(clientsStructRefs.keys()).sort((a, b) => a - b);\n if (clientsStructRefsIds.length === 0) {\n return null\n }\n const getNextStructTarget = () => {\n if (clientsStructRefsIds.length === 0) {\n return null\n }\n let nextStructsTarget = /** @type {{i:number,refs:Array<GC|Item>}} */ (clientsStructRefs.get(clientsStructRefsIds[clientsStructRefsIds.length - 1]));\n while (nextStructsTarget.refs.length === nextStructsTarget.i) {\n clientsStructRefsIds.pop();\n if (clientsStructRefsIds.length > 0) {\n nextStructsTarget = /** @type {{i:number,refs:Array<GC|Item>}} */ (clientsStructRefs.get(clientsStructRefsIds[clientsStructRefsIds.length - 1]));\n } else {\n return null\n }\n }\n return nextStructsTarget\n };\n let curStructsTarget = getNextStructTarget();\n if (curStructsTarget === null) {\n return null\n }\n\n /**\n * @type {StructStore}\n */\n const restStructs = new StructStore();\n const missingSV = new Map();\n /**\n * @param {number} client\n * @param {number} clock\n */\n const updateMissingSv = (client, clock) => {\n const mclock = missingSV.get(client);\n if (mclock == null || mclock > clock) {\n missingSV.set(client, clock);\n }\n };\n /**\n * @type {GC|Item}\n */\n let stackHead = /** @type {any} */ (curStructsTarget).refs[/** @type {any} */ (curStructsTarget).i++];\n // caching the state because it is used very often\n const state = new Map();\n\n const addStackToRestSS = () => {\n for (const item of stack) {\n const client = item.id.client;\n const inapplicableItems = clientsStructRefs.get(client);\n if (inapplicableItems) {\n // decrement because we weren't able to apply previous operation\n inapplicableItems.i--;\n restStructs.clients.set(client, inapplicableItems.refs.slice(inapplicableItems.i));\n clientsStructRefs.delete(client);\n inapplicableItems.i = 0;\n inapplicableItems.refs = [];\n } else {\n // item was the last item on clientsStructRefs and the field was already cleared. Add item to restStructs and continue\n restStructs.clients.set(client, [item]);\n }\n // remove client from clientsStructRefsIds to prevent users from applying the same update again\n clientsStructRefsIds = clientsStructRefsIds.filter(c => c !== client);\n }\n stack.length = 0;\n };\n\n // iterate over all struct readers until we are done\n while (true) {\n if (stackHead.constructor !== Skip) {\n const localClock = map.setIfUndefined(state, stackHead.id.client, () => getState(store, stackHead.id.client));\n const offset = localClock - stackHead.id.clock;\n if (offset < 0) {\n // update from the same client is missing\n stack.push(stackHead);\n updateMissingSv(stackHead.id.client, stackHead.id.clock - 1);\n // hid a dead wall, add all items from stack to restSS\n addStackToRestSS();\n } else {\n const missing = stackHead.getMissing(transaction, store);\n if (missing !== null) {\n stack.push(stackHead);\n // get the struct reader that has the missing struct\n /**\n * @type {{ refs: Array<GC|Item>, i: number }}\n */\n const structRefs = clientsStructRefs.get(/** @type {number} */ (missing)) || { refs: [], i: 0 };\n if (structRefs.refs.length === structRefs.i) {\n // This update message causally depends on another update message that doesn't exist yet\n updateMissingSv(/** @type {number} */ (missing), getState(store, missing));\n addStackToRestSS();\n } else {\n stackHead = structRefs.refs[structRefs.i++];\n continue\n }\n } else if (offset === 0 || offset < stackHead.length) {\n // all fine, apply the stackhead\n stackHead.integrate(transaction, offset);\n state.set(stackHead.id.client, stackHead.id.clock + stackHead.length);\n }\n }\n }\n // iterate to next stackHead\n if (stack.length > 0) {\n stackHead = /** @type {GC|Item} */ (stack.pop());\n } else if (curStructsTarget !== null && curStructsTarget.i < curStructsTarget.refs.length) {\n stackHead = /** @type {GC|Item} */ (curStructsTarget.refs[curStructsTarget.i++]);\n } else {\n curStructsTarget = getNextStructTarget();\n if (curStructsTarget === null) {\n // we are done!\n break\n } else {\n stackHead = /** @type {GC|Item} */ (curStructsTarget.refs[curStructsTarget.i++]);\n }\n }\n }\n if (restStructs.clients.size > 0) {\n const encoder = new UpdateEncoderV2();\n writeClientsStructs(encoder, restStructs, new Map());\n // write empty deleteset\n // writeDeleteSet(encoder, new DeleteSet())\n encoding.writeVarUint(encoder.restEncoder, 0); // => no need for an extra function call, just write 0 deletes\n return { missing: missingSV, update: encoder.toUint8Array() }\n }\n return null\n};\n\n/**\n * @param {UpdateEncoderV1 | UpdateEncoderV2} encoder\n * @param {Transaction} transaction\n *\n * @private\n * @function\n */\nconst writeStructsFromTransaction = (encoder, transaction) => writeClientsStructs(encoder, transaction.doc.store, transaction.beforeState);\n\n/**\n * Read and apply a document update.\n *\n * This function has the same effect as `applyUpdate` but accepts a decoder.\n *\n * @param {decoding.Decoder} decoder\n * @param {Doc} ydoc\n * @param {any} [transactionOrigin] This will be stored on `transaction.origin` and `.on('update', (update, origin))`\n * @param {UpdateDecoderV1 | UpdateDecoderV2} [structDecoder]\n *\n * @function\n */\nconst readUpdateV2 = (decoder, ydoc, transactionOrigin, structDecoder = new UpdateDecoderV2(decoder)) =>\n transact(ydoc, transaction => {\n // force that transaction.local is set to non-local\n transaction.local = false;\n let retry = false;\n const doc = transaction.doc;\n const store = doc.store;\n // let start = performance.now()\n const ss = readClientsStructRefs(structDecoder, doc);\n // console.log('time to read structs: ', performance.now() - start) // @todo remove\n // start = performance.now()\n // console.log('time to merge: ', performance.now() - start) // @todo remove\n // start = performance.now()\n const restStructs = integrateStructs(transaction, store, ss);\n const pending = store.pendingStructs;\n if (pending) {\n // check if we can apply something\n for (const [client, clock] of pending.missing) {\n if (clock < getState(store, client)) {\n retry = true;\n break\n }\n }\n if (restStructs) {\n // merge restStructs into store.pending\n for (const [client, clock] of restStructs.missing) {\n const mclock = pending.missing.get(client);\n if (mclock == null || mclock > clock) {\n pending.missing.set(client, clock);\n }\n }\n pending.update = mergeUpdatesV2([pending.update, restStructs.update]);\n }\n } else {\n store.pendingStructs = restStructs;\n }\n // console.log('time to integrate: ', performance.now() - start) // @todo remove\n // start = performance.now()\n const dsRest = readAndApplyDeleteSet(structDecoder, transaction, store);\n if (store.pendingDs) {\n // @todo we could make a lower-bound state-vector check as we do above\n const pendingDSUpdate = new UpdateDecoderV2(decoding.createDecoder(store.pendingDs));\n decoding.readVarUint(pendingDSUpdate.restDecoder); // read 0 structs, because we only encode deletes in pendingdsupdate\n const dsRest2 = readAndApplyDeleteSet(pendingDSUpdate, transaction, store);\n if (dsRest && dsRest2) {\n // case 1: ds1 != null && ds2 != null\n store.pendingDs = mergeUpdatesV2([dsRest, dsRest2]);\n } else {\n // case 2: ds1 != null\n // case 3: ds2 != null\n // case 4: ds1 == null && ds2 == null\n store.pendingDs = dsRest || dsRest2;\n }\n } else {\n // Either dsRest == null && pendingDs == null OR dsRest != null\n store.pendingDs = dsRest;\n }\n // console.log('time to cleanup: ', performance.now() - start) // @todo remove\n // start = performance.now()\n\n // console.log('time to resume delete readers: ', performance.now() - start) // @todo remove\n // start = performance.now()\n if (retry) {\n const update = /** @type {{update: Uint8Array}} */ (store.pendingStructs).update;\n store.pendingStructs = null;\n applyUpdateV2(transaction.doc, update);\n }\n }, transactionOrigin, false);\n\n/**\n * Read and apply a document update.\n *\n * This function has the same effect as `applyUpdate` but accepts a decoder.\n *\n * @param {decoding.Decoder} decoder\n * @param {Doc} ydoc\n * @param {any} [transactionOrigin] This will be stored on `transaction.origin` and `.on('update', (update, origin))`\n *\n * @function\n */\nconst readUpdate = (decoder, ydoc, transactionOrigin) => readUpdateV2(decoder, ydoc, transactionOrigin, new UpdateDecoderV1(decoder));\n\n/**\n * Apply a document update created by, for example, `y.on('update', update => ..)` or `update = encodeStateAsUpdate()`.\n *\n * This function has the same effect as `readUpdate` but accepts an Uint8Array instead of a Decoder.\n *\n * @param {Doc} ydoc\n * @param {Uint8Array} update\n * @param {any} [transactionOrigin] This will be stored on `transaction.origin` and `.on('update', (update, origin))`\n * @param {typeof UpdateDecoderV1 | typeof UpdateDecoderV2} [YDecoder]\n *\n * @function\n */\nconst applyUpdateV2 = (ydoc, update, transactionOrigin, YDecoder = UpdateDecoderV2) => {\n const decoder = decoding.createDecoder(update);\n readUpdateV2(decoder, ydoc, transactionOrigin, new YDecoder(decoder));\n};\n\n/**\n * Apply a document update created by, for example, `y.on('update', update => ..)` or `update = encodeStateAsUpdate()`.\n *\n * This function has the same effect as `readUpdate` but accepts an Uint8Array instead of a Decoder.\n *\n * @param {Doc} ydoc\n * @param {Uint8Array} update\n * @param {any} [transactionOrigin] This will be stored on `transaction.origin` and `.on('update', (update, origin))`\n *\n * @function\n */\nconst applyUpdate = (ydoc, update, transactionOrigin) => applyUpdateV2(ydoc, update, transactionOrigin, UpdateDecoderV1);\n\n/**\n * Write all the document as a single update message. If you specify the state of the remote client (`targetStateVector`) it will\n * only write the operations that are missing.\n *\n * @param {UpdateEncoderV1 | UpdateEncoderV2} encoder\n * @param {Doc} doc\n * @param {Map<number,number>} [targetStateVector] The state of the target that receives the update. Leave empty to write all known structs\n *\n * @function\n */\nconst writeStateAsUpdate = (encoder, doc, targetStateVector = new Map()) => {\n writeClientsStructs(encoder, doc.store, targetStateVector);\n writeDeleteSet(encoder, createDeleteSetFromStructStore(doc.store));\n};\n\n/**\n * Write all the document as a single update message that can be applied on the remote document. If you specify the state of the remote client (`targetState`) it will\n * only write the operations that are missing.\n *\n * Use `writeStateAsUpdate` instead if you are working with lib0/encoding.js#Encoder\n *\n * @param {Doc} doc\n * @param {Uint8Array} [encodedTargetStateVector] The state of the target that receives the update. Leave empty to write all known structs\n * @param {UpdateEncoderV1 | UpdateEncoderV2} [encoder]\n * @return {Uint8Array}\n *\n * @function\n */\nconst encodeStateAsUpdateV2 = (doc, encodedTargetStateVector = new Uint8Array([0]), encoder = new UpdateEncoderV2()) => {\n const targetStateVector = decodeStateVector(encodedTargetStateVector);\n writeStateAsUpdate(encoder, doc, targetStateVector);\n const updates = [encoder.toUint8Array()];\n // also add the pending updates (if there are any)\n if (doc.store.pendingDs) {\n updates.push(doc.store.pendingDs);\n }\n if (doc.store.pendingStructs) {\n updates.push(diffUpdateV2(doc.store.pendingStructs.update, encodedTargetStateVector));\n }\n if (updates.length > 1) {\n if (encoder.constructor === UpdateEncoderV1) {\n return mergeUpdates(updates.map((update, i) => i === 0 ? update : convertUpdateFormatV2ToV1(update)))\n } else if (encoder.constructor === UpdateEncoderV2) {\n return mergeUpdatesV2(updates)\n }\n }\n return updates[0]\n};\n\n/**\n * Write all the document as a single update message that can be applied on the remote document. If you specify the state of the remote client (`targetState`) it will\n * only write the operations that are missing.\n *\n * Use `writeStateAsUpdate` instead if you are working with lib0/encoding.js#Encoder\n *\n * @param {Doc} doc\n * @param {Uint8Array} [encodedTargetStateVector] The state of the target that receives the update. Leave empty to write all known structs\n * @return {Uint8Array}\n *\n * @function\n */\nconst encodeStateAsUpdate = (doc, encodedTargetStateVector) => encodeStateAsUpdateV2(doc, encodedTargetStateVector, new UpdateEncoderV1());\n\n/**\n * Read state vector from Decoder and return as Map\n *\n * @param {DSDecoderV1 | DSDecoderV2} decoder\n * @return {Map<number,number>} Maps `client` to the number next expected `clock` from that client.\n *\n * @function\n */\nconst readStateVector = decoder => {\n const ss = new Map();\n const ssLength = decoding.readVarUint(decoder.restDecoder);\n for (let i = 0; i < ssLength; i++) {\n const client = decoding.readVarUint(decoder.restDecoder);\n const clock = decoding.readVarUint(decoder.restDecoder);\n ss.set(client, clock);\n }\n return ss\n};\n\n/**\n * Read decodedState and return State as Map.\n *\n * @param {Uint8Array} decodedState\n * @return {Map<number,number>} Maps `client` to the number next expected `clock` from that client.\n *\n * @function\n */\n// export const decodeStateVectorV2 = decodedState => readStateVector(new DSDecoderV2(decoding.createDecoder(decodedState)))\n\n/**\n * Read decodedState and return State as Map.\n *\n * @param {Uint8Array} decodedState\n * @return {Map<number,number>} Maps `client` to the number next expected `clock` from that client.\n *\n * @function\n */\nconst decodeStateVector = decodedState => readStateVector(new DSDecoderV1(decoding.createDecoder(decodedState)));\n\n/**\n * @param {DSEncoderV1 | DSEncoderV2} encoder\n * @param {Map<number,number>} sv\n * @function\n */\nconst writeStateVector = (encoder, sv) => {\n encoding.writeVarUint(encoder.restEncoder, sv.size);\n array.from(sv.entries()).sort((a, b) => b[0] - a[0]).forEach(([client, clock]) => {\n encoding.writeVarUint(encoder.restEncoder, client); // @todo use a special client decoder that is based on mapping\n encoding.writeVarUint(encoder.restEncoder, clock);\n });\n return encoder\n};\n\n/**\n * @param {DSEncoderV1 | DSEncoderV2} encoder\n * @param {Doc} doc\n *\n * @function\n */\nconst writeDocumentStateVector = (encoder, doc) => writeStateVector(encoder, getStateVector(doc.store));\n\n/**\n * Encode State as Uint8Array.\n *\n * @param {Doc|Map<number,number>} doc\n * @param {DSEncoderV1 | DSEncoderV2} [encoder]\n * @return {Uint8Array}\n *\n * @function\n */\nconst encodeStateVectorV2 = (doc, encoder = new DSEncoderV2()) => {\n if (doc instanceof Map) {\n writeStateVector(encoder, doc);\n } else {\n writeDocumentStateVector(encoder, doc);\n }\n return encoder.toUint8Array()\n};\n\n/**\n * Encode State as Uint8Array.\n *\n * @param {Doc|Map<number,number>} doc\n * @return {Uint8Array}\n *\n * @function\n */\nconst encodeStateVector = doc => encodeStateVectorV2(doc, new DSEncoderV1());\n\n/**\n * General event handler implementation.\n *\n * @template ARG0, ARG1\n *\n * @private\n */\nclass EventHandler {\n constructor () {\n /**\n * @type {Array<function(ARG0, ARG1):void>}\n */\n this.l = [];\n }\n}\n\n/**\n * @template ARG0,ARG1\n * @returns {EventHandler<ARG0,ARG1>}\n *\n * @private\n * @function\n */\nconst createEventHandler = () => new EventHandler();\n\n/**\n * Adds an event listener that is called when\n * {@link EventHandler#callEventListeners} is called.\n *\n * @template ARG0,ARG1\n * @param {EventHandler<ARG0,ARG1>} eventHandler\n * @param {function(ARG0,ARG1):void} f The event handler.\n *\n * @private\n * @function\n */\nconst addEventHandlerListener = (eventHandler, f) =>\n eventHandler.l.push(f);\n\n/**\n * Removes an event listener.\n *\n * @template ARG0,ARG1\n * @param {EventHandler<ARG0,ARG1>} eventHandler\n * @param {function(ARG0,ARG1):void} f The event handler that was added with\n * {@link EventHandler#addEventListener}\n *\n * @private\n * @function\n */\nconst removeEventHandlerListener = (eventHandler, f) => {\n const l = eventHandler.l;\n const len = l.length;\n eventHandler.l = l.filter(g => f !== g);\n if (len === eventHandler.l.length) {\n console.error('[yjs] Tried to remove event handler that doesn\\'t exist.');\n }\n};\n\n/**\n * Call all event listeners that were added via\n * {@link EventHandler#addEventListener}.\n *\n * @template ARG0,ARG1\n * @param {EventHandler<ARG0,ARG1>} eventHandler\n * @param {ARG0} arg0\n * @param {ARG1} arg1\n *\n * @private\n * @function\n */\nconst callEventHandlerListeners = (eventHandler, arg0, arg1) =>\n f.callAll(eventHandler.l, [arg0, arg1]);\n\nclass ID {\n /**\n * @param {number} client client id\n * @param {number} clock unique per client id, continuous number\n */\n constructor (client, clock) {\n /**\n * Client id\n * @type {number}\n */\n this.client = client;\n /**\n * unique per client id, continuous number\n * @type {number}\n */\n this.clock = clock;\n }\n}\n\n/**\n * @param {ID | null} a\n * @param {ID | null} b\n * @return {boolean}\n *\n * @function\n */\nconst compareIDs = (a, b) => a === b || (a !== null && b !== null && a.client === b.client && a.clock === b.clock);\n\n/**\n * @param {number} client\n * @param {number} clock\n *\n * @private\n * @function\n */\nconst createID = (client, clock) => new ID(client, clock);\n\n/**\n * @param {encoding.Encoder} encoder\n * @param {ID} id\n *\n * @private\n * @function\n */\nconst writeID = (encoder, id) => {\n encoding.writeVarUint(encoder, id.client);\n encoding.writeVarUint(encoder, id.clock);\n};\n\n/**\n * Read ID.\n * * If first varUint read is 0xFFFFFF a RootID is returned.\n * * Otherwise an ID is returned\n *\n * @param {decoding.Decoder} decoder\n * @return {ID}\n *\n * @private\n * @function\n */\nconst readID = decoder =>\n createID(decoding.readVarUint(decoder), decoding.readVarUint(decoder));\n\n/**\n * The top types are mapped from y.share.get(keyname) => type.\n * `type` does not store any information about the `keyname`.\n * This function finds the correct `keyname` for `type` and throws otherwise.\n *\n * @param {AbstractType<any>} type\n * @return {string}\n *\n * @private\n * @function\n */\nconst findRootTypeKey = type => {\n // @ts-ignore _y must be defined, otherwise unexpected case\n for (const [key, value] of type.doc.share.entries()) {\n if (value === type) {\n return key\n }\n }\n throw error.unexpectedCase()\n};\n\n/**\n * Check if `parent` is a parent of `child`.\n *\n * @param {AbstractType<any>} parent\n * @param {Item|null} child\n * @return {Boolean} Whether `parent` is a parent of `child`.\n *\n * @private\n * @function\n */\nconst isParentOf = (parent, child) => {\n while (child !== null) {\n if (child.parent === parent) {\n return true\n }\n child = /** @type {AbstractType<any>} */ (child.parent)._item;\n }\n return false\n};\n\n/**\n * Convenient helper to log type information.\n *\n * Do not use in productive systems as the output can be immense!\n *\n * @param {AbstractType<any>} type\n */\nconst logType = type => {\n const res = [];\n let n = type._start;\n while (n) {\n res.push(n);\n n = n.right;\n }\n console.log('Children: ', res);\n console.log('Children content: ', res.filter(m => !m.deleted).map(m => m.content));\n};\n\nclass PermanentUserData {\n /**\n * @param {Doc} doc\n * @param {YMap<any>} [storeType]\n */\n constructor (doc, storeType = doc.getMap('users')) {\n /**\n * @type {Map<string,DeleteSet>}\n */\n const dss = new Map();\n this.yusers = storeType;\n this.doc = doc;\n /**\n * Maps from clientid to userDescription\n *\n * @type {Map<number,string>}\n */\n this.clients = new Map();\n this.dss = dss;\n /**\n * @param {YMap<any>} user\n * @param {string} userDescription\n */\n const initUser = (user, userDescription) => {\n /**\n * @type {YArray<Uint8Array>}\n */\n const ds = user.get('ds');\n const ids = user.get('ids');\n const addClientId = /** @param {number} clientid */ clientid => this.clients.set(clientid, userDescription);\n ds.observe(/** @param {YArrayEvent<any>} event */ event => {\n event.changes.added.forEach(item => {\n item.content.getContent().forEach(encodedDs => {\n if (encodedDs instanceof Uint8Array) {\n this.dss.set(userDescription, mergeDeleteSets([this.dss.get(userDescription) || createDeleteSet(), readDeleteSet(new DSDecoderV1(decoding.createDecoder(encodedDs)))]));\n }\n });\n });\n });\n this.dss.set(userDescription, mergeDeleteSets(ds.map(encodedDs => readDeleteSet(new DSDecoderV1(decoding.createDecoder(encodedDs))))));\n ids.observe(/** @param {YArrayEvent<any>} event */ event =>\n event.changes.added.forEach(item => item.content.getContent().forEach(addClientId))\n );\n ids.forEach(addClientId);\n };\n // observe users\n storeType.observe(event => {\n event.keysChanged.forEach(userDescription =>\n initUser(storeType.get(userDescription), userDescription)\n );\n });\n // add initial data\n storeType.forEach(initUser);\n }\n\n /**\n * @param {Doc} doc\n * @param {number} clientid\n * @param {string} userDescription\n * @param {Object} conf\n * @param {function(Transaction, DeleteSet):boolean} [conf.filter]\n */\n setUserMapping (doc, clientid, userDescription, { filter = () => true } = {}) {\n const users = this.yusers;\n let user = users.get(userDescription);\n if (!user) {\n user = new YMap();\n user.set('ids', new YArray());\n user.set('ds', new YArray());\n users.set(userDescription, user);\n }\n user.get('ids').push([clientid]);\n users.observe(_event => {\n setTimeout(() => {\n const userOverwrite = users.get(userDescription);\n if (userOverwrite !== user) {\n // user was overwritten, port all data over to the next user object\n // @todo Experiment with Y.Sets here\n user = userOverwrite;\n // @todo iterate over old type\n this.clients.forEach((_userDescription, clientid) => {\n if (userDescription === _userDescription) {\n user.get('ids').push([clientid]);\n }\n });\n const encoder = new DSEncoderV1();\n const ds = this.dss.get(userDescription);\n if (ds) {\n writeDeleteSet(encoder, ds);\n user.get('ds').push([encoder.toUint8Array()]);\n }\n }\n }, 0);\n });\n doc.on('afterTransaction', /** @param {Transaction} transaction */ transaction => {\n setTimeout(() => {\n const yds = user.get('ds');\n const ds = transaction.deleteSet;\n if (transaction.local && ds.clients.size > 0 && filter(transaction, ds)) {\n const encoder = new DSEncoderV1();\n writeDeleteSet(encoder, ds);\n yds.push([encoder.toUint8Array()]);\n }\n });\n });\n }\n\n /**\n * @param {number} clientid\n * @return {any}\n */\n getUserByClientId (clientid) {\n return this.clients.get(clientid) || null\n }\n\n /**\n * @param {ID} id\n * @return {string | null}\n */\n getUserByDeletedId (id) {\n for (const [userDescription, ds] of this.dss.entries()) {\n if (isDeleted(ds, id)) {\n return userDescription\n }\n }\n return null\n }\n}\n\n/**\n * A relative position is based on the Yjs model and is not affected by document changes.\n * E.g. If you place a relative position before a certain character, it will always point to this character.\n * If you place a relative position at the end of a type, it will always point to the end of the type.\n *\n * A numeric position is often unsuited for user selections, because it does not change when content is inserted\n * before or after.\n *\n * ```Insert(0, 'x')('a|bc') = 'xa|bc'``` Where | is the relative position.\n *\n * One of the properties must be defined.\n *\n * @example\n * // Current cursor position is at position 10\n * const relativePosition = createRelativePositionFromIndex(yText, 10)\n * // modify yText\n * yText.insert(0, 'abc')\n * yText.delete(3, 10)\n * // Compute the cursor position\n * const absolutePosition = createAbsolutePositionFromRelativePosition(y, relativePosition)\n * absolutePosition.type === yText // => true\n * console.log('cursor location is ' + absolutePosition.index) // => cursor location is 3\n *\n */\nclass RelativePosition {\n /**\n * @param {ID|null} type\n * @param {string|null} tname\n * @param {ID|null} item\n * @param {number} assoc\n */\n constructor (type, tname, item, assoc = 0) {\n /**\n * @type {ID|null}\n */\n this.type = type;\n /**\n * @type {string|null}\n */\n this.tname = tname;\n /**\n * @type {ID | null}\n */\n this.item = item;\n /**\n * A relative position is associated to a specific character. By default\n * assoc >= 0, the relative position is associated to the character\n * after the meant position.\n * I.e. position 1 in 'ab' is associated to character 'b'.\n *\n * If assoc < 0, then the relative position is associated to the character\n * before the meant position.\n *\n * @type {number}\n */\n this.assoc = assoc;\n }\n}\n\n/**\n * @param {RelativePosition} rpos\n * @return {any}\n */\nconst relativePositionToJSON = rpos => {\n const json = {};\n if (rpos.type) {\n json.type = rpos.type;\n }\n if (rpos.tname) {\n json.tname = rpos.tname;\n }\n if (rpos.item) {\n json.item = rpos.item;\n }\n if (rpos.assoc != null) {\n json.assoc = rpos.assoc;\n }\n return json\n};\n\n/**\n * @param {any} json\n * @return {RelativePosition}\n *\n * @function\n */\nconst createRelativePositionFromJSON = json => new RelativePosition(json.type == null ? null : createID(json.type.client, json.type.clock), json.tname ?? null, json.item == null ? null : createID(json.item.client, json.item.clock), json.assoc == null ? 0 : json.assoc);\n\nclass AbsolutePosition {\n /**\n * @param {AbstractType<any>} type\n * @param {number} index\n * @param {number} [assoc]\n */\n constructor (type, index, assoc = 0) {\n /**\n * @type {AbstractType<any>}\n */\n this.type = type;\n /**\n * @type {number}\n */\n this.index = index;\n this.assoc = assoc;\n }\n}\n\n/**\n * @param {AbstractType<any>} type\n * @param {number} index\n * @param {number} [assoc]\n *\n * @function\n */\nconst createAbsolutePosition = (type, index, assoc = 0) => new AbsolutePosition(type, index, assoc);\n\n/**\n * @param {AbstractType<any>} type\n * @param {ID|null} item\n * @param {number} [assoc]\n *\n * @function\n */\nconst createRelativePosition = (type, item, assoc) => {\n let typeid = null;\n let tname = null;\n if (type._item === null) {\n tname = findRootTypeKey(type);\n } else {\n typeid = createID(type._item.id.client, type._item.id.clock);\n }\n return new RelativePosition(typeid, tname, item, assoc)\n};\n\n/**\n * Create a relativePosition based on a absolute position.\n *\n * @param {AbstractType<any>} type The base type (e.g. YText or YArray).\n * @param {number} index The absolute position.\n * @param {number} [assoc]\n * @return {RelativePosition}\n *\n * @function\n */\nconst createRelativePositionFromTypeIndex = (type, index, assoc = 0) => {\n let t = type._start;\n if (assoc < 0) {\n // associated to the left character or the beginning of a type, increment index if possible.\n if (index === 0) {\n return createRelativePosition(type, null, assoc)\n }\n index--;\n }\n while (t !== null) {\n if (!t.deleted && t.countable) {\n if (t.length > index) {\n // case 1: found position somewhere in the linked list\n return createRelativePosition(type, createID(t.id.client, t.id.clock + index), assoc)\n }\n index -= t.length;\n }\n if (t.right === null && assoc < 0) {\n // left-associated position, return last available id\n return createRelativePosition(type, t.lastId, assoc)\n }\n t = t.right;\n }\n return createRelativePosition(type, null, assoc)\n};\n\n/**\n * @param {encoding.Encoder} encoder\n * @param {RelativePosition} rpos\n *\n * @function\n */\nconst writeRelativePosition = (encoder, rpos) => {\n const { type, tname, item, assoc } = rpos;\n if (item !== null) {\n encoding.writeVarUint(encoder, 0);\n writeID(encoder, item);\n } else if (tname !== null) {\n // case 2: found position at the end of the list and type is stored in y.share\n encoding.writeUint8(encoder, 1);\n encoding.writeVarString(encoder, tname);\n } else if (type !== null) {\n // case 3: found position at the end of the list and type is attached to an item\n encoding.writeUint8(encoder, 2);\n writeID(encoder, type);\n } else {\n throw error.unexpectedCase()\n }\n encoding.writeVarInt(encoder, assoc);\n return encoder\n};\n\n/**\n * @param {RelativePosition} rpos\n * @return {Uint8Array}\n */\nconst encodeRelativePosition = rpos => {\n const encoder = encoding.createEncoder();\n writeRelativePosition(encoder, rpos);\n return encoding.toUint8Array(encoder)\n};\n\n/**\n * @param {decoding.Decoder} decoder\n * @return {RelativePosition}\n *\n * @function\n */\nconst readRelativePosition = decoder => {\n let type = null;\n let tname = null;\n let itemID = null;\n switch (decoding.readVarUint(decoder)) {\n case 0:\n // case 1: found position somewhere in the linked list\n itemID = readID(decoder);\n break\n case 1:\n // case 2: found position at the end of the list and type is stored in y.share\n tname = decoding.readVarString(decoder);\n break\n case 2: {\n // case 3: found position at the end of the list and type is attached to an item\n type = readID(decoder);\n }\n }\n const assoc = decoding.hasContent(decoder) ? decoding.readVarInt(decoder) : 0;\n return new RelativePosition(type, tname, itemID, assoc)\n};\n\n/**\n * @param {Uint8Array} uint8Array\n * @return {RelativePosition}\n */\nconst decodeRelativePosition = uint8Array => readRelativePosition(decoding.createDecoder(uint8Array));\n\n/**\n * @param {StructStore} store\n * @param {ID} id\n */\nconst getItemWithOffset = (store, id) => {\n const item = getItem(store, id);\n const diff = id.clock - item.id.clock;\n return {\n item, diff\n }\n};\n\n/**\n * Transform a relative position to an absolute position.\n *\n * If you want to share the relative position with other users, you should set\n * `followUndoneDeletions` to false to get consistent results across all clients.\n *\n * When calculating the absolute position, we try to follow the \"undone deletions\". This yields\n * better results for the user who performed undo. However, only the user who performed the undo\n * will get the better results, the other users don't know which operations recreated a deleted\n * range of content. There is more information in this ticket: https://github.com/yjs/yjs/issues/638\n *\n * @param {RelativePosition} rpos\n * @param {Doc} doc\n * @param {boolean} followUndoneDeletions - whether to follow undone deletions - see https://github.com/yjs/yjs/issues/638\n * @return {AbsolutePosition|null}\n *\n * @function\n */\nconst createAbsolutePositionFromRelativePosition = (rpos, doc, followUndoneDeletions = true) => {\n const store = doc.store;\n const rightID = rpos.item;\n const typeID = rpos.type;\n const tname = rpos.tname;\n const assoc = rpos.assoc;\n let type = null;\n let index = 0;\n if (rightID !== null) {\n if (getState(store, rightID.client) <= rightID.clock) {\n return null\n }\n const res = followUndoneDeletions ? followRedone(store, rightID) : getItemWithOffset(store, rightID);\n const right = res.item;\n if (!(right instanceof Item)) {\n return null\n }\n type = /** @type {AbstractType<any>} */ (right.parent);\n if (type._item === null || !type._item.deleted) {\n index = (right.deleted || !right.countable) ? 0 : (res.diff + (assoc >= 0 ? 0 : 1)); // adjust position based on left association if necessary\n let n = right.left;\n while (n !== null) {\n if (!n.deleted && n.countable) {\n index += n.length;\n }\n n = n.left;\n }\n }\n } else {\n if (tname !== null) {\n type = doc.get(tname);\n } else if (typeID !== null) {\n if (getState(store, typeID.client) <= typeID.clock) {\n // type does not exist yet\n return null\n }\n const { item } = followUndoneDeletions ? followRedone(store, typeID) : { item: getItem(store, typeID) };\n if (item instanceof Item && item.content instanceof ContentType) {\n type = item.content.type;\n } else {\n // struct is garbage collected\n return null\n }\n } else {\n throw error.unexpectedCase()\n }\n if (assoc >= 0) {\n index = type._length;\n } else {\n index = 0;\n }\n }\n return createAbsolutePosition(type, index, rpos.assoc)\n};\n\n/**\n * @param {RelativePosition|null} a\n * @param {RelativePosition|null} b\n * @return {boolean}\n *\n * @function\n */\nconst compareRelativePositions = (a, b) => a === b || (\n a !== null && b !== null && a.tname === b.tname && compareIDs(a.item, b.item) && compareIDs(a.type, b.type) && a.assoc === b.assoc\n);\n\nclass Snapshot {\n /**\n * @param {DeleteSet} ds\n * @param {Map<number,number>} sv state map\n */\n constructor (ds, sv) {\n /**\n * @type {DeleteSet}\n */\n this.ds = ds;\n /**\n * State Map\n * @type {Map<number,number>}\n */\n this.sv = sv;\n }\n}\n\n/**\n * @param {Snapshot} snap1\n * @param {Snapshot} snap2\n * @return {boolean}\n */\nconst equalSnapshots = (snap1, snap2) => {\n const ds1 = snap1.ds.clients;\n const ds2 = snap2.ds.clients;\n const sv1 = snap1.sv;\n const sv2 = snap2.sv;\n if (sv1.size !== sv2.size || ds1.size !== ds2.size) {\n return false\n }\n for (const [key, value] of sv1.entries()) {\n if (sv2.get(key) !== value) {\n return false\n }\n }\n for (const [client, dsitems1] of ds1.entries()) {\n const dsitems2 = ds2.get(client) || [];\n if (dsitems1.length !== dsitems2.length) {\n return false\n }\n for (let i = 0; i < dsitems1.length; i++) {\n const dsitem1 = dsitems1[i];\n const dsitem2 = dsitems2[i];\n if (dsitem1.clock !== dsitem2.clock || dsitem1.len !== dsitem2.len) {\n return false\n }\n }\n }\n return true\n};\n\n/**\n * @param {Snapshot} snapshot\n * @param {DSEncoderV1 | DSEncoderV2} [encoder]\n * @return {Uint8Array}\n */\nconst encodeSnapshotV2 = (snapshot, encoder = new DSEncoderV2()) => {\n writeDeleteSet(encoder, snapshot.ds);\n writeStateVector(encoder, snapshot.sv);\n return encoder.toUint8Array()\n};\n\n/**\n * @param {Snapshot} snapshot\n * @return {Uint8Array}\n */\nconst encodeSnapshot = snapshot => encodeSnapshotV2(snapshot, new DSEncoderV1());\n\n/**\n * @param {Uint8Array} buf\n * @param {DSDecoderV1 | DSDecoderV2} [decoder]\n * @return {Snapshot}\n */\nconst decodeSnapshotV2 = (buf, decoder = new DSDecoderV2(decoding.createDecoder(buf))) => {\n return new Snapshot(readDeleteSet(decoder), readStateVector(decoder))\n};\n\n/**\n * @param {Uint8Array} buf\n * @return {Snapshot}\n */\nconst decodeSnapshot = buf => decodeSnapshotV2(buf, new DSDecoderV1(decoding.createDecoder(buf)));\n\n/**\n * @param {DeleteSet} ds\n * @param {Map<number,number>} sm\n * @return {Snapshot}\n */\nconst createSnapshot = (ds, sm) => new Snapshot(ds, sm);\n\nconst emptySnapshot = createSnapshot(createDeleteSet(), new Map());\n\n/**\n * @param {Doc} doc\n * @return {Snapshot}\n */\nconst snapshot = doc => createSnapshot(createDeleteSetFromStructStore(doc.store), getStateVector(doc.store));\n\n/**\n * @param {Item} item\n * @param {Snapshot|undefined} snapshot\n *\n * @protected\n * @function\n */\nconst isVisible = (item, snapshot) => snapshot === undefined\n ? !item.deleted\n : snapshot.sv.has(item.id.client) && (snapshot.sv.get(item.id.client) || 0) > item.id.clock && !isDeleted(snapshot.ds, item.id);\n\n/**\n * @param {Transaction} transaction\n * @param {Snapshot} snapshot\n */\nconst splitSnapshotAffectedStructs = (transaction, snapshot) => {\n const meta = map.setIfUndefined(transaction.meta, splitSnapshotAffectedStructs, set.create);\n const store = transaction.doc.store;\n // check if we already split for this snapshot\n if (!meta.has(snapshot)) {\n snapshot.sv.forEach((clock, client) => {\n if (clock < getState(store, client)) {\n getItemCleanStart(transaction, createID(client, clock));\n }\n });\n iterateDeletedStructs(transaction, snapshot.ds, _item => {});\n meta.add(snapshot);\n }\n};\n\n/**\n * @example\n * const ydoc = new Y.Doc({ gc: false })\n * ydoc.getText().insert(0, 'world!')\n * const snapshot = Y.snapshot(ydoc)\n * ydoc.getText().insert(0, 'hello ')\n * const restored = Y.createDocFromSnapshot(ydoc, snapshot)\n * assert(restored.getText().toString() === 'world!')\n *\n * @param {Doc} originDoc\n * @param {Snapshot} snapshot\n * @param {Doc} [newDoc] Optionally, you may define the Yjs document that receives the data from originDoc\n * @return {Doc}\n */\nconst createDocFromSnapshot = (originDoc, snapshot, newDoc = new Doc()) => {\n if (originDoc.gc) {\n // we should not try to restore a GC-ed document, because some of the restored items might have their content deleted\n throw new Error('Garbage-collection must be disabled in `originDoc`!')\n }\n const { sv, ds } = snapshot;\n\n const encoder = new UpdateEncoderV2();\n originDoc.transact(transaction => {\n let size = 0;\n sv.forEach(clock => {\n if (clock > 0) {\n size++;\n }\n });\n encoding.writeVarUint(encoder.restEncoder, size);\n // splitting the structs before writing them to the encoder\n for (const [client, clock] of sv) {\n if (clock === 0) {\n continue\n }\n if (clock < getState(originDoc.store, client)) {\n getItemCleanStart(transaction, createID(client, clock));\n }\n const structs = originDoc.store.clients.get(client) || [];\n const lastStructIndex = findIndexSS(structs, clock - 1);\n // write # encoded structs\n encoding.writeVarUint(encoder.restEncoder, lastStructIndex + 1);\n encoder.writeClient(client);\n // first clock written is 0\n encoding.writeVarUint(encoder.restEncoder, 0);\n for (let i = 0; i <= lastStructIndex; i++) {\n structs[i].write(encoder, 0);\n }\n }\n writeDeleteSet(encoder, ds);\n });\n\n applyUpdateV2(newDoc, encoder.toUint8Array(), 'snapshot');\n return newDoc\n};\n\n/**\n * @param {Snapshot} snapshot\n * @param {Uint8Array} update\n * @param {typeof UpdateDecoderV2 | typeof UpdateDecoderV1} [YDecoder]\n */\nconst snapshotContainsUpdateV2 = (snapshot, update, YDecoder = UpdateDecoderV2) => {\n const updateDecoder = new YDecoder(decoding.createDecoder(update));\n const lazyDecoder = new LazyStructReader(updateDecoder, false);\n for (let curr = lazyDecoder.curr; curr !== null; curr = lazyDecoder.next()) {\n if ((snapshot.sv.get(curr.id.client) || 0) < curr.id.clock + curr.length) {\n return false\n }\n }\n const mergedDS = mergeDeleteSets([snapshot.ds, readDeleteSet(updateDecoder)]);\n return equalDeleteSets(snapshot.ds, mergedDS)\n};\n\n/**\n * @param {Snapshot} snapshot\n * @param {Uint8Array} update\n */\nconst snapshotContainsUpdate = (snapshot, update) => snapshotContainsUpdateV2(snapshot, update, UpdateDecoderV1);\n\nclass StructStore {\n constructor () {\n /**\n * @type {Map<number,Array<GC|Item>>}\n */\n this.clients = new Map();\n /**\n * @type {null | { missing: Map<number, number>, update: Uint8Array }}\n */\n this.pendingStructs = null;\n /**\n * @type {null | Uint8Array}\n */\n this.pendingDs = null;\n }\n}\n\n/**\n * Return the states as a Map<client,clock>.\n * Note that clock refers to the next expected clock id.\n *\n * @param {StructStore} store\n * @return {Map<number,number>}\n *\n * @public\n * @function\n */\nconst getStateVector = store => {\n const sm = new Map();\n store.clients.forEach((structs, client) => {\n const struct = structs[structs.length - 1];\n sm.set(client, struct.id.clock + struct.length);\n });\n return sm\n};\n\n/**\n * @param {StructStore} store\n * @param {number} client\n * @return {number}\n *\n * @public\n * @function\n */\nconst getState = (store, client) => {\n const structs = store.clients.get(client);\n if (structs === undefined) {\n return 0\n }\n const lastStruct = structs[structs.length - 1];\n return lastStruct.id.clock + lastStruct.length\n};\n\n/**\n * @param {StructStore} store\n * @param {GC|Item} struct\n *\n * @private\n * @function\n */\nconst addStruct = (store, struct) => {\n let structs = store.clients.get(struct.id.client);\n if (structs === undefined) {\n structs = [];\n store.clients.set(struct.id.client, structs);\n } else {\n const lastStruct = structs[structs.length - 1];\n if (lastStruct.id.clock + lastStruct.length !== struct.id.clock) {\n throw error.unexpectedCase()\n }\n }\n structs.push(struct);\n};\n\n/**\n * Perform a binary search on a sorted array\n * @param {Array<Item|GC>} structs\n * @param {number} clock\n * @return {number}\n *\n * @private\n * @function\n */\nconst findIndexSS = (structs, clock) => {\n let left = 0;\n let right = structs.length - 1;\n let mid = structs[right];\n let midclock = mid.id.clock;\n if (midclock === clock) {\n return right\n }\n // @todo does it even make sense to pivot the search?\n // If a good split misses, it might actually increase the time to find the correct item.\n // Currently, the only advantage is that search with pivoting might find the item on the first try.\n let midindex = math.floor((clock / (midclock + mid.length - 1)) * right); // pivoting the search\n while (left <= right) {\n mid = structs[midindex];\n midclock = mid.id.clock;\n if (midclock <= clock) {\n if (clock < midclock + mid.length) {\n return midindex\n }\n left = midindex + 1;\n } else {\n right = midindex - 1;\n }\n midindex = math.floor((left + right) / 2);\n }\n // Always check state before looking for a struct in StructStore\n // Therefore the case of not finding a struct is unexpected\n throw error.unexpectedCase()\n};\n\n/**\n * Expects that id is actually in store. This function throws or is an infinite loop otherwise.\n *\n * @param {StructStore} store\n * @param {ID} id\n * @return {GC|Item}\n *\n * @private\n * @function\n */\nconst find = (store, id) => {\n /**\n * @type {Array<GC|Item>}\n */\n // @ts-ignore\n const structs = store.clients.get(id.client);\n return structs[findIndexSS(structs, id.clock)]\n};\n\n/**\n * Expects that id is actually in store. This function throws or is an infinite loop otherwise.\n * @private\n * @function\n */\nconst getItem = /** @type {function(StructStore,ID):Item} */ (find);\n\n/**\n * @param {Transaction} transaction\n * @param {Array<Item|GC>} structs\n * @param {number} clock\n */\nconst findIndexCleanStart = (transaction, structs, clock) => {\n const index = findIndexSS(structs, clock);\n const struct = structs[index];\n if (struct.id.clock < clock && struct instanceof Item) {\n structs.splice(index + 1, 0, splitItem(transaction, struct, clock - struct.id.clock));\n return index + 1\n }\n return index\n};\n\n/**\n * Expects that id is actually in store. This function throws or is an infinite loop otherwise.\n *\n * @param {Transaction} transaction\n * @param {ID} id\n * @return {Item}\n *\n * @private\n * @function\n */\nconst getItemCleanStart = (transaction, id) => {\n const structs = /** @type {Array<Item>} */ (transaction.doc.store.clients.get(id.client));\n return structs[findIndexCleanStart(transaction, structs, id.clock)]\n};\n\n/**\n * Expects that id is actually in store. This function throws or is an infinite loop otherwise.\n *\n * @param {Transaction} transaction\n * @param {StructStore} store\n * @param {ID} id\n * @return {Item}\n *\n * @private\n * @function\n */\nconst getItemCleanEnd = (transaction, store, id) => {\n /**\n * @type {Array<Item>}\n */\n // @ts-ignore\n const structs = store.clients.get(id.client);\n const index = findIndexSS(structs, id.clock);\n const struct = structs[index];\n if (id.clock !== struct.id.clock + struct.length - 1 && struct.constructor !== GC) {\n structs.splice(index + 1, 0, splitItem(transaction, struct, id.clock - struct.id.clock + 1));\n }\n return struct\n};\n\n/**\n * Replace `item` with `newitem` in store\n * @param {StructStore} store\n * @param {GC|Item} struct\n * @param {GC|Item} newStruct\n *\n * @private\n * @function\n */\nconst replaceStruct = (store, struct, newStruct) => {\n const structs = /** @type {Array<GC|Item>} */ (store.clients.get(struct.id.client));\n structs[findIndexSS(structs, struct.id.clock)] = newStruct;\n};\n\n/**\n * Iterate over a range of structs\n *\n * @param {Transaction} transaction\n * @param {Array<Item|GC>} structs\n * @param {number} clockStart Inclusive start\n * @param {number} len\n * @param {function(GC|Item):void} f\n *\n * @function\n */\nconst iterateStructs = (transaction, structs, clockStart, len, f) => {\n if (len === 0) {\n return\n }\n const clockEnd = clockStart + len;\n let index = findIndexCleanStart(transaction, structs, clockStart);\n let struct;\n do {\n struct = structs[index++];\n if (clockEnd < struct.id.clock + struct.length) {\n findIndexCleanStart(transaction, structs, clockEnd);\n }\n f(struct);\n } while (index < structs.length && structs[index].id.clock < clockEnd)\n};\n\n/**\n * A transaction is created for every change on the Yjs model. It is possible\n * to bundle changes on the Yjs model in a single transaction to\n * minimize the number on messages sent and the number of observer calls.\n * If possible the user of this library should bundle as many changes as\n * possible. Here is an example to illustrate the advantages of bundling:\n *\n * @example\n * const ydoc = new Y.Doc()\n * const map = ydoc.getMap('map')\n * // Log content when change is triggered\n * map.observe(() => {\n * console.log('change triggered')\n * })\n * // Each change on the map type triggers a log message:\n * map.set('a', 0) // => \"change triggered\"\n * map.set('b', 0) // => \"change triggered\"\n * // When put in a transaction, it will trigger the log after the transaction:\n * ydoc.transact(() => {\n * map.set('a', 1)\n * map.set('b', 1)\n * }) // => \"change triggered\"\n *\n * @public\n */\nclass Transaction {\n /**\n * @param {Doc} doc\n * @param {any} origin\n * @param {boolean} local\n */\n constructor (doc, origin, local) {\n /**\n * The Yjs instance.\n * @type {Doc}\n */\n this.doc = doc;\n /**\n * Describes the set of deleted items by ids\n * @type {DeleteSet}\n */\n this.deleteSet = new DeleteSet();\n /**\n * Holds the state before the transaction started.\n * @type {Map<Number,Number>}\n */\n this.beforeState = getStateVector(doc.store);\n /**\n * Holds the state after the transaction.\n * @type {Map<Number,Number>}\n */\n this.afterState = new Map();\n /**\n * All types that were directly modified (property added or child\n * inserted/deleted). New types are not included in this Set.\n * Maps from type to parentSubs (`item.parentSub = null` for YArray)\n * @type {Map<AbstractType<YEvent<any>>,Set<String|null>>}\n */\n this.changed = new Map();\n /**\n * Stores the events for the types that observe also child elements.\n * It is mainly used by `observeDeep`.\n * @type {Map<AbstractType<YEvent<any>>,Array<YEvent<any>>>}\n */\n this.changedParentTypes = new Map();\n /**\n * @type {Array<AbstractStruct>}\n */\n this._mergeStructs = [];\n /**\n * @type {any}\n */\n this.origin = origin;\n /**\n * Stores meta information on the transaction\n * @type {Map<any,any>}\n */\n this.meta = new Map();\n /**\n * Whether this change originates from this doc.\n * @type {boolean}\n */\n this.local = local;\n /**\n * @type {Set<Doc>}\n */\n this.subdocsAdded = new Set();\n /**\n * @type {Set<Doc>}\n */\n this.subdocsRemoved = new Set();\n /**\n * @type {Set<Doc>}\n */\n this.subdocsLoaded = new Set();\n /**\n * @type {boolean}\n */\n this._needFormattingCleanup = false;\n }\n}\n\n/**\n * @param {UpdateEncoderV1 | UpdateEncoderV2} encoder\n * @param {Transaction} transaction\n * @return {boolean} Whether data was written.\n */\nconst writeUpdateMessageFromTransaction = (encoder, transaction) => {\n if (transaction.deleteSet.clients.size === 0 && !map.any(transaction.afterState, (clock, client) => transaction.beforeState.get(client) !== clock)) {\n return false\n }\n sortAndMergeDeleteSet(transaction.deleteSet);\n writeStructsFromTransaction(encoder, transaction);\n writeDeleteSet(encoder, transaction.deleteSet);\n return true\n};\n\n/**\n * If `type.parent` was added in current transaction, `type` technically\n * did not change, it was just added and we should not fire events for `type`.\n *\n * @param {Transaction} transaction\n * @param {AbstractType<YEvent<any>>} type\n * @param {string|null} parentSub\n */\nconst addChangedTypeToTransaction = (transaction, type, parentSub) => {\n const item = type._item;\n if (item === null || (item.id.clock < (transaction.beforeState.get(item.id.client) || 0) && !item.deleted)) {\n map.setIfUndefined(transaction.changed, type, set.create).add(parentSub);\n }\n};\n\n/**\n * @param {Array<AbstractStruct>} structs\n * @param {number} pos\n * @return {number} # of merged structs\n */\nconst tryToMergeWithLefts = (structs, pos) => {\n let right = structs[pos];\n let left = structs[pos - 1];\n let i = pos;\n for (; i > 0; right = left, left = structs[--i - 1]) {\n if (left.deleted === right.deleted && left.constructor === right.constructor) {\n if (left.mergeWith(right)) {\n if (right instanceof Item && right.parentSub !== null && /** @type {AbstractType<any>} */ (right.parent)._map.get(right.parentSub) === right) {\n /** @type {AbstractType<any>} */ (right.parent)._map.set(right.parentSub, /** @type {Item} */ (left));\n }\n continue\n }\n }\n break\n }\n const merged = pos - i;\n if (merged) {\n // remove all merged structs from the array\n structs.splice(pos + 1 - merged, merged);\n }\n return merged\n};\n\n/**\n * @param {DeleteSet} ds\n * @param {StructStore} store\n * @param {function(Item):boolean} gcFilter\n */\nconst tryGcDeleteSet = (ds, store, gcFilter) => {\n for (const [client, deleteItems] of ds.clients.entries()) {\n const structs = /** @type {Array<GC|Item>} */ (store.clients.get(client));\n for (let di = deleteItems.length - 1; di >= 0; di--) {\n const deleteItem = deleteItems[di];\n const endDeleteItemClock = deleteItem.clock + deleteItem.len;\n for (\n let si = findIndexSS(structs, deleteItem.clock), struct = structs[si];\n si < structs.length && struct.id.clock < endDeleteItemClock;\n struct = structs[++si]\n ) {\n const struct = structs[si];\n if (deleteItem.clock + deleteItem.len <= struct.id.clock) {\n break\n }\n if (struct instanceof Item && struct.deleted && !struct.keep && gcFilter(struct)) {\n struct.gc(store, false);\n }\n }\n }\n }\n};\n\n/**\n * @param {DeleteSet} ds\n * @param {StructStore} store\n */\nconst tryMergeDeleteSet = (ds, store) => {\n // try to merge deleted / gc'd items\n // merge from right to left for better efficiency and so we don't miss any merge targets\n ds.clients.forEach((deleteItems, client) => {\n const structs = /** @type {Array<GC|Item>} */ (store.clients.get(client));\n for (let di = deleteItems.length - 1; di >= 0; di--) {\n const deleteItem = deleteItems[di];\n // start with merging the item next to the last deleted item\n const mostRightIndexToCheck = math.min(structs.length - 1, 1 + findIndexSS(structs, deleteItem.clock + deleteItem.len - 1));\n for (\n let si = mostRightIndexToCheck, struct = structs[si];\n si > 0 && struct.id.clock >= deleteItem.clock;\n struct = structs[si]\n ) {\n si -= 1 + tryToMergeWithLefts(structs, si);\n }\n }\n });\n};\n\n/**\n * @param {DeleteSet} ds\n * @param {StructStore} store\n * @param {function(Item):boolean} gcFilter\n */\nconst tryGc = (ds, store, gcFilter) => {\n tryGcDeleteSet(ds, store, gcFilter);\n tryMergeDeleteSet(ds, store);\n};\n\n/**\n * @param {Array<Transaction>} transactionCleanups\n * @param {number} i\n */\nconst cleanupTransactions = (transactionCleanups, i) => {\n if (i < transactionCleanups.length) {\n const transaction = transactionCleanups[i];\n const doc = transaction.doc;\n const store = doc.store;\n const ds = transaction.deleteSet;\n const mergeStructs = transaction._mergeStructs;\n try {\n sortAndMergeDeleteSet(ds);\n transaction.afterState = getStateVector(transaction.doc.store);\n doc.emit('beforeObserverCalls', [transaction, doc]);\n /**\n * An array of event callbacks.\n *\n * Each callback is called even if the other ones throw errors.\n *\n * @type {Array<function():void>}\n */\n const fs = [];\n // observe events on changed types\n transaction.changed.forEach((subs, itemtype) =>\n fs.push(() => {\n if (itemtype._item === null || !itemtype._item.deleted) {\n itemtype._callObserver(transaction, subs);\n }\n })\n );\n fs.push(() => {\n // deep observe events\n transaction.changedParentTypes.forEach((events, type) => {\n // We need to think about the possibility that the user transforms the\n // Y.Doc in the event.\n if (type._dEH.l.length > 0 && (type._item === null || !type._item.deleted)) {\n events = events\n .filter(event =>\n event.target._item === null || !event.target._item.deleted\n );\n events\n .forEach(event => {\n event.currentTarget = type;\n // path is relative to the current target\n event._path = null;\n });\n // sort events by path length so that top-level events are fired first.\n events\n .sort((event1, event2) => event1.path.length - event2.path.length);\n // We don't need to check for events.length\n // because we know it has at least one element\n callEventHandlerListeners(type._dEH, events, transaction);\n }\n });\n });\n fs.push(() => doc.emit('afterTransaction', [transaction, doc]));\n callAll(fs, []);\n if (transaction._needFormattingCleanup) {\n cleanupYTextAfterTransaction(transaction);\n }\n } finally {\n // Replace deleted items with ItemDeleted / GC.\n // This is where content is actually remove from the Yjs Doc.\n if (doc.gc) {\n tryGcDeleteSet(ds, store, doc.gcFilter);\n }\n tryMergeDeleteSet(ds, store);\n\n // on all affected store.clients props, try to merge\n transaction.afterState.forEach((clock, client) => {\n const beforeClock = transaction.beforeState.get(client) || 0;\n if (beforeClock !== clock) {\n const structs = /** @type {Array<GC|Item>} */ (store.clients.get(client));\n // we iterate from right to left so we can safely remove entries\n const firstChangePos = math.max(findIndexSS(structs, beforeClock), 1);\n for (let i = structs.length - 1; i >= firstChangePos;) {\n i -= 1 + tryToMergeWithLefts(structs, i);\n }\n }\n });\n // try to merge mergeStructs\n // @todo: it makes more sense to transform mergeStructs to a DS, sort it, and merge from right to left\n // but at the moment DS does not handle duplicates\n for (let i = mergeStructs.length - 1; i >= 0; i--) {\n const { client, clock } = mergeStructs[i].id;\n const structs = /** @type {Array<GC|Item>} */ (store.clients.get(client));\n const replacedStructPos = findIndexSS(structs, clock);\n if (replacedStructPos + 1 < structs.length) {\n if (tryToMergeWithLefts(structs, replacedStructPos + 1) > 1) {\n continue // no need to perform next check, both are already merged\n }\n }\n if (replacedStructPos > 0) {\n tryToMergeWithLefts(structs, replacedStructPos);\n }\n }\n if (!transaction.local && transaction.afterState.get(doc.clientID) !== transaction.beforeState.get(doc.clientID)) {\n logging.print(logging.ORANGE, logging.BOLD, '[yjs] ', logging.UNBOLD, logging.RED, 'Changed the client-id because another client seems to be using it.');\n doc.clientID = generateNewClientId();\n }\n // @todo Merge all the transactions into one and provide send the data as a single update message\n doc.emit('afterTransactionCleanup', [transaction, doc]);\n if (doc._observers.has('update')) {\n const encoder = new UpdateEncoderV1();\n const hasContent = writeUpdateMessageFromTransaction(encoder, transaction);\n if (hasContent) {\n doc.emit('update', [encoder.toUint8Array(), transaction.origin, doc, transaction]);\n }\n }\n if (doc._observers.has('updateV2')) {\n const encoder = new UpdateEncoderV2();\n const hasContent = writeUpdateMessageFromTransaction(encoder, transaction);\n if (hasContent) {\n doc.emit('updateV2', [encoder.toUint8Array(), transaction.origin, doc, transaction]);\n }\n }\n const { subdocsAdded, subdocsLoaded, subdocsRemoved } = transaction;\n if (subdocsAdded.size > 0 || subdocsRemoved.size > 0 || subdocsLoaded.size > 0) {\n subdocsAdded.forEach(subdoc => {\n subdoc.clientID = doc.clientID;\n if (subdoc.collectionid == null) {\n subdoc.collectionid = doc.collectionid;\n }\n doc.subdocs.add(subdoc);\n });\n subdocsRemoved.forEach(subdoc => doc.subdocs.delete(subdoc));\n doc.emit('subdocs', [{ loaded: subdocsLoaded, added: subdocsAdded, removed: subdocsRemoved }, doc, transaction]);\n subdocsRemoved.forEach(subdoc => subdoc.destroy());\n }\n\n if (transactionCleanups.length <= i + 1) {\n doc._transactionCleanups = [];\n doc.emit('afterAllTransactions', [doc, transactionCleanups]);\n } else {\n cleanupTransactions(transactionCleanups, i + 1);\n }\n }\n }\n};\n\n/**\n * Implements the functionality of `y.transact(()=>{..})`\n *\n * @template T\n * @param {Doc} doc\n * @param {function(Transaction):T} f\n * @param {any} [origin=true]\n * @return {T}\n *\n * @function\n */\nconst transact = (doc, f, origin = null, local = true) => {\n const transactionCleanups = doc._transactionCleanups;\n let initialCall = false;\n /**\n * @type {any}\n */\n let result = null;\n if (doc._transaction === null) {\n initialCall = true;\n doc._transaction = new Transaction(doc, origin, local);\n transactionCleanups.push(doc._transaction);\n if (transactionCleanups.length === 1) {\n doc.emit('beforeAllTransactions', [doc]);\n }\n doc.emit('beforeTransaction', [doc._transaction, doc]);\n }\n try {\n result = f(doc._transaction);\n } finally {\n if (initialCall) {\n const finishCleanup = doc._transaction === transactionCleanups[0];\n doc._transaction = null;\n if (finishCleanup) {\n // The first transaction ended, now process observer calls.\n // Observer call may create new transactions for which we need to call the observers and do cleanup.\n // We don't want to nest these calls, so we execute these calls one after\n // another.\n // Also we need to ensure that all cleanups are called, even if the\n // observes throw errors.\n // This file is full of hacky try {} finally {} blocks to ensure that an\n // event can throw errors and also that the cleanup is called.\n cleanupTransactions(transactionCleanups, 0);\n }\n }\n }\n return result\n};\n\nclass StackItem {\n /**\n * @param {DeleteSet} deletions\n * @param {DeleteSet} insertions\n */\n constructor (deletions, insertions) {\n this.insertions = insertions;\n this.deletions = deletions;\n /**\n * Use this to save and restore metadata like selection range\n */\n this.meta = new Map();\n }\n}\n/**\n * @param {Transaction} tr\n * @param {UndoManager} um\n * @param {StackItem} stackItem\n */\nconst clearUndoManagerStackItem = (tr, um, stackItem) => {\n iterateDeletedStructs(tr, stackItem.deletions, item => {\n if (item instanceof Item && um.scope.some(type => type === tr.doc || isParentOf(/** @type {AbstractType<any>} */ (type), item))) {\n keepItem(item, false);\n }\n });\n};\n\n/**\n * @param {UndoManager} undoManager\n * @param {Array<StackItem>} stack\n * @param {'undo'|'redo'} eventType\n * @return {StackItem?}\n */\nconst popStackItem = (undoManager, stack, eventType) => {\n /**\n * Keep a reference to the transaction so we can fire the event with the changedParentTypes\n * @type {any}\n */\n let _tr = null;\n const doc = undoManager.doc;\n const scope = undoManager.scope;\n transact(doc, transaction => {\n while (stack.length > 0 && undoManager.currStackItem === null) {\n const store = doc.store;\n const stackItem = /** @type {StackItem} */ (stack.pop());\n /**\n * @type {Set<Item>}\n */\n const itemsToRedo = new Set();\n /**\n * @type {Array<Item>}\n */\n const itemsToDelete = [];\n let performedChange = false;\n iterateDeletedStructs(transaction, stackItem.insertions, struct => {\n if (struct instanceof Item) {\n if (struct.redone !== null) {\n let { item, diff } = followRedone(store, struct.id);\n if (diff > 0) {\n item = getItemCleanStart(transaction, createID(item.id.client, item.id.clock + diff));\n }\n struct = item;\n }\n if (!struct.deleted && scope.some(type => type === transaction.doc || isParentOf(/** @type {AbstractType<any>} */ (type), /** @type {Item} */ (struct)))) {\n itemsToDelete.push(struct);\n }\n }\n });\n iterateDeletedStructs(transaction, stackItem.deletions, struct => {\n if (\n struct instanceof Item &&\n scope.some(type => type === transaction.doc || isParentOf(/** @type {AbstractType<any>} */ (type), struct)) &&\n // Never redo structs in stackItem.insertions because they were created and deleted in the same capture interval.\n !isDeleted(stackItem.insertions, struct.id)\n ) {\n itemsToRedo.add(struct);\n }\n });\n itemsToRedo.forEach(struct => {\n performedChange = redoItem(transaction, struct, itemsToRedo, stackItem.insertions, undoManager.ignoreRemoteMapChanges, undoManager) !== null || performedChange;\n });\n // We want to delete in reverse order so that children are deleted before\n // parents, so we have more information available when items are filtered.\n for (let i = itemsToDelete.length - 1; i >= 0; i--) {\n const item = itemsToDelete[i];\n if (undoManager.deleteFilter(item)) {\n item.delete(transaction);\n performedChange = true;\n }\n }\n undoManager.currStackItem = performedChange ? stackItem : null;\n }\n transaction.changed.forEach((subProps, type) => {\n // destroy search marker if necessary\n if (subProps.has(null) && type._searchMarker) {\n type._searchMarker.length = 0;\n }\n });\n _tr = transaction;\n }, undoManager);\n const res = undoManager.currStackItem;\n if (res != null) {\n const changedParentTypes = _tr.changedParentTypes;\n undoManager.emit('stack-item-popped', [{ stackItem: res, type: eventType, changedParentTypes, origin: undoManager }, undoManager]);\n undoManager.currStackItem = null;\n }\n return res\n};\n\n/**\n * @typedef {Object} UndoManagerOptions\n * @property {number} [UndoManagerOptions.captureTimeout=500]\n * @property {function(Transaction):boolean} [UndoManagerOptions.captureTransaction] Do not capture changes of a Transaction if result false.\n * @property {function(Item):boolean} [UndoManagerOptions.deleteFilter=()=>true] Sometimes\n * it is necessary to filter what an Undo/Redo operation can delete. If this\n * filter returns false, the type/item won't be deleted even it is in the\n * undo/redo scope.\n * @property {Set<any>} [UndoManagerOptions.trackedOrigins=new Set([null])]\n * @property {boolean} [ignoreRemoteMapChanges] Experimental. By default, the UndoManager will never overwrite remote changes. Enable this property to enable overwriting remote changes on key-value changes (Y.Map, properties on Y.Xml, etc..).\n * @property {Doc} [doc] The document that this UndoManager operates on. Only needed if typeScope is empty.\n */\n\n/**\n * @typedef {Object} StackItemEvent\n * @property {StackItem} StackItemEvent.stackItem\n * @property {any} StackItemEvent.origin\n * @property {'undo'|'redo'} StackItemEvent.type\n * @property {Map<AbstractType<YEvent<any>>,Array<YEvent<any>>>} StackItemEvent.changedParentTypes\n */\n\n/**\n * Fires 'stack-item-added' event when a stack item was added to either the undo- or\n * the redo-stack. You may store additional stack information via the\n * metadata property on `event.stackItem.meta` (it is a `Map` of metadata properties).\n * Fires 'stack-item-popped' event when a stack item was popped from either the\n * undo- or the redo-stack. You may restore the saved stack information from `event.stackItem.meta`.\n *\n * @extends {ObservableV2<{'stack-item-added':function(StackItemEvent, UndoManager):void, 'stack-item-popped': function(StackItemEvent, UndoManager):void, 'stack-cleared': function({ undoStackCleared: boolean, redoStackCleared: boolean }):void, 'stack-item-updated': function(StackItemEvent, UndoManager):void }>}\n */\nclass UndoManager extends ObservableV2 {\n /**\n * @param {Doc|AbstractType<any>|Array<AbstractType<any>>} typeScope Limits the scope of the UndoManager. If this is set to a ydoc instance, all changes on that ydoc will be undone. If set to a specific type, only changes on that type or its children will be undone. Also accepts an array of types.\n * @param {UndoManagerOptions} options\n */\n constructor (typeScope, {\n captureTimeout = 500,\n captureTransaction = _tr => true,\n deleteFilter = () => true,\n trackedOrigins = new Set([null]),\n ignoreRemoteMapChanges = false,\n doc = /** @type {Doc} */ (array.isArray(typeScope) ? typeScope[0].doc : typeScope instanceof Doc ? typeScope : typeScope.doc)\n } = {}) {\n super();\n /**\n * @type {Array<AbstractType<any> | Doc>}\n */\n this.scope = [];\n this.doc = doc;\n this.addToScope(typeScope);\n this.deleteFilter = deleteFilter;\n trackedOrigins.add(this);\n this.trackedOrigins = trackedOrigins;\n this.captureTransaction = captureTransaction;\n /**\n * @type {Array<StackItem>}\n */\n this.undoStack = [];\n /**\n * @type {Array<StackItem>}\n */\n this.redoStack = [];\n /**\n * Whether the client is currently undoing (calling UndoManager.undo)\n *\n * @type {boolean}\n */\n this.undoing = false;\n this.redoing = false;\n /**\n * The currently popped stack item if UndoManager.undoing or UndoManager.redoing\n *\n * @type {StackItem|null}\n */\n this.currStackItem = null;\n this.lastChange = 0;\n this.ignoreRemoteMapChanges = ignoreRemoteMapChanges;\n this.captureTimeout = captureTimeout;\n /**\n * @param {Transaction} transaction\n */\n this.afterTransactionHandler = transaction => {\n // Only track certain transactions\n if (\n !this.captureTransaction(transaction) ||\n !this.scope.some(type => transaction.changedParentTypes.has(/** @type {AbstractType<any>} */ (type)) || type === this.doc) ||\n (!this.trackedOrigins.has(transaction.origin) && (!transaction.origin || !this.trackedOrigins.has(transaction.origin.constructor)))\n ) {\n return\n }\n const undoing = this.undoing;\n const redoing = this.redoing;\n const stack = undoing ? this.redoStack : this.undoStack;\n if (undoing) {\n this.stopCapturing(); // next undo should not be appended to last stack item\n } else if (!redoing) {\n // neither undoing nor redoing: delete redoStack\n this.clear(false, true);\n }\n const insertions = new DeleteSet();\n transaction.afterState.forEach((endClock, client) => {\n const startClock = transaction.beforeState.get(client) || 0;\n const len = endClock - startClock;\n if (len > 0) {\n addToDeleteSet(insertions, client, startClock, len);\n }\n });\n const now = time.getUnixTime();\n let didAdd = false;\n if (this.lastChange > 0 && now - this.lastChange < this.captureTimeout && stack.length > 0 && !undoing && !redoing) {\n // append change to last stack op\n const lastOp = stack[stack.length - 1];\n lastOp.deletions = mergeDeleteSets([lastOp.deletions, transaction.deleteSet]);\n lastOp.insertions = mergeDeleteSets([lastOp.insertions, insertions]);\n } else {\n // create a new stack op\n stack.push(new StackItem(transaction.deleteSet, insertions));\n didAdd = true;\n }\n if (!undoing && !redoing) {\n this.lastChange = now;\n }\n // make sure that deleted structs are not gc'd\n iterateDeletedStructs(transaction, transaction.deleteSet, /** @param {Item|GC} item */ item => {\n if (item instanceof Item && this.scope.some(type => type === transaction.doc || isParentOf(/** @type {AbstractType<any>} */ (type), item))) {\n keepItem(item, true);\n }\n });\n /**\n * @type {[StackItemEvent, UndoManager]}\n */\n const changeEvent = [{ stackItem: stack[stack.length - 1], origin: transaction.origin, type: undoing ? 'redo' : 'undo', changedParentTypes: transaction.changedParentTypes }, this];\n if (didAdd) {\n this.emit('stack-item-added', changeEvent);\n } else {\n this.emit('stack-item-updated', changeEvent);\n }\n };\n this.doc.on('afterTransaction', this.afterTransactionHandler);\n this.doc.on('destroy', () => {\n this.destroy();\n });\n }\n\n /**\n * Extend the scope.\n *\n * @param {Array<AbstractType<any> | Doc> | AbstractType<any> | Doc} ytypes\n */\n addToScope (ytypes) {\n const tmpSet = new Set(this.scope);\n ytypes = array.isArray(ytypes) ? ytypes : [ytypes];\n ytypes.forEach(ytype => {\n if (!tmpSet.has(ytype)) {\n tmpSet.add(ytype);\n if (ytype instanceof AbstractType ? ytype.doc !== this.doc : ytype !== this.doc) logging.warn('[yjs#509] Not same Y.Doc'); // use MultiDocUndoManager instead. also see https://github.com/yjs/yjs/issues/509\n this.scope.push(ytype);\n }\n });\n }\n\n /**\n * @param {any} origin\n */\n addTrackedOrigin (origin) {\n this.trackedOrigins.add(origin);\n }\n\n /**\n * @param {any} origin\n */\n removeTrackedOrigin (origin) {\n this.trackedOrigins.delete(origin);\n }\n\n clear (clearUndoStack = true, clearRedoStack = true) {\n if ((clearUndoStack && this.canUndo()) || (clearRedoStack && this.canRedo())) {\n this.doc.transact(tr => {\n if (clearUndoStack) {\n this.undoStack.forEach(item => clearUndoManagerStackItem(tr, this, item));\n this.undoStack = [];\n }\n if (clearRedoStack) {\n this.redoStack.forEach(item => clearUndoManagerStackItem(tr, this, item));\n this.redoStack = [];\n }\n this.emit('stack-cleared', [{ undoStackCleared: clearUndoStack, redoStackCleared: clearRedoStack }]);\n });\n }\n }\n\n /**\n * UndoManager merges Undo-StackItem if they are created within time-gap\n * smaller than `options.captureTimeout`. Call `um.stopCapturing()` so that the next\n * StackItem won't be merged.\n *\n *\n * @example\n * // without stopCapturing\n * ytext.insert(0, 'a')\n * ytext.insert(1, 'b')\n * um.undo()\n * ytext.toString() // => '' (note that 'ab' was removed)\n * // with stopCapturing\n * ytext.insert(0, 'a')\n * um.stopCapturing()\n * ytext.insert(0, 'b')\n * um.undo()\n * ytext.toString() // => 'a' (note that only 'b' was removed)\n *\n */\n stopCapturing () {\n this.lastChange = 0;\n }\n\n /**\n * Undo last changes on type.\n *\n * @return {StackItem?} Returns StackItem if a change was applied\n */\n undo () {\n this.undoing = true;\n let res;\n try {\n res = popStackItem(this, this.undoStack, 'undo');\n } finally {\n this.undoing = false;\n }\n return res\n }\n\n /**\n * Redo last undo operation.\n *\n * @return {StackItem?} Returns StackItem if a change was applied\n */\n redo () {\n this.redoing = true;\n let res;\n try {\n res = popStackItem(this, this.redoStack, 'redo');\n } finally {\n this.redoing = false;\n }\n return res\n }\n\n /**\n * Are undo steps available?\n *\n * @return {boolean} `true` if undo is possible\n */\n canUndo () {\n return this.undoStack.length > 0\n }\n\n /**\n * Are redo steps available?\n *\n * @return {boolean} `true` if redo is possible\n */\n canRedo () {\n return this.redoStack.length > 0\n }\n\n destroy () {\n this.trackedOrigins.delete(this);\n this.doc.off('afterTransaction', this.afterTransactionHandler);\n super.destroy();\n }\n}\n\n/**\n * @param {UpdateDecoderV1 | UpdateDecoderV2} decoder\n */\nfunction * lazyStructReaderGenerator (decoder) {\n const numOfStateUpdates = decoding.readVarUint(decoder.restDecoder);\n for (let i = 0; i < numOfStateUpdates; i++) {\n const numberOfStructs = decoding.readVarUint(decoder.restDecoder);\n const client = decoder.readClient();\n let clock = decoding.readVarUint(decoder.restDecoder);\n for (let i = 0; i < numberOfStructs; i++) {\n const info = decoder.readInfo();\n // @todo use switch instead of ifs\n if (info === 10) {\n const len = decoding.readVarUint(decoder.restDecoder);\n yield new Skip(createID(client, clock), len);\n clock += len;\n } else if ((binary.BITS5 & info) !== 0) {\n const cantCopyParentInfo = (info & (binary.BIT7 | binary.BIT8)) === 0;\n // If parent = null and neither left nor right are defined, then we know that `parent` is child of `y`\n // and we read the next string as parentYKey.\n // It indicates how we store/retrieve parent from `y.share`\n // @type {string|null}\n const struct = new Item(\n createID(client, clock),\n null, // left\n (info & binary.BIT8) === binary.BIT8 ? decoder.readLeftID() : null, // origin\n null, // right\n (info & binary.BIT7) === binary.BIT7 ? decoder.readRightID() : null, // right origin\n // @ts-ignore Force writing a string here.\n cantCopyParentInfo ? (decoder.readParentInfo() ? decoder.readString() : decoder.readLeftID()) : null, // parent\n cantCopyParentInfo && (info & binary.BIT6) === binary.BIT6 ? decoder.readString() : null, // parentSub\n readItemContent(decoder, info) // item content\n );\n yield struct;\n clock += struct.length;\n } else {\n const len = decoder.readLen();\n yield new GC(createID(client, clock), len);\n clock += len;\n }\n }\n }\n}\n\nclass LazyStructReader {\n /**\n * @param {UpdateDecoderV1 | UpdateDecoderV2} decoder\n * @param {boolean} filterSkips\n */\n constructor (decoder, filterSkips) {\n this.gen = lazyStructReaderGenerator(decoder);\n /**\n * @type {null | Item | Skip | GC}\n */\n this.curr = null;\n this.done = false;\n this.filterSkips = filterSkips;\n this.next();\n }\n\n /**\n * @return {Item | GC | Skip |null}\n */\n next () {\n // ignore \"Skip\" structs\n do {\n this.curr = this.gen.next().value || null;\n } while (this.filterSkips && this.curr !== null && this.curr.constructor === Skip)\n return this.curr\n }\n}\n\n/**\n * @param {Uint8Array} update\n *\n */\nconst logUpdate = update => logUpdateV2(update, UpdateDecoderV1);\n\n/**\n * @param {Uint8Array} update\n * @param {typeof UpdateDecoderV2 | typeof UpdateDecoderV1} [YDecoder]\n *\n */\nconst logUpdateV2 = (update, YDecoder = UpdateDecoderV2) => {\n const structs = [];\n const updateDecoder = new YDecoder(decoding.createDecoder(update));\n const lazyDecoder = new LazyStructReader(updateDecoder, false);\n for (let curr = lazyDecoder.curr; curr !== null; curr = lazyDecoder.next()) {\n structs.push(curr);\n }\n logging.print('Structs: ', structs);\n const ds = readDeleteSet(updateDecoder);\n logging.print('DeleteSet: ', ds);\n};\n\n/**\n * @param {Uint8Array} update\n *\n */\nconst decodeUpdate = (update) => decodeUpdateV2(update, UpdateDecoderV1);\n\n/**\n * @param {Uint8Array} update\n * @param {typeof UpdateDecoderV2 | typeof UpdateDecoderV1} [YDecoder]\n *\n */\nconst decodeUpdateV2 = (update, YDecoder = UpdateDecoderV2) => {\n const structs = [];\n const updateDecoder = new YDecoder(decoding.createDecoder(update));\n const lazyDecoder = new LazyStructReader(updateDecoder, false);\n for (let curr = lazyDecoder.curr; curr !== null; curr = lazyDecoder.next()) {\n structs.push(curr);\n }\n return {\n structs,\n ds: readDeleteSet(updateDecoder)\n }\n};\n\nclass LazyStructWriter {\n /**\n * @param {UpdateEncoderV1 | UpdateEncoderV2} encoder\n */\n constructor (encoder) {\n this.currClient = 0;\n this.startClock = 0;\n this.written = 0;\n this.encoder = encoder;\n /**\n * We want to write operations lazily, but also we need to know beforehand how many operations we want to write for each client.\n *\n * This kind of meta-information (#clients, #structs-per-client-written) is written to the restEncoder.\n *\n * We fragment the restEncoder and store a slice of it per-client until we know how many clients there are.\n * When we flush (toUint8Array) we write the restEncoder using the fragments and the meta-information.\n *\n * @type {Array<{ written: number, restEncoder: Uint8Array }>}\n */\n this.clientStructs = [];\n }\n}\n\n/**\n * @param {Array<Uint8Array>} updates\n * @return {Uint8Array}\n */\nconst mergeUpdates = updates => mergeUpdatesV2(updates, UpdateDecoderV1, UpdateEncoderV1);\n\n/**\n * @param {Uint8Array} update\n * @param {typeof DSEncoderV1 | typeof DSEncoderV2} YEncoder\n * @param {typeof UpdateDecoderV1 | typeof UpdateDecoderV2} YDecoder\n * @return {Uint8Array}\n */\nconst encodeStateVectorFromUpdateV2 = (update, YEncoder = DSEncoderV2, YDecoder = UpdateDecoderV2) => {\n const encoder = new YEncoder();\n const updateDecoder = new LazyStructReader(new YDecoder(decoding.createDecoder(update)), false);\n let curr = updateDecoder.curr;\n if (curr !== null) {\n let size = 0;\n let currClient = curr.id.client;\n let stopCounting = curr.id.clock !== 0; // must start at 0\n let currClock = stopCounting ? 0 : curr.id.clock + curr.length;\n for (; curr !== null; curr = updateDecoder.next()) {\n if (currClient !== curr.id.client) {\n if (currClock !== 0) {\n size++;\n // We found a new client\n // write what we have to the encoder\n encoding.writeVarUint(encoder.restEncoder, currClient);\n encoding.writeVarUint(encoder.restEncoder, currClock);\n }\n currClient = curr.id.client;\n currClock = 0;\n stopCounting = curr.id.clock !== 0;\n }\n // we ignore skips\n if (curr.constructor === Skip) {\n stopCounting = true;\n }\n if (!stopCounting) {\n currClock = curr.id.clock + curr.length;\n }\n }\n // write what we have\n if (currClock !== 0) {\n size++;\n encoding.writeVarUint(encoder.restEncoder, currClient);\n encoding.writeVarUint(encoder.restEncoder, currClock);\n }\n // prepend the size of the state vector\n const enc = encoding.createEncoder();\n encoding.writeVarUint(enc, size);\n encoding.writeBinaryEncoder(enc, encoder.restEncoder);\n encoder.restEncoder = enc;\n return encoder.toUint8Array()\n } else {\n encoding.writeVarUint(encoder.restEncoder, 0);\n return encoder.toUint8Array()\n }\n};\n\n/**\n * @param {Uint8Array} update\n * @return {Uint8Array}\n */\nconst encodeStateVectorFromUpdate = update => encodeStateVectorFromUpdateV2(update, DSEncoderV1, UpdateDecoderV1);\n\n/**\n * @param {Uint8Array} update\n * @param {typeof UpdateDecoderV1 | typeof UpdateDecoderV2} YDecoder\n * @return {{ from: Map<number,number>, to: Map<number,number> }}\n */\nconst parseUpdateMetaV2 = (update, YDecoder = UpdateDecoderV2) => {\n /**\n * @type {Map<number, number>}\n */\n const from = new Map();\n /**\n * @type {Map<number, number>}\n */\n const to = new Map();\n const updateDecoder = new LazyStructReader(new YDecoder(decoding.createDecoder(update)), false);\n let curr = updateDecoder.curr;\n if (curr !== null) {\n let currClient = curr.id.client;\n let currClock = curr.id.clock;\n // write the beginning to `from`\n from.set(currClient, currClock);\n for (; curr !== null; curr = updateDecoder.next()) {\n if (currClient !== curr.id.client) {\n // We found a new client\n // write the end to `to`\n to.set(currClient, currClock);\n // write the beginning to `from`\n from.set(curr.id.client, curr.id.clock);\n // update currClient\n currClient = curr.id.client;\n }\n currClock = curr.id.clock + curr.length;\n }\n // write the end to `to`\n to.set(currClient, currClock);\n }\n return { from, to }\n};\n\n/**\n * @param {Uint8Array} update\n * @return {{ from: Map<number,number>, to: Map<number,number> }}\n */\nconst parseUpdateMeta = update => parseUpdateMetaV2(update, UpdateDecoderV1);\n\n/**\n * This method is intended to slice any kind of struct and retrieve the right part.\n * It does not handle side-effects, so it should only be used by the lazy-encoder.\n *\n * @param {Item | GC | Skip} left\n * @param {number} diff\n * @return {Item | GC}\n */\nconst sliceStruct = (left, diff) => {\n if (left.constructor === GC) {\n const { client, clock } = left.id;\n return new GC(createID(client, clock + diff), left.length - diff)\n } else if (left.constructor === Skip) {\n const { client, clock } = left.id;\n return new Skip(createID(client, clock + diff), left.length - diff)\n } else {\n const leftItem = /** @type {Item} */ (left);\n const { client, clock } = leftItem.id;\n return new Item(\n createID(client, clock + diff),\n null,\n createID(client, clock + diff - 1),\n null,\n leftItem.rightOrigin,\n leftItem.parent,\n leftItem.parentSub,\n leftItem.content.splice(diff)\n )\n }\n};\n\n/**\n *\n * This function works similarly to `readUpdateV2`.\n *\n * @param {Array<Uint8Array>} updates\n * @param {typeof UpdateDecoderV1 | typeof UpdateDecoderV2} [YDecoder]\n * @param {typeof UpdateEncoderV1 | typeof UpdateEncoderV2} [YEncoder]\n * @return {Uint8Array}\n */\nconst mergeUpdatesV2 = (updates, YDecoder = UpdateDecoderV2, YEncoder = UpdateEncoderV2) => {\n if (updates.length === 1) {\n return updates[0]\n }\n const updateDecoders = updates.map(update => new YDecoder(decoding.createDecoder(update)));\n let lazyStructDecoders = updateDecoders.map(decoder => new LazyStructReader(decoder, true));\n\n /**\n * @todo we don't need offset because we always slice before\n * @type {null | { struct: Item | GC | Skip, offset: number }}\n */\n let currWrite = null;\n\n const updateEncoder = new YEncoder();\n // write structs lazily\n const lazyStructEncoder = new LazyStructWriter(updateEncoder);\n\n // Note: We need to ensure that all lazyStructDecoders are fully consumed\n // Note: Should merge document updates whenever possible - even from different updates\n // Note: Should handle that some operations cannot be applied yet ()\n\n while (true) {\n // Write higher clients first ⇒ sort by clientID & clock and remove decoders without content\n lazyStructDecoders = lazyStructDecoders.filter(dec => dec.curr !== null);\n lazyStructDecoders.sort(\n /** @type {function(any,any):number} */ (dec1, dec2) => {\n if (dec1.curr.id.client === dec2.curr.id.client) {\n const clockDiff = dec1.curr.id.clock - dec2.curr.id.clock;\n if (clockDiff === 0) {\n // @todo remove references to skip since the structDecoders must filter Skips.\n return dec1.curr.constructor === dec2.curr.constructor\n ? 0\n : dec1.curr.constructor === Skip ? 1 : -1 // we are filtering skips anyway.\n } else {\n return clockDiff\n }\n } else {\n return dec2.curr.id.client - dec1.curr.id.client\n }\n }\n );\n if (lazyStructDecoders.length === 0) {\n break\n }\n const currDecoder = lazyStructDecoders[0];\n // write from currDecoder until the next operation is from another client or if filler-struct\n // then we need to reorder the decoders and find the next operation to write\n const firstClient = /** @type {Item | GC} */ (currDecoder.curr).id.client;\n\n if (currWrite !== null) {\n let curr = /** @type {Item | GC | null} */ (currDecoder.curr);\n let iterated = false;\n\n // iterate until we find something that we haven't written already\n // remember: first the high client-ids are written\n while (curr !== null && curr.id.clock + curr.length <= currWrite.struct.id.clock + currWrite.struct.length && curr.id.client >= currWrite.struct.id.client) {\n curr = currDecoder.next();\n iterated = true;\n }\n if (\n curr === null || // current decoder is empty\n curr.id.client !== firstClient || // check whether there is another decoder that has has updates from `firstClient`\n (iterated && curr.id.clock > currWrite.struct.id.clock + currWrite.struct.length) // the above while loop was used and we are potentially missing updates\n ) {\n continue\n }\n\n if (firstClient !== currWrite.struct.id.client) {\n writeStructToLazyStructWriter(lazyStructEncoder, currWrite.struct, currWrite.offset);\n currWrite = { struct: curr, offset: 0 };\n currDecoder.next();\n } else {\n if (currWrite.struct.id.clock + currWrite.struct.length < curr.id.clock) {\n // @todo write currStruct & set currStruct = Skip(clock = currStruct.id.clock + currStruct.length, length = curr.id.clock - self.clock)\n if (currWrite.struct.constructor === Skip) {\n // extend existing skip\n currWrite.struct.length = curr.id.clock + curr.length - currWrite.struct.id.clock;\n } else {\n writeStructToLazyStructWriter(lazyStructEncoder, currWrite.struct, currWrite.offset);\n const diff = curr.id.clock - currWrite.struct.id.clock - currWrite.struct.length;\n /**\n * @type {Skip}\n */\n const struct = new Skip(createID(firstClient, currWrite.struct.id.clock + currWrite.struct.length), diff);\n currWrite = { struct, offset: 0 };\n }\n } else { // if (currWrite.struct.id.clock + currWrite.struct.length >= curr.id.clock) {\n const diff = currWrite.struct.id.clock + currWrite.struct.length - curr.id.clock;\n if (diff > 0) {\n if (currWrite.struct.constructor === Skip) {\n // prefer to slice Skip because the other struct might contain more information\n currWrite.struct.length -= diff;\n } else {\n curr = sliceStruct(curr, diff);\n }\n }\n if (!currWrite.struct.mergeWith(/** @type {any} */ (curr))) {\n writeStructToLazyStructWriter(lazyStructEncoder, currWrite.struct, currWrite.offset);\n currWrite = { struct: curr, offset: 0 };\n currDecoder.next();\n }\n }\n }\n } else {\n currWrite = { struct: /** @type {Item | GC} */ (currDecoder.curr), offset: 0 };\n currDecoder.next();\n }\n for (\n let next = currDecoder.curr;\n next !== null && next.id.client === firstClient && next.id.clock === currWrite.struct.id.clock + currWrite.struct.length && next.constructor !== Skip;\n next = currDecoder.next()\n ) {\n writeStructToLazyStructWriter(lazyStructEncoder, currWrite.struct, currWrite.offset);\n currWrite = { struct: next, offset: 0 };\n }\n }\n if (currWrite !== null) {\n writeStructToLazyStructWriter(lazyStructEncoder, currWrite.struct, currWrite.offset);\n currWrite = null;\n }\n finishLazyStructWriting(lazyStructEncoder);\n\n const dss = updateDecoders.map(decoder => readDeleteSet(decoder));\n const ds = mergeDeleteSets(dss);\n writeDeleteSet(updateEncoder, ds);\n return updateEncoder.toUint8Array()\n};\n\n/**\n * @param {Uint8Array} update\n * @param {Uint8Array} sv\n * @param {typeof UpdateDecoderV1 | typeof UpdateDecoderV2} [YDecoder]\n * @param {typeof UpdateEncoderV1 | typeof UpdateEncoderV2} [YEncoder]\n */\nconst diffUpdateV2 = (update, sv, YDecoder = UpdateDecoderV2, YEncoder = UpdateEncoderV2) => {\n const state = decodeStateVector(sv);\n const encoder = new YEncoder();\n const lazyStructWriter = new LazyStructWriter(encoder);\n const decoder = new YDecoder(decoding.createDecoder(update));\n const reader = new LazyStructReader(decoder, false);\n while (reader.curr) {\n const curr = reader.curr;\n const currClient = curr.id.client;\n const svClock = state.get(currClient) || 0;\n if (reader.curr.constructor === Skip) {\n // the first written struct shouldn't be a skip\n reader.next();\n continue\n }\n if (curr.id.clock + curr.length > svClock) {\n writeStructToLazyStructWriter(lazyStructWriter, curr, math.max(svClock - curr.id.clock, 0));\n reader.next();\n while (reader.curr && reader.curr.id.client === currClient) {\n writeStructToLazyStructWriter(lazyStructWriter, reader.curr, 0);\n reader.next();\n }\n } else {\n // read until something new comes up\n while (reader.curr && reader.curr.id.client === currClient && reader.curr.id.clock + reader.curr.length <= svClock) {\n reader.next();\n }\n }\n }\n finishLazyStructWriting(lazyStructWriter);\n // write ds\n const ds = readDeleteSet(decoder);\n writeDeleteSet(encoder, ds);\n return encoder.toUint8Array()\n};\n\n/**\n * @param {Uint8Array} update\n * @param {Uint8Array} sv\n */\nconst diffUpdate = (update, sv) => diffUpdateV2(update, sv, UpdateDecoderV1, UpdateEncoderV1);\n\n/**\n * @param {LazyStructWriter} lazyWriter\n */\nconst flushLazyStructWriter = lazyWriter => {\n if (lazyWriter.written > 0) {\n lazyWriter.clientStructs.push({ written: lazyWriter.written, restEncoder: encoding.toUint8Array(lazyWriter.encoder.restEncoder) });\n lazyWriter.encoder.restEncoder = encoding.createEncoder();\n lazyWriter.written = 0;\n }\n};\n\n/**\n * @param {LazyStructWriter} lazyWriter\n * @param {Item | GC} struct\n * @param {number} offset\n */\nconst writeStructToLazyStructWriter = (lazyWriter, struct, offset) => {\n // flush curr if we start another client\n if (lazyWriter.written > 0 && lazyWriter.currClient !== struct.id.client) {\n flushLazyStructWriter(lazyWriter);\n }\n if (lazyWriter.written === 0) {\n lazyWriter.currClient = struct.id.client;\n // write next client\n lazyWriter.encoder.writeClient(struct.id.client);\n // write startClock\n encoding.writeVarUint(lazyWriter.encoder.restEncoder, struct.id.clock + offset);\n }\n struct.write(lazyWriter.encoder, offset);\n lazyWriter.written++;\n};\n/**\n * Call this function when we collected all parts and want to\n * put all the parts together. After calling this method,\n * you can continue using the UpdateEncoder.\n *\n * @param {LazyStructWriter} lazyWriter\n */\nconst finishLazyStructWriting = (lazyWriter) => {\n flushLazyStructWriter(lazyWriter);\n\n // this is a fresh encoder because we called flushCurr\n const restEncoder = lazyWriter.encoder.restEncoder;\n\n /**\n * Now we put all the fragments together.\n * This works similarly to `writeClientsStructs`\n */\n\n // write # states that were updated - i.e. the clients\n encoding.writeVarUint(restEncoder, lazyWriter.clientStructs.length);\n\n for (let i = 0; i < lazyWriter.clientStructs.length; i++) {\n const partStructs = lazyWriter.clientStructs[i];\n /**\n * Works similarly to `writeStructs`\n */\n // write # encoded structs\n encoding.writeVarUint(restEncoder, partStructs.written);\n // write the rest of the fragment\n encoding.writeUint8Array(restEncoder, partStructs.restEncoder);\n }\n};\n\n/**\n * @param {Uint8Array} update\n * @param {function(Item|GC|Skip):Item|GC|Skip} blockTransformer\n * @param {typeof UpdateDecoderV2 | typeof UpdateDecoderV1} YDecoder\n * @param {typeof UpdateEncoderV2 | typeof UpdateEncoderV1 } YEncoder\n */\nconst convertUpdateFormat = (update, blockTransformer, YDecoder, YEncoder) => {\n const updateDecoder = new YDecoder(decoding.createDecoder(update));\n const lazyDecoder = new LazyStructReader(updateDecoder, false);\n const updateEncoder = new YEncoder();\n const lazyWriter = new LazyStructWriter(updateEncoder);\n for (let curr = lazyDecoder.curr; curr !== null; curr = lazyDecoder.next()) {\n writeStructToLazyStructWriter(lazyWriter, blockTransformer(curr), 0);\n }\n finishLazyStructWriting(lazyWriter);\n const ds = readDeleteSet(updateDecoder);\n writeDeleteSet(updateEncoder, ds);\n return updateEncoder.toUint8Array()\n};\n\n/**\n * @typedef {Object} ObfuscatorOptions\n * @property {boolean} [ObfuscatorOptions.formatting=true]\n * @property {boolean} [ObfuscatorOptions.subdocs=true]\n * @property {boolean} [ObfuscatorOptions.yxml=true] Whether to obfuscate nodeName / hookName\n */\n\n/**\n * @param {ObfuscatorOptions} obfuscator\n */\nconst createObfuscator = ({ formatting = true, subdocs = true, yxml = true } = {}) => {\n let i = 0;\n const mapKeyCache = map.create();\n const nodeNameCache = map.create();\n const formattingKeyCache = map.create();\n const formattingValueCache = map.create();\n formattingValueCache.set(null, null); // end of a formatting range should always be the end of a formatting range\n /**\n * @param {Item|GC|Skip} block\n * @return {Item|GC|Skip}\n */\n return block => {\n switch (block.constructor) {\n case GC:\n case Skip:\n return block\n case Item: {\n const item = /** @type {Item} */ (block);\n const content = item.content;\n switch (content.constructor) {\n case ContentDeleted:\n break\n case ContentType: {\n if (yxml) {\n const type = /** @type {ContentType} */ (content).type;\n if (type instanceof YXmlElement) {\n type.nodeName = map.setIfUndefined(nodeNameCache, type.nodeName, () => 'node-' + i);\n }\n if (type instanceof YXmlHook) {\n type.hookName = map.setIfUndefined(nodeNameCache, type.hookName, () => 'hook-' + i);\n }\n }\n break\n }\n case ContentAny: {\n const c = /** @type {ContentAny} */ (content);\n c.arr = c.arr.map(() => i);\n break\n }\n case ContentBinary: {\n const c = /** @type {ContentBinary} */ (content);\n c.content = new Uint8Array([i]);\n break\n }\n case ContentDoc: {\n const c = /** @type {ContentDoc} */ (content);\n if (subdocs) {\n c.opts = {};\n c.doc.guid = i + '';\n }\n break\n }\n case ContentEmbed: {\n const c = /** @type {ContentEmbed} */ (content);\n c.embed = {};\n break\n }\n case ContentFormat: {\n const c = /** @type {ContentFormat} */ (content);\n if (formatting) {\n c.key = map.setIfUndefined(formattingKeyCache, c.key, () => i + '');\n c.value = map.setIfUndefined(formattingValueCache, c.value, () => ({ i }));\n }\n break\n }\n case ContentJSON: {\n const c = /** @type {ContentJSON} */ (content);\n c.arr = c.arr.map(() => i);\n break\n }\n case ContentString: {\n const c = /** @type {ContentString} */ (content);\n c.str = string.repeat((i % 10) + '', c.str.length);\n break\n }\n default:\n // unknown content type\n error.unexpectedCase();\n }\n if (item.parentSub) {\n item.parentSub = map.setIfUndefined(mapKeyCache, item.parentSub, () => i + '');\n }\n i++;\n return block\n }\n default:\n // unknown block-type\n error.unexpectedCase();\n }\n }\n};\n\n/**\n * This function obfuscates the content of a Yjs update. This is useful to share\n * buggy Yjs documents while significantly limiting the possibility that a\n * developer can on the user. Note that it might still be possible to deduce\n * some information by analyzing the \"structure\" of the document or by analyzing\n * the typing behavior using the CRDT-related metadata that is still kept fully\n * intact.\n *\n * @param {Uint8Array} update\n * @param {ObfuscatorOptions} [opts]\n */\nconst obfuscateUpdate = (update, opts) => convertUpdateFormat(update, createObfuscator(opts), UpdateDecoderV1, UpdateEncoderV1);\n\n/**\n * @param {Uint8Array} update\n * @param {ObfuscatorOptions} [opts]\n */\nconst obfuscateUpdateV2 = (update, opts) => convertUpdateFormat(update, createObfuscator(opts), UpdateDecoderV2, UpdateEncoderV2);\n\n/**\n * @param {Uint8Array} update\n */\nconst convertUpdateFormatV1ToV2 = update => convertUpdateFormat(update, f.id, UpdateDecoderV1, UpdateEncoderV2);\n\n/**\n * @param {Uint8Array} update\n */\nconst convertUpdateFormatV2ToV1 = update => convertUpdateFormat(update, f.id, UpdateDecoderV2, UpdateEncoderV1);\n\nconst errorComputeChanges = 'You must not compute changes after the event-handler fired.';\n\n/**\n * @template {AbstractType<any>} T\n * YEvent describes the changes on a YType.\n */\nclass YEvent {\n /**\n * @param {T} target The changed type.\n * @param {Transaction} transaction\n */\n constructor (target, transaction) {\n /**\n * The type on which this event was created on.\n * @type {T}\n */\n this.target = target;\n /**\n * The current target on which the observe callback is called.\n * @type {AbstractType<any>}\n */\n this.currentTarget = target;\n /**\n * The transaction that triggered this event.\n * @type {Transaction}\n */\n this.transaction = transaction;\n /**\n * @type {Object|null}\n */\n this._changes = null;\n /**\n * @type {null | Map<string, { action: 'add' | 'update' | 'delete', oldValue: any, newValue: any }>}\n */\n this._keys = null;\n /**\n * @type {null | Array<{ insert?: string | Array<any> | object | AbstractType<any>, retain?: number, delete?: number, attributes?: Object<string, any> }>}\n */\n this._delta = null;\n /**\n * @type {Array<string|number>|null}\n */\n this._path = null;\n }\n\n /**\n * Computes the path from `y` to the changed type.\n *\n * @todo v14 should standardize on path: Array<{parent, index}> because that is easier to work with.\n *\n * The following property holds:\n * @example\n * let type = y\n * event.path.forEach(dir => {\n * type = type.get(dir)\n * })\n * type === event.target // => true\n */\n get path () {\n return this._path || (this._path = getPathTo(this.currentTarget, this.target))\n }\n\n /**\n * Check if a struct is deleted by this event.\n *\n * In contrast to change.deleted, this method also returns true if the struct was added and then deleted.\n *\n * @param {AbstractStruct} struct\n * @return {boolean}\n */\n deletes (struct) {\n return isDeleted(this.transaction.deleteSet, struct.id)\n }\n\n /**\n * @type {Map<string, { action: 'add' | 'update' | 'delete', oldValue: any, newValue: any }>}\n */\n get keys () {\n if (this._keys === null) {\n if (this.transaction.doc._transactionCleanups.length === 0) {\n throw error.create(errorComputeChanges)\n }\n const keys = new Map();\n const target = this.target;\n const changed = /** @type Set<string|null> */ (this.transaction.changed.get(target));\n changed.forEach(key => {\n if (key !== null) {\n const item = /** @type {Item} */ (target._map.get(key));\n /**\n * @type {'delete' | 'add' | 'update'}\n */\n let action;\n let oldValue;\n if (this.adds(item)) {\n let prev = item.left;\n while (prev !== null && this.adds(prev)) {\n prev = prev.left;\n }\n if (this.deletes(item)) {\n if (prev !== null && this.deletes(prev)) {\n action = 'delete';\n oldValue = array.last(prev.content.getContent());\n } else {\n return\n }\n } else {\n if (prev !== null && this.deletes(prev)) {\n action = 'update';\n oldValue = array.last(prev.content.getContent());\n } else {\n action = 'add';\n oldValue = undefined;\n }\n }\n } else {\n if (this.deletes(item)) {\n action = 'delete';\n oldValue = array.last(/** @type {Item} */ item.content.getContent());\n } else {\n return // nop\n }\n }\n keys.set(key, { action, oldValue });\n }\n });\n this._keys = keys;\n }\n return this._keys\n }\n\n /**\n * This is a computed property. Note that this can only be safely computed during the\n * event call. Computing this property after other changes happened might result in\n * unexpected behavior (incorrect computation of deltas). A safe way to collect changes\n * is to store the `changes` or the `delta` object. Avoid storing the `transaction` object.\n *\n * @type {Array<{insert?: string | Array<any> | object | AbstractType<any>, retain?: number, delete?: number, attributes?: Object<string, any>}>}\n */\n get delta () {\n return this.changes.delta\n }\n\n /**\n * Check if a struct is added by this event.\n *\n * In contrast to change.deleted, this method also returns true if the struct was added and then deleted.\n *\n * @param {AbstractStruct} struct\n * @return {boolean}\n */\n adds (struct) {\n return struct.id.clock >= (this.transaction.beforeState.get(struct.id.client) || 0)\n }\n\n /**\n * This is a computed property. Note that this can only be safely computed during the\n * event call. Computing this property after other changes happened might result in\n * unexpected behavior (incorrect computation of deltas). A safe way to collect changes\n * is to store the `changes` or the `delta` object. Avoid storing the `transaction` object.\n *\n * @type {{added:Set<Item>,deleted:Set<Item>,keys:Map<string,{action:'add'|'update'|'delete',oldValue:any}>,delta:Array<{insert?:Array<any>|string, delete?:number, retain?:number}>}}\n */\n get changes () {\n let changes = this._changes;\n if (changes === null) {\n if (this.transaction.doc._transactionCleanups.length === 0) {\n throw error.create(errorComputeChanges)\n }\n const target = this.target;\n const added = set.create();\n const deleted = set.create();\n /**\n * @type {Array<{insert:Array<any>}|{delete:number}|{retain:number}>}\n */\n const delta = [];\n changes = {\n added,\n deleted,\n delta,\n keys: this.keys\n };\n const changed = /** @type Set<string|null> */ (this.transaction.changed.get(target));\n if (changed.has(null)) {\n /**\n * @type {any}\n */\n let lastOp = null;\n const packOp = () => {\n if (lastOp) {\n delta.push(lastOp);\n }\n };\n for (let item = target._start; item !== null; item = item.right) {\n if (item.deleted) {\n if (this.deletes(item) && !this.adds(item)) {\n if (lastOp === null || lastOp.delete === undefined) {\n packOp();\n lastOp = { delete: 0 };\n }\n lastOp.delete += item.length;\n deleted.add(item);\n } // else nop\n } else {\n if (this.adds(item)) {\n if (lastOp === null || lastOp.insert === undefined) {\n packOp();\n lastOp = { insert: [] };\n }\n lastOp.insert = lastOp.insert.concat(item.content.getContent());\n added.add(item);\n } else {\n if (lastOp === null || lastOp.retain === undefined) {\n packOp();\n lastOp = { retain: 0 };\n }\n lastOp.retain += item.length;\n }\n }\n }\n if (lastOp !== null && lastOp.retain === undefined) {\n packOp();\n }\n }\n this._changes = changes;\n }\n return /** @type {any} */ (changes)\n }\n}\n\n/**\n * Compute the path from this type to the specified target.\n *\n * @example\n * // `child` should be accessible via `type.get(path[0]).get(path[1])..`\n * const path = type.getPathTo(child)\n * // assuming `type instanceof YArray`\n * console.log(path) // might look like => [2, 'key1']\n * child === type.get(path[0]).get(path[1])\n *\n * @param {AbstractType<any>} parent\n * @param {AbstractType<any>} child target\n * @return {Array<string|number>} Path to the target\n *\n * @private\n * @function\n */\nconst getPathTo = (parent, child) => {\n const path = [];\n while (child._item !== null && child !== parent) {\n if (child._item.parentSub !== null) {\n // parent is map-ish\n path.unshift(child._item.parentSub);\n } else {\n // parent is array-ish\n let i = 0;\n let c = /** @type {AbstractType<any>} */ (child._item.parent)._start;\n while (c !== child._item && c !== null) {\n if (!c.deleted && c.countable) {\n i += c.length;\n }\n c = c.right;\n }\n path.unshift(i);\n }\n child = /** @type {AbstractType<any>} */ (child._item.parent);\n }\n return path\n};\n\n/**\n * https://docs.yjs.dev/getting-started/working-with-shared-types#caveats\n */\nconst warnPrematureAccess = () => { logging.warn('Invalid access: Add Yjs type to a document before reading data.'); };\n\nconst maxSearchMarker = 80;\n\n/**\n * A unique timestamp that identifies each marker.\n *\n * Time is relative,.. this is more like an ever-increasing clock.\n *\n * @type {number}\n */\nlet globalSearchMarkerTimestamp = 0;\n\nclass ArraySearchMarker {\n /**\n * @param {Item} p\n * @param {number} index\n */\n constructor (p, index) {\n p.marker = true;\n this.p = p;\n this.index = index;\n this.timestamp = globalSearchMarkerTimestamp++;\n }\n}\n\n/**\n * @param {ArraySearchMarker} marker\n */\nconst refreshMarkerTimestamp = marker => { marker.timestamp = globalSearchMarkerTimestamp++; };\n\n/**\n * This is rather complex so this function is the only thing that should overwrite a marker\n *\n * @param {ArraySearchMarker} marker\n * @param {Item} p\n * @param {number} index\n */\nconst overwriteMarker = (marker, p, index) => {\n marker.p.marker = false;\n marker.p = p;\n p.marker = true;\n marker.index = index;\n marker.timestamp = globalSearchMarkerTimestamp++;\n};\n\n/**\n * @param {Array<ArraySearchMarker>} searchMarker\n * @param {Item} p\n * @param {number} index\n */\nconst markPosition = (searchMarker, p, index) => {\n if (searchMarker.length >= maxSearchMarker) {\n // override oldest marker (we don't want to create more objects)\n const marker = searchMarker.reduce((a, b) => a.timestamp < b.timestamp ? a : b);\n overwriteMarker(marker, p, index);\n return marker\n } else {\n // create new marker\n const pm = new ArraySearchMarker(p, index);\n searchMarker.push(pm);\n return pm\n }\n};\n\n/**\n * Search marker help us to find positions in the associative array faster.\n *\n * They speed up the process of finding a position without much bookkeeping.\n *\n * A maximum of `maxSearchMarker` objects are created.\n *\n * This function always returns a refreshed marker (updated timestamp)\n *\n * @param {AbstractType<any>} yarray\n * @param {number} index\n */\nconst findMarker = (yarray, index) => {\n if (yarray._start === null || index === 0 || yarray._searchMarker === null) {\n return null\n }\n const marker = yarray._searchMarker.length === 0 ? null : yarray._searchMarker.reduce((a, b) => math.abs(index - a.index) < math.abs(index - b.index) ? a : b);\n let p = yarray._start;\n let pindex = 0;\n if (marker !== null) {\n p = marker.p;\n pindex = marker.index;\n refreshMarkerTimestamp(marker); // we used it, we might need to use it again\n }\n // iterate to right if possible\n while (p.right !== null && pindex < index) {\n if (!p.deleted && p.countable) {\n if (index < pindex + p.length) {\n break\n }\n pindex += p.length;\n }\n p = p.right;\n }\n // iterate to left if necessary (might be that pindex > index)\n while (p.left !== null && pindex > index) {\n p = p.left;\n if (!p.deleted && p.countable) {\n pindex -= p.length;\n }\n }\n // we want to make sure that p can't be merged with left, because that would screw up everything\n // in that cas just return what we have (it is most likely the best marker anyway)\n // iterate to left until p can't be merged with left\n while (p.left !== null && p.left.id.client === p.id.client && p.left.id.clock + p.left.length === p.id.clock) {\n p = p.left;\n if (!p.deleted && p.countable) {\n pindex -= p.length;\n }\n }\n\n // @todo remove!\n // assure position\n // {\n // let start = yarray._start\n // let pos = 0\n // while (start !== p) {\n // if (!start.deleted && start.countable) {\n // pos += start.length\n // }\n // start = /** @type {Item} */ (start.right)\n // }\n // if (pos !== pindex) {\n // debugger\n // throw new Error('Gotcha position fail!')\n // }\n // }\n // if (marker) {\n // if (window.lengths == null) {\n // window.lengths = []\n // window.getLengths = () => window.lengths.sort((a, b) => a - b)\n // }\n // window.lengths.push(marker.index - pindex)\n // console.log('distance', marker.index - pindex, 'len', p && p.parent.length)\n // }\n if (marker !== null && math.abs(marker.index - pindex) < /** @type {YText|YArray<any>} */ (p.parent).length / maxSearchMarker) {\n // adjust existing marker\n overwriteMarker(marker, p, pindex);\n return marker\n } else {\n // create new marker\n return markPosition(yarray._searchMarker, p, pindex)\n }\n};\n\n/**\n * Update markers when a change happened.\n *\n * This should be called before doing a deletion!\n *\n * @param {Array<ArraySearchMarker>} searchMarker\n * @param {number} index\n * @param {number} len If insertion, len is positive. If deletion, len is negative.\n */\nconst updateMarkerChanges = (searchMarker, index, len) => {\n for (let i = searchMarker.length - 1; i >= 0; i--) {\n const m = searchMarker[i];\n if (len > 0) {\n /**\n * @type {Item|null}\n */\n let p = m.p;\n p.marker = false;\n // Ideally we just want to do a simple position comparison, but this will only work if\n // search markers don't point to deleted items for formats.\n // Iterate marker to prev undeleted countable position so we know what to do when updating a position\n while (p && (p.deleted || !p.countable)) {\n p = p.left;\n if (p && !p.deleted && p.countable) {\n // adjust position. the loop should break now\n m.index -= p.length;\n }\n }\n if (p === null || p.marker === true) {\n // remove search marker if updated position is null or if position is already marked\n searchMarker.splice(i, 1);\n continue\n }\n m.p = p;\n p.marker = true;\n }\n if (index < m.index || (len > 0 && index === m.index)) { // a simple index <= m.index check would actually suffice\n m.index = math.max(index, m.index + len);\n }\n }\n};\n\n/**\n * Accumulate all (list) children of a type and return them as an Array.\n *\n * @param {AbstractType<any>} t\n * @return {Array<Item>}\n */\nconst getTypeChildren = t => {\n t.doc ?? warnPrematureAccess();\n let s = t._start;\n const arr = [];\n while (s) {\n arr.push(s);\n s = s.right;\n }\n return arr\n};\n\n/**\n * Call event listeners with an event. This will also add an event to all\n * parents (for `.observeDeep` handlers).\n *\n * @template EventType\n * @param {AbstractType<EventType>} type\n * @param {Transaction} transaction\n * @param {EventType} event\n */\nconst callTypeObservers = (type, transaction, event) => {\n const changedType = type;\n const changedParentTypes = transaction.changedParentTypes;\n while (true) {\n // @ts-ignore\n map.setIfUndefined(changedParentTypes, type, () => []).push(event);\n if (type._item === null) {\n break\n }\n type = /** @type {AbstractType<any>} */ (type._item.parent);\n }\n callEventHandlerListeners(changedType._eH, event, transaction);\n};\n\n/**\n * @template EventType\n * Abstract Yjs Type class\n */\nclass AbstractType {\n constructor () {\n /**\n * @type {Item|null}\n */\n this._item = null;\n /**\n * @type {Map<string,Item>}\n */\n this._map = new Map();\n /**\n * @type {Item|null}\n */\n this._start = null;\n /**\n * @type {Doc|null}\n */\n this.doc = null;\n this._length = 0;\n /**\n * Event handlers\n * @type {EventHandler<EventType,Transaction>}\n */\n this._eH = createEventHandler();\n /**\n * Deep event handlers\n * @type {EventHandler<Array<YEvent<any>>,Transaction>}\n */\n this._dEH = createEventHandler();\n /**\n * @type {null | Array<ArraySearchMarker>}\n */\n this._searchMarker = null;\n }\n\n /**\n * @return {AbstractType<any>|null}\n */\n get parent () {\n return this._item ? /** @type {AbstractType<any>} */ (this._item.parent) : null\n }\n\n /**\n * Integrate this type into the Yjs instance.\n *\n * * Save this struct in the os\n * * This type is sent to other client\n * * Observer functions are fired\n *\n * @param {Doc} y The Yjs instance\n * @param {Item|null} item\n */\n _integrate (y, item) {\n this.doc = y;\n this._item = item;\n }\n\n /**\n * @return {AbstractType<EventType>}\n */\n _copy () {\n throw error.methodUnimplemented()\n }\n\n /**\n * Makes a copy of this data type that can be included somewhere else.\n *\n * Note that the content is only readable _after_ it has been included somewhere in the Ydoc.\n *\n * @return {AbstractType<EventType>}\n */\n clone () {\n throw error.methodUnimplemented()\n }\n\n /**\n * @param {UpdateEncoderV1 | UpdateEncoderV2} _encoder\n */\n _write (_encoder) { }\n\n /**\n * The first non-deleted item\n */\n get _first () {\n let n = this._start;\n while (n !== null && n.deleted) {\n n = n.right;\n }\n return n\n }\n\n /**\n * Creates YEvent and calls all type observers.\n * Must be implemented by each type.\n *\n * @param {Transaction} transaction\n * @param {Set<null|string>} _parentSubs Keys changed on this type. `null` if list was modified.\n */\n _callObserver (transaction, _parentSubs) {\n if (!transaction.local && this._searchMarker) {\n this._searchMarker.length = 0;\n }\n }\n\n /**\n * Observe all events that are created on this type.\n *\n * @param {function(EventType, Transaction):void} f Observer function\n */\n observe (f) {\n addEventHandlerListener(this._eH, f);\n }\n\n /**\n * Observe all events that are created by this type and its children.\n *\n * @param {function(Array<YEvent<any>>,Transaction):void} f Observer function\n */\n observeDeep (f) {\n addEventHandlerListener(this._dEH, f);\n }\n\n /**\n * Unregister an observer function.\n *\n * @param {function(EventType,Transaction):void} f Observer function\n */\n unobserve (f) {\n removeEventHandlerListener(this._eH, f);\n }\n\n /**\n * Unregister an observer function.\n *\n * @param {function(Array<YEvent<any>>,Transaction):void} f Observer function\n */\n unobserveDeep (f) {\n removeEventHandlerListener(this._dEH, f);\n }\n\n /**\n * @abstract\n * @return {any}\n */\n toJSON () {}\n}\n\n/**\n * @param {AbstractType<any>} type\n * @param {number} start\n * @param {number} end\n * @return {Array<any>}\n *\n * @private\n * @function\n */\nconst typeListSlice = (type, start, end) => {\n type.doc ?? warnPrematureAccess();\n if (start < 0) {\n start = type._length + start;\n }\n if (end < 0) {\n end = type._length + end;\n }\n let len = end - start;\n const cs = [];\n let n = type._start;\n while (n !== null && len > 0) {\n if (n.countable && !n.deleted) {\n const c = n.content.getContent();\n if (c.length <= start) {\n start -= c.length;\n } else {\n for (let i = start; i < c.length && len > 0; i++) {\n cs.push(c[i]);\n len--;\n }\n start = 0;\n }\n }\n n = n.right;\n }\n return cs\n};\n\n/**\n * @param {AbstractType<any>} type\n * @return {Array<any>}\n *\n * @private\n * @function\n */\nconst typeListToArray = type => {\n type.doc ?? warnPrematureAccess();\n const cs = [];\n let n = type._start;\n while (n !== null) {\n if (n.countable && !n.deleted) {\n const c = n.content.getContent();\n for (let i = 0; i < c.length; i++) {\n cs.push(c[i]);\n }\n }\n n = n.right;\n }\n return cs\n};\n\n/**\n * @param {AbstractType<any>} type\n * @param {Snapshot} snapshot\n * @return {Array<any>}\n *\n * @private\n * @function\n */\nconst typeListToArraySnapshot = (type, snapshot) => {\n const cs = [];\n let n = type._start;\n while (n !== null) {\n if (n.countable && isVisible(n, snapshot)) {\n const c = n.content.getContent();\n for (let i = 0; i < c.length; i++) {\n cs.push(c[i]);\n }\n }\n n = n.right;\n }\n return cs\n};\n\n/**\n * Executes a provided function on once on every element of this YArray.\n *\n * @param {AbstractType<any>} type\n * @param {function(any,number,any):void} f A function to execute on every element of this YArray.\n *\n * @private\n * @function\n */\nconst typeListForEach = (type, f) => {\n let index = 0;\n let n = type._start;\n type.doc ?? warnPrematureAccess();\n while (n !== null) {\n if (n.countable && !n.deleted) {\n const c = n.content.getContent();\n for (let i = 0; i < c.length; i++) {\n f(c[i], index++, type);\n }\n }\n n = n.right;\n }\n};\n\n/**\n * @template C,R\n * @param {AbstractType<any>} type\n * @param {function(C,number,AbstractType<any>):R} f\n * @return {Array<R>}\n *\n * @private\n * @function\n */\nconst typeListMap = (type, f) => {\n /**\n * @type {Array<any>}\n */\n const result = [];\n typeListForEach(type, (c, i) => {\n result.push(f(c, i, type));\n });\n return result\n};\n\n/**\n * @param {AbstractType<any>} type\n * @return {IterableIterator<any>}\n *\n * @private\n * @function\n */\nconst typeListCreateIterator = type => {\n let n = type._start;\n /**\n * @type {Array<any>|null}\n */\n let currentContent = null;\n let currentContentIndex = 0;\n return {\n [Symbol.iterator] () {\n return this\n },\n next: () => {\n // find some content\n if (currentContent === null) {\n while (n !== null && n.deleted) {\n n = n.right;\n }\n // check if we reached the end, no need to check currentContent, because it does not exist\n if (n === null) {\n return {\n done: true,\n value: undefined\n }\n }\n // we found n, so we can set currentContent\n currentContent = n.content.getContent();\n currentContentIndex = 0;\n n = n.right; // we used the content of n, now iterate to next\n }\n const value = currentContent[currentContentIndex++];\n // check if we need to empty currentContent\n if (currentContent.length <= currentContentIndex) {\n currentContent = null;\n }\n return {\n done: false,\n value\n }\n }\n }\n};\n\n/**\n * @param {AbstractType<any>} type\n * @param {number} index\n * @return {any}\n *\n * @private\n * @function\n */\nconst typeListGet = (type, index) => {\n type.doc ?? warnPrematureAccess();\n const marker = findMarker(type, index);\n let n = type._start;\n if (marker !== null) {\n n = marker.p;\n index -= marker.index;\n }\n for (; n !== null; n = n.right) {\n if (!n.deleted && n.countable) {\n if (index < n.length) {\n return n.content.getContent()[index]\n }\n index -= n.length;\n }\n }\n};\n\n/**\n * @param {Transaction} transaction\n * @param {AbstractType<any>} parent\n * @param {Item?} referenceItem\n * @param {Array<Object<string,any>|Array<any>|boolean|number|null|string|Uint8Array>} content\n *\n * @private\n * @function\n */\nconst typeListInsertGenericsAfter = (transaction, parent, referenceItem, content) => {\n let left = referenceItem;\n const doc = transaction.doc;\n const ownClientId = doc.clientID;\n const store = doc.store;\n const right = referenceItem === null ? parent._start : referenceItem.right;\n /**\n * @type {Array<Object|Array<any>|number|null>}\n */\n let jsonContent = [];\n const packJsonContent = () => {\n if (jsonContent.length > 0) {\n left = new Item(createID(ownClientId, getState(store, ownClientId)), left, left && left.lastId, right, right && right.id, parent, null, new ContentAny(jsonContent));\n left.integrate(transaction, 0);\n jsonContent = [];\n }\n };\n content.forEach(c => {\n if (c === null) {\n jsonContent.push(c);\n } else {\n switch (c.constructor) {\n case Number:\n case Object:\n case Boolean:\n case Array:\n case String:\n jsonContent.push(c);\n break\n default:\n packJsonContent();\n switch (c.constructor) {\n case Uint8Array:\n case ArrayBuffer:\n left = new Item(createID(ownClientId, getState(store, ownClientId)), left, left && left.lastId, right, right && right.id, parent, null, new ContentBinary(new Uint8Array(/** @type {Uint8Array} */ (c))));\n left.integrate(transaction, 0);\n break\n case Doc:\n left = new Item(createID(ownClientId, getState(store, ownClientId)), left, left && left.lastId, right, right && right.id, parent, null, new ContentDoc(/** @type {Doc} */ (c)));\n left.integrate(transaction, 0);\n break\n default:\n if (c instanceof AbstractType) {\n left = new Item(createID(ownClientId, getState(store, ownClientId)), left, left && left.lastId, right, right && right.id, parent, null, new ContentType(c));\n left.integrate(transaction, 0);\n } else {\n throw new Error('Unexpected content type in insert operation')\n }\n }\n }\n }\n });\n packJsonContent();\n};\n\nconst lengthExceeded = () => error.create('Length exceeded!');\n\n/**\n * @param {Transaction} transaction\n * @param {AbstractType<any>} parent\n * @param {number} index\n * @param {Array<Object<string,any>|Array<any>|number|null|string|Uint8Array>} content\n *\n * @private\n * @function\n */\nconst typeListInsertGenerics = (transaction, parent, index, content) => {\n if (index > parent._length) {\n throw lengthExceeded()\n }\n if (index === 0) {\n if (parent._searchMarker) {\n updateMarkerChanges(parent._searchMarker, index, content.length);\n }\n return typeListInsertGenericsAfter(transaction, parent, null, content)\n }\n const startIndex = index;\n const marker = findMarker(parent, index);\n let n = parent._start;\n if (marker !== null) {\n n = marker.p;\n index -= marker.index;\n // we need to iterate one to the left so that the algorithm works\n if (index === 0) {\n // @todo refactor this as it actually doesn't consider formats\n n = n.prev; // important! get the left undeleted item so that we can actually decrease index\n index += (n && n.countable && !n.deleted) ? n.length : 0;\n }\n }\n for (; n !== null; n = n.right) {\n if (!n.deleted && n.countable) {\n if (index <= n.length) {\n if (index < n.length) {\n // insert in-between\n getItemCleanStart(transaction, createID(n.id.client, n.id.clock + index));\n }\n break\n }\n index -= n.length;\n }\n }\n if (parent._searchMarker) {\n updateMarkerChanges(parent._searchMarker, startIndex, content.length);\n }\n return typeListInsertGenericsAfter(transaction, parent, n, content)\n};\n\n/**\n * Pushing content is special as we generally want to push after the last item. So we don't have to update\n * the search marker.\n *\n * @param {Transaction} transaction\n * @param {AbstractType<any>} parent\n * @param {Array<Object<string,any>|Array<any>|number|null|string|Uint8Array>} content\n *\n * @private\n * @function\n */\nconst typeListPushGenerics = (transaction, parent, content) => {\n // Use the marker with the highest index and iterate to the right.\n const marker = (parent._searchMarker || []).reduce((maxMarker, currMarker) => currMarker.index > maxMarker.index ? currMarker : maxMarker, { index: 0, p: parent._start });\n let n = marker.p;\n if (n) {\n while (n.right) {\n n = n.right;\n }\n }\n return typeListInsertGenericsAfter(transaction, parent, n, content)\n};\n\n/**\n * @param {Transaction} transaction\n * @param {AbstractType<any>} parent\n * @param {number} index\n * @param {number} length\n *\n * @private\n * @function\n */\nconst typeListDelete = (transaction, parent, index, length) => {\n if (length === 0) { return }\n const startIndex = index;\n const startLength = length;\n const marker = findMarker(parent, index);\n let n = parent._start;\n if (marker !== null) {\n n = marker.p;\n index -= marker.index;\n }\n // compute the first item to be deleted\n for (; n !== null && index > 0; n = n.right) {\n if (!n.deleted && n.countable) {\n if (index < n.length) {\n getItemCleanStart(transaction, createID(n.id.client, n.id.clock + index));\n }\n index -= n.length;\n }\n }\n // delete all items until done\n while (length > 0 && n !== null) {\n if (!n.deleted) {\n if (length < n.length) {\n getItemCleanStart(transaction, createID(n.id.client, n.id.clock + length));\n }\n n.delete(transaction);\n length -= n.length;\n }\n n = n.right;\n }\n if (length > 0) {\n throw lengthExceeded()\n }\n if (parent._searchMarker) {\n updateMarkerChanges(parent._searchMarker, startIndex, -startLength + length /* in case we remove the above exception */);\n }\n};\n\n/**\n * @param {Transaction} transaction\n * @param {AbstractType<any>} parent\n * @param {string} key\n *\n * @private\n * @function\n */\nconst typeMapDelete = (transaction, parent, key) => {\n const c = parent._map.get(key);\n if (c !== undefined) {\n c.delete(transaction);\n }\n};\n\n/**\n * @param {Transaction} transaction\n * @param {AbstractType<any>} parent\n * @param {string} key\n * @param {Object|number|null|Array<any>|string|Uint8Array|AbstractType<any>} value\n *\n * @private\n * @function\n */\nconst typeMapSet = (transaction, parent, key, value) => {\n const left = parent._map.get(key) || null;\n const doc = transaction.doc;\n const ownClientId = doc.clientID;\n let content;\n if (value == null) {\n content = new ContentAny([value]);\n } else {\n switch (value.constructor) {\n case Number:\n case Object:\n case Boolean:\n case Array:\n case String:\n case Date:\n case BigInt:\n content = new ContentAny([value]);\n break\n case Uint8Array:\n content = new ContentBinary(/** @type {Uint8Array} */ (value));\n break\n case Doc:\n content = new ContentDoc(/** @type {Doc} */ (value));\n break\n default:\n if (value instanceof AbstractType) {\n content = new ContentType(value);\n } else {\n throw new Error('Unexpected content type')\n }\n }\n }\n new Item(createID(ownClientId, getState(doc.store, ownClientId)), left, left && left.lastId, null, null, parent, key, content).integrate(transaction, 0);\n};\n\n/**\n * @param {AbstractType<any>} parent\n * @param {string} key\n * @return {Object<string,any>|number|null|Array<any>|string|Uint8Array|AbstractType<any>|undefined}\n *\n * @private\n * @function\n */\nconst typeMapGet = (parent, key) => {\n parent.doc ?? warnPrematureAccess();\n const val = parent._map.get(key);\n return val !== undefined && !val.deleted ? val.content.getContent()[val.length - 1] : undefined\n};\n\n/**\n * @param {AbstractType<any>} parent\n * @return {Object<string,Object<string,any>|number|null|Array<any>|string|Uint8Array|AbstractType<any>|undefined>}\n *\n * @private\n * @function\n */\nconst typeMapGetAll = (parent) => {\n /**\n * @type {Object<string,any>}\n */\n const res = {};\n parent.doc ?? warnPrematureAccess();\n parent._map.forEach((value, key) => {\n if (!value.deleted) {\n res[key] = value.content.getContent()[value.length - 1];\n }\n });\n return res\n};\n\n/**\n * @param {AbstractType<any>} parent\n * @param {string} key\n * @return {boolean}\n *\n * @private\n * @function\n */\nconst typeMapHas = (parent, key) => {\n parent.doc ?? warnPrematureAccess();\n const val = parent._map.get(key);\n return val !== undefined && !val.deleted\n};\n\n/**\n * @param {AbstractType<any>} parent\n * @param {string} key\n * @param {Snapshot} snapshot\n * @return {Object<string,any>|number|null|Array<any>|string|Uint8Array|AbstractType<any>|undefined}\n *\n * @private\n * @function\n */\nconst typeMapGetSnapshot = (parent, key, snapshot) => {\n let v = parent._map.get(key) || null;\n while (v !== null && (!snapshot.sv.has(v.id.client) || v.id.clock >= (snapshot.sv.get(v.id.client) || 0))) {\n v = v.left;\n }\n return v !== null && isVisible(v, snapshot) ? v.content.getContent()[v.length - 1] : undefined\n};\n\n/**\n * @param {AbstractType<any>} parent\n * @param {Snapshot} snapshot\n * @return {Object<string,Object<string,any>|number|null|Array<any>|string|Uint8Array|AbstractType<any>|undefined>}\n *\n * @private\n * @function\n */\nconst typeMapGetAllSnapshot = (parent, snapshot) => {\n /**\n * @type {Object<string,any>}\n */\n const res = {};\n parent._map.forEach((value, key) => {\n /**\n * @type {Item|null}\n */\n let v = value;\n while (v !== null && (!snapshot.sv.has(v.id.client) || v.id.clock >= (snapshot.sv.get(v.id.client) || 0))) {\n v = v.left;\n }\n if (v !== null && isVisible(v, snapshot)) {\n res[key] = v.content.getContent()[v.length - 1];\n }\n });\n return res\n};\n\n/**\n * @param {AbstractType<any> & { _map: Map<string, Item> }} type\n * @return {IterableIterator<Array<any>>}\n *\n * @private\n * @function\n */\nconst createMapIterator = type => {\n type.doc ?? warnPrematureAccess();\n return iterator.iteratorFilter(type._map.entries(), /** @param {any} entry */ entry => !entry[1].deleted)\n};\n\n/**\n * @module YArray\n */\n\n\n/**\n * Event that describes the changes on a YArray\n * @template T\n * @extends YEvent<YArray<T>>\n */\nclass YArrayEvent extends YEvent {}\n\n/**\n * A shared Array implementation.\n * @template T\n * @extends AbstractType<YArrayEvent<T>>\n * @implements {Iterable<T>}\n */\nclass YArray extends AbstractType {\n constructor () {\n super();\n /**\n * @type {Array<any>?}\n * @private\n */\n this._prelimContent = [];\n /**\n * @type {Array<ArraySearchMarker>}\n */\n this._searchMarker = [];\n }\n\n /**\n * Construct a new YArray containing the specified items.\n * @template {Object<string,any>|Array<any>|number|null|string|Uint8Array} T\n * @param {Array<T>} items\n * @return {YArray<T>}\n */\n static from (items) {\n /**\n * @type {YArray<T>}\n */\n const a = new YArray();\n a.push(items);\n return a\n }\n\n /**\n * Integrate this type into the Yjs instance.\n *\n * * Save this struct in the os\n * * This type is sent to other client\n * * Observer functions are fired\n *\n * @param {Doc} y The Yjs instance\n * @param {Item} item\n */\n _integrate (y, item) {\n super._integrate(y, item);\n this.insert(0, /** @type {Array<any>} */ (this._prelimContent));\n this._prelimContent = null;\n }\n\n /**\n * @return {YArray<T>}\n */\n _copy () {\n return new YArray()\n }\n\n /**\n * Makes a copy of this data type that can be included somewhere else.\n *\n * Note that the content is only readable _after_ it has been included somewhere in the Ydoc.\n *\n * @return {YArray<T>}\n */\n clone () {\n /**\n * @type {YArray<T>}\n */\n const arr = new YArray();\n arr.insert(0, this.toArray().map(el =>\n el instanceof AbstractType ? /** @type {typeof el} */ (el.clone()) : el\n ));\n return arr\n }\n\n get length () {\n this.doc ?? warnPrematureAccess();\n return this._length\n }\n\n /**\n * Creates YArrayEvent and calls observers.\n *\n * @param {Transaction} transaction\n * @param {Set<null|string>} parentSubs Keys changed on this type. `null` if list was modified.\n */\n _callObserver (transaction, parentSubs) {\n super._callObserver(transaction, parentSubs);\n callTypeObservers(this, transaction, new YArrayEvent(this, transaction));\n }\n\n /**\n * Inserts new content at an index.\n *\n * Important: This function expects an array of content. Not just a content\n * object. The reason for this \"weirdness\" is that inserting several elements\n * is very efficient when it is done as a single operation.\n *\n * @example\n * // Insert character 'a' at position 0\n * yarray.insert(0, ['a'])\n * // Insert numbers 1, 2 at position 1\n * yarray.insert(1, [1, 2])\n *\n * @param {number} index The index to insert content at.\n * @param {Array<T>} content The array of content\n */\n insert (index, content) {\n if (this.doc !== null) {\n transact(this.doc, transaction => {\n typeListInsertGenerics(transaction, this, index, /** @type {any} */ (content));\n });\n } else {\n /** @type {Array<any>} */ (this._prelimContent).splice(index, 0, ...content);\n }\n }\n\n /**\n * Appends content to this YArray.\n *\n * @param {Array<T>} content Array of content to append.\n *\n * @todo Use the following implementation in all types.\n */\n push (content) {\n if (this.doc !== null) {\n transact(this.doc, transaction => {\n typeListPushGenerics(transaction, this, /** @type {any} */ (content));\n });\n } else {\n /** @type {Array<any>} */ (this._prelimContent).push(...content);\n }\n }\n\n /**\n * Prepends content to this YArray.\n *\n * @param {Array<T>} content Array of content to prepend.\n */\n unshift (content) {\n this.insert(0, content);\n }\n\n /**\n * Deletes elements starting from an index.\n *\n * @param {number} index Index at which to start deleting elements\n * @param {number} length The number of elements to remove. Defaults to 1.\n */\n delete (index, length = 1) {\n if (this.doc !== null) {\n transact(this.doc, transaction => {\n typeListDelete(transaction, this, index, length);\n });\n } else {\n /** @type {Array<any>} */ (this._prelimContent).splice(index, length);\n }\n }\n\n /**\n * Returns the i-th element from a YArray.\n *\n * @param {number} index The index of the element to return from the YArray\n * @return {T}\n */\n get (index) {\n return typeListGet(this, index)\n }\n\n /**\n * Transforms this YArray to a JavaScript Array.\n *\n * @return {Array<T>}\n */\n toArray () {\n return typeListToArray(this)\n }\n\n /**\n * Returns a portion of this YArray into a JavaScript Array selected\n * from start to end (end not included).\n *\n * @param {number} [start]\n * @param {number} [end]\n * @return {Array<T>}\n */\n slice (start = 0, end = this.length) {\n return typeListSlice(this, start, end)\n }\n\n /**\n * Transforms this Shared Type to a JSON object.\n *\n * @return {Array<any>}\n */\n toJSON () {\n return this.map(c => c instanceof AbstractType ? c.toJSON() : c)\n }\n\n /**\n * Returns an Array with the result of calling a provided function on every\n * element of this YArray.\n *\n * @template M\n * @param {function(T,number,YArray<T>):M} f Function that produces an element of the new Array\n * @return {Array<M>} A new array with each element being the result of the\n * callback function\n */\n map (f) {\n return typeListMap(this, /** @type {any} */ (f))\n }\n\n /**\n * Executes a provided function once on every element of this YArray.\n *\n * @param {function(T,number,YArray<T>):void} f A function to execute on every element of this YArray.\n */\n forEach (f) {\n typeListForEach(this, f);\n }\n\n /**\n * @return {IterableIterator<T>}\n */\n [Symbol.iterator] () {\n return typeListCreateIterator(this)\n }\n\n /**\n * @param {UpdateEncoderV1 | UpdateEncoderV2} encoder\n */\n _write (encoder) {\n encoder.writeTypeRef(YArrayRefID);\n }\n}\n\n/**\n * @param {UpdateDecoderV1 | UpdateDecoderV2} _decoder\n *\n * @private\n * @function\n */\nconst readYArray = _decoder => new YArray();\n\n/**\n * @module YMap\n */\n\n\n/**\n * @template T\n * @extends YEvent<YMap<T>>\n * Event that describes the changes on a YMap.\n */\nclass YMapEvent extends YEvent {\n /**\n * @param {YMap<T>} ymap The YArray that changed.\n * @param {Transaction} transaction\n * @param {Set<any>} subs The keys that changed.\n */\n constructor (ymap, transaction, subs) {\n super(ymap, transaction);\n this.keysChanged = subs;\n }\n}\n\n/**\n * @template MapType\n * A shared Map implementation.\n *\n * @extends AbstractType<YMapEvent<MapType>>\n * @implements {Iterable<[string, MapType]>}\n */\nclass YMap extends AbstractType {\n /**\n *\n * @param {Iterable<readonly [string, any]>=} entries - an optional iterable to initialize the YMap\n */\n constructor (entries) {\n super();\n /**\n * @type {Map<string,any>?}\n * @private\n */\n this._prelimContent = null;\n\n if (entries === undefined) {\n this._prelimContent = new Map();\n } else {\n this._prelimContent = new Map(entries);\n }\n }\n\n /**\n * Integrate this type into the Yjs instance.\n *\n * * Save this struct in the os\n * * This type is sent to other client\n * * Observer functions are fired\n *\n * @param {Doc} y The Yjs instance\n * @param {Item} item\n */\n _integrate (y, item) {\n super._integrate(y, item)\n ;/** @type {Map<string, any>} */ (this._prelimContent).forEach((value, key) => {\n this.set(key, value);\n });\n this._prelimContent = null;\n }\n\n /**\n * @return {YMap<MapType>}\n */\n _copy () {\n return new YMap()\n }\n\n /**\n * Makes a copy of this data type that can be included somewhere else.\n *\n * Note that the content is only readable _after_ it has been included somewhere in the Ydoc.\n *\n * @return {YMap<MapType>}\n */\n clone () {\n /**\n * @type {YMap<MapType>}\n */\n const map = new YMap();\n this.forEach((value, key) => {\n map.set(key, value instanceof AbstractType ? /** @type {typeof value} */ (value.clone()) : value);\n });\n return map\n }\n\n /**\n * Creates YMapEvent and calls observers.\n *\n * @param {Transaction} transaction\n * @param {Set<null|string>} parentSubs Keys changed on this type. `null` if list was modified.\n */\n _callObserver (transaction, parentSubs) {\n callTypeObservers(this, transaction, new YMapEvent(this, transaction, parentSubs));\n }\n\n /**\n * Transforms this Shared Type to a JSON object.\n *\n * @return {Object<string,any>}\n */\n toJSON () {\n this.doc ?? warnPrematureAccess();\n /**\n * @type {Object<string,MapType>}\n */\n const map = {};\n this._map.forEach((item, key) => {\n if (!item.deleted) {\n const v = item.content.getContent()[item.length - 1];\n map[key] = v instanceof AbstractType ? v.toJSON() : v;\n }\n });\n return map\n }\n\n /**\n * Returns the size of the YMap (count of key/value pairs)\n *\n * @return {number}\n */\n get size () {\n return [...createMapIterator(this)].length\n }\n\n /**\n * Returns the keys for each element in the YMap Type.\n *\n * @return {IterableIterator<string>}\n */\n keys () {\n return iterator.iteratorMap(createMapIterator(this), /** @param {any} v */ v => v[0])\n }\n\n /**\n * Returns the values for each element in the YMap Type.\n *\n * @return {IterableIterator<MapType>}\n */\n values () {\n return iterator.iteratorMap(createMapIterator(this), /** @param {any} v */ v => v[1].content.getContent()[v[1].length - 1])\n }\n\n /**\n * Returns an Iterator of [key, value] pairs\n *\n * @return {IterableIterator<[string, MapType]>}\n */\n entries () {\n return iterator.iteratorMap(createMapIterator(this), /** @param {any} v */ v => /** @type {any} */ ([v[0], v[1].content.getContent()[v[1].length - 1]]))\n }\n\n /**\n * Executes a provided function on once on every key-value pair.\n *\n * @param {function(MapType,string,YMap<MapType>):void} f A function to execute on every element of this YArray.\n */\n forEach (f) {\n this.doc ?? warnPrematureAccess();\n this._map.forEach((item, key) => {\n if (!item.deleted) {\n f(item.content.getContent()[item.length - 1], key, this);\n }\n });\n }\n\n /**\n * Returns an Iterator of [key, value] pairs\n *\n * @return {IterableIterator<[string, MapType]>}\n */\n [Symbol.iterator] () {\n return this.entries()\n }\n\n /**\n * Remove a specified element from this YMap.\n *\n * @param {string} key The key of the element to remove.\n */\n delete (key) {\n if (this.doc !== null) {\n transact(this.doc, transaction => {\n typeMapDelete(transaction, this, key);\n });\n } else {\n /** @type {Map<string, any>} */ (this._prelimContent).delete(key);\n }\n }\n\n /**\n * Adds or updates an element with a specified key and value.\n * @template {MapType} VAL\n *\n * @param {string} key The key of the element to add to this YMap\n * @param {VAL} value The value of the element to add\n * @return {VAL}\n */\n set (key, value) {\n if (this.doc !== null) {\n transact(this.doc, transaction => {\n typeMapSet(transaction, this, key, /** @type {any} */ (value));\n });\n } else {\n /** @type {Map<string, any>} */ (this._prelimContent).set(key, value);\n }\n return value\n }\n\n /**\n * Returns a specified element from this YMap.\n *\n * @param {string} key\n * @return {MapType|undefined}\n */\n get (key) {\n return /** @type {any} */ (typeMapGet(this, key))\n }\n\n /**\n * Returns a boolean indicating whether the specified key exists or not.\n *\n * @param {string} key The key to test.\n * @return {boolean}\n */\n has (key) {\n return typeMapHas(this, key)\n }\n\n /**\n * Removes all elements from this YMap.\n */\n clear () {\n if (this.doc !== null) {\n transact(this.doc, transaction => {\n this.forEach(function (_value, key, map) {\n typeMapDelete(transaction, map, key);\n });\n });\n } else {\n /** @type {Map<string, any>} */ (this._prelimContent).clear();\n }\n }\n\n /**\n * @param {UpdateEncoderV1 | UpdateEncoderV2} encoder\n */\n _write (encoder) {\n encoder.writeTypeRef(YMapRefID);\n }\n}\n\n/**\n * @param {UpdateDecoderV1 | UpdateDecoderV2} _decoder\n *\n * @private\n * @function\n */\nconst readYMap = _decoder => new YMap();\n\n/**\n * @module YText\n */\n\n\n/**\n * @param {any} a\n * @param {any} b\n * @return {boolean}\n */\nconst equalAttrs = (a, b) => a === b || (typeof a === 'object' && typeof b === 'object' && a && b && object.equalFlat(a, b));\n\nclass ItemTextListPosition {\n /**\n * @param {Item|null} left\n * @param {Item|null} right\n * @param {number} index\n * @param {Map<string,any>} currentAttributes\n */\n constructor (left, right, index, currentAttributes) {\n this.left = left;\n this.right = right;\n this.index = index;\n this.currentAttributes = currentAttributes;\n }\n\n /**\n * Only call this if you know that this.right is defined\n */\n forward () {\n if (this.right === null) {\n error.unexpectedCase();\n }\n switch (this.right.content.constructor) {\n case ContentFormat:\n if (!this.right.deleted) {\n updateCurrentAttributes(this.currentAttributes, /** @type {ContentFormat} */ (this.right.content));\n }\n break\n default:\n if (!this.right.deleted) {\n this.index += this.right.length;\n }\n break\n }\n this.left = this.right;\n this.right = this.right.right;\n }\n}\n\n/**\n * @param {Transaction} transaction\n * @param {ItemTextListPosition} pos\n * @param {number} count steps to move forward\n * @return {ItemTextListPosition}\n *\n * @private\n * @function\n */\nconst findNextPosition = (transaction, pos, count) => {\n while (pos.right !== null && count > 0) {\n switch (pos.right.content.constructor) {\n case ContentFormat:\n if (!pos.right.deleted) {\n updateCurrentAttributes(pos.currentAttributes, /** @type {ContentFormat} */ (pos.right.content));\n }\n break\n default:\n if (!pos.right.deleted) {\n if (count < pos.right.length) {\n // split right\n getItemCleanStart(transaction, createID(pos.right.id.client, pos.right.id.clock + count));\n }\n pos.index += pos.right.length;\n count -= pos.right.length;\n }\n break\n }\n pos.left = pos.right;\n pos.right = pos.right.right;\n // pos.forward() - we don't forward because that would halve the performance because we already do the checks above\n }\n return pos\n};\n\n/**\n * @param {Transaction} transaction\n * @param {AbstractType<any>} parent\n * @param {number} index\n * @param {boolean} useSearchMarker\n * @return {ItemTextListPosition}\n *\n * @private\n * @function\n */\nconst findPosition = (transaction, parent, index, useSearchMarker) => {\n const currentAttributes = new Map();\n const marker = useSearchMarker ? findMarker(parent, index) : null;\n if (marker) {\n const pos = new ItemTextListPosition(marker.p.left, marker.p, marker.index, currentAttributes);\n return findNextPosition(transaction, pos, index - marker.index)\n } else {\n const pos = new ItemTextListPosition(null, parent._start, 0, currentAttributes);\n return findNextPosition(transaction, pos, index)\n }\n};\n\n/**\n * Negate applied formats\n *\n * @param {Transaction} transaction\n * @param {AbstractType<any>} parent\n * @param {ItemTextListPosition} currPos\n * @param {Map<string,any>} negatedAttributes\n *\n * @private\n * @function\n */\nconst insertNegatedAttributes = (transaction, parent, currPos, negatedAttributes) => {\n // check if we really need to remove attributes\n while (\n currPos.right !== null && (\n currPos.right.deleted === true || (\n currPos.right.content.constructor === ContentFormat &&\n equalAttrs(negatedAttributes.get(/** @type {ContentFormat} */ (currPos.right.content).key), /** @type {ContentFormat} */ (currPos.right.content).value)\n )\n )\n ) {\n if (!currPos.right.deleted) {\n negatedAttributes.delete(/** @type {ContentFormat} */ (currPos.right.content).key);\n }\n currPos.forward();\n }\n const doc = transaction.doc;\n const ownClientId = doc.clientID;\n negatedAttributes.forEach((val, key) => {\n const left = currPos.left;\n const right = currPos.right;\n const nextFormat = new Item(createID(ownClientId, getState(doc.store, ownClientId)), left, left && left.lastId, right, right && right.id, parent, null, new ContentFormat(key, val));\n nextFormat.integrate(transaction, 0);\n currPos.right = nextFormat;\n currPos.forward();\n });\n};\n\n/**\n * @param {Map<string,any>} currentAttributes\n * @param {ContentFormat} format\n *\n * @private\n * @function\n */\nconst updateCurrentAttributes = (currentAttributes, format) => {\n const { key, value } = format;\n if (value === null) {\n currentAttributes.delete(key);\n } else {\n currentAttributes.set(key, value);\n }\n};\n\n/**\n * @param {ItemTextListPosition} currPos\n * @param {Object<string,any>} attributes\n *\n * @private\n * @function\n */\nconst minimizeAttributeChanges = (currPos, attributes) => {\n // go right while attributes[right.key] === right.value (or right is deleted)\n while (true) {\n if (currPos.right === null) {\n break\n } else if (currPos.right.deleted || (currPos.right.content.constructor === ContentFormat && equalAttrs(attributes[(/** @type {ContentFormat} */ (currPos.right.content)).key] ?? null, /** @type {ContentFormat} */ (currPos.right.content).value))) ; else {\n break\n }\n currPos.forward();\n }\n};\n\n/**\n * @param {Transaction} transaction\n * @param {AbstractType<any>} parent\n * @param {ItemTextListPosition} currPos\n * @param {Object<string,any>} attributes\n * @return {Map<string,any>}\n *\n * @private\n * @function\n **/\nconst insertAttributes = (transaction, parent, currPos, attributes) => {\n const doc = transaction.doc;\n const ownClientId = doc.clientID;\n const negatedAttributes = new Map();\n // insert format-start items\n for (const key in attributes) {\n const val = attributes[key];\n const currentVal = currPos.currentAttributes.get(key) ?? null;\n if (!equalAttrs(currentVal, val)) {\n // save negated attribute (set null if currentVal undefined)\n negatedAttributes.set(key, currentVal);\n const { left, right } = currPos;\n currPos.right = new Item(createID(ownClientId, getState(doc.store, ownClientId)), left, left && left.lastId, right, right && right.id, parent, null, new ContentFormat(key, val));\n currPos.right.integrate(transaction, 0);\n currPos.forward();\n }\n }\n return negatedAttributes\n};\n\n/**\n * @param {Transaction} transaction\n * @param {AbstractType<any>} parent\n * @param {ItemTextListPosition} currPos\n * @param {string|object|AbstractType<any>} text\n * @param {Object<string,any>} attributes\n *\n * @private\n * @function\n **/\nconst insertText = (transaction, parent, currPos, text, attributes) => {\n currPos.currentAttributes.forEach((_val, key) => {\n if (attributes[key] === undefined) {\n attributes[key] = null;\n }\n });\n const doc = transaction.doc;\n const ownClientId = doc.clientID;\n minimizeAttributeChanges(currPos, attributes);\n const negatedAttributes = insertAttributes(transaction, parent, currPos, attributes);\n // insert content\n const content = text.constructor === String ? new ContentString(/** @type {string} */ (text)) : (text instanceof AbstractType ? new ContentType(text) : new ContentEmbed(text));\n let { left, right, index } = currPos;\n if (parent._searchMarker) {\n updateMarkerChanges(parent._searchMarker, currPos.index, content.getLength());\n }\n right = new Item(createID(ownClientId, getState(doc.store, ownClientId)), left, left && left.lastId, right, right && right.id, parent, null, content);\n right.integrate(transaction, 0);\n currPos.right = right;\n currPos.index = index;\n currPos.forward();\n insertNegatedAttributes(transaction, parent, currPos, negatedAttributes);\n};\n\n/**\n * @param {Transaction} transaction\n * @param {AbstractType<any>} parent\n * @param {ItemTextListPosition} currPos\n * @param {number} length\n * @param {Object<string,any>} attributes\n *\n * @private\n * @function\n */\nconst formatText = (transaction, parent, currPos, length, attributes) => {\n const doc = transaction.doc;\n const ownClientId = doc.clientID;\n minimizeAttributeChanges(currPos, attributes);\n const negatedAttributes = insertAttributes(transaction, parent, currPos, attributes);\n // iterate until first non-format or null is found\n // delete all formats with attributes[format.key] != null\n // also check the attributes after the first non-format as we do not want to insert redundant negated attributes there\n // eslint-disable-next-line no-labels\n iterationLoop: while (\n currPos.right !== null &&\n (length > 0 ||\n (\n negatedAttributes.size > 0 &&\n (currPos.right.deleted || currPos.right.content.constructor === ContentFormat)\n )\n )\n ) {\n if (!currPos.right.deleted) {\n switch (currPos.right.content.constructor) {\n case ContentFormat: {\n const { key, value } = /** @type {ContentFormat} */ (currPos.right.content);\n const attr = attributes[key];\n if (attr !== undefined) {\n if (equalAttrs(attr, value)) {\n negatedAttributes.delete(key);\n } else {\n if (length === 0) {\n // no need to further extend negatedAttributes\n // eslint-disable-next-line no-labels\n break iterationLoop\n }\n negatedAttributes.set(key, value);\n }\n currPos.right.delete(transaction);\n } else {\n currPos.currentAttributes.set(key, value);\n }\n break\n }\n default:\n if (length < currPos.right.length) {\n getItemCleanStart(transaction, createID(currPos.right.id.client, currPos.right.id.clock + length));\n }\n length -= currPos.right.length;\n break\n }\n }\n currPos.forward();\n }\n // Quill just assumes that the editor starts with a newline and that it always\n // ends with a newline. We only insert that newline when a new newline is\n // inserted - i.e when length is bigger than type.length\n if (length > 0) {\n let newlines = '';\n for (; length > 0; length--) {\n newlines += '\\n';\n }\n currPos.right = new Item(createID(ownClientId, getState(doc.store, ownClientId)), currPos.left, currPos.left && currPos.left.lastId, currPos.right, currPos.right && currPos.right.id, parent, null, new ContentString(newlines));\n currPos.right.integrate(transaction, 0);\n currPos.forward();\n }\n insertNegatedAttributes(transaction, parent, currPos, negatedAttributes);\n};\n\n/**\n * Call this function after string content has been deleted in order to\n * clean up formatting Items.\n *\n * @param {Transaction} transaction\n * @param {Item} start\n * @param {Item|null} curr exclusive end, automatically iterates to the next Content Item\n * @param {Map<string,any>} startAttributes\n * @param {Map<string,any>} currAttributes\n * @return {number} The amount of formatting Items deleted.\n *\n * @function\n */\nconst cleanupFormattingGap = (transaction, start, curr, startAttributes, currAttributes) => {\n /**\n * @type {Item|null}\n */\n let end = start;\n /**\n * @type {Map<string,ContentFormat>}\n */\n const endFormats = map.create();\n while (end && (!end.countable || end.deleted)) {\n if (!end.deleted && end.content.constructor === ContentFormat) {\n const cf = /** @type {ContentFormat} */ (end.content);\n endFormats.set(cf.key, cf);\n }\n end = end.right;\n }\n let cleanups = 0;\n let reachedCurr = false;\n while (start !== end) {\n if (curr === start) {\n reachedCurr = true;\n }\n if (!start.deleted) {\n const content = start.content;\n switch (content.constructor) {\n case ContentFormat: {\n const { key, value } = /** @type {ContentFormat} */ (content);\n const startAttrValue = startAttributes.get(key) ?? null;\n if (endFormats.get(key) !== content || startAttrValue === value) {\n // Either this format is overwritten or it is not necessary because the attribute already existed.\n start.delete(transaction);\n cleanups++;\n if (!reachedCurr && (currAttributes.get(key) ?? null) === value && startAttrValue !== value) {\n if (startAttrValue === null) {\n currAttributes.delete(key);\n } else {\n currAttributes.set(key, startAttrValue);\n }\n }\n }\n if (!reachedCurr && !start.deleted) {\n updateCurrentAttributes(currAttributes, /** @type {ContentFormat} */ (content));\n }\n break\n }\n }\n }\n start = /** @type {Item} */ (start.right);\n }\n return cleanups\n};\n\n/**\n * @param {Transaction} transaction\n * @param {Item | null} item\n */\nconst cleanupContextlessFormattingGap = (transaction, item) => {\n // iterate until item.right is null or content\n while (item && item.right && (item.right.deleted || !item.right.countable)) {\n item = item.right;\n }\n const attrs = new Set();\n // iterate back until a content item is found\n while (item && (item.deleted || !item.countable)) {\n if (!item.deleted && item.content.constructor === ContentFormat) {\n const key = /** @type {ContentFormat} */ (item.content).key;\n if (attrs.has(key)) {\n item.delete(transaction);\n } else {\n attrs.add(key);\n }\n }\n item = item.left;\n }\n};\n\n/**\n * This function is experimental and subject to change / be removed.\n *\n * Ideally, we don't need this function at all. Formatting attributes should be cleaned up\n * automatically after each change. This function iterates twice over the complete YText type\n * and removes unnecessary formatting attributes. This is also helpful for testing.\n *\n * This function won't be exported anymore as soon as there is confidence that the YText type works as intended.\n *\n * @param {YText} type\n * @return {number} How many formatting attributes have been cleaned up.\n */\nconst cleanupYTextFormatting = type => {\n let res = 0;\n transact(/** @type {Doc} */ (type.doc), transaction => {\n let start = /** @type {Item} */ (type._start);\n let end = type._start;\n let startAttributes = map.create();\n const currentAttributes = map.copy(startAttributes);\n while (end) {\n if (end.deleted === false) {\n switch (end.content.constructor) {\n case ContentFormat:\n updateCurrentAttributes(currentAttributes, /** @type {ContentFormat} */ (end.content));\n break\n default:\n res += cleanupFormattingGap(transaction, start, end, startAttributes, currentAttributes);\n startAttributes = map.copy(currentAttributes);\n start = end;\n break\n }\n }\n end = end.right;\n }\n });\n return res\n};\n\n/**\n * This will be called by the transaction once the event handlers are called to potentially cleanup\n * formatting attributes.\n *\n * @param {Transaction} transaction\n */\nconst cleanupYTextAfterTransaction = transaction => {\n /**\n * @type {Set<YText>}\n */\n const needFullCleanup = new Set();\n // check if another formatting item was inserted\n const doc = transaction.doc;\n for (const [client, afterClock] of transaction.afterState.entries()) {\n const clock = transaction.beforeState.get(client) || 0;\n if (afterClock === clock) {\n continue\n }\n iterateStructs(transaction, /** @type {Array<Item|GC>} */ (doc.store.clients.get(client)), clock, afterClock, item => {\n if (\n !item.deleted && /** @type {Item} */ (item).content.constructor === ContentFormat && item.constructor !== GC\n ) {\n needFullCleanup.add(/** @type {any} */ (item).parent);\n }\n });\n }\n // cleanup in a new transaction\n transact(doc, (t) => {\n iterateDeletedStructs(transaction, transaction.deleteSet, item => {\n if (item instanceof GC || !(/** @type {YText} */ (item.parent)._hasFormatting) || needFullCleanup.has(/** @type {YText} */ (item.parent))) {\n return\n }\n const parent = /** @type {YText} */ (item.parent);\n if (item.content.constructor === ContentFormat) {\n needFullCleanup.add(parent);\n } else {\n // If no formatting attribute was inserted or deleted, we can make due with contextless\n // formatting cleanups.\n // Contextless: it is not necessary to compute currentAttributes for the affected position.\n cleanupContextlessFormattingGap(t, item);\n }\n });\n // If a formatting item was inserted, we simply clean the whole type.\n // We need to compute currentAttributes for the current position anyway.\n for (const yText of needFullCleanup) {\n cleanupYTextFormatting(yText);\n }\n });\n};\n\n/**\n * @param {Transaction} transaction\n * @param {ItemTextListPosition} currPos\n * @param {number} length\n * @return {ItemTextListPosition}\n *\n * @private\n * @function\n */\nconst deleteText = (transaction, currPos, length) => {\n const startLength = length;\n const startAttrs = map.copy(currPos.currentAttributes);\n const start = currPos.right;\n while (length > 0 && currPos.right !== null) {\n if (currPos.right.deleted === false) {\n switch (currPos.right.content.constructor) {\n case ContentType:\n case ContentEmbed:\n case ContentString:\n if (length < currPos.right.length) {\n getItemCleanStart(transaction, createID(currPos.right.id.client, currPos.right.id.clock + length));\n }\n length -= currPos.right.length;\n currPos.right.delete(transaction);\n break\n }\n }\n currPos.forward();\n }\n if (start) {\n cleanupFormattingGap(transaction, start, currPos.right, startAttrs, currPos.currentAttributes);\n }\n const parent = /** @type {AbstractType<any>} */ (/** @type {Item} */ (currPos.left || currPos.right).parent);\n if (parent._searchMarker) {\n updateMarkerChanges(parent._searchMarker, currPos.index, -startLength + length);\n }\n return currPos\n};\n\n/**\n * The Quill Delta format represents changes on a text document with\n * formatting information. For more information visit {@link https://quilljs.com/docs/delta/|Quill Delta}\n *\n * @example\n * {\n * ops: [\n * { insert: 'Gandalf', attributes: { bold: true } },\n * { insert: ' the ' },\n * { insert: 'Grey', attributes: { color: '#cccccc' } }\n * ]\n * }\n *\n */\n\n/**\n * Attributes that can be assigned to a selection of text.\n *\n * @example\n * {\n * bold: true,\n * font-size: '40px'\n * }\n *\n * @typedef {Object} TextAttributes\n */\n\n/**\n * @extends YEvent<YText>\n * Event that describes the changes on a YText type.\n */\nclass YTextEvent extends YEvent {\n /**\n * @param {YText} ytext\n * @param {Transaction} transaction\n * @param {Set<any>} subs The keys that changed\n */\n constructor (ytext, transaction, subs) {\n super(ytext, transaction);\n /**\n * Whether the children changed.\n * @type {Boolean}\n * @private\n */\n this.childListChanged = false;\n /**\n * Set of all changed attributes.\n * @type {Set<string>}\n */\n this.keysChanged = new Set();\n subs.forEach((sub) => {\n if (sub === null) {\n this.childListChanged = true;\n } else {\n this.keysChanged.add(sub);\n }\n });\n }\n\n /**\n * @type {{added:Set<Item>,deleted:Set<Item>,keys:Map<string,{action:'add'|'update'|'delete',oldValue:any}>,delta:Array<{insert?:Array<any>|string, delete?:number, retain?:number}>}}\n */\n get changes () {\n if (this._changes === null) {\n /**\n * @type {{added:Set<Item>,deleted:Set<Item>,keys:Map<string,{action:'add'|'update'|'delete',oldValue:any}>,delta:Array<{insert?:Array<any>|string|AbstractType<any>|object, delete?:number, retain?:number}>}}\n */\n const changes = {\n keys: this.keys,\n delta: this.delta,\n added: new Set(),\n deleted: new Set()\n };\n this._changes = changes;\n }\n return /** @type {any} */ (this._changes)\n }\n\n /**\n * Compute the changes in the delta format.\n * A {@link https://quilljs.com/docs/delta/|Quill Delta}) that represents the changes on the document.\n *\n * @type {Array<{insert?:string|object|AbstractType<any>, delete?:number, retain?:number, attributes?: Object<string,any>}>}\n *\n * @public\n */\n get delta () {\n if (this._delta === null) {\n const y = /** @type {Doc} */ (this.target.doc);\n /**\n * @type {Array<{insert?:string|object|AbstractType<any>, delete?:number, retain?:number, attributes?: Object<string,any>}>}\n */\n const delta = [];\n transact(y, transaction => {\n const currentAttributes = new Map(); // saves all current attributes for insert\n const oldAttributes = new Map();\n let item = this.target._start;\n /**\n * @type {string?}\n */\n let action = null;\n /**\n * @type {Object<string,any>}\n */\n const attributes = {}; // counts added or removed new attributes for retain\n /**\n * @type {string|object}\n */\n let insert = '';\n let retain = 0;\n let deleteLen = 0;\n const addOp = () => {\n if (action !== null) {\n /**\n * @type {any}\n */\n let op = null;\n switch (action) {\n case 'delete':\n if (deleteLen > 0) {\n op = { delete: deleteLen };\n }\n deleteLen = 0;\n break\n case 'insert':\n if (typeof insert === 'object' || insert.length > 0) {\n op = { insert };\n if (currentAttributes.size > 0) {\n op.attributes = {};\n currentAttributes.forEach((value, key) => {\n if (value !== null) {\n op.attributes[key] = value;\n }\n });\n }\n }\n insert = '';\n break\n case 'retain':\n if (retain > 0) {\n op = { retain };\n if (!object.isEmpty(attributes)) {\n op.attributes = object.assign({}, attributes);\n }\n }\n retain = 0;\n break\n }\n if (op) delta.push(op);\n action = null;\n }\n };\n while (item !== null) {\n switch (item.content.constructor) {\n case ContentType:\n case ContentEmbed:\n if (this.adds(item)) {\n if (!this.deletes(item)) {\n addOp();\n action = 'insert';\n insert = item.content.getContent()[0];\n addOp();\n }\n } else if (this.deletes(item)) {\n if (action !== 'delete') {\n addOp();\n action = 'delete';\n }\n deleteLen += 1;\n } else if (!item.deleted) {\n if (action !== 'retain') {\n addOp();\n action = 'retain';\n }\n retain += 1;\n }\n break\n case ContentString:\n if (this.adds(item)) {\n if (!this.deletes(item)) {\n if (action !== 'insert') {\n addOp();\n action = 'insert';\n }\n insert += /** @type {ContentString} */ (item.content).str;\n }\n } else if (this.deletes(item)) {\n if (action !== 'delete') {\n addOp();\n action = 'delete';\n }\n deleteLen += item.length;\n } else if (!item.deleted) {\n if (action !== 'retain') {\n addOp();\n action = 'retain';\n }\n retain += item.length;\n }\n break\n case ContentFormat: {\n const { key, value } = /** @type {ContentFormat} */ (item.content);\n if (this.adds(item)) {\n if (!this.deletes(item)) {\n const curVal = currentAttributes.get(key) ?? null;\n if (!equalAttrs(curVal, value)) {\n if (action === 'retain') {\n addOp();\n }\n if (equalAttrs(value, (oldAttributes.get(key) ?? null))) {\n delete attributes[key];\n } else {\n attributes[key] = value;\n }\n } else if (value !== null) {\n item.delete(transaction);\n }\n }\n } else if (this.deletes(item)) {\n oldAttributes.set(key, value);\n const curVal = currentAttributes.get(key) ?? null;\n if (!equalAttrs(curVal, value)) {\n if (action === 'retain') {\n addOp();\n }\n attributes[key] = curVal;\n }\n } else if (!item.deleted) {\n oldAttributes.set(key, value);\n const attr = attributes[key];\n if (attr !== undefined) {\n if (!equalAttrs(attr, value)) {\n if (action === 'retain') {\n addOp();\n }\n if (value === null) {\n delete attributes[key];\n } else {\n attributes[key] = value;\n }\n } else if (attr !== null) { // this will be cleaned up automatically by the contextless cleanup function\n item.delete(transaction);\n }\n }\n }\n if (!item.deleted) {\n if (action === 'insert') {\n addOp();\n }\n updateCurrentAttributes(currentAttributes, /** @type {ContentFormat} */ (item.content));\n }\n break\n }\n }\n item = item.right;\n }\n addOp();\n while (delta.length > 0) {\n const lastOp = delta[delta.length - 1];\n if (lastOp.retain !== undefined && lastOp.attributes === undefined) {\n // retain delta's if they don't assign attributes\n delta.pop();\n } else {\n break\n }\n }\n });\n this._delta = delta;\n }\n return /** @type {any} */ (this._delta)\n }\n}\n\n/**\n * Type that represents text with formatting information.\n *\n * This type replaces y-richtext as this implementation is able to handle\n * block formats (format information on a paragraph), embeds (complex elements\n * like pictures and videos), and text formats (**bold**, *italic*).\n *\n * @extends AbstractType<YTextEvent>\n */\nclass YText extends AbstractType {\n /**\n * @param {String} [string] The initial value of the YText.\n */\n constructor (string) {\n super();\n /**\n * Array of pending operations on this type\n * @type {Array<function():void>?}\n */\n this._pending = string !== undefined ? [() => this.insert(0, string)] : [];\n /**\n * @type {Array<ArraySearchMarker>|null}\n */\n this._searchMarker = [];\n /**\n * Whether this YText contains formatting attributes.\n * This flag is updated when a formatting item is integrated (see ContentFormat.integrate)\n */\n this._hasFormatting = false;\n }\n\n /**\n * Number of characters of this text type.\n *\n * @type {number}\n */\n get length () {\n this.doc ?? warnPrematureAccess();\n return this._length\n }\n\n /**\n * @param {Doc} y\n * @param {Item} item\n */\n _integrate (y, item) {\n super._integrate(y, item);\n try {\n /** @type {Array<function>} */ (this._pending).forEach(f => f());\n } catch (e) {\n console.error(e);\n }\n this._pending = null;\n }\n\n _copy () {\n return new YText()\n }\n\n /**\n * Makes a copy of this data type that can be included somewhere else.\n *\n * Note that the content is only readable _after_ it has been included somewhere in the Ydoc.\n *\n * @return {YText}\n */\n clone () {\n const text = new YText();\n text.applyDelta(this.toDelta());\n return text\n }\n\n /**\n * Creates YTextEvent and calls observers.\n *\n * @param {Transaction} transaction\n * @param {Set<null|string>} parentSubs Keys changed on this type. `null` if list was modified.\n */\n _callObserver (transaction, parentSubs) {\n super._callObserver(transaction, parentSubs);\n const event = new YTextEvent(this, transaction, parentSubs);\n callTypeObservers(this, transaction, event);\n // If a remote change happened, we try to cleanup potential formatting duplicates.\n if (!transaction.local && this._hasFormatting) {\n transaction._needFormattingCleanup = true;\n }\n }\n\n /**\n * Returns the unformatted string representation of this YText type.\n *\n * @public\n */\n toString () {\n this.doc ?? warnPrematureAccess();\n let str = '';\n /**\n * @type {Item|null}\n */\n let n = this._start;\n while (n !== null) {\n if (!n.deleted && n.countable && n.content.constructor === ContentString) {\n str += /** @type {ContentString} */ (n.content).str;\n }\n n = n.right;\n }\n return str\n }\n\n /**\n * Returns the unformatted string representation of this YText type.\n *\n * @return {string}\n * @public\n */\n toJSON () {\n return this.toString()\n }\n\n /**\n * Apply a {@link Delta} on this shared YText type.\n *\n * @param {Array<any>} delta The changes to apply on this element.\n * @param {object} opts\n * @param {boolean} [opts.sanitize] Sanitize input delta. Removes ending newlines if set to true.\n *\n *\n * @public\n */\n applyDelta (delta, { sanitize = true } = {}) {\n if (this.doc !== null) {\n transact(this.doc, transaction => {\n const currPos = new ItemTextListPosition(null, this._start, 0, new Map());\n for (let i = 0; i < delta.length; i++) {\n const op = delta[i];\n if (op.insert !== undefined) {\n // Quill assumes that the content starts with an empty paragraph.\n // Yjs/Y.Text assumes that it starts empty. We always hide that\n // there is a newline at the end of the content.\n // If we omit this step, clients will see a different number of\n // paragraphs, but nothing bad will happen.\n const ins = (!sanitize && typeof op.insert === 'string' && i === delta.length - 1 && currPos.right === null && op.insert.slice(-1) === '\\n') ? op.insert.slice(0, -1) : op.insert;\n if (typeof ins !== 'string' || ins.length > 0) {\n insertText(transaction, this, currPos, ins, op.attributes || {});\n }\n } else if (op.retain !== undefined) {\n formatText(transaction, this, currPos, op.retain, op.attributes || {});\n } else if (op.delete !== undefined) {\n deleteText(transaction, currPos, op.delete);\n }\n }\n });\n } else {\n /** @type {Array<function>} */ (this._pending).push(() => this.applyDelta(delta));\n }\n }\n\n /**\n * Returns the Delta representation of this YText type.\n *\n * @param {Snapshot} [snapshot]\n * @param {Snapshot} [prevSnapshot]\n * @param {function('removed' | 'added', ID):any} [computeYChange]\n * @return {any} The Delta representation of this type.\n *\n * @public\n */\n toDelta (snapshot, prevSnapshot, computeYChange) {\n this.doc ?? warnPrematureAccess();\n /**\n * @type{Array<any>}\n */\n const ops = [];\n const currentAttributes = new Map();\n const doc = /** @type {Doc} */ (this.doc);\n let str = '';\n let n = this._start;\n function packStr () {\n if (str.length > 0) {\n // pack str with attributes to ops\n /**\n * @type {Object<string,any>}\n */\n const attributes = {};\n let addAttributes = false;\n currentAttributes.forEach((value, key) => {\n addAttributes = true;\n attributes[key] = value;\n });\n /**\n * @type {Object<string,any>}\n */\n const op = { insert: str };\n if (addAttributes) {\n op.attributes = attributes;\n }\n ops.push(op);\n str = '';\n }\n }\n const computeDelta = () => {\n while (n !== null) {\n if (isVisible(n, snapshot) || (prevSnapshot !== undefined && isVisible(n, prevSnapshot))) {\n switch (n.content.constructor) {\n case ContentString: {\n const cur = currentAttributes.get('ychange');\n if (snapshot !== undefined && !isVisible(n, snapshot)) {\n if (cur === undefined || cur.user !== n.id.client || cur.type !== 'removed') {\n packStr();\n currentAttributes.set('ychange', computeYChange ? computeYChange('removed', n.id) : { type: 'removed' });\n }\n } else if (prevSnapshot !== undefined && !isVisible(n, prevSnapshot)) {\n if (cur === undefined || cur.user !== n.id.client || cur.type !== 'added') {\n packStr();\n currentAttributes.set('ychange', computeYChange ? computeYChange('added', n.id) : { type: 'added' });\n }\n } else if (cur !== undefined) {\n packStr();\n currentAttributes.delete('ychange');\n }\n str += /** @type {ContentString} */ (n.content).str;\n break\n }\n case ContentType:\n case ContentEmbed: {\n packStr();\n /**\n * @type {Object<string,any>}\n */\n const op = {\n insert: n.content.getContent()[0]\n };\n if (currentAttributes.size > 0) {\n const attrs = /** @type {Object<string,any>} */ ({});\n op.attributes = attrs;\n currentAttributes.forEach((value, key) => {\n attrs[key] = value;\n });\n }\n ops.push(op);\n break\n }\n case ContentFormat:\n if (isVisible(n, snapshot)) {\n packStr();\n updateCurrentAttributes(currentAttributes, /** @type {ContentFormat} */ (n.content));\n }\n break\n }\n }\n n = n.right;\n }\n packStr();\n };\n if (snapshot || prevSnapshot) {\n // snapshots are merged again after the transaction, so we need to keep the\n // transaction alive until we are done\n transact(doc, transaction => {\n if (snapshot) {\n splitSnapshotAffectedStructs(transaction, snapshot);\n }\n if (prevSnapshot) {\n splitSnapshotAffectedStructs(transaction, prevSnapshot);\n }\n computeDelta();\n }, 'cleanup');\n } else {\n computeDelta();\n }\n return ops\n }\n\n /**\n * Insert text at a given index.\n *\n * @param {number} index The index at which to start inserting.\n * @param {String} text The text to insert at the specified position.\n * @param {TextAttributes} [attributes] Optionally define some formatting\n * information to apply on the inserted\n * Text.\n * @public\n */\n insert (index, text, attributes) {\n if (text.length <= 0) {\n return\n }\n const y = this.doc;\n if (y !== null) {\n transact(y, transaction => {\n const pos = findPosition(transaction, this, index, !attributes);\n if (!attributes) {\n attributes = {};\n // @ts-ignore\n pos.currentAttributes.forEach((v, k) => { attributes[k] = v; });\n }\n insertText(transaction, this, pos, text, attributes);\n });\n } else {\n /** @type {Array<function>} */ (this._pending).push(() => this.insert(index, text, attributes));\n }\n }\n\n /**\n * Inserts an embed at a index.\n *\n * @param {number} index The index to insert the embed at.\n * @param {Object | AbstractType<any>} embed The Object that represents the embed.\n * @param {TextAttributes} [attributes] Attribute information to apply on the\n * embed\n *\n * @public\n */\n insertEmbed (index, embed, attributes) {\n const y = this.doc;\n if (y !== null) {\n transact(y, transaction => {\n const pos = findPosition(transaction, this, index, !attributes);\n insertText(transaction, this, pos, embed, attributes || {});\n });\n } else {\n /** @type {Array<function>} */ (this._pending).push(() => this.insertEmbed(index, embed, attributes || {}));\n }\n }\n\n /**\n * Deletes text starting from an index.\n *\n * @param {number} index Index at which to start deleting.\n * @param {number} length The number of characters to remove. Defaults to 1.\n *\n * @public\n */\n delete (index, length) {\n if (length === 0) {\n return\n }\n const y = this.doc;\n if (y !== null) {\n transact(y, transaction => {\n deleteText(transaction, findPosition(transaction, this, index, true), length);\n });\n } else {\n /** @type {Array<function>} */ (this._pending).push(() => this.delete(index, length));\n }\n }\n\n /**\n * Assigns properties to a range of text.\n *\n * @param {number} index The position where to start formatting.\n * @param {number} length The amount of characters to assign properties to.\n * @param {TextAttributes} attributes Attribute information to apply on the\n * text.\n *\n * @public\n */\n format (index, length, attributes) {\n if (length === 0) {\n return\n }\n const y = this.doc;\n if (y !== null) {\n transact(y, transaction => {\n const pos = findPosition(transaction, this, index, false);\n if (pos.right === null) {\n return\n }\n formatText(transaction, this, pos, length, attributes);\n });\n } else {\n /** @type {Array<function>} */ (this._pending).push(() => this.format(index, length, attributes));\n }\n }\n\n /**\n * Removes an attribute.\n *\n * @note Xml-Text nodes don't have attributes. You can use this feature to assign properties to complete text-blocks.\n *\n * @param {String} attributeName The attribute name that is to be removed.\n *\n * @public\n */\n removeAttribute (attributeName) {\n if (this.doc !== null) {\n transact(this.doc, transaction => {\n typeMapDelete(transaction, this, attributeName);\n });\n } else {\n /** @type {Array<function>} */ (this._pending).push(() => this.removeAttribute(attributeName));\n }\n }\n\n /**\n * Sets or updates an attribute.\n *\n * @note Xml-Text nodes don't have attributes. You can use this feature to assign properties to complete text-blocks.\n *\n * @param {String} attributeName The attribute name that is to be set.\n * @param {any} attributeValue The attribute value that is to be set.\n *\n * @public\n */\n setAttribute (attributeName, attributeValue) {\n if (this.doc !== null) {\n transact(this.doc, transaction => {\n typeMapSet(transaction, this, attributeName, attributeValue);\n });\n } else {\n /** @type {Array<function>} */ (this._pending).push(() => this.setAttribute(attributeName, attributeValue));\n }\n }\n\n /**\n * Returns an attribute value that belongs to the attribute name.\n *\n * @note Xml-Text nodes don't have attributes. You can use this feature to assign properties to complete text-blocks.\n *\n * @param {String} attributeName The attribute name that identifies the\n * queried value.\n * @return {any} The queried attribute value.\n *\n * @public\n */\n getAttribute (attributeName) {\n return /** @type {any} */ (typeMapGet(this, attributeName))\n }\n\n /**\n * Returns all attribute name/value pairs in a JSON Object.\n *\n * @note Xml-Text nodes don't have attributes. You can use this feature to assign properties to complete text-blocks.\n *\n * @return {Object<string, any>} A JSON Object that describes the attributes.\n *\n * @public\n */\n getAttributes () {\n return typeMapGetAll(this)\n }\n\n /**\n * @param {UpdateEncoderV1 | UpdateEncoderV2} encoder\n */\n _write (encoder) {\n encoder.writeTypeRef(YTextRefID);\n }\n}\n\n/**\n * @param {UpdateDecoderV1 | UpdateDecoderV2} _decoder\n * @return {YText}\n *\n * @private\n * @function\n */\nconst readYText = _decoder => new YText();\n\n/**\n * @module YXml\n */\n\n\n/**\n * Define the elements to which a set of CSS queries apply.\n * {@link https://developer.mozilla.org/en-US/docs/Web/CSS/CSS_Selectors|CSS_Selectors}\n *\n * @example\n * query = '.classSelector'\n * query = 'nodeSelector'\n * query = '#idSelector'\n *\n * @typedef {string} CSS_Selector\n */\n\n/**\n * Dom filter function.\n *\n * @callback domFilter\n * @param {string} nodeName The nodeName of the element\n * @param {Map} attributes The map of attributes.\n * @return {boolean} Whether to include the Dom node in the YXmlElement.\n */\n\n/**\n * Represents a subset of the nodes of a YXmlElement / YXmlFragment and a\n * position within them.\n *\n * Can be created with {@link YXmlFragment#createTreeWalker}\n *\n * @public\n * @implements {Iterable<YXmlElement|YXmlText|YXmlElement|YXmlHook>}\n */\nclass YXmlTreeWalker {\n /**\n * @param {YXmlFragment | YXmlElement} root\n * @param {function(AbstractType<any>):boolean} [f]\n */\n constructor (root, f = () => true) {\n this._filter = f;\n this._root = root;\n /**\n * @type {Item}\n */\n this._currentNode = /** @type {Item} */ (root._start);\n this._firstCall = true;\n root.doc ?? warnPrematureAccess();\n }\n\n [Symbol.iterator] () {\n return this\n }\n\n /**\n * Get the next node.\n *\n * @return {IteratorResult<YXmlElement|YXmlText|YXmlHook>} The next node.\n *\n * @public\n */\n next () {\n /**\n * @type {Item|null}\n */\n let n = this._currentNode;\n let type = n && n.content && /** @type {any} */ (n.content).type;\n if (n !== null && (!this._firstCall || n.deleted || !this._filter(type))) { // if first call, we check if we can use the first item\n do {\n type = /** @type {any} */ (n.content).type;\n if (!n.deleted && (type.constructor === YXmlElement || type.constructor === YXmlFragment) && type._start !== null) {\n // walk down in the tree\n n = type._start;\n } else {\n // walk right or up in the tree\n while (n !== null) {\n /**\n * @type {Item | null}\n */\n const nxt = n.next;\n if (nxt !== null) {\n n = nxt;\n break\n } else if (n.parent === this._root) {\n n = null;\n } else {\n n = /** @type {AbstractType<any>} */ (n.parent)._item;\n }\n }\n }\n } while (n !== null && (n.deleted || !this._filter(/** @type {ContentType} */ (n.content).type)))\n }\n this._firstCall = false;\n if (n === null) {\n // @ts-ignore\n return { value: undefined, done: true }\n }\n this._currentNode = n;\n return { value: /** @type {any} */ (n.content).type, done: false }\n }\n}\n\n/**\n * Represents a list of {@link YXmlElement}.and {@link YXmlText} types.\n * A YxmlFragment is similar to a {@link YXmlElement}, but it does not have a\n * nodeName and it does not have attributes. Though it can be bound to a DOM\n * element - in this case the attributes and the nodeName are not shared.\n *\n * @public\n * @extends AbstractType<YXmlEvent>\n */\nclass YXmlFragment extends AbstractType {\n constructor () {\n super();\n /**\n * @type {Array<any>|null}\n */\n this._prelimContent = [];\n }\n\n /**\n * @type {YXmlElement|YXmlText|null}\n */\n get firstChild () {\n const first = this._first;\n return first ? first.content.getContent()[0] : null\n }\n\n /**\n * Integrate this type into the Yjs instance.\n *\n * * Save this struct in the os\n * * This type is sent to other client\n * * Observer functions are fired\n *\n * @param {Doc} y The Yjs instance\n * @param {Item} item\n */\n _integrate (y, item) {\n super._integrate(y, item);\n this.insert(0, /** @type {Array<any>} */ (this._prelimContent));\n this._prelimContent = null;\n }\n\n _copy () {\n return new YXmlFragment()\n }\n\n /**\n * Makes a copy of this data type that can be included somewhere else.\n *\n * Note that the content is only readable _after_ it has been included somewhere in the Ydoc.\n *\n * @return {YXmlFragment}\n */\n clone () {\n const el = new YXmlFragment();\n // @ts-ignore\n el.insert(0, this.toArray().map(item => item instanceof AbstractType ? item.clone() : item));\n return el\n }\n\n get length () {\n this.doc ?? warnPrematureAccess();\n return this._prelimContent === null ? this._length : this._prelimContent.length\n }\n\n /**\n * Create a subtree of childNodes.\n *\n * @example\n * const walker = elem.createTreeWalker(dom => dom.nodeName === 'div')\n * for (let node in walker) {\n * // `node` is a div node\n * nop(node)\n * }\n *\n * @param {function(AbstractType<any>):boolean} filter Function that is called on each child element and\n * returns a Boolean indicating whether the child\n * is to be included in the subtree.\n * @return {YXmlTreeWalker} A subtree and a position within it.\n *\n * @public\n */\n createTreeWalker (filter) {\n return new YXmlTreeWalker(this, filter)\n }\n\n /**\n * Returns the first YXmlElement that matches the query.\n * Similar to DOM's {@link querySelector}.\n *\n * Query support:\n * - tagname\n * TODO:\n * - id\n * - attribute\n *\n * @param {CSS_Selector} query The query on the children.\n * @return {YXmlElement|YXmlText|YXmlHook|null} The first element that matches the query or null.\n *\n * @public\n */\n querySelector (query) {\n query = query.toUpperCase();\n // @ts-ignore\n const iterator = new YXmlTreeWalker(this, element => element.nodeName && element.nodeName.toUpperCase() === query);\n const next = iterator.next();\n if (next.done) {\n return null\n } else {\n return next.value\n }\n }\n\n /**\n * Returns all YXmlElements that match the query.\n * Similar to Dom's {@link querySelectorAll}.\n *\n * @todo Does not yet support all queries. Currently only query by tagName.\n *\n * @param {CSS_Selector} query The query on the children\n * @return {Array<YXmlElement|YXmlText|YXmlHook|null>} The elements that match this query.\n *\n * @public\n */\n querySelectorAll (query) {\n query = query.toUpperCase();\n // @ts-ignore\n return array.from(new YXmlTreeWalker(this, element => element.nodeName && element.nodeName.toUpperCase() === query))\n }\n\n /**\n * Creates YXmlEvent and calls observers.\n *\n * @param {Transaction} transaction\n * @param {Set<null|string>} parentSubs Keys changed on this type. `null` if list was modified.\n */\n _callObserver (transaction, parentSubs) {\n callTypeObservers(this, transaction, new YXmlEvent(this, parentSubs, transaction));\n }\n\n /**\n * Get the string representation of all the children of this YXmlFragment.\n *\n * @return {string} The string representation of all children.\n */\n toString () {\n return typeListMap(this, xml => xml.toString()).join('')\n }\n\n /**\n * @return {string}\n */\n toJSON () {\n return this.toString()\n }\n\n /**\n * Creates a Dom Element that mirrors this YXmlElement.\n *\n * @param {Document} [_document=document] The document object (you must define\n * this when calling this method in\n * nodejs)\n * @param {Object<string, any>} [hooks={}] Optional property to customize how hooks\n * are presented in the DOM\n * @param {any} [binding] You should not set this property. This is\n * used if DomBinding wants to create a\n * association to the created DOM type.\n * @return {Node} The {@link https://developer.mozilla.org/en-US/docs/Web/API/Element|Dom Element}\n *\n * @public\n */\n toDOM (_document = document, hooks = {}, binding) {\n const fragment = _document.createDocumentFragment();\n if (binding !== undefined) {\n binding._createAssociation(fragment, this);\n }\n typeListForEach(this, xmlType => {\n fragment.insertBefore(xmlType.toDOM(_document, hooks, binding), null);\n });\n return fragment\n }\n\n /**\n * Inserts new content at an index.\n *\n * @example\n * // Insert character 'a' at position 0\n * xml.insert(0, [new Y.XmlText('text')])\n *\n * @param {number} index The index to insert content at\n * @param {Array<YXmlElement|YXmlText>} content The array of content\n */\n insert (index, content) {\n if (this.doc !== null) {\n transact(this.doc, transaction => {\n typeListInsertGenerics(transaction, this, index, content);\n });\n } else {\n // @ts-ignore _prelimContent is defined because this is not yet integrated\n this._prelimContent.splice(index, 0, ...content);\n }\n }\n\n /**\n * Inserts new content at an index.\n *\n * @example\n * // Insert character 'a' at position 0\n * xml.insert(0, [new Y.XmlText('text')])\n *\n * @param {null|Item|YXmlElement|YXmlText} ref The index to insert content at\n * @param {Array<YXmlElement|YXmlText>} content The array of content\n */\n insertAfter (ref, content) {\n if (this.doc !== null) {\n transact(this.doc, transaction => {\n const refItem = (ref && ref instanceof AbstractType) ? ref._item : ref;\n typeListInsertGenericsAfter(transaction, this, refItem, content);\n });\n } else {\n const pc = /** @type {Array<any>} */ (this._prelimContent);\n const index = ref === null ? 0 : pc.findIndex(el => el === ref) + 1;\n if (index === 0 && ref !== null) {\n throw error.create('Reference item not found')\n }\n pc.splice(index, 0, ...content);\n }\n }\n\n /**\n * Deletes elements starting from an index.\n *\n * @param {number} index Index at which to start deleting elements\n * @param {number} [length=1] The number of elements to remove. Defaults to 1.\n */\n delete (index, length = 1) {\n if (this.doc !== null) {\n transact(this.doc, transaction => {\n typeListDelete(transaction, this, index, length);\n });\n } else {\n // @ts-ignore _prelimContent is defined because this is not yet integrated\n this._prelimContent.splice(index, length);\n }\n }\n\n /**\n * Transforms this YArray to a JavaScript Array.\n *\n * @return {Array<YXmlElement|YXmlText|YXmlHook>}\n */\n toArray () {\n return typeListToArray(this)\n }\n\n /**\n * Appends content to this YArray.\n *\n * @param {Array<YXmlElement|YXmlText>} content Array of content to append.\n */\n push (content) {\n this.insert(this.length, content);\n }\n\n /**\n * Prepends content to this YArray.\n *\n * @param {Array<YXmlElement|YXmlText>} content Array of content to prepend.\n */\n unshift (content) {\n this.insert(0, content);\n }\n\n /**\n * Returns the i-th element from a YArray.\n *\n * @param {number} index The index of the element to return from the YArray\n * @return {YXmlElement|YXmlText}\n */\n get (index) {\n return typeListGet(this, index)\n }\n\n /**\n * Returns a portion of this YXmlFragment into a JavaScript Array selected\n * from start to end (end not included).\n *\n * @param {number} [start]\n * @param {number} [end]\n * @return {Array<YXmlElement|YXmlText>}\n */\n slice (start = 0, end = this.length) {\n return typeListSlice(this, start, end)\n }\n\n /**\n * Executes a provided function on once on every child element.\n *\n * @param {function(YXmlElement|YXmlText,number, typeof self):void} f A function to execute on every element of this YArray.\n */\n forEach (f) {\n typeListForEach(this, f);\n }\n\n /**\n * Transform the properties of this type to binary and write it to an\n * BinaryEncoder.\n *\n * This is called when this Item is sent to a remote peer.\n *\n * @param {UpdateEncoderV1 | UpdateEncoderV2} encoder The encoder to write data to.\n */\n _write (encoder) {\n encoder.writeTypeRef(YXmlFragmentRefID);\n }\n}\n\n/**\n * @param {UpdateDecoderV1 | UpdateDecoderV2} _decoder\n * @return {YXmlFragment}\n *\n * @private\n * @function\n */\nconst readYXmlFragment = _decoder => new YXmlFragment();\n\n/**\n * @typedef {Object|number|null|Array<any>|string|Uint8Array|AbstractType<any>} ValueTypes\n */\n\n/**\n * An YXmlElement imitates the behavior of a\n * https://developer.mozilla.org/en-US/docs/Web/API/Element|Dom Element\n *\n * * An YXmlElement has attributes (key value pairs)\n * * An YXmlElement has childElements that must inherit from YXmlElement\n *\n * @template {{ [key: string]: ValueTypes }} [KV={ [key: string]: string }]\n */\nclass YXmlElement extends YXmlFragment {\n constructor (nodeName = 'UNDEFINED') {\n super();\n this.nodeName = nodeName;\n /**\n * @type {Map<string, any>|null}\n */\n this._prelimAttrs = new Map();\n }\n\n /**\n * @type {YXmlElement|YXmlText|null}\n */\n get nextSibling () {\n const n = this._item ? this._item.next : null;\n return n ? /** @type {YXmlElement|YXmlText} */ (/** @type {ContentType} */ (n.content).type) : null\n }\n\n /**\n * @type {YXmlElement|YXmlText|null}\n */\n get prevSibling () {\n const n = this._item ? this._item.prev : null;\n return n ? /** @type {YXmlElement|YXmlText} */ (/** @type {ContentType} */ (n.content).type) : null\n }\n\n /**\n * Integrate this type into the Yjs instance.\n *\n * * Save this struct in the os\n * * This type is sent to other client\n * * Observer functions are fired\n *\n * @param {Doc} y The Yjs instance\n * @param {Item} item\n */\n _integrate (y, item) {\n super._integrate(y, item)\n ;(/** @type {Map<string, any>} */ (this._prelimAttrs)).forEach((value, key) => {\n this.setAttribute(key, value);\n });\n this._prelimAttrs = null;\n }\n\n /**\n * Creates an Item with the same effect as this Item (without position effect)\n *\n * @return {YXmlElement}\n */\n _copy () {\n return new YXmlElement(this.nodeName)\n }\n\n /**\n * Makes a copy of this data type that can be included somewhere else.\n *\n * Note that the content is only readable _after_ it has been included somewhere in the Ydoc.\n *\n * @return {YXmlElement<KV>}\n */\n clone () {\n /**\n * @type {YXmlElement<KV>}\n */\n const el = new YXmlElement(this.nodeName);\n const attrs = this.getAttributes();\n object.forEach(attrs, (value, key) => {\n if (typeof value === 'string') {\n el.setAttribute(key, value);\n }\n });\n // @ts-ignore\n el.insert(0, this.toArray().map(item => item instanceof AbstractType ? item.clone() : item));\n return el\n }\n\n /**\n * Returns the XML serialization of this YXmlElement.\n * The attributes are ordered by attribute-name, so you can easily use this\n * method to compare YXmlElements\n *\n * @return {string} The string representation of this type.\n *\n * @public\n */\n toString () {\n const attrs = this.getAttributes();\n const stringBuilder = [];\n const keys = [];\n for (const key in attrs) {\n keys.push(key);\n }\n keys.sort();\n const keysLen = keys.length;\n for (let i = 0; i < keysLen; i++) {\n const key = keys[i];\n stringBuilder.push(key + '=\"' + attrs[key] + '\"');\n }\n const nodeName = this.nodeName.toLocaleLowerCase();\n const attrsString = stringBuilder.length > 0 ? ' ' + stringBuilder.join(' ') : '';\n return `<${nodeName}${attrsString}>${super.toString()}</${nodeName}>`\n }\n\n /**\n * Removes an attribute from this YXmlElement.\n *\n * @param {string} attributeName The attribute name that is to be removed.\n *\n * @public\n */\n removeAttribute (attributeName) {\n if (this.doc !== null) {\n transact(this.doc, transaction => {\n typeMapDelete(transaction, this, attributeName);\n });\n } else {\n /** @type {Map<string,any>} */ (this._prelimAttrs).delete(attributeName);\n }\n }\n\n /**\n * Sets or updates an attribute.\n *\n * @template {keyof KV & string} KEY\n *\n * @param {KEY} attributeName The attribute name that is to be set.\n * @param {KV[KEY]} attributeValue The attribute value that is to be set.\n *\n * @public\n */\n setAttribute (attributeName, attributeValue) {\n if (this.doc !== null) {\n transact(this.doc, transaction => {\n typeMapSet(transaction, this, attributeName, attributeValue);\n });\n } else {\n /** @type {Map<string, any>} */ (this._prelimAttrs).set(attributeName, attributeValue);\n }\n }\n\n /**\n * Returns an attribute value that belongs to the attribute name.\n *\n * @template {keyof KV & string} KEY\n *\n * @param {KEY} attributeName The attribute name that identifies the\n * queried value.\n * @return {KV[KEY]|undefined} The queried attribute value.\n *\n * @public\n */\n getAttribute (attributeName) {\n return /** @type {any} */ (typeMapGet(this, attributeName))\n }\n\n /**\n * Returns whether an attribute exists\n *\n * @param {string} attributeName The attribute name to check for existence.\n * @return {boolean} whether the attribute exists.\n *\n * @public\n */\n hasAttribute (attributeName) {\n return /** @type {any} */ (typeMapHas(this, attributeName))\n }\n\n /**\n * Returns all attribute name/value pairs in a JSON Object.\n *\n * @param {Snapshot} [snapshot]\n * @return {{ [Key in Extract<keyof KV,string>]?: KV[Key]}} A JSON Object that describes the attributes.\n *\n * @public\n */\n getAttributes (snapshot) {\n return /** @type {any} */ (snapshot ? typeMapGetAllSnapshot(this, snapshot) : typeMapGetAll(this))\n }\n\n /**\n * Creates a Dom Element that mirrors this YXmlElement.\n *\n * @param {Document} [_document=document] The document object (you must define\n * this when calling this method in\n * nodejs)\n * @param {Object<string, any>} [hooks={}] Optional property to customize how hooks\n * are presented in the DOM\n * @param {any} [binding] You should not set this property. This is\n * used if DomBinding wants to create a\n * association to the created DOM type.\n * @return {Node} The {@link https://developer.mozilla.org/en-US/docs/Web/API/Element|Dom Element}\n *\n * @public\n */\n toDOM (_document = document, hooks = {}, binding) {\n const dom = _document.createElement(this.nodeName);\n const attrs = this.getAttributes();\n for (const key in attrs) {\n const value = attrs[key];\n if (typeof value === 'string') {\n dom.setAttribute(key, value);\n }\n }\n typeListForEach(this, yxml => {\n dom.appendChild(yxml.toDOM(_document, hooks, binding));\n });\n if (binding !== undefined) {\n binding._createAssociation(dom, this);\n }\n return dom\n }\n\n /**\n * Transform the properties of this type to binary and write it to an\n * BinaryEncoder.\n *\n * This is called when this Item is sent to a remote peer.\n *\n * @param {UpdateEncoderV1 | UpdateEncoderV2} encoder The encoder to write data to.\n */\n _write (encoder) {\n encoder.writeTypeRef(YXmlElementRefID);\n encoder.writeKey(this.nodeName);\n }\n}\n\n/**\n * @param {UpdateDecoderV1 | UpdateDecoderV2} decoder\n * @return {YXmlElement}\n *\n * @function\n */\nconst readYXmlElement = decoder => new YXmlElement(decoder.readKey());\n\n/**\n * @extends YEvent<YXmlElement|YXmlText|YXmlFragment>\n * An Event that describes changes on a YXml Element or Yxml Fragment\n */\nclass YXmlEvent extends YEvent {\n /**\n * @param {YXmlElement|YXmlText|YXmlFragment} target The target on which the event is created.\n * @param {Set<string|null>} subs The set of changed attributes. `null` is included if the\n * child list changed.\n * @param {Transaction} transaction The transaction instance with which the\n * change was created.\n */\n constructor (target, subs, transaction) {\n super(target, transaction);\n /**\n * Whether the children changed.\n * @type {Boolean}\n * @private\n */\n this.childListChanged = false;\n /**\n * Set of all changed attributes.\n * @type {Set<string>}\n */\n this.attributesChanged = new Set();\n subs.forEach((sub) => {\n if (sub === null) {\n this.childListChanged = true;\n } else {\n this.attributesChanged.add(sub);\n }\n });\n }\n}\n\n/**\n * You can manage binding to a custom type with YXmlHook.\n *\n * @extends {YMap<any>}\n */\nclass YXmlHook extends YMap {\n /**\n * @param {string} hookName nodeName of the Dom Node.\n */\n constructor (hookName) {\n super();\n /**\n * @type {string}\n */\n this.hookName = hookName;\n }\n\n /**\n * Creates an Item with the same effect as this Item (without position effect)\n */\n _copy () {\n return new YXmlHook(this.hookName)\n }\n\n /**\n * Makes a copy of this data type that can be included somewhere else.\n *\n * Note that the content is only readable _after_ it has been included somewhere in the Ydoc.\n *\n * @return {YXmlHook}\n */\n clone () {\n const el = new YXmlHook(this.hookName);\n this.forEach((value, key) => {\n el.set(key, value);\n });\n return el\n }\n\n /**\n * Creates a Dom Element that mirrors this YXmlElement.\n *\n * @param {Document} [_document=document] The document object (you must define\n * this when calling this method in\n * nodejs)\n * @param {Object.<string, any>} [hooks] Optional property to customize how hooks\n * are presented in the DOM\n * @param {any} [binding] You should not set this property. This is\n * used if DomBinding wants to create a\n * association to the created DOM type\n * @return {Element} The {@link https://developer.mozilla.org/en-US/docs/Web/API/Element|Dom Element}\n *\n * @public\n */\n toDOM (_document = document, hooks = {}, binding) {\n const hook = hooks[this.hookName];\n let dom;\n if (hook !== undefined) {\n dom = hook.createDom(this);\n } else {\n dom = document.createElement(this.hookName);\n }\n dom.setAttribute('data-yjs-hook', this.hookName);\n if (binding !== undefined) {\n binding._createAssociation(dom, this);\n }\n return dom\n }\n\n /**\n * Transform the properties of this type to binary and write it to an\n * BinaryEncoder.\n *\n * This is called when this Item is sent to a remote peer.\n *\n * @param {UpdateEncoderV1 | UpdateEncoderV2} encoder The encoder to write data to.\n */\n _write (encoder) {\n encoder.writeTypeRef(YXmlHookRefID);\n encoder.writeKey(this.hookName);\n }\n}\n\n/**\n * @param {UpdateDecoderV1 | UpdateDecoderV2} decoder\n * @return {YXmlHook}\n *\n * @private\n * @function\n */\nconst readYXmlHook = decoder =>\n new YXmlHook(decoder.readKey());\n\n/**\n * Represents text in a Dom Element. In the future this type will also handle\n * simple formatting information like bold and italic.\n */\nclass YXmlText extends YText {\n /**\n * @type {YXmlElement|YXmlText|null}\n */\n get nextSibling () {\n const n = this._item ? this._item.next : null;\n return n ? /** @type {YXmlElement|YXmlText} */ (/** @type {ContentType} */ (n.content).type) : null\n }\n\n /**\n * @type {YXmlElement|YXmlText|null}\n */\n get prevSibling () {\n const n = this._item ? this._item.prev : null;\n return n ? /** @type {YXmlElement|YXmlText} */ (/** @type {ContentType} */ (n.content).type) : null\n }\n\n _copy () {\n return new YXmlText()\n }\n\n /**\n * Makes a copy of this data type that can be included somewhere else.\n *\n * Note that the content is only readable _after_ it has been included somewhere in the Ydoc.\n *\n * @return {YXmlText}\n */\n clone () {\n const text = new YXmlText();\n text.applyDelta(this.toDelta());\n return text\n }\n\n /**\n * Creates a Dom Element that mirrors this YXmlText.\n *\n * @param {Document} [_document=document] The document object (you must define\n * this when calling this method in\n * nodejs)\n * @param {Object<string, any>} [hooks] Optional property to customize how hooks\n * are presented in the DOM\n * @param {any} [binding] You should not set this property. This is\n * used if DomBinding wants to create a\n * association to the created DOM type.\n * @return {Text} The {@link https://developer.mozilla.org/en-US/docs/Web/API/Element|Dom Element}\n *\n * @public\n */\n toDOM (_document = document, hooks, binding) {\n const dom = _document.createTextNode(this.toString());\n if (binding !== undefined) {\n binding._createAssociation(dom, this);\n }\n return dom\n }\n\n toString () {\n // @ts-ignore\n return this.toDelta().map(delta => {\n const nestedNodes = [];\n for (const nodeName in delta.attributes) {\n const attrs = [];\n for (const key in delta.attributes[nodeName]) {\n attrs.push({ key, value: delta.attributes[nodeName][key] });\n }\n // sort attributes to get a unique order\n attrs.sort((a, b) => a.key < b.key ? -1 : 1);\n nestedNodes.push({ nodeName, attrs });\n }\n // sort node order to get a unique order\n nestedNodes.sort((a, b) => a.nodeName < b.nodeName ? -1 : 1);\n // now convert to dom string\n let str = '';\n for (let i = 0; i < nestedNodes.length; i++) {\n const node = nestedNodes[i];\n str += `<${node.nodeName}`;\n for (let j = 0; j < node.attrs.length; j++) {\n const attr = node.attrs[j];\n str += ` ${attr.key}=\"${attr.value}\"`;\n }\n str += '>';\n }\n str += delta.insert;\n for (let i = nestedNodes.length - 1; i >= 0; i--) {\n str += `</${nestedNodes[i].nodeName}>`;\n }\n return str\n }).join('')\n }\n\n /**\n * @return {string}\n */\n toJSON () {\n return this.toString()\n }\n\n /**\n * @param {UpdateEncoderV1 | UpdateEncoderV2} encoder\n */\n _write (encoder) {\n encoder.writeTypeRef(YXmlTextRefID);\n }\n}\n\n/**\n * @param {UpdateDecoderV1 | UpdateDecoderV2} decoder\n * @return {YXmlText}\n *\n * @private\n * @function\n */\nconst readYXmlText = decoder => new YXmlText();\n\nclass AbstractStruct {\n /**\n * @param {ID} id\n * @param {number} length\n */\n constructor (id, length) {\n this.id = id;\n this.length = length;\n }\n\n /**\n * @type {boolean}\n */\n get deleted () {\n throw error.methodUnimplemented()\n }\n\n /**\n * Merge this struct with the item to the right.\n * This method is already assuming that `this.id.clock + this.length === this.id.clock`.\n * Also this method does *not* remove right from StructStore!\n * @param {AbstractStruct} right\n * @return {boolean} whether this merged with right\n */\n mergeWith (right) {\n return false\n }\n\n /**\n * @param {UpdateEncoderV1 | UpdateEncoderV2} encoder The encoder to write data to.\n * @param {number} offset\n * @param {number} encodingRef\n */\n write (encoder, offset, encodingRef) {\n throw error.methodUnimplemented()\n }\n\n /**\n * @param {Transaction} transaction\n * @param {number} offset\n */\n integrate (transaction, offset) {\n throw error.methodUnimplemented()\n }\n}\n\nconst structGCRefNumber = 0;\n\n/**\n * @private\n */\nclass GC extends AbstractStruct {\n get deleted () {\n return true\n }\n\n delete () {}\n\n /**\n * @param {GC} right\n * @return {boolean}\n */\n mergeWith (right) {\n if (this.constructor !== right.constructor) {\n return false\n }\n this.length += right.length;\n return true\n }\n\n /**\n * @param {Transaction} transaction\n * @param {number} offset\n */\n integrate (transaction, offset) {\n if (offset > 0) {\n this.id.clock += offset;\n this.length -= offset;\n }\n addStruct(transaction.doc.store, this);\n }\n\n /**\n * @param {UpdateEncoderV1 | UpdateEncoderV2} encoder\n * @param {number} offset\n */\n write (encoder, offset) {\n encoder.writeInfo(structGCRefNumber);\n encoder.writeLen(this.length - offset);\n }\n\n /**\n * @param {Transaction} transaction\n * @param {StructStore} store\n * @return {null | number}\n */\n getMissing (transaction, store) {\n return null\n }\n}\n\nclass ContentBinary {\n /**\n * @param {Uint8Array} content\n */\n constructor (content) {\n this.content = content;\n }\n\n /**\n * @return {number}\n */\n getLength () {\n return 1\n }\n\n /**\n * @return {Array<any>}\n */\n getContent () {\n return [this.content]\n }\n\n /**\n * @return {boolean}\n */\n isCountable () {\n return true\n }\n\n /**\n * @return {ContentBinary}\n */\n copy () {\n return new ContentBinary(this.content)\n }\n\n /**\n * @param {number} offset\n * @return {ContentBinary}\n */\n splice (offset) {\n throw error.methodUnimplemented()\n }\n\n /**\n * @param {ContentBinary} right\n * @return {boolean}\n */\n mergeWith (right) {\n return false\n }\n\n /**\n * @param {Transaction} transaction\n * @param {Item} item\n */\n integrate (transaction, item) {}\n /**\n * @param {Transaction} transaction\n */\n delete (transaction) {}\n /**\n * @param {StructStore} store\n */\n gc (store) {}\n /**\n * @param {UpdateEncoderV1 | UpdateEncoderV2} encoder\n * @param {number} offset\n */\n write (encoder, offset) {\n encoder.writeBuf(this.content);\n }\n\n /**\n * @return {number}\n */\n getRef () {\n return 3\n }\n}\n\n/**\n * @param {UpdateDecoderV1 | UpdateDecoderV2 } decoder\n * @return {ContentBinary}\n */\nconst readContentBinary = decoder => new ContentBinary(decoder.readBuf());\n\nclass ContentDeleted {\n /**\n * @param {number} len\n */\n constructor (len) {\n this.len = len;\n }\n\n /**\n * @return {number}\n */\n getLength () {\n return this.len\n }\n\n /**\n * @return {Array<any>}\n */\n getContent () {\n return []\n }\n\n /**\n * @return {boolean}\n */\n isCountable () {\n return false\n }\n\n /**\n * @return {ContentDeleted}\n */\n copy () {\n return new ContentDeleted(this.len)\n }\n\n /**\n * @param {number} offset\n * @return {ContentDeleted}\n */\n splice (offset) {\n const right = new ContentDeleted(this.len - offset);\n this.len = offset;\n return right\n }\n\n /**\n * @param {ContentDeleted} right\n * @return {boolean}\n */\n mergeWith (right) {\n this.len += right.len;\n return true\n }\n\n /**\n * @param {Transaction} transaction\n * @param {Item} item\n */\n integrate (transaction, item) {\n addToDeleteSet(transaction.deleteSet, item.id.client, item.id.clock, this.len);\n item.markDeleted();\n }\n\n /**\n * @param {Transaction} transaction\n */\n delete (transaction) {}\n /**\n * @param {StructStore} store\n */\n gc (store) {}\n /**\n * @param {UpdateEncoderV1 | UpdateEncoderV2} encoder\n * @param {number} offset\n */\n write (encoder, offset) {\n encoder.writeLen(this.len - offset);\n }\n\n /**\n * @return {number}\n */\n getRef () {\n return 1\n }\n}\n\n/**\n * @private\n *\n * @param {UpdateDecoderV1 | UpdateDecoderV2 } decoder\n * @return {ContentDeleted}\n */\nconst readContentDeleted = decoder => new ContentDeleted(decoder.readLen());\n\n/**\n * @param {string} guid\n * @param {Object<string, any>} opts\n */\nconst createDocFromOpts = (guid, opts) => new Doc({ guid, ...opts, shouldLoad: opts.shouldLoad || opts.autoLoad || false });\n\n/**\n * @private\n */\nclass ContentDoc {\n /**\n * @param {Doc} doc\n */\n constructor (doc) {\n if (doc._item) {\n console.error('This document was already integrated as a sub-document. You should create a second instance instead with the same guid.');\n }\n /**\n * @type {Doc}\n */\n this.doc = doc;\n /**\n * @type {any}\n */\n const opts = {};\n this.opts = opts;\n if (!doc.gc) {\n opts.gc = false;\n }\n if (doc.autoLoad) {\n opts.autoLoad = true;\n }\n if (doc.meta !== null) {\n opts.meta = doc.meta;\n }\n }\n\n /**\n * @return {number}\n */\n getLength () {\n return 1\n }\n\n /**\n * @return {Array<any>}\n */\n getContent () {\n return [this.doc]\n }\n\n /**\n * @return {boolean}\n */\n isCountable () {\n return true\n }\n\n /**\n * @return {ContentDoc}\n */\n copy () {\n return new ContentDoc(createDocFromOpts(this.doc.guid, this.opts))\n }\n\n /**\n * @param {number} offset\n * @return {ContentDoc}\n */\n splice (offset) {\n throw error.methodUnimplemented()\n }\n\n /**\n * @param {ContentDoc} right\n * @return {boolean}\n */\n mergeWith (right) {\n return false\n }\n\n /**\n * @param {Transaction} transaction\n * @param {Item} item\n */\n integrate (transaction, item) {\n // this needs to be reflected in doc.destroy as well\n this.doc._item = item;\n transaction.subdocsAdded.add(this.doc);\n if (this.doc.shouldLoad) {\n transaction.subdocsLoaded.add(this.doc);\n }\n }\n\n /**\n * @param {Transaction} transaction\n */\n delete (transaction) {\n if (transaction.subdocsAdded.has(this.doc)) {\n transaction.subdocsAdded.delete(this.doc);\n } else {\n transaction.subdocsRemoved.add(this.doc);\n }\n }\n\n /**\n * @param {StructStore} store\n */\n gc (store) { }\n\n /**\n * @param {UpdateEncoderV1 | UpdateEncoderV2} encoder\n * @param {number} offset\n */\n write (encoder, offset) {\n encoder.writeString(this.doc.guid);\n encoder.writeAny(this.opts);\n }\n\n /**\n * @return {number}\n */\n getRef () {\n return 9\n }\n}\n\n/**\n * @private\n *\n * @param {UpdateDecoderV1 | UpdateDecoderV2} decoder\n * @return {ContentDoc}\n */\nconst readContentDoc = decoder => new ContentDoc(createDocFromOpts(decoder.readString(), decoder.readAny()));\n\n/**\n * @private\n */\nclass ContentEmbed {\n /**\n * @param {Object} embed\n */\n constructor (embed) {\n this.embed = embed;\n }\n\n /**\n * @return {number}\n */\n getLength () {\n return 1\n }\n\n /**\n * @return {Array<any>}\n */\n getContent () {\n return [this.embed]\n }\n\n /**\n * @return {boolean}\n */\n isCountable () {\n return true\n }\n\n /**\n * @return {ContentEmbed}\n */\n copy () {\n return new ContentEmbed(this.embed)\n }\n\n /**\n * @param {number} offset\n * @return {ContentEmbed}\n */\n splice (offset) {\n throw error.methodUnimplemented()\n }\n\n /**\n * @param {ContentEmbed} right\n * @return {boolean}\n */\n mergeWith (right) {\n return false\n }\n\n /**\n * @param {Transaction} transaction\n * @param {Item} item\n */\n integrate (transaction, item) {}\n /**\n * @param {Transaction} transaction\n */\n delete (transaction) {}\n /**\n * @param {StructStore} store\n */\n gc (store) {}\n /**\n * @param {UpdateEncoderV1 | UpdateEncoderV2} encoder\n * @param {number} offset\n */\n write (encoder, offset) {\n encoder.writeJSON(this.embed);\n }\n\n /**\n * @return {number}\n */\n getRef () {\n return 5\n }\n}\n\n/**\n * @private\n *\n * @param {UpdateDecoderV1 | UpdateDecoderV2} decoder\n * @return {ContentEmbed}\n */\nconst readContentEmbed = decoder => new ContentEmbed(decoder.readJSON());\n\n/**\n * @private\n */\nclass ContentFormat {\n /**\n * @param {string} key\n * @param {Object} value\n */\n constructor (key, value) {\n this.key = key;\n this.value = value;\n }\n\n /**\n * @return {number}\n */\n getLength () {\n return 1\n }\n\n /**\n * @return {Array<any>}\n */\n getContent () {\n return []\n }\n\n /**\n * @return {boolean}\n */\n isCountable () {\n return false\n }\n\n /**\n * @return {ContentFormat}\n */\n copy () {\n return new ContentFormat(this.key, this.value)\n }\n\n /**\n * @param {number} _offset\n * @return {ContentFormat}\n */\n splice (_offset) {\n throw error.methodUnimplemented()\n }\n\n /**\n * @param {ContentFormat} _right\n * @return {boolean}\n */\n mergeWith (_right) {\n return false\n }\n\n /**\n * @param {Transaction} _transaction\n * @param {Item} item\n */\n integrate (_transaction, item) {\n // @todo searchmarker are currently unsupported for rich text documents\n const p = /** @type {YText} */ (item.parent);\n p._searchMarker = null;\n p._hasFormatting = true;\n }\n\n /**\n * @param {Transaction} transaction\n */\n delete (transaction) {}\n /**\n * @param {StructStore} store\n */\n gc (store) {}\n /**\n * @param {UpdateEncoderV1 | UpdateEncoderV2} encoder\n * @param {number} offset\n */\n write (encoder, offset) {\n encoder.writeKey(this.key);\n encoder.writeJSON(this.value);\n }\n\n /**\n * @return {number}\n */\n getRef () {\n return 6\n }\n}\n\n/**\n * @param {UpdateDecoderV1 | UpdateDecoderV2} decoder\n * @return {ContentFormat}\n */\nconst readContentFormat = decoder => new ContentFormat(decoder.readKey(), decoder.readJSON());\n\n/**\n * @private\n */\nclass ContentJSON {\n /**\n * @param {Array<any>} arr\n */\n constructor (arr) {\n /**\n * @type {Array<any>}\n */\n this.arr = arr;\n }\n\n /**\n * @return {number}\n */\n getLength () {\n return this.arr.length\n }\n\n /**\n * @return {Array<any>}\n */\n getContent () {\n return this.arr\n }\n\n /**\n * @return {boolean}\n */\n isCountable () {\n return true\n }\n\n /**\n * @return {ContentJSON}\n */\n copy () {\n return new ContentJSON(this.arr)\n }\n\n /**\n * @param {number} offset\n * @return {ContentJSON}\n */\n splice (offset) {\n const right = new ContentJSON(this.arr.slice(offset));\n this.arr = this.arr.slice(0, offset);\n return right\n }\n\n /**\n * @param {ContentJSON} right\n * @return {boolean}\n */\n mergeWith (right) {\n this.arr = this.arr.concat(right.arr);\n return true\n }\n\n /**\n * @param {Transaction} transaction\n * @param {Item} item\n */\n integrate (transaction, item) {}\n /**\n * @param {Transaction} transaction\n */\n delete (transaction) {}\n /**\n * @param {StructStore} store\n */\n gc (store) {}\n /**\n * @param {UpdateEncoderV1 | UpdateEncoderV2} encoder\n * @param {number} offset\n */\n write (encoder, offset) {\n const len = this.arr.length;\n encoder.writeLen(len - offset);\n for (let i = offset; i < len; i++) {\n const c = this.arr[i];\n encoder.writeString(c === undefined ? 'undefined' : JSON.stringify(c));\n }\n }\n\n /**\n * @return {number}\n */\n getRef () {\n return 2\n }\n}\n\n/**\n * @private\n *\n * @param {UpdateDecoderV1 | UpdateDecoderV2} decoder\n * @return {ContentJSON}\n */\nconst readContentJSON = decoder => {\n const len = decoder.readLen();\n const cs = [];\n for (let i = 0; i < len; i++) {\n const c = decoder.readString();\n if (c === 'undefined') {\n cs.push(undefined);\n } else {\n cs.push(JSON.parse(c));\n }\n }\n return new ContentJSON(cs)\n};\n\nconst isDevMode = env.getVariable('node_env') === 'development';\n\nclass ContentAny {\n /**\n * @param {Array<any>} arr\n */\n constructor (arr) {\n /**\n * @type {Array<any>}\n */\n this.arr = arr;\n isDevMode && object.deepFreeze(arr);\n }\n\n /**\n * @return {number}\n */\n getLength () {\n return this.arr.length\n }\n\n /**\n * @return {Array<any>}\n */\n getContent () {\n return this.arr\n }\n\n /**\n * @return {boolean}\n */\n isCountable () {\n return true\n }\n\n /**\n * @return {ContentAny}\n */\n copy () {\n return new ContentAny(this.arr)\n }\n\n /**\n * @param {number} offset\n * @return {ContentAny}\n */\n splice (offset) {\n const right = new ContentAny(this.arr.slice(offset));\n this.arr = this.arr.slice(0, offset);\n return right\n }\n\n /**\n * @param {ContentAny} right\n * @return {boolean}\n */\n mergeWith (right) {\n this.arr = this.arr.concat(right.arr);\n return true\n }\n\n /**\n * @param {Transaction} transaction\n * @param {Item} item\n */\n integrate (transaction, item) {}\n /**\n * @param {Transaction} transaction\n */\n delete (transaction) {}\n /**\n * @param {StructStore} store\n */\n gc (store) {}\n /**\n * @param {UpdateEncoderV1 | UpdateEncoderV2} encoder\n * @param {number} offset\n */\n write (encoder, offset) {\n const len = this.arr.length;\n encoder.writeLen(len - offset);\n for (let i = offset; i < len; i++) {\n const c = this.arr[i];\n encoder.writeAny(c);\n }\n }\n\n /**\n * @return {number}\n */\n getRef () {\n return 8\n }\n}\n\n/**\n * @param {UpdateDecoderV1 | UpdateDecoderV2} decoder\n * @return {ContentAny}\n */\nconst readContentAny = decoder => {\n const len = decoder.readLen();\n const cs = [];\n for (let i = 0; i < len; i++) {\n cs.push(decoder.readAny());\n }\n return new ContentAny(cs)\n};\n\n/**\n * @private\n */\nclass ContentString {\n /**\n * @param {string} str\n */\n constructor (str) {\n /**\n * @type {string}\n */\n this.str = str;\n }\n\n /**\n * @return {number}\n */\n getLength () {\n return this.str.length\n }\n\n /**\n * @return {Array<any>}\n */\n getContent () {\n return this.str.split('')\n }\n\n /**\n * @return {boolean}\n */\n isCountable () {\n return true\n }\n\n /**\n * @return {ContentString}\n */\n copy () {\n return new ContentString(this.str)\n }\n\n /**\n * @param {number} offset\n * @return {ContentString}\n */\n splice (offset) {\n const right = new ContentString(this.str.slice(offset));\n this.str = this.str.slice(0, offset);\n\n // Prevent encoding invalid documents because of splitting of surrogate pairs: https://github.com/yjs/yjs/issues/248\n const firstCharCode = this.str.charCodeAt(offset - 1);\n if (firstCharCode >= 0xD800 && firstCharCode <= 0xDBFF) {\n // Last character of the left split is the start of a surrogate utf16/ucs2 pair.\n // We don't support splitting of surrogate pairs because this may lead to invalid documents.\n // Replace the invalid character with a unicode replacement character (� / U+FFFD)\n this.str = this.str.slice(0, offset - 1) + '�';\n // replace right as well\n right.str = '�' + right.str.slice(1);\n }\n return right\n }\n\n /**\n * @param {ContentString} right\n * @return {boolean}\n */\n mergeWith (right) {\n this.str += right.str;\n return true\n }\n\n /**\n * @param {Transaction} transaction\n * @param {Item} item\n */\n integrate (transaction, item) {}\n /**\n * @param {Transaction} transaction\n */\n delete (transaction) {}\n /**\n * @param {StructStore} store\n */\n gc (store) {}\n /**\n * @param {UpdateEncoderV1 | UpdateEncoderV2} encoder\n * @param {number} offset\n */\n write (encoder, offset) {\n encoder.writeString(offset === 0 ? this.str : this.str.slice(offset));\n }\n\n /**\n * @return {number}\n */\n getRef () {\n return 4\n }\n}\n\n/**\n * @private\n *\n * @param {UpdateDecoderV1 | UpdateDecoderV2} decoder\n * @return {ContentString}\n */\nconst readContentString = decoder => new ContentString(decoder.readString());\n\n/**\n * @type {Array<function(UpdateDecoderV1 | UpdateDecoderV2):AbstractType<any>>}\n * @private\n */\nconst typeRefs = [\n readYArray,\n readYMap,\n readYText,\n readYXmlElement,\n readYXmlFragment,\n readYXmlHook,\n readYXmlText\n];\n\nconst YArrayRefID = 0;\nconst YMapRefID = 1;\nconst YTextRefID = 2;\nconst YXmlElementRefID = 3;\nconst YXmlFragmentRefID = 4;\nconst YXmlHookRefID = 5;\nconst YXmlTextRefID = 6;\n\n/**\n * @private\n */\nclass ContentType {\n /**\n * @param {AbstractType<any>} type\n */\n constructor (type) {\n /**\n * @type {AbstractType<any>}\n */\n this.type = type;\n }\n\n /**\n * @return {number}\n */\n getLength () {\n return 1\n }\n\n /**\n * @return {Array<any>}\n */\n getContent () {\n return [this.type]\n }\n\n /**\n * @return {boolean}\n */\n isCountable () {\n return true\n }\n\n /**\n * @return {ContentType}\n */\n copy () {\n return new ContentType(this.type._copy())\n }\n\n /**\n * @param {number} offset\n * @return {ContentType}\n */\n splice (offset) {\n throw error.methodUnimplemented()\n }\n\n /**\n * @param {ContentType} right\n * @return {boolean}\n */\n mergeWith (right) {\n return false\n }\n\n /**\n * @param {Transaction} transaction\n * @param {Item} item\n */\n integrate (transaction, item) {\n this.type._integrate(transaction.doc, item);\n }\n\n /**\n * @param {Transaction} transaction\n */\n delete (transaction) {\n let item = this.type._start;\n while (item !== null) {\n if (!item.deleted) {\n item.delete(transaction);\n } else if (item.id.clock < (transaction.beforeState.get(item.id.client) || 0)) {\n // This will be gc'd later and we want to merge it if possible\n // We try to merge all deleted items after each transaction,\n // but we have no knowledge about that this needs to be merged\n // since it is not in transaction.ds. Hence we add it to transaction._mergeStructs\n transaction._mergeStructs.push(item);\n }\n item = item.right;\n }\n this.type._map.forEach(item => {\n if (!item.deleted) {\n item.delete(transaction);\n } else if (item.id.clock < (transaction.beforeState.get(item.id.client) || 0)) {\n // same as above\n transaction._mergeStructs.push(item);\n }\n });\n transaction.changed.delete(this.type);\n }\n\n /**\n * @param {StructStore} store\n */\n gc (store) {\n let item = this.type._start;\n while (item !== null) {\n item.gc(store, true);\n item = item.right;\n }\n this.type._start = null;\n this.type._map.forEach(/** @param {Item | null} item */ (item) => {\n while (item !== null) {\n item.gc(store, true);\n item = item.left;\n }\n });\n this.type._map = new Map();\n }\n\n /**\n * @param {UpdateEncoderV1 | UpdateEncoderV2} encoder\n * @param {number} offset\n */\n write (encoder, offset) {\n this.type._write(encoder);\n }\n\n /**\n * @return {number}\n */\n getRef () {\n return 7\n }\n}\n\n/**\n * @private\n *\n * @param {UpdateDecoderV1 | UpdateDecoderV2} decoder\n * @return {ContentType}\n */\nconst readContentType = decoder => new ContentType(typeRefs[decoder.readTypeRef()](decoder));\n\n/**\n * @todo This should return several items\n *\n * @param {StructStore} store\n * @param {ID} id\n * @return {{item:Item, diff:number}}\n */\nconst followRedone = (store, id) => {\n /**\n * @type {ID|null}\n */\n let nextID = id;\n let diff = 0;\n let item;\n do {\n if (diff > 0) {\n nextID = createID(nextID.client, nextID.clock + diff);\n }\n item = getItem(store, nextID);\n diff = nextID.clock - item.id.clock;\n nextID = item.redone;\n } while (nextID !== null && item instanceof Item)\n return {\n item, diff\n }\n};\n\n/**\n * Make sure that neither item nor any of its parents is ever deleted.\n *\n * This property does not persist when storing it into a database or when\n * sending it to other peers\n *\n * @param {Item|null} item\n * @param {boolean} keep\n */\nconst keepItem = (item, keep) => {\n while (item !== null && item.keep !== keep) {\n item.keep = keep;\n item = /** @type {AbstractType<any>} */ (item.parent)._item;\n }\n};\n\n/**\n * Split leftItem into two items\n * @param {Transaction} transaction\n * @param {Item} leftItem\n * @param {number} diff\n * @return {Item}\n *\n * @function\n * @private\n */\nconst splitItem = (transaction, leftItem, diff) => {\n // create rightItem\n const { client, clock } = leftItem.id;\n const rightItem = new Item(\n createID(client, clock + diff),\n leftItem,\n createID(client, clock + diff - 1),\n leftItem.right,\n leftItem.rightOrigin,\n leftItem.parent,\n leftItem.parentSub,\n leftItem.content.splice(diff)\n );\n if (leftItem.deleted) {\n rightItem.markDeleted();\n }\n if (leftItem.keep) {\n rightItem.keep = true;\n }\n if (leftItem.redone !== null) {\n rightItem.redone = createID(leftItem.redone.client, leftItem.redone.clock + diff);\n }\n // update left (do not set leftItem.rightOrigin as it will lead to problems when syncing)\n leftItem.right = rightItem;\n // update right\n if (rightItem.right !== null) {\n rightItem.right.left = rightItem;\n }\n // right is more specific.\n transaction._mergeStructs.push(rightItem);\n // update parent._map\n if (rightItem.parentSub !== null && rightItem.right === null) {\n /** @type {AbstractType<any>} */ (rightItem.parent)._map.set(rightItem.parentSub, rightItem);\n }\n leftItem.length = diff;\n return rightItem\n};\n\n/**\n * @param {Array<StackItem>} stack\n * @param {ID} id\n */\nconst isDeletedByUndoStack = (stack, id) => array.some(stack, /** @param {StackItem} s */ s => isDeleted(s.deletions, id));\n\n/**\n * Redoes the effect of this operation.\n *\n * @param {Transaction} transaction The Yjs instance.\n * @param {Item} item\n * @param {Set<Item>} redoitems\n * @param {DeleteSet} itemsToDelete\n * @param {boolean} ignoreRemoteMapChanges\n * @param {import('../utils/UndoManager.js').UndoManager} um\n *\n * @return {Item|null}\n *\n * @private\n */\nconst redoItem = (transaction, item, redoitems, itemsToDelete, ignoreRemoteMapChanges, um) => {\n const doc = transaction.doc;\n const store = doc.store;\n const ownClientID = doc.clientID;\n const redone = item.redone;\n if (redone !== null) {\n return getItemCleanStart(transaction, redone)\n }\n let parentItem = /** @type {AbstractType<any>} */ (item.parent)._item;\n /**\n * @type {Item|null}\n */\n let left = null;\n /**\n * @type {Item|null}\n */\n let right;\n // make sure that parent is redone\n if (parentItem !== null && parentItem.deleted === true) {\n // try to undo parent if it will be undone anyway\n if (parentItem.redone === null && (!redoitems.has(parentItem) || redoItem(transaction, parentItem, redoitems, itemsToDelete, ignoreRemoteMapChanges, um) === null)) {\n return null\n }\n while (parentItem.redone !== null) {\n parentItem = getItemCleanStart(transaction, parentItem.redone);\n }\n }\n const parentType = parentItem === null ? /** @type {AbstractType<any>} */ (item.parent) : /** @type {ContentType} */ (parentItem.content).type;\n\n if (item.parentSub === null) {\n // Is an array item. Insert at the old position\n left = item.left;\n right = item;\n // find next cloned_redo items\n while (left !== null) {\n /**\n * @type {Item|null}\n */\n let leftTrace = left;\n // trace redone until parent matches\n while (leftTrace !== null && /** @type {AbstractType<any>} */ (leftTrace.parent)._item !== parentItem) {\n leftTrace = leftTrace.redone === null ? null : getItemCleanStart(transaction, leftTrace.redone);\n }\n if (leftTrace !== null && /** @type {AbstractType<any>} */ (leftTrace.parent)._item === parentItem) {\n left = leftTrace;\n break\n }\n left = left.left;\n }\n while (right !== null) {\n /**\n * @type {Item|null}\n */\n let rightTrace = right;\n // trace redone until parent matches\n while (rightTrace !== null && /** @type {AbstractType<any>} */ (rightTrace.parent)._item !== parentItem) {\n rightTrace = rightTrace.redone === null ? null : getItemCleanStart(transaction, rightTrace.redone);\n }\n if (rightTrace !== null && /** @type {AbstractType<any>} */ (rightTrace.parent)._item === parentItem) {\n right = rightTrace;\n break\n }\n right = right.right;\n }\n } else {\n right = null;\n if (item.right && !ignoreRemoteMapChanges) {\n left = item;\n // Iterate right while right is in itemsToDelete\n // If it is intended to delete right while item is redone, we can expect that item should replace right.\n while (left !== null && left.right !== null && (left.right.redone || isDeleted(itemsToDelete, left.right.id) || isDeletedByUndoStack(um.undoStack, left.right.id) || isDeletedByUndoStack(um.redoStack, left.right.id))) {\n left = left.right;\n // follow redone\n while (left.redone) left = getItemCleanStart(transaction, left.redone);\n }\n if (left && left.right !== null) {\n // It is not possible to redo this item because it conflicts with a\n // change from another client\n return null\n }\n } else {\n left = parentType._map.get(item.parentSub) || null;\n }\n }\n const nextClock = getState(store, ownClientID);\n const nextId = createID(ownClientID, nextClock);\n const redoneItem = new Item(\n nextId,\n left, left && left.lastId,\n right, right && right.id,\n parentType,\n item.parentSub,\n item.content.copy()\n );\n item.redone = nextId;\n keepItem(redoneItem, true);\n redoneItem.integrate(transaction, 0);\n return redoneItem\n};\n\n/**\n * Abstract class that represents any content.\n */\nclass Item extends AbstractStruct {\n /**\n * @param {ID} id\n * @param {Item | null} left\n * @param {ID | null} origin\n * @param {Item | null} right\n * @param {ID | null} rightOrigin\n * @param {AbstractType<any>|ID|null} parent Is a type if integrated, is null if it is possible to copy parent from left or right, is ID before integration to search for it.\n * @param {string | null} parentSub\n * @param {AbstractContent} content\n */\n constructor (id, left, origin, right, rightOrigin, parent, parentSub, content) {\n super(id, content.getLength());\n /**\n * The item that was originally to the left of this item.\n * @type {ID | null}\n */\n this.origin = origin;\n /**\n * The item that is currently to the left of this item.\n * @type {Item | null}\n */\n this.left = left;\n /**\n * The item that is currently to the right of this item.\n * @type {Item | null}\n */\n this.right = right;\n /**\n * The item that was originally to the right of this item.\n * @type {ID | null}\n */\n this.rightOrigin = rightOrigin;\n /**\n * @type {AbstractType<any>|ID|null}\n */\n this.parent = parent;\n /**\n * If the parent refers to this item with some kind of key (e.g. YMap, the\n * key is specified here. The key is then used to refer to the list in which\n * to insert this item. If `parentSub = null` type._start is the list in\n * which to insert to. Otherwise it is `parent._map`.\n * @type {String | null}\n */\n this.parentSub = parentSub;\n /**\n * If this type's effect is redone this type refers to the type that undid\n * this operation.\n * @type {ID | null}\n */\n this.redone = null;\n /**\n * @type {AbstractContent}\n */\n this.content = content;\n /**\n * bit1: keep\n * bit2: countable\n * bit3: deleted\n * bit4: mark - mark node as fast-search-marker\n * @type {number} byte\n */\n this.info = this.content.isCountable() ? binary.BIT2 : 0;\n }\n\n /**\n * This is used to mark the item as an indexed fast-search marker\n *\n * @type {boolean}\n */\n set marker (isMarked) {\n if (((this.info & binary.BIT4) > 0) !== isMarked) {\n this.info ^= binary.BIT4;\n }\n }\n\n get marker () {\n return (this.info & binary.BIT4) > 0\n }\n\n /**\n * If true, do not garbage collect this Item.\n */\n get keep () {\n return (this.info & binary.BIT1) > 0\n }\n\n set keep (doKeep) {\n if (this.keep !== doKeep) {\n this.info ^= binary.BIT1;\n }\n }\n\n get countable () {\n return (this.info & binary.BIT2) > 0\n }\n\n /**\n * Whether this item was deleted or not.\n * @type {Boolean}\n */\n get deleted () {\n return (this.info & binary.BIT3) > 0\n }\n\n set deleted (doDelete) {\n if (this.deleted !== doDelete) {\n this.info ^= binary.BIT3;\n }\n }\n\n markDeleted () {\n this.info |= binary.BIT3;\n }\n\n /**\n * Return the creator clientID of the missing op or define missing items and return null.\n *\n * @param {Transaction} transaction\n * @param {StructStore} store\n * @return {null | number}\n */\n getMissing (transaction, store) {\n if (this.origin && this.origin.client !== this.id.client && this.origin.clock >= getState(store, this.origin.client)) {\n return this.origin.client\n }\n if (this.rightOrigin && this.rightOrigin.client !== this.id.client && this.rightOrigin.clock >= getState(store, this.rightOrigin.client)) {\n return this.rightOrigin.client\n }\n if (this.parent && this.parent.constructor === ID && this.id.client !== this.parent.client && this.parent.clock >= getState(store, this.parent.client)) {\n return this.parent.client\n }\n\n // We have all missing ids, now find the items\n\n if (this.origin) {\n this.left = getItemCleanEnd(transaction, store, this.origin);\n this.origin = this.left.lastId;\n }\n if (this.rightOrigin) {\n this.right = getItemCleanStart(transaction, this.rightOrigin);\n this.rightOrigin = this.right.id;\n }\n if ((this.left && this.left.constructor === GC) || (this.right && this.right.constructor === GC)) {\n this.parent = null;\n } else if (!this.parent) {\n // only set parent if this shouldn't be garbage collected\n if (this.left && this.left.constructor === Item) {\n this.parent = this.left.parent;\n this.parentSub = this.left.parentSub;\n } else if (this.right && this.right.constructor === Item) {\n this.parent = this.right.parent;\n this.parentSub = this.right.parentSub;\n }\n } else if (this.parent.constructor === ID) {\n const parentItem = getItem(store, this.parent);\n if (parentItem.constructor === GC) {\n this.parent = null;\n } else {\n this.parent = /** @type {ContentType} */ (parentItem.content).type;\n }\n }\n return null\n }\n\n /**\n * @param {Transaction} transaction\n * @param {number} offset\n */\n integrate (transaction, offset) {\n if (offset > 0) {\n this.id.clock += offset;\n this.left = getItemCleanEnd(transaction, transaction.doc.store, createID(this.id.client, this.id.clock - 1));\n this.origin = this.left.lastId;\n this.content = this.content.splice(offset);\n this.length -= offset;\n }\n\n if (this.parent) {\n if ((!this.left && (!this.right || this.right.left !== null)) || (this.left && this.left.right !== this.right)) {\n /**\n * @type {Item|null}\n */\n let left = this.left;\n\n /**\n * @type {Item|null}\n */\n let o;\n // set o to the first conflicting item\n if (left !== null) {\n o = left.right;\n } else if (this.parentSub !== null) {\n o = /** @type {AbstractType<any>} */ (this.parent)._map.get(this.parentSub) || null;\n while (o !== null && o.left !== null) {\n o = o.left;\n }\n } else {\n o = /** @type {AbstractType<any>} */ (this.parent)._start;\n }\n // TODO: use something like DeleteSet here (a tree implementation would be best)\n // @todo use global set definitions\n /**\n * @type {Set<Item>}\n */\n const conflictingItems = new Set();\n /**\n * @type {Set<Item>}\n */\n const itemsBeforeOrigin = new Set();\n // Let c in conflictingItems, b in itemsBeforeOrigin\n // ***{origin}bbbb{this}{c,b}{c,b}{o}***\n // Note that conflictingItems is a subset of itemsBeforeOrigin\n while (o !== null && o !== this.right) {\n itemsBeforeOrigin.add(o);\n conflictingItems.add(o);\n if (compareIDs(this.origin, o.origin)) {\n // case 1\n if (o.id.client < this.id.client) {\n left = o;\n conflictingItems.clear();\n } else if (compareIDs(this.rightOrigin, o.rightOrigin)) {\n // this and o are conflicting and point to the same integration points. The id decides which item comes first.\n // Since this is to the left of o, we can break here\n break\n } // else, o might be integrated before an item that this conflicts with. If so, we will find it in the next iterations\n } else if (o.origin !== null && itemsBeforeOrigin.has(getItem(transaction.doc.store, o.origin))) { // use getItem instead of getItemCleanEnd because we don't want / need to split items.\n // case 2\n if (!conflictingItems.has(getItem(transaction.doc.store, o.origin))) {\n left = o;\n conflictingItems.clear();\n }\n } else {\n break\n }\n o = o.right;\n }\n this.left = left;\n }\n // reconnect left/right + update parent map/start if necessary\n if (this.left !== null) {\n const right = this.left.right;\n this.right = right;\n this.left.right = this;\n } else {\n let r;\n if (this.parentSub !== null) {\n r = /** @type {AbstractType<any>} */ (this.parent)._map.get(this.parentSub) || null;\n while (r !== null && r.left !== null) {\n r = r.left;\n }\n } else {\n r = /** @type {AbstractType<any>} */ (this.parent)._start\n ;/** @type {AbstractType<any>} */ (this.parent)._start = this;\n }\n this.right = r;\n }\n if (this.right !== null) {\n this.right.left = this;\n } else if (this.parentSub !== null) {\n // set as current parent value if right === null and this is parentSub\n /** @type {AbstractType<any>} */ (this.parent)._map.set(this.parentSub, this);\n if (this.left !== null) {\n // this is the current attribute value of parent. delete right\n this.left.delete(transaction);\n }\n }\n // adjust length of parent\n if (this.parentSub === null && this.countable && !this.deleted) {\n /** @type {AbstractType<any>} */ (this.parent)._length += this.length;\n }\n addStruct(transaction.doc.store, this);\n this.content.integrate(transaction, this);\n // add parent to transaction.changed\n addChangedTypeToTransaction(transaction, /** @type {AbstractType<any>} */ (this.parent), this.parentSub);\n if ((/** @type {AbstractType<any>} */ (this.parent)._item !== null && /** @type {AbstractType<any>} */ (this.parent)._item.deleted) || (this.parentSub !== null && this.right !== null)) {\n // delete if parent is deleted or if this is not the current attribute value of parent\n this.delete(transaction);\n }\n } else {\n // parent is not defined. Integrate GC struct instead\n new GC(this.id, this.length).integrate(transaction, 0);\n }\n }\n\n /**\n * Returns the next non-deleted item\n */\n get next () {\n let n = this.right;\n while (n !== null && n.deleted) {\n n = n.right;\n }\n return n\n }\n\n /**\n * Returns the previous non-deleted item\n */\n get prev () {\n let n = this.left;\n while (n !== null && n.deleted) {\n n = n.left;\n }\n return n\n }\n\n /**\n * Computes the last content address of this Item.\n */\n get lastId () {\n // allocating ids is pretty costly because of the amount of ids created, so we try to reuse whenever possible\n return this.length === 1 ? this.id : createID(this.id.client, this.id.clock + this.length - 1)\n }\n\n /**\n * Try to merge two items\n *\n * @param {Item} right\n * @return {boolean}\n */\n mergeWith (right) {\n if (\n this.constructor === right.constructor &&\n compareIDs(right.origin, this.lastId) &&\n this.right === right &&\n compareIDs(this.rightOrigin, right.rightOrigin) &&\n this.id.client === right.id.client &&\n this.id.clock + this.length === right.id.clock &&\n this.deleted === right.deleted &&\n this.redone === null &&\n right.redone === null &&\n this.content.constructor === right.content.constructor &&\n this.content.mergeWith(right.content)\n ) {\n const searchMarker = /** @type {AbstractType<any>} */ (this.parent)._searchMarker;\n if (searchMarker) {\n searchMarker.forEach(marker => {\n if (marker.p === right) {\n // right is going to be \"forgotten\" so we need to update the marker\n marker.p = this;\n // adjust marker index\n if (!this.deleted && this.countable) {\n marker.index -= this.length;\n }\n }\n });\n }\n if (right.keep) {\n this.keep = true;\n }\n this.right = right.right;\n if (this.right !== null) {\n this.right.left = this;\n }\n this.length += right.length;\n return true\n }\n return false\n }\n\n /**\n * Mark this Item as deleted.\n *\n * @param {Transaction} transaction\n */\n delete (transaction) {\n if (!this.deleted) {\n const parent = /** @type {AbstractType<any>} */ (this.parent);\n // adjust the length of parent\n if (this.countable && this.parentSub === null) {\n parent._length -= this.length;\n }\n this.markDeleted();\n addToDeleteSet(transaction.deleteSet, this.id.client, this.id.clock, this.length);\n addChangedTypeToTransaction(transaction, parent, this.parentSub);\n this.content.delete(transaction);\n }\n }\n\n /**\n * @param {StructStore} store\n * @param {boolean} parentGCd\n */\n gc (store, parentGCd) {\n if (!this.deleted) {\n throw error.unexpectedCase()\n }\n this.content.gc(store);\n if (parentGCd) {\n replaceStruct(store, this, new GC(this.id, this.length));\n } else {\n this.content = new ContentDeleted(this.length);\n }\n }\n\n /**\n * Transform the properties of this type to binary and write it to an\n * BinaryEncoder.\n *\n * This is called when this Item is sent to a remote peer.\n *\n * @param {UpdateEncoderV1 | UpdateEncoderV2} encoder The encoder to write data to.\n * @param {number} offset\n */\n write (encoder, offset) {\n const origin = offset > 0 ? createID(this.id.client, this.id.clock + offset - 1) : this.origin;\n const rightOrigin = this.rightOrigin;\n const parentSub = this.parentSub;\n const info = (this.content.getRef() & binary.BITS5) |\n (origin === null ? 0 : binary.BIT8) | // origin is defined\n (rightOrigin === null ? 0 : binary.BIT7) | // right origin is defined\n (parentSub === null ? 0 : binary.BIT6); // parentSub is non-null\n encoder.writeInfo(info);\n if (origin !== null) {\n encoder.writeLeftID(origin);\n }\n if (rightOrigin !== null) {\n encoder.writeRightID(rightOrigin);\n }\n if (origin === null && rightOrigin === null) {\n const parent = /** @type {AbstractType<any>} */ (this.parent);\n if (parent._item !== undefined) {\n const parentItem = parent._item;\n if (parentItem === null) {\n // parent type on y._map\n // find the correct key\n const ykey = findRootTypeKey(parent);\n encoder.writeParentInfo(true); // write parentYKey\n encoder.writeString(ykey);\n } else {\n encoder.writeParentInfo(false); // write parent id\n encoder.writeLeftID(parentItem.id);\n }\n } else if (parent.constructor === String) { // this edge case was added by differential updates\n encoder.writeParentInfo(true); // write parentYKey\n encoder.writeString(parent);\n } else if (parent.constructor === ID) {\n encoder.writeParentInfo(false); // write parent id\n encoder.writeLeftID(parent);\n } else {\n error.unexpectedCase();\n }\n if (parentSub !== null) {\n encoder.writeString(parentSub);\n }\n }\n this.content.write(encoder, offset);\n }\n}\n\n/**\n * @param {UpdateDecoderV1 | UpdateDecoderV2} decoder\n * @param {number} info\n */\nconst readItemContent = (decoder, info) => contentRefs[info & binary.BITS5](decoder);\n\n/**\n * A lookup map for reading Item content.\n *\n * @type {Array<function(UpdateDecoderV1 | UpdateDecoderV2):AbstractContent>}\n */\nconst contentRefs = [\n () => { error.unexpectedCase(); }, // GC is not ItemContent\n readContentDeleted, // 1\n readContentJSON, // 2\n readContentBinary, // 3\n readContentString, // 4\n readContentEmbed, // 5\n readContentFormat, // 6\n readContentType, // 7\n readContentAny, // 8\n readContentDoc, // 9\n () => { error.unexpectedCase(); } // 10 - Skip is not ItemContent\n];\n\nconst structSkipRefNumber = 10;\n\n/**\n * @private\n */\nclass Skip extends AbstractStruct {\n get deleted () {\n return true\n }\n\n delete () {}\n\n /**\n * @param {Skip} right\n * @return {boolean}\n */\n mergeWith (right) {\n if (this.constructor !== right.constructor) {\n return false\n }\n this.length += right.length;\n return true\n }\n\n /**\n * @param {Transaction} transaction\n * @param {number} offset\n */\n integrate (transaction, offset) {\n // skip structs cannot be integrated\n error.unexpectedCase();\n }\n\n /**\n * @param {UpdateEncoderV1 | UpdateEncoderV2} encoder\n * @param {number} offset\n */\n write (encoder, offset) {\n encoder.writeInfo(structSkipRefNumber);\n // write as VarUint because Skips can't make use of predictable length-encoding\n encoding.writeVarUint(encoder.restEncoder, this.length - offset);\n }\n\n /**\n * @param {Transaction} transaction\n * @param {StructStore} store\n * @return {null | number}\n */\n getMissing (transaction, store) {\n return null\n }\n}\n\n/** eslint-env browser */\n\n\nconst glo = /** @type {any} */ (typeof globalThis !== 'undefined'\n ? globalThis\n : typeof window !== 'undefined'\n ? window\n // @ts-ignore\n : typeof global !== 'undefined' ? global : {});\n\nconst importIdentifier = '__ $YJS$ __';\n\nif (glo[importIdentifier] === true) {\n /**\n * Dear reader of this message. Please take this seriously.\n *\n * If you see this message, make sure that you only import one version of Yjs. In many cases,\n * your package manager installs two versions of Yjs that are used by different packages within your project.\n * Another reason for this message is that some parts of your project use the commonjs version of Yjs\n * and others use the EcmaScript version of Yjs.\n *\n * This often leads to issues that are hard to debug. We often need to perform constructor checks,\n * e.g. `struct instanceof GC`. If you imported different versions of Yjs, it is impossible for us to\n * do the constructor checks anymore - which might break the CRDT algorithm.\n *\n * https://github.com/yjs/yjs/issues/438\n */\n console.error('Yjs was already imported. This breaks constructor checks and will lead to issues! - https://github.com/yjs/yjs/issues/438');\n}\nglo[importIdentifier] = true;\n\nexport { AbsolutePosition, AbstractConnector, AbstractStruct, AbstractType, YArray as Array, ContentAny, ContentBinary, ContentDeleted, ContentDoc, ContentEmbed, ContentFormat, ContentJSON, ContentString, ContentType, Doc, GC, ID, Item, YMap as Map, PermanentUserData, RelativePosition, Skip, Snapshot, YText as Text, Transaction, UndoManager, UpdateDecoderV1, UpdateDecoderV2, UpdateEncoderV1, UpdateEncoderV2, YXmlElement as XmlElement, YXmlFragment as XmlFragment, YXmlHook as XmlHook, YXmlText as XmlText, YArrayEvent, YEvent, YMapEvent, YTextEvent, YXmlEvent, applyUpdate, applyUpdateV2, cleanupYTextFormatting, compareIDs, compareRelativePositions, convertUpdateFormatV1ToV2, convertUpdateFormatV2ToV1, createAbsolutePositionFromRelativePosition, createDeleteSet, createDeleteSetFromStructStore, createDocFromSnapshot, createID, createRelativePositionFromJSON, createRelativePositionFromTypeIndex, createSnapshot, decodeRelativePosition, decodeSnapshot, decodeSnapshotV2, decodeStateVector, decodeUpdate, decodeUpdateV2, diffUpdate, diffUpdateV2, emptySnapshot, encodeRelativePosition, encodeSnapshot, encodeSnapshotV2, encodeStateAsUpdate, encodeStateAsUpdateV2, encodeStateVector, encodeStateVectorFromUpdate, encodeStateVectorFromUpdateV2, equalDeleteSets, equalSnapshots, findIndexSS, findRootTypeKey, getItem, getItemCleanEnd, getItemCleanStart, getState, getTypeChildren, isDeleted, isParentOf, iterateDeletedStructs, logType, logUpdate, logUpdateV2, mergeDeleteSets, mergeUpdates, mergeUpdatesV2, obfuscateUpdate, obfuscateUpdateV2, parseUpdateMeta, parseUpdateMetaV2, readUpdate, readUpdateV2, relativePositionToJSON, snapshot, snapshotContainsUpdate, transact, tryGc, typeListToArraySnapshot, typeMapGetAllSnapshot, typeMapGetSnapshot };\n//# sourceMappingURL=yjs.mjs.map\n","import { DexieCloudDB } from \"../db/DexieCloudDB\";\nimport { YTable } from \"./YTable\";\n\nexport function getUpdatesTable(db: DexieCloudDB, table: string, ydocProp: string): YTable | undefined {\n if (!db.dx._allTables[table]) return undefined;\n const utbl = db.table(table)?.schema.yProps?.find(p => p.prop === ydocProp)?.updatesTable;\n if (!utbl) {\n console.debug(`No updatesTable found for ${table}.${ydocProp}`);\n return undefined;\n }\n if (!db.dx._allTables[utbl]) return undefined;\n return db.table(utbl);\n}\n","/* ========================================================================== \n * y-dexie.js\n * ==========================================================================\n *\n * Dexie addon that integrates Dexie with Y.js\n *\n * By David Fahlander, david@dexie.org\n *\n * ==========================================================================\n *\n * Version 4.2.0-alpha.2, Fri Aug 01 2025\n *\n * https://dexie.org\n *\n * Apache License Version 2.0, January 2004, http://www.apache.org/licenses/\n * \n */\n\nimport { Dexie, cmp, liveQuery } from 'dexie';\nimport * as Y from 'yjs';\n\nconst _hasOwn = {}.hasOwnProperty;\nconst hasOwn = (obj, prop) => {\n return _hasOwn.call(obj, prop);\n};\n\nconst EMPTY_ARRAY = []; // Optimization of returning empty array frequently in flatMap operaion.\nfunction createYjsMiddleware(dbSchema) {\n return (downCore) => (Object.assign(Object.assign({}, downCore), { table(tableName) {\n const downTable = downCore.table(tableName);\n const dbTableSchema = dbSchema[tableName]; // DBCore don't understand Yjs specific schema - need dexie xchema\n const { yProps } = dbTableSchema;\n if (!yProps || yProps.length === 0)\n return downTable;\n const tableMiddleware = Object.assign(Object.assign({}, downTable), { mutate(req) {\n if (req.type !== 'add' && req.type !== 'put')\n return downTable.mutate(req);\n // From here on, req.type is \"add\":\n let reqClone = req;\n const updateSources = yProps\n .map((p) => ({\n p,\n entries: req.values.flatMap((value, iter) => {\n if (!value || typeof value !== 'object')\n throw new TypeError(`Table ${tableName} (with Y-properties) must only contain objects`);\n if (!hasOwn(value, p.prop))\n return [];\n // Clone req, req.values and each value so that we can delete yProps from being stored:\n if (reqClone === req)\n reqClone = Object.assign(Object.assign({}, req), { values: req.values.map((v) => (Object.assign({}, v))) });\n // Delete prop so that it isn't physically stored in DB\n delete reqClone.values[iter][p.prop];\n const doc = value[p.prop];\n if (doc === null)\n throw new TypeError(`Cannot set Y property to null`);\n // Allow undefined, treat it as if the object didn't have the property at all.\n if (doc === undefined)\n return EMPTY_ARRAY;\n // Check that the property is of type Y.Doc:\n if (typeof doc !== 'object' || !('whenLoaded' in doc)) {\n throw new TypeError(`Y properties can only be inited with an Y.Doc instance or undefined to create an empty Y.Doc`);\n }\n if (req.type === 'put')\n // Don't allow setting y properties on put requests\n throw new TypeError(`Setting ${tableName}.${p.prop} (declared as ${p.prop}:Y) is only allowed when inserting new objects using db.${tableName}.add(), not put() or update().`);\n if (Y.encodeStateVector(doc).length === 1) {\n // Document is empty and has no updates\n return EMPTY_ARRAY;\n }\n // Clone the Yjs state before storing it in the database\n return {\n iter,\n u: Y.encodeStateAsUpdateV2(doc),\n };\n }),\n }))\n .filter(({ entries }) => entries.length > 0);\n if (req === reqClone)\n // No object had their Y-props in own props - no need to intercept.\n return downTable.mutate(req);\n // We have a reqClone to forward down the stack. The reqClone\n // is a copy of req, but where some objects have their yProps deleted.\n return downTable.mutate(reqClone).then((res) => {\n if (updateSources.length === 0)\n // No updates to create (but user provided empty Y.Docs so reqClone was still needed)\n return res;\n // For each yProp affect, write docs (monolit-updates) to their corresponding tables.\n return Promise.all(updateSources.map(({ p, entries }) => {\n const updatesTable = downCore.table(p.updatesTable);\n const updatesToInsert = entries.map(({ iter, u }) => ({\n k: res.results[iter],\n u,\n f: 1, // Flag as local update (to be included when syncing)\n }));\n return updatesTable.mutate({\n type: 'add',\n values: updatesToInsert,\n trans: req.trans,\n });\n })).then(() => res);\n });\n } });\n return tableMiddleware;\n } }));\n}\n\n// The finalization registry\nconst docRegistry = new FinalizationRegistry(({ cache, key }) => {\n delete cache[key];\n});\n// The Y.Doc cache containing all active documents\nfunction getDocCache(db) {\n var _a;\n var _b;\n return (_a = (_b = db._novip)['_docCache']) !== null && _a !== void 0 ? _a : (_b['_docCache'] = {\n cache: {},\n get size() {\n return Object.keys(this.cache).length;\n },\n find(table, primaryKey, ydocProp) {\n const cacheKey = getYDocCacheKey(table, primaryKey, ydocProp);\n const docRef = this.cache[cacheKey];\n return docRef ? docRef.deref() : undefined;\n },\n add(doc) {\n var _a;\n const { parentTable, parentId, parentProp } = doc.meta;\n if (!parentTable || !parentProp || parentId == null)\n throw new Error(`Missing Dexie-related metadata in Y.Doc`);\n const cacheKey = getYDocCacheKey(parentTable, parentId, parentProp);\n const existingDoc = (_a = this.cache[cacheKey]) === null || _a === void 0 ? void 0 : _a.deref();\n if (existingDoc) {\n docRegistry.unregister(existingDoc); // Don't run garbage collection on this doc as it is being replaced.\n }\n this.cache[cacheKey] = new WeakRef(doc);\n docRegistry.register(doc, { cache: this.cache, key: cacheKey }, doc);\n },\n delete(doc) {\n docRegistry.unregister(doc); // Don't run garbage collection on this doc as it is being deleted here and now.\n const cacheKey = getYDocCacheKey(doc.meta.parentTable, doc.meta.parentId, doc.meta.parentProp);\n const cacheEntry = this.cache[cacheKey];\n if ((cacheEntry === null || cacheEntry === void 0 ? void 0 : cacheEntry.deref()) === doc) {\n delete this.cache[cacheKey]; // Remove the entry from the cache only if it is the same doc.\n }\n },\n });\n}\n// Emulate a private boolean property \"destroyed\" on Y.Doc instances that we manage\n// in createYDocProperty.ts:\nconst destroyedDocs = new WeakSet();\nfunction throwIfDestroyed(doc) {\n if (destroyedDocs.has(doc))\n throw new Error(`Y.Doc ${doc.meta.parentId} has been destroyed`);\n}\nfunction getYDocCacheKey(table, primaryKey, ydocProp) {\n return `${table}[${primaryKey}].${ydocProp}`;\n}\n\nfunction getOrCreateDocument(db, docCache, tableName, prop, updatesTable, id) {\n let doc = docCache.find(tableName, id, prop);\n if (doc)\n return doc;\n doc = new Y.Doc({\n meta: {\n db,\n updatesTable,\n parentProp: prop,\n parentTable: tableName,\n parentId: id,\n },\n });\n docCache.add(doc);\n doc.on('destroy', () => {\n destroyedDocs.add(doc);\n docCache.delete(doc);\n });\n return doc;\n}\n\nconst { getByKeyPath } = Dexie;\nfunction createYDocProperty(db, table, prop, updatesTable) {\n const pkKeyPath = table.schema.primKey.keyPath;\n if (!pkKeyPath) {\n throw new Error(`Cannot create Y.Doc property for ${table.name}.${prop} because the table has no inbound primary key. See https://dexie.org/docs/inbound`);\n }\n const docCache = getDocCache(db);\n return {\n set() {\n throw new TypeError(`Y.Doc properties are read-only`);\n },\n get() {\n const id = getByKeyPath(this, pkKeyPath);\n return getOrCreateDocument(db, docCache, table.name, prop, updatesTable, id);\n },\n };\n}\n\n/** Go through all Y.Doc tables in the entire local db and compress updates\n *\n * @param db Dexie\n * @returns\n */\nfunction compressYDocs(db, skipIfRecentlyDoneMillisec) {\n let p = Promise.resolve();\n for (const table of db.tables) {\n for (const yProp of table.schema.yProps || []) {\n p = p.then(() => compressYDocsTable(db, yProp, skipIfRecentlyDoneMillisec));\n }\n }\n return p;\n}\n/** Compress an individual Y.Doc table */\nfunction compressYDocsTable(db, { updatesTable }, skipIfRunnedSince // milliseconds\n) {\n const updTbl = db.table(updatesTable);\n return Promise.all([\n // syncers (for example dexie-cloud-addon or other 3rd part syncers) They may have unsentFrom set.\n updTbl\n .where('i')\n .startsWith('') // Syncers have string primary keys while updates have auto-incremented numbers.\n .toArray(),\n // lastCompressed (pointer to the last compressed update)\n db.transaction('rw', updatesTable, () => updTbl.get(0).then((lastCompressed) => {\n if (skipIfRunnedSince &&\n lastCompressed &&\n lastCompressed.lastRun &&\n lastCompressed.lastRun.getTime() > Date.now() - skipIfRunnedSince) {\n // Skip it. It has run recently or is still running.\n return null;\n }\n // isRunning might be true but we don't respect it if started before skipIfRunningSince.\n lastCompressed = lastCompressed || { i: 0, lastCompressed: 0 };\n return updTbl\n .put(Object.assign(Object.assign({}, lastCompressed), { lastRun: new Date() }))\n .then(() => lastCompressed);\n })),\n ]).then(([syncers, stamp]) => {\n if (!stamp)\n return; // Skip. Already running.\n const lastCompressedUpdate = stamp.lastCompressed;\n const unsyncedFrom = Math.min(...syncers.map((s) => Math.min(s.unsentFrom || Infinity, s.receivedUntil != null ? s.receivedUntil + 1 : Infinity)));\n // Per updates-table:\n // 1. Find all updates after lastCompressedId. Run toArray() on them.\n // 2. IF there are any \"mine\" (flagged) updates AFTER unsentFrom, skip all from including this entry, else include all regardless of unsentFrom.\n // 3. Now we know which keys have updates since last compression. We also know how far we're gonna go (max unsentFrom unless all additional updates are foreign).\n // 4. For every key that had updates, load their main update (this is one single update per key before the lastCompressedId marker)\n // 5. For every key that had updates: Compress main update along with additional updates until and including the number that was computed on step 2 (could be Infinity).\n // 6. Update lastCompressedId to the i of the latest compressed entry.\n return updTbl\n .where('i')\n .between(lastCompressedUpdate, Infinity, false)\n .toArray((addedUpdates) => {\n if (addedUpdates.length === 0)\n return; // No more updates where added\n const docsToCompress = [];\n let lastUpdateToCompress = lastCompressedUpdate;\n for (let j = 0; j < addedUpdates.length; ++j) {\n const updateRow = addedUpdates[j];\n const { i, f, k } = updateRow;\n if (i >= unsyncedFrom && f && f & 0x01)\n break; // An update that need to be synced was found. Stop here and let dontCompressFrom stay.\n const entry = docsToCompress.find((entry) => cmp(entry.docId, k) === 0);\n if (entry)\n entry.updates.push(updateRow);\n else\n docsToCompress.push({ docId: k, updates: [updateRow] });\n lastUpdateToCompress = i;\n }\n if (lastUpdateToCompress === lastCompressedUpdate)\n return; // No updates to compress\n let p = Promise.resolve();\n for (const { docId, updates } of docsToCompress) {\n p = p.then(() => compressUpdatesForDoc(db, updatesTable, docId, updates));\n }\n return p.then(() => {\n // Update lastCompressed atomically to the value we computed.\n // Do it with respect to the case when another job was done in parallel\n // that maybe compressed one or more extra updates and updated lastCompressed\n // before us.\n return db.transaction('rw', updTbl, () => updTbl.get(0).then((current) => {\n if (current && lastUpdateToCompress <= current.lastCompressed) {\n // No need to update. Nothing was done, or another job did more.\n return;\n }\n return updTbl.put(Object.assign(Object.assign({}, current), { lastCompressed: lastUpdateToCompress }));\n }));\n });\n });\n });\n}\nfunction compressUpdatesForDoc(db, updatesTable, parentId, addedUpdatesToCompress) {\n if (addedUpdatesToCompress.length < 1)\n throw new Error('Invalid input');\n return db.transaction('rw', updatesTable, (tx) => {\n const updTbl = tx.table(updatesTable);\n return updTbl.where({ k: parentId }).first((mainUpdate) => {\n if (!mainUpdate)\n return; // No main update found. Nothing to compress.\n const updates = [mainUpdate].concat(addedUpdatesToCompress.filter((u) => u.i !== mainUpdate.i)); // avoid duplicating the main update (can happen sometimes)\n const doc = new Y.Doc({ gc: true });\n updates.forEach((update) => {\n Y.applyUpdateV2(doc, update.u);\n });\n const compressedUpdate = Y.encodeStateAsUpdateV2(doc);\n const lastUpdate = updates.pop();\n return updTbl\n .put({\n i: lastUpdate.i,\n k: parentId,\n u: compressedUpdate,\n })\n .then(() => updTbl.bulkDelete(updates.map((update) => update.i)));\n });\n });\n}\n\nconst GC_DELAY = 10000; // Delay before starting GC when DB is started\nconst GC_INTERVAL = 300000; // Every 5 minutes\nfunction periodicGC(db) {\n let timer = null;\n db.on('ready', (db) => {\n if (db.tables.some(tbl => tbl.schema.yProps)) {\n const gc = () => {\n if (!db.isOpen())\n return;\n compressYDocs(db, GC_INTERVAL).catch(err => {\n if (err && err.name === 'DatabaseClosedError')\n return;\n console.debug('Error during periodic GC', err);\n }).then(() => {\n timer = setTimeout(gc, GC_INTERVAL);\n });\n };\n timer = setTimeout(gc, GC_DELAY);\n }\n }, true);\n db.on('close', () => {\n if (timer)\n clearTimeout(timer);\n timer = null;\n });\n}\n\nlet currentUpdateRow = null;\nfunction setCurrentUpdateRow(row) {\n currentUpdateRow = row;\n}\n\nfunction observeYDocUpdates(provider, doc, db, parentTableName, updatesTableName, parentId) {\n let lastUpdateId = 0;\n let initial = true;\n const subscription = liveQuery(() => {\n throwIfDestroyed(doc);\n const updatesTable = db.table(updatesTableName);\n return Promise.all([\n (lastUpdateId > 0\n ? updatesTable\n .where('i')\n .between(lastUpdateId, Infinity, false)\n .toArray()\n .then((updates) => updates.filter((update) => cmp(update.k, parentId) === 0))\n : updatesTable.where({ k: parentId }).toArray()).then((updates) => {\n return updates;\n }),\n db.table(parentTableName).where(':id').equals(parentId).toArray(), // Why not just count() or get()? Because of cache only works with toArray() currently (optimization)\n ]);\n }).subscribe(([updates, parentRow]) => {\n if (updates.length > 0)\n lastUpdateId = updates[updates.length - 1].i;\n if (parentRow.length === 0) {\n // Row deleted. Destroy Y.Doc.\n doc.destroy();\n return;\n }\n throwIfDestroyed(doc);\n if (updates.length > 0) {\n Y.transact(doc, () => {\n updates.forEach((update) => {\n try {\n setCurrentUpdateRow(update);\n Y.applyUpdateV2(doc, update.u);\n }\n finally {\n setCurrentUpdateRow(null);\n }\n });\n }, provider, false);\n }\n if (initial) {\n initial = false;\n doc.emit('load', [doc]);\n }\n }, (error) => {\n provider.on('error').fire(error);\n });\n const onUpdate = (update, origin) => {\n if (origin === provider)\n return; // Already applied.\n db.table(updatesTableName)\n .add({\n k: parentId,\n u: update,\n f: 1, // Flag as local update (to be included when syncing)\n })\n .then((i) => {\n // Optimization (not critical): Don't query for this update to put it back into the doc.\n // However, skip this optimization if the lastUpdateId is behind the current update.\n // In that case, next liveQuery emission will include also this update and re-apply it into doc,\n // but it will not be an issue because Y.Doc will ignore duplicate updates.\n if (i === lastUpdateId - 1)\n ++lastUpdateId;\n })\n .catch((error) => {\n provider.on('error').fire(error);\n });\n };\n const stopObserving = () => {\n subscription.unsubscribe();\n doc.off('updateV2', onUpdate);\n doc.off('destroy', stopObserving);\n };\n doc.on('updateV2', onUpdate);\n doc.on('destroy', stopObserving);\n return stopObserving;\n}\n\nfunction nop() { }\n\nfunction promisableChain(f1, f2) {\n if (f1 === nop)\n return f2;\n return function () {\n var res = f1.apply(this, arguments);\n if (res && typeof res.then === 'function') {\n var thiz = this, i = arguments.length, args = new Array(i);\n while (i--)\n args[i] = arguments[i];\n return res.then(function () {\n return f2.apply(thiz, args);\n });\n }\n return f2.apply(this, arguments);\n };\n}\n\nfunction nonStoppableEventChain(f1, f2) {\n if (f1 === nop)\n return f2;\n return function () {\n f1.apply(this, arguments);\n f2.apply(this, arguments);\n };\n}\n\nconst wm = new WeakMap();\nfunction createEvents() {\n return Dexie.Events(null, 'load', 'sync', 'error');\n}\nclass DexieYProvider {\n static getOrCreateDocument(db, table, prop, id) {\n var _a, _b;\n const docCache = getDocCache(db);\n const updatesTable = (_b = (_a = db\n .table(table)\n .schema.yProps) === null || _a === void 0 ? void 0 : _a.find((p) => p.prop === prop)) === null || _b === void 0 ? void 0 : _b.updatesTable;\n if (!updatesTable) {\n throw new Error(`Updates table for ${table}.${prop} not found`);\n }\n // Get or create the Y.Doc for the given table, prop, and id\n return getOrCreateDocument(db, docCache, table, prop, updatesTable, id);\n }\n static load(doc, options) {\n var _a;\n let p = wm.get(doc);\n if (p) {\n ++p.refCount;\n if ((options === null || options === void 0 ? void 0 : options.gracePeriod) != null &&\n p.graceTimeout < options.gracePeriod) {\n p.graceTimeout = options.gracePeriod;\n }\n if (p.graceTimer) {\n clearTimeout(p.graceTimer);\n p.graceTimer = null;\n }\n }\n else {\n p = new DexieYProvider(doc);\n p.graceTimeout = (_a = options === null || options === void 0 ? void 0 : options.gracePeriod) !== null && _a !== void 0 ? _a : -1;\n wm.set(doc, p);\n }\n return p;\n }\n static release(doc) {\n if (!doc || destroyedDocs.has(doc))\n return; // Document already destroyed.\n const p = wm.get(doc);\n if (p) {\n // There is a provider connected to the doc\n if (--p.refCount <= 0) {\n // No references to this provider anymore. Time to release it.\n if (p.graceTimeout < 0) {\n // No grace period here or from previous release. Release immediately.\n p._release();\n }\n else if (!p.graceTimer) {\n p.graceTimer = setTimeout(() => {\n p.graceTimer = null;\n if (p.refCount === 0) {\n // Release only if refCount is still zero\n p._release();\n }\n }, p.graceTimeout // Grace period to optimize for unload/reload scenarios\n );\n }\n }\n }\n else {\n doc.destroy();\n }\n }\n _release() {\n // Allow a listener to beforeunload event to execute while the provider and the document\n // are still alive and loaded if it needs to compute something from the full document.\n // Also, in case the event listener uses DexieYProvider.load() without calling DexieYProvider.release(),\n // it must prevent the release to happen until the provider is finally released.\n if (!this.doc)\n return;\n Promise.resolve(DexieYProvider.on('beforeunload').fire(this)).finally(() => {\n var _a;\n // Re-check that refCount is zero before actually destroying the document (which\n // leads to provider.destroy() through the destroy-event on the doc).\n if (this.refCount === 0) {\n (_a = this.doc) === null || _a === void 0 ? void 0 : _a.destroy();\n }\n // If refCount is not zero, it means that DexieYProvider.load() has been called from the listener\n // and the listener has prevented the release from happening. The listener must call DexieYProvider.release()\n // when it's done with the document.\n });\n }\n static for(doc) {\n return wm.get(doc);\n }\n static get currentUpdateRow() {\n return currentUpdateRow;\n }\n // Use a getter to avoid unhandled rejections when no one bothers about it.\n get whenLoaded() {\n if (!this._whenLoaded) {\n this._whenLoaded = new Promise((resolve, reject) => {\n if (!this.doc) {\n reject(new Error('No Y.Doc associated with this provider'));\n return;\n }\n if (this.doc.isLoaded)\n resolve();\n else if (this._error)\n reject(this._error);\n else if (destroyedDocs.has(this.doc)) {\n reject(new Dexie.AbortError('Document was destroyed before loaded'));\n }\n else {\n this.on('load', resolve);\n this.on('error', reject);\n this.doc.on('destroy', () => reject(new Dexie.AbortError('Document was destroyed before loaded')));\n }\n });\n }\n return this._whenLoaded;\n }\n // Use a getter to avoid unhandled rejections when no one bothers about it.\n get whenSynced() {\n if (!this._whenSynced) {\n this._whenSynced = new Promise((resolve, reject) => {\n if (!this.doc) {\n reject(new Error('No Y.Doc associated with this provider'));\n return;\n }\n if (this.doc.isSynced)\n resolve();\n else if (this._error)\n reject(this._error);\n else if (destroyedDocs.has(this.doc)) {\n reject(new Dexie.AbortError('Document was destroyed before synced'));\n }\n else {\n this.on('sync', resolve);\n this.on('error', reject);\n this.doc.on('destroy', () => reject(new Dexie.AbortError('Document was destroyed before synced')));\n }\n });\n }\n return this._whenSynced;\n }\n constructor(doc) {\n this.refCount = 1;\n this.cleanupHandlers = [];\n this.graceTimeout = -1;\n this.doc = null;\n this.destroyed = false;\n this.on = createEvents();\n this.doc = doc;\n this.off = (name, f) => { var _a; return (_a = this.on[name]) === null || _a === void 0 ? void 0 : _a.unsubscribe(f); };\n if ('dispose' in Symbol) {\n // @ts-ignore\n this[Symbol.dispose] = () => DexieYProvider.release(doc);\n }\n doc.on('load', () => this.on('load').fire());\n doc.on('sync', (sync) => sync !== false && this.on('sync').fire());\n doc.on('destroy', this.destroy.bind(this));\n this.on('error', (error) => {\n // In case error happens before awaiting provider.whenLoaded or provider.whenSynced.\n this._error = error;\n });\n const { db, parentTable, parentId, updatesTable } = doc.meta || {};\n if (!db || !parentTable || !updatesTable) {\n throw new Error(`Missing Dexie-related metadata in Y.Doc. Documents need to be obtained through Y.Doc properties from dexie queries.`);\n }\n // This doc is from Dexie\n if (!db.table(parentTable) || !db.table(updatesTable)) {\n throw new Error(`Table ${parentTable} or ${updatesTable} not found in db`);\n }\n throwIfDestroyed(doc);\n this.stopObserving = observeYDocUpdates(this, doc, db, parentTable, updatesTable, parentId);\n DexieYProvider.on(\"new\").fire(this); // Allow for addons to invoke their sync- and awareness providers here.\n }\n destroy() {\n var _a, _b, _c;\n console.debug(`Y.Doc ${(_b = (_a = this.doc) === null || _a === void 0 ? void 0 : _a.meta) === null || _b === void 0 ? void 0 : _b.parentId} was destroyed`);\n wm.delete(this.doc);\n this.doc = null;\n this.destroyed = true;\n this.refCount = 0;\n (_c = this.stopObserving) === null || _c === void 0 ? void 0 : _c.call(this);\n this.on = createEvents(); // Releases listeners for GC\n this.cleanupHandlers.forEach((cleanup) => cleanup());\n }\n addCleanupHandler(cleanupHandler) {\n this.cleanupHandlers.push(typeof cleanupHandler === 'function'\n ? cleanupHandler\n : () => cleanupHandler.unsubscribe());\n }\n}\nDexieYProvider.on = Dexie.Events(null, {\n new: [nonStoppableEventChain],\n beforeunload: [promisableChain],\n});\nDexieYProvider.getDocCache = getDocCache;\n\nconst YJS_MIDDLEWARE_NAME = 'yjsMiddleware';\n// @ts-ignore\nDexie.DexieYProvider = DexieYProvider;\nfunction yDexie(dbOrOptions) {\n // This function is a placeholder for the y-dexie addon.\n // It can be used to initialize or configure the addon as needed.\n if (!('transaction' in dbOrOptions)) {\n // If db is an options object, create a configured yDexie addon that\n // could be passed to the addons array of Dexie constructor.\n const options = dbOrOptions;\n // Return a configured Dexie addon function.\n return (db) => configurableYDexie(db, options);\n }\n else {\n // If db is a Dexie instance, it is being called as an addon.\n // Do default configuration.\n return configurableYDexie(dbOrOptions, {});\n }\n}\nfunction configurableYDexie(db, options) {\n db.Table = class Table extends db.Table {\n mapToClass(constructor) {\n if (this.schema.yProps) {\n constructor = class extends constructor {\n };\n this.schema.yProps.forEach(({ prop, updatesTable }) => {\n Object.defineProperty(constructor.prototype, prop, createYDocProperty(db, this, prop, updatesTable));\n });\n }\n const result = super.mapToClass(constructor);\n this.schema.mappedClass = constructor; // Also done in super.mapToClass but we need to set the user-provided class, not our altered class.\n return result;\n }\n };\n db.Version = class Version extends db.Version {\n _createTableSchema(name, primKey, indexes) {\n const yProps = indexes.filter((idx) => idx.type === 'Y' || idx.type === 'Y.Doc');\n indexes = indexes.filter((idx) => !yProps.includes(idx)); // Y marks just the Y.Doc type and is not an index\n const tableSchema = super._createTableSchema(name, primKey, indexes);\n if (yProps.length > 0) {\n tableSchema.yProps = yProps.map((idx) => ({\n prop: idx.name,\n updatesTable: `$${name}.${idx.name}_updates`,\n }));\n }\n return tableSchema;\n }\n _parseStoresSpec(stores, outSchema) {\n // Implementation for parsing stores spec\n // This is a placeholder; actual implementation would go here\n super._parseStoresSpec(stores, outSchema);\n // Generate update tables for Y.js properties\n Object.keys(stores).forEach((tableName) => {\n const tblSchema = outSchema[tableName];\n if (tblSchema) {\n for (const yProp of tblSchema.yProps || []) {\n super._parseStoresSpec(\n // Add a table for each yProp containing document updates.\n // See interface YUpdateRow { i: number, k: IndexableType, u: Uint8Array, f?: number}\n // where\n // i is the auto-incremented primary key of the update table,\n // k is the primary key from the other table holding the document in a property.\n // u is the update data from Y.js\n // f is a flag indicating if the update comes from this client or another.\n // Index use cases:\n // * Load entire document: Use index k\n // * After object load, observe updates on a certain document since a given revision: Use index k or i since [k+i] is not supported before Firefox 126.\n // * After initial sync, observe flagged updates since a given revision: Use index i and ignore unflagged.\n // Could be using an index [f+i] but that wouldn't gain too much and Firefox before 126 doesnt support it.\n // Local updates are flagged while remote updates are not.\n //\n { [yProp.updatesTable]: '++i,k' }, outSchema);\n }\n }\n });\n }\n stores(schema) {\n const db = this.db;\n // This method is used to define the schema for the database.\n // It allows you to specify the tables and their indexes.\n const result = super.stores(schema);\n const dbschema = db._dbSchema;\n Object.keys(dbschema).forEach((tableName) => {\n if (dbschema[tableName].yProps) {\n // If a table as yProps, make sure to derive a class with generated Y properties.\n // This is done in the mapToClass method. In case user has called mapToClass already, respect mappedClass,\n // otherwise use Object as default to create a top-level class with the generated y properties.\n db.table(tableName).mapToClass(dbschema[tableName].mappedClass || Object);\n }\n });\n if (Object.values(dbschema).some((table) => table.yProps)) {\n db.use({\n stack: 'dbcore',\n name: YJS_MIDDLEWARE_NAME,\n level: 50,\n create: createYjsMiddleware(dbschema),\n });\n }\n else {\n db.unuse({ stack: 'dbcore', name: YJS_MIDDLEWARE_NAME });\n }\n return result;\n }\n };\n if ((options === null || options === void 0 ? void 0 : options.gc) !== false) {\n periodicGC(db);\n }\n}\n\nexport { DexieYProvider, compressYDocs, yDexie as default };\n//# sourceMappingURL=y-dexie.js.map\n","import { cmp, InsertType } from 'dexie';\nimport { DexieCloudDB } from '../db/DexieCloudDB';\nimport { YServerMessage } from 'dexie-cloud-common';\nimport { DEXIE_CLOUD_SYNCER_ID } from '../sync/DEXIE_CLOUD_SYNCER_ID';\nimport { getUpdatesTable } from './getUpdatesTable';\nimport { DexieYProvider, YSyncState, YUpdateRow } from 'y-dexie';\n\nexport async function applyYServerMessages(\n yMessages: YServerMessage[],\n db: DexieCloudDB\n): Promise<{\n receivedUntils: { [yTable: string]: number };\n resyncNeeded: boolean;\n yServerRevision?: string;\n}> {\n const receivedUntils: { [yTable: string]: number } = {};\n let resyncNeeded = false;\n let yServerRevision: string | undefined;\n for (const m of yMessages) {\n try {\n switch (m.type) {\n case 'u-s': {\n const utbl = getUpdatesTable(db, m.table, m.prop);\n if (utbl) {\n const updateRow: InsertType<YUpdateRow, 'i'> = {\n k: m.k,\n u: m.u,\n };\n if (m.r) {\n // @ts-ignore\n updateRow.r = m.r;\n yServerRevision = m.r;\n }\n receivedUntils[utbl.name] = await utbl.add(updateRow);\n }\n break;\n }\n case 'u-ack': {\n const utbl = getUpdatesTable(db, m.table, m.prop);\n if (utbl) {\n await db.transaction('rw', utbl, async (tx) => {\n let syncer = (await tx\n .table(utbl.name)\n .get(DEXIE_CLOUD_SYNCER_ID)) as YSyncState | undefined;\n await tx.table(utbl.name).put({\n ...(syncer || { i: DEXIE_CLOUD_SYNCER_ID }),\n unsentFrom: Math.max(syncer?.unsentFrom || 1, m.i + 1),\n } as YSyncState);\n });\n }\n break;\n }\n case 'u-reject': {\n // Acces control or constraint rejected the update.\n // We delete it. It's not going to be sent again.\n // What's missing is a way to notify consumers, such as Tiptap editor, that the update was rejected.\n // This is only an issue when the document is open. We could find the open document and\n // in a perfect world, we should send a reverse update to the open document to undo the change.\n // See my question in https://discuss.yjs.dev/t/generate-an-inverse-update/2765\n console.debug(`Y update rejected. Deleting it.`);\n const utbl = getUpdatesTable(db, m.table, m.prop);\n if (!utbl) break;\n // Delete the rejected update and all local updates since (avoid holes in the CRDT)\n // and destroy it's open document if there is one.\n const primaryKey = (await utbl.get(m.i))?.k;\n if (primaryKey != null) {\n await db.transaction('rw', utbl, (tx) => {\n // @ts-ignore\n tx.idbtrans._rejecting_y_ypdate = true; // Inform ydoc triggers that we delete because of a rejection and not GC\n return utbl\n .where('i')\n .aboveOrEqual(m.i)\n .filter(\n (u) => cmp(u.k, primaryKey) === 0 && ((u.f || 0) & 1) === 1\n )\n .delete();\n });\n // Destroy active doc\n const activeDoc = DexieYProvider.getDocCache(db.dx).find(\n m.table,\n primaryKey,\n m.prop\n );\n if (activeDoc) activeDoc.destroy(); // Destroy the document so that editors don't continue to work on it\n }\n break;\n }\n case 'in-sync': {\n const doc = DexieYProvider.getDocCache(db.dx).find(\n m.table,\n m.k,\n m.prop\n );\n if (doc && !doc.isSynced) {\n doc.emit('sync', [true, doc]);\n }\n break;\n }\n case 'y-complete-sync-done': {\n yServerRevision = m.yServerRev;\n break;\n }\n case 'outdated-server-rev':\n resyncNeeded = true;\n break;\n }\n } catch (e) {\n console.error(`Failed to apply YMessage`, m, e);\n }\n }\n\n return {\n receivedUntils,\n resyncNeeded,\n yServerRevision,\n };\n}\n","import {\n asyncIterablePipeline,\n consumeChunkedBinaryStream,\n getFetchResponseBodyGenerator,\n} from 'dexie-cloud-common';\nimport { DexieCloudDB } from '../db/DexieCloudDB';\nimport { PersistedSyncState } from '../db/entities/PersistedSyncState';\nimport { TSON } from '../TSON';\nimport { loadAccessToken } from '../authentication/authenticate';\nimport {\n Decoder,\n readUint8,\n readVarString,\n readAny,\n readVarUint8Array,\n hasContent,\n} from 'lib0/decoding';\nimport { getUpdatesTable } from './getUpdatesTable';\nimport Dexie, { InsertType } from 'dexie';\nimport type { YUpdateRow } from 'y-dexie';\n\nconst BINSTREAM_TYPE_REALMID = 1;\nconst BINSTREAM_TYPE_TABLE_AND_PROP = 2;\nconst BINSTREAM_TYPE_DOCUMENT = 3;\n\nexport async function downloadYDocsFromServer(\n db: DexieCloudDB,\n databaseUrl: string,\n { yDownloadedRealms, realms }: PersistedSyncState\n) {\n if (\n yDownloadedRealms &&\n realms &&\n realms.every((realmId) => yDownloadedRealms[realmId] === '*')\n ) {\n return; // Already done!\n }\n console.debug('Downloading Y.Docs from added realms');\n const user = await loadAccessToken(db);\n const headers: HeadersInit = {\n 'Content-Type': 'application/json',\n Accept: 'application/octet-stream',\n };\n if (user) {\n headers.Authorization = `Bearer ${user.accessToken}`;\n }\n const res = await fetch(`${databaseUrl}/y/download`, {\n body: TSON.stringify({ downloadedRealms: yDownloadedRealms || {} }),\n method: 'POST',\n headers,\n credentials: 'include',\n });\n if (!res.ok) {\n throw new Error(\n `Failed to download Yjs documents from server. Status: ${res.status}`\n );\n }\n await asyncIterablePipeline(\n getFetchResponseBodyGenerator(res),\n consumeChunkedBinaryStream,\n consumeDownloadChunks\n );\n\n async function* consumeDownloadChunks(chunks: AsyncIterable<Uint8Array>) {\n let currentRealmId: string | null = null;\n let currentTable: string | null = null;\n let currentProp: string | null = null;\n let docsToInsert: InsertType<YUpdateRow, 'i'>[] = [];\n\n async function storeCollectedDocs(completedRealm: boolean) {\n const lastDoc = docsToInsert[docsToInsert.length - 1];\n if (docsToInsert.length > 0) {\n if (!currentRealmId || !currentTable || !currentProp) {\n throw new Error(`Protocol error from ${databaseUrl}/y/download`);\n }\n const yTable = getUpdatesTable(db, currentTable, currentProp);\n if (yTable) {\n await yTable.bulkAdd(docsToInsert);\n }\n docsToInsert = [];\n }\n if (\n currentRealmId &&\n ((currentTable && currentProp && lastDoc) || completedRealm)\n ) {\n await db.$syncState.update('syncState', (syncState: PersistedSyncState) => {\n const yDownloadedRealms = syncState.yDownloadedRealms || {};\n yDownloadedRealms[currentRealmId!] = completedRealm\n ? '*'\n : {\n tbl: currentTable!,\n prop: currentProp!,\n key: lastDoc.k!,\n };\n syncState.yDownloadedRealms = yDownloadedRealms;\n });\n }\n }\n\n try {\n for await (const chunk of chunks) {\n const decoder = new Decoder(chunk);\n while (hasContent(decoder)) {\n switch (readUint8(decoder)) {\n case BINSTREAM_TYPE_REALMID:\n await storeCollectedDocs(true);\n currentRealmId = readVarString(decoder);\n break;\n case BINSTREAM_TYPE_TABLE_AND_PROP:\n await storeCollectedDocs(false); // still on same realm\n currentTable = readVarString(decoder);\n currentProp = readVarString(decoder);\n break;\n case BINSTREAM_TYPE_DOCUMENT: {\n const k = readAny(decoder);\n const u = readVarUint8Array(decoder);\n docsToInsert.push({\n k,\n u,\n });\n break;\n }\n }\n }\n await storeCollectedDocs(false); // Chunk full - migth still be on same realm\n }\n await storeCollectedDocs(true); // Everything downloaded - finalize last downloaded realm to \"*\"\n } catch (error) {\n if (!(error instanceof Dexie.DexieError)) {\n // Network error might have happened.\n // Store what we've collected so far:\n await storeCollectedDocs(false);\n }\n throw error;\n }\n }\n}\n","import { __asyncValues } from \"tslib\";\nexport async function asyncIterablePipeline(source, ...stages) {\n var _a, e_1, _b, _c;\n // Chain generators by sending outdata from one to another\n let result = source(); // Start with the source generator\n for (let i = 0; i < stages.length; i++) {\n result = stages[i](result); // Pass on the result to next generator\n }\n try {\n // Start running the machine. If the last stage is a sink, it will consume the data and never emit anything\n // to us here...\n for (var _d = true, result_1 = __asyncValues(result), result_1_1; result_1_1 = await result_1.next(), _a = result_1_1.done, !_a; _d = true) {\n _c = result_1_1.value;\n _d = false;\n const chunk = _c;\n }\n }\n catch (e_1_1) { e_1 = { error: e_1_1 }; }\n finally {\n try {\n if (!_d && !_a && (_b = result_1.return)) await _b.call(result_1);\n }\n finally { if (e_1) throw e_1.error; }\n }\n}\n","import { __asyncGenerator, __await } from \"tslib\";\nexport function getFetchResponseBodyGenerator(res) {\n return function () {\n return __asyncGenerator(this, arguments, function* () {\n if (!res.body)\n throw new Error(\"Response body is not readable\");\n const reader = res.body.getReader();\n try {\n while (true) {\n const { done, value } = yield __await(reader.read());\n if (done)\n return yield __await(void 0);\n yield yield __await(value);\n }\n }\n finally {\n reader.releaseLock();\n }\n });\n };\n}\n","import { getMutationTable } from '../helpers/getMutationTable';\nimport { getSyncableTables } from '../helpers/getSyncableTables';\nimport { DexieCloudDB } from '../db/DexieCloudDB';\nimport { listSyncifiedChanges } from './listSyncifiedChanges';\nimport { getTablesToSyncify } from './getTablesToSyncify';\nimport { listClientChanges } from './listClientChanges';\nimport { syncWithServer } from './syncWithServer';\nimport { modifyLocalObjectsWithNewUserId } from './modifyLocalObjectsWithNewUserId';\nimport { throwIfCancelled } from '../helpers/CancelToken';\nimport { DexieCloudOptions } from '../DexieCloudOptions';\nimport { BaseRevisionMapEntry } from '../db/entities/BaseRevisionMapEntry';\nimport { getTableFromMutationTable } from '../helpers/getTableFromMutationTable';\nimport {\n applyOperations,\n DBKeyMutationSet,\n DBOperationsSet,\n DexieCloudSchema,\n randomString,\n subtractChanges,\n SyncResponse,\n toDBOperationSet,\n} from 'dexie-cloud-common';\nimport { PersistedSyncState } from '../db/entities/PersistedSyncState';\nimport { isOnline } from './isOnline';\nimport { updateBaseRevs } from './updateBaseRevs';\nimport { getLatestRevisionsPerTable } from './getLatestRevisionsPerTable';\nimport { applyServerChanges } from './applyServerChanges';\nimport { checkSyncRateLimitDelay } from './ratelimit';\nimport { listYClientMessagesAndStateVector } from '../yjs/listYClientMessagesAndStateVector';\nimport { applyYServerMessages } from '../yjs/applyYMessages';\nimport { updateYSyncStates } from '../yjs/updateYSyncStates';\nimport { downloadYDocsFromServer } from '../yjs/downloadYDocsFromServer';\nimport { UpdateSpec } from 'dexie';\n\nexport const CURRENT_SYNC_WORKER = 'currentSyncWorker';\n\nexport interface SyncOptions {\n isInitialSync?: boolean;\n cancelToken?: { cancelled: boolean };\n justCheckIfNeeded?: boolean;\n retryImmediatelyOnFetchError?: boolean;\n purpose?: 'pull' | 'push';\n}\n\nexport function sync(\n db: DexieCloudDB,\n options: DexieCloudOptions,\n schema: DexieCloudSchema,\n syncOptions?: SyncOptions\n): Promise<boolean> {\n return _sync(db, options, schema, syncOptions)\n .then((result) => {\n if (!syncOptions?.justCheckIfNeeded) { // && syncOptions?.purpose !== 'push') {\n db.syncStateChangedEvent.next({\n phase: 'in-sync',\n });\n }\n return result;\n })\n .catch(async (error: any) => {\n if (syncOptions?.justCheckIfNeeded) return Promise.reject(error); // Just rethrow.\n console.debug('Error from _sync', {\n isOnline,\n syncOptions,\n error,\n });\n if (\n isOnline &&\n syncOptions?.retryImmediatelyOnFetchError &&\n error?.name === 'TypeError' &&\n /fetch/.test(error?.message)\n ) {\n db.syncStateChangedEvent.next({\n phase: 'error',\n error,\n });\n // Retry again in 500 ms but if it fails again, don't retry.\n await new Promise((resolve) => setTimeout(resolve, 500));\n return await sync(db, options, schema, {\n ...syncOptions,\n retryImmediatelyOnFetchError: false,\n });\n }\n // Make sure that no matter whether sync() explodes or not,\n // always update the timestamp. Also store the error.\n await db.$syncState.update('syncState', {\n timestamp: new Date(),\n error: '' + error,\n });\n db.syncStateChangedEvent.next({\n phase: isOnline ? 'error' : 'offline',\n error: new Error('' + error?.message || error),\n });\n return Promise.reject(error);\n });\n}\n\nasync function _sync(\n db: DexieCloudDB,\n options: DexieCloudOptions,\n schema: DexieCloudSchema,\n { isInitialSync, cancelToken, justCheckIfNeeded, purpose }: SyncOptions = {\n isInitialSync: false,\n }\n): Promise<boolean> {\n if (!justCheckIfNeeded) {\n console.debug('SYNC STARTED', { isInitialSync, purpose });\n }\n if (!db.cloud.options?.databaseUrl)\n throw new Error(\n `Internal error: sync must not be called when no databaseUrl is configured`\n );\n const { databaseUrl } = options;\n const currentUser = await db.getCurrentUser(); // Keep same value across entire sync flow:\n const tablesToSync = currentUser.isLoggedIn ? getSyncableTables(db) : [];\n\n const mutationTables = tablesToSync.map((tbl) =>\n db.table(getMutationTable(tbl.name))\n );\n\n // If this is not the initial sync,\n // go through tables that were previously not synced but should now be according to\n // logged in state and the sync table whitelist in db.cloud.options.\n //\n // Prepare for syncification by modifying locally unauthorized objects:\n //\n const persistedSyncState = await db.getPersistedSyncState();\n const readyForSyncification = currentUser.isLoggedIn;\n const tablesToSyncify = readyForSyncification\n ? getTablesToSyncify(db, persistedSyncState)\n : [];\n throwIfCancelled(cancelToken);\n const doSyncify = tablesToSyncify.length > 0;\n\n if (doSyncify) {\n if (justCheckIfNeeded) return true;\n //console.debug('sync doSyncify is true');\n await db.transaction('rw', tablesToSyncify, async (tx) => {\n // @ts-ignore\n tx.idbtrans.disableChangeTracking = true;\n // @ts-ignore\n tx.idbtrans.disableAccessControl = true; // TODO: Take care of this flag in access control middleware!\n await modifyLocalObjectsWithNewUserId(\n tablesToSyncify,\n currentUser,\n persistedSyncState?.realms\n );\n });\n throwIfCancelled(cancelToken);\n }\n //\n // List changes to sync\n //\n const [clientChangeSet, syncState, baseRevs, {yMessages, lastUpdateIds}] = await db.transaction(\n 'r',\n db.tables,\n async () => {\n const syncState = await db.getPersistedSyncState();\n let baseRevs = await db.$baseRevs.toArray();\n \n // Resolve #2168\n baseRevs = baseRevs.filter(br => tablesToSync.some(tbl => tbl.name === br.tableName));\n\n let clientChanges = await listClientChanges(mutationTables, db);\n const yResults = await listYClientMessagesAndStateVector(db, tablesToSync);\n throwIfCancelled(cancelToken);\n if (doSyncify) {\n const alreadySyncedRealms = [\n ...(persistedSyncState?.realms || []),\n ...(persistedSyncState?.inviteRealms || []),\n ];\n const syncificationInserts = await listSyncifiedChanges(\n tablesToSyncify,\n currentUser,\n schema!,\n alreadySyncedRealms\n );\n throwIfCancelled(cancelToken);\n clientChanges = clientChanges.concat(syncificationInserts);\n return [clientChanges, syncState, baseRevs, yResults];\n }\n return [clientChanges, syncState, baseRevs, yResults];\n }\n );\n\n const pushSyncIsNeeded = clientChangeSet.some((set) =>\n set.muts.some((mut) => mut.keys.length > 0)\n ) || yMessages.some(m => m.type === 'u-c');\n if (justCheckIfNeeded) {\n console.debug('Sync is needed:', pushSyncIsNeeded);\n return pushSyncIsNeeded;\n }\n if (purpose === 'push' && !pushSyncIsNeeded) {\n // The purpose of this request was to push changes\n return false;\n }\n\n const latestRevisions = getLatestRevisionsPerTable(\n clientChangeSet,\n syncState?.latestRevisions\n );\n\n const clientIdentity = syncState?.clientIdentity || randomString(16);\n\n //\n // Push changes to server\n //\n throwIfCancelled(cancelToken);\n const res = await syncWithServer(\n clientChangeSet,\n yMessages,\n syncState,\n baseRevs,\n db,\n databaseUrl,\n schema,\n clientIdentity,\n currentUser\n );\n console.debug('Sync response', res);\n\n //\n // Apply changes locally and clear old change entries:\n //\n const {done, newSyncState} = await db.transaction('rw', db.tables, async (tx) => {\n // @ts-ignore\n tx.idbtrans.disableChangeTracking = true;\n // @ts-ignore\n tx.idbtrans.disableAccessControl = true; // TODO: Take care of this flag in access control middleware!\n\n // Update db.cloud.schema from server response.\n // Local schema MAY include a subset of tables, so do not force all tables into local schema.\n for (const tableName of Object.keys(schema)) {\n if (res.schema[tableName]) {\n // Write directly into configured schema. This code can only be executed alone.\n schema[tableName] = res.schema[tableName];\n }\n }\n await db.$syncState.put(schema, 'schema');\n\n // List mutations that happened during our exchange with the server:\n const addedClientChanges = await listClientChanges(mutationTables, db, {\n since: latestRevisions,\n });\n\n //\n // Delete changes now as server has return success\n // (but keep changes that haven't reached server yet)\n //\n for (const mutTable of mutationTables) {\n const tableName = getTableFromMutationTable(mutTable.name);\n if (\n !addedClientChanges.some(\n (ch) => ch.table === tableName && ch.muts.length > 0\n )\n ) {\n // No added mutations for this table during the time we sent changes\n // to the server.\n // It is therefore safe to clear all changes (which is faster than\n // deleting a range)\n await Promise.all([\n mutTable.clear(),\n db.$baseRevs.where({ tableName }).delete(),\n ]);\n } else if (latestRevisions[tableName]) {\n const latestRev = latestRevisions[tableName] || 0;\n await Promise.all([\n mutTable.where('rev').belowOrEqual(latestRev).delete(),\n db.$baseRevs\n .where(':id')\n .between(\n [tableName, -Infinity],\n [tableName, latestRev + 1],\n true,\n true\n )\n .reverse()\n .offset(1) // Keep one entry (the one mapping muts that came during fetch --> previous server revision)\n .delete(),\n ]);\n } else {\n // In this case, the mutation table only contains added items after sending empty changeset to server.\n // We should not clear out anything now.\n }\n }\n\n // Update latestRevisions object according to additional changes:\n getLatestRevisionsPerTable(addedClientChanges, latestRevisions);\n\n // Update/add new entries into baseRevs map.\n // * On tables without mutations since last serverRevision,\n // this will update existing entry.\n // * On tables where mutations have been recorded since last\n // serverRevision, this will create a new entry.\n // The purpose of this operation is to mark a start revision (per table)\n // so that all client-mutations that come after this, will be mapped to current\n // server revision.\n await updateBaseRevs(db, schema, latestRevisions, res.serverRevision);\n\n const syncState = await db.getPersistedSyncState();\n\n //\n // Delete objects from removed realms\n //\n await deleteObjectsFromRemovedRealms(db, res, syncState);\n\n //\n // Update syncState\n //\n const newSyncState: PersistedSyncState = syncState || {\n syncedTables: [],\n latestRevisions: {},\n realms: [],\n inviteRealms: [],\n clientIdentity,\n };\n if (readyForSyncification) {\n newSyncState.syncedTables = tablesToSync\n .map((tbl) => tbl.name)\n .concat(tablesToSyncify.map((tbl) => tbl.name));\n }\n newSyncState.latestRevisions = latestRevisions;\n newSyncState.remoteDbId = res.dbId;\n newSyncState.initiallySynced = true;\n newSyncState.realms = res.realms;\n newSyncState.inviteRealms = res.inviteRealms;\n newSyncState.serverRevision = res.serverRevision;\n newSyncState.yServerRevision = res.serverRevision;\n newSyncState.timestamp = new Date();\n delete newSyncState.error;\n\n const filteredChanges = filterServerChangesThroughAddedClientChanges(\n res.changes,\n addedClientChanges\n );\n\n //\n // apply server changes\n //\n await applyServerChanges(filteredChanges, db);\n\n if (res.yMessages) {\n //\n // apply yMessages\n //\n const {receivedUntils, resyncNeeded, yServerRevision} = await applyYServerMessages(res.yMessages, db);\n if (yServerRevision) {\n newSyncState.yServerRevision = yServerRevision;\n }\n\n //\n // update Y SyncStates\n //\n await updateYSyncStates(lastUpdateIds, receivedUntils, db);\n\n if (resyncNeeded) {\n newSyncState.yDownloadedRealms = {}; // Will trigger a full download of Y-documents below...\n }\n }\n\n //\n // Update regular syncState\n //\n db.$syncState.put(newSyncState, 'syncState');\n\n return {\n done: addedClientChanges.length === 0,\n newSyncState\n };\n });\n if (!done) {\n console.debug('MORE SYNC NEEDED. Go for it again!');\n await checkSyncRateLimitDelay(db);\n return await _sync(db, options, schema, { isInitialSync, cancelToken });\n }\n const usingYProps = Object.values(schema).some(tbl => tbl.yProps?.length);\n const serverSupportsYprops = !!res.yMessages;\n if (usingYProps && serverSupportsYprops) {\n try {\n await downloadYDocsFromServer(db, databaseUrl, newSyncState);\n } catch (error) {\n console.error('Failed to download Yjs documents from server', error);\n }\n }\n console.debug('SYNC DONE', { isInitialSync });\n db.syncCompleteEvent.next();\n return false; // Not needed anymore\n}\n\nasync function deleteObjectsFromRemovedRealms(\n db: DexieCloudDB,\n res: SyncResponse,\n syncState: PersistedSyncState | undefined\n) {\n const deletedRealms = new Set<string>();\n const rejectedRealms = new Set<string>();\n const previousRealmSet = syncState ? syncState.realms : [];\n const previousInviteRealmSet = syncState ? syncState.inviteRealms : [];\n const updatedRealmSet = new Set(res.realms);\n const updatedTotalRealmSet = new Set(res.realms.concat(res.inviteRealms));\n for (const realmId of previousRealmSet) {\n if (!updatedRealmSet.has(realmId)) {\n rejectedRealms.add(realmId);\n if (!updatedTotalRealmSet.has(realmId)) {\n deletedRealms.add(realmId);\n }\n }\n }\n for (const realmId of previousInviteRealmSet.concat(previousRealmSet)) {\n if (!updatedTotalRealmSet.has(realmId)) {\n deletedRealms.add(realmId);\n }\n }\n if (deletedRealms.size > 0 || rejectedRealms.size > 0) {\n const tables = getSyncableTables(db);\n for (const table of tables) {\n let realmsToDelete = ['realms', 'members', 'roles'].includes(table.name)\n ? deletedRealms // These tables should spare rejected ones.\n : rejectedRealms; // All other tables shoudl delete rejected+deleted ones\n if (realmsToDelete.size === 0) continue;\n if (\n table.schema.indexes.some(\n (idx) =>\n idx.keyPath === 'realmId' ||\n (Array.isArray(idx.keyPath) && idx.keyPath[0] === 'realmId')\n )\n ) {\n // There's an index to use:\n //console.debug(`REMOVAL: deleting all ${table.name} where realmId anyOf `, JSON.stringify([...realmsToDelete]));\n await table\n .where('realmId')\n .anyOf([...realmsToDelete])\n .delete();\n } else {\n // No index to use:\n //console.debug(`REMOVAL: deleting all ${table.name} where realmId is any of `, JSON.stringify([...realmsToDelete]), realmsToDelete.size);\n await table\n .filter((obj) => !!obj?.realmId && realmsToDelete.has(obj.realmId))\n .delete();\n }\n }\n }\n if (rejectedRealms.size > 0 && syncState?.yDownloadedRealms) {\n // Remove rejected/deleted realms from yDownloadedRealms because of the following use case:\n // 1. User becomes added to the realm\n // 2. User syncs and all documents of the realm is downloaded (downloadYDocsFromServer.ts)\n // 3. User leaves the realm and all docs are deleted locally (built-in-trigger of deleting their rows in this file)\n // 4. User is yet again added to the realm. At this point, we must make sure the docs are not considered already downloaded.\n const updateSpec: UpdateSpec<PersistedSyncState> = {};\n for (const realmId of rejectedRealms) {\n delete syncState.yDownloadedRealms[realmId];\n } \n }\n}\n\nexport function filterServerChangesThroughAddedClientChanges(\n serverChanges: DBOperationsSet<string>,\n addedClientChanges: DBOperationsSet\n): DBOperationsSet<string> {\n const changes: DBKeyMutationSet = {};\n applyOperations(changes, serverChanges);\n const localPostChanges: DBKeyMutationSet = {};\n applyOperations(localPostChanges, addedClientChanges);\n subtractChanges(changes, localPostChanges);\n return toDBOperationSet(changes);\n}\n","import { getSyncableTables } from \"../helpers/getSyncableTables\";\nimport { DexieCloudDB } from \"../db/DexieCloudDB\";\nimport { PersistedSyncState } from \"../db/entities/PersistedSyncState\";\n\nexport function getTablesToSyncify(db: DexieCloudDB, syncState: PersistedSyncState | undefined) {\n const syncedTables = syncState?.syncedTables || [];\n const syncableTables = getSyncableTables(db);\n const tablesToSyncify = syncableTables.filter(\n (tbl) => !syncedTables.includes(tbl.name)\n );\n return tablesToSyncify;\n}\n","import { Table } from \"dexie\";\nimport { EntityCommon } from \"../db/entities/EntityCommon\";\nimport { UserLogin } from \"../db/entities/UserLogin\";\nimport { Member } from \"../db/entities/Member\";\nimport { UNAUTHORIZED_USER } from \"../authentication/UNAUTHORIZED_USER\";\nimport { Realm } from \"../db/entities/Realm\";\n\nexport async function modifyLocalObjectsWithNewUserId(\n syncifiedTables: Table<EntityCommon>[],\n currentUser: UserLogin,\n alreadySyncedRealms?: string[]) {\n const ignoredRealms = new Set(alreadySyncedRealms || []);\n for (const table of syncifiedTables) {\n if (table.name === \"members\") {\n // members\n await table.toCollection().modify((member: Member) => {\n if (!ignoredRealms.has(member.realmId) && (!member.userId || member.userId === UNAUTHORIZED_USER.userId)) {\n member.userId = currentUser.userId;\n }\n });\n } else if (table.name === \"roles\") {\n // roles\n // No changes needed.\n } else if (table.name === \"realms\") {\n // realms\n await table.toCollection().modify((realm: Realm) => {\n if (!ignoredRealms.has(realm.realmId) && (realm.owner === undefined || realm.owner === UNAUTHORIZED_USER.userId)) {\n realm.owner = currentUser.userId;\n }\n });\n } else {\n // application entities\n await table.toCollection().modify((obj) => {\n if (!obj.realmId || !ignoredRealms.has(obj.realmId)) {\n if (!obj.owner || obj.owner === UNAUTHORIZED_USER.userId)\n obj.owner = currentUser.userId;\n if (!obj.realmId || obj.realmId === UNAUTHORIZED_USER.userId) {\n obj.realmId = currentUser.userId;\n }\n }\n });\n }\n }\n}\n","import type { Table } from 'dexie';\nimport type { YClientMessage } from 'dexie-cloud-common';\nimport { DexieCloudDB } from '../db/DexieCloudDB';\nimport { DEXIE_CLOUD_SYNCER_ID } from '../sync/DEXIE_CLOUD_SYNCER_ID';\nimport { listUpdatesSince } from './listUpdatesSince';\nimport * as Y from 'yjs';\nimport { EntityCommon } from '../db/entities/EntityCommon';\nimport type { YSyncState } from 'y-dexie';\n\n/** Queries the local database for YMessages to send to server.\n * \n * There are 2 messages that this function can provide:\n * YUpdateFromClientRequest ( for local updates )\n * YStateVector ( for state vector of foreign updates so that server can reduce the number of udpates to send back )\n *\n * Notice that we do not do a step 1 sync phase here to get a state vector from the server. Reason we can avoid\n * the 2-step sync is that we are client-server and not client-client here and we keep track of the client changes\n * sent to server by letting server acknowledge them. There is always a chance that some client update has already\n * been sent and that the client failed to receive the ack. However, if this happens it does not matter - the change\n * would be sent again and Yjs handles duplicate changes anyway. And it's rare so we earn the cost of roundtrips by\n * avoiding the step1 sync and instead keep track of this in the `unsentFrom` property of the SyncState.\n * \n * @param db \n * @returns \n */\nexport async function listYClientMessagesAndStateVector(\n db: DexieCloudDB,\n tablesToSync: Table<EntityCommon>[]\n): Promise<{yMessages: YClientMessage[], lastUpdateIds: {[yTable: string]: number}}> {\n const result: YClientMessage[] = [];\n const lastUpdateIds: {[yTable: string]: number} = {};\n for (const table of tablesToSync) {\n if (table.schema.yProps) {\n for (const yProp of table.schema.yProps) {\n const yTable = db.table(yProp.updatesTable); // the updates-table for this combo of table+propName\n const syncState = (await yTable.get(DEXIE_CLOUD_SYNCER_ID)) as\n | YSyncState\n | undefined;\n\n // unsentFrom = the `i` value of updates that aren't yet sent to server (or at least not acked by the server yet)\n const unsentFrom = syncState?.unsentFrom || 1;\n // receivedUntil = the `i` value of updates that both we and the server knows we already have (we know it by the outcome from last syncWithServer() because server keep track of its revision numbers\n const receivedUntil = syncState?.receivedUntil || 0;\n // Compute the least value of these two (but since receivedUntil is inclusive we need to add +1 to it)\n const unsyncedFrom = Math.min(unsentFrom, receivedUntil + 1);\n // Query all these updates for all docs of this table+prop combination\n const updates = await listUpdatesSince(yTable, unsyncedFrom);\n if (updates.length > 0) lastUpdateIds[yTable.name] = updates[updates.length -1].i;\n\n // Now sort them by document and whether they are local or not + ignore local updates already sent:\n const perDoc: {\n [docKey: string]: {\n i: number;\n k: any;\n isLocal: boolean;\n u: Uint8Array[];\n };\n } = {};\n for (const update of updates) {\n // Sort updates into buckets of the doc primary key + the flag (whether it's local or foreign)\n const isLocal = ((update.f || 0) & 0x01) === 0x01;\n if (isLocal && update.i < unsentFrom) continue; // This local update has already been sent and acked.\n const docKey = JSON.stringify(update.k) + '/' + isLocal;\n let entry = perDoc[docKey];\n if (!entry) {\n perDoc[docKey] = entry = {\n i: update.i,\n k: update.k,\n isLocal,\n u: [],\n };\n entry.u.push(update.u);\n } else {\n entry.u.push(update.u);\n entry.i = Math.max(update.i, entry.i);\n }\n }\n\n // Now, go through all these and:\n // * For local updates, compute a merged update per document.\n // * For foreign updates, compute a state vector to pass to server, so that server can\n // avoid re-sending updates that we already have (they might have been sent of websocket\n // and when that happens, we do not mark them in any way nor do we update receivedUntil -\n // we only update receivedUntil after a \"full sync\" (syncWithServer()))\n for (const { k, isLocal, u, i } of Object.values(perDoc)) {\n const mergedUpdate = u.length === 1 ? u[0] : Y.mergeUpdatesV2(u);\n if (isLocal) {\n result.push({\n type: 'u-c',\n table: table.name,\n prop: yProp.prop,\n k,\n u: mergedUpdate,\n i,\n });\n } else {\n const stateVector = Y.encodeStateVectorFromUpdateV2(mergedUpdate);\n result.push({\n type: 'sv',\n table: table.name,\n prop: yProp.prop,\n k,\n sv: stateVector,\n });\n }\n }\n }\n }\n }\n return {\n yMessages: result,\n lastUpdateIds\n };\n}\n","import { UserLogin } from '../db/entities/UserLogin';\nimport { randomString } from '../helpers/randomString';\nimport { EntityCommon } from '../db/entities/EntityCommon';\nimport { Table } from 'dexie';\nimport {\n DBOperationsSet,\n DBUpsertOperation,\n DexieCloudSchema,\n isValidAtID,\n isValidSyncableID,\n} from 'dexie-cloud-common';\n\nexport async function listSyncifiedChanges(\n tablesToSyncify: Table<EntityCommon>[],\n currentUser: UserLogin,\n schema: DexieCloudSchema,\n alreadySyncedRealms?: string[]\n): Promise<DBOperationsSet> {\n const txid = `upload-${randomString(8)}`;\n if (currentUser.isLoggedIn) {\n if (tablesToSyncify.length > 0) {\n const ignoredRealms = new Set(alreadySyncedRealms || []);\n const upserts = await Promise.all(\n tablesToSyncify.map(async (table) => {\n const { extractKey } = table.core.schema.primaryKey;\n if (!extractKey) return { table: table.name, muts: [] }; // Outbound tables are not synced.\n\n const dexieCloudTableSchema = schema[table.name];\n const query = dexieCloudTableSchema?.generatedGlobalId\n ? table.filter((item) => {\n const id = extractKey(item);\n return (\n !ignoredRealms.has(item.realmId || '') &&\n //(id[0] !== '#' || !!item.$ts) && // Private obj need no sync if not changed\n isValidAtID(extractKey(item), dexieCloudTableSchema?.idPrefix)\n );\n })\n : table.filter((item) => {\n const id = extractKey(item);\n\n return (\n !ignoredRealms.has(item.realmId || '') &&\n //(id[0] !== '#' || !!item.$ts) && // Private obj need no sync if not changed\n isValidSyncableID(id)\n );\n });\n const unsyncedObjects = await query.toArray();\n if (unsyncedObjects.length > 0) {\n const mut: DBUpsertOperation = {\n type: 'upsert',\n values: unsyncedObjects,\n keys: unsyncedObjects.map(extractKey),\n userId: currentUser.userId,\n txid,\n };\n return {\n table: table.name,\n muts: [mut],\n };\n } else {\n return {\n table: table.name,\n muts: [],\n };\n }\n })\n );\n return upserts.filter((op) => op.muts.length > 0);\n }\n }\n return [];\n}\n","import { UpdateSpec } from 'dexie';\nimport { DexieCloudDB } from '../db/DexieCloudDB';\nimport { PersistedSyncState } from '../db/entities/PersistedSyncState';\nimport { DEXIE_CLOUD_SYNCER_ID } from '../sync/DEXIE_CLOUD_SYNCER_ID';\nimport { YDexieCloudSyncState } from './YDexieCloudSyncState';\n\nexport async function updateYSyncStates(\n lastUpdateIdsBeforeSync: { [yTable: string]: number },\n receivedUntilsAfterSync: { [yTable: string]: number },\n db: DexieCloudDB\n) {\n // We want to update unsentFrom for each yTable to the value specified in first argument\n // because we got those values before we synced with server and here we are back from server\n // that has successfully received all those messages - no matter if the last update was a client or server update,\n // we can safely store unsentFrom to a value of the last update + 1 here.\n // We also want to update receivedUntil for each yTable to the value specified in the second argument,\n // because that contains the highest resulted id of each update from server after storing it.\n // We could do these two tasks separately, but that would require two update calls on the same YSyncState, so\n // to optimize the dexie calls, we merge these two maps into a single one so we can do a single update request\n // per yTable.\n const mergedSpec: {\n [yTable: string]: { unsentFrom?: number; receivedUntil?: number };\n } = {};\n for (const [yTable, lastUpdateId] of Object.entries(\n lastUpdateIdsBeforeSync\n )) {\n mergedSpec[yTable] ??= {};\n mergedSpec[yTable].unsentFrom = lastUpdateId + 1;\n }\n for (const [yTable, lastUpdateId] of Object.entries(\n receivedUntilsAfterSync\n )) {\n mergedSpec[yTable] ??= {};\n mergedSpec[yTable].receivedUntil = lastUpdateId;\n }\n\n // Now go through all yTables and update their YSyncStates:\n const allYTables = Object.values(db.dx._dbSchema)\n .filter((tblSchema) => tblSchema.yProps)\n .map((tblSchema) => tblSchema.yProps!.map((yProp) => yProp.updatesTable))\n .flat();\n for (const yTable of allYTables) {\n const mergedEntry = mergedSpec[yTable];\n const unsentFrom = mergedEntry?.unsentFrom ?? 1;\n const receivedUntil =\n mergedEntry?.receivedUntil ?? // If not received anything on this table, pick the current last update id\n // from local because we are in the same parent transaction (in sync.ts) that\n // applied all updates from the server\n ((\n await db\n .table(yTable)\n .where('i')\n .between(1, Infinity) // Because i might be string DEXIE_CLOUD_SYNCER_ID if not a number.\n .reverse()\n .limit(1)\n .primaryKeys()\n )[0] as number) ??\n 0;\n // We're already in a transaction, but for the sake of\n // code readability and correctness, let's launch an atomic sub transaction:\n await db.transaction('rw', yTable, async () => {\n const state: YDexieCloudSyncState | undefined = await db\n .table(yTable)\n .get(DEXIE_CLOUD_SYNCER_ID);\n if (!state) {\n await db.table<YDexieCloudSyncState>(yTable).add({\n i: DEXIE_CLOUD_SYNCER_ID,\n unsentFrom,\n receivedUntil\n });\n } else {\n state.unsentFrom = Math.max(unsentFrom, state.unsentFrom || 1);\n state.receivedUntil = Math.max(receivedUntil, state.receivedUntil || 0);\n await db.table(yTable).put(state);\n }\n });\n }\n}\n","import { setByKeyPath } from '../utils.js';\nexport function subtractChanges(target, // Server change set\nchangesToSubtract // additional mutations on client during syncWithServer()\n) {\n var _a, _b, _c;\n for (const [table, mutationSet] of Object.entries(changesToSubtract)) {\n for (const [key, mut] of Object.entries(mutationSet)) {\n switch (mut.type) {\n case 'ups':\n {\n const targetMut = (_a = target[table]) === null || _a === void 0 ? void 0 : _a[key];\n if (targetMut) {\n switch (targetMut.type) {\n case 'ups':\n delete target[table][key];\n break;\n case 'del':\n // Leave delete operation.\n // (Don't resurrect objects unintenionally (using tx(get, put) pattern locally))\n break;\n case 'upd':\n delete target[table][key];\n break;\n }\n }\n }\n break;\n case 'del':\n (_b = target[table]) === null || _b === void 0 ? true : delete _b[key];\n break;\n case 'upd': {\n const targetMut = (_c = target[table]) === null || _c === void 0 ? void 0 : _c[key];\n if (targetMut) {\n switch (targetMut.type) {\n case 'ups':\n // Adjust the server upsert with locally updated values.\n for (const [propPath, value] of Object.entries(mut.mod)) {\n setByKeyPath(targetMut.val, propPath, value);\n }\n break;\n case 'del':\n // Leave delete.\n break;\n case 'upd':\n // Remove the local update props from the server update mutation.\n for (const propPath of Object.keys(mut.mod)) {\n delete targetMut.mod[propPath];\n }\n break;\n }\n }\n break;\n }\n }\n }\n }\n}\n","import { randomString } from \"../utils.js\";\n/** Convert a DBKeyMutationSet (which is an internal format capable of looking up changes per ID)\n * ...into a DBOperationsSet (which is more optimal for performing DB operations into DB (bulkAdd() etc))\n *\n * @param inSet\n * @returns DBOperationsSet representing inSet\n */\nexport function toDBOperationSet(inSet, txid = \"\") {\n // Fictive transaction:\n if (!txid)\n txid = randomString(16);\n // Convert data into a temporary map to collect mutations of same table and type\n const map = {};\n for (const [table, ops] of Object.entries(inSet)) {\n for (const [key, op] of Object.entries(ops)) {\n const mapEntry = map[table] || (map[table] = {});\n const ops = mapEntry[op.type] || (mapEntry[op.type] = []);\n ops.push(Object.assign({ key }, op)); // DBKeyMutation doesn't contain key, so we need to bring it in.\n }\n }\n // Start computing the resulting format:\n const result = [];\n for (const [table, ops] of Object.entries(map)) {\n const resultEntry = {\n table,\n muts: [],\n };\n for (const [optype, muts] of Object.entries(ops)) {\n switch (optype) {\n case \"ups\": {\n const op = {\n type: \"upsert\",\n keys: muts.map(mut => mut.key),\n values: muts.map(mut => mut.val),\n txid\n };\n resultEntry.muts.push(op);\n break;\n }\n case \"upd\": {\n const op = {\n type: \"update\",\n keys: muts.map(mut => mut.key),\n changeSpecs: muts.map(mut => mut.mod),\n txid\n };\n resultEntry.muts.push(op);\n break;\n }\n case \"del\": {\n const op = {\n type: \"delete\",\n keys: muts.map(mut => mut.key),\n txid,\n };\n resultEntry.muts.push(op);\n break;\n }\n }\n }\n result.push(resultEntry);\n }\n return result;\n}\n","import { BehaviorSubject, firstValueFrom } from 'rxjs';\nimport { filter, take } from 'rxjs/operators';\nimport { DexieCloudDB } from '../db/DexieCloudDB';\nimport { WSConnectionMsg } from '../WSObservable';\nimport { triggerSync } from './triggerSync';\nimport Dexie from 'dexie';\nimport { computeRealmSetHash } from '../helpers/computeRealmSetHash';\nimport { DBOperationsSet } from 'dexie-cloud-common';\nimport { getSyncableTables } from '../helpers/getSyncableTables';\nimport { getMutationTable } from '../helpers/getMutationTable';\nimport { listClientChanges } from './listClientChanges';\nimport { filterServerChangesThroughAddedClientChanges } from './sync';\nimport { applyServerChanges } from './applyServerChanges';\nimport { updateBaseRevs } from './updateBaseRevs';\nimport { getLatestRevisionsPerTable } from './getLatestRevisionsPerTable';\nimport { refreshAccessToken } from '../authentication/authenticate';\n\nconst LIMIT_NUM_MESSAGES_PER_TIME = 10; // Allow a maximum of 10 messages per...\nconst TIME_WINDOW = 10_000; // ...10 seconds.\nconst PAUSE_PERIOD = 1_000; // Pause for 1 second if reached\n\nexport type MessagesFromServerConsumer = ReturnType<\n typeof MessagesFromServerConsumer\n>;\n\nexport function MessagesFromServerConsumer(db: DexieCloudDB) {\n const queue: WSConnectionMsg[] = [];\n const readyToServe = new BehaviorSubject(true);\n const event = new BehaviorSubject(null);\n let isWorking = false;\n\n let loopDetection = new Array(LIMIT_NUM_MESSAGES_PER_TIME).fill(0);\n\n event.subscribe(async () => {\n if (isWorking) return;\n if (queue.length > 0) {\n isWorking = true;\n loopDetection.shift();\n loopDetection.push(Date.now());\n readyToServe.next(false);\n try {\n await consumeQueue();\n } finally {\n if (\n loopDetection[loopDetection.length - 1] - loopDetection[0] <\n TIME_WINDOW\n ) {\n // Ten loops within 10 seconds. Slow down!\n // This is a one-time event. Just pause 10 seconds.\n console.warn(`Slowing down websocket loop for ${PAUSE_PERIOD} milliseconds`);\n await new Promise((resolve) => setTimeout(resolve, PAUSE_PERIOD));\n }\n isWorking = false;\n readyToServe.next(true);\n }\n }\n });\n\n function enqueue(msg: WSConnectionMsg) {\n queue.push(msg);\n event.next(null);\n }\n\n async function consumeQueue() {\n while (queue.length > 0) {\n const msg = queue.shift();\n try {\n // If the sync worker or service worker is syncing, wait 'til thei're done.\n // It's no need to have two channels at the same time - even though it wouldnt\n // be a problem - this is an optimization.\n await firstValueFrom(\n db.cloud.syncState.pipe(\n filter(({ phase }) => phase === 'in-sync' || phase === 'error')\n )\n );\n console.debug('processing msg', msg);\n const persistedSyncState = db.cloud.persistedSyncState.value;\n //syncState.\n if (!msg) continue;\n switch (msg.type) {\n case 'token-expired':\n console.debug(\n 'WebSocket observable: Token expired. Refreshing token...'\n );\n const user = db.cloud.currentUser.value;\n // Refresh access token\n const refreshedLogin = await refreshAccessToken(\n db.cloud.options!.databaseUrl,\n user\n );\n // Persist updated access token\n await db.table('$logins').update(user.userId, {\n accessToken: refreshedLogin.accessToken,\n accessTokenExpiration: refreshedLogin.accessTokenExpiration,\n claims: refreshedLogin.claims,\n license: refreshedLogin.license,\n data: refreshedLogin.data,\n });\n // Updating $logins will trigger emission of db.cloud.currentUser observable, which\n // in turn will lead to that connectWebSocket.ts will reconnect the socket with the\n // new token. So we don't need to do anything more here.\n break;\n case 'realm-added':\n if (\n !persistedSyncState?.realms?.includes(msg.realm) &&\n !persistedSyncState?.inviteRealms?.includes(msg.realm)\n ) {\n await db.cloud.sync({ purpose: 'pull', wait: true });\n //triggerSync(db, 'pull');\n }\n break;\n case 'realm-accepted':\n if (!persistedSyncState?.realms?.includes(msg.realm)) {\n await db.cloud.sync({ purpose: 'pull', wait: true });\n //triggerSync(db, 'pull');\n }\n break;\n case 'realm-removed':\n if (\n persistedSyncState?.realms?.includes(msg.realm) ||\n persistedSyncState?.inviteRealms?.includes(msg.realm)\n ) {\n await db.cloud.sync({ purpose: 'pull', wait: true });\n //triggerSync(db, 'pull');\n }\n break;\n case 'realms-changed':\n //triggerSync(db, 'pull');\n await db.cloud.sync({ purpose: 'pull', wait: true });\n break;\n case 'changes':\n console.debug('changes');\n if (db.cloud.syncState.value?.phase === 'error') {\n triggerSync(db, 'pull');\n break;\n }\n await db.transaction('rw', db.dx.tables, async (tx) => {\n // @ts-ignore\n tx.idbtrans.disableChangeTracking = true;\n // @ts-ignore\n tx.idbtrans.disableAccessControl = true;\n const [schema, syncState, currentUser] = await Promise.all([\n db.getSchema(),\n db.getPersistedSyncState(),\n db.getCurrentUser(),\n ]);\n console.debug('ws message queue: in transaction');\n if (!syncState || !schema || !currentUser) {\n console.debug('required vars not present', {\n syncState,\n schema,\n currentUser,\n });\n return; // Initial sync must have taken place - otherwise, ignore this.\n }\n // Verify again in ACID tx that we're on same server revision.\n if (msg.baseRev !== syncState.serverRevision) {\n console.debug(\n `baseRev (${msg.baseRev}) differs from our serverRevision in syncState (${syncState.serverRevision})`\n );\n // Should we trigger a sync now? No. This is a normal case\n // when another local peer (such as the SW or a websocket channel on other tab) has\n // updated syncState from new server information but we are not aware yet. It would\n // be unnescessary to do a sync in that case. Instead, the caller of this consumeQueue()\n // function will do readyToServe.next(true) right after this return, which will lead\n // to a \"ready\" message being sent to server with the new accurate serverRev we have,\n // so that the next message indeed will be correct.\n if (\n typeof msg.baseRev === 'string' && // v2 format\n (typeof syncState.serverRevision === 'bigint' || // v1 format\n typeof syncState.serverRevision === 'object') // v1 format old browser\n ) {\n // The reason for the diff seems to be that server has migrated the revision format.\n // Do a full sync to update revision format.\n // If we don't do a sync request now, we could stuck in an endless loop.\n triggerSync(db, 'pull');\n }\n return; // Ignore message\n }\n // Verify also that the message is based on the exact same set of realms\n const ourRealmSetHash = await Dexie.waitFor(\n // Keep TX in non-IDB work\n computeRealmSetHash(syncState)\n );\n console.debug('ourRealmSetHash', ourRealmSetHash);\n if (ourRealmSetHash !== msg.realmSetHash) {\n console.debug('not same realmSetHash', msg.realmSetHash);\n triggerSync(db, 'pull');\n // The message isn't based on the same realms.\n // Trigger a sync instead to resolve all things up.\n return;\n }\n\n // Get clientChanges\n let clientChanges: DBOperationsSet = [];\n if (currentUser.isLoggedIn) {\n const mutationTables = getSyncableTables(db).map((tbl) =>\n db.table(getMutationTable(tbl.name))\n );\n clientChanges = await listClientChanges(mutationTables, db);\n console.debug('msg queue: client changes', clientChanges);\n }\n if (msg.changes.length > 0) {\n const filteredChanges =\n filterServerChangesThroughAddedClientChanges(\n msg.changes,\n clientChanges\n );\n\n //\n // apply server changes\n //\n console.debug(\n 'applying filtered server changes',\n filteredChanges\n );\n await applyServerChanges(filteredChanges, db);\n }\n\n // Update latest revisions per table in case there are unsynced changes\n // This can be a real case in future when we allow non-eagery sync.\n // And it can actually be realistic now also, but very rare.\n syncState.latestRevisions = getLatestRevisionsPerTable(\n clientChanges,\n syncState.latestRevisions\n );\n\n syncState.serverRevision = msg.newRev;\n\n // Update base revs\n console.debug('Updating baseRefs', syncState.latestRevisions);\n await updateBaseRevs(\n db,\n schema!,\n syncState.latestRevisions,\n msg.newRev\n );\n\n //\n // Update syncState\n //\n console.debug('Updating syncState', syncState);\n await db.$syncState.put(syncState, 'syncState');\n });\n console.debug('msg queue: done with rw transaction');\n break;\n }\n } catch (error) {\n console.error(`Error in msg queue`, error);\n }\n }\n }\n\n return {\n enqueue,\n readyToServe,\n };\n}\n","import Dexie, { Table } from 'dexie';\nimport { GuardedJob } from './entities/GuardedJob';\nimport { UserLogin } from './entities/UserLogin';\nimport { PersistedSyncState } from './entities/PersistedSyncState';\nimport { UNAUTHORIZED_USER } from '../authentication/UNAUTHORIZED_USER';\nimport { DexieCloudOptions } from '../DexieCloudOptions';\nimport { BehaviorSubject, Subject } from 'rxjs';\nimport { BaseRevisionMapEntry } from './entities/BaseRevisionMapEntry';\nimport {\n DBRealm,\n DBRealmMember,\n DBRealmRole,\n DexieCloudSchema,\n} from 'dexie-cloud-common';\nimport { BroadcastedAndLocalEvent } from '../helpers/BroadcastedAndLocalEvent';\nimport { SyncState, SyncStatePhase } from '../types/SyncState';\nimport { MessagesFromServerConsumer } from '../sync/messagesFromServerQueue';\nimport { YClientMessage } from 'dexie-cloud-common';\n\n/*export interface DexieCloudDB extends Dexie {\n table(name: string): Table<any, any>;\n table(name: \"$jobs\"): Table<GuardedJob, string>;\n table(name: \"$logins\"): Table<UserLogin, string>;\n table(name: \"$syncState\"): Table<SyncState, \"syncState\">;\n //table(name: \"$pendingChangesFromServer\"): Table<DBOperationsSet, number>;\n}\n*/\n\nexport interface SyncStateChangedEventData {\n phase: SyncStatePhase;\n error?: Error;\n progress?: number;\n}\n\ntype SyncStateTable = Table<\n PersistedSyncState | DexieCloudSchema | DexieCloudOptions,\n 'syncState' | 'options' | 'schema'\n>;\nexport interface DexieCloudDBBase {\n readonly name: Dexie['name'];\n readonly close: Dexie['close'];\n transaction: Dexie['transaction'];\n table: Dexie['table'];\n readonly tables: Dexie['tables'];\n readonly cloud: Dexie['cloud'];\n readonly $jobs: Table<GuardedJob, string>;\n readonly $logins: Table<UserLogin, string>;\n readonly $syncState: SyncStateTable;\n readonly $baseRevs: Table<BaseRevisionMapEntry, [string, number]>;\n\n readonly realms: Table<DBRealm, string>;\n readonly members: Table<DBRealmMember, string>;\n readonly roles: Table<DBRealmRole, [string, string]>;\n\n readonly localSyncEvent: Subject<{ purpose?: 'pull' | 'push' }>;\n readonly syncStateChangedEvent: BroadcastedAndLocalEvent<SyncStateChangedEventData>;\n readonly syncCompleteEvent: BroadcastedAndLocalEvent<void>;\n readonly dx: Dexie;\n readonly initiallySynced: boolean;\n}\n\nexport interface DexieCloudDB extends DexieCloudDBBase {\n getCurrentUser(): Promise<UserLogin>;\n getSchema(): Promise<DexieCloudSchema | undefined>;\n getOptions(): Promise<DexieCloudOptions | undefined>;\n getPersistedSyncState(): Promise<PersistedSyncState | undefined>;\n setInitiallySynced(initiallySynced: boolean): void;\n reconfigure(): void;\n messageConsumer: MessagesFromServerConsumer;\n messageProducer: Subject<YClientMessage>;\n}\n\nconst wm = new WeakMap<object, DexieCloudDB>();\n\nexport const DEXIE_CLOUD_SCHEMA = {\n members: '@id, [userId+realmId], [email+realmId], realmId',\n roles: '[realmId+name]',\n realms: '@realmId',\n $jobs: '',\n $syncState: '',\n $baseRevs: '[tableName+clientRev]',\n $logins: 'claims.sub, lastLogin',\n};\n\nlet static_counter = 0;\nexport function DexieCloudDB(dx: Dexie): DexieCloudDB {\n if ('vip' in dx) dx = dx['vip']; // Avoid race condition. Always map to a vipped dexie that don't block during db.on.ready().\n let db = wm.get(dx.cloud);\n if (!db) {\n const localSyncEvent = new Subject<{ purpose: 'push' | 'pull' }>();\n let syncStateChangedEvent =\n new BroadcastedAndLocalEvent<SyncStateChangedEventData>(\n `syncstatechanged-${dx.name}`\n );\n let syncCompleteEvent = new BroadcastedAndLocalEvent<void>(\n `synccomplete-${dx.name}`\n );\n localSyncEvent['id'] = ++static_counter;\n let initiallySynced = false;\n db = {\n get name() {\n return dx.name;\n },\n close() {\n return dx.close();\n },\n transaction: dx.transaction.bind(dx),\n table: dx.table.bind(dx),\n get tables() {\n return dx.tables;\n },\n cloud: dx.cloud,\n get $jobs() {\n return dx.table('$jobs') as Table<GuardedJob, string>;\n },\n get $syncState() {\n return dx.table('$syncState') as SyncStateTable;\n },\n get $baseRevs() {\n return dx.table('$baseRevs') as Table<\n BaseRevisionMapEntry,\n [string, number]\n >;\n },\n get $logins() {\n return dx.table('$logins') as Table<UserLogin, string>;\n },\n\n get realms() {\n return dx.realms;\n },\n get members() {\n return dx.members;\n },\n get roles() {\n return dx.roles;\n },\n get initiallySynced() {\n return initiallySynced;\n },\n localSyncEvent,\n get syncStateChangedEvent() {\n return syncStateChangedEvent;\n },\n get syncCompleteEvent() {\n return syncCompleteEvent;\n },\n dx,\n } as DexieCloudDB;\n\n const helperMethods: Partial<DexieCloudDB> = {\n getCurrentUser() {\n return db!.$logins\n .toArray()\n .then(\n (logins) => logins.find((l) => l.isLoggedIn) || UNAUTHORIZED_USER\n );\n },\n getPersistedSyncState() {\n return db!.$syncState.get('syncState') as Promise<\n PersistedSyncState | undefined\n >;\n },\n getSchema() {\n return db!.$syncState.get('schema').then((schema: DexieCloudSchema) => {\n if (schema) {\n for (const table of db!.tables) {\n if (table.schema.primKey && table.schema.primKey.keyPath && schema[table.name]) {\n schema[table.name].primaryKey = nameFromKeyPath(\n table.schema.primKey.keyPath\n );\n }\n }\n }\n return schema;\n }) as Promise<DexieCloudSchema | undefined>;\n },\n getOptions() {\n return db!.$syncState.get('options') as Promise<\n DexieCloudOptions | undefined\n >;\n },\n setInitiallySynced(value) {\n initiallySynced = value;\n },\n reconfigure() {\n syncStateChangedEvent = new BroadcastedAndLocalEvent<SyncState>(\n `syncstatechanged-${dx.name}`\n );\n syncCompleteEvent = new BroadcastedAndLocalEvent<void>(\n `synccomplete-${dx.name}`\n );\n },\n };\n\n Object.assign(db, helperMethods);\n db.messageConsumer = MessagesFromServerConsumer(db);\n db.messageProducer = new Subject<YClientMessage>();\n wm.set(dx.cloud, db);\n }\n return db;\n}\n\nfunction nameFromKeyPath (keyPath?: string | string[]): string {\n return typeof keyPath === 'string' ?\n keyPath :\n keyPath ? ('[' + [].join.call(keyPath, '+') + ']') : \"\";\n}\n","import { DexieCloudDB } from \"../db/DexieCloudDB\";\nimport { UserLogin } from \"../db/entities/UserLogin\";\n\nexport interface AuthPersistedContext extends UserLogin {\n save(): Promise<void>;\n}\n\n// Emulate true-private property db. Why? So it's not stored in DB.\nconst wm = new WeakMap<AuthPersistedContext, DexieCloudDB>();\n\nexport class AuthPersistedContext {\n constructor(db: DexieCloudDB, userLogin: UserLogin) {\n wm.set(this, db);\n Object.assign(this, userLogin);\n }\n\n static load(db: DexieCloudDB, userId: string) {\n return db\n .table(\"$logins\")\n .get(userId)\n .then(\n (userLogin) => new AuthPersistedContext(db, userLogin || {\n userId,\n claims: {\n sub: userId\n },\n lastLogin: new Date(0)\n })\n );\n }\n\n async save() {\n const db = wm.get(this)!;\n db.table(\"$logins\").put(this);\n }\n}\n","import { filter, firstValueFrom, from, InteropObservable, Observable } from 'rxjs';\n\nexport function waitUntil<T>(\n o: Observable<T> | InteropObservable<T>, // Works with Dexie's liveQuery observables if we'd need that\n predicate: (value: T) => boolean\n) {\n return firstValueFrom(from(o).pipe(\n filter(predicate),\n ));\n}\n","import { DexieCloudDB } from '../db/DexieCloudDB';\nimport { TXExpandos } from '../types/TXExpandos';\nimport { confirmLogout } from './interactWithUser';\nimport { UNAUTHORIZED_USER } from './UNAUTHORIZED_USER';\nimport { waitUntil } from './waitUntil';\n\nexport async function logout(db: DexieCloudDB) {\n const numUnsyncedChanges = await _logout(db);\n if (numUnsyncedChanges) {\n if (\n await confirmLogout(\n db.cloud.userInteraction,\n db.cloud.currentUserId,\n numUnsyncedChanges\n )\n ) {\n await _logout(db, { deleteUnsyncedData: true });\n } else {\n throw new Error(`User cancelled logout due to unsynced changes`);\n }\n }\n}\n\nexport async function _logout(db: DexieCloudDB, { deleteUnsyncedData = false } = {}) {\n // Clear the database without emptying configuration options.\n const [numUnsynced, loggedOut] = await db.dx.transaction('rw', db.dx.tables, async (tx) => {\n // @ts-ignore\n const idbtrans: IDBTransaction & TXExpandos = tx.idbtrans;\n idbtrans.disableChangeTracking = true;\n idbtrans.disableAccessControl = true;\n const mutationTables = tx.storeNames.filter((tableName) =>\n tableName.endsWith('_mutations')\n );\n\n // Count unsynced changes\n const unsyncCounts = await Promise.all(\n mutationTables.map((mutationTable) => tx.table(mutationTable).count())\n );\n const sumUnSynced = unsyncCounts.reduce((a, b) => a + b, 0);\n\n if (sumUnSynced > 0 && !deleteUnsyncedData) {\n // Let caller ask user if they want to delete unsynced data.\n return [sumUnSynced, false];\n }\n \n // Either there are no unsynched changes, or caller provided flag deleteUnsynchedData = true.\n // Clear all tables except $jobs and $syncState (except the persisted sync state which is\n // also cleared because we're going to rebuild it using a fresh sync).\n db.$syncState.delete('syncState');\n for (const table of db.dx.tables) {\n if (table.name !== '$jobs' && table.name !== '$syncState') {\n table.clear();\n }\n }\n return [sumUnSynced, true];\n });\n\n if (loggedOut) {\n // Wait for currentUser observable to emit UNAUTHORIZED_USER\n await waitUntil(db.cloud.currentUser, (user) => user.userId === UNAUTHORIZED_USER.userId);\n // Then perform an initial sync\n await db.cloud.sync({purpose: 'pull', wait: true});\n }\n return numUnsynced;\n}\n","/** A way to log to console in production without terser stripping out\n * it from the release bundle.\n * This should be used very rarely and only in places where it's\n * absolutely necessary to log something in production.\n * \n * @param level \n * @param args \n */\nexport function prodLog(level: 'log' | 'warn' | 'error' | 'debug', ...args: any[]) {\n globalThis[\"con\"+\"sole\"][level](...args);\n}\n","import { DexieCloudDB } from '../db/DexieCloudDB';\nimport { LoginHints } from '../DexieCloudAPI';\nimport { triggerSync } from '../sync/triggerSync';\nimport { authenticate, loadAccessToken } from './authenticate';\nimport { AuthPersistedContext } from './AuthPersistedContext';\nimport { logout } from './logout';\nimport { otpFetchTokenCallback } from './otpFetchTokenCallback';\nimport { setCurrentUser } from './setCurrentUser';\nimport { UNAUTHORIZED_USER } from './UNAUTHORIZED_USER';\n\nexport async function login(\n db: DexieCloudDB,\n hints?: LoginHints\n) {\n const currentUser = await db.getCurrentUser();\n const origUserId = currentUser.userId;\n if (currentUser.isLoggedIn && (!hints || (!hints.email && !hints.userId))) {\n const licenseStatus = currentUser.license?.status || 'ok';\n if (\n licenseStatus === 'ok' &&\n currentUser.accessToken &&\n (!currentUser.accessTokenExpiration ||\n currentUser.accessTokenExpiration.getTime() > Date.now())\n ) {\n // Already authenticated according to given hints. And license is valid.\n return false;\n }\n if (\n currentUser.refreshToken &&\n (!currentUser.refreshTokenExpiration ||\n currentUser.refreshTokenExpiration.getTime() > Date.now())\n ) {\n // Refresh the token\n await loadAccessToken(db);\n return false;\n }\n // No refresh token - must re-authenticate:\n }\n const context = new AuthPersistedContext(db, {\n claims: {},\n lastLogin: new Date(0),\n });\n await authenticate(\n db.cloud.options!.databaseUrl,\n context,\n db.cloud.options!.fetchTokens || otpFetchTokenCallback(db),\n db.cloud.userInteraction,\n hints\n );\n if (\n origUserId !== UNAUTHORIZED_USER.userId &&\n context.userId !== origUserId\n ) {\n // User was logged in before, but now logged in as another user.\n await logout(db);\n }\n\n /*try {\n await context.save();\n } catch (e) {\n try {\n if (e.name === 'DataCloneError') {\n console.debug(`Login context property names:`, Object.keys(context));\n console.debug(`Login context:`, context);\n console.debug(`Login context JSON:`, JSON.stringify(context));\n }\n } catch {}\n throw e;\n }*/\n await setCurrentUser(db, context);\n // Make sure to resync as the new login will be authorized\n // for new realms.\n triggerSync(db, 'pull');\n return context.userId !== origUserId;\n}\n","import {\n DemoTokenRequest,\n OTPTokenRequest1,\n OTPTokenRequest2,\n TokenErrorResponse,\n TokenFinalResponse,\n TokenRequest,\n TokenResponse,\n} from 'dexie-cloud-common';\nimport { DexieCloudDB } from '../db/DexieCloudDB';\nimport { HttpError } from '../errors/HttpError';\nimport { FetchTokenCallback } from './authenticate';\nimport { alertUser, promptForEmail, promptForOTP } from './interactWithUser';\n\nexport function otpFetchTokenCallback(db: DexieCloudDB): FetchTokenCallback {\n const { userInteraction } = db.cloud;\n return async function otpAuthenticate({ public_key, hints }) {\n let tokenRequest: TokenRequest;\n const url = db.cloud.options?.databaseUrl;\n if (!url) throw new Error(`No database URL given.`);\n if (hints?.grant_type === 'demo') {\n const demo_user = await promptForEmail(\n userInteraction,\n 'Enter a demo user email',\n hints?.email || hints?.userId\n );\n tokenRequest = {\n demo_user,\n grant_type: 'demo',\n scopes: ['ACCESS_DB'],\n public_key\n } satisfies DemoTokenRequest;\n } else if (hints?.otpId && hints.otp) {\n // User provided OTP ID and OTP code. This means that the OTP email\n // has already gone out and the user may have clicked a magic link\n // in the email with otp and otpId in query and the app has picked\n // up those values and passed them to db.cloud.login().\n tokenRequest = {\n grant_type: 'otp',\n otp_id: hints.otpId,\n otp: hints.otp,\n scopes: ['ACCESS_DB'],\n public_key,\n } satisfies OTPTokenRequest2;\n } else {\n const email = await promptForEmail(\n userInteraction,\n 'Enter email address',\n hints?.email\n );\n if (/@demo.local$/.test(email)) {\n tokenRequest = {\n demo_user: email,\n grant_type: 'demo',\n scopes: ['ACCESS_DB'],\n public_key\n } satisfies DemoTokenRequest;\n } else {\n tokenRequest = {\n email,\n grant_type: 'otp',\n scopes: ['ACCESS_DB'],\n } satisfies OTPTokenRequest1;\n }\n }\n const res1 = await fetch(`${url}/token`, {\n body: JSON.stringify(tokenRequest),\n method: 'post',\n headers: { 'Content-Type': 'application/json', mode: 'cors' },\n });\n if (res1.status !== 200) {\n const errMsg = await res1.text();\n await alertUser(userInteraction, \"Token request failed\", {\n type: 'error',\n messageCode: 'GENERIC_ERROR',\n message: errMsg,\n messageParams: {}\n }).catch(()=>{});\n throw new HttpError(res1, errMsg);\n }\n const response: TokenResponse = await res1.json();\n if (response.type === 'tokens' || response.type === 'error') {\n // Demo user request can get a \"tokens\" response right away\n // Error can also be returned right away.\n return response;\n } else if (tokenRequest.grant_type === 'otp' && 'email' in tokenRequest) {\n if (response.type !== 'otp-sent')\n throw new Error(`Unexpected response from ${url}/token`);\n const otp = await promptForOTP(userInteraction, tokenRequest.email);\n const tokenRequest2 = {\n ...tokenRequest,\n otp: otp || '',\n otp_id: response.otp_id,\n public_key\n } satisfies OTPTokenRequest2;\n\n let res2 = await fetch(`${url}/token`, {\n body: JSON.stringify(tokenRequest2),\n method: 'post',\n headers: { 'Content-Type': 'application/json' },\n mode: 'cors',\n });\n while (res2.status === 401) {\n const errorText = await res2.text();\n tokenRequest2.otp = await promptForOTP(userInteraction, tokenRequest.email, {\n type: 'error',\n messageCode: 'INVALID_OTP',\n message: errorText,\n messageParams: {}\n });\n res2 = await fetch(`${url}/token`, {\n body: JSON.stringify(tokenRequest2),\n method: 'post',\n headers: { 'Content-Type': 'application/json' },\n mode: 'cors',\n });\n }\n if (res2.status !== 200) {\n const errMsg = await res2.text();\n throw new HttpError(res2, errMsg);\n }\n const response2: TokenFinalResponse | TokenErrorResponse = await res2.json();\n return response2;\n } else {\n throw new Error(`Unexpected response from ${url}/token`);\n }\n };\n}\n","import { DexieCloudDB } from '../db/DexieCloudDB';\nimport { prodLog } from '../prodLog';\nimport { AuthPersistedContext } from './AuthPersistedContext';\nimport { waitUntil } from './waitUntil';\n\n/** This function changes or sets the current user as requested.\n *\n * Use cases:\n * * Initially on db.ready after reading the current user from db.$logins.\n * This will make sure that any unsynced operations from the previous user is synced before\n * changing the user.\n * * Upon user request\n *\n * @param db\n * @param newUser\n */\nexport async function setCurrentUser(\n db: DexieCloudDB,\n user: AuthPersistedContext\n) {\n const $logins = db.table('$logins');\n await db.transaction('rw', $logins, async (tx) => {\n const existingLogins = await $logins.toArray();\n await Promise.all(\n existingLogins\n .filter((login) => login.userId !== user.userId && login.isLoggedIn)\n .map((login) => {\n login.isLoggedIn = false;\n return $logins.put(login);\n })\n );\n user.isLoggedIn = true;\n user.lastLogin = new Date();\n try {\n await user.save();\n } catch (e) {\n try {\n if (e.name === 'DataCloneError') {\n // We've seen this buggy behavior in some browsers and in case it happens\n // again we really need to collect the details to understand what's going on.\n prodLog('debug', `Login context property names:`, Object.keys(user));\n prodLog('debug', `Login context property names:`, Object.keys(user));\n prodLog('debug', `Login context:`, user);\n prodLog('debug', `Login context JSON:`, JSON.stringify(user));\n }\n } catch {}\n throw e;\n }\n console.debug('Saved new user', user.email);\n });\n await waitUntil(\n db.cloud.currentUser,\n (currentUser) => currentUser.userId === user.userId\n );\n}\n","// @ts-ignore\nexport const isFirefox = typeof InstallTrigger !== 'undefined';\n","export const isSafari =\n typeof navigator !== 'undefined' &&\n /Safari\\//.test(navigator.userAgent) &&\n !/Chrom(e|ium)\\/|Edge\\//.test(navigator.userAgent);\n\nexport const safariVersion = isSafari\n ? // @ts-ignore\n [].concat(navigator.userAgent.match(/Safari\\/(\\d*)/))[1]\n : NaN;\n","import { isFirefox } from './isFirefox';\nimport { isSafari, safariVersion } from './isSafari';\n\n// What we know: Safari 14.1 (version 605) crashes when using dexie-cloud's service worker.\n// We don't know what exact call is causing this. Have tried safari-14-idb-fix with no luck.\n// Something we do in the service worker is triggering the crash.\n// When next Safari version (606) is out we will start enabling SW again, hoping that the bug is solved.\n// If not, we might increment 605 to 606.\nexport const DISABLE_SERVICEWORKER_STRATEGY =\n (isSafari && safariVersion <= 605) || // Disable for Safari for now.\n isFirefox; // Disable for Firefox for now. Seems to have a bug in reading CryptoKeys from IDB from service workers\n","export const IS_SERVICE_WORKER =\n typeof self !== \"undefined\" && \"clients\" in self && !self.document;\n","import {\n DBCoreAddRequest,\n DBCoreDeleteRequest,\n DBCoreIndex, DBCorePutRequest\n} from 'dexie';\nimport { b64LexEncode } from 'dreambase-library/dist/common/b64lex';\n\nconst { toString } = {};\nexport function toStringTag(o: Object) {\n return toString.call(o).slice(8, -1);\n}\n\nexport function getEffectiveKeys(\n primaryKey: DBCoreIndex,\n req: (Pick<DBCoreAddRequest | DBCorePutRequest, 'type' | 'values'> & {\n keys?: any[];\n }) |\n Pick<DBCoreDeleteRequest, 'keys' | 'type'>\n) {\n if (req.type === 'delete')\n return req.keys;\n return req.keys?.slice() || req.values.map(primaryKey.extractKey!);\n}\nfunction applyToUpperBitFix(orig: string, bits: number) {\n return (\n (bits & 1 ? orig[0].toUpperCase() : orig[0].toLowerCase()) +\n (bits & 2 ? orig[1].toUpperCase() : orig[1].toLowerCase()) +\n (bits & 4 ? orig[2].toUpperCase() : orig[2].toLowerCase())\n );\n}\nconst consonants = /b|c|d|f|g|h|j|k|l|m|n|p|q|r|s|t|v|x|y|z/i;\nfunction isUpperCase(ch: string) {\n return ch >= 'A' && ch <= 'Z';\n}\n\nexport function generateTablePrefix(\n tableName: string,\n allPrefixes: Set<string>\n) {\n let rv = tableName[0].toLocaleLowerCase(); // \"users\" = \"usr\", \"friends\" = \"frn\", \"realms\" = \"rlm\", etc.\n for (let i = 1, l = tableName.length; i < l && rv.length < 3; ++i) {\n if (consonants.test(tableName[i]) || isUpperCase(tableName[i]))\n rv += tableName[i].toLowerCase();\n }\n while (allPrefixes.has(rv)) {\n if (/\\d/g.test(rv)) {\n rv = rv.substr(0, rv.length - 1) + (rv[rv.length - 1] + 1);\n if (rv.length > 3)\n rv = rv.substr(0, 3);\n else\n continue;\n } else if (rv.length < 3) {\n rv = rv + '2';\n continue;\n }\n let bitFix = 1;\n let upperFixed = rv;\n while (allPrefixes.has(upperFixed) && bitFix < 8) {\n upperFixed = applyToUpperBitFix(rv, bitFix);\n ++bitFix;\n }\n if (bitFix < 8)\n rv = upperFixed;\n else {\n let nextChar = (rv.charCodeAt(2) + 1) & 127;\n rv = rv.substr(0, 2) + String.fromCharCode(nextChar);\n // Here, in theory we could get an infinite loop if having 127*8 table names with identical 3 first consonants.\n }\n }\n return rv;\n}\nlet time = 0;\n/**\n *\n * @param prefix A unique 3-letter short-name of the table.\n * @param shardKey 3 last letters from another ID if colocation is requested. Verified on server on inserts - guarantees unique IDs across shards.\n * The shardKey part of the key represent the shardId where it was first created. An object with this\n * primary key can later on be moved to another shard without being altered. The reason for having\n * the origin shardKey as part of the key, is that the server will not need to check uniqueness constraint\n * across all shards on every insert. Updates / moves across shards are already controlled by the server\n * in the sense that the objects needs to be there already - we only need this part for inserts.\n * @returns\n */\nexport function generateKey(prefix: string, shardKey?: string) {\n const a = new Uint8Array(18);\n const timePart = new Uint8Array(a.buffer, 0, 6);\n const now = Date.now(); // Will fit into 6 bytes until year 10 895.\n if (time >= now) {\n // User is bulk-creating objects the same millisecond.\n // Increment the time part by one millisecond for each item.\n // If bulk-creating 1,000,000 rows client-side in 10 seconds,\n // the last time-stamp will be 990 seconds in future, which is no biggie at all.\n // The point is to create a nice order of the generated IDs instead of\n // using random ids.\n ++time;\n } else {\n time = now;\n }\n timePart[0] = time / 1099511627776; // Normal division (no bitwise operator) --> works with >= 32 bits.\n timePart[1] = time / 4294967296;\n timePart[2] = time / 16777216;\n timePart[3] = time / 65536;\n timePart[4] = time / 256;\n timePart[5] = time;\n const randomPart = new Uint8Array(a.buffer, 6);\n crypto.getRandomValues(randomPart);\n const id = new Uint8Array(a.buffer);\n return prefix + b64LexEncode(id) + (shardKey || '');\n}\n","import Dexie, {\n DBCore,\n DBCoreAddRequest,\n DBCoreMutateRequest,\n DBCorePutRequest,\n DBCoreTransaction,\n Middleware,\n} from 'dexie';\nimport { isValidSyncableID } from 'dexie-cloud-common';\nimport { DexieCloudDB } from '../db/DexieCloudDB';\nimport {\n getEffectiveKeys,\n generateKey,\n toStringTag,\n} from '../middleware-helpers/idGenerationHelpers';\nimport { TXExpandos } from '../types/TXExpandos';\n\nexport function createIdGenerationMiddleware(\n db: DexieCloudDB\n): Middleware<DBCore> {\n return {\n stack: 'dbcore',\n name: 'idGenerationMiddleware',\n level: 1,\n create: (core) => {\n return {\n ...core,\n table: (tableName) => {\n const table = core.table(tableName);\n\n function generateOrVerifyAtKeys(\n req: DBCoreAddRequest | DBCorePutRequest,\n idPrefix: string\n ) {\n let valueClones: null | object[] = null;\n const keys = getEffectiveKeys(table.schema.primaryKey, req);\n keys.forEach((key, idx) => {\n if (key === undefined) {\n // Generate the key\n const colocatedId =\n req.values[idx].realmId || db.cloud.currentUserId;\n const shardKey = colocatedId.substr(colocatedId.length - 3);\n keys[idx] = generateKey(idPrefix, shardKey);\n if (!table.schema.primaryKey.outbound) {\n if (!valueClones) valueClones = req.values.slice();\n valueClones[idx] = Dexie.deepClone(valueClones[idx]);\n Dexie.setByKeyPath(\n valueClones[idx],\n table.schema.primaryKey.keyPath!,\n keys[idx]\n );\n }\n } else if (\n typeof key !== 'string' ||\n (!key.startsWith(idPrefix) && !key.startsWith('#' + idPrefix))\n ) {\n // Key was specified by caller. Verify it complies with id prefix.\n throw new Dexie.ConstraintError(\n `The ID \"${key}\" is not valid for table \"${tableName}\". ` +\n `Primary '@' keys requires the key to be prefixed with \"${idPrefix}\" (or \"#${idPrefix}).\\n` +\n `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.`\n );\n }\n });\n return table.mutate({\n ...req,\n keys,\n values: valueClones || req.values,\n });\n }\n\n return {\n ...table,\n mutate: (req) => {\n const idbtrans = req.trans as DBCoreTransaction & IDBTransaction & TXExpandos;\n if (idbtrans.mode === 'versionchange') {\n // Tell all the other middlewares to skip bothering. We're in versionchange mode.\n // dexie-cloud is not initialized yet.\n idbtrans.disableChangeTracking = true;\n idbtrans.disableAccessControl = true;\n }\n if (idbtrans.disableChangeTracking) {\n // Disable ID policy checks and ID generation\n return table.mutate(req);\n }\n if (req.type === 'add' || req.type === 'put') {\n const cloudTableSchema = db.cloud.schema?.[tableName];\n if (!cloudTableSchema?.generatedGlobalId) {\n if (cloudTableSchema?.markedForSync) {\n // Just make sure primary key is of a supported type:\n const keys = getEffectiveKeys(table.schema.primaryKey, req);\n keys.forEach((key, idx) => {\n if (!isValidSyncableID(key)) {\n const type = Array.isArray(key)\n ? key.map(toStringTag).join(',')\n : toStringTag(key);\n throw new Dexie.ConstraintError(\n `Invalid primary key type ${type} for table ${tableName}. Tables marked for sync has primary keys of type string or Array of string (and optional numbers)`\n );\n }\n });\n }\n } else {\n if (db.cloud.options?.databaseUrl && !db.initiallySynced) {\n // A database URL is configured but no initial sync has been performed.\n const keys = getEffectiveKeys(table.schema.primaryKey, req);\n // Check if the operation would yield any INSERT. If so, complain! We never want wrong ID prefixes stored.\n return table\n .getMany({ keys, trans: req.trans, cache: 'immutable' })\n .then((results) => {\n if (results.length < keys.length) {\n // At least one of the given objects would be created. Complain since\n // the generated ID would be based on a locally computed ID prefix only - we wouldn't\n // know if the server would give the same ID prefix until an initial sync has been\n // performed.\n throw new Error(\n `Unable to create new objects without an initial sync having been performed.`\n );\n }\n return table.mutate(req);\n });\n }\n return generateOrVerifyAtKeys(\n req,\n cloudTableSchema.idPrefix!\n );\n }\n }\n return table.mutate(req);\n },\n };\n },\n };\n },\n };\n}\n","import { DBCoreTable, DBCoreTransaction } from \"dexie\";\nimport { allSettled } from \"../helpers/allSettled\";\n\nlet counter = 0;\n\nexport function guardedTable(table: DBCoreTable) {\n const prop = \"$lock\"+ (++counter);\n return {\n ...table,\n count: readLock(table.count, prop),\n get: readLock(table.get, prop),\n getMany: readLock(table.getMany, prop),\n openCursor: readLock(table.openCursor, prop),\n query: readLock(table.query, prop),\n mutate: writeLock(table.mutate, prop),\n };\n}\n\nfunction readLock<TReq extends { trans: DBCoreTransaction }, TRes>(\n fn: (req: TReq) => Promise<TRes>,\n prop: string\n): (req: TReq) => Promise<TRes> {\n return function readLocker(req): Promise<TRes> {\n const {\n readers,\n writers,\n }: { writers: Promise<any>[]; readers: Promise<any>[] } =\n req.trans[prop] || (req.trans[prop] = { writers: [], readers: [] });\n const numWriters = writers.length;\n const promise = (numWriters > 0\n ? writers[numWriters - 1].then(() => fn(req), () => fn(req))\n : fn(req)\n ).finally(() => {readers.splice(readers.indexOf(promise))});\n readers.push(promise);\n return promise;\n };\n}\n\nfunction writeLock<TReq extends { trans: DBCoreTransaction }, TRes>(\n fn: (req: TReq) => Promise<TRes>,\n prop: string\n): (req: TReq) => Promise<TRes> {\n return function writeLocker(req): Promise<TRes> {\n const {\n readers,\n writers,\n }: { writers: Promise<any>[]; readers: Promise<any>[] } =\n req.trans[prop] || (req.trans[prop] = { writers: [], readers: [] });\n let promise = (writers.length > 0\n ? writers[writers.length - 1].then(() => fn(req), () => fn(req))\n : readers.length > 0\n ? allSettled(readers).then(() => fn(req))\n : fn(req)\n ).finally(() => {writers.shift();});\n writers.push(promise);\n return promise;\n };\n}\n","\nexport function allSettled(possiblePromises: any[]) {\n return new Promise(resolve => {\n if (possiblePromises.length === 0) resolve([]);\n let remaining = possiblePromises.length;\n const results = new Array(remaining);\n possiblePromises.forEach((p, i) => Promise.resolve(p).then(\n value => results[i] = {status: \"fulfilled\", value},\n reason => results[i] = {status: \"rejected\", reason})\n .then(()=>--remaining || resolve(results)));\n });\n}\n","import { DBCoreTransaction } from 'dexie';\nimport { BehaviorSubject } from 'rxjs';\nimport { TXExpandos } from '../types/TXExpandos';\n\nexport const outstandingTransactions = new BehaviorSubject<Set<DBCoreTransaction & IDBTransaction & TXExpandos>>(new Set());\n","import { DexieCloudDB } from './db/DexieCloudDB';\n\nexport function isEagerSyncDisabled(db: DexieCloudDB) {\n return (\n db.cloud.options?.disableEagerSync ||\n db.cloud.currentUser.value?.license?.status !== 'ok' ||\n !db.cloud.options?.databaseUrl\n );\n}\n","import {\n DBCore,\n DBCoreAddRequest,\n DBCoreDeleteRequest,\n DBCoreMutateResponse,\n DBCorePutRequest,\n DBCoreTable,\n DBCoreTransaction,\n Middleware,\n RangeSet,\n} from 'dexie';\nimport { DBOperation, DBUpdateOperation } from 'dexie-cloud-common';\nimport { BehaviorSubject } from 'rxjs';\nimport { DexieCloudDB } from '../db/DexieCloudDB';\nimport { UserLogin } from '../db/entities/UserLogin';\nimport { getMutationTable } from '../helpers/getMutationTable';\nimport { randomString } from '../helpers/randomString';\nimport { throwVersionIncrementNeeded } from '../helpers/throwVersionIncrementNeeded';\nimport { guardedTable } from '../middleware-helpers/guardedTable';\nimport { registerSyncEvent } from '../sync/registerSyncEvent';\nimport { TXExpandos } from '../types/TXExpandos';\nimport { outstandingTransactions } from './outstandingTransaction';\nimport { isEagerSyncDisabled } from '../isEagerSyncDisabled';\nimport { triggerSync } from '../sync/triggerSync';\n\nexport interface MutationTrackingMiddlewareArgs {\n currentUserObservable: BehaviorSubject<UserLogin>;\n db: DexieCloudDB;\n}\n\n/** Tracks all mutations in the same transaction as the mutations -\n * so it is guaranteed that no mutation goes untracked - and if transaction\n * aborts, the mutations won't be tracked.\n *\n * The sync job will use the tracked mutations as the source of truth when pushing\n * changes to server and cleanup the tracked mutations once the server has\n * ackowledged that it got them.\n */\nexport function createMutationTrackingMiddleware({\n currentUserObservable,\n db,\n}: MutationTrackingMiddlewareArgs): Middleware<DBCore> {\n return {\n stack: 'dbcore',\n name: 'MutationTrackingMiddleware',\n level: 1,\n create: (core) => {\n const allTableNames = new Set(core.schema.tables.map((t) => t.name));\n const ordinaryTables = core.schema.tables.filter(\n (t) => !/^\\$/.test(t.name)\n );\n const mutTableMap = new Map<string, DBCoreTable>();\n for (const tbl of ordinaryTables) {\n const mutationTableName = `$${tbl.name}_mutations`;\n if (allTableNames.has(mutationTableName)) {\n mutTableMap.set(tbl.name, core.table(mutationTableName));\n }\n }\n\n return {\n ...core,\n transaction: (tables, mode) => {\n let tx: DBCoreTransaction & IDBTransaction & TXExpandos;\n if (mode === 'readwrite') {\n const mutationTables = tables\n .filter((tbl) => db.cloud.schema?.[tbl]?.markedForSync)\n .map((tbl) => getMutationTable(tbl));\n tx = core.transaction(\n [...tables, ...mutationTables],\n mode\n ) as DBCoreTransaction & IDBTransaction & TXExpandos;\n } else {\n tx = core.transaction(tables, mode) as DBCoreTransaction &\n IDBTransaction &\n TXExpandos;\n }\n\n if (mode === 'readwrite') {\n // Give each transaction a globally unique id.\n tx.txid = randomString(16);\n tx.opCount = 0;\n // Introduce the concept of current user that lasts through the entire transaction.\n // This is important because the tracked mutations must be connected to the user.\n tx.currentUser = currentUserObservable.value;\n outstandingTransactions.value.add(tx);\n outstandingTransactions.next(outstandingTransactions.value);\n const removeTransaction = () => {\n tx.removeEventListener('complete', txComplete);\n tx.removeEventListener('error', removeTransaction);\n tx.removeEventListener('abort', removeTransaction);\n outstandingTransactions.value.delete(tx);\n outstandingTransactions.next(outstandingTransactions.value);\n };\n const txComplete = () => {\n if (tx.mutationsAdded && !isEagerSyncDisabled(db)) {\n triggerSync(db, 'push');\n }\n removeTransaction();\n };\n tx.addEventListener('complete', txComplete);\n tx.addEventListener('error', removeTransaction);\n tx.addEventListener('abort', removeTransaction);\n }\n return tx;\n },\n table: (tableName) => {\n const table = core.table(tableName);\n if (/^\\$/.test(tableName)) {\n if (tableName.endsWith('_mutations')) {\n // In case application code adds items to ..._mutations tables,\n // make sure to set the mutationsAdded flag on transaction.\n // This is also done in mutateAndLog() as that function talks to a\n // lower level DBCore and wouldn't be catched by this code.\n return {\n ...table,\n mutate: (req) => {\n if (req.type === 'add' || req.type === 'put') {\n (\n req.trans as DBCoreTransaction & TXExpandos\n ).mutationsAdded = true;\n }\n return table.mutate(req);\n },\n };\n } else if (tableName === '$logins') {\n return {\n ...table,\n mutate: (req) => {\n //console.debug('Mutating $logins table', req);\n return table\n .mutate(req)\n .then((res) => {\n //console.debug('Mutating $logins');\n (\n req.trans as DBCoreTransaction & TXExpandos\n ).mutationsAdded = true;\n //console.debug('$logins mutated');\n return res;\n })\n .catch((err) => {\n console.debug('Failed mutation $logins', err);\n return Promise.reject(err);\n });\n },\n };\n } else {\n return table;\n }\n }\n const { schema } = table;\n const mutsTable = mutTableMap.get(tableName)!;\n if (!mutsTable) {\n // We cannot track mutations on this table because there is no mutations table for it.\n // This might happen in upgraders that executes before cloud schema is applied.\n return table; \n }\n return guardedTable({\n ...table,\n mutate: (req) => {\n const trans = req.trans as DBCoreTransaction & TXExpandos;\n if (!trans.txid) return table.mutate(req); // Upgrade transactions not guarded by us.\n if (trans.disableChangeTracking) return table.mutate(req);\n if (!db.cloud.schema?.[tableName]?.markedForSync)\n return table.mutate(req);\n if (!trans.currentUser?.isLoggedIn) {\n // Unauthorized user should not log mutations.\n // Instead, after login all local data should be logged at once.\n return table.mutate(req);\n }\n\n return req.type === 'deleteRange'\n ? table\n // Query the actual keys (needed for server sending correct rollback to us)\n .query({\n query: { range: req.range, index: schema.primaryKey },\n trans: req.trans,\n values: false,\n })\n // Do a delete request instead, but keep the criteria info for the server to execute\n .then((res) => {\n return mutateAndLog({\n type: 'delete',\n keys: res.result,\n trans: req.trans,\n criteria: { index: null, range: req.range },\n });\n })\n : mutateAndLog(req);\n },\n });\n\n function mutateAndLog(\n req: DBCoreDeleteRequest | DBCoreAddRequest | DBCorePutRequest\n ): Promise<DBCoreMutateResponse> {\n const trans = req.trans as DBCoreTransaction & TXExpandos;\n const unsyncedProps =\n db.cloud.options?.unsyncedProperties?.[tableName];\n const {\n txid,\n currentUser: { userId },\n } = trans;\n const { type } = req;\n const opNo = ++trans.opCount;\n\n function stripChangeSpec(changeSpec: { [keyPath: string]: any }) {\n if (!unsyncedProps) return changeSpec;\n let rv = changeSpec;\n for (const keyPath of Object.keys(changeSpec)) {\n if (\n unsyncedProps.some(\n (p) => keyPath === p || keyPath.startsWith(p + '.')\n )\n ) {\n if (rv === changeSpec) rv = { ...changeSpec }; // clone on demand\n delete rv[keyPath];\n }\n }\n return rv;\n }\n\n return table.mutate(req).then((res) => {\n const { numFailures: hasFailures, failures } = res;\n let keys = type === 'delete' ? req.keys! : res.results!;\n let values = 'values' in req ? req.values : [];\n let changeSpec = 'changeSpec' in req ? req.changeSpec : undefined;\n let updates = 'updates' in req ? req.updates : undefined;\n\n if (hasFailures) {\n keys = keys.filter((_, idx) => !failures[idx]);\n values = values.filter((_, idx) => !failures[idx]);\n }\n if (unsyncedProps) {\n // Filter out unsynced properties\n values = values.map((value) => {\n const newValue = { ...value };\n for (const prop of unsyncedProps) {\n delete newValue[prop];\n }\n return newValue;\n });\n if (changeSpec) {\n // modify operation with criteria and changeSpec.\n // We must strip out unsynced properties from changeSpec.\n // We deal with criteria later.\n changeSpec = stripChangeSpec(changeSpec);\n if (Object.keys(changeSpec).length === 0) {\n // Nothing to change on server\n return res;\n }\n }\n if (updates) {\n let strippedChangeSpecs =\n updates.changeSpecs.map(stripChangeSpec);\n let newUpdates: DBCorePutRequest['updates'] = {\n keys: [],\n changeSpecs: [],\n };\n const validKeys = new RangeSet();\n let anyChangeSpecBecameEmpty = false;\n for (let i = 0, l = strippedChangeSpecs.length; i < l; ++i) {\n if (Object.keys(strippedChangeSpecs[i]).length > 0) {\n newUpdates.keys.push(updates.keys[i]);\n newUpdates.changeSpecs.push(strippedChangeSpecs[i]);\n validKeys.addKey(updates.keys[i]);\n } else {\n anyChangeSpecBecameEmpty = true;\n }\n }\n updates = newUpdates;\n if (anyChangeSpecBecameEmpty) {\n // Some keys were stripped. We must also strip them from keys and values\n let newKeys: any[] = [];\n let newValues: any[] = [];\n for (let i = 0, l = keys.length; i < l; ++i) {\n if (validKeys.hasKey(keys[i])) {\n newKeys.push(keys[i]);\n newValues.push(values[i]);\n }\n }\n keys = newKeys;\n values = newValues;\n }\n }\n }\n const ts = Date.now();\n // Canonicalize req.criteria.index to null if it's on the primary key.\n let criteria =\n 'criteria' in req && req.criteria\n ? {\n ...req.criteria,\n index:\n req.criteria.index === schema.primaryKey.keyPath // Use null to inform server that criteria is on primary key\n ? null // This will disable the server from trying to log consistent operations where it shouldnt.\n : req.criteria.index,\n }\n : undefined;\n if (unsyncedProps && criteria?.index) {\n const keyPaths = schema.indexes.find(\n (idx) => idx.name === criteria!.index\n )?.keyPath;\n const involvedProps = keyPaths\n ? typeof keyPaths === 'string'\n ? [keyPaths]\n : keyPaths\n : [];\n if (involvedProps.some((p) => unsyncedProps?.includes(p))) {\n // Don't log criteria on unsynced properties as the server could not test them.\n criteria = undefined;\n }\n }\n\n const mut: DBOperation =\n req.type === 'delete'\n ? {\n type: 'delete',\n ts,\n opNo,\n keys,\n criteria,\n txid,\n userId,\n }\n : req.type === 'add'\n ? {\n type: 'insert',\n ts,\n opNo,\n keys,\n txid,\n userId,\n values,\n }\n : criteria && changeSpec\n ? {\n // Common changeSpec for all keys\n type: 'modify',\n ts,\n opNo,\n keys,\n criteria,\n changeSpec,\n txid,\n userId,\n }\n : changeSpec\n ? {\n // In case criteria involved an unsynced property, we go for keys instead.\n type: 'update',\n ts,\n opNo,\n keys,\n changeSpecs: keys.map(() => changeSpec!),\n txid,\n userId,\n }\n : updates\n ? {\n // One changeSpec per key\n type: 'update',\n ts,\n opNo,\n keys: updates.keys,\n changeSpecs: updates.changeSpecs,\n txid,\n userId,\n }\n : {\n type: 'upsert',\n ts,\n opNo,\n keys,\n values,\n txid,\n userId,\n };\n\n if ('isAdditionalChunk' in req && req.isAdditionalChunk) {\n mut.isAdditionalChunk = true;\n }\n return keys.length > 0 || criteria\n ? mutsTable\n .mutate({ type: 'add', trans, values: [mut] }) // Log entry\n .then(() => {\n trans.mutationsAdded = true; // Mark transaction as having added mutations to trigger eager sync\n return res; // Return original response\n })\n : res;\n });\n }\n },\n };\n },\n };\n}\n","import Dexie, { DbSchema } from 'dexie';\nimport { DEXIE_CLOUD_SCHEMA } from './db/DexieCloudDB';\nimport { generateTablePrefix } from './middleware-helpers/idGenerationHelpers';\n\nexport function overrideParseStoresSpec(origFunc: Function, dexie: Dexie) {\n return function(stores: {[tableName: string]: string}, dbSchema: DbSchema) {\n const storesClone = {\n ...DEXIE_CLOUD_SCHEMA,\n ...stores,\n };\n // Merge indexes of DEXIE_CLOUD_SCHEMA with stores\n Object.keys(DEXIE_CLOUD_SCHEMA).forEach((tableName: keyof typeof DEXIE_CLOUD_SCHEMA) => {\n const schemaSrc = storesClone[tableName];\n // Verify that they don't try to delete a table that is needed for access control of Dexie Cloud\n if (schemaSrc == null) {\n // They try to delete one of the built-in schema tables.\n throw new Error(`Cannot delete table ${tableName} as it is needed for access control of Dexie Cloud`);\n }\n // If not trying to override a built-in table, then we can skip this and continue to next table.\n if (!stores[tableName]) {\n // They haven't tried to declare this table. No need to merge indexes.\n return; // Continue\n }\n\n // They have declared this table. Merge indexes in case they didn't declare all indexes we need.\n const requestedIndexes = schemaSrc.split(',').map(spec => spec.trim());\n const builtInIndexes = DEXIE_CLOUD_SCHEMA[tableName].split(',').map(spec => spec.trim());\n const requestedIndexSet = new Set(requestedIndexes.map(index => index.replace(/([&*]|\\+\\+)/g, \"\")));\n // Verify that primary key is unchanged\n if (requestedIndexes[0] !== builtInIndexes[0]) {\n // Primary key must match exactly\n throw new Error(`Cannot override primary key of table ${tableName}. Please declare it as {${\n tableName}: ${\n JSON.stringify(DEXIE_CLOUD_SCHEMA[tableName])\n }`);\n }\n // Merge indexes\n for (let i=1; i<builtInIndexes.length; ++i) {\n const builtInIndex = builtInIndexes[i];\n if (!requestedIndexSet.has(builtInIndex.replace(/([&*]|\\+\\+)/g, \"\"))) {\n // Add built-in index if not already requested\n storesClone[tableName] += `,${builtInIndex}`;\n }\n }\n });\n\n // Populate dexie.cloud.schema\n const cloudSchema = dexie.cloud.schema || (dexie.cloud.schema = {});\n const allPrefixes = new Set<string>();\n Object.keys(storesClone).forEach(tableName => {\n const schemaSrc = storesClone[tableName];\n const cloudTableSchema = cloudSchema[tableName] || (cloudSchema[tableName] = {});\n if (schemaSrc != null) {\n if (/^\\@/.test(schemaSrc)) {\n storesClone[tableName] = storesClone[tableName].substr(1);\n cloudTableSchema.generatedGlobalId = true;\n cloudTableSchema.idPrefix = generateTablePrefix(tableName, allPrefixes);\n allPrefixes.add(cloudTableSchema.idPrefix);\n }\n if (!/^\\$/.test(tableName)) {\n storesClone[`$${tableName}_mutations`] = '++rev';\n cloudTableSchema.markedForSync = true;\n }\n if (cloudTableSchema.deleted) {\n cloudTableSchema.deleted = false;\n }\n } else {\n cloudTableSchema.deleted = true;\n cloudTableSchema.markedForSync = false;\n storesClone[`$${tableName}_mutations`] = null;\n }\n });\n const rv = origFunc.call(this, storesClone, dbSchema);\n for (const [tableName, spec] of Object.entries(dbSchema)) {\n if (spec.yProps?.length) {\n const cloudTableSchema = cloudSchema[tableName];\n if (cloudTableSchema) {\n cloudTableSchema.yProps = spec.yProps.map((yProp) => yProp.prop);\n }\n }\n }\n return rv;\n }\n}\n","import { DexieCloudDB } from \"../db/DexieCloudDB\";\n\nexport function performGuardedJob<T>(\n db: DexieCloudDB,\n jobName: string,\n job: () => Promise<T>\n): Promise<T> {\n if (typeof navigator === 'undefined' || !navigator.locks) {\n // No support for guarding jobs. IE11, node.js, etc.\n return job();\n }\n return navigator.locks.request(db.name + '|' + jobName, () => job());\n}\n","import { BehaviorSubject, fromEvent, merge, of } from 'rxjs';\nimport {\n debounceTime,\n delay,\n distinctUntilChanged,\n filter,\n map,\n skip,\n startWith,\n switchMap,\n tap,\n} from 'rxjs/operators';\n\nconst USER_INACTIVITY_TIMEOUT = 180_000; // 3 minutes\nconst ACTIVE_WAIT_TIME = 0; // For now, it's nicer to react instantly on user activity\nconst INACTIVE_WAIT_TIME = 20_000;\n\n// This observable will be emitted to later down....\nexport const userIsActive = new BehaviorSubject<boolean>(true);\n\n// A refined version that waits before changing state:\n// * Wait another INACTIVE_WAIT_TIME before accepting that the user is inactive.\n// Reason 1: Spare resources - no need to setup the entire websocket flow when\n// switching tabs back and forth.\n// Reason 2: Less flickering for the end user when switching tabs back and forth.\n// * Wait another ACTIVE_WAIT_TIME before accepting that the user is active.\n// Possible reason to have a value here: Sparing resources if users often temporary click the tab\n// for just a short time.\nexport const userIsReallyActive = new BehaviorSubject<boolean>(true);\nuserIsActive\n .pipe(\n switchMap((isActive) => {\n //console.debug('SyncStatus: DUBB: isActive changed to', isActive);\n return isActive\n ? ACTIVE_WAIT_TIME\n ? of(true).pipe(delay(ACTIVE_WAIT_TIME))\n : of(true)\n : INACTIVE_WAIT_TIME\n ? of(false).pipe(delay(INACTIVE_WAIT_TIME))\n : of(false);}\n ),\n distinctUntilChanged()\n )\n .subscribe(userIsReallyActive);\n\n//\n// First create some corner-stone observables to build the flow on\n//\n\n// document.onvisibilitychange:\nexport const visibilityStateIsChanged =\n typeof document !== 'undefined'\n ? fromEvent(document, 'visibilitychange')\n : of({});\n\n// document.onvisibilitychange makes document hidden:\nexport const documentBecomesHidden = visibilityStateIsChanged.pipe(\n filter(() => document.visibilityState === 'hidden')\n);\n\n// document.onvisibilitychange makes document visible\nexport const documentBecomesVisible = visibilityStateIsChanged.pipe(\n filter(() => document.visibilityState === 'visible')\n);\n\n// Any of various user-activity-related events happen:\nexport const userDoesSomething =\n typeof window !== 'undefined'\n ? merge(\n documentBecomesVisible,\n fromEvent(window, 'mousedown'),\n fromEvent(window, 'mousemove'),\n fromEvent(window, 'keydown'),\n fromEvent(window, 'wheel'),\n fromEvent(window, 'touchmove')\n )\n : of({});\n\nif (typeof document !== 'undefined') {\n //\n // Now, create a final observable and start subscribing to it in order\n // to make it emit values to userIsActive BehaviourSubject (which is the\n // most important global hot observable we have here)\n //\n // Live test: https://jsitor.com/LboCDHgbn\n //\n merge(\n of(true), // Make sure something is always emitted from start\n documentBecomesHidden, // so that we can eagerly emit false!\n userDoesSomething\n )\n .pipe(\n // No matter event source, compute whether user is visible using visibilityState:\n map(() => document.visibilityState === 'visible'),\n // Make sure to emit it\n tap((isActive) => {\n if (userIsActive.value !== isActive) {\n // Emit new value unless it already has that value\n userIsActive.next(isActive);\n }\n }),\n // Now, if true was emitted, make sure to set a timeout to emit false\n // unless new user activity things happen (in that case, the timeout will be cancelled!)\n switchMap((isActive) =>\n isActive\n ? of(0).pipe(\n delay(USER_INACTIVITY_TIMEOUT - INACTIVE_WAIT_TIME),\n tap(() => userIsActive.next(false))\n )\n : of(0)\n )\n )\n .subscribe(() => {}); // Unless we subscribe nothing will be propagated to userIsActive observable\n}\n","export class TokenExpiredError extends Error {\n name = \"TokenExpiredError\";\n}\n","import Dexie from \"dexie\";\nimport { type DexieCloudDB } from \"../db/DexieCloudDB\";\n\nexport function getAwarenessLibrary(db: DexieCloudDB): typeof import ('y-protocols/awareness') {\n if (!db.cloud.options?.awarenessProtocol) {\n throw new Dexie.MissingAPIError('awarenessProtocol was not provided to db.cloud.configure(). Please import * as awarenessProtocol from \"y-protocols/awareness\".');\n }\n return db.cloud.options?.awarenessProtocol;\n}\n\nexport const awarenessWeakMap = new WeakMap<any, import('y-protocols/awareness').Awareness>();\n\nexport const getDocAwareness = (doc: any) => awarenessWeakMap.get(doc);\n\n\n","import { Subject } from \"rxjs\";\nimport { Doc as YjsDoc } from \"yjs\";\n\nconst wm = new WeakMap<YjsDoc, Subject<void>>();\n\n/** A property (package-private) on Y.Doc that is used\n * to signal that the server wants us to send a 'doc-open' message\n * to the server for this document.\n * \n * @param doc \n * @returns \n */\nexport function getOpenDocSignal(doc: YjsDoc) {\n let signal = wm.get(doc);\n if (!signal) {\n signal = new Subject<void>();\n wm.set(doc, signal);\n }\n return signal;\n}","import { DBOperationsSet } from 'dexie-cloud-common';\nimport { BehaviorSubject, Observable, Subscriber, Subscription, tap } from 'rxjs';\nimport { TokenExpiredError } from './authentication/TokenExpiredError';\nimport { DXCWebSocketStatus } from './DXCWebSocketStatus';\nimport { TSON } from './TSON';\nimport type { YClientMessage, YServerMessage } from 'dexie-cloud-common';\nimport { DexieCloudDB } from './db/DexieCloudDB';\nimport { createYClientUpdateObservable } from './yjs/createYClientUpdateObservable';\nimport { applyYServerMessages } from './yjs/applyYMessages';\nimport { Table } from 'dexie';\nimport { getAwarenessLibrary, getDocAwareness } from './yjs/awareness';\nimport { encodeYMessage, decodeYMessage } from 'dexie-cloud-common';\nimport { UserLogin } from './dexie-cloud-client';\nimport { isEagerSyncDisabled } from './isEagerSyncDisabled';\nimport { getOpenDocSignal } from './yjs/reopenDocSignal';\nimport { getUpdatesTable } from './yjs/getUpdatesTable';\nimport { DEXIE_CLOUD_SYNCER_ID } from './sync/DEXIE_CLOUD_SYNCER_ID';\nimport { DexieYProvider, YSyncState } from 'y-dexie';\n\nconst SERVER_PING_TIMEOUT = 20000;\nconst CLIENT_PING_INTERVAL = 30000;\nconst FAIL_RETRY_WAIT_TIME = 60000;\n\nexport type WSClientToServerMsg = ReadyForChangesMessage | YClientMessage;\nexport interface ReadyForChangesMessage {\n type: 'ready';\n realmSetHash: string;\n rev: string;\n}\n\nexport type WSConnectionMsg =\n | RevisionChangedMessage\n | RealmAddedMessage\n | RealmAcceptedMessage\n | RealmRemovedMessage\n | RealmsChangedMessage\n | ChangesFromServerMessage\n | TokenExpiredMessage;\ninterface PingMessage {\n type: 'ping';\n}\n\ninterface PongMessage {\n type: 'pong';\n}\n\ninterface ErrorMessage {\n type: 'error';\n error: string;\n}\n\nexport interface ChangesFromServerMessage {\n type: 'changes';\n baseRev: string;\n realmSetHash: string;\n newRev: string;\n changes: DBOperationsSet<string>;\n}\nexport interface RevisionChangedMessage {\n type: 'rev';\n rev: string;\n}\n\nexport interface RealmAddedMessage {\n type: 'realm-added';\n realm: string;\n}\n\nexport interface RealmAcceptedMessage {\n type: 'realm-accepted';\n realm: string;\n}\n\nexport interface RealmRemovedMessage {\n type: 'realm-removed';\n realm: string;\n}\n\nexport interface RealmsChangedMessage {\n type: 'realms-changed';\n realmsHash: string;\n}\nexport interface TokenExpiredMessage {\n type: 'token-expired';\n}\n\nexport class WSObservable extends Observable<WSConnectionMsg> {\n constructor(\n db: DexieCloudDB,\n rev: string | undefined,\n yrev: string | undefined,\n realmSetHash: string,\n clientIdentity: string,\n messageProducer: Observable<WSClientToServerMsg>,\n webSocketStatus: BehaviorSubject<DXCWebSocketStatus>,\n user: UserLogin\n ) {\n super(\n (subscriber) =>\n new WSConnection(\n db,\n rev,\n yrev,\n realmSetHash,\n clientIdentity,\n user,\n subscriber,\n messageProducer,\n webSocketStatus\n )\n );\n }\n}\n\nlet counter = 0;\n\nexport class WSConnection extends Subscription {\n db: DexieCloudDB;\n ws: WebSocket | null;\n lastServerActivity: Date;\n lastUserActivity: Date;\n lastPing: Date;\n databaseUrl: string;\n rev: string | undefined;\n yrev: string | undefined;\n realmSetHash: string;\n clientIdentity: string;\n user: UserLogin;\n subscriber: Subscriber<WSConnectionMsg>;\n pauseUntil?: Date;\n messageProducer: Observable<WSClientToServerMsg>;\n webSocketStatus: BehaviorSubject<DXCWebSocketStatus>;\n id = ++counter;\n\n private pinger: any;\n private subscriptions: Set<Subscription> = new Set();\n\n constructor(\n db: DexieCloudDB,\n rev: string | undefined,\n yrev: string | undefined,\n realmSetHash: string,\n clientIdentity: string,\n user: UserLogin,\n subscriber: Subscriber<WSConnectionMsg>,\n messageProducer: Observable<WSClientToServerMsg>,\n webSocketStatus: BehaviorSubject<DXCWebSocketStatus>\n ) {\n super(() => this.teardown());\n console.debug(\n 'New WebSocket Connection',\n this.id,\n user.accessToken ? 'authorized' : 'unauthorized'\n );\n this.db = db;\n this.databaseUrl = db.cloud.options!.databaseUrl;\n this.rev = rev;\n this.yrev = yrev;\n this.realmSetHash = realmSetHash;\n this.clientIdentity = clientIdentity;\n this.user = user;\n this.subscriber = subscriber;\n this.lastUserActivity = new Date();\n this.messageProducer = messageProducer;\n this.webSocketStatus = webSocketStatus;\n this.connect();\n }\n\n private teardown() {\n console.debug('Teardown WebSocket Connection', this.id);\n this.disconnect();\n }\n\n private disconnect() {\n this.webSocketStatus.next('disconnected');\n if (this.pinger) {\n clearInterval(this.pinger);\n this.pinger = null;\n }\n if (this.ws) {\n try {\n this.ws.close();\n } catch {}\n }\n this.ws = null;\n for (const sub of this.subscriptions) {\n sub.unsubscribe();\n }\n this.subscriptions.clear();\n }\n\n reconnecting = false;\n reconnect() {\n if (this.reconnecting) return;\n this.reconnecting = true;\n try {\n this.disconnect();\n } catch {}\n this.connect()\n .catch(() => {})\n .then(() => (this.reconnecting = false)); // finally()\n }\n\n async connect() {\n this.lastServerActivity = new Date();\n if (this.pauseUntil && this.pauseUntil > new Date()) {\n console.debug('WS not reconnecting just yet', {\n id: this.id,\n pauseUntil: this.pauseUntil,\n });\n return;\n }\n if (this.ws) {\n throw new Error(`Called connect() when a connection is already open`);\n }\n if (!this.databaseUrl)\n throw new Error(`Cannot connect without a database URL`);\n if (this.closed) {\n //console.debug('SyncStatus: DUBB: Ooops it was closed!');\n return;\n }\n const tokenExpiration = this.user.accessTokenExpiration;\n if (tokenExpiration && tokenExpiration < new Date()) {\n this.subscriber.error(new TokenExpiredError()); // Will be handled in connectWebSocket.ts.\n return;\n }\n this.webSocketStatus.next('connecting');\n this.pinger = setInterval(async () => {\n // setInterval here causes unnecessary pings when server is proved active anyway.\n // TODO: Use setTimout() here instead. When triggered, check if we really need to ping.\n // In case we've had server activity, we don't need to ping. Then schedule then next ping\n // to the time when we should ping next time (based on lastServerActivity + CLIENT_PING_INTERVAL).\n // Else, ping now and schedule next ping to CLIENT_PING_INTERVAL from now.\n if (this.closed) {\n console.debug('pinger check', this.id, 'CLOSED.');\n this.teardown();\n return;\n }\n if (this.ws) {\n try {\n this.ws.send(JSON.stringify({ type: 'ping' } as PingMessage));\n setTimeout(() => {\n console.debug(\n 'pinger setTimeout',\n this.id,\n this.pinger ? `alive` : 'dead'\n );\n if (!this.pinger) return;\n if (this.closed) {\n console.debug(\n 'pinger setTimeout',\n this.id,\n 'subscription is closed'\n );\n this.teardown();\n return;\n }\n if (\n this.lastServerActivity <\n new Date(Date.now() - SERVER_PING_TIMEOUT)\n ) {\n // Server inactive. Reconnect if user is active.\n console.debug('pinger: server is inactive');\n console.debug('pinger reconnecting');\n this.reconnect();\n } else {\n console.debug('pinger: server still active');\n }\n }, SERVER_PING_TIMEOUT);\n } catch {\n console.debug('pinger catch error', this.id, 'reconnecting');\n this.reconnect();\n }\n } else {\n console.debug('pinger', this.id, 'reconnecting');\n this.reconnect();\n }\n }, CLIENT_PING_INTERVAL);\n\n // The following vars are needed because we must know which callback to ack when server sends it's ack to us.\n const wsUrl = new URL(this.databaseUrl);\n wsUrl.protocol = wsUrl.protocol === 'http:' ? 'ws' : 'wss';\n const searchParams = new URLSearchParams();\n if (this.subscriber.closed) return;\n searchParams.set('v', '2');\n if (this.rev) searchParams.set('rev', this.rev);\n if (this.yrev) searchParams.set('yrev', this.yrev);\n searchParams.set('realmsHash', this.realmSetHash);\n searchParams.set('clientId', this.clientIdentity);\n searchParams.set('dxcv', this.db.cloud.version);\n if (this.user.accessToken) {\n searchParams.set('token', this.user.accessToken);\n }\n\n // Connect the WebSocket to given url:\n console.debug('dexie-cloud WebSocket create');\n const ws = (this.ws = new WebSocket(`${wsUrl}/changes?${searchParams}`));\n ws.binaryType = \"arraybuffer\";\n\n ws.onclose = (event: Event) => {\n if (!this.pinger) return;\n console.debug('dexie-cloud WebSocket onclosed', this.id);\n this.reconnect();\n };\n\n ws.onmessage = (event: MessageEvent) => {\n if (!this.pinger) return;\n\n this.lastServerActivity = new Date();\n try {\n const msg = typeof event.data === 'string'\n ? TSON.parse(event.data) as\n | WSConnectionMsg\n | PongMessage\n | ErrorMessage\n | YServerMessage \n : decodeYMessage(new Uint8Array(event.data)) as\n | YServerMessage;\n console.debug('dexie-cloud WebSocket onmessage', msg.type, msg);\n if (msg.type === 'error') {\n throw new Error(`Error message from dexie-cloud: ${msg.error}`);\n } else if (msg.type === 'aware') {\n const docCache = DexieYProvider.getDocCache(this.db.dx);\n const doc = docCache.find(msg.table, msg.k, msg.prop);\n if (doc) {\n const awareness = getDocAwareness(doc);\n if (awareness) {\n const awap = getAwarenessLibrary(this.db);\n awap.applyAwarenessUpdate(\n awareness,\n msg.u,\n 'server',\n );\n }\n }\n } else if (msg.type === 'pong') {\n // Do nothing\n } else if (msg.type === 'doc-open') {\n const docCache = DexieYProvider.getDocCache(this.db.dx);\n const doc = docCache.find(msg.table, msg.k, msg.prop);\n if (doc) {\n getOpenDocSignal(doc).next(); // Make yHandler reopen the document on server.\n }\n } else if (msg.type === 'u-ack' || msg.type === 'u-reject' || msg.type === 'u-s' || msg.type === 'in-sync' || msg.type === 'outdated-server-rev' || msg.type === 'y-complete-sync-done') {\n applyYServerMessages([msg], this.db).then(async ({resyncNeeded, yServerRevision, receivedUntils}) => {\n if (yServerRevision) {\n await this.db.$syncState.update('syncState', { yServerRevision: yServerRevision });\n }\n if (msg.type === 'u-s' && receivedUntils) {\n const utbl = getUpdatesTable(this.db, msg.table, msg.prop) as any as Table<YSyncState, string>;\n if (utbl) {\n const receivedUntil = receivedUntils[utbl.name];\n if (receivedUntil) {\n await utbl.update(DEXIE_CLOUD_SYNCER_ID, { receivedUntil });\n }\n }\n }\n if (resyncNeeded) {\n await this.db.cloud.sync({ purpose: 'pull', wait: true });\n }\n })\n } else {\n // Forward the request to our subscriber, wich is in messageFromServerQueue.ts (via connectWebSocket's subscribe() at the end!)\n this.subscriber.next(msg);\n }\n } catch (e) {\n this.subscriber.error(e);\n }\n };\n\n try {\n let everConnected = false;\n await new Promise((resolve, reject) => {\n ws.onopen = (event) => {\n console.debug('dexie-cloud WebSocket onopen');\n everConnected = true;\n resolve(null);\n };\n ws.onerror = (event: ErrorEvent) => {\n if (!everConnected) {\n const error = event.error || new Error('WebSocket Error');\n this.subscriber.error(error);\n this.webSocketStatus.next('error');\n reject(error);\n } else {\n this.reconnect();\n }\n };\n });\n this.subscriptions.add(this.messageProducer.subscribe(\n (msg) => {\n if (!this.closed) {\n if (\n msg.type === 'ready' &&\n this.webSocketStatus.value !== 'connected'\n ) {\n this.webSocketStatus.next('connected');\n }\n console.debug('dexie-cloud WebSocket send', msg.type, msg);\n if (msg.type === 'ready') {\n // Ok, we are certain to have stored everything up until revision msg.rev.\n // Update this.rev in case of reconnect - remember where we were and don't just start over!\n this.rev = msg.rev; \n // ... and then send along the request to the server so it would also be updated!\n this.ws?.send(TSON.stringify(msg));\n } else {\n // If it's not a \"ready\" message, it's an YMessage.\n // YMessages can be sent binary encoded.\n this.ws?.send(encodeYMessage(msg));\n }\n }\n }\n ));\n if (this.user.isLoggedIn && !isEagerSyncDisabled(this.db)) {\n this.subscriptions.add(\n createYClientUpdateObservable(this.db).subscribe(\n this.db.messageProducer\n )\n );\n }\n } catch (error) {\n this.pauseUntil = new Date(Date.now() + FAIL_RETRY_WAIT_TIME);\n }\n }\n}\n","import { Decoder, readAny, readBigUint64, readVarString, readVarUint8Array, } from 'lib0/decoding';\nexport function decodeYMessage(a) {\n const decoder = new Decoder(a);\n const type = readVarString(decoder);\n if (type === 'outdated-server-rev') {\n return { type };\n }\n if (type === 'y-complete-sync-done') {\n return { type, yServerRev: readVarString(decoder) };\n }\n const table = readVarString(decoder);\n const prop = readVarString(decoder);\n switch (type) {\n case 'u-ack':\n case 'u-reject':\n return {\n type,\n table,\n prop,\n i: Number(readBigUint64(decoder)),\n };\n default: {\n const k = readAny(decoder);\n switch (type) {\n case 'in-sync':\n return { type, table, prop, k };\n case 'aware':\n return {\n type,\n table,\n prop,\n k,\n u: readVarUint8Array(decoder),\n };\n case 'doc-open':\n return {\n type,\n table,\n prop,\n k,\n serverRev: readAny(decoder),\n sv: readAny(decoder),\n };\n case 'doc-close':\n return { type, table, prop, k };\n case 'sv':\n return {\n type,\n table,\n prop,\n k,\n sv: readVarUint8Array(decoder),\n };\n case 'u-c':\n return {\n type,\n table,\n prop,\n k,\n u: readVarUint8Array(decoder),\n i: Number(readBigUint64(decoder)),\n };\n case 'u-s':\n return {\n type,\n table,\n prop,\n k,\n u: readVarUint8Array(decoder),\n r: (decoder.pos < decoder.arr.length && readVarString(decoder)) || undefined,\n };\n default:\n throw new TypeError(`Unknown message type: ${type}`);\n }\n }\n }\n}\n","import { Observable, from, merge, mergeMap, switchMap, tap } from 'rxjs';\nimport { YClientMessage, YUpdateFromClientRequest } from 'dexie-cloud-common';\nimport { DexieCloudDB } from '../db/DexieCloudDB';\nimport { flatten } from '../helpers/flatten';\nimport { liveQuery } from 'dexie';\nimport { DEXIE_CLOUD_SYNCER_ID } from '../sync/DEXIE_CLOUD_SYNCER_ID';\nimport { listUpdatesSince } from './listUpdatesSince';\nimport { YDexieCloudSyncState } from './YDexieCloudSyncState';\n\nexport function createYClientUpdateObservable(\n db: DexieCloudDB\n): Observable<YClientMessage> {\n const yTableRecords = flatten(\n db.tables\n .filter(\n (table) =>\n db.cloud.schema?.[table.name]?.markedForSync && table.schema.yProps\n )\n .map((table) =>\n table.schema.yProps!.map((p) => ({\n table: table.name,\n ydocProp: p.prop,\n updatesTable: p.updatesTable,\n }))\n )\n );\n return merge(\n ...yTableRecords.map(({ table, ydocProp, updatesTable }) => {\n // Per updates table (table+prop combo), we first read syncer.unsentFrom,\n // and then start listening for updates since that number.\n const yTbl = db.table(updatesTable);\n return from(yTbl.get(DEXIE_CLOUD_SYNCER_ID)).pipe(\n switchMap((syncer: YDexieCloudSyncState) => {\n let currentUnsentFrom = syncer?.unsentFrom || 1;\n return from(\n liveQuery(async () => {\n const addedUpdates = await listUpdatesSince(\n yTbl,\n currentUnsentFrom\n );\n return addedUpdates\n .filter((update) => update.f && update.f & 1) // Only include local updates\n .map((update) => {\n return {\n type: 'u-c',\n table,\n prop: ydocProp,\n k: update.k,\n u: update.u,\n i: update.i,\n } satisfies YUpdateFromClientRequest;\n });\n })\n ).pipe(\n tap((addedUpdates) => {\n // Update currentUnsentFrom to only listen for updates that will be newer than the ones we emitted.\n // (Before, we did this within the liveQuery, but that caused a bug because\n // a cancelled emittion of a liveQuery would update the currentUnsentFrom without\n // emitting anything, leading to that we jumped over some updates. Here we update it\n // after the liveQuery has emitted its updates)\n if (addedUpdates.length > 0) {\n currentUnsentFrom = addedUpdates.at(-1)!.i + 1;\n }\n })\n );\n })\n );\n })\n ).pipe(\n // Flatten the array of messages.\n // If messageProducer emits empty array, nothing is emitted\n // but if messageProducer emits array of messages, they are\n // emitted one by one.\n mergeMap((messages) => messages)\n );\n}\n","export class InvalidLicenseError extends Error {\n name = 'InvalidLicenseError';\n license?: 'expired' | 'deactivated';\n constructor(license?: 'expired' | 'deactivated') {\n super(\n license === 'expired'\n ? `License expired`\n : license === 'deactivated'\n ? `User deactivated`\n : 'Invalid license'\n );\n if (license) {\n this.license = license;\n }\n }\n}\n","import { BehaviorSubject, firstValueFrom, from, Observable, of, throwError, merge } from 'rxjs';\nimport {\n catchError,\n combineLatestAll,\n debounceTime,\n delay,\n distinctUntilChanged,\n filter,\n map,\n mergeMap,\n switchMap,\n take,\n tap,\n} from 'rxjs/operators';\nimport { refreshAccessToken } from '../authentication/authenticate';\nimport { DexieCloudDB } from '../db/DexieCloudDB';\nimport { PersistedSyncState } from '../db/entities/PersistedSyncState';\nimport { computeRealmSetHash } from '../helpers/computeRealmSetHash';\nimport {\n userDoesSomething,\n userIsActive,\n userIsReallyActive,\n} from '../userIsActive';\nimport {\n ReadyForChangesMessage,\n WSConnectionMsg,\n WSObservable,\n} from '../WSObservable';\nimport { InvalidLicenseError } from '../InvalidLicenseError';\nimport { read } from 'fs';\n\nfunction sleep(ms: number) {\n return new Promise((resolve) => setTimeout(resolve, ms));\n}\n\nasync function waitAndReconnectWhenUserDoesSomething(error: Error) {\n console.error(\n `WebSocket observable: error but revive when user does some active thing...`,\n error\n );\n // Sleep some seconds...\n await sleep(3000);\n // Wait til user does something (move mouse, tap, scroll, click etc)\n console.debug('waiting for someone to do something');\n await firstValueFrom(userDoesSomething);\n console.debug('someone did something!');\n}\n\nexport function connectWebSocket(db: DexieCloudDB) {\n if (!db.cloud.options?.databaseUrl) {\n throw new Error(`No database URL to connect WebSocket to`);\n }\n\n const readyForChangesMessage = db.messageConsumer.readyToServe.pipe(\n filter((isReady) => isReady), // When consumer is ready for new messages, produce such a message to inform server about it\n switchMap(() => db.getPersistedSyncState()), // We need the info on which server revision we are at:\n filter((syncState) => syncState && syncState.serverRevision), // We wont send anything to server before inital sync has taken place\n switchMap<PersistedSyncState, Promise<ReadyForChangesMessage>>(async (syncState) => ({\n // Produce the message to trigger server to send us new messages to consume:\n type: 'ready',\n rev: syncState.serverRevision,\n realmSetHash: await computeRealmSetHash(syncState)\n } satisfies ReadyForChangesMessage))\n );\n\n const messageProducer = merge(\n readyForChangesMessage,\n db.messageProducer\n );\n\n function createObservable(): Observable<WSConnectionMsg | null> {\n return db.cloud.persistedSyncState.pipe(\n filter((syncState) => syncState?.serverRevision), // Don't connect before there's no initial sync performed.\n take(1), // Don't continue waking up whenever syncState change\n switchMap((syncState) =>\n db.cloud.currentUser.pipe(\n map((userLogin) => [userLogin, syncState] as const)\n )\n ),\n switchMap(([userLogin, syncState]) => {\n /*if (userLogin.license?.status && userLogin.license.status !== 'ok') {\n throw new InvalidLicenseError();\n }*/\n return userIsReallyActive.pipe(\n map((isActive) => [isActive ? userLogin : null, syncState] as const)\n );\n }),\n switchMap(([userLogin, syncState]) => {\n if (userLogin?.isLoggedIn && !syncState?.realms.includes(userLogin.userId!)) {\n // We're in an in-between state when user is logged in but the user's realms are not yet synced.\n // Don't make this change reconnect the websocket just yet. Wait till syncState is updated\n // to iclude the user's realm.\n return db.cloud.persistedSyncState.pipe(\n filter((syncState) => syncState?.realms.includes(userLogin!.userId!) || false),\n take(1),\n map((syncState) => [userLogin, syncState] as const)\n );\n }\n return new BehaviorSubject([userLogin, syncState] as const);\n }),\n switchMap(\n async ([userLogin, syncState]) =>\n [userLogin, await computeRealmSetHash(syncState!)] as const\n ),\n distinctUntilChanged(([prevUser, prevHash], [currUser, currHash]) => prevUser === currUser && prevHash === currHash ),\n switchMap(([userLogin, realmSetHash]) => {\n if (!db.cloud.persistedSyncState?.value) {\n // Restart the flow if persistedSyncState is not yet available.\n return createObservable();\n }\n // Let server end query changes from last entry of same client-ID and forward.\n // If no new entries, server won't bother the client. If new entries, server sends only those\n // and the baseRev of the last from same client-ID.\n if (userLogin) {\n return new WSObservable(\n db,\n db.cloud.persistedSyncState!.value!.serverRevision,\n db.cloud.persistedSyncState!.value!.yServerRevision,\n realmSetHash,\n db.cloud.persistedSyncState!.value!.clientIdentity,\n messageProducer,\n db.cloud.webSocketStatus,\n userLogin\n );\n } else {\n return from([] as WSConnectionMsg[]);\n }}),\n catchError((error) => {\n if (error?.name === 'TokenExpiredError') {\n console.debug(\n 'WebSocket observable: Token expired. Refreshing token...'\n );\n return of(true).pipe(\n switchMap(async () => {\n // Refresh access token\n const user = await db.getCurrentUser();\n const refreshedLogin = await refreshAccessToken(\n db.cloud.options!.databaseUrl,\n user\n );\n // Persist updated access token\n await db.table('$logins').update(user.userId, {\n accessToken: refreshedLogin.accessToken,\n accessTokenExpiration: refreshedLogin.accessTokenExpiration,\n claims: refreshedLogin.claims,\n license: refreshedLogin.license,\n data: refreshedLogin.data\n });\n }),\n switchMap(() => createObservable())\n );\n } else {\n return throwError(()=>error);\n }\n }),\n catchError((error) => {\n db.cloud.webSocketStatus.next(\"error\");\n if (error instanceof InvalidLicenseError) {\n // Don't retry. Just throw and don't try connect again.\n return throwError(() => error);\n }\n return from(waitAndReconnectWhenUserDoesSomething(error)).pipe(\n switchMap(() => createObservable())\n );\n })\n ) as Observable<WSConnectionMsg | null>;\n }\n\n return createObservable().subscribe({\n next: (msg) => {\n if (msg) {\n console.debug('WS got message', msg);\n db.messageConsumer.enqueue(msg);\n }\n },\n error: (error) => {\n console.error('WS got error', error);\n },\n complete: () => {\n console.debug('WS observable completed');\n },\n });\n}\n","import { DexieCloudDB } from \"../db/DexieCloudDB\";\nimport { sync } from \"./sync\";\n\nexport async function isSyncNeeded(db: DexieCloudDB) {\n return db.cloud.options?.databaseUrl && db.cloud.schema\n ? await sync(db, db.cloud.options, db.cloud.schema, {justCheckIfNeeded: true})\n : false;\n}\n","import { IS_SERVICE_WORKER } from '../helpers/IS_SERVICE_WORKER';\nimport { performGuardedJob } from './performGuardedJob';\nimport { DexieCloudDB } from '../db/DexieCloudDB';\nimport { sync, CURRENT_SYNC_WORKER, SyncOptions } from './sync';\nimport { DexieCloudOptions } from '../DexieCloudOptions';\nimport { assert, DexieCloudSchema } from 'dexie-cloud-common';\nimport { checkSyncRateLimitDelay } from './ratelimit';\n\nconst ongoingSyncs = new WeakMap<\n DexieCloudDB,\n { promise: Promise<void>; pull: boolean }\n>();\n\nexport function syncIfPossible(\n db: DexieCloudDB,\n cloudOptions: DexieCloudOptions,\n cloudSchema: DexieCloudSchema,\n options?: SyncOptions\n) {\n const ongoing = ongoingSyncs.get(db);\n if (ongoing) {\n if (ongoing.pull || options?.purpose === 'push') {\n console.debug('syncIfPossible(): returning the ongoing sync promise.');\n return ongoing.promise;\n } else {\n // Ongoing sync may never do anything in case there are no outstanding changes\n // to sync (because its purpose was \"push\" not \"pull\")\n // Now, however, we are asked to do a sync with the purpose of \"pull\"\n // We want to optimize here. We must wait for the ongoing to complete\n // and then, if the ongoing sync never resulted in a sync request,\n // we must redo the sync.\n\n // To inspect what is happening in the ongoing request, let's subscribe\n // to db.cloud.syncState and look for if it is doing any \"pulling\" phase:\n let hasPullTakenPlace = false;\n const subscription = db.cloud.syncState.subscribe((syncState) => {\n if (syncState.phase === 'pulling') {\n hasPullTakenPlace = true;\n }\n });\n // Ok, so now we are watching. At the same time, wait for the ongoing to complete\n // and when it has completed, check if we're all set or if we need to redo\n // the call:\n return (\n ongoing.promise\n // This is a finally block but we are still running tests on\n // browsers that don't support it, so need to do it like this:\n .then(() => {\n subscription.unsubscribe();\n })\n .catch((error) => {\n subscription.unsubscribe();\n return Promise.reject(error);\n })\n .then(() => {\n if (!hasPullTakenPlace) {\n // No pull took place in the ongoing sync but the caller had \"pull\" as\n // an explicit purpose of this call - so we need to redo the call!\n return syncIfPossible(db, cloudOptions, cloudSchema, options);\n }\n })\n );\n }\n }\n\n const promise = _syncIfPossible();\n ongoingSyncs.set(db, { promise, pull: options?.purpose !== 'push' });\n return promise;\n\n async function _syncIfPossible() {\n try {\n // Check if should delay sync due to ratelimit:\n await checkSyncRateLimitDelay(db); \n await performGuardedJob(db, CURRENT_SYNC_WORKER, () =>\n sync(db, cloudOptions, cloudSchema, options)\n );\n ongoingSyncs.delete(db);\n console.debug('Done sync');\n } catch (error) {\n ongoingSyncs.delete(db);\n console.error(`Failed to sync client changes`, error);\n throw error; // Make sure we rethrow error so that sync event is retried.\n // I don't think we should setTimout or so here.\n // Unless server tells us to in some response.\n // Then we could follow that advice but not by waiting here but by registering\n // Something that triggers an event listened to in startPushWorker()\n }\n }\n}\n","export const SECONDS = 1000;\nexport const MINUTES = 60 * SECONDS;\nexport const HOURS = 60 * MINUTES;\nexport const DAYS = 24 * HOURS;\nexport const WEEKS = 7 * DAYS;\n","import { Subscription } from 'rxjs';\nimport { syncIfPossible } from './syncIfPossible';\nimport { DexieCloudDB } from '../db/DexieCloudDB';\nimport { SECONDS } from '../helpers/date-constants';\nimport { DexieCloudOptions } from '../DexieCloudOptions';\nimport { DexieCloudSchema } from 'dexie-cloud-common';\n\nexport function LocalSyncWorker(\n db: DexieCloudDB,\n cloudOptions: DexieCloudOptions,\n cloudSchema: DexieCloudSchema\n) {\n let localSyncEventSubscription: Subscription | null = null;\n let cancelToken = { cancelled: false };\n let nextRetryTime = 0;\n let syncStartTime = 0;\n\n function syncAndRetry(retryNum = 1) {\n // Use setTimeout() to get onto a clean stack and\n // break free from possible active transaction:\n setTimeout(() => {\n const purpose = pullSignalled ? 'pull' : 'push';\n syncStartTime = Date.now();\n syncIfPossible(db, cloudOptions, cloudSchema, {\n cancelToken,\n retryImmediatelyOnFetchError: true, // workaround for \"net::ERR_NETWORK_CHANGED\" in chrome.\n purpose,\n }).then(()=>{\n if (cancelToken.cancelled) {\n stop();\n } else {\n if (pullSignalled || pushSignalled) {\n // If we have signalled for more sync, do it now.\n pullSignalled = false;\n pushSignalled = false;\n return syncAndRetry();\n }\n }\n ongoingSync = false;\n nextRetryTime = 0;\n syncStartTime = 0;\n }).catch((error: unknown) => {\n console.error('error in syncIfPossible()', error);\n if (cancelToken.cancelled) {\n stop();\n ongoingSync = false;\n nextRetryTime = 0;\n syncStartTime = 0;\n } else if (retryNum < 5) {\n // Mimic service worker sync event but a bit more eager: retry 4 times\n // * first retry after 20 seconds\n // * second retry 40 seconds later\n // * third retry 5 minutes later\n // * last retry 15 minutes later\n const retryIn = [0, 20, 40, 300, 900][retryNum] * SECONDS\n nextRetryTime = Date.now() + retryIn;\n syncStartTime = 0;\n setTimeout(\n () => syncAndRetry(retryNum + 1),\n retryIn\n );\n } else {\n ongoingSync = false;\n nextRetryTime = 0;\n syncStartTime = 0;\n }\n });\n }, 0);\n }\n\n let pullSignalled = false;\n let pushSignalled = false;\n let ongoingSync = false;\n const consumer = (purpose: 'pull' | 'push') =>{\n if (cancelToken.cancelled) return;\n if (purpose === 'pull') {\n pullSignalled = true;\n }\n if (purpose === 'push') {\n pushSignalled = true;\n }\n if (ongoingSync) {\n if (nextRetryTime) {\n console.debug(`Sync is paused until ${new Date(nextRetryTime).toISOString()} due to error in last sync attempt`);\n } else if (syncStartTime > 0 && Date.now() - syncStartTime > 20 * SECONDS) {\n console.debug(`An existing sync operation is taking more than 20 seconds. Will resync when done.`)\n }\n return;\n }\n ongoingSync = true;\n syncAndRetry();\n };\n\n const start = () => {\n // Sync eagerly whenever a change has happened (+ initially when there's no syncState yet)\n // This initial subscribe will also trigger an sync also now.\n console.debug('Starting LocalSyncWorker', db.localSyncEvent['id']);\n localSyncEventSubscription = db.localSyncEvent.subscribe(({ purpose }) => {\n consumer(purpose || 'pull');\n });\n };\n\n const stop = () => {\n console.debug('Stopping LocalSyncWorker');\n cancelToken.cancelled = true;\n if (localSyncEventSubscription) localSyncEventSubscription.unsubscribe();\n };\n\n return {\n start,\n stop,\n };\n}\n","import { DexieCloudSchema } from \"dexie-cloud-common\";\nimport { DexieCloudOptions } from \"./DexieCloudOptions\";\n\nexport function updateSchemaFromOptions(schema?: DexieCloudSchema | null, options?: DexieCloudOptions | null) {\n if (schema && options) {\n if (options.unsyncedTables) {\n for (const tableName of options.unsyncedTables) {\n if (schema[tableName]) {\n schema[tableName].markedForSync = false;\n }\n }\n }\n }\n}","var n,l,u,i,t,o,r,f={},e=[],c=/acit|ex(?:s|g|n|p|$)|rph|grid|ows|mnc|ntw|ine[ch]|zoo|^ord|itera/i;function s(n,l){for(var u in l)n[u]=l[u];return n}function a(n){var l=n.parentNode;l&&l.removeChild(n)}function h(l,u,i){var t,o,r,f={};for(r in u)\"key\"==r?t=u[r]:\"ref\"==r?o=u[r]:f[r]=u[r];if(arguments.length>2&&(f.children=arguments.length>3?n.call(arguments,2):i),\"function\"==typeof l&&null!=l.defaultProps)for(r in l.defaultProps)void 0===f[r]&&(f[r]=l.defaultProps[r]);return v(l,f,t,o,null)}function v(n,i,t,o,r){var f={type:n,props:i,key:t,ref:o,__k:null,__:null,__b:0,__e:null,__d:void 0,__c:null,__h:null,constructor:void 0,__v:null==r?++u:r};return null==r&&null!=l.vnode&&l.vnode(f),f}function y(){return{current:null}}function p(n){return n.children}function d(n,l){this.props=n,this.context=l}function _(n,l){if(null==l)return n.__?_(n.__,n.__.__k.indexOf(n)+1):null;for(var u;l<n.__k.length;l++)if(null!=(u=n.__k[l])&&null!=u.__e)return u.__e;return\"function\"==typeof n.type?_(n):null}function k(n){var l,u;if(null!=(n=n.__)&&null!=n.__c){for(n.__e=n.__c.base=null,l=0;l<n.__k.length;l++)if(null!=(u=n.__k[l])&&null!=u.__e){n.__e=n.__c.base=u.__e;break}return k(n)}}function b(n){(!n.__d&&(n.__d=!0)&&t.push(n)&&!g.__r++||o!==l.debounceRendering)&&((o=l.debounceRendering)||setTimeout)(g)}function g(){for(var n;g.__r=t.length;)n=t.sort(function(n,l){return n.__v.__b-l.__v.__b}),t=[],n.some(function(n){var l,u,i,t,o,r;n.__d&&(o=(t=(l=n).__v).__e,(r=l.__P)&&(u=[],(i=s({},t)).__v=t.__v+1,j(r,t,i,l.__n,void 0!==r.ownerSVGElement,null!=t.__h?[o]:null,u,null==o?_(t):o,t.__h),z(u,t),t.__e!=o&&k(t)))})}function w(n,l,u,i,t,o,r,c,s,a){var h,y,d,k,b,g,w,x=i&&i.__k||e,C=x.length;for(u.__k=[],h=0;h<l.length;h++)if(null!=(k=u.__k[h]=null==(k=l[h])||\"boolean\"==typeof k?null:\"string\"==typeof k||\"number\"==typeof k||\"bigint\"==typeof k?v(null,k,null,null,k):Array.isArray(k)?v(p,{children:k},null,null,null):k.__b>0?v(k.type,k.props,k.key,null,k.__v):k)){if(k.__=u,k.__b=u.__b+1,null===(d=x[h])||d&&k.key==d.key&&k.type===d.type)x[h]=void 0;else for(y=0;y<C;y++){if((d=x[y])&&k.key==d.key&&k.type===d.type){x[y]=void 0;break}d=null}j(n,k,d=d||f,t,o,r,c,s,a),b=k.__e,(y=k.ref)&&d.ref!=y&&(w||(w=[]),d.ref&&w.push(d.ref,null,k),w.push(y,k.__c||b,k)),null!=b?(null==g&&(g=b),\"function\"==typeof k.type&&k.__k===d.__k?k.__d=s=m(k,s,n):s=A(n,k,d,x,b,s),\"function\"==typeof u.type&&(u.__d=s)):s&&d.__e==s&&s.parentNode!=n&&(s=_(d))}for(u.__e=g,h=C;h--;)null!=x[h]&&(\"function\"==typeof u.type&&null!=x[h].__e&&x[h].__e==u.__d&&(u.__d=_(i,h+1)),N(x[h],x[h]));if(w)for(h=0;h<w.length;h++)M(w[h],w[++h],w[++h])}function m(n,l,u){for(var i,t=n.__k,o=0;t&&o<t.length;o++)(i=t[o])&&(i.__=n,l=\"function\"==typeof i.type?m(i,l,u):A(u,i,i,t,i.__e,l));return l}function x(n,l){return l=l||[],null==n||\"boolean\"==typeof n||(Array.isArray(n)?n.some(function(n){x(n,l)}):l.push(n)),l}function A(n,l,u,i,t,o){var r,f,e;if(void 0!==l.__d)r=l.__d,l.__d=void 0;else if(null==u||t!=o||null==t.parentNode)n:if(null==o||o.parentNode!==n)n.appendChild(t),r=null;else{for(f=o,e=0;(f=f.nextSibling)&&e<i.length;e+=2)if(f==t)break n;n.insertBefore(t,o),r=o}return void 0!==r?r:t.nextSibling}function C(n,l,u,i,t){var o;for(o in u)\"children\"===o||\"key\"===o||o in l||H(n,o,null,u[o],i);for(o in l)t&&\"function\"!=typeof l[o]||\"children\"===o||\"key\"===o||\"value\"===o||\"checked\"===o||u[o]===l[o]||H(n,o,l[o],u[o],i)}function $(n,l,u){\"-\"===l[0]?n.setProperty(l,u):n[l]=null==u?\"\":\"number\"!=typeof u||c.test(l)?u:u+\"px\"}function H(n,l,u,i,t){var o;n:if(\"style\"===l)if(\"string\"==typeof u)n.style.cssText=u;else{if(\"string\"==typeof i&&(n.style.cssText=i=\"\"),i)for(l in i)u&&l in u||$(n.style,l,\"\");if(u)for(l in u)i&&u[l]===i[l]||$(n.style,l,u[l])}else if(\"o\"===l[0]&&\"n\"===l[1])o=l!==(l=l.replace(/Capture$/,\"\")),l=l.toLowerCase()in n?l.toLowerCase().slice(2):l.slice(2),n.l||(n.l={}),n.l[l+o]=u,u?i||n.addEventListener(l,o?T:I,o):n.removeEventListener(l,o?T:I,o);else if(\"dangerouslySetInnerHTML\"!==l){if(t)l=l.replace(/xlink(H|:h)/,\"h\").replace(/sName$/,\"s\");else if(\"href\"!==l&&\"list\"!==l&&\"form\"!==l&&\"tabIndex\"!==l&&\"download\"!==l&&l in n)try{n[l]=null==u?\"\":u;break n}catch(n){}\"function\"==typeof u||(null!=u&&(!1!==u||\"a\"===l[0]&&\"r\"===l[1])?n.setAttribute(l,u):n.removeAttribute(l))}}function I(n){this.l[n.type+!1](l.event?l.event(n):n)}function T(n){this.l[n.type+!0](l.event?l.event(n):n)}function j(n,u,i,t,o,r,f,e,c){var a,h,v,y,_,k,b,g,m,x,A,C,$,H=u.type;if(void 0!==u.constructor)return null;null!=i.__h&&(c=i.__h,e=u.__e=i.__e,u.__h=null,r=[e]),(a=l.__b)&&a(u);try{n:if(\"function\"==typeof H){if(g=u.props,m=(a=H.contextType)&&t[a.__c],x=a?m?m.props.value:a.__:t,i.__c?b=(h=u.__c=i.__c).__=h.__E:(\"prototype\"in H&&H.prototype.render?u.__c=h=new H(g,x):(u.__c=h=new d(g,x),h.constructor=H,h.render=O),m&&m.sub(h),h.props=g,h.state||(h.state={}),h.context=x,h.__n=t,v=h.__d=!0,h.__h=[]),null==h.__s&&(h.__s=h.state),null!=H.getDerivedStateFromProps&&(h.__s==h.state&&(h.__s=s({},h.__s)),s(h.__s,H.getDerivedStateFromProps(g,h.__s))),y=h.props,_=h.state,v)null==H.getDerivedStateFromProps&&null!=h.componentWillMount&&h.componentWillMount(),null!=h.componentDidMount&&h.__h.push(h.componentDidMount);else{if(null==H.getDerivedStateFromProps&&g!==y&&null!=h.componentWillReceiveProps&&h.componentWillReceiveProps(g,x),!h.__e&&null!=h.shouldComponentUpdate&&!1===h.shouldComponentUpdate(g,h.__s,x)||u.__v===i.__v){h.props=g,h.state=h.__s,u.__v!==i.__v&&(h.__d=!1),h.__v=u,u.__e=i.__e,u.__k=i.__k,u.__k.forEach(function(n){n&&(n.__=u)}),h.__h.length&&f.push(h);break n}null!=h.componentWillUpdate&&h.componentWillUpdate(g,h.__s,x),null!=h.componentDidUpdate&&h.__h.push(function(){h.componentDidUpdate(y,_,k)})}if(h.context=x,h.props=g,h.__v=u,h.__P=n,A=l.__r,C=0,\"prototype\"in H&&H.prototype.render)h.state=h.__s,h.__d=!1,A&&A(u),a=h.render(h.props,h.state,h.context);else do{h.__d=!1,A&&A(u),a=h.render(h.props,h.state,h.context),h.state=h.__s}while(h.__d&&++C<25);h.state=h.__s,null!=h.getChildContext&&(t=s(s({},t),h.getChildContext())),v||null==h.getSnapshotBeforeUpdate||(k=h.getSnapshotBeforeUpdate(y,_)),$=null!=a&&a.type===p&&null==a.key?a.props.children:a,w(n,Array.isArray($)?$:[$],u,i,t,o,r,f,e,c),h.base=u.__e,u.__h=null,h.__h.length&&f.push(h),b&&(h.__E=h.__=null),h.__e=!1}else null==r&&u.__v===i.__v?(u.__k=i.__k,u.__e=i.__e):u.__e=L(i.__e,u,i,t,o,r,f,c);(a=l.diffed)&&a(u)}catch(n){u.__v=null,(c||null!=r)&&(u.__e=e,u.__h=!!c,r[r.indexOf(e)]=null),l.__e(n,u,i)}}function z(n,u){l.__c&&l.__c(u,n),n.some(function(u){try{n=u.__h,u.__h=[],n.some(function(n){n.call(u)})}catch(n){l.__e(n,u.__v)}})}function L(l,u,i,t,o,r,e,c){var s,h,v,y=i.props,p=u.props,d=u.type,k=0;if(\"svg\"===d&&(o=!0),null!=r)for(;k<r.length;k++)if((s=r[k])&&\"setAttribute\"in s==!!d&&(d?s.localName===d:3===s.nodeType)){l=s,r[k]=null;break}if(null==l){if(null===d)return document.createTextNode(p);l=o?document.createElementNS(\"http://www.w3.org/2000/svg\",d):document.createElement(d,p.is&&p),r=null,c=!1}if(null===d)y===p||c&&l.data===p||(l.data=p);else{if(r=r&&n.call(l.childNodes),h=(y=i.props||f).dangerouslySetInnerHTML,v=p.dangerouslySetInnerHTML,!c){if(null!=r)for(y={},k=0;k<l.attributes.length;k++)y[l.attributes[k].name]=l.attributes[k].value;(v||h)&&(v&&(h&&v.__html==h.__html||v.__html===l.innerHTML)||(l.innerHTML=v&&v.__html||\"\"))}if(C(l,p,y,o,c),v)u.__k=[];else if(k=u.props.children,w(l,Array.isArray(k)?k:[k],u,i,t,o&&\"foreignObject\"!==d,r,e,r?r[0]:i.__k&&_(i,0),c),null!=r)for(k=r.length;k--;)null!=r[k]&&a(r[k]);c||(\"value\"in p&&void 0!==(k=p.value)&&(k!==l.value||\"progress\"===d&&!k||\"option\"===d&&k!==y.value)&&H(l,\"value\",k,y.value,!1),\"checked\"in p&&void 0!==(k=p.checked)&&k!==l.checked&&H(l,\"checked\",k,y.checked,!1))}return l}function M(n,u,i){try{\"function\"==typeof n?n(u):n.current=u}catch(n){l.__e(n,i)}}function N(n,u,i){var t,o;if(l.unmount&&l.unmount(n),(t=n.ref)&&(t.current&&t.current!==n.__e||M(t,null,u)),null!=(t=n.__c)){if(t.componentWillUnmount)try{t.componentWillUnmount()}catch(n){l.__e(n,u)}t.base=t.__P=null}if(t=n.__k)for(o=0;o<t.length;o++)t[o]&&N(t[o],u,\"function\"!=typeof n.type);i||null==n.__e||a(n.__e),n.__e=n.__d=void 0}function O(n,l,u){return this.constructor(n,u)}function P(u,i,t){var o,r,e;l.__&&l.__(u,i),r=(o=\"function\"==typeof t)?null:t&&t.__k||i.__k,e=[],j(i,u=(!o&&t||i).__k=h(p,null,[u]),r||f,f,void 0!==i.ownerSVGElement,!o&&t?[t]:r?null:i.firstChild?n.call(i.childNodes):null,e,!o&&t?t:r?r.__e:i.firstChild,o),z(e,u)}function S(n,l){P(n,l,S)}function q(l,u,i){var t,o,r,f=s({},l.props);for(r in u)\"key\"==r?t=u[r]:\"ref\"==r?o=u[r]:f[r]=u[r];return arguments.length>2&&(f.children=arguments.length>3?n.call(arguments,2):i),v(l.type,f,t||l.key,o||l.ref,null)}function B(n,l){var u={__c:l=\"__cC\"+r++,__:n,Consumer:function(n,l){return n.children(l)},Provider:function(n){var u,i;return this.getChildContext||(u=[],(i={})[l]=this,this.getChildContext=function(){return i},this.shouldComponentUpdate=function(n){this.props.value!==n.value&&u.some(b)},this.sub=function(n){u.push(n);var l=n.componentWillUnmount;n.componentWillUnmount=function(){u.splice(u.indexOf(n),1),l&&l.call(n)}}),n.children}};return u.Provider.__=u.Consumer.contextType=u}n=e.slice,l={__e:function(n,l,u,i){for(var t,o,r;l=l.__;)if((t=l.__c)&&!t.__)try{if((o=t.constructor)&&null!=o.getDerivedStateFromError&&(t.setState(o.getDerivedStateFromError(n)),r=t.__d),null!=t.componentDidCatch&&(t.componentDidCatch(n,i||{}),r=t.__d),r)return t.__E=t}catch(l){n=l}throw n}},u=0,i=function(n){return null!=n&&void 0===n.constructor},d.prototype.setState=function(n,l){var u;u=null!=this.__s&&this.__s!==this.state?this.__s:this.__s=s({},this.state),\"function\"==typeof n&&(n=n(s({},u),this.props)),n&&s(u,n),null!=n&&this.__v&&(l&&this.__h.push(l),b(this))},d.prototype.forceUpdate=function(n){this.__v&&(this.__e=!0,n&&this.__h.push(n),b(this))},d.prototype.render=p,t=[],g.__r=0,r=0;export{P as render,S as hydrate,h as createElement,h,p as Fragment,y as createRef,i as isValidElement,d as Component,q as cloneElement,B as createContext,x as toChildArray,l as options};\n//# sourceMappingURL=preact.module.js.map\n","export const Styles: { [styleAlias: string]: Partial<CSSStyleDeclaration> | any} = {\n Error: {\n color: \"red\",\n },\n Alert: {\n error: {\n color: \"red\",\n fontWeight: \"bold\"\n },\n warning: {\n color: \"#f80\",\n fontWeight: \"bold\"\n },\n info: {\n color: \"black\"\n }\n },\n Darken: {\n position: \"fixed\",\n top: 0,\n left: 0,\n opacity: 0.5,\n backgroundColor: \"#000\",\n width: \"100vw\",\n height: \"100vh\",\n zIndex: 150,\n webkitBackdropFilter: \"blur(2px)\",\n backdropFilter: \"blur(2px)\",\n },\n DialogOuter: {\n position: \"fixed\",\n top: 0,\n left: 0,\n width: \"100vw\",\n height: \"100vh\",\n zIndex: 150,\n alignItems: \"center\",\n display: \"flex\",\n justifyContent: \"center\",\n },\n DialogInner: {\n position: \"relative\",\n color: \"#222\",\n backgroundColor: \"#fff\",\n padding: \"30px\",\n marginBottom: \"2em\",\n maxWidth: \"90%\",\n maxHeight: \"90%\",\n overflowY: \"auto\",\n border: \"3px solid #3d3d5d\",\n borderRadius: \"8px\",\n boxShadow: \"0 0 80px 10px #666\",\n width: \"auto\",\n fontFamily: \"sans-serif\",\n },\n Input: {\n height: \"35px\",\n width: \"17em\",\n borderColor: \"#ccf4\",\n outline: \"none\",\n fontSize: \"17pt\",\n padding: \"8px\"\n \n }\n};\n","import { Styles } from './Styles';\nimport { ComponentChildren, h } from 'preact';\n\nexport function Dialog({ children, className }: { children?: ComponentChildren, className?: string }) {\n return (\n <div className={className}>\n <div style={Styles.Darken} />\n <div style={Styles.DialogOuter}>\n <div style={Styles.DialogInner}>{children}</div>\n </div>\n </div>\n );\n}\n","import{options as n}from\"preact\";var t,r,u,i,o=0,c=[],f=[],e=n.__b,a=n.__r,v=n.diffed,l=n.__c,m=n.unmount;function d(t,u){n.__h&&n.__h(r,t,o||u),o=0;var i=r.__H||(r.__H={__:[],__h:[]});return t>=i.__.length&&i.__.push({__V:f}),i.__[t]}function p(n){return o=1,y(z,n)}function y(n,u,i){var o=d(t++,2);if(o.t=n,!o.__c&&(o.__=[i?i(u):z(void 0,u),function(n){var t=o.__N?o.__N[0]:o.__[0],r=o.t(t,n);t!==r&&(o.__N=[r,o.__[1]],o.__c.setState({}))}],o.__c=r,!r.u)){r.u=!0;var c=r.shouldComponentUpdate;r.shouldComponentUpdate=function(n,t,r){if(!o.__c.__H)return!0;var u=o.__c.__H.__.filter(function(n){return n.__c});if(u.every(function(n){return!n.__N}))return!c||c.call(this,n,t,r);var i=!1;return u.forEach(function(n){if(n.__N){var t=n.__[0];n.__=n.__N,n.__N=void 0,t!==n.__[0]&&(i=!0)}}),!!i&&(!c||c.call(this,n,t,r))}}return o.__N||o.__}function h(u,i){var o=d(t++,3);!n.__s&&w(o.__H,i)&&(o.__=u,o.i=i,r.__H.__h.push(o))}function s(u,i){var o=d(t++,4);!n.__s&&w(o.__H,i)&&(o.__=u,o.i=i,r.__h.push(o))}function _(n){return o=5,F(function(){return{current:n}},[])}function A(n,t,r){o=6,s(function(){return\"function\"==typeof n?(n(t()),function(){return n(null)}):n?(n.current=t(),function(){return n.current=null}):void 0},null==r?r:r.concat(n))}function F(n,r){var u=d(t++,7);return w(u.__H,r)?(u.__V=n(),u.i=r,u.__h=n,u.__V):u.__}function T(n,t){return o=8,F(function(){return n},t)}function q(n){var u=r.context[n.__c],i=d(t++,9);return i.c=n,u?(null==i.__&&(i.__=!0,u.sub(r)),u.props.value):n.__}function x(t,r){n.useDebugValue&&n.useDebugValue(r?r(t):t)}function V(n){var u=d(t++,10),i=p();return u.__=n,r.componentDidCatch||(r.componentDidCatch=function(n){u.__&&u.__(n),i[1](n)}),[i[0],function(){i[1](void 0)}]}function b(){for(var t;t=c.shift();)if(t.__P&&t.__H)try{t.__H.__h.forEach(j),t.__H.__h.forEach(k),t.__H.__h=[]}catch(r){t.__H.__h=[],n.__e(r,t.__v)}}n.__b=function(n){r=null,e&&e(n)},n.__r=function(n){a&&a(n),t=0;var i=(r=n.__c).__H;i&&(u===r?(i.__h=[],r.__h=[],i.__.forEach(function(n){n.__N&&(n.__=n.__N),n.__V=f,n.__N=n.i=void 0})):(i.__h.forEach(j),i.__h.forEach(k),i.__h=[])),u=r},n.diffed=function(t){v&&v(t);var o=t.__c;o&&o.__H&&(o.__H.__h.length&&(1!==c.push(o)&&i===n.requestAnimationFrame||((i=n.requestAnimationFrame)||function(n){var t,r=function(){clearTimeout(u),g&&cancelAnimationFrame(t),setTimeout(n)},u=setTimeout(r,100);g&&(t=requestAnimationFrame(r))})(b)),o.__H.__.forEach(function(n){n.i&&(n.__H=n.i),n.__V!==f&&(n.__=n.__V),n.i=void 0,n.__V=f})),u=r=null},n.__c=function(t,r){r.some(function(t){try{t.__h.forEach(j),t.__h=t.__h.filter(function(n){return!n.__||k(n)})}catch(u){r.some(function(n){n.__h&&(n.__h=[])}),r=[],n.__e(u,t.__v)}}),l&&l(t,r)},n.unmount=function(t){m&&m(t);var r,u=t.__c;u&&u.__H&&(u.__H.__.forEach(function(n){try{j(n)}catch(n){r=n}}),r&&n.__e(r,u.__v))};var g=\"function\"==typeof requestAnimationFrame;function j(n){var t=r,u=n.__c;\"function\"==typeof u&&(n.__c=void 0,u()),r=t}function k(n){var t=r;n.__c=n.__(),r=t}function w(n,t){return!n||n.length!==t.length||t.some(function(t,r){return t!==n[r]})}function z(n,t){return\"function\"==typeof t?t(n):t}export{p as useState,y as useReducer,h as useEffect,s as useLayoutEffect,_ as useRef,A as useImperativeHandle,F as useMemo,T as useCallback,q as useContext,x as useDebugValue,V as useErrorBoundary};\n//# sourceMappingURL=hooks.module.js.map\n","import { Dialog } from './Dialog';\nimport { Styles } from './Styles';\nimport { h, Fragment } from 'preact';\nimport { useLayoutEffect, useRef, useState } from 'preact/hooks';\nimport { DXCUserInteraction } from '../types/DXCUserInteraction';\nimport { resolveText } from '../helpers/resolveText';\nimport { DXCInputField } from '../types/DXCInputField';\n\nconst OTP_LENGTH = 8;\n\nexport function LoginDialog({\n title,\n type,\n alerts,\n fields,\n submitLabel,\n cancelLabel,\n onCancel,\n onSubmit,\n}: DXCUserInteraction) {\n const [params, setParams] = useState<{ [param: string]: string }>({});\n\n const firstFieldRef = useRef<HTMLInputElement>(null);\n useLayoutEffect(() => firstFieldRef.current?.focus(), []);\n\n return (\n <Dialog className=\"dxc-login-dlg\">\n <>\n <h3 style={Styles.WindowHeader}>{title}</h3>\n {alerts.map((alert) => (\n <p style={Styles.Alert[alert.type]}>{resolveText(alert)}</p>\n ))}\n <form\n onSubmit={(ev) => {\n ev.preventDefault();\n onSubmit(params);\n }}\n >\n {(Object.entries(fields) as [string, DXCInputField][]).map(\n ([fieldName, { type, label, placeholder }], idx) => (\n <label style={Styles.Label} key={idx}>\n {label ? `${label}: ` : ''}\n <input\n ref={idx === 0 ? firstFieldRef : undefined}\n type={type}\n name={fieldName}\n autoComplete=\"on\"\n style={Styles.Input}\n autoFocus\n placeholder={placeholder}\n value={params[fieldName] || ''}\n onInput={(ev) => {\n const value = valueTransformer(type, ev.target?.['value']);\n let updatedParams = {\n ...params,\n [fieldName]: value,\n };\n setParams(updatedParams);\n if (type === 'otp' && value?.trim().length === OTP_LENGTH) {\n // Auto-submit when OTP is filled in.\n onSubmit(updatedParams);\n }\n }}\n />\n </label>\n )\n )}\n </form>\n </>\n <div style={Styles.ButtonsDiv}>\n <>\n <button\n type=\"submit\"\n style={Styles.Button}\n onClick={() => onSubmit(params)}\n >\n {submitLabel}\n </button>\n {cancelLabel && (\n <button style={Styles.Button} onClick={onCancel}>\n {cancelLabel}\n </button>\n )}\n </>\n </div>\n </Dialog>\n );\n}\n\nfunction valueTransformer(type: string, value: string) {\n switch (type) {\n case 'email':\n return value.toLowerCase();\n case 'otp':\n return value.toUpperCase();\n default:\n return value;\n }\n}\n","import { DXCAlert } from \"../types/DXCAlert\";\n\n/** Resolve a message template with parameters.\n * \n * Example:\n * resolveText({\n * message: \"Hello {name}!\",\n * messageCode: \"HELLO\",\n * messageParams: {name: \"David\"}\n * }) => \"Hello David!\"\n * \n * @param message Template message with {vars} in it.\n * @param messageCode Unique code for the message. Can be used for translation.\n * @param messageParams Parameters to be used in the message.\n * @returns A final message where parameters have been replaced with values.\n */\nexport function resolveText({message, messageCode, messageParams}: DXCAlert) {\n return message.replace(/\\{\\w+\\}/ig, n => messageParams[n.substring(1, n.length-1)]);\n}\n","import Dexie from \"dexie\";\nimport \"../extend-dexie-interface\";\nimport { h, Component } from \"preact\";\nimport { from, Subscription } from \"rxjs\";\nimport { LoginDialog } from './LoginDialog';\nimport { DXCUserInteraction } from \"../types/DXCUserInteraction\";\nimport * as preact from \"preact\";\n\nexport interface Props {\n db: Dexie;\n}\n\ninterface State {\n userInteraction: DXCUserInteraction | undefined;\n}\n\nexport default class LoginGui extends Component<Props, State> {\n subscription?: Subscription;\n observer = (userInteraction: DXCUserInteraction | undefined) => this.setState({userInteraction});\n\n constructor(props: Props) {\n super(props);\n this.state = { userInteraction: undefined };\n }\n\n componentDidMount() {\n this.subscription = from(this.props.db.cloud.userInteraction).subscribe(this.observer);\n }\n\n componentWillUnmount() {\n if (this.subscription) {\n this.subscription.unsubscribe();\n delete this.subscription;\n }\n }\n\n render(props: Props, {userInteraction}: State) {\n if (!userInteraction) return null;\n //if (props.db.cloud.userInteraction.observers.length > 1) return null; // Someone else subscribes.\n return <LoginDialog {...userInteraction} />;\n }\n}\n\nexport function setupDefaultGUI(db: Dexie) {\n let closed = false;\n\n const el = document.createElement('div');\n if (document.body) {\n document.body.appendChild(el);\n preact.render(<LoginGui db={db.vip} />, el);\n } else {\n addEventListener('DOMContentLoaded', ()=>{\n if (!closed) {\n document.body.appendChild(el);\n preact.render(<LoginGui db={db.vip} />, el);\n }\n });\n }\n\n return {\n unsubscribe() {\n try { el.remove(); } catch {}\n closed = true;\n },\n get closed() {\n return closed;\n }\n }\n}\n","export function associate<T extends object,M>(factory: (x: T)=>M): (x: T) => M {\n const wm = new WeakMap<T, M>();\n return (x: T) => {\n let rv = wm.get(x);\n if (!rv) {\n rv = factory(x);\n wm.set(x, rv);\n }\n return rv;\n }\n}\n","import Dexie from \"dexie\";\nimport { BehaviorSubject } from \"rxjs\";\nimport { associate } from \"./associate\";\nimport { UNAUTHORIZED_USER } from \"./authentication/UNAUTHORIZED_USER\";\n\nexport const getCurrentUserEmitter = associate((db: Dexie) => new BehaviorSubject(UNAUTHORIZED_USER));\n","import {\n concat,\n from,\n InteropObservable,\n map,\n Observable,\n ObservableInput,\n share,\n timer,\n} from 'rxjs';\nimport { ObservableWithCurrentValue } from './mapValueObservable';\n\nexport function createSharedValueObservable<T>(\n o: ObservableInput<T>,\n defaultValue: T\n): ObservableWithCurrentValue<T> {\n let currentValue = defaultValue;\n let shared = from(o).pipe(\n map((x) => (currentValue = x)),\n share({ resetOnRefCountZero: () => timer(1000) })\n ) as ObservableWithCurrentValue<T>;\n\n const rv = new Observable((observer) => {\n let didEmit = false;\n const subscription = shared.subscribe({\n next(value) {\n didEmit = true;\n observer.next(value);\n },\n error(error) {\n observer.error(error);\n },\n complete() {\n observer.complete();\n }\n });\n if (!didEmit && !subscription.closed) {\n observer.next(currentValue);\n }\n return subscription;\n }) as ObservableWithCurrentValue<T>;\n\n rv.getValue = () => currentValue;\n return rv;\n}\n","import Dexie, { liveQuery } from 'dexie';\nimport { DBRealmRole } from 'dexie-cloud-common';\nimport { associate } from './associate';\nimport { createSharedValueObservable } from './createSharedValueObservable';\n\nexport const getGlobalRolesObservable = associate((db: Dexie) => {\n return createSharedValueObservable(\n liveQuery(() =>\n db.roles\n .where({ realmId: 'rlm-public' })\n .toArray()\n .then((roles) => {\n const rv: { [roleName: string]: DBRealmRole } = {};\n for (const role of roles\n .slice()\n .sort((a, b) => (a.sortOrder || 0) - (b.sortOrder || 0))) {\n rv[role.name] = role;\n }\n return rv;\n })\n ),\n {}\n );\n});\n","import Dexie, { liveQuery } from 'dexie';\nimport { DBRealm, DBRealmMember } from 'dexie-cloud-common';\nimport { concat, Observable, timer } from 'rxjs';\nimport { share, switchMap } from 'rxjs/operators';\nimport { associate } from './associate';\nimport { createSharedValueObservable } from './createSharedValueObservable';\nimport { getCurrentUserEmitter } from './currentUserEmitter';\n\nexport type InternalAccessControlData = {\n readonly selfMembers: DBRealmMember[];\n readonly realms: DBRealm[];\n readonly userId: string;\n};\n\nexport const getInternalAccessControlObservable = associate((db: Dexie) => {\n return createSharedValueObservable(\n getCurrentUserEmitter(db._novip).pipe(\n switchMap((currentUser) =>\n liveQuery(() =>\n db.transaction('r', 'realms', 'members', () =>\n Promise.all([\n db.members.where({ userId: currentUser.userId }).toArray(),\n db.realms.toArray(),\n currentUser.userId!,\n ] as const).then(([selfMembers, realms, userId]) => {\n //console.debug(`PERMS: Result from liveQUery():`, JSON.stringify({selfMembers, realms, userId}, null, 2))\n return { selfMembers, realms, userId };\n })\n )\n )\n )\n ), {\n selfMembers: [],\n realms: [],\n get userId() {\n return db.cloud.currentUserId;\n },\n }\n );\n /* let refCount = 0;\n return new Observable(observer => {\n const subscription = o.subscribe(observer);\n console.debug ('PERMS subscribe', ++refCount);\n return {\n unsubscribe() {\n console.debug ('PERMS unsubscribe', --refCount);\n subscription.unsubscribe();\n }\n }\n })*/\n});\n","// TODO: Move to dexie-cloud-common\n\nimport { DBPermissionSet } from 'dexie-cloud-common';\n\nexport function mergePermissions(\n ...permissions: DBPermissionSet[]\n): DBPermissionSet {\n if (permissions.length === 0) return {};\n const reduced = permissions.reduce((result, next) => {\n const ret = { ...result } as DBPermissionSet;\n for (const [verb, rights] of Object.entries(next) as [\n keyof DBPermissionSet,\n DBPermissionSet[keyof DBPermissionSet]\n ][]) {\n if (verb in ret && ret[verb]) {\n if (ret[verb] === '*') continue;\n if (rights === '*') {\n ret[verb] = '*';\n } else if (Array.isArray(rights) && Array.isArray(ret[verb])) {\n // Both are arrays (verb is 'add' or 'manage')\n const r = ret as { [v in typeof verb]?: string[] };\n const retVerb = r[verb]!; // \"!\" because Array.isArray(ret[verb])\n r[verb] = [...new Set([...retVerb, ...rights])];\n } else if (\n typeof rights === 'object' &&\n rights &&\n typeof ret[verb] === 'object'\n ) {\n // Both are objects (verb is 'update')\n const mergedRights = ret[verb] as {\n [tableName: string]: '*' | string[];\n }; // because we've checked that typeof ret[verb] === 'object' and earlier that not ret[verb] === '*'.\n for (const [tableName, tableRights] of Object.entries(rights) as [\n string,\n string[] | '*'\n ][]) {\n if (mergedRights[tableName] === '*') continue;\n if (tableRights === '*') {\n mergedRights[tableName] = '*';\n } else if (\n Array.isArray(mergedRights[tableName]) &&\n Array.isArray(tableRights)\n ) {\n mergedRights[tableName] = [\n ...new Set([...mergedRights[tableName], ...tableRights]),\n ];\n }\n }\n }\n } else {\n /* This compiles without type assertions. Keeping the comment to\n explain why we do tsignore on the next statement.\n if (verb === \"add\") {\n ret[verb] = next[verb];\n } else if (verb === \"update\") {\n ret[verb] = next[verb];\n } else if (verb === \"manage\") {\n ret[verb] = next[verb];\n } else {\n ret[verb] = next[verb];\n }\n */\n //@ts-ignore\n ret[verb] = next[verb];\n }\n }\n return ret;\n });\n return reduced;\n}\n","import Dexie from 'dexie';\nimport { DBPermissionSet, DBRealm, DBRealmMember } from 'dexie-cloud-common';\nimport { combineLatest, Observable } from 'rxjs';\nimport { map, startWith, tap } from 'rxjs/operators';\nimport { associate } from './associate';\nimport { UNAUTHORIZED_USER } from './authentication/UNAUTHORIZED_USER';\nimport { createSharedValueObservable } from './createSharedValueObservable';\nimport { getGlobalRolesObservable } from './getGlobalRolesObservable';\nimport { getInternalAccessControlObservable } from './getInternalAccessControlObservable';\nimport { flatten } from './helpers/flatten';\nimport { mapValueObservable } from './mapValueObservable';\nimport { mergePermissions } from './mergePermissions';\n\nexport type PermissionsLookup = {\n [realmId: string]: DBRealm & { permissions: DBPermissionSet };\n};\n\nexport type PermissionsLookupObservable = Observable<PermissionsLookup> & {\n getValue(): PermissionsLookup;\n};\n\nexport const getPermissionsLookupObservable = associate((db: Dexie) => {\n const o = createSharedValueObservable(\n combineLatest([\n getInternalAccessControlObservable(db._novip),\n getGlobalRolesObservable(db._novip),\n ]).pipe(\n map(([{ selfMembers, realms, userId }, globalRoles]) => ({\n selfMembers,\n realms,\n userId,\n globalRoles,\n }))\n ),\n {\n selfMembers: [],\n realms: [],\n userId: UNAUTHORIZED_USER.userId!,\n globalRoles: {},\n }\n );\n\n return mapValueObservable(\n o,\n ({ selfMembers, realms, userId, globalRoles }) => {\n const rv = realms\n .map((realm) => {\n const selfRealmMembers = selfMembers.filter(\n (m) => m.realmId === realm.realmId\n );\n const directPermissionSets = selfRealmMembers\n .map((m) => m.permissions!)\n .filter((p) => p);\n const rolePermissionSets = flatten(\n selfRealmMembers.map((m) => m.roles!).filter((roleName) => roleName)\n )\n .map((role) => globalRoles[role]!)\n .filter((role) => role)\n .map((role) => role.permissions);\n\n return {\n ...realm,\n permissions:\n realm.owner === userId\n ? ({ manage: '*' } as DBPermissionSet)\n : mergePermissions(\n ...directPermissionSets,\n ...rolePermissionSets\n ),\n };\n })\n .reduce((p, c) => ({ ...p, [c.realmId]: c }), {\n [userId!]: {\n realmId: userId,\n owner: userId,\n name: userId,\n permissions: { manage: '*' },\n } as DBRealm & { permissions: DBPermissionSet },\n });\n return rv;\n }\n );\n});\n","import { map, Observable } from 'rxjs';\n\nexport interface ObservableWithCurrentValue<T> extends Observable<T> {\n getValue(): T;\n}\n\nexport function mapValueObservable<T, R>(\n o: ObservableWithCurrentValue<T>,\n mapper: (x: T) => R\n): ObservableWithCurrentValue<R> {\n let currentValue: R | undefined;\n const rv = o.pipe(\n map((x) => (currentValue = mapper(x)))\n ) as ObservableWithCurrentValue<R>;\n rv.getValue = () =>\n currentValue !== undefined\n ? currentValue\n : (currentValue = mapper(o.getValue()));\n return rv;\n}\n","import { KeyPaths } from 'dexie';\nimport { DBPermissionSet } from 'dexie-cloud-common';\n\ntype TableName<T> = T extends {table: ()=>infer TABLE} ? TABLE extends string ? TABLE : string : string;\n\nexport class PermissionChecker<T, TableNames extends string = TableName<T>> {\n private permissions: DBPermissionSet;\n private tableName: TableNames;\n private isOwner: boolean;\n\n constructor(\n permissions: DBPermissionSet,\n tableName: TableNames,\n isOwner: boolean\n ) {\n this.permissions = permissions || {};\n this.tableName = tableName;\n this.isOwner = isOwner;\n }\n\n add(...tableNames: TableNames[]): boolean {\n // If user can manage the whole realm, return true.\n if (this.permissions.manage === '*') return true;\n // If user can manage given table in realm, return true\n if (this.permissions.manage?.includes(this.tableName)) return true;\n // If user can add any type, return true\n if (this.permissions.add === '*') return true;\n // If user can add objects into given table names in the realm, return true\n if (\n tableNames.every((tableName) => this.permissions.add?.includes(tableName))\n ) {\n return true;\n }\n return false;\n }\n\n update(...props: KeyPaths<T>[]): boolean {\n // If user is owner of this object, or if user can manage the whole realm, return true.\n if (this.isOwner || this.permissions.manage === '*') return true;\n // If user can manage given table in realm, return true\n if (this.permissions.manage?.includes(this.tableName)) return true;\n // If user can update any prop in any table in this realm, return true unless\n // it regards to ownership change:\n if (this.permissions.update === '*') {\n // @ts-ignore\n return props.every((prop) => prop !== 'owner');\n }\n const tablePermissions = this.permissions.update?.[this.tableName];\n // If user can update any prop in table and realm, return true unless\n // accessing special props owner or realmId\n if (tablePermissions === '*')\n return props.every((prop) => prop !== 'owner');\n\n // Explicitely listed properties to allow updates on:\n return props.every((prop) =>\n tablePermissions?.some(\n (permittedProp) =>\n permittedProp === prop || (permittedProp === '*' && prop !== 'owner')\n )\n );\n }\n\n delete(): boolean {\n // If user is owner of this object, or if user can manage the whole realm, return true.\n if (this.isOwner || this.permissions.manage === '*') return true;\n // If user can manage given table in realm, return true\n if (this.permissions.manage?.includes(this.tableName)) return true;\n return false;\n }\n}\n","import { Dexie, liveQuery } from 'dexie';\nimport { DBRealmMember } from 'dexie-cloud-common';\nimport { combineLatest } from 'rxjs';\nimport { map, switchMap } from 'rxjs/operators';\nimport { associate } from './associate';\nimport { createSharedValueObservable } from './createSharedValueObservable';\nimport { getCurrentUserEmitter } from './currentUserEmitter';\nimport { getInternalAccessControlObservable } from './getInternalAccessControlObservable';\nimport { getPermissionsLookupObservable } from './getPermissionsLookupObservable';\nimport { Invite } from './Invite';\nimport { mapValueObservable } from './mapValueObservable';\n\nexport const getInvitesObservable = associate((db: Dexie) => {\n const membersByEmail = getCurrentUserEmitter(db._novip).pipe(\n switchMap((currentUser) =>\n liveQuery(() =>\n db.members.where({ email: currentUser.email || '' }).toArray()\n )\n )\n );\n const permissions = getPermissionsLookupObservable(db._novip);\n const accessControl = getInternalAccessControlObservable(db._novip);\n return createSharedValueObservable(\n combineLatest([membersByEmail, accessControl, permissions]).pipe(\n map(([membersByEmail, accessControl, realmLookup]) => {\n const reducer = (\n result: { [id: string]: Invite },\n m: DBRealmMember\n ) => ({ ...result, [m.id!]: { ...m, realm: realmLookup[m.realmId] } });\n const emailMembersById = membersByEmail.reduce(reducer, {});\n const membersById = accessControl.selfMembers.reduce(\n reducer,\n emailMembersById\n );\n return Object.values(membersById)\n .filter((invite: DBRealmMember) => !invite.accepted)\n .map(\n (invite: DBRealmMember) =>\n ({\n ...invite,\n async accept() {\n await db.members.update(invite.id!, { accepted: new Date() });\n },\n async reject() {\n await db.members.update(invite.id!, { rejected: new Date() });\n },\n } satisfies Invite)\n );\n })\n ),\n []\n );\n});\n","import { cmp, Table } from 'dexie';\nimport type { DexieCloudDB } from '../db/DexieCloudDB';\nimport { getAwarenessLibrary, awarenessWeakMap } from './awareness';\nimport { DEXIE_CLOUD_SYNCER_ID } from '../sync/DEXIE_CLOUD_SYNCER_ID';\nimport * as Y from 'yjs';\nimport { combineLatest, startWith } from 'rxjs';\nimport { YDocumentOpen } from 'dexie-cloud-common';\nimport { isEagerSyncDisabled } from '../isEagerSyncDisabled';\nimport { PersistedSyncState } from '../db/entities/PersistedSyncState';\nimport { getOpenDocSignal } from './reopenDocSignal';\nimport { DexieYProvider, DexieYDocMeta } from 'y-dexie';\n\nexport function createYHandler(db: DexieCloudDB) {\n return (provider: import('y-dexie').DexieYProvider) => {\n const doc = provider.doc;\n if (!doc) {\n throw new Error(\n 'Internal error: DexieYProvider.createYHandler called without a doc. This is unexpected.'\n );\n }\n const { parentTable } = doc.meta || ({} as DexieYDocMeta);\n if (!db.cloud.schema?.[parentTable].markedForSync) {\n return; // The table that holds the doc is not marked for sync - leave it to dexie. No syncing, no awareness.\n }\n let awareness: import('y-protocols/awareness').Awareness;\n Object.defineProperty(provider, 'awareness', {\n get() {\n if (awareness) return awareness;\n awareness = createAwareness(db, doc, provider);\n awarenessWeakMap.set(doc, awareness);\n return awareness;\n },\n });\n };\n}\n\nfunction createAwareness(\n db: DexieCloudDB,\n doc: Y.Doc,\n provider: DexieYProvider\n) {\n const { parentTable, parentId, parentProp, updatesTable } =\n doc.meta as DexieYDocMeta;\n const awap = getAwarenessLibrary(db);\n const awareness = new awap.Awareness(doc);\n const reopenDocSignal = getOpenDocSignal(doc);\n\n awareness.on('update', ({ added, updated, removed }, origin: any) => {\n // Send the update\n const changedClients = added.concat(updated).concat(removed);\n const user = db.cloud.currentUser.value;\n if (origin !== 'server' && user.isLoggedIn && !isEagerSyncDisabled(db)) {\n const update = awap.encodeAwarenessUpdate(awareness!, changedClients);\n db.messageProducer.next({\n type: 'aware',\n table: parentTable,\n prop: parentProp,\n k: doc.meta.parentId,\n u: update,\n });\n if (provider.destroyed) {\n // We're called from awareness.on('destroy') that did\n // removeAwarenessStates.\n // It's time to also send the doc-close message that dexie-cloud understands\n // and uses to stop subscribing for updates and awareness updates and brings\n // down the cached information in memory on the WS connection for this.\n db.messageProducer.next({\n type: 'doc-close',\n table: parentTable,\n prop: parentProp,\n k: doc.meta.parentId,\n });\n }\n }\n });\n awareness.on('destroy', () => {\n // Signal to server that this provider is destroyed (the update event will be triggered, which\n // in turn will trigger db.messageProducer that will send the message to the server if WS is connected)\n awap.removeAwarenessStates(\n awareness!,\n [doc.clientID],\n 'provider destroyed'\n );\n });\n\n // Open the document on the server\n (async () => {\n if (provider.destroyed) return;\n let connected = false;\n let currentFlowId = 1;\n const subscription = combineLatest([\n db.cloud.webSocketStatus, // Wake up when webSocket status changes\n reopenDocSignal.pipe(startWith(null)), // Wake up when reopenDocSignal emits\n ]).subscribe(([wsStatus]) => {\n if (provider.destroyed) return;\n // Keep \"connected\" state in a variable so we can check it after async operations\n connected = wsStatus === 'connected';\n\n // We are or got connected. Open the document on the server.\n const user = db.cloud.currentUser.value;\n if (\n wsStatus === 'connected' &&\n user.isLoggedIn &&\n !isEagerSyncDisabled(db)\n ) {\n ++currentFlowId;\n openDocumentOnServer().catch((error) => {\n console.warn(`Error catched in createYHandler.ts: ${error}`);\n });\n }\n });\n // Wait until WebSocket is connected\n provider.addCleanupHandler(subscription);\n\n /** Sends an 'doc-open' message to server whenever websocket becomes\n * connected, or if it is already connected.\n * The flow is aborted in case websocket is disconnected while querying\n * information required to compute the state vector. Flow is also\n * aborted in case document or provider has been destroyed during\n * the async parts of the task.\n *\n * The state vector is only computed from the updates that have occured\n * after the last full sync - which could very often be zero - in which\n * case no state vector is sent (then the server already knows us by\n * revision)\n *\n * When server gets the doc-open message, it will authorize us for\n * whether we are allowed to read / write to this document, and then\n * keep the cached information in memory on the WS connection for this\n * particular document, as well as subscribe to updates and awareness updates\n * from other clients on the document.\n */\n async function openDocumentOnServer() {\n const myFlow = currentFlowId; // So we can abort when a new flow is started\n const yTbl = db.table(updatesTable);\n const syncStateTbl = db.$syncState as Table<\n PersistedSyncState,\n 'syncState'\n >;\n const [receivedUntil, yServerRev] = await db.transaction(\n 'r',\n syncStateTbl,\n yTbl,\n async () => {\n const syncState = await yTbl.get(DEXIE_CLOUD_SYNCER_ID);\n const persistedSyncState = await syncStateTbl.get('syncState');\n return [\n syncState?.receivedUntil || 0,\n persistedSyncState?.yServerRevision ||\n persistedSyncState?.serverRevision,\n ];\n }\n );\n\n // After every await, check if we still should be working on this task.\n if (provider.destroyed || currentFlowId !== myFlow || !connected) return;\n\n const docOpenMsg: YDocumentOpen = {\n type: 'doc-open',\n table: parentTable,\n prop: parentProp,\n k: parentId,\n serverRev: yServerRev,\n };\n const serverUpdatesSinceLastSync = await yTbl\n .where('i')\n .between(receivedUntil, Infinity, false)\n .filter(\n (update) =>\n cmp(update.k, parentId) === 0 && // Only updates for this document\n ((update.f || 0) & 1) === 0 // Don't include local changes\n )\n .toArray();\n // After every await, check if we still should be working on this task.\n if (provider.destroyed || currentFlowId !== myFlow || !connected) return;\n\n if (serverUpdatesSinceLastSync.length > 0) {\n const mergedUpdate = Y.mergeUpdatesV2(\n serverUpdatesSinceLastSync.map((update) => update.u)\n );\n const stateVector = Y.encodeStateVectorFromUpdateV2(mergedUpdate);\n docOpenMsg.sv = stateVector;\n }\n db.messageProducer.next(docOpenMsg);\n }\n })();\n return awareness;\n}\n","import Dexie, { liveQuery, Subscription, Table } from 'dexie';\nimport {\n DBPermissionSet,\n DBRealmMember,\n getDbNameFromDbUrl,\n} from 'dexie-cloud-common';\nimport { BehaviorSubject, combineLatest, firstValueFrom, from, fromEvent, Subject } from 'rxjs';\nimport { filter, map, skip, startWith, switchMap, take } from 'rxjs/operators';\nimport { login } from './authentication/login';\nimport { UNAUTHORIZED_USER } from './authentication/UNAUTHORIZED_USER';\nimport { DexieCloudDB } from './db/DexieCloudDB';\nimport { PersistedSyncState } from './db/entities/PersistedSyncState';\nimport { DexieCloudOptions } from './DexieCloudOptions';\nimport { DISABLE_SERVICEWORKER_STRATEGY } from './DISABLE_SERVICEWORKER_STRATEGY';\nimport './extend-dexie-interface';\nimport { DexieCloudSyncOptions } from './DexieCloudSyncOptions';\nimport { IS_SERVICE_WORKER } from './helpers/IS_SERVICE_WORKER';\nimport { throwVersionIncrementNeeded } from './helpers/throwVersionIncrementNeeded';\nimport { createIdGenerationMiddleware } from './middlewares/createIdGenerationMiddleware';\nimport { createImplicitPropSetterMiddleware } from './middlewares/createImplicitPropSetterMiddleware';\nimport { createMutationTrackingMiddleware } from './middlewares/createMutationTrackingMiddleware';\n//import { dexieCloudSyncProtocol } from \"./dexieCloudSyncProtocol\";\nimport { overrideParseStoresSpec } from './overrideParseStoresSpec';\nimport { performInitialSync } from './performInitialSync';\nimport { connectWebSocket } from './sync/connectWebSocket';\nimport { isSyncNeeded } from './sync/isSyncNeeded';\nimport { LocalSyncWorker } from './sync/LocalSyncWorker';\nimport {\n registerPeriodicSyncEvent,\n registerSyncEvent,\n} from './sync/registerSyncEvent';\nimport { triggerSync } from './sync/triggerSync';\nimport { DXCUserInteraction } from './types/DXCUserInteraction';\nimport { SyncState } from './types/SyncState';\nimport { updateSchemaFromOptions } from './updateSchemaFromOptions';\nimport { verifySchema } from './verifySchema';\nimport { setupDefaultGUI } from './default-ui';\nimport { DXCWebSocketStatus } from './DXCWebSocketStatus';\nimport { computeSyncState } from './computeSyncState';\nimport { generateKey } from './middleware-helpers/idGenerationHelpers';\nimport { permissions } from './permissions';\nimport { getCurrentUserEmitter } from './currentUserEmitter';\nimport { NewIdOptions } from './types/NewIdOptions';\nimport { getInvitesObservable } from './getInvitesObservable';\nimport { getGlobalRolesObservable } from './getGlobalRolesObservable';\nimport { UserLogin } from './db/entities/UserLogin';\nimport { InvalidLicenseError } from './InvalidLicenseError';\nimport { logout, _logout } from './authentication/logout';\nimport { loadAccessToken } from './authentication/authenticate';\nimport { isEagerSyncDisabled } from './isEagerSyncDisabled';\nimport { createYHandler } from \"./yjs/createYHandler\";\nimport { DexieYProvider } from 'y-dexie';\nexport { DexieCloudTable } from './DexieCloudTable';\nexport * from './getTiedRealmId';\nexport {\n DBRealm,\n DBRealmMember,\n DBRealmRole,\n DBSyncedObject,\n DBPermissionSet,\n} from 'dexie-cloud-common';\nexport { resolveText } from './helpers/resolveText';\nexport { Invite } from './Invite';\nexport type { UserLogin, DXCWebSocketStatus, SyncState };\nexport type { DexieCloudSyncOptions };\nexport type { DexieCloudOptions, PeriodicSyncOptions } from './DexieCloudOptions';\nexport * from './types/DXCAlert';\nexport * from './types/DXCInputField';\nexport * from './types/DXCUserInteraction';\nexport { defineYDocTrigger } from './define-ydoc-trigger';\n\nconst DEFAULT_OPTIONS: Partial<DexieCloudOptions> = {\n nameSuffix: true,\n};\n\nexport function dexieCloud(dexie: Dexie) {\n const origIdbName = dexie.name;\n //\n //\n //\n const currentUserEmitter = getCurrentUserEmitter(dexie);\n const subscriptions: Subscription[] = [];\n let configuredProgramatically = false;\n\n // local sync worker - used when there's no service worker.\n let localSyncWorker: { start: () => void; stop: () => void } | null = null;\n dexie.on(\n 'ready',\n async (dexie: Dexie) => {\n try {\n await onDbReady(dexie);\n } catch (error) {\n console.error(error);\n // Make sure to succeed with database open even if network is down.\n }\n },\n true // true = sticky\n );\n\n /** Void starting subscribers after a close has happened. */\n let closed = false;\n function throwIfClosed() {\n if (closed) throw new Dexie.DatabaseClosedError();\n }\n\n dexie.once('close', () => {\n subscriptions.forEach((subscription) => subscription.unsubscribe());\n subscriptions.splice(0, subscriptions.length);\n closed = true;\n localSyncWorker && localSyncWorker.stop();\n localSyncWorker = null;\n currentUserEmitter.next(UNAUTHORIZED_USER);\n });\n\n const syncComplete = new Subject<void>();\n\n dexie.cloud = {\n // @ts-ignore\n version: __VERSION__,\n options: { ...DEFAULT_OPTIONS } as DexieCloudOptions,\n schema: null,\n get currentUserId() {\n return currentUserEmitter.value.userId || UNAUTHORIZED_USER.userId!;\n },\n currentUser: currentUserEmitter,\n syncState: new BehaviorSubject<SyncState>({\n phase: 'initial',\n status: 'not-started',\n }),\n\n events: {\n syncComplete,\n },\n\n persistedSyncState: new BehaviorSubject<PersistedSyncState | undefined>(\n undefined\n ),\n userInteraction: new BehaviorSubject<DXCUserInteraction | undefined>(\n undefined\n ),\n webSocketStatus: new BehaviorSubject<DXCWebSocketStatus>('not-started'),\n async login(hint) {\n const db = DexieCloudDB(dexie);\n await db.cloud.sync();\n await login(db, hint);\n },\n invites: getInvitesObservable(dexie),\n roles: getGlobalRolesObservable(dexie),\n configure(options: DexieCloudOptions) {\n options = dexie.cloud.options = { ...dexie.cloud.options, ...options };\n configuredProgramatically = true;\n if (options.databaseUrl && options.nameSuffix) {\n // @ts-ignore\n dexie.name = `${origIdbName}-${getDbNameFromDbUrl(\n options.databaseUrl\n )}`;\n DexieCloudDB(dexie).reconfigure(); // Update observable from new dexie.name\n }\n updateSchemaFromOptions(dexie.cloud.schema, dexie.cloud.options);\n },\n async logout({ force } = {}) {\n force\n ? await _logout(DexieCloudDB(dexie), { deleteUnsyncedData: true })\n : await logout(DexieCloudDB(dexie));\n },\n async sync(\n { wait, purpose }: DexieCloudSyncOptions = { wait: true, purpose: 'push' }\n ) {\n if (wait === undefined) wait = true;\n const db = DexieCloudDB(dexie);\n const licenseStatus = db.cloud.currentUser.value.license?.status || 'ok';\n if (licenseStatus !== 'ok') {\n // Refresh access token to check for updated license\n await loadAccessToken(db);\n }\n if (purpose === 'pull') {\n const syncState = db.cloud.persistedSyncState.value;\n triggerSync(db, purpose);\n if (wait) {\n const newSyncState = await firstValueFrom(\n db.cloud.persistedSyncState.pipe(\n filter(\n (newSyncState) =>\n newSyncState?.timestamp != null &&\n (!syncState || newSyncState.timestamp > syncState.timestamp!)\n )\n )\n );\n if (newSyncState?.error) {\n throw new Error(`Sync error: ` + newSyncState.error);\n }\n }\n } else if (await isSyncNeeded(db)) {\n const syncState = db.cloud.persistedSyncState.value;\n triggerSync(db, purpose);\n if (wait) {\n console.debug('db.cloud.login() is waiting for sync completion...');\n await firstValueFrom(\n from(\n liveQuery(async () => {\n const syncNeeded = await isSyncNeeded(db);\n const newSyncState = await db.getPersistedSyncState();\n if (\n newSyncState?.timestamp !== syncState?.timestamp &&\n newSyncState?.error\n )\n throw new Error(`Sync error: ` + newSyncState.error);\n return syncNeeded;\n })\n ).pipe(filter((isNeeded) => !isNeeded))\n );\n console.debug(\n 'Done waiting for sync completion because we have nothing to push anymore'\n );\n }\n }\n },\n permissions(\n obj: { owner: string; realmId: string; table?: () => string },\n tableName?: string\n ) {\n return permissions(dexie._novip, obj, tableName);\n },\n };\n\n dexie.Version.prototype['_parseStoresSpec'] = Dexie.override(\n dexie.Version.prototype['_parseStoresSpec'],\n (origFunc) => overrideParseStoresSpec(origFunc, dexie)\n );\n\n dexie.Table.prototype.newId = function (\n this: Table<any>,\n { colocateWith }: NewIdOptions = {}\n ) {\n const shardKey =\n colocateWith && colocateWith.substr(colocateWith.length - 3);\n return generateKey(dexie.cloud.schema![this.name].idPrefix || '', shardKey);\n };\n\n dexie.Table.prototype.idPrefix = function (this: Table<any>) {\n return this.db.cloud.schema?.[this.name]?.idPrefix || '';\n };\n\n dexie.use(\n createMutationTrackingMiddleware({\n currentUserObservable: dexie.cloud.currentUser,\n db: DexieCloudDB(dexie),\n })\n );\n dexie.use(createImplicitPropSetterMiddleware(DexieCloudDB(dexie)));\n dexie.use(createIdGenerationMiddleware(DexieCloudDB(dexie)));\n\n async function onDbReady(dexie: Dexie) {\n closed = false; // As Dexie calls us, we are not closed anymore. Maybe reopened? Remember db.ready event is registered with sticky flag!\n const db = DexieCloudDB(dexie);\n // Setup default GUI:\n if (typeof window !== 'undefined' && typeof document !== 'undefined') {\n if (!db.cloud.options?.customLoginGui) {\n subscriptions.push(setupDefaultGUI(dexie));\n }\n }\n if (!db.cloud.isServiceWorkerDB) {\n subscriptions.push(computeSyncState(db).subscribe(dexie.cloud.syncState));\n }\n\n // Forward db.syncCompleteEvent to be publicly consumable via db.cloud.events.syncComplete:\n subscriptions.push(db.syncCompleteEvent.subscribe(syncComplete));\n\n //verifyConfig(db.cloud.options); Not needed (yet at least!)\n // Verify the user has allowed version increment.\n if (!db.tables.every((table) => table.core)) {\n throwVersionIncrementNeeded();\n }\n const swRegistrations =\n 'serviceWorker' in navigator\n ? await navigator.serviceWorker.getRegistrations()\n : [];\n\n const [initiallySynced, lastSyncedRealms] = await db.transaction(\n 'rw',\n db.$syncState,\n async () => {\n const { options, schema } = db.cloud;\n const [persistedOptions, persistedSchema, persistedSyncState] =\n await Promise.all([\n db.getOptions(),\n db.getSchema(),\n db.getPersistedSyncState(),\n ]);\n if (!configuredProgramatically) {\n // Options not specified programatically (use case for SW!)\n // Take persisted options:\n db.cloud.options = persistedOptions || null;\n } else if (\n !persistedOptions ||\n JSON.stringify(persistedOptions) !== JSON.stringify(options)\n ) {\n // Update persisted options:\n if (!options) throw new Error(`Internal error`); // options cannot be null if configuredProgramatically is set.\n const newPersistedOptions: DexieCloudOptions = {\n ...options,\n };\n delete newPersistedOptions.fetchTokens;\n delete newPersistedOptions.awarenessProtocol;\n await db.$syncState.put(newPersistedOptions, 'options');\n }\n if (\n db.cloud.options?.tryUseServiceWorker &&\n 'serviceWorker' in navigator &&\n swRegistrations.length > 0 &&\n !DISABLE_SERVICEWORKER_STRATEGY\n ) {\n // * Configured for using service worker if available.\n // * Browser supports service workers\n // * There are at least one service worker registration\n console.debug('Dexie Cloud Addon: Using service worker');\n db.cloud.usingServiceWorker = true;\n } else {\n // Not configured for using service worker or no service worker\n // registration exists. Don't rely on service worker to do any job.\n // Use LocalSyncWorker instead.\n if (\n db.cloud.options?.tryUseServiceWorker &&\n !db.cloud.isServiceWorkerDB\n ) {\n console.debug(\n 'dexie-cloud-addon: Not using service worker.',\n swRegistrations.length === 0\n ? 'No SW registrations found.'\n : 'serviceWorker' in navigator && DISABLE_SERVICEWORKER_STRATEGY\n ? 'Avoiding SW background sync and SW periodic bg sync for this browser due to browser bugs.'\n : 'navigator.serviceWorker not present'\n );\n }\n db.cloud.usingServiceWorker = false;\n }\n updateSchemaFromOptions(schema, db.cloud.options);\n updateSchemaFromOptions(persistedSchema, db.cloud.options);\n if (!schema) {\n // Database opened dynamically (use case for SW!)\n // Take persisted schema:\n db.cloud.schema = persistedSchema || null;\n } else if (\n !persistedSchema ||\n JSON.stringify(persistedSchema) !== JSON.stringify(schema)\n ) {\n // Update persisted schema (but don't overwrite table prefixes)\n const newPersistedSchema = persistedSchema || {};\n for (const [table, tblSchema] of Object.entries(schema)) {\n const newTblSchema = newPersistedSchema[table];\n if (!newTblSchema) {\n newPersistedSchema[table] = { ...tblSchema };\n } else {\n newTblSchema.markedForSync = tblSchema.markedForSync;\n tblSchema.deleted = newTblSchema.deleted;\n newTblSchema.generatedGlobalId = tblSchema.generatedGlobalId;\n }\n }\n await db.$syncState.put(newPersistedSchema, 'schema');\n\n // Make sure persisted table prefixes are being used instead of computed ones:\n // Let's assign all props as the newPersistedSchems should be what we should be working with.\n Object.assign(schema, newPersistedSchema);\n }\n return [persistedSyncState?.initiallySynced, persistedSyncState?.realms];\n }\n );\n\n if (initiallySynced) {\n db.setInitiallySynced(true);\n }\n\n verifySchema(db);\n\n // Manage CurrentUser observable:\n throwIfClosed();\n if (!db.cloud.isServiceWorkerDB) {\n subscriptions.push(\n liveQuery(() => db.getCurrentUser()).subscribe(currentUserEmitter)\n );\n // Manage PersistendSyncState observable:\n subscriptions.push(\n liveQuery(() => db.getPersistedSyncState()).subscribe(\n db.cloud.persistedSyncState\n )\n );\n // Wait till currentUser and persistedSyncState gets populated\n // with things from the database and not just the default values.\n // This is so that when db.open() completes, user should be safe\n // to subscribe to these observables and get actual data.\n await firstValueFrom(combineLatest([\n currentUserEmitter.pipe(skip(1), take(1)),\n db.cloud.persistedSyncState.pipe(skip(1), take(1)),\n ]));\n\n const yHandler = createYHandler(db);\n DexieYProvider.on.new.subscribe(yHandler);\n db.dx.once('close', () => {\n DexieYProvider.on.new.unsubscribe(yHandler);\n });\n }\n\n // HERE: If requireAuth, do athentication now.\n let changedUser = false;\n const user = await db.getCurrentUser();\n const requireAuth = db.cloud.options?.requireAuth;\n if (requireAuth) {\n if (db.cloud.isServiceWorkerDB) {\n // If this is a service worker DB, we can't do authentication here,\n // we just wait until the application has done it.\n console.debug('Dexie Cloud Service worker. Waiting for application to authenticate.');\n await firstValueFrom(currentUserEmitter.pipe(filter((user) => !!user.isLoggedIn), take(1)));\n console.debug('Dexie Cloud Service worker. Application has authenticated.');\n } else {\n if (typeof requireAuth === 'object') {\n // requireAuth contains login hints. Check if we already fulfil it:\n if (\n !user.isLoggedIn ||\n (requireAuth.userId && user.userId !== requireAuth.userId) ||\n (requireAuth.email && user.email !== requireAuth.email)\n ) {\n // If not, login the configured user:\n changedUser = await login(db, requireAuth);\n }\n } else if (!user.isLoggedIn) {\n // requireAuth is true and user is not logged in\n changedUser = await login(db);\n }\n }\n }\n if (user.isLoggedIn && (!lastSyncedRealms || !lastSyncedRealms.includes(user.userId!))) {\n // User has been logged in but this is not reflected in the sync state.\n // This can happen if page is reloaded after login but before the sync call following\n // the login was complete.\n // The user is to be viewed as changed becuase current syncState does not reflect the presence\n // of the logged-in user.\n changedUser = true; // Set changedUser to true to trigger a pull-sync later down.\n }\n\n if (localSyncWorker) localSyncWorker.stop();\n localSyncWorker = null;\n throwIfClosed();\n\n const doInitialSync = db.cloud.options?.databaseUrl && (!initiallySynced || changedUser);\n if (doInitialSync) {\n // Do the initial sync directly in the browser thread no matter if we are using service worker or not.\n await performInitialSync(db, db.cloud.options!, db.cloud.schema!);\n db.setInitiallySynced(true);\n }\n\n throwIfClosed();\n if (db.cloud.usingServiceWorker && db.cloud.options?.databaseUrl) {\n if (!doInitialSync) {\n registerSyncEvent(db, 'push').catch(() => {});\n }\n registerPeriodicSyncEvent(db).catch(() => {});\n } else if (\n db.cloud.options?.databaseUrl &&\n db.cloud.schema &&\n !db.cloud.isServiceWorkerDB\n ) {\n // There's no SW. Start SyncWorker instead.\n localSyncWorker = LocalSyncWorker(db, db.cloud.options, db.cloud.schema!);\n localSyncWorker.start();\n if (!doInitialSync) {\n triggerSync(db, 'push');\n }\n }\n\n // Listen to online event and do sync.\n throwIfClosed();\n if (!db.cloud.isServiceWorkerDB) {\n subscriptions.push(\n fromEvent(self, 'online').subscribe(() => {\n console.debug('online!');\n db.syncStateChangedEvent.next({\n phase: 'not-in-sync',\n });\n if (!isEagerSyncDisabled(db)) {\n triggerSync(db, 'push');\n }\n }),\n fromEvent(self, 'offline').subscribe(() => {\n console.debug('offline!');\n db.syncStateChangedEvent.next({\n phase: 'offline',\n });\n })\n );\n }\n\n // Connect WebSocket unless we are in a service worker or websocket is disabled.\n if (\n db.cloud.options?.databaseUrl &&\n !db.cloud.options?.disableWebSocket &&\n !IS_SERVICE_WORKER\n ) {\n subscriptions.push(connectWebSocket(db));\n }\n }\n}\n\n// @ts-ignore\ndexieCloud.version = __VERSION__;\n\nDexie.Cloud = dexieCloud;\n\nexport default dexieCloud;\n","import { combineLatest, Observable, of } from 'rxjs';\nimport { debounceTime, map, startWith, switchMap } from 'rxjs/operators';\nimport { getCurrentUserEmitter } from './currentUserEmitter';\nimport { DexieCloudDB, SyncStateChangedEventData } from './db/DexieCloudDB';\nimport { isOnline } from './sync/isOnline';\nimport { SyncState } from './types/SyncState';\nimport { userIsActive, userIsReallyActive } from './userIsActive';\n\nexport function computeSyncState(db: DexieCloudDB): Observable<SyncState> {\n let _prevStatus = db.cloud.webSocketStatus.value;\n const lazyWebSocketStatus = db.cloud.webSocketStatus.pipe(\n switchMap((status) => {\n const prevStatus = _prevStatus;\n _prevStatus = status;\n const rv = of(status);\n switch (status) {\n // A normal scenario is that the WS reconnects and falls shortly in disconnected-->connection-->connected.\n // Don't distract user with this unless these things take more time than normal:\n\n // Only show disconnected if disconnected more than 500ms, or if we can\n // see that the user is indeed not active.\n case 'disconnected':\n return userIsActive.value ? rv.pipe(debounceTime(500)) : rv;\n\n // Only show connecting if previous state was 'not-started' or 'error', or if\n // the time it takes to connect goes beyond 4 seconds.\n case 'connecting':\n return prevStatus === 'not-started' || prevStatus === 'error'\n ? rv\n : rv.pipe(debounceTime(4000));\n default:\n return rv;\n }\n })\n );\n return combineLatest([\n lazyWebSocketStatus,\n db.syncStateChangedEvent.pipe(startWith({ phase: 'initial' } as SyncStateChangedEventData)),\n getCurrentUserEmitter(db.dx._novip),\n userIsReallyActive\n ]).pipe(\n map(([status, syncState, user, userIsActive]) => {\n if (user.license?.status && user.license.status !== 'ok') {\n return {\n phase: 'offline',\n status: 'offline',\n license: user.license.status\n } satisfies SyncState;\n }\n let { phase, error, progress } = syncState;\n let adjustedStatus = status;\n if (phase === 'error') {\n // Let users only rely on the status property to display an icon.\n // If there's an error in the sync phase, let it show on that\n // status icon also.\n adjustedStatus = 'error';\n }\n if (status === 'not-started') {\n // If websocket isn't yet connected becase we're doing\n // the startup sync, let the icon show the symbol for connecting.\n if (phase === 'pushing' || phase === 'pulling') {\n adjustedStatus = 'connecting';\n }\n } \n const previousPhase = db.cloud.syncState.value.phase;\n //const previousStatus = db.cloud.syncState.value.status;\n if (previousPhase === 'error' && (syncState.phase === 'pushing' || syncState.phase === 'pulling')) {\n // We were in an errored state but is now doing sync. Show \"connecting\" icon.\n adjustedStatus = 'connecting';\n }\n /*if (syncState.phase === 'in-sync' && adjustedStatus === 'connecting') {\n adjustedStatus = 'connected';\n }*/\n \n if (!userIsActive) {\n adjustedStatus = 'disconnected';\n }\n\n const retState: SyncState = {\n phase,\n error,\n progress,\n status: isOnline ? adjustedStatus : 'offline',\n license: 'ok'\n };\n\n return retState;\n })\n );\n}\n","import Dexie from \"dexie\";\n\nexport function throwVersionIncrementNeeded() {\n throw new Dexie.SchemaError(\n `Version increment needed to allow dexie-cloud change tracking`\n );\n}\n","import Dexie from \"dexie\";\nimport { DexieCloudDB } from \"./db/DexieCloudDB\";\n\nexport function verifySchema(db: DexieCloudDB) {\n for (const table of db.tables) {\n if (db.cloud.schema?.[table.name]?.markedForSync) {\n if (table.schema.primKey.auto) {\n throw new Dexie.SchemaError(\n `Table ${table.name} is both autoIncremented and synced. ` +\n `Use db.cloud.configure({unsyncedTables: [${JSON.stringify(\n table.name\n )}]}) to blacklist it from sync`\n );\n }\n if (!table.schema.primKey.keyPath) {\n throw new Dexie.SchemaError(\n `Table ${table.name} cannot be both synced and outbound. ` +\n `Use db.cloud.configure({unsyncedTables: [${JSON.stringify(\n table.name\n )}]}) to blacklist it from sync`\n );\n }\n }\n }\n}\n","import { DexieCloudSchema } from 'dexie-cloud-common';\nimport { DexieCloudDB } from './db/DexieCloudDB';\nimport { DexieCloudOptions } from './DexieCloudOptions';\nimport { CURRENT_SYNC_WORKER, sync } from './sync/sync';\nimport { performGuardedJob } from './sync/performGuardedJob';\n\nexport async function performInitialSync(\n db: DexieCloudDB,\n cloudOptions: DexieCloudOptions,\n cloudSchema: DexieCloudSchema\n) {\n console.debug('Performing initial sync'); \n await performGuardedJob(\n db,\n CURRENT_SYNC_WORKER,\n () => sync(db, cloudOptions, cloudSchema, { isInitialSync: true })\n );\n console.debug('Done initial sync');\n}\n","import Dexie, { DBCore, DBCoreTransaction, Middleware } from 'dexie';\nimport { DexieCloudDB } from '../db/DexieCloudDB';\nimport { TXExpandos } from '../types/TXExpandos';\nimport { UNAUTHORIZED_USER } from '../authentication/UNAUTHORIZED_USER';\n\nexport function createImplicitPropSetterMiddleware(\n db: DexieCloudDB\n): Middleware<DBCore> {\n return {\n stack: 'dbcore',\n name: 'implicitPropSetterMiddleware',\n level: 1,\n create: (core) => {\n return {\n ...core,\n table: (tableName) => {\n const table = core.table(tableName);\n return {\n ...table,\n mutate: (req) => {\n const trans = req.trans as DBCoreTransaction & TXExpandos & IDBTransaction;\n\n if (trans.disableChangeTracking) {\n return table.mutate(req);\n }\n\n const currentUserId = trans.currentUser?.userId ?? UNAUTHORIZED_USER.userId;\n\n if (db.cloud.schema?.[tableName]?.markedForSync) {\n if (req.type === 'add' || req.type === 'put') {\n if (tableName === 'members') {\n for (const member of req.values) {\n if (typeof member.email === 'string') {\n // Resolve https://github.com/dexie/dexie-cloud/issues/4\n // If adding a member, make sure email is lowercase and trimmed.\n // This is to avoid issues where the APP does not check this\n // and just allows the user to enter an email address that might\n // have been pasted by the user from a source that had a trailing\n // space or was in uppercase. We want to avoid that the user\n // creates a new member with a different email address than\n // the one he/she intended to create.\n member.email = member.email.trim().toLowerCase();\n }\n }\n }\n // No matter if user is logged in or not, make sure \"owner\" and \"realmId\" props are set properly.\n // If not logged in, this will be changed upon syncification of the tables (next sync after login),\n // however, application code will work better if we can always rely on that the properties realmId\n // and owner are set. Application code may index them and query them based on db.cloud.currentUserId,\n // and expect them to be returned. That scenario must work also when db.cloud.currentUserId === 'unauthorized'.\n for (const obj of req.values) {\n if (!obj.owner) {\n obj.owner = currentUserId;\n }\n if (!obj.realmId) {\n obj.realmId = currentUserId;\n }\n const key = table.schema.primaryKey.extractKey?.(obj);\n if (typeof key === 'string' && key[0] === '#') {\n // Add $ts prop for put operations and\n // disable update operations as well as consistent\n // modify operations. Reason: Server may not have\n // the object. Object should be created on server only\n // if is being updated. An update operation won't create it\n // so we must delete req.changeSpec to degrade operation to\n // an upsert operation with timestamp so that it will be created.\n // We must also degrade from consistent modify operations for the\n // same reason - object might be there on server. Must but put up instead.\n\n // FUTURE: This clumpsy behavior of private IDs could be refined later.\n // Suggestion is to in future, treat private IDs as we treat all objects \n // and sync operations normally. Only that deletions should become soft deletes\n // for them - so that server knows when a private ID has been deleted on server\n // not accept insert/upserts on them.\n if (req.type === 'put') {\n const now = Date.now();\n delete req.criteria;\n delete req.changeSpec;\n delete req.updates;\n obj.$ts = Date.now();\n }\n }\n }\n }\n }\n return table.mutate(req);\n },\n };\n },\n };\n },\n };\n}\n","export function getDbNameFromDbUrl(dbUrl) {\n const url = new URL(dbUrl);\n return url.pathname === \"/\"\n ? url.hostname.split('.')[0]\n : url.pathname.split('/')[1];\n}\n","import Dexie, { liveQuery } from 'dexie';\nimport { DBRealmMember } from 'dexie-cloud-common';\nimport { from, Observable } from 'rxjs';\nimport { map, startWith } from 'rxjs/operators';\nimport { mergePermissions } from './mergePermissions';\nimport {\n getPermissionsLookupObservable,\n PermissionsLookup,\n} from './getPermissionsLookupObservable';\nimport { PermissionChecker } from './PermissionChecker';\nimport './extend-dexie-interface';\n\nexport function permissions(\n dexie: Dexie,\n obj: { owner?: string; realmId?: string; table?: () => string },\n tableName?: string\n): Observable<PermissionChecker<any>> {\n if (!obj)\n throw new TypeError(\n `Cannot check permissions of undefined or null. A Dexie Cloud object with realmId and owner expected.`\n );\n const { owner, realmId } = obj;\n if (!tableName) {\n if (typeof obj.table !== 'function') {\n throw new TypeError(\n `Missing 'table' argument to permissions and table could not be extracted from entity`\n );\n }\n tableName = obj.table();\n }\n const source = getPermissionsLookupObservable(dexie);\n const mapper = (permissionsLookup: PermissionsLookup) => {\n // If realmId is undefined, it can be due to that the object is not yet syncified - it exists\n // locally only as the user might not yet be authenticated. This is ok and we shall treat it\n // as if the realmId is dexie.cloud.currentUserId (which is \"unauthorized\" by the way)\n const realm = permissionsLookup[realmId || dexie.cloud.currentUserId];\n if (!realm)\n return new PermissionChecker(\n {},\n tableName!,\n !owner || owner === dexie.cloud.currentUserId\n );\n return new PermissionChecker(\n realm.permissions,\n tableName!,\n realmId === undefined || realmId === dexie.cloud.currentUserId || owner === dexie.cloud.currentUserId\n );\n };\n const o = source.pipe(map(mapper)) as Observable<PermissionChecker<any>> & {\n getValue: () => PermissionChecker<any>;\n };\n o.getValue = () => mapper(source.getValue());\n return o;\n}\n","import Dexie from 'dexie';\nimport { DexieCloudDB } from './db/DexieCloudDB';\nimport dexieCloud from './dexie-cloud-client';\nimport { DISABLE_SERVICEWORKER_STRATEGY } from './DISABLE_SERVICEWORKER_STRATEGY';\nimport { isSafari, safariVersion } from './isSafari';\nimport { syncIfPossible } from './sync/syncIfPossible';\nimport { SWMessageEvent } from './types/SWMessageEvent';\nimport { SyncEvent } from './types/SWSyncEvent';\n\n// In case the SW lives for a while, let it reuse already opened connections:\nconst managedDBs = new Map<string, DexieCloudDB>();\n\nfunction getDbNameFromTag(tag: string) {\n return tag.startsWith('dexie-cloud:') && tag.split(':')[1];\n}\n\nconst syncDBSemaphore = new Map<string, Promise<void>>();\n\nfunction syncDB(dbName: string, purpose: 'push' | 'pull') {\n // We're taking hight for being double-signalled both\n // via message event and sync event.\n // Which one comes first doesnt matter, just\n // that we return the existing promise if there is\n // an ongoing sync.\n let promise = syncDBSemaphore.get(dbName + '/' + purpose);\n if (!promise) {\n promise = _syncDB(dbName, purpose)\n .then(() => {\n // When legacy enough across browsers, use .finally() instead of then() and catch():\n syncDBSemaphore.delete(dbName + '/' + purpose);\n })\n .catch((error) => {\n syncDBSemaphore.delete(dbName + '/' + purpose);\n return Promise.reject(error);\n });\n syncDBSemaphore.set(dbName + '/' + purpose, promise!);\n }\n return promise!;\n\n async function _syncDB(dbName: string, purpose: 'push' | 'pull') {\n let db = managedDBs.get(dbName);\n\n if (!db) {\n console.debug('Dexie Cloud SW: Creating new Dexie instance for', dbName);\n const dexie = new Dexie(dbName, { addons: [dexieCloud] });\n db = DexieCloudDB(dexie);\n db.cloud.isServiceWorkerDB = true;\n dexie.on('versionchange', stopManagingDB);\n await db.dx.open(); // Makes sure db.cloud.options and db.cloud.schema are read from db,\n if (managedDBs.get(dbName)) {\n // Avoid race conditions.\n db.close();\n return await _syncDB(dbName, purpose);\n }\n managedDBs.set(dbName, db);\n }\n if (!db.cloud.options?.databaseUrl) {\n console.error(`Dexie Cloud: No databaseUrl configured`);\n return; // Nothing to sync.\n }\n if (!db.cloud.schema) {\n console.error(`Dexie Cloud: No schema persisted`);\n return; // Nothing to sync.\n }\n\n function stopManagingDB() {\n db!.dx.on.versionchange.unsubscribe(stopManagingDB);\n if (managedDBs.get(db!.name) === db) {\n // Avoid race conditions.\n managedDBs.delete(db!.name);\n }\n console.debug(`Dexie Cloud SW: Closing Dexie instance for ${dbName}`);\n db!.dx.close();\n return false;\n }\n\n try {\n console.debug('Dexie Cloud SW: Syncing');\n await syncIfPossible(db, db.cloud.options, db.cloud.schema, {\n retryImmediatelyOnFetchError: true,\n purpose,\n });\n console.debug('Dexie Cloud SW: Done Syncing');\n } catch (e) {\n console.error(`Dexie Cloud SW Error`, e);\n // Error occured. Stop managing this DB until we wake up again by a sync event,\n // which will open a new Dexie and start trying to sync it.\n stopManagingDB();\n if (e.name !== Dexie.errnames.NoSuchDatabase) {\n // Unless the error was that DB doesn't exist, rethrow to trigger sync retry.\n throw e; // Throw e to make syncEvent.waitUntil() receive a rejected promis, so it will retry.\n }\n }\n }\n}\n\n// Avoid taking care of events if browser bugs out by using dexie cloud from a service worker.\nif (!DISABLE_SERVICEWORKER_STRATEGY) {\n self.addEventListener('sync', (event: SyncEvent) => {\n console.debug('SW \"sync\" Event', event.tag);\n const dbName = getDbNameFromTag(event.tag);\n if (dbName) {\n event.waitUntil(syncDB(dbName, \"push\")); // The purpose of sync events are \"push\"\n }\n });\n\n self.addEventListener('periodicsync', (event: SyncEvent) => {\n console.debug('SW \"periodicsync\" Event', event.tag);\n const dbName = getDbNameFromTag(event.tag);\n if (dbName) {\n event.waitUntil(syncDB(dbName, \"pull\")); // The purpose of periodic sync events are \"pull\"\n }\n });\n\n self.addEventListener('message', (event: SWMessageEvent) => {\n console.debug('SW \"message\" Event', event.data);\n if (event.data.type === 'dexie-cloud-sync') {\n const { dbName } = event.data;\n // Mimic background sync behavior - retry in X minutes on failure.\n // But lesser timeout and more number of times.\n const syncAndRetry = (num = 1) => {\n return syncDB(dbName, event.data.purpose || \"pull\").catch(async (e) => {\n if (num === 3) throw e;\n await sleep(60_000); // 1 minute\n syncAndRetry(num + 1);\n });\n };\n if ('waitUntil' in event) {\n event.waitUntil(syncAndRetry().catch(error => console.error(error)));\n } else {\n syncAndRetry().catch(error => console.error(error));\n }\n }\n });\n}\n\nfunction sleep(ms: number) {\n return new Promise((resolve) => setTimeout(resolve, ms));\n}\n"],"names":["extendStatics","d","b","Object","setPrototypeOf","__proto__","Array","p","prototype","hasOwnProperty","call","__extends","TypeError","String","__","this","constructor","create","__awaiter","thisArg","_arguments","P","generator","Promise","resolve","reject","fulfilled","value","step","next","e","rejected","result","done","then","apply","__generator","body","f","y","t","g","_","label","sent","trys","ops","verb","throw","return","Symbol","iterator","n","v","op","pop","length","push","__values","o","s","m","i","__read","r","ar","error","__spreadArray","to","from","pack","arguments","l","slice","concat","__await","__asyncGenerator","asyncIterator","q","a","resume","fulfill","settle","shift","__asyncValues","UNAUTHORIZED_USER","userId","name","claims","sub","lastLogin","Date","freeze","_a","swHolder","swContainer","self","document","navigator","serviceWorker","ready","registration","addEventListener","ev","_b","data","type","startsWith","matchAll","includeUncontrolled","forEach","client","id","source","postMessage","SWBroadcastChannel","subscribe","listener","forwarder","message","removeEventListener","active","events","globalThis","Map","BroadcastedAndLocalEvent","Observable","bc","BroadcastChannel","super","subscriber","onCustomEvent","detail","onMessageEvent","unsubscribe","has","get","set","addListener","err","listeners","idx","indexOf","splice","removeListener","dispatch","CustomEvent","isFunction","operate","init","lift","hasLift","liftedSource","isArrayLike","x","isPromise","createImpl","ctorFunc","UnsubscriptionError","_super","errors","map","toString","join","instance","Error","stack","arrRemove","arr","item","index","Subscription","initialTeardown","closed","_parentage","_finalizers","empty","e_1","e_2","isArray","_parentage_1","_parentage_1_1","remove","e_1_1","initialFinalizer","_finalizers_1","_finalizers_1_1","finalizer","execFinalizer","e_2_1","add","teardown","_hasParent","_addParent","parent","includes","_removeParent","EMPTY","isSubscription","config","onUnhandledError","onStoppedNotification","undefined","useDeprecatedSynchronousErrorHandling","useDeprecatedNextContext","timeoutProvider","setTimeout","handler","timeout","args","_i","delegate","clearTimeout","handle","reportUnhandledError","noop","Subscriber","destination","_this","isStopped","EMPTY_OBSERVER","complete","SafeSubscriber","_next","_error","_complete","_bind","Function","bind","fn","ConsumerObserver","partialObserver","handleUnhandledError","observerOrNext","context_1","observable","identity","_subscribe","operator","isObserver","_trySubscribe","cb","sink","promiseCtor","getPromiseCtor","Symbol_observable","pipe","fns","operations","input","reduce","prev","toPromise","isInteropObservable","isAsyncIterable","obj","createInvalidObservableTypeError","isIterable","Symbol_iterator","readableStreamLikeToAsyncGenerator","readableStream","reader","getReader","read","releaseLock","isReadableStreamLike","innerFrom","obs","array","promise","fromAsyncIterable","iterable","iterable_1","iterable_1_1","asyncIterable","asyncIterable_1","asyncIterable_1_1","process","catch","createOperatorSubscriber","onNext","onComplete","onError","onFinalize","OperatorSubscriber","shouldUnsubscribe","closed_1","Action","scheduler","work","schedule","state","delay","intervalProvider","setInterval","clearInterval","AsyncAction","pending","recycleAsyncId","requestAsyncId","_id","flush","_scheduler","execute","_execute","_delay","errorValue","errored","actions","dateTimestampProvider","now","Scheduler","schedulerActionCtor","asyncScheduler","AsyncScheduler","SchedulerAction","_active","_scheduled","action","async","isScheduler","timer","dueTime","intervalOrScheduler","intervalDuration","due","isNaN","popScheduler","executeSchedule","parentSubscription","repeat","scheduleSubscription","catchError","selector","handledResult","innerSub","syncUnsub","observeOn","subscribeOn","scheduleAsyncIterable","scheduled","scheduleObservable","scheduleArray","schedulePromise","scheduleIterable","scheduleReadableStreamLike","project","mergeMap","resultSelector","concurrent","Infinity","ii","onBeforeNext","expand","innerSubScheduler","additionalFinalizer","buffer","isComplete","checkComplete","outerNext","doInnerSub","innerComplete","innerValue","_loop_1","bufferedValue","mergeInternals","concatAll","debounceTime","activeTask","lastValue","lastTime","emit","emitWhenIdle","targetTime","take","count","seen","delayWhen","delayDurationSelector","subscriptionDelay","mapTo","duration","distinctUntilChanged","comparator","keySelector","defaultCompare","previousKey","first","currentKey","filter","predicate","skip","startWith","values","switchMap","innerSubscriber","innerIndex","outerIndex","tap","tapObserver","isUnsub","finalize","hasComplainedAboutSyncEvent","registerSyncEvent","db","purpose","sw","sync","register","dbName","triggerSync","cloud","usingServiceWorker","localSyncEvent","hasArrayBufferFromBase64","Uint8Array","hasArrayBufferToBase64","b64decode","Buffer","base64","fromBase64","binary_string","atob","len","bytes","charCodeAt","b64encode","ArrayBuffer","isView","byteOffset","byteLength","toBase64","u8a","strs","chunk","subarray","fromCharCode","btoa","computeRealmSetHash","realms","inviteRealms","JSON","stringify","realmId","accepted","sort","byteArray","TextEncoder","encode","digestBytes","crypto","subtle","digest","getSyncableTables","entries","schema","markedForSync","tbl","tables","cloudTableSchema","getMutationTable","tableName","getTableFromMutationTable","mutationTable","exec","flatten","listClientChanges","mutationTables_1","db_1","mutationTables","since","limit","sorted","all","lastRevision","query","where","above","toArray","mut","table","txid","opNo","ts","currentEntry","currentTxid","muts","randomString","buf","getRandomValues","Math","floor","random","_hasOwn","setByKeyPath","keyPath","isFrozen","assert","period","currentKeyPath","substr","remainingKeyPath","parseInt","innerObj","prop","hasOwn","randomFill","simpleRandomFill","alloc","isValidSyncableID","some","key","every","isValidSyncableIDPart","part","applyOperation","target","keys","val","changeSpec","changeSpecs","entry","propPath","assign","mod","applyOperations","abs","max","BIT8","BITS7","MAX_SAFE_INTEGER","Number","isInteger","num","isFinite","math.floor","utf8TextEncoder","encodeUtf8","str","encodedString","unescape","encodeURIComponent","codePointAt","utf8TextDecoder","TextDecoder","fatal","ignoreBOM","decode","Encoder$1","cpos","cbuf","bufs","write","encoder","bufferLen","writeVarUint","binary.BITS7","binary.BIT8","_strBuffer","_maxStrBSize","writeVarString","string.utf8TextEncoder","encodeInto","written","writeVarUint8Array","string.encodeUtf8","uint8Array","leftCopyLen","math.min","rightCopyLen","math.max","writeUint8Array","writeOnDataView","verifyLen","dview","DataView","writeBigUint64","setBigUint64","floatTestBed","writeAny","number.isInteger","math.abs","isNegative","math.isNegativeZero","writeVarInt","setFloat32","getFloat32","writeFloat32","setFloat64","writeFloat64","setBigInt64","writeBigInt64","array.isArray","encodeYMessage","msg","Encoder","BigInt","yServerRev","k","u","serverRev","sv","uint8arr","curPos","toUint8Array","errorUnexpectedEndOfArray","error.create","errorIntegerOutOfRange","Decoder$1","pos","hasContent","decoder","readVarUint8Array","view","readUint8Array","readVarUint","readUint8","mult","number.MAX_SAFE_INTEGER","readVarString","string.utf8TextDecoder","remainingLen","fromCodePoint","nextLen","decodeURIComponent","escape","readFromDataView","dv","readBigUint64","getBigUint64","readAnyLookupTable","sign","getFloat64","getBigInt64","readAny","consumeChunkedBinaryStream","_c","sizeBuf","sizeBufPos","source_1_1","_d","source_1","dw","getUint32","concats","c","TokenErrorResponseError","title","messageCode","messageParams","interactWithUser","userInteraction","req","interactionProps","submitLabel","cancelLabel","onSubmit","res","onCancel","Dexie","AbortError","alertUser","alerts","fields","promptForEmail","emailHint","email","test","placeholder","promptForOTP","alert","otp","loadAccessToken","currentUser","getCurrentUser","accessToken","accessTokenExpiration","refreshToken","refreshTokenExpiration","getTime","license","status","refreshedLogin","refreshAccessToken","options","databaseUrl","update","authenticate","url","context","fetchToken","hints","location","protocol","privateKey","publicKey","generateKey","modulusLength","publicExponent","hash","nonExportablePrivateKey","publicKeyPEM","keydata","keydataB64","finalString","substring","formatAsPem","spkiToPEM","exportKey","response2","public_key","userType","evalDaysLeft","userValidUntil","validUntil","onLine","debug","hostname","origin","userAuthenticate","login","time_stamp","signing_algorithm","binarySignature","signature","tokenRequest","grant_type","refresh_token","scopes","fetch","method","headers","mode","response","json","toStr","ObjectDef","replace","dollarKeys","clone","TypesonSimplified","typeDefsInputs","typeDefs","protoMap","WeakMap","alternateChannel","space","realVal","typeDef","proto","getPrototypeOf","toStringTag","find","typeName","function","getTypeDef","parse","tson","$t","revive","top","deletes","mods","BisonBinaryTypes","Blob","blob","altChannel","mimeType","numberDef","number","bigIntDef","bigint","DateDef","date","toISOString","NaN","SetDef","Set","MapDef","_global","global","TypedArraysDefs","specs","TypedArray","b64LexEncode","encoded","ENCODE_TABLE","b64ToLex","b64LexDecode","b64Lex","base64lex","DECODE_TABLE","lexToB64","A","B","C","D","E","F","G","H","I","J","K","L","M","N","O","Q","R","S","T","U","V","W","X","Y","Z","h","j","w","z","ArrayBufferDef","ab","ba","FakeBlob","readBlobSync","XMLHttpRequest","overrideMimeType","open","URL","createObjectURL","send","responseText","string2ArrayBuffer","BlobDef","builtin","bigintDef","readBlobBinary","FileReader","onabort","onerror","onload","readAsArrayBuffer","undefinedDef","FileDef","File","file","lastModified","hasBigIntSupport","FakeBigInt","fakeBigInt","defs","PropModification","propModification","propModSpec","getOwnPropertySymbols","propertyIsEnumerable","__rest","TSON","tsonBuiltinDefs","BISON","toBinary","lenBuf","setUint32","size","binaries","binData","arrayBuffers","fromBinary","readAsText","readBlob","Bison","HttpError","statusText","httpStatus","encodeIdsForServer","changes","rv","change","tableSchema","primaryKey","changeClone","mutIndex","rewriteValues","outbound","keyIndex","cloneChange","mutClone","rewrittenKey","isLoggedIn","syncRatelimitDelays","checkSyncRateLimitDelay","delatMilliseconds","syncWithServer","syncState","baseRevs","clientIdentity","Accept","updatedUser","Authorization","syncRequest","dbID","remoteDbId","lastPull","serverRevision","yServerRevision","dx","core","dxcv","version","syncStateChangedEvent","phase","credentials","remaining","reset","limitNum","remainingNum","willResetInSeconds","ceil","delete","updateSyncRateLimitDelays","ok","text","throwIfCancelled","cancelToken","cancelled","isOnline","updateBaseRevs","latestRevisions","$baseRevs","bulkPut","clientRev","noneOf","getLatestRevisionsPerTable","clientChangeSet","lastRevisions","lastRev","rev","bulkUpdate","objs","bulkGet","resultKeys","resultObjs","primKey","cmp","applyServerChanges","_allTables","keyDecoder","endsWith","currentUserId","bulkAdd","anyOf","modify","bulkDelete","DEXIE_CLOUD_SYNCER_ID","listUpdatesSince","yTable","sinceIncluding","between","copy","setIfUndefined","createT","last","appendTo","dest","src","ObservableV2","_observers","map.create","on","map.setIfUndefined","set.create","once","_f","off","observers","array.from","destroy","min","isNegativeZero","BIT7","trimLeftRegex","fromCamelCaseRegex","fromCamelCase","separator","trimLeft","match","toLowerCase","createEncoder","writeUint8","binary.BIT7","RleEncoder","writer","flushUintOptRleEncoder","UintOptRleEncoder","flushIntDiffOptRleEncoder","encodedDiff","diff","IntDiffOptRleEncoder","StringEncoder","sarr","lensE","string","methodUnimplemented","unexpectedCase","Decoder","createDecoder","readVarInt","RleDecoder","UintOptRleDecoder","IntDiffOptRleDecoder","hasCount","StringDecoder","spos","end","uint32","Uint32Array","uuidv4Template","uuidv4","undefinedToNull","_localStorage","setItem","newValue","getItem","usePolyfill","localStorage","varStorage","equalFlat","hasProperty","deepFreeze","callAll","fs","isNode","release","params","hasParam","pargs","argv","currParamName","parg","search","split","kv","string.fromCamelCase","computeParams","getVariable","conditions.undefinedToNull","env","toUpperCase","replaceAll","storage.varStorage","hasConf","FORCE_COLOR","stdout","isTTY","Pair","left","right","DOMParser","BOLD","symbol.create","UNBOLD","BLUE","GREY","GREEN","RED","PURPLE","ORANGE","UNCOLOR","vconsoles","pair.create","createIterator","iteratorMap","fmap","DeleteItem","clock","DeleteSet","clients","iterateDeletedStructs","transaction","ds","clientid","structs","doc","store","lastStruct","clockState","del","iterateStructs","isDeleted","dis","midindex","mid","midclock","findIndexDS","sortAndMergeDeleteSet","dels","addToDeleteSet","writeDeleteSet","encoding.writeVarUint","restEncoder","dsitems","resetDsCurVal","writeDsClock","writeDsLen","readAndApplyDeleteSet","unappliedDS","numClients","decoding.readVarUint","restDecoder","numberOfDeletes","getState","readDsClock","clockEnd","readDsLen","findIndexSS","struct","deleted","splitItem","UpdateEncoderV2","generateNewClientId","random.uint32","Doc","guid","random.uuidv4","collectionid","gc","gcFilter","meta","autoLoad","shouldLoad","clientID","share","StructStore","_transaction","_transactionCleanups","subdocs","_item","isLoaded","isSynced","isDestroyed","whenLoaded","promise.create","provideSyncedPromise","eventHandler","whenSynced","load","transact","subdocsLoaded","getSubdocs","getSubdocGuids","TypeConstructor","_integrate","Constr","AbstractType","_map","_start","_length","getArray","YArray","getText","YText","getMap","YMap","getXmlElement","YXmlElement","getXmlFragment","YXmlFragment","toJSON","subdoc","content","opts","subdocsAdded","subdocsRemoved","DSDecoderV2","dsCurrVal","UpdateDecoderV2","keyClockDecoder","decoding.IntDiffOptRleDecoder","decoding.readVarUint8Array","clientDecoder","decoding.UintOptRleDecoder","leftClockDecoder","rightClockDecoder","infoDecoder","decoding.RleDecoder","decoding.readUint8","stringDecoder","decoding.StringDecoder","parentInfoDecoder","typeRefDecoder","lenDecoder","readLeftID","ID","readRightID","readClient","readInfo","readString","readParentInfo","readTypeRef","readLen","decoding.readAny","readBuf","readJSON","readKey","keyClock","DSEncoderV1","encoding.createEncoder","encoding.toUint8Array","UpdateEncoderV1","writeLeftID","writeRightID","writeClient","writeInfo","info","encoding.writeUint8","writeString","encoding.writeVarString","writeParentInfo","isYKey","writeTypeRef","writeLen","any","encoding.writeAny","writeBuf","encoding.writeVarUint8Array","writeJSON","embed","writeKey","DSEncoderV2","error.unexpectedCase","keyMap","keyClockEncoder","encoding.IntDiffOptRleEncoder","clientEncoder","encoding.UintOptRleEncoder","leftClockEncoder","rightClockEncoder","infoEncoder","encoding.RleEncoder","stringEncoder","encoding.StringEncoder","parentInfoEncoder","typeRefEncoder","lenEncoder","encoding.writeUint8Array","writeClientsStructs","_sm","sm","getStateVector","_clock","startNewStructs","firstStruct","writeStructs","readUpdateV2","ydoc","transactionOrigin","structDecoder","local","retry","ss","clientRefs","numOfStateUpdates","numberOfStructs","refs","GC","createID","Skip","cantCopyParentInfo","Item","readItemContent","readClientsStructRefs","restStructs","clientsStructRefs","clientsStructRefsIds","getNextStructTarget","nextStructsTarget","curStructsTarget","missingSV","updateMissingSv","mclock","stackHead","addStackToRestSS","inapplicableItems","offset","missing","getMissing","structRefs","integrate","integrateStructs","pendingStructs","mergeUpdatesV2","dsRest","pendingDs","pendingDSUpdate","decoding.createDecoder","dsRest2","applyUpdateV2","YDecoder","EventHandler","createEventHandler","addEventHandlerListener","removeEventHandlerListener","callEventHandlerListeners","arg0","arg1","f.callAll","compareIDs","isVisible","snapshot","splitSnapshotAffectedStructs","getItemCleanStart","addStruct","findIndexCleanStart","getItemCleanEnd","clockStart","Transaction","deleteSet","beforeState","afterState","changed","changedParentTypes","_mergeStructs","_needFormattingCleanup","writeUpdateMessageFromTransaction","map.any","writeStructsFromTransaction","addChangedTypeToTransaction","parentSub","tryToMergeWithLefts","mergeWith","merged","cleanupTransactions","transactionCleanups","mergeStructs","subs","itemtype","_callObserver","_dEH","event","currentTarget","_path","event1","event2","path","cleanupYTextAfterTransaction","deleteItems","di","deleteItem","endDeleteItemClock","si","keep","tryGcDeleteSet","tryMergeDeleteSet","beforeClock","firstChangePos","replacedStructPos","vc","print","logging.print","logging.ORANGE","logging.BOLD","logging.UNBOLD","logging.RED","loaded","added","removed","initialCall","finishCleanup","LazyStructReader","filterSkips","gen","lazyStructReaderGenerator","curr","LazyStructWriter","currClient","startClock","clientStructs","encodeStateVectorFromUpdateV2","YEncoder","updateDecoder","stopCounting","currClock","enc","append","encoding.writeBinaryEncoder","sliceStruct","leftItem","rightOrigin","updates","updateDecoders","lazyStructDecoders","currWrite","updateEncoder","lazyStructEncoder","dec","dec1","dec2","clockDiff","currDecoder","firstClient","iterated","writeStructToLazyStructWriter","finishLazyStructWriting","dss","dsField","readDeleteSet","dssI","delsLeft","array.appendTo","mergeDeleteSets","flushLazyStructWriter","lazyWriter","partStructs","errorComputeChanges","YEvent","_changes","_keys","_delta","getPathTo","oldValue","adds","array.last","getContent","delta","lastOp","packOp","insert","retain","child","unshift","countable","warnPrematureAccess","common.ORANGE","logging.warn","globalSearchMarkerTimestamp","ArraySearchMarker","marker","timestamp","overwriteMarker","findMarker","yarray","_searchMarker","pindex","refreshMarkerTimestamp","searchMarker","pm","markPosition","updateMarkerChanges","callTypeObservers","changedType","_eH","_copy","error.methodUnimplemented","_write","_encoder","_first","_parentSubs","observe","observeDeep","unobserve","unobserveDeep","typeListSlice","start","cs","typeListToArray","typeListForEach","typeListMap","typeListCreateIterator","currentContent","currentContentIndex","typeListGet","typeListInsertGenericsAfter","referenceItem","ownClientId","jsonContent","packJsonContent","lastId","ContentAny","Boolean","ContentBinary","ContentDoc","ContentType","lengthExceeded","typeListInsertGenerics","startIndex","typeListDelete","startLength","typeMapDelete","typeMapSet","typeMapGet","typeMapGetAll","typeMapHas","createMapIterator","iterator.iteratorFilter","YArrayEvent","_prelimContent","items","el","parentSubs","maxMarker","currMarker","typeListPushGenerics","YArrayRefID","YMapEvent","ymap","keysChanged","iterator.iteratorMap","clear","_value","YMapRefID","equalAttrs","object.equalFlat","ItemTextListPosition","currentAttributes","forward","ContentFormat","updateCurrentAttributes","findNextPosition","findPosition","useSearchMarker","insertNegatedAttributes","currPos","negatedAttributes","nextFormat","format","minimizeAttributeChanges","attributes","insertAttributes","currentVal","insertText","_val","ContentString","ContentEmbed","getLength","formatText","iterationLoop","attr","newlines","cleanupFormattingGap","startAttributes","currAttributes","endFormats","cf","cleanups","reachedCurr","startAttrValue","cleanupYTextFormatting","map.copy","needFullCleanup","afterClock","attrs","cleanupContextlessFormattingGap","yText","deleteText","startAttrs","YTextEvent","ytext","childListChanged","oldAttributes","deleteLen","addOp","_k","object.isEmpty","object.assign","curVal","_pending","_hasFormatting","applyDelta","toDelta","sanitize","ins","prevSnapshot","computeYChange","packStr","addAttributes","computeDelta","cur","user","insertEmbed","removeAttribute","attributeName","setAttribute","attributeValue","getAttribute","getAttributes","YTextRefID","YXmlTreeWalker","root","_filter","_root","_currentNode","_firstCall","nxt","firstChild","createTreeWalker","querySelector","element","nodeName","querySelectorAll","YXmlEvent","xml","toDOM","_document","hooks","binding","fragment","createDocumentFragment","_createAssociation","xmlType","insertBefore","insertAfter","ref","refItem","pc","findIndex","YXmlFragmentRefID","_prelimAttrs","nextSibling","prevSibling","object.forEach","stringBuilder","keysLen","toLocaleLowerCase","hasAttribute","typeMapGetAllSnapshot","dom","createElement","yxml","appendChild","YXmlElementRefID","attributesChanged","YXmlHook","hookName","hook","createDom","YXmlHookRefID","YXmlText","createTextNode","nestedNodes","node","YXmlTextRefID","AbstractStruct","encodingRef","isCountable","getRef","ContentDeleted","markDeleted","createDocFromOpts","_offset","_right","ContentJSON","isDevMode","env.getVariable","object.deepFreeze","firstCharCode","typeRefs","_decoder","rightItem","redone","isMarked","doKeep","doDelete","parentItem","conflictingItems","itemsBeforeOrigin","parentGCd","newStruct","replaceStruct","ykey","findRootTypeKey","contentRefs","glo","window","importIdentifier","getUpdatesTable","ydocProp","utbl","yProps","updatesTable","docRegistry","FinalizationRegistry","cache","getDocCache","_novip","cacheKey","getYDocCacheKey","docRef","deref","parentTable","parentId","parentProp","existingDoc","unregister","WeakRef","cacheEntry","destroyedDocs","WeakSet","throwIfDestroyed","currentUpdateRow","setCurrentUpdateRow","row","nop","wm","createEvents","Events","DexieYProvider","getOrCreateDocument","docCache","Y.Doc","refCount","gracePeriod","graceTimeout","graceTimer","_release","fire","finally","_whenLoaded","_whenSynced","cleanupHandlers","destroyed","dispose","stopObserving","provider","parentTableName","updatesTableName","lastUpdateId","initial","subscription","liveQuery","equals","parentRow","Y.transact","Y.applyUpdateV2","onUpdate","observeYDocUpdates","cleanup","addCleanupHandler","cleanupHandler","applyYServerMessages","yMessages","receivedUntils","resyncNeeded","updateRow","tx","syncer","put","unsentFrom","idbtrans","_rejecting_y_ypdate","aboveOrEqual","activeDoc","new","f1","f2","beforeunload","thiz","BINSTREAM_TYPE_REALMID","BINSTREAM_TYPE_TABLE_AND_PROP","BINSTREAM_TYPE_DOCUMENT","downloadYDocsFromServer","databaseUrl_1","yDownloadedRealms","downloadedRealms","stages","result_1_1","result_1","asyncIterablePipeline","getFetchResponseBodyGenerator","chunks","currentRealmId","currentTable","currentProp","docsToInsert","storeCollectedDocs","completedRealm","lastDoc","$syncState","chunks_1_1","chunks_1","DexieError","CURRENT_SYNC_WORKER","syncOptions","_sync","justCheckIfNeeded","retryImmediatelyOnFetchError","options_1","schema_1","isInitialSync","tablesToSync","persistedSyncState","getPersistedSyncState","readyForSyncification","tablesToSyncify","syncedTables","getTablesToSyncify","doSyncify","disableChangeTracking","disableAccessControl","syncifiedTables","alreadySyncedRealms","ignoredRealms","toCollection","member","realm","owner","modifyLocalObjectsWithNewUserId","lastUpdateIds","br","clientChanges","yResults","yProp","receivedUntil","unsyncedFrom","perDoc","isLocal","docKey","mergedUpdate","Y.mergeUpdatesV2","stateVector","Y.encodeStateVectorFromUpdateV2","listYClientMessagesAndStateVector","syncificationInserts","extractKey","dexieCloudTableSchema","generatedGlobalId","idPrefix","unsyncedObjects","listSyncifiedChanges","pushSyncIsNeeded","newSyncState","addedClientChanges","mutTable","ch","latestRev","belowOrEqual","reverse","deletedRealms","rejectedRealms","previousRealmSet","previousInviteRealmSet","updatedRealmSet","updatedTotalRealmSet","realmsToDelete","indexes","deleteObjectsFromRemovedRealms","dbId","initiallySynced","filteredChanges","filterServerChangesThroughAddedClientChanges","lastUpdateIdsBeforeSync","receivedUntilsAfterSync","mergedSpec","allYTables","_dbSchema","tblSchema","flat","mergedEntry","_e","primaryKeys","updateYSyncStates","usingYProps","serverSupportsYprops","syncCompleteEvent","serverChanges","localPostChanges","changesToSubtract","mutationSet","targetMut","subtractChanges","inSet","mapEntry","resultEntry","optype","toDBOperationSet","LIMIT_NUM_MESSAGES_PER_TIME","TIME_WINDOW","PAUSE_PERIOD","MessagesFromServerConsumer","queue","readyToServe","BehaviorSubject","isWorking","loopDetection","fill","firstValueFrom","wait","getSchema","baseRev","waitFor","realmSetHash","newRev","consumeQueue","enqueue","DEXIE_CLOUD_SCHEMA","members","roles","$jobs","$logins","static_counter","DexieCloudDB","Subject","close","helperMethods","logins","getOptions","setInitiallySynced","reconfigure","messageConsumer","messageProducer","AuthPersistedContext","userLogin","save","waitUntil","logout","numUnsyncedChanges","_logout","confirmLogout","deleteUnsyncedData","numUnsynced","loggedOut","storeNames","sumUnSynced","prodLog","level","origUserId","fetchTokens","demo_user","otpId","otp_id","res1","errMsg","tokenRequest2","res2","errorText","otpFetchTokenCallback","existingLogins","setCurrentUser","isFirefox","InstallTrigger","isSafari","userAgent","safariVersion","DISABLE_SERVICEWORKER_STRATEGY","IS_SERVICE_WORKER","getEffectiveKeys","consonants","time","prefix","shardKey","timePart","randomPart","createIdGenerationMiddleware","mutate","trans","getMany","results","valueClones","colocatedId","deepClone","ConstraintError","generateOrVerifyAtKeys","counter","readLock","readers","writers","numWriters","writeLock","possiblePromises","reason","outstandingTransactions","isEagerSyncDisabled","disableEagerSync","createMutationTrackingMiddleware","currentUserObservable","allTableNames","ordinaryTables","mutTableMap","mutationTableName","opCount","removeTransaction","txComplete","mutationsAdded","mutsTable","openCursor","guardedTable","range","mutateAndLog","criteria","unsyncedProps","unsyncedProperties","stripChangeSpec","numFailures","hasFailures","failures","strippedChangeSpecs","newUpdates","validKeys","RangeSet","anyChangeSpecBecameEmpty","addKey","newKeys","newValues","hasKey","keyPaths","isAdditionalChunk","overrideParseStoresSpec","origFunc","dexie","stores","dbSchema","storesClone","schemaSrc","requestedIndexes","spec","trim","builtInIndexes","requestedIndexSet","builtInIndex","cloudSchema","allPrefixes","orig","bits","bitFix","upperFixed","nextChar","generateTablePrefix","performGuardedJob","jobName","job","locks","request","userIsActive","userIsReallyActive","isActive","of","visibilityStateIsChanged","fromEvent","documentBecomesHidden","visibilityState","documentBecomesVisible","userDoesSomething","merge","USER_INACTIVITY_TIMEOUT","TokenExpiredError","getAwarenessLibrary","awarenessProtocol","MissingAPIError","awarenessWeakMap","getOpenDocSignal","signal","WSObservable","yrev","webSocketStatus","WSConnection","subscriptions","reconnecting","lastUserActivity","connect","disconnect","pinger","ws","reconnect","lastServerActivity","pauseUntil","tokenExpiration","wsUrl","searchParams","URLSearchParams","WebSocket","binaryType","onclose","onmessage","decodeYMessage","awareness","getDocAwareness","applyAwarenessUpdate","everConnected","onopen","yTableRecords","yTbl","currentUnsentFrom","addedUpdates","at","messages","createYClientUpdateObservable","InvalidLicenseError","waitAndReconnectWhenUserDoesSomething","ms","isSyncNeeded","ongoingSyncs","syncIfPossible","cloudOptions","ongoing","pull","hasPullTakenPlace","_syncIfPossible","SECONDS","LocalSyncWorker","localSyncEventSubscription","nextRetryTime","syncStartTime","syncAndRetry","retryNum","pullSignalled","stop","pushSignalled","ongoingSync","retryIn","consumer","updateSchemaFromOptions","unsyncedTables","parentNode","removeChild","children","defaultProps","props","__k","__b","__e","__d","__c","__h","__v","vnode","base","__r","debounceRendering","__P","__n","ownerSVGElement","$","setProperty","style","cssText","contextType","__E","render","__s","getDerivedStateFromProps","componentWillMount","componentDidMount","componentWillReceiveProps","shouldComponentUpdate","componentWillUpdate","componentDidUpdate","getChildContext","getSnapshotBeforeUpdate","diffed","localName","nodeType","createElementNS","is","childNodes","dangerouslySetInnerHTML","__html","innerHTML","checked","current","unmount","componentWillUnmount","getDerivedStateFromError","setState","componentDidCatch","forceUpdate","Styles","color","Alert","fontWeight","warning","Darken","position","opacity","backgroundColor","width","height","zIndex","webkitBackdropFilter","backdropFilter","DialogOuter","alignItems","display","justifyContent","DialogInner","padding","marginBottom","maxWidth","maxHeight","overflowY","border","borderRadius","boxShadow","fontFamily","Input","borderColor","outline","fontSize","Dialog","className","__H","__V","__N","requestAnimationFrame","cancelAnimationFrame","LoginDialog","setParams","useState","firstFieldRef","useRef","useLayoutEffect","focus","Fragment","WindowHeader","resolveText","preventDefault","fieldName","Label","autoComplete","autoFocus","onInput","valueTransformer","updatedParams","ButtonsDiv","Button","onClick","LoginGui","Component","observer","associate","factory","getCurrentUserEmitter","createSharedValueObservable","defaultValue","currentValue","shared","resetOnRefCountZero","didEmit","getValue","getGlobalRolesObservable","role","sortOrder","getInternalAccessControlObservable","selfMembers","mergePermissions","permissions","reduced","ret","rights","retVerb","mergedRights","tableRights","getPermissionsLookupObservable","mapper","mapValueObservable","combineLatest","globalRoles","selfRealmMembers","directPermissionSets","rolePermissionSets","roleName","manage","PermissionChecker","isOwner","tableNames","tablePermissions","permittedProp","getInvitesObservable","membersByEmail","accessControl","realmLookup","reducer","emailMembersById","membersById","invite","accept","createYHandler","defineProperty","awap","Awareness","reopenDocSignal","updated","changedClients","encodeAwarenessUpdate","removeAwarenessStates","connected","currentFlowId","wsStatus","openDocumentOnServer","myFlow","syncStateTbl","docOpenMsg","serverUpdatesSinceLastSync","createAwareness","DEFAULT_OPTIONS","nameSuffix","dexieCloud","origIdbName","currentUserEmitter","configuredProgramatically","localSyncWorker","customLoginGui","preact.render","vip","setupDefaultGUI","isServiceWorkerDB","_prevStatus","lazyWebSocketStatus","prevStatus","progress","adjustedStatus","computeSyncState","syncComplete","SchemaError","throwVersionIncrementNeeded","swRegistrations","getRegistrations","lastSyncedRealms","persistedOptions","persistedSchema","newPersistedOptions","tryUseServiceWorker","newPersistedSchema","newTblSchema","auto","verifySchema","throwIfClosed","yHandler","changedUser","requireAuth","doInitialSync","performInitialSync","periodicSync","registerPeriodicSyncEvent","_g","disableWebSocket","readyForChangesMessage","isReady","createObservable","prevUser","prevHash","currUser","currHash","throwError","connectWebSocket","onDbReady","DatabaseClosedError","hint","invites","configure","dbUrl","pathname","getDbNameFromDbUrl","force","syncNeeded","isNeeded","permissionsLookup","Version","override","Table","newId","colocateWith","use","$ts","Cloud","managedDBs","getDbNameFromTag","tag","syncDBSemaphore","syncDB","_syncDB","addons","stopManagingDB","errnames","NoSuchDatabase","versionchange"],"mappings":"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","x_google_ignoreList":[0,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,70,71,74,86,87,88,89,90,91,93,94,99,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,131,132,133,134,135,136,137,138,139,140,141,142,143,144,145,146,147,148,149,150,151,152,153,154,155,156,207,210]}
|