@ibgib/node-gib 0.0.10 → 0.0.14

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 (329) hide show
  1. package/dist/assumptions.respec.mjs.map +1 -1
  2. package/dist/email/aws/aws-sigv4-helper.d.mts +26 -0
  3. package/dist/email/aws/aws-sigv4-helper.d.mts.map +1 -0
  4. package/dist/email/aws/aws-sigv4-helper.mjs +94 -0
  5. package/dist/email/aws/aws-sigv4-helper.mjs.map +1 -0
  6. package/dist/email/aws/email-receiver-aws.d.mts +13 -0
  7. package/dist/email/aws/email-receiver-aws.d.mts.map +1 -0
  8. package/dist/email/aws/email-receiver-aws.mjs +97 -0
  9. package/dist/email/aws/email-receiver-aws.mjs.map +1 -0
  10. package/dist/email/aws/email-sender-aws.d.mts +23 -0
  11. package/dist/email/aws/email-sender-aws.d.mts.map +1 -0
  12. package/dist/email/aws/email-sender-aws.mjs +106 -0
  13. package/dist/email/aws/email-sender-aws.mjs.map +1 -0
  14. package/dist/email/aws/index.d.mts +7 -0
  15. package/dist/email/aws/index.d.mts.map +1 -0
  16. package/dist/email/aws/index.mjs +7 -0
  17. package/dist/email/aws/index.mjs.map +1 -0
  18. package/dist/email/email-constants.d.mts +15 -0
  19. package/dist/email/email-constants.d.mts.map +1 -0
  20. package/dist/email/email-constants.mjs +15 -0
  21. package/dist/email/email-constants.mjs.map +1 -0
  22. package/dist/email/email-helpers.d.mts +35 -0
  23. package/dist/email/email-helpers.d.mts.map +1 -0
  24. package/dist/email/email-helpers.mjs +144 -0
  25. package/dist/email/email-helpers.mjs.map +1 -0
  26. package/dist/email/email-receiver.d.mts +12 -0
  27. package/dist/email/email-receiver.d.mts.map +1 -0
  28. package/dist/email/email-receiver.mjs +23 -0
  29. package/dist/email/email-receiver.mjs.map +1 -0
  30. package/dist/email/email-sender.d.mts +13 -0
  31. package/dist/email/email-sender.d.mts.map +1 -0
  32. package/dist/email/email-sender.mjs +35 -0
  33. package/dist/email/email-sender.mjs.map +1 -0
  34. package/dist/email/email-service.respec.d.mts +2 -0
  35. package/dist/email/email-service.respec.d.mts.map +1 -0
  36. package/dist/email/email-service.respec.mjs +115 -0
  37. package/dist/email/email-service.respec.mjs.map +1 -0
  38. package/dist/email/email-types.d.mts +53 -0
  39. package/dist/email/email-types.d.mts.map +1 -0
  40. package/dist/email/email-types.mjs +5 -0
  41. package/dist/email/email-types.mjs.map +1 -0
  42. package/dist/email/index.d.mts +11 -0
  43. package/dist/email/index.d.mts.map +1 -0
  44. package/dist/email/index.mjs +11 -0
  45. package/dist/email/index.mjs.map +1 -0
  46. package/dist/email/mock/email-sender-mock.d.mts +20 -0
  47. package/dist/email/mock/email-sender-mock.d.mts.map +1 -0
  48. package/dist/email/mock/email-sender-mock.mjs +47 -0
  49. package/dist/email/mock/email-sender-mock.mjs.map +1 -0
  50. package/dist/email/mock/index.d.mts +5 -0
  51. package/dist/email/mock/index.d.mts.map +1 -0
  52. package/dist/email/mock/index.mjs +5 -0
  53. package/dist/email/mock/index.mjs.map +1 -0
  54. package/dist/index.d.mts +13 -0
  55. package/dist/index.d.mts.map +1 -0
  56. package/dist/index.mjs +14 -0
  57. package/dist/index.mjs.map +1 -0
  58. package/dist/respec-gib.node.mjs +3 -4
  59. package/dist/respec-gib.node.mjs.map +1 -1
  60. package/dist/serve-gib/bootstrap-helper.d.mts +27 -0
  61. package/dist/serve-gib/bootstrap-helper.d.mts.map +1 -0
  62. package/dist/serve-gib/bootstrap-helper.mjs +116 -0
  63. package/dist/serve-gib/bootstrap-helper.mjs.map +1 -0
  64. package/dist/serve-gib/bootstrap-helper.respec.d.mts +2 -0
  65. package/dist/serve-gib/bootstrap-helper.respec.d.mts.map +1 -0
  66. package/dist/serve-gib/bootstrap-helper.respec.mjs +85 -0
  67. package/dist/serve-gib/bootstrap-helper.respec.mjs.map +1 -0
  68. package/dist/serve-gib/constants.d.mts +2 -0
  69. package/dist/serve-gib/constants.d.mts.map +1 -0
  70. package/dist/serve-gib/constants.mjs +2 -0
  71. package/dist/serve-gib/constants.mjs.map +1 -0
  72. package/dist/serve-gib/handlers/api/debug/ws-echo.handler.d.mts +39 -0
  73. package/dist/serve-gib/handlers/api/debug/ws-echo.handler.d.mts.map +1 -0
  74. package/dist/serve-gib/handlers/api/debug/ws-echo.handler.mjs +99 -0
  75. package/dist/serve-gib/handlers/api/debug/ws-echo.handler.mjs.map +1 -0
  76. package/dist/serve-gib/handlers/api/email/email-inbound.handler.d.mts +25 -0
  77. package/dist/serve-gib/handlers/api/email/email-inbound.handler.d.mts.map +1 -0
  78. package/dist/serve-gib/handlers/api/email/email-inbound.handler.mjs +54 -0
  79. package/dist/serve-gib/handlers/api/email/email-inbound.handler.mjs.map +1 -0
  80. package/dist/serve-gib/handlers/api/email/email-outbound.handler.d.mts +24 -0
  81. package/dist/serve-gib/handlers/api/email/email-outbound.handler.d.mts.map +1 -0
  82. package/dist/serve-gib/handlers/api/email/email-outbound.handler.mjs +72 -0
  83. package/dist/serve-gib/handlers/api/email/email-outbound.handler.mjs.map +1 -0
  84. package/dist/serve-gib/handlers/api/health.handler.d.mts +14 -0
  85. package/dist/serve-gib/handlers/api/health.handler.d.mts.map +1 -0
  86. package/dist/serve-gib/handlers/api/health.handler.mjs +21 -0
  87. package/dist/serve-gib/handlers/api/health.handler.mjs.map +1 -0
  88. package/dist/serve-gib/handlers/api/health.respec.d.mts +2 -0
  89. package/dist/serve-gib/handlers/api/health.respec.d.mts.map +1 -0
  90. package/dist/serve-gib/handlers/api/health.respec.mjs +47 -0
  91. package/dist/serve-gib/handlers/api/health.respec.mjs.map +1 -0
  92. package/dist/serve-gib/handlers/api/ibgib/ibgib-handler-types.d.mts +41 -0
  93. package/dist/serve-gib/handlers/api/ibgib/ibgib-handler-types.d.mts.map +1 -0
  94. package/dist/serve-gib/handlers/api/ibgib/ibgib-handler-types.mjs +34 -0
  95. package/dist/serve-gib/handlers/api/ibgib/ibgib-handler-types.mjs.map +1 -0
  96. package/dist/serve-gib/handlers/api/ibgib/ibgib.handler.d.mts +26 -0
  97. package/dist/serve-gib/handlers/api/ibgib/ibgib.handler.d.mts.map +1 -0
  98. package/dist/serve-gib/handlers/api/ibgib/ibgib.handler.mjs +179 -0
  99. package/dist/serve-gib/handlers/api/ibgib/ibgib.handler.mjs.map +1 -0
  100. package/dist/serve-gib/handlers/api/keystone/keystone-check-email.handler.d.mts +23 -0
  101. package/dist/serve-gib/handlers/api/keystone/keystone-check-email.handler.d.mts.map +1 -0
  102. package/dist/serve-gib/handlers/api/keystone/keystone-check-email.handler.mjs +52 -0
  103. package/dist/serve-gib/handlers/api/keystone/keystone-check-email.handler.mjs.map +1 -0
  104. package/dist/serve-gib/handlers/api/keystone/keystone-evolve.handler.d.mts +44 -0
  105. package/dist/serve-gib/handlers/api/keystone/keystone-evolve.handler.d.mts.map +1 -0
  106. package/dist/serve-gib/handlers/api/keystone/keystone-evolve.handler.mjs +127 -0
  107. package/dist/serve-gib/handlers/api/keystone/keystone-evolve.handler.mjs.map +1 -0
  108. package/dist/serve-gib/handlers/api/keystone/keystone-genesis.handler.d.mts +45 -0
  109. package/dist/serve-gib/handlers/api/keystone/keystone-genesis.handler.d.mts.map +1 -0
  110. package/dist/serve-gib/handlers/api/keystone/keystone-genesis.handler.mjs +159 -0
  111. package/dist/serve-gib/handlers/api/keystone/keystone-genesis.handler.mjs.map +1 -0
  112. package/dist/serve-gib/handlers/api/keystone/keystone-get.handler.d.mts +25 -0
  113. package/dist/serve-gib/handlers/api/keystone/keystone-get.handler.d.mts.map +1 -0
  114. package/dist/serve-gib/handlers/api/keystone/keystone-get.handler.mjs +183 -0
  115. package/dist/serve-gib/handlers/api/keystone/keystone-get.handler.mjs.map +1 -0
  116. package/dist/serve-gib/handlers/api/keystone/keystone-get.respec.d.mts +2 -0
  117. package/dist/serve-gib/handlers/api/keystone/keystone-get.respec.d.mts.map +1 -0
  118. package/dist/serve-gib/handlers/api/keystone/keystone-get.respec.mjs +98 -0
  119. package/dist/serve-gib/handlers/api/keystone/keystone-get.respec.mjs.map +1 -0
  120. package/dist/serve-gib/handlers/api/keystone/keystone-handler-types.d.mts +22 -0
  121. package/dist/serve-gib/handlers/api/keystone/keystone-handler-types.d.mts.map +1 -0
  122. package/dist/serve-gib/handlers/api/keystone/keystone-handler-types.mjs +19 -0
  123. package/dist/serve-gib/handlers/api/keystone/keystone-handler-types.mjs.map +1 -0
  124. package/dist/serve-gib/handlers/api/keystone/keystone-lookup.handler.d.mts +19 -0
  125. package/dist/serve-gib/handlers/api/keystone/keystone-lookup.handler.d.mts.map +1 -0
  126. package/dist/serve-gib/handlers/api/keystone/keystone-lookup.handler.mjs +82 -0
  127. package/dist/serve-gib/handlers/api/keystone/keystone-lookup.handler.mjs.map +1 -0
  128. package/dist/serve-gib/handlers/api/keystone/keystone-post.handler.d.mts +20 -0
  129. package/dist/serve-gib/handlers/api/keystone/keystone-post.handler.d.mts.map +1 -0
  130. package/dist/serve-gib/handlers/api/keystone/keystone-post.handler.mjs +77 -0
  131. package/dist/serve-gib/handlers/api/keystone/keystone-post.handler.mjs.map +1 -0
  132. package/dist/serve-gib/handlers/api/keystone/keystone-post.respec.d.mts +2 -0
  133. package/dist/serve-gib/handlers/api/keystone/keystone-post.respec.d.mts.map +1 -0
  134. package/dist/serve-gib/handlers/api/keystone/keystone-post.respec.mjs +131 -0
  135. package/dist/serve-gib/handlers/api/keystone/keystone-post.respec.mjs.map +1 -0
  136. package/dist/serve-gib/handlers/api/keystone/sso-config.handler.d.mts +23 -0
  137. package/dist/serve-gib/handlers/api/keystone/sso-config.handler.d.mts.map +1 -0
  138. package/dist/serve-gib/handlers/api/keystone/sso-config.handler.mjs +62 -0
  139. package/dist/serve-gib/handlers/api/keystone/sso-config.handler.mjs.map +1 -0
  140. package/dist/serve-gib/handlers/api/keystone/sso-link.handler.d.mts +23 -0
  141. package/dist/serve-gib/handlers/api/keystone/sso-link.handler.d.mts.map +1 -0
  142. package/dist/serve-gib/handlers/api/keystone/sso-link.handler.mjs +118 -0
  143. package/dist/serve-gib/handlers/api/keystone/sso-link.handler.mjs.map +1 -0
  144. package/dist/serve-gib/handlers/api/keystone/sso-login.handler.d.mts +24 -0
  145. package/dist/serve-gib/handlers/api/keystone/sso-login.handler.d.mts.map +1 -0
  146. package/dist/serve-gib/handlers/api/keystone/sso-login.handler.mjs +160 -0
  147. package/dist/serve-gib/handlers/api/keystone/sso-login.handler.mjs.map +1 -0
  148. package/dist/serve-gib/handlers/error-handler.d.mts +14 -0
  149. package/dist/serve-gib/handlers/error-handler.d.mts.map +1 -0
  150. package/dist/serve-gib/handlers/error-handler.mjs +35 -0
  151. package/dist/serve-gib/handlers/error-handler.mjs.map +1 -0
  152. package/dist/serve-gib/handlers/handler-base.d.mts +129 -0
  153. package/dist/serve-gib/handlers/handler-base.d.mts.map +1 -0
  154. package/dist/serve-gib/handlers/handler-base.mjs +402 -0
  155. package/dist/serve-gib/handlers/handler-base.mjs.map +1 -0
  156. package/dist/serve-gib/handlers/static-handler.d.mts +17 -0
  157. package/dist/serve-gib/handlers/static-handler.d.mts.map +1 -0
  158. package/dist/serve-gib/handlers/static-handler.mjs +85 -0
  159. package/dist/serve-gib/handlers/static-handler.mjs.map +1 -0
  160. package/dist/serve-gib/handlers/ws/sync-upgrade-handler-base.d.mts +35 -0
  161. package/dist/serve-gib/handlers/ws/sync-upgrade-handler-base.d.mts.map +1 -0
  162. package/dist/serve-gib/handlers/ws/sync-upgrade-handler-base.mjs +219 -0
  163. package/dist/serve-gib/handlers/ws/sync-upgrade-handler-base.mjs.map +1 -0
  164. package/dist/serve-gib/handlers/ws/sync-upgrade.handler.d.mts +21 -0
  165. package/dist/serve-gib/handlers/ws/sync-upgrade.handler.d.mts.map +1 -0
  166. package/dist/serve-gib/handlers/ws/sync-upgrade.handler.mjs +21 -0
  167. package/dist/serve-gib/handlers/ws/sync-upgrade.handler.mjs.map +1 -0
  168. package/dist/serve-gib/handlers/ws/ws-helper.d.mts +29 -0
  169. package/dist/serve-gib/handlers/ws/ws-helper.d.mts.map +1 -0
  170. package/dist/serve-gib/handlers/ws/ws-helper.mjs +195 -0
  171. package/dist/serve-gib/handlers/ws/ws-helper.mjs.map +1 -0
  172. package/dist/serve-gib/handlers/ws/ws-types.d.mts +32 -0
  173. package/dist/serve-gib/handlers/ws/ws-types.d.mts.map +1 -0
  174. package/dist/serve-gib/handlers/ws/ws-types.mjs +2 -0
  175. package/dist/serve-gib/handlers/ws/ws-types.mjs.map +1 -0
  176. package/dist/serve-gib/identity-index/identity-index-constants.d.mts +4 -0
  177. package/dist/serve-gib/identity-index/identity-index-constants.d.mts.map +1 -0
  178. package/dist/serve-gib/identity-index/identity-index-constants.mjs +4 -0
  179. package/dist/serve-gib/identity-index/identity-index-constants.mjs.map +1 -0
  180. package/dist/serve-gib/identity-index/identity-index-helpers.d.mts +35 -0
  181. package/dist/serve-gib/identity-index/identity-index-helpers.d.mts.map +1 -0
  182. package/dist/serve-gib/identity-index/identity-index-helpers.mjs +69 -0
  183. package/dist/serve-gib/identity-index/identity-index-helpers.mjs.map +1 -0
  184. package/dist/serve-gib/identity-index/identity-index-service.d.mts +41 -0
  185. package/dist/serve-gib/identity-index/identity-index-service.d.mts.map +1 -0
  186. package/dist/serve-gib/identity-index/identity-index-service.mjs +86 -0
  187. package/dist/serve-gib/identity-index/identity-index-service.mjs.map +1 -0
  188. package/dist/serve-gib/identity-index/identity-index-service.respec.d.mts +2 -0
  189. package/dist/serve-gib/identity-index/identity-index-service.respec.d.mts.map +1 -0
  190. package/dist/serve-gib/identity-index/identity-index-service.respec.mjs +109 -0
  191. package/dist/serve-gib/identity-index/identity-index-service.respec.mjs.map +1 -0
  192. package/dist/serve-gib/identity-index/identity-index-types.d.mts +31 -0
  193. package/dist/serve-gib/identity-index/identity-index-types.d.mts.map +1 -0
  194. package/dist/serve-gib/identity-index/identity-index-types.mjs +2 -0
  195. package/dist/serve-gib/identity-index/identity-index-types.mjs.map +1 -0
  196. package/dist/serve-gib/index.d.mts +50 -0
  197. package/dist/serve-gib/index.d.mts.map +1 -0
  198. package/dist/serve-gib/index.mjs +80 -0
  199. package/dist/serve-gib/index.mjs.map +1 -0
  200. package/dist/serve-gib/keystone-schema-helpers.d.mts +50 -0
  201. package/dist/serve-gib/keystone-schema-helpers.d.mts.map +1 -0
  202. package/dist/serve-gib/keystone-schema-helpers.mjs +99 -0
  203. package/dist/serve-gib/keystone-schema-helpers.mjs.map +1 -0
  204. package/dist/serve-gib/keystone-schema-helpers.respec.d.mts +2 -0
  205. package/dist/serve-gib/keystone-schema-helpers.respec.d.mts.map +1 -0
  206. package/dist/serve-gib/keystone-schema-helpers.respec.mjs +68 -0
  207. package/dist/serve-gib/keystone-schema-helpers.respec.mjs.map +1 -0
  208. package/dist/serve-gib/metaspace-nodeindexedspace/metaspace-nodeindexedspace.d.mts +38 -0
  209. package/dist/serve-gib/metaspace-nodeindexedspace/metaspace-nodeindexedspace.d.mts.map +1 -0
  210. package/dist/serve-gib/metaspace-nodeindexedspace/metaspace-nodeindexedspace.mjs +85 -0
  211. package/dist/serve-gib/metaspace-nodeindexedspace/metaspace-nodeindexedspace.mjs.map +1 -0
  212. package/dist/serve-gib/path-constants.d.mts +102 -0
  213. package/dist/serve-gib/path-constants.d.mts.map +1 -0
  214. package/dist/serve-gib/path-constants.mjs +107 -0
  215. package/dist/serve-gib/path-constants.mjs.map +1 -0
  216. package/dist/serve-gib/path-helper.d.mts +23 -0
  217. package/dist/serve-gib/path-helper.d.mts.map +1 -0
  218. package/dist/serve-gib/path-helper.mjs +107 -0
  219. package/dist/serve-gib/path-helper.mjs.map +1 -0
  220. package/dist/serve-gib/path-helper.respec.d.mts +2 -0
  221. package/dist/serve-gib/path-helper.respec.d.mts.map +1 -0
  222. package/dist/serve-gib/path-helper.respec.mjs +83 -0
  223. package/dist/serve-gib/path-helper.respec.mjs.map +1 -0
  224. package/dist/serve-gib/serve-gib-helpers.d.mts +14 -0
  225. package/dist/serve-gib/serve-gib-helpers.d.mts.map +1 -0
  226. package/dist/serve-gib/serve-gib-helpers.mjs +30 -0
  227. package/dist/serve-gib/serve-gib-helpers.mjs.map +1 -0
  228. package/dist/serve-gib/serve-gib-v1.d.mts +40 -0
  229. package/dist/serve-gib/serve-gib-v1.d.mts.map +1 -0
  230. package/dist/serve-gib/serve-gib-v1.mjs +157 -0
  231. package/dist/serve-gib/serve-gib-v1.mjs.map +1 -0
  232. package/dist/serve-gib/serve-gib.respec.d.mts +2 -0
  233. package/dist/serve-gib/serve-gib.respec.d.mts.map +1 -0
  234. package/dist/serve-gib/serve-gib.respec.mjs +85 -0
  235. package/dist/serve-gib/serve-gib.respec.mjs.map +1 -0
  236. package/dist/serve-gib/server-constants.d.mts +3 -0
  237. package/dist/serve-gib/server-constants.d.mts.map +1 -0
  238. package/dist/serve-gib/server-constants.mjs +3 -0
  239. package/dist/serve-gib/server-constants.mjs.map +1 -0
  240. package/dist/serve-gib/types.d.mts +94 -0
  241. package/dist/serve-gib/types.d.mts.map +1 -0
  242. package/dist/serve-gib/types.mjs +7 -0
  243. package/dist/serve-gib/types.mjs.map +1 -0
  244. package/dist/witness/space/metaspace/metaspace-nodespace/metaspace-nodespace-helper.mjs.map +1 -1
  245. package/dist/witness/space/metaspace/metaspace-nodespace/metaspace-nodespace.d.mts +5 -0
  246. package/dist/witness/space/metaspace/metaspace-nodespace/metaspace-nodespace.d.mts.map +1 -1
  247. package/dist/witness/space/metaspace/metaspace-nodespace/metaspace-nodespace.mjs +37 -0
  248. package/dist/witness/space/metaspace/metaspace-nodespace/metaspace-nodespace.mjs.map +1 -1
  249. package/dist/witness/space/node-filesystem-space/node-filesystem-space-helper.mjs +1 -1
  250. package/dist/witness/space/node-filesystem-space/node-filesystem-space-helper.mjs.map +1 -1
  251. package/dist/witness/space/node-filesystem-space/node-filesystem-space-types.d.mts.map +1 -1
  252. package/dist/witness/space/node-filesystem-space/node-filesystem-space-v1.d.mts.map +1 -1
  253. package/dist/witness/space/node-filesystem-space/node-filesystem-space-v1.mjs.map +1 -1
  254. package/dist/witness/space/node-filesystem-space/node-indexed-filesystem-space/node-indexed-filesystem-space-v1.d.mts.map +1 -1
  255. package/dist/witness/space/node-filesystem-space/node-indexed-filesystem-space/respec/testSpace_createAndInit.node-indexed-filesystem-space-v1.respec.mjs.map +1 -1
  256. package/dist/witness/space/node-filesystem-space/node-indexed-filesystem-space/respec/testSpace_persistTransformResult.node-indexed-filesystem-space-v1.respec.mjs.map +1 -1
  257. package/dist/witness/space/node-filesystem-space/node-indexed-filesystem-space/respec/testSpace_putGetDelete.node-indexed-filesystem-space-v1.respec.mjs.map +1 -1
  258. package/dist/witness/space/node-filesystem-space/node-indexed-filesystem-space/respec/testSpace_registerNewIbGib_GetLatest.node-indexed-filesystem-space-v1.respec.mjs.map +1 -1
  259. package/dist/witness/space/node-filesystem-space/respec/testSpace_createAndInit.node-filesystem-space-v1.respec.mjs.map +1 -1
  260. package/dist/witness/space/node-filesystem-space/respec/testSpace_persistTransformResult.node-filesystem-space-v1.respec.mjs.map +1 -1
  261. package/dist/witness/space/node-filesystem-space/respec/testSpace_putGetDelete.node-filesystem-space-v1.respec.mjs.map +1 -1
  262. package/dist/witness/space/node-filesystem-space/respec/testSpace_registerNewIbGib_GetLatest.node-filesystem-space-v1.respec.mjs.map +1 -1
  263. package/package.json +2 -2
  264. package/src/email/aws/aws-sigv4-helper.mts +139 -0
  265. package/src/email/aws/email-receiver-aws.mts +107 -0
  266. package/src/email/aws/email-sender-aws.mts +130 -0
  267. package/src/email/aws/index.mts +7 -0
  268. package/src/email/email-constants.mts +18 -0
  269. package/src/email/email-helpers.mts +160 -0
  270. package/src/email/email-receiver.mts +29 -0
  271. package/src/email/email-sender.mts +44 -0
  272. package/src/email/email-service.respec.mts +134 -0
  273. package/src/email/email-types.mts +59 -0
  274. package/src/email/index.mts +11 -0
  275. package/src/email/mock/email-sender-mock.mts +54 -0
  276. package/src/email/mock/index.mts +5 -0
  277. package/src/index.mts +41 -0
  278. package/src/respec-gib.node.mts +4 -5
  279. package/src/serve-gib/CHANGELOG.md +34 -0
  280. package/src/serve-gib/README.md +77 -0
  281. package/src/serve-gib/SERVE_REFACTOR_IMPLEMENTATION.md +112 -0
  282. package/src/serve-gib/bootstrap-helper.mts +141 -0
  283. package/src/serve-gib/bootstrap-helper.respec.mts +100 -0
  284. package/src/serve-gib/constants.mts +1 -0
  285. package/src/serve-gib/handlers/api/debug/ws-echo.handler.mts +105 -0
  286. package/src/serve-gib/handlers/api/email/email-inbound.handler.mts +67 -0
  287. package/src/serve-gib/handlers/api/email/email-outbound.handler.mts +82 -0
  288. package/src/serve-gib/handlers/api/health.handler.mts +23 -0
  289. package/src/serve-gib/handlers/api/health.respec.mts +51 -0
  290. package/src/serve-gib/handlers/api/ibgib/ibgib-handler-types.mts +49 -0
  291. package/src/serve-gib/handlers/api/ibgib/ibgib.handler.mts +176 -0
  292. package/src/serve-gib/handlers/api/keystone/keystone-check-email.handler.mts +60 -0
  293. package/src/serve-gib/handlers/api/keystone/keystone-evolve.handler.mts +150 -0
  294. package/src/serve-gib/handlers/api/keystone/keystone-genesis.handler.mts +171 -0
  295. package/src/serve-gib/handlers/api/keystone/keystone-get.handler.mts +198 -0
  296. package/src/serve-gib/handlers/api/keystone/keystone-get.respec.mts +106 -0
  297. package/src/serve-gib/handlers/api/keystone/keystone-handler-types.mts +29 -0
  298. package/src/serve-gib/handlers/api/keystone/keystone-lookup.handler.mts +95 -0
  299. package/src/serve-gib/handlers/api/keystone/keystone-post.handler.mts +75 -0
  300. package/src/serve-gib/handlers/api/keystone/keystone-post.respec.mts +130 -0
  301. package/src/serve-gib/handlers/api/keystone/sso-config.handler.mts +66 -0
  302. package/src/serve-gib/handlers/api/keystone/sso-link.handler.mts +140 -0
  303. package/src/serve-gib/handlers/api/keystone/sso-login.handler.mts +190 -0
  304. package/src/serve-gib/handlers/error-handler.mts +36 -0
  305. package/src/serve-gib/handlers/handler-base.mts +383 -0
  306. package/src/serve-gib/handlers/static-handler.mts +83 -0
  307. package/src/serve-gib/handlers/ws/sync-upgrade-handler-base.mts +233 -0
  308. package/src/serve-gib/handlers/ws/sync-upgrade.handler.mts +24 -0
  309. package/src/serve-gib/handlers/ws/ws-helper.mts +216 -0
  310. package/src/serve-gib/handlers/ws/ws-types.mts +53 -0
  311. package/src/serve-gib/identity-index/identity-index-constants.mts +3 -0
  312. package/src/serve-gib/identity-index/identity-index-helpers.mts +85 -0
  313. package/src/serve-gib/identity-index/identity-index-service.mts +109 -0
  314. package/src/serve-gib/identity-index/identity-index-service.respec.mts +135 -0
  315. package/src/serve-gib/identity-index/identity-index-types.mts +33 -0
  316. package/src/serve-gib/index.mts +92 -0
  317. package/src/serve-gib/keystone-schema-helpers.mts +120 -0
  318. package/src/serve-gib/keystone-schema-helpers.respec.mts +85 -0
  319. package/src/serve-gib/metaspace-nodeindexedspace/metaspace-nodeindexedspace.mts +109 -0
  320. package/src/serve-gib/path-constants.mts +119 -0
  321. package/src/serve-gib/path-helper.mts +101 -0
  322. package/src/serve-gib/path-helper.respec.mts +99 -0
  323. package/src/serve-gib/serve-gib-helpers.mts +32 -0
  324. package/src/serve-gib/serve-gib-v1.mts +172 -0
  325. package/src/serve-gib/serve-gib.respec.mts +90 -0
  326. package/src/serve-gib/server-constants.mts +2 -0
  327. package/src/serve-gib/types.mts +102 -0
  328. package/src/witness/space/metaspace/metaspace-nodespace/metaspace-nodespace.mts +41 -0
  329. package/src/witness/space/node-filesystem-space/node-filesystem-space-helper.mts +1 -1
