@duckbug/js 0.1.2 → 1.0.0

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.
Files changed (61) hide show
  1. package/README.md +348 -73
  2. package/dist/cjs/DuckBug/DuckBugHelper.cjs +136 -0
  3. package/dist/cjs/DuckBug/DuckBugProvider.cjs +82 -13
  4. package/dist/cjs/DuckBug/DuckBugService.cjs +158 -17
  5. package/dist/cjs/DuckBug/Pond.cjs +44 -0
  6. package/dist/cjs/DuckBug/ensureEventId.cjs +47 -0
  7. package/dist/cjs/DuckBug/finalizeIngestEvent.cjs +54 -0
  8. package/dist/cjs/DuckBug/index.cjs +18 -2
  9. package/dist/cjs/DuckBug/parseDuckBugDsn.cjs +82 -0
  10. package/dist/cjs/DuckBug/sanitizeIngestPayload.cjs +67 -0
  11. package/dist/cjs/DuckBug/stripIngestSections.cjs +43 -0
  12. package/dist/cjs/DuckBug/transportTypes.cjs +18 -0
  13. package/dist/cjs/SDK/DuckSDK.cjs +131 -12
  14. package/dist/cjs/SDK/index.cjs +5 -2
  15. package/dist/cjs/contract/index.cjs +18 -0
  16. package/dist/cjs/contract/ingestEvents.cjs +18 -0
  17. package/dist/cjs/index.cjs +24 -6
  18. package/dist/cjs/integrations/node.cjs +54 -0
  19. package/dist/cjs/sdkIdentity.cjs +47 -0
  20. package/dist/esm/DuckBug/DuckBugHelper.js +99 -0
  21. package/dist/esm/DuckBug/DuckBugProvider.js +82 -13
  22. package/dist/esm/DuckBug/DuckBugService.js +156 -15
  23. package/dist/esm/DuckBug/Pond.js +10 -0
  24. package/dist/esm/DuckBug/ensureEventId.js +13 -0
  25. package/dist/esm/DuckBug/finalizeIngestEvent.js +20 -0
  26. package/dist/esm/DuckBug/index.js +5 -1
  27. package/dist/esm/DuckBug/parseDuckBugDsn.js +36 -0
  28. package/dist/esm/DuckBug/sanitizeIngestPayload.js +33 -0
  29. package/dist/esm/DuckBug/stripIngestSections.js +9 -0
  30. package/dist/esm/DuckBug/transportTypes.js +0 -0
  31. package/dist/esm/SDK/DuckSDK.js +127 -11
  32. package/dist/esm/SDK/index.js +2 -2
  33. package/dist/esm/contract/index.js +0 -0
  34. package/dist/esm/contract/ingestEvents.js +0 -0
  35. package/dist/esm/index.js +2 -0
  36. package/dist/esm/integrations/node.js +20 -0
  37. package/dist/esm/sdkIdentity.js +7 -0
  38. package/dist/types/DuckBug/DuckBugConfig.d.ts +28 -0
  39. package/dist/types/DuckBug/DuckBugHelper.d.ts +22 -0
  40. package/dist/types/DuckBug/DuckBugProvider.d.ts +12 -1
  41. package/dist/types/DuckBug/DuckBugService.d.ts +30 -8
  42. package/dist/types/DuckBug/Log.d.ts +1 -7
  43. package/dist/types/DuckBug/Pond.d.ts +9 -0
  44. package/dist/types/DuckBug/ensureEventId.d.ts +4 -0
  45. package/dist/types/DuckBug/finalizeIngestEvent.d.ts +11 -0
  46. package/dist/types/DuckBug/index.d.ts +7 -1
  47. package/dist/types/DuckBug/parseDuckBugDsn.d.ts +17 -0
  48. package/dist/types/DuckBug/sanitizeIngestPayload.d.ts +4 -0
  49. package/dist/types/DuckBug/stripIngestSections.d.ts +4 -0
  50. package/dist/types/DuckBug/transportTypes.d.ts +7 -0
  51. package/dist/types/SDK/DuckSDK.d.ts +31 -4
  52. package/dist/types/SDK/Provider.d.ts +11 -3
  53. package/dist/types/SDK/index.d.ts +3 -2
  54. package/dist/types/contract/index.d.ts +1 -0
  55. package/dist/types/contract/ingestEvents.d.ts +58 -0
  56. package/dist/types/index.d.ts +2 -0
  57. package/dist/types/integrations/node.d.ts +12 -0
  58. package/dist/types/sdkIdentity.d.ts +7 -0
  59. package/package.json +23 -7
  60. package/schemas/error-event.schema.json +147 -0
  61. package/schemas/log-event.schema.json +126 -0
