From b3c8654ee6b673a796ab559678c876718c70b7fb Mon Sep 17 00:00:00 2001 From: juslesan Date: Mon, 9 Jun 2025 14:37:54 +0300 Subject: [PATCH 01/10] PlumTree can now be enabled from the sdk --- packages/sdk/src/NetworkNodeFacade.ts | 24 ++++++++++++++----- packages/sdk/src/StreamrClient.ts | 15 +++++++++--- packages/sdk/src/publish/Publisher.ts | 6 +++-- packages/sdk/src/subscribe/Subscription.ts | 4 ++++ .../sdk/src/subscribe/SubscriptionSession.ts | 7 +++++- packages/trackerless-network/src/exports.ts | 2 +- 6 files changed, 45 insertions(+), 13 deletions(-) diff --git a/packages/sdk/src/NetworkNodeFacade.ts b/packages/sdk/src/NetworkNodeFacade.ts index fa6fbdb067..50b678cd56 100644 --- a/packages/sdk/src/NetworkNodeFacade.ts +++ b/packages/sdk/src/NetworkNodeFacade.ts @@ -11,6 +11,7 @@ import { NetworkOptions, StreamMessage as NewStreamMessage, ProxyDirection, + StreamPartDeliveryOptions, createNetworkNode as createNetworkNode_ } from '@streamr/trackerless-network' import { Logger, MetricsContext, StreamPartID, StreamPartIDUtils, UserID } from '@streamr/utils' @@ -32,9 +33,16 @@ export interface NetworkNodeStub { getNodeId: () => DhtAddress addMessageListener: (listener: (msg: NewStreamMessage) => void) => void removeMessageListener: (listener: (msg: NewStreamMessage) => void) => void - join: (streamPartId: StreamPartID, neighborRequirement?: { minCount: number, timeout: number }) => Promise + join: ( + streamPartId: StreamPartID, + neighborRequirement?: { minCount: number, timeout: number }, + deliveryOptions?: StreamPartDeliveryOptions + ) => Promise leave: (streamPartId: StreamPartID) => Promise - broadcast: (streamMessage: NewStreamMessage) => Promise + broadcast: ( + streamMessage: NewStreamMessage, + deliveryOptions?: StreamPartDeliveryOptions + ) => Promise getStreamParts: () => StreamPartID[] getNeighbors: (streamPartId: StreamPartID) => readonly DhtAddress[] getPeerDescriptor: () => PeerDescriptor @@ -214,9 +222,13 @@ export class NetworkNodeFacade { return node.getNodeId() } - async join(streamPartId: StreamPartID, neighborRequirement?: { minCount: number, timeout: number }): Promise { + async join( + streamPartId: StreamPartID, + neighborRequirement?: { minCount: number, timeout: number }, + deliveryOptions?: StreamPartDeliveryOptions + ): Promise { const node = await this.getNode() - await node.join(streamPartId, neighborRequirement) + await node.join(streamPartId, neighborRequirement, deliveryOptions) } async leave(streamPartId: StreamPartID): Promise { @@ -224,9 +236,9 @@ export class NetworkNodeFacade { await node.leave(streamPartId) } - async broadcast(msg: OldStreamMessage): Promise { + async broadcast(msg: OldStreamMessage, deliveryOptions?: StreamPartDeliveryOptions): Promise { const node = await this.getNode() - node.broadcast(StreamMessageTranslator.toProtobuf(msg)) + node.broadcast(StreamMessageTranslator.toProtobuf(msg), deliveryOptions) } addMessageListener(listener: (msg: OldStreamMessage) => void): void { diff --git a/packages/sdk/src/StreamrClient.ts b/packages/sdk/src/StreamrClient.ts index ef7ab205e3..13edd53af9 100644 --- a/packages/sdk/src/StreamrClient.ts +++ b/packages/sdk/src/StreamrClient.ts @@ -7,7 +7,7 @@ import 'reflect-metadata' import './utils/PatchTsyringe' import { DhtAddress } from '@streamr/dht' -import { ProxyDirection } from '@streamr/trackerless-network' +import { ProxyDirection, StreamPartDeliveryOptions } from '@streamr/trackerless-network' import { DEFAULT_PARTITION_COUNT, EthereumAddress, HexString, Logger, StreamID, TheGraphClient, toEthereumAddress, toUserId } from '@streamr/utils' import type { Overrides } from 'ethers' import EventEmitter from 'eventemitter3' @@ -79,6 +79,13 @@ export interface ExtraSubscribeOptions { * The streamr client wallet address must be an authorized signer for the contract. */ erc1271Contract?: HexString + + delivery?: StreamPartDeliveryOptions + + /** + * Delivery options for the publish. + */ + publish?: StreamPartDeliveryOptions } const logger = new Logger(module) @@ -165,9 +172,10 @@ export class StreamrClient { async publish( streamDefinition: StreamDefinition, content: unknown, - metadata?: PublishMetadata + metadata?: PublishMetadata, + deliveryOptions?: StreamPartDeliveryOptions ): Promise { - const result = await this.publisher.publish(streamDefinition, content, metadata) + const result = await this.publisher.publish(streamDefinition, content, metadata, deliveryOptions) this.eventEmitter.emit('messagePublished', result) return convertStreamMessageToMessage(result) } @@ -227,6 +235,7 @@ export class StreamrClient { streamPartId, options.raw ?? false, options.erc1271Contract !== undefined ? toEthereumAddress(options.erc1271Contract) : undefined, + options.delivery, eventEmitter, this.loggerFactory ) diff --git a/packages/sdk/src/publish/Publisher.ts b/packages/sdk/src/publish/Publisher.ts index 6508c5935f..2af25a0471 100644 --- a/packages/sdk/src/publish/Publisher.ts +++ b/packages/sdk/src/publish/Publisher.ts @@ -16,6 +16,7 @@ import { createLazyMap, Mapping } from '../utils/Mapping' import { GroupKeyQueue } from './GroupKeyQueue' import { MessageFactory } from './MessageFactory' import { ConfigInjectionToken, type StrictStreamrClientConfig } from '../Config' +import { StreamPartDeliveryOptions } from '@streamr/trackerless-network' export interface PublishMetadata { timestamp?: string | number | Date @@ -87,7 +88,8 @@ export class Publisher { async publish( streamDefinition: StreamDefinition, content: unknown, - metadata?: PublishMetadata + metadata?: PublishMetadata, + deliveryOptions?: StreamPartDeliveryOptions ): Promise { const timestamp = parseTimestamp(metadata) /* @@ -117,7 +119,7 @@ export class Publisher { }, partition ) - await this.node.broadcast(message) + await this.node.broadcast(message, deliveryOptions) return message } catch (e) { const errorCode = (e instanceof StreamrClientError) ? e.code : 'UNKNOWN_ERROR' diff --git a/packages/sdk/src/subscribe/Subscription.ts b/packages/sdk/src/subscribe/Subscription.ts index e2a00aa5b6..bface70a77 100644 --- a/packages/sdk/src/subscribe/Subscription.ts +++ b/packages/sdk/src/subscribe/Subscription.ts @@ -2,6 +2,7 @@ import { EthereumAddress, Logger, StreamPartID } from '@streamr/utils' import EventEmitter from 'eventemitter3' import { LoggerFactory } from '../utils/LoggerFactory' import { MessageStream } from './MessageStream' +import { StreamPartDeliveryOptions } from '@streamr/trackerless-network' /** * Events emitted by {@link Subscription}. @@ -29,6 +30,7 @@ export class Subscription extends MessageStream { /** @internal */ readonly isRaw: boolean readonly erc1271ContractAddress: EthereumAddress | undefined + readonly deliveryOptions: StreamPartDeliveryOptions private readonly eventEmitter: EventEmitter private readonly logger: Logger @@ -37,6 +39,7 @@ export class Subscription extends MessageStream { streamPartId: StreamPartID, isRaw: boolean, erc1271ContractAddress: EthereumAddress | undefined, + deliveryOptions: StreamPartDeliveryOptions, eventEmitter: EventEmitter, loggerFactory: LoggerFactory ) { @@ -44,6 +47,7 @@ export class Subscription extends MessageStream { this.streamPartId = streamPartId this.isRaw = isRaw this.erc1271ContractAddress = erc1271ContractAddress + this.deliveryOptions = deliveryOptions this.eventEmitter = eventEmitter this.logger = loggerFactory.createLogger(module) this.onError.listen((err) => { diff --git a/packages/sdk/src/subscribe/SubscriptionSession.ts b/packages/sdk/src/subscribe/SubscriptionSession.ts index 4b7964d2c6..008880e6a5 100644 --- a/packages/sdk/src/subscribe/SubscriptionSession.ts +++ b/packages/sdk/src/subscribe/SubscriptionSession.ts @@ -12,6 +12,10 @@ import { Subscription } from './Subscription' * A session contains one or more subscriptions to a single streamId + streamPartition pair. */ +const getAnyItemFromSet = (set: Set): T | undefined => { + return Array.from(set.values())[0] +} + export class SubscriptionSession { public readonly streamPartId: StreamPartID @@ -102,7 +106,8 @@ export class SubscriptionSession { private async subscribe(): Promise { this.node.addMessageListener(this.onMessageInput) if (!await this.node.isProxiedStreamPart(this.streamPartId)) { - await this.node.join(this.streamPartId) + const deliveryOptions = getAnyItemFromSet(this.subscriptions)!.deliveryOptions + await this.node.join(this.streamPartId, undefined, deliveryOptions) } } diff --git a/packages/trackerless-network/src/exports.ts b/packages/trackerless-network/src/exports.ts index 36e340e7b0..29d337483c 100644 --- a/packages/trackerless-network/src/exports.ts +++ b/packages/trackerless-network/src/exports.ts @@ -1,6 +1,6 @@ export { NetworkNode, createNetworkNode } from './NetworkNode' export { type NetworkOptions, NetworkStack } from './NetworkStack' -export { type ContentDeliveryManagerOptions, streamPartIdToDataKey } from './ContentDeliveryManager' +export { type ContentDeliveryManagerOptions, type StreamPartDeliveryOptions, streamPartIdToDataKey } from './ContentDeliveryManager' export { AsymmetricEncryptionType, ContentType, From c4617ed6f453a161e6d7ba1bd3db54a0550e6ac4 Mon Sep 17 00:00:00 2001 From: juslesan Date: Mon, 9 Jun 2025 14:55:26 +0300 Subject: [PATCH 02/10] fix build --- packages/sdk/src/StreamrClient.ts | 2 +- packages/sdk/src/utils/addStreamToStorageNode.ts | 1 + 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/packages/sdk/src/StreamrClient.ts b/packages/sdk/src/StreamrClient.ts index 13edd53af9..99af06c79f 100644 --- a/packages/sdk/src/StreamrClient.ts +++ b/packages/sdk/src/StreamrClient.ts @@ -235,7 +235,7 @@ export class StreamrClient { streamPartId, options.raw ?? false, options.erc1271Contract !== undefined ? toEthereumAddress(options.erc1271Contract) : undefined, - options.delivery, + options.delivery ?? {}, eventEmitter, this.loggerFactory ) diff --git a/packages/sdk/src/utils/addStreamToStorageNode.ts b/packages/sdk/src/utils/addStreamToStorageNode.ts index f10f94f32a..3c42750a5b 100644 --- a/packages/sdk/src/utils/addStreamToStorageNode.ts +++ b/packages/sdk/src/utils/addStreamToStorageNode.ts @@ -36,6 +36,7 @@ export const addStreamToStorageNode = async ( streamPartId, false, undefined, + {}, new EventEmitter(), loggerFactory ) From ebe6364bc3a534d738d8e7763a436c6bbdb45bd5 Mon Sep 17 00:00:00 2001 From: juslesan Date: Mon, 9 Jun 2025 15:20:54 +0300 Subject: [PATCH 03/10] fix test build --- packages/sdk/src/StreamrClient.ts | 5 ----- packages/sdk/test/unit/SubscriptionSession.test.ts | 2 +- packages/sdk/test/unit/resendSubscription.test.ts | 2 +- 3 files changed, 2 insertions(+), 7 deletions(-) diff --git a/packages/sdk/src/StreamrClient.ts b/packages/sdk/src/StreamrClient.ts index 99af06c79f..ae42ad6181 100644 --- a/packages/sdk/src/StreamrClient.ts +++ b/packages/sdk/src/StreamrClient.ts @@ -81,11 +81,6 @@ export interface ExtraSubscribeOptions { erc1271Contract?: HexString delivery?: StreamPartDeliveryOptions - - /** - * Delivery options for the publish. - */ - publish?: StreamPartDeliveryOptions } const logger = new Logger(module) diff --git a/packages/sdk/test/unit/SubscriptionSession.test.ts b/packages/sdk/test/unit/SubscriptionSession.test.ts index 8531d6c44c..763cf5c7fd 100644 --- a/packages/sdk/test/unit/SubscriptionSession.test.ts +++ b/packages/sdk/test/unit/SubscriptionSession.test.ts @@ -14,7 +14,7 @@ const ADDRESS_ONE = randomEthereumAddress() const ADDRESS_TWO = randomEthereumAddress() function createSubscription(erc1271contractAddress?: EthereumAddress): Subscription { - return new Subscription(STREAM_PART_ID, false, erc1271contractAddress, mock(), mock()) + return new Subscription(STREAM_PART_ID, false, erc1271contractAddress, {}, mock(), mock()) } describe('SubscriptionSession', () => { diff --git a/packages/sdk/test/unit/resendSubscription.test.ts b/packages/sdk/test/unit/resendSubscription.test.ts index fbfbfc867e..76bef18153 100644 --- a/packages/sdk/test/unit/resendSubscription.test.ts +++ b/packages/sdk/test/unit/resendSubscription.test.ts @@ -102,7 +102,7 @@ describe('resend subscription', () => { gapFill = true ) => { const eventEmitter = new EventEmitter() - sub = new Subscription(STREAM_PART_ID, false, undefined, eventEmitter, mockLoggerFactory()) + sub = new Subscription(STREAM_PART_ID, false, undefined, {}, eventEmitter, mockLoggerFactory()) initResendSubscription( sub, {} as any, From a77d0685c24c860abce4af57ce5e7769df229932 Mon Sep 17 00:00:00 2001 From: juslesan Date: Tue, 10 Jun 2025 12:38:30 +0300 Subject: [PATCH 04/10] refactor getAnyItemFromSet --- packages/sdk/src/subscribe/SubscriptionSession.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/sdk/src/subscribe/SubscriptionSession.ts b/packages/sdk/src/subscribe/SubscriptionSession.ts index 008880e6a5..8d44dd1da7 100644 --- a/packages/sdk/src/subscribe/SubscriptionSession.ts +++ b/packages/sdk/src/subscribe/SubscriptionSession.ts @@ -13,7 +13,7 @@ import { Subscription } from './Subscription' */ const getAnyItemFromSet = (set: Set): T | undefined => { - return Array.from(set.values())[0] + return set.values().next().value } export class SubscriptionSession { From 539ead8218ef62ec31fb87f7ee60239bf4d8529e Mon Sep 17 00:00:00 2001 From: juslesan Date: Tue, 10 Jun 2025 12:39:07 +0300 Subject: [PATCH 05/10] add StreamPartDeliveryOptions to exports --- packages/sdk/src/exports.ts | 1 + 1 file changed, 1 insertion(+) diff --git a/packages/sdk/src/exports.ts b/packages/sdk/src/exports.ts index 5fa699dc56..6ce3e540bd 100644 --- a/packages/sdk/src/exports.ts +++ b/packages/sdk/src/exports.ts @@ -65,6 +65,7 @@ export { convertBytesToStreamMessage, convertStreamMessageToBytes } from './prot export type { DhtAddress } from '@streamr/dht' export { ContentType, EncryptedGroupKey, EncryptionType, ProxyDirection, SignatureType } from '@streamr/trackerless-network' +export type { StreamPartDeliveryOptions } from '@streamr/trackerless-network' export type { StreamID, StreamPartID, From 98075fc52b6ab9b202d148ce6fe1a9052ad496de Mon Sep 17 00:00:00 2001 From: juslesan Date: Tue, 10 Jun 2025 12:45:27 +0300 Subject: [PATCH 06/10] Subsription deliveryOptions can be undefined --- packages/sdk/src/subscribe/Subscription.ts | 4 ++-- packages/sdk/src/utils/addStreamToStorageNode.ts | 2 +- packages/sdk/test/unit/SubscriptionSession.test.ts | 2 +- packages/sdk/test/unit/resendSubscription.test.ts | 2 +- 4 files changed, 5 insertions(+), 5 deletions(-) diff --git a/packages/sdk/src/subscribe/Subscription.ts b/packages/sdk/src/subscribe/Subscription.ts index bface70a77..f8459b2d79 100644 --- a/packages/sdk/src/subscribe/Subscription.ts +++ b/packages/sdk/src/subscribe/Subscription.ts @@ -30,7 +30,7 @@ export class Subscription extends MessageStream { /** @internal */ readonly isRaw: boolean readonly erc1271ContractAddress: EthereumAddress | undefined - readonly deliveryOptions: StreamPartDeliveryOptions + readonly deliveryOptions: StreamPartDeliveryOptions | undefined private readonly eventEmitter: EventEmitter private readonly logger: Logger @@ -39,7 +39,7 @@ export class Subscription extends MessageStream { streamPartId: StreamPartID, isRaw: boolean, erc1271ContractAddress: EthereumAddress | undefined, - deliveryOptions: StreamPartDeliveryOptions, + deliveryOptions: StreamPartDeliveryOptions | undefined, eventEmitter: EventEmitter, loggerFactory: LoggerFactory ) { diff --git a/packages/sdk/src/utils/addStreamToStorageNode.ts b/packages/sdk/src/utils/addStreamToStorageNode.ts index 3c42750a5b..a4cd5236e0 100644 --- a/packages/sdk/src/utils/addStreamToStorageNode.ts +++ b/packages/sdk/src/utils/addStreamToStorageNode.ts @@ -36,7 +36,7 @@ export const addStreamToStorageNode = async ( streamPartId, false, undefined, - {}, + undefined, new EventEmitter(), loggerFactory ) diff --git a/packages/sdk/test/unit/SubscriptionSession.test.ts b/packages/sdk/test/unit/SubscriptionSession.test.ts index 763cf5c7fd..97cd59468a 100644 --- a/packages/sdk/test/unit/SubscriptionSession.test.ts +++ b/packages/sdk/test/unit/SubscriptionSession.test.ts @@ -14,7 +14,7 @@ const ADDRESS_ONE = randomEthereumAddress() const ADDRESS_TWO = randomEthereumAddress() function createSubscription(erc1271contractAddress?: EthereumAddress): Subscription { - return new Subscription(STREAM_PART_ID, false, erc1271contractAddress, {}, mock(), mock()) + return new Subscription(STREAM_PART_ID, false, erc1271contractAddress, undefined, mock(), mock()) } describe('SubscriptionSession', () => { diff --git a/packages/sdk/test/unit/resendSubscription.test.ts b/packages/sdk/test/unit/resendSubscription.test.ts index 76bef18153..c56668f267 100644 --- a/packages/sdk/test/unit/resendSubscription.test.ts +++ b/packages/sdk/test/unit/resendSubscription.test.ts @@ -102,7 +102,7 @@ describe('resend subscription', () => { gapFill = true ) => { const eventEmitter = new EventEmitter() - sub = new Subscription(STREAM_PART_ID, false, undefined, {}, eventEmitter, mockLoggerFactory()) + sub = new Subscription(STREAM_PART_ID, false, undefined, undefined, eventEmitter, mockLoggerFactory()) initResendSubscription( sub, {} as any, From 5606a74fff4dd81586a03b9bb7aa7d9a9f59873e Mon Sep 17 00:00:00 2001 From: juslesan Date: Wed, 11 Jun 2025 16:35:51 +0300 Subject: [PATCH 07/10] rename to plumtreeOptimization --- packages/trackerless-network/src/ContentDeliveryManager.ts | 4 ++-- .../content-delivery-layer/createContentDeliveryLayerNode.ts | 4 ++-- packages/trackerless-network/test/utils/utils.ts | 4 ++-- 3 files changed, 6 insertions(+), 6 deletions(-) diff --git a/packages/trackerless-network/src/ContentDeliveryManager.ts b/packages/trackerless-network/src/ContentDeliveryManager.ts index 25bd0d1f00..8375bd96dc 100644 --- a/packages/trackerless-network/src/ContentDeliveryManager.ts +++ b/packages/trackerless-network/src/ContentDeliveryManager.ts @@ -75,7 +75,7 @@ export interface ContentDeliveryManagerOptions { } export interface StreamPartDeliveryOptions { - plumTreeOptimisation?: boolean + plumtreeOptimization?: boolean } export const streamPartIdToDataKey = (streamPartId: StreamPartID): DhtAddress => { @@ -288,7 +288,7 @@ export class ContentDeliveryManager extends EventEmitter { neighborUpdateInterval: this.options.neighborUpdateInterval, isLocalNodeEntryPoint, doNotBufferWhileConnecting: this.options.doNotBufferWhileConnecting, - plumTreeOptimisation: streamPartDeliveryOptions?.plumTreeOptimisation + plumtreeOptimization: streamPartDeliveryOptions?.plumtreeOptimization }) } diff --git a/packages/trackerless-network/src/content-delivery-layer/createContentDeliveryLayerNode.ts b/packages/trackerless-network/src/content-delivery-layer/createContentDeliveryLayerNode.ts index f2c48df977..22bae9a6c3 100644 --- a/packages/trackerless-network/src/content-delivery-layer/createContentDeliveryLayerNode.ts +++ b/packages/trackerless-network/src/content-delivery-layer/createContentDeliveryLayerNode.ts @@ -35,7 +35,7 @@ type ContentDeliveryLayerNodeOptions = MarkOptional { @@ -68,7 +68,7 @@ const createConfigWithDefaults = (options: ContentDeliveryLayerNodeOptions): Str streamPartId: options.streamPartId, rpcCommunicator }) : undefined - const plumTreeManager = options.plumTreeOptimisation ? new PlumTreeManager({ + const plumTreeManager = options.plumtreeOptimization ? new PlumTreeManager({ neighbors, localPeerDescriptor: options.localPeerDescriptor, rpcCommunicator diff --git a/packages/trackerless-network/test/utils/utils.ts b/packages/trackerless-network/test/utils/utils.ts index 2ce13b5837..6b08915b11 100644 --- a/packages/trackerless-network/test/utils/utils.ts +++ b/packages/trackerless-network/test/utils/utils.ts @@ -41,7 +41,7 @@ export const createMockContentDeliveryLayerNodeAndDhtNode = async ( entryPointDescriptor: PeerDescriptor, streamPartId: StreamPartID, simulator: Simulator, - plumTreeOptimisation?: boolean + plumtreeOptimization?: boolean ): Promise<[ DiscoveryLayerNode, ContentDeliveryLayerNode ]> => { const mockCm = new SimulatorTransport(localPeerDescriptor, simulator) await mockCm.start() @@ -62,7 +62,7 @@ export const createMockContentDeliveryLayerNodeAndDhtNode = async ( localPeerDescriptor, rpcRequestTimeout: 5000, isLocalNodeEntryPoint: () => false, - plumTreeOptimisation + plumtreeOptimization }) return [discoveryLayerNode, contentDeliveryLayerNode] } From 8c4b19ea6f83e32dc89cea4b65b50059974af71e Mon Sep 17 00:00:00 2001 From: juslesan Date: Wed, 11 Jun 2025 16:40:49 +0300 Subject: [PATCH 08/10] changelog --- CHANGELOG.md | 1 + 1 file changed, 1 insertion(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 24dfa94088..67e876dc31 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -18,6 +18,7 @@ Changes before Tatum release are not documented in this file. - Add new storage node address `STREAMR_STORAGE_NODE_ADDRESS` (https://github.com/streamr-dev/network/pull/3020) - Add `peaq` environment (https://github.com/streamr-dev/network/pull/3111) - Add `iotex` environment (https://github.com/streamr-dev/network/pull/3142) +- Add support for using the plumtree optimisation in stream partitions in the SDK (https://github.com/streamr-dev/network/pull/3147) #### Changed From 8108cbee09e0c2c52d6ecd6a714d853215a204ae Mon Sep 17 00:00:00 2001 From: juslesan Date: Thu, 12 Jun 2025 12:02:00 +0300 Subject: [PATCH 09/10] change log --- CHANGELOG.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index d386fc5a4d..4bd55b3459 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -11,7 +11,7 @@ Changes before Tatum release are not documented in this file. ### @streamr/sdk #### Added -- Add support for using the plumtree optimisation in stream partitions in the SDK (https://github.com/streamr-dev/network/pull/3147) +- Add support for using the plumtree optimization in stream partitions in the SDK (https://github.com/streamr-dev/network/pull/3147) #### Changed From 77a0e6442e8df3b816828ff013df31fe3de38bc2 Mon Sep 17 00:00:00 2001 From: juslesan Date: Thu, 12 Jun 2025 12:19:32 +0300 Subject: [PATCH 10/10] don't mention the sdk --- CHANGELOG.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 4bd55b3459..5733c0639e 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -11,7 +11,7 @@ Changes before Tatum release are not documented in this file. ### @streamr/sdk #### Added -- Add support for using the plumtree optimization in stream partitions in the SDK (https://github.com/streamr-dev/network/pull/3147) +- Add support for using the plumtree optimization in stream partitions (https://github.com/streamr-dev/network/pull/3147) #### Changed