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,676 +0,0 @@
1
- 'use strict';
2
-
3
- var assert = require('assert');
4
- var vows = require('vows');
5
- var sinon = require('sinon');
6
-
7
- process.env.NODE_ENV = process.env.NODE_ENV || 'test-node-env';
8
- var Rollbar = require('../src/server/rollbar');
9
-
10
- const DUMMY_TRACE_ID = 'some-trace-id';
11
- const DUMMY_SPAN_ID = 'some-span-id';
12
-
13
- const ValidOpenTracingTracerStub = {
14
- scope: () => {
15
- return {
16
- active: () => {
17
- return {
18
- setTag: () => {},
19
- context: () => {
20
- return {
21
- toTraceId: () => DUMMY_TRACE_ID,
22
- toSpanId: () => DUMMY_SPAN_ID
23
- }
24
- }
25
- }
26
- }
27
- }
28
- }
29
- };
30
-
31
- const InvalidOpenTracingTracerStub = {
32
- foo: () => {}
33
- };
34
-
35
- function TestClientGen() {
36
- var TestClient = function () {
37
- this.notifier = {
38
- addTransform: function() { return this; }
39
- };
40
- this.queue = {
41
- addPredicate: function() { return this; }
42
- };
43
- this.logCalls = [];
44
- var logs = 'log,debug,info,warn,warning,error,critical'.split(',');
45
- for(var i=0, len=logs.length; i < len; i++) {
46
- var fn = logs[i].slice(0);
47
- this[fn] = function(fn, item) {
48
- this.logCalls.push({func: fn, item: item});
49
- }.bind(this, fn)
50
- }
51
- this.buildJsonPayload = function(obj) {
52
- this.logCalls.push({item: obj});
53
- };
54
- this.sendJsonPayload = function(json) {
55
- this.logCalls.push({item: json});
56
- };
57
- this.clearLogCalls = function() {
58
- this.logCalls = [];
59
- };
60
- this.tracer = ValidOpenTracingTracerStub;
61
- };
62
-
63
- return TestClient;
64
- }
65
-
66
- async function wait(ms) {
67
- return new Promise(resolve => {
68
- setTimeout(resolve, ms);
69
- });
70
- }
71
-
72
- async function nodeReject(rollbar, callback) {
73
- Promise.reject(new Error('node reject'));
74
- await wait(500);
75
- callback(rollbar);
76
- }
77
-
78
- async function nodeThrow(rollbar, callback) {
79
- setTimeout(function () {
80
- throw new Error('node error');
81
- }, 10);
82
- await wait(500);
83
- callback(rollbar);
84
- }
85
-
86
- vows.describe('rollbar')
87
- .addBatch({
88
- 'constructor': {
89
- 'with accessToken': {
90
- topic: function() {
91
- return new Rollbar('abc123');
92
- },
93
- 'should have log method': function(r) {
94
- assert.isFunction(r.log);
95
- },
96
- 'should have error method': function(r) {
97
- assert.isFunction(r.error);
98
- },
99
- 'should have buildJsonPayload method': function(r) {
100
- assert.isFunction(r.buildJsonPayload);
101
- },
102
- 'should have sendJsonPayload method': function(r) {
103
- assert.isFunction(r.sendJsonPayload);
104
- },
105
- 'should have accessToken in options': function(r) {
106
- assert.equal('abc123', r.options.accessToken);
107
- }
108
- },
109
- 'with options': {
110
- topic: function() {
111
- return new Rollbar({accessToken: 'abc123'});
112
- },
113
- 'should have log method': function(r) {
114
- assert.isFunction(r.log);
115
- },
116
- 'should have error method': function(r) {
117
- assert.isFunction(r.error);
118
- },
119
- 'should have accessToken in options': function(r) {
120
- assert.equal('abc123', r.options.accessToken);
121
- },
122
- 'should set environment based on default': function(r) {
123
- assert.equal(process.env.NODE_ENV, r.options.environment);
124
- }
125
- },
126
- 'with more options': {
127
- topic: function() {
128
- return new Rollbar({accessToken: 'abc123', environment: 'fake-env'});
129
- },
130
- 'should have log method': function(r) {
131
- assert.isFunction(r.log);
132
- },
133
- 'should have error method': function(r) {
134
- assert.isFunction(r.error);
135
- },
136
- 'should have accessToken in options': function(r) {
137
- assert.equal('abc123', r.options.accessToken);
138
- },
139
- 'should set environment based on options': function(r) {
140
- assert.equal('fake-env', r.options.environment);
141
- },
142
- 'should set configured options': function(r) {
143
- assert.equal('fake-env', r.options._configuredOptions.environment);
144
- }
145
- },
146
- 'with deprecated options': {
147
- topic: function() {
148
- return new Rollbar({
149
- hostWhiteList: ['foo'],
150
- hostBlackList: ['bar']
151
- });
152
- },
153
- 'should replace options': function(r) {
154
- assert.equal(r.options.hostWhiteList, undefined);
155
- assert.equal(r.options.hostBlackList, undefined);
156
- assert.equal(r.options.hostSafeList, 'foo');
157
- assert.equal(r.options.hostBlockList, 'bar');
158
- }
159
- },
160
- 'with valid tracer': {
161
- topic: function () {
162
- var rollbar = new Rollbar({ captureUncaught: true, environment: 'fake-env', tracer: ValidOpenTracingTracerStub });
163
- return rollbar;
164
- },
165
- 'should configure tracer': function (r) {
166
- assert.ok(typeof r.client.tracer === 'object');
167
- }
168
- },
169
- 'with invalid tracer': {
170
- topic: function () {
171
- var rollbar = new Rollbar({ captureUncaught: true, environment: 'fake-env', tracer: InvalidOpenTracingTracerStub });
172
- return rollbar;
173
- },
174
- 'should configure tracer': function (r) {
175
- assert.equal(null, r.client.tracer);
176
- }
177
- }
178
- },
179
- 'configure': {
180
- 'with updated options': {
181
- topic: function() {
182
- var rollbar = new Rollbar({captureUncaught: true, environment: 'fake-env'});
183
- rollbar.configure({captureUncaught: false, environment: 'new-env'});
184
- return rollbar;
185
- },
186
- 'should set configured options': function(r) {
187
- assert.equal('new-env', r.options._configuredOptions.environment);
188
- assert.equal(false, r.options._configuredOptions.captureUncaught);
189
- }
190
- },
191
- 'with deprecated options': {
192
- topic: function() {
193
- var rollbar = new Rollbar({ captureUncaught: true });
194
- rollbar.configure({
195
- hostWhiteList: ['foo'],
196
- hostBlackList: ['bar']
197
- });
198
- return rollbar;
199
- },
200
- 'should replace options': function(r) {
201
- assert.equal(r.options.hostWhiteList, undefined);
202
- assert.equal(r.options.hostBlackList, undefined);
203
- assert.equal(r.options.hostSafeList, 'foo');
204
- assert.equal(r.options.hostBlockList, 'bar');
205
- }
206
- },
207
- 'with valid tracer': {
208
- topic: function() {
209
- var rollbar = new Rollbar({ captureUncaught: true, environment: 'fake-env' });
210
- rollbar.configure({ tracer: ValidOpenTracingTracerStub });
211
- return rollbar;
212
- },
213
- 'should configure tracer': function(r) {
214
- assert.equal(ValidOpenTracingTracerStub, r.client.tracer);
215
- }
216
- },
217
- 'with invalid tracer': {
218
- topic: function() {
219
- var rollbar = new Rollbar({ captureUncaught: true, environment: 'fake-env' });
220
- rollbar.configure({ tracer: InvalidOpenTracingTracerStub });
221
- return rollbar;
222
- },
223
- 'should configure tracer': function(r) {
224
- assert.equal(null, r.client.tracer);
225
- }
226
- }
227
- },
228
- 'addTracingInfo': {
229
- 'with valid tracer': {
230
- topic: function() {
231
- var rollbar = new Rollbar({ captureUncaught: true, environment: 'fake-env', tracer: ValidOpenTracingTracerStub });
232
- return rollbar;
233
- },
234
- 'should add trace ID and span ID to custom field on item if no custom field set': function (r) {
235
- const item = { uuid: 'some-uuid', custom: null };
236
- r.client._addTracingInfo(item);
237
- assert.equal(DUMMY_TRACE_ID, item.custom.opentracing_trace_id);
238
- assert.equal(DUMMY_SPAN_ID, item.custom.opentracing_span_id);
239
- },
240
- 'should add trace ID and span ID to custom field on item even if already has some custom fields': function(r) {
241
- const item = { uuid: 'some-uuid', custom: { foo: 'foo' } };
242
- r.client._addTracingInfo(item);
243
- assert.equal(DUMMY_TRACE_ID, item.custom.opentracing_trace_id);
244
- assert.equal(DUMMY_SPAN_ID, item.custom.opentracing_span_id);
245
- assert.equal('foo', item.custom.foo);
246
- }
247
- },
248
- 'with invalid tracer': {
249
- topic: function() {
250
- var rollbar = new Rollbar({ captureUncaught: true, environment: 'fake-env', tracer: InvalidOpenTracingTracerStub });
251
- return rollbar;
252
- },
253
- 'should add trace ID and span ID to custom field on item': function (r) {
254
- const item = { uuid: 'some-uuid', custom: {} };
255
- r.client._addTracingInfo(item);
256
- assert.equal(undefined, item.custom.opentracing_trace_id);
257
- assert.equal(undefined, item.custom.opentracing_span_id);
258
- }
259
- },
260
- },
261
- 'log': {
262
- topic: function() {
263
- var client = new (TestClientGen())();
264
- var rollbar = new Rollbar({ accessToken: 'abc123' }, client);
265
- return rollbar;
266
- },
267
- 'message': {
268
- 'with unordered options': {
269
- 'should work with custom, request, callback, message ': function(r) {
270
- var message = 'hello';
271
- var callbackCalled = false;
272
- var callback = function cb() {
273
- callbackCalled = true;
274
- };
275
- var request = { method: 'GET' };
276
- var custom = { a: 1, b: 2 };
277
- r.log(custom, request, callback, message);
278
- var item = r.client.logCalls[r.client.logCalls.length - 1].item;
279
- assert.equal(item.message, message);
280
- assert.equal(item.request, request);
281
- assert.deepStrictEqual(item.custom, custom);
282
- item.callback();
283
- assert.isTrue(callbackCalled);
284
- }
285
- },
286
- 'with old option ordering': {
287
- 'should work': function(r) {
288
- var message = 'hello'
289
- r.log(message)
290
- var item = r.client.logCalls[r.client.logCalls.length - 1].item
291
- assert.equal(item.message, message)
292
- },
293
- 'should work with callback': function(r) {
294
- var message = 'hello'
295
- var callbackCalled = false;
296
- var callback = function cb() {
297
- callbackCalled = true;
298
- };
299
- r.log(message, callback);
300
- var item = r.client.logCalls[r.client.logCalls.length - 1].item;
301
- assert.equal(item.message, message);
302
- item.callback();
303
- assert.isTrue(callbackCalled);
304
- },
305
- 'should work with request': function(r) {
306
- var message = 'hello'
307
- var request = { method: 'GET' }
308
- r.log(message, request)
309
- var item = r.client.logCalls[r.client.logCalls.length - 1].item
310
- assert.equal(item.message, message)
311
- assert.equal(item.request, request)
312
- },
313
- 'should work with request and callback': function(r) {
314
- var message = 'hello'
315
- var request = { method: 'GET' }
316
- var callbackCalled = false;
317
- var callback = function cb() {
318
- callbackCalled = true;
319
- };
320
- r.log(message, request, callback)
321
- var item = r.client.logCalls[r.client.logCalls.length - 1].item
322
- assert.equal(item.message, message)
323
- assert.equal(item.request, request)
324
- item.callback();
325
- assert.isTrue(callbackCalled);
326
- },
327
- 'should work with request and custom': function(r) {
328
- var message = 'hello'
329
- var request = { method: 'GET' }
330
- var custom = { a: 1, b: 2 }
331
- r.log(message, request, custom)
332
- var item = r.client.logCalls[r.client.logCalls.length - 1].item
333
- assert.equal(item.message, message)
334
- assert.equal(item.request, request)
335
- assert.deepStrictEqual(item.custom, custom)
336
- },
337
- 'should work with request and custom and callback': function(r) {
338
- var message = 'hello'
339
- var request = { method: 'GET' }
340
- var custom = { a: 1, b: 2 }
341
- var callbackCalled = false;
342
- var callback = function cb() {
343
- callbackCalled = true;
344
- };
345
- r.log(message, request, custom, callback)
346
- var item = r.client.logCalls[r.client.logCalls.length - 1].item
347
- assert.equal(item.message, message)
348
- assert.equal(item.request, request)
349
- assert.deepStrictEqual(item.custom, custom)
350
- item.callback();
351
- assert.isTrue(callbackCalled);
352
- }
353
- }
354
- },
355
- 'info': {
356
- topic: function() {
357
- // Uses real client and stubs queue.addItem so transforms can run.
358
- var rollbar = new Rollbar({
359
- accessToken: 'abc123',
360
- captureUncaught: false
361
- });
362
- var notifier = rollbar.client.notifier;
363
- rollbar.addItemStub = sinon.stub(notifier.queue, 'addItem');
364
-
365
- return rollbar;
366
- },
367
- 'should send message when called with only null argument': function(r) {
368
- var addItemStub = r.addItemStub;
369
-
370
- r.info(null);
371
- assert.isTrue(addItemStub.called);
372
- if (addItemStub.called) {
373
- assert.equal(addItemStub.getCall(0).args[3].data.body.message.body, 'Item sent with null or missing arguments.');
374
- }
375
- addItemStub.reset();
376
- },
377
- 'should send message when called with no arguments': function(r) {
378
- var addItemStub = r.addItemStub;
379
-
380
- r.info();
381
- assert.isTrue(addItemStub.called);
382
- if (addItemStub.called) {
383
- assert.equal(addItemStub.getCall(0).args[3].data.body.message.body, 'Item sent with null or missing arguments.');
384
- }
385
- addItemStub.reset();
386
- }
387
- },
388
- 'error': {
389
- 'with unordered options': {
390
- 'should work with custom, request, callback, message ': function(r) {
391
- var err = new Error('hello!')
392
- var callbackCalled = false;
393
- var callback = function cb() {
394
- callbackCalled = true;
395
- };
396
- var request = { method: 'GET' }
397
- var custom = { a: 1, b: 2 }
398
- r.log(custom, request, callback, err)
399
- var item = r.client.logCalls[r.client.logCalls.length - 1].item
400
- assert.equal(item.err, err)
401
- assert.equal(item.request, request)
402
- assert.deepStrictEqual(item.custom, custom)
403
- item.callback();
404
- assert.isTrue(callbackCalled);
405
- }
406
- },
407
- 'with old option ordering': {
408
- 'should work': function(r) {
409
- var err = new Error('hello!')
410
- r.log(err)
411
- var item = r.client.logCalls[r.client.logCalls.length - 1].item
412
- assert.equal(item.err, err)
413
- },
414
- 'should work with callback': function(r) {
415
- var err = new Error('hello!')
416
- var callbackCalled = false;
417
- var callback = function cb() {
418
- callbackCalled = true;
419
- };
420
- r.log(err, callback)
421
- var item = r.client.logCalls[r.client.logCalls.length - 1].item
422
- assert.equal(item.err, err)
423
- item.callback();
424
- assert.isTrue(callbackCalled);
425
- },
426
- 'should work with request': function(r) {
427
- var err = new Error('hello!')
428
- var request = { method: 'GET' }
429
- r.log(err, request)
430
- var item = r.client.logCalls[r.client.logCalls.length - 1].item
431
- assert.equal(item.err, err)
432
- assert.equal(item.request, request)
433
- },
434
- 'should work with request and callback': function(r) {
435
- var err = new Error('hello!')
436
- var request = { method: 'GET' }
437
- var callbackCalled = false;
438
- var callback = function cb() {
439
- callbackCalled = true;
440
- };
441
- r.log(err, request, callback)
442
- var item = r.client.logCalls[r.client.logCalls.length - 1].item
443
- assert.equal(item.err, err)
444
- assert.equal(item.request, request)
445
- item.callback();
446
- assert.isTrue(callbackCalled);
447
- },
448
- 'should work with request and custom': function(r) {
449
- var err = new Error('hello!')
450
- var request = { method: 'GET' }
451
- var custom = { a: 1, b: 2 }
452
- r.log(err, request, custom)
453
- var item = r.client.logCalls[r.client.logCalls.length - 1].item
454
- assert.equal(item.err, err)
455
- assert.equal(item.request, request)
456
- assert.deepStrictEqual(item.custom, custom)
457
- },
458
- 'should work with request and custom and callback': function(r) {
459
- var err = new Error('hello!')
460
- var request = { method: 'GET' }
461
- var custom = { a: 1, b: 2 }
462
- var callbackCalled = false;
463
- var callback = function cb() {
464
- callbackCalled = true;
465
- };
466
- r.log(err, request, custom, callback)
467
- var item = r.client.logCalls[r.client.logCalls.length - 1].item
468
- assert.equal(item.err, err)
469
- assert.equal(item.request, request)
470
- assert.deepStrictEqual(item.custom, custom)
471
- item.callback();
472
- assert.isTrue(callbackCalled);
473
- }
474
- }
475
- }
476
- },
477
- // captureUncaught tests are set up using subtopics because Rollbar's node.js handlers
478
- // are treated as global and concurrent access will lead to handlers being removed
479
- // unexpectedly. (Subtopics execute sequentially.)
480
- 'captureUncaught': {
481
- 'enabled in constructor': {
482
- topic: function() {
483
- var rollbar = new Rollbar({
484
- accessToken: 'abc123',
485
- captureUncaught: true
486
- });
487
- var notifier = rollbar.client.notifier;
488
- rollbar.logStub = sinon.stub(notifier, 'log');
489
-
490
- nodeThrow(rollbar, this.callback);
491
- },
492
- 'should have locals disabled': function(r) {
493
- assert.equal(r.client.notifier.locals, undefined);
494
- },
495
- 'should log': function(r) {
496
- var logStub = r.logStub;
497
-
498
- assert.isTrue(logStub.called);
499
- if (logStub.called) {
500
- assert.equal(logStub.getCall(0).args[0].err.message, 'node error');
501
- }
502
- logStub.reset();
503
- },
504
- 'disabled in configure': {
505
- topic: function(r) {
506
- r.configure({
507
- captureUncaught: false
508
- });
509
-
510
- nodeThrow(r, this.callback);
511
- },
512
- 'should not log': function(r) {
513
- var notifier = r.client.notifier;
514
- var logStub = r.logStub;
515
-
516
- assert.isFalse(logStub.called);
517
- notifier.log.restore();
518
- },
519
- 'disabled in constructor': {
520
- topic: function() {
521
- var rollbar = new Rollbar({
522
- accessToken: 'abc123',
523
- captureUncaught: false
524
- });
525
- var notifier = rollbar.client.notifier;
526
- rollbar.logStub = sinon.stub(notifier, 'log');
527
-
528
- nodeThrow(rollbar, this.callback);
529
- },
530
- 'should not log': function(r) {
531
- var logStub = r.logStub;
532
-
533
- assert.isFalse(logStub.called);
534
- logStub.reset();
535
- },
536
- 'enabled in configure': {
537
- topic: function(r) {
538
- r.configure({
539
- captureUncaught: true
540
- });
541
-
542
- nodeThrow(r, this.callback);
543
- },
544
- 'should log': function(r) {
545
- var notifier = r.client.notifier;
546
- var logStub = r.logStub;
547
-
548
- assert.isTrue(logStub.called);
549
- if (logStub.called) {
550
- assert.equal(logStub.getCall(0).args[0].err.message, 'node error');
551
- }
552
- notifier.log.restore();
553
- }
554
- }
555
- }
556
- }
557
- }
558
- },
559
- // captureUnhandledRejections tests are set up using subtopics because Rollbar's node.js handlers
560
- // are treated as global and concurrent access will lead to handlers being removed
561
- // unexpectedly. (Subtopics execute sequentially.)
562
- 'captureUnhandledRejections': {
563
- 'enabled in constructor': {
564
- topic: function() {
565
- var rollbar = new Rollbar({
566
- accessToken: 'abc123',
567
- captureUnhandledRejections: true
568
- });
569
- var notifier = rollbar.client.notifier;
570
- rollbar.logStub = sinon.stub(notifier, 'log');
571
-
572
- nodeReject(rollbar, this.callback);
573
- },
574
- 'should log': function(r) {
575
- var logStub = r.logStub;
576
-
577
- assert.isTrue(logStub.called);
578
- if (logStub.called) {
579
- assert.equal(logStub.getCall(0).args[0].err.message, 'node reject');
580
- }
581
- logStub.reset();
582
- },
583
- 'disabled in configure': {
584
- topic: function(r) {
585
- r.configure({
586
- captureUnhandledRejections: false
587
- });
588
-
589
- nodeReject(r, this.callback);
590
- },
591
- 'should not log': function(r) {
592
- var notifier = r.client.notifier;
593
- var logStub = r.logStub;
594
-
595
- assert.isFalse(logStub.called);
596
- notifier.log.restore();
597
- },
598
- 'disabled in constructor': {
599
- topic: function() {
600
- var rollbar = new Rollbar({
601
- accessToken: 'abc123',
602
- captureUnhandledRejections: false
603
- });
604
- var notifier = rollbar.client.notifier;
605
- rollbar.logStub = sinon.stub(notifier, 'log');
606
-
607
- nodeReject(rollbar, this.callback);
608
- },
609
- 'should not log': function(r) {
610
- var logStub = r.logStub;
611
-
612
- assert.isFalse(logStub.called);
613
- logStub.reset();
614
- },
615
- 'enabled in configure': {
616
- topic: function(r) {
617
- r.configure({
618
- captureUnhandledRejections: true
619
- });
620
-
621
- nodeReject(r, this.callback);
622
- },
623
- 'should log': function(r) {
624
- var notifier = r.client.notifier;
625
- var logStub = r.logStub;
626
-
627
- assert.isTrue(logStub.called);
628
- if (logStub.called) {
629
- assert.equal(logStub.getCall(0).args[0].err.message, 'node reject');
630
- }
631
- notifier.log.restore();
632
- }
633
- }
634
- }
635
- }
636
- }
637
- },
638
- 'buildJsonPayload': {
639
- topic: function() {
640
- var client = new (TestClientGen())();
641
- var rollbar = new Rollbar({accessToken: 'abc123'}, client);
642
- return rollbar;
643
- },
644
- 'should work': function(r) {
645
- var obj = { foo: 'bar' };
646
- r.buildJsonPayload(obj);
647
- var item = r.client.logCalls[r.client.logCalls.length - 1].item;
648
- assert.equal(obj, item);
649
- }
650
- },
651
- 'sendJsonPayload': {
652
- topic: function() {
653
- var client = new (TestClientGen())();
654
- var rollbar = new Rollbar({accessToken: 'abc123'}, client);
655
- return rollbar;
656
- },
657
- 'should work': function(r) {
658
- var json = "{ \"foo\": \"bar\" }";
659
- r.sendJsonPayload(json);
660
- var item = r.client.logCalls[r.client.logCalls.length - 1].item;
661
- assert.equal(json, item);
662
- }
663
- },
664
- 'singleton': {
665
- topic: function() {
666
- var client = new (TestClientGen())();
667
- return Rollbar.init({accessToken: 'abc123'}, client);
668
- },
669
- 'should allow log on constructor to pass through': function(r) {
670
- r.log('hello 1');
671
- Rollbar.log('hello 2');
672
- assert.equal(r.client.logCalls[0].item.message, 'hello 1');
673
- assert.equal(r.client.logCalls[1].item.message, 'hello 2');
674
- }
675
- }
676
- }).export(module, {error: false});