@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.
Files changed (307) hide show
  1. package/README.md +141 -2
  2. package/config/cli.json +9 -71
  3. package/config/cloud.json +34 -7
  4. package/config/local.json +6 -2
  5. package/config/resolver.json +11 -49
  6. package/config/runtime-open.json +22 -0
  7. package/config/xpod.base.json +32 -0
  8. package/config/xpod.cluster.json +2 -44
  9. package/config/xpod.json +5 -2
  10. package/dist/api/ApiServer.js +1 -1
  11. package/dist/api/ApiServer.js.map +1 -1
  12. package/dist/api/auth/AuthContext.d.ts +12 -1
  13. package/dist/api/auth/AuthContext.js +18 -1
  14. package/dist/api/auth/AuthContext.js.map +1 -1
  15. package/dist/api/auth/ClientCredentialsAuthenticator.d.ts +0 -1
  16. package/dist/api/auth/ClientCredentialsAuthenticator.js.map +1 -1
  17. package/dist/api/auth/ServiceTokenAuthenticator.d.ts +18 -0
  18. package/dist/api/auth/ServiceTokenAuthenticator.js +50 -0
  19. package/dist/api/auth/ServiceTokenAuthenticator.js.map +1 -0
  20. package/dist/api/auth/index.d.ts +1 -0
  21. package/dist/api/auth/index.js +1 -0
  22. package/dist/api/auth/index.js.map +1 -1
  23. package/dist/api/chatkit/ai-provider.d.ts +0 -10
  24. package/dist/api/chatkit/ai-provider.js +11 -120
  25. package/dist/api/chatkit/ai-provider.js.map +1 -1
  26. package/dist/api/chatkit/default-agent.js +11 -8
  27. package/dist/api/chatkit/default-agent.js.map +1 -1
  28. package/dist/api/chatkit/pod-store.js +19 -3
  29. package/dist/api/chatkit/pod-store.js.map +1 -1
  30. package/dist/api/chatkit/schema.d.ts +9 -3
  31. package/dist/api/chatkit/schema.js +14 -6
  32. package/dist/api/chatkit/schema.js.map +1 -1
  33. package/dist/api/container/business-token.d.ts +9 -0
  34. package/dist/api/container/business-token.js +32 -0
  35. package/dist/api/container/business-token.js.map +1 -0
  36. package/dist/api/container/cloud.js +36 -12
  37. package/dist/api/container/cloud.js.map +1 -1
  38. package/dist/api/container/common.js +12 -5
  39. package/dist/api/container/common.js.map +1 -1
  40. package/dist/api/container/index.js +94 -14
  41. package/dist/api/container/index.js.map +1 -1
  42. package/dist/api/container/local.js +2 -1
  43. package/dist/api/container/local.js.map +1 -1
  44. package/dist/api/container/routes.js +81 -15
  45. package/dist/api/container/routes.js.map +1 -1
  46. package/dist/api/container/types.d.ts +8 -6
  47. package/dist/api/container/types.js.map +1 -1
  48. package/dist/api/handlers/AdminHandler.js +9 -9
  49. package/dist/api/handlers/AdminHandler.js.map +1 -1
  50. package/dist/api/handlers/ApiKeyHandler.js +0 -6
  51. package/dist/api/handlers/ApiKeyHandler.js.map +1 -1
  52. package/dist/api/handlers/EdgeNodeSignalHandler.d.ts +17 -0
  53. package/dist/api/handlers/EdgeNodeSignalHandler.js +171 -0
  54. package/dist/api/handlers/EdgeNodeSignalHandler.js.map +1 -0
  55. package/dist/api/handlers/PodManagementHandler.d.ts +5 -4
  56. package/dist/api/handlers/PodManagementHandler.js +11 -10
  57. package/dist/api/handlers/PodManagementHandler.js.map +1 -1
  58. package/dist/api/handlers/ProvisionHandler.d.ts +42 -0
  59. package/dist/api/handlers/ProvisionHandler.js +161 -0
  60. package/dist/api/handlers/ProvisionHandler.js.map +1 -0
  61. package/dist/api/handlers/QuotaHandler.d.ts +7 -7
  62. package/dist/api/handlers/QuotaHandler.js +143 -73
  63. package/dist/api/handlers/QuotaHandler.js.map +1 -1
  64. package/dist/api/handlers/SubdomainClientHandler.js +2 -2
  65. package/dist/api/handlers/SubdomainClientHandler.js.map +1 -1
  66. package/dist/api/handlers/SubdomainHandler.js +13 -8
  67. package/dist/api/handlers/SubdomainHandler.js.map +1 -1
  68. package/dist/api/handlers/UsageHandler.d.ts +14 -0
  69. package/dist/api/handlers/UsageHandler.js +123 -0
  70. package/dist/api/handlers/UsageHandler.js.map +1 -0
  71. package/dist/api/handlers/index.d.ts +3 -1
  72. package/dist/api/handlers/index.js +3 -1
  73. package/dist/api/handlers/index.js.map +1 -1
  74. package/dist/api/main.js +18 -0
  75. package/dist/api/main.js.map +1 -1
  76. package/dist/api/middleware/OpenAuthMiddleware.d.ts +12 -0
  77. package/dist/api/middleware/OpenAuthMiddleware.js +27 -0
  78. package/dist/api/middleware/OpenAuthMiddleware.js.map +1 -0
  79. package/dist/api/runtime.d.ts +15 -0
  80. package/dist/api/runtime.js +104 -0
  81. package/dist/api/runtime.js.map +1 -0
  82. package/dist/api/service/VercelChatService.d.ts +16 -7
  83. package/dist/api/service/VercelChatService.js +98 -178
  84. package/dist/api/service/VercelChatService.js.map +1 -1
  85. package/dist/api/store/DrizzleClientCredentialsStore.d.ts +6 -11
  86. package/dist/api/store/DrizzleClientCredentialsStore.js +9 -39
  87. package/dist/api/store/DrizzleClientCredentialsStore.js.map +1 -1
  88. package/dist/authorization/AuthModeSelector.d.ts +10 -0
  89. package/dist/authorization/AuthModeSelector.js +27 -0
  90. package/dist/authorization/AuthModeSelector.js.map +1 -0
  91. package/dist/authorization/AuthModeSelector.jsonld +81 -0
  92. package/dist/cli/commands/account.d.ts +6 -0
  93. package/dist/cli/commands/account.js +119 -0
  94. package/dist/cli/commands/account.js.map +1 -0
  95. package/dist/cli/commands/auth.js +20 -29
  96. package/dist/cli/commands/auth.js.map +1 -1
  97. package/dist/cli/commands/backup.d.ts +15 -0
  98. package/dist/cli/commands/backup.js +286 -0
  99. package/dist/cli/commands/backup.js.map +1 -0
  100. package/dist/cli/commands/config.d.ts +34 -3
  101. package/dist/cli/commands/config.js +195 -258
  102. package/dist/cli/commands/config.js.map +1 -1
  103. package/dist/cli/commands/doctor.d.ts +6 -0
  104. package/dist/cli/commands/doctor.js +94 -0
  105. package/dist/cli/commands/doctor.js.map +1 -0
  106. package/dist/cli/commands/pod.d.ts +6 -0
  107. package/dist/cli/commands/pod.js +124 -0
  108. package/dist/cli/commands/pod.js.map +1 -0
  109. package/dist/cli/commands/start.js +28 -5
  110. package/dist/cli/commands/start.js.map +1 -1
  111. package/dist/cli/index.js +9 -0
  112. package/dist/cli/index.js.map +1 -1
  113. package/dist/cli/lib/credentials-store.d.ts +17 -0
  114. package/dist/cli/lib/credentials-store.js +73 -0
  115. package/dist/cli/lib/credentials-store.js.map +1 -0
  116. package/dist/cli/lib/css-account.d.ts +17 -0
  117. package/dist/cli/lib/css-account.js +56 -0
  118. package/dist/cli/lib/css-account.js.map +1 -1
  119. package/dist/cli/lib/pod-thread-store.d.ts +57 -0
  120. package/dist/cli/lib/pod-thread-store.js +310 -0
  121. package/dist/cli/lib/pod-thread-store.js.map +1 -0
  122. package/dist/cli/lib/solid-auth.d.ts +20 -0
  123. package/dist/cli/lib/solid-auth.js +70 -0
  124. package/dist/cli/lib/solid-auth.js.map +1 -0
  125. package/dist/components/components.jsonld +5 -8
  126. package/dist/components/context.jsonld +114 -244
  127. package/dist/edge/EdgeNodeAgent.js +2 -2
  128. package/dist/edge/EdgeNodeAgent.js.map +1 -1
  129. package/dist/edge/EdgeNodeDnsCoordinator.d.ts +1 -7
  130. package/dist/edge/EdgeNodeDnsCoordinator.js +31 -41
  131. package/dist/edge/EdgeNodeDnsCoordinator.js.map +1 -1
  132. package/dist/edge/EdgeNodeDnsCoordinator.jsonld +1 -27
  133. package/dist/edge/EdgeNodeModeDetector.d.ts +1 -1
  134. package/dist/edge/EdgeNodeModeDetector.js +9 -11
  135. package/dist/edge/EdgeNodeModeDetector.js.map +1 -1
  136. package/dist/http/ClusterIngressRouter.js +3 -3
  137. package/dist/http/ClusterIngressRouter.js.map +1 -1
  138. package/dist/http/ClusterWebSocketConfigurator.js +2 -2
  139. package/dist/http/ClusterWebSocketConfigurator.js.map +1 -1
  140. package/dist/http/PodRoutingHttpHandler.js +2 -2
  141. package/dist/http/PodRoutingHttpHandler.js.map +1 -1
  142. package/dist/http/cluster/PodMigrationHttpHandler.d.ts +1 -1
  143. package/dist/http/cluster/PodMigrationHttpHandler.js +1 -1
  144. package/dist/http/cluster/PodMigrationHttpHandler.js.map +1 -1
  145. package/dist/identity/drizzle/EdgeNodeRepository.d.ts +37 -4
  146. package/dist/identity/drizzle/EdgeNodeRepository.js +120 -128
  147. package/dist/identity/drizzle/EdgeNodeRepository.js.map +1 -1
  148. package/dist/identity/drizzle/ServiceTokenRepository.d.ts +52 -0
  149. package/dist/identity/drizzle/ServiceTokenRepository.js +143 -0
  150. package/dist/identity/drizzle/ServiceTokenRepository.js.map +1 -0
  151. package/dist/identity/drizzle/db.d.ts +9 -0
  152. package/dist/identity/drizzle/db.js +208 -1
  153. package/dist/identity/drizzle/db.js.map +1 -1
  154. package/dist/identity/drizzle/schema.pg.d.ts +5 -0
  155. package/dist/identity/drizzle/schema.pg.js +49 -20
  156. package/dist/identity/drizzle/schema.pg.js.map +1 -1
  157. package/dist/identity/drizzle/schema.sqlite.d.ts +332 -57
  158. package/dist/identity/drizzle/schema.sqlite.js +48 -18
  159. package/dist/identity/drizzle/schema.sqlite.js.map +1 -1
  160. package/dist/identity/oidc/AutoDetectIdentityProviderHandler.js +6 -4
  161. package/dist/identity/oidc/AutoDetectIdentityProviderHandler.js.map +1 -1
  162. package/dist/index.d.ts +6 -9
  163. package/dist/index.js +12 -14
  164. package/dist/index.js.map +1 -1
  165. package/dist/main.js +25 -8
  166. package/dist/main.js.map +1 -1
  167. package/dist/provision/ProvisionCodeCodec.d.ts +39 -0
  168. package/dist/provision/ProvisionCodeCodec.js +65 -0
  169. package/dist/provision/ProvisionCodeCodec.js.map +1 -0
  170. package/dist/provision/ProvisionCodeCodec.jsonld +47 -0
  171. package/dist/provision/ProvisionPodCreator.d.ts +20 -0
  172. package/dist/provision/ProvisionPodCreator.js +84 -0
  173. package/dist/provision/ProvisionPodCreator.js.map +1 -0
  174. package/dist/provision/ProvisionPodCreator.jsonld +118 -0
  175. package/dist/quota/DrizzleQuotaService.d.ts +17 -3
  176. package/dist/quota/DrizzleQuotaService.js +108 -8
  177. package/dist/quota/DrizzleQuotaService.js.map +1 -1
  178. package/dist/quota/DrizzleQuotaService.jsonld +33 -22
  179. package/dist/quota/NoopQuotaService.d.ts +7 -1
  180. package/dist/quota/NoopQuotaService.js +12 -0
  181. package/dist/quota/NoopQuotaService.js.map +1 -1
  182. package/dist/quota/NoopQuotaService.jsonld +24 -0
  183. package/dist/quota/QuotaService.d.ts +17 -0
  184. package/dist/quota/QuotaService.js +5 -0
  185. package/dist/quota/QuotaService.js.map +1 -1
  186. package/dist/quota/QuotaService.jsonld +50 -0
  187. package/dist/runtime/Proxy.d.ts +22 -4
  188. package/dist/runtime/Proxy.js +154 -35
  189. package/dist/runtime/Proxy.js.map +1 -1
  190. package/dist/runtime/XpodRuntime.d.ts +49 -0
  191. package/dist/runtime/XpodRuntime.js +374 -0
  192. package/dist/runtime/XpodRuntime.js.map +1 -0
  193. package/dist/runtime/env-utils.d.ts +2 -0
  194. package/dist/runtime/env-utils.js +55 -0
  195. package/dist/runtime/env-utils.js.map +1 -0
  196. package/dist/runtime/index.d.ts +4 -0
  197. package/dist/runtime/index.js +8 -1
  198. package/dist/runtime/index.js.map +1 -1
  199. package/dist/runtime/socket-fetch.d.ts +1 -0
  200. package/dist/runtime/socket-fetch.js +72 -0
  201. package/dist/runtime/socket-fetch.js.map +1 -0
  202. package/dist/runtime/socket-http.d.ts +1 -0
  203. package/dist/runtime/socket-http.js +142 -0
  204. package/dist/runtime/socket-http.js.map +1 -0
  205. package/dist/runtime/socket-utils.d.ts +2 -0
  206. package/dist/runtime/socket-utils.js +34 -0
  207. package/dist/runtime/socket-utils.js.map +1 -0
  208. package/dist/service/{EdgeNodeHeartbeatService.d.ts → EdgeNodeSignalClient.d.ts} +3 -3
  209. package/dist/service/{EdgeNodeHeartbeatService.js → EdgeNodeSignalClient.js} +4 -4
  210. package/dist/service/EdgeNodeSignalClient.js.map +1 -0
  211. package/dist/service/PodMigrationService.d.ts +1 -2
  212. package/dist/service/PodMigrationService.js +1 -2
  213. package/dist/service/PodMigrationService.js.map +1 -1
  214. package/dist/storage/SparqlUpdateResourceStore.js +1 -1
  215. package/dist/storage/SparqlUpdateResourceStore.js.map +1 -1
  216. package/dist/storage/accessors/MinioDataAccessor.d.ts +6 -0
  217. package/dist/storage/accessors/MinioDataAccessor.js +10 -0
  218. package/dist/storage/accessors/MinioDataAccessor.js.map +1 -1
  219. package/dist/storage/accessors/MinioDataAccessor.jsonld +4 -0
  220. package/dist/storage/accessors/MixDataAccessor.d.ts +2 -1
  221. package/dist/storage/accessors/MixDataAccessor.js +12 -1
  222. package/dist/storage/accessors/MixDataAccessor.js.map +1 -1
  223. package/dist/storage/accessors/MixDataAccessor.jsonld +19 -0
  224. package/dist/storage/locking/UrlAwareRedisLocker.d.ts +18 -0
  225. package/dist/storage/locking/UrlAwareRedisLocker.js +60 -0
  226. package/dist/storage/locking/UrlAwareRedisLocker.js.map +1 -0
  227. package/dist/storage/locking/UrlAwareRedisLocker.jsonld +123 -0
  228. package/dist/storage/quota/UsageRepository.d.ts +41 -8
  229. package/dist/storage/quota/UsageRepository.js +252 -50
  230. package/dist/storage/quota/UsageRepository.js.map +1 -1
  231. package/dist/storage/sparql/ComunicaQuintEngine.d.ts +9 -0
  232. package/dist/storage/sparql/ComunicaQuintEngine.js +50 -9
  233. package/dist/storage/sparql/ComunicaQuintEngine.js.map +1 -1
  234. package/dist/storage/sparql/QueryOptimizer.js +13 -1
  235. package/dist/storage/sparql/QueryOptimizer.js.map +1 -1
  236. package/dist/storage/sparql/QuintQuerySource.d.ts +14 -0
  237. package/dist/storage/sparql/QuintQuerySource.js +152 -1
  238. package/dist/storage/sparql/QuintQuerySource.js.map +1 -1
  239. package/dist/storage/sparql/SubgraphQueryEngine.d.ts +1 -0
  240. package/dist/storage/sparql/SubgraphQueryEngine.js +6 -2
  241. package/dist/storage/sparql/SubgraphQueryEngine.js.map +1 -1
  242. package/dist/storage/sparql/SubgraphQueryEngine.jsonld +4 -0
  243. package/dist/subdomain/SubdomainClient.d.ts +3 -3
  244. package/dist/subdomain/SubdomainClient.js +1 -1
  245. package/dist/subdomain/SubdomainClient.js.map +1 -1
  246. package/dist/subdomain/SubdomainService.d.ts +15 -16
  247. package/dist/subdomain/SubdomainService.js +80 -54
  248. package/dist/subdomain/SubdomainService.js.map +1 -1
  249. package/dist/subdomain/SubdomainService.jsonld +22 -26
  250. package/dist/supervisor/Supervisor.d.ts +7 -2
  251. package/dist/supervisor/Supervisor.js +33 -1
  252. package/dist/supervisor/Supervisor.js.map +1 -1
  253. package/dist/test-utils/index.d.ts +4 -0
  254. package/dist/test-utils/index.js +8 -0
  255. package/dist/test-utils/index.js.map +1 -0
  256. package/dist/test-utils/no-auth-xpod.d.ts +11 -0
  257. package/dist/test-utils/no-auth-xpod.js +25 -0
  258. package/dist/test-utils/no-auth-xpod.js.map +1 -0
  259. package/dist/test-utils/seed-pod.d.ts +5 -0
  260. package/dist/test-utils/seed-pod.js +61 -0
  261. package/dist/test-utils/seed-pod.js.map +1 -0
  262. package/package.json +23 -5
  263. package/templates/identity/account/create-pod.html.ejs +110 -0
  264. package/templates/main.html.ejs +10 -0
  265. package/dist/api/handlers/DevHandler.d.ts +0 -18
  266. package/dist/api/handlers/DevHandler.js +0 -276
  267. package/dist/api/handlers/DevHandler.js.map +0 -1
  268. package/dist/api/handlers/SignalHandler.d.ts +0 -13
  269. package/dist/api/handlers/SignalHandler.js +0 -122
  270. package/dist/api/handlers/SignalHandler.js.map +0 -1
  271. package/dist/gateway/Proxy.d.ts +0 -24
  272. package/dist/gateway/Proxy.js +0 -209
  273. package/dist/gateway/Proxy.js.map +0 -1
  274. package/dist/gateway/Supervisor.d.ts +0 -2
  275. package/dist/gateway/Supervisor.js +0 -7
  276. package/dist/gateway/Supervisor.js.map +0 -1
  277. package/dist/gateway/port-finder.d.ts +0 -4
  278. package/dist/gateway/port-finder.js +0 -15
  279. package/dist/gateway/port-finder.js.map +0 -1
  280. package/dist/gateway/types.d.ts +0 -1
  281. package/dist/gateway/types.js +0 -3
  282. package/dist/gateway/types.js.map +0 -1
  283. package/dist/http/SignalInterceptHttpHandler.d.ts +0 -24
  284. package/dist/http/SignalInterceptHttpHandler.js +0 -47
  285. package/dist/http/SignalInterceptHttpHandler.js.map +0 -1
  286. package/dist/http/SignalInterceptHttpHandler.jsonld +0 -103
  287. package/dist/http/admin/EdgeNodeSignalHttpHandler.d.ts +0 -71
  288. package/dist/http/admin/EdgeNodeSignalHttpHandler.js +0 -674
  289. package/dist/http/admin/EdgeNodeSignalHttpHandler.js.map +0 -1
  290. package/dist/http/admin/EdgeNodeSignalHttpHandler.jsonld +0 -406
  291. package/dist/http/cluster/PodMigrationHttpHandler.jsonld +0 -169
  292. package/dist/quota/DefaultQuotaService.d.ts +0 -16
  293. package/dist/quota/DefaultQuotaService.js +0 -37
  294. package/dist/quota/DefaultQuotaService.js.map +0 -1
  295. package/dist/quota/DefaultQuotaService.jsonld +0 -85
  296. package/dist/service/EdgeNodeHeartbeatService.js.map +0 -1
  297. package/dist/service/PodMigrationService.jsonld +0 -76
  298. package/dist/storage/MigratableDataAccessor.d.ts +0 -63
  299. package/dist/storage/MigratableDataAccessor.js +0 -11
  300. package/dist/storage/MigratableDataAccessor.js.map +0 -1
  301. package/dist/storage/MigratableDataAccessor.jsonld +0 -60
  302. package/dist/storage/accessors/TieredMinioDataAccessor.d.ts +0 -150
  303. package/dist/storage/accessors/TieredMinioDataAccessor.js +0 -582
  304. package/dist/storage/accessors/TieredMinioDataAccessor.js.map +0 -1
  305. package/dist/storage/accessors/TieredMinioDataAccessor.jsonld +0 -333
  306. package/static/app/assets/index.css +0 -1
  307. package/static/app/assets/main.js +0 -11
