diff options
| author | Sam Wilkins <samwilkins333@gmail.com> | 2020-01-01 21:32:30 -0800 |
|---|---|---|
| committer | Sam Wilkins <samwilkins333@gmail.com> | 2020-01-01 21:32:30 -0800 |
| commit | 7d9dc9e647542b0a2fdb9a98cb02e3c9ffc5ff12 (patch) | |
| tree | db64744cc3a330de2d89957e48936003777df2d7 /src/server/session_manager | |
| parent | 6a3167f80e5801763a88add8b3a8cfce2ac7b467 (diff) | |
session manager improvements
Diffstat (limited to 'src/server/session_manager')
| -rw-r--r-- | src/server/session_manager/crash_email.ts | 36 | ||||
| -rw-r--r-- | src/server/session_manager/input_manager.ts | 16 | ||||
| -rw-r--r-- | src/server/session_manager/session_manager_cluster.ts | 11 |
3 files changed, 55 insertions, 8 deletions
diff --git a/src/server/session_manager/crash_email.ts b/src/server/session_manager/crash_email.ts new file mode 100644 index 000000000..7783cd779 --- /dev/null +++ b/src/server/session_manager/crash_email.ts @@ -0,0 +1,36 @@ +import * as nodemailer from "nodemailer"; +import { MailOptions } from "nodemailer/lib/json-transport"; + +export namespace CrashEmail { + + export async function dispatch(error: Error, recipients: string[]): Promise<boolean[]> { + const smtpTransport = nodemailer.createTransport({ + service: 'Gmail', + auth: { + user: 'brownptcdash@gmail.com', + pass: 'browngfx1' + } + }); + return Promise.all(recipients.map(recipient => new Promise<boolean>(resolve => { + const mailOptions = { + to: recipient, + from: 'brownptcdash@gmail.com', + subject: 'Dash Server Crash', + text: emailText(recipient, error) + } as MailOptions; + smtpTransport.sendMail(mailOptions, (dispatchError: Error | null) => resolve(dispatchError === null)); + }))); + } + + function emailText(recipient: string, { name, message, stack }: Error) { + return [ + `Hey ${recipient.split("@")[0]},`, + "You, as a Dash Administrator, are being notified of a server crash event. Here's what we know:", + `name:\n${name}`, + `message:\n${message}`, + `stack:\n${stack}`, + "The server is already restarting itself, but if you're concerned, use the Remote Desktop Connection to monitor progress." + ].join("\n\n"); + } + +}
\ No newline at end of file diff --git a/src/server/session_manager/input_manager.ts b/src/server/session_manager/input_manager.ts index a95e6baae..133b7144a 100644 --- a/src/server/session_manager/input_manager.ts +++ b/src/server/session_manager/input_manager.ts @@ -7,9 +7,10 @@ export interface Configuration { isCaseSensitive?: boolean; } +type Action = (parsedArgs: IterableIterator<string>) => any | Promise<any>; export interface Registration { - argPattern: RegExp[]; - action: (parsedArgs: IterableIterator<string>) => any | Promise<any>; + argPatterns: RegExp[]; + action: Action; } export default class InputManager { @@ -42,9 +43,10 @@ export default class InputManager { return `${this.identifier} commands: { ${members.sort().join(", ")} }`; } - public registerCommand = (basename: string, argPattern: RegExp[], action: any | Promise<any>) => { + public registerCommand = (basename: string, argPatterns: (RegExp | string)[], action: Action) => { const existing = this.commandMap.get(basename); - const registration = { argPattern, action }; + const converted = argPatterns.map(input => input instanceof RegExp ? input : new RegExp(input)); + const registration = { argPatterns: converted, action }; if (existing) { existing.push(registration); } else { @@ -74,14 +76,14 @@ export default class InputManager { const registered = this.commandMap.get(command); if (registered) { const { length } = args; - const candidates = registered.filter(({ argPattern: { length: count } }) => count === length); - for (const { argPattern, action } of candidates) { + const candidates = registered.filter(({ argPatterns: { length: count } }) => count === length); + for (const { argPatterns, action } of candidates) { const parsed: string[] = []; let matched = false; if (length) { for (let i = 0; i < length; i++) { let matches: RegExpExecArray | null; - if ((matches = argPattern[i].exec(args[i])) === null) { + if ((matches = argPatterns[i].exec(args[i])) === null) { break; } parsed.push(matches[0]); diff --git a/src/server/session_manager/session_manager_cluster.ts b/src/server/session_manager/session_manager_cluster.ts index bfe6187c3..546465c03 100644 --- a/src/server/session_manager/session_manager_cluster.ts +++ b/src/server/session_manager/session_manager_cluster.ts @@ -4,19 +4,28 @@ import { createServer } from "http"; const capacity = cpus().length; +let thrown = false; + if (isMaster) { console.log(capacity); for (let i = 0; i < capacity; i++) { fork(); } on("exit", (worker, code, signal) => { - console.log(`worker ${worker.process.pid} died`); + console.log(`worker ${worker.process.pid} died with code ${code} and signal ${signal}`); + fork(); }); } else { const port = 1234; createServer().listen(port, () => { console.log('process id local', process.pid); console.log(`http server started at port ${port}`); + if (!thrown) { + thrown = true; + setTimeout(() => { + throw new Error("Hey I'm a fake error!"); + }, 1000); + } }); } |
