veryfront 0.1.74 → 0.1.76
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/README.md +2 -0
- package/esm/cli/commands/files/command.d.ts +3 -3
- package/esm/cli/commands/knowledge/command.d.ts +2 -0
- package/esm/cli/commands/knowledge/command.d.ts.map +1 -1
- package/esm/cli/commands/knowledge/command.js +64 -1
- package/esm/deno.d.ts +7 -0
- package/esm/deno.js +13 -6
- package/esm/src/data/data-fetcher.d.ts +11 -1
- package/esm/src/data/data-fetcher.d.ts.map +1 -1
- package/esm/src/data/data-fetcher.js +5 -2
- package/esm/src/data/index.d.ts +1 -1
- package/esm/src/data/index.d.ts.map +1 -1
- package/esm/src/data/server-data-fetcher.d.ts +14 -1
- package/esm/src/data/server-data-fetcher.d.ts.map +1 -1
- package/esm/src/data/server-data-fetcher.js +65 -3
- package/esm/src/jobs/index.d.ts +34 -0
- package/esm/src/jobs/index.d.ts.map +1 -0
- package/esm/src/jobs/index.js +33 -0
- package/esm/src/jobs/jobs-client.d.ts +134 -0
- package/esm/src/jobs/jobs-client.d.ts.map +1 -0
- package/esm/src/jobs/jobs-client.js +218 -0
- package/esm/src/jobs/schemas.d.ts +1304 -0
- package/esm/src/jobs/schemas.d.ts.map +1 -0
- package/esm/src/jobs/schemas.js +159 -0
- package/esm/src/platform/adapters/veryfront-api-client/retry-handler.d.ts +4 -0
- package/esm/src/platform/adapters/veryfront-api-client/retry-handler.d.ts.map +1 -1
- package/esm/src/platform/adapters/veryfront-api-client/retry-handler.js +12 -6
- package/esm/src/proxy/handler.d.ts.map +1 -1
- package/esm/src/proxy/handler.js +21 -21
- package/esm/src/rendering/orchestrator/lifecycle.d.ts +4 -0
- package/esm/src/rendering/orchestrator/lifecycle.d.ts.map +1 -1
- package/esm/src/rendering/orchestrator/lifecycle.js +8 -0
- package/esm/src/rendering/orchestrator/pipeline.d.ts.map +1 -1
- package/esm/src/rendering/orchestrator/pipeline.js +6 -1
- package/esm/src/rendering/orchestrator/ssr-orchestrator.d.ts +26 -1
- package/esm/src/rendering/orchestrator/ssr-orchestrator.d.ts.map +1 -1
- package/esm/src/rendering/orchestrator/ssr-orchestrator.js +77 -1
- package/esm/src/routing/api/handler.d.ts.map +1 -1
- package/esm/src/routing/api/handler.js +6 -2
- package/esm/src/routing/api/route-executor.d.ts +8 -2
- package/esm/src/routing/api/route-executor.d.ts.map +1 -1
- package/esm/src/routing/api/route-executor.js +158 -3
- package/esm/src/security/deno-permissions.d.ts +7 -1
- package/esm/src/security/deno-permissions.d.ts.map +1 -1
- package/esm/src/security/deno-permissions.js +12 -1
- package/esm/src/security/sandbox/project-worker.d.ts +61 -0
- package/esm/src/security/sandbox/project-worker.d.ts.map +1 -0
- package/esm/src/security/sandbox/project-worker.js +318 -0
- package/esm/src/security/sandbox/worker-permissions.d.ts +30 -0
- package/esm/src/security/sandbox/worker-permissions.d.ts.map +1 -0
- package/esm/src/security/sandbox/worker-permissions.js +63 -0
- package/esm/src/security/sandbox/worker-pool.d.ts +87 -0
- package/esm/src/security/sandbox/worker-pool.d.ts.map +1 -0
- package/esm/src/security/sandbox/worker-pool.js +359 -0
- package/esm/src/security/sandbox/worker-types.d.ts +167 -0
- package/esm/src/security/sandbox/worker-types.d.ts.map +1 -0
- package/esm/src/security/sandbox/worker-types.js +19 -0
- package/esm/src/server/handlers/request/internal-tasks-list.handler.d.ts +11 -0
- package/esm/src/server/handlers/request/internal-tasks-list.handler.d.ts.map +1 -0
- package/esm/src/server/handlers/request/internal-tasks-list.handler.js +72 -0
- package/esm/src/server/project-env/storage.d.ts +6 -0
- package/esm/src/server/project-env/storage.d.ts.map +1 -1
- package/esm/src/server/project-env/storage.js +8 -0
- package/esm/src/server/runtime-handler/index.d.ts +1 -1
- package/esm/src/server/runtime-handler/index.d.ts.map +1 -1
- package/esm/src/server/runtime-handler/index.js +3 -0
- package/esm/src/server/runtime-handler/project-isolation.d.ts +5 -0
- package/esm/src/server/runtime-handler/project-isolation.d.ts.map +1 -1
- package/esm/src/server/runtime-handler/project-isolation.js +44 -0
- package/esm/src/server/shared/renderer/memory/pressure.d.ts +7 -0
- package/esm/src/server/shared/renderer/memory/pressure.d.ts.map +1 -1
- package/esm/src/server/shared/renderer/memory/pressure.js +7 -0
- package/esm/src/task/control-plane.d.ts +105 -0
- package/esm/src/task/control-plane.d.ts.map +1 -0
- package/esm/src/task/control-plane.js +52 -0
- package/esm/src/task/types.d.ts +6 -0
- package/esm/src/task/types.d.ts.map +1 -1
- package/esm/src/transforms/pipeline/stages/ssr-vf-modules/path-resolver.d.ts +4 -4
- package/esm/src/transforms/pipeline/stages/ssr-vf-modules/path-resolver.d.ts.map +1 -1
- package/esm/src/transforms/pipeline/stages/ssr-vf-modules/path-resolver.js +15 -15
- package/esm/src/utils/index.d.ts +10 -1
- package/esm/src/utils/index.d.ts.map +1 -1
- package/esm/src/utils/index.js +9 -1
- package/esm/src/utils/logger/index.d.ts +1 -1
- package/esm/src/utils/logger/index.d.ts.map +1 -1
- package/esm/src/utils/logger/index.js +1 -1
- package/esm/src/utils/logger/logger.d.ts +14 -0
- package/esm/src/utils/logger/logger.d.ts.map +1 -1
- package/esm/src/utils/logger/logger.js +17 -0
- package/esm/src/workflow/claude-code/tool.d.ts +5 -5
- package/package.json +8 -1
- package/src/cli/commands/knowledge/command.ts +76 -1
- package/src/deno.js +13 -6
- package/src/src/data/data-fetcher.ts +18 -2
- package/src/src/data/index.ts +1 -1
- package/src/src/data/server-data-fetcher.ts +106 -3
- package/src/src/jobs/index.ts +85 -0
- package/src/src/jobs/jobs-client.ts +503 -0
- package/src/src/jobs/schemas.ts +202 -0
- package/src/src/platform/adapters/veryfront-api-client/retry-handler.ts +15 -6
- package/src/src/proxy/handler.ts +27 -19
- package/src/src/rendering/orchestrator/lifecycle.ts +11 -0
- package/src/src/rendering/orchestrator/pipeline.ts +7 -2
- package/src/src/rendering/orchestrator/ssr-orchestrator.ts +119 -0
- package/src/src/routing/api/handler.ts +16 -3
- package/src/src/routing/api/route-executor.ts +258 -1
- package/src/src/security/deno-permissions.ts +13 -1
- package/src/src/security/sandbox/project-worker.ts +416 -0
- package/src/src/security/sandbox/worker-permissions.ts +77 -0
- package/src/src/security/sandbox/worker-pool.ts +459 -0
- package/src/src/security/sandbox/worker-types.ts +212 -0
- package/src/src/server/handlers/request/internal-tasks-list.handler.ts +103 -0
- package/src/src/server/project-env/storage.ts +9 -0
- package/src/src/server/runtime-handler/index.ts +3 -0
- package/src/src/server/runtime-handler/project-isolation.ts +53 -0
- package/src/src/server/shared/renderer/memory/pressure.ts +8 -0
- package/src/src/task/control-plane.ts +76 -0
- package/src/src/task/types.ts +6 -0
- package/src/src/transforms/pipeline/stages/ssr-vf-modules/path-resolver.ts +18 -12
- package/src/src/utils/index.ts +11 -0
- package/src/src/utils/logger/index.ts +1 -0
- package/src/src/utils/logger/logger.ts +34 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"schemas.d.ts","sourceRoot":"","sources":["../../../src/src/jobs/schemas.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,159 @@
|
|
|
1
|
+
import { z } from "zod";
|
|
2
|
+
export const JobStatusSchema = z.enum([
|
|
3
|
+
"submitted",
|
|
4
|
+
"working",
|
|
5
|
+
"completed",
|
|
6
|
+
"failed",
|
|
7
|
+
"canceled",
|
|
8
|
+
]);
|
|
9
|
+
export const CronJobStatusSchema = z.enum(["active", "paused", "deleting"]);
|
|
10
|
+
export const ReservedJobTargetFamilySchema = z.enum(["task:*", "workflow:*", "deploy:*"]);
|
|
11
|
+
export const PageInfoSchema = z.object({
|
|
12
|
+
self: z.string().nullable(),
|
|
13
|
+
first: z.literal(null),
|
|
14
|
+
next: z.string().nullable(),
|
|
15
|
+
prev: z.string().nullable(),
|
|
16
|
+
});
|
|
17
|
+
const JsonObjectSchema = z.record(z.unknown());
|
|
18
|
+
export const KnowledgeIngestFileResultSchema = z.object({
|
|
19
|
+
source: z.string(),
|
|
20
|
+
localSourcePath: z.string(),
|
|
21
|
+
outputPath: z.string(),
|
|
22
|
+
remotePath: z.string(),
|
|
23
|
+
slug: z.string(),
|
|
24
|
+
sourceType: z.string(),
|
|
25
|
+
summary: z.string(),
|
|
26
|
+
stats: JsonObjectSchema,
|
|
27
|
+
warnings: z.array(z.string()),
|
|
28
|
+
});
|
|
29
|
+
export const JobResultSchema = z
|
|
30
|
+
.discriminatedUnion("kind", [
|
|
31
|
+
z.object({
|
|
32
|
+
kind: z.literal("knowledge_ingest"),
|
|
33
|
+
files: z.array(KnowledgeIngestFileResultSchema),
|
|
34
|
+
}),
|
|
35
|
+
z.object({
|
|
36
|
+
kind: z.literal("artifacts"),
|
|
37
|
+
artifacts: z.array(z.unknown()),
|
|
38
|
+
}),
|
|
39
|
+
])
|
|
40
|
+
.nullable();
|
|
41
|
+
export const JobSchema = z.object({
|
|
42
|
+
id: z.string().uuid(),
|
|
43
|
+
project_id: z.string().uuid(),
|
|
44
|
+
environment_id: z.string().uuid().nullable(),
|
|
45
|
+
cron_job_id: z.string().uuid().nullable(),
|
|
46
|
+
batch_id: z.string().uuid().nullable(),
|
|
47
|
+
name: z.string(),
|
|
48
|
+
status: JobStatusSchema,
|
|
49
|
+
target: z.string(),
|
|
50
|
+
config: JsonObjectSchema,
|
|
51
|
+
context_id: z.string().uuid().nullable(),
|
|
52
|
+
timeout_seconds: z.number(),
|
|
53
|
+
backoff_limit: z.number(),
|
|
54
|
+
exit_code: z.number().nullable(),
|
|
55
|
+
failed_reason: z.string().nullable(),
|
|
56
|
+
failure_detail: z.string().nullable(),
|
|
57
|
+
result: JobResultSchema,
|
|
58
|
+
started_at: z.string().nullable(),
|
|
59
|
+
completed_at: z.string().nullable(),
|
|
60
|
+
created_by: z.string().uuid().nullable(),
|
|
61
|
+
created_at: z.string(),
|
|
62
|
+
updated_at: z.string(),
|
|
63
|
+
});
|
|
64
|
+
export const PaginatedJobsResponseSchema = z.object({
|
|
65
|
+
data: z.array(JobSchema),
|
|
66
|
+
page_info: PageInfoSchema,
|
|
67
|
+
});
|
|
68
|
+
export const JobEventSchema = z.object({
|
|
69
|
+
timestamp: z.string(),
|
|
70
|
+
level: z.string(),
|
|
71
|
+
message: z.string(),
|
|
72
|
+
service: z.string(),
|
|
73
|
+
trace_id: z.string().optional(),
|
|
74
|
+
request_id: z.string().optional(),
|
|
75
|
+
metadata: z.record(z.string()).optional(),
|
|
76
|
+
});
|
|
77
|
+
export const JobEventsResponseSchema = z.object({
|
|
78
|
+
entries: z.array(JobEventSchema),
|
|
79
|
+
next_cursor: z.string().nullable(),
|
|
80
|
+
stats: z.object({
|
|
81
|
+
bytes_processed: z.number(),
|
|
82
|
+
lines_processed: z.number(),
|
|
83
|
+
query_time_ms: z.number(),
|
|
84
|
+
}),
|
|
85
|
+
});
|
|
86
|
+
export const JobLogsResponseSchema = z.object({
|
|
87
|
+
logs: z.string().nullable(),
|
|
88
|
+
});
|
|
89
|
+
export const KnowledgeIngestBatchSourceSchema = z.object({
|
|
90
|
+
label: z.string(),
|
|
91
|
+
path: z.string().nullable(),
|
|
92
|
+
upload_id: z.string().uuid().nullable(),
|
|
93
|
+
remote_path: z.string().nullable(),
|
|
94
|
+
warning_count: z.number().int().nonnegative(),
|
|
95
|
+
});
|
|
96
|
+
export const JobBatchStatusCountsSchema = z.object({
|
|
97
|
+
submitted: z.number().int().nonnegative(),
|
|
98
|
+
working: z.number().int().nonnegative(),
|
|
99
|
+
completed: z.number().int().nonnegative(),
|
|
100
|
+
failed: z.number().int().nonnegative(),
|
|
101
|
+
canceled: z.number().int().nonnegative(),
|
|
102
|
+
});
|
|
103
|
+
export const JobBatchResultSchema = z
|
|
104
|
+
.discriminatedUnion("kind", [
|
|
105
|
+
z.object({
|
|
106
|
+
kind: z.literal("knowledge_ingest"),
|
|
107
|
+
total_count: z.number().int().nonnegative(),
|
|
108
|
+
completed_count: z.number().int().nonnegative(),
|
|
109
|
+
processing: z.array(KnowledgeIngestBatchSourceSchema),
|
|
110
|
+
completed: z.array(KnowledgeIngestBatchSourceSchema),
|
|
111
|
+
remaining: z.array(KnowledgeIngestBatchSourceSchema),
|
|
112
|
+
remaining_label: z.enum(["Remaining Files", "Not Ingested Files"]),
|
|
113
|
+
}),
|
|
114
|
+
])
|
|
115
|
+
.nullable();
|
|
116
|
+
export const JobBatchSchema = z.object({
|
|
117
|
+
id: z.string().uuid(),
|
|
118
|
+
project_id: z.string().uuid(),
|
|
119
|
+
target: z.string().nullable(),
|
|
120
|
+
job_count: z.number().int().nonnegative(),
|
|
121
|
+
status_counts: JobBatchStatusCountsSchema,
|
|
122
|
+
created_at: z.string(),
|
|
123
|
+
updated_at: z.string(),
|
|
124
|
+
result: JobBatchResultSchema,
|
|
125
|
+
});
|
|
126
|
+
export const JobTargetDefinitionSchema = z.object({
|
|
127
|
+
target: z.string(),
|
|
128
|
+
family: z.string(),
|
|
129
|
+
description: z.string(),
|
|
130
|
+
input_schema: JsonObjectSchema,
|
|
131
|
+
output_schema: JsonObjectSchema.nullable(),
|
|
132
|
+
});
|
|
133
|
+
export const JobTargetDefinitionsResponseSchema = z.object({
|
|
134
|
+
reserved_families: z.array(ReservedJobTargetFamilySchema),
|
|
135
|
+
data: z.array(JobTargetDefinitionSchema),
|
|
136
|
+
});
|
|
137
|
+
export const CronJobSchema = z.object({
|
|
138
|
+
id: z.string().uuid(),
|
|
139
|
+
project_id: z.string().uuid(),
|
|
140
|
+
environment_id: z.string().uuid().nullable(),
|
|
141
|
+
name: z.string(),
|
|
142
|
+
status: CronJobStatusSchema,
|
|
143
|
+
target: z.string(),
|
|
144
|
+
schedule: z.string(),
|
|
145
|
+
timezone: z.string(),
|
|
146
|
+
config: JsonObjectSchema,
|
|
147
|
+
timeout_seconds: z.number(),
|
|
148
|
+
backoff_limit: z.number(),
|
|
149
|
+
concurrency_policy: z.string(),
|
|
150
|
+
last_scheduled_at: z.string().nullable(),
|
|
151
|
+
last_successful_at: z.string().nullable(),
|
|
152
|
+
created_by: z.string().uuid().nullable(),
|
|
153
|
+
created_at: z.string(),
|
|
154
|
+
updated_at: z.string(),
|
|
155
|
+
});
|
|
156
|
+
export const PaginatedCronJobsResponseSchema = z.object({
|
|
157
|
+
data: z.array(CronJobSchema),
|
|
158
|
+
page_info: PageInfoSchema,
|
|
159
|
+
});
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import * as dntShim from "../../../../_dnt.shims.js";
|
|
1
2
|
export interface RetryConfig {
|
|
2
3
|
maxRetries: number;
|
|
3
4
|
initialDelay: number;
|
|
@@ -7,6 +8,9 @@ export interface RequestOptions {
|
|
|
7
8
|
returnText?: boolean;
|
|
8
9
|
/** Request timeout in milliseconds. Defaults to 30000ms (30 seconds). */
|
|
9
10
|
timeoutMs?: number;
|
|
11
|
+
method?: string;
|
|
12
|
+
body?: dntShim.BodyInit | null;
|
|
13
|
+
headers?: dntShim.HeadersInit;
|
|
10
14
|
}
|
|
11
15
|
export declare function requestWithRetry(url: string, apiToken: string, retryConfig: RetryConfig, options?: RequestOptions): Promise<unknown>;
|
|
12
16
|
//# sourceMappingURL=retry-handler.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"retry-handler.d.ts","sourceRoot":"","sources":["../../../../../src/src/platform/adapters/veryfront-api-client/retry-handler.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"retry-handler.d.ts","sourceRoot":"","sources":["../../../../../src/src/platform/adapters/veryfront-api-client/retry-handler.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,OAAO,MAAM,2BAA2B,CAAC;AAUrD,MAAM,WAAW,WAAW;IAC1B,UAAU,EAAE,MAAM,CAAC;IACnB,YAAY,EAAE,MAAM,CAAC;IACrB,QAAQ,EAAE,MAAM,CAAC;CAClB;AAED,MAAM,WAAW,cAAc;IAC7B,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,yEAAyE;IACzE,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,IAAI,CAAC,EAAE,OAAO,CAAC,QAAQ,GAAG,IAAI,CAAC;IAC/B,OAAO,CAAC,EAAE,OAAO,CAAC,WAAW,CAAC;CAC/B;AAKD,wBAAsB,gBAAgB,CACpC,GAAG,EAAE,MAAM,EACX,QAAQ,EAAE,MAAM,EAChB,WAAW,EAAE,WAAW,EACxB,OAAO,GAAE,cAAmB,GAC3B,OAAO,CAAC,OAAO,CAAC,CA4HlB"}
|
|
@@ -22,12 +22,18 @@ export async function requestWithRetry(url, apiToken, retryConfig, options = {})
|
|
|
22
22
|
try {
|
|
23
23
|
const result = await withSpan(SpanNames.HTTP_CLIENT_FETCH, async () => {
|
|
24
24
|
const startTime = performance.now();
|
|
25
|
-
const headers = new dntShim.Headers(
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
25
|
+
const headers = new dntShim.Headers(options.headers);
|
|
26
|
+
headers.set("Authorization", `Bearer ${apiToken}`);
|
|
27
|
+
if (!headers.has("Content-Type")) {
|
|
28
|
+
headers.set("Content-Type", "application/json");
|
|
29
|
+
}
|
|
29
30
|
injectContext(headers);
|
|
30
|
-
const response = await dntShim.fetch(url, {
|
|
31
|
+
const response = await dntShim.fetch(url, {
|
|
32
|
+
method: options.method ?? "GET",
|
|
33
|
+
headers,
|
|
34
|
+
body: options.body,
|
|
35
|
+
signal: controller.signal,
|
|
36
|
+
});
|
|
31
37
|
const duration = performance.now() - startTime;
|
|
32
38
|
recordApiRequest(response.status);
|
|
33
39
|
apiLog.debug("Request completed", {
|
|
@@ -55,7 +61,7 @@ export async function requestWithRetry(url, apiToken, retryConfig, options = {})
|
|
|
55
61
|
const data = options.returnText ? await response.text() : await response.json();
|
|
56
62
|
return { data, status: response.status, duration };
|
|
57
63
|
}, {
|
|
58
|
-
"http.method": "GET",
|
|
64
|
+
"http.method": options.method ?? "GET",
|
|
59
65
|
"http.url": url,
|
|
60
66
|
"http.target": urlPath,
|
|
61
67
|
"http.host": urlObj.host,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"handler.d.ts","sourceRoot":"","sources":["../../../src/src/proxy/handler.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,OAAO,MAAM,qBAAqB,CAAC;AAE/C,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":"AAAA,OAAO,KAAK,OAAO,MAAM,qBAAqB,CAAC;AAE/C,OAAO,EAAE,KAAK,YAAY,EAAsB,MAAM,kCAAkC,CAAC;AACzF,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAQnD,eAAO,MAAM,sBAAsB,0MAYzB,CAAC;AA6EX,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;AA4CD,wBAAgB,kBAAkB,CAAC,OAAO,EAAE,mBAAmB;0BA6K1B,OAAO,CAAC,OAAO,KAAG,OAAO,CAAC,YAAY,CAAC;0BA+NvC,OAAO,CAAC,OAAO,KAAG,OAAO,CAAC,MAAM,GAAG,SAAS,CAAC;;;;;;;;0BAjVrD,MAAM,EAAE;;EA+XpC;AAED,MAAM,MAAM,YAAY,GAAG,UAAU,CAAC,OAAO,kBAAkB,CAAC,CAAC;AAEjE,wBAAgB,oBAAoB,CAAC,GAAG,EAAE,OAAO,CAAC,OAAO,EAAE,GAAG,EAAE,YAAY,GAAG,OAAO,CAAC,OAAO,CAwB7F"}
|
package/esm/src/proxy/handler.js
CHANGED
|
@@ -2,10 +2,11 @@ import * as dntShim from "../../_dnt.shims.js";
|
|
|
2
2
|
import { TokenManager } from "./token-manager.js";
|
|
3
3
|
import { parseProjectDomain } from "../server/utils/domain-parser.js";
|
|
4
4
|
import { createFileSystem } from "../platform/compat/fs.js";
|
|
5
|
-
import { cwd } from "../platform/compat/process.js";
|
|
5
|
+
import { cwd, getEnv } from "../platform/compat/process.js";
|
|
6
6
|
import { join } from "../platform/compat/path/index.js";
|
|
7
7
|
import { injectContext, ProxySpanNames, withSpan } from "./tracing.js";
|
|
8
8
|
import { computeContentSourceId } from "../cache/keys.js";
|
|
9
|
+
import { jwtVerify } from "jose";
|
|
9
10
|
export const INTERNAL_PROXY_HEADERS = [
|
|
10
11
|
"x-token",
|
|
11
12
|
"x-project-slug",
|
|
@@ -69,23 +70,23 @@ function extractUserToken(cookieHeader) {
|
|
|
69
70
|
const match = cookieHeader.match(/(?:^|;\s*)authToken=([^;]+)/);
|
|
70
71
|
return match?.[1] ? decodeURIComponent(match[1]) : undefined;
|
|
71
72
|
}
|
|
72
|
-
function extractUserIdFromToken(token) {
|
|
73
|
+
async function extractUserIdFromToken(token, log) {
|
|
74
|
+
const jwtSecret = getEnv("JWT_SECRET");
|
|
75
|
+
if (!jwtSecret) {
|
|
76
|
+
log?.warn("JWT_SECRET not configured — cannot verify user token");
|
|
77
|
+
return undefined;
|
|
78
|
+
}
|
|
73
79
|
try {
|
|
74
|
-
const
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
const remainder = base64.length % 4;
|
|
80
|
-
if (remainder === 2)
|
|
81
|
-
base64 += "==";
|
|
82
|
-
else if (remainder === 3)
|
|
83
|
-
base64 += "=";
|
|
84
|
-
const decoded = JSON.parse(atob(base64));
|
|
85
|
-
return decoded?.userId;
|
|
80
|
+
const secret = new TextEncoder().encode(jwtSecret);
|
|
81
|
+
const { payload } = await jwtVerify(token, secret, {
|
|
82
|
+
algorithms: ["HS256"],
|
|
83
|
+
});
|
|
84
|
+
return payload.userId;
|
|
86
85
|
}
|
|
87
|
-
catch (
|
|
88
|
-
|
|
86
|
+
catch (error) {
|
|
87
|
+
log?.debug("JWT verification failed", {
|
|
88
|
+
error: error instanceof Error ? error.message : String(error),
|
|
89
|
+
});
|
|
89
90
|
return undefined;
|
|
90
91
|
}
|
|
91
92
|
}
|
|
@@ -171,7 +172,7 @@ export function createProxyHandler(options) {
|
|
|
171
172
|
const returnPath = safePath + url.search;
|
|
172
173
|
return `https://veryfront.com/sign-in?from=${encodeURIComponent(returnPath)}`;
|
|
173
174
|
}
|
|
174
|
-
function checkProtectedAccess(req, matchingEnv, userToken, users, logContext) {
|
|
175
|
+
async function checkProtectedAccess(req, matchingEnv, userToken, users, logContext) {
|
|
175
176
|
if (!matchingEnv?.protected)
|
|
176
177
|
return null;
|
|
177
178
|
if (!userToken) {
|
|
@@ -183,9 +184,8 @@ export function createProxyHandler(options) {
|
|
|
183
184
|
});
|
|
184
185
|
return { status: 302, message: "Authentication required", redirectUrl };
|
|
185
186
|
}
|
|
186
|
-
const userId = extractUserIdFromToken(userToken);
|
|
187
|
+
const userId = await extractUserIdFromToken(userToken, logger);
|
|
187
188
|
if (!userId) {
|
|
188
|
-
// Malformed token — treat as unauthenticated so user can re-sign-in
|
|
189
189
|
const redirectUrl = makeAuthRedirectUrl(req);
|
|
190
190
|
logger?.info("Could not extract userId from token", {
|
|
191
191
|
...logContext,
|
|
@@ -209,7 +209,7 @@ export function createProxyHandler(options) {
|
|
|
209
209
|
if (!lookupResult)
|
|
210
210
|
return { projectId: undefined, releaseId: undefined };
|
|
211
211
|
const matchingEnv = lookupResult.environments?.find(envMatcher);
|
|
212
|
-
const protectionError = checkProtectedAccess(req, matchingEnv, userToken, lookupResult.users, logContext);
|
|
212
|
+
const protectionError = await checkProtectedAccess(req, matchingEnv, userToken, lookupResult.users, logContext);
|
|
213
213
|
if (protectionError)
|
|
214
214
|
return { error: protectionError };
|
|
215
215
|
return {
|
|
@@ -293,7 +293,7 @@ export function createProxyHandler(options) {
|
|
|
293
293
|
const matchingEnv = lookupResult.environments?.find((env) => env.domains?.some((d) => d.toLowerCase() === normalizedHost));
|
|
294
294
|
releaseId = matchingEnv?.active_release_id ?? undefined;
|
|
295
295
|
environmentId = matchingEnv?.id;
|
|
296
|
-
const protectionError = checkProtectedAccess(req, matchingEnv, userToken, lookupResult.users, { domain: host });
|
|
296
|
+
const protectionError = await checkProtectedAccess(req, matchingEnv, userToken, lookupResult.users, { domain: host });
|
|
297
297
|
if (protectionError) {
|
|
298
298
|
return makeErrorContext(base, protectionError.status, protectionError.message, token, protectionError.redirectUrl);
|
|
299
299
|
}
|
|
@@ -8,6 +8,7 @@ import { PageResolver } from "../page-resolution/index.js";
|
|
|
8
8
|
import { ElementValidator } from "../element-validator/index.js";
|
|
9
9
|
import { SSRRenderer } from "../ssr-renderer.js";
|
|
10
10
|
import type { ConfigurationManager } from "./config.js";
|
|
11
|
+
import type { RuntimeAdapter } from "../../platform/adapters/base.js";
|
|
11
12
|
import type { MdxBundle } from "../../types/index.js";
|
|
12
13
|
import { CompilerService } from "./compiler-service.js";
|
|
13
14
|
export interface LifecycleOptions {
|
|
@@ -18,6 +19,8 @@ export interface LifecycleOptions {
|
|
|
18
19
|
projectId?: string;
|
|
19
20
|
/** Content source identifier for cache isolation (branch or release) */
|
|
20
21
|
contentSourceId?: string;
|
|
22
|
+
/** Injectable factory for testing — bypasses real service construction */
|
|
23
|
+
servicesFactory?: (adapter: RuntimeAdapter) => RendererServices;
|
|
21
24
|
}
|
|
22
25
|
export interface RendererServices {
|
|
23
26
|
componentRegistry: ComponentRegistry;
|
|
@@ -40,6 +43,7 @@ export declare class RendererLifecycle {
|
|
|
40
43
|
private contentSourceId?;
|
|
41
44
|
private services?;
|
|
42
45
|
private adapter;
|
|
46
|
+
private servicesFactory?;
|
|
43
47
|
constructor(options: LifecycleOptions);
|
|
44
48
|
initialize(): Promise<RendererServices>;
|
|
45
49
|
updateCompileMDX(compileMDX: (content: string, frontmatter?: Record<string, unknown>, filePath?: string) => Promise<MdxBundle>): void;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"lifecycle.d.ts","sourceRoot":"","sources":["../../../../src/src/rendering/orchestrator/lifecycle.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,eAAe,EAAE,MAAM,+BAA+B,CAAC;AAEhE,OAAO,EAAE,iBAAiB,EAAE,MAAM,8BAA8B,CAAC;AACjE,OAAO,EAAE,mBAAmB,EAAE,MAAM,6BAA6B,CAAC;AAClE,OAAO,EAAE,gBAAgB,EAAE,MAAM,mBAAmB,CAAC;AASrD,OAAO,EAAE,eAAe,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAC;AACtE,OAAO,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AACnD,OAAO,EAAE,YAAY,EAAE,MAAM,6BAA6B,CAAC;AAC3D,OAAO,EAAE,gBAAgB,EAAE,MAAM,+BAA+B,CAAC;AACjE,OAAO,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AACjD,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,aAAa,CAAC;
|
|
1
|
+
{"version":3,"file":"lifecycle.d.ts","sourceRoot":"","sources":["../../../../src/src/rendering/orchestrator/lifecycle.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,eAAe,EAAE,MAAM,+BAA+B,CAAC;AAEhE,OAAO,EAAE,iBAAiB,EAAE,MAAM,8BAA8B,CAAC;AACjE,OAAO,EAAE,mBAAmB,EAAE,MAAM,6BAA6B,CAAC;AAClE,OAAO,EAAE,gBAAgB,EAAE,MAAM,mBAAmB,CAAC;AASrD,OAAO,EAAE,eAAe,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAC;AACtE,OAAO,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AACnD,OAAO,EAAE,YAAY,EAAE,MAAM,6BAA6B,CAAC;AAC3D,OAAO,EAAE,gBAAgB,EAAE,MAAM,+BAA+B,CAAC;AACjE,OAAO,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AACjD,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,aAAa,CAAC;AACxD,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,iCAAiC,CAAC;AACtE,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,sBAAsB,CAAC;AACtD,OAAO,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAC;AASxD,MAAM,WAAW,gBAAgB;IAC/B,aAAa,EAAE,oBAAoB,CAAC;IACpC,IAAI,EAAE,MAAM,CAAC;IACb,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,sEAAsE;IACtE,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,wEAAwE;IACxE,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,0EAA0E;IAC1E,eAAe,CAAC,EAAE,CAAC,OAAO,EAAE,cAAc,KAAK,gBAAgB,CAAC;CACjE;AAED,MAAM,WAAW,gBAAgB;IAC/B,iBAAiB,EAAE,iBAAiB,CAAC;IACrC,cAAc,EAAE,mBAAmB,CAAC;IACpC,gBAAgB,EAAE,gBAAgB,CAAC;IACnC,eAAe,EAAE,eAAe,CAAC;IACjC,eAAe,EAAE,eAAe,CAAC;IACjC,cAAc,EAAE,cAAc,CAAC;IAC/B,gBAAgB,EAAE,gBAAgB,CAAC;IACnC,WAAW,EAAE,WAAW,CAAC;IACzB,YAAY,EAAE,YAAY,CAAC;IAC3B,YAAY,EAAE,YAAY,CAAC;IAC3B,eAAe,EAAE,eAAe,CAAC;CAClC;AAED,qBAAa,iBAAiB;IAC5B,OAAO,CAAC,aAAa,CAAuB;IAC5C,OAAO,CAAC,IAAI,CAAS;IACrB,OAAO,CAAC,eAAe,CAAC,CAAS;IACjC,OAAO,CAAC,SAAS,CAAC,CAAS;IAC3B,OAAO,CAAC,eAAe,CAAC,CAAS;IACjC,OAAO,CAAC,QAAQ,CAAC,CAAmB;IACpC,OAAO,CAAC,OAAO,CAAkB;IACjC,OAAO,CAAC,eAAe,CAAC,CAAgD;gBAE5D,OAAO,EAAE,gBAAgB;IAS/B,UAAU,IAAI,OAAO,CAAC,gBAAgB,CAAC;IAqJ7C,gBAAgB,CACd,UAAU,EAAE,CACV,OAAO,EAAE,MAAM,EACf,WAAW,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EACrC,QAAQ,CAAC,EAAE,MAAM,KACd,OAAO,CAAC,SAAS,CAAC,GACtB,IAAI;IAcP,WAAW,IAAI,gBAAgB;IAazB,oBAAoB,IAAI,OAAO,CAAC,IAAI,CAAC;IAc3C,cAAc,IAAI,IAAI;IAWtB,cAAc,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI;IAS5B,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC;CAG/B"}
|
|
@@ -26,12 +26,14 @@ export class RendererLifecycle {
|
|
|
26
26
|
contentSourceId;
|
|
27
27
|
services;
|
|
28
28
|
adapter;
|
|
29
|
+
servicesFactory;
|
|
29
30
|
constructor(options) {
|
|
30
31
|
this.configManager = options.configManager;
|
|
31
32
|
this.port = options.port;
|
|
32
33
|
this.moduleServerUrl = options.moduleServerUrl;
|
|
33
34
|
this.projectId = options.projectId;
|
|
34
35
|
this.contentSourceId = options.contentSourceId;
|
|
36
|
+
this.servicesFactory = options.servicesFactory;
|
|
35
37
|
}
|
|
36
38
|
async initialize() {
|
|
37
39
|
logger.debug("Initializing renderer services", {
|
|
@@ -43,6 +45,12 @@ export class RendererLifecycle {
|
|
|
43
45
|
const { runtime } = await import("../../platform/adapters/detect.js");
|
|
44
46
|
this.adapter = await runtime.get();
|
|
45
47
|
}
|
|
48
|
+
// Allow tests to bypass the full service graph construction
|
|
49
|
+
if (this.servicesFactory) {
|
|
50
|
+
this.services = this.servicesFactory(this.adapter);
|
|
51
|
+
logger.debug("Renderer services initialized via injected factory");
|
|
52
|
+
return this.services;
|
|
53
|
+
}
|
|
46
54
|
const projectDir = this.configManager.getProjectDir();
|
|
47
55
|
const mode = this.configManager.getMode();
|
|
48
56
|
const debugMode = this.configManager.isDebugMode();
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"pipeline.d.ts","sourceRoot":"","sources":["../../../../src/src/rendering/orchestrator/pipeline.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAgBH,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,iCAAiC,CAAC;AAEtE,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,+BAA+B,CAAC;AACvE,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AACxD,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,6BAA6B,CAAC;AAChE,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,aAAa,CAAC;AACtD,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAC;AAC7D,OAAO,KAAK,EAAE,gBAAgB,EAAE,aAAa,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AA6ChF,OAAO,EAAE,wBAAwB,EAAE,MAAM,gBAAgB,CAAC;AAE1D;;;;GAIG;AACH,MAAM,WAAW,wBAAwB;IACvC,UAAU,CAAC,IAAI,EAAE,MAAM,EAAE,QAAQ,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,iBAAiB,CAAC,CAAC;IACxE,aAAa,CAAC,MAAM,EAAE,YAAY,EAAE,IAAI,EAAE,MAAM,EAAE,QAAQ,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;CACrF;AAED,MAAM,WAAW,oBAAoB;IACnC,YAAY,EAAE,YAAY,CAAC;IAC3B,gBAAgB,EAAE,wBAAwB,CAAC;IAC3C,YAAY,EAAE,YAAY,CAAC;IAC3B,kBAAkB,EAAE,kBAAkB,CAAC;IACvC,eAAe,EAAE,eAAe,CAAC;IACjC,OAAO,EAAE,cAAc,CAAC;IACxB,IAAI,EAAE,aAAa,GAAG,YAAY,CAAC;IACnC,UAAU,EAAE,MAAM,CAAC;IACnB,8EAA8E;IAC9E,iBAAiB,CAAC,EAAE,OAAO,qBAAqB,EAAE,sBAAsB,CAAC;CAC1E;AAQD,qBAAa,cAAc;IACzB,OAAO,CAAC,MAAM,CAAuB;IACrC,OAAO,CAAC,WAAW,CAAc;IACjC,OAAO,CAAC,kBAAkB,CAAqB;gBAEnC,MAAM,EAAE,oBAAoB;IAaxC;;;OAGG;IACH,gBAAgB,IAAI,IAAI;IAKxB,OAAO,CAAC,UAAU;IAIlB,OAAO,CAAC,sBAAsB;YAIhB,0BAA0B;IAaxC;;;;;;;;;OASG;YACW,qBAAqB;IAyDnC;;;OAGG;YACW,mBAAmB;
|
|
1
|
+
{"version":3,"file":"pipeline.d.ts","sourceRoot":"","sources":["../../../../src/src/rendering/orchestrator/pipeline.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAgBH,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,iCAAiC,CAAC;AAEtE,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,+BAA+B,CAAC;AACvE,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AACxD,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,6BAA6B,CAAC;AAChE,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,aAAa,CAAC;AACtD,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAC;AAC7D,OAAO,KAAK,EAAE,gBAAgB,EAAE,aAAa,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AA6ChF,OAAO,EAAE,wBAAwB,EAAE,MAAM,gBAAgB,CAAC;AAE1D;;;;GAIG;AACH,MAAM,WAAW,wBAAwB;IACvC,UAAU,CAAC,IAAI,EAAE,MAAM,EAAE,QAAQ,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,iBAAiB,CAAC,CAAC;IACxE,aAAa,CAAC,MAAM,EAAE,YAAY,EAAE,IAAI,EAAE,MAAM,EAAE,QAAQ,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;CACrF;AAED,MAAM,WAAW,oBAAoB;IACnC,YAAY,EAAE,YAAY,CAAC;IAC3B,gBAAgB,EAAE,wBAAwB,CAAC;IAC3C,YAAY,EAAE,YAAY,CAAC;IAC3B,kBAAkB,EAAE,kBAAkB,CAAC;IACvC,eAAe,EAAE,eAAe,CAAC;IACjC,OAAO,EAAE,cAAc,CAAC;IACxB,IAAI,EAAE,aAAa,GAAG,YAAY,CAAC;IACnC,UAAU,EAAE,MAAM,CAAC;IACnB,8EAA8E;IAC9E,iBAAiB,CAAC,EAAE,OAAO,qBAAqB,EAAE,sBAAsB,CAAC;CAC1E;AAQD,qBAAa,cAAc;IACzB,OAAO,CAAC,MAAM,CAAuB;IACrC,OAAO,CAAC,WAAW,CAAc;IACjC,OAAO,CAAC,kBAAkB,CAAqB;gBAEnC,MAAM,EAAE,oBAAoB;IAaxC;;;OAGG;IACH,gBAAgB,IAAI,IAAI;IAKxB,OAAO,CAAC,UAAU;IAIlB,OAAO,CAAC,sBAAsB;YAIhB,0BAA0B;IAaxC;;;;;;;;;OASG;YACW,qBAAqB;IAyDnC;;;OAGG;YACW,mBAAmB;IA0H3B,UAAU,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,aAAa,GAAG,OAAO,CAAC,YAAY,CAAC;IA8P9E,+EAA+E;IACzE,eAAe,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,aAAa,GAAG,OAAO,CAAC,gBAAgB,CAAC;IA6LvF;;;;;;OAMG;IACH,OAAO,CAAC,aAAa;CAetB"}
|
|
@@ -183,8 +183,13 @@ export class RenderPipeline {
|
|
|
183
183
|
}
|
|
184
184
|
const dataResults = await withSpan(SpanNames.RENDER_FETCH_DATA, () => withTimeoutThrow(Promise.all(dataJobs.map(async (job) => {
|
|
185
185
|
try {
|
|
186
|
+
const jobPath = job.path;
|
|
187
|
+
const fetchOptions = {
|
|
188
|
+
modulePath: jobPath,
|
|
189
|
+
projectDir: this.config.projectDir,
|
|
190
|
+
};
|
|
186
191
|
const result = await this.dataFetcher
|
|
187
|
-
.fetchData(job.mod, dataContext, this.config.mode);
|
|
192
|
+
.fetchData(job.mod, dataContext, this.config.mode, fetchOptions);
|
|
188
193
|
return { ...job, result, error: null };
|
|
189
194
|
}
|
|
190
195
|
catch (error) {
|
|
@@ -15,10 +15,35 @@ export interface SSRRenderingResult {
|
|
|
15
15
|
finalStream: ReadableStream | null;
|
|
16
16
|
ssrHash: string;
|
|
17
17
|
}
|
|
18
|
+
/**
|
|
19
|
+
* Options for isolated SSR rendering through the Worker pool.
|
|
20
|
+
* When provided and SSR isolation is enabled, the rendering happens
|
|
21
|
+
* in a per-project Worker instead of the main process.
|
|
22
|
+
*/
|
|
23
|
+
export interface SSRIsolationOptions {
|
|
24
|
+
/** Temp file path for the page component module */
|
|
25
|
+
pageModulePath: string;
|
|
26
|
+
/** Ordered layout module temp paths (innermost → outermost) */
|
|
27
|
+
layoutModulePaths: string[];
|
|
28
|
+
/** Page component props */
|
|
29
|
+
pageProps: Record<string, unknown>;
|
|
30
|
+
/** Layout props (one entry per layout, matching layoutModulePaths order) */
|
|
31
|
+
layoutProps: Record<string, unknown>[];
|
|
32
|
+
/** Project directory for worker scoping */
|
|
33
|
+
projectDir: string;
|
|
34
|
+
}
|
|
18
35
|
export declare class SSROrchestrator {
|
|
19
36
|
private config;
|
|
20
37
|
constructor(config: SSROrchestratorConfig);
|
|
21
|
-
performSSRRendering(pageElement: React.ReactElement, generationContext: Omit<HTMLGenerationContext, "html" | "ssrHash">, options?: RenderOptions): Promise<SSRRenderingResult>;
|
|
38
|
+
performSSRRendering(pageElement: React.ReactElement, generationContext: Omit<HTMLGenerationContext, "html" | "ssrHash">, options?: RenderOptions, isolationOptions?: SSRIsolationOptions): Promise<SSRRenderingResult>;
|
|
39
|
+
/**
|
|
40
|
+
* Perform SSR rendering in an isolated per-project Worker.
|
|
41
|
+
*
|
|
42
|
+
* The Worker imports user modules from their temp file paths,
|
|
43
|
+
* constructs the React element tree, and renders to HTML.
|
|
44
|
+
* For streaming, the Worker sends chunks via postMessage.
|
|
45
|
+
*/
|
|
46
|
+
private performIsolatedSSR;
|
|
22
47
|
private createStream;
|
|
23
48
|
}
|
|
24
49
|
//# sourceMappingURL=ssr-orchestrator.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ssr-orchestrator.d.ts","sourceRoot":"","sources":["../../../../src/src/rendering/orchestrator/ssr-orchestrator.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,KAAK,KAAK,MAAM,OAAO,CAAC;AAIpC,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,+BAA+B,CAAC;AACtE,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AAEtD,OAAO,KAAK,EAAE,qBAAqB,EAAE,aAAa,EAAE,MAAM,WAAW,CAAC;AACtE,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;
|
|
1
|
+
{"version":3,"file":"ssr-orchestrator.d.ts","sourceRoot":"","sources":["../../../../src/src/rendering/orchestrator/ssr-orchestrator.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,KAAK,KAAK,MAAM,OAAO,CAAC;AAIpC,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,+BAA+B,CAAC;AACtE,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AAEtD,OAAO,KAAK,EAAE,qBAAqB,EAAE,aAAa,EAAE,MAAM,WAAW,CAAC;AACtE,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AAOhD,MAAM,WAAW,qBAAqB;IACpC,IAAI,EAAE,aAAa,GAAG,YAAY,CAAC;IACnC,SAAS,EAAE,OAAO,CAAC;IACnB,gBAAgB,EAAE,gBAAgB,CAAC;IACnC,WAAW,EAAE,WAAW,CAAC;IACzB,aAAa,EAAE,aAAa,CAAC;CAC9B;AAED,MAAM,WAAW,kBAAkB;IACjC,QAAQ,EAAE,MAAM,CAAC;IACjB,WAAW,EAAE,cAAc,GAAG,IAAI,CAAC;IACnC,OAAO,EAAE,MAAM,CAAC;CACjB;AAED;;;;GAIG;AACH,MAAM,WAAW,mBAAmB;IAClC,mDAAmD;IACnD,cAAc,EAAE,MAAM,CAAC;IACvB,+DAA+D;IAC/D,iBAAiB,EAAE,MAAM,EAAE,CAAC;IAC5B,2BAA2B;IAC3B,SAAS,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACnC,4EAA4E;IAC5E,WAAW,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,CAAC;IACvC,2CAA2C;IAC3C,UAAU,EAAE,MAAM,CAAC;CACpB;AAUD,qBAAa,eAAe;IAC1B,OAAO,CAAC,MAAM,CAAwB;gBAE1B,MAAM,EAAE,qBAAqB;IAInC,mBAAmB,CACvB,WAAW,EAAE,KAAK,CAAC,YAAY,EAC/B,iBAAiB,EAAE,IAAI,CAAC,qBAAqB,EAAE,MAAM,GAAG,SAAS,CAAC,EAClE,OAAO,CAAC,EAAE,aAAa,EACvB,gBAAgB,CAAC,EAAE,mBAAmB,GACrC,OAAO,CAAC,kBAAkB,CAAC;IAiG9B;;;;;;OAMG;YACW,kBAAkB;IAiFhC,OAAO,CAAC,YAAY;CAerB"}
|
|
@@ -5,6 +5,7 @@ import { withSpan } from "../../observability/tracing/otlp-setup.js";
|
|
|
5
5
|
import { SpanNames } from "../../observability/tracing/span-names.js";
|
|
6
6
|
import { computeHash } from "../utils/index.js";
|
|
7
7
|
import { runWithHeadCollector } from "../../react/head-collector.js";
|
|
8
|
+
import { getWorkerPool, isSSRIsolationEnabled } from "../../security/sandbox/worker-pool.js";
|
|
8
9
|
const logger = rendererLogger.component("ssr-orchestrator");
|
|
9
10
|
function getElementTypeName(el) {
|
|
10
11
|
if (!el?.type)
|
|
@@ -19,7 +20,14 @@ export class SSROrchestrator {
|
|
|
19
20
|
constructor(config) {
|
|
20
21
|
this.config = config;
|
|
21
22
|
}
|
|
22
|
-
async performSSRRendering(pageElement, generationContext, options) {
|
|
23
|
+
async performSSRRendering(pageElement, generationContext, options, isolationOptions) {
|
|
24
|
+
// Isolated SSR path: render in per-project Worker
|
|
25
|
+
if (isSSRIsolationEnabled() &&
|
|
26
|
+
isolationOptions?.pageModulePath &&
|
|
27
|
+
isolationOptions?.projectDir) {
|
|
28
|
+
return this.performIsolatedSSR(generationContext, options, isolationOptions);
|
|
29
|
+
}
|
|
30
|
+
// Default path: render in main process
|
|
23
31
|
logger.debug("performSSRRendering called", {
|
|
24
32
|
elementType: getElementTypeName(pageElement),
|
|
25
33
|
hasChildren: !!pageElement.props?.children,
|
|
@@ -77,6 +85,74 @@ export class SSROrchestrator {
|
|
|
77
85
|
ssrHash,
|
|
78
86
|
};
|
|
79
87
|
}
|
|
88
|
+
/**
|
|
89
|
+
* Perform SSR rendering in an isolated per-project Worker.
|
|
90
|
+
*
|
|
91
|
+
* The Worker imports user modules from their temp file paths,
|
|
92
|
+
* constructs the React element tree, and renders to HTML.
|
|
93
|
+
* For streaming, the Worker sends chunks via postMessage.
|
|
94
|
+
*/
|
|
95
|
+
async performIsolatedSSR(generationContext, options, isolation) {
|
|
96
|
+
const wantsStream = options?.delivery === "stream";
|
|
97
|
+
const pool = getWorkerPool();
|
|
98
|
+
const requestId = dntShim.crypto.randomUUID();
|
|
99
|
+
return withSpan("ssr.isolated_render", async () => {
|
|
100
|
+
const worker = pool.getOrCreateWorker(isolation.projectDir, [isolation.projectDir]);
|
|
101
|
+
if (wantsStream) {
|
|
102
|
+
// Streaming mode: get a ReadableStream of chunks from the Worker
|
|
103
|
+
const stream = worker.executeStream({
|
|
104
|
+
type: "render-ssr",
|
|
105
|
+
id: requestId,
|
|
106
|
+
pageModulePath: isolation.pageModulePath,
|
|
107
|
+
layoutModulePaths: isolation.layoutModulePaths,
|
|
108
|
+
pageProps: isolation.pageProps,
|
|
109
|
+
layoutProps: isolation.layoutProps,
|
|
110
|
+
delivery: "stream",
|
|
111
|
+
});
|
|
112
|
+
const ssrHash = `stream-isolated-${Date.now()}`;
|
|
113
|
+
// Generate HTML stream using the framework's HTML generator
|
|
114
|
+
const finalStream = await this.config.htmlGenerator.generateHTMLStream(stream, {
|
|
115
|
+
...generationContext,
|
|
116
|
+
ssrHash,
|
|
117
|
+
options: { ...generationContext.options, ...options },
|
|
118
|
+
collectedHead: undefined,
|
|
119
|
+
});
|
|
120
|
+
return { fullHtml: "", finalStream, ssrHash };
|
|
121
|
+
}
|
|
122
|
+
// String mode: render to HTML in Worker, get result back
|
|
123
|
+
const workerResponse = await worker.execute({
|
|
124
|
+
type: "render-ssr",
|
|
125
|
+
id: requestId,
|
|
126
|
+
pageModulePath: isolation.pageModulePath,
|
|
127
|
+
layoutModulePaths: isolation.layoutModulePaths,
|
|
128
|
+
pageProps: isolation.pageProps,
|
|
129
|
+
layoutProps: isolation.layoutProps,
|
|
130
|
+
delivery: "string",
|
|
131
|
+
});
|
|
132
|
+
if (workerResponse.type === "error") {
|
|
133
|
+
const err = new Error(workerResponse.error.message);
|
|
134
|
+
err.name = workerResponse.error.name;
|
|
135
|
+
throw err;
|
|
136
|
+
}
|
|
137
|
+
if (workerResponse.type !== "ssr-result") {
|
|
138
|
+
throw new Error(`Unexpected worker response type: ${workerResponse.type}`);
|
|
139
|
+
}
|
|
140
|
+
const html = workerResponse.html;
|
|
141
|
+
const ssrHash = await computeHash(html);
|
|
142
|
+
const fullHtml = await this.config.htmlGenerator.generateFullHTML({
|
|
143
|
+
...generationContext,
|
|
144
|
+
html,
|
|
145
|
+
ssrHash,
|
|
146
|
+
options: { ...generationContext.options, ...options },
|
|
147
|
+
collectedHead: undefined,
|
|
148
|
+
});
|
|
149
|
+
return { fullHtml, finalStream: null, ssrHash };
|
|
150
|
+
}, {
|
|
151
|
+
"ssr.isolated": true,
|
|
152
|
+
"ssr.wants_stream": wantsStream,
|
|
153
|
+
"ssr.project_dir": isolation.projectDir,
|
|
154
|
+
});
|
|
155
|
+
}
|
|
80
156
|
createStream(html) {
|
|
81
157
|
try {
|
|
82
158
|
return new dntShim.Response(html).body ?? null;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"handler.d.ts","sourceRoot":"","sources":["../../../../src/src/routing/api/handler.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,OAAO,MAAM,wBAAwB,CAAC;AAGlD,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,iCAAiC,CAAC;AACtE,OAAO,EAAE,SAAS,EAAE,MAAM,uBAAuB,CAAC;AAMlD,OAAO,EAAE,KAAK,UAAU,EAAE,MAAM,sBAAsB,CAAC;AAEvD,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,0BAA0B,CAAC;AACzD,OAAO,EAAE,iBAAiB,EAAE,MAAM,2BAA2B,CAAC;AAC9D,OAAO,EAAE,iBAAiB,EAAE,mBAAmB,EAAE,MAAM,sBAAsB,CAAC;AAO9E,YAAY,EAAE,UAAU,EAAE,QAAQ,EAAE,CAAC;AAErC;;GAEG;AACH,UAAU,mBAAmB;IAC3B,iBAAiB,CAAC,EAAE,OAAO,iBAAiB,CAAC;IAC7C,mBAAmB,CAAC,EAAE,OAAO,mBAAmB,CAAC;IACjD,iBAAiB,CAAC,EAAE,OAAO,iBAAiB,CAAC;IAC7C,SAAS,CAAC,EAAE,OAAO,SAAS,CAAC;CAC9B;AAID;;GAEG;AACH,wBAAgB,oBAAoB,CAAC,IAAI,EAAE,mBAAmB,GAAG,IAAI,GAAG,IAAI,CAE3E;AAWD,MAAM,WAAW,WAAW;IAC1B,IAAI,CAAC,EAAE,OAAO,CAAC;IACf,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,OAAO,CAAC,EAAE,OAAO,CAAC,WAAW,CAAC;CAC/B;AAED,MAAM,MAAM,UAAU,GAAG,CAAC,GAAG,EAAE,UAAU,KAAK,OAAO,CAAC,OAAO,CAAC,QAAQ,CAAC,GAAG,OAAO,CAAC,QAAQ,CAAC;AAE3F,qBAAa,eAAe;IAgBxB,OAAO,CAAC,UAAU;IAfpB,OAAO,CAAC,MAAM,CAAyB;IACvC,OAAO,CAAC,UAAU,CAA6E;IAC/F,OAAO,CAAC,gBAAgB,CAAuB;IAE/C,OAAO,CAAC,OAAO,CAAwB;IACvC,OAAO,CAAC,cAAc,CAAwC;IAE9D,OAAO,CAAC,UAAU,CAAqC;IACvD,OAAO,CAAC,gBAAgB,CAAS;IACjC,OAAO,CAAC,iBAAiB,CAA8B;IAEvD,OAAO,CAAC,MAAM,CAAsD;IACpE,OAAO,CAAC,aAAa,CAA8B;gBAGzC,UAAU,EAAE,MAAM,EAC1B,OAAO,CAAC,EAAE,cAAc;IAM1B,UAAU,IAAI,OAAO,CAAC,IAAI,CAAC;IAgD3B,MAAM,CAAC,OAAO,EAAE,OAAO,CAAC,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC,QAAQ,GAAG,IAAI,CAAC;
|
|
1
|
+
{"version":3,"file":"handler.d.ts","sourceRoot":"","sources":["../../../../src/src/routing/api/handler.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,OAAO,MAAM,wBAAwB,CAAC;AAGlD,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,iCAAiC,CAAC;AACtE,OAAO,EAAE,SAAS,EAAE,MAAM,uBAAuB,CAAC;AAMlD,OAAO,EAAE,KAAK,UAAU,EAAE,MAAM,sBAAsB,CAAC;AAEvD,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,0BAA0B,CAAC;AACzD,OAAO,EAAE,iBAAiB,EAAE,MAAM,2BAA2B,CAAC;AAC9D,OAAO,EAAE,iBAAiB,EAAE,mBAAmB,EAAE,MAAM,sBAAsB,CAAC;AAO9E,YAAY,EAAE,UAAU,EAAE,QAAQ,EAAE,CAAC;AAErC;;GAEG;AACH,UAAU,mBAAmB;IAC3B,iBAAiB,CAAC,EAAE,OAAO,iBAAiB,CAAC;IAC7C,mBAAmB,CAAC,EAAE,OAAO,mBAAmB,CAAC;IACjD,iBAAiB,CAAC,EAAE,OAAO,iBAAiB,CAAC;IAC7C,SAAS,CAAC,EAAE,OAAO,SAAS,CAAC;CAC9B;AAID;;GAEG;AACH,wBAAgB,oBAAoB,CAAC,IAAI,EAAE,mBAAmB,GAAG,IAAI,GAAG,IAAI,CAE3E;AAWD,MAAM,WAAW,WAAW;IAC1B,IAAI,CAAC,EAAE,OAAO,CAAC;IACf,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,OAAO,CAAC,EAAE,OAAO,CAAC,WAAW,CAAC;CAC/B;AAED,MAAM,MAAM,UAAU,GAAG,CAAC,GAAG,EAAE,UAAU,KAAK,OAAO,CAAC,OAAO,CAAC,QAAQ,CAAC,GAAG,OAAO,CAAC,QAAQ,CAAC;AAE3F,qBAAa,eAAe;IAgBxB,OAAO,CAAC,UAAU;IAfpB,OAAO,CAAC,MAAM,CAAyB;IACvC,OAAO,CAAC,UAAU,CAA6E;IAC/F,OAAO,CAAC,gBAAgB,CAAuB;IAE/C,OAAO,CAAC,OAAO,CAAwB;IACvC,OAAO,CAAC,cAAc,CAAwC;IAE9D,OAAO,CAAC,UAAU,CAAqC;IACvD,OAAO,CAAC,gBAAgB,CAAS;IACjC,OAAO,CAAC,iBAAiB,CAA8B;IAEvD,OAAO,CAAC,MAAM,CAAsD;IACpE,OAAO,CAAC,aAAa,CAA8B;gBAGzC,UAAU,EAAE,MAAM,EAC1B,OAAO,CAAC,EAAE,cAAc;IAM1B,UAAU,IAAI,OAAO,CAAC,IAAI,CAAC;IAgD3B,MAAM,CAAC,OAAO,EAAE,OAAO,CAAC,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC,QAAQ,GAAG,IAAI,CAAC;IAyFlE,OAAO,CAAC,WAAW;IAuCnB,UAAU,IAAI,IAAI;IAKlB,OAAO,IAAI,IAAI;YAKD,aAAa;YAsBb,gBAAgB;YAOhB,cAAc;YAcd,YAAY;YAOZ,cAAc;CAW7B;AAED,OAAO,EACL,UAAU,EACV,SAAS,EACT,mBAAmB,IAAI,WAAW,EAClC,YAAY,IAAI,IAAI,EACpB,QAAQ,EACR,gBAAgB,IAAI,QAAQ,EAC5B,YAAY,GACb,MAAM,yCAAyC,CAAC"}
|
|
@@ -129,9 +129,13 @@ export class APIRouteHandler {
|
|
|
129
129
|
// Pages Router routes have descriptive names like articles.ts
|
|
130
130
|
// Note: Cannot use path-based detection (/app/) as projectDir may be '/app' in production
|
|
131
131
|
const isAppRoute = /\/route\.(ts|js|tsx|jsx)$/.test(match.route.page);
|
|
132
|
+
const isolationOptions = {
|
|
133
|
+
modulePath: match.route.page,
|
|
134
|
+
projectDir: this.projectDir,
|
|
135
|
+
};
|
|
132
136
|
const response = isAppRoute
|
|
133
|
-
? await executeAppRoute(handler, request, match, pathname, adapter)
|
|
134
|
-
: await executePagesRoute(handler, request, match, pathname, adapter, this.projectDir);
|
|
137
|
+
? await executeAppRoute(handler, request, match, pathname, adapter, isolationOptions)
|
|
138
|
+
: await executePagesRoute(handler, request, match, pathname, adapter, this.projectDir, isolationOptions);
|
|
135
139
|
const corsResponse = await applyCORSHeaders({
|
|
136
140
|
request,
|
|
137
141
|
response,
|
|
@@ -2,6 +2,12 @@ import * as dntShim from "../../../_dnt.shims.js";
|
|
|
2
2
|
import type { RuntimeAdapter } from "../../platform/adapters/base.js";
|
|
3
3
|
import type { RouteMatch } from "./api-route-matcher.js";
|
|
4
4
|
import type { APIRoute } from "./module-loader/types.js";
|
|
5
|
-
export
|
|
6
|
-
|
|
5
|
+
export interface ExecuteRouteOptions {
|
|
6
|
+
/** Absolute path to the handler module on disk (for isolated execution) */
|
|
7
|
+
modulePath?: string;
|
|
8
|
+
/** Project directory (for isolated execution scope) */
|
|
9
|
+
projectDir?: string;
|
|
10
|
+
}
|
|
11
|
+
export declare function executeAppRoute(handler: APIRoute, request: dntShim.Request, match: RouteMatch, pathname: string, adapter: RuntimeAdapter, options?: ExecuteRouteOptions): Promise<dntShim.Response>;
|
|
12
|
+
export declare function executePagesRoute(handler: APIRoute, request: dntShim.Request, match: RouteMatch, pathname: string, adapter: RuntimeAdapter, projectDir?: string, options?: ExecuteRouteOptions): Promise<dntShim.Response>;
|
|
7
13
|
//# sourceMappingURL=route-executor.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"route-executor.d.ts","sourceRoot":"","sources":["../../../../src/src/routing/api/route-executor.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,OAAO,MAAM,wBAAwB,CAAC;AAClD,OAAO,KAAK,EAAqB,cAAc,EAAE,MAAM,iCAAiC,CAAC;AAEzF,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,wBAAwB,CAAC;AAEzD,OAAO,KAAK,EACV,QAAQ,EAKT,MAAM,0BAA0B,CAAC;
|
|
1
|
+
{"version":3,"file":"route-executor.d.ts","sourceRoot":"","sources":["../../../../src/src/routing/api/route-executor.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,OAAO,MAAM,wBAAwB,CAAC;AAClD,OAAO,KAAK,EAAqB,cAAc,EAAE,MAAM,iCAAiC,CAAC;AAEzF,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,wBAAwB,CAAC;AAEzD,OAAO,KAAK,EACV,QAAQ,EAKT,MAAM,0BAA0B,CAAC;AAgUlC,MAAM,WAAW,mBAAmB;IAClC,2EAA2E;IAC3E,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,uDAAuD;IACvD,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAED,wBAAgB,eAAe,CAC7B,OAAO,EAAE,QAAQ,EACjB,OAAO,EAAE,OAAO,CAAC,OAAO,EACxB,KAAK,EAAE,UAAU,EACjB,QAAQ,EAAE,MAAM,EAChB,OAAO,EAAE,cAAc,EACvB,OAAO,CAAC,EAAE,mBAAmB,GAC5B,OAAO,CAAC,OAAO,CAAC,QAAQ,CAAC,CA6C3B;AAED,wBAAgB,iBAAiB,CAC/B,OAAO,EAAE,QAAQ,EACjB,OAAO,EAAE,OAAO,CAAC,OAAO,EACxB,KAAK,EAAE,UAAU,EACjB,QAAQ,EAAE,MAAM,EAChB,OAAO,EAAE,cAAc,EACvB,UAAU,CAAC,EAAE,MAAM,EACnB,OAAO,CAAC,EAAE,mBAAmB,GAC5B,OAAO,CAAC,OAAO,CAAC,QAAQ,CAAC,CAuC3B"}
|