@ibgib/node-gib 0.0.14 → 0.0.17

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 (218) hide show
  1. package/data/identity_index/email/hashes/32/13/49/e64f32730f01a61ada211f29eaf0a210fc2386b668ad04d7e8a9b16766.json +4 -0
  2. package/dist/email/email-helpers.d.mts.map +1 -1
  3. package/dist/email/email-helpers.mjs.map +1 -1
  4. package/dist/email/index.d.mts +3 -0
  5. package/dist/email/index.d.mts.map +1 -1
  6. package/dist/email/index.mjs +3 -0
  7. package/dist/email/index.mjs.map +1 -1
  8. package/dist/email/verify/email-verify-constants.d.mts +3 -0
  9. package/dist/email/verify/email-verify-constants.d.mts.map +1 -0
  10. package/dist/email/verify/email-verify-constants.mjs +3 -0
  11. package/dist/email/verify/email-verify-constants.mjs.map +1 -0
  12. package/dist/email/verify/email-verify-helpers.d.mts +107 -0
  13. package/dist/email/verify/email-verify-helpers.d.mts.map +1 -0
  14. package/dist/email/verify/email-verify-helpers.mjs +357 -0
  15. package/dist/email/verify/email-verify-helpers.mjs.map +1 -0
  16. package/dist/email/verify/email-verify-types.d.mts +41 -0
  17. package/dist/email/verify/email-verify-types.d.mts.map +1 -0
  18. package/dist/email/verify/email-verify-types.mjs +2 -0
  19. package/dist/email/verify/email-verify-types.mjs.map +1 -0
  20. package/dist/identity/sso/custodian-auth-helpers.d.mts +45 -0
  21. package/dist/identity/sso/custodian-auth-helpers.d.mts.map +1 -0
  22. package/dist/identity/sso/custodian-auth-helpers.mjs +108 -0
  23. package/dist/identity/sso/custodian-auth-helpers.mjs.map +1 -0
  24. package/dist/identity/sso/sso-config-helper.d.mts +7 -0
  25. package/dist/identity/sso/sso-config-helper.d.mts.map +1 -0
  26. package/dist/identity/sso/sso-config-helper.mjs +42 -0
  27. package/dist/identity/sso/sso-config-helper.mjs.map +1 -0
  28. package/dist/identity/sso/sso-custodian-service.d.mts +139 -0
  29. package/dist/identity/sso/sso-custodian-service.d.mts.map +1 -0
  30. package/dist/identity/sso/sso-custodian-service.mjs +471 -0
  31. package/dist/identity/sso/sso-custodian-service.mjs.map +1 -0
  32. package/dist/identity/sso/sso-types.d.mts +71 -0
  33. package/dist/identity/sso/sso-types.d.mts.map +1 -0
  34. package/dist/identity/sso/sso-types.mjs +7 -0
  35. package/dist/identity/sso/sso-types.mjs.map +1 -0
  36. package/dist/index.d.mts +5 -1
  37. package/dist/index.d.mts.map +1 -1
  38. package/dist/index.mjs +5 -1
  39. package/dist/index.mjs.map +1 -1
  40. package/dist/serve-gib/handlers/api/email/email-outbound.handler.d.mts.map +1 -1
  41. package/dist/serve-gib/handlers/api/email/email-outbound.handler.mjs +9 -2
  42. package/dist/serve-gib/handlers/api/email/email-outbound.handler.mjs.map +1 -1
  43. package/dist/serve-gib/handlers/api/email/email-verification-code.handler.d.mts +29 -0
  44. package/dist/serve-gib/handlers/api/email/email-verification-code.handler.d.mts.map +1 -0
  45. package/dist/serve-gib/handlers/api/email/email-verification-code.handler.mjs +149 -0
  46. package/dist/serve-gib/handlers/api/email/email-verification-code.handler.mjs.map +1 -0
  47. package/dist/serve-gib/handlers/api/email/email-verify-code-onetime.handler.d.mts +24 -0
  48. package/dist/serve-gib/handlers/api/email/email-verify-code-onetime.handler.d.mts.map +1 -0
  49. package/dist/serve-gib/handlers/api/email/email-verify-code-onetime.handler.mjs +212 -0
  50. package/dist/serve-gib/handlers/api/email/email-verify-code-onetime.handler.mjs.map +1 -0
  51. package/dist/serve-gib/handlers/api/identity/keystone-custodian-genesis.handler.d.mts +37 -0
  52. package/dist/serve-gib/handlers/api/identity/keystone-custodian-genesis.handler.d.mts.map +1 -0
  53. package/dist/serve-gib/handlers/api/identity/keystone-custodian-genesis.handler.mjs +192 -0
  54. package/dist/serve-gib/handlers/api/identity/keystone-custodian-genesis.handler.mjs.map +1 -0
  55. package/dist/serve-gib/handlers/api/identity/keystone-custodian-register-delegate.handler.d.mts +33 -0
  56. package/dist/serve-gib/handlers/api/identity/keystone-custodian-register-delegate.handler.d.mts.map +1 -0
  57. package/dist/serve-gib/handlers/api/identity/keystone-custodian-register-delegate.handler.mjs +173 -0
  58. package/dist/serve-gib/handlers/api/identity/keystone-custodian-register-delegate.handler.mjs.map +1 -0
  59. package/dist/serve-gib/handlers/api/keystone/keystone-check-email.handler.d.mts.map +1 -1
  60. package/dist/serve-gib/handlers/api/keystone/keystone-check-email.handler.mjs +2 -3
  61. package/dist/serve-gib/handlers/api/keystone/keystone-check-email.handler.mjs.map +1 -1
  62. package/dist/serve-gib/handlers/api/keystone/keystone-evolve.handler.d.mts.map +1 -1
  63. package/dist/serve-gib/handlers/api/keystone/keystone-evolve.handler.mjs +38 -3
  64. package/dist/serve-gib/handlers/api/keystone/keystone-evolve.handler.mjs.map +1 -1
  65. package/dist/serve-gib/handlers/api/keystone/keystone-genesis.handler.d.mts.map +1 -1
  66. package/dist/serve-gib/handlers/api/keystone/keystone-genesis.handler.mjs +54 -24
  67. package/dist/serve-gib/handlers/api/keystone/keystone-genesis.handler.mjs.map +1 -1
  68. package/dist/serve-gib/handlers/api/keystone/keystone-lookup.handler.d.mts.map +1 -1
  69. package/dist/serve-gib/handlers/api/keystone/keystone-lookup.handler.mjs +13 -13
  70. package/dist/serve-gib/handlers/api/keystone/keystone-lookup.handler.mjs.map +1 -1
  71. package/dist/serve-gib/handlers/api/keystone/keystone-post.handler.mjs +1 -1
  72. package/dist/serve-gib/handlers/api/keystone/keystone-post.handler.mjs.map +1 -1
  73. package/dist/serve-gib/handlers/api/keystone/sso-config.handler.mjs +3 -3
  74. package/dist/serve-gib/handlers/api/keystone/sso-config.handler.mjs.map +1 -1
  75. package/dist/serve-gib/handlers/api/keystone/sso-link.handler.d.mts.map +1 -1
  76. package/dist/serve-gib/handlers/api/keystone/sso-link.handler.mjs +28 -15
  77. package/dist/serve-gib/handlers/api/keystone/sso-link.handler.mjs.map +1 -1
  78. package/dist/serve-gib/handlers/api/keystone/sso-login.handler.d.mts +29 -15
  79. package/dist/serve-gib/handlers/api/keystone/sso-login.handler.d.mts.map +1 -1
  80. package/dist/serve-gib/handlers/api/keystone/sso-login.handler.mjs +105 -108
  81. package/dist/serve-gib/handlers/api/keystone/sso-login.handler.mjs.map +1 -1
  82. package/dist/serve-gib/identity-index/identity-index-constants.d.mts +3 -2
  83. package/dist/serve-gib/identity-index/identity-index-constants.d.mts.map +1 -1
  84. package/dist/serve-gib/identity-index/identity-index-constants.mjs +4 -2
  85. package/dist/serve-gib/identity-index/identity-index-constants.mjs.map +1 -1
  86. package/dist/serve-gib/identity-index/identity-index-helpers.d.mts.map +1 -1
  87. package/dist/serve-gib/identity-index/identity-index-helpers.mjs +28 -11
  88. package/dist/serve-gib/identity-index/identity-index-helpers.mjs.map +1 -1
  89. package/dist/serve-gib/identity-index/identity-index-service.d.mts +20 -3
  90. package/dist/serve-gib/identity-index/identity-index-service.d.mts.map +1 -1
  91. package/dist/serve-gib/identity-index/identity-index-service.mjs +134 -18
  92. package/dist/serve-gib/identity-index/identity-index-service.mjs.map +1 -1
  93. package/dist/serve-gib/identity-index/identity-index-types.d.mts +4 -2
  94. package/dist/serve-gib/identity-index/identity-index-types.d.mts.map +1 -1
  95. package/dist/serve-gib/index.d.mts +4 -0
  96. package/dist/serve-gib/index.d.mts.map +1 -1
  97. package/dist/serve-gib/index.mjs +12 -0
  98. package/dist/serve-gib/index.mjs.map +1 -1
  99. package/dist/serve-gib/path-constants.d.mts +17 -0
  100. package/dist/serve-gib/path-constants.d.mts.map +1 -1
  101. package/dist/serve-gib/path-constants.mjs +17 -0
  102. package/dist/serve-gib/path-constants.mjs.map +1 -1
  103. package/e2e/identity-custodian-lifecycle.e2e.md +93 -0
  104. package/e2e/identity-sso-lifecycle.e2e.md +132 -0
  105. package/package.json +5 -5
  106. package/src/email/email-helpers.mts +0 -1
  107. package/src/email/index.mts +3 -0
  108. package/src/email/verify/email-verify-constants.mts +3 -0
  109. package/src/email/verify/email-verify-helpers.mts +466 -0
  110. package/src/email/verify/email-verify-types.mts +47 -0
  111. package/src/identity/sso/custodian-auth-helpers.mts +146 -0
  112. package/src/identity/sso/custodian-auth-helpers.respec.mts +97 -0
  113. package/src/identity/sso/sso-config-helper.mts +52 -0
  114. package/src/identity/sso/sso-custodian-service.mts +566 -0
  115. package/src/identity/sso/sso-custodian-service.respec.mts +297 -0
  116. package/src/identity/sso/sso-types.mts +80 -0
  117. package/src/index.mts +14 -0
  118. package/src/serve-gib/handlers/api/email/email-outbound.handler.mts +8 -2
  119. package/src/serve-gib/handlers/api/email/email-verification-code.handler.mts +163 -0
  120. package/src/serve-gib/handlers/api/email/email-verify-code-onetime.handler.mts +231 -0
  121. package/src/serve-gib/handlers/api/email/email-verify.respec.mts +183 -0
  122. package/src/serve-gib/handlers/api/identity/keystone-custodian-genesis.handler.mts +233 -0
  123. package/src/serve-gib/handlers/api/identity/keystone-custodian-genesis.respec.mts +93 -0
  124. package/src/serve-gib/handlers/api/identity/keystone-custodian-register-delegate.handler.mts +210 -0
  125. package/src/serve-gib/handlers/api/identity/keystone-custodian-register-delegate.respec.mts +112 -0
  126. package/src/serve-gib/handlers/api/keystone/keystone-check-email.handler.mts +2 -4
  127. package/src/serve-gib/handlers/api/keystone/keystone-evolve.handler.mts +42 -3
  128. package/src/serve-gib/handlers/api/keystone/keystone-genesis.handler.mts +46 -23
  129. package/src/serve-gib/handlers/api/keystone/keystone-lookup.handler.mts +11 -15
  130. package/src/serve-gib/handlers/api/keystone/keystone-post.handler.mts +1 -1
  131. package/src/serve-gib/handlers/api/keystone/sso-config.handler.mts +3 -3
  132. package/src/serve-gib/handlers/api/keystone/sso-link.handler.mts +29 -17
  133. package/src/serve-gib/handlers/api/keystone/sso-login.handler.mts +132 -125
  134. package/src/serve-gib/identity-index/identity-index-constants.mts +5 -2
  135. package/src/serve-gib/identity-index/identity-index-helpers.mts +26 -12
  136. package/src/serve-gib/identity-index/identity-index-service.mts +133 -16
  137. package/src/serve-gib/identity-index/identity-index-service.respec.mts +1 -1
  138. package/src/serve-gib/identity-index/identity-index-types.mts +4 -2
  139. package/src/serve-gib/index.mts +12 -0
  140. package/src/serve-gib/path-constants.mts +20 -0
  141. package/tsconfig.json +2 -2
  142. package/tsconfig.test.json +1 -1
  143. package/dist/assumptions.respec.d.mts +0 -2
  144. package/dist/assumptions.respec.d.mts.map +0 -1
  145. package/dist/assumptions.respec.mjs +0 -41
  146. package/dist/assumptions.respec.mjs.map +0 -1
  147. package/dist/email/email-service.respec.d.mts +0 -2
  148. package/dist/email/email-service.respec.d.mts.map +0 -1
  149. package/dist/email/email-service.respec.mjs +0 -115
  150. package/dist/email/email-service.respec.mjs.map +0 -1
  151. package/dist/serve-gib/bootstrap-helper.respec.d.mts +0 -2
  152. package/dist/serve-gib/bootstrap-helper.respec.d.mts.map +0 -1
  153. package/dist/serve-gib/bootstrap-helper.respec.mjs +0 -85
  154. package/dist/serve-gib/bootstrap-helper.respec.mjs.map +0 -1
  155. package/dist/serve-gib/handlers/api/health.respec.d.mts +0 -2
  156. package/dist/serve-gib/handlers/api/health.respec.d.mts.map +0 -1
  157. package/dist/serve-gib/handlers/api/health.respec.mjs +0 -47
  158. package/dist/serve-gib/handlers/api/health.respec.mjs.map +0 -1
  159. package/dist/serve-gib/handlers/api/keystone/keystone-get.respec.d.mts +0 -2
  160. package/dist/serve-gib/handlers/api/keystone/keystone-get.respec.d.mts.map +0 -1
  161. package/dist/serve-gib/handlers/api/keystone/keystone-get.respec.mjs +0 -98
  162. package/dist/serve-gib/handlers/api/keystone/keystone-get.respec.mjs.map +0 -1
  163. package/dist/serve-gib/handlers/api/keystone/keystone-post.respec.d.mts +0 -2
  164. package/dist/serve-gib/handlers/api/keystone/keystone-post.respec.d.mts.map +0 -1
  165. package/dist/serve-gib/handlers/api/keystone/keystone-post.respec.mjs +0 -131
  166. package/dist/serve-gib/handlers/api/keystone/keystone-post.respec.mjs.map +0 -1
  167. package/dist/serve-gib/identity-index/identity-index-service.respec.d.mts +0 -2
  168. package/dist/serve-gib/identity-index/identity-index-service.respec.d.mts.map +0 -1
  169. package/dist/serve-gib/identity-index/identity-index-service.respec.mjs +0 -109
  170. package/dist/serve-gib/identity-index/identity-index-service.respec.mjs.map +0 -1
  171. package/dist/serve-gib/keystone-schema-helpers.respec.d.mts +0 -2
  172. package/dist/serve-gib/keystone-schema-helpers.respec.d.mts.map +0 -1
  173. package/dist/serve-gib/keystone-schema-helpers.respec.mjs +0 -68
  174. package/dist/serve-gib/keystone-schema-helpers.respec.mjs.map +0 -1
  175. package/dist/serve-gib/path-helper.respec.d.mts +0 -2
  176. package/dist/serve-gib/path-helper.respec.d.mts.map +0 -1
  177. package/dist/serve-gib/path-helper.respec.mjs +0 -83
  178. package/dist/serve-gib/path-helper.respec.mjs.map +0 -1
  179. package/dist/serve-gib/serve-gib.respec.d.mts +0 -2
  180. package/dist/serve-gib/serve-gib.respec.d.mts.map +0 -1
  181. package/dist/serve-gib/serve-gib.respec.mjs +0 -85
  182. package/dist/serve-gib/serve-gib.respec.mjs.map +0 -1
  183. package/dist/spec-helper.node.respec.d.mts +0 -13
  184. package/dist/spec-helper.node.respec.d.mts.map +0 -1
  185. package/dist/spec-helper.node.respec.mjs +0 -50
  186. package/dist/spec-helper.node.respec.mjs.map +0 -1
  187. package/dist/witness/space/node-filesystem-space/node-indexed-filesystem-space/respec/testSpace_createAndInit.node-indexed-filesystem-space-v1.respec.d.mts +0 -2
  188. package/dist/witness/space/node-filesystem-space/node-indexed-filesystem-space/respec/testSpace_createAndInit.node-indexed-filesystem-space-v1.respec.d.mts.map +0 -1
  189. package/dist/witness/space/node-filesystem-space/node-indexed-filesystem-space/respec/testSpace_createAndInit.node-indexed-filesystem-space-v1.respec.mjs +0 -52
  190. package/dist/witness/space/node-filesystem-space/node-indexed-filesystem-space/respec/testSpace_createAndInit.node-indexed-filesystem-space-v1.respec.mjs.map +0 -1
  191. package/dist/witness/space/node-filesystem-space/node-indexed-filesystem-space/respec/testSpace_persistTransformResult.node-indexed-filesystem-space-v1.respec.d.mts +0 -2
  192. package/dist/witness/space/node-filesystem-space/node-indexed-filesystem-space/respec/testSpace_persistTransformResult.node-indexed-filesystem-space-v1.respec.d.mts.map +0 -1
  193. package/dist/witness/space/node-filesystem-space/node-indexed-filesystem-space/respec/testSpace_persistTransformResult.node-indexed-filesystem-space-v1.respec.mjs +0 -53
  194. package/dist/witness/space/node-filesystem-space/node-indexed-filesystem-space/respec/testSpace_persistTransformResult.node-indexed-filesystem-space-v1.respec.mjs.map +0 -1
  195. package/dist/witness/space/node-filesystem-space/node-indexed-filesystem-space/respec/testSpace_putGetDelete.node-indexed-filesystem-space-v1.respec.d.mts +0 -2
  196. package/dist/witness/space/node-filesystem-space/node-indexed-filesystem-space/respec/testSpace_putGetDelete.node-indexed-filesystem-space-v1.respec.d.mts.map +0 -1
  197. package/dist/witness/space/node-filesystem-space/node-indexed-filesystem-space/respec/testSpace_putGetDelete.node-indexed-filesystem-space-v1.respec.mjs +0 -59
  198. package/dist/witness/space/node-filesystem-space/node-indexed-filesystem-space/respec/testSpace_putGetDelete.node-indexed-filesystem-space-v1.respec.mjs.map +0 -1
  199. package/dist/witness/space/node-filesystem-space/node-indexed-filesystem-space/respec/testSpace_registerNewIbGib_GetLatest.node-indexed-filesystem-space-v1.respec.d.mts +0 -2
  200. package/dist/witness/space/node-filesystem-space/node-indexed-filesystem-space/respec/testSpace_registerNewIbGib_GetLatest.node-indexed-filesystem-space-v1.respec.d.mts.map +0 -1
  201. package/dist/witness/space/node-filesystem-space/node-indexed-filesystem-space/respec/testSpace_registerNewIbGib_GetLatest.node-indexed-filesystem-space-v1.respec.mjs +0 -55
  202. package/dist/witness/space/node-filesystem-space/node-indexed-filesystem-space/respec/testSpace_registerNewIbGib_GetLatest.node-indexed-filesystem-space-v1.respec.mjs.map +0 -1
  203. package/dist/witness/space/node-filesystem-space/respec/testSpace_createAndInit.node-filesystem-space-v1.respec.d.mts +0 -2
  204. package/dist/witness/space/node-filesystem-space/respec/testSpace_createAndInit.node-filesystem-space-v1.respec.d.mts.map +0 -1
  205. package/dist/witness/space/node-filesystem-space/respec/testSpace_createAndInit.node-filesystem-space-v1.respec.mjs +0 -67
  206. package/dist/witness/space/node-filesystem-space/respec/testSpace_createAndInit.node-filesystem-space-v1.respec.mjs.map +0 -1
  207. package/dist/witness/space/node-filesystem-space/respec/testSpace_persistTransformResult.node-filesystem-space-v1.respec.d.mts +0 -2
  208. package/dist/witness/space/node-filesystem-space/respec/testSpace_persistTransformResult.node-filesystem-space-v1.respec.d.mts.map +0 -1
  209. package/dist/witness/space/node-filesystem-space/respec/testSpace_persistTransformResult.node-filesystem-space-v1.respec.mjs +0 -67
  210. package/dist/witness/space/node-filesystem-space/respec/testSpace_persistTransformResult.node-filesystem-space-v1.respec.mjs.map +0 -1
  211. package/dist/witness/space/node-filesystem-space/respec/testSpace_putGetDelete.node-filesystem-space-v1.respec.d.mts +0 -2
  212. package/dist/witness/space/node-filesystem-space/respec/testSpace_putGetDelete.node-filesystem-space-v1.respec.d.mts.map +0 -1
  213. package/dist/witness/space/node-filesystem-space/respec/testSpace_putGetDelete.node-filesystem-space-v1.respec.mjs +0 -68
  214. package/dist/witness/space/node-filesystem-space/respec/testSpace_putGetDelete.node-filesystem-space-v1.respec.mjs.map +0 -1
  215. package/dist/witness/space/node-filesystem-space/respec/testSpace_registerNewIbGib_GetLatest.node-filesystem-space-v1.respec.d.mts +0 -2
  216. package/dist/witness/space/node-filesystem-space/respec/testSpace_registerNewIbGib_GetLatest.node-filesystem-space-v1.respec.d.mts.map +0 -1
  217. package/dist/witness/space/node-filesystem-space/respec/testSpace_registerNewIbGib_GetLatest.node-filesystem-space-v1.respec.mjs +0 -69
  218. package/dist/witness/space/node-filesystem-space/respec/testSpace_registerNewIbGib_GetLatest.node-filesystem-space-v1.respec.mjs.map +0 -1
