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.
- package/.claude/settings.local.json +3 -0
- package/.cursor/rules/guidelines.mdc +154 -0
- package/.github/workflows/ci.yml +4 -6
- package/CLAUDE.local.md +297 -0
- package/CLAUDE.md +201 -0
- package/CLAUDE.testrunner.md +470 -0
- package/Gruntfile.js +59 -16
- package/Makefile +3 -3
- package/SECURITY.md +5 -0
- package/babel.config.json +9 -0
- package/codex.md +148 -0
- package/dist/plugins/jquery.min.js +1 -1
- package/dist/rollbar.js +19332 -6596
- package/dist/rollbar.js.map +1 -1
- package/dist/rollbar.min.js +2 -1
- package/dist/rollbar.min.js.LICENSE.txt +1 -0
- package/dist/rollbar.min.js.map +1 -1
- package/dist/rollbar.named-amd.js +19332 -6596
- package/dist/rollbar.named-amd.js.map +1 -1
- package/dist/rollbar.named-amd.min.js +2 -1
- package/dist/rollbar.named-amd.min.js.LICENSE.txt +1 -0
- package/dist/rollbar.named-amd.min.js.map +1 -1
- package/dist/rollbar.noconflict.umd.js +19319 -6581
- package/dist/rollbar.noconflict.umd.js.map +1 -1
- package/dist/rollbar.noconflict.umd.min.js +2 -1
- package/dist/rollbar.noconflict.umd.min.js.LICENSE.txt +1 -0
- package/dist/rollbar.noconflict.umd.min.js.map +1 -1
- package/dist/rollbar.snippet.js +1 -1
- package/dist/rollbar.umd.js +19333 -6597
- package/dist/rollbar.umd.js.map +1 -1
- package/dist/rollbar.umd.min.js +2 -1
- package/dist/rollbar.umd.min.js.LICENSE.txt +1 -0
- package/dist/rollbar.umd.min.js.map +1 -1
- package/eslint.config.mjs +33 -0
- package/karma.conf.js +5 -14
- package/package.json +19 -20
- package/src/api.js +57 -4
- package/src/apiUtility.js +2 -3
- package/src/browser/core.js +37 -9
- package/src/browser/replay/defaults.js +70 -0
- package/src/browser/replay/recorder.js +194 -0
- package/src/browser/replay/replayMap.js +195 -0
- package/src/browser/rollbar.js +11 -7
- package/src/browser/telemetry.js +3 -3
- package/src/browser/transport/fetch.js +17 -4
- package/src/browser/transport/xhr.js +17 -1
- package/src/browser/transport.js +11 -8
- package/src/defaults.js +1 -1
- package/src/queue.js +65 -4
- package/src/react-native/rollbar.js +1 -1
- package/src/rollbar.js +52 -10
- package/src/server/rollbar.js +3 -2
- package/src/telemetry.js +76 -11
- package/src/tracing/context.js +24 -0
- package/src/tracing/contextManager.js +37 -0
- package/src/tracing/defaults.js +7 -0
- package/src/tracing/exporter.js +188 -0
- package/src/tracing/hrtime.js +98 -0
- package/src/tracing/id.js +24 -0
- package/src/tracing/session.js +55 -0
- package/src/tracing/span.js +92 -0
- package/src/tracing/spanProcessor.js +15 -0
- package/src/tracing/tracer.js +46 -0
- package/src/tracing/tracing.js +89 -0
- package/src/utility.js +34 -0
- package/test/api.test.js +57 -12
- package/test/apiUtility.test.js +5 -6
- package/test/browser.core.test.js +1 -10
- package/test/browser.domUtility.test.js +1 -1
- package/test/browser.predicates.test.js +1 -1
- package/test/browser.replay.recorder.test.js +430 -0
- package/test/browser.rollbar.test.js +58 -12
- package/test/browser.telemetry.test.js +1 -1
- package/test/browser.transforms.test.js +20 -13
- package/test/browser.transport.test.js +5 -4
- package/test/browser.url.test.js +1 -1
- package/test/fixtures/replay/index.js +20 -0
- package/test/fixtures/replay/payloads.fixtures.js +229 -0
- package/test/fixtures/replay/rrwebEvents.fixtures.js +251 -0
- package/test/fixtures/replay/rrwebSyntheticEvents.fixtures.js +328 -0
- package/test/notifier.test.js +1 -1
- package/test/predicates.test.js +1 -1
- package/test/queue.test.js +1 -1
- package/test/rateLimiter.test.js +1 -1
- package/test/react-native.rollbar.test.js +1 -1
- package/test/react-native.transforms.test.js +2 -2
- package/test/react-native.transport.test.js +3 -3
- package/test/replay/index.js +2 -0
- package/test/replay/integration/api.spans.test.js +136 -0
- package/test/replay/integration/e2e.test.js +228 -0
- package/test/replay/integration/index.js +9 -0
- package/test/replay/integration/queue.replayMap.test.js +332 -0
- package/test/replay/integration/replayMap.test.js +163 -0
- package/test/replay/integration/sessionRecording.test.js +390 -0
- package/test/replay/unit/api.postSpans.test.js +150 -0
- package/test/replay/unit/index.js +7 -0
- package/test/replay/unit/queue.replayMap.test.js +225 -0
- package/test/replay/unit/replayMap.test.js +348 -0
- package/test/replay/util/index.js +5 -0
- package/test/replay/util/mockRecordFn.js +80 -0
- package/test/server.lambda.mocha.test.mjs +172 -0
- package/test/server.locals.constructor.mocha.test.mjs +80 -0
- package/test/server.locals.error-handling.mocha.test.mjs +387 -0
- package/test/server.locals.merge.mocha.test.mjs +267 -0
- package/test/server.locals.test-utils.mjs +114 -0
- package/test/server.parser.mocha.test.mjs +87 -0
- package/test/server.predicates.mocha.test.mjs +63 -0
- package/test/server.rollbar.constructor.mocha.test.mjs +199 -0
- package/test/server.rollbar.handlers.mocha.test.mjs +253 -0
- package/test/server.rollbar.logging.mocha.test.mjs +326 -0
- package/test/server.rollbar.misc.mocha.test.mjs +44 -0
- package/test/server.rollbar.test-utils.mjs +57 -0
- package/test/server.telemetry.mocha.test.mjs +377 -0
- package/test/server.transforms.data.mocha.test.mjs +163 -0
- package/test/server.transforms.error.mocha.test.mjs +199 -0
- package/test/server.transforms.request.mocha.test.mjs +208 -0
- package/test/server.transforms.scrub.mocha.test.mjs +140 -0
- package/test/server.transforms.sourcemaps.mocha.test.mjs +122 -0
- package/test/server.transforms.test-utils.mjs +62 -0
- package/test/server.transport.mocha.test.mjs +269 -0
- package/test/telemetry.test.js +132 -1
- package/test/tracing/contextManager.test.js +28 -0
- package/test/tracing/exporter.toPayload.test.js +400 -0
- package/test/tracing/id.test.js +24 -0
- package/test/tracing/span.test.js +183 -0
- package/test/tracing/spanProcessor.test.js +73 -0
- package/test/tracing/tracing.test.js +105 -0
- package/test/transforms.test.js +2 -2
- package/test/truncation.test.js +2 -2
- package/test/utility.test.js +44 -6
- package/webpack.config.js +6 -44
- package/.eslintignore +0 -7
- package/test/server.lambda.test.js +0 -194
- package/test/server.locals.test.js +0 -1068
- package/test/server.parser.test.js +0 -78
- package/test/server.predicates.test.js +0 -91
- package/test/server.rollbar.test.js +0 -728
- package/test/server.telemetry.test.js +0 -443
- package/test/server.transforms.test.js +0 -1193
- 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
|
+
});
|
package/test/transforms.test.js
CHANGED
|
@@ -2,8 +2,8 @@
|
|
|
2
2
|
/* globals describe */
|
|
3
3
|
/* globals it */
|
|
4
4
|
|
|
5
|
-
|
|
6
|
-
|
|
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);
|
package/test/truncation.test.js
CHANGED
|
@@ -2,8 +2,8 @@
|
|
|
2
2
|
/* globals describe */
|
|
3
3
|
/* globals it */
|
|
4
4
|
|
|
5
|
-
|
|
6
|
-
|
|
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 () {
|
package/test/utility.test.js
CHANGED
|
@@ -3,9 +3,9 @@
|
|
|
3
3
|
/* globals it */
|
|
4
4
|
/* globals sinon */
|
|
5
5
|
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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: '
|
|
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: '
|
|
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: '
|
|
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: '
|
|
93
|
+
loader: 'babel-loader',
|
|
132
94
|
exclude: [/node_modules/, /vendor/],
|
|
133
95
|
},
|
|
134
96
|
],
|
package/.eslintignore
DELETED
|
@@ -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 });
|