@@ -0,0 +1,43 @@
1
+ "use strict";
2
+ var __webpack_require__ = {};
3
+ (()=>{
4
+ __webpack_require__.d = (exports1, definition)=>{
5
+ for(var key in definition)if (__webpack_require__.o(definition, key) && !__webpack_require__.o(exports1, key)) Object.defineProperty(exports1, key, {
6
+ enumerable: true,
7
+ get: definition[key]
8
+ });
9
+ };
10
+ })();
11
+ (()=>{
12
+ __webpack_require__.o = (obj, prop)=>Object.prototype.hasOwnProperty.call(obj, prop);
13
+ })();
14
+ (()=>{
15
+ __webpack_require__.r = (exports1)=>{
16
+ if ('undefined' != typeof Symbol && Symbol.toStringTag) Object.defineProperty(exports1, Symbol.toStringTag, {
17
+ value: 'Module'
18
+ });
19
+ Object.defineProperty(exports1, '__esModule', {
20
+ value: true
21
+ });
22
+ };
23
+ })();
24
+ var __webpack_exports__ = {};
25
+ __webpack_require__.r(__webpack_exports__);
26
+ __webpack_require__.d(__webpack_exports__, {
27
+ stripIngestSections: ()=>stripIngestSections
28
+ });
29
+ function stripIngestSections(event, sections) {
30
+ if (void 0 === sections || 0 === sections.length) return event;
31
+ const o = {
32
+ ...event
33
+ };
34
+ for (const s of sections)delete o[s];
35
+ return o;
36
+ }
37
+ exports.stripIngestSections = __webpack_exports__.stripIngestSections;
38
+ for(var __webpack_i__ in __webpack_exports__)if (-1 === [
39
+ "stripIngestSections"
40
+ ].indexOf(__webpack_i__)) exports[__webpack_i__] = __webpack_exports__[__webpack_i__];
41
+ Object.defineProperty(exports, '__esModule', {
42
+ value: true
43
+ });
@@ -0,0 +1,18 @@
1
+ "use strict";
2
+ var __webpack_require__ = {};
3
+ (()=>{
4
+ __webpack_require__.r = (exports1)=>{
5
+ if ('undefined' != typeof Symbol && Symbol.toStringTag) Object.defineProperty(exports1, Symbol.toStringTag, {
6
+ value: 'Module'
7
+ });
8
+ Object.defineProperty(exports1, '__esModule', {
9
+ value: true
10
+ });
11
+ };
12
+ })();
13
+ var __webpack_exports__ = {};
14
+ __webpack_require__.r(__webpack_exports__);
15
+ for(var __webpack_i__ in __webpack_exports__)exports[__webpack_i__] = __webpack_exports__[__webpack_i__];
16
+ Object.defineProperty(exports, '__esModule', {
17
+ value: true
18
+ });
@@ -24,37 +24,156 @@ var __webpack_require__ = {};
24
24
  var __webpack_exports__ = {};
25
25
  __webpack_require__.r(__webpack_exports__);
26
26
  __webpack_require__.d(__webpack_exports__, {
27
- DuckSDK: ()=>DuckSDK
27
+ DuckSDK: ()=>DuckSDK,
28
+ Duck: ()=>Duck
28
29
  });
