matrix-js-sdk 28.1.0 → 28.2.0-rc.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (287) hide show
  1. package/CHANGELOG.md +17 -1
  2. package/dist/browser-matrix.js +1458 -391
  3. package/dist/browser-matrix.js.map +32 -22
  4. package/dist/browser-matrix.min.js +5 -5
  5. package/dist/browser-matrix.min.js.map +1 -1
  6. package/git-revision.txt +1 -1
  7. package/lib/ReEmitter.js +1 -1
  8. package/lib/ReEmitter.js.map +1 -1
  9. package/lib/ToDeviceMessageQueue.js +1 -1
  10. package/lib/ToDeviceMessageQueue.js.map +1 -1
  11. package/lib/autodiscovery.js +17 -18
  12. package/lib/autodiscovery.js.map +1 -1
  13. package/lib/client.d.ts +14 -0
  14. package/lib/client.d.ts.map +1 -1
  15. package/lib/client.js +59 -85
  16. package/lib/client.js.map +1 -1
  17. package/lib/common-crypto/CryptoBackend.d.ts +41 -0
  18. package/lib/common-crypto/CryptoBackend.d.ts.map +1 -1
  19. package/lib/common-crypto/CryptoBackend.js.map +1 -1
  20. package/lib/common-crypto/base64.d.ts +22 -0
  21. package/lib/common-crypto/base64.d.ts.map +1 -0
  22. package/lib/common-crypto/base64.js +55 -0
  23. package/lib/common-crypto/base64.js.map +1 -0
  24. package/lib/content-helpers.js +16 -16
  25. package/lib/content-helpers.js.map +1 -1
  26. package/lib/crypto/CrossSigning.js +3 -3
  27. package/lib/crypto/CrossSigning.js.map +1 -1
  28. package/lib/crypto/DeviceList.js +11 -14
  29. package/lib/crypto/DeviceList.js.map +1 -1
  30. package/lib/crypto/EncryptionSetup.js +3 -10
  31. package/lib/crypto/EncryptionSetup.js.map +1 -1
  32. package/lib/crypto/OlmDevice.js +1 -1
  33. package/lib/crypto/OlmDevice.js.map +1 -1
  34. package/lib/crypto/OutgoingRoomKeyRequestManager.js +19 -20
  35. package/lib/crypto/OutgoingRoomKeyRequestManager.js.map +1 -1
  36. package/lib/crypto/RoomList.js +1 -1
  37. package/lib/crypto/RoomList.js.map +1 -1
  38. package/lib/crypto/SecretSharing.js +1 -1
  39. package/lib/crypto/SecretSharing.js.map +1 -1
  40. package/lib/crypto/SecretStorage.js +0 -4
  41. package/lib/crypto/SecretStorage.js.map +1 -1
  42. package/lib/crypto/algorithms/base.js +0 -14
  43. package/lib/crypto/algorithms/base.js.map +1 -1
  44. package/lib/crypto/algorithms/megolm.js +22 -31
  45. package/lib/crypto/algorithms/megolm.js.map +1 -1
  46. package/lib/crypto/backup.d.ts +17 -0
  47. package/lib/crypto/backup.d.ts.map +1 -1
  48. package/lib/crypto/backup.js +29 -8
  49. package/lib/crypto/backup.js.map +1 -1
  50. package/lib/crypto/dehydration.js +1 -5
  51. package/lib/crypto/dehydration.js.map +1 -1
  52. package/lib/crypto/deviceinfo.js +1 -1
  53. package/lib/crypto/deviceinfo.js.map +1 -1
  54. package/lib/crypto/index.d.ts +10 -2
  55. package/lib/crypto/index.d.ts.map +1 -1
  56. package/lib/crypto/index.js +133 -68
  57. package/lib/crypto/index.js.map +1 -1
  58. package/lib/crypto/keybackup.d.ts +1 -16
  59. package/lib/crypto/keybackup.d.ts.map +1 -1
  60. package/lib/crypto/keybackup.js.map +1 -1
  61. package/lib/crypto/olmlib.js +21 -21
  62. package/lib/crypto/olmlib.js.map +1 -1
  63. package/lib/crypto/recoverykey.d.ts.map +1 -1
  64. package/lib/crypto/recoverykey.js +3 -2
  65. package/lib/crypto/recoverykey.js.map +1 -1
  66. package/lib/crypto/store/indexeddb-crypto-store-backend.js +1 -1
  67. package/lib/crypto/store/indexeddb-crypto-store-backend.js.map +1 -1
  68. package/lib/crypto/store/indexeddb-crypto-store.js +0 -2
  69. package/lib/crypto/store/indexeddb-crypto-store.js.map +1 -1
  70. package/lib/crypto/store/memory-crypto-store.js +16 -16
  71. package/lib/crypto/store/memory-crypto-store.js.map +1 -1
  72. package/lib/crypto/verification/Base.js +6 -13
  73. package/lib/crypto/verification/Base.js.map +1 -1
  74. package/lib/crypto/verification/QRCode.js +0 -1
  75. package/lib/crypto/verification/QRCode.js.map +1 -1
  76. package/lib/crypto/verification/SAS.js +0 -4
  77. package/lib/crypto/verification/SAS.js.map +1 -1
  78. package/lib/crypto/verification/request/InRoomChannel.js +0 -1
  79. package/lib/crypto/verification/request/InRoomChannel.js.map +1 -1
  80. package/lib/crypto/verification/request/ToDeviceChannel.js +0 -1
  81. package/lib/crypto/verification/request/ToDeviceChannel.js.map +1 -1
  82. package/lib/crypto/verification/request/VerificationRequest.js +5 -7
  83. package/lib/crypto/verification/request/VerificationRequest.js.map +1 -1
  84. package/lib/crypto-api/keybackup.d.ts +15 -0
  85. package/lib/crypto-api/keybackup.d.ts.map +1 -1
  86. package/lib/crypto-api/keybackup.js.map +1 -1
  87. package/lib/crypto-api.d.ts +53 -0
  88. package/lib/crypto-api.d.ts.map +1 -1
  89. package/lib/crypto-api.js +55 -29
  90. package/lib/crypto-api.js.map +1 -1
  91. package/lib/embedded.d.ts +2 -1
  92. package/lib/embedded.d.ts.map +1 -1
  93. package/lib/embedded.js +29 -14
  94. package/lib/embedded.js.map +1 -1
  95. package/lib/event-mapper.js +17 -17
  96. package/lib/event-mapper.js.map +1 -1
  97. package/lib/extensible_events_v1/MessageEvent.js +31 -31
  98. package/lib/extensible_events_v1/MessageEvent.js.map +1 -1
  99. package/lib/extensible_events_v1/PollEndEvent.js +24 -24
  100. package/lib/extensible_events_v1/PollEndEvent.js.map +1 -1
  101. package/lib/extensible_events_v1/PollResponseEvent.js +0 -1
  102. package/lib/extensible_events_v1/PollResponseEvent.js.map +1 -1
  103. package/lib/extensible_events_v1/PollStartEvent.js +44 -44
  104. package/lib/extensible_events_v1/PollStartEvent.js.map +1 -1
  105. package/lib/filter.js +17 -19
  106. package/lib/filter.js.map +1 -1
  107. package/lib/http-api/errors.js +4 -6
  108. package/lib/http-api/errors.js.map +1 -1
  109. package/lib/http-api/fetch.js +1 -1
  110. package/lib/http-api/fetch.js.map +1 -1
  111. package/lib/http-api/index.js +1 -1
  112. package/lib/http-api/index.js.map +1 -1
  113. package/lib/interactive-auth.js +6 -16
  114. package/lib/interactive-auth.js.map +1 -1
  115. package/lib/matrixrtc/CallMembership.d.ts +31 -0
  116. package/lib/matrixrtc/CallMembership.d.ts.map +1 -0
  117. package/lib/matrixrtc/CallMembership.js +80 -0
  118. package/lib/matrixrtc/CallMembership.js.map +1 -0
  119. package/lib/matrixrtc/MatrixRTCSession.d.ts +81 -0
  120. package/lib/matrixrtc/MatrixRTCSession.d.ts.map +1 -0
  121. package/lib/matrixrtc/MatrixRTCSession.js +345 -0
  122. package/lib/matrixrtc/MatrixRTCSession.js.map +1 -0
  123. package/lib/matrixrtc/MatrixRTCSessionManager.d.ts +38 -0
  124. package/lib/matrixrtc/MatrixRTCSessionManager.d.ts.map +1 -0
  125. package/lib/matrixrtc/MatrixRTCSessionManager.js +116 -0
  126. package/lib/matrixrtc/MatrixRTCSessionManager.js.map +1 -0
  127. package/lib/matrixrtc/focus.d.ts +9 -0
  128. package/lib/matrixrtc/focus.d.ts.map +1 -0
  129. package/lib/matrixrtc/focus.js +6 -0
  130. package/lib/matrixrtc/focus.js.map +1 -0
  131. package/lib/models/MSC3089Branch.js +16 -16
  132. package/lib/models/MSC3089Branch.js.map +1 -1
  133. package/lib/models/MSC3089TreeSpace.js +16 -17
  134. package/lib/models/MSC3089TreeSpace.js.map +1 -1
  135. package/lib/models/beacon.js +3 -8
  136. package/lib/models/beacon.js.map +1 -1
  137. package/lib/models/device.js +14 -16
  138. package/lib/models/device.js.map +1 -1
  139. package/lib/models/event-context.js +1 -2
  140. package/lib/models/event-context.js.map +1 -1
  141. package/lib/models/event-timeline-set.js +1 -7
  142. package/lib/models/event-timeline-set.js.map +1 -1
  143. package/lib/models/event-timeline.js +4 -8
  144. package/lib/models/event-timeline.js.map +1 -1
  145. package/lib/models/event.d.ts +1 -1
  146. package/lib/models/event.js +7 -25
  147. package/lib/models/event.js.map +1 -1
  148. package/lib/models/poll.js +4 -8
  149. package/lib/models/poll.js.map +1 -1
  150. package/lib/models/read-receipt.js +0 -1
  151. package/lib/models/read-receipt.js.map +1 -1
  152. package/lib/models/related-relations.js +0 -3
  153. package/lib/models/related-relations.js.map +1 -1
  154. package/lib/models/relations-container.js +2 -2
  155. package/lib/models/relations-container.js.map +1 -1
  156. package/lib/models/relations.js +3 -4
  157. package/lib/models/relations.js.map +1 -1
  158. package/lib/models/room-member.js +2 -20
  159. package/lib/models/room-member.js.map +1 -1
  160. package/lib/models/room-state.js +3 -3
  161. package/lib/models/room-state.js.map +1 -1
  162. package/lib/models/room.d.ts +1 -1
  163. package/lib/models/room.d.ts.map +1 -1
  164. package/lib/models/room.js +40 -76
  165. package/lib/models/room.js.map +1 -1
  166. package/lib/models/thread.js +21 -32
  167. package/lib/models/thread.js.map +1 -1
  168. package/lib/models/user.js +1 -20
  169. package/lib/models/user.js.map +1 -1
  170. package/lib/oidc/authorize.js +16 -16
  171. package/lib/oidc/authorize.js.map +1 -1
  172. package/lib/oidc/discovery.js +16 -16
  173. package/lib/oidc/discovery.js.map +1 -1
  174. package/lib/pushprocessor.js +17 -17
  175. package/lib/pushprocessor.js.map +1 -1
  176. package/lib/receipt-accumulator.js +1 -1
  177. package/lib/receipt-accumulator.js.map +1 -1
  178. package/lib/rendezvous/MSC3906Rendezvous.js +2 -5
  179. package/lib/rendezvous/MSC3906Rendezvous.js.map +1 -1
  180. package/lib/rendezvous/channels/MSC3903ECDHv2RendezvousChannel.js +1 -4
  181. package/lib/rendezvous/channels/MSC3903ECDHv2RendezvousChannel.js.map +1 -1
  182. package/lib/rendezvous/transports/MSC3886SimpleHttpRendezvousTransport.js +1 -8
  183. package/lib/rendezvous/transports/MSC3886SimpleHttpRendezvousTransport.js.map +1 -1
  184. package/lib/room-hierarchy.js +4 -8
  185. package/lib/room-hierarchy.js.map +1 -1
  186. package/lib/rust-crypto/CrossSigningIdentity.d.ts +1 -5
  187. package/lib/rust-crypto/CrossSigningIdentity.d.ts.map +1 -1
  188. package/lib/rust-crypto/CrossSigningIdentity.js +1 -4
  189. package/lib/rust-crypto/CrossSigningIdentity.js.map +1 -1
  190. package/lib/rust-crypto/KeyClaimManager.js +1 -2
  191. package/lib/rust-crypto/KeyClaimManager.js.map +1 -1
  192. package/lib/rust-crypto/OutgoingRequestProcessor.js +16 -16
  193. package/lib/rust-crypto/OutgoingRequestProcessor.js.map +1 -1
  194. package/lib/rust-crypto/RoomEncryptor.js +0 -3
  195. package/lib/rust-crypto/RoomEncryptor.js.map +1 -1
  196. package/lib/rust-crypto/backup.d.ts +20 -2
  197. package/lib/rust-crypto/backup.d.ts.map +1 -1
  198. package/lib/rust-crypto/backup.js +39 -4
  199. package/lib/rust-crypto/backup.js.map +1 -1
  200. package/lib/rust-crypto/index.d.ts.map +1 -1
  201. package/lib/rust-crypto/index.js +1 -0
  202. package/lib/rust-crypto/index.js.map +1 -1
  203. package/lib/rust-crypto/rust-crypto.d.ts +39 -3
  204. package/lib/rust-crypto/rust-crypto.d.ts.map +1 -1
  205. package/lib/rust-crypto/rust-crypto.js +260 -61
  206. package/lib/rust-crypto/rust-crypto.js.map +1 -1
  207. package/lib/rust-crypto/verification.js +5 -7
  208. package/lib/rust-crypto/verification.js.map +1 -1
  209. package/lib/scheduler.js +2 -2
  210. package/lib/scheduler.js.map +1 -1
  211. package/lib/sliding-sync-sdk.js +4 -7
  212. package/lib/sliding-sync-sdk.js.map +1 -1
  213. package/lib/sliding-sync.js +23 -28
  214. package/lib/sliding-sync.js.map +1 -1
  215. package/lib/store/indexeddb-local-backend.js +6 -10
  216. package/lib/store/indexeddb-local-backend.js.map +1 -1
  217. package/lib/store/indexeddb-remote-backend.js +8 -11
  218. package/lib/store/indexeddb-remote-backend.js.map +1 -1
  219. package/lib/store/indexeddb-store-worker.js +1 -2
  220. package/lib/store/indexeddb-store-worker.js.map +1 -1
  221. package/lib/store/indexeddb.js +0 -1
  222. package/lib/store/indexeddb.js.map +1 -1
  223. package/lib/store/memory.js +0 -3
  224. package/lib/store/memory.js.map +1 -1
  225. package/lib/sync-accumulator.d.ts +11 -1
  226. package/lib/sync-accumulator.d.ts.map +1 -1
  227. package/lib/sync-accumulator.js +55 -4
  228. package/lib/sync-accumulator.js.map +1 -1
  229. package/lib/sync.d.ts.map +1 -1
  230. package/lib/sync.js +53 -39
  231. package/lib/sync.js.map +1 -1
  232. package/lib/timeline-window.js +2 -6
  233. package/lib/timeline-window.js.map +1 -1
  234. package/lib/utils.js +18 -18
  235. package/lib/utils.js.map +1 -1
  236. package/lib/webrtc/audioContext.js +1 -1
  237. package/lib/webrtc/audioContext.js.map +1 -1
  238. package/lib/webrtc/call.js +35 -73
  239. package/lib/webrtc/call.js.map +1 -1
  240. package/lib/webrtc/callEventHandler.js +1 -6
  241. package/lib/webrtc/callEventHandler.js.map +1 -1
  242. package/lib/webrtc/callFeed.js +2 -17
  243. package/lib/webrtc/callFeed.js.map +1 -1
  244. package/lib/webrtc/groupCall.d.ts +7 -1
  245. package/lib/webrtc/groupCall.d.ts.map +1 -1
  246. package/lib/webrtc/groupCall.js +47 -33
  247. package/lib/webrtc/groupCall.js.map +1 -1
  248. package/lib/webrtc/groupCallEventHandler.d.ts.map +1 -1
  249. package/lib/webrtc/groupCallEventHandler.js +3 -2
  250. package/lib/webrtc/groupCallEventHandler.js.map +1 -1
  251. package/lib/webrtc/mediaHandler.js +3 -7
  252. package/lib/webrtc/mediaHandler.js.map +1 -1
  253. package/lib/webrtc/stats/callStatsReportGatherer.js +19 -22
  254. package/lib/webrtc/stats/callStatsReportGatherer.js.map +1 -1
  255. package/lib/webrtc/stats/groupCallStats.js +4 -5
  256. package/lib/webrtc/stats/groupCallStats.js.map +1 -1
  257. package/lib/webrtc/stats/media/mediaSsrcHandler.js +1 -1
  258. package/lib/webrtc/stats/media/mediaSsrcHandler.js.map +1 -1
  259. package/lib/webrtc/stats/media/mediaTrackStats.js +3 -3
  260. package/lib/webrtc/stats/media/mediaTrackStats.js.map +1 -1
  261. package/lib/webrtc/stats/media/mediaTrackStatsHandler.js +1 -1
  262. package/lib/webrtc/stats/media/mediaTrackStatsHandler.js.map +1 -1
  263. package/package.json +4 -4
  264. package/src/client.ts +66 -23
  265. package/src/common-crypto/CryptoBackend.ts +45 -0
  266. package/src/common-crypto/base64.ts +46 -0
  267. package/src/crypto/backup.ts +30 -0
  268. package/src/crypto/index.ts +90 -3
  269. package/src/crypto/keybackup.ts +3 -20
  270. package/src/crypto/recoverykey.ts +3 -4
  271. package/src/crypto-api/keybackup.ts +19 -0
  272. package/src/crypto-api.ts +63 -0
  273. package/src/embedded.ts +28 -1
  274. package/src/matrixrtc/CallMembership.ts +95 -0
  275. package/src/matrixrtc/MatrixRTCSession.ts +418 -0
  276. package/src/matrixrtc/MatrixRTCSessionManager.ts +128 -0
  277. package/src/matrixrtc/focus.ts +24 -0
  278. package/src/models/event.ts +1 -1
  279. package/src/models/room.ts +11 -5
  280. package/src/rust-crypto/CrossSigningIdentity.ts +0 -4
  281. package/src/rust-crypto/backup.ts +56 -2
  282. package/src/rust-crypto/index.ts +3 -0
  283. package/src/rust-crypto/rust-crypto.ts +282 -44
  284. package/src/sync-accumulator.ts +63 -1
  285. package/src/sync.ts +26 -1
  286. package/src/webrtc/groupCall.ts +43 -6
  287. package/src/webrtc/groupCallEventHandler.ts +3 -0
