rollbar 2.26.4 → 3.0.0-alpha.2

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 (140) hide show
  1. package/.claude/settings.local.json +3 -0
  2. package/.cursor/rules/guidelines.mdc +154 -0
  3. package/.github/workflows/ci.yml +4 -6
  4. package/CLAUDE.local.md +297 -0
  5. package/CLAUDE.md +201 -0
  6. package/CLAUDE.testrunner.md +470 -0
  7. package/Gruntfile.js +59 -16
  8. package/Makefile +3 -3
  9. package/SECURITY.md +5 -0
  10. package/babel.config.json +9 -0
  11. package/codex.md +148 -0
  12. package/dist/plugins/jquery.min.js +1 -1
  13. package/dist/rollbar.js +19332 -6596
  14. package/dist/rollbar.js.map +1 -1
  15. package/dist/rollbar.min.js +2 -1
  16. package/dist/rollbar.min.js.LICENSE.txt +1 -0
  17. package/dist/rollbar.min.js.map +1 -1
  18. package/dist/rollbar.named-amd.js +19332 -6596
  19. package/dist/rollbar.named-amd.js.map +1 -1
  20. package/dist/rollbar.named-amd.min.js +2 -1
  21. package/dist/rollbar.named-amd.min.js.LICENSE.txt +1 -0
  22. package/dist/rollbar.named-amd.min.js.map +1 -1
  23. package/dist/rollbar.noconflict.umd.js +19319 -6581
  24. package/dist/rollbar.noconflict.umd.js.map +1 -1
  25. package/dist/rollbar.noconflict.umd.min.js +2 -1
  26. package/dist/rollbar.noconflict.umd.min.js.LICENSE.txt +1 -0
  27. package/dist/rollbar.noconflict.umd.min.js.map +1 -1
  28. package/dist/rollbar.snippet.js +1 -1
  29. package/dist/rollbar.umd.js +19333 -6597
  30. package/dist/rollbar.umd.js.map +1 -1
  31. package/dist/rollbar.umd.min.js +2 -1
  32. package/dist/rollbar.umd.min.js.LICENSE.txt +1 -0
  33. package/dist/rollbar.umd.min.js.map +1 -1
  34. package/eslint.config.mjs +33 -0
  35. package/karma.conf.js +5 -14
  36. package/package.json +19 -20
  37. package/src/api.js +57 -4
  38. package/src/apiUtility.js +2 -3
  39. package/src/browser/core.js +37 -9
  40. package/src/browser/replay/defaults.js +70 -0
  41. package/src/browser/replay/recorder.js +194 -0
  42. package/src/browser/replay/replayMap.js +195 -0
  43. package/src/browser/rollbar.js +11 -7
  44. package/src/browser/telemetry.js +3 -3
  45. package/src/browser/transport/fetch.js +17 -4
  46. package/src/browser/transport/xhr.js +17 -1
  47. package/src/browser/transport.js +11 -8
  48. package/src/defaults.js +1 -1
  49. package/src/queue.js +65 -4
  50. package/src/react-native/rollbar.js +1 -1
  51. package/src/rollbar.js +52 -10
  52. package/src/server/rollbar.js +3 -2
  53. package/src/telemetry.js +76 -11
  54. package/src/tracing/context.js +24 -0
  55. package/src/tracing/contextManager.js +37 -0
  56. package/src/tracing/defaults.js +7 -0
  57. package/src/tracing/exporter.js +188 -0
  58. package/src/tracing/hrtime.js +98 -0
  59. package/src/tracing/id.js +24 -0
  60. package/src/tracing/session.js +55 -0
  61. package/src/tracing/span.js +92 -0
  62. package/src/tracing/spanProcessor.js +15 -0
  63. package/src/tracing/tracer.js +46 -0
  64. package/src/tracing/tracing.js +89 -0
  65. package/src/utility.js +34 -0
  66. package/test/api.test.js +57 -12
  67. package/test/apiUtility.test.js +5 -6
  68. package/test/browser.core.test.js +1 -10
  69. package/test/browser.domUtility.test.js +1 -1
  70. package/test/browser.predicates.test.js +1 -1
  71. package/test/browser.replay.recorder.test.js +430 -0
  72. package/test/browser.rollbar.test.js +58 -12
  73. package/test/browser.telemetry.test.js +1 -1
  74. package/test/browser.transforms.test.js +20 -13
  75. package/test/browser.transport.test.js +5 -4
  76. package/test/browser.url.test.js +1 -1
  77. package/test/fixtures/replay/index.js +20 -0
  78. package/test/fixtures/replay/payloads.fixtures.js +229 -0
  79. package/test/fixtures/replay/rrwebEvents.fixtures.js +251 -0
  80. package/test/fixtures/replay/rrwebSyntheticEvents.fixtures.js +328 -0
  81. package/test/notifier.test.js +1 -1
  82. package/test/predicates.test.js +1 -1
  83. package/test/queue.test.js +1 -1
  84. package/test/rateLimiter.test.js +1 -1
  85. package/test/react-native.rollbar.test.js +1 -1
  86. package/test/react-native.transforms.test.js +2 -2
  87. package/test/react-native.transport.test.js +3 -3
  88. package/test/replay/index.js +2 -0
  89. package/test/replay/integration/api.spans.test.js +136 -0
  90. package/test/replay/integration/e2e.test.js +228 -0
  91. package/test/replay/integration/index.js +9 -0
  92. package/test/replay/integration/queue.replayMap.test.js +332 -0
  93. package/test/replay/integration/replayMap.test.js +163 -0
  94. package/test/replay/integration/sessionRecording.test.js +390 -0
  95. package/test/replay/unit/api.postSpans.test.js +150 -0
  96. package/test/replay/unit/index.js +7 -0
  97. package/test/replay/unit/queue.replayMap.test.js +225 -0
  98. package/test/replay/unit/replayMap.test.js +348 -0
  99. package/test/replay/util/index.js +5 -0
  100. package/test/replay/util/mockRecordFn.js +80 -0
  101. package/test/server.lambda.mocha.test.mjs +172 -0
  102. package/test/server.locals.constructor.mocha.test.mjs +80 -0
  103. package/test/server.locals.error-handling.mocha.test.mjs +387 -0
  104. package/test/server.locals.merge.mocha.test.mjs +267 -0
  105. package/test/server.locals.test-utils.mjs +114 -0
  106. package/test/server.parser.mocha.test.mjs +87 -0
  107. package/test/server.predicates.mocha.test.mjs +63 -0
  108. package/test/server.rollbar.constructor.mocha.test.mjs +199 -0
  109. package/test/server.rollbar.handlers.mocha.test.mjs +253 -0
  110. package/test/server.rollbar.logging.mocha.test.mjs +326 -0
  111. package/test/server.rollbar.misc.mocha.test.mjs +44 -0
  112. package/test/server.rollbar.test-utils.mjs +57 -0
  113. package/test/server.telemetry.mocha.test.mjs +377 -0
  114. package/test/server.transforms.data.mocha.test.mjs +163 -0
  115. package/test/server.transforms.error.mocha.test.mjs +199 -0
  116. package/test/server.transforms.request.mocha.test.mjs +208 -0
  117. package/test/server.transforms.scrub.mocha.test.mjs +140 -0
  118. package/test/server.transforms.sourcemaps.mocha.test.mjs +122 -0
  119. package/test/server.transforms.test-utils.mjs +62 -0
  120. package/test/server.transport.mocha.test.mjs +269 -0
  121. package/test/telemetry.test.js +132 -1
  122. package/test/tracing/contextManager.test.js +28 -0
  123. package/test/tracing/exporter.toPayload.test.js +400 -0
  124. package/test/tracing/id.test.js +24 -0
  125. package/test/tracing/span.test.js +183 -0
  126. package/test/tracing/spanProcessor.test.js +73 -0
  127. package/test/tracing/tracing.test.js +105 -0
  128. package/test/transforms.test.js +2 -2
  129. package/test/truncation.test.js +2 -2
  130. package/test/utility.test.js +44 -6
  131. package/webpack.config.js +6 -44
  132. package/.eslintignore +0 -7
  133. package/test/server.lambda.test.js +0 -194
  134. package/test/server.locals.test.js +0 -1068
  135. package/test/server.parser.test.js +0 -78
  136. package/test/server.predicates.test.js +0 -91
  137. package/test/server.rollbar.test.js +0 -728
  138. package/test/server.telemetry.test.js +0 -443
  139. package/test/server.transforms.test.js +0 -1193
  140. package/test/server.transport.test.js +0 -269
