@loaders.gl/compression
Version:
Decompression and compression plugins for loaders.gl
88 lines (77 loc) • 2.61 kB
text/typescript
// loaders.gl
// SPDX-License-Identifier: MIT
// Copyright (c) vis.gl contributors
import {createWorker} from '@loaders.gl/worker-utils';
// Compressors
import {NoCompression} from '../lib/no-compression';
import {BrotliCompression} from '../lib/brotli-compression';
import {DeflateCompression} from '../lib/deflate-compression';
import {GZipCompression} from '../lib/gzip-compression';
import {LZ4Compression} from '../lib/lz4-compression';
// import {LZOCompression} from '../lib/lzo-compression';
import {SnappyCompression} from '../lib/snappy-compression';
import {ZstdCompression} from '../lib/zstd-compression';
// Import big dependencies
// import brotli from 'brotli'; - brotli has problems with decompress in browsers
// import brotliDecompress from 'brotli/decompress';
import lz4js from 'lz4js';
// import lzo from 'lzo';
// import {ZstdCodec} from 'zstd-codec';
// Inject large dependencies through Compression constructor options
const modules = {
// brotli has problems with decompress in browsers
// brotli: {
// decompress: brotliDecompress,
// compress: () => {
// throw new Error('brotli compress');
// }
// },
lz4js
// lzo,
// 'zstd-codec': ZstdCodec
};
/** @type {Compression[]} */
const COMPRESSIONS = [
new NoCompression({modules}),
new BrotliCompression({modules}),
new DeflateCompression({modules}),
new GZipCompression({modules}),
// new LZOCompression({modules}),
new LZ4Compression({modules}),
new SnappyCompression({modules}),
new ZstdCompression({modules})
];
createWorker(async (data, options = {}) => {
const operation = getOperation(String(options?.operation));
const compression = getCompression(String(options?.compression));
// @ts-ignore
switch (operation) {
case 'compress':
return await compression.compress(data);
case 'decompress':
return await compression.decompress(data);
default:
throw new Error('invalid option');
}
});
function getOperation(operation: string): 'compress' | 'decompress' {
switch (operation) {
case 'compress':
case 'deflate':
return 'compress';
case 'decompress':
case 'inflate':
return 'decompress';
default:
throw new Error(
`@loaders.gl/compression: Unsupported operation ${operation}. Expected 'compress' or 'decompress'`
);
}
}
function getCompression(name: string) {
const Compression = COMPRESSIONS.find((compression_) => name === compression_.name);
if (!Compression) {
throw new Error(`@loaders.gl/compression: Unsupported compression ${name}`);
}
return Compression;
}