@textrp/briij-js-sdk 41.0.1 → 42.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (375) hide show
  1. package/CHANGELOG.md +14 -1
  2. package/LICENSE +177 -177
  3. package/README.md +14 -3
  4. package/lib/@types/AESEncryptedSecretStoragePayload.js.map +1 -1
  5. package/lib/@types/IIdentityServerProvider.js.map +1 -1
  6. package/lib/@types/PushRules.js +14 -14
  7. package/lib/@types/PushRules.js.map +1 -1
  8. package/lib/@types/another-json.d.js.map +1 -1
  9. package/lib/@types/auth.d.ts +19 -1
  10. package/lib/@types/auth.d.ts.map +1 -1
  11. package/lib/@types/auth.js +55 -54
  12. package/lib/@types/auth.js.map +1 -1
  13. package/lib/@types/beacon.js +100 -100
  14. package/lib/@types/beacon.js.map +1 -1
  15. package/lib/@types/common.js.map +1 -1
  16. package/lib/@types/crypto.js.map +1 -1
  17. package/lib/@types/event.d.ts +27 -0
  18. package/lib/@types/event.d.ts.map +1 -1
  19. package/lib/@types/event.js +105 -102
  20. package/lib/@types/event.js.map +1 -1
  21. package/lib/@types/events.js.map +1 -1
  22. package/lib/@types/extensible_events.js +53 -53
  23. package/lib/@types/extensible_events.js.map +1 -1
  24. package/lib/@types/local_notifications.js.map +1 -1
  25. package/lib/@types/location.js +41 -41
  26. package/lib/@types/location.js.map +1 -1
  27. package/lib/@types/matrix-sdk-crypto-wasm.d.js.map +1 -1
  28. package/lib/@types/media.js.map +1 -1
  29. package/lib/@types/membership.js +39 -39
  30. package/lib/@types/membership.js.map +1 -1
  31. package/lib/@types/partials.js +25 -25
  32. package/lib/@types/partials.js.map +1 -1
  33. package/lib/@types/polls.js +46 -46
  34. package/lib/@types/polls.js.map +1 -1
  35. package/lib/@types/read_receipts.js +14 -14
  36. package/lib/@types/read_receipts.js.map +1 -1
  37. package/lib/@types/registration.js.map +1 -1
  38. package/lib/@types/search.js +14 -14
  39. package/lib/@types/search.js.map +1 -1
  40. package/lib/@types/signed.js.map +1 -1
  41. package/lib/@types/spaces.js.map +1 -1
  42. package/lib/@types/state_events.js.map +1 -1
  43. package/lib/@types/synapse.js.map +1 -1
  44. package/lib/@types/sync.js +18 -18
  45. package/lib/@types/sync.js.map +1 -1
  46. package/lib/@types/threepids.js +14 -14
  47. package/lib/@types/threepids.js.map +1 -1
  48. package/lib/@types/topic.js +47 -47
  49. package/lib/@types/topic.js.map +1 -1
  50. package/lib/@types/uia.js.map +1 -1
  51. package/lib/NamespacedValue.js +20 -20
  52. package/lib/NamespacedValue.js.map +1 -1
  53. package/lib/ReEmitter.js +16 -16
  54. package/lib/ReEmitter.js.map +1 -1
  55. package/lib/base64.js +32 -32
  56. package/lib/base64.js.map +1 -1
  57. package/lib/briij.d.ts +3 -0
  58. package/lib/briij.d.ts.map +1 -1
  59. package/lib/briij.js +3 -0
  60. package/lib/briij.js.map +1 -1
  61. package/lib/client.d.ts +18 -1
  62. package/lib/client.d.ts.map +1 -1
  63. package/lib/client.js +166 -103
  64. package/lib/client.js.map +1 -1
  65. package/lib/common-crypto/key-passphrase.js +19 -19
  66. package/lib/common-crypto/key-passphrase.js.map +1 -1
  67. package/lib/content-helpers.js +57 -57
  68. package/lib/content-helpers.js.map +1 -1
  69. package/lib/content-repo.js +36 -36
  70. package/lib/content-repo.js.map +1 -1
  71. package/lib/crypto/store/base.js +69 -69
  72. package/lib/crypto/store/base.js.map +1 -1
  73. package/lib/crypto/store/indexeddb-crypto-store-backend.js +58 -58
  74. package/lib/crypto/store/indexeddb-crypto-store-backend.js.map +1 -1
  75. package/lib/crypto/store/indexeddb-crypto-store.js +193 -193
  76. package/lib/crypto/store/indexeddb-crypto-store.js.map +1 -1
  77. package/lib/crypto/store/localStorage-crypto-store.js +72 -72
  78. package/lib/crypto/store/localStorage-crypto-store.js.map +1 -1
  79. package/lib/crypto/store/memory-crypto-store.js +74 -74
  80. package/lib/crypto/store/memory-crypto-store.js.map +1 -1
  81. package/lib/crypto-api/CryptoEventHandlerMap.js.map +1 -1
  82. package/lib/crypto-api/key-passphrase.js +22 -22
  83. package/lib/crypto-api/key-passphrase.js.map +1 -1
  84. package/lib/crypto-api/keybackup.js.map +1 -1
  85. package/lib/crypto-api/recovery-key.js +20 -20
  86. package/lib/crypto-api/recovery-key.js.map +1 -1
  87. package/lib/digest.js +21 -21
  88. package/lib/digest.js.map +1 -1
  89. package/lib/extensible_events_v1/ExtensibleEvent.js +39 -39
  90. package/lib/extensible_events_v1/ExtensibleEvent.js.map +1 -1
  91. package/lib/extensible_events_v1/InvalidEventError.js +16 -16
  92. package/lib/extensible_events_v1/InvalidEventError.js.map +1 -1
  93. package/lib/extensible_events_v1/MessageEvent.js +39 -39
  94. package/lib/extensible_events_v1/MessageEvent.js.map +1 -1
  95. package/lib/extensible_events_v1/PollEndEvent.js +29 -29
  96. package/lib/extensible_events_v1/PollEndEvent.js.map +1 -1
  97. package/lib/extensible_events_v1/PollResponseEvent.js +39 -39
  98. package/lib/extensible_events_v1/PollResponseEvent.js.map +1 -1
  99. package/lib/extensible_events_v1/PollStartEvent.js +52 -52
  100. package/lib/extensible_events_v1/PollStartEvent.js.map +1 -1
  101. package/lib/extensible_events_v1/utilities.js +22 -22
  102. package/lib/extensible_events_v1/utilities.js.map +1 -1
  103. package/lib/feature.js +16 -16
  104. package/lib/feature.js.map +1 -1
  105. package/lib/http-api/method.js +14 -14
  106. package/lib/http-api/method.js.map +1 -1
  107. package/lib/http-api/prefix.js +26 -26
  108. package/lib/http-api/prefix.js.map +1 -1
  109. package/lib/indexeddb-helpers.js +21 -21
  110. package/lib/indexeddb-helpers.js.map +1 -1
  111. package/lib/indexeddb-worker.js +18 -18
  112. package/lib/indexeddb-worker.js.map +1 -1
  113. package/lib/matrixrtc/IKeyTransport.js +17 -17
  114. package/lib/matrixrtc/IKeyTransport.js.map +1 -1
  115. package/lib/matrixrtc/IMembershipManager.js +27 -27
  116. package/lib/matrixrtc/IMembershipManager.js.map +1 -1
  117. package/lib/matrixrtc/LivekitTransport.js +19 -19
  118. package/lib/matrixrtc/LivekitTransport.js.map +1 -1
  119. package/lib/matrixrtc/index.js +14 -14
  120. package/lib/matrixrtc/index.js.map +1 -1
  121. package/lib/matrixrtc/utils.js +27 -27
  122. package/lib/matrixrtc/utils.js.map +1 -1
  123. package/lib/models/ToDeviceMessage.js.map +1 -1
  124. package/lib/models/device.js +24 -24
  125. package/lib/models/device.js.map +1 -1
  126. package/lib/models/event-status.js +17 -17
  127. package/lib/models/event-status.js.map +1 -1
  128. package/lib/models/invites-ignorer-types.js +25 -25
  129. package/lib/models/invites-ignorer-types.js.map +1 -1
  130. package/lib/models/profile-keys.js +26 -26
  131. package/lib/models/profile-keys.js.map +1 -1
  132. package/lib/models/room-summary.js +26 -26
  133. package/lib/models/room-summary.js.map +1 -1
  134. package/lib/models/search-result.js +22 -22
  135. package/lib/models/search-result.js.map +1 -1
  136. package/lib/models/typed-event-emitter.js +122 -122
  137. package/lib/models/typed-event-emitter.js.map +1 -1
  138. package/lib/oidc/authorize.js +76 -76
  139. package/lib/oidc/authorize.js.map +1 -1
  140. package/lib/oidc/error.js +17 -17
  141. package/lib/oidc/error.js.map +1 -1
  142. package/lib/oidc/index.js +17 -17
  143. package/lib/oidc/index.js.map +1 -1
  144. package/lib/oidc/register.js +41 -41
  145. package/lib/oidc/register.js.map +1 -1
  146. package/lib/oidc/tokenRefresher.js +51 -51
  147. package/lib/oidc/tokenRefresher.js.map +1 -1
  148. package/lib/oidc/validate.js +59 -59
  149. package/lib/oidc/validate.js.map +1 -1
  150. package/lib/randomstring.js +35 -35
  151. package/lib/randomstring.js.map +1 -1
  152. package/lib/realtime-callbacks.js +39 -39
  153. package/lib/realtime-callbacks.js.map +1 -1
  154. package/lib/receipt-accumulator.js +44 -44
  155. package/lib/receipt-accumulator.js.map +1 -1
  156. package/lib/rendezvous/RendezvousChannel.js.map +1 -1
  157. package/lib/rendezvous/RendezvousCode.js.map +1 -1
  158. package/lib/rendezvous/RendezvousError.js +14 -14
  159. package/lib/rendezvous/RendezvousError.js.map +1 -1
  160. package/lib/rendezvous/RendezvousFailureReason.js +14 -14
  161. package/lib/rendezvous/RendezvousFailureReason.js.map +1 -1
  162. package/lib/rendezvous/RendezvousIntent.js +14 -14
  163. package/lib/rendezvous/RendezvousIntent.js.map +1 -1
  164. package/lib/rendezvous/RendezvousTransport.js.map +1 -1
  165. package/lib/rendezvous/channels/MSC4108SecureChannel.js +63 -63
  166. package/lib/rendezvous/channels/MSC4108SecureChannel.js.map +1 -1
  167. package/lib/rendezvous/channels/index.js +14 -14
  168. package/lib/rendezvous/channels/index.js.map +1 -1
  169. package/lib/rendezvous/index.js +14 -14
  170. package/lib/rendezvous/index.js.map +1 -1
  171. package/lib/rendezvous/transports/index.js +14 -14
  172. package/lib/rendezvous/transports/index.js.map +1 -1
  173. package/lib/rust-crypto/CrossSigningIdentity.js +29 -29
  174. package/lib/rust-crypto/CrossSigningIdentity.js.map +1 -1
  175. package/lib/rust-crypto/OutgoingRequestsManager.js +37 -37
  176. package/lib/rust-crypto/OutgoingRequestsManager.js.map +1 -1
  177. package/lib/rust-crypto/device-converter.js +30 -30
  178. package/lib/rust-crypto/device-converter.js.map +1 -1
  179. package/lib/rust-crypto/secret-storage.js +30 -30
  180. package/lib/rust-crypto/secret-storage.js.map +1 -1
  181. package/lib/service-types.js +14 -14
  182. package/lib/service-types.js.map +1 -1
  183. package/lib/store/local-storage-events-emitter.js +21 -21
  184. package/lib/store/local-storage-events-emitter.js.map +1 -1
  185. package/lib/sync-accumulator.js +50 -50
  186. package/lib/sync-accumulator.js.map +1 -1
  187. package/lib/thread-utils.js +20 -20
  188. package/lib/thread-utils.js.map +1 -1
  189. package/lib/types.js +34 -34
  190. package/lib/types.js.map +1 -1
  191. package/lib/utils/decryptAESSecretStorageItem.js +22 -22
  192. package/lib/utils/decryptAESSecretStorageItem.js.map +1 -1
  193. package/lib/utils/encryptAESSecretStorageItem.js +26 -26
  194. package/lib/utils/encryptAESSecretStorageItem.js.map +1 -1
  195. package/lib/utils/internal/deriveKeys.js +21 -21
  196. package/lib/utils/internal/deriveKeys.js.map +1 -1
  197. package/lib/utils/roomVersion.js +26 -26
  198. package/lib/utils/roomVersion.js.map +1 -1
  199. package/lib/version-support.js +26 -26
  200. package/lib/version-support.js.map +1 -1
  201. package/lib/webrtc/audioContext.js +24 -24
  202. package/lib/webrtc/audioContext.js.map +1 -1
  203. package/lib/webrtc/callEventTypes.js.map +1 -1
  204. package/lib/webrtc/stats/callFeedStatsReporter.js +14 -14
  205. package/lib/webrtc/stats/callFeedStatsReporter.js.map +1 -1
  206. package/lib/webrtc/stats/callStatsReportGatherer.js +14 -14
  207. package/lib/webrtc/stats/callStatsReportGatherer.js.map +1 -1
  208. package/lib/webrtc/stats/callStatsReportSummary.js.map +1 -1
  209. package/lib/webrtc/stats/connectionStats.js +14 -14
  210. package/lib/webrtc/stats/connectionStats.js.map +1 -1
  211. package/lib/webrtc/stats/connectionStatsBuilder.js +14 -14
  212. package/lib/webrtc/stats/connectionStatsBuilder.js.map +1 -1
  213. package/lib/webrtc/stats/connectionStatsReportBuilder.js +14 -14
  214. package/lib/webrtc/stats/connectionStatsReportBuilder.js.map +1 -1
  215. package/lib/webrtc/stats/groupCallStats.js +14 -14
  216. package/lib/webrtc/stats/groupCallStats.js.map +1 -1
  217. package/lib/webrtc/stats/media/mediaSsrcHandler.js +14 -14
  218. package/lib/webrtc/stats/media/mediaSsrcHandler.js.map +1 -1
  219. package/lib/webrtc/stats/media/mediaTrackHandler.js +14 -14
  220. package/lib/webrtc/stats/media/mediaTrackHandler.js.map +1 -1
  221. package/lib/webrtc/stats/media/mediaTrackStats.js +27 -27
  222. package/lib/webrtc/stats/media/mediaTrackStats.js.map +1 -1
  223. package/lib/webrtc/stats/media/mediaTrackStatsHandler.js +20 -20
  224. package/lib/webrtc/stats/media/mediaTrackStatsHandler.js.map +1 -1
  225. package/lib/webrtc/stats/statsReport.js +14 -14
  226. package/lib/webrtc/stats/statsReport.js.map +1 -1
  227. package/lib/webrtc/stats/statsReportEmitter.js +14 -14
  228. package/lib/webrtc/stats/statsReportEmitter.js.map +1 -1
  229. package/lib/webrtc/stats/trackStatsBuilder.js +4 -4
  230. package/lib/webrtc/stats/trackStatsBuilder.js.map +1 -1
  231. package/lib/webrtc/stats/transportStats.js.map +1 -1
  232. package/lib/webrtc/stats/transportStatsBuilder.js.map +1 -1
  233. package/lib/webrtc/stats/valueFormatter.js +11 -11
  234. package/lib/webrtc/stats/valueFormatter.js.map +1 -1
  235. package/lib/xrpl/identity.d.ts +28 -0
  236. package/lib/xrpl/identity.d.ts.map +1 -0
  237. package/lib/xrpl/identity.js +213 -0
  238. package/lib/xrpl/identity.js.map +1 -0
  239. package/lib/xrpl/trust.d.ts +8 -0
  240. package/lib/xrpl/trust.d.ts.map +1 -0
  241. package/lib/xrpl/trust.js +61 -0
  242. package/lib/xrpl/trust.js.map +1 -0
  243. package/lib/xrpl/verification.d.ts +26 -0
  244. package/lib/xrpl/verification.d.ts.map +1 -0
  245. package/lib/xrpl/verification.js +295 -0
  246. package/lib/xrpl/verification.js.map +1 -0
  247. package/package.json +128 -129
  248. package/src/@types/AESEncryptedSecretStoragePayload.ts +29 -29
  249. package/src/@types/IIdentityServerProvider.ts +24 -24
  250. package/src/@types/PushRules.ts +208 -208
  251. package/src/@types/another-json.d.ts +19 -19
  252. package/src/@types/auth.ts +280 -258
  253. package/src/@types/beacon.ts +140 -140
  254. package/src/@types/common.ts +24 -24
  255. package/src/@types/crypto.ts +71 -71
  256. package/src/@types/event.ts +476 -449
  257. package/src/@types/events.ts +119 -119
  258. package/src/@types/extensible_events.ts +147 -147
  259. package/src/@types/local_notifications.ts +19 -19
  260. package/src/@types/location.ts +92 -92
  261. package/src/@types/matrix-sdk-crypto-wasm.d.ts +39 -39
  262. package/src/@types/media.ts +245 -245
  263. package/src/@types/membership.ts +57 -57
  264. package/src/@types/partials.ts +103 -103
  265. package/src/@types/polls.ts +120 -120
  266. package/src/@types/read_receipts.ts +61 -61
  267. package/src/@types/registration.ts +102 -102
  268. package/src/@types/search.ts +119 -119
  269. package/src/@types/signed.ts +25 -25
  270. package/src/@types/spaces.ts +37 -37
  271. package/src/@types/state_events.ts +153 -153
  272. package/src/@types/synapse.ts +40 -40
  273. package/src/@types/sync.ts +27 -27
  274. package/src/@types/threepids.ts +29 -29
  275. package/src/@types/topic.ts +69 -69
  276. package/src/@types/uia.ts +24 -24
  277. package/src/NamespacedValue.ts +121 -121
  278. package/src/ReEmitter.ts +93 -93
  279. package/src/base64.ts +86 -86
  280. package/src/briij.ts +3 -0
  281. package/src/client.ts +90 -10
  282. package/src/common-crypto/README.md +4 -4
  283. package/src/common-crypto/key-passphrase.ts +43 -43
  284. package/src/content-helpers.ts +298 -298
  285. package/src/content-repo.ts +122 -122
  286. package/src/crypto/store/base.ts +388 -388
  287. package/src/crypto/store/indexeddb-crypto-store-backend.ts +655 -655
  288. package/src/crypto/store/indexeddb-crypto-store.ts +555 -555
  289. package/src/crypto/store/localStorage-crypto-store.ts +409 -409
  290. package/src/crypto/store/memory-crypto-store.ts +326 -326
  291. package/src/crypto-api/CryptoEventHandlerMap.ts +42 -42
  292. package/src/crypto-api/key-passphrase.ts +58 -58
  293. package/src/crypto-api/keybackup.ts +114 -114
  294. package/src/crypto-api/recovery-key.ts +69 -69
  295. package/src/digest.ts +34 -34
  296. package/src/extensible_events_v1/ExtensibleEvent.ts +58 -58
  297. package/src/extensible_events_v1/InvalidEventError.ts +24 -24
  298. package/src/extensible_events_v1/MessageEvent.ts +143 -143
  299. package/src/extensible_events_v1/PollEndEvent.ts +97 -97
  300. package/src/extensible_events_v1/PollResponseEvent.ts +148 -148
  301. package/src/extensible_events_v1/PollStartEvent.ts +207 -207
  302. package/src/extensible_events_v1/utilities.ts +35 -35
  303. package/src/feature.ts +88 -88
  304. package/src/http-api/method.ts +25 -25
  305. package/src/http-api/prefix.ts +48 -48
  306. package/src/indexeddb-helpers.ts +50 -50
  307. package/src/indexeddb-worker.ts +24 -24
  308. package/src/matrixrtc/IKeyTransport.ts +63 -63
  309. package/src/matrixrtc/IMembershipManager.ts +120 -120
  310. package/src/matrixrtc/LivekitTransport.ts +46 -46
  311. package/src/matrixrtc/index.ts +24 -24
  312. package/src/matrixrtc/utils.ts +71 -71
  313. package/src/models/ToDeviceMessage.ts +38 -38
  314. package/src/models/device.ts +85 -85
  315. package/src/models/event-status.ts +39 -39
  316. package/src/models/invites-ignorer-types.ts +58 -58
  317. package/src/models/profile-keys.ts +33 -33
  318. package/src/models/room-summary.ts +78 -78
  319. package/src/models/search-result.ts +57 -57
  320. package/src/models/typed-event-emitter.ts +246 -246
  321. package/src/oidc/authorize.ts +279 -279
  322. package/src/oidc/error.ts +33 -33
  323. package/src/oidc/index.ts +33 -33
  324. package/src/oidc/register.ts +163 -163
  325. package/src/oidc/tokenRefresher.ts +184 -184
  326. package/src/oidc/validate.ts +265 -265
  327. package/src/randomstring.ts +103 -103
  328. package/src/realtime-callbacks.ts +191 -191
  329. package/src/receipt-accumulator.ts +189 -189
  330. package/src/rendezvous/RendezvousChannel.ts +48 -48
  331. package/src/rendezvous/RendezvousCode.ts +25 -25
  332. package/src/rendezvous/RendezvousError.ts +26 -26
  333. package/src/rendezvous/RendezvousFailureReason.ts +49 -49
  334. package/src/rendezvous/RendezvousIntent.ts +20 -20
  335. package/src/rendezvous/RendezvousTransport.ts +58 -58
  336. package/src/rendezvous/channels/MSC4108SecureChannel.ts +270 -270
  337. package/src/rendezvous/channels/index.ts +17 -17
  338. package/src/rendezvous/index.ts +25 -25
  339. package/src/rendezvous/transports/index.ts +17 -17
  340. package/src/rust-crypto/CrossSigningIdentity.ts +195 -195
  341. package/src/rust-crypto/OutgoingRequestsManager.ts +170 -170
  342. package/src/rust-crypto/device-converter.ts +128 -128
  343. package/src/rust-crypto/secret-storage.ts +60 -60
  344. package/src/service-types.ts +20 -20
  345. package/src/store/local-storage-events-emitter.ts +46 -46
  346. package/src/sync-accumulator.ts +779 -779
  347. package/src/thread-utils.ts +31 -31
  348. package/src/types.ts +59 -59
  349. package/src/utils/decryptAESSecretStorageItem.ts +54 -54
  350. package/src/utils/encryptAESSecretStorageItem.ts +73 -73
  351. package/src/utils/internal/deriveKeys.ts +63 -63
  352. package/src/utils/roomVersion.ts +35 -35
  353. package/src/version-support.ts +50 -50
  354. package/src/webrtc/audioContext.ts +44 -44
  355. package/src/webrtc/callEventTypes.ts +101 -101
  356. package/src/webrtc/stats/callFeedStatsReporter.ts +91 -91
  357. package/src/webrtc/stats/callStatsReportGatherer.ts +219 -219
  358. package/src/webrtc/stats/callStatsReportSummary.ts +30 -30
  359. package/src/webrtc/stats/connectionStats.ts +47 -47
  360. package/src/webrtc/stats/connectionStatsBuilder.ts +28 -28
  361. package/src/webrtc/stats/connectionStatsReportBuilder.ts +140 -140
  362. package/src/webrtc/stats/groupCallStats.ts +93 -93
  363. package/src/webrtc/stats/media/mediaSsrcHandler.ts +57 -57
  364. package/src/webrtc/stats/media/mediaTrackHandler.ts +70 -70
  365. package/src/webrtc/stats/media/mediaTrackStats.ts +176 -176
  366. package/src/webrtc/stats/media/mediaTrackStatsHandler.ts +90 -90
  367. package/src/webrtc/stats/statsReport.ts +133 -133
  368. package/src/webrtc/stats/statsReportEmitter.ts +49 -49
  369. package/src/webrtc/stats/trackStatsBuilder.ts +207 -207
  370. package/src/webrtc/stats/transportStats.ts +26 -26
  371. package/src/webrtc/stats/transportStatsBuilder.ts +48 -48
  372. package/src/webrtc/stats/valueFormatter.ts +27 -27
  373. package/src/xrpl/identity.ts +245 -0
  374. package/src/xrpl/trust.ts +64 -0
  375. package/src/xrpl/verification.ts +284 -0
