@digitaldefiance/node-express-suite-mongo 4.23.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (390) hide show
  1. package/README.md +152 -0
  2. package/package.json +51 -0
  3. package/src/__tests__/fixtures/index.d.ts +2 -0
  4. package/src/__tests__/fixtures/index.d.ts.map +1 -0
  5. package/src/__tests__/fixtures/index.js +5 -0
  6. package/src/__tests__/fixtures/index.js.map +1 -0
  7. package/src/__tests__/fixtures/model-mocks.mock.d.ts +12 -0
  8. package/src/__tests__/fixtures/model-mocks.mock.d.ts.map +1 -0
  9. package/src/__tests__/fixtures/model-mocks.mock.js +102 -0
  10. package/src/__tests__/fixtures/model-mocks.mock.js.map +1 -0
  11. package/src/__tests__/helpers/application.mock.d.ts +4 -0
  12. package/src/__tests__/helpers/application.mock.d.ts.map +1 -0
  13. package/src/__tests__/helpers/application.mock.js +35 -0
  14. package/src/__tests__/helpers/application.mock.js.map +1 -0
  15. package/src/__tests__/helpers/index.d.ts +5 -0
  16. package/src/__tests__/helpers/index.d.ts.map +1 -0
  17. package/src/__tests__/helpers/index.js +8 -0
  18. package/src/__tests__/helpers/index.js.map +1 -0
  19. package/src/__tests__/helpers/mongoose-memory.d.ts +14 -0
  20. package/src/__tests__/helpers/mongoose-memory.d.ts.map +1 -0
  21. package/src/__tests__/helpers/mongoose-memory.js +49 -0
  22. package/src/__tests__/helpers/mongoose-memory.js.map +1 -0
  23. package/src/__tests__/helpers/setup-test-env.d.ts +13 -0
  24. package/src/__tests__/helpers/setup-test-env.d.ts.map +1 -0
  25. package/src/__tests__/helpers/setup-test-env.js +131 -0
  26. package/src/__tests__/helpers/setup-test-env.js.map +1 -0
  27. package/src/__tests__/index.d.ts +3 -0
  28. package/src/__tests__/index.d.ts.map +1 -0
  29. package/src/__tests__/index.js +6 -0
  30. package/src/__tests__/index.js.map +1 -0
  31. package/src/builders/application-builder.d.ts +38 -0
  32. package/src/builders/application-builder.d.ts.map +1 -0
  33. package/src/builders/application-builder.js +82 -0
  34. package/src/builders/application-builder.js.map +1 -0
  35. package/src/builders/index.d.ts +2 -0
  36. package/src/builders/index.d.ts.map +1 -0
  37. package/src/builders/index.js +5 -0
  38. package/src/builders/index.js.map +1 -0
  39. package/src/controllers/index.d.ts +3 -0
  40. package/src/controllers/index.d.ts.map +1 -0
  41. package/src/controllers/index.js +6 -0
  42. package/src/controllers/index.js.map +1 -0
  43. package/src/controllers/mongo-base.d.ts +55 -0
  44. package/src/controllers/mongo-base.d.ts.map +1 -0
  45. package/src/controllers/mongo-base.js +108 -0
  46. package/src/controllers/mongo-base.js.map +1 -0
  47. package/src/controllers/user.d.ts +61 -0
  48. package/src/controllers/user.d.ts.map +1 -0
  49. package/src/controllers/user.js +944 -0
  50. package/src/controllers/user.js.map +1 -0
  51. package/src/documents/base.d.ts +15 -0
  52. package/src/documents/base.d.ts.map +1 -0
  53. package/src/documents/base.js +8 -0
  54. package/src/documents/base.js.map +1 -0
  55. package/src/documents/email-token.d.ts +15 -0
  56. package/src/documents/email-token.d.ts.map +1 -0
  57. package/src/documents/email-token.js +8 -0
  58. package/src/documents/email-token.js.map +1 -0
  59. package/src/documents/index.d.ts +8 -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.d.ts +16 -0
  64. package/src/documents/mnemonic.d.ts.map +1 -0
  65. package/src/documents/mnemonic.js +8 -0
  66. package/src/documents/mnemonic.js.map +1 -0
  67. package/src/documents/role.d.ts +15 -0
  68. package/src/documents/role.d.ts.map +1 -0
  69. package/src/documents/role.js +8 -0
  70. package/src/documents/role.js.map +1 -0
  71. package/src/documents/used-direct-login-token.d.ts +16 -0
  72. package/src/documents/used-direct-login-token.d.ts.map +1 -0
  73. package/src/documents/used-direct-login-token.js +8 -0
  74. package/src/documents/used-direct-login-token.js.map +1 -0
  75. package/src/documents/user-role.d.ts +16 -0
  76. package/src/documents/user-role.d.ts.map +1 -0
  77. package/src/documents/user-role.js +8 -0
  78. package/src/documents/user-role.js.map +1 -0
  79. package/src/documents/user.d.ts +16 -0
  80. package/src/documents/user.d.ts.map +1 -0
  81. package/src/documents/user.js +8 -0
  82. package/src/documents/user.js.map +1 -0
  83. package/src/enumerations/base-model-name.d.ts +43 -0
  84. package/src/enumerations/base-model-name.d.ts.map +1 -0
  85. package/src/enumerations/base-model-name.js +39 -0
  86. package/src/enumerations/base-model-name.js.map +1 -0
  87. package/src/enumerations/index.d.ts +3 -0
  88. package/src/enumerations/index.d.ts.map +1 -0
  89. package/src/enumerations/index.js +6 -0
  90. package/src/enumerations/index.js.map +1 -0
  91. package/src/enumerations/schema-collection.d.ts +39 -0
  92. package/src/enumerations/schema-collection.d.ts.map +1 -0
  93. package/src/enumerations/schema-collection.js +43 -0
  94. package/src/enumerations/schema-collection.js.map +1 -0
  95. package/src/errors/index.d.ts +5 -0
  96. package/src/errors/index.d.ts.map +1 -0
  97. package/src/errors/index.js +8 -0
  98. package/src/errors/index.js.map +1 -0
  99. package/src/errors/invalid-backup-code-version.d.ts +5 -0
  100. package/src/errors/invalid-backup-code-version.d.ts.map +1 -0
  101. package/src/errors/invalid-backup-code-version.js +14 -0
  102. package/src/errors/invalid-backup-code-version.js.map +1 -0
  103. package/src/errors/invalid-model.d.ts +18 -0
  104. package/src/errors/invalid-model.d.ts.map +1 -0
  105. package/src/errors/invalid-model.js +26 -0
  106. package/src/errors/invalid-model.js.map +1 -0
  107. package/src/errors/model-not-registered.d.ts +18 -0
  108. package/src/errors/model-not-registered.d.ts.map +1 -0
  109. package/src/errors/model-not-registered.js +26 -0
  110. package/src/errors/model-not-registered.js.map +1 -0
  111. package/src/errors/mongoose-validation.d.ts +28 -0
  112. package/src/errors/mongoose-validation.d.ts.map +1 -0
  113. package/src/errors/mongoose-validation.js +33 -0
  114. package/src/errors/mongoose-validation.js.map +1 -0
  115. package/src/index.d.ts +19 -0
  116. package/src/index.d.ts.map +1 -0
  117. package/src/index.js +31 -0
  118. package/src/index.js.map +1 -0
  119. package/src/interfaces/api-mongo-validation-error-response.d.ts +16 -0
  120. package/src/interfaces/api-mongo-validation-error-response.d.ts.map +1 -0
  121. package/src/interfaces/api-mongo-validation-error-response.js +8 -0
  122. package/src/interfaces/api-mongo-validation-error-response.js.map +1 -0
  123. package/src/interfaces/database-init-result-tx.d.ts +27 -0
  124. package/src/interfaces/database-init-result-tx.d.ts.map +1 -0
  125. package/src/interfaces/database-init-result-tx.js +3 -0
  126. package/src/interfaces/database-init-result-tx.js.map +1 -0
  127. package/src/interfaces/db-init-result.d.ts +16 -0
  128. package/src/interfaces/db-init-result.d.ts.map +1 -0
  129. package/src/interfaces/db-init-result.js +8 -0
  130. package/src/interfaces/db-init-result.js.map +1 -0
  131. package/src/interfaces/discriminator-collections.d.ts +17 -0
  132. package/src/interfaces/discriminator-collections.d.ts.map +1 -0
  133. package/src/interfaces/discriminator-collections.js +8 -0
  134. package/src/interfaces/discriminator-collections.js.map +1 -0
  135. package/src/interfaces/environment-mongo.d.ts +88 -0
  136. package/src/interfaces/environment-mongo.d.ts.map +1 -0
  137. package/src/interfaces/environment-mongo.js +8 -0
  138. package/src/interfaces/environment-mongo.js.map +1 -0
  139. package/src/interfaces/index.d.ts +13 -0
  140. package/src/interfaces/index.d.ts.map +1 -0
  141. package/src/interfaces/index.js +16 -0
  142. package/src/interfaces/index.js.map +1 -0
  143. package/src/interfaces/models/email-token.d.ts +12 -0
  144. package/src/interfaces/models/email-token.d.ts.map +1 -0
  145. package/src/interfaces/models/email-token.js +8 -0
  146. package/src/interfaces/models/email-token.js.map +1 -0
  147. package/src/interfaces/models/index.d.ts +8 -0
  148. package/src/interfaces/models/index.d.ts.map +1 -0
  149. package/src/interfaces/models/index.js +11 -0
  150. package/src/interfaces/models/index.js.map +1 -0
  151. package/src/interfaces/models/mnemonic.d.ts +13 -0
  152. package/src/interfaces/models/mnemonic.d.ts.map +1 -0
  153. package/src/interfaces/models/mnemonic.js +8 -0
  154. package/src/interfaces/models/mnemonic.js.map +1 -0
  155. package/src/interfaces/models/role.d.ts +12 -0
  156. package/src/interfaces/models/role.d.ts.map +1 -0
  157. package/src/interfaces/models/role.js +8 -0
  158. package/src/interfaces/models/role.js.map +1 -0
  159. package/src/interfaces/models/token-role.d.ts +19 -0
  160. package/src/interfaces/models/token-role.d.ts.map +1 -0
  161. package/src/interfaces/models/token-role.js +8 -0
  162. package/src/interfaces/models/token-role.js.map +1 -0
  163. package/src/interfaces/models/used-direct-login-token.d.ts +19 -0
  164. package/src/interfaces/models/used-direct-login-token.d.ts.map +1 -0
  165. package/src/interfaces/models/used-direct-login-token.js +8 -0
  166. package/src/interfaces/models/used-direct-login-token.js.map +1 -0
  167. package/src/interfaces/models/user-role.d.ts +19 -0
  168. package/src/interfaces/models/user-role.d.ts.map +1 -0
  169. package/src/interfaces/models/user-role.js +8 -0
  170. package/src/interfaces/models/user-role.js.map +1 -0
  171. package/src/interfaces/models/user.d.ts +21 -0
  172. package/src/interfaces/models/user.d.ts.map +1 -0
  173. package/src/interfaces/models/user.js +8 -0
  174. package/src/interfaces/models/user.js.map +1 -0
  175. package/src/interfaces/mongo-application.d.ts +47 -0
  176. package/src/interfaces/mongo-application.d.ts.map +1 -0
  177. package/src/interfaces/mongo-application.js +10 -0
  178. package/src/interfaces/mongo-application.js.map +1 -0
  179. package/src/interfaces/mongo-errors.d.ts +13 -0
  180. package/src/interfaces/mongo-errors.d.ts.map +1 -0
  181. package/src/interfaces/mongo-errors.js +8 -0
  182. package/src/interfaces/mongo-errors.js.map +1 -0
  183. package/src/interfaces/mongoose-document-store.d.ts +42 -0
  184. package/src/interfaces/mongoose-document-store.d.ts.map +1 -0
  185. package/src/interfaces/mongoose-document-store.js +10 -0
  186. package/src/interfaces/mongoose-document-store.js.map +1 -0
  187. package/src/interfaces/schema.d.ts +37 -0
  188. package/src/interfaces/schema.d.ts.map +1 -0
  189. package/src/interfaces/schema.js +8 -0
  190. package/src/interfaces/schema.js.map +1 -0
  191. package/src/interfaces/server-init-result.d.ts +45 -0
  192. package/src/interfaces/server-init-result.d.ts.map +1 -0
  193. package/src/interfaces/server-init-result.js +8 -0
  194. package/src/interfaces/server-init-result.js.map +1 -0
  195. package/src/interfaces/test-environment.d.ts +22 -0
  196. package/src/interfaces/test-environment.d.ts.map +1 -0
  197. package/src/interfaces/test-environment.js +8 -0
  198. package/src/interfaces/test-environment.js.map +1 -0
  199. package/src/model-registry.d.ts +79 -0
  200. package/src/model-registry.d.ts.map +1 -0
  201. package/src/model-registry.js +97 -0
  202. package/src/model-registry.js.map +1 -0
  203. package/src/models/email-token.d.ts +24 -0
  204. package/src/models/email-token.d.ts.map +1 -0
  205. package/src/models/email-token.js +16 -0
  206. package/src/models/email-token.js.map +1 -0
  207. package/src/models/index.d.ts +7 -0
  208. package/src/models/index.d.ts.map +1 -0
  209. package/src/models/index.js +10 -0
  210. package/src/models/index.js.map +1 -0
  211. package/src/models/mnemonic.d.ts +24 -0
  212. package/src/models/mnemonic.d.ts.map +1 -0
  213. package/src/models/mnemonic.js +27 -0
  214. package/src/models/mnemonic.js.map +1 -0
  215. package/src/models/role.d.ts +24 -0
  216. package/src/models/role.d.ts.map +1 -0
  217. package/src/models/role.js +27 -0
  218. package/src/models/role.js.map +1 -0
  219. package/src/models/used-direct-login-token.d.ts +24 -0
  220. package/src/models/used-direct-login-token.d.ts.map +1 -0
  221. package/src/models/used-direct-login-token.js +16 -0
  222. package/src/models/used-direct-login-token.js.map +1 -0
  223. package/src/models/user-role.d.ts +23 -0
  224. package/src/models/user-role.d.ts.map +1 -0
  225. package/src/models/user-role.js +26 -0
  226. package/src/models/user-role.js.map +1 -0
  227. package/src/models/user.d.ts +24 -0
  228. package/src/models/user.d.ts.map +1 -0
  229. package/src/models/user.js +27 -0
  230. package/src/models/user.js.map +1 -0
  231. package/src/mongo-application-concrete.d.ts +30 -0
  232. package/src/mongo-application-concrete.d.ts.map +1 -0
  233. package/src/mongo-application-concrete.js +46 -0
  234. package/src/mongo-application-concrete.js.map +1 -0
  235. package/src/plugins/index.d.ts +2 -0
  236. package/src/plugins/index.d.ts.map +1 -0
  237. package/src/plugins/index.js +5 -0
  238. package/src/plugins/index.js.map +1 -0
  239. package/src/plugins/mongo-database-plugin.d.ts +116 -0
  240. package/src/plugins/mongo-database-plugin.d.ts.map +1 -0
  241. package/src/plugins/mongo-database-plugin.js +230 -0
  242. package/src/plugins/mongo-database-plugin.js.map +1 -0
  243. package/src/routers/api.d.ts +29 -0
  244. package/src/routers/api.d.ts.map +1 -0
  245. package/src/routers/api.js +84 -0
  246. package/src/routers/api.js.map +1 -0
  247. package/src/routers/index.d.ts +2 -0
  248. package/src/routers/index.d.ts.map +1 -0
  249. package/src/routers/index.js +5 -0
  250. package/src/routers/index.js.map +1 -0
  251. package/src/schemas/email-token.d.ts +65 -0
  252. package/src/schemas/email-token.d.ts.map +1 -0
  253. package/src/schemas/email-token.js +68 -0
  254. package/src/schemas/email-token.js.map +1 -0
  255. package/src/schemas/index.d.ts +8 -0
  256. package/src/schemas/index.d.ts.map +1 -0
  257. package/src/schemas/index.js +11 -0
  258. package/src/schemas/index.js.map +1 -0
  259. package/src/schemas/mnemonic.d.ts +37 -0
  260. package/src/schemas/mnemonic.d.ts.map +1 -0
  261. package/src/schemas/mnemonic.js +41 -0
  262. package/src/schemas/mnemonic.js.map +1 -0
  263. package/src/schemas/role.d.ts +57 -0
  264. package/src/schemas/role.d.ts.map +1 -0
  265. package/src/schemas/role.js +102 -0
  266. package/src/schemas/role.js.map +1 -0
  267. package/src/schemas/schema.d.ts +62 -0
  268. package/src/schemas/schema.d.ts.map +1 -0
  269. package/src/schemas/schema.js +81 -0
  270. package/src/schemas/schema.js.map +1 -0
  271. package/src/schemas/used-direct-login-token.d.ts +49 -0
  272. package/src/schemas/used-direct-login-token.d.ts.map +1 -0
  273. package/src/schemas/used-direct-login-token.js +35 -0
  274. package/src/schemas/used-direct-login-token.js.map +1 -0
  275. package/src/schemas/user-role.d.ts +52 -0
  276. package/src/schemas/user-role.d.ts.map +1 -0
  277. package/src/schemas/user-role.js +67 -0
  278. package/src/schemas/user-role.js.map +1 -0
  279. package/src/schemas/user.d.ts +43 -0
  280. package/src/schemas/user.d.ts.map +1 -0
  281. package/src/schemas/user.js +214 -0
  282. package/src/schemas/user.js.map +1 -0
  283. package/src/services/backup-code.d.ts +118 -0
  284. package/src/services/backup-code.d.ts.map +1 -0
  285. package/src/services/backup-code.js +320 -0
  286. package/src/services/backup-code.js.map +1 -0
  287. package/src/services/database-initialization.d.ts +137 -0
  288. package/src/services/database-initialization.d.ts.map +1 -0
  289. package/src/services/database-initialization.js +911 -0
  290. package/src/services/database-initialization.js.map +1 -0
  291. package/src/services/db-init-cache.d.ts +18 -0
  292. package/src/services/db-init-cache.d.ts.map +1 -0
  293. package/src/services/db-init-cache.js +7 -0
  294. package/src/services/db-init-cache.js.map +1 -0
  295. package/src/services/direct-login-token.d.ts +28 -0
  296. package/src/services/direct-login-token.d.ts.map +1 -0
  297. package/src/services/direct-login-token.js +62 -0
  298. package/src/services/direct-login-token.js.map +1 -0
  299. package/src/services/index.d.ts +17 -0
  300. package/src/services/index.d.ts.map +1 -0
  301. package/src/services/index.js +20 -0
  302. package/src/services/index.js.map +1 -0
  303. package/src/services/jwt.d.ts +20 -0
  304. package/src/services/jwt.d.ts.map +1 -0
  305. package/src/services/jwt.js +79 -0
  306. package/src/services/jwt.js.map +1 -0
  307. package/src/services/mnemonic.d.ts +30 -0
  308. package/src/services/mnemonic.d.ts.map +1 -0
  309. package/src/services/mnemonic.js +80 -0
  310. package/src/services/mnemonic.js.map +1 -0
  311. package/src/services/mongo-authentication-provider.d.ts +27 -0
  312. package/src/services/mongo-authentication-provider.d.ts.map +1 -0
  313. package/src/services/mongo-authentication-provider.js +97 -0
  314. package/src/services/mongo-authentication-provider.js.map +1 -0
  315. package/src/services/mongo-backup-code-store.d.ts +40 -0
  316. package/src/services/mongo-backup-code-store.d.ts.map +1 -0
  317. package/src/services/mongo-backup-code-store.js +104 -0
  318. package/src/services/mongo-backup-code-store.js.map +1 -0
  319. package/src/services/mongo-base.d.ts +24 -0
  320. package/src/services/mongo-base.d.ts.map +1 -0
  321. package/src/services/mongo-base.js +28 -0
  322. package/src/services/mongo-base.js.map +1 -0
  323. package/src/services/mongoose-collection.d.ts +52 -0
  324. package/src/services/mongoose-collection.d.ts.map +1 -0
  325. package/src/services/mongoose-collection.js +326 -0
  326. package/src/services/mongoose-collection.js.map +1 -0
  327. package/src/services/mongoose-database.d.ts +64 -0
  328. package/src/services/mongoose-database.d.ts.map +1 -0
  329. package/src/services/mongoose-database.js +121 -0
  330. package/src/services/mongoose-database.js.map +1 -0
  331. package/src/services/mongoose-document-store.d.ts +108 -0
  332. package/src/services/mongoose-document-store.d.ts.map +1 -0
  333. package/src/services/mongoose-document-store.js +265 -0
  334. package/src/services/mongoose-document-store.js.map +1 -0
  335. package/src/services/mongoose-session-adapter.d.ts +39 -0
  336. package/src/services/mongoose-session-adapter.d.ts.map +1 -0
  337. package/src/services/mongoose-session-adapter.js +63 -0
  338. package/src/services/mongoose-session-adapter.js.map +1 -0
  339. package/src/services/request-user.d.ts +22 -0
  340. package/src/services/request-user.d.ts.map +1 -0
  341. package/src/services/request-user.js +66 -0
  342. package/src/services/request-user.js.map +1 -0
  343. package/src/services/role.d.ts +97 -0
  344. package/src/services/role.d.ts.map +1 -0
  345. package/src/services/role.js +288 -0
  346. package/src/services/role.js.map +1 -0
  347. package/src/services/user.d.ts +362 -0
  348. package/src/services/user.d.ts.map +1 -0
  349. package/src/services/user.js +1504 -0
  350. package/src/services/user.js.map +1 -0
  351. package/src/testing.d.ts +9 -0
  352. package/src/testing.d.ts.map +1 -0
  353. package/src/testing.js +12 -0
  354. package/src/testing.js.map +1 -0
  355. package/src/transactions/index.d.ts +2 -0
  356. package/src/transactions/index.d.ts.map +1 -0
  357. package/src/transactions/index.js +5 -0
  358. package/src/transactions/index.js.map +1 -0
  359. package/src/transactions/transaction-manager.d.ts +37 -0
  360. package/src/transactions/transaction-manager.d.ts.map +1 -0
  361. package/src/transactions/transaction-manager.js +50 -0
  362. package/src/transactions/transaction-manager.js.map +1 -0
  363. package/src/types/index.d.ts +26 -0
  364. package/src/types/index.d.ts.map +1 -0
  365. package/src/types/index.js +9 -0
  366. package/src/types/index.js.map +1 -0
  367. package/src/types/mongoose-helpers.d.ts +16 -0
  368. package/src/types/mongoose-helpers.d.ts.map +1 -0
  369. package/src/types/mongoose-helpers.js +8 -0
  370. package/src/types/mongoose-helpers.js.map +1 -0
  371. package/src/utils/default-mongo-uri-validator.d.ts +15 -0
  372. package/src/utils/default-mongo-uri-validator.d.ts.map +1 -0
  373. package/src/utils/default-mongo-uri-validator.js +46 -0
  374. package/src/utils/default-mongo-uri-validator.js.map +1 -0
  375. package/src/utils/index.d.ts +5 -0
  376. package/src/utils/index.d.ts.map +1 -0
  377. package/src/utils/index.js +8 -0
  378. package/src/utils/index.js.map +1 -0
  379. package/src/utils/mongo-error-response.d.ts +17 -0
  380. package/src/utils/mongo-error-response.d.ts.map +1 -0
  381. package/src/utils/mongo-error-response.js +21 -0
  382. package/src/utils/mongo-error-response.js.map +1 -0
  383. package/src/utils/mongo-transaction.d.ts +39 -0
  384. package/src/utils/mongo-transaction.d.ts.map +1 -0
  385. package/src/utils/mongo-transaction.js +131 -0
  386. package/src/utils/mongo-transaction.js.map +1 -0
  387. package/src/utils/object-id.d.ts +11 -0
  388. package/src/utils/object-id.d.ts.map +1 -0
  389. package/src/utils/object-id.js +17 -0
  390. package/src/utils/object-id.js.map +1 -0
