@digitaldefiance/node-express-suite 1.0.22 → 1.0.23

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 (633) hide show
  1. package/README.md +4 -0
  2. package/package.json +27 -32
  3. package/src/application-base.ts +492 -0
  4. package/src/application.ts +254 -0
  5. package/src/backup-code.ts +336 -0
  6. package/src/constants.ts +69 -0
  7. package/src/controllers/base.ts +440 -0
  8. package/{dist/controllers/index.d.ts → src/controllers/index.ts} +0 -1
  9. package/src/controllers/user.ts +1451 -0
  10. package/src/decorators/base-controller.ts +61 -0
  11. package/src/decorators/controller.ts +109 -0
  12. package/{dist/decorators/index.d.ts → src/decorators/index.ts} +0 -1
  13. package/src/decorators/zod-validation.ts +57 -0
  14. package/src/defaults.ts +94 -0
  15. package/src/documents/base.ts +7 -0
  16. package/src/documents/email-token.ts +14 -0
  17. package/{dist/documents/index.d.ts → src/documents/index.ts} +0 -1
  18. package/{dist/documents/mnemonic.d.ts → src/documents/mnemonic.ts} +5 -2
  19. package/{dist/documents/role.d.ts → src/documents/role.ts} +5 -2
  20. package/src/documents/used-direct-login-token.ts +7 -0
  21. package/{dist/documents/user-role.d.ts → src/documents/user-role.ts} +5 -2
  22. package/{dist/documents/user.d.ts → src/documents/user.ts} +4 -2
  23. package/src/enumerations/base-model-name.ts +41 -0
  24. package/{dist/enumerations/index.d.ts → src/enumerations/index.ts} +0 -1
  25. package/src/enumerations/length-encoding-type.ts +6 -0
  26. package/src/enumerations/schema-collection.ts +33 -0
  27. package/src/enumerations/symmetric-error-type.ts +4 -0
  28. package/src/environment.ts +770 -0
  29. package/src/errors/express-validation.ts +21 -0
  30. package/{dist/errors/index.d.ts → src/errors/index.ts} +0 -1
  31. package/src/errors/invalid-backup-code-version.ts +14 -0
  32. package/src/errors/invalid-jwt-token.ts +10 -0
  33. package/src/errors/invalid-model.ts +11 -0
  34. package/src/errors/invalid-new-password.ts +18 -0
  35. package/src/errors/invalid-password.ts +13 -0
  36. package/src/errors/missing-validated-data.ts +36 -0
  37. package/src/errors/mnemonic-or-password-required.ts +12 -0
  38. package/src/errors/model-not-registered.ts +11 -0
  39. package/src/errors/mongoose-validation.ts +34 -0
  40. package/src/errors/symmetric.ts +41 -0
  41. package/src/errors/token-expired.ts +10 -0
  42. package/src/get-language.ts +53 -0
  43. package/src/get-timezone.ts +45 -0
  44. package/{dist/index.d.ts → src/index.ts} +3 -2
  45. package/{dist/interfaces/api-error-response.d.ts → src/interfaces/api-error-response.ts} +2 -2
  46. package/src/interfaces/api-express-validation-error-response.ts +8 -0
  47. package/src/interfaces/api-message-response.ts +3 -0
  48. package/{dist/interfaces/api-mongo-validation-error-response.d.ts → src/interfaces/api-mongo-validation-error-response.ts} +2 -2
  49. package/{dist/interfaces/api-responses/backup-codes-response.d.ts → src/interfaces/api-responses/backup-codes-response.ts} +2 -2
  50. package/{dist/interfaces/api-responses/challenge-response.d.ts → src/interfaces/api-responses/challenge-response.ts} +3 -3
  51. package/{dist/interfaces/api-responses/code-count-response.d.ts → src/interfaces/api-responses/code-count-response.ts} +2 -2
  52. package/{dist/interfaces/api-responses/index.d.ts → src/interfaces/api-responses/index.ts} +0 -1
  53. package/{dist/interfaces/api-responses/login-response.d.ts → src/interfaces/api-responses/login-response.ts} +4 -4
  54. package/{dist/interfaces/api-responses/mnemonic-response.d.ts → src/interfaces/api-responses/mnemonic-response.ts} +2 -2
  55. package/{dist/interfaces/api-responses/registration-response.d.ts → src/interfaces/api-responses/registration-response.ts} +3 -3
  56. package/{dist/interfaces/api-responses/request-user-response.d.ts → src/interfaces/api-responses/request-user-response.ts} +2 -2
  57. package/{dist/interfaces/application.d.ts → src/interfaces/application.ts} +7 -7
  58. package/src/interfaces/backend-objects/email-token.ts +11 -0
  59. package/{dist/interfaces/backend-objects/index.d.ts → src/interfaces/backend-objects/index.ts} +0 -1
  60. package/{dist/interfaces/backend-objects/request-user.d.ts → src/interfaces/backend-objects/request-user.ts} +7 -2
  61. package/{dist/interfaces/backend-objects/role.d.ts → src/interfaces/backend-objects/role.ts} +1 -1
  62. package/src/interfaces/backend-objects/user.ts +9 -0
  63. package/src/interfaces/checksum-config.ts +4 -0
  64. package/src/interfaces/checksum-consts.ts +13 -0
  65. package/{dist/interfaces/constants.d.ts → src/interfaces/constants.ts} +5 -5
  66. package/src/interfaces/create-user-basics.ts +17 -0
  67. package/src/interfaces/csp-config.ts +35 -0
  68. package/src/interfaces/deep-partial.ts +3 -0
  69. package/{dist/interfaces/discriminator-collections.d.ts → src/interfaces/discriminator-collections.ts} +3 -3
  70. package/src/interfaces/email-service.ts +8 -0
  71. package/src/interfaces/environment-mongo.ts +76 -0
  72. package/src/interfaces/environment.ts +181 -0
  73. package/src/interfaces/failable-result.ts +6 -0
  74. package/src/interfaces/fec-consts.ts +4 -0
  75. package/src/interfaces/handleable-error-options.ts +6 -0
  76. package/{dist/interfaces/index.d.ts → src/interfaces/index.ts} +0 -1
  77. package/src/interfaces/jwt-consts.ts +23 -0
  78. package/src/interfaces/jwt-sign-response.ts +19 -0
  79. package/src/interfaces/mongo-errors.ts +5 -0
  80. package/src/interfaces/request-user.ts +50 -0
  81. package/src/interfaces/required-string-keys.ts +26 -0
  82. package/src/interfaces/schema.ts +31 -0
  83. package/src/interfaces/server-init-result.ts +37 -0
  84. package/src/interfaces/status-code-response.ts +7 -0
  85. package/src/interfaces/symmetric-encryption-results.d.ts +5 -0
  86. package/src/interfaces/symmetric-encryption-results.d.ts.map +1 -0
  87. package/src/interfaces/symmetric-encryption-results.js.map +1 -0
  88. package/src/interfaces/symmetric-encryption-results.ts +4 -0
  89. package/{dist/interfaces/token-response.d.ts → src/interfaces/token-response.ts} +2 -2
  90. package/src/middlewares/authenticate-crypto.ts +243 -0
  91. package/src/middlewares/authenticate-token.ts +152 -0
  92. package/src/middlewares/cleanup-crypto.ts +40 -0
  93. package/{dist/middlewares/index.d.ts → src/middlewares/index.ts} +0 -1
  94. package/src/middlewares/set-global-context-language.ts +24 -0
  95. package/src/middlewares.ts +120 -0
  96. package/src/model-registry.ts +75 -0
  97. package/src/models/email-token.ts +19 -0
  98. package/{dist/models/index.d.ts → src/models/index.ts} +0 -1
  99. package/src/models/mnemonic.ts +19 -0
  100. package/src/models/role.ts +19 -0
  101. package/src/models/used-direct-login-token.ts +23 -0
  102. package/src/models/user-role.ts +17 -0
  103. package/src/models/user.ts +19 -0
  104. package/src/registry/email-service-registry.ts +24 -0
  105. package/{dist/registry/index.d.ts → src/registry/index.ts} +0 -1
  106. package/src/routers/api.ts +151 -0
  107. package/src/routers/app.ts +258 -0
  108. package/src/routers/base.ts +17 -0
  109. package/{dist/routers/index.d.ts → src/routers/index.ts} +0 -1
  110. package/src/schemas/email-token.ts +91 -0
  111. package/{dist/schemas/index.d.ts → src/schemas/index.ts} +1 -2
  112. package/src/schemas/mnemonic.ts +37 -0
  113. package/src/schemas/role.ts +127 -0
  114. package/src/schemas/schema.ts +140 -0
  115. package/src/schemas/used-direct-login-token.ts +38 -0
  116. package/src/schemas/user-role.ts +75 -0
  117. package/src/schemas/user.ts +202 -0
  118. package/src/services/backup-code.ts +316 -0
  119. package/src/services/base.ts +33 -0
  120. package/src/services/checksum.ts +161 -0
  121. package/src/services/crc.ts +213 -0
  122. package/src/services/database-initialization.ts +1479 -0
  123. package/src/services/db-init-cache.d.ts +16 -0
  124. package/src/services/direct-login-token.ts +62 -0
  125. package/src/services/fec-usage-example.ts +102 -0
  126. package/src/services/fec.ts +296 -0
  127. package/{dist/services/index.d.ts → src/services/index.ts} +0 -1
  128. package/src/services/jwt.ts +134 -0
  129. package/src/services/key-wrapping.ts +434 -0
  130. package/src/services/mnemonic.ts +167 -0
  131. package/src/services/request-user.ts +62 -0
  132. package/src/services/role.ts +396 -0
  133. package/src/services/symmetric.ts +139 -0
  134. package/src/services/system-user.ts +82 -0
  135. package/src/services/user.ts +2137 -0
  136. package/src/services/xor.ts +34 -0
  137. package/src/types.d.ts +44 -0
  138. package/src/types.ts +128 -0
  139. package/src/utils.ts +1022 -0
  140. package/dist/application-base.d.ts +0 -112
  141. package/dist/application-base.d.ts.map +0 -1
  142. package/dist/application-base.js +0 -301
  143. package/dist/application-base.js.map +0 -1
  144. package/dist/application.d.ts +0 -23
  145. package/dist/application.d.ts.map +0 -1
  146. package/dist/application.js +0 -126
  147. package/dist/application.js.map +0 -1
  148. package/dist/backup-code.d.ts +0 -67
  149. package/dist/backup-code.d.ts.map +0 -1
  150. package/dist/backup-code.js +0 -270
  151. package/dist/backup-code.js.map +0 -1
  152. package/dist/constants.d.ts +0 -16
  153. package/dist/constants.d.ts.map +0 -1
  154. package/dist/constants.js +0 -54
  155. package/dist/constants.js.map +0 -1
  156. package/dist/controllers/base.d.ts +0 -63
  157. package/dist/controllers/base.d.ts.map +0 -1
  158. package/dist/controllers/base.js +0 -269
  159. package/dist/controllers/base.js.map +0 -1
  160. package/dist/controllers/index.d.ts.map +0 -1
  161. package/dist/controllers/index.js +0 -19
  162. package/dist/controllers/index.js.map +0 -1
  163. package/dist/controllers/user.d.ts +0 -45
  164. package/dist/controllers/user.d.ts.map +0 -1
  165. package/dist/controllers/user.js +0 -750
  166. package/dist/controllers/user.js.map +0 -1
  167. package/dist/decorators/base-controller.d.ts +0 -14
  168. package/dist/decorators/base-controller.d.ts.map +0 -1
  169. package/dist/decorators/base-controller.js +0 -49
  170. package/dist/decorators/base-controller.js.map +0 -1
  171. package/dist/decorators/controller.d.ts +0 -32
  172. package/dist/decorators/controller.d.ts.map +0 -1
  173. package/dist/decorators/controller.js +0 -67
  174. package/dist/decorators/controller.js.map +0 -1
  175. package/dist/decorators/index.d.ts.map +0 -1
  176. package/dist/decorators/index.js +0 -20
  177. package/dist/decorators/index.js.map +0 -1
  178. package/dist/decorators/zod-validation.d.ts +0 -5
  179. package/dist/decorators/zod-validation.d.ts.map +0 -1
  180. package/dist/decorators/zod-validation.js +0 -47
  181. package/dist/decorators/zod-validation.js.map +0 -1
  182. package/dist/defaults.d.ts +0 -7
  183. package/dist/defaults.d.ts.map +0 -1
  184. package/dist/defaults.js +0 -83
  185. package/dist/defaults.js.map +0 -1
  186. package/dist/documents/base.d.ts +0 -3
  187. package/dist/documents/base.d.ts.map +0 -1
  188. package/dist/documents/base.js +0 -3
  189. package/dist/documents/base.js.map +0 -1
  190. package/dist/documents/email-token.d.ts +0 -8
  191. package/dist/documents/email-token.d.ts.map +0 -1
  192. package/dist/documents/email-token.js +0 -3
  193. package/dist/documents/email-token.js.map +0 -1
  194. package/dist/documents/index.d.ts.map +0 -1
  195. package/dist/documents/index.js +0 -3
  196. package/dist/documents/index.js.map +0 -1
  197. package/dist/documents/mnemonic.d.ts.map +0 -1
  198. package/dist/documents/mnemonic.js +0 -3
  199. package/dist/documents/mnemonic.js.map +0 -1
  200. package/dist/documents/role.d.ts.map +0 -1
  201. package/dist/documents/role.js +0 -3
  202. package/dist/documents/role.js.map +0 -1
  203. package/dist/documents/used-direct-login-token.d.ts +0 -5
  204. package/dist/documents/used-direct-login-token.d.ts.map +0 -1
  205. package/dist/documents/used-direct-login-token.js +0 -3
  206. package/dist/documents/used-direct-login-token.js.map +0 -1
  207. package/dist/documents/user-role.d.ts.map +0 -1
  208. package/dist/documents/user-role.js +0 -3
  209. package/dist/documents/user-role.js.map +0 -1
  210. package/dist/documents/user.d.ts.map +0 -1
  211. package/dist/documents/user.js +0 -3
  212. package/dist/documents/user.js.map +0 -1
  213. package/dist/enumerations/base-model-name.d.ts +0 -38
  214. package/dist/enumerations/base-model-name.d.ts.map +0 -1
  215. package/dist/enumerations/base-model-name.js +0 -34
  216. package/dist/enumerations/base-model-name.js.map +0 -1
  217. package/dist/enumerations/index.d.ts.map +0 -1
  218. package/dist/enumerations/index.js +0 -21
  219. package/dist/enumerations/index.js.map +0 -1
  220. package/dist/enumerations/length-encoding-type.d.ts +0 -7
  221. package/dist/enumerations/length-encoding-type.d.ts.map +0 -1
  222. package/dist/enumerations/length-encoding-type.js +0 -11
  223. package/dist/enumerations/length-encoding-type.js.map +0 -1
  224. package/dist/enumerations/schema-collection.d.ts +0 -34
  225. package/dist/enumerations/schema-collection.d.ts.map +0 -1
  226. package/dist/enumerations/schema-collection.js +0 -38
  227. package/dist/enumerations/schema-collection.js.map +0 -1
  228. package/dist/enumerations/symmetric-error-type.d.ts +0 -5
  229. package/dist/enumerations/symmetric-error-type.d.ts.map +0 -1
  230. package/dist/enumerations/symmetric-error-type.js +0 -9
  231. package/dist/enumerations/symmetric-error-type.js.map +0 -1
  232. package/dist/environment.d.ts +0 -189
  233. package/dist/environment.d.ts.map +0 -1
  234. package/dist/environment.js +0 -618
  235. package/dist/environment.js.map +0 -1
  236. package/dist/errors/express-validation.d.ts +0 -9
  237. package/dist/errors/express-validation.d.ts.map +0 -1
  238. package/dist/errors/express-validation.js +0 -17
  239. package/dist/errors/express-validation.js.map +0 -1
  240. package/dist/errors/index.d.ts.map +0 -1
  241. package/dist/errors/index.js +0 -29
  242. package/dist/errors/index.js.map +0 -1
  243. package/dist/errors/invalid-backup-code-version.d.ts +0 -6
  244. package/dist/errors/invalid-backup-code-version.d.ts.map +0 -1
  245. package/dist/errors/invalid-backup-code-version.js +0 -14
  246. package/dist/errors/invalid-backup-code-version.js.map +0 -1
  247. package/dist/errors/invalid-jwt-token.d.ts +0 -5
  248. package/dist/errors/invalid-jwt-token.d.ts.map +0 -1
  249. package/dist/errors/invalid-jwt-token.js +0 -11
  250. package/dist/errors/invalid-jwt-token.js.map +0 -1
  251. package/dist/errors/invalid-model.d.ts +0 -6
  252. package/dist/errors/invalid-model.d.ts.map +0 -1
  253. package/dist/errors/invalid-model.js +0 -13
  254. package/dist/errors/invalid-model.js.map +0 -1
  255. package/dist/errors/invalid-new-password.d.ts +0 -5
  256. package/dist/errors/invalid-new-password.d.ts.map +0 -1
  257. package/dist/errors/invalid-new-password.js +0 -14
  258. package/dist/errors/invalid-new-password.js.map +0 -1
  259. package/dist/errors/invalid-password.d.ts +0 -5
  260. package/dist/errors/invalid-password.d.ts.map +0 -1
  261. package/dist/errors/invalid-password.js +0 -14
  262. package/dist/errors/invalid-password.js.map +0 -1
  263. package/dist/errors/missing-validated-data.d.ts +0 -7
  264. package/dist/errors/missing-validated-data.d.ts.map +0 -1
  265. package/dist/errors/missing-validated-data.js +0 -34
  266. package/dist/errors/missing-validated-data.js.map +0 -1
  267. package/dist/errors/mnemonic-or-password-required.d.ts +0 -5
  268. package/dist/errors/mnemonic-or-password-required.d.ts.map +0 -1
  269. package/dist/errors/mnemonic-or-password-required.js +0 -13
  270. package/dist/errors/mnemonic-or-password-required.js.map +0 -1
  271. package/dist/errors/model-not-registered.d.ts +0 -5
  272. package/dist/errors/model-not-registered.d.ts.map +0 -1
  273. package/dist/errors/model-not-registered.js +0 -12
  274. package/dist/errors/model-not-registered.js.map +0 -1
  275. package/dist/errors/mongoose-validation.d.ts +0 -11
  276. package/dist/errors/mongoose-validation.d.ts.map +0 -1
  277. package/dist/errors/mongoose-validation.js +0 -16
  278. package/dist/errors/mongoose-validation.js.map +0 -1
  279. package/dist/errors/symmetric.d.ts +0 -8
  280. package/dist/errors/symmetric.d.ts.map +0 -1
  281. package/dist/errors/symmetric.js +0 -23
  282. package/dist/errors/symmetric.js.map +0 -1
  283. package/dist/errors/token-expired.d.ts +0 -5
  284. package/dist/errors/token-expired.d.ts.map +0 -1
  285. package/dist/errors/token-expired.js +0 -11
  286. package/dist/errors/token-expired.js.map +0 -1
  287. package/dist/get-language.d.ts +0 -2
  288. package/dist/get-language.d.ts.map +0 -1
  289. package/dist/get-language.js +0 -30
  290. package/dist/get-language.js.map +0 -1
  291. package/dist/get-timezone.d.ts +0 -3
  292. package/dist/get-timezone.d.ts.map +0 -1
  293. package/dist/get-timezone.js +0 -31
  294. package/dist/get-timezone.js.map +0 -1
  295. package/dist/index.d.ts.map +0 -1
  296. package/dist/index.js +0 -40
  297. package/dist/index.js.map +0 -1
  298. package/dist/interfaces/api-error-response.d.ts.map +0 -1
  299. package/dist/interfaces/api-error-response.js +0 -3
  300. package/dist/interfaces/api-error-response.js.map +0 -1
  301. package/dist/interfaces/api-express-validation-error-response.d.ts +0 -7
  302. package/dist/interfaces/api-express-validation-error-response.d.ts.map +0 -1
  303. package/dist/interfaces/api-express-validation-error-response.js +0 -3
  304. package/dist/interfaces/api-express-validation-error-response.js.map +0 -1
  305. package/dist/interfaces/api-message-response.d.ts +0 -4
  306. package/dist/interfaces/api-message-response.d.ts.map +0 -1
  307. package/dist/interfaces/api-message-response.js +0 -3
  308. package/dist/interfaces/api-message-response.js.map +0 -1
  309. package/dist/interfaces/api-mongo-validation-error-response.d.ts.map +0 -1
  310. package/dist/interfaces/api-mongo-validation-error-response.js +0 -3
  311. package/dist/interfaces/api-mongo-validation-error-response.js.map +0 -1
  312. package/dist/interfaces/api-responses/backup-codes-response.d.ts.map +0 -1
  313. package/dist/interfaces/api-responses/backup-codes-response.js +0 -3
  314. package/dist/interfaces/api-responses/backup-codes-response.js.map +0 -1
  315. package/dist/interfaces/api-responses/challenge-response.d.ts.map +0 -1
  316. package/dist/interfaces/api-responses/challenge-response.js +0 -3
  317. package/dist/interfaces/api-responses/challenge-response.js.map +0 -1
  318. package/dist/interfaces/api-responses/code-count-response.d.ts.map +0 -1
  319. package/dist/interfaces/api-responses/code-count-response.js +0 -3
  320. package/dist/interfaces/api-responses/code-count-response.js.map +0 -1
  321. package/dist/interfaces/api-responses/index.d.ts.map +0 -1
  322. package/dist/interfaces/api-responses/index.js +0 -24
  323. package/dist/interfaces/api-responses/index.js.map +0 -1
  324. package/dist/interfaces/api-responses/login-response.d.ts.map +0 -1
  325. package/dist/interfaces/api-responses/login-response.js +0 -3
  326. package/dist/interfaces/api-responses/login-response.js.map +0 -1
  327. package/dist/interfaces/api-responses/mnemonic-response.d.ts.map +0 -1
  328. package/dist/interfaces/api-responses/mnemonic-response.js +0 -3
  329. package/dist/interfaces/api-responses/mnemonic-response.js.map +0 -1
  330. package/dist/interfaces/api-responses/registration-response.d.ts.map +0 -1
  331. package/dist/interfaces/api-responses/registration-response.js +0 -3
  332. package/dist/interfaces/api-responses/registration-response.js.map +0 -1
  333. package/dist/interfaces/api-responses/request-user-response.d.ts.map +0 -1
  334. package/dist/interfaces/api-responses/request-user-response.js +0 -3
  335. package/dist/interfaces/api-responses/request-user-response.js.map +0 -1
  336. package/dist/interfaces/application.d.ts.map +0 -1
  337. package/dist/interfaces/application.js +0 -3
  338. package/dist/interfaces/application.js.map +0 -1
  339. package/dist/interfaces/backend-objects/email-token.d.ts +0 -4
  340. package/dist/interfaces/backend-objects/email-token.d.ts.map +0 -1
  341. package/dist/interfaces/backend-objects/email-token.js +0 -3
  342. package/dist/interfaces/backend-objects/email-token.js.map +0 -1
  343. package/dist/interfaces/backend-objects/index.d.ts.map +0 -1
  344. package/dist/interfaces/backend-objects/index.js +0 -21
  345. package/dist/interfaces/backend-objects/index.js.map +0 -1
  346. package/dist/interfaces/backend-objects/request-user.d.ts.map +0 -1
  347. package/dist/interfaces/backend-objects/request-user.js +0 -3
  348. package/dist/interfaces/backend-objects/request-user.js.map +0 -1
  349. package/dist/interfaces/backend-objects/role.d.ts.map +0 -1
  350. package/dist/interfaces/backend-objects/role.js +0 -3
  351. package/dist/interfaces/backend-objects/role.js.map +0 -1
  352. package/dist/interfaces/backend-objects/user.d.ts +0 -4
  353. package/dist/interfaces/backend-objects/user.d.ts.map +0 -1
  354. package/dist/interfaces/backend-objects/user.js +0 -3
  355. package/dist/interfaces/backend-objects/user.js.map +0 -1
  356. package/dist/interfaces/checksum-config.d.ts +0 -5
  357. package/dist/interfaces/checksum-config.d.ts.map +0 -1
  358. package/dist/interfaces/checksum-config.js +0 -3
  359. package/dist/interfaces/checksum-config.js.map +0 -1
  360. package/dist/interfaces/checksum-consts.d.ts +0 -11
  361. package/dist/interfaces/checksum-consts.d.ts.map +0 -1
  362. package/dist/interfaces/checksum-consts.js +0 -3
  363. package/dist/interfaces/checksum-consts.js.map +0 -1
  364. package/dist/interfaces/constants.d.ts.map +0 -1
  365. package/dist/interfaces/constants.js +0 -3
  366. package/dist/interfaces/constants.js.map +0 -1
  367. package/dist/interfaces/create-user-basics.d.ts +0 -18
  368. package/dist/interfaces/create-user-basics.d.ts.map +0 -1
  369. package/dist/interfaces/create-user-basics.js +0 -3
  370. package/dist/interfaces/create-user-basics.js.map +0 -1
  371. package/dist/interfaces/csp-config.d.ts +0 -14
  372. package/dist/interfaces/csp-config.d.ts.map +0 -1
  373. package/dist/interfaces/csp-config.js +0 -3
  374. package/dist/interfaces/csp-config.js.map +0 -1
  375. package/dist/interfaces/deep-partial.d.ts +0 -4
  376. package/dist/interfaces/deep-partial.d.ts.map +0 -1
  377. package/dist/interfaces/deep-partial.js +0 -3
  378. package/dist/interfaces/deep-partial.js.map +0 -1
  379. package/dist/interfaces/discriminator-collections.d.ts.map +0 -1
  380. package/dist/interfaces/discriminator-collections.js +0 -3
  381. package/dist/interfaces/discriminator-collections.js.map +0 -1
  382. package/dist/interfaces/email-service.d.ts +0 -4
  383. package/dist/interfaces/email-service.d.ts.map +0 -1
  384. package/dist/interfaces/email-service.js +0 -3
  385. package/dist/interfaces/email-service.js.map +0 -1
  386. package/dist/interfaces/environment-mongo.d.ts +0 -76
  387. package/dist/interfaces/environment-mongo.d.ts.map +0 -1
  388. package/dist/interfaces/environment-mongo.js +0 -3
  389. package/dist/interfaces/environment-mongo.js.map +0 -1
  390. package/dist/interfaces/environment.d.ts +0 -181
  391. package/dist/interfaces/environment.d.ts.map +0 -1
  392. package/dist/interfaces/environment.js +0 -3
  393. package/dist/interfaces/environment.js.map +0 -1
  394. package/dist/interfaces/failable-result.d.ts +0 -7
  395. package/dist/interfaces/failable-result.d.ts.map +0 -1
  396. package/dist/interfaces/failable-result.js +0 -3
  397. package/dist/interfaces/failable-result.js.map +0 -1
  398. package/dist/interfaces/fec-consts.d.ts +0 -5
  399. package/dist/interfaces/fec-consts.d.ts.map +0 -1
  400. package/dist/interfaces/fec-consts.js +0 -3
  401. package/dist/interfaces/fec-consts.js.map +0 -1
  402. package/dist/interfaces/handleable-error-options.d.ts +0 -7
  403. package/dist/interfaces/handleable-error-options.d.ts.map +0 -1
  404. package/dist/interfaces/handleable-error-options.js +0 -3
  405. package/dist/interfaces/handleable-error-options.js.map +0 -1
  406. package/dist/interfaces/index.d.ts.map +0 -1
  407. package/dist/interfaces/index.js +0 -46
  408. package/dist/interfaces/index.js.map +0 -1
  409. package/dist/interfaces/jwt-consts.d.ts +0 -11
  410. package/dist/interfaces/jwt-consts.d.ts.map +0 -1
  411. package/dist/interfaces/jwt-consts.js +0 -3
  412. package/dist/interfaces/jwt-consts.js.map +0 -1
  413. package/dist/interfaces/jwt-sign-response.d.ts +0 -11
  414. package/dist/interfaces/jwt-sign-response.d.ts.map +0 -1
  415. package/dist/interfaces/jwt-sign-response.js +0 -3
  416. package/dist/interfaces/jwt-sign-response.js.map +0 -1
  417. package/dist/interfaces/mongo-errors.d.ts +0 -5
  418. package/dist/interfaces/mongo-errors.d.ts.map +0 -1
  419. package/dist/interfaces/mongo-errors.js +0 -3
  420. package/dist/interfaces/mongo-errors.js.map +0 -1
  421. package/dist/interfaces/request-user.d.ts +0 -42
  422. package/dist/interfaces/request-user.d.ts.map +0 -1
  423. package/dist/interfaces/request-user.js +0 -3
  424. package/dist/interfaces/request-user.js.map +0 -1
  425. package/dist/interfaces/required-string-keys.d.ts +0 -22
  426. package/dist/interfaces/required-string-keys.d.ts.map +0 -1
  427. package/dist/interfaces/required-string-keys.js +0 -3
  428. package/dist/interfaces/required-string-keys.js.map +0 -1
  429. package/dist/interfaces/schema.d.ts +0 -29
  430. package/dist/interfaces/schema.d.ts.map +0 -1
  431. package/dist/interfaces/schema.js +0 -3
  432. package/dist/interfaces/schema.js.map +0 -1
  433. package/dist/interfaces/server-init-result.d.ts +0 -35
  434. package/dist/interfaces/server-init-result.d.ts.map +0 -1
  435. package/dist/interfaces/server-init-result.js +0 -3
  436. package/dist/interfaces/server-init-result.js.map +0 -1
  437. package/dist/interfaces/status-code-response.d.ts +0 -7
  438. package/dist/interfaces/status-code-response.d.ts.map +0 -1
  439. package/dist/interfaces/status-code-response.js +0 -3
  440. package/dist/interfaces/status-code-response.js.map +0 -1
  441. package/dist/interfaces/symmetric-encryption-results.d.ts +0 -5
  442. package/dist/interfaces/symmetric-encryption-results.d.ts.map +0 -1
  443. package/dist/interfaces/symmetric-encryption-results.js.map +0 -1
  444. package/dist/interfaces/token-response.d.ts.map +0 -1
  445. package/dist/interfaces/token-response.js +0 -3
  446. package/dist/interfaces/token-response.js.map +0 -1
  447. package/dist/middlewares/authenticate-crypto.d.ts +0 -13
  448. package/dist/middlewares/authenticate-crypto.d.ts.map +0 -1
  449. package/dist/middlewares/authenticate-crypto.js +0 -146
  450. package/dist/middlewares/authenticate-crypto.js.map +0 -1
  451. package/dist/middlewares/authenticate-token.d.ts +0 -24
  452. package/dist/middlewares/authenticate-token.d.ts.map +0 -1
  453. package/dist/middlewares/authenticate-token.js +0 -102
  454. package/dist/middlewares/authenticate-token.js.map +0 -1
  455. package/dist/middlewares/cleanup-crypto.d.ts +0 -7
  456. package/dist/middlewares/cleanup-crypto.d.ts.map +0 -1
  457. package/dist/middlewares/cleanup-crypto.js +0 -32
  458. package/dist/middlewares/cleanup-crypto.js.map +0 -1
  459. package/dist/middlewares/index.d.ts.map +0 -1
  460. package/dist/middlewares/index.js +0 -21
  461. package/dist/middlewares/index.js.map +0 -1
  462. package/dist/middlewares/set-global-context-language.d.ts +0 -3
  463. package/dist/middlewares/set-global-context-language.d.ts.map +0 -1
  464. package/dist/middlewares/set-global-context-language.js +0 -14
  465. package/dist/middlewares/set-global-context-language.js.map +0 -1
  466. package/dist/middlewares.d.ts +0 -18
  467. package/dist/middlewares.d.ts.map +0 -1
  468. package/dist/middlewares.js +0 -76
  469. package/dist/middlewares.js.map +0 -1
  470. package/dist/model-registry.d.ts +0 -23
  471. package/dist/model-registry.d.ts.map +0 -1
  472. package/dist/model-registry.js +0 -47
  473. package/dist/model-registry.js.map +0 -1
  474. package/dist/models/email-token.d.ts +0 -11
  475. package/dist/models/email-token.d.ts.map +0 -1
  476. package/dist/models/email-token.js +0 -11
  477. package/dist/models/email-token.js.map +0 -1
  478. package/dist/models/index.d.ts.map +0 -1
  479. package/dist/models/index.js +0 -23
  480. package/dist/models/index.js.map +0 -1
  481. package/dist/models/mnemonic.d.ts +0 -11
  482. package/dist/models/mnemonic.d.ts.map +0 -1
  483. package/dist/models/mnemonic.js +0 -11
  484. package/dist/models/mnemonic.js.map +0 -1
  485. package/dist/models/role.d.ts +0 -11
  486. package/dist/models/role.d.ts.map +0 -1
  487. package/dist/models/role.js +0 -11
  488. package/dist/models/role.js.map +0 -1
  489. package/dist/models/used-direct-login-token.d.ts +0 -11
  490. package/dist/models/used-direct-login-token.d.ts.map +0 -1
  491. package/dist/models/used-direct-login-token.js +0 -11
  492. package/dist/models/used-direct-login-token.js.map +0 -1
  493. package/dist/models/user-role.d.ts +0 -6
  494. package/dist/models/user-role.d.ts.map +0 -1
  495. package/dist/models/user-role.js +0 -10
  496. package/dist/models/user-role.js.map +0 -1
  497. package/dist/models/user.d.ts +0 -7
  498. package/dist/models/user.d.ts.map +0 -1
  499. package/dist/models/user.js +0 -11
  500. package/dist/models/user.js.map +0 -1
  501. package/dist/registry/email-service-registry.d.ts +0 -9
  502. package/dist/registry/email-service-registry.d.ts.map +0 -1
  503. package/dist/registry/email-service-registry.js +0 -17
  504. package/dist/registry/email-service-registry.js.map +0 -1
  505. package/dist/registry/index.d.ts.map +0 -1
  506. package/dist/registry/index.js +0 -6
  507. package/dist/registry/index.js.map +0 -1
  508. package/dist/routers/api.d.ts +0 -27
  509. package/dist/routers/api.d.ts.map +0 -1
  510. package/dist/routers/api.js +0 -44
  511. package/dist/routers/api.js.map +0 -1
  512. package/dist/routers/app.d.ts +0 -28
  513. package/dist/routers/app.d.ts.map +0 -1
  514. package/dist/routers/app.js +0 -182
  515. package/dist/routers/app.js.map +0 -1
  516. package/dist/routers/base.d.ts +0 -12
  517. package/dist/routers/base.d.ts.map +0 -1
  518. package/dist/routers/base.js +0 -12
  519. package/dist/routers/base.js.map +0 -1
  520. package/dist/routers/index.d.ts.map +0 -1
  521. package/dist/routers/index.js +0 -20
  522. package/dist/routers/index.js.map +0 -1
  523. package/dist/schemas/email-token.d.ts +0 -38
  524. package/dist/schemas/email-token.d.ts.map +0 -1
  525. package/dist/schemas/email-token.js +0 -56
  526. package/dist/schemas/email-token.js.map +0 -1
  527. package/dist/schemas/index.d.ts.map +0 -1
  528. package/dist/schemas/index.js +0 -24
  529. package/dist/schemas/index.js.map +0 -1
  530. package/dist/schemas/mnemonic.d.ts +0 -20
  531. package/dist/schemas/mnemonic.d.ts.map +0 -1
  532. package/dist/schemas/mnemonic.js +0 -30
  533. package/dist/schemas/mnemonic.js.map +0 -1
  534. package/dist/schemas/role.d.ts +0 -32
  535. package/dist/schemas/role.d.ts.map +0 -1
  536. package/dist/schemas/role.js +0 -86
  537. package/dist/schemas/role.js.map +0 -1
  538. package/dist/schemas/schema.d.ts +0 -40
  539. package/dist/schemas/schema.d.ts.map +0 -1
  540. package/dist/schemas/schema.js +0 -64
  541. package/dist/schemas/schema.js.map +0 -1
  542. package/dist/schemas/used-direct-login-token.d.ts +0 -27
  543. package/dist/schemas/used-direct-login-token.d.ts.map +0 -1
  544. package/dist/schemas/used-direct-login-token.js +0 -23
  545. package/dist/schemas/used-direct-login-token.js.map +0 -1
  546. package/dist/schemas/user-role.d.ts +0 -29
  547. package/dist/schemas/user-role.d.ts.map +0 -1
  548. package/dist/schemas/user-role.js +0 -54
  549. package/dist/schemas/user-role.js.map +0 -1
  550. package/dist/schemas/user.d.ts +0 -21
  551. package/dist/schemas/user.d.ts.map +0 -1
  552. package/dist/schemas/user.js +0 -178
  553. package/dist/schemas/user.js.map +0 -1
  554. package/dist/services/backup-code.d.ts +0 -78
  555. package/dist/services/backup-code.d.ts.map +0 -1
  556. package/dist/services/backup-code.js +0 -180
  557. package/dist/services/backup-code.js.map +0 -1
  558. package/dist/services/base.d.ts +0 -13
  559. package/dist/services/base.d.ts.map +0 -1
  560. package/dist/services/base.js +0 -14
  561. package/dist/services/base.js.map +0 -1
  562. package/dist/services/checksum.d.ts +0 -67
  563. package/dist/services/checksum.d.ts.map +0 -1
  564. package/dist/services/checksum.js +0 -175
  565. package/dist/services/checksum.js.map +0 -1
  566. package/dist/services/crc.d.ts +0 -87
  567. package/dist/services/crc.d.ts.map +0 -1
  568. package/dist/services/crc.js +0 -198
  569. package/dist/services/crc.js.map +0 -1
  570. package/dist/services/database-initialization.d.ts +0 -105
  571. package/dist/services/database-initialization.d.ts.map +0 -1
  572. package/dist/services/database-initialization.js +0 -779
  573. package/dist/services/database-initialization.js.map +0 -1
  574. package/dist/services/direct-login-token.d.ts +0 -9
  575. package/dist/services/direct-login-token.d.ts.map +0 -1
  576. package/dist/services/direct-login-token.js +0 -41
  577. package/dist/services/direct-login-token.js.map +0 -1
  578. package/dist/services/fec-usage-example.d.ts +0 -38
  579. package/dist/services/fec-usage-example.d.ts.map +0 -1
  580. package/dist/services/fec-usage-example.js +0 -77
  581. package/dist/services/fec-usage-example.js.map +0 -1
  582. package/dist/services/fec.d.ts +0 -46
  583. package/dist/services/fec.d.ts.map +0 -1
  584. package/dist/services/fec.js +0 -192
  585. package/dist/services/fec.js.map +0 -1
  586. package/dist/services/index.d.ts.map +0 -1
  587. package/dist/services/index.js +0 -35
  588. package/dist/services/index.js.map +0 -1
  589. package/dist/services/jwt.d.ts +0 -33
  590. package/dist/services/jwt.d.ts.map +0 -1
  591. package/dist/services/jwt.js +0 -90
  592. package/dist/services/jwt.js.map +0 -1
  593. package/dist/services/key-wrapping.d.ts +0 -60
  594. package/dist/services/key-wrapping.d.ts.map +0 -1
  595. package/dist/services/key-wrapping.js +0 -311
  596. package/dist/services/key-wrapping.js.map +0 -1
  597. package/dist/services/mnemonic.d.ts +0 -61
  598. package/dist/services/mnemonic.d.ts.map +0 -1
  599. package/dist/services/mnemonic.js +0 -112
  600. package/dist/services/mnemonic.js.map +0 -1
  601. package/dist/services/request-user.d.ts +0 -20
  602. package/dist/services/request-user.d.ts.map +0 -1
  603. package/dist/services/request-user.js +0 -50
  604. package/dist/services/request-user.js.map +0 -1
  605. package/dist/services/role.d.ts +0 -88
  606. package/dist/services/role.d.ts.map +0 -1
  607. package/dist/services/role.js +0 -263
  608. package/dist/services/role.js.map +0 -1
  609. package/dist/services/symmetric.d.ts +0 -42
  610. package/dist/services/symmetric.d.ts.map +0 -1
  611. package/dist/services/symmetric.js +0 -101
  612. package/dist/services/symmetric.js.map +0 -1
  613. package/dist/services/system-user.d.ts +0 -17
  614. package/dist/services/system-user.d.ts.map +0 -1
  615. package/dist/services/system-user.js +0 -46
  616. package/dist/services/system-user.js.map +0 -1
  617. package/dist/services/user.d.ts +0 -320
  618. package/dist/services/user.d.ts.map +0 -1
  619. package/dist/services/user.js +0 -1373
  620. package/dist/services/user.js.map +0 -1
  621. package/dist/services/xor.d.ts +0 -24
  622. package/dist/services/xor.d.ts.map +0 -1
  623. package/dist/services/xor.js +0 -37
  624. package/dist/services/xor.js.map +0 -1
  625. package/dist/types.d.ts +0 -70
  626. package/dist/types.d.ts.map +0 -1
  627. package/dist/types.js +0 -14
  628. package/dist/types.js.map +0 -1
  629. package/dist/utils.d.ts +0 -202
  630. package/dist/utils.d.ts.map +0 -1
  631. package/dist/utils.js +0 -786
  632. package/dist/utils.js.map +0 -1
  633. /package/{dist → src}/interfaces/symmetric-encryption-results.js +0 -0
