@honeybadger-io/js 6.6.1 → 6.7.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.
@@ -1,22 +1,22 @@
1
1
  'use strict';
2
2
 
3
- var require$$0$1 = require('os');
3
+ var require$$0$2 = require('os');
4
4
  var require$$1$1 = require('domain');
5
5
  var require$$1 = require('fs');
6
6
  var require$$2 = require('util');
7
7
  var require$$3 = require('cosmiconfig');
8
- var require$$0$2 = require('url');
8
+ var require$$0$3 = require('url');
9
9
  var require$$3$1 = require('http');
10
10
  var require$$4 = require('https');
11
11
 
12
12
  function _interopDefaultLegacy (e) { return e && typeof e === 'object' && 'default' in e ? e : { 'default': e }; }
13
13
 
14
- var require$$0__default = /*#__PURE__*/_interopDefaultLegacy(require$$0$1);
14
+ var require$$0__default = /*#__PURE__*/_interopDefaultLegacy(require$$0$2);
15
15
  var require$$1__default$1 = /*#__PURE__*/_interopDefaultLegacy(require$$1$1);
16
16
  var require$$1__default = /*#__PURE__*/_interopDefaultLegacy(require$$1);
17
17
  var require$$2__default = /*#__PURE__*/_interopDefaultLegacy(require$$2);
18
18
  var require$$3__default = /*#__PURE__*/_interopDefaultLegacy(require$$3);
19
- var require$$0__default$1 = /*#__PURE__*/_interopDefaultLegacy(require$$0$2);
19
+ var require$$0__default$1 = /*#__PURE__*/_interopDefaultLegacy(require$$0$3);
20
20
  var require$$3__default$1 = /*#__PURE__*/_interopDefaultLegacy(require$$3$1);
21
21
  var require$$4__default = /*#__PURE__*/_interopDefaultLegacy(require$$4);
22
22
 
@@ -195,7 +195,7 @@ var stackTraceParser_esm = /*#__PURE__*/Object.freeze({
195
195
  parse: parse
196
196
  });
197
197
 
198
- var require$$0 = /*@__PURE__*/getAugmentedNamespace(stackTraceParser_esm);
198
+ var require$$0$1 = /*@__PURE__*/getAugmentedNamespace(stackTraceParser_esm);
199
199
 
