@digitaldefiance/node-express-suite 3.7.3 → 3.7.5

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 (882) hide show
  1. package/LICENSE +21 -0
  2. package/package.json +4 -5
  3. package/src/__tests__/fixtures/{index.d.ts → index.ts} +0 -1
  4. package/src/__tests__/fixtures/model-mocks.mock.ts +164 -0
  5. package/src/__tests__/helpers/application.mock.ts +89 -0
  6. package/src/__tests__/helpers/{index.d.ts → index.ts} +0 -1
  7. package/src/__tests__/helpers/setup-test-env.ts +202 -0
  8. package/src/__tests__/{index.d.ts → index.ts} +0 -1
  9. package/src/application-base.ts +548 -0
  10. package/src/application-concrete.ts +62 -0
  11. package/src/application.ts +330 -0
  12. package/src/backup-code.ts +348 -0
  13. package/src/builders/application-builder.ts +147 -0
  14. package/src/builders/{index.d.ts → index.ts} +0 -1
  15. package/src/constants.ts +89 -0
  16. package/src/container/{index.d.ts → index.ts} +0 -1
  17. package/src/container/service-container.ts +85 -0
  18. package/src/container/service-definitions.ts +23 -0
  19. package/src/controllers/base.ts +512 -0
  20. package/src/controllers/{index.d.ts → index.ts} +0 -1
  21. package/src/controllers/user.ts +1734 -0
  22. package/src/database/database-initializer.ts +13 -0
  23. package/src/database/{index.d.ts → index.ts} +0 -1
  24. package/src/decorators/base-controller.ts +91 -0
  25. package/src/decorators/controller.ts +152 -0
  26. package/src/decorators/{index.d.ts → index.ts} +0 -1
  27. package/src/decorators/zod-validation.ts +64 -0
  28. package/src/defaults.ts +259 -0
  29. package/src/documents/base.ts +17 -0
  30. package/src/documents/email-token.ts +20 -0
  31. package/src/documents/{index.d.ts → index.ts} +0 -1
  32. package/src/documents/mnemonic.ts +20 -0
  33. package/src/documents/role.ts +19 -0
  34. package/src/documents/used-direct-login-token.ts +18 -0
  35. package/src/documents/user-role.ts +20 -0
  36. package/src/documents/user.ts +20 -0
  37. package/src/enumerations/base-model-name.ts +47 -0
  38. package/src/enumerations/{index.d.ts → index.ts} +0 -1
  39. package/src/enumerations/length-encoding-type.ts +16 -0
  40. package/src/enumerations/schema-collection.ts +39 -0
  41. package/src/enumerations/symmetric-error-type.ts +13 -0
  42. package/src/environment.ts +859 -0
  43. package/src/errors/express-validation.ts +38 -0
  44. package/src/errors/{index.d.ts → index.ts} +0 -1
  45. package/src/errors/invalid-backup-code-version.ts +30 -0
  46. package/src/errors/invalid-jwt-token.ts +24 -0
  47. package/src/errors/invalid-model.ts +24 -0
  48. package/src/errors/invalid-new-password.ts +33 -0
  49. package/src/errors/invalid-password.ts +28 -0
  50. package/src/errors/missing-validated-data.ts +55 -0
  51. package/src/errors/mnemonic-or-password-required.ts +26 -0
  52. package/src/errors/model-not-registered.ts +24 -0
  53. package/src/errors/mongoose-validation.ts +56 -0
  54. package/src/errors/symmetric.ts +53 -0
  55. package/src/errors/token-expired.ts +24 -0
  56. package/src/get-language.ts +64 -0
  57. package/src/get-timezone.ts +76 -0
  58. package/src/{index.d.ts → index.ts} +44 -2
  59. package/src/interfaces/api-error-response.ts +15 -0
  60. package/src/interfaces/api-express-validation-error-response.ts +17 -0
  61. package/src/interfaces/api-message-response.ts +12 -0
  62. package/src/interfaces/api-mongo-validation-error-response.ts +17 -0
  63. package/src/interfaces/api-responses/backup-codes-response.ts +15 -0
  64. package/src/interfaces/api-responses/challenge-response.ts +17 -0
  65. package/src/interfaces/api-responses/code-count-response.ts +12 -0
  66. package/src/interfaces/api-responses/{index.d.ts → index.ts} +0 -1
  67. package/src/interfaces/api-responses/login-response.ts +18 -0
  68. package/src/interfaces/api-responses/mnemonic-response.ts +15 -0
  69. package/src/interfaces/api-responses/registration-response.ts +17 -0
  70. package/src/interfaces/api-responses/request-user-response.ts +16 -0
  71. package/src/interfaces/api-responses/user-settings-response.ts +19 -0
  72. package/src/interfaces/application.ts +40 -0
  73. package/src/interfaces/backend-objects/email-token.ts +18 -0
  74. package/src/interfaces/backend-objects/{index.d.ts → index.ts} +0 -1
  75. package/src/interfaces/backend-objects/request-user.ts +19 -0
  76. package/src/interfaces/backend-objects/role.ts +18 -0
  77. package/src/interfaces/backend-objects/user.ts +18 -0
  78. package/src/interfaces/checksum-config.ts +15 -0
  79. package/src/interfaces/checksum-consts.ts +23 -0
  80. package/src/interfaces/constants.ts +114 -0
  81. package/src/interfaces/controller-config.ts +54 -0
  82. package/src/interfaces/create-user-basics.ts +24 -0
  83. package/src/interfaces/csp-config.ts +32 -0
  84. package/src/interfaces/csp-definition.ts +71 -0
  85. package/src/interfaces/db-init-result.ts +17 -0
  86. package/src/interfaces/deep-partial.ts +14 -0
  87. package/src/interfaces/discriminator-collections.ts +21 -0
  88. package/src/interfaces/email-service.ts +26 -0
  89. package/src/interfaces/environment-mongo.ts +86 -0
  90. package/src/interfaces/environment.ts +191 -0
  91. package/src/interfaces/failable-result.ts +20 -0
  92. package/src/interfaces/fec-consts.ts +14 -0
  93. package/src/interfaces/flexible-csp.ts +35 -0
  94. package/src/interfaces/handleable-error-options.ts +19 -0
  95. package/src/interfaces/{index.d.ts → index.ts} +0 -1
  96. package/src/interfaces/jwt-consts.ts +33 -0
  97. package/src/interfaces/jwt-sign-response.ts +31 -0
  98. package/src/interfaces/models/email-token.ts +13 -0
  99. package/src/interfaces/models/{index.d.ts → index.ts} +0 -1
  100. package/src/interfaces/models/mnemonic.ts +14 -0
  101. package/src/interfaces/models/role.ts +13 -0
  102. package/src/interfaces/models/token-role.ts +23 -0
  103. package/src/interfaces/models/used-direct-login-token.ts +21 -0
  104. package/src/interfaces/models/user-role.ts +23 -0
  105. package/src/interfaces/models/user.ts +30 -0
  106. package/src/interfaces/mongo-errors.ts +14 -0
  107. package/src/interfaces/request-user.ts +80 -0
  108. package/src/interfaces/required-string-keys.ts +33 -0
  109. package/src/interfaces/schema.ts +43 -0
  110. package/src/interfaces/server-init-result.ts +48 -0
  111. package/src/interfaces/status-code-response.ts +20 -0
  112. package/src/interfaces/symmetric-encryption-results.d.ts.map +1 -1
  113. package/src/interfaces/symmetric-encryption-results.js.map +1 -1
  114. package/src/interfaces/symmetric-encryption-results.ts +15 -0
  115. package/src/interfaces/test-environment.ts +23 -0
  116. package/src/interfaces/token-response.ts +16 -0
  117. package/src/middleware-utils.ts +138 -0
  118. package/src/middlewares/authenticate-crypto.ts +237 -0
  119. package/src/middlewares/authenticate-token.ts +165 -0
  120. package/src/middlewares/cleanup-crypto.ts +47 -0
  121. package/src/middlewares/{index.d.ts → index.ts} +0 -1
  122. package/src/middlewares/set-global-context-language.ts +38 -0
  123. package/src/model-registry.ts +142 -0
  124. package/src/models/email-token.ts +49 -0
  125. package/src/models/{index.d.ts → index.ts} +0 -1
  126. package/src/models/mnemonic.ts +42 -0
  127. package/src/models/role.ts +38 -0
  128. package/src/models/used-direct-login-token.ts +49 -0
  129. package/src/models/user-role.ts +40 -0
  130. package/src/models/user.ts +42 -0
  131. package/src/pipeline/{index.d.ts → index.ts} +0 -1
  132. package/src/pipeline/pipeline-builder.ts +27 -0
  133. package/src/plugins/{index.d.ts → index.ts} +0 -1
  134. package/src/plugins/plugin-interface.ts +19 -0
  135. package/src/plugins/plugin-manager.ts +53 -0
  136. package/src/registry/email-service-registry.ts +76 -0
  137. package/src/registry/{index.d.ts → index.ts} +0 -1
  138. package/src/responses/{index.d.ts → index.ts} +0 -1
  139. package/src/responses/response-builder.ts +166 -0
  140. package/src/routers/api.ts +233 -0
  141. package/src/routers/app.ts +395 -0
  142. package/src/routers/base.ts +34 -0
  143. package/src/routers/{index.d.ts → index.ts} +0 -1
  144. package/src/routers/router-config.ts +34 -0
  145. package/src/routing/index.ts +1 -0
  146. package/src/routing/route-builder.ts +214 -0
  147. package/src/schemas/email-token.ts +112 -0
  148. package/src/schemas/{index.d.ts → index.ts} +0 -1
  149. package/src/schemas/mnemonic.ts +48 -0
  150. package/src/schemas/role.ts +153 -0
  151. package/src/schemas/schema.ts +185 -0
  152. package/src/schemas/used-direct-login-token.ts +58 -0
  153. package/src/schemas/user-role.ts +93 -0
  154. package/src/schemas/user.ts +244 -0
  155. package/src/services/backup-code.ts +327 -0
  156. package/src/services/base.ts +46 -0
  157. package/src/services/checksum.ts +189 -0
  158. package/src/services/database-initialization.ts +1653 -0
  159. package/src/services/db-init-cache.ts +28 -0
  160. package/src/services/direct-login-token.ts +83 -0
  161. package/src/services/dummy-email-service.ts +43 -0
  162. package/src/services/fec-usage-example.ts +123 -0
  163. package/src/services/fec.ts +399 -0
  164. package/src/services/{index.d.ts → index.ts} +0 -2
  165. package/src/services/jwt.ts +146 -0
  166. package/src/services/key-wrapping.ts +528 -0
  167. package/src/services/mnemonic.ts +174 -0
  168. package/src/services/request-user.ts +127 -0
  169. package/src/services/role.ts +417 -0
  170. package/src/services/symmetric.ts +164 -0
  171. package/src/services/system-user.ts +87 -0
  172. package/src/services/user.ts +2324 -0
  173. package/src/services/xor.ts +39 -0
  174. package/src/testing.ts +9 -0
  175. package/src/transactions/{index.d.ts → index.ts} +0 -1
  176. package/src/transactions/transaction-manager.ts +63 -0
  177. package/src/types/app-config.ts +36 -0
  178. package/src/types/controller-config.ts +28 -0
  179. package/src/types/{environment-variables.d.ts → environment-variables.ts} +32 -5
  180. package/src/types/{index.d.ts → index.ts} +0 -1
  181. package/src/types/{mongoose-helpers.d.ts → mongoose-helpers.ts} +8 -2
  182. package/src/types/mongoose-override.d.ts +1 -0
  183. package/src/types/mongoose.d.ts +1 -0
  184. package/src/types.ts +189 -0
  185. package/src/utils.ts +1116 -0
  186. package/src/validation/{index.d.ts → index.ts} +0 -1
  187. package/src/validation/validation-builder.ts +155 -0
  188. package/src/__tests__/fixtures/index.d.ts.map +0 -1
  189. package/src/__tests__/fixtures/index.js +0 -5
  190. package/src/__tests__/fixtures/index.js.map +0 -1
  191. package/src/__tests__/fixtures/model-mocks.mock.d.ts +0 -12
  192. package/src/__tests__/fixtures/model-mocks.mock.d.ts.map +0 -1
  193. package/src/__tests__/fixtures/model-mocks.mock.js +0 -102
  194. package/src/__tests__/fixtures/model-mocks.mock.js.map +0 -1
  195. package/src/__tests__/helpers/application.mock.d.ts +0 -8
  196. package/src/__tests__/helpers/application.mock.d.ts.map +0 -1
  197. package/src/__tests__/helpers/application.mock.js +0 -77
  198. package/src/__tests__/helpers/application.mock.js.map +0 -1
  199. package/src/__tests__/helpers/index.d.ts.map +0 -1
  200. package/src/__tests__/helpers/index.js +0 -7
  201. package/src/__tests__/helpers/index.js.map +0 -1
  202. package/src/__tests__/helpers/setup-test-env.d.ts +0 -12
  203. package/src/__tests__/helpers/setup-test-env.d.ts.map +0 -1
  204. package/src/__tests__/helpers/setup-test-env.js +0 -121
  205. package/src/__tests__/helpers/setup-test-env.js.map +0 -1
  206. package/src/__tests__/index.d.ts.map +0 -1
  207. package/src/__tests__/index.js +0 -6
  208. package/src/__tests__/index.js.map +0 -1
  209. package/src/application-base.d.ts +0 -123
  210. package/src/application-base.d.ts.map +0 -1
  211. package/src/application-base.js +0 -359
  212. package/src/application-base.js.map +0 -1
  213. package/src/application-concrete.d.ts +0 -13
  214. package/src/application-concrete.d.ts.map +0 -1
  215. package/src/application-concrete.js +0 -21
  216. package/src/application-concrete.js.map +0 -1
  217. package/src/application.d.ts +0 -29
  218. package/src/application.d.ts.map +0 -1
  219. package/src/application.js +0 -167
  220. package/src/application.js.map +0 -1
  221. package/src/backup-code.d.ts +0 -67
  222. package/src/backup-code.d.ts.map +0 -1
  223. package/src/backup-code.js +0 -238
  224. package/src/backup-code.js.map +0 -1
  225. package/src/builders/application-builder.d.ts +0 -35
  226. package/src/builders/application-builder.d.ts.map +0 -1
  227. package/src/builders/application-builder.js +0 -64
  228. package/src/builders/application-builder.js.map +0 -1
  229. package/src/builders/index.d.ts.map +0 -1
  230. package/src/builders/index.js +0 -5
  231. package/src/builders/index.js.map +0 -1
  232. package/src/constants.d.ts +0 -16
  233. package/src/constants.d.ts.map +0 -1
  234. package/src/constants.js +0 -58
  235. package/src/constants.js.map +0 -1
  236. package/src/container/index.d.ts.map +0 -1
  237. package/src/container/index.js +0 -6
  238. package/src/container/index.js.map +0 -1
  239. package/src/container/service-container.d.ts +0 -11
  240. package/src/container/service-container.d.ts.map +0 -1
  241. package/src/container/service-container.js +0 -38
  242. package/src/container/service-container.js.map +0 -1
  243. package/src/container/service-definitions.d.ts +0 -11
  244. package/src/container/service-definitions.d.ts.map +0 -1
  245. package/src/container/service-definitions.js +0 -13
  246. package/src/container/service-definitions.js.map +0 -1
  247. package/src/controllers/base.d.ts +0 -67
  248. package/src/controllers/base.d.ts.map +0 -1
  249. package/src/controllers/base.js +0 -305
  250. package/src/controllers/base.js.map +0 -1
  251. package/src/controllers/index.d.ts.map +0 -1
  252. package/src/controllers/index.js +0 -6
  253. package/src/controllers/index.js.map +0 -1
  254. package/src/controllers/user.d.ts +0 -49
  255. package/src/controllers/user.d.ts.map +0 -1
  256. package/src/controllers/user.js +0 -919
  257. package/src/controllers/user.js.map +0 -1
  258. package/src/database/database-initializer.d.ts +0 -7
  259. package/src/database/database-initializer.d.ts.map +0 -1
  260. package/src/database/database-initializer.js +0 -3
  261. package/src/database/database-initializer.js.map +0 -1
  262. package/src/database/index.d.ts.map +0 -1
  263. package/src/database/index.js +0 -5
  264. package/src/database/index.js.map +0 -1
  265. package/src/decorators/base-controller.d.ts +0 -11
  266. package/src/decorators/base-controller.d.ts.map +0 -1
  267. package/src/decorators/base-controller.js +0 -60
  268. package/src/decorators/base-controller.js.map +0 -1
  269. package/src/decorators/controller.d.ts +0 -38
  270. package/src/decorators/controller.d.ts.map +0 -1
  271. package/src/decorators/controller.js +0 -68
  272. package/src/decorators/controller.js.map +0 -1
  273. package/src/decorators/index.d.ts.map +0 -1
  274. package/src/decorators/index.js +0 -7
  275. package/src/decorators/index.js.map +0 -1
  276. package/src/decorators/zod-validation.d.ts +0 -5
  277. package/src/decorators/zod-validation.d.ts.map +0 -1
  278. package/src/decorators/zod-validation.js +0 -48
  279. package/src/decorators/zod-validation.js.map +0 -1
  280. package/src/defaults.d.ts +0 -7
  281. package/src/defaults.d.ts.map +0 -1
  282. package/src/defaults.js +0 -205
  283. package/src/defaults.js.map +0 -1
  284. package/src/documents/base.d.ts +0 -4
  285. package/src/documents/base.d.ts.map +0 -1
  286. package/src/documents/base.js +0 -3
  287. package/src/documents/base.js.map +0 -1
  288. package/src/documents/email-token.d.ts +0 -8
  289. package/src/documents/email-token.d.ts.map +0 -1
  290. package/src/documents/email-token.js +0 -3
  291. package/src/documents/email-token.js.map +0 -1
  292. package/src/documents/index.d.ts.map +0 -1
  293. package/src/documents/index.js +0 -3
  294. package/src/documents/index.js.map +0 -1
  295. package/src/documents/mnemonic.d.ts +0 -8
  296. package/src/documents/mnemonic.d.ts.map +0 -1
  297. package/src/documents/mnemonic.js +0 -3
  298. package/src/documents/mnemonic.js.map +0 -1
  299. package/src/documents/role.d.ts +0 -8
  300. package/src/documents/role.d.ts.map +0 -1
  301. package/src/documents/role.js +0 -3
  302. package/src/documents/role.js.map +0 -1
  303. package/src/documents/used-direct-login-token.d.ts +0 -5
  304. package/src/documents/used-direct-login-token.d.ts.map +0 -1
  305. package/src/documents/used-direct-login-token.js +0 -3
  306. package/src/documents/used-direct-login-token.js.map +0 -1
  307. package/src/documents/user-role.d.ts +0 -8
  308. package/src/documents/user-role.d.ts.map +0 -1
  309. package/src/documents/user-role.js +0 -3
  310. package/src/documents/user-role.js.map +0 -1
  311. package/src/documents/user.d.ts +0 -8
  312. package/src/documents/user.d.ts.map +0 -1
  313. package/src/documents/user.js +0 -3
  314. package/src/documents/user.js.map +0 -1
  315. package/src/enumerations/base-model-name.d.ts +0 -38
  316. package/src/enumerations/base-model-name.d.ts.map +0 -1
  317. package/src/enumerations/base-model-name.js +0 -34
  318. package/src/enumerations/base-model-name.js.map +0 -1
  319. package/src/enumerations/index.d.ts.map +0 -1
  320. package/src/enumerations/index.js +0 -8
  321. package/src/enumerations/index.js.map +0 -1
  322. package/src/enumerations/length-encoding-type.d.ts +0 -7
  323. package/src/enumerations/length-encoding-type.d.ts.map +0 -1
  324. package/src/enumerations/length-encoding-type.js +0 -11
  325. package/src/enumerations/length-encoding-type.js.map +0 -1
  326. package/src/enumerations/schema-collection.d.ts +0 -34
  327. package/src/enumerations/schema-collection.d.ts.map +0 -1
  328. package/src/enumerations/schema-collection.js +0 -38
  329. package/src/enumerations/schema-collection.js.map +0 -1
  330. package/src/enumerations/symmetric-error-type.d.ts +0 -5
  331. package/src/enumerations/symmetric-error-type.d.ts.map +0 -1
  332. package/src/enumerations/symmetric-error-type.js +0 -9
  333. package/src/enumerations/symmetric-error-type.js.map +0 -1
  334. package/src/environment.d.ts +0 -189
  335. package/src/environment.d.ts.map +0 -1
  336. package/src/environment.js +0 -641
  337. package/src/environment.js.map +0 -1
  338. package/src/errors/express-validation.d.ts +0 -9
  339. package/src/errors/express-validation.d.ts.map +0 -1
  340. package/src/errors/express-validation.js +0 -18
  341. package/src/errors/express-validation.js.map +0 -1
  342. package/src/errors/index.d.ts.map +0 -1
  343. package/src/errors/index.js +0 -16
  344. package/src/errors/index.js.map +0 -1
  345. package/src/errors/invalid-backup-code-version.d.ts +0 -6
  346. package/src/errors/invalid-backup-code-version.d.ts.map +0 -1
  347. package/src/errors/invalid-backup-code-version.js +0 -16
  348. package/src/errors/invalid-backup-code-version.js.map +0 -1
  349. package/src/errors/invalid-jwt-token.d.ts +0 -5
  350. package/src/errors/invalid-jwt-token.d.ts.map +0 -1
  351. package/src/errors/invalid-jwt-token.js +0 -12
  352. package/src/errors/invalid-jwt-token.js.map +0 -1
  353. package/src/errors/invalid-model.d.ts +0 -6
  354. package/src/errors/invalid-model.d.ts.map +0 -1
  355. package/src/errors/invalid-model.js +0 -14
  356. package/src/errors/invalid-model.js.map +0 -1
  357. package/src/errors/invalid-new-password.d.ts +0 -5
  358. package/src/errors/invalid-new-password.d.ts.map +0 -1
  359. package/src/errors/invalid-new-password.js +0 -14
  360. package/src/errors/invalid-new-password.js.map +0 -1
  361. package/src/errors/invalid-password.d.ts +0 -5
  362. package/src/errors/invalid-password.d.ts.map +0 -1
  363. package/src/errors/invalid-password.js +0 -14
  364. package/src/errors/invalid-password.js.map +0 -1
  365. package/src/errors/missing-validated-data.d.ts +0 -7
  366. package/src/errors/missing-validated-data.d.ts.map +0 -1
  367. package/src/errors/missing-validated-data.js +0 -36
  368. package/src/errors/missing-validated-data.js.map +0 -1
  369. package/src/errors/mnemonic-or-password-required.d.ts +0 -5
  370. package/src/errors/mnemonic-or-password-required.d.ts.map +0 -1
  371. package/src/errors/mnemonic-or-password-required.js +0 -14
  372. package/src/errors/mnemonic-or-password-required.js.map +0 -1
  373. package/src/errors/model-not-registered.d.ts +0 -6
  374. package/src/errors/model-not-registered.d.ts.map +0 -1
  375. package/src/errors/model-not-registered.js +0 -14
  376. package/src/errors/model-not-registered.js.map +0 -1
  377. package/src/errors/mongoose-validation.d.ts +0 -12
  378. package/src/errors/mongoose-validation.d.ts.map +0 -1
  379. package/src/errors/mongoose-validation.js +0 -17
  380. package/src/errors/mongoose-validation.js.map +0 -1
  381. package/src/errors/symmetric.d.ts +0 -8
  382. package/src/errors/symmetric.d.ts.map +0 -1
  383. package/src/errors/symmetric.js +0 -22
  384. package/src/errors/symmetric.js.map +0 -1
  385. package/src/errors/token-expired.d.ts +0 -5
  386. package/src/errors/token-expired.d.ts.map +0 -1
  387. package/src/errors/token-expired.js +0 -12
  388. package/src/errors/token-expired.js.map +0 -1
  389. package/src/get-language.d.ts +0 -2
  390. package/src/get-language.d.ts.map +0 -1
  391. package/src/get-language.js +0 -30
  392. package/src/get-language.js.map +0 -1
  393. package/src/get-timezone.d.ts +0 -2
  394. package/src/get-timezone.d.ts.map +0 -1
  395. package/src/get-timezone.js +0 -39
  396. package/src/get-timezone.js.map +0 -1
  397. package/src/index.d.ts.map +0 -1
  398. package/src/index.js +0 -80
  399. package/src/index.js.map +0 -1
  400. package/src/interfaces/api-error-response.d.ts +0 -5
  401. package/src/interfaces/api-error-response.d.ts.map +0 -1
  402. package/src/interfaces/api-error-response.js +0 -3
  403. package/src/interfaces/api-error-response.js.map +0 -1
  404. package/src/interfaces/api-express-validation-error-response.d.ts +0 -7
  405. package/src/interfaces/api-express-validation-error-response.d.ts.map +0 -1
  406. package/src/interfaces/api-express-validation-error-response.js +0 -3
  407. package/src/interfaces/api-express-validation-error-response.js.map +0 -1
  408. package/src/interfaces/api-message-response.d.ts +0 -4
  409. package/src/interfaces/api-message-response.d.ts.map +0 -1
  410. package/src/interfaces/api-message-response.js +0 -3
  411. package/src/interfaces/api-message-response.js.map +0 -1
  412. package/src/interfaces/api-mongo-validation-error-response.d.ts +0 -6
  413. package/src/interfaces/api-mongo-validation-error-response.d.ts.map +0 -1
  414. package/src/interfaces/api-mongo-validation-error-response.js +0 -3
  415. package/src/interfaces/api-mongo-validation-error-response.js.map +0 -1
  416. package/src/interfaces/api-responses/backup-codes-response.d.ts +0 -5
  417. package/src/interfaces/api-responses/backup-codes-response.d.ts.map +0 -1
  418. package/src/interfaces/api-responses/backup-codes-response.js +0 -3
  419. package/src/interfaces/api-responses/backup-codes-response.js.map +0 -1
  420. package/src/interfaces/api-responses/challenge-response.d.ts +0 -6
  421. package/src/interfaces/api-responses/challenge-response.d.ts.map +0 -1
  422. package/src/interfaces/api-responses/challenge-response.js +0 -3
  423. package/src/interfaces/api-responses/challenge-response.js.map +0 -1
  424. package/src/interfaces/api-responses/code-count-response.d.ts +0 -5
  425. package/src/interfaces/api-responses/code-count-response.d.ts.map +0 -1
  426. package/src/interfaces/api-responses/code-count-response.js +0 -3
  427. package/src/interfaces/api-responses/code-count-response.js.map +0 -1
  428. package/src/interfaces/api-responses/index.d.ts.map +0 -1
  429. package/src/interfaces/api-responses/index.js +0 -12
  430. package/src/interfaces/api-responses/index.js.map +0 -1
  431. package/src/interfaces/api-responses/login-response.d.ts +0 -8
  432. package/src/interfaces/api-responses/login-response.d.ts.map +0 -1
  433. package/src/interfaces/api-responses/login-response.js +0 -3
  434. package/src/interfaces/api-responses/login-response.js.map +0 -1
  435. package/src/interfaces/api-responses/mnemonic-response.d.ts +0 -5
  436. package/src/interfaces/api-responses/mnemonic-response.d.ts.map +0 -1
  437. package/src/interfaces/api-responses/mnemonic-response.js +0 -3
  438. package/src/interfaces/api-responses/mnemonic-response.js.map +0 -1
  439. package/src/interfaces/api-responses/registration-response.d.ts +0 -6
  440. package/src/interfaces/api-responses/registration-response.d.ts.map +0 -1
  441. package/src/interfaces/api-responses/registration-response.js +0 -3
  442. package/src/interfaces/api-responses/registration-response.js.map +0 -1
  443. package/src/interfaces/api-responses/request-user-response.d.ts +0 -6
  444. package/src/interfaces/api-responses/request-user-response.d.ts.map +0 -1
  445. package/src/interfaces/api-responses/request-user-response.js +0 -3
  446. package/src/interfaces/api-responses/request-user-response.js.map +0 -1
  447. package/src/interfaces/api-responses/user-settings-response.d.ts +0 -12
  448. package/src/interfaces/api-responses/user-settings-response.d.ts.map +0 -1
  449. package/src/interfaces/api-responses/user-settings-response.js +0 -3
  450. package/src/interfaces/api-responses/user-settings-response.js.map +0 -1
  451. package/src/interfaces/application.d.ts +0 -17
  452. package/src/interfaces/application.d.ts.map +0 -1
  453. package/src/interfaces/application.js +0 -3
  454. package/src/interfaces/application.js.map +0 -1
  455. package/src/interfaces/backend-objects/email-token.d.ts +0 -4
  456. package/src/interfaces/backend-objects/email-token.d.ts.map +0 -1
  457. package/src/interfaces/backend-objects/email-token.js +0 -3
  458. package/src/interfaces/backend-objects/email-token.js.map +0 -1
  459. package/src/interfaces/backend-objects/index.d.ts.map +0 -1
  460. package/src/interfaces/backend-objects/index.js +0 -8
  461. package/src/interfaces/backend-objects/index.js.map +0 -1
  462. package/src/interfaces/backend-objects/request-user.d.ts +0 -5
  463. package/src/interfaces/backend-objects/request-user.d.ts.map +0 -1
  464. package/src/interfaces/backend-objects/request-user.js +0 -3
  465. package/src/interfaces/backend-objects/request-user.js.map +0 -1
  466. package/src/interfaces/backend-objects/role.d.ts +0 -4
  467. package/src/interfaces/backend-objects/role.d.ts.map +0 -1
  468. package/src/interfaces/backend-objects/role.js +0 -3
  469. package/src/interfaces/backend-objects/role.js.map +0 -1
  470. package/src/interfaces/backend-objects/user.d.ts +0 -4
  471. package/src/interfaces/backend-objects/user.d.ts.map +0 -1
  472. package/src/interfaces/backend-objects/user.js +0 -3
  473. package/src/interfaces/backend-objects/user.js.map +0 -1
  474. package/src/interfaces/checksum-config.d.ts +0 -5
  475. package/src/interfaces/checksum-config.d.ts.map +0 -1
  476. package/src/interfaces/checksum-config.js +0 -3
  477. package/src/interfaces/checksum-config.js.map +0 -1
  478. package/src/interfaces/checksum-consts.d.ts +0 -11
  479. package/src/interfaces/checksum-consts.d.ts.map +0 -1
  480. package/src/interfaces/checksum-consts.js +0 -3
  481. package/src/interfaces/checksum-consts.js.map +0 -1
  482. package/src/interfaces/constants.d.ts +0 -102
  483. package/src/interfaces/constants.d.ts.map +0 -1
  484. package/src/interfaces/constants.js +0 -3
  485. package/src/interfaces/constants.js.map +0 -1
  486. package/src/interfaces/controller-config.d.ts +0 -21
  487. package/src/interfaces/controller-config.d.ts.map +0 -1
  488. package/src/interfaces/controller-config.js +0 -3
  489. package/src/interfaces/controller-config.js.map +0 -1
  490. package/src/interfaces/create-user-basics.d.ts +0 -18
  491. package/src/interfaces/create-user-basics.d.ts.map +0 -1
  492. package/src/interfaces/create-user-basics.js +0 -3
  493. package/src/interfaces/create-user-basics.js.map +0 -1
  494. package/src/interfaces/csp-config.d.ts +0 -7
  495. package/src/interfaces/csp-config.d.ts.map +0 -1
  496. package/src/interfaces/csp-config.js +0 -13
  497. package/src/interfaces/csp-config.js.map +0 -1
  498. package/src/interfaces/csp-definition.d.ts +0 -13
  499. package/src/interfaces/csp-definition.d.ts.map +0 -1
  500. package/src/interfaces/csp-definition.js +0 -22
  501. package/src/interfaces/csp-definition.js.map +0 -1
  502. package/src/interfaces/db-init-result.d.ts +0 -5
  503. package/src/interfaces/db-init-result.d.ts.map +0 -1
  504. package/src/interfaces/db-init-result.js +0 -3
  505. package/src/interfaces/db-init-result.js.map +0 -1
  506. package/src/interfaces/deep-partial.d.ts +0 -4
  507. package/src/interfaces/deep-partial.d.ts.map +0 -1
  508. package/src/interfaces/deep-partial.js +0 -3
  509. package/src/interfaces/deep-partial.js.map +0 -1
  510. package/src/interfaces/discriminator-collections.d.ts +0 -7
  511. package/src/interfaces/discriminator-collections.d.ts.map +0 -1
  512. package/src/interfaces/discriminator-collections.js +0 -3
  513. package/src/interfaces/discriminator-collections.js.map +0 -1
  514. package/src/interfaces/email-service.d.ts +0 -4
  515. package/src/interfaces/email-service.d.ts.map +0 -1
  516. package/src/interfaces/email-service.js +0 -3
  517. package/src/interfaces/email-service.js.map +0 -1
  518. package/src/interfaces/environment-mongo.d.ts +0 -76
  519. package/src/interfaces/environment-mongo.d.ts.map +0 -1
  520. package/src/interfaces/environment-mongo.js +0 -3
  521. package/src/interfaces/environment-mongo.js.map +0 -1
  522. package/src/interfaces/environment.d.ts +0 -180
  523. package/src/interfaces/environment.d.ts.map +0 -1
  524. package/src/interfaces/environment.js +0 -3
  525. package/src/interfaces/environment.js.map +0 -1
  526. package/src/interfaces/failable-result.d.ts +0 -7
  527. package/src/interfaces/failable-result.d.ts.map +0 -1
  528. package/src/interfaces/failable-result.js +0 -3
  529. package/src/interfaces/failable-result.js.map +0 -1
  530. package/src/interfaces/fec-consts.d.ts +0 -5
  531. package/src/interfaces/fec-consts.d.ts.map +0 -1
  532. package/src/interfaces/fec-consts.js +0 -3
  533. package/src/interfaces/fec-consts.js.map +0 -1
  534. package/src/interfaces/flexible-csp.d.ts +0 -8
  535. package/src/interfaces/flexible-csp.d.ts.map +0 -1
  536. package/src/interfaces/flexible-csp.js +0 -14
  537. package/src/interfaces/flexible-csp.js.map +0 -1
  538. package/src/interfaces/handleable-error-options.d.ts +0 -7
  539. package/src/interfaces/handleable-error-options.d.ts.map +0 -1
  540. package/src/interfaces/handleable-error-options.js +0 -3
  541. package/src/interfaces/handleable-error-options.js.map +0 -1
  542. package/src/interfaces/index.d.ts.map +0 -1
  543. package/src/interfaces/index.js +0 -38
  544. package/src/interfaces/index.js.map +0 -1
  545. package/src/interfaces/jwt-consts.d.ts +0 -11
  546. package/src/interfaces/jwt-consts.d.ts.map +0 -1
  547. package/src/interfaces/jwt-consts.js +0 -3
  548. package/src/interfaces/jwt-consts.js.map +0 -1
  549. package/src/interfaces/jwt-sign-response.d.ts +0 -11
  550. package/src/interfaces/jwt-sign-response.d.ts.map +0 -1
  551. package/src/interfaces/jwt-sign-response.js +0 -3
  552. package/src/interfaces/jwt-sign-response.js.map +0 -1
  553. package/src/interfaces/models/email-token.d.ts +0 -6
  554. package/src/interfaces/models/email-token.d.ts.map +0 -1
  555. package/src/interfaces/models/email-token.js +0 -3
  556. package/src/interfaces/models/email-token.js.map +0 -1
  557. package/src/interfaces/models/index.d.ts.map +0 -1
  558. package/src/interfaces/models/index.js +0 -11
  559. package/src/interfaces/models/index.js.map +0 -1
  560. package/src/interfaces/models/mnemonic.d.ts +0 -6
  561. package/src/interfaces/models/mnemonic.d.ts.map +0 -1
  562. package/src/interfaces/models/mnemonic.js +0 -3
  563. package/src/interfaces/models/mnemonic.js.map +0 -1
  564. package/src/interfaces/models/role.d.ts +0 -6
  565. package/src/interfaces/models/role.d.ts.map +0 -1
  566. package/src/interfaces/models/role.js +0 -3
  567. package/src/interfaces/models/role.js.map +0 -1
  568. package/src/interfaces/models/token-role.d.ts +0 -11
  569. package/src/interfaces/models/token-role.d.ts.map +0 -1
  570. package/src/interfaces/models/token-role.js +0 -3
  571. package/src/interfaces/models/token-role.js.map +0 -1
  572. package/src/interfaces/models/used-direct-login-token.d.ts +0 -11
  573. package/src/interfaces/models/used-direct-login-token.d.ts.map +0 -1
  574. package/src/interfaces/models/used-direct-login-token.js +0 -3
  575. package/src/interfaces/models/used-direct-login-token.js.map +0 -1
  576. package/src/interfaces/models/user-role.d.ts +0 -11
  577. package/src/interfaces/models/user-role.d.ts.map +0 -1
  578. package/src/interfaces/models/user-role.js +0 -3
  579. package/src/interfaces/models/user-role.js.map +0 -1
  580. package/src/interfaces/models/user.d.ts +0 -11
  581. package/src/interfaces/models/user.d.ts.map +0 -1
  582. package/src/interfaces/models/user.js +0 -3
  583. package/src/interfaces/models/user.js.map +0 -1
  584. package/src/interfaces/mongo-errors.d.ts +0 -5
  585. package/src/interfaces/mongo-errors.d.ts.map +0 -1
  586. package/src/interfaces/mongo-errors.js +0 -3
  587. package/src/interfaces/mongo-errors.js.map +0 -1
  588. package/src/interfaces/request-user.d.ts +0 -58
  589. package/src/interfaces/request-user.d.ts.map +0 -1
  590. package/src/interfaces/request-user.js +0 -3
  591. package/src/interfaces/request-user.js.map +0 -1
  592. package/src/interfaces/required-string-keys.d.ts +0 -22
  593. package/src/interfaces/required-string-keys.d.ts.map +0 -1
  594. package/src/interfaces/required-string-keys.js +0 -3
  595. package/src/interfaces/required-string-keys.js.map +0 -1
  596. package/src/interfaces/schema.d.ts +0 -29
  597. package/src/interfaces/schema.d.ts.map +0 -1
  598. package/src/interfaces/schema.js +0 -3
  599. package/src/interfaces/schema.js.map +0 -1
  600. package/src/interfaces/server-init-result.d.ts +0 -35
  601. package/src/interfaces/server-init-result.d.ts.map +0 -1
  602. package/src/interfaces/server-init-result.js +0 -3
  603. package/src/interfaces/server-init-result.js.map +0 -1
  604. package/src/interfaces/status-code-response.d.ts +0 -7
  605. package/src/interfaces/status-code-response.d.ts.map +0 -1
  606. package/src/interfaces/status-code-response.js +0 -3
  607. package/src/interfaces/status-code-response.js.map +0 -1
  608. package/src/interfaces/symmetric-encryption-results.d.ts +0 -5
  609. package/src/interfaces/test-environment.d.ts +0 -12
  610. package/src/interfaces/test-environment.d.ts.map +0 -1
  611. package/src/interfaces/test-environment.js +0 -3
  612. package/src/interfaces/test-environment.js.map +0 -1
  613. package/src/interfaces/token-response.d.ts +0 -5
  614. package/src/interfaces/token-response.d.ts.map +0 -1
  615. package/src/interfaces/token-response.js +0 -3
  616. package/src/interfaces/token-response.js.map +0 -1
  617. package/src/middleware-utils.d.ts +0 -8
  618. package/src/middleware-utils.d.ts.map +0 -1
  619. package/src/middleware-utils.js +0 -94
  620. package/src/middleware-utils.js.map +0 -1
  621. package/src/middlewares/authenticate-crypto.d.ts +0 -10
  622. package/src/middlewares/authenticate-crypto.d.ts.map +0 -1
  623. package/src/middlewares/authenticate-crypto.js +0 -126
  624. package/src/middlewares/authenticate-crypto.js.map +0 -1
  625. package/src/middlewares/authenticate-token.d.ts +0 -21
  626. package/src/middlewares/authenticate-token.d.ts.map +0 -1
  627. package/src/middlewares/authenticate-token.js +0 -104
  628. package/src/middlewares/authenticate-token.js.map +0 -1
  629. package/src/middlewares/cleanup-crypto.d.ts +0 -7
  630. package/src/middlewares/cleanup-crypto.d.ts.map +0 -1
  631. package/src/middlewares/cleanup-crypto.js +0 -32
  632. package/src/middlewares/cleanup-crypto.js.map +0 -1
  633. package/src/middlewares/index.d.ts.map +0 -1
  634. package/src/middlewares/index.js +0 -8
  635. package/src/middlewares/index.js.map +0 -1
  636. package/src/middlewares/set-global-context-language.d.ts +0 -3
  637. package/src/middlewares/set-global-context-language.d.ts.map +0 -1
  638. package/src/middlewares/set-global-context-language.js +0 -14
  639. package/src/middlewares/set-global-context-language.js.map +0 -1
  640. package/src/model-registry.d.ts +0 -23
  641. package/src/model-registry.d.ts.map +0 -1
  642. package/src/model-registry.js +0 -47
  643. package/src/model-registry.js.map +0 -1
  644. package/src/models/email-token.d.ts +0 -8
  645. package/src/models/email-token.d.ts.map +0 -1
  646. package/src/models/email-token.js +0 -11
  647. package/src/models/email-token.js.map +0 -1
  648. package/src/models/index.d.ts.map +0 -1
  649. package/src/models/index.js +0 -10
  650. package/src/models/index.js.map +0 -1
  651. package/src/models/mnemonic.d.ts +0 -8
  652. package/src/models/mnemonic.d.ts.map +0 -1
  653. package/src/models/mnemonic.js +0 -11
  654. package/src/models/mnemonic.js.map +0 -1
  655. package/src/models/role.d.ts +0 -8
  656. package/src/models/role.d.ts.map +0 -1
  657. package/src/models/role.js +0 -11
  658. package/src/models/role.js.map +0 -1
  659. package/src/models/used-direct-login-token.d.ts +0 -8
  660. package/src/models/used-direct-login-token.d.ts.map +0 -1
  661. package/src/models/used-direct-login-token.js +0 -11
  662. package/src/models/used-direct-login-token.js.map +0 -1
  663. package/src/models/user-role.d.ts +0 -7
  664. package/src/models/user-role.d.ts.map +0 -1
  665. package/src/models/user-role.js +0 -10
  666. package/src/models/user-role.js.map +0 -1
  667. package/src/models/user.d.ts +0 -8
  668. package/src/models/user.d.ts.map +0 -1
  669. package/src/models/user.js +0 -11
  670. package/src/models/user.js.map +0 -1
  671. package/src/pipeline/index.d.ts.map +0 -1
  672. package/src/pipeline/index.js +0 -5
  673. package/src/pipeline/index.js.map +0 -1
  674. package/src/pipeline/pipeline-builder.d.ts +0 -8
  675. package/src/pipeline/pipeline-builder.d.ts.map +0 -1
  676. package/src/pipeline/pipeline-builder.js +0 -18
  677. package/src/pipeline/pipeline-builder.js.map +0 -1
  678. package/src/plugins/index.d.ts.map +0 -1
  679. package/src/plugins/index.js +0 -6
  680. package/src/plugins/index.js.map +0 -1
  681. package/src/plugins/plugin-interface.d.ts +0 -9
  682. package/src/plugins/plugin-interface.d.ts.map +0 -1
  683. package/src/plugins/plugin-interface.js +0 -3
  684. package/src/plugins/plugin-interface.js.map +0 -1
  685. package/src/plugins/plugin-manager.d.ts +0 -13
  686. package/src/plugins/plugin-manager.d.ts.map +0 -1
  687. package/src/plugins/plugin-manager.js +0 -37
  688. package/src/plugins/plugin-manager.js.map +0 -1
  689. package/src/registry/email-service-registry.d.ts +0 -27
  690. package/src/registry/email-service-registry.d.ts.map +0 -1
  691. package/src/registry/email-service-registry.js +0 -42
  692. package/src/registry/email-service-registry.js.map +0 -1
  693. package/src/registry/index.d.ts.map +0 -1
  694. package/src/registry/index.js +0 -6
  695. package/src/registry/index.js.map +0 -1
  696. package/src/responses/index.d.ts.map +0 -1
  697. package/src/responses/index.js +0 -5
  698. package/src/responses/index.js.map +0 -1
  699. package/src/responses/response-builder.d.ts +0 -24
  700. package/src/responses/response-builder.d.ts.map +0 -1
  701. package/src/responses/response-builder.js +0 -63
  702. package/src/responses/response-builder.js.map +0 -1
  703. package/src/routers/api.d.ts +0 -28
  704. package/src/routers/api.d.ts.map +0 -1
  705. package/src/routers/api.js +0 -80
  706. package/src/routers/api.js.map +0 -1
  707. package/src/routers/app.d.ts +0 -33
  708. package/src/routers/app.d.ts.map +0 -1
  709. package/src/routers/app.js +0 -228
  710. package/src/routers/app.js.map +0 -1
  711. package/src/routers/base.d.ts +0 -9
  712. package/src/routers/base.d.ts.map +0 -1
  713. package/src/routers/base.js +0 -14
  714. package/src/routers/base.js.map +0 -1
  715. package/src/routers/index.d.ts.map +0 -1
  716. package/src/routers/index.js +0 -7
  717. package/src/routers/index.js.map +0 -1
  718. package/src/routers/router-config.d.ts +0 -18
  719. package/src/routers/router-config.d.ts.map +0 -1
  720. package/src/routers/router-config.js +0 -8
  721. package/src/routers/router-config.js.map +0 -1
  722. package/src/routing/index.d.ts +0 -2
  723. package/src/routing/index.d.ts.map +0 -1
  724. package/src/routing/index.js +0 -5
  725. package/src/routing/index.js.map +0 -1
  726. package/src/routing/route-builder.d.ts +0 -36
  727. package/src/routing/route-builder.d.ts.map +0 -1
  728. package/src/routing/route-builder.js +0 -86
  729. package/src/routing/route-builder.js.map +0 -1
  730. package/src/schemas/email-token.d.ts +0 -49
  731. package/src/schemas/email-token.d.ts.map +0 -1
  732. package/src/schemas/email-token.js +0 -55
  733. package/src/schemas/email-token.js.map +0 -1
  734. package/src/schemas/index.d.ts.map +0 -1
  735. package/src/schemas/index.js +0 -11
  736. package/src/schemas/index.js.map +0 -1
  737. package/src/schemas/mnemonic.d.ts +0 -27
  738. package/src/schemas/mnemonic.d.ts.map +0 -1
  739. package/src/schemas/mnemonic.js +0 -31
  740. package/src/schemas/mnemonic.js.map +0 -1
  741. package/src/schemas/role.d.ts +0 -42
  742. package/src/schemas/role.d.ts.map +0 -1
  743. package/src/schemas/role.js +0 -89
  744. package/src/schemas/role.js.map +0 -1
  745. package/src/schemas/schema.d.ts +0 -42
  746. package/src/schemas/schema.d.ts.map +0 -1
  747. package/src/schemas/schema.js +0 -70
  748. package/src/schemas/schema.js.map +0 -1
  749. package/src/schemas/used-direct-login-token.d.ts +0 -37
  750. package/src/schemas/used-direct-login-token.d.ts.map +0 -1
  751. package/src/schemas/used-direct-login-token.js +0 -24
  752. package/src/schemas/used-direct-login-token.js.map +0 -1
  753. package/src/schemas/user-role.d.ts +0 -39
  754. package/src/schemas/user-role.d.ts.map +0 -1
  755. package/src/schemas/user-role.js +0 -55
  756. package/src/schemas/user-role.js.map +0 -1
  757. package/src/schemas/user.d.ts +0 -24
  758. package/src/schemas/user.d.ts.map +0 -1
  759. package/src/schemas/user.js +0 -195
  760. package/src/schemas/user.js.map +0 -1
  761. package/src/services/backup-code.d.ts +0 -76
  762. package/src/services/backup-code.d.ts.map +0 -1
  763. package/src/services/backup-code.js +0 -185
  764. package/src/services/backup-code.js.map +0 -1
  765. package/src/services/base.d.ts +0 -11
  766. package/src/services/base.d.ts.map +0 -1
  767. package/src/services/base.js +0 -15
  768. package/src/services/base.js.map +0 -1
  769. package/src/services/checksum.d.ts +0 -69
  770. package/src/services/checksum.d.ts.map +0 -1
  771. package/src/services/checksum.js +0 -145
  772. package/src/services/checksum.js.map +0 -1
  773. package/src/services/crc.d.ts +0 -87
  774. package/src/services/crc.d.ts.map +0 -1
  775. package/src/services/crc.js +0 -198
  776. package/src/services/crc.js.map +0 -1
  777. package/src/services/database-initialization.d.ts +0 -111
  778. package/src/services/database-initialization.d.ts.map +0 -1
  779. package/src/services/database-initialization.js +0 -878
  780. package/src/services/database-initialization.js.map +0 -1
  781. package/src/services/db-init-cache.d.ts +0 -10
  782. package/src/services/db-init-cache.d.ts.map +0 -1
  783. package/src/services/db-init-cache.js +0 -3
  784. package/src/services/db-init-cache.js.map +0 -1
  785. package/src/services/direct-login-token.d.ts +0 -7
  786. package/src/services/direct-login-token.d.ts.map +0 -1
  787. package/src/services/direct-login-token.js +0 -41
  788. package/src/services/direct-login-token.js.map +0 -1
  789. package/src/services/dummy-email-service.d.ts +0 -11
  790. package/src/services/dummy-email-service.d.ts.map +0 -1
  791. package/src/services/dummy-email-service.js +0 -16
  792. package/src/services/dummy-email-service.js.map +0 -1
  793. package/src/services/fec-usage-example.d.ts +0 -38
  794. package/src/services/fec-usage-example.d.ts.map +0 -1
  795. package/src/services/fec-usage-example.js +0 -75
  796. package/src/services/fec-usage-example.js.map +0 -1
  797. package/src/services/fec.d.ts +0 -46
  798. package/src/services/fec.d.ts.map +0 -1
  799. package/src/services/fec.js +0 -214
  800. package/src/services/fec.js.map +0 -1
  801. package/src/services/index.d.ts.map +0 -1
  802. package/src/services/index.js +0 -23
  803. package/src/services/index.js.map +0 -1
  804. package/src/services/jwt.d.ts +0 -30
  805. package/src/services/jwt.d.ts.map +0 -1
  806. package/src/services/jwt.js +0 -90
  807. package/src/services/jwt.js.map +0 -1
  808. package/src/services/key-wrapping.d.ts +0 -61
  809. package/src/services/key-wrapping.d.ts.map +0 -1
  810. package/src/services/key-wrapping.js +0 -307
  811. package/src/services/key-wrapping.js.map +0 -1
  812. package/src/services/mnemonic.d.ts +0 -62
  813. package/src/services/mnemonic.d.ts.map +0 -1
  814. package/src/services/mnemonic.js +0 -114
  815. package/src/services/mnemonic.js.map +0 -1
  816. package/src/services/request-user.d.ts +0 -23
  817. package/src/services/request-user.d.ts.map +0 -1
  818. package/src/services/request-user.js +0 -68
  819. package/src/services/request-user.js.map +0 -1
  820. package/src/services/role.d.ts +0 -87
  821. package/src/services/role.d.ts.map +0 -1
  822. package/src/services/role.js +0 -279
  823. package/src/services/role.js.map +0 -1
  824. package/src/services/symmetric.d.ts +0 -42
  825. package/src/services/symmetric.d.ts.map +0 -1
  826. package/src/services/symmetric.js +0 -101
  827. package/src/services/symmetric.js.map +0 -1
  828. package/src/services/system-user.d.ts +0 -16
  829. package/src/services/system-user.d.ts.map +0 -1
  830. package/src/services/system-user.js +0 -46
  831. package/src/services/system-user.js.map +0 -1
  832. package/src/services/user.d.ts +0 -345
  833. package/src/services/user.d.ts.map +0 -1
  834. package/src/services/user.js +0 -1447
  835. package/src/services/user.js.map +0 -1
  836. package/src/services/xor.d.ts +0 -24
  837. package/src/services/xor.d.ts.map +0 -1
  838. package/src/services/xor.js +0 -37
  839. package/src/services/xor.js.map +0 -1
  840. package/src/testing.d.ts +0 -3
  841. package/src/testing.d.ts.map +0 -1
  842. package/src/testing.js +0 -7
  843. package/src/testing.js.map +0 -1
  844. package/src/transactions/index.d.ts.map +0 -1
  845. package/src/transactions/index.js +0 -5
  846. package/src/transactions/index.js.map +0 -1
  847. package/src/transactions/transaction-manager.d.ts +0 -12
  848. package/src/transactions/transaction-manager.d.ts.map +0 -1
  849. package/src/transactions/transaction-manager.js +0 -30
  850. package/src/transactions/transaction-manager.js.map +0 -1
  851. package/src/types/app-config.d.ts +0 -16
  852. package/src/types/app-config.d.ts.map +0 -1
  853. package/src/types/app-config.js +0 -3
  854. package/src/types/app-config.js.map +0 -1
  855. package/src/types/controller-config.d.ts +0 -14
  856. package/src/types/controller-config.d.ts.map +0 -1
  857. package/src/types/controller-config.js +0 -3
  858. package/src/types/controller-config.js.map +0 -1
  859. package/src/types/environment-variables.d.ts.map +0 -1
  860. package/src/types/environment-variables.js +0 -39
  861. package/src/types/environment-variables.js.map +0 -1
  862. package/src/types/index.d.ts.map +0 -1
  863. package/src/types/index.js +0 -6
  864. package/src/types/index.js.map +0 -1
  865. package/src/types/mongoose-helpers.d.ts.map +0 -1
  866. package/src/types/mongoose-helpers.js +0 -6
  867. package/src/types/mongoose-helpers.js.map +0 -1
  868. package/src/types.d.ts +0 -104
  869. package/src/types.d.ts.map +0 -1
  870. package/src/types.js +0 -14
  871. package/src/types.js.map +0 -1
  872. package/src/utils.d.ts +0 -211
  873. package/src/utils.d.ts.map +0 -1
  874. package/src/utils.js +0 -818
  875. package/src/utils.js.map +0 -1
  876. package/src/validation/index.d.ts.map +0 -1
  877. package/src/validation/index.js +0 -5
  878. package/src/validation/index.js.map +0 -1
  879. package/src/validation/validation-builder.d.ts +0 -32
  880. package/src/validation/validation-builder.d.ts.map +0 -1
  881. package/src/validation/validation-builder.js +0 -81
  882. package/src/validation/validation-builder.js.map +0 -1
