Skip to content

Commit 87d7f76

Browse files
committed
refactor: use Promise.withResolvers() (Node 22+)
Replace new Promise((resolve, reject) => { ... }) with the cleaner Promise.withResolvers() pattern in background-task-queue.ts (2 sites) and sh.ts (1 site).
1 parent 5916d39 commit 87d7f76

2 files changed

Lines changed: 61 additions & 58 deletions

File tree

utils/background-task-queue.ts

Lines changed: 31 additions & 31 deletions
Original file line numberDiff line numberDiff line change
@@ -186,28 +186,28 @@ export class BackgroundTaskQueue<M extends TaskModule> {
186186
this.worker.stderr.pipe(split2()).on("data", log.onstderr);
187187

188188
try {
189-
return await new Promise<RetType>((resolve, reject) => {
190-
const listener = (response: Response) => {
191-
if (response.id === id) {
192-
this.lock.release();
193-
this.worker.removeListener("message", listener);
194-
195-
const { type, result } = response;
196-
197-
log.setResult(type, result);
198-
this.worker.stdout.off("data", log.onstdout);
199-
this.worker.stderr.off("data", log.onstderr);
200-
log.markTime("finish");
201-
202-
if (type === "success") {
203-
resolve(result as RetType);
204-
} else {
205-
reject(deserializeError(result));
206-
}
189+
const { promise, resolve, reject } = Promise.withResolvers<RetType>();
190+
const listener = (response: Response) => {
191+
if (response.id === id) {
192+
this.lock.release();
193+
this.worker.removeListener("message", listener);
194+
195+
const { type, result } = response;
196+
197+
log.setResult(type, result);
198+
this.worker.stdout.off("data", log.onstdout);
199+
this.worker.stderr.off("data", log.onstderr);
200+
log.markTime("finish");
201+
202+
if (type === "success") {
203+
resolve(result as RetType);
204+
} else {
205+
reject(deserializeError(result));
207206
}
208-
};
209-
this.worker.addListener("message", listener);
210-
});
207+
}
208+
};
209+
this.worker.addListener("message", listener);
210+
return await promise;
211211
} finally {
212212
await log.write();
213213
}
@@ -224,19 +224,19 @@ export class BackgroundTaskQueue<M extends TaskModule> {
224224
const msg: OperationRequest = { id, type: "init", modulePath };
225225
this.worker.postMessage(msg);
226226

227-
await new Promise<void>((resolve, reject) => {
228-
this.worker.once("message", (response: Response) => {
229-
if (response.id !== id) {
230-
reject(new Error(`Failed to register worker module: ${modulePath}`));
227+
const { promise, resolve, reject } = Promise.withResolvers<void>();
228+
this.worker.once("message", (response: Response) => {
229+
if (response.id !== id) {
230+
reject(new Error(`Failed to register worker module: ${modulePath}`));
231+
} else {
232+
if (response.type === "success") {
233+
resolve();
231234
} else {
232-
if (response.type === "success") {
233-
resolve();
234-
} else {
235-
reject(deserializeError(response.result));
236-
}
235+
reject(deserializeError(response.result));
237236
}
238-
});
237+
}
239238
});
239+
await promise;
240240
}
241241

242242
private generateId() {

utils/sh.ts

Lines changed: 30 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -31,34 +31,37 @@ export default async function sh(
3131
}
3232

3333
try {
34-
return await new Promise<string>((resolve, reject) => {
35-
let stdout: string[] = [];
36-
let stderr: string[] = [];
37-
const child = exec(command, {
38-
...execOptions,
39-
env: { ...process.env, ...execOptions.env },
40-
encoding: "utf-8",
41-
});
42-
child.stdout!.pipe(split()).on("data", (line: string) => {
43-
if (shouldStream) log.out(line);
44-
stdout.push(line);
45-
});
46-
child.stderr!.pipe(split()).on("data", (line: string) => {
47-
if (shouldStream) log.err(line);
48-
stderr.push(line);
49-
});
50-
child.on("exit", code => {
51-
if (output === "buffer") {
52-
if (stdout.length) log.out(stdout.join("\n"));
53-
if (stderr.length) log.err(stderr.join("\n"));
54-
}
55-
if (code === 0) {
56-
resolve(stdout.join("\n"));
57-
} else {
58-
reject({ command, stdout, stderr, code });
59-
}
60-
});
34+
const { promise, resolve, reject } = Promise.withResolvers<string>();
35+
let stdout: string[] = [];
36+
let stderr: string[] = [];
37+
const child = exec(command, {
38+
...execOptions,
39+
env: { ...process.env, ...execOptions.env },
40+
encoding: "utf-8",
6141
});
42+
child.stdout!.pipe(split()).on("data", (line: string) => {
43+
if (shouldStream) log.out(line);
44+
stdout.push(line);
45+
});
46+
child.stderr!.pipe(split()).on("data", (line: string) => {
47+
if (shouldStream) log.err(line);
48+
stderr.push(line);
49+
});
50+
child.on("error", err => {
51+
reject({ command, stdout, stderr, code: null, error: err });
52+
});
53+
child.on("close", code => {
54+
if (output === "buffer") {
55+
if (stdout.length) log.out(stdout.join("\n"));
56+
if (stderr.length) log.err(stderr.join("\n"));
57+
}
58+
if (code === 0) {
59+
resolve(stdout.join("\n"));
60+
} else {
61+
reject({ command, stdout, stderr, code });
62+
}
63+
});
64+
return await promise;
6265
} finally {
6366
if (output !== "silent") {
6467
console.groupEnd();

0 commit comments

Comments
 (0)