Pure JavaScript Vcdiff decoder that works with binary deltas from Google's open-vcdiff

Usage no npm install needed!

<script type="module">
  import ablyVcdiffDecoder from 'https://cdn.skypack.dev/@ably/vcdiff-decoder';


Vcdiff Decoder

Build Status npm version

A Vcdiff decoder written in pure JavaScript. Supports the Vcdiff format, as specified in RFC 3284.

Tested and proven with Vcdiff patch/delta files generated from Google's open-vcdiff and Joshua MacDonald's xdelta.

Installation from npm for Node.js

npm install @ably/vcdiff-decoder

and require as:

var Ably = require('@ably/vcdiff-decoder');

Script include for Web Browsers

Include the library in your HTML from our CDN:

<script src="https://cdn.ably.io/lib/vcdiff-decoder.min-1.js"></script>

We follow Semantic Versioning. To lock into a major or minor version of the client library, you can specify a specific version number - for example:

  • https://cdn.ably.io/lib/vcdiff-decoder.min-1.js for latest 1.* version
  • https://cdn.ably.io/lib/vcdiff-decoder.min-1.0.js for latest v1.0.* version
  • https://cdn.ably.io/lib/vcdiff-decoder.min-1.0.3.js for version 1.0.3 explicitly

You can load the non-minified version by omitting min- from the URL, for example https://cdn.ably.io/lib/vcdiff-decoder-1.js.

See tagged releases for available versions.


const vcdiff = require('@ably/vcdiff-decoder');
let target = vcdiff.decode(delta, source);

Exported Functions

decode(delta, source)

Synchronous decode. Parameters:

  • delta: Uint8Array - the binary Vcdiff format encoding of the patch/diff information needed to transform source to the returned target
  • source: Uint8Array - the group of bytes to transform to the returned target using by applying delta

Returns a Uint8Array, the 'target', being the result of applying delta to source.



The vcdiff dev dependency of this project, used for testing, fails to build against Node.js 9 and newer. For this reason, until #3 has been addressed, the tests must be run against an environment with Node.js 8 installed.

At the time of writing this means:

vcdiff-decoder % node --version
vcdiff-decoder % npm --version

For those who use ASDF or compatible tooling to manage their Node.js runtime versions, we have included a .tool-versions file.


You can trigger a build using Webpack with:

npm run grunt -- build

which creates vcdiff-decoder.js and vcdiff-decoder.min.js in the dist folder.


To run all tests use:

npm test

Browser testing supported by

for which you will need to configure environment variables for BROWSERSTACK_USERNAME and BROWSERSTACK_ACCESSKEY.

Release Procedure

On the master branch:

  1. Increment the version, regenerate from source (a.k.a. build / bundle) and make a tagged commit which includes the built output from the /dist folder by running npm run grunt -- release:patch (or "major", "minor" or "prepatch" as appropriate - see grunt-bump Usage Examples)
  2. Release the tagged commit to Github using git push origin master --follow-tags
  3. Release to NPM using npm publish . --access public (this package is configured to require that 2FA is used by publishers)
  4. Release to Ably's CDN using npm run grunt -- publish-cdn (operable by Ably staff only)
  5. Visit tags and draft new release for the newly created tag