aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorGravatar Jarred Sumner <709451+Jarred-Sumner@users.noreply.github.com> 2022-12-04 08:11:44 -0800
committerGravatar Jarred Sumner <709451+Jarred-Sumner@users.noreply.github.com> 2022-12-04 08:11:44 -0800
commitbb5450fad0b45c42433c83c2af3a20876c3d4ead (patch)
treee45dbf001770a7c5d0c2396da72dd3dad8f52e85
parent5bb8c42bdbdda11f816c180d69afb8e89bf407bd (diff)
downloadbun-bb5450fad0b45c42433c83c2af3a20876c3d4ead.tar.gz
bun-bb5450fad0b45c42433c83c2af3a20876c3d4ead.tar.zst
bun-bb5450fad0b45c42433c83c2af3a20876c3d4ead.zip
[breaking] `onExit` callback in Bun.spawn sets the first property to be the Subprocess object
Sometimes Bun.spawn calls the onExit callback before the Bun.spawn() callback is called. Instead of delaying a tick, we set the `Subprocess` to be the first argument to the `onExit` callback now.
-rw-r--r--packages/bun-types/bun.d.ts33
-rw-r--r--src/bun.js/api/bun/subprocess.zig12
2 files changed, 40 insertions, 5 deletions
diff --git a/packages/bun-types/bun.d.ts b/packages/bun-types/bun.d.ts
index ccdcf2c2c..c9ea2fb66 100644
--- a/packages/bun-types/bun.d.ts
+++ b/packages/bun-types/bun.d.ts
@@ -1,3 +1,5 @@
+import { SignalConstants } from "os";
+
interface VoidFunction {
(): void;
}
@@ -2617,13 +2619,21 @@ declare module "bun" {
* ```ts
* const subprocess = spawn({
* cmd: ["echo", "hello"],
- * onExit: (code) => {
+ * onExit: (subprocess, code) => {
* console.log(`Process exited with code ${code}`);
* },
* });
* ```
*/
- onExit?: (exitCode: number) => void | Promise<void>;
+ onExit?(
+ subprocess: Subprocess,
+ exitCode: number | null,
+ signalCode: number | null,
+ /**
+ * If an error occured in the call to waitpid2, this will be the error.
+ */
+ error?: Errorlike,
+ ): void | Promise<void>;
}
}
@@ -2661,6 +2671,25 @@ declare module "bun" {
readonly exited: Promise<number>;
/**
+ * Synchronously get the exit code of the process
+ *
+ * If the process hasn't exited yet, this will return `null`
+ */
+ readonly exitCode: number | null;
+
+ /**
+ * Synchronously get the signal code of the process
+ *
+ * If the process never sent a signal code, this will return `null`
+ *
+ * To receive signal code changes, use the `onExit` callback.
+ *
+ * If the signal code is unknown, it will return the original signal code
+ * number, but that case should essentially never happen.
+ */
+ readonly signalCode: Signals | null;
+
+ /**
* Has the process exited?
*/
readonly killed: boolean;
diff --git a/src/bun.js/api/bun/subprocess.zig b/src/bun.js/api/bun/subprocess.zig
index fe09746eb..53f0da03e 100644
--- a/src/bun.js/api/bun/subprocess.zig
+++ b/src/bun.js/api/bun/subprocess.zig
@@ -1571,14 +1571,20 @@ pub const Subprocess = struct {
else
JSC.JSValue.jsUndefined();
+ const this_value = if (this_jsvalue.isEmptyOrUndefinedOrNull()) JSC.JSValue.jsUndefined() else this_jsvalue;
+ this_value.ensureStillAlive();
+
const args = [_]JSValue{
- exit_value,
+ this_value,
+ this.getExitCode(globalThis),
+ this.getSignalCode(globalThis),
waitpid_value,
};
- const result = callback.call(
+ const result = callback.callWithThis(
globalThis,
- args[0 .. @as(usize, @boolToInt(this.exit_code != null)) + @as(usize, @boolToInt(this.waitpid_err != null))],
+ this_value,
+ &args,
);
if (result.isAnyError(globalThis)) {