@driveflux/reporter 5.3.2-next.0 → 5.3.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/cjs/index.js.map +7 -0
- package/dist/cjs/package.json +3 -0
- package/dist/config.js.map +1 -0
- package/dist/drivers/console.js.map +1 -0
- package/dist/drivers/rollbar.js.map +1 -0
- package/dist/drivers/slack.js.map +1 -0
- package/dist/index.js +3 -3
- package/dist/index.js.map +7 -0
- package/dist/types.js.map +1 -0
- package/package.json +11 -11
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../src/index.ts", "../../src/config.ts", "../../src/drivers/console.ts", "../../src/drivers/rollbar.ts", "../../src/drivers/slack.ts", "../../../../node_modules/.pnpm/flat@6.0.1/node_modules/flat/index.js"],
|
|
4
|
+
"sourcesContent": ["import { Problem, isAProblem } from '@driveflux/problem'\nimport { singleton } from '@driveflux/singleton'\nimport { omit } from '@driveflux/utils'\nimport { config, type Config } from './config.js'\nimport { ConsoleDriver } from './drivers/console.js'\nimport { RollbarDriver } from './drivers/rollbar.js'\nimport { SlackDriver } from './drivers/slack.js'\nimport type { Metadata, Reporter } from './types.js'\n\ntype Driver = keyof Config['drivers']\n\nexport * from './config.js'\n\nconst problemsAndErrorsToReport = singleton('reporterProblemsAndErrors', new Set<Problem | Error>())\n\nconst customDrivers = singleton('reporterCustomDrivers', new Map<string, { enabled: boolean; reporter: Reporter }>())\n\nexport const addDriver = (name: string, reporter: Reporter, enabled = true) => {\n customDrivers.set(name, {\n enabled,\n reporter\n })\n}\n\nexport const getDriver = (driver: string): Reporter => {\n switch (driver) {\n case 'console':\n return new ConsoleDriver()\n case 'rollbar':\n return new RollbarDriver(config.rollbar)\n case 'slack': {\n if (!config.slack) {\n throw new Error(`Slack config missing`)\n }\n return new SlackDriver(config.slack!)\n }\n default: {\n const customDriver = customDrivers.get(driver)\n if (!customDriver) {\n throw new Error(`Driver ${driver} not found.`)\n }\n\n return customDriver.reporter\n }\n }\n}\n\nconst getDrivers = (): Reporter[] => {\n return Object.keys(config.drivers)\n .map((driver) => {\n if (config.drivers[driver as Driver] || customDrivers.get(driver)?.enabled) {\n return getDriver(driver)\n }\n return\n })\n .filter((d) => d) as Reporter[]\n}\n\nexport const reportError = async (err: Error, metadata: Metadata = {}, sync?: boolean) => {\n const defer = typeof sync === 'boolean' ? !sync : config.deferReporting\n if (defer) {\n problemsAndErrorsToReport.add(err)\n } else {\n await commitSingleError(err, metadata)\n }\n\n return err\n}\n\n/**\n *\n * @todo make function\n * @param problem\n */\nexport const reportProblem = async (problem: Problem, sync?: boolean) => {\n const defer = typeof sync === 'boolean' ? !sync : config.deferReporting\n if (defer) {\n problemsAndErrorsToReport.add(problem)\n } else {\n await commitSingleProblem(problem)\n }\n\n return problem\n}\n\nexport const commitReportingErrors = async () => {\n const promises: Promise<any>[] = []\n const problemsToReport = problemsAndErrorsToReport.values()\n problemsAndErrorsToReport.clear()\n \n for (const err of problemsToReport) {\n promises.push(isAProblem(err) ? commitSingleProblem(err) : commitSingleError(err))\n }\n\n await Promise.allSettled(promises)\n \n}\n\nconst commitSingleError = (err: Error, metadata: Metadata = {}) => {\n return Promise.allSettled(\n getDrivers().map((driver) => {\n return driver.reportError(err, {\n request: metadata.request,\n others: omit(metadata, 'request')\n })\n })\n )\n}\n\nconst commitSingleProblem = (problem: Problem) => {\n return Promise.allSettled(\n getDrivers().map((driver) => {\n return driver.reportProblem({\n ...problem,\n privateMetadata: {\n request: problem.privateMetadata?.request,\n others: {\n ...problem.metadata,\n ...(problem.privateMetadata ? omit(problem.privateMetadata, 'request') : undefined)\n }\n }\n })\n })\n )\n}\n\nexport const setReporterPayload = (payload: Record<string, any>) => {\n getDrivers().forEach((driver) => {\n driver.setReporterPayload(payload)\n })\n}\n", "import { ProblemSeverity } from '@driveflux/problem'\nimport { singleton } from '@driveflux/singleton'\nimport { Configuration } from 'rollbar'\n\nexport type Config = {\n isProd: boolean\n deferReporting: boolean\n slack?: {\n errorChannelId: string\n token: string\n minimumSeverity: ProblemSeverity\n }\n drivers: {\n slack: boolean\n rollbar: boolean\n console: boolean\n }\n rollbar?: Configuration\n}\n\nconst getConfig = (): Config =>\n ({\n isProd: process.env.APP_ENV === 'production',\n deferReporting:\n typeof process.env.REPORTER_DEFER === 'string' && process.env.REPORTER_DEFER !== ''\n ? process.env.REPORTER_DEFER === 'true'\n : true,\n slack: {\n errorChannelId: process.env.SLACK_ERROR_CHANNEL!,\n token: process.env.SLACK_TOKEN!,\n minimumSeverity: ProblemSeverity.CRITICAL\n },\n drivers: {\n slack: process.env.REPORTER_USE_SLACK === 'true',\n rollbar: process.env.REPORTER_USE_ROLLBAR === 'true',\n console: process.env.REPORTER_USE_CONSOLE !== 'false'\n },\n rollbar: {\n accessToken: process.env.ROLLBAR_ACCESS_TOKEN,\n enabled: true,\n captureUncaught: true,\n captureUnhandledRejections: true,\n environment: process.env.APP_ENV || process.env.NODE_ENV\n }\n }) as const\n\nexport let config: Config = singleton('reporterConfig', getConfig())\n\nexport const resetConfig = () => {\n config = singleton('reporterConfig', getConfig(), true)\n\n return config\n}\n\nexport const setConfig = <Key extends keyof Config>(key: Key, value: Config[Key]) => {\n config[key] = value\n}\n", "import type { Problem } from '@driveflux/problem'\nimport type { Metadata, Reporter } from '../types.js'\nexport class ConsoleDriver implements Reporter {\n private payload: any\n\n async reportError(err: Error, _: Metadata) {\n console.error('An error happened')\n console.error('Error', err)\n console.error('Payload', this.payload)\n }\n\n async reportProblem(problem: Problem) {\n console.error('A problem happened')\n console.error('Problem', problem)\n console.error('Payload', this.payload)\n }\n\n setReporterPayload(payload: Record<string, any>) {\n this.payload = payload\n }\n}\n", "import type { Problem } from '@driveflux/problem'\nimport Rollbar from 'rollbar'\nimport type { Metadata, Reporter } from '../types.js'\n\nexport class RollbarDriver implements Reporter {\n private rollbar\n\n constructor(rollbarConfig?: import('rollbar').Configuration) {\n this.rollbar = new Rollbar(rollbarConfig)\n }\n\n async reportError(err: Error, metadata: Metadata) {\n this.rollbar.error(err, metadata.request || {}, metadata.others)\n }\n\n async reportProblem(problem: Problem) {\n await new Promise((resolve) => {\n this.rollbar.error(\n problem.privateMetadata?.error || new Error(problem.message || problem.code),\n problem.privateMetadata?.request,\n problem.privateMetadata || {},\n (error) => {\n resolve(error)\n }\n )\n })\n }\n\n setReporterPayload(payload: Record<string, any>) {\n this.rollbar.configure({ payload })\n }\n}\n", "import { enhancedFetch } from '@driveflux/fetch'\nimport { ProblemSeverity, hasSeverityGte, type Problem } from '@driveflux/problem'\nimport { isEmpty, omit } from '@driveflux/utils'\nimport { flatten } from 'flat'\nimport { config, type Config } from '../config.js'\nimport type { Metadata, Reporter } from '../types.js'\n\n\nconst lines = (object: any) => {\n return {\n type: 'section',\n fields: Object.keys(object).map((key) => ({\n type: 'mrkdwn',\n body: `*${key}:*\\n${JSON.stringify(object[key])}`\n }))\n }\n}\n\nexport class SlackDriver implements Reporter {\n private accessToken: string\n private payload: Record<string, any> = {}\n private channel: string\n\n constructor(slackConfig: NonNullable<Config['slack']>) {\n this.accessToken = slackConfig.token\n this.channel = slackConfig.errorChannelId\n }\n\n async reportError(err: Error, metadata: Metadata) {\n // We won't check for severity for Error objects as they are most likely always critical\n const blocks: any[] = [\n {\n type: 'header',\n text: {\n type: 'mrkdwn',\n text: ':fire: Unexpected error happened',\n emoji: true\n }\n },\n {\n type: 'section',\n text: {\n type: 'mrkdwn',\n text: err.message\n }\n }\n ]\n this.standardBody(blocks, metadata)\n await this.slack(blocks)\n }\n\n async reportProblem(problem: Problem) {\n if(!hasSeverityGte(problem, config.slack?.minimumSeverity || ProblemSeverity.CRITICAL)) {\n return\n }\n\n const blocks: any[] = [\n {\n type: 'header',\n text: {\n type: 'plain_text',\n text: 'Problem',\n emoji: true\n }\n },\n {\n type: 'section',\n text: {\n type: 'mrkdwn',\n text: `*Code:*: ${problem.code}\\n*Message:* ${problem.message}`\n }\n }\n ]\n this.standardBody(blocks, problem.metadata)\n await this.slack(blocks)\n }\n\n setReporterPayload(payload: Record<string, any>) {\n this.payload = payload\n }\n\n private async slack(blocks: any[]): Promise<any> {\n return await enhancedFetch('https://slack.com/api/chat.postMessage', {\n method: 'POST',\n headers: {\n Authorization: `Bearer ${this.accessToken}`\n },\n body: JSON.stringify({\n channel: this.channel,\n blocks\n })\n })\n }\n\n private standardBody(blocks: any[], metadata?: Metadata) {\n if (metadata?.request) {\n blocks.push({\n type: 'section',\n text: {\n type: 'plain_text',\n text: 'Request:'\n }\n })\n blocks.push({\n type: 'section',\n fields: [\n {\n type: 'mrkdwn',\n body: `*URL:*\\n${metadata.request?.url}`\n },\n {\n type: 'mrkdwn',\n body: `*Method:*\\n${metadata.request?.method}`\n }\n ]\n })\n }\n\n if (metadata) {\n blocks.push({\n type: 'section',\n text: {\n type: 'plain_text',\n text: 'Other Information:'\n }\n })\n blocks.push(lines(flatten(omit(metadata, 'request'))))\n }\n\n if (!isEmpty(this.payload)) {\n blocks.push({\n type: 'section',\n text: {\n type: 'plain_text',\n text: 'Other Information:'\n }\n })\n blocks.push(lines(flatten(this.payload)))\n }\n }\n}\n", "function isBuffer (obj) {\n return obj &&\n obj.constructor &&\n (typeof obj.constructor.isBuffer === 'function') &&\n obj.constructor.isBuffer(obj)\n}\n\nfunction keyIdentity (key) {\n return key\n}\n\nexport function flatten (target, opts) {\n opts = opts || {}\n\n const delimiter = opts.delimiter || '.'\n const maxDepth = opts.maxDepth\n const transformKey = opts.transformKey || keyIdentity\n const output = {}\n\n function step (object, prev, currentDepth) {\n currentDepth = currentDepth || 1\n Object.keys(object).forEach(function (key) {\n const value = object[key]\n const isarray = opts.safe && Array.isArray(value)\n const type = Object.prototype.toString.call(value)\n const isbuffer = isBuffer(value)\n const isobject = (\n type === '[object Object]' ||\n type === '[object Array]'\n )\n\n const newKey = prev\n ? prev + delimiter + transformKey(key)\n : transformKey(key)\n\n if (!isarray && !isbuffer && isobject && Object.keys(value).length &&\n (!opts.maxDepth || currentDepth < maxDepth)) {\n return step(value, newKey, currentDepth + 1)\n }\n\n output[newKey] = value\n })\n }\n\n step(target)\n\n return output\n}\n\nexport function unflatten (target, opts) {\n opts = opts || {}\n\n const delimiter = opts.delimiter || '.'\n const overwrite = opts.overwrite || false\n const transformKey = opts.transformKey || keyIdentity\n const result = {}\n\n const isbuffer = isBuffer(target)\n if (isbuffer || Object.prototype.toString.call(target) !== '[object Object]') {\n return target\n }\n\n // safely ensure that the key is\n // an integer.\n function getkey (key) {\n const parsedKey = Number(key)\n\n return (\n isNaN(parsedKey) ||\n key.indexOf('.') !== -1 ||\n opts.object\n )\n ? key\n : parsedKey\n }\n\n function addKeys (keyPrefix, recipient, target) {\n return Object.keys(target).reduce(function (result, key) {\n result[keyPrefix + delimiter + key] = target[key]\n\n return result\n }, recipient)\n }\n\n function isEmpty (val) {\n const type = Object.prototype.toString.call(val)\n const isArray = type === '[object Array]'\n const isObject = type === '[object Object]'\n\n if (!val) {\n return true\n } else if (isArray) {\n return !val.length\n } else if (isObject) {\n return !Object.keys(val).length\n }\n }\n\n target = Object.keys(target).reduce(function (result, key) {\n const type = Object.prototype.toString.call(target[key])\n const isObject = (type === '[object Object]' || type === '[object Array]')\n if (!isObject || isEmpty(target[key])) {\n result[key] = target[key]\n return result\n } else {\n return addKeys(\n key,\n result,\n flatten(target[key], opts)\n )\n }\n }, {})\n\n Object.keys(target).forEach(function (key) {\n const split = key.split(delimiter).map(transformKey)\n let key1 = getkey(split.shift())\n let key2 = getkey(split[0])\n let recipient = result\n\n while (key2 !== undefined) {\n if (key1 === '__proto__') {\n return\n }\n\n const type = Object.prototype.toString.call(recipient[key1])\n const isobject = (\n type === '[object Object]' ||\n type === '[object Array]'\n )\n\n // do not write over falsey, non-undefined values if overwrite is false\n if (!overwrite && !isobject && typeof recipient[key1] !== 'undefined') {\n return\n }\n\n if ((overwrite && !isobject) || (!overwrite && recipient[key1] == null)) {\n recipient[key1] = (\n typeof key2 === 'number' &&\n !opts.object\n ? []\n : {}\n )\n }\n\n recipient = recipient[key1]\n if (split.length > 0) {\n key1 = getkey(split.shift())\n key2 = getkey(split[0])\n }\n }\n\n // unflatten again for 'messy objects'\n recipient[key1] = unflatten(target[key], opts)\n })\n\n return result\n}\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
|
+
"names": ["import_problem", "import_singleton", "import_utils", "Rollbar", "import_problem"]
|
|
7
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"config.js","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,MAAM,oBAAoB,CAAA;AACpD,OAAO,EAAE,SAAS,EAAE,MAAM,sBAAsB,CAAA;AAmBhD,MAAM,SAAS,GAAG,GAAW,EAAE,CAC7B,CAAC;IACC,MAAM,EAAE,OAAO,CAAC,GAAG,CAAC,OAAO,KAAK,YAAY;IAC5C,cAAc,EACZ,OAAO,OAAO,CAAC,GAAG,CAAC,cAAc,KAAK,QAAQ,IAAI,OAAO,CAAC,GAAG,CAAC,cAAc,KAAK,EAAE;QACjF,CAAC,CAAC,OAAO,CAAC,GAAG,CAAC,cAAc,KAAK,MAAM;QACvC,CAAC,CAAC,IAAI;IACV,KAAK,EAAE;QACL,cAAc,EAAE,OAAO,CAAC,GAAG,CAAC,mBAAoB;QAChD,KAAK,EAAE,OAAO,CAAC,GAAG,CAAC,WAAY;QAC/B,eAAe,EAAE,eAAe,CAAC,QAAQ;KAC1C;IACD,OAAO,EAAE;QACP,KAAK,EAAE,OAAO,CAAC,GAAG,CAAC,kBAAkB,KAAK,MAAM;QAChD,OAAO,EAAE,OAAO,CAAC,GAAG,CAAC,oBAAoB,KAAK,MAAM;QACpD,OAAO,EAAE,OAAO,CAAC,GAAG,CAAC,oBAAoB,KAAK,OAAO;KACtD;IACD,OAAO,EAAE;QACP,WAAW,EAAE,OAAO,CAAC,GAAG,CAAC,oBAAoB;QAC7C,OAAO,EAAE,IAAI;QACb,eAAe,EAAE,IAAI;QACrB,0BAA0B,EAAE,IAAI;QAChC,WAAW,EAAE,OAAO,CAAC,GAAG,CAAC,OAAO,IAAI,OAAO,CAAC,GAAG,CAAC,QAAQ;KACzD;CACF,CAAU,CAAA;AAEb,MAAM,CAAC,IAAI,MAAM,GAAW,SAAS,CAAC,gBAAgB,EAAE,SAAS,EAAE,CAAC,CAAA;AAEpE,MAAM,CAAC,MAAM,WAAW,GAAG,GAAG,EAAE;IAC9B,MAAM,GAAG,SAAS,CAAC,gBAAgB,EAAE,SAAS,EAAE,EAAE,IAAI,CAAC,CAAA;IAEvD,OAAO,MAAM,CAAA;AACf,CAAC,CAAA;AAED,MAAM,CAAC,MAAM,SAAS,GAAG,CAA2B,GAAQ,EAAE,KAAkB,EAAE,EAAE;IAClF,MAAM,CAAC,GAAG,CAAC,GAAG,KAAK,CAAA;AACrB,CAAC,CAAA"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"console.js","sourceRoot":"","sources":["../../src/drivers/console.ts"],"names":[],"mappings":"AAEA,MAAM,OAAO,aAAa;IAChB,OAAO,CAAK;IAEpB,KAAK,CAAC,WAAW,CAAC,GAAU,EAAE,CAAW;QACvC,OAAO,CAAC,KAAK,CAAC,mBAAmB,CAAC,CAAA;QAClC,OAAO,CAAC,KAAK,CAAC,OAAO,EAAE,GAAG,CAAC,CAAA;QAC3B,OAAO,CAAC,KAAK,CAAC,SAAS,EAAE,IAAI,CAAC,OAAO,CAAC,CAAA;IACxC,CAAC;IAED,KAAK,CAAC,aAAa,CAAC,OAAgB;QAClC,OAAO,CAAC,KAAK,CAAC,oBAAoB,CAAC,CAAA;QACnC,OAAO,CAAC,KAAK,CAAC,SAAS,EAAE,OAAO,CAAC,CAAA;QACjC,OAAO,CAAC,KAAK,CAAC,SAAS,EAAE,IAAI,CAAC,OAAO,CAAC,CAAA;IACxC,CAAC;IAED,kBAAkB,CAAC,OAA4B;QAC7C,IAAI,CAAC,OAAO,GAAG,OAAO,CAAA;IACxB,CAAC;CACF"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"rollbar.js","sourceRoot":"","sources":["../../src/drivers/rollbar.ts"],"names":[],"mappings":"AACA,OAAO,OAAO,MAAM,SAAS,CAAA;AAG7B,MAAM,OAAO,aAAa;IAChB,OAAO,CAAA;IAEf,YAAY,aAA+C;QACzD,IAAI,CAAC,OAAO,GAAG,IAAI,OAAO,CAAC,aAAa,CAAC,CAAA;IAC3C,CAAC;IAED,KAAK,CAAC,WAAW,CAAC,GAAU,EAAE,QAAkB;QAC9C,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,GAAG,EAAE,QAAQ,CAAC,OAAO,IAAI,EAAE,EAAE,QAAQ,CAAC,MAAM,CAAC,CAAA;IAClE,CAAC;IAED,KAAK,CAAC,aAAa,CAAC,OAAgB;QAClC,MAAM,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE;YAC5B,IAAI,CAAC,OAAO,CAAC,KAAK,CAChB,OAAO,CAAC,eAAe,EAAE,KAAK,IAAI,IAAI,KAAK,CAAC,OAAO,CAAC,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC,EAC5E,OAAO,CAAC,eAAe,EAAE,OAAO,EAChC,OAAO,CAAC,eAAe,IAAI,EAAE,EAC7B,CAAC,KAAK,EAAE,EAAE;gBACR,OAAO,CAAC,KAAK,CAAC,CAAA;YAChB,CAAC,CACF,CAAA;QACH,CAAC,CAAC,CAAA;IACJ,CAAC;IAED,kBAAkB,CAAC,OAA4B;QAC7C,IAAI,CAAC,OAAO,CAAC,SAAS,CAAC,EAAE,OAAO,EAAE,CAAC,CAAA;IACrC,CAAC;CACF"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"slack.js","sourceRoot":"","sources":["../../src/drivers/slack.ts"],"names":[],"mappings":"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"}
|
package/dist/index.js
CHANGED
|
@@ -225,7 +225,7 @@ var getDrivers = function() {
|
|
|
225
225
|
return d;
|
|
226
226
|
});
|
|
227
227
|
};
|
|
228
|
-
export var reportError = function() {
|
|
228
|
+
export var reportError = /*#__PURE__*/ function() {
|
|
229
229
|
var _ref = _async_to_generator(function(err) {
|
|
230
230
|
var metadata, sync, defer;
|
|
231
231
|
var _arguments = arguments;
|
|
@@ -267,7 +267,7 @@ export var reportError = function() {
|
|
|
267
267
|
*
|
|
268
268
|
* @todo make function
|
|
269
269
|
* @param problem
|
|
270
|
-
*/ export var reportProblem = function() {
|
|
270
|
+
*/ export var reportProblem = /*#__PURE__*/ function() {
|
|
271
271
|
var _ref = _async_to_generator(function(problem, sync) {
|
|
272
272
|
var defer;
|
|
273
273
|
return _ts_generator(this, function(_state) {
|
|
@@ -303,7 +303,7 @@ export var reportError = function() {
|
|
|
303
303
|
return _ref.apply(this, arguments);
|
|
304
304
|
};
|
|
305
305
|
}();
|
|
306
|
-
export var commitReportingErrors = function() {
|
|
306
|
+
export var commitReportingErrors = /*#__PURE__*/ function() {
|
|
307
307
|
var _ref = _async_to_generator(function() {
|
|
308
308
|
var promises, problemsToReport, _iteratorNormalCompletion, _didIteratorError, _iteratorError, _iterator, _step, _$err;
|
|
309
309
|
return _ts_generator(this, function(_state) {
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../src/index.ts", "../src/config.ts", "../src/drivers/console.ts", "../src/drivers/rollbar.ts", "../src/drivers/slack.ts"],
|
|
4
|
+
"sourcesContent": ["import { Problem, isAProblem } from '@driveflux/problem'\nimport { singleton } from '@driveflux/singleton'\nimport { omit } from '@driveflux/utils'\nimport { config, type Config } from './config.js'\nimport { ConsoleDriver } from './drivers/console.js'\nimport { RollbarDriver } from './drivers/rollbar.js'\nimport { SlackDriver } from './drivers/slack.js'\nimport type { Metadata, Reporter } from './types.js'\n\ntype Driver = keyof Config['drivers']\n\nexport * from './config.js'\n\nconst problemsAndErrorsToReport = singleton('reporterProblemsAndErrors', new Set<Problem | Error>())\n\nconst customDrivers = singleton('reporterCustomDrivers', new Map<string, { enabled: boolean; reporter: Reporter }>())\n\nexport const addDriver = (name: string, reporter: Reporter, enabled = true) => {\n customDrivers.set(name, {\n enabled,\n reporter\n })\n}\n\nexport const getDriver = (driver: string): Reporter => {\n switch (driver) {\n case 'console':\n return new ConsoleDriver()\n case 'rollbar':\n return new RollbarDriver(config.rollbar)\n case 'slack': {\n if (!config.slack) {\n throw new Error(`Slack config missing`)\n }\n return new SlackDriver(config.slack!)\n }\n default: {\n const customDriver = customDrivers.get(driver)\n if (!customDriver) {\n throw new Error(`Driver ${driver} not found.`)\n }\n\n return customDriver.reporter\n }\n }\n}\n\nconst getDrivers = (): Reporter[] => {\n return Object.keys(config.drivers)\n .map((driver) => {\n if (config.drivers[driver as Driver] || customDrivers.get(driver)?.enabled) {\n return getDriver(driver)\n }\n return\n })\n .filter((d) => d) as Reporter[]\n}\n\nexport const reportError = async (err: Error, metadata: Metadata = {}, sync?: boolean) => {\n const defer = typeof sync === 'boolean' ? !sync : config.deferReporting\n if (defer) {\n problemsAndErrorsToReport.add(err)\n } else {\n await commitSingleError(err, metadata)\n }\n\n return err\n}\n\n/**\n *\n * @todo make function\n * @param problem\n */\nexport const reportProblem = async (problem: Problem, sync?: boolean) => {\n const defer = typeof sync === 'boolean' ? !sync : config.deferReporting\n if (defer) {\n problemsAndErrorsToReport.add(problem)\n } else {\n await commitSingleProblem(problem)\n }\n\n return problem\n}\n\nexport const commitReportingErrors = async () => {\n const promises: Promise<any>[] = []\n const problemsToReport = problemsAndErrorsToReport.values()\n problemsAndErrorsToReport.clear()\n \n for (const err of problemsToReport) {\n promises.push(isAProblem(err) ? commitSingleProblem(err) : commitSingleError(err))\n }\n\n await Promise.allSettled(promises)\n \n}\n\nconst commitSingleError = (err: Error, metadata: Metadata = {}) => {\n return Promise.allSettled(\n getDrivers().map((driver) => {\n return driver.reportError(err, {\n request: metadata.request,\n others: omit(metadata, 'request')\n })\n })\n )\n}\n\nconst commitSingleProblem = (problem: Problem) => {\n return Promise.allSettled(\n getDrivers().map((driver) => {\n return driver.reportProblem({\n ...problem,\n privateMetadata: {\n request: problem.privateMetadata?.request,\n others: {\n ...problem.metadata,\n ...(problem.privateMetadata ? omit(problem.privateMetadata, 'request') : undefined)\n }\n }\n })\n })\n )\n}\n\nexport const setReporterPayload = (payload: Record<string, any>) => {\n getDrivers().forEach((driver) => {\n driver.setReporterPayload(payload)\n })\n}\n", "import { ProblemSeverity } from '@driveflux/problem'\nimport { singleton } from '@driveflux/singleton'\nimport { Configuration } from 'rollbar'\n\nexport type Config = {\n isProd: boolean\n deferReporting: boolean\n slack?: {\n errorChannelId: string\n token: string\n minimumSeverity: ProblemSeverity\n }\n drivers: {\n slack: boolean\n rollbar: boolean\n console: boolean\n }\n rollbar?: Configuration\n}\n\nconst getConfig = (): Config =>\n ({\n isProd: process.env.APP_ENV === 'production',\n deferReporting:\n typeof process.env.REPORTER_DEFER === 'string' && process.env.REPORTER_DEFER !== ''\n ? process.env.REPORTER_DEFER === 'true'\n : true,\n slack: {\n errorChannelId: process.env.SLACK_ERROR_CHANNEL!,\n token: process.env.SLACK_TOKEN!,\n minimumSeverity: ProblemSeverity.CRITICAL\n },\n drivers: {\n slack: process.env.REPORTER_USE_SLACK === 'true',\n rollbar: process.env.REPORTER_USE_ROLLBAR === 'true',\n console: process.env.REPORTER_USE_CONSOLE !== 'false'\n },\n rollbar: {\n accessToken: process.env.ROLLBAR_ACCESS_TOKEN,\n enabled: true,\n captureUncaught: true,\n captureUnhandledRejections: true,\n environment: process.env.APP_ENV || process.env.NODE_ENV\n }\n }) as const\n\nexport let config: Config = singleton('reporterConfig', getConfig())\n\nexport const resetConfig = () => {\n config = singleton('reporterConfig', getConfig(), true)\n\n return config\n}\n\nexport const setConfig = <Key extends keyof Config>(key: Key, value: Config[Key]) => {\n config[key] = value\n}\n", "import type { Problem } from '@driveflux/problem'\nimport type { Metadata, Reporter } from '../types.js'\nexport class ConsoleDriver implements Reporter {\n private payload: any\n\n async reportError(err: Error, _: Metadata) {\n console.error('An error happened')\n console.error('Error', err)\n console.error('Payload', this.payload)\n }\n\n async reportProblem(problem: Problem) {\n console.error('A problem happened')\n console.error('Problem', problem)\n console.error('Payload', this.payload)\n }\n\n setReporterPayload(payload: Record<string, any>) {\n this.payload = payload\n }\n}\n", "import type { Problem } from '@driveflux/problem'\nimport Rollbar from 'rollbar'\nimport type { Metadata, Reporter } from '../types.js'\n\nexport class RollbarDriver implements Reporter {\n private rollbar\n\n constructor(rollbarConfig?: import('rollbar').Configuration) {\n this.rollbar = new Rollbar(rollbarConfig)\n }\n\n async reportError(err: Error, metadata: Metadata) {\n this.rollbar.error(err, metadata.request || {}, metadata.others)\n }\n\n async reportProblem(problem: Problem) {\n await new Promise((resolve) => {\n this.rollbar.error(\n problem.privateMetadata?.error || new Error(problem.message || problem.code),\n problem.privateMetadata?.request,\n problem.privateMetadata || {},\n (error) => {\n resolve(error)\n }\n )\n })\n }\n\n setReporterPayload(payload: Record<string, any>) {\n this.rollbar.configure({ payload })\n }\n}\n", "import { enhancedFetch } from '@driveflux/fetch'\nimport { ProblemSeverity, hasSeverityGte, type Problem } from '@driveflux/problem'\nimport { isEmpty, omit } from '@driveflux/utils'\nimport { flatten } from 'flat'\nimport { config, type Config } from '../config.js'\nimport type { Metadata, Reporter } from '../types.js'\n\n\nconst lines = (object: any) => {\n return {\n type: 'section',\n fields: Object.keys(object).map((key) => ({\n type: 'mrkdwn',\n body: `*${key}:*\\n${JSON.stringify(object[key])}`\n }))\n }\n}\n\nexport class SlackDriver implements Reporter {\n private accessToken: string\n private payload: Record<string, any> = {}\n private channel: string\n\n constructor(slackConfig: NonNullable<Config['slack']>) {\n this.accessToken = slackConfig.token\n this.channel = slackConfig.errorChannelId\n }\n\n async reportError(err: Error, metadata: Metadata) {\n // We won't check for severity for Error objects as they are most likely always critical\n const blocks: any[] = [\n {\n type: 'header',\n text: {\n type: 'mrkdwn',\n text: ':fire: Unexpected error happened',\n emoji: true\n }\n },\n {\n type: 'section',\n text: {\n type: 'mrkdwn',\n text: err.message\n }\n }\n ]\n this.standardBody(blocks, metadata)\n await this.slack(blocks)\n }\n\n async reportProblem(problem: Problem) {\n if(!hasSeverityGte(problem, config.slack?.minimumSeverity || ProblemSeverity.CRITICAL)) {\n return\n }\n\n const blocks: any[] = [\n {\n type: 'header',\n text: {\n type: 'plain_text',\n text: 'Problem',\n emoji: true\n }\n },\n {\n type: 'section',\n text: {\n type: 'mrkdwn',\n text: `*Code:*: ${problem.code}\\n*Message:* ${problem.message}`\n }\n }\n ]\n this.standardBody(blocks, problem.metadata)\n await this.slack(blocks)\n }\n\n setReporterPayload(payload: Record<string, any>) {\n this.payload = payload\n }\n\n private async slack(blocks: any[]): Promise<any> {\n return await enhancedFetch('https://slack.com/api/chat.postMessage', {\n method: 'POST',\n headers: {\n Authorization: `Bearer ${this.accessToken}`\n },\n body: JSON.stringify({\n channel: this.channel,\n blocks\n })\n })\n }\n\n private standardBody(blocks: any[], metadata?: Metadata) {\n if (metadata?.request) {\n blocks.push({\n type: 'section',\n text: {\n type: 'plain_text',\n text: 'Request:'\n }\n })\n blocks.push({\n type: 'section',\n fields: [\n {\n type: 'mrkdwn',\n body: `*URL:*\\n${metadata.request?.url}`\n },\n {\n type: 'mrkdwn',\n body: `*Method:*\\n${metadata.request?.method}`\n }\n ]\n })\n }\n\n if (metadata) {\n blocks.push({\n type: 'section',\n text: {\n type: 'plain_text',\n text: 'Other Information:'\n }\n })\n blocks.push(lines(flatten(omit(metadata, 'request'))))\n }\n\n if (!isEmpty(this.payload)) {\n blocks.push({\n type: 'section',\n text: {\n type: 'plain_text',\n text: 'Other Information:'\n }\n })\n blocks.push(lines(flatten(this.payload)))\n }\n }\n}\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
|
+
"names": ["singleton", "omit", "ProblemSeverity", "ProblemSeverity", "singleton", "omit"]
|
|
7
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":""}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@driveflux/reporter",
|
|
3
|
-
"version": "5.3.2
|
|
3
|
+
"version": "5.3.2",
|
|
4
4
|
"type": "module",
|
|
5
5
|
"exports": {
|
|
6
6
|
"./package.json": "./package.json",
|
|
@@ -17,22 +17,22 @@
|
|
|
17
17
|
"dist"
|
|
18
18
|
],
|
|
19
19
|
"dependencies": {
|
|
20
|
-
"@driveflux/fetch": "6.2.2
|
|
21
|
-
"@driveflux/problem": "4.2.1
|
|
22
|
-
"@driveflux/redact": "4.2.1
|
|
23
|
-
"@driveflux/singleton": "1.2.1
|
|
24
|
-
"@driveflux/utils": "3.2.1
|
|
25
|
-
"@sentry/node": "^8.
|
|
20
|
+
"@driveflux/fetch": "6.2.2",
|
|
21
|
+
"@driveflux/problem": "4.2.1",
|
|
22
|
+
"@driveflux/redact": "4.2.1",
|
|
23
|
+
"@driveflux/singleton": "1.2.1",
|
|
24
|
+
"@driveflux/utils": "3.2.1",
|
|
25
|
+
"@sentry/node": "^8.30.0",
|
|
26
26
|
"flat": "6.0.1",
|
|
27
27
|
"rollbar": "^2.26.4"
|
|
28
28
|
},
|
|
29
29
|
"devDependencies": {
|
|
30
|
-
"@driveflux/fab": "2.2.1
|
|
31
|
-
"@driveflux/tsconfig": "1.2.1
|
|
30
|
+
"@driveflux/fab": "2.2.1",
|
|
31
|
+
"@driveflux/tsconfig": "1.2.1",
|
|
32
32
|
"@types/flat": "^5.0.5",
|
|
33
|
-
"@types/node": "^
|
|
33
|
+
"@types/node": "^22.5.5",
|
|
34
34
|
"del-cli": "^5.1.0",
|
|
35
|
-
"typescript": "^5.
|
|
35
|
+
"typescript": "^5.6.2"
|
|
36
36
|
},
|
|
37
37
|
"scripts": {
|
|
38
38
|
"build": "fab",
|