almostnode 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/LICENSE +21 -0
- package/README.md +731 -0
- package/dist/__sw__.js +394 -0
- package/dist/ai-chatbot-demo-entry.d.ts +6 -0
- package/dist/ai-chatbot-demo-entry.d.ts.map +1 -0
- package/dist/ai-chatbot-demo.d.ts +42 -0
- package/dist/ai-chatbot-demo.d.ts.map +1 -0
- package/dist/assets/runtime-worker-D9x_Ddwz.js +60543 -0
- package/dist/assets/runtime-worker-D9x_Ddwz.js.map +1 -0
- package/dist/convex-app-demo-entry.d.ts +6 -0
- package/dist/convex-app-demo-entry.d.ts.map +1 -0
- package/dist/convex-app-demo.d.ts +68 -0
- package/dist/convex-app-demo.d.ts.map +1 -0
- package/dist/cors-proxy.d.ts +46 -0
- package/dist/cors-proxy.d.ts.map +1 -0
- package/dist/create-runtime.d.ts +42 -0
- package/dist/create-runtime.d.ts.map +1 -0
- package/dist/demo.d.ts +6 -0
- package/dist/demo.d.ts.map +1 -0
- package/dist/dev-server.d.ts +97 -0
- package/dist/dev-server.d.ts.map +1 -0
- package/dist/frameworks/next-dev-server.d.ts +202 -0
- package/dist/frameworks/next-dev-server.d.ts.map +1 -0
- package/dist/frameworks/vite-dev-server.d.ts +85 -0
- package/dist/frameworks/vite-dev-server.d.ts.map +1 -0
- package/dist/index.cjs +14965 -0
- package/dist/index.cjs.map +1 -0
- package/dist/index.d.ts +71 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.mjs +14867 -0
- package/dist/index.mjs.map +1 -0
- package/dist/next-demo.d.ts +49 -0
- package/dist/next-demo.d.ts.map +1 -0
- package/dist/npm/index.d.ts +71 -0
- package/dist/npm/index.d.ts.map +1 -0
- package/dist/npm/registry.d.ts +66 -0
- package/dist/npm/registry.d.ts.map +1 -0
- package/dist/npm/resolver.d.ts +52 -0
- package/dist/npm/resolver.d.ts.map +1 -0
- package/dist/npm/tarball.d.ts +29 -0
- package/dist/npm/tarball.d.ts.map +1 -0
- package/dist/runtime-interface.d.ts +90 -0
- package/dist/runtime-interface.d.ts.map +1 -0
- package/dist/runtime.d.ts +103 -0
- package/dist/runtime.d.ts.map +1 -0
- package/dist/sandbox-helpers.d.ts +43 -0
- package/dist/sandbox-helpers.d.ts.map +1 -0
- package/dist/sandbox-runtime.d.ts +65 -0
- package/dist/sandbox-runtime.d.ts.map +1 -0
- package/dist/server-bridge.d.ts +89 -0
- package/dist/server-bridge.d.ts.map +1 -0
- package/dist/shims/assert.d.ts +51 -0
- package/dist/shims/assert.d.ts.map +1 -0
- package/dist/shims/async_hooks.d.ts +37 -0
- package/dist/shims/async_hooks.d.ts.map +1 -0
- package/dist/shims/buffer.d.ts +20 -0
- package/dist/shims/buffer.d.ts.map +1 -0
- package/dist/shims/child_process-browser.d.ts +92 -0
- package/dist/shims/child_process-browser.d.ts.map +1 -0
- package/dist/shims/child_process.d.ts +93 -0
- package/dist/shims/child_process.d.ts.map +1 -0
- package/dist/shims/chokidar.d.ts +55 -0
- package/dist/shims/chokidar.d.ts.map +1 -0
- package/dist/shims/cluster.d.ts +52 -0
- package/dist/shims/cluster.d.ts.map +1 -0
- package/dist/shims/crypto.d.ts +122 -0
- package/dist/shims/crypto.d.ts.map +1 -0
- package/dist/shims/dgram.d.ts +34 -0
- package/dist/shims/dgram.d.ts.map +1 -0
- package/dist/shims/diagnostics_channel.d.ts +80 -0
- package/dist/shims/diagnostics_channel.d.ts.map +1 -0
- package/dist/shims/dns.d.ts +87 -0
- package/dist/shims/dns.d.ts.map +1 -0
- package/dist/shims/domain.d.ts +25 -0
- package/dist/shims/domain.d.ts.map +1 -0
- package/dist/shims/esbuild.d.ts +105 -0
- package/dist/shims/esbuild.d.ts.map +1 -0
- package/dist/shims/events.d.ts +37 -0
- package/dist/shims/events.d.ts.map +1 -0
- package/dist/shims/fs.d.ts +115 -0
- package/dist/shims/fs.d.ts.map +1 -0
- package/dist/shims/fsevents.d.ts +67 -0
- package/dist/shims/fsevents.d.ts.map +1 -0
- package/dist/shims/http.d.ts +217 -0
- package/dist/shims/http.d.ts.map +1 -0
- package/dist/shims/http2.d.ts +81 -0
- package/dist/shims/http2.d.ts.map +1 -0
- package/dist/shims/https.d.ts +36 -0
- package/dist/shims/https.d.ts.map +1 -0
- package/dist/shims/inspector.d.ts +25 -0
- package/dist/shims/inspector.d.ts.map +1 -0
- package/dist/shims/module.d.ts +22 -0
- package/dist/shims/module.d.ts.map +1 -0
- package/dist/shims/net.d.ts +100 -0
- package/dist/shims/net.d.ts.map +1 -0
- package/dist/shims/os.d.ts +159 -0
- package/dist/shims/os.d.ts.map +1 -0
- package/dist/shims/path.d.ts +72 -0
- package/dist/shims/path.d.ts.map +1 -0
- package/dist/shims/perf_hooks.d.ts +50 -0
- package/dist/shims/perf_hooks.d.ts.map +1 -0
- package/dist/shims/process.d.ts +93 -0
- package/dist/shims/process.d.ts.map +1 -0
- package/dist/shims/querystring.d.ts +23 -0
- package/dist/shims/querystring.d.ts.map +1 -0
- package/dist/shims/readdirp.d.ts +52 -0
- package/dist/shims/readdirp.d.ts.map +1 -0
- package/dist/shims/readline.d.ts +62 -0
- package/dist/shims/readline.d.ts.map +1 -0
- package/dist/shims/rollup.d.ts +34 -0
- package/dist/shims/rollup.d.ts.map +1 -0
- package/dist/shims/sentry.d.ts +163 -0
- package/dist/shims/sentry.d.ts.map +1 -0
- package/dist/shims/stream.d.ts +181 -0
- package/dist/shims/stream.d.ts.map +1 -0
- package/dist/shims/tls.d.ts +53 -0
- package/dist/shims/tls.d.ts.map +1 -0
- package/dist/shims/tty.d.ts +30 -0
- package/dist/shims/tty.d.ts.map +1 -0
- package/dist/shims/url.d.ts +64 -0
- package/dist/shims/url.d.ts.map +1 -0
- package/dist/shims/util.d.ts +106 -0
- package/dist/shims/util.d.ts.map +1 -0
- package/dist/shims/v8.d.ts +73 -0
- package/dist/shims/v8.d.ts.map +1 -0
- package/dist/shims/vfs-adapter.d.ts +126 -0
- package/dist/shims/vfs-adapter.d.ts.map +1 -0
- package/dist/shims/vm.d.ts +45 -0
- package/dist/shims/vm.d.ts.map +1 -0
- package/dist/shims/worker_threads.d.ts +66 -0
- package/dist/shims/worker_threads.d.ts.map +1 -0
- package/dist/shims/ws.d.ts +66 -0
- package/dist/shims/ws.d.ts.map +1 -0
- package/dist/shims/zlib.d.ts +161 -0
- package/dist/shims/zlib.d.ts.map +1 -0
- package/dist/transform.d.ts +24 -0
- package/dist/transform.d.ts.map +1 -0
- package/dist/virtual-fs.d.ts +226 -0
- package/dist/virtual-fs.d.ts.map +1 -0
- package/dist/vite-demo.d.ts +35 -0
- package/dist/vite-demo.d.ts.map +1 -0
- package/dist/vite-sw.js +132 -0
- package/dist/worker/runtime-worker.d.ts +8 -0
- package/dist/worker/runtime-worker.d.ts.map +1 -0
- package/dist/worker-runtime.d.ts +50 -0
- package/dist/worker-runtime.d.ts.map +1 -0
- package/package.json +85 -0
- package/src/ai-chatbot-demo-entry.ts +244 -0
- package/src/ai-chatbot-demo.ts +509 -0
- package/src/convex-app-demo-entry.ts +1107 -0
- package/src/convex-app-demo.ts +1316 -0
- package/src/cors-proxy.ts +81 -0
- package/src/create-runtime.ts +147 -0
- package/src/demo.ts +304 -0
- package/src/dev-server.ts +274 -0
- package/src/frameworks/next-dev-server.ts +2224 -0
- package/src/frameworks/vite-dev-server.ts +702 -0
- package/src/index.ts +101 -0
- package/src/next-demo.ts +1784 -0
- package/src/npm/index.ts +347 -0
- package/src/npm/registry.ts +152 -0
- package/src/npm/resolver.ts +385 -0
- package/src/npm/tarball.ts +209 -0
- package/src/runtime-interface.ts +103 -0
- package/src/runtime.ts +1046 -0
- package/src/sandbox-helpers.ts +173 -0
- package/src/sandbox-runtime.ts +252 -0
- package/src/server-bridge.ts +426 -0
- package/src/shims/assert.ts +664 -0
- package/src/shims/async_hooks.ts +86 -0
- package/src/shims/buffer.ts +75 -0
- package/src/shims/child_process-browser.ts +217 -0
- package/src/shims/child_process.ts +463 -0
- package/src/shims/chokidar.ts +313 -0
- package/src/shims/cluster.ts +67 -0
- package/src/shims/crypto.ts +830 -0
- package/src/shims/dgram.ts +47 -0
- package/src/shims/diagnostics_channel.ts +196 -0
- package/src/shims/dns.ts +172 -0
- package/src/shims/domain.ts +58 -0
- package/src/shims/esbuild.ts +805 -0
- package/src/shims/events.ts +195 -0
- package/src/shims/fs.ts +803 -0
- package/src/shims/fsevents.ts +63 -0
- package/src/shims/http.ts +904 -0
- package/src/shims/http2.ts +96 -0
- package/src/shims/https.ts +86 -0
- package/src/shims/inspector.ts +30 -0
- package/src/shims/module.ts +82 -0
- package/src/shims/net.ts +359 -0
- package/src/shims/os.ts +195 -0
- package/src/shims/path.ts +199 -0
- package/src/shims/perf_hooks.ts +92 -0
- package/src/shims/process.ts +346 -0
- package/src/shims/querystring.ts +97 -0
- package/src/shims/readdirp.ts +228 -0
- package/src/shims/readline.ts +110 -0
- package/src/shims/rollup.ts +80 -0
- package/src/shims/sentry.ts +133 -0
- package/src/shims/stream.ts +1126 -0
- package/src/shims/tls.ts +95 -0
- package/src/shims/tty.ts +64 -0
- package/src/shims/url.ts +171 -0
- package/src/shims/util.ts +312 -0
- package/src/shims/v8.ts +113 -0
- package/src/shims/vfs-adapter.ts +402 -0
- package/src/shims/vm.ts +83 -0
- package/src/shims/worker_threads.ts +111 -0
- package/src/shims/ws.ts +382 -0
- package/src/shims/zlib.ts +289 -0
- package/src/transform.ts +313 -0
- package/src/types/external.d.ts +67 -0
- package/src/virtual-fs.ts +903 -0
- package/src/vite-demo.ts +577 -0
- package/src/worker/runtime-worker.ts +128 -0
- package/src/worker-runtime.ts +145 -0
|
@@ -0,0 +1,1126 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Node.js Stream shim
|
|
3
|
+
* Basic Readable and Writable stream implementations
|
|
4
|
+
*/
|
|
5
|
+
|
|
6
|
+
import { EventEmitter } from './events';
|
|
7
|
+
|
|
8
|
+
export class Readable extends EventEmitter {
|
|
9
|
+
private _buffer: Uint8Array[] = [];
|
|
10
|
+
private _ended: boolean = false;
|
|
11
|
+
private _flowing: boolean = false;
|
|
12
|
+
private _endEmitted: boolean = false;
|
|
13
|
+
readable: boolean = true;
|
|
14
|
+
readableEnded: boolean = false;
|
|
15
|
+
readableFlowing: boolean | null = null;
|
|
16
|
+
|
|
17
|
+
constructor() {
|
|
18
|
+
super();
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
// Internal method to add listener without triggering auto-flow
|
|
22
|
+
private _addListenerInternal(event: string | symbol, listener: (...args: unknown[]) => void): this {
|
|
23
|
+
// Call base EventEmitter's addListener directly
|
|
24
|
+
EventEmitter.prototype.addListener.call(this, event as string, listener);
|
|
25
|
+
return this;
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
// Override on() to auto-flow when 'data' listener is added
|
|
29
|
+
on(event: string | symbol, listener: (...args: unknown[]) => void): this {
|
|
30
|
+
this._addListenerInternal(event, listener);
|
|
31
|
+
|
|
32
|
+
// In Node.js, adding a 'data' listener puts the stream into flowing mode
|
|
33
|
+
// We need to resume even if ended, because we need to flush buffered data
|
|
34
|
+
if (event === 'data' && !this._flowing) {
|
|
35
|
+
// Use queueMicrotask to allow all listeners to be added first
|
|
36
|
+
queueMicrotask(() => {
|
|
37
|
+
if (this.listenerCount('data') > 0 && !this._flowing) {
|
|
38
|
+
this.resume();
|
|
39
|
+
}
|
|
40
|
+
});
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
return this;
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
// Also handle addListener (alias for on)
|
|
47
|
+
addListener(event: string | symbol, listener: (...args: unknown[]) => void): this {
|
|
48
|
+
return this.on(event, listener);
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
push(chunk: Uint8Array | string | null): boolean {
|
|
52
|
+
if (chunk === null) {
|
|
53
|
+
this._ended = true;
|
|
54
|
+
this.readableEnded = true;
|
|
55
|
+
this.readable = false;
|
|
56
|
+
// Only emit 'end' immediately if already flowing and buffer is empty
|
|
57
|
+
// Otherwise, 'end' will be emitted when resume() flushes the buffer
|
|
58
|
+
if (this._flowing && this._buffer.length === 0 && !this._endEmitted) {
|
|
59
|
+
this._endEmitted = true;
|
|
60
|
+
queueMicrotask(() => this.emit('end'));
|
|
61
|
+
}
|
|
62
|
+
return false;
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
const buffer = typeof chunk === 'string' ? Buffer.from(chunk) : chunk;
|
|
66
|
+
this._buffer.push(buffer);
|
|
67
|
+
|
|
68
|
+
if (this._flowing) {
|
|
69
|
+
queueMicrotask(() => {
|
|
70
|
+
this._flushBuffer();
|
|
71
|
+
});
|
|
72
|
+
}
|
|
73
|
+
|
|
74
|
+
return true;
|
|
75
|
+
}
|
|
76
|
+
|
|
77
|
+
private _flushBuffer(): void {
|
|
78
|
+
while (this._buffer.length > 0 && this._flowing) {
|
|
79
|
+
const data = this._buffer.shift();
|
|
80
|
+
this.emit('data', data);
|
|
81
|
+
}
|
|
82
|
+
// Emit 'end' after buffer is flushed if stream has ended
|
|
83
|
+
if (this._ended && this._buffer.length === 0 && !this._endEmitted) {
|
|
84
|
+
this._endEmitted = true;
|
|
85
|
+
this.emit('end');
|
|
86
|
+
}
|
|
87
|
+
}
|
|
88
|
+
|
|
89
|
+
read(size?: number): Buffer | null {
|
|
90
|
+
if (this._buffer.length === 0) {
|
|
91
|
+
return null;
|
|
92
|
+
}
|
|
93
|
+
|
|
94
|
+
if (size === undefined) {
|
|
95
|
+
const result = Buffer.concat(this._buffer);
|
|
96
|
+
this._buffer = [];
|
|
97
|
+
return result;
|
|
98
|
+
}
|
|
99
|
+
|
|
100
|
+
// Read specific size
|
|
101
|
+
const chunks: Uint8Array[] = [];
|
|
102
|
+
let remaining = size;
|
|
103
|
+
|
|
104
|
+
while (remaining > 0 && this._buffer.length > 0) {
|
|
105
|
+
const chunk = this._buffer[0];
|
|
106
|
+
if (chunk.length <= remaining) {
|
|
107
|
+
chunks.push(this._buffer.shift()!);
|
|
108
|
+
remaining -= chunk.length;
|
|
109
|
+
} else {
|
|
110
|
+
chunks.push(chunk.slice(0, remaining));
|
|
111
|
+
this._buffer[0] = chunk.slice(remaining);
|
|
112
|
+
remaining = 0;
|
|
113
|
+
}
|
|
114
|
+
}
|
|
115
|
+
|
|
116
|
+
return chunks.length > 0 ? Buffer.concat(chunks as BufferPolyfill[]) : null;
|
|
117
|
+
}
|
|
118
|
+
|
|
119
|
+
resume(): this {
|
|
120
|
+
this._flowing = true;
|
|
121
|
+
this.readableFlowing = true;
|
|
122
|
+
|
|
123
|
+
// Flush buffer and emit 'end' if needed
|
|
124
|
+
this._flushBuffer();
|
|
125
|
+
|
|
126
|
+
return this;
|
|
127
|
+
}
|
|
128
|
+
|
|
129
|
+
pause(): this {
|
|
130
|
+
this._flowing = false;
|
|
131
|
+
this.readableFlowing = false;
|
|
132
|
+
return this;
|
|
133
|
+
}
|
|
134
|
+
|
|
135
|
+
pipe<T extends Writable>(destination: T): T {
|
|
136
|
+
this.on('data', (chunk: unknown) => {
|
|
137
|
+
destination.write(chunk as Uint8Array | string);
|
|
138
|
+
});
|
|
139
|
+
|
|
140
|
+
this.on('end', () => {
|
|
141
|
+
destination.end();
|
|
142
|
+
});
|
|
143
|
+
|
|
144
|
+
this.resume();
|
|
145
|
+
return destination;
|
|
146
|
+
}
|
|
147
|
+
|
|
148
|
+
unpipe(destination?: Writable): this {
|
|
149
|
+
this.removeAllListeners('data');
|
|
150
|
+
this.removeAllListeners('end');
|
|
151
|
+
return this;
|
|
152
|
+
}
|
|
153
|
+
|
|
154
|
+
setEncoding(encoding: string): this {
|
|
155
|
+
// Simplified - just store encoding for reference
|
|
156
|
+
return this;
|
|
157
|
+
}
|
|
158
|
+
|
|
159
|
+
destroy(error?: Error): this {
|
|
160
|
+
this._buffer = [];
|
|
161
|
+
this._ended = true;
|
|
162
|
+
this.readable = false;
|
|
163
|
+
if (error) {
|
|
164
|
+
this.emit('error', error);
|
|
165
|
+
}
|
|
166
|
+
this.emit('close');
|
|
167
|
+
return this;
|
|
168
|
+
}
|
|
169
|
+
|
|
170
|
+
/**
|
|
171
|
+
* Creates a Readable stream from an iterable or async iterable
|
|
172
|
+
* @param iterable - An iterable or async iterable to create the stream from
|
|
173
|
+
* @param options - Optional stream options
|
|
174
|
+
*/
|
|
175
|
+
static from(
|
|
176
|
+
iterable: Iterable<unknown> | AsyncIterable<unknown>,
|
|
177
|
+
options?: { objectMode?: boolean; highWaterMark?: number }
|
|
178
|
+
): Readable {
|
|
179
|
+
const readable = new Readable();
|
|
180
|
+
|
|
181
|
+
// Handle async iteration
|
|
182
|
+
(async () => {
|
|
183
|
+
try {
|
|
184
|
+
// Use for-await-of which works with both sync and async iterables
|
|
185
|
+
for await (const chunk of iterable as AsyncIterable<unknown>) {
|
|
186
|
+
if (chunk !== null && chunk !== undefined) {
|
|
187
|
+
// Convert to Buffer if it's a string
|
|
188
|
+
const data = typeof chunk === 'string' ? Buffer.from(chunk) : chunk;
|
|
189
|
+
readable.push(data as Buffer);
|
|
190
|
+
}
|
|
191
|
+
}
|
|
192
|
+
readable.push(null); // Signal end of stream
|
|
193
|
+
} catch (err) {
|
|
194
|
+
readable.destroy(err as Error);
|
|
195
|
+
}
|
|
196
|
+
})();
|
|
197
|
+
|
|
198
|
+
return readable;
|
|
199
|
+
}
|
|
200
|
+
}
|
|
201
|
+
|
|
202
|
+
export class Writable extends EventEmitter {
|
|
203
|
+
private _chunks: Uint8Array[] = [];
|
|
204
|
+
private _ended: boolean = false;
|
|
205
|
+
writable: boolean = true;
|
|
206
|
+
writableEnded: boolean = false;
|
|
207
|
+
writableFinished: boolean = false;
|
|
208
|
+
|
|
209
|
+
constructor() {
|
|
210
|
+
super();
|
|
211
|
+
}
|
|
212
|
+
|
|
213
|
+
write(
|
|
214
|
+
chunk: Uint8Array | string,
|
|
215
|
+
encodingOrCallback?: string | ((error?: Error | null) => void),
|
|
216
|
+
callback?: (error?: Error | null) => void
|
|
217
|
+
): boolean {
|
|
218
|
+
if (this._ended) {
|
|
219
|
+
const error = new Error('write after end');
|
|
220
|
+
if (typeof encodingOrCallback === 'function') {
|
|
221
|
+
encodingOrCallback(error);
|
|
222
|
+
} else if (callback) {
|
|
223
|
+
callback(error);
|
|
224
|
+
}
|
|
225
|
+
return false;
|
|
226
|
+
}
|
|
227
|
+
|
|
228
|
+
const buffer = typeof chunk === 'string' ? Buffer.from(chunk) : chunk;
|
|
229
|
+
this._chunks.push(buffer);
|
|
230
|
+
|
|
231
|
+
const cb = typeof encodingOrCallback === 'function' ? encodingOrCallback : callback;
|
|
232
|
+
if (cb) {
|
|
233
|
+
queueMicrotask(() => cb(null));
|
|
234
|
+
}
|
|
235
|
+
|
|
236
|
+
return true;
|
|
237
|
+
}
|
|
238
|
+
|
|
239
|
+
end(
|
|
240
|
+
chunkOrCallback?: Uint8Array | string | (() => void),
|
|
241
|
+
encodingOrCallback?: string | (() => void),
|
|
242
|
+
callback?: () => void
|
|
243
|
+
): this {
|
|
244
|
+
if (typeof chunkOrCallback === 'function') {
|
|
245
|
+
callback = chunkOrCallback;
|
|
246
|
+
} else if (chunkOrCallback !== undefined) {
|
|
247
|
+
this.write(chunkOrCallback as Uint8Array | string);
|
|
248
|
+
}
|
|
249
|
+
|
|
250
|
+
if (typeof encodingOrCallback === 'function') {
|
|
251
|
+
callback = encodingOrCallback;
|
|
252
|
+
}
|
|
253
|
+
|
|
254
|
+
this._ended = true;
|
|
255
|
+
this.writable = false;
|
|
256
|
+
this.writableEnded = true;
|
|
257
|
+
|
|
258
|
+
queueMicrotask(() => {
|
|
259
|
+
this.writableFinished = true;
|
|
260
|
+
this.emit('finish');
|
|
261
|
+
if (callback) {
|
|
262
|
+
callback();
|
|
263
|
+
}
|
|
264
|
+
});
|
|
265
|
+
|
|
266
|
+
return this;
|
|
267
|
+
}
|
|
268
|
+
|
|
269
|
+
getBuffer(): Buffer {
|
|
270
|
+
return Buffer.concat(this._chunks);
|
|
271
|
+
}
|
|
272
|
+
|
|
273
|
+
getBufferAsString(encoding: BufferEncoding = 'utf8'): string {
|
|
274
|
+
return this.getBuffer().toString(encoding);
|
|
275
|
+
}
|
|
276
|
+
|
|
277
|
+
destroy(error?: Error): this {
|
|
278
|
+
this._chunks = [];
|
|
279
|
+
this._ended = true;
|
|
280
|
+
this.writable = false;
|
|
281
|
+
if (error) {
|
|
282
|
+
this.emit('error', error);
|
|
283
|
+
}
|
|
284
|
+
this.emit('close');
|
|
285
|
+
return this;
|
|
286
|
+
}
|
|
287
|
+
|
|
288
|
+
cork(): void {
|
|
289
|
+
// No-op in this implementation
|
|
290
|
+
}
|
|
291
|
+
|
|
292
|
+
uncork(): void {
|
|
293
|
+
// No-op in this implementation
|
|
294
|
+
}
|
|
295
|
+
|
|
296
|
+
setDefaultEncoding(encoding: string): this {
|
|
297
|
+
return this;
|
|
298
|
+
}
|
|
299
|
+
}
|
|
300
|
+
|
|
301
|
+
export class Duplex extends Readable {
|
|
302
|
+
private _writeChunks: Buffer[] = [];
|
|
303
|
+
private _writeEnded: boolean = false;
|
|
304
|
+
writable: boolean = true;
|
|
305
|
+
writableEnded: boolean = false;
|
|
306
|
+
writableFinished: boolean = false;
|
|
307
|
+
|
|
308
|
+
write(
|
|
309
|
+
chunk: Buffer | string,
|
|
310
|
+
encodingOrCallback?: string | ((error?: Error | null) => void),
|
|
311
|
+
callback?: (error?: Error | null) => void
|
|
312
|
+
): boolean {
|
|
313
|
+
if (this._writeEnded) {
|
|
314
|
+
return false;
|
|
315
|
+
}
|
|
316
|
+
|
|
317
|
+
const buffer = typeof chunk === 'string' ? Buffer.from(chunk) : chunk;
|
|
318
|
+
this._writeChunks.push(buffer);
|
|
319
|
+
|
|
320
|
+
const cb = typeof encodingOrCallback === 'function' ? encodingOrCallback : callback;
|
|
321
|
+
if (cb) {
|
|
322
|
+
queueMicrotask(() => cb(null));
|
|
323
|
+
}
|
|
324
|
+
|
|
325
|
+
return true;
|
|
326
|
+
}
|
|
327
|
+
|
|
328
|
+
end(
|
|
329
|
+
chunkOrCallback?: Buffer | string | (() => void),
|
|
330
|
+
encodingOrCallback?: string | (() => void),
|
|
331
|
+
callback?: () => void
|
|
332
|
+
): this {
|
|
333
|
+
if (typeof chunkOrCallback === 'function') {
|
|
334
|
+
callback = chunkOrCallback;
|
|
335
|
+
} else if (chunkOrCallback !== undefined) {
|
|
336
|
+
this.write(chunkOrCallback as Buffer | string);
|
|
337
|
+
}
|
|
338
|
+
|
|
339
|
+
this._writeEnded = true;
|
|
340
|
+
this.writable = false;
|
|
341
|
+
this.writableEnded = true;
|
|
342
|
+
|
|
343
|
+
queueMicrotask(() => {
|
|
344
|
+
this.writableFinished = true;
|
|
345
|
+
this.emit('finish');
|
|
346
|
+
if (callback) {
|
|
347
|
+
callback();
|
|
348
|
+
}
|
|
349
|
+
});
|
|
350
|
+
|
|
351
|
+
return this;
|
|
352
|
+
}
|
|
353
|
+
}
|
|
354
|
+
|
|
355
|
+
export class PassThrough extends Duplex {
|
|
356
|
+
constructor() {
|
|
357
|
+
super();
|
|
358
|
+
}
|
|
359
|
+
|
|
360
|
+
write(
|
|
361
|
+
chunk: Buffer | string,
|
|
362
|
+
encodingOrCallback?: string | ((error?: Error | null) => void),
|
|
363
|
+
callback?: (error?: Error | null) => void
|
|
364
|
+
): boolean {
|
|
365
|
+
// Pass through to readable side
|
|
366
|
+
const buffer = typeof chunk === 'string' ? Buffer.from(chunk) : chunk;
|
|
367
|
+
this.push(buffer);
|
|
368
|
+
|
|
369
|
+
const cb = typeof encodingOrCallback === 'function' ? encodingOrCallback : callback;
|
|
370
|
+
if (cb) {
|
|
371
|
+
queueMicrotask(() => cb(null));
|
|
372
|
+
}
|
|
373
|
+
|
|
374
|
+
return true;
|
|
375
|
+
}
|
|
376
|
+
}
|
|
377
|
+
|
|
378
|
+
export class Transform extends Duplex {
|
|
379
|
+
constructor() {
|
|
380
|
+
super();
|
|
381
|
+
}
|
|
382
|
+
|
|
383
|
+
_transform(
|
|
384
|
+
chunk: Buffer,
|
|
385
|
+
encoding: string,
|
|
386
|
+
callback: (error?: Error | null, data?: Buffer) => void
|
|
387
|
+
): void {
|
|
388
|
+
// Default: pass through
|
|
389
|
+
callback(null, chunk);
|
|
390
|
+
}
|
|
391
|
+
|
|
392
|
+
_flush(callback: (error?: Error | null, data?: Buffer) => void): void {
|
|
393
|
+
callback(null);
|
|
394
|
+
}
|
|
395
|
+
|
|
396
|
+
write(
|
|
397
|
+
chunk: Buffer | string,
|
|
398
|
+
encodingOrCallback?: string | ((error?: Error | null) => void),
|
|
399
|
+
callback?: (error?: Error | null) => void
|
|
400
|
+
): boolean {
|
|
401
|
+
const buffer = typeof chunk === 'string' ? Buffer.from(chunk) : chunk;
|
|
402
|
+
const encoding = typeof encodingOrCallback === 'string' ? encodingOrCallback : 'utf8';
|
|
403
|
+
const cb = typeof encodingOrCallback === 'function' ? encodingOrCallback : callback;
|
|
404
|
+
|
|
405
|
+
this._transform(buffer, encoding, (error, data) => {
|
|
406
|
+
if (error) {
|
|
407
|
+
if (cb) cb(error);
|
|
408
|
+
return;
|
|
409
|
+
}
|
|
410
|
+
if (data) {
|
|
411
|
+
this.push(data);
|
|
412
|
+
}
|
|
413
|
+
if (cb) cb(null);
|
|
414
|
+
});
|
|
415
|
+
|
|
416
|
+
return true;
|
|
417
|
+
}
|
|
418
|
+
|
|
419
|
+
end(
|
|
420
|
+
chunkOrCallback?: Buffer | string | (() => void),
|
|
421
|
+
encodingOrCallback?: string | (() => void),
|
|
422
|
+
callback?: () => void
|
|
423
|
+
): this {
|
|
424
|
+
// Flush before ending
|
|
425
|
+
this._flush((error, data) => {
|
|
426
|
+
if (data) {
|
|
427
|
+
this.push(data);
|
|
428
|
+
}
|
|
429
|
+
});
|
|
430
|
+
|
|
431
|
+
return super.end(chunkOrCallback, encodingOrCallback, callback);
|
|
432
|
+
}
|
|
433
|
+
}
|
|
434
|
+
|
|
435
|
+
// Base Stream class that some code extends
|
|
436
|
+
export class Stream extends EventEmitter {
|
|
437
|
+
pipe<T extends Writable>(destination: T): T {
|
|
438
|
+
return destination;
|
|
439
|
+
}
|
|
440
|
+
}
|
|
441
|
+
|
|
442
|
+
// Make Stream also have static references to all stream types
|
|
443
|
+
// This allows: const Stream = require('stream'); class X extends Stream {}
|
|
444
|
+
// And also: const { Readable } = require('stream');
|
|
445
|
+
(Stream as unknown as Record<string, unknown>).Readable = Readable;
|
|
446
|
+
(Stream as unknown as Record<string, unknown>).Writable = Writable;
|
|
447
|
+
(Stream as unknown as Record<string, unknown>).Duplex = Duplex;
|
|
448
|
+
(Stream as unknown as Record<string, unknown>).Transform = Transform;
|
|
449
|
+
(Stream as unknown as Record<string, unknown>).PassThrough = PassThrough;
|
|
450
|
+
(Stream as unknown as Record<string, unknown>).Stream = Stream;
|
|
451
|
+
// Also expose Readable.from on Stream for compatibility
|
|
452
|
+
(Stream as unknown as Record<string, unknown>).from = Readable.from;
|
|
453
|
+
|
|
454
|
+
// Promises API
|
|
455
|
+
export const promises = {
|
|
456
|
+
pipeline: async (...streams: unknown[]): Promise<void> => {
|
|
457
|
+
// Simplified pipeline
|
|
458
|
+
return Promise.resolve();
|
|
459
|
+
},
|
|
460
|
+
finished: async (stream: unknown): Promise<void> => {
|
|
461
|
+
return Promise.resolve();
|
|
462
|
+
},
|
|
463
|
+
};
|
|
464
|
+
|
|
465
|
+
export function pipeline(...args: unknown[]): unknown {
|
|
466
|
+
const callback = args[args.length - 1];
|
|
467
|
+
if (typeof callback === 'function') {
|
|
468
|
+
setTimeout(() => (callback as () => void)(), 0);
|
|
469
|
+
}
|
|
470
|
+
return args[args.length - 2] || args[0];
|
|
471
|
+
}
|
|
472
|
+
|
|
473
|
+
export function finished(stream: unknown, callback: (err?: Error) => void): () => void {
|
|
474
|
+
setTimeout(() => callback(), 0);
|
|
475
|
+
return () => {};
|
|
476
|
+
}
|
|
477
|
+
|
|
478
|
+
// Simple Buffer polyfill for browser
|
|
479
|
+
declare global {
|
|
480
|
+
interface Window {
|
|
481
|
+
Buffer: typeof Buffer;
|
|
482
|
+
}
|
|
483
|
+
}
|
|
484
|
+
|
|
485
|
+
class BufferPolyfill extends Uint8Array {
|
|
486
|
+
// BYTES_PER_ELEMENT for TypedArray compatibility
|
|
487
|
+
static readonly BYTES_PER_ELEMENT = 1;
|
|
488
|
+
|
|
489
|
+
// Overloads for Buffer.from compatibility
|
|
490
|
+
static from(arrayLike: ArrayLike<number>): BufferPolyfill;
|
|
491
|
+
static from<T>(arrayLike: ArrayLike<T>, mapfn: (v: T, k: number) => number, thisArg?: unknown): BufferPolyfill;
|
|
492
|
+
static from(data: string, encoding?: string): BufferPolyfill;
|
|
493
|
+
static from(data: ArrayBuffer | Uint8Array): BufferPolyfill;
|
|
494
|
+
static from(data: Iterable<number>): BufferPolyfill;
|
|
495
|
+
static from(
|
|
496
|
+
value: string | ArrayBuffer | Uint8Array | number[] | ArrayLike<number> | Iterable<number>,
|
|
497
|
+
encodingOrMapfn?: string | ((v: unknown, k: number) => number),
|
|
498
|
+
thisArg?: unknown
|
|
499
|
+
): BufferPolyfill {
|
|
500
|
+
// Handle Uint8Array.from signature (mapfn, thisArg)
|
|
501
|
+
if (typeof encodingOrMapfn === 'function') {
|
|
502
|
+
const arrayLike = value as ArrayLike<number>;
|
|
503
|
+
const mapped = Array.from(arrayLike, encodingOrMapfn as (v: number, k: number) => number, thisArg);
|
|
504
|
+
return new BufferPolyfill(mapped);
|
|
505
|
+
}
|
|
506
|
+
|
|
507
|
+
const data = value as string | ArrayBuffer | Uint8Array | number[];
|
|
508
|
+
const encoding = encodingOrMapfn as string | undefined;
|
|
509
|
+
if (Array.isArray(data)) {
|
|
510
|
+
return new BufferPolyfill(data);
|
|
511
|
+
}
|
|
512
|
+
if (typeof data === 'string') {
|
|
513
|
+
const enc = (encoding || 'utf8').toLowerCase();
|
|
514
|
+
|
|
515
|
+
if (enc === 'base64' || enc === 'base64url') {
|
|
516
|
+
// Convert base64url to base64 if needed
|
|
517
|
+
let base64 = data;
|
|
518
|
+
if (enc === 'base64url') {
|
|
519
|
+
base64 = data.replace(/-/g, '+').replace(/_/g, '/');
|
|
520
|
+
// Add padding if needed
|
|
521
|
+
while (base64.length % 4 !== 0) {
|
|
522
|
+
base64 += '=';
|
|
523
|
+
}
|
|
524
|
+
}
|
|
525
|
+
const binary = atob(base64);
|
|
526
|
+
const bytes = new Uint8Array(binary.length);
|
|
527
|
+
for (let i = 0; i < binary.length; i++) {
|
|
528
|
+
bytes[i] = binary.charCodeAt(i);
|
|
529
|
+
}
|
|
530
|
+
return new BufferPolyfill(bytes);
|
|
531
|
+
}
|
|
532
|
+
|
|
533
|
+
if (enc === 'hex') {
|
|
534
|
+
const bytes = new Uint8Array(data.length / 2);
|
|
535
|
+
for (let i = 0; i < data.length; i += 2) {
|
|
536
|
+
bytes[i / 2] = parseInt(data.slice(i, i + 2), 16);
|
|
537
|
+
}
|
|
538
|
+
return new BufferPolyfill(bytes);
|
|
539
|
+
}
|
|
540
|
+
|
|
541
|
+
if (enc === 'latin1' || enc === 'binary') {
|
|
542
|
+
const bytes = new Uint8Array(data.length);
|
|
543
|
+
for (let i = 0; i < data.length; i++) {
|
|
544
|
+
bytes[i] = data.charCodeAt(i) & 0xff;
|
|
545
|
+
}
|
|
546
|
+
return new BufferPolyfill(bytes);
|
|
547
|
+
}
|
|
548
|
+
|
|
549
|
+
// Default: utf8
|
|
550
|
+
const encoder = new TextEncoder();
|
|
551
|
+
const bytes = encoder.encode(data);
|
|
552
|
+
return new BufferPolyfill(bytes);
|
|
553
|
+
}
|
|
554
|
+
if (data instanceof ArrayBuffer) {
|
|
555
|
+
return new BufferPolyfill(data);
|
|
556
|
+
}
|
|
557
|
+
return new BufferPolyfill(data);
|
|
558
|
+
}
|
|
559
|
+
|
|
560
|
+
static alloc(size: number, fill?: number): BufferPolyfill {
|
|
561
|
+
const buffer = new BufferPolyfill(size);
|
|
562
|
+
if (fill !== undefined) {
|
|
563
|
+
buffer.fill(fill);
|
|
564
|
+
}
|
|
565
|
+
return buffer;
|
|
566
|
+
}
|
|
567
|
+
|
|
568
|
+
static allocUnsafe(size: number): BufferPolyfill {
|
|
569
|
+
return new BufferPolyfill(size);
|
|
570
|
+
}
|
|
571
|
+
|
|
572
|
+
static allocUnsafeSlow(size: number): BufferPolyfill {
|
|
573
|
+
return new BufferPolyfill(size);
|
|
574
|
+
}
|
|
575
|
+
|
|
576
|
+
static concat(buffers: (Uint8Array | BufferPolyfill)[]): BufferPolyfill {
|
|
577
|
+
const totalLength = buffers.reduce((sum, buf) => sum + buf.length, 0);
|
|
578
|
+
const result = new BufferPolyfill(totalLength);
|
|
579
|
+
let offset = 0;
|
|
580
|
+
for (const buf of buffers) {
|
|
581
|
+
result.set(buf, offset);
|
|
582
|
+
offset += buf.length;
|
|
583
|
+
}
|
|
584
|
+
return result;
|
|
585
|
+
}
|
|
586
|
+
|
|
587
|
+
static isBuffer(obj: unknown): obj is BufferPolyfill {
|
|
588
|
+
return obj instanceof BufferPolyfill || obj instanceof Uint8Array;
|
|
589
|
+
}
|
|
590
|
+
|
|
591
|
+
static isEncoding(encoding: string): boolean {
|
|
592
|
+
return ['utf8', 'utf-8', 'ascii', 'latin1', 'binary', 'base64', 'base64url', 'hex'].includes(encoding.toLowerCase());
|
|
593
|
+
}
|
|
594
|
+
|
|
595
|
+
static byteLength(string: string, encoding?: string): number {
|
|
596
|
+
const enc = (encoding || 'utf8').toLowerCase();
|
|
597
|
+
if (enc === 'base64' || enc === 'base64url') {
|
|
598
|
+
// Remove padding and calculate
|
|
599
|
+
const base64 = string.replace(/[=]/g, '');
|
|
600
|
+
return Math.floor(base64.length * 3 / 4);
|
|
601
|
+
}
|
|
602
|
+
if (enc === 'hex') {
|
|
603
|
+
return string.length / 2;
|
|
604
|
+
}
|
|
605
|
+
return new TextEncoder().encode(string).length;
|
|
606
|
+
}
|
|
607
|
+
|
|
608
|
+
toString(encoding: BufferEncoding = 'utf8'): string {
|
|
609
|
+
const enc = (encoding || 'utf8').toLowerCase();
|
|
610
|
+
|
|
611
|
+
if (enc === 'base64') {
|
|
612
|
+
let binary = '';
|
|
613
|
+
for (let i = 0; i < this.length; i++) {
|
|
614
|
+
binary += String.fromCharCode(this[i]);
|
|
615
|
+
}
|
|
616
|
+
return btoa(binary);
|
|
617
|
+
}
|
|
618
|
+
|
|
619
|
+
if (enc === 'base64url') {
|
|
620
|
+
let binary = '';
|
|
621
|
+
for (let i = 0; i < this.length; i++) {
|
|
622
|
+
binary += String.fromCharCode(this[i]);
|
|
623
|
+
}
|
|
624
|
+
return btoa(binary).replace(/\+/g, '-').replace(/\//g, '_').replace(/=/g, '');
|
|
625
|
+
}
|
|
626
|
+
|
|
627
|
+
if (enc === 'hex') {
|
|
628
|
+
let hex = '';
|
|
629
|
+
for (let i = 0; i < this.length; i++) {
|
|
630
|
+
hex += this[i].toString(16).padStart(2, '0');
|
|
631
|
+
}
|
|
632
|
+
return hex;
|
|
633
|
+
}
|
|
634
|
+
|
|
635
|
+
if (enc === 'latin1' || enc === 'binary') {
|
|
636
|
+
let str = '';
|
|
637
|
+
for (let i = 0; i < this.length; i++) {
|
|
638
|
+
str += String.fromCharCode(this[i]);
|
|
639
|
+
}
|
|
640
|
+
return str;
|
|
641
|
+
}
|
|
642
|
+
|
|
643
|
+
// Default: utf8
|
|
644
|
+
const decoder = new TextDecoder('utf-8');
|
|
645
|
+
return decoder.decode(this);
|
|
646
|
+
}
|
|
647
|
+
|
|
648
|
+
slice(start?: number, end?: number): BufferPolyfill {
|
|
649
|
+
return new BufferPolyfill(super.slice(start, end));
|
|
650
|
+
}
|
|
651
|
+
|
|
652
|
+
subarray(start?: number, end?: number): BufferPolyfill {
|
|
653
|
+
return new BufferPolyfill(super.subarray(start, end));
|
|
654
|
+
}
|
|
655
|
+
|
|
656
|
+
write(string: string, offset?: number): number {
|
|
657
|
+
const bytes = new TextEncoder().encode(string);
|
|
658
|
+
this.set(bytes, offset || 0);
|
|
659
|
+
return bytes.length;
|
|
660
|
+
}
|
|
661
|
+
|
|
662
|
+
copy(target: BufferPolyfill, targetStart?: number, sourceStart?: number, sourceEnd?: number): number {
|
|
663
|
+
const src = this.subarray(sourceStart || 0, sourceEnd);
|
|
664
|
+
target.set(src, targetStart || 0);
|
|
665
|
+
return src.length;
|
|
666
|
+
}
|
|
667
|
+
|
|
668
|
+
compare(otherBuffer: Uint8Array): number {
|
|
669
|
+
const len = Math.min(this.length, otherBuffer.length);
|
|
670
|
+
for (let i = 0; i < len; i++) {
|
|
671
|
+
if (this[i] < otherBuffer[i]) return -1;
|
|
672
|
+
if (this[i] > otherBuffer[i]) return 1;
|
|
673
|
+
}
|
|
674
|
+
if (this.length < otherBuffer.length) return -1;
|
|
675
|
+
if (this.length > otherBuffer.length) return 1;
|
|
676
|
+
return 0;
|
|
677
|
+
}
|
|
678
|
+
|
|
679
|
+
equals(otherBuffer: Uint8Array): boolean {
|
|
680
|
+
return this.compare(otherBuffer) === 0;
|
|
681
|
+
}
|
|
682
|
+
|
|
683
|
+
toJSON(): { type: string; data: number[] } {
|
|
684
|
+
return {
|
|
685
|
+
type: 'Buffer',
|
|
686
|
+
data: Array.from(this)
|
|
687
|
+
};
|
|
688
|
+
}
|
|
689
|
+
|
|
690
|
+
// Add Object prototype methods that TypedArrays don't have directly
|
|
691
|
+
hasOwnProperty(prop: PropertyKey): boolean {
|
|
692
|
+
return Object.prototype.hasOwnProperty.call(this, prop);
|
|
693
|
+
}
|
|
694
|
+
|
|
695
|
+
readUInt8(offset: number): number {
|
|
696
|
+
return this[offset];
|
|
697
|
+
}
|
|
698
|
+
|
|
699
|
+
readUInt16BE(offset: number): number {
|
|
700
|
+
return (this[offset] << 8) | this[offset + 1];
|
|
701
|
+
}
|
|
702
|
+
|
|
703
|
+
readUInt16LE(offset: number): number {
|
|
704
|
+
return this[offset] | (this[offset + 1] << 8);
|
|
705
|
+
}
|
|
706
|
+
|
|
707
|
+
readUInt32BE(offset: number): number {
|
|
708
|
+
return (this[offset] << 24) | (this[offset + 1] << 16) | (this[offset + 2] << 8) | this[offset + 3];
|
|
709
|
+
}
|
|
710
|
+
|
|
711
|
+
readUInt32LE(offset: number): number {
|
|
712
|
+
return this[offset] | (this[offset + 1] << 8) | (this[offset + 2] << 16) | (this[offset + 3] << 24);
|
|
713
|
+
}
|
|
714
|
+
|
|
715
|
+
writeUInt8(value: number, offset: number): number {
|
|
716
|
+
this[offset] = value & 0xff;
|
|
717
|
+
return offset + 1;
|
|
718
|
+
}
|
|
719
|
+
|
|
720
|
+
writeUInt16BE(value: number, offset: number): number {
|
|
721
|
+
this[offset] = (value >> 8) & 0xff;
|
|
722
|
+
this[offset + 1] = value & 0xff;
|
|
723
|
+
return offset + 2;
|
|
724
|
+
}
|
|
725
|
+
|
|
726
|
+
writeUInt16LE(value: number, offset: number): number {
|
|
727
|
+
this[offset] = value & 0xff;
|
|
728
|
+
this[offset + 1] = (value >> 8) & 0xff;
|
|
729
|
+
return offset + 2;
|
|
730
|
+
}
|
|
731
|
+
|
|
732
|
+
writeUInt32BE(value: number, offset: number): number {
|
|
733
|
+
this[offset] = (value >> 24) & 0xff;
|
|
734
|
+
this[offset + 1] = (value >> 16) & 0xff;
|
|
735
|
+
this[offset + 2] = (value >> 8) & 0xff;
|
|
736
|
+
this[offset + 3] = value & 0xff;
|
|
737
|
+
return offset + 4;
|
|
738
|
+
}
|
|
739
|
+
|
|
740
|
+
writeUInt32LE(value: number, offset: number): number {
|
|
741
|
+
this[offset] = value & 0xff;
|
|
742
|
+
this[offset + 1] = (value >> 8) & 0xff;
|
|
743
|
+
this[offset + 2] = (value >> 16) & 0xff;
|
|
744
|
+
this[offset + 3] = (value >> 24) & 0xff;
|
|
745
|
+
return offset + 4;
|
|
746
|
+
}
|
|
747
|
+
|
|
748
|
+
// Lowercase aliases for UInt methods (Node.js Buffer API compatibility)
|
|
749
|
+
readUint8(offset: number): number {
|
|
750
|
+
return this.readUInt8(offset);
|
|
751
|
+
}
|
|
752
|
+
|
|
753
|
+
readUint16BE(offset: number): number {
|
|
754
|
+
return this.readUInt16BE(offset);
|
|
755
|
+
}
|
|
756
|
+
|
|
757
|
+
readUint16LE(offset: number): number {
|
|
758
|
+
return this.readUInt16LE(offset);
|
|
759
|
+
}
|
|
760
|
+
|
|
761
|
+
readUint32BE(offset: number): number {
|
|
762
|
+
return this.readUInt32BE(offset);
|
|
763
|
+
}
|
|
764
|
+
|
|
765
|
+
readUint32LE(offset: number): number {
|
|
766
|
+
return this.readUInt32LE(offset);
|
|
767
|
+
}
|
|
768
|
+
|
|
769
|
+
writeUint8(value: number, offset: number): number {
|
|
770
|
+
return this.writeUInt8(value, offset);
|
|
771
|
+
}
|
|
772
|
+
|
|
773
|
+
writeUint16BE(value: number, offset: number): number {
|
|
774
|
+
return this.writeUInt16BE(value, offset);
|
|
775
|
+
}
|
|
776
|
+
|
|
777
|
+
writeUint16LE(value: number, offset: number): number {
|
|
778
|
+
return this.writeUInt16LE(value, offset);
|
|
779
|
+
}
|
|
780
|
+
|
|
781
|
+
writeUint32BE(value: number, offset: number): number {
|
|
782
|
+
return this.writeUInt32BE(value, offset);
|
|
783
|
+
}
|
|
784
|
+
|
|
785
|
+
writeUint32LE(value: number, offset: number): number {
|
|
786
|
+
return this.writeUInt32LE(value, offset);
|
|
787
|
+
}
|
|
788
|
+
|
|
789
|
+
// Signed integer methods
|
|
790
|
+
readInt8(offset: number): number {
|
|
791
|
+
const val = this[offset];
|
|
792
|
+
return val & 0x80 ? val - 0x100 : val;
|
|
793
|
+
}
|
|
794
|
+
|
|
795
|
+
readInt16BE(offset: number): number {
|
|
796
|
+
const val = this.readUInt16BE(offset);
|
|
797
|
+
return val & 0x8000 ? val - 0x10000 : val;
|
|
798
|
+
}
|
|
799
|
+
|
|
800
|
+
readInt16LE(offset: number): number {
|
|
801
|
+
const val = this.readUInt16LE(offset);
|
|
802
|
+
return val & 0x8000 ? val - 0x10000 : val;
|
|
803
|
+
}
|
|
804
|
+
|
|
805
|
+
readInt32BE(offset: number): number {
|
|
806
|
+
const val = this.readUInt32BE(offset);
|
|
807
|
+
return val | 0; // Convert to signed 32-bit
|
|
808
|
+
}
|
|
809
|
+
|
|
810
|
+
readInt32LE(offset: number): number {
|
|
811
|
+
const val = this.readUInt32LE(offset);
|
|
812
|
+
return val | 0; // Convert to signed 32-bit
|
|
813
|
+
}
|
|
814
|
+
|
|
815
|
+
writeInt8(value: number, offset: number): number {
|
|
816
|
+
this[offset] = value & 0xff;
|
|
817
|
+
return offset + 1;
|
|
818
|
+
}
|
|
819
|
+
|
|
820
|
+
writeInt16BE(value: number, offset: number): number {
|
|
821
|
+
return this.writeUInt16BE(value & 0xffff, offset);
|
|
822
|
+
}
|
|
823
|
+
|
|
824
|
+
writeInt16LE(value: number, offset: number): number {
|
|
825
|
+
return this.writeUInt16LE(value & 0xffff, offset);
|
|
826
|
+
}
|
|
827
|
+
|
|
828
|
+
writeInt32BE(value: number, offset: number): number {
|
|
829
|
+
return this.writeUInt32BE(value >>> 0, offset);
|
|
830
|
+
}
|
|
831
|
+
|
|
832
|
+
writeInt32LE(value: number, offset: number): number {
|
|
833
|
+
return this.writeUInt32LE(value >>> 0, offset);
|
|
834
|
+
}
|
|
835
|
+
|
|
836
|
+
// BigInt methods (64-bit)
|
|
837
|
+
readBigUInt64LE(offset: number): bigint {
|
|
838
|
+
const lo = BigInt(this[offset] | (this[offset + 1] << 8) | (this[offset + 2] << 16) | (this[offset + 3] << 24)) & 0xffffffffn;
|
|
839
|
+
const hi = BigInt(this[offset + 4] | (this[offset + 5] << 8) | (this[offset + 6] << 16) | (this[offset + 7] << 24)) & 0xffffffffn;
|
|
840
|
+
return lo | (hi << 32n);
|
|
841
|
+
}
|
|
842
|
+
|
|
843
|
+
readBigUInt64BE(offset: number): bigint {
|
|
844
|
+
const hi = BigInt(this[offset] << 24 | this[offset + 1] << 16 | this[offset + 2] << 8 | this[offset + 3]) & 0xffffffffn;
|
|
845
|
+
const lo = BigInt(this[offset + 4] << 24 | this[offset + 5] << 16 | this[offset + 6] << 8 | this[offset + 7]) & 0xffffffffn;
|
|
846
|
+
return lo | (hi << 32n);
|
|
847
|
+
}
|
|
848
|
+
|
|
849
|
+
readBigInt64LE(offset: number): bigint {
|
|
850
|
+
const val = this.readBigUInt64LE(offset);
|
|
851
|
+
// If high bit is set, it's negative
|
|
852
|
+
if (val >= 0x8000000000000000n) {
|
|
853
|
+
return val - 0x10000000000000000n;
|
|
854
|
+
}
|
|
855
|
+
return val;
|
|
856
|
+
}
|
|
857
|
+
|
|
858
|
+
readBigInt64BE(offset: number): bigint {
|
|
859
|
+
const val = this.readBigUInt64BE(offset);
|
|
860
|
+
// If high bit is set, it's negative
|
|
861
|
+
if (val >= 0x8000000000000000n) {
|
|
862
|
+
return val - 0x10000000000000000n;
|
|
863
|
+
}
|
|
864
|
+
return val;
|
|
865
|
+
}
|
|
866
|
+
|
|
867
|
+
writeBigUInt64LE(value: bigint, offset: number): number {
|
|
868
|
+
const lo = value & 0xffffffffn;
|
|
869
|
+
const hi = (value >> 32n) & 0xffffffffn;
|
|
870
|
+
this[offset] = Number(lo & 0xffn);
|
|
871
|
+
this[offset + 1] = Number((lo >> 8n) & 0xffn);
|
|
872
|
+
this[offset + 2] = Number((lo >> 16n) & 0xffn);
|
|
873
|
+
this[offset + 3] = Number((lo >> 24n) & 0xffn);
|
|
874
|
+
this[offset + 4] = Number(hi & 0xffn);
|
|
875
|
+
this[offset + 5] = Number((hi >> 8n) & 0xffn);
|
|
876
|
+
this[offset + 6] = Number((hi >> 16n) & 0xffn);
|
|
877
|
+
this[offset + 7] = Number((hi >> 24n) & 0xffn);
|
|
878
|
+
return offset + 8;
|
|
879
|
+
}
|
|
880
|
+
|
|
881
|
+
writeBigUInt64BE(value: bigint, offset: number): number {
|
|
882
|
+
const lo = value & 0xffffffffn;
|
|
883
|
+
const hi = (value >> 32n) & 0xffffffffn;
|
|
884
|
+
this[offset] = Number((hi >> 24n) & 0xffn);
|
|
885
|
+
this[offset + 1] = Number((hi >> 16n) & 0xffn);
|
|
886
|
+
this[offset + 2] = Number((hi >> 8n) & 0xffn);
|
|
887
|
+
this[offset + 3] = Number(hi & 0xffn);
|
|
888
|
+
this[offset + 4] = Number((lo >> 24n) & 0xffn);
|
|
889
|
+
this[offset + 5] = Number((lo >> 16n) & 0xffn);
|
|
890
|
+
this[offset + 6] = Number((lo >> 8n) & 0xffn);
|
|
891
|
+
this[offset + 7] = Number(lo & 0xffn);
|
|
892
|
+
return offset + 8;
|
|
893
|
+
}
|
|
894
|
+
|
|
895
|
+
writeBigInt64LE(value: bigint, offset: number): number {
|
|
896
|
+
// Convert signed to unsigned representation
|
|
897
|
+
const unsigned = value < 0n ? value + 0x10000000000000000n : value;
|
|
898
|
+
return this.writeBigUInt64LE(unsigned, offset);
|
|
899
|
+
}
|
|
900
|
+
|
|
901
|
+
writeBigInt64BE(value: bigint, offset: number): number {
|
|
902
|
+
// Convert signed to unsigned representation
|
|
903
|
+
const unsigned = value < 0n ? value + 0x10000000000000000n : value;
|
|
904
|
+
return this.writeBigUInt64BE(unsigned, offset);
|
|
905
|
+
}
|
|
906
|
+
|
|
907
|
+
// Lowercase aliases for BigInt methods (Node.js Buffer API compatibility)
|
|
908
|
+
readBigUint64LE(offset: number): bigint {
|
|
909
|
+
return this.readBigUInt64LE(offset);
|
|
910
|
+
}
|
|
911
|
+
|
|
912
|
+
readBigUint64BE(offset: number): bigint {
|
|
913
|
+
return this.readBigUInt64BE(offset);
|
|
914
|
+
}
|
|
915
|
+
|
|
916
|
+
writeBigUint64LE(value: bigint, offset: number): number {
|
|
917
|
+
return this.writeBigUInt64LE(value, offset);
|
|
918
|
+
}
|
|
919
|
+
|
|
920
|
+
writeBigUint64BE(value: bigint, offset: number): number {
|
|
921
|
+
return this.writeBigUInt64BE(value, offset);
|
|
922
|
+
}
|
|
923
|
+
|
|
924
|
+
// Float methods
|
|
925
|
+
readFloatLE(offset: number): number {
|
|
926
|
+
const view = new DataView(this.buffer, this.byteOffset + offset, 4);
|
|
927
|
+
return view.getFloat32(0, true);
|
|
928
|
+
}
|
|
929
|
+
|
|
930
|
+
readFloatBE(offset: number): number {
|
|
931
|
+
const view = new DataView(this.buffer, this.byteOffset + offset, 4);
|
|
932
|
+
return view.getFloat32(0, false);
|
|
933
|
+
}
|
|
934
|
+
|
|
935
|
+
readDoubleLE(offset: number): number {
|
|
936
|
+
const view = new DataView(this.buffer, this.byteOffset + offset, 8);
|
|
937
|
+
return view.getFloat64(0, true);
|
|
938
|
+
}
|
|
939
|
+
|
|
940
|
+
readDoubleBE(offset: number): number {
|
|
941
|
+
const view = new DataView(this.buffer, this.byteOffset + offset, 8);
|
|
942
|
+
return view.getFloat64(0, false);
|
|
943
|
+
}
|
|
944
|
+
|
|
945
|
+
writeFloatLE(value: number, offset: number): number {
|
|
946
|
+
const view = new DataView(this.buffer, this.byteOffset + offset, 4);
|
|
947
|
+
view.setFloat32(0, value, true);
|
|
948
|
+
return offset + 4;
|
|
949
|
+
}
|
|
950
|
+
|
|
951
|
+
writeFloatBE(value: number, offset: number): number {
|
|
952
|
+
const view = new DataView(this.buffer, this.byteOffset + offset, 4);
|
|
953
|
+
view.setFloat32(0, value, false);
|
|
954
|
+
return offset + 4;
|
|
955
|
+
}
|
|
956
|
+
|
|
957
|
+
writeDoubleLE(value: number, offset: number): number {
|
|
958
|
+
const view = new DataView(this.buffer, this.byteOffset + offset, 8);
|
|
959
|
+
view.setFloat64(0, value, true);
|
|
960
|
+
return offset + 8;
|
|
961
|
+
}
|
|
962
|
+
|
|
963
|
+
writeDoubleBE(value: number, offset: number): number {
|
|
964
|
+
const view = new DataView(this.buffer, this.byteOffset + offset, 8);
|
|
965
|
+
view.setFloat64(0, value, false);
|
|
966
|
+
return offset + 8;
|
|
967
|
+
}
|
|
968
|
+
|
|
969
|
+
// Variable-length unsigned integer methods
|
|
970
|
+
readUIntLE(offset: number, byteLength: number): number {
|
|
971
|
+
let val = 0;
|
|
972
|
+
let mul = 1;
|
|
973
|
+
for (let i = 0; i < byteLength; i++) {
|
|
974
|
+
val += this[offset + i] * mul;
|
|
975
|
+
mul *= 0x100;
|
|
976
|
+
}
|
|
977
|
+
return val;
|
|
978
|
+
}
|
|
979
|
+
|
|
980
|
+
readUintLE(offset: number, byteLength: number): number {
|
|
981
|
+
return this.readUIntLE(offset, byteLength);
|
|
982
|
+
}
|
|
983
|
+
|
|
984
|
+
readUIntBE(offset: number, byteLength: number): number {
|
|
985
|
+
let val = 0;
|
|
986
|
+
let mul = 1;
|
|
987
|
+
for (let i = byteLength - 1; i >= 0; i--) {
|
|
988
|
+
val += this[offset + i] * mul;
|
|
989
|
+
mul *= 0x100;
|
|
990
|
+
}
|
|
991
|
+
return val;
|
|
992
|
+
}
|
|
993
|
+
|
|
994
|
+
readUintBE(offset: number, byteLength: number): number {
|
|
995
|
+
return this.readUIntBE(offset, byteLength);
|
|
996
|
+
}
|
|
997
|
+
|
|
998
|
+
readIntLE(offset: number, byteLength: number): number {
|
|
999
|
+
let val = this.readUIntLE(offset, byteLength);
|
|
1000
|
+
const limit = Math.pow(2, (byteLength * 8) - 1);
|
|
1001
|
+
if (val >= limit) {
|
|
1002
|
+
val -= Math.pow(2, byteLength * 8);
|
|
1003
|
+
}
|
|
1004
|
+
return val;
|
|
1005
|
+
}
|
|
1006
|
+
|
|
1007
|
+
readIntBE(offset: number, byteLength: number): number {
|
|
1008
|
+
let val = this.readUIntBE(offset, byteLength);
|
|
1009
|
+
const limit = Math.pow(2, (byteLength * 8) - 1);
|
|
1010
|
+
if (val >= limit) {
|
|
1011
|
+
val -= Math.pow(2, byteLength * 8);
|
|
1012
|
+
}
|
|
1013
|
+
return val;
|
|
1014
|
+
}
|
|
1015
|
+
|
|
1016
|
+
writeUIntLE(value: number, offset: number, byteLength: number): number {
|
|
1017
|
+
let val = value;
|
|
1018
|
+
for (let i = 0; i < byteLength; i++) {
|
|
1019
|
+
this[offset + i] = val & 0xff;
|
|
1020
|
+
val = Math.floor(val / 0x100);
|
|
1021
|
+
}
|
|
1022
|
+
return offset + byteLength;
|
|
1023
|
+
}
|
|
1024
|
+
|
|
1025
|
+
writeUintLE(value: number, offset: number, byteLength: number): number {
|
|
1026
|
+
return this.writeUIntLE(value, offset, byteLength);
|
|
1027
|
+
}
|
|
1028
|
+
|
|
1029
|
+
writeUIntBE(value: number, offset: number, byteLength: number): number {
|
|
1030
|
+
let val = value;
|
|
1031
|
+
for (let i = byteLength - 1; i >= 0; i--) {
|
|
1032
|
+
this[offset + i] = val & 0xff;
|
|
1033
|
+
val = Math.floor(val / 0x100);
|
|
1034
|
+
}
|
|
1035
|
+
return offset + byteLength;
|
|
1036
|
+
}
|
|
1037
|
+
|
|
1038
|
+
writeUintBE(value: number, offset: number, byteLength: number): number {
|
|
1039
|
+
return this.writeUIntBE(value, offset, byteLength);
|
|
1040
|
+
}
|
|
1041
|
+
|
|
1042
|
+
writeIntLE(value: number, offset: number, byteLength: number): number {
|
|
1043
|
+
let val = value;
|
|
1044
|
+
if (val < 0) {
|
|
1045
|
+
val += Math.pow(2, byteLength * 8);
|
|
1046
|
+
}
|
|
1047
|
+
return this.writeUIntLE(val, offset, byteLength);
|
|
1048
|
+
}
|
|
1049
|
+
|
|
1050
|
+
writeIntBE(value: number, offset: number, byteLength: number): number {
|
|
1051
|
+
let val = value;
|
|
1052
|
+
if (val < 0) {
|
|
1053
|
+
val += Math.pow(2, byteLength * 8);
|
|
1054
|
+
}
|
|
1055
|
+
return this.writeUIntBE(val, offset, byteLength);
|
|
1056
|
+
}
|
|
1057
|
+
|
|
1058
|
+
// Swap methods
|
|
1059
|
+
swap16(): this {
|
|
1060
|
+
const len = this.length;
|
|
1061
|
+
if (len % 2 !== 0) {
|
|
1062
|
+
throw new RangeError('Buffer size must be a multiple of 16-bits');
|
|
1063
|
+
}
|
|
1064
|
+
for (let i = 0; i < len; i += 2) {
|
|
1065
|
+
const a = this[i];
|
|
1066
|
+
this[i] = this[i + 1];
|
|
1067
|
+
this[i + 1] = a;
|
|
1068
|
+
}
|
|
1069
|
+
return this;
|
|
1070
|
+
}
|
|
1071
|
+
|
|
1072
|
+
swap32(): this {
|
|
1073
|
+
const len = this.length;
|
|
1074
|
+
if (len % 4 !== 0) {
|
|
1075
|
+
throw new RangeError('Buffer size must be a multiple of 32-bits');
|
|
1076
|
+
}
|
|
1077
|
+
for (let i = 0; i < len; i += 4) {
|
|
1078
|
+
const a = this[i];
|
|
1079
|
+
const b = this[i + 1];
|
|
1080
|
+
this[i] = this[i + 3];
|
|
1081
|
+
this[i + 1] = this[i + 2];
|
|
1082
|
+
this[i + 2] = b;
|
|
1083
|
+
this[i + 3] = a;
|
|
1084
|
+
}
|
|
1085
|
+
return this;
|
|
1086
|
+
}
|
|
1087
|
+
|
|
1088
|
+
swap64(): this {
|
|
1089
|
+
const len = this.length;
|
|
1090
|
+
if (len % 8 !== 0) {
|
|
1091
|
+
throw new RangeError('Buffer size must be a multiple of 64-bits');
|
|
1092
|
+
}
|
|
1093
|
+
for (let i = 0; i < len; i += 8) {
|
|
1094
|
+
const a = this[i];
|
|
1095
|
+
const b = this[i + 1];
|
|
1096
|
+
const c = this[i + 2];
|
|
1097
|
+
const d = this[i + 3];
|
|
1098
|
+
this[i] = this[i + 7];
|
|
1099
|
+
this[i + 1] = this[i + 6];
|
|
1100
|
+
this[i + 2] = this[i + 5];
|
|
1101
|
+
this[i + 3] = this[i + 4];
|
|
1102
|
+
this[i + 4] = d;
|
|
1103
|
+
this[i + 5] = c;
|
|
1104
|
+
this[i + 6] = b;
|
|
1105
|
+
this[i + 7] = a;
|
|
1106
|
+
}
|
|
1107
|
+
return this;
|
|
1108
|
+
}
|
|
1109
|
+
}
|
|
1110
|
+
|
|
1111
|
+
// Set global Buffer if not defined
|
|
1112
|
+
if (typeof globalThis.Buffer === 'undefined') {
|
|
1113
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
1114
|
+
(globalThis as any).Buffer = BufferPolyfill;
|
|
1115
|
+
}
|
|
1116
|
+
|
|
1117
|
+
export { BufferPolyfill as Buffer };
|
|
1118
|
+
|
|
1119
|
+
// Add remaining properties to Stream for require('stream') compatibility
|
|
1120
|
+
(Stream as unknown as Record<string, unknown>).pipeline = pipeline;
|
|
1121
|
+
(Stream as unknown as Record<string, unknown>).finished = finished;
|
|
1122
|
+
(Stream as unknown as Record<string, unknown>).promises = promises;
|
|
1123
|
+
|
|
1124
|
+
// Export Stream as default so `require('stream')` returns Stream class
|
|
1125
|
+
// which can be extended and also has all stream types as properties
|
|
1126
|
+
export default Stream;
|