@modularizer/plat 0.15.0 → 0.16.0

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 (122) hide show
  1. package/dist/bridge/cli.d.ts +3 -0
  2. package/dist/bridge/cli.d.ts.map +1 -0
  3. package/dist/bridge/cli.js +128 -0
  4. package/dist/bridge/cli.js.map +1 -0
  5. package/dist/bridge/http-forwarder.d.ts +51 -0
  6. package/dist/bridge/http-forwarder.d.ts.map +1 -0
  7. package/dist/bridge/http-forwarder.js +564 -0
  8. package/dist/bridge/http-forwarder.js.map +1 -0
  9. package/dist/bridge/index.d.ts +57 -0
  10. package/dist/bridge/index.d.ts.map +1 -0
  11. package/dist/bridge/index.js +69 -0
  12. package/dist/bridge/index.js.map +1 -0
  13. package/dist/cli/commands/api-proxy.d.ts.map +1 -1
  14. package/dist/cli/commands/api-proxy.js +5 -7
  15. package/dist/cli/commands/api-proxy.js.map +1 -1
  16. package/dist/cli/commands/jwt-cmd.d.ts.map +1 -1
  17. package/dist/cli/commands/jwt-cmd.js +1 -4
  18. package/dist/cli/commands/jwt-cmd.js.map +1 -1
  19. package/dist/cli/proxy.d.ts.map +1 -1
  20. package/dist/cli/proxy.js +9 -20
  21. package/dist/cli/proxy.js.map +1 -1
  22. package/dist/cli/runtime.d.ts.map +1 -1
  23. package/dist/cli/runtime.js +2 -6
  24. package/dist/cli/runtime.js.map +1 -1
  25. package/dist/client/css-transport-plugin.d.ts.map +1 -1
  26. package/dist/client/css-transport-plugin.js +40 -0
  27. package/dist/client/css-transport-plugin.js.map +1 -1
  28. package/dist/client/openapi-client.d.ts +5 -0
  29. package/dist/client/openapi-client.d.ts.map +1 -1
  30. package/dist/client/openapi-client.js +21 -2
  31. package/dist/client/openapi-client.js.map +1 -1
  32. package/dist/client-entry.d.ts +2 -0
  33. package/dist/client-entry.d.ts.map +1 -1
  34. package/dist/client-entry.js +2 -0
  35. package/dist/client-entry.js.map +1 -1
  36. package/dist/client-server-entry.d.ts +1 -0
  37. package/dist/client-server-entry.d.ts.map +1 -1
  38. package/dist/client-server-entry.js +1 -0
  39. package/dist/client-server-entry.js.map +1 -1
  40. package/dist/client-side-server/authority-default.d.ts +13 -0
  41. package/dist/client-side-server/authority-default.d.ts.map +1 -0
  42. package/dist/client-side-server/authority-default.js +13 -0
  43. package/dist/client-side-server/authority-default.js.map +1 -0
  44. package/dist/client-side-server/channel.d.ts.map +1 -1
  45. package/dist/client-side-server/channel.js +179 -78
  46. package/dist/client-side-server/channel.js.map +1 -1
  47. package/dist/client-side-server/identity.d.ts +1 -0
  48. package/dist/client-side-server/identity.d.ts.map +1 -1
  49. package/dist/client-side-server/identity.js +117 -0
  50. package/dist/client-side-server/identity.js.map +1 -1
  51. package/dist/client-side-server/mqtt-webrtc.d.ts +13 -2
  52. package/dist/client-side-server/mqtt-webrtc.d.ts.map +1 -1
  53. package/dist/client-side-server/mqtt-webrtc.js +17 -2
  54. package/dist/client-side-server/mqtt-webrtc.js.map +1 -1
  55. package/dist/client-side-server/plat-bridge.js +3 -1
  56. package/dist/client-side-server/plat-bridge.js.map +1 -1
  57. package/dist/client-side-server/plat-fetch.d.ts +3 -0
  58. package/dist/client-side-server/plat-fetch.d.ts.map +1 -1
  59. package/dist/client-side-server/plat-fetch.js +199 -29
  60. package/dist/client-side-server/plat-fetch.js.map +1 -1
  61. package/dist/client-side-server/plat-service-worker-client.d.ts.map +1 -1
  62. package/dist/client-side-server/plat-service-worker-client.js +3 -0
  63. package/dist/client-side-server/plat-service-worker-client.js.map +1 -1
  64. package/dist/client-side-server/plat-service-worker.js +30 -0
  65. package/dist/client-side-server/plat-service-worker.js.map +1 -1
  66. package/dist/client-side-server/protocol.d.ts +22 -0
  67. package/dist/client-side-server/protocol.d.ts.map +1 -1
  68. package/dist/client-side-server/protocol.js.map +1 -1
  69. package/dist/client-side-server/runtime-fetch.d.ts +20 -0
  70. package/dist/client-side-server/runtime-fetch.d.ts.map +1 -0
  71. package/dist/client-side-server/runtime-fetch.js +32 -0
  72. package/dist/client-side-server/runtime-fetch.js.map +1 -0
  73. package/dist/client-side-server/runtime.d.ts.map +1 -1
  74. package/dist/client-side-server/runtime.js +36 -7
  75. package/dist/client-side-server/runtime.js.map +1 -1
  76. package/dist/client-side-server/server.d.ts.map +1 -1
  77. package/dist/client-side-server/server.js +29 -5
  78. package/dist/client-side-server/server.js.map +1 -1
  79. package/dist/server/config/types.d.ts +12 -1
  80. package/dist/server/config/types.d.ts.map +1 -1
  81. package/dist/server/core.d.ts.map +1 -1
  82. package/dist/server/core.js +25 -14
  83. package/dist/server/core.js.map +1 -1
  84. package/dist/server/docs-html.d.ts +11 -0
  85. package/dist/server/docs-html.d.ts.map +1 -0
  86. package/dist/server/docs-html.js +30 -0
  87. package/dist/server/docs-html.js.map +1 -0
  88. package/dist/server/operation-registry.d.ts +1 -0
  89. package/dist/server/operation-registry.d.ts.map +1 -1
  90. package/dist/server/operation-registry.js +16 -2
  91. package/dist/server/operation-registry.js.map +1 -1
  92. package/dist/server/routing.d.ts +5 -0
  93. package/dist/server/routing.d.ts.map +1 -1
  94. package/dist/server/routing.js +32 -2
  95. package/dist/server/routing.js.map +1 -1
  96. package/dist/server/rpc-protocol-plugin.js +2 -2
  97. package/dist/server/rpc-protocol-plugin.js.map +1 -1
  98. package/dist/server/server.d.ts +4 -0
  99. package/dist/server/server.d.ts.map +1 -1
  100. package/dist/server/server.js +229 -53
  101. package/dist/server/server.js.map +1 -1
  102. package/dist/server/transports.d.ts +1 -0
  103. package/dist/server/transports.d.ts.map +1 -1
  104. package/dist/server/webrtc-plugin.d.ts +21 -0
  105. package/dist/server/webrtc-plugin.d.ts.map +1 -0
  106. package/dist/server/webrtc-plugin.js +198 -0
  107. package/dist/server/webrtc-plugin.js.map +1 -0
  108. package/dist/static/file-response.d.ts +2 -0
  109. package/dist/static/file-response.d.ts.map +1 -1
  110. package/dist/static/file-response.js +2 -0
  111. package/dist/static/file-response.js.map +1 -1
  112. package/dist/static/plat-static-folders.d.ts +11 -0
  113. package/dist/static/plat-static-folders.d.ts.map +1 -0
  114. package/dist/static/plat-static-folders.js +44 -0
  115. package/dist/static/plat-static-folders.js.map +1 -0
  116. package/dist/static/static-folder.d.ts +4 -0
  117. package/dist/static/static-folder.d.ts.map +1 -1
  118. package/dist/static/static-folder.js +27 -2
  119. package/dist/static/static-folder.js.map +1 -1
  120. package/dist/types/endpoints.d.ts +3 -0
  121. package/dist/types/endpoints.d.ts.map +1 -1
  122. package/package.json +5 -1
