@scelar/nodepod 1.0.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 +43 -0
- package/README.md +240 -0
- package/dist/child_process-BJOMsZje.js +8233 -0
- package/dist/child_process-BJOMsZje.js.map +1 -0
- package/dist/child_process-Cj8vOcuc.cjs +7434 -0
- package/dist/child_process-Cj8vOcuc.cjs.map +1 -0
- package/dist/index-Cb1Cgdnd.js +35308 -0
- package/dist/index-Cb1Cgdnd.js.map +1 -0
- package/dist/index-DsMGS-xc.cjs +37195 -0
- package/dist/index-DsMGS-xc.cjs.map +1 -0
- package/dist/index.cjs +65 -0
- package/dist/index.cjs.map +1 -0
- package/dist/index.mjs +59 -0
- package/dist/index.mjs.map +1 -0
- package/package.json +95 -0
- package/src/__tests__/smoke.test.ts +11 -0
- package/src/constants/cdn-urls.ts +18 -0
- package/src/constants/config.ts +236 -0
- package/src/cross-origin.ts +26 -0
- package/src/engine-factory.ts +176 -0
- package/src/engine-types.ts +56 -0
- package/src/helpers/byte-encoding.ts +39 -0
- package/src/helpers/digest.ts +9 -0
- package/src/helpers/event-loop.ts +96 -0
- package/src/helpers/wasm-cache.ts +133 -0
- package/src/iframe-sandbox.ts +141 -0
- package/src/index.ts +192 -0
- package/src/isolation-helpers.ts +148 -0
- package/src/memory-volume.ts +941 -0
- package/src/module-transformer.ts +368 -0
- package/src/packages/archive-extractor.ts +248 -0
- package/src/packages/browser-bundler.ts +284 -0
- package/src/packages/installer.ts +396 -0
- package/src/packages/registry-client.ts +131 -0
- package/src/packages/version-resolver.ts +411 -0
- package/src/polyfills/assert.ts +384 -0
- package/src/polyfills/async_hooks.ts +144 -0
- package/src/polyfills/buffer.ts +628 -0
- package/src/polyfills/child_process.ts +2288 -0
- package/src/polyfills/chokidar.ts +336 -0
- package/src/polyfills/cluster.ts +106 -0
- package/src/polyfills/console.ts +136 -0
- package/src/polyfills/constants.ts +123 -0
- package/src/polyfills/crypto.ts +885 -0
- package/src/polyfills/dgram.ts +87 -0
- package/src/polyfills/diagnostics_channel.ts +76 -0
- package/src/polyfills/dns.ts +134 -0
- package/src/polyfills/domain.ts +68 -0
- package/src/polyfills/esbuild.ts +854 -0
- package/src/polyfills/events.ts +276 -0
- package/src/polyfills/fs.ts +2888 -0
- package/src/polyfills/fsevents.ts +79 -0
- package/src/polyfills/http.ts +1449 -0
- package/src/polyfills/http2.ts +199 -0
- package/src/polyfills/https.ts +76 -0
- package/src/polyfills/inspector.ts +62 -0
- package/src/polyfills/lightningcss.ts +105 -0
- package/src/polyfills/module.ts +191 -0
- package/src/polyfills/net.ts +353 -0
- package/src/polyfills/os.ts +238 -0
- package/src/polyfills/path.ts +206 -0
- package/src/polyfills/perf_hooks.ts +102 -0
- package/src/polyfills/process.ts +690 -0
- package/src/polyfills/punycode.ts +159 -0
- package/src/polyfills/querystring.ts +93 -0
- package/src/polyfills/quic.ts +118 -0
- package/src/polyfills/readdirp.ts +229 -0
- package/src/polyfills/readline.ts +692 -0
- package/src/polyfills/repl.ts +134 -0
- package/src/polyfills/rollup.ts +119 -0
- package/src/polyfills/sea.ts +33 -0
- package/src/polyfills/sqlite.ts +78 -0
- package/src/polyfills/stream.ts +1620 -0
- package/src/polyfills/string_decoder.ts +25 -0
- package/src/polyfills/tailwindcss-oxide.ts +309 -0
- package/src/polyfills/test.ts +197 -0
- package/src/polyfills/timers.ts +32 -0
- package/src/polyfills/tls.ts +105 -0
- package/src/polyfills/trace_events.ts +50 -0
- package/src/polyfills/tty.ts +71 -0
- package/src/polyfills/url.ts +174 -0
- package/src/polyfills/util.ts +559 -0
- package/src/polyfills/v8.ts +126 -0
- package/src/polyfills/vm.ts +132 -0
- package/src/polyfills/volume-registry.ts +15 -0
- package/src/polyfills/wasi.ts +44 -0
- package/src/polyfills/worker_threads.ts +326 -0
- package/src/polyfills/ws.ts +595 -0
- package/src/polyfills/zlib.ts +881 -0
- package/src/request-proxy.ts +716 -0
- package/src/script-engine.ts +3375 -0
- package/src/sdk/nodepod-fs.ts +93 -0
- package/src/sdk/nodepod-process.ts +86 -0
- package/src/sdk/nodepod-terminal.ts +350 -0
- package/src/sdk/nodepod.ts +509 -0
- package/src/sdk/types.ts +70 -0
- package/src/shell/commands/bun.ts +121 -0
- package/src/shell/commands/directory.ts +297 -0
- package/src/shell/commands/file-ops.ts +525 -0
- package/src/shell/commands/git.ts +2142 -0
- package/src/shell/commands/node.ts +80 -0
- package/src/shell/commands/npm.ts +198 -0
- package/src/shell/commands/pm-types.ts +45 -0
- package/src/shell/commands/pnpm.ts +82 -0
- package/src/shell/commands/search.ts +264 -0
- package/src/shell/commands/shell-env.ts +352 -0
- package/src/shell/commands/text-processing.ts +1152 -0
- package/src/shell/commands/yarn.ts +84 -0
- package/src/shell/shell-builtins.ts +19 -0
- package/src/shell/shell-helpers.ts +250 -0
- package/src/shell/shell-interpreter.ts +514 -0
- package/src/shell/shell-parser.ts +429 -0
- package/src/shell/shell-types.ts +85 -0
- package/src/syntax-transforms.ts +561 -0
- package/src/threading/engine-worker.ts +64 -0
- package/src/threading/inline-worker.ts +372 -0
- package/src/threading/offload-types.ts +112 -0
- package/src/threading/offload-worker.ts +383 -0
- package/src/threading/offload.ts +271 -0
- package/src/threading/process-context.ts +92 -0
- package/src/threading/process-handle.ts +275 -0
- package/src/threading/process-manager.ts +956 -0
- package/src/threading/process-worker-entry.ts +854 -0
- package/src/threading/shared-vfs.ts +352 -0
- package/src/threading/sync-channel.ts +135 -0
- package/src/threading/task-queue.ts +177 -0
- package/src/threading/vfs-bridge.ts +231 -0
- package/src/threading/worker-pool.ts +233 -0
- package/src/threading/worker-protocol.ts +358 -0
- package/src/threading/worker-vfs.ts +218 -0
- package/src/types/externals.d.ts +38 -0
- package/src/types/fs-streams.ts +142 -0
- package/src/types/manifest.ts +17 -0
- package/src/worker-sandbox.ts +90 -0
|
@@ -0,0 +1,628 @@
|
|
|
1
|
+
// Buffer polyfill extending Uint8Array with Node.js Buffer API
|
|
2
|
+
|
|
3
|
+
|
|
4
|
+
import { bytesToBase64, base64ToBytes, bytesToHex, bytesToLatin1 } from '../helpers/byte-encoding';
|
|
5
|
+
|
|
6
|
+
const textEnc = new TextEncoder();
|
|
7
|
+
const textDec = new TextDecoder('utf-8');
|
|
8
|
+
|
|
9
|
+
// ---- The main BufferPolyfill class ----
|
|
10
|
+
|
|
11
|
+
class BufferPolyfill extends Uint8Array {
|
|
12
|
+
static readonly BYTES_PER_ELEMENT = 1;
|
|
13
|
+
|
|
14
|
+
// Overloads matching Node.js Buffer.from
|
|
15
|
+
static from(source: ArrayLike<number>): BufferPolyfill;
|
|
16
|
+
static from<T>(source: ArrayLike<T>, mapper: (v: T, i: number) => number, ctx?: unknown): BufferPolyfill;
|
|
17
|
+
static from(source: string, enc?: string): BufferPolyfill;
|
|
18
|
+
static from(source: ArrayBuffer | Uint8Array): BufferPolyfill;
|
|
19
|
+
static from(source: Iterable<number>): BufferPolyfill;
|
|
20
|
+
static from(
|
|
21
|
+
source: string | ArrayBuffer | Uint8Array | number[] | ArrayLike<number> | Iterable<number>,
|
|
22
|
+
encOrMapper?: string | ((v: unknown, i: number) => number),
|
|
23
|
+
ctx?: unknown
|
|
24
|
+
): BufferPolyfill {
|
|
25
|
+
// Handle typed-array style mapper
|
|
26
|
+
if (typeof encOrMapper === 'function') {
|
|
27
|
+
const items = Array.from(source as ArrayLike<number>, encOrMapper as (v: number, i: number) => number, ctx);
|
|
28
|
+
return new BufferPolyfill(items);
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
const encoding = encOrMapper as string | undefined;
|
|
32
|
+
|
|
33
|
+
if (Array.isArray(source)) {
|
|
34
|
+
return new BufferPolyfill(source);
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
if (typeof source === 'string') {
|
|
38
|
+
const enc = (encoding || 'utf8').toLowerCase();
|
|
39
|
+
|
|
40
|
+
if (enc === 'base64' || enc === 'base64url') {
|
|
41
|
+
let b64 = source;
|
|
42
|
+
if (enc === 'base64url') {
|
|
43
|
+
b64 = b64.replace(/-/g, '+').replace(/_/g, '/');
|
|
44
|
+
while (b64.length % 4 !== 0) b64 += '=';
|
|
45
|
+
}
|
|
46
|
+
return new BufferPolyfill(base64ToBytes(b64));
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
if (enc === 'hex') {
|
|
50
|
+
const octets = new Uint8Array(source.length >>> 1);
|
|
51
|
+
for (let i = 0; i < source.length; i += 2) {
|
|
52
|
+
octets[i >>> 1] = parseInt(source.substring(i, i + 2), 16);
|
|
53
|
+
}
|
|
54
|
+
return new BufferPolyfill(octets);
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
if (enc === 'latin1' || enc === 'binary') {
|
|
58
|
+
const octets = new Uint8Array(source.length);
|
|
59
|
+
for (let i = 0; i < source.length; i++) {
|
|
60
|
+
octets[i] = source.charCodeAt(i) & 0xff;
|
|
61
|
+
}
|
|
62
|
+
return new BufferPolyfill(octets);
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
// utf-8 default
|
|
66
|
+
return new BufferPolyfill(textEnc.encode(source));
|
|
67
|
+
}
|
|
68
|
+
|
|
69
|
+
if (source instanceof ArrayBuffer) {
|
|
70
|
+
return new BufferPolyfill(source);
|
|
71
|
+
}
|
|
72
|
+
|
|
73
|
+
return new BufferPolyfill(source as Uint8Array);
|
|
74
|
+
}
|
|
75
|
+
|
|
76
|
+
static alloc(len: number, fillValue?: number): BufferPolyfill {
|
|
77
|
+
const buf = new BufferPolyfill(len);
|
|
78
|
+
if (fillValue !== undefined) {
|
|
79
|
+
buf.fill(fillValue);
|
|
80
|
+
}
|
|
81
|
+
return buf;
|
|
82
|
+
}
|
|
83
|
+
|
|
84
|
+
static allocUnsafe(len: number): BufferPolyfill {
|
|
85
|
+
return new BufferPolyfill(len);
|
|
86
|
+
}
|
|
87
|
+
|
|
88
|
+
static allocUnsafeSlow(len: number): BufferPolyfill {
|
|
89
|
+
return new BufferPolyfill(len);
|
|
90
|
+
}
|
|
91
|
+
|
|
92
|
+
static concat(list: (Uint8Array | BufferPolyfill)[]): BufferPolyfill {
|
|
93
|
+
let totalLen = 0;
|
|
94
|
+
for (const chunk of list) totalLen += chunk.length;
|
|
95
|
+
const merged = new BufferPolyfill(totalLen);
|
|
96
|
+
let pos = 0;
|
|
97
|
+
for (const chunk of list) {
|
|
98
|
+
merged.set(chunk, pos);
|
|
99
|
+
pos += chunk.length;
|
|
100
|
+
}
|
|
101
|
+
return merged;
|
|
102
|
+
}
|
|
103
|
+
|
|
104
|
+
static isBuffer(candidate: unknown): candidate is BufferPolyfill {
|
|
105
|
+
return candidate instanceof BufferPolyfill || candidate instanceof Uint8Array;
|
|
106
|
+
}
|
|
107
|
+
|
|
108
|
+
static isEncoding(enc: string): boolean {
|
|
109
|
+
const lower = enc.toLowerCase();
|
|
110
|
+
return ['utf8', 'utf-8', 'ascii', 'latin1', 'binary', 'base64', 'base64url', 'hex'].includes(lower);
|
|
111
|
+
}
|
|
112
|
+
|
|
113
|
+
static byteLength(text: string, enc?: string): number {
|
|
114
|
+
const lower = (enc || 'utf8').toLowerCase();
|
|
115
|
+
if (lower === 'base64' || lower === 'base64url') {
|
|
116
|
+
const stripped = text.replace(/[=]/g, '');
|
|
117
|
+
return Math.floor(stripped.length * 3 / 4);
|
|
118
|
+
}
|
|
119
|
+
if (lower === 'hex') {
|
|
120
|
+
return text.length >>> 1;
|
|
121
|
+
}
|
|
122
|
+
return textEnc.encode(text).length;
|
|
123
|
+
}
|
|
124
|
+
|
|
125
|
+
// ---- Instance methods ----
|
|
126
|
+
|
|
127
|
+
toString(enc: BufferEncoding = 'utf8'): string {
|
|
128
|
+
const lower = (enc || 'utf8').toLowerCase();
|
|
129
|
+
|
|
130
|
+
if (lower === 'base64') return bytesToBase64(this);
|
|
131
|
+
|
|
132
|
+
if (lower === 'base64url') {
|
|
133
|
+
return bytesToBase64(this).replace(/\+/g, '-').replace(/\//g, '_').replace(/=/g, '');
|
|
134
|
+
}
|
|
135
|
+
|
|
136
|
+
if (lower === 'hex') return bytesToHex(this);
|
|
137
|
+
|
|
138
|
+
if (lower === 'latin1' || lower === 'binary') return bytesToLatin1(this);
|
|
139
|
+
|
|
140
|
+
return textDec.decode(this);
|
|
141
|
+
}
|
|
142
|
+
|
|
143
|
+
slice(begin?: number, end?: number): BufferPolyfill {
|
|
144
|
+
return new BufferPolyfill(super.slice(begin, end));
|
|
145
|
+
}
|
|
146
|
+
|
|
147
|
+
subarray(begin?: number, end?: number): BufferPolyfill {
|
|
148
|
+
return new BufferPolyfill(super.subarray(begin, end));
|
|
149
|
+
}
|
|
150
|
+
|
|
151
|
+
write(string: string, encoding?: BufferEncoding): number;
|
|
152
|
+
write(string: string, offset: number, encoding?: BufferEncoding): number;
|
|
153
|
+
write(string: string, offset: number, length: number, encoding?: BufferEncoding): number;
|
|
154
|
+
write(string: string, offsetOrEncoding?: number | BufferEncoding, lengthOrEncoding?: number | BufferEncoding, _encoding?: BufferEncoding): number {
|
|
155
|
+
const offset = typeof offsetOrEncoding === "number" ? offsetOrEncoding : 0;
|
|
156
|
+
const encoded = textEnc.encode(string);
|
|
157
|
+
const len = typeof lengthOrEncoding === "number" ? Math.min(lengthOrEncoding, encoded.length) : encoded.length;
|
|
158
|
+
this.set(encoded.subarray(0, len), offset);
|
|
159
|
+
return len;
|
|
160
|
+
}
|
|
161
|
+
|
|
162
|
+
copy(dest: BufferPolyfill, destStart?: number, srcStart?: number, srcEnd?: number): number {
|
|
163
|
+
const segment = this.subarray(srcStart || 0, srcEnd);
|
|
164
|
+
dest.set(segment, destStart || 0);
|
|
165
|
+
return segment.length;
|
|
166
|
+
}
|
|
167
|
+
|
|
168
|
+
compare(other: Uint8Array): number {
|
|
169
|
+
const bound = Math.min(this.length, other.length);
|
|
170
|
+
for (let i = 0; i < bound; i++) {
|
|
171
|
+
if (this[i] < other[i]) return -1;
|
|
172
|
+
if (this[i] > other[i]) return 1;
|
|
173
|
+
}
|
|
174
|
+
if (this.length < other.length) return -1;
|
|
175
|
+
if (this.length > other.length) return 1;
|
|
176
|
+
return 0;
|
|
177
|
+
}
|
|
178
|
+
|
|
179
|
+
equals(other: Uint8Array): boolean {
|
|
180
|
+
return this.compare(other) === 0;
|
|
181
|
+
}
|
|
182
|
+
|
|
183
|
+
toJSON(): { type: string; data: number[] } {
|
|
184
|
+
return { type: 'Buffer', data: Array.from(this) };
|
|
185
|
+
}
|
|
186
|
+
|
|
187
|
+
hasOwnProperty(key: PropertyKey): boolean {
|
|
188
|
+
return Object.prototype.hasOwnProperty.call(this, key);
|
|
189
|
+
}
|
|
190
|
+
|
|
191
|
+
indexOf(needle: number | Uint8Array | string, fromIndex?: number): number {
|
|
192
|
+
const start = fromIndex || 0;
|
|
193
|
+
if (typeof needle === 'number') {
|
|
194
|
+
for (let i = start; i < this.length; i++) {
|
|
195
|
+
if (this[i] === needle) return i;
|
|
196
|
+
}
|
|
197
|
+
return -1;
|
|
198
|
+
}
|
|
199
|
+
const search = typeof needle === 'string' ? BufferPolyfill.from(needle) : needle;
|
|
200
|
+
for (let i = start; i <= this.length - search.length; i++) {
|
|
201
|
+
let match = true;
|
|
202
|
+
for (let j = 0; j < search.length; j++) {
|
|
203
|
+
if (this[i + j] !== search[j]) { match = false; break; }
|
|
204
|
+
}
|
|
205
|
+
if (match) return i;
|
|
206
|
+
}
|
|
207
|
+
return -1;
|
|
208
|
+
}
|
|
209
|
+
|
|
210
|
+
includes(needle: number | Uint8Array | string, fromIndex?: number): boolean {
|
|
211
|
+
return this.indexOf(needle, fromIndex) !== -1;
|
|
212
|
+
}
|
|
213
|
+
|
|
214
|
+
// ---- Unsigned integer reads ----
|
|
215
|
+
|
|
216
|
+
readUInt8(pos: number): number {
|
|
217
|
+
return this[pos];
|
|
218
|
+
}
|
|
219
|
+
|
|
220
|
+
readUInt16BE(pos: number): number {
|
|
221
|
+
return (this[pos] << 8) | this[pos + 1];
|
|
222
|
+
}
|
|
223
|
+
|
|
224
|
+
readUInt16LE(pos: number): number {
|
|
225
|
+
return this[pos] | (this[pos + 1] << 8);
|
|
226
|
+
}
|
|
227
|
+
|
|
228
|
+
readUInt32BE(pos: number): number {
|
|
229
|
+
return ((this[pos] << 24) | (this[pos + 1] << 16) | (this[pos + 2] << 8) | this[pos + 3]) >>> 0;
|
|
230
|
+
}
|
|
231
|
+
|
|
232
|
+
readUInt32LE(pos: number): number {
|
|
233
|
+
return ((this[pos]) | (this[pos + 1] << 8) | (this[pos + 2] << 16) | (this[pos + 3] << 24)) >>> 0;
|
|
234
|
+
}
|
|
235
|
+
|
|
236
|
+
// ---- Unsigned integer writes ----
|
|
237
|
+
|
|
238
|
+
writeUInt8(val: number, pos: number): number {
|
|
239
|
+
this[pos] = val & 0xff;
|
|
240
|
+
return pos + 1;
|
|
241
|
+
}
|
|
242
|
+
|
|
243
|
+
writeUInt16BE(val: number, pos: number): number {
|
|
244
|
+
this[pos] = (val >>> 8) & 0xff;
|
|
245
|
+
this[pos + 1] = val & 0xff;
|
|
246
|
+
return pos + 2;
|
|
247
|
+
}
|
|
248
|
+
|
|
249
|
+
writeUInt16LE(val: number, pos: number): number {
|
|
250
|
+
this[pos] = val & 0xff;
|
|
251
|
+
this[pos + 1] = (val >>> 8) & 0xff;
|
|
252
|
+
return pos + 2;
|
|
253
|
+
}
|
|
254
|
+
|
|
255
|
+
writeUInt32BE(val: number, pos: number): number {
|
|
256
|
+
this[pos] = (val >>> 24) & 0xff;
|
|
257
|
+
this[pos + 1] = (val >>> 16) & 0xff;
|
|
258
|
+
this[pos + 2] = (val >>> 8) & 0xff;
|
|
259
|
+
this[pos + 3] = val & 0xff;
|
|
260
|
+
return pos + 4;
|
|
261
|
+
}
|
|
262
|
+
|
|
263
|
+
writeUInt32LE(val: number, pos: number): number {
|
|
264
|
+
this[pos] = val & 0xff;
|
|
265
|
+
this[pos + 1] = (val >>> 8) & 0xff;
|
|
266
|
+
this[pos + 2] = (val >>> 16) & 0xff;
|
|
267
|
+
this[pos + 3] = (val >>> 24) & 0xff;
|
|
268
|
+
return pos + 4;
|
|
269
|
+
}
|
|
270
|
+
|
|
271
|
+
// ---- Lowercase aliases ----
|
|
272
|
+
readUint8(pos: number): number { return this.readUInt8(pos); }
|
|
273
|
+
readUint16BE(pos: number): number { return this.readUInt16BE(pos); }
|
|
274
|
+
readUint16LE(pos: number): number { return this.readUInt16LE(pos); }
|
|
275
|
+
readUint32BE(pos: number): number { return this.readUInt32BE(pos); }
|
|
276
|
+
readUint32LE(pos: number): number { return this.readUInt32LE(pos); }
|
|
277
|
+
writeUint8(val: number, pos: number): number { return this.writeUInt8(val, pos); }
|
|
278
|
+
writeUint16BE(val: number, pos: number): number { return this.writeUInt16BE(val, pos); }
|
|
279
|
+
writeUint16LE(val: number, pos: number): number { return this.writeUInt16LE(val, pos); }
|
|
280
|
+
writeUint32BE(val: number, pos: number): number { return this.writeUInt32BE(val, pos); }
|
|
281
|
+
writeUint32LE(val: number, pos: number): number { return this.writeUInt32LE(val, pos); }
|
|
282
|
+
|
|
283
|
+
// ---- Signed integer reads ----
|
|
284
|
+
|
|
285
|
+
readInt8(pos: number): number {
|
|
286
|
+
const raw = this[pos];
|
|
287
|
+
return raw & 0x80 ? raw - 0x100 : raw;
|
|
288
|
+
}
|
|
289
|
+
|
|
290
|
+
readInt16BE(pos: number): number {
|
|
291
|
+
const raw = this.readUInt16BE(pos);
|
|
292
|
+
return raw & 0x8000 ? raw - 0x10000 : raw;
|
|
293
|
+
}
|
|
294
|
+
|
|
295
|
+
readInt16LE(pos: number): number {
|
|
296
|
+
const raw = this.readUInt16LE(pos);
|
|
297
|
+
return raw & 0x8000 ? raw - 0x10000 : raw;
|
|
298
|
+
}
|
|
299
|
+
|
|
300
|
+
readInt32BE(pos: number): number {
|
|
301
|
+
return this.readUInt32BE(pos) | 0;
|
|
302
|
+
}
|
|
303
|
+
|
|
304
|
+
readInt32LE(pos: number): number {
|
|
305
|
+
return this.readUInt32LE(pos) | 0;
|
|
306
|
+
}
|
|
307
|
+
|
|
308
|
+
// ---- Signed integer writes ----
|
|
309
|
+
|
|
310
|
+
writeInt8(val: number, pos: number): number {
|
|
311
|
+
this[pos] = val & 0xff;
|
|
312
|
+
return pos + 1;
|
|
313
|
+
}
|
|
314
|
+
|
|
315
|
+
writeInt16BE(val: number, pos: number): number {
|
|
316
|
+
return this.writeUInt16BE(val & 0xffff, pos);
|
|
317
|
+
}
|
|
318
|
+
|
|
319
|
+
writeInt16LE(val: number, pos: number): number {
|
|
320
|
+
return this.writeUInt16LE(val & 0xffff, pos);
|
|
321
|
+
}
|
|
322
|
+
|
|
323
|
+
writeInt32BE(val: number, pos: number): number {
|
|
324
|
+
return this.writeUInt32BE(val >>> 0, pos);
|
|
325
|
+
}
|
|
326
|
+
|
|
327
|
+
writeInt32LE(val: number, pos: number): number {
|
|
328
|
+
return this.writeUInt32LE(val >>> 0, pos);
|
|
329
|
+
}
|
|
330
|
+
|
|
331
|
+
// ---- BigInt 64-bit reads ----
|
|
332
|
+
|
|
333
|
+
readBigUInt64LE(pos: number): bigint {
|
|
334
|
+
const lo = BigInt(this[pos] | (this[pos + 1] << 8) | (this[pos + 2] << 16) | (this[pos + 3] << 24)) & 0xffffffffn;
|
|
335
|
+
const hi = BigInt(this[pos + 4] | (this[pos + 5] << 8) | (this[pos + 6] << 16) | (this[pos + 7] << 24)) & 0xffffffffn;
|
|
336
|
+
return lo | (hi << 32n);
|
|
337
|
+
}
|
|
338
|
+
|
|
339
|
+
readBigUInt64BE(pos: number): bigint {
|
|
340
|
+
const hi = BigInt(this[pos] << 24 | this[pos + 1] << 16 | this[pos + 2] << 8 | this[pos + 3]) & 0xffffffffn;
|
|
341
|
+
const lo = BigInt(this[pos + 4] << 24 | this[pos + 5] << 16 | this[pos + 6] << 8 | this[pos + 7]) & 0xffffffffn;
|
|
342
|
+
return lo | (hi << 32n);
|
|
343
|
+
}
|
|
344
|
+
|
|
345
|
+
readBigInt64LE(pos: number): bigint {
|
|
346
|
+
const unsigned = this.readBigUInt64LE(pos);
|
|
347
|
+
return unsigned >= 0x8000000000000000n ? unsigned - 0x10000000000000000n : unsigned;
|
|
348
|
+
}
|
|
349
|
+
|
|
350
|
+
readBigInt64BE(pos: number): bigint {
|
|
351
|
+
const unsigned = this.readBigUInt64BE(pos);
|
|
352
|
+
return unsigned >= 0x8000000000000000n ? unsigned - 0x10000000000000000n : unsigned;
|
|
353
|
+
}
|
|
354
|
+
|
|
355
|
+
// ---- BigInt 64-bit writes ----
|
|
356
|
+
|
|
357
|
+
writeBigUInt64LE(val: bigint, pos: number): number {
|
|
358
|
+
const lo = val & 0xffffffffn;
|
|
359
|
+
const hi = (val >> 32n) & 0xffffffffn;
|
|
360
|
+
this[pos] = Number(lo & 0xffn);
|
|
361
|
+
this[pos + 1] = Number((lo >> 8n) & 0xffn);
|
|
362
|
+
this[pos + 2] = Number((lo >> 16n) & 0xffn);
|
|
363
|
+
this[pos + 3] = Number((lo >> 24n) & 0xffn);
|
|
364
|
+
this[pos + 4] = Number(hi & 0xffn);
|
|
365
|
+
this[pos + 5] = Number((hi >> 8n) & 0xffn);
|
|
366
|
+
this[pos + 6] = Number((hi >> 16n) & 0xffn);
|
|
367
|
+
this[pos + 7] = Number((hi >> 24n) & 0xffn);
|
|
368
|
+
return pos + 8;
|
|
369
|
+
}
|
|
370
|
+
|
|
371
|
+
writeBigUInt64BE(val: bigint, pos: number): number {
|
|
372
|
+
const lo = val & 0xffffffffn;
|
|
373
|
+
const hi = (val >> 32n) & 0xffffffffn;
|
|
374
|
+
this[pos] = Number((hi >> 24n) & 0xffn);
|
|
375
|
+
this[pos + 1] = Number((hi >> 16n) & 0xffn);
|
|
376
|
+
this[pos + 2] = Number((hi >> 8n) & 0xffn);
|
|
377
|
+
this[pos + 3] = Number(hi & 0xffn);
|
|
378
|
+
this[pos + 4] = Number((lo >> 24n) & 0xffn);
|
|
379
|
+
this[pos + 5] = Number((lo >> 16n) & 0xffn);
|
|
380
|
+
this[pos + 6] = Number((lo >> 8n) & 0xffn);
|
|
381
|
+
this[pos + 7] = Number(lo & 0xffn);
|
|
382
|
+
return pos + 8;
|
|
383
|
+
}
|
|
384
|
+
|
|
385
|
+
writeBigInt64LE(val: bigint, pos: number): number {
|
|
386
|
+
const unsigned = val < 0n ? val + 0x10000000000000000n : val;
|
|
387
|
+
return this.writeBigUInt64LE(unsigned, pos);
|
|
388
|
+
}
|
|
389
|
+
|
|
390
|
+
writeBigInt64BE(val: bigint, pos: number): number {
|
|
391
|
+
const unsigned = val < 0n ? val + 0x10000000000000000n : val;
|
|
392
|
+
return this.writeBigUInt64BE(unsigned, pos);
|
|
393
|
+
}
|
|
394
|
+
|
|
395
|
+
// Lowercase BigInt aliases
|
|
396
|
+
readBigUint64LE(pos: number): bigint { return this.readBigUInt64LE(pos); }
|
|
397
|
+
readBigUint64BE(pos: number): bigint { return this.readBigUInt64BE(pos); }
|
|
398
|
+
writeBigUint64LE(val: bigint, pos: number): number { return this.writeBigUInt64LE(val, pos); }
|
|
399
|
+
writeBigUint64BE(val: bigint, pos: number): number { return this.writeBigUInt64BE(val, pos); }
|
|
400
|
+
|
|
401
|
+
// ---- Float / Double reads ----
|
|
402
|
+
|
|
403
|
+
readFloatLE(pos: number): number {
|
|
404
|
+
const dv = new DataView(this.buffer, this.byteOffset + pos, 4);
|
|
405
|
+
return dv.getFloat32(0, true);
|
|
406
|
+
}
|
|
407
|
+
|
|
408
|
+
readFloatBE(pos: number): number {
|
|
409
|
+
const dv = new DataView(this.buffer, this.byteOffset + pos, 4);
|
|
410
|
+
return dv.getFloat32(0, false);
|
|
411
|
+
}
|
|
412
|
+
|
|
413
|
+
readDoubleLE(pos: number): number {
|
|
414
|
+
const dv = new DataView(this.buffer, this.byteOffset + pos, 8);
|
|
415
|
+
return dv.getFloat64(0, true);
|
|
416
|
+
}
|
|
417
|
+
|
|
418
|
+
readDoubleBE(pos: number): number {
|
|
419
|
+
const dv = new DataView(this.buffer, this.byteOffset + pos, 8);
|
|
420
|
+
return dv.getFloat64(0, false);
|
|
421
|
+
}
|
|
422
|
+
|
|
423
|
+
// ---- Float / Double writes ----
|
|
424
|
+
|
|
425
|
+
writeFloatLE(val: number, pos: number): number {
|
|
426
|
+
const dv = new DataView(this.buffer, this.byteOffset + pos, 4);
|
|
427
|
+
dv.setFloat32(0, val, true);
|
|
428
|
+
return pos + 4;
|
|
429
|
+
}
|
|
430
|
+
|
|
431
|
+
writeFloatBE(val: number, pos: number): number {
|
|
432
|
+
const dv = new DataView(this.buffer, this.byteOffset + pos, 4);
|
|
433
|
+
dv.setFloat32(0, val, false);
|
|
434
|
+
return pos + 4;
|
|
435
|
+
}
|
|
436
|
+
|
|
437
|
+
writeDoubleLE(val: number, pos: number): number {
|
|
438
|
+
const dv = new DataView(this.buffer, this.byteOffset + pos, 8);
|
|
439
|
+
dv.setFloat64(0, val, true);
|
|
440
|
+
return pos + 8;
|
|
441
|
+
}
|
|
442
|
+
|
|
443
|
+
writeDoubleBE(val: number, pos: number): number {
|
|
444
|
+
const dv = new DataView(this.buffer, this.byteOffset + pos, 8);
|
|
445
|
+
dv.setFloat64(0, val, false);
|
|
446
|
+
return pos + 8;
|
|
447
|
+
}
|
|
448
|
+
|
|
449
|
+
// ---- Variable-length integer reads ----
|
|
450
|
+
|
|
451
|
+
readUIntLE(pos: number, width: number): number {
|
|
452
|
+
let result = 0;
|
|
453
|
+
let factor = 1;
|
|
454
|
+
for (let i = 0; i < width; i++) {
|
|
455
|
+
result += this[pos + i] * factor;
|
|
456
|
+
factor *= 0x100;
|
|
457
|
+
}
|
|
458
|
+
return result;
|
|
459
|
+
}
|
|
460
|
+
|
|
461
|
+
readUintLE(pos: number, width: number): number { return this.readUIntLE(pos, width); }
|
|
462
|
+
|
|
463
|
+
readUIntBE(pos: number, width: number): number {
|
|
464
|
+
let result = 0;
|
|
465
|
+
let factor = 1;
|
|
466
|
+
for (let i = width - 1; i >= 0; i--) {
|
|
467
|
+
result += this[pos + i] * factor;
|
|
468
|
+
factor *= 0x100;
|
|
469
|
+
}
|
|
470
|
+
return result;
|
|
471
|
+
}
|
|
472
|
+
|
|
473
|
+
readUintBE(pos: number, width: number): number { return this.readUIntBE(pos, width); }
|
|
474
|
+
|
|
475
|
+
readIntLE(pos: number, width: number): number {
|
|
476
|
+
let raw = this.readUIntLE(pos, width);
|
|
477
|
+
const threshold = Math.pow(2, (width * 8) - 1);
|
|
478
|
+
if (raw >= threshold) raw -= Math.pow(2, width * 8);
|
|
479
|
+
return raw;
|
|
480
|
+
}
|
|
481
|
+
|
|
482
|
+
readIntBE(pos: number, width: number): number {
|
|
483
|
+
let raw = this.readUIntBE(pos, width);
|
|
484
|
+
const threshold = Math.pow(2, (width * 8) - 1);
|
|
485
|
+
if (raw >= threshold) raw -= Math.pow(2, width * 8);
|
|
486
|
+
return raw;
|
|
487
|
+
}
|
|
488
|
+
|
|
489
|
+
// ---- Variable-length integer writes ----
|
|
490
|
+
|
|
491
|
+
writeUIntLE(val: number, pos: number, width: number): number {
|
|
492
|
+
let remaining = val;
|
|
493
|
+
for (let i = 0; i < width; i++) {
|
|
494
|
+
this[pos + i] = remaining & 0xff;
|
|
495
|
+
remaining = Math.floor(remaining / 0x100);
|
|
496
|
+
}
|
|
497
|
+
return pos + width;
|
|
498
|
+
}
|
|
499
|
+
|
|
500
|
+
writeUintLE(val: number, pos: number, width: number): number { return this.writeUIntLE(val, pos, width); }
|
|
501
|
+
|
|
502
|
+
writeUIntBE(val: number, pos: number, width: number): number {
|
|
503
|
+
let remaining = val;
|
|
504
|
+
for (let i = width - 1; i >= 0; i--) {
|
|
505
|
+
this[pos + i] = remaining & 0xff;
|
|
506
|
+
remaining = Math.floor(remaining / 0x100);
|
|
507
|
+
}
|
|
508
|
+
return pos + width;
|
|
509
|
+
}
|
|
510
|
+
|
|
511
|
+
writeUintBE(val: number, pos: number, width: number): number { return this.writeUIntBE(val, pos, width); }
|
|
512
|
+
|
|
513
|
+
writeIntLE(val: number, pos: number, width: number): number {
|
|
514
|
+
let adjusted = val;
|
|
515
|
+
if (adjusted < 0) adjusted += Math.pow(2, width * 8);
|
|
516
|
+
return this.writeUIntLE(adjusted, pos, width);
|
|
517
|
+
}
|
|
518
|
+
|
|
519
|
+
writeIntBE(val: number, pos: number, width: number): number {
|
|
520
|
+
let adjusted = val;
|
|
521
|
+
if (adjusted < 0) adjusted += Math.pow(2, width * 8);
|
|
522
|
+
return this.writeUIntBE(adjusted, pos, width);
|
|
523
|
+
}
|
|
524
|
+
|
|
525
|
+
// ---- Byte swap methods ----
|
|
526
|
+
|
|
527
|
+
swap16(): this {
|
|
528
|
+
if (this.length % 2 !== 0) throw new RangeError('Buffer size must be a multiple of 16-bits');
|
|
529
|
+
for (let i = 0; i < this.length; i += 2) {
|
|
530
|
+
const tmp = this[i];
|
|
531
|
+
this[i] = this[i + 1];
|
|
532
|
+
this[i + 1] = tmp;
|
|
533
|
+
}
|
|
534
|
+
return this;
|
|
535
|
+
}
|
|
536
|
+
|
|
537
|
+
swap32(): this {
|
|
538
|
+
if (this.length % 4 !== 0) throw new RangeError('Buffer size must be a multiple of 32-bits');
|
|
539
|
+
for (let i = 0; i < this.length; i += 4) {
|
|
540
|
+
const a = this[i], b = this[i + 1];
|
|
541
|
+
this[i] = this[i + 3];
|
|
542
|
+
this[i + 1] = this[i + 2];
|
|
543
|
+
this[i + 2] = b;
|
|
544
|
+
this[i + 3] = a;
|
|
545
|
+
}
|
|
546
|
+
return this;
|
|
547
|
+
}
|
|
548
|
+
|
|
549
|
+
swap64(): this {
|
|
550
|
+
if (this.length % 8 !== 0) throw new RangeError('Buffer size must be a multiple of 64-bits');
|
|
551
|
+
for (let i = 0; i < this.length; i += 8) {
|
|
552
|
+
const a = this[i], b = this[i + 1], c = this[i + 2], d = this[i + 3];
|
|
553
|
+
this[i] = this[i + 7]; this[i + 1] = this[i + 6];
|
|
554
|
+
this[i + 2] = this[i + 5]; this[i + 3] = this[i + 4];
|
|
555
|
+
this[i + 4] = d; this[i + 5] = c;
|
|
556
|
+
this[i + 6] = b; this[i + 7] = a;
|
|
557
|
+
}
|
|
558
|
+
return this;
|
|
559
|
+
}
|
|
560
|
+
}
|
|
561
|
+
|
|
562
|
+
// Wrap BufferPolyfill so it can be called without `new` (like Node.js's deprecated Buffer())
|
|
563
|
+
// Cast to BufferConstructor so downstream code sees Node.js-compatible Buffer types.
|
|
564
|
+
const Buffer = new Proxy(BufferPolyfill, {
|
|
565
|
+
apply(_target, _thisArg, args) {
|
|
566
|
+
// Buffer(string, encoding) or Buffer(size) or Buffer(array) — deprecated but still works in Node
|
|
567
|
+
return (BufferPolyfill as any).from(...args);
|
|
568
|
+
},
|
|
569
|
+
}) as unknown as BufferConstructor & typeof BufferPolyfill;
|
|
570
|
+
|
|
571
|
+
// Install on globalThis if missing
|
|
572
|
+
if (typeof globalThis.Buffer === 'undefined') {
|
|
573
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
574
|
+
(globalThis as any).Buffer = Buffer;
|
|
575
|
+
}
|
|
576
|
+
|
|
577
|
+
export { Buffer };
|
|
578
|
+
|
|
579
|
+
// Secondary exports matching Node.js `buffer` module surface
|
|
580
|
+
export const SlowBuffer = Buffer;
|
|
581
|
+
export const kMaxLength = 2147483647;
|
|
582
|
+
export const INSPECT_MAX_BYTES = 50;
|
|
583
|
+
|
|
584
|
+
export const constants = {
|
|
585
|
+
MAX_LENGTH: kMaxLength,
|
|
586
|
+
MAX_STRING_LENGTH: 536870888,
|
|
587
|
+
};
|
|
588
|
+
|
|
589
|
+
export function transcode(
|
|
590
|
+
src: Uint8Array,
|
|
591
|
+
_fromEnc: string,
|
|
592
|
+
_toEnc: string
|
|
593
|
+
): InstanceType<typeof BufferPolyfill> {
|
|
594
|
+
return BufferPolyfill.from(src);
|
|
595
|
+
}
|
|
596
|
+
|
|
597
|
+
export function resolveObjectURL(_id: string): undefined {
|
|
598
|
+
return undefined;
|
|
599
|
+
}
|
|
600
|
+
|
|
601
|
+
export function atob(data: string): string {
|
|
602
|
+
return globalThis.atob(data);
|
|
603
|
+
}
|
|
604
|
+
|
|
605
|
+
export function btoa(data: string): string {
|
|
606
|
+
return globalThis.btoa(data);
|
|
607
|
+
}
|
|
608
|
+
|
|
609
|
+
const bufferModule: Record<string, unknown> = {
|
|
610
|
+
Buffer: BufferPolyfill,
|
|
611
|
+
SlowBuffer,
|
|
612
|
+
kMaxLength,
|
|
613
|
+
INSPECT_MAX_BYTES,
|
|
614
|
+
constants,
|
|
615
|
+
transcode,
|
|
616
|
+
resolveObjectURL,
|
|
617
|
+
atob,
|
|
618
|
+
btoa,
|
|
619
|
+
};
|
|
620
|
+
|
|
621
|
+
Object.defineProperty(bufferModule, 'hasOwnProperty', {
|
|
622
|
+
value: Object.prototype.hasOwnProperty,
|
|
623
|
+
enumerable: false,
|
|
624
|
+
configurable: true,
|
|
625
|
+
writable: true,
|
|
626
|
+
});
|
|
627
|
+
|
|
628
|
+
export default bufferModule;
|