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