@reckona/mreact-server 0.0.180 → 0.0.181
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/dist/flight.d.ts.map +1 -1
- package/dist/flight.js +102 -35
- package/dist/flight.js.map +1 -1
- package/package.json +3 -3
- package/src/flight.ts +194 -88
package/dist/flight.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"flight.d.ts","sourceRoot":"","sources":["../src/flight.ts"],"names":[],"mappings":"AAGA,iFAAiF;AACjF,eAAO,MAAM,qBAAqB,eAA+C,CAAC;AAClF,iFAAiF;AACjF,eAAO,MAAM,qBAAqB,eAA+C,CAAC;AAKlF,iEAAiE;AACjE,MAAM,WAAW,qBAAqB;IACpC,EAAE,EAAE,MAAM,CAAC;IACX,QAAQ,EAAE,MAAM,CAAC;IACjB,UAAU,EAAE,MAAM,CAAC;IACnB,MAAM,CAAC,EAAE,MAAM,EAAE,CAAC;CACnB;AAED,8EAA8E;AAC9E,MAAM,WAAW,0BAA0B;IACzC,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,MAAM,CAAC;IACjB,UAAU,EAAE,MAAM,CAAC;CACpB;AAED,yDAAyD;AACzD,MAAM,WAAW,yBAA0B,SAAQ,0BAA0B;IAC3E,MAAM,EAAE,MAAM,EAAE,CAAC;CAClB;AAED,oEAAoE;AACpE,MAAM,MAAM,YAAY,GAAG,CAAC,GAAG,IAAI,EAAE,OAAO,EAAE,KAAK,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;AAE9E,0DAA0D;AAC1D,MAAM,MAAM,4BAA4B,GAAG,OAAO,GAAG,MAAM,CAAC;AAE5D,6DAA6D;AAC7D,MAAM,WAAW,sBAAsB;IACrC,MAAM,EAAE,YAAY,CAAC;IACrB,YAAY,CAAC,EAAE,CAAC,IAAI,EAAE,OAAO,EAAE,KAAK,4BAA4B,CAAC;CAClE;AAED,uDAAuD;AACvD,MAAM,MAAM,oBAAoB,GAAG,MAAM,CAAC,MAAM,EAAE,YAAY,GAAG,sBAAsB,CAAC,CAAC;AAEzF,0DAA0D;AAC1D,MAAM,WAAW,uBAAuB;IACtC,GAAG,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC;IAC5B,GAAG,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;CAC1B;AAED,oEAAoE;AACpE,MAAM,WAAW,4BAA4B;IAC3C,QAAQ,EAAE,MAAM,CAAC;IACjB,UAAU,EAAE,MAAM,CAAC;CACpB;AAED,qEAAqE;AACrE,MAAM,WAAW,0BAA0B;IAKzC,cAAc,CAAC,EAAE,SAAS,MAAM,EAAE,GAAG,KAAK,CAAC;IAC3C,SAAS,CAAC,EAAE,CACV,OAAO,EAAE,OAAO,EAChB,SAAS,EAAE,4BAA4B,EACvC,IAAI,EAAE,OAAO,EAAE,KACZ,4BAA4B,GAAG,OAAO,CAAC,4BAA4B,CAAC,CAAC;IAC1E,cAAc,CAAC,EAAE,SAAS,4BAA4B,EAAE,CAAC;IAGzD,IAAI,CAAC,EACD,OAAO,GACP;QACE,UAAU,CAAC,EAAE,MAAM,CAAC;QACpB,UAAU,CAAC,EAAE,MAAM,CAAC;KACrB,CAAC;IACN,gBAAgB,CAAC,EAAE;QACjB,UAAU,CAAC,EAAE,MAAM,CAAC;QACpB,IAAI,EAAE,uBAAuB,CAAC;KAC/B,CAAC;IAIF,YAAY,CAAC,EAAE,MAAM,CAAC;CACvB;
|
|
1
|
+
{"version":3,"file":"flight.d.ts","sourceRoot":"","sources":["../src/flight.ts"],"names":[],"mappings":"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"}
|
package/dist/flight.js
CHANGED
|
@@ -7,8 +7,42 @@ export const SERVER_REFERENCE_TYPE = Symbol.for("modular.react.server_reference"
|
|
|
7
7
|
const REACT_COMPAT_ELEMENT_TYPE = Symbol.for("react.transitional.element");
|
|
8
8
|
const REACT_COMPAT_FRAGMENT_TYPE = Symbol.for("react.fragment");
|
|
9
9
|
const DEFAULT_MAX_BODY_BYTES = 1024 * 1024;
|
|
10
|
-
const
|
|
11
|
-
const
|
|
10
|
+
const MAX_SERVER_ACTION_ARGUMENT_DEPTH = 64;
|
|
11
|
+
const MAX_SERVER_ACTION_ARGUMENT_ARRAY_LENGTH = 2_000;
|
|
12
|
+
const MAX_SERVER_ACTION_ARGUMENT_OBJECT_KEYS = 200;
|
|
13
|
+
const SERVER_ACTION_FORBIDDEN_JSON_KEYS = new Set(["__proto__", "constructor", "prototype"]);
|
|
14
|
+
const reactFlightBinaryRowTags = [
|
|
15
|
+
"A",
|
|
16
|
+
"O",
|
|
17
|
+
"o",
|
|
18
|
+
"U",
|
|
19
|
+
"S",
|
|
20
|
+
"s",
|
|
21
|
+
"L",
|
|
22
|
+
"l",
|
|
23
|
+
"G",
|
|
24
|
+
"g",
|
|
25
|
+
"M",
|
|
26
|
+
"m",
|
|
27
|
+
"V",
|
|
28
|
+
];
|
|
29
|
+
const reactFlightRowTags = [
|
|
30
|
+
"C",
|
|
31
|
+
"D",
|
|
32
|
+
"E",
|
|
33
|
+
"F",
|
|
34
|
+
"H",
|
|
35
|
+
"I",
|
|
36
|
+
"J",
|
|
37
|
+
"N",
|
|
38
|
+
"P",
|
|
39
|
+
"R",
|
|
40
|
+
"T",
|
|
41
|
+
"W",
|
|
42
|
+
"X",
|
|
43
|
+
"x",
|
|
44
|
+
"r",
|
|
45
|
+
];
|
|
12
46
|
const reactFlightModelTokens = [
|
|
13
47
|
"$",
|
|
14
48
|
"$$",
|
|
@@ -142,7 +176,15 @@ export function createServerActionHandler(actions, options = {}) {
|
|
|
142
176
|
const action = getServerAction(actionEntry);
|
|
143
177
|
const validateArgs = getServerActionArgsValidator(actionEntry);
|
|
144
178
|
const boundArgs = Array.isArray(payload.bound) ? payload.bound : [];
|
|
145
|
-
const
|
|
179
|
+
const extraArgs = Array.isArray(payload.args) ? payload.args : [];
|
|
180
|
+
const argsStructure = validateServerActionJsonArgumentStructure(boundArgs, extraArgs);
|
|
181
|
+
if (!argsStructure.valid) {
|
|
182
|
+
return jsonResponse({
|
|
183
|
+
ok: false,
|
|
184
|
+
error: "Invalid server action argument structure.",
|
|
185
|
+
}, 400);
|
|
186
|
+
}
|
|
187
|
+
const args = [...boundArgs, ...extraArgs];
|
|
146
188
|
const validationResult = validateArgs?.(args);
|
|
147
189
|
if (validationResult !== undefined && validationResult !== true) {
|
|
148
190
|
return jsonResponse({
|
|
@@ -434,9 +476,7 @@ function resolveFlightPromiseChunks(model, modelChunks, errorChunks, depth = 0,
|
|
|
434
476
|
]));
|
|
435
477
|
}
|
|
436
478
|
function encodeReactFlightModel(model, state) {
|
|
437
|
-
if (model === null ||
|
|
438
|
-
typeof model === "number" ||
|
|
439
|
-
typeof model === "boolean") {
|
|
479
|
+
if (model === null || typeof model === "number" || typeof model === "boolean") {
|
|
440
480
|
return model;
|
|
441
481
|
}
|
|
442
482
|
if (typeof model === "string") {
|
|
@@ -531,10 +571,7 @@ function encodeReactFlightElementType(type, clientWireIds) {
|
|
|
531
571
|
function encodeReactFlightProps(props, state) {
|
|
532
572
|
return Object.fromEntries(Object.entries(props)
|
|
533
573
|
.filter((entry) => entry[1] !== undefined)
|
|
534
|
-
.map(([key, value]) => [
|
|
535
|
-
key,
|
|
536
|
-
encodeReactFlightModel(value, state),
|
|
537
|
-
]));
|
|
574
|
+
.map(([key, value]) => [key, encodeReactFlightModel(value, state)]));
|
|
538
575
|
}
|
|
539
576
|
function parseReactFlightRow(line) {
|
|
540
577
|
const separator = line.indexOf(":");
|
|
@@ -555,7 +592,7 @@ function parseReactFlightRow(line) {
|
|
|
555
592
|
};
|
|
556
593
|
}
|
|
557
594
|
function looksLikeUnsupportedReactFlightTag(tag, body) {
|
|
558
|
-
return /^[A-Z]$/.test(tag) && (body[1] === "{" || body[1] === "[" || body[1] === "
|
|
595
|
+
return /^[A-Z]$/.test(tag) && (body[1] === "{" || body[1] === "[" || body[1] === '"');
|
|
559
596
|
}
|
|
560
597
|
function parseReactFlightTextChunk(payload) {
|
|
561
598
|
const separator = payload.indexOf(",");
|
|
@@ -753,9 +790,7 @@ function createFlightDecodeContext() {
|
|
|
753
790
|
function decodeReactFlightModel(value, modelChunks = new Map(), errorChunks = new Map(), depth = 0, context = createFlightDecodeContext()) {
|
|
754
791
|
if (depth > MAX_FLIGHT_DECODE_DEPTH)
|
|
755
792
|
flightTooDeep();
|
|
756
|
-
if (value === null ||
|
|
757
|
-
typeof value === "number" ||
|
|
758
|
-
typeof value === "boolean") {
|
|
793
|
+
if (value === null || typeof value === "number" || typeof value === "boolean") {
|
|
759
794
|
return value;
|
|
760
795
|
}
|
|
761
796
|
if (typeof value === "string") {
|
|
@@ -832,7 +867,9 @@ function decodeReactFlightString(value, modelChunks, errorChunks, depth, context
|
|
|
832
867
|
if (/^\$Q[0-9a-f]+$/i.test(value)) {
|
|
833
868
|
const decoded = decodeReactFlightChunk(value.slice(2), modelChunks, errorChunks, depth + 1, context);
|
|
834
869
|
const entries = Array.isArray(decoded)
|
|
835
|
-
? decoded.map((entry) => Array.isArray(entry)
|
|
870
|
+
? decoded.map((entry) => Array.isArray(entry)
|
|
871
|
+
? [entry[0] ?? { kind: "undefined" }, entry[1] ?? { kind: "undefined" }]
|
|
872
|
+
: [entry, { kind: "undefined" }])
|
|
836
873
|
: [];
|
|
837
874
|
return {
|
|
838
875
|
kind: "map",
|
|
@@ -866,11 +903,11 @@ function decodeReactFlightString(value, modelChunks, errorChunks, depth, context
|
|
|
866
903
|
};
|
|
867
904
|
}
|
|
868
905
|
if (/^\$Z[0-9a-f]+$/i.test(value)) {
|
|
869
|
-
return errorChunks.get(parseReactFlightId(value.slice(2))) ?? {
|
|
906
|
+
return (errorChunks.get(parseReactFlightId(value.slice(2))) ?? {
|
|
870
907
|
kind: "error",
|
|
871
908
|
name: "Error",
|
|
872
909
|
message: "Unknown React Flight error.",
|
|
873
|
-
};
|
|
910
|
+
});
|
|
874
911
|
}
|
|
875
912
|
if (value === "$Y" || value.startsWith("$E")) {
|
|
876
913
|
return { kind: "undefined" };
|
|
@@ -950,10 +987,7 @@ function encodeReactFlightError(model) {
|
|
|
950
987
|
};
|
|
951
988
|
}
|
|
952
989
|
function isFlightErrorModel(model) {
|
|
953
|
-
return (typeof model === "object" &&
|
|
954
|
-
model !== null &&
|
|
955
|
-
!Array.isArray(model) &&
|
|
956
|
-
model.kind === "error");
|
|
990
|
+
return (typeof model === "object" && model !== null && !Array.isArray(model) && model.kind === "error");
|
|
957
991
|
}
|
|
958
992
|
function valueIsObject(value) {
|
|
959
993
|
return typeof value === "object" && value !== null && !Array.isArray(value);
|
|
@@ -974,8 +1008,7 @@ async function serializeFlightValue(value, state, depth) {
|
|
|
974
1008
|
if (awaited === undefined) {
|
|
975
1009
|
return { kind: "undefined" };
|
|
976
1010
|
}
|
|
977
|
-
if (typeof awaited === "string" ||
|
|
978
|
-
typeof awaited === "boolean") {
|
|
1011
|
+
if (typeof awaited === "string" || typeof awaited === "boolean") {
|
|
979
1012
|
return awaited;
|
|
980
1013
|
}
|
|
981
1014
|
if (typeof awaited === "number") {
|
|
@@ -1032,10 +1065,7 @@ async function serializeFlightValue(value, state, depth) {
|
|
|
1032
1065
|
if (isFormDataLike(awaited)) {
|
|
1033
1066
|
return {
|
|
1034
1067
|
kind: "form-data",
|
|
1035
|
-
entries: await Promise.all(Array.from(awaited.entries()).map(async ([key, value]) => [
|
|
1036
|
-
key,
|
|
1037
|
-
await serializeFlightValue(value, state, depth + 1),
|
|
1038
|
-
])),
|
|
1068
|
+
entries: await Promise.all(Array.from(awaited.entries()).map(async ([key, value]) => [key, await serializeFlightValue(value, state, depth + 1)])),
|
|
1039
1069
|
};
|
|
1040
1070
|
}
|
|
1041
1071
|
if (isIterableObject(awaited)) {
|
|
@@ -1090,17 +1120,11 @@ async function serializeElement(element, state, depth) {
|
|
|
1090
1120
|
throw new TypeError("Unsupported Flight element type.");
|
|
1091
1121
|
}
|
|
1092
1122
|
async function serializeProps(props, state, depth) {
|
|
1093
|
-
const entries = await Promise.all(Object.entries(props).map(async ([key, value]) => [
|
|
1094
|
-
key,
|
|
1095
|
-
await serializeFlightValue(value, state, depth + 1),
|
|
1096
|
-
]));
|
|
1123
|
+
const entries = await Promise.all(Object.entries(props).map(async ([key, value]) => [key, await serializeFlightValue(value, state, depth + 1)]));
|
|
1097
1124
|
return Object.fromEntries(entries);
|
|
1098
1125
|
}
|
|
1099
1126
|
async function serializeObject(object, state, depth) {
|
|
1100
|
-
return Object.fromEntries(await Promise.all(Object.entries(object).map(async ([key, value]) => [
|
|
1101
|
-
key,
|
|
1102
|
-
await serializeFlightValue(value, state, depth + 1),
|
|
1103
|
-
])));
|
|
1127
|
+
return Object.fromEntries(await Promise.all(Object.entries(object).map(async ([key, value]) => [key, await serializeFlightValue(value, state, depth + 1)])));
|
|
1104
1128
|
}
|
|
1105
1129
|
function getClientReferenceId(reference, state) {
|
|
1106
1130
|
const key = `${reference.moduleId}:${reference.exportName}`;
|
|
@@ -1193,6 +1217,49 @@ async function readServerActionPayload(request, maxBodyBytes) {
|
|
|
1193
1217
|
return jsonResponse({ ok: false, error: "Invalid JSON payload." }, 400);
|
|
1194
1218
|
}
|
|
1195
1219
|
}
|
|
1220
|
+
function validateServerActionJsonArgumentStructure(boundArgs, args) {
|
|
1221
|
+
const stack = [
|
|
1222
|
+
{ depth: 0, value: boundArgs },
|
|
1223
|
+
{ depth: 0, value: args },
|
|
1224
|
+
];
|
|
1225
|
+
const seen = new WeakSet();
|
|
1226
|
+
while (stack.length > 0) {
|
|
1227
|
+
const current = stack.pop();
|
|
1228
|
+
if (current === undefined) {
|
|
1229
|
+
continue;
|
|
1230
|
+
}
|
|
1231
|
+
if (current.depth > MAX_SERVER_ACTION_ARGUMENT_DEPTH) {
|
|
1232
|
+
return { valid: false };
|
|
1233
|
+
}
|
|
1234
|
+
if (current.value === null || typeof current.value !== "object") {
|
|
1235
|
+
continue;
|
|
1236
|
+
}
|
|
1237
|
+
if (seen.has(current.value)) {
|
|
1238
|
+
continue;
|
|
1239
|
+
}
|
|
1240
|
+
seen.add(current.value);
|
|
1241
|
+
if (Array.isArray(current.value)) {
|
|
1242
|
+
if (current.value.length > MAX_SERVER_ACTION_ARGUMENT_ARRAY_LENGTH) {
|
|
1243
|
+
return { valid: false };
|
|
1244
|
+
}
|
|
1245
|
+
for (const item of current.value) {
|
|
1246
|
+
stack.push({ depth: current.depth + 1, value: item });
|
|
1247
|
+
}
|
|
1248
|
+
continue;
|
|
1249
|
+
}
|
|
1250
|
+
const entries = Object.entries(current.value);
|
|
1251
|
+
if (entries.length > MAX_SERVER_ACTION_ARGUMENT_OBJECT_KEYS) {
|
|
1252
|
+
return { valid: false };
|
|
1253
|
+
}
|
|
1254
|
+
for (const [key, value] of entries) {
|
|
1255
|
+
if (SERVER_ACTION_FORBIDDEN_JSON_KEYS.has(key)) {
|
|
1256
|
+
return { valid: false };
|
|
1257
|
+
}
|
|
1258
|
+
stack.push({ depth: current.depth + 1, value });
|
|
1259
|
+
}
|
|
1260
|
+
}
|
|
1261
|
+
return { valid: true };
|
|
1262
|
+
}
|
|
1196
1263
|
function getServerAction(entry) {
|
|
1197
1264
|
return typeof entry === "function" ? entry : entry.action;
|
|
1198
1265
|
}
|