summaryrefslogtreecommitdiff
path: root/std/signal
diff options
context:
space:
mode:
authorYoshiya Hinosawa <stibium121@gmail.com>2020-02-07 15:53:15 +0900
committerGitHub <noreply@github.com>2020-02-07 01:53:15 -0500
commit5a8ba3b114bbacf10f03abc0335a753585861c97 (patch)
tree8bd6d55736fd08d958ed81f447fcf87b33a76d32 /std/signal
parentd9c84eb91eecdf1225091e4d2bea8e4c6a076504 (diff)
feat: add std/signal/mod.ts (#3913)
Diffstat (limited to 'std/signal')
-rw-r--r--std/signal/mod.ts28
-rw-r--r--std/signal/test.ts53
2 files changed, 81 insertions, 0 deletions
diff --git a/std/signal/mod.ts b/std/signal/mod.ts
new file mode 100644
index 000000000..e368edbd1
--- /dev/null
+++ b/std/signal/mod.ts
@@ -0,0 +1,28 @@
+import { MuxAsyncIterator } from "../util/async.ts";
+
+export function signal(
+ ...signos: [number, ...number[]]
+): AsyncIterable<void> & { dispose: () => void } {
+ const mux = new MuxAsyncIterator<void>();
+
+ if (signos.length < 1) {
+ throw new Error(
+ "No signals are given. You need to specify at least one signal to create a signal stream."
+ );
+ }
+
+ const streams = signos.map(Deno.signal);
+
+ streams.forEach(stream => {
+ mux.add(stream);
+ });
+
+ // Create dispose method for the muxer of signal streams.
+ const dispose = (): void => {
+ streams.forEach(stream => {
+ stream.dispose();
+ });
+ };
+
+ return Object.assign(mux, { dispose });
+}
diff --git a/std/signal/test.ts b/std/signal/test.ts
new file mode 100644
index 000000000..cff9672e5
--- /dev/null
+++ b/std/signal/test.ts
@@ -0,0 +1,53 @@
+import { test, assertEquals, assertThrows } from "../testing/mod.ts";
+import { delay } from "../util/async.ts";
+import { signal } from "./mod.ts";
+
+if (Deno.build.os !== "win") {
+ test("signal() throws when called with empty signals", (): void => {
+ assertThrows(
+ () => {
+ // @ts-ignore
+ signal();
+ },
+ Error,
+ "No signals are given. You need to specify at least one signal to create a signal stream."
+ );
+ });
+
+ test("signal() iterates for multiple signals", async (): Promise<void> => {
+ // This prevents the program from exiting.
+ const t = setInterval(() => {}, 1000);
+
+ let c = 0;
+ const sig = signal(
+ Deno.Signal.SIGUSR1,
+ Deno.Signal.SIGUSR2,
+ Deno.Signal.SIGINT
+ );
+
+ setTimeout(async () => {
+ await delay(20);
+ Deno.kill(Deno.pid, Deno.Signal.SIGINT);
+ await delay(20);
+ Deno.kill(Deno.pid, Deno.Signal.SIGUSR2);
+ await delay(20);
+ Deno.kill(Deno.pid, Deno.Signal.SIGUSR1);
+ await delay(20);
+ Deno.kill(Deno.pid, Deno.Signal.SIGUSR2);
+ await delay(20);
+ Deno.kill(Deno.pid, Deno.Signal.SIGUSR1);
+ await delay(20);
+ Deno.kill(Deno.pid, Deno.Signal.SIGINT);
+ await delay(20);
+ sig.dispose();
+ });
+
+ for await (const _ of sig) {
+ c += 1;
+ }
+
+ assertEquals(c, 6);
+
+ clearTimeout(t);
+ });
+}