@@ -1,443 +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
- var { mergeOptions } = require('../src/server/telemetry/urlHelpers');
13
- const { URL } = require('url');
14
-
15
- function wait(ms) {
16
- return new Promise((resolve) => {
17
- setTimeout(resolve, ms);
18
- });
19
- }
20
-
21
- async function uncaught() {
22
- setTimeout(function () {
23
- throw new Error('rollbar error');
24
- }, 1);
25
- await wait(300);
26
- }
27
-
28
- async function message(rollbar) {
29
- setTimeout(function () {
30
- rollbar.info('rollbar info message');
31
- }, 1);
32
- await wait(300);
33
- }
34
-
35
- function request(transport, url, options, body) {
36
- return new Promise((resolve, reject) => {
37
- var req = url
38
- ? transport.request(url, options)
39
- : transport.request(options);
40
-
41
- req.on('response', (res) => {
42
- resolve(res);
43
- });
44
-
45
- req.on('error', (err) => {
46
- reject(err);
47
- });
48
-
49
- if (body) {
50
- req.write(body);
51
- }
52
-
53
- req.end();
54
- });
55
- }
56
-
57
- function requestWithCallback(transport, options, body) {
58
- return new Promise((resolve, reject) => {
59
- var req = transport.request(options, function (res) {
60
- resolve(res);
61
- });
62
-
63
- req.on('error', (err) => {
64
- reject(err);
65
- });
66
-
67
- if (body) {
68
- req.write(body);
69
- }
70
-
71
- req.end();
72
- });
73
- }
74
-
75
- function stubPostWithResponse(url, status, headers, body) {
76
- return nock(url).post('/api/users').reply(status, body, headers);
77
- }
78
-
79
- function stubGetWithResponse(url, status, headers, body) {
80
- return nock(url).get('/api/users').reply(status, body, headers);
81
- }
82
-
83
- function stubGetWithError(url) {
84
- return nock(url).get('/api/users').replyWithError('dns error');
85
- }
86
-
87
- var testHeaders1 = {
88
- 'Content-Type': 'application/json',
89
- 'X-access-token': '123',
90
- };
91
- var testHeaders2 = { authorization: 'abc', foo: '456' };
92
- var testHeaders3 = { 'content-type': 'application/json', foo: '123' };
93
- var testHeaders4 = { authorization: 'abc', bar: '456' };
94
- var testBody1 = 'test body 1';
95
- var testBody2 = 'test body 2';
96
- var testMessage1 = 'test console message';
97
- var testMessage2 = 'test console error message';
98
- var testMessagePart = ', extra part';
99
-
100
- vows
101
- .describe('telemetry')
102
- .addBatch({
103
- 'with log and network capture enabled': {
104
- topic: function () {
105
- var rollbar = new Rollbar({
106
- accessToken: 'abc123',
107
- captureUncaught: true,
108
- autoInstrument: true,
109
- });
110
- rollbar.testData = {};
111
- var notifier = rollbar.client.notifier;
112
- rollbar.testData.addItemStub = sinon.stub(notifier.queue, 'addItem');
113
- rollbar.testData.getStub = stubGetWithResponse(
114
- 'http://example.com',
115
- 200,
116
- testHeaders3,
117
- testBody1,
118
- );
119
- rollbar.testData.postStub = stubPostWithResponse(
120
- 'https://example.com',
121
- 201,
122
- testHeaders4,
123
- testBody2,
124
- );
125
-
126
- var func = async function (callback) {
127
- // Invoke telemetry events
128
- console.info(testMessage1, testMessagePart);
129
- rollbar.testData.response1 = await request(
130
- http,
131
- 'http://example.com/api/users',
132
- { method: 'GET', headers: testHeaders1 },
133
- );
134
- console.error(testMessage2);
135
- rollbar.testData.response2 = await request(
136
- https,
137
- 'https://example.com/api/users',
138
- { method: 'POST', headers: testHeaders2 },
139
- );
140
-
141
- await uncaught(rollbar);
142
- callback(rollbar);
143
- };
144
- func(this.callback);
145
- },
146
- 'exception payload should have telemetry': function (r) {
147
- var addItemStub = r.testData.addItemStub;
148
- var response1 = r.testData.response1;
149
- var response2 = r.testData.response2;
150
-
151
- assert.isTrue(addItemStub.called);
152
- var telemetry = addItemStub.getCall(0).args[3].data.body.telemetry;
153
-
154
- // Verify that the responses were received intact.
155
- assert.deepStrictEqual(response1.headers, testHeaders3);
156
- assert.deepStrictEqual(response2.headers, testHeaders4);
157
- assert.deepStrictEqual(response1.statusCode, 200);
158
- assert.deepStrictEqual(response2.statusCode, 201);
159
-
160
- // Verify telemetry items and order
161
- assert.deepStrictEqual(telemetry[0].level, 'info');
162
- assert.deepStrictEqual(telemetry[0].type, 'log');
163
- assert.deepStrictEqual(
164
- telemetry[0].body.message,
165
- 'test console message , extra part\n',
166
- );
167
-
168
- assert.deepStrictEqual(telemetry[1].level, 'info');
169
- assert.deepStrictEqual(telemetry[1].type, 'network');
170
- assert.deepStrictEqual(telemetry[1].body.method, 'GET');
171
- assert.deepStrictEqual(
172
- telemetry[1].body.url,
173
- 'http://example.com/api/users',
174
- );
175
- assert.deepStrictEqual(telemetry[1].body.status_code, 200);
176
- assert.deepStrictEqual(telemetry[1].body.subtype, 'http');
177
-
178
- assert.deepStrictEqual(telemetry[2].level, 'error');
179
- assert.deepStrictEqual(telemetry[2].type, 'log');
180
- assert.deepStrictEqual(
181
- telemetry[2].body.message,
182
- 'test console error message\n',
183
- );
184
-
185
- assert.deepStrictEqual(telemetry[3].level, 'info');
186
- assert.deepStrictEqual(telemetry[3].type, 'network');
187
- assert.deepStrictEqual(telemetry[3].body.method, 'POST');
188
- assert.deepStrictEqual(
189
- telemetry[3].body.url,
190
- 'https://example.com/api/users',
191
- );
192
- assert.deepStrictEqual(telemetry[3].body.status_code, 201);
193
- assert.deepStrictEqual(telemetry[3].body.subtype, 'http');
194
-
195
- // Verify headers are omitted
196
- assert.deepEqual(telemetry[1].body.request_headers, undefined);
197
- assert.deepEqual(telemetry[1].body.response.headers, undefined);
198
- assert.deepEqual(telemetry[3].body.request_headers, undefined);
199
- assert.deepEqual(telemetry[3].body.response.headers, undefined);
200
-
201
- addItemStub.restore();
202
- },
203
- },
204
- })
205
- .addBatch({
206
- 'with log and network capture enabled with headers enabled': {
207
- topic: function () {
208
- var rollbar = new Rollbar({
209
- accessToken: 'abc123',
210
- captureUncaught: true,
211
- autoInstrument: {
212
- network: true,
213
- networkResponseHeaders: true,
214
- networkRequestHeaders: true,
215
- },
216
- });
217
- rollbar.testData = {};
218
- var notifier = rollbar.client.notifier;
219
- rollbar.testData.addItemStub = sinon.stub(notifier.queue, 'addItem');
220
- rollbar.testData.getStub = stubGetWithResponse(
221
- 'https://example.com',
222
- 200,
223
- testHeaders3,
224
- testBody1,
225
- );
226
- rollbar.testData.postStub = stubPostWithResponse(
227
- 'http://example.com',
228
- 201,
229
- testHeaders4,
230
- testBody2,
231
- );
232
-
233
- var func = async function (callback) {
234
- // Invoke telemetry events
235
- console.info(testMessage1, testMessagePart);
236
- rollbar.testData.response1 = await request(
237
- https,
238
- 'https://example.com/api/users',
239
- { method: 'GET', headers: testHeaders1 },
240
- );
241
- console.error(testMessage2);
242
- rollbar.testData.response2 = await request(
243
- http,
244
- 'http://example.com/api/users',
245
- { method: 'POST', headers: testHeaders2 },
246
- );
247
-
248
- await message(rollbar);
249
- callback(rollbar);
250
- };
251
- func(this.callback);
252
- },
253
- 'message payload should have telemetry': function (r) {
254
- var addItemStub = r.testData.addItemStub;
255
-
256
- assert.isTrue(addItemStub.called);
257
- var telemetry = addItemStub.getCall(0).args[3].data.body.telemetry;
258
-
259
- // Verify headers captures, with scrubbing
260
- assert.deepStrictEqual(telemetry[1].body.request_headers, {
261
- 'Content-Type': 'application/json',
262
- 'X-access-token': '********',
263
- });
264
- assert.deepStrictEqual(telemetry[1].body.response.headers, {
265
- 'content-type': 'application/json',
266
- foo: '123',
267
- });
268
- assert.deepStrictEqual(telemetry[3].body.request_headers, {
269
- authorization: '********',
270
- foo: '456',
271
- });
272
- assert.deepStrictEqual(telemetry[3].body.response.headers, {
273
- authorization: '********',
274
- bar: '456',
275
- });
276
-
277
- addItemStub.restore();
278
- },
279
- },
280
- })
281
- .addBatch({
282
- 'with telemetry disabled': {
283
- topic: function () {
284
- var rollbar = new Rollbar({
285
- accessToken: 'abc123',
286
- captureUncaught: true,
287
- });
288
- rollbar.testData = {};
289
- var notifier = rollbar.client.notifier;
290
- rollbar.testData.addItemStub = sinon.stub(notifier.queue, 'addItem');
291
- rollbar.testData.getStub = stubGetWithResponse(
292
- 'https://example.com',
293
- 200,
294
- testHeaders3,
295
- testBody1,
296
- );
297
- rollbar.testData.postStub = stubPostWithResponse(
298
- 'https://example.com',
299
- 201,
300
- testHeaders4,
301
- testBody2,
302
- );
303
-
304
- var func = async function (callback) {
305
- // Invoke telemetry events
306
- console.info(testMessage1, testMessagePart);
307
- rollbar.testData.response1 = await request(
308
- https,
309
- 'https://example.com/api/users',
310
- { method: 'GET', headers: testHeaders1 },
311
- );
312
- console.error(testMessage2);
313
- rollbar.testData.response2 = await request(
314
- https,
315
- 'https://example.com/api/users',
316
- { method: 'POST', headers: testHeaders2 },
317
- );
318
-
319
- await message(rollbar);
320
- callback(rollbar);
321
- };
322
- func(this.callback);
323
- },
324
- 'payload should not have telemetry': function (r) {
325
- var addItemStub = r.testData.addItemStub;
326
-
327
- assert.isTrue(addItemStub.called);
328
- var telemetry = addItemStub.getCall(0).args[3].data.body.telemetry;
329
-
330
- // Verify telemetry is empty
331
- assert.deepEqual(telemetry, []);
332
- },
333
- },
334
- })
335
- .addBatch({
336
- 'with callback request and error response': {
337
- topic: function () {
338
- var rollbar = new Rollbar({
339
- accessToken: 'abc123',
340
- captureUncaught: true,
341
- autoInstrument: {
342
- network: true,
343
- networkResponseHeaders: true,
344
- networkRequestHeaders: true,
345
- },
346
- });
347
- var notifier = rollbar.client.notifier;
348
- rollbar.testData = {};
349
- rollbar.testData.addItemStub = sinon.stub(notifier.queue, 'addItem');
350
-
351
- var func = async function (callback) {
352
- var options = {
353
- method: 'GET',
354
- protocol: 'https:',
355
- host: 'example.com',
356
- path: '/api/users',
357
- headers: testHeaders1,
358
- };
359
-
360
- // Invoke telemetry events
361
- console.info(testMessage1, testMessagePart);
362
- rollbar.testData.getStub = stubGetWithResponse(
363
- 'https://example.com',
364
- 200,
365
- testHeaders3,
366
- testBody1,
367
- );
368
- rollbar.testData.response1 = await requestWithCallback(
369
- https,
370
- options,
371
- ).catch((e) => e);
372
- console.error(testMessage2);
373
- rollbar.testData.errorStub = stubGetWithError('https://example.com');
374
- rollbar.testData.response2 = await requestWithCallback(
375
- https,
376
- options,
377
- ).catch((e) => e);
378
-
379
- await message(rollbar);
380
- callback(rollbar);
381
- };
382
- func(this.callback);
383
- },
384
- 'message payload should have telemetry or error info': function (r) {
385
- var addItemStub = r.testData.addItemStub;
386
- var response1 = r.testData.response1;
387
- var response2 = r.testData.response2;
388
-
389
- assert.isTrue(addItemStub.called);
390
- var telemetry = addItemStub.getCall(0).args[3].data.body.telemetry;
391
-
392
- // Verify that the responses were received intact.
393
- assert.deepStrictEqual(response1.headers, testHeaders3);
394
- assert.deepStrictEqual(response1.statusCode, 200);
395
- assert(response2 instanceof Error);
396
-
397
- // Verify telemetry
398
- assert.deepStrictEqual(telemetry[1].body.request_headers, {
399
- 'Content-Type': 'application/json',
400
- 'X-access-token': '********',
401
- });
402
- assert.deepStrictEqual(telemetry[1].body.response.headers, {
403
- 'content-type': 'application/json',
404
- foo: '123',
405
- });
406
- assert.deepStrictEqual(telemetry[3].body.request_headers, {
407
- 'Content-Type': 'application/json',
408
- 'X-access-token': '********',
409
- });
410
- assert.deepStrictEqual(telemetry[3].body.response, undefined);
411
- assert.deepStrictEqual(telemetry[3].body.status_code, 0);
412
- assert.deepStrictEqual(telemetry[3].body.error, 'Error: dns error');
413
-
414
- addItemStub.restore();
415
- },
416
- },
417
- })
418
- .addBatch({
419
- 'while using autoinstrument': {
420
- topic: function () {
421
- const optionsUsingStringUrl = mergeOptions(
422
- 'http://example.com/api/users',
423
- { method: 'GET', headers: testHeaders1 },
424
- );
425
- const optionsUsingClassUrl = mergeOptions(
426
- new URL('http://example.com/api/users'),
427
- { method: 'GET', headers: testHeaders1 },
428
- );
429
-
430
- return {
431
- optionsUsingStringUrl,
432
- optionsUsingClassUrl,
433
- };
434
- },
435
- 'mergeOptions should correctly handle URL and options': function ({
436
- optionsUsingStringUrl,
437
- optionsUsingClassUrl,
438
- }) {
439
- assert.deepStrictEqual(optionsUsingStringUrl, optionsUsingClassUrl);
440
- },
441
- },
442
- })
443
- .export(module, { error: false });