@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,141 @@
1
+ import { join } from 'node:path';
2
+
3
+ import { clone, getUUID, } from '@ibgib/helper-gib/dist/helpers/utils-helper.mjs';
4
+ import { IbGib_V1 } from '@ibgib/ts-gib/dist/V1/types.mjs';
5
+ import { getGib, getGibInfo } from '@ibgib/ts-gib/dist/V1/transforms/transform-helper.mjs';
6
+ import {
7
+ MetaspaceFactory, MetaspaceService, ZeroSpaceFactoryFunction,
8
+ LocalSpaceFactoryFunction, DtoToSpaceFunction
9
+ } from '@ibgib/core-gib/dist/witness/space/metaspace/metaspace-types.mjs';
10
+ import { NodeIndexedFilesystemSpace_V1 } from '../witness/space/node-filesystem-space/node-indexed-filesystem-space/node-indexed-filesystem-space-v1.mjs';
11
+ import {
12
+ NodeFilesystemSpaceData_V1, DEFAULT_NODE_FILESYSTEM_SPACE_DATA_V1,
13
+ } from '../witness/space/node-filesystem-space/node-filesystem-space-types.mjs';
14
+
15
+ import { GLOBAL_LOG_A_LOT } from './server-constants.mjs';
16
+ import { NodeIndexedFilesystemSpaceData_V1, NodeIndexedFilesystemSpaceRel8ns_V1 } from '../witness/space/node-filesystem-space/node-indexed-filesystem-space/node-indexed-filesystem-space-types.mjs';
17
+ import { Metaspace_Nodeindexedspace } from './metaspace-nodeindexedspace/metaspace-nodeindexedspace.mjs';
18
+
19
+ const logalot = GLOBAL_LOG_A_LOT;
20
+
21
+ /**
22
+ * Deterministically calculates the physical filesystem path for a domain
23
+ * based on its keystone's tjpGib.
24
+ *
25
+ * @param tjpGib The TJP hash of the keystone defining the domain.
26
+ * @param baseDataDir The root directory for all ibgib spaces on the server.
27
+ * @returns The absolute path to the domain's isolated root.
28
+ */
29
+ export function getDomainRootPath(tjpGib: string, baseDataDir: string): string {
30
+ // We use the first 2 characters as subfolders to balance the OS filesystem entries.
31
+ // e.g. /data/spaces/ab/c1/defg...
32
+ const sub1 = tjpGib.slice(0, 2);
33
+ const sub2 = tjpGib.slice(2, 4);
34
+ const remaining = tjpGib;
35
+
36
+ return join(baseDataDir, 'domains', sub1, sub2, remaining);
37
+ }
38
+
39
+ /**
40
+ * Creates a MetaspaceFactory using the "Factory Closure Pattern" to isolate
41
+ * all space operations within the given domainRootPath.
42
+ *
43
+ * @param domainRootPath The physical root directory for this domain.
44
+ * @returns A MetaspaceFactory pre-configured for this domain.
45
+ */
46
+ export function getDomainFactory(domainRootPath: string): MetaspaceFactory {
47
+ const lc = `[${getDomainFactory.name}]`;
48
+
49
+ const fnZeroSpaceFactory: ZeroSpaceFactoryFunction = () => {
50
+ const zeroSpaceData: NodeIndexedFilesystemSpaceData_V1 = {
51
+ ...clone(DEFAULT_NODE_FILESYSTEM_SPACE_DATA_V1),
52
+ classname: NodeIndexedFilesystemSpace_V1.name,
53
+ baseDir: domainRootPath,
54
+ };
55
+
56
+ const zeroSpace = new NodeIndexedFilesystemSpace_V1(zeroSpaceData);
57
+ zeroSpace.gib = 'gib'; // Primitive zero space
58
+ return zeroSpace;
59
+ };
60
+
61
+ const fnDefaultLocalSpaceFactory: LocalSpaceFactoryFunction = async (opts) => {
62
+ // Ensure we don't prompt for a name during server bootstrap
63
+ // opts.spaceName ||= `default_${pickRandom_Letters({ count: 5 })}`;
64
+ opts.spaceName ||= `default`;
65
+
66
+ const spaceData: NodeFilesystemSpaceData_V1 = {
67
+ ...clone(DEFAULT_NODE_FILESYSTEM_SPACE_DATA_V1),
68
+ classname: NodeIndexedFilesystemSpace_V1.name,
69
+ uuid: await getUUID(),
70
+ baseDir: domainRootPath,
71
+ name: opts.spaceName,
72
+ spaceSubPath: opts.spaceName,
73
+ baseSubPath: 'ibgib',
74
+ binSubPath: 'bin',
75
+ dnaSubPath: 'dna',
76
+ ibgibsSubPath: 'ibgibs',
77
+ metaSubPath: 'meta',
78
+ isTjp: true,
79
+ };
80
+ if (logalot) { console.log(`${lc}[${fnDefaultLocalSpaceFactory.name}] spaceData.classname: ${spaceData.classname} (I: b60da661e9282e1253101e08765eb226)`); }
81
+
82
+ const space = new NodeIndexedFilesystemSpace_V1(spaceData);
83
+ space.gib = await getGib({ ibGib: space as any, hasTjp: true });
84
+
85
+ return space;
86
+ };
87
+
88
+ const fnDtoToSpace: DtoToSpaceFunction = async (spaceDto: IbGib_V1) => {
89
+ if (!spaceDto) { throw new Error(`spaceDto required (E: 30ede52f9c974591dac980a810510e26)`); }
90
+ if (!spaceDto.data) { throw new Error(`spaceDto.data required (E: 867b08a9c998e95028396f283d1d4826)`); }
91
+ if (!spaceDto.data.classname) { throw new Error(`spaceDto.data.classname required (E: 95a68813e64e68e6c84296d8dbaeb826)`); }
92
+ if (spaceDto.data.classname !== NodeIndexedFilesystemSpace_V1.name) {
93
+ throw new Error(`spaceDto.data.classname (${spaceDto.data.classname}) expeced to be ${NodeIndexedFilesystemSpace_V1.name} (E: 68aaa875ff22b92f57a0a3189da4b826)`);
94
+ }
95
+
96
+ const space = await NodeIndexedFilesystemSpace_V1.createFromDto(
97
+ spaceDto as IbGib_V1<NodeIndexedFilesystemSpaceData_V1, NodeIndexedFilesystemSpaceRel8ns_V1>
98
+ );
99
+ return space;
100
+ };
101
+
102
+
103
+ return {
104
+ fnZeroSpaceFactory,
105
+ fnDefaultLocalSpaceFactory,
106
+ fnDtoToSpace,
107
+ };
108
+ }
109
+
110
+ /**
111
+ * Orchestrates the bootstrapping of a domain-isolated metaspace.
112
+ *
113
+ * @param keystoneAddr The full address of the keystone defining the domain.
114
+ * @param baseDataDir The server's root data directory.
115
+ * @returns An initialized MetaspaceService scoped to the domain.
116
+ */
117
+ export async function bootstrapDomainMetaspace(
118
+ keystoneAddr: string,
119
+ baseDataDir: string
120
+ ): Promise<MetaspaceService> {
121
+ const { tjpGib, punctiliarHash } = getGibInfo({ ibGibAddr: keystoneAddr });
122
+ const domainGib = tjpGib || punctiliarHash;
123
+ if (!domainGib) {
124
+ throw new Error(`Could not extract tjpGib from keystone address: ${keystoneAddr}`);
125
+ }
126
+
127
+ const domainRootPath = getDomainRootPath(domainGib, baseDataDir);
128
+ const factory = getDomainFactory(domainRootPath);
129
+
130
+ const metaspace = new Metaspace_Nodeindexedspace(/*cacheSvc*/ undefined);
131
+
132
+ await metaspace.initialize({
133
+ metaspaceFactory: factory,
134
+ // For server-side, these prompts should probably be non-interactive or log errors.
135
+ getFnAlert: () => async (arg) => console.log(`[ALERT] ${arg.title}: ${arg.msg}`),
136
+ getFnPrompt: () => async (arg) => { throw new Error(`Interactive prompt (${arg.title}) not supported in server bootstrap.`); },
137
+ getFnPromptPassword: () => async (title) => { throw new Error(`Password prompt (${title}) not supported in server bootstrap.`); },
138
+ });
139
+
140
+ return metaspace;
141
+ }
@@ -0,0 +1,100 @@
1
+ import { join } from 'node:path';
2
+ import { existsSync, mkdirSync, rmSync } from 'node:fs';
3
+
4
+ import { respecfully, iReckon, ifWe } from '@ibgib/helper-gib/dist/respec-gib/respec-gib.mjs';
5
+ const sir = `[${import.meta.url}]`;
6
+ import { getIbGibAddr } from '@ibgib/ts-gib/dist/helper.mjs';
7
+ import { KeystoneService_V1 } from '@ibgib/core-gib/dist/keystone/keystone-service-v1.mjs';
8
+ import { createStandardPoolConfig } from '@ibgib/core-gib/dist/keystone/keystone-config-builder.mjs';
9
+ import { POOL_ID_DEFAULT } from '@ibgib/core-gib/dist/keystone/keystone-constants.mjs';
10
+
11
+ import { GLOBAL_LOG_A_LOT } from './server-constants.mjs';
12
+ import { getDomainRootPath, bootstrapDomainMetaspace } from './bootstrap-helper.mjs';
13
+
14
+ const logalot = GLOBAL_LOG_A_LOT;
15
+
16
+
17
+ /**
18
+ * Minimal mock to satisfy KeystoneService requirements during genesis.
19
+ */
20
+ class MockMetaspace {
21
+ async getLocalUserSpace() { return new MockSpace(); }
22
+ async put() { }
23
+ async registerNewIbGib() { }
24
+ }
25
+ class MockSpace {
26
+ async witness() { return { data: { success: true } }; }
27
+ }
28
+
29
+ await respecfully(sir, 'bootstrap-helper', async () => {
30
+ const lc = `[bootstrap-helper.respec.mts][bootstrap-helper]`;
31
+ const testDataDir = './test-data';
32
+ console.log(`${lc} testDataDir: ${testDataDir} (I: c9f39853a57a5af97ab8ff7882c49826)`);
33
+
34
+ // Clean and recreate test-data directory
35
+ if (existsSync(testDataDir)) {
36
+ try { rmSync(testDataDir, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); } catch { /* ignore */ }
37
+ }
38
+ mkdirSync(testDataDir, { recursive: true });
39
+
40
+ await ifWe(sir, 'calculate balanced domain root paths', async () => {
41
+ const tjpGib = 'abcde1234567890';
42
+ const root = getDomainRootPath(tjpGib, testDataDir);
43
+
44
+ // Should be: testDataDir/domains/ab/cd/abcde1234567890
45
+ iReckon(sir, root).includes(join('domains', 'ab', 'cd', tjpGib));
46
+ });
47
+
48
+ await ifWe(sir, 'bootstrap a domain metaspace and create the directory', async () => {
49
+ const keystoneAddr = 'keystone_alice^abcde1234567890';
50
+ const metaspace = await bootstrapDomainMetaspace(keystoneAddr, testDataDir);
51
+
52
+ iReckon(sir, metaspace).isGonnaBe(metaspace);
53
+ iReckon(sir, metaspace.initialized).isGonnaBe(true);
54
+
55
+ const expectedPath = getDomainRootPath('abcde1234567890', testDataDir);
56
+ iReckon(sir, existsSync(expectedPath)).isGonnaBe(true);
57
+
58
+ // The ibgib framework uses a specific subdirectory structure for the bootstrap
59
+ const bootstrapFile = join(expectedPath, 'ibgib', '000_zerospace', 'gib', 'bootstrap.json');
60
+ iReckon(sir, existsSync(bootstrapFile)).isGonnaBe(true);
61
+
62
+ // Also check that the default space was created
63
+ const defaultSpaceDir = join(expectedPath, 'ibgib', 'default');
64
+ iReckon(sir, existsSync(defaultSpaceDir)).isGonnaBe(true);
65
+ });
66
+
67
+ await ifWe(sir, 'integrate with KeystoneService and bootstrap 5 unique domains', async () => {
68
+ const keystoneService = new KeystoneService_V1();
69
+ const mockMetaspace = new MockMetaspace() as any;
70
+ const mockSpace = new MockSpace() as any;
71
+ const config = createStandardPoolConfig({ id: POOL_ID_DEFAULT, salt: POOL_ID_DEFAULT });
72
+
73
+ const identities = ['Alice', 'Bob', 'Charlie', 'Dave', 'Eve'];
74
+
75
+ for (const name of identities) {
76
+ // 1. Generate an actual genesis keystone for this identity
77
+ const keystone = await keystoneService.genesis({
78
+ masterSecret: `SecretFor_${name}`,
79
+ configs: [config],
80
+ metaspace: mockMetaspace,
81
+ space: mockSpace,
82
+ });
83
+ const addr = getIbGibAddr({ ibGib: keystone });
84
+ const tjpGib = keystone.gib!;
85
+
86
+ if (logalot) { console.log(`[test] Bootstrapping domain for ${name}: ${addr} (I: 7ba45828f2719ca578a1f078ff16e126)`); }
87
+
88
+ // 2. Drive the bootstrap logic
89
+ const metaspace = await bootstrapDomainMetaspace(addr, testDataDir);
90
+ iReckon(sir, metaspace.initialized).isGonnaBe(true);
91
+
92
+ // 3. Verify the unique path
93
+ const expectedPath = getDomainRootPath(tjpGib, testDataDir);
94
+ iReckon(sir, existsSync(expectedPath)).isGonnaBe(true);
95
+
96
+ const bootstrapFile = join(expectedPath, 'ibgib', '000_zerospace', 'gib', 'bootstrap.json');
97
+ iReckon(sir, existsSync(bootstrapFile)).isGonnaBe(true);
98
+ }
99
+ });
100
+ });
@@ -0,0 +1 @@
1
+ export { GLOBAL_LOG_A_LOT } from '../constants.mjs';
@@ -0,0 +1,105 @@
1
+ /**
2
+ * @module handlers/api/debug/ws-echo.handler
3
+ *
4
+ * Minimal WebSocket echo handler for validating end-to-end WebSocket
5
+ * plumbing: Traefik passthrough → Node.js upgrade event → browser client.
6
+ *
7
+ * ## intent
8
+ *
9
+ * This is a diagnostic-only endpoint. The goal is to confirm that:
10
+ * 1. Traefik correctly forwards WS upgrade requests to the container
11
+ * 2. The Node.js `upgrade` event fires and we can accept the connect handshake
12
+ * 3. The browser client can open a wss:// connection and exchange frames
13
+ *
14
+ * Once WS sync is confirmed end-to-end, this handler can be removed or
15
+ * gated behind an env flag.
16
+ *
17
+ * ## endpoint
18
+ *
19
+ * `GET /api/debug/ws-echo` (with Upgrade: websocket header)
20
+ *
21
+ * On connect: server sends `{"status":"connected","msg":"ws-echo ready"}`
22
+ * On message: server echoes `{"echo":<original message>}`
23
+ * On close: server logs and cleans up
24
+ */
25
+
26
+ import { IncomingMessage } from 'node:http';
27
+ import { Socket } from 'node:net';
28
+
29
+ import { extractErrorMsg } from '@ibgib/helper-gib/dist/helpers/utils-helper.mjs';
30
+
31
+ import { GLOBAL_LOG_A_LOT } from '../../../constants.mjs';
32
+ import {
33
+ encodeTextFrame, decodeTextFrame, encodeCloseFrame, performConnect,
34
+ WebSocketFrameDecoder
35
+ } from '../../ws/ws-helper.mjs';
36
+ import { API_PATH_REGEXES } from '../../../path-constants.mjs';
37
+
38
+ const logalot = GLOBAL_LOG_A_LOT;
39
+
40
+ const lc = `[WsEchoHandler]`;
41
+
42
+
43
+ // ---------------------------------------------------------------------------
44
+ // Public handler
45
+ // ---------------------------------------------------------------------------
46
+
47
+ /**
48
+ * Returns true if this request is a WebSocket upgrade to the debug echo path.
49
+ * Call this from the server's `upgrade` event listener.
50
+ */
51
+ export function canHandleWsUpgrade(req: IncomingMessage): boolean {
52
+ const pathname = new URL(req.url ?? '/', 'http://localhost').pathname;
53
+ return API_PATH_REGEXES.DEBUG_WS_ECHO.test(pathname);
54
+ }
55
+
56
+ /**
57
+ * Accepts the WebSocket upgrade and sets up the echo loop.
58
+ *
59
+ * Client will receive a JSON `{status:"connected"}` on open, and
60
+ * `{echo:<msg>}` for every message it sends.
61
+ */
62
+ export function handleWsEchoUpgrade(req: IncomingMessage, socket: Socket, head: Buffer): void {
63
+ const lc_fn = `${lc}[handleWsEchoUpgrade]`;
64
+ try {
65
+ if (logalot) { console.log(`${lc_fn} starting...`); }
66
+
67
+ const ok = performConnect(req, socket);
68
+ if (!ok) { return; }
69
+
70
+ // Send the "connected" greeting
71
+ socket.write(encodeTextFrame(JSON.stringify({ status: 'connected', msg: 'ws-echo ready' })));
72
+
73
+ // Echo loop
74
+ const decoder = new WebSocketFrameDecoder();
75
+ socket.on('data', (data: Buffer) => {
76
+ try {
77
+ decoder.addChunk(data);
78
+ let frameText = decoder.nextFrame();
79
+ while (frameText !== null) {
80
+ if (logalot) { console.log(`${lc_fn} echo: ${frameText}`); }
81
+ socket.write(encodeTextFrame(JSON.stringify({ echo: frameText })));
82
+ frameText = decoder.nextFrame();
83
+ }
84
+ } catch (error) {
85
+ console.error(`${lc_fn} error in data handler: ${extractErrorMsg(error)}`);
86
+ socket.write(encodeCloseFrame(1000));
87
+ socket.end();
88
+ }
89
+ });
90
+
91
+ socket.on('error', (error) => {
92
+ console.error(`${lc_fn} socket error: ${extractErrorMsg(error)}`);
93
+ });
94
+
95
+ socket.on('close', () => {
96
+ if (logalot) { console.log(`${lc_fn} socket closed.`); }
97
+ });
98
+
99
+ } catch (error) {
100
+ console.error(`${lc_fn} ${extractErrorMsg(error)}`);
101
+ socket.destroy();
102
+ } finally {
103
+ if (logalot) { console.log(`${lc_fn} complete.`); }
104
+ }
105
+ }
@@ -0,0 +1,67 @@
1
+ /**
2
+ * @module serve-gib/handlers/api/email/email-inbound
3
+ *
4
+ * Handler for POST /api/email/inbound
5
+ */
6
+
7
+ import { extractErrorMsg } from '@ibgib/helper-gib/dist/helpers/utils-helper.mjs';
8
+ import { EmailReceiverAws } from '../../../../email/aws/email-receiver-aws.mjs';
9
+ import { EmailReceiver } from '../../../../email/email-types.mjs';
10
+ import { API_PATH_REGEXES } from '../../../path-constants.mjs';
11
+ import { RequestContext, ResponseResult, ServeGibHttpMethod } from '../../../types.mjs';
12
+ import { ServeGibHandlerBase } from '../../handler-base.mjs';
13
+
14
+ export interface EmailInboundHandlerOptions {
15
+ receiver?: EmailReceiver;
16
+ }
17
+
18
+ /**
19
+ * POST /api/email/inbound
20
+ * Parses incoming email webhook payloads (e.g. AWS SES SNS/S3 webhook), evaluates spam verdicts,
21
+ * and yields normalized inbound email.
22
+ */
23
+ export class EmailInboundHandler extends ServeGibHandlerBase {
24
+ protected override lc = `[${EmailInboundHandler.name}]`;
25
+ protected override method: ServeGibHttpMethod = 'POST';
26
+ protected override regex = API_PATH_REGEXES.EMAIL_INBOUND;
27
+
28
+ private receiver: EmailReceiver;
29
+
30
+ constructor(options: EmailInboundHandlerOptions = {}) {
31
+ super();
32
+ this.receiver = options.receiver || new EmailReceiverAws();
33
+ }
34
+
35
+ protected async handleRouteImpl(reqCtx: RequestContext): Promise<ResponseResult | undefined> {
36
+ const lc = `${this.lc}[${this.handleRouteImpl.name}]`;
37
+ try {
38
+ if (reqCtx.method !== 'POST') {
39
+ return this.error(405, 'Method Not Allowed');
40
+ }
41
+
42
+ if (!reqCtx.body) {
43
+ return this.error(400, 'Request body is empty');
44
+ }
45
+
46
+ let payload: any;
47
+ try {
48
+ payload = JSON.parse(reqCtx.body);
49
+ } catch {
50
+ payload = reqCtx.body;
51
+ }
52
+
53
+ const inboundEmail = await this.receiver.parseInboundPayload(payload);
54
+
55
+ console.log(`${lc} Successfully processed inbound email msgId: ${inboundEmail.messageId}, folder: ${inboundEmail.folder} (I: 890123456789abcdef8a9b0c1d2e3f4a)`);
56
+
57
+ return this.ok({
58
+ success: true,
59
+ email: inboundEmail,
60
+ });
61
+ } catch (error) {
62
+ const emsg = extractErrorMsg(error);
63
+ console.error(`${lc} Inbound email handling failed: ${emsg} (E: 90123456789abcdef9a0b1c2d3e4f5a6)`);
64
+ return this.error(500, `Inbound email error: ${emsg}`);
65
+ }
66
+ }
67
+ }
@@ -0,0 +1,82 @@
1
+ /**
2
+ * @module serve-gib/handlers/api/email/email-outbound
3
+ *
4
+ * Handler for POST /api/email/send
5
+ */
6
+
7
+ import { extractErrorMsg } from '@ibgib/helper-gib/dist/helpers/utils-helper.mjs';
8
+ import { EmailSenderAws } from '../../../../email/aws/email-sender-aws.mjs';
9
+ import { EmailSender, OutboundEmail } from '../../../../email/email-types.mjs';
10
+ import { EmailSenderMock } from '../../../../email/mock/email-sender-mock.mjs';
11
+ import { API_PATH_REGEXES } from '../../../path-constants.mjs';
12
+ import { RequestContext, ResponseResult, ServeGibHttpMethod } from '../../../types.mjs';
13
+ import { ServeGibHandlerBase } from '../../handler-base.mjs';
14
+
15
+ export interface EmailOutboundHandlerOptions {
16
+ sender?: EmailSender;
17
+ }
18
+
19
+ /**
20
+ * POST /api/email/send
21
+ * Validates request payload and dispatches outbound email via the active EmailSender driver.
22
+ */
23
+ export class EmailOutboundHandler extends ServeGibHandlerBase {
24
+ protected override lc = `[${EmailOutboundHandler.name}]`;
25
+ protected override method: ServeGibHttpMethod = 'POST';
26
+ protected override regex = API_PATH_REGEXES.EMAIL_SEND;
27
+
28
+ private sender: EmailSender;
29
+
30
+ constructor(options: EmailOutboundHandlerOptions = {}) {
31
+ super();
32
+
33
+ if (options.sender) {
34
+ this.sender = options.sender;
35
+ } else {
36
+ const mode = process.env.EMAIL_MODE || 'mock';
37
+ if (mode === 'aws') {
38
+ this.sender = new EmailSenderAws({
39
+ accessKeyId: process.env.AWS_ACCESS_KEY_ID || '',
40
+ secretAccessKey: process.env.AWS_SECRET_ACCESS_KEY || '',
41
+ region: process.env.AWS_REGION || 'us-east-1',
42
+ });
43
+ } else {
44
+ this.sender = new EmailSenderMock();
45
+ }
46
+ }
47
+ }
48
+
49
+ protected async handleRouteImpl(reqCtx: RequestContext): Promise<ResponseResult | undefined> {
50
+ const lc = `${this.lc}[${this.handleRouteImpl.name}]`;
51
+ try {
52
+ if (reqCtx.method !== 'POST') {
53
+ return this.error(405, 'Method Not Allowed');
54
+ }
55
+
56
+ if (!reqCtx.body) {
57
+ return this.error(400, 'Request body is empty');
58
+ }
59
+
60
+ let emailData: OutboundEmail;
61
+ try {
62
+ emailData = JSON.parse(reqCtx.body);
63
+ } catch {
64
+ return this.error(400, 'Request body must be valid JSON');
65
+ }
66
+
67
+ const sendResult = await this.sender.sendEmail(emailData);
68
+
69
+ if (sendResult.success) {
70
+ console.log(`${lc} Successfully dispatched outbound email msgId: ${sendResult.messageId} (I: 0123456789abcdef0a1b2c3d4e5f6a7b)`);
71
+ return this.ok(sendResult, sendResult.statusCode || 200);
72
+ } else {
73
+ console.error(`${lc} Failed to send email: ${sendResult.error} (E: 123456789abcdef1a2b3c4d5e6f7a8b9)`);
74
+ return this.error(sendResult.statusCode || 500, sendResult.error || 'Failed to send email');
75
+ }
76
+ } catch (error) {
77
+ const emsg = extractErrorMsg(error);
78
+ console.error(`${lc} Outbound email error: ${emsg} (E: 23456789abcdef2a3b4c5d6e7f8a9b0c)`);
79
+ return this.error(500, `Outbound email error: ${emsg}`);
80
+ }
81
+ }
82
+ }
@@ -0,0 +1,23 @@
1
+ /**
2
+ * @module serve-gib/handlers/api/health
3
+ */
4
+
5
+ import { ServeGibHandlerBase } from '../handler-base.mjs';
6
+ import { RequestContext, ResponseResult, ServeGibHttpMethod } from '../../types.mjs';
7
+ import { API_PATH_REGEXES } from '../../path-constants.mjs';
8
+
9
+ /**
10
+ * GET /api/health
11
+ */
12
+ export class HealthHandler extends ServeGibHandlerBase {
13
+ protected override method: ServeGibHttpMethod = 'ALL';
14
+ protected override regex = API_PATH_REGEXES.HEALTH;
15
+
16
+ protected async handleRouteImpl(reqCtx: RequestContext): Promise<ResponseResult | undefined> {
17
+ if (reqCtx.method === 'GET') {
18
+ return this.ok({ status: 'ok', timestamp: new Date().toISOString() });
19
+ } else {
20
+ throw new Error(`info.method !== 'GET' in ${HealthHandler.name} (E: bfff3c547b5827ca7845277804057f26)`);
21
+ }
22
+ }
23
+ }
@@ -0,0 +1,51 @@
1
+ import { respecfully, iReckon, ifWe, ifWeMight } from '@ibgib/helper-gib/dist/respec-gib/respec-gib.mjs';
2
+ import { ServeGib_V1 } from '../../serve-gib-v1.mjs';
3
+ import { HealthHandler } from './health.handler.mjs';
4
+ import { ErrorHandler } from '../error-handler.mjs';
5
+
6
+ const sir = `[${import.meta.url}]`;
7
+
8
+ await respecfully(sir, 'Health Handler Integration', async () => {
9
+ const testDataDir = './test-data-health';
10
+ const port = 3002;
11
+
12
+ await ifWe(sir, 'get a 200 OK from /api/health', async () => {
13
+ // 1. Setup ServeGib_V1
14
+ const serveGib = new ServeGib_V1({
15
+ port,
16
+ dataDir: testDataDir,
17
+ handlers: [new HealthHandler()],
18
+ errorHandler: new ErrorHandler()
19
+ });
20
+
21
+ // 2. Mock GET Request
22
+ const req: any = {
23
+ url: '/api/health',
24
+ method: 'GET',
25
+ headers: {},
26
+ on: (event: string, cb: any) => {
27
+ if (event === 'end') { cb(); }
28
+ }
29
+ };
30
+
31
+ let capturedStatus: number = 0;
32
+ let capturedBody: any = null;
33
+ const res: any = {
34
+ writeHead: (status: number) => {
35
+ capturedStatus = status;
36
+ },
37
+ end: (body: string) => {
38
+ capturedBody = JSON.parse(body);
39
+ },
40
+ statusCode: 0
41
+ };
42
+
43
+ // 3. Handle
44
+ await serveGib.handleRequest(req, res);
45
+
46
+ // 4. Verify
47
+ iReckon(sir, capturedStatus).asTo('captured status code').isGonnaBe(200);
48
+ iReckon(sir, capturedBody.status).asTo('captured body status').isGonnaBe('ok');
49
+ iReckon(sir, capturedBody.timestamp).asTo('captured body timestamp').isGonnaBe(capturedBody.timestamp);
50
+ });
51
+ });
@@ -0,0 +1,49 @@
1
+ import { IbGibAddr } from "@ibgib/ts-gib/dist/types.mjs";
2
+
3
+ import { DomainInfo } from "../../../types.mjs";
4
+
5
+ export interface IbGibParams {
6
+ domainInfo: DomainInfo;
7
+ ibGibIb: string;
8
+ ibGibGib: string;
9
+ ibGibAddr: IbGibAddr;
10
+ }
11
+
12
+ // #region IbGibGetQueryParams
13
+ export const DEFAULT_QUERY_PARAMS_GET_IBGIB = {
14
+ /**
15
+ * If true, will get the latest ibgib.
16
+ */
17
+ getLatest: false, // Default to false for regular ibgibs
18
+ /**
19
+ * If true, will get the ibgib's entire dependency graph
20
+ */
21
+ getGraph: false, // Default to false for regular ibgibs
22
+ /**
23
+ * If true, returns only the resolved address (addr) rather than the full
24
+ * ibgib or graph body. Useful for a lightweight "tip check" before initiating
25
+ * a full sync: client compares `latestAddr` with its locally known addr.
26
+ *
27
+ * ## notes
28
+ *
29
+ * Typically combined with `getLatest: true` to ask "what is the server's
30
+ * current tip for this timeline?" without paying the cost of fetching the
31
+ * full ibgib body or graph.
32
+ *
33
+ * When `getLatest: false` and `addrOnly: true`, returns the addr as-is
34
+ * (i.e., confirms the given addr exists on the server).
35
+ */
36
+ addrOnly: false,
37
+ };
38
+ /**
39
+ * @see {@link DEFAULT_QUERY_PARAMS_GET_IBGIB} key/values for jsdocs
40
+ */
41
+ export type IbGibGetQueryParams = Partial<typeof DEFAULT_QUERY_PARAMS_GET_IBGIB>;
42
+ export type KNOWN_QUERY_PARAMS_IBGIB_GET = keyof IbGibGetQueryParams;
43
+ export const KNOWN_QUERY_PARAMS_IBGIB_GET = Object.keys(DEFAULT_QUERY_PARAMS_GET_IBGIB) as KNOWN_QUERY_PARAMS_IBGIB_GET[];
44
+ export function isKnownQueryParamsKey_IbGibGet(key: any): key is KNOWN_QUERY_PARAMS_IBGIB_GET {
45
+ return !!key && typeof key === 'string' ?
46
+ KNOWN_QUERY_PARAMS_IBGIB_GET.includes(key as any) :
47
+ false;
48
+ }
49
+ // #endregion IbGibGetQueryParams