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,105 @@
1
+ /* globals describe */
2
+ /* globals it */
3
+
4
+ import { expect } from 'chai';
5
+
6
+ import { ContextManager, createContextKey } from '../../src/tracing/contextManager.js';
7
+ import { Session } from '../../src/tracing/session.js';
8
+ import { SpanExporter, spanExportQueue } from '../../src/tracing/exporter.js';
9
+ import { SpanProcessor } from '../../src/tracing/spanProcessor.js';
10
+ import { Tracer } from '../../src/tracing/tracer.js';
11
+ import { ROOT_CONTEXT } from '../../src/tracing/context.js';
12
+ import Tracing from '../../src/tracing/tracing';
13
+
14
+ const tracingOptions = function (options = {}) {
15
+ return {
16
+ resource: {
17
+ 'service.name': 'unknown_service',
18
+ 'telemetry.sdk.language': 'webjs',
19
+ 'telemetry.sdk.name': 'rollbar',
20
+ 'telemetry.sdk.version': '0.1.0',
21
+ },
22
+ version: '0.1.0',
23
+ ...options,
24
+ };
25
+ };
26
+
27
+ describe('Tracing()', function () {
28
+ it('should initialize', function (done) {
29
+ const options = tracingOptions();
30
+ const t = new Tracing(window, options);
31
+ t.initSession()
32
+
33
+ expect(t).to.have.property('initSession').and.to.be.a('function');
34
+ expect(t).to.have.property('createTracer').and.to.be.a('function');
35
+ expect(t).to.have.property('getTracer').and.to.be.a('function');
36
+ expect(t).to.have.property('getSpan').and.to.be.a('function');
37
+ expect(t).to.have.property('setSpan').and.to.be.a('function');
38
+ expect(t).to.have.property('with').and.to.be.a('function');
39
+ expect(t).to.have.property('withSpan').and.to.be.a('function');
40
+
41
+ expect(t.contextManager).to.be.an.instanceOf(ContextManager);
42
+ expect(t.session).to.be.an.instanceOf(Session);
43
+ expect(t.exporter).to.be.an.instanceOf(SpanExporter);
44
+ expect(t.spanProcessor).to.be.an.instanceOf(SpanProcessor);
45
+ expect(t.tracer).to.be.an.instanceOf(Tracer);
46
+
47
+ expect(t.options.resource).to.deep.equal(options.resource);
48
+ expect(t.options.version).to.equal(options.version);
49
+ expect(t.session.session.id).to.match(/^[a-f0-9]{32}$/)
50
+ done();
51
+ });
52
+
53
+ it('should create and export spans', function (done) {
54
+ const options = tracingOptions();
55
+ const t = new Tracing(window, options);
56
+ t.initSession()
57
+
58
+ expect(t.sessionId).to.match(/^[a-f0-9]{32}$/);
59
+
60
+ const span = t.startSpan('test.span');
61
+
62
+ expect(span.span.name).to.equal('test.span')
63
+ expect(span.span.spanContext.traceId).to.match(/^[a-f0-9]{32}$/)
64
+ expect(span.span.spanContext.spanId).to.match(/^[a-f0-9]{16}$/)
65
+ expect(span.span.resource.attributes['service.name']).to.equal('unknown_service')
66
+ expect(span.span.instrumentationScope.name).to.equal('rollbar-browser-js')
67
+ expect(span.span.instrumentationScope.version).to.equal('0.1.0')
68
+ expect(span.isRecording()).to.equal(true)
69
+ expect(t.contextManager.active()).to.equal(ROOT_CONTEXT)
70
+
71
+ const context = t.setSpan(t.contextManager.active(), span)
72
+
73
+ expect(context).to.not.equal(ROOT_CONTEXT)
74
+
75
+ const prevContext = t.contextManager.enterContext(context)
76
+
77
+ expect(t.contextManager.active()).to.not.equal(ROOT_CONTEXT)
78
+ expect(prevContext).to.equal(ROOT_CONTEXT)
79
+
80
+ t.contextManager.exitContext(prevContext)
81
+
82
+ expect(t.contextManager.active()).to.equal(ROOT_CONTEXT)
83
+ expect(t.spanProcessor.pendingSpans.has(span.span.spanContext.spanId)).to.be.true
84
+ expect(spanExportQueue.length).to.equal(0)
85
+
86
+ span.end()
87
+
88
+ expect(span.isRecording()).to.equal(false)
89
+ expect(t.spanProcessor.pendingSpans.has(span.span.spanContext.spanId)).to.be.false
90
+ expect(spanExportQueue.length).to.equal(1)
91
+
92
+ done();
93
+ });
94
+
95
+ it('should generate ids', function (done) {
96
+ const options = tracingOptions();
97
+ const t = new Tracing(window, options);
98
+
99
+ const replayId = t.idGen(8);
100
+
101
+ expect(replayId).to.match(/^[a-f0-9]{16}$/);
102
+
103
+ done();
104
+ });
105
+ });
@@ -2,8 +2,8 @@
2
2
  /* globals describe */
