@run0/jiki 0.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/browser-bundle.d.ts +40 -0
- package/dist/builtins.d.ts +22 -0
- package/dist/code-transform.d.ts +7 -0
- package/dist/config/cdn.d.ts +13 -0
- package/dist/container.d.ts +101 -0
- package/dist/dev-server.d.ts +69 -0
- package/dist/errors.d.ts +19 -0
- package/dist/frameworks/code-transforms.d.ts +32 -0
- package/dist/frameworks/next-api-handler.d.ts +72 -0
- package/dist/frameworks/next-dev-server.d.ts +141 -0
- package/dist/frameworks/next-html-generator.d.ts +36 -0
- package/dist/frameworks/next-route-resolver.d.ts +19 -0
- package/dist/frameworks/next-shims.d.ts +78 -0
- package/dist/frameworks/remix-dev-server.d.ts +47 -0
- package/dist/frameworks/sveltekit-dev-server.d.ts +43 -0
- package/dist/frameworks/vite-dev-server.d.ts +50 -0
- package/dist/fs-errors.d.ts +36 -0
- package/dist/index.cjs +14916 -0
- package/dist/index.cjs.map +1 -0
- package/dist/index.d.ts +61 -0
- package/dist/index.mjs +14898 -0
- package/dist/index.mjs.map +1 -0
- package/dist/kernel.d.ts +48 -0
- package/dist/memfs.d.ts +144 -0
- package/dist/metrics.d.ts +78 -0
- package/dist/module-resolver.d.ts +60 -0
- package/dist/network-interceptor.d.ts +71 -0
- package/dist/npm/cache.d.ts +76 -0
- package/dist/npm/index.d.ts +60 -0
- package/dist/npm/lockfile-reader.d.ts +32 -0
- package/dist/npm/pnpm.d.ts +18 -0
- package/dist/npm/registry.d.ts +45 -0
- package/dist/npm/resolver.d.ts +39 -0
- package/dist/npm/sync-installer.d.ts +18 -0
- package/dist/npm/tarball.d.ts +4 -0
- package/dist/npm/workspaces.d.ts +46 -0
- package/dist/persistence.d.ts +94 -0
- package/dist/plugin.d.ts +156 -0
- package/dist/polyfills/assert.d.ts +30 -0
- package/dist/polyfills/child_process.d.ts +116 -0
- package/dist/polyfills/chokidar.d.ts +18 -0
- package/dist/polyfills/crypto.d.ts +49 -0
- package/dist/polyfills/events.d.ts +28 -0
- package/dist/polyfills/fs.d.ts +82 -0
- package/dist/polyfills/http.d.ts +147 -0
- package/dist/polyfills/module.d.ts +29 -0
- package/dist/polyfills/net.d.ts +53 -0
- package/dist/polyfills/os.d.ts +91 -0
- package/dist/polyfills/path.d.ts +96 -0
- package/dist/polyfills/perf_hooks.d.ts +21 -0
- package/dist/polyfills/process.d.ts +99 -0
- package/dist/polyfills/querystring.d.ts +15 -0
- package/dist/polyfills/readdirp.d.ts +18 -0
- package/dist/polyfills/readline.d.ts +32 -0
- package/dist/polyfills/stream.d.ts +106 -0
- package/dist/polyfills/stubs.d.ts +737 -0
- package/dist/polyfills/tty.d.ts +25 -0
- package/dist/polyfills/url.d.ts +41 -0
- package/dist/polyfills/util.d.ts +61 -0
- package/dist/polyfills/v8.d.ts +43 -0
- package/dist/polyfills/vm.d.ts +76 -0
- package/dist/polyfills/worker-threads.d.ts +77 -0
- package/dist/polyfills/ws.d.ts +32 -0
- package/dist/polyfills/zlib.d.ts +87 -0
- package/dist/runtime-helpers.d.ts +4 -0
- package/dist/runtime-interface.d.ts +39 -0
- package/dist/sandbox.d.ts +69 -0
- package/dist/server-bridge.d.ts +55 -0
- package/dist/shell-commands.d.ts +2 -0
- package/dist/shell.d.ts +101 -0
- package/dist/transpiler.d.ts +47 -0
- package/dist/type-checker.d.ts +57 -0
- package/dist/types/package-json.d.ts +17 -0
- package/dist/utils/binary-encoding.d.ts +4 -0
- package/dist/utils/hash.d.ts +6 -0
- package/dist/utils/safe-path.d.ts +6 -0
- package/dist/worker-runtime.d.ts +34 -0
- package/package.json +59 -0
- package/src/browser-bundle.ts +498 -0
- package/src/builtins.ts +222 -0
- package/src/code-transform.ts +183 -0
- package/src/config/cdn.ts +17 -0
- package/src/container.ts +343 -0
- package/src/dev-server.ts +322 -0
- package/src/errors.ts +604 -0
- package/src/frameworks/code-transforms.ts +667 -0
- package/src/frameworks/next-api-handler.ts +366 -0
- package/src/frameworks/next-dev-server.ts +1252 -0
- package/src/frameworks/next-html-generator.ts +585 -0
- package/src/frameworks/next-route-resolver.ts +521 -0
- package/src/frameworks/next-shims.ts +1084 -0
- package/src/frameworks/remix-dev-server.ts +163 -0
- package/src/frameworks/sveltekit-dev-server.ts +197 -0
- package/src/frameworks/vite-dev-server.ts +370 -0
- package/src/fs-errors.ts +118 -0
- package/src/index.ts +188 -0
- package/src/kernel.ts +381 -0
- package/src/memfs.ts +1006 -0
- package/src/metrics.ts +140 -0
- package/src/module-resolver.ts +511 -0
- package/src/network-interceptor.ts +143 -0
- package/src/npm/cache.ts +172 -0
- package/src/npm/index.ts +377 -0
- package/src/npm/lockfile-reader.ts +105 -0
- package/src/npm/pnpm.ts +108 -0
- package/src/npm/registry.ts +120 -0
- package/src/npm/resolver.ts +339 -0
- package/src/npm/sync-installer.ts +217 -0
- package/src/npm/tarball.ts +136 -0
- package/src/npm/workspaces.ts +255 -0
- package/src/persistence.ts +235 -0
- package/src/plugin.ts +293 -0
- package/src/polyfills/assert.ts +164 -0
- package/src/polyfills/child_process.ts +535 -0
- package/src/polyfills/chokidar.ts +52 -0
- package/src/polyfills/crypto.ts +433 -0
- package/src/polyfills/events.ts +178 -0
- package/src/polyfills/fs.ts +297 -0
- package/src/polyfills/http.ts +478 -0
- package/src/polyfills/module.ts +97 -0
- package/src/polyfills/net.ts +123 -0
- package/src/polyfills/os.ts +108 -0
- package/src/polyfills/path.ts +169 -0
- package/src/polyfills/perf_hooks.ts +30 -0
- package/src/polyfills/process.ts +349 -0
- package/src/polyfills/querystring.ts +66 -0
- package/src/polyfills/readdirp.ts +72 -0
- package/src/polyfills/readline.ts +80 -0
- package/src/polyfills/stream.ts +610 -0
- package/src/polyfills/stubs.ts +600 -0
- package/src/polyfills/tty.ts +43 -0
- package/src/polyfills/url.ts +97 -0
- package/src/polyfills/util.ts +173 -0
- package/src/polyfills/v8.ts +62 -0
- package/src/polyfills/vm.ts +111 -0
- package/src/polyfills/worker-threads.ts +189 -0
- package/src/polyfills/ws.ts +73 -0
- package/src/polyfills/zlib.ts +244 -0
- package/src/runtime-helpers.ts +83 -0
- package/src/runtime-interface.ts +46 -0
- package/src/sandbox.ts +178 -0
- package/src/server-bridge.ts +473 -0
- package/src/service-worker.ts +153 -0
- package/src/shell-commands.ts +708 -0
- package/src/shell.ts +795 -0
- package/src/transpiler.ts +282 -0
- package/src/type-checker.ts +241 -0
- package/src/types/package-json.ts +17 -0
- package/src/utils/binary-encoding.ts +38 -0
- package/src/utils/hash.ts +24 -0
- package/src/utils/safe-path.ts +38 -0
- package/src/worker-runtime.ts +42 -0
|
@@ -0,0 +1,610 @@
|
|
|
1
|
+
import { EventEmitter } from "./events";
|
|
2
|
+
|
|
3
|
+
const BUFFER_POOL_SIZE = 8192;
|
|
4
|
+
|
|
5
|
+
export class BufferImpl extends Uint8Array {
|
|
6
|
+
static alloc(size: number, fill?: number): BufferImpl {
|
|
7
|
+
const buf = new BufferImpl(size);
|
|
8
|
+
if (fill !== undefined) buf.fill(fill);
|
|
9
|
+
return buf;
|
|
10
|
+
}
|
|
11
|
+
static allocUnsafe(size: number): BufferImpl {
|
|
12
|
+
return new BufferImpl(size);
|
|
13
|
+
}
|
|
14
|
+
static allocUnsafeSlow(size: number): BufferImpl {
|
|
15
|
+
return new BufferImpl(size);
|
|
16
|
+
}
|
|
17
|
+
static override from(
|
|
18
|
+
data:
|
|
19
|
+
| string
|
|
20
|
+
| ArrayBuffer
|
|
21
|
+
| ArrayLike<number>
|
|
22
|
+
| Uint8Array
|
|
23
|
+
| Iterable<number>,
|
|
24
|
+
encoding?: string | ((v: any, k: number) => number),
|
|
25
|
+
thisArg?: any,
|
|
26
|
+
): BufferImpl {
|
|
27
|
+
if (typeof data === "string") {
|
|
28
|
+
if (encoding === "base64") {
|
|
29
|
+
const binary = atob(data);
|
|
30
|
+
const buf = new BufferImpl(binary.length);
|
|
31
|
+
for (let i = 0; i < binary.length; i++) buf[i] = binary.charCodeAt(i);
|
|
32
|
+
return buf;
|
|
33
|
+
}
|
|
34
|
+
if (encoding === "hex") {
|
|
35
|
+
const buf = new BufferImpl(data.length / 2);
|
|
36
|
+
for (let i = 0; i < data.length; i += 2)
|
|
37
|
+
buf[i / 2] = parseInt(data.substring(i, i + 2), 16);
|
|
38
|
+
return buf;
|
|
39
|
+
}
|
|
40
|
+
return new BufferImpl(new TextEncoder().encode(data));
|
|
41
|
+
}
|
|
42
|
+
if (data instanceof ArrayBuffer) return new BufferImpl(data);
|
|
43
|
+
if (data instanceof Uint8Array) return new BufferImpl(data);
|
|
44
|
+
if (Array.isArray(data)) return new BufferImpl(data);
|
|
45
|
+
if (typeof (data as any)[Symbol.iterator] === "function")
|
|
46
|
+
return new BufferImpl(Array.from(data as Iterable<number>));
|
|
47
|
+
return new BufferImpl(data as ArrayLike<number>);
|
|
48
|
+
}
|
|
49
|
+
static concat(
|
|
50
|
+
list: (Uint8Array | BufferImpl)[],
|
|
51
|
+
totalLength?: number,
|
|
52
|
+
): BufferImpl {
|
|
53
|
+
const len = totalLength ?? list.reduce((s, b) => s + b.length, 0);
|
|
54
|
+
const result = new BufferImpl(len);
|
|
55
|
+
let offset = 0;
|
|
56
|
+
for (const buf of list) {
|
|
57
|
+
const remaining = len - offset;
|
|
58
|
+
if (remaining <= 0) break;
|
|
59
|
+
const toCopy = buf.length <= remaining ? buf : buf.subarray(0, remaining);
|
|
60
|
+
result.set(toCopy, offset);
|
|
61
|
+
offset += toCopy.length;
|
|
62
|
+
}
|
|
63
|
+
return result;
|
|
64
|
+
}
|
|
65
|
+
static isBuffer(obj: unknown): obj is BufferImpl {
|
|
66
|
+
return obj instanceof BufferImpl || obj instanceof Uint8Array;
|
|
67
|
+
}
|
|
68
|
+
static isEncoding(encoding: string): boolean {
|
|
69
|
+
return [
|
|
70
|
+
"utf8",
|
|
71
|
+
"utf-8",
|
|
72
|
+
"ascii",
|
|
73
|
+
"latin1",
|
|
74
|
+
"binary",
|
|
75
|
+
"base64",
|
|
76
|
+
"hex",
|
|
77
|
+
"ucs2",
|
|
78
|
+
"ucs-2",
|
|
79
|
+
"utf16le",
|
|
80
|
+
].includes(encoding);
|
|
81
|
+
}
|
|
82
|
+
static byteLength(str: string, encoding?: string): number {
|
|
83
|
+
if (encoding === "base64") return Math.ceil((str.length * 3) / 4);
|
|
84
|
+
if (encoding === "hex") return str.length / 2;
|
|
85
|
+
return new TextEncoder().encode(str).length;
|
|
86
|
+
}
|
|
87
|
+
|
|
88
|
+
toString(encoding?: string, start?: number, end?: number): string {
|
|
89
|
+
const slice = this.subarray(start || 0, end || this.length);
|
|
90
|
+
if (encoding === "base64") {
|
|
91
|
+
let binary = "";
|
|
92
|
+
for (let i = 0; i < slice.length; i += BUFFER_POOL_SIZE) {
|
|
93
|
+
binary += String.fromCharCode.apply(
|
|
94
|
+
null,
|
|
95
|
+
Array.from(slice.subarray(i, i + BUFFER_POOL_SIZE)),
|
|
96
|
+
);
|
|
97
|
+
}
|
|
98
|
+
return btoa(binary);
|
|
99
|
+
}
|
|
100
|
+
if (encoding === "hex") {
|
|
101
|
+
return Array.from(slice)
|
|
102
|
+
.map(b => b.toString(16).padStart(2, "0"))
|
|
103
|
+
.join("");
|
|
104
|
+
}
|
|
105
|
+
if (encoding === "latin1" || encoding === "binary") {
|
|
106
|
+
return Array.from(slice)
|
|
107
|
+
.map(b => String.fromCharCode(b))
|
|
108
|
+
.join("");
|
|
109
|
+
}
|
|
110
|
+
return new TextDecoder().decode(slice);
|
|
111
|
+
}
|
|
112
|
+
|
|
113
|
+
write(
|
|
114
|
+
string: string,
|
|
115
|
+
offset?: number,
|
|
116
|
+
length?: number,
|
|
117
|
+
encoding?: string,
|
|
118
|
+
): number {
|
|
119
|
+
const bytes = BufferImpl.from(string, encoding);
|
|
120
|
+
const start = offset || 0;
|
|
121
|
+
const count = Math.min(
|
|
122
|
+
bytes.length,
|
|
123
|
+
length ?? this.length - start,
|
|
124
|
+
this.length - start,
|
|
125
|
+
);
|
|
126
|
+
this.set(bytes.subarray(0, count), start);
|
|
127
|
+
return count;
|
|
128
|
+
}
|
|
129
|
+
|
|
130
|
+
copy(
|
|
131
|
+
target: Uint8Array,
|
|
132
|
+
targetStart = 0,
|
|
133
|
+
sourceStart = 0,
|
|
134
|
+
sourceEnd = this.length,
|
|
135
|
+
): number {
|
|
136
|
+
const slice = this.subarray(sourceStart, sourceEnd);
|
|
137
|
+
const count = Math.min(slice.length, target.length - targetStart);
|
|
138
|
+
target.set(slice.subarray(0, count), targetStart);
|
|
139
|
+
return count;
|
|
140
|
+
}
|
|
141
|
+
|
|
142
|
+
equals(other: Uint8Array): boolean {
|
|
143
|
+
if (this.length !== other.length) return false;
|
|
144
|
+
for (let i = 0; i < this.length; i++) {
|
|
145
|
+
if (this[i] !== other[i]) return false;
|
|
146
|
+
}
|
|
147
|
+
return true;
|
|
148
|
+
}
|
|
149
|
+
|
|
150
|
+
compare(other: Uint8Array): number {
|
|
151
|
+
const len = Math.min(this.length, other.length);
|
|
152
|
+
for (let i = 0; i < len; i++) {
|
|
153
|
+
if (this[i] < other[i]) return -1;
|
|
154
|
+
if (this[i] > other[i]) return 1;
|
|
155
|
+
}
|
|
156
|
+
if (this.length < other.length) return -1;
|
|
157
|
+
if (this.length > other.length) return 1;
|
|
158
|
+
return 0;
|
|
159
|
+
}
|
|
160
|
+
|
|
161
|
+
readUInt8(offset: number): number {
|
|
162
|
+
return this[offset];
|
|
163
|
+
}
|
|
164
|
+
readUInt16BE(offset: number): number {
|
|
165
|
+
return (this[offset] << 8) | this[offset + 1];
|
|
166
|
+
}
|
|
167
|
+
readUInt16LE(offset: number): number {
|
|
168
|
+
return this[offset] | (this[offset + 1] << 8);
|
|
169
|
+
}
|
|
170
|
+
readUInt32BE(offset: number): number {
|
|
171
|
+
return (
|
|
172
|
+
((this[offset] << 24) |
|
|
173
|
+
(this[offset + 1] << 16) |
|
|
174
|
+
(this[offset + 2] << 8) |
|
|
175
|
+
this[offset + 3]) >>>
|
|
176
|
+
0
|
|
177
|
+
);
|
|
178
|
+
}
|
|
179
|
+
readUInt32LE(offset: number): number {
|
|
180
|
+
return (
|
|
181
|
+
(this[offset] |
|
|
182
|
+
(this[offset + 1] << 8) |
|
|
183
|
+
(this[offset + 2] << 16) |
|
|
184
|
+
(this[offset + 3] << 24)) >>>
|
|
185
|
+
0
|
|
186
|
+
);
|
|
187
|
+
}
|
|
188
|
+
readInt8(offset: number): number {
|
|
189
|
+
const v = this[offset];
|
|
190
|
+
return v > 127 ? v - 256 : v;
|
|
191
|
+
}
|
|
192
|
+
readInt16BE(offset: number): number {
|
|
193
|
+
const v = this.readUInt16BE(offset);
|
|
194
|
+
return v > 32767 ? v - 65536 : v;
|
|
195
|
+
}
|
|
196
|
+
readInt16LE(offset: number): number {
|
|
197
|
+
const v = this.readUInt16LE(offset);
|
|
198
|
+
return v > 32767 ? v - 65536 : v;
|
|
199
|
+
}
|
|
200
|
+
readInt32BE(offset: number): number {
|
|
201
|
+
return (
|
|
202
|
+
(this[offset] << 24) |
|
|
203
|
+
(this[offset + 1] << 16) |
|
|
204
|
+
(this[offset + 2] << 8) |
|
|
205
|
+
this[offset + 3]
|
|
206
|
+
);
|
|
207
|
+
}
|
|
208
|
+
readInt32LE(offset: number): number {
|
|
209
|
+
return (
|
|
210
|
+
this[offset] |
|
|
211
|
+
(this[offset + 1] << 8) |
|
|
212
|
+
(this[offset + 2] << 16) |
|
|
213
|
+
(this[offset + 3] << 24)
|
|
214
|
+
);
|
|
215
|
+
}
|
|
216
|
+
|
|
217
|
+
writeUInt8(value: number, offset: number): number {
|
|
218
|
+
this[offset] = value & 0xff;
|
|
219
|
+
return offset + 1;
|
|
220
|
+
}
|
|
221
|
+
writeUInt16BE(value: number, offset: number): number {
|
|
222
|
+
this[offset] = (value >> 8) & 0xff;
|
|
223
|
+
this[offset + 1] = value & 0xff;
|
|
224
|
+
return offset + 2;
|
|
225
|
+
}
|
|
226
|
+
writeUInt16LE(value: number, offset: number): number {
|
|
227
|
+
this[offset] = value & 0xff;
|
|
228
|
+
this[offset + 1] = (value >> 8) & 0xff;
|
|
229
|
+
return offset + 2;
|
|
230
|
+
}
|
|
231
|
+
writeUInt32BE(value: number, offset: number): number {
|
|
232
|
+
this[offset] = (value >>> 24) & 0xff;
|
|
233
|
+
this[offset + 1] = (value >>> 16) & 0xff;
|
|
234
|
+
this[offset + 2] = (value >>> 8) & 0xff;
|
|
235
|
+
this[offset + 3] = value & 0xff;
|
|
236
|
+
return offset + 4;
|
|
237
|
+
}
|
|
238
|
+
writeUInt32LE(value: number, offset: number): number {
|
|
239
|
+
this[offset] = value & 0xff;
|
|
240
|
+
this[offset + 1] = (value >>> 8) & 0xff;
|
|
241
|
+
this[offset + 2] = (value >>> 16) & 0xff;
|
|
242
|
+
this[offset + 3] = (value >>> 24) & 0xff;
|
|
243
|
+
return offset + 4;
|
|
244
|
+
}
|
|
245
|
+
|
|
246
|
+
readFloatBE(offset: number): number {
|
|
247
|
+
return new DataView(
|
|
248
|
+
this.buffer,
|
|
249
|
+
this.byteOffset,
|
|
250
|
+
this.byteLength,
|
|
251
|
+
).getFloat32(offset, false);
|
|
252
|
+
}
|
|
253
|
+
readFloatLE(offset: number): number {
|
|
254
|
+
return new DataView(
|
|
255
|
+
this.buffer,
|
|
256
|
+
this.byteOffset,
|
|
257
|
+
this.byteLength,
|
|
258
|
+
).getFloat32(offset, true);
|
|
259
|
+
}
|
|
260
|
+
readDoubleBE(offset: number): number {
|
|
261
|
+
return new DataView(
|
|
262
|
+
this.buffer,
|
|
263
|
+
this.byteOffset,
|
|
264
|
+
this.byteLength,
|
|
265
|
+
).getFloat64(offset, false);
|
|
266
|
+
}
|
|
267
|
+
readDoubleLE(offset: number): number {
|
|
268
|
+
return new DataView(
|
|
269
|
+
this.buffer,
|
|
270
|
+
this.byteOffset,
|
|
271
|
+
this.byteLength,
|
|
272
|
+
).getFloat64(offset, true);
|
|
273
|
+
}
|
|
274
|
+
writeFloatBE(value: number, offset: number): number {
|
|
275
|
+
new DataView(this.buffer, this.byteOffset, this.byteLength).setFloat32(
|
|
276
|
+
offset,
|
|
277
|
+
value,
|
|
278
|
+
false,
|
|
279
|
+
);
|
|
280
|
+
return offset + 4;
|
|
281
|
+
}
|
|
282
|
+
writeFloatLE(value: number, offset: number): number {
|
|
283
|
+
new DataView(this.buffer, this.byteOffset, this.byteLength).setFloat32(
|
|
284
|
+
offset,
|
|
285
|
+
value,
|
|
286
|
+
true,
|
|
287
|
+
);
|
|
288
|
+
return offset + 4;
|
|
289
|
+
}
|
|
290
|
+
writeDoubleBE(value: number, offset: number): number {
|
|
291
|
+
new DataView(this.buffer, this.byteOffset, this.byteLength).setFloat64(
|
|
292
|
+
offset,
|
|
293
|
+
value,
|
|
294
|
+
false,
|
|
295
|
+
);
|
|
296
|
+
return offset + 8;
|
|
297
|
+
}
|
|
298
|
+
writeDoubleLE(value: number, offset: number): number {
|
|
299
|
+
new DataView(this.buffer, this.byteOffset, this.byteLength).setFloat64(
|
|
300
|
+
offset,
|
|
301
|
+
value,
|
|
302
|
+
true,
|
|
303
|
+
);
|
|
304
|
+
return offset + 8;
|
|
305
|
+
}
|
|
306
|
+
|
|
307
|
+
toJSON(): { type: "Buffer"; data: number[] } {
|
|
308
|
+
return { type: "Buffer", data: Array.from(this) };
|
|
309
|
+
}
|
|
310
|
+
|
|
311
|
+
slice(start?: number, end?: number): BufferImpl {
|
|
312
|
+
const sliced = super.slice(start, end);
|
|
313
|
+
return new BufferImpl(sliced);
|
|
314
|
+
}
|
|
315
|
+
}
|
|
316
|
+
|
|
317
|
+
export class Readable extends EventEmitter {
|
|
318
|
+
readable = true;
|
|
319
|
+
readableEnded = false;
|
|
320
|
+
readableFlowing: boolean | null = null;
|
|
321
|
+
private _buffer: unknown[] = [];
|
|
322
|
+
private _ended = false;
|
|
323
|
+
|
|
324
|
+
readableHighWaterMark = 16;
|
|
325
|
+
|
|
326
|
+
read(_size?: number): unknown {
|
|
327
|
+
return this._buffer.shift() || null;
|
|
328
|
+
}
|
|
329
|
+
|
|
330
|
+
push(chunk: unknown): boolean {
|
|
331
|
+
if (chunk === null) {
|
|
332
|
+
this._ended = true;
|
|
333
|
+
this.readableEnded = true;
|
|
334
|
+
this.emit("end");
|
|
335
|
+
return false;
|
|
336
|
+
}
|
|
337
|
+
this._buffer.push(chunk);
|
|
338
|
+
if (this.readableFlowing) {
|
|
339
|
+
while (this._buffer.length > 0) {
|
|
340
|
+
this.emit("data", this._buffer.shift());
|
|
341
|
+
}
|
|
342
|
+
}
|
|
343
|
+
return this._buffer.length < this.readableHighWaterMark;
|
|
344
|
+
}
|
|
345
|
+
|
|
346
|
+
on(event: string, listener: (...args: unknown[]) => void): this {
|
|
347
|
+
super.on(event, listener);
|
|
348
|
+
if (event === "data" && this.readableFlowing === null) {
|
|
349
|
+
this.readableFlowing = true;
|
|
350
|
+
// Flush any buffered data
|
|
351
|
+
while (this._buffer.length > 0 && this.readableFlowing) {
|
|
352
|
+
this.emit("data", this._buffer.shift());
|
|
353
|
+
}
|
|
354
|
+
}
|
|
355
|
+
return this;
|
|
356
|
+
}
|
|
357
|
+
|
|
358
|
+
pipe<T extends Writable>(dest: T): T {
|
|
359
|
+
this.on("data", chunk => dest.write(chunk as string | Uint8Array));
|
|
360
|
+
this.on("end", () => dest.end?.());
|
|
361
|
+
return dest;
|
|
362
|
+
}
|
|
363
|
+
|
|
364
|
+
unpipe(_dest?: Writable): this {
|
|
365
|
+
return this;
|
|
366
|
+
}
|
|
367
|
+
pause(): this {
|
|
368
|
+
this.readableFlowing = false;
|
|
369
|
+
return this;
|
|
370
|
+
}
|
|
371
|
+
resume(): this {
|
|
372
|
+
if (!this.readableFlowing) {
|
|
373
|
+
this.readableFlowing = true;
|
|
374
|
+
// Flush buffered chunks
|
|
375
|
+
while (this._buffer.length > 0 && this.readableFlowing) {
|
|
376
|
+
this.emit("data", this._buffer.shift());
|
|
377
|
+
}
|
|
378
|
+
if (this.readableEnded && this._buffer.length === 0) {
|
|
379
|
+
this.emit("end");
|
|
380
|
+
}
|
|
381
|
+
}
|
|
382
|
+
return this;
|
|
383
|
+
}
|
|
384
|
+
destroy(): this {
|
|
385
|
+
this.readable = false;
|
|
386
|
+
this.emit("close");
|
|
387
|
+
return this;
|
|
388
|
+
}
|
|
389
|
+
setEncoding(_enc: string): this {
|
|
390
|
+
return this;
|
|
391
|
+
}
|
|
392
|
+
|
|
393
|
+
[Symbol.asyncIterator](): AsyncIterableIterator<unknown> {
|
|
394
|
+
const self = this;
|
|
395
|
+
return {
|
|
396
|
+
next(): Promise<IteratorResult<unknown>> {
|
|
397
|
+
return new Promise(resolve => {
|
|
398
|
+
if (self._ended) {
|
|
399
|
+
resolve({ value: undefined, done: true });
|
|
400
|
+
return;
|
|
401
|
+
}
|
|
402
|
+
const chunk = self.read();
|
|
403
|
+
if (chunk !== null) {
|
|
404
|
+
resolve({ value: chunk, done: false });
|
|
405
|
+
return;
|
|
406
|
+
}
|
|
407
|
+
const onData = (data: unknown) => {
|
|
408
|
+
self.removeListener("end", onEnd);
|
|
409
|
+
resolve({ value: data, done: false });
|
|
410
|
+
};
|
|
411
|
+
const onEnd = () => {
|
|
412
|
+
self.removeListener("data", onData);
|
|
413
|
+
resolve({ value: undefined, done: true });
|
|
414
|
+
};
|
|
415
|
+
self.once("data", onData);
|
|
416
|
+
self.once("end", onEnd);
|
|
417
|
+
});
|
|
418
|
+
},
|
|
419
|
+
[Symbol.asyncIterator]() {
|
|
420
|
+
return this;
|
|
421
|
+
},
|
|
422
|
+
};
|
|
423
|
+
}
|
|
424
|
+
}
|
|
425
|
+
|
|
426
|
+
export class Writable extends EventEmitter {
|
|
427
|
+
writable = true;
|
|
428
|
+
writableEnded = false;
|
|
429
|
+
writableFinished = false;
|
|
430
|
+
|
|
431
|
+
write(
|
|
432
|
+
chunk: string | Uint8Array,
|
|
433
|
+
encodingOrCb?: string | (() => void),
|
|
434
|
+
cb?: () => void,
|
|
435
|
+
): boolean {
|
|
436
|
+
const callback = typeof encodingOrCb === "function" ? encodingOrCb : cb;
|
|
437
|
+
this._write(
|
|
438
|
+
chunk,
|
|
439
|
+
typeof encodingOrCb === "string" ? encodingOrCb : "utf8",
|
|
440
|
+
callback || (() => {}),
|
|
441
|
+
);
|
|
442
|
+
return true;
|
|
443
|
+
}
|
|
444
|
+
|
|
445
|
+
_write(_chunk: unknown, _encoding: string, callback: () => void): void {
|
|
446
|
+
callback();
|
|
447
|
+
}
|
|
448
|
+
|
|
449
|
+
end(
|
|
450
|
+
chunkOrCb?: unknown,
|
|
451
|
+
encodingOrCb?: string | (() => void),
|
|
452
|
+
cb?: () => void,
|
|
453
|
+
): this {
|
|
454
|
+
if (typeof chunkOrCb === "function") {
|
|
455
|
+
cb = chunkOrCb as () => void;
|
|
456
|
+
} else if (chunkOrCb != null) {
|
|
457
|
+
this.write(chunkOrCb as string | Uint8Array, encodingOrCb as string);
|
|
458
|
+
}
|
|
459
|
+
this.writableEnded = true;
|
|
460
|
+
this.writableFinished = true;
|
|
461
|
+
this.emit("finish");
|
|
462
|
+
this.emit("close");
|
|
463
|
+
if (cb) cb();
|
|
464
|
+
if (typeof encodingOrCb === "function") encodingOrCb();
|
|
465
|
+
return this;
|
|
466
|
+
}
|
|
467
|
+
|
|
468
|
+
destroy(): this {
|
|
469
|
+
this.writable = false;
|
|
470
|
+
this.emit("close");
|
|
471
|
+
return this;
|
|
472
|
+
}
|
|
473
|
+
}
|
|
474
|
+
|
|
475
|
+
export class Duplex extends Readable {
|
|
476
|
+
writable = true;
|
|
477
|
+
writableEnded = false;
|
|
478
|
+
writableFinished = false;
|
|
479
|
+
|
|
480
|
+
write(
|
|
481
|
+
chunk: string | Uint8Array,
|
|
482
|
+
encodingOrCb?: string | (() => void),
|
|
483
|
+
cb?: () => void,
|
|
484
|
+
): boolean {
|
|
485
|
+
const callback = typeof encodingOrCb === "function" ? encodingOrCb : cb;
|
|
486
|
+
this._write(
|
|
487
|
+
chunk,
|
|
488
|
+
typeof encodingOrCb === "string" ? encodingOrCb : "utf8",
|
|
489
|
+
callback || (() => {}),
|
|
490
|
+
);
|
|
491
|
+
return true;
|
|
492
|
+
}
|
|
493
|
+
|
|
494
|
+
_write(_chunk: unknown, _encoding: string, callback: () => void): void {
|
|
495
|
+
callback();
|
|
496
|
+
}
|
|
497
|
+
|
|
498
|
+
end(
|
|
499
|
+
chunkOrCb?: unknown,
|
|
500
|
+
encodingOrCb?: string | (() => void),
|
|
501
|
+
cb?: () => void,
|
|
502
|
+
): this {
|
|
503
|
+
if (typeof chunkOrCb === "function") {
|
|
504
|
+
cb = chunkOrCb as () => void;
|
|
505
|
+
} else if (chunkOrCb != null) {
|
|
506
|
+
this.write(chunkOrCb as string | Uint8Array, encodingOrCb as string);
|
|
507
|
+
}
|
|
508
|
+
this.writableEnded = true;
|
|
509
|
+
this.writableFinished = true;
|
|
510
|
+
this.emit("finish");
|
|
511
|
+
this.emit("close");
|
|
512
|
+
if (cb) cb();
|
|
513
|
+
if (typeof encodingOrCb === "function") encodingOrCb();
|
|
514
|
+
return this;
|
|
515
|
+
}
|
|
516
|
+
}
|
|
517
|
+
|
|
518
|
+
export class Transform extends Duplex {
|
|
519
|
+
_transform(
|
|
520
|
+
chunk: unknown,
|
|
521
|
+
_encoding: string,
|
|
522
|
+
callback: (err?: Error | null, data?: unknown) => void,
|
|
523
|
+
): void {
|
|
524
|
+
callback(null, chunk);
|
|
525
|
+
}
|
|
526
|
+
|
|
527
|
+
_write(chunk: unknown, encoding: string, callback: () => void): void {
|
|
528
|
+
this._transform(chunk, encoding, (err, data) => {
|
|
529
|
+
if (data != null) this.push(data);
|
|
530
|
+
if (err) this.emit("error", err);
|
|
531
|
+
callback();
|
|
532
|
+
});
|
|
533
|
+
}
|
|
534
|
+
}
|
|
535
|
+
|
|
536
|
+
export class PassThrough extends Transform {}
|
|
537
|
+
|
|
538
|
+
export function pipeline(...args: unknown[]): unknown {
|
|
539
|
+
const cb =
|
|
540
|
+
typeof args[args.length - 1] === "function"
|
|
541
|
+
? (args.pop() as (err?: Error) => void)
|
|
542
|
+
: undefined;
|
|
543
|
+
const streams = args as (Readable | Writable | Transform)[];
|
|
544
|
+
let current: unknown = streams[0];
|
|
545
|
+
for (let i = 1; i < streams.length; i++) {
|
|
546
|
+
current = (current as Readable).pipe(streams[i] as Writable);
|
|
547
|
+
}
|
|
548
|
+
if (cb) {
|
|
549
|
+
const last = streams[streams.length - 1];
|
|
550
|
+
(last as EventEmitter).on("finish", () => cb());
|
|
551
|
+
(last as EventEmitter).on("error", err => cb(err as Error));
|
|
552
|
+
}
|
|
553
|
+
return current;
|
|
554
|
+
}
|
|
555
|
+
|
|
556
|
+
export function finished(
|
|
557
|
+
stream: unknown,
|
|
558
|
+
cb: (err?: Error) => void,
|
|
559
|
+
): () => void {
|
|
560
|
+
const s = stream as EventEmitter;
|
|
561
|
+
const onFinish = () => {
|
|
562
|
+
cleanup();
|
|
563
|
+
cb();
|
|
564
|
+
};
|
|
565
|
+
const onError = (err: Error) => {
|
|
566
|
+
cleanup();
|
|
567
|
+
cb(err);
|
|
568
|
+
};
|
|
569
|
+
const onEnd = () => {
|
|
570
|
+
cleanup();
|
|
571
|
+
cb();
|
|
572
|
+
};
|
|
573
|
+
const cleanup = () => {
|
|
574
|
+
s.removeListener("finish", onFinish);
|
|
575
|
+
s.removeListener("error", onError);
|
|
576
|
+
s.removeListener("end", onEnd);
|
|
577
|
+
};
|
|
578
|
+
s.on("finish", onFinish);
|
|
579
|
+
s.on("error", onError);
|
|
580
|
+
s.on("end", onEnd);
|
|
581
|
+
return cleanup;
|
|
582
|
+
}
|
|
583
|
+
|
|
584
|
+
export { BufferImpl as Buffer };
|
|
585
|
+
|
|
586
|
+
export const bufferModule = { Buffer: BufferImpl };
|
|
587
|
+
|
|
588
|
+
export class Stream extends EventEmitter {
|
|
589
|
+
pipe<T extends Writable>(dest: T): T {
|
|
590
|
+
this.on("data", (chunk: unknown) =>
|
|
591
|
+
dest.write(chunk as string | Uint8Array),
|
|
592
|
+
);
|
|
593
|
+
this.on("end", () => dest.end?.());
|
|
594
|
+
return dest;
|
|
595
|
+
}
|
|
596
|
+
}
|
|
597
|
+
|
|
598
|
+
const streamModule = Object.assign(Stream, {
|
|
599
|
+
Readable,
|
|
600
|
+
Writable,
|
|
601
|
+
Duplex,
|
|
602
|
+
Transform,
|
|
603
|
+
PassThrough,
|
|
604
|
+
pipeline,
|
|
605
|
+
finished,
|
|
606
|
+
Stream,
|
|
607
|
+
Buffer: BufferImpl,
|
|
608
|
+
});
|
|
609
|
+
|
|
610
|
+
export default streamModule;
|