@undefineds.co/xpod 0.4.13 → 0.4.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/config/components-ignore.json +11 -7
- package/dist/api/ai-gateway/providers/ProviderRegistry.js +1 -1
- 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/container/index.js +1 -0
- package/dist/api/container/local.js +30 -12
- package/dist/api/container/routes.js +2 -0
- package/dist/api/container/types.d.ts +2 -0
- package/dist/api/handlers/AdminHandler.d.ts +17 -1
- package/dist/api/handlers/AdminHandler.js +40 -3
- package/dist/api/handlers/EdgeNodeSignalHandler.js +10 -2
- package/dist/api/handlers/NetworkSettingsHandler.d.ts +37 -5
- package/dist/api/handlers/NetworkSettingsHandler.js +39 -11
- package/dist/api/handlers/ProvisionHandler.d.ts +6 -1
- package/dist/api/handlers/ProvisionHandler.js +7 -2
- package/dist/api/handlers/ReachabilityHandler.d.ts +6 -0
- package/dist/api/handlers/ReachabilityHandler.js +22 -5
- package/dist/api/network/NetworkEnvironmentConfigurationStore.d.ts +6 -1
- package/dist/api/network/NetworkEnvironmentConfigurationStore.js +72 -16
- package/dist/api/runtime.d.ts +9 -0
- package/dist/api/runtime.js +15 -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 +19 -1
- package/dist/cli/commands/start.js +71 -5
- package/dist/components/context.jsonld +30 -0
- package/dist/edge/EdgeNodeAgent.d.ts +6 -0
- package/dist/edge/EdgeNodeAgent.js +1 -1
- 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/index.d.ts +3 -1
- package/dist/index.js +9 -3
- package/dist/main.js +7 -0
- package/dist/runtime/Proxy.d.ts +22 -0
- package/dist/runtime/Proxy.js +34 -7
- package/dist/runtime/bootstrap.d.ts +11 -0
- package/dist/runtime/bootstrap.js +21 -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 +4 -1
- package/dist/runtime/host/types.d.ts +6 -0
- package/dist/runtime/index.d.ts +1 -1
- package/dist/runtime/index.js +5 -1
- package/dist/runtime/lifecycle.js +1 -0
- package/dist/runtime/port-finder.d.ts +30 -0
- package/dist/runtime/port-finder.js +83 -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/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/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 +1 -1
- 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/package.json +5 -6
- package/static/app/assets/main.css +1 -1
- package/static/auth-callback/assets/{AiConfigContext-DlFyEWy9.js → AiConfigContext-DCXpjzpj.js} +1 -1
- package/static/auth-callback/assets/{AiConfigPage-CkYk-SFW.js → AiConfigPage-fe-xMIXa.js} +1 -1
- package/static/auth-callback/assets/{DocumentProcessingPanel-CqIr3JqN.js → DocumentProcessingPanel-BGnkfMuU.js} +1 -1
- package/static/auth-callback/assets/{IndexLifecyclePanel-C1GKV3Vx.js → IndexLifecyclePanel-42Jups0j.js} +1 -1
- package/static/auth-callback/assets/{IndexSubjectPanel-ro9lC6XW.js → IndexSubjectPanel-CYyLOlQU.js} +1 -1
- package/static/auth-callback/assets/{ModelAssignmentsPanel-DxNdyKRJ.js → ModelAssignmentsPanel-BOvUH4yr.js} +1 -1
- package/static/auth-callback/assets/{ModelsPage-BVtWSPBU.js → ModelsPage-DwyITxt7.js} +3 -3
- package/static/auth-callback/assets/NetworkPage-CG9RelJA.js +2 -0
- package/static/auth-callback/assets/{PaneListHeader-ByKw8ada.js → PaneListHeader-yvd5ohs6.js} +1 -1
- package/static/auth-callback/assets/{SearchIndexingPanel-CulBKcYT.js → SearchIndexingPanel-2_a6ezzj.js} +1 -1
- package/static/auth-callback/assets/{StatusSubjectPanel-VOcfrt8o.js → StatusSubjectPanel-8qtVxnzC.js} +1 -1
- package/static/auth-callback/assets/{StatusWorkspace-Jsz6hAdE.js → StatusWorkspace-CBdRahCF.js} +1 -1
- package/static/auth-callback/assets/{SystemSettingsPage-BFNvGAle.js → SystemSettingsPage-BZJ6vWkg.js} +1 -1
- package/static/auth-callback/assets/{SystemSettingsSubjectPanel-DFRdrSfK.js → SystemSettingsSubjectPanel-xm08UhXP.js} +1 -1
- package/static/auth-callback/assets/{XpodAiConnectionsPodStore-C6KpvHVg.js → XpodAiConnectionsPodStore-V6vgGfuw.js} +1 -1
- package/static/auth-callback/assets/{activity-DnTlb9iM.js → activity-CeM7xly8.js} +1 -1
- package/static/auth-callback/assets/{auth-callback-D2UkK5Xj.js → auth-callback-DTG8cSj7.js} +3 -3
- package/static/auth-callback/assets/auth-callback-rk080mvG.css +1 -0
- package/static/auth-callback/assets/{badge-D7IJuuTM.js → badge-qJo2Zr4d.js} +1 -1
- package/static/auth-callback/assets/{collection-runtime-wT1n4GS2.js → collection-runtime-Bztsz31a.js} +1 -1
- package/static/auth-callback/assets/{dialog-DickLu5z.js → dialog-D-h6x5x0.js} +1 -1
- package/static/auth-callback/assets/{download-kn8WnRu3.js → download-C2ir4lmR.js} +1 -1
- package/static/auth-callback/assets/{external-link-B6B8jfSn.js → external-link-THLDL4On.js} +1 -1
- package/static/auth-callback/assets/{index-Dz83EEHD.js → index-BRpv4yO3.js} +1 -1
- package/static/auth-callback/assets/{index-DHF97YLP.js → index-BlVZb9A7.js} +1 -1
- package/static/auth-callback/assets/index-D983R1FV.js +4 -0
- package/static/auth-callback/assets/{index-browser-CSghinyi.js → index-browser-3FvR0aaf.js} +1 -1
- package/static/auth-callback/assets/{key-round-ChkOx3E1.js → key-round-C9U5j1Ly.js} +1 -1
- package/static/auth-callback/assets/{rotate-ccw-B3hE-nyd.js → rotate-ccw-DP45cD4o.js} +1 -1
- package/static/auth-callback/assets/{skeleton-kEqR7tpI.js → skeleton-Dn4EiSCS.js} +1 -1
- package/static/auth-callback/assets/{waypoints-D6Jo-SZa.js → waypoints-uqFQ3uEG.js} +1 -1
- package/static/auth-callback/assets/{workspace-layout-BHwT_cHd.js → workspace-layout-DLYK0Wwu.js} +1 -1
- package/static/auth-callback/auth-callback.html +2 -2
- package/static/dashboard/assets/{AiConfigContext-BfC3v-x2.js → AiConfigContext-DJcMECNw.js} +1 -1
- package/static/dashboard/assets/{AiConfigPage-QNS3u7Ff.js → AiConfigPage-BvE7dOTy.js} +1 -1
- package/static/dashboard/assets/{DocumentProcessingPanel-Dr4XLeT4.js → DocumentProcessingPanel-D9780krf.js} +1 -1
- package/static/dashboard/assets/{IndexLifecyclePanel-KtM_gpeO.js → IndexLifecyclePanel-SjsUcnbM.js} +1 -1
- package/static/dashboard/assets/{IndexSubjectPanel-DLaiKdLc.js → IndexSubjectPanel-C-ym2Tqi.js} +1 -1
- package/static/dashboard/assets/{ModelAssignmentsPanel-Bk7TvQRq.js → ModelAssignmentsPanel-BRjZ-arB.js} +1 -1
- package/static/dashboard/assets/{ModelsPage-Cci3vlos.js → ModelsPage-BtTU6du3.js} +3 -3
- package/static/dashboard/assets/NetworkPage-CV9qpkDg.js +2 -0
- package/static/dashboard/assets/{PaneListHeader-qHME_s08.js → PaneListHeader-KyPTTBsv.js} +1 -1
- package/static/dashboard/assets/{SearchIndexingPanel-HZPKj8H9.js → SearchIndexingPanel-DolHGawg.js} +1 -1
- package/static/dashboard/assets/{StatusSubjectPanel-ij7IpI8d.js → StatusSubjectPanel-_YZvKiYi.js} +1 -1
- package/static/dashboard/assets/{StatusWorkspace-Cp02JcaN.js → StatusWorkspace-Dlbh_G40.js} +1 -1
- package/static/dashboard/assets/{SystemSettingsPage-BSeuvb8X.js → SystemSettingsPage-Be7QSIoz.js} +1 -1
- package/static/dashboard/assets/{SystemSettingsSubjectPanel-CP4_luGS.js → SystemSettingsSubjectPanel-DBp0gja7.js} +1 -1
- package/static/dashboard/assets/{XpodAiConnectionsPodStore-urO6zaHL.js → XpodAiConnectionsPodStore-ClpSjzpP.js} +1 -1
- package/static/dashboard/assets/{activity-DxjgQNvr.js → activity-lsNbTXJu.js} +1 -1
- package/static/dashboard/assets/{badge-53qCrRbl.js → badge-CVatKjaG.js} +1 -1
- package/static/dashboard/assets/{collection-runtime-BPAmHG46.js → collection-runtime-Ec4UnY28.js} +1 -1
- package/static/dashboard/assets/{dashboard-BcT2ByXw.js → dashboard-BEzsRsvF.js} +2 -2
- package/static/dashboard/assets/dashboard-rk080mvG.css +1 -0
- package/static/dashboard/assets/{dialog-B28YtNhS.js → dialog-BuyelQ4V.js} +1 -1
- package/static/dashboard/assets/{download-DkLNceJ4.js → download-B4Nf678F.js} +1 -1
- package/static/dashboard/assets/{external-link-D3TXnlo3.js → external-link-PYv9CvKL.js} +1 -1
- package/static/dashboard/assets/index-C9XPE-mI.js +4 -0
- package/static/dashboard/assets/{index-CFIenkeK.js → index-Cx69bTNh.js} +1 -1
- package/static/dashboard/assets/{index-CIiBu9mr.js → index-awr7ulur.js} +1 -1
- package/static/dashboard/assets/{key-round-B5ccp6nx.js → key-round-VsY80U1Z.js} +1 -1
- package/static/dashboard/assets/{rotate-ccw-DUpfkNnk.js → rotate-ccw-Cz1K4vE9.js} +1 -1
- package/static/dashboard/assets/{skeleton-BRe19fO0.js → skeleton-BhNv_8tO.js} +1 -1
- package/static/dashboard/assets/{waypoints-BKDMxEvu.js → waypoints-DYS9XFYV.js} +1 -1
- package/static/dashboard/assets/{workspace-layout-ZTF7C16h.js → workspace-layout-OZJAFx5V.js} +1 -1
- package/static/dashboard/dashboard.html +2 -2
- package/static/settings/assets/{AiConfigContext-DsyWgu2i.js → AiConfigContext-B8JS3MXF.js} +1 -1
- package/static/settings/assets/{AiConfigPage-CSCBckKo.js → AiConfigPage-C3Zl8LUl.js} +1 -1
- package/static/settings/assets/{DocumentProcessingPanel-w9yQDbBe.js → DocumentProcessingPanel-DpDZAQvf.js} +1 -1
- package/static/settings/assets/{IndexLifecyclePanel-CUUXI8mP.js → IndexLifecyclePanel-Ec1XF88t.js} +1 -1
- package/static/settings/assets/{IndexSubjectPanel-BypAU5TJ.js → IndexSubjectPanel-BulT9BmO.js} +1 -1
- package/static/settings/assets/{ModelAssignmentsPanel-BetgXw1G.js → ModelAssignmentsPanel-BcGSmYjb.js} +1 -1
- package/static/settings/assets/{ModelsPage-DZpTlTZ3.js → ModelsPage-CvTCKy1T.js} +3 -3
- package/static/settings/assets/NetworkPage-DQF5u9Bn.js +2 -0
- package/static/settings/assets/{PaneListHeader-BGOqGec4.js → PaneListHeader-D40hqcVl.js} +1 -1
- package/static/settings/assets/{SearchIndexingPanel-DYAbpZ_9.js → SearchIndexingPanel-iCUPOx_0.js} +1 -1
- package/static/settings/assets/{StatusSubjectPanel-CFgzeQ8Q.js → StatusSubjectPanel-E--ZHSql.js} +1 -1
- package/static/settings/assets/{StatusWorkspace-4Z6g4Jvv.js → StatusWorkspace-YjDAx1II.js} +1 -1
- package/static/settings/assets/{SystemSettingsPage-C1tlrgvI.js → SystemSettingsPage-CDdV3mC9.js} +1 -1
- package/static/settings/assets/{SystemSettingsSubjectPanel-CcURI-1L.js → SystemSettingsSubjectPanel-Br8WazDq.js} +1 -1
- package/static/settings/assets/{XpodAiConnectionsPodStore-owBQc5nY.js → XpodAiConnectionsPodStore-CLr38P_Z.js} +1 -1
- package/static/settings/assets/{activity-CtBc9cNy.js → activity-C5DAHHTE.js} +1 -1
- package/static/settings/assets/{badge--r-FDIhU.js → badge-D8eIyxKt.js} +1 -1
- package/static/settings/assets/{collection-runtime-CnhPmwAM.js → collection-runtime-DLc9zil8.js} +1 -1
- package/static/settings/assets/{dialog-B7ZRsjN7.js → dialog-CyuR7Va4.js} +1 -1
- package/static/settings/assets/{download-DgQ1F8QR.js → download-c0oxZrCz.js} +1 -1
- package/static/settings/assets/{external-link-Bz7NckNO.js → external-link-D3Z34fP_.js} +1 -1
- package/static/settings/assets/{index-Vv-8Vslg.js → index-CKGbRFlc.js} +1 -1
- package/static/settings/assets/index-CSr3-2Cj.js +4 -0
- package/static/settings/assets/{index-CkGda_Pg.js → index-ComidxAm.js} +1 -1
- package/static/settings/assets/{index-browser-Dq7omlpY.js → index-browser-CAscEbae.js} +1 -1
- package/static/settings/assets/{key-round-CvuhloKV.js → key-round-DyjLmXuB.js} +1 -1
- package/static/settings/assets/{rotate-ccw-DgFKDaz7.js → rotate-ccw-679HF_ec.js} +1 -1
- package/static/settings/assets/{settings-BvqY7K96.js → settings-DKknqu4C.js} +3 -3
- package/static/settings/assets/settings-rk080mvG.css +1 -0
- package/static/settings/assets/{skeleton-D3OeFDF6.js → skeleton-CkopNkPB.js} +1 -1
- package/static/settings/assets/{waypoints-C4WbspTb.js → waypoints-CrqfAftE.js} +1 -1
- package/static/settings/assets/{workspace-layout-B9H1Tqrk.js → workspace-layout-UN6c4qTG.js} +1 -1
- package/static/settings/settings.html +2 -2
- 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/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/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/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
|
@@ -19,7 +19,17 @@ export declare class EdgeNodeDnsCoordinator {
|
|
|
19
19
|
private readonly ttl?;
|
|
20
20
|
private readonly enabled;
|
|
21
21
|
constructor(options: EdgeNodeDnsCoordinatorOptions);
|
|
22
|
-
|
|
22
|
+
/**
|
|
23
|
+
* Reconciles the DNS record owned by one node.
|
|
24
|
+
*
|
|
25
|
+
* `binding` is the control plane's subdomain assignment for that node. When it is
|
|
26
|
+
* supplied it is authoritative, including when it carries no subdomain: that means the
|
|
27
|
+
* node owns no record and nothing may be written or deleted. Node-reported metadata is
|
|
28
|
+
* still consulted for callers whose subdomain is local (`LocalNetworkManager`).
|
|
29
|
+
*/
|
|
30
|
+
synchronize(nodeId: string, metadata: Record<string, unknown>, binding?: {
|
|
31
|
+
subdomain?: string;
|
|
32
|
+
}): Promise<void>;
|
|
23
33
|
private extractDnsHints;
|
|
24
34
|
private extractTunnelEntrypoint;
|
|
25
35
|
private extractString;
|
|
@@ -11,12 +11,22 @@ class EdgeNodeDnsCoordinator {
|
|
|
11
11
|
this.ttl = this.normalizeTtl(options.ttl);
|
|
12
12
|
this.enabled = Boolean(this.rootDomain);
|
|
13
13
|
}
|
|
14
|
-
|
|
14
|
+
/**
|
|
15
|
+
* Reconciles the DNS record owned by one node.
|
|
16
|
+
*
|
|
17
|
+
* `binding` is the control plane's subdomain assignment for that node. When it is
|
|
18
|
+
* supplied it is authoritative, including when it carries no subdomain: that means the
|
|
19
|
+
* node owns no record and nothing may be written or deleted. Node-reported metadata is
|
|
20
|
+
* still consulted for callers whose subdomain is local (`LocalNetworkManager`).
|
|
21
|
+
*/
|
|
22
|
+
async synchronize(nodeId, metadata, binding) {
|
|
15
23
|
if (!this.enabled) {
|
|
16
24
|
return;
|
|
17
25
|
}
|
|
18
26
|
const hints = this.extractDnsHints(metadata);
|
|
19
|
-
const subdomain =
|
|
27
|
+
const subdomain = binding
|
|
28
|
+
? this.extractString(binding.subdomain)
|
|
29
|
+
: this.extractString(metadata.subdomain) ?? hints?.subdomain;
|
|
20
30
|
if (!subdomain) {
|
|
21
31
|
this.logger.debug(`Node ${nodeId} 未提供 subdomain,跳过 DNS 同步。`);
|
|
22
32
|
return;
|
|
@@ -1,10 +1,17 @@
|
|
|
1
1
|
import { EdgeNodeRepository } from '../identity/drizzle/EdgeNodeRepository';
|
|
2
|
+
import { type HeadProbeRequest, type ResolveAddresses } from './ProbeTargetGuard';
|
|
2
3
|
interface EdgeNodeHealthProbeServiceOptions {
|
|
3
4
|
repository?: EdgeNodeRepository;
|
|
4
5
|
identityDbUrl?: string;
|
|
5
6
|
enabled?: boolean | string;
|
|
6
7
|
timeoutMs?: number | string;
|
|
7
8
|
locations?: string | string[];
|
|
9
|
+
/** DNS resolution used to validate probe targets; injected in tests. */
|
|
10
|
+
resolveAddresses?: ResolveAddresses;
|
|
11
|
+
/** Transport for the direct HEAD probe; injected in tests. */
|
|
12
|
+
headRequest?: HeadProbeRequest;
|
|
13
|
+
/** Redirect hops followed while re-validating every target. */
|
|
14
|
+
maxRedirects?: number;
|
|
8
15
|
}
|
|
9
16
|
export declare class EdgeNodeHealthProbeService {
|
|
10
17
|
private readonly logger;
|
|
@@ -12,6 +19,9 @@ export declare class EdgeNodeHealthProbeService {
|
|
|
12
19
|
private readonly enabled;
|
|
13
20
|
private readonly timeoutMs;
|
|
14
21
|
private readonly locations;
|
|
22
|
+
private readonly resolveAddresses?;
|
|
23
|
+
private readonly headRequest;
|
|
24
|
+
private readonly maxRedirects;
|
|
15
25
|
constructor(options: EdgeNodeHealthProbeServiceOptions);
|
|
16
26
|
probeNode(nodeId: string): Promise<void>;
|
|
17
27
|
private collectCandidates;
|
|
@@ -19,6 +29,11 @@ export declare class EdgeNodeHealthProbeService {
|
|
|
19
29
|
private extractManagedTunnelEndpoint;
|
|
20
30
|
private extractNonEmptyString;
|
|
21
31
|
private ping;
|
|
32
|
+
/**
|
|
33
|
+
* Follows redirects by hand so every hop is validated again: a public entry point must
|
|
34
|
+
* not be able to bounce the probe into a private address.
|
|
35
|
+
*/
|
|
36
|
+
private probePublicCandidate;
|
|
22
37
|
private toUrl;
|
|
23
38
|
private createRepository;
|
|
24
39
|
private normalizeBoolean;
|
|
@@ -4,6 +4,7 @@ exports.EdgeNodeHealthProbeService = void 0;
|
|
|
4
4
|
const global_logger_factory_1 = require("global-logger-factory");
|
|
5
5
|
const db_1 = require("../identity/drizzle/db");
|
|
6
6
|
const EdgeNodeRepository_1 = require("../identity/drizzle/EdgeNodeRepository");
|
|
7
|
+
const ProbeTargetGuard_1 = require("./ProbeTargetGuard");
|
|
7
8
|
class EdgeNodeHealthProbeService {
|
|
8
9
|
constructor(options) {
|
|
9
10
|
this.logger = (0, global_logger_factory_1.getLoggerFor)(this);
|
|
@@ -11,6 +12,9 @@ class EdgeNodeHealthProbeService {
|
|
|
11
12
|
this.enabled = this.normalizeBoolean(options.enabled) && Boolean(this.repository);
|
|
12
13
|
this.timeoutMs = this.normalizeTimeout(options.timeoutMs) ?? 3_000;
|
|
13
14
|
this.locations = this.normalizeLocations(options.locations);
|
|
15
|
+
this.resolveAddresses = options.resolveAddresses;
|
|
16
|
+
this.headRequest = options.headRequest ?? (0, ProbeTargetGuard_1.createPinnedHeadProbeRequest)();
|
|
17
|
+
this.maxRedirects = Math.max(0, Math.trunc(options.maxRedirects ?? 3));
|
|
14
18
|
}
|
|
15
19
|
async probeNode(nodeId) {
|
|
16
20
|
if (!this.enabled) {
|
|
@@ -87,8 +91,20 @@ class EdgeNodeHealthProbeService {
|
|
|
87
91
|
if (!url) {
|
|
88
92
|
return { candidate, success: false, error: 'invalid-url', location: location.name, checkedAt: new Date().toISOString() };
|
|
89
93
|
}
|
|
90
|
-
|
|
91
|
-
|
|
94
|
+
// The candidate comes from node metadata, so Cloud only contacts public targets:
|
|
95
|
+
// private, loopback, link-local and metadata addresses stay with clients that can
|
|
96
|
+
// actually reach them.
|
|
97
|
+
const decision = await (0, ProbeTargetGuard_1.assertPublicProbeTarget)(url, this.resolveAddresses);
|
|
98
|
+
if (!decision.allowed) {
|
|
99
|
+
this.logger.debug(`跳过非公网探测目标 ${candidate}: ${decision.reason}`);
|
|
100
|
+
return {
|
|
101
|
+
candidate,
|
|
102
|
+
success: false,
|
|
103
|
+
error: `blocked-target:${decision.reason}`,
|
|
104
|
+
location: location.name,
|
|
105
|
+
checkedAt: new Date().toISOString(),
|
|
106
|
+
};
|
|
107
|
+
}
|
|
92
108
|
const started = Date.now();
|
|
93
109
|
try {
|
|
94
110
|
if (location.endpoint) {
|
|
@@ -96,10 +112,9 @@ class EdgeNodeHealthProbeService {
|
|
|
96
112
|
probeUrl.searchParams.set('target', url.toString());
|
|
97
113
|
const response = await fetch(probeUrl.toString(), {
|
|
98
114
|
method: 'GET',
|
|
99
|
-
signal: controller.signal,
|
|
100
115
|
headers: { 'accept': 'application/json' },
|
|
116
|
+
signal: AbortSignal.timeout(this.timeoutMs),
|
|
101
117
|
});
|
|
102
|
-
clearTimeout(timer);
|
|
103
118
|
const latencyMs = Date.now() - started;
|
|
104
119
|
if (!response.ok) {
|
|
105
120
|
return {
|
|
@@ -133,23 +148,18 @@ class EdgeNodeHealthProbeService {
|
|
|
133
148
|
};
|
|
134
149
|
}
|
|
135
150
|
}
|
|
136
|
-
const
|
|
137
|
-
method: 'HEAD',
|
|
138
|
-
signal: controller.signal,
|
|
139
|
-
});
|
|
140
|
-
clearTimeout(timer);
|
|
151
|
+
const probe = await this.probePublicCandidate(url, decision.address);
|
|
141
152
|
const latencyMs = Date.now() - started;
|
|
142
153
|
return {
|
|
143
154
|
candidate,
|
|
144
155
|
location: location.name,
|
|
145
|
-
success:
|
|
156
|
+
success: probe.status >= 200 && probe.status < 400,
|
|
146
157
|
latencyMs,
|
|
147
|
-
error:
|
|
158
|
+
error: probe.error ?? (probe.status >= 200 && probe.status < 400 ? undefined : `status:${probe.status}`),
|
|
148
159
|
checkedAt: new Date().toISOString(),
|
|
149
160
|
};
|
|
150
161
|
}
|
|
151
162
|
catch (error) {
|
|
152
|
-
clearTimeout(timer);
|
|
153
163
|
return {
|
|
154
164
|
candidate,
|
|
155
165
|
location: location.name,
|
|
@@ -159,6 +169,28 @@ class EdgeNodeHealthProbeService {
|
|
|
159
169
|
};
|
|
160
170
|
}
|
|
161
171
|
}
|
|
172
|
+
/**
|
|
173
|
+
* Follows redirects by hand so every hop is validated again: a public entry point must
|
|
174
|
+
* not be able to bounce the probe into a private address.
|
|
175
|
+
*/
|
|
176
|
+
async probePublicCandidate(startUrl, startAddress) {
|
|
177
|
+
let url = startUrl;
|
|
178
|
+
let address = startAddress;
|
|
179
|
+
for (let hop = 0; hop <= this.maxRedirects; hop += 1) {
|
|
180
|
+
const response = await this.headRequest(url, { address, timeoutMs: this.timeoutMs });
|
|
181
|
+
if (response.status < 300 || response.status >= 400 || !response.location) {
|
|
182
|
+
return { status: response.status };
|
|
183
|
+
}
|
|
184
|
+
const next = new URL(response.location, url);
|
|
185
|
+
const decision = await (0, ProbeTargetGuard_1.assertPublicProbeTarget)(next, this.resolveAddresses);
|
|
186
|
+
if (!decision.allowed) {
|
|
187
|
+
return { status: 0, error: `blocked-redirect:${decision.reason}` };
|
|
188
|
+
}
|
|
189
|
+
url = next;
|
|
190
|
+
address = decision.address;
|
|
191
|
+
}
|
|
192
|
+
return { status: 0, error: 'blocked-redirect:too-many-redirects' };
|
|
193
|
+
}
|
|
162
194
|
toUrl(value) {
|
|
163
195
|
try {
|
|
164
196
|
return new URL(value);
|
|
@@ -74,6 +74,49 @@
|
|
|
74
74
|
}
|
|
75
75
|
]
|
|
76
76
|
}
|
|
77
|
+
},
|
|
78
|
+
{
|
|
79
|
+
"@id": "undefineds:dist/edge/EdgeNodeHealthProbeService.jsonld#EdgeNodeHealthProbeService_options_resolveAddresses",
|
|
80
|
+
"range": {
|
|
81
|
+
"@type": "ParameterRangeUnion",
|
|
82
|
+
"parameterRangeElements": [
|
|
83
|
+
{
|
|
84
|
+
"@type": "ParameterRangeWildcard"
|
|
85
|
+
},
|
|
86
|
+
{
|
|
87
|
+
"@type": "ParameterRangeUndefined"
|
|
88
|
+
}
|
|
89
|
+
]
|
|
90
|
+
},
|
|
91
|
+
"comment": "DNS resolution used to validate probe targets; injected in tests."
|
|
92
|
+
},
|
|
93
|
+
{
|
|
94
|
+
"@id": "undefineds:dist/edge/EdgeNodeHealthProbeService.jsonld#EdgeNodeHealthProbeService_options_headRequest",
|
|
95
|
+
"range": {
|
|
96
|
+
"@type": "ParameterRangeUnion",
|
|
97
|
+
"parameterRangeElements": [
|
|
98
|
+
{
|
|
99
|
+
"@type": "ParameterRangeWildcard"
|
|
100
|
+
},
|
|
101
|
+
{
|
|
102
|
+
"@type": "ParameterRangeUndefined"
|
|
103
|
+
}
|
|
104
|
+
]
|
|
105
|
+
},
|
|
106
|
+
"comment": "Transport for the direct HEAD probe; injected in tests."
|
|
107
|
+
},
|
|
108
|
+
{
|
|
109
|
+
"@id": "undefineds:dist/edge/EdgeNodeHealthProbeService.jsonld#EdgeNodeHealthProbeService_options_maxRedirects",
|
|
110
|
+
"range": {
|
|
111
|
+
"@type": "ParameterRangeUnion",
|
|
112
|
+
"parameterRangeElements": [
|
|
113
|
+
"xsd:number",
|
|
114
|
+
{
|
|
115
|
+
"@type": "ParameterRangeUndefined"
|
|
116
|
+
}
|
|
117
|
+
]
|
|
118
|
+
},
|
|
119
|
+
"comment": "Redirect hops followed while re-validating every target."
|
|
77
120
|
}
|
|
78
121
|
],
|
|
79
122
|
"memberFields": [
|
|
@@ -97,6 +140,18 @@
|
|
|
97
140
|
"@id": "undefineds:dist/edge/EdgeNodeHealthProbeService.jsonld#EdgeNodeHealthProbeService__member_locations",
|
|
98
141
|
"memberFieldName": "locations"
|
|
99
142
|
},
|
|
143
|
+
{
|
|
144
|
+
"@id": "undefineds:dist/edge/EdgeNodeHealthProbeService.jsonld#EdgeNodeHealthProbeService__member_resolveAddresses",
|
|
145
|
+
"memberFieldName": "resolveAddresses"
|
|
146
|
+
},
|
|
147
|
+
{
|
|
148
|
+
"@id": "undefineds:dist/edge/EdgeNodeHealthProbeService.jsonld#EdgeNodeHealthProbeService__member_headRequest",
|
|
149
|
+
"memberFieldName": "headRequest"
|
|
150
|
+
},
|
|
151
|
+
{
|
|
152
|
+
"@id": "undefineds:dist/edge/EdgeNodeHealthProbeService.jsonld#EdgeNodeHealthProbeService__member_maxRedirects",
|
|
153
|
+
"memberFieldName": "maxRedirects"
|
|
154
|
+
},
|
|
100
155
|
{
|
|
101
156
|
"@id": "undefineds:dist/edge/EdgeNodeHealthProbeService.jsonld#EdgeNodeHealthProbeService__member_constructor",
|
|
102
157
|
"memberFieldName": "constructor"
|
|
@@ -125,6 +180,10 @@
|
|
|
125
180
|
"@id": "undefineds:dist/edge/EdgeNodeHealthProbeService.jsonld#EdgeNodeHealthProbeService__member_ping",
|
|
126
181
|
"memberFieldName": "ping"
|
|
127
182
|
},
|
|
183
|
+
{
|
|
184
|
+
"@id": "undefineds:dist/edge/EdgeNodeHealthProbeService.jsonld#EdgeNodeHealthProbeService__member_probePublicCandidate",
|
|
185
|
+
"memberFieldName": "probePublicCandidate"
|
|
186
|
+
},
|
|
128
187
|
{
|
|
129
188
|
"@id": "undefineds:dist/edge/EdgeNodeHealthProbeService.jsonld#EdgeNodeHealthProbeService__member_toUrl",
|
|
130
189
|
"memberFieldName": "toUrl"
|
|
@@ -179,6 +238,24 @@
|
|
|
179
238
|
"value": {
|
|
180
239
|
"@id": "undefineds:dist/edge/EdgeNodeHealthProbeService.jsonld#EdgeNodeHealthProbeService_options_locations"
|
|
181
240
|
}
|
|
241
|
+
},
|
|
242
|
+
{
|
|
243
|
+
"keyRaw": "resolveAddresses",
|
|
244
|
+
"value": {
|
|
245
|
+
"@id": "undefineds:dist/edge/EdgeNodeHealthProbeService.jsonld#EdgeNodeHealthProbeService_options_resolveAddresses"
|
|
246
|
+
}
|
|
247
|
+
},
|
|
248
|
+
{
|
|
249
|
+
"keyRaw": "headRequest",
|
|
250
|
+
"value": {
|
|
251
|
+
"@id": "undefineds:dist/edge/EdgeNodeHealthProbeService.jsonld#EdgeNodeHealthProbeService_options_headRequest"
|
|
252
|
+
}
|
|
253
|
+
},
|
|
254
|
+
{
|
|
255
|
+
"keyRaw": "maxRedirects",
|
|
256
|
+
"value": {
|
|
257
|
+
"@id": "undefineds:dist/edge/EdgeNodeHealthProbeService.jsonld#EdgeNodeHealthProbeService_options_maxRedirects"
|
|
258
|
+
}
|
|
182
259
|
}
|
|
183
260
|
]
|
|
184
261
|
}
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
export type ResolveAddresses = (hostname: string) => Promise<string[]>;
|
|
2
|
+
export type ProbeTargetDecision = {
|
|
3
|
+
allowed: true;
|
|
4
|
+
address: string;
|
|
5
|
+
} | {
|
|
6
|
+
allowed: false;
|
|
7
|
+
reason: string;
|
|
8
|
+
};
|
|
9
|
+
/** Whether an address is a public unicast address a Cloud probe may contact. */
|
|
10
|
+
export declare function isPublicIpAddress(address: string): boolean;
|
|
11
|
+
/** Resolves every address of a probe hostname; injected in tests. */
|
|
12
|
+
export declare function resolveHostAddresses(hostname: string): Promise<string[]>;
|
|
13
|
+
/**
|
|
14
|
+
* Decides whether a probe target may be contacted.
|
|
15
|
+
*
|
|
16
|
+
* Every resolved address has to be public, so a hostname that mixes public and private
|
|
17
|
+
* records is refused instead of racing whichever record the connection picks.
|
|
18
|
+
*/
|
|
19
|
+
export declare function assertPublicProbeTarget(url: URL, resolveAddresses?: ResolveAddresses): Promise<ProbeTargetDecision>;
|
|
20
|
+
export interface HeadProbeRequestOptions {
|
|
21
|
+
/** Address the connection is pinned to, already validated by the target policy. */
|
|
22
|
+
address: string;
|
|
23
|
+
timeoutMs: number;
|
|
24
|
+
}
|
|
25
|
+
export type HeadProbeRequest = (url: URL, options: HeadProbeRequestOptions) => Promise<{
|
|
26
|
+
status: number;
|
|
27
|
+
location?: string;
|
|
28
|
+
}>;
|
|
29
|
+
/**
|
|
30
|
+
* HEAD request pinned to a validated address.
|
|
31
|
+
*
|
|
32
|
+
* Pinning is what makes the DNS check meaningful: without it the client would resolve the
|
|
33
|
+
* hostname a second time and a rebinding answer could still reach a private address.
|
|
34
|
+
*/
|
|
35
|
+
export declare function createPinnedHeadProbeRequest(): HeadProbeRequest;
|
|
@@ -0,0 +1,142 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
exports.isPublicIpAddress = isPublicIpAddress;
|
|
7
|
+
exports.resolveHostAddresses = resolveHostAddresses;
|
|
8
|
+
exports.assertPublicProbeTarget = assertPublicProbeTarget;
|
|
9
|
+
exports.createPinnedHeadProbeRequest = createPinnedHeadProbeRequest;
|
|
10
|
+
const node_http_1 = __importDefault(require("node:http"));
|
|
11
|
+
const node_https_1 = __importDefault(require("node:https"));
|
|
12
|
+
const node_net_1 = require("node:net");
|
|
13
|
+
const node_dns_1 = __importDefault(require("node:dns"));
|
|
14
|
+
/**
|
|
15
|
+
* Address ranges a Cloud probe must never contact: the probe target comes from node
|
|
16
|
+
* metadata, so without this an edge node could make the cluster fetch its own private
|
|
17
|
+
* network, loopback services or the cloud metadata endpoint.
|
|
18
|
+
*/
|
|
19
|
+
const BLOCKED_IPV4 = new node_net_1.BlockList();
|
|
20
|
+
for (const [network, prefix] of [
|
|
21
|
+
['0.0.0.0', 8],
|
|
22
|
+
['10.0.0.0', 8],
|
|
23
|
+
['100.64.0.0', 10],
|
|
24
|
+
['127.0.0.0', 8],
|
|
25
|
+
['169.254.0.0', 16],
|
|
26
|
+
['172.16.0.0', 12],
|
|
27
|
+
['192.0.0.0', 24],
|
|
28
|
+
['192.0.2.0', 24],
|
|
29
|
+
['192.168.0.0', 16],
|
|
30
|
+
['198.18.0.0', 15],
|
|
31
|
+
['198.51.100.0', 24],
|
|
32
|
+
['203.0.113.0', 24],
|
|
33
|
+
['224.0.0.0', 4],
|
|
34
|
+
['240.0.0.0', 4],
|
|
35
|
+
]) {
|
|
36
|
+
BLOCKED_IPV4.addSubnet(network, prefix, 'ipv4');
|
|
37
|
+
}
|
|
38
|
+
// IPv4-mapped addresses are normalized to IPv4 before checking, so the two families stay
|
|
39
|
+
// in separate lists: a mixed list makes `check(ipv4Address, 'ipv4')` match IPv6 rules.
|
|
40
|
+
const BLOCKED_IPV6 = new node_net_1.BlockList();
|
|
41
|
+
for (const [network, prefix] of [
|
|
42
|
+
['::', 128],
|
|
43
|
+
['::1', 128],
|
|
44
|
+
['64:ff9b::', 96],
|
|
45
|
+
['fc00::', 7],
|
|
46
|
+
['fe80::', 10],
|
|
47
|
+
['ff00::', 8],
|
|
48
|
+
['2001:db8::', 32],
|
|
49
|
+
]) {
|
|
50
|
+
BLOCKED_IPV6.addSubnet(network, prefix, 'ipv6');
|
|
51
|
+
}
|
|
52
|
+
/** Whether an address is a public unicast address a Cloud probe may contact. */
|
|
53
|
+
function isPublicIpAddress(address) {
|
|
54
|
+
const normalized = normalizeMappedIpv4(address);
|
|
55
|
+
const family = (0, node_net_1.isIP)(normalized);
|
|
56
|
+
if (family === 4) {
|
|
57
|
+
return !BLOCKED_IPV4.check(normalized, 'ipv4');
|
|
58
|
+
}
|
|
59
|
+
if (family === 6) {
|
|
60
|
+
return !BLOCKED_IPV6.check(normalized, 'ipv6');
|
|
61
|
+
}
|
|
62
|
+
return false;
|
|
63
|
+
}
|
|
64
|
+
function normalizeMappedIpv4(address) {
|
|
65
|
+
const match = /^::ffff:(\d{1,3}(?:\.\d{1,3}){3})$/iu.exec(address);
|
|
66
|
+
return match ? match[1] : address;
|
|
67
|
+
}
|
|
68
|
+
/** Resolves every address of a probe hostname; injected in tests. */
|
|
69
|
+
async function resolveHostAddresses(hostname) {
|
|
70
|
+
const records = await node_dns_1.default.promises.lookup(hostname, { all: true });
|
|
71
|
+
return records.map((record) => record.address);
|
|
72
|
+
}
|
|
73
|
+
/**
|
|
74
|
+
* Decides whether a probe target may be contacted.
|
|
75
|
+
*
|
|
76
|
+
* Every resolved address has to be public, so a hostname that mixes public and private
|
|
77
|
+
* records is refused instead of racing whichever record the connection picks.
|
|
78
|
+
*/
|
|
79
|
+
async function assertPublicProbeTarget(url, resolveAddresses = resolveHostAddresses) {
|
|
80
|
+
if (url.protocol !== 'http:' && url.protocol !== 'https:') {
|
|
81
|
+
return { allowed: false, reason: `unsupported-scheme:${url.protocol}` };
|
|
82
|
+
}
|
|
83
|
+
const hostname = url.hostname.replace(/^\[/u, '').replace(/\]$/u, '');
|
|
84
|
+
if ((0, node_net_1.isIP)(hostname) !== 0) {
|
|
85
|
+
return isPublicIpAddress(hostname)
|
|
86
|
+
? { allowed: true, address: hostname }
|
|
87
|
+
: { allowed: false, reason: `non-public-address:${hostname}` };
|
|
88
|
+
}
|
|
89
|
+
let addresses;
|
|
90
|
+
try {
|
|
91
|
+
addresses = await resolveAddresses(hostname);
|
|
92
|
+
}
|
|
93
|
+
catch (error) {
|
|
94
|
+
return { allowed: false, reason: `unresolvable:${error.message}` };
|
|
95
|
+
}
|
|
96
|
+
if (addresses.length === 0) {
|
|
97
|
+
return { allowed: false, reason: 'unresolvable' };
|
|
98
|
+
}
|
|
99
|
+
const blocked = addresses.find((address) => !isPublicIpAddress(address));
|
|
100
|
+
if (blocked) {
|
|
101
|
+
return { allowed: false, reason: `non-public-address:${blocked}` };
|
|
102
|
+
}
|
|
103
|
+
return { allowed: true, address: addresses[0] };
|
|
104
|
+
}
|
|
105
|
+
/**
|
|
106
|
+
* HEAD request pinned to a validated address.
|
|
107
|
+
*
|
|
108
|
+
* Pinning is what makes the DNS check meaningful: without it the client would resolve the
|
|
109
|
+
* hostname a second time and a rebinding answer could still reach a private address.
|
|
110
|
+
*/
|
|
111
|
+
function createPinnedHeadProbeRequest() {
|
|
112
|
+
return (url, { address, timeoutMs }) => new Promise((resolve, reject) => {
|
|
113
|
+
const transport = url.protocol === 'https:' ? node_https_1.default : node_http_1.default;
|
|
114
|
+
const request = transport.request({
|
|
115
|
+
protocol: url.protocol,
|
|
116
|
+
hostname: url.hostname,
|
|
117
|
+
port: url.port || (url.protocol === 'https:' ? 443 : 80),
|
|
118
|
+
path: `${url.pathname}${url.search}`,
|
|
119
|
+
method: 'HEAD',
|
|
120
|
+
timeout: timeoutMs,
|
|
121
|
+
lookup: (_hostname, options, callback) => {
|
|
122
|
+
const entry = { address, family: (0, node_net_1.isIP)(address) === 6 ? 6 : 4 };
|
|
123
|
+
// Node asks for every family when happy-eyeballs is enabled.
|
|
124
|
+
if (options && typeof options === 'object' && options.all) {
|
|
125
|
+
callback(null, [entry]);
|
|
126
|
+
return;
|
|
127
|
+
}
|
|
128
|
+
callback(null, entry.address, entry.family);
|
|
129
|
+
},
|
|
130
|
+
}, (response) => {
|
|
131
|
+
response.resume();
|
|
132
|
+
resolve({
|
|
133
|
+
status: response.statusCode ?? 0,
|
|
134
|
+
location: typeof response.headers.location === 'string' ? response.headers.location : undefined,
|
|
135
|
+
});
|
|
136
|
+
});
|
|
137
|
+
request.on('timeout', () => request.destroy(new Error('probe-timeout')));
|
|
138
|
+
request.on('error', reject);
|
|
139
|
+
request.end();
|
|
140
|
+
});
|
|
141
|
+
}
|
|
142
|
+
//# sourceMappingURL=ProbeTargetGuard.js.map
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import type { PodLookupRepository } from '../../identity/drizzle/PodLookupRepository';
|
|
2
|
+
/**
|
|
3
|
+
* Whether a Solid principal may act on an edge node.
|
|
4
|
+
*
|
|
5
|
+
* Reachability sessions expose a node's private candidates, so "is authenticated" is not
|
|
6
|
+
* enough: the caller has to be related to that node (Pod ownership, or an explicit grant
|
|
7
|
+
* once one exists).
|
|
8
|
+
*/
|
|
9
|
+
export type NodeAccessResolver = (nodeId: string, webId: string) => Promise<boolean>;
|
|
10
|
+
/**
|
|
11
|
+
* Authorizes a WebID for a node when one of the node's Pods is owned by that WebID.
|
|
12
|
+
*
|
|
13
|
+
* A missing repository resolves to "no access" rather than "no restriction": the caller
|
|
14
|
+
* decides what to do with an unprovable relationship, and the reachability handler denies.
|
|
15
|
+
*/
|
|
16
|
+
export declare function createPodOwnershipNodeAccessResolver(podLookupRepository: Pick<PodLookupRepository, 'listAllPods'> | undefined): NodeAccessResolver;
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.createPodOwnershipNodeAccessResolver = createPodOwnershipNodeAccessResolver;
|
|
4
|
+
const global_logger_factory_1 = require("global-logger-factory");
|
|
5
|
+
/**
|
|
6
|
+
* Authorizes a WebID for a node when one of the node's Pods is owned by that WebID.
|
|
7
|
+
*
|
|
8
|
+
* A missing repository resolves to "no access" rather than "no restriction": the caller
|
|
9
|
+
* decides what to do with an unprovable relationship, and the reachability handler denies.
|
|
10
|
+
*/
|
|
11
|
+
function createPodOwnershipNodeAccessResolver(podLookupRepository) {
|
|
12
|
+
const logger = (0, global_logger_factory_1.getLoggerFor)('NodeAccessResolver');
|
|
13
|
+
return async (nodeId, webId) => {
|
|
14
|
+
if (!podLookupRepository) {
|
|
15
|
+
return false;
|
|
16
|
+
}
|
|
17
|
+
try {
|
|
18
|
+
const pods = await podLookupRepository.listAllPods();
|
|
19
|
+
return pods.some((pod) => {
|
|
20
|
+
const hosted = pod.nodeId === nodeId || pod.edgeNodeId === nodeId;
|
|
21
|
+
return hosted && (pod.webId === webId || (pod.webIds ?? []).includes(webId));
|
|
22
|
+
});
|
|
23
|
+
}
|
|
24
|
+
catch (error) {
|
|
25
|
+
logger.warn(`Failed to resolve node access for ${nodeId}/${webId}: ${error.message}`);
|
|
26
|
+
return false;
|
|
27
|
+
}
|
|
28
|
+
};
|
|
29
|
+
}
|
|
30
|
+
//# sourceMappingURL=NodeAccessResolver.js.map
|
package/dist/index.d.ts
CHANGED
|
@@ -51,6 +51,8 @@ import { SimpleEdgeNodeTunnelManager, NoopEdgeNodeTunnelManager } from './edge/E
|
|
|
51
51
|
import { FrpTunnelManager } from './edge/FrpTunnelManager';
|
|
52
52
|
import { AcmeCertificateManager } from './edge/acme/AcmeCertificateManager';
|
|
53
53
|
import { EdgeNodeHealthProbeService } from './edge/EdgeNodeHealthProbeService';
|
|
54
|
+
import { assertPublicProbeTarget, createPinnedHeadProbeRequest, isPublicIpAddress } from './edge/ProbeTargetGuard';
|
|
55
|
+
import { createPodOwnershipNodeAccessResolver } from './edge/reachability/NodeAccessResolver';
|
|
54
56
|
import { EdgeNodeAgent } from './edge/EdgeNodeAgent';
|
|
55
57
|
import { EdgeNodeAgentInitializer } from './edge/EdgeNodeAgentInitializer';
|
|
56
58
|
import { EdgeNodeCertificateService } from './service/EdgeNodeCertificateService';
|
|
@@ -125,6 +127,6 @@ export type { OwnedWebIdEntry, PodOwnershipResolver, PodOwnershipTarget, CssPodO
|
|
|
125
127
|
export type { TunnelProvider, TunnelConfig, TunnelSetupOptions, TunnelStatus, } from './tunnel/TunnelProvider';
|
|
126
128
|
export type { SubdomainRegistration, ConnectivityResult, SubdomainServiceOptions, } from './subdomain/SubdomainService';
|
|
127
129
|
export { AppStaticAssetHandler } from './http/AppStaticAssetHandler';
|
|
128
|
-
export { RepresentationPartialConvertingStore, MinioDataAccessor, SolidRdfDataAccessor, MixDataAccessor, ConfigurableLoggerFactory, resolveLogFilePattern, resolveCurrentLogFile, LOG_FILE_PATTERN, SparqlUpdateResourceStore, SubgraphQueryEngine, SubgraphSparqlHttpHandler, InternalPodDataHttpHandler, 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, 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, };
|
|
130
|
+
export { RepresentationPartialConvertingStore, MinioDataAccessor, SolidRdfDataAccessor, MixDataAccessor, ConfigurableLoggerFactory, resolveLogFilePattern, resolveCurrentLogFile, LOG_FILE_PATTERN, SparqlUpdateResourceStore, SubgraphQueryEngine, SubgraphSparqlHttpHandler, InternalPodDataHttpHandler, 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
131
|
export type { ResourceChangeEvent, ResourceChangeListener, ResourceChangeRecorder, } from './storage/ObservableResourceStore';
|
|
130
132
|
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.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.InternalPodDataHttpHandler = 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.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 = exports.isPublicIpAddress = 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 = exports.RememberedClientPromptFactory = 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; } });
|
|
@@ -111,6 +111,12 @@ const AcmeCertificateManager_1 = require("./edge/acme/AcmeCertificateManager");
|
|
|
111
111
|
Object.defineProperty(exports, "AcmeCertificateManager", { enumerable: true, get: function () { return AcmeCertificateManager_1.AcmeCertificateManager; } });
|
|
112
112
|
const EdgeNodeHealthProbeService_1 = require("./edge/EdgeNodeHealthProbeService");
|
|
113
113
|
Object.defineProperty(exports, "EdgeNodeHealthProbeService", { enumerable: true, get: function () { return EdgeNodeHealthProbeService_1.EdgeNodeHealthProbeService; } });
|
|
114
|
+
const ProbeTargetGuard_1 = require("./edge/ProbeTargetGuard");
|
|
115
|
+
Object.defineProperty(exports, "assertPublicProbeTarget", { enumerable: true, get: function () { return ProbeTargetGuard_1.assertPublicProbeTarget; } });
|
|
116
|
+
Object.defineProperty(exports, "createPinnedHeadProbeRequest", { enumerable: true, get: function () { return ProbeTargetGuard_1.createPinnedHeadProbeRequest; } });
|
|
117
|
+
Object.defineProperty(exports, "isPublicIpAddress", { enumerable: true, get: function () { return ProbeTargetGuard_1.isPublicIpAddress; } });
|
|
118
|
+
const NodeAccessResolver_1 = require("./edge/reachability/NodeAccessResolver");
|
|
119
|
+
Object.defineProperty(exports, "createPodOwnershipNodeAccessResolver", { enumerable: true, get: function () { return NodeAccessResolver_1.createPodOwnershipNodeAccessResolver; } });
|
|
114
120
|
const EdgeNodeAgent_1 = require("./edge/EdgeNodeAgent");
|
|
115
121
|
Object.defineProperty(exports, "EdgeNodeAgent", { enumerable: true, get: function () { return EdgeNodeAgent_1.EdgeNodeAgent; } });
|
|
116
122
|
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}`,
|