matrix-js-sdk 41.7.0 → 41.8.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.
Files changed (95) hide show
  1. package/CHANGELOG.md +12 -0
  2. package/lib/@types/event.d.ts +6 -1
  3. package/lib/@types/event.d.ts.map +1 -1
  4. package/lib/@types/event.js +3 -0
  5. package/lib/@types/event.js.map +1 -1
  6. package/lib/@types/retention.d.ts +15 -0
  7. package/lib/@types/retention.d.ts.map +1 -0
  8. package/lib/@types/retention.js +13 -0
  9. package/lib/@types/retention.js.map +1 -0
  10. package/lib/capabilityPoller.d.ts +38 -0
  11. package/lib/capabilityPoller.d.ts.map +1 -0
  12. package/lib/capabilityPoller.js +96 -0
  13. package/lib/capabilityPoller.js.map +1 -0
  14. package/lib/client.d.ts +7 -0
  15. package/lib/client.d.ts.map +1 -1
  16. package/lib/client.js +15 -5
  17. package/lib/client.js.map +1 -1
  18. package/lib/matrix.d.ts +1 -0
  19. package/lib/matrix.d.ts.map +1 -1
  20. package/lib/matrix.js +1 -0
  21. package/lib/matrix.js.map +1 -1
  22. package/lib/matrixrtc/MembershipManager.d.ts +2 -0
  23. package/lib/matrixrtc/MembershipManager.d.ts.map +1 -1
  24. package/lib/matrixrtc/MembershipManager.js +2 -0
  25. package/lib/matrixrtc/MembershipManager.js.map +1 -1
  26. package/lib/matrixrtc/MembershipManagerActionScheduler.d.ts.map +1 -1
  27. package/lib/matrixrtc/MembershipManagerActionScheduler.js +4 -1
  28. package/lib/matrixrtc/MembershipManagerActionScheduler.js.map +1 -1
  29. package/lib/models/room-retention.d.ts +28 -0
  30. package/lib/models/room-retention.d.ts.map +1 -0
  31. package/lib/models/room-retention.js +201 -0
  32. package/lib/models/room-retention.js.map +1 -0
  33. package/lib/models/room.d.ts +2 -1
  34. package/lib/models/room.d.ts.map +1 -1
  35. package/lib/models/room.js +29 -3
  36. package/lib/models/room.js.map +1 -1
  37. package/lib/retentionPolicy.d.ts +33 -0
  38. package/lib/retentionPolicy.d.ts.map +1 -0
  39. package/lib/retentionPolicy.js +42 -0
  40. package/lib/retentionPolicy.js.map +1 -0
  41. package/lib/rust-crypto/backup.d.ts +7 -2
  42. package/lib/rust-crypto/backup.d.ts.map +1 -1
  43. package/lib/rust-crypto/backup.js +13 -4
  44. package/lib/rust-crypto/backup.js.map +1 -1
  45. package/lib/serverCapabilities.d.ts +4 -23
  46. package/lib/serverCapabilities.d.ts.map +1 -1
  47. package/lib/serverCapabilities.js +8 -61
  48. package/lib/serverCapabilities.js.map +1 -1
  49. package/lib/store/index.d.ts +7 -0
  50. package/lib/store/index.d.ts.map +1 -1
  51. package/lib/store/index.js.map +1 -1
  52. package/lib/store/indexeddb-local-backend.d.ts +1 -0
  53. package/lib/store/indexeddb-local-backend.d.ts.map +1 -1
  54. package/lib/store/indexeddb-local-backend.js +15 -3
  55. package/lib/store/indexeddb-local-backend.js.map +1 -1
  56. package/lib/store/indexeddb-remote-backend.d.ts +3 -1
  57. package/lib/store/indexeddb-remote-backend.d.ts.map +1 -1
  58. package/lib/store/indexeddb-remote-backend.js +29 -8
  59. package/lib/store/indexeddb-remote-backend.js.map +1 -1
  60. package/lib/store/indexeddb.d.ts +7 -5
  61. package/lib/store/indexeddb.d.ts.map +1 -1
  62. package/lib/store/indexeddb.js +20 -10
  63. package/lib/store/indexeddb.js.map +1 -1
  64. package/lib/store/memory.d.ts +1 -0
  65. package/lib/store/memory.d.ts.map +1 -1
  66. package/lib/store/memory.js +3 -0
  67. package/lib/store/memory.js.map +1 -1
  68. package/lib/store/stub.d.ts +1 -0
  69. package/lib/store/stub.d.ts.map +1 -1
  70. package/lib/store/stub.js +3 -0
  71. package/lib/store/stub.js.map +1 -1
  72. package/lib/sync-accumulator.d.ts +1 -0
  73. package/lib/sync-accumulator.d.ts.map +1 -1
  74. package/lib/sync-accumulator.js +4 -0
  75. package/lib/sync-accumulator.js.map +1 -1
  76. package/package.json +3 -3
  77. package/src/@types/event.ts +9 -0
  78. package/src/@types/retention.ts +16 -0
  79. package/src/capabilityPoller.ts +102 -0
  80. package/src/client.ts +18 -4
  81. package/src/matrix.ts +1 -0
  82. package/src/matrixrtc/MembershipManager.ts +2 -0
  83. package/src/matrixrtc/MembershipManagerActionScheduler.ts +4 -1
  84. package/src/models/room-retention.ts +230 -0
  85. package/src/models/room.ts +17 -1
  86. package/src/retentionPolicy.ts +65 -0
  87. package/src/rust-crypto/backup.ts +15 -4
  88. package/src/serverCapabilities.ts +8 -67
  89. package/src/store/index.ts +8 -0
  90. package/src/store/indexeddb-local-backend.ts +10 -0
  91. package/src/store/indexeddb-remote-backend.ts +24 -5
  92. package/src/store/indexeddb.ts +20 -8
  93. package/src/store/memory.ts +4 -0
  94. package/src/store/stub.ts +3 -0
  95. package/src/sync-accumulator.ts +9 -0
