edgeaegis 2026.10.1

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 (158) hide show
  1. package/LICENSE +202 -0
  2. package/NOTICE +10 -0
  3. package/README.md +215 -0
  4. package/config.yml +29 -0
  5. package/origin/cloudflare/app/config.yml +2 -0
  6. package/origin/cloudflare/app/index.js +4 -0
  7. package/origin/edgeone/app/config.yml +2 -0
  8. package/origin/edgeone/app/index.js +4 -0
  9. package/origin/esa/app/config.yml +2 -0
  10. package/origin/esa/app/index.js +4 -0
  11. package/origin/netlify/app/config.yml +2 -0
  12. package/origin/netlify/app/index.js +4 -0
  13. package/origin/vercel/app/config.yml +2 -0
  14. package/origin/vercel/app/index.js +4 -0
  15. package/package.json +123 -0
  16. package/respond/403.html +2 -0
  17. package/respond/403.json +1 -0
  18. package/rules/allowlist.yml +2 -0
  19. package/rules/emergency.conf +4 -0
  20. package/rules/local.conf +2 -0
  21. package/rules/seclang-bundle.json +360 -0
  22. package/rules/seclang-upstreams.json +14 -0
  23. package/rules/setup.conf +15 -0
  24. package/secret/credentials.example.yml +7 -0
  25. package/secret/relay-server.example.yml +10 -0
  26. package/tools/.build/scr/adapters/cloudflare/runtime.d.ts +18 -0
  27. package/tools/.build/scr/adapters/cloudflare/runtime.js +16 -0
  28. package/tools/.build/scr/adapters/cloudflare/runtime.js.map +1 -0
  29. package/tools/.build/scr/adapters/cloudflare/worker.js +25 -0
  30. package/tools/.build/scr/adapters/edgeone/worker.js +7 -0
  31. package/tools/.build/scr/adapters/esa/worker.js +5 -0
  32. package/tools/.build/scr/adapters/forward.d.ts +4 -0
  33. package/tools/.build/scr/adapters/forward.js +25 -0
  34. package/tools/.build/scr/adapters/forward.js.map +1 -0
  35. package/tools/.build/scr/adapters/handler.js +39 -0
  36. package/tools/.build/scr/adapters/ingress.d.ts +10 -0
  37. package/tools/.build/scr/adapters/ingress.js +62 -0
  38. package/tools/.build/scr/adapters/ingress.js.map +1 -0
  39. package/tools/.build/scr/adapters/netlify/worker.js +7 -0
  40. package/tools/.build/scr/adapters/runtime.d.ts +33 -0
  41. package/tools/.build/scr/adapters/runtime.js +50 -0
  42. package/tools/.build/scr/adapters/runtime.js.map +1 -0
  43. package/tools/.build/scr/adapters/vercel/worker.js +7 -0
  44. package/tools/.build/scr/cli/config.d.ts +2 -0
  45. package/tools/.build/scr/cli/config.js +23 -0
  46. package/tools/.build/scr/cli/config.js.map +1 -0
  47. package/tools/.build/scr/cli/deployment.d.ts +15 -0
  48. package/tools/.build/scr/cli/deployment.js +108 -0
  49. package/tools/.build/scr/cli/deployment.js.map +1 -0
  50. package/tools/.build/scr/cli/init.d.ts +2 -0
  51. package/tools/.build/scr/cli/init.js +62 -0
  52. package/tools/.build/scr/cli/init.js.map +1 -0
  53. package/tools/.build/scr/cli/main.d.ts +2 -0
  54. package/tools/.build/scr/cli/main.js +99 -0
  55. package/tools/.build/scr/cli/main.js.map +1 -0
  56. package/tools/.build/scr/cli/relay-serve.d.ts +1 -0
  57. package/tools/.build/scr/cli/relay-serve.js +48 -0
  58. package/tools/.build/scr/cli/relay-serve.js.map +1 -0
  59. package/tools/.build/scr/cli/responses.d.ts +2 -0
  60. package/tools/.build/scr/cli/responses.js +31 -0
  61. package/tools/.build/scr/cli/responses.js.map +1 -0
  62. package/tools/.build/scr/cli/serve.d.ts +1 -0
  63. package/tools/.build/scr/cli/serve.js +132 -0
  64. package/tools/.build/scr/cli/serve.js.map +1 -0
  65. package/tools/.build/scr/config.d.ts +39 -0
  66. package/tools/.build/scr/config.js +89 -0
  67. package/tools/.build/scr/config.js.map +1 -0
  68. package/tools/.build/scr/core/types.d.ts +27 -0
  69. package/tools/.build/scr/core/types.js +34 -0
  70. package/tools/.build/scr/core/types.js.map +1 -0
  71. package/tools/.build/scr/core/version.d.ts +1 -0
  72. package/tools/.build/scr/core/version.js +3 -0
  73. package/tools/.build/scr/core/version.js.map +1 -0
  74. package/tools/.build/scr/http-boundary/index.d.ts +19 -0
  75. package/tools/.build/scr/http-boundary/index.js +173 -0
  76. package/tools/.build/scr/http-boundary/index.js.map +1 -0
  77. package/tools/.build/scr/http-boundary/json.d.ts +2 -0
  78. package/tools/.build/scr/http-boundary/json.js +90 -0
  79. package/tools/.build/scr/http-boundary/json.js.map +1 -0
  80. package/tools/.build/scr/origin/relay.d.ts +20 -0
  81. package/tools/.build/scr/origin/relay.js +221 -0
  82. package/tools/.build/scr/origin/relay.js.map +1 -0
  83. package/tools/.build/scr/origin/replay-node.d.ts +8 -0
  84. package/tools/.build/scr/origin/replay-node.js +36 -0
  85. package/tools/.build/scr/origin/replay-node.js.map +1 -0
  86. package/tools/.build/scr/origin/types.d.ts +18 -0
  87. package/tools/.build/scr/origin/types.js +2 -0
  88. package/tools/.build/scr/origin/types.js.map +1 -0
  89. package/tools/.build/scr/runtime/allowlist.d.ts +21 -0
  90. package/tools/.build/scr/runtime/allowlist.js +84 -0
  91. package/tools/.build/scr/runtime/allowlist.js.map +1 -0
  92. package/tools/.build/scr/runtime/browser-cache.d.ts +7 -0
  93. package/tools/.build/scr/runtime/browser-cache.js +50 -0
  94. package/tools/.build/scr/runtime/browser-cache.js.map +1 -0
  95. package/tools/.build/scr/runtime/error-pages.d.ts +10 -0
  96. package/tools/.build/scr/runtime/error-pages.js +72 -0
  97. package/tools/.build/scr/runtime/error-pages.js.map +1 -0
  98. package/tools/.build/scr/runtime/index.d.ts +54 -0
  99. package/tools/.build/scr/runtime/index.js +355 -0
  100. package/tools/.build/scr/runtime/index.js.map +1 -0
  101. package/tools/.build/scr/runtime/node.d.ts +3 -0
  102. package/tools/.build/scr/runtime/node.js +97 -0
  103. package/tools/.build/scr/runtime/node.js.map +1 -0
  104. package/tools/.build/scr/runtime/proxy.d.ts +12 -0
  105. package/tools/.build/scr/runtime/proxy.js +177 -0
  106. package/tools/.build/scr/runtime/proxy.js.map +1 -0
  107. package/tools/.build/scr/runtime/stream.d.ts +8 -0
  108. package/tools/.build/scr/runtime/stream.js +72 -0
  109. package/tools/.build/scr/runtime/stream.js.map +1 -0
  110. package/tools/.build/scr/seclang/body.d.ts +13 -0
  111. package/tools/.build/scr/seclang/body.js +109 -0
  112. package/tools/.build/scr/seclang/body.js.map +1 -0
  113. package/tools/.build/scr/seclang/bytes.d.ts +5 -0
  114. package/tools/.build/scr/seclang/bytes.js +38 -0
  115. package/tools/.build/scr/seclang/bytes.js.map +1 -0
  116. package/tools/.build/scr/seclang/index.d.ts +166 -0
  117. package/tools/.build/scr/seclang/index.js +1519 -0
  118. package/tools/.build/scr/seclang/index.js.map +1 -0
  119. package/tools/.build/scr/seclang/json.d.ts +2 -0
  120. package/tools/.build/scr/seclang/json.js +87 -0
  121. package/tools/.build/scr/seclang/json.js.map +1 -0
  122. package/tools/.build/scr/seclang/libinjection.d.ts +9 -0
  123. package/tools/.build/scr/seclang/libinjection.js +59 -0
  124. package/tools/.build/scr/seclang/libinjection.js.map +1 -0
  125. package/tools/.build/scr/seclang/node.d.ts +22 -0
  126. package/tools/.build/scr/seclang/node.js +113 -0
  127. package/tools/.build/scr/seclang/node.js.map +1 -0
  128. package/tools/.build/scr/seclang/pcre2.d.ts +23 -0
  129. package/tools/.build/scr/seclang/pcre2.js +153 -0
  130. package/tools/.build/scr/seclang/pcre2.js.map +1 -0
  131. package/tools/.build/scr/seclang/sources.d.ts +6 -0
  132. package/tools/.build/scr/seclang/sources.js +59 -0
  133. package/tools/.build/scr/seclang/sources.js.map +1 -0
  134. package/tools/.build/scr/seclang/state.d.ts +17 -0
  135. package/tools/.build/scr/seclang/state.js +53 -0
  136. package/tools/.build/scr/seclang/state.js.map +1 -0
  137. package/tools/.build/scr/seclang/syntax.d.ts +9 -0
  138. package/tools/.build/scr/seclang/syntax.js +74 -0
  139. package/tools/.build/scr/seclang/syntax.js.map +1 -0
  140. package/tools/.build/scr/seclang/transforms.d.ts +3 -0
  141. package/tools/.build/scr/seclang/transforms.js +157 -0
  142. package/tools/.build/scr/seclang/transforms.js.map +1 -0
  143. package/tools/.build/scr/seclang/unicode.d.ts +2 -0
  144. package/tools/.build/scr/seclang/unicode.js +19 -0
  145. package/tools/.build/scr/seclang/unicode.js.map +1 -0
  146. package/tools/.build/scr/seclang/vendor/LIBINJECTION-LICENSE +33 -0
  147. package/tools/.build/scr/seclang/vendor/PCRE2-NOTICE +47 -0
  148. package/tools/.build/scr/seclang/vendor/PCRE2-WRAPPER-LICENSE +21 -0
  149. package/tools/.build/scr/seclang/vendor/UNICODE-DATA-NOTICE +6 -0
  150. package/tools/.build/scr/seclang/vendor/libinjection.json +7 -0
  151. package/tools/.build/scr/seclang/vendor/libinjection.wasm +0 -0
  152. package/tools/.build/scr/seclang/vendor/pcre2.json +7 -0
  153. package/tools/.build/scr/seclang/vendor/pcre2.wasm +0 -0
  154. package/tools/.build/scr/seclang/vendor/unicode.json +378 -0
  155. package/tools/build-platform.mjs +199 -0
  156. package/tools/platform-command.mjs +59 -0
  157. package/tools/sync-native-seclang.mjs +155 -0
  158. package/tools/verify-full-crs.mjs +118 -0
