@fairmint/canton-node-sdk
Version:
Canton Node SDK
96 lines • 3.32 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
exports.waitForCompletion = waitForCompletion;
function extractCompletion(message) {
if (!('completionResponse' in message)) {
return null;
}
const { completionResponse } = message;
if (!('Completion' in completionResponse)) {
return null;
}
const completion = completionResponse.Completion.value;
if (typeof completion.submissionId !== 'string') {
return null;
}
const details = {
submissionId: completion.submissionId,
};
if (typeof completion.status?.code === 'number') {
details.statusCode = completion.status.code;
}
if (typeof completion.status?.message === 'string') {
details.statusMessage = completion.status.message;
}
if (typeof completion.updateId === 'string') {
details.updateId = completion.updateId;
}
return details;
}
/** Wait for a specific completion using the ledger's WebSocket completions stream. */
async function waitForCompletion(ledgerClient, params) {
const { submissionId, partyId, userId, beginExclusive, timeoutMs = 10 * 60 * 1000 } = params;
return new Promise((resolve, reject) => {
let closed = false;
let subscription = null;
const cleanup = () => {
closed = true;
if (subscription) {
subscription.close();
subscription = null;
}
};
const timer = setTimeout(() => {
cleanup();
reject(new Error(`Timeout waiting for completion of submission ${submissionId}`));
}, timeoutMs);
const handleError = (error) => {
if (closed) {
return;
}
clearTimeout(timer);
cleanup();
const err = error instanceof Error ? error : new Error(String(error));
reject(err);
};
void ledgerClient
.subscribeToCompletions({
userId,
parties: [partyId],
beginExclusive,
}, {
onMessage: (message) => {
const completion = extractCompletion(message);
if (!completion) {
return;
}
if (completion.submissionId !== submissionId) {
return;
}
clearTimeout(timer);
cleanup();
if (completion.statusCode && completion.statusCode !== 0) {
reject(new Error(completion.statusMessage ?? 'Transaction failed'));
return;
}
if (!completion.updateId) {
reject(new Error('Completion did not include updateId'));
return;
}
resolve(completion.updateId);
},
onError: handleError,
onClose: () => {
handleError(new Error('Completion subscription closed before receiving response'));
},
})
.then((sub) => {
subscription = sub;
if (closed) {
subscription.close();
}
})
.catch(handleError);
});
}
//# sourceMappingURL=completion-stream.js.map