@jeongsu816/matrix-bot-sdk 0.0.0-stage → 0.8.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 (377) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +50 -2
  3. package/lib/AdminApis.d.ts +52 -0
  4. package/lib/AdminApis.js +29 -0
  5. package/lib/AdminApis.js.map +1 -0
  6. package/lib/DMs.d.ts +48 -0
  7. package/lib/DMs.js +160 -0
  8. package/lib/DMs.js.map +1 -0
  9. package/lib/IFilter.d.ts +7 -0
  10. package/lib/IFilter.js +3 -0
  11. package/lib/IFilter.js.map +1 -0
  12. package/lib/MatrixAuth.d.ts +45 -0
  13. package/lib/MatrixAuth.js +125 -0
  14. package/lib/MatrixAuth.js.map +1 -0
  15. package/lib/MatrixClient.d.ts +834 -0
  16. package/lib/MatrixClient.js +2268 -0
  17. package/lib/MatrixClient.js.map +1 -0
  18. package/lib/PantalaimonClient.d.ts +42 -0
  19. package/lib/PantalaimonClient.js +44 -0
  20. package/lib/PantalaimonClient.js.map +1 -0
  21. package/lib/SynapseAdminApis.d.ts +350 -0
  22. package/lib/SynapseAdminApis.js +244 -0
  23. package/lib/SynapseAdminApis.js.map +1 -0
  24. package/lib/SynchronousMatrixClient.d.ts +82 -0
  25. package/lib/SynchronousMatrixClient.js +130 -0
  26. package/lib/SynchronousMatrixClient.js.map +1 -0
  27. package/lib/UnstableApis.d.ts +43 -0
  28. package/lib/UnstableApis.js +74 -0
  29. package/lib/UnstableApis.js.map +1 -0
  30. package/lib/appservice/Appservice.d.ts +328 -0
  31. package/lib/appservice/Appservice.js +803 -0
  32. package/lib/appservice/Appservice.js.map +1 -0
  33. package/lib/appservice/Intent.d.ts +113 -0
  34. package/lib/appservice/Intent.js +363 -0
  35. package/lib/appservice/Intent.js.map +1 -0
  36. package/lib/appservice/MatrixBridge.d.ts +85 -0
  37. package/lib/appservice/MatrixBridge.js +111 -0
  38. package/lib/appservice/MatrixBridge.js.map +1 -0
  39. package/lib/appservice/UnstableAppserviceApis.d.ts +41 -0
  40. package/lib/appservice/UnstableAppserviceApis.js +62 -0
  41. package/lib/appservice/UnstableAppserviceApis.js.map +1 -0
  42. package/lib/appservice/http_responses.d.ts +77 -0
  43. package/lib/appservice/http_responses.js +3 -0
  44. package/lib/appservice/http_responses.js.map +1 -0
  45. package/lib/b64.d.ts +42 -0
  46. package/lib/b64.js +68 -0
  47. package/lib/b64.js.map +1 -0
  48. package/lib/e2ee/CrossSigningBootstrap.d.ts +73 -0
  49. package/lib/e2ee/CrossSigningBootstrap.js +86 -0
  50. package/lib/e2ee/CrossSigningBootstrap.js.map +1 -0
  51. package/lib/e2ee/CryptoClient.d.ts +163 -0
  52. package/lib/e2ee/CryptoClient.js +382 -0
  53. package/lib/e2ee/CryptoClient.js.map +1 -0
  54. package/lib/e2ee/ICryptoRoomInformation.d.ts +8 -0
  55. package/lib/e2ee/ICryptoRoomInformation.js +3 -0
  56. package/lib/e2ee/ICryptoRoomInformation.js.map +1 -0
  57. package/lib/e2ee/RoomTracker.d.ts +41 -0
  58. package/lib/e2ee/RoomTracker.js +96 -0
  59. package/lib/e2ee/RoomTracker.js.map +1 -0
  60. package/lib/e2ee/RustEngine.d.ts +149 -0
  61. package/lib/e2ee/RustEngine.js +467 -0
  62. package/lib/e2ee/RustEngine.js.map +1 -0
  63. package/lib/e2ee/decorators.d.ts +10 -0
  64. package/lib/e2ee/decorators.js +37 -0
  65. package/lib/e2ee/decorators.js.map +1 -0
  66. package/lib/helpers/MatrixEntity.d.ts +37 -0
  67. package/lib/helpers/MatrixEntity.js +67 -0
  68. package/lib/helpers/MatrixEntity.js.map +1 -0
  69. package/lib/helpers/MatrixGlob.d.ts +22 -0
  70. package/lib/helpers/MatrixGlob.js +35 -0
  71. package/lib/helpers/MatrixGlob.js.map +1 -0
  72. package/lib/helpers/MentionPill.d.ts +40 -0
  73. package/lib/helpers/MentionPill.js +91 -0
  74. package/lib/helpers/MentionPill.js.map +1 -0
  75. package/lib/helpers/Permalinks.d.ts +58 -0
  76. package/lib/helpers/Permalinks.js +73 -0
  77. package/lib/helpers/Permalinks.js.map +1 -0
  78. package/lib/helpers/ProfileCache.d.ts +48 -0
  79. package/lib/helpers/ProfileCache.js +114 -0
  80. package/lib/helpers/ProfileCache.js.map +1 -0
  81. package/lib/helpers/RichReply.d.ts +17 -0
  82. package/lib/helpers/RichReply.js +47 -0
  83. package/lib/helpers/RichReply.js.map +1 -0
  84. package/lib/helpers/UnpaddedBase64.d.ts +31 -0
  85. package/lib/helpers/UnpaddedBase64.js +45 -0
  86. package/lib/helpers/UnpaddedBase64.js.map +1 -0
  87. package/lib/http.d.ts +17 -0
  88. package/lib/http.js +147 -0
  89. package/lib/http.js.map +1 -0
  90. package/lib/identity/IdentityClient.d.ts +93 -0
  91. package/lib/identity/IdentityClient.js +248 -0
  92. package/lib/identity/IdentityClient.js.map +1 -0
  93. package/lib/index.d.ts +91 -0
  94. package/lib/index.js +125 -0
  95. package/lib/index.js.map +1 -0
  96. package/lib/logging/ConsoleLogger.d.ts +12 -0
  97. package/lib/logging/ConsoleLogger.js +28 -0
  98. package/lib/logging/ConsoleLogger.js.map +1 -0
  99. package/lib/logging/ILogger.d.ts +36 -0
  100. package/lib/logging/ILogger.js +3 -0
  101. package/lib/logging/ILogger.js.map +1 -0
  102. package/lib/logging/LogService.d.ts +100 -0
  103. package/lib/logging/LogService.js +169 -0
  104. package/lib/logging/LogService.js.map +1 -0
  105. package/lib/logging/RichConsoleLogger.d.ts +20 -0
  106. package/lib/logging/RichConsoleLogger.js +41 -0
  107. package/lib/logging/RichConsoleLogger.js.map +1 -0
  108. package/lib/metrics/IMetricListener.d.ts +52 -0
  109. package/lib/metrics/IMetricListener.js +3 -0
  110. package/lib/metrics/IMetricListener.js.map +1 -0
  111. package/lib/metrics/Metrics.d.ts +66 -0
  112. package/lib/metrics/Metrics.js +128 -0
  113. package/lib/metrics/Metrics.js.map +1 -0
  114. package/lib/metrics/contexts.d.ts +51 -0
  115. package/lib/metrics/contexts.js +3 -0
  116. package/lib/metrics/contexts.js.map +1 -0
  117. package/lib/metrics/decorators.d.ts +15 -0
  118. package/lib/metrics/decorators.js +92 -0
  119. package/lib/metrics/decorators.js.map +1 -0
  120. package/lib/metrics/names.d.ts +45 -0
  121. package/lib/metrics/names.js +49 -0
  122. package/lib/metrics/names.js.map +1 -0
  123. package/lib/mixins/AutojoinRoomsMixin.d.ts +10 -0
  124. package/lib/mixins/AutojoinRoomsMixin.js +25 -0
  125. package/lib/mixins/AutojoinRoomsMixin.js.map +1 -0
  126. package/lib/mixins/AutojoinUpgradedRoomsMixin.d.ts +10 -0
  127. package/lib/mixins/AutojoinUpgradedRoomsMixin.js +40 -0
  128. package/lib/mixins/AutojoinUpgradedRoomsMixin.js.map +1 -0
  129. package/lib/models/Account.d.ts +8 -0
  130. package/lib/models/Account.js +3 -0
  131. package/lib/models/Account.js.map +1 -0
  132. package/lib/models/CreateRoom.d.ts +125 -0
  133. package/lib/models/CreateRoom.js +3 -0
  134. package/lib/models/CreateRoom.js.map +1 -0
  135. package/lib/models/Crypto.d.ts +167 -0
  136. package/lib/models/Crypto.js +31 -0
  137. package/lib/models/Crypto.js.map +1 -0
  138. package/lib/models/EventContext.d.ts +19 -0
  139. package/lib/models/EventContext.js +3 -0
  140. package/lib/models/EventContext.js.map +1 -0
  141. package/lib/models/IdentityServerModels.d.ts +20 -0
  142. package/lib/models/IdentityServerModels.js +3 -0
  143. package/lib/models/IdentityServerModels.js.map +1 -0
  144. package/lib/models/MSC2176.d.ts +42 -0
  145. package/lib/models/MSC2176.js +3 -0
  146. package/lib/models/MSC2176.js.map +1 -0
  147. package/lib/models/MatrixError.d.ts +38 -0
  148. package/lib/models/MatrixError.js +30 -0
  149. package/lib/models/MatrixError.js.map +1 -0
  150. package/lib/models/MatrixProfile.d.ts +43 -0
  151. package/lib/models/MatrixProfile.js +43 -0
  152. package/lib/models/MatrixProfile.js.map +1 -0
  153. package/lib/models/OpenIDConnect.d.ts +10 -0
  154. package/lib/models/OpenIDConnect.js +3 -0
  155. package/lib/models/OpenIDConnect.js.map +1 -0
  156. package/lib/models/Policies.d.ts +25 -0
  157. package/lib/models/Policies.js +3 -0
  158. package/lib/models/Policies.js.map +1 -0
  159. package/lib/models/PowerLevelAction.d.ts +27 -0
  160. package/lib/models/PowerLevelAction.js +32 -0
  161. package/lib/models/PowerLevelAction.js.map +1 -0
  162. package/lib/models/PowerLevelBounds.d.ts +15 -0
  163. package/lib/models/PowerLevelBounds.js +3 -0
  164. package/lib/models/PowerLevelBounds.js.map +1 -0
  165. package/lib/models/Presence.d.ts +25 -0
  166. package/lib/models/Presence.js +38 -0
  167. package/lib/models/Presence.js.map +1 -0
  168. package/lib/models/ServerVersions.d.ts +8 -0
  169. package/lib/models/ServerVersions.js +3 -0
  170. package/lib/models/ServerVersions.js.map +1 -0
  171. package/lib/models/Spaces.d.ts +116 -0
  172. package/lib/models/Spaces.js +91 -0
  173. package/lib/models/Spaces.js.map +1 -0
  174. package/lib/models/Threepid.d.ts +8 -0
  175. package/lib/models/Threepid.js +3 -0
  176. package/lib/models/Threepid.js.map +1 -0
  177. package/lib/models/events/AliasesEvent.d.ts +27 -0
  178. package/lib/models/events/AliasesEvent.js +27 -0
  179. package/lib/models/events/AliasesEvent.js.map +1 -0
  180. package/lib/models/events/CanonicalAliasEvent.d.ts +23 -0
  181. package/lib/models/events/CanonicalAliasEvent.js +21 -0
  182. package/lib/models/events/CanonicalAliasEvent.js.map +1 -0
  183. package/lib/models/events/CreateEvent.d.ts +63 -0
  184. package/lib/models/events/CreateEvent.js +33 -0
  185. package/lib/models/events/CreateEvent.js.map +1 -0
  186. package/lib/models/events/EncryptedRoomEvent.d.ts +42 -0
  187. package/lib/models/events/EncryptedRoomEvent.js +28 -0
  188. package/lib/models/events/EncryptedRoomEvent.js.map +1 -0
  189. package/lib/models/events/EncryptionEvent.d.ts +47 -0
  190. package/lib/models/events/EncryptionEvent.js +42 -0
  191. package/lib/models/events/EncryptionEvent.js.map +1 -0
  192. package/lib/models/events/Event.d.ts +26 -0
  193. package/lib/models/events/Event.js +40 -0
  194. package/lib/models/events/Event.js.map +1 -0
  195. package/lib/models/events/EventKind.d.ts +15 -0
  196. package/lib/models/events/EventKind.js +20 -0
  197. package/lib/models/events/EventKind.js.map +1 -0
  198. package/lib/models/events/InvalidEventError.d.ts +14 -0
  199. package/lib/models/events/InvalidEventError.js +24 -0
  200. package/lib/models/events/InvalidEventError.js.map +1 -0
  201. package/lib/models/events/JoinRulesEvent.d.ts +29 -0
  202. package/lib/models/events/JoinRulesEvent.js +21 -0
  203. package/lib/models/events/JoinRulesEvent.js.map +1 -0
  204. package/lib/models/events/MembershipEvent.d.ts +54 -0
  205. package/lib/models/events/MembershipEvent.js +49 -0
  206. package/lib/models/events/MembershipEvent.js.map +1 -0
  207. package/lib/models/events/MessageEvent.d.ts +233 -0
  208. package/lib/models/events/MessageEvent.js +49 -0
  209. package/lib/models/events/MessageEvent.js.map +1 -0
  210. package/lib/models/events/PinnedEventsEvent.d.ts +23 -0
  211. package/lib/models/events/PinnedEventsEvent.js +21 -0
  212. package/lib/models/events/PinnedEventsEvent.js.map +1 -0
  213. package/lib/models/events/PowerLevelsEvent.d.ts +96 -0
  214. package/lib/models/events/PowerLevelsEvent.js +70 -0
  215. package/lib/models/events/PowerLevelsEvent.js.map +1 -0
  216. package/lib/models/events/PresenceEvent.d.ts +56 -0
  217. package/lib/models/events/PresenceEvent.js +21 -0
  218. package/lib/models/events/PresenceEvent.js.map +1 -0
  219. package/lib/models/events/RedactionEvent.d.ts +28 -0
  220. package/lib/models/events/RedactionEvent.js +36 -0
  221. package/lib/models/events/RedactionEvent.js.map +1 -0
  222. package/lib/models/events/RoomAvatarEvent.d.ts +28 -0
  223. package/lib/models/events/RoomAvatarEvent.js +21 -0
  224. package/lib/models/events/RoomAvatarEvent.js.map +1 -0
  225. package/lib/models/events/RoomEvent.d.ts +58 -0
  226. package/lib/models/events/RoomEvent.js +57 -0
  227. package/lib/models/events/RoomEvent.js.map +1 -0
  228. package/lib/models/events/RoomNameEvent.d.ts +20 -0
  229. package/lib/models/events/RoomNameEvent.js +21 -0
  230. package/lib/models/events/RoomNameEvent.js.map +1 -0
  231. package/lib/models/events/RoomTopicEvent.d.ts +20 -0
  232. package/lib/models/events/RoomTopicEvent.js +21 -0
  233. package/lib/models/events/RoomTopicEvent.js.map +1 -0
  234. package/lib/models/events/SpaceChildEvent.d.ts +53 -0
  235. package/lib/models/events/SpaceChildEvent.js +49 -0
  236. package/lib/models/events/SpaceChildEvent.js.map +1 -0
  237. package/lib/models/events/converter.d.ts +8 -0
  238. package/lib/models/events/converter.js +50 -0
  239. package/lib/models/events/converter.js.map +1 -0
  240. package/lib/models/unstable/MediaInfo.d.ts +16 -0
  241. package/lib/models/unstable/MediaInfo.js +3 -0
  242. package/lib/models/unstable/MediaInfo.js.map +1 -0
  243. package/lib/preprocessors/IPreprocessor.d.ts +22 -0
  244. package/lib/preprocessors/IPreprocessor.js +3 -0
  245. package/lib/preprocessors/IPreprocessor.js.map +1 -0
  246. package/lib/preprocessors/RichRepliesPreprocessor.d.ts +67 -0
  247. package/lib/preprocessors/RichRepliesPreprocessor.js +112 -0
  248. package/lib/preprocessors/RichRepliesPreprocessor.js.map +1 -0
  249. package/lib/request.d.ts +13 -0
  250. package/lib/request.js +23 -0
  251. package/lib/request.js.map +1 -0
  252. package/lib/simple-validation.d.ts +10 -0
  253. package/lib/simple-validation.js +30 -0
  254. package/lib/simple-validation.js.map +1 -0
  255. package/lib/storage/IAppserviceStorageProvider.d.ts +48 -0
  256. package/lib/storage/IAppserviceStorageProvider.js +3 -0
  257. package/lib/storage/IAppserviceStorageProvider.js.map +1 -0
  258. package/lib/storage/ICryptoStorageProvider.d.ts +32 -0
  259. package/lib/storage/ICryptoStorageProvider.js +3 -0
  260. package/lib/storage/ICryptoStorageProvider.js.map +1 -0
  261. package/lib/storage/IStorageProvider.d.ts +47 -0
  262. package/lib/storage/IStorageProvider.js +3 -0
  263. package/lib/storage/IStorageProvider.js.map +1 -0
  264. package/lib/storage/MemoryStorageProvider.d.ts +26 -0
  265. package/lib/storage/MemoryStorageProvider.js +55 -0
  266. package/lib/storage/MemoryStorageProvider.js.map +1 -0
  267. package/lib/storage/RustSdkCryptoStorageProvider.d.ts +38 -0
  268. package/lib/storage/RustSdkCryptoStorageProvider.js +69 -0
  269. package/lib/storage/RustSdkCryptoStorageProvider.js.map +1 -0
  270. package/lib/storage/SimpleFsStorageProvider.d.ts +31 -0
  271. package/lib/storage/SimpleFsStorageProvider.js +122 -0
  272. package/lib/storage/SimpleFsStorageProvider.js.map +1 -0
  273. package/lib/storage/SimplePostgresStorageProvider.d.ts +32 -0
  274. package/lib/storage/SimplePostgresStorageProvider.js +148 -0
  275. package/lib/storage/SimplePostgresStorageProvider.js.map +1 -0
  276. package/lib/strategies/AppserviceJoinRoomStrategy.d.ts +14 -0
  277. package/lib/strategies/AppserviceJoinRoomStrategy.js +54 -0
  278. package/lib/strategies/AppserviceJoinRoomStrategy.js.map +1 -0
  279. package/lib/strategies/JoinRoomStrategy.d.ts +11 -0
  280. package/lib/strategies/JoinRoomStrategy.js +44 -0
  281. package/lib/strategies/JoinRoomStrategy.js.map +1 -0
  282. package/package.json +136 -4
  283. package/src/AdminApis.ts +60 -0
  284. package/src/DMs.ts +164 -0
  285. package/src/IFilter.ts +7 -0
  286. package/src/MatrixAuth.ts +129 -0
  287. package/src/MatrixClient.ts +2046 -0
  288. package/src/PantalaimonClient.ts +62 -0
  289. package/src/SynapseAdminApis.ts +482 -0
  290. package/src/SynchronousMatrixClient.ts +129 -0
  291. package/src/UnstableApis.ts +75 -0
  292. package/src/appservice/Appservice.ts +1089 -0
  293. package/src/appservice/Intent.ts +342 -0
  294. package/src/appservice/MatrixBridge.ts +139 -0
  295. package/src/appservice/UnstableAppserviceApis.ts +63 -0
  296. package/src/appservice/http_responses.ts +77 -0
  297. package/src/b64.ts +63 -0
  298. package/src/e2ee/CrossSigningBootstrap.ts +141 -0
  299. package/src/e2ee/CryptoClient.ts +378 -0
  300. package/src/e2ee/ICryptoRoomInformation.ts +9 -0
  301. package/src/e2ee/RoomTracker.ts +99 -0
  302. package/src/e2ee/RustEngine.ts +580 -0
  303. package/src/e2ee/decorators.ts +38 -0
  304. package/src/helpers/MatrixEntity.ts +65 -0
  305. package/src/helpers/MatrixGlob.ts +38 -0
  306. package/src/helpers/MentionPill.ts +95 -0
  307. package/src/helpers/Permalinks.ts +101 -0
  308. package/src/helpers/ProfileCache.ts +119 -0
  309. package/src/helpers/RichReply.ts +46 -0
  310. package/src/helpers/UnpaddedBase64.ts +44 -0
  311. package/src/http.ts +166 -0
  312. package/src/identity/IdentityClient.ts +225 -0
  313. package/src/index.ts +125 -0
  314. package/src/logging/ConsoleLogger.ts +31 -0
  315. package/src/logging/ILogger.ts +40 -0
  316. package/src/logging/LogService.ts +167 -0
  317. package/src/logging/RichConsoleLogger.ts +70 -0
  318. package/src/metrics/IMetricListener.ts +57 -0
  319. package/src/metrics/Metrics.ts +134 -0
  320. package/src/metrics/contexts.ts +56 -0
  321. package/src/metrics/decorators.ts +94 -0
  322. package/src/metrics/names.ts +53 -0
  323. package/src/mixins/AutojoinRoomsMixin.ts +24 -0
  324. package/src/mixins/AutojoinUpgradedRoomsMixin.ts +37 -0
  325. package/src/models/Account.ts +8 -0
  326. package/src/models/CreateRoom.ts +144 -0
  327. package/src/models/Crypto.ts +188 -0
  328. package/src/models/EventContext.ts +23 -0
  329. package/src/models/IdentityServerModels.ts +18 -0
  330. package/src/models/MSC2176.ts +47 -0
  331. package/src/models/MatrixError.ts +39 -0
  332. package/src/models/MatrixProfile.ts +55 -0
  333. package/src/models/OpenIDConnect.ts +10 -0
  334. package/src/models/Policies.ts +28 -0
  335. package/src/models/PowerLevelAction.ts +31 -0
  336. package/src/models/PowerLevelBounds.ts +16 -0
  337. package/src/models/Presence.ts +38 -0
  338. package/src/models/ServerVersions.ts +8 -0
  339. package/src/models/Spaces.ts +167 -0
  340. package/src/models/Threepid.ts +8 -0
  341. package/src/models/events/AliasesEvent.ts +37 -0
  342. package/src/models/events/CanonicalAliasEvent.ts +30 -0
  343. package/src/models/events/CreateEvent.ts +82 -0
  344. package/src/models/events/EncryptedRoomEvent.ts +58 -0
  345. package/src/models/events/EncryptionEvent.ts +63 -0
  346. package/src/models/events/Event.ts +38 -0
  347. package/src/models/events/EventKind.ts +16 -0
  348. package/src/models/events/InvalidEventError.ts +19 -0
  349. package/src/models/events/JoinRulesEvent.ts +37 -0
  350. package/src/models/events/MembershipEvent.ts +77 -0
  351. package/src/models/events/MessageEvent.ts +292 -0
  352. package/src/models/events/PinnedEventsEvent.ts +30 -0
  353. package/src/models/events/PowerLevelsEvent.ts +135 -0
  354. package/src/models/events/PresenceEvent.ts +69 -0
  355. package/src/models/events/RedactionEvent.ts +44 -0
  356. package/src/models/events/RoomAvatarEvent.ts +36 -0
  357. package/src/models/events/RoomEvent.ts +83 -0
  358. package/src/models/events/RoomNameEvent.ts +27 -0
  359. package/src/models/events/RoomTopicEvent.ts +27 -0
  360. package/src/models/events/SpaceChildEvent.ts +74 -0
  361. package/src/models/events/_MissingEvents.md +35 -0
  362. package/src/models/events/converter.ts +47 -0
  363. package/src/models/unstable/MediaInfo.ts +16 -0
  364. package/src/preprocessors/IPreprocessor.ts +24 -0
  365. package/src/preprocessors/RichRepliesPreprocessor.ts +159 -0
  366. package/src/request.ts +21 -0
  367. package/src/simple-validation.ts +30 -0
  368. package/src/storage/IAppserviceStorageProvider.ts +54 -0
  369. package/src/storage/ICryptoStorageProvider.ts +36 -0
  370. package/src/storage/IStorageProvider.ts +53 -0
  371. package/src/storage/MemoryStorageProvider.ts +65 -0
  372. package/src/storage/RustSdkCryptoStorageProvider.ts +81 -0
  373. package/src/storage/SimpleFsStorageProvider.ts +142 -0
  374. package/src/storage/SimplePostgresStorageProvider.ts +168 -0
  375. package/src/strategies/AppserviceJoinRoomStrategy.ts +47 -0
  376. package/src/strategies/JoinRoomStrategy.ts +45 -0
  377. package/tsconfig.json +22 -0
