Skip to content

Commit 72b6e8f

Browse files
committed
added transaction timeout
1 parent f8b807e commit 72b6e8f

File tree

1 file changed

+39
-10
lines changed

1 file changed

+39
-10
lines changed

examples/api.js

Lines changed: 39 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -37,31 +37,56 @@ export const TX_MODE_IN_BLOCK = "in-block";
3737
export const TX_MODE_FINALIZED_BLOCK = "finalized-block";
3838
export const TX_MODE_IN_POOL = "in-tx-pool";
3939

40-
function waitForTransaction(tx, signer, txName, txMode = TX_MODE_IN_BLOCK) {
40+
const DEFAULT_TX_TIMEOUT_MS = 120_000; // 2 minutes default timeout
41+
42+
function waitForTransaction(tx, signer, txName, txMode = TX_MODE_IN_BLOCK, timeoutMs = DEFAULT_TX_TIMEOUT_MS) {
4143
return new Promise((resolve, reject) => {
42-
const sub = tx.signSubmitAndWatch(signer).subscribe({
44+
let sub;
45+
let resolved = false;
46+
47+
const timeoutId = setTimeout(() => {
48+
if (!resolved) {
49+
resolved = true;
50+
if (sub) sub.unsubscribe();
51+
reject(new Error(`${txName} transaction timed out after ${timeoutMs}ms waiting for ${txMode}`));
52+
}
53+
}, timeoutMs);
54+
55+
sub = tx.signSubmitAndWatch(signer).subscribe({
4356
next: (ev) => {
4457
console.log(`✅ ${txName} event:`, ev.type);
4558
switch (txMode) {
4659
case TX_MODE_IN_BLOCK:
4760
if (ev.type === "txBestBlocksState" && ev.found) {
4861
console.log(`📦 ${txName} included in block:`, ev.block.hash);
49-
sub.unsubscribe();
50-
resolve(ev);
62+
if (!resolved) {
63+
resolved = true;
64+
clearTimeout(timeoutId);
65+
sub.unsubscribe();
66+
resolve(ev);
67+
}
5168
}
5269
break;
5370
case TX_MODE_IN_POOL:
5471
if (ev.type === "broadcasted") {
5572
console.log(`📦 ${txName} broadcasted with txHash:`, ev.txHash);
56-
sub.unsubscribe();
57-
resolve(ev);
73+
if (!resolved) {
74+
resolved = true;
75+
clearTimeout(timeoutId);
76+
sub.unsubscribe();
77+
resolve(ev);
78+
}
5879
}
5980
break;
6081
case TX_MODE_FINALIZED_BLOCK:
6182
if (ev.type === "finalized") {
6283
console.log(`📦 ${txName} included in finalized block:`, ev.block.hash);
63-
sub.unsubscribe();
64-
resolve(ev);
84+
if (!resolved) {
85+
resolved = true;
86+
clearTimeout(timeoutId);
87+
sub.unsubscribe();
88+
resolve(ev);
89+
}
6590
}
6691
break;
6792

@@ -71,8 +96,12 @@ function waitForTransaction(tx, signer, txName, txMode = TX_MODE_IN_BLOCK) {
7196
},
7297
error: (err) => {
7398
console.error(`❌ ${txName} error:`, err);
74-
sub.unsubscribe();
75-
reject(err);
99+
if (!resolved) {
100+
resolved = true;
101+
clearTimeout(timeoutId);
102+
sub.unsubscribe();
103+
reject(err);
104+
}
76105
},
77106
complete: () => {
78107
console.log(`✅ ${txName} complete!`);

0 commit comments

Comments
 (0)