js: avoid use of BigInt operations for older safari browsers [#103]

This commit is contained in:
Brandon Liu
2022-12-10 18:36:04 +08:00
parent 577bd9ede7
commit b8a78a7f6a
2 changed files with 28 additions and 11 deletions

View File

@@ -330,6 +330,12 @@ export class FetchSource implements Source {
}
}
export function getUint64(v: DataView, offset: number): number {
const wh = v.getUint32(offset + 4, true);
const wl = v.getUint32(offset + 0, true);
return wh * Math.pow(2, 32) + wl;
}
export function bytesToHeader(bytes: ArrayBuffer, etag?: string): Header {
const v = new DataView(bytes);
const spec_version = v.getUint8(7);
@@ -341,17 +347,17 @@ export function bytesToHeader(bytes: ArrayBuffer, etag?: string): Header {
return {
specVersion: spec_version,
rootDirectoryOffset: Number(v.getBigUint64(8, true)),
rootDirectoryLength: Number(v.getBigUint64(16, true)),
jsonMetadataOffset: Number(v.getBigUint64(24, true)),
jsonMetadataLength: Number(v.getBigUint64(32, true)),
leafDirectoryOffset: Number(v.getBigUint64(40, true)),
leafDirectoryLength: Number(v.getBigUint64(48, true)),
tileDataOffset: Number(v.getBigUint64(56, true)),
tileDataLength: Number(v.getBigUint64(64, true)),
numAddressedTiles: Number(v.getBigUint64(72, true)),
numTileEntries: Number(v.getBigUint64(80, true)),
numTileContents: Number(v.getBigUint64(88, true)),
rootDirectoryOffset: getUint64(v, 8),
rootDirectoryLength: getUint64(v, 16),
jsonMetadataOffset: getUint64(v, 24),
jsonMetadataLength: getUint64(v, 32),
leafDirectoryOffset: getUint64(v, 40),
leafDirectoryLength: getUint64(v, 48),
tileDataOffset: getUint64(v, 56),
tileDataLength: getUint64(v, 64),
numAddressedTiles: getUint64(v, 72),
numTileEntries: getUint64(v, 80),
numTileContents: getUint64(v, 88),
clustered: v.getUint8(96) === 1,
internalCompression: v.getUint8(97),
tileCompression: v.getUint8(98),

View File

@@ -14,6 +14,7 @@ import {
RangeResponse,
EtagMismatch,
PMTiles,
getUint64,
} from "../index";
test("varint", () => {
@@ -171,6 +172,16 @@ test("cache getHeader", async () => {
assert.strictEqual(header.maxLat, 1);
});
test("getUint64", async () => {
const view = new DataView(new ArrayBuffer(8));
view.setBigUint64(0, 0n, true);
assert.strictEqual(getUint64(view, 0), 0);
view.setBigUint64(0, 1n, true);
assert.strictEqual(getUint64(view, 0), 1);
view.setBigUint64(0, 9007199254740991n, true);
assert.strictEqual(getUint64(view, 0), 9007199254740991);
});
test("cache check against empty", async () => {
const source = new TestNodeFileSource("test/data/empty.pmtiles", "1");
const cache = new SharedPromiseCache();