From 05938b5127199c6a7e5ef6b827ac87338a8f9674 Mon Sep 17 00:00:00 2001 From: Danish Arora Date: Thu, 23 Oct 2025 19:04:21 +0530 Subject: [PATCH] chore: allow waku config through API --- app/src/main.tsx | 8 ++++- packages/core/src/client/OpChanClient.ts | 6 ++++ packages/core/src/lib/waku/CodecManager.ts | 7 ++-- .../src/lib/waku/core/ReliableMessaging.ts | 11 ++++--- packages/core/src/lib/waku/index.ts | 32 ++++++++++++------- packages/core/src/types/index.ts | 5 +++ 6 files changed, 48 insertions(+), 21 deletions(-) diff --git a/app/src/main.tsx b/app/src/main.tsx index d496783..b6e52cf 100644 --- a/app/src/main.tsx +++ b/app/src/main.tsx @@ -9,7 +9,13 @@ if (!(window as Window & typeof globalThis).Buffer) { } createRoot(document.getElementById('root')!).render( - + ); diff --git a/packages/core/src/client/OpChanClient.ts b/packages/core/src/client/OpChanClient.ts index dc89513..5e827e3 100644 --- a/packages/core/src/client/OpChanClient.ts +++ b/packages/core/src/client/OpChanClient.ts @@ -7,9 +7,11 @@ import { UserIdentityService } from '../lib/services/UserIdentityService'; import { DelegationManager, delegationManager } from '../lib/delegation'; import WalletManager from '../lib/wallet'; import { MessageService } from '../lib/services/MessageService'; +import { WakuConfig } from '../types'; export interface OpChanClientConfig { ordiscanApiKey: string; + wakuConfig: WakuConfig; } export class OpChanClient { @@ -35,6 +37,10 @@ export class OpChanClient { environment.configure(env); + // Initialize message manager with WakuConfig + this.messageManager.initialize(config.wakuConfig).catch(error => { + console.error('Failed to initialize message manager:', error); + }); this.messageService = new MessageService(this.delegation); this.userIdentityService = new UserIdentityService(this.messageService); diff --git a/packages/core/src/lib/waku/CodecManager.ts b/packages/core/src/lib/waku/CodecManager.ts index c3c400c..9b6c466 100644 --- a/packages/core/src/lib/waku/CodecManager.ts +++ b/packages/core/src/lib/waku/CodecManager.ts @@ -9,14 +9,15 @@ import { } from '../../types/waku'; import { CONTENT_TOPIC } from './constants'; import { OpchanMessage } from '../../types/forum'; +import { WakuConfig } from '../../types'; export class CodecManager { private encoder: IEncoder; private decoder: IDecoder; - constructor(private node: LightNode) { - this.encoder = this.node.createEncoder({ contentTopic: CONTENT_TOPIC }); - this.decoder = this.node.createDecoder({ contentTopic: CONTENT_TOPIC }); + constructor(private node: LightNode, config: WakuConfig) { + this.encoder = this.node.createEncoder({ contentTopic: config.contentTopic || CONTENT_TOPIC }); + this.decoder = this.node.createDecoder({ contentTopic: config.contentTopic || CONTENT_TOPIC }); } /** diff --git a/packages/core/src/lib/waku/core/ReliableMessaging.ts b/packages/core/src/lib/waku/core/ReliableMessaging.ts index ae85db7..24ad698 100644 --- a/packages/core/src/lib/waku/core/ReliableMessaging.ts +++ b/packages/core/src/lib/waku/core/ReliableMessaging.ts @@ -7,6 +7,7 @@ import { import { CodecManager } from '../CodecManager'; import { generateStringId } from '../../utils'; import { OpchanMessage } from '../../../types/forum'; +import { WakuConfig } from '../../../types'; export interface MessageStatusCallback { onSent?: (messageId: string) => void; @@ -22,9 +23,9 @@ export class ReliableMessaging { private incomingMessageCallbacks: Set = new Set(); private codecManager: CodecManager; - constructor(node: LightNode) { - this.codecManager = new CodecManager(node); - this.initializeChannel(node); + constructor(node: LightNode, config: WakuConfig) { + this.codecManager = new CodecManager(node, config); + this.initializeChannel(node, config); } // ===== PUBLIC METHODS ===== @@ -65,11 +66,11 @@ export class ReliableMessaging { // ===== PRIVATE METHODS ===== - private async initializeChannel(node: LightNode): Promise { + private async initializeChannel(node: LightNode, config: WakuConfig): Promise { const encoder = this.codecManager.getEncoder(); const decoder = this.codecManager.getDecoder(); const senderId = generateStringId(); - const channelId = 'opchan-messages'; + const channelId = config.reliableChannelId || 'opchan-messages'; try { this.channel = await ReliableChannel.create( diff --git a/packages/core/src/lib/waku/index.ts b/packages/core/src/lib/waku/index.ts index ec7e673..244e5f9 100644 --- a/packages/core/src/lib/waku/index.ts +++ b/packages/core/src/lib/waku/index.ts @@ -6,6 +6,7 @@ import { MessageStatusCallback, } from './services/MessageService'; import { ReliableMessaging } from './core/ReliableMessaging'; +import { WakuConfig } from '../../types'; export type { HealthChangeCallback, MessageStatusCallback }; @@ -13,13 +14,16 @@ class MessageManager { private nodeManager: WakuNodeManager | null = null; private messageService: MessageService | null = null; private reliableMessaging: ReliableMessaging | null = null; + private wakuConfig: WakuConfig; - constructor() {} + constructor(wakuConfig: WakuConfig) { + this.wakuConfig = wakuConfig; + } // ===== PUBLIC STATIC METHODS ===== - public static async create(): Promise { - const manager = new MessageManager(); + public static async create(wakuConfig: WakuConfig): Promise { + const manager = new MessageManager(wakuConfig); await manager.initialize(); return manager; } @@ -101,7 +105,8 @@ class MessageManager { try { console.log('Initializing reliable messaging...'); this.reliableMessaging = new ReliableMessaging( - this.nodeManager.getNode() + this.nodeManager.getNode(), + this.wakuConfig ); this.messageService?.updateReliableMessaging(this.reliableMessaging); console.log('Reliable messaging initialized successfully'); @@ -126,13 +131,18 @@ export class DefaultMessageManager { private _initPromise: Promise | null = null; private _pendingHealthSubscriptions: HealthChangeCallback[] = []; private _pendingMessageSubscriptions: ((message: any) => void)[] = []; + private _wakuConfig: WakuConfig | null = null; // ===== PUBLIC METHODS ===== // Initialize the manager asynchronously - async initialize(): Promise { - if (!this._initPromise) { - this._initPromise = MessageManager.create(); + async initialize(wakuConfig?: WakuConfig): Promise { + if (wakuConfig) { + this._wakuConfig = wakuConfig; + } + + if (!this._initPromise && this._wakuConfig) { + this._initPromise = MessageManager.create(this._wakuConfig); } this._instance = await this._initPromise; @@ -160,6 +170,9 @@ export class DefaultMessageManager { async sendMessage(message: any, callback?: any): Promise { if (!this._instance) { + if (!this._wakuConfig) { + throw new Error('WakuConfig must be provided before sending messages'); + } await this.initialize(); } return this._instance!.sendMessage(message, callback); @@ -200,9 +213,4 @@ export class DefaultMessageManager { const messageManager = new DefaultMessageManager(); -// Initialize in the background -messageManager.initialize().catch(error => { - console.error('Failed to initialize default MessageManager:', error); -}); - export default messageManager; diff --git a/packages/core/src/types/index.ts b/packages/core/src/types/index.ts index e30d274..87b3ec1 100644 --- a/packages/core/src/types/index.ts +++ b/packages/core/src/types/index.ts @@ -1 +1,6 @@ export * as forum from './forum'; + +export interface WakuConfig { + contentTopic?: string; + reliableChannelId?: string; +} \ No newline at end of file