From b8a78a7f6a9b25dd6abea02ceb2e751bc543a716 Mon Sep 17 00:00:00 2001 From: Brandon Liu Date: Sat, 10 Dec 2022 18:36:04 +0800 Subject: [PATCH] js: avoid use of BigInt operations for older safari browsers [#103] --- js/index.ts | 28 +++++++++++++++++----------- js/test/v3.test.ts | 11 +++++++++++ 2 files changed, 28 insertions(+), 11 deletions(-) diff --git a/js/index.ts b/js/index.ts index 00ccb86..57d2181 100644 --- a/js/index.ts +++ b/js/index.ts @@ -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), diff --git a/js/test/v3.test.ts b/js/test/v3.test.ts index e148acb..369afee 100644 --- a/js/test/v3.test.ts +++ b/js/test/v3.test.ts @@ -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();