From 449797d5c15c278b14952ac4db828e50116e1a61 Mon Sep 17 00:00:00 2001 From: fryorcraken <110212804+fryorcraken@users.noreply.github.com> Date: Tue, 5 Aug 2025 14:55:57 +1000 Subject: [PATCH] fix: bloom filter protobuf decoding (#2529) * SDS: add bloom filter test * fix: ensure bloom filter can be decoded from protobuf --- packages/sds/src/bloom_filter/bloom.ts | 2 +- .../sds/src/message_channel/events.spec.ts | 33 +++++++++++++++++++ 2 files changed, 34 insertions(+), 1 deletion(-) create mode 100644 packages/sds/src/message_channel/events.spec.ts diff --git a/packages/sds/src/bloom_filter/bloom.ts b/packages/sds/src/bloom_filter/bloom.ts index 6037d5f7f8..66f45d1c5d 100644 --- a/packages/sds/src/bloom_filter/bloom.ts +++ b/packages/sds/src/bloom_filter/bloom.ts @@ -124,7 +124,7 @@ export class BloomFilter { hashN: (item: string, n: number, maxValue: number) => number ): BloomFilter { const bloomFilter = new BloomFilter(options, hashN); - const view = new DataView(bytes.buffer); + const view = new DataView(bytes.buffer, bytes.byteOffset, bytes.byteLength); for (let i = 0; i < bloomFilter.data.length; i++) { bloomFilter.data[i] = view.getBigUint64(i * 8, false); } diff --git a/packages/sds/src/message_channel/events.spec.ts b/packages/sds/src/message_channel/events.spec.ts new file mode 100644 index 0000000000..eb3ce23d18 --- /dev/null +++ b/packages/sds/src/message_channel/events.spec.ts @@ -0,0 +1,33 @@ +import { expect } from "chai"; + +import { DefaultBloomFilter } from "../bloom_filter/bloom.js"; + +import { decodeMessage, encodeMessage, Message } from "./events.js"; +import { DEFAULT_BLOOM_FILTER_OPTIONS } from "./message_channel.js"; + +describe("Message serialization", () => { + it("Bloom filter", () => { + const messageId = "first"; + + const bloomFilter = new DefaultBloomFilter(DEFAULT_BLOOM_FILTER_OPTIONS); + bloomFilter.insert(messageId); + + const message: Message = { + messageId: "123", + channelId: "my-channel", + causalHistory: [], + lamportTimestamp: 0, + bloomFilter: bloomFilter.toBytes() + }; + + const bytes = encodeMessage(message); + const decMessage = decodeMessage(bytes); + + const decBloomFilter = DefaultBloomFilter.fromBytes( + decMessage!.bloomFilter!, + DEFAULT_BLOOM_FILTER_OPTIONS + ); + + expect(decBloomFilter.lookup(messageId)).to.be.true; + }); +});