@@ -0,0 +1,16 @@
1
+ import { SecureString } from '@digitaldefiance/ecies-lib';
2
+ import { Member as BackendMember } from '@digitaldefiance/node-ecies-lib';
3
+
4
+ declare global {
5
+ var __MEMBER_CACHE__:
6
+ | Map<
7
+ string,
8
+ {
9
+ member: BackendMember;
10
+ mnemonic: SecureString;
11
+ }
12
+ >
13
+ | undefined;
14
+ }
15
+
16
+ export {};
@@ -0,0 +1,62 @@
1
+ import {
2
+ DirectTokenUsedError,
3
+ FailedToUseDirectTokenError,
4
+ IUsedDirectLoginTokenBase,
5
+ } from '@digitaldefiance/suite-core-lib';
6
+ import { ClientSession, Types } from 'mongoose';
7
+ import { IUsedDirectLoginTokenDocument } from '../documents/used-direct-login-token';
8
+ import { BaseModelName } from '../enumerations/base-model-name';
9
+ import { IApplication } from '../interfaces/application';
10
+ import { ModelRegistry } from '../model-registry';
11
+ import { withTransaction } from '../utils';
12
+ import { IBaseDocument } from '../documents';
13
+ import { Environment } from '../environment';
14
+ import { IConstants } from '../interfaces';
15
+ export abstract class DirectLoginTokenService {
16
+ public static async useToken(
17
+ app: IApplication<any, Types.ObjectId, IBaseDocument<any, Types.ObjectId>, Environment, IConstants>,
18
+ userId: Types.ObjectId,
19
+ token: string,
20
+ session?: ClientSession,
21
+ ): Promise<void> {
22
+ return withTransaction(
23
+ app.db.connection,
24
+ app.environment.mongo.useTransactions,
25
+ session,
26
+ async (sess) => {
27
+ const UsedDirectLoginTokenModel = ModelRegistry.instance.get<
28
+ IUsedDirectLoginTokenBase<Types.ObjectId>,
29
+ IUsedDirectLoginTokenDocument
30
+ >(BaseModelName.UsedDirectLoginToken).model;
31
+ const tokenExists = await UsedDirectLoginTokenModel.exists({
32
+ userId,
33
+ token,
34
+ }).session(sess ?? null);
35
+ if (tokenExists) {
36
+ throw new DirectTokenUsedError();
37
+ }
38
+ try {
39
+ const newTokens = await UsedDirectLoginTokenModel.create(
40
+ [{ userId, token }],
41
+ {
42
+ session: sess,
43
+ },
44
+ );
45
+ if (newTokens.length !== 1) {
46
+ throw new FailedToUseDirectTokenError();
47
+ }
48
+ } catch (err) {
49
+ // re-throw FailedToUseDirectTokenError
50
+ if (err instanceof FailedToUseDirectTokenError) {
51
+ throw err;
52
+ }
53
+ // throw FailedToUseDirectTokenError on duplicate key error or other errors
54
+ throw new FailedToUseDirectTokenError();
55
+ }
56
+ },
57
+ {
58
+ timeoutMs: app.environment.mongo.transactionTimeout,
59
+ },
60
+ );
61
+ }
62
+ }
@@ -0,0 +1,102 @@
1
+ import { FecService } from './fec';
2
+
3
+ /**
4
+ * Example usage of the adapted FEC service for filesystem/S3 objects
5
+ */
6
+ export class FecUsageExample {
7
+ private fecService = new FecService();
8
+
9
+ /**
10
+ * Example: Create parity data for a file and store it separately
11
+ */
12
+ async createFileWithParity(fileData: Buffer, parityCount: number = 2) {
13
+ // Create parity data
14
+ const parityData = await this.fecService.createParityData(
15
+ fileData,
16
+ parityCount,
17
+ );
18
+
19
+ // In a real implementation, you would:
20
+ // 1. Store the original file (e.g., to S3 as "file.dat")
21
+ // 2. Store each parity data separately (e.g., "file.dat.parity.0", "file.dat.parity.1")
22
+ // 3. Store metadata about the original file size
23
+
24
+ return {
25
+ originalData: fileData,
26
+ parityData,
27
+ originalSize: fileData.length,
28
+ };
29
+ }
30
+
31
+ /**
32
+ * Example: Recover a corrupted file using parity data
33
+ */
34
+ async recoverCorruptedFile(
35
+ parityData: Array<{ data: Buffer; index: number }>,
36
+ originalSize: number,
37
+ ) {
38
+ // Attempt recovery (pass null for corrupted data)
39
+ const result = await this.fecService.recoverFileData(
40
+ null, // corrupted data
41
+ parityData,
42
+ originalSize,
43
+ );
44
+
45
+ if (result.recovered) {
46
+ console.log('File successfully recovered!');
47
+ return result.data;
48
+ } else {
49
+ throw new Error('File recovery failed');
50
+ }
51
+ }
52
+
53
+ /**
54
+ * Example: Verify file integrity using parity data
55
+ */
56
+ async verifyFile(
57
+ fileData: Buffer,
58
+ parityData: Array<{ data: Buffer; index: number }>,
59
+ ): Promise<boolean> {
60
+ return await this.fecService.verifyFileIntegrity(fileData, parityData);
61
+ }
62
+
63
+ /**
64
+ * Complete example workflow
65
+ */
66
+ async demonstrateWorkflow() {
67
+ // Original file data
68
+ const originalFile = Buffer.from(
69
+ 'This is important file data that needs protection!',
70
+ );
71
+
72
+ // Step 1: Create parity data
73
+ console.log('Creating parity data...');
74
+ const { parityData, originalSize } = await this.createFileWithParity(
75
+ originalFile,
76
+ 2,
77
+ );
78
+
79
+ // Step 2: Verify integrity
80
+ console.log('Verifying file integrity...');
81
+ const isValid = await this.verifyFile(originalFile, parityData);
82
+ console.log('File integrity check:', isValid ? 'PASSED' : 'FAILED');
83
+
84
+ // Step 3: Simulate file corruption and recovery
85
+ console.log('Simulating file corruption and recovery...');
86
+ const recoveredFile = await this.recoverCorruptedFile(
87
+ parityData,
88
+ originalSize,
89
+ );
90
+
91
+ // Step 4: Verify recovery
92
+ const recoverySuccessful = originalFile.equals(recoveredFile);
93
+ console.log('Recovery successful:', recoverySuccessful ? 'YES' : 'NO');
94
+
95
+ return {
96
+ originalFile,
97
+ recoveredFile,
98
+ parityData,
99
+ recoverySuccessful,
100
+ };
101
+ }
102
+ }
@@ -0,0 +1,296 @@
1
+ import { FecError, FecErrorType } from '@digitaldefiance/suite-core-lib';
2
+ import { ReedSolomonErasure } from '@subspace/reed-solomon-erasure.wasm';
3
+ import { FEC } from '../constants';
4
+ import { IFECConsts } from '../interfaces';
5
+
6
+ /**
7
+ * FecService provides Forward Error Correction (FEC) functionality for filesystem/S3 objects.
8
+ * This service is used to:
9
+ * 1. Create parity data for file recovery
10
+ * 2. Recover corrupted files using parity data
11
+ * 3. Ensure data integrity across distributed storage
12
+ *
13
+ * This implementation uses Reed-Solomon erasure coding to:
14
+ * 1. Split file data into shards
15
+ * 2. Create parity shards
16
+ * 3. Recover lost shards using parity
17
+ */
18
+
19
+ export interface ParityData {
20
+ data: Buffer;
21
+ index: number;
22
+ }
23
+
24
+ export interface RecoveryResult {
25
+ data: Buffer;
26
+ recovered: boolean;
27
+ }
28
+ export class FecService {
29
+ /**
30
+ * Given a data buffer, encode it using Reed-Solomon erasure coding.
31
+ * This will produce a buffer of size (shardSize * (dataShards + parityShards)) or (shardSize * parityShards) if fecOnly is true.
32
+ */
33
+ public async encode(
34
+ data: Buffer,
35
+ shardSize: number,
36
+ dataShards: number,
37
+ parityShards: number,
38
+ fecOnly: boolean,
39
+ fecConstants: IFECConsts = FEC,
40
+ ): Promise<Buffer> {
41
+ // Validate parameters
42
+ if (!data || data.length === 0) {
43
+ throw new FecError(FecErrorType.DataRequired);
44
+ }
45
+
46
+ if (data.length !== shardSize * dataShards) {
47
+ throw new FecError(FecErrorType.InvalidDataLength, undefined, {
48
+ LENGTH: data.length.toString(),
49
+ EXPECTED: (shardSize * dataShards).toString(),
50
+ });
51
+ }
52
+
53
+ if (shardSize > FEC.MAX_SHARD_SIZE) {
54
+ throw new FecError(FecErrorType.ShardSizeExceedsMaximum, undefined, {
55
+ SIZE: shardSize.toString(),
56
+ MAXIMUM: FEC.MAX_SHARD_SIZE.toString(),
57
+ });
58
+ }
59
+
60
+ if (dataShards <= 0 || parityShards <= 0) {
61
+ throw new FecError(FecErrorType.InvalidShardCounts);
62
+ }
63
+
64
+ try {
65
+ const shards = new Uint8Array(shardSize * (dataShards + parityShards));
66
+ shards.set(data);
67
+
68
+ // Encoding
69
+ const reedSolomonErasure =
70
+ await ReedSolomonErasure.fromCurrentDirectory();
71
+ reedSolomonErasure.encode(shards, dataShards, parityShards);
72
+
73
+ return fecOnly
74
+ ? Buffer.from(shards.subarray(shardSize * dataShards))
75
+ : Buffer.from(shards);
76
+ } catch (error) {
77
+ throw new FecError(FecErrorType.FecEncodingFailed, undefined, {
78
+ ERROR: error instanceof Error ? error.message : 'Unknown error',
79
+ });
80
+ }
81
+ }
82
+
83
+ /**
84
+ * Given a data buffer, reconstruct/repair it using Reed-Solomon erasure coding.
85
+ * This will produce a buffer of size (shardSize * dataShards).
86
+ */
87
+ public async decode(
88
+ data: Buffer,
89
+ shardSize: number,
90
+ dataShards: number,
91
+ parityShards: number,
92
+ shardsAvailable: boolean[],
93
+ ): Promise<Buffer> {
94
+ // Validate parameters
95
+ if (!data || data.length === 0) {
96
+ throw new FecError(FecErrorType.DataRequired);
97
+ }
98
+
99
+ if (data.length !== shardSize * (dataShards + parityShards)) {
100
+ throw new FecError(FecErrorType.InvalidDataLength, undefined, {
101
+ LENGTH: data.length.toString(),
102
+ EXPECTED: (shardSize * (dataShards + parityShards)).toString(),
103
+ });
104
+ }
105
+
106
+ if (
107
+ !shardsAvailable ||
108
+ shardsAvailable.length !== dataShards + parityShards
109
+ ) {
110
+ throw new FecError(FecErrorType.InvalidShardsAvailableArray);
111
+ }
112
+
113
+ const availableCount = shardsAvailable.filter((x) => x).length;
114
+ if (availableCount < dataShards) {
115
+ throw new FecError(FecErrorType.NotEnoughShardsAvailable, undefined, {
116
+ AVAILABLE: availableCount.toString(),
117
+ REQUIRED: dataShards.toString(),
118
+ });
119
+ }
120
+
121
+ try {
122
+ const reedSolomonErasure =
123
+ await ReedSolomonErasure.fromCurrentDirectory();
124
+ reedSolomonErasure.reconstruct(
125
+ data,
126
+ dataShards,
127
+ parityShards,
128
+ shardsAvailable,
129
+ );
130
+ return data.subarray(0, shardSize * dataShards);
131
+ } catch (error) {
132
+ throw new FecError(FecErrorType.FecDecodingFailed, undefined, {
133
+ ERROR: error instanceof Error ? error.message : 'Unknown error',
134
+ });
135
+ }
136
+ }
137
+
138
+ /**
139
+ * Create parity data for a file buffer.
140
+ */
141
+ public async createParityData(
142
+ fileData: Buffer,
143
+ parityCount: number,
144
+ ): Promise<ParityData[]> {
145
+ if (!fileData || fileData.length === 0) {
146
+ throw new FecError(FecErrorType.DataRequired);
147
+ }
148
+
149
+ if (parityCount <= 0) {
150
+ throw new FecError(FecErrorType.ParityDataCountMustBePositive);
151
+ }
152
+
153
+ const shardSize = Math.min(fileData.length, FEC.MAX_SHARD_SIZE);
154
+ const requiredShards = Math.ceil(fileData.length / shardSize);
155
+
156
+ try {
157
+ const resultParityData: Buffer[] = Array(parityCount)
158
+ .fill(null)
159
+ .map(() => Buffer.alloc(0));
160
+
161
+ // Process each chunk
162
+ for (let i = 0; i < requiredShards; i++) {
163
+ const start = i * shardSize;
164
+ const end = Math.min(start + shardSize, fileData.length);
165
+ const chunk = fileData.subarray(start, end);
166
+
167
+ // Pad chunk if necessary
168
+ const paddedChunk =
169
+ chunk.length < shardSize
170
+ ? Buffer.concat([chunk, Buffer.alloc(shardSize - chunk.length)])
171
+ : chunk;
172
+
173
+ const chunkParity = await this.encode(
174
+ paddedChunk,
175
+ shardSize,
176
+ 1,
177
+ parityCount,
178
+ true,
179
+ );
180
+
181
+ // Distribute parity data
182
+ for (let j = 0; j < parityCount; j++) {
183
+ const parityChunk = chunkParity.subarray(
184
+ j * shardSize,
185
+ (j + 1) * shardSize,
186
+ );
187
+ resultParityData[j] = Buffer.concat([
188
+ resultParityData[j],
189
+ parityChunk,
190
+ ]);
191
+ }
192
+ }
193
+
194
+ return resultParityData.map((data, index) => ({
195
+ data,
196
+ index,
197
+ }));
198
+ } catch (error) {
199
+ throw new FecError(FecErrorType.FecEncodingFailed, undefined, {
200
+ ERROR: error instanceof Error ? error.message : 'Unknown error',
201
+ });
202
+ }
203
+ }
204
+
205
+ /**
206
+ * Recover file data using parity data. Pass null for corrupted data.
207
+ */
208
+ public async recoverFileData(
209
+ corruptedData: Buffer | null,
210
+ parityData: ParityData[],
211
+ originalSize: number,
212
+ ): Promise<RecoveryResult> {
213
+ if (!parityData || parityData.length === 0) {
214
+ throw new FecError(FecErrorType.ParityDataRequired);
215
+ }
216
+
217
+ if (originalSize <= 0) {
218
+ throw new FecError(FecErrorType.InvalidDataLength);
219
+ }
220
+
221
+ try {
222
+ const shardSize = Math.min(originalSize, FEC.MAX_SHARD_SIZE);
223
+ const requiredShards = Math.ceil(originalSize / shardSize);
224
+
225
+ // Set up shard availability array (data shard unavailable, parity shards available)
226
+ const availableShards = [false, ...Array(parityData.length).fill(true)];
227
+
228
+ let recoveredData = Buffer.alloc(0);
229
+
230
+ // Recover each shard
231
+ for (let i = 0; i < requiredShards; i++) {
232
+ const start = i * shardSize;
233
+ const end = Math.min(start + shardSize, originalSize);
234
+ const chunkSize = end - start;
235
+
236
+ // Create placeholder for corrupted data shard
237
+ const corruptedShard = Buffer.alloc(shardSize);
238
+
239
+ // Combine corrupted and parity data for this shard
240
+ const shardData = Buffer.concat([
241
+ corruptedShard,
242
+ ...parityData.map((parity) =>
243
+ parity.data.subarray(i * shardSize, (i + 1) * shardSize),
244
+ ),
245
+ ]);
246
+
247
+ // Recover this shard
248
+ const recoveredShard = await this.decode(
249
+ shardData,
250
+ shardSize,
251
+ 1,
252
+ parityData.length,
253
+ availableShards,
254
+ );
255
+
256
+ // Only take the actual data length for the last shard
257
+ const actualShard =
258
+ i === requiredShards - 1
259
+ ? recoveredShard.subarray(0, chunkSize)
260
+ : recoveredShard;
261
+
262
+ recoveredData = Buffer.concat([recoveredData, actualShard]);
263
+ }
264
+
265
+ return {
266
+ data: recoveredData,
267
+ recovered: true,
268
+ };
269
+ } catch (error) {
270
+ throw new FecError(FecErrorType.FecDecodingFailed, undefined, {
271
+ ERROR: error instanceof Error ? error.message : 'Unknown error',
272
+ });
273
+ }
274
+ }
275
+
276
+ /**
277
+ * Verify file integrity using parity data.
278
+ */
279
+ public async verifyFileIntegrity(
280
+ fileData: Buffer,
281
+ parityData: ParityData[],
282
+ ): Promise<boolean> {
283
+ try {
284
+ const regeneratedParity = await this.createParityData(
285
+ fileData,
286
+ parityData.length,
287
+ );
288
+
289
+ return parityData.every((original, index) =>
290
+ original.data.equals(regeneratedParity[index].data),
291
+ );
292
+ } catch {
293
+ return false;
294
+ }
295
+ }
296
+ }
@@ -16,4 +16,3 @@ export * from './symmetric';
16
16
  export * from './system-user';
