Merge pull request #181 from protomaps/decompressionstream-polyfill

use compression-stream-polyfill for faster, native gzip decompression
This commit is contained in:
Brandon Liu
2023-06-17 10:38:49 +08:00
committed by GitHub
3 changed files with 50 additions and 17 deletions

View File

@@ -1,4 +1,4 @@
import { decompressSync } from "fflate"; import { makeDecompressionStream } from "compression-streams-polyfill/ponyfill";
import v2 from "./v2"; import v2 from "./v2";
export * from "./adapters"; export * from "./adapters";
@@ -155,14 +155,17 @@ type DecompressFunc = (
compression: Compression compression: Compression
) => Promise<ArrayBuffer>; ) => Promise<ArrayBuffer>;
async function fflateDecompress( async function defaultDecompress(
buf: ArrayBuffer, buf: ArrayBuffer,
compression: Compression compression: Compression
): Promise<ArrayBuffer> { ): Promise<ArrayBuffer> {
if (compression === Compression.None || compression === Compression.Unknown) { if (compression === Compression.None || compression === Compression.Unknown) {
return buf; return buf;
} else if (compression === Compression.Gzip) { } else if (compression === Compression.Gzip) {
return decompressSync(new Uint8Array(buf)); let stream = new Response(buf).body!;
const decompressionStream = makeDecompressionStream(TransformStream);
let result = stream.pipeThrough(new decompressionStream("gzip"));
return new Response(result).arrayBuffer();
} else { } else {
throw Error("Compression method not supported"); throw Error("Compression method not supported");
} }
@@ -547,7 +550,7 @@ export class ResolvedValueCache {
constructor( constructor(
maxCacheEntries = 100, maxCacheEntries = 100,
prefetch = true, prefetch = true,
decompress: DecompressFunc = fflateDecompress decompress: DecompressFunc = defaultDecompress
) { ) {
this.cache = new Map<string, ResolvedValue>(); this.cache = new Map<string, ResolvedValue>();
this.maxCacheEntries = maxCacheEntries; this.maxCacheEntries = maxCacheEntries;
@@ -682,7 +685,7 @@ export class SharedPromiseCache {
constructor( constructor(
maxCacheEntries = 100, maxCacheEntries = 100,
prefetch = true, prefetch = true,
decompress: DecompressFunc = fflateDecompress decompress: DecompressFunc = defaultDecompress
) { ) {
this.cache = new Map<string, SharedPromiseCacheValue>(); this.cache = new Map<string, SharedPromiseCacheValue>();
this.maxCacheEntries = maxCacheEntries; this.maxCacheEntries = maxCacheEntries;
@@ -824,7 +827,7 @@ export class PMTiles {
if (decompress) { if (decompress) {
this.decompress = decompress; this.decompress = decompress;
} else { } else {
this.decompress = fflateDecompress; this.decompress = defaultDecompress;
} }
if (cache) { if (cache) {
this.cache = cache; this.cache = cache;

47
js/package-lock.json generated
View File

@@ -1,15 +1,16 @@
{ {
"name": "pmtiles", "name": "pmtiles",
"version": "2.7.2", "version": "2.8.0-beta.0",
"lockfileVersion": 2, "lockfileVersion": 2,
"requires": true, "requires": true,
"packages": { "packages": {
"": { "": {
"name": "pmtiles", "name": "pmtiles",
"version": "2.7.2", "version": "2.8.0-beta.0",
"license": "BSD-3-Clause", "license": "BSD-3-Clause",
"dependencies": { "dependencies": {
"fflate": "^0.7.3" "compression-streams-polyfill": "^0.1.3",
"fflate": "^0.8.0"
}, },
"devDependencies": { "devDependencies": {
"@types/node": "^18.11.9", "@types/node": "^18.11.9",
@@ -63,6 +64,19 @@
"integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==", "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==",
"dev": true "dev": true
}, },
"node_modules/compression-streams-polyfill": {
"version": "0.1.3",
"resolved": "https://registry.npmjs.org/compression-streams-polyfill/-/compression-streams-polyfill-0.1.3.tgz",
"integrity": "sha512-FOvusJGoWTKRb9JNMtCc42C81SdyJhJws/lbExADOkH1R8KpdzY4yFO6953lW5Vw498pnGXoyosr807KTr8BAA==",
"dependencies": {
"fflate": "^0.7.4"
}
},
"node_modules/compression-streams-polyfill/node_modules/fflate": {
"version": "0.7.4",
"resolved": "https://registry.npmjs.org/fflate/-/fflate-0.7.4.tgz",
"integrity": "sha512-5u2V/CDW15QM1XbbgS+0DfPxVB+jUKhWEKuuFuHncbk3tEEqzmoXL+2KyOFuKGqOnmdIy0/davWF1CkuwtibCw=="
},
"node_modules/esbuild": { "node_modules/esbuild": {
"version": "0.15.15", "version": "0.15.15",
"resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.15.15.tgz", "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.15.15.tgz",
@@ -437,9 +451,9 @@
} }
}, },
"node_modules/fflate": { "node_modules/fflate": {
"version": "0.7.3", "version": "0.8.0",
"resolved": "https://registry.npmjs.org/fflate/-/fflate-0.7.3.tgz", "resolved": "https://registry.npmjs.org/fflate/-/fflate-0.8.0.tgz",
"integrity": "sha512-0Zz1jOzJWERhyhsimS54VTqOteCNwRtIlh8isdL0AXLo0g7xNTfTL7oWrkmCnPhZGocKIkWHBistBrrpoNH3aw==" "integrity": "sha512-FAdS4qMuFjsJj6XHbBaZeXOgaypXp8iw/Tpyuq/w3XA41jjLHT8NPA+n7czH/DDhdncq0nAyDZmPeWXh2qmdIg=="
}, },
"node_modules/prettier": { "node_modules/prettier": {
"version": "2.8.4", "version": "2.8.4",
@@ -522,6 +536,21 @@
"integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==", "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==",
"dev": true "dev": true
}, },
"compression-streams-polyfill": {
"version": "0.1.3",
"resolved": "https://registry.npmjs.org/compression-streams-polyfill/-/compression-streams-polyfill-0.1.3.tgz",
"integrity": "sha512-FOvusJGoWTKRb9JNMtCc42C81SdyJhJws/lbExADOkH1R8KpdzY4yFO6953lW5Vw498pnGXoyosr807KTr8BAA==",
"requires": {
"fflate": "^0.7.4"
},
"dependencies": {
"fflate": {
"version": "0.7.4",
"resolved": "https://registry.npmjs.org/fflate/-/fflate-0.7.4.tgz",
"integrity": "sha512-5u2V/CDW15QM1XbbgS+0DfPxVB+jUKhWEKuuFuHncbk3tEEqzmoXL+2KyOFuKGqOnmdIy0/davWF1CkuwtibCw=="
}
}
},
"esbuild": { "esbuild": {
"version": "0.15.15", "version": "0.15.15",
"resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.15.15.tgz", "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.15.15.tgz",
@@ -703,9 +732,9 @@
"optional": true "optional": true
}, },
"fflate": { "fflate": {
"version": "0.7.3", "version": "0.8.0",
"resolved": "https://registry.npmjs.org/fflate/-/fflate-0.7.3.tgz", "resolved": "https://registry.npmjs.org/fflate/-/fflate-0.8.0.tgz",
"integrity": "sha512-0Zz1jOzJWERhyhsimS54VTqOteCNwRtIlh8isdL0AXLo0g7xNTfTL7oWrkmCnPhZGocKIkWHBistBrrpoNH3aw==" "integrity": "sha512-FAdS4qMuFjsJj6XHbBaZeXOgaypXp8iw/Tpyuq/w3XA41jjLHT8NPA+n7czH/DDhdncq0nAyDZmPeWXh2qmdIg=="
}, },
"prettier": { "prettier": {
"version": "2.8.4", "version": "2.8.4",

View File

@@ -1,6 +1,6 @@
{ {
"name": "pmtiles", "name": "pmtiles",
"version": "2.7.2", "version": "2.8.0-beta.0",
"description": "PMTiles archive decoder for browsers", "description": "PMTiles archive decoder for browsers",
"main": "dist/index.cjs", "main": "dist/index.cjs",
"module": "dist/index.mjs", "module": "dist/index.mjs",
@@ -32,6 +32,7 @@
"typescript": "^4.5.5" "typescript": "^4.5.5"
}, },
"dependencies": { "dependencies": {
"fflate": "^0.7.3" "compression-streams-polyfill": "^0.1.3",
"fflate": "^0.8.0"
} }
} }