@@ -29,7 +29,7 @@ export class RemoteIndexedDBStoreBackend implements IIndexedDBBackend {
29
29
  private inFlight: Record<number, PromiseWithResolvers<any>> = {}; // seq: promise
30
30
  // Once we start connecting, we keep the promise and re-use it
31
31
  // if we try to connect again
32
- private startPromise?: Promise<void>;
32
+ private startPromiseResolvers?: PromiseWithResolvers<void>;
33
33
  // Callback for when the IndexedDB gets closed unexpectedly
34
34
  private onClose?(): void;
35
35
 
@@ -158,17 +158,31 @@ export class RemoteIndexedDBStoreBackend implements IIndexedDBBackend {
158
158
  await this.doCmd("removeUserProfiles", [userIds]);
159
159
  }
160
160
 
161
+ public async removeEventsFromRoom(roomId: string, eventIds: string[]): Promise<void> {
162
+ await this.doCmd("removeEventsFromRoom", [roomId, eventIds]);
163
+ }
164
+
161
165
  private ensureStarted(): Promise<void> {
162
- if (!this.startPromise) {
163
- this.worker = this.workerFactory();
166
+ if (!this.startPromiseResolvers) {
167
+ this.startPromiseResolvers = Promise.withResolvers();
168
+
169
+ try {
170
+ this.worker = this.workerFactory();
171
+ } catch (e) {
172
+ logger.error("IndexedDB worker failed to start", e);
173
+ this.startPromiseResolvers.reject(new Error("IndexedDB worker failed to start"));
174
+ return this.startPromiseResolvers.promise;
175
+ }
164
176
  this.worker.onmessage = this.onWorkerMessage;
177
+ this.worker.onerror = this.onWorkerError;
165
178
 
166
179
  // tell the worker the db name.
167
- this.startPromise = this.doCmd("setupWorker", [this.dbName]).then(() => {
180
+ this.doCmd("setupWorker", [this.dbName]).then(() => {
168
181
  logger.log("IndexedDB worker is ready");
182
+ this.startPromiseResolvers?.resolve();
169
183
  });
170
184
  }
171
- return this.startPromise;
185
+ return this.startPromiseResolvers.promise;
172
186
  }
173
187
 
174
188
  private doCmd<T>(command: string, args?: any): Promise<T> {
@@ -186,6 +200,11 @@ export class RemoteIndexedDBStoreBackend implements IIndexedDBBackend {
186
200
  });
187
201
  }
188
202
 
203
+ private onWorkerError = (ev: ErrorEvent): void => {
204
+ logger.error("IndexedDB worker failed to connect", ev);
205
+ this.startPromiseResolvers?.reject(ev.message ?? new Error("IndexedDB worker failed to connect"));
206
+ };
207
+
189
208
  private onWorkerMessage = (ev: MessageEvent): void => {
190
209
  const msg = ev.data;
191
210
 
@@ -64,11 +64,7 @@ export class IndexedDBStore extends MemoryStore {
64
64
  return LocalIndexedDBStoreBackend.exists(indexedDB, dbName);
65
65
  }
66
66
 
67
- /**
68
- * The backend instance.
69
- * Call through to this API if you need to perform specific indexeddb actions like deleting the database.
70
- */
71
- public readonly backend: IIndexedDBBackend;
67
+ public _backend: IIndexedDBBackend;
72
68
 
73
69
  private startedUp = false;
74
70
  private syncTs = 0;
@@ -105,7 +101,7 @@ export class IndexedDBStore extends MemoryStore {
105
101
  *
106
102
  * @param opts - Options object.
107
103
  */
108
- public constructor(opts: IOpts) {
104
+ public constructor(private readonly opts: IOpts) {
109
105
  super(opts);
110
106
 
111
107
  if (!opts.indexedDB) {
@@ -113,12 +109,20 @@ export class IndexedDBStore extends MemoryStore {
113
109
  }
114
110
 
115
111
  if (opts.workerFactory) {
116
- this.backend = new RemoteIndexedDBStoreBackend(opts.workerFactory, opts.dbName);
112
+ this._backend = new RemoteIndexedDBStoreBackend(opts.workerFactory, opts.dbName);
117
113
  } else {
118
- this.backend = new LocalIndexedDBStoreBackend(opts.indexedDB, opts.dbName);
114
+ this._backend = new LocalIndexedDBStoreBackend(opts.indexedDB, opts.dbName);
119
115
  }
120
116
  }
121
117
 
118
+ /**
119
+ * The backend instance.
120
+ * Call through to this API if you need to perform specific indexeddb actions like deleting the database.
121
+ */
122
+ public get backend(): IIndexedDBBackend {
123
+ return this._backend;
124
+ }
125
+
122
126
  /** Re-exports `TypedEventEmitter.on` */
123
127
  public on(event: EventEmitterEvents | "degraded" | "closed", handler: (...args: any[]) => void): void {
124
128
  this.emitter.on(event, handler);
@@ -136,6 +140,14 @@ export class IndexedDBStore extends MemoryStore {
136
140
  logger.log(`IndexedDBStore.startup: connecting to backend`);
137
141
  return this.backend
138
142
  .connect(this.onClose)
143
+ .catch((e) => {
144
+ if (this.opts.workerFactory) {
145
+ logger.log("Falling back to local indexeddb backend");
146
+ this._backend = new LocalIndexedDBStoreBackend(this.opts.indexedDB!, this.opts.dbName);
147
+ return this.backend.connect(this.onClose);
148
+ }
149
+ throw e;
150
+ })
139
151
  .then(() => {
140
152
  logger.log(`IndexedDBStore.startup: loading presence events`);
141
153
  return this.backend.getUserPresenceEvents();
@@ -455,6 +455,10 @@ export class MemoryStore implements IStore {
455
455
  userIds.forEach((userId) => this.userProfiles.delete(userId));
456
456
  }
457
457
 
458
+ public async removeEventsFromRoom(roomId: string, eventIds: string[]): Promise<void> {
459
+ // Can ignore as there is no backing store.
460
+ }
461
+
458
462
  public async destroy(): Promise<void> {
459
463
  // Nothing to do
460
464
  }
package/src/store/stub.ts CHANGED
@@ -289,4 +289,7 @@ export class StubStore implements IStore {
289
289
  public async destroy(): Promise<void> {
290
290
  // Nothing to do
291
291
  }
292
+ public async removeEventsFromRoom(roomId: string, eventIds: string[]): Promise<void> {
293
+ // Nothing to do
294
+ }
292
295
  }
@@ -781,6 +781,15 @@ export class SyncAccumulator {
781
781
  public getNextBatchToken(): string {
782
782
  return this.nextBatch!;
783
783
  }
784
+
785
+ public removeEventsFromRoom(roomId: string, eventIds: string[]): void {
786
+ this.joinRooms[roomId]._timeline = this.joinRooms[roomId]._timeline.filter(
787
+ (ev) => !eventIds.includes(ev.event.event_id),
788
+ );
789
+ this.joinRooms[roomId]._stickyEvents = this.joinRooms[roomId]._stickyEvents.filter(
790
+ (ev) => !eventIds.includes(ev.event.event_id),
791
+ );
792
+ }
784
793
  }
785
794
 
786
795
  function setState(eventMap: Record<string, Record<string, IStateEvent>>, event: IRoomEvent | IStateEvent): void {