@@ -0,0 +1,176 @@
1
+ /**
2
+ * @module serve-gib/handlers/api/ibgib
3
+ */
4
+
5
+ import { extractErrorMsg } from '@ibgib/helper-gib/dist/helpers/utils-helper.mjs';
6
+ import { getIbGibAddr } from '@ibgib/ts-gib/dist/helper.mjs';
7
+ import { IbGib_V1 } from '@ibgib/ts-gib/dist/V1/types.mjs';
8
+
9
+ import { GLOBAL_LOG_A_LOT } from '../../../constants.mjs';
10
+ import { ServeGibHandlerWithMetaspaceBase } from '../../handler-base.mjs';
11
+ import { RequestContext, ResponseResult, ServeGibHttpMethod } from '../../../types.mjs';
12
+ import { validateAddressSegment } from '../../../path-helper.mjs';
13
+ import { API_PATH_REGEXES } from '../../../path-constants.mjs';
14
+ import {
15
+ DEFAULT_QUERY_PARAMS_GET_IBGIB, IbGibGetQueryParams, IbGibParams,
16
+ isKnownQueryParamsKey_IbGibGet, KNOWN_QUERY_PARAMS_IBGIB_GET
17
+ } from './ibgib-handler-types.mjs';
18
+ import { validateAndCoerceBooleanQueryParam } from '../../../serve-gib-helpers.mjs';
19
+
20
+ export interface IbGibGraphResponseBody {
21
+ addr: string;
22
+ count: number;
23
+ graph: Record<string, IbGib_V1>;
24
+ }
25
+
26
+ const logalot = GLOBAL_LOG_A_LOT;
27
+
28
+ /**
29
+ * GET /api/ibgib/:domainAddr/:ibGibAddr
30
+ */
31
+ export class IbGibHandler extends ServeGibHandlerWithMetaspaceBase<IbGibParams, IbGibGetQueryParams> {
32
+ protected override lc: string = `[${IbGibHandler.name}]`;
33
+ protected override method: ServeGibHttpMethod = 'GET';
34
+ protected override regex = API_PATH_REGEXES.IBGIB_ADDR;
35
+
36
+ protected override async parseParamsImpl(reqCtx: RequestContext<IbGibParams, IbGibGetQueryParams>): Promise<IbGibParams | undefined> {
37
+ const lc = `${this.lc}[${this.parseParamsImpl.name}]`;
38
+ try {
39
+ if (logalot) { console.log(`${lc} starting...`); }
40
+ const match = reqCtx.pathname.match(this.regex);
41
+ if (!match) { throw new Error(`(UNEXPECTED) match falsy for regex? at this point, we have passed canHandleRoute, so this should parse correctly. (E: 8ce0810a3a88f420639bf8286df1d826)`); }
42
+ const domainIb = decodeURIComponent(match[1]);
43
+ const domainGib = decodeURIComponent(match[2]);
44
+ const domainAddr = getIbGibAddr({ ib: domainIb, gib: domainGib });
45
+ const ibGibIb = decodeURIComponent(match[3]);
46
+ const ibGibGib = decodeURIComponent(match[4]);
47
+ const ibGibAddr = getIbGibAddr({ ib: ibGibIb, gib: ibGibGib });
48
+ return {
49
+ ibGibIb, ibGibGib, ibGibAddr,
50
+ domainInfo: this.getDomainInfo({ domainAddr }),
51
+ };
52
+ } catch (error) {
53
+ console.error(`${lc} ${extractErrorMsg(error)}`);
54
+ throw error;
55
+ } finally {
56
+ if (logalot) { console.log(`${lc} complete.`); }
57
+ }
58
+ }
59
+
60
+ protected override async validateQueryParams({ queryParams }: { queryParams: any; }): Promise<string[]> {
61
+ const lc = `${this.lc}[${this.validateQueryParams.name}]`;
62
+ try {
63
+ if (logalot) { console.log(`${lc} starting...`); }
64
+
65
+ const errors: string[] = [];
66
+
67
+ // strict checking
68
+ const queryParamsKeys = Object.keys(queryParams);
69
+ const invalidKeys: string[] = queryParamsKeys.filter(x => !isKnownQueryParamsKey_IbGibGet(x));
70
+ if (invalidKeys.length > 0) {
71
+ throw new Error(`invalid query params keys: ${invalidKeys.join(', ')}. valid query params keys: ${KNOWN_QUERY_PARAMS_IBGIB_GET.join(', ')} (E: b7e8a9f2c1d34e56b89a01d4f2e7c326)`);
72
+ }
73
+
74
+ // Enforce that EVERY key must have a validation function mapping
75
+ type ValidationFn = () => Promise<void>;
76
+ const ValidationFns: Record<KNOWN_QUERY_PARAMS_IBGIB_GET, ValidationFn> = {
77
+ getLatest: async () => validateAndCoerceBooleanQueryParam(queryParams, 'getLatest', errors),
78
+ getGraph: async () => validateAndCoerceBooleanQueryParam(queryParams, 'getGraph', errors),
79
+ addrOnly: async () => validateAndCoerceBooleanQueryParam(queryParams, 'addrOnly', errors),
80
+ };
81
+
82
+ // execute all validation functions
83
+ for (const fn of Object.values(ValidationFns)) {
84
+ await fn();
85
+ }
86
+
87
+ return errors;
88
+
89
+ } catch (error) {
90
+ console.error(`${lc} ${extractErrorMsg(error)}`);
91
+ throw error;
92
+ } finally {
93
+ if (logalot) { console.log(`${lc} complete.`); }
94
+ }
95
+ }
96
+
97
+ protected async handleRouteImpl(reqCtx: RequestContext<IbGibParams, IbGibGetQueryParams>): Promise<ResponseResult | undefined> {
98
+ const lc = `${this.lc}[${this.handleRouteImpl.name}]`;
99
+ try {
100
+ if (logalot) { console.log(`${lc} starting... (I: 03d6a889b1f8af879c0f7158a3b3de26)`); }
101
+
102
+ if (logalot) { console.log(`${lc} starting... (I: 03d6a889b1f8af879c0f7158a3b3de26)`); }
103
+ if (!reqCtx.metaspace) { throw new Error(`(UNEXPECTED) metaspace falsy? we should have initialized it by now since this is a domain-dependent handler (E: 864661c668d2aa1918b7ee677a7d9c26)`); }
104
+
105
+ const { ibGibIb, ibGibGib } = reqCtx.params as IbGibParams;
106
+ if (!ibGibIb || !ibGibGib) { return undefined; }
107
+
108
+ // Reconstruct addr from params
109
+ const rawAddr = `${ibGibIb}^${ibGibGib}`;
110
+ if (!validateAddressSegment(rawAddr)) return this.error(400, 'Invalid address format');
111
+ const addr = rawAddr;
112
+
113
+ const queryParams = {
114
+ ...DEFAULT_QUERY_PARAMS_GET_IBGIB,
115
+ ...(reqCtx.queryParams ?? {}),
116
+ };
117
+
118
+ const { getLatest, getGraph, addrOnly } = queryParams;
119
+
120
+ const space = await reqCtx.metaspace.getLocalUserSpace({ lock: false });
121
+ if (!space) { throw new Error(`(UNEXPECTED) couldn't get default local user space? (E: ec6161ea3a08892ad8bfd1b7b0d79826)`); }
122
+
123
+ let addr_latest: string = addr;
124
+ if (getLatest) {
125
+ const latestAddr = await reqCtx.metaspace.getLatestAddr({ addr, space });
126
+ if (latestAddr) { addr_latest = latestAddr; }
127
+ }
128
+
129
+ // Lightweight tip-check: return only the resolved address.
130
+ // Client uses this to decide whether a full sync is necessary
131
+ // without incurring the cost of fetching the full ibgib or graph.
132
+ if (addrOnly && !getGraph) {
133
+ return this.ok({ addr: addr_latest, clientAddr: addr });
134
+ } /* <<<<< returns early */
135
+
136
+ if (getGraph) {
137
+ const resGraph = await reqCtx.metaspace.getDependencyGraph({
138
+ ibGibAddr: addr_latest,
139
+ space,
140
+ live: getLatest,
141
+ });
142
+ const addrs = Object.keys(resGraph);
143
+ if (addrs.length > 0) {
144
+ if (addrOnly) {
145
+ // Return only the address list for delta negotiation (smart diff):
146
+ // client compares these against what it already has to determine
147
+ // the minimal set it needs to fetch.
148
+ return this.ok({ addr: addr_latest, clientAddr: addr, addrs });
149
+ } else {
150
+ const responseBody: IbGibGraphResponseBody = {
151
+ addr: addr_latest,
152
+ count: addrs.length,
153
+ graph: resGraph
154
+ };
155
+ return this.ok(responseBody);
156
+ }
157
+ } else {
158
+ return this.notFound(`Graph not found for ${addr_latest} (E: 89b259f13ae5e4f0d8287f6c0475a826)`);
159
+ }
160
+ } else {
161
+ const resGet = await reqCtx.metaspace.get({ space, addr: addr_latest });
162
+ if (resGet.success && resGet.ibGibs?.length === 1) {
163
+ const ibGib = resGet.ibGibs[0];
164
+ return this.ok(ibGib);
165
+ } else {
166
+ return this.notFound(`IbGib not found for ${addr_latest} (E: 017621e0a8086832ff06cfc884b8c426)`);
167
+ }
168
+ }
169
+ } catch (error) {
170
+ if (logalot) { console.error(extractErrorMsg(error)) }
171
+ return this.error(500, extractErrorMsg(error));
172
+ } finally {
173
+ if (logalot) { console.log(`${lc} complete.`); }
174
+ }
175
+ }
176
+ }
@@ -0,0 +1,60 @@
1
+ /**
2
+ * @module serve-gib/handlers/api/keystone/keystone-check-email.handler
3
+ *
4
+ * GET /api/keystone/check-email?email=foo@example.com
5
+ *
6
+ * Checks whether an email address is already registered in the server identity index.
7
+ */
8
+
9
+ import * as path from 'node:path';
10
+ import { extractErrorMsg } from '@ibgib/helper-gib/dist/helpers/utils-helper.mjs';
11
+ import { IdentityIndexService } from '../../../identity-index/identity-index-service.mjs';
12
+ import { getIdentityEmailHash } from '../../../identity-index/identity-index-helpers.mjs';
13
+ import { ServeGibHandlerBase } from '../../handler-base.mjs';
14
+ import { RequestContext, ResponseResult, ServeGibHttpMethod } from '../../../types.mjs';
15
+ import { API_PATH_REGEXES } from '../../../path-constants.mjs';
16
+
17
+ /**
18
+ * GET /api/keystone/check-email
19
+ */
20
+ export class KeystoneCheckEmailHandler extends ServeGibHandlerBase<undefined, { email?: string }> {
21
+ protected override lc: string = `[${KeystoneCheckEmailHandler.name}]`;
22
+ protected override method: ServeGibHttpMethod = 'GET';
23
+ protected override regex = API_PATH_REGEXES.KEYSTONE_CHECK_EMAIL;
24
+
25
+ protected async handleRouteImpl(
26
+ reqCtx: RequestContext<undefined, { email?: string }>
27
+ ): Promise<ResponseResult | undefined> {
28
+ const lc = `${this.lc}[${this.handleRouteImpl.name}]`;
29
+ try {
30
+ // Anti-timing side-channel protection: add bounded random jitter delay (150ms-350ms)
31
+ const jitterMs = Math.floor(Math.random() * 200) + 150;
32
+ await new Promise(resolve => setTimeout(resolve, jitterMs));
33
+ const email = (reqCtx.queryParams?.email || '').trim();
34
+ if (!email) {
35
+ console.error(`${lc} Check-email request missing email query parameter.`);
36
+ return this.error(400, 'Query param email is required');
37
+ }
38
+
39
+ const indexService = new IdentityIndexService({ baseDir: path.join(reqCtx.dataDir, 'index') });
40
+ const record = await indexService.getEmailIndex({ email });
41
+
42
+ if (record) {
43
+ console.log(`${lc} Email '${email}' is already registered.`);
44
+ return this.ok({
45
+ available: false,
46
+ message: 'Email/Identity already registered'
47
+ });
48
+ }
49
+
50
+ console.log(`${lc} Email '${email}' is available.`);
51
+ return this.ok({
52
+ available: true
53
+ });
54
+ } catch (error) {
55
+ const emsg = extractErrorMsg(error);
56
+ console.error(`${lc} ${emsg}`);
57
+ return this.error(500, emsg);
58
+ }
59
+ }
60
+ }
@@ -0,0 +1,150 @@
1
+ /**
2
+ * @module serve-gib/handlers/api/keystone/keystone-evolve.handler
3
+ *
4
+ * PUT /api/keystone/evolve/:domainAddr
5
+ *
6
+ * Receives an evolved domain keystone (`I^I1.Itjp`) and any related
7
+ * ibgibs (e.g., the `S^Stjp` session keystone).
8
+ *
9
+ * Validates the evolution, verifies the `S` session keystone, and persists
10
+ * them to the domain metaspace to authorize the sync session.
11
+ */
12
+
13
+ import { extractErrorMsg } from '@ibgib/helper-gib/dist/helpers/utils-helper.mjs';
14
+ import { getIbGibAddr } from '@ibgib/ts-gib/dist/helper.mjs';
15
+ import { IbGib_V1 } from '@ibgib/ts-gib/dist/V1/types.mjs';
16
+ import { validateAndRegisterEvolveKeystone } from '@ibgib/core-gib/dist/sync/sync-peer/sync-peer-websocket/sync-peer-websocket-receiver/sync-websocket-peer-helpers.mjs';
17
+ import { KeystoneIbGib_V1 } from '@ibgib/core-gib/dist/keystone/keystone-types.mjs';
18
+ import { loadSsoServerConfig } from '@ibgib/web-gib/dist/identity/sso/sso-config-helper.mjs';
19
+ import { SsoCustodianService } from '@ibgib/web-gib/dist/identity/sso/sso-custodian-service.mjs';
20
+
21
+ import { GLOBAL_LOG_A_LOT } from '../../../constants.mjs';
22
+ import { ServeGibHandlerWithMetaspaceBase } from '../../handler-base.mjs';
23
+ import { API_PATH_REGEXES } from '../../../path-constants.mjs';
24
+ import { ParamsWithDomain, RequestContext, ResponseResult } from '../../../types.mjs';
25
+
26
+ const logalot = GLOBAL_LOG_A_LOT || true;
27
+
28
+ interface EvolveParams extends ParamsWithDomain {
29
+ domainAddr: string;
30
+ }
31
+
32
+ /**
33
+ * Body payload for the Keystone Evolve REST API request.
34
+ */
35
+ interface EvolveBody {
36
+ /** The main evolved keystone frame. */
37
+ keystoneIbGib: KeystoneIbGib_V1;
38
+ /**
39
+ * Array of other keystone frames related to this evolution.
40
+ * Ephemeral session keystones for sync, or persistent delegate keystones for manage.
41
+ */
42
+ relatedKeystoneIbGibs?: IbGib_V1[];
43
+ /** Optional map of providerId to token to revoke during unlinking. */
44
+ revokeTokens?: Record<string, string>;
45
+ }
46
+
47
+ export class KeystoneEvolveHandler extends ServeGibHandlerWithMetaspaceBase<EvolveParams, EvolveBody> {
48
+ protected override lc: string = `[${KeystoneEvolveHandler.name}]`;
49
+ protected override method: 'PUT' = 'PUT';
50
+ protected override regex = API_PATH_REGEXES.KEYSTONE_EVOLVE;
51
+
52
+ protected override async parseParamsImpl(reqCtx: RequestContext<EvolveParams, any>): Promise<EvolveParams | undefined> {
53
+ const match = reqCtx.pathname.match(this.regex);
54
+ if (match && match.length >= 3) {
55
+ const domainIb = decodeURIComponent(match[1]);
56
+ const domainGib = decodeURIComponent(match[2]);
57
+ const domainAddr = getIbGibAddr({ ib: domainIb, gib: domainGib });
58
+ return {
59
+ domainAddr,
60
+ domainInfo: this.getDomainInfo({ domainAddr })
61
+ };
62
+ } else {
63
+ return undefined;
64
+ }
65
+ }
66
+
67
+ protected override async validateQueryParams({ queryParams }: { queryParams: any; }): Promise<string[]> {
68
+ return []; // We don't expect any query parameters for evolution
69
+ }
70
+
71
+ protected override async handleRouteImpl(reqCtx: RequestContext<EvolveParams>): Promise<ResponseResult> {
72
+ const lc = `${this.lc}[handleRouteImpl]`;
73
+ try {
74
+ if (logalot) { console.log(`${lc} starting...`); }
75
+
76
+ if (!reqCtx.params) { return this.error(400, 'Invalid parameters'); }
77
+ if (!reqCtx.metaspace) { return this.error(500, 'Metaspace not initialized'); }
78
+
79
+ const { domainAddr } = reqCtx.params;
80
+ const bodyStr = reqCtx.body;
81
+ if (!bodyStr) { return this.error(400, 'Empty body'); }
82
+
83
+ let parsed: EvolveBody;
84
+ try {
85
+ parsed = JSON.parse(bodyStr);
86
+ } catch (err) {
87
+ return this.error(400, 'Invalid request JSON body: bodyStr does NOT parse. (E: 2f81c8c80a6884ff32b877671e92f326)');
88
+ }
89
+
90
+ const { keystoneIbGib, relatedKeystoneIbGibs = [] } = parsed;
91
+ if (!keystoneIbGib) {
92
+ return this.error(400, 'Invalid request. Body must contain keystoneIbGib (E: e234647f79282982c8012fe8015f5826)');
93
+ }
94
+
95
+ const space = await reqCtx.metaspace.getLocalUserSpace({ lock: false });
96
+ if (!space) {
97
+ return this.error(500, 'No local user space found (E: a1144e5d6cd9641fb82d6b359f131126)');
98
+ }
99
+
100
+ // Delegate all intrinsic checks, transition rules, pool restrictions, and registration/persistence to core-gib helper
101
+ await validateAndRegisterEvolveKeystone({
102
+ domainAddr,
103
+ keystoneIbGib,
104
+ relatedKeystoneIbGibs,
105
+ metaspace: reqCtx.metaspace,
106
+ space
107
+ });
108
+
109
+ // Post-Evolution Hook: Handle SSO provider unlinking
110
+ const claim = keystoneIbGib.data?.proofs?.[0]?.claim;
111
+ if (claim?.details?.type === 'remove-pool') {
112
+ const removeInfo = claim.details.info;
113
+ if (removeInfo && Array.isArray(removeInfo.remove)) {
114
+ // Lazy-load custodian service config
115
+ const config = loadSsoServerConfig();
116
+ const custodian = new SsoCustodianService(config);
117
+
118
+ for (const poolId of removeInfo.remove) {
119
+ if (poolId.startsWith('custodian-manage-')) {
120
+ const providerId = poolId.replace('custodian-manage-', '');
121
+ console.log(`${lc} Evolved keystone removed custodian pool: ${poolId}. Performing unlink cleanup for provider: ${providerId}`);
122
+
123
+ // Revoke token if supplied by the client
124
+ const token = parsed.revokeTokens?.[providerId];
125
+ if (token) {
126
+ try {
127
+ await custodian.revokeToken(providerId as any, token);
128
+ } catch (e) {
129
+ console.warn(`${lc} Failed to revoke token for provider ${providerId}: ${extractErrorMsg(e)}`);
130
+ }
131
+ } else {
132
+ console.log(`${lc} No OAuth token supplied by client for revocation of provider: ${providerId}`);
133
+ }
134
+ }
135
+ }
136
+ }
137
+ }
138
+
139
+ return this.ok({
140
+ message: `Successfully evolved domain keystone with session keystone`,
141
+ });
142
+
143
+ } catch (error) {
144
+ console.error(`${lc} ${extractErrorMsg(error)}`);
145
+ return this.error(422, `Evolve validation/persistence failed: ${extractErrorMsg(error)}`);
146
+ } finally {
147
+ if (logalot) { console.log(`${lc} complete.`); }
148
+ }
149
+ }
150
+ }
@@ -0,0 +1,171 @@
1
+ /**
2
+ * @module serve-gib/handlers/api/keystone/keystone-genesis.handler
3
+ *
4
+ * POST /api/keystone/genesis
5
+ *
6
+ * Accepts a single genesis-frame keystone ibgib from the client and
7
+ * bootstraps a new domain-isolated metaspace for it.
8
+ *
9
+ * ## request body
10
+ *
11
+ * ```json
12
+ * { "keystoneIbGib": <KeystoneIbGib_V1> }
13
+ * ```
14
+ *
15
+ * ## validation steps
16
+ *
17
+ * 1. Body contains `keystoneIbGib` (single ibgib, not an array).
18
+ * 2. Intrinsic hash validation passes (`validateIbGibIntrinsically`).
19
+ * 3. Structural keystone check: `ib` starts with `"keystone"`, no `past` in
20
+ * `rel8ns` (genesis = TJP frame, no prior timeline).
21
+ * 4. Domain uniqueness: the path derived from the keystone's tjpGib must not
22
+ * already exist on disk — if it does, return 409 Conflict.
23
+ * 5. Bootstrap: call `bootstrapDomainMetaspace` to create folders + metaspace.
24
+ * 6. Persist the keystone ibgib into the newly created domain space.
25
+ *
26
+ * ## notes
27
+ *
28
+ * Unlike domain-scoped handlers, this handler does NOT rely on
29
+ * `reqCtx.metaspace` (which is undefined when no domain exists yet). It
30
+ * creates the metaspace itself using `bootstrapDomainMetaspace`.
31
+ */
32
+
33
+ import { existsSync } from 'node:fs';
34
+ import * as path from 'node:path';
35
+
36
+ import { extractErrorMsg, pretty } from '@ibgib/helper-gib/dist/helpers/utils-helper.mjs';
37
+ import { getIbGibAddr } from '@ibgib/ts-gib/dist/helper.mjs';
38
+ import { validateIbGibIntrinsically } from '@ibgib/ts-gib/dist/V1/validate-helper.mjs';
39
+ import { getGibInfo } from '@ibgib/ts-gib/dist/V1/transforms/transform-helper.mjs';
40
+ import { KeystoneService_V1 } from '@ibgib/core-gib/dist/keystone/keystone-service-v1.mjs';
41
+ import { IdentityIndexService } from '../../../identity-index/identity-index-service.mjs';
42
+
43
+ import { GLOBAL_LOG_A_LOT } from '../../../constants.mjs';
44
+ import { ServeGibHandlerBase } from '../../handler-base.mjs';
45
+ import { RequestContext, ResponseResult, ServeGibHttpMethod } from '../../../types.mjs';
46
+ import { API_PATH_REGEXES } from '../../../path-constants.mjs';
47
+ import { getDomainRootPath } from '../../../bootstrap-helper.mjs';
48
+ import { bootstrapDomainMetaspace } from '../../../bootstrap-helper.mjs';
49
+
50
+ const logalot = GLOBAL_LOG_A_LOT || true;
51
+
52
+
53
+
54
+
55
+ /**
56
+ * POST /api/keystone/genesis
57
+ *
58
+ * No path params — the domain is derived from the incoming keystone ibgib.
59
+ */
60
+ export class KeystoneGenesisHandler extends ServeGibHandlerBase<undefined, undefined> {
61
+ protected override lc: string = `[${KeystoneGenesisHandler.name}]`;
62
+ protected override method: ServeGibHttpMethod = 'POST';
63
+ protected override regex = API_PATH_REGEXES.KEYSTONE_GENESIS;
64
+
65
+ protected async handleRouteImpl(
66
+ reqCtx: RequestContext<undefined, undefined>
67
+ ): Promise<ResponseResult | undefined> {
68
+ const lc = `${this.lc}[${this.handleRouteImpl.name}]`;
69
+ try {
70
+ if (logalot) { console.log(`${lc} starting... (I: a1b2c3d4e5f6a7b8c9d0e1f2a3b4c526)`); }
71
+
72
+ // ----------------------------------------------------------------
73
+ // 1. Parse body — expect { keystoneIbGib }
74
+ // ----------------------------------------------------------------
75
+ let parsed: any;
76
+ try {
77
+ parsed = JSON.parse(reqCtx.body);
78
+ } catch {
79
+ return this.error(400, 'Request body must be valid JSON (E: dd8618857568f8fc5e9c62b8ed135826)');
80
+ }
81
+
82
+ const { keystoneIbGib } = parsed;
83
+ if (!keystoneIbGib) {
84
+ return this.error(400, 'Body must contain keystoneIbGib (E: 9c8c5d979d7842cd716ba64f69349c26)');
85
+ }
86
+
87
+ // ----------------------------------------------------------------
88
+ // 2. Intrinsic hash validation
89
+ // ----------------------------------------------------------------
90
+ const intrinsicErrors = await validateIbGibIntrinsically({ ibGib: keystoneIbGib });
91
+ if (intrinsicErrors) {
92
+ return this.error(422, 'Intrinsic keystone validation failed (E: 76d388e198f23a87dd6596f59c36e826)', { errors: intrinsicErrors });
93
+ }
94
+
95
+ // ----------------------------------------------------------------
96
+ // 3. Structural keystone + genesis-frame checks
97
+ // ----------------------------------------------------------------
98
+ const keystoneService = new KeystoneService_V1();
99
+ const keystoneErrors = await keystoneService.validateGenesisKeystone({
100
+ keystoneIbGib
101
+ });
102
+ if (keystoneErrors && keystoneErrors.length > 0) {
103
+ return this.error(422, `Keystone genesis validation failed. Errors: ${keystoneErrors} (E: 8384285be7a8ab0d41cfd1df2e2aa826)`, { errors: keystoneErrors });
104
+ }
105
+
106
+ // ----------------------------------------------------------------
107
+ // 4. Domain uniqueness & Email Index Registration
108
+ // ----------------------------------------------------------------
109
+ const addr = getIbGibAddr({ ibGib: keystoneIbGib });
110
+ const { tjpGib, punctiliarHash } = getGibInfo({ ibGibAddr: addr });
111
+ const domainGib = tjpGib || punctiliarHash;
112
+ if (!domainGib) {
113
+ return this.error(422, `Could not extract domain identifier from keystone address: ${addr} (E: 2758588a6d7cc77f078e97989feed326)`);
114
+ }
115
+
116
+ const domainRootPath = getDomainRootPath(domainGib, reqCtx.dataDir);
117
+ if (existsSync(domainRootPath)) {
118
+ return this.error(409, `Domain already exists for this keystone (tjpGib: ${domainGib}). Use PUT /api/keystone/evolve/:domainAddr to evolve. (E: 1c56c8885781c86df89cbdfc1b310626)`);
119
+ }
120
+
121
+ // Extract email addresses attached to primary identity keystone (if present)
122
+ const emails: string[] = keystoneIbGib.data?.emails ?? keystoneIbGib.data?.frameDetails?.emails ?? [];
123
+ const indexService = new IdentityIndexService({ baseDir: path.join(reqCtx.dataDir, 'index') });
124
+ const registeredHashes: string[] = [];
125
+
126
+ if (emails.length > 0) {
127
+ try {
128
+ for (const email of emails) {
129
+ const { emailHash } = await indexService.registerEmailIndex({ email, tjpAddr: addr });
130
+ registeredHashes.push(emailHash);
131
+ }
132
+ } catch (err: any) {
133
+ if (err.message.includes('duplicate_identity_409')) {
134
+ // Roll back any hashes registered in this transaction before throwing
135
+ for (const emailHash of registeredHashes) {
136
+ try { await indexService.getEmailIndexByHash({ emailHash }); } catch { /* ignore */ }
137
+ }
138
+ return this.error(409, `Email/Identity already registered (E: duplicate_identity_409)`);
139
+ }
140
+ throw err;
141
+ }
142
+ }
143
+
144
+ // ----------------------------------------------------------------
145
+ // 5. Bootstrap the new domain metaspace (creates folders)
146
+ // ----------------------------------------------------------------
147
+ const metaspace = await bootstrapDomainMetaspace(addr, reqCtx.dataDir);
148
+
149
+ // ----------------------------------------------------------------
150
+ // 6. Persist the genesis keystone into the new domain space
151
+ // ----------------------------------------------------------------
152
+ const space = await metaspace.getLocalUserSpace({ lock: false });
153
+ if (!space) {
154
+ throw new Error(`(UNEXPECTED) Could not get local user space after bootstrapping domain for ${addr} (E: b1c2d3e4f5a6b7c8d9e0f1a2b3c4d526)`);
155
+ }
156
+
157
+ await metaspace.put({ ibGibs: [keystoneIbGib], space });
158
+ await metaspace.registerNewIbGib({ ibGib: keystoneIbGib, space });
159
+
160
+ console.log(`${lc} domain created and keystone persisted: ${addr}`);
161
+ // if (logalot) { console.log(`${lc} keystoneIbGib: ${pretty(keystoneIbGib)} (I: d598c6ff7a48997d585b84c19c464826)`); }
162
+ return this.ok({ success: true, addr }, 201);
163
+ } catch (error) {
164
+ const emsg = extractErrorMsg(error);
165
+ console.error(`${lc} ${emsg}`);
166
+ return this.error(500, emsg);
167
+ } finally {
168
+ if (logalot) { console.log(`${lc} complete.`); }
169
+ }
170
+ }
171
+ }