@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,198 @@
1
+ /**
2
+ * @module serve-gib/handlers/api/keystone
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
+ import { getGibInfo } from '@ibgib/ts-gib/dist/V1/transforms/transform-helper.mjs';
9
+ import { IbGibAddr } from '@ibgib/ts-gib/dist/types.mjs';
10
+ import { KeystoneService_V1 } from '@ibgib/core-gib/dist/keystone/keystone-service-v1.mjs';
11
+ import { validateKeystoneGraph } from '@ibgib/core-gib/dist/keystone/keystone-helpers.mjs';
12
+ import { KeystoneIbGib_V1 } from '@ibgib/core-gib/dist/keystone/keystone-types.mjs';
13
+ import { IbGibSpaceResultData, IbGibSpaceResultIbGib, IbGibSpaceResultRel8ns } from '@ibgib/core-gib/dist/witness/space/space-types.mjs';
14
+
15
+ import { GLOBAL_LOG_A_LOT } from '../../../constants.mjs';
16
+ import { ServeGibHandlerWithMetaspaceBase } from '../../handler-base.mjs';
17
+ import { RequestContext, ResponseResult, ServeGibHttpMethod } from '../../../types.mjs';
18
+ import { API_PATH_REGEXES } from '../../../path-constants.mjs';
19
+ import {
20
+ DEFAULT_QUERY_PARAMS_GET_KEYSTONE, isKnownQueryParamsKey_KeystoneGet,
21
+ KeystoneGetQueryParams, KeystoneParams, KNOWN_QUERY_PARAMS_KEYSTONE_GET
22
+ } from './keystone-handler-types.mjs';
23
+ import { validateAndCoerceBooleanQueryParam } from '../../../serve-gib-helpers.mjs';
24
+
25
+ export interface KeystoneGetResponseBody {
26
+ domainGraph: Record<string, KeystoneIbGib_V1>;
27
+ }
28
+
29
+ const logalot = GLOBAL_LOG_A_LOT;
30
+
31
+ /**
32
+ * GET /api/keystone/:domainAddr
33
+ * GET /api/keystone/:domainAddr&getLatest=true
34
+ */
35
+ export class KeystoneGetHandler extends ServeGibHandlerWithMetaspaceBase<KeystoneParams, KeystoneGetQueryParams> {
36
+ protected override lc: string = `[${KeystoneGetHandler.name}]`;
37
+ protected override method: ServeGibHttpMethod = 'GET';
38
+ protected override regex = API_PATH_REGEXES.KEYSTONE_ADDR;
39
+
40
+ protected override async parseParamsImpl(reqCtx: RequestContext<KeystoneParams, KeystoneGetQueryParams>): Promise<KeystoneParams | undefined> {
41
+ const lc = `${this.lc}[${this.parseParamsImpl.name}]`;
42
+ try {
43
+ if (logalot) { console.log(`${lc} starting...`); }
44
+ const match = reqCtx.pathname.match(this.regex);
45
+ if (!match) { throw new Error(`(UNEXPECTED) match falsy for regex? at this point, we have passed canHandleRoute, so this should parse correctly. (E: 02c868316604c7c26823380885b79c26)`); }
46
+
47
+ const domainIb = decodeURIComponent(match[1]);
48
+ const domainGib = decodeURIComponent(match[2]);
49
+ const domainAddr = getIbGibAddr({ ib: domainIb, gib: domainGib });
50
+ return {
51
+ domainInfo: this.getDomainInfo({ domainAddr }),
52
+ };
53
+ } catch (error) {
54
+ console.error(`${lc} ${extractErrorMsg(error)}`);
55
+ throw error;
56
+ } finally {
57
+ if (logalot) { console.log(`${lc} complete.`); }
58
+ }
59
+ }
60
+
61
+ protected override async validateQueryParams({ queryParams }: { queryParams: any; }): Promise<string[]> {
62
+ const lc = `${this.lc}[${this.validateQueryParams.name}]`;
63
+ try {
64
+ if (logalot) { console.log(`${lc} starting... (I: f619e8121988498cd8e8928986663826)`); }
65
+
66
+ const errors: string[] = [];
67
+
68
+ // strict checking
69
+ const queryParamsKeys = Object.keys(queryParams);
70
+ const invalidKeys: string[] = queryParamsKeys.filter(x => !isKnownQueryParamsKey_KeystoneGet(x));
71
+ if (invalidKeys.length > 0) {
72
+ throw new Error(`invalid query params keys: ${invalidKeys.join(', ')}. valid query params keys: ${KNOWN_QUERY_PARAMS_KEYSTONE_GET.join(', ')} (E: f9642823b568a1cfe89e0401567ac826)`);
73
+ }
74
+
75
+ // Enforce that EVERY key must have a validation function mapping
76
+ type ValidationFn = () => Promise<void>;
77
+ const ValidationFns: Record<KNOWN_QUERY_PARAMS_KEYSTONE_GET, ValidationFn> = {
78
+ getLatest: async () => {
79
+ validateAndCoerceBooleanQueryParam(queryParams, 'getLatest', errors);
80
+ },
81
+ getGraph: async () => {
82
+ validateAndCoerceBooleanQueryParam(queryParams, 'getGraph', errors);
83
+ },
84
+ };
85
+
86
+ // execute all validation functions
87
+ for (const fn of Object.values(ValidationFns)) {
88
+ await fn();
89
+ }
90
+
91
+ return errors;
92
+
93
+ } catch (error) {
94
+ console.error(`${lc} ${extractErrorMsg(error)}`);
95
+ throw error;
96
+ } finally {
97
+ if (logalot) { console.log(`${lc} complete.`); }
98
+ }
99
+ }
100
+
101
+ protected async handleRouteImpl(reqCtx: RequestContext<KeystoneParams, KeystoneGetQueryParams>): Promise<ResponseResult | undefined> {
102
+ const lc = `[${this.handleRouteImpl.name}]`;
103
+ try {
104
+ if (logalot) { console.log(`${lc} starting...`); }
105
+
106
+ const { metaspace } = reqCtx;
107
+ if (!metaspace) { throw new Error(`(UNEXPECTED) reqCtx.metaspace falsy? (E: 871a396f7e824989981a1508d0d17826)`); }
108
+
109
+ const { domainInfo } = reqCtx.params as KeystoneParams;
110
+ if (!domainInfo) { throw new Error(`(UNEXPECTED) reqCtx.params.domainInfo falsy? at this point, we've passed canHandleRoute so this should be truthy (E: 5d3e96d9f8d8f65258d530af0e223826)`); }
111
+ const { addr: domainAddr } = domainInfo;
112
+
113
+ // if (!domainIb || !domainGib) { return this.error(400, 'Keystone address required'); }
114
+ // const addr = `${domainIb}^${domainGib}`;
115
+
116
+ if (logalot) { console.log(`${lc} domainAddr: ${domainAddr} (I: ea08786359e85481a89c77d84e8f0826)`); }
117
+
118
+ // there are two paths for this: getLatest or not (get exact given addr)
119
+ // this should be driven by queryParams
120
+
121
+ const queryParams = {
122
+ ...DEFAULT_QUERY_PARAMS_GET_KEYSTONE,
123
+ ...(reqCtx.queryParams ?? {}),
124
+ }
125
+
126
+ const { getLatest, getGraph } = queryParams;
127
+
128
+ if (!getLatest) { throw new Error(`"getLatest: false" not implemented yet. currently this always returns the graph. (E: befd28156438a0b538cf107872e89b26)`); }
129
+ if (!getGraph) { throw new Error(`"getGraph: false" not implemented yet. currently this always returns the graph. (E: 84c8a88fdb28e72d884addb8f43fc826)`); }
130
+
131
+ /**
132
+ * get the default local user space that corresponds to the current
133
+ * keystone domain (which is what the metaspace was initialized
134
+ * with).
135
+ */
136
+ const space = await metaspace.getLocalUserSpace({ lock: false });
137
+ if (!space) { throw new Error(`(UNEXPECTED) space falsy? we couldn't get the default local userspace from the metaspace for the addr (${domainAddr}) (E: 934551f1845f94c8320a8a980025c526)`); }
138
+
139
+
140
+ // use this code later if we de
141
+ let domainAddr_latest: IbGibAddr = domainAddr;
142
+ if (getLatest) {
143
+ const latestAddr = await metaspace.getLatestAddr({ addr: domainAddr, space });
144
+ if (latestAddr) { domainAddr_latest = latestAddr; }
145
+ }
146
+
147
+
148
+ const domainGraph = await metaspace.getDependencyGraph({
149
+ ibGibAddr: domainAddr_latest,
150
+ /**
151
+ * since domain is a keystone, "live" is not needed because the
152
+ * entire graph is composed of stones with no timelines.
153
+ */
154
+ live: false,
155
+ space,
156
+ });
157
+
158
+ let keystoneIbGib: KeystoneIbGib_V1 = domainGraph[domainAddr_latest] as KeystoneIbGib_V1;
159
+ if (!keystoneIbGib) {
160
+ const errorMsg_addrInfo = domainAddr_latest === domainAddr ?
161
+ `domainAddr: ${domainAddr}` :
162
+ `domainAddr: ${domainAddr}, domainAddr_latest: `
163
+ return this.error(404, `Keystone not found. ${errorMsg_addrInfo} (E: 0238c85f94889607088220a324db1826)`); /* <<<< returns early */
164
+ }
165
+
166
+ // go ahead and validate even though we just pulled this (should be
167
+ // valid or it shouldn't have been persisted)
168
+
169
+ const keystoneValidationErrors = await validateKeystoneGraph({
170
+ keystoneIbGib,
171
+ getLatest,
172
+ invalidIfMoreRecentKeystoneFoundInSpace: getLatest,
173
+ space,
174
+ });
175
+
176
+ if (keystoneValidationErrors.length > 0) {
177
+ const errorMsg_addrInfo = domainAddr_latest === domainAddr ?
178
+ `domainAddr: ${domainAddr}` :
179
+ `domainAddr: ${domainAddr}, domainAddr_latest: `
180
+
181
+ return this.error(404, `Keystone invalid for ${errorMsg_addrInfo}. validationErrors: ${keystoneValidationErrors.join('|')}`); /* <<<< returns early */
182
+ }
183
+
184
+ // valid keystone graph
185
+ const responseBody: KeystoneGetResponseBody = {
186
+ domainGraph: domainGraph as Record<string, KeystoneIbGib_V1>,
187
+ };
188
+ return this.ok(responseBody);
189
+
190
+ } catch (error) {
191
+ const emsg = `${lc} ${extractErrorMsg(error)}`;
192
+ console.error(emsg);
193
+ return this.error(500, emsg);
194
+ } finally {
195
+ if (logalot) { console.log(`${lc} complete.`); }
196
+ }
197
+ }
198
+ }
@@ -0,0 +1,106 @@
1
+ import { join } from 'node:path';
2
+ import { existsSync, rmSync, mkdirSync } from 'node:fs';
3
+
4
+ import {
5
+ respecfully, iReckon, ifWe, ifWeMight
6
+ } from '@ibgib/helper-gib/dist/respec-gib/respec-gib.mjs';
7
+ const sir = `[${import.meta.url}]`;
8
+
9
+ import { getIbGibAddr } from '@ibgib/ts-gib/dist/helper.mjs';
10
+ import { KeystoneService_V1 } from '@ibgib/core-gib/dist/keystone/keystone-service-v1.mjs';
11
+ import { createStandardPoolConfig } from '@ibgib/core-gib/dist/keystone/keystone-config-builder.mjs';
12
+ import { POOL_ID_DEFAULT } from '@ibgib/core-gib/dist/keystone/keystone-constants.mjs';
13
+
14
+ import { GLOBAL_LOG_A_LOT } from '../../../constants.mjs';
15
+ import { ServeGib_V1 } from '../../../serve-gib-v1.mjs';
16
+ import { KeystonePostHandler } from './keystone-post.handler.mjs';
17
+ import { KeystoneGetHandler } from './keystone-get.handler.mjs';
18
+ import { ErrorHandler } from '../../error-handler.mjs';
19
+
20
+ const logalot = GLOBAL_LOG_A_LOT;
21
+
22
+ class MockMetaspace {
23
+ async getLocalUserSpace() { return new MockSpace(); }
24
+ async put() { }
25
+ async registerNewIbGib() { }
26
+ }
27
+ class MockSpace {
28
+ async witness() { return { data: { success: true } }; }
29
+ }
30
+
31
+ await respecfully(sir, 'Keystone GET Integration', async () => {
32
+ const testDataDir = './test-data-get';
33
+ const port = 3003;
34
+
35
+ // Clean test data
36
+ if (existsSync(testDataDir)) {
37
+ try { rmSync(testDataDir, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); } catch { /* ignore */ }
38
+ }
39
+ mkdirSync(testDataDir, { recursive: true });
40
+
41
+ await ifWe(sir, 'retrieve a keystone chain via GET /api/keystone/:addr', async () => {
42
+ const keystoneService = new KeystoneService_V1();
43
+ const config = createStandardPoolConfig({ id: POOL_ID_DEFAULT, salt: POOL_ID_DEFAULT });
44
+
45
+ // 1. Setup ServeGib_V1 with both POST and GET handlers
46
+ const serveGib = new ServeGib_V1({
47
+ port,
48
+ dataDir: testDataDir,
49
+ handlers: [
50
+ new KeystonePostHandler(),
51
+ new KeystoneGetHandler(),
52
+ ],
53
+ errorHandler: new ErrorHandler()
54
+ });
55
+
56
+ // 2. Generate and POST genesis
57
+ const genesis = await keystoneService.genesis({
58
+ masterSecret: 'AliceSecret',
59
+ configs: [config],
60
+ metaspace: new MockMetaspace() as any,
61
+ space: new MockSpace() as any,
62
+ });
63
+ const addr = getIbGibAddr({ ibGib: genesis });
64
+
65
+ const postReq: any = {
66
+ url: '/api/keystone',
67
+ method: 'POST',
68
+ headers: { 'ibgib-domain': addr, 'content-type': 'application/json' },
69
+ on: (event: string, cb: any) => {
70
+ if (event === 'data') { cb(Buffer.from(JSON.stringify({ ibGibs: [genesis] }))); }
71
+ if (event === 'end') { cb(); }
72
+ }
73
+ };
74
+ const postRes: any = {
75
+ writeHead: () => { },
76
+ end: () => { },
77
+ };
78
+ await serveGib.handleRequest(postReq, postRes);
79
+
80
+ // 3. Mock GET Request
81
+ const getReq: any = {
82
+ url: `/api/keystone/${encodeURIComponent(addr)}`,
83
+ method: 'GET',
84
+ headers: { 'ibgib-domain': addr },
85
+ on: (event: string, cb: any) => {
86
+ if (event === 'end') { cb(); }
87
+ }
88
+ };
89
+
90
+ let capturedStatus: number = 0;
91
+ let capturedBody: any = null;
92
+ const getRes: any = {
93
+ writeHead: (status: number) => { capturedStatus = status; },
94
+ end: (body: string) => { capturedBody = JSON.parse(body); },
95
+ };
96
+
97
+ // 4. Handle GET
98
+ await serveGib.handleRequest(getReq, getRes);
99
+
100
+ // 5. Verify
101
+ iReckon(sir, capturedStatus).asTo('captured status code').isGonnaBe(200);
102
+ iReckon(sir, capturedBody.domainGraph).asTo('captured body domainGraph').isGonnaBeTruthy();
103
+ const graphKeys = Object.keys(capturedBody.domainGraph || {});
104
+ iReckon(sir, graphKeys.length > 0).asTo('domainGraph has keys').isGonnaBe(true);
105
+ });
106
+ });
@@ -0,0 +1,29 @@
1
+ import { DomainInfo } from "../../../types.mjs";
2
+
3
+ export interface KeystoneParams {
4
+ domainInfo: DomainInfo;
5
+ }
6
+
7
+ // #region KeystoneGetQueryParams
8
+ export const DEFAULT_QUERY_PARAMS_GET_KEYSTONE = {
9
+ /**
10
+ * If true, will get the latest keystone frame.
11
+ */
12
+ getLatest: true,
13
+ /**
14
+ * If true, will get the keystone's entire dependency graph
15
+ */
16
+ getGraph: true,
17
+ };
18
+ /**
19
+ * @see {@link DEFAULT_QUERY_PARAMS_GET_KEYSTONE} key/values for jsdocs
20
+ */
21
+ export type KeystoneGetQueryParams = Partial<typeof DEFAULT_QUERY_PARAMS_GET_KEYSTONE>;
22
+ export type KNOWN_QUERY_PARAMS_KEYSTONE_GET = keyof KeystoneGetQueryParams;
23
+ export const KNOWN_QUERY_PARAMS_KEYSTONE_GET = Object.keys(DEFAULT_QUERY_PARAMS_GET_KEYSTONE) as KNOWN_QUERY_PARAMS_KEYSTONE_GET[];
24
+ export function isKnownQueryParamsKey_KeystoneGet(key: any): key is KNOWN_QUERY_PARAMS_KEYSTONE_GET {
25
+ return !!key && typeof key === 'string' ?
26
+ KNOWN_QUERY_PARAMS_KEYSTONE_GET.includes(key as any) :
27
+ false;
28
+ }
29
+ // #endregion KeystoneGetQueryParams
@@ -0,0 +1,95 @@
1
+ /**
2
+ * @module serve-gib/handlers/api/keystone/keystone-lookup.handler
3
+ *
4
+ * POST /api/keystone/lookup
5
+ *
6
+ * Looks up a primary identity keystone by username or email hash in the server's 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 { getGibInfo } from '@ibgib/ts-gib/dist/V1/transforms/transform-helper.mjs';
12
+ import { IdentityIndexService } from '../../../identity-index/identity-index-service.mjs';
13
+ import { getIdentityEmailHash } from '../../../identity-index/identity-index-helpers.mjs';
14
+ import { ServeGibHandlerBase } from '../../handler-base.mjs';
15
+ import { RequestContext, ResponseResult, ServeGibHttpMethod } from '../../../types.mjs';
16
+ import { API_PATH_REGEXES } from '../../../path-constants.mjs';
17
+ import { bootstrapDomainMetaspace } from '../../../bootstrap-helper.mjs';
18
+
19
+ /**
20
+ * POST /api/keystone/lookup
21
+ */
22
+ export class KeystoneLookupHandler extends ServeGibHandlerBase<undefined, undefined> {
23
+ protected override lc: string = `[${KeystoneLookupHandler.name}]`;
24
+ protected override method: ServeGibHttpMethod = 'POST';
25
+ protected override regex = API_PATH_REGEXES.KEYSTONE_LOOKUP;
26
+
27
+ protected async handleRouteImpl(
28
+ reqCtx: RequestContext<undefined, undefined>
29
+ ): Promise<ResponseResult | undefined> {
30
+ const lc = `${this.lc}[${this.handleRouteImpl.name}]`;
31
+ try {
32
+ // Anti-timing side-channel protection: add bounded random jitter delay (150ms-350ms)
33
+ const jitterMs = Math.floor(Math.random() * 200) + 150;
34
+ await new Promise(resolve => setTimeout(resolve, jitterMs));
35
+ let parsed: any;
36
+ try {
37
+ parsed = JSON.parse(reqCtx.body);
38
+ } catch {
39
+ console.error(`${lc} Rejecting request: body must be valid JSON.`);
40
+ return this.error(400, 'Request body must be valid JSON');
41
+ }
42
+
43
+ const identifier = (parsed.identifier || '').trim();
44
+ if (!identifier) {
45
+ console.error(`${lc} Rejecting lookup: identifier missing or empty.`);
46
+ return this.error(400, 'Identifier is required');
47
+ }
48
+
49
+ const indexService = new IdentityIndexService({ baseDir: path.join(reqCtx.dataDir, 'index') });
50
+ const record = await indexService.getEmailIndex({ email: identifier });
51
+
52
+ if (!record) {
53
+ console.log(`${lc} Lookup missed for identifier '${identifier}'`);
54
+ return this.error(404, `No registered identity found for '${identifier}'. Please check your username/email or create a new account.`);
55
+ }
56
+
57
+ const { tjpAddr } = record;
58
+ const { tjpGib, punctiliarHash } = getGibInfo({ ibGibAddr: tjpAddr });
59
+ const domainGib = tjpGib || punctiliarHash;
60
+
61
+ if (!domainGib) {
62
+ console.error(`${lc} Could not extract domain identifier from tjpAddr: ${tjpAddr}`);
63
+ return this.error(500, `Internal server error locating primary identity.`);
64
+ }
65
+
66
+ // Load primary keystone from domain space
67
+ const metaspace = await bootstrapDomainMetaspace(tjpAddr, reqCtx.dataDir);
68
+ const space = await metaspace.getLocalUserSpace({ lock: false });
69
+ if (!space) {
70
+ console.error(`${lc} Could not load space for domain ${domainGib}`);
71
+ return this.error(500, `Internal server error loading domain space.`);
72
+ }
73
+
74
+ const latestAddr = await metaspace.getLatestAddr({ addr: tjpAddr, space }) ?? tjpAddr;
75
+ const resGet = await metaspace.get({ addr: latestAddr, space });
76
+ const primaryKeystone = resGet?.ibGibs?.[0];
77
+
78
+ if (!primaryKeystone) {
79
+ console.error(`${lc} Primary keystone ${latestAddr} indexed but not found in domain space.`);
80
+ return this.error(404, `Primary identity keystone not found in space.`);
81
+ }
82
+
83
+ console.log(`${lc} Found latest primary identity keystone for '${identifier}': ${latestAddr} (tjp: ${tjpAddr})`);
84
+ return this.ok({
85
+ success: true,
86
+ tjpAddr,
87
+ primaryKeystoneIbGib: primaryKeystone
88
+ });
89
+ } catch (error) {
90
+ const emsg = extractErrorMsg(error);
91
+ console.error(`${lc} ${emsg}`);
92
+ return this.error(500, emsg);
93
+ }
94
+ }
95
+ }
@@ -0,0 +1,75 @@
1
+ /**
2
+ * @module serve-gib/handlers/api/keystone
3
+ */
4
+
5
+ import { extractErrorMsg } from '@ibgib/helper-gib/dist/helpers/utils-helper.mjs';
6
+ import { validateAndRegisterPostKeystones } from '@ibgib/core-gib/dist/sync/sync-peer/sync-peer-websocket/sync-peer-websocket-receiver/sync-websocket-peer-helpers.mjs';
7
+
8
+ import { GLOBAL_LOG_A_LOT } from '../../../constants.mjs';
9
+ import { ServeGibHandlerWithMetaspaceBase } from '../../handler-base.mjs';
10
+ import { RequestContext, ResponseResult, ServeGibHttpMethod } from '../../../types.mjs';
11
+ import { API_PATH_REGEXES } from '../../../path-constants.mjs';
12
+ import { KeystoneParams } from './keystone-handler-types.mjs';
13
+ import { getIbGibAddr } from '@ibgib/ts-gib/dist/helper.mjs';
14
+
15
+ const logalot = GLOBAL_LOG_A_LOT || true;
16
+
17
+ /**
18
+ * POST /api/keystone
19
+ */
20
+ export class KeystonePostHandler extends ServeGibHandlerWithMetaspaceBase<KeystoneParams, any> { // todo: keystone post query params if needed?
21
+ protected override lc: string = `[${KeystonePostHandler.name}]`;
22
+ protected override method: ServeGibHttpMethod = 'POST';
23
+ protected override regex = API_PATH_REGEXES.KEYSTONE;
24
+
25
+ protected override async parseParamsImpl(reqCtx: RequestContext<KeystoneParams, any>): Promise<KeystoneParams | undefined> {
26
+ let domainAddr = reqCtx.headers?.['ibgib-domain'] as string;
27
+ if (!domainAddr) {
28
+ let bodyJson: any;
29
+ try { bodyJson = JSON.parse(reqCtx.body); } catch { /* ignore */ }
30
+ if (bodyJson?.ibGibs?.[0]) {
31
+ domainAddr = getIbGibAddr({ ibGib: bodyJson.ibGibs[0] });
32
+ }
33
+ }
34
+ if (!domainAddr) { return undefined; }
35
+ return {
36
+ domainInfo: this.getDomainInfo({ domainAddr }),
37
+ };
38
+ }
39
+
40
+ protected override async validateQueryParams({ queryParams }: { queryParams: any }): Promise<string[]> {
41
+ return [];
42
+ }
43
+
44
+ protected async handleRouteImpl(reqCtx: RequestContext<KeystoneParams, any>): Promise<ResponseResult | undefined> {
45
+ const lc = `[${this.handleRouteImpl.name}]`;
46
+ try {
47
+ if (logalot) { console.log(`${lc} starting... (I: 63bab8214834cb6e383e0fc364ee8826)`); }
48
+
49
+ const { metaspace } = reqCtx;
50
+ if (!metaspace) { throw new Error(`(UNEXPECTED) reqCtx.metaspace falsy? (E: 3d03027ea7f6f237980e511801255826)`); }
51
+
52
+ const { ibGibs } = JSON.parse(reqCtx.body) as { ibGibs: any[] };
53
+ if (!Array.isArray(ibGibs)) return this.error(400, 'ibGibs array required');
54
+
55
+ const space = await metaspace.getLocalUserSpace({ lock: false });
56
+ if (!space) { throw new Error(`No local user space found`); }
57
+
58
+ // Delegate all intrinsic validation, keystone-specific checks, registration, and persistence to core-gib
59
+ await validateAndRegisterPostKeystones({
60
+ ibGibs,
61
+ metaspace,
62
+ space
63
+ });
64
+
65
+ return { status: 201, body: { success: true }, isJson: true };
66
+
67
+ } catch (error) {
68
+ const emsg = `${lc} ${extractErrorMsg(error)}`;
69
+ console.error(emsg);
70
+ return this.error(500, emsg);
71
+ } finally {
72
+ if (logalot) { console.log(`${lc} complete.`); }
73
+ }
74
+ }
75
+ }
@@ -0,0 +1,130 @@
1
+ import { join } from 'node:path';
2
+ import { existsSync, rmSync, mkdirSync, readdirSync } from 'node:fs';
3
+
4
+ import {
5
+ respecfully, iReckon, ifWe, ifWeMight
6
+ } from '@ibgib/helper-gib/dist/respec-gib/respec-gib.mjs';
7
+ const sir = `[${import.meta.url}]`;
8
+
9
+ import { extractErrorMsg } from '@ibgib/helper-gib/dist/helpers/utils-helper.mjs';
10
+ import { getIbGibAddr } from '@ibgib/ts-gib/dist/helper.mjs';
11
+ import { KeystoneService_V1 } from '@ibgib/core-gib/dist/keystone/keystone-service-v1.mjs';
12
+ import { createStandardPoolConfig } from '@ibgib/core-gib/dist/keystone/keystone-config-builder.mjs';
13
+ import { POOL_ID_DEFAULT } from '@ibgib/core-gib/dist/keystone/keystone-constants.mjs';
14
+
15
+ import { GLOBAL_LOG_A_LOT } from '../../../constants.mjs';
16
+ import { ServeGib_V1 } from '../../../serve-gib-v1.mjs';
17
+ import { KeystonePostHandler } from './keystone-post.handler.mjs';
18
+ import { ErrorHandler } from '../../error-handler.mjs';
19
+ import { getDomainRootPath } from '../../../bootstrap-helper.mjs';
20
+
21
+ const logalot = GLOBAL_LOG_A_LOT;
22
+ if (logalot) { console.log(`[test] keystone-post.respec.mts top-level entry`); }
23
+
24
+ class MockMetaspace {
25
+ async getLocalUserSpace() { return new MockSpace(); }
26
+ async put() { }
27
+ async registerNewIbGib() { }
28
+ }
29
+ class MockSpace {
30
+ async witness() { return { data: { success: true } }; }
31
+ }
32
+
33
+ await respecfully(sir, 'Keystone POST Integration', async () => {
34
+ const testDataDir = './test-data-post';
35
+ const port = 3001;
36
+
37
+ // Clean test data
38
+ if (existsSync(testDataDir)) {
39
+ try { rmSync(testDataDir, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); } catch { /* ignore */ }
40
+ }
41
+ mkdirSync(testDataDir, { recursive: true });
42
+
43
+ await ifWe(sir, 'bootstrap a new domain via POST /api/keystone', async () => {
44
+ const keystoneService = new KeystoneService_V1();
45
+ const config = createStandardPoolConfig({ id: POOL_ID_DEFAULT, salt: POOL_ID_DEFAULT });
46
+
47
+ // 1. Generate real genesis
48
+ const genesis = await keystoneService.genesis({
49
+ masterSecret: 'AliceSecret',
50
+ configs: [config],
51
+ metaspace: new MockMetaspace() as any,
52
+ space: new MockSpace() as any,
53
+ });
54
+ const addr = getIbGibAddr({ ibGib: genesis });
55
+
56
+ if (logalot) { console.log(`[test] Generated genesis: ${addr}`); }
57
+
58
+ // 2. Setup ServeGib_V1
59
+ const serveGib = new ServeGib_V1({
60
+ port,
61
+ dataDir: testDataDir,
62
+ handlers: [new KeystonePostHandler()],
63
+ errorHandler: new ErrorHandler()
64
+ });
65
+
66
+ if (logalot) { console.log(`[test] ServeGib_V1 setup. Posting to /api/keystone...`); }
67
+
68
+ // 3. Mock POST Request
69
+ const req: any = {
70
+ url: '/api/keystone',
71
+ method: 'POST',
72
+ headers: {
73
+ 'ibgib-domain': addr,
74
+ 'content-type': 'application/json'
75
+ },
76
+ on: (event: string, cb: any) => {
77
+ if (event === 'data') {
78
+ if (logalot) { console.log(`[test] sending data chunk...`); }
79
+ cb(Buffer.from(JSON.stringify({ ibGibs: [genesis] })));
80
+ }
81
+ if (event === 'end') {
82
+ if (logalot) { console.log(`[test] end of request.`); }
83
+ cb();
84
+ }
85
+ }
86
+ };
87
+
88
+ let capturedStatus: number = 0;
89
+ let capturedBody: any = null;
90
+ const res: any = {
91
+ writeHead: (status: number) => {
92
+ if (logalot) { console.log(`[test] writeHead: ${status}`); }
93
+ capturedStatus = status;
94
+ },
95
+ end: (body: string) => {
96
+ if (logalot) { console.log(`[test] res.end called with body length: ${body?.length}`); }
97
+ capturedBody = JSON.parse(body);
98
+ },
99
+ statusCode: 0
100
+ };
101
+
102
+ // 4. Handle
103
+ if (logalot) { console.log(`[test] Calling handleRequest...`); }
104
+ await serveGib.handleRequest(req, res);
105
+ if (logalot) { console.log(`[test] handleRequest completed.`); }
106
+
107
+ // 5. Verify
108
+ iReckon(sir, capturedStatus).asTo('captured status code').isGonnaBe(201);
109
+ iReckon(sir, capturedBody.success).asTo(`Handler failed: ${capturedBody.message || 'no message'}`).isGonnaBe(true);
110
+
111
+ const domainPath = getDomainRootPath(genesis.gib!, testDataDir);
112
+ iReckon(sir, existsSync(domainPath)).asTo('domain path exists').isGonnaBe(true);
113
+
114
+ // Verify the ibgib actually exists in the new domain's storage
115
+ // With indexed storage, it's in a bucketed subpath: ibgib/default/ibgibs/B1/B2/
116
+ const bucket1 = genesis.gib!.substring(0, 3).toUpperCase();
117
+ const bucket2 = genesis.gib!.substring(3, 6).toUpperCase();
118
+ const bucketPath = join(domainPath, 'ibgib', 'default', 'ibgibs', bucket1, bucket2);
119
+
120
+ iReckon(sir, existsSync(bucketPath)).asTo(`Bucket path does not exist: ${bucketPath}`).isGonnaBe(true);
121
+
122
+ // We don't know the random filename, but we know it's a .json file in that bucket
123
+ try {
124
+ const files = readdirSync(bucketPath).filter(f => f.endsWith('.json'));
125
+ iReckon(sir, files.length > 0).asTo(`No .json files found in bucket: ${bucketPath}`).isGonnaBe(true);
126
+ } catch (error) {
127
+ iReckon(sir, true).asTo(`error trying to readdir ${bucketPath}: ${extractErrorMsg(error)}`).isGonnaBe(true);
128
+ }
129
+ });
130
+ });