matrix-js-sdk 41.4.0 → 41.5.0
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/CHANGELOG.md +12 -0
- package/README.md +1 -0
- package/lib/@types/json.d.ts +7 -0
- package/lib/@types/json.d.ts.map +1 -0
- package/lib/@types/json.js +1 -0
- package/lib/@types/json.js.map +1 -0
- package/lib/@types/requests.d.ts +6 -9
- package/lib/@types/requests.d.ts.map +1 -1
- package/lib/@types/requests.js.map +1 -1
- package/lib/client.d.ts +17 -2
- package/lib/client.d.ts.map +1 -1
- package/lib/client.js +27 -12
- package/lib/client.js.map +1 -1
- package/lib/filter.d.ts +20 -5
- package/lib/filter.d.ts.map +1 -1
- package/lib/filter.js +21 -0
- package/lib/filter.js.map +1 -1
- package/lib/models/user.d.ts +5 -0
- package/lib/models/user.d.ts.map +1 -1
- package/lib/models/user.js +5 -0
- package/lib/models/user.js.map +1 -1
- package/lib/oidc/authorize.d.ts +60 -0
- package/lib/oidc/authorize.d.ts.map +1 -1
- package/lib/oidc/authorize.js +115 -2
- package/lib/oidc/authorize.js.map +1 -1
- package/lib/oidc/register.d.ts.map +1 -1
- package/lib/oidc/register.js +5 -0
- package/lib/oidc/register.js.map +1 -1
- package/lib/rendezvous/MSC4108SignInWithQR.d.ts +19 -2
- package/lib/rendezvous/MSC4108SignInWithQR.d.ts.map +1 -1
- package/lib/rendezvous/MSC4108SignInWithQR.js +126 -36
- package/lib/rendezvous/MSC4108SignInWithQR.js.map +1 -1
- package/lib/rendezvous/channels/MSC4108SecureChannel.d.ts.map +1 -1
- package/lib/rendezvous/channels/MSC4108SecureChannel.js +4 -2
- package/lib/rendezvous/channels/MSC4108SecureChannel.js.map +1 -1
- package/lib/rendezvous/index.d.ts +36 -0
- package/lib/rendezvous/index.d.ts.map +1 -1
- package/lib/rendezvous/index.js +115 -0
- package/lib/rendezvous/index.js.map +1 -1
- package/lib/rendezvous/transports/MSC4108RendezvousSession.d.ts +1 -1
- package/lib/rendezvous/transports/MSC4108RendezvousSession.d.ts.map +1 -1
- package/lib/rendezvous/transports/MSC4108RendezvousSession.js.map +1 -1
- package/lib/rust-crypto/rust-crypto.d.ts.map +1 -1
- package/lib/rust-crypto/rust-crypto.js +2 -2
- package/lib/rust-crypto/rust-crypto.js.map +1 -1
- package/lib/store/index.d.ts +17 -1
- package/lib/store/index.d.ts.map +1 -1
- package/lib/store/index.js.map +1 -1
- package/lib/store/indexeddb-backend.d.ts +4 -0
- package/lib/store/indexeddb-backend.d.ts.map +1 -1
- package/lib/store/indexeddb-backend.js.map +1 -1
- package/lib/store/indexeddb-local-backend.d.ts +4 -1
- package/lib/store/indexeddb-local-backend.d.ts.map +1 -1
- package/lib/store/indexeddb-local-backend.js +45 -3
- package/lib/store/indexeddb-local-backend.js.map +1 -1
- package/lib/store/indexeddb-remote-backend.d.ts +4 -0
- package/lib/store/indexeddb-remote-backend.d.ts.map +1 -1
- package/lib/store/indexeddb-remote-backend.js +21 -3
- package/lib/store/indexeddb-remote-backend.js.map +1 -1
- package/lib/store/indexeddb-store-worker.d.ts.map +1 -1
- package/lib/store/indexeddb-store-worker.js +10 -1
- package/lib/store/indexeddb-store-worker.js.map +1 -1
- package/lib/store/indexeddb.d.ts +4 -0
- package/lib/store/indexeddb.d.ts.map +1 -1
- package/lib/store/indexeddb.js +18 -0
- package/lib/store/indexeddb.js.map +1 -1
- package/lib/store/memory.d.ts +5 -1
- package/lib/store/memory.d.ts.map +1 -1
- package/lib/store/memory.js +19 -0
- package/lib/store/memory.js.map +1 -1
- package/lib/store/stub.d.ts +3 -0
- package/lib/store/stub.d.ts.map +1 -1
- package/lib/store/stub.js +15 -0
- package/lib/store/stub.js.map +1 -1
- package/lib/sync-accumulator.d.ts +15 -0
- package/lib/sync-accumulator.d.ts.map +1 -1
- package/lib/sync-accumulator.js +4 -0
- package/lib/sync-accumulator.js.map +1 -1
- package/lib/sync.d.ts +9 -1
- package/lib/sync.d.ts.map +1 -1
- package/lib/sync.js +51 -9
- package/lib/sync.js.map +1 -1
- package/lib/webrtc/call.d.ts.map +1 -1
- package/lib/webrtc/call.js +1 -2
- package/lib/webrtc/call.js.map +1 -1
- package/package.json +7 -7
- package/src/@types/json.ts +16 -0
- package/src/@types/requests.ts +6 -9
- package/src/client.ts +40 -12
- package/src/filter.ts +31 -5
- package/src/models/user.ts +6 -0
- package/src/oidc/authorize.ts +135 -2
- package/src/oidc/register.ts +5 -0
- package/src/rendezvous/MSC4108SignInWithQR.ts +117 -4
- package/src/rendezvous/channels/MSC4108SecureChannel.ts +10 -2
- package/src/rendezvous/index.ts +115 -0
- package/src/rendezvous/transports/MSC4108RendezvousSession.ts +1 -1
- package/src/rust-crypto/rust-crypto.ts +6 -3
- package/src/store/index.ts +20 -1
- package/src/store/indexeddb-backend.ts +4 -0
- package/src/store/indexeddb-local-backend.ts +32 -1
- package/src/store/indexeddb-remote-backend.ts +13 -0
- package/src/store/indexeddb-store-worker.ts +9 -0
- package/src/store/indexeddb.ts +13 -0
- package/src/store/memory.ts +14 -1
- package/src/store/stub.ts +12 -0
- package/src/sync-accumulator.ts +16 -1
- package/src/sync.ts +48 -4
- package/src/webrtc/call.ts +1 -2
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"indexeddb-remote-backend.js","names":["logger","RemoteIndexedDBStoreBackend","constructor","workerFactory","dbName","_defineProperty","ev","msg","data","command","_this$onClose","onClose","call","seq","undefined","error","def","inFlight","resolve","result","Error","message","name","reject","warn","connect","ensureStarted","then","doCmd","clearDatabase","isNewlyCreated","getSavedSync","getNextBatchToken","setSyncData","syncData","syncToDatabase","userTuples","getOutOfBandMembers","roomId","setOutOfBandMembers","membershipEvents","clearOutOfBandMembers","getClientOptions","storeClientOptions","options","getUserPresenceEvents","saveToDeviceBatches","batches","_this","_asyncToGenerator","getOldestToDeviceBatch","_this2","removeToDeviceBatch","id","_this3","startPromise","worker","onmessage","onWorkerMessage","log","args","Promise","_this$worker","nextSeq","withResolvers","postMessage","promise","destroy","_this4","_this4$worker","terminate"],"sources":["../../src/store/indexeddb-remote-backend.ts"],"sourcesContent":["/*\nCopyright 2017 - 2021 The Matrix.org Foundation C.I.C.\n\nLicensed under the Apache License, Version 2.0 (the \"License\");\nyou may not use this file except in compliance with the License.\nYou may obtain a copy of the License at\n\n http://www.apache.org/licenses/LICENSE-2.0\n\nUnless required by applicable law or agreed to in writing, software\ndistributed under the License is distributed on an \"AS IS\" BASIS,\nWITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\nSee the License for the specific language governing permissions and\nlimitations under the License.\n*/\n\nimport { logger } from \"../logger.ts\";\nimport { type ISavedSync } from \"./index.ts\";\nimport { type IStoredClientOpts } from \"../client.ts\";\nimport { type IStateEventWithRoomId, type ISyncResponse } from \"../matrix.ts\";\nimport { type IIndexedDBBackend, type UserTuple } from \"./indexeddb-backend.ts\";\nimport { type IndexedToDeviceBatch, type ToDeviceBatchWithTxnId } from \"../models/ToDeviceMessage.ts\";\n\nexport class RemoteIndexedDBStoreBackend implements IIndexedDBBackend {\n private worker?: Worker;\n private nextSeq = 0;\n // The currently in-flight requests to the actual backend\n private inFlight: Record<number, PromiseWithResolvers<any>> = {}; // seq: promise\n // Once we start connecting, we keep the promise and re-use it\n // if we try to connect again\n private startPromise?: Promise<void>;\n // Callback for when the IndexedDB gets closed unexpectedly\n private onClose?(): void;\n\n /**\n * An IndexedDB store backend where the actual backend sits in a web\n * worker.\n *\n * Construct a new Indexed Database store backend. This requires a call to\n * `connect()` before this store can be used.\n * @param workerFactory - Factory which produces a Worker\n * @param dbName - Optional database name. The same name must be used\n * to open the same database.\n */\n public constructor(\n private readonly workerFactory: () => Worker,\n private readonly dbName?: string,\n ) {}\n\n /**\n * Attempt to connect to the database. This can fail if the user does not\n * grant permission.\n * @returns Promise which resolves if successfully connected.\n */\n public connect(onClose?: () => void): Promise<void> {\n this.onClose = onClose;\n return this.ensureStarted().then(() => this.doCmd(\"connect\"));\n }\n\n /**\n * Clear the entire database. This should be used when logging out of a client\n * to prevent mixing data between accounts.\n * @returns Resolved when the database is cleared.\n */\n public clearDatabase(): Promise<void> {\n return this.ensureStarted().then(() => this.doCmd(\"clearDatabase\"));\n }\n\n /** @returns whether or not the database was newly created in this session. */\n public isNewlyCreated(): Promise<boolean> {\n return this.doCmd(\"isNewlyCreated\");\n }\n\n /**\n * @returns Promise which resolves with a sync response to restore the\n * client state to where it was at the last save, or null if there\n * is no saved sync data.\n */\n public getSavedSync(): Promise<ISavedSync> {\n return this.doCmd(\"getSavedSync\");\n }\n\n public getNextBatchToken(): Promise<string> {\n return this.doCmd(\"getNextBatchToken\");\n }\n\n public setSyncData(syncData: ISyncResponse): Promise<void> {\n return this.doCmd(\"setSyncData\", [syncData]);\n }\n\n public syncToDatabase(userTuples: UserTuple[]): Promise<void> {\n return this.doCmd(\"syncToDatabase\", [userTuples]);\n }\n\n /**\n * Returns the out-of-band membership events for this room that\n * were previously loaded.\n * @returns the events, potentially an empty array if OOB loading didn't yield any new members\n * @returns in case the members for this room haven't been stored yet\n */\n public getOutOfBandMembers(roomId: string): Promise<IStateEventWithRoomId[] | null> {\n return this.doCmd(\"getOutOfBandMembers\", [roomId]);\n }\n\n /**\n * Stores the out-of-band membership events for this room. Note that\n * it still makes sense to store an empty array as the OOB status for the room is\n * marked as fetched, and getOutOfBandMembers will return an empty array instead of null\n * @param membershipEvents - the membership events to store\n * @returns when all members have been stored\n */\n public setOutOfBandMembers(roomId: string, membershipEvents: IStateEventWithRoomId[]): Promise<void> {\n return this.doCmd(\"setOutOfBandMembers\", [roomId, membershipEvents]);\n }\n\n public clearOutOfBandMembers(roomId: string): Promise<void> {\n return this.doCmd(\"clearOutOfBandMembers\", [roomId]);\n }\n\n public getClientOptions(): Promise<IStoredClientOpts | undefined> {\n return this.doCmd(\"getClientOptions\");\n }\n\n public storeClientOptions(options: IStoredClientOpts): Promise<void> {\n return this.doCmd(\"storeClientOptions\", [options]);\n }\n\n /**\n * Load all user presence events from the database. This is not cached.\n * @returns A list of presence events in their raw form.\n */\n public getUserPresenceEvents(): Promise<UserTuple[]> {\n return this.doCmd(\"getUserPresenceEvents\");\n }\n\n public async saveToDeviceBatches(batches: ToDeviceBatchWithTxnId[]): Promise<void> {\n return this.doCmd(\"saveToDeviceBatches\", [batches]);\n }\n\n public async getOldestToDeviceBatch(): Promise<IndexedToDeviceBatch | null> {\n return this.doCmd(\"getOldestToDeviceBatch\");\n }\n\n public async removeToDeviceBatch(id: number): Promise<void> {\n return this.doCmd(\"removeToDeviceBatch\", [id]);\n }\n\n private ensureStarted(): Promise<void> {\n if (!this.startPromise) {\n this.worker = this.workerFactory();\n this.worker.onmessage = this.onWorkerMessage;\n\n // tell the worker the db name.\n this.startPromise = this.doCmd(\"setupWorker\", [this.dbName]).then(() => {\n logger.log(\"IndexedDB worker is ready\");\n });\n }\n return this.startPromise;\n }\n\n private doCmd<T>(command: string, args?: any): Promise<T> {\n // wrap in a q so if the postMessage throws,\n // the promise automatically gets rejected\n return Promise.resolve().then(() => {\n const seq = this.nextSeq++;\n const def = Promise.withResolvers<T>();\n\n this.inFlight[seq] = def;\n\n this.worker?.postMessage({ command, seq, args });\n\n return def.promise;\n });\n }\n\n private onWorkerMessage = (ev: MessageEvent): void => {\n const msg = ev.data;\n\n if (msg.command == \"closed\") {\n this.onClose?.();\n } else if (msg.command == \"cmd_success\" || msg.command == \"cmd_fail\") {\n if (msg.seq === undefined) {\n logger.error(\"Got reply from worker with no seq\");\n return;\n }\n\n const def = this.inFlight[msg.seq];\n if (def === undefined) {\n logger.error(\"Got reply for unknown seq \" + msg.seq);\n return;\n }\n delete this.inFlight[msg.seq];\n\n if (msg.command == \"cmd_success\") {\n def.resolve(msg.result);\n } else {\n const error = new Error(msg.error.message);\n error.name = msg.error.name;\n def.reject(error);\n }\n } else {\n logger.warn(\"Unrecognised message from worker: \", msg);\n }\n };\n\n /*\n * Destroy the web worker\n */\n public async destroy(): Promise<void> {\n this.worker?.terminate();\n }\n}\n"],"mappings":"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","ignoreList":[]}
|
|
1
|
+
{"version":3,"file":"indexeddb-remote-backend.js","names":["logger","RemoteIndexedDBStoreBackend","constructor","workerFactory","dbName","_defineProperty","ev","msg","data","command","_this$onClose","onClose","call","seq","undefined","error","def","inFlight","resolve","result","Error","message","name","reject","warn","connect","ensureStarted","then","doCmd","clearDatabase","isNewlyCreated","getSavedSync","getNextBatchToken","setSyncData","syncData","syncToDatabase","userTuples","getOutOfBandMembers","roomId","setOutOfBandMembers","membershipEvents","clearOutOfBandMembers","getClientOptions","storeClientOptions","options","getUserPresenceEvents","saveToDeviceBatches","batches","_this","_asyncToGenerator","getOldestToDeviceBatch","_this2","removeToDeviceBatch","id","_this3","getUserProfile","userId","_this4","storeUserProfiles","userProfiles","_this5","removeUserProfiles","userIds","_this6","startPromise","worker","onmessage","onWorkerMessage","log","args","Promise","_this$worker","nextSeq","withResolvers","postMessage","promise","destroy","_this7","_this7$worker","terminate"],"sources":["../../src/store/indexeddb-remote-backend.ts"],"sourcesContent":["/*\nCopyright 2017 - 2021 The Matrix.org Foundation C.I.C.\n\nLicensed under the Apache License, Version 2.0 (the \"License\");\nyou may not use this file except in compliance with the License.\nYou may obtain a copy of the License at\n\n http://www.apache.org/licenses/LICENSE-2.0\n\nUnless required by applicable law or agreed to in writing, software\ndistributed under the License is distributed on an \"AS IS\" BASIS,\nWITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\nSee the License for the specific language governing permissions and\nlimitations under the License.\n*/\n\nimport { logger } from \"../logger.ts\";\nimport { type ISavedSync } from \"./index.ts\";\nimport { type IStoredClientOpts } from \"../client.ts\";\nimport { type IStateEventWithRoomId, type ISyncResponse } from \"../matrix.ts\";\nimport { type IIndexedDBBackend, type UserTuple } from \"./indexeddb-backend.ts\";\nimport { type IndexedToDeviceBatch, type ToDeviceBatchWithTxnId } from \"../models/ToDeviceMessage.ts\";\nimport { type SyncUserProfile } from \"../models/user.ts\";\n\nexport class RemoteIndexedDBStoreBackend implements IIndexedDBBackend {\n private worker?: Worker;\n private nextSeq = 0;\n // The currently in-flight requests to the actual backend\n private inFlight: Record<number, PromiseWithResolvers<any>> = {}; // seq: promise\n // Once we start connecting, we keep the promise and re-use it\n // if we try to connect again\n private startPromise?: Promise<void>;\n // Callback for when the IndexedDB gets closed unexpectedly\n private onClose?(): void;\n\n /**\n * An IndexedDB store backend where the actual backend sits in a web\n * worker.\n *\n * Construct a new Indexed Database store backend. This requires a call to\n * `connect()` before this store can be used.\n * @param workerFactory - Factory which produces a Worker\n * @param dbName - Optional database name. The same name must be used\n * to open the same database.\n */\n public constructor(\n private readonly workerFactory: () => Worker,\n private readonly dbName?: string,\n ) {}\n\n /**\n * Attempt to connect to the database. This can fail if the user does not\n * grant permission.\n * @returns Promise which resolves if successfully connected.\n */\n public connect(onClose?: () => void): Promise<void> {\n this.onClose = onClose;\n return this.ensureStarted().then(() => this.doCmd(\"connect\"));\n }\n\n /**\n * Clear the entire database. This should be used when logging out of a client\n * to prevent mixing data between accounts.\n * @returns Resolved when the database is cleared.\n */\n public clearDatabase(): Promise<void> {\n return this.ensureStarted().then(() => this.doCmd(\"clearDatabase\"));\n }\n\n /** @returns whether or not the database was newly created in this session. */\n public isNewlyCreated(): Promise<boolean> {\n return this.doCmd(\"isNewlyCreated\");\n }\n\n /**\n * @returns Promise which resolves with a sync response to restore the\n * client state to where it was at the last save, or null if there\n * is no saved sync data.\n */\n public getSavedSync(): Promise<ISavedSync> {\n return this.doCmd(\"getSavedSync\");\n }\n\n public getNextBatchToken(): Promise<string> {\n return this.doCmd(\"getNextBatchToken\");\n }\n\n public setSyncData(syncData: ISyncResponse): Promise<void> {\n return this.doCmd(\"setSyncData\", [syncData]);\n }\n\n public syncToDatabase(userTuples: UserTuple[]): Promise<void> {\n return this.doCmd(\"syncToDatabase\", [userTuples]);\n }\n\n /**\n * Returns the out-of-band membership events for this room that\n * were previously loaded.\n * @returns the events, potentially an empty array if OOB loading didn't yield any new members\n * @returns in case the members for this room haven't been stored yet\n */\n public getOutOfBandMembers(roomId: string): Promise<IStateEventWithRoomId[] | null> {\n return this.doCmd(\"getOutOfBandMembers\", [roomId]);\n }\n\n /**\n * Stores the out-of-band membership events for this room. Note that\n * it still makes sense to store an empty array as the OOB status for the room is\n * marked as fetched, and getOutOfBandMembers will return an empty array instead of null\n * @param membershipEvents - the membership events to store\n * @returns when all members have been stored\n */\n public setOutOfBandMembers(roomId: string, membershipEvents: IStateEventWithRoomId[]): Promise<void> {\n return this.doCmd(\"setOutOfBandMembers\", [roomId, membershipEvents]);\n }\n\n public clearOutOfBandMembers(roomId: string): Promise<void> {\n return this.doCmd(\"clearOutOfBandMembers\", [roomId]);\n }\n\n public getClientOptions(): Promise<IStoredClientOpts | undefined> {\n return this.doCmd(\"getClientOptions\");\n }\n\n public storeClientOptions(options: IStoredClientOpts): Promise<void> {\n return this.doCmd(\"storeClientOptions\", [options]);\n }\n\n /**\n * Load all user presence events from the database. This is not cached.\n * @returns A list of presence events in their raw form.\n */\n public getUserPresenceEvents(): Promise<UserTuple[]> {\n return this.doCmd(\"getUserPresenceEvents\");\n }\n\n public async saveToDeviceBatches(batches: ToDeviceBatchWithTxnId[]): Promise<void> {\n return this.doCmd(\"saveToDeviceBatches\", [batches]);\n }\n\n public async getOldestToDeviceBatch(): Promise<IndexedToDeviceBatch | null> {\n return this.doCmd(\"getOldestToDeviceBatch\");\n }\n\n public async removeToDeviceBatch(id: number): Promise<void> {\n return this.doCmd(\"removeToDeviceBatch\", [id]);\n }\n\n public async getUserProfile(userId: string): Promise<SyncUserProfile | undefined> {\n return this.doCmd(\"getUserProfile\", [userId]);\n }\n\n public async storeUserProfiles(userProfiles: Map<string, SyncUserProfile>): Promise<void> {\n await this.doCmd(\"storeUserProfiles\", [userProfiles]);\n }\n\n public async removeUserProfiles(userIds: string[]): Promise<void> {\n await this.doCmd(\"removeUserProfiles\", [userIds]);\n }\n\n private ensureStarted(): Promise<void> {\n if (!this.startPromise) {\n this.worker = this.workerFactory();\n this.worker.onmessage = this.onWorkerMessage;\n\n // tell the worker the db name.\n this.startPromise = this.doCmd(\"setupWorker\", [this.dbName]).then(() => {\n logger.log(\"IndexedDB worker is ready\");\n });\n }\n return this.startPromise;\n }\n\n private doCmd<T>(command: string, args?: any): Promise<T> {\n // wrap in a q so if the postMessage throws,\n // the promise automatically gets rejected\n return Promise.resolve().then(() => {\n const seq = this.nextSeq++;\n const def = Promise.withResolvers<T>();\n\n this.inFlight[seq] = def;\n\n this.worker?.postMessage({ command, seq, args });\n\n return def.promise;\n });\n }\n\n private onWorkerMessage = (ev: MessageEvent): void => {\n const msg = ev.data;\n\n if (msg.command == \"closed\") {\n this.onClose?.();\n } else if (msg.command == \"cmd_success\" || msg.command == \"cmd_fail\") {\n if (msg.seq === undefined) {\n logger.error(\"Got reply from worker with no seq\");\n return;\n }\n\n const def = this.inFlight[msg.seq];\n if (def === undefined) {\n logger.error(\"Got reply for unknown seq \" + msg.seq);\n return;\n }\n delete this.inFlight[msg.seq];\n\n if (msg.command == \"cmd_success\") {\n def.resolve(msg.result);\n } else {\n const error = new Error(msg.error.message);\n error.name = msg.error.name;\n def.reject(error);\n }\n } else {\n logger.warn(\"Unrecognised message from worker: \", msg);\n }\n };\n\n /*\n * Destroy the web worker\n */\n public async destroy(): Promise<void> {\n this.worker?.terminate();\n }\n}\n"],"mappings":"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","ignoreList":[]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"indexeddb-store-worker.d.ts","sourceRoot":"","sources":["../../src/store/indexeddb-store-worker.ts"],"names":[],"mappings":"AAyBA;;;;;;;;;;;;;;;;GAgBG;AACH,qBAAa,oBAAoB;IAOV,OAAO,CAAC,QAAQ,CAAC,WAAW;IAN/C,OAAO,CAAC,OAAO,CAAC,CAA6B;IAE7C;;;OAGG;gBACiC,WAAW,EAAE,YAAY,CAAC,OAAO,MAAM,CAAC,CAAC,aAAa,CAAC;IAE3F,OAAO,CAAC,OAAO,CAIb;IAEF;;;;;OAKG;IACI,SAAS,GAAI,IAAI,YAAY,KAAG,IAAI,
|
|
1
|
+
{"version":3,"file":"indexeddb-store-worker.d.ts","sourceRoot":"","sources":["../../src/store/indexeddb-store-worker.ts"],"names":[],"mappings":"AAyBA;;;;;;;;;;;;;;;;GAgBG;AACH,qBAAa,oBAAoB;IAOV,OAAO,CAAC,QAAQ,CAAC,WAAW;IAN/C,OAAO,CAAC,OAAO,CAAC,CAA6B;IAE7C;;;OAGG;gBACiC,WAAW,EAAE,YAAY,CAAC,OAAO,MAAM,CAAC,CAAC,aAAa,CAAC;IAE3F,OAAO,CAAC,OAAO,CAIb;IAEF;;;;;OAKG;IACI,SAAS,GAAI,IAAI,YAAY,KAAG,IAAI,CAqGzC;CACL"}
|
|
@@ -54,7 +54,7 @@ export class IndexedDBStoreWorker {
|
|
|
54
54
|
* @param ev - The message event
|
|
55
55
|
*/
|
|
56
56
|
_defineProperty(this, "onMessage", ev => {
|
|
57
|
-
var _this$backend, _this$backend2, _this$backend3, _this$backend4, _this$backend5, _this$backend6, _this$backend7, _this$backend8, _this$backend9, _this$backend0, _this$backend1, _this$backend10, _this$backend11, _this$backend12, _this$backend13, _this$backend14;
|
|
57
|
+
var _this$backend, _this$backend2, _this$backend3, _this$backend4, _this$backend5, _this$backend6, _this$backend7, _this$backend8, _this$backend9, _this$backend0, _this$backend1, _this$backend10, _this$backend11, _this$backend12, _this$backend13, _this$backend14, _this$backend15, _this$backend16, _this$backend17;
|
|
58
58
|
var msg = ev.data;
|
|
59
59
|
var prom;
|
|
60
60
|
switch (msg.command) {
|
|
@@ -112,6 +112,15 @@ export class IndexedDBStoreWorker {
|
|
|
112
112
|
case "removeToDeviceBatch":
|
|
113
113
|
prom = (_this$backend14 = this.backend) === null || _this$backend14 === void 0 ? void 0 : _this$backend14.removeToDeviceBatch(msg.args[0]);
|
|
114
114
|
break;
|
|
115
|
+
case "getUserProfile":
|
|
116
|
+
prom = (_this$backend15 = this.backend) === null || _this$backend15 === void 0 ? void 0 : _this$backend15.getUserProfile(msg.args[0]);
|
|
117
|
+
break;
|
|
118
|
+
case "storeUserProfiles":
|
|
119
|
+
prom = (_this$backend16 = this.backend) === null || _this$backend16 === void 0 ? void 0 : _this$backend16.storeUserProfiles(msg.args[0]);
|
|
120
|
+
break;
|
|
121
|
+
case "removeUserProfiles":
|
|
122
|
+
prom = (_this$backend17 = this.backend) === null || _this$backend17 === void 0 ? void 0 : _this$backend17.removeUserProfiles(msg.args[0]);
|
|
123
|
+
break;
|
|
115
124
|
}
|
|
116
125
|
if (prom === undefined) {
|
|
117
126
|
this.postMessage({
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"indexeddb-store-worker.js","names":["LocalIndexedDBStoreBackend","logger","IndexedDBStoreWorker","constructor","postMessage","_defineProperty","call","command","ev","_this$backend","_this$backend2","_this$backend3","_this$backend4","_this$backend5","_this$backend6","_this$backend7","_this$backend8","_this$backend9","_this$backend0","_this$backend1","_this$backend10","_this$backend11","_this$backend12","_this$backend13","_this$backend14","msg","data","prom","backend","indexedDB","args","Promise","resolve","connect","onClose","isNewlyCreated","clearDatabase","getSavedSync","setSyncData","syncToDatabase","getUserPresenceEvents","getNextBatchToken","getOutOfBandMembers","clearOutOfBandMembers","setOutOfBandMembers","getClientOptions","storeClientOptions","saveToDeviceBatches","getOldestToDeviceBatch","removeToDeviceBatch","undefined","seq","error","then","ret","result","err","message","name"],"sources":["../../src/store/indexeddb-store-worker.ts"],"sourcesContent":["/*\nCopyright 2017 - 2021 The Matrix.org Foundation C.I.C.\n\nLicensed under the Apache License, Version 2.0 (the \"License\");\nyou may not use this file except in compliance with the License.\nYou may obtain a copy of the License at\n\n http://www.apache.org/licenses/LICENSE-2.0\n\nUnless required by applicable law or agreed to in writing, software\ndistributed under the License is distributed on an \"AS IS\" BASIS,\nWITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\nSee the License for the specific language governing permissions and\nlimitations under the License.\n*/\n\nimport { LocalIndexedDBStoreBackend } from \"./indexeddb-local-backend.ts\";\nimport { logger } from \"../logger.ts\";\n\ninterface ICmd {\n command: string;\n seq: number;\n args: any[];\n}\n\n/**\n * This class lives in the webworker and drives a LocalIndexedDBStoreBackend\n * controlled by messages from the main process.\n *\n * @example\n * It should be instantiated by a web worker script provided by the application\n * in a script, for example:\n * ```\n * import {IndexedDBStoreWorker} from 'matrix-js-sdk/lib/indexeddb-worker.js';\n * const remoteWorker = new IndexedDBStoreWorker(postMessage);\n * onmessage = remoteWorker.onMessage;\n * ```\n *\n * Note that it is advisable to import this class by referencing the file directly to\n * avoid a dependency on the whole js-sdk.\n *\n */\nexport class IndexedDBStoreWorker {\n private backend?: LocalIndexedDBStoreBackend;\n\n /**\n * @param postMessage - The web worker postMessage function that\n * should be used to communicate back to the main script.\n */\n public constructor(private readonly postMessage: InstanceType<typeof Worker>[\"postMessage\"]) {}\n\n private onClose = (): void => {\n this.postMessage.call(null, {\n command: \"closed\",\n });\n };\n\n /**\n * Passes a message event from the main script into the class. This method\n * can be directly assigned to the web worker `onmessage` variable.\n *\n * @param ev - The message event\n */\n public onMessage = (ev: MessageEvent): void => {\n const msg: ICmd = ev.data;\n let prom: Promise<any> | undefined;\n\n switch (msg.command) {\n case \"setupWorker\":\n // this is the 'indexedDB' global (where global != window\n // because it's a web worker and there is no window).\n this.backend = new LocalIndexedDBStoreBackend(indexedDB, msg.args[0]);\n prom = Promise.resolve();\n break;\n case \"connect\":\n prom = this.backend?.connect(this.onClose);\n break;\n case \"isNewlyCreated\":\n prom = this.backend?.isNewlyCreated();\n break;\n case \"clearDatabase\":\n prom = this.backend?.clearDatabase();\n break;\n case \"getSavedSync\":\n prom = this.backend?.getSavedSync(false);\n break;\n case \"setSyncData\":\n prom = this.backend?.setSyncData(msg.args[0]);\n break;\n case \"syncToDatabase\":\n prom = this.backend?.syncToDatabase(msg.args[0]);\n break;\n case \"getUserPresenceEvents\":\n prom = this.backend?.getUserPresenceEvents();\n break;\n case \"getNextBatchToken\":\n prom = this.backend?.getNextBatchToken();\n break;\n case \"getOutOfBandMembers\":\n prom = this.backend?.getOutOfBandMembers(msg.args[0]);\n break;\n case \"clearOutOfBandMembers\":\n prom = this.backend?.clearOutOfBandMembers(msg.args[0]);\n break;\n case \"setOutOfBandMembers\":\n prom = this.backend?.setOutOfBandMembers(msg.args[0], msg.args[1]);\n break;\n case \"getClientOptions\":\n prom = this.backend?.getClientOptions();\n break;\n case \"storeClientOptions\":\n prom = this.backend?.storeClientOptions(msg.args[0]);\n break;\n case \"saveToDeviceBatches\":\n prom = this.backend?.saveToDeviceBatches(msg.args[0]);\n break;\n case \"getOldestToDeviceBatch\":\n prom = this.backend?.getOldestToDeviceBatch();\n break;\n case \"removeToDeviceBatch\":\n prom = this.backend?.removeToDeviceBatch(msg.args[0]);\n break;\n }\n\n if (prom === undefined) {\n this.postMessage({\n command: \"cmd_fail\",\n seq: msg.seq,\n // Can't be an Error because they're not structured cloneable\n error: \"Unrecognised command\",\n });\n return;\n }\n\n prom.then(\n (ret) => {\n this.postMessage.call(null, {\n command: \"cmd_success\",\n seq: msg.seq,\n result: ret,\n });\n },\n (err) => {\n logger.error(\"Error running command: \" + msg.command, err);\n this.postMessage.call(null, {\n command: \"cmd_fail\",\n seq: msg.seq,\n // Just send a string because Error objects aren't cloneable\n error: {\n message: err.message,\n name: err.name,\n },\n });\n },\n );\n };\n}\n"],"mappings":"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","ignoreList":[]}
|
|
1
|
+
{"version":3,"file":"indexeddb-store-worker.js","names":["LocalIndexedDBStoreBackend","logger","IndexedDBStoreWorker","constructor","postMessage","_defineProperty","call","command","ev","_this$backend","_this$backend2","_this$backend3","_this$backend4","_this$backend5","_this$backend6","_this$backend7","_this$backend8","_this$backend9","_this$backend0","_this$backend1","_this$backend10","_this$backend11","_this$backend12","_this$backend13","_this$backend14","_this$backend15","_this$backend16","_this$backend17","msg","data","prom","backend","indexedDB","args","Promise","resolve","connect","onClose","isNewlyCreated","clearDatabase","getSavedSync","setSyncData","syncToDatabase","getUserPresenceEvents","getNextBatchToken","getOutOfBandMembers","clearOutOfBandMembers","setOutOfBandMembers","getClientOptions","storeClientOptions","saveToDeviceBatches","getOldestToDeviceBatch","removeToDeviceBatch","getUserProfile","storeUserProfiles","removeUserProfiles","undefined","seq","error","then","ret","result","err","message","name"],"sources":["../../src/store/indexeddb-store-worker.ts"],"sourcesContent":["/*\nCopyright 2017 - 2021 The Matrix.org Foundation C.I.C.\n\nLicensed under the Apache License, Version 2.0 (the \"License\");\nyou may not use this file except in compliance with the License.\nYou may obtain a copy of the License at\n\n http://www.apache.org/licenses/LICENSE-2.0\n\nUnless required by applicable law or agreed to in writing, software\ndistributed under the License is distributed on an \"AS IS\" BASIS,\nWITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\nSee the License for the specific language governing permissions and\nlimitations under the License.\n*/\n\nimport { LocalIndexedDBStoreBackend } from \"./indexeddb-local-backend.ts\";\nimport { logger } from \"../logger.ts\";\n\ninterface ICmd {\n command: string;\n seq: number;\n args: any[];\n}\n\n/**\n * This class lives in the webworker and drives a LocalIndexedDBStoreBackend\n * controlled by messages from the main process.\n *\n * @example\n * It should be instantiated by a web worker script provided by the application\n * in a script, for example:\n * ```\n * import {IndexedDBStoreWorker} from 'matrix-js-sdk/lib/indexeddb-worker.js';\n * const remoteWorker = new IndexedDBStoreWorker(postMessage);\n * onmessage = remoteWorker.onMessage;\n * ```\n *\n * Note that it is advisable to import this class by referencing the file directly to\n * avoid a dependency on the whole js-sdk.\n *\n */\nexport class IndexedDBStoreWorker {\n private backend?: LocalIndexedDBStoreBackend;\n\n /**\n * @param postMessage - The web worker postMessage function that\n * should be used to communicate back to the main script.\n */\n public constructor(private readonly postMessage: InstanceType<typeof Worker>[\"postMessage\"]) {}\n\n private onClose = (): void => {\n this.postMessage.call(null, {\n command: \"closed\",\n });\n };\n\n /**\n * Passes a message event from the main script into the class. This method\n * can be directly assigned to the web worker `onmessage` variable.\n *\n * @param ev - The message event\n */\n public onMessage = (ev: MessageEvent): void => {\n const msg: ICmd = ev.data;\n let prom: Promise<any> | undefined;\n\n switch (msg.command) {\n case \"setupWorker\":\n // this is the 'indexedDB' global (where global != window\n // because it's a web worker and there is no window).\n this.backend = new LocalIndexedDBStoreBackend(indexedDB, msg.args[0]);\n prom = Promise.resolve();\n break;\n case \"connect\":\n prom = this.backend?.connect(this.onClose);\n break;\n case \"isNewlyCreated\":\n prom = this.backend?.isNewlyCreated();\n break;\n case \"clearDatabase\":\n prom = this.backend?.clearDatabase();\n break;\n case \"getSavedSync\":\n prom = this.backend?.getSavedSync(false);\n break;\n case \"setSyncData\":\n prom = this.backend?.setSyncData(msg.args[0]);\n break;\n case \"syncToDatabase\":\n prom = this.backend?.syncToDatabase(msg.args[0]);\n break;\n case \"getUserPresenceEvents\":\n prom = this.backend?.getUserPresenceEvents();\n break;\n case \"getNextBatchToken\":\n prom = this.backend?.getNextBatchToken();\n break;\n case \"getOutOfBandMembers\":\n prom = this.backend?.getOutOfBandMembers(msg.args[0]);\n break;\n case \"clearOutOfBandMembers\":\n prom = this.backend?.clearOutOfBandMembers(msg.args[0]);\n break;\n case \"setOutOfBandMembers\":\n prom = this.backend?.setOutOfBandMembers(msg.args[0], msg.args[1]);\n break;\n case \"getClientOptions\":\n prom = this.backend?.getClientOptions();\n break;\n case \"storeClientOptions\":\n prom = this.backend?.storeClientOptions(msg.args[0]);\n break;\n case \"saveToDeviceBatches\":\n prom = this.backend?.saveToDeviceBatches(msg.args[0]);\n break;\n case \"getOldestToDeviceBatch\":\n prom = this.backend?.getOldestToDeviceBatch();\n break;\n case \"removeToDeviceBatch\":\n prom = this.backend?.removeToDeviceBatch(msg.args[0]);\n break;\n case \"getUserProfile\":\n prom = this.backend?.getUserProfile(msg.args[0]);\n break;\n case \"storeUserProfiles\":\n prom = this.backend?.storeUserProfiles(msg.args[0]);\n break;\n case \"removeUserProfiles\":\n prom = this.backend?.removeUserProfiles(msg.args[0]);\n break;\n }\n\n if (prom === undefined) {\n this.postMessage({\n command: \"cmd_fail\",\n seq: msg.seq,\n // Can't be an Error because they're not structured cloneable\n error: \"Unrecognised command\",\n });\n return;\n }\n\n prom.then(\n (ret) => {\n this.postMessage.call(null, {\n command: \"cmd_success\",\n seq: msg.seq,\n result: ret,\n });\n },\n (err) => {\n logger.error(\"Error running command: \" + msg.command, err);\n this.postMessage.call(null, {\n command: \"cmd_fail\",\n seq: msg.seq,\n // Just send a string because Error objects aren't cloneable\n error: {\n message: err.message,\n name: err.name,\n },\n });\n },\n );\n };\n}\n"],"mappings":"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","ignoreList":[]}
|
package/lib/store/indexeddb.d.ts
CHANGED
|
@@ -7,6 +7,7 @@ import { type EventEmitterEvents } from "../models/typed-event-emitter.ts";
|
|
|
7
7
|
import { type IStateEventWithRoomId } from "../@types/search.ts";
|
|
8
8
|
import { type IndexedToDeviceBatch, type ToDeviceBatchWithTxnId } from "../models/ToDeviceMessage.ts";
|
|
9
9
|
import { type IStoredClientOpts } from "../client.ts";
|
|
10
|
+
import { type SyncUserProfile } from "../models/user.ts";
|
|
10
11
|
interface IOpts extends IBaseOpts {
|
|
11
12
|
/** The Indexed DB interface e.g. `window.indexedDB` */
|
|
12
13
|
indexedDB?: IDBFactory;
|
|
@@ -136,6 +137,9 @@ export declare class IndexedDBStore extends MemoryStore {
|
|
|
136
137
|
saveToDeviceBatches(batches: ToDeviceBatchWithTxnId[]): Promise<void>;
|
|
137
138
|
getOldestToDeviceBatch(): Promise<IndexedToDeviceBatch | null>;
|
|
138
139
|
removeToDeviceBatch(id: number): Promise<void>;
|
|
140
|
+
getUserProfile(userId: string): Promise<SyncUserProfile | undefined>;
|
|
141
|
+
storeUserProfiles(userProfiles: Map<string, SyncUserProfile>): Promise<void>;
|
|
142
|
+
removeUserProfiles(userIds: string[]): Promise<void>;
|
|
139
143
|
}
|
|
140
144
|
type DegradableFn<A extends Array<any>, T> = (...args: A) => Promise<T>;
|
|
141
145
|
export {};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"indexeddb.d.ts","sourceRoot":"","sources":["../../src/store/indexeddb.ts"],"names":[],"mappings":"AAkBA,OAAO,EAAE,WAAW,EAAE,KAAK,KAAK,IAAI,SAAS,EAAE,MAAM,aAAa,CAAC;AAGnE,OAAO,EAAE,KAAK,MAAM,EAAe,MAAM,oBAAoB,CAAC;AAE9D,OAAO,EAAE,KAAK,UAAU,EAAE,MAAM,YAAY,CAAC;AAC7C,OAAO,EAAE,KAAK,iBAAiB,EAAE,MAAM,wBAAwB,CAAC;AAChE,OAAO,EAAE,KAAK,aAAa,EAAE,MAAM,wBAAwB,CAAC;AAC5D,OAAO,EAAE,KAAK,kBAAkB,EAAqB,MAAM,kCAAkC,CAAC;AAC9F,OAAO,EAAE,KAAK,qBAAqB,EAAE,MAAM,qBAAqB,CAAC;AACjE,OAAO,EAAE,KAAK,oBAAoB,EAAE,KAAK,sBAAsB,EAAE,MAAM,8BAA8B,CAAC;AACtG,OAAO,EAAE,KAAK,iBAAiB,EAAE,MAAM,cAAc,CAAC;
|
|
1
|
+
{"version":3,"file":"indexeddb.d.ts","sourceRoot":"","sources":["../../src/store/indexeddb.ts"],"names":[],"mappings":"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"}
|
package/lib/store/indexeddb.js
CHANGED
|
@@ -335,6 +335,24 @@ export class IndexedDBStore extends MemoryStore {
|
|
|
335
335
|
removeToDeviceBatch(id) {
|
|
336
336
|
return this.backend.removeToDeviceBatch(id);
|
|
337
337
|
}
|
|
338
|
+
getUserProfile(userId) {
|
|
339
|
+
var _this4 = this;
|
|
340
|
+
return _asyncToGenerator(function* () {
|
|
341
|
+
return _this4.backend.getUserProfile(userId);
|
|
342
|
+
})();
|
|
343
|
+
}
|
|
344
|
+
storeUserProfiles(userProfiles) {
|
|
345
|
+
var _this5 = this;
|
|
346
|
+
return _asyncToGenerator(function* () {
|
|
347
|
+
return _this5.backend.storeUserProfiles(userProfiles);
|
|
348
|
+
})();
|
|
349
|
+
}
|
|
350
|
+
removeUserProfiles(userIds) {
|
|
351
|
+
var _this6 = this;
|
|
352
|
+
return _asyncToGenerator(function* () {
|
|
353
|
+
return _this6.backend.removeUserProfiles(userIds);
|
|
354
|
+
})();
|
|
355
|
+
}
|
|
338
356
|
}
|
|
339
357
|
|
|
340
358
|
/**
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"indexeddb.js","names":["MemoryStore","LocalIndexedDBStoreBackend","RemoteIndexedDBStoreBackend","MatrixEvent","logger","TypedEventEmitter","WRITE_DELAY_MS","IndexedDBStore","exists","indexedDB","dbName","constructor","opts","_defineProperty","emitter","emit","degradable","backend","getSavedSync","isNewlyCreated","getNextBatchToken","deleteAllData","clearDatabase","then","log","err","error","concat","syncTs","Date","now","userTuples","u","getUsers","userModifiedMap","userId","getLastModifiedTime","events","presence","push","event","syncToDatabase","syncData","setSyncData","roomId","getOutOfBandMembers","membershipEvents","setOutOfBandMembers","clearOutOfBandMembers","getClientOptions","options","storeClientOptions","Error","workerFactory","on","handler","startup","startedUp","Promise","resolve","connect","onClose","getUserPresenceEvents","userPresenceEvents","forEach","_ref","rawEvent","createUser","setPresenceEvent","storeUser","destroy","wantsSave","save","force","arguments","length","undefined","reallySave","func","fallback","_this","fallbackFn","_asyncToGenerator","_len","args","Array","_key","call","e","warn","getPendingEvents","_superprop_getGetPendingEvents","_this2","localStorage","serialized","getItem","pendingEventsKey","JSON","parse","setPendingEvents","_superprop_getSetPendingEvents","_this3","setItem","stringify","removeItem","saveToDeviceBatches","batches","getOldestToDeviceBatch","removeToDeviceBatch","id"],"sources":["../../src/store/indexeddb.ts"],"sourcesContent":["/*\nCopyright 2017 - 2021 Vector Creations Ltd\n\nLicensed under the Apache License, Version 2.0 (the \"License\");\nyou may not use this file except in compliance with the License.\nYou may obtain a copy of the License at\n\n http://www.apache.org/licenses/LICENSE-2.0\n\nUnless required by applicable law or agreed to in writing, software\ndistributed under the License is distributed on an \"AS IS\" BASIS,\nWITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\nSee the License for the specific language governing permissions and\nlimitations under the License.\n*/\n\n/* eslint-disable @babel/no-invalid-this */\n\nimport { MemoryStore, type IOpts as IBaseOpts } from \"./memory.ts\";\nimport { LocalIndexedDBStoreBackend } from \"./indexeddb-local-backend.ts\";\nimport { RemoteIndexedDBStoreBackend } from \"./indexeddb-remote-backend.ts\";\nimport { type IEvent, MatrixEvent } from \"../models/event.ts\";\nimport { logger } from \"../logger.ts\";\nimport { type ISavedSync } from \"./index.ts\";\nimport { type IIndexedDBBackend } from \"./indexeddb-backend.ts\";\nimport { type ISyncResponse } from \"../sync-accumulator.ts\";\nimport { type EventEmitterEvents, TypedEventEmitter } from \"../models/typed-event-emitter.ts\";\nimport { type IStateEventWithRoomId } from \"../@types/search.ts\";\nimport { type IndexedToDeviceBatch, type ToDeviceBatchWithTxnId } from \"../models/ToDeviceMessage.ts\";\nimport { type IStoredClientOpts } from \"../client.ts\";\n\n/**\n * This is an internal module. See {@link IndexedDBStore} for the public class.\n */\n\n// If this value is too small we'll be writing very often which will cause\n// noticeable stop-the-world pauses. If this value is too big we'll be writing\n// so infrequently that the /sync size gets bigger on reload. Writing more\n// often does not affect the length of the pause since the entire /sync\n// response is persisted each time.\nconst WRITE_DELAY_MS = 1000 * 60 * 5; // once every 5 minutes\n\ninterface IOpts extends IBaseOpts {\n /** The Indexed DB interface e.g. `window.indexedDB` */\n indexedDB?: IDBFactory;\n /** Optional database name. The same name must be used to open the same database. */\n dbName?: string;\n /** Optional factory to spin up a Worker to execute the IDB transactions within. */\n workerFactory?: () => Worker;\n}\n\ntype EventHandlerMap = {\n // Fired when an IDB command fails on a degradable path, and the store falls back to MemoryStore\n // This signals the potential for data volatility.\n degraded: (e: Error) => void;\n // Fired when the IndexedDB gets closed unexpectedly, for example, if the underlying storage is removed or\n // if the user clears the database in the browser's history preferences.\n closed: () => void;\n};\n\nexport class IndexedDBStore extends MemoryStore {\n public static exists(indexedDB: IDBFactory, dbName: string): Promise<boolean> {\n return LocalIndexedDBStoreBackend.exists(indexedDB, dbName);\n }\n\n /**\n * The backend instance.\n * Call through to this API if you need to perform specific indexeddb actions like deleting the database.\n */\n public readonly backend: IIndexedDBBackend;\n\n private startedUp = false;\n private syncTs = 0;\n // Records the last-modified-time of each user at the last point we saved\n // the database, such that we can derive the set if users that have been\n // modified since we last saved.\n private userModifiedMap: Record<string, number> = {}; // user_id : timestamp\n private emitter = new TypedEventEmitter<keyof EventHandlerMap, EventHandlerMap>();\n\n /**\n * Construct a new Indexed Database store, which extends MemoryStore.\n *\n * This store functions like a MemoryStore except it periodically persists\n * the contents of the store to an IndexedDB backend.\n *\n * All data is still kept in-memory but can be loaded from disk by calling\n * `startup()`. This can make startup times quicker as a complete\n * sync from the server is not required. This does not reduce memory usage as all\n * the data is eagerly fetched when `startup()` is called.\n * ```\n * let opts = { indexedDB: window.indexedDB, localStorage: window.localStorage };\n * let store = new IndexedDBStore(opts);\n * let client = sdk.createClient({\n * store: store,\n * });\n * await store.startup(); // load from indexed db, must be called after createClient\n * client.startClient();\n * client.on(\"sync\", function(state, prevState, data) {\n * if (state === \"PREPARED\") {\n * console.log(\"Started up, now with go faster stripes!\");\n * }\n * });\n * ```\n *\n * @param opts - Options object.\n */\n public constructor(opts: IOpts) {\n super(opts);\n\n if (!opts.indexedDB) {\n throw new Error(\"Missing required option: indexedDB\");\n }\n\n if (opts.workerFactory) {\n this.backend = new RemoteIndexedDBStoreBackend(opts.workerFactory, opts.dbName);\n } else {\n this.backend = new LocalIndexedDBStoreBackend(opts.indexedDB, opts.dbName);\n }\n }\n\n /** Re-exports `TypedEventEmitter.on` */\n public on(event: EventEmitterEvents | \"degraded\" | \"closed\", handler: (...args: any[]) => void): void {\n this.emitter.on(event, handler);\n }\n\n /**\n * @returns Resolved when loaded from indexed db.\n */\n public startup(): Promise<void> {\n if (this.startedUp) {\n logger.log(`IndexedDBStore.startup: already started`);\n return Promise.resolve();\n }\n\n logger.log(`IndexedDBStore.startup: connecting to backend`);\n return this.backend\n .connect(this.onClose)\n .then(() => {\n logger.log(`IndexedDBStore.startup: loading presence events`);\n return this.backend.getUserPresenceEvents();\n })\n .then((userPresenceEvents) => {\n logger.log(`IndexedDBStore.startup: processing presence events`);\n userPresenceEvents.forEach(([userId, rawEvent]) => {\n if (!this.createUser) {\n throw new Error(\n \"`IndexedDBStore.startup` must be called after assigning it to the client, not before!\",\n );\n }\n const u = this.createUser(userId);\n if (rawEvent) {\n u.setPresenceEvent(new MatrixEvent(rawEvent));\n }\n this.userModifiedMap[u.userId] = u.getLastModifiedTime();\n this.storeUser(u);\n });\n this.startedUp = true;\n });\n }\n\n /*\n * Close the database and destroy any associated workers\n */\n public destroy(): Promise<void> {\n return this.backend.destroy();\n }\n\n private onClose = (): void => {\n this.emitter.emit(\"closed\");\n };\n\n /**\n * @returns Promise which resolves with a sync response to restore the\n * client state to where it was at the last save, or null if there\n * is no saved sync data.\n */\n public getSavedSync = this.degradable((): Promise<ISavedSync | null> => {\n return this.backend.getSavedSync();\n }, \"getSavedSync\");\n\n /** @returns whether or not the database was newly created in this session. */\n public isNewlyCreated = this.degradable((): Promise<boolean> => {\n return this.backend.isNewlyCreated();\n }, \"isNewlyCreated\");\n\n /**\n * @returns If there is a saved sync, the nextBatch token\n * for this sync, otherwise null.\n */\n public getSavedSyncToken = this.degradable((): Promise<string | null> => {\n return this.backend.getNextBatchToken();\n }, \"getSavedSyncToken\");\n\n /**\n * Delete all data from this store.\n * @returns Promise which resolves if the data was deleted from the database.\n */\n public deleteAllData = this.degradable((): Promise<void> => {\n super.deleteAllData();\n return this.backend.clearDatabase().then(\n () => {\n logger.log(\"Deleted indexeddb data.\");\n },\n (err) => {\n logger.error(`Failed to delete indexeddb data: ${err}`);\n throw err;\n },\n );\n }, null);\n\n /**\n * Whether this store would like to save its data\n * Note that obviously whether the store wants to save or\n * not could change between calling this function and calling\n * save().\n *\n * @returns True if calling save() will actually save\n * (at the time this function is called).\n */\n public wantsSave(): boolean {\n const now = Date.now();\n return now - this.syncTs > WRITE_DELAY_MS;\n }\n\n /**\n * Possibly write data to the database.\n *\n * @param force - True to force a save to happen\n * @returns Promise resolves after the write completes\n * (or immediately if no write is performed)\n */\n public save(force = false): Promise<void> {\n if (force || this.wantsSave()) {\n return this.reallySave();\n }\n return Promise.resolve();\n }\n\n private reallySave = this.degradable((): Promise<void> => {\n this.syncTs = Date.now(); // set now to guard against multi-writes\n\n // work out changed users (this doesn't handle deletions but you\n // can't 'delete' users as they are just presence events).\n const userTuples: [userId: string, presenceEvent: Partial<IEvent>][] = [];\n for (const u of this.getUsers()) {\n if (this.userModifiedMap[u.userId] === u.getLastModifiedTime()) continue;\n if (!u.events.presence) continue;\n\n userTuples.push([u.userId, u.events.presence.event]);\n\n // note that we've saved this version of the user\n this.userModifiedMap[u.userId] = u.getLastModifiedTime();\n }\n\n return this.backend.syncToDatabase(userTuples);\n }, null);\n\n public setSyncData = this.degradable((syncData: ISyncResponse): Promise<void> => {\n return this.backend.setSyncData(syncData);\n }, \"setSyncData\");\n\n /**\n * Returns the out-of-band membership events for this room that\n * were previously loaded.\n * @returns the events, potentially an empty array if OOB loading didn't yield any new members\n * @returns in case the members for this room haven't been stored yet\n */\n public getOutOfBandMembers = this.degradable((roomId: string): Promise<IStateEventWithRoomId[] | null> => {\n return this.backend.getOutOfBandMembers(roomId);\n }, \"getOutOfBandMembers\");\n\n /**\n * Stores the out-of-band membership events for this room. Note that\n * it still makes sense to store an empty array as the OOB status for the room is\n * marked as fetched, and getOutOfBandMembers will return an empty array instead of null\n * @param membershipEvents - the membership events to store\n * @returns when all members have been stored\n */\n public setOutOfBandMembers = this.degradable(\n (roomId: string, membershipEvents: IStateEventWithRoomId[]): Promise<void> => {\n super.setOutOfBandMembers(roomId, membershipEvents);\n return this.backend.setOutOfBandMembers(roomId, membershipEvents);\n },\n \"setOutOfBandMembers\",\n );\n\n public clearOutOfBandMembers = this.degradable((roomId: string) => {\n super.clearOutOfBandMembers(roomId);\n return this.backend.clearOutOfBandMembers(roomId);\n }, \"clearOutOfBandMembers\");\n\n public getClientOptions = this.degradable((): Promise<IStoredClientOpts | undefined> => {\n return this.backend.getClientOptions();\n }, \"getClientOptions\");\n\n public storeClientOptions = this.degradable((options: IStoredClientOpts): Promise<void> => {\n super.storeClientOptions(options);\n return this.backend.storeClientOptions(options);\n }, \"storeClientOptions\");\n\n /**\n * All member functions of `IndexedDBStore` that access the backend use this wrapper to\n * watch for failures after initial store startup, including `QuotaExceededError` as\n * free disk space changes, etc.\n *\n * When IndexedDB fails via any of these paths, we degrade this back to a `MemoryStore`\n * in place so that the current operation and all future ones are in-memory only.\n *\n * @param func - The degradable work to do.\n * @param fallback - The method name for fallback.\n * @returns A wrapped member function.\n */\n private degradable<A extends Array<any>, F extends keyof MemoryStore | null, R = void>(\n func: DegradableFn<A, R>,\n fallback: F,\n ): DegradableFn<A, F extends string ? R : void> {\n const fallbackFn = fallback ? (super[fallback] as (...args: A) => Promise<R>) : null;\n\n return (async (...args) => {\n try {\n return await func.call(this, ...args);\n } catch (e) {\n logger.error(\"IndexedDBStore failure, degrading to MemoryStore\", e);\n this.emitter.emit(\"degraded\", e as Error);\n try {\n // We try to delete IndexedDB after degrading since this store is only a\n // cache (the app will still function correctly without the data).\n // It's possible that deleting repair IndexedDB for the next app load,\n // potentially by making a little more space available.\n logger.log(\"IndexedDBStore trying to delete degraded data\");\n await this.backend.clearDatabase();\n logger.log(\"IndexedDBStore delete after degrading succeeded\");\n } catch (e) {\n logger.warn(\"IndexedDBStore delete after degrading failed\", e);\n }\n // Degrade the store from being an instance of `IndexedDBStore` to instead be\n // an instance of `MemoryStore` so that future API calls use the memory path\n // directly and skip IndexedDB entirely. This should be safe as\n // `IndexedDBStore` already extends from `MemoryStore`, so we are making the\n // store become its parent type in a way. The mutator methods of\n // `IndexedDBStore` also maintain the state that `MemoryStore` uses (many are\n // not overridden at all).\n if (fallbackFn) {\n return fallbackFn.call(this, ...args);\n }\n }\n }) as DegradableFn<A, F extends string ? R : void>;\n }\n\n // XXX: ideally these would be stored in indexeddb as part of the room but,\n // we don't store rooms as such and instead accumulate entire sync responses atm.\n public async getPendingEvents(roomId: string): Promise<Partial<IEvent>[]> {\n if (!this.localStorage) return super.getPendingEvents(roomId);\n\n const serialized = this.localStorage.getItem(pendingEventsKey(roomId));\n if (serialized) {\n try {\n return JSON.parse(serialized);\n } catch (e) {\n logger.error(\"Could not parse persisted pending events\", e);\n }\n }\n return [];\n }\n\n public async setPendingEvents(roomId: string, events: Partial<IEvent>[]): Promise<void> {\n if (!this.localStorage) return super.setPendingEvents(roomId, events);\n\n if (events.length > 0) {\n this.localStorage.setItem(pendingEventsKey(roomId), JSON.stringify(events));\n } else {\n this.localStorage.removeItem(pendingEventsKey(roomId));\n }\n }\n\n public saveToDeviceBatches(batches: ToDeviceBatchWithTxnId[]): Promise<void> {\n return this.backend.saveToDeviceBatches(batches);\n }\n\n public getOldestToDeviceBatch(): Promise<IndexedToDeviceBatch | null> {\n return this.backend.getOldestToDeviceBatch();\n }\n\n public removeToDeviceBatch(id: number): Promise<void> {\n return this.backend.removeToDeviceBatch(id);\n }\n}\n\n/**\n * @param roomId - ID of the current room\n * @returns Storage key to retrieve pending events\n */\nfunction pendingEventsKey(roomId: string): string {\n return `mx_pending_events_${roomId}`;\n}\n\ntype DegradableFn<A extends Array<any>, T> = (...args: A) => Promise<T>;\n"],"mappings":"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","ignoreList":[]}
|
|
1
|
+
{"version":3,"file":"indexeddb.js","names":["MemoryStore","LocalIndexedDBStoreBackend","RemoteIndexedDBStoreBackend","MatrixEvent","logger","TypedEventEmitter","WRITE_DELAY_MS","IndexedDBStore","exists","indexedDB","dbName","constructor","opts","_defineProperty","emitter","emit","degradable","backend","getSavedSync","isNewlyCreated","getNextBatchToken","deleteAllData","clearDatabase","then","log","err","error","concat","syncTs","Date","now","userTuples","u","getUsers","userModifiedMap","userId","getLastModifiedTime","events","presence","push","event","syncToDatabase","syncData","setSyncData","roomId","getOutOfBandMembers","membershipEvents","setOutOfBandMembers","clearOutOfBandMembers","getClientOptions","options","storeClientOptions","Error","workerFactory","on","handler","startup","startedUp","Promise","resolve","connect","onClose","getUserPresenceEvents","userPresenceEvents","forEach","_ref","rawEvent","createUser","setPresenceEvent","storeUser","destroy","wantsSave","save","force","arguments","length","undefined","reallySave","func","fallback","_this","fallbackFn","_asyncToGenerator","_len","args","Array","_key","call","e","warn","getPendingEvents","_superprop_getGetPendingEvents","_this2","localStorage","serialized","getItem","pendingEventsKey","JSON","parse","setPendingEvents","_superprop_getSetPendingEvents","_this3","setItem","stringify","removeItem","saveToDeviceBatches","batches","getOldestToDeviceBatch","removeToDeviceBatch","id","getUserProfile","_this4","storeUserProfiles","userProfiles","_this5","removeUserProfiles","userIds","_this6"],"sources":["../../src/store/indexeddb.ts"],"sourcesContent":["/*\nCopyright 2017 - 2021 Vector Creations Ltd\n\nLicensed under the Apache License, Version 2.0 (the \"License\");\nyou may not use this file except in compliance with the License.\nYou may obtain a copy of the License at\n\n http://www.apache.org/licenses/LICENSE-2.0\n\nUnless required by applicable law or agreed to in writing, software\ndistributed under the License is distributed on an \"AS IS\" BASIS,\nWITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\nSee the License for the specific language governing permissions and\nlimitations under the License.\n*/\n\n/* eslint-disable @babel/no-invalid-this */\n\nimport { MemoryStore, type IOpts as IBaseOpts } from \"./memory.ts\";\nimport { LocalIndexedDBStoreBackend } from \"./indexeddb-local-backend.ts\";\nimport { RemoteIndexedDBStoreBackend } from \"./indexeddb-remote-backend.ts\";\nimport { type IEvent, MatrixEvent } from \"../models/event.ts\";\nimport { logger } from \"../logger.ts\";\nimport { type ISavedSync } from \"./index.ts\";\nimport { type IIndexedDBBackend } from \"./indexeddb-backend.ts\";\nimport { type ISyncResponse } from \"../sync-accumulator.ts\";\nimport { type EventEmitterEvents, TypedEventEmitter } from \"../models/typed-event-emitter.ts\";\nimport { type IStateEventWithRoomId } from \"../@types/search.ts\";\nimport { type IndexedToDeviceBatch, type ToDeviceBatchWithTxnId } from \"../models/ToDeviceMessage.ts\";\nimport { type IStoredClientOpts } from \"../client.ts\";\nimport { type SyncUserProfile } from \"../models/user.ts\";\n\n/**\n * This is an internal module. See {@link IndexedDBStore} for the public class.\n */\n\n// If this value is too small we'll be writing very often which will cause\n// noticeable stop-the-world pauses. If this value is too big we'll be writing\n// so infrequently that the /sync size gets bigger on reload. Writing more\n// often does not affect the length of the pause since the entire /sync\n// response is persisted each time.\nconst WRITE_DELAY_MS = 1000 * 60 * 5; // once every 5 minutes\n\ninterface IOpts extends IBaseOpts {\n /** The Indexed DB interface e.g. `window.indexedDB` */\n indexedDB?: IDBFactory;\n /** Optional database name. The same name must be used to open the same database. */\n dbName?: string;\n /** Optional factory to spin up a Worker to execute the IDB transactions within. */\n workerFactory?: () => Worker;\n}\n\ntype EventHandlerMap = {\n // Fired when an IDB command fails on a degradable path, and the store falls back to MemoryStore\n // This signals the potential for data volatility.\n degraded: (e: Error) => void;\n // Fired when the IndexedDB gets closed unexpectedly, for example, if the underlying storage is removed or\n // if the user clears the database in the browser's history preferences.\n closed: () => void;\n};\n\nexport class IndexedDBStore extends MemoryStore {\n public static exists(indexedDB: IDBFactory, dbName: string): Promise<boolean> {\n return LocalIndexedDBStoreBackend.exists(indexedDB, dbName);\n }\n\n /**\n * The backend instance.\n * Call through to this API if you need to perform specific indexeddb actions like deleting the database.\n */\n public readonly backend: IIndexedDBBackend;\n\n private startedUp = false;\n private syncTs = 0;\n // Records the last-modified-time of each user at the last point we saved\n // the database, such that we can derive the set if users that have been\n // modified since we last saved.\n private userModifiedMap: Record<string, number> = {}; // user_id : timestamp\n private emitter = new TypedEventEmitter<keyof EventHandlerMap, EventHandlerMap>();\n\n /**\n * Construct a new Indexed Database store, which extends MemoryStore.\n *\n * This store functions like a MemoryStore except it periodically persists\n * the contents of the store to an IndexedDB backend.\n *\n * All data is still kept in-memory but can be loaded from disk by calling\n * `startup()`. This can make startup times quicker as a complete\n * sync from the server is not required. This does not reduce memory usage as all\n * the data is eagerly fetched when `startup()` is called.\n * ```\n * let opts = { indexedDB: window.indexedDB, localStorage: window.localStorage };\n * let store = new IndexedDBStore(opts);\n * let client = sdk.createClient({\n * store: store,\n * });\n * await store.startup(); // load from indexed db, must be called after createClient\n * client.startClient();\n * client.on(\"sync\", function(state, prevState, data) {\n * if (state === \"PREPARED\") {\n * console.log(\"Started up, now with go faster stripes!\");\n * }\n * });\n * ```\n *\n * @param opts - Options object.\n */\n public constructor(opts: IOpts) {\n super(opts);\n\n if (!opts.indexedDB) {\n throw new Error(\"Missing required option: indexedDB\");\n }\n\n if (opts.workerFactory) {\n this.backend = new RemoteIndexedDBStoreBackend(opts.workerFactory, opts.dbName);\n } else {\n this.backend = new LocalIndexedDBStoreBackend(opts.indexedDB, opts.dbName);\n }\n }\n\n /** Re-exports `TypedEventEmitter.on` */\n public on(event: EventEmitterEvents | \"degraded\" | \"closed\", handler: (...args: any[]) => void): void {\n this.emitter.on(event, handler);\n }\n\n /**\n * @returns Resolved when loaded from indexed db.\n */\n public startup(): Promise<void> {\n if (this.startedUp) {\n logger.log(`IndexedDBStore.startup: already started`);\n return Promise.resolve();\n }\n\n logger.log(`IndexedDBStore.startup: connecting to backend`);\n return this.backend\n .connect(this.onClose)\n .then(() => {\n logger.log(`IndexedDBStore.startup: loading presence events`);\n return this.backend.getUserPresenceEvents();\n })\n .then((userPresenceEvents) => {\n logger.log(`IndexedDBStore.startup: processing presence events`);\n userPresenceEvents.forEach(([userId, rawEvent]) => {\n if (!this.createUser) {\n throw new Error(\n \"`IndexedDBStore.startup` must be called after assigning it to the client, not before!\",\n );\n }\n const u = this.createUser(userId);\n if (rawEvent) {\n u.setPresenceEvent(new MatrixEvent(rawEvent));\n }\n this.userModifiedMap[u.userId] = u.getLastModifiedTime();\n this.storeUser(u);\n });\n this.startedUp = true;\n });\n }\n\n /*\n * Close the database and destroy any associated workers\n */\n public destroy(): Promise<void> {\n return this.backend.destroy();\n }\n\n private onClose = (): void => {\n this.emitter.emit(\"closed\");\n };\n\n /**\n * @returns Promise which resolves with a sync response to restore the\n * client state to where it was at the last save, or null if there\n * is no saved sync data.\n */\n public getSavedSync = this.degradable((): Promise<ISavedSync | null> => {\n return this.backend.getSavedSync();\n }, \"getSavedSync\");\n\n /** @returns whether or not the database was newly created in this session. */\n public isNewlyCreated = this.degradable((): Promise<boolean> => {\n return this.backend.isNewlyCreated();\n }, \"isNewlyCreated\");\n\n /**\n * @returns If there is a saved sync, the nextBatch token\n * for this sync, otherwise null.\n */\n public getSavedSyncToken = this.degradable((): Promise<string | null> => {\n return this.backend.getNextBatchToken();\n }, \"getSavedSyncToken\");\n\n /**\n * Delete all data from this store.\n * @returns Promise which resolves if the data was deleted from the database.\n */\n public deleteAllData = this.degradable((): Promise<void> => {\n super.deleteAllData();\n return this.backend.clearDatabase().then(\n () => {\n logger.log(\"Deleted indexeddb data.\");\n },\n (err) => {\n logger.error(`Failed to delete indexeddb data: ${err}`);\n throw err;\n },\n );\n }, null);\n\n /**\n * Whether this store would like to save its data\n * Note that obviously whether the store wants to save or\n * not could change between calling this function and calling\n * save().\n *\n * @returns True if calling save() will actually save\n * (at the time this function is called).\n */\n public wantsSave(): boolean {\n const now = Date.now();\n return now - this.syncTs > WRITE_DELAY_MS;\n }\n\n /**\n * Possibly write data to the database.\n *\n * @param force - True to force a save to happen\n * @returns Promise resolves after the write completes\n * (or immediately if no write is performed)\n */\n public save(force = false): Promise<void> {\n if (force || this.wantsSave()) {\n return this.reallySave();\n }\n return Promise.resolve();\n }\n\n private reallySave = this.degradable((): Promise<void> => {\n this.syncTs = Date.now(); // set now to guard against multi-writes\n\n // work out changed users (this doesn't handle deletions but you\n // can't 'delete' users as they are just presence events).\n const userTuples: [userId: string, presenceEvent: Partial<IEvent>][] = [];\n for (const u of this.getUsers()) {\n if (this.userModifiedMap[u.userId] === u.getLastModifiedTime()) continue;\n if (!u.events.presence) continue;\n\n userTuples.push([u.userId, u.events.presence.event]);\n\n // note that we've saved this version of the user\n this.userModifiedMap[u.userId] = u.getLastModifiedTime();\n }\n\n return this.backend.syncToDatabase(userTuples);\n }, null);\n\n public setSyncData = this.degradable((syncData: ISyncResponse): Promise<void> => {\n return this.backend.setSyncData(syncData);\n }, \"setSyncData\");\n\n /**\n * Returns the out-of-band membership events for this room that\n * were previously loaded.\n * @returns the events, potentially an empty array if OOB loading didn't yield any new members\n * @returns in case the members for this room haven't been stored yet\n */\n public getOutOfBandMembers = this.degradable((roomId: string): Promise<IStateEventWithRoomId[] | null> => {\n return this.backend.getOutOfBandMembers(roomId);\n }, \"getOutOfBandMembers\");\n\n /**\n * Stores the out-of-band membership events for this room. Note that\n * it still makes sense to store an empty array as the OOB status for the room is\n * marked as fetched, and getOutOfBandMembers will return an empty array instead of null\n * @param membershipEvents - the membership events to store\n * @returns when all members have been stored\n */\n public setOutOfBandMembers = this.degradable(\n (roomId: string, membershipEvents: IStateEventWithRoomId[]): Promise<void> => {\n super.setOutOfBandMembers(roomId, membershipEvents);\n return this.backend.setOutOfBandMembers(roomId, membershipEvents);\n },\n \"setOutOfBandMembers\",\n );\n\n public clearOutOfBandMembers = this.degradable((roomId: string) => {\n super.clearOutOfBandMembers(roomId);\n return this.backend.clearOutOfBandMembers(roomId);\n }, \"clearOutOfBandMembers\");\n\n public getClientOptions = this.degradable((): Promise<IStoredClientOpts | undefined> => {\n return this.backend.getClientOptions();\n }, \"getClientOptions\");\n\n public storeClientOptions = this.degradable((options: IStoredClientOpts): Promise<void> => {\n super.storeClientOptions(options);\n return this.backend.storeClientOptions(options);\n }, \"storeClientOptions\");\n\n /**\n * All member functions of `IndexedDBStore` that access the backend use this wrapper to\n * watch for failures after initial store startup, including `QuotaExceededError` as\n * free disk space changes, etc.\n *\n * When IndexedDB fails via any of these paths, we degrade this back to a `MemoryStore`\n * in place so that the current operation and all future ones are in-memory only.\n *\n * @param func - The degradable work to do.\n * @param fallback - The method name for fallback.\n * @returns A wrapped member function.\n */\n private degradable<A extends Array<any>, F extends keyof MemoryStore | null, R = void>(\n func: DegradableFn<A, R>,\n fallback: F,\n ): DegradableFn<A, F extends string ? R : void> {\n const fallbackFn = fallback ? (super[fallback] as (...args: A) => Promise<R>) : null;\n\n return (async (...args) => {\n try {\n return await func.call(this, ...args);\n } catch (e) {\n logger.error(\"IndexedDBStore failure, degrading to MemoryStore\", e);\n this.emitter.emit(\"degraded\", e as Error);\n try {\n // We try to delete IndexedDB after degrading since this store is only a\n // cache (the app will still function correctly without the data).\n // It's possible that deleting repair IndexedDB for the next app load,\n // potentially by making a little more space available.\n logger.log(\"IndexedDBStore trying to delete degraded data\");\n await this.backend.clearDatabase();\n logger.log(\"IndexedDBStore delete after degrading succeeded\");\n } catch (e) {\n logger.warn(\"IndexedDBStore delete after degrading failed\", e);\n }\n // Degrade the store from being an instance of `IndexedDBStore` to instead be\n // an instance of `MemoryStore` so that future API calls use the memory path\n // directly and skip IndexedDB entirely. This should be safe as\n // `IndexedDBStore` already extends from `MemoryStore`, so we are making the\n // store become its parent type in a way. The mutator methods of\n // `IndexedDBStore` also maintain the state that `MemoryStore` uses (many are\n // not overridden at all).\n if (fallbackFn) {\n return fallbackFn.call(this, ...args);\n }\n }\n }) as DegradableFn<A, F extends string ? R : void>;\n }\n\n // XXX: ideally these would be stored in indexeddb as part of the room but,\n // we don't store rooms as such and instead accumulate entire sync responses atm.\n public async getPendingEvents(roomId: string): Promise<Partial<IEvent>[]> {\n if (!this.localStorage) return super.getPendingEvents(roomId);\n\n const serialized = this.localStorage.getItem(pendingEventsKey(roomId));\n if (serialized) {\n try {\n return JSON.parse(serialized);\n } catch (e) {\n logger.error(\"Could not parse persisted pending events\", e);\n }\n }\n return [];\n }\n\n public async setPendingEvents(roomId: string, events: Partial<IEvent>[]): Promise<void> {\n if (!this.localStorage) return super.setPendingEvents(roomId, events);\n\n if (events.length > 0) {\n this.localStorage.setItem(pendingEventsKey(roomId), JSON.stringify(events));\n } else {\n this.localStorage.removeItem(pendingEventsKey(roomId));\n }\n }\n\n public saveToDeviceBatches(batches: ToDeviceBatchWithTxnId[]): Promise<void> {\n return this.backend.saveToDeviceBatches(batches);\n }\n\n public getOldestToDeviceBatch(): Promise<IndexedToDeviceBatch | null> {\n return this.backend.getOldestToDeviceBatch();\n }\n\n public removeToDeviceBatch(id: number): Promise<void> {\n return this.backend.removeToDeviceBatch(id);\n }\n\n public async getUserProfile(userId: string): Promise<SyncUserProfile | undefined> {\n return this.backend.getUserProfile(userId);\n }\n\n public async storeUserProfiles(userProfiles: Map<string, SyncUserProfile>): Promise<void> {\n return this.backend.storeUserProfiles(userProfiles);\n }\n\n public async removeUserProfiles(userIds: string[]): Promise<void> {\n return this.backend.removeUserProfiles(userIds);\n }\n}\n\n/**\n * @param roomId - ID of the current room\n * @returns Storage key to retrieve pending events\n */\nfunction pendingEventsKey(roomId: string): string {\n return `mx_pending_events_${roomId}`;\n}\n\ntype DegradableFn<A extends Array<any>, T> = (...args: A) => Promise<T>;\n"],"mappings":"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","ignoreList":[]}
|
package/lib/store/memory.d.ts
CHANGED
|
@@ -3,7 +3,7 @@
|
|
|
3
3
|
*/
|
|
4
4
|
import { type EventType } from "../@types/event.ts";
|
|
5
5
|
import { type Room } from "../models/room.ts";
|
|
6
|
-
import { type User } from "../models/user.ts";
|
|
6
|
+
import { type SyncUserProfile, type User } from "../models/user.ts";
|
|
7
7
|
import { type IEvent, type MatrixEvent } from "../models/event.ts";
|
|
8
8
|
import { type Filter } from "../filter.ts";
|
|
9
9
|
import { type ISavedSync, type IStore, type UserCreator } from "./index.ts";
|
|
@@ -29,6 +29,7 @@ export declare class MemoryStore implements IStore {
|
|
|
29
29
|
private pendingToDeviceBatches;
|
|
30
30
|
private nextToDeviceBatchId;
|
|
31
31
|
protected createUser?: UserCreator;
|
|
32
|
+
readonly userProfiles: Map<string, SyncUserProfile>;
|
|
32
33
|
/**
|
|
33
34
|
* Construct a new in-memory data store for the Matrix Client.
|
|
34
35
|
* @param opts - Config options
|
|
@@ -204,6 +205,9 @@ export declare class MemoryStore implements IStore {
|
|
|
204
205
|
saveToDeviceBatches(batches: ToDeviceBatchWithTxnId[]): Promise<void>;
|
|
205
206
|
getOldestToDeviceBatch(): Promise<IndexedToDeviceBatch | null>;
|
|
206
207
|
removeToDeviceBatch(id: number): Promise<void>;
|
|
208
|
+
getUserProfile(userId: string): Promise<SyncUserProfile | undefined>;
|
|
209
|
+
storeUserProfiles(userProfiles: Map<string, SyncUserProfile>): Promise<void>;
|
|
210
|
+
removeUserProfiles(userIds: string[]): Promise<void>;
|
|
207
211
|
destroy(): Promise<void>;
|
|
208
212
|
}
|
|
209
213
|
//# sourceMappingURL=memory.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"memory.d.ts","sourceRoot":"","sources":["../../src/store/memory.ts"],"names":[],"mappings":"AAgBA;;GAEG;AAEH,OAAO,EAAE,KAAK,SAAS,EAAE,MAAM,oBAAoB,CAAC;AACpD,OAAO,EAAE,KAAK,IAAI,EAAE,MAAM,mBAAmB,CAAC;AAC9C,OAAO,EAAE,KAAK,IAAI,EAAE,MAAM,mBAAmB,CAAC;
|
|
1
|
+
{"version":3,"file":"memory.d.ts","sourceRoot":"","sources":["../../src/store/memory.ts"],"names":[],"mappings":"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"}
|
package/lib/store/memory.js
CHANGED
|
@@ -55,6 +55,7 @@ export class MemoryStore {
|
|
|
55
55
|
_defineProperty(this, "pendingToDeviceBatches", []);
|
|
56
56
|
_defineProperty(this, "nextToDeviceBatchId", 0);
|
|
57
57
|
_defineProperty(this, "createUser", void 0);
|
|
58
|
+
_defineProperty(this, "userProfiles", new Map());
|
|
58
59
|
/**
|
|
59
60
|
* Called when a room member in a room being tracked by this store has been
|
|
60
61
|
* updated.
|
|
@@ -425,6 +426,24 @@ export class MemoryStore {
|
|
|
425
426
|
this.pendingToDeviceBatches = this.pendingToDeviceBatches.filter(batch => batch.id !== id);
|
|
426
427
|
return Promise.resolve();
|
|
427
428
|
}
|
|
429
|
+
getUserProfile(userId) {
|
|
430
|
+
var _this4 = this;
|
|
431
|
+
return _asyncToGenerator(function* () {
|
|
432
|
+
return _this4.userProfiles.get(userId);
|
|
433
|
+
})();
|
|
434
|
+
}
|
|
435
|
+
storeUserProfiles(userProfiles) {
|
|
436
|
+
var _this5 = this;
|
|
437
|
+
return _asyncToGenerator(function* () {
|
|
438
|
+
userProfiles.forEach((profile, userId) => _this5.userProfiles.set(userId, profile));
|
|
439
|
+
})();
|
|
440
|
+
}
|
|
441
|
+
removeUserProfiles(userIds) {
|
|
442
|
+
var _this6 = this;
|
|
443
|
+
return _asyncToGenerator(function* () {
|
|
444
|
+
userIds.forEach(userId => _this6.userProfiles.delete(userId));
|
|
445
|
+
})();
|
|
446
|
+
}
|
|
428
447
|
destroy() {
|
|
429
448
|
return _asyncToGenerator(function* () {})();
|
|
430
449
|
} // Nothing to do
|
package/lib/store/memory.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"memory.js","names":["RoomStateEvent","MapWithDefault","KnownMembership","isValidFilterId","filterId","isValidStr","MemoryStore","constructor","opts","arguments","length","undefined","_defineProperty","Map","event","state","member","_this$createUser","membership","Invite","user","users","userId","createUser","call","name","setDisplayName","events","setRawDisplayName","getDirectionalContent","displayname","getContent","avatar_url","setAvatarUrl","localStorage","getSyncToken","syncToken","isNewlyCreated","Promise","resolve","setSyncToken","token","storeRoom","room","rooms","roomId","currentState","on","Members","onRoomMember","getMembers","forEach","m","setUserCreator","creator","getRoom","getRooms","Object","values","removeRoom","removeListener","getRoomSummaries","map","summary","storeUser","getUser","getUsers","scrollback","limit","storeEvents","toStart","storeFilter","filter","filters","getOrCreate","set","getFilter","_this$filters$get","get","getFilterIdByName","filterName","key","value","getItem","_unused","setFilterIdByName","setItem","removeItem","_unused2","storeAccountDataEvents","isDeleted","keys","accountData","delete","getType","getAccountData","eventType","setSyncData","syncData","wantsSave","save","force","startup","getSavedSync","getSavedSyncToken","deleteAllData","getOutOfBandMembers","oobMembers","setOutOfBandMembers","membershipEvents","clearOutOfBandMembers","getClientOptions","clientOptions","storeClientOptions","options","assign","getPendingEvents","_this","_asyncToGenerator","_this$pendingEvents$r","pendingEvents","setPendingEvents","_this2","saveToDeviceBatches","batches","batch","pendingToDeviceBatches","push","id","nextToDeviceBatchId","txnId","getOldestToDeviceBatch","_this3","removeToDeviceBatch","destroy"],"sources":["../../src/store/memory.ts"],"sourcesContent":["/*\nCopyright 2015 - 2021 The Matrix.org Foundation C.I.C.\n\nLicensed under the Apache License, Version 2.0 (the \"License\");\nyou may not use this file except in compliance with the License.\nYou may obtain a copy of the License at\n\n http://www.apache.org/licenses/LICENSE-2.0\n\nUnless required by applicable law or agreed to in writing, software\ndistributed under the License is distributed on an \"AS IS\" BASIS,\nWITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\nSee the License for the specific language governing permissions and\nlimitations under the License.\n*/\n\n/**\n * This is an internal module. See {@link MemoryStore} for the public class.\n */\n\nimport { type EventType } from \"../@types/event.ts\";\nimport { type Room } from \"../models/room.ts\";\nimport { type User } from \"../models/user.ts\";\nimport { type IEvent, type MatrixEvent } from \"../models/event.ts\";\nimport { type RoomState, RoomStateEvent } from \"../models/room-state.ts\";\nimport { type RoomMember } from \"../models/room-member.ts\";\nimport { type Filter } from \"../filter.ts\";\nimport { type ISavedSync, type IStore, type UserCreator } from \"./index.ts\";\nimport { type RoomSummary } from \"../models/room-summary.ts\";\nimport { type ISyncResponse } from \"../sync-accumulator.ts\";\nimport { type IStateEventWithRoomId } from \"../@types/search.ts\";\nimport { type IndexedToDeviceBatch, type ToDeviceBatchWithTxnId } from \"../models/ToDeviceMessage.ts\";\nimport { type IStoredClientOpts } from \"../client.ts\";\nimport { MapWithDefault } from \"../utils.ts\";\nimport { KnownMembership } from \"../@types/membership.ts\";\n\nfunction isValidFilterId(filterId?: string | number | null): boolean {\n const isValidStr =\n typeof filterId === \"string\" &&\n !!filterId &&\n filterId !== \"undefined\" && // exclude these as we've serialized undefined in localStorage before\n filterId !== \"null\";\n\n return isValidStr || typeof filterId === \"number\";\n}\n\nexport interface IOpts {\n /** The local storage instance to persist some forms of data such as tokens. Rooms will NOT be stored. */\n localStorage?: Storage;\n}\n\nexport class MemoryStore implements IStore {\n private rooms: Record<string, Room> = {}; // roomId: Room\n private users: Record<string, User> = {}; // userId: User\n private syncToken: string | null = null;\n // userId: {\n // filterId: Filter\n // }\n private filters: MapWithDefault<string, Map<string, Filter>> = new MapWithDefault(() => new Map());\n public accountData: Map<string, MatrixEvent> = new Map(); // type: content\n protected readonly localStorage?: Storage;\n private oobMembers: Map<string, IStateEventWithRoomId[]> = new Map(); // roomId: [member events]\n private pendingEvents: { [roomId: string]: Partial<IEvent>[] } = {};\n private clientOptions?: IStoredClientOpts;\n private pendingToDeviceBatches: IndexedToDeviceBatch[] = [];\n private nextToDeviceBatchId = 0;\n protected createUser?: UserCreator;\n\n /**\n * Construct a new in-memory data store for the Matrix Client.\n * @param opts - Config options\n */\n public constructor(opts: IOpts = {}) {\n this.localStorage = opts.localStorage;\n }\n\n /**\n * Retrieve the token to stream from.\n * @returns The token or null.\n */\n public getSyncToken(): string | null {\n return this.syncToken;\n }\n\n /** @returns whether or not the database was newly created in this session. */\n public isNewlyCreated(): Promise<boolean> {\n return Promise.resolve(true);\n }\n\n /**\n * Set the token to stream from.\n * @param token - The token to stream from.\n */\n public setSyncToken(token: string): void {\n this.syncToken = token;\n }\n\n /**\n * Store the given room.\n * @param room - The room to be stored. All properties must be stored.\n */\n public storeRoom(room: Room): void {\n this.rooms[room.roomId] = room;\n // add listeners for room member changes so we can keep the room member\n // map up-to-date.\n room.currentState.on(RoomStateEvent.Members, this.onRoomMember);\n // add existing members\n room.currentState.getMembers().forEach((m) => {\n this.onRoomMember(null, room.currentState, m);\n });\n }\n\n public setUserCreator(creator: UserCreator): void {\n this.createUser = creator;\n }\n\n /**\n * Called when a room member in a room being tracked by this store has been\n * updated.\n */\n private onRoomMember = (event: MatrixEvent | null, state: RoomState, member: RoomMember): void => {\n if (member.membership === KnownMembership.Invite) {\n // We do NOT add invited members because people love to typo user IDs\n // which would then show up in these lists (!)\n return;\n }\n\n const user = this.users[member.userId] || this.createUser?.(member.userId);\n if (member.name) {\n user.setDisplayName(member.name);\n if (member.events.member) {\n user.setRawDisplayName(member.events.member.getDirectionalContent().displayname);\n }\n }\n if (member.events.member && member.events.member.getContent().avatar_url) {\n user.setAvatarUrl(member.events.member.getContent().avatar_url);\n }\n this.users[user.userId] = user;\n };\n\n /**\n * Retrieve a room by its' room ID.\n * @param roomId - The room ID.\n * @returns The room or null.\n */\n public getRoom(roomId: string): Room | null {\n return this.rooms[roomId] || null;\n }\n\n /**\n * Retrieve all known rooms.\n * @returns A list of rooms, which may be empty.\n */\n public getRooms(): Room[] {\n return Object.values(this.rooms);\n }\n\n /**\n * Permanently delete a room.\n */\n public removeRoom(roomId: string): void {\n if (this.rooms[roomId]) {\n this.rooms[roomId].currentState.removeListener(RoomStateEvent.Members, this.onRoomMember);\n }\n delete this.rooms[roomId];\n }\n\n /**\n * Retrieve a summary of all the rooms.\n * @returns A summary of each room.\n */\n public getRoomSummaries(): RoomSummary[] {\n return Object.values(this.rooms).map(function (room) {\n return room.summary!;\n });\n }\n\n /**\n * Store a User.\n * @param user - The user to store.\n */\n public storeUser(user: User): void {\n this.users[user.userId] = user;\n }\n\n /**\n * Retrieve a User by its' user ID.\n * @param userId - The user ID.\n * @returns The user or null.\n */\n public getUser(userId: string): User | null {\n return this.users[userId] || null;\n }\n\n /**\n * Retrieve all known users.\n * @returns A list of users, which may be empty.\n */\n public getUsers(): User[] {\n return Object.values(this.users);\n }\n\n /**\n * Retrieve scrollback for this room.\n * @param room - The matrix room\n * @param limit - The max number of old events to retrieve.\n * @returns An array of objects which will be at most 'limit'\n * length and at least 0. The objects are the raw event JSON.\n */\n public scrollback(room: Room, limit: number): MatrixEvent[] {\n return [];\n }\n\n /**\n * Store events for a room. The events have already been added to the timeline\n * @param room - The room to store events for.\n * @param events - The events to store.\n * @param token - The token associated with these events.\n * @param toStart - True if these are paginated results.\n */\n public storeEvents(room: Room, events: MatrixEvent[], token: string | null, toStart: boolean): void {\n // no-op because they've already been added to the room instance.\n }\n\n /**\n * Store a filter.\n */\n public storeFilter(filter: Filter): void {\n if (!filter?.userId || !filter?.filterId) return;\n this.filters.getOrCreate(filter.userId).set(filter.filterId, filter);\n }\n\n /**\n * Retrieve a filter.\n * @returns A filter or null.\n */\n public getFilter(userId: string, filterId: string): Filter | null {\n return this.filters.get(userId)?.get(filterId) || null;\n }\n\n /**\n * Retrieve a filter ID with the given name.\n * @param filterName - The filter name.\n * @returns The filter ID or null.\n */\n public getFilterIdByName(filterName: string): string | null {\n if (!this.localStorage) {\n return null;\n }\n const key = \"mxjssdk_memory_filter_\" + filterName;\n // XXX Storage.getItem doesn't throw ...\n // or are we using something different\n // than window.localStorage in some cases\n // that does throw?\n // that would be very naughty\n try {\n const value = this.localStorage.getItem(key);\n if (isValidFilterId(value)) {\n return value;\n }\n } catch {}\n return null;\n }\n\n /**\n * Set a filter name to ID mapping.\n */\n public setFilterIdByName(filterName: string, filterId?: string): void {\n if (!this.localStorage) {\n return;\n }\n const key = \"mxjssdk_memory_filter_\" + filterName;\n try {\n if (isValidFilterId(filterId)) {\n this.localStorage.setItem(key, filterId!);\n } else {\n this.localStorage.removeItem(key);\n }\n } catch {}\n }\n\n /**\n * Store user-scoped account data events.\n * N.B. that account data only allows a single event per type, so multiple\n * events with the same type will replace each other.\n * @param events - The events to store.\n */\n public storeAccountDataEvents(events: MatrixEvent[]): void {\n events.forEach((event) => {\n // MSC3391: an event with content of {} should be interpreted as deleted\n const isDeleted = !Object.keys(event.getContent()).length;\n if (isDeleted) {\n this.accountData.delete(event.getType());\n } else {\n this.accountData.set(event.getType(), event);\n }\n });\n }\n\n /**\n * Get account data event by event type\n * @param eventType - The event type being queried\n * @returns the user account_data event of given type, if any\n */\n public getAccountData(eventType: EventType | string): MatrixEvent | undefined {\n return this.accountData.get(eventType);\n }\n\n /**\n * setSyncData does nothing as there is no backing data store.\n *\n * @param syncData - The sync data\n * @returns An immediately resolved promise.\n */\n public setSyncData(syncData: ISyncResponse): Promise<void> {\n return Promise.resolve();\n }\n\n /**\n * We never want to save becase we have nothing to save to.\n *\n * @returns If the store wants to save\n */\n public wantsSave(): boolean {\n return false;\n }\n\n /**\n * Save does nothing as there is no backing data store.\n * @param force - True to force a save (but the memory\n * store still can't save anything)\n */\n public save(force: boolean): Promise<void> {\n return Promise.resolve();\n }\n\n /**\n * Startup does nothing as this store doesn't require starting up.\n * @returns An immediately resolved promise.\n */\n public startup(): Promise<void> {\n return Promise.resolve();\n }\n\n /**\n * @returns Promise which resolves with a sync response to restore the\n * client state to where it was at the last save, or null if there\n * is no saved sync data.\n */\n public getSavedSync(): Promise<ISavedSync | null> {\n return Promise.resolve(null);\n }\n\n /**\n * @returns If there is a saved sync, the nextBatch token\n * for this sync, otherwise null.\n */\n public getSavedSyncToken(): Promise<string | null> {\n return Promise.resolve(null);\n }\n\n /**\n * Delete all data from this store.\n * @returns An immediately resolved promise.\n */\n public deleteAllData(): Promise<void> {\n this.rooms = {\n // roomId: Room\n };\n this.users = {\n // userId: User\n };\n this.syncToken = null;\n this.filters = new MapWithDefault(() => new Map());\n this.accountData = new Map(); // type : content\n return Promise.resolve();\n }\n\n /**\n * Returns the out-of-band membership events for this room that\n * were previously loaded.\n * @returns the events, potentially an empty array if OOB loading didn't yield any new members\n * @returns in case the members for this room haven't been stored yet\n */\n public getOutOfBandMembers(roomId: string): Promise<IStateEventWithRoomId[] | null> {\n return Promise.resolve(this.oobMembers.get(roomId) || null);\n }\n\n /**\n * Stores the out-of-band membership events for this room. Note that\n * it still makes sense to store an empty array as the OOB status for the room is\n * marked as fetched, and getOutOfBandMembers will return an empty array instead of null\n * @param membershipEvents - the membership events to store\n * @returns when all members have been stored\n */\n public setOutOfBandMembers(roomId: string, membershipEvents: IStateEventWithRoomId[]): Promise<void> {\n this.oobMembers.set(roomId, membershipEvents);\n return Promise.resolve();\n }\n\n public clearOutOfBandMembers(roomId: string): Promise<void> {\n this.oobMembers.delete(roomId);\n return Promise.resolve();\n }\n\n public getClientOptions(): Promise<IStoredClientOpts | undefined> {\n return Promise.resolve(this.clientOptions);\n }\n\n public storeClientOptions(options: IStoredClientOpts): Promise<void> {\n this.clientOptions = Object.assign({}, options);\n return Promise.resolve();\n }\n\n public async getPendingEvents(roomId: string): Promise<Partial<IEvent>[]> {\n return this.pendingEvents[roomId] ?? [];\n }\n\n public async setPendingEvents(roomId: string, events: Partial<IEvent>[]): Promise<void> {\n this.pendingEvents[roomId] = events;\n }\n\n public saveToDeviceBatches(batches: ToDeviceBatchWithTxnId[]): Promise<void> {\n for (const batch of batches) {\n this.pendingToDeviceBatches.push({\n id: this.nextToDeviceBatchId++,\n eventType: batch.eventType,\n txnId: batch.txnId,\n batch: batch.batch,\n });\n }\n return Promise.resolve();\n }\n\n public async getOldestToDeviceBatch(): Promise<IndexedToDeviceBatch | null> {\n if (this.pendingToDeviceBatches.length === 0) return null;\n return this.pendingToDeviceBatches[0];\n }\n\n public removeToDeviceBatch(id: number): Promise<void> {\n this.pendingToDeviceBatches = this.pendingToDeviceBatches.filter((batch) => batch.id !== id);\n return Promise.resolve();\n }\n\n public async destroy(): Promise<void> {\n // Nothing to do\n }\n}\n"],"mappings":"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","ignoreList":[]}
|
|
1
|
+
{"version":3,"file":"memory.js","names":["RoomStateEvent","MapWithDefault","KnownMembership","isValidFilterId","filterId","isValidStr","MemoryStore","constructor","opts","arguments","length","undefined","_defineProperty","Map","event","state","member","_this$createUser","membership","Invite","user","users","userId","createUser","call","name","setDisplayName","events","setRawDisplayName","getDirectionalContent","displayname","getContent","avatar_url","setAvatarUrl","localStorage","getSyncToken","syncToken","isNewlyCreated","Promise","resolve","setSyncToken","token","storeRoom","room","rooms","roomId","currentState","on","Members","onRoomMember","getMembers","forEach","m","setUserCreator","creator","getRoom","getRooms","Object","values","removeRoom","removeListener","getRoomSummaries","map","summary","storeUser","getUser","getUsers","scrollback","limit","storeEvents","toStart","storeFilter","filter","filters","getOrCreate","set","getFilter","_this$filters$get","get","getFilterIdByName","filterName","key","value","getItem","_unused","setFilterIdByName","setItem","removeItem","_unused2","storeAccountDataEvents","isDeleted","keys","accountData","delete","getType","getAccountData","eventType","setSyncData","syncData","wantsSave","save","force","startup","getSavedSync","getSavedSyncToken","deleteAllData","getOutOfBandMembers","oobMembers","setOutOfBandMembers","membershipEvents","clearOutOfBandMembers","getClientOptions","clientOptions","storeClientOptions","options","assign","getPendingEvents","_this","_asyncToGenerator","_this$pendingEvents$r","pendingEvents","setPendingEvents","_this2","saveToDeviceBatches","batches","batch","pendingToDeviceBatches","push","id","nextToDeviceBatchId","txnId","getOldestToDeviceBatch","_this3","removeToDeviceBatch","getUserProfile","_this4","userProfiles","storeUserProfiles","_this5","profile","removeUserProfiles","userIds","_this6","destroy"],"sources":["../../src/store/memory.ts"],"sourcesContent":["/*\nCopyright 2015 - 2021 The Matrix.org Foundation C.I.C.\n\nLicensed under the Apache License, Version 2.0 (the \"License\");\nyou may not use this file except in compliance with the License.\nYou may obtain a copy of the License at\n\n http://www.apache.org/licenses/LICENSE-2.0\n\nUnless required by applicable law or agreed to in writing, software\ndistributed under the License is distributed on an \"AS IS\" BASIS,\nWITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\nSee the License for the specific language governing permissions and\nlimitations under the License.\n*/\n\n/**\n * This is an internal module. See {@link MemoryStore} for the public class.\n */\n\nimport { type EventType } from \"../@types/event.ts\";\nimport { type Room } from \"../models/room.ts\";\nimport { type SyncUserProfile, type User } from \"../models/user.ts\";\nimport { type IEvent, type MatrixEvent } from \"../models/event.ts\";\nimport { type RoomState, RoomStateEvent } from \"../models/room-state.ts\";\nimport { type RoomMember } from \"../models/room-member.ts\";\nimport { type Filter } from \"../filter.ts\";\nimport { type ISavedSync, type IStore, type UserCreator } from \"./index.ts\";\nimport { type RoomSummary } from \"../models/room-summary.ts\";\nimport { type ISyncResponse } from \"../sync-accumulator.ts\";\nimport { type IStateEventWithRoomId } from \"../@types/search.ts\";\nimport { type IndexedToDeviceBatch, type ToDeviceBatchWithTxnId } from \"../models/ToDeviceMessage.ts\";\nimport { type IStoredClientOpts } from \"../client.ts\";\nimport { MapWithDefault } from \"../utils.ts\";\nimport { KnownMembership } from \"../@types/membership.ts\";\n\nfunction isValidFilterId(filterId?: string | number | null): boolean {\n const isValidStr =\n typeof filterId === \"string\" &&\n !!filterId &&\n filterId !== \"undefined\" && // exclude these as we've serialized undefined in localStorage before\n filterId !== \"null\";\n\n return isValidStr || typeof filterId === \"number\";\n}\n\nexport interface IOpts {\n /** The local storage instance to persist some forms of data such as tokens. Rooms will NOT be stored. */\n localStorage?: Storage;\n}\n\nexport class MemoryStore implements IStore {\n private rooms: Record<string, Room> = {}; // roomId: Room\n private users: Record<string, User> = {}; // userId: User\n private syncToken: string | null = null;\n // userId: {\n // filterId: Filter\n // }\n private filters: MapWithDefault<string, Map<string, Filter>> = new MapWithDefault(() => new Map());\n public accountData: Map<string, MatrixEvent> = new Map(); // type: content\n protected readonly localStorage?: Storage;\n private oobMembers: Map<string, IStateEventWithRoomId[]> = new Map(); // roomId: [member events]\n private pendingEvents: { [roomId: string]: Partial<IEvent>[] } = {};\n private clientOptions?: IStoredClientOpts;\n private pendingToDeviceBatches: IndexedToDeviceBatch[] = [];\n private nextToDeviceBatchId = 0;\n protected createUser?: UserCreator;\n public readonly userProfiles = new Map<string, SyncUserProfile>();\n\n /**\n * Construct a new in-memory data store for the Matrix Client.\n * @param opts - Config options\n */\n public constructor(opts: IOpts = {}) {\n this.localStorage = opts.localStorage;\n }\n\n /**\n * Retrieve the token to stream from.\n * @returns The token or null.\n */\n public getSyncToken(): string | null {\n return this.syncToken;\n }\n\n /** @returns whether or not the database was newly created in this session. */\n public isNewlyCreated(): Promise<boolean> {\n return Promise.resolve(true);\n }\n\n /**\n * Set the token to stream from.\n * @param token - The token to stream from.\n */\n public setSyncToken(token: string): void {\n this.syncToken = token;\n }\n\n /**\n * Store the given room.\n * @param room - The room to be stored. All properties must be stored.\n */\n public storeRoom(room: Room): void {\n this.rooms[room.roomId] = room;\n // add listeners for room member changes so we can keep the room member\n // map up-to-date.\n room.currentState.on(RoomStateEvent.Members, this.onRoomMember);\n // add existing members\n room.currentState.getMembers().forEach((m) => {\n this.onRoomMember(null, room.currentState, m);\n });\n }\n\n public setUserCreator(creator: UserCreator): void {\n this.createUser = creator;\n }\n\n /**\n * Called when a room member in a room being tracked by this store has been\n * updated.\n */\n private onRoomMember = (event: MatrixEvent | null, state: RoomState, member: RoomMember): void => {\n if (member.membership === KnownMembership.Invite) {\n // We do NOT add invited members because people love to typo user IDs\n // which would then show up in these lists (!)\n return;\n }\n\n const user = this.users[member.userId] || this.createUser?.(member.userId);\n if (member.name) {\n user.setDisplayName(member.name);\n if (member.events.member) {\n user.setRawDisplayName(member.events.member.getDirectionalContent().displayname);\n }\n }\n if (member.events.member && member.events.member.getContent().avatar_url) {\n user.setAvatarUrl(member.events.member.getContent().avatar_url);\n }\n this.users[user.userId] = user;\n };\n\n /**\n * Retrieve a room by its' room ID.\n * @param roomId - The room ID.\n * @returns The room or null.\n */\n public getRoom(roomId: string): Room | null {\n return this.rooms[roomId] || null;\n }\n\n /**\n * Retrieve all known rooms.\n * @returns A list of rooms, which may be empty.\n */\n public getRooms(): Room[] {\n return Object.values(this.rooms);\n }\n\n /**\n * Permanently delete a room.\n */\n public removeRoom(roomId: string): void {\n if (this.rooms[roomId]) {\n this.rooms[roomId].currentState.removeListener(RoomStateEvent.Members, this.onRoomMember);\n }\n delete this.rooms[roomId];\n }\n\n /**\n * Retrieve a summary of all the rooms.\n * @returns A summary of each room.\n */\n public getRoomSummaries(): RoomSummary[] {\n return Object.values(this.rooms).map(function (room) {\n return room.summary!;\n });\n }\n\n /**\n * Store a User.\n * @param user - The user to store.\n */\n public storeUser(user: User): void {\n this.users[user.userId] = user;\n }\n\n /**\n * Retrieve a User by its' user ID.\n * @param userId - The user ID.\n * @returns The user or null.\n */\n public getUser(userId: string): User | null {\n return this.users[userId] || null;\n }\n\n /**\n * Retrieve all known users.\n * @returns A list of users, which may be empty.\n */\n public getUsers(): User[] {\n return Object.values(this.users);\n }\n\n /**\n * Retrieve scrollback for this room.\n * @param room - The matrix room\n * @param limit - The max number of old events to retrieve.\n * @returns An array of objects which will be at most 'limit'\n * length and at least 0. The objects are the raw event JSON.\n */\n public scrollback(room: Room, limit: number): MatrixEvent[] {\n return [];\n }\n\n /**\n * Store events for a room. The events have already been added to the timeline\n * @param room - The room to store events for.\n * @param events - The events to store.\n * @param token - The token associated with these events.\n * @param toStart - True if these are paginated results.\n */\n public storeEvents(room: Room, events: MatrixEvent[], token: string | null, toStart: boolean): void {\n // no-op because they've already been added to the room instance.\n }\n\n /**\n * Store a filter.\n */\n public storeFilter(filter: Filter): void {\n if (!filter?.userId || !filter?.filterId) return;\n this.filters.getOrCreate(filter.userId).set(filter.filterId, filter);\n }\n\n /**\n * Retrieve a filter.\n * @returns A filter or null.\n */\n public getFilter(userId: string, filterId: string): Filter | null {\n return this.filters.get(userId)?.get(filterId) || null;\n }\n\n /**\n * Retrieve a filter ID with the given name.\n * @param filterName - The filter name.\n * @returns The filter ID or null.\n */\n public getFilterIdByName(filterName: string): string | null {\n if (!this.localStorage) {\n return null;\n }\n const key = \"mxjssdk_memory_filter_\" + filterName;\n // XXX Storage.getItem doesn't throw ...\n // or are we using something different\n // than window.localStorage in some cases\n // that does throw?\n // that would be very naughty\n try {\n const value = this.localStorage.getItem(key);\n if (isValidFilterId(value)) {\n return value;\n }\n } catch {}\n return null;\n }\n\n /**\n * Set a filter name to ID mapping.\n */\n public setFilterIdByName(filterName: string, filterId?: string): void {\n if (!this.localStorage) {\n return;\n }\n const key = \"mxjssdk_memory_filter_\" + filterName;\n try {\n if (isValidFilterId(filterId)) {\n this.localStorage.setItem(key, filterId!);\n } else {\n this.localStorage.removeItem(key);\n }\n } catch {}\n }\n\n /**\n * Store user-scoped account data events.\n * N.B. that account data only allows a single event per type, so multiple\n * events with the same type will replace each other.\n * @param events - The events to store.\n */\n public storeAccountDataEvents(events: MatrixEvent[]): void {\n events.forEach((event) => {\n // MSC3391: an event with content of {} should be interpreted as deleted\n const isDeleted = !Object.keys(event.getContent()).length;\n if (isDeleted) {\n this.accountData.delete(event.getType());\n } else {\n this.accountData.set(event.getType(), event);\n }\n });\n }\n\n /**\n * Get account data event by event type\n * @param eventType - The event type being queried\n * @returns the user account_data event of given type, if any\n */\n public getAccountData(eventType: EventType | string): MatrixEvent | undefined {\n return this.accountData.get(eventType);\n }\n\n /**\n * setSyncData does nothing as there is no backing data store.\n *\n * @param syncData - The sync data\n * @returns An immediately resolved promise.\n */\n public setSyncData(syncData: ISyncResponse): Promise<void> {\n return Promise.resolve();\n }\n\n /**\n * We never want to save becase we have nothing to save to.\n *\n * @returns If the store wants to save\n */\n public wantsSave(): boolean {\n return false;\n }\n\n /**\n * Save does nothing as there is no backing data store.\n * @param force - True to force a save (but the memory\n * store still can't save anything)\n */\n public save(force: boolean): Promise<void> {\n return Promise.resolve();\n }\n\n /**\n * Startup does nothing as this store doesn't require starting up.\n * @returns An immediately resolved promise.\n */\n public startup(): Promise<void> {\n return Promise.resolve();\n }\n\n /**\n * @returns Promise which resolves with a sync response to restore the\n * client state to where it was at the last save, or null if there\n * is no saved sync data.\n */\n public getSavedSync(): Promise<ISavedSync | null> {\n return Promise.resolve(null);\n }\n\n /**\n * @returns If there is a saved sync, the nextBatch token\n * for this sync, otherwise null.\n */\n public getSavedSyncToken(): Promise<string | null> {\n return Promise.resolve(null);\n }\n\n /**\n * Delete all data from this store.\n * @returns An immediately resolved promise.\n */\n public deleteAllData(): Promise<void> {\n this.rooms = {\n // roomId: Room\n };\n this.users = {\n // userId: User\n };\n this.syncToken = null;\n this.filters = new MapWithDefault(() => new Map());\n this.accountData = new Map(); // type : content\n return Promise.resolve();\n }\n\n /**\n * Returns the out-of-band membership events for this room that\n * were previously loaded.\n * @returns the events, potentially an empty array if OOB loading didn't yield any new members\n * @returns in case the members for this room haven't been stored yet\n */\n public getOutOfBandMembers(roomId: string): Promise<IStateEventWithRoomId[] | null> {\n return Promise.resolve(this.oobMembers.get(roomId) || null);\n }\n\n /**\n * Stores the out-of-band membership events for this room. Note that\n * it still makes sense to store an empty array as the OOB status for the room is\n * marked as fetched, and getOutOfBandMembers will return an empty array instead of null\n * @param membershipEvents - the membership events to store\n * @returns when all members have been stored\n */\n public setOutOfBandMembers(roomId: string, membershipEvents: IStateEventWithRoomId[]): Promise<void> {\n this.oobMembers.set(roomId, membershipEvents);\n return Promise.resolve();\n }\n\n public clearOutOfBandMembers(roomId: string): Promise<void> {\n this.oobMembers.delete(roomId);\n return Promise.resolve();\n }\n\n public getClientOptions(): Promise<IStoredClientOpts | undefined> {\n return Promise.resolve(this.clientOptions);\n }\n\n public storeClientOptions(options: IStoredClientOpts): Promise<void> {\n this.clientOptions = Object.assign({}, options);\n return Promise.resolve();\n }\n\n public async getPendingEvents(roomId: string): Promise<Partial<IEvent>[]> {\n return this.pendingEvents[roomId] ?? [];\n }\n\n public async setPendingEvents(roomId: string, events: Partial<IEvent>[]): Promise<void> {\n this.pendingEvents[roomId] = events;\n }\n\n public saveToDeviceBatches(batches: ToDeviceBatchWithTxnId[]): Promise<void> {\n for (const batch of batches) {\n this.pendingToDeviceBatches.push({\n id: this.nextToDeviceBatchId++,\n eventType: batch.eventType,\n txnId: batch.txnId,\n batch: batch.batch,\n });\n }\n return Promise.resolve();\n }\n\n public async getOldestToDeviceBatch(): Promise<IndexedToDeviceBatch | null> {\n if (this.pendingToDeviceBatches.length === 0) return null;\n return this.pendingToDeviceBatches[0];\n }\n\n public removeToDeviceBatch(id: number): Promise<void> {\n this.pendingToDeviceBatches = this.pendingToDeviceBatches.filter((batch) => batch.id !== id);\n return Promise.resolve();\n }\n\n public async getUserProfile(userId: string): Promise<SyncUserProfile | undefined> {\n return this.userProfiles.get(userId);\n }\n\n public async storeUserProfiles(userProfiles: Map<string, SyncUserProfile>): Promise<void> {\n userProfiles.forEach((profile, userId) => this.userProfiles.set(userId, profile));\n }\n\n public async removeUserProfiles(userIds: string[]): Promise<void> {\n userIds.forEach((userId) => this.userProfiles.delete(userId));\n }\n\n public async destroy(): Promise<void> {\n // Nothing to do\n }\n}\n"],"mappings":"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","ignoreList":[]}
|
package/lib/store/stub.d.ts
CHANGED
|
@@ -156,6 +156,9 @@ export declare class StubStore implements IStore {
|
|
|
156
156
|
saveToDeviceBatches(batch: ToDeviceBatch[]): Promise<void>;
|
|
157
157
|
getOldestToDeviceBatch(): Promise<IndexedToDeviceBatch | null>;
|
|
158
158
|
removeToDeviceBatch(id: number): Promise<void>;
|
|
159
|
+
getUserProfile(): Promise<undefined>;
|
|
160
|
+
storeUserProfiles(): Promise<void>;
|
|
161
|
+
removeUserProfiles(): Promise<void>;
|
|
159
162
|
destroy(): Promise<void>;
|
|
160
163
|
}
|
|
161
164
|
//# sourceMappingURL=stub.d.ts.map
|