rollbar 2.26.3 → 3.0.0-alpha.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.
Files changed (186) hide show
  1. package/.cursor/rules/guidelines.mdc +154 -0
  2. package/.github/workflows/ci.yml +32 -12
  3. package/.lgtm.yml +7 -7
  4. package/.prettierignore +18 -0
  5. package/.vscode/settings.json +39 -0
  6. package/CHANGELOG.md +121 -35
  7. package/CLAUDE.md +201 -0
  8. package/Gruntfile.js +101 -48
  9. package/Makefile +3 -3
  10. package/README.md +2 -4
  11. package/SECURITY.md +5 -0
  12. package/babel.config.json +9 -0
  13. package/bower.json +1 -3
  14. package/codex.md +148 -0
  15. package/defaults.js +17 -5
  16. package/dist/plugins/jquery.min.js +1 -1
  17. package/dist/rollbar.js +18748 -5375
  18. package/dist/rollbar.js.map +1 -1
  19. package/dist/rollbar.min.js +2 -1
  20. package/dist/rollbar.min.js.LICENSE.txt +1 -0
  21. package/dist/rollbar.min.js.map +1 -1
  22. package/dist/rollbar.named-amd.js +19368 -6000
  23. package/dist/rollbar.named-amd.js.map +1 -1
  24. package/dist/rollbar.named-amd.min.js +3 -1
  25. package/dist/rollbar.named-amd.min.js.LICENSE.txt +1 -0
  26. package/dist/rollbar.named-amd.min.js.map +1 -1
  27. package/dist/rollbar.noconflict.umd.js +18749 -5380
  28. package/dist/rollbar.noconflict.umd.js.map +1 -1
  29. package/dist/rollbar.noconflict.umd.min.js +3 -1
  30. package/dist/rollbar.noconflict.umd.min.js.LICENSE.txt +1 -0
  31. package/dist/rollbar.noconflict.umd.min.js.map +1 -1
  32. package/dist/rollbar.snippet.js +1 -1
  33. package/dist/rollbar.umd.js +19367 -6000
  34. package/dist/rollbar.umd.js.map +1 -1
  35. package/dist/rollbar.umd.min.js +3 -1
  36. package/dist/rollbar.umd.min.js.LICENSE.txt +1 -0
  37. package/dist/rollbar.umd.min.js.map +1 -1
  38. package/docs/extension-exceptions.md +35 -30
  39. package/docs/migration_v0_to_v1.md +41 -38
  40. package/eslint.config.mjs +33 -0
  41. package/get_versions.js +33 -0
  42. package/index.d.ts +270 -231
  43. package/karma.conf.js +18 -27
  44. package/package.json +21 -21
  45. package/prettier.config.js +7 -0
  46. package/src/api.js +78 -14
  47. package/src/apiUtility.js +14 -11
  48. package/src/browser/core.js +138 -72
  49. package/src/browser/defaults/scrubFields.js +3 -3
  50. package/src/browser/detection.js +7 -8
  51. package/src/browser/domUtility.js +18 -8
  52. package/src/browser/globalSetup.js +12 -6
  53. package/src/browser/logger.js +1 -1
  54. package/src/browser/plugins/jquery.js +35 -35
  55. package/src/browser/predicates.js +1 -1
  56. package/src/browser/replay/defaults.js +71 -0
  57. package/src/browser/replay/recorder.js +193 -0
  58. package/src/browser/replay/replayMap.js +195 -0
  59. package/src/browser/rollbar.js +12 -8
  60. package/src/browser/rollbarWrapper.js +8 -5
  61. package/src/browser/shim.js +43 -19
  62. package/src/browser/snippet_callback.js +6 -4
  63. package/src/browser/telemetry.js +573 -361
  64. package/src/browser/transforms.js +46 -27
  65. package/src/browser/transport/fetch.js +26 -14
  66. package/src/browser/transport/xhr.js +41 -14
  67. package/src/browser/transport.js +93 -33
  68. package/src/browser/url.js +16 -8
  69. package/src/browser/wrapGlobals.js +27 -8
  70. package/src/defaults.js +3 -3
  71. package/src/errorParser.js +14 -11
  72. package/src/merge.js +32 -23
  73. package/src/notifier.js +16 -13
  74. package/src/predicates.js +43 -23
  75. package/src/queue.js +133 -40
  76. package/src/rateLimiter.js +59 -18
  77. package/src/react-native/logger.js +1 -1
  78. package/src/react-native/rollbar.js +59 -55
  79. package/src/react-native/transforms.js +13 -9
  80. package/src/react-native/transport.js +44 -34
  81. package/src/rollbar.js +72 -21
  82. package/src/scrub.js +0 -1
  83. package/src/server/locals.js +69 -39
  84. package/src/server/logger.js +4 -4
  85. package/src/server/parser.js +72 -47
  86. package/src/server/rollbar.js +135 -56
  87. package/src/server/sourceMap/stackTrace.js +33 -18
  88. package/src/server/telemetry/urlHelpers.js +9 -11
  89. package/src/server/telemetry.js +68 -45
  90. package/src/server/transforms.js +37 -21
  91. package/src/server/transport.js +62 -32
  92. package/src/telemetry.js +162 -33
  93. package/src/tracing/context.js +24 -0
  94. package/src/tracing/contextManager.js +37 -0
  95. package/src/tracing/defaults.js +7 -0
  96. package/src/tracing/exporter.js +188 -0
  97. package/src/tracing/hrtime.js +98 -0
  98. package/src/tracing/id.js +24 -0
  99. package/src/tracing/session.js +55 -0
  100. package/src/tracing/span.js +92 -0
  101. package/src/tracing/spanProcessor.js +15 -0
  102. package/src/tracing/tracer.js +46 -0
  103. package/src/tracing/tracing.js +89 -0
  104. package/src/transforms.js +33 -21
  105. package/src/truncation.js +8 -5
  106. package/src/utility/headers.js +43 -43
  107. package/src/utility/replace.js +9 -0
  108. package/src/utility/traverse.js +1 -1
  109. package/src/utility.js +123 -52
  110. package/test/api.test.js +88 -41
  111. package/test/apiUtility.test.js +48 -50
  112. package/test/browser.core.test.js +142 -141
  113. package/test/browser.domUtility.test.js +53 -36
  114. package/test/browser.predicates.test.js +14 -14
  115. package/test/browser.replay.recorder.test.js +416 -0
  116. package/test/browser.rollbar.test.js +655 -515
  117. package/test/browser.telemetry.test.js +46 -39
  118. package/test/browser.transforms.test.js +164 -139
  119. package/test/browser.transport.test.js +59 -50
  120. package/test/browser.url.test.js +13 -12
  121. package/test/fixtures/locals.fixtures.js +245 -126
  122. package/test/fixtures/replay/index.js +20 -0
  123. package/test/fixtures/replay/payloads.fixtures.js +229 -0
  124. package/test/fixtures/replay/rrwebEvents.fixtures.js +251 -0
  125. package/test/fixtures/replay/rrwebSyntheticEvents.fixtures.js +328 -0
  126. package/test/notifier.test.js +91 -79
  127. package/test/predicates.test.js +261 -215
  128. package/test/queue.test.js +231 -215
  129. package/test/rateLimiter.test.js +51 -43
  130. package/test/react-native.rollbar.test.js +150 -116
  131. package/test/react-native.transforms.test.js +23 -25
  132. package/test/react-native.transport.test.js +26 -14
  133. package/test/replay/index.js +2 -0
  134. package/test/replay/integration/api.spans.test.js +136 -0
  135. package/test/replay/integration/e2e.test.js +228 -0
  136. package/test/replay/integration/index.js +9 -0
  137. package/test/replay/integration/queue.replayMap.test.js +332 -0
  138. package/test/replay/integration/replayMap.test.js +163 -0
  139. package/test/replay/integration/sessionRecording.test.js +390 -0
  140. package/test/replay/unit/api.postSpans.test.js +150 -0
  141. package/test/replay/unit/index.js +7 -0
  142. package/test/replay/unit/queue.replayMap.test.js +225 -0
  143. package/test/replay/unit/replayMap.test.js +348 -0
  144. package/test/replay/util/index.js +5 -0
  145. package/test/replay/util/mockRecordFn.js +80 -0
  146. package/test/server.lambda.mocha.test.mjs +172 -0
  147. package/test/server.locals.constructor.mocha.test.mjs +80 -0
  148. package/test/server.locals.error-handling.mocha.test.mjs +387 -0
  149. package/test/server.locals.merge.mocha.test.mjs +267 -0
  150. package/test/server.locals.test-utils.mjs +114 -0
  151. package/test/server.parser.mocha.test.mjs +87 -0
  152. package/test/server.predicates.mocha.test.mjs +63 -0
  153. package/test/server.rollbar.constructor.mocha.test.mjs +199 -0
  154. package/test/server.rollbar.handlers.mocha.test.mjs +253 -0
  155. package/test/server.rollbar.logging.mocha.test.mjs +326 -0
  156. package/test/server.rollbar.misc.mocha.test.mjs +44 -0
  157. package/test/server.rollbar.test-utils.mjs +57 -0
  158. package/test/server.telemetry.mocha.test.mjs +377 -0
  159. package/test/server.transforms.data.mocha.test.mjs +163 -0
  160. package/test/server.transforms.error.mocha.test.mjs +199 -0
  161. package/test/server.transforms.request.mocha.test.mjs +208 -0
  162. package/test/server.transforms.scrub.mocha.test.mjs +140 -0
  163. package/test/server.transforms.sourcemaps.mocha.test.mjs +122 -0
  164. package/test/server.transforms.test-utils.mjs +62 -0
  165. package/test/server.transport.mocha.test.mjs +269 -0
  166. package/test/telemetry.test.js +178 -38
  167. package/test/tracing/contextManager.test.js +28 -0
  168. package/test/tracing/exporter.toPayload.test.js +400 -0
  169. package/test/tracing/id.test.js +24 -0
  170. package/test/tracing/span.test.js +183 -0
  171. package/test/tracing/spanProcessor.test.js +73 -0
  172. package/test/tracing/tracing.test.js +105 -0
  173. package/test/transforms.test.js +70 -68
  174. package/test/truncation.test.js +57 -55
  175. package/test/utility.test.js +310 -228
  176. package/webpack.config.js +36 -70
  177. package/.eslintignore +0 -7
  178. package/.gitmodules +0 -3
  179. package/test/server.lambda.test.js +0 -177
  180. package/test/server.locals.test.js +0 -841
  181. package/test/server.parser.test.js +0 -72
  182. package/test/server.predicates.test.js +0 -89
  183. package/test/server.rollbar.test.js +0 -676
  184. package/test/server.telemetry.test.js +0 -318
  185. package/test/server.transforms.test.js +0 -1099
  186. package/test/server.transport.test.js +0 -201
