UNPKG

@ydbjs/topic

Version:

YDB Topics client for publish-subscribe messaging. Provides at-least-once delivery, exactly-once publishing, FIFO guarantees, and scalable message processing for unstructured data.

60 lines 2.79 kB
import { _flush } from './_flush.js'; export const _on_init_response = function on_init_response(ctx, input) { let serverLastSeqNo = input.lastSeqNo || 0n; let currentLastSeqNo = ctx.lastSeqNo; let isFirstInit = currentLastSeqNo === undefined; let lastSeqNoChanged = isFirstInit || currentLastSeqNo !== serverLastSeqNo; // Return inflight messages to buffer while (ctx.inflight.length > 0) { const message = ctx.inflight.pop(); if (!message) { continue; } ctx.buffer.unshift(message); ctx.updateBufferSize(BigInt(message.data.length)); } // If this is the first initialization or server provided a new lastSeqNo, and we're in auto seqNo mode, // renumber all messages in buffer to continue from serverLastSeqNo + 1 // Always renumber on first init, even if currentLastSeqNo === serverLastSeqNo (messages written before init) // Also renumber if there are messages in buffer that were written before init (their seqNo start from 1, not serverLastSeqNo + 1) let finalLastSeqNo = serverLastSeqNo; let shouldRenumber = false; // Only renumber in auto mode (when user didn't provide seqNo) if (!ctx.isSeqNoProvided && ctx.buffer.length > 0) { if (isFirstInit) { // First initialization: always renumber messages written before init shouldRenumber = true; } else if (lastSeqNoChanged) { // Reconnection: renumber if server's lastSeqNo changed shouldRenumber = true; } else if (ctx.buffer.length > 0) { // Check if messages in buffer were written before init (seqNo start from 1, not serverLastSeqNo + 1) // If first message's seqNo is <= serverLastSeqNo, it was written before init and needs renumbering let firstMessageSeqNo = ctx.buffer[0]?.seqNo; if (firstMessageSeqNo !== undefined && firstMessageSeqNo <= serverLastSeqNo) { shouldRenumber = true; } } } if (shouldRenumber) { let nextSeqNo = serverLastSeqNo + 1n; // Renumber all messages in buffer sequentially starting from serverLastSeqNo + 1 for (let message of ctx.buffer) { message.seqNo = nextSeqNo; nextSeqNo++; } // Update lastSeqNo to the last renumbered seqNo so flush() returns correct value finalLastSeqNo = nextSeqNo - 1n; ctx.updateLastSeqNo(finalLastSeqNo); } else if (lastSeqNoChanged) { // Store the last sequence number from the server if we didn't renumber ctx.updateLastSeqNo(serverLastSeqNo); } // Flush the buffer to send any pending messages _flush(ctx); }; //# sourceMappingURL=_init_reponse.js.map