@driveflux/reporter 5.0.8 → 5.1.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.
@@ -1,16 +1,17 @@
1
+  WARN  Issue while reading "/Users/flux/Projects/flux-master/.npmrc". Failed to replace env in config: ${NPM_TOKEN}
1
2
 
2
- > @driveflux/reporter@5.0.8 build /Users/flux/Projects/flux/packages/reporter
3
+ > @driveflux/reporter@5.1.2 build /Users/flux/Projects/flux-master/packages/reporter
3
4
  > npm run clean && npm run build:types && npm run build:js
4
5
 
5
6
 
6
- > @driveflux/reporter@5.0.8 clean
7
+ > @driveflux/reporter@5.1.2 clean
7
8
  > del dist/**/*.js
8
9
 
9
10
 
10
- > @driveflux/reporter@5.0.8 build:types
11
+ > @driveflux/reporter@5.1.2 build:types
11
12
  > tsc --build
12
13
 
13
14
 
14
- > @driveflux/reporter@5.0.8 build:js
15
+ > @driveflux/reporter@5.1.2 build:js
15
16
  > node -r esbuild-register build.js
16
17
 
package/CHANGELOG.md CHANGED
@@ -1,5 +1,33 @@
1
1
  # @driveflux/reporter
2
2
 
3
+ ## 5.1.2
4
+
5
+ ### Patch Changes
6
+
7
+ - Minor updates on build
8
+ - Updated dependencies
9
+ - @driveflux/singleton@1.0.4
10
+ - @driveflux/problem@4.0.3
11
+ - @driveflux/redact@4.0.3
12
+ - @driveflux/fetch@6.0.8
13
+ - @driveflux/utils@3.0.8
14
+
15
+ ## 5.1.1
16
+
17
+ ### Patch Changes
18
+
19
+ - Upgraded all packages
20
+ - Updated dependencies
21
+ - @driveflux/singleton@1.0.3
22
+ - @driveflux/fetch@6.0.7
23
+ - @driveflux/utils@3.0.7
24
+
25
+ ## 5.1.0
26
+
27
+ ### Minor Changes
28
+
29
+ - Defer reporting
30
+
3
31
  ## 5.0.8
4
32
 
5
33
  ### Patch Changes
package/build.js CHANGED
@@ -1,6 +1,6 @@
1
1
  import { build } from 'esbuild'
2
2
  import fs from 'node:fs'
3
- const { dependencies, devDependencies } = JSON.parse(fs.readFileSync('./package.json'));
3
+ const { dependencies, devDependencies } = JSON.parse(fs.readFileSync('./package.json'))
4
4
 
5
5
  const ESM_MODULES = ['flat']
6
6
 
@@ -9,30 +9,41 @@ const sharedConfig = {
9
9
  platform: 'node',
10
10
  bundle: true,
11
11
  external: [...Object.keys(dependencies), ...Object.keys(devDependencies)],
12
- sourcemap: true,
12
+ sourcemap: true
13
13
  }
14
14
 
15
- build({
16
- ...sharedConfig,
17
- outdir: 'dist',
18
- format: 'esm'
19
- }).catch((e) => {
15
+ const handleError = (e) => {
16
+ console.log('Error bundling')
20
17
  console.error(e)
21
18
  process.exit(1)
22
- })
19
+ }
23
20
 
21
+ const buildAll = async () => {
22
+ try {
23
+ await Promise.all([
24
+ build({
25
+ ...sharedConfig,
26
+ outdir: 'dist',
27
+ format: 'esm'
28
+ }),
24
29
 
25
- build({
26
- ...sharedConfig,
27
- external: sharedConfig.external.filter((e) => !ESM_MODULES.includes(e)),
28
- outdir: 'dist/cjs',
29
- format: 'cjs'
30
- }).catch((e) => {
31
- console.error(e)
32
- process.exit(1)
33
- })
34
- .then(() => {
35
- fs.writeFileSync('./dist/cjs/package.json', `{
36
- "type": "commonjs"
37
- }`)
38
- })
30
+ build({
31
+ ...sharedConfig,
32
+ external: sharedConfig.external.filter((e) => !ESM_MODULES.includes(e)),
33
+ outdir: 'dist/cjs',
34
+ format: 'cjs'
35
+ }).then(() => {
36
+ fs.writeFileSync(
37
+ './dist/cjs/package.json',
38
+ `{
39
+ "type": "commonjs"
40
+ }`
41
+ )
42
+ })
43
+ ])
44
+ } catch (e) {
45
+ handleError(e)
46
+ }
47
+ }
48
+
49
+ await buildAll()
package/dist/cjs/index.js CHANGED
@@ -31,6 +31,7 @@ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: tru
31
31
  var src_exports = {};