@@ -3,7 +3,7 @@ var errorParser = require('../errorParser');
3
3
  var logger = require('./logger');
4
4
 
5
5
  function handleDomException(item, options, callback) {
6
- if(item.err && errorParser.Stack(item.err).name === 'DOMException') {
6
+ if (item.err && errorParser.Stack(item.err).name === 'DOMException') {
7
7
  var originalError = new Error();
8
8
  originalError.name = item.err.name;
9
9
  originalError.message = item.err.message;
@@ -18,7 +18,9 @@ function handleItemWithError(item, options, callback) {
18
18
  item.data = item.data || {};
19
19
  if (item.err) {
20
20
  try {
21
- item.stackInfo = item.err._savedStackTrace || errorParser.parse(item.err, item.skipFrames);
21
+ item.stackInfo =
22
+ item.err._savedStackTrace ||
23
+ errorParser.parse(item.err, item.skipFrames);
22
24
 
23
25
  if (options.addErrorContext) {
24
26
  addErrorContext(item);
@@ -26,7 +28,11 @@ function handleItemWithError(item, options, callback) {
26
28
  } catch (e) {
27
29
  logger.error('Error while parsing the error object.', e);
28
30
  try {
29
- item.message = item.err.message || item.err.description || item.message || String(item.err);
31
+ item.message =
32
+ item.err.message ||
33
+ item.err.description ||
34
+ item.message ||
35
+ String(item.err);
30
36
  } catch (e2) {
31
37
  item.message = String(item.err) || String(e2);
32
38
  }
@@ -58,7 +64,8 @@ function ensureItemHasSomethingToSay(item, options, callback) {
58
64
  }
59
65
 
60
66
  function addBaseInfo(item, options, callback) {
61
- var environment = (options.payload && options.payload.environment) || options.environment;
67
+ var environment =
68
+ (options.payload && options.payload.environment) || options.environment;
62
69
  item.data = _.merge(item.data, {
63
70
  environment: environment,
64
71
  level: item.level,
@@ -70,15 +77,15 @@ function addBaseInfo(item, options, callback) {
70
77
  uuid: item.uuid,
71
78
  notifier: {
72
79
  name: 'rollbar-browser-js',
73
- version: options.version
80
+ version: options.version,
74
81
  },
75
- custom: item.custom
82
+ custom: item.custom,
76
83
  });
77
84
  callback(null, item);
78
85
  }
79
86
 
80
87
  function addRequestInfo(window) {
81
- return function(item, options, callback) {
88
+ return function (item, options, callback) {
82
89
  var requestInfo = {};
83
90
 
84
91
  if (window && window.location) {
@@ -103,7 +110,7 @@ function addRequestInfo(window) {
103
110
  }
104
111
 
105
112
  function addClientInfo(window) {
106
- return function(item, options, callback) {
113
+ return function (item, options, callback) {
107
114
  if (!window) {
108
115
  return callback(null, item);
109
116
  }
@@ -118,25 +125,25 @@ function addClientInfo(window) {
118
125
  cookie_enabled: nav.cookieEnabled,
119
126
  screen: {
120
127
  width: scr.width,
121
- height: scr.height
122
- }
123
- }
128
+ height: scr.height,
129
+ },
130
+ },
124
131
  });
125
132
  callback(null, item);
126
133
  };
127
134
  }
128
135
 
129
136
  function addPluginInfo(window) {
130
- return function(item, options, callback) {
137
+ return function (item, options, callback) {
131
138
  if (!window || !window.navigator) {
132
139
  return callback(null, item);
133
140
  }
134
141
  var plugins = [];
135
142
  var navPlugins = window.navigator.plugins || [];
136
143
  var cur;
137
- for (var i=0, l=navPlugins.length; i < l; ++i) {
144
+ for (var i = 0, l = navPlugins.length; i < l; ++i) {
138
145
  cur = navPlugins[i];
139
- plugins.push({name: cur.name, description: cur.description});
146
+ plugins.push({ name: cur.name, description: cur.description });
140
147
  }
141
148
  _.set(item, 'data.client.javascript.plugins', plugins);
142
149
  callback(null, item);
@@ -163,21 +170,26 @@ function addBodyMessage(item, options, callback) {
163
170
  message = 'Item sent with null or missing arguments.';
164
171
  }
165
172
  var result = {
166
- body: message
173
+ body: message,
167
174
  };
168
175
 
169
176
  if (custom) {
170
177
  result.extra = _.merge(custom);
171
178
  }
172
179
 
173
- _.set(item, 'data.body', {message: result});
180
+ _.set(item, 'data.body', { message: result });
174
181
  callback(null, item);
175
182
  }
176
183
 
177
184
  function stackFromItem(item) {
178
185
  // Transform a TraceKit stackInfo object into a Rollbar trace
179
186
  var stack = item.stackInfo.stack;
180
- if (stack && stack.length === 0 && item._unhandledStackInfo && item._unhandledStackInfo.stack) {
187
+ if (
188
+ stack &&
189
+ stack.length === 0 &&
190
+ item._unhandledStackInfo &&
191
+ item._unhandledStackInfo.stack
192
+ ) {
181
193
  stack = item._unhandledStackInfo.stack;
182
194
  }
183
195
  return stack;
@@ -193,7 +205,7 @@ function addBodyTraceChain(item, options, callback) {
193
205
  traces.push(trace);
194
206
  }
195
207
 
196
- _.set(item, 'data.body', {trace_chain: traces});
208
+ _.set(item, 'data.body', { trace_chain: traces });
197
209
  callback(null, item);
198
210
  }
199
211
 
@@ -202,7 +214,7 @@ function addBodyTrace(item, options, callback) {
202
214
 
203
215
  if (stack) {
204
216
  var trace = buildTrace(item, item.stackInfo, options);
205
- _.set(item, 'data.body', {trace: trace});
217
+ _.set(item, 'data.body', { trace: trace });
206
218
  callback(null, item);
207
219
  } else {
208
220
  var stackInfo = item.stackInfo;
@@ -225,9 +237,9 @@ function buildTrace(item, stackInfo, options) {
225
237
  var message = guess[1];
226
238
  var trace = {
227
239
  exception: {
228
- 'class': className,
229
- message: message
230
- }
240
+ class: className,
241
+ message: message,
242
+ },
231
243
  };
232
244
 
233
245
  if (description) {
@@ -253,13 +265,20 @@ function buildTrace(item, stackInfo, options) {
253
265
  frame = {
254
266
  filename: stackFrame.url ? _.sanitizeUrl(stackFrame.url) : '(unknown)',
255
267
  lineno: stackFrame.line || null,
256
- method: (!stackFrame.func || stackFrame.func === '?') ? '[anonymous]' : stackFrame.func,
257
- colno: stackFrame.column
268
+ method:
269
+ !stackFrame.func || stackFrame.func === '?'
270
+ ? '[anonymous]'
271
+ : stackFrame.func,
272
+ colno: stackFrame.column,
258
273
  };
259
274
  if (options.sendFrameUrl) {
260
275
  frame.url = stackFrame.url;
261
276
  }
262
- if (frame.method && frame.method.endsWith && frame.method.endsWith('_rollbar_wrapped')) {
277
+ if (
278
+ frame.method &&
279
+ frame.method.endsWith &&
280
+ frame.method.endsWith('_rollbar_wrapped')
281
+ ) {
263
282
  continue;
264
283
  }
265
284
 
@@ -322,7 +341,7 @@ function addScrubber(scrubFn) {
322
341
  item.data = scrubFn(item.data, scrubFields, scrubPaths);
323
342
  }
324
343
  callback(null, item);
325
- }
344
+ };
326
345
  }
327
346
 
328
347
  module.exports = {
@@ -334,5 +353,5 @@ module.exports = {
334
353
  addClientInfo: addClientInfo,
335
354
  addPluginInfo: addPluginInfo,
336
355
  addBody: addBody,
337
- addScrubber: addScrubber
356
+ addScrubber: addScrubber,
338
357
  };
@@ -5,9 +5,11 @@ function makeFetchRequest(accessToken, url, method, data, callback, timeout) {
5
5
  var controller;
6
6
  var timeoutId;
7
7
 
8
- if(_.isFiniteNumber(timeout)) {
8
+ if (_.isFiniteNumber(timeout)) {
9
9
  controller = new AbortController();
10
- timeoutId = setTimeout(function () {controller.abort()}, timeout);
10
+ timeoutId = setTimeout(function () {
11
+ controller.abort();
12
+ }, timeout);
11
13
  }
12
14
 
13
15
  fetch(url, {
@@ -15,21 +17,31 @@ function makeFetchRequest(accessToken, url, method, data, callback, timeout) {
15
17
  headers: {
16
18
  'Content-Type': 'application/json',
17
19
  'X-Rollbar-Access-Token': accessToken,
18
- signal: controller && controller.signal
20
+ signal: controller && controller.signal,
19
21
  },
20
22
  body: data,
21
23
  })
22
- .then(function (response) {
23
- if (timeoutId) clearTimeout(timeoutId);
24
- return response.json();
25
- })
26
- .then(function (data) {
27
- callback(null, data);
28
- })
29
- .catch(function (error) {
30
- logger.error(error.message);
31
- callback(error);
32
- });
24
+ .then(function (response) {
25
+ if (timeoutId) clearTimeout(timeoutId);
26
+ const respHeaders = response.headers;
27
+ const headers = {
28
+ 'Rollbar-Replay-Enabled': respHeaders.get(
29
+ 'Rollbar-Replay-Enabled'
30
+ ),
31
+ 'Rollbar-Replay-RateLimit-Remaining': respHeaders.get(
32
+ 'Rollbar-Replay-RateLimit-Remaining'
33
+ ),
34
+ 'Rollbar-Replay-RateLimit-Reset': respHeaders.get(
35
+ 'Rollbar-Replay-RateLimit-Reset'
36
+ ),
37
+ };
38
+ const json = response.json();
39
+ callback(null, json, headers);
40
+ })
41
+ .catch(function (error) {
42
+ logger.error(error.message);
43
+ callback(error);
44
+ });
33
45
  }
34
46
 
35
47
  module.exports = makeFetchRequest;
@@ -3,7 +3,15 @@
3
3
  var _ = require('../../utility');
4
4
  var logger = require('../logger');
5
5
 
6
- function makeXhrRequest(accessToken, url, method, data, callback, requestFactory, timeout) {
6
+ function makeXhrRequest(
7
+ accessToken,
8
+ url,
9
+ method,
10
+ data,
11
+ callback,
12
+ requestFactory,
13
+ timeout,
14
+ ) {
7
15
  var request;
8
16
  if (requestFactory) {
9
17
  request = requestFactory();
@@ -16,19 +24,31 @@ function makeXhrRequest(accessToken, url, method, data, callback, requestFactory
16
24
  }
17
25
  try {
18
26
  try {
19
- var onreadystatechange = function() {
27
+ var onreadystatechange = function () {
20
28
  try {
21
29
  if (onreadystatechange && request.readyState === 4) {
22
30
  onreadystatechange = undefined;
23
31
 
24
32
  var parseResponse = _.jsonParse(request.responseText);
25
33
  if (_isSuccess(request)) {
26
- callback(parseResponse.error, parseResponse.value);
34
+ const headers = {
35
+ 'Rollbar-Replay-Enabled': request.getResponseHeader(
36
+ 'Rollbar-Replay-Enabled'
37
+ ),
38
+ 'Rollbar-Replay-RateLimit-Remaining': request.getResponseHeader(
39
+ 'Rollbar-Replay-RateLimit-Remaining'
40
+ ),
41
+ 'Rollbar-Replay-RateLimit-Reset': request.getResponseHeader(
42
+ 'Rollbar-Replay-RateLimit-Reset'
43
+ ),
44
+ }
45
+ callback(parseResponse.error, parseResponse.value, headers);
27
46
  return;
28
47
  } else if (_isNormalFailure(request)) {
29
48
  if (request.status === 403) {
30
49
  // likely caused by using a server access token
31
- var message = parseResponse.value && parseResponse.value.message;
50
+ var message =
51
+ parseResponse.value && parseResponse.value.message;
32
52
  logger.error(message);
33
53
  }
34
54
  // return valid http status codes
@@ -37,7 +57,8 @@ function makeXhrRequest(accessToken, url, method, data, callback, requestFactory
37
57
  // IE will return a status 12000+ on some sort of connection failure,
38
58
  // so we return a blank error
39
59
  // http://msdn.microsoft.com/en-us/library/aa383770%28VS.85%29.aspx
40
- var msg = 'XHR response had no status code (likely connection failure)';
60
+ var msg =
61
+ 'XHR response had no status code (likely connection failure)';
41
62
  callback(_newRetriableError(msg));
42
63
  }
43
64
  }
@@ -61,7 +82,7 @@ function makeXhrRequest(accessToken, url, method, data, callback, requestFactory
61
82
  request.setRequestHeader('X-Rollbar-Access-Token', accessToken);
62
83
  }
63
84
 
64
- if(_.isFiniteNumber(timeout)) {
85
+ if (_.isFiniteNumber(timeout)) {
65
86
  request.timeout = timeout;
66
87
  }
67
88
 
@@ -70,31 +91,37 @@ function makeXhrRequest(accessToken, url, method, data, callback, requestFactory
70
91
  } catch (e1) {
71
92
  // Sending using the normal xmlhttprequest object didn't work, try XDomainRequest
72
93
  if (typeof XDomainRequest !== 'undefined') {
73
-
74
94
  // Assume we are in a really old browser which has a bunch of limitations:
75
95
  // http://blogs.msdn.com/b/ieinternals/archive/2010/05/13/xdomainrequest-restrictions-limitations-and-workarounds.aspx
76
96
 
77
97
  // Extreme paranoia: if we have XDomainRequest then we have a window, but just in case
78
98
  if (!window || !window.location) {
79
- return callback(new Error('No window available during request, unknown environment'));
99
+ return callback(
100
+ new Error(
101
+ 'No window available during request, unknown environment',
102
+ ),
103
+ );
80
104
  }
81
105
 
82
106
  // If the current page is http, try and send over http
83
- if (window.location.href.substring(0, 5) === 'http:' && url.substring(0, 5) === 'https') {
107
+ if (
108
+ window.location.href.substring(0, 5) === 'http:' &&
109
+ url.substring(0, 5) === 'https'
110
+ ) {
84
111
  url = 'http' + url.substring(5);
85
112
  }
86
113
 
87
114
  var xdomainrequest = new XDomainRequest();
88
- xdomainrequest.onprogress = function() {};
89
- xdomainrequest.ontimeout = function() {
115
+ xdomainrequest.onprogress = function () {};
116
+ xdomainrequest.ontimeout = function () {
90
117
  var msg = 'Request timed out';
91
118
  var code = 'ETIMEDOUT';
92
119
  callback(_newRetriableError(msg, code));
93
120
  };
94
- xdomainrequest.onerror = function() {
121
+ xdomainrequest.onerror = function () {
95
122
  callback(new Error('Error during request'));
96
123
  };
97
- xdomainrequest.onload = function() {
124
+ xdomainrequest.onload = function () {
98
125
  var parseResponse = _.jsonParse(xdomainrequest.responseText);
99
126
  callback(parseResponse.error, parseResponse.value);
100
127
  };
@@ -124,7 +151,7 @@ function _createXMLHTTPObject() {
124
151
  },
125
152
  function () {
126
153
  return new ActiveXObject('Microsoft.XMLHTTP');
127
- }
154
+ },
128
155
  ];
129
156
  var xmlhttp;
130
157
  var i;
@@ -24,22 +24,41 @@ function Transport(truncation) {
24
24
  this.truncation = truncation;
25
25
  }
26
26
 
27
- Transport.prototype.get = function(accessToken, options, params, callback, requestFactory) {
27
+ Transport.prototype.get = function (
28
+ accessToken,
29
+ options,
30
+ params,
31
+ callback,
32
+ requestFactory,
33
+ ) {
28
34
  if (!callback || !_.isFunction(callback)) {
29
- callback = function() {};
35
+ callback = function () {};
30
36
  }
31
37
  _.addParamsAndAccessTokenToPath(accessToken, options, params);
32
38
 
33
39
  var method = 'GET';
34
40
  var url = _.formatUrl(options);
35
41
  this._makeZoneRequest(
36
- accessToken, url, method, null, callback, requestFactory, options.timeout, options.transport
42
+ accessToken,
43
+ url,
44
+ method,
45
+ null,
46
+ callback,
47
+ requestFactory,
48
+ options.timeout,
49
+ options.transport,
37
50
  );
38
- }
39
-
40
- Transport.prototype.post = function(accessToken, options, payload, callback, requestFactory) {
51
+ };
52
+
53
+ Transport.prototype.post = function (
54
+ accessToken,
55
+ options,
56
+ payload,
57
+ callback,
58
+ requestFactory,
59
+ ) {
41
60
  if (!callback || !_.isFunction(callback)) {
42
- callback = function() {};
61
+ callback = function () {};
43
62
  }
44
63
 
45
64
  if (!payload) {
@@ -47,10 +66,11 @@ Transport.prototype.post = function(accessToken, options, payload, callback, req
47
66
  }
48
67
 
49
68
  var stringifyResult;
50
- if (this.truncation) {
69
+ // Check payload.body to ensure only items are truncated.
70
+ if (this.truncation && payload.body) {
51
71
  stringifyResult = this.truncation.truncate(payload);
52
72
  } else {
53
- stringifyResult = _.stringify(payload)
73
+ stringifyResult = _.stringify(payload);
54
74
  }
55
75
  if (stringifyResult.error) {
56
76
  return callback(stringifyResult.error);
@@ -60,34 +80,57 @@ Transport.prototype.post = function(accessToken, options, payload, callback, req
60
80
  var method = 'POST';
61
81
  var url = _.formatUrl(options);
62
82
  this._makeZoneRequest(
63
- accessToken, url, method, writeData, callback, requestFactory, options.timeout, options.transport
83
+ accessToken,
84
+ url,
85
+ method,
86
+ writeData,
87
+ callback,
88
+ requestFactory,
89
+ options.timeout,
90
+ options.transport,
64
91
  );
65
- }
66
-
67
- Transport.prototype.postJsonPayload = function (accessToken, options, jsonPayload, callback, requestFactory) {
92
+ };
93
+
94
+ Transport.prototype.postJsonPayload = function (
95
+ accessToken,
96
+ options,
97
+ jsonPayload,
98
+ callback,
99
+ requestFactory,
100
+ ) {
68
101
  if (!callback || !_.isFunction(callback)) {
69
- callback = function() {};
102
+ callback = function () {};
70
103
  }
71
104
 
72
105
  var method = 'POST';
73
106
  var url = _.formatUrl(options);
74
107
  this._makeZoneRequest(
75
- accessToken, url, method, jsonPayload, callback, requestFactory, options.timeout, options.transport
108
+ accessToken,
109
+ url,
110
+ method,
111
+ jsonPayload,
112
+ callback,
113
+ requestFactory,
114
+ options.timeout,
115
+ options.transport,
76
116
  );
77
- }
78
-
117
+ };
79
118
 
80
- // Wraps _makeRequest and if Angular 2+ Zone.js is detected, changes scope
81
- // so Angular change detection isn't triggered on each API call.
82
- // This is the equivalent of runOutsideAngular().
83
- //
119
+ // Wraps `_makeRequest` if zone.js is being used, ensuring that Rollbar
120
+ // API calls are not intercepted by any child forked zones.
121
+ // This is equivalent to `NgZone.runOutsideAngular` in Angular.
84
122
  Transport.prototype._makeZoneRequest = function () {
85
- var gWindow = ((typeof window != 'undefined') && window) || ((typeof self != 'undefined') && self);
86
- var currentZone = gWindow && gWindow.Zone && gWindow.Zone.current;
123
+ var gWindow =
124
+ (typeof window != 'undefined' && window) ||
125
+ (typeof self != 'undefined' && self);
126
+ // Whenever zone.js is loaded and `Zone` is exposed globally, access
127
+ // the root zone to ensure that requests are always made within it.
128
+ // This approach is framework-agnostic, regardless of which
129
+ // framework zone.js is used with.
130
+ var rootZone = gWindow && gWindow.Zone && gWindow.Zone.root;
87
131
  var args = Array.prototype.slice.call(arguments);
88
132
 
89
- if (currentZone && currentZone._name === 'angular') {
90
- var rootZone = currentZone._parent;
133
+ if (rootZone) {
91
134
  var self = this;
92
135
  rootZone.run(function () {
93
136
  self._makeRequest.apply(undefined, args);
@@ -95,31 +138,48 @@ Transport.prototype._makeZoneRequest = function () {
95
138
  } else {
96
139
  this._makeRequest.apply(undefined, args);
97
140
  }
98
- }
141
+ };
99
142
 
100
143
  Transport.prototype._makeRequest = function (
101
- accessToken, url, method, data, callback, requestFactory, timeout, transport
144
+ accessToken,
145
+ url,
146
+ method,
147
+ data,
148
+ callback,
149
+ requestFactory,
150
+ timeout,
151
+ transport,
102
152
  ) {
103
153
  if (typeof RollbarProxy !== 'undefined') {
104
154
  return _proxyRequest(data, callback);
105
155
  }
106
156
 
107
157
  if (transport === 'fetch') {
108
- makeFetchRequest(accessToken, url, method, data, callback, timeout)
158
+ makeFetchRequest(accessToken, url, method, data, callback, timeout);
109
159
  } else {
110
- makeXhrRequest(accessToken, url, method, data, callback, requestFactory, timeout)
160
+ makeXhrRequest(
161
+ accessToken,
162
+ url,
163
+ method,
164
+ data,
165
+ callback,
166
+ requestFactory,
167
+ timeout,
168
+ );
111
169
  }
112
- }
170
+ };
113
171
 
114
172
  /* global RollbarProxy */
115
173
  function _proxyRequest(json, callback) {
116
174
  var rollbarProxy = new RollbarProxy();
117
175
  rollbarProxy.sendJsonPayload(
118
176
  json,
119
- function(_msg) { /* do nothing */ }, // eslint-disable-line no-unused-vars
120
- function(err) {
177
+ function (_msg) {
178
+ /* do nothing */
179
+ }, // eslint-disable-line no-unused-vars
180
+ function (err) {
121
181
  callback(new Error(err));
122
- }
182
+ },
123
183
  );
124
184
  }
125
185
 
@@ -1,24 +1,32 @@
1
1
  // See https://nodejs.org/docs/latest/api/url.html
2
2
  function parse(url) {
3
3
  var result = {
4
- protocol: null, auth: null, host: null, path: null,
5
- hash: null, href: url, hostname: null, port: null,
6
- pathname: null, search: null, query: null
4
+ protocol: null,
5
+ auth: null,
6
+ host: null,
7
+ path: null,
8
+ hash: null,
9
+ href: url,
10
+ hostname: null,
11
+ port: null,
12
+ pathname: null,
13
+ search: null,
14
+ query: null,
7
15
  };
8
16
 
9
17
  var i, last;
10
18
  i = url.indexOf('//');
11
19
  if (i !== -1) {
12
- result.protocol = url.substring(0,i);
13
- last = i+2;
20
+ result.protocol = url.substring(0, i);
21
+ last = i + 2;
14
22
  } else {
15
23
  last = 0;
16
24
  }
17
-
25
+
18
26
  i = url.indexOf('@', last);
19
27
  if (i !== -1) {
20
28
  result.auth = url.substring(last, i);
21
- last = i+1;
29
+ last = i + 1;
22
30
  }
23
31
 
24
32
  i = url.indexOf('/', last);
@@ -75,5 +83,5 @@ function parse(url) {
75
83
  }
76
84
 
77
85
  module.exports = {
78
- parse: parse
86
+ parse: parse,
79
87
  };
@@ -1,7 +1,12 @@
1
1
  function wrapGlobals(window, handler, shim) {
2
- if (!window) { return; }
2
+ if (!window) {
3
+ return;
4
+ }
3
5
  // Adapted from https://github.com/bugsnag/bugsnag-js
4
- var globals = 'EventTarget,Window,Node,ApplicationCache,AudioTrackList,ChannelMergerNode,CryptoOperation,EventSource,FileReader,HTMLUnknownElement,IDBDatabase,IDBRequest,IDBTransaction,KeyOperation,MediaController,MessagePort,ModalWindow,Notification,SVGElementInstance,Screen,TextTrack,TextTrackCue,TextTrackList,WebSocket,WebSocketWorker,Worker,XMLHttpRequest,XMLHttpRequestEventTarget,XMLHttpRequestUpload'.split(',');
6
+ var globals =
7
+ 'EventTarget,Window,Node,ApplicationCache,AudioTrackList,ChannelMergerNode,CryptoOperation,EventSource,FileReader,HTMLUnknownElement,IDBDatabase,IDBRequest,IDBTransaction,KeyOperation,MediaController,MessagePort,ModalWindow,Notification,SVGElementInstance,Screen,TextTrack,TextTrackCue,TextTrackList,WebSocket,WebSocketWorker,Worker,XMLHttpRequest,XMLHttpRequestEventTarget,XMLHttpRequestUpload'.split(
8
+ ',',
9
+ );
5
10
  var i, global;
6
11
  for (i = 0; i < globals.length; ++i) {
7
12
  global = globals[i];
@@ -13,12 +18,18 @@ function wrapGlobals(window, handler, shim) {
13
18
  }
14
19
 
15
20
  function _extendListenerPrototype(handler, prototype, shim) {
16
- if (prototype.hasOwnProperty && prototype.hasOwnProperty('addEventListener')) {
21
+ if (
22
+ prototype.hasOwnProperty &&
23
+ prototype.hasOwnProperty('addEventListener')
24
+ ) {
17
25
  var oldAddEventListener = prototype.addEventListener;
18
- while (oldAddEventListener._rollbarOldAdd && oldAddEventListener.belongsToShim) {
26
+ while (
27
+ oldAddEventListener._rollbarOldAdd &&
28
+ oldAddEventListener.belongsToShim
29
+ ) {
19
30
  oldAddEventListener = oldAddEventListener._rollbarOldAdd;
20
31
  }
21
- var addFn = function(event, callback, bubble) {
32
+ var addFn = function (event, callback, bubble) {
22
33
  oldAddEventListener.call(this, event, handler.wrap(callback), bubble);
23
34
  };
24
35
  addFn._rollbarOldAdd = oldAddEventListener;
@@ -26,11 +37,19 @@ function _extendListenerPrototype(handler, prototype, shim) {
26
37
  prototype.addEventListener = addFn;
27
38
 
28
39
  var oldRemoveEventListener = prototype.removeEventListener;
29
- while (oldRemoveEventListener._rollbarOldRemove && oldRemoveEventListener.belongsToShim) {
40
+ while (
41
+ oldRemoveEventListener._rollbarOldRemove &&
42
+ oldRemoveEventListener.belongsToShim
43
+ ) {
30
44
  oldRemoveEventListener = oldRemoveEventListener._rollbarOldRemove;
31
45
  }
32
- var removeFn = function(event, callback, bubble) {
33
- oldRemoveEventListener.call(this, event, callback && callback._rollbar_wrapped || callback, bubble);
46
+ var removeFn = function (event, callback, bubble) {
47
+ oldRemoveEventListener.call(
48
+ this,
49
+ event,
50
+ (callback && callback._rollbar_wrapped) || callback,
51
+ bubble,
52
+ );
34
53
  };
35
54
  removeFn._rollbarOldRemove = oldRemoveEventListener;
36
55
  removeFn.belongsToShim = shim;