matrix-js-sdk 43.0.0 → 44.0.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 +28 -0
- package/lib/matrixrtc/CallMembership.d.ts +30 -25
- package/lib/matrixrtc/CallMembership.d.ts.map +1 -1
- package/lib/matrixrtc/CallMembership.js +91 -100
- package/lib/matrixrtc/CallMembership.js.map +1 -1
- package/lib/matrixrtc/EncryptionManager.d.ts +6 -4
- package/lib/matrixrtc/EncryptionManager.d.ts.map +1 -1
- package/lib/matrixrtc/EncryptionManager.js.map +1 -1
- package/lib/matrixrtc/IMembershipManager.d.ts +2 -15
- package/lib/matrixrtc/IMembershipManager.d.ts.map +1 -1
- package/lib/matrixrtc/IMembershipManager.js.map +1 -1
- package/lib/matrixrtc/LivekitTransport.d.ts +36 -7
- package/lib/matrixrtc/LivekitTransport.d.ts.map +1 -1
- package/lib/matrixrtc/LivekitTransport.js +29 -2
- package/lib/matrixrtc/LivekitTransport.js.map +1 -1
- package/lib/matrixrtc/MatrixRTCSession.d.ts +12 -51
- package/lib/matrixrtc/MatrixRTCSession.d.ts.map +1 -1
- package/lib/matrixrtc/MatrixRTCSession.js +10 -66
- package/lib/matrixrtc/MatrixRTCSession.js.map +1 -1
- package/lib/matrixrtc/MembershipManager.d.ts +5 -10
- package/lib/matrixrtc/MembershipManager.d.ts.map +1 -1
- package/lib/matrixrtc/MembershipManager.js +25 -44
- package/lib/matrixrtc/MembershipManager.js.map +1 -1
- package/lib/matrixrtc/RTCEncryptionManager.d.ts +8 -8
- package/lib/matrixrtc/RTCEncryptionManager.d.ts.map +1 -1
- package/lib/matrixrtc/RTCEncryptionManager.js +30 -22
- package/lib/matrixrtc/RTCEncryptionManager.js.map +1 -1
- package/lib/matrixrtc/ToDeviceKeyTransport.js +7 -8
- package/lib/matrixrtc/ToDeviceKeyTransport.js.map +1 -1
- package/lib/matrixrtc/membershipData/rtc.d.ts +8 -13
- package/lib/matrixrtc/membershipData/rtc.d.ts.map +1 -1
- package/lib/matrixrtc/membershipData/rtc.js +2 -11
- package/lib/matrixrtc/membershipData/rtc.js.map +1 -1
- package/lib/matrixrtc/membershipData/session.d.ts +6 -2
- package/lib/matrixrtc/membershipData/session.d.ts.map +1 -1
- package/lib/matrixrtc/membershipData/session.js +3 -0
- package/lib/matrixrtc/membershipData/session.js.map +1 -1
- package/lib/matrixrtc/types.d.ts +5 -0
- package/lib/matrixrtc/types.d.ts.map +1 -1
- package/lib/matrixrtc/types.js +5 -0
- package/lib/matrixrtc/types.js.map +1 -1
- package/lib/models/event-timeline-set.d.ts +9 -2
- package/lib/models/event-timeline-set.d.ts.map +1 -1
- package/lib/models/event-timeline-set.js +8 -5
- package/lib/models/event-timeline-set.js.map +1 -1
- package/lib/models/room-sticky-events.d.ts +17 -2
- package/lib/models/room-sticky-events.d.ts.map +1 -1
- package/lib/models/room-sticky-events.js +88 -47
- package/lib/models/room-sticky-events.js.map +1 -1
- package/lib/models/room.d.ts +1 -1
- package/lib/models/room.d.ts.map +1 -1
- package/lib/models/room.js +8 -2
- package/lib/models/room.js.map +1 -1
- package/lib/models/thread.d.ts.map +1 -1
- package/lib/models/thread.js +23 -2
- package/lib/models/thread.js.map +1 -1
- package/lib/rendezvous/MSC4108SignInWithQR.d.ts +3 -3
- package/lib/rendezvous/MSC4108SignInWithQR.d.ts.map +1 -1
- package/lib/rendezvous/MSC4108SignInWithQR.js.map +1 -1
- package/lib/rendezvous/SignInWithQRFlow.d.ts +95 -0
- package/lib/rendezvous/SignInWithQRFlow.d.ts.map +1 -0
- package/lib/rendezvous/SignInWithQRFlow.js +3 -0
- package/lib/rendezvous/SignInWithQRFlow.js.map +1 -0
- package/lib/rendezvous/index.d.ts +1 -0
- package/lib/rendezvous/index.d.ts.map +1 -1
- package/lib/rendezvous/index.js.map +1 -1
- package/lib/rust-crypto/index.js +5 -1
- package/lib/rust-crypto/index.js.map +1 -1
- package/package.json +3 -3
- package/src/matrixrtc/CallMembership.ts +85 -95
- package/src/matrixrtc/EncryptionManager.ts +6 -4
- package/src/matrixrtc/IMembershipManager.ts +2 -15
- package/src/matrixrtc/LivekitTransport.ts +58 -9
- package/src/matrixrtc/MatrixRTCSession.ts +21 -80
- package/src/matrixrtc/MembershipManager.ts +23 -40
- package/src/matrixrtc/RTCEncryptionManager.ts +51 -39
- package/src/matrixrtc/ToDeviceKeyTransport.ts +7 -7
- package/src/matrixrtc/membershipData/rtc.ts +9 -23
- package/src/matrixrtc/membershipData/session.ts +14 -2
- package/src/matrixrtc/types.ts +6 -0
- package/src/models/event-timeline-set.ts +19 -4
- package/src/models/room-sticky-events.ts +92 -58
- package/src/models/room.ts +8 -2
- package/src/models/thread.ts +25 -3
- package/src/rendezvous/MSC4108SignInWithQR.ts +3 -3
- package/src/rendezvous/SignInWithQRFlow.ts +117 -0
- package/src/rendezvous/index.ts +1 -0
- package/src/rust-crypto/index.ts +5 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"room-sticky-events.d.ts","sourceRoot":"","sources":["../../src/models/room-sticky-events.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,KAAK,WAAW,EAAoB,MAAM,YAAY,CAAC;AAChE,OAAO,EAAE,iBAAiB,EAAE,MAAM,0BAA0B,CAAC;AAI7D,oBAAY,qBAAqB;IAC7B,MAAM,4BAA4B;CACrC;AAED,MAAM,MAAM,iBAAiB,GAAG,WAAW,GAAG;IAAE,uBAAuB,EAAE,MAAM,CAAA;CAAE,CAAC;AAElF,MAAM,MAAM,mBAAmB,GAAG;IAC9B;;;;;OAKG;IACH,CAAC,qBAAqB,CAAC,MAAM,CAAC,EAAE,CAC5B,KAAK,EAAE,iBAAiB,EAAE,EAC1B,OAAO,EAAE;QAAE,OAAO,EAAE,iBAAiB,CAAC;QAAC,QAAQ,EAAE,iBAAiB,CAAA;KAAE,EAAE,EACtE,OAAO,EAAE,iBAAiB,EAAE,KAC3B,IAAI,CAAC;CACb,CAAC;AASF;;;GAGG;AACH,qBAAa,qBAAsB,SAAQ,iBAAiB,CAAC,qBAAqB,EAAE,mBAAmB,CAAC;IACpG;;;;;;OAMG;IACH,OAAO,CAAC,QAAQ,CAAC,eAAe,CAAuD;IACvF;;;OAGG;IACH,OAAO,CAAC,QAAQ,CAAC,mBAAmB,CAAgC;IAEpE,OAAO,CAAC,gBAAgB,CAAC,CAAgC;IACzD,OAAO,CAAC,uBAAuB,CAAmC;IAElE;;;;OAIG;IACH,OAAO,CAAC,MAAM,CAAC,eAAe;
|
|
1
|
+
{"version":3,"file":"room-sticky-events.d.ts","sourceRoot":"","sources":["../../src/models/room-sticky-events.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,KAAK,WAAW,EAAoB,MAAM,YAAY,CAAC;AAChE,OAAO,EAAE,iBAAiB,EAAE,MAAM,0BAA0B,CAAC;AAI7D,oBAAY,qBAAqB;IAC7B,MAAM,4BAA4B;CACrC;AAED,MAAM,MAAM,iBAAiB,GAAG,WAAW,GAAG;IAAE,uBAAuB,EAAE,MAAM,CAAA;CAAE,CAAC;AAElF,MAAM,MAAM,mBAAmB,GAAG;IAC9B;;;;;OAKG;IACH,CAAC,qBAAqB,CAAC,MAAM,CAAC,EAAE,CAC5B,KAAK,EAAE,iBAAiB,EAAE,EAC1B,OAAO,EAAE;QAAE,OAAO,EAAE,iBAAiB,CAAC;QAAC,QAAQ,EAAE,iBAAiB,CAAA;KAAE,EAAE,EACtE,OAAO,EAAE,iBAAiB,EAAE,KAC3B,IAAI,CAAC;CACb,CAAC;AASF;;;GAGG;AACH,qBAAa,qBAAsB,SAAQ,iBAAiB,CAAC,qBAAqB,EAAE,mBAAmB,CAAC;IACpG;;;;;;OAMG;IACH,OAAO,CAAC,QAAQ,CAAC,eAAe,CAAuD;IACvF;;;OAGG;IACH,OAAO,CAAC,QAAQ,CAAC,mBAAmB,CAAgC;IAEpE,OAAO,CAAC,gBAAgB,CAAC,CAAgC;IACzD,OAAO,CAAC,uBAAuB,CAAmC;IAElE;;;;OAIG;IACH,OAAO,CAAC,MAAM,CAAC,eAAe;IAqB9B;;;;;OAKG;IACH,OAAO,CAAC,MAAM,CAAC,SAAS;IAIxB;;;;OAIG;IACH,OAAO,CAAC,MAAM,CAAC,YAAY;IAI3B;;;;OAIG;IACK,eAAe,IAAI,QAAQ,CAAC,iBAAiB,CAAC,CASrD;IAED;;;;;;OAMG;IACI,mBAAmB,CAAC,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,iBAAiB,GAAG,SAAS,CAGzG;IAED;;;;;OAKG;IACI,qBAAqB,CAAC,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,iBAAiB,EAAE,CAE9E;IAED;;;;;;;;;OASG;IACH,OAAO,CAAC,cAAc;IAkEtB;;;;;OAKG;IACH,OAAO,CAAC,2BAA2B;IAYnC;;;;OAIG;IACI,eAAe,CAAC,MAAM,EAAE,WAAW,EAAE,GAAG,IAAI,CAoBlD;IAED;;;OAGG;IACH,OAAO,CAAC,mBAAmB;IAY3B;;OAEG;IACH,OAAO,CAAC,QAAQ,CAAC,wBAAwB,CAgDvC;IAEF;;;;OAIG;IACI,eAAe,CAAC,aAAa,EAAE,WAAW,GAAG,MAAM,GAAG,IAAI,CAmDhE;IAED;;;;;;OAMG;IACH,OAAO,CAAC,sBAAsB;IAwC9B;;OAEG;IACI,KAAK,IAAI,IAAI,CAKnB;CACJ"}
|
|
@@ -23,7 +23,7 @@ export class RoomStickyEventsStore extends TypedEventEmitter {
|
|
|
23
23
|
* Sticky event map is a nested map of:
|
|
24
24
|
* eventType -> `content.sticky_key sender` -> StickyMatrixEvent[]
|
|
25
25
|
*
|
|
26
|
-
* The events are ordered
|
|
26
|
+
* The events are ordered descendingly by expiry, tie breaking on the event ID, so that the first event
|
|
27
27
|
* in the array will always be the "current" one.
|
|
28
28
|
*/
|
|
29
29
|
_defineProperty(this, "stickyEventsMap", new Map());
|
|
@@ -46,13 +46,13 @@ export class RoomStickyEventsStore extends TypedEventEmitter {
|
|
|
46
46
|
for (const [eventType, innerEvents] of this.stickyEventsMap.entries()) {
|
|
47
47
|
for (const [innerMapKey, [currentEvent, ...previousEvents]] of innerEvents) {
|
|
48
48
|
// we only added items with `sticky` into this map so we can assert non-null here
|
|
49
|
-
if (now
|
|
49
|
+
if (RoomStickyEventsStore.isExpired(currentEvent, now)) {
|
|
50
50
|
logger.debug("Expiring sticky event", currentEvent.getId());
|
|
51
51
|
removedEvents.push(currentEvent);
|
|
52
52
|
this.stickyEventsMap.get(eventType).delete(innerMapKey);
|
|
53
53
|
} else {
|
|
54
54
|
// Ensure we remove any previous events which have now expired, to avoid unbounded memory consumption.
|
|
55
|
-
this.stickyEventsMap.get(eventType).set(innerMapKey, [currentEvent, ...previousEvents.filter(e => e
|
|
55
|
+
this.stickyEventsMap.get(eventType).set(innerMapKey, [currentEvent, ...previousEvents.filter(e => !RoomStickyEventsStore.isExpired(e, now))]);
|
|
56
56
|
// If not removing the event, check to see if it's the next lowest expiry.
|
|
57
57
|
this.nextStickyEventExpiryTs = Math.min(this.nextStickyEventExpiryTs, currentEvent.unstableStickyExpiresAt);
|
|
58
58
|
}
|
|
@@ -63,7 +63,7 @@ export class RoomStickyEventsStore extends TypedEventEmitter {
|
|
|
63
63
|
}
|
|
64
64
|
}
|
|
65
65
|
for (const event of this.unkeyedStickyEvents) {
|
|
66
|
-
if (now
|
|
66
|
+
if (RoomStickyEventsStore.isExpired(event, now)) {
|
|
67
67
|
logger.debug("Expiring sticky event", event.getId());
|
|
68
68
|
this.unkeyedStickyEvents.delete(event);
|
|
69
69
|
removedEvents.push(event);
|
|
@@ -80,24 +80,41 @@ export class RoomStickyEventsStore extends TypedEventEmitter {
|
|
|
80
80
|
});
|
|
81
81
|
}
|
|
82
82
|
/**
|
|
83
|
-
* Sort two sticky events by
|
|
83
|
+
* Sort two sticky events by expiry, tie breaking on the event ID. This assumes the sticky events have the same
|
|
84
84
|
* `type`, `sticky_key` and `sender`.
|
|
85
85
|
* @returns A positive value if event A will expire sooner, or a negative value if event B will expire sooner.
|
|
86
86
|
*/
|
|
87
87
|
static sortStickyEvent(eventA, eventB) {
|
|
88
|
-
//
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
88
|
+
// First, compare by expiry (`origin_server_ts + sticky.duration_ms`).
|
|
89
|
+
const expiryA = eventA.getTs() + eventA.unstableStickyInfo.duration_ms;
|
|
90
|
+
const expiryB = eventB.getTs() + eventB.unstableStickyInfo.duration_ms;
|
|
91
|
+
if (expiryB !== expiryA) {
|
|
92
|
+
return expiryB - expiryA;
|
|
92
93
|
}
|
|
93
|
-
|
|
94
|
+
|
|
95
|
+
// Tie break on the highest lexicographical event ID.
|
|
96
|
+
const idA = eventA.getId() ?? "";
|
|
97
|
+
const idB = eventB.getId() ?? "";
|
|
98
|
+
if (idB > idA) {
|
|
94
99
|
return 1;
|
|
100
|
+
} else if (idB < idA) {
|
|
101
|
+
return -1;
|
|
95
102
|
}
|
|
96
103
|
|
|
97
104
|
// This should fail as we've got corruption in our sticky array.
|
|
98
105
|
throw Error("Comparing two sticky events with the same event ID is not allowed.");
|
|
99
106
|
}
|
|
100
107
|
|
|
108
|
+
/**
|
|
109
|
+
* Check whether a sticky event has expired.
|
|
110
|
+
* @param event The sticky event to check.
|
|
111
|
+
* @param now The current time in milliseconds since the epoch.
|
|
112
|
+
* @returns True if the event has expired, false otherwise.
|
|
113
|
+
*/
|
|
114
|
+
static isExpired(event, now) {
|
|
115
|
+
return event.unstableStickyExpiresAt <= now;
|
|
116
|
+
}
|
|
117
|
+
|
|
101
118
|
/**
|
|
102
119
|
* Generate the correct key for an event to be found in the inner maps of `stickyEventsMap`.
|
|
103
120
|
* @param stickyKey The sticky key of an event.
|
|
@@ -158,7 +175,7 @@ export class RoomStickyEventsStore extends TypedEventEmitter {
|
|
|
158
175
|
addStickyEvent(event) {
|
|
159
176
|
// The map is keyed on the event's type and sticky key, both of which are encrypted. Wait for the
|
|
160
177
|
// event to be decrypted, otherwise it would be filed under `m.room.encrypted` with no sticky key.
|
|
161
|
-
if (event.isBeingDecrypted() || event.shouldAttemptDecryption()) {
|
|
178
|
+
if (event.isBeingDecrypted() || event.shouldAttemptDecryption() || event.isDecryptionFailure()) {
|
|
162
179
|
this.addStickyEventOnceDecrypted(event);
|
|
163
180
|
return {
|
|
164
181
|
added: false
|
|
@@ -173,10 +190,11 @@ export class RoomStickyEventsStore extends TypedEventEmitter {
|
|
|
173
190
|
if (event.unstableStickyExpiresAt === undefined) {
|
|
174
191
|
throw new Error(`${event.getId()} is missing msc4354_sticky.duration_ms`);
|
|
175
192
|
}
|
|
193
|
+
const stickyEvent = event;
|
|
176
194
|
const sender = event.getSender();
|
|
177
195
|
const type = event.getType();
|
|
178
196
|
assertIsUserId(sender);
|
|
179
|
-
if (
|
|
197
|
+
if (RoomStickyEventsStore.isExpired(stickyEvent, Date.now())) {
|
|
180
198
|
logger.info("ignored sticky event with older expiration time than current time", stickyKey);
|
|
181
199
|
return {
|
|
182
200
|
added: false
|
|
@@ -188,7 +206,6 @@ export class RoomStickyEventsStore extends TypedEventEmitter {
|
|
|
188
206
|
if (!sender.startsWith("@")) {
|
|
189
207
|
throw new Error("Expected sender to start with @");
|
|
190
208
|
}
|
|
191
|
-
const stickyEvent = event;
|
|
192
209
|
if (stickyKey === undefined) {
|
|
193
210
|
this.unkeyedStickyEvents.add(stickyEvent);
|
|
194
211
|
// Recalculate the next expiry time.
|
|
@@ -301,6 +318,9 @@ export class RoomStickyEventsStore extends TypedEventEmitter {
|
|
|
301
318
|
|
|
302
319
|
// Handle unkeyedStickyEvents first since it's *quick*.
|
|
303
320
|
const redactEventId = typeof redactedEvent === "string" ? redactedEvent : redactedEvent.getId();
|
|
321
|
+
if (!redactEventId) {
|
|
322
|
+
return;
|
|
323
|
+
}
|
|
304
324
|
for (const event of this.unkeyedStickyEvents) {
|
|
305
325
|
if (event.getId() === redactEventId) {
|
|
306
326
|
this.unkeyedStickyEvents.delete(event);
|
|
@@ -312,54 +332,75 @@ export class RoomStickyEventsStore extends TypedEventEmitter {
|
|
|
312
332
|
// Faster method of finding the event since we have the event cached.
|
|
313
333
|
if (typeof redactedEvent !== "string" && !redactedEvent.isRedacted()) {
|
|
314
334
|
const stickyKey = redactedEvent.getContent().msc4354_sticky_key;
|
|
315
|
-
if (typeof stickyKey !== "string"
|
|
335
|
+
if (typeof stickyKey !== "string") {
|
|
316
336
|
return; // Not a sticky event.
|
|
317
337
|
}
|
|
318
|
-
const eventType = redactedEvent.getType();
|
|
319
338
|
const sender = redactedEvent.getSender();
|
|
320
339
|
assertIsUserId(sender);
|
|
321
|
-
|
|
322
|
-
|
|
323
|
-
|
|
340
|
+
this.removeKeyedStickyEvent(redactedEvent.getType(), RoomStickyEventsStore.stickyMapKey(stickyKey, sender), redactEventId);
|
|
341
|
+
return;
|
|
342
|
+
}
|
|
343
|
+
|
|
344
|
+
// We only know the event ID of the redacted event, so we need to
|
|
345
|
+
// traverse the map to find our event.
|
|
346
|
+
for (const [eventType, innerMap] of this.stickyEventsMap) {
|
|
347
|
+
for (const [mapKey, events] of innerMap) {
|
|
348
|
+
if (events.some(e => e.getId() === redactEventId)) {
|
|
349
|
+
// Found the event.
|
|
350
|
+
this.removeKeyedStickyEvent(eventType, mapKey, redactEventId);
|
|
351
|
+
return;
|
|
352
|
+
}
|
|
324
353
|
}
|
|
325
|
-
|
|
326
|
-
|
|
327
|
-
|
|
328
|
-
|
|
329
|
-
|
|
354
|
+
}
|
|
355
|
+
}
|
|
356
|
+
|
|
357
|
+
/**
|
|
358
|
+
* Remove a redacted event from an entry of the keyed sticky map, emitting
|
|
359
|
+
* `RoomEvent.StickyEvents` if this changes the "current" event of that entry.
|
|
360
|
+
* @param eventType The event `type` of the redacted event.
|
|
361
|
+
* @param mapKey The inner map key of the redacted event, see {@link stickyMapKey}.
|
|
362
|
+
* @param redactEventId The ID of the redacted event.
|
|
363
|
+
*/
|
|
364
|
+
removeKeyedStickyEvent(eventType, mapKey, redactEventId) {
|
|
365
|
+
const innerMap = this.stickyEventsMap.get(eventType);
|
|
366
|
+
const events = innerMap?.get(mapKey);
|
|
367
|
+
if (!innerMap || !events) {
|
|
368
|
+
return;
|
|
369
|
+
}
|
|
370
|
+
const index = events.findIndex(e => e.getId() === redactEventId);
|
|
371
|
+
if (index === -1) {
|
|
372
|
+
// The event is not in the map so ignore.
|
|
373
|
+
return;
|
|
374
|
+
}
|
|
375
|
+
logger.debug(`Redaction for ${redactEventId} under sticky map key ${mapKey}`);
|
|
376
|
+
|
|
377
|
+
// The current event always sits at index 0.
|
|
378
|
+
const currentEvent = events[0];
|
|
379
|
+
const currentEventRedacted = index === 0;
|
|
380
|
+
|
|
381
|
+
// Drop the redacted event and any other events that may have already been redacted before.
|
|
382
|
+
const newEvents = events.filter(e => e.getId() !== redactEventId && !e.isRedacted());
|
|
383
|
+
if (newEvents.length) {
|
|
384
|
+
innerMap.set(mapKey, newEvents);
|
|
385
|
+
} else {
|
|
386
|
+
innerMap.delete(mapKey);
|
|
387
|
+
if (innerMap.size === 0) {
|
|
388
|
+
this.stickyEventsMap.delete(eventType);
|
|
330
389
|
}
|
|
331
|
-
|
|
332
|
-
|
|
333
|
-
|
|
334
|
-
|
|
390
|
+
}
|
|
391
|
+
|
|
392
|
+
// Emit an update if the current event was redacted.
|
|
393
|
+
if (currentEventRedacted) {
|
|
335
394
|
if (newEvents.length) {
|
|
395
|
+
// The current event was redacted and most recent superseded event takes its place.
|
|
336
396
|
this.emit(RoomStickyEventsEvent.Update, [], [{
|
|
337
|
-
// This looks confusing. This emits that the newer event
|
|
338
|
-
// has been redacted and the previous event has taken it's place.
|
|
339
397
|
previous: currentEvent,
|
|
340
398
|
current: newEvents[0]
|
|
341
399
|
}], []);
|
|
342
400
|
} else {
|
|
343
|
-
//
|
|
344
|
-
innerMap.delete(mapKey);
|
|
345
|
-
if (innerMap.size === 0) {
|
|
346
|
-
this.stickyEventsMap.delete(eventType);
|
|
347
|
-
}
|
|
401
|
+
// The current event was redacted and no superseded events remain to replace it.
|
|
348
402
|
this.emit(RoomStickyEventsEvent.Update, [], [], [currentEvent]);
|
|
349
403
|
}
|
|
350
|
-
return;
|
|
351
|
-
}
|
|
352
|
-
|
|
353
|
-
// We only know the event ID of the redacted event, so we need to
|
|
354
|
-
// traverse the map to find our event.
|
|
355
|
-
for (const innerMap of this.stickyEventsMap.values()) {
|
|
356
|
-
for (const [currentEvent] of innerMap.values()) {
|
|
357
|
-
if (currentEvent.getId() !== redactEventId) {
|
|
358
|
-
continue;
|
|
359
|
-
}
|
|
360
|
-
// Found the event.
|
|
361
|
-
return this.handleRedaction(currentEvent);
|
|
362
|
-
}
|
|
363
404
|
}
|
|
364
405
|
}
|
|
365
406
|
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"room-sticky-events.js","names":[],"sources":["../../src/models/room-sticky-events.ts"],"sourcesContent":["import { logger as loggerInstance } from \"../logger.ts\";\nimport { type MatrixEvent, MatrixEventEvent } from \"./event.ts\";\nimport { TypedEventEmitter } from \"./typed-event-emitter.ts\";\n\nconst logger = loggerInstance.getChild(\"RoomStickyEvents\");\n\nexport enum RoomStickyEventsEvent {\n Update = \"RoomStickyEvents.Update\",\n}\n\nexport type StickyMatrixEvent = MatrixEvent & { unstableStickyExpiresAt: number };\n\nexport type RoomStickyEventsMap = {\n /**\n * Fires when any sticky event changes happen in a room.\n * @param added Any new sticky events with no predecessor events (matching sender, type, and sticky_key)\n * @param updated Any sticky events that supersede an existing event (matching sender, type, and sticky_key)\n * @param removed The events that were removed from the map due to expiry.\n */\n [RoomStickyEventsEvent.Update]: (\n added: StickyMatrixEvent[],\n updated: { current: StickyMatrixEvent; previous: StickyMatrixEvent }[],\n removed: StickyMatrixEvent[],\n ) => void;\n};\n\ntype UserId = `@${string}`;\n\nfunction assertIsUserId(value: unknown): asserts value is UserId {\n if (typeof value !== \"string\") throw new Error(\"Not a string\");\n if (!value.startsWith(\"@\")) throw new Error(\"Not a userId\");\n}\n\n/**\n * Tracks sticky events on behalf of one room, and fires an event\n * whenever a sticky event is updated or replaced.\n */\nexport class RoomStickyEventsStore extends TypedEventEmitter<RoomStickyEventsEvent, RoomStickyEventsMap> {\n /**\n * Sticky event map is a nested map of:\n * eventType -> `content.sticky_key sender` -> StickyMatrixEvent[]\n *\n * The events are ordered in latest to earliest expiry, so that the first event\n * in the array will always be the \"current\" one.\n */\n private readonly stickyEventsMap = new Map<string, Map<string, StickyMatrixEvent[]>>();\n /**\n * These are sticky events that have no sticky key and therefore exist outside the tuple\n * system above. They are just held in this Set until they expire.\n */\n private readonly unkeyedStickyEvents = new Set<StickyMatrixEvent>();\n\n private stickyEventTimer?: ReturnType<typeof setTimeout>;\n private nextStickyEventExpiryTs: number = Number.MAX_SAFE_INTEGER;\n\n /**\n * Sort two sticky events by order of expiry. This assumes the sticky events have the same\n * `type`, `sticky_key` and `sender`.\n * @returns A positive value if event A will expire sooner, or a negative value if event B will expire sooner.\n */\n private static sortStickyEvent(eventA: StickyMatrixEvent, eventB: StickyMatrixEvent): number {\n // Sticky events with the same key have to use the same expiration duration.\n // Hence, comparing via `origin_server_ts` yields the exact same result as comparing their expiration time.\n if (eventB.getTs() !== eventA.getTs()) {\n return eventB.getTs() - eventA.getTs();\n }\n\n if ((eventB.getId() ?? \"\") > (eventA.getId() ?? \"\")) {\n return 1;\n }\n\n // This should fail as we've got corruption in our sticky array.\n throw Error(\"Comparing two sticky events with the same event ID is not allowed.\");\n }\n\n /**\n * Generate the correct key for an event to be found in the inner maps of `stickyEventsMap`.\n * @param stickyKey The sticky key of an event.\n * @param sender The sender of the event.\n */\n private static stickyMapKey(stickyKey: string, sender: UserId): string {\n return `${stickyKey}${sender}`;\n }\n\n /**\n * Get all sticky events that are currently active.\n * @returns An iterable set of events.\n * @yields {@link StickyMatrixEvent}\n */\n public *getStickyEvents(): Iterable<StickyMatrixEvent> {\n yield* this.unkeyedStickyEvents;\n for (const innerMap of this.stickyEventsMap.values()) {\n // Inner map contains a map of sender+stickykeys => all sticky events\n for (const events of innerMap.values()) {\n // The first sticky event is the \"current\" one in the sticky map.\n yield events[0];\n }\n }\n }\n\n /**\n * Get an active sticky event that match the given `type`, `sender`, and `stickyKey`\n * @param type The event `type`.\n * @param sender The sender of the sticky event.\n * @param stickyKey The sticky key used by the event.\n * @returns A matching active sticky event, or undefined.\n */\n public getKeyedStickyEvent(sender: string, type: string, stickyKey: string): StickyMatrixEvent | undefined {\n assertIsUserId(sender);\n return this.stickyEventsMap.get(type)?.get(RoomStickyEventsStore.stickyMapKey(stickyKey, sender))?.[0];\n }\n\n /**\n * Get active sticky events without a sticky key that match the given `type` and `sender`.\n * @param type The event `type`.\n * @param sender The sender of the sticky event.\n * @returns An array of matching sticky events.\n */\n public getUnkeyedStickyEvent(sender: string, type: string): StickyMatrixEvent[] {\n return [...this.unkeyedStickyEvents].filter((ev) => ev.getType() === type && ev.getSender() === sender);\n }\n\n /**\n * Adds a sticky event into the local sticky event map.\n *\n * NOTE: This will not cause `RoomEvent.StickyEvents` to be emitted.\n *\n * @throws If the `event` does not contain valid sticky data.\n * @param event The MatrixEvent that contains sticky data.\n * @returns An object describing whether the event was added to the map,\n * and the previous event it may have replaced.\n */\n private addStickyEvent(event: MatrixEvent): { added: true; prevEvent?: StickyMatrixEvent } | { added: false } {\n // The map is keyed on the event's type and sticky key, both of which are encrypted. Wait for the\n // event to be decrypted, otherwise it would be filed under `m.room.encrypted` with no sticky key.\n if (event.isBeingDecrypted() || event.shouldAttemptDecryption()) {\n this.addStickyEventOnceDecrypted(event);\n return { added: false };\n }\n\n const stickyKey = event.getContent().msc4354_sticky_key;\n if (typeof stickyKey !== \"string\" && stickyKey !== undefined) {\n throw new Error(`${event.getId()} is missing msc4354_sticky_key`);\n }\n\n // With this we have the guarantee, that all events in stickyEventsMap are correctly formatted\n if (event.unstableStickyExpiresAt === undefined) {\n throw new Error(`${event.getId()} is missing msc4354_sticky.duration_ms`);\n }\n const sender = event.getSender();\n const type = event.getType();\n assertIsUserId(sender);\n if (event.unstableStickyExpiresAt <= Date.now()) {\n logger.info(\"ignored sticky event with older expiration time than current time\", stickyKey);\n return { added: false };\n }\n\n // While we fully expect the server to always provide the correct value,\n // this is just insurance to protect against attacks on our Map.\n if (!sender.startsWith(\"@\")) {\n throw new Error(\"Expected sender to start with @\");\n }\n\n const stickyEvent = event as StickyMatrixEvent;\n\n if (stickyKey === undefined) {\n this.unkeyedStickyEvents.add(stickyEvent);\n // Recalculate the next expiry time.\n this.nextStickyEventExpiryTs = Math.min(event.unstableStickyExpiresAt, this.nextStickyEventExpiryTs);\n\n this.scheduleStickyTimer();\n return { added: true };\n }\n\n // Why this is safe:\n // A type may contain anything but the *sender* is tightly\n // constrained so that a key will always end with a @<user_id>\n // E.g. Where a malicious event type might be \"rtc.member.event@foo:bar\" the key becomes:\n // \"rtc.member.event.@foo:bar@bar:baz\"\n const innerMapKey = RoomStickyEventsStore.stickyMapKey(stickyKey, sender);\n const currentEventSet = [stickyEvent, ...(this.stickyEventsMap.get(type)?.get(innerMapKey) ?? [])].sort(\n RoomStickyEventsStore.sortStickyEvent,\n );\n if (!this.stickyEventsMap.has(type)) {\n this.stickyEventsMap.set(type, new Map());\n }\n this.stickyEventsMap.get(type)?.set(innerMapKey, currentEventSet);\n\n // Recalculate the next expiry time.\n this.nextStickyEventExpiryTs = Math.min(stickyEvent.unstableStickyExpiresAt, this.nextStickyEventExpiryTs);\n\n this.scheduleStickyTimer();\n return {\n added: currentEventSet[0] === stickyEvent,\n prevEvent: currentEventSet?.[1],\n };\n }\n\n /**\n * Adds the event to the map once it has been decrypted, emitting `RoomEvent.StickyEvents` at that point.\n *\n * Decryption may fail because the keys haven't arrived yet, in which case we keep waiting. An event that\n * is never decrypted simply never enters the map.\n */\n private addStickyEventOnceDecrypted(event: MatrixEvent): void {\n const onEventDecrypted = (): void => {\n if (event.isDecryptionFailure()) {\n // The event may still be decrypted later, e.g. once the keys arrive. Keep listening.\n event.once(MatrixEventEvent.Decrypted, onEventDecrypted);\n return;\n }\n this.addStickyEvents([event]); // Safe to call because it sorts events by timestamp when updating a keyed entry.\n };\n event.once(MatrixEventEvent.Decrypted, onEventDecrypted);\n }\n\n /**\n * Add a series of sticky events, emitting `RoomEvent.StickyEvents` if any\n * changes were made.\n * @param events A set of new sticky events.\n */\n public addStickyEvents(events: MatrixEvent[]): void {\n const added: StickyMatrixEvent[] = [];\n const updated: { current: StickyMatrixEvent; previous: StickyMatrixEvent }[] = [];\n for (const event of events) {\n try {\n const result = this.addStickyEvent(event);\n if (result.added) {\n if (result.prevEvent) {\n // e is validated as a StickyMatrixEvent by virtue of `addStickyEvent` returning added: true.\n updated.push({ current: event as StickyMatrixEvent, previous: result.prevEvent });\n } else {\n added.push(event as StickyMatrixEvent);\n }\n }\n } catch (ex) {\n logger.warn(\"ignored invalid sticky event\", ex);\n }\n }\n if (added.length || updated.length) this.emit(RoomStickyEventsEvent.Update, added, updated, []);\n this.scheduleStickyTimer();\n }\n\n /**\n * Schedule the sticky event expiry timer. The timer will\n * run immediately if an event has already expired.\n */\n private scheduleStickyTimer(): void {\n if (this.stickyEventTimer) {\n clearTimeout(this.stickyEventTimer);\n this.stickyEventTimer = undefined;\n }\n if (this.nextStickyEventExpiryTs === Number.MAX_SAFE_INTEGER) {\n // We have no events due to expire.\n return;\n } // otherwise, schedule in the future\n this.stickyEventTimer = setTimeout(this.cleanExpiredStickyEvents, this.nextStickyEventExpiryTs - Date.now());\n }\n\n /**\n * Clean out any expired sticky events.\n */\n private readonly cleanExpiredStickyEvents = (): void => {\n const now = Date.now();\n const removedEvents: StickyMatrixEvent[] = [];\n\n // We will recalculate this as we check all events.\n this.nextStickyEventExpiryTs = Number.MAX_SAFE_INTEGER;\n for (const [eventType, innerEvents] of this.stickyEventsMap.entries()) {\n for (const [innerMapKey, [currentEvent, ...previousEvents]] of innerEvents) {\n // we only added items with `sticky` into this map so we can assert non-null here\n if (now >= currentEvent.unstableStickyExpiresAt) {\n logger.debug(\"Expiring sticky event\", currentEvent.getId());\n removedEvents.push(currentEvent);\n this.stickyEventsMap.get(eventType)!.delete(innerMapKey);\n } else {\n // Ensure we remove any previous events which have now expired, to avoid unbounded memory consumption.\n this.stickyEventsMap\n .get(eventType)!\n .set(innerMapKey, [\n currentEvent,\n ...previousEvents.filter((e) => e.unstableStickyExpiresAt <= now),\n ]);\n // If not removing the event, check to see if it's the next lowest expiry.\n this.nextStickyEventExpiryTs = Math.min(\n this.nextStickyEventExpiryTs,\n currentEvent.unstableStickyExpiresAt,\n );\n }\n }\n // Clean up map after use.\n if (this.stickyEventsMap.get(eventType)?.size === 0) {\n this.stickyEventsMap.delete(eventType);\n }\n }\n for (const event of this.unkeyedStickyEvents) {\n if (now >= event.unstableStickyExpiresAt) {\n logger.debug(\"Expiring sticky event\", event.getId());\n this.unkeyedStickyEvents.delete(event);\n removedEvents.push(event);\n } else {\n // If not removing the event, check to see if it's the next lowest expiry.\n this.nextStickyEventExpiryTs = Math.min(this.nextStickyEventExpiryTs, event.unstableStickyExpiresAt);\n }\n }\n if (removedEvents.length) {\n this.emit(RoomStickyEventsEvent.Update, [], [], removedEvents);\n }\n // Finally, schedule the next run.\n this.scheduleStickyTimer();\n };\n\n /**\n * Handles incoming event redactions. Checks the sticky map\n * for any active sticky events being redacted.\n * @param redactedEvent The MatrixEvent OR event ID of the event being redacted. MAY not be a sticky event.\n */\n public handleRedaction(redactedEvent: MatrixEvent | string): void {\n // Note, we do not adjust`nextStickyEventExpiryTs` here.\n // If this event happens to be the most recent expiring event\n // then we may do one extra iteration of cleanExpiredStickyEvents\n // but this saves us having to iterate over all events here to calculate\n // the next expiry time.\n\n // Note, as soon as we find a positive match on an event in this function\n // we can return. There is no need to continue iterating on a positive match\n // as an event can only appear in one map.\n\n // Handle unkeyedStickyEvents first since it's *quick*.\n const redactEventId = typeof redactedEvent === \"string\" ? redactedEvent : redactedEvent.getId();\n for (const event of this.unkeyedStickyEvents) {\n if (event.getId() === redactEventId) {\n this.unkeyedStickyEvents.delete(event);\n this.emit(RoomStickyEventsEvent.Update, [], [], [event]);\n return;\n }\n }\n\n // Faster method of finding the event since we have the event cached.\n if (typeof redactedEvent !== \"string\" && !redactedEvent.isRedacted()) {\n const stickyKey = redactedEvent.getContent().msc4354_sticky_key;\n if (typeof stickyKey !== \"string\" && stickyKey !== undefined) {\n return; // Not a sticky event.\n }\n const eventType = redactedEvent.getType();\n const sender = redactedEvent.getSender();\n assertIsUserId(sender);\n const innerMap = this.stickyEventsMap.get(eventType);\n if (!innerMap) {\n return;\n }\n const mapKey = RoomStickyEventsStore.stickyMapKey(stickyKey, sender);\n const [currentEvent, ...previousEvents] = innerMap.get(mapKey) ?? [];\n if (!currentEvent) {\n // No event current in the map so ignore.\n return;\n }\n logger.debug(`Redaction for ${redactEventId} under sticky key ${stickyKey}`);\n // Revert to previous state, taking care to skip any other redacted events.\n const newEvents = previousEvents.filter((e) => !e.isRedacted()).sort(RoomStickyEventsStore.sortStickyEvent);\n this.stickyEventsMap.get(eventType)?.set(mapKey, newEvents);\n if (newEvents.length) {\n this.emit(\n RoomStickyEventsEvent.Update,\n [],\n [\n {\n // This looks confusing. This emits that the newer event\n // has been redacted and the previous event has taken it's place.\n previous: currentEvent,\n current: newEvents[0],\n },\n ],\n [],\n );\n } else {\n // We did not find a previous event, so just expire.\n innerMap.delete(mapKey);\n if (innerMap.size === 0) {\n this.stickyEventsMap.delete(eventType);\n }\n this.emit(RoomStickyEventsEvent.Update, [], [], [currentEvent]);\n }\n return;\n }\n\n // We only know the event ID of the redacted event, so we need to\n // traverse the map to find our event.\n for (const innerMap of this.stickyEventsMap.values()) {\n for (const [currentEvent] of innerMap.values()) {\n if (currentEvent.getId() !== redactEventId) {\n continue;\n }\n // Found the event.\n return this.handleRedaction(currentEvent);\n }\n }\n }\n\n /**\n * Clear all events and stop the timer from firing.\n */\n public clear(): void {\n this.stickyEventsMap.clear();\n // Unschedule timer.\n this.nextStickyEventExpiryTs = Number.MAX_SAFE_INTEGER;\n this.scheduleStickyTimer();\n }\n}\n"],"mappings":";AAAA,SAAS,MAAM,IAAI,cAAc,QAAQ,cAAc;AACvD,SAA2B,gBAAgB,QAAQ,YAAY;AAC/D,SAAS,iBAAiB,QAAQ,0BAA0B;AAE5D,MAAM,MAAM,GAAG,cAAc,CAAC,QAAQ,CAAC,kBAAkB,CAAC;AAE1D,WAAY,qBAAqB,0BAArB,qBAAqB;EAArB,qBAAqB;EAAA,OAArB,qBAAqB;AAAA;AAsBjC,SAAS,cAAc,CAAC,KAAc,EAA2B;EAC7D,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE,MAAM,IAAI,KAAK,CAAC,cAAc,CAAC;EAC9D,IAAI,CAAC,KAAK,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE,MAAM,IAAI,KAAK,CAAC,cAAc,CAAC;AAC/D;;AAEA;AACA;AACA;AACA;AACA,OAAO,MAAM,qBAAqB,SAAS,iBAAiB,CAA6C;EAAA;IAAA;IACrG;AACJ;AACA;AACA;AACA;AACA;AACA;IANI,yCAOmC,IAAI,GAAG,CAA2C,CAAC;IACtF;AACJ;AACA;AACA;IAHI,6CAIuC,IAAI,GAAG,CAAoB,CAAC;IAAA;IAAA,iDAGzB,MAAM,CAAC,gBAAgB;IA8MjE;AACJ;AACA;IAFI,kDAG4C,MAAY;MACpD,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC;MACtB,MAAM,aAAkC,GAAG,EAAE;;MAE7C;MACA,IAAI,CAAC,uBAAuB,GAAG,MAAM,CAAC,gBAAgB;MACtD,KAAK,MAAM,CAAC,SAAS,EAAE,WAAW,CAAC,IAAI,IAAI,CAAC,eAAe,CAAC,OAAO,CAAC,CAAC,EAAE;QACnE,KAAK,MAAM,CAAC,WAAW,EAAE,CAAC,YAAY,EAAE,GAAG,cAAc,CAAC,CAAC,IAAI,WAAW,EAAE;UACxE;UACA,IAAI,GAAG,IAAI,YAAY,CAAC,uBAAuB,EAAE;YAC7C,MAAM,CAAC,KAAK,CAAC,uBAAuB,EAAE,YAAY,CAAC,KAAK,CAAC,CAAC,CAAC;YAC3D,aAAa,CAAC,IAAI,CAAC,YAAY,CAAC;YAChC,IAAI,CAAC,eAAe,CAAC,GAAG,CAAC,SAAS,CAAC,CAAE,MAAM,CAAC,WAAW,CAAC;UAC5D,CAAC,MAAM;YACH;YACA,IAAI,CAAC,eAAe,CACf,GAAG,CAAC,SAAS,CAAC,CACd,GAAG,CAAC,WAAW,EAAE,CACd,YAAY,EACZ,GAAG,cAAc,CAAC,MAAM,CAAE,CAAC,IAAK,CAAC,CAAC,uBAAuB,IAAI,GAAG,CAAC,CACpE,CAAC;YACN;YACA,IAAI,CAAC,uBAAuB,GAAG,IAAI,CAAC,GAAG,CACnC,IAAI,CAAC,uBAAuB,EAC5B,YAAY,CAAC,uBACjB,CAAC;UACL;QACJ;QACA;QACA,IAAI,IAAI,CAAC,eAAe,CAAC,GAAG,CAAC,SAAS,CAAC,EAAE,IAAI,KAAK,CAAC,EAAE;UACjD,IAAI,CAAC,eAAe,CAAC,MAAM,CAAC,SAAS,CAAC;QAC1C;MACJ;MACA,KAAK,MAAM,KAAK,IAAI,IAAI,CAAC,mBAAmB,EAAE;QAC1C,IAAI,GAAG,IAAI,KAAK,CAAC,uBAAuB,EAAE;UACtC,MAAM,CAAC,KAAK,CAAC,uBAAuB,EAAE,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC;UACpD,IAAI,CAAC,mBAAmB,CAAC,MAAM,CAAC,KAAK,CAAC;UACtC,aAAa,CAAC,IAAI,CAAC,KAAK,CAAC;QAC7B,CAAC,MAAM;UACH;UACA,IAAI,CAAC,uBAAuB,GAAG,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,uBAAuB,EAAE,KAAK,CAAC,uBAAuB,CAAC;QACxG;MACJ;MACA,IAAI,aAAa,CAAC,MAAM,EAAE;QACtB,IAAI,CAAC,IAAI,CAAC,qBAAqB,CAAC,MAAM,EAAE,EAAE,EAAE,EAAE,EAAE,aAAa,CAAC;MAClE;MACA;MACA,IAAI,CAAC,mBAAmB,CAAC,CAAC;IAC9B,CAAC;EAAA;EA/PD;AACJ;AACA;AACA;AACA;EACI,OAAe,eAAe,CAAC,MAAyB,EAAE,MAAyB,EAAU;IACzF;IACA;IACA,IAAI,MAAM,CAAC,KAAK,CAAC,CAAC,KAAK,MAAM,CAAC,KAAK,CAAC,CAAC,EAAE;MACnC,OAAO,MAAM,CAAC,KAAK,CAAC,CAAC,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC;IAC1C;IAEA,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,IAAI,EAAE,KAAK,MAAM,CAAC,KAAK,CAAC,CAAC,IAAI,EAAE,CAAC,EAAE;MACjD,OAAO,CAAC;IACZ;;IAEA;IACA,MAAM,KAAK,CAAC,oEAAoE,CAAC;EACrF;;EAEA;AACJ;AACA;AACA;AACA;EACI,OAAe,YAAY,CAAC,SAAiB,EAAE,MAAc,EAAU;IACnE,OAAO,GAAG,SAAS,GAAG,MAAM,EAAE;EAClC;;EAEA;AACJ;AACA;AACA;AACA;EACI,CAAQ,eAAe,GAAgC;IACnD,OAAO,IAAI,CAAC,mBAAmB;IAC/B,KAAK,MAAM,QAAQ,IAAI,IAAI,CAAC,eAAe,CAAC,MAAM,CAAC,CAAC,EAAE;MAClD;MACA,KAAK,MAAM,MAAM,IAAI,QAAQ,CAAC,MAAM,CAAC,CAAC,EAAE;QACpC;QACA,MAAM,MAAM,CAAC,CAAC,CAAC;MACnB;IACJ;EACJ;;EAEA;AACJ;AACA;AACA;AACA;AACA;AACA;EACW,mBAAmB,CAAC,MAAc,EAAE,IAAY,EAAE,SAAiB,EAAiC;IACvG,cAAc,CAAC,MAAM,CAAC;IACtB,OAAO,IAAI,CAAC,eAAe,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,GAAG,CAAC,qBAAqB,CAAC,YAAY,CAAC,SAAS,EAAE,MAAM,CAAC,CAAC,GAAG,CAAC,CAAC;EAC1G;;EAEA;AACJ;AACA;AACA;AACA;AACA;EACW,qBAAqB,CAAC,MAAc,EAAE,IAAY,EAAuB;IAC5E,OAAO,CAAC,GAAG,IAAI,CAAC,mBAAmB,CAAC,CAAC,MAAM,CAAE,EAAE,IAAK,EAAE,CAAC,OAAO,CAAC,CAAC,KAAK,IAAI,IAAI,EAAE,CAAC,SAAS,CAAC,CAAC,KAAK,MAAM,CAAC;EAC3G;;EAEA;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;EACY,cAAc,CAAC,KAAkB,EAAqE;IAC1G;IACA;IACA,IAAI,KAAK,CAAC,gBAAgB,CAAC,CAAC,IAAI,KAAK,CAAC,uBAAuB,CAAC,CAAC,EAAE;MAC7D,IAAI,CAAC,2BAA2B,CAAC,KAAK,CAAC;MACvC,OAAO;QAAE,KAAK,EAAE;MAAM,CAAC;IAC3B;IAEA,MAAM,SAAS,GAAG,KAAK,CAAC,UAAU,CAAC,CAAC,CAAC,kBAAkB;IACvD,IAAI,OAAO,SAAS,KAAK,QAAQ,IAAI,SAAS,KAAK,SAAS,EAAE;MAC1D,MAAM,IAAI,KAAK,CAAC,GAAG,KAAK,CAAC,KAAK,CAAC,CAAC,gCAAgC,CAAC;IACrE;;IAEA;IACA,IAAI,KAAK,CAAC,uBAAuB,KAAK,SAAS,EAAE;MAC7C,MAAM,IAAI,KAAK,CAAC,GAAG,KAAK,CAAC,KAAK,CAAC,CAAC,wCAAwC,CAAC;IAC7E;IACA,MAAM,MAAM,GAAG,KAAK,CAAC,SAAS,CAAC,CAAC;IAChC,MAAM,IAAI,GAAG,KAAK,CAAC,OAAO,CAAC,CAAC;IAC5B,cAAc,CAAC,MAAM,CAAC;IACtB,IAAI,KAAK,CAAC,uBAAuB,IAAI,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE;MAC7C,MAAM,CAAC,IAAI,CAAC,mEAAmE,EAAE,SAAS,CAAC;MAC3F,OAAO;QAAE,KAAK,EAAE;MAAM,CAAC;IAC3B;;IAEA;IACA;IACA,IAAI,CAAC,MAAM,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE;MACzB,MAAM,IAAI,KAAK,CAAC,iCAAiC,CAAC;IACtD;IAEA,MAAM,WAAW,GAAG,KAA0B;IAE9C,IAAI,SAAS,KAAK,SAAS,EAAE;MACzB,IAAI,CAAC,mBAAmB,CAAC,GAAG,CAAC,WAAW,CAAC;MACzC;MACA,IAAI,CAAC,uBAAuB,GAAG,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,uBAAuB,EAAE,IAAI,CAAC,uBAAuB,CAAC;MAEpG,IAAI,CAAC,mBAAmB,CAAC,CAAC;MAC1B,OAAO;QAAE,KAAK,EAAE;MAAK,CAAC;IAC1B;;IAEA;IACA;IACA;IACA;IACA;IACA,MAAM,WAAW,GAAG,qBAAqB,CAAC,YAAY,CAAC,SAAS,EAAE,MAAM,CAAC;IACzE,MAAM,eAAe,GAAG,CAAC,WAAW,EAAE,IAAI,IAAI,CAAC,eAAe,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,GAAG,CAAC,WAAW,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,IAAI,CACnG,qBAAqB,CAAC,eAC1B,CAAC;IACD,IAAI,CAAC,IAAI,CAAC,eAAe,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE;MACjC,IAAI,CAAC,eAAe,CAAC,GAAG,CAAC,IAAI,EAAE,IAAI,GAAG,CAAC,CAAC,CAAC;IAC7C;IACA,IAAI,CAAC,eAAe,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,GAAG,CAAC,WAAW,EAAE,eAAe,CAAC;;IAEjE;IACA,IAAI,CAAC,uBAAuB,GAAG,IAAI,CAAC,GAAG,CAAC,WAAW,CAAC,uBAAuB,EAAE,IAAI,CAAC,uBAAuB,CAAC;IAE1G,IAAI,CAAC,mBAAmB,CAAC,CAAC;IAC1B,OAAO;MACH,KAAK,EAAE,eAAe,CAAC,CAAC,CAAC,KAAK,WAAW;MACzC,SAAS,EAAE,eAAe,GAAG,CAAC;IAClC,CAAC;EACL;;EAEA;AACJ;AACA;AACA;AACA;AACA;EACY,2BAA2B,CAAC,KAAkB,EAAQ;IAC1D,MAAM,gBAAgB,GAAG,MAAY;MACjC,IAAI,KAAK,CAAC,mBAAmB,CAAC,CAAC,EAAE;QAC7B;QACA,KAAK,CAAC,IAAI,CAAC,gBAAgB,CAAC,SAAS,EAAE,gBAAgB,CAAC;QACxD;MACJ;MACA,IAAI,CAAC,eAAe,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;IACnC,CAAC;IACD,KAAK,CAAC,IAAI,CAAC,gBAAgB,CAAC,SAAS,EAAE,gBAAgB,CAAC;EAC5D;;EAEA;AACJ;AACA;AACA;AACA;EACW,eAAe,CAAC,MAAqB,EAAQ;IAChD,MAAM,KAA0B,GAAG,EAAE;IACrC,MAAM,OAAsE,GAAG,EAAE;IACjF,KAAK,MAAM,KAAK,IAAI,MAAM,EAAE;MACxB,IAAI;QACA,MAAM,MAAM,GAAG,IAAI,CAAC,cAAc,CAAC,KAAK,CAAC;QACzC,IAAI,MAAM,CAAC,KAAK,EAAE;UACd,IAAI,MAAM,CAAC,SAAS,EAAE;YAClB;YACA,OAAO,CAAC,IAAI,CAAC;cAAE,OAAO,EAAE,KAA0B;cAAE,QAAQ,EAAE,MAAM,CAAC;YAAU,CAAC,CAAC;UACrF,CAAC,MAAM;YACH,KAAK,CAAC,IAAI,CAAC,KAA0B,CAAC;UAC1C;QACJ;MACJ,CAAC,CAAC,OAAO,EAAE,EAAE;QACT,MAAM,CAAC,IAAI,CAAC,8BAA8B,EAAE,EAAE,CAAC;MACnD;IACJ;IACA,IAAI,KAAK,CAAC,MAAM,IAAI,OAAO,CAAC,MAAM,EAAE,IAAI,CAAC,IAAI,CAAC,qBAAqB,CAAC,MAAM,EAAE,KAAK,EAAE,OAAO,EAAE,EAAE,CAAC;IAC/F,IAAI,CAAC,mBAAmB,CAAC,CAAC;EAC9B;;EAEA;AACJ;AACA;AACA;EACY,mBAAmB,GAAS;IAChC,IAAI,IAAI,CAAC,gBAAgB,EAAE;MACvB,YAAY,CAAC,IAAI,CAAC,gBAAgB,CAAC;MACnC,IAAI,CAAC,gBAAgB,GAAG,SAAS;IACrC;IACA,IAAI,IAAI,CAAC,uBAAuB,KAAK,MAAM,CAAC,gBAAgB,EAAE;MAC1D;MACA;IACJ,CAAC,CAAC;IACF,IAAI,CAAC,gBAAgB,GAAG,UAAU,CAAC,IAAI,CAAC,wBAAwB,EAAE,IAAI,CAAC,uBAAuB,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC;EAChH;EAuDA;AACJ;AACA;AACA;AACA;EACW,eAAe,CAAC,aAAmC,EAAQ;IAC9D;IACA;IACA;IACA;IACA;;IAEA;IACA;IACA;;IAEA;IACA,MAAM,aAAa,GAAG,OAAO,aAAa,KAAK,QAAQ,GAAG,aAAa,GAAG,aAAa,CAAC,KAAK,CAAC,CAAC;IAC/F,KAAK,MAAM,KAAK,IAAI,IAAI,CAAC,mBAAmB,EAAE;MAC1C,IAAI,KAAK,CAAC,KAAK,CAAC,CAAC,KAAK,aAAa,EAAE;QACjC,IAAI,CAAC,mBAAmB,CAAC,MAAM,CAAC,KAAK,CAAC;QACtC,IAAI,CAAC,IAAI,CAAC,qBAAqB,CAAC,MAAM,EAAE,EAAE,EAAE,EAAE,EAAE,CAAC,KAAK,CAAC,CAAC;QACxD;MACJ;IACJ;;IAEA;IACA,IAAI,OAAO,aAAa,KAAK,QAAQ,IAAI,CAAC,aAAa,CAAC,UAAU,CAAC,CAAC,EAAE;MAClE,MAAM,SAAS,GAAG,aAAa,CAAC,UAAU,CAAC,CAAC,CAAC,kBAAkB;MAC/D,IAAI,OAAO,SAAS,KAAK,QAAQ,IAAI,SAAS,KAAK,SAAS,EAAE;QAC1D,OAAO,CAAC;MACZ;MACA,MAAM,SAAS,GAAG,aAAa,CAAC,OAAO,CAAC,CAAC;MACzC,MAAM,MAAM,GAAG,aAAa,CAAC,SAAS,CAAC,CAAC;MACxC,cAAc,CAAC,MAAM,CAAC;MACtB,MAAM,QAAQ,GAAG,IAAI,CAAC,eAAe,CAAC,GAAG,CAAC,SAAS,CAAC;MACpD,IAAI,CAAC,QAAQ,EAAE;QACX;MACJ;MACA,MAAM,MAAM,GAAG,qBAAqB,CAAC,YAAY,CAAC,SAAS,EAAE,MAAM,CAAC;MACpE,MAAM,CAAC,YAAY,EAAE,GAAG,cAAc,CAAC,GAAG,QAAQ,CAAC,GAAG,CAAC,MAAM,CAAC,IAAI,EAAE;MACpE,IAAI,CAAC,YAAY,EAAE;QACf;QACA;MACJ;MACA,MAAM,CAAC,KAAK,CAAC,iBAAiB,aAAa,qBAAqB,SAAS,EAAE,CAAC;MAC5E;MACA,MAAM,SAAS,GAAG,cAAc,CAAC,MAAM,CAAE,CAAC,IAAK,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,qBAAqB,CAAC,eAAe,CAAC;MAC3G,IAAI,CAAC,eAAe,CAAC,GAAG,CAAC,SAAS,CAAC,EAAE,GAAG,CAAC,MAAM,EAAE,SAAS,CAAC;MAC3D,IAAI,SAAS,CAAC,MAAM,EAAE;QAClB,IAAI,CAAC,IAAI,CACL,qBAAqB,CAAC,MAAM,EAC5B,EAAE,EACF,CACI;UACI;UACA;UACA,QAAQ,EAAE,YAAY;UACtB,OAAO,EAAE,SAAS,CAAC,CAAC;QACxB,CAAC,CACJ,EACD,EACJ,CAAC;MACL,CAAC,MAAM;QACH;QACA,QAAQ,CAAC,MAAM,CAAC,MAAM,CAAC;QACvB,IAAI,QAAQ,CAAC,IAAI,KAAK,CAAC,EAAE;UACrB,IAAI,CAAC,eAAe,CAAC,MAAM,CAAC,SAAS,CAAC;QAC1C;QACA,IAAI,CAAC,IAAI,CAAC,qBAAqB,CAAC,MAAM,EAAE,EAAE,EAAE,EAAE,EAAE,CAAC,YAAY,CAAC,CAAC;MACnE;MACA;IACJ;;IAEA;IACA;IACA,KAAK,MAAM,QAAQ,IAAI,IAAI,CAAC,eAAe,CAAC,MAAM,CAAC,CAAC,EAAE;MAClD,KAAK,MAAM,CAAC,YAAY,CAAC,IAAI,QAAQ,CAAC,MAAM,CAAC,CAAC,EAAE;QAC5C,IAAI,YAAY,CAAC,KAAK,CAAC,CAAC,KAAK,aAAa,EAAE;UACxC;QACJ;QACA;QACA,OAAO,IAAI,CAAC,eAAe,CAAC,YAAY,CAAC;MAC7C;IACJ;EACJ;;EAEA;AACJ;AACA;EACW,KAAK,GAAS;IACjB,IAAI,CAAC,eAAe,CAAC,KAAK,CAAC,CAAC;IAC5B;IACA,IAAI,CAAC,uBAAuB,GAAG,MAAM,CAAC,gBAAgB;IACtD,IAAI,CAAC,mBAAmB,CAAC,CAAC;EAC9B;AACJ","ignoreList":[]}
|
|
1
|
+
{"version":3,"file":"room-sticky-events.js","names":[],"sources":["../../src/models/room-sticky-events.ts"],"sourcesContent":["import { logger as loggerInstance } from \"../logger.ts\";\nimport { type MatrixEvent, MatrixEventEvent } from \"./event.ts\";\nimport { TypedEventEmitter } from \"./typed-event-emitter.ts\";\n\nconst logger = loggerInstance.getChild(\"RoomStickyEvents\");\n\nexport enum RoomStickyEventsEvent {\n Update = \"RoomStickyEvents.Update\",\n}\n\nexport type StickyMatrixEvent = MatrixEvent & { unstableStickyExpiresAt: number };\n\nexport type RoomStickyEventsMap = {\n /**\n * Fires when any sticky event changes happen in a room.\n * @param added Any new sticky events with no predecessor events (matching sender, type, and sticky_key)\n * @param updated Any sticky events that supersede an existing event (matching sender, type, and sticky_key)\n * @param removed The events that were removed from the map due to expiry.\n */\n [RoomStickyEventsEvent.Update]: (\n added: StickyMatrixEvent[],\n updated: { current: StickyMatrixEvent; previous: StickyMatrixEvent }[],\n removed: StickyMatrixEvent[],\n ) => void;\n};\n\ntype UserId = `@${string}`;\n\nfunction assertIsUserId(value: unknown): asserts value is UserId {\n if (typeof value !== \"string\") throw new Error(\"Not a string\");\n if (!value.startsWith(\"@\")) throw new Error(\"Not a userId\");\n}\n\n/**\n * Tracks sticky events on behalf of one room, and fires an event\n * whenever a sticky event is updated or replaced.\n */\nexport class RoomStickyEventsStore extends TypedEventEmitter<RoomStickyEventsEvent, RoomStickyEventsMap> {\n /**\n * Sticky event map is a nested map of:\n * eventType -> `content.sticky_key sender` -> StickyMatrixEvent[]\n *\n * The events are ordered descendingly by expiry, tie breaking on the event ID, so that the first event\n * in the array will always be the \"current\" one.\n */\n private readonly stickyEventsMap = new Map<string, Map<string, StickyMatrixEvent[]>>();\n /**\n * These are sticky events that have no sticky key and therefore exist outside the tuple\n * system above. They are just held in this Set until they expire.\n */\n private readonly unkeyedStickyEvents = new Set<StickyMatrixEvent>();\n\n private stickyEventTimer?: ReturnType<typeof setTimeout>;\n private nextStickyEventExpiryTs: number = Number.MAX_SAFE_INTEGER;\n\n /**\n * Sort two sticky events by expiry, tie breaking on the event ID. This assumes the sticky events have the same\n * `type`, `sticky_key` and `sender`.\n * @returns A positive value if event A will expire sooner, or a negative value if event B will expire sooner.\n */\n private static sortStickyEvent(eventA: StickyMatrixEvent, eventB: StickyMatrixEvent): number {\n // First, compare by expiry (`origin_server_ts + sticky.duration_ms`).\n const expiryA = eventA.getTs() + eventA.unstableStickyInfo!.duration_ms;\n const expiryB = eventB.getTs() + eventB.unstableStickyInfo!.duration_ms;\n if (expiryB !== expiryA) {\n return expiryB - expiryA;\n }\n\n // Tie break on the highest lexicographical event ID.\n const idA = eventA.getId() ?? \"\";\n const idB = eventB.getId() ?? \"\";\n if (idB > idA) {\n return 1;\n } else if (idB < idA) {\n return -1;\n }\n\n // This should fail as we've got corruption in our sticky array.\n throw Error(\"Comparing two sticky events with the same event ID is not allowed.\");\n }\n\n /**\n * Check whether a sticky event has expired.\n * @param event The sticky event to check.\n * @param now The current time in milliseconds since the epoch.\n * @returns True if the event has expired, false otherwise.\n */\n private static isExpired(event: StickyMatrixEvent, now: number): boolean {\n return event.unstableStickyExpiresAt <= now;\n }\n\n /**\n * Generate the correct key for an event to be found in the inner maps of `stickyEventsMap`.\n * @param stickyKey The sticky key of an event.\n * @param sender The sender of the event.\n */\n private static stickyMapKey(stickyKey: string, sender: UserId): string {\n return `${stickyKey}${sender}`;\n }\n\n /**\n * Get all sticky events that are currently active.\n * @returns An iterable set of events.\n * @yields {@link StickyMatrixEvent}\n */\n public *getStickyEvents(): Iterable<StickyMatrixEvent> {\n yield* this.unkeyedStickyEvents;\n for (const innerMap of this.stickyEventsMap.values()) {\n // Inner map contains a map of sender+stickykeys => all sticky events\n for (const events of innerMap.values()) {\n // The first sticky event is the \"current\" one in the sticky map.\n yield events[0];\n }\n }\n }\n\n /**\n * Get an active sticky event that match the given `type`, `sender`, and `stickyKey`\n * @param type The event `type`.\n * @param sender The sender of the sticky event.\n * @param stickyKey The sticky key used by the event.\n * @returns A matching active sticky event, or undefined.\n */\n public getKeyedStickyEvent(sender: string, type: string, stickyKey: string): StickyMatrixEvent | undefined {\n assertIsUserId(sender);\n return this.stickyEventsMap.get(type)?.get(RoomStickyEventsStore.stickyMapKey(stickyKey, sender))?.[0];\n }\n\n /**\n * Get active sticky events without a sticky key that match the given `type` and `sender`.\n * @param type The event `type`.\n * @param sender The sender of the sticky event.\n * @returns An array of matching sticky events.\n */\n public getUnkeyedStickyEvent(sender: string, type: string): StickyMatrixEvent[] {\n return [...this.unkeyedStickyEvents].filter((ev) => ev.getType() === type && ev.getSender() === sender);\n }\n\n /**\n * Adds a sticky event into the local sticky event map.\n *\n * NOTE: This will not cause `RoomEvent.StickyEvents` to be emitted.\n *\n * @throws If the `event` does not contain valid sticky data.\n * @param event The MatrixEvent that contains sticky data.\n * @returns An object describing whether the event was added to the map,\n * and the previous event it may have replaced.\n */\n private addStickyEvent(event: MatrixEvent): { added: true; prevEvent?: StickyMatrixEvent } | { added: false } {\n // The map is keyed on the event's type and sticky key, both of which are encrypted. Wait for the\n // event to be decrypted, otherwise it would be filed under `m.room.encrypted` with no sticky key.\n if (event.isBeingDecrypted() || event.shouldAttemptDecryption() || event.isDecryptionFailure()) {\n this.addStickyEventOnceDecrypted(event);\n return { added: false };\n }\n\n const stickyKey = event.getContent().msc4354_sticky_key;\n if (typeof stickyKey !== \"string\" && stickyKey !== undefined) {\n throw new Error(`${event.getId()} is missing msc4354_sticky_key`);\n }\n\n // With this we have the guarantee, that all events in stickyEventsMap are correctly formatted\n if (event.unstableStickyExpiresAt === undefined) {\n throw new Error(`${event.getId()} is missing msc4354_sticky.duration_ms`);\n }\n const stickyEvent = event as StickyMatrixEvent;\n\n const sender = event.getSender();\n const type = event.getType();\n assertIsUserId(sender);\n if (RoomStickyEventsStore.isExpired(stickyEvent, Date.now())) {\n logger.info(\"ignored sticky event with older expiration time than current time\", stickyKey);\n return { added: false };\n }\n\n // While we fully expect the server to always provide the correct value,\n // this is just insurance to protect against attacks on our Map.\n if (!sender.startsWith(\"@\")) {\n throw new Error(\"Expected sender to start with @\");\n }\n\n if (stickyKey === undefined) {\n this.unkeyedStickyEvents.add(stickyEvent);\n // Recalculate the next expiry time.\n this.nextStickyEventExpiryTs = Math.min(event.unstableStickyExpiresAt, this.nextStickyEventExpiryTs);\n\n this.scheduleStickyTimer();\n return { added: true };\n }\n\n // Why this is safe:\n // A type may contain anything but the *sender* is tightly\n // constrained so that a key will always end with a @<user_id>\n // E.g. Where a malicious event type might be \"rtc.member.event@foo:bar\" the key becomes:\n // \"rtc.member.event.@foo:bar@bar:baz\"\n const innerMapKey = RoomStickyEventsStore.stickyMapKey(stickyKey, sender);\n const currentEventSet = [stickyEvent, ...(this.stickyEventsMap.get(type)?.get(innerMapKey) ?? [])].sort(\n RoomStickyEventsStore.sortStickyEvent,\n );\n if (!this.stickyEventsMap.has(type)) {\n this.stickyEventsMap.set(type, new Map());\n }\n this.stickyEventsMap.get(type)?.set(innerMapKey, currentEventSet);\n\n // Recalculate the next expiry time.\n this.nextStickyEventExpiryTs = Math.min(stickyEvent.unstableStickyExpiresAt, this.nextStickyEventExpiryTs);\n\n this.scheduleStickyTimer();\n return {\n added: currentEventSet[0] === stickyEvent,\n prevEvent: currentEventSet?.[1],\n };\n }\n\n /**\n * Adds the event to the map once it has been decrypted, emitting `RoomEvent.StickyEvents` at that point.\n *\n * Decryption may fail because the keys haven't arrived yet, in which case we keep waiting. An event that\n * is never decrypted simply never enters the map.\n */\n private addStickyEventOnceDecrypted(event: MatrixEvent): void {\n const onEventDecrypted = (): void => {\n if (event.isDecryptionFailure()) {\n // The event may still be decrypted later, e.g. once the keys arrive. Keep listening.\n event.once(MatrixEventEvent.Decrypted, onEventDecrypted);\n return;\n }\n this.addStickyEvents([event]); // Safe to call because it sorts events by timestamp when updating a keyed entry.\n };\n event.once(MatrixEventEvent.Decrypted, onEventDecrypted);\n }\n\n /**\n * Add a series of sticky events, emitting `RoomEvent.StickyEvents` if any\n * changes were made.\n * @param events A set of new sticky events.\n */\n public addStickyEvents(events: MatrixEvent[]): void {\n const added: StickyMatrixEvent[] = [];\n const updated: { current: StickyMatrixEvent; previous: StickyMatrixEvent }[] = [];\n for (const event of events) {\n try {\n const result = this.addStickyEvent(event);\n if (result.added) {\n if (result.prevEvent) {\n // e is validated as a StickyMatrixEvent by virtue of `addStickyEvent` returning added: true.\n updated.push({ current: event as StickyMatrixEvent, previous: result.prevEvent });\n } else {\n added.push(event as StickyMatrixEvent);\n }\n }\n } catch (ex) {\n logger.warn(\"ignored invalid sticky event\", ex);\n }\n }\n if (added.length || updated.length) this.emit(RoomStickyEventsEvent.Update, added, updated, []);\n this.scheduleStickyTimer();\n }\n\n /**\n * Schedule the sticky event expiry timer. The timer will\n * run immediately if an event has already expired.\n */\n private scheduleStickyTimer(): void {\n if (this.stickyEventTimer) {\n clearTimeout(this.stickyEventTimer);\n this.stickyEventTimer = undefined;\n }\n if (this.nextStickyEventExpiryTs === Number.MAX_SAFE_INTEGER) {\n // We have no events due to expire.\n return;\n } // otherwise, schedule in the future\n this.stickyEventTimer = setTimeout(this.cleanExpiredStickyEvents, this.nextStickyEventExpiryTs - Date.now());\n }\n\n /**\n * Clean out any expired sticky events.\n */\n private readonly cleanExpiredStickyEvents = (): void => {\n const now = Date.now();\n const removedEvents: StickyMatrixEvent[] = [];\n\n // We will recalculate this as we check all events.\n this.nextStickyEventExpiryTs = Number.MAX_SAFE_INTEGER;\n for (const [eventType, innerEvents] of this.stickyEventsMap.entries()) {\n for (const [innerMapKey, [currentEvent, ...previousEvents]] of innerEvents) {\n // we only added items with `sticky` into this map so we can assert non-null here\n if (RoomStickyEventsStore.isExpired(currentEvent, now)) {\n logger.debug(\"Expiring sticky event\", currentEvent.getId());\n removedEvents.push(currentEvent);\n this.stickyEventsMap.get(eventType)!.delete(innerMapKey);\n } else {\n // Ensure we remove any previous events which have now expired, to avoid unbounded memory consumption.\n this.stickyEventsMap\n .get(eventType)!\n .set(innerMapKey, [\n currentEvent,\n ...previousEvents.filter((e) => !RoomStickyEventsStore.isExpired(e, now)),\n ]);\n // If not removing the event, check to see if it's the next lowest expiry.\n this.nextStickyEventExpiryTs = Math.min(\n this.nextStickyEventExpiryTs,\n currentEvent.unstableStickyExpiresAt,\n );\n }\n }\n // Clean up map after use.\n if (this.stickyEventsMap.get(eventType)?.size === 0) {\n this.stickyEventsMap.delete(eventType);\n }\n }\n for (const event of this.unkeyedStickyEvents) {\n if (RoomStickyEventsStore.isExpired(event, now)) {\n logger.debug(\"Expiring sticky event\", event.getId());\n this.unkeyedStickyEvents.delete(event);\n removedEvents.push(event);\n } else {\n // If not removing the event, check to see if it's the next lowest expiry.\n this.nextStickyEventExpiryTs = Math.min(this.nextStickyEventExpiryTs, event.unstableStickyExpiresAt);\n }\n }\n if (removedEvents.length) {\n this.emit(RoomStickyEventsEvent.Update, [], [], removedEvents);\n }\n // Finally, schedule the next run.\n this.scheduleStickyTimer();\n };\n\n /**\n * Handles incoming event redactions. Checks the sticky map\n * for any active sticky events being redacted.\n * @param redactedEvent The MatrixEvent OR event ID of the event being redacted. MAY not be a sticky event.\n */\n public handleRedaction(redactedEvent: MatrixEvent | string): void {\n // Note, we do not adjust`nextStickyEventExpiryTs` here.\n // If this event happens to be the most recent expiring event\n // then we may do one extra iteration of cleanExpiredStickyEvents\n // but this saves us having to iterate over all events here to calculate\n // the next expiry time.\n\n // Note, as soon as we find a positive match on an event in this function\n // we can return. There is no need to continue iterating on a positive match\n // as an event can only appear in one map.\n\n // Handle unkeyedStickyEvents first since it's *quick*.\n const redactEventId = typeof redactedEvent === \"string\" ? redactedEvent : redactedEvent.getId();\n if (!redactEventId) {\n return;\n }\n for (const event of this.unkeyedStickyEvents) {\n if (event.getId() === redactEventId) {\n this.unkeyedStickyEvents.delete(event);\n this.emit(RoomStickyEventsEvent.Update, [], [], [event]);\n return;\n }\n }\n\n // Faster method of finding the event since we have the event cached.\n if (typeof redactedEvent !== \"string\" && !redactedEvent.isRedacted()) {\n const stickyKey = redactedEvent.getContent().msc4354_sticky_key;\n if (typeof stickyKey !== \"string\") {\n return; // Not a sticky event.\n }\n const sender = redactedEvent.getSender();\n assertIsUserId(sender);\n this.removeKeyedStickyEvent(\n redactedEvent.getType(),\n RoomStickyEventsStore.stickyMapKey(stickyKey, sender),\n redactEventId,\n );\n return;\n }\n\n // We only know the event ID of the redacted event, so we need to\n // traverse the map to find our event.\n for (const [eventType, innerMap] of this.stickyEventsMap) {\n for (const [mapKey, events] of innerMap) {\n if (events.some((e) => e.getId() === redactEventId)) {\n // Found the event.\n this.removeKeyedStickyEvent(eventType, mapKey, redactEventId);\n return;\n }\n }\n }\n }\n\n /**\n * Remove a redacted event from an entry of the keyed sticky map, emitting\n * `RoomEvent.StickyEvents` if this changes the \"current\" event of that entry.\n * @param eventType The event `type` of the redacted event.\n * @param mapKey The inner map key of the redacted event, see {@link stickyMapKey}.\n * @param redactEventId The ID of the redacted event.\n */\n private removeKeyedStickyEvent(eventType: string, mapKey: string, redactEventId: string): void {\n const innerMap = this.stickyEventsMap.get(eventType);\n const events = innerMap?.get(mapKey);\n if (!innerMap || !events) {\n return;\n }\n const index = events.findIndex((e) => e.getId() === redactEventId);\n if (index === -1) {\n // The event is not in the map so ignore.\n return;\n }\n logger.debug(`Redaction for ${redactEventId} under sticky map key ${mapKey}`);\n\n // The current event always sits at index 0.\n const currentEvent = events[0];\n const currentEventRedacted = index === 0;\n\n // Drop the redacted event and any other events that may have already been redacted before.\n const newEvents = events.filter((e) => e.getId() !== redactEventId && !e.isRedacted());\n if (newEvents.length) {\n innerMap.set(mapKey, newEvents);\n } else {\n innerMap.delete(mapKey);\n if (innerMap.size === 0) {\n this.stickyEventsMap.delete(eventType);\n }\n }\n\n // Emit an update if the current event was redacted.\n if (currentEventRedacted) {\n if (newEvents.length) {\n // The current event was redacted and most recent superseded event takes its place.\n this.emit(RoomStickyEventsEvent.Update, [], [{ previous: currentEvent, current: newEvents[0] }], []);\n } else {\n // The current event was redacted and no superseded events remain to replace it.\n this.emit(RoomStickyEventsEvent.Update, [], [], [currentEvent]);\n }\n }\n }\n\n /**\n * Clear all events and stop the timer from firing.\n */\n public clear(): void {\n this.stickyEventsMap.clear();\n // Unschedule timer.\n this.nextStickyEventExpiryTs = Number.MAX_SAFE_INTEGER;\n this.scheduleStickyTimer();\n }\n}\n"],"mappings":"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","ignoreList":[]}
|
package/lib/models/room.d.ts
CHANGED
|
@@ -853,7 +853,7 @@ export declare class Room extends ReadReceipt<RoomEmittedEvents, RoomEventHandle
|
|
|
853
853
|
/**
|
|
854
854
|
* Processes poll events:
|
|
855
855
|
* If the event has a decryption failure, it will listen for decryption and tries again.
|
|
856
|
-
* If it is a poll start event (`m.poll.start`),
|
|
856
|
+
* If it is a poll start event (`m.poll.start`) for a poll not yet known to the room,
|
|
857
857
|
* it creates and stores a Poll model and emits a PollEvent.New event.
|
|
858
858
|
* If the event is related to a poll, it will add it to the poll.
|
|
859
859
|
* Noop for other cases.
|
package/lib/models/room.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"room.d.ts","sourceRoot":"","sources":["../../src/models/room.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"room.d.ts","sourceRoot":"","sources":["../../src/models/room.ts"],"names":[],"mappings":"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"}
|
package/lib/models/room.js
CHANGED
|
@@ -1894,7 +1894,7 @@ export class Room extends ReadReceipt {
|
|
|
1894
1894
|
/**
|
|
1895
1895
|
* Processes poll events:
|
|
1896
1896
|
* If the event has a decryption failure, it will listen for decryption and tries again.
|
|
1897
|
-
* If it is a poll start event (`m.poll.start`),
|
|
1897
|
+
* If it is a poll start event (`m.poll.start`) for a poll not yet known to the room,
|
|
1898
1898
|
* it creates and stores a Poll model and emits a PollEvent.New event.
|
|
1899
1899
|
* If the event is related to a poll, it will add it to the poll.
|
|
1900
1900
|
* Noop for other cases.
|
|
@@ -1909,6 +1909,9 @@ export class Room extends ReadReceipt {
|
|
|
1909
1909
|
return;
|
|
1910
1910
|
}
|
|
1911
1911
|
if (M_POLL_START.matches(event.getType())) {
|
|
1912
|
+
// Check that we don't already have the poll as events can arrive more than once
|
|
1913
|
+
// in some situations. If we add the poll twice, it will break the existing poll model.
|
|
1914
|
+
if (this.polls.has(event.getId())) return;
|
|
1912
1915
|
try {
|
|
1913
1916
|
const poll = new Poll(event, this.client, this);
|
|
1914
1917
|
this.polls.set(event.getId(), poll);
|
|
@@ -2585,7 +2588,10 @@ export class Room extends ReadReceipt {
|
|
|
2585
2588
|
shouldLiveInThread,
|
|
2586
2589
|
threadId = ""
|
|
2587
2590
|
} = this.eventShouldLiveIn(event, neighbouringEvents, threadRoots);
|
|
2588
|
-
|
|
2591
|
+
|
|
2592
|
+
// Cached relations are aggregated below and attach when their parent is later hydrated.
|
|
2593
|
+
// Avoid blocking offline startup on a parent fetch.
|
|
2594
|
+
if (!fromCache && !shouldLiveInThread && !shouldLiveInRoom && event.isRelation()) {
|
|
2589
2595
|
try {
|
|
2590
2596
|
const parentEvent = new MatrixEvent(await this.client.fetchRoomEvent(this.roomId, event.relationEventId));
|
|
2591
2597
|
neighbouringEvents.push(parentEvent);
|