First upload version 0.0.1

This commit is contained in:
Neyra
2026-02-05 15:27:49 +08:00
commit 8e9b7201ed
4182 changed files with 593136 additions and 0 deletions

View File

@@ -0,0 +1,36 @@
import { GgufReadOffset } from "../utils/GgufReadOffset.js";
import { Promisable } from "../../utils/transformPromisable.js";
export declare const valueTypeToBytesToRead: {
readonly uint8: 1;
readonly uint16: 2;
readonly uint32: 4;
readonly uint64: 8;
readonly int8: 1;
readonly int16: 2;
readonly int32: 4;
readonly int64: 8;
readonly float32: 4;
readonly float64: 8;
readonly bool: 1;
};
export declare abstract class GgufFileReader {
protected _buffer: Buffer<ArrayBuffer>;
abstract readByteRange(offset: number | GgufReadOffset, length: number): Promisable<Buffer>;
protected abstract ensureHasByteRange(offset: number | GgufReadOffset, length: number): Promisable<void>;
readUint8(offset: number | GgufReadOffset): Promisable<number>;
readUint16(offset: number | GgufReadOffset): Promisable<number>;
readUint32(offset: number | GgufReadOffset): Promisable<number>;
readUint64(offset: number | GgufReadOffset): Promisable<bigint>;
readInt8(offset: number | GgufReadOffset): Promisable<number>;
readInt16(offset: number | GgufReadOffset): Promisable<number>;
readInt32(offset: number | GgufReadOffset): Promisable<number>;
readInt64(offset: number | GgufReadOffset): Promisable<bigint>;
readFloat32(offset: number | GgufReadOffset): Promisable<number>;
readFloat64(offset: number | GgufReadOffset): Promisable<number>;
readBool(offset: number | GgufReadOffset): Promisable<boolean>;
readString(offset: number | GgufReadOffset): Promisable<string>;
readStringWithLength(offset: number | GgufReadOffset, length: number): Promisable<string>;
protected _addToBuffer(buffer: Buffer): void;
private _withBufferRead;
static castNumberIfSafe(value: bigint): number | bigint;
}

View File

@@ -0,0 +1,106 @@
import { GgufReadOffset } from "../utils/GgufReadOffset.js";
import { transformPromisable } from "../../utils/transformPromisable.js";
export const valueTypeToBytesToRead = {
uint8: 1,
uint16: 2,
uint32: 4,
uint64: 8,
int8: 1,
int16: 2,
int32: 4,
int64: 8,
float32: 4,
float64: 8,
bool: 1
};
export class GgufFileReader {
_buffer = Buffer.alloc(0);
readUint8(offset) {
return this._withBufferRead(offset, valueTypeToBytesToRead.uint8, (resolvedOffset) => {
return this._buffer.readUInt8(resolvedOffset);
});
}
readUint16(offset) {
return this._withBufferRead(offset, valueTypeToBytesToRead.uint16, (resolvedOffset) => {
return this._buffer.readUInt16LE(resolvedOffset);
});
}
readUint32(offset) {
return this._withBufferRead(offset, valueTypeToBytesToRead.uint32, (resolvedOffset) => {
return this._buffer.readUInt32LE(resolvedOffset);
});
}
readUint64(offset) {
return this._withBufferRead(offset, valueTypeToBytesToRead.uint64, (resolvedOffset) => {
return this._buffer.readBigUInt64LE(resolvedOffset);
});
}
readInt8(offset) {
return this._withBufferRead(offset, valueTypeToBytesToRead.int8, (resolvedOffset) => {
return this._buffer.readInt8(resolvedOffset);
});
}
readInt16(offset) {
return this._withBufferRead(offset, valueTypeToBytesToRead.int16, (resolvedOffset) => {
return this._buffer.readInt16LE(resolvedOffset);
});
}
readInt32(offset) {
return this._withBufferRead(offset, valueTypeToBytesToRead.int32, (resolvedOffset) => {
return this._buffer.readInt32LE(resolvedOffset);
});
}
readInt64(offset) {
return this._withBufferRead(offset, valueTypeToBytesToRead.int64, (resolvedOffset) => {
return this._buffer.readBigInt64LE(resolvedOffset);
});
}
readFloat32(offset) {
return this._withBufferRead(offset, valueTypeToBytesToRead.float32, (resolvedOffset) => {
return this._buffer.readFloatLE(resolvedOffset);
});
}
readFloat64(offset) {
return this._withBufferRead(offset, valueTypeToBytesToRead.float64, (resolvedOffset) => {
return this._buffer.readDoubleLE(resolvedOffset);
});
}
readBool(offset) {
return this._withBufferRead(offset, valueTypeToBytesToRead.uint8, (resolvedOffset) => {
return this._buffer.readUInt8(resolvedOffset) === 1;
});
}
readString(offset) {
const readOffset = GgufReadOffset.resolveReadOffset(offset);
return transformPromisable(this.readUint64(readOffset), (length) => {
return this.readStringWithLength(readOffset, Number(length));
});
}
readStringWithLength(offset, length) {
const readLength = valueTypeToBytesToRead.uint8 * length;
return this._withBufferRead(offset, readLength, (resolvedOffset) => {
return this._buffer.toString("utf8", resolvedOffset, Math.min(resolvedOffset + readLength, this._buffer.length));
});
}
_addToBuffer(buffer) {
const newBuffer = Buffer.alloc(this._buffer.byteLength + buffer.byteLength);
this._buffer.copy(newBuffer);
buffer.copy(newBuffer, this._buffer.byteLength);
this._buffer = newBuffer;
}
_withBufferRead(offset, length, reader) {
return transformPromisable(this.ensureHasByteRange(offset, length), () => {
const resolvedOffset = GgufReadOffset.resolveReadOffset(offset);
return transformPromisable(reader(resolvedOffset.offset), (res) => {
resolvedOffset.moveBy(Math.min(length, this._buffer.length - resolvedOffset.offset));
return res;
});
});
}
static castNumberIfSafe(value) {
if (value > Number.MAX_SAFE_INTEGER)
return value;
return Number(value);
}
}
//# sourceMappingURL=GgufFileReader.js.map

