Skip to content

Commit 70bb87a

Browse files
fix(shared-log): avoid unhandled rejections in replicator wait checks
1 parent be6ac5e commit 70bb87a

File tree

1 file changed

+27
-3
lines changed
  • packages/programs/data/shared-log/src

1 file changed

+27
-3
lines changed

packages/programs/data/shared-log/src/index.ts

Lines changed: 27 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -4382,6 +4382,7 @@ export class SharedLog<
43824382
const timeout = options.timeout ?? this.waitForReplicatorTimeout;
43834383

43844384
return new Promise((resolve, reject) => {
4385+
let settled = false;
43854386
const removeListeners = () => {
43864387
this.events.removeEventListener("replication:change", roleListener);
43874388
this.events.removeEventListener("replicator:mature", roleListener); // TODO replication:change event ?
@@ -4391,12 +4392,20 @@ export class SharedLog<
43914392
);
43924393
};
43934394
const abortListener = () => {
4395+
if (settled) {
4396+
return;
4397+
}
4398+
settled = true;
43944399
removeListeners();
43954400
clearTimeout(timer);
43964401
resolve(false);
43974402
};
43984403

4399-
const timer = setTimeout(async () => {
4404+
const timer = setTimeout(() => {
4405+
if (settled) {
4406+
return;
4407+
}
4408+
settled = true;
44004409
removeListeners();
44014410
resolve(false);
44024411
}, timeout);
@@ -4422,19 +4431,34 @@ export class SharedLog<
44224431
}
44234432
options?.onLeader && leaderKeys.forEach(options.onLeader);
44244433

4434+
if (settled) {
4435+
return;
4436+
}
4437+
settled = true;
44254438
removeListeners();
44264439
clearTimeout(timer);
44274440
resolve(leaders);
44284441
};
4442+
const triggerCheck = () => {
4443+
void check().catch((error) => {
4444+
if (settled) {
4445+
return;
4446+
}
4447+
settled = true;
4448+
removeListeners();
4449+
clearTimeout(timer);
4450+
reject(error instanceof Error ? error : new Error(String(error)));
4451+
});
4452+
};
44294453

44304454
const roleListener = () => {
4431-
check();
4455+
triggerCheck();
44324456
};
44334457

44344458
this.events.addEventListener("replication:change", roleListener); // TODO replication:change event ?
44354459
this.events.addEventListener("replicator:mature", roleListener); // TODO replication:change event ?
44364460
this._closeController.signal.addEventListener("abort", abortListener);
4437-
check();
4461+
triggerCheck();
44384462
});
44394463
}
44404464

0 commit comments

Comments
 (0)