veryfront 0.0.86 → 0.0.89
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/_dnt.shims.d.ts +14 -14
- package/esm/_dnt.shims.d.ts.map +1 -1
- package/esm/deno.d.ts +0 -1
- package/esm/deno.js +8 -9
- package/esm/proxy/main.d.ts +2 -0
- package/esm/proxy/main.d.ts.map +1 -0
- package/esm/proxy/main.js +400 -0
- package/esm/src/cli/commands/init/config-generator.js +1 -1
- package/esm/src/cli/index/arg-parser.d.ts.map +1 -1
- package/esm/src/cli/index/arg-parser.js +1 -0
- package/esm/src/cli/index/command-router.d.ts.map +1 -1
- package/esm/src/cli/index/command-router.js +54 -39
- package/esm/src/cli/index/types.d.ts +4 -0
- package/esm/src/cli/index/types.d.ts.map +1 -1
- package/esm/src/cli/mcp/advanced-tools.d.ts +2 -2
- package/esm/src/cli/templates/manifest.d.ts +448 -448
- package/esm/src/cli/templates/manifest.js +480 -480
- package/esm/src/config/loader.d.ts.map +1 -1
- package/esm/src/config/loader.js +5 -4
- package/esm/src/html/utils.js +2 -2
- package/esm/src/modules/import-map/default-import-map.d.ts +1 -11
- package/esm/src/modules/import-map/default-import-map.d.ts.map +1 -1
- package/esm/src/modules/import-map/default-import-map.js +3 -20
- package/esm/src/modules/import-map/loader.d.ts.map +1 -1
- package/esm/src/modules/import-map/loader.js +7 -22
- package/esm/src/modules/import-map/resolver.d.ts.map +1 -1
- package/esm/src/modules/import-map/resolver.js +12 -8
- package/esm/src/modules/react-loader/component-loader.d.ts.map +1 -1
- package/esm/src/modules/react-loader/component-loader.js +2 -0
- package/esm/src/modules/react-loader/ssr-module-loader/loader.d.ts +1 -6
- package/esm/src/modules/react-loader/ssr-module-loader/loader.d.ts.map +1 -1
- package/esm/src/modules/react-loader/ssr-module-loader/loader.js +40 -32
- package/esm/src/modules/react-loader/ssr-module-loader/types.d.ts +2 -0
- package/esm/src/modules/react-loader/ssr-module-loader/types.d.ts.map +1 -1
- package/esm/src/modules/react-loader/types.d.ts +2 -0
- package/esm/src/modules/react-loader/types.d.ts.map +1 -1
- package/esm/src/modules/react-loader/unified-loader.d.ts.map +1 -1
- package/esm/src/modules/react-loader/unified-loader.js +7 -4
- package/esm/src/modules/server/module-batch-handler.d.ts +2 -0
- package/esm/src/modules/server/module-batch-handler.d.ts.map +1 -1
- package/esm/src/modules/server/module-batch-handler.js +3 -1
- package/esm/src/modules/server/module-server.d.ts +2 -0
- package/esm/src/modules/server/module-server.d.ts.map +1 -1
- package/esm/src/modules/server/module-server.js +4 -2
- package/esm/src/modules/server/ssr-import-rewriter.d.ts.map +1 -1
- package/esm/src/modules/server/ssr-import-rewriter.js +9 -17
- package/esm/src/platform/compat/path-helper.d.ts +7 -7
- package/esm/src/platform/compat/path-helper.d.ts.map +1 -1
- package/esm/src/react/compat/ssr-adapter/string-renderer.js +1 -1
- package/esm/src/react/components/Head.d.ts.map +1 -1
- package/esm/src/react/components/Head.js +6 -2
- package/esm/src/react/components/ai/agent-card.d.ts +1 -1
- package/esm/src/react/components/ai/agent-card.d.ts.map +1 -1
- package/esm/src/react/components/ai/chat/composition/api.d.ts +5 -4
- package/esm/src/react/components/ai/chat/composition/api.d.ts.map +1 -1
- package/esm/src/react/components/ai/chat/index.d.ts +7 -2
- package/esm/src/react/components/ai/chat/index.d.ts.map +1 -1
- package/esm/src/react/components/ai/message.d.ts +2 -2
- package/esm/src/react/components/ai/message.d.ts.map +1 -1
- package/esm/src/react/primitives/agent-primitives.d.ts +3 -3
- package/esm/src/react/primitives/agent-primitives.d.ts.map +1 -1
- package/esm/src/react/primitives/chat-container.d.ts +1 -1
- package/esm/src/react/primitives/chat-container.d.ts.map +1 -1
- package/esm/src/react/primitives/input-box.d.ts +3 -3
- package/esm/src/react/primitives/input-box.d.ts.map +1 -1
- package/esm/src/react/primitives/input-box.js +6 -2
- package/esm/src/react/primitives/message-list.d.ts +4 -4
- package/esm/src/react/primitives/message-list.d.ts.map +1 -1
- package/esm/src/react/primitives/tool-primitives.d.ts +3 -3
- package/esm/src/react/primitives/tool-primitives.d.ts.map +1 -1
- package/esm/src/rendering/component-handling.d.ts +2 -0
- package/esm/src/rendering/component-handling.d.ts.map +1 -1
- package/esm/src/rendering/component-handling.js +4 -2
- package/esm/src/rendering/layouts/layout-applicator.d.ts.map +1 -1
- package/esm/src/rendering/layouts/layout-applicator.js +2 -0
- package/esm/src/rendering/orchestrator/module-loader/index.d.ts +3 -0
- package/esm/src/rendering/orchestrator/module-loader/index.d.ts.map +1 -1
- package/esm/src/rendering/orchestrator/module-loader/index.js +74 -19
- package/esm/src/rendering/orchestrator/pipeline.d.ts.map +1 -1
- package/esm/src/rendering/orchestrator/pipeline.js +2 -0
- package/esm/src/rendering/rsc/server-renderer/tree-processor.d.ts.map +1 -1
- package/esm/src/rendering/rsc/server-renderer/tree-processor.js +3 -1
- package/esm/src/rendering/ssr-globals/context.d.ts +6 -1
- package/esm/src/rendering/ssr-globals/context.d.ts.map +1 -1
- package/esm/src/transforms/esm/http-bundler.d.ts +15 -4
- package/esm/src/transforms/esm/http-bundler.d.ts.map +1 -1
- package/esm/src/transforms/esm/http-bundler.js +105 -12
- package/esm/src/transforms/esm/http-cache.d.ts.map +1 -1
- package/esm/src/transforms/esm/http-cache.js +26 -27
- package/esm/src/transforms/esm/import-rewriter.d.ts.map +1 -1
- package/esm/src/transforms/esm/import-rewriter.js +3 -3
- package/esm/src/transforms/esm/package-registry.d.ts +15 -13
- package/esm/src/transforms/esm/package-registry.d.ts.map +1 -1
- package/esm/src/transforms/esm/package-registry.js +45 -32
- package/esm/src/transforms/esm/react-imports.d.ts.map +1 -1
- package/esm/src/transforms/esm/react-imports.js +3 -7
- package/esm/src/transforms/esm/types.d.ts +2 -0
- package/esm/src/transforms/esm/types.d.ts.map +1 -1
- package/esm/src/transforms/mdx/esm-module-loader/cache/index.d.ts +14 -0
- package/esm/src/transforms/mdx/esm-module-loader/cache/index.d.ts.map +1 -1
- package/esm/src/transforms/mdx/esm-module-loader/cache/index.js +67 -0
- package/esm/src/transforms/mdx/esm-module-loader/loader.d.ts.map +1 -1
- package/esm/src/transforms/mdx/esm-module-loader/loader.js +1 -1
- package/esm/src/transforms/mdx/esm-module-loader/module-fetcher/index.d.ts +1 -0
- 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 +1 -0
- package/esm/src/transforms/mdx/esm-module-loader/types.d.ts +4 -0
- package/esm/src/transforms/mdx/esm-module-loader/types.d.ts.map +1 -1
- package/esm/src/transforms/pipeline/context.d.ts.map +1 -1
- package/esm/src/transforms/pipeline/context.js +7 -15
- package/esm/src/transforms/pipeline/stages/finalize.d.ts.map +1 -1
- package/esm/src/transforms/pipeline/stages/finalize.js +1 -1
- package/esm/src/utils/constants/cdn.d.ts.map +1 -1
- package/esm/src/utils/constants/cdn.js +22 -11
- package/esm/src/utils/hash-utils.d.ts +2 -0
- package/esm/src/utils/hash-utils.d.ts.map +1 -1
- package/esm/src/utils/hash-utils.js +4 -0
- package/package.json +1 -1
- package/src/deno.js +8 -9
- package/src/proxy/main.ts +471 -0
- package/src/src/cli/commands/init/config-generator.ts +1 -1
- package/src/src/cli/index/arg-parser.ts +1 -0
- package/src/src/cli/index/command-router.ts +57 -40
- package/src/src/cli/index/types.ts +5 -0
- package/src/src/cli/templates/manifest.js +480 -480
- package/src/src/config/loader.ts +5 -4
- package/src/src/html/utils.ts +2 -2
- package/src/src/modules/import-map/default-import-map.ts +3 -25
- package/src/src/modules/import-map/loader.ts +7 -23
- package/src/src/modules/import-map/resolver.ts +13 -8
- package/src/src/modules/react-loader/component-loader.ts +2 -0
- package/src/src/modules/react-loader/ssr-module-loader/loader.ts +51 -37
- package/src/src/modules/react-loader/ssr-module-loader/types.ts +2 -0
- package/src/src/modules/react-loader/types.ts +2 -0
- package/src/src/modules/react-loader/unified-loader.ts +7 -4
- package/src/src/modules/server/module-batch-handler.ts +7 -0
- package/src/src/modules/server/module-server.ts +6 -1
- package/src/src/modules/server/ssr-import-rewriter.ts +9 -17
- package/src/src/react/compat/ssr-adapter/stream-renderer.ts +1 -1
- package/src/src/react/compat/ssr-adapter/string-renderer.ts +2 -2
- package/src/src/react/components/Head.tsx +6 -2
- package/src/src/react/primitives/input-box.tsx +4 -2
- package/src/src/rendering/component-handling.ts +6 -0
- package/src/src/rendering/layouts/layout-applicator.ts +4 -5
- package/src/src/rendering/orchestrator/module-loader/index.ts +91 -20
- package/src/src/rendering/orchestrator/pipeline.ts +2 -0
- package/src/src/rendering/orchestrator/ssr-orchestrator.ts +1 -1
- package/src/src/rendering/rsc/server-renderer/tree-processor.ts +13 -3
- package/src/src/transforms/esm/http-bundler.ts +101 -11
- package/src/src/transforms/esm/http-cache.ts +27 -28
- package/src/src/transforms/esm/import-rewriter.ts +5 -3
- package/src/src/transforms/esm/package-registry.ts +46 -32
- package/src/src/transforms/esm/react-imports.ts +3 -7
- package/src/src/transforms/esm/types.ts +2 -0
- package/src/src/transforms/mdx/esm-module-loader/cache/index.ts +84 -0
- package/src/src/transforms/mdx/esm-module-loader/loader.ts +1 -0
- package/src/src/transforms/mdx/esm-module-loader/module-fetcher/index.ts +2 -1
- package/src/src/transforms/mdx/esm-module-loader/types.ts +4 -0
- package/src/src/transforms/pipeline/context.ts +7 -18
- package/src/src/transforms/pipeline/stages/finalize.ts +6 -1
- package/src/src/transforms/plugins/babel-node-positions.ts +2 -2
- package/src/src/utils/constants/cdn.ts +21 -12
- package/src/src/utils/hash-utils.ts +5 -0
package/esm/_dnt.shims.d.ts
CHANGED
|
@@ -1,23 +1,23 @@
|
|
|
1
|
+
import { Deno } from "@deno/shim-deno";
|
|
1
2
|
export { Deno } from "@deno/shim-deno";
|
|
2
3
|
import { Blob } from "buffer";
|
|
3
4
|
export { Blob } from "buffer";
|
|
4
5
|
export { crypto, type Crypto, type SubtleCrypto, type AlgorithmIdentifier, type Algorithm, type RsaOaepParams, type BufferSource, type AesCtrParams, type AesCbcParams, type AesGcmParams, type CryptoKey, type KeyAlgorithm, type KeyType, type KeyUsage, type EcdhKeyDeriveParams, type HkdfParams, type HashAlgorithmIdentifier, type Pbkdf2Params, type AesDerivedKeyParams, type HmacImportParams, type JsonWebKey, type RsaOtherPrimesInfo, type KeyFormat, type RsaHashedKeyGenParams, type RsaKeyGenParams, type BigInteger, type EcKeyGenParams, type NamedCurve, type CryptoKeyPair, type AesKeyGenParams, type HmacKeyGenParams, type RsaHashedImportParams, type EcKeyImportParams, type AesKeyAlgorithm, type RsaPssParams, type EcdsaParams } from "@deno/shim-crypto";
|
|
6
|
+
import { setInterval, setTimeout } from "@deno/shim-timers";
|
|
5
7
|
export { setInterval, setTimeout } from "@deno/shim-timers";
|
|
8
|
+
import { fetch, File, FormData, Headers, Request, Response } from "undici";
|
|
6
9
|
export { fetch, File, FormData, Headers, Request, Response, type BodyInit, type HeadersInit, type ReferrerPolicy, type RequestInit, type RequestCache, type RequestMode, type RequestRedirect, type ResponseInit } from "undici";
|
|
7
10
|
export declare const dntGlobalThis: Omit<typeof globalThis, "fetch" | "setInterval" | "setTimeout" | "Blob" | "File" | "FormData" | "Headers" | "Request" | "Response" | "crypto" | "Deno"> & {
|
|
8
|
-
Deno:
|
|
9
|
-
Blob:
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
Headers: any;
|
|
20
|
-
Request: any;
|
|
21
|
-
Response: any;
|
|
11
|
+
Deno: typeof Deno;
|
|
12
|
+
Blob: typeof Blob;
|
|
13
|
+
crypto: import("@deno/shim-crypto").Crypto;
|
|
14
|
+
setInterval: typeof setInterval;
|
|
15
|
+
setTimeout: typeof setTimeout;
|
|
16
|
+
fetch: typeof fetch;
|
|
17
|
+
File: typeof File;
|
|
18
|
+
FormData: typeof FormData;
|
|
19
|
+
Headers: typeof Headers;
|
|
20
|
+
Request: typeof Request;
|
|
21
|
+
Response: typeof Response;
|
|
22
22
|
};
|
|
23
23
|
//# sourceMappingURL=_dnt.shims.d.ts.map
|
package/esm/_dnt.shims.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"_dnt.shims.d.ts","sourceRoot":"","sources":["../src/_dnt.shims.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"_dnt.shims.d.ts","sourceRoot":"","sources":["../src/_dnt.shims.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,iBAAiB,CAAC;AACvC,OAAO,EAAE,IAAI,EAAE,MAAM,iBAAiB,CAAC;AACvC,OAAO,EAAE,IAAI,EAAE,MAAM,QAAQ,CAAC;AAC9B,OAAO,EAAE,IAAI,EAAE,MAAM,QAAQ,CAAC;AAE9B,OAAO,EAAE,MAAM,EAAE,KAAK,MAAM,EAAE,KAAK,YAAY,EAAE,KAAK,mBAAmB,EAAE,KAAK,SAAS,EAAE,KAAK,aAAa,EAAE,KAAK,YAAY,EAAE,KAAK,YAAY,EAAE,KAAK,YAAY,EAAE,KAAK,YAAY,EAAE,KAAK,SAAS,EAAE,KAAK,YAAY,EAAE,KAAK,OAAO,EAAE,KAAK,QAAQ,EAAE,KAAK,mBAAmB,EAAE,KAAK,UAAU,EAAE,KAAK,uBAAuB,EAAE,KAAK,YAAY,EAAE,KAAK,mBAAmB,EAAE,KAAK,gBAAgB,EAAE,KAAK,UAAU,EAAE,KAAK,kBAAkB,EAAE,KAAK,SAAS,EAAE,KAAK,qBAAqB,EAAE,KAAK,eAAe,EAAE,KAAK,UAAU,EAAE,KAAK,cAAc,EAAE,KAAK,UAAU,EAAE,KAAK,aAAa,EAAE,KAAK,eAAe,EAAE,KAAK,gBAAgB,EAAE,KAAK,qBAAqB,EAAE,KAAK,iBAAiB,EAAE,KAAK,eAAe,EAAE,KAAK,YAAY,EAAE,KAAK,WAAW,EAAE,MAAM,mBAAmB,CAAC;AACrvB,OAAO,EAAE,WAAW,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AAC5D,OAAO,EAAE,WAAW,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AAC5D,OAAO,EAAE,KAAK,EAAE,IAAI,EAAE,QAAQ,EAAE,OAAO,EAAE,OAAO,EAAE,QAAQ,EAAE,MAAM,QAAQ,CAAC;AAC3E,OAAO,EAAE,KAAK,EAAE,IAAI,EAAE,QAAQ,EAAE,OAAO,EAAE,OAAO,EAAE,QAAQ,EAAE,KAAK,QAAQ,EAAE,KAAK,WAAW,EAAE,KAAK,cAAc,EAAE,KAAK,WAAW,EAAE,KAAK,YAAY,EAAE,KAAK,WAAW,EAAE,KAAK,eAAe,EAAE,KAAK,YAAY,EAAE,MAAM,QAAQ,CAAC;AAejO,eAAO,MAAM,aAAa;;;;;;;;;;;;CAA2C,CAAC"}
|
package/esm/deno.d.ts
CHANGED
package/esm/deno.js
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
export default {
|
|
2
2
|
"name": "veryfront",
|
|
3
|
-
"version": "0.0.
|
|
3
|
+
"version": "0.0.89",
|
|
4
4
|
"nodeModulesDir": "auto",
|
|
5
5
|
"exclude": [
|
|
6
6
|
"npm/",
|
|
@@ -195,12 +195,12 @@ export default {
|
|
|
195
195
|
"csstype": "https://esm.sh/csstype@3.2.3",
|
|
196
196
|
"@types/react": "https://esm.sh/@types/react@18.3.27?deps=csstype@3.2.3",
|
|
197
197
|
"@types/react-dom": "https://esm.sh/@types/react-dom@18.3.7?deps=csstype@3.2.3",
|
|
198
|
-
"react": "
|
|
199
|
-
"react-dom": "
|
|
200
|
-
"react-dom/server": "
|
|
201
|
-
"react-dom/client": "
|
|
202
|
-
"react/jsx-runtime": "
|
|
203
|
-
"react/jsx-dev-runtime": "
|
|
198
|
+
"react": "https://esm.sh/react@19.1.1?target=es2022&deps=csstype@3.2.3",
|
|
199
|
+
"react-dom": "https://esm.sh/react-dom@19.1.1?external=react&target=es2022&deps=csstype@3.2.3",
|
|
200
|
+
"react-dom/server": "https://esm.sh/react-dom@19.1.1/server?external=react&target=es2022&deps=csstype@3.2.3",
|
|
201
|
+
"react-dom/client": "https://esm.sh/react-dom@19.1.1/client?external=react&target=es2022&deps=csstype@3.2.3",
|
|
202
|
+
"react/jsx-runtime": "https://esm.sh/react@19.1.1/jsx-runtime?external=react&target=es2022&deps=csstype@3.2.3",
|
|
203
|
+
"react/jsx-dev-runtime": "https://esm.sh/react@19.1.1/jsx-dev-runtime?external=react&target=es2022&deps=csstype@3.2.3",
|
|
204
204
|
"@mdx-js/mdx": "npm:@mdx-js/mdx@3.0.0",
|
|
205
205
|
"@mdx-js/react": "npm:@mdx-js/react@3.0.0",
|
|
206
206
|
"unist-util-visit": "npm:unist-util-visit@5.0.0",
|
|
@@ -264,8 +264,7 @@ export default {
|
|
|
264
264
|
},
|
|
265
265
|
"tasks": {
|
|
266
266
|
"setup": "deno run --allow-all scripts/setup.ts",
|
|
267
|
-
"start": "deno run --allow-all scripts/server.ts",
|
|
268
|
-
"start:clean": "rm -rf .cache/ && deno run --allow-all scripts/server.ts",
|
|
267
|
+
"start": "rm -rf .cache/ && deno run --allow-all scripts/server.ts",
|
|
269
268
|
"start:headless": "deno run --allow-all scripts/server.ts --headless",
|
|
270
269
|
"proxy": "deno run --allow-net --allow-env --allow-read proxy/main.ts",
|
|
271
270
|
"renderer": "deno run --allow-all --unstable-net --unstable-worker-options src/cli/main.ts dev",
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"main.d.ts","sourceRoot":"","sources":["../../src/proxy/main.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,400 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Veryfront Proxy Server (Split Mode)
|
|
3
|
+
*
|
|
4
|
+
* Standalone proxy server that forwards requests to a separate renderer process.
|
|
5
|
+
* Used in production for security isolation of OAuth credentials.
|
|
6
|
+
*
|
|
7
|
+
* For combined mode (single process), use the renderer with --proxy flag instead.
|
|
8
|
+
*
|
|
9
|
+
* Environment Variables:
|
|
10
|
+
* - API_CLIENT_ID_VERYFRONT_RENDERER_PROXY: OAuth client ID (from 1Password)
|
|
11
|
+
* - API_CLIENT_SECRET_VERYFRONT_RENDERER_PROXY: OAuth client secret (from 1Password)
|
|
12
|
+
* - RENDERER_URL: URL of the renderer service
|
|
13
|
+
* - LOCAL_PROJECTS: JSON map of slug → filesystem path (for dev)
|
|
14
|
+
* - CACHE_TYPE: "memory" (default) or "redis"
|
|
15
|
+
* - REDIS_URL: Redis connection URL (required if CACHE_TYPE=redis)
|
|
16
|
+
*/
|
|
17
|
+
import * as dntShim from "../_dnt.shims.js";
|
|
18
|
+
import { createProxyHandler } from "./handler.js";
|
|
19
|
+
import { createCacheFromEnv } from "./cache/index.js";
|
|
20
|
+
import { endSpan, extractContext, initializeOTLPWithApis, injectContext, ProxySpanNames, shutdownOTLP, startServerSpan, withContext, withSpan, } from "./tracing.js";
|
|
21
|
+
import { proxyLogger } from "./logger.js";
|
|
22
|
+
import { parseProjectDomain } from "../src/server/utils/domain-parser.js";
|
|
23
|
+
import { exit, getEnv, onSignal } from "../src/platform/compat/process.js";
|
|
24
|
+
import { createHttpServer, upgradeWebSocket } from "../src/platform/compat/http/index.js";
|
|
25
|
+
// Configuration from environment variables
|
|
26
|
+
const config = {
|
|
27
|
+
apiBaseUrl: getEnv("VERYFRONT_API_BASE_URL") ||
|
|
28
|
+
"http://api.lvh.me:4000",
|
|
29
|
+
clientId: getEnv("API_CLIENT_ID_VERYFRONT_RENDERER_PROXY") || "",
|
|
30
|
+
clientSecret: getEnv("API_CLIENT_SECRET_VERYFRONT_RENDERER_PROXY") || "",
|
|
31
|
+
// Preview uses same service account (scopes determine access)
|
|
32
|
+
previewClientId: getEnv("API_CLIENT_ID_VERYFRONT_RENDERER_PROXY") || "",
|
|
33
|
+
previewClientSecret: getEnv("API_CLIENT_SECRET_VERYFRONT_RENDERER_PROXY") || "",
|
|
34
|
+
localProjects: getEnv("LOCAL_PROJECTS") ? JSON.parse(getEnv("LOCAL_PROJECTS")) : {},
|
|
35
|
+
};
|
|
36
|
+
const RENDERER_URL = getEnv("RENDERER_URL") || "http://localhost:3001";
|
|
37
|
+
const PORT = parseInt(getEnv("PORT") || "8080");
|
|
38
|
+
const HOST = getEnv("HOST") || "0.0.0.0"; // Default to 0.0.0.0 for Kubernetes
|
|
39
|
+
const WS_CONNECT_TIMEOUT_MS = 30000;
|
|
40
|
+
// Timeout for forwarding requests to renderer (SSR can take time on cold start)
|
|
41
|
+
const RENDERER_REQUEST_TIMEOUT_MS = parseInt(getEnv("RENDERER_REQUEST_TIMEOUT_MS") || "90000");
|
|
42
|
+
// Initialize cache and proxy handler
|
|
43
|
+
const cache = await createCacheFromEnv();
|
|
44
|
+
const proxyHandler = createProxyHandler({
|
|
45
|
+
config,
|
|
46
|
+
cache,
|
|
47
|
+
logger: {
|
|
48
|
+
debug: (msg, extra) => proxyLogger.debug(msg, extra),
|
|
49
|
+
info: (msg, extra) => proxyLogger.info(msg, extra),
|
|
50
|
+
warn: (msg, extra) => proxyLogger.warn(msg, extra),
|
|
51
|
+
error: (msg, error, extra) => proxyLogger.error(msg, extra ?? {}, error),
|
|
52
|
+
},
|
|
53
|
+
});
|
|
54
|
+
// Validate configuration on startup
|
|
55
|
+
const missingCredentials = proxyHandler.validateConfig();
|
|
56
|
+
if (missingCredentials.length > 0) {
|
|
57
|
+
proxyLogger.warn("Missing OAuth credentials", { missingCredentials });
|
|
58
|
+
proxyLogger.warn("Proxy will forward requests without authentication");
|
|
59
|
+
}
|
|
60
|
+
// Log local projects if configured
|
|
61
|
+
if (Object.keys(proxyHandler.localProjects).length > 0) {
|
|
62
|
+
proxyLogger.info("Local projects configured", {
|
|
63
|
+
projects: Object.keys(proxyHandler.localProjects),
|
|
64
|
+
});
|
|
65
|
+
}
|
|
66
|
+
/**
|
|
67
|
+
* Handle WebSocket upgrade requests.
|
|
68
|
+
* Bridges browser WebSocket to renderer's HMR WebSocket endpoint.
|
|
69
|
+
*/
|
|
70
|
+
function handleWebSocketUpgrade(req) {
|
|
71
|
+
const url = new URL(req.url);
|
|
72
|
+
const host = req.headers.get("host") || "";
|
|
73
|
+
// Parse domain to extract project slug and environment
|
|
74
|
+
const parsed = parseProjectDomain(host);
|
|
75
|
+
const scope = parsed.environment === "preview" ? "preview" : "production";
|
|
76
|
+
const projectSlug = parsed.slug || undefined;
|
|
77
|
+
// Build renderer WebSocket URL
|
|
78
|
+
const rendererWsUrl = RENDERER_URL.replace(/^http/, "ws");
|
|
79
|
+
const targetUrl = new URL(`${rendererWsUrl}${url.pathname}${url.search}`);
|
|
80
|
+
targetUrl.searchParams.set("x-project-slug", projectSlug || "");
|
|
81
|
+
targetUrl.searchParams.set("x-environment", scope);
|
|
82
|
+
proxyLogger.info("[WebSocket] Upgrade request received", {
|
|
83
|
+
host,
|
|
84
|
+
path: url.pathname,
|
|
85
|
+
projectSlug,
|
|
86
|
+
environment: scope,
|
|
87
|
+
parsedEnvironment: parsed.environment,
|
|
88
|
+
targetUrl: targetUrl.toString(),
|
|
89
|
+
});
|
|
90
|
+
const { socket: clientSocket, response } = upgradeWebSocket(req);
|
|
91
|
+
let rendererSocket = null;
|
|
92
|
+
let connectTimeoutId = null;
|
|
93
|
+
let timedOut = false;
|
|
94
|
+
const clearConnectTimeout = () => {
|
|
95
|
+
if (connectTimeoutId) {
|
|
96
|
+
clearTimeout(connectTimeoutId);
|
|
97
|
+
connectTimeoutId = null;
|
|
98
|
+
}
|
|
99
|
+
};
|
|
100
|
+
clientSocket.onopen = () => {
|
|
101
|
+
proxyLogger.info("[WebSocket] Client connected, bridging to renderer", {
|
|
102
|
+
targetUrl: targetUrl.toString(),
|
|
103
|
+
});
|
|
104
|
+
try {
|
|
105
|
+
rendererSocket = new WebSocket(targetUrl.toString());
|
|
106
|
+
}
|
|
107
|
+
catch (error) {
|
|
108
|
+
proxyLogger.error("[WebSocket] Failed to create renderer WebSocket", {
|
|
109
|
+
error: error instanceof Error ? error.message : String(error),
|
|
110
|
+
targetUrl: targetUrl.toString(),
|
|
111
|
+
});
|
|
112
|
+
clientSocket.close(1011, "Failed to connect to renderer");
|
|
113
|
+
return;
|
|
114
|
+
}
|
|
115
|
+
connectTimeoutId = dntShim.setTimeout(() => {
|
|
116
|
+
timedOut = true;
|
|
117
|
+
proxyLogger.error("[WebSocket] Renderer connection timeout", {
|
|
118
|
+
targetUrl: targetUrl.toString(),
|
|
119
|
+
timeoutMs: WS_CONNECT_TIMEOUT_MS,
|
|
120
|
+
});
|
|
121
|
+
rendererSocket?.close();
|
|
122
|
+
if (clientSocket.readyState === WebSocket.OPEN) {
|
|
123
|
+
clientSocket.close(1001, "Renderer connection timeout");
|
|
124
|
+
}
|
|
125
|
+
}, WS_CONNECT_TIMEOUT_MS);
|
|
126
|
+
rendererSocket.onopen = () => {
|
|
127
|
+
clearConnectTimeout();
|
|
128
|
+
if (timedOut) {
|
|
129
|
+
rendererSocket?.close();
|
|
130
|
+
return;
|
|
131
|
+
}
|
|
132
|
+
proxyLogger.info("[WebSocket] Renderer connected, bridge established", {
|
|
133
|
+
projectSlug,
|
|
134
|
+
environment: scope,
|
|
135
|
+
});
|
|
136
|
+
};
|
|
137
|
+
rendererSocket.onmessage = (event) => {
|
|
138
|
+
if (clientSocket.readyState === WebSocket.OPEN) {
|
|
139
|
+
clientSocket.send(event.data);
|
|
140
|
+
}
|
|
141
|
+
};
|
|
142
|
+
rendererSocket.onerror = (event) => {
|
|
143
|
+
clearConnectTimeout();
|
|
144
|
+
proxyLogger.error("[WebSocket] Renderer connection error", {
|
|
145
|
+
projectSlug,
|
|
146
|
+
environment: scope,
|
|
147
|
+
targetUrl: targetUrl.toString(),
|
|
148
|
+
error: event instanceof ErrorEvent ? event.message : "Unknown error",
|
|
149
|
+
});
|
|
150
|
+
};
|
|
151
|
+
rendererSocket.onclose = (event) => {
|
|
152
|
+
clearConnectTimeout();
|
|
153
|
+
proxyLogger.info("[WebSocket] Renderer connection closed", {
|
|
154
|
+
code: event.code,
|
|
155
|
+
reason: event.reason,
|
|
156
|
+
wasClean: event.wasClean,
|
|
157
|
+
});
|
|
158
|
+
if (clientSocket.readyState === WebSocket.OPEN) {
|
|
159
|
+
clientSocket.close(event.code, event.reason);
|
|
160
|
+
}
|
|
161
|
+
};
|
|
162
|
+
};
|
|
163
|
+
clientSocket.onmessage = (event) => {
|
|
164
|
+
if (rendererSocket?.readyState === WebSocket.OPEN) {
|
|
165
|
+
rendererSocket.send(event.data);
|
|
166
|
+
}
|
|
167
|
+
};
|
|
168
|
+
clientSocket.onerror = (event) => {
|
|
169
|
+
clearConnectTimeout();
|
|
170
|
+
proxyLogger.error("[WebSocket] Client connection error", {
|
|
171
|
+
error: event instanceof ErrorEvent ? event.message : "Unknown error",
|
|
172
|
+
});
|
|
173
|
+
};
|
|
174
|
+
clientSocket.onclose = (event) => {
|
|
175
|
+
clearConnectTimeout();
|
|
176
|
+
proxyLogger.info("[WebSocket] Client connection closed", {
|
|
177
|
+
code: event.code,
|
|
178
|
+
reason: event.reason,
|
|
179
|
+
wasClean: event.wasClean,
|
|
180
|
+
});
|
|
181
|
+
if (rendererSocket?.readyState === WebSocket.OPEN) {
|
|
182
|
+
rendererSocket.close();
|
|
183
|
+
}
|
|
184
|
+
};
|
|
185
|
+
return response;
|
|
186
|
+
}
|
|
187
|
+
function jsonErrorResponse(status, body) {
|
|
188
|
+
return new dntShim.Response(JSON.stringify(body), {
|
|
189
|
+
status,
|
|
190
|
+
headers: { "Content-Type": "application/json" },
|
|
191
|
+
});
|
|
192
|
+
}
|
|
193
|
+
function forwardToRenderer(req) {
|
|
194
|
+
const startTime = performance.now();
|
|
195
|
+
const url = new URL(req.url);
|
|
196
|
+
const parentContext = extractContext(req.headers);
|
|
197
|
+
const spanInfo = startServerSpan(req.method, url.pathname, parentContext);
|
|
198
|
+
const execute = async () => {
|
|
199
|
+
try {
|
|
200
|
+
const ctx = await proxyHandler.processRequest(req);
|
|
201
|
+
if (ctx.error) {
|
|
202
|
+
const ms = Math.round(performance.now() - startTime);
|
|
203
|
+
proxyLogger.error(`${ctx.error.status} ${req.method} ${url.pathname}`, {
|
|
204
|
+
ms,
|
|
205
|
+
domain: ctx.host,
|
|
206
|
+
});
|
|
207
|
+
endSpan(spanInfo?.span, ctx.error.status);
|
|
208
|
+
// Handle redirect for protected environments
|
|
209
|
+
if (ctx.error.redirectUrl) {
|
|
210
|
+
return new dntShim.Response(null, {
|
|
211
|
+
status: 302,
|
|
212
|
+
headers: { Location: ctx.error.redirectUrl },
|
|
213
|
+
});
|
|
214
|
+
}
|
|
215
|
+
return jsonErrorResponse(ctx.error.status, {
|
|
216
|
+
error: ctx.error.message,
|
|
217
|
+
status: ctx.error.status,
|
|
218
|
+
});
|
|
219
|
+
}
|
|
220
|
+
const reqLogger = proxyLogger.child({
|
|
221
|
+
...(ctx.projectSlug && { project: ctx.projectSlug }),
|
|
222
|
+
env: ctx.environment,
|
|
223
|
+
});
|
|
224
|
+
const newHeaders = new dntShim.Headers(req.headers);
|
|
225
|
+
if (ctx.token)
|
|
226
|
+
newHeaders.set("x-token", ctx.token);
|
|
227
|
+
newHeaders.set("x-project-slug", ctx.projectSlug || "");
|
|
228
|
+
newHeaders.set("x-environment", ctx.environment);
|
|
229
|
+
newHeaders.set("x-forwarded-host", ctx.host);
|
|
230
|
+
if (ctx.localPath)
|
|
231
|
+
newHeaders.set("x-project-path", ctx.localPath);
|
|
232
|
+
// Forward project/release context for cache keying
|
|
233
|
+
if (ctx.projectId)
|
|
234
|
+
newHeaders.set("x-project-id", ctx.projectId);
|
|
235
|
+
if (ctx.releaseId)
|
|
236
|
+
newHeaders.set("x-release-id", ctx.releaseId);
|
|
237
|
+
if (ctx.branchId)
|
|
238
|
+
newHeaders.set("x-branch-id", ctx.branchId);
|
|
239
|
+
if (ctx.branchName)
|
|
240
|
+
newHeaders.set("x-branch-name", ctx.branchName);
|
|
241
|
+
newHeaders.delete("host");
|
|
242
|
+
injectContext(newHeaders);
|
|
243
|
+
const rendererUrl = new URL(url.pathname + url.search, RENDERER_URL);
|
|
244
|
+
// Create abort controller for timeout
|
|
245
|
+
const abortController = new AbortController();
|
|
246
|
+
const timeoutId = dntShim.setTimeout(() => {
|
|
247
|
+
abortController.abort();
|
|
248
|
+
}, RENDERER_REQUEST_TIMEOUT_MS);
|
|
249
|
+
let response;
|
|
250
|
+
try {
|
|
251
|
+
response = await withSpan(ProxySpanNames.HTTP_CLIENT_FETCH, () => dntShim.fetch(rendererUrl.toString(), {
|
|
252
|
+
method: req.method,
|
|
253
|
+
headers: newHeaders,
|
|
254
|
+
body: req.body,
|
|
255
|
+
redirect: "manual",
|
|
256
|
+
signal: abortController.signal,
|
|
257
|
+
}), {
|
|
258
|
+
"http.method": req.method,
|
|
259
|
+
"http.url": rendererUrl.toString(),
|
|
260
|
+
"http.host": rendererUrl.host,
|
|
261
|
+
"proxy.target": "renderer",
|
|
262
|
+
"proxy.project_slug": ctx.projectSlug || "",
|
|
263
|
+
"proxy.timeout_ms": RENDERER_REQUEST_TIMEOUT_MS,
|
|
264
|
+
});
|
|
265
|
+
}
|
|
266
|
+
finally {
|
|
267
|
+
clearTimeout(timeoutId);
|
|
268
|
+
}
|
|
269
|
+
const ms = Math.round(performance.now() - startTime);
|
|
270
|
+
reqLogger.info(`${response.status} ${req.method} ${url.pathname}`, { ms });
|
|
271
|
+
endSpan(spanInfo?.span, response.status);
|
|
272
|
+
return new dntShim.Response(response.body, {
|
|
273
|
+
status: response.status,
|
|
274
|
+
statusText: response.statusText,
|
|
275
|
+
headers: response.headers,
|
|
276
|
+
});
|
|
277
|
+
}
|
|
278
|
+
catch (error) {
|
|
279
|
+
const ms = Math.round(performance.now() - startTime);
|
|
280
|
+
// Handle timeout specifically
|
|
281
|
+
if (error instanceof Error && error.name === "AbortError") {
|
|
282
|
+
proxyLogger.error(`504 ${req.method} ${url.pathname}`, {
|
|
283
|
+
ms,
|
|
284
|
+
timeoutMs: RENDERER_REQUEST_TIMEOUT_MS,
|
|
285
|
+
});
|
|
286
|
+
endSpan(spanInfo?.span, 504, error);
|
|
287
|
+
return jsonErrorResponse(504, {
|
|
288
|
+
error: "Gateway Timeout",
|
|
289
|
+
message: `Renderer request timed out after ${RENDERER_REQUEST_TIMEOUT_MS}ms`,
|
|
290
|
+
});
|
|
291
|
+
}
|
|
292
|
+
proxyLogger.error(`502 ${req.method} ${url.pathname}`, { ms }, error);
|
|
293
|
+
endSpan(spanInfo?.span, 502, error);
|
|
294
|
+
return jsonErrorResponse(502, {
|
|
295
|
+
error: "Proxy Error",
|
|
296
|
+
message: error instanceof Error ? error.message : "Unknown error",
|
|
297
|
+
});
|
|
298
|
+
}
|
|
299
|
+
};
|
|
300
|
+
return spanInfo?.context ? withContext(spanInfo.context, execute) : execute();
|
|
301
|
+
}
|
|
302
|
+
/**
|
|
303
|
+
* Handle stats endpoint for monitoring.
|
|
304
|
+
*/
|
|
305
|
+
async function handleStats() {
|
|
306
|
+
const stats = await proxyHandler.getStats();
|
|
307
|
+
return new dntShim.Response(JSON.stringify(stats, null, 2), {
|
|
308
|
+
headers: { "Content-Type": "application/json" },
|
|
309
|
+
});
|
|
310
|
+
}
|
|
311
|
+
/**
|
|
312
|
+
* Proxy API requests directly to Veryfront API (BFF pattern).
|
|
313
|
+
* Routes: /_vf/api/* -> api.veryfront.com/*
|
|
314
|
+
*/
|
|
315
|
+
async function handleApiProxy(req) {
|
|
316
|
+
const url = new URL(req.url);
|
|
317
|
+
const token = await proxyHandler.getTokenForApi(req);
|
|
318
|
+
if (!token) {
|
|
319
|
+
return jsonErrorResponse(401, { error: "No authentication token" });
|
|
320
|
+
}
|
|
321
|
+
// Strip /_vf/api prefix and forward to API
|
|
322
|
+
const apiPath = url.pathname.replace(/^\/_vf\/api/, "");
|
|
323
|
+
const apiUrl = `${config.apiBaseUrl}${apiPath}${url.search}`;
|
|
324
|
+
const apiUrlObj = new URL(apiUrl);
|
|
325
|
+
try {
|
|
326
|
+
const response = await withSpan(ProxySpanNames.HTTP_CLIENT_FETCH, () => dntShim.fetch(apiUrl, {
|
|
327
|
+
method: req.method,
|
|
328
|
+
headers: {
|
|
329
|
+
Authorization: `Bearer ${token}`,
|
|
330
|
+
Accept: "application/json",
|
|
331
|
+
"Content-Type": req.headers.get("Content-Type") || "application/json",
|
|
332
|
+
},
|
|
333
|
+
body: req.method !== "GET" && req.method !== "HEAD" ? req.body : undefined,
|
|
334
|
+
}), {
|
|
335
|
+
"http.method": req.method,
|
|
336
|
+
"http.url": apiUrl,
|
|
337
|
+
"http.host": apiUrlObj.host,
|
|
338
|
+
"proxy.target": "api",
|
|
339
|
+
"proxy.api_path": apiPath,
|
|
340
|
+
});
|
|
341
|
+
return new dntShim.Response(response.body, {
|
|
342
|
+
status: response.status,
|
|
343
|
+
statusText: response.statusText,
|
|
344
|
+
headers: {
|
|
345
|
+
"Content-Type": response.headers.get("Content-Type") ||
|
|
346
|
+
"application/json",
|
|
347
|
+
"Cache-Control": "no-cache",
|
|
348
|
+
},
|
|
349
|
+
});
|
|
350
|
+
}
|
|
351
|
+
catch (error) {
|
|
352
|
+
proxyLogger.error("API proxy error", error);
|
|
353
|
+
return jsonErrorResponse(502, {
|
|
354
|
+
error: error instanceof Error ? error.message : "API request failed",
|
|
355
|
+
});
|
|
356
|
+
}
|
|
357
|
+
}
|
|
358
|
+
/**
|
|
359
|
+
* Main router.
|
|
360
|
+
*/
|
|
361
|
+
function router(req) {
|
|
362
|
+
const url = new URL(req.url);
|
|
363
|
+
// WebSocket upgrade
|
|
364
|
+
if (req.headers.get("upgrade")?.toLowerCase() === "websocket") {
|
|
365
|
+
return Promise.resolve(handleWebSocketUpgrade(req));
|
|
366
|
+
}
|
|
367
|
+
// Proxy endpoints
|
|
368
|
+
if (url.pathname === "/_proxy/stats") {
|
|
369
|
+
return handleStats();
|
|
370
|
+
}
|
|
371
|
+
if (url.pathname === "/_proxy/health") {
|
|
372
|
+
return Promise.resolve(new dntShim.Response("OK", { status: 200 }));
|
|
373
|
+
}
|
|
374
|
+
// BFF: Proxy API requests directly to Veryfront API
|
|
375
|
+
if (url.pathname.startsWith("/_vf/api/")) {
|
|
376
|
+
return handleApiProxy(req);
|
|
377
|
+
}
|
|
378
|
+
// Forward all other requests to renderer
|
|
379
|
+
return forwardToRenderer(req);
|
|
380
|
+
}
|
|
381
|
+
// Graceful shutdown
|
|
382
|
+
async function shutdown() {
|
|
383
|
+
proxyLogger.info("Shutting down");
|
|
384
|
+
await proxyHandler.close();
|
|
385
|
+
await shutdownOTLP();
|
|
386
|
+
proxyLogger.info("Closed connections");
|
|
387
|
+
exit(0);
|
|
388
|
+
}
|
|
389
|
+
onSignal("SIGINT", shutdown);
|
|
390
|
+
onSignal("SIGTERM", shutdown);
|
|
391
|
+
// Initialize tracing and start server
|
|
392
|
+
await initializeOTLPWithApis();
|
|
393
|
+
proxyLogger.debug("Starting proxy server (split mode)", {
|
|
394
|
+
port: PORT,
|
|
395
|
+
rendererUrl: RENDERER_URL,
|
|
396
|
+
apiBaseUrl: config.apiBaseUrl,
|
|
397
|
+
});
|
|
398
|
+
// Create and start the HTTP server
|
|
399
|
+
const server = createHttpServer();
|
|
400
|
+
await server.serve(router, { port: PORT, hostname: HOST });
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"arg-parser.d.ts","sourceRoot":"","sources":["../../../../src/src/cli/index/arg-parser.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AA+E7C,wBAAgB,aAAa,CAAC,GAAG,EAAE,OAAO,GAAG,MAAM,EAAE,GAAG,SAAS,CAIhE;AAED,wBAAgB,YAAY,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,UAAU,
|
|
1
|
+
{"version":3,"file":"arg-parser.d.ts","sourceRoot":"","sources":["../../../../src/src/cli/index/arg-parser.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AA+E7C,wBAAgB,aAAa,CAAC,GAAG,EAAE,OAAO,GAAG,MAAM,EAAE,GAAG,SAAS,CAIhE;AAED,wBAAgB,YAAY,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,UAAU,CAgBvD"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"command-router.d.ts","sourceRoot":"","sources":["../../../../src/src/cli/index/command-router.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAwCH,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AAsD7C;;;;GAIG;AACH,wBAAsB,YAAY,CAAC,IAAI,EAAE,UAAU,GAAG,OAAO,CAAC,IAAI,CAAC,
|
|
1
|
+
{"version":3,"file":"command-router.d.ts","sourceRoot":"","sources":["../../../../src/src/cli/index/command-router.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAwCH,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AAsD7C;;;;GAIG;AACH,wBAAsB,YAAY,CAAC,IAAI,EAAE,UAAU,GAAG,OAAO,CAAC,IAAI,CAAC,CAyYlE"}
|
|
@@ -170,47 +170,62 @@ export async function routeCommand(args) {
|
|
|
170
170
|
break;
|
|
171
171
|
case "preview":
|
|
172
172
|
case "serve": {
|
|
173
|
-
|
|
174
|
-
const { runtime } = await import("../../platform/adapters/detect.js");
|
|
175
|
-
const adapter = await runtime.get();
|
|
176
|
-
const { startUniversalServer } = await import("../../server/production-server.js");
|
|
177
|
-
const projectDir = cwd();
|
|
173
|
+
const mode = (args.mode || args.m || "renderer");
|
|
178
174
|
const port = args.port ?? DEFAULT_DEV_SERVER_PORT;
|
|
179
175
|
const bindAddress = String(args.hostname || args.host || "0.0.0.0");
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
|
|
195
|
-
|
|
196
|
-
|
|
197
|
-
|
|
198
|
-
|
|
199
|
-
|
|
200
|
-
|
|
201
|
-
|
|
202
|
-
|
|
203
|
-
|
|
204
|
-
|
|
205
|
-
|
|
206
|
-
|
|
207
|
-
|
|
208
|
-
|
|
209
|
-
|
|
210
|
-
|
|
211
|
-
|
|
212
|
-
|
|
213
|
-
|
|
176
|
+
if (mode === "proxy") {
|
|
177
|
+
// Proxy-only mode: run OAuth token proxy
|
|
178
|
+
showLogo();
|
|
179
|
+
cliLogger.info(`Starting proxy server on ${bindAddress}:${port}`);
|
|
180
|
+
// Set environment variables for proxy
|
|
181
|
+
const { setEnv } = await import("../../platform/compat/process.js");
|
|
182
|
+
setEnv("PORT", String(port));
|
|
183
|
+
setEnv("HOST", bindAddress);
|
|
184
|
+
// Import and run proxy main
|
|
185
|
+
await import("../../../proxy/main.js");
|
|
186
|
+
}
|
|
187
|
+
else if (mode === "renderer" || mode === "combined") {
|
|
188
|
+
// Renderer mode: run SSR production server
|
|
189
|
+
showLogo();
|
|
190
|
+
const { runtime } = await import("../../platform/adapters/detect.js");
|
|
191
|
+
const adapter = await runtime.get();
|
|
192
|
+
const { startUniversalServer } = await import("../../server/production-server.js");
|
|
193
|
+
const projectDir = cwd();
|
|
194
|
+
const debug = Boolean(args.debug);
|
|
195
|
+
const shutdownController = new AbortController();
|
|
196
|
+
const server = await startUniversalServer({
|
|
197
|
+
projectDir,
|
|
198
|
+
port,
|
|
199
|
+
bindAddress,
|
|
200
|
+
debug,
|
|
201
|
+
adapter,
|
|
202
|
+
signal: shutdownController.signal,
|
|
203
|
+
});
|
|
204
|
+
await server.ready;
|
|
205
|
+
let shuttingDown = false;
|
|
206
|
+
const shutdown = async (signal) => {
|
|
207
|
+
if (shuttingDown)
|
|
208
|
+
return;
|
|
209
|
+
shuttingDown = true;
|
|
210
|
+
cliLogger.info(`Received ${signal}, shutting down production server...`);
|
|
211
|
+
try {
|
|
212
|
+
shutdownController.abort();
|
|
213
|
+
await server.stop();
|
|
214
|
+
}
|
|
215
|
+
catch (error) {
|
|
216
|
+
cliLogger.warn("Error while shutting down production server:", error);
|
|
217
|
+
}
|
|
218
|
+
finally {
|
|
219
|
+
exitProcess(0);
|
|
220
|
+
}
|
|
221
|
+
};
|
|
222
|
+
registerTerminationSignals((signal) => {
|
|
223
|
+
void shutdown(signal);
|
|
224
|
+
});
|
|
225
|
+
await new Promise(() => {
|
|
226
|
+
/* never resolve */
|
|
227
|
+
});
|
|
228
|
+
}
|
|
214
229
|
break;
|
|
215
230
|
}
|
|
216
231
|
case "doctor":
|
|
@@ -16,6 +16,7 @@ export interface BuildCommandArgs {
|
|
|
16
16
|
export interface GenerateCommandArgs {
|
|
17
17
|
_: (string | number)[];
|
|
18
18
|
}
|
|
19
|
+
export type ServerMode = "combined" | "proxy" | "renderer";
|
|
19
20
|
export interface ParsedArgs {
|
|
20
21
|
_: (string | number)[];
|
|
21
22
|
port?: number;
|
|
@@ -39,6 +40,9 @@ export interface ParsedArgs {
|
|
|
39
40
|
j?: boolean;
|
|
40
41
|
with?: string[];
|
|
41
42
|
w?: string[];
|
|
43
|
+
/** Server mode: combined (default), proxy, or renderer */
|
|
44
|
+
mode?: ServerMode;
|
|
45
|
+
m?: ServerMode;
|
|
42
46
|
[key: string]: unknown;
|
|
43
47
|
}
|
|
44
48
|
//# sourceMappingURL=types.d.ts.map
|