View File

@@ -0,0 +1 @@
{"version":3,"file":"GgufFileReader.js","sourceRoot":"","sources":["../../../src/gguf/fileReaders/GgufFileReader.ts"],"names":[],"mappings":"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"}

View File

@@ -0,0 +1,16 @@
import { GgufReadOffset } from "../utils/GgufReadOffset.js";
import { GgufFileReader } from "./GgufFileReader.js";
type GgufFsFileReaderOptions = {
filePath: string;
signal?: AbortSignal;
};
export declare class GgufFsFileReader extends GgufFileReader {
readonly filePath: string;
private readonly _signal?;
constructor({ filePath, signal }: GgufFsFileReaderOptions);
readByteRange(offset: number | GgufReadOffset, length: number): Buffer<ArrayBuffer> | Promise<Buffer<ArrayBuffer>>;
protected ensureHasByteRange(offset: number | GgufReadOffset, length: number): Promise<void> | undefined;
private _readToExpandBufferUpToOffset;
private _readByteRange;
}
export {};

View File

@@ -0,0 +1,62 @@
import fs from "node:fs/promises";
import path from "node:path";
import { withLock } from "lifecycle-utils";
import { GgufReadOffset } from "../utils/GgufReadOffset.js";
import { defaultExtraAllocationSize } from "../consts.js";
import { GgufFileReader } from "./GgufFileReader.js";
export class GgufFsFileReader extends GgufFileReader {
filePath;
_signal;
constructor({ filePath, signal }) {
super();
this.filePath = path.resolve(process.cwd(), filePath);
this._signal = signal;
}
readByteRange(offset, length) {
const readOffset = GgufReadOffset.resolveReadOffset(offset);
const endOffset = readOffset.offset + length;
if (endOffset >= this._buffer.length)
return this._readToExpandBufferUpToOffset(endOffset)
.then(() => {
const res = this._buffer.subarray(readOffset.offset, endOffset);
readOffset.moveBy(length);
return res;
});
const res = this._buffer.subarray(readOffset.offset, endOffset);
readOffset.moveBy(length);
return res;
}
ensureHasByteRange(offset, length) {
const readOffset = GgufReadOffset.resolveReadOffset(offset);
const endOffset = readOffset.offset + length;
if (endOffset >= this._buffer.length)
return this._readToExpandBufferUpToOffset(endOffset)
.then(() => {
if (endOffset >= this._buffer.length)
throw new Error("Expected buffer to be long enough for the requested byte range");
});
return undefined;
}
async _readToExpandBufferUpToOffset(endOffset, extraAllocationSize = defaultExtraAllocationSize) {
return await withLock([this, "modifyBuffer"], this._signal, async () => {
if (endOffset < this._buffer.length)
return;
const missingBytesBuffer = await this._readByteRange(this._buffer.length, endOffset + extraAllocationSize - this._buffer.length);
this._addToBuffer(missingBytesBuffer);
});
}
async _readByteRange(start, length) {
const fd = await fs.open(this.filePath, "r");
try {
if (this._signal?.aborted)
throw this._signal.reason;
const buffer = Buffer.alloc(length);
await fd.read(buffer, 0, length, start);
return buffer;
}
finally {
await fd.close();
}
}
}
//# sourceMappingURL=GgufFsFileReader.js.map

View File

@@ -0,0 +1 @@
{"version":3,"file":"GgufFsFileReader.js","sourceRoot":"","sources":["../../../src/gguf/fileReaders/GgufFsFileReader.ts"],"names":[],"mappings":"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"}

View File

