negentropy/js
Doug Hoyte ed5f8e7e48 js: implement protocol version 1 2023-12-06 17:55:14 -05:00
..
Negentropy.js js: implement protocol version 1 2023-12-06 17:55:14 -05:00
README.md js: implement protocol version 1 2023-12-06 17:55:14 -05:00

README.md

Negentropy Javascript Implementation

The library is contained in a single javascript file. It shouldn't need any dependencies, in either a browser or node.js:

const Negentropy = require('Negentropy.js');

Storage

First, you need to create a storage instance. Currently only Vector is implemented:

let storage = new NegentropyStorageVector();

Next, add all the items in your collection, and seal():

for (let item of myItems) {
    storage.insert(timestamp, id);
}

ne.seal();
  • timestamp should be a JS Number
  • id should be a hex string, Uint8Array, or node.js Buffer

Reconciliation

Create a Negentropy object:

let ne = new Negentropy(storage, 50_000);
  • The second parameter (50'000 above) is the frameSizeLimit. This can be omitted (or 0) to permit unlimited-sized frames.

On the client-side, create an initial message, and then transmit it to the server, receive the response, and reconcile until complete (signified by returning null for newMsg):

let msg = await ne.initiate();

while (msg.length !== null) {
    let response = queryServer(msg);
    let [newMsg, have, need] = await ne.reconcile(msg);
    msg = newMsg;
    // handle have/need
}
  • The output msgs and the IDs in have/need are hex strings, but you can set ne.wantUint8ArrayOutput = true if you want Uint8Arrays instead.

The server-side is similar, except it doesn't create an initial message, there are no have/need arrays, and newMsg will never be null:

while (1) {
    let msg = receiveMsgFromClient();
    let [newMsg] = await ne.reconcile(msg);
    respondToClient(newMsg);
}
  • The initiate() and reconcile() methods are async because the crypto.subtle.digest() browser API is async.
  • Timestamp values greater than Number.MAX_VALUE will currently cause failures.