diff options
Diffstat (limited to 'cli')
-rw-r--r-- | cli/diagnostics.rs | 3 | ||||
-rw-r--r-- | cli/dts/lib.deno.ns.d.ts | 5 | ||||
-rw-r--r-- | cli/dts/lib.deno.unstable.d.ts | 174 | ||||
-rw-r--r-- | cli/tests/testdata/raw_mode_cbreak.ts | 2 | ||||
-rw-r--r-- | cli/tests/unit/process_test.ts | 32 | ||||
-rw-r--r-- | cli/tests/unit/signal_test.ts | 58 |
6 files changed, 89 insertions, 185 deletions
diff --git a/cli/diagnostics.rs b/cli/diagnostics.rs index 01c096a11..203ae2e84 100644 --- a/cli/diagnostics.rs +++ b/cli/diagnostics.rs @@ -25,17 +25,14 @@ const UNSTABLE_DENO_PROPS: &[&str] = &[ "EmitOptions", "EmitResult", "HttpClient", - "LinuxSignal", "Location", "MXRecord", - "MacOSSignal", "Metrics", "OpMetrics", "RecordType", "ResolveDnsOptions", "SRVRecord", "SetRawOptions", - "Signal", "SignalStream", "StartTlsOptions", "SystemMemoryInfo", diff --git a/cli/dts/lib.deno.ns.d.ts b/cli/dts/lib.deno.ns.d.ts index 6a5b73112..b8126f4cf 100644 --- a/cli/dts/lib.deno.ns.d.ts +++ b/cli/dts/lib.deno.ns.d.ts @@ -1982,13 +1982,12 @@ declare namespace Deno { stderrOutput(): Promise<Uint8Array>; close(): void; - /** **UNSTABLE**: The `signo` argument may change to require the Deno.Signal - * enum. + /** **UNSTABLE** * * Send a signal to process. This functionality currently only works on * Linux and Mac OS. */ - kill(signo: number): void; + kill(signo: string): void; // TODO(ry): Use Signal type here once made stable. } export type ProcessStatus = diff --git a/cli/dts/lib.deno.unstable.d.ts b/cli/dts/lib.deno.unstable.d.ts index d991196cb..82ab9f5a1 100644 --- a/cli/dts/lib.deno.unstable.d.ts +++ b/cli/dts/lib.deno.unstable.d.ts @@ -562,77 +562,40 @@ declare namespace Deno { */ export function applySourceMap(location: Location): Location; - enum LinuxSignal { - SIGHUP = 1, - SIGINT = 2, - SIGQUIT = 3, - SIGILL = 4, - SIGTRAP = 5, - SIGABRT = 6, - SIGBUS = 7, - SIGFPE = 8, - SIGKILL = 9, - SIGUSR1 = 10, - SIGSEGV = 11, - SIGUSR2 = 12, - SIGPIPE = 13, - SIGALRM = 14, - SIGTERM = 15, - SIGSTKFLT = 16, - SIGCHLD = 17, - SIGCONT = 18, - SIGSTOP = 19, - SIGTSTP = 20, - SIGTTIN = 21, - SIGTTOU = 22, - SIGURG = 23, - SIGXCPU = 24, - SIGXFSZ = 25, - SIGVTALRM = 26, - SIGPROF = 27, - SIGWINCH = 28, - SIGIO = 29, - SIGPWR = 30, - SIGSYS = 31, - } - enum MacOSSignal { - SIGHUP = 1, - SIGINT = 2, - SIGQUIT = 3, - SIGILL = 4, - SIGTRAP = 5, - SIGABRT = 6, - SIGEMT = 7, - SIGFPE = 8, - SIGKILL = 9, - SIGBUS = 10, - SIGSEGV = 11, - SIGSYS = 12, - SIGPIPE = 13, - SIGALRM = 14, - SIGTERM = 15, - SIGURG = 16, - SIGSTOP = 17, - SIGTSTP = 18, - SIGCONT = 19, - SIGCHLD = 20, - SIGTTIN = 21, - SIGTTOU = 22, - SIGIO = 23, - SIGXCPU = 24, - SIGXFSZ = 25, - SIGVTALRM = 26, - SIGPROF = 27, - SIGWINCH = 28, - SIGINFO = 29, - SIGUSR1 = 30, - SIGUSR2 = 31, - } - - /** **UNSTABLE**: Further changes required to make platform independent. - * - * Signals numbers. This is platform dependent. */ - export const Signal: typeof MacOSSignal | typeof LinuxSignal; + export type Signal = + | "SIGABRT" + | "SIGALRM" + | "SIGBUS" + | "SIGCHLD" + | "SIGCONT" + | "SIGEMT" + | "SIGFPE" + | "SIGHUP" + | "SIGILL" + | "SIGINFO" + | "SIGINT" + | "SIGIO" + | "SIGKILL" + | "SIGPIPE" + | "SIGPROF" + | "SIGPWR" + | "SIGQUIT" + | "SIGSEGV" + | "SIGSTKFLT" + | "SIGSTOP" + | "SIGSYS" + | "SIGTERM" + | "SIGTRAP" + | "SIGTSTP" + | "SIGTTIN" + | "SIGTTOU" + | "SIGURG" + | "SIGUSR1" + | "SIGUSR2" + | "SIGVTALRM" + | "SIGWINCH" + | "SIGXCPU" + | "SIGXFSZ"; /** **UNSTABLE**: new API, yet to be vetted. * @@ -640,7 +603,7 @@ declare namespace Deno { * `PromiseLike`. */ export class SignalStream implements AsyncIterableIterator<void>, PromiseLike<void> { - constructor(signal: typeof Deno.Signal); + constructor(signal: Signal); then<T, S>( f: (v: void) => T | Promise<T>, g?: (v: void) => S | Promise<S>, @@ -656,7 +619,7 @@ declare namespace Deno { * iterator. * * ```ts - * for await (const _ of Deno.signal(Deno.Signal.SIGTERM)) { + * for await (const _ of Deno.signal("SIGTERM")) { * console.log("got SIGTERM!"); * } * ``` @@ -665,7 +628,7 @@ declare namespace Deno { * first one. * * ```ts - * await Deno.signal(Deno.Signal.SIGTERM); + * await Deno.signal("SIGTERM"); * console.log("SIGTERM received!") * ``` * @@ -673,7 +636,7 @@ declare namespace Deno { * of the signal stream object. * * ```ts - * const sig = Deno.signal(Deno.Signal.SIGTERM); + * const sig = Deno.signal("SIGTERM"); * setTimeout(() => { sig.dispose(); }, 5000); * for await (const _ of sig) { * console.log("SIGTERM!") @@ -685,55 +648,7 @@ declare namespace Deno { * * NOTE: This functionality is not yet implemented on Windows. */ - export function signal(signo: number): SignalStream; - - /** **UNSTABLE**: new API, yet to be vetted. */ - export const signals: { - /** Returns the stream of SIGALRM signals. - * - * This method is the shorthand for `Deno.signal(Deno.Signal.SIGALRM)`. */ - alarm: () => SignalStream; - /** Returns the stream of SIGCHLD signals. - * - * This method is the shorthand for `Deno.signal(Deno.Signal.SIGCHLD)`. */ - child: () => SignalStream; - /** Returns the stream of SIGHUP signals. - * - * This method is the shorthand for `Deno.signal(Deno.Signal.SIGHUP)`. */ - hungup: () => SignalStream; - /** Returns the stream of SIGINT signals. - * - * This method is the shorthand for `Deno.signal(Deno.Signal.SIGINT)`. */ - interrupt: () => SignalStream; - /** Returns the stream of SIGIO signals. - * - * This method is the shorthand for `Deno.signal(Deno.Signal.SIGIO)`. */ - io: () => SignalStream; - /** Returns the stream of SIGPIPE signals. - * - * This method is the shorthand for `Deno.signal(Deno.Signal.SIGPIPE)`. */ - pipe: () => SignalStream; - /** Returns the stream of SIGQUIT signals. - * - * This method is the shorthand for `Deno.signal(Deno.Signal.SIGQUIT)`. */ - quit: () => SignalStream; - /** Returns the stream of SIGTERM signals. - * - * This method is the shorthand for `Deno.signal(Deno.Signal.SIGTERM)`. */ - terminate: () => SignalStream; - /** Returns the stream of SIGUSR1 signals. - * - * This method is the shorthand for `Deno.signal(Deno.Signal.SIGUSR1)`. */ - userDefined1: () => SignalStream; - /** Returns the stream of SIGUSR2 signals. - * - * This method is the shorthand for `Deno.signal(Deno.Signal.SIGUSR2)`. */ - userDefined2: () => SignalStream; - /** Returns the stream of SIGWINCH signals. - * - * This method is the shorthand for `Deno.signal(Deno.Signal.SIGWINCH)`. */ - windowChange: () => SignalStream; - }; + export function signal(sig: Signal): SignalStream; export type SetRawOptions = { cbreak: boolean; @@ -803,11 +718,8 @@ declare namespace Deno { }, >(opt: T): Process<T>; - /** **UNSTABLE**: The `signo` argument may change to require the Deno.Signal - * enum. - * - * Send a signal to process under given `pid`. This functionality currently - * only works on Linux and Mac OS. + /** **UNSTABLE**: Send a signal to process under given `pid`. This + * functionality only works on Linux and Mac OS. * * If `pid` is negative, the signal will be sent to the process group * identified by `pid`. @@ -816,10 +728,10 @@ declare namespace Deno { * cmd: ["sleep", "10000"] * }); * - * Deno.kill(p.pid, Deno.Signal.SIGINT); + * Deno.kill(p.pid, "SIGINT"); * * Requires `allow-run` permission. */ - export function kill(pid: number, signo: number): void; + export function kill(pid: number, signo: Signal): void; /** **UNSTABLE**: New API, yet to be vetted. Additional consideration is still * necessary around the permissions required. diff --git a/cli/tests/testdata/raw_mode_cbreak.ts b/cli/tests/testdata/raw_mode_cbreak.ts index b1c6d324b..c66c36f0d 100644 --- a/cli/tests/testdata/raw_mode_cbreak.ts +++ b/cli/tests/testdata/raw_mode_cbreak.ts @@ -1,7 +1,7 @@ Deno.setRaw(0, true); Deno.setRaw(0, true, { cbreak: true }); // Can be called multiple times -const signal = Deno.signals.interrupt(); +const signal = Deno.signal("SIGINT"); Deno.stdout.writeSync(new TextEncoder().encode("S")); diff --git a/cli/tests/unit/process_test.ts b/cli/tests/unit/process_test.ts index 2d0a15b16..73df3fa91 100644 --- a/cli/tests/unit/process_test.ts +++ b/cli/tests/unit/process_test.ts @@ -120,7 +120,12 @@ unitTest( }, async function runCommandFailedWithSignal() { const p = Deno.run({ - cmd: [Deno.execPath(), "eval", "--unstable", "Deno.kill(Deno.pid, 9)"], + cmd: [ + Deno.execPath(), + "eval", + "--unstable", + "Deno.kill(Deno.pid, 'SIGKILL')", + ], }); const status = await p.status(); assertEquals(status.success, false); @@ -436,7 +441,7 @@ unitTest( let error = null; try { - p.kill(Deno.Signal.SIGTERM); + p.kill("SIGTERM"); } catch (e) { error = e; } @@ -454,21 +459,13 @@ unitTest( }, ); -unitTest(function signalNumbers() { - if (Deno.build.os === "darwin") { - assertEquals(Deno.Signal.SIGSTOP, 17); - } else if (Deno.build.os === "linux") { - assertEquals(Deno.Signal.SIGSTOP, 19); - } -}); - unitTest(function killPermissions() { assertThrows(() => { // Unlike the other test cases, we don't have permission to spawn a // subprocess we can safely kill. Instead we send SIGCONT to the current // process - assuming that Deno does not have a special handler set for it // and will just continue even if a signal is erroneously sent. - Deno.kill(Deno.pid, Deno.Signal.SIGCONT); + Deno.kill(Deno.pid, "SIGCONT"); }, Deno.errors.PermissionDenied); }); @@ -479,19 +476,17 @@ unitTest( cmd: [Deno.execPath(), "eval", "setTimeout(() => {}, 10000)"], }); - assertEquals(Deno.Signal.SIGINT, 2); - Deno.kill(p.pid, Deno.Signal.SIGINT); + Deno.kill(p.pid, "SIGINT"); const status = await p.status(); assertEquals(status.success, false); try { - assertEquals(status.code, 128 + Deno.Signal.SIGINT); - assertEquals(status.signal, Deno.Signal.SIGINT); + assertEquals(status.signal, "SIGINT"); } catch { // TODO(nayeemrmn): On Windows sometimes the following values are given // instead. Investigate and remove this catch when fixed. - assertEquals(status.code, 1); - assertEquals(status.signal, undefined); + assertEquals(status.code, 130); + assertEquals(status.signal, 2); } p.close(); }, @@ -505,7 +500,8 @@ unitTest({ perms: { run: true, read: true } }, function killFailed() { assert(!p.stdout); assertThrows(() => { - Deno.kill(p.pid, 12345); + // @ts-expect-error testing runtime error of bad signal + Deno.kill(p.pid, "foobar"); }, TypeError); p.close(); diff --git a/cli/tests/unit/signal_test.ts b/cli/tests/unit/signal_test.ts index d0cd40950..9afa737ee 100644 --- a/cli/tests/unit/signal_test.ts +++ b/cli/tests/unit/signal_test.ts @@ -13,84 +13,84 @@ unitTest( function signalsNotImplemented() { assertThrows( () => { - Deno.signal(1); + Deno.signal("SIGINT"); }, Error, "not implemented", ); assertThrows( () => { - Deno.signals.alarm(); // for SIGALRM + Deno.signal("SIGALRM"); }, Error, "not implemented", ); assertThrows( () => { - Deno.signals.child(); // for SIGCHLD + Deno.signal("SIGCHLD"); }, Error, "not implemented", ); assertThrows( () => { - Deno.signals.hungup(); // for SIGHUP + Deno.signal("SIGHUP"); }, Error, "not implemented", ); assertThrows( () => { - Deno.signals.interrupt(); // for SIGINT + Deno.signal("SIGINT"); }, Error, "not implemented", ); assertThrows( () => { - Deno.signals.io(); // for SIGIO + Deno.signal("SIGIO"); }, Error, "not implemented", ); assertThrows( () => { - Deno.signals.pipe(); // for SIGPIPE + Deno.signal("SIGPIPE"); }, Error, "not implemented", ); assertThrows( () => { - Deno.signals.quit(); // for SIGQUIT + Deno.signal("SIGQUIT"); }, Error, "not implemented", ); assertThrows( () => { - Deno.signals.terminate(); // for SIGTERM + Deno.signal("SIGTERM"); }, Error, "not implemented", ); assertThrows( () => { - Deno.signals.userDefined1(); // for SIGUSR1 + Deno.signal("SIGUSR1"); }, Error, "not implemented", ); assertThrows( () => { - Deno.signals.userDefined2(); // for SIGURS2 + Deno.signal("SIGUSR2"); }, Error, "not implemented", ); assertThrows( () => { - Deno.signals.windowChange(); // for SIGWINCH + Deno.signal("SIGWINCH"); }, Error, "not implemented", @@ -106,12 +106,12 @@ unitTest( const t = setInterval(() => {}, 1000); let c = 0; - const sig = Deno.signal(Deno.Signal.SIGUSR1); + const sig = Deno.signal("SIGUSR1"); setTimeout(async () => { await delay(20); for (const _ of Array(3)) { // Sends SIGUSR1 3 times. - Deno.kill(Deno.pid, Deno.Signal.SIGUSR1); + Deno.kill(Deno.pid, "SIGUSR1"); await delay(20); } sig.dispose(); @@ -138,7 +138,7 @@ unitTest( Deno.execPath(), "eval", "--unstable", - "(async () => { for await (const _ of Deno.signals.io()) {} })()", + "(async () => { for await (const _ of Deno.signal('SIGIO')) {} })()", ], }); const res = await p.status(); @@ -154,9 +154,9 @@ unitTest( // This prevents the program from exiting. const t = setInterval(() => {}, 1000); - const sig = Deno.signal(Deno.Signal.SIGUSR1); + const sig = Deno.signal("SIGUSR1"); setTimeout(() => { - Deno.kill(Deno.pid, Deno.Signal.SIGUSR1); + Deno.kill(Deno.pid, "SIGUSR1"); resolvable.resolve(); }, 20); await sig; @@ -176,7 +176,7 @@ unitTest( const t = setInterval(() => {}, 1000); let called = false; - const sig = Deno.signal(Deno.Signal.SIGUSR1); + const sig = Deno.signal("SIGUSR1"); sig.then(() => { called = true; }); @@ -200,37 +200,37 @@ unitTest( { ignore: Deno.build.os === "windows", perms: { run: true } }, function signalShorthandsTest() { let s: Deno.SignalStream; - s = Deno.signals.alarm(); // for SIGALRM + s = Deno.signal("SIGALRM"); assert(s instanceof Deno.SignalStream); s.dispose(); - s = Deno.signals.child(); // for SIGCHLD + s = Deno.signal("SIGCHLD"); assert(s instanceof Deno.SignalStream); s.dispose(); - s = Deno.signals.hungup(); // for SIGHUP + s = Deno.signal("SIGHUP"); assert(s instanceof Deno.SignalStream); s.dispose(); - s = Deno.signals.interrupt(); // for SIGINT + s = Deno.signal("SIGINT"); assert(s instanceof Deno.SignalStream); s.dispose(); - s = Deno.signals.io(); // for SIGIO + s = Deno.signal("SIGIO"); assert(s instanceof Deno.SignalStream); s.dispose(); - s = Deno.signals.pipe(); // for SIGPIPE + s = Deno.signal("SIGPIPE"); assert(s instanceof Deno.SignalStream); s.dispose(); - s = Deno.signals.quit(); // for SIGQUIT + s = Deno.signal("SIGQUIT"); assert(s instanceof Deno.SignalStream); s.dispose(); - s = Deno.signals.terminate(); // for SIGTERM + s = Deno.signal("SIGTERM"); assert(s instanceof Deno.SignalStream); s.dispose(); - s = Deno.signals.userDefined1(); // for SIGUSR1 + s = Deno.signal("SIGUSR1"); assert(s instanceof Deno.SignalStream); s.dispose(); - s = Deno.signals.userDefined2(); // for SIGURS2 + s = Deno.signal("SIGUSR2"); assert(s instanceof Deno.SignalStream); s.dispose(); - s = Deno.signals.windowChange(); // for SIGWINCH + s = Deno.signal("SIGWINCH"); assert(s instanceof Deno.SignalStream); s.dispose(); }, |