mirror of
https://github.com/openclaw/openclaw.git
synced 2026-08-12 21:53:00 -06:00
chore(lint): enable no-promise-executor-return
This commit is contained in:
@@ -22,6 +22,7 @@
|
||||
"eslint/no-object-constructor": "error",
|
||||
"eslint/no-param-reassign": "error",
|
||||
"eslint/no-proto": "error",
|
||||
"eslint/no-promise-executor-return": "error",
|
||||
"eslint/no-regex-spaces": "error",
|
||||
"eslint/no-return-assign": "error",
|
||||
"eslint/no-sequences": "error",
|
||||
|
||||
@@ -262,7 +262,12 @@ async function terminatePids(
|
||||
deps: AcpxProcessCleanupDeps | undefined,
|
||||
): Promise<number[]> {
|
||||
const killProcess = deps?.killProcess ?? ((pid, signal) => process.kill(pid, signal));
|
||||
const sleep = deps?.sleep ?? ((ms) => new Promise<void>((resolve) => setTimeout(resolve, ms)));
|
||||
const sleep =
|
||||
deps?.sleep ??
|
||||
((ms) =>
|
||||
new Promise<void>((resolve) => {
|
||||
setTimeout(resolve, ms);
|
||||
}));
|
||||
const terminated: number[] = [];
|
||||
|
||||
for (const pid of pids) {
|
||||
|
||||
@@ -2958,7 +2958,9 @@ describe("active-memory plugin", () => {
|
||||
};
|
||||
plugin.register(api as unknown as OpenClawPluginApi);
|
||||
runEmbeddedAgent.mockImplementationOnce(async (params: { timeoutMs?: number }) => {
|
||||
await new Promise((resolve) => setTimeout(resolve, (params.timeoutMs ?? 0) + 5));
|
||||
await new Promise((resolve) => {
|
||||
setTimeout(resolve, (params.timeoutMs ?? 0) + 5);
|
||||
});
|
||||
return {
|
||||
payloads: [{ text: "late timeout payload that should never become memory context" }],
|
||||
meta: { aborted: true },
|
||||
@@ -3001,7 +3003,9 @@ describe("active-memory plugin", () => {
|
||||
};
|
||||
plugin.register(api as unknown as OpenClawPluginApi);
|
||||
runEmbeddedAgent.mockImplementationOnce(async () => {
|
||||
await new Promise((resolve) => setTimeout(resolve, CONFIGURED_TIMEOUT_MS + 5));
|
||||
await new Promise((resolve) => {
|
||||
setTimeout(resolve, CONFIGURED_TIMEOUT_MS + 5);
|
||||
});
|
||||
return { payloads: [{ text: "remember the ramen place" }] };
|
||||
});
|
||||
|
||||
@@ -3131,7 +3135,9 @@ describe("active-memory plugin", () => {
|
||||
},
|
||||
},
|
||||
]);
|
||||
await new Promise((resolve) => setTimeout(resolve, 35));
|
||||
await new Promise((resolve) => {
|
||||
setTimeout(resolve, 35);
|
||||
});
|
||||
return { payloads: [{ text: "User usually orders ramen." }] };
|
||||
});
|
||||
|
||||
@@ -3221,7 +3227,9 @@ describe("active-memory plugin", () => {
|
||||
},
|
||||
},
|
||||
]);
|
||||
await new Promise((resolve) => setTimeout(resolve, 35));
|
||||
await new Promise((resolve) => {
|
||||
setTimeout(resolve, 35);
|
||||
});
|
||||
return { payloads: [{ text: "User usually orders ramen after late flights." }] };
|
||||
});
|
||||
|
||||
|
||||
@@ -42,7 +42,9 @@ import { BrowserCdpEndpointBlockedError } from "./errors.js";
|
||||
|
||||
async function startWsServer() {
|
||||
const wss = new WebSocketServer({ port: 0, host: "127.0.0.1" });
|
||||
await new Promise<void>((resolve) => wss.once("listening", () => resolve()));
|
||||
await new Promise<void>((resolve) => {
|
||||
wss.once("listening", () => resolve());
|
||||
});
|
||||
const port = (wss.address() as { port: number }).port;
|
||||
return { wss, port, url: `ws://127.0.0.1:${port}/devtools/browser/TEST` };
|
||||
}
|
||||
@@ -55,7 +57,9 @@ describe("cdp.helpers internal", () => {
|
||||
registerManagedProxyBrowserCdpBypassMock.mockReset();
|
||||
registerManagedProxyBrowserCdpBypassMock.mockImplementation(() => undefined);
|
||||
if (wss) {
|
||||
await new Promise<void>((resolve) => wss?.close(() => resolve()));
|
||||
await new Promise<void>((resolve) => {
|
||||
wss?.close(() => resolve());
|
||||
});
|
||||
wss = null;
|
||||
}
|
||||
});
|
||||
@@ -307,7 +311,9 @@ describe("cdp.helpers internal", () => {
|
||||
cb(true);
|
||||
},
|
||||
});
|
||||
await new Promise<void>((resolve) => wss?.once("listening", () => resolve()));
|
||||
await new Promise<void>((resolve) => {
|
||||
wss?.once("listening", () => resolve());
|
||||
});
|
||||
const port = (wss.address() as { port: number }).port;
|
||||
let callbackCount = 0;
|
||||
wss.on("connection", (socket) => {
|
||||
@@ -341,7 +347,9 @@ describe("cdp.helpers internal", () => {
|
||||
cb(false, 429, "too many requests");
|
||||
},
|
||||
});
|
||||
await new Promise<void>((resolve) => wss?.once("listening", () => resolve()));
|
||||
await new Promise<void>((resolve) => {
|
||||
wss?.once("listening", () => resolve());
|
||||
});
|
||||
const port = (wss.address() as { port: number }).port;
|
||||
|
||||
await expect(
|
||||
|
||||
@@ -397,7 +397,9 @@ type CdpSocketOptions = {
|
||||
};
|
||||
|
||||
function sleep(ms: number): Promise<void> {
|
||||
return new Promise((resolve) => setTimeout(resolve, ms));
|
||||
return new Promise((resolve) => {
|
||||
setTimeout(resolve, ms);
|
||||
});
|
||||
}
|
||||
|
||||
function normalizeRetryCount(value: number | undefined, fallback: number): number {
|
||||
|
||||
@@ -79,7 +79,9 @@ function replyToViewportCommandOrScreenshot(
|
||||
|
||||
async function startMockWsServer(handle: CdpReplyHandler) {
|
||||
const wss = new WebSocketServer({ port: 0, host: "127.0.0.1" });
|
||||
await new Promise<void>((resolve) => wss.once("listening", () => resolve()));
|
||||
await new Promise<void>((resolve) => {
|
||||
wss.once("listening", () => resolve());
|
||||
});
|
||||
const port = (wss.address() as { port: number }).port;
|
||||
wss.on("connection", (socket) => {
|
||||
socket.on("message", (raw) => {
|
||||
@@ -113,7 +115,9 @@ describe("cdp internal", () => {
|
||||
|
||||
afterEach(async () => {
|
||||
if (wss) {
|
||||
await new Promise<void>((resolve) => wss?.close(() => resolve()));
|
||||
await new Promise<void>((resolve) => {
|
||||
wss?.close(() => resolve());
|
||||
});
|
||||
wss = null;
|
||||
}
|
||||
});
|
||||
@@ -1072,7 +1076,9 @@ describe("cdp internal", () => {
|
||||
// in createTargetViaCdp — the bare-ws root triggers discovery.
|
||||
const http = await import("node:http");
|
||||
const wsServer = new WebSocketServer({ port: 0, host: "127.0.0.1" });
|
||||
await new Promise<void>((resolve) => wsServer.once("listening", () => resolve()));
|
||||
await new Promise<void>((resolve) => {
|
||||
wsServer.once("listening", () => resolve());
|
||||
});
|
||||
const wsPort = (wsServer.address() as { port: number }).port;
|
||||
wsServer.on("connection", (socket) => {
|
||||
socket.on("message", (raw) => {
|
||||
@@ -1110,7 +1116,9 @@ describe("cdp internal", () => {
|
||||
}
|
||||
res.writeHead(404).end();
|
||||
});
|
||||
await new Promise<void>((resolve) => httpServer.listen(0, "127.0.0.1", () => resolve()));
|
||||
await new Promise<void>((resolve) => {
|
||||
httpServer.listen(0, "127.0.0.1", () => resolve());
|
||||
});
|
||||
const httpPort = (httpServer.address() as { port: number }).port;
|
||||
try {
|
||||
const out = await createTargetViaCdp({
|
||||
@@ -1119,8 +1127,12 @@ describe("cdp internal", () => {
|
||||
});
|
||||
expect(out.targetId).toBe("T_BARE_WS");
|
||||
} finally {
|
||||
await new Promise<void>((resolve) => wsServer.close(() => resolve()));
|
||||
await new Promise<void>((resolve) => httpServer.close(() => resolve()));
|
||||
await new Promise<void>((resolve) => {
|
||||
wsServer.close(() => resolve());
|
||||
});
|
||||
await new Promise<void>((resolve) => {
|
||||
httpServer.close(() => resolve());
|
||||
});
|
||||
}
|
||||
});
|
||||
|
||||
|
||||
@@ -27,7 +27,9 @@ describe("cdp", () => {
|
||||
|
||||
const startWsServer = async () => {
|
||||
wsServer = new WebSocketServer({ port: 0, host: "127.0.0.1" });
|
||||
await new Promise<void>((resolve) => wsServer?.once("listening", resolve));
|
||||
await new Promise<void>((resolve) => {
|
||||
wsServer?.once("listening", resolve);
|
||||
});
|
||||
return (wsServer.address() as { port: number }).port;
|
||||
};
|
||||
|
||||
@@ -77,7 +79,9 @@ describe("cdp", () => {
|
||||
res.statusCode = 404;
|
||||
res.end("not found");
|
||||
});
|
||||
await new Promise<void>((resolve) => httpServer?.listen(0, "127.0.0.1", resolve));
|
||||
await new Promise<void>((resolve) => {
|
||||
httpServer?.listen(0, "127.0.0.1", resolve);
|
||||
});
|
||||
return (httpServer.address() as { port: number }).port;
|
||||
};
|
||||
|
||||
@@ -85,14 +89,16 @@ describe("cdp", () => {
|
||||
vi.unstubAllEnvs();
|
||||
await new Promise<void>((resolve) => {
|
||||
if (!httpServer) {
|
||||
return resolve();
|
||||
resolve();
|
||||
return;
|
||||
}
|
||||
httpServer.close(() => resolve());
|
||||
httpServer = null;
|
||||
});
|
||||
await new Promise<void>((resolve) => {
|
||||
if (!wsServer) {
|
||||
return resolve();
|
||||
resolve();
|
||||
return;
|
||||
}
|
||||
wsServer.close(() => resolve());
|
||||
wsServer = null;
|
||||
@@ -190,7 +196,9 @@ describe("cdp", () => {
|
||||
res.statusCode = 404;
|
||||
res.end("not found");
|
||||
});
|
||||
await new Promise<void>((resolve) => httpServer?.listen(0, "127.0.0.1", resolve));
|
||||
await new Promise<void>((resolve) => {
|
||||
httpServer?.listen(0, "127.0.0.1", resolve);
|
||||
});
|
||||
const httpPort = (httpServer.address() as AddressInfo).port;
|
||||
|
||||
await expect(
|
||||
@@ -210,7 +218,9 @@ describe("cdp", () => {
|
||||
heldSockets.push(socket);
|
||||
// Hold the TCP connection open without completing the WebSocket handshake.
|
||||
});
|
||||
await new Promise<void>((resolve) => httpServer?.listen(0, "127.0.0.1", resolve));
|
||||
await new Promise<void>((resolve) => {
|
||||
httpServer?.listen(0, "127.0.0.1", resolve);
|
||||
});
|
||||
const port = (httpServer.address() as AddressInfo).port;
|
||||
|
||||
try {
|
||||
@@ -507,7 +517,9 @@ describe("cdp", () => {
|
||||
}
|
||||
});
|
||||
});
|
||||
await new Promise<void>((resolve) => server.listen(0, "127.0.0.1", resolve));
|
||||
await new Promise<void>((resolve) => {
|
||||
server.listen(0, "127.0.0.1", resolve);
|
||||
});
|
||||
try {
|
||||
const addr = server.address() as AddressInfo;
|
||||
const created = await createTargetViaCdp({
|
||||
@@ -516,8 +528,12 @@ describe("cdp", () => {
|
||||
});
|
||||
expect(created.targetId).toBe("ROOT_FALLBACK");
|
||||
} finally {
|
||||
await new Promise<void>((resolve) => wss.close(() => resolve()));
|
||||
await new Promise<void>((resolve) => server.close(() => resolve()));
|
||||
await new Promise<void>((resolve) => {
|
||||
wss.close(() => resolve());
|
||||
});
|
||||
await new Promise<void>((resolve) => {
|
||||
server.close(() => resolve());
|
||||
});
|
||||
}
|
||||
});
|
||||
|
||||
|
||||
@@ -194,8 +194,12 @@ async function withMockChromeCdpServer(params: {
|
||||
const addr = server.address() as AddressInfo;
|
||||
await params.run(`http://127.0.0.1:${addr.port}`);
|
||||
} finally {
|
||||
await new Promise<void>((resolve) => wss.close(() => resolve()));
|
||||
await new Promise<void>((resolve) => server.close(() => resolve()));
|
||||
await new Promise<void>((resolve) => {
|
||||
wss.close(() => resolve());
|
||||
});
|
||||
await new Promise<void>((resolve) => {
|
||||
server.close(() => resolve());
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
@@ -952,9 +956,13 @@ describe("chrome.ts internal", () => {
|
||||
it("resolves false when the direct-ws probe cannot connect", async () => {
|
||||
// Bind a ws server and then close it, so connecting to it fails.
|
||||
const wss = new WebSocketServer({ port: 0, host: "127.0.0.1" });
|
||||
await new Promise<void>((resolve) => wss.once("listening", () => resolve()));
|
||||
await new Promise<void>((resolve) => {
|
||||
wss.once("listening", () => resolve());
|
||||
});
|
||||
const port = (wss.address() as { port: number }).port;
|
||||
await new Promise<void>((resolve) => wss.close(() => resolve()));
|
||||
await new Promise<void>((resolve) => {
|
||||
wss.close(() => resolve());
|
||||
});
|
||||
await expect(
|
||||
isChromeReachable(`ws://127.0.0.1:${port}/devtools/browser/GONE`, 50),
|
||||
).resolves.toBe(false);
|
||||
@@ -962,7 +970,9 @@ describe("chrome.ts internal", () => {
|
||||
|
||||
it("resolves true when the direct-ws handshake succeeds", async () => {
|
||||
const wss = new WebSocketServer({ port: 0, host: "127.0.0.1" });
|
||||
await new Promise<void>((resolve) => wss.once("listening", () => resolve()));
|
||||
await new Promise<void>((resolve) => {
|
||||
wss.once("listening", () => resolve());
|
||||
});
|
||||
const port = (wss.address() as { port: number }).port;
|
||||
try {
|
||||
// Direct /devtools/ WS URL — isChromeReachable goes through
|
||||
@@ -972,7 +982,9 @@ describe("chrome.ts internal", () => {
|
||||
isChromeReachable(`ws://127.0.0.1:${port}/devtools/browser/OK`, 500),
|
||||
).resolves.toBe(true);
|
||||
} finally {
|
||||
await new Promise<void>((resolve) => wss.close(() => resolve()));
|
||||
await new Promise<void>((resolve) => {
|
||||
wss.close(() => resolve());
|
||||
});
|
||||
}
|
||||
});
|
||||
});
|
||||
@@ -994,9 +1006,13 @@ describe("chrome.ts internal", () => {
|
||||
// accepting ws upgrades — the canRunCdpHealthCommand probe will
|
||||
// fire its 'error' handler during handshake.
|
||||
const dead = new WebSocketServer({ port: 0, host: "127.0.0.1" });
|
||||
await new Promise<void>((resolve) => dead.once("listening", () => resolve()));
|
||||
await new Promise<void>((resolve) => {
|
||||
dead.once("listening", () => resolve());
|
||||
});
|
||||
const deadPort = (dead.address() as { port: number }).port;
|
||||
await new Promise<void>((resolve) => dead.close(() => resolve()));
|
||||
await new Promise<void>((resolve) => {
|
||||
dead.close(() => resolve());
|
||||
});
|
||||
const server = createServer((req, res) => {
|
||||
if (req.url === "/json/version") {
|
||||
res.writeHead(200, { "Content-Type": "application/json" });
|
||||
@@ -1009,14 +1025,18 @@ describe("chrome.ts internal", () => {
|
||||
}
|
||||
res.writeHead(404).end();
|
||||
});
|
||||
await new Promise<void>((resolve) => server.listen(0, "127.0.0.1", () => resolve()));
|
||||
await new Promise<void>((resolve) => {
|
||||
server.listen(0, "127.0.0.1", () => resolve());
|
||||
});
|
||||
try {
|
||||
const addr = server.address() as AddressInfo;
|
||||
await expect(isChromeCdpReady(`http://127.0.0.1:${addr.port}`, 50, 10)).resolves.toBe(
|
||||
false,
|
||||
);
|
||||
} finally {
|
||||
await new Promise<void>((resolve) => server.close(() => resolve()));
|
||||
await new Promise<void>((resolve) => {
|
||||
server.close(() => resolve());
|
||||
});
|
||||
}
|
||||
});
|
||||
|
||||
|
||||
@@ -42,14 +42,12 @@ async function startLoopbackCdpServer(): Promise<RunningServer> {
|
||||
|
||||
afterEach(async () => {
|
||||
await Promise.all(
|
||||
runningServers
|
||||
.splice(0)
|
||||
.map(
|
||||
(server) =>
|
||||
new Promise<void>((resolve, reject) =>
|
||||
server.close((err) => (err ? reject(err) : resolve())),
|
||||
),
|
||||
),
|
||||
runningServers.splice(0).map(
|
||||
(server) =>
|
||||
new Promise<void>((resolve, reject) => {
|
||||
server.close((err) => (err ? reject(err) : resolve()));
|
||||
}),
|
||||
),
|
||||
);
|
||||
});
|
||||
|
||||
|
||||
@@ -108,8 +108,12 @@ async function withMockChromeCdpServer(params: {
|
||||
const addr = server.address() as AddressInfo;
|
||||
await params.run(`http://127.0.0.1:${addr.port}`);
|
||||
} finally {
|
||||
await new Promise<void>((resolve) => wss.close(() => resolve()));
|
||||
await new Promise<void>((resolve) => server.close(() => resolve()));
|
||||
await new Promise<void>((resolve) => {
|
||||
wss.close(() => resolve());
|
||||
});
|
||||
await new Promise<void>((resolve) => {
|
||||
server.close(() => resolve());
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
@@ -549,7 +553,9 @@ describe("browser chrome helpers", () => {
|
||||
}),
|
||||
).rejects.toBeInstanceOf(BrowserCdpEndpointBlockedError);
|
||||
} finally {
|
||||
await new Promise<void>((resolve) => server.close(() => resolve()));
|
||||
await new Promise<void>((resolve) => {
|
||||
server.close(() => resolve());
|
||||
});
|
||||
}
|
||||
});
|
||||
|
||||
@@ -755,8 +761,12 @@ describe("browser chrome helpers", () => {
|
||||
expect(diagnostic.wsUrl).toBe(wsOnlyBase);
|
||||
expect(diagnostic.browser).toBe("Browserless/Mock");
|
||||
} finally {
|
||||
await new Promise<void>((resolve) => wss.close(() => resolve()));
|
||||
await new Promise<void>((resolve) => server.close(() => resolve()));
|
||||
await new Promise<void>((resolve) => {
|
||||
wss.close(() => resolve());
|
||||
});
|
||||
await new Promise<void>((resolve) => {
|
||||
server.close(() => resolve());
|
||||
});
|
||||
}
|
||||
});
|
||||
|
||||
@@ -785,12 +795,16 @@ describe("browser chrome helpers", () => {
|
||||
);
|
||||
// A real WS server accepts the handshake.
|
||||
const wss = new WebSocketServer({ port: 0, host: "127.0.0.1" });
|
||||
await new Promise<void>((resolve) => wss.once("listening", () => resolve()));
|
||||
await new Promise<void>((resolve) => {
|
||||
wss.once("listening", () => resolve());
|
||||
});
|
||||
const port = (wss.address() as AddressInfo).port;
|
||||
try {
|
||||
await expect(isChromeReachable(`ws://127.0.0.1:${port}`, 500)).resolves.toBe(true);
|
||||
} finally {
|
||||
await new Promise<void>((resolve) => wss.close(() => resolve()));
|
||||
await new Promise<void>((resolve) => {
|
||||
wss.close(() => resolve());
|
||||
});
|
||||
}
|
||||
});
|
||||
|
||||
@@ -811,7 +825,9 @@ describe("browser chrome helpers", () => {
|
||||
}
|
||||
});
|
||||
});
|
||||
await new Promise<void>((resolve) => wss.once("listening", () => resolve()));
|
||||
await new Promise<void>((resolve) => {
|
||||
wss.once("listening", () => resolve());
|
||||
});
|
||||
const port = (wss.address() as AddressInfo).port;
|
||||
try {
|
||||
await expect(isChromeCdpReady(`ws://127.0.0.1:${port}`, 500, 500)).resolves.toBe(true);
|
||||
@@ -820,7 +836,9 @@ describe("browser chrome helpers", () => {
|
||||
);
|
||||
expect(diagnostic.wsUrl).toBe(`ws://127.0.0.1:${port}`);
|
||||
} finally {
|
||||
await new Promise<void>((resolve) => wss.close(() => resolve()));
|
||||
await new Promise<void>((resolve) => {
|
||||
wss.close(() => resolve());
|
||||
});
|
||||
}
|
||||
});
|
||||
|
||||
|
||||
@@ -519,7 +519,9 @@ export async function launchOpenClawChrome(
|
||||
if (exists(localStatePath) && exists(preferencesPath)) {
|
||||
break;
|
||||
}
|
||||
await new Promise((r) => setTimeout(r, CHROME_BOOTSTRAP_PREFS_POLL_MS));
|
||||
await new Promise((r) => {
|
||||
setTimeout(r, CHROME_BOOTSTRAP_PREFS_POLL_MS);
|
||||
});
|
||||
}
|
||||
try {
|
||||
bootstrap.kill("SIGTERM");
|
||||
@@ -531,7 +533,9 @@ export async function launchOpenClawChrome(
|
||||
if (bootstrap.exitCode != null) {
|
||||
break;
|
||||
}
|
||||
await new Promise((r) => setTimeout(r, CHROME_BOOTSTRAP_EXIT_POLL_MS));
|
||||
await new Promise((r) => {
|
||||
setTimeout(r, CHROME_BOOTSTRAP_EXIT_POLL_MS);
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
@@ -577,7 +581,9 @@ export async function launchOpenClawChrome(
|
||||
launchHttpReachable = true;
|
||||
break;
|
||||
}
|
||||
await new Promise((r) => setTimeout(r, CHROME_LAUNCH_READY_POLL_MS));
|
||||
await new Promise((r) => {
|
||||
setTimeout(r, CHROME_LAUNCH_READY_POLL_MS);
|
||||
});
|
||||
}
|
||||
|
||||
if (!launchHttpReachable) {
|
||||
@@ -682,7 +688,9 @@ export async function stopOpenClawChrome(
|
||||
return;
|
||||
}
|
||||
const remainingMs = timeoutMs - (Date.now() - start);
|
||||
await new Promise((r) => setTimeout(r, Math.max(1, Math.min(100, remainingMs))));
|
||||
await new Promise((r) => {
|
||||
setTimeout(r, Math.max(1, Math.min(100, remainingMs)));
|
||||
});
|
||||
}
|
||||
|
||||
try {
|
||||
|
||||
@@ -37,7 +37,9 @@ describe("browser client fetch attachOnly diagnostics", () => {
|
||||
socket.on("close", () => sockets.delete(socket));
|
||||
socket.on("error", () => {});
|
||||
});
|
||||
await new Promise<void>((resolve) => server.listen(0, "127.0.0.1", resolve));
|
||||
await new Promise<void>((resolve) => {
|
||||
server.listen(0, "127.0.0.1", resolve);
|
||||
});
|
||||
const port = (server.address() as { port: number }).port;
|
||||
const configPath = path.join(tempHome.home, ".openclaw", "openclaw.json");
|
||||
await fs.writeFile(
|
||||
@@ -78,7 +80,9 @@ describe("browser client fetch attachOnly diagnostics", () => {
|
||||
for (const socket of sockets) {
|
||||
socket.destroy();
|
||||
}
|
||||
await new Promise<void>((resolve) => server.close(() => resolve()));
|
||||
await new Promise<void>((resolve) => {
|
||||
server.close(() => resolve());
|
||||
});
|
||||
}
|
||||
});
|
||||
});
|
||||
|
||||
@@ -212,7 +212,9 @@ describe("pw-session ensurePageState", () => {
|
||||
|
||||
try {
|
||||
handlers.get("download")?.[0]?.(download);
|
||||
await new Promise((resolve) => setImmediate(resolve));
|
||||
await new Promise((resolve) => {
|
||||
setImmediate(resolve);
|
||||
});
|
||||
|
||||
expect(unhandled).toStrictEqual([]);
|
||||
await expect(download.path?.()).rejects.toThrow("save failed");
|
||||
|
||||
@@ -947,7 +947,9 @@ async function connectBrowser(cdpUrl: string, ssrfPolicy?: SsrFPolicy): Promise<
|
||||
break;
|
||||
}
|
||||
const delay = resolveCdpConnectRetryDelayMs(attempt);
|
||||
await new Promise((r) => setTimeout(r, delay));
|
||||
await new Promise((r) => {
|
||||
setTimeout(r, delay);
|
||||
});
|
||||
}
|
||||
}
|
||||
if (lastErr instanceof Error) {
|
||||
|
||||
@@ -581,7 +581,9 @@ export async function clickViaPlaywright(opts: {
|
||||
abortPromise,
|
||||
reconcileRemoteDialog,
|
||||
);
|
||||
await new Promise((resolve) => setTimeout(resolve, delayMs));
|
||||
await new Promise((resolve) => {
|
||||
setTimeout(resolve, delayMs);
|
||||
});
|
||||
}
|
||||
if (opts.doubleClick) {
|
||||
await awaitActionWithAbort(
|
||||
|
||||
@@ -45,7 +45,9 @@ import type { BrowserRouteRegistrar } from "./types.js";
|
||||
import { asyncBrowserRoute, jsonError, toStringOrEmpty } from "./utils.js";
|
||||
|
||||
function sleep(ms: number): Promise<void> {
|
||||
return new Promise((resolve) => setTimeout(resolve, ms));
|
||||
return new Promise((resolve) => {
|
||||
setTimeout(resolve, ms);
|
||||
});
|
||||
}
|
||||
|
||||
const EXISTING_SESSION_INTERACTION_NAVIGATION_RECHECK_DELAYS_MS = [0, 250, 500] as const;
|
||||
|
||||
@@ -34,7 +34,9 @@ export async function resolveTargetIdAfterNavigate(opts: {
|
||||
const first = pickReplacement(await opts.listTabs());
|
||||
currentTargetId = first.targetId;
|
||||
if (first.shouldRetry) {
|
||||
await new Promise((r) => setTimeout(r, opts.retryDelayMs ?? 800));
|
||||
await new Promise((r) => {
|
||||
setTimeout(r, opts.retryDelayMs ?? 800);
|
||||
});
|
||||
currentTargetId = pickReplacement(await opts.listTabs(), {
|
||||
allowSingleTabFallback: true,
|
||||
}).targetId;
|
||||
|
||||
@@ -286,7 +286,9 @@ export function createProfileAvailability({
|
||||
if (await isReachable(attemptTimeoutMs)) {
|
||||
return;
|
||||
}
|
||||
await new Promise((r) => setTimeout(r, CDP_READY_AFTER_LAUNCH_POLL_MS));
|
||||
await new Promise((r) => {
|
||||
setTimeout(r, CDP_READY_AFTER_LAUNCH_POLL_MS);
|
||||
});
|
||||
}
|
||||
throw new Error(
|
||||
`Chrome CDP websocket for profile "${profile.name}" is not reachable after start. ${await describeCdpFailure(
|
||||
@@ -306,7 +308,9 @@ export function createProfileAvailability({
|
||||
} catch (err) {
|
||||
lastError = err;
|
||||
}
|
||||
await new Promise((r) => setTimeout(r, CHROME_MCP_ATTACH_READY_POLL_MS));
|
||||
await new Promise((r) => {
|
||||
setTimeout(r, CHROME_MCP_ATTACH_READY_POLL_MS);
|
||||
});
|
||||
}
|
||||
throw new BrowserProfileUnavailableError(formatChromeMcpAttachFailure(lastError));
|
||||
};
|
||||
|
||||
@@ -350,7 +350,9 @@ export function createProfileTabOps({
|
||||
triggerManagedTabLimit(found.targetId);
|
||||
return assignTabAlias({ profileState, tab: found, label: opts?.label });
|
||||
}
|
||||
await new Promise((r) => setTimeout(r, OPEN_TAB_DISCOVERY_POLL_MS));
|
||||
await new Promise((r) => {
|
||||
setTimeout(r, OPEN_TAB_DISCOVERY_POLL_MS);
|
||||
});
|
||||
}
|
||||
triggerManagedTabLimit(createdViaCdp);
|
||||
return assignTabAlias({
|
||||
|
||||
@@ -21,7 +21,9 @@ function isTransientStartupFetchError(error: unknown): boolean {
|
||||
}
|
||||
|
||||
async function sleep(ms: number): Promise<void> {
|
||||
await new Promise((resolve) => setTimeout(resolve, ms));
|
||||
await new Promise((resolve) => {
|
||||
setTimeout(resolve, ms);
|
||||
});
|
||||
}
|
||||
|
||||
async function postStartWithRetry(params: {
|
||||
|
||||
@@ -41,7 +41,9 @@ describe("browser control HTTP auth", () => {
|
||||
if (!current) {
|
||||
return;
|
||||
}
|
||||
await new Promise<void>((resolve) => current.close(() => resolve()));
|
||||
await new Promise<void>((resolve) => {
|
||||
current.close(() => resolve());
|
||||
});
|
||||
});
|
||||
|
||||
it("requires bearer auth for standalone browser HTTP routes", async () => {
|
||||
|
||||
@@ -443,7 +443,9 @@ export async function createCanvasHostHandler(
|
||||
}
|
||||
}
|
||||
if (wss) {
|
||||
await new Promise<void>((resolve) => wss.close(() => resolve()));
|
||||
await new Promise<void>((resolve) => {
|
||||
wss.close(() => resolve());
|
||||
});
|
||||
}
|
||||
},
|
||||
};
|
||||
@@ -528,9 +530,9 @@ export async function startCanvasHost(opts: CanvasHostServerOpts): Promise<Canva
|
||||
if (ownsHandler) {
|
||||
await handler.close();
|
||||
}
|
||||
await new Promise<void>((resolve, reject) =>
|
||||
server.close((err) => (err ? reject(err) : resolve())),
|
||||
);
|
||||
await new Promise<void>((resolve, reject) => {
|
||||
server.close((err) => (err ? reject(err) : resolve()));
|
||||
});
|
||||
},
|
||||
};
|
||||
}
|
||||
|
||||
@@ -121,7 +121,9 @@ describe("ClickClack gateway", () => {
|
||||
await vi.waitFor(() => expect(mocks.client.websocket).toHaveBeenCalledTimes(1));
|
||||
|
||||
socket.emit("message", Buffer.from("{not json"));
|
||||
await new Promise((resolve) => setImmediate(resolve));
|
||||
await new Promise((resolve) => {
|
||||
setImmediate(resolve);
|
||||
});
|
||||
expect(runError).toBeUndefined();
|
||||
expect(ctx.log?.warn).toHaveBeenCalledWith(
|
||||
"[default] skipped malformed ClickClack websocket event",
|
||||
|
||||
@@ -190,7 +190,9 @@ export async function startClickClackGatewayAccount(
|
||||
socket.on("error", reject);
|
||||
});
|
||||
if (!ctx.abortSignal.aborted) {
|
||||
await new Promise((resolve) => setTimeout(resolve, account.reconnectMs));
|
||||
await new Promise((resolve) => {
|
||||
setTimeout(resolve, account.reconnectMs);
|
||||
});
|
||||
}
|
||||
}
|
||||
ctx.setStatus({ accountId: account.accountId, running: false });
|
||||
|
||||
@@ -790,7 +790,9 @@ async function waitForFile(filePath: string): Promise<string> {
|
||||
if ((error as NodeJS.ErrnoException).code !== "ENOENT") {
|
||||
throw error;
|
||||
}
|
||||
await new Promise((resolve) => setTimeout(resolve, 20));
|
||||
await new Promise((resolve) => {
|
||||
setTimeout(resolve, 20);
|
||||
});
|
||||
}
|
||||
}
|
||||
throw new Error(`timed out waiting for ${filePath}`);
|
||||
@@ -838,10 +840,14 @@ describe("connectCodexAppServerEndpoint", () => {
|
||||
await expect(
|
||||
Promise.race([
|
||||
probe,
|
||||
new Promise((_, reject) => setTimeout(() => reject(new Error("probe timed out")), 500)),
|
||||
new Promise((_, reject) => {
|
||||
setTimeout(() => reject(new Error("probe timed out")), 500);
|
||||
}),
|
||||
]),
|
||||
).resolves.toMatchObject([{ endpointId: "ws", ok: false }]);
|
||||
await new Promise<void>((resolve) => server.close(() => resolve()));
|
||||
await new Promise<void>((resolve) => {
|
||||
server.close(() => resolve());
|
||||
});
|
||||
});
|
||||
|
||||
it("rejects malformed stdio frames instead of throwing out of band", async () => {
|
||||
@@ -930,7 +936,9 @@ describe("connectCodexAppServerEndpoint", () => {
|
||||
);
|
||||
|
||||
await expect(supervisor.probeEndpoints()).resolves.toEqual([{ endpointId: "exits", ok: true }]);
|
||||
await new Promise((resolve) => setTimeout(resolve, 50));
|
||||
await new Promise((resolve) => {
|
||||
setTimeout(resolve, 50);
|
||||
});
|
||||
await expect(supervisor.probeEndpoints()).resolves.toMatchObject([
|
||||
{
|
||||
endpointId: "exits",
|
||||
|
||||
@@ -147,7 +147,7 @@ describe("Codex app-server attempt timeouts", () => {
|
||||
}, 5);
|
||||
});
|
||||
},
|
||||
operation: async () => new Promise<never>(() => undefined),
|
||||
operation: async () => new Promise<never>(() => {}),
|
||||
});
|
||||
const rejected = expect(run).rejects.toThrow("codex app-server startup timed out");
|
||||
|
||||
@@ -164,7 +164,7 @@ describe("Codex app-server attempt timeouts", () => {
|
||||
const run = withCodexStartupTimeout({
|
||||
timeoutMs: 1_000,
|
||||
signal: controller.signal,
|
||||
operation: async () => new Promise<never>(() => undefined),
|
||||
operation: async () => new Promise<never>(() => {}),
|
||||
});
|
||||
const rejected = expect(run).rejects.toThrow("codex app-server startup aborted");
|
||||
|
||||
|
||||
@@ -486,7 +486,7 @@ describe("CodexAppServerClient", () => {
|
||||
clients.push(harness.client);
|
||||
harness.client.addRequestHandler((request) => {
|
||||
if (request.method === "item/tool/call") {
|
||||
return new Promise<never>(() => undefined);
|
||||
return new Promise<never>(() => {});
|
||||
}
|
||||
return undefined;
|
||||
});
|
||||
|
||||
@@ -194,7 +194,7 @@ describe("dynamic tool execution helpers", () => {
|
||||
toolBridge: {
|
||||
handleToolCall: vi.fn((_call, options) => {
|
||||
capturedSignal = options?.signal;
|
||||
return new Promise<never>(() => undefined);
|
||||
return new Promise<never>(() => {});
|
||||
}),
|
||||
},
|
||||
signal: new AbortController().signal,
|
||||
@@ -230,7 +230,7 @@ describe("dynamic tool execution helpers", () => {
|
||||
arguments: { action: "poll", sessionId: "process-session", timeout: 30_000 },
|
||||
},
|
||||
toolBridge: {
|
||||
handleToolCall: vi.fn(() => new Promise<never>(() => undefined)),
|
||||
handleToolCall: vi.fn(() => new Promise<never>(() => {})),
|
||||
},
|
||||
signal: new AbortController().signal,
|
||||
timeoutMs: 1,
|
||||
|
||||
@@ -35,7 +35,9 @@ const tinyPngBase64 =
|
||||
type ProjectorNotification = Parameters<CodexAppServerEventProjector["handleNotification"]>[0];
|
||||
|
||||
function flushDiagnosticEvents() {
|
||||
return new Promise<void>((resolve) => setImmediate(resolve));
|
||||
return new Promise<void>((resolve) => {
|
||||
setImmediate(resolve);
|
||||
});
|
||||
}
|
||||
|
||||
function assistantMessage(text: string, timestamp: number) {
|
||||
|
||||
@@ -85,7 +85,9 @@ async function drainActiveAppServerAttemptsForTest(): Promise<void> {
|
||||
}
|
||||
await Promise.race([
|
||||
Promise.allSettled(attempts.map((attempt) => attempt.promise)),
|
||||
new Promise<void>((resolve) => setTimeout(resolve, 5_000)),
|
||||
new Promise<void>((resolve) => {
|
||||
setTimeout(resolve, 5_000);
|
||||
}),
|
||||
]);
|
||||
}
|
||||
|
||||
|
||||
@@ -66,7 +66,9 @@ describe("runCodexAppServerAttempt hooks and model diagnostics", () => {
|
||||
const run = runCodexAppServerAttempt(params);
|
||||
await harness.waitForMethod("turn/start");
|
||||
expect(llmInput).toHaveBeenCalled();
|
||||
await new Promise<void>((resolve) => setImmediate(resolve));
|
||||
await new Promise<void>((resolve) => {
|
||||
setImmediate(resolve);
|
||||
});
|
||||
|
||||
const [llmInputPayload, llmInputContext] = mockCall(llmInput, "llm_input") as [
|
||||
{
|
||||
|
||||
@@ -817,7 +817,7 @@ describe("runCodexAppServerAttempt", () => {
|
||||
onTimeout: async () => {
|
||||
await releaseCodexSandboxExecServerEnvironment(sandbox);
|
||||
},
|
||||
operation: async () => new Promise<never>(() => undefined),
|
||||
operation: async () => new Promise<never>(() => {}),
|
||||
}),
|
||||
).rejects.toThrow("codex app-server startup timed out");
|
||||
|
||||
@@ -1111,7 +1111,9 @@ describe("runCodexAppServerAttempt", () => {
|
||||
|
||||
const run = runCodexAppServerAttempt(params);
|
||||
await harness.waitForMethod("turn/start");
|
||||
await new Promise<void>((resolve) => setImmediate(resolve));
|
||||
await new Promise<void>((resolve) => {
|
||||
setImmediate(resolve);
|
||||
});
|
||||
await harness.completeTurn({ threadId: "thread-1", turnId: "turn-1" });
|
||||
const result = await run;
|
||||
|
||||
@@ -1684,7 +1686,9 @@ describe("runCodexAppServerAttempt", () => {
|
||||
|
||||
const run = runCodexAppServerAttempt(createParams(sessionFile, workspaceDir));
|
||||
await harness.waitForMethod("turn/start");
|
||||
await new Promise<void>((resolve) => setImmediate(resolve));
|
||||
await new Promise<void>((resolve) => {
|
||||
setImmediate(resolve);
|
||||
});
|
||||
await harness.completeTurn({ threadId: "thread-1", turnId: "turn-1" });
|
||||
await run;
|
||||
|
||||
@@ -1725,7 +1729,9 @@ describe("runCodexAppServerAttempt", () => {
|
||||
|
||||
const run = runCodexAppServerAttempt(params);
|
||||
await harness.waitForMethod("turn/start");
|
||||
await new Promise<void>((resolve) => setImmediate(resolve));
|
||||
await new Promise<void>((resolve) => {
|
||||
setImmediate(resolve);
|
||||
});
|
||||
await harness.completeTurn({ threadId: "thread-1", turnId: "turn-1" });
|
||||
await run;
|
||||
|
||||
@@ -1762,7 +1768,9 @@ describe("runCodexAppServerAttempt", () => {
|
||||
|
||||
const run = runCodexAppServerAttempt(createParams(sessionFile, workspaceDir));
|
||||
await harness.waitForMethod("turn/start");
|
||||
await new Promise<void>((resolve) => setImmediate(resolve));
|
||||
await new Promise<void>((resolve) => {
|
||||
setImmediate(resolve);
|
||||
});
|
||||
await harness.completeTurn({ threadId: "thread-1", turnId: "turn-1" });
|
||||
await run;
|
||||
|
||||
@@ -1801,7 +1809,9 @@ describe("runCodexAppServerAttempt", () => {
|
||||
|
||||
const run = runCodexAppServerAttempt(params);
|
||||
await harness.waitForMethod("turn/start");
|
||||
await new Promise<void>((resolve) => setImmediate(resolve));
|
||||
await new Promise<void>((resolve) => {
|
||||
setImmediate(resolve);
|
||||
});
|
||||
await harness.completeTurn({ threadId: "thread-existing", turnId: "turn-1" });
|
||||
await run;
|
||||
|
||||
@@ -1846,7 +1856,9 @@ describe("runCodexAppServerAttempt", () => {
|
||||
|
||||
const run = runCodexAppServerAttempt(params);
|
||||
await harness.waitForMethod("turn/start");
|
||||
await new Promise<void>((resolve) => setImmediate(resolve));
|
||||
await new Promise<void>((resolve) => {
|
||||
setImmediate(resolve);
|
||||
});
|
||||
await harness.completeTurn({ threadId: "thread-existing", turnId: "turn-1" });
|
||||
await run;
|
||||
|
||||
@@ -1891,7 +1903,9 @@ describe("runCodexAppServerAttempt", () => {
|
||||
|
||||
const run = runCodexAppServerAttempt(params);
|
||||
await harness.waitForMethod("turn/start");
|
||||
await new Promise<void>((resolve) => setImmediate(resolve));
|
||||
await new Promise<void>((resolve) => {
|
||||
setImmediate(resolve);
|
||||
});
|
||||
await harness.completeTurn({ threadId: "thread-existing", turnId: "turn-1" });
|
||||
await run;
|
||||
|
||||
@@ -2134,7 +2148,9 @@ describe("runCodexAppServerAttempt", () => {
|
||||
|
||||
const run = runCodexAppServerAttempt(params);
|
||||
await harness.waitForMethod("turn/start");
|
||||
await new Promise<void>((resolve) => setImmediate(resolve));
|
||||
await new Promise<void>((resolve) => {
|
||||
setImmediate(resolve);
|
||||
});
|
||||
await harness.completeTurn({ threadId: "thread-1", turnId: "turn-1" });
|
||||
const result = await run;
|
||||
|
||||
@@ -2189,7 +2205,9 @@ describe("runCodexAppServerAttempt", () => {
|
||||
|
||||
const run = runCodexAppServerAttempt(createParams(sessionFile, workspaceDir));
|
||||
await harness.waitForMethod("turn/start");
|
||||
await new Promise<void>((resolve) => setImmediate(resolve));
|
||||
await new Promise<void>((resolve) => {
|
||||
setImmediate(resolve);
|
||||
});
|
||||
await harness.completeTurn({ threadId: "thread-1", turnId: "turn-1" });
|
||||
const result = await run;
|
||||
|
||||
@@ -2266,7 +2284,9 @@ describe("runCodexAppServerAttempt", () => {
|
||||
|
||||
const run = runCodexAppServerAttempt(params);
|
||||
await harness.waitForMethod("turn/start");
|
||||
await new Promise<void>((resolve) => setImmediate(resolve));
|
||||
await new Promise<void>((resolve) => {
|
||||
setImmediate(resolve);
|
||||
});
|
||||
await harness.completeTurn({ threadId: "thread-1", turnId: "turn-1" });
|
||||
const result = await run;
|
||||
|
||||
@@ -2454,7 +2474,9 @@ describe("runCodexAppServerAttempt", () => {
|
||||
|
||||
const run = runCodexAppServerAttempt(createParams(sessionFile, workspaceDir));
|
||||
await harness.waitForMethod("turn/start");
|
||||
await new Promise<void>((resolve) => setImmediate(resolve));
|
||||
await new Promise<void>((resolve) => {
|
||||
setImmediate(resolve);
|
||||
});
|
||||
await harness.completeTurn({ threadId: "thread-1", turnId: "turn-1" });
|
||||
const result = await run;
|
||||
|
||||
@@ -2483,7 +2505,9 @@ describe("runCodexAppServerAttempt", () => {
|
||||
|
||||
const run = runCodexAppServerAttempt(params);
|
||||
await harness.waitForMethod("turn/start");
|
||||
await new Promise<void>((resolve) => setImmediate(resolve));
|
||||
await new Promise<void>((resolve) => {
|
||||
setImmediate(resolve);
|
||||
});
|
||||
await harness.completeTurn({ threadId: "thread-1", turnId: "turn-1" });
|
||||
await run;
|
||||
|
||||
@@ -2526,7 +2550,9 @@ describe("runCodexAppServerAttempt", () => {
|
||||
|
||||
const run = runCodexAppServerAttempt(params);
|
||||
await harness.waitForMethod("turn/start");
|
||||
await new Promise<void>((resolve) => setImmediate(resolve));
|
||||
await new Promise<void>((resolve) => {
|
||||
setImmediate(resolve);
|
||||
});
|
||||
await harness.completeTurn({ threadId: "thread-1", turnId: "turn-1" });
|
||||
await run;
|
||||
|
||||
@@ -2566,7 +2592,9 @@ describe("runCodexAppServerAttempt", () => {
|
||||
|
||||
const run = runCodexAppServerAttempt(params);
|
||||
await harness.waitForMethod("turn/start");
|
||||
await new Promise<void>((resolve) => setImmediate(resolve));
|
||||
await new Promise<void>((resolve) => {
|
||||
setImmediate(resolve);
|
||||
});
|
||||
await harness.completeTurn({ threadId: "thread-1", turnId: "turn-1" });
|
||||
const result = await run;
|
||||
|
||||
@@ -2609,7 +2637,9 @@ describe("runCodexAppServerAttempt", () => {
|
||||
|
||||
const run = runCodexAppServerAttempt(params);
|
||||
await harness.waitForMethod("turn/start");
|
||||
await new Promise<void>((resolve) => setImmediate(resolve));
|
||||
await new Promise<void>((resolve) => {
|
||||
setImmediate(resolve);
|
||||
});
|
||||
await harness.completeTurn({ threadId: "thread-1", turnId: "turn-1" });
|
||||
await run;
|
||||
|
||||
@@ -2851,7 +2881,9 @@ describe("runCodexAppServerAttempt", () => {
|
||||
|
||||
const result = await run;
|
||||
expect(result.aborted).toBe(true);
|
||||
await new Promise((resolve) => setImmediate(resolve));
|
||||
await new Promise((resolve) => {
|
||||
setImmediate(resolve);
|
||||
});
|
||||
expect(unhandledRejections).toStrictEqual([]);
|
||||
} finally {
|
||||
process.off("unhandledRejection", onUnhandledRejection);
|
||||
@@ -2943,7 +2975,9 @@ describe("runCodexAppServerAttempt", () => {
|
||||
{ turnTerminalIdleTimeoutMs: 60_000 },
|
||||
);
|
||||
await bufferedTerminal;
|
||||
await new Promise<void>((resolve) => setImmediate(resolve));
|
||||
await new Promise<void>((resolve) => {
|
||||
setImmediate(resolve);
|
||||
});
|
||||
harness.close();
|
||||
|
||||
const result = await run;
|
||||
@@ -2983,7 +3017,9 @@ describe("runCodexAppServerAttempt", () => {
|
||||
turnTerminalIdleTimeoutMs: 60_000,
|
||||
});
|
||||
await harness.waitForMethod("turn/start");
|
||||
await new Promise((resolve) => setTimeout(resolve, 20));
|
||||
await new Promise((resolve) => {
|
||||
setTimeout(resolve, 20);
|
||||
});
|
||||
expect(harness.request.mock.calls.some(([method]) => method === "turn/interrupt")).toBe(false);
|
||||
await harness.completeTurn({ threadId: "thread-1", turnId: "turn-1" });
|
||||
|
||||
@@ -3076,7 +3112,9 @@ describe("runCodexAppServerAttempt", () => {
|
||||
},
|
||||
},
|
||||
});
|
||||
await new Promise<void>((resolve) => setImmediate(resolve));
|
||||
await new Promise<void>((resolve) => {
|
||||
setImmediate(resolve);
|
||||
});
|
||||
expect(resolved).toBe(false);
|
||||
|
||||
await harness.notify({
|
||||
@@ -3120,7 +3158,9 @@ describe("runCodexAppServerAttempt", () => {
|
||||
},
|
||||
},
|
||||
});
|
||||
await new Promise<void>((resolve) => setImmediate(resolve));
|
||||
await new Promise<void>((resolve) => {
|
||||
setImmediate(resolve);
|
||||
});
|
||||
expect(resolved).toBe(false);
|
||||
expect(
|
||||
warn.mock.calls.some(([message]) =>
|
||||
@@ -3800,7 +3840,7 @@ describe("runCodexAppServerAttempt", () => {
|
||||
});
|
||||
|
||||
it("times out app-server startup before thread setup can hang forever", async () => {
|
||||
setCodexAppServerClientFactoryForTest(() => new Promise<never>(() => undefined));
|
||||
setCodexAppServerClientFactoryForTest(() => new Promise<never>(() => {}));
|
||||
const params = createParams(
|
||||
path.join(tempDir, "session.jsonl"),
|
||||
path.join(tempDir, "workspace"),
|
||||
@@ -3834,7 +3874,9 @@ describe("runCodexAppServerAttempt", () => {
|
||||
interval: 1,
|
||||
});
|
||||
await waitForMethod("turn/start");
|
||||
await new Promise<void>((resolve) => setImmediate(resolve));
|
||||
await new Promise<void>((resolve) => {
|
||||
setImmediate(resolve);
|
||||
});
|
||||
await completeTurn({ threadId: "thread-1", turnId: "turn-1" });
|
||||
await run;
|
||||
|
||||
@@ -4307,7 +4349,7 @@ describe("runCodexAppServerAttempt", () => {
|
||||
const c = {
|
||||
request: vi.fn(async (method: string) => {
|
||||
if (method === "thread/start") {
|
||||
return await new Promise<never>(() => undefined);
|
||||
return await new Promise<never>(() => {});
|
||||
}
|
||||
return {};
|
||||
}),
|
||||
@@ -4502,7 +4544,9 @@ describe("runCodexAppServerAttempt", () => {
|
||||
interval: 1,
|
||||
});
|
||||
await waitForMethod("turn/start");
|
||||
await new Promise<void>((resolve) => setImmediate(resolve));
|
||||
await new Promise<void>((resolve) => {
|
||||
setImmediate(resolve);
|
||||
});
|
||||
await completeTurn({ threadId: "thread-existing", turnId: "turn-1" });
|
||||
await run;
|
||||
|
||||
|
||||
@@ -71,7 +71,9 @@ describe("createCodexAttemptTurnWatchController", () => {
|
||||
try {
|
||||
controller.armAttemptIdleWatch();
|
||||
controller.touchActivity("turn:start", { attemptProgress: true });
|
||||
await new Promise((resolve) => setTimeout(resolve, 20));
|
||||
await new Promise((resolve) => {
|
||||
setTimeout(resolve, 20);
|
||||
});
|
||||
controller.noteNotificationReceived("response.output_text.delta", {
|
||||
attemptProgress: true,
|
||||
attemptTimeoutMs: 40,
|
||||
@@ -405,7 +407,7 @@ describe("runCodexAppServerAttempt turn watches", () => {
|
||||
return turnStartResult("turn-1", "inProgress");
|
||||
}
|
||||
if (method === "turn/interrupt") {
|
||||
return new Promise<never>(() => undefined);
|
||||
return new Promise<never>(() => {});
|
||||
}
|
||||
return {};
|
||||
});
|
||||
@@ -474,7 +476,9 @@ describe("runCodexAppServerAttempt turn watches", () => {
|
||||
fastWait,
|
||||
);
|
||||
|
||||
await new Promise((resolve) => setTimeout(resolve, 60));
|
||||
await new Promise((resolve) => {
|
||||
setTimeout(resolve, 60);
|
||||
});
|
||||
await harness.notify({
|
||||
method: "rawResponseItem/completed",
|
||||
params: {
|
||||
@@ -488,7 +492,9 @@ describe("runCodexAppServerAttempt turn watches", () => {
|
||||
},
|
||||
},
|
||||
});
|
||||
await new Promise((resolve) => setTimeout(resolve, 60));
|
||||
await new Promise((resolve) => {
|
||||
setTimeout(resolve, 60);
|
||||
});
|
||||
await harness.notify({
|
||||
method: "rawResponseItem/completed",
|
||||
params: {
|
||||
@@ -543,7 +549,9 @@ describe("runCodexAppServerAttempt turn watches", () => {
|
||||
fastWait,
|
||||
);
|
||||
|
||||
await new Promise((resolve) => setTimeout(resolve, 60));
|
||||
await new Promise((resolve) => {
|
||||
setTimeout(resolve, 60);
|
||||
});
|
||||
await harness.handleServerRequest({
|
||||
id: "request-account-refresh",
|
||||
method: "account/nonTurnRefresh",
|
||||
@@ -595,7 +603,9 @@ describe("runCodexAppServerAttempt turn watches", () => {
|
||||
});
|
||||
await harness.waitForMethod("turn/start");
|
||||
|
||||
await new Promise((resolve) => setTimeout(resolve, 60));
|
||||
await new Promise((resolve) => {
|
||||
setTimeout(resolve, 60);
|
||||
});
|
||||
void harness.handleServerRequest({
|
||||
id: "request-auth-refresh",
|
||||
method: "account/chatgptAuthTokens/refresh",
|
||||
@@ -659,7 +669,9 @@ describe("runCodexAppServerAttempt turn watches", () => {
|
||||
fastWait,
|
||||
);
|
||||
|
||||
await new Promise((resolve) => setTimeout(resolve, 60));
|
||||
await new Promise((resolve) => {
|
||||
setTimeout(resolve, 60);
|
||||
});
|
||||
await harness.handleServerRequest({
|
||||
id: "request-null-turn-elicitation",
|
||||
method: "mcpServer/elicitation/request",
|
||||
@@ -673,7 +685,9 @@ describe("runCodexAppServerAttempt turn watches", () => {
|
||||
_meta: null,
|
||||
},
|
||||
});
|
||||
await new Promise((resolve) => setTimeout(resolve, 60));
|
||||
await new Promise((resolve) => {
|
||||
setTimeout(resolve, 60);
|
||||
});
|
||||
|
||||
expect(harness.request.mock.calls.some(([method]) => method === "turn/interrupt")).toBe(false);
|
||||
await harness.completeTurn({ threadId: "thread-1", turnId: "turn-1" });
|
||||
@@ -735,7 +749,9 @@ describe("runCodexAppServerAttempt turn watches", () => {
|
||||
),
|
||||
fastWait,
|
||||
);
|
||||
await new Promise((resolve) => setTimeout(resolve, 60));
|
||||
await new Promise((resolve) => {
|
||||
setTimeout(resolve, 60);
|
||||
});
|
||||
expect(
|
||||
onRunProgress.mock.calls.some(
|
||||
([event]) =>
|
||||
@@ -788,7 +804,9 @@ describe("runCodexAppServerAttempt turn watches", () => {
|
||||
fastWait,
|
||||
);
|
||||
|
||||
await new Promise((resolve) => setTimeout(resolve, 75));
|
||||
await new Promise((resolve) => {
|
||||
setTimeout(resolve, 75);
|
||||
});
|
||||
const response = harness.handleServerRequest({
|
||||
id: "request-user-input",
|
||||
method: "item/tool/requestUserInput",
|
||||
@@ -812,7 +830,9 @@ describe("runCodexAppServerAttempt turn watches", () => {
|
||||
},
|
||||
});
|
||||
await vi.waitFor(() => expect(params.onBlockReply).toHaveBeenCalledTimes(1), fastWait);
|
||||
await new Promise((resolve) => setTimeout(resolve, 125));
|
||||
await new Promise((resolve) => {
|
||||
setTimeout(resolve, 125);
|
||||
});
|
||||
|
||||
expect(harness.request.mock.calls.some(([method]) => method === "turn/interrupt")).toBe(false);
|
||||
expect(queueActiveRunMessageForTest("session-1", "2")).toBe(true);
|
||||
@@ -843,7 +863,9 @@ describe("runCodexAppServerAttempt turn watches", () => {
|
||||
});
|
||||
await harness.waitForMethod("turn/start");
|
||||
|
||||
await new Promise((resolve) => setTimeout(resolve, 60));
|
||||
await new Promise((resolve) => {
|
||||
setTimeout(resolve, 60);
|
||||
});
|
||||
await harness.handleServerRequest({
|
||||
id: "request-foreign-elicitation",
|
||||
method: "mcpServer/elicitation/request",
|
||||
@@ -1052,7 +1074,9 @@ describe("runCodexAppServerAttempt turn watches", () => {
|
||||
},
|
||||
});
|
||||
|
||||
await new Promise((resolve) => setTimeout(resolve, 20));
|
||||
await new Promise((resolve) => {
|
||||
setTimeout(resolve, 20);
|
||||
});
|
||||
expect(settled).toBe(false);
|
||||
expect(request.mock.calls.some(([method]) => method === "turn/interrupt")).toBe(false);
|
||||
|
||||
@@ -1158,7 +1182,9 @@ describe("runCodexAppServerAttempt turn watches", () => {
|
||||
},
|
||||
});
|
||||
|
||||
await new Promise((resolve) => setTimeout(resolve, 20));
|
||||
await new Promise((resolve) => {
|
||||
setTimeout(resolve, 20);
|
||||
});
|
||||
expect(settled).toBe(false);
|
||||
expect(request.mock.calls.some(([method]) => method === "turn/interrupt")).toBe(false);
|
||||
|
||||
@@ -1258,7 +1284,9 @@ describe("runCodexAppServerAttempt turn watches", () => {
|
||||
},
|
||||
},
|
||||
});
|
||||
await new Promise((resolve) => setTimeout(resolve, 20));
|
||||
await new Promise((resolve) => {
|
||||
setTimeout(resolve, 20);
|
||||
});
|
||||
expect(request.mock.calls.some(([method]) => method === "turn/interrupt")).toBe(false);
|
||||
|
||||
await notify({
|
||||
@@ -1342,7 +1370,9 @@ describe("runCodexAppServerAttempt turn watches", () => {
|
||||
})) as { success?: boolean };
|
||||
expect(toolResult.success).toBe(false);
|
||||
|
||||
await new Promise((resolve) => setTimeout(resolve, 130));
|
||||
await new Promise((resolve) => {
|
||||
setTimeout(resolve, 130);
|
||||
});
|
||||
expect(settled).toBe(false);
|
||||
expect(request.mock.calls.some(([method]) => method === "turn/interrupt")).toBe(false);
|
||||
|
||||
@@ -1406,7 +1436,9 @@ describe("runCodexAppServerAttempt turn watches", () => {
|
||||
},
|
||||
});
|
||||
|
||||
await new Promise((resolve) => setTimeout(resolve, 130));
|
||||
await new Promise((resolve) => {
|
||||
setTimeout(resolve, 130);
|
||||
});
|
||||
expect(settled).toBe(false);
|
||||
expect(harness.request.mock.calls.some(([method]) => method === "turn/interrupt")).toBe(false);
|
||||
|
||||
@@ -1486,7 +1518,9 @@ describe("runCodexAppServerAttempt turn watches", () => {
|
||||
fastWait,
|
||||
);
|
||||
|
||||
await new Promise((resolve) => setTimeout(resolve, 130));
|
||||
await new Promise((resolve) => {
|
||||
setTimeout(resolve, 130);
|
||||
});
|
||||
expect(settled).toBe(false);
|
||||
expect(request.mock.calls.some(([method]) => method === "turn/interrupt")).toBe(false);
|
||||
|
||||
@@ -1679,7 +1713,9 @@ describe("runCodexAppServerAttempt turn watches", () => {
|
||||
},
|
||||
});
|
||||
|
||||
await new Promise((resolve) => setTimeout(resolve, 20));
|
||||
await new Promise((resolve) => {
|
||||
setTimeout(resolve, 20);
|
||||
});
|
||||
expect(settled).toBe(false);
|
||||
|
||||
const result = await run;
|
||||
@@ -1793,7 +1829,9 @@ describe("runCodexAppServerAttempt turn watches", () => {
|
||||
},
|
||||
});
|
||||
|
||||
await new Promise((resolve) => setTimeout(resolve, 40));
|
||||
await new Promise((resolve) => {
|
||||
setTimeout(resolve, 40);
|
||||
});
|
||||
expect(settled).toBe(false);
|
||||
|
||||
const result = await run;
|
||||
@@ -1884,7 +1922,9 @@ describe("runCodexAppServerAttempt turn watches", () => {
|
||||
},
|
||||
});
|
||||
|
||||
await new Promise((resolve) => setTimeout(resolve, 30));
|
||||
await new Promise((resolve) => {
|
||||
setTimeout(resolve, 30);
|
||||
});
|
||||
// This covers the future-compatible path for raw response deltas if Codex
|
||||
// app-server exposes them directly; current Codex primarily emits
|
||||
// rawResponseItem/completed for the raw-event surface.
|
||||
@@ -1896,7 +1936,9 @@ describe("runCodexAppServerAttempt turn watches", () => {
|
||||
delta: '{"cmd":"apply_patch","patch":"large chunk"}',
|
||||
},
|
||||
});
|
||||
await new Promise((resolve) => setTimeout(resolve, 30));
|
||||
await new Promise((resolve) => {
|
||||
setTimeout(resolve, 30);
|
||||
});
|
||||
expect(settled).toBe(false);
|
||||
|
||||
await notify({
|
||||
@@ -1989,7 +2031,9 @@ describe("runCodexAppServerAttempt turn watches", () => {
|
||||
},
|
||||
});
|
||||
|
||||
await new Promise((resolve) => setTimeout(resolve, 30));
|
||||
await new Promise((resolve) => {
|
||||
setTimeout(resolve, 30);
|
||||
});
|
||||
await notify({
|
||||
method: "item/fileChange/patchUpdated",
|
||||
params: {
|
||||
@@ -2096,7 +2140,9 @@ describe("runCodexAppServerAttempt turn watches", () => {
|
||||
},
|
||||
});
|
||||
|
||||
await new Promise((resolve) => setTimeout(resolve, 30));
|
||||
await new Promise((resolve) => {
|
||||
setTimeout(resolve, 30);
|
||||
});
|
||||
await notify({
|
||||
method: "response.custom_tool_call_input.delta",
|
||||
params: {
|
||||
@@ -2194,7 +2240,9 @@ describe("runCodexAppServerAttempt turn watches", () => {
|
||||
},
|
||||
});
|
||||
|
||||
await new Promise((resolve) => setTimeout(resolve, 40));
|
||||
await new Promise((resolve) => {
|
||||
setTimeout(resolve, 40);
|
||||
});
|
||||
await notify({
|
||||
method: "response.custom_tool_call_input.delta",
|
||||
params: {
|
||||
@@ -2597,7 +2645,9 @@ describe("runCodexAppServerAttempt turn watches", () => {
|
||||
},
|
||||
});
|
||||
|
||||
await new Promise((resolve) => setTimeout(resolve, 25));
|
||||
await new Promise((resolve) => {
|
||||
setTimeout(resolve, 25);
|
||||
});
|
||||
expect(settled).toBe(false);
|
||||
|
||||
await harness.completeTurn({ threadId: "thread-1", turnId: "turn-1" });
|
||||
@@ -2650,7 +2700,9 @@ describe("runCodexAppServerAttempt turn watches", () => {
|
||||
},
|
||||
});
|
||||
|
||||
await new Promise((resolve) => setTimeout(resolve, 25));
|
||||
await new Promise((resolve) => {
|
||||
setTimeout(resolve, 25);
|
||||
});
|
||||
expect(settled).toBe(false);
|
||||
|
||||
await harness.completeTurn({ threadId: "thread-1", turnId: "turn-1" });
|
||||
@@ -2686,7 +2738,9 @@ describe("runCodexAppServerAttempt turn watches", () => {
|
||||
},
|
||||
});
|
||||
|
||||
await new Promise((resolve) => setTimeout(resolve, 100));
|
||||
await new Promise((resolve) => {
|
||||
setTimeout(resolve, 100);
|
||||
});
|
||||
expect(settled).toBe(false);
|
||||
|
||||
await harness.completeTurn({ threadId: "thread-1", turnId: "turn-1" });
|
||||
@@ -2740,7 +2794,9 @@ describe("runCodexAppServerAttempt turn watches", () => {
|
||||
},
|
||||
});
|
||||
|
||||
await new Promise((resolve) => setTimeout(resolve, 100));
|
||||
await new Promise((resolve) => {
|
||||
setTimeout(resolve, 100);
|
||||
});
|
||||
expect(settled).toBe(false);
|
||||
|
||||
await harness.completeTurn({ threadId: "thread-1", turnId: "turn-1" });
|
||||
@@ -2763,7 +2819,9 @@ describe("runCodexAppServerAttempt turn watches", () => {
|
||||
const run = runCodexAppServerAttempt(params, { turnCompletionIdleTimeoutMs: 15 });
|
||||
await harness.waitForMethod("turn/start");
|
||||
await harness.notify(rateLimitsUpdated(Date.now() + 60_000));
|
||||
await new Promise((resolve) => setTimeout(resolve, 20));
|
||||
await new Promise((resolve) => {
|
||||
setTimeout(resolve, 20);
|
||||
});
|
||||
|
||||
const result = await run;
|
||||
expect({
|
||||
@@ -2880,7 +2938,9 @@ describe("runCodexAppServerAttempt turn watches", () => {
|
||||
|
||||
const queuedTerminal = harness.completeTurn({ threadId: "thread-1", turnId: "turn-1" });
|
||||
void queuedTerminal.catch(() => undefined);
|
||||
await new Promise((resolve) => setTimeout(resolve, 30));
|
||||
await new Promise((resolve) => {
|
||||
setTimeout(resolve, 30);
|
||||
});
|
||||
|
||||
expect(settled).toBe(false);
|
||||
expect(harness.request.mock.calls.some(([method]) => method === "turn/interrupt")).toBe(false);
|
||||
@@ -3191,7 +3251,9 @@ describe("runCodexAppServerAttempt turn watches", () => {
|
||||
},
|
||||
},
|
||||
});
|
||||
await new Promise((resolve) => setTimeout(resolve, 20));
|
||||
await new Promise((resolve) => {
|
||||
setTimeout(resolve, 20);
|
||||
});
|
||||
|
||||
expect(request).not.toHaveBeenCalledWith("turn/interrupt", expect.anything());
|
||||
await notify({
|
||||
@@ -3272,7 +3334,9 @@ describe("runCodexAppServerAttempt turn watches", () => {
|
||||
},
|
||||
},
|
||||
});
|
||||
await new Promise((resolve) => setTimeout(resolve, 20));
|
||||
await new Promise((resolve) => {
|
||||
setTimeout(resolve, 20);
|
||||
});
|
||||
|
||||
expect(request).not.toHaveBeenCalledWith("turn/interrupt", expect.anything());
|
||||
await notify({
|
||||
@@ -3433,7 +3497,9 @@ describe("runCodexAppServerAttempt turn watches", () => {
|
||||
},
|
||||
},
|
||||
});
|
||||
await new Promise((resolve) => setTimeout(resolve, 20));
|
||||
await new Promise((resolve) => {
|
||||
setTimeout(resolve, 20);
|
||||
});
|
||||
|
||||
expect(request).not.toHaveBeenCalledWith("turn/interrupt", expect.anything());
|
||||
await notify({
|
||||
@@ -3677,7 +3743,9 @@ describe("runCodexAppServerAttempt turn watches", () => {
|
||||
);
|
||||
|
||||
await harness.waitForMethod("turn/start");
|
||||
await new Promise<void>((resolve) => setImmediate(resolve));
|
||||
await new Promise<void>((resolve) => {
|
||||
setImmediate(resolve);
|
||||
});
|
||||
harness.close();
|
||||
|
||||
const result = await run;
|
||||
@@ -3745,7 +3813,9 @@ describe("runCodexAppServerAttempt turn watches", () => {
|
||||
},
|
||||
},
|
||||
});
|
||||
await new Promise<void>((resolve) => setImmediate(resolve));
|
||||
await new Promise<void>((resolve) => {
|
||||
setImmediate(resolve);
|
||||
});
|
||||
expect(resolved).toBe(false);
|
||||
|
||||
await harness.notify({
|
||||
|
||||
@@ -206,7 +206,9 @@ export async function waitForHttpBodyDeltas(
|
||||
if (deltas.length >= count) {
|
||||
return deltas;
|
||||
}
|
||||
await new Promise((resolve) => setTimeout(resolve, 25));
|
||||
await new Promise((resolve) => {
|
||||
setTimeout(resolve, 25);
|
||||
});
|
||||
}
|
||||
throw new Error(`expected ${count} http body deltas`);
|
||||
}
|
||||
|
||||
@@ -704,7 +704,9 @@ describe("shared Codex app-server client", () => {
|
||||
});
|
||||
|
||||
try {
|
||||
await new Promise<void>((resolve) => server.once("listening", resolve));
|
||||
await new Promise<void>((resolve) => {
|
||||
server.once("listening", resolve);
|
||||
});
|
||||
const address = server.address();
|
||||
if (!address || typeof address === "string") {
|
||||
throw new Error("expected websocket test server port");
|
||||
@@ -741,9 +743,9 @@ describe("shared Codex app-server client", () => {
|
||||
expect(authHeaders).toEqual(["Bearer tok-first", "Bearer tok-second"]);
|
||||
} finally {
|
||||
clearSharedCodexAppServerClient();
|
||||
await new Promise<void>((resolve, reject) =>
|
||||
server.close((error) => (error ? reject(error) : resolve())),
|
||||
);
|
||||
await new Promise<void>((resolve, reject) => {
|
||||
server.close((error) => (error ? reject(error) : resolve()));
|
||||
});
|
||||
}
|
||||
});
|
||||
});
|
||||
|
||||
@@ -141,7 +141,9 @@ function mockCall(mock: ReturnType<typeof vi.fn>, index = 0): unknown[] {
|
||||
}
|
||||
|
||||
function flushDiagnosticEvents() {
|
||||
return new Promise<void>((resolve) => setImmediate(resolve));
|
||||
return new Promise<void>((resolve) => {
|
||||
setImmediate(resolve);
|
||||
});
|
||||
}
|
||||
|
||||
function activeDiagnosticToolKeys(events: DiagnosticEventPayload[]): Set<string> {
|
||||
|
||||
@@ -12,14 +12,12 @@ describe("Codex app-server websocket transport", () => {
|
||||
}
|
||||
clients.length = 0;
|
||||
await Promise.all(
|
||||
servers
|
||||
.splice(0)
|
||||
.map(
|
||||
(server) =>
|
||||
new Promise<void>((resolve, reject) =>
|
||||
server.close((error) => (error ? reject(error) : resolve())),
|
||||
),
|
||||
),
|
||||
servers.splice(0).map(
|
||||
(server) =>
|
||||
new Promise<void>((resolve, reject) => {
|
||||
server.close((error) => (error ? reject(error) : resolve()));
|
||||
}),
|
||||
),
|
||||
);
|
||||
});
|
||||
|
||||
@@ -42,7 +40,9 @@ describe("Codex app-server websocket transport", () => {
|
||||
}
|
||||
});
|
||||
});
|
||||
await new Promise<void>((resolve) => server.once("listening", resolve));
|
||||
await new Promise<void>((resolve) => {
|
||||
server.once("listening", resolve);
|
||||
});
|
||||
const address = server.address();
|
||||
if (!address || typeof address === "string") {
|
||||
throw new Error("expected websocket test server port");
|
||||
|
||||
@@ -1096,7 +1096,9 @@ describe("codex conversation binding", () => {
|
||||
},
|
||||
{ timeoutMs: 50 },
|
||||
);
|
||||
await new Promise<void>((resolve) => setImmediate(resolve));
|
||||
await new Promise<void>((resolve) => {
|
||||
setImmediate(resolve);
|
||||
});
|
||||
|
||||
expect(result).toEqual({
|
||||
handled: true,
|
||||
|
||||
@@ -387,7 +387,9 @@ function isCodexPluginLoadWarningItem(item: MigrationItem): boolean {
|
||||
}
|
||||
|
||||
async function sleep(ms: number): Promise<void> {
|
||||
await new Promise((resolve) => setTimeout(resolve, ms));
|
||||
await new Promise((resolve) => {
|
||||
setTimeout(resolve, ms);
|
||||
});
|
||||
}
|
||||
|
||||
async function buildTargetCodexPluginAppCacheKey(ctx: MigrationProviderContext): Promise<string> {
|
||||
|
||||
@@ -440,7 +440,9 @@ async function waitForLocalHistory(params: {
|
||||
}
|
||||
|
||||
const pollDelayMs = resolveComfyRemainingMs(deadline, params.timeoutMs, params.pollIntervalMs);
|
||||
await new Promise((resolve) => setTimeout(resolve, pollDelayMs));
|
||||
await new Promise((resolve) => {
|
||||
setTimeout(resolve, pollDelayMs);
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
@@ -479,7 +481,9 @@ async function waitForCloudCompletion(params: {
|
||||
}
|
||||
|
||||
const pollDelayMs = resolveComfyRemainingMs(deadline, params.timeoutMs, params.pollIntervalMs);
|
||||
await new Promise((resolve) => setTimeout(resolve, pollDelayMs));
|
||||
await new Promise((resolve) => {
|
||||
setTimeout(resolve, pollDelayMs);
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -55,7 +55,9 @@ function createDeferred<T>() {
|
||||
}
|
||||
|
||||
async function flushAsyncWork() {
|
||||
await new Promise((resolve) => setTimeout(resolve, 0));
|
||||
await new Promise((resolve) => {
|
||||
setTimeout(resolve, 0);
|
||||
});
|
||||
}
|
||||
|
||||
describe("createCopilotAgentHarness", () => {
|
||||
|
||||
@@ -729,7 +729,9 @@ describe("runCopilotAttempt", () => {
|
||||
});
|
||||
const session = await sessionCreated.promise;
|
||||
for (let i = 0; i < 100 && session.sendAndWait.mock.calls.length === 0; i++) {
|
||||
await new Promise((resolve) => setTimeout(resolve, 0));
|
||||
await new Promise((resolve) => {
|
||||
setTimeout(resolve, 0);
|
||||
});
|
||||
}
|
||||
expect(session.sendAndWait).toHaveBeenCalledTimes(1);
|
||||
|
||||
|
||||
@@ -346,7 +346,9 @@ async function emitAndCaptureLog(
|
||||
}
|
||||
|
||||
function flushDiagnosticEvents() {
|
||||
return new Promise<void>((resolve) => setImmediate(resolve));
|
||||
return new Promise<void>((resolve) => {
|
||||
setImmediate(resolve);
|
||||
});
|
||||
}
|
||||
|
||||
function emitTrustedModelCallCompletedWithContent(
|
||||
@@ -3297,24 +3299,26 @@ describe("diagnostics-otel service", () => {
|
||||
},
|
||||
{
|
||||
inputMessages: [
|
||||
{ role: "user", content: "what changed?", timestamp: 1 },
|
||||
{
|
||||
role: "assistant",
|
||||
content: [{ type: "toolCall", id: "call-1", name: "lookup", arguments: { q: "trace" } }],
|
||||
},
|
||||
{ role: "toolResult", toolCallId: "call-1", content: { rows: 1 } },
|
||||
],
|
||||
{ role: "user", content: "what changed?", timestamp: 1 },
|
||||
{
|
||||
role: "assistant",
|
||||
content: [
|
||||
{ type: "toolCall", id: "call-1", name: "lookup", arguments: { q: "trace" } },
|
||||
],
|
||||
},
|
||||
{ role: "toolResult", toolCallId: "call-1", content: { rows: 1 } },
|
||||
],
|
||||
outputMessages: [
|
||||
{
|
||||
role: "assistant",
|
||||
content: [{ type: "text", text: "the trace changed" }],
|
||||
stopReason: "stop",
|
||||
},
|
||||
],
|
||||
{
|
||||
role: "assistant",
|
||||
content: [{ type: "text", text: "the trace changed" }],
|
||||
stopReason: "stop",
|
||||
},
|
||||
],
|
||||
systemPrompt: "be exact",
|
||||
toolDefinitions: [
|
||||
{ name: "lookup", description: "Lookup data", parameters: { type: "object" } },
|
||||
],
|
||||
{ name: "lookup", description: "Lookup data", parameters: { type: "object" } },
|
||||
],
|
||||
},
|
||||
);
|
||||
await flushDiagnosticEvents();
|
||||
|
||||
@@ -1154,9 +1154,13 @@ describe("processDiscordMessage ack reactions", () => {
|
||||
vi.useFakeTimers();
|
||||
dispatchInboundMessage.mockImplementationOnce(async (params?: DispatchInboundParams) => {
|
||||
await params?.replyOptions?.onCompactionStart?.();
|
||||
await new Promise((resolve) => setTimeout(resolve, 1_000));
|
||||
await new Promise((resolve) => {
|
||||
setTimeout(resolve, 1_000);
|
||||
});
|
||||
await params?.replyOptions?.onCompactionEnd?.();
|
||||
await new Promise((resolve) => setTimeout(resolve, 1_000));
|
||||
await new Promise((resolve) => {
|
||||
setTimeout(resolve, 1_000);
|
||||
});
|
||||
return createNoQueuedDispatchResult();
|
||||
});
|
||||
|
||||
@@ -1545,7 +1549,9 @@ describe("processDiscordMessage session routing", () => {
|
||||
vi.useFakeTimers();
|
||||
dispatchInboundMessage.mockImplementationOnce(async (params?: DispatchInboundParams) => {
|
||||
await params?.replyOptions?.onReasoningStream?.();
|
||||
await new Promise((resolve) => setTimeout(resolve, 1_000));
|
||||
await new Promise((resolve) => {
|
||||
setTimeout(resolve, 1_000);
|
||||
});
|
||||
return createNoQueuedDispatchResult();
|
||||
});
|
||||
const ctx = await createBaseContext({
|
||||
@@ -1583,7 +1589,9 @@ describe("processDiscordMessage session routing", () => {
|
||||
vi.useFakeTimers();
|
||||
dispatchInboundMessage.mockImplementationOnce(async (params?: DispatchInboundParams) => {
|
||||
await params?.replyOptions?.onReasoningStream?.();
|
||||
await new Promise((resolve) => setTimeout(resolve, 1_000));
|
||||
await new Promise((resolve) => {
|
||||
setTimeout(resolve, 1_000);
|
||||
});
|
||||
return createNoQueuedDispatchResult();
|
||||
});
|
||||
const ctx = await createBaseContext({
|
||||
|
||||
@@ -119,7 +119,9 @@ export async function applyDiscordModelPickerSelection(params: {
|
||||
|
||||
const fallbackRoute = dispatchResult.effectiveRoute ?? params.route;
|
||||
if (params.settleMs > 0) {
|
||||
await new Promise((resolve) => setTimeout(resolve, params.settleMs));
|
||||
await new Promise((resolve) => {
|
||||
setTimeout(resolve, params.settleMs);
|
||||
});
|
||||
}
|
||||
|
||||
let effectiveModelRef = params.resolveCurrentModel(fallbackRoute);
|
||||
@@ -135,7 +137,9 @@ export async function applyDiscordModelPickerSelection(params: {
|
||||
params.selectedModel === params.defaultModel,
|
||||
runtime: params.selectedRuntime,
|
||||
});
|
||||
await new Promise((resolve) => setTimeout(resolve, 100));
|
||||
await new Promise((resolve) => {
|
||||
setTimeout(resolve, 100);
|
||||
});
|
||||
effectiveModelRef = params.resolveCurrentModel(fallbackRoute);
|
||||
persisted = effectiveModelRef === params.resolvedModelRef;
|
||||
}
|
||||
@@ -155,7 +159,9 @@ export async function applyDiscordModelPickerSelection(params: {
|
||||
params.selectedModel === params.defaultModel,
|
||||
runtime: params.selectedRuntime,
|
||||
});
|
||||
await new Promise((resolve) => setTimeout(resolve, 100));
|
||||
await new Promise((resolve) => {
|
||||
setTimeout(resolve, 100);
|
||||
});
|
||||
effectiveModelRef = params.resolveCurrentModel(fallbackRoute);
|
||||
persisted = effectiveModelRef === params.resolvedModelRef;
|
||||
if (!persisted) {
|
||||
|
||||
@@ -440,7 +440,9 @@ describe("createDiscordGatewayPlugin", () => {
|
||||
process.on("unhandledRejection", onUnhandledRejection);
|
||||
try {
|
||||
startIgnoredGatewayRegistration(plugin);
|
||||
await new Promise((resolve) => setImmediate(resolve));
|
||||
await new Promise((resolve) => {
|
||||
setImmediate(resolve);
|
||||
});
|
||||
|
||||
expect(unhandledReasons).toHaveLength(0);
|
||||
const registration = waitForDiscordGatewayPluginRegistration(plugin);
|
||||
|
||||
@@ -3865,14 +3865,18 @@ describe("DiscordVoiceManager", () => {
|
||||
|
||||
resolveSecond?.({ payloads: [{ text: "second answer" }] });
|
||||
resolveThird?.({ payloads: [{ text: "third answer" }] });
|
||||
await new Promise<void>((resolve) => setImmediate(resolve));
|
||||
await new Promise<void>((resolve) => {
|
||||
setImmediate(resolve);
|
||||
});
|
||||
expectUserMessageNotIncludes("second answer");
|
||||
expectUserMessageNotIncludes("third answer");
|
||||
|
||||
bridgeParams?.onEvent?.({ direction: "server", type: "response.done" });
|
||||
const firstStream = lastAudioResourceInput() as PassThrough | undefined;
|
||||
await vi.waitFor(() => expect(firstStream?.writableEnded).toBe(true));
|
||||
await new Promise<void>((resolve) => setImmediate(resolve));
|
||||
await new Promise<void>((resolve) => {
|
||||
setImmediate(resolve);
|
||||
});
|
||||
expectUserMessageNotIncludes("second answer");
|
||||
|
||||
const idleHandler = player.on.mock.calls.find(([event]) => event === "idle")?.[1] as
|
||||
@@ -3886,7 +3890,9 @@ describe("DiscordVoiceManager", () => {
|
||||
bridgeParams?.onEvent?.({ direction: "server", type: "response.done" });
|
||||
const secondStream = lastAudioResourceInput() as PassThrough | undefined;
|
||||
await vi.waitFor(() => expect(secondStream?.writableEnded).toBe(true));
|
||||
await new Promise<void>((resolve) => setImmediate(resolve));
|
||||
await new Promise<void>((resolve) => {
|
||||
setImmediate(resolve);
|
||||
});
|
||||
expectUserMessageNotIncludes("third answer");
|
||||
|
||||
idleHandler?.();
|
||||
@@ -3950,7 +3956,9 @@ describe("DiscordVoiceManager", () => {
|
||||
bridgeParams?.onEvent?.({ direction: "server", type: "response.done" });
|
||||
const firstStream = lastAudioResourceInput() as PassThrough | undefined;
|
||||
await vi.waitFor(() => expect(firstStream?.writableEnded).toBe(true));
|
||||
await new Promise<void>((resolve) => setImmediate(resolve));
|
||||
await new Promise<void>((resolve) => {
|
||||
setImmediate(resolve);
|
||||
});
|
||||
expectUserMessageNotIncludes("second answer");
|
||||
|
||||
const idleHandler = player.on.mock.calls.find(([event]) => event === "idle")?.[1] as
|
||||
|
||||
@@ -538,7 +538,9 @@ async function waitForFalQueueResult(params: {
|
||||
throw new Error(FAL_VIDEO_MALFORMED_RESPONSE);
|
||||
}
|
||||
const pollDelayMs = resolveFalQueueRemainingMs(params.deadline, lastStatus, POLL_INTERVAL_MS);
|
||||
await new Promise((resolve) => setTimeout(resolve, pollDelayMs));
|
||||
await new Promise((resolve) => {
|
||||
setTimeout(resolve, pollDelayMs);
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -340,7 +340,9 @@ export async function getAppOwnerOpenId(params: {
|
||||
}
|
||||
|
||||
function sleep(ms: number): Promise<void> {
|
||||
return new Promise((resolve) => setTimeout(resolve, ms));
|
||||
return new Promise((resolve) => {
|
||||
setTimeout(resolve, ms);
|
||||
});
|
||||
}
|
||||
|
||||
function sleepRegistrationPollInterval(intervalSeconds: number): Promise<void> {
|
||||
|
||||
@@ -361,7 +361,9 @@ async function resolveParsedCommentContent(params: {
|
||||
}
|
||||
|
||||
async function delayMs(ms: number): Promise<void> {
|
||||
await new Promise((resolve) => setTimeout(resolve, ms));
|
||||
await new Promise((resolve) => {
|
||||
setTimeout(resolve, ms);
|
||||
});
|
||||
}
|
||||
|
||||
function buildDriveCommentTargetUrl(params: {
|
||||
|
||||
@@ -10,12 +10,16 @@ const WEBHOOK_MONITOR_START_MAX_ATTEMPTS = 4;
|
||||
|
||||
export async function getFreePort(): Promise<number> {
|
||||
const server = createServer();
|
||||
await new Promise<void>((resolve) => server.listen(0, "127.0.0.1", () => resolve()));
|
||||
await new Promise<void>((resolve) => {
|
||||
server.listen(0, "127.0.0.1", () => resolve());
|
||||
});
|
||||
const address = server.address() as AddressInfo | null;
|
||||
if (!address) {
|
||||
throw new Error("missing server address");
|
||||
}
|
||||
await new Promise<void>((resolve) => server.close(() => resolve()));
|
||||
await new Promise<void>((resolve) => {
|
||||
server.close(() => resolve());
|
||||
});
|
||||
return address.port;
|
||||
}
|
||||
|
||||
@@ -29,7 +33,9 @@ async function waitUntilServerReady(url: string): Promise<void> {
|
||||
} catch {
|
||||
// retry
|
||||
}
|
||||
await new Promise((resolve) => setTimeout(resolve, WEBHOOK_READY_RETRY_DELAY_MS));
|
||||
await new Promise((resolve) => {
|
||||
setTimeout(resolve, WEBHOOK_READY_RETRY_DELAY_MS);
|
||||
});
|
||||
}
|
||||
throw new Error(`server did not start: ${url}`);
|
||||
}
|
||||
@@ -108,7 +114,9 @@ export async function withRunningWebhookMonitor(
|
||||
abortController.abort();
|
||||
await monitorPromise.catch(() => undefined);
|
||||
if (attempt < WEBHOOK_MONITOR_START_MAX_ATTEMPTS) {
|
||||
await new Promise((resolve) => setTimeout(resolve, attempt * WEBHOOK_READY_RETRY_DELAY_MS));
|
||||
await new Promise((resolve) => {
|
||||
setTimeout(resolve, attempt * WEBHOOK_READY_RETRY_DELAY_MS);
|
||||
});
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1805,7 +1805,9 @@ describe("createFeishuReplyDispatcher streaming behavior", () => {
|
||||
const fallbackPromise = result.ensureNoVisibleReplyFallback("zero-final-count");
|
||||
|
||||
for (let attempt = 0; attempt < 20 && closeMock.mock.calls.length === 0; attempt += 1) {
|
||||
await new Promise((resolve) => setTimeout(resolve, 0));
|
||||
await new Promise((resolve) => {
|
||||
setTimeout(resolve, 0);
|
||||
});
|
||||
}
|
||||
expect(closeMock).toHaveBeenCalledTimes(1);
|
||||
expect(sendMessageFeishuMock).not.toHaveBeenCalled();
|
||||
|
||||
@@ -85,7 +85,9 @@ describe("createSequentialQueue", () => {
|
||||
}),
|
||||
).rejects.toThrow("boom");
|
||||
|
||||
await new Promise<void>((resolve) => setImmediate(resolve));
|
||||
await new Promise<void>((resolve) => {
|
||||
setImmediate(resolve);
|
||||
});
|
||||
expect(unhandled).toStrictEqual([]);
|
||||
|
||||
await expect(enqueue("feishu:default:chat-1", async () => {})).resolves.toBeUndefined();
|
||||
|
||||
@@ -420,7 +420,9 @@ async function runNewAppFlow(params: {
|
||||
|
||||
// ----- Apply credentials & security policy -----
|
||||
const configProgress = prompter.progress(t("wizard.feishu.configuring"));
|
||||
await new Promise((resolve) => setTimeout(resolve, 50));
|
||||
await new Promise((resolve) => {
|
||||
setTimeout(resolve, 50);
|
||||
});
|
||||
|
||||
if (appId && appSecret) {
|
||||
next = patchFeishuConfig(next, targetAccountId, {
|
||||
|
||||
@@ -221,7 +221,9 @@ async function sleepGitHubDevicePollDelay(delayMs: number, expiresAt: number): P
|
||||
while (Date.now() < targetAt) {
|
||||
const remainingMs = Math.max(1, targetAt - Date.now());
|
||||
const safeDelayMs = resolveTimerTimeoutMs(remainingMs, 1);
|
||||
await new Promise((resolve) => setTimeout(resolve, Math.min(safeDelayMs, remainingMs)));
|
||||
await new Promise((resolve) => {
|
||||
setTimeout(resolve, Math.min(safeDelayMs, remainingMs));
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -140,7 +140,9 @@ function startGoogleMeetNodeAudioInputLoop(params: {
|
||||
if (consecutiveInputErrors >= 5 || /unknown bridgeId|bridge is not open/i.test(message)) {
|
||||
await params.stop();
|
||||
} else {
|
||||
await new Promise((resolve) => setTimeout(resolve, 250));
|
||||
await new Promise((resolve) => {
|
||||
setTimeout(resolve, 250);
|
||||
});
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -766,7 +766,9 @@ async function openMeetWithBrowserRequest(params: {
|
||||
}
|
||||
const remainingWaitMs = deadline - Date.now();
|
||||
if (remainingWaitMs > 0) {
|
||||
await new Promise((resolve) => setTimeout(resolve, Math.min(750, remainingWaitMs)));
|
||||
await new Promise((resolve) => {
|
||||
setTimeout(resolve, Math.min(750, remainingWaitMs));
|
||||
});
|
||||
}
|
||||
} while (Date.now() < deadline);
|
||||
return { launched: true, browser };
|
||||
|
||||
@@ -267,7 +267,9 @@ async function waitForGeminiBatch(params: {
|
||||
throw new Error(`gemini batch ${params.batchName} timed out after ${params.timeoutMs}ms`);
|
||||
}
|
||||
params.debug?.(`gemini batch ${params.batchName} ${state}; waiting ${params.pollIntervalMs}ms`);
|
||||
await new Promise((resolve) => setTimeout(resolve, params.pollIntervalMs));
|
||||
await new Promise((resolve) => {
|
||||
setTimeout(resolve, params.pollIntervalMs);
|
||||
});
|
||||
current = undefined;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -64,7 +64,9 @@ async function pollOperation(
|
||||
headers: Record<string, string>,
|
||||
): Promise<{ done?: boolean; response?: { cloudaicompanionProject?: { id?: string } } }> {
|
||||
for (let attempt = 0; attempt < 24; attempt += 1) {
|
||||
await new Promise((resolve) => setTimeout(resolve, 5000));
|
||||
await new Promise((resolve) => {
|
||||
setTimeout(resolve, 5000);
|
||||
});
|
||||
const response = await fetchWithTimeout(`${endpoint}/v1internal/${operationName}`, {
|
||||
headers,
|
||||
});
|
||||
|
||||
@@ -30,7 +30,9 @@ describe("monitorIMessageProvider", () => {
|
||||
});
|
||||
abortController.abort();
|
||||
// Give the event loop a turn to surface any unhandledRejection, if present.
|
||||
await new Promise<void>((resolve) => setImmediate(resolve));
|
||||
await new Promise<void>((resolve) => {
|
||||
setImmediate(resolve);
|
||||
});
|
||||
detach();
|
||||
} finally {
|
||||
process.off("unhandledRejection", onUnhandled);
|
||||
|
||||
@@ -475,7 +475,9 @@ describe("monitorLineProvider lifecycle", () => {
|
||||
const firstRequests = Array.from({ length: limit }, () =>
|
||||
route.handler(createHeldPostRequest(), createRouteResponse()),
|
||||
);
|
||||
await new Promise((resolve) => setImmediate(resolve));
|
||||
await new Promise((resolve) => {
|
||||
setImmediate(resolve);
|
||||
});
|
||||
|
||||
const overflowResponse = createRouteResponse();
|
||||
await route.handler(createSignedPostRequest(), overflowResponse);
|
||||
|
||||
@@ -589,7 +589,7 @@ describe("matrix verification actions", () => {
|
||||
startVerification: vi.fn(async () => sas),
|
||||
};
|
||||
const getOwnDeviceIdentityVerificationStatus = vi.fn(
|
||||
async () => await new Promise<never>(() => undefined),
|
||||
async () => await new Promise<never>(() => {}),
|
||||
);
|
||||
const getOwnDeviceVerificationStatus = vi.fn(async () => mockVerifiedOwnerStatus());
|
||||
const getOwnCrossSigningPublicationStatus = vi.fn(async () =>
|
||||
|
||||
@@ -293,9 +293,9 @@ async function resolveVerificationSasNoticeForSignal(
|
||||
};
|
||||
}
|
||||
|
||||
await new Promise((resolve) =>
|
||||
setTimeout(resolve, params.sasNoticeRetryDelayMs ?? SAS_NOTICE_RETRY_DELAY_MS),
|
||||
);
|
||||
await new Promise((resolve) => {
|
||||
setTimeout(resolve, params.sasNoticeRetryDelayMs ?? SAS_NOTICE_RETRY_DELAY_MS);
|
||||
});
|
||||
const retriedSummary = await resolveVerificationSummaryForSignal(client, params);
|
||||
return {
|
||||
summary: retriedSummary,
|
||||
|
||||
@@ -1848,13 +1848,13 @@ describe("MatrixClient crypto bootstrapping", () => {
|
||||
localTimeoutMs: 1,
|
||||
});
|
||||
vi.spyOn(client, "getRoomKeyBackupStatus").mockImplementation(
|
||||
async () => await new Promise<never>(() => undefined),
|
||||
async () => await new Promise<never>(() => {}),
|
||||
);
|
||||
vi.spyOn(client, "getDeviceVerificationStatus").mockImplementation(
|
||||
async () => await new Promise<never>(() => undefined),
|
||||
async () => await new Promise<never>(() => {}),
|
||||
);
|
||||
vi.spyOn(client, "listOwnDevices").mockImplementation(
|
||||
async () => await new Promise<never>(() => undefined),
|
||||
async () => await new Promise<never>(() => {}),
|
||||
);
|
||||
|
||||
const status = await client.getOwnDeviceVerificationStatus();
|
||||
|
||||
@@ -439,7 +439,9 @@ export abstract class MemoryManagerEmbeddingOps extends MemoryManagerSyncOps {
|
||||
EMBEDDING_RETRY_MAX_DELAY_MS,
|
||||
);
|
||||
log.warn(`memory embeddings retryable error; ${action} in ${waitMs}ms`);
|
||||
await new Promise((resolve) => setTimeout(resolve, waitMs));
|
||||
await new Promise((resolve) => {
|
||||
setTimeout(resolve, waitMs);
|
||||
});
|
||||
}
|
||||
|
||||
private resolveEmbeddingTimeout(kind: "query" | "batch"): number {
|
||||
|
||||
@@ -97,7 +97,9 @@ async function waitUntil(predicate: () => boolean, timeoutMs = 1_000): Promise<v
|
||||
if (Date.now() - startedAt > timeoutMs) {
|
||||
throw new Error("Timed out waiting for condition");
|
||||
}
|
||||
await new Promise((resolve) => scheduleNativeTimeout(resolve, 10));
|
||||
await new Promise((resolve) => {
|
||||
scheduleNativeTimeout(resolve, 10);
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
@@ -723,7 +725,9 @@ describe("QmdMemoryManager", () => {
|
||||
void createPromise.then(() => {
|
||||
created = true;
|
||||
});
|
||||
await new Promise<void>((resolve) => setImmediate(resolve));
|
||||
await new Promise<void>((resolve) => {
|
||||
setImmediate(resolve);
|
||||
});
|
||||
expect(created).toBe(false);
|
||||
(releaseUpdate as (() => void) | null)?.();
|
||||
const manager = await createPromise;
|
||||
|
||||
@@ -1692,7 +1692,9 @@ export class QmdMemoryManager implements MemorySearchManager {
|
||||
log.warn(
|
||||
`qmd update retry ${attempt}/${maxAttempts - 1} after failure (${reason}): ${String(err)}`,
|
||||
);
|
||||
await new Promise<void>((resolve) => setTimeout(resolve, delayMs));
|
||||
await new Promise<void>((resolve) => {
|
||||
setTimeout(resolve, delayMs);
|
||||
});
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -3049,7 +3051,9 @@ export class QmdMemoryManager implements MemorySearchManager {
|
||||
}
|
||||
await Promise.race([
|
||||
pending.catch(() => undefined),
|
||||
new Promise<void>((resolve) => setTimeout(resolve, SEARCH_PENDING_UPDATE_WAIT_MS)),
|
||||
new Promise<void>((resolve) => {
|
||||
setTimeout(resolve, SEARCH_PENDING_UPDATE_WAIT_MS);
|
||||
}),
|
||||
]);
|
||||
}
|
||||
|
||||
|
||||
@@ -467,7 +467,7 @@ describe("memory tools", () => {
|
||||
];
|
||||
});
|
||||
registerMemoryCorpusSupplement("memory-wiki", {
|
||||
search: async () => await new Promise(() => undefined),
|
||||
search: async () => await new Promise(() => {}),
|
||||
get: async () => null,
|
||||
});
|
||||
|
||||
@@ -503,7 +503,7 @@ describe("memory tools", () => {
|
||||
let searchCalls = 0;
|
||||
setMemorySearchImpl(async () => {
|
||||
searchCalls += 1;
|
||||
return await new Promise(() => undefined);
|
||||
return await new Promise(() => {});
|
||||
});
|
||||
registerMemoryCorpusSupplement("memory-wiki", {
|
||||
search: async () => [
|
||||
|
||||
@@ -133,7 +133,7 @@ describe("memory_search unavailable payloads", () => {
|
||||
it("returns unavailable metadata when manager setup does not settle", async () => {
|
||||
vi.useFakeTimers();
|
||||
try {
|
||||
setMemorySearchManagerImpl(async () => await new Promise(() => undefined));
|
||||
setMemorySearchManagerImpl(async () => await new Promise(() => {}));
|
||||
const tool = createMemorySearchToolOrThrow();
|
||||
|
||||
const resultPromise = tool.execute("manager-timeout", { query: "hello" });
|
||||
@@ -156,7 +156,7 @@ describe("memory_search unavailable payloads", () => {
|
||||
let searchCalls = 0;
|
||||
setMemorySearchImpl(async () => {
|
||||
searchCalls += 1;
|
||||
return await new Promise(() => undefined);
|
||||
return await new Promise(() => {});
|
||||
});
|
||||
const tool = createMemorySearchToolOrThrow();
|
||||
|
||||
|
||||
@@ -716,7 +716,7 @@ describe("memory plugin e2e", () => {
|
||||
test("returns unavailable when memory_recall embedding does not settle", async () => {
|
||||
vi.useFakeTimers();
|
||||
const ensureGlobalUndiciEnvProxyDispatcher = vi.fn();
|
||||
const post = vi.fn(() => new Promise(() => undefined));
|
||||
const post = vi.fn(() => new Promise(() => {}));
|
||||
const loadLanceDbModule = vi.fn(async () => ({
|
||||
connect: vi.fn(async () => ({
|
||||
tableNames: vi.fn(async () => ["memories"]),
|
||||
|
||||
@@ -148,7 +148,9 @@ describe("compileMemoryWikiVault", () => {
|
||||
activePageReads += 1;
|
||||
maxActivePageReads = Math.max(maxActivePageReads, activePageReads);
|
||||
try {
|
||||
await new Promise((resolve) => setTimeout(resolve, 5));
|
||||
await new Promise((resolve) => {
|
||||
setTimeout(resolve, 5);
|
||||
});
|
||||
return await originalReadFile(...args);
|
||||
} finally {
|
||||
activePageReads -= 1;
|
||||
|
||||
@@ -284,7 +284,9 @@ export async function loginMiniMaxPortalOAuth(params: {
|
||||
if (remainingMs <= 0) {
|
||||
break;
|
||||
}
|
||||
await new Promise((resolve) => setTimeout(resolve, Math.min(pollIntervalMs, remainingMs)));
|
||||
await new Promise((resolve) => {
|
||||
setTimeout(resolve, Math.min(pollIntervalMs, remainingMs));
|
||||
});
|
||||
pollIntervalMs = Math.max(pollIntervalMs, 2000);
|
||||
}
|
||||
|
||||
|
||||
@@ -303,7 +303,9 @@ describe("monitorMSTeamsProvider lifecycle", () => {
|
||||
|
||||
const early = await Promise.race([
|
||||
task.then(() => "resolved"),
|
||||
new Promise<"pending">((resolve) => setTimeout(() => resolve("pending"), 50)),
|
||||
new Promise<"pending">((resolve) => {
|
||||
setTimeout(() => resolve("pending"), 50);
|
||||
}),
|
||||
]);
|
||||
expect(early).toBe("pending");
|
||||
|
||||
|
||||
@@ -1869,7 +1869,9 @@ describe("createOllamaStreamFn streaming events", () => {
|
||||
expect(
|
||||
await Promise.race([
|
||||
pendingStartEvent.then(() => "event" as const),
|
||||
new Promise<"timeout">((resolve) => setTimeout(() => resolve("timeout"), 100)),
|
||||
new Promise<"timeout">((resolve) => {
|
||||
setTimeout(() => resolve("timeout"), 100);
|
||||
}),
|
||||
]),
|
||||
).toBe("timeout");
|
||||
|
||||
|
||||
@@ -194,7 +194,9 @@ async function waitForOpenAiBatch(params: {
|
||||
throw new Error(`openai batch ${params.batchId} timed out after ${params.timeoutMs}ms`);
|
||||
}
|
||||
params.debug?.(`openai batch ${params.batchId} ${state}; waiting ${params.pollIntervalMs}ms`);
|
||||
await new Promise((resolve) => setTimeout(resolve, params.pollIntervalMs));
|
||||
await new Promise((resolve) => {
|
||||
setTimeout(resolve, params.pollIntervalMs);
|
||||
});
|
||||
current = undefined;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -194,9 +194,9 @@ async function pollOpenAICodexDeviceCode(params: {
|
||||
}
|
||||
|
||||
if (response.status === 403 || response.status === 404) {
|
||||
await new Promise((resolve) =>
|
||||
setTimeout(resolve, resolveNextDeviceCodePollDelayMs(params.intervalMs, deadline)),
|
||||
);
|
||||
await new Promise((resolve) => {
|
||||
setTimeout(resolve, resolveNextDeviceCodePollDelayMs(params.intervalMs, deadline));
|
||||
});
|
||||
continue;
|
||||
}
|
||||
|
||||
|
||||
@@ -163,7 +163,7 @@ function settleAfterDelay(params: {
|
||||
}
|
||||
|
||||
function waitForeverForPromptInput(): Promise<string> {
|
||||
return new Promise<string>(() => undefined);
|
||||
return new Promise<string>(() => {});
|
||||
}
|
||||
|
||||
function createOpenAICodexOAuthError(
|
||||
|
||||
@@ -312,7 +312,9 @@ describeLive("openai plugin live", () => {
|
||||
|
||||
try {
|
||||
await session.connect();
|
||||
await new Promise((resolve) => setTimeout(resolve, 1_000));
|
||||
await new Promise((resolve) => {
|
||||
setTimeout(resolve, 1_000);
|
||||
});
|
||||
expect(errors).toStrictEqual([]);
|
||||
expect(session.isConnected()).toBe(true);
|
||||
} finally {
|
||||
|
||||
@@ -872,7 +872,9 @@ class OpenAIRealtimeVoiceBridge implements RealtimeVoiceBridge {
|
||||
type: "session.reconnect.scheduled",
|
||||
detail: `reason=${reason} attempt=${attempt} delayMs=${delay}`,
|
||||
});
|
||||
await new Promise((resolve) => setTimeout(resolve, delay));
|
||||
await new Promise((resolve) => {
|
||||
setTimeout(resolve, delay);
|
||||
});
|
||||
if (this.intentionallyClosed) {
|
||||
return;
|
||||
}
|
||||
|
||||
@@ -148,7 +148,9 @@ describeCacheLive("openrouter plugin live cache", () => {
|
||||
];
|
||||
|
||||
await completeOpenRouterChat({ client, model: resolved.id, messages });
|
||||
await new Promise((resolve) => setTimeout(resolve, 2_000));
|
||||
await new Promise((resolve) => {
|
||||
setTimeout(resolve, 2_000);
|
||||
});
|
||||
const cached = await completeOpenRouterChat({ client, model: resolved.id, messages });
|
||||
|
||||
const cachedTokens = cached.usage?.prompt_tokens_details?.cached_tokens ?? 0;
|
||||
|
||||
@@ -270,7 +270,9 @@ HTTPServer(("0.0.0.0", 8000), Handler).serve_forever()
|
||||
},
|
||||
};
|
||||
}
|
||||
await new Promise((resolve) => setTimeout(resolve, 500));
|
||||
await new Promise((resolve) => {
|
||||
setTimeout(resolve, 500);
|
||||
});
|
||||
}
|
||||
|
||||
await runCommand({
|
||||
|
||||
@@ -130,7 +130,9 @@ describe("qa-bus state", () => {
|
||||
|
||||
const beforeMatch = await Promise.race([
|
||||
pending.then(() => "resolved"),
|
||||
new Promise((resolve) => setTimeout(() => resolve("still-waiting"), 20)),
|
||||
new Promise((resolve) => {
|
||||
setTimeout(() => resolve("still-waiting"), 20);
|
||||
}),
|
||||
]);
|
||||
expect(beforeMatch).toBe("still-waiting");
|
||||
|
||||
|
||||
@@ -491,7 +491,7 @@ async function runInterruptibleServer(label: string, server: InterruptibleServer
|
||||
|
||||
process.on("SIGINT", onSignal);
|
||||
process.on("SIGTERM", onSignal);
|
||||
await new Promise(() => undefined);
|
||||
await new Promise(() => {});
|
||||
}
|
||||
|
||||
async function readQaCredentialPayloadFile(filePath: string) {
|
||||
|
||||
@@ -25,9 +25,9 @@ async function occupyPortOrAcceptExisting(port: number): Promise<{ close: () =>
|
||||
if (!listening) {
|
||||
return;
|
||||
}
|
||||
await new Promise<void>((resolve, reject) =>
|
||||
server.close((error) => (error ? reject(error) : resolve())),
|
||||
);
|
||||
await new Promise<void>((resolve, reject) => {
|
||||
server.close((error) => (error ? reject(error) : resolve()));
|
||||
});
|
||||
},
|
||||
};
|
||||
}
|
||||
|
||||
@@ -376,7 +376,9 @@ async function waitForQaGatewayChildExit(child: ChildProcess, timeoutMs: number)
|
||||
return true;
|
||||
}
|
||||
return await Promise.race([
|
||||
new Promise<boolean>((resolve) => child.once("exit", () => resolve(true))),
|
||||
new Promise<boolean>((resolve) => {
|
||||
child.once("exit", () => resolve(true));
|
||||
}),
|
||||
sleep(timeoutMs).then(() => false),
|
||||
]);
|
||||
}
|
||||
|
||||
@@ -41,9 +41,9 @@ describe("qa-lab server capture helpers", () => {
|
||||
});
|
||||
cleanups.push(
|
||||
async () =>
|
||||
await new Promise<void>((resolve, reject) =>
|
||||
server.close((error) => (error ? reject(error) : resolve())),
|
||||
),
|
||||
await new Promise<void>((resolve, reject) => {
|
||||
server.close((error) => (error ? reject(error) : resolve()));
|
||||
}),
|
||||
);
|
||||
|
||||
const address = server.address();
|
||||
|
||||
@@ -480,9 +480,9 @@ describe("qa-lab server", () => {
|
||||
});
|
||||
cleanups.push(
|
||||
async () =>
|
||||
await new Promise<void>((resolve, reject) =>
|
||||
upstream.close((error) => (error ? reject(error) : resolve())),
|
||||
),
|
||||
await new Promise<void>((resolve, reject) => {
|
||||
upstream.close((error) => (error ? reject(error) : resolve()));
|
||||
}),
|
||||
);
|
||||
|
||||
const address = upstream.address();
|
||||
|
||||
@@ -656,7 +656,9 @@ async function waitForDiscordVoiceState(params: {
|
||||
} catch (error) {
|
||||
lastError = formatErrorMessage(error);
|
||||
}
|
||||
await new Promise((resolve) => setTimeout(resolve, 500));
|
||||
await new Promise((resolve) => {
|
||||
setTimeout(resolve, 500);
|
||||
});
|
||||
}
|
||||
const stateDetails = lastState
|
||||
? `last voice state channel=${lastState.channel_id ?? "none"} user=${lastState.user_id ?? "unknown"}`
|
||||
@@ -1061,7 +1063,9 @@ async function observeStatusReactionTimeline(params: {
|
||||
if (params.expectedSequence.every((emoji) => seenSequence.includes(emoji))) {
|
||||
break;
|
||||
}
|
||||
await new Promise((resolve) => setTimeout(resolve, 250));
|
||||
await new Promise((resolve) => {
|
||||
setTimeout(resolve, 250);
|
||||
});
|
||||
}
|
||||
return {
|
||||
expectedSequence: params.expectedSequence,
|
||||
@@ -1159,7 +1163,9 @@ async function pollChannelMessages(params: {
|
||||
return { message: observedMessage, afterSnowflake };
|
||||
}
|
||||
}
|
||||
await new Promise((resolve) => setTimeout(resolve, 1_000));
|
||||
await new Promise((resolve) => {
|
||||
setTimeout(resolve, 1_000);
|
||||
});
|
||||
}
|
||||
throw new Error(`timed out after ${params.timeoutMs}ms waiting for Discord message`);
|
||||
}
|
||||
@@ -1185,7 +1191,9 @@ async function pollThreadReplyMessage(params: {
|
||||
if (match) {
|
||||
return match;
|
||||
}
|
||||
await new Promise((resolve) => setTimeout(resolve, 1_000));
|
||||
await new Promise((resolve) => {
|
||||
setTimeout(resolve, 1_000);
|
||||
});
|
||||
}
|
||||
return undefined;
|
||||
}
|
||||
@@ -1369,7 +1377,9 @@ async function waitForDiscordChannelRunning(
|
||||
} catch {
|
||||
// retry
|
||||
}
|
||||
await new Promise((resolve) => setTimeout(resolve, 500));
|
||||
await new Promise((resolve) => {
|
||||
setTimeout(resolve, 500);
|
||||
});
|
||||
}
|
||||
const details = lastStatus
|
||||
? ` (last status: running=${String(lastStatus.running)} connected=${String(lastStatus.connected)} restartPending=${String(lastStatus.restartPending)} lastConnectedAt=${String(lastStatus.lastConnectedAt)} lastError=${lastStatus.lastError ?? "null"} lastDisconnect=${JSON.stringify(lastStatus.lastDisconnect)})`
|
||||
@@ -1533,7 +1543,9 @@ async function assertDiscordApplicationCommandsRegistered(params: {
|
||||
if (missing.length === 0) {
|
||||
return { commandNames: lastNames };
|
||||
}
|
||||
await new Promise((resolve) => setTimeout(resolve, 1_000));
|
||||
await new Promise((resolve) => {
|
||||
setTimeout(resolve, 1_000);
|
||||
});
|
||||
}
|
||||
throw new Error(
|
||||
`missing Discord native command(s): ${params.expectedCommandNames
|
||||
|
||||
@@ -388,7 +388,11 @@ export async function acquireQaCredentialLease<TPayload>(
|
||||
});
|
||||
const fetchImpl = opts.fetchImpl ?? fetch;
|
||||
const sleepImpl =
|
||||
opts.sleepImpl ?? ((ms: number) => new Promise((resolve) => setTimeout(resolve, ms)));
|
||||
opts.sleepImpl ??
|
||||
((ms: number) =>
|
||||
new Promise((resolve) => {
|
||||
setTimeout(resolve, ms);
|
||||
}));
|
||||
const timeImpl = opts.timeImpl ?? (() => Date.now());
|
||||
const randomImpl = opts.randomImpl ?? (() => Math.random());
|
||||
const startedAt = timeImpl();
|
||||
|
||||
@@ -949,7 +949,9 @@ async function waitForSlackScenarioReply(params: {
|
||||
{ cause: error },
|
||||
);
|
||||
}
|
||||
await new Promise((resolve) => setTimeout(resolve, 1_000));
|
||||
await new Promise((resolve) => {
|
||||
setTimeout(resolve, 1_000);
|
||||
});
|
||||
}
|
||||
throw new Error(`timed out after ${params.timeoutMs}ms waiting for Slack message`);
|
||||
}
|
||||
@@ -1012,7 +1014,9 @@ async function waitForSlackNoReply(params: {
|
||||
elapsedMs = Date.now() - startedAt;
|
||||
const remainingMs = params.timeoutMs - elapsedMs;
|
||||
if (remainingMs > 0) {
|
||||
await new Promise((resolve) => setTimeout(resolve, Math.min(1_000, remainingMs)));
|
||||
await new Promise((resolve) => {
|
||||
setTimeout(resolve, Math.min(1_000, remainingMs));
|
||||
});
|
||||
}
|
||||
elapsedMs = Date.now() - startedAt;
|
||||
}
|
||||
@@ -1134,7 +1138,9 @@ async function waitForSlackApprovalPrompt(params: {
|
||||
observedAt: new Date().toISOString(),
|
||||
};
|
||||
}
|
||||
await new Promise((resolve) => setTimeout(resolve, 1_000));
|
||||
await new Promise((resolve) => {
|
||||
setTimeout(resolve, 1_000);
|
||||
});
|
||||
}
|
||||
throw new Error(
|
||||
[
|
||||
@@ -1202,7 +1208,9 @@ async function waitForSlackApprovalResolvedUpdate(params: {
|
||||
};
|
||||
}
|
||||
}
|
||||
await new Promise((resolve) => setTimeout(resolve, 1_000));
|
||||
await new Promise((resolve) => {
|
||||
setTimeout(resolve, 1_000);
|
||||
});
|
||||
}
|
||||
throw new Error(
|
||||
`timed out after ${params.timeoutMs}ms waiting for Slack ${params.approvalKind} approval resolution update`,
|
||||
@@ -1252,7 +1260,9 @@ async function waitForSlackApprovalCheckpointAck(params: {
|
||||
throw error;
|
||||
}
|
||||
}
|
||||
await new Promise((resolve) => setTimeout(resolve, 500));
|
||||
await new Promise((resolve) => {
|
||||
setTimeout(resolve, 500);
|
||||
});
|
||||
}
|
||||
throw new Error(`timed out after ${params.timeoutMs}ms waiting for ${params.ackPath}`);
|
||||
}
|
||||
@@ -1572,7 +1582,9 @@ async function waitForSlackChannelRunning(
|
||||
} catch {
|
||||
// retry
|
||||
}
|
||||
await new Promise((resolve) => setTimeout(resolve, 500));
|
||||
await new Promise((resolve) => {
|
||||
setTimeout(resolve, 500);
|
||||
});
|
||||
}
|
||||
throw new Error(
|
||||
`slack account "${accountId}" did not become ready` +
|
||||
@@ -1599,9 +1611,9 @@ async function waitForSlackChannelStable(
|
||||
if (readyForMs >= SLACK_QA_READY_STABILITY_MS) {
|
||||
return;
|
||||
}
|
||||
await new Promise((resolve) =>
|
||||
setTimeout(resolve, Math.max(500, SLACK_QA_READY_STABILITY_MS - readyForMs)),
|
||||
);
|
||||
await new Promise((resolve) => {
|
||||
setTimeout(resolve, Math.max(500, SLACK_QA_READY_STABILITY_MS - readyForMs));
|
||||
});
|
||||
}
|
||||
throw new Error(
|
||||
`slack account "${accountId}" did not remain ready for ${SLACK_QA_READY_STABILITY_MS}ms`,
|
||||
@@ -2018,7 +2030,9 @@ export async function runSlackQaLive(params: {
|
||||
await gatewayHarness.stop().catch((error) => {
|
||||
appendLiveLaneIssue(cleanupIssues, "gateway stop failed", error);
|
||||
});
|
||||
await new Promise((resolve) => setTimeout(resolve, SLACK_QA_GATEWAY_STOP_SETTLE_MS));
|
||||
await new Promise((resolve) => {
|
||||
setTimeout(resolve, SLACK_QA_GATEWAY_STOP_SETTLE_MS);
|
||||
});
|
||||
}
|
||||
}
|
||||
if (scenarioResults.at(-1)?.id === scenario.id) {
|
||||
|
||||
@@ -898,7 +898,9 @@ async function sendGroupMessage(
|
||||
}
|
||||
|
||||
async function waitForTelegramPollRetryDelay(remainingMs: number) {
|
||||
await new Promise((resolve) => setTimeout(resolve, Math.min(250, Math.max(100, remainingMs))));
|
||||
await new Promise((resolve) => {
|
||||
setTimeout(resolve, Math.min(250, Math.max(100, remainingMs)));
|
||||
});
|
||||
}
|
||||
|
||||
async function waitForObservedMessage(params: {
|
||||
@@ -1120,7 +1122,9 @@ async function waitForTelegramChannelRunning(
|
||||
} catch {
|
||||
// retry
|
||||
}
|
||||
await new Promise((resolve) => setTimeout(resolve, 500));
|
||||
await new Promise((resolve) => {
|
||||
setTimeout(resolve, 500);
|
||||
});
|
||||
}
|
||||
throw new Error(`telegram account "${accountId}" did not become ready`);
|
||||
}
|
||||
|
||||
@@ -535,7 +535,9 @@ async function waitForWhatsAppChannelRunning(
|
||||
} catch {
|
||||
// retry
|
||||
}
|
||||
await new Promise((resolve) => setTimeout(resolve, 750));
|
||||
await new Promise((resolve) => {
|
||||
setTimeout(resolve, 750);
|
||||
});
|
||||
}
|
||||
throw new Error(
|
||||
`whatsapp account "${accountId}" did not become ready` +
|
||||
@@ -555,9 +557,9 @@ async function waitForWhatsAppChannelStable(gateway: WhatsAppQaGateway, accountI
|
||||
if (connectedForMs >= WHATSAPP_QA_READY_STABILITY_MS) {
|
||||
return;
|
||||
}
|
||||
await new Promise((resolve) =>
|
||||
setTimeout(resolve, Math.max(750, WHATSAPP_QA_READY_STABILITY_MS - connectedForMs)),
|
||||
);
|
||||
await new Promise((resolve) => {
|
||||
setTimeout(resolve, Math.max(750, WHATSAPP_QA_READY_STABILITY_MS - connectedForMs));
|
||||
});
|
||||
}
|
||||
throw new Error(
|
||||
`whatsapp account "${accountId}" did not remain ready for ${WHATSAPP_QA_READY_STABILITY_MS}ms`,
|
||||
@@ -636,7 +638,9 @@ async function startWhatsAppQaDriverSessionWithRetry(params: { authDir: string }
|
||||
) {
|
||||
throw error;
|
||||
}
|
||||
await new Promise((resolve) => setTimeout(resolve, WHATSAPP_QA_DRIVER_RECONNECT_DELAY_MS));
|
||||
await new Promise((resolve) => {
|
||||
setTimeout(resolve, WHATSAPP_QA_DRIVER_RECONNECT_DELAY_MS);
|
||||
});
|
||||
}
|
||||
}
|
||||
throw new Error("unreachable WhatsApp QA driver retry loop exit");
|
||||
@@ -1022,7 +1026,9 @@ async function runWhatsAppScenario(params: {
|
||||
if (scenarioRun.quietInput) {
|
||||
const quietStartedAt = new Date();
|
||||
await params.driver.sendText(target, scenarioRun.quietInput);
|
||||
await new Promise((resolve) => setTimeout(resolve, scenarioRun.quietWindowMs ?? 5_000));
|
||||
await new Promise((resolve) => {
|
||||
setTimeout(resolve, scenarioRun.quietWindowMs ?? 5_000);
|
||||
});
|
||||
const unexpectedReply = params.driver.getObservedMessages().find((message) => {
|
||||
if (new Date(message.observedAt).getTime() < quietStartedAt.getTime()) {
|
||||
return false;
|
||||
@@ -1041,7 +1047,9 @@ async function runWhatsAppScenario(params: {
|
||||
const requestStartedAt = new Date();
|
||||
await params.driver.sendText(target, scenarioRun.input);
|
||||
if (!scenarioRun.expectReply) {
|
||||
await new Promise((resolve) => setTimeout(resolve, params.scenario.timeoutMs));
|
||||
await new Promise((resolve) => {
|
||||
setTimeout(resolve, params.scenario.timeoutMs);
|
||||
});
|
||||
return {
|
||||
id: params.scenario.id,
|
||||
title: params.scenario.title,
|
||||
@@ -1309,9 +1317,9 @@ export async function runWhatsAppQaLive(params: {
|
||||
isTransientWhatsAppQaDriverError(error)
|
||||
) {
|
||||
driverAttempt += 1;
|
||||
await new Promise((resolve) =>
|
||||
setTimeout(resolve, WHATSAPP_QA_DRIVER_RECONNECT_DELAY_MS),
|
||||
);
|
||||
await new Promise((resolve) => {
|
||||
setTimeout(resolve, WHATSAPP_QA_DRIVER_RECONNECT_DELAY_MS);
|
||||
});
|
||||
try {
|
||||
activeDriver = await restartWhatsAppQaDriverSession({
|
||||
authDir: driverAuthDir,
|
||||
|
||||
@@ -198,7 +198,11 @@ async function mapQaSuiteWithConcurrency<T, U>(
|
||||
const workerCount = Math.min(Math.max(1, Math.floor(concurrency)), items.length);
|
||||
const startStaggerMs = Math.max(0, Math.floor(opts?.startStaggerMs ?? 0));
|
||||
const sleepImpl =
|
||||
opts?.sleepImpl ?? ((ms: number) => new Promise<void>((resolve) => setTimeout(resolve, ms)));
|
||||
opts?.sleepImpl ??
|
||||
((ms: number) =>
|
||||
new Promise<void>((resolve) => {
|
||||
setTimeout(resolve, ms);
|
||||
}));
|
||||
async function waitForStartSlot(shouldReleaseNextSlot: boolean) {
|
||||
const currentGate = nextStartGate;
|
||||
let releaseNextSlot: (() => void) | undefined;
|
||||
|
||||
@@ -131,7 +131,9 @@ async function resolveGeneratedImagePath(params: {
|
||||
if (match) {
|
||||
return match;
|
||||
}
|
||||
await new Promise((resolve) => setTimeout(resolve, 250));
|
||||
await new Promise((resolve) => {
|
||||
setTimeout(resolve, 250);
|
||||
});
|
||||
}
|
||||
throw new Error(`timed out after ${params.timeoutMs}ms`);
|
||||
}
|
||||
|
||||
@@ -255,7 +255,9 @@ async function waitForMemorySearchMatch(params: {
|
||||
if (haystack.includes(params.expectedNeedle)) {
|
||||
return result;
|
||||
}
|
||||
await new Promise((resolve) => setTimeout(resolve, 500));
|
||||
await new Promise((resolve) => {
|
||||
setTimeout(resolve, 500);
|
||||
});
|
||||
}
|
||||
throw new Error(`memory index missing expected fact after reindex: ${params.expectedNeedle}`);
|
||||
}
|
||||
|
||||
@@ -280,7 +280,9 @@ export function startMatrixQaOpenClawCli(params: {
|
||||
},
|
||||
writeStdin: async (text) => {
|
||||
if (!child.stdin.write(text)) {
|
||||
await new Promise<void>((resolve) => child.stdin.once("drain", resolve));
|
||||
await new Promise<void>((resolve) => {
|
||||
child.stdin.once("drain", resolve);
|
||||
});
|
||||
}
|
||||
},
|
||||
kill: () => {
|
||||
|
||||
@@ -641,5 +641,7 @@ async function runWithConcurrency(
|
||||
}
|
||||
|
||||
function sleep(ms: number): Promise<void> {
|
||||
return new Promise((resolve) => setTimeout(resolve, ms));
|
||||
return new Promise((resolve) => {
|
||||
setTimeout(resolve, ms);
|
||||
});
|
||||
}
|
||||
|
||||
@@ -147,7 +147,9 @@ async function persistentRetryLoop<T>(
|
||||
}
|
||||
|
||||
function sleep(ms: number): Promise<void> {
|
||||
return new Promise((resolve) => setTimeout(resolve, ms));
|
||||
return new Promise((resolve) => {
|
||||
setTimeout(resolve, ms);
|
||||
});
|
||||
}
|
||||
|
||||
// ============ Pre-built Retry Policies ============
|
||||
|
||||
@@ -188,7 +188,9 @@ describe("dispatchOutbound", () => {
|
||||
try {
|
||||
const runtime = makeRuntime({
|
||||
onDeliver: async (deliver) => {
|
||||
await new Promise<void>((resolve) => setTimeout(resolve, 301_000));
|
||||
await new Promise<void>((resolve) => {
|
||||
setTimeout(resolve, 301_000);
|
||||
});
|
||||
await deliver({ text: "late answer" }, { kind: "block" });
|
||||
},
|
||||
});
|
||||
|
||||
@@ -161,12 +161,12 @@ export async function dispatchOutbound(
|
||||
}
|
||||
return r;
|
||||
}),
|
||||
new Promise<OutboundResult>((resolve) =>
|
||||
new Promise<OutboundResult>((resolve) => {
|
||||
setTimeout(() => {
|
||||
ac.abort();
|
||||
resolve({ channel: "qqbot", error: "timeout" });
|
||||
}, TOOL_MEDIA_SEND_TIMEOUT),
|
||||
),
|
||||
}, TOOL_MEDIA_SEND_TIMEOUT);
|
||||
}),
|
||||
]);
|
||||
if (result.error) {
|
||||
log?.error(`Tool fallback error: ${result.error}`);
|
||||
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user