@reckona/mreact-server 0.0.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/README.md +39 -0
- package/dist/buffer-sink.d.ts +74 -0
- package/dist/buffer-sink.d.ts.map +1 -0
- package/dist/buffer-sink.js +86 -0
- package/dist/buffer-sink.js.map +1 -0
- package/dist/flight.d.ts +173 -0
- package/dist/flight.d.ts.map +1 -0
- package/dist/flight.js +1284 -0
- package/dist/flight.js.map +1 -0
- package/dist/index.d.ts +90 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +618 -0
- package/dist/index.js.map +1 -0
- package/dist/native-flight.d.ts +9 -0
- package/dist/native-flight.d.ts.map +1 -0
- package/dist/native-flight.js +63 -0
- package/dist/native-flight.js.map +1 -0
- package/dist/reorder.d.ts +2 -0
- package/dist/reorder.d.ts.map +1 -0
- package/dist/reorder.js +19 -0
- package/dist/reorder.js.map +1 -0
- package/dist/url-safety.d.ts +2 -0
- package/dist/url-safety.d.ts.map +1 -0
- package/dist/url-safety.js +2 -0
- package/dist/url-safety.js.map +1 -0
- package/package.json +58 -0
package/dist/index.js
ADDED
|
@@ -0,0 +1,618 @@
|
|
|
1
|
+
import { Fragment, Suspense as ReactCompatSuspense, createElement, isValidElement, } from "@reckona/mreact-compat";
|
|
2
|
+
import { isDangerousHtmlAttribute, isDangerousHtmlOptIn, isUnsafeMetaRefreshContent, isUnsafeUrlAttribute, } from "./url-safety.js";
|
|
3
|
+
import { escapeHtmlText as escapeHtml } from "@reckona/mreact-shared/html-escape";
|
|
4
|
+
import { createStreamingBufferSink } from "./buffer-sink.js";
|
|
5
|
+
export { Fragment } from "@reckona/mreact-compat";
|
|
6
|
+
export { CLIENT_REFERENCE_TYPE, SERVER_REFERENCE_TYPE, createClientReference, createFlightClientManifest, createServerReference, createServerActionHandler, fromReactFlightRows, getReactFlightProtocolCoverage, isClientReference, isServerReference, mergeReactFlightRows, renderFlightPreloadLinks, renderFlightResponseScript, renderToFlightResponse, stringifyFlightResponse, toReactFlightRows, } from "./flight.js";
|
|
7
|
+
export function Suspense(props) {
|
|
8
|
+
const config = {};
|
|
9
|
+
if (props.fallback !== undefined) {
|
|
10
|
+
config.fallback = props.fallback;
|
|
11
|
+
}
|
|
12
|
+
return createElement(ReactCompatSuspense, config, props.children);
|
|
13
|
+
}
|
|
14
|
+
export function createStringSink(options = {}) {
|
|
15
|
+
// Default to "concat" — V8 rope flattening yields 2-6x throughput over
|
|
16
|
+
// `Array#join("")` across all measured fixture sizes (see
|
|
17
|
+
// docs/benchmarks/2026-05-12-server-sink-strategy.md). "array-join" stays
|
|
18
|
+
// available as opt-in for scenarios that need lower peak memory.
|
|
19
|
+
const requestedStrategy = options.strategy ?? "concat";
|
|
20
|
+
const arrayJoinThreshold = options.arrayJoinThreshold ?? 256;
|
|
21
|
+
const deferredTasks = [];
|
|
22
|
+
let strategy = requestedStrategy === "auto"
|
|
23
|
+
? "concat"
|
|
24
|
+
: requestedStrategy;
|
|
25
|
+
let writeCount = 0;
|
|
26
|
+
let text = "";
|
|
27
|
+
const chunks = [];
|
|
28
|
+
const switchConcatToArrayJoin = () => {
|
|
29
|
+
if (strategy !== "concat") {
|
|
30
|
+
return;
|
|
31
|
+
}
|
|
32
|
+
if (text !== "") {
|
|
33
|
+
chunks.push(text);
|
|
34
|
+
text = "";
|
|
35
|
+
}
|
|
36
|
+
strategy = "array-join";
|
|
37
|
+
};
|
|
38
|
+
return {
|
|
39
|
+
append(chunk) {
|
|
40
|
+
writeCount += 1;
|
|
41
|
+
if (requestedStrategy === "auto" && strategy === "concat" && writeCount > arrayJoinThreshold) {
|
|
42
|
+
switchConcatToArrayJoin();
|
|
43
|
+
}
|
|
44
|
+
if (strategy === "concat") {
|
|
45
|
+
text += chunk;
|
|
46
|
+
return;
|
|
47
|
+
}
|
|
48
|
+
chunks.push(chunk);
|
|
49
|
+
},
|
|
50
|
+
bufferStrategy() {
|
|
51
|
+
return strategy;
|
|
52
|
+
},
|
|
53
|
+
defer(task) {
|
|
54
|
+
deferredTasks.push(task);
|
|
55
|
+
},
|
|
56
|
+
async drain() {
|
|
57
|
+
await Promise.all(deferredTasks);
|
|
58
|
+
},
|
|
59
|
+
toString() {
|
|
60
|
+
if (strategy === "concat") {
|
|
61
|
+
return text;
|
|
62
|
+
}
|
|
63
|
+
return chunks.join("");
|
|
64
|
+
},
|
|
65
|
+
};
|
|
66
|
+
}
|
|
67
|
+
export async function renderAsyncBoundary(sink, value, render, options = {}) {
|
|
68
|
+
try {
|
|
69
|
+
const resolved = await value;
|
|
70
|
+
await render(sink, resolved);
|
|
71
|
+
if (options.hydrationAwaitId !== undefined) {
|
|
72
|
+
appendAwaitHydrationData(sink, options.hydrationAwaitId, resolved);
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
catch (error) {
|
|
76
|
+
if (options.catch === undefined) {
|
|
77
|
+
throw error;
|
|
78
|
+
}
|
|
79
|
+
await options.catch(sink, error);
|
|
80
|
+
}
|
|
81
|
+
}
|
|
82
|
+
// Threshold for `<Await>` payload size warnings (UTF-8 byte length of
|
|
83
|
+
// JSON-serialized representation). 100KB warn / 1MB error follow the
|
|
84
|
+
// "you're sending a lot of data" hint pattern used by other frameworks.
|
|
85
|
+
const AWAIT_PAYLOAD_WARN_BYTES = 100 * 1024;
|
|
86
|
+
const AWAIT_PAYLOAD_ERROR_BYTES = 1024 * 1024;
|
|
87
|
+
function isProductionMode() {
|
|
88
|
+
// `process` may not exist in cross-runtime environments (Cloudflare/Deno).
|
|
89
|
+
// The server tsconfig does not include `@types/node`, so we look it up
|
|
90
|
+
// through `globalThis` with a minimal local typing.
|
|
91
|
+
const globalProcess = globalThis
|
|
92
|
+
.process;
|
|
93
|
+
try {
|
|
94
|
+
return globalProcess?.env?.["NODE_ENV"] === "production";
|
|
95
|
+
}
|
|
96
|
+
catch {
|
|
97
|
+
return false;
|
|
98
|
+
}
|
|
99
|
+
}
|
|
100
|
+
function appendAwaitHydrationData(sink, awaitId, resolved) {
|
|
101
|
+
const serialized = serializeAwaitHydrationValue(resolved, awaitId);
|
|
102
|
+
if (serialized === undefined) {
|
|
103
|
+
return;
|
|
104
|
+
}
|
|
105
|
+
const idLiteral = JSON.stringify(awaitId).replaceAll("<", "\\u003c");
|
|
106
|
+
sink.append(`<script data-mreact-await=${idLiteral}>(self.__mreactAwaitData||(self.__mreactAwaitData={}))[${idLiteral}]={value:${serialized}}</script>`);
|
|
107
|
+
}
|
|
108
|
+
// Emits a single console.warn in dev when `resolved` contains shapes the
|
|
109
|
+
// wire format will silently drop or coerce (Date / Map / Set / RegExp /
|
|
110
|
+
// class instance / function / Symbol / nested non-POJO). See
|
|
111
|
+
// docs/mreact_router.md `## <Await> value の制約`.
|
|
112
|
+
function warnIfNonSerializableAwaitValue(value, awaitId) {
|
|
113
|
+
if (isProductionMode()) {
|
|
114
|
+
return;
|
|
115
|
+
}
|
|
116
|
+
if (!containsNonSerializableSurface(value)) {
|
|
117
|
+
return;
|
|
118
|
+
}
|
|
119
|
+
console.warn(`[mreact] <Await value={...}> for "${awaitId}" includes non-serializable ` +
|
|
120
|
+
`data (Date / Map / Set / RegExp / class instance / function / Symbol). ` +
|
|
121
|
+
`The wire format uses JSON.stringify, so the client-side renderer may ` +
|
|
122
|
+
`receive a different shape after the JSON round-trip. Convert to plain ` +
|
|
123
|
+
`JSON-serializable data (or restore via a reviver in the renderer) — ` +
|
|
124
|
+
`see docs/mreact_router.md "<Await> value の制約".`);
|
|
125
|
+
}
|
|
126
|
+
function containsNonSerializableSurface(value) {
|
|
127
|
+
if (value === null || value === undefined || typeof value !== "object") {
|
|
128
|
+
return false;
|
|
129
|
+
}
|
|
130
|
+
if (value instanceof Date || value instanceof Map || value instanceof Set || value instanceof RegExp) {
|
|
131
|
+
return true;
|
|
132
|
+
}
|
|
133
|
+
if (Array.isArray(value)) {
|
|
134
|
+
return value.some((entry) => containsNonSerializableSurface(entry));
|
|
135
|
+
}
|
|
136
|
+
const proto = Object.getPrototypeOf(value);
|
|
137
|
+
if (proto !== Object.prototype && proto !== null) {
|
|
138
|
+
return true;
|
|
139
|
+
}
|
|
140
|
+
for (const entry of Object.values(value)) {
|
|
141
|
+
if (containsNonSerializableSurface(entry)) {
|
|
142
|
+
return true;
|
|
143
|
+
}
|
|
144
|
+
}
|
|
145
|
+
return false;
|
|
146
|
+
}
|
|
147
|
+
function reportAwaitPayloadSize(json, awaitId) {
|
|
148
|
+
const byteLength = typeof TextEncoder !== "undefined" ? new TextEncoder().encode(json).length : json.length;
|
|
149
|
+
if (byteLength > AWAIT_PAYLOAD_ERROR_BYTES) {
|
|
150
|
+
console.error(`[mreact] <Await> payload for "${awaitId}" is ${(byteLength / 1024 / 1024).toFixed(2)}MB, ` +
|
|
151
|
+
`exceeding the 1MB error threshold. Large payloads inflate HTML response size and ` +
|
|
152
|
+
`client memory pressure. Stream the data via loader or split into smaller boundaries.`);
|
|
153
|
+
return;
|
|
154
|
+
}
|
|
155
|
+
if (byteLength > AWAIT_PAYLOAD_WARN_BYTES) {
|
|
156
|
+
console.warn(`[mreact] large await payload for "${awaitId}": ${(byteLength / 1024).toFixed(1)}KB ` +
|
|
157
|
+
`(over the 100KB warning threshold). Consider streaming the data via loader or ` +
|
|
158
|
+
`splitting into smaller boundaries.`);
|
|
159
|
+
}
|
|
160
|
+
}
|
|
161
|
+
function serializeAwaitHydrationValue(value, awaitId) {
|
|
162
|
+
try {
|
|
163
|
+
const json = JSON.stringify(value);
|
|
164
|
+
if (json === undefined) {
|
|
165
|
+
return undefined;
|
|
166
|
+
}
|
|
167
|
+
warnIfNonSerializableAwaitValue(value, awaitId);
|
|
168
|
+
reportAwaitPayloadSize(json, awaitId);
|
|
169
|
+
// Defuse `</script>` and runaway control characters so the data can be
|
|
170
|
+
// safely embedded inside a `<script>` element.
|
|
171
|
+
return json
|
|
172
|
+
.replaceAll("<", "\\u003c")
|
|
173
|
+
.replaceAll("
", "\\u2028")
|
|
174
|
+
.replaceAll("
", "\\u2029");
|
|
175
|
+
}
|
|
176
|
+
catch {
|
|
177
|
+
return undefined;
|
|
178
|
+
}
|
|
179
|
+
}
|
|
180
|
+
export function renderOutOfOrderBoundary(sink, id, value, render, options = {}) {
|
|
181
|
+
const placeholderSink = createStringSink();
|
|
182
|
+
void options.placeholder?.(placeholderSink);
|
|
183
|
+
const hydrationStart = options.hydration === true ? `<!--mreact-h:start:${encodeURIComponent(id)}-->` : "";
|
|
184
|
+
const hydrationEnd = options.hydration === true ? `<!--mreact-h:end:${encodeURIComponent(id)}-->` : "";
|
|
185
|
+
sink.append(`${hydrationStart}<template data-mreact-oob-placeholder="${escapeAttribute(id)}">${placeholderSink.toString()}</template>${hydrationEnd}`);
|
|
186
|
+
const task = renderOutOfOrderFragment(sink, id, value, render, options);
|
|
187
|
+
if (sink.defer === undefined) {
|
|
188
|
+
void task;
|
|
189
|
+
return;
|
|
190
|
+
}
|
|
191
|
+
sink.defer(task);
|
|
192
|
+
}
|
|
193
|
+
async function renderOutOfOrderFragment(sink, id, value, render, options) {
|
|
194
|
+
const fragmentSink = createStringSink();
|
|
195
|
+
let resolvedValue;
|
|
196
|
+
let hasResolvedValue = false;
|
|
197
|
+
await renderAsyncBoundary(fragmentSink, value, async (childSink, resolved) => {
|
|
198
|
+
resolvedValue = resolved;
|
|
199
|
+
hasResolvedValue = true;
|
|
200
|
+
await render(childSink, resolved);
|
|
201
|
+
}, options.catch === undefined ? {} : { catch: options.catch });
|
|
202
|
+
sink.append(`<template data-mreact-oob-fragment="${escapeAttribute(id)}">${fragmentSink.toString()}</template>`);
|
|
203
|
+
if (hasResolvedValue && options.hydrationAwaitId !== undefined) {
|
|
204
|
+
appendAwaitHydrationData(sink, options.hydrationAwaitId, resolvedValue);
|
|
205
|
+
}
|
|
206
|
+
}
|
|
207
|
+
export function renderOutOfOrderReorderScript(sink, options = {}) {
|
|
208
|
+
const nonceAttribute = options.nonce === undefined ? "" : ` nonce="${escapeAttribute(options.nonce)}"`;
|
|
209
|
+
if (options.src !== undefined) {
|
|
210
|
+
sink.append(`<script data-mreact-oob-reorder${nonceAttribute} src="${escapeAttribute(options.src)}"></script>`);
|
|
211
|
+
return;
|
|
212
|
+
}
|
|
213
|
+
sink.append(`<script data-mreact-oob-reorder${nonceAttribute}>${outOfOrderReorderScript}</script>`);
|
|
214
|
+
}
|
|
215
|
+
export function renderReactSuspenseBoundary(sink, render) {
|
|
216
|
+
sink.append("<!--$-->");
|
|
217
|
+
const result = render(sink);
|
|
218
|
+
if (isPromiseLike(result)) {
|
|
219
|
+
return result.then(() => {
|
|
220
|
+
sink.append("<!--/$-->");
|
|
221
|
+
});
|
|
222
|
+
}
|
|
223
|
+
sink.append("<!--/$-->");
|
|
224
|
+
}
|
|
225
|
+
export function renderReactSuspenseOutOfOrderBoundary(sink, boundaryId, segmentId, value, render, options = {}) {
|
|
226
|
+
const fallbackSink = createStringSink();
|
|
227
|
+
void options.fallback?.(fallbackSink);
|
|
228
|
+
sink.append(`<!--$?--><template id="${escapeAttribute(boundaryId)}"></template>${fallbackSink.toString()}<!--/$-->`);
|
|
229
|
+
const task = renderReactSuspenseSegment(sink, boundaryId, segmentId, value, render, options);
|
|
230
|
+
if (sink.defer === undefined) {
|
|
231
|
+
void task;
|
|
232
|
+
return;
|
|
233
|
+
}
|
|
234
|
+
sink.defer(task);
|
|
235
|
+
}
|
|
236
|
+
export function renderReactSuspenseClientRenderBoundary(sink, fallback, options = {}) {
|
|
237
|
+
sink.append(`<!--$!--><template${renderReactSuspenseErrorAttributes(options)}></template>`);
|
|
238
|
+
const result = fallback(sink);
|
|
239
|
+
if (isPromiseLike(result)) {
|
|
240
|
+
return result.then(() => {
|
|
241
|
+
sink.append("<!--/$-->");
|
|
242
|
+
});
|
|
243
|
+
}
|
|
244
|
+
sink.append("<!--/$-->");
|
|
245
|
+
}
|
|
246
|
+
async function renderReactSuspenseSegment(sink, boundaryId, segmentId, value, render, options) {
|
|
247
|
+
const segmentSink = createStringSink();
|
|
248
|
+
await renderAsyncBoundary(segmentSink, value, render, options.catch === undefined ? {} : { catch: options.catch });
|
|
249
|
+
sink.append(`<div hidden id="${escapeAttribute(segmentId)}">${segmentSink.toString()}</div>${renderReactSuspenseRevealScript(boundaryId, segmentId, options)}`);
|
|
250
|
+
}
|
|
251
|
+
function renderReactSuspenseErrorAttributes(options) {
|
|
252
|
+
const message = options.message === undefined ? "" : ` data-msg="${escapeAttribute(options.message)}"`;
|
|
253
|
+
const stack = options.stack === undefined ? "" : ` data-stck="${escapeAttribute(options.stack)}"`;
|
|
254
|
+
return `${message}${stack}`;
|
|
255
|
+
}
|
|
256
|
+
function renderReactSuspenseRevealScript(boundaryId, segmentId, options = {}) {
|
|
257
|
+
if (options.src !== undefined) {
|
|
258
|
+
return `<script data-mreact-react-suspense-reveal${renderNonceAttribute(options.nonce)} src="${escapeAttribute(options.src)}" data-boundary-id="${escapeAttribute(boundaryId)}" data-segment-id="${escapeAttribute(segmentId)}"></script>`;
|
|
259
|
+
}
|
|
260
|
+
return `<script${renderNonceAttribute(options.nonce)}>${reactSuspenseRevealScriptBody};$RC(${JSON.stringify(boundaryId)},${JSON.stringify(segmentId)})</script>`;
|
|
261
|
+
}
|
|
262
|
+
export function renderHydrationBoundary(sink, id, render) {
|
|
263
|
+
const markerId = encodeURIComponent(id);
|
|
264
|
+
sink.append(`<!--mreact-h:start:${markerId}-->`);
|
|
265
|
+
const result = render(sink);
|
|
266
|
+
if (isPromiseLike(result)) {
|
|
267
|
+
return result.then(() => {
|
|
268
|
+
sink.append(`<!--mreact-h:end:${markerId}-->`);
|
|
269
|
+
});
|
|
270
|
+
}
|
|
271
|
+
sink.append(`<!--mreact-h:end:${markerId}-->`);
|
|
272
|
+
}
|
|
273
|
+
export function serializeSsrState(value) {
|
|
274
|
+
return JSON.stringify(value)
|
|
275
|
+
.replaceAll("<", "\\u003c")
|
|
276
|
+
.replaceAll("\u2028", "\\u2028")
|
|
277
|
+
.replaceAll("\u2029", "\\u2029");
|
|
278
|
+
}
|
|
279
|
+
export function renderSsrState(sink, value, options = {}) {
|
|
280
|
+
sink.append(`<script type="application/json" data-mreact-ssr-state${renderNonceAttribute(options.nonce)}>${serializeSsrState(value)}</script>`);
|
|
281
|
+
}
|
|
282
|
+
export function createEventHydrationManifest(events) {
|
|
283
|
+
return {
|
|
284
|
+
version: 1,
|
|
285
|
+
events: events.map((event) => ({ ...event })),
|
|
286
|
+
};
|
|
287
|
+
}
|
|
288
|
+
export function renderEventHydrationManifest(sink, manifest, options = {}) {
|
|
289
|
+
sink.append(`<script type="application/json" data-mreact-event-manifest${renderNonceAttribute(options.nonce)}>${serializeSsrState(manifest)}</script>`);
|
|
290
|
+
}
|
|
291
|
+
export function renderScriptAsset(sink, options) {
|
|
292
|
+
const integrityAttribute = options.integrity === undefined ? "" : ` integrity="${escapeAttribute(options.integrity)}"`;
|
|
293
|
+
const crossOrigin = options.integrity === undefined ? options.crossOrigin : (options.crossOrigin ?? "anonymous");
|
|
294
|
+
const crossOriginAttribute = crossOrigin === undefined ? "" : ` crossorigin="${escapeAttribute(crossOrigin)}"`;
|
|
295
|
+
sink.append(`<script src="${escapeAttribute(options.src)}"${renderNonceAttribute(options.nonce)}${integrityAttribute}${crossOriginAttribute}></script>`);
|
|
296
|
+
}
|
|
297
|
+
export function html(node, options = {}) {
|
|
298
|
+
const headers = new Headers(options.headers);
|
|
299
|
+
const responseOptions = { headers };
|
|
300
|
+
if (!headers.has("content-type")) {
|
|
301
|
+
headers.set("content-type", "text/html; charset=utf-8");
|
|
302
|
+
}
|
|
303
|
+
if (options.status !== undefined) {
|
|
304
|
+
responseOptions.status = options.status;
|
|
305
|
+
}
|
|
306
|
+
if (options.statusText !== undefined) {
|
|
307
|
+
responseOptions.statusText = options.statusText;
|
|
308
|
+
}
|
|
309
|
+
return new Response(renderToReadableStream((sink) => {
|
|
310
|
+
const state = { suspenseId: 0 };
|
|
311
|
+
return appendReactNode(sink, node, state);
|
|
312
|
+
}), responseOptions);
|
|
313
|
+
}
|
|
314
|
+
export async function renderToString(render) {
|
|
315
|
+
const sink = createStringSink();
|
|
316
|
+
await render(sink);
|
|
317
|
+
await sink.drain();
|
|
318
|
+
return sink.toString();
|
|
319
|
+
}
|
|
320
|
+
function appendReactNode(sink, node, state) {
|
|
321
|
+
if (isPromiseLikeNode(node)) {
|
|
322
|
+
return node.then((resolved) => appendReactNode(sink, resolved, state));
|
|
323
|
+
}
|
|
324
|
+
if (node === null || node === undefined || typeof node === "boolean") {
|
|
325
|
+
return;
|
|
326
|
+
}
|
|
327
|
+
if (typeof node === "string" || typeof node === "number") {
|
|
328
|
+
sink.append(escapeHtml(node));
|
|
329
|
+
return;
|
|
330
|
+
}
|
|
331
|
+
if (Array.isArray(node)) {
|
|
332
|
+
return appendReactNodeList(sink, node, state);
|
|
333
|
+
}
|
|
334
|
+
if (!isValidElement(node)) {
|
|
335
|
+
return;
|
|
336
|
+
}
|
|
337
|
+
return appendReactElement(sink, node, state);
|
|
338
|
+
}
|
|
339
|
+
function appendReactNodeList(sink, nodes, state) {
|
|
340
|
+
let chain;
|
|
341
|
+
for (const node of nodes) {
|
|
342
|
+
if (chain !== undefined) {
|
|
343
|
+
chain = chain.then(() => appendReactNode(sink, node, state));
|
|
344
|
+
continue;
|
|
345
|
+
}
|
|
346
|
+
const result = appendReactNode(sink, node, state);
|
|
347
|
+
if (isPromiseLike(result)) {
|
|
348
|
+
chain = result;
|
|
349
|
+
}
|
|
350
|
+
}
|
|
351
|
+
return chain;
|
|
352
|
+
}
|
|
353
|
+
function appendReactElement(sink, element, state) {
|
|
354
|
+
if (typeof element.type === "string") {
|
|
355
|
+
return appendHostElement(sink, element, state);
|
|
356
|
+
}
|
|
357
|
+
if (element.type === Fragment) {
|
|
358
|
+
return appendReactNode(sink, element.props.children, state);
|
|
359
|
+
}
|
|
360
|
+
if (element.type === ReactCompatSuspense) {
|
|
361
|
+
return appendSuspenseElement(sink, element, state);
|
|
362
|
+
}
|
|
363
|
+
if (isClassComponentType(element.type)) {
|
|
364
|
+
const instance = new element.type(element.props);
|
|
365
|
+
return appendReactNode(sink, instance.render(), state);
|
|
366
|
+
}
|
|
367
|
+
if (typeof element.type === "function") {
|
|
368
|
+
return appendReactNode(sink, element.type(element.props), state);
|
|
369
|
+
}
|
|
370
|
+
}
|
|
371
|
+
function isClassComponentType(value) {
|
|
372
|
+
return typeof value === "function" && value.prototype?.render !== undefined;
|
|
373
|
+
}
|
|
374
|
+
function appendHostElement(sink, element, state) {
|
|
375
|
+
const tagName = element.type;
|
|
376
|
+
const innerHtml = element.props
|
|
377
|
+
.dangerouslySetInnerHTML;
|
|
378
|
+
sink.append(`<${tagName}${renderHtmlAttributes(element.props)}>`);
|
|
379
|
+
if (innerHtml !== undefined) {
|
|
380
|
+
sink.append(String(innerHtml.__html ?? ""));
|
|
381
|
+
sink.append(`</${tagName}>`);
|
|
382
|
+
return;
|
|
383
|
+
}
|
|
384
|
+
const result = appendReactNode(sink, element.props.children, state);
|
|
385
|
+
if (isPromiseLike(result)) {
|
|
386
|
+
return result.then(() => {
|
|
387
|
+
sink.append(`</${tagName}>`);
|
|
388
|
+
});
|
|
389
|
+
}
|
|
390
|
+
sink.append(`</${tagName}>`);
|
|
391
|
+
}
|
|
392
|
+
function appendSuspenseElement(sink, element, state) {
|
|
393
|
+
const rendered = renderReactNodeToString(element.props.children, state);
|
|
394
|
+
if (!isPromiseLikeString(rendered)) {
|
|
395
|
+
renderReactSuspenseBoundary(sink, (boundarySink) => {
|
|
396
|
+
boundarySink.append(rendered);
|
|
397
|
+
});
|
|
398
|
+
return;
|
|
399
|
+
}
|
|
400
|
+
const id = state.suspenseId;
|
|
401
|
+
state.suspenseId += 1;
|
|
402
|
+
renderReactSuspenseOutOfOrderBoundary(sink, `B:${id}`, `S:${id}`, rendered, (boundarySink, renderedHtml) => {
|
|
403
|
+
boundarySink.append(renderedHtml);
|
|
404
|
+
}, {
|
|
405
|
+
fallback(boundarySink) {
|
|
406
|
+
const fallback = renderReactNodeToString(element.props.fallback, state);
|
|
407
|
+
if (isPromiseLikeString(fallback)) {
|
|
408
|
+
return fallback.then((html) => {
|
|
409
|
+
boundarySink.append(html);
|
|
410
|
+
});
|
|
411
|
+
}
|
|
412
|
+
boundarySink.append(fallback);
|
|
413
|
+
},
|
|
414
|
+
});
|
|
415
|
+
}
|
|
416
|
+
function renderReactNodeToString(node, state) {
|
|
417
|
+
const sink = createStringSink();
|
|
418
|
+
const result = appendReactNode(sink, node, state);
|
|
419
|
+
if (isPromiseLike(result)) {
|
|
420
|
+
return result.then(() => sink.toString());
|
|
421
|
+
}
|
|
422
|
+
return sink.toString();
|
|
423
|
+
}
|
|
424
|
+
function renderHtmlAttributes(props) {
|
|
425
|
+
// Issue 078: <meta http-equiv="refresh" content="0;url=javascript:...">
|
|
426
|
+
// is URL-bearing only when http-equiv is "refresh", so we need both
|
|
427
|
+
// attributes in scope to make the call. Strip the unsafe content
|
|
428
|
+
// before per-attribute rendering.
|
|
429
|
+
const sanitizedProps = sanitizeMetaRefreshProps(props);
|
|
430
|
+
return Object.entries(sanitizedProps)
|
|
431
|
+
.map(([name, value]) => renderHtmlAttribute(name, value))
|
|
432
|
+
.filter((attribute) => attribute !== "")
|
|
433
|
+
.join("");
|
|
434
|
+
}
|
|
435
|
+
function sanitizeMetaRefreshProps(props) {
|
|
436
|
+
const httpEquiv = props["http-equiv"] ?? props.httpEquiv;
|
|
437
|
+
const content = props["content"];
|
|
438
|
+
if (typeof httpEquiv !== "string" || typeof content !== "string")
|
|
439
|
+
return props;
|
|
440
|
+
if (!isUnsafeMetaRefreshContent(httpEquiv, content))
|
|
441
|
+
return props;
|
|
442
|
+
// Drop only `content`; keep http-equiv so the developer's intent is
|
|
443
|
+
// still visible in the rendered HTML (debugging hint).
|
|
444
|
+
const sanitized = { ...props };
|
|
445
|
+
delete sanitized["content"];
|
|
446
|
+
return sanitized;
|
|
447
|
+
}
|
|
448
|
+
// Mirrors `isAttributeNameSafe` in react-dom: an attribute name must start with
|
|
449
|
+
// an ASCII letter (or underscore) and contain only word chars, dot, hyphen, or
|
|
450
|
+
// colon. Anything else is dropped to prevent SSR XSS via spread props
|
|
451
|
+
// (`<div {...userControlled} />`). See docs/issues/resolved Issue 060.
|
|
452
|
+
const VALID_ATTRIBUTE_NAME = /^[A-Za-z_][\w.\-:]*$/;
|
|
453
|
+
// URL scheme allow/block list is shared with the compiler emit paths
|
|
454
|
+
// (Issues 062 / 073). See packages/server/src/url-safety.ts.
|
|
455
|
+
function renderHtmlAttribute(name, value) {
|
|
456
|
+
if (name === "children" ||
|
|
457
|
+
name === "dangerouslySetInnerHTML" ||
|
|
458
|
+
name === "key" ||
|
|
459
|
+
name === "ref" ||
|
|
460
|
+
value === false ||
|
|
461
|
+
value === null ||
|
|
462
|
+
value === undefined ||
|
|
463
|
+
typeof value === "function") {
|
|
464
|
+
return "";
|
|
465
|
+
}
|
|
466
|
+
const attributeName = toHtmlAttributeName(name);
|
|
467
|
+
if (!VALID_ATTRIBUTE_NAME.test(attributeName)) {
|
|
468
|
+
return "";
|
|
469
|
+
}
|
|
470
|
+
// Issue 077: HTML-bearing attributes (`srcdoc`) require the explicit
|
|
471
|
+
// `{ __html: "..." }` opt-in. A plain string value -- even if escaped
|
|
472
|
+
// for the attribute syntax -- decodes back to executable HTML inside
|
|
473
|
+
// the iframe document with the parent's origin.
|
|
474
|
+
if (isDangerousHtmlAttribute(attributeName)) {
|
|
475
|
+
if (!isDangerousHtmlOptIn(value)) {
|
|
476
|
+
return "";
|
|
477
|
+
}
|
|
478
|
+
return ` ${attributeName}="${escapeAttribute(value.__html)}"`;
|
|
479
|
+
}
|
|
480
|
+
if (value === true) {
|
|
481
|
+
return ` ${attributeName}`;
|
|
482
|
+
}
|
|
483
|
+
const stringValue = String(value);
|
|
484
|
+
if (isUnsafeUrlAttribute(attributeName, stringValue)) {
|
|
485
|
+
return "";
|
|
486
|
+
}
|
|
487
|
+
return ` ${attributeName}="${escapeAttribute(stringValue)}"`;
|
|
488
|
+
}
|
|
489
|
+
function toHtmlAttributeName(name) {
|
|
490
|
+
return HTML_ATTRIBUTE_ALIASES[name] ?? name;
|
|
491
|
+
}
|
|
492
|
+
const HTML_ATTRIBUTE_ALIASES = {
|
|
493
|
+
acceptCharset: "accept-charset",
|
|
494
|
+
autoFocus: "autofocus",
|
|
495
|
+
autoPlay: "autoplay",
|
|
496
|
+
charSet: "charset",
|
|
497
|
+
className: "class",
|
|
498
|
+
colSpan: "colspan",
|
|
499
|
+
contentEditable: "contenteditable",
|
|
500
|
+
crossOrigin: "crossorigin",
|
|
501
|
+
encType: "enctype",
|
|
502
|
+
formAction: "formaction",
|
|
503
|
+
frameBorder: "frameborder",
|
|
504
|
+
htmlFor: "for",
|
|
505
|
+
httpEquiv: "http-equiv",
|
|
506
|
+
maxLength: "maxlength",
|
|
507
|
+
minLength: "minlength",
|
|
508
|
+
noValidate: "novalidate",
|
|
509
|
+
playsInline: "playsinline",
|
|
510
|
+
readOnly: "readonly",
|
|
511
|
+
rowSpan: "rowspan",
|
|
512
|
+
spellCheck: "spellcheck",
|
|
513
|
+
srcDoc: "srcdoc",
|
|
514
|
+
srcSet: "srcset",
|
|
515
|
+
tabIndex: "tabindex",
|
|
516
|
+
useMap: "usemap",
|
|
517
|
+
};
|
|
518
|
+
function isPromiseLikeNode(value) {
|
|
519
|
+
return isPromiseLikeUnknown(value);
|
|
520
|
+
}
|
|
521
|
+
function isPromiseLikeString(value) {
|
|
522
|
+
return isPromiseLikeUnknown(value);
|
|
523
|
+
}
|
|
524
|
+
function isPromiseLike(value) {
|
|
525
|
+
return isPromiseLikeUnknown(value);
|
|
526
|
+
}
|
|
527
|
+
function isPromiseLikeUnknown(value) {
|
|
528
|
+
return (typeof value === "object" &&
|
|
529
|
+
value !== null &&
|
|
530
|
+
"then" in value &&
|
|
531
|
+
typeof value.then === "function");
|
|
532
|
+
}
|
|
533
|
+
function renderNonceAttribute(nonce) {
|
|
534
|
+
return nonce === undefined ? "" : ` nonce="${escapeAttribute(nonce)}"`;
|
|
535
|
+
}
|
|
536
|
+
export function renderToReadableStream(render) {
|
|
537
|
+
// Issue 084: append calls go into a coalescing Node Buffer sink. The
|
|
538
|
+
// previous implementation called `controller.enqueue(encoder.encode(chunk))`
|
|
539
|
+
// per `sink.append` — one TextEncoder allocation + one WHATWG queue trip
|
|
540
|
+
// per call. Now we emit one chunk per flush boundary:
|
|
541
|
+
// 1. After the sync portion of `render` returns — the "shell"
|
|
542
|
+
// pre-flush. Done synchronously so it lands before any deferred
|
|
543
|
+
// task body fires in a microtask.
|
|
544
|
+
// 2. Whenever the accumulated buffer crosses the flushThreshold
|
|
545
|
+
// mid-render (e.g. a single very large list rendering).
|
|
546
|
+
// 3. Each `sink.append` made during the deferred phase flushes
|
|
547
|
+
// immediately — gives each OOB fragment its own HTTP chunk so
|
|
548
|
+
// the browser can swap it in as soon as it arrives.
|
|
549
|
+
// 4. End of stream — any tail bytes.
|
|
550
|
+
return new ReadableStream({
|
|
551
|
+
async start(controller) {
|
|
552
|
+
const sink = createStreamingBufferSink({
|
|
553
|
+
onFlush(buffer) {
|
|
554
|
+
controller.enqueue(buffer);
|
|
555
|
+
},
|
|
556
|
+
});
|
|
557
|
+
const deferredTasks = [];
|
|
558
|
+
let inDeferredPhase = false;
|
|
559
|
+
let renderResult;
|
|
560
|
+
try {
|
|
561
|
+
renderResult = render({
|
|
562
|
+
append(chunk) {
|
|
563
|
+
sink.append(chunk);
|
|
564
|
+
if (inDeferredPhase) {
|
|
565
|
+
// OOB pattern: each deferred task ends with exactly one
|
|
566
|
+
// `sink.append("<template ...>...")`. Flushing here
|
|
567
|
+
// promotes that single append to its own chunk so the
|
|
568
|
+
// browser's MutationObserver can apply it without
|
|
569
|
+
// waiting for other deferred fragments.
|
|
570
|
+
sink.flush();
|
|
571
|
+
}
|
|
572
|
+
},
|
|
573
|
+
defer(task) {
|
|
574
|
+
deferredTasks.push(task);
|
|
575
|
+
},
|
|
576
|
+
});
|
|
577
|
+
}
|
|
578
|
+
catch (error) {
|
|
579
|
+
controller.error(error);
|
|
580
|
+
return;
|
|
581
|
+
}
|
|
582
|
+
// Shell pre-flush — synchronous, BEFORE we yield to microtasks.
|
|
583
|
+
// If we awaited render first the deferred tasks' bodies would
|
|
584
|
+
// already have appended their bytes to the same buffer and we
|
|
585
|
+
// would emit one merged chunk.
|
|
586
|
+
sink.flush();
|
|
587
|
+
try {
|
|
588
|
+
if (renderResult !== undefined && renderResult !== null) {
|
|
589
|
+
await renderResult;
|
|
590
|
+
// Async render may have written more before its tail returned.
|
|
591
|
+
// That tail is also "shell" — flush it before entering the
|
|
592
|
+
// deferred phase.
|
|
593
|
+
sink.flush();
|
|
594
|
+
}
|
|
595
|
+
inDeferredPhase = true;
|
|
596
|
+
await Promise.all(deferredTasks);
|
|
597
|
+
// Tail flush in case the render closure (or a deferred task)
|
|
598
|
+
// somehow left bytes in the buffer past the per-append flushes.
|
|
599
|
+
sink.flush();
|
|
600
|
+
controller.close();
|
|
601
|
+
}
|
|
602
|
+
catch (error) {
|
|
603
|
+
controller.error(error);
|
|
604
|
+
}
|
|
605
|
+
},
|
|
606
|
+
});
|
|
607
|
+
}
|
|
608
|
+
function escapeAttribute(value) {
|
|
609
|
+
return value
|
|
610
|
+
.replaceAll("&", "&")
|
|
611
|
+
.replaceAll('"', """)
|
|
612
|
+
.replaceAll("<", "<")
|
|
613
|
+
.replaceAll(">", ">");
|
|
614
|
+
}
|
|
615
|
+
const outOfOrderReorderScript = `(()=>{function apply(root){const fragments=Array.from(root.querySelectorAll("template[data-mreact-oob-fragment]"));for(const fragment of fragments){const id=fragment.getAttribute("data-mreact-oob-fragment");if(id===null)continue;const placeholders=Array.from(root.querySelectorAll("[data-mreact-oob-placeholder]"));const placeholder=placeholders.find((candidate)=>candidate.getAttribute("data-mreact-oob-placeholder")===id);if(placeholder===undefined)continue;placeholder.replaceWith(fragment.content.cloneNode(true));fragment.remove();}}apply(document);new MutationObserver(()=>apply(document)).observe(document.documentElement,{childList:true,subtree:true});})();`;
|
|
616
|
+
const reactSuspenseRevealScriptBody = `(self.$RC=self.$RC||function(bid,sid){var b=document.getElementById(bid);var s=document.getElementById(sid);if(!b||!s)return;var p=b.parentNode;var e=b.nextSibling;var d=0;var r=[];for(var n=e;n;n=n.nextSibling){if(n.nodeType===8){if(n.data==="$"||n.data==="$?"||n.data==="$!")d++;else if(n.data==="/$"){if(d===0){e=n;break;}d--;}}r.push(n);}for(var i=0;r[i];i++)p.removeChild(r[i]);while(s.firstChild)p.insertBefore(s.firstChild,e);s.remove();b.data="$";})`;
|
|
617
|
+
export const reactSuspenseRevealExternalScript = `(()=>{${reactSuspenseRevealScriptBody};var s=document.currentScript;if(!s)return;var b=s.getAttribute("data-boundary-id");var seg=s.getAttribute("data-segment-id");if(b!==null&&seg!==null)self.$RC(b,seg);})();`;
|
|
618
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
interface NativeFlightModule {
|
|
2
|
+
decodeFlightBase64?: (value: string) => Uint8Array;
|
|
3
|
+
encodeFlightResponse?: (responseJson: string) => string;
|
|
4
|
+
decodeFlightRows?: (rows: string) => string;
|
|
5
|
+
mergeFlightRows?: (previousJson: string, rows: string) => string;
|
|
6
|
+
}
|
|
7
|
+
export declare function getNativeFlight(): NativeFlightModule | undefined;
|
|
8
|
+
export {};
|
|
9
|
+
//# sourceMappingURL=native-flight.d.ts.map
|