@@ -0,0 +1,320 @@
1
+ "use strict";
2
+ /**
3
+ * @fileoverview Backup code service for secure account recovery.
4
+ * Implements v1.0.0 backup code scheme with Argon2id KDF and HKDF-SHA256 checksums.
5
+ *
6
+ * Storage-agnostic: accepts an optional {@link IBackupCodeStore} for persistence.
7
+ * When no store is provided, falls back to direct UserDocument manipulation
8
+ * (backward-compatible Mongoose path).
9
+ *
10
+ * @module services/backup-code
11
+ */
12
+ Object.defineProperty(exports, "__esModule", { value: true });
13
+ exports.BackupCodeService = void 0;
14
+ const ecies_lib_1 = require("@digitaldefiance/ecies-lib");
15
+ const node_ecies_lib_1 = require("@digitaldefiance/node-ecies-lib");
16
+ const suite_core_lib_1 = require("@digitaldefiance/suite-core-lib");
17
+ const crypto_1 = require("crypto");
18
+ const node_express_suite_1 = require("@digitaldefiance/node-express-suite");
19
+ const invalid_backup_code_version_1 = require("../errors/invalid-backup-code-version");
20
+ /**
21
+ * Service for backup code generation, validation, and key recovery.
22
+ * Implements secure backup code scheme with constant-time validation and key wrapping.
23
+ *
24
+ * Storage is abstracted via {@link IBackupCodeStore}. When a store is provided,
25
+ * all persistence goes through the store interface. When omitted, the service
26
+ * falls back to direct UserDocument manipulation for backward compatibility
27
+ * with existing Mongoose-based consumers.
28
+ *
29
+ * @template TID - Platform ID type (defaults to Buffer)
30
+ * @template TDate - Date type (defaults to Date)
31
+ * @template TTokenRole - Token role interface type
32
+ * @template TApplication - Application interface type
33
+ * @extends {BaseService<TID>}
34
+ */
35
+ class BackupCodeService extends node_express_suite_1.BaseService {
36
+ eciesService;
37
+ systemUser;
38
+ keyWrappingService;
39
+ roleService;
40
+ store;
41
+ /**
42
+ * Construct a BackupCodeService.
43
+ * @param application - The application instance
44
+ * @param eciesService - ECIES cryptographic service
45
+ * @param keyWrappingService - Key wrapping service for password-based key protection
46
+ * @param roleService - Role service for member type resolution
47
+ * @param store - Optional storage adapter. When omitted, falls back to direct
48
+ * UserDocument manipulation (Mongoose). Provide an IBackupCodeStore implementation
49
+ * for non-Mongoose backends (e.g. BrightDB).
50
+ */
51
+ constructor(application, eciesService, keyWrappingService, roleService, store) {
52
+ super(application);
53
+ this.eciesService = eciesService;
54
+ this.keyWrappingService = keyWrappingService;
55
+ this.roleService = roleService;
56
+ this.store = store;
57
+ }
58
+ /**
59
+ * Get the lazily-initialized system user for key wrapping/unwrapping.
60
+ */
61
+ getSystemUser() {
62
+ if (!this.systemUser) {
63
+ this.systemUser = node_express_suite_1.SystemUserService.getSystemUser(this.application.environment, this.application.constants);
64
+ }
65
+ return this.systemUser;
66
+ }
67
+ /**
68
+ * Forcibly set the system user (for database initialization)
69
+ * @param user
70
+ */
71
+ setSystemUser(user) {
72
+ this.systemUser = user;
73
+ }
74
+ // ── Pure crypto operations (no storage dependency) ─────────────────────
75
+ /**
76
+ * v1: Consume (validate and remove) a backup code via constant-time checksum match.
77
+ */
78
+ useBackupCodeV1(encryptedBackupCodes, backupCode) {
79
+ const normalizedCode = node_express_suite_1.BackupCode.normalizeCode(backupCode);
80
+ if (!node_express_suite_1.LocalhostConstants.BACKUP_CODES.NormalizedHexRegex.test(normalizedCode)) {
81
+ throw new suite_core_lib_1.InvalidBackupCodeError();
82
+ }
83
+ const codeBytes = Buffer.from(normalizedCode, 'utf8');
84
+ try {
85
+ for (const code of encryptedBackupCodes) {
86
+ if (code.version !== node_express_suite_1.BackupCode.BackupCodeVersion)
87
+ continue;
88
+ const checksumSalt = Buffer.from(code.checksumSalt, 'hex');
89
+ const expected = node_express_suite_1.BackupCode.hkdfSha256(codeBytes, checksumSalt, Buffer.from('backup-checksum'), 32);
90
+ if (code.checksum.length === expected.length * 2 &&
91
+ (0, crypto_1.timingSafeEqual)(Buffer.from(code.checksum, 'hex'), expected)) {
92
+ const checksumHex = expected.toString('hex');
93
+ return {
94
+ newCodesArray: encryptedBackupCodes.filter((c) => c.checksum !== checksumHex),
95
+ code,
96
+ };
97
+ }
98
+ }
99
+ throw new suite_core_lib_1.InvalidBackupCodeError();
100
+ }
101
+ finally {
102
+ codeBytes.fill(0);
103
+ }
104
+ }
105
+ /**
106
+ * Consume a backup code by first detecting the version and then dispatching to the appropriate handler.
107
+ */
108
+ useBackupCode(encryptedBackupCodes, backupCode) {
109
+ const version = node_express_suite_1.BackupCode.detectBackupCodeVersion(encryptedBackupCodes, backupCode);
110
+ switch (version) {
111
+ case node_express_suite_1.BackupCode.BackupCodeVersion:
112
+ return this.useBackupCodeV1(encryptedBackupCodes.filter((c) => c.version === node_express_suite_1.BackupCode.BackupCodeVersion), backupCode);
113
+ default:
114
+ throw new invalid_backup_code_version_1.InvalidBackupCodeVersionError(version);
115
+ }
116
+ }
117
+ // ── Storage-agnostic recovery ──────────────────────────────────────────
118
+ /**
119
+ * Recover a user's private key using a backup code.
120
+ * Storage-agnostic: uses IBackupCodeStore when available, otherwise
121
+ * falls back to the legacy UserDocument path.
122
+ *
123
+ * @param userOrId - Either a UserDocument (legacy) or a user ID (store-based)
124
+ * @param backupCode - The plaintext backup code
125
+ * @param newPassword - Optional new password to re-wrap the private key
126
+ * @param session - Optional database session for transactional consistency
127
+ */
128
+ async recoverKeyWithBackupCodeV1(userOrId, backupCode, newPassword, session) {
129
+ // Store-based path
130
+ if (this.store && !userOrId.save) {
131
+ return this._recoverViaStore(userOrId, backupCode, newPassword);
132
+ }
133
+ // Legacy Mongoose path
134
+ return this._recoverViaUserDoc(userOrId, backupCode, newPassword, session);
135
+ }
136
+ /**
137
+ * Recover a user's private key using a backup code (version-dispatched).
138
+ * Accepts either a UserDocument (legacy) or a user ID (store-based).
139
+ */
140
+ async recoverKeyWithBackupCode(userOrId, backupCode, newPassword, session) {
141
+ // Determine backup codes source
142
+ let backupCodes;
143
+ if (this.store && !userOrId.save) {
144
+ const record = await this.store.getUserRecord(userOrId);
145
+ if (!record)
146
+ throw new suite_core_lib_1.InvalidBackupCodeError();
147
+ backupCodes = record.backupCodes;
148
+ }
149
+ else {
150
+ backupCodes = userOrId.backupCodes;
151
+ }
152
+ const version = node_express_suite_1.BackupCode.detectBackupCodeVersion(backupCodes, backupCode);
153
+ switch (version) {
154
+ case node_express_suite_1.BackupCode.BackupCodeVersion:
155
+ return this.recoverKeyWithBackupCodeV1(userOrId, backupCode, newPassword, session);
156
+ default:
157
+ throw new invalid_backup_code_version_1.InvalidBackupCodeVersionError(version);
158
+ }
159
+ }
160
+ // ── Rewrap (key rotation) ─────────────────────────────────────────────
161
+ /**
162
+ * Rewrap system-wrapped AEAD blobs from old system key to new one.
163
+ *
164
+ * When a store is provided, uses the store's fetchBatch/updateUserRecord.
165
+ * Otherwise falls back to the legacy callback-based approach.
166
+ */
167
+ async rewrapAllUsersBackupCodes(fetchBatchOrOldSystem, saveUserOrNewSystem, oldSystemOrOptions, newSystemOrUndefined, options) {
168
+ // Detect which overload is being used
169
+ if (this.store && typeof fetchBatchOrOldSystem !== 'function') {
170
+ // Store-based: rewrapAllUsersBackupCodes(oldSystem, newSystem, options?)
171
+ return this._rewrapViaStore(fetchBatchOrOldSystem, saveUserOrNewSystem, oldSystemOrOptions);
172
+ }
173
+ // Legacy callback-based: rewrapAllUsersBackupCodes(fetchBatch, saveUser, oldSystem, newSystem, options?)
174
+ return this._rewrapViaCallbacks(fetchBatchOrOldSystem, saveUserOrNewSystem, oldSystemOrOptions, newSystemOrUndefined, options);
175
+ }
176
+ // ── Private: store-based recovery ─────────────────────────────────────
177
+ async _recoverViaStore(userId, backupCode, newPassword) {
178
+ const store = this.store;
179
+ const record = await store.getUserRecord(userId);
180
+ if (!record)
181
+ throw new suite_core_lib_1.InvalidBackupCodeError();
182
+ const normalizedCode = node_express_suite_1.BackupCode.normalizeCode(backupCode);
183
+ const { code, newCodesArray } = this.useBackupCodeV1(record.backupCodes, normalizedCode);
184
+ let decryptionKey;
185
+ try {
186
+ const adminMember = this.getSystemUser();
187
+ decryptionKey = await node_express_suite_1.BackupCode.getBackupKeyV1(code.checksumSalt, normalizedCode, this.application.constants);
188
+ const privateKeyUnwrapped = await adminMember.decryptData(Buffer.from(code.encrypted, 'hex'));
189
+ const decryptedPrivateKey = new ecies_lib_1.SecureBuffer(node_express_suite_1.SymmetricService.decryptBuffer(privateKeyUnwrapped, decryptionKey));
190
+ const memberType = await store.getMemberType(userId);
191
+ const user = new node_ecies_lib_1.Member(this.eciesService, memberType, record.username, new ecies_lib_1.EmailString(record.email), Buffer.from(record.publicKey, 'hex'), decryptedPrivateKey, undefined, record._id, new Date(record.createdAt), new Date(record.updatedAt));
192
+ const updates = {
193
+ backupCodes: newCodesArray,
194
+ };
195
+ if (newPassword) {
196
+ updates.passwordWrappedPrivateKey = this.keyWrappingService.wrapSecret(decryptedPrivateKey, newPassword, this.application.constants);
197
+ }
198
+ await store.updateUserRecord(userId, updates);
199
+ // Update the record in-place for the caller
200
+ record.backupCodes = newCodesArray;
201
+ if (updates.passwordWrappedPrivateKey) {
202
+ record.passwordWrappedPrivateKey = updates.passwordWrappedPrivateKey;
203
+ }
204
+ return { userRecord: record, user, codeCount: newCodesArray.length };
205
+ }
206
+ finally {
207
+ if (decryptionKey)
208
+ decryptionKey.fill(0);
209
+ }
210
+ }
211
+ // ── Private: legacy Mongoose recovery ─────────────────────────────────
212
+ async _recoverViaUserDoc(userDoc, backupCode, newPassword, session) {
213
+ const normalizedCode = node_express_suite_1.BackupCode.normalizeCode(backupCode);
214
+ return await this.withTransaction(async (_sess) => {
215
+ const sess = _sess;
216
+ const { code, newCodesArray } = this.useBackupCodeV1(userDoc.backupCodes, normalizedCode);
217
+ userDoc.backupCodes = newCodesArray;
218
+ let decryptionKey;
219
+ try {
220
+ const adminMember = this.getSystemUser();
221
+ decryptionKey = await node_express_suite_1.BackupCode.getBackupKeyV1(code.checksumSalt, normalizedCode, this.application.constants);
222
+ const privateKeyUnwrapped = await adminMember.decryptData(Buffer.from(code.encrypted, 'hex'));
223
+ const decryptedPrivateKey = new ecies_lib_1.SecureBuffer(node_express_suite_1.SymmetricService.decryptBuffer(privateKeyUnwrapped, decryptionKey));
224
+ const memberType = await this.roleService.getMemberType(userDoc, session);
225
+ const user = new node_ecies_lib_1.Member(this.eciesService, memberType, userDoc.username, new ecies_lib_1.EmailString(userDoc.email), Buffer.from(userDoc.publicKey, 'hex'), decryptedPrivateKey, undefined, userDoc._id, new Date(userDoc.createdAt), new Date(userDoc.updatedAt));
226
+ if (!newPassword) {
227
+ await userDoc.save({ session: sess });
228
+ return {
229
+ userDoc,
230
+ user,
231
+ codeCount: newCodesArray.length,
232
+ };
233
+ }
234
+ const wrapped = this.keyWrappingService.wrapSecret(decryptedPrivateKey, newPassword, this.application.constants);
235
+ userDoc.passwordWrappedPrivateKey = wrapped;
236
+ await userDoc.save({ session: sess });
237
+ return { userDoc, user, codeCount: newCodesArray.length };
238
+ }
239
+ finally {
240
+ if (decryptionKey)
241
+ decryptionKey.fill(0);
242
+ }
243
+ }, session, {
244
+ timeoutMs: this.application.environment.mongo.transactionTimeout * 5,
245
+ });
246
+ }
247
+ // ── Private: store-based rewrap ───────────────────────────────────────
248
+ async _rewrapViaStore(oldSystem, newSystem, options) {
249
+ const store = this.store;
250
+ const batchSize = options?.batchSize ?? 500;
251
+ let processed = 0;
252
+ let afterId;
253
+ for (;;) {
254
+ const records = await store.fetchBatch(afterId, batchSize);
255
+ if (!records.length)
256
+ break;
257
+ for (const record of records) {
258
+ let modified = false;
259
+ for (const bc of record.backupCodes ?? []) {
260
+ try {
261
+ const sealed = await oldSystem.decryptData(Buffer.from(bc.encrypted, 'hex'));
262
+ const rewrapped = (await newSystem.encryptData(sealed)).toString('hex');
263
+ if (rewrapped !== bc.encrypted) {
264
+ bc.encrypted = rewrapped;
265
+ modified = true;
266
+ }
267
+ }
268
+ catch (e) {
269
+ throw new Error(`Failed to rewrap backup code for user ${record._id}: ${e.message}`);
270
+ }
271
+ }
272
+ if (modified) {
273
+ await store.updateUserRecord(record._id, {
274
+ backupCodes: record.backupCodes,
275
+ });
276
+ processed++;
277
+ options?.onProgress?.(processed);
278
+ }
279
+ }
280
+ afterId = records[records.length - 1]?._id?.toString() ?? undefined;
281
+ }
282
+ return processed;
283
+ }
284
+ // ── Private: legacy callback-based rewrap ─────────────────────────────
285
+ async _rewrapViaCallbacks(fetchBatch, saveUser, oldSystem, newSystem, options) {
286
+ const batchSize = options?.batchSize ?? 500;
287
+ let processed = 0;
288
+ let afterId;
289
+ for (;;) {
290
+ const users = await fetchBatch(afterId, batchSize);
291
+ if (!users.length)
292
+ break;
293
+ for (const user of users) {
294
+ let modified = false;
295
+ for (const bc of user.backupCodes ?? []) {
296
+ try {
297
+ const sealed = await oldSystem.decryptData(Buffer.from(bc.encrypted, 'hex'));
298
+ const rewrapped = (await newSystem.encryptData(sealed)).toString('hex');
299
+ if (rewrapped !== bc.encrypted) {
300
+ bc.encrypted = rewrapped;
301
+ modified = true;
302
+ }
303
+ }
304
+ catch (e) {
305
+ throw new Error(`Failed to rewrap backup code for user ${user._id}: ${e.message}`);
306
+ }
307
+ }
308
+ if (modified) {
309
+ await saveUser(user);
310
+ processed++;
311
+ options?.onProgress?.(processed);
312
+ }
313
+ }
314
+ afterId = users[users.length - 1]?._id?.toString() ?? undefined;
315
+ }
316
+ return processed;
317
+ }
318
+ }
319
+ exports.BackupCodeService = BackupCodeService;
320
+ //# sourceMappingURL=backup-code.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"backup-code.js","sourceRoot":"","sources":["../../../../../packages/digitaldefiance-node-express-suite-mongo/src/services/backup-code.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,137 @@
1
+ /**
2
+ * @fileoverview Service for initializing the database with default users, roles, and relationships.
3
+ * Handles creation of system, admin, and member users with encrypted credentials and backup codes.
4
+ * @module services/database-initialization
5
+ */
6
+ import { EmailString, MemberType, SecureString } from '@digitaldefiance/ecies-lib';
7
+ import { Connection } from '@digitaldefiance/mongoose-types';
8
+ import { Member as BackendMember, ECIESService, PlatformID } from '@digitaldefiance/node-ecies-lib';
9
+ import { IFailableResult } from '@digitaldefiance/suite-core-lib';
10
+ import { BackupCode, KeyWrappingService } from '@digitaldefiance/node-express-suite';
11
+ import { MnemonicService } from './mnemonic';
12
+ import { IServerInitResult } from '../interfaces/server-init-result';
13
+ import { IDBInitResult } from '../interfaces';
14
+ import { IMongoApplication } from '../interfaces/mongo-application';
15
+ import { BackupCodeService } from './backup-code';
16
+ import { RoleService } from './role';
17
+ /**
18
+ * Service for initializing the database with default users, roles, and relationships.
19
+ * Manages creation of system, admin, and member accounts with encrypted credentials.
20
+ */
21
+ export declare abstract class DatabaseInitializationService {
22
+ /**
23
+ * Static initialization state management to prevent concurrent initialization.
24
+ * @private
25
+ */
26
+ protected static initializationPromises: Map<string, Promise<IFailableResult<IServerInitResult<Buffer<ArrayBufferLike>>>>>;
27
+ /** Initialization lock to prevent race conditions */
28
+ protected static initializationLock: Map<string, boolean>;
29
+ /**
30
+ * Default i18n translation function for database initialization messages.
31
+ * @param str String key to translate
32
+ * @param variables Template variables
33
+ * @param language Target language
34
+ * @param application Application instance
35
+ * @returns Translated string
36
+ */
37
+ protected static defaultI18nTFunc(str: string, variables?: Record<string, unknown>, language?: string, application?: IMongoApplication): string;
38
+ /**
39
+ * Gets the mnemonic or generates a new one if not present.
40
+ * @template TID Platform-specific ID type
41
+ * @param mnemonic Existing mnemonic or undefined
42
+ * @param eciesService ECIES service to generate a new mnemonic
43
+ * @returns Existing or new mnemonic
44
+ */
45
+ static mnemonicOrNew<TID extends PlatformID = Buffer>(mnemonic: SecureString | undefined, eciesService: ECIESService<TID>): SecureString;
46
+ /**
47
+ * Generates a cache key for a user based on their details.
48
+ * @template TID Platform-specific ID type
49
+ * @param username Username
50
+ * @param email Email address
51
+ * @param mnemonic Mnemonic
52
+ * @param id User ID
53
+ * @returns Generated cache key as hex string
54
+ */
55
+ static cacheKey<TID extends PlatformID = Buffer>(username: string, email: EmailString, mnemonic: SecureString, id: TID): string;
56
+ /**
57
+ * Gets a cached BackendMember or creates a new one if not cached.
58
+ * @template TID Platform-specific ID type
59
+ * @param username Username
60
+ * @param email Email address
61
+ * @param mnemonic Mnemonic or undefined to generate a new one
62
+ * @param memberType Type of member (Admin, Member, System)
63
+ * @param eciesService ECIES service to handle key generation
64
+ * @param memberId Optional specific member ID to use
65
+ * @param createdBy Optional ID of the user who created this member
66
+ * @returns Cached or newly created BackendMember and the mnemonic used
67
+ */
68
+ static cacheOrNew<TID extends PlatformID = Buffer>(username: string, email: EmailString, mnemonic: SecureString | undefined, memberType: MemberType, eciesService: ECIESService<TID>, memberId?: TID, createdBy?: TID): {
69
+ member: BackendMember<TID>;
70
+ mnemonic: SecureString;
71
+ };
72
+ /**
73
+ * Generates a random password meeting security requirements.
74
+ * @param length Length of the password
75
+ * @returns Generated password string
76
+ */
77
+ static generatePassword(length: number): string;
78
+ /**
79
+ * Drops the database.
80
+ * @param connection Database connection
81
+ * @returns True if the database was dropped, false if not connected
82
+ */
83
+ static dropDatabase(connection: Connection): Promise<boolean>;
84
+ static getInitOptions<TID extends PlatformID = Buffer>(application: IMongoApplication<TID>): {
85
+ adminId?: TID;
86
+ adminMnemonic?: SecureString;
87
+ adminPassword?: SecureString;
88
+ adminRoleId?: TID;
89
+ adminUserRoleId?: TID;
90
+ adminBackupCodes?: BackupCode[];
91
+ memberId?: TID;
92
+ memberMnemonic?: SecureString;
93
+ memberPassword?: SecureString;
94
+ memberRoleId?: TID;
95
+ memberUserRoleId?: TID;
96
+ memberBackupCodes?: BackupCode[];
97
+ systemId?: TID;
98
+ systemMnemonic?: SecureString;
99
+ systemPassword?: SecureString;
100
+ systemRoleId?: TID;
101
+ systemUserRoleId?: TID;
102
+ systemBackupCodes?: BackupCode[];
103
+ };
104
+ static serverInitResultHash<TID extends PlatformID = Buffer>(serverInitResult: IServerInitResult<TID>): string;
105
+ /**
106
+ * Initializes the user database with default users and roles using dependency injection.
107
+ * @template TID Platform-specific ID type
108
+ * @param application Application instance
109
+ * @param keyWrappingService Key wrapping service
110
+ * @param mnemonicService Mnemonic service
111
+ * @param eciesService ECIES service
112
+ * @param roleService Role service
113
+ * @param backupCodeService Backup code service
114
+ * @returns Result of the initialization
115
+ */
116
+ static initUserDbWithServices<TID extends PlatformID = Buffer>(application: IMongoApplication<TID>, keyWrappingService: KeyWrappingService, mnemonicService: MnemonicService<TID>, eciesService: ECIESService<TID>, roleService: RoleService<TID>, backupCodeService: BackupCodeService<TID>): Promise<IDBInitResult<IServerInitResult<TID>>>;
117
+ static serverInitResultsToDotEnv<TID extends PlatformID = Buffer>(serverInitResult: IServerInitResult<TID>): string;
118
+ static printServerInitResults<TID extends PlatformID = Buffer>(result: IServerInitResult<TID>, printDotEnv?: boolean): void;
119
+ static setEnvFromInitResults<TID extends PlatformID = Buffer>(result: IServerInitResult<TID>): void;
120
+ /**
121
+ * Write initialization results to a .env file
122
+ * Updates or adds the credential variables in the specified .env file
123
+ * @param envFilePath Path to the .env file to update
124
+ * @param result The initialization results containing credentials
125
+ * @param idToString Function to convert IDs to strings
126
+ */
127
+ static writeEnvFile<TID extends PlatformID = Buffer>(envFilePath: string, result: IServerInitResult<TID>): void;
128
+ /**
129
+ * Initializes the user database with default users and roles (convenience method).
130
+ * Creates necessary services and calls initUserDbWithServices.
131
+ * @template TID Platform-specific ID type
132
+ * @param application Application instance
133
+ * @returns Result of the initialization
134
+ */
135
+ static initUserDb<TID extends PlatformID = Buffer>(application: IMongoApplication<TID>): Promise<IFailableResult<IServerInitResult<TID>>>;
136
+ }
137
+ //# sourceMappingURL=database-initialization.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"database-initialization.d.ts","sourceRoot":"","sources":["../../../../../packages/digitaldefiance-node-express-suite-mongo/src/services/database-initialization.ts"],"names":[],"mappings":"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"}