@gjsify/buffer 0.0.4 → 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/README.md +25 -1
- package/lib/esm/blob.js +66 -0
- package/lib/esm/buffer.js +661 -0
- package/lib/esm/index.js +31 -4
- package/lib/types/blob.d.ts +17 -0
- package/lib/types/buffer.d.ts +89 -0
- package/lib/types/index.d.ts +37 -3
- package/package.json +14 -20
- package/src/blob.ts +77 -0
- package/src/buffer.ts +786 -0
- package/src/index.spec.ts +959 -403
- package/src/index.ts +39 -3
- package/src/test.mts +1 -1
- package/tsconfig.json +21 -9
- package/tsconfig.tsbuildinfo +1 -0
- package/lib/cjs/index.js +0 -6
- package/test.gjs.js +0 -34758
- package/test.gjs.mjs +0 -34820
- package/test.gjs.mjs.meta.json +0 -1
- package/test.node.js +0 -1226
- package/test.node.mjs +0 -439
- package/tsconfig.types.json +0 -7
- package/tsconfig.types.tsbuildinfo +0 -1
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
declare class BlobPolyfill implements Blob {
|
|
2
|
+
_parts: BlobPart[];
|
|
3
|
+
readonly size: number;
|
|
4
|
+
readonly type: string;
|
|
5
|
+
constructor(parts?: BlobPart[], options?: BlobPropertyBag);
|
|
6
|
+
bytes(): Promise<Uint8Array<ArrayBuffer>>;
|
|
7
|
+
text(): Promise<string>;
|
|
8
|
+
arrayBuffer(): Promise<ArrayBuffer>;
|
|
9
|
+
slice(start?: number, end?: number, type?: string): Blob;
|
|
10
|
+
stream(): ReadableStream;
|
|
11
|
+
}
|
|
12
|
+
declare const Blob: typeof BlobPolyfill | {
|
|
13
|
+
new (blobParts?: BlobPart[], options?: BlobPropertyBag): Blob;
|
|
14
|
+
prototype: Blob;
|
|
15
|
+
};
|
|
16
|
+
declare const File: any;
|
|
17
|
+
export { Blob, File };
|
|
@@ -0,0 +1,89 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Node.js-compatible Buffer class.
|
|
3
|
+
*/
|
|
4
|
+
export declare class Buffer extends Uint8Array {
|
|
5
|
+
private static readonly _isBuffer;
|
|
6
|
+
static alloc(size: number, fill?: number | string | Uint8Array | Buffer, encoding?: string): Buffer;
|
|
7
|
+
static allocUnsafe(size: number): Buffer;
|
|
8
|
+
static allocUnsafeSlow(size: number): Buffer;
|
|
9
|
+
static from(arrayLike: ArrayLike<number>): Buffer;
|
|
10
|
+
static from<T>(arrayLike: ArrayLike<T>, mapfn: (v: T, k: number) => number, thisArg?: unknown): Buffer;
|
|
11
|
+
static from(elements: Iterable<number>): Buffer;
|
|
12
|
+
static from(value: string, encoding?: string): Buffer;
|
|
13
|
+
static from(value: ArrayBuffer | SharedArrayBuffer, byteOffset?: number, length?: number): Buffer;
|
|
14
|
+
static from(value: Uint8Array | Buffer): Buffer;
|
|
15
|
+
static isBuffer(obj: unknown): obj is Buffer;
|
|
16
|
+
static isEncoding(encoding: unknown): encoding is BufferEncoding;
|
|
17
|
+
static byteLength(string: string | ArrayBuffer | SharedArrayBuffer | ArrayBufferView, encoding?: string): number;
|
|
18
|
+
static compare(buf1: Buffer | Uint8Array, buf2: Buffer | Uint8Array): -1 | 0 | 1;
|
|
19
|
+
static concat(list: (Buffer | Uint8Array)[], totalLength?: number): Buffer;
|
|
20
|
+
static poolSize: number;
|
|
21
|
+
toString(encoding?: string, start?: number, end?: number): string;
|
|
22
|
+
toJSON(): {
|
|
23
|
+
type: 'Buffer';
|
|
24
|
+
data: number[];
|
|
25
|
+
};
|
|
26
|
+
equals(otherBuffer: Buffer | Uint8Array): boolean;
|
|
27
|
+
compare(target: Buffer | Uint8Array, targetStart?: number, targetEnd?: number, sourceStart?: number, sourceEnd?: number): -1 | 0 | 1;
|
|
28
|
+
copy(target: Buffer | Uint8Array, targetStart?: number, sourceStart?: number, sourceEnd?: number): number;
|
|
29
|
+
slice(start?: number, end?: number): Buffer;
|
|
30
|
+
subarray(start?: number, end?: number): Buffer;
|
|
31
|
+
write(string: string, offset?: number, length?: number, encoding?: string): number;
|
|
32
|
+
fill(value: number | string | Uint8Array | Buffer, offset?: number, end?: number, encoding?: string): this;
|
|
33
|
+
indexOf(value: number | string | Uint8Array | Buffer, byteOffset?: number, encoding?: string): number;
|
|
34
|
+
lastIndexOf(value: number | string | Uint8Array | Buffer, byteOffset?: number, encoding?: string): number;
|
|
35
|
+
includes(value: number | string | Uint8Array | Buffer, byteOffset?: number, encoding?: string): boolean;
|
|
36
|
+
readUInt8(offset?: number): number;
|
|
37
|
+
readUInt16BE(offset?: number): number;
|
|
38
|
+
readUInt16LE(offset?: number): number;
|
|
39
|
+
readUInt32BE(offset?: number): number;
|
|
40
|
+
readUInt32LE(offset?: number): number;
|
|
41
|
+
readInt8(offset?: number): number;
|
|
42
|
+
readInt16BE(offset?: number): number;
|
|
43
|
+
readInt16LE(offset?: number): number;
|
|
44
|
+
readInt32BE(offset?: number): number;
|
|
45
|
+
readInt32LE(offset?: number): number;
|
|
46
|
+
readFloatBE(offset?: number): number;
|
|
47
|
+
readFloatLE(offset?: number): number;
|
|
48
|
+
readDoubleBE(offset?: number): number;
|
|
49
|
+
readDoubleLE(offset?: number): number;
|
|
50
|
+
readBigInt64BE(offset?: number): bigint;
|
|
51
|
+
readBigInt64LE(offset?: number): bigint;
|
|
52
|
+
readBigUInt64BE(offset?: number): bigint;
|
|
53
|
+
readBigUInt64LE(offset?: number): bigint;
|
|
54
|
+
readUIntBE(offset: number, byteLength: number): number;
|
|
55
|
+
readUIntLE(offset: number, byteLength: number): number;
|
|
56
|
+
readIntBE(offset: number, byteLength: number): number;
|
|
57
|
+
readIntLE(offset: number, byteLength: number): number;
|
|
58
|
+
writeUInt8(value: number, offset?: number): number;
|
|
59
|
+
writeUInt16BE(value: number, offset?: number): number;
|
|
60
|
+
writeUInt16LE(value: number, offset?: number): number;
|
|
61
|
+
writeUInt32BE(value: number, offset?: number): number;
|
|
62
|
+
writeUInt32LE(value: number, offset?: number): number;
|
|
63
|
+
writeInt8(value: number, offset?: number): number;
|
|
64
|
+
writeInt16BE(value: number, offset?: number): number;
|
|
65
|
+
writeInt16LE(value: number, offset?: number): number;
|
|
66
|
+
writeInt32BE(value: number, offset?: number): number;
|
|
67
|
+
writeInt32LE(value: number, offset?: number): number;
|
|
68
|
+
writeFloatBE(value: number, offset?: number): number;
|
|
69
|
+
writeFloatLE(value: number, offset?: number): number;
|
|
70
|
+
writeDoubleBE(value: number, offset?: number): number;
|
|
71
|
+
writeDoubleLE(value: number, offset?: number): number;
|
|
72
|
+
writeBigInt64BE(value: bigint, offset?: number): number;
|
|
73
|
+
writeBigInt64LE(value: bigint, offset?: number): number;
|
|
74
|
+
writeBigUInt64BE(value: bigint, offset?: number): number;
|
|
75
|
+
writeBigUInt64LE(value: bigint, offset?: number): number;
|
|
76
|
+
swap16(): this;
|
|
77
|
+
swap32(): this;
|
|
78
|
+
swap64(): this;
|
|
79
|
+
}
|
|
80
|
+
export declare const kMaxLength: number;
|
|
81
|
+
export declare const kStringMaxLength: number;
|
|
82
|
+
export declare const constants: {
|
|
83
|
+
MAX_LENGTH: number;
|
|
84
|
+
MAX_STRING_LENGTH: number;
|
|
85
|
+
};
|
|
86
|
+
/** @deprecated Use Buffer.alloc() instead */
|
|
87
|
+
export declare class SlowBuffer extends Buffer {
|
|
88
|
+
constructor(size: number);
|
|
89
|
+
}
|
package/lib/types/index.d.ts
CHANGED
|
@@ -1,3 +1,37 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
1
|
+
import { Buffer, SlowBuffer, kMaxLength, kStringMaxLength, constants } from './buffer.js';
|
|
2
|
+
export { Buffer, SlowBuffer, kMaxLength, kStringMaxLength, constants, };
|
|
3
|
+
import { Blob as BlobImpl, File as FileImpl } from './blob.js';
|
|
4
|
+
export { BlobImpl as Blob, FileImpl as File };
|
|
5
|
+
export declare const atob: typeof globalThis.atob;
|
|
6
|
+
export declare const btoa: typeof globalThis.btoa;
|
|
7
|
+
export declare const INSPECT_MAX_BYTES = 50;
|
|
8
|
+
declare const _default: {
|
|
9
|
+
Buffer: typeof Buffer;
|
|
10
|
+
SlowBuffer: typeof SlowBuffer;
|
|
11
|
+
Blob: {
|
|
12
|
+
new (parts?: BlobPart[], options?: BlobPropertyBag): {
|
|
13
|
+
_parts: BlobPart[];
|
|
14
|
+
readonly size: number;
|
|
15
|
+
readonly type: string;
|
|
16
|
+
bytes(): Promise<Uint8Array<ArrayBuffer>>;
|
|
17
|
+
text(): Promise<string>;
|
|
18
|
+
arrayBuffer(): Promise<ArrayBuffer>;
|
|
19
|
+
slice(start?: number, end?: number, type?: string): Blob;
|
|
20
|
+
stream(): ReadableStream;
|
|
21
|
+
};
|
|
22
|
+
} | {
|
|
23
|
+
new (blobParts?: BlobPart[], options?: BlobPropertyBag): Blob;
|
|
24
|
+
prototype: Blob;
|
|
25
|
+
};
|
|
26
|
+
File: any;
|
|
27
|
+
atob: typeof globalThis.atob;
|
|
28
|
+
btoa: typeof globalThis.btoa;
|
|
29
|
+
kMaxLength: number;
|
|
30
|
+
kStringMaxLength: number;
|
|
31
|
+
constants: {
|
|
32
|
+
MAX_LENGTH: number;
|
|
33
|
+
MAX_STRING_LENGTH: number;
|
|
34
|
+
};
|
|
35
|
+
INSPECT_MAX_BYTES: number;
|
|
36
|
+
};
|
|
37
|
+
export default _default;
|
package/package.json
CHANGED
|
@@ -1,32 +1,26 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@gjsify/buffer",
|
|
3
|
-
"version": "0.0
|
|
3
|
+
"version": "0.1.0",
|
|
4
4
|
"description": "Node.js buffer module for Gjs",
|
|
5
5
|
"type": "module",
|
|
6
|
-
"main": "lib/cjs/index.js",
|
|
7
6
|
"module": "lib/esm/index.js",
|
|
7
|
+
"types": "lib/types/index.d.ts",
|
|
8
8
|
"exports": {
|
|
9
9
|
".": {
|
|
10
|
-
"
|
|
11
|
-
|
|
12
|
-
"default": "./lib/esm/index.js"
|
|
13
|
-
},
|
|
14
|
-
"require": {
|
|
15
|
-
"types": "./lib/types/index.d.ts",
|
|
16
|
-
"default": "./lib/cjs/index.js"
|
|
17
|
-
}
|
|
10
|
+
"types": "./lib/types/index.d.ts",
|
|
11
|
+
"default": "./lib/esm/index.js"
|
|
18
12
|
}
|
|
19
13
|
},
|
|
20
14
|
"scripts": {
|
|
21
|
-
"clear": "rm -rf lib tsconfig.tsbuildinfo tsconfig.types.tsbuildinfo || exit 0",
|
|
22
|
-
"
|
|
23
|
-
"build": "yarn
|
|
15
|
+
"clear": "rm -rf lib tsconfig.tsbuildinfo tsconfig.types.tsbuildinfo test.gjs.mjs test.node.mjs || exit 0",
|
|
16
|
+
"check": "tsc --noEmit",
|
|
17
|
+
"build": "yarn build:gjsify && yarn build:types",
|
|
24
18
|
"build:gjsify": "gjsify build --library 'src/**/*.{ts,js}' --exclude 'src/**/*.spec.{mts,ts}' 'src/test.{mts,ts}'",
|
|
25
|
-
"build:types": "tsc
|
|
19
|
+
"build:types": "tsc",
|
|
26
20
|
"build:test": "yarn build:test:gjs && yarn build:test:node",
|
|
27
21
|
"build:test:gjs": "gjsify build src/test.mts --app gjs --outfile test.gjs.mjs",
|
|
28
22
|
"build:test:node": "gjsify build src/test.mts --app node --outfile test.node.mjs",
|
|
29
|
-
"test": "yarn
|
|
23
|
+
"test": "yarn build:gjsify && yarn build:test && yarn test:node && yarn test:gjs",
|
|
30
24
|
"test:gjs": "gjs -m test.gjs.mjs",
|
|
31
25
|
"test:node": "node test.node.mjs"
|
|
32
26
|
},
|
|
@@ -36,12 +30,12 @@
|
|
|
36
30
|
"buffer"
|
|
37
31
|
],
|
|
38
32
|
"devDependencies": {
|
|
39
|
-
"@gjsify/cli": "^0.0
|
|
40
|
-
"@gjsify/unit": "^0.0
|
|
41
|
-
"@types/node": "^
|
|
42
|
-
"typescript": "^
|
|
33
|
+
"@gjsify/cli": "^0.1.0",
|
|
34
|
+
"@gjsify/unit": "^0.1.0",
|
|
35
|
+
"@types/node": "^25.5.0",
|
|
36
|
+
"typescript": "^6.0.2"
|
|
43
37
|
},
|
|
44
38
|
"dependencies": {
|
|
45
|
-
"@gjsify/
|
|
39
|
+
"@gjsify/utils": "^0.1.0"
|
|
46
40
|
}
|
|
47
41
|
}
|
package/src/blob.ts
ADDED
|
@@ -0,0 +1,77 @@
|
|
|
1
|
+
// WHATWG Blob/File polyfill for GJS
|
|
2
|
+
// Reference: Node.js lib/buffer.js (Blob), refs/deno/ext/web/09_file.js
|
|
3
|
+
// Node.js exports Blob from 'node:buffer' since v18.
|
|
4
|
+
// On GJS, globalThis.Blob is not available — this provides a minimal polyfill.
|
|
5
|
+
|
|
6
|
+
const _encoder = new TextEncoder();
|
|
7
|
+
|
|
8
|
+
class BlobPolyfill implements Blob {
|
|
9
|
+
_parts: BlobPart[];
|
|
10
|
+
readonly size: number;
|
|
11
|
+
readonly type: string;
|
|
12
|
+
|
|
13
|
+
constructor(parts?: BlobPart[], options?: BlobPropertyBag) {
|
|
14
|
+
this._parts = parts || [];
|
|
15
|
+
this.type = options?.type || '';
|
|
16
|
+
this.size = this._parts.reduce((acc: number, part: BlobPart) => {
|
|
17
|
+
if (typeof part === 'string') return acc + _encoder.encode(part).byteLength;
|
|
18
|
+
if (part instanceof ArrayBuffer) return acc + part.byteLength;
|
|
19
|
+
if (ArrayBuffer.isView(part)) return acc + part.byteLength;
|
|
20
|
+
if (part && typeof (part as Blob).size === 'number') return acc + (part as Blob).size;
|
|
21
|
+
return acc;
|
|
22
|
+
}, 0);
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
async bytes(): Promise<Uint8Array<ArrayBuffer>> {
|
|
26
|
+
const ab = await this.arrayBuffer();
|
|
27
|
+
return new Uint8Array(ab);
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
async text(): Promise<string> {
|
|
31
|
+
return new TextDecoder().decode(await this.arrayBuffer());
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
async arrayBuffer(): Promise<ArrayBuffer> {
|
|
35
|
+
const chunks: Uint8Array[] = [];
|
|
36
|
+
for (const part of this._parts) {
|
|
37
|
+
if (typeof part === 'string') chunks.push(_encoder.encode(part));
|
|
38
|
+
else if (part instanceof ArrayBuffer) chunks.push(new Uint8Array(part));
|
|
39
|
+
else if (ArrayBuffer.isView(part)) chunks.push(new Uint8Array(part.buffer as ArrayBuffer, part.byteOffset, part.byteLength));
|
|
40
|
+
else if (part && typeof (part as Blob).arrayBuffer === 'function') {
|
|
41
|
+
const ab = await (part as Blob).arrayBuffer();
|
|
42
|
+
chunks.push(new Uint8Array(ab));
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
const total = chunks.reduce((a, c) => a + c.byteLength, 0);
|
|
46
|
+
const result = new Uint8Array(total);
|
|
47
|
+
let offset = 0;
|
|
48
|
+
for (const c of chunks) { result.set(c, offset); offset += c.byteLength; }
|
|
49
|
+
return result.buffer as ArrayBuffer;
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
slice(start?: number, end?: number, type?: string): Blob {
|
|
53
|
+
return new BlobPolyfill([], { type }) as unknown as Blob;
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
stream(): ReadableStream {
|
|
57
|
+
throw new Error('Blob.stream() not implemented');
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
class FilePolyfill extends BlobPolyfill {
|
|
62
|
+
readonly name: string;
|
|
63
|
+
readonly lastModified: number;
|
|
64
|
+
readonly webkitRelativePath: string = '';
|
|
65
|
+
|
|
66
|
+
constructor(parts: BlobPart[], name: string, options?: FilePropertyBag) {
|
|
67
|
+
super(parts, options);
|
|
68
|
+
this.name = name;
|
|
69
|
+
this.lastModified = options?.lastModified ?? Date.now();
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
|
|
73
|
+
// Use native if available, polyfill otherwise
|
|
74
|
+
const Blob = globalThis.Blob ?? BlobPolyfill;
|
|
75
|
+
const File = (globalThis as any).File ?? FilePolyfill;
|
|
76
|
+
|
|
77
|
+
export { Blob, File };
|