@flight-framework/core 0.1.0 → 0.2.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +21 -0
- package/dist/{chunk-5KF3QQWZ.js → chunk-3ZSSRE6M.js} +5 -19
- package/dist/chunk-3ZSSRE6M.js.map +1 -0
- package/dist/chunk-4S5JWTGN.js +218 -0
- package/dist/chunk-4S5JWTGN.js.map +1 -0
- package/dist/chunk-62C7LX2E.js +205 -0
- package/dist/chunk-62C7LX2E.js.map +1 -0
- package/dist/chunk-63SCEXD7.js +3 -0
- package/dist/chunk-63SCEXD7.js.map +1 -0
- package/dist/{chunk-YIOQC3DC.js → chunk-6BDCTUQY.js} +3 -3
- package/dist/{chunk-YIOQC3DC.js.map → chunk-6BDCTUQY.js.map} +1 -1
- package/dist/chunk-6Z2RYHEU.js +212 -0
- package/dist/chunk-6Z2RYHEU.js.map +1 -0
- package/dist/chunk-HAX5OAB6.js +324 -0
- package/dist/chunk-HAX5OAB6.js.map +1 -0
- package/dist/chunk-K2CQZPCG.js +257 -0
- package/dist/chunk-K2CQZPCG.js.map +1 -0
- package/dist/chunk-N3TUOEV4.js +213 -0
- package/dist/chunk-N3TUOEV4.js.map +1 -0
- package/dist/chunk-NWMJYTMB.js +300 -0
- package/dist/chunk-NWMJYTMB.js.map +1 -0
- package/dist/chunk-OCVLNLTI.js +252 -0
- package/dist/chunk-OCVLNLTI.js.map +1 -0
- package/dist/chunk-PDW5WCMW.js +258 -0
- package/dist/chunk-PDW5WCMW.js.map +1 -0
- package/dist/chunk-PVUMB632.js +256 -0
- package/dist/chunk-PVUMB632.js.map +1 -0
- package/dist/{chunk-6WSPUG5L.js → chunk-RSVA2EYO.js} +2 -2
- package/dist/chunk-RSVA2EYO.js.map +1 -0
- package/dist/chunk-T4Z4HM4W.js +285 -0
- package/dist/chunk-T4Z4HM4W.js.map +1 -0
- package/dist/{chunk-OBNYNJB5.js → chunk-WOEIJWGJ.js} +6 -8
- package/dist/chunk-WOEIJWGJ.js.map +1 -0
- package/dist/{chunk-I2B4WSHC.js → chunk-XSY5AAXT.js} +3 -4
- package/dist/chunk-XSY5AAXT.js.map +1 -0
- package/dist/chunk-Y22AMGTM.js +3 -0
- package/dist/chunk-Y22AMGTM.js.map +1 -0
- package/dist/chunk-ZIE56LCA.js +341 -0
- package/dist/chunk-ZIE56LCA.js.map +1 -0
- package/dist/file-router/streaming-hints.d.ts +1 -1
- package/dist/file-router/streaming-hints.js +1 -1
- package/dist/index.d.ts +3 -1
- package/dist/index.js +19 -7
- package/dist/index.js.map +1 -1
- package/dist/rsc/adapters/index.d.ts +8 -0
- package/dist/rsc/adapters/index.js +7 -0
- package/dist/rsc/adapters/index.js.map +1 -0
- package/dist/rsc/adapters/preact.d.ts +97 -0
- package/dist/rsc/adapters/preact.js +3 -0
- package/dist/rsc/adapters/preact.js.map +1 -0
- package/dist/rsc/adapters/react.d.ts +82 -0
- package/dist/rsc/adapters/react.js +3 -0
- package/dist/rsc/adapters/react.js.map +1 -0
- package/dist/rsc/adapters/solid.d.ts +84 -0
- package/dist/rsc/adapters/solid.js +3 -0
- package/dist/rsc/adapters/solid.js.map +1 -0
- package/dist/rsc/adapters/vue.d.ts +80 -0
- package/dist/rsc/adapters/vue.js +3 -0
- package/dist/rsc/adapters/vue.js.map +1 -0
- package/dist/rsc/boundaries.d.ts +182 -0
- package/dist/rsc/boundaries.js +3 -0
- package/dist/rsc/boundaries.js.map +1 -0
- package/dist/rsc/context.d.ts +201 -0
- package/dist/rsc/context.js +3 -0
- package/dist/rsc/context.js.map +1 -0
- package/dist/rsc/index.d.ts +20 -124
- package/dist/rsc/index.js +13 -1
- package/dist/rsc/legacy.d.ts +131 -0
- package/dist/rsc/legacy.js +3 -0
- package/dist/rsc/legacy.js.map +1 -0
- package/dist/rsc/payload.d.ts +262 -0
- package/dist/rsc/payload.js +3 -0
- package/dist/rsc/payload.js.map +1 -0
- package/dist/rsc/plugins/esbuild.d.ts +124 -0
- package/dist/rsc/plugins/esbuild.js +4 -0
- package/dist/rsc/plugins/esbuild.js.map +1 -0
- package/dist/rsc/plugins/index.d.ts +4 -0
- package/dist/rsc/plugins/index.js +6 -0
- package/dist/rsc/plugins/index.js.map +1 -0
- package/dist/rsc/plugins/rollup.d.ts +103 -0
- package/dist/rsc/plugins/rollup.js +4 -0
- package/dist/rsc/plugins/rollup.js.map +1 -0
- package/dist/rsc/renderer.d.ts +160 -0
- package/dist/rsc/renderer.js +5 -0
- package/dist/rsc/renderer.js.map +1 -0
- package/dist/rsc/stream.d.ts +129 -0
- package/dist/rsc/stream.js +3 -0
- package/dist/rsc/stream.js.map +1 -0
- package/dist/rsc/vite-plugin.d.ts +78 -0
- package/dist/rsc/vite-plugin.js +4 -0
- package/dist/rsc/vite-plugin.js.map +1 -0
- package/dist/streaming/index.js +1 -1
- package/dist/streaming/observability.js +2 -2
- package/dist/streaming/priority.js +1 -1
- package/package.json +180 -124
- package/dist/chunk-5KF3QQWZ.js.map +0 -1
- package/dist/chunk-6WSPUG5L.js.map +0 -1
- package/dist/chunk-I2B4WSHC.js.map +0 -1
- package/dist/chunk-OBNYNJB5.js.map +0 -1
|
@@ -0,0 +1,324 @@
|
|
|
1
|
+
import { createServerChunk, createErrorChunk, toFlightElement, serialize, generateChunkId, createClientChunk } from './chunk-K2CQZPCG.js';
|
|
2
|
+
import { isClientReference } from './chunk-PDW5WCMW.js';
|
|
3
|
+
|
|
4
|
+
// src/rsc/renderer.ts
|
|
5
|
+
var FlightRenderer = class {
|
|
6
|
+
constructor(adapter, options = {}) {
|
|
7
|
+
this.adapter = adapter;
|
|
8
|
+
this.options = options;
|
|
9
|
+
}
|
|
10
|
+
chunks = [];
|
|
11
|
+
clientRefs = [];
|
|
12
|
+
pendingPromises = /* @__PURE__ */ new Map();
|
|
13
|
+
depth = 0;
|
|
14
|
+
/**
|
|
15
|
+
* Render a component tree to Flight chunks
|
|
16
|
+
*/
|
|
17
|
+
async render(element, ctx) {
|
|
18
|
+
const startTime = Date.now();
|
|
19
|
+
this.chunks = [];
|
|
20
|
+
this.clientRefs = [];
|
|
21
|
+
this.pendingPromises.clear();
|
|
22
|
+
this.depth = 0;
|
|
23
|
+
try {
|
|
24
|
+
const rootTree = await this.renderElement(element, ctx);
|
|
25
|
+
const root = createServerChunk("root", rootTree);
|
|
26
|
+
this.chunks.unshift(root);
|
|
27
|
+
await this.resolvePendingChunks(ctx);
|
|
28
|
+
const endTime = Date.now();
|
|
29
|
+
return {
|
|
30
|
+
chunks: this.chunks,
|
|
31
|
+
root,
|
|
32
|
+
clientRefs: this.clientRefs,
|
|
33
|
+
timing: {
|
|
34
|
+
startTime,
|
|
35
|
+
endTime,
|
|
36
|
+
duration: endTime - startTime
|
|
37
|
+
}
|
|
38
|
+
};
|
|
39
|
+
} catch (error) {
|
|
40
|
+
const errChunk = createErrorChunk("root", error, this.options.dev);
|
|
41
|
+
this.chunks.push(errChunk);
|
|
42
|
+
throw error;
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
/**
|
|
46
|
+
* Render as async generator (for streaming)
|
|
47
|
+
*/
|
|
48
|
+
async *renderStreaming(element, ctx) {
|
|
49
|
+
this.chunks = [];
|
|
50
|
+
this.clientRefs = [];
|
|
51
|
+
this.pendingPromises.clear();
|
|
52
|
+
this.depth = 0;
|
|
53
|
+
try {
|
|
54
|
+
const rootTree = await this.renderElement(element, ctx);
|
|
55
|
+
const root = createServerChunk("root", rootTree);
|
|
56
|
+
yield root;
|
|
57
|
+
while (this.pendingPromises.size > 0) {
|
|
58
|
+
const entries = [...this.pendingPromises.entries()];
|
|
59
|
+
const promises = entries.map(async ([id, promise]) => {
|
|
60
|
+
const tree = await promise;
|
|
61
|
+
this.pendingPromises.delete(id);
|
|
62
|
+
return createServerChunk(id, tree);
|
|
63
|
+
});
|
|
64
|
+
const chunk = await Promise.race(promises);
|
|
65
|
+
yield chunk;
|
|
66
|
+
}
|
|
67
|
+
for (const clientRef of this.clientRefs) {
|
|
68
|
+
yield clientRef;
|
|
69
|
+
}
|
|
70
|
+
} catch (error) {
|
|
71
|
+
yield createErrorChunk("root", error, this.options.dev);
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
/**
|
|
75
|
+
* Render an element to FlightElement
|
|
76
|
+
*/
|
|
77
|
+
async renderElement(element, ctx) {
|
|
78
|
+
this.depth++;
|
|
79
|
+
if (this.depth > (this.options.maxDepth ?? 100)) {
|
|
80
|
+
throw new Error("Maximum render depth exceeded. Check for infinite component loops.");
|
|
81
|
+
}
|
|
82
|
+
try {
|
|
83
|
+
if (element === null || element === void 0 || typeof element === "boolean") {
|
|
84
|
+
return { $$type: "null" };
|
|
85
|
+
}
|
|
86
|
+
if (typeof element === "string") {
|
|
87
|
+
return { $$type: "text", value: element };
|
|
88
|
+
}
|
|
89
|
+
if (typeof element === "number") {
|
|
90
|
+
return { $$type: "text", value: String(element) };
|
|
91
|
+
}
|
|
92
|
+
if (Array.isArray(element)) {
|
|
93
|
+
const children = await Promise.all(
|
|
94
|
+
element.map((child) => this.renderElement(child, ctx))
|
|
95
|
+
);
|
|
96
|
+
return { $$type: "fragment", children };
|
|
97
|
+
}
|
|
98
|
+
if (isClientReference(element)) {
|
|
99
|
+
return this.renderClientReference(element, ctx);
|
|
100
|
+
}
|
|
101
|
+
if (this.adapter.isElement(element)) {
|
|
102
|
+
return this.renderFrameworkElement(element, ctx);
|
|
103
|
+
}
|
|
104
|
+
return toFlightElement(element);
|
|
105
|
+
} finally {
|
|
106
|
+
this.depth--;
|
|
107
|
+
}
|
|
108
|
+
}
|
|
109
|
+
/**
|
|
110
|
+
* Render a framework-specific element
|
|
111
|
+
*/
|
|
112
|
+
async renderFrameworkElement(element, ctx) {
|
|
113
|
+
const typeInfo = this.adapter.getElementType(element);
|
|
114
|
+
const props = this.adapter.getProps(element);
|
|
115
|
+
const key = this.adapter.getKey(element);
|
|
116
|
+
switch (typeInfo.kind) {
|
|
117
|
+
case "host":
|
|
118
|
+
return this.renderHostElement(typeInfo.tag, props, key, ctx);
|
|
119
|
+
case "component":
|
|
120
|
+
return this.renderComponent(typeInfo.fn, typeInfo.name, props, ctx);
|
|
121
|
+
case "fragment": {
|
|
122
|
+
const children = this.adapter.getChildren(element);
|
|
123
|
+
const renderedChildren = await Promise.all(
|
|
124
|
+
children.map((child) => this.renderElement(child, ctx))
|
|
125
|
+
);
|
|
126
|
+
return { $$type: "fragment", children: renderedChildren };
|
|
127
|
+
}
|
|
128
|
+
case "suspense": {
|
|
129
|
+
return this.renderSuspense(element, typeInfo.fallback, ctx);
|
|
130
|
+
}
|
|
131
|
+
case "text":
|
|
132
|
+
return { $$type: "text", value: typeInfo.value };
|
|
133
|
+
case "null":
|
|
134
|
+
return { $$type: "null" };
|
|
135
|
+
default:
|
|
136
|
+
return { $$type: "null" };
|
|
137
|
+
}
|
|
138
|
+
}
|
|
139
|
+
/**
|
|
140
|
+
* Render a host element (div, span, etc.)
|
|
141
|
+
*/
|
|
142
|
+
async renderHostElement(tag, props, key, ctx) {
|
|
143
|
+
const { children: childrenProp, ...restProps } = props;
|
|
144
|
+
const serializedProps = {};
|
|
145
|
+
for (const [propKey, value] of Object.entries(restProps)) {
|
|
146
|
+
if (typeof value !== "function") {
|
|
147
|
+
serializedProps[propKey] = serialize(value);
|
|
148
|
+
}
|
|
149
|
+
}
|
|
150
|
+
const rawChildren = childrenProp ? Array.isArray(childrenProp) ? childrenProp : [childrenProp] : [];
|
|
151
|
+
const children = await Promise.all(
|
|
152
|
+
rawChildren.map((child) => this.renderElement(child, ctx))
|
|
153
|
+
);
|
|
154
|
+
return {
|
|
155
|
+
$$type: "host",
|
|
156
|
+
tag,
|
|
157
|
+
key,
|
|
158
|
+
props: serializedProps,
|
|
159
|
+
children
|
|
160
|
+
};
|
|
161
|
+
}
|
|
162
|
+
/**
|
|
163
|
+
* Render a component (server or client)
|
|
164
|
+
*/
|
|
165
|
+
async renderComponent(component, name, props, ctx) {
|
|
166
|
+
if (this.adapter.isClientBoundary(component)) {
|
|
167
|
+
return this.renderClientBoundary(component, name, props, ctx);
|
|
168
|
+
}
|
|
169
|
+
try {
|
|
170
|
+
const result = await component(props, ctx);
|
|
171
|
+
return this.renderElement(result, ctx);
|
|
172
|
+
} catch (error) {
|
|
173
|
+
if (error instanceof Promise) {
|
|
174
|
+
return this.renderAsyncBoundary(error, name, props, ctx);
|
|
175
|
+
}
|
|
176
|
+
this.options.onError?.(error, name);
|
|
177
|
+
throw error;
|
|
178
|
+
}
|
|
179
|
+
}
|
|
180
|
+
/**
|
|
181
|
+
* Render a client boundary
|
|
182
|
+
*/
|
|
183
|
+
async renderClientBoundary(component, name, props, _ctx) {
|
|
184
|
+
const chunkId = generateChunkId("c");
|
|
185
|
+
const moduleId = component.__flight_module ?? name;
|
|
186
|
+
const exportName = component.__flight_export ?? "default";
|
|
187
|
+
let fallback;
|
|
188
|
+
if (this.options.includeSSRFallbacks && this.adapter.renderToString) {
|
|
189
|
+
try {
|
|
190
|
+
fallback = await this.adapter.renderToString(props);
|
|
191
|
+
} catch {
|
|
192
|
+
}
|
|
193
|
+
}
|
|
194
|
+
const clientChunk = createClientChunk(chunkId, moduleId, exportName, props, fallback);
|
|
195
|
+
this.clientRefs.push(clientChunk);
|
|
196
|
+
this.chunks.push(clientChunk);
|
|
197
|
+
return {
|
|
198
|
+
$$type: "client",
|
|
199
|
+
ref: chunkId,
|
|
200
|
+
ssr: fallback
|
|
201
|
+
};
|
|
202
|
+
}
|
|
203
|
+
/**
|
|
204
|
+
* Render a Suspense boundary
|
|
205
|
+
*/
|
|
206
|
+
async renderSuspense(element, fallbackElement, ctx) {
|
|
207
|
+
const boundaryId = generateChunkId("s");
|
|
208
|
+
const children = this.adapter.getChildren(element);
|
|
209
|
+
const fallback = fallbackElement ? await this.renderElement(fallbackElement, ctx) : { $$type: "null" };
|
|
210
|
+
const renderedChildren = [];
|
|
211
|
+
for (const child of children) {
|
|
212
|
+
try {
|
|
213
|
+
const rendered = await this.renderElement(child, ctx);
|
|
214
|
+
renderedChildren.push(rendered);
|
|
215
|
+
} catch (error) {
|
|
216
|
+
if (error instanceof Promise) {
|
|
217
|
+
this.pendingPromises.set(boundaryId, error.then(async () => {
|
|
218
|
+
const children2 = this.adapter.getChildren(element);
|
|
219
|
+
const rendered = await Promise.all(
|
|
220
|
+
children2.map((c) => this.renderElement(c, ctx))
|
|
221
|
+
);
|
|
222
|
+
return { $$type: "fragment", children: rendered };
|
|
223
|
+
}));
|
|
224
|
+
return {
|
|
225
|
+
$$type: "suspense",
|
|
226
|
+
id: boundaryId,
|
|
227
|
+
fallback,
|
|
228
|
+
children: [{ $$type: "lazy", id: boundaryId, fallback }]
|
|
229
|
+
};
|
|
230
|
+
}
|
|
231
|
+
throw error;
|
|
232
|
+
}
|
|
233
|
+
}
|
|
234
|
+
return {
|
|
235
|
+
$$type: "suspense",
|
|
236
|
+
id: boundaryId,
|
|
237
|
+
fallback,
|
|
238
|
+
children: renderedChildren
|
|
239
|
+
};
|
|
240
|
+
}
|
|
241
|
+
/**
|
|
242
|
+
* Render an async boundary (promise thrown from component)
|
|
243
|
+
*/
|
|
244
|
+
renderAsyncBoundary(promise, name, props, ctx) {
|
|
245
|
+
const boundaryId = generateChunkId("a");
|
|
246
|
+
this.pendingPromises.set(
|
|
247
|
+
boundaryId,
|
|
248
|
+
promise.then(async () => {
|
|
249
|
+
const component = props.component;
|
|
250
|
+
if (component) {
|
|
251
|
+
const result = await component(props, ctx);
|
|
252
|
+
return this.renderElement(result, ctx);
|
|
253
|
+
}
|
|
254
|
+
return { $$type: "null" };
|
|
255
|
+
})
|
|
256
|
+
);
|
|
257
|
+
return {
|
|
258
|
+
$$type: "lazy",
|
|
259
|
+
id: boundaryId,
|
|
260
|
+
fallback: { $$type: "text", value: `Loading ${name}...` }
|
|
261
|
+
};
|
|
262
|
+
}
|
|
263
|
+
/**
|
|
264
|
+
* Render a Client Reference directly
|
|
265
|
+
*/
|
|
266
|
+
async renderClientReference(ref, _ctx) {
|
|
267
|
+
const chunkId = generateChunkId("c");
|
|
268
|
+
const clientChunk = createClientChunk(
|
|
269
|
+
chunkId,
|
|
270
|
+
ref.__flight_module,
|
|
271
|
+
ref.__flight_export,
|
|
272
|
+
{}
|
|
273
|
+
// Props are embedded in the reference
|
|
274
|
+
);
|
|
275
|
+
this.clientRefs.push(clientChunk);
|
|
276
|
+
this.chunks.push(clientChunk);
|
|
277
|
+
return {
|
|
278
|
+
$$type: "client",
|
|
279
|
+
ref: chunkId
|
|
280
|
+
};
|
|
281
|
+
}
|
|
282
|
+
/**
|
|
283
|
+
* Resolve all pending async chunks
|
|
284
|
+
*/
|
|
285
|
+
async resolvePendingChunks(_ctx) {
|
|
286
|
+
while (this.pendingPromises.size > 0) {
|
|
287
|
+
const entries = [...this.pendingPromises.entries()];
|
|
288
|
+
for (const [id, promise] of entries) {
|
|
289
|
+
try {
|
|
290
|
+
const tree = await promise;
|
|
291
|
+
this.chunks.push(createServerChunk(id, tree));
|
|
292
|
+
} catch (error) {
|
|
293
|
+
this.chunks.push(createErrorChunk(id, error, this.options.dev));
|
|
294
|
+
}
|
|
295
|
+
this.pendingPromises.delete(id);
|
|
296
|
+
}
|
|
297
|
+
}
|
|
298
|
+
}
|
|
299
|
+
};
|
|
300
|
+
function createRenderer(adapter, options) {
|
|
301
|
+
return new FlightRenderer(adapter, options);
|
|
302
|
+
}
|
|
303
|
+
async function renderServerComponent(component, props, ctx, adapter, options) {
|
|
304
|
+
const renderer = createRenderer(adapter, options);
|
|
305
|
+
const element = {
|
|
306
|
+
type: component,
|
|
307
|
+
props,
|
|
308
|
+
$$typeof: /* @__PURE__ */ Symbol.for("react.element")
|
|
309
|
+
};
|
|
310
|
+
return renderer.render(element, ctx);
|
|
311
|
+
}
|
|
312
|
+
async function* renderServerComponentStreaming(component, props, ctx, adapter, options) {
|
|
313
|
+
const renderer = createRenderer(adapter, options);
|
|
314
|
+
const element = {
|
|
315
|
+
type: component,
|
|
316
|
+
props,
|
|
317
|
+
$$typeof: /* @__PURE__ */ Symbol.for("react.element")
|
|
318
|
+
};
|
|
319
|
+
yield* renderer.renderStreaming(element, ctx);
|
|
320
|
+
}
|
|
321
|
+
|
|
322
|
+
export { FlightRenderer, createRenderer, renderServerComponent, renderServerComponentStreaming };
|
|
323
|
+
//# sourceMappingURL=chunk-HAX5OAB6.js.map
|
|
324
|
+
//# sourceMappingURL=chunk-HAX5OAB6.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/rsc/renderer.ts"],"names":["children"],"mappings":"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","file":"chunk-HAX5OAB6.js","sourcesContent":["/**\r\n * @flight-framework/core - Server Component Renderer\r\n * \r\n * Renders Server Components to FlightChunks.\r\n * Framework-agnostic rendering engine that works with adapters.\r\n * \r\n * @module @flight-framework/core/rsc/renderer\r\n */\r\n\r\nimport type {\r\n FlightChunk,\r\n FlightElement,\r\n ServerComponentChunk,\r\n ClientReferenceChunk,\r\n} from './payload.js';\r\nimport {\r\n generateChunkId,\r\n createServerChunk,\r\n createClientChunk,\r\n createErrorChunk,\r\n toFlightElement,\r\n serialize,\r\n} from './payload.js';\r\nimport {\r\n isClientReference,\r\n type ClientReference,\r\n} from './boundaries.js';\r\nimport type { ServerContext } from './context.js';\r\n\r\n// ============================================================================\r\n// Types\r\n// ============================================================================\r\n\r\n/**\r\n * UI Framework adapter for rendering\r\n */\r\nexport interface UIAdapter {\r\n /** Adapter name */\r\n name: string;\r\n\r\n /** Check if value is a framework element */\r\n isElement(value: unknown): boolean;\r\n\r\n /** Get element type info */\r\n getElementType(element: unknown): ElementTypeInfo;\r\n\r\n /** Get element props */\r\n getProps(element: unknown): Record<string, unknown>;\r\n\r\n /** Get element children */\r\n getChildren(element: unknown): unknown[];\r\n\r\n /** Get element key */\r\n getKey(element: unknown): string | number | undefined;\r\n\r\n /** Check if component is a client boundary */\r\n isClientBoundary(component: unknown): boolean;\r\n\r\n /** Render element to HTML string (for SSR fallback) */\r\n renderToString?(element: unknown): Promise<string>;\r\n}\r\n\r\nexport type ElementTypeInfo =\r\n | { kind: 'host'; tag: string }\r\n | { kind: 'component'; fn: ComponentFn; name: string }\r\n | { kind: 'fragment' }\r\n | { kind: 'suspense'; fallback?: unknown }\r\n | { kind: 'provider'; value?: unknown }\r\n | { kind: 'context' }\r\n | { kind: 'text'; value: string }\r\n | { kind: 'null' };\r\n\r\n/**\r\n * Component function type\r\n */\r\nexport type ComponentFn = (\r\n props: Record<string, unknown>,\r\n ctx?: ServerContext\r\n) => unknown | Promise<unknown>;\r\n\r\n/**\r\n * Render options\r\n */\r\nexport interface RenderOptions {\r\n /** Include SSR fallbacks for client components */\r\n includeSSRFallbacks?: boolean;\r\n\r\n /** Error handler */\r\n onError?: (error: Error, componentName?: string) => void;\r\n\r\n /** Dev mode (include extra debug info) */\r\n dev?: boolean;\r\n\r\n /** Max render depth to prevent infinite loops */\r\n maxDepth?: number;\r\n}\r\n\r\n/**\r\n * Render result with metadata\r\n */\r\nexport interface RenderResult {\r\n /** All chunks generated */\r\n chunks: FlightChunk[];\r\n\r\n /** Root chunk */\r\n root: ServerComponentChunk;\r\n\r\n /** Client references found */\r\n clientRefs: ClientReferenceChunk[];\r\n\r\n /** Timing info */\r\n timing: {\r\n startTime: number;\r\n endTime: number;\r\n duration: number;\r\n };\r\n}\r\n\r\n// ============================================================================\r\n// Renderer Implementation\r\n// ============================================================================\r\n\r\n/**\r\n * Flight Server Component Renderer\r\n */\r\nexport class FlightRenderer {\r\n private chunks: FlightChunk[] = [];\r\n private clientRefs: ClientReferenceChunk[] = [];\r\n private pendingPromises = new Map<string, Promise<FlightElement>>();\r\n private depth = 0;\r\n\r\n constructor(\r\n private adapter: UIAdapter,\r\n private options: RenderOptions = {}\r\n ) { }\r\n\r\n /**\r\n * Render a component tree to Flight chunks\r\n */\r\n async render(\r\n element: unknown,\r\n ctx: ServerContext\r\n ): Promise<RenderResult> {\r\n const startTime = Date.now();\r\n\r\n this.chunks = [];\r\n this.clientRefs = [];\r\n this.pendingPromises.clear();\r\n this.depth = 0;\r\n\r\n try {\r\n // Render the root element\r\n const rootTree = await this.renderElement(element, ctx);\r\n const root = createServerChunk('root', rootTree);\r\n this.chunks.unshift(root);\r\n\r\n // Wait for any pending async boundaries\r\n await this.resolvePendingChunks(ctx);\r\n\r\n const endTime = Date.now();\r\n\r\n return {\r\n chunks: this.chunks,\r\n root,\r\n clientRefs: this.clientRefs,\r\n timing: {\r\n startTime,\r\n endTime,\r\n duration: endTime - startTime,\r\n },\r\n };\r\n } catch (error) {\r\n const errChunk = createErrorChunk('root', error as Error, this.options.dev);\r\n this.chunks.push(errChunk);\r\n\r\n throw error;\r\n }\r\n }\r\n\r\n /**\r\n * Render as async generator (for streaming)\r\n */\r\n async *renderStreaming(\r\n element: unknown,\r\n ctx: ServerContext\r\n ): AsyncGenerator<FlightChunk> {\r\n // Note: startTime available for future timing features\r\n this.chunks = [];\r\n this.clientRefs = [];\r\n this.pendingPromises.clear();\r\n this.depth = 0;\r\n\r\n try {\r\n // Render root synchronously\r\n const rootTree = await this.renderElement(element, ctx);\r\n const root = createServerChunk('root', rootTree);\r\n yield root;\r\n\r\n // Yield pending chunks as they resolve\r\n while (this.pendingPromises.size > 0) {\r\n const entries = [...this.pendingPromises.entries()];\r\n\r\n // Race all pending promises\r\n const promises = entries.map(async ([id, promise]) => {\r\n const tree = await promise;\r\n this.pendingPromises.delete(id);\r\n return createServerChunk(id, tree);\r\n });\r\n\r\n // Yield first to complete\r\n const chunk = await Promise.race(promises);\r\n yield chunk;\r\n }\r\n\r\n // Yield all client refs\r\n for (const clientRef of this.clientRefs) {\r\n yield clientRef;\r\n }\r\n\r\n } catch (error) {\r\n yield createErrorChunk('root', error as Error, this.options.dev);\r\n }\r\n }\r\n\r\n /**\r\n * Render an element to FlightElement\r\n */\r\n private async renderElement(\r\n element: unknown,\r\n ctx: ServerContext\r\n ): Promise<FlightElement> {\r\n // Check depth limit\r\n this.depth++;\r\n if (this.depth > (this.options.maxDepth ?? 100)) {\r\n throw new Error('Maximum render depth exceeded. Check for infinite component loops.');\r\n }\r\n\r\n try {\r\n // Handle null/undefined/boolean\r\n if (element === null || element === undefined || typeof element === 'boolean') {\r\n return { $$type: 'null' };\r\n }\r\n\r\n // Handle primitives\r\n if (typeof element === 'string') {\r\n return { $$type: 'text', value: element };\r\n }\r\n if (typeof element === 'number') {\r\n return { $$type: 'text', value: String(element) };\r\n }\r\n\r\n // Handle arrays (fragments)\r\n if (Array.isArray(element)) {\r\n const children = await Promise.all(\r\n element.map(child => this.renderElement(child, ctx))\r\n );\r\n return { $$type: 'fragment', children };\r\n }\r\n\r\n // Handle Client References\r\n if (isClientReference(element)) {\r\n return this.renderClientReference(element, ctx);\r\n }\r\n\r\n // Handle framework elements\r\n if (this.adapter.isElement(element)) {\r\n return this.renderFrameworkElement(element, ctx);\r\n }\r\n\r\n // Unknown - try to convert\r\n return toFlightElement(element);\r\n\r\n } finally {\r\n this.depth--;\r\n }\r\n }\r\n\r\n /**\r\n * Render a framework-specific element\r\n */\r\n private async renderFrameworkElement(\r\n element: unknown,\r\n ctx: ServerContext\r\n ): Promise<FlightElement> {\r\n const typeInfo = this.adapter.getElementType(element);\r\n const props = this.adapter.getProps(element);\r\n const key = this.adapter.getKey(element);\r\n\r\n switch (typeInfo.kind) {\r\n case 'host':\r\n return this.renderHostElement(typeInfo.tag, props, key, ctx);\r\n\r\n case 'component':\r\n return this.renderComponent(typeInfo.fn, typeInfo.name, props, ctx);\r\n\r\n case 'fragment': {\r\n const children = this.adapter.getChildren(element);\r\n const renderedChildren = await Promise.all(\r\n children.map(child => this.renderElement(child, ctx))\r\n );\r\n return { $$type: 'fragment', children: renderedChildren };\r\n }\r\n\r\n case 'suspense': {\r\n return this.renderSuspense(element, typeInfo.fallback, ctx);\r\n }\r\n\r\n case 'text':\r\n return { $$type: 'text', value: typeInfo.value };\r\n\r\n case 'null':\r\n return { $$type: 'null' };\r\n\r\n default:\r\n return { $$type: 'null' };\r\n }\r\n }\r\n\r\n /**\r\n * Render a host element (div, span, etc.)\r\n */\r\n private async renderHostElement(\r\n tag: string,\r\n props: Record<string, unknown>,\r\n key: string | number | undefined,\r\n ctx: ServerContext\r\n ): Promise<FlightElement> {\r\n // Extract children\r\n const { children: childrenProp, ...restProps } = props;\r\n\r\n // Serialize props (excluding functions and children)\r\n const serializedProps: Record<string, unknown> = {};\r\n for (const [propKey, value] of Object.entries(restProps)) {\r\n if (typeof value !== 'function') {\r\n serializedProps[propKey] = serialize(value);\r\n }\r\n }\r\n\r\n // Render children\r\n const rawChildren = childrenProp ?\r\n (Array.isArray(childrenProp) ? childrenProp : [childrenProp]) :\r\n [];\r\n\r\n const children = await Promise.all(\r\n rawChildren.map(child => this.renderElement(child, ctx))\r\n );\r\n\r\n return {\r\n $$type: 'host',\r\n tag,\r\n key,\r\n props: serializedProps as Record<string, import('./payload.js').SerializedValue>,\r\n children,\r\n };\r\n }\r\n\r\n /**\r\n * Render a component (server or client)\r\n */\r\n private async renderComponent(\r\n component: ComponentFn,\r\n name: string,\r\n props: Record<string, unknown>,\r\n ctx: ServerContext\r\n ): Promise<FlightElement> {\r\n // Check if this is a client component\r\n if (this.adapter.isClientBoundary(component)) {\r\n return this.renderClientBoundary(component, name, props, ctx);\r\n }\r\n\r\n // Execute server component\r\n try {\r\n const result = await component(props, ctx);\r\n return this.renderElement(result, ctx);\r\n } catch (error) {\r\n // Check for Suspense promise\r\n if (error instanceof Promise) {\r\n return this.renderAsyncBoundary(error, name, props, ctx);\r\n }\r\n\r\n this.options.onError?.(error as Error, name);\r\n throw error;\r\n }\r\n }\r\n\r\n /**\r\n * Render a client boundary\r\n */\r\n private async renderClientBoundary(\r\n component: ComponentFn,\r\n name: string,\r\n props: Record<string, unknown>,\r\n _ctx: ServerContext\r\n ): Promise<FlightElement> {\r\n const chunkId = generateChunkId('c');\r\n\r\n // Get module info from component\r\n const moduleId = (component as unknown as { __flight_module?: string }).__flight_module ?? name;\r\n const exportName = (component as unknown as { __flight_export?: string }).__flight_export ?? 'default';\r\n\r\n // Generate SSR fallback if enabled\r\n let fallback: string | undefined;\r\n if (this.options.includeSSRFallbacks && this.adapter.renderToString) {\r\n try {\r\n // Create element with props for SSR\r\n fallback = await this.adapter.renderToString(props);\r\n } catch {\r\n // SSR failed, continue without fallback\r\n }\r\n }\r\n\r\n // Create client reference chunk\r\n const clientChunk = createClientChunk(chunkId, moduleId, exportName, props, fallback);\r\n this.clientRefs.push(clientChunk);\r\n this.chunks.push(clientChunk);\r\n\r\n return {\r\n $$type: 'client',\r\n ref: chunkId,\r\n ssr: fallback,\r\n };\r\n }\r\n\r\n /**\r\n * Render a Suspense boundary\r\n */\r\n private async renderSuspense(\r\n element: unknown,\r\n fallbackElement: unknown,\r\n ctx: ServerContext\r\n ): Promise<FlightElement> {\r\n const boundaryId = generateChunkId('s');\r\n const children = this.adapter.getChildren(element);\r\n\r\n // Render fallback\r\n const fallback = fallbackElement ?\r\n await this.renderElement(fallbackElement, ctx) :\r\n { $$type: 'null' as const };\r\n\r\n // Render children\r\n const renderedChildren: FlightElement[] = [];\r\n for (const child of children) {\r\n try {\r\n const rendered = await this.renderElement(child, ctx);\r\n renderedChildren.push(rendered);\r\n } catch (error) {\r\n if (error instanceof Promise) {\r\n // This is a suspended promise\r\n this.pendingPromises.set(boundaryId, error.then(async () => {\r\n const children = this.adapter.getChildren(element);\r\n const rendered = await Promise.all(\r\n children.map(c => this.renderElement(c, ctx))\r\n );\r\n return { $$type: 'fragment' as const, children: rendered };\r\n }));\r\n\r\n // Return suspense with fallback for now\r\n return {\r\n $$type: 'suspense',\r\n id: boundaryId,\r\n fallback,\r\n children: [{ $$type: 'lazy', id: boundaryId, fallback }],\r\n };\r\n }\r\n throw error;\r\n }\r\n }\r\n\r\n return {\r\n $$type: 'suspense',\r\n id: boundaryId,\r\n fallback,\r\n children: renderedChildren,\r\n };\r\n }\r\n\r\n /**\r\n * Render an async boundary (promise thrown from component)\r\n */\r\n private renderAsyncBoundary(\r\n promise: Promise<unknown>,\r\n name: string,\r\n props: Record<string, unknown>,\r\n ctx: ServerContext\r\n ): FlightElement {\r\n const boundaryId = generateChunkId('a');\r\n\r\n // Track this promise\r\n this.pendingPromises.set(boundaryId,\r\n promise.then(async () => {\r\n // Re-render the component after promise resolves\r\n const component = (props as unknown as { component: ComponentFn }).component;\r\n if (component) {\r\n const result = await component(props, ctx);\r\n return this.renderElement(result, ctx);\r\n }\r\n return { $$type: 'null' as const };\r\n })\r\n );\r\n\r\n return {\r\n $$type: 'lazy',\r\n id: boundaryId,\r\n fallback: { $$type: 'text', value: `Loading ${name}...` },\r\n };\r\n }\r\n\r\n /**\r\n * Render a Client Reference directly\r\n */\r\n private async renderClientReference(\r\n ref: ClientReference,\r\n _ctx: ServerContext\r\n ): Promise<FlightElement> {\r\n const chunkId = generateChunkId('c');\r\n\r\n const clientChunk = createClientChunk(\r\n chunkId,\r\n ref.__flight_module,\r\n ref.__flight_export,\r\n {} // Props are embedded in the reference\r\n );\r\n\r\n this.clientRefs.push(clientChunk);\r\n this.chunks.push(clientChunk);\r\n\r\n return {\r\n $$type: 'client',\r\n ref: chunkId,\r\n };\r\n }\r\n\r\n /**\r\n * Resolve all pending async chunks\r\n */\r\n private async resolvePendingChunks(_ctx: ServerContext): Promise<void> {\r\n while (this.pendingPromises.size > 0) {\r\n const entries = [...this.pendingPromises.entries()];\r\n\r\n for (const [id, promise] of entries) {\r\n try {\r\n const tree = await promise;\r\n this.chunks.push(createServerChunk(id, tree));\r\n } catch (error) {\r\n this.chunks.push(createErrorChunk(id, error as Error, this.options.dev));\r\n }\r\n this.pendingPromises.delete(id);\r\n }\r\n }\r\n }\r\n}\r\n\r\n// ============================================================================\r\n// Helper Functions\r\n// ============================================================================\r\n\r\n/**\r\n * Create a renderer with adapter\r\n */\r\nexport function createRenderer(\r\n adapter: UIAdapter,\r\n options?: RenderOptions\r\n): FlightRenderer {\r\n return new FlightRenderer(adapter, options);\r\n}\r\n\r\n/**\r\n * Render a server component tree\r\n */\r\nexport async function renderServerComponent<P>(\r\n component: ComponentFn,\r\n props: P,\r\n ctx: ServerContext,\r\n adapter: UIAdapter,\r\n options?: RenderOptions\r\n): Promise<RenderResult> {\r\n const renderer = createRenderer(adapter, options);\r\n\r\n // Create root element\r\n const element = {\r\n type: component,\r\n props: props as Record<string, unknown>,\r\n $$typeof: Symbol.for('react.element')\r\n };\r\n\r\n return renderer.render(element, ctx);\r\n}\r\n\r\n/**\r\n * Render server component as streaming chunks\r\n */\r\nexport async function* renderServerComponentStreaming<P>(\r\n component: ComponentFn,\r\n props: P,\r\n ctx: ServerContext,\r\n adapter: UIAdapter,\r\n options?: RenderOptions\r\n): AsyncGenerator<FlightChunk> {\r\n const renderer = createRenderer(adapter, options);\r\n\r\n const element = {\r\n type: component,\r\n props: props as Record<string, unknown>,\r\n $$typeof: Symbol.for('react.element')\r\n };\r\n\r\n yield* renderer.renderStreaming(element, ctx);\r\n}\r\n"]}
|
|
@@ -0,0 +1,257 @@
|
|
|
1
|
+
// src/rsc/payload.ts
|
|
2
|
+
function serialize(value) {
|
|
3
|
+
return serializeValue(value, /* @__PURE__ */ new WeakSet());
|
|
4
|
+
}
|
|
5
|
+
function serializeValue(value, seen) {
|
|
6
|
+
if (value === null) return null;
|
|
7
|
+
if (value === void 0) return { $$flight: "undefined", value: "" };
|
|
8
|
+
if (typeof value === "string") return value;
|
|
9
|
+
if (typeof value === "number") {
|
|
10
|
+
if (Number.isNaN(value)) return { $$flight: "undefined", value: "NaN" };
|
|
11
|
+
if (!Number.isFinite(value)) return { $$flight: "undefined", value: value > 0 ? "Infinity" : "-Infinity" };
|
|
12
|
+
return value;
|
|
13
|
+
}
|
|
14
|
+
if (typeof value === "boolean") return value;
|
|
15
|
+
if (typeof value === "bigint") return { $$flight: "bigint", value: value.toString() };
|
|
16
|
+
if (typeof value === "symbol") return { $$flight: "symbol", value: value.description ?? "" };
|
|
17
|
+
if (typeof value === "function") {
|
|
18
|
+
throw new FlightSerializationError(
|
|
19
|
+
"Functions cannot be passed from Server to Client Components. If you need to pass a function, use a Server Action instead."
|
|
20
|
+
);
|
|
21
|
+
}
|
|
22
|
+
if (typeof value === "object") {
|
|
23
|
+
if (seen.has(value)) {
|
|
24
|
+
throw new FlightSerializationError("Circular references are not supported in Flight payloads.");
|
|
25
|
+
}
|
|
26
|
+
seen.add(value);
|
|
27
|
+
}
|
|
28
|
+
if (value instanceof Date) {
|
|
29
|
+
return { $$flight: "date", value: value.toISOString() };
|
|
30
|
+
}
|
|
31
|
+
if (value instanceof RegExp) {
|
|
32
|
+
return { $$flight: "regexp", value: value.toString() };
|
|
33
|
+
}
|
|
34
|
+
if (value instanceof URL) {
|
|
35
|
+
return { $$flight: "url", value: value.href };
|
|
36
|
+
}
|
|
37
|
+
if (value instanceof Map) {
|
|
38
|
+
const entries = [];
|
|
39
|
+
for (const [k, v] of value) {
|
|
40
|
+
entries.push([serializeValue(k, seen), serializeValue(v, seen)]);
|
|
41
|
+
}
|
|
42
|
+
return { $$flight: "map", value: entries };
|
|
43
|
+
}
|
|
44
|
+
if (value instanceof Set) {
|
|
45
|
+
const items = [];
|
|
46
|
+
for (const v of value) {
|
|
47
|
+
items.push(serializeValue(v, seen));
|
|
48
|
+
}
|
|
49
|
+
return { $$flight: "set", value: items };
|
|
50
|
+
}
|
|
51
|
+
if (value instanceof Error) {
|
|
52
|
+
return {
|
|
53
|
+
$$flight: "error",
|
|
54
|
+
value: JSON.stringify({ name: value.name, message: value.message })
|
|
55
|
+
};
|
|
56
|
+
}
|
|
57
|
+
if (Array.isArray(value)) {
|
|
58
|
+
return value.map((v) => serializeValue(v, seen));
|
|
59
|
+
}
|
|
60
|
+
if (isPlainObject(value)) {
|
|
61
|
+
const result = {};
|
|
62
|
+
for (const [k, v] of Object.entries(value)) {
|
|
63
|
+
result[k] = serializeValue(v, seen);
|
|
64
|
+
}
|
|
65
|
+
return result;
|
|
66
|
+
}
|
|
67
|
+
try {
|
|
68
|
+
return JSON.parse(JSON.stringify(value));
|
|
69
|
+
} catch {
|
|
70
|
+
throw new FlightSerializationError(
|
|
71
|
+
`Cannot serialize value of type ${value?.constructor?.name ?? typeof value}. Only serializable values can be passed to Client Components.`
|
|
72
|
+
);
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
function deserialize(value) {
|
|
76
|
+
return deserializeValue(value);
|
|
77
|
+
}
|
|
78
|
+
function deserializeValue(value) {
|
|
79
|
+
if (value === null || value === void 0) return value;
|
|
80
|
+
if (typeof value === "string" || typeof value === "number" || typeof value === "boolean") {
|
|
81
|
+
return value;
|
|
82
|
+
}
|
|
83
|
+
if (isSpecialValue(value)) {
|
|
84
|
+
switch (value.$$flight) {
|
|
85
|
+
case "undefined":
|
|
86
|
+
if (value.value === "NaN") return NaN;
|
|
87
|
+
if (value.value === "Infinity") return Infinity;
|
|
88
|
+
if (value.value === "-Infinity") return -Infinity;
|
|
89
|
+
return void 0;
|
|
90
|
+
case "date":
|
|
91
|
+
return new Date(value.value);
|
|
92
|
+
case "bigint":
|
|
93
|
+
return BigInt(value.value);
|
|
94
|
+
case "symbol":
|
|
95
|
+
return Symbol(value.value);
|
|
96
|
+
case "regexp": {
|
|
97
|
+
const match = value.value.match(/^\/(.*)\/([gimsuy]*)$/);
|
|
98
|
+
if (match) return new RegExp(match[1], match[2]);
|
|
99
|
+
return new RegExp(value.value);
|
|
100
|
+
}
|
|
101
|
+
case "url":
|
|
102
|
+
return new URL(value.value);
|
|
103
|
+
case "map":
|
|
104
|
+
return new Map(value.value.map(([k, v]) => [deserializeValue(k), deserializeValue(v)]));
|
|
105
|
+
case "set":
|
|
106
|
+
return new Set(value.value.map((v) => deserializeValue(v)));
|
|
107
|
+
case "error": {
|
|
108
|
+
const { name, message } = JSON.parse(value.value);
|
|
109
|
+
const error = new Error(message);
|
|
110
|
+
error.name = name;
|
|
111
|
+
return error;
|
|
112
|
+
}
|
|
113
|
+
}
|
|
114
|
+
}
|
|
115
|
+
if (Array.isArray(value)) {
|
|
116
|
+
return value.map(deserializeValue);
|
|
117
|
+
}
|
|
118
|
+
if (typeof value === "object") {
|
|
119
|
+
const result = {};
|
|
120
|
+
for (const [k, v] of Object.entries(value)) {
|
|
121
|
+
result[k] = deserializeValue(v);
|
|
122
|
+
}
|
|
123
|
+
return result;
|
|
124
|
+
}
|
|
125
|
+
return value;
|
|
126
|
+
}
|
|
127
|
+
function isPlainObject(value) {
|
|
128
|
+
if (typeof value !== "object" || value === null) return false;
|
|
129
|
+
const proto = Object.getPrototypeOf(value);
|
|
130
|
+
return proto === null || proto === Object.prototype;
|
|
131
|
+
}
|
|
132
|
+
function isSpecialValue(value) {
|
|
133
|
+
return typeof value === "object" && value !== null && "$$flight" in value;
|
|
134
|
+
}
|
|
135
|
+
function h(tag, props, ...children) {
|
|
136
|
+
const serializedProps = {};
|
|
137
|
+
if (props) {
|
|
138
|
+
for (const [key, value] of Object.entries(props)) {
|
|
139
|
+
if (key !== "children") {
|
|
140
|
+
serializedProps[key] = serialize(value);
|
|
141
|
+
}
|
|
142
|
+
}
|
|
143
|
+
}
|
|
144
|
+
return {
|
|
145
|
+
$$type: "host",
|
|
146
|
+
tag,
|
|
147
|
+
props: serializedProps,
|
|
148
|
+
children: children.flat().map((child) => toFlightElement(child))
|
|
149
|
+
};
|
|
150
|
+
}
|
|
151
|
+
function text(value) {
|
|
152
|
+
return { $$type: "text", value };
|
|
153
|
+
}
|
|
154
|
+
function fragment(...children) {
|
|
155
|
+
return {
|
|
156
|
+
$$type: "fragment",
|
|
157
|
+
children: children.flat().map((child) => toFlightElement(child))
|
|
158
|
+
};
|
|
159
|
+
}
|
|
160
|
+
function suspense(id, fallback, children) {
|
|
161
|
+
return { $$type: "suspense", id, fallback, children };
|
|
162
|
+
}
|
|
163
|
+
function clientRef(refId, ssrHtml) {
|
|
164
|
+
return { $$type: "client", ref: refId, ssr: ssrHtml };
|
|
165
|
+
}
|
|
166
|
+
function toFlightElement(value) {
|
|
167
|
+
if (value === null || value === void 0 || typeof value === "boolean") {
|
|
168
|
+
return { $$type: "null" };
|
|
169
|
+
}
|
|
170
|
+
if (typeof value === "string" || typeof value === "number") {
|
|
171
|
+
return { $$type: "text", value: String(value) };
|
|
172
|
+
}
|
|
173
|
+
if (isFlightElement(value)) {
|
|
174
|
+
return value;
|
|
175
|
+
}
|
|
176
|
+
return { $$type: "null" };
|
|
177
|
+
}
|
|
178
|
+
function isFlightElement(value) {
|
|
179
|
+
return typeof value === "object" && value !== null && "$$type" in value;
|
|
180
|
+
}
|
|
181
|
+
var chunkIdCounter = 0;
|
|
182
|
+
function generateChunkId(prefix = "c") {
|
|
183
|
+
return `${prefix}${chunkIdCounter++}`;
|
|
184
|
+
}
|
|
185
|
+
function resetChunkIdCounter() {
|
|
186
|
+
chunkIdCounter = 0;
|
|
187
|
+
}
|
|
188
|
+
function createServerChunk(id, tree, awaiting) {
|
|
189
|
+
return {
|
|
190
|
+
type: "S",
|
|
191
|
+
id,
|
|
192
|
+
tree,
|
|
193
|
+
awaiting,
|
|
194
|
+
ts: Date.now()
|
|
195
|
+
};
|
|
196
|
+
}
|
|
197
|
+
function createClientChunk(id, module, exportName, props, fallback) {
|
|
198
|
+
return {
|
|
199
|
+
type: "C",
|
|
200
|
+
id,
|
|
201
|
+
module,
|
|
202
|
+
export: exportName,
|
|
203
|
+
props: serialize(props),
|
|
204
|
+
fallback
|
|
205
|
+
};
|
|
206
|
+
}
|
|
207
|
+
function createActionChunk(id, boundArgs) {
|
|
208
|
+
return {
|
|
209
|
+
type: "A",
|
|
210
|
+
id,
|
|
211
|
+
bound: boundArgs?.map(serialize)
|
|
212
|
+
};
|
|
213
|
+
}
|
|
214
|
+
function createErrorChunk(boundary, error, includeStack = false) {
|
|
215
|
+
return {
|
|
216
|
+
type: "E",
|
|
217
|
+
boundary,
|
|
218
|
+
message: error.message,
|
|
219
|
+
digest: generateErrorDigest(error),
|
|
220
|
+
stack: includeStack ? error.stack : void 0
|
|
221
|
+
};
|
|
222
|
+
}
|
|
223
|
+
function createHintChunk(hint, href, options) {
|
|
224
|
+
return {
|
|
225
|
+
type: "H",
|
|
226
|
+
hint,
|
|
227
|
+
href,
|
|
228
|
+
...options
|
|
229
|
+
};
|
|
230
|
+
}
|
|
231
|
+
function generateErrorDigest(error) {
|
|
232
|
+
const str = `${error.name}:${error.message}:${Date.now()}`;
|
|
233
|
+
let hash = 0;
|
|
234
|
+
for (let i = 0; i < str.length; i++) {
|
|
235
|
+
const char = str.charCodeAt(i);
|
|
236
|
+
hash = (hash << 5) - hash + char;
|
|
237
|
+
hash = hash & hash;
|
|
238
|
+
}
|
|
239
|
+
return Math.abs(hash).toString(36);
|
|
240
|
+
}
|
|
241
|
+
var FlightSerializationError = class extends Error {
|
|
242
|
+
constructor(message) {
|
|
243
|
+
super(message);
|
|
244
|
+
this.name = "FlightSerializationError";
|
|
245
|
+
}
|
|
246
|
+
};
|
|
247
|
+
var FlightPayloadError = class extends Error {
|
|
248
|
+
constructor(message, chunk) {
|
|
249
|
+
super(message);
|
|
250
|
+
this.chunk = chunk;
|
|
251
|
+
this.name = "FlightPayloadError";
|
|
252
|
+
}
|
|
253
|
+
};
|
|
254
|
+
|
|
255
|
+
export { FlightPayloadError, FlightSerializationError, clientRef, createActionChunk, createClientChunk, createErrorChunk, createHintChunk, createServerChunk, deserialize, fragment, generateChunkId, h, isFlightElement, resetChunkIdCounter, serialize, suspense, text, toFlightElement };
|
|
256
|
+
//# sourceMappingURL=chunk-K2CQZPCG.js.map
|
|
257
|
+
//# sourceMappingURL=chunk-K2CQZPCG.js.map
|