@@ -0,0 +1,81 @@
1
+ import * as lowdb from "lowdb";
2
+ import * as FileSync from "lowdb/adapters/FileSync";
3
+ import * as mkdirp from "mkdirp";
4
+ import * as path from "path";
5
+ import * as sha512 from "hash.js/lib/hash/sha/512";
6
+ import * as sha256 from "hash.js/lib/hash/sha/256";
7
+ import { StoreType as RustSdkCryptoStoreType } from "@matrix-org/matrix-sdk-crypto-nodejs";
8
+
9
+ import { ICryptoStorageProvider } from "./ICryptoStorageProvider";
10
+ import { IAppserviceCryptoStorageProvider } from "./IAppserviceStorageProvider";
11
+ import { ICryptoRoomInformation } from "../e2ee/ICryptoRoomInformation";
12
+
13
+ export { RustSdkCryptoStoreType };
14
+
15
+ /**
16
+ * A crypto storage provider for the file-based rust-sdk store.
17
+ * @category Storage providers
18
+ */
19
+ export class RustSdkCryptoStorageProvider implements ICryptoStorageProvider {
20
+ private db: lowdb.LowdbSync<any>;
21
+
22
+ /**
23
+ * Creates a new rust-sdk storage provider.
24
+ * @param storagePath The *directory* to persist database details to.
25
+ * @param storageType The storage type to use. Must be supported by the rust-sdk.
26
+ */
27
+ public constructor(
28
+ public readonly storagePath: string,
29
+ public readonly storageType: RustSdkCryptoStoreType,
30
+ ) {
31
+ this.storagePath = path.resolve(this.storagePath);
32
+ mkdirp.sync(storagePath);
33
+
34
+ const adapter = new FileSync(path.join(storagePath, "bot-sdk.json"));
35
+ this.db = lowdb(adapter);
36
+
37
+ this.db.defaults({
38
+ deviceId: null,
39
+ rooms: {},
40
+ });
41
+ }
42
+
43
+ public async getDeviceId(): Promise<string> {
44
+ return this.db.get('deviceId').value();
45
+ }
46
+
47
+ public async setDeviceId(deviceId: string): Promise<void> {
48
+ this.db.set('deviceId', deviceId).write();
49
+ }
50
+
51
+ public async getRoom(roomId: string): Promise<ICryptoRoomInformation> {
52
+ const key = sha512().update(roomId).digest('hex');
53
+ return this.db.get(`rooms.${key}`).value();
54
+ }
55
+
56
+ public async storeRoom(roomId: string, config: ICryptoRoomInformation): Promise<void> {
57
+ const key = sha512().update(roomId).digest('hex');
58
+ this.db.set(`rooms.${key}`, config).write();
59
+ }
60
+ }
61
+
62
+ /**
63
+ * An appservice crypto storage provider for the file-based rust-sdk store.
64
+ * @category Storage providers
65
+ */
66
+ export class RustSdkAppserviceCryptoStorageProvider extends RustSdkCryptoStorageProvider implements IAppserviceCryptoStorageProvider {
67
+ /**
68
+ * Creates a new rust-sdk storage provider.
69
+ * @param baseStoragePath The *directory* to persist database details to.
70
+ * @param storageType The storage type to use. Must be supported by the rust-sdk.
71
+ */
72
+ public constructor(private baseStoragePath: string, storageType: RustSdkCryptoStoreType) {
73
+ super(path.join(baseStoragePath, "_default"), storageType);
74
+ }
75
+
76
+ public storageForUser(userId: string): ICryptoStorageProvider {
77
+ // sha256 because sha512 is a bit big for some operating systems
78
+ const key = sha256().update(userId).digest('hex');
79
+ return new RustSdkCryptoStorageProvider(path.join(this.baseStoragePath, key), this.storageType);
80
+ }
81
+ }
@@ -0,0 +1,142 @@
1
+ import * as lowdb from "lowdb";
2
+ import * as FileSync from "lowdb/adapters/FileSync";
3
+ import * as sha512 from "hash.js/lib/hash/sha/512";
4
+ import * as mkdirp from "mkdirp";
5
+ import * as path from "path";
6
+
7
+ import { IAppserviceStorageProvider } from "./IAppserviceStorageProvider";
8
+ import { IFilterInfo } from "../IFilter";
9
+ import { IStorageProvider } from "./IStorageProvider";
10
+
11
+ /**
12
+ * A storage provider that uses the disk to store information.
13
+ * @category Storage providers
14
+ */
15
+ export class SimpleFsStorageProvider implements IStorageProvider, IAppserviceStorageProvider {
16
+ private db: any;
17
+ private completedTransactions = [];
18
+
19
+ /**
20
+ * Creates a new simple file system storage provider.
21
+ * @param {string} filename The file name (typically 'storage.json') to store data within.
22
+ * @param {boolean} trackTransactionsInMemory True (default) to track all received appservice transactions rather than on disk.
23
+ * @param {int} maxInMemoryTransactions The maximum number of transactions to hold in memory before rotating the oldest out. Defaults to 20.
24
+ */
25
+ constructor(filename: string, private trackTransactionsInMemory = true, private maxInMemoryTransactions = 20) {
26
+ mkdirp.sync(path.dirname(filename));
27
+
28
+ const adapter = new FileSync(filename);
29
+ this.db = lowdb(adapter);
30
+
31
+ this.db.defaults({
32
+ syncToken: null,
33
+ filter: null,
34
+ appserviceUsers: {}, // userIdHash => { data }
35
+ appserviceTransactions: {}, // txnIdHash => { data }
36
+ kvStore: {}, // key => value (str)
37
+ }).write();
38
+ }
39
+
40
+ setSyncToken(token: string | null): void {
41
+ this.db.set('syncToken', token).write();
42
+ }
43
+
44
+ getSyncToken(): string | null {
45
+ return this.db.get('syncToken').value();
46
+ }
47
+
48
+ setFilter(filter: IFilterInfo): void {
49
+ this.db.set('filter', filter).write();
50
+ }
51
+
52
+ getFilter(): IFilterInfo {
53
+ return this.db.get('filter').value();
54
+ }
55
+
56
+ addRegisteredUser(userId: string) {
57
+ const key = sha512().update(userId).digest('hex');
58
+ this.db
59
+ .set(`appserviceUsers.${key}.userId`, userId)
60
+ .set(`appserviceUsers.${key}.registered`, true)
61
+ .write();
62
+ }
63
+
64
+ isUserRegistered(userId: string): boolean {
65
+ const key = sha512().update(userId).digest('hex');
66
+ return this.db.get(`appserviceUsers.${key}.registered`).value();
67
+ }
68
+
69
+ isTransactionCompleted(transactionId: string): boolean {
70
+ if (this.trackTransactionsInMemory) {
71
+ return this.completedTransactions.indexOf(transactionId) !== -1;
72
+ }
73
+
74
+ const key = sha512().update(transactionId).digest('hex');
75
+ return this.db.get(`appserviceTransactions.${key}.completed`).value();
76
+ }
77
+
78
+ setTransactionCompleted(transactionId: string) {
79
+ if (this.trackTransactionsInMemory) {
80
+ if (this.completedTransactions.indexOf(transactionId) === -1) {
81
+ this.completedTransactions.push(transactionId);
82
+ }
83
+ if (this.completedTransactions.length > this.maxInMemoryTransactions) {
84
+ this.completedTransactions = this.completedTransactions.reverse().slice(0, this.maxInMemoryTransactions).reverse();
85
+ }
86
+ return;
87
+ }
88
+
89
+ const key = sha512().update(transactionId).digest('hex');
90
+ this.db
91
+ .set(`appserviceTransactions.${key}.txnId`, transactionId)
92
+ .set(`appserviceTransactions.${key}.completed`, true)
93
+ .write();
94
+ }
95
+
96
+ readValue(key: string): string | null | undefined {
97
+ return this.db.get("kvStore").value()[key];
98
+ }
99
+
100
+ storeValue(key: string, value: string): void {
101
+ const kvStore = this.db.get("kvStore").value();
102
+ kvStore[key] = value;
103
+ this.db.set("kvStore", kvStore).write();
104
+ }
105
+
106
+ storageForUser(userId: string): IStorageProvider {
107
+ return new NamespacedFsProvider(userId, this);
108
+ }
109
+ }
110
+
111
+ /**
112
+ * A namespaced storage provider that uses the disk to store information.
113
+ * @category Storage providers
114
+ */
115
+ class NamespacedFsProvider implements IStorageProvider {
116
+ constructor(private prefix: string, private parent: SimpleFsStorageProvider) {
117
+ }
118
+
119
+ setFilter(filter: IFilterInfo): Promise<any> | void {
120
+ return this.parent.storeValue(`${this.prefix}_int_filter`, JSON.stringify(filter));
121
+ }
122
+
123
+ getFilter(): IFilterInfo | Promise<IFilterInfo> {
124
+ return Promise.resolve(this.parent.readValue(`${this.prefix}_int_filter`)).then(r => r ? JSON.parse(r) : r);
125
+ }
126
+
127
+ setSyncToken(token: string | null): Promise<any> | void {
128
+ return this.parent.storeValue(`${this.prefix}_int_syncToken`, token);
129
+ }
130
+
131
+ getSyncToken(): string | Promise<string | null> | null {
132
+ return Promise.resolve(this.parent.readValue(`${this.prefix}_int_syncToken`)).then(r => r ?? null);
133
+ }
134
+
135
+ readValue(key: string): string | Promise<string | null | undefined> | null | undefined {
136
+ return this.parent.readValue(`${this.prefix}_kv_${key}`);
137
+ }
138
+
139
+ storeValue(key: string, value: string): Promise<any> | void {
140
+ return this.parent.storeValue(`${this.prefix}_kv_${key}`, value);
141
+ }
142
+ }
@@ -0,0 +1,168 @@
1
+ import * as postgres from "postgres";
2
+
3
+ import { IStorageProvider } from "./IStorageProvider";
4
+ import { IAppserviceStorageProvider } from "./IAppserviceStorageProvider";
5
+ import { IFilterInfo } from "../IFilter";
6
+
7
+ /**
8
+ * A barebones postgresql storage provider. It is not efficient, but it does work.
9
+ * @category Storage providers
10
+ */
11
+ export class SimplePostgresStorageProvider implements IStorageProvider, IAppserviceStorageProvider {
12
+ private readonly db: postgres.Sql;
13
+ private readonly waitPromise: Promise<void>;
14
+ private completedTransactions = [];
15
+
16
+ /**
17
+ * Creates a new simple postgresql storage provider.
18
+ * @param connectionString The `postgres://` connection string to use.
19
+ * @param trackTransactionsInMemory True (default) to track all received appservice transactions rather than on disk.
20
+ * @param maxInMemoryTransactions The maximum number of transactions to hold in memory before rotating the oldest out. Defaults to 20.
21
+ */
22
+ constructor(connectionString: string, private trackTransactionsInMemory = true, private maxInMemoryTransactions = 20) {
23
+ this.db = postgres(connectionString);
24
+
25
+ this.waitPromise = Promise.all([
26
+ this.db`
27
+ CREATE TABLE IF NOT EXISTS bot_metadata (key TEXT NOT NULL PRIMARY KEY, value TEXT);
28
+ `,
29
+ this.db`
30
+ CREATE TABLE IF NOT EXISTS bot_kv (key TEXT NOT NULL PRIMARY KEY, value TEXT);
31
+ `,
32
+ this.db`
33
+ CREATE TABLE IF NOT EXISTS appservice_users (user_id TEXT NOT NULL PRIMARY KEY, registered BOOLEAN NOT NULL);
34
+ `,
35
+ this.db`
36
+ CREATE TABLE IF NOT EXISTS appservice_transactions (txn_id TEXT NOT NULL PRIMARY KEY, completed BOOLEAN NOT NULL);
37
+ `,
38
+ ]).then();
39
+ }
40
+
41
+ public async setSyncToken(token: string | null): Promise<any> {
42
+ await this.waitPromise;
43
+ return this.db`
44
+ INSERT INTO bot_metadata (key, value) VALUES ('syncToken', ${token})
45
+ ON CONFLICT (key) DO UPDATE SET value = ${token};
46
+ `;
47
+ }
48
+
49
+ public async getSyncToken(): Promise<string | null> {
50
+ await this.waitPromise;
51
+ return (await this.db`
52
+ SELECT value FROM bot_metadata WHERE key = 'syncToken';
53
+ `)[0]?.value;
54
+ }
55
+
56
+ public async setFilter(filter: IFilterInfo): Promise<any> {
57
+ await this.waitPromise;
58
+ const filterStr = filter ? JSON.stringify(filter) : null;
59
+ return this.db`
60
+ INSERT INTO bot_metadata (key, value) VALUES ('filter', ${filterStr})
61
+ ON CONFLICT (key) DO UPDATE SET value = ${filterStr};
62
+ `;
63
+ }
64
+
65
+ public async getFilter(): Promise<IFilterInfo> {
66
+ await this.waitPromise;
67
+ const value = (await this.db`
68
+ SELECT value FROM bot_metadata WHERE key = 'filter';
69
+ `)[0]?.value;
70
+ return typeof value === "string" ? JSON.parse(value) : value;
71
+ }
72
+
73
+ public async addRegisteredUser(userId: string): Promise<any> {
74
+ await this.waitPromise;
75
+ return this.db`
76
+ INSERT INTO appservice_users (user_id, registered) VALUES (${userId}, TRUE)
77
+ ON CONFLICT (user_id) DO UPDATE SET registered = TRUE;
78
+ `;
79
+ }
80
+
81
+ public async isUserRegistered(userId: string): Promise<boolean> {
82
+ await this.waitPromise;
83
+ return !!(await this.db`
84
+ SELECT registered FROM appservice_users WHERE user_id = ${userId};
85
+ `)[0]?.registered;
86
+ }
87
+
88
+ public async setTransactionCompleted(transactionId: string): Promise<any> {
89
+ await this.waitPromise;
90
+ if (this.trackTransactionsInMemory) {
91
+ if (this.completedTransactions.indexOf(transactionId) === -1) {
92
+ this.completedTransactions.push(transactionId);
93
+ }
94
+ if (this.completedTransactions.length > this.maxInMemoryTransactions) {
95
+ this.completedTransactions = this.completedTransactions.reverse().slice(0, this.maxInMemoryTransactions).reverse();
96
+ }
97
+ return;
98
+ }
99
+
100
+ return this.db`
101
+ INSERT INTO appservice_transactions (txn_id, completed) VALUES (${transactionId}, TRUE)
102
+ ON CONFLICT (txn_id) DO UPDATE SET completed = TRUE;
103
+ `;
104
+ }
105
+
106
+ public async isTransactionCompleted(transactionId: string): Promise<boolean> {
107
+ await this.waitPromise;
108
+ if (this.trackTransactionsInMemory) {
109
+ return this.completedTransactions.includes(transactionId);
110
+ }
111
+
112
+ return (await this.db`
113
+ SELECT completed FROM appservice_transactions WHERE txn_id = ${transactionId};
114
+ `)[0]?.completed;
115
+ }
116
+
117
+ public async readValue(key: string): Promise<string | null | undefined> {
118
+ await this.waitPromise;
119
+ return (await this.db`
120
+ SELECT value FROM bot_kv WHERE key = ${key};
121
+ `)[0]?.value;
122
+ }
123
+
124
+ public async storeValue(key: string, value: string): Promise<void> {
125
+ await this.waitPromise;
126
+ return this.db`
127
+ INSERT INTO bot_kv (key, value) VALUES (${key}, ${value})
128
+ ON CONFLICT (key) DO UPDATE SET value = ${value};
129
+ `.then();
130
+ }
131
+
132
+ public storageForUser(userId: string): IStorageProvider {
133
+ return new NamespacedPostgresProvider(userId, this);
134
+ }
135
+ }
136
+
137
+ /**
138
+ * A namespaced storage provider that uses postgres to store information.
139
+ * @category Storage providers
140
+ */
141
+ class NamespacedPostgresProvider implements IStorageProvider {
142
+ constructor(private prefix: string, private parent: SimplePostgresStorageProvider) {
143
+ }
144
+
145
+ public setFilter(filter: IFilterInfo): Promise<any> | void {
146
+ return this.parent.storeValue(`${this.prefix}_internal_filter`, JSON.stringify(filter));
147
+ }
148
+
149
+ public async getFilter(): Promise<IFilterInfo> {
150
+ return this.parent.readValue(`${this.prefix}_internal_filter`).then(r => r ? JSON.parse(r) : r);
151
+ }
152
+
153
+ public setSyncToken(token: string | null): Promise<any> | void {
154
+ return this.parent.storeValue(`${this.prefix}_internal_syncToken`, token ?? "");
155
+ }
156
+
157
+ public async getSyncToken(): Promise<string> {
158
+ return this.parent.readValue(`${this.prefix}_internal_syncToken`).then(r => r === "" ? null : r);
159
+ }
160
+
161
+ public storeValue(key: string, value: string): Promise<any> | void {
162
+ return this.parent.storeValue(`${this.prefix}_internal_kv_${key}`, value);
163
+ }
164
+
165
+ public readValue(key: string): string | Promise<string | null | undefined> | null | undefined {
166
+ return this.parent.readValue(`${this.prefix}_internal_kv_${key}`);
167
+ }
168
+ }
@@ -0,0 +1,47 @@
1
+ import { IJoinRoomStrategy } from "./JoinRoomStrategy";
2
+ import { Appservice } from "../appservice/Appservice";
3
+
4
+ /**
5
+ * A join strategy for application services that proxies joins to an underlying join
6
+ * strategy while also trying to use the appservice's bot user to invite the underlying
7
+ * user if needed.
8
+ * @category Join strategies
9
+ */
10
+ export class AppserviceJoinRoomStrategy implements IJoinRoomStrategy {
11
+ constructor(private underlyingStrategy: IJoinRoomStrategy, private appservice: Appservice) {
12
+ }
13
+
14
+ public async joinRoom(roomIdOrAlias: string, userId: string, apiCall: (targetRoomIdOrAlias: string) => Promise<string>): Promise<string> {
15
+ try {
16
+ // First just try joining via the apiCall
17
+ return await apiCall(roomIdOrAlias);
18
+ } catch (err) {
19
+ // If the user being joined is *not* the bridge bot, try and get the bridge bot to
20
+ // join them to the room.
21
+ if (userId !== this.appservice.botUserId) {
22
+ const client = this.appservice.botIntent.underlyingClient;
23
+ const roomId = await client.resolveRoom(roomIdOrAlias);
24
+ try {
25
+ // First start with having the bridge bot invite the user to the room
26
+ await client.inviteUser(userId, roomId);
27
+ } catch (inviteErr) {
28
+ // The invite failed - use the underlying join strategy to join the room, just in case.
29
+ // If there's no join strategy, we want to fall through to an error.
30
+ if (this.underlyingStrategy) return this.underlyingStrategy.joinRoom(roomId, userId, apiCall);
31
+ throw inviteErr;
32
+ }
33
+
34
+ // The invite succeeded - use the underlying join strategy to join the room or just call use
35
+ // the apiCall if no strategy exists. We are expecting success.
36
+ if (this.underlyingStrategy) return this.underlyingStrategy.joinRoom(roomId, userId, apiCall);
37
+ else return apiCall(roomId);
38
+ } else if (this.underlyingStrategy) {
39
+ // If the user being joined *is* the bridge bot, try and use the join strategy to join.
40
+ return this.underlyingStrategy.joinRoom(roomIdOrAlias, userId, apiCall);
41
+ }
42
+
43
+ // Finally, if all else fails, throw.
44
+ throw err;
45
+ }
46
+ }
47
+ }
@@ -0,0 +1,45 @@
1
+ import { extractRequestError, LogService } from "..";
2
+
3
+ export interface IJoinRoomStrategy {
4
+ joinRoom(roomIdOrAlias: string, userId: string, apiCall: (targetRoomIdOrAlias: string) => Promise<string>): Promise<string>;
5
+ }
6
+
7
+ /**
8
+ * A join strategy that keeps trying to join the room on a set interval.
9
+ * @category Join strategies
10
+ */
11
+ export class SimpleRetryJoinStrategy implements IJoinRoomStrategy {
12
+ // Note: The schedule must not have duplicate values to avoid problems in positioning.
13
+ private schedule = [
14
+ 0, // Right away
15
+ 1000, // 1 second
16
+ 30 * 1000, // 30 seconds
17
+ 5 * 60 * 1000, // 5 minutes
18
+ 15 * 60 * 1000, // 15 minutes
19
+ ];
20
+
21
+ public joinRoom(roomIdOrAlias: string, userId: string, apiCall: (targetRoomIdOrAlias: string) => Promise<string>): Promise<string> {
22
+ let currentSchedule = this.schedule[0];
23
+
24
+ const doJoin = () => waitPromise(currentSchedule).then(() => apiCall(roomIdOrAlias));
25
+ const errorHandler = err => {
26
+ LogService.error("SimpleRetryJoinStrategy", extractRequestError(err));
27
+ const idx = this.schedule.indexOf(currentSchedule);
28
+ if (idx === this.schedule.length - 1) {
29
+ LogService.warn("SimpleRetryJoinStrategy", "Failed to join room " + roomIdOrAlias);
30
+ return Promise.reject(err);
31
+ } else {
32
+ currentSchedule = this.schedule[idx + 1];
33
+ return doJoin().catch(errorHandler);
34
+ }
35
+ };
36
+
37
+ return doJoin().catch(errorHandler);
38
+ }
39
+ }
40
+
41
+ function waitPromise(interval: number): Promise<any> {
42
+ return new Promise((resolve, reject) => {
43
+ setTimeout(resolve, interval);
44
+ });
45
+ }
package/tsconfig.json ADDED
@@ -0,0 +1,22 @@
1
+ {
2
+ "compilerOptions": {
3
+ "experimentalDecorators": true,
4
+ "emitDecoratorMetadata": true,
5
+ "module": "commonjs",
6
+ "moduleResolution": "node",
7
+ "target": "es2020",
8
+ "noImplicitAny": false,
9
+ "sourceMap": true,
10
+ "outDir": "./lib",
11
+ "declaration": true,
12
+ "types": [
13
+ "node",
14
+ "express",
15
+ "jest"
16
+ ]
17
+ },
18
+ "include": [
19
+ "./src/**/*",
20
+ "./test/**/*"
21
+ ]
22
+ }