@digitaldefiance/node-express-suite 1.0.23 → 1.0.25

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 (632) hide show
  1. package/README.md +8 -0
  2. package/package.json +8 -7
  3. package/src/application-base.d.ts +112 -0
  4. package/src/application-base.d.ts.map +1 -0
  5. package/src/application-base.js +335 -0
  6. package/src/application-base.js.map +1 -0
  7. package/src/application.d.ts +20 -0
  8. package/src/application.d.ts.map +1 -0
  9. package/src/application.js +124 -0
  10. package/src/application.js.map +1 -0
  11. package/src/backup-code.d.ts +67 -0
  12. package/src/backup-code.d.ts.map +1 -0
  13. package/src/backup-code.js +238 -0
  14. package/src/backup-code.js.map +1 -0
  15. package/src/constants.d.ts +16 -0
  16. package/src/constants.d.ts.map +1 -0
  17. package/src/constants.js +54 -0
  18. package/src/constants.js.map +1 -0
  19. package/src/controllers/base.d.ts +63 -0
  20. package/src/controllers/base.d.ts.map +1 -0
  21. package/src/controllers/base.js +272 -0
  22. package/src/controllers/base.js.map +1 -0
  23. package/src/controllers/{index.ts → index.d.ts} +1 -0
  24. package/src/controllers/index.d.ts.map +1 -0
  25. package/src/controllers/index.js +6 -0
  26. package/src/controllers/index.js.map +1 -0
  27. package/src/controllers/user.d.ts +45 -0
  28. package/src/controllers/user.d.ts.map +1 -0
  29. package/src/controllers/user.js +748 -0
  30. package/src/controllers/user.js.map +1 -0
  31. package/src/decorators/base-controller.d.ts +14 -0
  32. package/src/decorators/base-controller.d.ts.map +1 -0
  33. package/src/decorators/base-controller.js +49 -0
  34. package/src/decorators/base-controller.js.map +1 -0
  35. package/src/decorators/controller.d.ts +32 -0
  36. package/src/decorators/controller.d.ts.map +1 -0
  37. package/src/decorators/controller.js +67 -0
  38. package/src/decorators/controller.js.map +1 -0
  39. package/src/decorators/{index.ts → index.d.ts} +1 -0
  40. package/src/decorators/index.d.ts.map +1 -0
  41. package/src/decorators/index.js +7 -0
  42. package/src/decorators/index.js.map +1 -0
  43. package/src/decorators/zod-validation.d.ts +5 -0
  44. package/src/decorators/zod-validation.d.ts.map +1 -0
  45. package/src/decorators/zod-validation.js +47 -0
  46. package/src/decorators/zod-validation.js.map +1 -0
  47. package/src/defaults.d.ts +7 -0
  48. package/src/defaults.d.ts.map +1 -0
  49. package/src/defaults.js +83 -0
  50. package/src/defaults.js.map +1 -0
  51. package/src/documents/base.d.ts +3 -0
  52. package/src/documents/base.d.ts.map +1 -0
  53. package/src/documents/base.js +3 -0
  54. package/src/documents/base.js.map +1 -0
  55. package/src/documents/email-token.d.ts +8 -0
  56. package/src/documents/email-token.d.ts.map +1 -0
  57. package/src/documents/email-token.js +3 -0
  58. package/src/documents/email-token.js.map +1 -0
  59. package/src/documents/{index.ts → index.d.ts} +1 -0
  60. package/src/documents/index.d.ts.map +1 -0
  61. package/src/documents/index.js +3 -0
  62. package/src/documents/index.js.map +1 -0
  63. package/src/documents/{mnemonic.ts → mnemonic.d.ts} +2 -5
  64. package/src/documents/mnemonic.d.ts.map +1 -0
  65. package/src/documents/mnemonic.js +3 -0
  66. package/src/documents/mnemonic.js.map +1 -0
  67. package/src/documents/{role.ts → role.d.ts} +2 -5
  68. package/src/documents/role.d.ts.map +1 -0
  69. package/src/documents/role.js +3 -0
  70. package/src/documents/role.js.map +1 -0
  71. package/src/documents/used-direct-login-token.d.ts +5 -0
  72. package/src/documents/used-direct-login-token.d.ts.map +1 -0
  73. package/src/documents/used-direct-login-token.js +3 -0
  74. package/src/documents/used-direct-login-token.js.map +1 -0
  75. package/src/documents/{user-role.ts → user-role.d.ts} +2 -5
  76. package/src/documents/user-role.d.ts.map +1 -0
  77. package/src/documents/user-role.js +3 -0
  78. package/src/documents/user-role.js.map +1 -0
  79. package/src/documents/{user.ts → user.d.ts} +2 -4
  80. package/src/documents/user.d.ts.map +1 -0
  81. package/src/documents/user.js +3 -0
  82. package/src/documents/user.js.map +1 -0
  83. package/src/enumerations/base-model-name.d.ts +38 -0
  84. package/src/enumerations/base-model-name.d.ts.map +1 -0
  85. package/src/enumerations/base-model-name.js +34 -0
  86. package/src/enumerations/base-model-name.js.map +1 -0
  87. package/src/enumerations/{index.ts → index.d.ts} +1 -0
  88. package/src/enumerations/index.d.ts.map +1 -0
  89. package/src/enumerations/index.js +8 -0
  90. package/src/enumerations/index.js.map +1 -0
  91. package/src/enumerations/length-encoding-type.d.ts +7 -0
  92. package/src/enumerations/length-encoding-type.d.ts.map +1 -0
  93. package/src/enumerations/length-encoding-type.js +11 -0
  94. package/src/enumerations/length-encoding-type.js.map +1 -0
  95. package/src/enumerations/schema-collection.d.ts +34 -0
  96. package/src/enumerations/schema-collection.d.ts.map +1 -0
  97. package/src/enumerations/schema-collection.js +38 -0
  98. package/src/enumerations/schema-collection.js.map +1 -0
  99. package/src/enumerations/symmetric-error-type.d.ts +5 -0
  100. package/src/enumerations/symmetric-error-type.d.ts.map +1 -0
  101. package/src/enumerations/symmetric-error-type.js +9 -0
  102. package/src/enumerations/symmetric-error-type.js.map +1 -0
  103. package/src/environment.d.ts +189 -0
  104. package/src/environment.d.ts.map +1 -0
  105. package/src/environment.js +620 -0
  106. package/src/environment.js.map +1 -0
  107. package/src/errors/express-validation.d.ts +9 -0
  108. package/src/errors/express-validation.d.ts.map +1 -0
  109. package/src/errors/express-validation.js +18 -0
  110. package/src/errors/express-validation.js.map +1 -0
  111. package/src/errors/{index.ts → index.d.ts} +1 -0
  112. package/src/errors/index.d.ts.map +1 -0
  113. package/src/errors/index.js +16 -0
  114. package/src/errors/index.js.map +1 -0
  115. package/src/errors/invalid-backup-code-version.d.ts +6 -0
  116. package/src/errors/invalid-backup-code-version.d.ts.map +1 -0
  117. package/src/errors/invalid-backup-code-version.js +15 -0
  118. package/src/errors/invalid-backup-code-version.js.map +1 -0
  119. package/src/errors/invalid-jwt-token.d.ts +5 -0
  120. package/src/errors/invalid-jwt-token.d.ts.map +1 -0
  121. package/src/errors/invalid-jwt-token.js +11 -0
  122. package/src/errors/invalid-jwt-token.js.map +1 -0
  123. package/src/errors/invalid-model.d.ts +6 -0
  124. package/src/errors/invalid-model.d.ts.map +1 -0
  125. package/src/errors/invalid-model.js +14 -0
  126. package/src/errors/invalid-model.js.map +1 -0
  127. package/src/errors/invalid-new-password.d.ts +5 -0
  128. package/src/errors/invalid-new-password.d.ts.map +1 -0
  129. package/src/errors/invalid-new-password.js +14 -0
  130. package/src/errors/invalid-new-password.js.map +1 -0
  131. package/src/errors/invalid-password.d.ts +5 -0
  132. package/src/errors/invalid-password.d.ts.map +1 -0
  133. package/src/errors/invalid-password.js +14 -0
  134. package/src/errors/invalid-password.js.map +1 -0
  135. package/src/errors/missing-validated-data.d.ts +7 -0
  136. package/src/errors/missing-validated-data.d.ts.map +1 -0
  137. package/src/errors/missing-validated-data.js +36 -0
  138. package/src/errors/missing-validated-data.js.map +1 -0
  139. package/src/errors/mnemonic-or-password-required.d.ts +5 -0
  140. package/src/errors/mnemonic-or-password-required.d.ts.map +1 -0
  141. package/src/errors/mnemonic-or-password-required.js +13 -0
  142. package/src/errors/mnemonic-or-password-required.js.map +1 -0
  143. package/src/errors/model-not-registered.d.ts +5 -0
  144. package/src/errors/model-not-registered.d.ts.map +1 -0
  145. package/src/errors/model-not-registered.js +12 -0
  146. package/src/errors/model-not-registered.js.map +1 -0
  147. package/src/errors/mongoose-validation.d.ts +11 -0
  148. package/src/errors/mongoose-validation.d.ts.map +1 -0
  149. package/src/errors/mongoose-validation.js +17 -0
  150. package/src/errors/mongoose-validation.js.map +1 -0
  151. package/src/errors/symmetric.d.ts +8 -0
  152. package/src/errors/symmetric.d.ts.map +1 -0
  153. package/src/errors/symmetric.js +23 -0
  154. package/src/errors/symmetric.js.map +1 -0
  155. package/src/errors/token-expired.d.ts +5 -0
  156. package/src/errors/token-expired.d.ts.map +1 -0
  157. package/src/errors/token-expired.js +11 -0
  158. package/src/errors/token-expired.js.map +1 -0
  159. package/src/get-language.d.ts +2 -0
  160. package/src/get-language.d.ts.map +1 -0
  161. package/src/get-language.js +30 -0
  162. package/src/get-language.js.map +1 -0
  163. package/src/get-timezone.d.ts +3 -0
  164. package/src/get-timezone.d.ts.map +1 -0
  165. package/src/get-timezone.js +31 -0
  166. package/src/get-timezone.js.map +1 -0
  167. package/src/{index.ts → index.d.ts} +1 -1
  168. package/src/index.d.ts.map +1 -0
  169. package/src/index.js +28 -0
  170. package/src/index.js.map +1 -0
  171. package/src/interfaces/{api-error-response.ts → api-error-response.d.ts} +2 -2
  172. package/src/interfaces/api-error-response.d.ts.map +1 -0
  173. package/src/interfaces/api-error-response.js +3 -0
  174. package/src/interfaces/api-error-response.js.map +1 -0
  175. package/src/interfaces/api-express-validation-error-response.d.ts +7 -0
  176. package/src/interfaces/api-express-validation-error-response.d.ts.map +1 -0
  177. package/src/interfaces/api-express-validation-error-response.js +3 -0
  178. package/src/interfaces/api-express-validation-error-response.js.map +1 -0
  179. package/src/interfaces/api-message-response.d.ts +4 -0
  180. package/src/interfaces/api-message-response.d.ts.map +1 -0
  181. package/src/interfaces/api-message-response.js +3 -0
  182. package/src/interfaces/api-message-response.js.map +1 -0
  183. package/src/interfaces/{api-mongo-validation-error-response.ts → api-mongo-validation-error-response.d.ts} +2 -2
  184. package/src/interfaces/api-mongo-validation-error-response.d.ts.map +1 -0
  185. package/src/interfaces/api-mongo-validation-error-response.js +3 -0
  186. package/src/interfaces/api-mongo-validation-error-response.js.map +1 -0
  187. package/src/interfaces/api-responses/{backup-codes-response.ts → backup-codes-response.d.ts} +2 -2
  188. package/src/interfaces/api-responses/backup-codes-response.d.ts.map +1 -0
  189. package/src/interfaces/api-responses/backup-codes-response.js +3 -0
  190. package/src/interfaces/api-responses/backup-codes-response.js.map +1 -0
  191. package/src/interfaces/api-responses/{challenge-response.ts → challenge-response.d.ts} +3 -3
  192. package/src/interfaces/api-responses/challenge-response.d.ts.map +1 -0
  193. package/src/interfaces/api-responses/challenge-response.js +3 -0
  194. package/src/interfaces/api-responses/challenge-response.js.map +1 -0
  195. package/src/interfaces/api-responses/{code-count-response.ts → code-count-response.d.ts} +2 -2
  196. package/src/interfaces/api-responses/code-count-response.d.ts.map +1 -0
  197. package/src/interfaces/api-responses/code-count-response.js +3 -0
  198. package/src/interfaces/api-responses/code-count-response.js.map +1 -0
  199. package/src/interfaces/api-responses/{index.ts → index.d.ts} +1 -0
  200. package/src/interfaces/api-responses/index.d.ts.map +1 -0
  201. package/src/interfaces/api-responses/index.js +11 -0
  202. package/src/interfaces/api-responses/index.js.map +1 -0
  203. package/src/interfaces/api-responses/{login-response.ts → login-response.d.ts} +4 -4
  204. package/src/interfaces/api-responses/login-response.d.ts.map +1 -0
  205. package/src/interfaces/api-responses/login-response.js +3 -0
  206. package/src/interfaces/api-responses/login-response.js.map +1 -0
  207. package/src/interfaces/api-responses/{mnemonic-response.ts → mnemonic-response.d.ts} +2 -2
  208. package/src/interfaces/api-responses/mnemonic-response.d.ts.map +1 -0
  209. package/src/interfaces/api-responses/mnemonic-response.js +3 -0
  210. package/src/interfaces/api-responses/mnemonic-response.js.map +1 -0
  211. package/src/interfaces/api-responses/{registration-response.ts → registration-response.d.ts} +3 -3
  212. package/src/interfaces/api-responses/registration-response.d.ts.map +1 -0
  213. package/src/interfaces/api-responses/registration-response.js +3 -0
  214. package/src/interfaces/api-responses/registration-response.js.map +1 -0
  215. package/src/interfaces/api-responses/{request-user-response.ts → request-user-response.d.ts} +2 -2
  216. package/src/interfaces/api-responses/request-user-response.d.ts.map +1 -0
  217. package/src/interfaces/api-responses/request-user-response.js +3 -0
  218. package/src/interfaces/api-responses/request-user-response.js.map +1 -0
  219. package/src/interfaces/{application.ts → application.d.ts} +7 -7
  220. package/src/interfaces/application.d.ts.map +1 -0
  221. package/src/interfaces/application.js +3 -0
  222. package/src/interfaces/application.js.map +1 -0
  223. package/src/interfaces/backend-objects/email-token.d.ts +4 -0
  224. package/src/interfaces/backend-objects/email-token.d.ts.map +1 -0
  225. package/src/interfaces/backend-objects/email-token.js +3 -0
  226. package/src/interfaces/backend-objects/email-token.js.map +1 -0
  227. package/src/interfaces/backend-objects/{index.ts → index.d.ts} +1 -0
  228. package/src/interfaces/backend-objects/index.d.ts.map +1 -0
  229. package/src/interfaces/backend-objects/index.js +8 -0
  230. package/src/interfaces/backend-objects/index.js.map +1 -0
  231. package/src/interfaces/backend-objects/{request-user.ts → request-user.d.ts} +2 -7
  232. package/src/interfaces/backend-objects/request-user.d.ts.map +1 -0
  233. package/src/interfaces/backend-objects/request-user.js +3 -0
  234. package/src/interfaces/backend-objects/request-user.js.map +1 -0
  235. package/src/interfaces/backend-objects/{role.ts → role.d.ts} +1 -1
  236. package/src/interfaces/backend-objects/role.d.ts.map +1 -0
  237. package/src/interfaces/backend-objects/role.js +3 -0
  238. package/src/interfaces/backend-objects/role.js.map +1 -0
  239. package/src/interfaces/backend-objects/user.d.ts +4 -0
  240. package/src/interfaces/backend-objects/user.d.ts.map +1 -0
  241. package/src/interfaces/backend-objects/user.js +3 -0
  242. package/src/interfaces/backend-objects/user.js.map +1 -0
  243. package/src/interfaces/checksum-config.d.ts +5 -0
  244. package/src/interfaces/checksum-config.d.ts.map +1 -0
  245. package/src/interfaces/checksum-config.js +3 -0
  246. package/src/interfaces/checksum-config.js.map +1 -0
  247. package/src/interfaces/checksum-consts.d.ts +11 -0
  248. package/src/interfaces/checksum-consts.d.ts.map +1 -0
  249. package/src/interfaces/checksum-consts.js +3 -0
  250. package/src/interfaces/checksum-consts.js.map +1 -0
  251. package/src/interfaces/{constants.ts → constants.d.ts} +5 -5
  252. package/src/interfaces/constants.d.ts.map +1 -0
  253. package/src/interfaces/constants.js +3 -0
  254. package/src/interfaces/constants.js.map +1 -0
  255. package/src/interfaces/create-user-basics.d.ts +18 -0
  256. package/src/interfaces/create-user-basics.d.ts.map +1 -0
  257. package/src/interfaces/create-user-basics.js +3 -0
  258. package/src/interfaces/create-user-basics.js.map +1 -0
  259. package/src/interfaces/csp-config.d.ts +14 -0
  260. package/src/interfaces/csp-config.d.ts.map +1 -0
  261. package/src/interfaces/csp-config.js +3 -0
  262. package/src/interfaces/csp-config.js.map +1 -0
  263. package/src/interfaces/deep-partial.d.ts +4 -0
  264. package/src/interfaces/deep-partial.d.ts.map +1 -0
  265. package/src/interfaces/deep-partial.js +3 -0
  266. package/src/interfaces/deep-partial.js.map +1 -0
  267. package/src/interfaces/{discriminator-collections.ts → discriminator-collections.d.ts} +3 -3
  268. package/src/interfaces/discriminator-collections.d.ts.map +1 -0
  269. package/src/interfaces/discriminator-collections.js +3 -0
  270. package/src/interfaces/discriminator-collections.js.map +1 -0
  271. package/src/interfaces/email-service.d.ts +4 -0
  272. package/src/interfaces/email-service.d.ts.map +1 -0
  273. package/src/interfaces/email-service.js +3 -0
  274. package/src/interfaces/email-service.js.map +1 -0
  275. package/src/interfaces/environment-mongo.d.ts +76 -0
  276. package/src/interfaces/environment-mongo.d.ts.map +1 -0
  277. package/src/interfaces/environment-mongo.js +3 -0
  278. package/src/interfaces/environment-mongo.js.map +1 -0
  279. package/src/interfaces/environment.d.ts +181 -0
  280. package/src/interfaces/environment.d.ts.map +1 -0
  281. package/src/interfaces/environment.js +3 -0
  282. package/src/interfaces/environment.js.map +1 -0
  283. package/src/interfaces/failable-result.d.ts +7 -0
  284. package/src/interfaces/failable-result.d.ts.map +1 -0
  285. package/src/interfaces/failable-result.js +3 -0
  286. package/src/interfaces/failable-result.js.map +1 -0
  287. package/src/interfaces/fec-consts.d.ts +5 -0
  288. package/src/interfaces/fec-consts.d.ts.map +1 -0
  289. package/src/interfaces/fec-consts.js +3 -0
  290. package/src/interfaces/fec-consts.js.map +1 -0
  291. package/src/interfaces/handleable-error-options.d.ts +7 -0
  292. package/src/interfaces/handleable-error-options.d.ts.map +1 -0
  293. package/src/interfaces/handleable-error-options.js +3 -0
  294. package/src/interfaces/handleable-error-options.js.map +1 -0
  295. package/src/interfaces/{index.ts → index.d.ts} +1 -0
  296. package/src/interfaces/index.d.ts.map +1 -0
  297. package/src/interfaces/index.js +33 -0
  298. package/src/interfaces/index.js.map +1 -0
  299. package/src/interfaces/jwt-consts.d.ts +11 -0
  300. package/src/interfaces/jwt-consts.d.ts.map +1 -0
  301. package/src/interfaces/jwt-consts.js +3 -0
  302. package/src/interfaces/jwt-consts.js.map +1 -0
  303. package/src/interfaces/jwt-sign-response.d.ts +11 -0
  304. package/src/interfaces/jwt-sign-response.d.ts.map +1 -0
  305. package/src/interfaces/jwt-sign-response.js +3 -0
  306. package/src/interfaces/jwt-sign-response.js.map +1 -0
  307. package/src/interfaces/mongo-errors.d.ts +5 -0
  308. package/src/interfaces/mongo-errors.d.ts.map +1 -0
  309. package/src/interfaces/mongo-errors.js +3 -0
  310. package/src/interfaces/mongo-errors.js.map +1 -0
  311. package/src/interfaces/request-user.d.ts +42 -0
  312. package/src/interfaces/request-user.d.ts.map +1 -0
  313. package/src/interfaces/request-user.js +3 -0
  314. package/src/interfaces/request-user.js.map +1 -0
  315. package/src/interfaces/required-string-keys.d.ts +22 -0
  316. package/src/interfaces/required-string-keys.d.ts.map +1 -0
  317. package/src/interfaces/required-string-keys.js +3 -0
  318. package/src/interfaces/required-string-keys.js.map +1 -0
  319. package/src/interfaces/schema.d.ts +29 -0
  320. package/src/interfaces/schema.d.ts.map +1 -0
  321. package/src/interfaces/schema.js +3 -0
  322. package/src/interfaces/schema.js.map +1 -0
  323. package/src/interfaces/server-init-result.d.ts +35 -0
  324. package/src/interfaces/server-init-result.d.ts.map +1 -0
  325. package/src/interfaces/server-init-result.js +3 -0
  326. package/src/interfaces/server-init-result.js.map +1 -0
  327. package/src/interfaces/status-code-response.d.ts +7 -0
  328. package/src/interfaces/status-code-response.d.ts.map +1 -0
  329. package/src/interfaces/status-code-response.js +3 -0
  330. package/src/interfaces/status-code-response.js.map +1 -0
  331. package/src/interfaces/symmetric-encryption-results.d.ts +3 -3
  332. package/src/interfaces/symmetric-encryption-results.d.ts.map +1 -1
  333. package/src/interfaces/symmetric-encryption-results.js.map +1 -1
  334. package/src/interfaces/{token-response.ts → token-response.d.ts} +2 -2
  335. package/src/interfaces/token-response.d.ts.map +1 -0
  336. package/src/interfaces/token-response.js +3 -0
  337. package/src/interfaces/token-response.js.map +1 -0
  338. package/src/middlewares/authenticate-crypto.d.ts +13 -0
  339. package/src/middlewares/authenticate-crypto.d.ts.map +1 -0
  340. package/src/middlewares/authenticate-crypto.js +146 -0
  341. package/src/middlewares/authenticate-crypto.js.map +1 -0
  342. package/src/middlewares/authenticate-token.d.ts +24 -0
  343. package/src/middlewares/authenticate-token.d.ts.map +1 -0
  344. package/src/middlewares/authenticate-token.js +102 -0
  345. package/src/middlewares/authenticate-token.js.map +1 -0
  346. package/src/middlewares/cleanup-crypto.d.ts +7 -0
  347. package/src/middlewares/cleanup-crypto.d.ts.map +1 -0
  348. package/src/middlewares/cleanup-crypto.js +32 -0
  349. package/src/middlewares/cleanup-crypto.js.map +1 -0
  350. package/src/middlewares/{index.ts → index.d.ts} +1 -0
  351. package/src/middlewares/index.d.ts.map +1 -0
  352. package/src/middlewares/index.js +8 -0
  353. package/src/middlewares/index.js.map +1 -0
  354. package/src/middlewares/set-global-context-language.d.ts +3 -0
  355. package/src/middlewares/set-global-context-language.d.ts.map +1 -0
  356. package/src/middlewares/set-global-context-language.js +14 -0
  357. package/src/middlewares/set-global-context-language.js.map +1 -0
  358. package/src/middlewares.d.ts +18 -0
  359. package/src/middlewares.d.ts.map +1 -0
  360. package/src/middlewares.js +74 -0
  361. package/src/middlewares.js.map +1 -0
  362. package/src/model-registry.d.ts +23 -0
  363. package/src/model-registry.d.ts.map +1 -0
  364. package/src/model-registry.js +47 -0
  365. package/src/model-registry.js.map +1 -0
  366. package/src/models/email-token.d.ts +11 -0
  367. package/src/models/email-token.d.ts.map +1 -0
  368. package/src/models/email-token.js +11 -0
  369. package/src/models/email-token.js.map +1 -0
  370. package/src/models/{index.ts → index.d.ts} +1 -0
  371. package/src/models/index.d.ts.map +1 -0
  372. package/src/models/index.js +10 -0
  373. package/src/models/index.js.map +1 -0
  374. package/src/models/mnemonic.d.ts +11 -0
  375. package/src/models/mnemonic.d.ts.map +1 -0
  376. package/src/models/mnemonic.js +11 -0
  377. package/src/models/mnemonic.js.map +1 -0
  378. package/src/models/role.d.ts +11 -0
  379. package/src/models/role.d.ts.map +1 -0
  380. package/src/models/role.js +11 -0
  381. package/src/models/role.js.map +1 -0
  382. package/src/models/used-direct-login-token.d.ts +11 -0
  383. package/src/models/used-direct-login-token.d.ts.map +1 -0
  384. package/src/models/used-direct-login-token.js +11 -0
  385. package/src/models/used-direct-login-token.js.map +1 -0
  386. package/src/models/user-role.d.ts +6 -0
  387. package/src/models/user-role.d.ts.map +1 -0
  388. package/src/models/user-role.js +10 -0
  389. package/src/models/user-role.js.map +1 -0
  390. package/src/models/user.d.ts +7 -0
  391. package/src/models/user.d.ts.map +1 -0
  392. package/src/models/user.js +11 -0
  393. package/src/models/user.js.map +1 -0
  394. package/src/registry/email-service-registry.d.ts +9 -0
  395. package/src/registry/email-service-registry.d.ts.map +1 -0
  396. package/src/registry/email-service-registry.js +18 -0
  397. package/src/registry/email-service-registry.js.map +1 -0
  398. package/src/registry/{index.ts → index.d.ts} +1 -0
  399. package/src/registry/index.d.ts.map +1 -0
  400. package/src/registry/index.js +6 -0
  401. package/src/registry/index.js.map +1 -0
  402. package/src/routers/api.d.ts +27 -0
  403. package/src/routers/api.d.ts.map +1 -0
  404. package/src/routers/api.js +52 -0
  405. package/src/routers/api.js.map +1 -0
  406. package/src/routers/app.d.ts +28 -0
  407. package/src/routers/app.d.ts.map +1 -0
  408. package/src/routers/app.js +186 -0
  409. package/src/routers/app.js.map +1 -0
  410. package/src/routers/base.d.ts +12 -0
  411. package/src/routers/base.d.ts.map +1 -0
  412. package/src/routers/base.js +14 -0
  413. package/src/routers/base.js.map +1 -0
  414. package/src/routers/{index.ts → index.d.ts} +1 -0
  415. package/src/routers/index.d.ts.map +1 -0
  416. package/src/routers/index.js +7 -0
  417. package/src/routers/index.js.map +1 -0
  418. package/src/schemas/email-token.d.ts +38 -0
  419. package/src/schemas/email-token.d.ts.map +1 -0
  420. package/src/schemas/email-token.js +54 -0
  421. package/src/schemas/email-token.js.map +1 -0
  422. package/src/schemas/{index.ts → index.d.ts} +2 -1
  423. package/src/schemas/index.d.ts.map +1 -0
  424. package/src/schemas/index.js +11 -0
  425. package/src/schemas/index.js.map +1 -0
  426. package/src/schemas/mnemonic.d.ts +20 -0
  427. package/src/schemas/mnemonic.d.ts.map +1 -0
  428. package/src/schemas/mnemonic.js +30 -0
  429. package/src/schemas/mnemonic.js.map +1 -0
  430. package/src/schemas/role.d.ts +32 -0
  431. package/src/schemas/role.d.ts.map +1 -0
  432. package/src/schemas/role.js +86 -0
  433. package/src/schemas/role.js.map +1 -0
  434. package/src/schemas/schema.d.ts +40 -0
  435. package/src/schemas/schema.d.ts.map +1 -0
  436. package/src/schemas/schema.js +62 -0
  437. package/src/schemas/schema.js.map +1 -0
  438. package/src/schemas/used-direct-login-token.d.ts +27 -0
  439. package/src/schemas/used-direct-login-token.d.ts.map +1 -0
  440. package/src/schemas/used-direct-login-token.js +23 -0
  441. package/src/schemas/used-direct-login-token.js.map +1 -0
  442. package/src/schemas/user-role.d.ts +29 -0
  443. package/src/schemas/user-role.d.ts.map +1 -0
  444. package/src/schemas/user-role.js +54 -0
  445. package/src/schemas/user-role.js.map +1 -0
  446. package/src/schemas/user.d.ts +21 -0
  447. package/src/schemas/user.d.ts.map +1 -0
  448. package/src/schemas/user.js +176 -0
  449. package/src/schemas/user.js.map +1 -0
  450. package/src/services/backup-code.d.ts +78 -0
  451. package/src/services/backup-code.d.ts.map +1 -0
  452. package/src/services/backup-code.js +184 -0
  453. package/src/services/backup-code.js.map +1 -0
  454. package/src/services/base.d.ts +13 -0
  455. package/src/services/base.d.ts.map +1 -0
  456. package/src/services/base.js +15 -0
  457. package/src/services/base.js.map +1 -0
  458. package/src/services/checksum.d.ts +67 -0
  459. package/src/services/checksum.d.ts.map +1 -0
  460. package/src/services/checksum.js +143 -0
  461. package/src/services/checksum.js.map +1 -0
  462. package/src/services/crc.d.ts +87 -0
  463. package/src/services/crc.d.ts.map +1 -0
  464. package/src/services/crc.js +198 -0
  465. package/src/services/crc.js.map +1 -0
  466. package/src/services/database-initialization.d.ts +105 -0
  467. package/src/services/database-initialization.d.ts.map +1 -0
  468. package/src/services/database-initialization.js +782 -0
  469. package/src/services/database-initialization.js.map +1 -0
  470. package/src/services/db-init-cache.d.ts +7 -13
  471. package/src/services/db-init-cache.d.ts.map +1 -0
  472. package/src/services/db-init-cache.js +3 -0
  473. package/src/services/db-init-cache.js.map +1 -0
  474. package/src/services/direct-login-token.d.ts +9 -0
  475. package/src/services/direct-login-token.d.ts.map +1 -0
  476. package/src/services/direct-login-token.js +41 -0
  477. package/src/services/direct-login-token.js.map +1 -0
  478. package/src/services/fec-usage-example.d.ts +38 -0
  479. package/src/services/fec-usage-example.d.ts.map +1 -0
  480. package/src/services/fec-usage-example.js +75 -0
  481. package/src/services/fec-usage-example.js.map +1 -0
  482. package/src/services/fec.d.ts +46 -0
  483. package/src/services/fec.d.ts.map +1 -0
  484. package/src/services/fec.js +192 -0
  485. package/src/services/fec.js.map +1 -0
  486. package/src/services/{index.ts → index.d.ts} +1 -0
  487. package/src/services/index.d.ts.map +1 -0
  488. package/src/services/index.js +22 -0
  489. package/src/services/index.js.map +1 -0
  490. package/src/services/jwt.d.ts +33 -0
  491. package/src/services/jwt.d.ts.map +1 -0
  492. package/src/services/jwt.js +91 -0
  493. package/src/services/jwt.js.map +1 -0
  494. package/src/services/key-wrapping.d.ts +60 -0
  495. package/src/services/key-wrapping.d.ts.map +1 -0
  496. package/src/services/key-wrapping.js +311 -0
  497. package/src/services/key-wrapping.js.map +1 -0
  498. package/src/services/mnemonic.d.ts +61 -0
  499. package/src/services/mnemonic.d.ts.map +1 -0
  500. package/src/services/mnemonic.js +115 -0
  501. package/src/services/mnemonic.js.map +1 -0
  502. package/src/services/request-user.d.ts +20 -0
  503. package/src/services/request-user.d.ts.map +1 -0
  504. package/src/services/request-user.js +50 -0
  505. package/src/services/request-user.js.map +1 -0
  506. package/src/services/role.d.ts +88 -0
  507. package/src/services/role.d.ts.map +1 -0
  508. package/src/services/role.js +263 -0
  509. package/src/services/role.js.map +1 -0
  510. package/src/services/symmetric.d.ts +42 -0
  511. package/src/services/symmetric.d.ts.map +1 -0
  512. package/src/services/symmetric.js +101 -0
  513. package/src/services/symmetric.js.map +1 -0
  514. package/src/services/system-user.d.ts +17 -0
  515. package/src/services/system-user.d.ts.map +1 -0
  516. package/src/services/system-user.js +46 -0
  517. package/src/services/system-user.js.map +1 -0
  518. package/src/services/user.d.ts +320 -0
  519. package/src/services/user.d.ts.map +1 -0
  520. package/src/services/user.js +1378 -0
  521. package/src/services/user.js.map +1 -0
  522. package/src/services/xor.d.ts +24 -0
  523. package/src/services/xor.d.ts.map +1 -0
  524. package/src/services/xor.js +37 -0
  525. package/src/services/xor.js.map +1 -0
  526. package/src/types.d.ts +66 -40
  527. package/src/types.d.ts.map +1 -0
  528. package/src/types.js +14 -0
  529. package/src/types.js.map +1 -0
  530. package/src/utils.d.ts +202 -0
  531. package/src/utils.d.ts.map +1 -0
  532. package/src/utils.js +784 -0
  533. package/src/utils.js.map +1 -0
  534. package/LICENSE +0 -21
  535. package/src/application-base.ts +0 -492
  536. package/src/application.ts +0 -254
  537. package/src/backup-code.ts +0 -336
  538. package/src/constants.ts +0 -69
  539. package/src/controllers/base.ts +0 -440
  540. package/src/controllers/user.ts +0 -1451
  541. package/src/decorators/base-controller.ts +0 -61
  542. package/src/decorators/controller.ts +0 -109
  543. package/src/decorators/zod-validation.ts +0 -57
  544. package/src/defaults.ts +0 -94
  545. package/src/documents/base.ts +0 -7
  546. package/src/documents/email-token.ts +0 -14
  547. package/src/documents/used-direct-login-token.ts +0 -7
  548. package/src/enumerations/base-model-name.ts +0 -41
  549. package/src/enumerations/length-encoding-type.ts +0 -6
  550. package/src/enumerations/schema-collection.ts +0 -33
  551. package/src/enumerations/symmetric-error-type.ts +0 -4
  552. package/src/environment.ts +0 -770
  553. package/src/errors/express-validation.ts +0 -21
  554. package/src/errors/invalid-backup-code-version.ts +0 -14
  555. package/src/errors/invalid-jwt-token.ts +0 -10
  556. package/src/errors/invalid-model.ts +0 -11
  557. package/src/errors/invalid-new-password.ts +0 -18
  558. package/src/errors/invalid-password.ts +0 -13
  559. package/src/errors/missing-validated-data.ts +0 -36
  560. package/src/errors/mnemonic-or-password-required.ts +0 -12
  561. package/src/errors/model-not-registered.ts +0 -11
  562. package/src/errors/mongoose-validation.ts +0 -34
  563. package/src/errors/symmetric.ts +0 -41
  564. package/src/errors/token-expired.ts +0 -10
  565. package/src/get-language.ts +0 -53
  566. package/src/get-timezone.ts +0 -45
  567. package/src/interfaces/api-express-validation-error-response.ts +0 -8
  568. package/src/interfaces/api-message-response.ts +0 -3
  569. package/src/interfaces/backend-objects/email-token.ts +0 -11
  570. package/src/interfaces/backend-objects/user.ts +0 -9
  571. package/src/interfaces/checksum-config.ts +0 -4
  572. package/src/interfaces/checksum-consts.ts +0 -13
  573. package/src/interfaces/create-user-basics.ts +0 -17
  574. package/src/interfaces/csp-config.ts +0 -35
  575. package/src/interfaces/deep-partial.ts +0 -3
  576. package/src/interfaces/email-service.ts +0 -8
  577. package/src/interfaces/environment-mongo.ts +0 -76
  578. package/src/interfaces/environment.ts +0 -181
  579. package/src/interfaces/failable-result.ts +0 -6
  580. package/src/interfaces/fec-consts.ts +0 -4
  581. package/src/interfaces/handleable-error-options.ts +0 -6
  582. package/src/interfaces/jwt-consts.ts +0 -23
  583. package/src/interfaces/jwt-sign-response.ts +0 -19
  584. package/src/interfaces/mongo-errors.ts +0 -5
  585. package/src/interfaces/request-user.ts +0 -50
  586. package/src/interfaces/required-string-keys.ts +0 -26
  587. package/src/interfaces/schema.ts +0 -31
  588. package/src/interfaces/server-init-result.ts +0 -37
  589. package/src/interfaces/status-code-response.ts +0 -7
  590. package/src/interfaces/symmetric-encryption-results.ts +0 -4
  591. package/src/middlewares/authenticate-crypto.ts +0 -243
  592. package/src/middlewares/authenticate-token.ts +0 -152
  593. package/src/middlewares/cleanup-crypto.ts +0 -40
  594. package/src/middlewares/set-global-context-language.ts +0 -24
  595. package/src/middlewares.ts +0 -120
  596. package/src/model-registry.ts +0 -75
  597. package/src/models/email-token.ts +0 -19
  598. package/src/models/mnemonic.ts +0 -19
  599. package/src/models/role.ts +0 -19
  600. package/src/models/used-direct-login-token.ts +0 -23
  601. package/src/models/user-role.ts +0 -17
  602. package/src/models/user.ts +0 -19
  603. package/src/registry/email-service-registry.ts +0 -24
  604. package/src/routers/api.ts +0 -151
  605. package/src/routers/app.ts +0 -258
  606. package/src/routers/base.ts +0 -17
  607. package/src/schemas/email-token.ts +0 -91
  608. package/src/schemas/mnemonic.ts +0 -37
  609. package/src/schemas/role.ts +0 -127
  610. package/src/schemas/schema.ts +0 -140
  611. package/src/schemas/used-direct-login-token.ts +0 -38
  612. package/src/schemas/user-role.ts +0 -75
  613. package/src/schemas/user.ts +0 -202
  614. package/src/services/backup-code.ts +0 -316
  615. package/src/services/base.ts +0 -33
  616. package/src/services/checksum.ts +0 -161
  617. package/src/services/crc.ts +0 -213
  618. package/src/services/database-initialization.ts +0 -1479
  619. package/src/services/direct-login-token.ts +0 -62
  620. package/src/services/fec-usage-example.ts +0 -102
  621. package/src/services/fec.ts +0 -296
  622. package/src/services/jwt.ts +0 -134
  623. package/src/services/key-wrapping.ts +0 -434
  624. package/src/services/mnemonic.ts +0 -167
  625. package/src/services/request-user.ts +0 -62
  626. package/src/services/role.ts +0 -396
  627. package/src/services/symmetric.ts +0 -139
  628. package/src/services/system-user.ts +0 -82
  629. package/src/services/user.ts +0 -2137
  630. package/src/services/xor.ts +0 -34
  631. package/src/types.ts +0 -128
  632. package/src/utils.ts +0 -1022
@@ -1,62 +0,0 @@
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
- }
@@ -1,102 +0,0 @@
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
- }
@@ -1,296 +0,0 @@
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
- }
@@ -1,134 +0,0 @@
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
- }