@@ -0,0 +1,330 @@
1
+ /**
2
+ * @fileoverview Main application class with Express server.
3
+ * Extends BaseApplication with HTTP/HTTPS server and routing.
4
+ * @module application
5
+ */
6
+
7
+ import { HandleableError } from '@digitaldefiance/i18n-lib';
8
+ import mongoose from '@digitaldefiance/mongoose-types';
9
+ import {
10
+ Constants,
11
+ getSuiteCoreI18nEngine,
12
+ SuiteCoreComponentId,
13
+ SuiteCoreStringKey,
14
+ TranslatableSuiteError,
15
+ } from '@digitaldefiance/suite-core-lib';
16
+ import express, {
17
+ Application as ExpressApplication,
18
+ NextFunction,
19
+ Request,
20
+ Response,
21
+ } from 'express';
22
+ import { readFileSync } from 'fs';
23
+ import { HelmetOptions } from 'helmet';
24
+ import { Server } from 'http';
25
+ import { createServer } from 'https';
26
+ import { isAbsolute, normalize, resolve } from 'path';
27
+ import { BaseApplication } from './application-base';
28
+ import { IBaseDocument } from './documents/base';
29
+ import { Environment } from './environment';
30
+ import {
31
+ IApplication,
32
+ ICSPConfig,
33
+ IFailableResult,
34
+ isCSPConfig,
35
+ IServerInitResult,
36
+ } from './interfaces';
37
+ import { IConstants } from './interfaces/constants';
38
+ import { IFlexibleCSP, isFlexibleCSP } from './interfaces/flexible-csp';
39
+ import { initMiddleware, isHelmetOptions } from './middleware-utils';
40
+ import { AppRouter } from './routers/app';
41
+ import { BaseRouter } from './routers/base';
42
+ import { DatabaseInitializationService } from './services';
43
+ import { SchemaMap } from './types';
44
+ import { debugLog, handleError, sendApiMessageResponse } from './utils';
45
+ import type { PlatformID } from '@digitaldefiance/node-ecies-lib';
46
+
47
+ /**
48
+ * Application class
49
+ */
50
+ type ServerWithOptionalClose = Server & { closeAllConnections?: () => void };
51
+
52
+ export class Application<
53
+ TInitResults extends IServerInitResult<TID>,
54
+ TModelDocs extends Record<string, IBaseDocument<any, TID>>,
55
+ TID extends PlatformID = Buffer,
56
+ TEnvironment extends Environment<TID> = Environment<TID>,
57
+ TConstants extends IConstants = IConstants,
58
+ TAppRouter extends AppRouter<TID> = AppRouter<TID>,
59
+ >
60
+ extends BaseApplication<TID, TModelDocs, TInitResults, TConstants>
61
+ implements IApplication<TID>
62
+ {
63
+ public readonly expressApp: ExpressApplication;
64
+ private server: ServerWithOptionalClose | null = null;
65
+ private readonly _cspConfig: ICSPConfig | HelmetOptions | IFlexibleCSP;
66
+ private readonly _apiRouterFactory: (
67
+ app: IApplication<TID>,
68
+ ) => BaseRouter<TID>;
69
+ private readonly _appRouterFactory: (
70
+ apiRouter: BaseRouter<TID>,
71
+ ) => TAppRouter;
72
+ private readonly _initMiddleware: typeof initMiddleware;
73
+ private _apiRouter?: BaseRouter<TID>;
74
+
75
+ public override get environment(): TEnvironment {
76
+ return super.environment as TEnvironment;
77
+ }
78
+
79
+ protected registerServices(): void {
80
+ // Services will be registered by subclasses or ApiRouter
81
+ // Base implementation does nothing
82
+ }
83
+
84
+ constructor(
85
+ environment: TEnvironment,
86
+ apiRouterFactory: (app: IApplication<TID>) => BaseRouter<TID>,
87
+ schemaMapFactory: (
88
+ connection: mongoose.Connection,
89
+ ) => SchemaMap<TID, TModelDocs>,
90
+ databaseInitFunction: (
91
+ application: BaseApplication<TID, TModelDocs, TInitResults>,
92
+ ) => Promise<IFailableResult<TInitResults>>,
93
+ initResultHashFunction: (initResults: TInitResults) => string,
94
+ cspConfig: ICSPConfig | HelmetOptions | IFlexibleCSP = {
95
+ corsWhitelist: [],
96
+ csp: {
97
+ defaultSrc: [],
98
+ imgSrc: [],
99
+ connectSrc: [],
100
+ scriptSrc: [],
101
+ styleSrc: [],
102
+ fontSrc: [],
103
+ frameSrc: [],
104
+ },
105
+ },
106
+ constants: TConstants = Constants as TConstants,
107
+ appRouterFactory: (apiRouter: BaseRouter<TID>) => TAppRouter = (
108
+ apiRouter,
109
+ ) => new AppRouter(apiRouter) as TAppRouter,
110
+ customInitMiddleware: typeof initMiddleware = initMiddleware,
111
+ ) {
112
+ super(
113
+ environment,
114
+ schemaMapFactory,
115
+ databaseInitFunction,
116
+ initResultHashFunction,
117
+ constants,
118
+ );
119
+ this._apiRouterFactory = apiRouterFactory;
120
+ this._appRouterFactory = appRouterFactory;
121
+ this._initMiddleware = customInitMiddleware;
122
+ this.expressApp = express();
123
+ this.server = null;
124
+ this._cspConfig = cspConfig;
125
+ this.registerServices();
126
+ }
127
+
128
+ public override async start(mongoUri?: string): Promise<void> {
129
+ const engine = getSuiteCoreI18nEngine({ constants: this.constants });
130
+ await super.start(mongoUri, true);
131
+ if (this.devDatabase) {
132
+ const result = await this.initializeDevDatabase();
133
+ DatabaseInitializationService.printServerInitResults(result, false);
134
+ }
135
+ try {
136
+ this._apiRouter = this._apiRouterFactory(this);
137
+ if (isFlexibleCSP(this._cspConfig) || isCSPConfig(this._cspConfig)) {
138
+ this._initMiddleware(
139
+ this.expressApp,
140
+ this._cspConfig.corsWhitelist,
141
+ this._cspConfig.csp,
142
+ );
143
+ } else if (isHelmetOptions(this._cspConfig)) {
144
+ this._initMiddleware(this.expressApp, [], this._cspConfig);
145
+ }
146
+ const appRouter = this._appRouterFactory(this._apiRouter);
147
+
148
+ appRouter.init(this.expressApp);
149
+ this.expressApp.use(
150
+ (
151
+ err: HandleableError | Error,
152
+ req: Request,
153
+ res: Response,
154
+ _next: NextFunction,
155
+ ) => {
156
+ if (
157
+ res.headersSent ||
158
+ (err as { _errorHandlerProcessing?: boolean })
159
+ ._errorHandlerProcessing
160
+ ) {
161
+ return;
162
+ }
163
+ (
164
+ err as { _errorHandlerProcessing?: boolean }
165
+ )._errorHandlerProcessing = true;
166
+
167
+ const safeHandle = () => {
168
+ try {
169
+ const handleableError =
170
+ err instanceof HandleableError
171
+ ? err
172
+ : new HandleableError(
173
+ err instanceof Error ? err : new Error(String(err)),
174
+ { cause: err },
175
+ );
176
+ handleError(
177
+ handleableError,
178
+ res,
179
+ sendApiMessageResponse,
180
+ () => {},
181
+ );
182
+ } catch {
183
+ res.status(500).json({
184
+ message: engine.translate(
185
+ SuiteCoreComponentId,
186
+ SuiteCoreStringKey.Error_RecursiveErrorHandlingDetected,
187
+ ),
188
+ error: {
189
+ message:
190
+ err instanceof Error
191
+ ? err.message
192
+ : engine.translate(
193
+ SuiteCoreComponentId,
194
+ SuiteCoreStringKey.Common_UnexpectedError,
195
+ ),
196
+ },
197
+ });
198
+ }
199
+ };
200
+
201
+ setImmediate(safeHandle);
202
+ },
203
+ );
204
+
205
+ const serversReady: Promise<void>[] = [];
206
+ serversReady.push(
207
+ new Promise<void>((resolve) => {
208
+ this.server = this.expressApp.listen(
209
+ this.environment.port,
210
+ this.environment.host,
211
+ () => {
212
+ debugLog(
213
+ this.environment.debug,
214
+ 'log',
215
+ `[ ${engine.translate(
216
+ SuiteCoreComponentId,
217
+ SuiteCoreStringKey.Common_Ready,
218
+ )} ] http://${this.environment.host}:${this.environment.port}`,
219
+ );
220
+ resolve();
221
+ },
222
+ ) as ServerWithOptionalClose;
223
+ }),
224
+ );
225
+
226
+ if (this.environment.httpsDevCertRoot) {
227
+ try {
228
+ const certRoot = normalize(this.environment.httpsDevCertRoot);
229
+ if (!isAbsolute(certRoot) || certRoot.includes('..')) {
230
+ throw new TranslatableSuiteError(
231
+ SuiteCoreStringKey.Error_InvalidCertificatePathMustBeAbsolute,
232
+ );
233
+ }
234
+ const certPath = normalize(resolve(certRoot + '.pem'));
235
+ const keyPath = normalize(resolve(certRoot + '-key.pem'));
236
+ if (certPath.includes('..') || keyPath.includes('..')) {
237
+ throw new TranslatableSuiteError(
238
+ SuiteCoreStringKey.Error_InvalidCertificatePathAfterResolution,
239
+ );
240
+ }
241
+ const options = {
242
+ // amazonq-ignore-next-line fixed above
243
+ key: readFileSync(keyPath),
244
+ // amazonq-ignore-next-line fixed above
245
+ cert: readFileSync(certPath),
246
+ };
247
+
248
+ serversReady.push(
249
+ new Promise<void>((resolve) => {
250
+ createServer(options, this.expressApp).listen(
251
+ this.environment.httpsDevPort,
252
+ this.environment.host,
253
+ () => {
254
+ console.log(
255
+ `[ ${engine.translate(
256
+ SuiteCoreComponentId,
257
+ SuiteCoreStringKey.Common_Ready,
258
+ )} ] https://${this.environment.host}:${
259
+ this.environment.httpsDevPort
260
+ }`,
261
+ );
262
+ resolve();
263
+ },
264
+ );
265
+ }),
266
+ );
267
+ } catch (err) {
268
+ console.error('Failed to start HTTPS server:', err);
269
+ }
270
+ }
271
+
272
+ await Promise.all(serversReady);
273
+ this._ready = true;
274
+ } catch (err) {
275
+ console.error(
276
+ engine.translate(
277
+ SuiteCoreComponentId,
278
+ SuiteCoreStringKey.Error_FailedToStartApplication,
279
+ ),
280
+ err,
281
+ );
282
+ if (process.env['NODE_ENV'] === 'test') {
283
+ throw err;
284
+ }
285
+ process.exit(1);
286
+ }
287
+ }
288
+
289
+ public override async stop(): Promise<void> {
290
+ const engine = getSuiteCoreI18nEngine({ constants: this.constants });
291
+ if (this.server) {
292
+ debugLog(
293
+ this.environment.debug,
294
+ 'log',
295
+ `[ ${engine.translate(
296
+ SuiteCoreComponentId,
297
+ SuiteCoreStringKey.Common_Stopping,
298
+ )} ] ${engine.translate(
299
+ SuiteCoreComponentId,
300
+ SuiteCoreStringKey.Common_ApplicationAndDatabase,
301
+ )}`,
302
+ );
303
+ await new Promise<void>((resolve, reject) => {
304
+ this.server!.closeAllConnections?.();
305
+ this.server!.close((err) => {
306
+ if (err) {
307
+ reject(err);
308
+ } else {
309
+ resolve();
310
+ }
311
+ });
312
+ });
313
+ this.server = null;
314
+ }
315
+
316
+ await super.stop();
317
+ this._ready = false;
318
+ debugLog(
319
+ this.environment.debug,
320
+ 'log',
321
+ `[ ${engine.translate(
322
+ SuiteCoreComponentId,
323
+ SuiteCoreStringKey.Common_Stopped,
324
+ )} ] ${engine.translate(
325
+ SuiteCoreComponentId,
326
+ SuiteCoreStringKey.Common_ApplicationAndDatabase,
327
+ )}`,
328
+ );
329
+ }
330
+ }
@@ -0,0 +1,348 @@
1
+ /**
2
+ * @fileoverview Backup code implementation with v1.0.0 encryption scheme.
3
+ * Provides secure backup code generation, encryption, validation using Argon2id and HKDF-SHA256.
4
+ * @module backup-code
5
+ */
6
+
7
+ import { MemberType } from '@digitaldefiance/ecies-lib';
8
+ import {
9
+ Constants as ApiConstants,
10
+ Member as BackendMember,
11
+ PlatformID,
12
+ } from '@digitaldefiance/node-ecies-lib';
13
+ import {
14
+ BackupCodeString,
15
+ IBackupCode,
16
+ InvalidBackupCodeError,
17
+ PrivateKeyRequiredError,
18
+ SuiteCoreStringKey,
19
+ TranslatableSuiteError,
20
+ } from '@digitaldefiance/suite-core-lib';
21
+ import * as argon2 from 'argon2';
22
+ import { createHmac, randomBytes, timingSafeEqual } from 'crypto';
23
+ import { LocalhostConstants } from './constants';
24
+ import { InvalidBackupCodeVersionError } from './errors/invalid-backup-code-version';
25
+ import { IConstants } from './interfaces';
26
+ import { SymmetricService } from './services/symmetric';
27
+
28
+ /**
29
+ * Class representing a backup code string with associated operations.
30
+ *
31
+ * v1 scheme:
32
+ * - Code: 32 lowercase alphanumerics (a–z0–9), displayed as 8 groups of 4: xxxx-xxxx-xxxx-xxxx-xxxx-xxxx-xxxx-xxxx
33
+ * - Checksum/tag: HKDF-SHA256(codeUtf8, salt, "backup-checksum") → 32 bytes (stored as hex)
34
+ * - KDF for encryption key: Argon2id(codeUtf8, salt) → 32 bytes
35
+ * - Encryption: SymmetricService AEAD (encryptedData must embed IV + authTag + ciphertext)
36
+ * - Wrapping: AEAD blob wrapped with system user's asymmetric key (ECIES)
37
+ */
38
+ export class BackupCode extends BackupCodeString {
39
+ /** Current backup code scheme version implemented by this service. */
40
+ public static readonly BackupCodeVersion = '1.0.0';
41
+ // Centralized Argon2id parameters (tunable)
42
+ private static readonly Argon2Params = {
43
+ type: argon2.argon2id,
44
+ hashLength: 32, // derive AES-256 key
45
+ timeCost: 3,
46
+ memoryCost: 65536, // 64 MiB
47
+ parallelism: 1,
48
+ raw: true as const,
49
+ } as const;
50
+
51
+ constructor(code: string) {
52
+ super(code);
53
+ }
54
+
55
+ /**
56
+ * Generate the configured number of backup codes.
57
+ * Note: If generation alphabet/length is controlled elsewhere, prefer that path.
58
+ */
59
+ public static override generateBackupCodes(
60
+ constants: IConstants = LocalhostConstants,
61
+ ): Array<BackupCode> {
62
+ const codes: Array<BackupCode> = [];
63
+ for (let i = 0; i < constants.BACKUP_CODES.Count; i++) {
64
+ codes.push(new BackupCode(BackupCode.generateBackupCode()));
65
+ }
66
+ return codes;
67
+ }
68
+
69
+ /**
70
+ * HKDF-Extract-and-Expand using HMAC-SHA-256.
71
+ *
72
+ * PRK = HMAC(salt, ikm)
73
+ * T(0) = empty
74
+ * T(i) = HMAC(PRK, T(i-1) || info || i)
75
+ * OKM = first 'length' bytes of T(1) || T(2) || ...
76
+ */
77
+ public static hkdfSha256(
78
+ ikm: Buffer,
79
+ salt: Buffer,
80
+ info: Buffer,
81
+ length: number,
82
+ ): Buffer {
83
+ if (length === 0) {
84
+ return Buffer.alloc(0);
85
+ }
86
+
87
+ // HKDF-Extract: PRK = HMAC-Hash(salt, IKM)
88
+ // If salt is empty, use a string of HashLen zeros
89
+ const actualSalt = salt.length === 0 ? Buffer.alloc(32, 0) : salt;
90
+ const prk = createHmac('sha256', actualSalt).update(ikm).digest();
91
+
92
+ // HKDF-Expand
93
+ const blocks: Buffer[] = [];
94
+ let prev = Buffer.alloc(0);
95
+ const n = Math.ceil(length / 32);
96
+
97
+ for (let i = 1; i <= n; i++) {
98
+ const hmac = createHmac('sha256', prk);
99
+ hmac.update(prev);
100
+ hmac.update(info);
101
+ hmac.update(Buffer.from([i]));
102
+ prev = Buffer.from(hmac.digest());
103
+ blocks.push(prev);
104
+ }
105
+
106
+ return Buffer.concat(blocks).subarray(0, length);
107
+ }
108
+
109
+ /**
110
+ * v1: Derive a 32-byte encryption key from a normalized backup code using Argon2id and the per-code salt.
111
+ * Uses UTF-8 bytes of the normalized code (not hex).
112
+ */
113
+ public static async getBackupKeyV1(
114
+ checksumSaltHex: string,
115
+ normalizedCode: string,
116
+ constants: IConstants = LocalhostConstants,
117
+ ): Promise<Buffer> {
118
+ if (!constants.BACKUP_CODES.NormalizedHexRegex.test(normalizedCode)) {
119
+ throw new InvalidBackupCodeError();
120
+ }
121
+ const codeBytes = Buffer.from(normalizedCode, 'utf8');
122
+ const checksumSalt = Buffer.from(checksumSaltHex, 'hex');
123
+ try {
124
+ const key = (await argon2.hash(codeBytes, {
125
+ ...BackupCode.Argon2Params,
126
+ salt: checksumSalt,
127
+ })) as Buffer;
128
+ return key; // 32-byte Buffer
129
+ } finally {
130
+ codeBytes.fill(0);
131
+ }
132
+ }
133
+
134
+ /**
135
+ * v1: Compute a 32-byte checksum/tag for a normalized code using HKDF-SHA256(codeUtf8, salt, "backup-checksum").
136
+ */
137
+ private static computeChecksumV1(
138
+ normalizedCode: string,
139
+ checksumSalt: Buffer,
140
+ ): Buffer {
141
+ const codeBytes = Buffer.from(normalizedCode, 'utf8');
142
+ try {
143
+ return BackupCode.hkdfSha256(
144
+ codeBytes,
145
+ checksumSalt,
146
+ Buffer.from('backup-checksum'),
147
+ 32,
148
+ );
149
+ } finally {
150
+ codeBytes.fill(0);
151
+ }
152
+ }
153
+
154
+ public async encrypt<TID extends PlatformID = Buffer>(
155
+ backupUser: BackendMember<TID>,
156
+ systemUser: BackendMember<TID>,
157
+ constants: IConstants = LocalhostConstants,
158
+ ): Promise<IBackupCode> {
159
+ if (!backupUser.hasPrivateKey) {
160
+ throw new PrivateKeyRequiredError();
161
+ }
162
+ if (systemUser.type !== MemberType.System) {
163
+ throw new TranslatableSuiteError(
164
+ SuiteCoreStringKey.Error_SystemUserMustBeSystemMemberType,
165
+ );
166
+ }
167
+ const raw = this.value ?? '';
168
+ const normalized = BackupCode.normalizeCode(raw);
169
+ if (
170
+ !(
171
+ constants.BACKUP_CODES.DisplayRegex.test(raw) ||
172
+ constants.BACKUP_CODES.NormalizedHexRegex.test(normalized)
173
+ )
174
+ ) {
175
+ throw new InvalidBackupCodeError();
176
+ }
177
+
178
+ const checksumSalt = randomBytes(ApiConstants.PBKDF2.SALT_BYTES);
179
+ const checksumBuf = BackupCode.computeChecksumV1(normalized, checksumSalt);
180
+ const encryptionKey = await BackupCode.getBackupKeyV1(
181
+ checksumSalt.toString('hex'),
182
+ normalized,
183
+ constants,
184
+ );
185
+
186
+ try {
187
+ const sealed = SymmetricService.encryptBuffer(
188
+ Buffer.from(backupUser.privateKey!.value),
189
+ encryptionKey,
190
+ );
191
+ const wrappedEncryptedPrivateKey = systemUser
192
+ .encryptData(sealed.encryptedData)
193
+ .toString('hex');
194
+
195
+ return {
196
+ version: BackupCode.BackupCodeVersion,
197
+ checksumSalt: checksumSalt.toString('hex'),
198
+ checksum: checksumBuf.toString('hex'),
199
+ encrypted: wrappedEncryptedPrivateKey,
200
+ } as IBackupCode;
201
+ } finally {
202
+ encryptionKey.fill(0);
203
+ checksumBuf.fill(0);
204
+ }
205
+ }
206
+
207
+ /**
208
+ * v1: Encrypt and wrap backup codes for a user.
209
+ * - Validates code format (display or normalized)
210
+ * - Computes HKDF checksum/tag
211
+ * - Derives Argon2id encryption key (32 bytes) from UTF-8 code
212
+ * - Encrypts the private key with AEAD and wraps with system user
213
+ */
214
+ public static async encryptBackupCodesV1<TID extends PlatformID = Buffer>(
215
+ backupUser: BackendMember<TID>,
216
+ systemUser: BackendMember<TID>,
217
+ codes: Array<BackupCode>,
218
+ ): Promise<Array<IBackupCode>> {
219
+ const encryptedCodes: Array<IBackupCode> = [];
220
+ for (const code of codes) {
221
+ encryptedCodes.push(await code.encrypt(backupUser, systemUser));
222
+ }
223
+ return encryptedCodes;
224
+ }
225
+
226
+ /** Delegate to current version. */
227
+ public static encryptBackupCodes<TID extends PlatformID = Buffer>(
228
+ backupUser: BackendMember<TID>,
229
+ systemUser: BackendMember<TID>,
230
+ codes: Array<BackupCode>,
231
+ ): Promise<Array<IBackupCode>> {
232
+ return BackupCode.encryptBackupCodesV1(backupUser, systemUser, codes);
233
+ }
234
+
235
+ /**
236
+ * v1: Validate whether a backup code exists (unused) in the provided collection.
237
+ * Uses constant-time comparison of binary checksums (codeUtf8 + salt).
238
+ */
239
+ public static validateBackupCodeV1(
240
+ encryptedBackupCodes: Array<IBackupCode>,
241
+ backupCode: string,
242
+ constants: IConstants = LocalhostConstants,
243
+ ): boolean {
244
+ const normalizedCode = BackupCodeString.normalizeCode(backupCode);
245
+ if (!constants.BACKUP_CODES.NormalizedHexRegex.test(normalizedCode)) {
246
+ return false;
247
+ }
248
+ const codeBytes = Buffer.from(normalizedCode, 'utf8');
249
+ try {
250
+ for (const code of encryptedBackupCodes) {
251
+ if (code.version !== BackupCode.BackupCodeVersion) continue;
252
+ const checksumSalt = Buffer.from(code.checksumSalt, 'hex');
253
+ const expected = BackupCode.hkdfSha256(
254
+ codeBytes,
255
+ checksumSalt,
256
+ Buffer.from('backup-checksum'),
257
+ 32,
258
+ );
259
+ if (
260
+ code.checksum.length === expected.length * 2 &&
261
+ timingSafeEqual(Buffer.from(code.checksum, 'hex'), expected)
262
+ ) {
263
+ return true;
264
+ }
265
+ }
266
+ return false;
267
+ } finally {
268
+ codeBytes.fill(0);
269
+ }
270
+ }
271
+
272
+ /**
273
+ * Validate a backup code against any supported version present in the collection.
274
+ */
275
+ public static validateBackupCode(
276
+ encryptedBackupCodes: Array<IBackupCode>,
277
+ backupCode: string,
278
+ constants: IConstants = LocalhostConstants,
279
+ ): boolean {
280
+ const normalizedCode = BackupCodeString.normalizeCode(backupCode);
281
+ if (!constants.BACKUP_CODES.NormalizedHexRegex.test(normalizedCode)) {
282
+ return false;
283
+ }
284
+ if (
285
+ encryptedBackupCodes.some(
286
+ (c) => c.version === BackupCode.BackupCodeVersion,
287
+ )
288
+ ) {
289
+ return this.validateBackupCodeV1(
290
+ encryptedBackupCodes.filter(
291
+ (c) => c.version === BackupCode.BackupCodeVersion,
292
+ ),
293
+ normalizedCode,
294
+ );
295
+ }
296
+ return false;
297
+ }
298
+
299
+ /**
300
+ * Detect the version by matching checksum against stored codes; returns the matched version.
301
+ */
302
+ public static detectBackupCodeVersion(
303
+ encryptedBackupCodes: Array<IBackupCode>,
304
+ backupCode: string,
305
+ constants: IConstants = LocalhostConstants,
306
+ ): string {
307
+ const normalizedCode = BackupCodeString.normalizeCode(backupCode);
308
+ if (!constants.BACKUP_CODES.NormalizedHexRegex.test(normalizedCode)) {
309
+ throw new InvalidBackupCodeError();
310
+ }
311
+
312
+ const v1Set = encryptedBackupCodes.filter(
313
+ (c) => c.version === BackupCode.BackupCodeVersion,
314
+ );
315
+ if (v1Set.length) {
316
+ const codeBytes = Buffer.from(normalizedCode, 'utf8');
317
+ try {
318
+ for (const c of v1Set) {
319
+ const checksumSalt = Buffer.from(c.checksumSalt, 'hex');
320
+ const expected = BackupCode.hkdfSha256(
321
+ codeBytes,
322
+ checksumSalt,
323
+ Buffer.from('backup-checksum'),
324
+ 32,
325
+ );
326
+ if (
327
+ c.checksum.length === expected.length * 2 &&
328
+ timingSafeEqual(Buffer.from(c.checksum, 'hex'), expected)
329
+ ) {
330
+ return c.version;
331
+ }
332
+ }
333
+ } finally {
334
+ // zeroize
335
+ codeBytes.fill(0);
336
+ }
337
+ }
338
+
339
+ const versionsInSet = new Set(encryptedBackupCodes.map((c) => c.version));
340
+ if (
341
+ versionsInSet.size > 0 &&
342
+ !versionsInSet.has(BackupCode.BackupCodeVersion)
343
+ ) {
344
+ throw new InvalidBackupCodeVersionError([...versionsInSet][0]);
345
+ }
346
+ throw new InvalidBackupCodeError();
347
+ }
348
+ }