@@ -1 +1 @@
1
- {"version":3,"file":"room-member.js","names":["_contentRepo","require","_utils","_logger","_typedEventEmitter","_event","RoomMemberEvent","exports","RoomMember","TypedEventEmitter","constructor","roomId","userId","_defineProperty2","default","name","rawDisplayName","updateModifiedTime","markOutOfBand","_isOutOfBand","isOutOfBand","setMembershipEvent","event","roomState","_event$getDirectional","_event$getDirectional2","displayName","getDirectionalContent","displayname","getType","EventType","events","member","oldMembership","membership","undefined","logger","trace","forwardLooking","getContent","getPrevContent","disambiguate","shouldDisambiguate","oldName","calculateDisplayName","removeDirectionOverrideChars","removeHiddenChars","emit","Membership","Name","setPowerLevelEvent","powerLevelEvent","RoomPowerLevels","getStateKey","evContent","maxLevel","users_default","users","Object","values","forEach","lvl","Math","max","oldPowerLevel","powerLevel","oldPowerLevelNorm","powerLevelNorm","Number","isInteger","PowerLevel","setTypingEvent","oldTyping","typing","typingList","user_ids","Array","isArray","indexOf","Typing","modified","Date","now","getLastModifiedTime","isKicked","getSender","getDMInviter","memberEvent","memberContent","inviteSender","getUnsigned","prev_sender","is_direct","getAvatarUrl","baseUrl","width","height","resizeMethod","allowDefault","allowDirectLinks","rawUrl","getMxcAvatarUrl","httpUrl","getHttpUriForMxc","avatar_url","user","avatarUrl","MXID_PATTERN","LTR_RTL_PATTERN","selfUserId","test","userIds","getUserIdsWithDisplayName","some","u"],"sources":["../../src/models/room-member.ts"],"sourcesContent":["/*\nCopyright 2015 - 2021 The Matrix.org Foundation C.I.C.\n\nLicensed under the Apache License, Version 2.0 (the \"License\");\nyou may not use this file except in compliance with the License.\nYou may obtain a copy of the License at\n\n http://www.apache.org/licenses/LICENSE-2.0\n\nUnless required by applicable law or agreed to in writing, software\ndistributed under the License is distributed on an \"AS IS\" BASIS,\nWITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\nSee the License for the specific language governing permissions and\nlimitations under the License.\n*/\n\nimport { getHttpUriForMxc } from \"../content-repo\";\nimport { removeDirectionOverrideChars, removeHiddenChars } from \"../utils\";\nimport { User } from \"./user\";\nimport { MatrixEvent } from \"./event\";\nimport { RoomState } from \"./room-state\";\nimport { logger } from \"../logger\";\nimport { TypedEventEmitter } from \"./typed-event-emitter\";\nimport { EventType } from \"../@types/event\";\n\nexport enum RoomMemberEvent {\n Membership = \"RoomMember.membership\",\n Name = \"RoomMember.name\",\n PowerLevel = \"RoomMember.powerLevel\",\n Typing = \"RoomMember.typing\",\n}\n\nexport type RoomMemberEventHandlerMap = {\n /**\n * Fires whenever any room member's membership state changes.\n * @param event - The matrix event which caused this event to fire.\n * @param member - The member whose RoomMember.membership changed.\n * @param oldMembership - The previous membership state. Null if it's a new member.\n * @example\n * ```\n * matrixClient.on(\"RoomMember.membership\", function(event, member, oldMembership){\n * var newState = member.membership;\n * });\n * ```\n */\n [RoomMemberEvent.Membership]: (event: MatrixEvent, member: RoomMember, oldMembership?: string) => void;\n /**\n * Fires whenever any room member's name changes.\n * @param event - The matrix event which caused this event to fire.\n * @param member - The member whose RoomMember.name changed.\n * @param oldName - The previous name. Null if the member didn't have a name previously.\n * @example\n * ```\n * matrixClient.on(\"RoomMember.name\", function(event, member){\n * var newName = member.name;\n * });\n * ```\n */\n [RoomMemberEvent.Name]: (event: MatrixEvent, member: RoomMember, oldName: string | null) => void;\n /**\n * Fires whenever any room member's power level changes.\n * @param event - The matrix event which caused this event to fire.\n * @param member - The member whose RoomMember.powerLevel changed.\n * @example\n * ```\n * matrixClient.on(\"RoomMember.powerLevel\", function(event, member){\n * var newPowerLevel = member.powerLevel;\n * var newNormPowerLevel = member.powerLevelNorm;\n * });\n * ```\n */\n [RoomMemberEvent.PowerLevel]: (event: MatrixEvent, member: RoomMember) => void;\n /**\n * Fires whenever any room member's typing state changes.\n * @param event - The matrix event which caused this event to fire.\n * @param member - The member whose RoomMember.typing changed.\n * @example\n * ```\n * matrixClient.on(\"RoomMember.typing\", function(event, member){\n * var isTyping = member.typing;\n * });\n * ```\n */\n [RoomMemberEvent.Typing]: (event: MatrixEvent, member: RoomMember) => void;\n};\n\nexport class RoomMember extends TypedEventEmitter<RoomMemberEvent, RoomMemberEventHandlerMap> {\n private _isOutOfBand = false;\n private modified = -1;\n public requestedProfileInfo = false; // used by sync.ts\n\n // XXX these should be read-only\n /**\n * True if the room member is currently typing.\n */\n public typing = false;\n /**\n * The human-readable name for this room member. This will be\n * disambiguated with a suffix of \" (\\@user_id:matrix.org)\" if another member shares the\n * same displayname.\n */\n public name: string;\n /**\n * The ambiguous displayname of this room member.\n */\n public rawDisplayName: string;\n /**\n * The power level for this room member.\n */\n public powerLevel = 0;\n /**\n * The normalised power level (0-100) for this room member.\n */\n public powerLevelNorm = 0;\n /**\n * The User object for this room member, if one exists.\n */\n public user?: User;\n /**\n * The membership state for this room member e.g. 'join'.\n */\n public membership?: string;\n /**\n * True if the member's name is disambiguated.\n */\n public disambiguate = false;\n /**\n * The events describing this RoomMember.\n */\n public events: {\n /**\n * The m.room.member event for this RoomMember.\n */\n member?: MatrixEvent;\n } = {};\n\n /**\n * Construct a new room member.\n *\n * @param roomId - The room ID of the member.\n * @param userId - The user ID of the member.\n */\n public constructor(public readonly roomId: string, public readonly userId: string) {\n super();\n\n this.name = userId;\n this.rawDisplayName = userId;\n this.updateModifiedTime();\n }\n\n /**\n * Mark the member as coming from a channel that is not sync\n */\n public markOutOfBand(): void {\n this._isOutOfBand = true;\n }\n\n /**\n * @returns does the member come from a channel that is not sync?\n * This is used to store the member seperately\n * from the sync state so it available across browser sessions.\n */\n public isOutOfBand(): boolean {\n return this._isOutOfBand;\n }\n\n /**\n * Update this room member's membership event. May fire \"RoomMember.name\" if\n * this event updates this member's name.\n * @param event - The `m.room.member` event\n * @param roomState - Optional. The room state to take into account\n * when calculating (e.g. for disambiguating users with the same name).\n *\n * @remarks\n * Fires {@link RoomMemberEvent.Name}\n * Fires {@link RoomMemberEvent.Membership}\n */\n public setMembershipEvent(event: MatrixEvent, roomState?: RoomState): void {\n const displayName = event.getDirectionalContent().displayname ?? \"\";\n\n if (event.getType() !== EventType.RoomMember) {\n return;\n }\n\n this._isOutOfBand = false;\n\n this.events.member = event;\n\n const oldMembership = this.membership;\n this.membership = event.getDirectionalContent().membership;\n if (this.membership === undefined) {\n // logging to diagnose https://github.com/vector-im/element-web/issues/20962\n // (logs event content, although only of membership events)\n logger.trace(\n `membership event with membership undefined (forwardLooking: ${event.forwardLooking})!`,\n event.getContent(),\n `prevcontent is `,\n event.getPrevContent(),\n );\n }\n\n this.disambiguate = shouldDisambiguate(this.userId, displayName, roomState);\n\n const oldName = this.name;\n this.name = calculateDisplayName(this.userId, displayName, this.disambiguate);\n\n // not quite raw: we strip direction override chars so it can safely be inserted into\n // blocks of text without breaking the text direction\n this.rawDisplayName = removeDirectionOverrideChars(event.getDirectionalContent().displayname ?? \"\");\n if (!this.rawDisplayName || !removeHiddenChars(this.rawDisplayName)) {\n this.rawDisplayName = this.userId;\n }\n\n if (oldMembership !== this.membership) {\n this.updateModifiedTime();\n this.emit(RoomMemberEvent.Membership, event, this, oldMembership);\n }\n if (oldName !== this.name) {\n this.updateModifiedTime();\n this.emit(RoomMemberEvent.Name, event, this, oldName);\n }\n }\n\n /**\n * Update this room member's power level event. May fire\n * \"RoomMember.powerLevel\" if this event updates this member's power levels.\n * @param powerLevelEvent - The `m.room.power_levels` event\n *\n * @remarks\n * Fires {@link RoomMemberEvent.PowerLevel}\n */\n public setPowerLevelEvent(powerLevelEvent: MatrixEvent): void {\n if (powerLevelEvent.getType() !== EventType.RoomPowerLevels || powerLevelEvent.getStateKey() !== \"\") {\n return;\n }\n\n const evContent = powerLevelEvent.getDirectionalContent();\n\n let maxLevel = evContent.users_default || 0;\n const users: { [userId: string]: number } = evContent.users || {};\n Object.values(users).forEach((lvl: number) => {\n maxLevel = Math.max(maxLevel, lvl);\n });\n const oldPowerLevel = this.powerLevel;\n const oldPowerLevelNorm = this.powerLevelNorm;\n\n if (users[this.userId] !== undefined && Number.isInteger(users[this.userId])) {\n this.powerLevel = users[this.userId];\n } else if (evContent.users_default !== undefined) {\n this.powerLevel = evContent.users_default;\n } else {\n this.powerLevel = 0;\n }\n this.powerLevelNorm = 0;\n if (maxLevel > 0) {\n this.powerLevelNorm = (this.powerLevel * 100) / maxLevel;\n }\n\n // emit for changes in powerLevelNorm as well (since the app will need to\n // redraw everyone's level if the max has changed)\n if (oldPowerLevel !== this.powerLevel || oldPowerLevelNorm !== this.powerLevelNorm) {\n this.updateModifiedTime();\n this.emit(RoomMemberEvent.PowerLevel, powerLevelEvent, this);\n }\n }\n\n /**\n * Update this room member's typing event. May fire \"RoomMember.typing\" if\n * this event changes this member's typing state.\n * @param event - The typing event\n *\n * @remarks\n * Fires {@link RoomMemberEvent.Typing}\n */\n public setTypingEvent(event: MatrixEvent): void {\n if (event.getType() !== \"m.typing\") {\n return;\n }\n const oldTyping = this.typing;\n this.typing = false;\n const typingList = event.getContent().user_ids;\n if (!Array.isArray(typingList)) {\n // malformed event :/ bail early. TODO: whine?\n return;\n }\n if (typingList.indexOf(this.userId) !== -1) {\n this.typing = true;\n }\n if (oldTyping !== this.typing) {\n this.updateModifiedTime();\n this.emit(RoomMemberEvent.Typing, event, this);\n }\n }\n\n /**\n * Update the last modified time to the current time.\n */\n private updateModifiedTime(): void {\n this.modified = Date.now();\n }\n\n /**\n * Get the timestamp when this RoomMember was last updated. This timestamp is\n * updated when properties on this RoomMember are updated.\n * It is updated <i>before</i> firing events.\n * @returns The timestamp\n */\n public getLastModifiedTime(): number {\n return this.modified;\n }\n\n public isKicked(): boolean {\n return (\n this.membership === \"leave\" &&\n this.events.member !== undefined &&\n this.events.member.getSender() !== this.events.member.getStateKey()\n );\n }\n\n /**\n * If this member was invited with the is_direct flag set, return\n * the user that invited this member\n * @returns user id of the inviter\n */\n public getDMInviter(): string | undefined {\n // when not available because that room state hasn't been loaded in,\n // we don't really know, but more likely to not be a direct chat\n if (this.events.member) {\n // TODO: persist the is_direct flag on the member as more member events\n // come in caused by displayName changes.\n\n // the is_direct flag is set on the invite member event.\n // This is copied on the prev_content section of the join member event\n // when the invite is accepted.\n\n const memberEvent = this.events.member;\n let memberContent = memberEvent.getContent();\n let inviteSender: string | undefined = memberEvent.getSender();\n\n if (memberContent.membership === \"join\") {\n memberContent = memberEvent.getPrevContent();\n inviteSender = memberEvent.getUnsigned().prev_sender;\n }\n\n if (memberContent.membership === \"invite\" && memberContent.is_direct) {\n return inviteSender;\n }\n }\n }\n\n /**\n * Get the avatar URL for a room member.\n * @param baseUrl - The base homeserver URL See\n * {@link MatrixClient#getHomeserverUrl}.\n * @param width - The desired width of the thumbnail.\n * @param height - The desired height of the thumbnail.\n * @param resizeMethod - The thumbnail resize method to use, either\n * \"crop\" or \"scale\".\n * @param allowDefault - (optional) Passing false causes this method to\n * return null if the user has no avatar image. Otherwise, a default image URL\n * will be returned. Default: true. (Deprecated)\n * @param allowDirectLinks - (optional) If true, the avatar URL will be\n * returned even if it is a direct hyperlink rather than a matrix content URL.\n * If false, any non-matrix content URLs will be ignored. Setting this option to\n * true will expose URLs that, if fetched, will leak information about the user\n * to anyone who they share a room with.\n * @returns the avatar URL or null.\n */\n public getAvatarUrl(\n baseUrl: string,\n width: number,\n height: number,\n resizeMethod: string,\n allowDefault = true,\n allowDirectLinks: boolean,\n ): string | null {\n const rawUrl = this.getMxcAvatarUrl();\n\n if (!rawUrl && !allowDefault) {\n return null;\n }\n const httpUrl = getHttpUriForMxc(baseUrl, rawUrl, width, height, resizeMethod, allowDirectLinks);\n if (httpUrl) {\n return httpUrl;\n }\n return null;\n }\n\n /**\n * get the mxc avatar url, either from a state event, or from a lazily loaded member\n * @returns the mxc avatar url\n */\n public getMxcAvatarUrl(): string | undefined {\n if (this.events.member) {\n return this.events.member.getDirectionalContent().avatar_url;\n } else if (this.user) {\n return this.user.avatarUrl;\n }\n }\n}\n\nconst MXID_PATTERN = /@.+:.+/;\nconst LTR_RTL_PATTERN = /[\\u200E\\u200F\\u202A-\\u202F]/;\n\nfunction shouldDisambiguate(selfUserId: string, displayName?: string, roomState?: RoomState): boolean {\n if (!displayName || displayName === selfUserId) return false;\n\n // First check if the displayname is something we consider truthy\n // after stripping it of zero width characters and padding spaces\n if (!removeHiddenChars(displayName)) return false;\n\n if (!roomState) return false;\n\n // Next check if the name contains something that look like a mxid\n // If it does, it may be someone trying to impersonate someone else\n // Show full mxid in this case\n if (MXID_PATTERN.test(displayName)) return true;\n\n // Also show mxid if the display name contains any LTR/RTL characters as these\n // make it very difficult for us to find similar *looking* display names\n // E.g \"Mark\" could be cloned by writing \"kraM\" but in RTL.\n if (LTR_RTL_PATTERN.test(displayName)) return true;\n\n // Also show mxid if there are other people with the same or similar\n // displayname, after hidden character removal.\n const userIds = roomState.getUserIdsWithDisplayName(displayName);\n if (userIds.some((u) => u !== selfUserId)) return true;\n\n return false;\n}\n\nfunction calculateDisplayName(selfUserId: string, displayName: string | undefined, disambiguate: boolean): string {\n if (!displayName || displayName === selfUserId) return selfUserId;\n\n if (disambiguate) return removeDirectionOverrideChars(displayName) + \" (\" + selfUserId + \")\";\n\n // First check if the displayname is something we consider truthy\n // after stripping it of zero width characters and padding spaces\n if (!removeHiddenChars(displayName)) return selfUserId;\n\n // We always strip the direction override characters (LRO and RLO).\n // These override the text direction for all subsequent characters\n // in the paragraph so if display names contained these, they'd\n // need to be wrapped in something to prevent this from leaking out\n // (which we can do in HTML but not text) or we'd need to add\n // control characters to the string to reset any overrides (eg.\n // adding PDF characters at the end). As far as we can see,\n // there should be no reason these would be necessary - rtl display\n // names should flip into the correct direction automatically based on\n // the characters, and you can still embed rtl in ltr or vice versa\n // with the embed chars or marker chars.\n return removeDirectionOverrideChars(displayName);\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"room-member.js","names":["_contentRepo","require","_utils","_logger","_typedEventEmitter","_event","RoomMemberEvent","exports","RoomMember","TypedEventEmitter","constructor","roomId","userId","_defineProperty2","default","name","rawDisplayName","updateModifiedTime","markOutOfBand","_isOutOfBand","isOutOfBand","setMembershipEvent","event","roomState","_event$getDirectional","_event$getDirectional2","displayName","getDirectionalContent","displayname","getType","EventType","events","member","oldMembership","membership","undefined","logger","trace","forwardLooking","getContent","getPrevContent","disambiguate","shouldDisambiguate","oldName","calculateDisplayName","removeDirectionOverrideChars","removeHiddenChars","emit","Membership","Name","setPowerLevelEvent","powerLevelEvent","RoomPowerLevels","getStateKey","evContent","maxLevel","users_default","users","Object","values","forEach","lvl","Math","max","oldPowerLevel","powerLevel","oldPowerLevelNorm","powerLevelNorm","Number","isInteger","PowerLevel","setTypingEvent","oldTyping","typing","typingList","user_ids","Array","isArray","indexOf","Typing","modified","Date","now","getLastModifiedTime","isKicked","getSender","getDMInviter","memberEvent","memberContent","inviteSender","getUnsigned","prev_sender","is_direct","getAvatarUrl","baseUrl","width","height","resizeMethod","allowDefault","allowDirectLinks","rawUrl","getMxcAvatarUrl","httpUrl","getHttpUriForMxc","avatar_url","user","avatarUrl","MXID_PATTERN","LTR_RTL_PATTERN","selfUserId","test","userIds","getUserIdsWithDisplayName","some","u"],"sources":["../../src/models/room-member.ts"],"sourcesContent":["/*\nCopyright 2015 - 2021 The Matrix.org Foundation C.I.C.\n\nLicensed under the Apache License, Version 2.0 (the \"License\");\nyou may not use this file except in compliance with the License.\nYou may obtain a copy of the License at\n\n http://www.apache.org/licenses/LICENSE-2.0\n\nUnless required by applicable law or agreed to in writing, software\ndistributed under the License is distributed on an \"AS IS\" BASIS,\nWITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\nSee the License for the specific language governing permissions and\nlimitations under the License.\n*/\n\nimport { getHttpUriForMxc } from \"../content-repo\";\nimport { removeDirectionOverrideChars, removeHiddenChars } from \"../utils\";\nimport { User } from \"./user\";\nimport { MatrixEvent } from \"./event\";\nimport { RoomState } from \"./room-state\";\nimport { logger } from \"../logger\";\nimport { TypedEventEmitter } from \"./typed-event-emitter\";\nimport { EventType } from \"../@types/event\";\n\nexport enum RoomMemberEvent {\n Membership = \"RoomMember.membership\",\n Name = \"RoomMember.name\",\n PowerLevel = \"RoomMember.powerLevel\",\n Typing = \"RoomMember.typing\",\n}\n\nexport type RoomMemberEventHandlerMap = {\n /**\n * Fires whenever any room member's membership state changes.\n * @param event - The matrix event which caused this event to fire.\n * @param member - The member whose RoomMember.membership changed.\n * @param oldMembership - The previous membership state. Null if it's a new member.\n * @example\n * ```\n * matrixClient.on(\"RoomMember.membership\", function(event, member, oldMembership){\n * var newState = member.membership;\n * });\n * ```\n */\n [RoomMemberEvent.Membership]: (event: MatrixEvent, member: RoomMember, oldMembership?: string) => void;\n /**\n * Fires whenever any room member's name changes.\n * @param event - The matrix event which caused this event to fire.\n * @param member - The member whose RoomMember.name changed.\n * @param oldName - The previous name. Null if the member didn't have a name previously.\n * @example\n * ```\n * matrixClient.on(\"RoomMember.name\", function(event, member){\n * var newName = member.name;\n * });\n * ```\n */\n [RoomMemberEvent.Name]: (event: MatrixEvent, member: RoomMember, oldName: string | null) => void;\n /**\n * Fires whenever any room member's power level changes.\n * @param event - The matrix event which caused this event to fire.\n * @param member - The member whose RoomMember.powerLevel changed.\n * @example\n * ```\n * matrixClient.on(\"RoomMember.powerLevel\", function(event, member){\n * var newPowerLevel = member.powerLevel;\n * var newNormPowerLevel = member.powerLevelNorm;\n * });\n * ```\n */\n [RoomMemberEvent.PowerLevel]: (event: MatrixEvent, member: RoomMember) => void;\n /**\n * Fires whenever any room member's typing state changes.\n * @param event - The matrix event which caused this event to fire.\n * @param member - The member whose RoomMember.typing changed.\n * @example\n * ```\n * matrixClient.on(\"RoomMember.typing\", function(event, member){\n * var isTyping = member.typing;\n * });\n * ```\n */\n [RoomMemberEvent.Typing]: (event: MatrixEvent, member: RoomMember) => void;\n};\n\nexport class RoomMember extends TypedEventEmitter<RoomMemberEvent, RoomMemberEventHandlerMap> {\n private _isOutOfBand = false;\n private modified = -1;\n public requestedProfileInfo = false; // used by sync.ts\n\n // XXX these should be read-only\n /**\n * True if the room member is currently typing.\n */\n public typing = false;\n /**\n * The human-readable name for this room member. This will be\n * disambiguated with a suffix of \" (\\@user_id:matrix.org)\" if another member shares the\n * same displayname.\n */\n public name: string;\n /**\n * The ambiguous displayname of this room member.\n */\n public rawDisplayName: string;\n /**\n * The power level for this room member.\n */\n public powerLevel = 0;\n /**\n * The normalised power level (0-100) for this room member.\n */\n public powerLevelNorm = 0;\n /**\n * The User object for this room member, if one exists.\n */\n public user?: User;\n /**\n * The membership state for this room member e.g. 'join'.\n */\n public membership?: string;\n /**\n * True if the member's name is disambiguated.\n */\n public disambiguate = false;\n /**\n * The events describing this RoomMember.\n */\n public events: {\n /**\n * The m.room.member event for this RoomMember.\n */\n member?: MatrixEvent;\n } = {};\n\n /**\n * Construct a new room member.\n *\n * @param roomId - The room ID of the member.\n * @param userId - The user ID of the member.\n */\n public constructor(public readonly roomId: string, public readonly userId: string) {\n super();\n\n this.name = userId;\n this.rawDisplayName = userId;\n this.updateModifiedTime();\n }\n\n /**\n * Mark the member as coming from a channel that is not sync\n */\n public markOutOfBand(): void {\n this._isOutOfBand = true;\n }\n\n /**\n * @returns does the member come from a channel that is not sync?\n * This is used to store the member seperately\n * from the sync state so it available across browser sessions.\n */\n public isOutOfBand(): boolean {\n return this._isOutOfBand;\n }\n\n /**\n * Update this room member's membership event. May fire \"RoomMember.name\" if\n * this event updates this member's name.\n * @param event - The `m.room.member` event\n * @param roomState - Optional. The room state to take into account\n * when calculating (e.g. for disambiguating users with the same name).\n *\n * @remarks\n * Fires {@link RoomMemberEvent.Name}\n * Fires {@link RoomMemberEvent.Membership}\n */\n public setMembershipEvent(event: MatrixEvent, roomState?: RoomState): void {\n const displayName = event.getDirectionalContent().displayname ?? \"\";\n\n if (event.getType() !== EventType.RoomMember) {\n return;\n }\n\n this._isOutOfBand = false;\n\n this.events.member = event;\n\n const oldMembership = this.membership;\n this.membership = event.getDirectionalContent().membership;\n if (this.membership === undefined) {\n // logging to diagnose https://github.com/vector-im/element-web/issues/20962\n // (logs event content, although only of membership events)\n logger.trace(\n `membership event with membership undefined (forwardLooking: ${event.forwardLooking})!`,\n event.getContent(),\n `prevcontent is `,\n event.getPrevContent(),\n );\n }\n\n this.disambiguate = shouldDisambiguate(this.userId, displayName, roomState);\n\n const oldName = this.name;\n this.name = calculateDisplayName(this.userId, displayName, this.disambiguate);\n\n // not quite raw: we strip direction override chars so it can safely be inserted into\n // blocks of text without breaking the text direction\n this.rawDisplayName = removeDirectionOverrideChars(event.getDirectionalContent().displayname ?? \"\");\n if (!this.rawDisplayName || !removeHiddenChars(this.rawDisplayName)) {\n this.rawDisplayName = this.userId;\n }\n\n if (oldMembership !== this.membership) {\n this.updateModifiedTime();\n this.emit(RoomMemberEvent.Membership, event, this, oldMembership);\n }\n if (oldName !== this.name) {\n this.updateModifiedTime();\n this.emit(RoomMemberEvent.Name, event, this, oldName);\n }\n }\n\n /**\n * Update this room member's power level event. May fire\n * \"RoomMember.powerLevel\" if this event updates this member's power levels.\n * @param powerLevelEvent - The `m.room.power_levels` event\n *\n * @remarks\n * Fires {@link RoomMemberEvent.PowerLevel}\n */\n public setPowerLevelEvent(powerLevelEvent: MatrixEvent): void {\n if (powerLevelEvent.getType() !== EventType.RoomPowerLevels || powerLevelEvent.getStateKey() !== \"\") {\n return;\n }\n\n const evContent = powerLevelEvent.getDirectionalContent();\n\n let maxLevel = evContent.users_default || 0;\n const users: { [userId: string]: number } = evContent.users || {};\n Object.values(users).forEach((lvl: number) => {\n maxLevel = Math.max(maxLevel, lvl);\n });\n const oldPowerLevel = this.powerLevel;\n const oldPowerLevelNorm = this.powerLevelNorm;\n\n if (users[this.userId] !== undefined && Number.isInteger(users[this.userId])) {\n this.powerLevel = users[this.userId];\n } else if (evContent.users_default !== undefined) {\n this.powerLevel = evContent.users_default;\n } else {\n this.powerLevel = 0;\n }\n this.powerLevelNorm = 0;\n if (maxLevel > 0) {\n this.powerLevelNorm = (this.powerLevel * 100) / maxLevel;\n }\n\n // emit for changes in powerLevelNorm as well (since the app will need to\n // redraw everyone's level if the max has changed)\n if (oldPowerLevel !== this.powerLevel || oldPowerLevelNorm !== this.powerLevelNorm) {\n this.updateModifiedTime();\n this.emit(RoomMemberEvent.PowerLevel, powerLevelEvent, this);\n }\n }\n\n /**\n * Update this room member's typing event. May fire \"RoomMember.typing\" if\n * this event changes this member's typing state.\n * @param event - The typing event\n *\n * @remarks\n * Fires {@link RoomMemberEvent.Typing}\n */\n public setTypingEvent(event: MatrixEvent): void {\n if (event.getType() !== \"m.typing\") {\n return;\n }\n const oldTyping = this.typing;\n this.typing = false;\n const typingList = event.getContent().user_ids;\n if (!Array.isArray(typingList)) {\n // malformed event :/ bail early. TODO: whine?\n return;\n }\n if (typingList.indexOf(this.userId) !== -1) {\n this.typing = true;\n }\n if (oldTyping !== this.typing) {\n this.updateModifiedTime();\n this.emit(RoomMemberEvent.Typing, event, this);\n }\n }\n\n /**\n * Update the last modified time to the current time.\n */\n private updateModifiedTime(): void {\n this.modified = Date.now();\n }\n\n /**\n * Get the timestamp when this RoomMember was last updated. This timestamp is\n * updated when properties on this RoomMember are updated.\n * It is updated <i>before</i> firing events.\n * @returns The timestamp\n */\n public getLastModifiedTime(): number {\n return this.modified;\n }\n\n public isKicked(): boolean {\n return (\n this.membership === \"leave\" &&\n this.events.member !== undefined &&\n this.events.member.getSender() !== this.events.member.getStateKey()\n );\n }\n\n /**\n * If this member was invited with the is_direct flag set, return\n * the user that invited this member\n * @returns user id of the inviter\n */\n public getDMInviter(): string | undefined {\n // when not available because that room state hasn't been loaded in,\n // we don't really know, but more likely to not be a direct chat\n if (this.events.member) {\n // TODO: persist the is_direct flag on the member as more member events\n // come in caused by displayName changes.\n\n // the is_direct flag is set on the invite member event.\n // This is copied on the prev_content section of the join member event\n // when the invite is accepted.\n\n const memberEvent = this.events.member;\n let memberContent = memberEvent.getContent();\n let inviteSender: string | undefined = memberEvent.getSender();\n\n if (memberContent.membership === \"join\") {\n memberContent = memberEvent.getPrevContent();\n inviteSender = memberEvent.getUnsigned().prev_sender;\n }\n\n if (memberContent.membership === \"invite\" && memberContent.is_direct) {\n return inviteSender;\n }\n }\n }\n\n /**\n * Get the avatar URL for a room member.\n * @param baseUrl - The base homeserver URL See\n * {@link MatrixClient#getHomeserverUrl}.\n * @param width - The desired width of the thumbnail.\n * @param height - The desired height of the thumbnail.\n * @param resizeMethod - The thumbnail resize method to use, either\n * \"crop\" or \"scale\".\n * @param allowDefault - (optional) Passing false causes this method to\n * return null if the user has no avatar image. Otherwise, a default image URL\n * will be returned. Default: true. (Deprecated)\n * @param allowDirectLinks - (optional) If true, the avatar URL will be\n * returned even if it is a direct hyperlink rather than a matrix content URL.\n * If false, any non-matrix content URLs will be ignored. Setting this option to\n * true will expose URLs that, if fetched, will leak information about the user\n * to anyone who they share a room with.\n * @returns the avatar URL or null.\n */\n public getAvatarUrl(\n baseUrl: string,\n width: number,\n height: number,\n resizeMethod: string,\n allowDefault = true,\n allowDirectLinks: boolean,\n ): string | null {\n const rawUrl = this.getMxcAvatarUrl();\n\n if (!rawUrl && !allowDefault) {\n return null;\n }\n const httpUrl = getHttpUriForMxc(baseUrl, rawUrl, width, height, resizeMethod, allowDirectLinks);\n if (httpUrl) {\n return httpUrl;\n }\n return null;\n }\n\n /**\n * get the mxc avatar url, either from a state event, or from a lazily loaded member\n * @returns the mxc avatar url\n */\n public getMxcAvatarUrl(): string | undefined {\n if (this.events.member) {\n return this.events.member.getDirectionalContent().avatar_url;\n } else if (this.user) {\n return this.user.avatarUrl;\n }\n }\n}\n\nconst MXID_PATTERN = /@.+:.+/;\nconst LTR_RTL_PATTERN = /[\\u200E\\u200F\\u202A-\\u202F]/;\n\nfunction shouldDisambiguate(selfUserId: string, displayName?: string, roomState?: RoomState): boolean {\n if (!displayName || displayName === selfUserId) return false;\n\n // First check if the displayname is something we consider truthy\n // after stripping it of zero width characters and padding spaces\n if (!removeHiddenChars(displayName)) return false;\n\n if (!roomState) return false;\n\n // Next check if the name contains something that look like a mxid\n // If it does, it may be someone trying to impersonate someone else\n // Show full mxid in this case\n if (MXID_PATTERN.test(displayName)) return true;\n\n // Also show mxid if the display name contains any LTR/RTL characters as these\n // make it very difficult for us to find similar *looking* display names\n // E.g \"Mark\" could be cloned by writing \"kraM\" but in RTL.\n if (LTR_RTL_PATTERN.test(displayName)) return true;\n\n // Also show mxid if there are other people with the same or similar\n // displayname, after hidden character removal.\n const userIds = roomState.getUserIdsWithDisplayName(displayName);\n if (userIds.some((u) => u !== selfUserId)) return true;\n\n return false;\n}\n\nfunction calculateDisplayName(selfUserId: string, displayName: string | undefined, disambiguate: boolean): string {\n if (!displayName || displayName === selfUserId) return selfUserId;\n\n if (disambiguate) return removeDirectionOverrideChars(displayName) + \" (\" + selfUserId + \")\";\n\n // First check if the displayname is something we consider truthy\n // after stripping it of zero width characters and padding spaces\n if (!removeHiddenChars(displayName)) return selfUserId;\n\n // We always strip the direction override characters (LRO and RLO).\n // These override the text direction for all subsequent characters\n // in the paragraph so if display names contained these, they'd\n // need to be wrapped in something to prevent this from leaking out\n // (which we can do in HTML but not text) or we'd need to add\n // control characters to the string to reset any overrides (eg.\n // adding PDF characters at the end). As far as we can see,\n // there should be no reason these would be necessary - rtl display\n // names should flip into the correct direction automatically based on\n // the characters, and you can still embed rtl in ltr or vice versa\n // with the embed chars or marker chars.\n return removeDirectionOverrideChars(displayName);\n}\n"],"mappings":"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"}
@@ -81,8 +81,6 @@ class RoomState extends _typedEventEmitter.TypedEventEmitter {
81
81
  status: OobStatus.NotStarted
82
82
  }) {
83
83
  super();
84
- this.roomId = roomId;
85
- this.oobMemberFlags = oobMemberFlags;
86
84
  (0, _defineProperty2.default)(this, "reEmitter", new _ReEmitter.TypedReEmitter(this));
87
85
  (0, _defineProperty2.default)(this, "sentinels", {});
88
86
  // userId: RoomMember
@@ -114,6 +112,8 @@ class RoomState extends _typedEventEmitter.TypedEventEmitter {
114
112
  (0, _defineProperty2.default)(this, "paginationToken", null);
115
113
  (0, _defineProperty2.default)(this, "beacons", new Map());
116
114
  (0, _defineProperty2.default)(this, "_liveBeaconIds", []);
115
+ this.roomId = roomId;
116
+ this.oobMemberFlags = oobMemberFlags;
117
117
  this.updateModifiedTime();
118
118
  }
119
119
 
@@ -279,7 +279,7 @@ class RoomState extends _typedEventEmitter.TypedEventEmitter {
279
279
  this.getMembers().forEach(member => {
280
280
  if (member.isOutOfBand()) {
281
281
  var _copy$getMember;
282
- (_copy$getMember = copy.getMember(member.userId)) === null || _copy$getMember === void 0 ? void 0 : _copy$getMember.markOutOfBand();
282
+ (_copy$getMember = copy.getMember(member.userId)) === null || _copy$getMember === void 0 || _copy$getMember.markOutOfBand();
283
283
  }
284
284
  });
285
285
  }
@@ -1 +1 @@
1
- {"version":3,"file":"room-state.js","names":["_roomMember","require","_logger","_utils","_event","_event2","_partials","_typedEventEmitter","_beacon","_ReEmitter","_beacon2","OobStatus","RoomStateEvent","exports","RoomState","TypedEventEmitter","constructor","roomId","oobMemberFlags","status","NotStarted","_defineProperty2","default","TypedReEmitter","Map","updateModifiedTime","getJoinedMemberCount","summaryJoinedMemberCount","joinedMemberCount","getMembers","reduce","count","m","membership","setJoinedMemberCount","getInvitedMemberCount","summaryInvitedMemberCount","invitedMemberCount","setInvitedMemberCount","Object","values","members","getMembersExcept","excludedIds","filter","includes","userId","getMember","getSentinelMember","sentinel","sentinels","undefined","RoomMember","member","events","setMembershipEvent","getStateEvents","eventType","stateKey","has","Array","from","get","event","hasLiveBeacons","_this$liveBeaconIds","liveBeaconIds","length","_liveBeaconIds","clone","copy","forEach","eventsByStateKey","setStateEvents","Finished","isOutOfBand","_copy$getMember","markOutOfBand","setUnknownStateEvents","unknownStateEvents","getType","getStateKey","stateEvents","markerFoundOptions","getRoomId","isState","M_BEACON_INFO","matches","setBeacon","lastStateEvent","getStateEventMatching","setStateEvent","EventType","_event$getContent$dis","updateDisplayNameCache","getContent","displayname","updateThirdPartyTokenCache","emit","Events","onBeaconLivenessChange","avatar_url","getPrevContent","getOrCreateMember","updateMember","Members","RoomPowerLevels","oldLastModified","getLastModifiedTime","setPowerLevelEvent","UNSTABLE_MSC2716_MARKER","Marker","Update","processBeaconEvents","matrixClient","beacons","size","beaconByEventIdDict","dict","beacon","beaconInfoId","processBeaconRelation","beaconInfoEventId","M_BEACON","addLocations","_event$getRelation","relatedToEventId","getRelation","event_id","isEncrypted","decryptEventIfNeeded","isDecryptionFailure","once","MatrixEventEvent","Decrypted","NewMember","set","beaconIdentifier","getBeaconInfoIdentifier","isRedacted","_event$getRedactionEv","getRedactionEvent","redacts","destroy","delete","update","Beacon","reEmitter","reEmit","BeaconEvent","New","Destroy","LivenessChange","on","bind","identifier","isLive","map","BeaconLiveness","_this$events$get$get","_this$events$get","pwrLvlEvent","needsOutOfBandMembers","outOfBandMembersReady","markOutOfBandMembersStarted","InProgress","markOutOfBandMembersFailed","clearOutOfBandMembers","keys","logger","log","setOutOfBandMembers","e","setOutOfBandMember","stateEvent","existingMember","name","setTypingEvent","getInviteForThreePidToken","token","tokenToInvite","modified","Date","now","getUserIdsWithDisplayName","displayName","_this$displayNameToUs","displayNameToUserIds","removeHiddenChars","maySendRedactionForEvent","mxEvent","canRedact","maySendEvent","RoomRedaction","getSender","hasSufficientPowerLevelFor","powerLevel","action","powerLevelsEvent","powerLevels","requiredLevel","isNumber","maySendMessage","maySendEventOfType","RoomMessage","mayClientSendStateEvent","stateEventType","cli","isGuest","credentials","maySendStateEvent","state","eventsLevels","stateDefault","eventsDefault","Number","isSafeInteger","state_default","userPowerLevel","users","users_default","events_default","mayTriggerNotifOfType","notifLevelKey","notifLevel","notifications","getJoinRule","_joinRuleEvent$getCon","joinRuleEvent","RoomJoinRules","joinRuleContent","JoinRule","Invite","getHistoryVisibility","_historyVisibilityEve","historyVisibilityEvent","RoomHistoryVisibility","historyVisibilityContent","HistoryVisibility","Shared","getGuestAccess","_guestAccessEvent$get","guestAccessEvent","RoomGuestAccess","guestAccessContent","GuestAccess","Forbidden","findPredecessor","msc3946ProcessDynamicPredecessor","predecessorEvent","RoomPredecessor","content","predecessor_room_id","eventId","last_known_event_id","viaServers","via_servers","isArray","createEvent","RoomCreate","predecessor","memberEvent","third_party_invite","signed","threePidInvite","RoomThirdPartyInvite","oldName","userIdsToDisplayNames","strippedOldName","existingUserIds","filteredUserIDs","id","strippedDisplayname","_this$displayNameToUs2","arr","push"],"sources":["../../src/models/room-state.ts"],"sourcesContent":["/*\nCopyright 2015 - 2021 The Matrix.org Foundation C.I.C.\n\nLicensed under the Apache License, Version 2.0 (the \"License\");\nyou may not use this file except in compliance with the License.\nYou may obtain a copy of the License at\n\n http://www.apache.org/licenses/LICENSE-2.0\n\nUnless required by applicable law or agreed to in writing, software\ndistributed under the License is distributed on an \"AS IS\" BASIS,\nWITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\nSee the License for the specific language governing permissions and\nlimitations under the License.\n*/\n\nimport { RoomMember } from \"./room-member\";\nimport { logger } from \"../logger\";\nimport { isNumber, removeHiddenChars } from \"../utils\";\nimport { EventType, UNSTABLE_MSC2716_MARKER } from \"../@types/event\";\nimport { IEvent, MatrixEvent, MatrixEventEvent } from \"./event\";\nimport { MatrixClient } from \"../client\";\nimport { GuestAccess, HistoryVisibility, IJoinRuleEventContent, JoinRule } from \"../@types/partials\";\nimport { TypedEventEmitter } from \"./typed-event-emitter\";\nimport { Beacon, BeaconEvent, BeaconEventHandlerMap, getBeaconInfoIdentifier, BeaconIdentifier } from \"./beacon\";\nimport { TypedReEmitter } from \"../ReEmitter\";\nimport { M_BEACON, M_BEACON_INFO } from \"../@types/beacon\";\n\nexport interface IMarkerFoundOptions {\n /** Whether the timeline was empty before the marker event arrived in the\n * room. This could be happen in a variety of cases:\n * 1. From the initial sync\n * 2. It's the first state we're seeing after joining the room\n * 3. Or whether it's coming from `syncFromCache`\n *\n * A marker event refers to `UNSTABLE_MSC2716_MARKER` and indicates that\n * history was imported somewhere back in time. It specifically points to an\n * MSC2716 insertion event where the history was imported at. Marker events\n * are sent as state events so they are easily discoverable by clients and\n * homeservers and don't get lost in timeline gaps.\n */\n timelineWasEmpty?: boolean;\n}\n\n// possible statuses for out-of-band member loading\nenum OobStatus {\n NotStarted,\n InProgress,\n Finished,\n}\n\nexport interface IPowerLevelsContent {\n users?: Record<string, number>;\n events?: Record<string, number>;\n // eslint-disable-next-line camelcase\n users_default?: number;\n // eslint-disable-next-line camelcase\n events_default?: number;\n // eslint-disable-next-line camelcase\n state_default?: number;\n ban?: number;\n kick?: number;\n redact?: number;\n}\n\nexport enum RoomStateEvent {\n Events = \"RoomState.events\",\n Members = \"RoomState.members\",\n NewMember = \"RoomState.newMember\",\n Update = \"RoomState.update\", // signals batches of updates without specificity\n BeaconLiveness = \"RoomState.BeaconLiveness\",\n Marker = \"RoomState.Marker\",\n}\n\nexport type RoomStateEventHandlerMap = {\n /**\n * Fires whenever the event dictionary in room state is updated.\n * @param event - The matrix event which caused this event to fire.\n * @param state - The room state whose RoomState.events dictionary\n * was updated.\n * @param prevEvent - The event being replaced by the new state, if\n * known. Note that this can differ from `getPrevContent()` on the new state event\n * as this is the store's view of the last state, not the previous state provided\n * by the server.\n * @example\n * ```\n * matrixClient.on(\"RoomState.events\", function(event, state, prevEvent){\n * var newStateEvent = event;\n * });\n * ```\n */\n [RoomStateEvent.Events]: (event: MatrixEvent, state: RoomState, lastStateEvent: MatrixEvent | null) => void;\n /**\n * Fires whenever a member in the members dictionary is updated in any way.\n * @param event - The matrix event which caused this event to fire.\n * @param state - The room state whose RoomState.members dictionary\n * was updated.\n * @param member - The room member that was updated.\n * @example\n * ```\n * matrixClient.on(\"RoomState.members\", function(event, state, member){\n * var newMembershipState = member.membership;\n * });\n * ```\n */\n [RoomStateEvent.Members]: (event: MatrixEvent, state: RoomState, member: RoomMember) => void;\n /**\n * Fires whenever a member is added to the members dictionary. The RoomMember\n * will not be fully populated yet (e.g. no membership state) but will already\n * be available in the members dictionary.\n * @param event - The matrix event which caused this event to fire.\n * @param state - The room state whose RoomState.members dictionary\n * was updated with a new entry.\n * @param member - The room member that was added.\n * @example\n * ```\n * matrixClient.on(\"RoomState.newMember\", function(event, state, member){\n * // add event listeners on 'member'\n * });\n * ```\n */\n [RoomStateEvent.NewMember]: (event: MatrixEvent, state: RoomState, member: RoomMember) => void;\n [RoomStateEvent.Update]: (state: RoomState) => void;\n [RoomStateEvent.BeaconLiveness]: (state: RoomState, hasLiveBeacons: boolean) => void;\n [RoomStateEvent.Marker]: (event: MatrixEvent, setStateOptions?: IMarkerFoundOptions) => void;\n [BeaconEvent.New]: (event: MatrixEvent, beacon: Beacon) => void;\n};\n\ntype EmittedEvents = RoomStateEvent | BeaconEvent;\ntype EventHandlerMap = RoomStateEventHandlerMap & BeaconEventHandlerMap;\n\nexport class RoomState extends TypedEventEmitter<EmittedEvents, EventHandlerMap> {\n public readonly reEmitter = new TypedReEmitter<EmittedEvents, EventHandlerMap>(this);\n private sentinels: Record<string, RoomMember> = {}; // userId: RoomMember\n // stores fuzzy matches to a list of userIDs (applies utils.removeHiddenChars to keys)\n private displayNameToUserIds = new Map<string, string[]>();\n private userIdsToDisplayNames: Record<string, string> = {};\n private tokenToInvite: Record<string, MatrixEvent> = {}; // 3pid invite state_key to m.room.member invite\n private joinedMemberCount: number | null = null; // cache of the number of joined members\n // joined members count from summary api\n // once set, we know the server supports the summary api\n // and we should only trust that\n // we could also only trust that before OOB members\n // are loaded but doesn't seem worth the hassle atm\n private summaryJoinedMemberCount: number | null = null;\n // same for invited member count\n private invitedMemberCount: number | null = null;\n private summaryInvitedMemberCount: number | null = null;\n private modified = -1;\n\n // XXX: Should be read-only\n // The room member dictionary, keyed on the user's ID.\n public members: Record<string, RoomMember> = {}; // userId: RoomMember\n // The state events dictionary, keyed on the event type and then the state_key value.\n public events = new Map<string, Map<string, MatrixEvent>>(); // Map<eventType, Map<stateKey, MatrixEvent>>\n // The pagination token for this state.\n public paginationToken: string | null = null;\n\n public readonly beacons = new Map<BeaconIdentifier, Beacon>();\n private _liveBeaconIds: BeaconIdentifier[] = [];\n\n /**\n * Construct room state.\n *\n * Room State represents the state of the room at a given point.\n * It can be mutated by adding state events to it.\n * There are two types of room member associated with a state event:\n * normal member objects (accessed via getMember/getMembers) which mutate\n * with the state to represent the current state of that room/user, e.g.\n * the object returned by `getMember('@bob:example.com')` will mutate to\n * get a different display name if Bob later changes his display name\n * in the room.\n * There are also 'sentinel' members (accessed via getSentinelMember).\n * These also represent the state of room members at the point in time\n * represented by the RoomState object, but unlike objects from getMember,\n * sentinel objects will always represent the room state as at the time\n * getSentinelMember was called, so if Bob subsequently changes his display\n * name, a room member object previously acquired with getSentinelMember\n * will still have his old display name. Calling getSentinelMember again\n * after the display name change will return a new RoomMember object\n * with Bob's new display name.\n *\n * @param roomId - Optional. The ID of the room which has this state.\n * If none is specified it just tracks paginationTokens, useful for notifTimelineSet\n * @param oobMemberFlags - Optional. The state of loading out of bound members.\n * As the timeline might get reset while they are loading, this state needs to be inherited\n * and shared when the room state is cloned for the new timeline.\n * This should only be passed from clone.\n */\n public constructor(public readonly roomId: string, private oobMemberFlags = { status: OobStatus.NotStarted }) {\n super();\n this.updateModifiedTime();\n }\n\n /**\n * Returns the number of joined members in this room\n * This method caches the result.\n * @returns The number of members in this room whose membership is 'join'\n */\n public getJoinedMemberCount(): number {\n if (this.summaryJoinedMemberCount !== null) {\n return this.summaryJoinedMemberCount;\n }\n if (this.joinedMemberCount === null) {\n this.joinedMemberCount = this.getMembers().reduce((count, m) => {\n return m.membership === \"join\" ? count + 1 : count;\n }, 0);\n }\n return this.joinedMemberCount;\n }\n\n /**\n * Set the joined member count explicitly (like from summary part of the sync response)\n * @param count - the amount of joined members\n */\n public setJoinedMemberCount(count: number): void {\n this.summaryJoinedMemberCount = count;\n }\n\n /**\n * Returns the number of invited members in this room\n * @returns The number of members in this room whose membership is 'invite'\n */\n public getInvitedMemberCount(): number {\n if (this.summaryInvitedMemberCount !== null) {\n return this.summaryInvitedMemberCount;\n }\n if (this.invitedMemberCount === null) {\n this.invitedMemberCount = this.getMembers().reduce((count, m) => {\n return m.membership === \"invite\" ? count + 1 : count;\n }, 0);\n }\n return this.invitedMemberCount;\n }\n\n /**\n * Set the amount of invited members in this room\n * @param count - the amount of invited members\n */\n public setInvitedMemberCount(count: number): void {\n this.summaryInvitedMemberCount = count;\n }\n\n /**\n * Get all RoomMembers in this room.\n * @returns A list of RoomMembers.\n */\n public getMembers(): RoomMember[] {\n return Object.values(this.members);\n }\n\n /**\n * Get all RoomMembers in this room, excluding the user IDs provided.\n * @param excludedIds - The user IDs to exclude.\n * @returns A list of RoomMembers.\n */\n public getMembersExcept(excludedIds: string[]): RoomMember[] {\n return this.getMembers().filter((m) => !excludedIds.includes(m.userId));\n }\n\n /**\n * Get a room member by their user ID.\n * @param userId - The room member's user ID.\n * @returns The member or null if they do not exist.\n */\n public getMember(userId: string): RoomMember | null {\n return this.members[userId] || null;\n }\n\n /**\n * Get a room member whose properties will not change with this room state. You\n * typically want this if you want to attach a RoomMember to a MatrixEvent which\n * may no longer be represented correctly by Room.currentState or Room.oldState.\n * The term 'sentinel' refers to the fact that this RoomMember is an unchanging\n * guardian for state at this particular point in time.\n * @param userId - The room member's user ID.\n * @returns The member or null if they do not exist.\n */\n public getSentinelMember(userId: string): RoomMember | null {\n if (!userId) return null;\n let sentinel = this.sentinels[userId];\n\n if (sentinel === undefined) {\n sentinel = new RoomMember(this.roomId, userId);\n const member = this.members[userId];\n if (member?.events.member) {\n sentinel.setMembershipEvent(member.events.member, this);\n }\n this.sentinels[userId] = sentinel;\n }\n return sentinel;\n }\n\n /**\n * Get state events from the state of the room.\n * @param eventType - The event type of the state event.\n * @param stateKey - Optional. The state_key of the state event. If\n * this is `undefined` then all matching state events will be\n * returned.\n * @returns A list of events if state_key was\n * `undefined`, else a single event (or null if no match found).\n */\n public getStateEvents(eventType: EventType | string): MatrixEvent[];\n public getStateEvents(eventType: EventType | string, stateKey: string): MatrixEvent | null;\n public getStateEvents(eventType: EventType | string, stateKey?: string): MatrixEvent[] | MatrixEvent | null {\n if (!this.events.has(eventType)) {\n // no match\n return stateKey === undefined ? [] : null;\n }\n if (stateKey === undefined) {\n // return all values\n return Array.from(this.events.get(eventType)!.values());\n }\n const event = this.events.get(eventType)!.get(stateKey);\n return event ? event : null;\n }\n\n public get hasLiveBeacons(): boolean {\n return !!this.liveBeaconIds?.length;\n }\n\n public get liveBeaconIds(): BeaconIdentifier[] {\n return this._liveBeaconIds;\n }\n\n /**\n * Creates a copy of this room state so that mutations to either won't affect the other.\n * @returns the copy of the room state\n */\n public clone(): RoomState {\n const copy = new RoomState(this.roomId, this.oobMemberFlags);\n\n // Ugly hack: because setStateEvents will mark\n // members as susperseding future out of bound members\n // if loading is in progress (through oobMemberFlags)\n // since these are not new members, we're merely copying them\n // set the status to not started\n // after copying, we set back the status\n const status = this.oobMemberFlags.status;\n this.oobMemberFlags.status = OobStatus.NotStarted;\n\n Array.from(this.events.values()).forEach((eventsByStateKey) => {\n copy.setStateEvents(Array.from(eventsByStateKey.values()));\n });\n\n // Ugly hack: see above\n this.oobMemberFlags.status = status;\n\n if (this.summaryInvitedMemberCount !== null) {\n copy.setInvitedMemberCount(this.getInvitedMemberCount());\n }\n if (this.summaryJoinedMemberCount !== null) {\n copy.setJoinedMemberCount(this.getJoinedMemberCount());\n }\n\n // copy out of band flags if needed\n if (this.oobMemberFlags.status == OobStatus.Finished) {\n // copy markOutOfBand flags\n this.getMembers().forEach((member) => {\n if (member.isOutOfBand()) {\n copy.getMember(member.userId)?.markOutOfBand();\n }\n });\n }\n\n return copy;\n }\n\n /**\n * Add previously unknown state events.\n * When lazy loading members while back-paginating,\n * the relevant room state for the timeline chunk at the end\n * of the chunk can be set with this method.\n * @param events - state events to prepend\n */\n public setUnknownStateEvents(events: MatrixEvent[]): void {\n const unknownStateEvents = events.filter((event) => {\n return !this.events.has(event.getType()) || !this.events.get(event.getType())!.has(event.getStateKey()!);\n });\n\n this.setStateEvents(unknownStateEvents);\n }\n\n /**\n * Add an array of one or more state MatrixEvents, overwriting any existing\n * state with the same `{type, stateKey}` tuple. Will fire \"RoomState.events\"\n * for every event added. May fire \"RoomState.members\" if there are\n * `m.room.member` events. May fire \"RoomStateEvent.Marker\" if there are\n * `UNSTABLE_MSC2716_MARKER` events.\n * @param stateEvents - a list of state events for this room.\n *\n * @remarks\n * Fires {@link RoomStateEvent.Members}\n * Fires {@link RoomStateEvent.NewMember}\n * Fires {@link RoomStateEvent.Events}\n * Fires {@link RoomStateEvent.Marker}\n */\n public setStateEvents(stateEvents: MatrixEvent[], markerFoundOptions?: IMarkerFoundOptions): void {\n this.updateModifiedTime();\n\n // update the core event dict\n stateEvents.forEach((event) => {\n if (event.getRoomId() !== this.roomId || !event.isState()) return;\n\n if (M_BEACON_INFO.matches(event.getType())) {\n this.setBeacon(event);\n }\n\n const lastStateEvent = this.getStateEventMatching(event);\n this.setStateEvent(event);\n if (event.getType() === EventType.RoomMember) {\n this.updateDisplayNameCache(event.getStateKey()!, event.getContent().displayname ?? \"\");\n this.updateThirdPartyTokenCache(event);\n }\n this.emit(RoomStateEvent.Events, event, this, lastStateEvent);\n });\n\n this.onBeaconLivenessChange();\n // update higher level data structures. This needs to be done AFTER the\n // core event dict as these structures may depend on other state events in\n // the given array (e.g. disambiguating display names in one go to do both\n // clashing names rather than progressively which only catches 1 of them).\n stateEvents.forEach((event) => {\n if (event.getRoomId() !== this.roomId || !event.isState()) return;\n\n if (event.getType() === EventType.RoomMember) {\n const userId = event.getStateKey()!;\n\n // leave events apparently elide the displayname or avatar_url,\n // so let's fake one up so that we don't leak user ids\n // into the timeline\n if (event.getContent().membership === \"leave\" || event.getContent().membership === \"ban\") {\n event.getContent().avatar_url = event.getContent().avatar_url || event.getPrevContent().avatar_url;\n event.getContent().displayname =\n event.getContent().displayname || event.getPrevContent().displayname;\n }\n\n const member = this.getOrCreateMember(userId, event);\n member.setMembershipEvent(event, this);\n this.updateMember(member);\n this.emit(RoomStateEvent.Members, event, this, member);\n } else if (event.getType() === EventType.RoomPowerLevels) {\n // events with unknown state keys should be ignored\n // and should not aggregate onto members power levels\n if (event.getStateKey() !== \"\") {\n return;\n }\n const members = Object.values(this.members);\n members.forEach((member) => {\n // We only propagate `RoomState.members` event if the\n // power levels has been changed\n // large room suffer from large re-rendering especially when not needed\n const oldLastModified = member.getLastModifiedTime();\n member.setPowerLevelEvent(event);\n if (oldLastModified !== member.getLastModifiedTime()) {\n this.emit(RoomStateEvent.Members, event, this, member);\n }\n });\n\n // assume all our sentinels are now out-of-date\n this.sentinels = {};\n } else if (UNSTABLE_MSC2716_MARKER.matches(event.getType())) {\n this.emit(RoomStateEvent.Marker, event, markerFoundOptions);\n }\n });\n\n this.emit(RoomStateEvent.Update, this);\n }\n\n public async processBeaconEvents(events: MatrixEvent[], matrixClient: MatrixClient): Promise<void> {\n if (\n !events.length ||\n // discard locations if we have no beacons\n !this.beacons.size\n ) {\n return;\n }\n\n const beaconByEventIdDict = [...this.beacons.values()].reduce<Record<string, Beacon>>((dict, beacon) => {\n dict[beacon.beaconInfoId] = beacon;\n return dict;\n }, {});\n\n const processBeaconRelation = (beaconInfoEventId: string, event: MatrixEvent): void => {\n if (!M_BEACON.matches(event.getType())) {\n return;\n }\n\n const beacon = beaconByEventIdDict[beaconInfoEventId];\n\n if (beacon) {\n beacon.addLocations([event]);\n }\n };\n\n for (const event of events) {\n const relatedToEventId = event.getRelation()?.event_id;\n // not related to a beacon we know about; discard\n if (!relatedToEventId || !beaconByEventIdDict[relatedToEventId]) return;\n if (!M_BEACON.matches(event.getType()) && !event.isEncrypted()) return;\n\n try {\n await matrixClient.decryptEventIfNeeded(event);\n processBeaconRelation(relatedToEventId, event);\n } catch {\n if (event.isDecryptionFailure()) {\n // add an event listener for once the event is decrypted.\n event.once(MatrixEventEvent.Decrypted, async () => {\n processBeaconRelation(relatedToEventId, event);\n });\n }\n }\n }\n }\n\n /**\n * Looks up a member by the given userId, and if it doesn't exist,\n * create it and emit the `RoomState.newMember` event.\n * This method makes sure the member is added to the members dictionary\n * before emitting, as this is done from setStateEvents and setOutOfBandMember.\n * @param userId - the id of the user to look up\n * @param event - the membership event for the (new) member. Used to emit.\n * @returns the member, existing or newly created.\n *\n * @remarks\n * Fires {@link RoomStateEvent.NewMember}\n */\n private getOrCreateMember(userId: string, event: MatrixEvent): RoomMember {\n let member = this.members[userId];\n if (!member) {\n member = new RoomMember(this.roomId, userId);\n // add member to members before emitting any events,\n // as event handlers often lookup the member\n this.members[userId] = member;\n this.emit(RoomStateEvent.NewMember, event, this, member);\n }\n return member;\n }\n\n private setStateEvent(event: MatrixEvent): void {\n if (!this.events.has(event.getType())) {\n this.events.set(event.getType(), new Map());\n }\n this.events.get(event.getType())!.set(event.getStateKey()!, event);\n }\n\n /**\n * @experimental\n */\n private setBeacon(event: MatrixEvent): void {\n const beaconIdentifier = getBeaconInfoIdentifier(event);\n\n if (this.beacons.has(beaconIdentifier)) {\n const beacon = this.beacons.get(beaconIdentifier)!;\n\n if (event.isRedacted()) {\n if (beacon.beaconInfoId === (<IEvent>event.getRedactionEvent())?.redacts) {\n beacon.destroy();\n this.beacons.delete(beaconIdentifier);\n }\n return;\n }\n\n return beacon.update(event);\n }\n\n if (event.isRedacted()) {\n return;\n }\n\n const beacon = new Beacon(event);\n\n this.reEmitter.reEmit<BeaconEvent, BeaconEvent>(beacon, [\n BeaconEvent.New,\n BeaconEvent.Update,\n BeaconEvent.Destroy,\n BeaconEvent.LivenessChange,\n ]);\n\n this.emit(BeaconEvent.New, event, beacon);\n beacon.on(BeaconEvent.LivenessChange, this.onBeaconLivenessChange.bind(this));\n beacon.on(BeaconEvent.Destroy, this.onBeaconLivenessChange.bind(this));\n\n this.beacons.set(beacon.identifier, beacon);\n }\n\n /**\n * @experimental\n * Check liveness of room beacons\n * emit RoomStateEvent.BeaconLiveness event\n */\n private onBeaconLivenessChange(): void {\n this._liveBeaconIds = Array.from(this.beacons.values())\n .filter((beacon) => beacon.isLive)\n .map((beacon) => beacon.identifier);\n\n this.emit(RoomStateEvent.BeaconLiveness, this, this.hasLiveBeacons);\n }\n\n private getStateEventMatching(event: MatrixEvent): MatrixEvent | null {\n return this.events.get(event.getType())?.get(event.getStateKey()!) ?? null;\n }\n\n private updateMember(member: RoomMember): void {\n // this member may have a power level already, so set it.\n const pwrLvlEvent = this.getStateEvents(EventType.RoomPowerLevels, \"\");\n if (pwrLvlEvent) {\n member.setPowerLevelEvent(pwrLvlEvent);\n }\n\n // blow away the sentinel which is now outdated\n delete this.sentinels[member.userId];\n\n this.members[member.userId] = member;\n this.joinedMemberCount = null;\n this.invitedMemberCount = null;\n }\n\n /**\n * Get the out-of-band members loading state, whether loading is needed or not.\n * Note that loading might be in progress and hence isn't needed.\n * @returns whether or not the members of this room need to be loaded\n */\n public needsOutOfBandMembers(): boolean {\n return this.oobMemberFlags.status === OobStatus.NotStarted;\n }\n\n /**\n * Check if loading of out-of-band-members has completed\n *\n * @returns true if the full membership list of this room has been loaded. False if it is not started or is in\n * progress.\n */\n public outOfBandMembersReady(): boolean {\n return this.oobMemberFlags.status === OobStatus.Finished;\n }\n\n /**\n * Mark this room state as waiting for out-of-band members,\n * ensuring it doesn't ask for them to be requested again\n * through needsOutOfBandMembers\n */\n public markOutOfBandMembersStarted(): void {\n if (this.oobMemberFlags.status !== OobStatus.NotStarted) {\n return;\n }\n this.oobMemberFlags.status = OobStatus.InProgress;\n }\n\n /**\n * Mark this room state as having failed to fetch out-of-band members\n */\n public markOutOfBandMembersFailed(): void {\n if (this.oobMemberFlags.status !== OobStatus.InProgress) {\n return;\n }\n this.oobMemberFlags.status = OobStatus.NotStarted;\n }\n\n /**\n * Clears the loaded out-of-band members\n */\n public clearOutOfBandMembers(): void {\n let count = 0;\n Object.keys(this.members).forEach((userId) => {\n const member = this.members[userId];\n if (member.isOutOfBand()) {\n ++count;\n delete this.members[userId];\n }\n });\n logger.log(`LL: RoomState removed ${count} members...`);\n this.oobMemberFlags.status = OobStatus.NotStarted;\n }\n\n /**\n * Sets the loaded out-of-band members.\n * @param stateEvents - array of membership state events\n */\n public setOutOfBandMembers(stateEvents: MatrixEvent[]): void {\n logger.log(`LL: RoomState about to set ${stateEvents.length} OOB members ...`);\n if (this.oobMemberFlags.status !== OobStatus.InProgress) {\n return;\n }\n logger.log(`LL: RoomState put in finished state ...`);\n this.oobMemberFlags.status = OobStatus.Finished;\n stateEvents.forEach((e) => this.setOutOfBandMember(e));\n this.emit(RoomStateEvent.Update, this);\n }\n\n /**\n * Sets a single out of band member, used by both setOutOfBandMembers and clone\n * @param stateEvent - membership state event\n */\n private setOutOfBandMember(stateEvent: MatrixEvent): void {\n if (stateEvent.getType() !== EventType.RoomMember) {\n return;\n }\n const userId = stateEvent.getStateKey()!;\n const existingMember = this.getMember(userId);\n // never replace members received as part of the sync\n if (existingMember && !existingMember.isOutOfBand()) {\n return;\n }\n\n const member = this.getOrCreateMember(userId, stateEvent);\n member.setMembershipEvent(stateEvent, this);\n // needed to know which members need to be stored seperately\n // as they are not part of the sync accumulator\n // this is cleared by setMembershipEvent so when it's updated through /sync\n member.markOutOfBand();\n\n this.updateDisplayNameCache(member.userId, member.name);\n\n this.setStateEvent(stateEvent);\n this.updateMember(member);\n this.emit(RoomStateEvent.Members, stateEvent, this, member);\n }\n\n /**\n * Set the current typing event for this room.\n * @param event - The typing event\n */\n public setTypingEvent(event: MatrixEvent): void {\n Object.values(this.members).forEach(function (member) {\n member.setTypingEvent(event);\n });\n }\n\n /**\n * Get the m.room.member event which has the given third party invite token.\n *\n * @param token - The token\n * @returns The m.room.member event or null\n */\n public getInviteForThreePidToken(token: string): MatrixEvent | null {\n return this.tokenToInvite[token] || null;\n }\n\n /**\n * Update the last modified time to the current time.\n */\n private updateModifiedTime(): void {\n this.modified = Date.now();\n }\n\n /**\n * Get the timestamp when this room state was last updated. This timestamp is\n * updated when this object has received new state events.\n * @returns The timestamp\n */\n public getLastModifiedTime(): number {\n return this.modified;\n }\n\n /**\n * Get user IDs with the specified or similar display names.\n * @param displayName - The display name to get user IDs from.\n * @returns An array of user IDs or an empty array.\n */\n public getUserIdsWithDisplayName(displayName: string): string[] {\n return this.displayNameToUserIds.get(removeHiddenChars(displayName)) ?? [];\n }\n\n /**\n * Returns true if userId is in room, event is not redacted and either sender of\n * mxEvent or has power level sufficient to redact events other than their own.\n * @param mxEvent - The event to test permission for\n * @param userId - The user ID of the user to test permission for\n * @returns true if the given used ID can redact given event\n */\n public maySendRedactionForEvent(mxEvent: MatrixEvent, userId: string): boolean {\n const member = this.getMember(userId);\n if (!member || member.membership === \"leave\") return false;\n\n if (mxEvent.status || mxEvent.isRedacted()) return false;\n\n // The user may have been the sender, but they can't redact their own message\n // if redactions are blocked.\n const canRedact = this.maySendEvent(EventType.RoomRedaction, userId);\n if (mxEvent.getSender() === userId) return canRedact;\n\n return this.hasSufficientPowerLevelFor(\"redact\", member.powerLevel);\n }\n\n /**\n * Returns true if the given power level is sufficient for action\n * @param action - The type of power level to check\n * @param powerLevel - The power level of the member\n * @returns true if the given power level is sufficient\n */\n public hasSufficientPowerLevelFor(action: \"ban\" | \"kick\" | \"redact\", powerLevel: number): boolean {\n const powerLevelsEvent = this.getStateEvents(EventType.RoomPowerLevels, \"\");\n\n let powerLevels: IPowerLevelsContent = {};\n if (powerLevelsEvent) {\n powerLevels = powerLevelsEvent.getContent();\n }\n\n let requiredLevel = 50;\n if (isNumber(powerLevels[action])) {\n requiredLevel = powerLevels[action]!;\n }\n\n return powerLevel >= requiredLevel;\n }\n\n /**\n * Short-form for maySendEvent('m.room.message', userId)\n * @param userId - The user ID of the user to test permission for\n * @returns true if the given user ID should be permitted to send\n * message events into the given room.\n */\n public maySendMessage(userId: string): boolean {\n return this.maySendEventOfType(EventType.RoomMessage, userId, false);\n }\n\n /**\n * Returns true if the given user ID has permission to send a normal\n * event of type `eventType` into this room.\n * @param eventType - The type of event to test\n * @param userId - The user ID of the user to test permission for\n * @returns true if the given user ID should be permitted to send\n * the given type of event into this room,\n * according to the room's state.\n */\n public maySendEvent(eventType: EventType | string, userId: string): boolean {\n return this.maySendEventOfType(eventType, userId, false);\n }\n\n /**\n * Returns true if the given MatrixClient has permission to send a state\n * event of type `stateEventType` into this room.\n * @param stateEventType - The type of state events to test\n * @param cli - The client to test permission for\n * @returns true if the given client should be permitted to send\n * the given type of state event into this room,\n * according to the room's state.\n */\n public mayClientSendStateEvent(stateEventType: EventType | string, cli: MatrixClient): boolean {\n if (cli.isGuest() || !cli.credentials.userId) {\n return false;\n }\n return this.maySendStateEvent(stateEventType, cli.credentials.userId);\n }\n\n /**\n * Returns true if the given user ID has permission to send a state\n * event of type `stateEventType` into this room.\n * @param stateEventType - The type of state events to test\n * @param userId - The user ID of the user to test permission for\n * @returns true if the given user ID should be permitted to send\n * the given type of state event into this room,\n * according to the room's state.\n */\n public maySendStateEvent(stateEventType: EventType | string, userId: string): boolean {\n return this.maySendEventOfType(stateEventType, userId, true);\n }\n\n /**\n * Returns true if the given user ID has permission to send a normal or state\n * event of type `eventType` into this room.\n * @param eventType - The type of event to test\n * @param userId - The user ID of the user to test permission for\n * @param state - If true, tests if the user may send a state\n event of this type. Otherwise tests whether\n they may send a regular event.\n * @returns true if the given user ID should be permitted to send\n * the given type of event into this room,\n * according to the room's state.\n */\n private maySendEventOfType(eventType: EventType | string, userId: string, state: boolean): boolean {\n const powerLevelsEvent = this.getStateEvents(EventType.RoomPowerLevels, \"\");\n\n let powerLevels: IPowerLevelsContent;\n let eventsLevels: Record<EventType | string, number> = {};\n\n let stateDefault = 0;\n let eventsDefault = 0;\n let powerLevel = 0;\n if (powerLevelsEvent) {\n powerLevels = powerLevelsEvent.getContent();\n eventsLevels = powerLevels.events || {};\n\n if (Number.isSafeInteger(powerLevels.state_default)) {\n stateDefault = powerLevels.state_default!;\n } else {\n stateDefault = 50;\n }\n\n const userPowerLevel = powerLevels.users && powerLevels.users[userId];\n if (Number.isSafeInteger(userPowerLevel)) {\n powerLevel = userPowerLevel!;\n } else if (Number.isSafeInteger(powerLevels.users_default)) {\n powerLevel = powerLevels.users_default!;\n }\n\n if (Number.isSafeInteger(powerLevels.events_default)) {\n eventsDefault = powerLevels.events_default!;\n }\n }\n\n let requiredLevel = state ? stateDefault : eventsDefault;\n if (Number.isSafeInteger(eventsLevels[eventType])) {\n requiredLevel = eventsLevels[eventType];\n }\n return powerLevel >= requiredLevel;\n }\n\n /**\n * Returns true if the given user ID has permission to trigger notification\n * of type `notifLevelKey`\n * @param notifLevelKey - The level of notification to test (eg. 'room')\n * @param userId - The user ID of the user to test permission for\n * @returns true if the given user ID has permission to trigger a\n * notification of this type.\n */\n public mayTriggerNotifOfType(notifLevelKey: string, userId: string): boolean {\n const member = this.getMember(userId);\n if (!member) {\n return false;\n }\n\n const powerLevelsEvent = this.getStateEvents(EventType.RoomPowerLevels, \"\");\n\n let notifLevel = 50;\n if (\n powerLevelsEvent &&\n powerLevelsEvent.getContent() &&\n powerLevelsEvent.getContent().notifications &&\n isNumber(powerLevelsEvent.getContent().notifications[notifLevelKey])\n ) {\n notifLevel = powerLevelsEvent.getContent().notifications[notifLevelKey];\n }\n\n return member.powerLevel >= notifLevel;\n }\n\n /**\n * Returns the join rule based on the m.room.join_rule state event, defaulting to `invite`.\n * @returns the join_rule applied to this room\n */\n public getJoinRule(): JoinRule {\n const joinRuleEvent = this.getStateEvents(EventType.RoomJoinRules, \"\");\n const joinRuleContent: Partial<IJoinRuleEventContent> = joinRuleEvent?.getContent() ?? {};\n return joinRuleContent[\"join_rule\"] || JoinRule.Invite;\n }\n\n /**\n * Returns the history visibility based on the m.room.history_visibility state event, defaulting to `shared`.\n * @returns the history_visibility applied to this room\n */\n public getHistoryVisibility(): HistoryVisibility {\n const historyVisibilityEvent = this.getStateEvents(EventType.RoomHistoryVisibility, \"\");\n const historyVisibilityContent = historyVisibilityEvent?.getContent() ?? {};\n return historyVisibilityContent[\"history_visibility\"] || HistoryVisibility.Shared;\n }\n\n /**\n * Returns the guest access based on the m.room.guest_access state event, defaulting to `shared`.\n * @returns the guest_access applied to this room\n */\n public getGuestAccess(): GuestAccess {\n const guestAccessEvent = this.getStateEvents(EventType.RoomGuestAccess, \"\");\n const guestAccessContent = guestAccessEvent?.getContent() ?? {};\n return guestAccessContent[\"guest_access\"] || GuestAccess.Forbidden;\n }\n\n /**\n * Find the predecessor room based on this room state.\n *\n * @param msc3946ProcessDynamicPredecessor - if true, look for an\n * m.room.predecessor state event and use it if found (MSC3946).\n * @returns null if this room has no predecessor. Otherwise, returns\n * the roomId, last eventId and viaServers of the predecessor room.\n *\n * If msc3946ProcessDynamicPredecessor is true, use m.predecessor events\n * as well as m.room.create events to find predecessors.\n *\n * Note: if an m.predecessor event is used, eventId may be undefined\n * since last_known_event_id is optional.\n *\n * Note: viaServers may be undefined, and will definitely be undefined if\n * this predecessor comes from a RoomCreate event (rather than a\n * RoomPredecessor, which has the optional via_servers property).\n */\n public findPredecessor(\n msc3946ProcessDynamicPredecessor = false,\n ): { roomId: string; eventId?: string; viaServers?: string[] } | null {\n // Note: the tests for this function are against Room.findPredecessor,\n // which just calls through to here.\n\n if (msc3946ProcessDynamicPredecessor) {\n const predecessorEvent = this.getStateEvents(EventType.RoomPredecessor, \"\");\n if (predecessorEvent) {\n const content = predecessorEvent.getContent<{\n predecessor_room_id: string;\n last_known_event_id?: string;\n via_servers?: string[];\n }>();\n const roomId = content.predecessor_room_id;\n let eventId = content.last_known_event_id;\n if (typeof eventId !== \"string\") {\n eventId = undefined;\n }\n let viaServers = content.via_servers;\n if (!Array.isArray(viaServers)) {\n viaServers = undefined;\n }\n if (typeof roomId === \"string\") {\n return { roomId, eventId, viaServers };\n }\n }\n }\n\n const createEvent = this.getStateEvents(EventType.RoomCreate, \"\");\n if (createEvent) {\n const predecessor = createEvent.getContent<{\n predecessor?: Partial<{\n room_id: string;\n event_id: string;\n }>;\n }>()[\"predecessor\"];\n if (predecessor) {\n const roomId = predecessor[\"room_id\"];\n if (typeof roomId === \"string\") {\n let eventId = predecessor[\"event_id\"];\n if (typeof eventId !== \"string\" || eventId === \"\") {\n eventId = undefined;\n }\n return { roomId, eventId };\n }\n }\n }\n return null;\n }\n\n private updateThirdPartyTokenCache(memberEvent: MatrixEvent): void {\n if (!memberEvent.getContent().third_party_invite) {\n return;\n }\n const token = (memberEvent.getContent().third_party_invite.signed || {}).token;\n if (!token) {\n return;\n }\n const threePidInvite = this.getStateEvents(EventType.RoomThirdPartyInvite, token);\n if (!threePidInvite) {\n return;\n }\n this.tokenToInvite[token] = memberEvent;\n }\n\n private updateDisplayNameCache(userId: string, displayName: string): void {\n const oldName = this.userIdsToDisplayNames[userId];\n delete this.userIdsToDisplayNames[userId];\n if (oldName) {\n // Remove the old name from the cache.\n // We clobber the user_id > name lookup but the name -> [user_id] lookup\n // means we need to remove that user ID from that array rather than nuking\n // the lot.\n const strippedOldName = removeHiddenChars(oldName);\n\n const existingUserIds = this.displayNameToUserIds.get(strippedOldName);\n if (existingUserIds) {\n // remove this user ID from this array\n const filteredUserIDs = existingUserIds.filter((id) => id !== userId);\n this.displayNameToUserIds.set(strippedOldName, filteredUserIDs);\n }\n }\n\n this.userIdsToDisplayNames[userId] = displayName;\n\n const strippedDisplayname = displayName && removeHiddenChars(displayName);\n // an empty stripped displayname (undefined/'') will be set to MXID in room-member.js\n if (strippedDisplayname) {\n const arr = this.displayNameToUserIds.get(strippedDisplayname) ?? [];\n arr.push(userId);\n this.displayNameToUserIds.set(strippedDisplayname, arr);\n }\n }\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"room-state.js","names":["_roomMember","require","_logger","_utils","_event","_event2","_partials","_typedEventEmitter","_beacon","_ReEmitter","_beacon2","OobStatus","RoomStateEvent","exports","RoomState","TypedEventEmitter","constructor","roomId","oobMemberFlags","status","NotStarted","_defineProperty2","default","TypedReEmitter","Map","updateModifiedTime","getJoinedMemberCount","summaryJoinedMemberCount","joinedMemberCount","getMembers","reduce","count","m","membership","setJoinedMemberCount","getInvitedMemberCount","summaryInvitedMemberCount","invitedMemberCount","setInvitedMemberCount","Object","values","members","getMembersExcept","excludedIds","filter","includes","userId","getMember","getSentinelMember","sentinel","sentinels","undefined","RoomMember","member","events","setMembershipEvent","getStateEvents","eventType","stateKey","has","Array","from","get","event","hasLiveBeacons","_this$liveBeaconIds","liveBeaconIds","length","_liveBeaconIds","clone","copy","forEach","eventsByStateKey","setStateEvents","Finished","isOutOfBand","_copy$getMember","markOutOfBand","setUnknownStateEvents","unknownStateEvents","getType","getStateKey","stateEvents","markerFoundOptions","getRoomId","isState","M_BEACON_INFO","matches","setBeacon","lastStateEvent","getStateEventMatching","setStateEvent","EventType","_event$getContent$dis","updateDisplayNameCache","getContent","displayname","updateThirdPartyTokenCache","emit","Events","onBeaconLivenessChange","avatar_url","getPrevContent","getOrCreateMember","updateMember","Members","RoomPowerLevels","oldLastModified","getLastModifiedTime","setPowerLevelEvent","UNSTABLE_MSC2716_MARKER","Marker","Update","processBeaconEvents","matrixClient","beacons","size","beaconByEventIdDict","dict","beacon","beaconInfoId","processBeaconRelation","beaconInfoEventId","M_BEACON","addLocations","_event$getRelation","relatedToEventId","getRelation","event_id","isEncrypted","decryptEventIfNeeded","isDecryptionFailure","once","MatrixEventEvent","Decrypted","NewMember","set","beaconIdentifier","getBeaconInfoIdentifier","isRedacted","_event$getRedactionEv","getRedactionEvent","redacts","destroy","delete","update","Beacon","reEmitter","reEmit","BeaconEvent","New","Destroy","LivenessChange","on","bind","identifier","isLive","map","BeaconLiveness","_this$events$get$get","_this$events$get","pwrLvlEvent","needsOutOfBandMembers","outOfBandMembersReady","markOutOfBandMembersStarted","InProgress","markOutOfBandMembersFailed","clearOutOfBandMembers","keys","logger","log","setOutOfBandMembers","e","setOutOfBandMember","stateEvent","existingMember","name","setTypingEvent","getInviteForThreePidToken","token","tokenToInvite","modified","Date","now","getUserIdsWithDisplayName","displayName","_this$displayNameToUs","displayNameToUserIds","removeHiddenChars","maySendRedactionForEvent","mxEvent","canRedact","maySendEvent","RoomRedaction","getSender","hasSufficientPowerLevelFor","powerLevel","action","powerLevelsEvent","powerLevels","requiredLevel","isNumber","maySendMessage","maySendEventOfType","RoomMessage","mayClientSendStateEvent","stateEventType","cli","isGuest","credentials","maySendStateEvent","state","eventsLevels","stateDefault","eventsDefault","Number","isSafeInteger","state_default","userPowerLevel","users","users_default","events_default","mayTriggerNotifOfType","notifLevelKey","notifLevel","notifications","getJoinRule","_joinRuleEvent$getCon","joinRuleEvent","RoomJoinRules","joinRuleContent","JoinRule","Invite","getHistoryVisibility","_historyVisibilityEve","historyVisibilityEvent","RoomHistoryVisibility","historyVisibilityContent","HistoryVisibility","Shared","getGuestAccess","_guestAccessEvent$get","guestAccessEvent","RoomGuestAccess","guestAccessContent","GuestAccess","Forbidden","findPredecessor","msc3946ProcessDynamicPredecessor","predecessorEvent","RoomPredecessor","content","predecessor_room_id","eventId","last_known_event_id","viaServers","via_servers","isArray","createEvent","RoomCreate","predecessor","memberEvent","third_party_invite","signed","threePidInvite","RoomThirdPartyInvite","oldName","userIdsToDisplayNames","strippedOldName","existingUserIds","filteredUserIDs","id","strippedDisplayname","_this$displayNameToUs2","arr","push"],"sources":["../../src/models/room-state.ts"],"sourcesContent":["/*\nCopyright 2015 - 2021 The Matrix.org Foundation C.I.C.\n\nLicensed under the Apache License, Version 2.0 (the \"License\");\nyou may not use this file except in compliance with the License.\nYou may obtain a copy of the License at\n\n http://www.apache.org/licenses/LICENSE-2.0\n\nUnless required by applicable law or agreed to in writing, software\ndistributed under the License is distributed on an \"AS IS\" BASIS,\nWITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\nSee the License for the specific language governing permissions and\nlimitations under the License.\n*/\n\nimport { RoomMember } from \"./room-member\";\nimport { logger } from \"../logger\";\nimport { isNumber, removeHiddenChars } from \"../utils\";\nimport { EventType, UNSTABLE_MSC2716_MARKER } from \"../@types/event\";\nimport { IEvent, MatrixEvent, MatrixEventEvent } from \"./event\";\nimport { MatrixClient } from \"../client\";\nimport { GuestAccess, HistoryVisibility, IJoinRuleEventContent, JoinRule } from \"../@types/partials\";\nimport { TypedEventEmitter } from \"./typed-event-emitter\";\nimport { Beacon, BeaconEvent, BeaconEventHandlerMap, getBeaconInfoIdentifier, BeaconIdentifier } from \"./beacon\";\nimport { TypedReEmitter } from \"../ReEmitter\";\nimport { M_BEACON, M_BEACON_INFO } from \"../@types/beacon\";\n\nexport interface IMarkerFoundOptions {\n /** Whether the timeline was empty before the marker event arrived in the\n * room. This could be happen in a variety of cases:\n * 1. From the initial sync\n * 2. It's the first state we're seeing after joining the room\n * 3. Or whether it's coming from `syncFromCache`\n *\n * A marker event refers to `UNSTABLE_MSC2716_MARKER` and indicates that\n * history was imported somewhere back in time. It specifically points to an\n * MSC2716 insertion event where the history was imported at. Marker events\n * are sent as state events so they are easily discoverable by clients and\n * homeservers and don't get lost in timeline gaps.\n */\n timelineWasEmpty?: boolean;\n}\n\n// possible statuses for out-of-band member loading\nenum OobStatus {\n NotStarted,\n InProgress,\n Finished,\n}\n\nexport interface IPowerLevelsContent {\n users?: Record<string, number>;\n events?: Record<string, number>;\n // eslint-disable-next-line camelcase\n users_default?: number;\n // eslint-disable-next-line camelcase\n events_default?: number;\n // eslint-disable-next-line camelcase\n state_default?: number;\n ban?: number;\n kick?: number;\n redact?: number;\n}\n\nexport enum RoomStateEvent {\n Events = \"RoomState.events\",\n Members = \"RoomState.members\",\n NewMember = \"RoomState.newMember\",\n Update = \"RoomState.update\", // signals batches of updates without specificity\n BeaconLiveness = \"RoomState.BeaconLiveness\",\n Marker = \"RoomState.Marker\",\n}\n\nexport type RoomStateEventHandlerMap = {\n /**\n * Fires whenever the event dictionary in room state is updated.\n * @param event - The matrix event which caused this event to fire.\n * @param state - The room state whose RoomState.events dictionary\n * was updated.\n * @param prevEvent - The event being replaced by the new state, if\n * known. Note that this can differ from `getPrevContent()` on the new state event\n * as this is the store's view of the last state, not the previous state provided\n * by the server.\n * @example\n * ```\n * matrixClient.on(\"RoomState.events\", function(event, state, prevEvent){\n * var newStateEvent = event;\n * });\n * ```\n */\n [RoomStateEvent.Events]: (event: MatrixEvent, state: RoomState, lastStateEvent: MatrixEvent | null) => void;\n /**\n * Fires whenever a member in the members dictionary is updated in any way.\n * @param event - The matrix event which caused this event to fire.\n * @param state - The room state whose RoomState.members dictionary\n * was updated.\n * @param member - The room member that was updated.\n * @example\n * ```\n * matrixClient.on(\"RoomState.members\", function(event, state, member){\n * var newMembershipState = member.membership;\n * });\n * ```\n */\n [RoomStateEvent.Members]: (event: MatrixEvent, state: RoomState, member: RoomMember) => void;\n /**\n * Fires whenever a member is added to the members dictionary. The RoomMember\n * will not be fully populated yet (e.g. no membership state) but will already\n * be available in the members dictionary.\n * @param event - The matrix event which caused this event to fire.\n * @param state - The room state whose RoomState.members dictionary\n * was updated with a new entry.\n * @param member - The room member that was added.\n * @example\n * ```\n * matrixClient.on(\"RoomState.newMember\", function(event, state, member){\n * // add event listeners on 'member'\n * });\n * ```\n */\n [RoomStateEvent.NewMember]: (event: MatrixEvent, state: RoomState, member: RoomMember) => void;\n [RoomStateEvent.Update]: (state: RoomState) => void;\n [RoomStateEvent.BeaconLiveness]: (state: RoomState, hasLiveBeacons: boolean) => void;\n [RoomStateEvent.Marker]: (event: MatrixEvent, setStateOptions?: IMarkerFoundOptions) => void;\n [BeaconEvent.New]: (event: MatrixEvent, beacon: Beacon) => void;\n};\n\ntype EmittedEvents = RoomStateEvent | BeaconEvent;\ntype EventHandlerMap = RoomStateEventHandlerMap & BeaconEventHandlerMap;\n\nexport class RoomState extends TypedEventEmitter<EmittedEvents, EventHandlerMap> {\n public readonly reEmitter = new TypedReEmitter<EmittedEvents, EventHandlerMap>(this);\n private sentinels: Record<string, RoomMember> = {}; // userId: RoomMember\n // stores fuzzy matches to a list of userIDs (applies utils.removeHiddenChars to keys)\n private displayNameToUserIds = new Map<string, string[]>();\n private userIdsToDisplayNames: Record<string, string> = {};\n private tokenToInvite: Record<string, MatrixEvent> = {}; // 3pid invite state_key to m.room.member invite\n private joinedMemberCount: number | null = null; // cache of the number of joined members\n // joined members count from summary api\n // once set, we know the server supports the summary api\n // and we should only trust that\n // we could also only trust that before OOB members\n // are loaded but doesn't seem worth the hassle atm\n private summaryJoinedMemberCount: number | null = null;\n // same for invited member count\n private invitedMemberCount: number | null = null;\n private summaryInvitedMemberCount: number | null = null;\n private modified = -1;\n\n // XXX: Should be read-only\n // The room member dictionary, keyed on the user's ID.\n public members: Record<string, RoomMember> = {}; // userId: RoomMember\n // The state events dictionary, keyed on the event type and then the state_key value.\n public events = new Map<string, Map<string, MatrixEvent>>(); // Map<eventType, Map<stateKey, MatrixEvent>>\n // The pagination token for this state.\n public paginationToken: string | null = null;\n\n public readonly beacons = new Map<BeaconIdentifier, Beacon>();\n private _liveBeaconIds: BeaconIdentifier[] = [];\n\n /**\n * Construct room state.\n *\n * Room State represents the state of the room at a given point.\n * It can be mutated by adding state events to it.\n * There are two types of room member associated with a state event:\n * normal member objects (accessed via getMember/getMembers) which mutate\n * with the state to represent the current state of that room/user, e.g.\n * the object returned by `getMember('@bob:example.com')` will mutate to\n * get a different display name if Bob later changes his display name\n * in the room.\n * There are also 'sentinel' members (accessed via getSentinelMember).\n * These also represent the state of room members at the point in time\n * represented by the RoomState object, but unlike objects from getMember,\n * sentinel objects will always represent the room state as at the time\n * getSentinelMember was called, so if Bob subsequently changes his display\n * name, a room member object previously acquired with getSentinelMember\n * will still have his old display name. Calling getSentinelMember again\n * after the display name change will return a new RoomMember object\n * with Bob's new display name.\n *\n * @param roomId - Optional. The ID of the room which has this state.\n * If none is specified it just tracks paginationTokens, useful for notifTimelineSet\n * @param oobMemberFlags - Optional. The state of loading out of bound members.\n * As the timeline might get reset while they are loading, this state needs to be inherited\n * and shared when the room state is cloned for the new timeline.\n * This should only be passed from clone.\n */\n public constructor(public readonly roomId: string, private oobMemberFlags = { status: OobStatus.NotStarted }) {\n super();\n this.updateModifiedTime();\n }\n\n /**\n * Returns the number of joined members in this room\n * This method caches the result.\n * @returns The number of members in this room whose membership is 'join'\n */\n public getJoinedMemberCount(): number {\n if (this.summaryJoinedMemberCount !== null) {\n return this.summaryJoinedMemberCount;\n }\n if (this.joinedMemberCount === null) {\n this.joinedMemberCount = this.getMembers().reduce((count, m) => {\n return m.membership === \"join\" ? count + 1 : count;\n }, 0);\n }\n return this.joinedMemberCount;\n }\n\n /**\n * Set the joined member count explicitly (like from summary part of the sync response)\n * @param count - the amount of joined members\n */\n public setJoinedMemberCount(count: number): void {\n this.summaryJoinedMemberCount = count;\n }\n\n /**\n * Returns the number of invited members in this room\n * @returns The number of members in this room whose membership is 'invite'\n */\n public getInvitedMemberCount(): number {\n if (this.summaryInvitedMemberCount !== null) {\n return this.summaryInvitedMemberCount;\n }\n if (this.invitedMemberCount === null) {\n this.invitedMemberCount = this.getMembers().reduce((count, m) => {\n return m.membership === \"invite\" ? count + 1 : count;\n }, 0);\n }\n return this.invitedMemberCount;\n }\n\n /**\n * Set the amount of invited members in this room\n * @param count - the amount of invited members\n */\n public setInvitedMemberCount(count: number): void {\n this.summaryInvitedMemberCount = count;\n }\n\n /**\n * Get all RoomMembers in this room.\n * @returns A list of RoomMembers.\n */\n public getMembers(): RoomMember[] {\n return Object.values(this.members);\n }\n\n /**\n * Get all RoomMembers in this room, excluding the user IDs provided.\n * @param excludedIds - The user IDs to exclude.\n * @returns A list of RoomMembers.\n */\n public getMembersExcept(excludedIds: string[]): RoomMember[] {\n return this.getMembers().filter((m) => !excludedIds.includes(m.userId));\n }\n\n /**\n * Get a room member by their user ID.\n * @param userId - The room member's user ID.\n * @returns The member or null if they do not exist.\n */\n public getMember(userId: string): RoomMember | null {\n return this.members[userId] || null;\n }\n\n /**\n * Get a room member whose properties will not change with this room state. You\n * typically want this if you want to attach a RoomMember to a MatrixEvent which\n * may no longer be represented correctly by Room.currentState or Room.oldState.\n * The term 'sentinel' refers to the fact that this RoomMember is an unchanging\n * guardian for state at this particular point in time.\n * @param userId - The room member's user ID.\n * @returns The member or null if they do not exist.\n */\n public getSentinelMember(userId: string): RoomMember | null {\n if (!userId) return null;\n let sentinel = this.sentinels[userId];\n\n if (sentinel === undefined) {\n sentinel = new RoomMember(this.roomId, userId);\n const member = this.members[userId];\n if (member?.events.member) {\n sentinel.setMembershipEvent(member.events.member, this);\n }\n this.sentinels[userId] = sentinel;\n }\n return sentinel;\n }\n\n /**\n * Get state events from the state of the room.\n * @param eventType - The event type of the state event.\n * @param stateKey - Optional. The state_key of the state event. If\n * this is `undefined` then all matching state events will be\n * returned.\n * @returns A list of events if state_key was\n * `undefined`, else a single event (or null if no match found).\n */\n public getStateEvents(eventType: EventType | string): MatrixEvent[];\n public getStateEvents(eventType: EventType | string, stateKey: string): MatrixEvent | null;\n public getStateEvents(eventType: EventType | string, stateKey?: string): MatrixEvent[] | MatrixEvent | null {\n if (!this.events.has(eventType)) {\n // no match\n return stateKey === undefined ? [] : null;\n }\n if (stateKey === undefined) {\n // return all values\n return Array.from(this.events.get(eventType)!.values());\n }\n const event = this.events.get(eventType)!.get(stateKey);\n return event ? event : null;\n }\n\n public get hasLiveBeacons(): boolean {\n return !!this.liveBeaconIds?.length;\n }\n\n public get liveBeaconIds(): BeaconIdentifier[] {\n return this._liveBeaconIds;\n }\n\n /**\n * Creates a copy of this room state so that mutations to either won't affect the other.\n * @returns the copy of the room state\n */\n public clone(): RoomState {\n const copy = new RoomState(this.roomId, this.oobMemberFlags);\n\n // Ugly hack: because setStateEvents will mark\n // members as susperseding future out of bound members\n // if loading is in progress (through oobMemberFlags)\n // since these are not new members, we're merely copying them\n // set the status to not started\n // after copying, we set back the status\n const status = this.oobMemberFlags.status;\n this.oobMemberFlags.status = OobStatus.NotStarted;\n\n Array.from(this.events.values()).forEach((eventsByStateKey) => {\n copy.setStateEvents(Array.from(eventsByStateKey.values()));\n });\n\n // Ugly hack: see above\n this.oobMemberFlags.status = status;\n\n if (this.summaryInvitedMemberCount !== null) {\n copy.setInvitedMemberCount(this.getInvitedMemberCount());\n }\n if (this.summaryJoinedMemberCount !== null) {\n copy.setJoinedMemberCount(this.getJoinedMemberCount());\n }\n\n // copy out of band flags if needed\n if (this.oobMemberFlags.status == OobStatus.Finished) {\n // copy markOutOfBand flags\n this.getMembers().forEach((member) => {\n if (member.isOutOfBand()) {\n copy.getMember(member.userId)?.markOutOfBand();\n }\n });\n }\n\n return copy;\n }\n\n /**\n * Add previously unknown state events.\n * When lazy loading members while back-paginating,\n * the relevant room state for the timeline chunk at the end\n * of the chunk can be set with this method.\n * @param events - state events to prepend\n */\n public setUnknownStateEvents(events: MatrixEvent[]): void {\n const unknownStateEvents = events.filter((event) => {\n return !this.events.has(event.getType()) || !this.events.get(event.getType())!.has(event.getStateKey()!);\n });\n\n this.setStateEvents(unknownStateEvents);\n }\n\n /**\n * Add an array of one or more state MatrixEvents, overwriting any existing\n * state with the same `{type, stateKey}` tuple. Will fire \"RoomState.events\"\n * for every event added. May fire \"RoomState.members\" if there are\n * `m.room.member` events. May fire \"RoomStateEvent.Marker\" if there are\n * `UNSTABLE_MSC2716_MARKER` events.\n * @param stateEvents - a list of state events for this room.\n *\n * @remarks\n * Fires {@link RoomStateEvent.Members}\n * Fires {@link RoomStateEvent.NewMember}\n * Fires {@link RoomStateEvent.Events}\n * Fires {@link RoomStateEvent.Marker}\n */\n public setStateEvents(stateEvents: MatrixEvent[], markerFoundOptions?: IMarkerFoundOptions): void {\n this.updateModifiedTime();\n\n // update the core event dict\n stateEvents.forEach((event) => {\n if (event.getRoomId() !== this.roomId || !event.isState()) return;\n\n if (M_BEACON_INFO.matches(event.getType())) {\n this.setBeacon(event);\n }\n\n const lastStateEvent = this.getStateEventMatching(event);\n this.setStateEvent(event);\n if (event.getType() === EventType.RoomMember) {\n this.updateDisplayNameCache(event.getStateKey()!, event.getContent().displayname ?? \"\");\n this.updateThirdPartyTokenCache(event);\n }\n this.emit(RoomStateEvent.Events, event, this, lastStateEvent);\n });\n\n this.onBeaconLivenessChange();\n // update higher level data structures. This needs to be done AFTER the\n // core event dict as these structures may depend on other state events in\n // the given array (e.g. disambiguating display names in one go to do both\n // clashing names rather than progressively which only catches 1 of them).\n stateEvents.forEach((event) => {\n if (event.getRoomId() !== this.roomId || !event.isState()) return;\n\n if (event.getType() === EventType.RoomMember) {\n const userId = event.getStateKey()!;\n\n // leave events apparently elide the displayname or avatar_url,\n // so let's fake one up so that we don't leak user ids\n // into the timeline\n if (event.getContent().membership === \"leave\" || event.getContent().membership === \"ban\") {\n event.getContent().avatar_url = event.getContent().avatar_url || event.getPrevContent().avatar_url;\n event.getContent().displayname =\n event.getContent().displayname || event.getPrevContent().displayname;\n }\n\n const member = this.getOrCreateMember(userId, event);\n member.setMembershipEvent(event, this);\n this.updateMember(member);\n this.emit(RoomStateEvent.Members, event, this, member);\n } else if (event.getType() === EventType.RoomPowerLevels) {\n // events with unknown state keys should be ignored\n // and should not aggregate onto members power levels\n if (event.getStateKey() !== \"\") {\n return;\n }\n const members = Object.values(this.members);\n members.forEach((member) => {\n // We only propagate `RoomState.members` event if the\n // power levels has been changed\n // large room suffer from large re-rendering especially when not needed\n const oldLastModified = member.getLastModifiedTime();\n member.setPowerLevelEvent(event);\n if (oldLastModified !== member.getLastModifiedTime()) {\n this.emit(RoomStateEvent.Members, event, this, member);\n }\n });\n\n // assume all our sentinels are now out-of-date\n this.sentinels = {};\n } else if (UNSTABLE_MSC2716_MARKER.matches(event.getType())) {\n this.emit(RoomStateEvent.Marker, event, markerFoundOptions);\n }\n });\n\n this.emit(RoomStateEvent.Update, this);\n }\n\n public async processBeaconEvents(events: MatrixEvent[], matrixClient: MatrixClient): Promise<void> {\n if (\n !events.length ||\n // discard locations if we have no beacons\n !this.beacons.size\n ) {\n return;\n }\n\n const beaconByEventIdDict = [...this.beacons.values()].reduce<Record<string, Beacon>>((dict, beacon) => {\n dict[beacon.beaconInfoId] = beacon;\n return dict;\n }, {});\n\n const processBeaconRelation = (beaconInfoEventId: string, event: MatrixEvent): void => {\n if (!M_BEACON.matches(event.getType())) {\n return;\n }\n\n const beacon = beaconByEventIdDict[beaconInfoEventId];\n\n if (beacon) {\n beacon.addLocations([event]);\n }\n };\n\n for (const event of events) {\n const relatedToEventId = event.getRelation()?.event_id;\n // not related to a beacon we know about; discard\n if (!relatedToEventId || !beaconByEventIdDict[relatedToEventId]) return;\n if (!M_BEACON.matches(event.getType()) && !event.isEncrypted()) return;\n\n try {\n await matrixClient.decryptEventIfNeeded(event);\n processBeaconRelation(relatedToEventId, event);\n } catch {\n if (event.isDecryptionFailure()) {\n // add an event listener for once the event is decrypted.\n event.once(MatrixEventEvent.Decrypted, async () => {\n processBeaconRelation(relatedToEventId, event);\n });\n }\n }\n }\n }\n\n /**\n * Looks up a member by the given userId, and if it doesn't exist,\n * create it and emit the `RoomState.newMember` event.\n * This method makes sure the member is added to the members dictionary\n * before emitting, as this is done from setStateEvents and setOutOfBandMember.\n * @param userId - the id of the user to look up\n * @param event - the membership event for the (new) member. Used to emit.\n * @returns the member, existing or newly created.\n *\n * @remarks\n * Fires {@link RoomStateEvent.NewMember}\n */\n private getOrCreateMember(userId: string, event: MatrixEvent): RoomMember {\n let member = this.members[userId];\n if (!member) {\n member = new RoomMember(this.roomId, userId);\n // add member to members before emitting any events,\n // as event handlers often lookup the member\n this.members[userId] = member;\n this.emit(RoomStateEvent.NewMember, event, this, member);\n }\n return member;\n }\n\n private setStateEvent(event: MatrixEvent): void {\n if (!this.events.has(event.getType())) {\n this.events.set(event.getType(), new Map());\n }\n this.events.get(event.getType())!.set(event.getStateKey()!, event);\n }\n\n /**\n * @experimental\n */\n private setBeacon(event: MatrixEvent): void {\n const beaconIdentifier = getBeaconInfoIdentifier(event);\n\n if (this.beacons.has(beaconIdentifier)) {\n const beacon = this.beacons.get(beaconIdentifier)!;\n\n if (event.isRedacted()) {\n if (beacon.beaconInfoId === (<IEvent>event.getRedactionEvent())?.redacts) {\n beacon.destroy();\n this.beacons.delete(beaconIdentifier);\n }\n return;\n }\n\n return beacon.update(event);\n }\n\n if (event.isRedacted()) {\n return;\n }\n\n const beacon = new Beacon(event);\n\n this.reEmitter.reEmit<BeaconEvent, BeaconEvent>(beacon, [\n BeaconEvent.New,\n BeaconEvent.Update,\n BeaconEvent.Destroy,\n BeaconEvent.LivenessChange,\n ]);\n\n this.emit(BeaconEvent.New, event, beacon);\n beacon.on(BeaconEvent.LivenessChange, this.onBeaconLivenessChange.bind(this));\n beacon.on(BeaconEvent.Destroy, this.onBeaconLivenessChange.bind(this));\n\n this.beacons.set(beacon.identifier, beacon);\n }\n\n /**\n * @experimental\n * Check liveness of room beacons\n * emit RoomStateEvent.BeaconLiveness event\n */\n private onBeaconLivenessChange(): void {\n this._liveBeaconIds = Array.from(this.beacons.values())\n .filter((beacon) => beacon.isLive)\n .map((beacon) => beacon.identifier);\n\n this.emit(RoomStateEvent.BeaconLiveness, this, this.hasLiveBeacons);\n }\n\n private getStateEventMatching(event: MatrixEvent): MatrixEvent | null {\n return this.events.get(event.getType())?.get(event.getStateKey()!) ?? null;\n }\n\n private updateMember(member: RoomMember): void {\n // this member may have a power level already, so set it.\n const pwrLvlEvent = this.getStateEvents(EventType.RoomPowerLevels, \"\");\n if (pwrLvlEvent) {\n member.setPowerLevelEvent(pwrLvlEvent);\n }\n\n // blow away the sentinel which is now outdated\n delete this.sentinels[member.userId];\n\n this.members[member.userId] = member;\n this.joinedMemberCount = null;\n this.invitedMemberCount = null;\n }\n\n /**\n * Get the out-of-band members loading state, whether loading is needed or not.\n * Note that loading might be in progress and hence isn't needed.\n * @returns whether or not the members of this room need to be loaded\n */\n public needsOutOfBandMembers(): boolean {\n return this.oobMemberFlags.status === OobStatus.NotStarted;\n }\n\n /**\n * Check if loading of out-of-band-members has completed\n *\n * @returns true if the full membership list of this room has been loaded. False if it is not started or is in\n * progress.\n */\n public outOfBandMembersReady(): boolean {\n return this.oobMemberFlags.status === OobStatus.Finished;\n }\n\n /**\n * Mark this room state as waiting for out-of-band members,\n * ensuring it doesn't ask for them to be requested again\n * through needsOutOfBandMembers\n */\n public markOutOfBandMembersStarted(): void {\n if (this.oobMemberFlags.status !== OobStatus.NotStarted) {\n return;\n }\n this.oobMemberFlags.status = OobStatus.InProgress;\n }\n\n /**\n * Mark this room state as having failed to fetch out-of-band members\n */\n public markOutOfBandMembersFailed(): void {\n if (this.oobMemberFlags.status !== OobStatus.InProgress) {\n return;\n }\n this.oobMemberFlags.status = OobStatus.NotStarted;\n }\n\n /**\n * Clears the loaded out-of-band members\n */\n public clearOutOfBandMembers(): void {\n let count = 0;\n Object.keys(this.members).forEach((userId) => {\n const member = this.members[userId];\n if (member.isOutOfBand()) {\n ++count;\n delete this.members[userId];\n }\n });\n logger.log(`LL: RoomState removed ${count} members...`);\n this.oobMemberFlags.status = OobStatus.NotStarted;\n }\n\n /**\n * Sets the loaded out-of-band members.\n * @param stateEvents - array of membership state events\n */\n public setOutOfBandMembers(stateEvents: MatrixEvent[]): void {\n logger.log(`LL: RoomState about to set ${stateEvents.length} OOB members ...`);\n if (this.oobMemberFlags.status !== OobStatus.InProgress) {\n return;\n }\n logger.log(`LL: RoomState put in finished state ...`);\n this.oobMemberFlags.status = OobStatus.Finished;\n stateEvents.forEach((e) => this.setOutOfBandMember(e));\n this.emit(RoomStateEvent.Update, this);\n }\n\n /**\n * Sets a single out of band member, used by both setOutOfBandMembers and clone\n * @param stateEvent - membership state event\n */\n private setOutOfBandMember(stateEvent: MatrixEvent): void {\n if (stateEvent.getType() !== EventType.RoomMember) {\n return;\n }\n const userId = stateEvent.getStateKey()!;\n const existingMember = this.getMember(userId);\n // never replace members received as part of the sync\n if (existingMember && !existingMember.isOutOfBand()) {\n return;\n }\n\n const member = this.getOrCreateMember(userId, stateEvent);\n member.setMembershipEvent(stateEvent, this);\n // needed to know which members need to be stored seperately\n // as they are not part of the sync accumulator\n // this is cleared by setMembershipEvent so when it's updated through /sync\n member.markOutOfBand();\n\n this.updateDisplayNameCache(member.userId, member.name);\n\n this.setStateEvent(stateEvent);\n this.updateMember(member);\n this.emit(RoomStateEvent.Members, stateEvent, this, member);\n }\n\n /**\n * Set the current typing event for this room.\n * @param event - The typing event\n */\n public setTypingEvent(event: MatrixEvent): void {\n Object.values(this.members).forEach(function (member) {\n member.setTypingEvent(event);\n });\n }\n\n /**\n * Get the m.room.member event which has the given third party invite token.\n *\n * @param token - The token\n * @returns The m.room.member event or null\n */\n public getInviteForThreePidToken(token: string): MatrixEvent | null {\n return this.tokenToInvite[token] || null;\n }\n\n /**\n * Update the last modified time to the current time.\n */\n private updateModifiedTime(): void {\n this.modified = Date.now();\n }\n\n /**\n * Get the timestamp when this room state was last updated. This timestamp is\n * updated when this object has received new state events.\n * @returns The timestamp\n */\n public getLastModifiedTime(): number {\n return this.modified;\n }\n\n /**\n * Get user IDs with the specified or similar display names.\n * @param displayName - The display name to get user IDs from.\n * @returns An array of user IDs or an empty array.\n */\n public getUserIdsWithDisplayName(displayName: string): string[] {\n return this.displayNameToUserIds.get(removeHiddenChars(displayName)) ?? [];\n }\n\n /**\n * Returns true if userId is in room, event is not redacted and either sender of\n * mxEvent or has power level sufficient to redact events other than their own.\n * @param mxEvent - The event to test permission for\n * @param userId - The user ID of the user to test permission for\n * @returns true if the given used ID can redact given event\n */\n public maySendRedactionForEvent(mxEvent: MatrixEvent, userId: string): boolean {\n const member = this.getMember(userId);\n if (!member || member.membership === \"leave\") return false;\n\n if (mxEvent.status || mxEvent.isRedacted()) return false;\n\n // The user may have been the sender, but they can't redact their own message\n // if redactions are blocked.\n const canRedact = this.maySendEvent(EventType.RoomRedaction, userId);\n if (mxEvent.getSender() === userId) return canRedact;\n\n return this.hasSufficientPowerLevelFor(\"redact\", member.powerLevel);\n }\n\n /**\n * Returns true if the given power level is sufficient for action\n * @param action - The type of power level to check\n * @param powerLevel - The power level of the member\n * @returns true if the given power level is sufficient\n */\n public hasSufficientPowerLevelFor(action: \"ban\" | \"kick\" | \"redact\", powerLevel: number): boolean {\n const powerLevelsEvent = this.getStateEvents(EventType.RoomPowerLevels, \"\");\n\n let powerLevels: IPowerLevelsContent = {};\n if (powerLevelsEvent) {\n powerLevels = powerLevelsEvent.getContent();\n }\n\n let requiredLevel = 50;\n if (isNumber(powerLevels[action])) {\n requiredLevel = powerLevels[action]!;\n }\n\n return powerLevel >= requiredLevel;\n }\n\n /**\n * Short-form for maySendEvent('m.room.message', userId)\n * @param userId - The user ID of the user to test permission for\n * @returns true if the given user ID should be permitted to send\n * message events into the given room.\n */\n public maySendMessage(userId: string): boolean {\n return this.maySendEventOfType(EventType.RoomMessage, userId, false);\n }\n\n /**\n * Returns true if the given user ID has permission to send a normal\n * event of type `eventType` into this room.\n * @param eventType - The type of event to test\n * @param userId - The user ID of the user to test permission for\n * @returns true if the given user ID should be permitted to send\n * the given type of event into this room,\n * according to the room's state.\n */\n public maySendEvent(eventType: EventType | string, userId: string): boolean {\n return this.maySendEventOfType(eventType, userId, false);\n }\n\n /**\n * Returns true if the given MatrixClient has permission to send a state\n * event of type `stateEventType` into this room.\n * @param stateEventType - The type of state events to test\n * @param cli - The client to test permission for\n * @returns true if the given client should be permitted to send\n * the given type of state event into this room,\n * according to the room's state.\n */\n public mayClientSendStateEvent(stateEventType: EventType | string, cli: MatrixClient): boolean {\n if (cli.isGuest() || !cli.credentials.userId) {\n return false;\n }\n return this.maySendStateEvent(stateEventType, cli.credentials.userId);\n }\n\n /**\n * Returns true if the given user ID has permission to send a state\n * event of type `stateEventType` into this room.\n * @param stateEventType - The type of state events to test\n * @param userId - The user ID of the user to test permission for\n * @returns true if the given user ID should be permitted to send\n * the given type of state event into this room,\n * according to the room's state.\n */\n public maySendStateEvent(stateEventType: EventType | string, userId: string): boolean {\n return this.maySendEventOfType(stateEventType, userId, true);\n }\n\n /**\n * Returns true if the given user ID has permission to send a normal or state\n * event of type `eventType` into this room.\n * @param eventType - The type of event to test\n * @param userId - The user ID of the user to test permission for\n * @param state - If true, tests if the user may send a state\n event of this type. Otherwise tests whether\n they may send a regular event.\n * @returns true if the given user ID should be permitted to send\n * the given type of event into this room,\n * according to the room's state.\n */\n private maySendEventOfType(eventType: EventType | string, userId: string, state: boolean): boolean {\n const powerLevelsEvent = this.getStateEvents(EventType.RoomPowerLevels, \"\");\n\n let powerLevels: IPowerLevelsContent;\n let eventsLevels: Record<EventType | string, number> = {};\n\n let stateDefault = 0;\n let eventsDefault = 0;\n let powerLevel = 0;\n if (powerLevelsEvent) {\n powerLevels = powerLevelsEvent.getContent();\n eventsLevels = powerLevels.events || {};\n\n if (Number.isSafeInteger(powerLevels.state_default)) {\n stateDefault = powerLevels.state_default!;\n } else {\n stateDefault = 50;\n }\n\n const userPowerLevel = powerLevels.users && powerLevels.users[userId];\n if (Number.isSafeInteger(userPowerLevel)) {\n powerLevel = userPowerLevel!;\n } else if (Number.isSafeInteger(powerLevels.users_default)) {\n powerLevel = powerLevels.users_default!;\n }\n\n if (Number.isSafeInteger(powerLevels.events_default)) {\n eventsDefault = powerLevels.events_default!;\n }\n }\n\n let requiredLevel = state ? stateDefault : eventsDefault;\n if (Number.isSafeInteger(eventsLevels[eventType])) {\n requiredLevel = eventsLevels[eventType];\n }\n return powerLevel >= requiredLevel;\n }\n\n /**\n * Returns true if the given user ID has permission to trigger notification\n * of type `notifLevelKey`\n * @param notifLevelKey - The level of notification to test (eg. 'room')\n * @param userId - The user ID of the user to test permission for\n * @returns true if the given user ID has permission to trigger a\n * notification of this type.\n */\n public mayTriggerNotifOfType(notifLevelKey: string, userId: string): boolean {\n const member = this.getMember(userId);\n if (!member) {\n return false;\n }\n\n const powerLevelsEvent = this.getStateEvents(EventType.RoomPowerLevels, \"\");\n\n let notifLevel = 50;\n if (\n powerLevelsEvent &&\n powerLevelsEvent.getContent() &&\n powerLevelsEvent.getContent().notifications &&\n isNumber(powerLevelsEvent.getContent().notifications[notifLevelKey])\n ) {\n notifLevel = powerLevelsEvent.getContent().notifications[notifLevelKey];\n }\n\n return member.powerLevel >= notifLevel;\n }\n\n /**\n * Returns the join rule based on the m.room.join_rule state event, defaulting to `invite`.\n * @returns the join_rule applied to this room\n */\n public getJoinRule(): JoinRule {\n const joinRuleEvent = this.getStateEvents(EventType.RoomJoinRules, \"\");\n const joinRuleContent: Partial<IJoinRuleEventContent> = joinRuleEvent?.getContent() ?? {};\n return joinRuleContent[\"join_rule\"] || JoinRule.Invite;\n }\n\n /**\n * Returns the history visibility based on the m.room.history_visibility state event, defaulting to `shared`.\n * @returns the history_visibility applied to this room\n */\n public getHistoryVisibility(): HistoryVisibility {\n const historyVisibilityEvent = this.getStateEvents(EventType.RoomHistoryVisibility, \"\");\n const historyVisibilityContent = historyVisibilityEvent?.getContent() ?? {};\n return historyVisibilityContent[\"history_visibility\"] || HistoryVisibility.Shared;\n }\n\n /**\n * Returns the guest access based on the m.room.guest_access state event, defaulting to `shared`.\n * @returns the guest_access applied to this room\n */\n public getGuestAccess(): GuestAccess {\n const guestAccessEvent = this.getStateEvents(EventType.RoomGuestAccess, \"\");\n const guestAccessContent = guestAccessEvent?.getContent() ?? {};\n return guestAccessContent[\"guest_access\"] || GuestAccess.Forbidden;\n }\n\n /**\n * Find the predecessor room based on this room state.\n *\n * @param msc3946ProcessDynamicPredecessor - if true, look for an\n * m.room.predecessor state event and use it if found (MSC3946).\n * @returns null if this room has no predecessor. Otherwise, returns\n * the roomId, last eventId and viaServers of the predecessor room.\n *\n * If msc3946ProcessDynamicPredecessor is true, use m.predecessor events\n * as well as m.room.create events to find predecessors.\n *\n * Note: if an m.predecessor event is used, eventId may be undefined\n * since last_known_event_id is optional.\n *\n * Note: viaServers may be undefined, and will definitely be undefined if\n * this predecessor comes from a RoomCreate event (rather than a\n * RoomPredecessor, which has the optional via_servers property).\n */\n public findPredecessor(\n msc3946ProcessDynamicPredecessor = false,\n ): { roomId: string; eventId?: string; viaServers?: string[] } | null {\n // Note: the tests for this function are against Room.findPredecessor,\n // which just calls through to here.\n\n if (msc3946ProcessDynamicPredecessor) {\n const predecessorEvent = this.getStateEvents(EventType.RoomPredecessor, \"\");\n if (predecessorEvent) {\n const content = predecessorEvent.getContent<{\n predecessor_room_id: string;\n last_known_event_id?: string;\n via_servers?: string[];\n }>();\n const roomId = content.predecessor_room_id;\n let eventId = content.last_known_event_id;\n if (typeof eventId !== \"string\") {\n eventId = undefined;\n }\n let viaServers = content.via_servers;\n if (!Array.isArray(viaServers)) {\n viaServers = undefined;\n }\n if (typeof roomId === \"string\") {\n return { roomId, eventId, viaServers };\n }\n }\n }\n\n const createEvent = this.getStateEvents(EventType.RoomCreate, \"\");\n if (createEvent) {\n const predecessor = createEvent.getContent<{\n predecessor?: Partial<{\n room_id: string;\n event_id: string;\n }>;\n }>()[\"predecessor\"];\n if (predecessor) {\n const roomId = predecessor[\"room_id\"];\n if (typeof roomId === \"string\") {\n let eventId = predecessor[\"event_id\"];\n if (typeof eventId !== \"string\" || eventId === \"\") {\n eventId = undefined;\n }\n return { roomId, eventId };\n }\n }\n }\n return null;\n }\n\n private updateThirdPartyTokenCache(memberEvent: MatrixEvent): void {\n if (!memberEvent.getContent().third_party_invite) {\n return;\n }\n const token = (memberEvent.getContent().third_party_invite.signed || {}).token;\n if (!token) {\n return;\n }\n const threePidInvite = this.getStateEvents(EventType.RoomThirdPartyInvite, token);\n if (!threePidInvite) {\n return;\n }\n this.tokenToInvite[token] = memberEvent;\n }\n\n private updateDisplayNameCache(userId: string, displayName: string): void {\n const oldName = this.userIdsToDisplayNames[userId];\n delete this.userIdsToDisplayNames[userId];\n if (oldName) {\n // Remove the old name from the cache.\n // We clobber the user_id > name lookup but the name -> [user_id] lookup\n // means we need to remove that user ID from that array rather than nuking\n // the lot.\n const strippedOldName = removeHiddenChars(oldName);\n\n const existingUserIds = this.displayNameToUserIds.get(strippedOldName);\n if (existingUserIds) {\n // remove this user ID from this array\n const filteredUserIDs = existingUserIds.filter((id) => id !== userId);\n this.displayNameToUserIds.set(strippedOldName, filteredUserIDs);\n }\n }\n\n this.userIdsToDisplayNames[userId] = displayName;\n\n const strippedDisplayname = displayName && removeHiddenChars(displayName);\n // an empty stripped displayname (undefined/'') will be set to MXID in room-member.js\n if (strippedDisplayname) {\n const arr = this.displayNameToUserIds.get(strippedDisplayname) ?? [];\n arr.push(userId);\n this.displayNameToUserIds.set(strippedDisplayname, arr);\n }\n }\n}\n"],"mappings":"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"}
@@ -446,7 +446,7 @@ export declare class Room extends ReadReceipt<RoomEmittedEvents, RoomEventHandle
446
446
  */
447
447
  getLastThread(): Thread | undefined;
448
448
  /**
449
- * @returns the membership type (join | leave | invite) for the logged in user
449
+ * @returns the membership type (join | leave | invite | knock) for the logged in user
450
450
  */
451
451
  getMyMembership(): string;
452
452
  /**