32
32
  __export(src_exports, {
33
33
  addDriver: () => addDriver,
34
+ commitReportingErrors: () => commitReportingErrors,
34
35
  config: () => config,
35
36
  getDriver: () => getDriver,
36
37
  reportError: () => reportError,
@@ -40,6 +41,8 @@ __export(src_exports, {
40
41
  setReporterPayload: () => setReporterPayload
41
42
  });
42
43
  module.exports = __toCommonJS(src_exports);
44
+ var import_problem3 = require("@driveflux/problem");
45
+ var import_singleton2 = require("@driveflux/singleton");
43
46
  var import_utils2 = require("@driveflux/utils");
44
47
 
45
48
  // src/config.ts
@@ -47,6 +50,7 @@ var import_problem = require("@driveflux/problem");
47
50
  var import_singleton = require("@driveflux/singleton");
48
51
  var getConfig = () => ({
49
52
  isProd: process.env.APP_ENV === "production",
53
+ deferReporting: typeof process.env.REPORTER_DEFER === "string" && process.env.REPORTER_DEFER !== "" ? process.env.REPORTER_DEFER === "true" : true,
50
54
  slack: {
51
55
  errorChannelId: process.env.SLACK_ERROR_CHANNEL,
52
56
  token: process.env.SLACK_TOKEN,
@@ -285,7 +289,8 @@ ${metadata.request?.method}`
285
289
  };
286
290
 
287
291
  // src/index.ts
288
- var customDrivers = /* @__PURE__ */ new Map();
292
+ var problemsAndErrorsToReport = (0, import_singleton2.singleton)("reporterProblemsAndErrors", /* @__PURE__ */ new Set());
293
+ var customDrivers = (0, import_singleton2.singleton)("reporterCustomDrivers", /* @__PURE__ */ new Map());
289
294
  var addDriver = (name, reporter, enabled = true) => {
290
295
  customDrivers.set(name, {
291
296
  enabled,
@@ -321,8 +326,35 @@ var getDrivers = () => {
321
326
  return;
322
327
  }).filter((d) => d);
323
328
  };
324
- var reportError = async (err, metadata = {}) => {
325
- await Promise.allSettled(
329
+ var reportError = async (err, metadata = {}, sync) => {
330
+ const defer = typeof sync === "boolean" ? !sync : config.deferReporting;
331
+ if (defer) {
332
+ problemsAndErrorsToReport.add(err);
333
+ } else {
334
+ await commitSingleError(err, metadata);
335
+ }
336
+ return err;
337
+ };
338
+ var reportProblem = async (problem, sync) => {
339
+ const defer = typeof sync === "boolean" ? !sync : config.deferReporting;
340
+ if (defer) {
341
+ problemsAndErrorsToReport.add(problem);
342
+ } else {
343
+ await commitSingleProblem(problem);
344
+ }
345
+ return problem;
346
+ };
347
+ var commitReportingErrors = async () => {
348
+ const promises = [];
349
+ const problemsToReport = problemsAndErrorsToReport.values();
350
+ problemsAndErrorsToReport.clear();
351
+ for (const err of problemsToReport) {
352
+ promises.push((0, import_problem3.isAProblem)(err) ? commitSingleProblem(err) : commitSingleError(err));
353
+ }
354
+ await Promise.allSettled(promises);
355
+ };
356
+ var commitSingleError = (err, metadata = {}) => {
357
+ return Promise.allSettled(
326
358
  getDrivers().map((driver) => {
327
359
  return driver.reportError(err, {
328
360
  request: metadata.request,
@@ -330,10 +362,9 @@ var reportError = async (err, metadata = {}) => {
330
362
  });
331
363
  })
332
364
  );
333
- return err;
334
365
  };
335
- var reportProblem = async (problem) => {
336
- await Promise.allSettled(
366
+ var commitSingleProblem = (problem) => {
367
+ return Promise.allSettled(
337
368
  getDrivers().map((driver) => {
338
369
  return driver.reportProblem({
339
370
  ...problem,
@@ -347,7 +378,6 @@ var reportProblem = async (problem) => {
347
378
  });
348
379
  })
349
380
  );
350
- return problem;
351
381
  };
352
382
  var setReporterPayload = (payload) => {
353
383
  getDrivers().forEach((driver) => {
@@ -357,6 +387,7 @@ var setReporterPayload = (payload) => {
357
387
  // Annotate the CommonJS export names for ESM import in node:
358
388
  0 && (module.exports = {
359
389
  addDriver,
390
+ commitReportingErrors,
360
391
  config,
361
392
  getDriver,
362
393
  reportError,
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
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 { 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 customDrivers = 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 = {}) => {\n await 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 return err\n}\n\n/**\n *\n * @todo make function\n * @param problem\n */\nexport const reportProblem = async (problem: import('@driveflux/problem').Problem) => {\n await 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 return problem\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 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 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_utils", "Rollbar", "import_problem"]
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
7
  }
@@ -1,3 +1,3 @@
1
1
  {
2
- "type": "commonjs"
3
- }
2
+ "type": "commonjs"
3
+ }
package/dist/config.d.ts CHANGED
@@ -2,6 +2,7 @@ import { ProblemSeverity } from '@driveflux/problem';
2
2
  import { Configuration } from 'rollbar';
3
3
  export type Config = {
4
4
  isProd: boolean;
5
+ deferReporting: boolean;
5
6
  slack?: {
6
7
  errorChannelId: string;
7
8
  token: string;
@@ -1 +1 @@
1
- {"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,MAAM,oBAAoB,CAAA;AAEpD,OAAO,EAAE,aAAa,EAAE,MAAM,SAAS,CAAA;AAEvC,MAAM,MAAM,MAAM,GAAG;IACnB,MAAM,EAAE,OAAO,CAAA;IACf,KAAK,CAAC,EAAE;QACN,cAAc,EAAE,MAAM,CAAA;QACtB,KAAK,EAAE,MAAM,CAAA;QACb,eAAe,EAAE,eAAe,CAAC;KAClC,CAAC;IACF,OAAO,EAAE;QACP,KAAK,EAAE,OAAO,CAAA;QACd,OAAO,EAAE,OAAO,CAAA;QAChB,OAAO,EAAE,OAAO,CAAA;KACjB,CAAA;IACD,OAAO,CAAC,EAAE,aAAa,CAAA;CACxB,CAAA;AAwBD,eAAO,IAAI,MAAM,EAAE,MAAiD,CAAA;AAEpE,eAAO,MAAM,WAAW,cAIvB,CAAA;AAED,eAAO,MAAM,SAAS,kCAAmC,GAAG,SAAS,MAAM,CAAC,GAAG,CAAC,SAE/E,CAAA"}
1
+ {"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,MAAM,oBAAoB,CAAA;AAEpD,OAAO,EAAE,aAAa,EAAE,MAAM,SAAS,CAAA;AAEvC,MAAM,MAAM,MAAM,GAAG;IACnB,MAAM,EAAE,OAAO,CAAA;IACf,cAAc,EAAE,OAAO,CAAA;IACvB,KAAK,CAAC,EAAE;QACN,cAAc,EAAE,MAAM,CAAA;QACtB,KAAK,EAAE,MAAM,CAAA;QACb,eAAe,EAAE,eAAe,CAAA;KACjC,CAAA;IACD,OAAO,EAAE;QACP,KAAK,EAAE,OAAO,CAAA;QACd,OAAO,EAAE,OAAO,CAAA;QAChB,OAAO,EAAE,OAAO,CAAA;KACjB,CAAA;IACD,OAAO,CAAC,EAAE,aAAa,CAAA;CACxB,CAAA;AA4BD,eAAO,IAAI,MAAM,EAAE,MAAiD,CAAA;AAEpE,eAAO,MAAM,WAAW,cAIvB,CAAA;AAED,eAAO,MAAM,SAAS,kCAAmC,GAAG,SAAS,MAAM,CAAC,GAAG,CAAC,SAE/E,CAAA"}
package/dist/config.js CHANGED
@@ -2,10 +2,13 @@ import { ProblemSeverity } from '@driveflux/problem';
2
2
  import { singleton } from '@driveflux/singleton';
3
3
  const getConfig = () => ({
4
4
  isProd: process.env.APP_ENV === 'production',
5
+ deferReporting: typeof process.env.REPORTER_DEFER === 'string' && process.env.REPORTER_DEFER !== ''
6
+ ? process.env.REPORTER_DEFER === 'true'
7
+ : true,
5
8
  slack: {
6
9
  errorChannelId: process.env.SLACK_ERROR_CHANNEL,
7
10
  token: process.env.SLACK_TOKEN,
8
- minimumSeverity: ProblemSeverity.CRITICAL,
11
+ minimumSeverity: ProblemSeverity.CRITICAL
9
12
  },
10
13
  drivers: {
11
14
  slack: process.env.REPORTER_USE_SLACK === 'true',
@@ -1 +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;AAkBhD,MAAM,SAAS,GAAG,GAAW,EAAE,CAC7B,CAAC;IACC,MAAM,EAAE,OAAO,CAAC,GAAG,CAAC,OAAO,KAAK,YAAY;IAC5C,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;CACQ,CAAA,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"}
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"}
package/dist/index.d.ts CHANGED
@@ -1,13 +1,15 @@
1
+ import { Problem } from '@driveflux/problem';
1
2
  import type { Metadata, Reporter } from './types.js';
2
3
  export * from './config.js';
3
4
  export declare const addDriver: (name: string, reporter: Reporter, enabled?: boolean) => void;
4
5
  export declare const getDriver: (driver: string) => Reporter;
5
- export declare const reportError: (err: Error, metadata?: Metadata) => Promise<Error>;
6
+ export declare const reportError: (err: Error, metadata?: Metadata, sync?: boolean) => Promise<Error>;
6
7
  /**
7
8
  *
8
9
  * @todo make function
9
10
  * @param problem
10
11
  */
11
- export declare const reportProblem: (problem: import('@driveflux/problem').Problem) => Promise<import("@driveflux/problem").Problem>;
12
+ export declare const reportProblem: (problem: Problem, sync?: boolean) => Promise<Problem>;
13
+ export declare const commitReportingErrors: () => Promise<void>;
12
14
  export declare const setReporterPayload: (payload: Record<string, any>) => void;
13
15
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,QAAQ,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAA;AAIpD,cAAc,aAAa,CAAA;AAI3B,eAAO,MAAM,SAAS,SAAU,MAAM,YAAY,QAAQ,4BAKzD,CAAA;AAED,eAAO,MAAM,SAAS,WAAY,MAAM,KAAG,QAqB1C,CAAA;AAaD,eAAO,MAAM,WAAW,QAAe,KAAK,aAAY,QAAQ,mBAW/D,CAAA;AAED;;;;GAIG;AACH,eAAO,MAAM,aAAa,YAAmB,OAAO,oBAAoB,EAAE,OAAO,kDAiBhF,CAAA;AAED,eAAO,MAAM,kBAAkB,YAAa,OAAO,MAAM,EAAE,GAAG,CAAC,SAI9D,CAAA"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAc,MAAM,oBAAoB,CAAA;AAOxD,OAAO,KAAK,EAAE,QAAQ,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAA;AAIpD,cAAc,aAAa,CAAA;AAM3B,eAAO,MAAM,SAAS,SAAU,MAAM,YAAY,QAAQ,4BAKzD,CAAA;AAED,eAAO,MAAM,SAAS,WAAY,MAAM,KAAG,QAqB1C,CAAA;AAaD,eAAO,MAAM,WAAW,QAAe,KAAK,aAAY,QAAQ,SAAc,OAAO,mBASpF,CAAA;AAED;;;;GAIG;AACH,eAAO,MAAM,aAAa,YAAmB,OAAO,SAAS,OAAO,qBASnE,CAAA;AAED,eAAO,MAAM,qBAAqB,qBAWjC,CAAA;AA8BD,eAAO,MAAM,kBAAkB,YAAa,OAAO,MAAM,EAAE,GAAG,CAAC,SAI9D,CAAA"}
package/dist/index.js CHANGED
@@ -1,4 +1,6 @@
1
1
  // src/index.ts
2
+ import { isAProblem } from "@driveflux/problem";
3
+ import { singleton as singleton2 } from "@driveflux/singleton";
2
4
  import { omit as omit2 } from "@driveflux/utils";
3
5
 
4
6
  // src/config.ts
@@ -6,6 +8,7 @@ import { ProblemSeverity } from "@driveflux/problem";
6
8
  import { singleton } from "@driveflux/singleton";
7
9
  var getConfig = () => ({
8
10
  isProd: process.env.APP_ENV === "production",
11
+ deferReporting: typeof process.env.REPORTER_DEFER === "string" && process.env.REPORTER_DEFER !== "" ? process.env.REPORTER_DEFER === "true" : true,
9
12
  slack: {
10
13
  errorChannelId: process.env.SLACK_ERROR_CHANNEL,
11
14
  token: process.env.SLACK_TOKEN,
@@ -211,7 +214,8 @@ ${metadata.request?.method}`
211
214
  };
212
215
 
213
216
  // src/index.ts
214
- var customDrivers = /* @__PURE__ */ new Map();
217
+ var problemsAndErrorsToReport = singleton2("reporterProblemsAndErrors", /* @__PURE__ */ new Set());
218
+ var customDrivers = singleton2("reporterCustomDrivers", /* @__PURE__ */ new Map());
215
219
  var addDriver = (name, reporter, enabled = true) => {
216
220
  customDrivers.set(name, {
217
221
  enabled,
@@ -247,8 +251,35 @@ var getDrivers = () => {
247
251
  return;
248
252
  }).filter((d) => d);
249
253
  };
250
- var reportError = async (err, metadata = {}) => {
251
- await Promise.allSettled(
254
+ var reportError = async (err, metadata = {}, sync) => {
255
+ const defer = typeof sync === "boolean" ? !sync : config.deferReporting;
256
+ if (defer) {
257
+ problemsAndErrorsToReport.add(err);
258
+ } else {
259
+ await commitSingleError(err, metadata);
260
+ }
261
+ return err;
262
+ };
263
+ var reportProblem = async (problem, sync) => {
264
+ const defer = typeof sync === "boolean" ? !sync : config.deferReporting;
265
+ if (defer) {
266
+ problemsAndErrorsToReport.add(problem);
267
+ } else {
268
+ await commitSingleProblem(problem);
269
+ }
270
+ return problem;
271
+ };
272
+ var commitReportingErrors = async () => {
273
+ const promises = [];
274
+ const problemsToReport = problemsAndErrorsToReport.values();
275
+ problemsAndErrorsToReport.clear();
276
+ for (const err of problemsToReport) {
277
+ promises.push(isAProblem(err) ? commitSingleProblem(err) : commitSingleError(err));
278
+ }
279
+ await Promise.allSettled(promises);
280
+ };
281
+ var commitSingleError = (err, metadata = {}) => {
282
+ return Promise.allSettled(
252
283
  getDrivers().map((driver) => {
253
284
  return driver.reportError(err, {
254
285
  request: metadata.request,
@@ -256,10 +287,9 @@ var reportError = async (err, metadata = {}) => {
256
287
  });
257
288
  })
258
289
  );
259
- return err;
260
290
  };
261
- var reportProblem = async (problem) => {
262
- await Promise.allSettled(
291
+ var commitSingleProblem = (problem) => {
292
+ return Promise.allSettled(
263
293
  getDrivers().map((driver) => {
264
294
  return driver.reportProblem({
265
295
  ...problem,
@@ -273,7 +303,6 @@ var reportProblem = async (problem) => {
273
303
  });
274
304
  })
275
305
  );
276
- return problem;
277
306
  };
278
307
  var setReporterPayload = (payload) => {
279
308
  getDrivers().forEach((driver) => {
@@ -282,6 +311,7 @@ var setReporterPayload = (payload) => {
282
311
  };
283
312
  export {
284
313
  addDriver,
314
+ commitReportingErrors,
285
315
  config,
286
316
  getDriver,
287
317
  reportError,
package/dist/index.js.map CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../src/index.ts", "../src/config.ts", "../src/drivers/console.ts", "../src/drivers/rollbar.ts", "../src/drivers/slack.ts"],
4
- "sourcesContent": ["import { 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 customDrivers = 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 = {}) => {\n await 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 return err\n}\n\n/**\n *\n * @todo make function\n * @param problem\n */\nexport const reportProblem = async (problem: import('@driveflux/problem').Problem) => {\n await 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 return problem\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 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 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": ["omit", "ProblemSeverity", "ProblemSeverity", "omit"]
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
7
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@driveflux/reporter",
3
- "version": "5.0.8",
3
+ "version": "5.1.2",
4
4
  "type": "module",
5
5
  "exports": {
6
6
  "./package.json": "./package.json",
@@ -19,11 +19,11 @@
19
19
  "module": "dist/index.js",
20
20
  "types": "dist/index.d.ts",
21
21
  "dependencies": {
22
- "@driveflux/fetch": "6.0.6",
23
- "@driveflux/problem": "4.0.2",
24
- "@driveflux/redact": "4.0.2",
25
- "@driveflux/singleton": "1.0.2",
26
- "@driveflux/utils": "3.0.6",
22
+ "@driveflux/fetch": "6.0.8",
23
+ "@driveflux/problem": "4.0.3",
24
+ "@driveflux/redact": "4.0.3",
25
+ "@driveflux/singleton": "1.0.4",
26
+ "@driveflux/utils": "3.0.8",
27
27
  "@sentry/node": "^7.113.0",
28
28
  "flat": "6.0.1",
29
29
  "rollbar": "^2.26.4"