Pokemon_server / dist /lib /crashlogger.js.map
Jofthomas's picture
Jofthomas HF staff
Upload 4781 files
5c2ed06 verified
{
"version": 3,
"sources": ["../../lib/crashlogger.ts"],
"sourcesContent": ["/**\n * Crash logger\n * Pokemon Showdown - http://pokemonshowdown.com/\n *\n * Logs crashes, sends an e-mail notification if you've set up\n * config.js to do that.\n *\n * @license MIT\n */\n\nimport * as fs from 'fs';\nimport * as path from 'path';\n\nconst CRASH_EMAIL_THROTTLE = 5 * 60 * 1000; // 5 minutes\n\nconst logPath = path.resolve(\n\t// not sure why this is necessary, but in Windows testing it was\n\t__dirname, '../', __dirname.includes(`${path.sep}dist${path.sep}`) ? '..' : '',\n\tpath.join((global as any).Config?.logsdir || 'logs', 'errors.txt')\n);\nlet lastCrashLog = 0;\nlet transport: any;\n\n/**\n * Logs when a crash happens to console, then e-mails those who are configured\n * to receive them.\n */\nexport function crashlogger(\n\terror: unknown,\n\tdescription: string,\n\tdata: AnyObject | null = null,\n\temailConfig: AnyObject | null = null,\n): string | null {\n\tconst datenow = Date.now();\n\n\tlet stack = (typeof error === 'string' ? error : (error as Error)?.stack) || '';\n\tif (data) {\n\t\tstack += `\\n\\nAdditional information:\\n`;\n\t\tfor (const k in data) {\n\t\t\tstack += ` ${k} = ${data[k]}\\n`;\n\t\t}\n\t}\n\n\tconsole.error(`\\nCRASH: ${stack}\\n`);\n\tconst out = fs.createWriteStream(logPath, { flags: 'a' });\n\tout.on('open', () => {\n\t\tout.write(`\\n${stack}\\n`);\n\t\tout.end();\n\t}).on('error', (err: Error) => {\n\t\tconsole.error(`\\nSUBCRASH: ${err.stack}\\n`);\n\t});\n\n\tconst emailOpts = emailConfig || (global as any).Config?.crashguardemail;\n\tif (emailOpts && ((datenow - lastCrashLog) > CRASH_EMAIL_THROTTLE)) {\n\t\tlastCrashLog = datenow;\n\n\t\tif (!transport) {\n\t\t\ttry {\n\t\t\t\trequire.resolve('nodemailer');\n\t\t\t} catch {\n\t\t\t\tthrow new Error(\n\t\t\t\t\t'nodemailer is not installed, but it is required if Config.crashguardemail is configured! ' +\n\t\t\t\t\t'Run npm install --no-save nodemailer and restart the server.'\n\t\t\t\t);\n\t\t\t}\n\t\t}\n\n\t\tlet text = `${description} crashed `;\n\t\tif (transport) {\n\t\t\ttext += `again with this stack trace:\\n${stack}`;\n\t\t} else {\n\t\t\ttry {\n\t\t\t\ttransport = require('nodemailer').createTransport(emailOpts.options);\n\t\t\t} catch {\n\t\t\t\tthrow new Error(\"Failed to start nodemailer; are you sure you've configured Config.crashguardemail correctly?\");\n\t\t\t}\n\n\t\t\ttext += `with this stack trace:\\n${stack}`;\n\t\t}\n\n\t\ttransport.sendMail({\n\t\t\tfrom: emailOpts.from,\n\t\t\tto: emailOpts.to,\n\t\t\tsubject: emailOpts.subject,\n\t\t\ttext,\n\t\t}, (err: Error | null) => {\n\t\t\tif (err) console.error(`Error sending email: ${err}`);\n\t\t});\n\t}\n\n\treturn null;\n}\n"],
"mappings": ";;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAUA,SAAoB;AACpB,WAAsB;AAXtB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAaA,MAAM,uBAAuB,IAAI,KAAK;AAEtC,MAAM,UAAU,KAAK;AAAA;AAAA,EAEpB;AAAA,EAAW;AAAA,EAAO,UAAU,SAAS,GAAG,KAAK,UAAU,KAAK,KAAK,IAAI,OAAO;AAAA,EAC5E,KAAK,KAAM,OAAe,QAAQ,WAAW,QAAQ,YAAY;AAClE;AACA,IAAI,eAAe;AACnB,IAAI;AAMG,SAAS,YACf,OACA,aACA,OAAyB,MACzB,cAAgC,MAChB;AAChB,QAAM,UAAU,KAAK,IAAI;AAEzB,MAAI,SAAS,OAAO,UAAU,WAAW,QAAS,OAAiB,UAAU;AAC7E,MAAI,MAAM;AACT,aAAS;AAAA;AAAA;AAAA;AACT,eAAW,KAAK,MAAM;AACrB,eAAS,KAAK,OAAO,KAAK,CAAC;AAAA;AAAA,IAC5B;AAAA,EACD;AAEA,UAAQ,MAAM;AAAA,SAAY;AAAA,CAAS;AACnC,QAAM,MAAM,GAAG,kBAAkB,SAAS,EAAE,OAAO,IAAI,CAAC;AACxD,MAAI,GAAG,QAAQ,MAAM;AACpB,QAAI,MAAM;AAAA,EAAK;AAAA,CAAS;AACxB,QAAI,IAAI;AAAA,EACT,CAAC,EAAE,GAAG,SAAS,CAAC,QAAe;AAC9B,YAAQ,MAAM;AAAA,YAAe,IAAI;AAAA,CAAS;AAAA,EAC3C,CAAC;AAED,QAAM,YAAY,eAAgB,OAAe,QAAQ;AACzD,MAAI,aAAe,UAAU,eAAgB,sBAAuB;AACnE,mBAAe;AAEf,QAAI,CAAC,WAAW;AACf,UAAI;AACH,wBAAgB,YAAY;AAAA,MAC7B,QAAE;AACD,cAAM,IAAI;AAAA,UACT;AAAA,QAED;AAAA,MACD;AAAA,IACD;AAEA,QAAI,OAAO,GAAG;AACd,QAAI,WAAW;AACd,cAAQ;AAAA,EAAiC;AAAA,IAC1C,OAAO;AACN,UAAI;AACH,oBAAY,QAAQ,YAAY,EAAE,gBAAgB,UAAU,OAAO;AAAA,MACpE,QAAE;AACD,cAAM,IAAI,MAAM,8FAA8F;AAAA,MAC/G;AAEA,cAAQ;AAAA,EAA2B;AAAA,IACpC;AAEA,cAAU,SAAS;AAAA,MAClB,MAAM,UAAU;AAAA,MAChB,IAAI,UAAU;AAAA,MACd,SAAS,UAAU;AAAA,MACnB;AAAA,IACD,GAAG,CAAC,QAAsB;AACzB,UAAI;AAAK,gBAAQ,MAAM,wBAAwB,KAAK;AAAA,IACrD,CAAC;AAAA,EACF;AAEA,SAAO;AACR;",
"names": []
}