@honeybadger-io/js 6.6.1 → 6.7.1

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,202 @@ 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.configure = function (opts) {
955
+ for (var k in opts) {
956
+ this.config[k] = opts[k];
957
+ }
958
+ };
959
+ ThrottledEventsLogger.prototype.logEvent = function (data) {
960
+ this.queue.push(data);
961
+ if (!this.isProcessing) {
962
+ this.processQueue();
963
+ }
964
+ };
965
+ ThrottledEventsLogger.prototype.processQueue = function () {
966
+ var _this = this;
967
+ if (this.queue.length === 0 || this.isProcessing) {
968
+ return;
969
+ }
970
+ this.isProcessing = true;
971
+ var eventsData = this.queue.slice();
972
+ this.queue = [];
973
+ var data = json_nd_1.NdJson.stringify(eventsData);
974
+ this.makeHttpRequest(data)
975
+ .then(function () {
976
+ setTimeout(function () {
977
+ _this.isProcessing = false;
978
+ _this.processQueue();
979
+ }, 50);
980
+ })
981
+ .catch(function (error) {
982
+ _this.logger.error('[Honeybadger] Error making HTTP request:', error);
983
+ // Continue processing the queue even if there's an error
984
+ setTimeout(function () {
985
+ _this.isProcessing = false;
986
+ _this.processQueue();
987
+ }, 50);
988
+ });
989
+ };
990
+ ThrottledEventsLogger.prototype.makeHttpRequest = function (data) {
991
+ return __awaiter$3(this, void 0, void 0, function () {
992
+ var _this = this;
993
+ return __generator$3(this, function (_a) {
994
+ return [2 /*return*/, this.transport
995
+ .send({
996
+ headers: {
997
+ 'X-API-Key': this.config.apiKey,
998
+ 'Content-Type': 'application/json',
999
+ },
1000
+ method: 'POST',
1001
+ endpoint: (0, util_1$5.endpoint)(this.config.endpoint, '/v1/events'),
1002
+ maxObjectDepth: this.config.maxObjectDepth,
1003
+ logger: this.logger,
1004
+ }, data)
1005
+ .then(function () {
1006
+ if (_this.config.debug) {
1007
+ _this.logger.debug('[Honeybadger] Events sent successfully');
1008
+ }
1009
+ })
1010
+ .catch(function (err) {
1011
+ _this.logger.error("[Honeybadger] Error sending events: ".concat(err.message));
1012
+ })];
1013
+ });
1014
+ });
1015
+ };
1016
+ /**
1017
+ * todo: improve this
1018
+ *
1019
+ * The EventsLogger overrides the console methods
1020
+ * so if we want to log something we need to use the original methods
1021
+ */
1022
+ ThrottledEventsLogger.prototype.originalLogger = function () {
1023
+ var _a, _b, _c, _d, _e;
1024
+ return {
1025
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
1026
+ log: (_a = console.log.__hb_original) !== null && _a !== void 0 ? _a : console.log,
1027
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
1028
+ info: (_b = console.info.__hb_original) !== null && _b !== void 0 ? _b : console.info,
1029
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
1030
+ debug: (_c = console.debug.__hb_original) !== null && _c !== void 0 ? _c : console.debug,
1031
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
1032
+ warn: (_d = console.warn.__hb_original) !== null && _d !== void 0 ? _d : console.warn,
1033
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
1034
+ error: (_e = console.error.__hb_original) !== null && _e !== void 0 ? _e : console.error,
1035
+ };
1036
+ };
1037
+ return ThrottledEventsLogger;
1038
+ }());
1039
+ throttled_events_logger.ThrottledEventsLogger = ThrottledEventsLogger;
1040
+
811
1041
  var __assign$1 = (commonjsGlobal && commonjsGlobal.__assign) || function () {
812
1042
  __assign$1 = Object.assign || function(t) {
813
1043
  for (var s, i = 1, n = arguments.length; i < n; i++) {
@@ -859,6 +1089,8 @@ Object.defineProperty(client$1, "__esModule", { value: true });
859
1089
  client$1.Client = void 0;
860
1090
  var util_1$4 = util$1;
861
1091
  var store_1 = store;
1092
+ var throttled_events_logger_1 = throttled_events_logger;
1093
+ var defaults_1 = defaults;
862
1094
  // Split at commas and spaces
863
1095
  var TAG_SEPARATOR = /,|\s+/;
864
1096
  // Checks for non-blank characters
@@ -873,11 +1105,12 @@ var Client = /** @class */ (function () {
873
1105
  this.__notifier = {
874
1106
  name: '@honeybadger-io/core',
875
1107
  url: 'https://github.com/honeybadger-io/honeybadger-js/tree/master/packages/core',
876
- version: '6.6.1'
1108
+ version: '6.7.1'
877
1109
  };
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);
1110
+ this.config = __assign$1(__assign$1({}, defaults_1.CONFIG), opts);
879
1111
  this.__initStore();
880
1112
  this.__transport = transport;
1113
+ this.__eventsLogger = new throttled_events_logger_1.ThrottledEventsLogger(this.config, this.__transport);
881
1114
  this.logger = (0, util_1$4.logger)(this);
882
1115
  }
883
1116
  Client.prototype.getVersion = function () {
@@ -901,6 +1134,7 @@ var Client = /** @class */ (function () {
901
1134
  for (var k in opts) {
902
1135
  this.config[k] = opts[k];
903
1136
  }
1137
+ this.__eventsLogger.configure(this.config);
904
1138
  this.loadPlugins();
905
1139
  return this;
906
1140
  };
@@ -1075,6 +1309,9 @@ var Client = /** @class */ (function () {
1075
1309
  });
1076
1310
  return this;
1077
1311
  };
1312
+ Client.prototype.logEvent = function (data) {
1313
+ this.__eventsLogger.logEvent(data);
1314
+ };
1078
1315
  Client.prototype.__getBreadcrumbs = function () {
1079
1316
  return this.__store.getContents('breadcrumbs').slice();
1080
1317
  };
@@ -1827,7 +2064,8 @@ var ServerTransport = /** @class */ (function () {
1827
2064
  };
1828
2065
  var data = undefined;
1829
2066
  if (payload) {
1830
- data = Buffer.from(JSON.stringify(sanitize(payload, options.maxObjectDepth)), 'utf8');
2067
+ var dataStr = typeof payload === 'string' ? payload : JSON.stringify(sanitize(payload, options.maxObjectDepth));
2068
+ data = Buffer.from(dataStr, 'utf8');
1831
2069
  httpOptions.headers['Content-Length'] = data.length;
1832
2070
  }
1833
2071
  var req = transport.request(httpOptions, function (res) {
@@ -2373,7 +2611,9 @@ client.CheckInsClient = CheckInsClient;
2373
2611
  if (opts === void 0) { opts = {}; }
2374
2612
  var _this = this;
2375
2613
  var _a;
2376
- var transport = new transport_1.ServerTransport();
2614
+ var transport = new transport_1.ServerTransport({
2615
+ 'User-Agent': userAgent(),
2616
+ });
2377
2617
  _this = _super.call(this, __assign({ projectRoot: process.cwd(), hostname: os_1.default.hostname() }, opts), transport) || this;
2378
2618
  /** @internal */
2379
2619
  _this.__beforeNotifyHandlers = [
@@ -2506,12 +2746,15 @@ client.CheckInsClient = CheckInsClient;
2506
2746
  };
2507
2747
  return Honeybadger;
2508
2748
  }(core_1.Client));
2509
- var singleton = new Honeybadger(__assign({ __plugins: DEFAULT_PLUGINS }, ((_a = (0, util_1.readConfigFromFileSystem)()) !== null && _a !== void 0 ? _a : {})));
2510
2749
  var NOTIFIER = {
2511
2750
  name: '@honeybadger-io/js',
2512
2751
  url: 'https://github.com/honeybadger-io/honeybadger-js/tree/master/packages/js',
2513
- version: '6.6.1'
2752
+ version: '6.7.1'
2753
+ };
2754
+ var userAgent = function () {
2755
+ return "Honeybadger JS Server Client ".concat(NOTIFIER.version, ", ").concat(os_1.default.version(), "; ").concat(os_1.default.platform());
2514
2756
  };
2757
+ var singleton = new Honeybadger(__assign({ __plugins: DEFAULT_PLUGINS }, ((_a = (0, util_1.readConfigFromFileSystem)()) !== null && _a !== void 0 ? _a : {})));
2515
2758
  singleton.setNotifier(NOTIFIER);
2516
2759
  var core_2 = src;
2517
2760
  Object.defineProperty(exports, "Types", { enumerable: true, get: function () { return core_2.Types; } });