diff --git a/packages/sdk/src/messaging/message_store.ts b/packages/sdk/src/messaging/message_store.ts index caed532bf7..a315fca268 100644 --- a/packages/sdk/src/messaging/message_store.ts +++ b/packages/sdk/src/messaging/message_store.ts @@ -80,10 +80,7 @@ export class MessageStore { } } - public async queue( - encoder: IEncoder, - message: IMessage - ): Promise { + public async queue(encoder: IEncoder, message: IMessage): Promise { const requestId = crypto.randomUUID(); this.pendingRequests.set(requestId, { diff --git a/packages/sdk/src/messaging/sender.ts b/packages/sdk/src/messaging/sender.ts index cb21af4192..bc1fc4ece3 100644 --- a/packages/sdk/src/messaging/sender.ts +++ b/packages/sdk/src/messaging/sender.ts @@ -11,16 +11,46 @@ export class Sender { private readonly messageStore: MessageStore; private readonly lightPush: ILightPush; + private sendInterval: ReturnType | null = null; + public constructor(params: SenderConstructorParams) { this.messageStore = params.messageStore; this.lightPush = params.lightPush; } - public async send(encoder: IEncoder, message: IMessage): Promise { + public start(): void { + this.sendInterval = setInterval(() => void this.backgroundSend(), 1000); + } + + public stop(): void { + if (this.sendInterval) { + clearInterval(this.sendInterval); + this.sendInterval = null; + } + } + + public async send(encoder: IEncoder, message: IMessage): Promise { const requestId = await this.messageStore.queue(encoder, message); - await this.lightPush.send(encoder, message); - if (requestId) { + const response = await this.lightPush.send(encoder, message); + + if (response.successes.length > 0) { await this.messageStore.markSent(requestId); } + + return requestId; + } + + private async backgroundSend(): Promise { + const pendingRequests = this.messageStore.getMessagesToSend(); + + // todo: implement chunking, error handling, retry, etc. + // todo: implement backoff and batching potentially + for (const { requestId, encoder, message } of pendingRequests) { + const response = await this.lightPush.send(encoder, message); + + if (response.successes.length > 0) { + await this.messageStore.markSent(requestId); + } + } } }