@undefineds.co/xpod 0.1.6 → 0.2.0-preview.2
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/README.md +141 -2
- package/config/cli.json +9 -71
- package/config/cloud.json +34 -7
- package/config/local.json +6 -2
- package/config/resolver.json +11 -49
- package/config/runtime-open.json +22 -0
- package/config/xpod.base.json +32 -0
- package/config/xpod.cluster.json +2 -44
- package/config/xpod.json +5 -2
- package/dist/api/ApiServer.js +1 -1
- package/dist/api/ApiServer.js.map +1 -1
- package/dist/api/auth/AuthContext.d.ts +12 -1
- package/dist/api/auth/AuthContext.js +18 -1
- package/dist/api/auth/AuthContext.js.map +1 -1
- package/dist/api/auth/ClientCredentialsAuthenticator.d.ts +0 -1
- package/dist/api/auth/ClientCredentialsAuthenticator.js.map +1 -1
- package/dist/api/auth/ServiceTokenAuthenticator.d.ts +18 -0
- package/dist/api/auth/ServiceTokenAuthenticator.js +50 -0
- package/dist/api/auth/ServiceTokenAuthenticator.js.map +1 -0
- package/dist/api/auth/index.d.ts +1 -0
- package/dist/api/auth/index.js +1 -0
- package/dist/api/auth/index.js.map +1 -1
- package/dist/api/chatkit/ai-provider.d.ts +0 -10
- package/dist/api/chatkit/ai-provider.js +11 -120
- package/dist/api/chatkit/ai-provider.js.map +1 -1
- package/dist/api/chatkit/default-agent.js +11 -8
- package/dist/api/chatkit/default-agent.js.map +1 -1
- package/dist/api/chatkit/pod-store.js +19 -3
- package/dist/api/chatkit/pod-store.js.map +1 -1
- package/dist/api/chatkit/schema.d.ts +9 -3
- package/dist/api/chatkit/schema.js +14 -6
- package/dist/api/chatkit/schema.js.map +1 -1
- package/dist/api/container/business-token.d.ts +9 -0
- package/dist/api/container/business-token.js +32 -0
- package/dist/api/container/business-token.js.map +1 -0
- package/dist/api/container/cloud.js +36 -12
- package/dist/api/container/cloud.js.map +1 -1
- package/dist/api/container/common.js +12 -5
- package/dist/api/container/common.js.map +1 -1
- package/dist/api/container/index.js +94 -14
- package/dist/api/container/index.js.map +1 -1
- package/dist/api/container/local.js +2 -1
- package/dist/api/container/local.js.map +1 -1
- package/dist/api/container/routes.js +81 -15
- package/dist/api/container/routes.js.map +1 -1
- package/dist/api/container/types.d.ts +8 -6
- package/dist/api/container/types.js.map +1 -1
- package/dist/api/handlers/AdminHandler.js +9 -9
- package/dist/api/handlers/AdminHandler.js.map +1 -1
- package/dist/api/handlers/ApiKeyHandler.js +0 -6
- package/dist/api/handlers/ApiKeyHandler.js.map +1 -1
- package/dist/api/handlers/EdgeNodeSignalHandler.d.ts +17 -0
- package/dist/api/handlers/EdgeNodeSignalHandler.js +171 -0
- package/dist/api/handlers/EdgeNodeSignalHandler.js.map +1 -0
- package/dist/api/handlers/PodManagementHandler.d.ts +5 -4
- package/dist/api/handlers/PodManagementHandler.js +11 -10
- package/dist/api/handlers/PodManagementHandler.js.map +1 -1
- package/dist/api/handlers/ProvisionHandler.d.ts +42 -0
- package/dist/api/handlers/ProvisionHandler.js +161 -0
- package/dist/api/handlers/ProvisionHandler.js.map +1 -0
- package/dist/api/handlers/QuotaHandler.d.ts +7 -7
- package/dist/api/handlers/QuotaHandler.js +143 -73
- package/dist/api/handlers/QuotaHandler.js.map +1 -1
- package/dist/api/handlers/SubdomainClientHandler.js +2 -2
- package/dist/api/handlers/SubdomainClientHandler.js.map +1 -1
- package/dist/api/handlers/SubdomainHandler.js +13 -8
- package/dist/api/handlers/SubdomainHandler.js.map +1 -1
- package/dist/api/handlers/UsageHandler.d.ts +14 -0
- package/dist/api/handlers/UsageHandler.js +123 -0
- package/dist/api/handlers/UsageHandler.js.map +1 -0
- package/dist/api/handlers/index.d.ts +3 -1
- package/dist/api/handlers/index.js +3 -1
- package/dist/api/handlers/index.js.map +1 -1
- package/dist/api/main.js +18 -0
- package/dist/api/main.js.map +1 -1
- package/dist/api/middleware/OpenAuthMiddleware.d.ts +12 -0
- package/dist/api/middleware/OpenAuthMiddleware.js +27 -0
- package/dist/api/middleware/OpenAuthMiddleware.js.map +1 -0
- package/dist/api/runtime.d.ts +15 -0
- package/dist/api/runtime.js +104 -0
- package/dist/api/runtime.js.map +1 -0
- package/dist/api/service/VercelChatService.d.ts +16 -7
- package/dist/api/service/VercelChatService.js +98 -178
- package/dist/api/service/VercelChatService.js.map +1 -1
- package/dist/api/store/DrizzleClientCredentialsStore.d.ts +6 -11
- package/dist/api/store/DrizzleClientCredentialsStore.js +9 -39
- package/dist/api/store/DrizzleClientCredentialsStore.js.map +1 -1
- package/dist/authorization/AuthModeSelector.d.ts +10 -0
- package/dist/authorization/AuthModeSelector.js +27 -0
- package/dist/authorization/AuthModeSelector.js.map +1 -0
- package/dist/authorization/AuthModeSelector.jsonld +81 -0
- package/dist/cli/commands/account.d.ts +6 -0
- package/dist/cli/commands/account.js +119 -0
- package/dist/cli/commands/account.js.map +1 -0
- package/dist/cli/commands/auth.js +20 -29
- package/dist/cli/commands/auth.js.map +1 -1
- package/dist/cli/commands/backup.d.ts +15 -0
- package/dist/cli/commands/backup.js +286 -0
- package/dist/cli/commands/backup.js.map +1 -0
- package/dist/cli/commands/config.d.ts +34 -3
- package/dist/cli/commands/config.js +195 -258
- package/dist/cli/commands/config.js.map +1 -1
- package/dist/cli/commands/doctor.d.ts +6 -0
- package/dist/cli/commands/doctor.js +94 -0
- package/dist/cli/commands/doctor.js.map +1 -0
- package/dist/cli/commands/pod.d.ts +6 -0
- package/dist/cli/commands/pod.js +124 -0
- package/dist/cli/commands/pod.js.map +1 -0
- package/dist/cli/commands/start.js +28 -5
- package/dist/cli/commands/start.js.map +1 -1
- package/dist/cli/index.js +9 -0
- package/dist/cli/index.js.map +1 -1
- package/dist/cli/lib/credentials-store.d.ts +17 -0
- package/dist/cli/lib/credentials-store.js +73 -0
- package/dist/cli/lib/credentials-store.js.map +1 -0
- package/dist/cli/lib/css-account.d.ts +17 -0
- package/dist/cli/lib/css-account.js +56 -0
- package/dist/cli/lib/css-account.js.map +1 -1
- package/dist/cli/lib/pod-thread-store.d.ts +57 -0
- package/dist/cli/lib/pod-thread-store.js +310 -0
- package/dist/cli/lib/pod-thread-store.js.map +1 -0
- package/dist/cli/lib/solid-auth.d.ts +20 -0
- package/dist/cli/lib/solid-auth.js +70 -0
- package/dist/cli/lib/solid-auth.js.map +1 -0
- package/dist/components/components.jsonld +5 -8
- package/dist/components/context.jsonld +114 -244
- package/dist/edge/EdgeNodeAgent.js +2 -2
- package/dist/edge/EdgeNodeAgent.js.map +1 -1
- package/dist/edge/EdgeNodeDnsCoordinator.d.ts +1 -7
- package/dist/edge/EdgeNodeDnsCoordinator.js +31 -41
- package/dist/edge/EdgeNodeDnsCoordinator.js.map +1 -1
- package/dist/edge/EdgeNodeDnsCoordinator.jsonld +1 -27
- package/dist/edge/EdgeNodeModeDetector.d.ts +1 -1
- package/dist/edge/EdgeNodeModeDetector.js +9 -11
- package/dist/edge/EdgeNodeModeDetector.js.map +1 -1
- package/dist/http/ClusterIngressRouter.js +3 -3
- package/dist/http/ClusterIngressRouter.js.map +1 -1
- package/dist/http/ClusterWebSocketConfigurator.js +2 -2
- package/dist/http/ClusterWebSocketConfigurator.js.map +1 -1
- package/dist/http/PodRoutingHttpHandler.js +2 -2
- package/dist/http/PodRoutingHttpHandler.js.map +1 -1
- package/dist/http/cluster/PodMigrationHttpHandler.d.ts +1 -1
- package/dist/http/cluster/PodMigrationHttpHandler.js +1 -1
- package/dist/http/cluster/PodMigrationHttpHandler.js.map +1 -1
- package/dist/identity/drizzle/EdgeNodeRepository.d.ts +37 -4
- package/dist/identity/drizzle/EdgeNodeRepository.js +120 -128
- package/dist/identity/drizzle/EdgeNodeRepository.js.map +1 -1
- package/dist/identity/drizzle/ServiceTokenRepository.d.ts +52 -0
- package/dist/identity/drizzle/ServiceTokenRepository.js +143 -0
- package/dist/identity/drizzle/ServiceTokenRepository.js.map +1 -0
- package/dist/identity/drizzle/db.d.ts +9 -0
- package/dist/identity/drizzle/db.js +208 -1
- package/dist/identity/drizzle/db.js.map +1 -1
- package/dist/identity/drizzle/schema.pg.d.ts +5 -0
- package/dist/identity/drizzle/schema.pg.js +49 -20
- package/dist/identity/drizzle/schema.pg.js.map +1 -1
- package/dist/identity/drizzle/schema.sqlite.d.ts +332 -57
- package/dist/identity/drizzle/schema.sqlite.js +48 -18
- package/dist/identity/drizzle/schema.sqlite.js.map +1 -1
- package/dist/identity/oidc/AutoDetectIdentityProviderHandler.js +6 -4
- package/dist/identity/oidc/AutoDetectIdentityProviderHandler.js.map +1 -1
- package/dist/index.d.ts +6 -9
- package/dist/index.js +12 -14
- package/dist/index.js.map +1 -1
- package/dist/main.js +25 -8
- package/dist/main.js.map +1 -1
- package/dist/provision/ProvisionCodeCodec.d.ts +39 -0
- package/dist/provision/ProvisionCodeCodec.js +65 -0
- package/dist/provision/ProvisionCodeCodec.js.map +1 -0
- package/dist/provision/ProvisionCodeCodec.jsonld +47 -0
- package/dist/provision/ProvisionPodCreator.d.ts +20 -0
- package/dist/provision/ProvisionPodCreator.js +84 -0
- package/dist/provision/ProvisionPodCreator.js.map +1 -0
- package/dist/provision/ProvisionPodCreator.jsonld +118 -0
- package/dist/quota/DrizzleQuotaService.d.ts +17 -3
- package/dist/quota/DrizzleQuotaService.js +108 -8
- package/dist/quota/DrizzleQuotaService.js.map +1 -1
- package/dist/quota/DrizzleQuotaService.jsonld +33 -22
- package/dist/quota/NoopQuotaService.d.ts +7 -1
- package/dist/quota/NoopQuotaService.js +12 -0
- package/dist/quota/NoopQuotaService.js.map +1 -1
- package/dist/quota/NoopQuotaService.jsonld +24 -0
- package/dist/quota/QuotaService.d.ts +17 -0
- package/dist/quota/QuotaService.js +5 -0
- package/dist/quota/QuotaService.js.map +1 -1
- package/dist/quota/QuotaService.jsonld +50 -0
- package/dist/runtime/Proxy.d.ts +22 -4
- package/dist/runtime/Proxy.js +154 -35
- package/dist/runtime/Proxy.js.map +1 -1
- package/dist/runtime/XpodRuntime.d.ts +49 -0
- package/dist/runtime/XpodRuntime.js +374 -0
- package/dist/runtime/XpodRuntime.js.map +1 -0
- package/dist/runtime/env-utils.d.ts +2 -0
- package/dist/runtime/env-utils.js +55 -0
- package/dist/runtime/env-utils.js.map +1 -0
- package/dist/runtime/index.d.ts +4 -0
- package/dist/runtime/index.js +8 -1
- package/dist/runtime/index.js.map +1 -1
- package/dist/runtime/socket-fetch.d.ts +1 -0
- package/dist/runtime/socket-fetch.js +72 -0
- package/dist/runtime/socket-fetch.js.map +1 -0
- package/dist/runtime/socket-http.d.ts +1 -0
- package/dist/runtime/socket-http.js +142 -0
- package/dist/runtime/socket-http.js.map +1 -0
- package/dist/runtime/socket-utils.d.ts +2 -0
- package/dist/runtime/socket-utils.js +34 -0
- package/dist/runtime/socket-utils.js.map +1 -0
- package/dist/service/{EdgeNodeHeartbeatService.d.ts → EdgeNodeSignalClient.d.ts} +3 -3
- package/dist/service/{EdgeNodeHeartbeatService.js → EdgeNodeSignalClient.js} +4 -4
- package/dist/service/EdgeNodeSignalClient.js.map +1 -0
- package/dist/service/PodMigrationService.d.ts +1 -2
- package/dist/service/PodMigrationService.js +1 -2
- package/dist/service/PodMigrationService.js.map +1 -1
- package/dist/storage/SparqlUpdateResourceStore.js +1 -1
- package/dist/storage/SparqlUpdateResourceStore.js.map +1 -1
- package/dist/storage/accessors/MinioDataAccessor.d.ts +6 -0
- package/dist/storage/accessors/MinioDataAccessor.js +10 -0
- package/dist/storage/accessors/MinioDataAccessor.js.map +1 -1
- package/dist/storage/accessors/MinioDataAccessor.jsonld +4 -0
- package/dist/storage/accessors/MixDataAccessor.d.ts +2 -1
- package/dist/storage/accessors/MixDataAccessor.js +12 -1
- package/dist/storage/accessors/MixDataAccessor.js.map +1 -1
- package/dist/storage/accessors/MixDataAccessor.jsonld +19 -0
- package/dist/storage/locking/UrlAwareRedisLocker.d.ts +18 -0
- package/dist/storage/locking/UrlAwareRedisLocker.js +60 -0
- package/dist/storage/locking/UrlAwareRedisLocker.js.map +1 -0
- package/dist/storage/locking/UrlAwareRedisLocker.jsonld +123 -0
- package/dist/storage/quota/UsageRepository.d.ts +41 -8
- package/dist/storage/quota/UsageRepository.js +252 -50
- package/dist/storage/quota/UsageRepository.js.map +1 -1
- package/dist/storage/sparql/ComunicaQuintEngine.d.ts +9 -0
- package/dist/storage/sparql/ComunicaQuintEngine.js +50 -9
- package/dist/storage/sparql/ComunicaQuintEngine.js.map +1 -1
- package/dist/storage/sparql/QueryOptimizer.js +13 -1
- package/dist/storage/sparql/QueryOptimizer.js.map +1 -1
- package/dist/storage/sparql/QuintQuerySource.d.ts +14 -0
- package/dist/storage/sparql/QuintQuerySource.js +152 -1
- package/dist/storage/sparql/QuintQuerySource.js.map +1 -1
- package/dist/storage/sparql/SubgraphQueryEngine.d.ts +1 -0
- package/dist/storage/sparql/SubgraphQueryEngine.js +6 -2
- package/dist/storage/sparql/SubgraphQueryEngine.js.map +1 -1
- package/dist/storage/sparql/SubgraphQueryEngine.jsonld +4 -0
- package/dist/subdomain/SubdomainClient.d.ts +3 -3
- package/dist/subdomain/SubdomainClient.js +1 -1
- package/dist/subdomain/SubdomainClient.js.map +1 -1
- package/dist/subdomain/SubdomainService.d.ts +15 -16
- package/dist/subdomain/SubdomainService.js +80 -54
- package/dist/subdomain/SubdomainService.js.map +1 -1
- package/dist/subdomain/SubdomainService.jsonld +22 -26
- package/dist/supervisor/Supervisor.d.ts +7 -2
- package/dist/supervisor/Supervisor.js +33 -1
- package/dist/supervisor/Supervisor.js.map +1 -1
- package/dist/test-utils/index.d.ts +4 -0
- package/dist/test-utils/index.js +8 -0
- package/dist/test-utils/index.js.map +1 -0
- package/dist/test-utils/no-auth-xpod.d.ts +11 -0
- package/dist/test-utils/no-auth-xpod.js +25 -0
- package/dist/test-utils/no-auth-xpod.js.map +1 -0
- package/dist/test-utils/seed-pod.d.ts +5 -0
- package/dist/test-utils/seed-pod.js +61 -0
- package/dist/test-utils/seed-pod.js.map +1 -0
- package/package.json +23 -5
- package/templates/identity/account/create-pod.html.ejs +110 -0
- package/templates/main.html.ejs +10 -0
- package/dist/api/handlers/DevHandler.d.ts +0 -18
- package/dist/api/handlers/DevHandler.js +0 -276
- package/dist/api/handlers/DevHandler.js.map +0 -1
- package/dist/api/handlers/SignalHandler.d.ts +0 -13
- package/dist/api/handlers/SignalHandler.js +0 -122
- package/dist/api/handlers/SignalHandler.js.map +0 -1
- package/dist/gateway/Proxy.d.ts +0 -24
- package/dist/gateway/Proxy.js +0 -209
- package/dist/gateway/Proxy.js.map +0 -1
- package/dist/gateway/Supervisor.d.ts +0 -2
- package/dist/gateway/Supervisor.js +0 -7
- package/dist/gateway/Supervisor.js.map +0 -1
- package/dist/gateway/port-finder.d.ts +0 -4
- package/dist/gateway/port-finder.js +0 -15
- package/dist/gateway/port-finder.js.map +0 -1
- package/dist/gateway/types.d.ts +0 -1
- package/dist/gateway/types.js +0 -3
- package/dist/gateway/types.js.map +0 -1
- package/dist/http/SignalInterceptHttpHandler.d.ts +0 -24
- package/dist/http/SignalInterceptHttpHandler.js +0 -47
- package/dist/http/SignalInterceptHttpHandler.js.map +0 -1
- package/dist/http/SignalInterceptHttpHandler.jsonld +0 -103
- package/dist/http/admin/EdgeNodeSignalHttpHandler.d.ts +0 -71
- package/dist/http/admin/EdgeNodeSignalHttpHandler.js +0 -674
- package/dist/http/admin/EdgeNodeSignalHttpHandler.js.map +0 -1
- package/dist/http/admin/EdgeNodeSignalHttpHandler.jsonld +0 -406
- package/dist/http/cluster/PodMigrationHttpHandler.jsonld +0 -169
- package/dist/quota/DefaultQuotaService.d.ts +0 -16
- package/dist/quota/DefaultQuotaService.js +0 -37
- package/dist/quota/DefaultQuotaService.js.map +0 -1
- package/dist/quota/DefaultQuotaService.jsonld +0 -85
- package/dist/service/EdgeNodeHeartbeatService.js.map +0 -1
- package/dist/service/PodMigrationService.jsonld +0 -76
- package/dist/storage/MigratableDataAccessor.d.ts +0 -63
- package/dist/storage/MigratableDataAccessor.js +0 -11
- package/dist/storage/MigratableDataAccessor.js.map +0 -1
- package/dist/storage/MigratableDataAccessor.jsonld +0 -60
- package/dist/storage/accessors/TieredMinioDataAccessor.d.ts +0 -150
- package/dist/storage/accessors/TieredMinioDataAccessor.js +0 -582
- package/dist/storage/accessors/TieredMinioDataAccessor.js.map +0 -1
- package/dist/storage/accessors/TieredMinioDataAccessor.jsonld +0 -333
- package/static/app/assets/index.css +0 -1
- package/static/app/assets/main.js +0 -11
package/dist/gateway/Proxy.js
DELETED
|
@@ -1,209 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
-
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
-
};
|
|
5
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
-
exports.GatewayProxy = void 0;
|
|
7
|
-
const http_proxy_1 = __importDefault(require("http-proxy"));
|
|
8
|
-
const http_1 = __importDefault(require("http"));
|
|
9
|
-
const global_logger_factory_1 = require("global-logger-factory");
|
|
10
|
-
// CORS configuration matching CSS CorsHandler defaults
|
|
11
|
-
const CORS_CONFIG = {
|
|
12
|
-
methods: ['GET', 'HEAD', 'OPTIONS', 'POST', 'PUT', 'PATCH', 'DELETE'],
|
|
13
|
-
credentials: true,
|
|
14
|
-
allowedHeaders: [
|
|
15
|
-
'Authorization', 'Content-Type', 'Accept', 'DPoP', 'Origin',
|
|
16
|
-
'X-Requested-With', 'If-Match', 'If-None-Match', 'Slug', 'Link',
|
|
17
|
-
],
|
|
18
|
-
exposedHeaders: [
|
|
19
|
-
'Accept-Patch', 'Accept-Post', 'Accept-Put', 'Allow', 'Content-Range',
|
|
20
|
-
'ETag', 'Last-Modified', 'Link', 'Location', 'Updates-Via',
|
|
21
|
-
'WAC-Allow', 'Www-Authenticate', 'X-Request-Id',
|
|
22
|
-
],
|
|
23
|
-
};
|
|
24
|
-
class GatewayProxy {
|
|
25
|
-
constructor(port, supervisor) {
|
|
26
|
-
this.port = port;
|
|
27
|
-
this.supervisor = supervisor;
|
|
28
|
-
this.logger = (0, global_logger_factory_1.getLoggerFor)(this);
|
|
29
|
-
this.targets = {};
|
|
30
|
-
this.proxy = http_proxy_1.default.createProxyServer({
|
|
31
|
-
xfwd: true,
|
|
32
|
-
});
|
|
33
|
-
this.proxy.on('error', (err, _req, res) => {
|
|
34
|
-
this.logger.error('Proxy error:', err);
|
|
35
|
-
if (res && 'writeHead' in res && !res.headersSent) {
|
|
36
|
-
res.writeHead(502, { 'Content-Type': 'application/json' });
|
|
37
|
-
res.end(JSON.stringify({ error: 'Service Unavailable', details: err.message }));
|
|
38
|
-
}
|
|
39
|
-
});
|
|
40
|
-
this.server = http_1.default.createServer(this.handleRequest.bind(this));
|
|
41
|
-
this.server.on('upgrade', (req, socket, head) => {
|
|
42
|
-
const url = req.url ?? '/';
|
|
43
|
-
// Route /ws/* WebSocket connections to API server
|
|
44
|
-
if (url.startsWith('/ws/') && this.targets.api) {
|
|
45
|
-
this.proxy.ws(req, socket, head, { target: this.targets.api });
|
|
46
|
-
}
|
|
47
|
-
else if (this.targets.css) {
|
|
48
|
-
this.proxy.ws(req, socket, head, { target: this.targets.css });
|
|
49
|
-
}
|
|
50
|
-
else {
|
|
51
|
-
socket.destroy();
|
|
52
|
-
}
|
|
53
|
-
});
|
|
54
|
-
}
|
|
55
|
-
setTargets(targets) {
|
|
56
|
-
this.targets = targets;
|
|
57
|
-
}
|
|
58
|
-
start() {
|
|
59
|
-
this.server.listen(this.port, '0.0.0.0', () => {
|
|
60
|
-
this.logger.info(`Listening on http://0.0.0.0:${this.port}`);
|
|
61
|
-
});
|
|
62
|
-
}
|
|
63
|
-
stop() {
|
|
64
|
-
return new Promise((resolve, reject) => {
|
|
65
|
-
this.proxy.close();
|
|
66
|
-
this.server.close((err) => (err ? reject(err) : resolve()));
|
|
67
|
-
});
|
|
68
|
-
}
|
|
69
|
-
handleRequest(req, res) {
|
|
70
|
-
const url = req.url ?? '/';
|
|
71
|
-
const origin = req.headers.origin;
|
|
72
|
-
// Store original host for x-forwarded-host before any rewrites
|
|
73
|
-
const originalHost = req.headers.host;
|
|
74
|
-
// Set x-forwarded-proto based on CSS_BASE_URL
|
|
75
|
-
const baseUrl = process.env.CSS_BASE_URL || '';
|
|
76
|
-
if (baseUrl.startsWith('https')) {
|
|
77
|
-
req.headers['x-forwarded-proto'] = 'https';
|
|
78
|
-
}
|
|
79
|
-
// Rewrite Host header to match CSS_BASE_URL for proper routing
|
|
80
|
-
if (baseUrl) {
|
|
81
|
-
try {
|
|
82
|
-
const parsedBaseUrl = new URL(baseUrl);
|
|
83
|
-
req.headers.host = parsedBaseUrl.host;
|
|
84
|
-
req.headers['x-forwarded-host'] = parsedBaseUrl.host;
|
|
85
|
-
}
|
|
86
|
-
catch {
|
|
87
|
-
if (!req.headers['x-forwarded-host']) {
|
|
88
|
-
req.headers['x-forwarded-host'] = originalHost;
|
|
89
|
-
}
|
|
90
|
-
}
|
|
91
|
-
}
|
|
92
|
-
else if (!req.headers['x-forwarded-host']) {
|
|
93
|
-
req.headers['x-forwarded-host'] = originalHost;
|
|
94
|
-
}
|
|
95
|
-
this.logger.debug(`${req.method} ${url} x-forwarded-proto=${req.headers['x-forwarded-proto']} x-forwarded-host=${req.headers['x-forwarded-host']} host=${req.headers.host}`);
|
|
96
|
-
// 1. Gateway internal service endpoints
|
|
97
|
-
if (url.startsWith('/service/') || url.startsWith('/_gateway/')) {
|
|
98
|
-
if (req.method === 'OPTIONS') {
|
|
99
|
-
this.handleCorsPreflightRequest(res, origin);
|
|
100
|
-
return;
|
|
101
|
-
}
|
|
102
|
-
if (origin) {
|
|
103
|
-
this.addCorsHeaders(res, origin);
|
|
104
|
-
}
|
|
105
|
-
void this.handleInternalApi(req, res);
|
|
106
|
-
return;
|
|
107
|
-
}
|
|
108
|
-
// 2. API Server Routing (/v1 or /api)
|
|
109
|
-
if ((url.startsWith('/v1/') || url.startsWith('/api/')) && this.targets.api) {
|
|
110
|
-
this.proxy.web(req, res, { target: this.targets.api });
|
|
111
|
-
return;
|
|
112
|
-
}
|
|
113
|
-
// 3. CSS Routing (Default)
|
|
114
|
-
if (this.targets.css) {
|
|
115
|
-
this.proxy.web(req, res, { target: this.targets.css });
|
|
116
|
-
}
|
|
117
|
-
else {
|
|
118
|
-
res.writeHead(503);
|
|
119
|
-
res.end('CSS Service Not Available');
|
|
120
|
-
}
|
|
121
|
-
}
|
|
122
|
-
handleCorsPreflightRequest(res, origin) {
|
|
123
|
-
this.addCorsHeaders(res, origin);
|
|
124
|
-
res.writeHead(204);
|
|
125
|
-
res.end();
|
|
126
|
-
}
|
|
127
|
-
/**
|
|
128
|
-
* Add CORS headers matching CSS CorsHandler configuration
|
|
129
|
-
*/
|
|
130
|
-
addCorsHeaders(res, origin) {
|
|
131
|
-
res.setHeader('Access-Control-Allow-Origin', origin || '*');
|
|
132
|
-
res.setHeader('Access-Control-Allow-Credentials', String(CORS_CONFIG.credentials));
|
|
133
|
-
res.setHeader('Access-Control-Allow-Methods', CORS_CONFIG.methods.join(', '));
|
|
134
|
-
res.setHeader('Access-Control-Allow-Headers', CORS_CONFIG.allowedHeaders.join(', '));
|
|
135
|
-
res.setHeader('Access-Control-Expose-Headers', CORS_CONFIG.exposedHeaders.join(', '));
|
|
136
|
-
}
|
|
137
|
-
async handleInternalApi(req, res) {
|
|
138
|
-
try {
|
|
139
|
-
const reqUrl = req.url ?? '/';
|
|
140
|
-
const parsed = new URL(reqUrl, 'http://localhost');
|
|
141
|
-
const pathname = parsed.pathname;
|
|
142
|
-
if (pathname === '/service/status') {
|
|
143
|
-
const status = this.supervisor.getAllStatus();
|
|
144
|
-
const cssReady = await this.isCssReady();
|
|
145
|
-
const code = cssReady ? 200 : 503;
|
|
146
|
-
res.writeHead(code, { 'Content-Type': 'application/json' });
|
|
147
|
-
res.end(JSON.stringify(status));
|
|
148
|
-
return;
|
|
149
|
-
}
|
|
150
|
-
if (pathname === '/service/logs') {
|
|
151
|
-
const level = parsed.searchParams.get('level') ?? undefined;
|
|
152
|
-
const source = parsed.searchParams.get('source') ?? undefined;
|
|
153
|
-
const limitValue = parsed.searchParams.get('limit');
|
|
154
|
-
const limit = limitValue ? parseInt(limitValue, 10) : undefined;
|
|
155
|
-
const logs = this.supervisor.getLogs({
|
|
156
|
-
level,
|
|
157
|
-
source,
|
|
158
|
-
limit: Number.isFinite(limit) ? limit : undefined,
|
|
159
|
-
});
|
|
160
|
-
res.writeHead(200, { 'Content-Type': 'application/json' });
|
|
161
|
-
res.end(JSON.stringify(logs));
|
|
162
|
-
return;
|
|
163
|
-
}
|
|
164
|
-
res.writeHead(404);
|
|
165
|
-
res.end('Not Found');
|
|
166
|
-
}
|
|
167
|
-
catch (error) {
|
|
168
|
-
this.logger.error('Internal service endpoint failed:', error);
|
|
169
|
-
if (!res.headersSent) {
|
|
170
|
-
res.writeHead(500, { 'Content-Type': 'application/json' });
|
|
171
|
-
}
|
|
172
|
-
res.end(JSON.stringify({ error: 'Internal Server Error' }));
|
|
173
|
-
}
|
|
174
|
-
}
|
|
175
|
-
async isCssReady() {
|
|
176
|
-
if (!this.targets.css) {
|
|
177
|
-
return true;
|
|
178
|
-
}
|
|
179
|
-
try {
|
|
180
|
-
// NOTE: CSS is configured with public `baseUrl` pointing at the gateway,
|
|
181
|
-
// so probing the internal CSS port can fail identifier-space checks.
|
|
182
|
-
// We probe through the gateway itself to mirror real client traffic.
|
|
183
|
-
const gatewayBase = `http://127.0.0.1:${this.port}/`;
|
|
184
|
-
const candidates = [
|
|
185
|
-
// CSS OIDC lives under /.oidc/*
|
|
186
|
-
new URL('.oidc/.well-known/openid-configuration', gatewayBase).toString(),
|
|
187
|
-
// Some deployments expose the well-known at root
|
|
188
|
-
new URL('.well-known/openid-configuration', gatewayBase).toString(),
|
|
189
|
-
];
|
|
190
|
-
for (const probeUrl of candidates) {
|
|
191
|
-
try {
|
|
192
|
-
const response = await fetch(probeUrl, { signal: AbortSignal.timeout(1500) });
|
|
193
|
-
if (response.ok) {
|
|
194
|
-
return true;
|
|
195
|
-
}
|
|
196
|
-
}
|
|
197
|
-
catch {
|
|
198
|
-
// Try next candidate.
|
|
199
|
-
}
|
|
200
|
-
}
|
|
201
|
-
return false;
|
|
202
|
-
}
|
|
203
|
-
catch {
|
|
204
|
-
return false;
|
|
205
|
-
}
|
|
206
|
-
}
|
|
207
|
-
}
|
|
208
|
-
exports.GatewayProxy = GatewayProxy;
|
|
209
|
-
//# sourceMappingURL=Proxy.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"Proxy.js","sourceRoot":"","sources":["../../src/gateway/Proxy.ts"],"names":[],"mappings":"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","sourcesContent":["import httpProxy from 'http-proxy';\nimport http from 'http';\nimport { getLoggerFor } from 'global-logger-factory';\nimport type { Supervisor } from './Supervisor';\n\n// CORS configuration matching CSS CorsHandler defaults\nconst CORS_CONFIG = {\n methods: ['GET', 'HEAD', 'OPTIONS', 'POST', 'PUT', 'PATCH', 'DELETE'],\n credentials: true,\n allowedHeaders: [\n 'Authorization', 'Content-Type', 'Accept', 'DPoP', 'Origin',\n 'X-Requested-With', 'If-Match', 'If-None-Match', 'Slug', 'Link',\n ],\n exposedHeaders: [\n 'Accept-Patch', 'Accept-Post', 'Accept-Put', 'Allow', 'Content-Range',\n 'ETag', 'Last-Modified', 'Link', 'Location', 'Updates-Via',\n 'WAC-Allow', 'Www-Authenticate', 'X-Request-Id',\n ],\n};\n\nexport class GatewayProxy {\n private readonly logger = getLoggerFor(this);\n private proxy: httpProxy;\n private server: http.Server;\n private targets: { css?: string; api?: string } = {};\n\n constructor(private port: number, private supervisor: Supervisor) {\n this.proxy = httpProxy.createProxyServer({\n xfwd: true,\n });\n\n this.proxy.on('error', (err, _req, res) => {\n this.logger.error('Proxy error:', err);\n if (res && 'writeHead' in res && !res.headersSent) {\n res.writeHead(502, { 'Content-Type': 'application/json' });\n res.end(JSON.stringify({ error: 'Service Unavailable', details: err.message }));\n }\n });\n\n this.server = http.createServer(this.handleRequest.bind(this));\n\n this.server.on('upgrade', (req, socket, head) => {\n const url = req.url ?? '/';\n\n // Route /ws/* WebSocket connections to API server\n if (url.startsWith('/ws/') && this.targets.api) {\n this.proxy.ws(req, socket, head, { target: this.targets.api });\n } else if (this.targets.css) {\n this.proxy.ws(req, socket, head, { target: this.targets.css });\n } else {\n socket.destroy();\n }\n });\n }\n\n public setTargets(targets: { css?: string; api?: string }): void {\n this.targets = targets;\n }\n\n public start(): void {\n this.server.listen(this.port, '0.0.0.0', () => {\n this.logger.info(`Listening on http://0.0.0.0:${this.port}`);\n });\n }\n\n public stop(): Promise<void> {\n return new Promise((resolve, reject) => {\n this.proxy.close();\n this.server.close((err) => (err ? reject(err) : resolve()));\n });\n }\n\n private handleRequest(req: http.IncomingMessage, res: http.ServerResponse): void {\n const url = req.url ?? '/';\n const origin = req.headers.origin;\n\n // Store original host for x-forwarded-host before any rewrites\n const originalHost = req.headers.host;\n\n // Set x-forwarded-proto based on CSS_BASE_URL\n const baseUrl = process.env.CSS_BASE_URL || '';\n if (baseUrl.startsWith('https')) {\n req.headers['x-forwarded-proto'] = 'https';\n }\n\n // Rewrite Host header to match CSS_BASE_URL for proper routing\n if (baseUrl) {\n try {\n const parsedBaseUrl = new URL(baseUrl);\n req.headers.host = parsedBaseUrl.host;\n req.headers['x-forwarded-host'] = parsedBaseUrl.host;\n } catch {\n if (!req.headers['x-forwarded-host']) {\n req.headers['x-forwarded-host'] = originalHost;\n }\n }\n } else if (!req.headers['x-forwarded-host']) {\n req.headers['x-forwarded-host'] = originalHost;\n }\n\n this.logger.debug(\n `${req.method} ${url} x-forwarded-proto=${req.headers['x-forwarded-proto']} x-forwarded-host=${req.headers['x-forwarded-host']} host=${req.headers.host}`,\n );\n\n // 1. Gateway internal service endpoints\n if (url.startsWith('/service/') || url.startsWith('/_gateway/')) {\n if (req.method === 'OPTIONS') {\n this.handleCorsPreflightRequest(res, origin);\n return;\n }\n if (origin) {\n this.addCorsHeaders(res, origin);\n }\n void this.handleInternalApi(req, res);\n return;\n }\n\n // 2. API Server Routing (/v1 or /api)\n if ((url.startsWith('/v1/') || url.startsWith('/api/')) && this.targets.api) {\n this.proxy.web(req, res, { target: this.targets.api });\n return;\n }\n\n // 3. CSS Routing (Default)\n if (this.targets.css) {\n this.proxy.web(req, res, { target: this.targets.css });\n } else {\n res.writeHead(503);\n res.end('CSS Service Not Available');\n }\n }\n\n private handleCorsPreflightRequest(\n res: http.ServerResponse,\n origin: string | undefined,\n ): void {\n this.addCorsHeaders(res, origin);\n res.writeHead(204);\n res.end();\n }\n\n /**\n * Add CORS headers matching CSS CorsHandler configuration\n */\n private addCorsHeaders(res: http.ServerResponse, origin: string | undefined): void {\n res.setHeader('Access-Control-Allow-Origin', origin || '*');\n res.setHeader('Access-Control-Allow-Credentials', String(CORS_CONFIG.credentials));\n res.setHeader('Access-Control-Allow-Methods', CORS_CONFIG.methods.join(', '));\n res.setHeader('Access-Control-Allow-Headers', CORS_CONFIG.allowedHeaders.join(', '));\n res.setHeader('Access-Control-Expose-Headers', CORS_CONFIG.exposedHeaders.join(', '));\n }\n\n private async handleInternalApi(req: http.IncomingMessage, res: http.ServerResponse): Promise<void> {\n try {\n const reqUrl = req.url ?? '/';\n const parsed = new URL(reqUrl, 'http://localhost');\n const pathname = parsed.pathname;\n\n if (pathname === '/service/status') {\n const status = this.supervisor.getAllStatus();\n const cssReady = await this.isCssReady();\n const code = cssReady ? 200 : 503;\n res.writeHead(code, { 'Content-Type': 'application/json' });\n res.end(JSON.stringify(status));\n return;\n }\n\n if (pathname === '/service/logs') {\n const level = parsed.searchParams.get('level') ?? undefined;\n const source = parsed.searchParams.get('source') ?? undefined;\n const limitValue = parsed.searchParams.get('limit');\n const limit = limitValue ? parseInt(limitValue, 10) : undefined;\n\n const logs = this.supervisor.getLogs({\n level,\n source,\n limit: Number.isFinite(limit as number) ? limit : undefined,\n });\n\n res.writeHead(200, { 'Content-Type': 'application/json' });\n res.end(JSON.stringify(logs));\n return;\n }\n\n res.writeHead(404);\n res.end('Not Found');\n } catch (error) {\n this.logger.error('Internal service endpoint failed:', error);\n if (!res.headersSent) {\n res.writeHead(500, { 'Content-Type': 'application/json' });\n }\n res.end(JSON.stringify({ error: 'Internal Server Error' }));\n }\n }\n\n private async isCssReady(): Promise<boolean> {\n if (!this.targets.css) {\n return true;\n }\n\n try {\n // NOTE: CSS is configured with public `baseUrl` pointing at the gateway,\n // so probing the internal CSS port can fail identifier-space checks.\n // We probe through the gateway itself to mirror real client traffic.\n const gatewayBase = `http://127.0.0.1:${this.port}/`;\n const candidates = [\n // CSS OIDC lives under /.oidc/*\n new URL('.oidc/.well-known/openid-configuration', gatewayBase).toString(),\n // Some deployments expose the well-known at root\n new URL('.well-known/openid-configuration', gatewayBase).toString(),\n ];\n\n for (const probeUrl of candidates) {\n try {\n const response = await fetch(probeUrl, { signal: AbortSignal.timeout(1500) });\n if (response.ok) {\n return true;\n }\n } catch {\n // Try next candidate.\n }\n }\n\n return false;\n } catch {\n return false;\n }\n }\n}\n"]}
|
|
@@ -1,7 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.Supervisor = void 0;
|
|
4
|
-
// Re-export from shared lib
|
|
5
|
-
var supervisor_1 = require("../supervisor");
|
|
6
|
-
Object.defineProperty(exports, "Supervisor", { enumerable: true, get: function () { return supervisor_1.Supervisor; } });
|
|
7
|
-
//# sourceMappingURL=Supervisor.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"Supervisor.js","sourceRoot":"","sources":["../../src/gateway/Supervisor.ts"],"names":[],"mappings":";;;AAAA,4BAA4B;AAC5B,4CAA2C;AAAlC,wGAAA,UAAU,OAAA","sourcesContent":["// Re-export from shared lib\nexport { Supervisor } from '../supervisor';\nexport type { ServiceConfig, ServiceState, ServiceStatus } from '../supervisor';\n"]}
|
|
@@ -1,15 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
-
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
-
};
|
|
5
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
-
exports.getFreePort = getFreePort;
|
|
7
|
-
const portfinder_1 = __importDefault(require("portfinder"));
|
|
8
|
-
/**
|
|
9
|
-
* Find the next available port starting from basePort
|
|
10
|
-
*/
|
|
11
|
-
async function getFreePort(basePort) {
|
|
12
|
-
portfinder_1.default.basePort = basePort;
|
|
13
|
-
return portfinder_1.default.getPortPromise();
|
|
14
|
-
}
|
|
15
|
-
//# sourceMappingURL=port-finder.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"port-finder.js","sourceRoot":"","sources":["../../src/gateway/port-finder.ts"],"names":[],"mappings":";;;;;AAKA,kCAGC;AARD,4DAAoC;AAEpC;;GAEG;AACI,KAAK,UAAU,WAAW,CAAC,QAAgB;IAChD,oBAAU,CAAC,QAAQ,GAAG,QAAQ,CAAC;IAC/B,OAAO,oBAAU,CAAC,cAAc,EAAE,CAAC;AACrC,CAAC","sourcesContent":["import portfinder from 'portfinder';\n\n/**\n * Find the next available port starting from basePort\n */\nexport async function getFreePort(basePort: number): Promise<number> {\n portfinder.basePort = basePort;\n return portfinder.getPortPromise();\n}\n"]}
|
package/dist/gateway/types.d.ts
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
export type { ServiceConfig, ServiceState, ServiceStatus } from '../supervisor';
|
package/dist/gateway/types.js
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/gateway/types.ts"],"names":[],"mappings":"","sourcesContent":["// Re-export from shared lib\nexport type { ServiceConfig, ServiceState, ServiceStatus } from '../supervisor';\n"]}
|
|
@@ -1,24 +0,0 @@
|
|
|
1
|
-
import { HttpHandler } from '@solid/community-server';
|
|
2
|
-
import type { HttpHandlerInput } from '@solid/community-server';
|
|
3
|
-
interface SignalInterceptHttpHandlerOptions {
|
|
4
|
-
signalHandler: HttpHandler;
|
|
5
|
-
fallback: HttpHandler;
|
|
6
|
-
basePath?: string;
|
|
7
|
-
}
|
|
8
|
-
/**
|
|
9
|
-
* Wraps the default CSS HttpHandler so we can short-circuit `/api/signal`
|
|
10
|
-
* requests to our token-based handler. All other paths continue through
|
|
11
|
-
* the normal pipeline (including authorization) untouched.
|
|
12
|
-
*/
|
|
13
|
-
export declare class SignalInterceptHttpHandler extends HttpHandler {
|
|
14
|
-
private readonly signalHandler;
|
|
15
|
-
private readonly fallback;
|
|
16
|
-
private readonly basePath;
|
|
17
|
-
private readonly basePathWithSlash;
|
|
18
|
-
constructor(options: SignalInterceptHttpHandlerOptions);
|
|
19
|
-
canHandle(input: HttpHandlerInput): Promise<void>;
|
|
20
|
-
handle(input: HttpHandlerInput): Promise<void>;
|
|
21
|
-
private matches;
|
|
22
|
-
private parsePathname;
|
|
23
|
-
}
|
|
24
|
-
export {};
|
|
@@ -1,47 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.SignalInterceptHttpHandler = void 0;
|
|
4
|
-
const community_server_1 = require("@solid/community-server");
|
|
5
|
-
/**
|
|
6
|
-
* Wraps the default CSS HttpHandler so we can short-circuit `/api/signal`
|
|
7
|
-
* requests to our token-based handler. All other paths continue through
|
|
8
|
-
* the normal pipeline (including authorization) untouched.
|
|
9
|
-
*/
|
|
10
|
-
class SignalInterceptHttpHandler extends community_server_1.HttpHandler {
|
|
11
|
-
constructor(options) {
|
|
12
|
-
super();
|
|
13
|
-
this.signalHandler = options.signalHandler;
|
|
14
|
-
this.fallback = options.fallback;
|
|
15
|
-
const basePath = options.basePath ?? '/api/signal';
|
|
16
|
-
this.basePath = basePath.endsWith('/') ? basePath.slice(0, -1) : basePath;
|
|
17
|
-
this.basePathWithSlash = `${this.basePath}/`;
|
|
18
|
-
}
|
|
19
|
-
async canHandle(input) {
|
|
20
|
-
if (this.matches(input)) {
|
|
21
|
-
await this.signalHandler.canHandle(input);
|
|
22
|
-
return;
|
|
23
|
-
}
|
|
24
|
-
await this.fallback.canHandle(input);
|
|
25
|
-
}
|
|
26
|
-
async handle(input) {
|
|
27
|
-
if (this.matches(input)) {
|
|
28
|
-
await this.signalHandler.handle(input);
|
|
29
|
-
return;
|
|
30
|
-
}
|
|
31
|
-
await this.fallback.handle(input);
|
|
32
|
-
}
|
|
33
|
-
matches({ request }) {
|
|
34
|
-
const pathname = this.parsePathname(request);
|
|
35
|
-
return pathname === this.basePath || pathname.startsWith(this.basePathWithSlash);
|
|
36
|
-
}
|
|
37
|
-
parsePathname(request) {
|
|
38
|
-
const hostHeader = request.headers.host ?? request.headers.Host ?? 'localhost';
|
|
39
|
-
const protoHeader = request.headers['x-forwarded-proto'] ?? request.headers['X-Forwarded-Proto'];
|
|
40
|
-
const protocol = Array.isArray(protoHeader) ? protoHeader[0] : protoHeader;
|
|
41
|
-
const scheme = typeof protocol === 'string' ? protocol.split(',')[0]?.trim() ?? 'http' : 'http';
|
|
42
|
-
const rawUrl = request.url ?? '/';
|
|
43
|
-
return new URL(rawUrl, `${scheme}://${hostHeader}`).pathname;
|
|
44
|
-
}
|
|
45
|
-
}
|
|
46
|
-
exports.SignalInterceptHttpHandler = SignalInterceptHttpHandler;
|
|
47
|
-
//# sourceMappingURL=SignalInterceptHttpHandler.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"SignalInterceptHttpHandler.js","sourceRoot":"","sources":["../../src/http/SignalInterceptHttpHandler.ts"],"names":[],"mappings":";;;AAAA,8DAAsD;AAStD;;;;GAIG;AACH,MAAa,0BAA2B,SAAQ,8BAAW;IAMzD,YAAmB,OAA0C;QAC3D,KAAK,EAAE,CAAC;QACR,IAAI,CAAC,aAAa,GAAG,OAAO,CAAC,aAAa,CAAC;QAC3C,IAAI,CAAC,QAAQ,GAAG,OAAO,CAAC,QAAQ,CAAC;QACjC,MAAM,QAAQ,GAAG,OAAO,CAAC,QAAQ,IAAI,aAAa,CAAC;QACnD,IAAI,CAAC,QAAQ,GAAG,QAAQ,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC;QAC1E,IAAI,CAAC,iBAAiB,GAAG,GAAG,IAAI,CAAC,QAAQ,GAAG,CAAC;IAC/C,CAAC;IAEe,KAAK,CAAC,SAAS,CAAC,KAAuB;QACrD,IAAI,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC;YACxB,MAAM,IAAI,CAAC,aAAa,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC;YAC1C,OAAO;QACT,CAAC;QACD,MAAM,IAAI,CAAC,QAAQ,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC;IACvC,CAAC;IAEe,KAAK,CAAC,MAAM,CAAC,KAAuB;QAClD,IAAI,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC;YACxB,MAAM,IAAI,CAAC,aAAa,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;YACvC,OAAO;QACT,CAAC;QACD,MAAM,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;IACpC,CAAC;IAEO,OAAO,CAAC,EAAE,OAAO,EAAoB;QAC3C,MAAM,QAAQ,GAAG,IAAI,CAAC,aAAa,CAAC,OAAO,CAAC,CAAC;QAC7C,OAAO,QAAQ,KAAK,IAAI,CAAC,QAAQ,IAAI,QAAQ,CAAC,UAAU,CAAC,IAAI,CAAC,iBAAiB,CAAC,CAAC;IACnF,CAAC;IAEO,aAAa,CAAC,OAAoC;QACxD,MAAM,UAAU,GAAG,OAAO,CAAC,OAAO,CAAC,IAAI,IAAI,OAAO,CAAC,OAAO,CAAC,IAAI,IAAI,WAAW,CAAC;QAC/E,MAAM,WAAW,GAAG,OAAO,CAAC,OAAO,CAAC,mBAAmB,CAAC,IAAI,OAAO,CAAC,OAAO,CAAC,mBAAmB,CAAC,CAAC;QACjG,MAAM,QAAQ,GAAG,KAAK,CAAC,OAAO,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,WAAW,CAAC;QAC3E,MAAM,MAAM,GAAG,OAAO,QAAQ,KAAK,QAAQ,CAAC,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,IAAI,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC;QAChG,MAAM,MAAM,GAAG,OAAO,CAAC,GAAG,IAAI,GAAG,CAAC;QAClC,OAAO,IAAI,GAAG,CAAC,MAAM,EAAE,GAAG,MAAM,MAAM,UAAU,EAAE,CAAC,CAAC,QAAQ,CAAC;IAC/D,CAAC;CACF;AA5CD,gEA4CC","sourcesContent":["import { HttpHandler } from '@solid/community-server';\nimport type { HttpHandlerInput } from '@solid/community-server';\n\ninterface SignalInterceptHttpHandlerOptions {\n signalHandler: HttpHandler;\n fallback: HttpHandler;\n basePath?: string;\n}\n\n/**\n * Wraps the default CSS HttpHandler so we can short-circuit `/api/signal`\n * requests to our token-based handler. All other paths continue through\n * the normal pipeline (including authorization) untouched.\n */\nexport class SignalInterceptHttpHandler extends HttpHandler {\n private readonly signalHandler: HttpHandler;\n private readonly fallback: HttpHandler;\n private readonly basePath: string;\n private readonly basePathWithSlash: string;\n\n public constructor(options: SignalInterceptHttpHandlerOptions) {\n super();\n this.signalHandler = options.signalHandler;\n this.fallback = options.fallback;\n const basePath = options.basePath ?? '/api/signal';\n this.basePath = basePath.endsWith('/') ? basePath.slice(0, -1) : basePath;\n this.basePathWithSlash = `${this.basePath}/`;\n }\n\n public override async canHandle(input: HttpHandlerInput): Promise<void> {\n if (this.matches(input)) {\n await this.signalHandler.canHandle(input);\n return;\n }\n await this.fallback.canHandle(input);\n }\n\n public override async handle(input: HttpHandlerInput): Promise<void> {\n if (this.matches(input)) {\n await this.signalHandler.handle(input);\n return;\n }\n await this.fallback.handle(input);\n }\n\n private matches({ request }: HttpHandlerInput): boolean {\n const pathname = this.parsePathname(request);\n return pathname === this.basePath || pathname.startsWith(this.basePathWithSlash);\n }\n\n private parsePathname(request: HttpHandlerInput['request']): string {\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}`).pathname;\n }\n}\n"]}
|
|
@@ -1,103 +0,0 @@
|
|
|
1
|
-
{
|
|
2
|
-
"@context": [
|
|
3
|
-
"https://linkedsoftwaredependencies.org/bundles/npm/@undefineds.co/xpod/^0.0.0/components/context.jsonld",
|
|
4
|
-
"https://linkedsoftwaredependencies.org/bundles/npm/@solid/community-server/^8.0.0/components/context.jsonld"
|
|
5
|
-
],
|
|
6
|
-
"@id": "npmd:@undefineds.co/xpod",
|
|
7
|
-
"components": [
|
|
8
|
-
{
|
|
9
|
-
"@id": "undefineds:dist/http/SignalInterceptHttpHandler.jsonld#SignalInterceptHttpHandler",
|
|
10
|
-
"@type": "Class",
|
|
11
|
-
"requireElement": "SignalInterceptHttpHandler",
|
|
12
|
-
"extends": [
|
|
13
|
-
"css:dist/server/HttpHandler.jsonld#HttpHandler"
|
|
14
|
-
],
|
|
15
|
-
"comment": "Wraps the default CSS HttpHandler so we can short-circuit `/api/signal` requests to our token-based handler. All other paths continue through the normal pipeline (including authorization) untouched.",
|
|
16
|
-
"parameters": [
|
|
17
|
-
{
|
|
18
|
-
"@id": "undefineds:dist/http/SignalInterceptHttpHandler.jsonld#SignalInterceptHttpHandler_options_signalHandler",
|
|
19
|
-
"range": "css:dist/server/HttpHandler.jsonld#HttpHandler"
|
|
20
|
-
},
|
|
21
|
-
{
|
|
22
|
-
"@id": "undefineds:dist/http/SignalInterceptHttpHandler.jsonld#SignalInterceptHttpHandler_options_fallback",
|
|
23
|
-
"range": "css:dist/server/HttpHandler.jsonld#HttpHandler"
|
|
24
|
-
},
|
|
25
|
-
{
|
|
26
|
-
"@id": "undefineds:dist/http/SignalInterceptHttpHandler.jsonld#SignalInterceptHttpHandler_options_basePath",
|
|
27
|
-
"range": {
|
|
28
|
-
"@type": "ParameterRangeUnion",
|
|
29
|
-
"parameterRangeElements": [
|
|
30
|
-
"xsd:string",
|
|
31
|
-
{
|
|
32
|
-
"@type": "ParameterRangeUndefined"
|
|
33
|
-
}
|
|
34
|
-
]
|
|
35
|
-
}
|
|
36
|
-
}
|
|
37
|
-
],
|
|
38
|
-
"memberFields": [
|
|
39
|
-
{
|
|
40
|
-
"@id": "undefineds:dist/http/SignalInterceptHttpHandler.jsonld#SignalInterceptHttpHandler__member_signalHandler",
|
|
41
|
-
"memberFieldName": "signalHandler"
|
|
42
|
-
},
|
|
43
|
-
{
|
|
44
|
-
"@id": "undefineds:dist/http/SignalInterceptHttpHandler.jsonld#SignalInterceptHttpHandler__member_fallback",
|
|
45
|
-
"memberFieldName": "fallback"
|
|
46
|
-
},
|
|
47
|
-
{
|
|
48
|
-
"@id": "undefineds:dist/http/SignalInterceptHttpHandler.jsonld#SignalInterceptHttpHandler__member_basePath",
|
|
49
|
-
"memberFieldName": "basePath"
|
|
50
|
-
},
|
|
51
|
-
{
|
|
52
|
-
"@id": "undefineds:dist/http/SignalInterceptHttpHandler.jsonld#SignalInterceptHttpHandler__member_basePathWithSlash",
|
|
53
|
-
"memberFieldName": "basePathWithSlash"
|
|
54
|
-
},
|
|
55
|
-
{
|
|
56
|
-
"@id": "undefineds:dist/http/SignalInterceptHttpHandler.jsonld#SignalInterceptHttpHandler__member_constructor",
|
|
57
|
-
"memberFieldName": "constructor"
|
|
58
|
-
},
|
|
59
|
-
{
|
|
60
|
-
"@id": "undefineds:dist/http/SignalInterceptHttpHandler.jsonld#SignalInterceptHttpHandler__member_canHandle",
|
|
61
|
-
"memberFieldName": "canHandle"
|
|
62
|
-
},
|
|
63
|
-
{
|
|
64
|
-
"@id": "undefineds:dist/http/SignalInterceptHttpHandler.jsonld#SignalInterceptHttpHandler__member_handle",
|
|
65
|
-
"memberFieldName": "handle"
|
|
66
|
-
},
|
|
67
|
-
{
|
|
68
|
-
"@id": "undefineds:dist/http/SignalInterceptHttpHandler.jsonld#SignalInterceptHttpHandler__member_matches",
|
|
69
|
-
"memberFieldName": "matches"
|
|
70
|
-
},
|
|
71
|
-
{
|
|
72
|
-
"@id": "undefineds:dist/http/SignalInterceptHttpHandler.jsonld#SignalInterceptHttpHandler__member_parsePathname",
|
|
73
|
-
"memberFieldName": "parsePathname"
|
|
74
|
-
}
|
|
75
|
-
],
|
|
76
|
-
"constructorArguments": [
|
|
77
|
-
{
|
|
78
|
-
"@id": "undefineds:dist/http/SignalInterceptHttpHandler.jsonld#SignalInterceptHttpHandler_options__constructorArgument",
|
|
79
|
-
"fields": [
|
|
80
|
-
{
|
|
81
|
-
"keyRaw": "signalHandler",
|
|
82
|
-
"value": {
|
|
83
|
-
"@id": "undefineds:dist/http/SignalInterceptHttpHandler.jsonld#SignalInterceptHttpHandler_options_signalHandler"
|
|
84
|
-
}
|
|
85
|
-
},
|
|
86
|
-
{
|
|
87
|
-
"keyRaw": "fallback",
|
|
88
|
-
"value": {
|
|
89
|
-
"@id": "undefineds:dist/http/SignalInterceptHttpHandler.jsonld#SignalInterceptHttpHandler_options_fallback"
|
|
90
|
-
}
|
|
91
|
-
},
|
|
92
|
-
{
|
|
93
|
-
"keyRaw": "basePath",
|
|
94
|
-
"value": {
|
|
95
|
-
"@id": "undefineds:dist/http/SignalInterceptHttpHandler.jsonld#SignalInterceptHttpHandler_options_basePath"
|
|
96
|
-
}
|
|
97
|
-
}
|
|
98
|
-
]
|
|
99
|
-
}
|
|
100
|
-
]
|
|
101
|
-
}
|
|
102
|
-
]
|
|
103
|
-
}
|
|
@@ -1,71 +0,0 @@
|
|
|
1
|
-
import { HttpHandler } from '@solid/community-server';
|
|
2
|
-
import type { HttpHandlerInput } from '@solid/community-server';
|
|
3
|
-
import { EdgeNodeRepository } from '../../identity/drizzle/EdgeNodeRepository';
|
|
4
|
-
import type { EdgeNodeDnsCoordinator } from '../../edge/EdgeNodeDnsCoordinator';
|
|
5
|
-
import type { EdgeNodeCertificateProvisioner } from '../../edge/EdgeNodeCertificateProvisioner';
|
|
6
|
-
import type { EdgeNodeTunnelManager } from '../../edge/interfaces/EdgeNodeTunnelManager';
|
|
7
|
-
import type { EdgeNodeHealthProbeService } from '../../edge/EdgeNodeHealthProbeService';
|
|
8
|
-
import { EdgeNodeModeDetector } from '../../edge/EdgeNodeModeDetector';
|
|
9
|
-
import { EdgeNodeCapabilityDetector } from '../../edge/EdgeNodeCapabilityDetector';
|
|
10
|
-
interface EdgeNodeSignalHttpHandlerOptions {
|
|
11
|
-
identityDbUrl: string;
|
|
12
|
-
basePath?: string;
|
|
13
|
-
edgeNodesEnabled?: string | boolean;
|
|
14
|
-
repository?: EdgeNodeRepository;
|
|
15
|
-
dnsCoordinator?: EdgeNodeDnsCoordinator;
|
|
16
|
-
certificateProvisioner?: EdgeNodeCertificateProvisioner;
|
|
17
|
-
tunnelManager?: EdgeNodeTunnelManager;
|
|
18
|
-
healthProbeService?: EdgeNodeHealthProbeService;
|
|
19
|
-
modeDetector?: EdgeNodeModeDetector;
|
|
20
|
-
capabilityDetector?: EdgeNodeCapabilityDetector;
|
|
21
|
-
clusterBaseDomain?: string;
|
|
22
|
-
}
|
|
23
|
-
export declare class EdgeNodeSignalHttpHandler extends HttpHandler {
|
|
24
|
-
protected readonly logger: import("global-logger-factory").Logger<unknown>;
|
|
25
|
-
private readonly repo;
|
|
26
|
-
private readonly basePath;
|
|
27
|
-
private readonly basePathWithSlash;
|
|
28
|
-
private readonly enabled;
|
|
29
|
-
private readonly dnsCoordinator?;
|
|
30
|
-
private readonly certificateProvisioner?;
|
|
31
|
-
private readonly tunnelManager?;
|
|
32
|
-
private readonly healthProbeService?;
|
|
33
|
-
private readonly modeDetector?;
|
|
34
|
-
private readonly capabilityDetector?;
|
|
35
|
-
constructor(options: EdgeNodeSignalHttpHandlerOptions);
|
|
36
|
-
canHandle({ request }: HttpHandlerInput): Promise<void>;
|
|
37
|
-
handle({ request, response }: HttpHandlerInput): Promise<void>;
|
|
38
|
-
private handleRequest;
|
|
39
|
-
private writeError;
|
|
40
|
-
private readPayload;
|
|
41
|
-
private optionalCapabilities;
|
|
42
|
-
private optionalStatus;
|
|
43
|
-
private mergeMetadata;
|
|
44
|
-
private writeOptions;
|
|
45
|
-
private readBody;
|
|
46
|
-
private optionalString;
|
|
47
|
-
private optionalUrl;
|
|
48
|
-
private optionalIP;
|
|
49
|
-
private optionalPods;
|
|
50
|
-
private optionalRecord;
|
|
51
|
-
private optionalUrlList;
|
|
52
|
-
private mergeRecord;
|
|
53
|
-
private asRecord;
|
|
54
|
-
private uniqueList;
|
|
55
|
-
private requireString;
|
|
56
|
-
private matchesBase;
|
|
57
|
-
private toRelative;
|
|
58
|
-
private parseUrl;
|
|
59
|
-
private normalizeBasePath;
|
|
60
|
-
private normalizeBoolean;
|
|
61
|
-
private extractPortNumber;
|
|
62
|
-
private buildNodeCapabilities;
|
|
63
|
-
private parseStorageBackends;
|
|
64
|
-
private parseAuthMethods;
|
|
65
|
-
private parseSupportedModes;
|
|
66
|
-
private getSupportedModeFlags;
|
|
67
|
-
private applyRoutingDecision;
|
|
68
|
-
private determineAccessMode;
|
|
69
|
-
private normalizeAccessMode;
|
|
70
|
-
}
|
|
71
|
-
export {};
|