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.
Files changed (216) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +731 -0
  3. package/dist/__sw__.js +394 -0
  4. package/dist/ai-chatbot-demo-entry.d.ts +6 -0
  5. package/dist/ai-chatbot-demo-entry.d.ts.map +1 -0
  6. package/dist/ai-chatbot-demo.d.ts +42 -0
  7. package/dist/ai-chatbot-demo.d.ts.map +1 -0
  8. package/dist/assets/runtime-worker-D9x_Ddwz.js +60543 -0
  9. package/dist/assets/runtime-worker-D9x_Ddwz.js.map +1 -0
  10. package/dist/convex-app-demo-entry.d.ts +6 -0
  11. package/dist/convex-app-demo-entry.d.ts.map +1 -0
  12. package/dist/convex-app-demo.d.ts +68 -0
  13. package/dist/convex-app-demo.d.ts.map +1 -0
  14. package/dist/cors-proxy.d.ts +46 -0
  15. package/dist/cors-proxy.d.ts.map +1 -0
  16. package/dist/create-runtime.d.ts +42 -0
  17. package/dist/create-runtime.d.ts.map +1 -0
  18. package/dist/demo.d.ts +6 -0
  19. package/dist/demo.d.ts.map +1 -0
  20. package/dist/dev-server.d.ts +97 -0
  21. package/dist/dev-server.d.ts.map +1 -0
  22. package/dist/frameworks/next-dev-server.d.ts +202 -0
  23. package/dist/frameworks/next-dev-server.d.ts.map +1 -0
  24. package/dist/frameworks/vite-dev-server.d.ts +85 -0
  25. package/dist/frameworks/vite-dev-server.d.ts.map +1 -0
  26. package/dist/index.cjs +14965 -0
  27. package/dist/index.cjs.map +1 -0
  28. package/dist/index.d.ts +71 -0
  29. package/dist/index.d.ts.map +1 -0
  30. package/dist/index.mjs +14867 -0
  31. package/dist/index.mjs.map +1 -0
  32. package/dist/next-demo.d.ts +49 -0
  33. package/dist/next-demo.d.ts.map +1 -0
  34. package/dist/npm/index.d.ts +71 -0
  35. package/dist/npm/index.d.ts.map +1 -0
  36. package/dist/npm/registry.d.ts +66 -0
  37. package/dist/npm/registry.d.ts.map +1 -0
  38. package/dist/npm/resolver.d.ts +52 -0
  39. package/dist/npm/resolver.d.ts.map +1 -0
  40. package/dist/npm/tarball.d.ts +29 -0
  41. package/dist/npm/tarball.d.ts.map +1 -0
  42. package/dist/runtime-interface.d.ts +90 -0
  43. package/dist/runtime-interface.d.ts.map +1 -0
  44. package/dist/runtime.d.ts +103 -0
  45. package/dist/runtime.d.ts.map +1 -0
  46. package/dist/sandbox-helpers.d.ts +43 -0
  47. package/dist/sandbox-helpers.d.ts.map +1 -0
  48. package/dist/sandbox-runtime.d.ts +65 -0
  49. package/dist/sandbox-runtime.d.ts.map +1 -0
  50. package/dist/server-bridge.d.ts +89 -0
  51. package/dist/server-bridge.d.ts.map +1 -0
  52. package/dist/shims/assert.d.ts +51 -0
  53. package/dist/shims/assert.d.ts.map +1 -0
  54. package/dist/shims/async_hooks.d.ts +37 -0
  55. package/dist/shims/async_hooks.d.ts.map +1 -0
  56. package/dist/shims/buffer.d.ts +20 -0
  57. package/dist/shims/buffer.d.ts.map +1 -0
  58. package/dist/shims/child_process-browser.d.ts +92 -0
  59. package/dist/shims/child_process-browser.d.ts.map +1 -0
  60. package/dist/shims/child_process.d.ts +93 -0
  61. package/dist/shims/child_process.d.ts.map +1 -0
  62. package/dist/shims/chokidar.d.ts +55 -0
  63. package/dist/shims/chokidar.d.ts.map +1 -0
  64. package/dist/shims/cluster.d.ts +52 -0
  65. package/dist/shims/cluster.d.ts.map +1 -0
  66. package/dist/shims/crypto.d.ts +122 -0
  67. package/dist/shims/crypto.d.ts.map +1 -0
  68. package/dist/shims/dgram.d.ts +34 -0
  69. package/dist/shims/dgram.d.ts.map +1 -0
  70. package/dist/shims/diagnostics_channel.d.ts +80 -0
  71. package/dist/shims/diagnostics_channel.d.ts.map +1 -0
  72. package/dist/shims/dns.d.ts +87 -0
  73. package/dist/shims/dns.d.ts.map +1 -0
  74. package/dist/shims/domain.d.ts +25 -0
  75. package/dist/shims/domain.d.ts.map +1 -0
  76. package/dist/shims/esbuild.d.ts +105 -0
  77. package/dist/shims/esbuild.d.ts.map +1 -0
  78. package/dist/shims/events.d.ts +37 -0
  79. package/dist/shims/events.d.ts.map +1 -0
  80. package/dist/shims/fs.d.ts +115 -0
  81. package/dist/shims/fs.d.ts.map +1 -0
  82. package/dist/shims/fsevents.d.ts +67 -0
  83. package/dist/shims/fsevents.d.ts.map +1 -0
  84. package/dist/shims/http.d.ts +217 -0
  85. package/dist/shims/http.d.ts.map +1 -0
  86. package/dist/shims/http2.d.ts +81 -0
  87. package/dist/shims/http2.d.ts.map +1 -0
  88. package/dist/shims/https.d.ts +36 -0
  89. package/dist/shims/https.d.ts.map +1 -0
  90. package/dist/shims/inspector.d.ts +25 -0
  91. package/dist/shims/inspector.d.ts.map +1 -0
  92. package/dist/shims/module.d.ts +22 -0
  93. package/dist/shims/module.d.ts.map +1 -0
  94. package/dist/shims/net.d.ts +100 -0
  95. package/dist/shims/net.d.ts.map +1 -0
  96. package/dist/shims/os.d.ts +159 -0
  97. package/dist/shims/os.d.ts.map +1 -0
  98. package/dist/shims/path.d.ts +72 -0
  99. package/dist/shims/path.d.ts.map +1 -0
  100. package/dist/shims/perf_hooks.d.ts +50 -0
  101. package/dist/shims/perf_hooks.d.ts.map +1 -0
  102. package/dist/shims/process.d.ts +93 -0
  103. package/dist/shims/process.d.ts.map +1 -0
  104. package/dist/shims/querystring.d.ts +23 -0
  105. package/dist/shims/querystring.d.ts.map +1 -0
  106. package/dist/shims/readdirp.d.ts +52 -0
  107. package/dist/shims/readdirp.d.ts.map +1 -0
  108. package/dist/shims/readline.d.ts +62 -0
  109. package/dist/shims/readline.d.ts.map +1 -0
  110. package/dist/shims/rollup.d.ts +34 -0
  111. package/dist/shims/rollup.d.ts.map +1 -0
  112. package/dist/shims/sentry.d.ts +163 -0
  113. package/dist/shims/sentry.d.ts.map +1 -0
  114. package/dist/shims/stream.d.ts +181 -0
  115. package/dist/shims/stream.d.ts.map +1 -0
  116. package/dist/shims/tls.d.ts +53 -0
  117. package/dist/shims/tls.d.ts.map +1 -0
  118. package/dist/shims/tty.d.ts +30 -0
  119. package/dist/shims/tty.d.ts.map +1 -0
  120. package/dist/shims/url.d.ts +64 -0
  121. package/dist/shims/url.d.ts.map +1 -0
  122. package/dist/shims/util.d.ts +106 -0
  123. package/dist/shims/util.d.ts.map +1 -0
  124. package/dist/shims/v8.d.ts +73 -0
  125. package/dist/shims/v8.d.ts.map +1 -0
  126. package/dist/shims/vfs-adapter.d.ts +126 -0
  127. package/dist/shims/vfs-adapter.d.ts.map +1 -0
  128. package/dist/shims/vm.d.ts +45 -0
  129. package/dist/shims/vm.d.ts.map +1 -0
  130. package/dist/shims/worker_threads.d.ts +66 -0
  131. package/dist/shims/worker_threads.d.ts.map +1 -0
  132. package/dist/shims/ws.d.ts +66 -0
  133. package/dist/shims/ws.d.ts.map +1 -0
  134. package/dist/shims/zlib.d.ts +161 -0
  135. package/dist/shims/zlib.d.ts.map +1 -0
  136. package/dist/transform.d.ts +24 -0
  137. package/dist/transform.d.ts.map +1 -0
  138. package/dist/virtual-fs.d.ts +226 -0
  139. package/dist/virtual-fs.d.ts.map +1 -0
  140. package/dist/vite-demo.d.ts +35 -0
  141. package/dist/vite-demo.d.ts.map +1 -0
  142. package/dist/vite-sw.js +132 -0
  143. package/dist/worker/runtime-worker.d.ts +8 -0
  144. package/dist/worker/runtime-worker.d.ts.map +1 -0
  145. package/dist/worker-runtime.d.ts +50 -0
  146. package/dist/worker-runtime.d.ts.map +1 -0
  147. package/package.json +85 -0
  148. package/src/ai-chatbot-demo-entry.ts +244 -0
  149. package/src/ai-chatbot-demo.ts +509 -0
  150. package/src/convex-app-demo-entry.ts +1107 -0
  151. package/src/convex-app-demo.ts +1316 -0
  152. package/src/cors-proxy.ts +81 -0
  153. package/src/create-runtime.ts +147 -0
  154. package/src/demo.ts +304 -0
  155. package/src/dev-server.ts +274 -0
  156. package/src/frameworks/next-dev-server.ts +2224 -0
  157. package/src/frameworks/vite-dev-server.ts +702 -0
  158. package/src/index.ts +101 -0
  159. package/src/next-demo.ts +1784 -0
  160. package/src/npm/index.ts +347 -0
  161. package/src/npm/registry.ts +152 -0
  162. package/src/npm/resolver.ts +385 -0
  163. package/src/npm/tarball.ts +209 -0
  164. package/src/runtime-interface.ts +103 -0
  165. package/src/runtime.ts +1046 -0
  166. package/src/sandbox-helpers.ts +173 -0
  167. package/src/sandbox-runtime.ts +252 -0
  168. package/src/server-bridge.ts +426 -0
  169. package/src/shims/assert.ts +664 -0
  170. package/src/shims/async_hooks.ts +86 -0
  171. package/src/shims/buffer.ts +75 -0
  172. package/src/shims/child_process-browser.ts +217 -0
  173. package/src/shims/child_process.ts +463 -0
  174. package/src/shims/chokidar.ts +313 -0
  175. package/src/shims/cluster.ts +67 -0
  176. package/src/shims/crypto.ts +830 -0
  177. package/src/shims/dgram.ts +47 -0
  178. package/src/shims/diagnostics_channel.ts +196 -0
  179. package/src/shims/dns.ts +172 -0
  180. package/src/shims/domain.ts +58 -0
  181. package/src/shims/esbuild.ts +805 -0
  182. package/src/shims/events.ts +195 -0
  183. package/src/shims/fs.ts +803 -0
  184. package/src/shims/fsevents.ts +63 -0
  185. package/src/shims/http.ts +904 -0
  186. package/src/shims/http2.ts +96 -0
  187. package/src/shims/https.ts +86 -0
  188. package/src/shims/inspector.ts +30 -0
  189. package/src/shims/module.ts +82 -0
  190. package/src/shims/net.ts +359 -0
  191. package/src/shims/os.ts +195 -0
  192. package/src/shims/path.ts +199 -0
  193. package/src/shims/perf_hooks.ts +92 -0
  194. package/src/shims/process.ts +346 -0
  195. package/src/shims/querystring.ts +97 -0
  196. package/src/shims/readdirp.ts +228 -0
  197. package/src/shims/readline.ts +110 -0
  198. package/src/shims/rollup.ts +80 -0
  199. package/src/shims/sentry.ts +133 -0
  200. package/src/shims/stream.ts +1126 -0
  201. package/src/shims/tls.ts +95 -0
  202. package/src/shims/tty.ts +64 -0
  203. package/src/shims/url.ts +171 -0
  204. package/src/shims/util.ts +312 -0
  205. package/src/shims/v8.ts +113 -0
  206. package/src/shims/vfs-adapter.ts +402 -0
  207. package/src/shims/vm.ts +83 -0
  208. package/src/shims/worker_threads.ts +111 -0
  209. package/src/shims/ws.ts +382 -0
  210. package/src/shims/zlib.ts +289 -0
  211. package/src/transform.ts +313 -0
  212. package/src/types/external.d.ts +67 -0
  213. package/src/virtual-fs.ts +903 -0
  214. package/src/vite-demo.ts +577 -0
  215. package/src/worker/runtime-worker.ts +128 -0
  216. 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;