veryfront 0.1.754 → 0.1.756
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/esm/cli/auth/callback-server.d.ts +4 -1
- package/esm/cli/auth/callback-server.d.ts.map +1 -1
- package/esm/cli/auth/callback-server.js +52 -13
- package/esm/cli/auth/index.d.ts +1 -1
- package/esm/cli/auth/index.d.ts.map +1 -1
- package/esm/cli/auth/index.js +1 -1
- package/esm/cli/auth/login.d.ts +2 -0
- package/esm/cli/auth/login.d.ts.map +1 -1
- package/esm/cli/auth/login.js +18 -6
- package/esm/cli/commands/demo/demo.d.ts.map +1 -1
- package/esm/cli/commands/demo/demo.js +6 -7
- package/esm/deno.js +1 -1
- package/esm/src/agent/runtime/index.d.ts +3 -96
- package/esm/src/agent/runtime/index.d.ts.map +1 -1
- package/esm/src/agent/runtime/index.js +21 -341
- package/esm/src/agent/runtime/model-capabilities.d.ts +3 -0
- package/esm/src/agent/runtime/model-capabilities.d.ts.map +1 -0
- package/esm/src/agent/runtime/model-capabilities.js +18 -0
- package/esm/src/agent/runtime/runtime-tool-config.d.ts +14 -0
- package/esm/src/agent/runtime/runtime-tool-config.d.ts.map +1 -0
- package/esm/src/agent/runtime/runtime-tool-config.js +37 -0
- package/esm/src/agent/runtime/skill-policy-enforcement.d.ts +16 -0
- package/esm/src/agent/runtime/skill-policy-enforcement.d.ts.map +1 -0
- package/esm/src/agent/runtime/skill-policy-enforcement.js +55 -0
- package/esm/src/agent/runtime/tool-result-continuation.d.ts +34 -0
- package/esm/src/agent/runtime/tool-result-continuation.d.ts.map +1 -0
- package/esm/src/agent/runtime/tool-result-continuation.js +194 -0
- package/esm/src/agent/schemas/agent.schema.d.ts +7 -0
- package/esm/src/agent/schemas/agent.schema.d.ts.map +1 -1
- package/esm/src/agent/schemas/agent.schema.js +9 -3
- package/esm/src/agent/schemas/index.d.ts +1 -1
- package/esm/src/agent/schemas/index.d.ts.map +1 -1
- package/esm/src/agent/schemas/index.js +1 -1
- package/esm/src/cache/dependency-graph.d.ts +1 -0
- package/esm/src/cache/dependency-graph.d.ts.map +1 -1
- package/esm/src/cache/dependency-graph.js +7 -1
- package/esm/src/modules/server/module-batch-handler.d.ts.map +1 -1
- package/esm/src/modules/server/module-batch-handler.js +47 -35
- package/esm/src/modules/server/module-server.d.ts.map +1 -1
- package/esm/src/modules/server/module-server.js +31 -9
- package/esm/src/modules/server/rate-limiter.d.ts +3 -2
- package/esm/src/modules/server/rate-limiter.d.ts.map +1 -1
- package/esm/src/platform/adapters/base.d.ts +24 -3
- package/esm/src/platform/adapters/base.d.ts.map +1 -1
- package/esm/src/platform/adapters/base.js +15 -1
- package/esm/src/platform/adapters/runtime/bun/websocket-adapter.d.ts +2 -0
- package/esm/src/platform/adapters/runtime/bun/websocket-adapter.d.ts.map +1 -1
- package/esm/src/platform/adapters/runtime/bun/websocket-adapter.js +33 -1
- package/esm/src/platform/adapters/runtime/node/websocket-adapter.d.ts +1 -1
- package/esm/src/platform/adapters/runtime/node/websocket-adapter.d.ts.map +1 -1
- package/esm/src/platform/adapters/runtime/node/websocket-adapter.js +3 -10
- package/esm/src/proxy/handler.d.ts.map +1 -1
- package/esm/src/proxy/handler.js +25 -116
- package/esm/src/proxy/local-project-resolver.d.ts +18 -0
- package/esm/src/proxy/local-project-resolver.d.ts.map +1 -0
- package/esm/src/proxy/local-project-resolver.js +63 -0
- package/esm/src/proxy/proxy-token-resolution.d.ts +37 -0
- package/esm/src/proxy/proxy-token-resolution.d.ts.map +1 -0
- package/esm/src/proxy/proxy-token-resolution.js +51 -0
- package/esm/src/rendering/orchestrator/module-loader/index.d.ts +10 -0
- package/esm/src/rendering/orchestrator/module-loader/index.d.ts.map +1 -1
- package/esm/src/rendering/orchestrator/module-loader/index.js +23 -158
- package/esm/src/rendering/orchestrator/module-loader/module-persistence.d.ts +20 -0
- package/esm/src/rendering/orchestrator/module-loader/module-persistence.d.ts.map +1 -0
- package/esm/src/rendering/orchestrator/module-loader/module-persistence.js +80 -0
- package/esm/src/rendering/orchestrator/module-loader/module-transform-cache.d.ts +59 -0
- package/esm/src/rendering/orchestrator/module-loader/module-transform-cache.d.ts.map +1 -0
- package/esm/src/rendering/orchestrator/module-loader/module-transform-cache.js +97 -0
- package/esm/src/routing/api/handler.d.ts +2 -1
- package/esm/src/routing/api/handler.d.ts.map +1 -1
- package/esm/src/routing/api/handler.js +2 -1
- package/esm/src/routing/api/route-executor.d.ts +3 -0
- package/esm/src/routing/api/route-executor.d.ts.map +1 -1
- package/esm/src/routing/api/route-executor.js +28 -0
- package/esm/src/runtime/runtime-bridge.js +2 -2
- package/esm/src/security/http/base-handler.d.ts +3 -2
- package/esm/src/security/http/base-handler.d.ts.map +1 -1
- package/esm/src/security/http/base-handler.js +1 -1
- package/esm/src/security/sandbox/project-worker.d.ts +1 -0
- package/esm/src/security/sandbox/project-worker.d.ts.map +1 -1
- package/esm/src/security/sandbox/project-worker.js +17 -1
- package/esm/src/security/sandbox/worker-egress-guard.d.ts +15 -0
- package/esm/src/security/sandbox/worker-egress-guard.d.ts.map +1 -0
- package/esm/src/security/sandbox/worker-egress-guard.js +201 -0
- package/esm/src/security/sandbox/worker-permissions.d.ts +6 -2
- package/esm/src/security/sandbox/worker-permissions.d.ts.map +1 -1
- package/esm/src/security/sandbox/worker-permissions.js +34 -3
- package/esm/src/security/sandbox/worker-pool.d.ts +1 -1
- package/esm/src/security/sandbox/worker-pool.d.ts.map +1 -1
- package/esm/src/security/sandbox/worker-pool.js +35 -9
- package/esm/src/server/handlers/preview/hmr-client-manager.d.ts +3 -2
- package/esm/src/server/handlers/preview/hmr-client-manager.d.ts.map +1 -1
- package/esm/src/server/handlers/preview/hmr.handler.d.ts.map +1 -1
- package/esm/src/server/handlers/preview/hmr.handler.js +4 -1
- package/esm/src/server/handlers/request/api/api-handler-wrapper.js +1 -1
- package/esm/src/transforms/mdx/esm-module-loader/module-fetcher/http-fallback.d.ts +32 -0
- package/esm/src/transforms/mdx/esm-module-loader/module-fetcher/http-fallback.d.ts.map +1 -0
- package/esm/src/transforms/mdx/esm-module-loader/module-fetcher/http-fallback.js +27 -0
- package/esm/src/transforms/mdx/esm-module-loader/module-fetcher/import-rewriter.d.ts.map +1 -1
- package/esm/src/transforms/mdx/esm-module-loader/module-fetcher/import-rewriter.js +23 -3
- package/esm/src/transforms/mdx/esm-module-loader/module-fetcher/index.d.ts.map +1 -1
- package/esm/src/transforms/mdx/esm-module-loader/module-fetcher/index.js +32 -30
- package/esm/src/transforms/mdx/esm-module-loader/module-fetcher/persistence.d.ts +34 -0
- package/esm/src/transforms/mdx/esm-module-loader/module-fetcher/persistence.d.ts.map +1 -0
- package/esm/src/transforms/mdx/esm-module-loader/module-fetcher/persistence.js +30 -0
- package/esm/src/utils/version-constant.d.ts +1 -1
- package/esm/src/utils/version-constant.js +1 -1
- package/package.json +1 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"base.d.ts","sourceRoot":"","sources":["../../../../src/src/platform/adapters/base.ts"],"names":[],"mappings":"AAAA;;yBAEyB;AACzB,MAAM,MAAM,SAAS,GAAG,MAAM,GAAG,MAAM,GAAG,KAAK,GAAG,YAAY,GAAG,QAAQ,CAAC;AAE1E;;;;;GAKG;AACH,MAAM,WAAW,cAAc;IAC7B,yCAAyC;IACzC,QAAQ,CAAC,EAAE,EAAE,SAAS,CAAC;IAEvB,sCAAsC;IACtC,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IAEtB,iDAAiD;IACjD,QAAQ,CAAC,YAAY,EAAE,mBAAmB,CAAC;IAE3C,4BAA4B;IAC5B,EAAE,EAAE,iBAAiB,CAAC;IAEtB,kCAAkC;IAClC,GAAG,EAAE,kBAAkB,CAAC;IAExB,6BAA6B;IAC7B,MAAM,EAAE,aAAa,CAAC;IAEtB,KAAK,CACH,OAAO,EAAE,CAAC,OAAO,EAAE,OAAO,KAAK,OAAO,CAAC,QAAQ,CAAC,GAAG,QAAQ,EAC3D,OAAO,EAAE,YAAY,GACpB,OAAO,CAAC,MAAM,CAAC,CAAC;IAEnB,yCAAyC;IACzC,KAAK,CAAC,EAAE,YAAY,CAAC;IAErB,+CAA+C;IAC/C,EAAE,CAAC,EAAE,cAAc,CAAC;IAEpB,8CAA8C;IAC9C,OAAO,CAAC,EAAE,kBAAkB,CAAC;IAE7B,4DAA4D;IAC5D,UAAU,CAAC,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;IAE7B,+CAA+C;IAC/C,QAAQ,CAAC,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;CAC5B;AAED;;GAEG;AACH,MAAM,WAAW,mBAAmB;IAClC,oDAAoD;IACpD,UAAU,EAAE,OAAO,CAAC;IAEpB,6BAA6B;IAC7B,GAAG,EAAE,OAAO,CAAC;IAEb,4BAA4B;IAC5B,KAAK,EAAE,OAAO,CAAC;IAEf,wBAAwB;IACxB,SAAS,EAAE,OAAO,CAAC;IAEnB,2CAA2C;IAC3C,OAAO,EAAE,OAAO,CAAC;IAEjB,2BAA2B;IAC3B,YAAY,EAAE,OAAO,CAAC;IAEtB,8BAA8B;IAC9B,KAAK,EAAE,OAAO,CAAC;IAEf,gCAAgC;IAChC,OAAO,EAAE,OAAO,CAAC;IAEjB,yDAAyD;IACzD,UAAU,EAAE,OAAO,CAAC;CACrB;AAED,MAAM,WAAW,aAAa;IAC5B,gBAAgB,CAAC,OAAO,EAAE,OAAO,GAAG,gBAAgB,CAAC;CACtD;AAED,MAAM,WAAW,gBAAgB;IAC/B,MAAM,EAAE,
|
|
1
|
+
{"version":3,"file":"base.d.ts","sourceRoot":"","sources":["../../../../src/src/platform/adapters/base.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1,15 @@
|
|
|
1
|
-
|
|
1
|
+
const WEBSOCKET_UPGRADE_RESPONSE_KIND = "websocket-upgrade";
|
|
2
|
+
export function createWebSocketUpgradeResponse(input = {}) {
|
|
3
|
+
return {
|
|
4
|
+
kind: WEBSOCKET_UPGRADE_RESPONSE_KIND,
|
|
5
|
+
status: 101,
|
|
6
|
+
statusText: input.statusText ?? "Switching Protocols",
|
|
7
|
+
headers: new Headers(input.headers),
|
|
8
|
+
body: null,
|
|
9
|
+
};
|
|
10
|
+
}
|
|
11
|
+
export function isWebSocketUpgradeResponse(value) {
|
|
12
|
+
return typeof value === "object" && value !== null &&
|
|
13
|
+
value.kind === WEBSOCKET_UPGRADE_RESPONSE_KIND &&
|
|
14
|
+
value.status === 101;
|
|
15
|
+
}
|
|
@@ -14,5 +14,7 @@ export declare class BunWebSocket {
|
|
|
14
14
|
onmessage: ((event: MessageEvent) => void) | null;
|
|
15
15
|
send(_data: string | ArrayBuffer): void;
|
|
16
16
|
close(_code?: number, _reason?: string): void;
|
|
17
|
+
addEventListener(type: string, listener: EventListener): void;
|
|
18
|
+
removeEventListener(type: string, _listener: EventListener): void;
|
|
17
19
|
}
|
|
18
20
|
//# sourceMappingURL=websocket-adapter.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"websocket-adapter.d.ts","sourceRoot":"","sources":["../../../../../../src/src/platform/adapters/runtime/bun/websocket-adapter.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,gBAAgB,EAAE,MAAM,eAAe,CAAC;AAGrE,qBAAa,gBAAiB,YAAW,aAAa;IACpD,gBAAgB,CAAC,OAAO,EAAE,OAAO,GAAG,gBAAgB;CAerD;AAED,qBAAa,YAAY;IACvB,MAAM,CAAC,QAAQ,CAAC,UAAU,KAAK;IAC/B,MAAM,CAAC,QAAQ,CAAC,IAAI,KAAK;IACzB,MAAM,CAAC,QAAQ,CAAC,OAAO,KAAK;IAC5B,MAAM,CAAC,QAAQ,CAAC,MAAM,KAAK;IAE3B,UAAU,SAAqB;IAE/B,MAAM,EAAE,CAAC,CAAC,KAAK,EAAE,KAAK,KAAK,IAAI,CAAC,GAAG,IAAI,CAAQ;IAC/C,OAAO,EAAE,CAAC,CAAC,KAAK,EAAE,KAAK,KAAK,IAAI,CAAC,GAAG,IAAI,CAAQ;IAChD,OAAO,EAAE,CAAC,CAAC,KAAK,EAAE,KAAK,KAAK,IAAI,CAAC,GAAG,IAAI,CAAQ;IAChD,SAAS,EAAE,CAAC,CAAC,KAAK,EAAE,YAAY,KAAK,IAAI,CAAC,GAAG,IAAI,CAAQ;IAEzD,IAAI,CAAC,KAAK,EAAE,MAAM,GAAG,WAAW,GAAG,IAAI;IASvC,KAAK,CAAC,KAAK,CAAC,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,MAAM,GAAG,IAAI;
|
|
1
|
+
{"version":3,"file":"websocket-adapter.d.ts","sourceRoot":"","sources":["../../../../../../src/src/platform/adapters/runtime/bun/websocket-adapter.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,gBAAgB,EAAE,MAAM,eAAe,CAAC;AAGrE,qBAAa,gBAAiB,YAAW,aAAa;IACpD,gBAAgB,CAAC,OAAO,EAAE,OAAO,GAAG,gBAAgB;CAerD;AAED,qBAAa,YAAY;IACvB,MAAM,CAAC,QAAQ,CAAC,UAAU,KAAK;IAC/B,MAAM,CAAC,QAAQ,CAAC,IAAI,KAAK;IACzB,MAAM,CAAC,QAAQ,CAAC,OAAO,KAAK;IAC5B,MAAM,CAAC,QAAQ,CAAC,MAAM,KAAK;IAE3B,UAAU,SAAqB;IAE/B,MAAM,EAAE,CAAC,CAAC,KAAK,EAAE,KAAK,KAAK,IAAI,CAAC,GAAG,IAAI,CAAQ;IAC/C,OAAO,EAAE,CAAC,CAAC,KAAK,EAAE,KAAK,KAAK,IAAI,CAAC,GAAG,IAAI,CAAQ;IAChD,OAAO,EAAE,CAAC,CAAC,KAAK,EAAE,KAAK,KAAK,IAAI,CAAC,GAAG,IAAI,CAAQ;IAChD,SAAS,EAAE,CAAC,CAAC,KAAK,EAAE,YAAY,KAAK,IAAI,CAAC,GAAG,IAAI,CAAQ;IAEzD,IAAI,CAAC,KAAK,EAAE,MAAM,GAAG,WAAW,GAAG,IAAI;IASvC,KAAK,CAAC,KAAK,CAAC,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,MAAM,GAAG,IAAI;IAI7C,gBAAgB,CAAC,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,aAAa,GAAG,IAAI;IAiB7D,mBAAmB,CAAC,IAAI,EAAE,MAAM,EAAE,SAAS,EAAE,aAAa,GAAG,IAAI;CAgBlE"}
|
|
@@ -9,7 +9,7 @@ export class BunServerAdapter {
|
|
|
9
9
|
}
|
|
10
10
|
const socket = new BunWebSocket();
|
|
11
11
|
const response = new Response(null, { status: 101, statusText: "Switching Protocols" });
|
|
12
|
-
return { socket
|
|
12
|
+
return { socket, response };
|
|
13
13
|
}
|
|
14
14
|
}
|
|
15
15
|
export class BunWebSocket {
|
|
@@ -31,4 +31,36 @@ export class BunWebSocket {
|
|
|
31
31
|
close(_code, _reason) {
|
|
32
32
|
this.readyState = BunWebSocket.CLOSED;
|
|
33
33
|
}
|
|
34
|
+
addEventListener(type, listener) {
|
|
35
|
+
switch (type) {
|
|
36
|
+
case "open":
|
|
37
|
+
this.onopen = listener;
|
|
38
|
+
return;
|
|
39
|
+
case "close":
|
|
40
|
+
this.onclose = listener;
|
|
41
|
+
return;
|
|
42
|
+
case "error":
|
|
43
|
+
this.onerror = listener;
|
|
44
|
+
return;
|
|
45
|
+
case "message":
|
|
46
|
+
this.onmessage = listener;
|
|
47
|
+
return;
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
removeEventListener(type, _listener) {
|
|
51
|
+
switch (type) {
|
|
52
|
+
case "open":
|
|
53
|
+
this.onopen = null;
|
|
54
|
+
return;
|
|
55
|
+
case "close":
|
|
56
|
+
this.onclose = null;
|
|
57
|
+
return;
|
|
58
|
+
case "error":
|
|
59
|
+
this.onerror = null;
|
|
60
|
+
return;
|
|
61
|
+
case "message":
|
|
62
|
+
this.onmessage = null;
|
|
63
|
+
return;
|
|
64
|
+
}
|
|
65
|
+
}
|
|
34
66
|
}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import type
|
|
1
|
+
import { type ServerAdapter, type WebSocketUpgrade } from "../../base.js";
|
|
2
2
|
import type { WSWebSocket } from "./types.js";
|
|
3
3
|
export declare class NodeServerAdapter implements ServerAdapter {
|
|
4
4
|
upgradeWebSocket(request: Request): WebSocketUpgrade;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"websocket-adapter.d.ts","sourceRoot":"","sources":["../../../../../../src/src/platform/adapters/runtime/node/websocket-adapter.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,
|
|
1
|
+
{"version":3,"file":"websocket-adapter.d.ts","sourceRoot":"","sources":["../../../../../../src/src/platform/adapters/runtime/node/websocket-adapter.ts"],"names":[],"mappings":"AAAA,OAAO,EAEL,KAAK,aAAa,EAClB,KAAK,gBAAgB,EACtB,MAAM,eAAe,CAAC;AACvB,OAAO,KAAK,EAAiB,WAAW,EAAE,MAAM,YAAY,CAAC;AAgC7D,qBAAa,iBAAkB,YAAW,aAAa;IACrD,gBAAgB,CAAC,OAAO,EAAE,OAAO,GAAG,gBAAgB;IAoCpD,OAAO,CAAC,iBAAiB;CAI1B;AAED,qBAAa,aAAa;IACxB,OAAO,CAAC,EAAE,CAA4B;IACtC,UAAU,SAAK;IAEf,MAAM,EAAE,CAAC,CAAC,KAAK,EAAE,KAAK,KAAK,IAAI,CAAC,GAAG,IAAI,CAAQ;IAC/C,OAAO,EAAE,CAAC,CAAC,KAAK,EAAE,UAAU,KAAK,IAAI,CAAC,GAAG,IAAI,CAAQ;IACrD,OAAO,EAAE,CAAC,CAAC,KAAK,EAAE,KAAK,KAAK,IAAI,CAAC,GAAG,IAAI,CAAQ;IAChD,SAAS,EAAE,CAAC,CAAC,KAAK,EAAE,YAAY,KAAK,IAAI,CAAC,GAAG,IAAI,CAAQ;IAEzD,MAAM,CAAC,QAAQ,CAAC,UAAU,KAAK;IAC/B,MAAM,CAAC,QAAQ,CAAC,IAAI,KAAK;IACzB,MAAM,CAAC,QAAQ,CAAC,OAAO,KAAK;IAC5B,MAAM,CAAC,QAAQ,CAAC,MAAM,KAAK;IAE3B,OAAO,CAAC,eAAe,CAAmC;IAE1D,iBAAiB,CAAC,EAAE,EAAE,WAAW,GAAG,IAAI;IA4BxC,UAAU,CAAC,KAAK,EAAE,KAAK,GAAG,IAAI;IAK9B,IAAI,CAAC,IAAI,EAAE,MAAM,GAAG,WAAW,GAAG,IAAI;IAmBtC,KAAK,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,MAAM,GAAG,IAAI;IAK3C,gBAAgB,CAAC,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,aAAa,GAAG,IAAI;IAiB7D,mBAAmB,CAAC,IAAI,EAAE,MAAM,EAAE,SAAS,EAAE,aAAa,GAAG,IAAI;CAgBlE"}
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { createWebSocketUpgradeResponse, } from "../../base.js";
|
|
1
2
|
import { createError, toError } from "../../../../errors/index.js";
|
|
2
3
|
import { serverLogger } from "../../../../utils/index.js";
|
|
3
4
|
import { registerWebSocketUpgrade } from "./http-server.js";
|
|
@@ -50,16 +51,8 @@ export class NodeServerAdapter {
|
|
|
50
51
|
"Sec-WebSocket-Accept": this.generateAcceptKey(key),
|
|
51
52
|
...(protocol ? { "Sec-WebSocket-Protocol": protocol } : {}),
|
|
52
53
|
};
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
const response = {
|
|
56
|
-
status: 101,
|
|
57
|
-
statusText: "Switching Protocols",
|
|
58
|
-
headers: new Headers(headers),
|
|
59
|
-
body: null,
|
|
60
|
-
ok: false,
|
|
61
|
-
};
|
|
62
|
-
return { socket: socket, response };
|
|
54
|
+
const response = createWebSocketUpgradeResponse({ headers });
|
|
55
|
+
return { socket, response };
|
|
63
56
|
}
|
|
64
57
|
generateAcceptKey(key) {
|
|
65
58
|
const GUID = "258EAFA5-E914-47DA-95CA-C5AB0DC85B11";
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"handler.d.ts","sourceRoot":"","sources":["../../../src/src/proxy/handler.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,KAAK,YAAY,EAAsB,MAAM,kCAAkC,CAAC;AACzF,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;
|
|
1
|
+
{"version":3,"file":"handler.d.ts","sourceRoot":"","sources":["../../../src/src/proxy/handler.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,KAAK,YAAY,EAAsB,MAAM,kCAAkC,CAAC;AACzF,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AA0CnD;;;;;GAKG;AACH,wBAAgB,iCAAiC,IAAI,IAAI,CAExD;AAED,eAAO,MAAM,sBAAsB,0MAYzB,CAAC;AAqHX,MAAM,WAAW,WAAW;IAC1B,UAAU,EAAE,MAAM,CAAC;IACnB,WAAW,EAAE,MAAM,CAAC;IACpB,eAAe,EAAE,MAAM,CAAC;IACxB,kBAAkB,EAAE,MAAM,CAAC;IAC3B,sBAAsB,EAAE,MAAM,CAAC;IAC/B,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,aAAa,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;CACxC;AAED,MAAM,WAAW,YAAY;IAC3B,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,WAAW,EAAE,SAAS,GAAG,YAAY,CAAC;IACtC,eAAe,EAAE,MAAM,CAAC;IACxB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,IAAI,EAAE,MAAM,CAAC;IACb,YAAY,EAAE,YAAY,CAAC;IAC3B,cAAc,EAAE,OAAO,CAAC;IACxB,KAAK,CAAC,EAAE;QACN,MAAM,EAAE,MAAM,CAAC;QACf,OAAO,EAAE,MAAM,CAAC;QAChB,IAAI,CAAC,EAAE,MAAM,CAAC;QACd,WAAW,CAAC,EAAE,MAAM,CAAC;KACtB,CAAC;CACH;AAED,MAAM,WAAW,WAAW;IAC1B,KAAK,EAAE,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,KAAK,IAAI,CAAC;IAC9D,IAAI,EAAE,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,KAAK,IAAI,CAAC;IAC7D,IAAI,EAAE,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,KAAK,IAAI,CAAC;IAC7D,KAAK,EAAE,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,KAAK,EAAE,KAAK,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,KAAK,IAAI,CAAC;CAC9E;AAED,MAAM,WAAW,mBAAmB;IAClC,MAAM,EAAE,WAAW,CAAC;IACpB,KAAK,CAAC,EAAE,UAAU,CAAC;IACnB,MAAM,CAAC,EAAE,WAAW,CAAC;CACtB;AAED,MAAM,WAAW,mBAAmB;IAClC,GAAG,CAAC,EAAE,GAAG,CAAC;CACX;AAkFD,wBAAgB,kBAAkB,CAAC,OAAO,EAAE,mBAAmB;0BAqLtD,OAAO,YACH,mBAAmB,KAC3B,OAAO,CAAC,YAAY,CAAC;0BA6QjB,OAAO,YACH,mBAAmB,KAC3B,OAAO,CAAC,MAAM,GAAG,SAAS,CAAC;;;;;;;;0BAtbH,MAAM,EAAE;;EA4dpC;AAED,MAAM,MAAM,YAAY,GAAG,UAAU,CAAC,OAAO,kBAAkB,CAAC,CAAC;AAEjE,wBAAgB,oBAAoB,CAAC,GAAG,EAAE,OAAO,EAAE,GAAG,EAAE,YAAY,GAAG,OAAO,CAwB7E"}
|
package/esm/src/proxy/handler.js
CHANGED
|
@@ -1,23 +1,11 @@
|
|
|
1
1
|
import { TokenManager } from "./token-manager.js";
|
|
2
2
|
import { parseProjectDomain } from "../server/utils/domain-parser.js";
|
|
3
|
-
import {
|
|
4
|
-
import { cwd, getEnv } from "../platform/compat/process.js";
|
|
5
|
-
import { join } from "../platform/compat/path/index.js";
|
|
3
|
+
import { getEnv } from "../platform/compat/process.js";
|
|
6
4
|
import { injectContext, ProxySpanNames, withSpan } from "./tracing.js";
|
|
7
5
|
import { computeContentSourceId } from "../cache/keys.js";
|
|
8
6
|
import { resolve as resolveContract } from "../extensions/contracts.js";
|
|
9
|
-
import {
|
|
10
|
-
import {
|
|
11
|
-
/**
|
|
12
|
-
* Bounded cache for project paths discovered dynamically at request time
|
|
13
|
-
* (slug → absolute path). Previously these were written into the per-handler
|
|
14
|
-
* `localProjects` config map, which grew without bound. Using a registered
|
|
15
|
-
* LRU keeps the working set capped and exposes it to cache monitoring, while
|
|
16
|
-
* the static `config.localProjects` map continues to reflect *configured*
|
|
17
|
-
* projects for the public `ProxyHandler.localProjects` surface.
|
|
18
|
-
*/
|
|
19
|
-
const discoveredLocalProjects = new LRUCache({ maxEntries: 100 });
|
|
20
|
-
registerLRUCache("proxy-discovered-local-projects", discoveredLocalProjects);
|
|
7
|
+
import { createLocalProjectResolver } from "./local-project-resolver.js";
|
|
8
|
+
import { isMissingCustomDomainProjectError, resolveProxyRequestToken, } from "./proxy-token-resolution.js";
|
|
21
9
|
/**
|
|
22
10
|
* Cache the resolved AuthProvider at module scope so the proxy does not pay
|
|
23
11
|
* the registry lookup on every request. The cache is cleared implicitly when
|
|
@@ -148,23 +136,11 @@ function getRequestHost(req, url) {
|
|
|
148
136
|
function getScope(environment) {
|
|
149
137
|
return environment === "preview" ? "preview" : "production";
|
|
150
138
|
}
|
|
151
|
-
function extractUserToken(cookieHeader) {
|
|
152
|
-
const match = cookieHeader.match(/(?:^|;\s*)authToken=([^;]+)/);
|
|
153
|
-
return match?.[1] ? decodeURIComponent(match[1]) : undefined;
|
|
154
|
-
}
|
|
155
139
|
function parseStatusFromError(error) {
|
|
156
140
|
const message = error instanceof Error ? error.message : String(error);
|
|
157
141
|
const match = message.match(/failed: (\d+)/);
|
|
158
142
|
return match ? Number(match[1]) : null;
|
|
159
143
|
}
|
|
160
|
-
// Brittle on purpose: we string-match the API's OAuth error body. Source of truth is
|
|
161
|
-
// veryfront-api/src/api/http/rest/auth/routes.ts — `oauthError(c, 'Project not found
|
|
162
|
-
// for domain', ...)`. If that string is renamed, this regex silently regresses to 502.
|
|
163
|
-
// Durable fix is a typed error code from the token-mint helper; tracked separately.
|
|
164
|
-
function isMissingCustomDomainProjectError(error) {
|
|
165
|
-
const message = error instanceof Error ? error.message : String(error);
|
|
166
|
-
return /project not found for domain/i.test(message);
|
|
167
|
-
}
|
|
168
144
|
async function extractUserIdFromToken(token, apiBaseUrl, log) {
|
|
169
145
|
const auth = getAuthProvider();
|
|
170
146
|
const header = auth.decode(token);
|
|
@@ -221,52 +197,7 @@ function isProjectMember(users, userId) {
|
|
|
221
197
|
export function createProxyHandler(options) {
|
|
222
198
|
const { config, cache, logger } = options;
|
|
223
199
|
const localProjects = config.localProjects ?? {};
|
|
224
|
-
const
|
|
225
|
-
async function findLocalProject(slug) {
|
|
226
|
-
const mapped = localProjects[slug];
|
|
227
|
-
if (mapped)
|
|
228
|
-
return mapped;
|
|
229
|
-
const projectDirs = ["projects", "data/projects", "examples"];
|
|
230
|
-
const basePath = cwd();
|
|
231
|
-
// Key the discovery cache by the filesystem root as well as the slug: the
|
|
232
|
-
// cache is process-wide, so the same slug can resolve to different paths
|
|
233
|
-
// across handlers/workspaces or after a cwd change. Keying by basePath
|
|
234
|
-
// prevents a stale entry from one root being proxied for another.
|
|
235
|
-
const cacheKey = `${basePath}${slug}`;
|
|
236
|
-
const cached = discoveredLocalProjects.get(cacheKey);
|
|
237
|
-
if (cached)
|
|
238
|
-
return cached;
|
|
239
|
-
const candidatePaths = projectDirs.map((dir) => join(basePath, dir, slug));
|
|
240
|
-
const existingPaths = await Promise.all(candidatePaths.map(async (projectPath) => {
|
|
241
|
-
try {
|
|
242
|
-
return (await fs.exists(projectPath)) ? projectPath : null;
|
|
243
|
-
}
|
|
244
|
-
catch (_) {
|
|
245
|
-
/* expected: filesystem check may fail */
|
|
246
|
-
return null;
|
|
247
|
-
}
|
|
248
|
-
}));
|
|
249
|
-
for (const projectPath of existingPaths) {
|
|
250
|
-
if (!projectPath)
|
|
251
|
-
continue;
|
|
252
|
-
try {
|
|
253
|
-
const [hasApp, hasPages, hasComponents] = await Promise.all([
|
|
254
|
-
fs.exists(join(projectPath, "app")),
|
|
255
|
-
fs.exists(join(projectPath, "pages")),
|
|
256
|
-
fs.exists(join(projectPath, "components")),
|
|
257
|
-
]);
|
|
258
|
-
if (!hasApp && !hasPages && !hasComponents)
|
|
259
|
-
continue;
|
|
260
|
-
discoveredLocalProjects.set(cacheKey, projectPath);
|
|
261
|
-
logger?.debug("Dynamically discovered local project", { slug, projectPath });
|
|
262
|
-
return projectPath;
|
|
263
|
-
}
|
|
264
|
-
catch (_) {
|
|
265
|
-
// expected: filesystem check may fail
|
|
266
|
-
}
|
|
267
|
-
}
|
|
268
|
-
return undefined;
|
|
269
|
-
}
|
|
200
|
+
const localProjectResolver = createLocalProjectResolver({ localProjects, logger });
|
|
270
201
|
const tokenManager = new TokenManager({
|
|
271
202
|
apiBaseUrl: config.apiBaseUrl,
|
|
272
203
|
apiClientId: config.apiClientId,
|
|
@@ -315,46 +246,6 @@ export function createProxyHandler(options) {
|
|
|
315
246
|
function makeProjectNotFoundContext(base, message, token) {
|
|
316
247
|
return makeErrorContext(base, 404, message, token, undefined, "project-not-found");
|
|
317
248
|
}
|
|
318
|
-
async function resolveRequestToken(req, url, scope, host, projectSlug, options) {
|
|
319
|
-
const userToken = extractUserToken(req.headers.get("cookie") ?? "");
|
|
320
|
-
const useSignedInternalControlPlaneToken = options.allowSignedInternalControlPlaneToken &&
|
|
321
|
-
isSignedInternalControlPlaneRequest(req, url);
|
|
322
|
-
let token;
|
|
323
|
-
let tokenFetchError;
|
|
324
|
-
if (useSignedInternalControlPlaneToken) {
|
|
325
|
-
token = req.headers.get("x-token") ?? undefined;
|
|
326
|
-
logger?.debug("Using signed control-plane token for internal request", {
|
|
327
|
-
pathname: url.pathname,
|
|
328
|
-
scope,
|
|
329
|
-
});
|
|
330
|
-
}
|
|
331
|
-
else if (scope === "preview" && userToken) {
|
|
332
|
-
token = userToken;
|
|
333
|
-
logger?.debug("Using user auth token for preview");
|
|
334
|
-
}
|
|
335
|
-
if (!token && config.apiClientId && config.apiClientSecret) {
|
|
336
|
-
const customDomain = projectSlug ? undefined : host;
|
|
337
|
-
if (projectSlug || customDomain) {
|
|
338
|
-
try {
|
|
339
|
-
token = await tokenManager.getToken(scope, projectSlug, customDomain);
|
|
340
|
-
}
|
|
341
|
-
catch (error) {
|
|
342
|
-
tokenFetchError = error;
|
|
343
|
-
if (!(customDomain && isMissingCustomDomainProjectError(error))) {
|
|
344
|
-
logger?.error(options.tokenFetchErrorMessage, error, {
|
|
345
|
-
projectSlug,
|
|
346
|
-
customDomain,
|
|
347
|
-
});
|
|
348
|
-
}
|
|
349
|
-
}
|
|
350
|
-
}
|
|
351
|
-
}
|
|
352
|
-
if (!token && config.apiToken) {
|
|
353
|
-
token = config.apiToken;
|
|
354
|
-
logger?.debug("Using static API token fallback");
|
|
355
|
-
}
|
|
356
|
-
return { token, userToken, tokenFetchError };
|
|
357
|
-
}
|
|
358
249
|
async function checkProtectedAccess(req, url, matchingEnv, userToken, users, logContext) {
|
|
359
250
|
if (!matchingEnv?.protected)
|
|
360
251
|
return null;
|
|
@@ -434,7 +325,7 @@ export function createProxyHandler(options) {
|
|
|
434
325
|
isLocalProject: false,
|
|
435
326
|
};
|
|
436
327
|
}
|
|
437
|
-
const localPath = projectSlug ? await
|
|
328
|
+
const localPath = projectSlug ? await localProjectResolver.find(projectSlug) : undefined;
|
|
438
329
|
const isLocalProject = !!localPath;
|
|
439
330
|
logger?.debug("Processing request", {
|
|
440
331
|
host,
|
|
@@ -450,8 +341,17 @@ export function createProxyHandler(options) {
|
|
|
450
341
|
logger?.debug("Local project, skipping token fetch", { localPath });
|
|
451
342
|
}
|
|
452
343
|
else {
|
|
453
|
-
({ token, userToken, tokenFetchError } = await
|
|
344
|
+
({ token, userToken, tokenFetchError } = await resolveProxyRequestToken({
|
|
345
|
+
req,
|
|
346
|
+
url,
|
|
347
|
+
scope,
|
|
348
|
+
host,
|
|
349
|
+
projectSlug,
|
|
350
|
+
config,
|
|
351
|
+
tokenManager,
|
|
352
|
+
logger,
|
|
454
353
|
allowSignedInternalControlPlaneToken: true,
|
|
354
|
+
signedInternalControlPlaneRequest: isSignedInternalControlPlaneRequest(req, url),
|
|
455
355
|
tokenFetchErrorMessage: "Token fetch failed",
|
|
456
356
|
}));
|
|
457
357
|
if (projectSlug && !token) {
|
|
@@ -589,7 +489,16 @@ export function createProxyHandler(options) {
|
|
|
589
489
|
const parsedDomain = parseProjectDomain(host);
|
|
590
490
|
const scope = getScope(parsedDomain.environment);
|
|
591
491
|
const projectSlug = parsedDomain.slug ?? undefined;
|
|
592
|
-
const { token } = await
|
|
492
|
+
const { token } = await resolveProxyRequestToken({
|
|
493
|
+
req,
|
|
494
|
+
url,
|
|
495
|
+
scope,
|
|
496
|
+
host,
|
|
497
|
+
projectSlug,
|
|
498
|
+
config,
|
|
499
|
+
tokenManager,
|
|
500
|
+
logger,
|
|
501
|
+
signedInternalControlPlaneRequest: isSignedInternalControlPlaneRequest(req, url),
|
|
593
502
|
tokenFetchErrorMessage: "Token fetch failed for API",
|
|
594
503
|
});
|
|
595
504
|
return token;
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
interface LocalProjectFileSystem {
|
|
2
|
+
exists(path: string): Promise<boolean> | boolean;
|
|
3
|
+
}
|
|
4
|
+
interface LocalProjectLogger {
|
|
5
|
+
debug(message: string, extra?: Record<string, unknown>): void;
|
|
6
|
+
}
|
|
7
|
+
export interface LocalProjectResolverOptions {
|
|
8
|
+
localProjects?: Record<string, string>;
|
|
9
|
+
fs?: LocalProjectFileSystem;
|
|
10
|
+
basePath?: () => string;
|
|
11
|
+
logger?: LocalProjectLogger;
|
|
12
|
+
}
|
|
13
|
+
export interface LocalProjectResolver {
|
|
14
|
+
find(slug: string): Promise<string | undefined>;
|
|
15
|
+
}
|
|
16
|
+
export declare function createLocalProjectResolver(options: LocalProjectResolverOptions): LocalProjectResolver;
|
|
17
|
+
export {};
|
|
18
|
+
//# sourceMappingURL=local-project-resolver.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"local-project-resolver.d.ts","sourceRoot":"","sources":["../../../src/src/proxy/local-project-resolver.ts"],"names":[],"mappings":"AAMA,UAAU,sBAAsB;IAC9B,MAAM,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,GAAG,OAAO,CAAC;CAClD;AAED,UAAU,kBAAkB;IAC1B,KAAK,CAAC,OAAO,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI,CAAC;CAC/D;AAED,MAAM,WAAW,2BAA2B;IAC1C,aAAa,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACvC,EAAE,CAAC,EAAE,sBAAsB,CAAC;IAC5B,QAAQ,CAAC,EAAE,MAAM,MAAM,CAAC;IACxB,MAAM,CAAC,EAAE,kBAAkB,CAAC;CAC7B;AAED,MAAM,WAAW,oBAAoB;IACnC,IAAI,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,GAAG,SAAS,CAAC,CAAC;CACjD;AAUD,wBAAgB,0BAA0B,CACxC,OAAO,EAAE,2BAA2B,GACnC,oBAAoB,CAyDtB"}
|
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
import { registerLRUCache } from "../cache/index.js";
|
|
2
|
+
import { createFileSystem } from "../platform/compat/fs.js";
|
|
3
|
+
import { join } from "../platform/compat/path/index.js";
|
|
4
|
+
import { cwd } from "../platform/compat/process.js";
|
|
5
|
+
import { LRUCache } from "../utils/lru-wrapper.js";
|
|
6
|
+
/**
|
|
7
|
+
* Bounded cache for project paths discovered dynamically at request time
|
|
8
|
+
* (slug -> absolute path). Configured `localProjects` are never written here,
|
|
9
|
+
* so `ProxyHandler.localProjects` continues to expose only configured projects.
|
|
10
|
+
*/
|
|
11
|
+
const discoveredLocalProjects = new LRUCache({ maxEntries: 100 });
|
|
12
|
+
registerLRUCache("proxy-discovered-local-projects", discoveredLocalProjects);
|
|
13
|
+
export function createLocalProjectResolver(options) {
|
|
14
|
+
const localProjects = options.localProjects ?? {};
|
|
15
|
+
const fs = options.fs ?? createFileSystem();
|
|
16
|
+
const getBasePath = options.basePath ?? cwd;
|
|
17
|
+
const logger = options.logger;
|
|
18
|
+
async function find(slug) {
|
|
19
|
+
const mapped = localProjects[slug];
|
|
20
|
+
if (mapped)
|
|
21
|
+
return mapped;
|
|
22
|
+
const projectDirs = ["projects", "data/projects", "examples"];
|
|
23
|
+
const basePath = getBasePath();
|
|
24
|
+
// Key the discovery cache by the filesystem root as well as the slug: the
|
|
25
|
+
// cache is process-wide, so the same slug can resolve to different paths
|
|
26
|
+
// across handlers/workspaces or after a cwd change. Keying by basePath
|
|
27
|
+
// prevents a stale entry from one root being proxied for another.
|
|
28
|
+
const cacheKey = `${basePath}\0${slug}`;
|
|
29
|
+
const cached = discoveredLocalProjects.get(cacheKey);
|
|
30
|
+
if (cached)
|
|
31
|
+
return cached;
|
|
32
|
+
const candidatePaths = projectDirs.map((dir) => join(basePath, dir, slug));
|
|
33
|
+
const existingPaths = await Promise.all(candidatePaths.map(async (projectPath) => {
|
|
34
|
+
try {
|
|
35
|
+
return (await fs.exists(projectPath)) ? projectPath : null;
|
|
36
|
+
}
|
|
37
|
+
catch (_) {
|
|
38
|
+
return null;
|
|
39
|
+
}
|
|
40
|
+
}));
|
|
41
|
+
for (const projectPath of existingPaths) {
|
|
42
|
+
if (!projectPath)
|
|
43
|
+
continue;
|
|
44
|
+
try {
|
|
45
|
+
const [hasApp, hasPages, hasComponents] = await Promise.all([
|
|
46
|
+
fs.exists(join(projectPath, "app")),
|
|
47
|
+
fs.exists(join(projectPath, "pages")),
|
|
48
|
+
fs.exists(join(projectPath, "components")),
|
|
49
|
+
]);
|
|
50
|
+
if (!hasApp && !hasPages && !hasComponents)
|
|
51
|
+
continue;
|
|
52
|
+
discoveredLocalProjects.set(cacheKey, projectPath);
|
|
53
|
+
logger?.debug("Dynamically discovered local project", { slug, projectPath });
|
|
54
|
+
return projectPath;
|
|
55
|
+
}
|
|
56
|
+
catch (_) {
|
|
57
|
+
// expected: filesystem check may fail
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
return undefined;
|
|
61
|
+
}
|
|
62
|
+
return { find };
|
|
63
|
+
}
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
import type { TokenScope } from "./token-manager.js";
|
|
2
|
+
export interface ProxyTokenResolutionConfig {
|
|
3
|
+
apiClientId: string;
|
|
4
|
+
apiClientSecret: string;
|
|
5
|
+
apiToken?: string;
|
|
6
|
+
}
|
|
7
|
+
export interface ProxyTokenManager {
|
|
8
|
+
getToken(scope: TokenScope, projectSlug?: string, customDomain?: string): Promise<string>;
|
|
9
|
+
}
|
|
10
|
+
export interface ProxyTokenResolutionLogger {
|
|
11
|
+
debug: (msg: string, extra?: Record<string, unknown>) => void;
|
|
12
|
+
info: (msg: string, extra?: Record<string, unknown>) => void;
|
|
13
|
+
warn: (msg: string, extra?: Record<string, unknown>) => void;
|
|
14
|
+
error: (msg: string, error?: Error, extra?: Record<string, unknown>) => void;
|
|
15
|
+
}
|
|
16
|
+
export interface ResolveProxyRequestTokenOptions {
|
|
17
|
+
req: Request;
|
|
18
|
+
url: URL;
|
|
19
|
+
scope: TokenScope;
|
|
20
|
+
host: string;
|
|
21
|
+
projectSlug: string | undefined;
|
|
22
|
+
config: ProxyTokenResolutionConfig;
|
|
23
|
+
tokenManager: ProxyTokenManager;
|
|
24
|
+
logger?: ProxyTokenResolutionLogger;
|
|
25
|
+
allowSignedInternalControlPlaneToken?: boolean;
|
|
26
|
+
signedInternalControlPlaneRequest?: boolean;
|
|
27
|
+
tokenFetchErrorMessage: string;
|
|
28
|
+
}
|
|
29
|
+
export interface ResolvedProxyRequestToken {
|
|
30
|
+
token?: string;
|
|
31
|
+
userToken?: string;
|
|
32
|
+
tokenFetchError?: unknown;
|
|
33
|
+
}
|
|
34
|
+
export declare function extractUserToken(cookieHeader: string): string | undefined;
|
|
35
|
+
export declare function isMissingCustomDomainProjectError(error: unknown): boolean;
|
|
36
|
+
export declare function resolveProxyRequestToken(options: ResolveProxyRequestTokenOptions): Promise<ResolvedProxyRequestToken>;
|
|
37
|
+
//# sourceMappingURL=proxy-token-resolution.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"proxy-token-resolution.d.ts","sourceRoot":"","sources":["../../../src/src/proxy/proxy-token-resolution.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,oBAAoB,CAAC;AAErD,MAAM,WAAW,0BAA0B;IACzC,WAAW,EAAE,MAAM,CAAC;IACpB,eAAe,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,iBAAiB;IAChC,QAAQ,CACN,KAAK,EAAE,UAAU,EACjB,WAAW,CAAC,EAAE,MAAM,EACpB,YAAY,CAAC,EAAE,MAAM,GACpB,OAAO,CAAC,MAAM,CAAC,CAAC;CACpB;AAED,MAAM,WAAW,0BAA0B;IACzC,KAAK,EAAE,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,KAAK,IAAI,CAAC;IAC9D,IAAI,EAAE,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,KAAK,IAAI,CAAC;IAC7D,IAAI,EAAE,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,KAAK,IAAI,CAAC;IAC7D,KAAK,EAAE,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,KAAK,EAAE,KAAK,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,KAAK,IAAI,CAAC;CAC9E;AAED,MAAM,WAAW,+BAA+B;IAC9C,GAAG,EAAE,OAAO,CAAC;IACb,GAAG,EAAE,GAAG,CAAC;IACT,KAAK,EAAE,UAAU,CAAC;IAClB,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,GAAG,SAAS,CAAC;IAChC,MAAM,EAAE,0BAA0B,CAAC;IACnC,YAAY,EAAE,iBAAiB,CAAC;IAChC,MAAM,CAAC,EAAE,0BAA0B,CAAC;IACpC,oCAAoC,CAAC,EAAE,OAAO,CAAC;IAC/C,iCAAiC,CAAC,EAAE,OAAO,CAAC;IAC5C,sBAAsB,EAAE,MAAM,CAAC;CAChC;AAED,MAAM,WAAW,yBAAyB;IACxC,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,eAAe,CAAC,EAAE,OAAO,CAAC;CAC3B;AAED,wBAAgB,gBAAgB,CAAC,YAAY,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,CAGzE;AAID,wBAAgB,iCAAiC,CAAC,KAAK,EAAE,OAAO,GAAG,OAAO,CAGzE;AAED,wBAAsB,wBAAwB,CAC5C,OAAO,EAAE,+BAA+B,GACvC,OAAO,CAAC,yBAAyB,CAAC,CAqDpC"}
|
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
export function extractUserToken(cookieHeader) {
|
|
2
|
+
const match = cookieHeader.match(/(?:^|;\s*)authToken=([^;]+)/);
|
|
3
|
+
return match?.[1] ? decodeURIComponent(match[1]) : undefined;
|
|
4
|
+
}
|
|
5
|
+
// Brittle on purpose: the API currently returns this text when token minting
|
|
6
|
+
// cannot map a custom domain. Tracked in #2217 until a typed error code exists.
|
|
7
|
+
export function isMissingCustomDomainProjectError(error) {
|
|
8
|
+
const message = error instanceof Error ? error.message : String(error);
|
|
9
|
+
return /project not found for domain/i.test(message);
|
|
10
|
+
}
|
|
11
|
+
export async function resolveProxyRequestToken(options) {
|
|
12
|
+
const { config, host, logger, projectSlug, req, scope, tokenFetchErrorMessage, tokenManager, url, } = options;
|
|
13
|
+
const userToken = extractUserToken(req.headers.get("cookie") ?? "");
|
|
14
|
+
const useSignedInternalControlPlaneToken = options.allowSignedInternalControlPlaneToken &&
|
|
15
|
+
options.signedInternalControlPlaneRequest;
|
|
16
|
+
let token;
|
|
17
|
+
let tokenFetchError;
|
|
18
|
+
if (useSignedInternalControlPlaneToken) {
|
|
19
|
+
token = req.headers.get("x-token") ?? undefined;
|
|
20
|
+
logger?.debug("Using signed control-plane token for internal request", {
|
|
21
|
+
pathname: url.pathname,
|
|
22
|
+
scope,
|
|
23
|
+
});
|
|
24
|
+
}
|
|
25
|
+
else if (scope === "preview" && userToken) {
|
|
26
|
+
token = userToken;
|
|
27
|
+
logger?.debug("Using user auth token for preview");
|
|
28
|
+
}
|
|
29
|
+
if (!token && config.apiClientId && config.apiClientSecret) {
|
|
30
|
+
const customDomain = projectSlug ? undefined : host;
|
|
31
|
+
if (projectSlug || customDomain) {
|
|
32
|
+
try {
|
|
33
|
+
token = await tokenManager.getToken(scope, projectSlug, customDomain);
|
|
34
|
+
}
|
|
35
|
+
catch (error) {
|
|
36
|
+
tokenFetchError = error;
|
|
37
|
+
if (!(customDomain && isMissingCustomDomainProjectError(error))) {
|
|
38
|
+
logger?.error(tokenFetchErrorMessage, error, {
|
|
39
|
+
projectSlug,
|
|
40
|
+
customDomain,
|
|
41
|
+
});
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
if (!token && config.apiToken) {
|
|
47
|
+
token = config.apiToken;
|
|
48
|
+
logger?.debug("Using static API token fallback");
|
|
49
|
+
}
|
|
50
|
+
return { token, userToken, tokenFetchError };
|
|
51
|
+
}
|
|
@@ -9,6 +9,16 @@
|
|
|
9
9
|
import type { RuntimeAdapter } from "../../../platform/adapters/base.js";
|
|
10
10
|
export { createEsmCache, createModuleCache, generateHash } from "./cache.js";
|
|
11
11
|
export { fetchEsmModule, rewriteEsmPaths } from "./esm-rewriter.js";
|
|
12
|
+
/**
|
|
13
|
+
* Transform a module and all its local dependencies (@/ alias and relative imports).
|
|
14
|
+
*
|
|
15
|
+
* @param filePath - Path to the module
|
|
16
|
+
* @param tmpDir - Temp directory for caching
|
|
17
|
+
* @param localAdapter - Local file system adapter
|
|
18
|
+
* @param config - Module loader configuration
|
|
19
|
+
* @param useLocalAdapter - Whether to use local adapter for reading
|
|
20
|
+
* @returns Path to the transformed module file
|
|
21
|
+
*/
|
|
12
22
|
export declare function transformModuleWithDeps(filePath: string, tmpDir: string, localAdapter: RuntimeAdapter, config: ModuleLoaderConfig, useLocalAdapter?: boolean): Promise<string>;
|
|
13
23
|
export interface ModuleLoaderConfig {
|
|
14
24
|
projectDir: string;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../../src/src/rendering/orchestrator/module-loader/index.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAGH,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,oCAAoC,CAAC;
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../../src/src/rendering/orchestrator/module-loader/index.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAGH,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,oCAAoC,CAAC;AAuBzE,OAAO,EAAE,cAAc,EAAE,iBAAiB,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAC7E,OAAO,EAAE,cAAc,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAC;AAkBpE;;;;;;;;;GASG;AACH,wBAAsB,uBAAuB,CAC3C,QAAQ,EAAE,MAAM,EAChB,MAAM,EAAE,MAAM,EACd,YAAY,EAAE,cAAc,EAC5B,MAAM,EAAE,kBAAkB,EAC1B,eAAe,UAAQ,GACtB,OAAO,CAAC,MAAM,CAAC,CAgIjB;AAED,MAAM,WAAW,kBAAkB;IACjC,UAAU,EAAE,MAAM,CAAC;IACnB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,OAAO,EAAE,cAAc,CAAC;IACxB,IAAI,EAAE,aAAa,GAAG,YAAY,CAAC;IACnC,WAAW,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACjC,QAAQ,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAC9B,yDAAyD;IACzD,YAAY,CAAC,EAAE,MAAM,CAAC;CACvB;AAyBD;;;;;GAKG;AACH,wBAAgB,oBAAoB,CAAC,KAAK,EAAE,OAAO,GAAG,OAAO,CAI5D;AAED;;;;;;GAMG;AACH,wBAAsB,UAAU,CAC9B,QAAQ,EAAE,MAAM,EAChB,MAAM,EAAE,kBAAkB,GACzB,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CA6DlC"}
|