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
@@ -0,0 +1,62 @@
1
+ /**
2
+ * Common test utilities for server transforms tests
3
+ */
4
+
5
+ import Rollbar from '../src/server/rollbar.js';
6
+ import merge from '../src/merge.js';
7
+
8
+ export class CustomError extends Rollbar.Error {
9
+ constructor(message, nested) {
10
+ super(message, nested);
11
+ }
12
+ }
13
+
14
+ export const nodeVersion = process.versions.node
15
+ .split('.')
16
+ .map((v) => parseInt(v));
17
+
18
+ export const isMinNodeVersion = (major, minor) =>
19
+ nodeVersion[0] > major ||
20
+ (nodeVersion[0] === major && nodeVersion[1] >= minor);
21
+
22
+ export async function wait(ms) {
23
+ return new Promise((resolve) => {
24
+ setTimeout(resolve, ms);
25
+ });
26
+ }
27
+
28
+ export async function throwInScriptFile(filepath) {
29
+ // Dynamic imports inside setTimeout with async/await can create timing
30
+ // issues where the error escapes before Rollbar's handler can catch it.
31
+ const module = await import(filepath);
32
+ setTimeout(() => module.default(), 10);
33
+ await wait(500);
34
+ }
35
+
36
+ // Base test item factory for request-related tests
37
+ export function createTestItem(overrides = {}) {
38
+ const base = {
39
+ request: {
40
+ headers: {
41
+ host: 'example.com',
42
+ 'x-auth-token': '12345',
43
+ },
44
+ protocol: 'https',
45
+ url: '/some/endpoint',
46
+ ip: '192.192.192.1',
47
+ method: 'GET',
48
+ body: {
49
+ token: 'abc123',
50
+ something: 'else',
51
+ },
52
+ user: {
53
+ id: 42,
54
+ email: 'fake@example.com',
55
+ },
56
+ },
57
+ stuff: 'hey',
58
+ data: { other: 'thing' },
59
+ };
60
+
61
+ return merge(base, overrides);
62
+ }
@@ -0,0 +1,269 @@
1
+ /* globals describe */
2
+ /* globals it */
3
+
4
+ import { expect } from 'chai';
5
+ import Transport from '../src/server/transport.js';
6
+
7
+ class TestTransport {
8
+ constructor(options, error, response, assertions) {
9
+ this.options = options;
10
+ this.error = error;
11
+ this.response = response;
12
+ this.requestOpts = null;
13
+ this.requestCallback = null;
14
+ this.assertions = assertions;
15
+ }
16
+
17
+ request(opts, cb) {
18
+ this.requestOpts = opts;
19
+ this.requestCallback = cb;
20
+ return new TestRequest(this.error, this.response, this);
21
+ }
22
+ }
23
+
24
+ class TestRequest {
25
+ constructor(error, response, transport) {
26
+ this.error = error;
27
+ this.responseData = response;
28
+ this.data = [];
29
+ this.events = {};
30
+ this.transport = transport;
31
+ this.response = null;
32
+ }
33
+
34
+ write(data) {
35
+ this.data.push(data);
36
+ }
37
+
38
+ on(event, cb) {
39
+ this.events[event] = cb;
40
+ }
41
+
42
+ end() {
43
+ if (this.transport.assertions) {
44
+ this.transport.assertions();
45
+ }
46
+ if (this.error) {
47
+ if (this.events['error']) {
48
+ this.events['error'](this.error);
49
+ }
50
+ } else {
51
+ this.response = new TestResponse();
52
+ this.transport.requestCallback(this.response);
53
+ if (this.response.events['data']) {
54
+ this.response.events['data'](this.responseData);
55
+ }
56
+ if (this.response.events['end']) {
57
+ this.response.events['end']();
58
+ }
59
+ }
60
+ }
61
+ }
62
+
63
+ class TestResponse {
64
+ constructor(options = {}) {
65
+ this.encoding = null;
66
+ this.events = {};
67
+ this.headers = options.headers || {};
68
+ this.statusCode = options.statusCode || 200;
69
+ }
70
+
71
+ setEncoding(s) {
72
+ this.encoding = s;
73
+ }
74
+
75
+ on(event, cb) {
76
+ this.events[event] = cb;
77
+ }
78
+ }
79
+
80
+ const transportFactory = (error, response, assertions) => (options) =>
81
+ new TestTransport(options, error, response, assertions);
82
+
83
+ describe('transport', function () {
84
+ const t = new Transport();
85
+
86
+ describe('post', function () {
87
+ describe('base data', function () {
88
+ const baseData = {
89
+ accessToken: 'abc123',
90
+ options: {},
91
+ payload: {
92
+ access_token: 'abc123',
93
+ data: { a: 1 },
94
+ },
95
+ };
96
+
97
+ it('should have an error with no payload', function (done) {
98
+ const factory = transportFactory(
99
+ null,
100
+ '{"err": null, "result":"all good"}',
101
+ );
102
+
103
+ t.post(
104
+ baseData.accessToken,
105
+ baseData.options,
106
+ null,
107
+ (err, resp) => {
108
+ expect(err).to.exist;
109
+ expect(resp).to.not.exist;
110
+ done();
111
+ },
112
+ factory,
113
+ );
114
+ });
115
+
116
+ it('should have the right response data with a payload and no error', function (done) {
117
+ const factory = transportFactory(
118
+ null,
119
+ '{"err": null, "result":{"uuid":"42def", "message":"all good"}}',
120
+ function () {
121
+ expect(this.options.headers['Content-Type']).to.equal(
122
+ 'application/json',
123
+ );
124
+ expect(this.options.headers['Content-Length']).to.be.a('number');
125
+ expect(this.options.headers['Content-Length']).to.be.above(0);
126
+ expect(this.options.headers['X-Rollbar-Access-Token']).to.equal(
127
+ baseData.accessToken,
128
+ );
129
+ },
130
+ );
131
+
132
+ t.post(
133
+ baseData.accessToken,
134
+ baseData.options,
135
+ baseData.payload,
136
+ (err, resp) => {
137
+ expect(err).to.not.exist;
138
+ expect(resp.message).to.equal('all good');
139
+ done();
140
+ },
141
+ factory,
142
+ );
143
+ });
144
+
145
+ it('should error with a payload and an error in the response', function (done) {
146
+ const factory = transportFactory(
147
+ null,
148
+ '{"err": "bork", "message":"things broke"}',
149
+ function () {
150
+ expect(this.options.headers['Content-Type']).to.equal(
151
+ 'application/json',
152
+ );
153
+ expect(this.options.headers['Content-Length']).to.be.a('number');
154
+ expect(this.options.headers['Content-Length']).to.be.above(0);
155
+ expect(this.options.headers['X-Rollbar-Access-Token']).to.equal(
156
+ baseData.accessToken,
157
+ );
158
+ },
159
+ );
160
+
161
+ t.post(
162
+ baseData.accessToken,
163
+ baseData.options,
164
+ baseData.payload,
165
+ (err, resp) => {
166
+ expect(err).to.exist;
167
+ expect(err.message).to.match(/things broke/);
168
+ expect(resp).to.not.exist;
169
+ done();
170
+ },
171
+ factory,
172
+ );
173
+ });
174
+
175
+ it('should error with a payload and an error during sending', function (done) {
176
+ const factory = transportFactory(new Error('bork'), null, function () {
177
+ expect(this.options.headers['Content-Type']).to.equal(
178
+ 'application/json',
179
+ );
180
+ expect(this.options.headers['Content-Length']).to.be.a('number');
181
+ expect(this.options.headers['Content-Length']).to.be.above(0);
182
+ expect(this.options.headers['X-Rollbar-Access-Token']).to.equal(
183
+ baseData.accessToken,
184
+ );
185
+ });
186
+
187
+ t.post(
188
+ baseData.accessToken,
189
+ baseData.options,
190
+ baseData.payload,
191
+ (err, resp) => {
192
+ expect(err).to.exist;
193
+ expect(err.message).to.match(/bork/);
194
+ expect(resp).to.not.exist;
195
+ done();
196
+ },
197
+ factory,
198
+ );
199
+ });
200
+ });
201
+
202
+ describe('with rate limiting', function () {
203
+ let transport;
204
+
205
+ beforeEach(function () {
206
+ transport = new Transport();
207
+ });
208
+
209
+ it('should transmit non-rate limited requests', function (done) {
210
+ const factory = transportFactory(
211
+ null,
212
+ '{"err": null, "result": "all good"}',
213
+ );
214
+ const response = new TestResponse({
215
+ statusCode: 200,
216
+ headers: {
217
+ 'x-rate-limit-remaining': '1',
218
+ 'x-rate-limit-remaining-seconds': '100',
219
+ },
220
+ });
221
+
222
+ expect(transport.rateLimitExpires).to.equal(0);
223
+
224
+ transport.handleResponse(response);
225
+
226
+ transport.post(
227
+ 'token',
228
+ {},
229
+ 'payload',
230
+ (err) => {
231
+ expect(err).to.not.exist;
232
+ expect(Math.floor(Date.now() / 1000)).to.be.at.least(
233
+ transport.rateLimitExpires,
234
+ );
235
+ done();
236
+ },
237
+ factory,
238
+ );
239
+ });
240
+
241
+ it('should drop rate limited requests and set timeout', function (done) {
242
+ const factory = transportFactory(new Error('bork'), null);
243
+ const response = new TestResponse({
244
+ statusCode: 429,
245
+ headers: {
246
+ 'x-rate-limit-remaining': '0',
247
+ 'x-rate-limit-remaining-seconds': '100',
248
+ },
249
+ });
250
+
251
+ transport.handleResponse(response);
252
+
253
+ transport.post(
254
+ 'token',
255
+ {},
256
+ 'payload',
257
+ (err) => {
258
+ expect(err.message).to.match(/Exceeded rate limit/);
259
+ expect(Math.floor(Date.now() / 1000)).to.be.below(
260
+ transport.rateLimitExpires,
261
+ );
262
+ done();
263
+ },
264
+ factory,
265
+ );
266
+ });
267
+ });
268
+ });
269
+ });
@@ -3,7 +3,8 @@
3
3
  /* globals it */
