UNPKG

@fairmint/canton-node-sdk

Version:
96 lines 3.32 kB
"use strict"; 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