Enforce check interval correctly
This commit is contained in:
+28
-28
@@ -69,29 +69,29 @@ async function waitForEvent(
|
|||||||
const elapsed = Date.now() - started;
|
const elapsed = Date.now() - started;
|
||||||
const remainingMs = Math.max(1, timeoutMs - elapsed);
|
const remainingMs = Math.max(1, timeoutMs - elapsed);
|
||||||
const queryTimeoutMs = Math.max(200, Math.min(1_000, remainingMs));
|
const queryTimeoutMs = Math.max(200, Math.min(1_000, remainingMs));
|
||||||
const found = await withTimeout<boolean>(
|
const found = await new Promise<boolean>((resolve) => {
|
||||||
new Promise<boolean>((resolve) => {
|
let settled = false;
|
||||||
let settled = false;
|
let sub: ReturnType<Relay["subscribe"]> | undefined;
|
||||||
const sub = relay.subscribe([filter], {
|
const finish = (found: boolean): void => {
|
||||||
onevent: (evt) => {
|
if (settled) return;
|
||||||
if (settled) return;
|
settled = true;
|
||||||
if (evt.id === expectedEventId) {
|
clearTimeout(timer);
|
||||||
settled = true;
|
sub?.close();
|
||||||
sub.close();
|
resolve(found);
|
||||||
resolve(true);
|
};
|
||||||
}
|
const timer = setTimeout(() => finish(false), queryTimeoutMs);
|
||||||
},
|
|
||||||
oneose: () => {
|
sub = relay.subscribe([filter], {
|
||||||
if (settled) return;
|
onevent: (evt) => {
|
||||||
settled = true;
|
if (evt.id === expectedEventId) {
|
||||||
sub.close();
|
finish(true);
|
||||||
resolve(false);
|
}
|
||||||
},
|
},
|
||||||
});
|
oneose: () => {
|
||||||
}),
|
finish(false);
|
||||||
queryTimeoutMs,
|
},
|
||||||
"write confirm read-after-write query",
|
});
|
||||||
).catch(() => false);
|
});
|
||||||
|
|
||||||
if (found) return true;
|
if (found) return true;
|
||||||
|
|
||||||
@@ -142,20 +142,20 @@ export async function runWriteConfirm(input: WriteConfirmInput): Promise<WriteCo
|
|||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
const elapsedMs = performance.now() - startedAt;
|
|
||||||
const remainingMs = Math.max(1, input.timeoutMs - Math.floor(elapsedMs));
|
|
||||||
|
|
||||||
const confirmed = await waitForEvent(
|
const confirmed = await waitForEvent(
|
||||||
relay,
|
relay,
|
||||||
{
|
{
|
||||||
|
ids: [event.id],
|
||||||
authors: [derivedPubkey],
|
authors: [derivedPubkey],
|
||||||
kinds: [input.kind],
|
kinds: [input.kind],
|
||||||
"#d": [dTag],
|
"#d": [dTag],
|
||||||
limit: 1,
|
|
||||||
since: Math.max(0, createdAt - 5),
|
since: Math.max(0, createdAt - 5),
|
||||||
},
|
},
|
||||||
event.id,
|
event.id,
|
||||||
remainingMs,
|
// Connect and publish each have their own timeout, so read-after-write
|
||||||
|
// must receive one too. Charging all three stages to a single timeout
|
||||||
|
// can reduce this to 1 ms after a slow, successful publish.
|
||||||
|
input.timeoutMs,
|
||||||
);
|
);
|
||||||
|
|
||||||
return {
|
return {
|
||||||
|
|||||||
Reference in New Issue
Block a user