matrix-js-sdk 41.6.0 → 41.7.0-rc.2
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/lib/ReEmitter.js +1 -1
- package/lib/ReEmitter.js.map +1 -1
- package/lib/ToDeviceMessageQueue.js +2 -2
- package/lib/ToDeviceMessageQueue.js.map +1 -1
- package/lib/autodiscovery.js +1 -0
- package/lib/autodiscovery.js.map +1 -1
- package/lib/client.d.ts.map +1 -1
- package/lib/client.js +77 -3
- package/lib/client.js.map +1 -1
- package/lib/common-crypto/CryptoBackend.js +2 -0
- package/lib/common-crypto/CryptoBackend.js.map +1 -1
- package/lib/crypto/store/indexeddb-crypto-store-backend.js +1 -1
- package/lib/crypto/store/indexeddb-crypto-store-backend.js.map +1 -1
- package/lib/crypto/store/indexeddb-crypto-store.js +2 -0
- package/lib/crypto/store/indexeddb-crypto-store.js.map +1 -1
- package/lib/crypto-api/index.js +58 -58
- package/lib/crypto-api/index.js.map +1 -1
- package/lib/embedded.js +13 -9
- package/lib/embedded.js.map +1 -1
- package/lib/extensible_events_v1/MessageEvent.js +15 -15
- package/lib/extensible_events_v1/MessageEvent.js.map +1 -1
- package/lib/extensible_events_v1/PollEndEvent.js +8 -8
- package/lib/extensible_events_v1/PollEndEvent.js.map +1 -1
- package/lib/extensible_events_v1/PollResponseEvent.js +1 -0
- package/lib/extensible_events_v1/PollResponseEvent.js.map +1 -1
- package/lib/extensible_events_v1/PollStartEvent.js +28 -28
- package/lib/extensible_events_v1/PollStartEvent.js.map +1 -1
- package/lib/filter.js +3 -1
- package/lib/filter.js.map +1 -1
- package/lib/http-api/errors.js +16 -16
- package/lib/http-api/errors.js.map +1 -1
- package/lib/http-api/fetch.js +2 -1
- package/lib/http-api/fetch.js.map +1 -1
- package/lib/http-api/refresh.js +7 -6
- package/lib/http-api/refresh.js.map +1 -1
- package/lib/http-api/utils.d.ts.map +1 -1
- package/lib/http-api/utils.js +1 -5
- package/lib/http-api/utils.js.map +1 -1
- package/lib/interactive-auth.js +11 -1
- package/lib/interactive-auth.js.map +1 -1
- package/lib/logger.js +2 -0
- package/lib/logger.js.map +1 -1
- package/lib/matrixrtc/CallMembership.js +6 -5
- package/lib/matrixrtc/CallMembership.js.map +1 -1
- package/lib/matrixrtc/MatrixRTCSession.d.ts.map +1 -1
- package/lib/matrixrtc/MatrixRTCSession.js +15 -5
- package/lib/matrixrtc/MatrixRTCSession.js.map +1 -1
- package/lib/matrixrtc/MatrixRTCSessionManager.js +3 -2
- package/lib/matrixrtc/MatrixRTCSessionManager.js.map +1 -1
- package/lib/matrixrtc/MembershipManager.js +24 -17
- package/lib/matrixrtc/MembershipManager.js.map +1 -1
- package/lib/matrixrtc/MembershipManagerActionScheduler.js +2 -1
- package/lib/matrixrtc/MembershipManagerActionScheduler.js.map +1 -1
- package/lib/matrixrtc/RTCEncryptionManager.js +6 -4
- package/lib/matrixrtc/RTCEncryptionManager.js.map +1 -1
- package/lib/matrixrtc/ToDeviceKeyTransport.js +4 -4
- package/lib/matrixrtc/ToDeviceKeyTransport.js.map +1 -1
- package/lib/models/MSC3089TreeSpace.js +2 -1
- package/lib/models/MSC3089TreeSpace.js.map +1 -1
- package/lib/models/beacon.js +8 -4
- package/lib/models/beacon.js.map +1 -1
- package/lib/models/device.js +7 -0
- package/lib/models/device.js.map +1 -1
- package/lib/models/event-context.js +2 -1
- package/lib/models/event-context.js.map +1 -1
- package/lib/models/event-timeline-set.js +7 -1
- package/lib/models/event-timeline-set.js.map +1 -1
- package/lib/models/event-timeline.js +5 -1
- package/lib/models/event-timeline.js.map +1 -1
- package/lib/models/event.js +35 -11
- package/lib/models/event.js.map +1 -1
- package/lib/models/poll.js +7 -3
- package/lib/models/poll.js.map +1 -1
- package/lib/models/related-relations.js +2 -0
- package/lib/models/related-relations.js.map +1 -1
- package/lib/models/relations-container.js +2 -2
- package/lib/models/relations-container.js.map +1 -1
- package/lib/models/relations.js +4 -3
- package/lib/models/relations.js.map +1 -1
- package/lib/models/room-member.js +24 -2
- package/lib/models/room-member.js.map +1 -1
- package/lib/models/room-receipts.js +19 -12
- package/lib/models/room-receipts.js.map +1 -1
- package/lib/models/room-state.js +2 -2
- package/lib/models/room-state.js.map +1 -1
- package/lib/models/room-sticky-events.js +1 -0
- package/lib/models/room-sticky-events.js.map +1 -1
- package/lib/models/room.js +35 -4
- package/lib/models/room.js.map +1 -1
- package/lib/models/thread.js +46 -2
- package/lib/models/thread.js.map +1 -1
- package/lib/models/user.js +20 -1
- package/lib/models/user.js.map +1 -1
- package/lib/oidc/tokenRefresher.js +11 -8
- package/lib/oidc/tokenRefresher.js.map +1 -1
- package/lib/pushprocessor.js +1 -1
- package/lib/pushprocessor.js.map +1 -1
- package/lib/rendezvous/MSC4108SignInWithQR.js +6 -1
- package/lib/rendezvous/MSC4108SignInWithQR.js.map +1 -1
- package/lib/rendezvous/channels/MSC4108SecureChannel.js +3 -1
- package/lib/rendezvous/channels/MSC4108SecureChannel.js.map +1 -1
- package/lib/rendezvous/transports/MSC4108RendezvousSession.js +8 -0
- package/lib/rendezvous/transports/MSC4108RendezvousSession.js.map +1 -1
- package/lib/room-hierarchy.js +8 -4
- package/lib/room-hierarchy.js.map +1 -1
- package/lib/rust-crypto/DehydratedDeviceManager.js +3 -2
- package/lib/rust-crypto/DehydratedDeviceManager.js.map +1 -1
- package/lib/rust-crypto/KeyClaimManager.js +2 -1
- package/lib/rust-crypto/KeyClaimManager.js.map +1 -1
- package/lib/rust-crypto/OutgoingRequestsManager.js +12 -12
- package/lib/rust-crypto/OutgoingRequestsManager.js.map +1 -1
- package/lib/rust-crypto/PerSessionKeyBackupDownloader.js +5 -3
- package/lib/rust-crypto/PerSessionKeyBackupDownloader.js.map +1 -1
- package/lib/rust-crypto/RoomEncryptor.js +6 -6
- package/lib/rust-crypto/RoomEncryptor.js.map +1 -1
- package/lib/rust-crypto/backup.js +6 -4
- package/lib/rust-crypto/backup.js.map +1 -1
- package/lib/rust-crypto/rust-crypto.js +18 -10
- package/lib/rust-crypto/rust-crypto.js.map +1 -1
- package/lib/rust-crypto/verification.js +9 -7
- package/lib/rust-crypto/verification.js.map +1 -1
- package/lib/scheduler.js +2 -2
- package/lib/scheduler.js.map +1 -1
- package/lib/serverCapabilities.js +5 -2
- package/lib/serverCapabilities.js.map +1 -1
- package/lib/sliding-sync-sdk.js +6 -3
- package/lib/sliding-sync-sdk.js.map +1 -1
- package/lib/sliding-sync.js +9 -4
- package/lib/sliding-sync.js.map +1 -1
- package/lib/store/indexeddb-local-backend.js +5 -1
- package/lib/store/indexeddb-local-backend.js.map +1 -1
- package/lib/store/indexeddb-remote-backend.js +7 -6
- package/lib/store/indexeddb-remote-backend.js.map +1 -1
- package/lib/store/indexeddb-store-worker.js +2 -1
- package/lib/store/indexeddb-store-worker.js.map +1 -1
- package/lib/store/indexeddb.js +1 -0
- package/lib/store/indexeddb.js.map +1 -1
- package/lib/store/memory.js +4 -0
- package/lib/store/memory.js.map +1 -1
- package/lib/sync-accumulator.js +1 -1
- package/lib/sync-accumulator.js.map +1 -1
- package/lib/sync.d.ts.map +1 -1
- package/lib/sync.js +32 -16
- package/lib/sync.js.map +1 -1
- package/lib/timeline-window.js +6 -2
- package/lib/timeline-window.js.map +1 -1
- package/lib/webrtc/call.js +42 -6
- package/lib/webrtc/call.js.map +1 -1
- package/lib/webrtc/callEventHandler.js +5 -0
- package/lib/webrtc/callEventHandler.js.map +1 -1
- package/lib/webrtc/callFeed.js +15 -0
- package/lib/webrtc/callFeed.js.map +1 -1
- package/lib/webrtc/groupCall.js +24 -8
- package/lib/webrtc/groupCall.js.map +1 -1
- package/lib/webrtc/groupCallEventHandler.js +1 -1
- package/lib/webrtc/groupCallEventHandler.js.map +1 -1
- package/lib/webrtc/mediaHandler.js +7 -3
- package/lib/webrtc/mediaHandler.js.map +1 -1
- package/lib/webrtc/stats/callStatsReportGatherer.js +5 -2
- package/lib/webrtc/stats/callStatsReportGatherer.js.map +1 -1
- package/lib/webrtc/stats/groupCallStats.js +4 -3
- package/lib/webrtc/stats/groupCallStats.js.map +1 -1
- package/lib/webrtc/stats/media/mediaTrackStats.js +3 -3
- package/lib/webrtc/stats/media/mediaTrackStats.js.map +1 -1
- package/lib/webrtc/stats/media/mediaTrackStatsHandler.js +1 -1
- package/lib/webrtc/stats/media/mediaTrackStatsHandler.js.map +1 -1
- package/package.json +125 -138
- package/src/client.ts +4 -1
- package/src/http-api/utils.ts +4 -9
- package/src/matrixrtc/MatrixRTCSession.ts +4 -3
- package/src/sync.ts +5 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"room-sticky-events.js","names":["logger","loggerInstance","TypedEventEmitter","getChild","RoomStickyEventsEvent","assertIsUserId","value","Error","startsWith","RoomStickyEventsStore","constructor","arguments","_defineProperty","Map","Set","Number","MAX_SAFE_INTEGER","now","Date","removedEvents","nextStickyEventExpiryTs","_ref3","stickyEventsMap","entries","_this$stickyEventsMap","_ref2","_slicedToArray","eventType","innerEvents","_ref6","_ref5","innerMapKey","_ref5$","_toArray","currentEvent","previousEvents","_arrayLikeToArray","slice","unstableStickyExpiresAt","debug","getId","push","get","delete","set","filter","e","Math","min","size","event","unkeyedStickyEvents","length","emit","Update","scheduleStickyTimer","sortStickyEvent","eventA","eventB","_eventB$getId","_eventA$getId","getTs","stickyMapKey","stickyKey","sender","concat","getStickyEvents","innerMap","values","events","getKeyedStickyEvent","type","_this$stickyEventsMap2","getUnkeyedStickyEvent","ev","getType","getSender","addStickyEvent","_this$stickyEventsMap3","_this$stickyEventsMap4","_this$stickyEventsMap5","getContent","msc4354_sticky_key","undefined","info","added","stickyEvent","add","currentEventSet","sort","has","prevEvent","addStickyEvents","updated","result","current","previous","ex","warn","stickyEventTimer","clearTimeout","setTimeout","cleanExpiredStickyEvents","handleRedaction","redactedEvent","redactEventId","isRedacted","_innerMap$get","_this$stickyEventsMap6","mapKey","_ref7","_ref8","newEvents","_ref1","_ref0","clear"],"sources":["../../src/models/room-sticky-events.ts"],"sourcesContent":["import { logger as loggerInstance } from \"../logger.ts\";\nimport { type MatrixEvent } 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 */\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 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 * 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":"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","ignoreList":[]}
|
|
1
|
+
{"version":3,"file":"room-sticky-events.js","names":["logger","loggerInstance","TypedEventEmitter","getChild","RoomStickyEventsEvent","assertIsUserId","value","Error","startsWith","RoomStickyEventsStore","constructor","arguments","_defineProperty","Map","Set","Number","MAX_SAFE_INTEGER","now","Date","removedEvents","nextStickyEventExpiryTs","_ref3","stickyEventsMap","entries","_this$stickyEventsMap","_ref2","_slicedToArray","eventType","innerEvents","_ref6","_ref5","innerMapKey","_ref5$","_toArray","currentEvent","previousEvents","_arrayLikeToArray","slice","unstableStickyExpiresAt","debug","getId","push","get","delete","set","filter","e","Math","min","size","event","unkeyedStickyEvents","length","emit","Update","scheduleStickyTimer","sortStickyEvent","eventA","eventB","_eventB$getId","_eventA$getId","getTs","stickyMapKey","stickyKey","sender","concat","getStickyEvents","innerMap","values","events","getKeyedStickyEvent","type","_this$stickyEventsMap2","getUnkeyedStickyEvent","ev","getType","getSender","addStickyEvent","_this$stickyEventsMap3","_this$stickyEventsMap4","_this$stickyEventsMap5","getContent","msc4354_sticky_key","undefined","info","added","stickyEvent","add","currentEventSet","sort","has","prevEvent","addStickyEvents","updated","result","current","previous","ex","warn","stickyEventTimer","clearTimeout","setTimeout","cleanExpiredStickyEvents","handleRedaction","redactedEvent","redactEventId","isRedacted","_innerMap$get","_this$stickyEventsMap6","mapKey","_ref7","_ref8","newEvents","_ref1","_ref0","clear"],"sources":["../../src/models/room-sticky-events.ts"],"sourcesContent":["import { logger as loggerInstance } from \"../logger.ts\";\nimport { type MatrixEvent } 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 */\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 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 * 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":"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","ignoreList":[]}
|
package/lib/models/room.js
CHANGED
|
@@ -125,6 +125,11 @@ export class Room extends ReadReceipt {
|
|
|
125
125
|
// common to have quite a few more than the default limit.
|
|
126
126
|
super();
|
|
127
127
|
_this = this;
|
|
128
|
+
this.roomId = roomId;
|
|
129
|
+
this.client = client;
|
|
130
|
+
this.myUserId = myUserId;
|
|
131
|
+
this.opts = opts;
|
|
132
|
+
_defineProperty(this, "reEmitter", void 0);
|
|
128
133
|
_defineProperty(this, "txnToEvent", new Map());
|
|
129
134
|
// Pending in-flight requests { string: MatrixEvent }
|
|
130
135
|
_defineProperty(this, "notificationCounts", {});
|
|
@@ -138,6 +143,7 @@ export class Room extends ReadReceipt {
|
|
|
138
143
|
* This is useful in determining whether a user has read a thread or not
|
|
139
144
|
*/
|
|
140
145
|
_defineProperty(this, "unthreadedReceipts", new Map());
|
|
146
|
+
_defineProperty(this, "timelineSets", void 0);
|
|
141
147
|
_defineProperty(this, "polls", new Map());
|
|
142
148
|
/**
|
|
143
149
|
* Empty array if the timeline sets have not been initialised. After initialisation:
|
|
@@ -149,6 +155,10 @@ export class Room extends ReadReceipt {
|
|
|
149
155
|
_defineProperty(this, "filteredTimelineSets", {});
|
|
150
156
|
// filter_id: timelineSet
|
|
151
157
|
_defineProperty(this, "timelineNeedsRefresh", false);
|
|
158
|
+
_defineProperty(this, "pendingEventList", void 0);
|
|
159
|
+
// read by megolm via getter; boolean value - null indicates "use global value"
|
|
160
|
+
_defineProperty(this, "blacklistUnverifiedDevices", void 0);
|
|
161
|
+
_defineProperty(this, "selfMembership", void 0);
|
|
152
162
|
/**
|
|
153
163
|
* A `Hero` is a stripped `m.room.member` event which contains the important renderable fields from the event.
|
|
154
164
|
*
|
|
@@ -161,6 +171,16 @@ export class Room extends ReadReceipt {
|
|
|
161
171
|
_defineProperty(this, "heroes", null);
|
|
162
172
|
// flags to stop logspam about missing m.room.create events
|
|
163
173
|
_defineProperty(this, "getTypeWarning", false);
|
|
174
|
+
_defineProperty(this, "membersPromise", void 0);
|
|
175
|
+
// XXX: These should be read-only
|
|
176
|
+
/**
|
|
177
|
+
* The human-readable display name for this room.
|
|
178
|
+
*/
|
|
179
|
+
_defineProperty(this, "name", void 0);
|
|
180
|
+
/**
|
|
181
|
+
* The un-homoglyphed name for this room.
|
|
182
|
+
*/
|
|
183
|
+
_defineProperty(this, "normalizedName", void 0);
|
|
164
184
|
/**
|
|
165
185
|
* Dict of room tags; the keys are the tag name and the values
|
|
166
186
|
* are any metadata associated with the tag - e.g. `{ "fav" : { order: 1 } }`
|
|
@@ -177,6 +197,21 @@ export class Room extends ReadReceipt {
|
|
|
177
197
|
* The room summary.
|
|
178
198
|
*/
|
|
179
199
|
_defineProperty(this, "summary", null);
|
|
200
|
+
/**
|
|
201
|
+
* oldState The state of the room at the time of the oldest event in the live timeline.
|
|
202
|
+
*
|
|
203
|
+
* @deprecated Present for backwards compatibility.
|
|
204
|
+
* Use getLiveTimeline().getState(EventTimeline.BACKWARDS) instead
|
|
205
|
+
*/
|
|
206
|
+
_defineProperty(this, "oldState", void 0);
|
|
207
|
+
/**
|
|
208
|
+
* currentState The state of the room at the time of the newest event in the timeline.
|
|
209
|
+
*
|
|
210
|
+
* @deprecated Present for backwards compatibility.
|
|
211
|
+
* Use getLiveTimeline().getState(EventTimeline.FORWARDS) instead.
|
|
212
|
+
*/
|
|
213
|
+
_defineProperty(this, "currentState", void 0);
|
|
214
|
+
_defineProperty(this, "relations", void 0);
|
|
180
215
|
/**
|
|
181
216
|
* A collection of events known by the client
|
|
182
217
|
* This is not a comprehensive list of the threads that exist in this room
|
|
@@ -294,10 +329,6 @@ export class Room extends ReadReceipt {
|
|
|
294
329
|
}
|
|
295
330
|
}
|
|
296
331
|
});
|
|
297
|
-
this.roomId = roomId;
|
|
298
|
-
this.client = client;
|
|
299
|
-
this.myUserId = myUserId;
|
|
300
|
-
this.opts = opts;
|
|
301
332
|
this.setMaxListeners(100);
|
|
302
333
|
this.reEmitter = new TypedReEmitter(this);
|
|
303
334
|
opts.pendingEventOrdering = opts.pendingEventOrdering || PendingEventOrdering.Chronological;
|