200
200
  (function (exports) {
201
201
  var __createBinding = (commonjsGlobal && commonjsGlobal.__createBinding) || (Object.create ? (function(o, m, k, k2) {
@@ -258,8 +258,9 @@ var require$$0 = /*@__PURE__*/getAugmentedNamespace(stackTraceParser_esm);
258
258
  }
259
259
  };
260
260
  Object.defineProperty(exports, "__esModule", { value: true });
261
- exports.isBrowserConfig = exports.clone = exports.formatCGIData = exports.filterUrl = exports.filter = exports.generateStackTrace = exports.endpoint = exports.instrument = exports.isErrorObject = exports.makeNotice = exports.logger = exports.sanitize = exports.shallowClone = exports.runAfterNotifyHandlers = exports.runBeforeNotifyHandlers = exports.getSourceForBacktrace = exports.getCauses = exports.calculateBacktraceShift = exports.DEFAULT_BACKTRACE_SHIFT = exports.makeBacktrace = exports.objectIsExtensible = exports.objectIsEmpty = exports.mergeNotice = exports.merge = void 0;
262
- var stackTraceParser = __importStar(require$$0);
261
+ exports.isBrowserConfig = exports.clone = exports.formatCGIData = exports.filterUrl = exports.filter = exports.generateStackTrace = exports.endpoint = exports.instrumentConsole = exports.instrument = exports.isErrorObject = exports.makeNotice = exports.logger = exports.sanitize = exports.shallowClone = exports.runAfterNotifyHandlers = exports.runBeforeNotifyHandlers = exports.getSourceForBacktrace = exports.getCauses = exports.calculateBacktraceShift = exports.DEFAULT_BACKTRACE_SHIFT = exports.makeBacktrace = exports.objectIsExtensible = exports.objectIsEmpty = exports.mergeNotice = exports.merge = void 0;
262
+ /* eslint-disable prefer-rest-params */
263
+ var stackTraceParser = __importStar(require$$0$1);
263
264
  function merge(obj1, obj2) {
264
265
  var result = {};
265
266
  for (var k in obj1) {
@@ -619,6 +620,39 @@ var require$$0 = /*@__PURE__*/getAugmentedNamespace(stackTraceParser_esm);
619
620
  }
620
621
  }
621
622
  exports.instrument = instrument;
623
+ var _consoleAlreadyInstrumented = false;
624
+ var listeners = [];
625
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
626
+ function instrumentConsole(_window, handler) {
627
+ if (!_window || !_window.console || !handler) {
628
+ return;
629
+ }
630
+ listeners.push(handler);
631
+ if (_consoleAlreadyInstrumented) {
632
+ return;
633
+ }
634
+ _consoleAlreadyInstrumented = true;
635
+ ['debug', 'info', 'warn', 'error', 'log'].forEach(function (level) {
636
+ instrument(_window.console, level, function hbLogger(original) {
637
+ return function () {
638
+ var args = Array.prototype.slice.call(arguments);
639
+ listeners.forEach(function (listener) {
640
+ try {
641
+ listener(level, args);
642
+ }
643
+ catch (_e) {
644
+ // ignore
645
+ // should never reach here because instrument method already wraps with try/catch block
646
+ }
647
+ });
648
+ if (typeof original === 'function') {
649
+ Function.prototype.apply.call(original, _window.console, arguments);
650
+ }
651
+ };
652
+ });
653
+ });
654
+ }
655
+ exports.instrumentConsole = instrumentConsole;
622
656
  function endpoint(base, path) {
623
657
  var endpoint = base.trim().replace(/\/$/, '');
624
658
  path = path.trim().replace(/(^\/|\/$)/g, '');
@@ -772,7 +806,7 @@ var store = {};
772
806
 
773
807
  Object.defineProperty(store, "__esModule", { value: true });
774
808
  store.GlobalStore = void 0;
775
- var util_1$5 = util$1;
809
+ var util_1$6 = util$1;
776
810
  var GlobalStore = /** @class */ (function () {
777
811
  function GlobalStore(contents, breadcrumbsLimit) {
778
812
  this.contents = contents;
@@ -789,7 +823,7 @@ var GlobalStore = /** @class */ (function () {
789
823
  return JSON.parse(JSON.stringify(value));
790
824
  };
791
825
  GlobalStore.prototype.setContext = function (context) {
792
- this.contents.context = (0, util_1$5.merge)(this.contents.context, context || {});
826
+ this.contents.context = (0, util_1$6.merge)(this.contents.context, context || {});
793
827
  };
794
828
  GlobalStore.prototype.addBreadcrumb = function (breadcrumb) {
795
829
  if (this.contents.breadcrumbs.length == this.breadcrumbsLimit) {
@@ -808,6 +842,195 @@ var GlobalStore = /** @class */ (function () {
808
842
  }());
809
843
  store.GlobalStore = GlobalStore;
810
844
 
845
+ var throttled_events_logger = {};
846
+
847
+ class NdJson {
848
+ static parse(data) {
849
+ const lines = data.trim().split('\n');
850
+ return lines.map(line => JSON.parse(line));
851
+ }
852
+ static stringify(data) {
853
+ return data.map(item => JSON.stringify(item)).join('\n');
854
+ }
855
+ }
856
+
857
+ var module$1 = /*#__PURE__*/Object.freeze({
858
+ __proto__: null,
859
+ NdJson: NdJson
860
+ });
861
+
862
+ var require$$0 = /*@__PURE__*/getAugmentedNamespace(module$1);
863
+
864
+ var defaults = {};
865
+
866
+ Object.defineProperty(defaults, "__esModule", { value: true });
867
+ defaults.CONFIG = void 0;
868
+ defaults.CONFIG = {
869
+ apiKey: null,
870
+ endpoint: 'https://api.honeybadger.io',
871
+ environment: null,
872
+ hostname: null,
873
+ projectRoot: null,
874
+ component: null,
875
+ action: null,
876
+ revision: null,
877
+ reportData: null,
878
+ breadcrumbsEnabled: true,
879
+ eventsEnabled: false,
880
+ maxBreadcrumbs: 40,
881
+ maxObjectDepth: 8,
882
+ logger: console,
883
+ developmentEnvironments: ['dev', 'development', 'test'],
884
+ debug: false,
885
+ tags: null,
886
+ enableUncaught: true,
887
+ enableUnhandledRejection: true,
888
+ afterUncaught: function () { return true; },
889
+ filters: ['creditcard', 'password'],
890
+ __plugins: [],
891
+ };
892
+
893
+ var __assign$2 = (commonjsGlobal && commonjsGlobal.__assign) || function () {
894
+ __assign$2 = Object.assign || function(t) {
895
+ for (var s, i = 1, n = arguments.length; i < n; i++) {
896
+ s = arguments[i];
897
+ for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p))
898
+ t[p] = s[p];
899
+ }
900
+ return t;
901
+ };
902
+ return __assign$2.apply(this, arguments);
903
+ };
904
+ var __awaiter$3 = (commonjsGlobal && commonjsGlobal.__awaiter) || function (thisArg, _arguments, P, generator) {
905
+ function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
906
+ return new (P || (P = Promise))(function (resolve, reject) {
907
+ function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
908
+ function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
909
+ function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
910
+ step((generator = generator.apply(thisArg, _arguments || [])).next());
911
+ });
912
+ };
913
+ var __generator$3 = (commonjsGlobal && commonjsGlobal.__generator) || function (thisArg, body) {
914
+ var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g;
915
+ return g = { next: verb(0), "throw": verb(1), "return": verb(2) }, typeof Symbol === "function" && (g[Symbol.iterator] = function() { return this; }), g;
916
+ function verb(n) { return function (v) { return step([n, v]); }; }
917
+ function step(op) {
918
+ if (f) throw new TypeError("Generator is already executing.");
919
+ while (_) try {
920
+ if (f = 1, y && (t = op[0] & 2 ? y["return"] : op[0] ? y["throw"] || ((t = y["return"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t;
921
+ if (y = 0, t) op = [op[0] & 2, t.value];
922
+ switch (op[0]) {
923
+ case 0: case 1: t = op; break;
924
+ case 4: _.label++; return { value: op[1], done: false };
925
+ case 5: _.label++; y = op[1]; op = [0]; continue;
926
+ case 7: op = _.ops.pop(); _.trys.pop(); continue;
927
+ default:
928
+ if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }
929
+ if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }
930
+ if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }
931
+ if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }
932
+ if (t[2]) _.ops.pop();
933
+ _.trys.pop(); continue;
934
+ }
935
+ op = body.call(thisArg, _);
936
+ } catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }
937
+ if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };
938
+ }
939
+ };
940
+ Object.defineProperty(throttled_events_logger, "__esModule", { value: true });
941
+ throttled_events_logger.ThrottledEventsLogger = void 0;
942
+ var json_nd_1 = require$$0;
943
+ var util_1$5 = util$1;
944
+ var defaults_1$1 = defaults;
945
+ var ThrottledEventsLogger = /** @class */ (function () {
946
+ function ThrottledEventsLogger(config, transport) {
947
+ this.config = config;
948
+ this.transport = transport;
949
+ this.queue = [];
950
+ this.isProcessing = false;
951
+ this.config = __assign$2(__assign$2({}, defaults_1$1.CONFIG), config);
952
+ this.logger = this.originalLogger();
953
+ }
954
+ ThrottledEventsLogger.prototype.logEvent = function (data) {
955
+ this.queue.push(data);
956
+ if (!this.isProcessing) {
957
+ this.processQueue();
958
+ }
959
+ };
960
+ ThrottledEventsLogger.prototype.processQueue = function () {
961
+ var _this = this;
962
+ if (this.queue.length === 0 || this.isProcessing) {
963
+ return;
964
+ }
965
+ this.isProcessing = true;
966
+ var eventsData = this.queue.slice();
967
+ this.queue = [];
968
+ var data = json_nd_1.NdJson.stringify(eventsData);
969
+ this.makeHttpRequest(data)
970
+ .then(function () {
971
+ setTimeout(function () {
972
+ _this.isProcessing = false;
973
+ _this.processQueue();
974
+ }, 50);
975
+ })
976
+ .catch(function (error) {
977
+ _this.logger.error('[Honeybadger] Error making HTTP request:', error);
978
+ // Continue processing the queue even if there's an error
979
+ setTimeout(function () {
980
+ _this.isProcessing = false;
981
+ _this.processQueue();
982
+ }, 50);
983
+ });
984
+ };
985
+ ThrottledEventsLogger.prototype.makeHttpRequest = function (data) {
986
+ return __awaiter$3(this, void 0, void 0, function () {
987
+ var _this = this;
988
+ return __generator$3(this, function (_a) {
989
+ return [2 /*return*/, this.transport
990
+ .send({
991
+ headers: {
992
+ 'X-API-Key': this.config.apiKey,
993
+ 'Content-Type': 'application/json',
994
+ },
995
+ method: 'POST',
996
+ endpoint: (0, util_1$5.endpoint)(this.config.endpoint, '/v1/events'),
997
+ maxObjectDepth: this.config.maxObjectDepth,
998
+ logger: this.logger,
999
+ }, data)
1000
+ .then(function () {
1001
+ if (_this.config.debug) {
1002
+ _this.logger.debug('[Honeybadger] Events sent successfully');
1003
+ }
1004
+ })
1005
+ .catch(function (err) {
1006
+ _this.logger.error("[Honeybadger] Error sending events: ".concat(err.message));
1007
+ })];
1008
+ });
1009
+ });
1010
+ };
1011
+ /**
1012
+ * The EventsLogger overrides the console methods
1013
+ * so if we want to log something we need to use the original methods
1014
+ */
1015
+ ThrottledEventsLogger.prototype.originalLogger = function () {
1016
+ var _a, _b, _c, _d, _e;
1017
+ return {
1018
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
1019
+ log: (_a = console.log.__hb_original) !== null && _a !== void 0 ? _a : console.log,
1020
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
1021
+ info: (_b = console.info.__hb_original) !== null && _b !== void 0 ? _b : console.info,
1022
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
1023
+ debug: (_c = console.debug.__hb_original) !== null && _c !== void 0 ? _c : console.debug,
1024
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
1025
+ warn: (_d = console.warn.__hb_original) !== null && _d !== void 0 ? _d : console.warn,
1026
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
1027
+ error: (_e = console.error.__hb_original) !== null && _e !== void 0 ? _e : console.error,
1028
+ };
1029
+ };
1030
+ return ThrottledEventsLogger;
1031
+ }());
1032
+ throttled_events_logger.ThrottledEventsLogger = ThrottledEventsLogger;
1033
+
811
1034
  var __assign$1 = (commonjsGlobal && commonjsGlobal.__assign) || function () {
812
1035
  __assign$1 = Object.assign || function(t) {
813
1036
  for (var s, i = 1, n = arguments.length; i < n; i++) {
@@ -859,6 +1082,8 @@ Object.defineProperty(client$1, "__esModule", { value: true });
859
1082
  client$1.Client = void 0;
860
1083
  var util_1$4 = util$1;
861
1084
  var store_1 = store;
1085
+ var throttled_events_logger_1 = throttled_events_logger;
1086
+ var defaults_1 = defaults;
862
1087
  // Split at commas and spaces
863
1088
  var TAG_SEPARATOR = /,|\s+/;
864
1089
  // Checks for non-blank characters
@@ -873,11 +1098,12 @@ var Client = /** @class */ (function () {
873
1098
  this.__notifier = {
874
1099
  name: '@honeybadger-io/core',
875
1100
  url: 'https://github.com/honeybadger-io/honeybadger-js/tree/master/packages/core',
876
- version: '6.6.1'
1101
+ version: '6.7.0'
877
1102
  };
878
- this.config = __assign$1({ apiKey: null, endpoint: 'https://api.honeybadger.io', environment: null, hostname: null, projectRoot: null, component: null, action: null, revision: null, reportData: null, breadcrumbsEnabled: true, maxBreadcrumbs: 40, maxObjectDepth: 8, logger: console, developmentEnvironments: ['dev', 'development', 'test'], debug: false, tags: null, enableUncaught: true, enableUnhandledRejection: true, afterUncaught: function () { return true; }, filters: ['creditcard', 'password'], __plugins: [] }, opts);
1103
+ this.config = __assign$1(__assign$1({}, defaults_1.CONFIG), opts);
879
1104
  this.__initStore();
880
1105
  this.__transport = transport;
1106
+ this.__eventsLogger = new throttled_events_logger_1.ThrottledEventsLogger(this.config, this.__transport);
881
1107
  this.logger = (0, util_1$4.logger)(this);
882
1108
  }
883
1109
  Client.prototype.getVersion = function () {
@@ -1075,6 +1301,9 @@ var Client = /** @class */ (function () {
1075
1301
  });
1076
1302
  return this;
1077
1303
  };
1304
+ Client.prototype.logEvent = function (data) {
1305
+ this.__eventsLogger.logEvent(data);
1306
+ };
1078
1307
  Client.prototype.__getBreadcrumbs = function () {
1079
1308
  return this.__store.getContents('breadcrumbs').slice();
1080
1309
  };
@@ -1827,7 +2056,8 @@ var ServerTransport = /** @class */ (function () {
1827
2056
  };
1828
2057
  var data = undefined;
1829
2058
  if (payload) {
1830
- data = Buffer.from(JSON.stringify(sanitize(payload, options.maxObjectDepth)), 'utf8');
2059
+ var dataStr = typeof payload === 'string' ? payload : JSON.stringify(sanitize(payload, options.maxObjectDepth));
2060
+ data = Buffer.from(dataStr, 'utf8');
1831
2061
  httpOptions.headers['Content-Length'] = data.length;
1832
2062
  }
1833
2063
  var req = transport.request(httpOptions, function (res) {
@@ -2373,7 +2603,9 @@ client.CheckInsClient = CheckInsClient;
2373
2603
  if (opts === void 0) { opts = {}; }
2374
2604
  var _this = this;
2375
2605
  var _a;
2376
- var transport = new transport_1.ServerTransport();
2606
+ var transport = new transport_1.ServerTransport({
2607
+ 'User-Agent': userAgent(),
2608
+ });
2377
2609
  _this = _super.call(this, __assign({ projectRoot: process.cwd(), hostname: os_1.default.hostname() }, opts), transport) || this;
2378
2610
  /** @internal */
2379
2611
  _this.__beforeNotifyHandlers = [
@@ -2506,12 +2738,15 @@ client.CheckInsClient = CheckInsClient;
2506
2738
  };
2507
2739
  return Honeybadger;
2508
2740
  }(core_1.Client));
2509
- var singleton = new Honeybadger(__assign({ __plugins: DEFAULT_PLUGINS }, ((_a = (0, util_1.readConfigFromFileSystem)()) !== null && _a !== void 0 ? _a : {})));
2510
2741
  var NOTIFIER = {
2511
2742
  name: '@honeybadger-io/js',
2512
2743
  url: 'https://github.com/honeybadger-io/honeybadger-js/tree/master/packages/js',
2513
- version: '6.6.1'
2744
+ version: '6.7.0'
2745
+ };
2746
+ var userAgent = function () {
2747
+ return "Honeybadger JS Server Client ".concat(NOTIFIER.version, ", ").concat(os_1.default.version(), "; ").concat(os_1.default.platform());
2514
2748
  };
2749
+ var singleton = new Honeybadger(__assign({ __plugins: DEFAULT_PLUGINS }, ((_a = (0, util_1.readConfigFromFileSystem)()) !== null && _a !== void 0 ? _a : {})));
2515
2750
  singleton.setNotifier(NOTIFIER);
2516
2751
  var core_2 = src;
2517
2752
  Object.defineProperty(exports, "Types", { enumerable: true, get: function () { return core_2.Types; } });