29
- const external_index_cjs_namespaceObject = require("./index.cjs");
30
+ const DuckBugHelper_cjs_namespaceObject = require("../DuckBug/DuckBugHelper.cjs");
31
+ const finalizeIngestEvent_cjs_namespaceObject = require("../DuckBug/finalizeIngestEvent.cjs");
32
+ const external_sdkIdentity_cjs_namespaceObject = require("../sdkIdentity.cjs");
33
+ const external_LogLevel_cjs_namespaceObject = require("./LogLevel.cjs");
34
+ const external_LogProvider_cjs_namespaceObject = require("./LogProvider.cjs");
35
+ function isPromiseLike(v) {
36
+ return null !== v && "object" == typeof v && "then" in v && "function" == typeof v.then;
37
+ }
30
38
  class DuckSDK {
31
39
  providers;
32
- constructor(providers, logProviderConfig){
40
+ scope = {};
41
+ beforeSendHook;
42
+ extraSensitiveKeys;
43
+ stripSections;
44
+ constructor(providers, logProviderConfig, options){
33
45
  this.providers = providers;
34
- new external_index_cjs_namespaceObject.LogProvider(providers, logProviderConfig);
46
+ this.beforeSendHook = options?.beforeSend;
47
+ this.extraSensitiveKeys = options?.extraSensitiveKeys;
48
+ this.stripSections = options?.stripSections;
49
+ new external_LogProvider_cjs_namespaceObject.LogProvider(providers, logProviderConfig);
50
+ }
51
+ setScope(scope) {
52
+ this.scope = {
53
+ ...this.scope,
54
+ ...scope
55
+ };
56
+ }
57
+ flush() {
58
+ return Promise.all(this.providers.map((p)=>{
59
+ const f = p.flush;
60
+ return f ? Promise.resolve(f.call(p)) : Promise.resolve();
61
+ })).then(()=>void 0);
35
62
  }
36
63
  log(tag, payload) {
37
- this.sendReportToPlugins(tag, external_index_cjs_namespaceObject.logLevel.DEBUG, payload);
64
+ this.emitLog(external_LogLevel_cjs_namespaceObject.logLevel.DEBUG, tag, payload);
38
65
  }
39
66
  error(tag, payload) {
40
- this.sendReportToPlugins(tag, external_index_cjs_namespaceObject.logLevel.DEBUG, payload);
67
+ this.emitLog(external_LogLevel_cjs_namespaceObject.logLevel.ERROR, tag, payload);
41
68
  }
42
69
  debug(tag, payload) {
43
- this.sendReportToPlugins(tag, external_index_cjs_namespaceObject.logLevel.DEBUG, payload);
70
+ this.emitLog(external_LogLevel_cjs_namespaceObject.logLevel.DEBUG, tag, payload);
44
71
  }
45
72
  warn(tag, payload) {
46
- this.sendReportToPlugins(tag, external_index_cjs_namespaceObject.logLevel.WARN, payload);
73
+ this.emitLog(external_LogLevel_cjs_namespaceObject.logLevel.WARN, tag, payload);
47
74
  }
48
75
  fatal(tag, payload) {
49
- this.sendReportToPlugins(tag, external_index_cjs_namespaceObject.logLevel.FATAL, payload);
76
+ this.emitLog(external_LogLevel_cjs_namespaceObject.logLevel.FATAL, tag, payload);
77
+ }
78
+ quack(tag, error) {
79
+ const time = Date.now();
80
+ const built = (0, DuckBugHelper_cjs_namespaceObject.processError)(error, tag, time);
81
+ const merged = this.mergeScope(built);
82
+ const finalized = (0, finalizeIngestEvent_cjs_namespaceObject.finalizeIngestEvent)(merged, {
83
+ extraSensitiveKeys: this.extraSensitiveKeys,
84
+ stripSections: this.stripSections
85
+ });
86
+ if (!this.beforeSendHook) {
87
+ for (const p of this.providers)p.sendError(finalized, {
88
+ skipPrivacyPipeline: true
89
+ });
90
+ return;
91
+ }
92
+ const arg = {
93
+ kind: "error",
94
+ event: finalized
95
+ };
96
+ const out = this.beforeSendHook(arg);
97
+ if (isPromiseLike(out)) return void out.then((resolved)=>{
98
+ const after = this.normalizeBeforeSendError(resolved, finalized);
99
+ if (null === after) return;
100
+ for (const p of this.providers)p.sendError(after, {
101
+ skipPrivacyPipeline: true
102
+ });
103
+ });
104
+ const after = this.normalizeBeforeSendError(out, finalized);
105
+ if (null === after) return;
106
+ for (const p of this.providers)p.sendError(after, {
107
+ skipPrivacyPipeline: true
108
+ });
109
+ }
110
+ normalizeBeforeSendLog(out, fallback) {
111
+ if (null === out) return null;
112
+ if (void 0 === out) return fallback;
113
+ return out;
50
114
  }
51
- quack() {}
52
- sendReportToPlugins(tag, level, payload) {
53
- this.providers.forEach((plugin)=>plugin.report(tag, level, payload));
115
+ normalizeBeforeSendError(out, fallback) {
116
+ if (null === out) return null;
117
+ if (void 0 === out) return fallback;
118
+ return out;
119
+ }
120
+ emitLog(level, message, payload) {
121
+ const event = this.mergeScope({
122
+ time: Date.now(),
123
+ level,
124
+ message,
125
+ platform: "node",
126
+ sdk: {
127
+ ...external_sdkIdentity_cjs_namespaceObject.SDK_IDENTITY
128
+ },
129
+ ...void 0 !== payload ? {
130
+ context: payload
131
+ } : {}
132
+ });
133
+ const finalized = (0, finalizeIngestEvent_cjs_namespaceObject.finalizeIngestEvent)(event, {
134
+ extraSensitiveKeys: this.extraSensitiveKeys,
135
+ stripSections: this.stripSections
136
+ });
137
+ if (!this.beforeSendHook) {
138
+ for (const p of this.providers)p.sendLog(finalized, {
139
+ skipPrivacyPipeline: true
140
+ });
141
+ return;
142
+ }
143
+ const arg = {
144
+ kind: "log",
145
+ event: finalized
146
+ };
147
+ const out = this.beforeSendHook(arg);
148
+ if (isPromiseLike(out)) return void out.then((resolved)=>{
149
+ const after = this.normalizeBeforeSendLog(resolved, finalized);
150
+ if (null === after) return;
151
+ for (const p of this.providers)p.sendLog(after, {
152
+ skipPrivacyPipeline: true
153
+ });
154
+ });
155
+ const after = this.normalizeBeforeSendLog(out, finalized);
156
+ if (null === after) return;
157
+ for (const p of this.providers)p.sendLog(after, {
158
+ skipPrivacyPipeline: true
159
+ });
160
+ }
161
+ mergeScope(event) {
162
+ return {
163
+ ...this.scope,
164
+ ...event
165
+ };
166
+ }
167
+ }
168
+ class Duck extends DuckSDK {
169
+ captureException(error, tag) {
170
+ this.quack(tag ?? "error", error);
54
171
  }
55
172
  }
173
+ exports.Duck = __webpack_exports__.Duck;
56
174
  exports.DuckSDK = __webpack_exports__.DuckSDK;
57
175
  for(var __webpack_i__ in __webpack_exports__)if (-1 === [
176
+ "Duck",
58
177
  "DuckSDK"
59
178
  ].indexOf(__webpack_i__)) exports[__webpack_i__] = __webpack_exports__[__webpack_i__];
60
179
  Object.defineProperty(exports, '__esModule', {
@@ -24,17 +24,20 @@ var __webpack_require__ = {};
24
24
  var __webpack_exports__ = {};
25
25
  __webpack_require__.r(__webpack_exports__);
26
26
  __webpack_require__.d(__webpack_exports__, {
27
- LogProvider: ()=>external_LogProvider_cjs_namespaceObject.LogProvider,
27
+ Duck: ()=>external_DuckSDK_cjs_namespaceObject.Duck,
28
28
  logLevel: ()=>external_LogLevel_cjs_namespaceObject.logLevel,
29
- DuckSDK: ()=>external_DuckSDK_cjs_namespaceObject.DuckSDK
29
+ DuckSDK: ()=>external_DuckSDK_cjs_namespaceObject.DuckSDK,
30
+ LogProvider: ()=>external_LogProvider_cjs_namespaceObject.LogProvider
30
31
  });
31
32
  const external_DuckSDK_cjs_namespaceObject = require("./DuckSDK.cjs");
32
33
  const external_LogLevel_cjs_namespaceObject = require("./LogLevel.cjs");
33
34
  const external_LogProvider_cjs_namespaceObject = require("./LogProvider.cjs");
35
+ exports.Duck = __webpack_exports__.Duck;
34
36
  exports.DuckSDK = __webpack_exports__.DuckSDK;
35
37
  exports.LogProvider = __webpack_exports__.LogProvider;
36
38
  exports.logLevel = __webpack_exports__.logLevel;
37
39
  for(var __webpack_i__ in __webpack_exports__)if (-1 === [
40
+ "Duck",
38
41
  "DuckSDK",
39
42
  "LogProvider",
40
43
  "logLevel"
@@ -0,0 +1,18 @@
1
+ "use strict";
2
+ var __webpack_require__ = {};
3
+ (()=>{
4
+ __webpack_require__.r = (exports1)=>{
5
+ if ('undefined' != typeof Symbol && Symbol.toStringTag) Object.defineProperty(exports1, Symbol.toStringTag, {
6
+ value: 'Module'
7
+ });
8
+ Object.defineProperty(exports1, '__esModule', {
9
+ value: true
10
+ });
11
+ };
12
+ })();
13
+ var __webpack_exports__ = {};
14
+ __webpack_require__.r(__webpack_exports__);
15
+ for(var __webpack_i__ in __webpack_exports__)exports[__webpack_i__] = __webpack_exports__[__webpack_i__];
16
+ Object.defineProperty(exports, '__esModule', {
17
+ value: true
18
+ });
@@ -0,0 +1,18 @@
1
+ "use strict";
2
+ var __webpack_require__ = {};
3
+ (()=>{
4
+ __webpack_require__.r = (exports1)=>{
5
+ if ('undefined' != typeof Symbol && Symbol.toStringTag) Object.defineProperty(exports1, Symbol.toStringTag, {
6
+ value: 'Module'
7
+ });
8
+ Object.defineProperty(exports1, '__esModule', {
9
+ value: true
10
+ });
11
+ };
12
+ })();
13
+ var __webpack_exports__ = {};
14
+ __webpack_require__.r(__webpack_exports__);
15
+ for(var __webpack_i__ in __webpack_exports__)exports[__webpack_i__] = __webpack_exports__[__webpack_i__];
16
+ Object.defineProperty(exports, '__esModule', {
17
+ value: true
18
+ });
@@ -5,6 +5,12 @@ var __webpack_modules__ = {
5
5
  },
6
6
  "./SDK": function(module) {
7
7
  module.exports = require("./SDK/index.cjs");
8
+ },
9
+ "./contract": function(module) {
10
+ module.exports = require("./contract/index.cjs");
11
+ },
12
+ "./integrations/node": function(module) {
13
+ module.exports = require("./integrations/node.cjs");
8
14
  }
9
15
  };
10
16
  var __webpack_module_cache__ = {};
@@ -50,16 +56,28 @@ function __webpack_require__(moduleId) {
50
56
  var __webpack_exports__ = {};
51
57
  (()=>{
52
58
  __webpack_require__.r(__webpack_exports__);
53
- var _DuckBug__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__("./DuckBug");
59
+ var _contract__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__("./contract");
60
+ var __WEBPACK_REEXPORT_OBJECT__ = {};
61
+ for(var __WEBPACK_IMPORT_KEY__ in _contract__WEBPACK_IMPORTED_MODULE_0__)if ("default" !== __WEBPACK_IMPORT_KEY__) __WEBPACK_REEXPORT_OBJECT__[__WEBPACK_IMPORT_KEY__] = (function(key) {
62
+ return _contract__WEBPACK_IMPORTED_MODULE_0__[key];
63
+ }).bind(0, __WEBPACK_IMPORT_KEY__);
64
+ __webpack_require__.d(__webpack_exports__, __WEBPACK_REEXPORT_OBJECT__);
65
+ var _DuckBug__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__("./DuckBug");
66
+ var __WEBPACK_REEXPORT_OBJECT__ = {};
67
+ for(var __WEBPACK_IMPORT_KEY__ in _DuckBug__WEBPACK_IMPORTED_MODULE_1__)if ("default" !== __WEBPACK_IMPORT_KEY__) __WEBPACK_REEXPORT_OBJECT__[__WEBPACK_IMPORT_KEY__] = (function(key) {
68
+ return _DuckBug__WEBPACK_IMPORTED_MODULE_1__[key];
69
+ }).bind(0, __WEBPACK_IMPORT_KEY__);
70
+ __webpack_require__.d(__webpack_exports__, __WEBPACK_REEXPORT_OBJECT__);
71
+ var _integrations_node__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__("./integrations/node");
54
72
  var __WEBPACK_REEXPORT_OBJECT__ = {};
55
- for(var __WEBPACK_IMPORT_KEY__ in _DuckBug__WEBPACK_IMPORTED_MODULE_0__)if ("default" !== __WEBPACK_IMPORT_KEY__) __WEBPACK_REEXPORT_OBJECT__[__WEBPACK_IMPORT_KEY__] = (function(key) {
56
- return _DuckBug__WEBPACK_IMPORTED_MODULE_0__[key];
73
+ for(var __WEBPACK_IMPORT_KEY__ in _integrations_node__WEBPACK_IMPORTED_MODULE_2__)if ("default" !== __WEBPACK_IMPORT_KEY__) __WEBPACK_REEXPORT_OBJECT__[__WEBPACK_IMPORT_KEY__] = (function(key) {
74
+ return _integrations_node__WEBPACK_IMPORTED_MODULE_2__[key];
57
75
  }).bind(0, __WEBPACK_IMPORT_KEY__);
58
76
  __webpack_require__.d(__webpack_exports__, __WEBPACK_REEXPORT_OBJECT__);
59
- var _SDK__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__("./SDK");
77
+ var _SDK__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__("./SDK");
60
78
  var __WEBPACK_REEXPORT_OBJECT__ = {};
61
- for(var __WEBPACK_IMPORT_KEY__ in _SDK__WEBPACK_IMPORTED_MODULE_1__)if ("default" !== __WEBPACK_IMPORT_KEY__) __WEBPACK_REEXPORT_OBJECT__[__WEBPACK_IMPORT_KEY__] = (function(key) {
62
- return _SDK__WEBPACK_IMPORTED_MODULE_1__[key];
79
+ for(var __WEBPACK_IMPORT_KEY__ in _SDK__WEBPACK_IMPORTED_MODULE_3__)if ("default" !== __WEBPACK_IMPORT_KEY__) __WEBPACK_REEXPORT_OBJECT__[__WEBPACK_IMPORT_KEY__] = (function(key) {
80
+ return _SDK__WEBPACK_IMPORTED_MODULE_3__[key];
63
81
  }).bind(0, __WEBPACK_IMPORT_KEY__);
64
82
  __webpack_require__.d(__webpack_exports__, __WEBPACK_REEXPORT_OBJECT__);
65
83
  })();
@@ -0,0 +1,54 @@
1
+ "use strict";
2
+ var __webpack_require__ = {};
3
+ (()=>{
4
+ __webpack_require__.d = (exports1, definition)=>{
5
+ for(var key in definition)if (__webpack_require__.o(definition, key) && !__webpack_require__.o(exports1, key)) Object.defineProperty(exports1, key, {
6
+ enumerable: true,
7
+ get: definition[key]
8
+ });
9
+ };
10
+ })();
11
+ (()=>{
12
+ __webpack_require__.o = (obj, prop)=>Object.prototype.hasOwnProperty.call(obj, prop);
13
+ })();
14
+ (()=>{
15
+ __webpack_require__.r = (exports1)=>{
16
+ if ('undefined' != typeof Symbol && Symbol.toStringTag) Object.defineProperty(exports1, Symbol.toStringTag, {
17
+ value: 'Module'
18
+ });
19
+ Object.defineProperty(exports1, '__esModule', {
20
+ value: true
21
+ });
22
+ };
23
+ })();
24
+ var __webpack_exports__ = {};
25
+ __webpack_require__.r(__webpack_exports__);
26
+ __webpack_require__.d(__webpack_exports__, {
27
+ registerNodeGlobalErrorHandlers: ()=>registerNodeGlobalErrorHandlers
28
+ });
29
+ function registerNodeGlobalErrorHandlers(options) {
30
+ const rejectionTag = options.rejectionTag ?? "unhandledRejection";
31
+ const exceptionTag = options.exceptionTag ?? "uncaughtException";
32
+ const onRejection = (reason)=>{
33
+ const err = reason instanceof Error ? reason : new Error("string" == typeof reason ? reason : JSON.stringify(reason));
34
+ options.duck.quack(rejectionTag, err);
35
+ options.duck.flush();
36
+ };
37
+ const onException = (err)=>{
38
+ options.duck.quack(exceptionTag, err);
39
+ options.duck.flush();
40
+ };
41
+ process.on("unhandledRejection", onRejection);
42
+ process.on("uncaughtException", onException);
43
+ return ()=>{
44
+ process.off("unhandledRejection", onRejection);
45
+ process.off("uncaughtException", onException);
46
+ };
47
+ }
48
+ exports.registerNodeGlobalErrorHandlers = __webpack_exports__.registerNodeGlobalErrorHandlers;
49
+ for(var __webpack_i__ in __webpack_exports__)if (-1 === [
50
+ "registerNodeGlobalErrorHandlers"
51
+ ].indexOf(__webpack_i__)) exports[__webpack_i__] = __webpack_exports__[__webpack_i__];
52
+ Object.defineProperty(exports, '__esModule', {
53
+ value: true
54
+ });
@@ -0,0 +1,47 @@
1
+ "use strict";
2
+ var __webpack_require__ = {};
3
+ (()=>{
4
+ __webpack_require__.d = (exports1, definition)=>{
5
+ for(var key in definition)if (__webpack_require__.o(definition, key) && !__webpack_require__.o(exports1, key)) Object.defineProperty(exports1, key, {
6
+ enumerable: true,
7
+ get: definition[key]
8
+ });
9
+ };
10
+ })();
11
+ (()=>{
12
+ __webpack_require__.o = (obj, prop)=>Object.prototype.hasOwnProperty.call(obj, prop);
13
+ })();
14
+ (()=>{
15
+ __webpack_require__.r = (exports1)=>{
16
+ if ('undefined' != typeof Symbol && Symbol.toStringTag) Object.defineProperty(exports1, Symbol.toStringTag, {
17
+ value: 'Module'
18
+ });
19
+ Object.defineProperty(exports1, '__esModule', {
20
+ value: true
21
+ });
22
+ };
23
+ })();
24
+ var __webpack_exports__ = {};
25
+ __webpack_require__.r(__webpack_exports__);
26
+ __webpack_require__.d(__webpack_exports__, {
27
+ SDK_IDENTITY: ()=>SDK_IDENTITY,
28
+ SDK_NAME: ()=>SDK_NAME,
29
+ SDK_VERSION: ()=>SDK_VERSION
30
+ });
31
+ const SDK_NAME = "@duckbug/js";
32
+ const SDK_VERSION = "0.1.3";
33
+ const SDK_IDENTITY = {
34
+ name: SDK_NAME,
35
+ version: SDK_VERSION
36
+ };
37
+ exports.SDK_IDENTITY = __webpack_exports__.SDK_IDENTITY;
38
+ exports.SDK_NAME = __webpack_exports__.SDK_NAME;
39
+ exports.SDK_VERSION = __webpack_exports__.SDK_VERSION;
40
+ for(var __webpack_i__ in __webpack_exports__)if (-1 === [
41
+ "SDK_IDENTITY",
42
+ "SDK_NAME",
43
+ "SDK_VERSION"
44
+ ].indexOf(__webpack_i__)) exports[__webpack_i__] = __webpack_exports__[__webpack_i__];
45
+ Object.defineProperty(exports, '__esModule', {
46
+ value: true
47
+ });
@@ -0,0 +1,99 @@
1
+ import { SDK_IDENTITY } from "../sdkIdentity.js";
2
+ function tryJsonObjectFromMessage(message) {
3
+ const trimmed = message.trim();
4
+ if (!trimmed.startsWith("{") && !trimmed.startsWith("[")) return null;
5
+ try {
6
+ const v = JSON.parse(message);
7
+ if (null !== v && "object" == typeof v) return v;
8
+ } catch {}
9
+ return null;
10
+ }
11
+ function parseStacktrace(stack) {
12
+ let file = "unknown";
13
+ let line = 0;
14
+ let stacktrace;
15
+ if (stack) {
16
+ const stackLines = stack.split("\n");
17
+ let firstStackLineWithFile = null;
18
+ for(let i = 1; i < stackLines.length; i++){
19
+ const lineStr = stackLines[i];
20
+ if (-1 !== lineStr.indexOf("at ") && (-1 !== lineStr.indexOf(":") || -1 !== lineStr.indexOf("("))) {
21
+ firstStackLineWithFile = lineStr;
22
+ break;
23
+ }
24
+ }
25
+ if (firstStackLineWithFile) {
26
+ const match = firstStackLineWithFile.match(/\(([^)]+):(\d+):(\d+)\)/) || firstStackLineWithFile.match(/at\s+.*?\(([^)]+):(\d+):(\d+)\)/) || firstStackLineWithFile.match(/([^:()\s]+):(\d+):(\d+)/);
27
+ if (match?.[1]) {
28
+ file = match[1].replace(/^file:\/\//, "").replace(/^\/+/, "");
29
+ line = parseInt(match[2] || "0", 10);
30
+ }
31
+ }
32
+ stacktrace = {
33
+ raw: stack,
34
+ frames: stackLines.filter((lineStr)=>lineStr.trim()).map((lineStr, index)=>({
35
+ index,
36
+ content: lineStr.trim()
37
+ }))
38
+ };
39
+ } else {
40
+ stacktrace = {
41
+ raw: "",
42
+ frames: []
43
+ };
44
+ file = "unknown";
45
+ line = 0;
46
+ }
47
+ return {
48
+ file,
49
+ line,
50
+ stacktrace
51
+ };
52
+ }
53
+ function parseContext(contextStr) {
54
+ if (!contextStr) return null;
55
+ try {
56
+ return JSON.parse(contextStr);
57
+ } catch {
58
+ return {
59
+ message: contextStr
60
+ };
61
+ }
62
+ }
63
+ function parseError(error) {
64
+ const { file, line, stacktrace } = parseStacktrace(error.stack);
65
+ const context = parseContext(error.message);
66
+ return {
67
+ file,
68
+ line,
69
+ stacktrace,
70
+ context
71
+ };
72
+ }
73
+ function processError(error, tag, time) {
74
+ const parsed = parseError(error);
75
+ const message = "string" == typeof error.message && error.message.length > 0 ? error.message : "Error";
76
+ const event = {
77
+ time,
78
+ message,
79
+ stacktrace: parsed.stacktrace,
80
+ stacktraceAsString: error.stack ?? "",
81
+ file: parsed.file,
82
+ line: parsed.line,
83
+ exception: {
84
+ type: error.name,
85
+ message: error.message
86
+ },
87
+ platform: "node",
88
+ sdk: {
89
+ ...SDK_IDENTITY
90
+ }
91
+ };
92
+ if (tag.length > 0) event.dTags = [
93
+ tag
94
+ ];
95
+ const fromJson = tryJsonObjectFromMessage(error.message);
96
+ if (fromJson) event.extra = fromJson;
97
+ return event;
98
+ }
99
+ export { parseError, processError };
@@ -1,48 +1,117 @@
1
1
  import { logLevel } from "../SDK/index.js";
2
+ import { processError } from "./DuckBugHelper.js";
2
3
  import { DuckBugService } from "./DuckBugService.js";
4
+ import { finalizeIngestEvent } from "./finalizeIngestEvent.js";
3
5
  class DuckBugProvider {
4
6
  service;
7
+ ingestConfig;
5
8
  constructor(config){
9
+ this.ingestConfig = config;
6
10
  this.service = new DuckBugService(config);
7
11
  }
12
+ static fromDSN(dsn) {
13
+ return new DuckBugProvider({
14
+ dsn
15
+ });
16
+ }
17
+ flush() {
18
+ return this.service.flush();
19
+ }
20
+ sendLog(event, meta) {
21
+ if (meta?.skipPrivacyPipeline) return void this.service.sendLog(event);
22
+ if (this.ingestConfig.beforeSend) return void this.sendLogAsync(event, meta);
23
+ const prepared = finalizeIngestEvent(event, {
24
+ extraSensitiveKeys: this.ingestConfig.extraSensitiveKeys,
25
+ stripSections: this.ingestConfig.stripSections
26
+ });
27
+ this.service.sendLog(prepared);
28
+ }
29
+ sendError(event, meta) {
30
+ if (meta?.skipPrivacyPipeline) return void this.service.sendError(event);
31
+ if (this.ingestConfig.beforeSend) return void this.sendErrorAsync(event, meta);
32
+ const prepared = finalizeIngestEvent(event, {
33
+ extraSensitiveKeys: this.ingestConfig.extraSensitiveKeys,
34
+ stripSections: this.ingestConfig.stripSections
35
+ });
36
+ this.service.sendError(prepared);
37
+ }
38
+ async sendLogAsync(event, _meta) {
39
+ const prepared = finalizeIngestEvent(event, {
40
+ extraSensitiveKeys: this.ingestConfig.extraSensitiveKeys,
41
+ stripSections: this.ingestConfig.stripSections
42
+ });
43
+ const r = await this.ingestConfig.beforeSend?.({
44
+ kind: "log",
45
+ event: prepared
46
+ });
47
+ if (null === r) return;
48
+ const toSend = r ?? prepared;
49
+ this.service.sendLog(toSend);
50
+ }
51
+ async sendErrorAsync(event, _meta) {
52
+ const prepared = finalizeIngestEvent(event, {
53
+ extraSensitiveKeys: this.ingestConfig.extraSensitiveKeys,
54
+ stripSections: this.ingestConfig.stripSections
55
+ });
56
+ const r = await this.ingestConfig.beforeSend?.({
57
+ kind: "error",
58
+ event: prepared
59
+ });
60
+ if (null === r) return;
61
+ const toSend = r ?? prepared;
62
+ this.service.sendError(toSend);
63
+ }
8
64
  warn(...args) {
9
- this.service.sendLog({
65
+ this.sendLog({
10
66
  time: this.getTimeStamp(),
11
67
  level: logLevel.WARN,
12
68
  message: this.convertArgsToString(args[0]),
13
- context: this.convertArgsToString(args.slice(1))
69
+ ...this.normalizedContextPayload(args.slice(1))
14
70
  });
15
71
  }
16
72
  error(...args) {
17
- this.service.sendLog({
73
+ this.sendLog({
18
74
  time: this.getTimeStamp(),
19
75
  level: logLevel.ERROR,
20
76
  message: this.convertArgsToString(args[0]),
21
- context: this.convertArgsToString(args.slice(1))
77
+ ...this.normalizedContextPayload(args.slice(1))
22
78
  });
23
79
  }
24
80
  log(...args) {
25
- this.service.sendLog({
81
+ this.sendLog({
26
82
  time: this.getTimeStamp(),
27
83
  level: logLevel.INFO,
28
84
  message: this.convertArgsToString(args[0]),
29
- context: this.convertArgsToString(args.slice(1))
85
+ ...this.normalizedContextPayload(args.slice(1))
30
86
  });
31
87
  }
32
88
  report(tag, level, payload) {
33
- this.service.sendLog({
89
+ this.sendLog({
34
90
  time: this.getTimeStamp(),
35
91
  level,
36
92
  message: tag,
37
- context: JSON.stringify(payload)
93
+ ...void 0 !== payload ? {
94
+ context: payload
95
+ } : {}
38
96
  });
39
97
  }
40
98
  quack(tag, error) {
41
- this.service.sendError({
42
- stack: error.stack,
43
- message: tag,
44
- context: error.message
45
- });
99
+ const errorRequest = processError(error, tag, this.getTimeStamp());
100
+ this.sendError(errorRequest);
101
+ }
102
+ normalizedContextPayload(rest) {
103
+ if (0 === rest.length) return {};
104
+ if (1 === rest.length) {
105
+ const v = rest[0];
106
+ return {
107
+ context: v
108
+ };
109
+ }
110
+ return {
111
+ context: {
112
+ args: rest
113
+ }
114
+ };
46
115
  }
47
116
  convertArgsToString(...args) {
48
117
  return args.map((arg)=>"object" == typeof arg ? JSON.stringify(arg) : String(arg)).join(" ");