@@ -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":";;;;;;AAAA,4DAAmC;AACnC,gDAAwB;AACxB,iEAAqD;AAGrD,uDAAuD;AACvD,MAAM,WAAW,GAAG;IAClB,OAAO,EAAE,CAAC,KAAK,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,KAAK,EAAE,OAAO,EAAE,QAAQ,CAAC;IACrE,WAAW,EAAE,IAAI;IACjB,cAAc,EAAE;QACd,eAAe,EAAE,cAAc,EAAE,QAAQ,EAAE,MAAM,EAAE,QAAQ;QAC3D,kBAAkB,EAAE,UAAU,EAAE,eAAe,EAAE,MAAM,EAAE,MAAM;KAChE;IACD,cAAc,EAAE;QACd,cAAc,EAAE,aAAa,EAAE,YAAY,EAAE,OAAO,EAAE,eAAe;QACrE,MAAM,EAAE,eAAe,EAAE,MAAM,EAAE,UAAU,EAAE,aAAa;QAC1D,WAAW,EAAE,kBAAkB,EAAE,cAAc;KAChD;CACF,CAAC;AAEF,MAAa,YAAY;IAMvB,YAAoB,IAAY,EAAU,UAAsB;QAA5C,SAAI,GAAJ,IAAI,CAAQ;QAAU,eAAU,GAAV,UAAU,CAAY;QAL/C,WAAM,GAAG,IAAA,oCAAY,EAAC,IAAI,CAAC,CAAC;QAGrC,YAAO,GAAmC,EAAE,CAAC;QAGnD,IAAI,CAAC,KAAK,GAAG,oBAAS,CAAC,iBAAiB,CAAC;YACvC,IAAI,EAAE,IAAI;SACX,CAAC,CAAC;QAEH,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,OAAO,EAAE,CAAC,GAAG,EAAE,IAAI,EAAE,GAAG,EAAE,EAAE;YACxC,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,cAAc,EAAE,GAAG,CAAC,CAAC;YACvC,IAAI,GAAG,IAAI,WAAW,IAAI,GAAG,IAAI,CAAC,GAAG,CAAC,WAAW,EAAE,CAAC;gBAClD,GAAG,CAAC,SAAS,CAAC,GAAG,EAAE,EAAE,cAAc,EAAE,kBAAkB,EAAE,CAAC,CAAC;gBAC3D,GAAG,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE,KAAK,EAAE,qBAAqB,EAAE,OAAO,EAAE,GAAG,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC;YAClF,CAAC;QACH,CAAC,CAAC,CAAC;QAEH,IAAI,CAAC,MAAM,GAAG,cAAI,CAAC,YAAY,CAAC,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC;QAE/D,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,SAAS,EAAE,CAAC,GAAG,EAAE,MAAM,EAAE,IAAI,EAAE,EAAE;YAC9C,MAAM,GAAG,GAAG,GAAG,CAAC,GAAG,IAAI,GAAG,CAAC;YAE3B,kDAAkD;YAClD,IAAI,GAAG,CAAC,UAAU,CAAC,MAAM,CAAC,IAAI,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE,CAAC;gBAC/C,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,GAAG,EAAE,MAAM,EAAE,IAAI,EAAE,EAAE,MAAM,EAAE,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE,CAAC,CAAC;YACjE,CAAC;iBAAM,IAAI,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE,CAAC;gBAC5B,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,GAAG,EAAE,MAAM,EAAE,IAAI,EAAE,EAAE,MAAM,EAAE,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE,CAAC,CAAC;YACjE,CAAC;iBAAM,CAAC;gBACN,MAAM,CAAC,OAAO,EAAE,CAAC;YACnB,CAAC;QACH,CAAC,CAAC,CAAC;IACL,CAAC;IAEM,UAAU,CAAC,OAAuC;QACvD,IAAI,CAAC,OAAO,GAAG,OAAO,CAAC;IACzB,CAAC;IAEM,KAAK;QACV,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,EAAE,SAAS,EAAE,GAAG,EAAE;YAC5C,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,+BAA+B,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC;QAC/D,CAAC,CAAC,CAAC;IACL,CAAC;IAEM,IAAI;QACT,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;YACrC,IAAI,CAAC,KAAK,CAAC,KAAK,EAAE,CAAC;YACnB,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC;QAC9D,CAAC,CAAC,CAAC;IACL,CAAC;IAEO,aAAa,CAAC,GAAyB,EAAE,GAAwB;QACvE,MAAM,GAAG,GAAG,GAAG,CAAC,GAAG,IAAI,GAAG,CAAC;QAC3B,MAAM,MAAM,GAAG,GAAG,CAAC,OAAO,CAAC,MAAM,CAAC;QAElC,+DAA+D;QAC/D,MAAM,YAAY,GAAG,GAAG,CAAC,OAAO,CAAC,IAAI,CAAC;QAEtC,8CAA8C;QAC9C,MAAM,OAAO,GAAG,OAAO,CAAC,GAAG,CAAC,YAAY,IAAI,EAAE,CAAC;QAC/C,IAAI,OAAO,CAAC,UAAU,CAAC,OAAO,CAAC,EAAE,CAAC;YAChC,GAAG,CAAC,OAAO,CAAC,mBAAmB,CAAC,GAAG,OAAO,CAAC;QAC7C,CAAC;QAED,+DAA+D;QAC/D,IAAI,OAAO,EAAE,CAAC;YACZ,IAAI,CAAC;gBACH,MAAM,aAAa,GAAG,IAAI,GAAG,CAAC,OAAO,CAAC,CAAC;gBACvC,GAAG,CAAC,OAAO,CAAC,IAAI,GAAG,aAAa,CAAC,IAAI,CAAC;gBACtC,GAAG,CAAC,OAAO,CAAC,kBAAkB,CAAC,GAAG,aAAa,CAAC,IAAI,CAAC;YACvD,CAAC;YAAC,MAAM,CAAC;gBACP,IAAI,CAAC,GAAG,CAAC,OAAO,CAAC,kBAAkB,CAAC,EAAE,CAAC;oBACrC,GAAG,CAAC,OAAO,CAAC,kBAAkB,CAAC,GAAG,YAAY,CAAC;gBACjD,CAAC;YACH,CAAC;QACH,CAAC;aAAM,IAAI,CAAC,GAAG,CAAC,OAAO,CAAC,kBAAkB,CAAC,EAAE,CAAC;YAC5C,GAAG,CAAC,OAAO,CAAC,kBAAkB,CAAC,GAAG,YAAY,CAAC;QACjD,CAAC;QAED,IAAI,CAAC,MAAM,CAAC,KAAK,CACf,GAAG,GAAG,CAAC,MAAM,IAAI,GAAG,sBAAsB,GAAG,CAAC,OAAO,CAAC,mBAAmB,CAAC,qBAAqB,GAAG,CAAC,OAAO,CAAC,kBAAkB,CAAC,SAAS,GAAG,CAAC,OAAO,CAAC,IAAI,EAAE,CAC1J,CAAC;QAEF,wCAAwC;QACxC,IAAI,GAAG,CAAC,UAAU,CAAC,WAAW,CAAC,IAAI,GAAG,CAAC,UAAU,CAAC,YAAY,CAAC,EAAE,CAAC;YAChE,IAAI,GAAG,CAAC,MAAM,KAAK,SAAS,EAAE,CAAC;gBAC7B,IAAI,CAAC,0BAA0B,CAAC,GAAG,EAAE,MAAM,CAAC,CAAC;gBAC7C,OAAO;YACT,CAAC;YACD,IAAI,MAAM,EAAE,CAAC;gBACX,IAAI,CAAC,cAAc,CAAC,GAAG,EAAE,MAAM,CAAC,CAAC;YACnC,CAAC;YACD,KAAK,IAAI,CAAC,iBAAiB,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC;YACtC,OAAO;QACT,CAAC;QAED,sCAAsC;QACtC,IAAI,CAAC,GAAG,CAAC,UAAU,CAAC,MAAM,CAAC,IAAI,GAAG,CAAC,UAAU,CAAC,OAAO,CAAC,CAAC,IAAI,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE,CAAC;YAC5E,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,GAAG,EAAE,GAAG,EAAE,EAAE,MAAM,EAAE,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE,CAAC,CAAC;YACvD,OAAO;QACT,CAAC;QAED,2BAA2B;QAC3B,IAAI,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE,CAAC;YACrB,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,GAAG,EAAE,GAAG,EAAE,EAAE,MAAM,EAAE,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE,CAAC,CAAC;QACzD,CAAC;aAAM,CAAC;YACN,GAAG,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC;YACnB,GAAG,CAAC,GAAG,CAAC,2BAA2B,CAAC,CAAC;QACvC,CAAC;IACH,CAAC;IAEO,0BAA0B,CAChC,GAAwB,EACxB,MAA0B;QAE1B,IAAI,CAAC,cAAc,CAAC,GAAG,EAAE,MAAM,CAAC,CAAC;QACjC,GAAG,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC;QACnB,GAAG,CAAC,GAAG,EAAE,CAAC;IACZ,CAAC;IAED;;OAEG;IACK,cAAc,CAAC,GAAwB,EAAE,MAA0B;QACzE,GAAG,CAAC,SAAS,CAAC,6BAA6B,EAAE,MAAM,IAAI,GAAG,CAAC,CAAC;QAC5D,GAAG,CAAC,SAAS,CAAC,kCAAkC,EAAE,MAAM,CAAC,WAAW,CAAC,WAAW,CAAC,CAAC,CAAC;QACnF,GAAG,CAAC,SAAS,CAAC,8BAA8B,EAAE,WAAW,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC;QAC9E,GAAG,CAAC,SAAS,CAAC,8BAA8B,EAAE,WAAW,CAAC,cAAc,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC;QACrF,GAAG,CAAC,SAAS,CAAC,+BAA+B,EAAE,WAAW,CAAC,cAAc,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC;IACxF,CAAC;IAEO,KAAK,CAAC,iBAAiB,CAAC,GAAyB,EAAE,GAAwB;QACjF,IAAI,CAAC;YACH,MAAM,MAAM,GAAG,GAAG,CAAC,GAAG,IAAI,GAAG,CAAC;YAC9B,MAAM,MAAM,GAAG,IAAI,GAAG,CAAC,MAAM,EAAE,kBAAkB,CAAC,CAAC;YACnD,MAAM,QAAQ,GAAG,MAAM,CAAC,QAAQ,CAAC;YAEjC,IAAI,QAAQ,KAAK,iBAAiB,EAAE,CAAC;gBACnC,MAAM,MAAM,GAAG,IAAI,CAAC,UAAU,CAAC,YAAY,EAAE,CAAC;gBAC9C,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,UAAU,EAAE,CAAC;gBACzC,MAAM,IAAI,GAAG,QAAQ,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC;gBAClC,GAAG,CAAC,SAAS,CAAC,IAAI,EAAE,EAAE,cAAc,EAAE,kBAAkB,EAAE,CAAC,CAAC;gBAC5D,GAAG,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC,CAAC;gBAChC,OAAO;YACT,CAAC;YAED,IAAI,QAAQ,KAAK,eAAe,EAAE,CAAC;gBACjC,MAAM,KAAK,GAAG,MAAM,CAAC,YAAY,CAAC,GAAG,CAAC,OAAO,CAAC,IAAI,SAAS,CAAC;gBAC5D,MAAM,MAAM,GAAG,MAAM,CAAC,YAAY,CAAC,GAAG,CAAC,QAAQ,CAAC,IAAI,SAAS,CAAC;gBAC9D,MAAM,UAAU,GAAG,MAAM,CAAC,YAAY,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;gBACpD,MAAM,KAAK,GAAG,UAAU,CAAC,CAAC,CAAC,QAAQ,CAAC,UAAU,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;gBAEhE,MAAM,IAAI,GAAG,IAAI,CAAC,UAAU,CAAC,OAAO,CAAC;oBACnC,KAAK;oBACL,MAAM;oBACN,KAAK,EAAE,MAAM,CAAC,QAAQ,CAAC,KAAe,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,SAAS;iBAC5D,CAAC,CAAC;gBAEH,GAAG,CAAC,SAAS,CAAC,GAAG,EAAE,EAAE,cAAc,EAAE,kBAAkB,EAAE,CAAC,CAAC;gBAC3D,GAAG,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC,CAAC;gBAC9B,OAAO;YACT,CAAC;YAED,GAAG,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC;YACnB,GAAG,CAAC,GAAG,CAAC,WAAW,CAAC,CAAC;QACvB,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,mCAAmC,EAAE,KAAK,CAAC,CAAC;YAC9D,IAAI,CAAC,GAAG,CAAC,WAAW,EAAE,CAAC;gBACrB,GAAG,CAAC,SAAS,CAAC,GAAG,EAAE,EAAE,cAAc,EAAE,kBAAkB,EAAE,CAAC,CAAC;YAC7D,CAAC;YACD,GAAG,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE,KAAK,EAAE,uBAAuB,EAAE,CAAC,CAAC,CAAC;QAC9D,CAAC;IACH,CAAC;IAEO,KAAK,CAAC,UAAU;QACtB,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE,CAAC;YACtB,OAAO,IAAI,CAAC;QACd,CAAC;QAED,IAAI,CAAC;YACH,yEAAyE;YACzE,qEAAqE;YACrE,qEAAqE;YACrE,MAAM,WAAW,GAAG,oBAAoB,IAAI,CAAC,IAAI,GAAG,CAAC;YACrD,MAAM,UAAU,GAAG;gBACjB,gCAAgC;gBAChC,IAAI,GAAG,CAAC,wCAAwC,EAAE,WAAW,CAAC,CAAC,QAAQ,EAAE;gBACzE,iDAAiD;gBACjD,IAAI,GAAG,CAAC,kCAAkC,EAAE,WAAW,CAAC,CAAC,QAAQ,EAAE;aACpE,CAAC;YAEF,KAAK,MAAM,QAAQ,IAAI,UAAU,EAAE,CAAC;gBAClC,IAAI,CAAC;oBACH,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,QAAQ,EAAE,EAAE,MAAM,EAAE,WAAW,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;oBAC9E,IAAI,QAAQ,CAAC,EAAE,EAAE,CAAC;wBAChB,OAAO,IAAI,CAAC;oBACd,CAAC;gBACH,CAAC;gBAAC,MAAM,CAAC;oBACP,sBAAsB;gBACxB,CAAC;YACH,CAAC;YAED,OAAO,KAAK,CAAC;QACf,CAAC;QAAC,MAAM,CAAC;YACP,OAAO,KAAK,CAAC;QACf,CAAC;IACH,CAAC;CACF;AAhND,oCAgNC","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,2 +0,0 @@
1
- export { Supervisor } from '../supervisor';
2
- export type { ServiceConfig, ServiceState, ServiceStatus } from '../supervisor';
@@ -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,4 +0,0 @@
1
- /**
2
- * Find the next available port starting from basePort
3
- */
4
- export declare function getFreePort(basePort: number): Promise<number>;
@@ -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"]}
@@ -1 +0,0 @@
1
- export type { ServiceConfig, ServiceState, ServiceStatus } from '../supervisor';
@@ -1,3 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- //# sourceMappingURL=types.js.map
@@ -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 {};