@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,109 @@
1
+ /**
2
+ * @module node-metaspace driven by a node+fs storage substrate
3
+ *
4
+ * a metaspace is a space of spaces. it adds/removes spaces and does
5
+ * inter-spatial composition related things. it's similar to what people think
6
+ * of in terms of a node in a p2p network.
7
+ */
8
+
9
+ import * as fs from 'fs';
10
+ import * as path from 'path';
11
+ import { extractErrorMsg } from '@ibgib/helper-gib/dist/helpers/utils-helper.mjs';
12
+ import { IbGibSpaceAny } from '@ibgib/core-gib/dist/witness/space/space-base-v1.mjs';
13
+ import { IbGibCacheService } from '@ibgib/core-gib/dist/common/cache/cache-types.mjs';
14
+ import { MetaspaceBase } from '@ibgib/core-gib/dist/witness/space/metaspace/metaspace-base.mjs';
15
+ import { MetaspaceFactory } from '@ibgib/core-gib/dist/witness/space/metaspace/metaspace-types.mjs';
16
+ import { SpaceId } from '@ibgib/core-gib/dist/witness/space/space-types.mjs';
17
+
18
+ import { GLOBAL_LOG_A_LOT, GLOBAL_TIMER_NAME } from '../server-constants.mjs';
19
+ import { NodeFilesystemSpaceData_V1 } from '../../witness/space/node-filesystem-space/node-filesystem-space-types.mjs';
20
+
21
+ const logalot = GLOBAL_LOG_A_LOT;
22
+
23
+ /**
24
+ *
25
+ */
26
+ export class Metaspace_Nodeindexedspace extends MetaspaceBase {
27
+
28
+ // we won't get an object back, only a DTO ibGib essentially
29
+ protected lc: string = `[${Metaspace_Nodeindexedspace.name}]`;
30
+
31
+ get zeroSpace(): IbGibSpaceAny {
32
+ const lc = `[${this.lc}][get zeroSpace]`;
33
+ if (this.metaspaceFactory.fnZeroSpaceFactory) {
34
+ return this.metaspaceFactory.fnZeroSpaceFactory();
35
+ } else {
36
+ throw new Error(`${lc} (UNEXPECTED) this.metaspaceFactory.fnZeroSpaceFactory falsy. not initialized? (E: 9e6c6954dacd868b18c9f34a71e63523)`);
37
+ }
38
+ }
39
+
40
+ constructor(
41
+ // public modalController: ModalController,
42
+ // public alertController: AlertController,
43
+ protected cacheSvc: IbGibCacheService | undefined,
44
+ // private latestCacheSvc: IonicStorageLatestIbgibCacheService,
45
+ ) {
46
+ super(cacheSvc);
47
+ const lc = `${this.lc}[ctor]`;
48
+ if (logalot) {
49
+ console.log(`${lc}${GLOBAL_TIMER_NAME}`);
50
+ console.timeLog(GLOBAL_TIMER_NAME);
51
+ console.log(`${lc} created. (I: 5690dc2ebf774df3a442bd463dee7455)`);
52
+ }
53
+
54
+ }
55
+
56
+ protected async initializeMetaspaceFactory({ metaspaceFactory }: {
57
+ metaspaceFactory: MetaspaceFactory,
58
+ }): Promise<void> {
59
+ const lc = `[${this.initializeMetaspaceFactory.name}]`;
60
+ try {
61
+ if (logalot) { console.log(`${lc} starting... (I: 5a29670439ac47634dcdfe25225c8223)`); }
62
+ if (!metaspaceFactory) { throw new Error(`(UNEXPECTED) metaspaceFactory falsy? space-gib server initialization should have guaranteed this to be truthy (E: f305356c2978cf0ee8062fd818940826)`); }
63
+ if (!metaspaceFactory.fnDefaultLocalSpaceFactory) { throw new Error(`(UNEXPECTED) !metaspaceFactory.fnDefaultLocalSpaceFactory? space-gib server initialization should have guaranteed this to be truthy (E: 884281e5251bd65528eb7b3f48737826)`); }
64
+ if (!metaspaceFactory.fnDtoToSpace) { throw new Error(`(UNEXPECTED) !metaspaceFactory.fnDtoToSpace? space-gib server initialization should have guaranteed this to be truthy (E: 885b7828606f36f9183bb9e687e25826)`); }
65
+ if (!metaspaceFactory.fnZeroSpaceFactory) { throw new Error(`(UNEXPECTED) !metaspaceFactory.fnZeroSpaceFactory? space-gib server initialization should have guaranteed this to be truthy (E: 336cf6655758bad4aaeea8ce08d8c826)`); }
66
+
67
+ await super.initializeMetaspaceFactory({ metaspaceFactory });
68
+ } catch (error) {
69
+ console.error(`${lc} ${extractErrorMsg(error)}`);
70
+ throw error;
71
+ } finally {
72
+ if (logalot) { console.log(`${lc} complete.`); }
73
+ }
74
+ }
75
+
76
+ /**
77
+ * Space deletion on server-side `Metaspace_Nodeindexedspace` is intentionally disabled.
78
+ *
79
+ * ## security rationale
80
+ * Server metaspaces are exposed to network traffic. Exposing automated space deletion
81
+ * on the server without extensive security/authorization controls introduces a major
82
+ * attack vector. Server spaces must not be deleted via metaspace API until explicit
83
+ * server authorization controls are designed and implemented.
84
+ */
85
+ override async deleteLocalUserSpace({
86
+ spaceId,
87
+ deletePhysicalStorage = true,
88
+ }: {
89
+ spaceId: SpaceId;
90
+ deletePhysicalStorage?: boolean;
91
+ }): Promise<void> {
92
+ const lc = `${this.lc}[${this.deleteLocalUserSpace.name}]`;
93
+ throw new Error(`${lc} Space deletion on server-side Metaspace_Nodeindexedspace is intentionally disabled to prevent internet-exposed attack vectors. (E: c9410a5170d14b4fb2478d102e3b2e23)`);
94
+ }
95
+
96
+ // async initializeZeroSpace(): Promise<void> {
97
+ // const lc = `[${this.initializeZeroSpace.name}]`;
98
+ // try {
99
+ // if (logalot) { console.log(`${lc} starting... (I: a3364e9601c70c8163e67868e5d67723)`); }
100
+
101
+ // } catch (error) {
102
+ // console.error(`${lc} ${extractErrorMsg(error)}`);
103
+ // throw error;
104
+ // } finally {
105
+ // if (logalot) { console.log(`${lc} complete.`); }
106
+ // }
107
+ // }
108
+
109
+ }
@@ -0,0 +1,119 @@
1
+ /** Maximum allowed path length to prevent DoS. */
2
+ export const MAX_PATH_LENGTH = 2048;
3
+
4
+ /**
5
+ * Blacklisted patterns for any incoming path.
6
+ * We iterate through these for a quick security check.
7
+ */
8
+ export const FORBIDDEN_PATTERNS = [
9
+ /\.\./, // No directory traversal
10
+ /\/\//, // No redundant slashes
11
+ /\0/, // No null bytes
12
+ /(^|\/)\./, // No hidden/dot-files (e.g. .env, .git)
13
+ ];
14
+
15
+ /**
16
+ * Regex for valid API paths.
17
+ *
18
+ * IMPORTANT: See IMPLEMENTATION.md for overall path schema documentation.
19
+ *
20
+ * Paths are URL encoded. The `ib` and `gib` portions of addresses are captured explicitly
21
+ * by splitting on `%5E` or `^`.
22
+ */
23
+ export const API_PATH_REGEXES = {
24
+ /**
25
+ * /api/health
26
+ */
27
+ HEALTH: /^\/api\/health\/?$/,
28
+
29
+ /**
30
+ * /api/ibgib/graph/:domainAddr/:ibgibAddr
31
+ */
32
+ IBGIB_GRAPH: /^\/api\/ibgib\/graph\/([^\/]+?)(?:%5E|\^)([^\/]+)\/([^\/]+?)(?:%5E|\^)([^\/]+)\/?$/,
33
+
34
+ /**
35
+ * /api/ibgib/:domainAddr/:ibgibAddr
36
+ */
37
+ IBGIB_ADDR: /^\/api\/ibgib\/([^\/]+?)(?:%5E|\^)([^\/]+)\/([^\/]+?)(?:%5E|\^)([^\/]+)\/?$/,
38
+
39
+ /**
40
+ * /api/keystone
41
+ */
42
+ KEYSTONE: /^\/api\/keystone\/?$/,
43
+
44
+ /**
45
+ * /api/keystone/:domainAddr
46
+ */
47
+ KEYSTONE_ADDR: /^\/api\/keystone\/([^\/]+?)(?:%5E|\^)([^\/]+)\/?$/,
48
+
49
+ /**
50
+ * /api/ibgib
51
+ */
52
+ IBGIB_BASE: /^\/api\/ibgib\/?$/,
53
+
54
+ /**
55
+ * /api/keystone/evolve/:domainAddr
56
+ */
57
+ KEYSTONE_EVOLVE: /^\/api\/keystone\/evolve\/([^\/]+?)(?:%5E|\^)([^\/]+)\/?$/,
58
+
59
+ /**
60
+ * /api/keystone/genesis
61
+ *
62
+ * Accepts a single genesis-frame keystone ibgib and creates a new
63
+ * domain-isolated metaspace for it. No `:domainAddr` in the URL because
64
+ * the server derives the domain from the incoming keystone ibgib itself.
65
+ *
66
+ * Parallel to /api/keystone/evolve.
67
+ */
68
+ KEYSTONE_GENESIS: /^\/api\/keystone\/genesis\/?$/,
69
+
70
+ /**
71
+ * /api/keystone/lookup
72
+ */
73
+ KEYSTONE_LOOKUP: /^\/api\/keystone\/lookup\/?$/,
74
+
75
+ /**
76
+ * /api/keystone/check-email
77
+ */
78
+ KEYSTONE_CHECK_EMAIL: /^\/api\/keystone\/check-email\/?$/,
79
+
80
+ /**
81
+ * /api/debug/ws-echo
82
+ *
83
+ * Minimal WebSocket echo endpoint for validating WS plumbing (Traefik
84
+ * passthrough, server upgrade handling, client connectivity) before
85
+ * integrating real sync logic.
86
+ *
87
+ * ## intent
88
+ *
89
+ * NOT for production use. Remove or gate behind a flag once WS sync is
90
+ * confirmed working end-to-end.
91
+ */
92
+ DEBUG_WS_ECHO: /^\/api\/debug\/ws-echo\/?$/,
93
+ /**
94
+ * /api/sync/ws/:domainAddr
95
+ */
96
+ SYNC_WS: /^\/api\/sync\/ws\/([^\/]+?)(?:%5E|\^)([^\/]+)\/?$/,
97
+ /**
98
+ * /api/identity/sso/link
99
+ */
100
+ IDENTITY_SSO_LINK: /^\/api\/identity\/sso\/link\/?$/,
101
+ /**
102
+ * /api/identity/sso/login
103
+ */
104
+ IDENTITY_SSO_LOGIN: /^\/api\/identity\/sso\/login\/?$/,
105
+ /**
106
+ * /api/identity/sso/config
107
+ */
108
+ IDENTITY_SSO_CONFIG: /^\/api\/identity\/sso\/config\/?$/,
109
+ /**
110
+ * /api/email/inbound
111
+ */
112
+ EMAIL_INBOUND: /^\/api\/email\/inbound\/?$/,
113
+ /**
114
+ * /api/email/send
115
+ */
116
+ EMAIL_SEND: /^\/api\/email\/send\/?$/,
117
+ };
118
+
119
+ export const VALID_STATIC_PATH_REGEX = /^\/[a-zA-Z0-9\-_\.\/]*$/;
@@ -0,0 +1,101 @@
1
+ import { extractErrorMsg } from '@ibgib/helper-gib/dist/helpers/utils-helper.mjs';
2
+ import { validateIbGibAddr } from '@ibgib/ts-gib/dist/V1/validate-helper.mjs';
3
+
4
+ import { GLOBAL_LOG_A_LOT } from './server-constants.mjs';
5
+ import { FORBIDDEN_PATTERNS, MAX_PATH_LENGTH, VALID_STATIC_PATH_REGEX } from './path-constants.mjs';
6
+
7
+ const logalot = GLOBAL_LOG_A_LOT;
8
+
9
+ /**
10
+ * little helper function just to DRY out code.
11
+ */
12
+ export function runtimeErrorValidationStrings(lc: string, error: any): string[] {
13
+ const emsg = `${lc} ${extractErrorMsg(error)}`;
14
+ console.error(emsg);
15
+ return [`runtime error: ${emsg}`];
16
+ }
17
+
18
+ /**
19
+ * Validates that a path is safe from common attacks and under max length.
20
+ */
21
+ export function validateRawPath(rawPath: string): string[] {
22
+ const lc = `[${validateRawPath.name}]`;
23
+ try {
24
+ if (logalot) { console.log(`${lc} starting... (I: 80bd6f63e6c83b8e943b90383e044826)`); }
25
+
26
+ const errors: string[] = [];
27
+
28
+ if (!rawPath || rawPath.length > MAX_PATH_LENGTH) {
29
+ errors.push(`path too long. MAX_PATH_LENGTH: ${MAX_PATH_LENGTH}, incoming path length: ${rawPath.length}`);
30
+ }
31
+
32
+ for (const pattern of FORBIDDEN_PATTERNS) {
33
+ if (pattern.test(rawPath)) {
34
+ errors.push(`invalid path. contains forbidden pattern.source: ${pattern.source} (E: 56a228fb9473a086b83d0088b5af1826)`);
35
+ }
36
+ }
37
+
38
+ return errors;
39
+ } catch (error) {
40
+ return runtimeErrorValidationStrings(lc, error);
41
+ } finally {
42
+ if (logalot) { console.log(`${lc} complete.`); }
43
+ }
44
+ }
45
+
46
+ /**
47
+ * simple boolean wrapper for {@link validateRawPath}
48
+ */
49
+ export function isSafePath(path: string): boolean {
50
+ const errors = validateRawPath(path);
51
+ return errors.length === 0;
52
+ }
53
+
54
+ export function validateStaticPath(path: string): string[] {
55
+ const lc = `[${validateStaticPath.name}]`;
56
+ try {
57
+ if (logalot) { console.log(`${lc} starting... (I: 4f9cf8ffd528c7dd88324529528eeb26)`); }
58
+
59
+ const errors: string[] = [];
60
+
61
+ if (!VALID_STATIC_PATH_REGEX.test(path)) {
62
+ errors.push(`static path fails to match VALID_STATIC_PATH_REGEX of ${VALID_STATIC_PATH_REGEX} (E: dfdf38a0439d4d09186e6fa81ab66826) `);
63
+ }
64
+
65
+ return errors;
66
+ } catch (error) {
67
+ return runtimeErrorValidationStrings(lc, error);
68
+ } finally {
69
+ if (logalot) { console.log(`${lc} complete.`); }
70
+ }
71
+ }
72
+
73
+ /**
74
+ * Validates a static file path.
75
+ */
76
+ export function isValidStaticPath(path: string): boolean {
77
+ if (!isSafePath(path)) { return false; }
78
+ const errors = validateStaticPath(path);
79
+ return errors.length === 0;
80
+ }
81
+
82
+ /**
83
+ * Decodes and validates a single ibGib address segment from a URL path.
84
+ * Uses the library's internal validateIbGibAddr for deep checking.
85
+ */
86
+ export function validateAddressSegment(encodedAddr: string): string[] {
87
+ const lc = `[${validateAddressSegment.name}]`;
88
+ try {
89
+ if (logalot) { console.log(`${lc} starting... (I: 1bb9ff7e1aefb77b670b2519658cc126)`); }
90
+ if (!encodedAddr) {
91
+ throw new Error(`(UNEXPECTED) falsy encodedAddr? We're expecting to have already guaranteed there are no double-slashes (i.e. no empty segments) (E: 7be7668e7b8c9fbbdf56f0fe19f92e26)`);
92
+ }
93
+ const addr = decodeURIComponent(encodedAddr);
94
+ const errors = validateIbGibAddr({ addr });
95
+ return errors ?? [];
96
+ } catch (error) {
97
+ return runtimeErrorValidationStrings(lc, error);
98
+ } finally {
99
+ if (logalot) { console.log(`${lc} complete.`); }
100
+ }
101
+ }
@@ -0,0 +1,99 @@
1
+ // import { respecfully, iReckon, ifWe } from '@ibgib/helper-gib/dist/respec-gib/respec-gib.mjs';
2
+ // import {
3
+ // isSafePath, isValidStaticPath,
4
+ // // API_PATHS, getPathParams, MAX_PATH_LENGTH,
5
+ // validateAddressSegment
6
+ // } from './path-helper.mjs';
7
+ // import { MAX_PATH_LENGTH } from './path-constants.mts';
8
+
9
+ // const sir = `[${import.meta.url}]`;
10
+
11
+ // await respecfully(sir, 'Path Helper Validation', async () => {
12
+
13
+ // await respecfully(sir, 'isSafePath', async () => {
14
+ // await ifWe(sir, 'valid simple paths', async () => {
15
+ // iReckon(sir, isSafePath('/api/health')).isGonnaBeTrue();
16
+ // iReckon(sir, isSafePath('/index.html')).isGonnaBeTrue();
17
+ // });
18
+
19
+ // await ifWe(sir, 'too long paths', async () => {
20
+ // const longPath = '/'.repeat(MAX_PATH_LENGTH + 1);
21
+ // iReckon(sir, isSafePath(longPath)).isGonnaBeFalse();
22
+ // });
23
+
24
+ // await ifWe(sir, 'directory traversal attempts', async () => {
25
+ // iReckon(sir, isSafePath('/../etc/passwd')).isGonnaBeFalse();
26
+ // iReckon(sir, isSafePath('/api/../../etc/passwd')).isGonnaBeFalse();
27
+ // });
28
+
29
+ // await ifWe(sir, 'null bytes', async () => {
30
+ // iReckon(sir, isSafePath('/api/health\0')).isGonnaBeFalse();
31
+ // });
32
+
33
+ // await ifWe(sir, 'redundant slashes', async () => {
34
+ // iReckon(sir, isSafePath('/api//health')).isGonnaBeFalse();
35
+ // });
36
+
37
+ // await ifWe(sir, 'dot-file access', async () => {
38
+ // iReckon(sir, isSafePath('/.env')).isGonnaBeFalse();
39
+ // iReckon(sir, isSafePath('/scripts/.hidden')).isGonnaBeFalse();
40
+ // iReckon(sir, isSafePath('/.git/config')).isGonnaBeFalse();
41
+ // });
42
+ // });
43
+
44
+ // await respecfully(sir, 'validateAddressSegment', async () => {
45
+ // await ifWe(sir, 'valid encoded addresses', async () => {
46
+ // const validGib = 'a'.repeat(64);
47
+ // iReckon(sir, validateAddressSegment(`someib%5E${validGib}`)).isGonnaBeTrue();
48
+ // // gib with dots (common in sha256.sha256)
49
+ // const dotGib = `${validGib}.${validGib}`;
50
+ // iReckon(sir, validateAddressSegment(`someib%5E${dotGib}`)).isGonnaBeTrue();
51
+ // });
52
+
53
+ // await ifWe(sir, 'invalid encoded addresses', async () => {
54
+ // iReckon(sir, validateAddressSegment('no_delim')).isGonnaBeFalse();
55
+ // iReckon(sir, validateAddressSegment('%5Estarts_with_delim')).isGonnaBeFalse();
56
+ // iReckon(sir, validateAddressSegment('too%5Emany%5Edelims')).isGonnaBeFalse();
57
+ // iReckon(sir, validateAddressSegment('too%5Emany..dots')).isGonnaBeFalse();
58
+ // iReckon(sir, validateAddressSegment('invalid_chars_!%5Eabc')).isGonnaBeFalse();
59
+ // });
60
+ // });
61
+
62
+ // await respecfully(sir, 'API_PATHS Regexes', async () => {
63
+ // await ifWe(sir, 'HEALTH regex', async () => {
64
+ // iReckon(sir, API_PATHS.HEALTH.test('/api/health')).isGonnaBeTrue();
65
+ // iReckon(sir, API_PATHS.HEALTH.test('/api/health/')).isGonnaBeTrue();
66
+ // iReckon(sir, API_PATHS.HEALTH.test('/api/health/more')).isGonnaBeFalse();
67
+ // });
68
+
69
+ // await ifWe(sir, 'IBGIB_ADDR regex', async () => {
70
+ // // valid encoded addr: someib%5Esomegib
71
+ // const addr = '/api/ibgib/someib%5Esomegib';
72
+ // iReckon(sir, API_PATHS.IBGIB_ADDR.test(addr)).isGonnaBeTrue();
73
+
74
+ // const params = getPathParams(addr, API_PATHS.IBGIB_ADDR);
75
+ // iReckon(sir, params?.[0]).isGonnaBe('someib%5Esomegib');
76
+ // });
77
+
78
+ // await ifWe(sir, 'IBGIB_GRAPH regex', async () => {
79
+ // const path = '/api/ibgib/graph/someib%5Esomegib';
80
+ // iReckon(sir, API_PATHS.IBGIB_GRAPH.test(path)).isGonnaBeTrue();
81
+
82
+ // const params = getPathParams(path, API_PATHS.IBGIB_GRAPH);
83
+ // iReckon(sir, params?.[0]).isGonnaBe('someib%5Esomegib');
84
+ // });
85
+
86
+ // await ifWe(sir, 'KEYSTONE regex', async () => {
87
+ // iReckon(sir, API_PATHS.KEYSTONE.test('/api/keystone')).isGonnaBeTrue();
88
+ // iReckon(sir, API_PATHS.KEYSTONE.test('/api/keystone/')).isGonnaBeTrue();
89
+ // });
90
+
91
+ // await ifWe(sir, 'KEYSTONE_EVOLVE regex', async () => {
92
+ // const path = '/api/keystone/evolve/someib%5Esomegib';
93
+ // iReckon(sir, API_PATHS.KEYSTONE_EVOLVE.test(path)).isGonnaBeTrue();
94
+
95
+ // const params = getPathParams(path, API_PATHS.KEYSTONE_EVOLVE);
96
+ // iReckon(sir, params?.[0]).isGonnaBe('someib%5Esomegib');
97
+ // });
98
+ // });
99
+ // });
@@ -0,0 +1,32 @@
1
+ /**
2
+ * @module serve-gib/serve-gib-helpers
3
+ *
4
+ * General purpose helper functions for the serve-gib framework.
5
+ */
6
+
7
+ /**
8
+ * Validates and coerces a boolean query parameter in place on the queryParams object.
9
+ *
10
+ * @param queryParams The parsed query parameters object
11
+ * @param key The specific key to validate and coerce
12
+ * @param errors Array to push error messages into if validation fails
13
+ */
14
+ export function validateAndCoerceBooleanQueryParam(
15
+ queryParams: any,
16
+ key: string,
17
+ errors: string[]
18
+ ): void {
19
+ const rawVal = queryParams[key];
20
+ if (typeof rawVal === 'string' &&
21
+ (rawVal.toLowerCase() === 'true' || rawVal.toLowerCase() === 'false')
22
+ ) {
23
+ queryParams[key] = rawVal.toLowerCase() === 'true';
24
+ } else if (typeof rawVal === 'boolean') {
25
+ // do nothing, it's already a boolean
26
+ } else if (rawVal !== undefined) {
27
+ errors.push(`invalid value for "${key}". typeof should either be string or boolean. (E: c28ef87a2d4b4a6faef9a2c8db05b637)`);
28
+ } else {
29
+ // It's undefined, which means it wasn't provided in the URL.
30
+ // We do not error here because default parameters apply later or it may be optional.
31
+ }
32
+ }
@@ -0,0 +1,172 @@
1
+ /**
2
+ * @module serve-gib/serve-gib-v1
3
+ *
4
+ * The main entry point for processing incoming requests in the serve-gib
5
+ * framework.
6
+ */
7
+
8
+ import { IncomingMessage, ServerResponse } from 'node:http';
9
+
10
+ import { extractErrorMsg } from '@ibgib/helper-gib/dist/helpers/utils-helper.mjs';
11
+
12
+ import { GLOBAL_LOG_A_LOT } from './constants.mjs';
13
+ import { RequestContext, ResponseResult, ServeGibHandler, ServeGibHttpMethod } from './types.mjs';
14
+
15
+ const logalot = GLOBAL_LOG_A_LOT;
16
+
17
+ export interface ServeGibOptions {
18
+ /** Pipeline of handlers to check in order. */
19
+ handlers: ServeGibHandler<any, any>[];
20
+ /** Dedicated handler for errors (404, 500, etc.). */
21
+ errorHandler: ServeGibHandler<any, any>;
22
+ /** Port the server is listening on. */
23
+ port: number;
24
+ /**
25
+ * Root data directory for the server. We will use this as the root dir for
26
+ * all spaces that house multitenant ibgib data.
27
+ */
28
+ dataDir: string;
29
+ }
30
+
31
+ export class ServeGib_V1 {
32
+ private lc = `[${ServeGib_V1.name}]`;
33
+
34
+ constructor(private options: ServeGibOptions) { }
35
+
36
+ /**
37
+ * Entry point for all incoming HTTP requests.
38
+ */
39
+ async handleRequest(req: IncomingMessage, res: ServerResponse): Promise<void> {
40
+ const lc = `${this.lc}[${this.handleRequest.name}]`;
41
+ const start = Date.now();
42
+ let reqCtx: RequestContext | undefined;
43
+
44
+ try {
45
+ // Contextualize the request
46
+ reqCtx = await this.prepareContext(req);
47
+ if (!reqCtx) { throw new Error(`(UNEXPECTED) reqCtx falsy? couldn't prepare context? (E: 401888c0f649dfdf0e2d21f86b3ff826)`); }
48
+
49
+ // Execute pipeline
50
+ let result: ResponseResult | undefined;
51
+ for (const handler of this.options.handlers) {
52
+ result = await handler.handleRoute(reqCtx);
53
+ if (result) { break; }
54
+ }
55
+
56
+ // Fallback if no handler matched
57
+ if (!result) {
58
+ result = await this.options.errorHandler.handleRoute(reqCtx);
59
+ }
60
+
61
+ // Final output
62
+ if (result) {
63
+ this.sendResponse(res, result);
64
+ } else {
65
+ // If even the error handler didn't produce a result
66
+ this.sendResponse(res, { status: 404, body: 'Not Found' });
67
+ }
68
+
69
+ } catch (error) {
70
+ console.error(`${lc} Fatal error handling ${req.method} ${req.url}: ${extractErrorMsg(error)}`);
71
+ try {
72
+ // Try to use the error handler for the fatal error
73
+ if (reqCtx) {
74
+ const errorResult = await this.options.errorHandler.handleRoute(reqCtx);
75
+ this.sendResponse(res, errorResult ?? { status: 500, body: 'Internal Server Error' });
76
+ } else {
77
+ throw new Error(`errored before reqCtx could be set. (E: d77ab84b4f8874e188cfa8e9895f1226)`);
78
+ }
79
+ } catch (innerError) {
80
+ // Total collapse fallback
81
+ console.error(`${lc} Collapse in error handler: ${extractErrorMsg(innerError)}`);
82
+ res.writeHead(500);
83
+ res.end('Critical Server Error');
84
+ }
85
+ } finally {
86
+ const duration = Date.now() - start;
87
+ // Standard access logging
88
+ console.log(`${lc} ${req.method} ${req.url} -> ${res.statusCode} (${duration}ms)`);
89
+ }
90
+ }
91
+
92
+ /**
93
+ * Builds request context (e.g. extracting/decoding URL, path segments, body
94
+ * content, etc.), and initializes the request's metaspace if applicable.
95
+ */
96
+ public async prepareContext(req: IncomingMessage): Promise<RequestContext> {
97
+ const lc = `${this.lc}[${this.prepareContext.name}]`;
98
+ try {
99
+ if (logalot) { console.log(`${lc} starting... (I: ad9e9c678d0538c2d1e16ca8063d4426)`); }
100
+
101
+ /**
102
+ * These are NOT all of the validation we do on the context, rather,
103
+ * it is just simple initial validation.
104
+ */
105
+ const initialValidationErrors: string[] = [];
106
+
107
+ const rawUrl = req.url ?? '/';
108
+ const protocol = (req.headers['x-forwarded-proto'] as string) || 'http'; // todo: who owns the req.headers? Can an attacker manipulate this?
109
+ const url = new URL(rawUrl, `${protocol}://localhost:${this.options.port}`); // todo: wth?? Why are we hard-coding localhost? in the URL object?
110
+
111
+ const pathname = url.pathname;
112
+ const rawPathSegments = pathname.split('/');
113
+ const decodedPathSegments = rawPathSegments.map(s => decodeURIComponent(s));
114
+
115
+ const body = await this.readBody(req);
116
+
117
+ const reqCtx: RequestContext = {
118
+ rawUrl,
119
+ pathname,
120
+ method: req.method?.toUpperCase() as ServeGibHttpMethod ?? 'GET',
121
+ protocol,
122
+ body,
123
+ rawPathSegments,
124
+ decodedPathSegments,
125
+ url,
126
+ dataDir: this.options.dataDir,
127
+ headers: req.headers,
128
+ }
129
+
130
+ return reqCtx;
131
+ } catch (error) {
132
+ console.error(`${lc} ${extractErrorMsg(error)}`);
133
+ throw error;
134
+ } finally {
135
+ if (logalot) { console.log(`${lc} complete.`); }
136
+ }
137
+ }
138
+
139
+ /** Reads the full request body as UTF-8. */
140
+ private readBody(req: IncomingMessage): Promise<string> {
141
+ return new Promise((resolve, reject) => {
142
+ const chunks: Buffer[] = [];
143
+ req.on('data', (chunk: Buffer) => chunks.push(chunk));
144
+ req.on('end', () => resolve(Buffer.concat(chunks).toString('utf-8')));
145
+ req.on('error', reject);
146
+ });
147
+ }
148
+
149
+ /** Sends the response result to the client. */
150
+ private sendResponse(res: ServerResponse, result: ResponseResult): void {
151
+ const lc = `${this.lc}[${this.sendResponse.name}]`;
152
+ try {
153
+ if (logalot) { console.log(`${lc} starting... (I: 37369cf120c14780e8652bf27ada1726)`); }
154
+
155
+ const { status, headers = {}, body, isJson = false } = result;
156
+
157
+ let payload: any = body;
158
+ if (isJson) {
159
+ headers['Content-Type'] = 'application/json; charset=utf-8';
160
+ payload = JSON.stringify(body);
161
+ }
162
+
163
+ res.writeHead(status, headers);
164
+ res.end(payload);
165
+ } catch (error) {
166
+ console.error(`${lc} ${extractErrorMsg(error)}`);
167
+ throw error;
168
+ } finally {
169
+ if (logalot) { console.log(`${lc} complete.`); }
170
+ }
171
+ }
172
+ }