@vex-chat/spire 0.8.0 → 1.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 (370) hide show
  1. package/README.md +82 -26
  2. package/dist/ClientManager.d.ts +23 -25
  3. package/dist/ClientManager.js +230 -249
  4. package/dist/ClientManager.js.map +1 -0
  5. package/dist/Database.d.ts +49 -47
  6. package/dist/Database.js +698 -773
  7. package/dist/Database.js.map +1 -0
  8. package/dist/Spire.d.ts +22 -14
  9. package/dist/Spire.js +496 -236
  10. package/dist/Spire.js.map +1 -0
  11. package/dist/__tests__/Database.spec.js +116 -75
  12. package/dist/__tests__/Database.spec.js.map +1 -0
  13. package/dist/db/schema.d.ts +134 -0
  14. package/dist/db/schema.js +2 -0
  15. package/dist/db/schema.js.map +1 -0
  16. package/dist/index.d.ts +1 -1
  17. package/dist/index.js +3 -5
  18. package/dist/index.js.map +1 -0
  19. package/dist/middleware/validate.d.ts +12 -0
  20. package/dist/middleware/validate.js +35 -0
  21. package/dist/middleware/validate.js.map +1 -0
  22. package/dist/migrations/2026-04-06_initial-schema.d.ts +3 -0
  23. package/dist/migrations/2026-04-06_initial-schema.js +192 -0
  24. package/dist/migrations/2026-04-06_initial-schema.js.map +1 -0
  25. package/dist/run.js +26 -21
  26. package/dist/run.js.map +1 -0
  27. package/dist/server/avatar.d.ts +3 -4
  28. package/dist/server/avatar.js +64 -64
  29. package/dist/server/avatar.js.map +1 -0
  30. package/dist/server/errors.d.ts +59 -0
  31. package/dist/server/errors.js +94 -0
  32. package/dist/server/errors.js.map +1 -0
  33. package/dist/server/file.d.ts +3 -4
  34. package/dist/server/file.js +81 -62
  35. package/dist/server/file.js.map +1 -0
  36. package/dist/server/index.d.ts +8 -10
  37. package/dist/server/index.js +414 -405
  38. package/dist/server/index.js.map +1 -0
  39. package/dist/server/invite.d.ts +4 -5
  40. package/dist/server/invite.js +18 -52
  41. package/dist/server/invite.js.map +1 -0
  42. package/dist/server/openapi.d.ts +2 -0
  43. package/dist/server/openapi.js +40 -0
  44. package/dist/server/openapi.js.map +1 -0
  45. package/dist/server/permissions.d.ts +16 -0
  46. package/dist/server/permissions.js +22 -0
  47. package/dist/server/permissions.js.map +1 -0
  48. package/dist/server/rateLimit.d.ts +28 -0
  49. package/dist/server/rateLimit.js +58 -0
  50. package/dist/server/rateLimit.js.map +1 -0
  51. package/dist/server/user.d.ts +4 -7
  52. package/dist/server/user.js +55 -66
  53. package/dist/server/user.js.map +1 -0
  54. package/dist/server/utils.d.ts +35 -7
  55. package/dist/server/utils.js +50 -6
  56. package/dist/server/utils.js.map +1 -0
  57. package/dist/types/express.d.ts +20 -0
  58. package/dist/types/express.js +2 -0
  59. package/dist/types/express.js.map +1 -0
  60. package/dist/utils/createLogger.js +13 -19
  61. package/dist/utils/createLogger.js.map +1 -0
  62. package/dist/utils/createUint8UUID.js +6 -10
  63. package/dist/utils/createUint8UUID.js.map +1 -0
  64. package/dist/utils/jwtSecret.d.ts +7 -0
  65. package/dist/utils/jwtSecret.js +15 -0
  66. package/dist/utils/jwtSecret.js.map +1 -0
  67. package/dist/utils/loadEnv.js +7 -22
  68. package/dist/utils/loadEnv.js.map +1 -0
  69. package/dist/utils/msgpack.d.ts +2 -0
  70. package/dist/utils/msgpack.js +4 -0
  71. package/dist/utils/msgpack.js.map +1 -0
  72. package/package.json +91 -65
  73. package/src/ClientManager.ts +434 -0
  74. package/src/Database.ts +925 -0
  75. package/src/Spire.ts +878 -0
  76. package/src/__tests__/Database.spec.ts +167 -0
  77. package/src/ambient-modules.d.ts +1 -0
  78. package/src/db/schema.ts +165 -0
  79. package/src/index.ts +3 -0
  80. package/src/middleware/validate.ts +38 -0
  81. package/src/migrations/2026-04-06_initial-schema.ts +218 -0
  82. package/src/run.ts +37 -0
  83. package/src/server/avatar.ts +141 -0
  84. package/src/server/errors.ts +133 -0
  85. package/src/server/file.ts +172 -0
  86. package/src/server/index.ts +855 -0
  87. package/src/server/invite.ts +65 -0
  88. package/src/server/openapi.ts +51 -0
  89. package/src/server/permissions.ts +40 -0
  90. package/src/server/rateLimit.ts +86 -0
  91. package/src/server/user.ts +125 -0
  92. package/src/server/utils.ts +59 -0
  93. package/src/types/express.ts +23 -0
  94. package/src/utils/createLogger.ts +47 -0
  95. package/src/utils/createUint8UUID.ts +9 -0
  96. package/src/utils/jwtSecret.ts +16 -0
  97. package/src/utils/loadEnv.ts +15 -0
  98. package/src/utils/msgpack.ts +4 -0
  99. package/avatars/052242d0-4129-4a6e-8076-22709c157549 +0 -0
  100. package/avatars/0a677c9a-4986-4b2c-ae2e-12faf22f55db +0 -0
  101. package/avatars/0ba21b91-decb-4a3e-ac86-4dd54d805a9a +0 -0
  102. package/avatars/0c48d8b6-1d1b-4297-a6c6-2fe50af6fc35 +0 -0
  103. package/avatars/0d993cdf-19a6-4299-a4ee-a06579d106cf +0 -0
  104. package/avatars/17b000e4-ac38-46ec-9dec-d2568086129a +0 -0
  105. package/avatars/19dc5594-0f06-4ac6-af18-8740dd39ef6b +0 -0
  106. package/avatars/20444fa3-6d5e-429e-b55f-b81c3d2c61ee +0 -0
  107. package/avatars/21c0512a-5630-4931-9442-d66db66737be +0 -0
  108. package/avatars/22830a60-0b6f-4912-83a5-72245465f332 +0 -0
  109. package/avatars/243639ce-f59f-4404-a1f1-4ec0eb5d2af3 +0 -0
  110. package/avatars/30d2c01d-7b7f-4ea9-9859-1c90837a23f7 +0 -0
  111. package/avatars/315a04f0-9a6f-4b0f-bb9f-5fa774c4752b +0 -0
  112. package/avatars/3563d333-53fe-4885-ac2d-9a4f761db85e +0 -0
  113. package/avatars/36a10c00-3b4c-437f-8e1f-4428ecde0003 +0 -0
  114. package/avatars/40b83eeb-c6e8-4268-82ab-69799a796405 +0 -0
  115. package/avatars/45b5ddb9-ad2c-4404-8ab3-cb4699e6d61c +0 -0
  116. package/avatars/4e4f0ffb-9a75-479a-bccb-446d0bf85020 +0 -0
  117. package/avatars/4e62c3bd-08c6-4fdd-bd65-f01c7322ed64 +0 -0
  118. package/avatars/5004d2e7-51af-44af-8776-6c71f7019843 +0 -0
  119. package/avatars/5041eb29-5c4b-4dea-8c1b-31ba4473161a +0 -0
  120. package/avatars/5065cf78-31c5-46cb-8d5c-c0b6be2d994e +0 -0
  121. package/avatars/51b91d2c-8956-4d73-b4ad-ca6a8d9da9a8 +0 -0
  122. package/avatars/58264a2c-5651-4a42-8ca2-a9907b311e48 +0 -0
  123. package/avatars/58c2357c-8080-4725-a0ce-182c96b037c4 +0 -0
  124. package/avatars/59b5f6dd-8e04-4d15-b4dc-c1c652558a74 +0 -0
  125. package/avatars/5b417a78-b274-48bc-98a4-6e54b74ee62d +0 -0
  126. package/avatars/611f5a93-1ed4-45a1-bc8e-e8e413f9b171 +0 -0
  127. package/avatars/65abe919-9921-46f6-9bc9-183e9cc53c8a +0 -0
  128. package/avatars/6934202d-1546-4270-8a15-97ba8b8c6fa9 +0 -0
  129. package/avatars/6acd24be-f4b7-4399-9e7c-807821828d29 +0 -0
  130. package/avatars/6b2d6ac5-e35c-4297-994e-f0eb6fe56740 +0 -0
  131. package/avatars/6cae9ddd-f163-44e7-a632-30425716a159 +0 -0
  132. package/avatars/6d90e79e-b9c1-4b89-843b-96636de8d26b +0 -0
  133. package/avatars/6f82c7bb-a974-4372-8a64-ce287e668c8c +0 -0
  134. package/avatars/74a45091-5a76-4bb7-ae8a-cd7373adc128 +0 -0
  135. package/avatars/7d071ab2-e0b5-4dbb-8bf5-1fae50c3663f +0 -0
  136. package/avatars/7de818c8-bda1-4f51-976e-160fc087184b +0 -0
  137. package/avatars/873937df-8cb1-427a-92bf-f829f4259624 +0 -0
  138. package/avatars/8b45ffa5-3322-4109-bfa0-1be088336135 +0 -0
  139. package/avatars/8efaa426-22a9-42a2-b4ac-a275717b812f +0 -0
  140. package/avatars/903fd1a6-d6ea-431c-b98f-f21e424a2852 +0 -0
  141. package/avatars/943d8533-5174-4199-990f-1ec69e5d60c4 +0 -0
  142. package/avatars/952d014e-3804-4cd2-a4a0-ffe40a11e4ac +0 -0
  143. package/avatars/95d3acb0-724d-4413-b20f-edad55812d5d +0 -0
  144. package/avatars/9641a946-f613-471b-bedd-c1730b96b51e +0 -0
  145. package/avatars/9b01cbbf-f6b2-43fb-b569-589b6f2a8134 +0 -0
  146. package/avatars/9cd4424d-a34f-4467-acc0-93cf82703e0d +0 -0
  147. package/avatars/9d9ad3b0-e5a6-420a-a6c5-fb9085b70376 +0 -0
  148. package/avatars/9e9e34b5-4e63-4c4b-9722-c7f5674b47aa +0 -0
  149. package/avatars/a387d5c1-59eb-4a6b-80c1-a8982ed12c33 +0 -0
  150. package/avatars/a3e86d21-d881-4824-8ebf-45e3bf0f9186 +0 -0
  151. package/avatars/a8d5cc1c-3f42-4b7b-8d33-f9a9ef77f96b +0 -0
  152. package/avatars/a91d815f-badc-4604-a7be-6c7a44e6101d +0 -0
  153. package/avatars/aa8d0324-bcec-4737-a8c4-bdbff914148d +0 -0
  154. package/avatars/abb8a941-8b6b-47d7-a2f9-8b153ba44aa2 +0 -0
  155. package/avatars/b011bb38-1ef3-4d22-82fa-8bf60faf7b5d +0 -0
  156. package/avatars/b24bcbc1-11f0-473d-a8b9-ba8ce4ca127d +0 -0
  157. package/avatars/b2607346-af1c-4e98-b725-7650a766db2a +0 -0
  158. package/avatars/b6300f7c-cb37-459b-b1bf-8a0a0e797a52 +0 -0
  159. package/avatars/b7d3cff3-84dd-4547-93a1-de1aaa8aa34c +0 -0
  160. package/avatars/baa4b51c-e97f-4f51-bcb3-f27bc506cfaf +0 -0
  161. package/avatars/be7022e4-e292-4515-80d5-f9b61ebeb4ce +0 -0
  162. package/avatars/bed596a3-7569-4854-9e76-f52d33c0a541 +0 -0
  163. package/avatars/bf69992f-3f72-4930-99bb-0ffe17f3aebf +0 -0
  164. package/avatars/ca00c250-c6d4-464d-a6de-1c8467a18fe8 +0 -0
  165. package/avatars/ca19d78f-c0bc-4bd5-b26f-6923cb19996d +0 -0
  166. package/avatars/cda4d6e1-e0a4-4024-ac95-6de98e713b98 +0 -0
  167. package/avatars/cf72c30d-2da8-4e81-aa71-735b9e714274 +0 -0
  168. package/avatars/d5a35b78-99b3-4564-b6b9-b2ccab28c470 +0 -0
  169. package/avatars/dadb38c1-2a9d-47a3-8d92-b56b6166973c +0 -0
  170. package/avatars/e68705c7-375d-4423-9a86-29a16bd3ee0e +0 -0
  171. package/avatars/e9af3e4c-1f62-4302-8b99-b68ce93b7a86 +0 -0
  172. package/avatars/ea7e7331-e845-4189-8248-5f5b1d63f5e3 +0 -0
  173. package/avatars/ef4f8dcb-ef6c-4e7a-9be1-0476161bfce5 +0 -0
  174. package/avatars/ef7d0917-a206-4f88-8b60-93f8253774dc +0 -0
  175. package/avatars/f1a554d6-1db3-4ff5-b0dc-b607d6c3b4ff +0 -0
  176. package/avatars/f1fecc21-c81f-49a8-88f3-f942a0a679f6 +0 -0
  177. package/avatars/f30a2427-1755-4053-813e-129a179e1dd3 +0 -0
  178. package/avatars/f5370717-5109-46a5-a8d7-e1dd996d0615 +0 -0
  179. package/avatars/f6dd7126-1144-4998-bbd3-d4e0fbee2e95 +0 -0
  180. package/avatars/f83413d5-0003-4756-9ece-745fd61cc468 +0 -0
  181. package/avatars/f9b3149e-7ec8-4bb3-a9b9-dcbe66dac197 +0 -0
  182. package/avatars/fa41d70b-857e-4423-bd7d-26ddcddc13b9 +0 -0
  183. package/avatars/fb551ee8-99c7-400b-8e1d-322ce4619998 +0 -0
  184. package/avatars/fe83a6d4-abb0-4ab0-b61d-76a7cc08be84 +0 -0
  185. package/dist/migrations/20210103192527_users.d.ts +0 -3
  186. package/dist/migrations/20210103192527_users.js +0 -30
  187. package/dist/migrations/20210103193502_mail.d.ts +0 -3
  188. package/dist/migrations/20210103193502_mail.js +0 -35
  189. package/dist/migrations/20210103193525_preKeys.d.ts +0 -3
  190. package/dist/migrations/20210103193525_preKeys.js +0 -30
  191. package/dist/migrations/20210103193553_oneTimeKeys.d.ts +0 -3
  192. package/dist/migrations/20210103193553_oneTimeKeys.js +0 -30
  193. package/dist/migrations/20210103193615_servers.d.ts +0 -3
  194. package/dist/migrations/20210103193615_servers.js +0 -28
  195. package/dist/migrations/20210103193729_channels.d.ts +0 -3
  196. package/dist/migrations/20210103193729_channels.js +0 -28
  197. package/dist/migrations/20210103193749_permissions.d.ts +0 -3
  198. package/dist/migrations/20210103193749_permissions.js +0 -30
  199. package/dist/migrations/20210103193801_files.d.ts +0 -3
  200. package/dist/migrations/20210103193801_files.js +0 -28
  201. package/emoji/04d98632-2c86-421b-a407-17f14fe86f8f +0 -0
  202. package/emoji/1160ed6e-1163-4043-9808-4029e863ed30 +0 -0
  203. package/emoji/1547ab18-1635-4a80-a82d-ebbb767b9932 +0 -0
  204. package/emoji/16922521-f6cb-4de4-860c-27916b22c6ba +0 -0
  205. package/emoji/198a9432-0e41-4866-994a-448d4775afcb +0 -0
  206. package/emoji/1be886b3-c9c5-4593-b516-f357ed931f96 +0 -0
  207. package/emoji/1c2b3d1d-637f-4103-b066-4bc4511a3ad7 +0 -0
  208. package/emoji/1efd27e7-b15f-475c-8b32-9159d26b169d +0 -0
  209. package/emoji/270b9409-0ea5-4be2-a239-a8dce13f9c31 +0 -0
  210. package/emoji/27812f76-fee2-49dd-a217-363de6d159dc +0 -0
  211. package/emoji/297ec202-8c24-44c6-aead-689d6d461883 +0 -0
  212. package/emoji/2bf06d86-17cb-4f40-a5ef-bd75d239a1a3 +0 -0
  213. package/emoji/31a75163-1cce-4dc1-b0a2-ecad6a4c500b +0 -0
  214. package/emoji/35235635-fdbd-4273-8428-f3cb3e1e8fd3 +0 -0
  215. package/emoji/3690fff2-6824-4403-a6e3-16a6a54979a9 +0 -0
  216. package/emoji/391014c2-59e0-46a8-85ec-7a7fdaca1d2d +0 -0
  217. package/emoji/3b383dcb-6e76-4e85-8e16-7c68040c06c2 +0 -0
  218. package/emoji/42d617a7-b104-42f5-9618-473181f752cf +0 -0
  219. package/emoji/482495d3-cce9-4f88-bf2a-f6003f03a9b5 +0 -0
  220. package/emoji/48390e06-0efb-404c-89bd-5f2be241bd50 +0 -0
  221. package/emoji/4b808d8d-3248-4149-b919-71b108391bcf +0 -0
  222. package/emoji/4bc13544-d82a-4e32-bd17-a70592274314 +0 -0
  223. package/emoji/4fcebf70-8623-4343-8243-67c8547b2edd +0 -0
  224. package/emoji/509d09aa-1214-459c-8081-50918a17b9af +0 -0
  225. package/emoji/5272abd8-d4d7-4b90-acd2-bf30e6c27243 +0 -0
  226. package/emoji/53c272ce-48bd-4d7e-bfb8-a6482b88be54 +0 -0
  227. package/emoji/5b279e65-06f7-4b26-8b4c-d1b48fba728d +0 -0
  228. package/emoji/5bd141f9-4394-4108-9376-66ebbc2c2bc1 +0 -0
  229. package/emoji/5c769156-f9cb-40bd-ab89-4edeece613fd +0 -0
  230. package/emoji/5c85fba9-8ba7-4fc9-b1b2-48dc30d24a1b +0 -0
  231. package/emoji/61a5e565-d20b-40ba-a139-b0c73a6027f3 +0 -0
  232. package/emoji/6913f43d-dd45-456c-9641-a126104d9ae5 +0 -0
  233. package/emoji/6957e74e-9622-492d-a950-242db3752260 +0 -0
  234. package/emoji/6a14bab5-26af-4bfa-9c17-be7c2511976d +0 -0
  235. package/emoji/6be09439-509e-4095-a30a-b1c7c573895d +0 -0
  236. package/emoji/6cc435b1-fe53-433c-b5a9-2b2019053997 +0 -0
  237. package/emoji/74f1b2af-bc7e-4a0f-802a-64ded185d5e2 +0 -0
  238. package/emoji/7890ba09-f02f-428e-807d-006d03d51d4a +0 -0
  239. package/emoji/7dc69179-6b3c-4f40-b20b-0ff573deea2d +0 -0
  240. package/emoji/7dd1b6b1-439d-4279-916a-995408863172 +0 -0
  241. package/emoji/820498ad-a2c8-43a2-ab83-d26f9c2246d4 +0 -0
  242. package/emoji/8319469c-2787-44e5-91a6-c8c39810dd7c +0 -0
  243. package/emoji/86745d1d-9e59-4607-b2b0-46c741079be1 +0 -0
  244. package/emoji/887b3cff-ae9e-4b5f-ad00-3ca9fc72f689 +0 -0
  245. package/emoji/8c6cf621-71d6-4fca-abe6-e19f4dd7f883 +0 -0
  246. package/emoji/8ca6d32e-a1ef-4956-a416-d8d0d680f085 +0 -0
  247. package/emoji/8d979f5e-38a2-4dd1-b3e4-80938bbe499b +0 -0
  248. package/emoji/99f68ea0-e3fe-4f03-9cc3-5f7f5315404d +0 -0
  249. package/emoji/9ad3aedc-7f79-4d68-a144-82e5b5dc3033 +0 -0
  250. package/emoji/9e418c2f-1f0f-46c4-be39-3bda38a28545 +0 -0
  251. package/emoji/a1f616bf-7402-4e24-9111-18acaebabb48 +0 -0
  252. package/emoji/a25ed9c1-3f9c-4e5f-ade2-7b159fb9fbf4 +0 -0
  253. package/emoji/a5176bc2-39a8-467b-8c75-6fbbc81b59c7 +0 -0
  254. package/emoji/a584215c-6547-438b-8ae8-dd490b51890e +0 -0
  255. package/emoji/a739895f-cf61-4b7c-b350-8e8283aaf751 +0 -0
  256. package/emoji/aaa10dd2-02a2-499e-9e17-c83787436508 +0 -0
  257. package/emoji/ae90baf2-a0ef-4d4d-9cc4-94f8ddd60f45 +0 -0
  258. package/emoji/b0564c48-feae-431a-95f9-df597c6c124c +0 -0
  259. package/emoji/b218bb93-e69c-4793-a669-83316650c4e7 +0 -0
  260. package/emoji/b2998c27-85d5-4598-ab41-469aa8e0fcad +0 -0
  261. package/emoji/b3da08ba-4179-4b5d-826f-5fc15e1a3ad2 +0 -0
  262. package/emoji/b840eb6a-a917-4bb2-854b-8f1022e7904b +0 -0
  263. package/emoji/b84baa76-b4b0-4b83-bc83-78661cb4f1d4 +0 -0
  264. package/emoji/baf69d80-8b1d-4032-855f-605cf0d489c3 +0 -0
  265. package/emoji/bb4d372c-ccd0-4a47-b157-b6a3b9f763e2 +0 -0
  266. package/emoji/bdbd1627-c81d-42d9-b3f5-8979e2ab74dc +0 -0
  267. package/emoji/c257388f-8b85-450b-b168-ebdf8d8c3026 +0 -0
  268. package/emoji/c573fde1-faa9-4c1d-a172-e283645afcfd +0 -0
  269. package/emoji/c8e27810-e8ea-47ce-b7ec-cef0a6becb28 +0 -0
  270. package/emoji/cdeef182-b220-4850-9ecf-5d7c472fd754 +0 -0
  271. package/emoji/d59c1aa9-6f81-4c07-96dd-9953401ff211 +0 -0
  272. package/emoji/dd407dbf-a077-40ba-957f-337b3c5efdc7 +0 -0
  273. package/emoji/e01f6e06-5728-4e2c-90fb-314a5827b766 +0 -0
  274. package/emoji/e1f9ed12-a2ce-433d-b454-b833438a1f9c +0 -0
  275. package/emoji/e697e5c4-acd6-41cd-a43e-edee8da3ab7b +0 -0
  276. package/emoji/e8182220-3464-4e31-8c08-466baead7bfc +0 -0
  277. package/emoji/eb0f3fd5-abc9-4abf-b816-d8458aeb7ec8 +0 -0
  278. package/emoji/eb38ecf7-0d13-4c51-b96a-3777f79321c4 +0 -0
  279. package/emoji/ee515c85-b7ce-4493-a427-994cc0af0d59 +0 -0
  280. package/emoji/f485cef2-d3fa-4d59-88af-b79a3105cacf +0 -0
  281. package/emoji/ff0dab2a-7015-4e8c-b0d0-3569058359dc +0 -0
  282. package/files/01087968-07b6-4fdb-9aeb-fa9dc061be94 +0 -0
  283. package/files/030455b3-17cc-415f-b3b3-2bb56c92ee8b +0 -0
  284. package/files/06129f52-a858-4031-ad85-4d7f2bb793af +0 -0
  285. package/files/0a6155a9-069f-45e9-8a06-56992fe55187 +0 -0
  286. package/files/12b9dda5-feb1-4f20-a987-ad422db5ba73 +0 -0
  287. package/files/13c8fa1e-8821-4628-b607-9e4fa4510df7 +0 -0
  288. package/files/159b0ad3-1a30-419d-af22-28a1096ce825 +0 -0
  289. package/files/1699c563-6769-431b-8041-99a6a4386f25 +0 -0
  290. package/files/176b916c-0dd9-4b93-bfdc-b8ccabf15a96 +0 -0
  291. package/files/1a27dad9-8cc9-4a0c-9d4e-7bde63adda60 +0 -0
  292. package/files/1d29832c-059a-4190-bca6-b83ac77540d9 +0 -0
  293. package/files/1dcde013-8833-4369-8726-81236e4eb30e +0 -0
  294. package/files/2080fc9f-d2c4-4fbc-af84-232fe4900a4f +0 -0
  295. package/files/20889623-6869-46a2-999b-c07708c12521 +0 -0
  296. package/files/2107e243-c378-418d-a183-7df13873c65b +0 -0
  297. package/files/225ed61e-8f8c-4d17-b675-9a9f9918d5b4 +0 -0
  298. package/files/29ffba15-5acc-4ef8-b5a4-5ce61d3f6e85 +0 -0
  299. package/files/2a69434c-1d8a-4e9d-90d4-569aaeaae7e3 +0 -0
  300. package/files/2aec8fcf-25bf-478e-b2f6-fe67ad753071 +0 -0
  301. package/files/2c64490e-c7de-4cb2-b22e-70e2ac69d88f +0 -0
  302. package/files/2d80b4f4-6389-4f5d-8d32-f0ed93820907 +0 -0
  303. package/files/2f9dd26e-363f-4445-8ee5-28548007a33a +0 -0
  304. package/files/360dd8f5-76c4-4e86-ba22-9025dc7ca2a4 +0 -0
  305. package/files/3a0a7f5b-45a5-4340-ba7c-6a0fa2c63871 +0 -0
  306. package/files/3a8fa6be-8acf-4b7b-b653-25edc6b28cdc +0 -5
  307. package/files/3d9e191b-2c15-42aa-9928-c2cdbb5e14ca +0 -0
  308. package/files/3dd0f2ef-0d4e-4837-bffc-22aa645cbe85 +0 -0
  309. package/files/402c4b9b-adbf-4ab6-a21d-c17369b48abf +0 -0
  310. package/files/4685d988-33eb-4902-872f-3b824f497c8b +0 -0
  311. package/files/495f6c55-07f8-4713-a444-a2261a789b94 +0 -0
  312. package/files/4acba8e3-567b-4062-b81b-340e205a01de +0 -0
  313. package/files/4c0a10cc-395b-474a-8140-677ed607da89 +0 -0
  314. package/files/537584d9-25ad-4830-808a-a1e3d63e2a52 +0 -0
  315. package/files/5519f10d-745e-4474-8ca8-6c111693704c +0 -0
  316. package/files/5563cf92-a5e3-4be3-867d-9647a02298d4 +0 -0
  317. package/files/55b70d9b-fd58-4800-832c-d6b4521ba6d0 +0 -0
  318. package/files/5623cff3-ce9b-403b-9915-50d2bcbc981c +0 -0
  319. package/files/576314ba-2a1a-4753-8d77-2a9e04f509d1 +0 -0
  320. package/files/58ed97ae-0eac-4e04-add1-76646effa2d5 +0 -0
  321. package/files/68638efd-5389-481d-a841-36164c62c078 +0 -0
  322. package/files/6936d34b-a1f8-4a9d-b005-5544dbdcf5e5 +0 -0
  323. package/files/6bda9e88-3a28-47f7-994e-900ede6bf984 +0 -0
  324. package/files/7024a3b9-a863-4618-9dbd-fa6502017ae0 +0 -0
  325. package/files/707caccb-3780-456d-9056-c20bfdfc0e5b +0 -0
  326. package/files/74b8c73c-032b-4640-a5b3-d30dd270cbcb +0 -0
  327. package/files/767cb262-2974-40f8-8182-f7770b431923 +0 -0
  328. package/files/7a669935-cb48-4349-b26b-7705f8a04fbc +0 -0
  329. package/files/7bc8f678-6ee7-454c-a1f8-bb9358b89c95 +0 -0
  330. package/files/7ccc2699-07ec-4177-a9ce-ee7dc952fda1 +0 -0
  331. package/files/7e0eabf4-b334-4683-8156-ab8d949a0532 +0 -0
  332. package/files/7f0644ab-02a3-4121-adfc-29a7c55cf804 +0 -0
  333. package/files/7ff3266d-f103-48ce-90dd-95b9dfe5fcc9 +0 -0
  334. package/files/836e2e8e-aefd-4b4a-a9b9-bf7436158a8c +0 -0
  335. package/files/875f7ae5-fa23-4fc5-b04a-8433a7f7089c +0 -0
  336. package/files/8ca62da9-f204-49e3-b418-9451661b2904 +0 -0
  337. package/files/9283054c-107f-474d-b61e-f1d0061bcb86 +0 -0
  338. package/files/93b1ce7f-9566-452b-b4be-30f87d3de150 +0 -0
  339. package/files/93fb51c7-e19b-4ac1-9dc3-aeb8da0672ed +0 -0
  340. package/files/9b54a3a1-534a-4ed5-b016-3c74ed4c9edd +0 -0
  341. package/files/9b5beb6f-712d-4969-b127-fd66c9b2a9c6 +0 -0
  342. package/files/9e964fbf-d063-498e-b2e3-79f8d6afcf5f +0 -0
  343. package/files/a66b7a9f-58c2-47a8-a429-a6f0647c6fe9 +0 -0
  344. package/files/a7cbda7d-81ba-40f7-a997-51146af63e5f +0 -0
  345. package/files/ac01e83a-e572-41b6-81ab-c992cff7c170 +0 -0
  346. package/files/ad11a58f-f963-4233-bd29-1658b6b7e600 +0 -0
  347. package/files/ae60a4a8-08b9-4521-a0a3-d015a8b3ed08 +0 -0
  348. package/files/b1d3cf27-8d76-4cf9-aa51-d7c6bfd1b3bf +0 -0
  349. package/files/b2c68863-8554-4ac6-8e99-821f0267cf91 +0 -0
  350. package/files/b3043e01-a771-44af-bf19-5327646ff929 +0 -0
  351. package/files/b6d01b89-def5-4c7c-8e97-a3d88617f8f4 +0 -0
  352. package/files/b8760b32-bb1e-4cd7-a9d6-29c6e0b071bc +0 -0
  353. package/files/ba5e0470-44f7-47b3-bcb5-eeab3ca8c292 +0 -0
  354. package/files/c3969b5f-43ae-43f3-9bdd-d3959c79ca01 +0 -0
  355. package/files/caecd488-dbe6-4a30-a400-bced2ba8dae6 +0 -0
  356. package/files/d7d865b8-3a05-4ed1-b95d-b93dc1ebb9a9 +0 -0
  357. package/files/dbca5f31-cf38-4c1e-83b0-5ec8473196fc +0 -0
  358. package/files/dbf07e82-fff6-4985-bebe-d62c0458bfd0 +0 -0
  359. package/files/dd759c20-eead-4e57-9e74-4d3a2b978e91 +0 -5
  360. package/files/de0b2cf1-981b-4e4a-a04e-ac185d1620cd +0 -0
  361. package/files/de6837fe-5aa2-4ff9-a067-2646a008c780 +0 -0
  362. package/files/e2fde852-91cb-4e01-88a2-ee086b5f227c +0 -0
  363. package/files/e391d1ce-8d39-460c-a462-791730131f7f +0 -0
  364. package/files/e6d9b60f-2b1b-4c6f-ba6d-02f6de90d40f +0 -0
  365. package/files/f693c62d-2ac8-49fd-aa38-30904e013e3c +0 -0
  366. package/files/f749fdf5-193e-41f7-b643-5696f67c6402 +0 -0
  367. package/files/f8910384-e75c-4d65-825f-52a6748f6475 +0 -0
  368. package/files/fad8826b-e952-4acb-a509-3e6543b94d61 +0 -0
  369. package/jest.config.js +0 -13
  370. package/spire.sqlite +0 -0
