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