3
3
  /* globals it */
4
4
 
5
- var _ = require('../src/utility');
6
- var t = require('../src/transforms');
5
+ import _ from '../src/utility.js';
6
+ import t from '../src/transforms.js';
7
7
 
8
8
  function itemFromArgs(args) {
9
9
  var item = _.createItem(args);
@@ -2,8 +2,8 @@
2
2
  /* globals describe */
3
3
  /* globals it */
4
4
 
5
- var t = require('../src/truncation');
6
- var utility = require('../src/utility');
5
+ import t from '../src/truncation.js';
6
+ import utility from '../src/utility.js';
7
7
  utility.setupJSON();
8
8
 
9
9
  describe('truncate', function () {
@@ -3,9 +3,9 @@
3
3
  /* globals it */
4
4
  /* globals sinon */
5
5
 
6
- var _ = require('../src/utility');
7
- var utility = require('../src/utility');
8
- var polyfillJSON = require('../vendor/JSON-js/json3');
6
+ import _ from '../src/utility.js';
7
+ import utility from '../src/utility.js';
8
+ import polyfillJSON from '../vendor/JSON-js/json3.js';
9
9
 
10
10
  utility.setupJSON();
11
11
 
@@ -448,7 +448,7 @@ describe('merge', function () {
448
448
  });
449
449
  });
450
450
 
451
- var traverse = require('../src/utility/traverse');
451
+ import traverse from '../src/utility/traverse.js';
452
452
  describe('traverse', function () {
453
453
  describe('should call the func for every key,value', function () {
454
454
  it('simple object', function (done) {
@@ -618,7 +618,13 @@ describe('addParamsAndAccessTokenToPath', function () {
618
618
  });
619
619
 
620
620
  describe('json3', function () {
621
- var setupCustomJSON = require('../vendor/JSON-js/json3.js');
621
+ let setupCustomJSON;
622
+
623
+ before(async function () {
624
+ const module = await import('../vendor/JSON-js/json3.js');
625
+ setupCustomJSON = module.default;
626
+ });
627
+
622
628
  it('should replace stringify if not there', function () {
623
629
  var j = {};
624
630
  setupCustomJSON(j);
@@ -767,7 +773,7 @@ describe('set', function () {
767
773
  });
768
774
  });
769
775
 
770
- var scrub = require('../src/scrub');
776
+ import scrub from '../src/scrub.js';
771
777
  describe('scrub', function () {
772
778
  it('should not redact fields that are okay', function () {
773
779
  var data = {
@@ -924,3 +930,35 @@ describe('formatArgsAsString', function () {
924
930
  });
925
931
  */
926
932
  });
933
+
934
+ describe('addItemAttributes', function () {
935
+ it('should skip undefined values', function () {
936
+ const item = { data: {} };
937
+ const attributes = [
938
+ { key: 'replay_id', value: '12345' },
939
+ { key: 'session_id', value: undefined },
940
+ ];
941
+ _.addItemAttributes(item.data, attributes);
942
+ expect(item.data.attributes).to.be.an('array');
943
+ expect(item.data.attributes.length).to.equal(1);
944
+ expect(item.data.attributes[0].key).to.equal('replay_id');
945
+ expect(item.data.attributes[0].value).to.equal('12345');
946
+ });
947
+ });
948
+
949
+ describe('getItemAttribute', function () {
950
+ it('should skip undefined values', function () {
951
+ const item = {
952
+ data: {
953
+ attributes: [
954
+ { key: 'replay_id', value: '12345' },
955
+ { key: 'session_id', value: '67890' },
956
+ ],
957
+ },
958
+ };
959
+ let value = _.getItemAttribute(item.data, 'replay_id');
960
+ expect(value).to.equal('12345');
961
+ value = _.getItemAttribute(item.data, 'session_id');
962
+ expect(value).to.equal('67890');
963
+ });
964
+ });
package/webpack.config.js CHANGED
@@ -24,18 +24,8 @@ var snippetConfig = {
24
24
  module: {
25
25
  rules: [
26
26
  {
27
- enforce: 'pre',
28
27
  test: /\.js$/,
29
- loader: 'eslint-loader',
30
- exclude: [/node_modules/, /vendor/],
31
- options: {
32
- failOnError: true,
33
- configFile: path.resolve(__dirname, '.eslintrc'),
34
- },
35
- },
36
- {
37
- test: /\.js$/,
38
- loader: 'strict-loader',
28
+ loader: 'babel-loader',
39
29
  exclude: [/node_modules/, /vendor/],
40
30
  },
41
31
  ],
@@ -54,19 +44,9 @@ var pluginConfig = {
54
44
  plugins: [defaultsPlugin],
55
45
  module: {
56
46
  rules: [
57
- {
58
- enforce: 'pre',
59
- test: /\.js$/,
60
- loader: 'eslint-loader',
61
- exclude: [/node_modules/, /vendor/],
62
- options: {
63
- failOnError: true,
64
- configFile: path.resolve(__dirname, '.eslintrc'),
65
- },
66
- },
67
47
  {
68
48
  test: /\.js$/,
69
- loader: 'strict-loader',
49
+ loader: 'babel-loader',
70
50
  exclude: [/node_modules/, /vendor/],
71
51
  },
72
52
  ],
@@ -80,23 +60,14 @@ var vanillaConfigBase = {
80
60
  output: {
81
61
  path: outputPath,
82
62
  },
63
+ target: ['web', 'es5'],
83
64
  plugins: [defaultsPlugin],
84
65
  devtool: 'hidden-source-map',
85
66
  module: {
86
67
  rules: [
87
68
  {
88
- enforce: 'pre',
89
69
  test: /\.js$/,
90
- loader: 'eslint-loader',
91
- exclude: [/node_modules/, /vendor/],
92
- options: {
93
- failOnError: true,
94
- configFile: path.resolve(__dirname, '.eslintrc'),
95
- },
96
- },
97
- {
98
- test: /\.js$/,
99
- loader: 'strict-loader',
70
+ loader: 'babel-loader',
100
71
  exclude: [/node_modules/, /vendor/],
101
72
  },
102
73
  ],
@@ -113,22 +84,13 @@ var UMDConfigBase = {
113
84
  libraryTarget: 'umd',
114
85
  globalObject: 'this',
115
86
  },
87
+ target: ['web', 'es5'],
116
88
  devtool: 'source-map',
117
89
  module: {
118
90
  rules: [
119
- {
120
- enforce: 'pre',
121
- test: /\.js$/,
122
- loader: 'eslint-loader',
123
- exclude: [/node_modules/, /vendor/],
124
- options: {
125
- failOnError: true,
126
- configFile: path.resolve(__dirname, '.eslintrc'),
127
- },
128
- },
129
91
  {
130
92
  test: /\.js$/,
131
- loader: 'strict-loader',
93
+ loader: 'babel-loader',
132
94
  exclude: [/node_modules/, /vendor/],
133
95
  },
134
96
  ],
package/.eslintignore DELETED
@@ -1,7 +0,0 @@
1
- node_modules
2
- vendor
3
- lib
4
- dist
5
- release
6
- test
7
- examples
@@ -1,194 +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
- function promisePending(promise, callback) {
11
- var testValue = 'test-pending';
12
-
13
- // Detect if a given promise is pending/unfulfilled using the
14
- // behavior of Promise.race(), which always returns the first
15
- // already resolved promise in the array.
16
- Promise.race([promise, Promise.resolve(testValue)])
17
- .then(function (value) {
18
- if (value === testValue) {
19
- return callback(true);
20
- } else {
21
- return callback(false);
22
- }
23
- })
24
- .catch(function (_error) {
25
- return callback(false);
26
- });
27
- }
28
-
29
- function fakePostItem(_item, callback) {
30
- // 1000ms simulates low API response, and allows testing the state before completion.
31
- setTimeout(function () {
32
- callback();
33
- }, 1000);
34
- }
35
-
36
- var stubContext = {
37
- getRemainingTimeInMillis: function () {
38
- return 2000;
39
- },
40
- };
41
-
42
- vows
43
- .describe('lambda')
44
- .addBatch({
45
- 'async handler sends message': {
46
- topic: function () {
47
- var rollbar = new Rollbar({
48
- accessToken: 'abc123',
49
- captureUncaught: true,
50
- captureLambdaTimeouts: false,
51
- });
52
- var api = rollbar.client.notifier.queue.api;
53
- rollbar.requestStub = sinon
54
- .stub(api, 'postItem')
55
- .callsFake(fakePostItem);
56
-
57
- rollbar.testHandlerInstance = rollbar.lambdaHandler(
58
- async (_event, _context) => {
59
- // Testing the condition where the client handler sends a message before exit.
60
- // The Rollbar wrapper should send, and should not resolve until the API request
61
- // has completed.
62
- rollbar.info('lambda test message');
63
- return 'done';
64
- },
65
- );
66
-
67
- return rollbar;
68
- },
69
- 'invokes handler and receives promise': function (r) {
70
- var handler = r.testHandlerInstance;
71
-
72
- // rollbar.lambdaHandler in the above topic should have returned a
73
- // handler with the correct signature. (The callback handler is length = 3)
74
- assert.equal(handler.length, 2);
75
- assert.equal(handler.name, 'rollbarAsyncLambdaHandler');
76
-
77
- // The rollbar.wait() in the wrapper should prevent this from
78
- // resolving until the response is received.
79
- r.testPromise = handler({}, stubContext);
80
- },
81
- 'after handler invoked': {
82
- topic: function (r) {
83
- var callback = this.callback;
84
-
85
- // This timeout allows a few extra ticks so that without the wait in
86
- // the wrapper this test should fail.
87
- setTimeout(function () {
88
- promisePending(r.testPromise, function (pending) {
89
- r.promiseIsPending = pending;
90
- callback(r);
91
- });
92
- }, 10);
93
- },
94
- 'promise is pending': function (r) {
95
- assert.isTrue(r.promiseIsPending);
96
- },
97
- 'after promise resolved': {
98
- topic: function (r) {
99
- var callback = this.callback;
100
-
101
- r.testPromise.then(function (value) {
102
- assert.equal(value, 'done');
103
- callback(r);
104
- });
105
- },
106
- 'sends message before exit': function (r) {
107
- var requestStub = r.requestStub;
108
-
109
- // If the handler is allowed to exit prematurely, this will fail.
110
- assert.isTrue(requestStub.called);
111
- var data = requestStub.getCall(0).args[0];
112
- assert.equal(data.body.message.body, 'lambda test message');
113
-
114
- requestStub.reset();
115
- },
116
- },
117
- },
118
- },
119
- })
120
- .addBatch({
121
- 'async handler catches exception': {
122
- topic: function () {
123
- var rollbar = new Rollbar({
124
- accessToken: 'abc123',
125
- captureUncaught: true,
126
- captureLambdaTimeouts: false,
127
- });
128
- var api = rollbar.client.notifier.queue.api;
129
- rollbar.requestStub = sinon
130
- .stub(api, 'postItem')
131
- .callsFake(fakePostItem);
132
-
133
- rollbar.testHandlerInstance = rollbar.lambdaHandler(
134
- async (_event, _context) => {
135
- // Testing the condition where the client handler throws.
136
- // The Rollbar wrapper should catch and report, and should not reject
137
- // until the API request has completed.
138
- throw new Error('lambda test error');
139
- },
140
- );
141
-
142
- return rollbar;
143
- },
144
- 'invokes handler and receives promise': function (r) {
145
- var handler = r.testHandlerInstance;
146
-
147
- // rollbar.lambdaHandler in the above topic should have returned a
148
- // handler with the correct signature. (The callback handler is length = 3)
149
- assert.equal(handler.length, 2);
150
- assert.equal(handler.name, 'rollbarAsyncLambdaHandler');
151
-
152
- // The rollbar.wait() in the wrapper should prevent this from
153
- // resolving until the response is received.
154
- r.testPromise = handler({}, stubContext);
155
- },
156
- 'after handler invoked': {
157
- topic: function (r) {
158
- var callback = this.callback;
159
-
160
- promisePending(r.testPromise, function (pending) {
161
- r.promiseIsPending = pending;
162
- callback(r);
163
- });
164
- },
165
- 'promise is pending': function (r) {
166
- assert.isTrue(r.promiseIsPending);
167
- },
168
- 'after promise rejected': {
169
- topic: function (r) {
170
- var callback = this.callback;
171
-
172
- r.testPromise.catch(function (error) {
173
- assert.equal(error.message, 'lambda test error');
174
- callback(r);
175
- });
176
- },
177
- 'sends message before exit': function (r) {
178
- var requestStub = r.requestStub;
179
-
180
- // If the handler is allowed to exit prematurely, this will fail.
181
- assert.isTrue(requestStub.called);
182
- var data = requestStub.getCall(0).args[0];
183
- assert.equal(
184
- data.body.trace_chain[0].exception.message,
185
- 'lambda test error',
186
- );
187
-
188
- requestStub.reset();
189
- },
190
- },
191
- },
192
- },
193
- })
194
- .export(module, { error: false });