mirror of
https://github.com/logos-messaging/logos-messaging-js.git
synced 2026-01-14 05:53:07 +00:00
* feat: implement LightPush v3 protocol support Add comprehensive LightPush v3 protocol implementation with: Core Features: - LightPush v3 protocol codec and multicodec detection - Status code-based error handling and validation - Protocol version inference and compatibility layers - Enhanced error types with detailed failure information Protocol Support: - Automatic v3/v2 protocol negotiation and fallback - Status code mapping to LightPush error types - Protocol version tracking in SDK results - Mixed protocol environment support Testing Infrastructure: - Comprehensive v3 error code handling tests - Mock functions for v3/v2 response scenarios - Protocol version detection and validation tests - Backward compatibility verification Implementation Details: - Clean separation between v2 and v3 response handling - Type-safe status code validation with isSuccess helper - Enhanced failure reporting with protocol version context - Proper error propagation through SDK layers This implementation maintains full backward compatibility with v2 while providing enhanced functionality for v3 protocol features. * feat: handle both light push protocols * fix: unsubscribe test * feat: consolidate lpv2/v3 types * feat(tests): bump nwaku to 0.36.0 * fix: remove extraneous exports * fix: add delay to tests * fix: remove protocol result types * feat: consolidate light push codec branching * fix: revert nwaku image * fix: remove multicodec * fix: remove protocolversion * feat: simplify v2/v3 branching logic to use two stream managers * fix: remove unused utils * fix: remove comments * fix: revert store test * fix: cleanup lightpush sdk * fix: remove unused util * fix: remove unused exports * fix: rename file from public to protocol_handler * fix: use proper type for sdk result * fix: update return types in filter * fix: rebase against latest master * fix: use both lightpush codecs when waiting for peer * fix: handle both lp codecs * fix: remove unused code * feat: use array for multicodec fields * fix: add timestamp if missing in v3 rpc * fix: resolve on either lp codec when waiting for peer * fix: remove unused util * fix: remove unnecessary abstraction * feat: accept nwaku docker image as arg, test lp backwards compat * fix: revert filter error * feat: add legacy flag to enable lightpushv2 only * Revert "feat: accept nwaku docker image as arg, test lp backwards compat" This reverts commit 857e12cbc73305e5c51abd057665bd34708b2737. * fix: remove unused test * feat: improve lp3 (#2597) * improve light push core * move back to singualar multicodec property, enable array prop only for light push * implement v2/v3 interop e2e test, re-add useLegacy flag, ensure e2e runs for v2 and v3 * fix v2 v3 condition * generate message package earlier * add log, fix condition --------- Co-authored-by: Sasha <118575614+weboko@users.noreply.github.com> Co-authored-by: Sasha <oleksandr@status.im>
166 lines
4.7 KiB
TypeScript
166 lines
4.7 KiB
TypeScript
import { createEncoder } from "@waku/core";
|
|
import { IWaku, Protocols } from "@waku/interfaces";
|
|
import { createRoutingInfo } from "@waku/utils";
|
|
import { utf8ToBytes } from "@waku/utils/bytes";
|
|
import { expect } from "chai";
|
|
|
|
import {
|
|
afterEachCustom,
|
|
beforeEachCustom,
|
|
makeLogFileName,
|
|
MessageCollector,
|
|
runMultipleNodes,
|
|
ServiceNode,
|
|
ServiceNodesFleet,
|
|
tearDownNodes,
|
|
teardownNodesWithRedundancy
|
|
} from "../../src/index.js";
|
|
|
|
import {
|
|
TestClusterId,
|
|
TestContentTopic,
|
|
TestEncoder,
|
|
TestNetworkConfig,
|
|
TestRoutingInfo
|
|
} from "./utils.js";
|
|
|
|
describe("Waku Light Push (Autosharding): Multiple Shards", function () {
|
|
this.timeout(30000);
|
|
const numServiceNodes = 2;
|
|
|
|
let waku: IWaku;
|
|
let serviceNodes: ServiceNodesFleet;
|
|
|
|
const customContentTopic2 = "/test/2/waku-light-push/utf8";
|
|
const customRoutingInfo2 = createRoutingInfo(TestNetworkConfig, {
|
|
contentTopic: customContentTopic2
|
|
});
|
|
|
|
const customEncoder2 = createEncoder({
|
|
contentTopic: customContentTopic2,
|
|
routingInfo: customRoutingInfo2
|
|
});
|
|
|
|
beforeEachCustom(this, async () => {
|
|
[serviceNodes, waku] = await runMultipleNodes(
|
|
this.ctx,
|
|
TestRoutingInfo,
|
|
{
|
|
lightpush: true,
|
|
filter: true,
|
|
relay: true,
|
|
contentTopic: [TestEncoder.contentTopic, customEncoder2.contentTopic]
|
|
},
|
|
false,
|
|
numServiceNodes,
|
|
false
|
|
);
|
|
});
|
|
|
|
afterEachCustom(this, async () => {
|
|
await teardownNodesWithRedundancy(serviceNodes, waku);
|
|
});
|
|
|
|
[true, false].forEach((useLegacy) => {
|
|
it(`Subscribe and receive messages on 2 different pubsubtopics with ${useLegacy ? "v2" : "v3"} protocol`, async function () {
|
|
if (customRoutingInfo2.pubsubTopic === TestEncoder.pubsubTopic)
|
|
throw "Invalid test, both encoder uses same shard";
|
|
|
|
const pushResponse1 = await waku.lightPush!.send(
|
|
TestEncoder,
|
|
{
|
|
payload: utf8ToBytes("M1")
|
|
},
|
|
{ useLegacy }
|
|
);
|
|
|
|
const pushResponse2 = await waku.lightPush!.send(
|
|
customEncoder2,
|
|
{
|
|
payload: utf8ToBytes("M2")
|
|
},
|
|
{ useLegacy }
|
|
);
|
|
|
|
expect(pushResponse1?.successes.length).to.eq(numServiceNodes);
|
|
expect(pushResponse2?.successes.length).to.eq(numServiceNodes);
|
|
|
|
const messageCollector1 = new MessageCollector(serviceNodes.nodes[0]);
|
|
const messageCollector2 = new MessageCollector(serviceNodes.nodes[1]);
|
|
|
|
expect(
|
|
await messageCollector1.waitForMessagesAutosharding(1, {
|
|
contentTopic: TestEncoder.contentTopic
|
|
})
|
|
).to.eq(true);
|
|
|
|
expect(
|
|
await messageCollector2.waitForMessagesAutosharding(1, {
|
|
contentTopic: customEncoder2.contentTopic
|
|
})
|
|
).to.eq(true);
|
|
|
|
messageCollector1.verifyReceivedMessage(0, {
|
|
expectedMessageText: "M1",
|
|
expectedContentTopic: TestEncoder.contentTopic,
|
|
expectedPubsubTopic: TestEncoder.pubsubTopic
|
|
});
|
|
|
|
messageCollector2.verifyReceivedMessage(0, {
|
|
expectedMessageText: "M2",
|
|
expectedContentTopic: customEncoder2.contentTopic,
|
|
expectedPubsubTopic: customEncoder2.pubsubTopic
|
|
});
|
|
});
|
|
});
|
|
|
|
it("Light push messages to 2 nwaku nodes each with different pubsubtopics", async function () {
|
|
// Set up and start a new nwaku node with Default PubsubTopic
|
|
const nwaku2 = new ServiceNode(makeLogFileName(this) + "3");
|
|
|
|
try {
|
|
await nwaku2.start({
|
|
filter: true,
|
|
lightpush: true,
|
|
relay: true,
|
|
clusterId: TestClusterId,
|
|
contentTopic: [TestContentTopic]
|
|
});
|
|
await nwaku2.ensureSubscriptionsAutosharding([
|
|
customEncoder2.pubsubTopic
|
|
]);
|
|
await waku.dial(await nwaku2.getMultiaddrWithId());
|
|
await waku.waitForPeers([Protocols.LightPush]);
|
|
|
|
const messageCollector2 = new MessageCollector(nwaku2);
|
|
|
|
await waku.lightPush!.send(TestEncoder, {
|
|
payload: utf8ToBytes("M1")
|
|
});
|
|
await waku.lightPush!.send(customEncoder2, {
|
|
payload: utf8ToBytes("M2")
|
|
});
|
|
|
|
await serviceNodes.messageCollector.waitForMessages(1, {
|
|
contentTopic: TestEncoder.contentTopic
|
|
});
|
|
await messageCollector2.waitForMessagesAutosharding(1, {
|
|
contentTopic: customEncoder2.contentTopic
|
|
});
|
|
|
|
serviceNodes.messageCollector.verifyReceivedMessage(0, {
|
|
expectedMessageText: "M1",
|
|
expectedContentTopic: TestEncoder.contentTopic,
|
|
expectedPubsubTopic: TestEncoder.pubsubTopic
|
|
});
|
|
messageCollector2.verifyReceivedMessage(0, {
|
|
expectedMessageText: "M2",
|
|
expectedContentTopic: customEncoder2.contentTopic,
|
|
expectedPubsubTopic: customEncoder2.pubsubTopic
|
|
});
|
|
} catch (e) {
|
|
await tearDownNodes([nwaku2], []);
|
|
}
|
|
});
|
|
});
|