@@ -1,22 +1,74 @@
1
1
  import * as fs from 'fs/promises';
2
+ import * as path from 'path';
3
+
4
+ import { extractErrorMsg, pretty } from '@ibgib/helper-gib/dist/helpers/utils-helper.mjs';
2
5
  import { IbGibAddr } from '@ibgib/ts-gib/dist/types.mjs';
3
- import { DEFAULT_IDENTITY_INDEX_SALT } from './identity-index-constants.mjs';
6
+
7
+ import { GLOBAL_LOG_A_LOT } from '../server-constants.mjs';
8
+ import { DEFAULT_IDENTITY_INDEX_SALT, DEFAULT_IDENTITY_INDEX_DIR_NAME } from './identity-index-constants.mjs';
4
9
  import { getIdentityEmailHash, getShardedIndexPath } from './identity-index-helpers.mjs';
5
10
  import { IdentityIndexRecord, IdentityIndexServiceOptions, RegisterEmailIndexResult } from './identity-index-types.mjs';
6
11
 
12
+ const logalot = GLOBAL_LOG_A_LOT || true;
13
+
7
14
  /**
8
15
  * Service managing atomic, sharded identity index files for backwards email -> primary identity tjpAddr lookups.
9
16
  */
10
17
  export class IdentityIndexService {
18
+ private lc = `[${IdentityIndexService.name}]`;
11
19
  private baseDir: string;
12
20
  private salt: string;
13
21
 
14
- constructor({ baseDir, salt }: IdentityIndexServiceOptions) {
15
- if (!baseDir) { throw new Error('baseDir must be provided to IdentityIndexService.'); }
16
- this.baseDir = baseDir;
22
+ constructor(options?: IdentityIndexServiceOptions) {
23
+ const { baseDir, dataDir, salt } = options ?? {};
24
+ const finalDataDir = dataDir || process.env.DATA_DIR || 'data';
25
+ this.baseDir = baseDir || process.env.IDENTITY_INDEX_BASE_DIR || path.join(finalDataDir, DEFAULT_IDENTITY_INDEX_DIR_NAME);
17
26
  this.salt = salt || process.env.IDENTITY_INDEX_SALT || DEFAULT_IDENTITY_INDEX_SALT;
18
27
  }
19
28
 
29
+ // /**
30
+ // * Static helper to register an email index.
31
+ // * @deprecated Use `getIdentityIndexService().registerEmailIndex(...)` instead.
32
+ // */
33
+ // static async registerEmailIndex(opts: {
34
+ // email: string;
35
+ // primaryTjpAddr: IbGibAddr;
36
+ // dataDir?: string;
37
+ // baseDir?: string;
38
+ // salt?: string;
39
+ // }): Promise<RegisterEmailIndexResult> {
40
+ // return getIdentityIndexService().registerEmailIndex({
41
+ // email: opts.email,
42
+ // primaryTjpAddr: opts.primaryTjpAddr
43
+ // });
44
+ // }
45
+
46
+ // /**
47
+ // * Static helper to lookup an identity record by email address.
48
+ // * @deprecated Use `getIdentityIndexService().lookupIdentityByEmail(...)` instead.
49
+ // */
50
+ // static async lookupIdentityByEmail(opts: {
51
+ // email: string;
52
+ // dataDir?: string;
53
+ // baseDir?: string;
54
+ // salt?: string;
55
+ // }): Promise<{ primaryTjpAddr: IbGibAddr; tjpAddr: IbGibAddr; createdAt: number } | undefined> {
56
+ // return getIdentityIndexService().lookupIdentityByEmail({ email: opts.email });
57
+ // }
58
+
59
+ // /**
60
+ // * Static helper to unregister an email index.
61
+ // * @deprecated Use `getIdentityIndexService().unregisterEmailIndex(...)` instead.
62
+ // */
63
+ // static async unregisterEmailIndex(opts: {
64
+ // email: string;
65
+ // dataDir?: string;
66
+ // baseDir?: string;
67
+ // salt?: string;
68
+ // }): Promise<boolean> {
69
+ // return getIdentityIndexService().unregisterEmailIndex({ email: opts.email });
70
+ // }
71
+
20
72
  /**
21
73
  * Registers an email to a primary identity tjpAddr.
22
74
  * Uses atomic OS file creation (`flag: 'wx'`) to guarantee single-server ACID uniqueness.
@@ -25,17 +77,24 @@ export class IdentityIndexService {
25
77
  async registerEmailIndex({
26
78
  email,
27
79
  tjpAddr,
80
+ primaryTjpAddr,
28
81
  }: {
29
82
  email: string;
30
- tjpAddr: IbGibAddr;
83
+ tjpAddr?: IbGibAddr;
84
+ primaryTjpAddr?: IbGibAddr;
31
85
  }): Promise<RegisterEmailIndexResult> {
86
+ const targetAddr = tjpAddr || primaryTjpAddr;
87
+ if (!targetAddr) { throw new Error('Either tjpAddr or primaryTjpAddr must be provided. (E: 62f15851b9a8c8d718279ab84e426826)'); }
32
88
  const emailHash = await getIdentityEmailHash({ email, salt: this.salt });
33
- const { folderPath, filePath } = getShardedIndexPath({ baseDir: this.baseDir, emailHash });
89
+ const { folderPath, filePath } = getShardedIndexPath({
90
+ baseDir: this.baseDir,
91
+ emailHash
92
+ });
34
93
 
35
94
  await fs.mkdir(folderPath, { recursive: true });
36
95
 
37
96
  const record: IdentityIndexRecord = {
38
- tjpAddr,
97
+ tjpAddr: targetAddr,
39
98
  createdAt: Date.now(),
40
99
  };
41
100
 
@@ -50,6 +109,24 @@ export class IdentityIndexService {
50
109
  }
51
110
  }
52
111
 
112
+ /**
113
+ * Retrieves the registered identity info for an email address.
114
+ * Returns `undefined` if email is not indexed.
115
+ */
116
+ async lookupIdentityByEmail({
117
+ email,
118
+ }: {
119
+ email: string;
120
+ }): Promise<{ primaryTjpAddr: IbGibAddr; tjpAddr: IbGibAddr; createdAt: number } | undefined> {
121
+ const record = await this.getEmailIndex({ email });
122
+ if (!record) { return undefined; }
123
+ return {
124
+ primaryTjpAddr: record.tjpAddr,
125
+ tjpAddr: record.tjpAddr,
126
+ createdAt: record.createdAt,
127
+ };
128
+ }
129
+
53
130
  /**
54
131
  * Retrieves the registered `IdentityIndexRecord` for an email address.
55
132
  * Returns `undefined` if email is not indexed.
@@ -59,8 +136,24 @@ export class IdentityIndexService {
59
136
  }: {
60
137
  email: string;
61
138
  }): Promise<IdentityIndexRecord | undefined> {
62
- const emailHash = await getIdentityEmailHash({ email, salt: this.salt });
63
- return this.getEmailIndexByHash({ emailHash });
139
+ const lc = `${this.lc}[${this.getEmailIndex.name}]`;
140
+ try {
141
+ if (logalot) { console.log(`${lc} starting... (I: 3cd3e8e7bd88e193668a8d842d326826)`); }
142
+
143
+ const emailHash = await getIdentityEmailHash({ email, salt: this.salt });
144
+ if (logalot) { console.log(`${lc} emailHash: ${emailHash} (I: cae3161784e8eb00e5c6128a17aadf26)`); }
145
+
146
+ const emailIndex = this.getEmailIndexByHash({ emailHash });
147
+
148
+ if (logalot) { console.log(`${lc} emailIndex: ${emailIndex ? pretty(emailIndex) : 'undefined'} (I: dce1a8387affbd99c85f970853eac826)`); }
149
+
150
+ return emailIndex;
151
+ } catch (error) {
152
+ console.error(`${lc} ${extractErrorMsg(error)}`);
153
+ throw error;
154
+ } finally {
155
+ if (logalot) { console.log(`${lc} complete.`); }
156
+ }
64
157
  }
65
158
 
66
159
  /**
@@ -72,16 +165,28 @@ export class IdentityIndexService {
72
165
  }: {
73
166
  emailHash: string;
74
167
  }): Promise<IdentityIndexRecord | undefined> {
75
- const { filePath } = getShardedIndexPath({ baseDir: this.baseDir, emailHash });
168
+ const lc = `${this.lc}[${this.getEmailIndexByHash.name}]`;
76
169
  try {
77
- const content = await fs.readFile(filePath, 'utf8');
78
- const record: IdentityIndexRecord = JSON.parse(content);
79
- return record;
80
- } catch (error: any) {
81
- if (error.code === 'ENOENT') {
82
- return undefined;
170
+ if (logalot) { console.log(`${lc} starting... (I: 206328babd08908ad876fd69a4b37826)`); }
171
+
172
+ const { filePath } = getShardedIndexPath({ baseDir: this.baseDir, emailHash });
173
+ if (logalot) { console.log(`${lc} filePath: ${filePath} (I: e8f318aabc06320db8b0c3c8b34c5926)`); }
174
+ try {
175
+ const content = await fs.readFile(filePath, 'utf8');
176
+ const record: IdentityIndexRecord = JSON.parse(content);
177
+ return record;
178
+ } catch (error: any) {
179
+ if (error.code === 'ENOENT') {
180
+ return undefined;
181
+ }
182
+ throw error;
83
183
  }
184
+
185
+ } catch (error) {
186
+ console.error(`${lc} ${extractErrorMsg(error)}`);
84
187
  throw error;
188
+ } finally {
189
+ if (logalot) { console.log(`${lc} complete.`); }
85
190
  }
86
191
  }
87
192
 
@@ -107,3 +212,15 @@ export class IdentityIndexService {
107
212
  }
108
213
  }
109
214
  }
215
+
216
+ let _identityIndexService: IdentityIndexService | undefined;
217
+
218
+ /**
219
+ * Singleton factory getter for the IdentityIndexService.
220
+ */
221
+ export function getIdentityIndexService(): IdentityIndexService {
222
+ if (!_identityIndexService) {
223
+ _identityIndexService = new IdentityIndexService();
224
+ }
225
+ return _identityIndexService;
226
+ }
@@ -56,7 +56,7 @@ await respecfully(sir, 'IdentityIndexService & Helpers', async () => {
56
56
  const fullHash = 'abcdef1234567890abcdef1234567890';
57
57
  const { folderPath, filePath, filename } = getShardedIndexPath({ baseDir: TEST_BASE_DIR, emailHash: fullHash });
58
58
 
59
- const expectedSubfolder = path.join(TEST_BASE_DIR, 'email_hashes', 'ab', 'cd', 'ef');
59
+ const expectedSubfolder = path.join(TEST_BASE_DIR, 'email', 'hashes', 'ab', 'cd', 'ef');
60
60
  iReckon(sir, folderPath).willEqual(expectedSubfolder);
61
61
 
62
62
  // Filename strips the leading 6 chars ('abcdef')
@@ -14,8 +14,10 @@ export interface IdentityIndexRecord {
14
14
  * Configuration options for initializing IdentityIndexService.
15
15
  */
16
16
  export interface IdentityIndexServiceOptions {
17
- /** Base directory where index shards will be stored (e.g. `data/index`). */
18
- baseDir: string;
17
+ /** Base directory where index shards will be stored (e.g. `data/identity_index`). */
18
+ baseDir?: string;
19
+ /** Server root data directory (e.g. `data`). If baseDir is omitted, `baseDir` defaults to `path.join(dataDir, DEFAULT_IDENTITY_INDEX_DIR_NAME)`. */
20
+ dataDir?: string;
19
21
  /** Server salt for privacy email hashing. Defaults to `DEFAULT_IDENTITY_INDEX_SALT`. */
20
22
  salt?: string;
21
23
  }
@@ -34,8 +34,12 @@ export * from './handlers/api/keystone/keystone-check-email.handler.mjs';
34
34
  export * from './handlers/api/keystone/sso-config.handler.mjs';
35
35
  export * from './handlers/api/keystone/sso-link.handler.mjs';
36
36
  export * from './handlers/api/keystone/sso-login.handler.mjs';
37
+ export * from './handlers/api/identity/keystone-custodian-genesis.handler.mjs';
38
+ export * from './handlers/api/identity/keystone-custodian-register-delegate.handler.mjs';
37
39
  export * from './handlers/api/email/email-inbound.handler.mjs';
38
40
  export * from './handlers/api/email/email-outbound.handler.mjs';
41
+ export * from './handlers/api/email/email-verification-code.handler.mjs';
42
+ export * from './handlers/api/email/email-verify-code-onetime.handler.mjs';
39
43
  export * from './handlers/api/debug/ws-echo.handler.mjs';
40
44
  export * from './handlers/ws/ws-types.mjs';
41
45
  export * from './handlers/ws/ws-helper.mjs';
@@ -54,8 +58,12 @@ import { KeystoneCheckEmailHandler } from './handlers/api/keystone/keystone-chec
54
58
  import { SsoLinkHandler } from './handlers/api/keystone/sso-link.handler.mjs';
55
59
  import { SsoLoginHandler } from './handlers/api/keystone/sso-login.handler.mjs';
56
60
  import { SsoConfigHandler } from './handlers/api/keystone/sso-config.handler.mjs';
61
+ import { KeystoneCustodianGenesisHandler } from './handlers/api/identity/keystone-custodian-genesis.handler.mjs';
62
+ import { KeystoneCustodianRegisterDelegateHandler } from './handlers/api/identity/keystone-custodian-register-delegate.handler.mjs';
57
63
  import { EmailInboundHandler } from './handlers/api/email/email-inbound.handler.mjs';
58
64
  import { EmailOutboundHandler } from './handlers/api/email/email-outbound.handler.mjs';
65
+ import { EmailVerificationCodeHandler } from './handlers/api/email/email-verification-code.handler.mjs';
66
+ import { EmailVerifyCodeOnetimeHandler } from './handlers/api/email/email-verify-code-onetime.handler.mjs';
59
67
  import { StaticFileHandler } from './handlers/static-handler.mjs';
60
68
 
61
69
  export interface StandardHandlersOptions {
@@ -79,8 +87,12 @@ export function getStandardServeGibHandlers(opts: StandardHandlersOptions = {}):
79
87
  new SsoLinkHandler(),
80
88
  new SsoLoginHandler(),
81
89
  new SsoConfigHandler(),
90
+ new KeystoneCustodianGenesisHandler(),
91
+ new KeystoneCustodianRegisterDelegateHandler(),
82
92
  new EmailInboundHandler(),
83
93
  new EmailOutboundHandler(),
94
+ new EmailVerificationCodeHandler(),
95
+ new EmailVerifyCodeOnetimeHandler(),
84
96
  ];
85
97
 
86
98
  if (opts.clientDir) {
@@ -114,6 +114,26 @@ export const API_PATH_REGEXES = {
114
114
  * /api/email/send
115
115
  */
116
116
  EMAIL_SEND: /^\/api\/email\/send\/?$/,
117
+ /**
118
+ * /api/email/verification-code
119
+ */
120
+ EMAIL_VERIFICATION_CODE: /^\/api\/email\/verification-code\/?$/,
121
+
122
+ /**
123
+ * /api/email/verify or /api/email/verify-code
124
+ */
125
+ EMAIL_VERIFY: /^\/api\/email\/verify\/?$/,
126
+ EMAIL_VERIFY_CODE: /^\/api\/email\/verify-code\/?$/,
127
+
128
+ /**
129
+ * /api/identity/custodian/genesis
130
+ */
131
+ KEYSTONE_CUSTODIAN_GENESIS: /^\/api\/identity\/custodian\/genesis\/?$/i,
132
+
133
+ /**
134
+ * /api/identity/custodian/register-delegate
135
+ */
136
+ KEYSTONE_CUSTODIAN_REGISTER_DELEGATE: /^\/api\/identity\/custodian\/register-delegate\/?$/i,
117
137
  };
118
138
 
119
139
  export const VALID_STATIC_PATH_REGEX = /^\/[a-zA-Z0-9\-_\.\/]*$/;
package/tsconfig.json CHANGED
@@ -11,7 +11,7 @@
11
11
  },
12
12
  "exclude": [
13
13
  "./node_modules",
14
- "**/*.spec.mts",
14
+ "**/*.respec.mts",
15
15
  "./dist/**/*"
16
16
  ]
17
- }
17
+ }
@@ -5,6 +5,6 @@
5
5
  "module": "ESNext", /* https://www.typescriptlang.org/docs/handbook/esm-node.html */
6
6
  },
7
7
  "exclude": [
8
- // override inherited exclude of spec files
8
+ "./dist"
9
9
  ]
10
10
  }
@@ -1,2 +0,0 @@
1
- export {};
2
- //# sourceMappingURL=assumptions.respec.d.mts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"assumptions.respec.d.mts","sourceRoot":"","sources":["../src/assumptions.respec.mts"],"names":[],"mappings":""}
@@ -1,41 +0,0 @@
1
- import { ifWe, iReckon, respecfully } from '@ibgib/helper-gib/dist/respec-gib/respec-gib.mjs';
2
- const maam = `[${import.meta.url}]`, sir = maam;
3
- /**
4
- * wrapper that uses crypto.subtle under the hood (i.e. doesn't hash using ts-gib)
5
- *
6
- * notes:
7
- *
8
- * * i did in fact copy this from ts-gib though, but we're testing simply that the
9
- * context (node/browser/whatever) has this since it's integral to all things ibgib.
10
- */
11
- async function cryptoSubtleHash({ s, algorithm = 'SHA-256', }) {
12
- let { subtle } = globalThis.crypto;
13
- if (!s) {
14
- throw new Error(`[${cryptoSubtleHash.name}] s is required`);
15
- }
16
- if (!algorithm) {
17
- throw new Error(`[${cryptoSubtleHash.name}] algorithm is required`);
18
- }
19
- try {
20
- const msgUint8 = new TextEncoder().encode(s);
21
- const buffer = await subtle.digest(algorithm, msgUint8);
22
- const asArray = Array.from(new Uint8Array(buffer));
23
- return asArray.map(b => b.toString(16).padStart(2, '0')).join('');
24
- }
25
- catch (e) {
26
- console.error(e.message ?? e);
27
- throw e;
28
- }
29
- }
30
- await respecfully(sir, `non-ts-gib isomorphic crypto hashing`, async () => {
31
- await ifWe(sir, `should digest simple string consistently using crypto.subtle directly `, async () => {
32
- let h = await cryptoSubtleHash({ s: '42' });
33
- iReckon(sir, h).asTo('42').isGonnaBe('73475cb40a568e8da8a045ced110137e159f890ac4da883b6b17dc651b3a8049');
34
- });
35
- await ifWe(sir, `should digest simple stringified ibgib consistently using crypto.subtle directly `, async () => {
36
- let ibgib = { ib: 'ib', gib: 'gib' };
37
- let h = await cryptoSubtleHash({ s: JSON.stringify(ibgib) }); // doesn't use ts-gib but consistent stringifying json is important
38
- iReckon(sir, h).asTo('ib^gib').isGonnaBe('cbad0694a257358c044611ea1fa88ace71a01a9b8409d2354d0387d8043f7671');
39
- });
40
- });
41
- //# sourceMappingURL=assumptions.respec.mjs.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"assumptions.respec.mjs","sourceRoot":"","sources":["../src/assumptions.respec.mts"],"names":[],"mappings":"AAAA,OAAO,EACsB,IAAI,EAElB,OAAO,EAAE,WAAW,EAClC,MAAM,kDAAkD,CAAC;AAC1D,MAAM,IAAI,GAAG,IAAI,OAAO,IAAI,CAAC,GAAG,GAAG,EAAE,GAAG,GAAG,IAAI,CAAC;AAGhD;;;;;;;GAOG;AACH,KAAK,UAAU,gBAAgB,CAAC,EAC5B,CAAC,EACD,SAAS,GAAG,SAAS,GAIxB;IACG,IAAI,EAAE,MAAM,EAAE,GAAG,UAAU,CAAC,MAAM,CAAC;IACnC,IAAI,CAAC,CAAC,EAAE,CAAC;QAAC,MAAM,IAAI,KAAK,CAAC,IAAI,gBAAgB,CAAC,IAAI,iBAAiB,CAAC,CAAA;IAAC,CAAC;IACvE,IAAI,CAAC,SAAS,EAAE,CAAC;QAAC,MAAM,IAAI,KAAK,CAAC,IAAI,gBAAgB,CAAC,IAAI,yBAAyB,CAAC,CAAA;IAAC,CAAC;IACvF,IAAI,CAAC;QACD,MAAM,QAAQ,GAAG,IAAI,WAAW,EAAE,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;QAC7C,MAAM,MAAM,GAAG,MAAM,MAAM,CAAC,MAAM,CAAC,SAAS,EAAE,QAAQ,CAAC,CAAC;QACxD,MAAM,OAAO,GAAG,KAAK,CAAC,IAAI,CAAC,IAAI,UAAU,CAAC,MAAM,CAAC,CAAC,CAAC;QACnD,OAAO,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,QAAQ,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IACtE,CAAC;IAAC,OAAO,CAAC,EAAE,CAAC;QACT,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,OAAO,IAAI,CAAC,CAAC,CAAC;QAC9B,MAAM,CAAC,CAAC;IACZ,CAAC;AACL,CAAC;AAED,MAAM,WAAW,CAAC,GAAG,EAAE,sCAAsC,EAAE,KAAK,IAAI,EAAE;IAEtE,MAAM,IAAI,CAAC,GAAG,EAAE,wEAAwE,EAAE,KAAK,IAAI,EAAE;QACjG,IAAI,CAAC,GAAG,MAAM,gBAAgB,CAAC,EAAE,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC;QAC5C,OAAO,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,SAAS,CAAC,kEAAkE,CAAC,CAAC;IAC7G,CAAC,CAAC,CAAC;IAEH,MAAM,IAAI,CAAC,GAAG,EAAE,mFAAmF,EAAE,KAAK,IAAI,EAAE;QAC5G,IAAI,KAAK,GAAa,EAAE,EAAE,EAAE,IAAI,EAAE,GAAG,EAAE,KAAK,EAAE,CAAC;QAC/C,IAAI,CAAC,GAAG,MAAM,gBAAgB,CAAC,EAAE,CAAC,EAAE,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC,CAAC,mEAAmE;QACjI,OAAO,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,SAAS,CAAC,kEAAkE,CAAC,CAAC;IACjH,CAAC,CAAC,CAAC;AAEP,CAAC,CAAC,CAAC"}
@@ -1,2 +0,0 @@
1
- export {};
2
- //# sourceMappingURL=email-service.respec.d.mts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"email-service.respec.d.mts","sourceRoot":"","sources":["../../src/email/email-service.respec.mts"],"names":[],"mappings":""}
@@ -1,115 +0,0 @@
1
- import { iReckon, ifWe, respecfully } from '@ibgib/helper-gib/dist/respec-gib/respec-gib.mjs';
2
- import { createAwsSigV4Headers } from './aws/aws-sigv4-helper.mjs';
3
- import { EmailReceiverAws } from './aws/email-receiver-aws.mjs';
4
- import { formatEmailAddress, formatRawMimeString, parseEmailAddress, parseRawMimeHeaders, validateEmail } from './email-helpers.mjs';
5
- import { EmailSenderMock } from './mock/email-sender-mock.mjs';
6
- const sir = `[${import.meta.url}]`;
7
- await respecfully(sir, 'Email Infrastructure & Drivers', async () => {
8
- await ifWe(sir, 'validate email addresses accurately using validateEmail', async () => {
9
- iReckon(sir, validateEmail('user@example.com')).asTo('valid email').isGonnaBe(true);
10
- iReckon(sir, validateEmail('user.name+tag@domain.co.uk')).asTo('valid tagged email').isGonnaBe(true);
11
- iReckon(sir, validateEmail('invalid-email')).asTo('invalid format without @').isGonnaBe(false);
12
- iReckon(sir, validateEmail('user@')).asTo('missing domain').isGonnaBe(false);
13
- iReckon(sir, validateEmail('')).asTo('empty string').isGonnaBe(false);
14
- });
15
- await ifWe(sir, 'parse and format email addresses correctly', async () => {
16
- const parsed1 = parseEmailAddress('Alice <alice@example.com>');
17
- iReckon(sir, parsed1.address).asTo('parsed address').isGonnaBe('alice@example.com');
18
- iReckon(sir, parsed1.name).asTo('parsed name').isGonnaBe('Alice');
19
- const formatted = formatEmailAddress({ name: 'Bob', address: 'bob@example.com' });
20
- iReckon(sir, formatted).asTo('formatted address').isGonnaBe('"Bob" <bob@example.com>');
21
- });
22
- await ifWe(sir, 'format and parse raw MIME headers and strings', async () => {
23
- const mimeStr = formatRawMimeString({
24
- from: { name: 'Sender', address: 'sender@example.com' },
25
- to: ['receiver@example.com'],
26
- subject: 'Test Subject',
27
- textBody: 'Hello World',
28
- });
29
- const headers = parseRawMimeHeaders(mimeStr);
30
- iReckon(sir, headers['From']).asTo('MIME From header').isGonnaBe('"Sender" <sender@example.com>');
31
- iReckon(sir, headers['Subject']).asTo('MIME Subject header').isGonnaBe('Test Subject');
32
- });
33
- await ifWe(sir, 'dispatch emails using EmailSenderMock and maintain history', async () => {
34
- const mockSender = new EmailSenderMock();
35
- mockSender.clearSentEmails();
36
- const result = await mockSender.sendEmail({
37
- from: 'test@example.com',
38
- to: ['target@example.com'],
39
- subject: 'Mock Subject',
40
- textBody: 'Mock body',
41
- });
42
- iReckon(sir, result.success).asTo('mock send result success').isGonnaBe(true);
43
- iReckon(sir, Boolean(result.messageId)).asTo('mock messageId generated').isGonnaBe(true);
44
- const sent = mockSender.getSentEmails();
45
- iReckon(sir, sent.length).asTo('sent emails count').isGonnaBe(1);
46
- iReckon(sir, sent[0].subject).asTo('sent email subject').isGonnaBe('Mock Subject');
47
- // Verify failure mode
48
- mockSender.shouldFail = true;
49
- const failResult = await mockSender.sendEmail({
50
- from: 'test@example.com',
51
- to: ['target@example.com'],
52
- subject: 'Fail Subject',
53
- textBody: 'Fail body',
54
- });
55
- iReckon(sir, failResult.success).asTo('mock send failure result success').isGonnaBe(false);
56
- });
57
- await ifWe(sir, 'calculate valid AWS SigV4 headers with createAwsSigV4Headers', async () => {
58
- const sigResult = createAwsSigV4Headers({
59
- method: 'POST',
60
- url: 'https://email.us-east-1.amazonaws.com/',
61
- region: 'us-east-1',
62
- service: 'ses',
63
- accessKeyId: 'AKIAIOSFODNN7EXAMPLE',
64
- secretAccessKey: 'wJalrXUtnFEMI/K7MDENG/bPxRfiCYEXAMPLEKEY',
65
- body: 'Action=SendEmail&Version=2010-12-01',
66
- timestamp: new Date('2026-07-30T18:00:00.000Z'),
67
- });
68
- iReckon(sir, sigResult.amzDate).asTo('formatted X-Amz-Date').isGonnaBe('20260730T180000Z');
69
- iReckon(sir, sigResult.headers['Host']).asTo('Host header').isGonnaBe('email.us-east-1.amazonaws.com');
70
- iReckon(sir, sigResult.authorization.startsWith('AWS4-HMAC-SHA256 Credential=AKIAIOSFODNN7EXAMPLE/20260730/us-east-1/ses/aws4_request')).asTo('authorization header credential prefix').isGonnaBe(true);
71
- iReckon(sir, Boolean(sigResult.signature)).asTo('signature computed').isGonnaBe(true);
72
- });
73
- await ifWe(sir, 'parse SES webhook payloads and evaluate spam verdicts into inbox/junk folders', async () => {
74
- const receiver = new EmailReceiverAws();
75
- // Pass verdict payload
76
- const passPayload = {
77
- mail: {
78
- messageId: 'msg-pass-123',
79
- source: 'alice@example.com',
80
- destination: ['bob@example.com'],
81
- commonHeaders: { subject: 'Clean Mail' },
82
- timestamp: '2026-07-30T18:00:00Z',
83
- },
84
- receipt: {
85
- spamVerdict: { status: 'PASS' },
86
- virusVerdict: { status: 'PASS' },
87
- spfVerdict: { status: 'PASS' },
88
- dkimVerdict: { status: 'PASS' },
89
- },
90
- content: 'Clean body',
91
- };
92
- const parsedPass = await receiver.parseInboundPayload(passPayload);
93
- iReckon(sir, parsedPass.folder).asTo('clean email folder').isGonnaBe('inbox');
94
- iReckon(sir, parsedPass.from.address).asTo('parsed from address').isGonnaBe('alice@example.com');
95
- iReckon(sir, parsedPass.subject).asTo('parsed subject').isGonnaBe('Clean Mail');
96
- // Fail verdict payload
97
- const failPayload = {
98
- mail: {
99
- messageId: 'msg-spam-456',
100
- source: 'spammer@badsite.com',
101
- destination: ['bob@example.com'],
102
- commonHeaders: { subject: 'Buy Cheap Stuff' },
103
- },
104
- receipt: {
105
- spamVerdict: { status: 'FAIL' },
106
- virusVerdict: { status: 'PASS' },
107
- spfVerdict: { status: 'FAIL' },
108
- dkimVerdict: { status: 'PASS' },
109
- },
110
- };
111
- const parsedFail = await receiver.parseInboundPayload(failPayload);
112
- iReckon(sir, parsedFail.folder).asTo('spam email folder').isGonnaBe('junk');
113
- });
114
- });
115
- //# sourceMappingURL=email-service.respec.mjs.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"email-service.respec.mjs","sourceRoot":"","sources":["../../src/email/email-service.respec.mts"],"names":[],"mappings":"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"}
@@ -1,2 +0,0 @@
1
- export {};
2
- //# sourceMappingURL=bootstrap-helper.respec.d.mts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"bootstrap-helper.respec.d.mts","sourceRoot":"","sources":["../../src/serve-gib/bootstrap-helper.respec.mts"],"names":[],"mappings":""}
@@ -1,85 +0,0 @@
1
- import { join } from 'node:path';
2
- import { existsSync, mkdirSync, rmSync } from 'node:fs';
3
- import { respecfully, iReckon, ifWe } from '@ibgib/helper-gib/dist/respec-gib/respec-gib.mjs';
4
- const sir = `[${import.meta.url}]`;
5
- import { getIbGibAddr } from '@ibgib/ts-gib/dist/helper.mjs';
6
- import { KeystoneService_V1 } from '@ibgib/core-gib/dist/keystone/keystone-service-v1.mjs';
7
- import { createStandardPoolConfig } from '@ibgib/core-gib/dist/keystone/keystone-config-builder.mjs';
8
- import { POOL_ID_DEFAULT } from '@ibgib/core-gib/dist/keystone/keystone-constants.mjs';
9
- import { GLOBAL_LOG_A_LOT } from './server-constants.mjs';
10
- import { getDomainRootPath, bootstrapDomainMetaspace } from './bootstrap-helper.mjs';
11
- const logalot = GLOBAL_LOG_A_LOT;
12
- /**
13
- * Minimal mock to satisfy KeystoneService requirements during genesis.
14
- */
15
- class MockMetaspace {
16
- async getLocalUserSpace() { return new MockSpace(); }
17
- async put() { }
18
- async registerNewIbGib() { }
19
- }
20
- class MockSpace {
21
- async witness() { return { data: { success: true } }; }
22
- }
23
- await respecfully(sir, 'bootstrap-helper', async () => {
24
- const lc = `[bootstrap-helper.respec.mts][bootstrap-helper]`;
25
- const testDataDir = './test-data';
26
- console.log(`${lc} testDataDir: ${testDataDir} (I: c9f39853a57a5af97ab8ff7882c49826)`);
27
- // Clean and recreate test-data directory
28
- if (existsSync(testDataDir)) {
29
- try {
30
- rmSync(testDataDir, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 });
31
- }
32
- catch { /* ignore */ }
33
- }
34
- mkdirSync(testDataDir, { recursive: true });
35
- await ifWe(sir, 'calculate balanced domain root paths', async () => {
36
- const tjpGib = 'abcde1234567890';
37
- const root = getDomainRootPath(tjpGib, testDataDir);
38
- // Should be: testDataDir/domains/ab/cd/abcde1234567890
39
- iReckon(sir, root).includes(join('domains', 'ab', 'cd', tjpGib));
40
- });
41
- await ifWe(sir, 'bootstrap a domain metaspace and create the directory', async () => {
42
- const keystoneAddr = 'keystone_alice^abcde1234567890';
43
- const metaspace = await bootstrapDomainMetaspace(keystoneAddr, testDataDir);
44
- iReckon(sir, metaspace).isGonnaBe(metaspace);
45
- iReckon(sir, metaspace.initialized).isGonnaBe(true);
46
- const expectedPath = getDomainRootPath('abcde1234567890', testDataDir);
47
- iReckon(sir, existsSync(expectedPath)).isGonnaBe(true);
48
- // The ibgib framework uses a specific subdirectory structure for the bootstrap
49
- const bootstrapFile = join(expectedPath, 'ibgib', '000_zerospace', 'gib', 'bootstrap.json');
50
- iReckon(sir, existsSync(bootstrapFile)).isGonnaBe(true);
51
- // Also check that the default space was created
52
- const defaultSpaceDir = join(expectedPath, 'ibgib', 'default');
53
- iReckon(sir, existsSync(defaultSpaceDir)).isGonnaBe(true);
54
- });
55
- await ifWe(sir, 'integrate with KeystoneService and bootstrap 5 unique domains', async () => {
56
- const keystoneService = new KeystoneService_V1();
57
- const mockMetaspace = new MockMetaspace();
58
- const mockSpace = new MockSpace();
59
- const config = createStandardPoolConfig({ id: POOL_ID_DEFAULT, salt: POOL_ID_DEFAULT });
60
- const identities = ['Alice', 'Bob', 'Charlie', 'Dave', 'Eve'];
61
- for (const name of identities) {
62
- // 1. Generate an actual genesis keystone for this identity
63
- const keystone = await keystoneService.genesis({
64
- masterSecret: `SecretFor_${name}`,
65
- configs: [config],
66
- metaspace: mockMetaspace,
67
- space: mockSpace,
68
- });
69
- const addr = getIbGibAddr({ ibGib: keystone });
70
- const tjpGib = keystone.gib;
71
- if (logalot) {
72
- console.log(`[test] Bootstrapping domain for ${name}: ${addr} (I: 7ba45828f2719ca578a1f078ff16e126)`);
73
- }
74
- // 2. Drive the bootstrap logic
75
- const metaspace = await bootstrapDomainMetaspace(addr, testDataDir);
76
- iReckon(sir, metaspace.initialized).isGonnaBe(true);
77
- // 3. Verify the unique path
78
- const expectedPath = getDomainRootPath(tjpGib, testDataDir);
79
- iReckon(sir, existsSync(expectedPath)).isGonnaBe(true);
80
- const bootstrapFile = join(expectedPath, 'ibgib', '000_zerospace', 'gib', 'bootstrap.json');
81
- iReckon(sir, existsSync(bootstrapFile)).isGonnaBe(true);
82
- }
83
- });
84
- });
85
- //# sourceMappingURL=bootstrap-helper.respec.mjs.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"bootstrap-helper.respec.mjs","sourceRoot":"","sources":["../../src/serve-gib/bootstrap-helper.respec.mts"],"names":[],"mappings":"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"}
@@ -1,2 +0,0 @@
1
- export {};
2
- //# sourceMappingURL=health.respec.d.mts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"health.respec.d.mts","sourceRoot":"","sources":["../../../../src/serve-gib/handlers/api/health.respec.mts"],"names":[],"mappings":""}