@undefineds.co/xpod 0.1.0-local.202602081751
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/LICENSE +22 -0
- package/README.md +146 -0
- package/components/components.jsonld +72 -0
- package/components/context.jsonld +1635 -0
- package/config/bun.json +90 -0
- package/config/cli.json +260 -0
- package/config/cloud.json +469 -0
- package/config/extensions.local.initializer.json +23 -0
- package/config/local.json +261 -0
- package/config/logging/configurable.json +18 -0
- package/config/main.json +200 -0
- package/config/main.vanilla.json +6 -0
- package/config/resolver.json +347 -0
- package/config/search.json +66 -0
- package/config/seed.dev.json +29 -0
- package/config/seeds/admin.example.json +11 -0
- package/config/seeds/test.json +11 -0
- package/config/terminal.json +22 -0
- package/config/vector.json +35 -0
- package/config/xpod.base.json +155 -0
- package/config/xpod.cluster.json +419 -0
- package/config/xpod.json +233 -0
- package/dist/agents/AgentExecutorFactory.d.ts +67 -0
- package/dist/agents/AgentExecutorFactory.js +193 -0
- package/dist/agents/AgentExecutorFactory.js.map +1 -0
- package/dist/agents/AgentManager.d.ts +114 -0
- package/dist/agents/AgentManager.js +289 -0
- package/dist/agents/AgentManager.js.map +1 -0
- package/dist/agents/BaseAgentExecutor.d.ts +67 -0
- package/dist/agents/BaseAgentExecutor.js +101 -0
- package/dist/agents/BaseAgentExecutor.js.map +1 -0
- package/dist/agents/ClaudeExecutor.d.ts +63 -0
- package/dist/agents/ClaudeExecutor.js +335 -0
- package/dist/agents/ClaudeExecutor.js.map +1 -0
- package/dist/agents/CodeBuddyExecutor.d.ts +54 -0
- package/dist/agents/CodeBuddyExecutor.js +273 -0
- package/dist/agents/CodeBuddyExecutor.js.map +1 -0
- package/dist/agents/IndexAgent.d.ts +70 -0
- package/dist/agents/IndexAgent.js +417 -0
- package/dist/agents/IndexAgent.js.map +1 -0
- package/dist/agents/index.d.ts +22 -0
- package/dist/agents/index.js +48 -0
- package/dist/agents/index.js.map +1 -0
- package/dist/agents/schema/agent-config.d.ts +58 -0
- package/dist/agents/schema/agent-config.js +74 -0
- package/dist/agents/schema/agent-config.js.map +1 -0
- package/dist/agents/schema/tables.d.ts +46 -0
- package/dist/agents/schema/tables.js +64 -0
- package/dist/agents/schema/tables.js.map +1 -0
- package/dist/agents/types.d.ts +266 -0
- package/dist/agents/types.js +9 -0
- package/dist/agents/types.js.map +1 -0
- package/dist/ai/index.d.ts +5 -0
- package/dist/ai/index.js +22 -0
- package/dist/ai/index.js.map +1 -0
- package/dist/ai/schema/config.d.ts +27 -0
- package/dist/ai/schema/config.js +36 -0
- package/dist/ai/schema/config.js.map +1 -0
- package/dist/ai/schema/index.d.ts +8 -0
- package/dist/ai/schema/index.js +27 -0
- package/dist/ai/schema/index.js.map +1 -0
- package/dist/ai/schema/model.d.ts +40 -0
- package/dist/ai/schema/model.js +60 -0
- package/dist/ai/schema/model.js.map +1 -0
- package/dist/ai/schema/provider.d.ts +21 -0
- package/dist/ai/schema/provider.js +30 -0
- package/dist/ai/schema/provider.js.map +1 -0
- package/dist/ai/schema/types.d.ts +52 -0
- package/dist/ai/schema/types.js +62 -0
- package/dist/ai/schema/types.js.map +1 -0
- package/dist/ai/schema/vector-store.d.ts +53 -0
- package/dist/ai/schema/vector-store.js +65 -0
- package/dist/ai/schema/vector-store.js.map +1 -0
- package/dist/ai/service/CredentialReader.d.ts +7 -0
- package/dist/ai/service/CredentialReader.js +10 -0
- package/dist/ai/service/CredentialReader.js.map +1 -0
- package/dist/ai/service/CredentialReaderImpl.d.ts +6 -0
- package/dist/ai/service/CredentialReaderImpl.js +55 -0
- package/dist/ai/service/CredentialReaderImpl.js.map +1 -0
- package/dist/ai/service/EmbeddingService.d.ts +8 -0
- package/dist/ai/service/EmbeddingService.js +10 -0
- package/dist/ai/service/EmbeddingService.js.map +1 -0
- package/dist/ai/service/EmbeddingServiceImpl.d.ts +11 -0
- package/dist/ai/service/EmbeddingServiceImpl.js +73 -0
- package/dist/ai/service/EmbeddingServiceImpl.js.map +1 -0
- package/dist/ai/service/ProviderRegistry.d.ts +26 -0
- package/dist/ai/service/ProviderRegistry.js +10 -0
- package/dist/ai/service/ProviderRegistry.js.map +1 -0
- package/dist/ai/service/ProviderRegistryImpl.d.ts +14 -0
- package/dist/ai/service/ProviderRegistryImpl.js +112 -0
- package/dist/ai/service/ProviderRegistryImpl.js.map +1 -0
- package/dist/ai/service/index.d.ts +10 -0
- package/dist/ai/service/index.js +29 -0
- package/dist/ai/service/index.js.map +1 -0
- package/dist/ai/service/types.d.ts +12 -0
- package/dist/ai/service/types.js +6 -0
- package/dist/ai/service/types.js.map +1 -0
- package/dist/api/ApiServer.d.ts +77 -0
- package/dist/api/ApiServer.js +191 -0
- package/dist/api/ApiServer.js.map +1 -0
- package/dist/api/auth/AuthContext.d.ts +41 -0
- package/dist/api/auth/AuthContext.js +44 -0
- package/dist/api/auth/AuthContext.js.map +1 -0
- package/dist/api/auth/Authenticator.d.ts +23 -0
- package/dist/api/auth/Authenticator.js +3 -0
- package/dist/api/auth/Authenticator.js.map +1 -0
- package/dist/api/auth/ClientCredentialsAuthenticator.d.ts +56 -0
- package/dist/api/auth/ClientCredentialsAuthenticator.js +191 -0
- package/dist/api/auth/ClientCredentialsAuthenticator.js.map +1 -0
- package/dist/api/auth/MultiAuthenticator.d.ts +15 -0
- package/dist/api/auth/MultiAuthenticator.js +36 -0
- package/dist/api/auth/MultiAuthenticator.js.map +1 -0
- package/dist/api/auth/NodeTokenAuthenticator.d.ts +21 -0
- package/dist/api/auth/NodeTokenAuthenticator.js +124 -0
- package/dist/api/auth/NodeTokenAuthenticator.js.map +1 -0
- package/dist/api/auth/SolidTokenAuthenticator.d.ts +27 -0
- package/dist/api/auth/SolidTokenAuthenticator.js +144 -0
- package/dist/api/auth/SolidTokenAuthenticator.js.map +1 -0
- package/dist/api/auth/index.d.ts +5 -0
- package/dist/api/auth/index.js +23 -0
- package/dist/api/auth/index.js.map +1 -0
- package/dist/api/chatkit/ai-provider.d.ts +44 -0
- package/dist/api/chatkit/ai-provider.js +157 -0
- package/dist/api/chatkit/ai-provider.js.map +1 -0
- package/dist/api/chatkit/index.d.ts +11 -0
- package/dist/api/chatkit/index.js +44 -0
- package/dist/api/chatkit/index.js.map +1 -0
- package/dist/api/chatkit/pod-store.d.ts +154 -0
- package/dist/api/chatkit/pod-store.js +794 -0
- package/dist/api/chatkit/pod-store.js.map +1 -0
- package/dist/api/chatkit/schema.d.ts +139 -0
- package/dist/api/chatkit/schema.js +168 -0
- package/dist/api/chatkit/schema.js.map +1 -0
- package/dist/api/chatkit/service.d.ts +143 -0
- package/dist/api/chatkit/service.js +442 -0
- package/dist/api/chatkit/service.js.map +1 -0
- package/dist/api/chatkit/store.d.ts +63 -0
- package/dist/api/chatkit/store.js +178 -0
- package/dist/api/chatkit/store.js.map +1 -0
- package/dist/api/chatkit/types.d.ts +461 -0
- package/dist/api/chatkit/types.js +50 -0
- package/dist/api/chatkit/types.js.map +1 -0
- package/dist/api/container/cloud.d.ts +12 -0
- package/dist/api/container/cloud.js +97 -0
- package/dist/api/container/cloud.js.map +1 -0
- package/dist/api/container/common.d.ts +11 -0
- package/dist/api/container/common.js +82 -0
- package/dist/api/container/common.js.map +1 -0
- package/dist/api/container/index.d.ts +16 -0
- package/dist/api/container/index.js +90 -0
- package/dist/api/container/index.js.map +1 -0
- package/dist/api/container/local.d.ts +13 -0
- package/dist/api/container/local.js +197 -0
- package/dist/api/container/local.js.map +1 -0
- package/dist/api/container/routes.d.ts +11 -0
- package/dist/api/container/routes.js +129 -0
- package/dist/api/container/routes.js.map +1 -0
- package/dist/api/container/types.d.ts +92 -0
- package/dist/api/container/types.js +8 -0
- package/dist/api/container/types.js.map +1 -0
- package/dist/api/handlers/AdminHandler.d.ts +6 -0
- package/dist/api/handlers/AdminHandler.js +330 -0
- package/dist/api/handlers/AdminHandler.js.map +1 -0
- package/dist/api/handlers/ApiKeyHandler.d.ts +15 -0
- package/dist/api/handlers/ApiKeyHandler.js +159 -0
- package/dist/api/handlers/ApiKeyHandler.js.map +1 -0
- package/dist/api/handlers/ChatHandler.d.ts +60 -0
- package/dist/api/handlers/ChatHandler.js +230 -0
- package/dist/api/handlers/ChatHandler.js.map +1 -0
- package/dist/api/handlers/ChatKitHandler.d.ts +18 -0
- package/dist/api/handlers/ChatKitHandler.js +151 -0
- package/dist/api/handlers/ChatKitHandler.js.map +1 -0
- package/dist/api/handlers/DashboardHandler.d.ts +14 -0
- package/dist/api/handlers/DashboardHandler.js +117 -0
- package/dist/api/handlers/DashboardHandler.js.map +1 -0
- package/dist/api/handlers/DdnsHandler.d.ts +19 -0
- package/dist/api/handlers/DdnsHandler.js +306 -0
- package/dist/api/handlers/DdnsHandler.js.map +1 -0
- package/dist/api/handlers/DevHandler.d.ts +18 -0
- package/dist/api/handlers/DevHandler.js +276 -0
- package/dist/api/handlers/DevHandler.js.map +1 -0
- package/dist/api/handlers/NodeHandler.d.ts +16 -0
- package/dist/api/handlers/NodeHandler.js +190 -0
- package/dist/api/handlers/NodeHandler.js.map +1 -0
- package/dist/api/handlers/PodManagementHandler.d.ts +39 -0
- package/dist/api/handlers/PodManagementHandler.js +294 -0
- package/dist/api/handlers/PodManagementHandler.js.map +1 -0
- package/dist/api/handlers/QuotaHandler.d.ts +21 -0
- package/dist/api/handlers/QuotaHandler.js +209 -0
- package/dist/api/handlers/QuotaHandler.js.map +1 -0
- package/dist/api/handlers/SignalHandler.d.ts +13 -0
- package/dist/api/handlers/SignalHandler.js +122 -0
- package/dist/api/handlers/SignalHandler.js.map +1 -0
- package/dist/api/handlers/SubdomainClientHandler.d.ts +24 -0
- package/dist/api/handlers/SubdomainClientHandler.js +169 -0
- package/dist/api/handlers/SubdomainClientHandler.js.map +1 -0
- package/dist/api/handlers/SubdomainHandler.d.ts +17 -0
- package/dist/api/handlers/SubdomainHandler.js +312 -0
- package/dist/api/handlers/SubdomainHandler.js.map +1 -0
- package/dist/api/handlers/VectorHandler.d.ts +15 -0
- package/dist/api/handlers/VectorHandler.js +293 -0
- package/dist/api/handlers/VectorHandler.js.map +1 -0
- package/dist/api/handlers/VectorStoreHandler.d.ts +20 -0
- package/dist/api/handlers/VectorStoreHandler.js +348 -0
- package/dist/api/handlers/VectorStoreHandler.js.map +1 -0
- package/dist/api/handlers/VectorStoreWebhookHandler.d.ts +74 -0
- package/dist/api/handlers/VectorStoreWebhookHandler.js +121 -0
- package/dist/api/handlers/VectorStoreWebhookHandler.js.map +1 -0
- package/dist/api/handlers/WebIdProfileHandler.d.ts +14 -0
- package/dist/api/handlers/WebIdProfileHandler.js +204 -0
- package/dist/api/handlers/WebIdProfileHandler.js.map +1 -0
- package/dist/api/handlers/index.d.ts +11 -0
- package/dist/api/handlers/index.js +28 -0
- package/dist/api/handlers/index.js.map +1 -0
- package/dist/api/index.d.ts +12 -0
- package/dist/api/index.js +29 -0
- package/dist/api/index.js.map +1 -0
- package/dist/api/main.d.ts +14 -0
- package/dist/api/main.js +106 -0
- package/dist/api/main.js.map +1 -0
- package/dist/api/middleware/AuthMiddleware.d.ts +35 -0
- package/dist/api/middleware/AuthMiddleware.js +51 -0
- package/dist/api/middleware/AuthMiddleware.js.map +1 -0
- package/dist/api/middleware/index.d.ts +1 -0
- package/dist/api/middleware/index.js +18 -0
- package/dist/api/middleware/index.js.map +1 -0
- package/dist/api/models/model-provider.schema.d.ts +12 -0
- package/dist/api/models/model-provider.schema.js +21 -0
- package/dist/api/models/model-provider.schema.js.map +1 -0
- package/dist/api/models/namespaces.d.ts +9 -0
- package/dist/api/models/namespaces.js +34 -0
- package/dist/api/models/namespaces.js.map +1 -0
- package/dist/api/service/InternalPodService.d.ts +19 -0
- package/dist/api/service/InternalPodService.js +82 -0
- package/dist/api/service/InternalPodService.js.map +1 -0
- package/dist/api/service/VectorService.d.ts +156 -0
- package/dist/api/service/VectorService.js +202 -0
- package/dist/api/service/VectorService.js.map +1 -0
- package/dist/api/service/VectorStoreService.d.ts +262 -0
- package/dist/api/service/VectorStoreService.js +985 -0
- package/dist/api/service/VectorStoreService.js.map +1 -0
- package/dist/api/service/VercelChatService.d.ts +28 -0
- package/dist/api/service/VercelChatService.js +289 -0
- package/dist/api/service/VercelChatService.js.map +1 -0
- package/dist/api/store/DrizzleClientCredentialsStore.d.ts +56 -0
- package/dist/api/store/DrizzleClientCredentialsStore.js +145 -0
- package/dist/api/store/DrizzleClientCredentialsStore.js.map +1 -0
- package/dist/api/store/index.d.ts +1 -0
- package/dist/api/store/index.js +18 -0
- package/dist/api/store/index.js.map +1 -0
- package/dist/components/components.jsonld +88 -0
- package/dist/components/context.jsonld +1962 -0
- package/dist/credential/index.d.ts +1 -0
- package/dist/credential/index.js +18 -0
- package/dist/credential/index.js.map +1 -0
- package/dist/credential/schema/index.d.ts +2 -0
- package/dist/credential/schema/index.js +19 -0
- package/dist/credential/schema/index.js.map +1 -0
- package/dist/credential/schema/tables.d.ts +31 -0
- package/dist/credential/schema/tables.js +42 -0
- package/dist/credential/schema/tables.js.map +1 -0
- package/dist/credential/schema/types.d.ts +20 -0
- package/dist/credential/schema/types.js +26 -0
- package/dist/credential/schema/types.js.map +1 -0
- package/dist/dns/DnsProvider.d.ts +46 -0
- package/dist/dns/DnsProvider.js +3 -0
- package/dist/dns/DnsProvider.js.map +1 -0
- package/dist/dns/DnsProvider.jsonld +161 -0
- package/dist/dns/cloudflare/CloudflareDnsProvider.d.ts +51 -0
- package/dist/dns/cloudflare/CloudflareDnsProvider.js +227 -0
- package/dist/dns/cloudflare/CloudflareDnsProvider.js.map +1 -0
- package/dist/dns/cloudflare/index.d.ts +1 -0
- package/dist/dns/cloudflare/index.js +18 -0
- package/dist/dns/cloudflare/index.js.map +1 -0
- package/dist/dns/tencent/TencentDnsProvider.d.ts +42 -0
- package/dist/dns/tencent/TencentDnsProvider.js +221 -0
- package/dist/dns/tencent/TencentDnsProvider.js.map +1 -0
- package/dist/dns/tencent/TencentDnsProvider.jsonld +239 -0
- package/dist/document/Chunker.d.ts +64 -0
- package/dist/document/Chunker.js +8 -0
- package/dist/document/Chunker.js.map +1 -0
- package/dist/document/DocumentParser.d.ts +58 -0
- package/dist/document/DocumentParser.js +8 -0
- package/dist/document/DocumentParser.js.map +1 -0
- package/dist/document/HeadingChunker.d.ts +34 -0
- package/dist/document/HeadingChunker.js +182 -0
- package/dist/document/HeadingChunker.js.map +1 -0
- package/dist/document/JinaDocumentParser.d.ts +40 -0
- package/dist/document/JinaDocumentParser.js +129 -0
- package/dist/document/JinaDocumentParser.js.map +1 -0
- package/dist/document/index.d.ts +7 -0
- package/dist/document/index.js +26 -0
- package/dist/document/index.js.map +1 -0
- package/dist/edge/DdnsManager.d.ts +53 -0
- package/dist/edge/DdnsManager.js +153 -0
- package/dist/edge/DdnsManager.js.map +1 -0
- package/dist/edge/Dns01CertificateProvisioner.d.ts +27 -0
- package/dist/edge/Dns01CertificateProvisioner.js +160 -0
- package/dist/edge/Dns01CertificateProvisioner.js.map +1 -0
- package/dist/edge/Dns01CertificateProvisioner.jsonld +148 -0
- package/dist/edge/EdgeNodeAgent.d.ts +56 -0
- package/dist/edge/EdgeNodeAgent.js +230 -0
- package/dist/edge/EdgeNodeAgent.js.map +1 -0
- package/dist/edge/EdgeNodeAgent.jsonld +89 -0
- package/dist/edge/EdgeNodeAgentInitializer.d.ts +25 -0
- package/dist/edge/EdgeNodeAgentInitializer.js +64 -0
- package/dist/edge/EdgeNodeAgentInitializer.js.map +1 -0
- package/dist/edge/EdgeNodeCapabilityDetector.d.ts +98 -0
- package/dist/edge/EdgeNodeCapabilityDetector.js +425 -0
- package/dist/edge/EdgeNodeCapabilityDetector.js.map +1 -0
- package/dist/edge/EdgeNodeCertificateProvisioner.d.ts +3 -0
- package/dist/edge/EdgeNodeCertificateProvisioner.js +3 -0
- package/dist/edge/EdgeNodeCertificateProvisioner.js.map +1 -0
- package/dist/edge/EdgeNodeCertificateProvisioner.jsonld +21 -0
- package/dist/edge/EdgeNodeDnsCoordinator.d.ts +38 -0
- package/dist/edge/EdgeNodeDnsCoordinator.js +201 -0
- package/dist/edge/EdgeNodeDnsCoordinator.js.map +1 -0
- package/dist/edge/EdgeNodeDnsCoordinator.jsonld +212 -0
- package/dist/edge/EdgeNodeHealthProbeService.d.ts +25 -0
- package/dist/edge/EdgeNodeHealthProbeService.js +208 -0
- package/dist/edge/EdgeNodeHealthProbeService.js.map +1 -0
- package/dist/edge/EdgeNodeHealthProbeService.jsonld +176 -0
- package/dist/edge/EdgeNodeModeDetector.d.ts +50 -0
- package/dist/edge/EdgeNodeModeDetector.js +194 -0
- package/dist/edge/EdgeNodeModeDetector.js.map +1 -0
- package/dist/edge/EdgeNodeModeDetector.jsonld +114 -0
- package/dist/edge/EdgeNodeTunnelManager.d.ts +23 -0
- package/dist/edge/EdgeNodeTunnelManager.js +99 -0
- package/dist/edge/EdgeNodeTunnelManager.js.map +1 -0
- package/dist/edge/EdgeNodeTunnelManager.jsonld +128 -0
- package/dist/edge/FrpTunnelManager.d.ts +30 -0
- package/dist/edge/FrpTunnelManager.js +151 -0
- package/dist/edge/FrpTunnelManager.js.map +1 -0
- package/dist/edge/FrpTunnelManager.jsonld +192 -0
- package/dist/edge/LocalNetworkManager.d.ts +41 -0
- package/dist/edge/LocalNetworkManager.js +115 -0
- package/dist/edge/LocalNetworkManager.js.map +1 -0
- package/dist/edge/acme/AcmeCertificateManager.d.ts +65 -0
- package/dist/edge/acme/AcmeCertificateManager.js +233 -0
- package/dist/edge/acme/AcmeCertificateManager.js.map +1 -0
- package/dist/edge/acme/AcmeCertificateManager.jsonld +373 -0
- package/dist/edge/acme/ClusterCertificateManager.d.ts +40 -0
- package/dist/edge/acme/ClusterCertificateManager.js +184 -0
- package/dist/edge/acme/ClusterCertificateManager.js.map +1 -0
- package/dist/edge/acme/DnsChallengeClient.d.ts +15 -0
- package/dist/edge/acme/DnsChallengeClient.js +40 -0
- package/dist/edge/acme/DnsChallengeClient.js.map +1 -0
- package/dist/edge/acme/utils.d.ts +4 -0
- package/dist/edge/acme/utils.js +17 -0
- package/dist/edge/acme/utils.js.map +1 -0
- package/dist/edge/frp/FrpRelay.d.ts +11 -0
- package/dist/edge/frp/FrpRelay.js +29 -0
- package/dist/edge/frp/FrpRelay.js.map +1 -0
- package/dist/edge/frp/FrpcProcessManager.d.ts +51 -0
- package/dist/edge/frp/FrpcProcessManager.js +174 -0
- package/dist/edge/frp/FrpcProcessManager.js.map +1 -0
- package/dist/edge/interfaces/EdgeNodeTunnelManager.d.ts +6 -0
- package/dist/edge/interfaces/EdgeNodeTunnelManager.js +3 -0
- package/dist/edge/interfaces/EdgeNodeTunnelManager.js.map +1 -0
- package/dist/edge/interfaces/EdgeNodeTunnelManager.jsonld +21 -0
- package/dist/embedding/CredentialReader.d.ts +7 -0
- package/dist/embedding/CredentialReader.js +10 -0
- package/dist/embedding/CredentialReader.js.map +1 -0
- package/dist/embedding/CredentialReader.jsonld +22 -0
- package/dist/embedding/CredentialReaderImpl.d.ts +6 -0
- package/dist/embedding/CredentialReaderImpl.js +55 -0
- package/dist/embedding/CredentialReaderImpl.js.map +1 -0
- package/dist/embedding/CredentialReaderImpl.jsonld +31 -0
- package/dist/embedding/EmbeddingService.d.ts +8 -0
- package/dist/embedding/EmbeddingService.js +10 -0
- package/dist/embedding/EmbeddingService.js.map +1 -0
- package/dist/embedding/EmbeddingService.jsonld +26 -0
- package/dist/embedding/EmbeddingServiceImpl.d.ts +11 -0
- package/dist/embedding/EmbeddingServiceImpl.js +73 -0
- package/dist/embedding/EmbeddingServiceImpl.js.map +1 -0
- package/dist/embedding/EmbeddingServiceImpl.jsonld +53 -0
- package/dist/embedding/ProviderRegistry.d.ts +26 -0
- package/dist/embedding/ProviderRegistry.js +10 -0
- package/dist/embedding/ProviderRegistry.js.map +1 -0
- package/dist/embedding/ProviderRegistry.jsonld +30 -0
- package/dist/embedding/ProviderRegistryImpl.d.ts +14 -0
- package/dist/embedding/ProviderRegistryImpl.js +112 -0
- package/dist/embedding/ProviderRegistryImpl.js.map +1 -0
- package/dist/embedding/ProviderRegistryImpl.jsonld +40 -0
- package/dist/embedding/index.d.ts +5 -0
- package/dist/embedding/index.js +22 -0
- package/dist/embedding/index.js.map +1 -0
- package/dist/embedding/schema/index.d.ts +1 -0
- package/dist/embedding/schema/index.js +18 -0
- package/dist/embedding/schema/index.js.map +1 -0
- package/dist/embedding/schema/tables.d.ts +70 -0
- package/dist/embedding/schema/tables.js +102 -0
- package/dist/embedding/schema/tables.js.map +1 -0
- package/dist/embedding/types.d.ts +12 -0
- package/dist/embedding/types.js +6 -0
- package/dist/embedding/types.js.map +1 -0
- package/dist/gateway/port-finder.d.ts +4 -0
- package/dist/gateway/port-finder.js +15 -0
- package/dist/gateway/port-finder.js.map +1 -0
- package/dist/gateway/proxy.d.ts +22 -0
- package/dist/gateway/proxy.js +149 -0
- package/dist/gateway/proxy.js.map +1 -0
- package/dist/gateway/supervisor.d.ts +2 -0
- package/dist/gateway/supervisor.js +7 -0
- package/dist/gateway/supervisor.js.map +1 -0
- package/dist/gateway/types.d.ts +1 -0
- package/dist/gateway/types.js +3 -0
- package/dist/gateway/types.js.map +1 -0
- package/dist/http/AppStaticAssetHandler.d.ts +8 -0
- package/dist/http/AppStaticAssetHandler.js +27 -0
- package/dist/http/AppStaticAssetHandler.js.map +1 -0
- package/dist/http/AppStaticAssetHandler.jsonld +26 -0
- package/dist/http/ClusterIngressRouter.d.ts +93 -0
- package/dist/http/ClusterIngressRouter.js +355 -0
- package/dist/http/ClusterIngressRouter.js.map +1 -0
- package/dist/http/ClusterIngressRouter.jsonld +227 -0
- package/dist/http/ClusterWebSocketConfigurator.d.ts +59 -0
- package/dist/http/ClusterWebSocketConfigurator.js +226 -0
- package/dist/http/ClusterWebSocketConfigurator.js.map +1 -0
- package/dist/http/ClusterWebSocketConfigurator.jsonld +145 -0
- package/dist/http/EdgeNodeDirectDebugHttpHandler.d.ts +25 -0
- package/dist/http/EdgeNodeDirectDebugHttpHandler.js +126 -0
- package/dist/http/EdgeNodeDirectDebugHttpHandler.js.map +1 -0
- package/dist/http/EdgeNodeDirectDebugHttpHandler.jsonld +151 -0
- package/dist/http/EdgeNodeProxyHttpHandler.d.ts +28 -0
- package/dist/http/EdgeNodeProxyHttpHandler.js +190 -0
- package/dist/http/EdgeNodeProxyHttpHandler.js.map +1 -0
- package/dist/http/EdgeNodeProxyHttpHandler.jsonld +162 -0
- package/dist/http/PodRoutingHttpHandler.d.ts +64 -0
- package/dist/http/PodRoutingHttpHandler.js +233 -0
- package/dist/http/PodRoutingHttpHandler.js.map +1 -0
- package/dist/http/PodRoutingHttpHandler.jsonld +171 -0
- package/dist/http/RequestIdHttpHandler.d.ts +15 -0
- package/dist/http/RequestIdHttpHandler.js +59 -0
- package/dist/http/RequestIdHttpHandler.js.map +1 -0
- package/dist/http/RouterHttpHandler.d.ts +21 -0
- package/dist/http/RouterHttpHandler.js +49 -0
- package/dist/http/RouterHttpHandler.js.map +1 -0
- package/dist/http/RouterHttpHandler.jsonld +80 -0
- package/dist/http/RouterHttpRoute.d.ts +6 -0
- package/dist/http/RouterHttpRoute.js +11 -0
- package/dist/http/RouterHttpRoute.js.map +1 -0
- package/dist/http/RouterHttpRoute.jsonld +48 -0
- package/dist/http/SignalInterceptHttpHandler.d.ts +24 -0
- package/dist/http/SignalInterceptHttpHandler.js +47 -0
- package/dist/http/SignalInterceptHttpHandler.js.map +1 -0
- package/dist/http/SignalInterceptHttpHandler.jsonld +103 -0
- package/dist/http/SubgraphSparqlHttpHandler.d.ts +70 -0
- package/dist/http/SubgraphSparqlHttpHandler.js +640 -0
- package/dist/http/SubgraphSparqlHttpHandler.js.map +1 -0
- package/dist/http/SubgraphSparqlHttpHandler.jsonld +363 -0
- package/dist/http/TracingHandler.d.ts +19 -0
- package/dist/http/TracingHandler.js +60 -0
- package/dist/http/TracingHandler.js.map +1 -0
- package/dist/http/TracingHandler.jsonld +37 -0
- package/dist/http/admin/EdgeNodeAdminHttpHandler.d.ts +45 -0
- package/dist/http/admin/EdgeNodeAdminHttpHandler.js +292 -0
- package/dist/http/admin/EdgeNodeAdminHttpHandler.js.map +1 -0
- package/dist/http/admin/EdgeNodeCertificateHttpHandler.d.ts +33 -0
- package/dist/http/admin/EdgeNodeCertificateHttpHandler.js +172 -0
- package/dist/http/admin/EdgeNodeCertificateHttpHandler.js.map +1 -0
- package/dist/http/admin/EdgeNodeCertificateHttpHandler.jsonld +182 -0
- package/dist/http/admin/EdgeNodeSignalHttpHandler.d.ts +71 -0
- package/dist/http/admin/EdgeNodeSignalHttpHandler.js +674 -0
- package/dist/http/admin/EdgeNodeSignalHttpHandler.js.map +1 -0
- package/dist/http/admin/EdgeNodeSignalHttpHandler.jsonld +406 -0
- package/dist/http/cluster/PodMigrationHttpHandler.d.ts +52 -0
- package/dist/http/cluster/PodMigrationHttpHandler.js +208 -0
- package/dist/http/cluster/PodMigrationHttpHandler.js.map +1 -0
- package/dist/http/cluster/PodMigrationHttpHandler.jsonld +169 -0
- package/dist/http/quota/QuotaAdminHttpHandler.d.ts +34 -0
- package/dist/http/quota/QuotaAdminHttpHandler.js +241 -0
- package/dist/http/quota/QuotaAdminHttpHandler.js.map +1 -0
- package/dist/http/quota/QuotaAdminHttpHandler.jsonld +171 -0
- package/dist/http/search/SearchHttpHandler.d.ts +59 -0
- package/dist/http/search/SearchHttpHandler.js +312 -0
- package/dist/http/search/SearchHttpHandler.js.map +1 -0
- package/dist/http/search/index.d.ts +1 -0
- package/dist/http/search/index.js +18 -0
- package/dist/http/search/index.js.map +1 -0
- package/dist/http/terminal/TerminalHttpHandler.d.ts +45 -0
- package/dist/http/terminal/TerminalHttpHandler.js +306 -0
- package/dist/http/terminal/TerminalHttpHandler.js.map +1 -0
- package/dist/http/terminal/TerminalHttpHandler.jsonld +232 -0
- package/dist/http/terminal/index.d.ts +1 -0
- package/dist/http/terminal/index.js +18 -0
- package/dist/http/terminal/index.js.map +1 -0
- package/dist/http/vector/VectorHttpHandler.d.ts +42 -0
- package/dist/http/vector/VectorHttpHandler.js +301 -0
- package/dist/http/vector/VectorHttpHandler.js.map +1 -0
- package/dist/http/vector/VectorHttpHandler.jsonld +157 -0
- package/dist/http/vector/index.d.ts +1 -0
- package/dist/http/vector/index.js +18 -0
- package/dist/http/vector/index.js.map +1 -0
- package/dist/ice/IceServerProvider.d.ts +85 -0
- package/dist/ice/IceServerProvider.js +122 -0
- package/dist/ice/IceServerProvider.js.map +1 -0
- package/dist/ice/index.d.ts +8 -0
- package/dist/ice/index.js +25 -0
- package/dist/ice/index.js.map +1 -0
- package/dist/identity/CenterNodeRegistrationService.d.ts +102 -0
- package/dist/identity/CenterNodeRegistrationService.js +266 -0
- package/dist/identity/CenterNodeRegistrationService.js.map +1 -0
- package/dist/identity/CenterNodeRegistrationService.jsonld +251 -0
- package/dist/identity/ReactAppViewHandler.d.ts +31 -0
- package/dist/identity/ReactAppViewHandler.js +79 -0
- package/dist/identity/ReactAppViewHandler.js.map +1 -0
- package/dist/identity/ReactAppViewHandler.jsonld +99 -0
- package/dist/identity/drizzle/AccountRepository.d.ts +31 -0
- package/dist/identity/drizzle/AccountRepository.js +130 -0
- package/dist/identity/drizzle/AccountRepository.js.map +1 -0
- package/dist/identity/drizzle/AccountRoleRepository.d.ts +23 -0
- package/dist/identity/drizzle/AccountRoleRepository.js +233 -0
- package/dist/identity/drizzle/AccountRoleRepository.js.map +1 -0
- package/dist/identity/drizzle/DdnsRepository.d.ts +87 -0
- package/dist/identity/drizzle/DdnsRepository.js +284 -0
- package/dist/identity/drizzle/DdnsRepository.js.map +1 -0
- package/dist/identity/drizzle/DrizzleIndexedStorage.d.ts +26 -0
- package/dist/identity/drizzle/DrizzleIndexedStorage.js +159 -0
- package/dist/identity/drizzle/DrizzleIndexedStorage.js.map +1 -0
- package/dist/identity/drizzle/DrizzleIndexedStorage.jsonld +130 -0
- package/dist/identity/drizzle/EdgeNodeRepository.d.ts +155 -0
- package/dist/identity/drizzle/EdgeNodeRepository.js +555 -0
- package/dist/identity/drizzle/EdgeNodeRepository.js.map +1 -0
- package/dist/identity/drizzle/PodLookupRepository.d.ts +59 -0
- package/dist/identity/drizzle/PodLookupRepository.js +153 -0
- package/dist/identity/drizzle/PodLookupRepository.js.map +1 -0
- package/dist/identity/drizzle/WebIdProfileRepository.d.ts +58 -0
- package/dist/identity/drizzle/WebIdProfileRepository.js +157 -0
- package/dist/identity/drizzle/WebIdProfileRepository.js.map +1 -0
- package/dist/identity/drizzle/db.d.ts +60 -0
- package/dist/identity/drizzle/db.js +269 -0
- package/dist/identity/drizzle/db.js.map +1 -0
- package/dist/identity/drizzle/schema.d.ts +1 -0
- package/dist/identity/drizzle/schema.js +20 -0
- package/dist/identity/drizzle/schema.js.map +1 -0
- package/dist/identity/drizzle/schema.pg.d.ts +20 -0
- package/dist/identity/drizzle/schema.pg.js +103 -0
- package/dist/identity/drizzle/schema.pg.js.map +1 -0
- package/dist/identity/drizzle/schema.sqlite.d.ts +872 -0
- package/dist/identity/drizzle/schema.sqlite.js +100 -0
- package/dist/identity/drizzle/schema.sqlite.js.map +1 -0
- package/dist/identity/oidc/AutoDetectIdentityProviderHandler.d.ts +43 -0
- package/dist/identity/oidc/AutoDetectIdentityProviderHandler.js +92 -0
- package/dist/identity/oidc/AutoDetectIdentityProviderHandler.js.map +1 -0
- package/dist/identity/oidc/AutoDetectIdentityProviderHandler.jsonld +122 -0
- package/dist/identity/oidc/AutoDetectOidcHandler.d.ts +55 -0
- package/dist/identity/oidc/AutoDetectOidcHandler.js +137 -0
- package/dist/identity/oidc/AutoDetectOidcHandler.js.map +1 -0
- package/dist/identity/oidc/AutoDetectOidcHandler.jsonld +138 -0
- package/dist/identity/oidc/DisabledIdentityProviderHandler.d.ts +51 -0
- package/dist/identity/oidc/DisabledIdentityProviderHandler.js +104 -0
- package/dist/identity/oidc/DisabledIdentityProviderHandler.js.map +1 -0
- package/dist/identity/oidc/DisabledIdentityProviderHandler.jsonld +111 -0
- package/dist/identity/oidc/DisabledOidcHandler.d.ts +55 -0
- package/dist/identity/oidc/DisabledOidcHandler.js +132 -0
- package/dist/identity/oidc/DisabledOidcHandler.js.map +1 -0
- package/dist/identity/oidc/DisabledOidcHandler.jsonld +157 -0
- package/dist/index.d.ts +80 -0
- package/dist/index.js +155 -0
- package/dist/index.js.map +1 -0
- package/dist/legacy/DrizzleClientCredentialsStore.d.ts +51 -0
- package/dist/legacy/DrizzleClientCredentialsStore.js +142 -0
- package/dist/legacy/DrizzleClientCredentialsStore.js.map +1 -0
- package/dist/legacy/DrizzleIndexedStorage.d.ts +26 -0
- package/dist/legacy/DrizzleIndexedStorage.js +159 -0
- package/dist/legacy/DrizzleIndexedStorage.js.map +1 -0
- package/dist/legacy/DrizzleQuotaService.d.ts +16 -0
- package/dist/legacy/DrizzleQuotaService.js +37 -0
- package/dist/legacy/DrizzleQuotaService.js.map +1 -0
- package/dist/libs/backends/index.d.ts +6 -0
- package/dist/libs/backends/index.js +31 -0
- package/dist/libs/backends/index.js.map +1 -0
- package/dist/libs/backends/sqlup.d.ts +44 -0
- package/dist/libs/backends/sqlup.js +437 -0
- package/dist/libs/backends/sqlup.js.map +1 -0
- package/dist/logging/ConfigurableLoggerFactory.d.ts +24 -0
- package/dist/logging/ConfigurableLoggerFactory.js +77 -0
- package/dist/logging/ConfigurableLoggerFactory.js.map +1 -0
- package/dist/logging/ConfigurableLoggerFactory.jsonld +169 -0
- package/dist/logging/LogContext.d.ts +5 -0
- package/dist/logging/LogContext.js +6 -0
- package/dist/logging/LogContext.js.map +1 -0
- package/dist/main.d.ts +2 -0
- package/dist/main.js +148 -0
- package/dist/main.js.map +1 -0
- package/dist/network/LocalNetworkDetector.d.ts +65 -0
- package/dist/network/LocalNetworkDetector.js +185 -0
- package/dist/network/LocalNetworkDetector.js.map +1 -0
- package/dist/network/index.d.ts +4 -0
- package/dist/network/index.js +21 -0
- package/dist/network/index.js.map +1 -0
- package/dist/pods/ReservedSuffixIdentifierGenerator.d.ts +13 -0
- package/dist/pods/ReservedSuffixIdentifierGenerator.js +26 -0
- package/dist/pods/ReservedSuffixIdentifierGenerator.js.map +1 -0
- package/dist/pods/ReservedSuffixIdentifierGenerator.jsonld +75 -0
- package/dist/quota/DefaultQuotaService.d.ts +16 -0
- package/dist/quota/DefaultQuotaService.js +37 -0
- package/dist/quota/DefaultQuotaService.js.map +1 -0
- package/dist/quota/DefaultQuotaService.jsonld +85 -0
- package/dist/quota/DrizzleQuotaService.d.ts +16 -0
- package/dist/quota/DrizzleQuotaService.js +37 -0
- package/dist/quota/DrizzleQuotaService.js.map +1 -0
- package/dist/quota/DrizzleQuotaService.jsonld +87 -0
- package/dist/quota/NoopQuotaService.d.ts +7 -0
- package/dist/quota/NoopQuotaService.js +15 -0
- package/dist/quota/NoopQuotaService.js.map +1 -0
- package/dist/quota/NoopQuotaService.jsonld +36 -0
- package/dist/quota/QuotaService.d.ts +6 -0
- package/dist/quota/QuotaService.js +3 -0
- package/dist/quota/QuotaService.js.map +1 -0
- package/dist/quota/QuotaService.jsonld +33 -0
- package/dist/sdk/SignalingClientAdapter.d.ts +38 -0
- package/dist/sdk/SignalingClientAdapter.js +99 -0
- package/dist/sdk/SignalingClientAdapter.js.map +1 -0
- package/dist/sdk/createFetch.d.ts +23 -0
- package/dist/sdk/createFetch.js +258 -0
- package/dist/sdk/createFetch.js.map +1 -0
- package/dist/sdk/index.d.ts +29 -0
- package/dist/sdk/index.js +34 -0
- package/dist/sdk/index.js.map +1 -0
- package/dist/sdk/xpodFetch.d.ts +112 -0
- package/dist/sdk/xpodFetch.js +251 -0
- package/dist/sdk/xpodFetch.js.map +1 -0
- package/dist/service/EdgeNodeCertificateService.d.ts +45 -0
- package/dist/service/EdgeNodeCertificateService.js +164 -0
- package/dist/service/EdgeNodeCertificateService.js.map +1 -0
- package/dist/service/EdgeNodeCertificateService.jsonld +216 -0
- package/dist/service/EdgeNodeHeartbeatService.d.ts +68 -0
- package/dist/service/EdgeNodeHeartbeatService.js +262 -0
- package/dist/service/EdgeNodeHeartbeatService.js.map +1 -0
- package/dist/service/PodMigrationService.d.ts +43 -0
- package/dist/service/PodMigrationService.js +72 -0
- package/dist/service/PodMigrationService.js.map +1 -0
- package/dist/service/PodMigrationService.jsonld +76 -0
- package/dist/signaling/SignalingClient.d.ts +142 -0
- package/dist/signaling/SignalingClient.js +305 -0
- package/dist/signaling/SignalingClient.js.map +1 -0
- package/dist/signaling/SignalingService.d.ts +104 -0
- package/dist/signaling/SignalingService.js +440 -0
- package/dist/signaling/SignalingService.js.map +1 -0
- package/dist/signaling/index.d.ts +11 -0
- package/dist/signaling/index.js +28 -0
- package/dist/signaling/index.js.map +1 -0
- package/dist/signaling/types.d.ts +237 -0
- package/dist/signaling/types.js +18 -0
- package/dist/signaling/types.js.map +1 -0
- package/dist/storage/DrizzleCompat.d.ts +15 -0
- package/dist/storage/DrizzleCompat.js +60 -0
- package/dist/storage/DrizzleCompat.js.map +1 -0
- package/dist/storage/LockingResourceStore.d.ts +8 -0
- package/dist/storage/LockingResourceStore.js +68 -0
- package/dist/storage/LockingResourceStore.js.map +1 -0
- package/dist/storage/MigratableDataAccessor.d.ts +63 -0
- package/dist/storage/MigratableDataAccessor.js +11 -0
- package/dist/storage/MigratableDataAccessor.js.map +1 -0
- package/dist/storage/MigratableDataAccessor.jsonld +60 -0
- package/dist/storage/ObservableResourceStore.d.ts +89 -0
- package/dist/storage/ObservableResourceStore.js +125 -0
- package/dist/storage/ObservableResourceStore.js.map +1 -0
- package/dist/storage/RepresentationPartialConvertingStore.d.ts +22 -0
- package/dist/storage/RepresentationPartialConvertingStore.js +94 -0
- package/dist/storage/RepresentationPartialConvertingStore.js.map +1 -0
- package/dist/storage/RepresentationPartialConvertingStore.jsonld +332 -0
- package/dist/storage/SparqlUpdateResourceStore.d.ts +30 -0
- package/dist/storage/SparqlUpdateResourceStore.js +292 -0
- package/dist/storage/SparqlUpdateResourceStore.js.map +1 -0
- package/dist/storage/SparqlUpdateResourceStore.jsonld +112 -0
- package/dist/storage/SqliteCompat.d.ts +60 -0
- package/dist/storage/SqliteCompat.js +158 -0
- package/dist/storage/SqliteCompat.js.map +1 -0
- package/dist/storage/accessors/MinioDataAccessor.d.ts +127 -0
- package/dist/storage/accessors/MinioDataAccessor.js +249 -0
- package/dist/storage/accessors/MinioDataAccessor.js.map +1 -0
- package/dist/storage/accessors/MinioDataAccessor.jsonld +138 -0
- package/dist/storage/accessors/MixDataAccessor.d.ts +43 -0
- package/dist/storage/accessors/MixDataAccessor.js +130 -0
- package/dist/storage/accessors/MixDataAccessor.js.map +1 -0
- package/dist/storage/accessors/MixDataAccessor.jsonld +101 -0
- package/dist/storage/accessors/QuadstoreSparqlDataAccessor.d.ts +146 -0
- package/dist/storage/accessors/QuadstoreSparqlDataAccessor.js +415 -0
- package/dist/storage/accessors/QuadstoreSparqlDataAccessor.js.map +1 -0
- package/dist/storage/accessors/QuadstoreSparqlDataAccessor.jsonld +180 -0
- package/dist/storage/accessors/QuintStoreSparqlDataAccessor.d.ts +95 -0
- package/dist/storage/accessors/QuintStoreSparqlDataAccessor.js +376 -0
- package/dist/storage/accessors/QuintStoreSparqlDataAccessor.js.map +1 -0
- package/dist/storage/accessors/QuintStoreSparqlDataAccessor.jsonld +168 -0
- package/dist/storage/accessors/TieredMinioDataAccessor.d.ts +150 -0
- package/dist/storage/accessors/TieredMinioDataAccessor.js +582 -0
- package/dist/storage/accessors/TieredMinioDataAccessor.js.map +1 -0
- package/dist/storage/accessors/TieredMinioDataAccessor.jsonld +333 -0
- package/dist/storage/database/PostgresPoolManager.d.ts +56 -0
- package/dist/storage/database/PostgresPoolManager.js +117 -0
- package/dist/storage/database/PostgresPoolManager.js.map +1 -0
- package/dist/storage/keyvalue/PostgresKeyValueStorage.d.ts +34 -0
- package/dist/storage/keyvalue/PostgresKeyValueStorage.js +146 -0
- package/dist/storage/keyvalue/PostgresKeyValueStorage.js.map +1 -0
- package/dist/storage/keyvalue/PostgresKeyValueStorage.jsonld +192 -0
- package/dist/storage/keyvalue/RedisKeyValueStorage.d.ts +30 -0
- package/dist/storage/keyvalue/RedisKeyValueStorage.js +133 -0
- package/dist/storage/keyvalue/RedisKeyValueStorage.js.map +1 -0
- package/dist/storage/keyvalue/RedisKeyValueStorage.jsonld +237 -0
- package/dist/storage/keyvalue/SqliteKeyValueStorage.d.ts +30 -0
- package/dist/storage/keyvalue/SqliteKeyValueStorage.js +164 -0
- package/dist/storage/keyvalue/SqliteKeyValueStorage.js.map +1 -0
- package/dist/storage/keyvalue/SqliteKeyValueStorage.jsonld +167 -0
- package/dist/storage/quint/BaseQuintStore.d.ts +80 -0
- package/dist/storage/quint/BaseQuintStore.js +535 -0
- package/dist/storage/quint/BaseQuintStore.js.map +1 -0
- package/dist/storage/quint/BaseQuintStore.jsonld +175 -0
- package/dist/storage/quint/PgQuintStore.d.ts +61 -0
- package/dist/storage/quint/PgQuintStore.drizzle.d.ts +45 -0
- package/dist/storage/quint/PgQuintStore.drizzle.js +327 -0
- package/dist/storage/quint/PgQuintStore.drizzle.js.map +1 -0
- package/dist/storage/quint/PgQuintStore.js +275 -0
- package/dist/storage/quint/PgQuintStore.js.map +1 -0
- package/dist/storage/quint/PgQuintStore.jsonld +258 -0
- package/dist/storage/quint/SqliteQuintStore.d.ts +55 -0
- package/dist/storage/quint/SqliteQuintStore.js +630 -0
- package/dist/storage/quint/SqliteQuintStore.js.map +1 -0
- package/dist/storage/quint/SqliteQuintStore.jsonld +157 -0
- package/dist/storage/quint/index.d.ts +11 -0
- package/dist/storage/quint/index.js +30 -0
- package/dist/storage/quint/index.js.map +1 -0
- package/dist/storage/quint/schema.d.ts +82 -0
- package/dist/storage/quint/schema.js +33 -0
- package/dist/storage/quint/schema.js.map +1 -0
- package/dist/storage/quint/serialization.d.ts +56 -0
- package/dist/storage/quint/serialization.js +198 -0
- package/dist/storage/quint/serialization.js.map +1 -0
- package/dist/storage/quint/types.d.ts +152 -0
- package/dist/storage/quint/types.js +27 -0
- package/dist/storage/quint/types.js.map +1 -0
- package/dist/storage/quint/types.jsonld +78 -0
- package/dist/storage/quota/PerAccountQuotaStrategy.d.ts +19 -0
- package/dist/storage/quota/PerAccountQuotaStrategy.js +63 -0
- package/dist/storage/quota/PerAccountQuotaStrategy.js.map +1 -0
- package/dist/storage/quota/PerAccountQuotaStrategy.jsonld +113 -0
- package/dist/storage/quota/UsageRepository.d.ts +46 -0
- package/dist/storage/quota/UsageRepository.js +278 -0
- package/dist/storage/quota/UsageRepository.js.map +1 -0
- package/dist/storage/quota/UsageTrackingStore.d.ts +37 -0
- package/dist/storage/quota/UsageTrackingStore.js +355 -0
- package/dist/storage/quota/UsageTrackingStore.js.map +1 -0
- package/dist/storage/quota/UsageTrackingStore.jsonld +193 -0
- package/dist/storage/sparql/AlgebraUtils.d.ts +48 -0
- package/dist/storage/sparql/AlgebraUtils.js +118 -0
- package/dist/storage/sparql/AlgebraUtils.js.map +1 -0
- package/dist/storage/sparql/ComunicaOptimizedEngine.d.ts +59 -0
- package/dist/storage/sparql/ComunicaOptimizedEngine.js +254 -0
- package/dist/storage/sparql/ComunicaOptimizedEngine.js.map +1 -0
- package/dist/storage/sparql/ComunicaQuintEngine.d.ts +134 -0
- package/dist/storage/sparql/ComunicaQuintEngine.js +727 -0
- package/dist/storage/sparql/ComunicaQuintEngine.js.map +1 -0
- package/dist/storage/sparql/ExpressionEvaluator.d.ts +54 -0
- package/dist/storage/sparql/ExpressionEvaluator.js +340 -0
- package/dist/storage/sparql/ExpressionEvaluator.js.map +1 -0
- package/dist/storage/sparql/FilterPushdownExtractor.d.ts +74 -0
- package/dist/storage/sparql/FilterPushdownExtractor.js +409 -0
- package/dist/storage/sparql/FilterPushdownExtractor.js.map +1 -0
- package/dist/storage/sparql/OptimizedQuadstoreEngine.d.ts +65 -0
- package/dist/storage/sparql/OptimizedQuadstoreEngine.js +327 -0
- package/dist/storage/sparql/OptimizedQuadstoreEngine.js.map +1 -0
- package/dist/storage/sparql/OptimizedQuadstoreSource.d.ts +46 -0
- package/dist/storage/sparql/OptimizedQuadstoreSource.js +118 -0
- package/dist/storage/sparql/OptimizedQuadstoreSource.js.map +1 -0
- package/dist/storage/sparql/PatternBuilder.d.ts +41 -0
- package/dist/storage/sparql/PatternBuilder.js +118 -0
- package/dist/storage/sparql/PatternBuilder.js.map +1 -0
- package/dist/storage/sparql/QueryOptimizer.d.ts +125 -0
- package/dist/storage/sparql/QueryOptimizer.js +363 -0
- package/dist/storage/sparql/QueryOptimizer.js.map +1 -0
- package/dist/storage/sparql/QuintEngine.d.ts +92 -0
- package/dist/storage/sparql/QuintEngine.js +150 -0
- package/dist/storage/sparql/QuintEngine.js.map +1 -0
- package/dist/storage/sparql/QuintQuerySource.d.ts +227 -0
- package/dist/storage/sparql/QuintQuerySource.js +918 -0
- package/dist/storage/sparql/QuintQuerySource.js.map +1 -0
- package/dist/storage/sparql/SimpleSparqlExecutor.d.ts +40 -0
- package/dist/storage/sparql/SimpleSparqlExecutor.js +131 -0
- package/dist/storage/sparql/SimpleSparqlExecutor.js.map +1 -0
- package/dist/storage/sparql/SubgraphQueryEngine.d.ts +74 -0
- package/dist/storage/sparql/SubgraphQueryEngine.js +248 -0
- package/dist/storage/sparql/SubgraphQueryEngine.js.map +1 -0
- package/dist/storage/sparql/SubgraphQueryEngine.jsonld +250 -0
- package/dist/storage/vector/PostgresVectorStore.d.ts +46 -0
- package/dist/storage/vector/PostgresVectorStore.js +291 -0
- package/dist/storage/vector/PostgresVectorStore.js.map +1 -0
- package/dist/storage/vector/PostgresVectorStore.jsonld +142 -0
- package/dist/storage/vector/SqliteVectorStore.d.ts +44 -0
- package/dist/storage/vector/SqliteVectorStore.js +282 -0
- package/dist/storage/vector/SqliteVectorStore.js.map +1 -0
- package/dist/storage/vector/SqliteVectorStore.jsonld +137 -0
- package/dist/storage/vector/VectorIndexingListener.d.ts +114 -0
- package/dist/storage/vector/VectorIndexingListener.js +351 -0
- package/dist/storage/vector/VectorIndexingListener.js.map +1 -0
- package/dist/storage/vector/VectorStore.d.ts +42 -0
- package/dist/storage/vector/VectorStore.js +50 -0
- package/dist/storage/vector/VectorStore.js.map +1 -0
- package/dist/storage/vector/VectorStore.jsonld +87 -0
- package/dist/storage/vector/VectorStoreInit.d.ts +28 -0
- package/dist/storage/vector/VectorStoreInit.js +104 -0
- package/dist/storage/vector/VectorStoreInit.js.map +1 -0
- package/dist/storage/vector/index.d.ts +5 -0
- package/dist/storage/vector/index.js +22 -0
- package/dist/storage/vector/index.js.map +1 -0
- package/dist/storage/vector/types.d.ts +39 -0
- package/dist/storage/vector/types.js +8 -0
- package/dist/storage/vector/types.js.map +1 -0
- package/dist/subdomain/SubdomainClient.d.ts +156 -0
- package/dist/subdomain/SubdomainClient.js +220 -0
- package/dist/subdomain/SubdomainClient.js.map +1 -0
- package/dist/subdomain/SubdomainService.d.ts +114 -0
- package/dist/subdomain/SubdomainService.js +212 -0
- package/dist/subdomain/SubdomainService.js.map +1 -0
- package/dist/subdomain/SubdomainService.jsonld +261 -0
- package/dist/subdomain/index.d.ts +2 -0
- package/dist/subdomain/index.js +9 -0
- package/dist/subdomain/index.js.map +1 -0
- package/dist/supervisor/Supervisor.d.ts +20 -0
- package/dist/supervisor/Supervisor.js +174 -0
- package/dist/supervisor/Supervisor.js.map +1 -0
- package/dist/supervisor/index.d.ts +2 -0
- package/dist/supervisor/index.js +6 -0
- package/dist/supervisor/index.js.map +1 -0
- package/dist/supervisor/types.d.ts +19 -0
- package/dist/supervisor/types.js +3 -0
- package/dist/supervisor/types.js.map +1 -0
- package/dist/task/DrizzleTaskQueue.d.ts +60 -0
- package/dist/task/DrizzleTaskQueue.js +171 -0
- package/dist/task/DrizzleTaskQueue.js.map +1 -0
- package/dist/task/TaskExecutor.d.ts +82 -0
- package/dist/task/TaskExecutor.js +198 -0
- package/dist/task/TaskExecutor.js.map +1 -0
- package/dist/task/index.d.ts +10 -0
- package/dist/task/index.js +20 -0
- package/dist/task/index.js.map +1 -0
- package/dist/task/schema.d.ts +53 -0
- package/dist/task/schema.js +71 -0
- package/dist/task/schema.js.map +1 -0
- package/dist/task/types.d.ts +186 -0
- package/dist/task/types.js +12 -0
- package/dist/task/types.js.map +1 -0
- package/dist/terminal/AclPermissionService.d.ts +28 -0
- package/dist/terminal/AclPermissionService.js +141 -0
- package/dist/terminal/AclPermissionService.js.map +1 -0
- package/dist/terminal/BubblewrapSandbox.d.ts +51 -0
- package/dist/terminal/BubblewrapSandbox.js +147 -0
- package/dist/terminal/BubblewrapSandbox.js.map +1 -0
- package/dist/terminal/TerminalSession.d.ts +33 -0
- package/dist/terminal/TerminalSession.js +164 -0
- package/dist/terminal/TerminalSession.js.map +1 -0
- package/dist/terminal/TerminalSessionManager.d.ts +69 -0
- package/dist/terminal/TerminalSessionManager.js +196 -0
- package/dist/terminal/TerminalSessionManager.js.map +1 -0
- package/dist/terminal/index.d.ts +5 -0
- package/dist/terminal/index.js +22 -0
- package/dist/terminal/index.js.map +1 -0
- package/dist/terminal/sandbox/BubblewrapSandbox.d.ts +8 -0
- package/dist/terminal/sandbox/BubblewrapSandbox.js +105 -0
- package/dist/terminal/sandbox/BubblewrapSandbox.js.map +1 -0
- package/dist/terminal/sandbox/MacOSSandbox.d.ts +19 -0
- package/dist/terminal/sandbox/MacOSSandbox.js +120 -0
- package/dist/terminal/sandbox/MacOSSandbox.js.map +1 -0
- package/dist/terminal/sandbox/index.d.ts +29 -0
- package/dist/terminal/sandbox/index.js +113 -0
- package/dist/terminal/sandbox/index.js.map +1 -0
- package/dist/terminal/sandbox/types.d.ts +38 -0
- package/dist/terminal/sandbox/types.js +3 -0
- package/dist/terminal/sandbox/types.js.map +1 -0
- package/dist/terminal/types.d.ts +80 -0
- package/dist/terminal/types.js +16 -0
- package/dist/terminal/types.js.map +1 -0
- package/dist/tunnel/CloudflareTunnelProvider.d.ts +120 -0
- package/dist/tunnel/CloudflareTunnelProvider.js +376 -0
- package/dist/tunnel/CloudflareTunnelProvider.js.map +1 -0
- package/dist/tunnel/CloudflareTunnelProvider.jsonld +204 -0
- package/dist/tunnel/LocalTunnelProvider.d.ts +85 -0
- package/dist/tunnel/LocalTunnelProvider.js +295 -0
- package/dist/tunnel/LocalTunnelProvider.js.map +1 -0
- package/dist/tunnel/LocalTunnelProvider.jsonld +142 -0
- package/dist/tunnel/SakuraFrpTunnelProvider.d.ts +59 -0
- package/dist/tunnel/SakuraFrpTunnelProvider.js +207 -0
- package/dist/tunnel/SakuraFrpTunnelProvider.js.map +1 -0
- package/dist/tunnel/TunnelProvider.d.ts +91 -0
- package/dist/tunnel/TunnelProvider.js +10 -0
- package/dist/tunnel/TunnelProvider.js.map +1 -0
- package/dist/tunnel/TunnelProvider.jsonld +144 -0
- package/dist/tunnel/index.d.ts +3 -0
- package/dist/tunnel/index.js +8 -0
- package/dist/tunnel/index.js.map +1 -0
- package/dist/util/LockContext.d.ts +3 -0
- package/dist/util/LockContext.js +6 -0
- package/dist/util/LockContext.js.map +1 -0
- package/dist/util/ResourceStoreFetch.d.ts +11 -0
- package/dist/util/ResourceStoreFetch.js +147 -0
- package/dist/util/ResourceStoreFetch.js.map +1 -0
- package/dist/util/database/DatabaseMaintenance.d.ts +23 -0
- package/dist/util/database/DatabaseMaintenance.js +82 -0
- package/dist/util/database/DatabaseMaintenance.js.map +1 -0
- package/dist/util/identifiers/ClusterIdentifierStrategy.d.ts +23 -0
- package/dist/util/identifiers/ClusterIdentifierStrategy.js +73 -0
- package/dist/util/identifiers/ClusterIdentifierStrategy.js.map +1 -0
- package/dist/util/identifiers/ClusterIdentifierStrategy.jsonld +90 -0
- package/dist/util/identifiers/MultiDomainIdentifierStrategy.d.ts +40 -0
- package/dist/util/identifiers/MultiDomainIdentifierStrategy.js +73 -0
- package/dist/util/identifiers/MultiDomainIdentifierStrategy.js.map +1 -0
- package/dist/util/identifiers/MultiDomainIdentifierStrategy.jsonld +90 -0
- package/dist/util/identifiers/PathBasedPodIdentifierStrategy.d.ts +78 -0
- package/dist/util/identifiers/PathBasedPodIdentifierStrategy.js +182 -0
- package/dist/util/identifiers/PathBasedPodIdentifierStrategy.js.map +1 -0
- package/dist/util/identifiers/PathBasedPodIdentifierStrategy.jsonld +88 -0
- package/dist/util/identifiers/SubdomainPodIdentifierStrategy.d.ts +68 -0
- package/dist/util/identifiers/SubdomainPodIdentifierStrategy.js +149 -0
- package/dist/util/identifiers/SubdomainPodIdentifierStrategy.js.map +1 -0
- package/dist/util/identifiers/SubdomainPodIdentifierStrategy.jsonld +84 -0
- package/dist/util/locking/DebugRedisLocker.d.ts +8 -0
- package/dist/util/locking/DebugRedisLocker.js +33 -0
- package/dist/util/locking/DebugRedisLocker.js.map +1 -0
- package/dist/util/logger.d.ts +13 -0
- package/dist/util/logger.js +36 -0
- package/dist/util/logger.js.map +1 -0
- package/dist/util/stream/BandwidthThrottleTransform.d.ts +8 -0
- package/dist/util/stream/BandwidthThrottleTransform.js +55 -0
- package/dist/util/stream/BandwidthThrottleTransform.js.map +1 -0
- package/dist/vocab/external.d.ts +216 -0
- package/dist/vocab/external.js +276 -0
- package/dist/vocab/external.js.map +1 -0
- package/dist/vocab/index.d.ts +26 -0
- package/dist/vocab/index.js +46 -0
- package/dist/vocab/index.js.map +1 -0
- package/dist/vocab/udfs.d.ts +184 -0
- package/dist/vocab/udfs.js +217 -0
- package/dist/vocab/udfs.js.map +1 -0
- package/dist/webrtc/WebRTCClient.d.ts +109 -0
- package/dist/webrtc/WebRTCClient.js +344 -0
- package/dist/webrtc/WebRTCClient.js.map +1 -0
- package/dist/webrtc/WebRTCPeerManager.d.ts +112 -0
- package/dist/webrtc/WebRTCPeerManager.js +289 -0
- package/dist/webrtc/WebRTCPeerManager.js.map +1 -0
- package/dist/webrtc/WeriftPeerConnectionFactory.d.ts +13 -0
- package/dist/webrtc/WeriftPeerConnectionFactory.js +255 -0
- package/dist/webrtc/WeriftPeerConnectionFactory.js.map +1 -0
- package/dist/webrtc/index.d.ts +13 -0
- package/dist/webrtc/index.js +30 -0
- package/dist/webrtc/index.js.map +1 -0
- package/dist/webrtc/types.d.ts +169 -0
- package/dist/webrtc/types.js +6 -0
- package/dist/webrtc/types.js.map +1 -0
- package/dist/xpod.single.cjs +826 -0
- package/dist/xpod.single.cjs.map +7 -0
- package/package.json +173 -0
- package/static/app/assets/index.css +1 -0
- package/static/app/assets/main.js +11 -0
- package/static/app/auth.html +21 -0
- package/static/app/index.html +14 -0
- package/static/app/vite.svg +1 -0
- package/static/dashboard/assets/dashboard-G96F8267.js +52 -0
- package/static/dashboard/assets/dashboard-PJyGDppf.css +1 -0
- package/static/dashboard/auth.html +21 -0
- package/static/dashboard/index.html +13 -0
- package/static/dashboard/vite.svg +1 -0
- package/static/landing/index.html +165 -0
- package/templates/identity/index.html.ejs +12 -0
- package/templates/identity/login.html.ejs +49 -0
- package/templates/identity/oidc/consent.html.ejs +103 -0
- package/templates/identity/password/forgot.html.ejs +49 -0
- package/templates/identity/password/login.html.ejs +58 -0
- package/templates/identity/password/register.html.ejs +65 -0
- package/templates/main.html.ejs +1 -0
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
import { HttpHandler } from '@solid/community-server';
|
|
2
|
+
import type { HttpHandlerInput } from '@solid/community-server';
|
|
3
|
+
import { EdgeNodeRepository } from '../../identity/drizzle/EdgeNodeRepository';
|
|
4
|
+
import { EdgeNodeCapabilityDetector } from '../../edge/EdgeNodeCapabilityDetector';
|
|
5
|
+
interface EdgeNodeAdminHttpHandlerOptions {
|
|
6
|
+
identityDbUrl: string;
|
|
7
|
+
basePath?: string;
|
|
8
|
+
edgeNodesEnabled?: string | boolean;
|
|
9
|
+
repository?: EdgeNodeRepository;
|
|
10
|
+
capabilityDetector?: EdgeNodeCapabilityDetector;
|
|
11
|
+
}
|
|
12
|
+
/**
|
|
13
|
+
* Edge Node Administration HTTP Handler
|
|
14
|
+
*
|
|
15
|
+
* Provides REST API endpoints for edge node administration:
|
|
16
|
+
* - GET /admin/nodes - List all nodes with their capabilities
|
|
17
|
+
* - GET /admin/nodes/{nodeId} - Get specific node information
|
|
18
|
+
* - GET /admin/nodes/{nodeId}/capabilities - Get node capability details
|
|
19
|
+
*/
|
|
20
|
+
export declare class EdgeNodeAdminHttpHandler extends HttpHandler {
|
|
21
|
+
protected readonly logger: import("global-logger-factory").Logger<unknown>;
|
|
22
|
+
private readonly repo;
|
|
23
|
+
private readonly basePath;
|
|
24
|
+
private readonly basePathWithSlash;
|
|
25
|
+
private readonly enabled;
|
|
26
|
+
private readonly capabilityDetector?;
|
|
27
|
+
constructor(options: EdgeNodeAdminHttpHandlerOptions);
|
|
28
|
+
canHandle({ request }: HttpHandlerInput): Promise<void>;
|
|
29
|
+
handle({ request, response }: HttpHandlerInput): Promise<void>;
|
|
30
|
+
private handleGet;
|
|
31
|
+
private listNodes;
|
|
32
|
+
private getNode;
|
|
33
|
+
private getNodeCapabilities;
|
|
34
|
+
private handlePost;
|
|
35
|
+
private createNode;
|
|
36
|
+
private readRequestBody;
|
|
37
|
+
private writeOptions;
|
|
38
|
+
private writeJsonResponse;
|
|
39
|
+
private parseUrl;
|
|
40
|
+
private matchesBase;
|
|
41
|
+
private toRelative;
|
|
42
|
+
private normalizeBasePath;
|
|
43
|
+
private normalizeBoolean;
|
|
44
|
+
}
|
|
45
|
+
export {};
|
|
@@ -0,0 +1,292 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.EdgeNodeAdminHttpHandler = void 0;
|
|
4
|
+
const global_logger_factory_1 = require("global-logger-factory");
|
|
5
|
+
const community_server_1 = require("@solid/community-server");
|
|
6
|
+
const community_server_2 = require("@solid/community-server");
|
|
7
|
+
const db_1 = require("../../identity/drizzle/db");
|
|
8
|
+
const EdgeNodeRepository_1 = require("../../identity/drizzle/EdgeNodeRepository");
|
|
9
|
+
const EdgeNodeCapabilityDetector_1 = require("../../edge/EdgeNodeCapabilityDetector");
|
|
10
|
+
/**
|
|
11
|
+
* Edge Node Administration HTTP Handler
|
|
12
|
+
*
|
|
13
|
+
* Provides REST API endpoints for edge node administration:
|
|
14
|
+
* - GET /admin/nodes - List all nodes with their capabilities
|
|
15
|
+
* - GET /admin/nodes/{nodeId} - Get specific node information
|
|
16
|
+
* - GET /admin/nodes/{nodeId}/capabilities - Get node capability details
|
|
17
|
+
*/
|
|
18
|
+
class EdgeNodeAdminHttpHandler extends community_server_1.HttpHandler {
|
|
19
|
+
constructor(options) {
|
|
20
|
+
super();
|
|
21
|
+
this.logger = (0, global_logger_factory_1.getLoggerFor)(this);
|
|
22
|
+
this.repo = options.repository ?? new EdgeNodeRepository_1.EdgeNodeRepository((0, db_1.getIdentityDatabase)(options.identityDbUrl));
|
|
23
|
+
this.basePath = this.normalizeBasePath(options.basePath ?? '/admin/nodes');
|
|
24
|
+
this.basePathWithSlash = `${this.basePath}/`;
|
|
25
|
+
this.enabled = this.normalizeBoolean(options.edgeNodesEnabled);
|
|
26
|
+
this.capabilityDetector = options.capabilityDetector;
|
|
27
|
+
}
|
|
28
|
+
async canHandle({ request }) {
|
|
29
|
+
if (!this.enabled) {
|
|
30
|
+
throw new community_server_2.NotImplementedHttpError('Edge node admin API is disabled.');
|
|
31
|
+
}
|
|
32
|
+
const pathname = this.parseUrl(request).pathname;
|
|
33
|
+
if (!this.matchesBase(pathname)) {
|
|
34
|
+
throw new community_server_2.NotImplementedHttpError('Not an edge node admin request.');
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
async handle({ request, response }) {
|
|
38
|
+
const method = (request.method ?? 'GET').toUpperCase();
|
|
39
|
+
if (method === 'OPTIONS') {
|
|
40
|
+
this.writeOptions(response);
|
|
41
|
+
return;
|
|
42
|
+
}
|
|
43
|
+
const url = this.parseUrl(request);
|
|
44
|
+
const relative = this.toRelative(url.pathname);
|
|
45
|
+
try {
|
|
46
|
+
switch (method) {
|
|
47
|
+
case 'GET':
|
|
48
|
+
await this.handleGet(relative, response);
|
|
49
|
+
break;
|
|
50
|
+
case 'POST':
|
|
51
|
+
await this.handlePost(relative, request, response);
|
|
52
|
+
break;
|
|
53
|
+
default:
|
|
54
|
+
throw new community_server_2.MethodNotAllowedHttpError(['GET', 'POST', 'OPTIONS']);
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
catch (error) {
|
|
58
|
+
if (error instanceof Error) {
|
|
59
|
+
this.logger.error(`Edge node admin API error: ${error.message}`);
|
|
60
|
+
}
|
|
61
|
+
throw error;
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
async handleGet(path, response) {
|
|
65
|
+
if (path === '') {
|
|
66
|
+
// GET /admin/nodes - List all nodes
|
|
67
|
+
await this.listNodes(response);
|
|
68
|
+
}
|
|
69
|
+
else {
|
|
70
|
+
// Parse path segments
|
|
71
|
+
const segments = path.split('/').filter(s => s.length > 0);
|
|
72
|
+
if (segments.length === 1) {
|
|
73
|
+
// GET /admin/nodes/{nodeId} - Get specific node
|
|
74
|
+
await this.getNode(segments[0], response);
|
|
75
|
+
}
|
|
76
|
+
else if (segments.length === 2 && segments[1] === 'capabilities') {
|
|
77
|
+
// GET /admin/nodes/{nodeId}/capabilities - Get node capabilities
|
|
78
|
+
await this.getNodeCapabilities(segments[0], response);
|
|
79
|
+
}
|
|
80
|
+
else {
|
|
81
|
+
throw new community_server_2.NotFoundHttpError('Unknown endpoint.');
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
}
|
|
85
|
+
async listNodes(response) {
|
|
86
|
+
try {
|
|
87
|
+
const nodes = await this.repo.listNodeCapabilities();
|
|
88
|
+
const result = {
|
|
89
|
+
nodes: nodes.map(node => ({
|
|
90
|
+
nodeId: node.nodeId,
|
|
91
|
+
accessMode: node.accessMode,
|
|
92
|
+
connectivityStatus: node.connectivityStatus,
|
|
93
|
+
lastSeen: node.lastSeen?.toISOString(),
|
|
94
|
+
capabilities: {
|
|
95
|
+
structured: node.capabilities,
|
|
96
|
+
strings: node.stringCapabilities,
|
|
97
|
+
},
|
|
98
|
+
})),
|
|
99
|
+
total: nodes.length,
|
|
100
|
+
timestamp: new Date().toISOString(),
|
|
101
|
+
};
|
|
102
|
+
this.writeJsonResponse(response, result);
|
|
103
|
+
}
|
|
104
|
+
catch (error) {
|
|
105
|
+
throw new community_server_2.InternalServerError('Failed to list edge nodes.', { cause: error });
|
|
106
|
+
}
|
|
107
|
+
}
|
|
108
|
+
async getNode(nodeId, response) {
|
|
109
|
+
try {
|
|
110
|
+
const nodeInfo = await this.repo.getNodeCapabilities(nodeId);
|
|
111
|
+
if (!nodeInfo) {
|
|
112
|
+
throw new community_server_2.NotFoundHttpError(`Edge node '${nodeId}' not found.`);
|
|
113
|
+
}
|
|
114
|
+
const result = {
|
|
115
|
+
nodeId: nodeInfo.nodeId,
|
|
116
|
+
accessMode: nodeInfo.accessMode,
|
|
117
|
+
connectivityStatus: nodeInfo.connectivityStatus,
|
|
118
|
+
lastSeen: nodeInfo.lastSeen?.toISOString(),
|
|
119
|
+
capabilities: {
|
|
120
|
+
structured: nodeInfo.capabilities,
|
|
121
|
+
strings: nodeInfo.stringCapabilities,
|
|
122
|
+
},
|
|
123
|
+
timestamp: new Date().toISOString(),
|
|
124
|
+
};
|
|
125
|
+
this.writeJsonResponse(response, result);
|
|
126
|
+
}
|
|
127
|
+
catch (error) {
|
|
128
|
+
if (error instanceof community_server_2.NotFoundHttpError) {
|
|
129
|
+
throw error;
|
|
130
|
+
}
|
|
131
|
+
throw new community_server_2.InternalServerError('Failed to get edge node information.', { cause: error });
|
|
132
|
+
}
|
|
133
|
+
}
|
|
134
|
+
async getNodeCapabilities(nodeId, response) {
|
|
135
|
+
try {
|
|
136
|
+
const nodeInfo = await this.repo.getNodeCapabilities(nodeId);
|
|
137
|
+
if (!nodeInfo) {
|
|
138
|
+
throw new community_server_2.NotFoundHttpError(`Edge node '${nodeId}' not found.`);
|
|
139
|
+
}
|
|
140
|
+
// If we have a capability detector, also provide real-time capability detection
|
|
141
|
+
let detectedCapabilities;
|
|
142
|
+
if (this.capabilityDetector) {
|
|
143
|
+
try {
|
|
144
|
+
detectedCapabilities = await this.capabilityDetector.detectCapabilities();
|
|
145
|
+
}
|
|
146
|
+
catch (error) {
|
|
147
|
+
this.logger.warn(`Failed to detect real-time capabilities for node ${nodeId}: ${error.message}`);
|
|
148
|
+
}
|
|
149
|
+
}
|
|
150
|
+
const result = {
|
|
151
|
+
nodeId: nodeInfo.nodeId,
|
|
152
|
+
capabilities: {
|
|
153
|
+
// Stored structured capabilities from the database
|
|
154
|
+
stored: nodeInfo.capabilities,
|
|
155
|
+
// String capabilities array for backward compatibility
|
|
156
|
+
strings: nodeInfo.stringCapabilities,
|
|
157
|
+
// Real-time detected capabilities (if available)
|
|
158
|
+
detected: detectedCapabilities,
|
|
159
|
+
// Parsed capabilities from strings for easier consumption
|
|
160
|
+
parsed: nodeInfo.stringCapabilities ?
|
|
161
|
+
EdgeNodeCapabilityDetector_1.EdgeNodeCapabilityDetector.parseCapabilitiesFromStringArray(nodeInfo.stringCapabilities) :
|
|
162
|
+
null,
|
|
163
|
+
},
|
|
164
|
+
accessMode: nodeInfo.accessMode,
|
|
165
|
+
connectivityStatus: nodeInfo.connectivityStatus,
|
|
166
|
+
lastSeen: nodeInfo.lastSeen?.toISOString(),
|
|
167
|
+
timestamp: new Date().toISOString(),
|
|
168
|
+
};
|
|
169
|
+
this.writeJsonResponse(response, result);
|
|
170
|
+
}
|
|
171
|
+
catch (error) {
|
|
172
|
+
if (error instanceof community_server_2.NotFoundHttpError) {
|
|
173
|
+
throw error;
|
|
174
|
+
}
|
|
175
|
+
throw new community_server_2.InternalServerError('Failed to get edge node capabilities.', { cause: error });
|
|
176
|
+
}
|
|
177
|
+
}
|
|
178
|
+
async handlePost(path, request, response) {
|
|
179
|
+
if (path === '') {
|
|
180
|
+
// POST /admin/nodes - Create new node
|
|
181
|
+
await this.createNode(request, response);
|
|
182
|
+
}
|
|
183
|
+
else {
|
|
184
|
+
throw new community_server_2.NotFoundHttpError('Unknown endpoint.');
|
|
185
|
+
}
|
|
186
|
+
}
|
|
187
|
+
async createNode(request, response) {
|
|
188
|
+
const payload = await this.readRequestBody(request);
|
|
189
|
+
let displayName;
|
|
190
|
+
// Parse request body if provided
|
|
191
|
+
if (payload) {
|
|
192
|
+
try {
|
|
193
|
+
const data = JSON.parse(payload);
|
|
194
|
+
displayName = typeof data.displayName === 'string' ? data.displayName : undefined;
|
|
195
|
+
}
|
|
196
|
+
catch {
|
|
197
|
+
// Ignore JSON parsing errors, displayName will remain undefined
|
|
198
|
+
}
|
|
199
|
+
}
|
|
200
|
+
try {
|
|
201
|
+
const result = await this.repo.createNode(displayName);
|
|
202
|
+
this.logger.info(`Created new edge node: ${result.nodeId} (${displayName || 'no display name'})`);
|
|
203
|
+
const response_data = {
|
|
204
|
+
success: true,
|
|
205
|
+
nodeId: result.nodeId,
|
|
206
|
+
token: result.token,
|
|
207
|
+
displayName: displayName,
|
|
208
|
+
createdAt: result.createdAt,
|
|
209
|
+
message: 'Edge node created successfully. Save the token - it will not be shown again.',
|
|
210
|
+
};
|
|
211
|
+
this.writeJsonResponse(response, response_data, 201);
|
|
212
|
+
}
|
|
213
|
+
catch (error) {
|
|
214
|
+
this.logger.error(`Failed to create edge node: ${String(error)}`);
|
|
215
|
+
throw new community_server_2.InternalServerError('Failed to create edge node.', { cause: error });
|
|
216
|
+
}
|
|
217
|
+
}
|
|
218
|
+
async readRequestBody(request) {
|
|
219
|
+
return new Promise((resolve, reject) => {
|
|
220
|
+
let body = '';
|
|
221
|
+
request.on('data', (chunk) => {
|
|
222
|
+
body += chunk.toString();
|
|
223
|
+
});
|
|
224
|
+
request.on('end', () => {
|
|
225
|
+
resolve(body);
|
|
226
|
+
});
|
|
227
|
+
request.on('error', reject);
|
|
228
|
+
});
|
|
229
|
+
}
|
|
230
|
+
writeOptions(response) {
|
|
231
|
+
response.writeHead(204, {
|
|
232
|
+
'Access-Control-Allow-Origin': '*',
|
|
233
|
+
'Access-Control-Allow-Methods': 'GET, POST, OPTIONS',
|
|
234
|
+
'Access-Control-Allow-Headers': 'Authorization, Content-Type',
|
|
235
|
+
'Access-Control-Max-Age': '86400',
|
|
236
|
+
});
|
|
237
|
+
response.end();
|
|
238
|
+
}
|
|
239
|
+
writeJsonResponse(response, data, statusCode = 200) {
|
|
240
|
+
const json = JSON.stringify(data, null, 2);
|
|
241
|
+
response.writeHead(statusCode, {
|
|
242
|
+
'Content-Type': 'application/json; charset=utf-8',
|
|
243
|
+
'Content-Length': Buffer.byteLength(json),
|
|
244
|
+
'Access-Control-Allow-Origin': '*',
|
|
245
|
+
'Cache-Control': 'no-cache, no-store, must-revalidate',
|
|
246
|
+
});
|
|
247
|
+
response.end(json);
|
|
248
|
+
}
|
|
249
|
+
parseUrl(request) {
|
|
250
|
+
const urlString = request.url;
|
|
251
|
+
if (!urlString) {
|
|
252
|
+
throw new community_server_2.BadRequestHttpError('Invalid request URL.');
|
|
253
|
+
}
|
|
254
|
+
try {
|
|
255
|
+
return new URL(urlString, `http://${request.headers.host ?? 'localhost'}`);
|
|
256
|
+
}
|
|
257
|
+
catch {
|
|
258
|
+
throw new community_server_2.BadRequestHttpError('Invalid request URL format.');
|
|
259
|
+
}
|
|
260
|
+
}
|
|
261
|
+
matchesBase(pathname) {
|
|
262
|
+
return pathname === this.basePath || pathname.startsWith(this.basePathWithSlash);
|
|
263
|
+
}
|
|
264
|
+
toRelative(pathname) {
|
|
265
|
+
if (pathname === this.basePath) {
|
|
266
|
+
return '';
|
|
267
|
+
}
|
|
268
|
+
if (pathname.startsWith(this.basePathWithSlash)) {
|
|
269
|
+
return pathname.substring(this.basePathWithSlash.length);
|
|
270
|
+
}
|
|
271
|
+
return pathname;
|
|
272
|
+
}
|
|
273
|
+
normalizeBasePath(path) {
|
|
274
|
+
const trimmed = path.trim();
|
|
275
|
+
if (!trimmed.startsWith('/')) {
|
|
276
|
+
return `/${trimmed}`;
|
|
277
|
+
}
|
|
278
|
+
return trimmed.endsWith('/') ? trimmed.slice(0, -1) : trimmed;
|
|
279
|
+
}
|
|
280
|
+
normalizeBoolean(value) {
|
|
281
|
+
if (typeof value === 'boolean') {
|
|
282
|
+
return value;
|
|
283
|
+
}
|
|
284
|
+
if (typeof value === 'string') {
|
|
285
|
+
const normalized = value.trim().toLowerCase();
|
|
286
|
+
return normalized === 'true' || normalized === '1' || normalized === 'yes' || normalized === 'on';
|
|
287
|
+
}
|
|
288
|
+
return false;
|
|
289
|
+
}
|
|
290
|
+
}
|
|
291
|
+
exports.EdgeNodeAdminHttpHandler = EdgeNodeAdminHttpHandler;
|
|
292
|
+
//# sourceMappingURL=EdgeNodeAdminHttpHandler.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"EdgeNodeAdminHttpHandler.js","sourceRoot":"","sources":["../../../src/http/admin/EdgeNodeAdminHttpHandler.ts"],"names":[],"mappings":"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","sourcesContent":["import type { IncomingMessage } from 'node:http';\nimport { getLoggerFor } from 'global-logger-factory';\nimport { HttpHandler } from '@solid/community-server';\nimport type { HttpHandlerInput, HttpResponse } from '@solid/community-server';\nimport {\n BadRequestHttpError,\n InternalServerError,\n MethodNotAllowedHttpError,\n NotFoundHttpError,\n NotImplementedHttpError,\n \n} from '@solid/community-server';\nimport { getIdentityDatabase } from '../../identity/drizzle/db';\nimport { EdgeNodeRepository } from '../../identity/drizzle/EdgeNodeRepository';\nimport { EdgeNodeCapabilityDetector } from '../../edge/EdgeNodeCapabilityDetector';\n\ninterface EdgeNodeAdminHttpHandlerOptions {\n identityDbUrl: string;\n basePath?: string;\n edgeNodesEnabled?: string | boolean;\n repository?: EdgeNodeRepository;\n capabilityDetector?: EdgeNodeCapabilityDetector;\n}\n\n/**\n * Edge Node Administration HTTP Handler\n * \n * Provides REST API endpoints for edge node administration:\n * - GET /admin/nodes - List all nodes with their capabilities\n * - GET /admin/nodes/{nodeId} - Get specific node information\n * - GET /admin/nodes/{nodeId}/capabilities - Get node capability details\n */\nexport class EdgeNodeAdminHttpHandler extends HttpHandler {\n protected readonly logger = getLoggerFor(this);\n private readonly repo: EdgeNodeRepository;\n private readonly basePath: string;\n private readonly basePathWithSlash: string;\n private readonly enabled: boolean;\n private readonly capabilityDetector?: EdgeNodeCapabilityDetector;\n\n public constructor(options: EdgeNodeAdminHttpHandlerOptions) {\n super();\n this.repo = options.repository ?? new EdgeNodeRepository(getIdentityDatabase(options.identityDbUrl));\n this.basePath = this.normalizeBasePath(options.basePath ?? '/admin/nodes');\n this.basePathWithSlash = `${this.basePath}/`;\n this.enabled = this.normalizeBoolean(options.edgeNodesEnabled);\n this.capabilityDetector = options.capabilityDetector;\n }\n\n public override async canHandle({ request }: HttpHandlerInput): Promise<void> {\n if (!this.enabled) {\n throw new NotImplementedHttpError('Edge node admin API is disabled.');\n }\n const pathname = this.parseUrl(request).pathname;\n if (!this.matchesBase(pathname)) {\n throw new NotImplementedHttpError('Not an edge node admin request.');\n }\n }\n\n public override async handle({ request, response }: HttpHandlerInput): Promise<void> {\n const method = (request.method ?? 'GET').toUpperCase();\n if (method === 'OPTIONS') {\n this.writeOptions(response);\n return;\n }\n \n const url = this.parseUrl(request);\n const relative = this.toRelative(url.pathname);\n \n try {\n switch (method) {\n case 'GET':\n await this.handleGet(relative, response);\n break;\n case 'POST':\n await this.handlePost(relative, request, response);\n break;\n default:\n throw new MethodNotAllowedHttpError(['GET', 'POST', 'OPTIONS']);\n }\n } catch (error: unknown) {\n if (error instanceof Error) {\n this.logger.error(`Edge node admin API error: ${error.message}`);\n }\n throw error;\n }\n }\n\n private async handleGet(path: string, response: HttpResponse): Promise<void> {\n if (path === '') {\n // GET /admin/nodes - List all nodes\n await this.listNodes(response);\n } else {\n // Parse path segments\n const segments = path.split('/').filter(s => s.length > 0);\n \n if (segments.length === 1) {\n // GET /admin/nodes/{nodeId} - Get specific node\n await this.getNode(segments[0], response);\n } else if (segments.length === 2 && segments[1] === 'capabilities') {\n // GET /admin/nodes/{nodeId}/capabilities - Get node capabilities\n await this.getNodeCapabilities(segments[0], response);\n } else {\n throw new NotFoundHttpError('Unknown endpoint.');\n }\n }\n }\n\n private async listNodes(response: HttpResponse): Promise<void> {\n try {\n const nodes = await this.repo.listNodeCapabilities();\n \n const result = {\n nodes: nodes.map(node => ({\n nodeId: node.nodeId,\n accessMode: node.accessMode,\n connectivityStatus: node.connectivityStatus,\n lastSeen: node.lastSeen?.toISOString(),\n capabilities: {\n structured: node.capabilities,\n strings: node.stringCapabilities,\n },\n })),\n total: nodes.length,\n timestamp: new Date().toISOString(),\n };\n\n this.writeJsonResponse(response, result);\n } catch (error: unknown) {\n throw new InternalServerError('Failed to list edge nodes.', { cause: error });\n }\n }\n\n private async getNode(nodeId: string, response: HttpResponse): Promise<void> {\n try {\n const nodeInfo = await this.repo.getNodeCapabilities(nodeId);\n \n if (!nodeInfo) {\n throw new NotFoundHttpError(`Edge node '${nodeId}' not found.`);\n }\n\n const result = {\n nodeId: nodeInfo.nodeId,\n accessMode: nodeInfo.accessMode,\n connectivityStatus: nodeInfo.connectivityStatus,\n lastSeen: nodeInfo.lastSeen?.toISOString(),\n capabilities: {\n structured: nodeInfo.capabilities,\n strings: nodeInfo.stringCapabilities,\n },\n timestamp: new Date().toISOString(),\n };\n\n this.writeJsonResponse(response, result);\n } catch (error: unknown) {\n if (error instanceof NotFoundHttpError) {\n throw error;\n }\n throw new InternalServerError('Failed to get edge node information.', { cause: error });\n }\n }\n\n private async getNodeCapabilities(nodeId: string, response: HttpResponse): Promise<void> {\n try {\n const nodeInfo = await this.repo.getNodeCapabilities(nodeId);\n \n if (!nodeInfo) {\n throw new NotFoundHttpError(`Edge node '${nodeId}' not found.`);\n }\n\n // If we have a capability detector, also provide real-time capability detection\n let detectedCapabilities;\n if (this.capabilityDetector) {\n try {\n detectedCapabilities = await this.capabilityDetector.detectCapabilities();\n } catch (error: unknown) {\n this.logger.warn(`Failed to detect real-time capabilities for node ${nodeId}: ${(error as Error).message}`);\n }\n }\n\n const result = {\n nodeId: nodeInfo.nodeId,\n capabilities: {\n // Stored structured capabilities from the database\n stored: nodeInfo.capabilities,\n // String capabilities array for backward compatibility\n strings: nodeInfo.stringCapabilities,\n // Real-time detected capabilities (if available)\n detected: detectedCapabilities,\n // Parsed capabilities from strings for easier consumption\n parsed: nodeInfo.stringCapabilities ? \n EdgeNodeCapabilityDetector.parseCapabilitiesFromStringArray(nodeInfo.stringCapabilities) : \n null,\n },\n accessMode: nodeInfo.accessMode,\n connectivityStatus: nodeInfo.connectivityStatus,\n lastSeen: nodeInfo.lastSeen?.toISOString(),\n timestamp: new Date().toISOString(),\n };\n\n this.writeJsonResponse(response, result);\n } catch (error: unknown) {\n if (error instanceof NotFoundHttpError) {\n throw error;\n }\n throw new InternalServerError('Failed to get edge node capabilities.', { cause: error });\n }\n }\n\n private async handlePost(path: string, request: IncomingMessage, response: HttpResponse): Promise<void> {\n if (path === '') {\n // POST /admin/nodes - Create new node\n await this.createNode(request, response);\n } else {\n throw new NotFoundHttpError('Unknown endpoint.');\n }\n }\n\n private async createNode(request: IncomingMessage, response: HttpResponse): Promise<void> {\n const payload = await this.readRequestBody(request);\n let displayName: string | undefined;\n\n // Parse request body if provided\n if (payload) {\n try {\n const data = JSON.parse(payload);\n displayName = typeof data.displayName === 'string' ? data.displayName : undefined;\n } catch {\n // Ignore JSON parsing errors, displayName will remain undefined\n }\n }\n\n try {\n const result = await this.repo.createNode(displayName);\n \n this.logger.info(`Created new edge node: ${result.nodeId} (${displayName || 'no display name'})`);\n \n const response_data = {\n success: true,\n nodeId: result.nodeId,\n token: result.token,\n displayName: displayName,\n createdAt: result.createdAt,\n message: 'Edge node created successfully. Save the token - it will not be shown again.',\n };\n\n this.writeJsonResponse(response, response_data, 201);\n } catch (error: unknown) {\n this.logger.error(`Failed to create edge node: ${String(error)}`);\n throw new InternalServerError('Failed to create edge node.', { cause: error });\n }\n }\n\n private async readRequestBody(request: IncomingMessage): Promise<string> {\n return new Promise((resolve, reject) => {\n let body = '';\n request.on('data', (chunk: Buffer) => {\n body += chunk.toString();\n });\n request.on('end', () => {\n resolve(body);\n });\n request.on('error', reject);\n });\n }\n\n private writeOptions(response: HttpResponse): void {\n response.writeHead(204, {\n 'Access-Control-Allow-Origin': '*',\n 'Access-Control-Allow-Methods': 'GET, POST, OPTIONS',\n 'Access-Control-Allow-Headers': 'Authorization, Content-Type',\n 'Access-Control-Max-Age': '86400',\n });\n response.end();\n }\n\n private writeJsonResponse(response: HttpResponse, data: unknown, statusCode = 200): void {\n const json = JSON.stringify(data, null, 2);\n response.writeHead(statusCode, {\n 'Content-Type': 'application/json; charset=utf-8',\n 'Content-Length': Buffer.byteLength(json),\n 'Access-Control-Allow-Origin': '*',\n 'Cache-Control': 'no-cache, no-store, must-revalidate',\n });\n response.end(json);\n }\n\n private parseUrl(request: IncomingMessage): URL {\n const urlString = request.url;\n if (!urlString) {\n throw new BadRequestHttpError('Invalid request URL.');\n }\n try {\n return new URL(urlString, `http://${request.headers.host ?? 'localhost'}`);\n } catch {\n throw new BadRequestHttpError('Invalid request URL format.');\n }\n }\n\n private matchesBase(pathname: string): boolean {\n return pathname === this.basePath || pathname.startsWith(this.basePathWithSlash);\n }\n\n private toRelative(pathname: string): string {\n if (pathname === this.basePath) {\n return '';\n }\n if (pathname.startsWith(this.basePathWithSlash)) {\n return pathname.substring(this.basePathWithSlash.length);\n }\n return pathname;\n }\n\n private normalizeBasePath(path: string): string {\n const trimmed = path.trim();\n if (!trimmed.startsWith('/')) {\n return `/${trimmed}`;\n }\n return trimmed.endsWith('/') ? trimmed.slice(0, -1) : trimmed;\n }\n\n private normalizeBoolean(value?: string | boolean): boolean {\n if (typeof value === 'boolean') {\n return value;\n }\n if (typeof value === 'string') {\n const normalized = value.trim().toLowerCase();\n return normalized === 'true' || normalized === '1' || normalized === 'yes' || normalized === 'on';\n }\n return false;\n }\n}"]}
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
import { HttpHandler } from '@solid/community-server';
|
|
2
|
+
import type { HttpHandlerInput } from '@solid/community-server';
|
|
3
|
+
import { EdgeNodeRepository } from '../../identity/drizzle/EdgeNodeRepository';
|
|
4
|
+
import { EdgeNodeCertificateService } from '../../service/EdgeNodeCertificateService';
|
|
5
|
+
interface EdgeNodeCertificateHttpHandlerOptions {
|
|
6
|
+
identityDbUrl: string;
|
|
7
|
+
edgeNodesEnabled?: string | boolean;
|
|
8
|
+
repository?: EdgeNodeRepository;
|
|
9
|
+
certificateService: EdgeNodeCertificateService;
|
|
10
|
+
basePath?: string;
|
|
11
|
+
}
|
|
12
|
+
export declare class EdgeNodeCertificateHttpHandler extends HttpHandler {
|
|
13
|
+
protected readonly logger: import("global-logger-factory").Logger<unknown>;
|
|
14
|
+
private readonly repo;
|
|
15
|
+
private readonly basePath;
|
|
16
|
+
private readonly basePathWithSlash;
|
|
17
|
+
private readonly enabled;
|
|
18
|
+
private readonly service;
|
|
19
|
+
constructor(options: EdgeNodeCertificateHttpHandlerOptions);
|
|
20
|
+
canHandle({ request }: HttpHandlerInput): Promise<void>;
|
|
21
|
+
handle({ request, response }: HttpHandlerInput): Promise<void>;
|
|
22
|
+
private readPayload;
|
|
23
|
+
private extractSubdomain;
|
|
24
|
+
private readBody;
|
|
25
|
+
private writeOptions;
|
|
26
|
+
private requireString;
|
|
27
|
+
private matchesBase;
|
|
28
|
+
private toRelative;
|
|
29
|
+
private parseUrl;
|
|
30
|
+
private normalizeBasePath;
|
|
31
|
+
private normalizeBoolean;
|
|
32
|
+
}
|
|
33
|
+
export {};
|
|
@@ -0,0 +1,172 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.EdgeNodeCertificateHttpHandler = void 0;
|
|
4
|
+
const global_logger_factory_1 = require("global-logger-factory");
|
|
5
|
+
const community_server_1 = require("@solid/community-server");
|
|
6
|
+
const community_server_2 = require("@solid/community-server");
|
|
7
|
+
const db_1 = require("../../identity/drizzle/db");
|
|
8
|
+
const EdgeNodeRepository_1 = require("../../identity/drizzle/EdgeNodeRepository");
|
|
9
|
+
class EdgeNodeCertificateHttpHandler extends community_server_1.HttpHandler {
|
|
10
|
+
constructor(options) {
|
|
11
|
+
super();
|
|
12
|
+
this.logger = (0, global_logger_factory_1.getLoggerFor)(this);
|
|
13
|
+
this.repo = options.repository ?? new EdgeNodeRepository_1.EdgeNodeRepository((0, db_1.getIdentityDatabase)(options.identityDbUrl));
|
|
14
|
+
this.service = options.certificateService;
|
|
15
|
+
this.basePath = this.normalizeBasePath(options.basePath ?? '/api/signal/certificate');
|
|
16
|
+
this.basePathWithSlash = `${this.basePath}/`;
|
|
17
|
+
this.enabled = this.normalizeBoolean(options.edgeNodesEnabled);
|
|
18
|
+
}
|
|
19
|
+
async canHandle({ request }) {
|
|
20
|
+
if (!this.enabled) {
|
|
21
|
+
throw new community_server_2.NotImplementedHttpError('Edge node certificates are disabled.');
|
|
22
|
+
}
|
|
23
|
+
const pathname = this.parseUrl(request).pathname;
|
|
24
|
+
if (!this.matchesBase(pathname)) {
|
|
25
|
+
throw new community_server_2.NotImplementedHttpError('Not an edge node certificate request.');
|
|
26
|
+
}
|
|
27
|
+
}
|
|
28
|
+
async handle({ request, response }) {
|
|
29
|
+
const method = (request.method ?? 'GET').toUpperCase();
|
|
30
|
+
if (method === 'OPTIONS') {
|
|
31
|
+
this.writeOptions(response);
|
|
32
|
+
return;
|
|
33
|
+
}
|
|
34
|
+
if (method !== 'POST') {
|
|
35
|
+
throw new community_server_2.MethodNotAllowedHttpError(['POST', 'OPTIONS']);
|
|
36
|
+
}
|
|
37
|
+
const url = this.parseUrl(request);
|
|
38
|
+
const relative = this.toRelative(url.pathname);
|
|
39
|
+
if (relative !== '') {
|
|
40
|
+
throw new community_server_2.NotImplementedHttpError('Unknown certificate endpoint.');
|
|
41
|
+
}
|
|
42
|
+
const payload = await this.readPayload(request);
|
|
43
|
+
const secret = await this.repo.getNodeSecret(payload.nodeId);
|
|
44
|
+
if (!secret || !secret.tokenHash || !this.repo.matchesToken(secret.tokenHash, payload.token)) {
|
|
45
|
+
throw new community_server_2.UnauthorizedHttpError('Edge node authentication failed.');
|
|
46
|
+
}
|
|
47
|
+
const connectivity = await this.repo.getNodeConnectivityInfo(payload.nodeId);
|
|
48
|
+
const subdomain = this.extractSubdomain(connectivity?.subdomain, secret.metadata);
|
|
49
|
+
if (!subdomain) {
|
|
50
|
+
throw new community_server_2.BadRequestHttpError('Node has no assigned subdomain; cannot issue certificate.');
|
|
51
|
+
}
|
|
52
|
+
try {
|
|
53
|
+
const issued = await this.service.issueCertificate({
|
|
54
|
+
nodeId: payload.nodeId,
|
|
55
|
+
csr: payload.csr,
|
|
56
|
+
subdomain,
|
|
57
|
+
});
|
|
58
|
+
response.statusCode = 200;
|
|
59
|
+
response.setHeader('Content-Type', 'application/json; charset=utf-8');
|
|
60
|
+
response.setHeader('Cache-Control', 'no-store');
|
|
61
|
+
response.end(JSON.stringify({
|
|
62
|
+
status: 'issued',
|
|
63
|
+
certificate: {
|
|
64
|
+
pem: issued.certificate,
|
|
65
|
+
fullChain: issued.fullChain,
|
|
66
|
+
expiresAt: issued.expiresAt,
|
|
67
|
+
domains: issued.domains,
|
|
68
|
+
},
|
|
69
|
+
}));
|
|
70
|
+
}
|
|
71
|
+
catch (error) {
|
|
72
|
+
this.logger.error(`Failed to issue certificate for node ${payload.nodeId}: ${error.message}`);
|
|
73
|
+
throw new community_server_2.InternalServerError('Failed to issue certificate.', { cause: error });
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
async readPayload(request) {
|
|
77
|
+
const body = await this.readBody(request);
|
|
78
|
+
if (!body) {
|
|
79
|
+
throw new community_server_2.BadRequestHttpError('请求体不能为空。');
|
|
80
|
+
}
|
|
81
|
+
let parsed;
|
|
82
|
+
try {
|
|
83
|
+
parsed = JSON.parse(body);
|
|
84
|
+
}
|
|
85
|
+
catch (error) {
|
|
86
|
+
throw new community_server_2.BadRequestHttpError('请求体必须是有效 JSON。', { cause: error });
|
|
87
|
+
}
|
|
88
|
+
if (typeof parsed !== 'object' || parsed === null) {
|
|
89
|
+
throw new community_server_2.BadRequestHttpError('请求体必须是 JSON 对象。');
|
|
90
|
+
}
|
|
91
|
+
const record = parsed;
|
|
92
|
+
const nodeId = this.requireString(record.nodeId, 'nodeId');
|
|
93
|
+
const token = this.requireString(record.token, 'token');
|
|
94
|
+
const csr = this.requireString(record.csr, 'csr');
|
|
95
|
+
return { nodeId, token, csr };
|
|
96
|
+
}
|
|
97
|
+
extractSubdomain(connectivitySubdomain, metadata) {
|
|
98
|
+
if (typeof connectivitySubdomain === 'string' && connectivitySubdomain.trim().length > 0) {
|
|
99
|
+
return connectivitySubdomain.trim();
|
|
100
|
+
}
|
|
101
|
+
const meta = metadata ?? undefined;
|
|
102
|
+
if (meta && typeof meta === 'object' && typeof meta.subdomain === 'string') {
|
|
103
|
+
const trimmed = meta.subdomain.trim();
|
|
104
|
+
return trimmed.length > 0 ? trimmed : undefined;
|
|
105
|
+
}
|
|
106
|
+
return undefined;
|
|
107
|
+
}
|
|
108
|
+
readBody(request) {
|
|
109
|
+
return new Promise((resolve, reject) => {
|
|
110
|
+
let data = '';
|
|
111
|
+
request.setEncoding('utf8');
|
|
112
|
+
request.on('data', (chunk) => {
|
|
113
|
+
data += chunk;
|
|
114
|
+
});
|
|
115
|
+
request.on('end', () => resolve(data));
|
|
116
|
+
request.on('error', reject);
|
|
117
|
+
});
|
|
118
|
+
}
|
|
119
|
+
writeOptions(response) {
|
|
120
|
+
response.statusCode = 204;
|
|
121
|
+
response.setHeader('Allow', 'POST,OPTIONS');
|
|
122
|
+
response.end();
|
|
123
|
+
}
|
|
124
|
+
requireString(value, field) {
|
|
125
|
+
if (typeof value !== 'string') {
|
|
126
|
+
throw new community_server_2.BadRequestHttpError(`${field} 必须是字符串。`);
|
|
127
|
+
}
|
|
128
|
+
const trimmed = value.trim();
|
|
129
|
+
if (trimmed.length === 0) {
|
|
130
|
+
throw new community_server_2.BadRequestHttpError(`${field} 不能为空。`);
|
|
131
|
+
}
|
|
132
|
+
return trimmed;
|
|
133
|
+
}
|
|
134
|
+
matchesBase(pathname) {
|
|
135
|
+
return pathname === this.basePath || pathname.startsWith(this.basePathWithSlash);
|
|
136
|
+
}
|
|
137
|
+
toRelative(pathname) {
|
|
138
|
+
if (pathname === this.basePath) {
|
|
139
|
+
return '';
|
|
140
|
+
}
|
|
141
|
+
if (!pathname.startsWith(this.basePathWithSlash)) {
|
|
142
|
+
return null;
|
|
143
|
+
}
|
|
144
|
+
return pathname.slice(this.basePathWithSlash.length);
|
|
145
|
+
}
|
|
146
|
+
parseUrl(request) {
|
|
147
|
+
const hostHeader = request.headers.host ?? request.headers.Host ?? 'localhost';
|
|
148
|
+
const protoHeader = request.headers['x-forwarded-proto'] ?? request.headers['X-Forwarded-Proto'];
|
|
149
|
+
const protocol = Array.isArray(protoHeader) ? protoHeader[0] : protoHeader;
|
|
150
|
+
const scheme = typeof protocol === 'string' ? protocol.split(',')[0]?.trim() ?? 'http' : 'http';
|
|
151
|
+
const rawUrl = request.url ?? '/';
|
|
152
|
+
return new URL(rawUrl, `${scheme}://${hostHeader}`);
|
|
153
|
+
}
|
|
154
|
+
normalizeBasePath(input) {
|
|
155
|
+
if (!input.startsWith('/')) {
|
|
156
|
+
throw new community_server_2.BadRequestHttpError('Certificate base path must start with /.');
|
|
157
|
+
}
|
|
158
|
+
return input.endsWith('/') ? input.slice(0, -1) : input;
|
|
159
|
+
}
|
|
160
|
+
normalizeBoolean(value) {
|
|
161
|
+
if (typeof value === 'boolean') {
|
|
162
|
+
return value;
|
|
163
|
+
}
|
|
164
|
+
if (typeof value === 'string') {
|
|
165
|
+
const normalized = value.trim().toLowerCase();
|
|
166
|
+
return normalized === 'true' || normalized === '1' || normalized === 'yes' || normalized === 'on';
|
|
167
|
+
}
|
|
168
|
+
return false;
|
|
169
|
+
}
|
|
170
|
+
}
|
|
171
|
+
exports.EdgeNodeCertificateHttpHandler = EdgeNodeCertificateHttpHandler;
|
|
172
|
+
//# sourceMappingURL=EdgeNodeCertificateHttpHandler.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"EdgeNodeCertificateHttpHandler.js","sourceRoot":"","sources":["../../../src/http/admin/EdgeNodeCertificateHttpHandler.ts"],"names":[],"mappings":"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","sourcesContent":["import type { IncomingMessage } from 'node:http';\nimport { getLoggerFor } from 'global-logger-factory';\nimport { HttpHandler } from '@solid/community-server';\nimport type { HttpHandlerInput } from '@solid/community-server';\nimport {\n BadRequestHttpError,\n MethodNotAllowedHttpError,\n NotImplementedHttpError,\n UnauthorizedHttpError,\n InternalServerError,\n \n} from '@solid/community-server';\nimport { getIdentityDatabase } from '../../identity/drizzle/db';\nimport { EdgeNodeRepository } from '../../identity/drizzle/EdgeNodeRepository';\nimport { EdgeNodeCertificateService } from '../../service/EdgeNodeCertificateService';\n\ninterface EdgeNodeCertificateHttpHandlerOptions {\n identityDbUrl: string;\n edgeNodesEnabled?: string | boolean;\n repository?: EdgeNodeRepository;\n certificateService: EdgeNodeCertificateService;\n basePath?: string;\n}\n\ninterface CertificateRequestPayload {\n nodeId: string;\n token: string;\n csr: string;\n}\n\nexport class EdgeNodeCertificateHttpHandler extends HttpHandler {\n protected readonly logger = getLoggerFor(this);\n private readonly repo: EdgeNodeRepository;\n private readonly basePath: string;\n private readonly basePathWithSlash: string;\n private readonly enabled: boolean;\n private readonly service: EdgeNodeCertificateService;\n\n public constructor(options: EdgeNodeCertificateHttpHandlerOptions) {\n super();\n this.repo = options.repository ?? new EdgeNodeRepository(getIdentityDatabase(options.identityDbUrl));\n this.service = options.certificateService;\n this.basePath = this.normalizeBasePath(options.basePath ?? '/api/signal/certificate');\n this.basePathWithSlash = `${this.basePath}/`;\n this.enabled = this.normalizeBoolean(options.edgeNodesEnabled);\n }\n\n public override async canHandle({ request }: HttpHandlerInput): Promise<void> {\n if (!this.enabled) {\n throw new NotImplementedHttpError('Edge node certificates are disabled.');\n }\n const pathname = this.parseUrl(request).pathname;\n if (!this.matchesBase(pathname)) {\n throw new NotImplementedHttpError('Not an edge node certificate request.');\n }\n }\n\n public override async handle({ request, response }: HttpHandlerInput): Promise<void> {\n const method = (request.method ?? 'GET').toUpperCase();\n if (method === 'OPTIONS') {\n this.writeOptions(response);\n return;\n }\n if (method !== 'POST') {\n throw new MethodNotAllowedHttpError([ 'POST', 'OPTIONS' ]);\n }\n\n const url = this.parseUrl(request);\n const relative = this.toRelative(url.pathname);\n if (relative !== '') {\n throw new NotImplementedHttpError('Unknown certificate endpoint.');\n }\n\n const payload = await this.readPayload(request);\n const secret = await this.repo.getNodeSecret(payload.nodeId);\n if (!secret || !secret.tokenHash || !this.repo.matchesToken(secret.tokenHash, payload.token)) {\n throw new UnauthorizedHttpError('Edge node authentication failed.');\n }\n\n const connectivity = await this.repo.getNodeConnectivityInfo(payload.nodeId);\n const subdomain = this.extractSubdomain(connectivity?.subdomain, secret.metadata);\n if (!subdomain) {\n throw new BadRequestHttpError('Node has no assigned subdomain; cannot issue certificate.');\n }\n\n try {\n const issued = await this.service.issueCertificate({\n nodeId: payload.nodeId,\n csr: payload.csr,\n subdomain,\n });\n\n response.statusCode = 200;\n response.setHeader('Content-Type', 'application/json; charset=utf-8');\n response.setHeader('Cache-Control', 'no-store');\n response.end(JSON.stringify({\n status: 'issued',\n certificate: {\n pem: issued.certificate,\n fullChain: issued.fullChain,\n expiresAt: issued.expiresAt,\n domains: issued.domains,\n },\n }));\n } catch (error: unknown) {\n this.logger.error(`Failed to issue certificate for node ${payload.nodeId}: ${(error as Error).message}`);\n throw new InternalServerError('Failed to issue certificate.', { cause: error });\n }\n }\n\n private async readPayload(request: IncomingMessage): Promise<CertificateRequestPayload> {\n const body = await this.readBody(request);\n if (!body) {\n throw new BadRequestHttpError('请求体不能为空。');\n }\n let parsed: unknown;\n try {\n parsed = JSON.parse(body);\n } catch (error: unknown) {\n throw new BadRequestHttpError('请求体必须是有效 JSON。', { cause: error });\n }\n if (typeof parsed !== 'object' || parsed === null) {\n throw new BadRequestHttpError('请求体必须是 JSON 对象。');\n }\n const record = parsed as Record<string, unknown>;\n const nodeId = this.requireString(record.nodeId, 'nodeId');\n const token = this.requireString(record.token, 'token');\n const csr = this.requireString(record.csr, 'csr');\n return { nodeId, token, csr };\n }\n\n private extractSubdomain(connectivitySubdomain?: string, metadata?: Record<string, unknown> | null): string | undefined {\n if (typeof connectivitySubdomain === 'string' && connectivitySubdomain.trim().length > 0) {\n return connectivitySubdomain.trim();\n }\n const meta = metadata ?? undefined;\n if (meta && typeof meta === 'object' && typeof meta.subdomain === 'string') {\n const trimmed = meta.subdomain.trim();\n return trimmed.length > 0 ? trimmed : undefined;\n }\n return undefined;\n }\n\n private readBody(request: IncomingMessage): Promise<string> {\n return new Promise((resolve, reject) => {\n let data = '';\n request.setEncoding('utf8');\n request.on('data', (chunk: string) => {\n data += chunk;\n });\n request.on('end', () => resolve(data));\n request.on('error', reject);\n });\n }\n\n private writeOptions(response: any): void {\n response.statusCode = 204;\n response.setHeader('Allow', 'POST,OPTIONS');\n response.end();\n }\n\n private requireString(value: unknown, field: string): string {\n if (typeof value !== 'string') {\n throw new BadRequestHttpError(`${field} 必须是字符串。`);\n }\n const trimmed = value.trim();\n if (trimmed.length === 0) {\n throw new BadRequestHttpError(`${field} 不能为空。`);\n }\n return trimmed;\n }\n\n private matchesBase(pathname: string): boolean {\n return pathname === this.basePath || pathname.startsWith(this.basePathWithSlash);\n }\n\n private toRelative(pathname: string): string | null {\n if (pathname === this.basePath) {\n return '';\n }\n if (!pathname.startsWith(this.basePathWithSlash)) {\n return null;\n }\n return pathname.slice(this.basePathWithSlash.length);\n }\n\n private parseUrl(request: IncomingMessage): URL {\n const hostHeader = request.headers.host ?? request.headers.Host ?? 'localhost';\n const protoHeader = request.headers['x-forwarded-proto'] ?? request.headers['X-Forwarded-Proto'];\n const protocol = Array.isArray(protoHeader) ? protoHeader[0] : protoHeader;\n const scheme = typeof protocol === 'string' ? protocol.split(',')[0]?.trim() ?? 'http' : 'http';\n const rawUrl = request.url ?? '/';\n return new URL(rawUrl, `${scheme}://${hostHeader}`);\n }\n\n private normalizeBasePath(input: string): string {\n if (!input.startsWith('/')) {\n throw new BadRequestHttpError('Certificate base path must start with /.');\n }\n return input.endsWith('/') ? input.slice(0, -1) : input;\n }\n\n private normalizeBoolean(value?: string | boolean): boolean {\n if (typeof value === 'boolean') {\n return value;\n }\n if (typeof value === 'string') {\n const normalized = value.trim().toLowerCase();\n return normalized === 'true' || normalized === '1' || normalized === 'yes' || normalized === 'on';\n }\n return false;\n }\n}\n"]}
|