4
4
  /* globals sinon */
5
5
 
6
- var Telemeter = require('../src/telemetry');
6
+ import Telemeter from '../src/telemetry.js';
7
+ import Tracing from '../src/tracing/tracing.js';
7
8
 
8
9
  describe('Telemetry()', function () {
9
10
  it('should have all of the expected methods', function (done) {
@@ -47,6 +48,136 @@ describe('captureEvent', function () {
47
48
  });
48
49
  });
49
50
 
51
+ describe('capture events', function () {
52
+ beforeEach(function () {
53
+ const tracing = new Tracing(
54
+ window,
55
+ {
56
+ resource: {
57
+ 'service.name': 'Test',
58
+ },
59
+ }
60
+ );
61
+ tracing.initSession();
62
+ this.t = new Telemeter({includeItemsInTelemetry: true}, tracing);
63
+ });
64
+
65
+ it('should return a valid log event', function (done) {
66
+ const timestamp = 12345.678;
67
+ const event = this.t.captureLog('foo', 'info', null, timestamp);
68
+ expect(event.type).to.equal('log');
69
+ expect(event.level).to.equal('info');
70
+ expect(event.body.message).to.equal('foo');
71
+ expect(event.timestamp_ms).to.equal(timestamp);
72
+
73
+ expect(this.t.telemetrySpan).to.be.an('object');
74
+ const otelEvent = this.t.telemetrySpan.span.events[0];
75
+ expect(otelEvent.name).to.equal('rollbar-log-event');
76
+ expect(otelEvent.time).to.eql([ 12, 345678000 ]);
77
+ expect(otelEvent.attributes).to.eql({ message: 'foo', level: 'info' });
78
+ done();
79
+ });
80
+
81
+ it('should return a valid error event', function (done) {
82
+ const timestamp = 12345.678;
83
+ const error = new Error('foo');
84
+ const uuid = '12345-67890';
85
+ const event = this.t.captureError(error, 'info', uuid, timestamp);
86
+ expect(event.type).to.eql('error');
87
+ expect(event.level).to.equal('info');
88
+ expect(event.body.message).to.equal('foo');
89
+ expect(event.timestamp_ms).to.equal(timestamp);
90
+
91
+ expect(this.t.telemetrySpan).to.be.an('object');
92
+ const otelEvent = this.t.telemetrySpan.span.events[0];
93
+ expect(otelEvent.name).to.eql('rollbar-occurrence-event');
94
+ expect(otelEvent.time).to.eql([ 12, 345678000 ]);
95
+ expect(otelEvent.attributes).to.eql(
96
+ { type: 'error', 'occurrence.type': 'error', message: 'foo', level: 'info', uuid: uuid, 'occurrence.uuid': uuid }
97
+ );
98
+ done();
99
+ });
100
+
101
+ it('should return a valid message event', function (done) {
102
+ const timestamp = 12345.678;
103
+ const uuid = '12345-67890';
104
+ const item = { message: 'foo', level: 'info', uuid: uuid, timestamp: timestamp };
105
+ const event = this.t._captureRollbarItem(item);
106
+ expect(event.type).to.eql('log');
107
+ expect(event.level).to.equal('info');
108
+ expect(event.body.message).to.equal('foo');
109
+ expect(event.timestamp_ms).to.equal(timestamp);
110
+
111
+ expect(this.t.telemetrySpan).to.be.an('object');
112
+ const otelEvent = this.t.telemetrySpan.span.events[0];
113
+ expect(otelEvent.name).to.eql('rollbar-occurrence-event');
114
+ expect(otelEvent.time).to.eql([ 12, 345678000 ]);
115
+ expect(otelEvent.attributes).to.eql(
116
+ { type: 'message', 'occurrence.type': 'message', message: 'foo', level: 'info', uuid: uuid, 'occurrence.uuid': uuid }
117
+ );
118
+ done();
119
+ });
120
+
121
+ it('should return a valid navigation event', function (done) {
122
+ const timestamp = 12345.678;
123
+ const from = 'foo';
124
+ const to = 'bar';
125
+ const event = this.t.captureNavigation(from, to, null, timestamp);
126
+ expect(event.type).to.equal('navigation');
127
+ expect(event.level).to.equal('info');
128
+ expect(event.body.from).to.equal('foo');
129
+ expect(event.body.to).to.equal('bar');
130
+ expect(event.timestamp_ms).to.equal(timestamp);
131
+
132
+ expect(this.t.telemetrySpan).to.be.an('object');
133
+ const otelEvent = this.t.telemetrySpan.span.events[0];
134
+ expect(otelEvent.name).to.equal('rollbar-navigation-event');
135
+ expect(otelEvent.time).to.eql([ 12, 345678000 ]);
136
+ expect(otelEvent.attributes).to.eql({ 'previous.url.full': 'foo', 'url.full': 'bar' });
137
+ done();
138
+ });
139
+
140
+ it('should return a valid network event', function (done) {
141
+ const subtype = 'xhr';
142
+ const timestamp = 12345.678;
143
+ const metadata = {
144
+ url: 'https://example.com',
145
+ method: 'GET',
146
+ status_code: 400,
147
+ request_headers: { 'Content-Type': 'application/json' },
148
+ response: {
149
+ headers: { 'Content-Type': 'application/json' },
150
+ },
151
+ start_time_ms: timestamp,
152
+ end_time_ms: 12345678,
153
+ };
154
+ const event = this.t.captureNetwork(metadata, subtype, null, null);
155
+ expect(event.type).to.eql('network');
156
+ expect(event.level).to.equal('error');
157
+ expect(event.body.url).to.equal(metadata.url);
158
+ expect(event.body.method).to.equal(metadata.method);
159
+ expect(event.body.status_code).to.equal(metadata.status_code);
160
+ expect(event.timestamp_ms).to.equal(timestamp);
161
+
162
+ expect(this.t.telemetrySpan).to.be.an('object');
163
+ const otelEvent = this.t.telemetrySpan.span.events[0];
164
+ expect(otelEvent.name).to.eql('rollbar-network-event');
165
+ expect(otelEvent.time).to.eql([ 12, 345678000 ]);
166
+ expect(otelEvent.attributes).to.eql(
167
+ {
168
+ type: subtype,
169
+ method: metadata.method,
170
+ statusCode: metadata.status_code,
171
+ url: metadata.url,
172
+ 'request.headers': JSON.stringify(metadata.request_headers),
173
+ 'response.headers': JSON.stringify(metadata.response.headers),
174
+ 'response.timeUnixNano': (metadata.end_time_ms * 1e6).toString(),
175
+ }
176
+ );
177
+ done();
178
+ });
179
+ });
180
+
50
181
  describe('filterTelemetry', function () {
51
182
  it("should filter out events that don't match the test", function (done) {
52
183
  var options = {
@@ -0,0 +1,28 @@
1
+ /* globals describe */
2
+ /* globals it */
3
+
4
+ import { expect } from 'chai';
5
+
6
+ import { ContextManager, createContextKey } from '../../src/tracing/contextManager.js';
7
+ import { ROOT_CONTEXT } from '../../src/tracing/context.js';
8
+
9
+ describe('ContextManager()', function () {
10
+ it('should process pending spans', function (done) {
11
+ const SPAN_KEY = createContextKey('Rollbar Context Key SPAN');
12
+ const contextManager = new ContextManager();
13
+
14
+ expect(contextManager.active()).to.equal(ROOT_CONTEXT);
15
+
16
+ let context = contextManager.active().setValue(SPAN_KEY, 'a')
17
+ let prevContext = contextManager.enterContext(context);
18
+
19
+ expect(prevContext).to.equal(ROOT_CONTEXT);
20
+ expect(contextManager.active()).to.equal(context);
21
+
22
+ contextManager.exitContext(prevContext);
23
+
24
+ expect(contextManager.active()).to.equal(ROOT_CONTEXT);
25
+
26
+ done();
27
+ });
28
+ });