@@ -0,0 +1,355 @@
1
+ import { digest, requireInteger, ShieldError, stableJson, } from "../core/types.js";
2
+ import { canonicalPath, checkBoundary, limitsWith, readBody, } from "../http-boundary/index.js";
3
+ import { parseStrictJson } from "../http-boundary/json.js";
4
+ import { compileSecLang, executeSecLang } from "../seclang/index.js";
5
+ import { createAllowlist } from "./allowlist.js";
6
+ import { validateBrowserCache } from "./browser-cache.js";
7
+ import { createErrorPages } from "./error-pages.js";
8
+ import { createProxy } from "./proxy.js";
9
+ export async function createShield(input) {
10
+ // Capture immutable policy and config; callers cannot mutate enforcement after validation.
11
+ const options = {
12
+ ...input,
13
+ routes: structuredClone(input.routes),
14
+ publicHosts: [...input.publicHosts],
15
+ allowlist: structuredClone(input.allowlist ?? []),
16
+ };
17
+ if (!/^[A-Za-z0-9_-]{1,64}$/.test(options.tenant) ||
18
+ !/^[A-Za-z0-9_-]{1,64}$/.test(options.service))
19
+ throw new Error("Invalid tenant/service");
20
+ if (typeof input.secLang !== "string" || !input.secLang.trim())
21
+ throw new Error("Native secLang input is required");
22
+ const version = await digest(stableJson({
23
+ source: input.secLang,
24
+ files: input.secLangOptions?.files ?? {},
25
+ phraseFiles: input.secLangOptions?.phraseFiles ?? {},
26
+ fileName: input.secLangOptions?.fileName ?? "main.conf",
27
+ allowlist: options.allowlist,
28
+ }));
29
+ const proxies = new Map();
30
+ for (const [name, origin] of Object.entries(options.origins)) {
31
+ if (!/^[A-Za-z0-9][A-Za-z0-9_-]{0,63}$/.test(name))
32
+ throw new Error("Invalid business name");
33
+ proxies.set(name, createProxy(origin));
34
+ }
35
+ if (!proxies.size)
36
+ throw new Error("At least one business origin is required");
37
+ const errorPages = createErrorPages(options.errorPages ?? {});
38
+ const limits = limitsWith(options.limits);
39
+ const maxConcurrent = requireInteger(options.maxConcurrentRequests ?? 64, 1, 10000, "max concurrent requests");
40
+ const now = options.now ?? Date.now;
41
+ const stats = {
42
+ requests: 0,
43
+ ruleEvaluations: 0,
44
+ blocked: 0,
45
+ originRequests: 0,
46
+ eventFailures: 0,
47
+ };
48
+ const routes = new Map();
49
+ for (const route of options.routes) {
50
+ validateBrowserCache(route.browserCache);
51
+ if (route.browserCache && (route.authenticated || route.websocket))
52
+ throw new Error("Browser caching requires an anonymous HTTP route");
53
+ if (typeof route.authenticated !== "boolean" ||
54
+ !proxies.has(route.business) ||
55
+ (route.websocket !== undefined && typeof route.websocket !== "boolean") ||
56
+ !Array.isArray(route.methods) ||
57
+ ![undefined, "none", "json", "text"].includes(route.body))
58
+ throw new Error("Routes require a configured business, explicit authenticated boolean, methods and a supported body profile");
59
+ if (canonicalPath(route.path) !== route.path ||
60
+ routes.has(route.path) ||
61
+ !route.methods.length ||
62
+ route.methods.some((m) => !/^[A-Z]{1,20}$/.test(m) || ["CONNECT", "TRACE"].includes(m)))
63
+ throw new Error("Invalid/duplicate route");
64
+ routes.set(route.path, route);
65
+ }
66
+ let active = 0;
67
+ const isAllowlisted = createAllowlist(options.allowlist);
68
+ const nativeProgram = input.secLang
69
+ ? compileSecLang(input.secLang, {
70
+ ...input.secLangOptions,
71
+ requestBodyLimit: limits.maxBodyBytes,
72
+ now,
73
+ strict: true,
74
+ })
75
+ : undefined;
76
+ if (nativeProgram && !nativeProgram.supportedRules) {
77
+ nativeProgram.dispose();
78
+ throw new Error("SecLang ruleset is empty or unsupported");
79
+ }
80
+ let disposed = false;
81
+ async function handle(request, context, rawTarget, hooks = {}) {
82
+ const emit = (kind, source, reason, ruleId) => {
83
+ const event = {
84
+ id: crypto.randomUUID(),
85
+ tenant: options.tenant,
86
+ at: now(),
87
+ kind,
88
+ source,
89
+ reason,
90
+ policy: version,
91
+ };
92
+ if (ruleId)
93
+ event.ruleId = ruleId;
94
+ for (const listener of [options.event, hooks.event])
95
+ try {
96
+ listener?.(event);
97
+ }
98
+ catch {
99
+ stats.eventFailures++;
100
+ }
101
+ };
102
+ const denied = (request, status, source, reason, ruleId) => {
103
+ stats.blocked++;
104
+ emit("block", source, reason, ruleId);
105
+ return (errorPages(request, status) ??
106
+ Response.json({ error: "request_rejected", reason }, { status, headers: { "cache-control": "no-store", "x-content-type-options": "nosniff" } }));
107
+ };
108
+ context = structuredClone(context);
109
+ stats.requests++;
110
+ if (disposed)
111
+ return denied(request, 503, "boundary", "engine-closed");
112
+ if (active >= maxConcurrent)
113
+ return denied(request, 503, "boundary", "concurrency-capacity");
114
+ active++;
115
+ let released = false;
116
+ const release = () => {
117
+ if (!released) {
118
+ active--;
119
+ if (disposed && active === 0)
120
+ nativeProgram?.dispose();
121
+ released = true;
122
+ }
123
+ };
124
+ let streaming = false;
125
+ let pendingUpgrade;
126
+ let source = "boundary";
127
+ try {
128
+ if (context.tenant !== options.tenant)
129
+ throw new ShieldError("tenant-mismatch", 403);
130
+ if (context.identity !== undefined &&
131
+ (context.identity.length === 0 || context.identity.length > 256))
132
+ throw new ShieldError("invalid-trusted-identity", 403);
133
+ if (context.verifiedClientIp !== undefined &&
134
+ (context.verifiedClientIp.length > 64 || !/^[0-9a-fA-F:.]+$/.test(context.verifiedClientIp)))
135
+ throw new ShieldError("invalid-verified-ip", 403);
136
+ const upgrade = request.headers.has("upgrade");
137
+ const { url, path } = checkBoundary(request, limits, options.publicHosts, rawTarget, upgrade ? "websocket" : "http");
138
+ source = "route";
139
+ const route = routes.get(path);
140
+ if (!route)
141
+ throw new ShieldError("unknown-route", 404);
142
+ if (!route.methods.includes(request.method))
143
+ throw new ShieldError("method-not-allowed", 405);
144
+ if (upgrade && !route.websocket)
145
+ throw new ShieldError("websocket-route-required", 426);
146
+ source = "identity";
147
+ if (route.authenticated && !context.identity)
148
+ throw new ShieldError("authentication-required", 401);
149
+ source = "boundary";
150
+ const body = await readBody(request, limits);
151
+ const contentType = (request.headers.get("content-type") ?? "")
152
+ .split(";")[0]
153
+ .trim()
154
+ .toLowerCase();
155
+ if (contentType === "application/grpc" || contentType.startsWith("application/grpc+"))
156
+ throw new ShieldError("native-grpc-requires-http2-ingress", 501);
157
+ if ((route.body ?? "none") === "none" && body.length)
158
+ throw new ShieldError("body-not-allowed");
159
+ let bodyText = "";
160
+ if (body.length && route.body === "json") {
161
+ try {
162
+ bodyText = new TextDecoder("utf-8", { fatal: true }).decode(body);
163
+ }
164
+ catch {
165
+ throw new ShieldError("invalid-utf8-body");
166
+ }
167
+ }
168
+ if (body.length && route.body === "json") {
169
+ if (!/^application\/json(?:\s*;\s*charset=utf-8)?$/i.test(request.headers.get("content-type") ?? ""))
170
+ throw new ShieldError("json-content-type-required", 415);
171
+ parseStrictJson(bodyText);
172
+ }
173
+ const nativeInput = {
174
+ url: url.href,
175
+ method: request.method,
176
+ headers: request.headers,
177
+ bodyText,
178
+ bodyBytes: body,
179
+ protocol: context.httpProtocol,
180
+ remoteAddr: context.verifiedClientIp,
181
+ rawTarget,
182
+ };
183
+ const skipNativeRule = options.allowlist.length
184
+ ? (id) => isAllowlisted(path, request.method, context, id, now()) ||
185
+ isAllowlisted(path, request.method, context, `sec-${id}`, now())
186
+ : undefined;
187
+ let nativeTransaction;
188
+ if (nativeProgram) {
189
+ // Native SecLang runs AFTER route/auth/body limits and BEFORE origin forwarding.
190
+ // Rejections are final; unsupported directives have already failed at configuration load.
191
+ const native = executeSecLang(nativeProgram, nativeInput, {
192
+ shouldSkip: skipNativeRule,
193
+ });
194
+ stats.ruleEvaluations += nativeProgram.supportedRules;
195
+ nativeTransaction = native.transaction;
196
+ if (native.blocked) {
197
+ executeSecLang(nativeProgram, { ...nativeInput, responseStatus: native.status }, {
198
+ phases: [5],
199
+ transaction: nativeTransaction,
200
+ shouldSkip: skipNativeRule,
201
+ });
202
+ return denied(request, native.status, "rule", "seclang-native-rule-match", native.matched.at(-1) ? `sec-${native.matched.at(-1)}` : undefined);
203
+ }
204
+ if (native.transaction.bodyParseError) {
205
+ executeSecLang(nativeProgram, { ...nativeInput, responseStatus: 400 }, { phases: [5], transaction: native.transaction, shouldSkip: skipNativeRule });
206
+ return denied(request, 400, "boundary", "invalid-request-body");
207
+ }
208
+ for (const event of native.events)
209
+ if (event.log)
210
+ emit("detect", "rule", "seclang-native-observed", `sec-${event.id}`);
211
+ }
212
+ source = "proxy";
213
+ stats.originRequests++;
214
+ const inspectResponse = nativeProgram?.instructions.some((rule) => "actions" in rule && Number(rule.actions.phase) >= 3);
215
+ let response = await proxies.get(route.business)(request, url, path, body, inspectResponse ? () => { } : release, upgrade, context.identity ? undefined : route.browserCache);
216
+ if (response.status === 101)
217
+ pendingUpgrade = response;
218
+ if (nativeProgram && inspectResponse && nativeTransaction) {
219
+ const responseInput = {
220
+ ...nativeInput,
221
+ responseStatus: response.status,
222
+ responseHeaders: response.headers,
223
+ };
224
+ const headersResult = executeSecLang(nativeProgram, responseInput, {
225
+ phases: [3],
226
+ transaction: nativeTransaction,
227
+ shouldSkip: skipNativeRule,
228
+ });
229
+ if (headersResult.blocked) {
230
+ closeUpgrade(response);
231
+ await response.body?.cancel();
232
+ executeSecLang(nativeProgram, responseInput, {
233
+ phases: [5],
234
+ transaction: nativeTransaction,
235
+ shouldSkip: skipNativeRule,
236
+ });
237
+ return denied(request, headersResult.status, "rule", "seclang-response-rule-match", `sec-${headersResult.matched.at(-1)}`);
238
+ }
239
+ const inspectBody = nativeProgram.instructions.some((rule) => "actions" in rule && rule.actions.phase === 4);
240
+ if (response.status === 101) {
241
+ const result = executeSecLang(nativeProgram, { ...responseInput, responseBodyBytes: new Uint8Array() }, {
242
+ phases: [4, 5],
243
+ transaction: nativeTransaction,
244
+ shouldSkip: skipNativeRule,
245
+ });
246
+ if (result.blocked) {
247
+ closeUpgrade(response);
248
+ return denied(request, result.status, "rule", "seclang-response-rule-match", `sec-${result.matched.at(-1)}`);
249
+ }
250
+ emit("allow", "proxy", "websocket-handshake-forwarded");
251
+ pendingUpgrade = undefined;
252
+ return response;
253
+ }
254
+ const bytes = inspectBody && response.body ? new Uint8Array(await response.arrayBuffer()) : undefined;
255
+ const bodyResult = executeSecLang(nativeProgram, { ...responseInput, ...(bytes ? { responseBodyBytes: bytes } : {}) }, {
256
+ phases: inspectBody ? [4, 5] : [5],
257
+ transaction: nativeTransaction,
258
+ shouldSkip: skipNativeRule,
259
+ });
260
+ if (bodyResult.blocked) {
261
+ if (!bytes)
262
+ await response.body?.cancel();
263
+ return denied(request, bodyResult.status, "rule", "seclang-response-rule-match", `sec-${bodyResult.matched.at(-1)}`);
264
+ }
265
+ if (bytes) {
266
+ let sent = false;
267
+ const stream = new ReadableStream({
268
+ pull(controller) {
269
+ if (!sent && bytes.length) {
270
+ sent = true;
271
+ controller.enqueue(bytes);
272
+ }
273
+ else {
274
+ release();
275
+ controller.close();
276
+ }
277
+ },
278
+ cancel() {
279
+ release();
280
+ },
281
+ }, { highWaterMark: 0 });
282
+ response = new Response(stream, {
283
+ status: response.status,
284
+ statusText: response.statusText,
285
+ headers: response.headers,
286
+ });
287
+ }
288
+ else if (response.body) {
289
+ const reader = response.body.getReader();
290
+ response = new Response(new ReadableStream({
291
+ async pull(controller) {
292
+ try {
293
+ const item = await reader.read();
294
+ if (item.done) {
295
+ release();
296
+ controller.close();
297
+ }
298
+ else
299
+ controller.enqueue(item.value);
300
+ }
301
+ catch (error) {
302
+ release();
303
+ controller.error(error);
304
+ }
305
+ },
306
+ async cancel(reason) {
307
+ try {
308
+ await reader.cancel(reason);
309
+ }
310
+ finally {
311
+ release();
312
+ }
313
+ },
314
+ }, { highWaterMark: 0 }), { status: response.status, statusText: response.statusText, headers: response.headers });
315
+ }
316
+ }
317
+ streaming = response.body !== null;
318
+ emit("allow", "proxy", "forwarded");
319
+ pendingUpgrade = undefined;
320
+ return response;
321
+ }
322
+ catch (error) {
323
+ if (error instanceof ShieldError)
324
+ return denied(request, error.status, source, error.code);
325
+ emit("error", source, "internal-error");
326
+ return denied(request, 500, source, "internal-error");
327
+ }
328
+ finally {
329
+ if (pendingUpgrade)
330
+ closeUpgrade(pendingUpgrade);
331
+ if (!streaming)
332
+ release();
333
+ }
334
+ }
335
+ return {
336
+ handle: (request, context, rawTarget, hooks) => handle(request, context, rawTarget, hooks),
337
+ version,
338
+ dispose() {
339
+ disposed = true;
340
+ if (active === 0)
341
+ nativeProgram?.dispose();
342
+ },
343
+ stats,
344
+ };
345
+ }
346
+ function closeUpgrade(response) {
347
+ const socket = response.webSocket;
348
+ try {
349
+ socket?.close(1008, "Handshake rejected");
350
+ }
351
+ catch {
352
+ /* Already closed. */
353
+ }
354
+ }
355
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../scr/runtime/index.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import { type IncomingMessage, type ServerResponse } from "node:http";
2
+ /** Node-only transport; the engine itself imports no Node API. Never trusts X-Forwarded-For. */
3
+ export declare function createNodeServer(handler: (request: Request, incoming: IncomingMessage) => Promise<Response>, publicHost: string | (() => string)): import("node:http").Server<typeof IncomingMessage, typeof ServerResponse>;
@@ -0,0 +1,97 @@
1
+ import { createServer } from "node:http";
2
+ import { Readable } from "node:stream";
3
+ import { canonicalPath, checkRawHeaders } from "../http-boundary/index.js";
4
+ /** Node-only transport; the engine itself imports no Node API. Never trusts X-Forwarded-For. */
5
+ export function createNodeServer(handler, publicHost) {
6
+ const server = createServer({
7
+ maxHeaderSize: 16384,
8
+ insecureHTTPParser: false,
9
+ requestTimeout: 15000,
10
+ headersTimeout: 10000,
11
+ keepAliveTimeout: 5000,
12
+ }, async (incoming, outgoing) => {
13
+ const abort = new AbortController();
14
+ incoming.on("aborted", () => abort.abort());
15
+ outgoing.on("close", () => {
16
+ if (!outgoing.writableFinished)
17
+ abort.abort();
18
+ });
19
+ try {
20
+ const expectedHost = typeof publicHost === "string" ? publicHost : publicHost();
21
+ checkRawHeaders(incoming.rawHeaders);
22
+ canonicalPath(incoming.url ?? "");
23
+ if (incoming.headers.host !== expectedHost ||
24
+ !incoming.url?.startsWith("/") ||
25
+ incoming.url.startsWith("//"))
26
+ throw new Error("Invalid authority/target");
27
+ const headers = new Headers();
28
+ for (let i = 0; i < incoming.rawHeaders.length; i += 2)
29
+ headers.append(incoming.rawHeaders[i] ?? "", incoming.rawHeaders[i + 1] ?? "");
30
+ const init = {
31
+ method: incoming.method ?? "GET",
32
+ headers,
33
+ signal: abort.signal,
34
+ };
35
+ if (!["GET", "HEAD"].includes(init.method ?? "GET")) {
36
+ init.body = Readable.toWeb(incoming);
37
+ init.duplex = "half";
38
+ }
39
+ const request = new Request(`http://${expectedHost}${incoming.url}`, init);
40
+ const response = await handler(request, incoming);
41
+ if (!incoming.complete) {
42
+ outgoing.setHeader("connection", "close");
43
+ outgoing.once("finish", () => incoming.destroy());
44
+ }
45
+ outgoing.statusCode = response.status;
46
+ for (const [name, value] of response.headers)
47
+ if (name !== "set-cookie")
48
+ outgoing.setHeader(name, value);
49
+ const cookies = response.headers.getSetCookie();
50
+ if (cookies.length)
51
+ outgoing.setHeader("set-cookie", cookies);
52
+ if (!response.body) {
53
+ outgoing.end();
54
+ return;
55
+ }
56
+ const reader = response.body.getReader();
57
+ try {
58
+ while (true) {
59
+ const item = await reader.read();
60
+ if (item.done)
61
+ break;
62
+ if (!outgoing.write(item.value))
63
+ await new Promise((resolve, reject) => {
64
+ const done = () => {
65
+ outgoing.off("error", failed);
66
+ outgoing.off("close", failed);
67
+ resolve();
68
+ };
69
+ const failed = () => {
70
+ outgoing.off("drain", done);
71
+ reject(new Error("client-closed"));
72
+ };
73
+ outgoing.once("drain", done);
74
+ outgoing.once("error", failed);
75
+ outgoing.once("close", failed);
76
+ });
77
+ }
78
+ outgoing.end();
79
+ }
80
+ catch {
81
+ void reader.cancel().catch(() => { });
82
+ outgoing.destroy();
83
+ }
84
+ }
85
+ catch {
86
+ if (!outgoing.headersSent) {
87
+ outgoing.writeHead(400, { "content-type": "application/json", connection: "close" });
88
+ outgoing.end('{"error":"invalid_http_request"}');
89
+ }
90
+ else
91
+ outgoing.destroy();
92
+ }
93
+ });
94
+ server.maxConnections = 256;
95
+ return server;
96
+ }
97
+ //# sourceMappingURL=node.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"node.js","sourceRoot":"","sources":["../../../../scr/runtime/node.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,12 @@
1
+ import { type Fetch } from "../core/types.js";
2
+ import { type BrowserCachePolicy } from "./browser-cache.js";
3
+ export interface ProxyOptions {
4
+ origin: string;
5
+ allowedOrigins: readonly string[];
6
+ originToken: string;
7
+ timeoutMs?: number;
8
+ maxResponseBytes?: number;
9
+ allowLoopbackHttp?: boolean;
10
+ fetch?: Fetch;
11
+ }
12
+ export declare function createProxy(options: ProxyOptions): (incoming: Request, url: URL, path: string, body: Uint8Array, onComplete?: () => void, websocket?: boolean, browserCache?: BrowserCachePolicy) => Promise<Response>;