@@ -0,0 +1,564 @@
1
+ import { isClientSideServerRequestMessage, } from '../client-side-server/protocol.js';
2
+ /** Headers that must not be forwarded per RFC 7230 §6.1. */
3
+ const HOP_BY_HOP_HEADERS = new Set([
4
+ 'connection',
5
+ 'keep-alive',
6
+ 'proxy-authenticate',
7
+ 'proxy-authorization',
8
+ 'te',
9
+ 'trailer',
10
+ 'transfer-encoding',
11
+ 'upgrade',
12
+ ]);
13
+ export function createHTTPForwarder(options) {
14
+ const fetchImpl = options.fetchImpl ?? globalThis.fetch.bind(globalThis);
15
+ const bridgeName = options.bridgeName ?? options.cssName;
16
+ const upstreamMode = options.upstreamMode ?? 'fixed';
17
+ const pathBaseMode = options.pathBaseMode ?? 'origin-root';
18
+ const upstreamBase = options.upstream?.replace(/\/$/, '');
19
+ const allowMethods = options.allowMethods?.map((m) => m.toUpperCase());
20
+ const allowPaths = options.allowPaths?.map((p) => (typeof p === 'string' ? new RegExp(p) : p));
21
+ const timeoutMs = options.requestTimeoutMs ?? 30_000;
22
+ const logger = options.logger;
23
+ const resolvedOptions = {
24
+ fetchImpl,
25
+ upstreamBase,
26
+ upstreamMode,
27
+ pathBaseMode,
28
+ runtimeOrigin: getRuntimeOrigin(),
29
+ cssName: options.cssName,
30
+ bridgeName,
31
+ trustClientForwarded: options.trustClientForwarded ?? false,
32
+ disableForwardedHeaders: options.disableForwardedHeaders ?? true,
33
+ allowMethods,
34
+ allowPaths,
35
+ timeoutMs,
36
+ logger,
37
+ };
38
+ return {
39
+ async getServerInfo() {
40
+ return options.instanceInfo ?? {};
41
+ },
42
+ serveChannel(channel) {
43
+ logger?.('[plat-bridge] channel attached', {
44
+ cssName: options.cssName,
45
+ upstream: upstreamBase,
46
+ upstreamMode,
47
+ pathBaseMode,
48
+ });
49
+ return channel.subscribe(async (message) => {
50
+ const swMessage = message;
51
+ if (swMessage?.type === 'PLAT_REQUEST') {
52
+ await handleServiceWorkerBridgeRequest(swMessage, channel, resolvedOptions);
53
+ return;
54
+ }
55
+ if (isClientSideServerRequestMessage(message)) {
56
+ await handleClientSideServerRequest(message, channel, resolvedOptions);
57
+ }
58
+ });
59
+ },
60
+ };
61
+ }
62
+ async function handleServiceWorkerBridgeRequest(request, channel, options) {
63
+ const method = request.method.toUpperCase();
64
+ options.logger?.('[plat-bridge] request', {
65
+ id: request.id,
66
+ method,
67
+ path: request.path,
68
+ clientOrigin: request.clientOrigin,
69
+ requestOrigin: request.requestOrigin,
70
+ interceptOrigin: request.interceptOrigin,
71
+ bodyEncoding: request.bodyEncoding,
72
+ });
73
+ if (options.allowMethods && !options.allowMethods.includes(method)) {
74
+ options.logger?.('[plat-bridge] rejected method', { id: request.id, method, allowMethods: options.allowMethods });
75
+ await sendServiceWorkerError(channel, request.id, 405, 'Method Not Allowed', 'method-not-allowed');
76
+ return;
77
+ }
78
+ if (options.allowPaths && !options.allowPaths.some((r) => r.test(request.path))) {
79
+ options.logger?.('[plat-bridge] rejected path', { id: request.id, path: request.path });
80
+ await sendServiceWorkerError(channel, request.id, 403, 'Forbidden', 'path-not-allowed');
81
+ return;
82
+ }
83
+ try {
84
+ const response = await forwardHttpRequest(method, request.path, request.headers, await decodeServiceWorkerRequestBody(request), {
85
+ clientOrigin: request.clientOrigin,
86
+ requestOrigin: request.requestOrigin,
87
+ interceptOrigin: request.interceptOrigin,
88
+ }, {
89
+ destination: request.destination,
90
+ mode: request.mode,
91
+ credentials: request.credentials,
92
+ cache: request.cache,
93
+ redirect: request.redirect,
94
+ referrer: request.referrer,
95
+ referrerPolicy: request.referrerPolicy,
96
+ integrity: request.integrity,
97
+ }, options);
98
+ options.logger?.('[plat-bridge] response', {
99
+ id: request.id,
100
+ method,
101
+ path: request.path,
102
+ clientOrigin: request.clientOrigin,
103
+ requestOrigin: request.requestOrigin,
104
+ interceptOrigin: request.interceptOrigin,
105
+ status: response.status,
106
+ statusText: response.statusText || '',
107
+ bodyEncoding: response.bodyEncoding,
108
+ bytes: response.byteLength,
109
+ });
110
+ const result = {
111
+ type: 'PLAT_RESPONSE',
112
+ id: request.id,
113
+ status: response.status,
114
+ statusText: response.statusText,
115
+ headers: response.headers,
116
+ finalUrl: response.finalUrl,
117
+ bodyEncoding: response.bodyEncoding,
118
+ body: response.body,
119
+ };
120
+ await channel.send(result);
121
+ }
122
+ catch (error) {
123
+ const code = error?.code === 'timeout' ? 'timeout' : 'upstream-failed';
124
+ const status = code === 'timeout' ? 504 : 502;
125
+ options.logger?.('[plat-bridge] error', {
126
+ id: request.id,
127
+ method,
128
+ path: request.path,
129
+ clientOrigin: request.clientOrigin,
130
+ requestOrigin: request.requestOrigin,
131
+ interceptOrigin: request.interceptOrigin,
132
+ status,
133
+ code,
134
+ message: error?.message ?? 'Upstream request failed',
135
+ });
136
+ await sendServiceWorkerError(channel, request.id, status, error?.message ?? 'Upstream request failed', code);
137
+ }
138
+ }
139
+ async function handleClientSideServerRequest(request, channel, options) {
140
+ const method = request.method.toUpperCase();
141
+ options.logger?.('[plat-bridge] request', {
142
+ id: request.id,
143
+ method,
144
+ path: request.path,
145
+ clientOrigin: request.clientOrigin,
146
+ requestOrigin: request.requestOrigin,
147
+ interceptOrigin: request.interceptOrigin,
148
+ bodyEncoding: request.bodyEncoding ?? inferInputEncoding(request.input),
149
+ });
150
+ if (options.allowMethods && !options.allowMethods.includes(method)) {
151
+ options.logger?.('[plat-bridge] rejected method', { id: request.id, method, allowMethods: options.allowMethods });
152
+ await sendClientResponse(channel, request.id, buildSyntheticHttpResponse(405, 'Method Not Allowed', 'method-not-allowed'));
153
+ return;
154
+ }
155
+ if (options.allowPaths && !options.allowPaths.some((r) => r.test(request.path))) {
156
+ options.logger?.('[plat-bridge] rejected path', { id: request.id, path: request.path });
157
+ await sendClientResponse(channel, request.id, buildSyntheticHttpResponse(403, 'Forbidden', 'path-not-allowed'));
158
+ return;
159
+ }
160
+ try {
161
+ const response = await forwardHttpRequest(method, request.path, request.headers ?? {}, await decodeClientRequestBody(request), {
162
+ clientOrigin: request.clientOrigin,
163
+ requestOrigin: request.requestOrigin,
164
+ interceptOrigin: request.interceptOrigin,
165
+ }, undefined, options);
166
+ options.logger?.('[plat-bridge] response', {
167
+ id: request.id,
168
+ method,
169
+ path: request.path,
170
+ clientOrigin: request.clientOrigin,
171
+ requestOrigin: request.requestOrigin,
172
+ interceptOrigin: request.interceptOrigin,
173
+ status: response.status,
174
+ statusText: response.statusText || '',
175
+ bodyEncoding: response.bodyEncoding,
176
+ bytes: response.byteLength,
177
+ });
178
+ await sendClientResponse(channel, request.id, response);
179
+ }
180
+ catch (error) {
181
+ const code = error?.code === 'timeout' ? 'timeout' : 'upstream-failed';
182
+ const status = code === 'timeout' ? 504 : 502;
183
+ options.logger?.('[plat-bridge] error', {
184
+ id: request.id,
185
+ method,
186
+ path: request.path,
187
+ clientOrigin: request.clientOrigin,
188
+ requestOrigin: request.requestOrigin,
189
+ interceptOrigin: request.interceptOrigin,
190
+ status,
191
+ code,
192
+ message: error?.message ?? 'Upstream request failed',
193
+ });
194
+ await sendClientResponse(channel, request.id, buildSyntheticHttpResponse(status, error?.message ?? 'Upstream request failed', code));
195
+ }
196
+ }
197
+ async function sendServiceWorkerError(channel, id, status, message, errorCode) {
198
+ const response = {
199
+ type: 'PLAT_RESPONSE',
200
+ id,
201
+ status,
202
+ statusText: message,
203
+ headers: {},
204
+ bodyEncoding: 'none',
205
+ error: message,
206
+ errorCode: errorCode,
207
+ };
208
+ await channel.send(response);
209
+ }
210
+ async function sendClientResponse(channel, id, response) {
211
+ const payload = {
212
+ jsonrpc: '2.0',
213
+ id,
214
+ ok: true,
215
+ result: {
216
+ _type: 'http-response',
217
+ status: response.status,
218
+ statusText: response.statusText,
219
+ headers: response.headers,
220
+ finalUrl: response.finalUrl,
221
+ bodyEncoding: response.bodyEncoding,
222
+ body: response.body,
223
+ },
224
+ };
225
+ await channel.send(payload);
226
+ }
227
+ async function forwardHttpRequest(method, path, inboundHeaders, body, requestMetadata, requestSemantics, options) {
228
+ const headers = buildForwardedHeaders(inboundHeaders, options);
229
+ const upstreamBase = resolveUpstreamBase(requestMetadata, options);
230
+ const upstreamPath = resolveUpstreamPath(path, requestMetadata, requestSemantics, options.pathBaseMode);
231
+ const url = new URL(upstreamPath || '/', `${upstreamBase}/`).toString();
232
+ const controller = new AbortController();
233
+ const timer = setTimeout(() => controller.abort(), options.timeoutMs);
234
+ try {
235
+ const fetchOptions = {
236
+ method,
237
+ headers,
238
+ signal: controller.signal,
239
+ };
240
+ applyReplaySemantics(fetchOptions, requestSemantics, requestMetadata);
241
+ if (body !== undefined) {
242
+ fetchOptions.body = body;
243
+ fetchOptions.duplex = 'half';
244
+ }
245
+ const response = await options.fetchImpl.call(globalThis, url, fetchOptions);
246
+ const responseHeaders = collectResponseHeaders(response.headers);
247
+ const buffer = await response.arrayBuffer();
248
+ const { body: responseBody, encoding } = encodeResponseBody(buffer, responseHeaders);
249
+ return {
250
+ status: response.status,
251
+ statusText: response.statusText || '',
252
+ headers: responseHeaders,
253
+ finalUrl: response.url,
254
+ bodyEncoding: encoding,
255
+ body: responseBody,
256
+ byteLength: buffer.byteLength,
257
+ };
258
+ }
259
+ catch (error) {
260
+ if (controller.signal.aborted) {
261
+ const timeoutError = new Error(error?.message ?? 'Upstream request timed out');
262
+ timeoutError.code = 'timeout';
263
+ throw timeoutError;
264
+ }
265
+ throw error;
266
+ }
267
+ finally {
268
+ clearTimeout(timer);
269
+ }
270
+ }
271
+ function resolveUpstreamPath(path, requestMetadata, requestSemantics, pathBaseMode) {
272
+ if (pathBaseMode !== 'route-base')
273
+ return path;
274
+ if (!path.startsWith('/'))
275
+ return path;
276
+ const routeBase = resolveRouteBasePath(requestMetadata.interceptOrigin, requestSemantics?.referrer);
277
+ if (!routeBase)
278
+ return path;
279
+ if (path === routeBase || path.startsWith(`${routeBase}/`))
280
+ return path;
281
+ if (path === '/')
282
+ return `${routeBase}/`;
283
+ return `${routeBase}${path}`;
284
+ }
285
+ function resolveRouteBasePath(interceptOrigin, referrer) {
286
+ const fromInterceptOrigin = normalizeRouteBasePathFromUrl(interceptOrigin);
287
+ if (fromInterceptOrigin)
288
+ return fromInterceptOrigin;
289
+ if (!referrer)
290
+ return undefined;
291
+ try {
292
+ const parsed = new URL(referrer);
293
+ const firstSegment = parsed.pathname.split('/').filter(Boolean)[0];
294
+ if (!firstSegment)
295
+ return undefined;
296
+ return `/${firstSegment}`;
297
+ }
298
+ catch {
299
+ return undefined;
300
+ }
301
+ }
302
+ function normalizeRouteBasePathFromUrl(candidate) {
303
+ if (!candidate)
304
+ return undefined;
305
+ try {
306
+ const parsed = new URL(candidate);
307
+ const pathname = parsed.pathname.replace(/\/+$/, '');
308
+ if (!pathname || pathname === '/')
309
+ return undefined;
310
+ return pathname;
311
+ }
312
+ catch {
313
+ return undefined;
314
+ }
315
+ }
316
+ function applyReplaySemantics(fetchOptions, semantics, requestMetadata) {
317
+ if (!semantics)
318
+ return;
319
+ if (semantics.credentials)
320
+ fetchOptions.credentials = semantics.credentials;
321
+ if (semantics.cache && semantics.cache !== 'only-if-cached')
322
+ fetchOptions.cache = semantics.cache;
323
+ if (semantics.redirect)
324
+ fetchOptions.redirect = semantics.redirect;
325
+ if (semantics.referrerPolicy)
326
+ fetchOptions.referrerPolicy = semantics.referrerPolicy;
327
+ if (semantics.integrity)
328
+ fetchOptions.integrity = semantics.integrity;
329
+ if (semantics.referrer) {
330
+ const bridgedReferrer = normalizeBridgeReferrer(semantics.referrer, requestMetadata);
331
+ if (bridgedReferrer)
332
+ fetchOptions.referrer = bridgedReferrer;
333
+ }
334
+ // Preserve explicit fetch/XHR modes when they yield readable responses.
335
+ // Avoid replaying browser subresource `no-cors` as opaque responses because
336
+ // the bridge needs to read the body to mirror it back.
337
+ if (semantics.mode && semantics.mode !== 'navigate' && semantics.mode !== 'no-cors') {
338
+ fetchOptions.mode = semantics.mode;
339
+ }
340
+ }
341
+ function normalizeBridgeReferrer(referrer, requestMetadata) {
342
+ if (!referrer || referrer === 'about:client')
343
+ return undefined;
344
+ if (!requestMetadata.clientOrigin || !requestMetadata.requestOrigin)
345
+ return referrer;
346
+ try {
347
+ const referrerUrl = new URL(referrer);
348
+ if (referrerUrl.origin !== requestMetadata.clientOrigin)
349
+ return referrer;
350
+ const targetOrigin = requestMetadata.interceptOrigin ?? requestMetadata.requestOrigin;
351
+ const targetUrl = new URL(targetOrigin);
352
+ targetUrl.pathname = referrerUrl.pathname;
353
+ targetUrl.search = referrerUrl.search;
354
+ targetUrl.hash = referrerUrl.hash;
355
+ return targetUrl.toString();
356
+ }
357
+ catch {
358
+ return referrer;
359
+ }
360
+ }
361
+ function buildForwardedHeaders(inbound, options) {
362
+ const out = {};
363
+ for (const [key, value] of Object.entries(inbound)) {
364
+ const lower = key.toLowerCase();
365
+ if (HOP_BY_HOP_HEADERS.has(lower))
366
+ continue;
367
+ if (!options.trustClientForwarded && isForwardedHeader(lower))
368
+ continue;
369
+ out[key] = value;
370
+ }
371
+ if (options.disableForwardedHeaders)
372
+ return out;
373
+ const existingForwardedFor = options.trustClientForwarded ? inbound['x-forwarded-for'] : undefined;
374
+ const existingForwarded = options.trustClientForwarded ? inbound['forwarded'] : undefined;
375
+ const remoteAddress = 'unknown';
376
+ out['x-forwarded-for'] = existingForwardedFor
377
+ ? `${existingForwardedFor}, ${remoteAddress}`
378
+ : remoteAddress;
379
+ out['x-forwarded-proto'] = 'webrtc';
380
+ out['x-forwarded-host'] = options.cssName;
381
+ out['x-forwarded-by'] = options.bridgeName;
382
+ const forwardedToken = `for=${remoteAddress};proto=webrtc;host=${quoteIfNeeded(options.cssName)};by=${quoteIfNeeded(options.bridgeName)}`;
383
+ out['forwarded'] = existingForwarded
384
+ ? `${existingForwarded}, ${forwardedToken}`
385
+ : forwardedToken;
386
+ return out;
387
+ }
388
+ function isForwardedHeader(lowerName) {
389
+ return (lowerName === 'x-forwarded-for'
390
+ || lowerName === 'x-forwarded-proto'
391
+ || lowerName === 'x-forwarded-host'
392
+ || lowerName === 'x-forwarded-by'
393
+ || lowerName === 'forwarded');
394
+ }
395
+ function quoteIfNeeded(value) {
396
+ if (/^[A-Za-z0-9._-]+$/.test(value))
397
+ return value;
398
+ return `"${value.replace(/"/g, '\\"')}"`;
399
+ }
400
+ function resolveUpstreamBase(requestMetadata, options) {
401
+ const requestedOrigin = options.upstreamMode === 'request-origin'
402
+ ? requestMetadata.requestOrigin
403
+ : options.upstreamMode === 'intercept-origin'
404
+ ? requestMetadata.interceptOrigin ?? requestMetadata.requestOrigin
405
+ : options.upstreamBase;
406
+ const candidate = resolveRequestedOriginAgainstBridgeRuntime(requestedOrigin, requestMetadata.clientOrigin, options.runtimeOrigin);
407
+ if (!candidate) {
408
+ throw new Error(`No upstream origin available for mode "${options.upstreamMode}"`);
409
+ }
410
+ let parsed;
411
+ try {
412
+ parsed = new URL(candidate);
413
+ }
414
+ catch {
415
+ throw new Error(`Invalid upstream origin: ${candidate}`);
416
+ }
417
+ if (options.runtimeOrigin) {
418
+ try {
419
+ const runtimeUrl = new URL(options.runtimeOrigin);
420
+ const isExplicitOffOriginTarget = !requestMetadata.clientOrigin || candidate !== requestMetadata.clientOrigin;
421
+ if (runtimeUrl.protocol === 'https:' && parsed.protocol === 'http:' && isExplicitOffOriginTarget) {
422
+ parsed.protocol = 'https:';
423
+ }
424
+ }
425
+ catch {
426
+ // Ignore runtime-origin parse failures and keep the requested origin as-is.
427
+ }
428
+ }
429
+ if (parsed.protocol !== 'http:' && parsed.protocol !== 'https:') {
430
+ throw new Error(`Unsupported upstream protocol: ${parsed.protocol}`);
431
+ }
432
+ parsed.pathname = parsed.pathname.replace(/\/+$/, '');
433
+ parsed.search = '';
434
+ parsed.hash = '';
435
+ return parsed.toString().replace(/\/$/, '');
436
+ }
437
+ function resolveRequestedOriginAgainstBridgeRuntime(requestedOrigin, clientOrigin, runtimeOrigin) {
438
+ if (!requestedOrigin)
439
+ return undefined;
440
+ if (!runtimeOrigin)
441
+ return requestedOrigin;
442
+ if (clientOrigin && runtimeOrigin !== clientOrigin) {
443
+ try {
444
+ const requestedUrl = new URL(requestedOrigin);
445
+ if (requestedUrl.origin === clientOrigin) {
446
+ const runtimeUrl = new URL(runtimeOrigin);
447
+ runtimeUrl.pathname = requestedUrl.pathname;
448
+ runtimeUrl.search = requestedUrl.search;
449
+ runtimeUrl.hash = requestedUrl.hash;
450
+ return runtimeUrl.toString();
451
+ }
452
+ }
453
+ catch {
454
+ if (requestedOrigin === clientOrigin) {
455
+ return runtimeOrigin;
456
+ }
457
+ }
458
+ }
459
+ return requestedOrigin;
460
+ }
461
+ function getRuntimeOrigin() {
462
+ if (typeof location !== 'undefined' && location.origin)
463
+ return location.origin;
464
+ return undefined;
465
+ }
466
+ async function decodeServiceWorkerRequestBody(request) {
467
+ if (!request.body)
468
+ return undefined;
469
+ if (request.bodyEncoding === 'base64') {
470
+ return base64ToUint8Array(request.body);
471
+ }
472
+ return new TextEncoder().encode(request.body);
473
+ }
474
+ async function decodeClientRequestBody(request) {
475
+ if (request.body) {
476
+ if (request.bodyEncoding === 'base64') {
477
+ return base64ToUint8Array(request.body);
478
+ }
479
+ return new TextEncoder().encode(request.body);
480
+ }
481
+ if (request.input === undefined)
482
+ return undefined;
483
+ if (typeof request.input === 'string')
484
+ return new TextEncoder().encode(request.input);
485
+ return new TextEncoder().encode(JSON.stringify(request.input));
486
+ }
487
+ function inferInputEncoding(input) {
488
+ if (input === undefined)
489
+ return 'none';
490
+ return typeof input === 'string' ? 'none' : 'json';
491
+ }
492
+ function buildSyntheticHttpResponse(status, message, code) {
493
+ const body = JSON.stringify({ error: message, code });
494
+ return {
495
+ status,
496
+ statusText: message,
497
+ headers: { 'content-type': 'application/json; charset=utf-8' },
498
+ bodyEncoding: 'none',
499
+ body,
500
+ byteLength: new TextEncoder().encode(body).byteLength,
501
+ };
502
+ }
503
+ function collectResponseHeaders(headers) {
504
+ const result = {};
505
+ headers.forEach((value, key) => {
506
+ const lower = key.toLowerCase();
507
+ if (HOP_BY_HOP_HEADERS.has(lower))
508
+ return;
509
+ result[lower] = value;
510
+ });
511
+ return result;
512
+ }
513
+ function encodeResponseBody(buffer, headers) {
514
+ if (buffer.byteLength === 0)
515
+ return { encoding: 'none' };
516
+ const contentType = headers['content-type'] ?? '';
517
+ if (isTextContentType(contentType)) {
518
+ return { body: new TextDecoder('utf-8', { fatal: false }).decode(buffer), encoding: 'none' };
519
+ }
520
+ return { body: uint8ArrayToBase64(new Uint8Array(buffer)), encoding: 'base64' };
521
+ }
522
+ function base64ToUint8Array(base64) {
523
+ const normalized = base64.replace(/-/g, '+').replace(/_/g, '/');
524
+ const padLength = (4 - (normalized.length % 4)) % 4;
525
+ const padded = normalized + '='.repeat(padLength);
526
+ if (typeof atob === 'function') {
527
+ const binaryString = atob(padded);
528
+ const bytes = new Uint8Array(binaryString.length);
529
+ for (let i = 0; i < binaryString.length; i += 1) {
530
+ bytes[i] = binaryString.charCodeAt(i);
531
+ }
532
+ return bytes;
533
+ }
534
+ const BufferCtor = globalThis.Buffer;
535
+ if (typeof BufferCtor === 'function') {
536
+ const binary = BufferCtor.from(padded, 'base64');
537
+ return new Uint8Array(binary.buffer, binary.byteOffset, binary.byteLength);
538
+ }
539
+ throw new Error('No base64 decoder available in this runtime');
540
+ }
541
+ function uint8ArrayToBase64(bytes) {
542
+ const BufferCtor = globalThis.Buffer;
543
+ if (typeof BufferCtor === 'function') {
544
+ return BufferCtor.from(bytes.buffer, bytes.byteOffset, bytes.byteLength).toString('base64');
545
+ }
546
+ let binary = '';
547
+ for (let i = 0; i < bytes.length; i += 1) {
548
+ binary += String.fromCharCode(bytes[i]);
549
+ }
550
+ if (typeof btoa === 'function') {
551
+ return btoa(binary);
552
+ }
553
+ throw new Error('No base64 encoder available in this runtime');
554
+ }
555
+ function isTextContentType(contentType) {
556
+ const lower = contentType.toLowerCase();
557
+ return (lower.startsWith('text/')
558
+ || lower.startsWith('application/json')
559
+ || lower.startsWith('application/xml')
560
+ || lower.includes('+json')
561
+ || lower.includes('+xml')
562
+ || lower.startsWith('application/javascript'));
563
+ }
564
+ //# sourceMappingURL=http-forwarder.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"http-forwarder.js","sourceRoot":"","sources":["../../src/bridge/http-forwarder.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,57 @@
1
+ /**
2
+ * plat HTTP⇄WebRTC bridge.
3
+ *
4
+ * Registers with an MQTT signaling topic like a regular `css://` server,
5
+ * but every inbound `PLAT_REQUEST` is forwarded to a configured upstream
6
+ * HTTP server on the same LAN. Responses are shipped back as
7
+ * `PLAT_RESPONSE` messages on the same data channel.
8
+ */
9
+ import { type ClientSideServerMQTTWebRTCOptions, type ClientSideServerWorkerInfo } from '../client-side-server/mqtt-webrtc';
10
+ import type { ClientSideServerInstanceInfo } from '../client-side-server/protocol';
11
+ export { createHTTPForwarder, type HTTPForwarderOptions } from './http-forwarder';
12
+ export interface PLATHTTPBridgeOptions extends ClientSideServerMQTTWebRTCOptions {
13
+ /** css:// name the bridge registers as (e.g. "my-api" or "authority.com/my-api"). */
14
+ name: string;
15
+ /** Base URL of the upstream HTTP server the bridge forwards to. */
16
+ upstream?: string;
17
+ /**
18
+ * How the bridge chooses the upstream origin.
19
+ * - `fixed`: always use `upstream`
20
+ * - `request-origin`: use the requestOrigin sent by the caller
21
+ * - `intercept-origin`: use the intercepted origin sent by the caller
22
+ */
23
+ upstreamMode?: 'fixed' | 'request-origin' | 'intercept-origin';
24
+ /**
25
+ * How forwarded paths are resolved against upstream base.
26
+ * - `origin-root`: standard browser semantics for leading-slash paths
27
+ * - `route-base`: prefix leading-slash paths with intercepted route base
28
+ */
29
+ pathBaseMode?: 'origin-root' | 'route-base';
30
+ /** Optional logger for lifecycle and per-request bridge activity. */
31
+ logger?: (...args: unknown[]) => void;
32
+ /** Label used in X-Forwarded-By / Forwarded by=. Defaults to `name`. */
33
+ bridgeName?: string;
34
+ /** If true, append to a client-supplied X-Forwarded-For rather than overwrite. */
35
+ trustClientForwarded?: boolean;
36
+ /** If true, skip all X-Forwarded-* / Forwarded header injection. */
37
+ disableForwardedHeaders?: boolean;
38
+ /** Optional method allowlist (e.g. ['GET', 'POST']); others return 405. */
39
+ allowMethods?: string[];
40
+ /** Optional path allowlist (regex or string → regex); non-matching return 403. */
41
+ allowPaths?: (RegExp | string)[];
42
+ /** Optional overrides for the announced instanceInfo. */
43
+ instanceInfo?: ClientSideServerInstanceInfo;
44
+ /** Optional load-balancing worker info. */
45
+ workerInfo?: ClientSideServerWorkerInfo;
46
+ /** Override fetch (e.g. for tests). */
47
+ fetchImpl?: typeof fetch;
48
+ /** Upstream request timeout, ms. Default 30s. */
49
+ requestTimeoutMs?: number;
50
+ }
51
+ export interface PLATHTTPBridge {
52
+ readonly cssUrl: string;
53
+ start(): Promise<void>;
54
+ stop(): Promise<void>;
55
+ }
56
+ export declare function createHTTPBridge(options: PLATHTTPBridgeOptions): PLATHTTPBridge;
57
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/bridge/index.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AACH,OAAO,EAEL,KAAK,iCAAiC,EAEtC,KAAK,0BAA0B,EAChC,MAAM,mCAAmC,CAAA;AAC1C,OAAO,KAAK,EAAE,4BAA4B,EAAE,MAAM,gCAAgC,CAAA;AAMlF,OAAO,EAAE,mBAAmB,EAAE,KAAK,oBAAoB,EAAE,MAAM,kBAAkB,CAAA;AAEjF,MAAM,WAAW,qBAAsB,SAAQ,iCAAiC;IAC9E,qFAAqF;IACrF,IAAI,EAAE,MAAM,CAAA;IACZ,mEAAmE;IACnE,QAAQ,CAAC,EAAE,MAAM,CAAA;IACjB;;;;;OAKG;IACH,YAAY,CAAC,EAAE,OAAO,GAAG,gBAAgB,GAAG,kBAAkB,CAAA;IAC9D;;;;OAIG;IACH,YAAY,CAAC,EAAE,aAAa,GAAG,YAAY,CAAA;IAC3C,qEAAqE;IACrE,MAAM,CAAC,EAAE,CAAC,GAAG,IAAI,EAAE,OAAO,EAAE,KAAK,IAAI,CAAA;IACrC,wEAAwE;IACxE,UAAU,CAAC,EAAE,MAAM,CAAA;IACnB,kFAAkF;IAClF,oBAAoB,CAAC,EAAE,OAAO,CAAA;IAC9B,oEAAoE;IACpE,uBAAuB,CAAC,EAAE,OAAO,CAAA;IACjC,2EAA2E;IAC3E,YAAY,CAAC,EAAE,MAAM,EAAE,CAAA;IACvB,kFAAkF;IAClF,UAAU,CAAC,EAAE,CAAC,MAAM,GAAG,MAAM,CAAC,EAAE,CAAA;IAChC,yDAAyD;IACzD,YAAY,CAAC,EAAE,4BAA4B,CAAA;IAC3C,2CAA2C;IAC3C,UAAU,CAAC,EAAE,0BAA0B,CAAA;IACvC,uCAAuC;IACvC,SAAS,CAAC,EAAE,OAAO,KAAK,CAAA;IACxB,iDAAiD;IACjD,gBAAgB,CAAC,EAAE,MAAM,CAAA;CAC1B;AAED,MAAM,WAAW,cAAc;IAC7B,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAA;IACvB,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC,CAAA;IACtB,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC,CAAA;CACtB;AAED,wBAAgB,gBAAgB,CAAC,OAAO,EAAE,qBAAqB,GAAG,cAAc,CAyE/E"}