@tanstack/router-core 1.167.1 → 1.167.2
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/cjs/Matches.cjs +15 -12
- package/dist/cjs/Matches.cjs.map +1 -1
- package/dist/cjs/_virtual/_rolldown/runtime.cjs +23 -0
- package/dist/cjs/config.cjs +9 -8
- package/dist/cjs/config.cjs.map +1 -1
- package/dist/cjs/defer.cjs +37 -21
- package/dist/cjs/defer.cjs.map +1 -1
- package/dist/cjs/index.cjs +87 -89
- package/dist/cjs/isServer/client.cjs +5 -3
- package/dist/cjs/isServer/client.cjs.map +1 -1
- package/dist/cjs/isServer/development.cjs +5 -3
- package/dist/cjs/isServer/development.cjs.map +1 -1
- package/dist/cjs/isServer/server.cjs +5 -3
- package/dist/cjs/isServer/server.cjs.map +1 -1
- package/dist/cjs/link.cjs +5 -4
- package/dist/cjs/link.cjs.map +1 -1
- package/dist/cjs/load-matches.cjs +619 -766
- package/dist/cjs/load-matches.cjs.map +1 -1
- package/dist/cjs/lru-cache.cjs +67 -64
- package/dist/cjs/lru-cache.cjs.map +1 -1
- package/dist/cjs/new-process-route-tree.cjs +707 -792
- package/dist/cjs/new-process-route-tree.cjs.map +1 -1
- package/dist/cjs/not-found.cjs +20 -7
- package/dist/cjs/not-found.cjs.map +1 -1
- package/dist/cjs/path.cjs +221 -232
- package/dist/cjs/path.cjs.map +1 -1
- package/dist/cjs/qss.cjs +62 -28
- package/dist/cjs/qss.cjs.map +1 -1
- package/dist/cjs/redirect.cjs +44 -30
- package/dist/cjs/redirect.cjs.map +1 -1
- package/dist/cjs/rewrite.cjs +56 -56
- package/dist/cjs/rewrite.cjs.map +1 -1
- package/dist/cjs/root.cjs +6 -4
- package/dist/cjs/root.cjs.map +1 -1
- package/dist/cjs/route.cjs +96 -105
- package/dist/cjs/route.cjs.map +1 -1
- package/dist/cjs/router.cjs +1153 -1524
- package/dist/cjs/router.cjs.map +1 -1
- package/dist/cjs/scroll-restoration.cjs +189 -207
- package/dist/cjs/scroll-restoration.cjs.map +1 -1
- package/dist/cjs/searchMiddleware.cjs +48 -37
- package/dist/cjs/searchMiddleware.cjs.map +1 -1
- package/dist/cjs/searchParams.cjs +57 -45
- package/dist/cjs/searchParams.cjs.map +1 -1
- package/dist/cjs/ssr/client.cjs +6 -8
- package/dist/cjs/ssr/constants.cjs +6 -5
- package/dist/cjs/ssr/constants.cjs.map +1 -1
- package/dist/cjs/ssr/createRequestHandler.cjs +41 -59
- package/dist/cjs/ssr/createRequestHandler.cjs.map +1 -1
- package/dist/cjs/ssr/handlerCallback.cjs +5 -4
- package/dist/cjs/ssr/handlerCallback.cjs.map +1 -1
- package/dist/cjs/ssr/headers.cjs +17 -26
- package/dist/cjs/ssr/headers.cjs.map +1 -1
- package/dist/cjs/ssr/json.cjs +8 -4
- package/dist/cjs/ssr/json.cjs.map +1 -1
- package/dist/cjs/ssr/serializer/RawStream.cjs +268 -268
- package/dist/cjs/ssr/serializer/RawStream.cjs.map +1 -1
- package/dist/cjs/ssr/serializer/ShallowErrorPlugin.cjs +31 -32
- package/dist/cjs/ssr/serializer/ShallowErrorPlugin.cjs.map +1 -1
- package/dist/cjs/ssr/serializer/seroval-plugins.cjs +12 -12
- package/dist/cjs/ssr/serializer/seroval-plugins.cjs.map +1 -1
- package/dist/cjs/ssr/serializer/transformer.cjs +45 -41
- package/dist/cjs/ssr/serializer/transformer.cjs.map +1 -1
- package/dist/cjs/ssr/server.cjs +12 -14
- package/dist/cjs/ssr/ssr-client.cjs +173 -211
- package/dist/cjs/ssr/ssr-client.cjs.map +1 -1
- package/dist/cjs/ssr/ssr-match-id.cjs +6 -5
- package/dist/cjs/ssr/ssr-match-id.cjs.map +1 -1
- package/dist/cjs/ssr/ssr-server.cjs +266 -300
- package/dist/cjs/ssr/ssr-server.cjs.map +1 -1
- package/dist/cjs/ssr/transformStreamWithRouter.cjs +317 -337
- package/dist/cjs/ssr/transformStreamWithRouter.cjs.map +1 -1
- package/dist/cjs/ssr/tsrScript.cjs +6 -4
- package/dist/cjs/ssr/tsrScript.cjs.map +1 -1
- package/dist/cjs/utils/batch.cjs +13 -13
- package/dist/cjs/utils/batch.cjs.map +1 -1
- package/dist/cjs/utils.cjs +274 -208
- package/dist/cjs/utils.cjs.map +1 -1
- package/dist/esm/Matches.js +16 -13
- package/dist/esm/Matches.js.map +1 -1
- package/dist/esm/config.js +10 -9
- package/dist/esm/config.js.map +1 -1
- package/dist/esm/defer.js +37 -22
- package/dist/esm/defer.js.map +1 -1
- package/dist/esm/index.js +12 -82
- package/dist/esm/isServer/client.js +6 -5
- package/dist/esm/isServer/client.js.map +1 -1
- package/dist/esm/isServer/development.js +6 -5
- package/dist/esm/isServer/development.js.map +1 -1
- package/dist/esm/isServer/server.js +6 -5
- package/dist/esm/isServer/server.js.map +1 -1
- package/dist/esm/link.js +6 -5
- package/dist/esm/link.js.map +1 -1
- package/dist/esm/load-matches.js +614 -765
- package/dist/esm/load-matches.js.map +1 -1
- package/dist/esm/lru-cache.js +68 -65
- package/dist/esm/lru-cache.js.map +1 -1
- package/dist/esm/new-process-route-tree.js +705 -797
- package/dist/esm/new-process-route-tree.js.map +1 -1
- package/dist/esm/not-found.js +21 -9
- package/dist/esm/not-found.js.map +1 -1
- package/dist/esm/path.js +220 -241
- package/dist/esm/path.js.map +1 -1
- package/dist/esm/qss.js +63 -30
- package/dist/esm/qss.js.map +1 -1
- package/dist/esm/redirect.js +45 -34
- package/dist/esm/redirect.js.map +1 -1
- package/dist/esm/rewrite.js +57 -60
- package/dist/esm/rewrite.js.map +1 -1
- package/dist/esm/root.js +7 -5
- package/dist/esm/root.js.map +1 -1
- package/dist/esm/route.js +92 -105
- package/dist/esm/route.js.map +1 -1
- package/dist/esm/router.js +1147 -1527
- package/dist/esm/router.js.map +1 -1
- package/dist/esm/scroll-restoration.js +188 -213
- package/dist/esm/scroll-restoration.js.map +1 -1
- package/dist/esm/searchMiddleware.js +48 -38
- package/dist/esm/searchMiddleware.js.map +1 -1
- package/dist/esm/searchParams.js +57 -48
- package/dist/esm/searchParams.js.map +1 -1
- package/dist/esm/ssr/client.js +1 -6
- package/dist/esm/ssr/constants.js +7 -7
- package/dist/esm/ssr/constants.js.map +1 -1
- package/dist/esm/ssr/createRequestHandler.js +39 -58
- package/dist/esm/ssr/createRequestHandler.js.map +1 -1
- package/dist/esm/ssr/handlerCallback.js +6 -5
- package/dist/esm/ssr/handlerCallback.js.map +1 -1
- package/dist/esm/ssr/headers.js +16 -26
- package/dist/esm/ssr/headers.js.map +1 -1
- package/dist/esm/ssr/json.js +9 -5
- package/dist/esm/ssr/json.js.map +1 -1
- package/dist/esm/ssr/serializer/RawStream.js +267 -273
- package/dist/esm/ssr/serializer/RawStream.js.map +1 -1
- package/dist/esm/ssr/serializer/ShallowErrorPlugin.js +31 -32
- package/dist/esm/ssr/serializer/ShallowErrorPlugin.js.map +1 -1
- package/dist/esm/ssr/serializer/seroval-plugins.js +10 -11
- package/dist/esm/ssr/serializer/seroval-plugins.js.map +1 -1
- package/dist/esm/ssr/serializer/transformer.js +44 -43
- package/dist/esm/ssr/serializer/transformer.js.map +1 -1
- package/dist/esm/ssr/server.js +2 -12
- package/dist/esm/ssr/ssr-client.js +169 -209
- package/dist/esm/ssr/ssr-client.js.map +1 -1
- package/dist/esm/ssr/ssr-match-id.js +7 -7
- package/dist/esm/ssr/ssr-match-id.js.map +1 -1
- package/dist/esm/ssr/ssr-server.js +262 -300
- package/dist/esm/ssr/ssr-server.js.map +1 -1
- package/dist/esm/ssr/transformStreamWithRouter.js +315 -338
- package/dist/esm/ssr/transformStreamWithRouter.js.map +1 -1
- package/dist/esm/ssr/tsrScript.js +6 -5
- package/dist/esm/ssr/tsrScript.js.map +1 -1
- package/dist/esm/utils/batch.js +13 -14
- package/dist/esm/utils/batch.js.map +1 -1
- package/dist/esm/utils.js +273 -224
- package/dist/esm/utils.js.map +1 -1
- package/package.json +2 -2
- package/dist/cjs/index.cjs.map +0 -1
- package/dist/cjs/ssr/client.cjs.map +0 -1
- package/dist/cjs/ssr/server.cjs.map +0 -1
- package/dist/esm/index.js.map +0 -1
- package/dist/esm/ssr/client.js.map +0 -1
- package/dist/esm/ssr/server.js.map +0 -1
|
@@ -1,288 +1,288 @@
|
|
|
1
|
-
"
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
1
|
+
require("../../_virtual/_rolldown/runtime.cjs");
|
|
2
|
+
let seroval = require("seroval");
|
|
3
|
+
//#region src/ssr/serializer/RawStream.ts
|
|
4
|
+
/**
|
|
5
|
+
* Marker class for ReadableStream<Uint8Array> that should be serialized
|
|
6
|
+
* with base64 encoding (SSR) or binary framing (server functions).
|
|
7
|
+
*
|
|
8
|
+
* Wrap your binary streams with this to get efficient serialization:
|
|
9
|
+
* ```ts
|
|
10
|
+
* // For binary data (files, images, etc.)
|
|
11
|
+
* return { data: new RawStream(file.stream()) }
|
|
12
|
+
*
|
|
13
|
+
* // For text-heavy data (RSC payloads, etc.)
|
|
14
|
+
* return { data: new RawStream(rscStream, { hint: 'text' }) }
|
|
15
|
+
* ```
|
|
16
|
+
*/
|
|
17
|
+
var RawStream = class {
|
|
18
|
+
constructor(stream, options) {
|
|
19
|
+
this.stream = stream;
|
|
20
|
+
this.hint = options?.hint ?? "binary";
|
|
21
|
+
}
|
|
22
|
+
};
|
|
23
|
+
var BufferCtor = globalThis.Buffer;
|
|
24
|
+
var hasNodeBuffer = !!BufferCtor && typeof BufferCtor.from === "function";
|
|
12
25
|
function uint8ArrayToBase64(bytes) {
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
}
|
|
23
|
-
return btoa(chunks.join(""));
|
|
26
|
+
if (bytes.length === 0) return "";
|
|
27
|
+
if (hasNodeBuffer) return BufferCtor.from(bytes).toString("base64");
|
|
28
|
+
const CHUNK_SIZE = 32768;
|
|
29
|
+
const chunks = [];
|
|
30
|
+
for (let i = 0; i < bytes.length; i += CHUNK_SIZE) {
|
|
31
|
+
const chunk = bytes.subarray(i, i + CHUNK_SIZE);
|
|
32
|
+
chunks.push(String.fromCharCode.apply(null, chunk));
|
|
33
|
+
}
|
|
34
|
+
return btoa(chunks.join(""));
|
|
24
35
|
}
|
|
25
36
|
function base64ToUint8Array(base64) {
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
}
|
|
36
|
-
return bytes;
|
|
37
|
+
if (base64.length === 0) return new Uint8Array(0);
|
|
38
|
+
if (hasNodeBuffer) {
|
|
39
|
+
const buf = BufferCtor.from(base64, "base64");
|
|
40
|
+
return new Uint8Array(buf.buffer, buf.byteOffset, buf.byteLength);
|
|
41
|
+
}
|
|
42
|
+
const binary = atob(base64);
|
|
43
|
+
const bytes = new Uint8Array(binary.length);
|
|
44
|
+
for (let i = 0; i < binary.length; i++) bytes[i] = binary.charCodeAt(i);
|
|
45
|
+
return bytes;
|
|
37
46
|
}
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
controller.error(error);
|
|
78
|
-
},
|
|
79
|
-
return() {
|
|
80
|
-
try {
|
|
81
|
-
controller.close();
|
|
82
|
-
} catch {
|
|
83
|
-
}
|
|
84
|
-
}
|
|
85
|
-
});
|
|
86
|
-
}
|
|
87
|
-
});
|
|
47
|
+
var RAW_STREAM_FACTORY_BINARY = Object.create(null);
|
|
48
|
+
var RAW_STREAM_FACTORY_TEXT = Object.create(null);
|
|
49
|
+
var RAW_STREAM_FACTORY_CONSTRUCTOR_BINARY = (stream) => new ReadableStream({ start(controller) {
|
|
50
|
+
stream.on({
|
|
51
|
+
next(base64) {
|
|
52
|
+
try {
|
|
53
|
+
controller.enqueue(base64ToUint8Array(base64));
|
|
54
|
+
} catch {}
|
|
55
|
+
},
|
|
56
|
+
throw(error) {
|
|
57
|
+
controller.error(error);
|
|
58
|
+
},
|
|
59
|
+
return() {
|
|
60
|
+
try {
|
|
61
|
+
controller.close();
|
|
62
|
+
} catch {}
|
|
63
|
+
}
|
|
64
|
+
});
|
|
65
|
+
} });
|
|
66
|
+
var textEncoderForFactory = new TextEncoder();
|
|
67
|
+
var RAW_STREAM_FACTORY_CONSTRUCTOR_TEXT = (stream) => {
|
|
68
|
+
return new ReadableStream({ start(controller) {
|
|
69
|
+
stream.on({
|
|
70
|
+
next(value) {
|
|
71
|
+
try {
|
|
72
|
+
if (typeof value === "string") controller.enqueue(textEncoderForFactory.encode(value));
|
|
73
|
+
else controller.enqueue(base64ToUint8Array(value.$b64));
|
|
74
|
+
} catch {}
|
|
75
|
+
},
|
|
76
|
+
throw(error) {
|
|
77
|
+
controller.error(error);
|
|
78
|
+
},
|
|
79
|
+
return() {
|
|
80
|
+
try {
|
|
81
|
+
controller.close();
|
|
82
|
+
} catch {}
|
|
83
|
+
}
|
|
84
|
+
});
|
|
85
|
+
} });
|
|
88
86
|
};
|
|
89
|
-
|
|
90
|
-
|
|
87
|
+
var FACTORY_BINARY = `(s=>new ReadableStream({start(c){s.on({next(b){try{const d=atob(b),a=new Uint8Array(d.length);for(let i=0;i<d.length;i++)a[i]=d.charCodeAt(i);c.enqueue(a)}catch(_){}},throw(e){c.error(e)},return(){try{c.close()}catch(_){}}})}}))`;
|
|
88
|
+
var FACTORY_TEXT = `(s=>{const e=new TextEncoder();return new ReadableStream({start(c){s.on({next(v){try{if(typeof v==='string'){c.enqueue(e.encode(v))}else{const d=atob(v.$b64),a=new Uint8Array(d.length);for(let i=0;i<d.length;i++)a[i]=d.charCodeAt(i);c.enqueue(a)}}catch(_){}},throw(x){c.error(x)},return(){try{c.close()}catch(_){}}})}})})`;
|
|
91
89
|
function toBinaryStream(readable) {
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
90
|
+
const stream = (0, seroval.createStream)();
|
|
91
|
+
const reader = readable.getReader();
|
|
92
|
+
(async () => {
|
|
93
|
+
try {
|
|
94
|
+
while (true) {
|
|
95
|
+
const { done, value } = await reader.read();
|
|
96
|
+
if (done) {
|
|
97
|
+
stream.return(void 0);
|
|
98
|
+
break;
|
|
99
|
+
}
|
|
100
|
+
stream.next(uint8ArrayToBase64(value));
|
|
101
|
+
}
|
|
102
|
+
} catch (error) {
|
|
103
|
+
stream.throw(error);
|
|
104
|
+
} finally {
|
|
105
|
+
reader.releaseLock();
|
|
106
|
+
}
|
|
107
|
+
})();
|
|
108
|
+
return stream;
|
|
111
109
|
}
|
|
112
110
|
function toTextStream(readable) {
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
} finally {
|
|
143
|
-
reader.releaseLock();
|
|
144
|
-
}
|
|
145
|
-
})();
|
|
146
|
-
return stream;
|
|
111
|
+
const stream = (0, seroval.createStream)();
|
|
112
|
+
const reader = readable.getReader();
|
|
113
|
+
const decoder = new TextDecoder("utf-8", { fatal: true });
|
|
114
|
+
(async () => {
|
|
115
|
+
try {
|
|
116
|
+
while (true) {
|
|
117
|
+
const { done, value } = await reader.read();
|
|
118
|
+
if (done) {
|
|
119
|
+
try {
|
|
120
|
+
const remaining = decoder.decode();
|
|
121
|
+
if (remaining.length > 0) stream.next(remaining);
|
|
122
|
+
} catch {}
|
|
123
|
+
stream.return(void 0);
|
|
124
|
+
break;
|
|
125
|
+
}
|
|
126
|
+
try {
|
|
127
|
+
const text = decoder.decode(value, { stream: true });
|
|
128
|
+
if (text.length > 0) stream.next(text);
|
|
129
|
+
} catch {
|
|
130
|
+
stream.next({ $b64: uint8ArrayToBase64(value) });
|
|
131
|
+
}
|
|
132
|
+
}
|
|
133
|
+
} catch (error) {
|
|
134
|
+
stream.throw(error);
|
|
135
|
+
} finally {
|
|
136
|
+
reader.releaseLock();
|
|
137
|
+
}
|
|
138
|
+
})();
|
|
139
|
+
return stream;
|
|
147
140
|
}
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
},
|
|
167
|
-
deserialize() {
|
|
168
|
-
return RAW_STREAM_FACTORY_BINARY;
|
|
169
|
-
}
|
|
141
|
+
var RawStreamFactoryBinaryPlugin = (0, seroval.createPlugin)({
|
|
142
|
+
tag: "tss/RawStreamFactory",
|
|
143
|
+
test(value) {
|
|
144
|
+
return value === RAW_STREAM_FACTORY_BINARY;
|
|
145
|
+
},
|
|
146
|
+
parse: {
|
|
147
|
+
sync() {},
|
|
148
|
+
async() {
|
|
149
|
+
return Promise.resolve(void 0);
|
|
150
|
+
},
|
|
151
|
+
stream() {}
|
|
152
|
+
},
|
|
153
|
+
serialize() {
|
|
154
|
+
return FACTORY_BINARY;
|
|
155
|
+
},
|
|
156
|
+
deserialize() {
|
|
157
|
+
return RAW_STREAM_FACTORY_BINARY;
|
|
158
|
+
}
|
|
170
159
|
});
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
},
|
|
190
|
-
deserialize() {
|
|
191
|
-
return RAW_STREAM_FACTORY_TEXT;
|
|
192
|
-
}
|
|
160
|
+
var RawStreamFactoryTextPlugin = (0, seroval.createPlugin)({
|
|
161
|
+
tag: "tss/RawStreamFactoryText",
|
|
162
|
+
test(value) {
|
|
163
|
+
return value === RAW_STREAM_FACTORY_TEXT;
|
|
164
|
+
},
|
|
165
|
+
parse: {
|
|
166
|
+
sync() {},
|
|
167
|
+
async() {
|
|
168
|
+
return Promise.resolve(void 0);
|
|
169
|
+
},
|
|
170
|
+
stream() {}
|
|
171
|
+
},
|
|
172
|
+
serialize() {
|
|
173
|
+
return FACTORY_TEXT;
|
|
174
|
+
},
|
|
175
|
+
deserialize() {
|
|
176
|
+
return RAW_STREAM_FACTORY_TEXT;
|
|
177
|
+
}
|
|
193
178
|
});
|
|
194
|
-
|
|
195
|
-
|
|
196
|
-
|
|
197
|
-
|
|
198
|
-
|
|
199
|
-
|
|
200
|
-
|
|
201
|
-
|
|
202
|
-
|
|
203
|
-
|
|
204
|
-
|
|
205
|
-
|
|
206
|
-
|
|
207
|
-
|
|
208
|
-
|
|
209
|
-
|
|
210
|
-
|
|
211
|
-
|
|
212
|
-
|
|
213
|
-
|
|
214
|
-
|
|
215
|
-
|
|
216
|
-
|
|
217
|
-
|
|
218
|
-
|
|
219
|
-
|
|
220
|
-
|
|
221
|
-
|
|
222
|
-
|
|
223
|
-
|
|
224
|
-
|
|
225
|
-
|
|
226
|
-
|
|
227
|
-
|
|
228
|
-
|
|
229
|
-
|
|
230
|
-
|
|
231
|
-
|
|
232
|
-
|
|
233
|
-
|
|
234
|
-
|
|
179
|
+
/**
|
|
180
|
+
* SSR Plugin - uses base64 or UTF-8+base64 encoding for chunks, delegates to seroval's stream mechanism.
|
|
181
|
+
* Used during SSR when serializing to JavaScript code for HTML injection.
|
|
182
|
+
*
|
|
183
|
+
* Supports two modes based on RawStream hint:
|
|
184
|
+
* - 'binary': Always base64 encode (default)
|
|
185
|
+
* - 'text': Try UTF-8 first, fallback to base64 for invalid UTF-8
|
|
186
|
+
*/
|
|
187
|
+
var RawStreamSSRPlugin = (0, seroval.createPlugin)({
|
|
188
|
+
tag: "tss/RawStream",
|
|
189
|
+
extends: [RawStreamFactoryBinaryPlugin, RawStreamFactoryTextPlugin],
|
|
190
|
+
test(value) {
|
|
191
|
+
return value instanceof RawStream;
|
|
192
|
+
},
|
|
193
|
+
parse: {
|
|
194
|
+
sync(value, ctx) {
|
|
195
|
+
const factory = value.hint === "text" ? RAW_STREAM_FACTORY_TEXT : RAW_STREAM_FACTORY_BINARY;
|
|
196
|
+
return {
|
|
197
|
+
hint: value.hint,
|
|
198
|
+
factory: ctx.parse(factory),
|
|
199
|
+
stream: ctx.parse((0, seroval.createStream)())
|
|
200
|
+
};
|
|
201
|
+
},
|
|
202
|
+
async async(value, ctx) {
|
|
203
|
+
const factory = value.hint === "text" ? RAW_STREAM_FACTORY_TEXT : RAW_STREAM_FACTORY_BINARY;
|
|
204
|
+
const encodedStream = value.hint === "text" ? toTextStream(value.stream) : toBinaryStream(value.stream);
|
|
205
|
+
return {
|
|
206
|
+
hint: value.hint,
|
|
207
|
+
factory: await ctx.parse(factory),
|
|
208
|
+
stream: await ctx.parse(encodedStream)
|
|
209
|
+
};
|
|
210
|
+
},
|
|
211
|
+
stream(value, ctx) {
|
|
212
|
+
const factory = value.hint === "text" ? RAW_STREAM_FACTORY_TEXT : RAW_STREAM_FACTORY_BINARY;
|
|
213
|
+
const encodedStream = value.hint === "text" ? toTextStream(value.stream) : toBinaryStream(value.stream);
|
|
214
|
+
return {
|
|
215
|
+
hint: value.hint,
|
|
216
|
+
factory: ctx.parse(factory),
|
|
217
|
+
stream: ctx.parse(encodedStream)
|
|
218
|
+
};
|
|
219
|
+
}
|
|
220
|
+
},
|
|
221
|
+
serialize(node, ctx) {
|
|
222
|
+
return "(" + ctx.serialize(node.factory) + ")(" + ctx.serialize(node.stream) + ")";
|
|
223
|
+
},
|
|
224
|
+
deserialize(node, ctx) {
|
|
225
|
+
const stream = ctx.deserialize(node.stream);
|
|
226
|
+
return node.hint === "text" ? RAW_STREAM_FACTORY_CONSTRUCTOR_TEXT(stream) : RAW_STREAM_FACTORY_CONSTRUCTOR_BINARY(stream);
|
|
227
|
+
}
|
|
235
228
|
});
|
|
229
|
+
/**
|
|
230
|
+
* Creates an RPC plugin instance that registers raw streams with a multiplexer.
|
|
231
|
+
* Used for server function responses where we want binary framing.
|
|
232
|
+
* Note: RPC always uses binary framing regardless of hint.
|
|
233
|
+
*
|
|
234
|
+
* @param onRawStream Callback invoked when a RawStream is encountered during serialization
|
|
235
|
+
*/
|
|
236
236
|
function createRawStreamRPCPlugin(onRawStream) {
|
|
237
|
-
|
|
238
|
-
|
|
239
|
-
|
|
240
|
-
|
|
241
|
-
|
|
242
|
-
|
|
243
|
-
|
|
244
|
-
|
|
245
|
-
|
|
246
|
-
|
|
247
|
-
|
|
248
|
-
|
|
249
|
-
|
|
250
|
-
|
|
251
|
-
|
|
252
|
-
|
|
253
|
-
|
|
254
|
-
|
|
255
|
-
|
|
256
|
-
|
|
257
|
-
|
|
258
|
-
|
|
259
|
-
|
|
260
|
-
|
|
261
|
-
|
|
262
|
-
"RawStreamRPCPlugin.deserialize should not be called. Use createRawStreamDeserializePlugin on client."
|
|
263
|
-
);
|
|
264
|
-
}
|
|
265
|
-
});
|
|
237
|
+
let nextStreamId = 1;
|
|
238
|
+
return (0, seroval.createPlugin)({
|
|
239
|
+
tag: "tss/RawStream",
|
|
240
|
+
test(value) {
|
|
241
|
+
return value instanceof RawStream;
|
|
242
|
+
},
|
|
243
|
+
parse: {
|
|
244
|
+
async(value) {
|
|
245
|
+
const streamId = nextStreamId++;
|
|
246
|
+
onRawStream(streamId, value.stream);
|
|
247
|
+
return Promise.resolve({ streamId });
|
|
248
|
+
},
|
|
249
|
+
stream(value) {
|
|
250
|
+
const streamId = nextStreamId++;
|
|
251
|
+
onRawStream(streamId, value.stream);
|
|
252
|
+
return { streamId };
|
|
253
|
+
}
|
|
254
|
+
},
|
|
255
|
+
serialize() {
|
|
256
|
+
throw new Error("RawStreamRPCPlugin.serialize should not be called. RPC uses JSON serialization, not JS code generation.");
|
|
257
|
+
},
|
|
258
|
+
deserialize() {
|
|
259
|
+
throw new Error("RawStreamRPCPlugin.deserialize should not be called. Use createRawStreamDeserializePlugin on client.");
|
|
260
|
+
}
|
|
261
|
+
});
|
|
266
262
|
}
|
|
263
|
+
/**
|
|
264
|
+
* Creates a deserialize-only plugin for client-side stream reconstruction.
|
|
265
|
+
* Used in serverFnFetcher to wire up streams from frame decoder.
|
|
266
|
+
*
|
|
267
|
+
* @param getOrCreateStream Function to get/create a stream by ID from frame decoder
|
|
268
|
+
*/
|
|
267
269
|
function createRawStreamDeserializePlugin(getOrCreateStream) {
|
|
268
|
-
|
|
269
|
-
|
|
270
|
-
|
|
271
|
-
|
|
272
|
-
|
|
273
|
-
|
|
274
|
-
|
|
275
|
-
|
|
276
|
-
|
|
277
|
-
|
|
278
|
-
|
|
279
|
-
deserialize(node) {
|
|
280
|
-
return getOrCreateStream(node.streamId);
|
|
281
|
-
}
|
|
282
|
-
});
|
|
270
|
+
return (0, seroval.createPlugin)({
|
|
271
|
+
tag: "tss/RawStream",
|
|
272
|
+
test: () => false,
|
|
273
|
+
parse: {},
|
|
274
|
+
serialize() {
|
|
275
|
+
throw new Error("RawStreamDeserializePlugin.serialize should not be called. Client only deserializes.");
|
|
276
|
+
},
|
|
277
|
+
deserialize(node) {
|
|
278
|
+
return getOrCreateStream(node.streamId);
|
|
279
|
+
}
|
|
280
|
+
});
|
|
283
281
|
}
|
|
282
|
+
//#endregion
|
|
284
283
|
exports.RawStream = RawStream;
|
|
285
284
|
exports.RawStreamSSRPlugin = RawStreamSSRPlugin;
|
|
286
285
|
exports.createRawStreamDeserializePlugin = createRawStreamDeserializePlugin;
|
|
287
286
|
exports.createRawStreamRPCPlugin = createRawStreamRPCPlugin;
|
|
288
|
-
|
|
287
|
+
|
|
288
|
+
//# sourceMappingURL=RawStream.cjs.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"RawStream.cjs","sources":["../../../../src/ssr/serializer/RawStream.ts"],"sourcesContent":["import { createPlugin, createStream } from 'seroval'\nimport type { Plugin } from 'seroval'\n\n/**\n * Hint for RawStream encoding strategy during SSR serialization.\n * - 'binary': Always use base64 encoding (best for binary data like files, images)\n * - 'text': Try UTF-8 first, fallback to base64 (best for text-heavy data like RSC payloads)\n */\nexport type RawStreamHint = 'binary' | 'text'\n\n/**\n * Options for RawStream configuration.\n */\nexport interface RawStreamOptions {\n /**\n * Encoding hint for SSR serialization.\n * - 'binary' (default): Always use base64 encoding\n * - 'text': Try UTF-8 first, fallback to base64 for invalid UTF-8 chunks\n */\n hint?: RawStreamHint\n}\n\n/**\n * Marker class for ReadableStream<Uint8Array> that should be serialized\n * with base64 encoding (SSR) or binary framing (server functions).\n *\n * Wrap your binary streams with this to get efficient serialization:\n * ```ts\n * // For binary data (files, images, etc.)\n * return { data: new RawStream(file.stream()) }\n *\n * // For text-heavy data (RSC payloads, etc.)\n * return { data: new RawStream(rscStream, { hint: 'text' }) }\n * ```\n */\nexport class RawStream {\n public readonly hint: RawStreamHint\n\n constructor(\n public readonly stream: ReadableStream<Uint8Array>,\n options?: RawStreamOptions,\n ) {\n this.hint = options?.hint ?? 'binary'\n }\n}\n\n/**\n * Callback type for RPC plugin to register raw streams with multiplexer\n */\nexport type OnRawStreamCallback = (\n streamId: number,\n stream: ReadableStream<Uint8Array>,\n) => void\n\n// Base64 helpers used in both Node and browser.\n// In Node-like runtimes, prefer Buffer for speed and compatibility.\nconst BufferCtor: any = (globalThis as any).Buffer\nconst hasNodeBuffer = !!BufferCtor && typeof BufferCtor.from === 'function'\n\nfunction uint8ArrayToBase64(bytes: Uint8Array): string {\n if (bytes.length === 0) return ''\n\n if (hasNodeBuffer) {\n return BufferCtor.from(bytes).toString('base64')\n }\n\n // Browser fallback: chunked String.fromCharCode + btoa\n const CHUNK_SIZE = 0x8000 // 32KB chunks to avoid stack overflow\n const chunks: Array<string> = []\n for (let i = 0; i < bytes.length; i += CHUNK_SIZE) {\n const chunk = bytes.subarray(i, i + CHUNK_SIZE)\n chunks.push(String.fromCharCode.apply(null, chunk as any))\n }\n return btoa(chunks.join(''))\n}\n\nfunction base64ToUint8Array(base64: string): Uint8Array {\n if (base64.length === 0) return new Uint8Array(0)\n\n if (hasNodeBuffer) {\n const buf = BufferCtor.from(base64, 'base64')\n return new Uint8Array(buf.buffer, buf.byteOffset, buf.byteLength)\n }\n\n const binary = atob(base64)\n const bytes = new Uint8Array(binary.length)\n for (let i = 0; i < binary.length; i++) {\n bytes[i] = binary.charCodeAt(i)\n }\n return bytes\n}\n\n// Factory sentinels - use null-proto objects to avoid prototype surprises\nconst RAW_STREAM_FACTORY_BINARY: Record<string, never> = Object.create(null)\nconst RAW_STREAM_FACTORY_TEXT: Record<string, never> = Object.create(null)\n\n// Factory constructor for binary mode - converts seroval stream to ReadableStream<Uint8Array>\n// All chunks are base64 encoded strings\nconst RAW_STREAM_FACTORY_CONSTRUCTOR_BINARY = (\n stream: ReturnType<typeof createStream>,\n) =>\n new ReadableStream<Uint8Array>({\n start(controller) {\n stream.on({\n next(base64: string) {\n try {\n controller.enqueue(base64ToUint8Array(base64))\n } catch {\n // Stream may be closed\n }\n },\n throw(error: unknown) {\n controller.error(error)\n },\n return() {\n try {\n controller.close()\n } catch {\n // Stream may already be closed\n }\n },\n })\n },\n })\n\n// Factory constructor for text mode - converts seroval stream to ReadableStream<Uint8Array>\n// Chunks are either strings (UTF-8) or { $b64: string } (base64 fallback)\n// Use module-level TextEncoder to avoid per-factory allocation\nconst textEncoderForFactory = new TextEncoder()\nconst RAW_STREAM_FACTORY_CONSTRUCTOR_TEXT = (\n stream: ReturnType<typeof createStream>,\n) => {\n return new ReadableStream<Uint8Array>({\n start(controller) {\n stream.on({\n next(value: string | { $b64: string }) {\n try {\n if (typeof value === 'string') {\n controller.enqueue(textEncoderForFactory.encode(value))\n } else {\n controller.enqueue(base64ToUint8Array(value.$b64))\n }\n } catch {\n // Stream may be closed\n }\n },\n throw(error: unknown) {\n controller.error(error)\n },\n return() {\n try {\n controller.close()\n } catch {\n // Stream may already be closed\n }\n },\n })\n },\n })\n}\n\n// Minified factory function for binary mode - all chunks are base64 strings\n// This must be self-contained since it's injected into the HTML\nconst FACTORY_BINARY = `(s=>new ReadableStream({start(c){s.on({next(b){try{const d=atob(b),a=new Uint8Array(d.length);for(let i=0;i<d.length;i++)a[i]=d.charCodeAt(i);c.enqueue(a)}catch(_){}},throw(e){c.error(e)},return(){try{c.close()}catch(_){}}})}}))`\n\n// Minified factory function for text mode - chunks are string or {$b64: string}\n// Uses cached TextEncoder for performance\nconst FACTORY_TEXT = `(s=>{const e=new TextEncoder();return new ReadableStream({start(c){s.on({next(v){try{if(typeof v==='string'){c.enqueue(e.encode(v))}else{const d=atob(v.$b64),a=new Uint8Array(d.length);for(let i=0;i<d.length;i++)a[i]=d.charCodeAt(i);c.enqueue(a)}}catch(_){}},throw(x){c.error(x)},return(){try{c.close()}catch(_){}}})}})})`\n\n// Convert ReadableStream<Uint8Array> to seroval stream with base64-encoded chunks (binary mode)\nfunction toBinaryStream(readable: ReadableStream<Uint8Array>) {\n const stream = createStream()\n const reader = readable.getReader()\n\n // Use iterative loop instead of recursive async to avoid stack accumulation\n ;(async () => {\n try {\n while (true) {\n const { done, value } = await reader.read()\n if (done) {\n stream.return(undefined)\n break\n }\n stream.next(uint8ArrayToBase64(value))\n }\n } catch (error) {\n stream.throw(error)\n } finally {\n reader.releaseLock()\n }\n })()\n\n return stream\n}\n\n// Convert ReadableStream<Uint8Array> to seroval stream with UTF-8 first, base64 fallback (text mode)\nfunction toTextStream(readable: ReadableStream<Uint8Array>) {\n const stream = createStream()\n const reader = readable.getReader()\n const decoder = new TextDecoder('utf-8', { fatal: true })\n\n // Use iterative loop instead of recursive async to avoid stack accumulation\n ;(async () => {\n try {\n while (true) {\n const { done, value } = await reader.read()\n if (done) {\n // Flush any remaining bytes in the decoder\n try {\n const remaining = decoder.decode()\n if (remaining.length > 0) {\n stream.next(remaining)\n }\n } catch {\n // Ignore decode errors on flush\n }\n stream.return(undefined)\n break\n }\n\n try {\n // Try UTF-8 decode first\n const text = decoder.decode(value, { stream: true })\n if (text.length > 0) {\n stream.next(text)\n }\n } catch {\n // UTF-8 decode failed, fallback to base64\n stream.next({ $b64: uint8ArrayToBase64(value) })\n }\n }\n } catch (error) {\n stream.throw(error)\n } finally {\n reader.releaseLock()\n }\n })()\n\n return stream\n}\n\n// Factory plugin for binary mode\nconst RawStreamFactoryBinaryPlugin = createPlugin<\n Record<string, never>,\n undefined\n>({\n tag: 'tss/RawStreamFactory',\n test(value) {\n return value === RAW_STREAM_FACTORY_BINARY\n },\n parse: {\n sync() {\n return undefined\n },\n async() {\n return Promise.resolve(undefined)\n },\n stream() {\n return undefined\n },\n },\n serialize() {\n return FACTORY_BINARY\n },\n deserialize() {\n return RAW_STREAM_FACTORY_BINARY\n },\n})\n\n// Factory plugin for text mode\nconst RawStreamFactoryTextPlugin = createPlugin<\n Record<string, never>,\n undefined\n>({\n tag: 'tss/RawStreamFactoryText',\n test(value) {\n return value === RAW_STREAM_FACTORY_TEXT\n },\n parse: {\n sync() {\n return undefined\n },\n async() {\n return Promise.resolve(undefined)\n },\n stream() {\n return undefined\n },\n },\n serialize() {\n return FACTORY_TEXT\n },\n deserialize() {\n return RAW_STREAM_FACTORY_TEXT\n },\n})\n\n/**\n * SSR Plugin - uses base64 or UTF-8+base64 encoding for chunks, delegates to seroval's stream mechanism.\n * Used during SSR when serializing to JavaScript code for HTML injection.\n *\n * Supports two modes based on RawStream hint:\n * - 'binary': Always base64 encode (default)\n * - 'text': Try UTF-8 first, fallback to base64 for invalid UTF-8\n */\nexport const RawStreamSSRPlugin: Plugin<any, any> = createPlugin({\n tag: 'tss/RawStream',\n extends: [RawStreamFactoryBinaryPlugin, RawStreamFactoryTextPlugin],\n\n test(value: unknown) {\n return value instanceof RawStream\n },\n\n parse: {\n sync(value: RawStream, ctx) {\n // Sync parse not really supported for streams, return empty stream\n const factory =\n value.hint === 'text'\n ? RAW_STREAM_FACTORY_TEXT\n : RAW_STREAM_FACTORY_BINARY\n return {\n hint: value.hint,\n factory: ctx.parse(factory),\n stream: ctx.parse(createStream()),\n }\n },\n async async(value: RawStream, ctx) {\n const factory =\n value.hint === 'text'\n ? RAW_STREAM_FACTORY_TEXT\n : RAW_STREAM_FACTORY_BINARY\n const encodedStream =\n value.hint === 'text'\n ? toTextStream(value.stream)\n : toBinaryStream(value.stream)\n return {\n hint: value.hint,\n factory: await ctx.parse(factory),\n stream: await ctx.parse(encodedStream),\n }\n },\n stream(value: RawStream, ctx) {\n const factory =\n value.hint === 'text'\n ? RAW_STREAM_FACTORY_TEXT\n : RAW_STREAM_FACTORY_BINARY\n const encodedStream =\n value.hint === 'text'\n ? toTextStream(value.stream)\n : toBinaryStream(value.stream)\n return {\n hint: value.hint,\n factory: ctx.parse(factory),\n stream: ctx.parse(encodedStream),\n }\n },\n },\n\n serialize(node: { hint: RawStreamHint; factory: any; stream: any }, ctx) {\n return (\n '(' +\n ctx.serialize(node.factory) +\n ')(' +\n ctx.serialize(node.stream) +\n ')'\n )\n },\n\n deserialize(\n node: { hint: RawStreamHint; factory: any; stream: any },\n ctx,\n ): any {\n const stream: ReturnType<typeof createStream> = ctx.deserialize(node.stream)\n return node.hint === 'text'\n ? RAW_STREAM_FACTORY_CONSTRUCTOR_TEXT(stream)\n : RAW_STREAM_FACTORY_CONSTRUCTOR_BINARY(stream)\n },\n}) as Plugin<any, any>\n\n/**\n * Node type for RPC plugin serialization\n */\ninterface RawStreamRPCNode {\n streamId: number\n}\n\n/**\n * Creates an RPC plugin instance that registers raw streams with a multiplexer.\n * Used for server function responses where we want binary framing.\n * Note: RPC always uses binary framing regardless of hint.\n *\n * @param onRawStream Callback invoked when a RawStream is encountered during serialization\n */\nexport function createRawStreamRPCPlugin(\n onRawStream: OnRawStreamCallback,\n): Plugin<any, any> {\n // Own stream counter - sequential IDs starting at 1, independent of seroval internals\n let nextStreamId = 1\n\n return createPlugin({\n tag: 'tss/RawStream',\n\n test(value: unknown) {\n return value instanceof RawStream\n },\n\n parse: {\n async(value: RawStream) {\n const streamId = nextStreamId++\n onRawStream(streamId, value.stream)\n return Promise.resolve({ streamId })\n },\n stream(value: RawStream) {\n const streamId = nextStreamId++\n onRawStream(streamId, value.stream)\n return { streamId }\n },\n },\n\n serialize(): never {\n // RPC uses toCrossJSONStream which produces JSON nodes, not JS code.\n // This method is only called by crossSerialize* which we don't use.\n throw new Error(\n 'RawStreamRPCPlugin.serialize should not be called. RPC uses JSON serialization, not JS code generation.',\n )\n },\n\n deserialize(): never {\n // Client uses createRawStreamDeserializePlugin instead\n throw new Error(\n 'RawStreamRPCPlugin.deserialize should not be called. Use createRawStreamDeserializePlugin on client.',\n )\n },\n }) as Plugin<any, any>\n}\n\n/**\n * Creates a deserialize-only plugin for client-side stream reconstruction.\n * Used in serverFnFetcher to wire up streams from frame decoder.\n *\n * @param getOrCreateStream Function to get/create a stream by ID from frame decoder\n */\nexport function createRawStreamDeserializePlugin(\n getOrCreateStream: (id: number) => ReadableStream<Uint8Array>,\n): Plugin<any, any> {\n return createPlugin({\n tag: 'tss/RawStream',\n\n test: () => false, // Client never serializes RawStream\n\n parse: {}, // Client only deserializes, never parses\n\n serialize(): never {\n // Client never serializes RawStream back to server\n throw new Error(\n 'RawStreamDeserializePlugin.serialize should not be called. Client only deserializes.',\n )\n },\n\n deserialize(node: RawStreamRPCNode) {\n return getOrCreateStream(node.streamId)\n },\n }) as Plugin<any, any>\n}\n"],"names":["createStream","createPlugin"],"mappings":";;;AAmCO,MAAM,UAAU;AAAA,EAGrB,YACkB,QAChB,SACA;AAFgB,SAAA,SAAA;AAGhB,SAAK,OAAO,SAAS,QAAQ;AAAA,EAC/B;AACF;AAYA,MAAM,aAAmB,WAAmB;AAC5C,MAAM,gBAAgB,CAAC,CAAC,cAAc,OAAO,WAAW,SAAS;AAEjE,SAAS,mBAAmB,OAA2B;AACrD,MAAI,MAAM,WAAW,EAAG,QAAO;AAE/B,MAAI,eAAe;AACjB,WAAO,WAAW,KAAK,KAAK,EAAE,SAAS,QAAQ;AAAA,EACjD;AAGA,QAAM,aAAa;AACnB,QAAM,SAAwB,CAAA;AAC9B,WAAS,IAAI,GAAG,IAAI,MAAM,QAAQ,KAAK,YAAY;AACjD,UAAM,QAAQ,MAAM,SAAS,GAAG,IAAI,UAAU;AAC9C,WAAO,KAAK,OAAO,aAAa,MAAM,MAAM,KAAY,CAAC;AAAA,EAC3D;AACA,SAAO,KAAK,OAAO,KAAK,EAAE,CAAC;AAC7B;AAEA,SAAS,mBAAmB,QAA4B;AACtD,MAAI,OAAO,WAAW,EAAG,QAAO,IAAI,WAAW,CAAC;AAEhD,MAAI,eAAe;AACjB,UAAM,MAAM,WAAW,KAAK,QAAQ,QAAQ;AAC5C,WAAO,IAAI,WAAW,IAAI,QAAQ,IAAI,YAAY,IAAI,UAAU;AAAA,EAClE;AAEA,QAAM,SAAS,KAAK,MAAM;AAC1B,QAAM,QAAQ,IAAI,WAAW,OAAO,MAAM;AAC1C,WAAS,IAAI,GAAG,IAAI,OAAO,QAAQ,KAAK;AACtC,UAAM,CAAC,IAAI,OAAO,WAAW,CAAC;AAAA,EAChC;AACA,SAAO;AACT;AAGA,MAAM,4BAAmD,uBAAO,OAAO,IAAI;AAC3E,MAAM,0BAAiD,uBAAO,OAAO,IAAI;AAIzE,MAAM,wCAAwC,CAC5C,WAEA,IAAI,eAA2B;AAAA,EAC7B,MAAM,YAAY;AAChB,WAAO,GAAG;AAAA,MACR,KAAK,QAAgB;AACnB,YAAI;AACF,qBAAW,QAAQ,mBAAmB,MAAM,CAAC;AAAA,QAC/C,QAAQ;AAAA,QAER;AAAA,MACF;AAAA,MACA,MAAM,OAAgB;AACpB,mBAAW,MAAM,KAAK;AAAA,MACxB;AAAA,MACA,SAAS;AACP,YAAI;AACF,qBAAW,MAAA;AAAA,QACb,QAAQ;AAAA,QAER;AAAA,MACF;AAAA,IAAA,CACD;AAAA,EACH;AACF,CAAC;AAKH,MAAM,wBAAwB,IAAI,YAAA;AAClC,MAAM,sCAAsC,CAC1C,WACG;AACH,SAAO,IAAI,eAA2B;AAAA,IACpC,MAAM,YAAY;AAChB,aAAO,GAAG;AAAA,QACR,KAAK,OAAkC;AACrC,cAAI;AACF,gBAAI,OAAO,UAAU,UAAU;AAC7B,yBAAW,QAAQ,sBAAsB,OAAO,KAAK,CAAC;AAAA,YACxD,OAAO;AACL,yBAAW,QAAQ,mBAAmB,MAAM,IAAI,CAAC;AAAA,YACnD;AAAA,UACF,QAAQ;AAAA,UAER;AAAA,QACF;AAAA,QACA,MAAM,OAAgB;AACpB,qBAAW,MAAM,KAAK;AAAA,QACxB;AAAA,QACA,SAAS;AACP,cAAI;AACF,uBAAW,MAAA;AAAA,UACb,QAAQ;AAAA,UAER;AAAA,QACF;AAAA,MAAA,CACD;AAAA,IACH;AAAA,EAAA,CACD;AACH;AAIA,MAAM,iBAAiB;AAIvB,MAAM,eAAe;AAGrB,SAAS,eAAe,UAAsC;AAC5D,QAAM,SAASA,QAAAA,aAAA;AACf,QAAM,SAAS,SAAS,UAAA;AAGvB,GAAC,YAAY;AACZ,QAAI;AACF,aAAO,MAAM;AACX,cAAM,EAAE,MAAM,MAAA,IAAU,MAAM,OAAO,KAAA;AACrC,YAAI,MAAM;AACR,iBAAO,OAAO,MAAS;AACvB;AAAA,QACF;AACA,eAAO,KAAK,mBAAmB,KAAK,CAAC;AAAA,MACvC;AAAA,IACF,SAAS,OAAO;AACd,aAAO,MAAM,KAAK;AAAA,IACpB,UAAA;AACE,aAAO,YAAA;AAAA,IACT;AAAA,EACF,GAAA;AAEA,SAAO;AACT;AAGA,SAAS,aAAa,UAAsC;AAC1D,QAAM,SAASA,QAAAA,aAAA;AACf,QAAM,SAAS,SAAS,UAAA;AACxB,QAAM,UAAU,IAAI,YAAY,SAAS,EAAE,OAAO,MAAM;AAGvD,GAAC,YAAY;AACZ,QAAI;AACF,aAAO,MAAM;AACX,cAAM,EAAE,MAAM,MAAA,IAAU,MAAM,OAAO,KAAA;AACrC,YAAI,MAAM;AAER,cAAI;AACF,kBAAM,YAAY,QAAQ,OAAA;AAC1B,gBAAI,UAAU,SAAS,GAAG;AACxB,qBAAO,KAAK,SAAS;AAAA,YACvB;AAAA,UACF,QAAQ;AAAA,UAER;AACA,iBAAO,OAAO,MAAS;AACvB;AAAA,QACF;AAEA,YAAI;AAEF,gBAAM,OAAO,QAAQ,OAAO,OAAO,EAAE,QAAQ,MAAM;AACnD,cAAI,KAAK,SAAS,GAAG;AACnB,mBAAO,KAAK,IAAI;AAAA,UAClB;AAAA,QACF,QAAQ;AAEN,iBAAO,KAAK,EAAE,MAAM,mBAAmB,KAAK,GAAG;AAAA,QACjD;AAAA,MACF;AAAA,IACF,SAAS,OAAO;AACd,aAAO,MAAM,KAAK;AAAA,IACpB,UAAA;AACE,aAAO,YAAA;AAAA,IACT;AAAA,EACF,GAAA;AAEA,SAAO;AACT;AAGA,MAAM,+BAA+BC,QAAAA,aAGnC;AAAA,EACA,KAAK;AAAA,EACL,KAAK,OAAO;AACV,WAAO,UAAU;AAAA,EACnB;AAAA,EACA,OAAO;AAAA,IACL,OAAO;AACL,aAAO;AAAA,IACT;AAAA,IACA,QAAQ;AACN,aAAO,QAAQ,QAAQ,MAAS;AAAA,IAClC;AAAA,IACA,SAAS;AACP,aAAO;AAAA,IACT;AAAA,EAAA;AAAA,EAEF,YAAY;AACV,WAAO;AAAA,EACT;AAAA,EACA,cAAc;AACZ,WAAO;AAAA,EACT;AACF,CAAC;AAGD,MAAM,6BAA6BA,QAAAA,aAGjC;AAAA,EACA,KAAK;AAAA,EACL,KAAK,OAAO;AACV,WAAO,UAAU;AAAA,EACnB;AAAA,EACA,OAAO;AAAA,IACL,OAAO;AACL,aAAO;AAAA,IACT;AAAA,IACA,QAAQ;AACN,aAAO,QAAQ,QAAQ,MAAS;AAAA,IAClC;AAAA,IACA,SAAS;AACP,aAAO;AAAA,IACT;AAAA,EAAA;AAAA,EAEF,YAAY;AACV,WAAO;AAAA,EACT;AAAA,EACA,cAAc;AACZ,WAAO;AAAA,EACT;AACF,CAAC;AAUM,MAAM,qBAAuCA,QAAAA,aAAa;AAAA,EAC/D,KAAK;AAAA,EACL,SAAS,CAAC,8BAA8B,0BAA0B;AAAA,EAElE,KAAK,OAAgB;AACnB,WAAO,iBAAiB;AAAA,EAC1B;AAAA,EAEA,OAAO;AAAA,IACL,KAAK,OAAkB,KAAK;AAE1B,YAAM,UACJ,MAAM,SAAS,SACX,0BACA;AACN,aAAO;AAAA,QACL,MAAM,MAAM;AAAA,QACZ,SAAS,IAAI,MAAM,OAAO;AAAA,QAC1B,QAAQ,IAAI,MAAMD,qBAAA,CAAc;AAAA,MAAA;AAAA,IAEpC;AAAA,IACA,MAAM,MAAM,OAAkB,KAAK;AACjC,YAAM,UACJ,MAAM,SAAS,SACX,0BACA;AACN,YAAM,gBACJ,MAAM,SAAS,SACX,aAAa,MAAM,MAAM,IACzB,eAAe,MAAM,MAAM;AACjC,aAAO;AAAA,QACL,MAAM,MAAM;AAAA,QACZ,SAAS,MAAM,IAAI,MAAM,OAAO;AAAA,QAChC,QAAQ,MAAM,IAAI,MAAM,aAAa;AAAA,MAAA;AAAA,IAEzC;AAAA,IACA,OAAO,OAAkB,KAAK;AAC5B,YAAM,UACJ,MAAM,SAAS,SACX,0BACA;AACN,YAAM,gBACJ,MAAM,SAAS,SACX,aAAa,MAAM,MAAM,IACzB,eAAe,MAAM,MAAM;AACjC,aAAO;AAAA,QACL,MAAM,MAAM;AAAA,QACZ,SAAS,IAAI,MAAM,OAAO;AAAA,QAC1B,QAAQ,IAAI,MAAM,aAAa;AAAA,MAAA;AAAA,IAEnC;AAAA,EAAA;AAAA,EAGF,UAAU,MAA0D,KAAK;AACvE,WACE,MACA,IAAI,UAAU,KAAK,OAAO,IAC1B,OACA,IAAI,UAAU,KAAK,MAAM,IACzB;AAAA,EAEJ;AAAA,EAEA,YACE,MACA,KACK;AACL,UAAM,SAA0C,IAAI,YAAY,KAAK,MAAM;AAC3E,WAAO,KAAK,SAAS,SACjB,oCAAoC,MAAM,IAC1C,sCAAsC,MAAM;AAAA,EAClD;AACF,CAAC;AAgBM,SAAS,yBACd,aACkB;AAElB,MAAI,eAAe;AAEnB,SAAOC,qBAAa;AAAA,IAClB,KAAK;AAAA,IAEL,KAAK,OAAgB;AACnB,aAAO,iBAAiB;AAAA,IAC1B;AAAA,IAEA,OAAO;AAAA,MACL,MAAM,OAAkB;AACtB,cAAM,WAAW;AACjB,oBAAY,UAAU,MAAM,MAAM;AAClC,eAAO,QAAQ,QAAQ,EAAE,UAAU;AAAA,MACrC;AAAA,MACA,OAAO,OAAkB;AACvB,cAAM,WAAW;AACjB,oBAAY,UAAU,MAAM,MAAM;AAClC,eAAO,EAAE,SAAA;AAAA,MACX;AAAA,IAAA;AAAA,IAGF,YAAmB;AAGjB,YAAM,IAAI;AAAA,QACR;AAAA,MAAA;AAAA,IAEJ;AAAA,IAEA,cAAqB;AAEnB,YAAM,IAAI;AAAA,QACR;AAAA,MAAA;AAAA,IAEJ;AAAA,EAAA,CACD;AACH;AAQO,SAAS,iCACd,mBACkB;AAClB,SAAOA,qBAAa;AAAA,IAClB,KAAK;AAAA,IAEL,MAAM,MAAM;AAAA;AAAA,IAEZ,OAAO,CAAA;AAAA;AAAA,IAEP,YAAmB;AAEjB,YAAM,IAAI;AAAA,QACR;AAAA,MAAA;AAAA,IAEJ;AAAA,IAEA,YAAY,MAAwB;AAClC,aAAO,kBAAkB,KAAK,QAAQ;AAAA,IACxC;AAAA,EAAA,CACD;AACH;;;;;"}
|
|
1
|
+
{"version":3,"file":"RawStream.cjs","names":[],"sources":["../../../../src/ssr/serializer/RawStream.ts"],"sourcesContent":["import { createPlugin, createStream } from 'seroval'\nimport type { Plugin } from 'seroval'\n\n/**\n * Hint for RawStream encoding strategy during SSR serialization.\n * - 'binary': Always use base64 encoding (best for binary data like files, images)\n * - 'text': Try UTF-8 first, fallback to base64 (best for text-heavy data like RSC payloads)\n */\nexport type RawStreamHint = 'binary' | 'text'\n\n/**\n * Options for RawStream configuration.\n */\nexport interface RawStreamOptions {\n /**\n * Encoding hint for SSR serialization.\n * - 'binary' (default): Always use base64 encoding\n * - 'text': Try UTF-8 first, fallback to base64 for invalid UTF-8 chunks\n */\n hint?: RawStreamHint\n}\n\n/**\n * Marker class for ReadableStream<Uint8Array> that should be serialized\n * with base64 encoding (SSR) or binary framing (server functions).\n *\n * Wrap your binary streams with this to get efficient serialization:\n * ```ts\n * // For binary data (files, images, etc.)\n * return { data: new RawStream(file.stream()) }\n *\n * // For text-heavy data (RSC payloads, etc.)\n * return { data: new RawStream(rscStream, { hint: 'text' }) }\n * ```\n */\nexport class RawStream {\n public readonly hint: RawStreamHint\n\n constructor(\n public readonly stream: ReadableStream<Uint8Array>,\n options?: RawStreamOptions,\n ) {\n this.hint = options?.hint ?? 'binary'\n }\n}\n\n/**\n * Callback type for RPC plugin to register raw streams with multiplexer\n */\nexport type OnRawStreamCallback = (\n streamId: number,\n stream: ReadableStream<Uint8Array>,\n) => void\n\n// Base64 helpers used in both Node and browser.\n// In Node-like runtimes, prefer Buffer for speed and compatibility.\nconst BufferCtor: any = (globalThis as any).Buffer\nconst hasNodeBuffer = !!BufferCtor && typeof BufferCtor.from === 'function'\n\nfunction uint8ArrayToBase64(bytes: Uint8Array): string {\n if (bytes.length === 0) return ''\n\n if (hasNodeBuffer) {\n return BufferCtor.from(bytes).toString('base64')\n }\n\n // Browser fallback: chunked String.fromCharCode + btoa\n const CHUNK_SIZE = 0x8000 // 32KB chunks to avoid stack overflow\n const chunks: Array<string> = []\n for (let i = 0; i < bytes.length; i += CHUNK_SIZE) {\n const chunk = bytes.subarray(i, i + CHUNK_SIZE)\n chunks.push(String.fromCharCode.apply(null, chunk as any))\n }\n return btoa(chunks.join(''))\n}\n\nfunction base64ToUint8Array(base64: string): Uint8Array {\n if (base64.length === 0) return new Uint8Array(0)\n\n if (hasNodeBuffer) {\n const buf = BufferCtor.from(base64, 'base64')\n return new Uint8Array(buf.buffer, buf.byteOffset, buf.byteLength)\n }\n\n const binary = atob(base64)\n const bytes = new Uint8Array(binary.length)\n for (let i = 0; i < binary.length; i++) {\n bytes[i] = binary.charCodeAt(i)\n }\n return bytes\n}\n\n// Factory sentinels - use null-proto objects to avoid prototype surprises\nconst RAW_STREAM_FACTORY_BINARY: Record<string, never> = Object.create(null)\nconst RAW_STREAM_FACTORY_TEXT: Record<string, never> = Object.create(null)\n\n// Factory constructor for binary mode - converts seroval stream to ReadableStream<Uint8Array>\n// All chunks are base64 encoded strings\nconst RAW_STREAM_FACTORY_CONSTRUCTOR_BINARY = (\n stream: ReturnType<typeof createStream>,\n) =>\n new ReadableStream<Uint8Array>({\n start(controller) {\n stream.on({\n next(base64: string) {\n try {\n controller.enqueue(base64ToUint8Array(base64))\n } catch {\n // Stream may be closed\n }\n },\n throw(error: unknown) {\n controller.error(error)\n },\n return() {\n try {\n controller.close()\n } catch {\n // Stream may already be closed\n }\n },\n })\n },\n })\n\n// Factory constructor for text mode - converts seroval stream to ReadableStream<Uint8Array>\n// Chunks are either strings (UTF-8) or { $b64: string } (base64 fallback)\n// Use module-level TextEncoder to avoid per-factory allocation\nconst textEncoderForFactory = new TextEncoder()\nconst RAW_STREAM_FACTORY_CONSTRUCTOR_TEXT = (\n stream: ReturnType<typeof createStream>,\n) => {\n return new ReadableStream<Uint8Array>({\n start(controller) {\n stream.on({\n next(value: string | { $b64: string }) {\n try {\n if (typeof value === 'string') {\n controller.enqueue(textEncoderForFactory.encode(value))\n } else {\n controller.enqueue(base64ToUint8Array(value.$b64))\n }\n } catch {\n // Stream may be closed\n }\n },\n throw(error: unknown) {\n controller.error(error)\n },\n return() {\n try {\n controller.close()\n } catch {\n // Stream may already be closed\n }\n },\n })\n },\n })\n}\n\n// Minified factory function for binary mode - all chunks are base64 strings\n// This must be self-contained since it's injected into the HTML\nconst FACTORY_BINARY = `(s=>new ReadableStream({start(c){s.on({next(b){try{const d=atob(b),a=new Uint8Array(d.length);for(let i=0;i<d.length;i++)a[i]=d.charCodeAt(i);c.enqueue(a)}catch(_){}},throw(e){c.error(e)},return(){try{c.close()}catch(_){}}})}}))`\n\n// Minified factory function for text mode - chunks are string or {$b64: string}\n// Uses cached TextEncoder for performance\nconst FACTORY_TEXT = `(s=>{const e=new TextEncoder();return new ReadableStream({start(c){s.on({next(v){try{if(typeof v==='string'){c.enqueue(e.encode(v))}else{const d=atob(v.$b64),a=new Uint8Array(d.length);for(let i=0;i<d.length;i++)a[i]=d.charCodeAt(i);c.enqueue(a)}}catch(_){}},throw(x){c.error(x)},return(){try{c.close()}catch(_){}}})}})})`\n\n// Convert ReadableStream<Uint8Array> to seroval stream with base64-encoded chunks (binary mode)\nfunction toBinaryStream(readable: ReadableStream<Uint8Array>) {\n const stream = createStream()\n const reader = readable.getReader()\n\n // Use iterative loop instead of recursive async to avoid stack accumulation\n ;(async () => {\n try {\n while (true) {\n const { done, value } = await reader.read()\n if (done) {\n stream.return(undefined)\n break\n }\n stream.next(uint8ArrayToBase64(value))\n }\n } catch (error) {\n stream.throw(error)\n } finally {\n reader.releaseLock()\n }\n })()\n\n return stream\n}\n\n// Convert ReadableStream<Uint8Array> to seroval stream with UTF-8 first, base64 fallback (text mode)\nfunction toTextStream(readable: ReadableStream<Uint8Array>) {\n const stream = createStream()\n const reader = readable.getReader()\n const decoder = new TextDecoder('utf-8', { fatal: true })\n\n // Use iterative loop instead of recursive async to avoid stack accumulation\n ;(async () => {\n try {\n while (true) {\n const { done, value } = await reader.read()\n if (done) {\n // Flush any remaining bytes in the decoder\n try {\n const remaining = decoder.decode()\n if (remaining.length > 0) {\n stream.next(remaining)\n }\n } catch {\n // Ignore decode errors on flush\n }\n stream.return(undefined)\n break\n }\n\n try {\n // Try UTF-8 decode first\n const text = decoder.decode(value, { stream: true })\n if (text.length > 0) {\n stream.next(text)\n }\n } catch {\n // UTF-8 decode failed, fallback to base64\n stream.next({ $b64: uint8ArrayToBase64(value) })\n }\n }\n } catch (error) {\n stream.throw(error)\n } finally {\n reader.releaseLock()\n }\n })()\n\n return stream\n}\n\n// Factory plugin for binary mode\nconst RawStreamFactoryBinaryPlugin = createPlugin<\n Record<string, never>,\n undefined\n>({\n tag: 'tss/RawStreamFactory',\n test(value) {\n return value === RAW_STREAM_FACTORY_BINARY\n },\n parse: {\n sync() {\n return undefined\n },\n async() {\n return Promise.resolve(undefined)\n },\n stream() {\n return undefined\n },\n },\n serialize() {\n return FACTORY_BINARY\n },\n deserialize() {\n return RAW_STREAM_FACTORY_BINARY\n },\n})\n\n// Factory plugin for text mode\nconst RawStreamFactoryTextPlugin = createPlugin<\n Record<string, never>,\n undefined\n>({\n tag: 'tss/RawStreamFactoryText',\n test(value) {\n return value === RAW_STREAM_FACTORY_TEXT\n },\n parse: {\n sync() {\n return undefined\n },\n async() {\n return Promise.resolve(undefined)\n },\n stream() {\n return undefined\n },\n },\n serialize() {\n return FACTORY_TEXT\n },\n deserialize() {\n return RAW_STREAM_FACTORY_TEXT\n },\n})\n\n/**\n * SSR Plugin - uses base64 or UTF-8+base64 encoding for chunks, delegates to seroval's stream mechanism.\n * Used during SSR when serializing to JavaScript code for HTML injection.\n *\n * Supports two modes based on RawStream hint:\n * - 'binary': Always base64 encode (default)\n * - 'text': Try UTF-8 first, fallback to base64 for invalid UTF-8\n */\nexport const RawStreamSSRPlugin: Plugin<any, any> = createPlugin({\n tag: 'tss/RawStream',\n extends: [RawStreamFactoryBinaryPlugin, RawStreamFactoryTextPlugin],\n\n test(value: unknown) {\n return value instanceof RawStream\n },\n\n parse: {\n sync(value: RawStream, ctx) {\n // Sync parse not really supported for streams, return empty stream\n const factory =\n value.hint === 'text'\n ? RAW_STREAM_FACTORY_TEXT\n : RAW_STREAM_FACTORY_BINARY\n return {\n hint: value.hint,\n factory: ctx.parse(factory),\n stream: ctx.parse(createStream()),\n }\n },\n async async(value: RawStream, ctx) {\n const factory =\n value.hint === 'text'\n ? RAW_STREAM_FACTORY_TEXT\n : RAW_STREAM_FACTORY_BINARY\n const encodedStream =\n value.hint === 'text'\n ? toTextStream(value.stream)\n : toBinaryStream(value.stream)\n return {\n hint: value.hint,\n factory: await ctx.parse(factory),\n stream: await ctx.parse(encodedStream),\n }\n },\n stream(value: RawStream, ctx) {\n const factory =\n value.hint === 'text'\n ? RAW_STREAM_FACTORY_TEXT\n : RAW_STREAM_FACTORY_BINARY\n const encodedStream =\n value.hint === 'text'\n ? toTextStream(value.stream)\n : toBinaryStream(value.stream)\n return {\n hint: value.hint,\n factory: ctx.parse(factory),\n stream: ctx.parse(encodedStream),\n }\n },\n },\n\n serialize(node: { hint: RawStreamHint; factory: any; stream: any }, ctx) {\n return (\n '(' +\n ctx.serialize(node.factory) +\n ')(' +\n ctx.serialize(node.stream) +\n ')'\n )\n },\n\n deserialize(\n node: { hint: RawStreamHint; factory: any; stream: any },\n ctx,\n ): any {\n const stream: ReturnType<typeof createStream> = ctx.deserialize(node.stream)\n return node.hint === 'text'\n ? RAW_STREAM_FACTORY_CONSTRUCTOR_TEXT(stream)\n : RAW_STREAM_FACTORY_CONSTRUCTOR_BINARY(stream)\n },\n}) as Plugin<any, any>\n\n/**\n * Node type for RPC plugin serialization\n */\ninterface RawStreamRPCNode {\n streamId: number\n}\n\n/**\n * Creates an RPC plugin instance that registers raw streams with a multiplexer.\n * Used for server function responses where we want binary framing.\n * Note: RPC always uses binary framing regardless of hint.\n *\n * @param onRawStream Callback invoked when a RawStream is encountered during serialization\n */\nexport function createRawStreamRPCPlugin(\n onRawStream: OnRawStreamCallback,\n): Plugin<any, any> {\n // Own stream counter - sequential IDs starting at 1, independent of seroval internals\n let nextStreamId = 1\n\n return createPlugin({\n tag: 'tss/RawStream',\n\n test(value: unknown) {\n return value instanceof RawStream\n },\n\n parse: {\n async(value: RawStream) {\n const streamId = nextStreamId++\n onRawStream(streamId, value.stream)\n return Promise.resolve({ streamId })\n },\n stream(value: RawStream) {\n const streamId = nextStreamId++\n onRawStream(streamId, value.stream)\n return { streamId }\n },\n },\n\n serialize(): never {\n // RPC uses toCrossJSONStream which produces JSON nodes, not JS code.\n // This method is only called by crossSerialize* which we don't use.\n throw new Error(\n 'RawStreamRPCPlugin.serialize should not be called. RPC uses JSON serialization, not JS code generation.',\n )\n },\n\n deserialize(): never {\n // Client uses createRawStreamDeserializePlugin instead\n throw new Error(\n 'RawStreamRPCPlugin.deserialize should not be called. Use createRawStreamDeserializePlugin on client.',\n )\n },\n }) as Plugin<any, any>\n}\n\n/**\n * Creates a deserialize-only plugin for client-side stream reconstruction.\n * Used in serverFnFetcher to wire up streams from frame decoder.\n *\n * @param getOrCreateStream Function to get/create a stream by ID from frame decoder\n */\nexport function createRawStreamDeserializePlugin(\n getOrCreateStream: (id: number) => ReadableStream<Uint8Array>,\n): Plugin<any, any> {\n return createPlugin({\n tag: 'tss/RawStream',\n\n test: () => false, // Client never serializes RawStream\n\n parse: {}, // Client only deserializes, never parses\n\n serialize(): never {\n // Client never serializes RawStream back to server\n throw new Error(\n 'RawStreamDeserializePlugin.serialize should not be called. Client only deserializes.',\n )\n },\n\n deserialize(node: RawStreamRPCNode) {\n return getOrCreateStream(node.streamId)\n },\n }) as Plugin<any, any>\n}\n"],"mappings":"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"}
|