@nifrajs/web 2.0.0 → 2.1.0
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/deferred.d.ts +3 -2
- package/dist/deferred.d.ts.map +1 -1
- package/dist/deferred.js +11 -8
- package/dist/deferred.js.map +1 -1
- package/package.json +2 -2
- package/src/deferred.ts +13 -6
package/dist/deferred.d.ts
CHANGED
|
@@ -5,6 +5,7 @@
|
|
|
5
5
|
* protocol — the marker, the resolved/deferred split, and the tiny client registry that streamed
|
|
6
6
|
* resolution scripts settle. The per-adapter `<Await>` lives in `@nifrajs/web-{solid,react}/client`.
|
|
7
7
|
*/
|
|
8
|
+
import { type TransportCodec } from "@nifrajs/core/transport-codec";
|
|
8
9
|
/**
|
|
9
10
|
* A loader value marked to stream in after the shell. The component consumes it with the adapter's
|
|
10
11
|
* `<Await resolve={...}>`; until the promise settles the shell shows the `<Suspense>` fallback.
|
|
@@ -64,7 +65,7 @@ export declare const DEFERRED_ERROR_CODE = "deferred_error";
|
|
|
64
65
|
export declare function ndjsonStream(forClient: unknown, deferred: ReadonlyArray<{
|
|
65
66
|
readonly id: number;
|
|
66
67
|
readonly promise: Promise<unknown>;
|
|
67
|
-
}
|
|
68
|
+
}>, codec?: TransportCodec): ReadableStream<Uint8Array>;
|
|
68
69
|
/**
|
|
69
70
|
* Inline client runtime injected into the shell `<head>` when a page has deferred data: a per-id
|
|
70
71
|
* promise registry that streamed `__nifraResolve(id, value)` / `__nifraReject(id, err)` scripts settle
|
|
@@ -86,5 +87,5 @@ export declare const MAP_DEFERRED_SOURCE = "const mapDeferred = (d) => {\n if (
|
|
|
86
87
|
* markers' promises settle/reject in the background. If the stream ends (or `signal` aborts) with
|
|
87
88
|
* markers unsettled, they reject — so `<Await>` never hangs.
|
|
88
89
|
*/
|
|
89
|
-
export declare function parseNdjsonData(stream: ReadableStream<Uint8Array>, signal?: AbortSignal): Promise<unknown>;
|
|
90
|
+
export declare function parseNdjsonData(stream: ReadableStream<Uint8Array>, signal?: AbortSignal, codec?: TransportCodec): Promise<unknown>;
|
|
90
91
|
//# sourceMappingURL=deferred.d.ts.map
|
package/dist/deferred.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"deferred.d.ts","sourceRoot":"","sources":["../src/deferred.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;
|
|
1
|
+
{"version":3,"file":"deferred.d.ts","sourceRoot":"","sources":["../src/deferred.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AACH,OAAO,EAAkB,KAAK,cAAc,EAAE,MAAM,+BAA+B,CAAA;AAEnF;;;;GAIG;AACH,MAAM,WAAW,QAAQ,CAAC,CAAC;IACzB,QAAQ,CAAC,gBAAgB,EAAE,IAAI,CAAA;IAC/B,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAA;IACnB,QAAQ,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC,CAAC,CAAA;CAC7B;AAED;;;;;;;;;GASG;AACH,wBAAgB,KAAK,CAAC,CAAC,EAAE,OAAO,EAAE,OAAO,CAAC,CAAC,CAAC,GAAG,QAAQ,CAAC,CAAC,CAAC,CAKzD;AAYD;;;;;;;;;GASG;AACH,wBAAgB,eAAe,CAC7B,IAAI,EAAE,OAAO,EACb,QAAQ,SAAI,GACX;IACD,QAAQ,CAAC,YAAY,EAAE,OAAO,CAAA;IAC9B,QAAQ,CAAC,SAAS,EAAE,OAAO,CAAA;IAC3B,QAAQ,CAAC,QAAQ,EAAE,aAAa,CAAC;QAAE,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAC;QAAC,QAAQ,CAAC,OAAO,EAAE,OAAO,CAAC,OAAO,CAAC,CAAA;KAAE,CAAC,CAAA;CAC9F,CA2EA;AAED;;;;;GAKG;AACH,eAAO,MAAM,mBAAmB,mBAAmB,CAAA;AAInD;;;;;;;;;GASG;AACH,wBAAgB,YAAY,CAC1B,SAAS,EAAE,OAAO,EAClB,QAAQ,EAAE,aAAa,CAAC;IAAE,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,OAAO,EAAE,OAAO,CAAC,OAAO,CAAC,CAAA;CAAE,CAAC,EACpF,KAAK,GAAE,cAA+B,GACrC,cAAc,CAAC,UAAU,CAAC,CAsB5B;AAED;;;;;;GAMG;AACH,eAAO,MAAM,gBAAgB,2iCAqBvB,CAAA;AAEN;;;;GAIG;AACH,eAAO,MAAM,mBAAmB,uXAO9B,CAAA;AA8CF;;;;;;GAMG;AACH,wBAAsB,eAAe,CACnC,MAAM,EAAE,cAAc,CAAC,UAAU,CAAC,EAClC,MAAM,CAAC,EAAE,WAAW,EACpB,KAAK,GAAE,cAA+B,GACrC,OAAO,CAAC,OAAO,CAAC,CA4DlB"}
|
package/dist/deferred.js
CHANGED
|
@@ -5,6 +5,7 @@
|
|
|
5
5
|
* protocol — the marker, the resolved/deferred split, and the tiny client registry that streamed
|
|
6
6
|
* resolution scripts settle. The per-adapter `<Await>` lives in `@nifrajs/web-{solid,react}/client`.
|
|
7
7
|
*/
|
|
8
|
+
import { plainJsonCodec } from "@nifrajs/core/transport-codec";
|
|
8
9
|
/**
|
|
9
10
|
* Mark a loader value as deferred — it streams in after the shell instead of blocking it. Works
|
|
10
11
|
* **anywhere** in the loader's returned data — a top-level key, or nested in objects/arrays:
|
|
@@ -136,20 +137,20 @@ const NDJSON_ENCODER = new TextEncoder();
|
|
|
136
137
|
* escapes newlines in values, so each line is NDJSON-safe; no HTML escaping (this is a fetch body,
|
|
137
138
|
* parsed with `JSON.parse`, never injected into markup).
|
|
138
139
|
*/
|
|
139
|
-
export function ndjsonStream(forClient, deferred) {
|
|
140
|
+
export function ndjsonStream(forClient, deferred, codec = plainJsonCodec) {
|
|
140
141
|
return new ReadableStream({
|
|
141
142
|
async start(controller) {
|
|
142
|
-
controller.enqueue(NDJSON_ENCODER.encode(`${
|
|
143
|
+
controller.enqueue(NDJSON_ENCODER.encode(`${codec.encode(forClient)}\n`));
|
|
143
144
|
await Promise.all(deferred.map(async (d) => {
|
|
144
145
|
try {
|
|
145
146
|
const value = await d.promise;
|
|
146
|
-
controller.enqueue(NDJSON_ENCODER.encode(`${
|
|
147
|
+
controller.enqueue(NDJSON_ENCODER.encode(`${codec.encode({ i: d.id, v: value })}\n`));
|
|
147
148
|
}
|
|
148
149
|
catch (err) {
|
|
149
150
|
// Redact: stream a stable opaque code, never the raw error text; log the real reason
|
|
150
151
|
// server-side. The client's <Await> errorFallback receives this code.
|
|
151
152
|
console.error("[nifra/web] deferred value rejected:", err);
|
|
152
|
-
controller.enqueue(NDJSON_ENCODER.encode(`${
|
|
153
|
+
controller.enqueue(NDJSON_ENCODER.encode(`${codec.encode({ i: d.id, e: DEFERRED_ERROR_CODE })}\n`));
|
|
153
154
|
}
|
|
154
155
|
}));
|
|
155
156
|
controller.close();
|
|
@@ -228,7 +229,9 @@ function markersFromPlaceholders(data, pending) {
|
|
|
228
229
|
}
|
|
229
230
|
if (Array.isArray(value))
|
|
230
231
|
return value.map(walk);
|
|
231
|
-
if (value !== null &&
|
|
232
|
+
if (value !== null &&
|
|
233
|
+
typeof value === "object" &&
|
|
234
|
+
(Object.getPrototypeOf(value) === Object.prototype || Object.getPrototypeOf(value) === null)) {
|
|
232
235
|
const out = {};
|
|
233
236
|
for (const [key, v] of Object.entries(value))
|
|
234
237
|
out[key] = walk(v);
|
|
@@ -245,7 +248,7 @@ function markersFromPlaceholders(data, pending) {
|
|
|
245
248
|
* markers' promises settle/reject in the background. If the stream ends (or `signal` aborts) with
|
|
246
249
|
* markers unsettled, they reject — so `<Await>` never hangs.
|
|
247
250
|
*/
|
|
248
|
-
export async function parseNdjsonData(stream, signal) {
|
|
251
|
+
export async function parseNdjsonData(stream, signal, codec = plainJsonCodec) {
|
|
249
252
|
const reader = stream.getReader();
|
|
250
253
|
const dec = new TextDecoder();
|
|
251
254
|
let buffer = "";
|
|
@@ -273,7 +276,7 @@ export async function parseNdjsonData(stream, signal) {
|
|
|
273
276
|
};
|
|
274
277
|
const pending = new Map();
|
|
275
278
|
const first = await readLine();
|
|
276
|
-
const data = markersFromPlaceholders(first === null ? null :
|
|
279
|
+
const data = markersFromPlaceholders(first === null ? null : codec.decode(first), pending);
|
|
277
280
|
void (async () => {
|
|
278
281
|
try {
|
|
279
282
|
for (;;) {
|
|
@@ -282,7 +285,7 @@ export async function parseNdjsonData(stream, signal) {
|
|
|
282
285
|
break;
|
|
283
286
|
if (line === "")
|
|
284
287
|
continue;
|
|
285
|
-
const msg =
|
|
288
|
+
const msg = codec.decode(line);
|
|
286
289
|
const entry = pending.get(msg.i);
|
|
287
290
|
if (entry === undefined)
|
|
288
291
|
continue;
|
package/dist/deferred.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"deferred.js","sourceRoot":"","sources":["../src/deferred.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;
|
|
1
|
+
{"version":3,"file":"deferred.js","sourceRoot":"","sources":["../src/deferred.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@nifrajs/web",
|
|
3
|
-
"version": "2.
|
|
3
|
+
"version": "2.1.0",
|
|
4
4
|
"description": "Framework-agnostic SSR core for nifra — the render seam + HTML document orchestration.",
|
|
5
5
|
"keywords": [
|
|
6
6
|
"bun",
|
|
@@ -122,7 +122,7 @@
|
|
|
122
122
|
"access": "public"
|
|
123
123
|
},
|
|
124
124
|
"dependencies": {
|
|
125
|
-
"@nifrajs/core": "2.
|
|
125
|
+
"@nifrajs/core": "2.1.0"
|
|
126
126
|
},
|
|
127
127
|
"peerDependencies": {
|
|
128
128
|
"sass": "^1.0.0",
|
package/src/deferred.ts
CHANGED
|
@@ -5,6 +5,7 @@
|
|
|
5
5
|
* protocol — the marker, the resolved/deferred split, and the tiny client registry that streamed
|
|
6
6
|
* resolution scripts settle. The per-adapter `<Await>` lives in `@nifrajs/web-{solid,react}/client`.
|
|
7
7
|
*/
|
|
8
|
+
import { plainJsonCodec, type TransportCodec } from "@nifrajs/core/transport-codec"
|
|
8
9
|
|
|
9
10
|
/**
|
|
10
11
|
* A loader value marked to stream in after the shell. The component consumes it with the adapter's
|
|
@@ -161,21 +162,22 @@ const NDJSON_ENCODER = new TextEncoder()
|
|
|
161
162
|
export function ndjsonStream(
|
|
162
163
|
forClient: unknown,
|
|
163
164
|
deferred: ReadonlyArray<{ readonly id: number; readonly promise: Promise<unknown> }>,
|
|
165
|
+
codec: TransportCodec = plainJsonCodec,
|
|
164
166
|
): ReadableStream<Uint8Array> {
|
|
165
167
|
return new ReadableStream({
|
|
166
168
|
async start(controller) {
|
|
167
|
-
controller.enqueue(NDJSON_ENCODER.encode(`${
|
|
169
|
+
controller.enqueue(NDJSON_ENCODER.encode(`${codec.encode(forClient)}\n`))
|
|
168
170
|
await Promise.all(
|
|
169
171
|
deferred.map(async (d) => {
|
|
170
172
|
try {
|
|
171
173
|
const value = await d.promise
|
|
172
|
-
controller.enqueue(NDJSON_ENCODER.encode(`${
|
|
174
|
+
controller.enqueue(NDJSON_ENCODER.encode(`${codec.encode({ i: d.id, v: value })}\n`))
|
|
173
175
|
} catch (err) {
|
|
174
176
|
// Redact: stream a stable opaque code, never the raw error text; log the real reason
|
|
175
177
|
// server-side. The client's <Await> errorFallback receives this code.
|
|
176
178
|
console.error("[nifra/web] deferred value rejected:", err)
|
|
177
179
|
controller.enqueue(
|
|
178
|
-
NDJSON_ENCODER.encode(`${
|
|
180
|
+
NDJSON_ENCODER.encode(`${codec.encode({ i: d.id, e: DEFERRED_ERROR_CODE })}\n`),
|
|
179
181
|
)
|
|
180
182
|
}
|
|
181
183
|
}),
|
|
@@ -259,7 +261,11 @@ function markersFromPlaceholders(data: unknown, pending: Pending): unknown {
|
|
|
259
261
|
return marker
|
|
260
262
|
}
|
|
261
263
|
if (Array.isArray(value)) return value.map(walk)
|
|
262
|
-
if (
|
|
264
|
+
if (
|
|
265
|
+
value !== null &&
|
|
266
|
+
typeof value === "object" &&
|
|
267
|
+
(Object.getPrototypeOf(value) === Object.prototype || Object.getPrototypeOf(value) === null)
|
|
268
|
+
) {
|
|
263
269
|
const out: Record<string, unknown> = {}
|
|
264
270
|
for (const [key, v] of Object.entries(value)) out[key] = walk(v)
|
|
265
271
|
return out
|
|
@@ -279,6 +285,7 @@ function markersFromPlaceholders(data: unknown, pending: Pending): unknown {
|
|
|
279
285
|
export async function parseNdjsonData(
|
|
280
286
|
stream: ReadableStream<Uint8Array>,
|
|
281
287
|
signal?: AbortSignal,
|
|
288
|
+
codec: TransportCodec = plainJsonCodec,
|
|
282
289
|
): Promise<unknown> {
|
|
283
290
|
const reader = stream.getReader()
|
|
284
291
|
const dec = new TextDecoder()
|
|
@@ -308,7 +315,7 @@ export async function parseNdjsonData(
|
|
|
308
315
|
|
|
309
316
|
const pending: Pending = new Map()
|
|
310
317
|
const first = await readLine()
|
|
311
|
-
const data = markersFromPlaceholders(first === null ? null :
|
|
318
|
+
const data = markersFromPlaceholders(first === null ? null : codec.decode(first), pending)
|
|
312
319
|
|
|
313
320
|
void (async () => {
|
|
314
321
|
try {
|
|
@@ -316,7 +323,7 @@ export async function parseNdjsonData(
|
|
|
316
323
|
const line = await readLine()
|
|
317
324
|
if (line === null) break
|
|
318
325
|
if (line === "") continue
|
|
319
|
-
const msg =
|
|
326
|
+
const msg = codec.decode(line) as { i: number; v?: unknown; e?: string }
|
|
320
327
|
const entry = pending.get(msg.i)
|
|
321
328
|
if (entry === undefined) continue
|
|
322
329
|
pending.delete(msg.i)
|