@rsc-kit/core 0.3.0 → 0.4.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.
@@ -1,62 +0,0 @@
1
- /**
2
- * Read every chunk a stream already has queued, then stop.
3
- *
4
- * A queued chunk settles its read in a microtask, so it always beats the
5
- * macrotask this races it against. A read that loses means the producer is
6
- * waiting on data rather than still writing — for React's SSR stream, the
7
- * moment the shell is fully out.
8
- *
9
- * The losing read is handed back rather than dropped, so the caller resumes
10
- * without losing a chunk.
11
- */
12
- export declare function drainQueuedChunks<T>(reader: {
13
- read(): Promise<{
14
- done: boolean;
15
- value?: T;
16
- }>;
17
- }, onChunk: (chunk: T) => void): Promise<{
18
- pending: Promise<{
19
- done: boolean;
20
- value?: T;
21
- }> | null;
22
- done: boolean;
23
- }>;
24
- export interface DeferredHost {
25
- /** Installed in place of the real host fn for the whole request. */
26
- hostFn: (fn: string, ...args: unknown[]) => Promise<unknown>;
27
- /** Start queueing. Called once metadata is resolved. */
28
- begin: () => void;
29
- /** Release the queue. Called once React's first payload is on the socket. */
30
- flush: () => void;
31
- }
32
- /**
33
- * Queue host calls made during the render, so React's first payload — the HTML
34
- * shell, or the Flight root model and fallback rows — is on the socket before
35
- * PHP blocks on one.
36
- *
37
- * PHP runs a host callback synchronously on the same thread that pumps that
38
- * socket. Once a call starts, nothing the worker writes reaches the browser
39
- * until it returns, so anything React had not yet produced is stranded for the
40
- * duration. Both streaming paths share this: it is the difference between a
41
- * page painting its skeletons at once and painting nothing for the length of
42
- * the slowest call in it.
43
- */
44
- export declare function createDeferredHost(realHostFn: (fn: string, ...args: unknown[]) => Promise<unknown>): DeferredHost;
45
- /**
46
- * Write a React stream out, releasing the deferred host calls at the one safe
47
- * moment: after everything already queued — the shell, or the Flight root model
48
- * and fallback rows — is on the socket, and before anything that arrives later.
49
- *
50
- * Both worker paths stream through this so the ordering cannot drift between
51
- * them. It already had: the HTML path released after its first chunk and the
52
- * Flight path never deferred at all, so a slow host call blocked PHP with most
53
- * of the payload still unwritten and the browser rendered nothing until the
54
- * call returned.
55
- */
56
- export declare function streamWithDeferredRelease<T>(reader: {
57
- read(): Promise<{
58
- done: boolean;
59
- value?: T;
60
- }>;
61
- }, onChunk: (chunk: T) => void, release: () => void, idle?: () => Promise<void>): Promise<void>;
62
- //# sourceMappingURL=streaming.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"streaming.d.ts","sourceRoot":"","sources":["../src/streaming.ts"],"names":[],"mappings":"AAUA;;;;;;;;;;GAUG;AACH,wBAAsB,iBAAiB,CAAC,CAAC,EACvC,MAAM,EAAE;IAAE,IAAI,IAAI,OAAO,CAAC;QAAE,IAAI,EAAE,OAAO,CAAC;QAAC,KAAK,CAAC,EAAE,CAAC,CAAA;KAAE,CAAC,CAAA;CAAE,EACzD,OAAO,EAAE,CAAC,KAAK,EAAE,CAAC,KAAK,IAAI,GAC1B,OAAO,CAAC;IAAE,OAAO,EAAE,OAAO,CAAC;QAAE,IAAI,EAAE,OAAO,CAAC;QAAC,KAAK,CAAC,EAAE,CAAC,CAAA;KAAE,CAAC,GAAG,IAAI,CAAC;IAAC,IAAI,EAAE,OAAO,CAAA;CAAE,CAAC,CAenF;AAED,MAAM,WAAW,YAAY;IAC3B,oEAAoE;IACpE,MAAM,EAAE,CAAC,EAAE,EAAE,MAAM,EAAE,GAAG,IAAI,EAAE,OAAO,EAAE,KAAK,OAAO,CAAC,OAAO,CAAC,CAAC;IAC7D,wDAAwD;IACxD,KAAK,EAAE,MAAM,IAAI,CAAC;IAClB,6EAA6E;IAC7E,KAAK,EAAE,MAAM,IAAI,CAAC;CACnB;AAED;;;;;;;;;;;GAWG;AACH,wBAAgB,kBAAkB,CAAC,UAAU,EAAE,CAAC,EAAE,EAAE,MAAM,EAAE,GAAG,IAAI,EAAE,OAAO,EAAE,KAAK,OAAO,CAAC,OAAO,CAAC,GAAG,YAAY,CA4CjH;AAED;;;;;;;;;;GAUG;AACH,wBAAsB,yBAAyB,CAAC,CAAC,EAC/C,MAAM,EAAE;IAAE,IAAI,IAAI,OAAO,CAAC;QAAE,IAAI,EAAE,OAAO,CAAC;QAAC,KAAK,CAAC,EAAE,CAAC,CAAA;KAAE,CAAC,CAAA;CAAE,EACzD,OAAO,EAAE,CAAC,KAAK,EAAE,CAAC,KAAK,IAAI,EAC3B,OAAO,EAAE,MAAM,IAAI,EACnB,IAAI,GAAE,MAAM,OAAO,CAAC,IAAI,CAAoB,GAC3C,OAAO,CAAC,IAAI,CAAC,CAcf"}
package/dist/streaming.js DELETED
@@ -1,108 +0,0 @@
1
- // Streaming coordination shared by both worker paths — initial-load HTML and
2
- // SPA-navigation Flight.
3
- //
4
- // Both stream React output over a socket that PHP pumps on the same thread it
5
- // runs host callbacks on. That single fact drives everything here: React's
6
- // first payload has to be on the socket before a callback can block, or the
7
- // browser sees nothing until the slowest call in the page returns.
8
- import { yieldToEventLoop } from './runtime.js';
9
- /**
10
- * Read every chunk a stream already has queued, then stop.
11
- *
12
- * A queued chunk settles its read in a microtask, so it always beats the
13
- * macrotask this races it against. A read that loses means the producer is
14
- * waiting on data rather than still writing — for React's SSR stream, the
15
- * moment the shell is fully out.
16
- *
17
- * The losing read is handed back rather than dropped, so the caller resumes
18
- * without losing a chunk.
19
- */
20
- export async function drainQueuedChunks(reader, onChunk) {
21
- let pending = reader.read();
22
- while (true) {
23
- const settled = await Promise.race([
24
- pending.then((result) => ({ result })),
25
- yieldToEventLoop().then(() => null),
26
- ]);
27
- if (settled === null)
28
- return { pending, done: false };
29
- if (settled.result.done)
30
- return { pending: null, done: true };
31
- onChunk(settled.result.value);
32
- pending = reader.read();
33
- }
34
- }
35
- /**
36
- * Queue host calls made during the render, so React's first payload — the HTML
37
- * shell, or the Flight root model and fallback rows — is on the socket before
38
- * PHP blocks on one.
39
- *
40
- * PHP runs a host callback synchronously on the same thread that pumps that
41
- * socket. Once a call starts, nothing the worker writes reaches the browser
42
- * until it returns, so anything React had not yet produced is stranded for the
43
- * duration. Both streaming paths share this: it is the difference between a
44
- * page painting its skeletons at once and painting nothing for the length of
45
- * the slowest call in it.
46
- */
47
- export function createDeferredHost(realHostFn) {
48
- const pendingCalls = [];
49
- let flushed = false;
50
- let deferring = false;
51
- let backstop;
52
- const flush = () => {
53
- if (flushed)
54
- return;
55
- flushed = true;
56
- clearTimeout(backstop);
57
- for (const call of pendingCalls) {
58
- realHostFn(call.fn, ...call.args).then(call.resolve, call.reject);
59
- }
60
- pendingCalls.length = 0;
61
- };
62
- return {
63
- hostFn: (functionName, ...args) => {
64
- if (!deferring || flushed)
65
- return realHostFn(functionName, ...args);
66
- return new Promise((resolve, reject) => {
67
- pendingCalls.push({ fn: functionName, args, resolve, reject });
68
- });
69
- },
70
- // Deferral covers the render only. Metadata resolves before any payload
71
- // exists, so a host call there has nothing to strand — queueing it would
72
- // just stall generateMetadata until the backstop fired.
73
- begin: () => {
74
- deferring = true;
75
- // Backstop only, for a render that awaits a host call before it can
76
- // produce the payload that would release the queue. The build rejects
77
- // such a page unless it ships a loading.tsx, whose shell does not block,
78
- // so in practice the drain always gets there first. Long on purpose: it
79
- // must never race a cold start.
80
- backstop = setTimeout(flush, 5000);
81
- },
82
- flush,
83
- };
84
- }
85
- /**
86
- * Write a React stream out, releasing the deferred host calls at the one safe
87
- * moment: after everything already queued — the shell, or the Flight root model
88
- * and fallback rows — is on the socket, and before anything that arrives later.
89
- *
90
- * Both worker paths stream through this so the ordering cannot drift between
91
- * them. It already had: the HTML path released after its first chunk and the
92
- * Flight path never deferred at all, so a slow host call blocked PHP with most
93
- * of the payload still unwritten and the browser rendered nothing until the
94
- * call returned.
95
- */
96
- export async function streamWithDeferredRelease(reader, onChunk, release, idle = yieldToEventLoop) {
97
- let { pending, done } = await drainQueuedChunks(reader, onChunk);
98
- release();
99
- while (!done) {
100
- const result = await (pending ?? reader.read());
101
- pending = null;
102
- if (result.done)
103
- break;
104
- onChunk(result.value);
105
- await idle();
106
- }
107
- }
108
- //# sourceMappingURL=streaming.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"streaming.js","sourceRoot":"","sources":["../src/streaming.ts"],"names":[],"mappings":"AAAA,6EAA6E;AAC7E,yBAAyB;AACzB,EAAE;AACF,8EAA8E;AAC9E,2EAA2E;AAC3E,4EAA4E;AAC5E,mEAAmE;AAEnE,OAAO,EAAE,gBAAgB,EAAE,MAAM,cAAc,CAAA;AAE/C;;;;;;;;;;GAUG;AACH,MAAM,CAAC,KAAK,UAAU,iBAAiB,CACrC,MAAyD,EACzD,OAA2B;IAE3B,IAAI,OAAO,GAAG,MAAM,CAAC,IAAI,EAAE,CAAA;IAE3B,OAAO,IAAI,EAAE,CAAC;QACZ,MAAM,OAAO,GAAG,MAAM,OAAO,CAAC,IAAI,CAAC;YACjC,OAAO,CAAC,IAAI,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,CAAC;YACtC,gBAAgB,EAAE,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC;SACpC,CAAC,CAAA;QAEF,IAAI,OAAO,KAAK,IAAI;YAAE,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,KAAK,EAAE,CAAA;QACrD,IAAI,OAAO,CAAC,MAAM,CAAC,IAAI;YAAE,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,CAAA;QAE7D,OAAO,CAAC,OAAO,CAAC,MAAM,CAAC,KAAU,CAAC,CAAA;QAClC,OAAO,GAAG,MAAM,CAAC,IAAI,EAAE,CAAA;IACzB,CAAC;AACH,CAAC;AAWD;;;;;;;;;;;GAWG;AACH,MAAM,UAAU,kBAAkB,CAAC,UAAgE;IACjG,MAAM,YAAY,GAGb,EAAE,CAAC;IACR,IAAI,OAAO,GAAG,KAAK,CAAC;IACpB,IAAI,SAAS,GAAG,KAAK,CAAC;IACtB,IAAI,QAAmD,CAAC;IAExD,MAAM,KAAK,GAAG,GAAG,EAAE;QACjB,IAAI,OAAO;YAAE,OAAO;QACpB,OAAO,GAAG,IAAI,CAAC;QACf,YAAY,CAAC,QAAQ,CAAC,CAAC;QACvB,KAAK,MAAM,IAAI,IAAI,YAAY,EAAE,CAAC;YAChC,UAAU,CAAC,IAAI,CAAC,EAAE,EAAE,GAAG,IAAI,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,IAAI,CAAC,MAAM,CAAC,CAAC;QACpE,CAAC;QACD,YAAY,CAAC,MAAM,GAAG,CAAC,CAAC;IAC1B,CAAC,CAAC;IAEF,OAAO;QACL,MAAM,EAAE,CAAC,YAAoB,EAAE,GAAG,IAAe,EAAoB,EAAE;YACrE,IAAI,CAAC,SAAS,IAAI,OAAO;gBAAE,OAAO,UAAU,CAAC,YAAY,EAAE,GAAG,IAAI,CAAC,CAAC;YAEpE,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;gBACrC,YAAY,CAAC,IAAI,CAAC,EAAE,EAAE,EAAE,YAAY,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,EAAE,CAAC,CAAC;YACjE,CAAC,CAAC,CAAC;QACL,CAAC;QAED,wEAAwE;QACxE,yEAAyE;QACzE,wDAAwD;QACxD,KAAK,EAAE,GAAG,EAAE;YACV,SAAS,GAAG,IAAI,CAAC;YAEjB,oEAAoE;YACpE,sEAAsE;YACtE,yEAAyE;YACzE,wEAAwE;YACxE,gCAAgC;YAChC,QAAQ,GAAG,UAAU,CAAC,KAAK,EAAE,IAAI,CAAC,CAAC;QACrC,CAAC;QAED,KAAK;KACN,CAAC;AACJ,CAAC;AAED;;;;;;;;;;GAUG;AACH,MAAM,CAAC,KAAK,UAAU,yBAAyB,CAC7C,MAAyD,EACzD,OAA2B,EAC3B,OAAmB,EACnB,IAAI,GAAwB,gBAAgB;IAE5C,IAAI,EAAE,OAAO,EAAE,IAAI,EAAE,GAAG,MAAM,iBAAiB,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;IAEhE,OAAO,EAAE,CAAA;IAET,OAAO,CAAC,IAAI,EAAE,CAAC;QACb,MAAM,MAAM,GAAG,MAAM,CAAC,OAAO,IAAI,MAAM,CAAC,IAAI,EAAE,CAAC,CAAA;QAC/C,OAAO,GAAG,IAAI,CAAA;QAEd,IAAI,MAAM,CAAC,IAAI;YAAE,MAAK;QAEtB,OAAO,CAAC,MAAM,CAAC,KAAU,CAAC,CAAA;QAC1B,MAAM,IAAI,EAAE,CAAA;IACd,CAAC;AACH,CAAC"}
package/dist/worker.d.ts DELETED
@@ -1,2 +0,0 @@
1
- export {};
2
- //# sourceMappingURL=worker.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"worker.d.ts","sourceRoot":"","sources":["../src/worker.ts"],"names":[],"mappings":""}