@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.
47 lines • 2.24 kB
JavaScript
import * as assert from 'node:assert';
import { loggers } from '@ydbjs/debug';
let dbg = loggers.topic.extend('reader');
export let _on_commit_offset_response = function on_commit_offset_response(ctx, input) {
assert.ok(input.partitionsCommittedOffsets, 'commitOffsetResponse must have partitionsCommittedOffsets');
if (ctx.onCommittedOffset) {
for (let part of input.partitionsCommittedOffsets) {
let partitionSession = ctx.partitionSessions.get(part.partitionSessionId);
if (!partitionSession) {
dbg.log('error: commitOffsetResponse for unknown partitionSessionId=%s', part.partitionSessionId);
continue;
}
ctx.onCommittedOffset(partitionSession, part.committedOffset);
}
}
// Resolve all pending commits for the partition sessions.
for (let part of input.partitionsCommittedOffsets) {
let partitionSessionId = part.partitionSessionId;
let committedOffset = part.committedOffset;
// Update partition session's committed offset for consistency
let partitionSession = ctx.partitionSessions.get(partitionSessionId);
if (partitionSession) {
partitionSession.partitionCommittedOffset = committedOffset;
}
// Resolve all pending commits for this partition session.
let pendingCommits = ctx.pendingCommits.get(partitionSessionId);
if (pendingCommits) {
let i = 0;
while (i < pendingCommits.length) {
let commit = pendingCommits[i];
if (commit.offset <= committedOffset) {
// If the commit offset is less than or equal to the committed offset, resolve it.
commit.resolve();
pendingCommits.splice(i, 1); // Remove from pending commits
}
else {
i++;
}
}
}
// If there are no pending commits for this partition session, remove it from the map.
if (pendingCommits && pendingCommits.length === 0) {
ctx.pendingCommits.delete(partitionSessionId);
}
}
};
//# sourceMappingURL=_commit_offset_response.js.map