@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,66 @@
1
+ import { extractErrorMsg } from '@ibgib/helper-gib/dist/helpers/utils-helper.mjs';
2
+ import { loadSsoServerConfig } from '@ibgib/web-gib/dist/identity/sso/sso-config-helper.mjs';
3
+ import { SsoCustodianService } from '@ibgib/web-gib/dist/identity/sso/sso-custodian-service.mjs';
4
+
5
+ import { GLOBAL_LOG_A_LOT } from '../../../constants.mjs';
6
+ import { ServeGibHandlerBase } from '../../handler-base.mjs';
7
+ import { API_PATH_REGEXES } from '../../../path-constants.mjs';
8
+ import { RequestContext, ResponseResult, ServeGibHttpMethod } from '../../../types.mjs';
9
+
10
+ const logalot = GLOBAL_LOG_A_LOT || true;
11
+
12
+ let custodian: SsoCustodianService | undefined;
13
+ function getCustodian(): SsoCustodianService {
14
+ if (!custodian) {
15
+ const config = loadSsoServerConfig();
16
+ custodian = new SsoCustodianService(config);
17
+ }
18
+ return custodian;
19
+ }
20
+
21
+ /**
22
+ * GET /api/identity/sso/config
23
+ *
24
+ * Retrieves safe public client configurations (client ID, scope, auth URLs) for active OAuth2 providers.
25
+ */
26
+ export class SsoConfigHandler extends ServeGibHandlerBase<any, any> {
27
+ protected override lc: string = `[${SsoConfigHandler.name}]`;
28
+ protected override method: ServeGibHttpMethod = 'GET';
29
+ protected override regex = API_PATH_REGEXES.IDENTITY_SSO_CONFIG;
30
+
31
+ protected override async parseParamsImpl(reqCtx: RequestContext<any, any>): Promise<any> {
32
+ return undefined;
33
+ }
34
+
35
+ protected override async validateQueryParams({ queryParams }: { queryParams: any }): Promise<string[]> {
36
+ return [];
37
+ }
38
+
39
+ /**
40
+ * @param reqCtx Context details of the incoming request.
41
+ * - Visibility: Public/Private (Contextual request information containing headers).
42
+ * - Generator: Server (Constructed dynamically by serve-gib-v1 pipeline).
43
+ */
44
+ protected async handleRouteImpl(reqCtx: RequestContext<any>): Promise<ResponseResult | undefined> {
45
+ const lc = `${this.lc}[${this.handleRouteImpl.name}]`;
46
+ try {
47
+ if (logalot) { console.log(`${lc} starting...`); }
48
+
49
+ const service = getCustodian();
50
+ const hostUrl = `${reqCtx.protocol}://${reqCtx.headers.host}`;
51
+ const providers = service.getSsoClientConfigs(hostUrl);
52
+
53
+ return this.ok({
54
+ success: true,
55
+ providers
56
+ }, 200);
57
+
58
+ } catch (error) {
59
+ const emsg = extractErrorMsg(error);
60
+ console.error(`${lc} Fetching SSO config failed: ${emsg}`);
61
+ return this.error(500, `SSO configuration retrieval failed: ${emsg}`);
62
+ } finally {
63
+ if (logalot) { console.log(`${lc} complete.`); }
64
+ }
65
+ }
66
+ }
@@ -0,0 +1,140 @@
1
+ import { extractErrorMsg } from '@ibgib/helper-gib/dist/helpers/utils-helper.mjs';
2
+ import { getIbGibAddr } from '@ibgib/ts-gib/dist/helper.mjs';
3
+ import { loadSsoServerConfig } from '@ibgib/web-gib/dist/identity/sso/sso-config-helper.mjs';
4
+ import { SsoCustodianService } from '@ibgib/web-gib/dist/identity/sso/sso-custodian-service.mjs';
5
+ import { SsoProviderId } from '@ibgib/web-gib/dist/identity/sso/sso-types.mjs';
6
+ import { isSsoProviderLinked } from '@ibgib/web-gib/dist/identity/sso/sso-helpers.mjs';
7
+ import { KeystoneService_V1 } from '@ibgib/core-gib/dist/keystone/keystone-service-v1.mjs';
8
+
9
+ import { GLOBAL_LOG_A_LOT } from '../../../constants.mjs';
10
+ import { ServeGibHandlerWithMetaspaceBase } from '../../handler-base.mjs';
11
+ import { API_PATH_REGEXES } from '../../../path-constants.mjs';
12
+ import { ParamsWithDomain, RequestContext, ResponseResult, ServeGibHttpMethod } from '../../../types.mjs';
13
+
14
+ const logalot = GLOBAL_LOG_A_LOT || true;
15
+
16
+ let custodian: SsoCustodianService | undefined;
17
+ function getCustodian(): SsoCustodianService {
18
+ if (!custodian) {
19
+ const config = loadSsoServerConfig();
20
+ custodian = new SsoCustodianService(config);
21
+ }
22
+ return custodian;
23
+ }
24
+
25
+ interface LinkParams extends ParamsWithDomain {
26
+ parentTjpAddr: string;
27
+ }
28
+
29
+ interface LinkBody {
30
+ code: string;
31
+ providerId: SsoProviderId;
32
+ parentTjpAddr: string;
33
+ userNonce: string;
34
+ redirectUri: string;
35
+ }
36
+
37
+ /**
38
+ * POST /api/identity/sso/link
39
+ *
40
+ * Links an identity provider (Google, GitHub) to the user's sovereign parent identity.
41
+ * Generates the deterministic server-delegate keystone and registers it in the domain metaspace.
42
+ */
43
+ export class SsoLinkHandler extends ServeGibHandlerWithMetaspaceBase<LinkParams, any> {
44
+ protected override lc: string = `[${SsoLinkHandler.name}]`;
45
+ protected override method: ServeGibHttpMethod = 'POST';
46
+ protected override regex = API_PATH_REGEXES.IDENTITY_SSO_LINK;
47
+
48
+ protected override async parseParamsImpl(reqCtx: RequestContext<LinkParams, any>): Promise<LinkParams | undefined> {
49
+ let parsed: any;
50
+ try {
51
+ parsed = JSON.parse(reqCtx.body);
52
+ } catch {
53
+ return undefined;
54
+ }
55
+ const parentTjpAddr = parsed?.parentTjpAddr;
56
+ if (!parentTjpAddr) { return undefined; }
57
+ return {
58
+ parentTjpAddr,
59
+ domainInfo: this.getDomainInfo({ domainAddr: parentTjpAddr })
60
+ };
61
+ }
62
+
63
+ protected override async validateQueryParams({ queryParams }: { queryParams: any }): Promise<string[]> {
64
+ return [];
65
+ }
66
+
67
+ protected async handleRouteImpl(reqCtx: RequestContext<LinkParams>): Promise<ResponseResult | undefined> {
68
+ const lc = `${this.lc}[${this.handleRouteImpl.name}]`;
69
+ try {
70
+ if (logalot) { console.log(`${lc} starting...`); }
71
+
72
+ if (!reqCtx.params) {
73
+ return this.error(400, 'Invalid parameters: parentTjpAddr missing');
74
+ }
75
+ if (!reqCtx.metaspace) {
76
+ return this.error(500, 'Metaspace not initialized');
77
+ }
78
+
79
+ let parsed: LinkBody;
80
+ try {
81
+ parsed = JSON.parse(reqCtx.body);
82
+ } catch {
83
+ return this.error(400, 'Request body must be valid JSON');
84
+ }
85
+
86
+ const { code, providerId, parentTjpAddr, userNonce, redirectUri } = parsed;
87
+ if (!code || !providerId || !parentTjpAddr || !userNonce || !redirectUri) {
88
+ return this.error(400, 'Body missing required parameters (code, providerId, parentTjpAddr, userNonce, redirectUri)');
89
+ }
90
+
91
+ const space = await reqCtx.metaspace.getLocalUserSpace({ lock: false });
92
+ if (!space) {
93
+ return this.error(500, 'No local user space found in domain metaspace');
94
+ }
95
+
96
+ // 0. Fetch target keystone and verify if already linked
97
+ const keystoneService = new KeystoneService_V1();
98
+ const targetKeystone = await keystoneService.getLatestKeystone({
99
+ addr: parentTjpAddr,
100
+ metaspace: reqCtx.metaspace,
101
+ space
102
+ });
103
+ if (!targetKeystone) {
104
+ return this.error(400, `Keystone not found for address: ${parentTjpAddr}`);
105
+ }
106
+
107
+ if (isSsoProviderLinked({ keystone: targetKeystone, providerId })) {
108
+ return this.error(400, `SSO provider "${providerId}" is already linked to this keystone.`);
109
+ }
110
+
111
+ // 1. Authenticate with provider and retrieve user info
112
+ const service = getCustodian();
113
+ const userInfo = await service.getOAuthUserInfo(providerId, code, redirectUri);
114
+
115
+ // 2. Generate the custodian foreign challenge pool
116
+ const custodianPool = await service.createCustodianChallengePool({
117
+ providerId,
118
+ providerKey: userInfo.providerKey,
119
+ userNonce,
120
+ keystoneAddr: parentTjpAddr,
121
+ metaspace: reqCtx.metaspace,
122
+ space
123
+ });
124
+
125
+ console.log(`${lc} created custodian pool for: ${userInfo.providerKey}`);
126
+
127
+ return this.ok({
128
+ success: true,
129
+ custodianPool
130
+ }, 200);
131
+
132
+ } catch (error) {
133
+ const emsg = extractErrorMsg(error);
134
+ console.error(`${lc} Link failed: ${emsg}`);
135
+ return this.error(500, `Link failed: ${emsg}`);
136
+ } finally {
137
+ if (logalot) { console.log(`${lc} complete.`); }
138
+ }
139
+ }
140
+ }
@@ -0,0 +1,190 @@
1
+ import { createHmac } from 'node:crypto';
2
+ import { extractErrorMsg } from '@ibgib/helper-gib/dist/helpers/utils-helper.mjs';
3
+ import { getIbGibAddr } from '@ibgib/ts-gib/dist/helper.mjs';
4
+ import { loadSsoServerConfig } from '@ibgib/web-gib/dist/identity/sso/sso-config-helper.mjs';
5
+ import { SsoCustodianService } from '@ibgib/web-gib/dist/identity/sso/sso-custodian-service.mjs';
6
+ import { SsoProviderId } from '@ibgib/web-gib/dist/identity/sso/sso-types.mjs';
7
+ import { POOL_ID_CUSTODIAN_MANAGE, KEYSTONE_VERB_MANAGE } from '@ibgib/core-gib/dist/keystone/keystone-constants.mjs';
8
+ import { KeystoneStrategyFactory } from '@ibgib/core-gib/dist/keystone/strategy/keystone-strategy-factory.mjs';
9
+
10
+ import { GLOBAL_LOG_A_LOT } from '../../../constants.mjs';
11
+ import { ServeGibHandlerWithMetaspaceBase } from '../../handler-base.mjs';
12
+ import { API_PATH_REGEXES } from '../../../path-constants.mjs';
13
+ import { ParamsWithDomain, RequestContext, ResponseResult, ServeGibHttpMethod } from '../../../types.mjs';
14
+
15
+ const logalot = GLOBAL_LOG_A_LOT || true;
16
+
17
+ let custodian: SsoCustodianService | undefined;
18
+ function getCustodian(): SsoCustodianService {
19
+ if (!custodian) {
20
+ const config = loadSsoServerConfig();
21
+ custodian = new SsoCustodianService(config);
22
+ }
23
+ return custodian;
24
+ }
25
+
26
+ function signSessionToken(payload: any, secret: string): string {
27
+ const header = { alg: 'HS256', typ: 'JWT' };
28
+ const headerB64 = Buffer.from(JSON.stringify(header)).toString('base64url');
29
+ const payloadB64 = Buffer.from(JSON.stringify(payload)).toString('base64url');
30
+ const data = `${headerB64}.${payloadB64}`;
31
+ const signature = createHmac('sha256', secret).update(data).digest('base64url');
32
+ return `${data}.${signature}`;
33
+ }
34
+
35
+ interface LoginParams extends ParamsWithDomain {
36
+ parentTjpAddr: string;
37
+ }
38
+
39
+ interface LoginBody {
40
+ code: string;
41
+ providerId: SsoProviderId;
42
+ parentTjpAddr: string;
43
+ userNonce: string;
44
+ redirectUri: string;
45
+ }
46
+
47
+ /**
48
+ * POST /api/identity/sso/login
49
+ *
50
+ * Exposes login endpoint for SSO authentication. Verifies provider identity, asserts
51
+ * that the deterministic server-delegate keystone is registered in the parent keystone,
52
+ * and yields a secure HttpOnly session token.
53
+ */
54
+ export class SsoLoginHandler extends ServeGibHandlerWithMetaspaceBase<LoginParams, any> {
55
+ protected override lc: string = `[${SsoLoginHandler.name}]`;
56
+ protected override method: ServeGibHttpMethod = 'POST';
57
+ protected override regex = API_PATH_REGEXES.IDENTITY_SSO_LOGIN;
58
+
59
+ protected override async parseParamsImpl(reqCtx: RequestContext<LoginParams, any>): Promise<LoginParams | undefined> {
60
+ let parsed: any;
61
+ try {
62
+ parsed = JSON.parse(reqCtx.body);
63
+ } catch {
64
+ return undefined;
65
+ }
66
+ const parentTjpAddr = parsed?.parentTjpAddr;
67
+ if (!parentTjpAddr) { return undefined; }
68
+ return {
69
+ parentTjpAddr,
70
+ domainInfo: this.getDomainInfo({ domainAddr: parentTjpAddr })
71
+ };
72
+ }
73
+
74
+ protected override async validateQueryParams({ queryParams }: { queryParams: any }): Promise<string[]> {
75
+ return [];
76
+ }
77
+
78
+ protected async handleRouteImpl(reqCtx: RequestContext<LoginParams>): Promise<ResponseResult | undefined> {
79
+ const lc = `${this.lc}[${this.handleRouteImpl.name}]`;
80
+ try {
81
+ if (logalot) { console.log(`${lc} starting...`); }
82
+
83
+ if (!reqCtx.params) {
84
+ return this.error(400, 'Invalid parameters: parentTjpAddr missing');
85
+ }
86
+ if (!reqCtx.metaspace) {
87
+ return this.error(500, 'Metaspace not initialized');
88
+ }
89
+
90
+ let parsed: LoginBody;
91
+ try {
92
+ parsed = JSON.parse(reqCtx.body);
93
+ } catch {
94
+ return this.error(400, 'Request body must be valid JSON');
95
+ }
96
+
97
+ const { code, providerId, parentTjpAddr, userNonce, redirectUri } = parsed;
98
+ if (!code || !providerId || !parentTjpAddr || !userNonce || !redirectUri) {
99
+ return this.error(400, 'Body missing required parameters (code, providerId, parentTjpAddr, userNonce, redirectUri)');
100
+ }
101
+
102
+ const space = await reqCtx.metaspace.getLocalUserSpace({ lock: false });
103
+ if (!space) {
104
+ return this.error(500, 'No local user space found in domain metaspace');
105
+ }
106
+
107
+ // 1. Authenticate with provider and retrieve user info
108
+ const service = getCustodian();
109
+ const userInfo = await service.getOAuthUserInfo(providerId, code, redirectUri);
110
+
111
+ // 2. Derive custodian secret using providerKey and userNonce
112
+ const custodianSecret = await service.deriveServerDelegateSecret(userInfo.providerKey, userNonce);
113
+
114
+ // 3. Fetch latest parent keystone from metaspace
115
+ const latestParentAddr = await reqCtx.metaspace.getLatestAddr({ addr: parentTjpAddr, space });
116
+ if (!latestParentAddr) {
117
+ return this.error(404, `Parent identity keystone not found for address: ${parentTjpAddr}`);
118
+ }
119
+
120
+ const resGet = await reqCtx.metaspace.get({ addr: latestParentAddr, space });
121
+ const parentKeystone = resGet.ibGibs?.[0];
122
+ if (!parentKeystone) {
123
+ return this.error(404, `Parent identity keystone not found in space for address: ${latestParentAddr}`);
124
+ }
125
+
126
+ // 4. Resolve the custodian pool from the parent keystone using dynamic poolId
127
+ const targetPoolId = `custodian-manage-${providerId}`;
128
+ const custodianPool = parentKeystone.data?.challengePools?.find((p: any) => p.id === targetPoolId);
129
+ if (!custodianPool) {
130
+ return this.error(401, `Unauthorized: Custodian pool '${targetPoolId}' is not registered in the parent identity keystone.`);
131
+ }
132
+
133
+ // 5. Assert allowed verbs contain KEYSTONE_VERB_MANAGE
134
+ const allowedVerbs = custodianPool.config.allowedVerbs || [];
135
+ if (!allowedVerbs.includes(KEYSTONE_VERB_MANAGE)) {
136
+ return this.error(401, `Unauthorized: Custodian pool does not have the required manage permission.`);
137
+ }
138
+
139
+ // 6. Cryptographically verify the custodian secret against the pool's challenges
140
+ const strategy = KeystoneStrategyFactory.create({ config: custodianPool.config });
141
+ const poolSecret = await strategy.derivePoolSecret({ masterSecret: custodianSecret });
142
+
143
+ for (const [id, challenge] of Object.entries(custodianPool.challenges)) {
144
+ const solution = await strategy.generateSolution({
145
+ poolSecret,
146
+ poolId: custodianPool.id,
147
+ challengeId: id
148
+ });
149
+ const hashValue = await strategy.generateChallenge({ solution });
150
+ if (hashValue.hash !== (challenge as any).hash) {
151
+ return this.error(401, 'Unauthorized: Cryptographic verification of custodian pool challenges failed.');
152
+ }
153
+ }
154
+
155
+ // 7. Issue secure HttpOnly session cookie
156
+ const sessionPayload = {
157
+ parentTjpAddr,
158
+ providerKey: userInfo.providerKey,
159
+ exp: Math.floor(Date.now() / 1000) + 24 * 3600 // 24-hour expiration
160
+ };
161
+
162
+ const config = loadSsoServerConfig();
163
+ const sessionToken = signSessionToken(sessionPayload, config.sessionSecret);
164
+
165
+ const headers = {
166
+ 'Set-Cookie': `space_gib_session=${sessionToken}; Path=/; HttpOnly; SameSite=Strict; Max-Age=86400`
167
+ };
168
+
169
+ console.log(`${lc} login successful for parent: ${parentTjpAddr}, custodian providerKey: ${userInfo.providerKey}`);
170
+
171
+ return {
172
+ status: 200,
173
+ headers,
174
+ body: {
175
+ success: true,
176
+ parentTjpAddr,
177
+ custodianPoolId: custodianPool.id
178
+ },
179
+ isJson: true
180
+ };
181
+
182
+ } catch (error) {
183
+ const emsg = extractErrorMsg(error);
184
+ console.error(`${lc} Login failed: ${emsg}`);
185
+ return this.error(500, `Login failed: ${emsg}`);
186
+ } finally {
187
+ if (logalot) { console.log(`${lc} complete.`); }
188
+ }
189
+ }
190
+ }
@@ -0,0 +1,36 @@
1
+ /**
2
+ * @module serve-gib/handlers/error-handler
3
+ *
4
+ * Default error handler for serve-gib.
5
+ */
6
+
7
+ import { extractErrorMsg } from '@ibgib/helper-gib/dist/helpers/utils-helper.mjs';
8
+
9
+ import { GLOBAL_LOG_A_LOT } from '../constants.mjs';
10
+ import { ServeGibHandlerBase } from './handler-base.mjs';
11
+ import { RequestContext, ResponseResult, ServeGibHttpMethod } from '../types.mjs';
12
+
13
+ const logalot = GLOBAL_LOG_A_LOT;
14
+
15
+ export class ErrorHandler extends ServeGibHandlerBase {
16
+ protected override lc: string = `[${ErrorHandler.name}]`;
17
+ protected override method: ServeGibHttpMethod = 'ALL';
18
+ protected override regex = /.*/;
19
+
20
+ async handleRouteImpl(reqCtx: RequestContext): Promise<ResponseResult | undefined> {
21
+ const lc = `${this.lc}[${this.handleRouteImpl.name}]`;
22
+ try {
23
+ if (logalot) { console.log(`${lc} starting...`); }
24
+
25
+ const { rawUrl, pathname, method, } = reqCtx;
26
+
27
+ // This is the fallback handler
28
+ return this.error(404, 'Not Found', { method, rawUrl, pathname });
29
+ } catch (error: any) {
30
+ console.log(`${lc} ${extractErrorMsg(error)}`);
31
+ throw error;
32
+ } finally {
33
+ if (logalot) { console.log(`${lc} complete.`); }
34
+ }
35
+ }
36
+ }