包详细信息

@bokuweb/zstd-wasm

bokuweb26.7kMIT0.0.27

自述文件

zstd-wasm

Build Status Build Status

Zstandard for browser, Node.js and Deno. For now support only simple API.

installation

npm install @bokuweb/zstd-wasm

examples

Node.js

Playground: https://runkit.com/bokuweb/60f1172a58aae5001aea2418

const { init, compress, decompress } = require('@bokuweb/zstd-wasm');

(async () => {
  await init();
  const compressed = compress(Buffer.from('Hello zstd!!'), 10);
  const res = decompress(compressed);
  Buffer.from(res).toString(); // Hello zstd!!
})();

Deno

See also, https://github.com/bokuweb/zstd-wasm/tree/master/examples/deno

import { init, decompress, compress } from 'https://deno.land/x/zstd_wasm/deno/zstd.ts';

await init();
const encoder = new TextEncoder();
const buffer = encoder.encode('Hello World');
const compressed = compress(buffer, 10);
const decompressed = decompress(compressed);
const decoder = new TextDecoder();
console.log(decoder.decode(decompressed));

without bundlers

import { init, compress, decompress } from '@bokuweb/zstd-wasm';

(async () => {
  await init('./zstd.wasm'); // Please deploy `node_modules/@bokuweb/zstd-wasm/lib/wasm/zstd.wasm` to your hosting server.
  const compressed = compress(Buffer.from('Hello zstd!!'), 10);
  const res = decompress(compressed);
  Buffer.from(res).toString(); // Hello zstd!!
})();

with vite

Please set following config in vite.config.js.

import { defineConfig } from 'vite';

export default defineConfig({
  optimizeDeps: {
    exclude: ['@bokuweb/zstd-wasm'],
    esbuildOptions: {
      target: 'es2020',
    },
  },
});

with webpack4

We need to use file-loader with webpack4. This is because, webpack doesn’t work well with wasm modules created with Emscripten. See, https://github.com/webpack/webpack/issues/7352

import { init, compress, decompress } from '@bokuweb/zstd-wasm';

(async () => {
  await init();
  const compressed = compress(Buffer.from('Hello zstd!!'), 10);
  const res = decompress(compressed);
  Buffer.from(res).toString(); // Hello zstd!!
})();

In this case, please install file-loader by yourself.

  • webpack.config.js
    {
    // ...snipped
    module: {
      rules: [
        {
          test: /zstd\.wasm$/,
          type: 'javascript/auto',
          loader: 'file-loader', // Please use file loader
        },
      ],
    },
    }

with webpack5

We need to use Asset Modules with webpack5. This is because, webpack doesn’t work well with wasm modules created with Emscripten. See, https://github.com/webpack/webpack/issues/7352

import { init, compress, decompress } from '@bokuweb/zstd-wasm';

(async () => {
  await init();
  const compressed = compress(Buffer.from('Hello zstd!!'), 10);
  const res = decompress(compressed);
  Buffer.from(res).toString(); // Hello zstd!!
})();
  • webpack.config.js
    {
    // ...snipped
    module: {
      rules: [
        {
          test: /zstd\.wasm/,
          type: 'asset/resource',
        },
      ],
    },
    // ...snipped
    }

Using dictionary

  1. Create the dictionary

zstd --train FullPathToTrainingSet/* -o dictionaryName

  1. Compress with dictionary
const dict = readFileSync('./dict');
const compressed = compressUsingDict(createCCtx(), buffer, dict, 10);
  1. Decompress with dictionary
const dict = readFileSync('./dict');
const decompressed = decompressUsingDict(createDCtx(), buffer, dict);

See also example

API

async init(path?: string): Promise<void>

Initialize module. Please specify path to zstd.wasm without bunders on browser.

compress(buffer: Uint8Array, compressionLevel?: number): Uint8Array

  • buffer: data to compress.
  • compressionLevel: (optional) compression level, default value is 3

Example:

const compressed = compress(buffer, 10);

decompress(buffer: Uint8Array): Uint8Array

  • buffer: data to decompress.

Example:

const decompressed = decompress(buffer);

compressUsingDict(cctx: number, buffer: Uint8Array, dict: Uint8Array, compressionLevel?: number): Uint8Array

  • cctx: a pointer to compress context. please create cctx with createCCtx.
  • buffer: data to compress.
  • dict: dictionary data.
  • compressionLevel: (optional) compression level, default value is 3

Example:

const dict = readFileSync('./dict');
const compressed = compressUsingDict(createCCtx(), buffer, dict, 10);

createCCtx(): number

  • create a pointer to compress context.

decompressUsingDict(dctx: number, dict: Uint8Array): Uint8Array

  • dctx: a pointer to decompress context. please create cctx with createDCtx.
  • buffer: data to decompress.
  • dict: dictionary data.

Example:

const dict = readFileSync('./dict');
const decompressed = decompressUsingDict(createDCtx(), buffer, dict);

createDCtx(): number

  • create a pointer to decompress context.

License

TypeScript glue is provided under the MIT License, and the zstd is provided by Facebook under the BSD 3-Clause License.

更新日志

Changelog

All notable changes to this project will be documented in this file.

The format is based on Keep a Changelog, and this project adheres to Semantic Versioning.

0.0.27 (17. Feb, 2025)

  • use emsdk 3.1.74

0.0.26 (4. Feb, 2025)

  • use zstd v1.5.6

0.0.22 (13. Dec, 2024)

  • update ArrayBuffer types.

0.0.20 (9. Apr, 2023)

  • use zstd v1.5.5

0.0.19 (11. Mar, 2023)

  • Fixed issue #104: RuntimeError: memory access out of bounds

0.0.17 (11. July, 2022)

  • expose dictionary API

0.0.16 (2. January, 2022)

  • Support simple dictionary API

0.0.15 (2. January, 2022)

  • Use zstd1.5.1 and emscripten3.1.0