From 9c48874f70453bb1e77c6244f402b0a77065d42b Mon Sep 17 00:00:00 2001 From: Sean Zellmer Date: Mon, 27 Apr 2026 16:38:24 -0500 Subject: [PATCH 1/7] Bump `compact-encoding` to `3.0.0` --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 4848a184..f04b3bf1 100644 --- a/package.json +++ b/package.json @@ -48,7 +48,7 @@ "b4a": "^1.1.0", "bare-events": "^2.2.0", "big-sparse-array": "^1.0.3", - "compact-encoding": "^2.11.0", + "compact-encoding": "^3.0.0", "fast-fifo": "^1.3.0", "flat-tree": "^1.9.0", "hypercore-crypto": "^3.2.1", From 2479437b1a5b1242e1d529c87a0feb4fa97b8473 Mon Sep 17 00:00:00 2001 From: Sean Zellmer Date: Mon, 27 Apr 2026 16:38:51 -0500 Subject: [PATCH 2/7] Allow signature to be `null` in data upgrade Found via the test `multisig - prologue verify hash` failing. --- lib/messages.js | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/lib/messages.js b/lib/messages.js index 1993ec8a..9d7e5c5b 100644 --- a/lib/messages.js +++ b/lib/messages.js @@ -403,14 +403,14 @@ const dataUpgrade = { c.uint.preencode(state, u.length) nodeArray.preencode(state, u.nodes) nodeArray.preencode(state, u.additionalNodes) - c.buffer.preencode(state, u.signature) + c.optionalBuffer.preencode(state, u.signature) }, encode(state, u) { c.uint.encode(state, u.start) c.uint.encode(state, u.length) nodeArray.encode(state, u.nodes) nodeArray.encode(state, u.additionalNodes) - c.buffer.encode(state, u.signature) + c.optionalBuffer.encode(state, u.signature) }, decode(state) { return { @@ -418,7 +418,7 @@ const dataUpgrade = { length: c.uint.decode(state), nodes: nodeArray.decode(state), additionalNodes: nodeArray.decode(state), - signature: c.buffer.decode(state) + signature: c.optionalBuffer.decode(state) } } } From 870b50d573ec8a72c5ab487c8a1a1e3039a3024e Mon Sep 17 00:00:00 2001 From: Sean Zellmer Date: Fri, 1 May 2026 15:39:48 -0500 Subject: [PATCH 3/7] Remove default to empty buffer in `dataBlock` No longer required as `buffer` is now strict. --- lib/messages.js | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/lib/messages.js b/lib/messages.js index 9d7e5c5b..40bf3c3d 100644 --- a/lib/messages.js +++ b/lib/messages.js @@ -4,8 +4,6 @@ const { DEFAULT_NAMESPACE } = require('./caps') const { INVALID_OPLOG_VERSION } = require('hypercore-errors') const unslab = require('unslab') -const EMPTY = b4a.alloc(0) - const MANIFEST_PATCH = 0b00000001 const MANIFEST_PROLOGUE = 0b00000010 const MANIFEST_LINKED = 0b00000100 @@ -454,7 +452,7 @@ const dataBlock = { decode(state) { return { index: c.uint.decode(state), - value: c.buffer.decode(state) || EMPTY, + value: c.buffer.decode(state), nodes: nodeArray.decode(state) } } From 180d5c98b8de6bf6ef14ea868051abf9a000f33a Mon Sep 17 00:00:00 2001 From: Sean Zellmer Date: Fri, 1 May 2026 15:41:22 -0500 Subject: [PATCH 4/7] Use temporary git branch dep for `hypercore-storage` --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index f04b3bf1..fc282e00 100644 --- a/package.json +++ b/package.json @@ -54,7 +54,7 @@ "hypercore-crypto": "^3.2.1", "hypercore-errors": "^1.5.0", "hypercore-id-encoding": "^1.2.0", - "hypercore-storage": "^2.8.0", + "hypercore-storage": "github:holepunchto/hypercore-storage#compact-encoding-v3", "is-options": "^1.0.1", "nanoassert": "^2.0.0", "protomux": "^3.5.0", From 695640d36a17e4c979e11d3cd4b9328d8cc5c22b Mon Sep 17 00:00:00 2001 From: Sean Zellmer Date: Mon, 4 May 2026 14:05:46 -0500 Subject: [PATCH 5/7] Add test for supporting empty buffers w/ `.createByteStream()` Previously this would fail using `compact-encoding@2` as empty buffers would decode as `null` but the byte stream assumes it is a buffer returned. --- test/streams.js | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) diff --git a/test/streams.js b/test/streams.js index 48218726..6441420b 100644 --- a/test/streams.js +++ b/test/streams.js @@ -97,6 +97,23 @@ test('basic byte stream', async function (t) { t.is(expected.length, 0) }) +test('basic byte stream w/ empty buffers', async function (t) { + const core = await create(t) + + // 'end' enforces that it attempts to decode the previous blocks even though they dont contribute to byte length + const expected = ['hello', 'world', '', b4a.alloc(0), 'end'] + + await core.append(expected) + + t.is(core.length, expected.length, 'all blocks appended') + for await (const data of core.createByteStream()) { + const r = expected.shift() + t.alike(b4a.toString(data), typeof r === 'string' ? r : b4a.toString(r)) + } + + t.is(expected.length, 0) +}) + test('basic byte stream with byteOffset / byteLength', async function (t) { const core = await create(t) From d5e8c12f72918223932555095a97ffb9b050f8df Mon Sep 17 00:00:00 2001 From: Sean Zellmer Date: Mon, 4 May 2026 15:11:07 -0500 Subject: [PATCH 6/7] Remove now unused `b4a` in `lib/messages.js` --- lib/messages.js | 1 - 1 file changed, 1 deletion(-) diff --git a/lib/messages.js b/lib/messages.js index 40bf3c3d..37e8b17c 100644 --- a/lib/messages.js +++ b/lib/messages.js @@ -1,5 +1,4 @@ const c = require('compact-encoding') -const b4a = require('b4a') const { DEFAULT_NAMESPACE } = require('./caps') const { INVALID_OPLOG_VERSION } = require('hypercore-errors') const unslab = require('unslab') From 3e456b890970c0f46b49c8342bcfdecddd7b43da Mon Sep 17 00:00:00 2001 From: Mathias Buus Date: Tue, 5 May 2026 18:32:28 +0100 Subject: [PATCH 7/7] Update package.json --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index fc282e00..f04b3bf1 100644 --- a/package.json +++ b/package.json @@ -54,7 +54,7 @@ "hypercore-crypto": "^3.2.1", "hypercore-errors": "^1.5.0", "hypercore-id-encoding": "^1.2.0", - "hypercore-storage": "github:holepunchto/hypercore-storage#compact-encoding-v3", + "hypercore-storage": "^2.8.0", "is-options": "^1.0.1", "nanoassert": "^2.0.0", "protomux": "^3.5.0",