@@ -1,170 +1,170 @@
1
- /*
2
- Copyright 2023 The Matrix.org Foundation C.I.C.
3
-
4
- Licensed under the Apache License, Version 2.0 (the "License");
5
- you may not use this file except in compliance with the License.
6
- You may obtain a copy of the License at
7
-
8
- http://www.apache.org/licenses/LICENSE-2.0
9
-
10
- Unless required by applicable law or agreed to in writing, software
11
- distributed under the License is distributed on an "AS IS" BASIS,
12
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13
- See the License for the specific language governing permissions and
14
- limitations under the License.
15
- */
16
-
17
- import { type OlmMachine, type OutgoingRequest } from "@matrix-org/matrix-sdk-crypto-wasm";
18
-
19
- import { type OutgoingRequestProcessor } from "./OutgoingRequestProcessor.ts";
20
- import { type Logger } from "../logger.ts";
21
- import { logDuration } from "../utils.ts";
22
-
23
- /**
24
- * OutgoingRequestsManager: responsible for processing outgoing requests from the OlmMachine.
25
- * Ensure that only one loop is going on at once, and that the requests are processed in order.
26
- */
27
- export class OutgoingRequestsManager {
28
- /** whether {@link stop} has been called */
29
- private stopped = false;
30
-
31
- /** whether {@link outgoingRequestLoop} is currently running */
32
- private outgoingRequestLoopRunning = false;
33
-
34
- /**
35
- * If there are additional calls to doProcessOutgoingRequests() while there is a current call running
36
- * we need to remember in order to call `doProcessOutgoingRequests` again (as there could be new requests).
37
- *
38
- * If this is defined, it is an indication that we need to do another iteration; in this case the deferred
39
- * will resolve once that next iteration completes. If it is undefined, there have been no new calls
40
- * to `doProcessOutgoingRequests` since the current iteration started.
41
- */
42
- private nextLoopDeferred?: PromiseWithResolvers<void>;
43
-
44
- public constructor(
45
- private readonly logger: Logger,
46
- private readonly olmMachine: OlmMachine,
47
- public readonly outgoingRequestProcessor: OutgoingRequestProcessor,
48
- ) {}
49
-
50
- /**
51
- * Shut down as soon as possible the current loop of outgoing requests processing.
52
- */
53
- public stop(): void {
54
- this.stopped = true;
55
- }
56
-
57
- /**
58
- * Process the OutgoingRequests from the OlmMachine.
59
- *
60
- * This should be called at the end of each sync, to process any OlmMachine OutgoingRequests created by the rust sdk.
61
- * In some cases if OutgoingRequests need to be sent immediately, this can be called directly.
62
- *
63
- * Calls to doProcessOutgoingRequests() are processed synchronously, one after the other, in order.
64
- * If doProcessOutgoingRequests() is called while another call is still being processed, it will be queued.
65
- * Multiple calls to doProcessOutgoingRequests() when a call is already processing will be batched together.
66
- */
67
- public doProcessOutgoingRequests(): Promise<void> {
68
- // Flag that we need at least one more iteration of the loop.
69
- //
70
- // It is important that we do this even if the loop is currently running. There is potential for a race whereby
71
- // a request is added to the queue *after* `OlmMachine.outgoingRequests` checks the queue, but *before* it
72
- // returns. In such a case, the item could sit there unnoticed for some time.
73
- //
74
- // In order to circumvent the race, we set a flag which tells the loop to go round once again even if the
75
- // queue appears to be empty.
76
- if (!this.nextLoopDeferred) {
77
- this.nextLoopDeferred = Promise.withResolvers();
78
- }
79
-
80
- // ... and wait for it to complete.
81
- const result = this.nextLoopDeferred.promise;
82
-
83
- // set the loop going if it is not already.
84
- if (!this.outgoingRequestLoopRunning) {
85
- this.outgoingRequestLoop().catch((e) => {
86
- // this should not happen; outgoingRequestLoop should return any errors via `nextLoopDeferred`.
87
- /* istanbul ignore next */
88
- this.logger.error("Uncaught error in outgoing request loop", e);
89
- });
90
- }
91
- return result;
92
- }
93
-
94
- private async outgoingRequestLoop(): Promise<void> {
95
- /* istanbul ignore if */
96
- if (this.outgoingRequestLoopRunning) {
97
- throw new Error("Cannot run two outgoing request loops");
98
- }
99
- this.outgoingRequestLoopRunning = true;
100
- try {
101
- while (!this.stopped && this.nextLoopDeferred) {
102
- const loopTickResolvers = this.nextLoopDeferred;
103
-
104
- // reset `nextLoopDeferred` so that any future calls to `doProcessOutgoingRequests` are queued
105
- // for another additional iteration.
106
- this.nextLoopDeferred = undefined;
107
-
108
- // make the requests and feed the results back to the `nextLoopDeferred`
109
- await this.processOutgoingRequests().then(loopTickResolvers.resolve, loopTickResolvers.reject);
110
- }
111
- } finally {
112
- this.outgoingRequestLoopRunning = false;
113
- }
114
-
115
- if (this.nextLoopDeferred) {
116
- // the loop was stopped, but there was a call to `doProcessOutgoingRequests`. Make sure that
117
- // we reject the promise in case anything is waiting for it.
118
- this.nextLoopDeferred.reject(new Error("OutgoingRequestsManager was stopped"));
119
- }
120
- }
121
-
122
- /**
123
- * Make a single request to `olmMachine.outgoingRequests` and do the corresponding requests.
124
- */
125
- private async processOutgoingRequests(): Promise<void> {
126
- if (this.stopped) return;
127
-
128
- const outgoingRequests: OutgoingRequest[] = await this.olmMachine.outgoingRequests();
129
-
130
- let successes = 0;
131
- for (const request of outgoingRequests) {
132
- if (this.stopped) return;
133
- try {
134
- await logDuration(this.logger, `Make outgoing request ${request.type}`, async () => {
135
- await this.outgoingRequestProcessor.makeOutgoingRequest(request);
136
- successes++;
137
- });
138
- } catch (e) {
139
- // as part of the loop we silently ignore errors, but log them.
140
- // The rust sdk will retry the request later as it won't have been marked as sent.
141
- this.logger.error(`Failed to process outgoing request ${request.type}: ${e}`);
142
- }
143
- }
144
-
145
- // If we successfully handled any requests this time, more may have been queued as
146
- // part of that handling.
147
- //
148
- // For example, we may have processed a `/keys/claim` request, which
149
- // meant the rust side could establish an Olm session and is now ready to
150
- // send out an `m.secret.send` message.
151
- // (See https://github.com/element-hq/element-web/issues/30988.)
152
- //
153
- // So, if we have successfully processed any requests, flag that we need to make another
154
- // pass around the outgoing-requests loop, to make sure we handle any
155
- // pending requests immediately.
156
- //
157
- // If all requests failed (or there weren't any) we don't want to retry them in a tight
158
- // loop. They will be retried after the next sync.
159
- // (See https://github.com/element-hq/element-web/issues/31790.)
160
- if (successes > 0) {
161
- // We call doProcessOutgoingRequests but since we expect that we are
162
- // already processing outgoing requests, this call will not kick off
163
- // the processing loop, but just set `nextLoopDeferred` and return,
164
- // which will mean we loop one more time.
165
- this.doProcessOutgoingRequests().catch((e) => {
166
- this.logger.warn("processOutgoingRequests: Error re-checking outgoing requests", e);
167
- });
168
- }
169
- }
170
- }
1
+ /*
2
+ Copyright 2023 The Matrix.org Foundation C.I.C.
3
+
4
+ Licensed under the Apache License, Version 2.0 (the "License");
5
+ you may not use this file except in compliance with the License.
6
+ You may obtain a copy of the License at
7
+
8
+ http://www.apache.org/licenses/LICENSE-2.0
9
+
10
+ Unless required by applicable law or agreed to in writing, software
11
+ distributed under the License is distributed on an "AS IS" BASIS,
12
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13
+ See the License for the specific language governing permissions and
14
+ limitations under the License.
15
+ */
16
+
17
+ import { type OlmMachine, type OutgoingRequest } from "@matrix-org/matrix-sdk-crypto-wasm";
18
+
19
+ import { type OutgoingRequestProcessor } from "./OutgoingRequestProcessor.ts";
20
+ import { type Logger } from "../logger.ts";
21
+ import { logDuration } from "../utils.ts";
22
+
23
+ /**
24
+ * OutgoingRequestsManager: responsible for processing outgoing requests from the OlmMachine.
25
+ * Ensure that only one loop is going on at once, and that the requests are processed in order.
26
+ */
27
+ export class OutgoingRequestsManager {
28
+ /** whether {@link stop} has been called */
29
+ private stopped = false;
30
+
31
+ /** whether {@link outgoingRequestLoop} is currently running */
32
+ private outgoingRequestLoopRunning = false;
33
+
34
+ /**
35
+ * If there are additional calls to doProcessOutgoingRequests() while there is a current call running
36
+ * we need to remember in order to call `doProcessOutgoingRequests` again (as there could be new requests).
37
+ *
38
+ * If this is defined, it is an indication that we need to do another iteration; in this case the deferred
39
+ * will resolve once that next iteration completes. If it is undefined, there have been no new calls
40
+ * to `doProcessOutgoingRequests` since the current iteration started.
41
+ */
42
+ private nextLoopDeferred?: PromiseWithResolvers<void>;
43
+
44
+ public constructor(
45
+ private readonly logger: Logger,
46
+ private readonly olmMachine: OlmMachine,
47
+ public readonly outgoingRequestProcessor: OutgoingRequestProcessor,
48
+ ) {}
49
+
50
+ /**
51
+ * Shut down as soon as possible the current loop of outgoing requests processing.
52
+ */
53
+ public stop(): void {
54
+ this.stopped = true;
55
+ }
56
+
57
+ /**
58
+ * Process the OutgoingRequests from the OlmMachine.
59
+ *
60
+ * This should be called at the end of each sync, to process any OlmMachine OutgoingRequests created by the rust sdk.
61
+ * In some cases if OutgoingRequests need to be sent immediately, this can be called directly.
62
+ *
63
+ * Calls to doProcessOutgoingRequests() are processed synchronously, one after the other, in order.
64
+ * If doProcessOutgoingRequests() is called while another call is still being processed, it will be queued.
65
+ * Multiple calls to doProcessOutgoingRequests() when a call is already processing will be batched together.
66
+ */
67
+ public doProcessOutgoingRequests(): Promise<void> {
68
+ // Flag that we need at least one more iteration of the loop.
69
+ //
70
+ // It is important that we do this even if the loop is currently running. There is potential for a race whereby
71
+ // a request is added to the queue *after* `OlmMachine.outgoingRequests` checks the queue, but *before* it
72
+ // returns. In such a case, the item could sit there unnoticed for some time.
73
+ //
74
+ // In order to circumvent the race, we set a flag which tells the loop to go round once again even if the
75
+ // queue appears to be empty.
76
+ if (!this.nextLoopDeferred) {
77
+ this.nextLoopDeferred = Promise.withResolvers();
78
+ }
79
+
80
+ // ... and wait for it to complete.
81
+ const result = this.nextLoopDeferred.promise;
82
+
83
+ // set the loop going if it is not already.
84
+ if (!this.outgoingRequestLoopRunning) {
85
+ this.outgoingRequestLoop().catch((e) => {
86
+ // this should not happen; outgoingRequestLoop should return any errors via `nextLoopDeferred`.
87
+ /* istanbul ignore next */
88
+ this.logger.error("Uncaught error in outgoing request loop", e);
89
+ });
90
+ }
91
+ return result;
92
+ }
93
+
94
+ private async outgoingRequestLoop(): Promise<void> {
95
+ /* istanbul ignore if */
96
+ if (this.outgoingRequestLoopRunning) {
97
+ throw new Error("Cannot run two outgoing request loops");
98
+ }
99
+ this.outgoingRequestLoopRunning = true;
100
+ try {
101
+ while (!this.stopped && this.nextLoopDeferred) {
102
+ const loopTickResolvers = this.nextLoopDeferred;
103
+
104
+ // reset `nextLoopDeferred` so that any future calls to `doProcessOutgoingRequests` are queued
105
+ // for another additional iteration.
106
+ this.nextLoopDeferred = undefined;
107
+
108
+ // make the requests and feed the results back to the `nextLoopDeferred`
109
+ await this.processOutgoingRequests().then(loopTickResolvers.resolve, loopTickResolvers.reject);
110
+ }
111
+ } finally {
112
+ this.outgoingRequestLoopRunning = false;
113
+ }
114
+
115
+ if (this.nextLoopDeferred) {
116
+ // the loop was stopped, but there was a call to `doProcessOutgoingRequests`. Make sure that
117
+ // we reject the promise in case anything is waiting for it.
118
+ this.nextLoopDeferred.reject(new Error("OutgoingRequestsManager was stopped"));
119
+ }
120
+ }
121
+
122
+ /**
123
+ * Make a single request to `olmMachine.outgoingRequests` and do the corresponding requests.
124
+ */
125
+ private async processOutgoingRequests(): Promise<void> {
126
+ if (this.stopped) return;
127
+
128
+ const outgoingRequests: OutgoingRequest[] = await this.olmMachine.outgoingRequests();
129
+
130
+ let successes = 0;
131
+ for (const request of outgoingRequests) {
132
+ if (this.stopped) return;
133
+ try {
134
+ await logDuration(this.logger, `Make outgoing request ${request.type}`, async () => {
135
+ await this.outgoingRequestProcessor.makeOutgoingRequest(request);
136
+ successes++;
137
+ });
138
+ } catch (e) {
139
+ // as part of the loop we silently ignore errors, but log them.
140
+ // The rust sdk will retry the request later as it won't have been marked as sent.
141
+ this.logger.error(`Failed to process outgoing request ${request.type}: ${e}`);
142
+ }
143
+ }
144
+
145
+ // If we successfully handled any requests this time, more may have been queued as
146
+ // part of that handling.
147
+ //
148
+ // For example, we may have processed a `/keys/claim` request, which
149
+ // meant the rust side could establish an Olm session and is now ready to
150
+ // send out an `m.secret.send` message.
151
+ // (See https://github.com/element-hq/element-web/issues/30988.)
152
+ //
153
+ // So, if we have successfully processed any requests, flag that we need to make another
154
+ // pass around the outgoing-requests loop, to make sure we handle any
155
+ // pending requests immediately.
156
+ //
157
+ // If all requests failed (or there weren't any) we don't want to retry them in a tight
158
+ // loop. They will be retried after the next sync.
159
+ // (See https://github.com/element-hq/element-web/issues/31790.)
160
+ if (successes > 0) {
161
+ // We call doProcessOutgoingRequests but since we expect that we are
162
+ // already processing outgoing requests, this call will not kick off
163
+ // the processing loop, but just set `nextLoopDeferred` and return,
164
+ // which will mean we loop one more time.
165
+ this.doProcessOutgoingRequests().catch((e) => {
166
+ this.logger.warn("processOutgoingRequests: Error re-checking outgoing requests", e);
167
+ });
168
+ }
169
+ }
170
+ }
@@ -1,128 +1,128 @@
1
- /*
2
- Copyright 2023 The Matrix.org Foundation C.I.C.
3
-
4
- Licensed under the Apache License, Version 2.0 (the "License");
5
- you may not use this file except in compliance with the License.
6
- You may obtain a copy of the License at
7
-
8
- http://www.apache.org/licenses/LICENSE-2.0
9
-
10
- Unless required by applicable law or agreed to in writing, software
11
- distributed under the License is distributed on an "AS IS" BASIS,
12
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13
- See the License for the specific language governing permissions and
14
- limitations under the License.
15
- */
16
-
17
- import * as RustSdkCryptoJs from "@matrix-org/matrix-sdk-crypto-wasm";
18
-
19
- import { Device, DeviceVerification } from "../models/device.ts";
20
- import { type DeviceKeys } from "../client.ts";
21
-
22
- /**
23
- * Convert a {@link RustSdkCryptoJs.Device} to a {@link Device}
24
- * @param device - Rust Sdk device
25
- * @param userId - owner of the device
26
- *
27
- * @internal
28
- */
29
- export function rustDeviceToJsDevice(device: RustSdkCryptoJs.Device, userId: RustSdkCryptoJs.UserId): Device {
30
- // Copy rust device keys to Device.keys
31
- const keys = new Map<string, string>();
32
- for (const [keyId, key] of device.keys.entries()) {
33
- keys.set(keyId.toString(), key.toBase64());
34
- }
35
-
36
- // Compute verified from device state
37
- let verified: DeviceVerification = DeviceVerification.Unverified;
38
- if (device.isBlacklisted()) {
39
- verified = DeviceVerification.Blocked;
40
- } else if (device.isVerified()) {
41
- verified = DeviceVerification.Verified;
42
- }
43
-
44
- // Convert rust signatures to Device.signatures
45
- const signatures = new Map<string, Map<string, string>>();
46
- const mayBeSignatureMap: Map<string, RustSdkCryptoJs.MaybeSignature> | undefined = device.signatures.get(userId);
47
- if (mayBeSignatureMap) {
48
- const convertedSignatures = new Map<string, string>();
49
- // Convert maybeSignatures map to a Map<string, string>
50
- for (const [key, value] of mayBeSignatureMap.entries()) {
51
- if (value.isValid() && value.signature) {
52
- convertedSignatures.set(key, value.signature.toBase64());
53
- }
54
- }
55
-
56
- signatures.set(userId.toString(), convertedSignatures);
57
- }
58
-
59
- // Convert rust algorithms to algorithms
60
- const rustAlgorithms: RustSdkCryptoJs.EncryptionAlgorithm[] = device.algorithms;
61
- // Use set to ensure that algorithms are not duplicated
62
- const algorithms = new Set<string>();
63
- rustAlgorithms.forEach((algorithm) => {
64
- switch (algorithm) {
65
- case RustSdkCryptoJs.EncryptionAlgorithm.MegolmV1AesSha2:
66
- algorithms.add("m.megolm.v1.aes-sha2");
67
- break;
68
- case RustSdkCryptoJs.EncryptionAlgorithm.OlmV1Curve25519AesSha2:
69
- default:
70
- algorithms.add("m.olm.v1.curve25519-aes-sha2");
71
- break;
72
- }
73
- });
74
-
75
- return new Device({
76
- deviceId: device.deviceId.toString(),
77
- userId: userId.toString(),
78
- keys,
79
- algorithms: Array.from(algorithms),
80
- verified,
81
- signatures,
82
- displayName: device.displayName,
83
- dehydrated: device.isDehydrated,
84
- });
85
- }
86
-
87
- /**
88
- * Convert {@link DeviceKeys} from `/keys/query` request to a `Map<string, Device>`
89
- * @param deviceKeys - Device keys object to convert
90
- *
91
- * @internal
92
- */
93
- export function deviceKeysToDeviceMap(deviceKeys: DeviceKeys): Map<string, Device> {
94
- return new Map(
95
- Object.entries(deviceKeys).map(([deviceId, device]) => [deviceId, downloadDeviceToJsDevice(device)]),
96
- );
97
- }
98
-
99
- // Device from `/keys/query` request
100
- type QueryDevice = DeviceKeys[keyof DeviceKeys];
101
-
102
- /**
103
- * Convert `/keys/query` {@link QueryDevice} device to {@link Device}
104
- * @param device - Device from `/keys/query` request
105
- *
106
- * @internal
107
- */
108
- export function downloadDeviceToJsDevice(device: QueryDevice): Device {
109
- const keys = new Map(Object.entries(device.keys));
110
- const displayName = device.unsigned?.device_display_name;
111
-
112
- const signatures = new Map<string, Map<string, string>>();
113
- if (device.signatures) {
114
- for (const userId in device.signatures) {
115
- signatures.set(userId, new Map(Object.entries(device.signatures[userId])));
116
- }
117
- }
118
-
119
- return new Device({
120
- deviceId: device.device_id,
121
- userId: device.user_id,
122
- keys,
123
- algorithms: device.algorithms,
124
- verified: DeviceVerification.Unverified,
125
- signatures,
126
- displayName,
127
- });
128
- }
1
+ /*
2
+ Copyright 2023 The Matrix.org Foundation C.I.C.
3
+
4
+ Licensed under the Apache License, Version 2.0 (the "License");
5
+ you may not use this file except in compliance with the License.
6
+ You may obtain a copy of the License at
7
+
8
+ http://www.apache.org/licenses/LICENSE-2.0
9
+
10
+ Unless required by applicable law or agreed to in writing, software
11
+ distributed under the License is distributed on an "AS IS" BASIS,
12
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13
+ See the License for the specific language governing permissions and
14
+ limitations under the License.
15
+ */
16
+
17
+ import * as RustSdkCryptoJs from "@matrix-org/matrix-sdk-crypto-wasm";
18
+
19
+ import { Device, DeviceVerification } from "../models/device.ts";
20
+ import { type DeviceKeys } from "../client.ts";
21
+
22
+ /**
23
+ * Convert a {@link RustSdkCryptoJs.Device} to a {@link Device}
24
+ * @param device - Rust Sdk device
25
+ * @param userId - owner of the device
26
+ *
27
+ * @internal
28
+ */
29
+ export function rustDeviceToJsDevice(device: RustSdkCryptoJs.Device, userId: RustSdkCryptoJs.UserId): Device {
30
+ // Copy rust device keys to Device.keys
31
+ const keys = new Map<string, string>();
32
+ for (const [keyId, key] of device.keys.entries()) {
33
+ keys.set(keyId.toString(), key.toBase64());
34
+ }
35
+
36
+ // Compute verified from device state
37
+ let verified: DeviceVerification = DeviceVerification.Unverified;
38
+ if (device.isBlacklisted()) {
39
+ verified = DeviceVerification.Blocked;
40
+ } else if (device.isVerified()) {
41
+ verified = DeviceVerification.Verified;
42
+ }
43
+
44
+ // Convert rust signatures to Device.signatures
45
+ const signatures = new Map<string, Map<string, string>>();
46
+ const mayBeSignatureMap: Map<string, RustSdkCryptoJs.MaybeSignature> | undefined = device.signatures.get(userId);
47
+ if (mayBeSignatureMap) {
48
+ const convertedSignatures = new Map<string, string>();
49
+ // Convert maybeSignatures map to a Map<string, string>
50
+ for (const [key, value] of mayBeSignatureMap.entries()) {
51
+ if (value.isValid() && value.signature) {
52
+ convertedSignatures.set(key, value.signature.toBase64());
53
+ }
54
+ }
55
+
56
+ signatures.set(userId.toString(), convertedSignatures);
57
+ }
58
+
59
+ // Convert rust algorithms to algorithms
60
+ const rustAlgorithms: RustSdkCryptoJs.EncryptionAlgorithm[] = device.algorithms;
61
+ // Use set to ensure that algorithms are not duplicated
62
+ const algorithms = new Set<string>();
63
+ rustAlgorithms.forEach((algorithm) => {
64
+ switch (algorithm) {
65
+ case RustSdkCryptoJs.EncryptionAlgorithm.MegolmV1AesSha2:
66
+ algorithms.add("m.megolm.v1.aes-sha2");
67
+ break;
68
+ case RustSdkCryptoJs.EncryptionAlgorithm.OlmV1Curve25519AesSha2:
69
+ default:
70
+ algorithms.add("m.olm.v1.curve25519-aes-sha2");
71
+ break;
72
+ }
73
+ });
74
+
75
+ return new Device({
76
+ deviceId: device.deviceId.toString(),
77
+ userId: userId.toString(),
78
+ keys,
79
+ algorithms: Array.from(algorithms),
80
+ verified,
81
+ signatures,
82
+ displayName: device.displayName,
83
+ dehydrated: device.isDehydrated,
84
+ });
85
+ }
86
+
87
+ /**
88
+ * Convert {@link DeviceKeys} from `/keys/query` request to a `Map<string, Device>`
89
+ * @param deviceKeys - Device keys object to convert
90
+ *
91
+ * @internal
92
+ */
93
+ export function deviceKeysToDeviceMap(deviceKeys: DeviceKeys): Map<string, Device> {
94
+ return new Map(
95
+ Object.entries(deviceKeys).map(([deviceId, device]) => [deviceId, downloadDeviceToJsDevice(device)]),
96
+ );
97
+ }
98
+
99
+ // Device from `/keys/query` request
100
+ type QueryDevice = DeviceKeys[keyof DeviceKeys];
101
+
102
+ /**
103
+ * Convert `/keys/query` {@link QueryDevice} device to {@link Device}
104
+ * @param device - Device from `/keys/query` request
105
+ *
106
+ * @internal
107
+ */
108
+ export function downloadDeviceToJsDevice(device: QueryDevice): Device {
109
+ const keys = new Map(Object.entries(device.keys));
110
+ const displayName = device.unsigned?.device_display_name;
111
+
112
+ const signatures = new Map<string, Map<string, string>>();
113
+ if (device.signatures) {
114
+ for (const userId in device.signatures) {
115
+ signatures.set(userId, new Map(Object.entries(device.signatures[userId])));
116
+ }
117
+ }
118
+
119
+ return new Device({
120
+ deviceId: device.device_id,
121
+ userId: device.user_id,
122
+ keys,
123
+ algorithms: device.algorithms,
124
+ verified: DeviceVerification.Unverified,
125
+ signatures,
126
+ displayName,
127
+ });
128
+ }