17
17
  export * from './user';
18
18
  export * from './xor';
19
- //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1,134 @@
1
+ import {
2
+ ITokenRole,
3
+ ITokenRoleDTO,
4
+ ITokenUser,
5
+ } from '@digitaldefiance/suite-core-lib';
6
+ import {
7
+ JsonWebTokenError,
8
+ JwtPayload,
9
+ TokenExpiredError as JwtTokenExpiredError,
10
+ sign,
11
+ verify,
12
+ VerifyOptions,
13
+ } from 'jsonwebtoken';
14
+ import { Types } from 'mongoose';
15
+ import { promisify } from 'util';
16
+ import { Constants as AppConstants } from '../constants';
17
+ import { IUserDocument } from '../documents/user';
18
+ import { InvalidJwtTokenError } from '../errors/invalid-jwt-token';
19
+ import { TokenExpiredError } from '../errors/token-expired';
20
+ import { IApplication } from '../interfaces/application';
21
+ import { IJwtSignResponse } from '../interfaces/jwt-sign-response';
22
+ import { BaseService } from './base';
23
+ import { RoleService } from './role';
24
+ import { IConstants } from '../interfaces';
25
+ import { Environment } from '../environment';
26
+ import { IBaseDocument } from '../documents';
27
+
28
+ const verifyAsync = promisify<
29
+ string,
30
+ string | Buffer,
31
+ VerifyOptions,
32
+ JwtPayload | string
33
+ >(verify);
34
+
35
+ export class JwtService<
36
+ I = Types.ObjectId,
37
+ D extends Date = Date,
38
+ TTokenRole extends ITokenRole<I, D> = ITokenRole<I, D>,
39
+ TTokenUser extends ITokenUser = ITokenUser,
40
+ TApplication extends IApplication<any, Types.ObjectId, IBaseDocument<any, Types.ObjectId>, Environment, IConstants> = IApplication<any, Types.ObjectId, IBaseDocument<any, Types.ObjectId>, Environment, IConstants>,
41
+ > extends BaseService {
42
+ private readonly roleService: RoleService<I, D, TTokenRole>;
43
+
44
+ /**
45
+ * Constructor for the JWT service
46
+ * @param application The application object
47
+ */
48
+ constructor(application: TApplication) {
49
+ super(application);
50
+ this.roleService = new RoleService<I, D, TTokenRole>(application);
51
+ }
52
+
53
+ /**
54
+ * Sign a JWT token for a user
55
+ * @param userDoc The user document to sign the token for
56
+ * @param jwtSecret The secret to sign the token with
57
+ * @param overrideLanguage Optional language to use for role translations
58
+ * @returns The signed token
59
+ */
60
+ public async signToken(
61
+ userDoc: IUserDocument,
62
+ jwtSecret: string,
63
+ overrideLanguage?: string,
64
+ ): Promise<IJwtSignResponse<I, D, TTokenRole>> {
65
+ // look for roles the user is a member of (the role contains the user id in the user's roles array)
66
+ const roles = await this.roleService.getUserRoles(userDoc._id);
67
+ const tokenRoles: Array<TTokenRole> = this.roleService.rolesToTokenRoles(
68
+ roles,
69
+ overrideLanguage,
70
+ );
71
+ const tokenRoleDTOs = tokenRoles.map((role) =>
72
+ RoleService.roleToRoleDTO<I, D>(role),
73
+ );
74
+ const roleTranslatedNames = tokenRoles.map((role) => role.translatedName);
75
+ const roleNames = tokenRoles.map((role) => role.name);
76
+ const tokenUser = {
77
+ userId: userDoc._id.toString(),
78
+ roles: tokenRoleDTOs,
79
+ } as TTokenUser;
80
+ // amazonq-ignore-next-line false positive
81
+ const token = sign(tokenUser, jwtSecret, {
82
+ algorithm: AppConstants.JWT.ALGORITHM,
83
+ allowInsecureKeySizes: false,
84
+ expiresIn: AppConstants.JWT.EXPIRATION_SEC,
85
+ });
86
+ return {
87
+ token,
88
+ tokenUser,
89
+ roleNames,
90
+ roleTranslatedNames,
91
+ roles: tokenRoles,
92
+ roleDTOs: tokenRoleDTOs,
93
+ };
94
+ }
95
+
96
+ /**
97
+ * Verify a JWT token and return the user data
98
+ * @param token The token to verify
99
+ * @returns The user data
100
+ * @throws InvalidTokenError
101
+ */
102
+ public async verifyToken(token: string): Promise<TTokenUser | null> {
103
+ try {
104
+ const decoded = (await verifyAsync(
105
+ token,
106
+ this.application.environment.jwtSecret,
107
+ {
108
+ algorithms: [AppConstants.JWT.ALGORITHM],
109
+ },
110
+ )) as JwtPayload;
111
+
112
+ if (
113
+ typeof decoded === 'object' &&
114
+ decoded !== null &&
115
+ 'userId' in decoded &&
116
+ 'roles' in decoded
117
+ ) {
118
+ return {
119
+ userId: decoded['userId'] as string,
120
+ roles: decoded['roles'] as ITokenRoleDTO[],
121
+ } as TTokenUser;
122
+ } else {
123
+ return null;
124
+ }
125
+ } catch (err) {
126
+ if (err instanceof JwtTokenExpiredError) {
127
+ throw new TokenExpiredError();
128
+ } else if (err instanceof JsonWebTokenError) {
129
+ throw err;
130
+ }
131
+ throw new InvalidJwtTokenError();
132
+ }
133
+ }
134
+ }