@@ -0,0 +1,28 @@
import retry from "async-retry";
import { GgufReadOffset } from "../utils/GgufReadOffset.js";
import { ModelFileAccessTokens } from "../../utils/modelFileAccessTokens.js";
import { ModelDownloadEndpoints } from "../../utils/modelDownloadEndpoints.js";
import { GgufFileReader } from "./GgufFileReader.js";
type GgufFetchFileReaderOptions = {
url: string;
retryOptions?: retry.Options;
headers?: Record<string, string>;
signal?: AbortSignal;
tokens?: ModelFileAccessTokens;
endpoints?: ModelDownloadEndpoints;
};
export declare class GgufNetworkFetchFileReader extends GgufFileReader {
readonly url: string;
readonly retryOptions: retry.Options;
readonly headers: Record<string, string>;
readonly tokens?: ModelFileAccessTokens;
readonly endpoints?: ModelDownloadEndpoints;
private readonly _signal?;
private _tryHeaders;
constructor({ url, retryOptions, headers, tokens, endpoints, signal }: GgufFetchFileReaderOptions);
readByteRange(offset: number | GgufReadOffset, length: number): Buffer<ArrayBuffer> | Promise<Buffer<ArrayBuffer>>;
protected ensureHasByteRange(offset: number | GgufReadOffset, length: number): Promise<void> | undefined;
private _fetchToExpandBufferUpToOffset;
private _fetchByteRange;
}
export {};

View File

@@ -0,0 +1,94 @@
import retry from "async-retry";
import { withLock } from "lifecycle-utils";
import { GgufReadOffset } from "../utils/GgufReadOffset.js";
import { defaultExtraAllocationSize, ggufDefaultFetchRetryOptions } from "../consts.js";
import { resolveModelFileAccessTokensTryHeaders } from "../../utils/modelFileAccessTokens.js";
import { GgufFileReader } from "./GgufFileReader.js";
export class GgufNetworkFetchFileReader extends GgufFileReader {
url;
retryOptions;
headers;
tokens;
endpoints;
_signal;
_tryHeaders = undefined;
constructor({ url, retryOptions = ggufDefaultFetchRetryOptions, headers, tokens, endpoints, signal }) {
super();
this.url = url;
this.retryOptions = retryOptions;
this.headers = headers ?? {};
this.tokens = tokens;
this.endpoints = endpoints;
this._signal = signal;
}
readByteRange(offset, length) {
const readOffset = GgufReadOffset.resolveReadOffset(offset);
const endOffset = readOffset.offset + length;
if (endOffset >= this._buffer.length)
return this._fetchToExpandBufferUpToOffset(endOffset)
.then(() => {
const res = this._buffer.subarray(readOffset.offset, endOffset);
readOffset.moveBy(length);
return res;
});
const res = this._buffer.subarray(readOffset.offset, endOffset);
readOffset.moveBy(length);
return res;
}
ensureHasByteRange(offset, length) {
const readOffset = GgufReadOffset.resolveReadOffset(offset);
const endOffset = readOffset.offset + length;
if (endOffset >= this._buffer.length)
return this._fetchToExpandBufferUpToOffset(endOffset)
.then(() => {
if (endOffset >= this._buffer.length)
throw new Error("Expected buffer to be long enough for the requested byte range");
});
return undefined;
}
async _fetchToExpandBufferUpToOffset(endOffset, extraAllocationSize = defaultExtraAllocationSize) {
await withLock([this, "modifyBuffer"], this._signal, async () => {
if (endOffset < this._buffer.length)
return;
const missingBytesBuffer = await retry(async (bail) => {
try {
return await this._fetchByteRange(this._buffer.length, endOffset + extraAllocationSize - this._buffer.length);
}
catch (err) {
if (this._signal?.aborted) {
bail(this._signal.reason);
throw this._signal.reason;
}
throw err;
}
}, this.retryOptions);
if (this._signal?.aborted)
throw this._signal.reason;
this._addToBuffer(missingBytesBuffer);
});
}
async _fetchByteRange(start, length) {
if (this._tryHeaders == null)
this._tryHeaders = await resolveModelFileAccessTokensTryHeaders(this.url, this.tokens, this.endpoints, this.headers);
const headersToTry = [this.headers, ...this._tryHeaders];
while (headersToTry.length > 0) {
const headers = headersToTry.shift();
const response = await fetch(this.url, {
headers: {
...headers,
Range: `bytes=${start}-${start + length}`,
accept: "*/*"
},
signal: this._signal
});
if ((response.status >= 500 || response.status === 429 || response.status === 401) && headersToTry.length > 0)
continue;
if (!response.ok)
throw new Error(`Failed to fetch byte range: ${response.status} ${response.statusText}`);
const arrayBuffer = await response.arrayBuffer();
return Buffer.from(arrayBuffer);
}
throw new Error("Failed to fetch byte range: no more headers to try");
}
}
//# sourceMappingURL=GgufNetworkFetchFileReader.js.map

View File

@@ -0,0 +1 @@
{"version":3,"file":"GgufNetworkFetchFileReader.js","sourceRoot":"","sources":["../../../src/gguf/fileReaders/GgufNetworkFetchFileReader.ts"],"names":[],"mappings":"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"}