@@ -1,252 +1,115 @@
1
- "use strict";
2
- var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
3
- function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
4
- return new (P || (P = Promise))(function (resolve, reject) {
5
- function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
6
- function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
7
- function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
8
- step((generator = generator.apply(thisArg, _arguments || [])).next());
9
- });
10
- };
11
- var __importDefault = (this && this.__importDefault) || function (mod) {
12
- return (mod && mod.__esModule) ? mod : { "default": mod };
13
- };
14
- Object.defineProperty(exports, "__esModule", { value: true });
15
- exports.ClientManager = exports.POWER_LEVELS = void 0;
16
- const sleep_1 = require("@extrahash/sleep");
17
- const crypto_1 = require("@vex-chat/crypto");
18
- const types_1 = require("@vex-chat/types");
19
- const chalk_1 = __importDefault(require("chalk"));
20
- const events_1 = require("events");
21
- const msgpack_lite_1 = __importDefault(require("msgpack-lite"));
22
- const tweetnacl_1 = __importDefault(require("tweetnacl"));
23
- const uuid_1 = require("uuid");
24
- const Spire_1 = require("./Spire");
25
- const createLogger_1 = require("./utils/createLogger");
26
- const createUint8UUID_1 = require("./utils/createUint8UUID");
27
- exports.POWER_LEVELS = {
28
- INVITE: 25,
1
+ import { EventEmitter } from "events";
2
+ import { setTimeout as sleep } from "node:timers/promises";
3
+ import { xConcat, XUtils } from "@vex-chat/crypto";
4
+ import { xSignOpen } from "@vex-chat/crypto";
5
+ import { MailWSSchema, SocketAuthErrors } from "@vex-chat/types";
6
+ import pc from "picocolors";
7
+ import { parse as uuidParse, validate as uuidValidate } from "uuid";
8
+ import { TOKEN_EXPIRY } from "./Spire.js";
9
+ import { createLogger } from "./utils/createLogger.js";
10
+ import { createUint8UUID } from "./utils/createUint8UUID.js";
11
+ import { msgpack } from "./utils/msgpack.js";
12
+ export const POWER_LEVELS = {
29
13
  CREATE: 50,
30
14
  DELETE: 50,
31
15
  EMOJI: 25,
16
+ INVITE: 25,
32
17
  };
33
18
  function emptyHeader() {
34
19
  return new Uint8Array(32);
35
20
  }
36
21
  const MAX_MSG_SIZE = 2048;
37
- function unpackMessage(msg) {
38
- const msgp = Uint8Array.from(msg);
39
- const msgh = msgp.slice(0, 32);
40
- const msgb = msgpack_lite_1.default.decode(msgp.slice(32));
41
- return [msgh, msgb];
42
- }
43
- function packMessage(msg, header) {
44
- const msgb = Uint8Array.from(msgpack_lite_1.default.encode(msg));
45
- const msgh = header || emptyHeader();
46
- return crypto_1.xConcat(msgh, msgb);
47
- }
48
- class ClientManager extends events_1.EventEmitter {
22
+ export class ClientManager extends EventEmitter {
23
+ alive = true;
24
+ authed = false;
25
+ challengeID = createUint8UUID();
26
+ conn;
27
+ db;
28
+ device;
29
+ failed = false;
30
+ log;
31
+ notify;
32
+ user;
33
+ userDetails;
49
34
  constructor(ws, db, notify, userDetails, options) {
50
35
  super();
51
- this.authed = false;
52
- this.alive = true;
53
- this.challengeID = createUint8UUID_1.createUint8UUID();
54
- this.failed = false;
55
36
  this.conn = ws;
56
37
  this.db = db;
57
38
  this.user = null;
58
39
  this.userDetails = userDetails;
59
40
  this.device = null;
60
41
  this.notify = notify;
61
- this.log = createLogger_1.createLogger("client-manager", (options === null || options === void 0 ? void 0 : options.logLevel) || "error");
42
+ this.log = createLogger("client-manager", options?.logLevel || "error");
62
43
  this.initListeners();
63
44
  this.challenge();
64
45
  }
65
- toString() {
66
- if (!this.user || !this.device) {
67
- return "Unauthorized#0000";
46
+ getDevice() {
47
+ if (!this.device) {
48
+ throw new Error("No device set on this client.");
68
49
  }
69
- return this.user.username + "<" + this.getDevice().deviceID + ">";
50
+ return this.device;
70
51
  }
71
52
  getUser() {
72
- if (!this.authed) {
53
+ if (!this.authed || !this.user) {
73
54
  throw new Error("You must be authed before getting user info.");
74
55
  }
75
56
  return this.user;
76
57
  }
77
58
  send(msg, header) {
78
- return __awaiter(this, void 0, void 0, function* () {
79
- if (header) {
80
- this.log.debug(chalk_1.default.red.bold("OUTH"), header.toString());
81
- }
82
- else {
83
- this.log.debug(chalk_1.default.red.bold("OUTH"), emptyHeader.toString());
84
- }
85
- const packedMessage = packMessage(msg, header);
86
- this.log.info(chalk_1.default.bold("⟶ ") +
87
- responseColor(msg.type.toUpperCase()) +
88
- " " +
89
- this.toString() +
90
- " " +
91
- chalk_1.default.yellow(Buffer.byteLength(packedMessage)));
92
- this.log.debug(chalk_1.default.red.bold("OUT"), msg);
93
- try {
94
- this.conn.send(packedMessage);
95
- }
96
- catch (err) {
97
- this.log.warn(err.toString());
98
- this.fail();
99
- }
100
- });
101
- }
102
- getDevice() {
103
- return this.device;
104
- }
105
- authorize(transmissionID) {
106
- this.authed = true;
107
- this.sendAuthedMessage(transmissionID);
108
- this.db.markDeviceLogin(this.getDevice());
109
- this.emit("authed");
110
- }
111
- fail() {
112
- if (this.failed) {
113
- return;
59
+ if (header) {
60
+ this.log.debug(pc.bold(pc.red("OUTH")), header.toString());
114
61
  }
115
- if (this.conn) {
116
- this.log.warn("Connection closed.");
117
- this.conn.close();
62
+ else {
63
+ this.log.debug(pc.bold(pc.red("OUTH")), emptyHeader.toString());
118
64
  }
119
- this.failed = true;
120
- this.emit("fail");
121
- }
122
- setAlive(status) {
123
- this.alive = status;
124
- }
125
- pingLoop() {
126
- return __awaiter(this, void 0, void 0, function* () {
127
- while (true) {
128
- this.ping();
129
- yield sleep_1.sleep(5000);
130
- }
131
- });
132
- }
133
- ping() {
134
- if (!this.alive) {
65
+ const packedMessage = packMessage(msg, header);
66
+ this.log.info(pc.bold("") +
67
+ responseColor(msg.type.toUpperCase()) +
68
+ " " +
69
+ this.toString() +
70
+ " " +
71
+ pc.yellow(Buffer.byteLength(packedMessage)));
72
+ this.log.debug(pc.bold(pc.red("OUT")), msg);
73
+ try {
74
+ this.conn.send(packedMessage);
75
+ }
76
+ catch (err) {
77
+ this.log.warn(String(err));
135
78
  this.fail();
136
- return;
137
79
  }
138
- this.setAlive(false);
139
- const p = { transmissionID: uuid_1.v4(), type: "ping" };
140
- this.send(p);
141
80
  }
142
- pong(transmissionID) {
143
- // ping is allowed before auth
144
- if (this.user) {
145
- this.db.markUserSeen(this.user);
81
+ toString() {
82
+ if (!this.user || !this.device) {
83
+ return "Unauthorized#0000";
146
84
  }
147
- const p = { transmissionID, type: "pong" };
148
- this.send(p);
85
+ return this.user.username + "<" + this.getDevice().deviceID + ">";
149
86
  }
150
- verifyResponse(msg) {
151
- return __awaiter(this, void 0, void 0, function* () {
152
- const user = yield this.db.retrieveUser(this.userDetails.userID);
153
- if (user) {
154
- const devices = yield this.db.retrieveUserDeviceList([user.userID]);
155
- let message = null;
156
- for (const device of devices) {
157
- const verified = tweetnacl_1.default.sign.open(msg.signed, crypto_1.XUtils.decodeHex(device.signKey));
158
- if (verified) {
159
- message = verified;
160
- this.device = device;
161
- }
162
- }
163
- if (!message) {
164
- this.log.warn("Signature verification failed!");
165
- this.sendAuthError(types_1.XTypes.WS.SocketAuthErrors.BadSignature);
166
- this.fail();
167
- return;
168
- }
169
- if (crypto_1.XUtils.bytesEqual(this.challengeID, message)) {
170
- this.user = user;
171
- this.authorize(msg.transmissionID);
172
- }
173
- else {
174
- this.log.warn("Token is bad!");
175
- this.sendAuthError(types_1.XTypes.WS.SocketAuthErrors.InvalidToken);
176
- }
177
- }
178
- else {
179
- this.log.info("User is not registered.");
180
- this.sendAuthError(types_1.XTypes.WS.SocketAuthErrors.UserNotRegistered);
181
- this.fail();
182
- }
183
- });
87
+ authorize(transmissionID) {
88
+ this.authed = true;
89
+ this.sendAuthedMessage(transmissionID);
90
+ void this.db.markDeviceLogin(this.getDevice());
91
+ this.emit("authed");
184
92
  }
185
93
  challenge() {
186
- this.challengeID = new Uint8Array(uuid_1.parse(uuid_1.v4()));
94
+ this.challengeID = new Uint8Array(uuidParse(crypto.randomUUID()));
187
95
  const challenge = {
188
- transmissionID: uuid_1.v4(),
189
- type: "challenge",
190
96
  challenge: this.challengeID,
97
+ transmissionID: crypto.randomUUID(),
98
+ type: "challenge",
191
99
  };
192
100
  this.send(challenge);
193
101
  }
194
- sendErr(transmissionID, message, data) {
195
- const error = {
196
- transmissionID,
197
- type: "error",
198
- error: message,
199
- data,
200
- };
201
- this.send(error);
202
- }
203
- sendAuthError(error) {
204
- this.send({ type: "authErr", error });
205
- }
206
- sendAuthedMessage(transmissionID) {
207
- this.send({ type: "authorized", transmissionID });
208
- }
209
- sendSuccess(transmissionID, data, header, timestamp) {
210
- const msg = {
211
- transmissionID,
212
- type: "success",
213
- data,
214
- timestamp,
215
- };
216
- this.send(msg, header);
217
- }
218
- parseResourceMsg(msg, header) {
219
- return __awaiter(this, void 0, void 0, function* () {
220
- switch (msg.resourceType) {
221
- case "mail":
222
- if (msg.action === "CREATE") {
223
- const mail = msg.data;
224
- try {
225
- yield this.db.saveMail(mail, header, this.getDevice().deviceID, this.getUser().userID);
226
- this.log.info("Received mail for " + msg.data.recipient);
227
- const deviceDetails = yield this.db.retrieveDevice(msg.data.recipient);
228
- if (!deviceDetails) {
229
- this.sendErr(msg.transmissionID, "No associated user record found for device.");
230
- return;
231
- }
232
- this.sendSuccess(msg.transmissionID, null);
233
- this.notify(deviceDetails.owner, "mail", msg.transmissionID, null, msg.data.recipient);
234
- }
235
- catch (err) {
236
- this.log.error(err);
237
- this.sendErr(msg.transmissionID, err.toString());
238
- }
239
- }
240
- break;
241
- default:
242
- this.log.info("Unsupported resource type " + msg.resourceType);
243
- }
244
- });
102
+ fail() {
103
+ if (this.failed) {
104
+ return;
105
+ }
106
+ this.log.warn("Connection closed.");
107
+ this.conn.close();
108
+ this.failed = true;
109
+ this.emit("fail");
245
110
  }
246
- handleReceipt(msg) {
247
- return __awaiter(this, void 0, void 0, function* () {
248
- yield this.db.deleteMail(msg.nonce, this.getDevice().deviceID);
249
- });
111
+ async handleReceipt(msg) {
112
+ await this.db.deleteMail(msg.nonce, this.getDevice().deviceID);
250
113
  }
251
114
  initListeners() {
252
115
  this.conn.on("open", () => {
@@ -254,8 +117,8 @@ class ClientManager extends events_1.EventEmitter {
254
117
  if (!this.authed) {
255
118
  this.conn.close();
256
119
  }
257
- }, Spire_1.TOKEN_EXPIRY);
258
- this.pingLoop();
120
+ }, TOKEN_EXPIRY);
121
+ void this.pingLoop();
259
122
  });
260
123
  this.conn.on("close", () => {
261
124
  this.fail();
@@ -265,50 +128,49 @@ class ClientManager extends events_1.EventEmitter {
265
128
  const size = Buffer.byteLength(message);
266
129
  if (size > MAX_MSG_SIZE) {
267
130
  this.sendErr(msg.transmissionID, "Message is too big. Received size " +
268
- size +
131
+ String(size) +
269
132
  " while max size is " +
270
- MAX_MSG_SIZE);
133
+ String(MAX_MSG_SIZE));
271
134
  return;
272
135
  }
273
- this.log.info(chalk_1.default.bold("⟵ ") +
274
- (msg.type === "resource"
275
- ? crudColor(msg.action.toUpperCase()) +
276
- " " +
277
- chalk_1.default.bold(msg.resourceType.toUpperCase())
278
- : chalk_1.default.bold(msg.type.toUpperCase())) +
136
+ this.log.info(pc.bold("⟵ ") +
137
+ pc.bold(msg.type.toUpperCase()) +
279
138
  " " +
280
139
  this.toString() +
281
140
  " " +
282
- chalk_1.default.yellow(size));
283
- this.log.debug(chalk_1.default.red.bold("INH"), header.toString());
284
- this.log.debug(chalk_1.default.red.bold("IN"), msg);
141
+ pc.yellow(String(size)));
142
+ this.log.debug(pc.bold(pc.red("INH")), header.toString());
143
+ this.log.debug(pc.bold(pc.red("IN")), msg);
285
144
  if (!msg.type) {
286
145
  this.sendErr(msg.transmissionID, "Message type is required.");
287
146
  return;
288
147
  }
289
- if (!uuid_1.validate(msg.transmissionID)) {
290
- this.sendErr(uuid_1.v4(), "transmissionID is required and must be a valid uuid.");
148
+ if (!uuidValidate(msg.transmissionID)) {
149
+ this.sendErr(crypto.randomUUID(), "transmissionID is required and must be a valid uuid.");
291
150
  return;
292
151
  }
293
152
  switch (msg.type) {
153
+ case "ping":
154
+ this.pong(msg.transmissionID);
155
+ break;
156
+ case "pong":
157
+ this.setAlive(true);
158
+ break;
294
159
  case "receipt":
295
- this.handleReceipt(msg);
160
+ // eslint-disable-next-line @typescript-eslint/no-unsafe-type-assertion -- narrowed by msg.type
161
+ void this.handleReceipt(msg);
296
162
  break;
297
163
  case "resource":
298
164
  if (!this.authed) {
299
165
  this.sendErr(msg.transmissionID, "You are not authenticated.");
300
166
  break;
301
167
  }
302
- this.parseResourceMsg(msg, header);
168
+ // eslint-disable-next-line @typescript-eslint/no-unsafe-type-assertion -- narrowed by msg.type
169
+ void this.parseResourceMsg(msg, header);
303
170
  break;
304
171
  case "response":
305
- this.verifyResponse(msg);
306
- break;
307
- case "ping":
308
- this.pong(msg.transmissionID);
309
- break;
310
- case "pong":
311
- this.setAlive(true);
172
+ // eslint-disable-next-line @typescript-eslint/no-unsafe-type-assertion -- narrowed by msg.type
173
+ void this.verifyResponse(msg);
312
174
  break;
313
175
  default:
314
176
  this.log.info("unsupported message %s", msg.type);
@@ -316,29 +178,148 @@ class ClientManager extends events_1.EventEmitter {
316
178
  }
317
179
  });
318
180
  }
319
- }
320
- exports.ClientManager = ClientManager;
321
- const crudColor = (action) => {
322
- switch (action) {
323
- case "CREATE":
324
- return chalk_1.default.yellow.bold(action);
325
- case "RETRIEVE":
326
- return chalk_1.default.yellow.bold(action);
327
- case "UPDATE":
328
- return chalk_1.default.cyan.bold(action);
329
- case "DELETE":
330
- return chalk_1.default.red.bold(action);
331
- default:
332
- return action;
181
+ async parseResourceMsg(msg, header) {
182
+ switch (msg.resourceType) {
183
+ case "mail":
184
+ if (msg.action === "CREATE") {
185
+ const mailResult = MailWSSchema.safeParse(msg.data);
186
+ if (!mailResult.success) {
187
+ this.sendErr(msg.transmissionID, "Invalid mail payload: " +
188
+ JSON.stringify(mailResult.error.issues));
189
+ return;
190
+ }
191
+ const mail = mailResult.data;
192
+ try {
193
+ await this.db.saveMail(mail, header, this.getDevice().deviceID, this.getUser().userID);
194
+ this.log.info("Received mail for " + mail.recipient);
195
+ const deviceDetails = await this.db.retrieveDevice(mail.recipient);
196
+ if (!deviceDetails) {
197
+ this.sendErr(msg.transmissionID, "No associated user record found for device.");
198
+ return;
199
+ }
200
+ this.sendSuccess(msg.transmissionID, null);
201
+ this.notify(deviceDetails.owner, "mail", msg.transmissionID, null, mail.recipient);
202
+ }
203
+ catch (err) {
204
+ this.log.error(String(err));
205
+ this.sendErr(msg.transmissionID, String(err));
206
+ }
207
+ }
208
+ break;
209
+ default:
210
+ this.log.info("Unsupported resource type " + msg.resourceType);
211
+ }
333
212
  }
334
- };
213
+ ping() {
214
+ if (!this.alive) {
215
+ this.fail();
216
+ return;
217
+ }
218
+ this.setAlive(false);
219
+ const p = { transmissionID: crypto.randomUUID(), type: "ping" };
220
+ this.send(p);
221
+ }
222
+ async pingLoop() {
223
+ // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition -- intentional infinite loop
224
+ while (true) {
225
+ this.ping();
226
+ await sleep(5000);
227
+ }
228
+ }
229
+ pong(transmissionID) {
230
+ // ping is allowed before auth
231
+ if (this.user) {
232
+ void this.db.markUserSeen(this.user);
233
+ }
234
+ const p = { transmissionID, type: "pong" };
235
+ this.send(p);
236
+ }
237
+ sendAuthedMessage(transmissionID) {
238
+ this.send({ transmissionID, type: "authorized" });
239
+ }
240
+ sendAuthError(error) {
241
+ const msg = {
242
+ error,
243
+ transmissionID: crypto.randomUUID(),
244
+ type: "authErr",
245
+ };
246
+ this.send(msg);
247
+ }
248
+ sendErr(transmissionID, message, data) {
249
+ const error = {
250
+ data,
251
+ error: message,
252
+ transmissionID,
253
+ type: "error",
254
+ };
255
+ this.send(error);
256
+ }
257
+ sendSuccess(transmissionID, data, header, timestamp) {
258
+ const msg = {
259
+ data,
260
+ timestamp,
261
+ transmissionID,
262
+ type: "success",
263
+ };
264
+ this.send(msg, header);
265
+ }
266
+ setAlive(status) {
267
+ this.alive = status;
268
+ }
269
+ async verifyResponse(msg) {
270
+ const user = await this.db.retrieveUser(this.userDetails.userID);
271
+ if (user) {
272
+ const devices = await this.db.retrieveUserDeviceList([user.userID]);
273
+ let message = null;
274
+ for (const device of devices) {
275
+ const verified = xSignOpen(msg.signed, XUtils.decodeHex(device.signKey));
276
+ if (verified) {
277
+ message = verified;
278
+ this.device = device;
279
+ }
280
+ }
281
+ if (!message) {
282
+ this.log.warn("Signature verification failed!");
283
+ this.sendAuthError(SocketAuthErrors.BadSignature);
284
+ this.fail();
285
+ return;
286
+ }
287
+ if (XUtils.bytesEqual(this.challengeID, message)) {
288
+ this.user = user;
289
+ this.authorize(msg.transmissionID);
290
+ }
291
+ else {
292
+ this.log.warn("Token is bad!");
293
+ this.sendAuthError(SocketAuthErrors.InvalidToken);
294
+ }
295
+ }
296
+ else {
297
+ this.log.info("User is not registered.");
298
+ this.sendAuthError(SocketAuthErrors.UserNotRegistered);
299
+ this.fail();
300
+ }
301
+ }
302
+ }
303
+ function packMessage(msg, header) {
304
+ const msgb = Uint8Array.from(msgpack.encode(msg));
305
+ const msgh = header || emptyHeader();
306
+ return xConcat(msgh, msgb);
307
+ }
308
+ function unpackMessage(msg) {
309
+ const msgp = Uint8Array.from(msg);
310
+ const msgh = msgp.slice(0, 32);
311
+ // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment -- msgpack.decode returns any
312
+ const msgb = msgpack.decode(msgp.slice(32));
313
+ return [msgh, msgb];
314
+ }
335
315
  const responseColor = (status) => {
336
316
  switch (status) {
337
- case "SUCCESS":
338
- return chalk_1.default.green.bold(status);
339
317
  case "ERROR":
340
- return chalk_1.default.red.bold(status);
318
+ return pc.bold(pc.red(status));
319
+ case "SUCCESS":
320
+ return pc.bold(pc.green(status));
341
321
  default:
342
322
  return status;
343
323
  }
344
324
  };
325
+ //# sourceMappingURL=ClientManager.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ClientManager.js","sourceRoot":"","sources":["../src/ClientManager.ts"],"names":[],"mappings":"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"}