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
@@ -1,318 +0,0 @@
1
- 'use strict';
2
-
3
- var assert = require('assert');
4
- var vows = require('vows');
5
- var sinon = require('sinon');
6
- var nock = require('nock');
7
- var http = require('http');
8
- var https = require('https');
9
-
10
- process.env.NODE_ENV = process.env.NODE_ENV || 'test-node-env';
11
- var Rollbar = require('../src/server/rollbar');
12
-
13
- function wait(ms) {
14
- return new Promise(resolve => {
15
- setTimeout(resolve, ms);
16
- });
17
- }
18
-
19
- async function uncaught() {
20
- setTimeout(function () {
21
- throw new Error('rollbar error');
22
- }, 1);
23
- await wait(300);
24
- }
25
-
26
- async function message(rollbar) {
27
- setTimeout(function () {
28
- rollbar.info('rollbar info message');
29
- }, 1);
30
- await wait(300);
31
- }
32
-
33
- function request(transport, url, options, body) {
34
- return new Promise ((resolve, reject) => {
35
- var req = url ? transport.request(url, options) : transport.request(options);
36
-
37
- req.on('response', res => {
38
- resolve(res);
39
- });
40
-
41
- req.on('error', err => {
42
- reject(err);
43
- });
44
-
45
- if (body) {
46
- req.write(body);
47
- }
48
-
49
- req.end();
50
- });
51
- }
52
-
53
- function requestWithCallback(transport, options, body) {
54
- return new Promise ((resolve, reject) => {
55
- var req = transport.request(options, function(res){
56
- resolve(res);
57
- });
58
-
59
- req.on('error', err => {
60
- reject(err);
61
- });
62
-
63
- if (body) {
64
- req.write(body);
65
- }
66
-
67
- req.end();
68
- });
69
- }
70
-
71
- function stubPostWithResponse(url, status, headers, body) {
72
- return nock(url)
73
- .post('/api/users')
74
- .reply(status, body, headers);
75
- }
76
-
77
- function stubGetWithResponse(url, status, headers, body) {
78
- return nock(url)
79
- .get('/api/users')
80
- .reply(status, body, headers);
81
- }
82
-
83
- function stubGetWithError(url) {
84
- return nock(url)
85
- .get('/api/users')
86
- .replyWithError('dns error');
87
- }
88
-
89
- var testHeaders1 = { 'Content-Type': 'application/json', 'X-access-token': '123' }
90
- var testHeaders2 = { 'authorization': 'abc', foo: '456' }
91
- var testHeaders3 = { 'content-type': 'application/json', foo: '123' }
92
- var testHeaders4 = { 'authorization': 'abc', bar: '456' }
93
- var testBody1 = 'test body 1';
94
- var testBody2 = 'test body 2';
95
- var testMessage1 = 'test console message';
96
- var testMessage2 = 'test console error message';
97
- var testMessagePart = ', extra part';
98
-
99
- vows.describe('telemetry')
100
- .addBatch({
101
- 'with log and network capture enabled': {
102
- topic: function() {
103
- var rollbar = new Rollbar({
104
- accessToken: 'abc123',
105
- captureUncaught: true,
106
- autoInstrument: true
107
- });
108
- rollbar.testData = {};
109
- var notifier = rollbar.client.notifier;
110
- rollbar.testData.addItemStub = sinon.stub(notifier.queue, 'addItem');
111
- rollbar.testData.getStub = stubGetWithResponse('http://example.com', 200, testHeaders3, testBody1);
112
- rollbar.testData.postStub = stubPostWithResponse('https://example.com', 201, testHeaders4, testBody2);
113
-
114
- var func = async function(callback) {
115
- // Invoke telemetry events
116
- console.info(testMessage1, testMessagePart);
117
- rollbar.testData.response1 = await request(http, 'http://example.com/api/users', { method: 'GET', headers: testHeaders1 });
118
- console.error(testMessage2);
119
- rollbar.testData.response2 = await request(https, 'https://example.com/api/users', { method: 'POST', headers: testHeaders2 });
120
-
121
- await uncaught(rollbar);
122
- callback(rollbar);
123
- }
124
- func(this.callback);
125
- },
126
- 'exception payload should have telemetry': function(r) {
127
- var addItemStub = r.testData.addItemStub;
128
- var response1 = r.testData.response1;
129
- var response2 = r.testData.response2;
130
-
131
- assert.isTrue(addItemStub.called);
132
- var telemetry = addItemStub.getCall(0).args[3].data.body.telemetry;
133
-
134
- // Verify that the responses were received intact.
135
- assert.deepStrictEqual(response1.headers, testHeaders3);
136
- assert.deepStrictEqual(response2.headers, testHeaders4);
137
- assert.deepStrictEqual(response1.statusCode, 200);
138
- assert.deepStrictEqual(response2.statusCode, 201);
139
-
140
- // Verify telemetry items and order
141
- assert.deepStrictEqual(telemetry[0].level, 'info');
142
- assert.deepStrictEqual(telemetry[0].type, 'log');
143
- assert.deepStrictEqual(telemetry[0].body.message, 'test console message , extra part\n');
144
-
145
- assert.deepStrictEqual(telemetry[1].level, 'info');
146
- assert.deepStrictEqual(telemetry[1].type, 'network');
147
- assert.deepStrictEqual(telemetry[1].body.method, 'GET');
148
- assert.deepStrictEqual(telemetry[1].body.url, 'http://example.com/api/users');
149
- assert.deepStrictEqual(telemetry[1].body.status_code, 200);
150
- assert.deepStrictEqual(telemetry[1].body.subtype, 'http');
151
-
152
- assert.deepStrictEqual(telemetry[2].level, 'error');
153
- assert.deepStrictEqual(telemetry[2].type, 'log');
154
- assert.deepStrictEqual(telemetry[2].body.message, 'test console error message\n');
155
-
156
- assert.deepStrictEqual(telemetry[3].level, 'info');
157
- assert.deepStrictEqual(telemetry[3].type, 'network');
158
- assert.deepStrictEqual(telemetry[3].body.method, 'POST');
159
- assert.deepStrictEqual(telemetry[3].body.url, 'https://example.com/api/users');
160
- assert.deepStrictEqual(telemetry[3].body.status_code, 201);
161
- assert.deepStrictEqual(telemetry[3].body.subtype, 'http');
162
-
163
- // Verify headers are omitted
164
- assert.deepEqual(telemetry[1].body.request_headers, undefined);
165
- assert.deepEqual(telemetry[1].body.response.headers, undefined);
166
- assert.deepEqual(telemetry[3].body.request_headers, undefined);
167
- assert.deepEqual(telemetry[3].body.response.headers, undefined);
168
-
169
- addItemStub.restore();
170
- }
171
- }
172
- })
173
- .addBatch({
174
- 'with log and network capture enabled with headers enabled': {
175
- topic: function() {
176
- var rollbar = new Rollbar({
177
- accessToken: 'abc123',
178
- captureUncaught: true,
179
- autoInstrument: {
180
- network: true,
181
- networkResponseHeaders: true,
182
- networkRequestHeaders: true
183
- }
184
- });
185
- rollbar.testData = {};
186
- var notifier = rollbar.client.notifier;
187
- rollbar.testData.addItemStub = sinon.stub(notifier.queue, 'addItem');
188
- rollbar.testData.getStub = stubGetWithResponse('https://example.com', 200, testHeaders3, testBody1);
189
- rollbar.testData.postStub = stubPostWithResponse('http://example.com', 201, testHeaders4, testBody2);
190
-
191
- var func = async function(callback) {
192
- // Invoke telemetry events
193
- console.info(testMessage1, testMessagePart);
194
- rollbar.testData.response1 = await request(https, 'https://example.com/api/users', { method: 'GET', headers: testHeaders1 });
195
- console.error(testMessage2);
196
- rollbar.testData.response2 = await request(http, 'http://example.com/api/users', { method: 'POST', headers: testHeaders2 });
197
-
198
- await message(rollbar);
199
- callback(rollbar);
200
- }
201
- func(this.callback);
202
- },
203
- 'message payload should have telemetry': function(r) {
204
- var addItemStub = r.testData.addItemStub;
205
-
206
- assert.isTrue(addItemStub.called);
207
- var telemetry = addItemStub.getCall(0).args[3].data.body.telemetry;
208
-
209
- // Verify headers captures, with scrubbing
210
- assert.deepStrictEqual(telemetry[1].body.request_headers, { 'Content-Type': 'application/json', 'X-access-token': '********' });
211
- assert.deepStrictEqual(telemetry[1].body.response.headers, { 'content-type': 'application/json', foo: '123' });
212
- assert.deepStrictEqual(telemetry[3].body.request_headers, { authorization: '********', foo: '456' });
213
- assert.deepStrictEqual(telemetry[3].body.response.headers, { authorization: '********', bar: '456' });
214
-
215
- addItemStub.restore();
216
- }
217
- }
218
- })
219
- .addBatch({
220
- 'with telemetry disabled': {
221
- topic: function() {
222
- var rollbar = new Rollbar({
223
- accessToken: 'abc123',
224
- captureUncaught: true
225
- });
226
- rollbar.testData = {};
227
- var notifier = rollbar.client.notifier;
228
- rollbar.testData.addItemStub = sinon.stub(notifier.queue, 'addItem');
229
- rollbar.testData.getStub = stubGetWithResponse('https://example.com', 200, testHeaders3, testBody1);
230
- rollbar.testData.postStub = stubPostWithResponse('https://example.com', 201, testHeaders4, testBody2);
231
-
232
- var func = async function(callback) {
233
- // Invoke telemetry events
234
- console.info(testMessage1, testMessagePart);
235
- rollbar.testData.response1 = await request(https, 'https://example.com/api/users', { method: 'GET', headers: testHeaders1 });
236
- console.error(testMessage2);
237
- rollbar.testData.response2 = await request(https, 'https://example.com/api/users', { method: 'POST', headers: testHeaders2 });
238
-
239
- await message(rollbar);
240
- callback(rollbar);
241
- }
242
- func(this.callback);
243
- },
244
- 'payload should not have telemetry': function(r) {
245
- var addItemStub = r.testData.addItemStub;
246
-
247
- assert.isTrue(addItemStub.called);
248
- var telemetry = addItemStub.getCall(0).args[3].data.body.telemetry;
249
-
250
- // Verify telemetry is empty
251
- assert.deepEqual(telemetry, []);
252
- }
253
- }
254
- })
255
- .addBatch({
256
- 'with callback request and error response': {
257
- topic: function() {
258
- var rollbar = new Rollbar({
259
- accessToken: 'abc123',
260
- captureUncaught: true,
261
- autoInstrument: {
262
- network: true,
263
- networkResponseHeaders: true,
264
- networkRequestHeaders: true
265
- }
266
- });
267
- var notifier = rollbar.client.notifier;
268
- rollbar.testData = {};
269
- rollbar.testData.addItemStub = sinon.stub(notifier.queue, 'addItem');
270
-
271
- var func = async function(callback) {
272
- var options = {
273
- method: 'GET',
274
- protocol: 'https:',
275
- host: 'example.com',
276
- path: '/api/users',
277
- headers: testHeaders1,
278
- };
279
-
280
- // Invoke telemetry events
281
- console.info(testMessage1, testMessagePart);
282
- rollbar.testData.getStub = stubGetWithResponse('https://example.com', 200, testHeaders3, testBody1);
283
- rollbar.testData.response1 = await requestWithCallback(https, options).catch((e) => e);
284
- console.error(testMessage2);
285
- rollbar.testData.errorStub = stubGetWithError('https://example.com');
286
- rollbar.testData.response2 = await requestWithCallback(https, options).catch((e) => e);
287
-
288
- await message(rollbar);
289
- callback(rollbar);
290
- }
291
- func(this.callback);
292
- },
293
- 'message payload should have telemetry or error info': function(r) {
294
- var addItemStub = r.testData.addItemStub;
295
- var response1 = r.testData.response1;
296
- var response2 = r.testData.response2;
297
-
298
- assert.isTrue(addItemStub.called);
299
- var telemetry = addItemStub.getCall(0).args[3].data.body.telemetry;
300
-
301
- // Verify that the responses were received intact.
302
- assert.deepStrictEqual(response1.headers, testHeaders3);
303
- assert.deepStrictEqual(response1.statusCode, 200);
304
- assert(response2 instanceof Error);
305
-
306
- // Verify telemetry
307
- assert.deepStrictEqual(telemetry[1].body.request_headers, { 'Content-Type': 'application/json', 'X-access-token': '********' });
308
- assert.deepStrictEqual(telemetry[1].body.response.headers, { 'content-type': 'application/json', foo: '123' });
309
- assert.deepStrictEqual(telemetry[3].body.request_headers, { 'Content-Type': 'application/json', 'X-access-token': '********' });
310
- assert.deepStrictEqual(telemetry[3].body.response, undefined);
311
- assert.deepStrictEqual(telemetry[3].body.status_code, 0);
312
- assert.deepStrictEqual(telemetry[3].body.error, 'Error: dns error');
313
-
314
-
315
- addItemStub.restore();
316
- }
317
- }
318
- }).export(module, {error: false});