@undefineds.co/xpod 0.4.13 → 0.4.15
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/config/cloud.json +0 -3
- package/config/components-ignore.json +11 -7
- package/config/local.json +0 -3
- package/config/xpod.base.json +0 -24
- package/dist/api/ai-config/AiConfigStore.d.ts +2 -2
- package/dist/api/ai-config/AiConfigStore.js +4 -1
- package/dist/api/ai-gateway/auth/CallerPodAccess.d.ts +2 -5
- package/dist/api/ai-gateway/auth/CallerPodAccess.js +3 -42
- package/dist/api/ai-gateway/auth/GatewayApiKeyAuthenticator.d.ts +2 -1
- package/dist/api/ai-gateway/auth/GatewayApiKeyAuthenticator.js +1 -1
- package/dist/api/ai-gateway/auth/PodGatewayAccessKeyRepository.d.ts +3 -8
- package/dist/api/ai-gateway/auth/PodGatewayAccessKeyRepository.js +9 -32
- package/dist/api/ai-gateway/connect/index.d.ts +3 -3
- package/dist/api/ai-gateway/connect/index.js +9 -38
- package/dist/api/ai-gateway/errors.js +2 -1
- package/dist/api/ai-gateway/models/PodModelSelectionRepository.d.ts +3 -3
- package/dist/api/ai-gateway/models/PodModelSelectionRepository.js +7 -11
- package/dist/api/ai-gateway/pod/HostedPodRoute.d.ts +27 -0
- package/dist/api/ai-gateway/pod/HostedPodRoute.js +47 -0
- package/dist/api/ai-gateway/pod/OwnerPodAccess.d.ts +79 -0
- package/dist/api/ai-gateway/pod/OwnerPodAccess.js +192 -0
- package/dist/api/ai-gateway/pod/PodInterfaceKeyStore.d.ts +52 -0
- package/dist/api/ai-gateway/pod/PodInterfaceKeyStore.js +61 -0
- package/dist/api/ai-gateway/providers/ProviderRegistry.js +1 -1
- package/dist/api/ai-gateway/quota/ProviderQuotaAdapter.d.ts +3 -3
- package/dist/api/ai-gateway/quota/ProviderQuotaAdapter.js +7 -32
- package/dist/api/ai-gateway/service-access/AiConnectionsServiceAccess.d.ts +1 -1
- package/dist/api/ai-gateway/service-access/AiConnectionsServiceAccess.js +1 -1
- package/dist/api/auth/ClientCredentialsAuthenticator.js +5 -28
- package/dist/api/auth/TokenEndpointRoute.d.ts +18 -0
- package/dist/api/auth/TokenEndpointRoute.js +36 -0
- package/dist/api/chatkit/pod-store.d.ts +4 -4
- package/dist/api/chatkit/pod-store.js +24 -95
- package/dist/api/container/common.js +36 -23
- package/dist/api/container/index.js +1 -0
- package/dist/api/container/local.js +88 -37
- package/dist/api/container/routes.js +41 -7
- package/dist/api/container/types.d.ts +4 -2
- package/dist/api/handlers/AdminHandler.d.ts +17 -1
- package/dist/api/handlers/AdminHandler.js +40 -3
- package/dist/api/handlers/AiGatewayManagementHandler.d.ts +6 -0
- package/dist/api/handlers/AiGatewayManagementHandler.js +17 -4
- package/dist/api/handlers/EdgeNodeSignalHandler.js +10 -2
- package/dist/api/handlers/NetworkSettingsHandler.d.ts +44 -5
- package/dist/api/handlers/NetworkSettingsHandler.js +46 -11
- package/dist/api/handlers/PodSettingsHandler.d.ts +3 -3
- package/dist/api/handlers/PodSettingsHandler.js +3 -3
- package/dist/api/handlers/ProvisionHandler.d.ts +35 -1
- package/dist/api/handlers/ProvisionHandler.js +53 -2
- package/dist/api/handlers/ReachabilityHandler.d.ts +6 -0
- package/dist/api/handlers/ReachabilityHandler.js +25 -6
- package/dist/api/network/NetworkEnvironmentConfigurationStore.d.ts +6 -1
- package/dist/api/network/NetworkEnvironmentConfigurationStore.js +72 -16
- package/dist/api/runtime.d.ts +18 -0
- package/dist/api/runtime.js +28 -2
- package/dist/api/service/AiClientConfigurationService.d.ts +1 -1
- package/dist/api/service/AiClientConfigurationService.js +1 -1
- package/dist/cli/commands/start.d.ts +26 -1
- package/dist/cli/commands/start.js +69 -5
- package/dist/components/components.jsonld +1 -1
- package/dist/components/context.jsonld +35 -42
- package/dist/edge/EdgeNodeAgent.d.ts +16 -0
- package/dist/edge/EdgeNodeAgent.js +56 -1
- package/dist/edge/EdgeNodeAgent.jsonld +8 -0
- package/dist/edge/EdgeNodeAgentInitializer.d.ts +2 -0
- package/dist/edge/EdgeNodeAgentInitializer.js +1 -0
- package/dist/edge/EdgeNodeAgentInitializer.jsonld +19 -0
- package/dist/edge/EdgeNodeDnsCoordinator.d.ts +11 -1
- package/dist/edge/EdgeNodeDnsCoordinator.js +12 -2
- package/dist/edge/EdgeNodeHealthProbeService.d.ts +15 -0
- package/dist/edge/EdgeNodeHealthProbeService.js +44 -12
- package/dist/edge/EdgeNodeHealthProbeService.jsonld +77 -0
- package/dist/edge/ProbeTargetGuard.d.ts +35 -0
- package/dist/edge/ProbeTargetGuard.js +142 -0
- package/dist/edge/reachability/NodeAccessResolver.d.ts +16 -0
- package/dist/edge/reachability/NodeAccessResolver.js +30 -0
- package/dist/edge/reachability/ReachabilitySessionService.js +4 -1
- package/dist/edge/reachability/RouteSetBuilder.d.ts +18 -1
- package/dist/edge/reachability/RouteSetBuilder.js +47 -0
- package/dist/edge/reachability/RouteSetBuilder.jsonld +29 -0
- package/dist/edge/reachability/types.d.ts +8 -2
- package/dist/http/SubgraphSparqlHttpHandler.d.ts +1 -25
- package/dist/http/SubgraphSparqlHttpHandler.js +0 -100
- package/dist/http/SubgraphSparqlHttpHandler.jsonld +0 -8
- package/dist/identity/drizzle/PodInterfaceKeyRepository.d.ts +33 -0
- package/dist/identity/drizzle/PodInterfaceKeyRepository.js +78 -0
- package/dist/identity/drizzle/db.d.ts +7 -0
- package/dist/identity/drizzle/db.js +30 -0
- package/dist/identity/drizzle/schema.pg.d.ts +9 -0
- package/dist/identity/drizzle/schema.pg.js +16 -1
- package/dist/identity/drizzle/schema.sqlite.d.ts +106 -0
- package/dist/identity/drizzle/schema.sqlite.js +16 -1
- package/dist/index.d.ts +3 -2
- package/dist/index.js +9 -5
- package/dist/main.js +7 -0
- package/dist/runtime/GatewayAdminProxyAuth.d.ts +1 -16
- package/dist/runtime/GatewayAdminProxyAuth.js +2 -71
- package/dist/runtime/Proxy.d.ts +32 -1
- package/dist/runtime/Proxy.js +125 -31
- package/dist/runtime/bootstrap.d.ts +21 -0
- package/dist/runtime/bootstrap.js +45 -1
- package/dist/runtime/css-process.d.ts +1 -0
- package/dist/runtime/css-process.js +1 -0
- package/dist/runtime/host/node/NodeRuntimeHost.js +6 -1
- package/dist/runtime/host/types.d.ts +6 -0
- package/dist/runtime/index.d.ts +1 -1
- package/dist/runtime/index.js +4 -1
- package/dist/runtime/js-runtime.js +10 -3
- package/dist/runtime/lifecycle.js +6 -4
- package/dist/runtime/port-finder.d.ts +26 -0
- package/dist/runtime/port-finder.js +64 -0
- package/dist/runtime/runner/node/NodeGatewayRuntimeRunner.js +1 -0
- package/dist/runtime/runner/types.d.ts +5 -0
- package/dist/runtime/runtime-types.d.ts +1 -0
- package/dist/test-utils/local-managed-client-p2p-e2e-smoke.js +1 -1
- package/dist/tunnel/AutoTunnelProvider.d.ts +56 -0
- package/dist/tunnel/AutoTunnelProvider.js +181 -0
- package/dist/tunnel/LocalTunnelProvider.d.ts +15 -0
- package/dist/tunnel/LocalTunnelProvider.js +87 -18
- package/dist/tunnel/LocalTunnelProvider.jsonld +27 -0
- package/dist/tunnel/NgrokTunnelProvider.d.ts +4 -0
- package/dist/tunnel/NgrokTunnelProvider.js +117 -43
- package/dist/tunnel/NgrokTunnelProvider.jsonld +4 -0
- package/dist/tunnel/SakuraFrpTunnelProvider.d.ts +65 -3
- package/dist/tunnel/SakuraFrpTunnelProvider.js +268 -25
- package/dist/tunnel/TunnelLifecycle.d.ts +14 -0
- package/dist/tunnel/TunnelLifecycle.js +34 -0
- package/dist/tunnel/TunnelProfiles.d.ts +33 -3
- package/dist/tunnel/TunnelProfiles.js +105 -78
- package/dist/tunnel/TunnelProvider.d.ts +15 -2
- package/dist/tunnel/TunnelProvider.jsonld +8 -0
- package/dist/tunnel/TunnelProviderCatalog.d.ts +62 -0
- package/dist/tunnel/TunnelProviderCatalog.js +130 -0
- package/dist/tunnel/index.d.ts +1 -0
- package/dist/tunnel/index.js +3 -1
- package/node_modules/@undefineds.co/ai-connections/dist/AiApiKeyPool.d.ts +1 -1
- package/node_modules/@undefineds.co/ai-connections/dist/AiApiKeyPool.js +1 -1
- package/node_modules/@undefineds.co/ai-connections/dist/AiAuthorizationActions.d.ts +1 -1
- package/node_modules/@undefineds.co/ai-connections/dist/AiClientConfigurationSection.d.ts +1 -1
- package/node_modules/@undefineds.co/ai-connections/dist/AiClientConfigurationSection.js +1 -1
- package/node_modules/@undefineds.co/ai-connections/dist/AiConnectDialog.d.ts +1 -1
- package/node_modules/@undefineds.co/ai-connections/dist/AiConnectionsPanel.d.ts +1 -1
- package/node_modules/@undefineds.co/ai-connections/dist/AiCredentialPoolSection.d.ts +1 -1
- package/node_modules/@undefineds.co/ai-connections/dist/AiCredentialRow.d.ts +1 -1
- package/node_modules/@undefineds.co/ai-connections/dist/AiCustomProviderDialog.d.ts +1 -1
- package/node_modules/@undefineds.co/ai-connections/dist/AiGatewayKeyRow.d.ts +1 -1
- package/node_modules/@undefineds.co/ai-connections/dist/AiGatewayKeysSection.d.ts +1 -1
- package/node_modules/@undefineds.co/ai-connections/dist/AiGatewayModelsSection.d.ts +1 -1
- package/node_modules/@undefineds.co/ai-connections/dist/AiOfferingDetails.d.ts +1 -1
- package/node_modules/@undefineds.co/ai-connections/dist/AiProviderCard.d.ts +1 -1
- package/node_modules/@undefineds.co/ai-connections/dist/AiQuotaCard.d.ts +1 -1
- package/node_modules/@undefineds.co/ai-connections/dist/AiSortableCredentialList.d.ts +1 -1
- package/node_modules/@undefineds.co/ai-connections/dist/authorization-methods.d.ts +1 -1
- package/node_modules/@undefineds.co/ai-connections/dist/collection-runtime.d.ts +1 -1
- package/node_modules/@undefineds.co/ai-connections/dist/collection-runtime.js +3 -3
- package/node_modules/@undefineds.co/ai-connections/dist/collections.d.ts +1 -1
- package/node_modules/@undefineds.co/ai-connections/dist/collections.js +3 -3
- package/node_modules/@undefineds.co/{ai-connections-core/dist → ai-connections/dist/contract}/ai-connections-client.d.ts +1 -1
- package/node_modules/@undefineds.co/{ai-connections-core/dist → ai-connections/dist/contract}/ai-connections-client.js +1 -1
- package/node_modules/@undefineds.co/{ai-connections-core/dist → ai-connections/dist/contract}/client-config/index.cjs +8 -8
- package/node_modules/@undefineds.co/{ai-connections-core/dist → ai-connections/dist/contract}/index.d.ts +1 -1
- package/node_modules/@undefineds.co/{ai-connections-core/dist → ai-connections/dist/contract}/index.js +1 -1
- package/node_modules/@undefineds.co/{ai-connections-core/dist → ai-connections/dist/contract}/provider-catalog.cjs +3 -3
- package/node_modules/@undefineds.co/ai-connections/dist/controller.d.ts +1 -1
- package/node_modules/@undefineds.co/ai-connections/dist/controller.js +1 -1
- package/node_modules/@undefineds.co/ai-connections/dist/credential-labels.d.ts +1 -1
- package/node_modules/@undefineds.co/ai-connections/dist/display-wording.d.ts +1 -1
- package/node_modules/@undefineds.co/ai-connections/dist/error-wording.d.ts +1 -1
- package/node_modules/@undefineds.co/ai-connections/dist/error-wording.js +8 -3
- package/node_modules/@undefineds.co/ai-connections/dist/gateway-endpoints.js +1 -1
- package/node_modules/@undefineds.co/ai-connections/dist/offering-endpoints.d.ts +1 -1
- package/node_modules/@undefineds.co/ai-connections/dist/offering-label.d.ts +1 -1
- package/node_modules/@undefineds.co/ai-connections/dist/provider-visuals.d.ts +1 -1
- package/node_modules/@undefineds.co/ai-connections/dist/service-access.js +1 -1
- package/node_modules/@undefineds.co/ai-connections/dist/useAiConnectDialog.d.ts +1 -1
- package/node_modules/@undefineds.co/ai-connections/package.json +31 -1
- package/node_modules/@undefineds.co/solid-sdk/dist/access-route.cjs +230 -0
- package/node_modules/@undefineds.co/solid-sdk/dist/access-route.d.ts +76 -0
- package/node_modules/@undefineds.co/solid-sdk/dist/access-route.js +115 -0
- package/node_modules/@undefineds.co/solid-sdk/dist/index.cjs +89 -0
- package/node_modules/@undefineds.co/solid-sdk/dist/index.d.ts +1 -0
- package/node_modules/@undefineds.co/solid-sdk/dist/index.js +1 -0
- package/node_modules/@undefineds.co/solid-sdk/package.json +6 -1
- package/package.json +5 -6
- package/static/app/assets/inrupt-smoke.js +23 -23
- package/static/app/assets/main.css +1 -1
- package/static/auth-callback/assets/{AiConfigContext-DlFyEWy9.js → AiConfigContext-Bx0HCAW5.js} +1 -1
- package/static/auth-callback/assets/{AiConfigPage-CkYk-SFW.js → AiConfigPage-ChQImMbm.js} +1 -1
- package/static/auth-callback/assets/{DocumentProcessingPanel-CqIr3JqN.js → DocumentProcessingPanel-D830H4SH.js} +1 -1
- package/static/auth-callback/assets/{IndexLifecyclePanel-C1GKV3Vx.js → IndexLifecyclePanel-CnlkjMF8.js} +1 -1
- package/static/auth-callback/assets/{IndexSubjectPanel-ro9lC6XW.js → IndexSubjectPanel-CdEfg_CO.js} +1 -1
- package/static/auth-callback/assets/{ModelAssignmentsPanel-DxNdyKRJ.js → ModelAssignmentsPanel-D-8A8dZx.js} +1 -1
- package/static/auth-callback/assets/{ModelsPage-BVtWSPBU.js → ModelsPage-Cim7cubp.js} +3 -3
- package/static/auth-callback/assets/NetworkPage-CfK3x-pb.js +2 -0
- package/static/auth-callback/assets/{PaneListHeader-ByKw8ada.js → PaneListHeader-Bf_kEd4U.js} +1 -1
- package/static/auth-callback/assets/{SearchIndexingPanel-CulBKcYT.js → SearchIndexingPanel-4kD4RBEQ.js} +1 -1
- package/static/auth-callback/assets/{StatusSubjectPanel-VOcfrt8o.js → StatusSubjectPanel-Bw9AiTSf.js} +1 -1
- package/static/auth-callback/assets/{StatusWorkspace-Jsz6hAdE.js → StatusWorkspace-C-301H-0.js} +1 -1
- package/static/auth-callback/assets/{SystemSettingsPage-BFNvGAle.js → SystemSettingsPage-BbWn-eG6.js} +1 -1
- package/static/auth-callback/assets/{SystemSettingsSubjectPanel-DFRdrSfK.js → SystemSettingsSubjectPanel-DA4wvNSm.js} +1 -1
- package/static/auth-callback/assets/{XpodAiConnectionsPodStore-C6KpvHVg.js → XpodAiConnectionsPodStore-CohdyLoX.js} +1 -1
- package/static/auth-callback/assets/{activity-DnTlb9iM.js → activity-CCsb9Oam.js} +1 -1
- package/static/auth-callback/assets/ai-connections-DexTPyfC.js +1 -0
- package/static/auth-callback/assets/{auth-callback-D2UkK5Xj.js → auth-callback-Ds-c62W3.js} +5 -5
- package/static/auth-callback/assets/auth-callback-rk080mvG.css +1 -0
- package/static/auth-callback/assets/{badge-D7IJuuTM.js → badge-CQm5OyzR.js} +1 -1
- package/static/auth-callback/assets/{collection-runtime-wT1n4GS2.js → collection-runtime-DlAuU5TW.js} +1 -1
- package/static/auth-callback/assets/{dialog-DickLu5z.js → dialog-CnGzg5Ff.js} +1 -1
- package/static/auth-callback/assets/{download-kn8WnRu3.js → download-DwMONJvm.js} +1 -1
- package/static/auth-callback/assets/{external-link-B6B8jfSn.js → external-link-Bu5AGqCO.js} +1 -1
- package/static/auth-callback/assets/{index-DHF97YLP.js → index-B0T-1YO8.js} +1 -1
- package/static/auth-callback/assets/{index-Dz83EEHD.js → index-C8QZf_4W.js} +1 -1
- package/static/auth-callback/assets/index-DwIlrIDG.js +4 -0
- package/static/auth-callback/assets/{index-browser-CSghinyi.js → index-browser-lRsMcP_7.js} +1 -1
- package/static/auth-callback/assets/{key-round-ChkOx3E1.js → key-round-BDMtU57P.js} +1 -1
- package/static/auth-callback/assets/{rotate-ccw-B3hE-nyd.js → rotate-ccw-CoKIGCsQ.js} +1 -1
- package/static/auth-callback/assets/{skeleton-kEqR7tpI.js → skeleton-CPoSWHDr.js} +1 -1
- package/static/auth-callback/assets/{waypoints-D6Jo-SZa.js → waypoints-BeYHxqHv.js} +1 -1
- package/static/auth-callback/assets/{workspace-layout-BHwT_cHd.js → workspace-layout-xA5YxiK3.js} +1 -1
- package/static/auth-callback/auth-callback.html +2 -2
- package/static/dashboard/assets/{AiConfigContext-BfC3v-x2.js → AiConfigContext-rWx4TyiH.js} +1 -1
- package/static/dashboard/assets/{AiConfigPage-QNS3u7Ff.js → AiConfigPage-StVJpDFT.js} +1 -1
- package/static/dashboard/assets/{DocumentProcessingPanel-Dr4XLeT4.js → DocumentProcessingPanel-DJ5yul2O.js} +1 -1
- package/static/dashboard/assets/{IndexLifecyclePanel-KtM_gpeO.js → IndexLifecyclePanel-CpjtgezK.js} +1 -1
- package/static/dashboard/assets/{IndexSubjectPanel-DLaiKdLc.js → IndexSubjectPanel-BVKcot1_.js} +1 -1
- package/static/dashboard/assets/{ModelAssignmentsPanel-Bk7TvQRq.js → ModelAssignmentsPanel-BxVgWZPc.js} +1 -1
- package/static/dashboard/assets/{ModelsPage-Cci3vlos.js → ModelsPage-CECBwmeO.js} +3 -3
- package/static/dashboard/assets/NetworkPage-zQgFscEW.js +2 -0
- package/static/dashboard/assets/{PaneListHeader-qHME_s08.js → PaneListHeader-DIPe8pS6.js} +1 -1
- package/static/dashboard/assets/{SearchIndexingPanel-HZPKj8H9.js → SearchIndexingPanel-lalFJ3c8.js} +1 -1
- package/static/dashboard/assets/{StatusSubjectPanel-ij7IpI8d.js → StatusSubjectPanel-CpY_KU-G.js} +1 -1
- package/static/dashboard/assets/{StatusWorkspace-Cp02JcaN.js → StatusWorkspace-BwWCii3A.js} +1 -1
- package/static/dashboard/assets/{SystemSettingsPage-BSeuvb8X.js → SystemSettingsPage-BKZxX-_n.js} +1 -1
- package/static/dashboard/assets/{SystemSettingsSubjectPanel-CP4_luGS.js → SystemSettingsSubjectPanel-BZrqb2C5.js} +1 -1
- package/static/dashboard/assets/{XpodAiConnectionsPodStore-urO6zaHL.js → XpodAiConnectionsPodStore-Bbpx9dTN.js} +1 -1
- package/static/dashboard/assets/{activity-DxjgQNvr.js → activity-BJ15TLVP.js} +1 -1
- package/static/dashboard/assets/ai-connections-GG6qkTJt.js +1 -0
- package/static/dashboard/assets/{badge-53qCrRbl.js → badge-BBX5FlaB.js} +1 -1
- package/static/dashboard/assets/{collection-runtime-BPAmHG46.js → collection-runtime-UBbHBzdf.js} +1 -1
- package/static/dashboard/assets/{dashboard-BcT2ByXw.js → dashboard-7Y6BHyV9.js} +62 -62
- package/static/dashboard/assets/dashboard-rk080mvG.css +1 -0
- package/static/dashboard/assets/{dialog-B28YtNhS.js → dialog-QrOJ-hB0.js} +1 -1
- package/static/dashboard/assets/{download-DkLNceJ4.js → download-DK9x-VOP.js} +1 -1
- package/static/dashboard/assets/{external-link-D3TXnlo3.js → external-link-Cnkn87mJ.js} +1 -1
- package/static/dashboard/assets/index-B1z84it5.js +4 -0
- package/static/dashboard/assets/{index-CIiBu9mr.js → index-DzjauX3N.js} +1 -1
- package/static/dashboard/assets/{index-CFIenkeK.js → index-cIa8_efI.js} +1 -1
- package/static/dashboard/assets/{key-round-B5ccp6nx.js → key-round-BoS6UqKz.js} +1 -1
- package/static/dashboard/assets/{rotate-ccw-DUpfkNnk.js → rotate-ccw-BeWV76i0.js} +1 -1
- package/static/dashboard/assets/{skeleton-BRe19fO0.js → skeleton-CypcJL07.js} +1 -1
- package/static/dashboard/assets/{waypoints-BKDMxEvu.js → waypoints-zHOOqfhi.js} +1 -1
- package/static/dashboard/assets/{workspace-layout-ZTF7C16h.js → workspace-layout-DZ9JuxnM.js} +1 -1
- package/static/dashboard/dashboard.html +2 -2
- package/static/settings/assets/{AiConfigContext-DsyWgu2i.js → AiConfigContext-D3b1l_Kw.js} +1 -1
- package/static/settings/assets/{AiConfigPage-CSCBckKo.js → AiConfigPage-DYKw-atP.js} +1 -1
- package/static/settings/assets/{DocumentProcessingPanel-w9yQDbBe.js → DocumentProcessingPanel-DguRfsIV.js} +1 -1
- package/static/settings/assets/{IndexLifecyclePanel-CUUXI8mP.js → IndexLifecyclePanel-B85qJJA4.js} +1 -1
- package/static/settings/assets/{IndexSubjectPanel-BypAU5TJ.js → IndexSubjectPanel-CsN7IxaV.js} +1 -1
- package/static/settings/assets/{ModelAssignmentsPanel-BetgXw1G.js → ModelAssignmentsPanel-DEp9byI6.js} +1 -1
- package/static/settings/assets/{ModelsPage-DZpTlTZ3.js → ModelsPage-CzTnPs_G.js} +3 -3
- package/static/settings/assets/NetworkPage-BDVnmUU0.js +2 -0
- package/static/settings/assets/{PaneListHeader-BGOqGec4.js → PaneListHeader-Cpe39N76.js} +1 -1
- package/static/settings/assets/{SearchIndexingPanel-DYAbpZ_9.js → SearchIndexingPanel-DA9w8lLL.js} +1 -1
- package/static/settings/assets/{StatusSubjectPanel-CFgzeQ8Q.js → StatusSubjectPanel-BU0Aq0CS.js} +1 -1
- package/static/settings/assets/{StatusWorkspace-4Z6g4Jvv.js → StatusWorkspace-D1AC1i5N.js} +1 -1
- package/static/settings/assets/{SystemSettingsPage-C1tlrgvI.js → SystemSettingsPage-ChKvOioO.js} +1 -1
- package/static/settings/assets/{SystemSettingsSubjectPanel-CcURI-1L.js → SystemSettingsSubjectPanel-DyTpOnD2.js} +1 -1
- package/static/settings/assets/{XpodAiConnectionsPodStore-owBQc5nY.js → XpodAiConnectionsPodStore-VU5Bsz1a.js} +1 -1
- package/static/settings/assets/{activity-CtBc9cNy.js → activity-DGpLfsQB.js} +1 -1
- package/static/settings/assets/ai-connections-DexTPyfC.js +1 -0
- package/static/settings/assets/{badge--r-FDIhU.js → badge-_hCrrWRP.js} +1 -1
- package/static/settings/assets/{collection-runtime-CnhPmwAM.js → collection-runtime-E40TZ8Cl.js} +1 -1
- package/static/settings/assets/{dialog-B7ZRsjN7.js → dialog-DTr2JkHn.js} +1 -1
- package/static/settings/assets/{download-DgQ1F8QR.js → download-B_D21DDX.js} +1 -1
- package/static/settings/assets/{external-link-Bz7NckNO.js → external-link-BATYaM13.js} +1 -1
- package/static/settings/assets/index-BAlAVi-J.js +4 -0
- package/static/settings/assets/{index-CkGda_Pg.js → index-Ckh4h9jj.js} +1 -1
- package/static/settings/assets/{index-Vv-8Vslg.js → index-DOiwLF4B.js} +1 -1
- package/static/settings/assets/{index-browser-Dq7omlpY.js → index-browser-DFFWN3Kr.js} +1 -1
- package/static/settings/assets/{key-round-CvuhloKV.js → key-round-ZTVU_1O1.js} +1 -1
- package/static/settings/assets/{rotate-ccw-DgFKDaz7.js → rotate-ccw-DDdw8PTU.js} +1 -1
- package/static/settings/assets/{settings-BvqY7K96.js → settings-CyLnISOv.js} +62 -62
- package/static/settings/assets/settings-rk080mvG.css +1 -0
- package/static/settings/assets/{skeleton-D3OeFDF6.js → skeleton-DEzA3hc2.js} +1 -1
- package/static/settings/assets/{waypoints-C4WbspTb.js → waypoints-BSdfNvEb.js} +1 -1
- package/static/settings/assets/{workspace-layout-B9H1Tqrk.js → workspace-layout-BOQnl_3d.js} +1 -1
- package/static/settings/settings.html +2 -2
- package/dist/api/ai-gateway/pod/HostedPodDataAccess.d.ts +0 -31
- package/dist/api/ai-gateway/pod/HostedPodDataAccess.js +0 -330
- package/dist/http/InternalPodDataHttpHandler.d.ts +0 -57
- package/dist/http/InternalPodDataHttpHandler.js +0 -551
- package/dist/http/InternalPodDataHttpHandler.jsonld +0 -243
- package/node_modules/@undefineds.co/ai-connections-core/package.json +0 -61
- package/static/auth-callback/assets/NetworkPage-cEvxRMAl.js +0 -2
- package/static/auth-callback/assets/ai-connections-C6yaE6WQ.js +0 -1
- package/static/auth-callback/assets/auth-callback-Cx9D_1qj.css +0 -1
- package/static/auth-callback/assets/index-Cu0EguPo.js +0 -4
- package/static/dashboard/assets/NetworkPage-Ot4G2dX5.js +0 -2
- package/static/dashboard/assets/ai-connections-CXp5gd1J.js +0 -1
- package/static/dashboard/assets/dashboard-Cx9D_1qj.css +0 -1
- package/static/dashboard/assets/index-Gp3cLolR.js +0 -4
- package/static/settings/assets/NetworkPage-BVkasFGM.js +0 -2
- package/static/settings/assets/ai-connections-C6yaE6WQ.js +0 -1
- package/static/settings/assets/index-BdXwm8nh.js +0 -4
- package/static/settings/assets/settings-Cx9D_1qj.css +0 -1
- /package/node_modules/@undefineds.co/{ai-connections-core/dist → ai-connections/dist/contract}/client/normalize.d.ts +0 -0
- /package/node_modules/@undefineds.co/{ai-connections-core/dist → ai-connections/dist/contract}/client/normalize.js +0 -0
- /package/node_modules/@undefineds.co/{ai-connections-core/dist → ai-connections/dist/contract}/client/request.d.ts +0 -0
- /package/node_modules/@undefineds.co/{ai-connections-core/dist → ai-connections/dist/contract}/client/request.js +0 -0
- /package/node_modules/@undefineds.co/{ai-connections-core/dist → ai-connections/dist/contract}/client/types.d.ts +0 -0
- /package/node_modules/@undefineds.co/{ai-connections-core/dist → ai-connections/dist/contract}/client/types.js +0 -0
- /package/node_modules/@undefineds.co/{ai-connections-core/dist → ai-connections/dist/contract}/client-config/base-adapter.d.ts +0 -0
- /package/node_modules/@undefineds.co/{ai-connections-core/dist → ai-connections/dist/contract}/client-config/base-adapter.js +0 -0
- /package/node_modules/@undefineds.co/{ai-connections-core/dist → ai-connections/dist/contract}/client-config/codex.d.ts +0 -0
- /package/node_modules/@undefineds.co/{ai-connections-core/dist → ai-connections/dist/contract}/client-config/codex.js +0 -0
- /package/node_modules/@undefineds.co/{ai-connections-core/dist → ai-connections/dist/contract}/client-config/index.d.ts +0 -0
- /package/node_modules/@undefineds.co/{ai-connections-core/dist → ai-connections/dist/contract}/client-config/index.js +0 -0
- /package/node_modules/@undefineds.co/{ai-connections-core/dist → ai-connections/dist/contract}/client-config/json-env-adapter.d.ts +0 -0
- /package/node_modules/@undefineds.co/{ai-connections-core/dist → ai-connections/dist/contract}/client-config/json-env-adapter.js +0 -0
- /package/node_modules/@undefineds.co/{ai-connections-core/dist → ai-connections/dist/contract}/client-config/pi.d.ts +0 -0
- /package/node_modules/@undefineds.co/{ai-connections-core/dist → ai-connections/dist/contract}/client-config/pi.js +0 -0
- /package/node_modules/@undefineds.co/{ai-connections-core/dist → ai-connections/dist/contract}/client-config/transaction.d.ts +0 -0
- /package/node_modules/@undefineds.co/{ai-connections-core/dist → ai-connections/dist/contract}/client-config/transaction.js +0 -0
- /package/node_modules/@undefineds.co/{ai-connections-core/dist → ai-connections/dist/contract}/client-config/types.d.ts +0 -0
- /package/node_modules/@undefineds.co/{ai-connections-core/dist → ai-connections/dist/contract}/client-config/types.js +0 -0
- /package/node_modules/@undefineds.co/{ai-connections-core/dist → ai-connections/dist/contract}/credential-storage.d.ts +0 -0
- /package/node_modules/@undefineds.co/{ai-connections-core/dist → ai-connections/dist/contract}/credential-storage.js +0 -0
- /package/node_modules/@undefineds.co/{ai-connections-core/dist → ai-connections/dist/contract}/endpoint-urls.d.ts +0 -0
- /package/node_modules/@undefineds.co/{ai-connections-core/dist → ai-connections/dist/contract}/endpoint-urls.js +0 -0
- /package/node_modules/@undefineds.co/{ai-connections-core/dist → ai-connections/dist/contract}/provider-catalog.d.ts +0 -0
- /package/node_modules/@undefineds.co/{ai-connections-core/dist → ai-connections/dist/contract}/provider-catalog.js +0 -0
|
@@ -33,6 +33,7 @@ exports.isDatabaseSqlite = isDatabaseSqlite;
|
|
|
33
33
|
exports.executeQuery = executeQuery;
|
|
34
34
|
exports.executeStatement = executeStatement;
|
|
35
35
|
exports.executePostgresLockedStatements = executePostgresLockedStatements;
|
|
36
|
+
exports.ensurePodInterfaceKeyTable = ensurePodInterfaceKeyTable;
|
|
36
37
|
exports.ensureCloudClusterTables = ensureCloudClusterTables;
|
|
37
38
|
exports.toDbTimestamp = toDbTimestamp;
|
|
38
39
|
exports.fromDbTimestamp = fromDbTimestamp;
|
|
@@ -260,6 +261,35 @@ async function executePostgresLockedStatements(db, lockKey, statements) {
|
|
|
260
261
|
client.release();
|
|
261
262
|
}
|
|
262
263
|
}
|
|
264
|
+
/**
|
|
265
|
+
* Creates the per-owner interface-key table.
|
|
266
|
+
*
|
|
267
|
+
* The table holds the owner's Pod credential, which the runtime needs *before* it can read
|
|
268
|
+
* anything inside that Pod, so it is created on first use rather than by a Pod-side migration.
|
|
269
|
+
*/
|
|
270
|
+
async function ensurePodInterfaceKeyTable(db) {
|
|
271
|
+
if (isDatabaseSqlite(db)) {
|
|
272
|
+
db.run((0, drizzle_orm_1.sql) `
|
|
273
|
+
CREATE TABLE IF NOT EXISTS identity_pod_interface_key (
|
|
274
|
+
owner_web_id TEXT PRIMARY KEY,
|
|
275
|
+
client_id TEXT NOT NULL,
|
|
276
|
+
sealed_secret TEXT NOT NULL,
|
|
277
|
+
created_at INTEGER NOT NULL DEFAULT (strftime('%s', 'now')),
|
|
278
|
+
updated_at INTEGER NOT NULL DEFAULT (strftime('%s', 'now'))
|
|
279
|
+
)
|
|
280
|
+
`);
|
|
281
|
+
return;
|
|
282
|
+
}
|
|
283
|
+
await db.execute((0, drizzle_orm_1.sql) `
|
|
284
|
+
CREATE TABLE IF NOT EXISTS identity_pod_interface_key (
|
|
285
|
+
owner_web_id TEXT PRIMARY KEY,
|
|
286
|
+
client_id TEXT NOT NULL,
|
|
287
|
+
sealed_secret TEXT NOT NULL,
|
|
288
|
+
created_at TIMESTAMPTZ NOT NULL DEFAULT NOW(),
|
|
289
|
+
updated_at TIMESTAMPTZ NOT NULL DEFAULT NOW()
|
|
290
|
+
)
|
|
291
|
+
`);
|
|
292
|
+
}
|
|
263
293
|
async function ensureCloudClusterTables(db) {
|
|
264
294
|
await ensureDatabaseReady(db);
|
|
265
295
|
if (db && typeof db === 'object') {
|
|
@@ -10,3 +10,12 @@ export declare const edgeNodes: any;
|
|
|
10
10
|
* 用于服务间认证 (Business, Local SP, Cloud, Compute)
|
|
11
11
|
*/
|
|
12
12
|
export declare const serviceTokens: any;
|
|
13
|
+
/**
|
|
14
|
+
* Per-owner interface access key.
|
|
15
|
+
*
|
|
16
|
+
* A server-side component acts for a user through that user's own Pod credentials, so the
|
|
17
|
+
* client id/secret pair - the same kind of key a browser uses on the standard interface - is
|
|
18
|
+
* remembered here, sealed by the credential vault. It cannot live in the Pod: it is what
|
|
19
|
+
* grants access to the Pod.
|
|
20
|
+
*/
|
|
21
|
+
export declare const podInterfaceKeys: any;
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.serviceTokens = exports.edgeNodes = exports.ddnsRecords = exports.usage = void 0;
|
|
3
|
+
exports.podInterfaceKeys = exports.serviceTokens = exports.edgeNodes = exports.ddnsRecords = exports.usage = void 0;
|
|
4
4
|
const pg_core_1 = require("drizzle-orm/pg-core");
|
|
5
5
|
const bigint_1 = require("drizzle-orm/pg-core/columns/bigint");
|
|
6
6
|
const integer_1 = require("drizzle-orm/pg-core/columns/integer");
|
|
@@ -79,4 +79,19 @@ exports.serviceTokens = (0, pg_core_1.pgTable)('cluster_service_token', {
|
|
|
79
79
|
createdAt: (0, pg_core_1.timestamp)('created_at', { withTimezone: true, mode: 'date' }).notNull().defaultNow(),
|
|
80
80
|
expiresAt: (0, pg_core_1.timestamp)('expires_at', { withTimezone: true, mode: 'date' }),
|
|
81
81
|
});
|
|
82
|
+
/**
|
|
83
|
+
* Per-owner interface access key.
|
|
84
|
+
*
|
|
85
|
+
* A server-side component acts for a user through that user's own Pod credentials, so the
|
|
86
|
+
* client id/secret pair - the same kind of key a browser uses on the standard interface - is
|
|
87
|
+
* remembered here, sealed by the credential vault. It cannot live in the Pod: it is what
|
|
88
|
+
* grants access to the Pod.
|
|
89
|
+
*/
|
|
90
|
+
exports.podInterfaceKeys = (0, pg_core_1.pgTable)('identity_pod_interface_key', {
|
|
91
|
+
ownerWebId: (0, pg_core_1.text)('owner_web_id').primaryKey(),
|
|
92
|
+
clientId: (0, pg_core_1.text)('client_id').notNull(),
|
|
93
|
+
sealedSecret: (0, pg_core_1.text)('sealed_secret').notNull(),
|
|
94
|
+
createdAt: (0, pg_core_1.timestamp)('created_at').notNull().defaultNow(),
|
|
95
|
+
updatedAt: (0, pg_core_1.timestamp)('updated_at').notNull().defaultNow(),
|
|
96
|
+
});
|
|
82
97
|
//# sourceMappingURL=schema.pg.js.map
|
|
@@ -1073,3 +1073,109 @@ export declare const serviceTokens: import("drizzle-orm/sqlite-core").SQLiteTabl
|
|
|
1073
1073
|
};
|
|
1074
1074
|
dialect: "sqlite";
|
|
1075
1075
|
}>;
|
|
1076
|
+
/**
|
|
1077
|
+
* Per-owner interface access key.
|
|
1078
|
+
*
|
|
1079
|
+
* A server-side component acts for a user through that user's own Pod credentials, so the
|
|
1080
|
+
* client id/secret pair - the same kind of key a browser uses on the standard interface - is
|
|
1081
|
+
* remembered here, sealed by the credential vault. It cannot live in the Pod: it is what
|
|
1082
|
+
* grants access to the Pod.
|
|
1083
|
+
*/
|
|
1084
|
+
export declare const podInterfaceKeys: import("drizzle-orm/sqlite-core").SQLiteTableWithColumns<{
|
|
1085
|
+
name: "identity_pod_interface_key";
|
|
1086
|
+
schema: undefined;
|
|
1087
|
+
columns: {
|
|
1088
|
+
ownerWebId: import("drizzle-orm/sqlite-core").SQLiteColumn<{
|
|
1089
|
+
name: "owner_web_id";
|
|
1090
|
+
tableName: "identity_pod_interface_key";
|
|
1091
|
+
dataType: "string";
|
|
1092
|
+
columnType: "SQLiteText";
|
|
1093
|
+
data: string;
|
|
1094
|
+
driverParam: string;
|
|
1095
|
+
notNull: true;
|
|
1096
|
+
hasDefault: false;
|
|
1097
|
+
isPrimaryKey: true;
|
|
1098
|
+
isAutoincrement: false;
|
|
1099
|
+
hasRuntimeDefault: false;
|
|
1100
|
+
enumValues: [string, ...string[]];
|
|
1101
|
+
baseColumn: never;
|
|
1102
|
+
identity: undefined;
|
|
1103
|
+
generated: undefined;
|
|
1104
|
+
}, {}, {
|
|
1105
|
+
length: number | undefined;
|
|
1106
|
+
}>;
|
|
1107
|
+
clientId: import("drizzle-orm/sqlite-core").SQLiteColumn<{
|
|
1108
|
+
name: "client_id";
|
|
1109
|
+
tableName: "identity_pod_interface_key";
|
|
1110
|
+
dataType: "string";
|
|
1111
|
+
columnType: "SQLiteText";
|
|
1112
|
+
data: string;
|
|
1113
|
+
driverParam: string;
|
|
1114
|
+
notNull: true;
|
|
1115
|
+
hasDefault: false;
|
|
1116
|
+
isPrimaryKey: false;
|
|
1117
|
+
isAutoincrement: false;
|
|
1118
|
+
hasRuntimeDefault: false;
|
|
1119
|
+
enumValues: [string, ...string[]];
|
|
1120
|
+
baseColumn: never;
|
|
1121
|
+
identity: undefined;
|
|
1122
|
+
generated: undefined;
|
|
1123
|
+
}, {}, {
|
|
1124
|
+
length: number | undefined;
|
|
1125
|
+
}>;
|
|
1126
|
+
sealedSecret: import("drizzle-orm/sqlite-core").SQLiteColumn<{
|
|
1127
|
+
name: "sealed_secret";
|
|
1128
|
+
tableName: "identity_pod_interface_key";
|
|
1129
|
+
dataType: "string";
|
|
1130
|
+
columnType: "SQLiteText";
|
|
1131
|
+
data: string;
|
|
1132
|
+
driverParam: string;
|
|
1133
|
+
notNull: true;
|
|
1134
|
+
hasDefault: false;
|
|
1135
|
+
isPrimaryKey: false;
|
|
1136
|
+
isAutoincrement: false;
|
|
1137
|
+
hasRuntimeDefault: false;
|
|
1138
|
+
enumValues: [string, ...string[]];
|
|
1139
|
+
baseColumn: never;
|
|
1140
|
+
identity: undefined;
|
|
1141
|
+
generated: undefined;
|
|
1142
|
+
}, {}, {
|
|
1143
|
+
length: number | undefined;
|
|
1144
|
+
}>;
|
|
1145
|
+
createdAt: import("drizzle-orm/sqlite-core").SQLiteColumn<{
|
|
1146
|
+
name: "created_at";
|
|
1147
|
+
tableName: "identity_pod_interface_key";
|
|
1148
|
+
dataType: "number";
|
|
1149
|
+
columnType: "SQLiteInteger";
|
|
1150
|
+
data: number;
|
|
1151
|
+
driverParam: number;
|
|
1152
|
+
notNull: true;
|
|
1153
|
+
hasDefault: true;
|
|
1154
|
+
isPrimaryKey: false;
|
|
1155
|
+
isAutoincrement: false;
|
|
1156
|
+
hasRuntimeDefault: true;
|
|
1157
|
+
enumValues: undefined;
|
|
1158
|
+
baseColumn: never;
|
|
1159
|
+
identity: undefined;
|
|
1160
|
+
generated: undefined;
|
|
1161
|
+
}, {}, {}>;
|
|
1162
|
+
updatedAt: import("drizzle-orm/sqlite-core").SQLiteColumn<{
|
|
1163
|
+
name: "updated_at";
|
|
1164
|
+
tableName: "identity_pod_interface_key";
|
|
1165
|
+
dataType: "number";
|
|
1166
|
+
columnType: "SQLiteInteger";
|
|
1167
|
+
data: number;
|
|
1168
|
+
driverParam: number;
|
|
1169
|
+
notNull: true;
|
|
1170
|
+
hasDefault: true;
|
|
1171
|
+
isPrimaryKey: false;
|
|
1172
|
+
isAutoincrement: false;
|
|
1173
|
+
hasRuntimeDefault: true;
|
|
1174
|
+
enumValues: undefined;
|
|
1175
|
+
baseColumn: never;
|
|
1176
|
+
identity: undefined;
|
|
1177
|
+
generated: undefined;
|
|
1178
|
+
}, {}, {}>;
|
|
1179
|
+
};
|
|
1180
|
+
dialect: "sqlite";
|
|
1181
|
+
}>;
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.serviceTokens = exports.edgeNodes = exports.ddnsRecords = exports.usage = void 0;
|
|
3
|
+
exports.podInterfaceKeys = exports.serviceTokens = exports.edgeNodes = exports.ddnsRecords = exports.usage = void 0;
|
|
4
4
|
const sqlite_core_1 = require("drizzle-orm/sqlite-core");
|
|
5
5
|
exports.usage = (0, sqlite_core_1.sqliteTable)('identity_usage', {
|
|
6
6
|
scopeType: (0, sqlite_core_1.text)('scope_type').notNull(), // 'account' | 'pod'
|
|
@@ -79,4 +79,19 @@ exports.serviceTokens = (0, sqlite_core_1.sqliteTable)('cluster_service_token',
|
|
|
79
79
|
createdAt: (0, sqlite_core_1.integer)('created_at').notNull().$defaultFn(() => Math.floor(Date.now() / 1000)),
|
|
80
80
|
expiresAt: (0, sqlite_core_1.integer)('expires_at'),
|
|
81
81
|
});
|
|
82
|
+
/**
|
|
83
|
+
* Per-owner interface access key.
|
|
84
|
+
*
|
|
85
|
+
* A server-side component acts for a user through that user's own Pod credentials, so the
|
|
86
|
+
* client id/secret pair - the same kind of key a browser uses on the standard interface - is
|
|
87
|
+
* remembered here, sealed by the credential vault. It cannot live in the Pod: it is what
|
|
88
|
+
* grants access to the Pod.
|
|
89
|
+
*/
|
|
90
|
+
exports.podInterfaceKeys = (0, sqlite_core_1.sqliteTable)('identity_pod_interface_key', {
|
|
91
|
+
ownerWebId: (0, sqlite_core_1.text)('owner_web_id').primaryKey(),
|
|
92
|
+
clientId: (0, sqlite_core_1.text)('client_id').notNull(),
|
|
93
|
+
sealedSecret: (0, sqlite_core_1.text)('sealed_secret').notNull(),
|
|
94
|
+
createdAt: (0, sqlite_core_1.integer)('created_at').notNull().$defaultFn(() => Math.floor(Date.now() / 1000)),
|
|
95
|
+
updatedAt: (0, sqlite_core_1.integer)('updated_at').notNull().$defaultFn(() => Math.floor(Date.now() / 1000)),
|
|
96
|
+
});
|
|
82
97
|
//# sourceMappingURL=schema.sqlite.js.map
|
package/dist/index.d.ts
CHANGED
|
@@ -15,7 +15,6 @@ export type { PostgresRdfTextIndexOptions } from './storage/rdf/PostgresRdfTextI
|
|
|
15
15
|
export type { PostgresRdfVectorIndexOptions } from './storage/rdf/PostgresRdfVectorIndex';
|
|
16
16
|
export * from './document';
|
|
17
17
|
import { SubgraphSparqlHttpHandler } from './http/SubgraphSparqlHttpHandler';
|
|
18
|
-
import { InternalPodDataHttpHandler } from './http/InternalPodDataHttpHandler';
|
|
19
18
|
import { QuotaAdminHttpHandler } from './http/quota/QuotaAdminHttpHandler';
|
|
20
19
|
import { SparqlUpdateResourceStore } from './storage/SparqlUpdateResourceStore';
|
|
21
20
|
import { ClusterIngressRouter } from './http/ClusterIngressRouter';
|
|
@@ -51,6 +50,8 @@ import { SimpleEdgeNodeTunnelManager, NoopEdgeNodeTunnelManager } from './edge/E
|
|
|
51
50
|
import { FrpTunnelManager } from './edge/FrpTunnelManager';
|
|
52
51
|
import { AcmeCertificateManager } from './edge/acme/AcmeCertificateManager';
|
|
53
52
|
import { EdgeNodeHealthProbeService } from './edge/EdgeNodeHealthProbeService';
|
|
53
|
+
import { assertPublicProbeTarget, createPinnedHeadProbeRequest, isPublicIpAddress } from './edge/ProbeTargetGuard';
|
|
54
|
+
import { createPodOwnershipNodeAccessResolver } from './edge/reachability/NodeAccessResolver';
|
|
54
55
|
import { EdgeNodeAgent } from './edge/EdgeNodeAgent';
|
|
55
56
|
import { EdgeNodeAgentInitializer } from './edge/EdgeNodeAgentInitializer';
|
|
56
57
|
import { EdgeNodeCertificateService } from './service/EdgeNodeCertificateService';
|
|
@@ -125,6 +126,6 @@ export type { OwnedWebIdEntry, PodOwnershipResolver, PodOwnershipTarget, CssPodO
|
|
|
125
126
|
export type { TunnelProvider, TunnelConfig, TunnelSetupOptions, TunnelStatus, } from './tunnel/TunnelProvider';
|
|
126
127
|
export type { SubdomainRegistration, ConnectivityResult, SubdomainServiceOptions, } from './subdomain/SubdomainService';
|
|
127
128
|
export { AppStaticAssetHandler } from './http/AppStaticAssetHandler';
|
|
128
|
-
export { RepresentationPartialConvertingStore, MinioDataAccessor, SolidRdfDataAccessor, MixDataAccessor, ConfigurableLoggerFactory, resolveLogFilePattern, resolveCurrentLogFile, LOG_FILE_PATTERN, SparqlUpdateResourceStore, SubgraphQueryEngine, SubgraphSparqlHttpHandler,
|
|
129
|
+
export { RepresentationPartialConvertingStore, MinioDataAccessor, SolidRdfDataAccessor, MixDataAccessor, ConfigurableLoggerFactory, resolveLogFilePattern, resolveCurrentLogFile, LOG_FILE_PATTERN, SparqlUpdateResourceStore, SubgraphQueryEngine, SubgraphSparqlHttpHandler, QuotaAdminHttpHandler, ClusterIngressRouter, ClusterWebSocketConfigurator, EdgeNodeDirectDebugHttpHandler, EdgeNodeProxyHttpHandler, RouterHttpHandler, RouterHttpRoute, TracingHandler, EdgeNodeCertificateHttpHandler, TerminalHttpHandler, DeviceNotificationHub, DeviceNotificationResourceListener, DeviceNotificationWebSocketServer, DeviceNotificationTicketHandler, registerDeviceNotificationRuntime, ReservedSuffixIdentifierGenerator, DrizzleIndexedStorage, LoginMethodGuardStorage, ValidatingIdentityProviderHttpHandler, PostgresKeyValueStorage, RedisKeyValueStorage, SqliteKeyValueStorage, BaseKeyValueStorage, DrizzleQuotaService, NoopQuotaService, HttpEntitlementProvider, NoopEntitlementProvider, PerAccountQuotaStrategy, TencentDnsProvider, EdgeNodeDnsCoordinator, Dns01CertificateProvisioner, SimpleEdgeNodeTunnelManager, NoopEdgeNodeTunnelManager, FrpTunnelManager, EdgeNodeHealthProbeService, assertPublicProbeTarget, createPinnedHeadProbeRequest, isPublicIpAddress, createPodOwnershipNodeAccessResolver, EdgeNodeAgent, EdgeNodeAgentInitializer, EdgeNodeCertificateService, AcmeCertificateManager, EdgeNodeModeDetector, ClusterIdentifierStrategy, UsageTrackingStore, CenterNodeRegistrationService, PodRoutingHttpHandler, ReactAppViewHandler, QuintStore, SqliteQuintStore, PgQuintStore, RdfTermDictionary, RdfQuadIndex, Rdf3xIndex, RdfTextIndex, RdfVectorIndex, PostgresRdfTextIndex, PostgresRdfVectorIndex, SolidRdfEngine, LocalQleverNativeSparqlClient, QleverSparqlEngine, RdfQuerySparqlEngine, PostgresRdfEngine, VectorStore, SqliteVectorStore, PostgresVectorStore, VectorHttpHandler, ProviderRegistry, ProviderRegistryImpl, EmbeddingService, EmbeddingServiceImpl, CredentialReader, CredentialReaderImpl, CloudflareTunnelProvider, LocalTunnelProvider, NgrokTunnelProvider, SubdomainService, MultiDomainIdentifierStrategy, SubdomainPodIdentifierStrategy, DisabledOidcHandler, DisabledIdentityProviderHandler, AutoDetectOidcHandler, AutoDetectIdentityProviderHandler, LoopbackClientIdAdapterFactory, RememberedClientGrantStore, RememberedConsentHandler, RememberedClientPromptFactory, SessionBoundIdentityProviderFactory, ScopedPickWebIdHandler, ConfiguredLoopbackDPoPWebIdExtractor, AccountStorageBindingsHandler, CssPodOwnershipResolver, UrlAwareRedisLocker, ProvisionPodCreator, ProvisionPodStore, ProvisionCodeCodec, LocalPodProvisioningService, SqliteSolidFsSyncJournal, RootedSolidFsSyncJournal, LocalRdfAuthorityRecoveryInitializer, ObservableResourceStore, RdfSearchReconciliationIntentSink, };
|
|
129
130
|
export type { ResourceChangeEvent, ResourceChangeListener, ResourceChangeRecorder, } from './storage/ObservableResourceStore';
|
|
130
131
|
export { RdfHandlebarsTemplateEngine } from './util/templates/RdfHandlebarsTemplateEngine';
|
package/dist/index.js
CHANGED
|
@@ -14,9 +14,9 @@ var __exportStar = (this && this.__exportStar) || function(m, exports) {
|
|
|
14
14
|
for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
|
|
15
15
|
};
|
|
16
16
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
17
|
-
exports.
|
|
18
|
-
exports.
|
|
19
|
-
exports.RdfHandlebarsTemplateEngine = exports.RdfSearchReconciliationIntentSink = exports.ObservableResourceStore = exports.LocalRdfAuthorityRecoveryInitializer = exports.RootedSolidFsSyncJournal = exports.SqliteSolidFsSyncJournal = exports.LocalPodProvisioningService = exports.ProvisionCodeCodec = exports.ProvisionPodStore = exports.ProvisionPodCreator = exports.UrlAwareRedisLocker = exports.CssPodOwnershipResolver = exports.AccountStorageBindingsHandler = void 0;
|
|
17
|
+
exports.isPublicIpAddress = exports.createPinnedHeadProbeRequest = exports.assertPublicProbeTarget = exports.EdgeNodeHealthProbeService = exports.FrpTunnelManager = exports.NoopEdgeNodeTunnelManager = exports.SimpleEdgeNodeTunnelManager = exports.Dns01CertificateProvisioner = exports.EdgeNodeDnsCoordinator = exports.TencentDnsProvider = exports.PerAccountQuotaStrategy = exports.NoopEntitlementProvider = exports.HttpEntitlementProvider = exports.NoopQuotaService = exports.DrizzleQuotaService = exports.BaseKeyValueStorage = exports.SqliteKeyValueStorage = exports.RedisKeyValueStorage = exports.PostgresKeyValueStorage = exports.ValidatingIdentityProviderHttpHandler = exports.LoginMethodGuardStorage = exports.DrizzleIndexedStorage = exports.ReservedSuffixIdentifierGenerator = exports.registerDeviceNotificationRuntime = exports.DeviceNotificationTicketHandler = exports.DeviceNotificationWebSocketServer = exports.DeviceNotificationResourceListener = exports.DeviceNotificationHub = exports.TerminalHttpHandler = exports.EdgeNodeCertificateHttpHandler = exports.TracingHandler = exports.RouterHttpRoute = exports.RouterHttpHandler = exports.EdgeNodeProxyHttpHandler = exports.EdgeNodeDirectDebugHttpHandler = exports.ClusterWebSocketConfigurator = exports.ClusterIngressRouter = exports.QuotaAdminHttpHandler = exports.SubgraphSparqlHttpHandler = exports.SubgraphQueryEngine = exports.SparqlUpdateResourceStore = exports.LOG_FILE_PATTERN = exports.resolveCurrentLogFile = exports.resolveLogFilePattern = exports.ConfigurableLoggerFactory = exports.MixDataAccessor = exports.SolidRdfDataAccessor = exports.MinioDataAccessor = exports.RepresentationPartialConvertingStore = exports.AppStaticAssetHandler = void 0;
|
|
18
|
+
exports.RememberedClientPromptFactory = exports.RememberedConsentHandler = exports.RememberedClientGrantStore = exports.LoopbackClientIdAdapterFactory = exports.AutoDetectIdentityProviderHandler = exports.AutoDetectOidcHandler = exports.DisabledIdentityProviderHandler = exports.DisabledOidcHandler = exports.SubdomainPodIdentifierStrategy = exports.MultiDomainIdentifierStrategy = exports.SubdomainService = exports.NgrokTunnelProvider = exports.LocalTunnelProvider = exports.CloudflareTunnelProvider = exports.CredentialReaderImpl = exports.CredentialReader = exports.EmbeddingServiceImpl = exports.EmbeddingService = exports.ProviderRegistryImpl = exports.ProviderRegistry = exports.VectorHttpHandler = exports.PostgresVectorStore = exports.SqliteVectorStore = exports.VectorStore = exports.PostgresRdfEngine = exports.RdfQuerySparqlEngine = exports.QleverSparqlEngine = exports.LocalQleverNativeSparqlClient = exports.SolidRdfEngine = exports.PostgresRdfVectorIndex = exports.PostgresRdfTextIndex = exports.RdfVectorIndex = exports.RdfTextIndex = exports.Rdf3xIndex = exports.RdfQuadIndex = exports.RdfTermDictionary = exports.PgQuintStore = exports.SqliteQuintStore = exports.QuintStore = exports.ReactAppViewHandler = exports.PodRoutingHttpHandler = exports.CenterNodeRegistrationService = exports.UsageTrackingStore = exports.ClusterIdentifierStrategy = exports.EdgeNodeModeDetector = exports.AcmeCertificateManager = exports.EdgeNodeCertificateService = exports.EdgeNodeAgentInitializer = exports.EdgeNodeAgent = exports.createPodOwnershipNodeAccessResolver = void 0;
|
|
19
|
+
exports.RdfHandlebarsTemplateEngine = exports.RdfSearchReconciliationIntentSink = exports.ObservableResourceStore = exports.LocalRdfAuthorityRecoveryInitializer = exports.RootedSolidFsSyncJournal = exports.SqliteSolidFsSyncJournal = exports.LocalPodProvisioningService = exports.ProvisionCodeCodec = exports.ProvisionPodStore = exports.ProvisionPodCreator = exports.UrlAwareRedisLocker = exports.CssPodOwnershipResolver = exports.AccountStorageBindingsHandler = exports.ConfiguredLoopbackDPoPWebIdExtractor = exports.ScopedPickWebIdHandler = exports.SessionBoundIdentityProviderFactory = void 0;
|
|
20
20
|
require("./runtime/configure-drizzle-solid");
|
|
21
21
|
const RepresentationPartialConvertingStore_1 = require("./storage/RepresentationPartialConvertingStore");
|
|
22
22
|
Object.defineProperty(exports, "RepresentationPartialConvertingStore", { enumerable: true, get: function () { return RepresentationPartialConvertingStore_1.RepresentationPartialConvertingStore; } });
|
|
@@ -37,8 +37,6 @@ Object.defineProperty(exports, "SubgraphQueryEngine", { enumerable: true, get: f
|
|
|
37
37
|
__exportStar(require("./document"), exports);
|
|
38
38
|
const SubgraphSparqlHttpHandler_1 = require("./http/SubgraphSparqlHttpHandler");
|
|
39
39
|
Object.defineProperty(exports, "SubgraphSparqlHttpHandler", { enumerable: true, get: function () { return SubgraphSparqlHttpHandler_1.SubgraphSparqlHttpHandler; } });
|
|
40
|
-
const InternalPodDataHttpHandler_1 = require("./http/InternalPodDataHttpHandler");
|
|
41
|
-
Object.defineProperty(exports, "InternalPodDataHttpHandler", { enumerable: true, get: function () { return InternalPodDataHttpHandler_1.InternalPodDataHttpHandler; } });
|
|
42
40
|
const QuotaAdminHttpHandler_1 = require("./http/quota/QuotaAdminHttpHandler");
|
|
43
41
|
Object.defineProperty(exports, "QuotaAdminHttpHandler", { enumerable: true, get: function () { return QuotaAdminHttpHandler_1.QuotaAdminHttpHandler; } });
|
|
44
42
|
const SparqlUpdateResourceStore_1 = require("./storage/SparqlUpdateResourceStore");
|
|
@@ -111,6 +109,12 @@ const AcmeCertificateManager_1 = require("./edge/acme/AcmeCertificateManager");
|
|
|
111
109
|
Object.defineProperty(exports, "AcmeCertificateManager", { enumerable: true, get: function () { return AcmeCertificateManager_1.AcmeCertificateManager; } });
|
|
112
110
|
const EdgeNodeHealthProbeService_1 = require("./edge/EdgeNodeHealthProbeService");
|
|
113
111
|
Object.defineProperty(exports, "EdgeNodeHealthProbeService", { enumerable: true, get: function () { return EdgeNodeHealthProbeService_1.EdgeNodeHealthProbeService; } });
|
|
112
|
+
const ProbeTargetGuard_1 = require("./edge/ProbeTargetGuard");
|
|
113
|
+
Object.defineProperty(exports, "assertPublicProbeTarget", { enumerable: true, get: function () { return ProbeTargetGuard_1.assertPublicProbeTarget; } });
|
|
114
|
+
Object.defineProperty(exports, "createPinnedHeadProbeRequest", { enumerable: true, get: function () { return ProbeTargetGuard_1.createPinnedHeadProbeRequest; } });
|
|
115
|
+
Object.defineProperty(exports, "isPublicIpAddress", { enumerable: true, get: function () { return ProbeTargetGuard_1.isPublicIpAddress; } });
|
|
116
|
+
const NodeAccessResolver_1 = require("./edge/reachability/NodeAccessResolver");
|
|
117
|
+
Object.defineProperty(exports, "createPodOwnershipNodeAccessResolver", { enumerable: true, get: function () { return NodeAccessResolver_1.createPodOwnershipNodeAccessResolver; } });
|
|
114
118
|
const EdgeNodeAgent_1 = require("./edge/EdgeNodeAgent");
|
|
115
119
|
Object.defineProperty(exports, "EdgeNodeAgent", { enumerable: true, get: function () { return EdgeNodeAgent_1.EdgeNodeAgent; } });
|
|
116
120
|
const EdgeNodeAgentInitializer_1 = require("./edge/EdgeNodeAgentInitializer");
|
package/dist/main.js
CHANGED
|
@@ -213,6 +213,11 @@ async function startRuntime(options) {
|
|
|
213
213
|
(0, runtime_1.validateBaseUrl)({ baseUrl, mainPort, explicit: explicitBaseUrl !== undefined });
|
|
214
214
|
const cssPort = await (0, runtime_1.getFreePortForWildcard)(mainPort + 1);
|
|
215
215
|
const apiPort = await (0, runtime_1.getFreePortForWildcard)(cssPort + 1);
|
|
216
|
+
// Remote forwarding (managed tunnels, P2P data plane) terminates on this machine, so
|
|
217
|
+
// its origin is a dedicated ingress port instead of the gateway port: the Gateway
|
|
218
|
+
// never treats requests accepted there as local. It is an internal loopback detail, so
|
|
219
|
+
// the OS assigns the port instead of us claiming a neighbour of the planned ports.
|
|
220
|
+
const ingressPort = await (0, runtime_1.getEphemeralLoopbackPort)();
|
|
216
221
|
const runtimeRoot = path_1.default.join(process.cwd(), '.xpod/runtime/legacy-css');
|
|
217
222
|
const rdfIndexPath = process.env.CSS_RDF_INDEX_PATH || (0, database_url_1.resolveDefaultRdfIndexPath)({
|
|
218
223
|
sparqlEndpoint: process.env.CSS_SPARQL_ENDPOINT ?? process.env.SPARQL_ENDPOINT,
|
|
@@ -268,6 +273,7 @@ async function startRuntime(options) {
|
|
|
268
273
|
apiPort,
|
|
269
274
|
mainPort,
|
|
270
275
|
cssPort,
|
|
276
|
+
ingressPort,
|
|
271
277
|
baseUrl,
|
|
272
278
|
rdfIndexPath,
|
|
273
279
|
authMode,
|
|
@@ -296,6 +302,7 @@ async function startRuntime(options) {
|
|
|
296
302
|
exitOnStop: true,
|
|
297
303
|
baseUrl,
|
|
298
304
|
internalAdminAuthSecret: gatewayAdminProxyAuthSecret,
|
|
305
|
+
ingressPort,
|
|
299
306
|
});
|
|
300
307
|
proxy.setTargets({
|
|
301
308
|
css: `http://localhost:${cssPort}`,
|
|
@@ -2,9 +2,8 @@ import type { IncomingHttpHeaders, OutgoingHttpHeaders } from 'node:http';
|
|
|
2
2
|
export declare const GATEWAY_ADMIN_PROXY_LOOPBACK_HEADER = "x-xpod-admin-proxy-loopback";
|
|
3
3
|
export declare const GATEWAY_ADMIN_PROXY_TIMESTAMP_HEADER = "x-xpod-admin-proxy-timestamp";
|
|
4
4
|
export declare const GATEWAY_ADMIN_PROXY_SIGNATURE_HEADER = "x-xpod-admin-proxy-signature";
|
|
5
|
-
export declare const GATEWAY_ADMIN_PROXY_INTENT_HEADER = "x-xpod-admin-proxy-intent";
|
|
6
5
|
export declare const GATEWAY_ADMIN_PROXY_NONCE_HEADER = "x-xpod-admin-proxy-nonce";
|
|
7
|
-
export declare const GATEWAY_ADMIN_PROXY_HEADERS: readonly ["x-xpod-admin-proxy-loopback", "x-xpod-admin-proxy-timestamp", "x-xpod-admin-proxy-signature", "x-xpod-admin-proxy-
|
|
6
|
+
export declare const GATEWAY_ADMIN_PROXY_HEADERS: readonly ["x-xpod-admin-proxy-loopback", "x-xpod-admin-proxy-timestamp", "x-xpod-admin-proxy-signature", "x-xpod-admin-proxy-nonce"];
|
|
8
7
|
export declare function createGatewayAdminProxyAuthSecret(): string;
|
|
9
8
|
export interface GatewayAdminProxyMarkerInput {
|
|
10
9
|
secret: string;
|
|
@@ -13,27 +12,14 @@ export interface GatewayAdminProxyMarkerInput {
|
|
|
13
12
|
originalClientLoopback: boolean;
|
|
14
13
|
issuedAt?: number;
|
|
15
14
|
nonce?: string;
|
|
16
|
-
intent?: GatewayAdminProxyIntent;
|
|
17
15
|
}
|
|
18
16
|
export interface GatewayAdminProxyMarkerVerification {
|
|
19
17
|
present: boolean;
|
|
20
18
|
valid: boolean;
|
|
21
19
|
originalClientLoopback: boolean;
|
|
22
20
|
nonce?: string;
|
|
23
|
-
intent?: GatewayAdminProxyIntent;
|
|
24
21
|
reason?: string;
|
|
25
22
|
}
|
|
26
|
-
export interface GatewayAdminProxyIntent {
|
|
27
|
-
ownerWebId: string;
|
|
28
|
-
/** Physical Pod root when it differs from the identity provider WebID root. */
|
|
29
|
-
podBaseUrl?: string;
|
|
30
|
-
method: 'GET' | 'HEAD' | 'POST' | 'PUT' | 'PATCH' | 'DELETE';
|
|
31
|
-
resourceUrl: string;
|
|
32
|
-
principalKind: 'solid-user' | 'gateway-key-verifier';
|
|
33
|
-
scopes: string[];
|
|
34
|
-
/** SHA-256 hex digest of a POST body. Required for POST intents. */
|
|
35
|
-
bodyDigest?: string;
|
|
36
|
-
}
|
|
37
23
|
export declare function createGatewayAdminProxyHeaders(input: GatewayAdminProxyMarkerInput): OutgoingHttpHeaders;
|
|
38
24
|
export declare function stripGatewayAdminProxyHeaders(headers: IncomingHttpHeaders): void;
|
|
39
25
|
export declare function isLoopbackRemoteAddress(remoteAddress: string | undefined): boolean;
|
|
@@ -44,4 +30,3 @@ export declare function verifyGatewayAdminProxyHeaders(input: {
|
|
|
44
30
|
url: string | undefined;
|
|
45
31
|
now?: number;
|
|
46
32
|
}): GatewayAdminProxyMarkerVerification;
|
|
47
|
-
export declare function canonicalGatewayAdminProxyIntent(intent: GatewayAdminProxyIntent): string;
|
|
@@ -1,24 +1,21 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.GATEWAY_ADMIN_PROXY_HEADERS = exports.GATEWAY_ADMIN_PROXY_NONCE_HEADER = exports.
|
|
3
|
+
exports.GATEWAY_ADMIN_PROXY_HEADERS = exports.GATEWAY_ADMIN_PROXY_NONCE_HEADER = exports.GATEWAY_ADMIN_PROXY_SIGNATURE_HEADER = exports.GATEWAY_ADMIN_PROXY_TIMESTAMP_HEADER = exports.GATEWAY_ADMIN_PROXY_LOOPBACK_HEADER = void 0;
|
|
4
4
|
exports.createGatewayAdminProxyAuthSecret = createGatewayAdminProxyAuthSecret;
|
|
5
5
|
exports.createGatewayAdminProxyHeaders = createGatewayAdminProxyHeaders;
|
|
6
6
|
exports.stripGatewayAdminProxyHeaders = stripGatewayAdminProxyHeaders;
|
|
7
7
|
exports.isLoopbackRemoteAddress = isLoopbackRemoteAddress;
|
|
8
8
|
exports.verifyGatewayAdminProxyHeaders = verifyGatewayAdminProxyHeaders;
|
|
9
|
-
exports.canonicalGatewayAdminProxyIntent = canonicalGatewayAdminProxyIntent;
|
|
10
9
|
const node_crypto_1 = require("node:crypto");
|
|
11
10
|
const node_net_1 = require("node:net");
|
|
12
11
|
exports.GATEWAY_ADMIN_PROXY_LOOPBACK_HEADER = 'x-xpod-admin-proxy-loopback';
|
|
13
12
|
exports.GATEWAY_ADMIN_PROXY_TIMESTAMP_HEADER = 'x-xpod-admin-proxy-timestamp';
|
|
14
13
|
exports.GATEWAY_ADMIN_PROXY_SIGNATURE_HEADER = 'x-xpod-admin-proxy-signature';
|
|
15
|
-
exports.GATEWAY_ADMIN_PROXY_INTENT_HEADER = 'x-xpod-admin-proxy-intent';
|
|
16
14
|
exports.GATEWAY_ADMIN_PROXY_NONCE_HEADER = 'x-xpod-admin-proxy-nonce';
|
|
17
15
|
exports.GATEWAY_ADMIN_PROXY_HEADERS = [
|
|
18
16
|
exports.GATEWAY_ADMIN_PROXY_LOOPBACK_HEADER,
|
|
19
17
|
exports.GATEWAY_ADMIN_PROXY_TIMESTAMP_HEADER,
|
|
20
18
|
exports.GATEWAY_ADMIN_PROXY_SIGNATURE_HEADER,
|
|
21
|
-
exports.GATEWAY_ADMIN_PROXY_INTENT_HEADER,
|
|
22
19
|
exports.GATEWAY_ADMIN_PROXY_NONCE_HEADER,
|
|
23
20
|
];
|
|
24
21
|
const MAX_CLOCK_SKEW_MS = 60_000;
|
|
@@ -28,12 +25,10 @@ function createGatewayAdminProxyAuthSecret() {
|
|
|
28
25
|
function createGatewayAdminProxyHeaders(input) {
|
|
29
26
|
const issuedAt = input.issuedAt ?? Date.now();
|
|
30
27
|
const loopback = input.originalClientLoopback ? '1' : '0';
|
|
31
|
-
const intent = input.intent ? canonicalGatewayAdminProxyIntent(input.intent) : undefined;
|
|
32
28
|
return {
|
|
33
29
|
[exports.GATEWAY_ADMIN_PROXY_LOOPBACK_HEADER]: loopback,
|
|
34
30
|
[exports.GATEWAY_ADMIN_PROXY_TIMESTAMP_HEADER]: String(issuedAt),
|
|
35
31
|
...(input.nonce ? { [exports.GATEWAY_ADMIN_PROXY_NONCE_HEADER]: input.nonce } : {}),
|
|
36
|
-
...(intent ? { [exports.GATEWAY_ADMIN_PROXY_INTENT_HEADER]: intent } : {}),
|
|
37
32
|
[exports.GATEWAY_ADMIN_PROXY_SIGNATURE_HEADER]: signGatewayAdminProxyMarker({
|
|
38
33
|
secret: input.secret,
|
|
39
34
|
method: input.method,
|
|
@@ -41,7 +36,6 @@ function createGatewayAdminProxyHeaders(input) {
|
|
|
41
36
|
loopback,
|
|
42
37
|
issuedAt,
|
|
43
38
|
nonce: input.nonce,
|
|
44
|
-
intent,
|
|
45
39
|
}),
|
|
46
40
|
};
|
|
47
41
|
}
|
|
@@ -66,7 +60,6 @@ function verifyGatewayAdminProxyHeaders(input) {
|
|
|
66
60
|
const timestamp = firstHeader(input.headers[exports.GATEWAY_ADMIN_PROXY_TIMESTAMP_HEADER]);
|
|
67
61
|
const signature = firstHeader(input.headers[exports.GATEWAY_ADMIN_PROXY_SIGNATURE_HEADER]);
|
|
68
62
|
const nonce = firstHeader(input.headers[exports.GATEWAY_ADMIN_PROXY_NONCE_HEADER]);
|
|
69
|
-
const intentHeader = firstHeader(input.headers[exports.GATEWAY_ADMIN_PROXY_INTENT_HEADER]);
|
|
70
63
|
const present = loopback !== undefined || timestamp !== undefined || signature !== undefined;
|
|
71
64
|
if (!present) {
|
|
72
65
|
return { present: false, valid: false, originalClientLoopback: false };
|
|
@@ -87,10 +80,6 @@ function verifyGatewayAdminProxyHeaders(input) {
|
|
|
87
80
|
if (Math.abs((input.now ?? Date.now()) - issuedAt) > MAX_CLOCK_SKEW_MS) {
|
|
88
81
|
return { present: true, valid: false, originalClientLoopback: loopback === '1', reason: 'expired_marker' };
|
|
89
82
|
}
|
|
90
|
-
const intent = parseGatewayAdminProxyIntent(intentHeader);
|
|
91
|
-
if (intentHeader !== undefined && !intent) {
|
|
92
|
-
return { present: true, valid: false, originalClientLoopback: loopback === '1', reason: 'invalid_intent' };
|
|
93
|
-
}
|
|
94
83
|
const expected = signGatewayAdminProxyMarker({
|
|
95
84
|
secret: input.secret,
|
|
96
85
|
method: input.method,
|
|
@@ -98,12 +87,11 @@ function verifyGatewayAdminProxyHeaders(input) {
|
|
|
98
87
|
loopback,
|
|
99
88
|
issuedAt,
|
|
100
89
|
nonce,
|
|
101
|
-
intent: intentHeader,
|
|
102
90
|
});
|
|
103
91
|
if (!safeEqual(signature, expected)) {
|
|
104
92
|
return { present: true, valid: false, originalClientLoopback: loopback === '1', reason: 'bad_signature' };
|
|
105
93
|
}
|
|
106
|
-
return { present: true, valid: true, originalClientLoopback: loopback === '1', nonce
|
|
94
|
+
return { present: true, valid: true, originalClientLoopback: loopback === '1', nonce };
|
|
107
95
|
}
|
|
108
96
|
function signGatewayAdminProxyMarker(input) {
|
|
109
97
|
const payload = [
|
|
@@ -113,66 +101,9 @@ function signGatewayAdminProxyMarker(input) {
|
|
|
113
101
|
input.loopback,
|
|
114
102
|
String(input.issuedAt),
|
|
115
103
|
input.nonce ?? '',
|
|
116
|
-
input.intent ?? '',
|
|
117
104
|
].join('\n');
|
|
118
105
|
return (0, node_crypto_1.createHmac)('sha256', input.secret).update(payload).digest('base64url');
|
|
119
106
|
}
|
|
120
|
-
function canonicalGatewayAdminProxyIntent(intent) {
|
|
121
|
-
return JSON.stringify({
|
|
122
|
-
ownerWebId: intent.ownerWebId,
|
|
123
|
-
...(intent.podBaseUrl ? { podBaseUrl: intent.podBaseUrl } : {}),
|
|
124
|
-
method: intent.method,
|
|
125
|
-
resourceUrl: intent.resourceUrl,
|
|
126
|
-
principalKind: intent.principalKind,
|
|
127
|
-
scopes: [...intent.scopes].sort(),
|
|
128
|
-
...(intent.bodyDigest ? { bodyDigest: intent.bodyDigest } : {}),
|
|
129
|
-
});
|
|
130
|
-
}
|
|
131
|
-
function parseGatewayAdminProxyIntent(value) {
|
|
132
|
-
if (!value) {
|
|
133
|
-
return undefined;
|
|
134
|
-
}
|
|
135
|
-
try {
|
|
136
|
-
const parsed = JSON.parse(value);
|
|
137
|
-
if (typeof parsed.ownerWebId !== 'string' ||
|
|
138
|
-
typeof parsed.resourceUrl !== 'string' ||
|
|
139
|
-
(parsed.podBaseUrl !== undefined && !isHttpUrl(parsed.podBaseUrl)) ||
|
|
140
|
-
(parsed.method !== 'GET' && parsed.method !== 'HEAD' && parsed.method !== 'POST' && parsed.method !== 'PUT' && parsed.method !== 'PATCH' && parsed.method !== 'DELETE') ||
|
|
141
|
-
(parsed.principalKind !== 'solid-user' && parsed.principalKind !== 'gateway-key-verifier') ||
|
|
142
|
-
!Array.isArray(parsed.scopes) ||
|
|
143
|
-
!parsed.scopes.every((scope) => typeof scope === 'string') ||
|
|
144
|
-
(parsed.bodyDigest !== undefined && !isSha256Hex(parsed.bodyDigest)) ||
|
|
145
|
-
(parsed.method === 'POST' && !isSha256Hex(parsed.bodyDigest))) {
|
|
146
|
-
return undefined;
|
|
147
|
-
}
|
|
148
|
-
return {
|
|
149
|
-
ownerWebId: parsed.ownerWebId,
|
|
150
|
-
...(parsed.podBaseUrl ? { podBaseUrl: parsed.podBaseUrl } : {}),
|
|
151
|
-
method: parsed.method,
|
|
152
|
-
resourceUrl: parsed.resourceUrl,
|
|
153
|
-
principalKind: parsed.principalKind,
|
|
154
|
-
scopes: parsed.scopes,
|
|
155
|
-
...(parsed.bodyDigest ? { bodyDigest: parsed.bodyDigest } : {}),
|
|
156
|
-
};
|
|
157
|
-
}
|
|
158
|
-
catch {
|
|
159
|
-
return undefined;
|
|
160
|
-
}
|
|
161
|
-
}
|
|
162
|
-
function isHttpUrl(value) {
|
|
163
|
-
if (typeof value !== 'string')
|
|
164
|
-
return false;
|
|
165
|
-
try {
|
|
166
|
-
const url = new URL(value);
|
|
167
|
-
return url.protocol === 'http:' || url.protocol === 'https:';
|
|
168
|
-
}
|
|
169
|
-
catch {
|
|
170
|
-
return false;
|
|
171
|
-
}
|
|
172
|
-
}
|
|
173
|
-
function isSha256Hex(value) {
|
|
174
|
-
return typeof value === 'string' && /^[a-f0-9]{64}$/u.test(value);
|
|
175
|
-
}
|
|
176
107
|
function safeEqual(actual, expected) {
|
|
177
108
|
const actualBuffer = Buffer.from(actual);
|
|
178
109
|
const expectedBuffer = Buffer.from(expected);
|
package/dist/runtime/Proxy.d.ts
CHANGED
|
@@ -21,7 +21,22 @@ export declare class GatewayProxy {
|
|
|
21
21
|
private readonly nativeUpgradeRelay?;
|
|
22
22
|
/** Sockets created by `upgrade` events, dropped on shutdown. */
|
|
23
23
|
private readonly upgradeSockets;
|
|
24
|
+
/**
|
|
25
|
+
* Loopback-only listener used as the origin of everything that forwards remote
|
|
26
|
+
* traffic to this Gateway (managed tunnels, P2P data plane). Requests accepted
|
|
27
|
+
* there are never treated as local, so a forwarded request cannot inherit the
|
|
28
|
+
* trust that a real local client has.
|
|
29
|
+
*/
|
|
30
|
+
private readonly ingressPort?;
|
|
31
|
+
private ingressServer?;
|
|
24
32
|
constructor(port: number | undefined, supervisor: Supervisor, bindHost?: string, options?: GatewayProxyOptions);
|
|
33
|
+
/**
|
|
34
|
+
* Builds one HTTP listener plus its WebSocket routing.
|
|
35
|
+
*
|
|
36
|
+
* `untrustedIngress` marks the listener that tunnels and the P2P data plane
|
|
37
|
+
* connect to; see `ingressPort`.
|
|
38
|
+
*/
|
|
39
|
+
private createListener;
|
|
25
40
|
/**
|
|
26
41
|
* Upgraded sockets outlive the HTTP request that created them; they are
|
|
27
42
|
* tracked so shutdown can drop them instead of waiting for a long lived
|
|
@@ -52,12 +67,12 @@ export declare class GatewayProxy {
|
|
|
52
67
|
* (oven-sh/bun#28396), so waiting forever would block gateway restarts.
|
|
53
68
|
*/
|
|
54
69
|
private closeServer;
|
|
70
|
+
private ingressListenEndpoint;
|
|
55
71
|
private handleRequest;
|
|
56
72
|
private isApiWebProductPath;
|
|
57
73
|
private shouldRouteToApi;
|
|
58
74
|
private pathnameFromRequestUrl;
|
|
59
75
|
private applyInternalAdminProxyHeaders;
|
|
60
|
-
private verifiedInternalPodProxyHeaders;
|
|
61
76
|
private isApiHost;
|
|
62
77
|
private configuredApiHosts;
|
|
63
78
|
private hostsFromUrlList;
|
|
@@ -78,6 +93,15 @@ export declare class GatewayProxy {
|
|
|
78
93
|
* Add CORS headers matching CSS CorsHandler configuration
|
|
79
94
|
*/
|
|
80
95
|
private addCorsHeaders;
|
|
96
|
+
/**
|
|
97
|
+
* Whether this request carries operator authority.
|
|
98
|
+
*
|
|
99
|
+
* `/service/*` exposes logs and service control, so a caller that only reached the Gateway
|
|
100
|
+
* through a tunnel must not get it - whatever address it presents. A local caller counts, and
|
|
101
|
+
* so does a signed gateway admin proxy header, which is how the same machine proves it is the
|
|
102
|
+
* operator through a local forwarder.
|
|
103
|
+
*/
|
|
104
|
+
private hasOperatorAuthority;
|
|
81
105
|
private handleInternalApi;
|
|
82
106
|
private isCssReady;
|
|
83
107
|
private normalizeTarget;
|
|
@@ -102,4 +126,11 @@ export interface GatewayProxyOptions {
|
|
|
102
126
|
* client socket at all.
|
|
103
127
|
*/
|
|
104
128
|
nativeUpgradeRelay?: boolean;
|
|
129
|
+
/**
|
|
130
|
+
* Port for the loopback-only ingress listener that remote forwarding paths
|
|
131
|
+
* (managed tunnels, P2P data plane) use as their origin. Omit it when the
|
|
132
|
+
* Gateway has no remote ingress.
|
|
133
|
+
*/
|
|
134
|
+
ingressPort?: number;
|
|
105
135
|
}
|
|
136
|
+
export declare function forwardedFromOutside(req: http.IncomingMessage): boolean;
|