rollbar 2.26.4 → 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.
- package/.cursor/rules/guidelines.mdc +154 -0
- package/.github/workflows/ci.yml +4 -6
- package/CLAUDE.md +201 -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 +19329 -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 +19329 -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 +19317 -6582
- 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 +19330 -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/get_versions.js +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 +71 -0
- package/src/browser/replay/recorder.js +193 -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 +14 -4
- package/src/browser/transport/xhr.js +12 -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 +416 -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,154 @@
|
|
|
1
|
+
---
|
|
2
|
+
description: Rollbar JS SDK Guidelines
|
|
3
|
+
globs:
|
|
4
|
+
alwaysApply: true
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
## About Rollbar.js
|
|
8
|
+
|
|
9
|
+
Rollbar.js is the official JavaScript SDK for the Rollbar error monitoring service. This library is not standalone - it works in tandem with the Rollbar platform to help developers detect, diagnose, and fix errors in real-time. The SDK sends error data to Rollbar's cloud service where errors are processed, grouped, and notifications are triggered.
|
|
10
|
+
|
|
11
|
+
The library works across platforms, supporting both browser and server-side JavaScript including frameworks like React, Angular, Express, and Next.js. Key features include:
|
|
12
|
+
|
|
13
|
+
- Cross-platform error tracking for client and server-side code
|
|
14
|
+
- Telemetry to provide context around errors (breadcrumbs of events)
|
|
15
|
+
- Automatic error grouping to reduce noise
|
|
16
|
+
- Real-time notifications for critical issues
|
|
17
|
+
- Detailed stack traces with source maps support
|
|
18
|
+
- Distributed tracing and session management
|
|
19
|
+
- Session replay capabilities for reproducing user actions
|
|
20
|
+
|
|
21
|
+
## Project Structure
|
|
22
|
+
|
|
23
|
+
```
|
|
24
|
+
src/
|
|
25
|
+
├── browser/ # Browser-specific implementation
|
|
26
|
+
├── server/ # Node.js-specific implementation
|
|
27
|
+
├── react-native/ # React Native implementation
|
|
28
|
+
├── tracing/ # Distributed tracing support
|
|
29
|
+
└── utility/ # Shared utility functions
|
|
30
|
+
```
|
|
31
|
+
|
|
32
|
+
## Build & Test Commands
|
|
33
|
+
|
|
34
|
+
- Build: `npm run build` (runs Grunt)
|
|
35
|
+
- Lint: `npm run lint` (ESLint)
|
|
36
|
+
- Test all: `npm run test` (runs both server and browser tests)
|
|
37
|
+
- Test browser only: `npm run test-browser`
|
|
38
|
+
- Test server only: `npm run test-server`
|
|
39
|
+
- Test specific browser test: `grunt test-browser:specificTestName`
|
|
40
|
+
- Example: `grunt test-browser:transforms`
|
|
41
|
+
- Single test: `./node_modules/.bin/karma start --single-run --files={path/to/test}`
|
|
42
|
+
|
|
43
|
+
## Modern Development Environment
|
|
44
|
+
|
|
45
|
+
As of version 3.0.0, the SDK has been updated to use modern JavaScript features with appropriate transpilation:
|
|
46
|
+
|
|
47
|
+
- **ES Modules**: The codebase supports ES modules (`import/export`) syntax
|
|
48
|
+
- **Target Compatibility**:
|
|
49
|
+
- Source code uses ECMAScript 2021 features
|
|
50
|
+
- Builds target ES5 for broad browser compatibility
|
|
51
|
+
- Lower versions can use the ES5/CommonJS compatible bundles
|
|
52
|
+
- **Build System**:
|
|
53
|
+
- Webpack 5 with Babel for transpilation
|
|
54
|
+
- ESLint for code quality
|
|
55
|
+
- Configurable output formats (UMD, AMD, vanilla)
|
|
56
|
+
- **Minimum Node.js**: Version 18+ for absolute imports
|
|
57
|
+
- **Toolchain Configuration**:
|
|
58
|
+
- `babel.config.json`: Controls transpilation options
|
|
59
|
+
- `eslint.config.mjs`: Modern ESLint flat config format
|
|
60
|
+
- `webpack.config.js`: Manages bundling and output formats
|
|
61
|
+
|
|
62
|
+
## Code Style Guidelines
|
|
63
|
+
|
|
64
|
+
- Use single quotes for strings
|
|
65
|
+
- Use camelCase for variables (underscore prefix for private)
|
|
66
|
+
- Indentation: 2 spaces
|
|
67
|
+
- Include trailing commas in multiline objects/arrays
|
|
68
|
+
- Max function complexity: 35
|
|
69
|
+
- Unused parameters prefixed with underscore: `function(a, _unused) {}`
|
|
70
|
+
- No whitespace in empty lines
|
|
71
|
+
- Files should end with exactly one newline
|
|
72
|
+
- Control statements (if, for, while, etc.) MUST use braces and newlines, even for single statements
|
|
73
|
+
- Opening braces should be on the same line as the control statement
|
|
74
|
+
- ESLint is used for enforcing code style
|
|
75
|
+
- Prettier for code formatting
|
|
76
|
+
|
|
77
|
+
## SDK Design Principles
|
|
78
|
+
|
|
79
|
+
- **User Problems Are SDK Improvement Opportunities**: When users encounter integration issues, treat these as SDK design improvements rather than user implementation mistakes.
|
|
80
|
+
- Focus on enhancing the SDK to be more robust, intuitive and resilient
|
|
81
|
+
- Implement automatic environment detection and appropriate behavior selection
|
|
82
|
+
- Design APIs that work correctly across all supported contexts without requiring special user handling
|
|
83
|
+
- Errors should be informative and suggest correct usage patterns
|
|
84
|
+
- The burden of complexity should rest with the SDK, not its users
|
|
85
|
+
|
|
86
|
+
## Error Handling
|
|
87
|
+
|
|
88
|
+
- Prefer try/catch blocks around risky operations
|
|
89
|
+
- Log errors through Rollbar's own logger system
|
|
90
|
+
- Scrub sensitive fields in error payloads (see package.json defaults)
|
|
91
|
+
- The codebase uses a comprehensive error tracking approach with appropriate levels:
|
|
92
|
+
- Debug level for development info
|
|
93
|
+
- Warning level for non-critical issues
|
|
94
|
+
- Error level for uncaught exceptions
|
|
95
|
+
|
|
96
|
+
## TypeScript Support
|
|
97
|
+
|
|
98
|
+
- Type definitions in index.d.ts
|
|
99
|
+
- Add JSDoc types to enable intellisense when needed
|
|
100
|
+
|
|
101
|
+
## Common Patterns
|
|
102
|
+
|
|
103
|
+
When working with this codebase, be aware of these patterns:
|
|
104
|
+
|
|
105
|
+
- Error transformation and normalization before sending
|
|
106
|
+
- Telemetry collection for context
|
|
107
|
+
- Queue-based sending with retry logic
|
|
108
|
+
- Environment and context detection
|
|
109
|
+
- Scrubbing of sensitive data
|
|
110
|
+
|
|
111
|
+
## Testing Philosophy
|
|
112
|
+
|
|
113
|
+
- **Analyze Test Failures Objectively**: When tests fail, evaluate both possibilities objectively:
|
|
114
|
+
|
|
115
|
+
- The test could be correctly identifying an actual code issue
|
|
116
|
+
- The test itself might contain errors or invalid expectations
|
|
117
|
+
|
|
118
|
+
- **Diagnostic Process**:
|
|
119
|
+
|
|
120
|
+
1. Examine what the test is expecting vs. what the code actually does
|
|
121
|
+
2. Consider the intended behavior and design of the system
|
|
122
|
+
3. If the test is correct and identifying a legitimate bug, fix the code
|
|
123
|
+
4. If the test contains misconceptions or errors, fix the test
|
|
124
|
+
|
|
125
|
+
- **Default to Code Quality**: When in doubt and both seem potentially valid, prioritize improving code quality over modifying tests to pass
|
|
126
|
+
|
|
127
|
+
## Tracing & Session Replay
|
|
128
|
+
|
|
129
|
+
The `src/tracing/` directory contains an OpenTelemetry-inspired tracing implementation that powers both distributed tracing and session recording features:
|
|
130
|
+
|
|
131
|
+
### Components
|
|
132
|
+
|
|
133
|
+
- **Context & ContextManager**: Manages propagation of tracing context through the application
|
|
134
|
+
- **Span**: Represents a unit of work or operation with timing information and attributes
|
|
135
|
+
- **Tracer**: Creates and manages spans for tracking operations
|
|
136
|
+
- **SpanProcessor & SpanExporter**: Processes and exports spans to their destination
|
|
137
|
+
- **Session**: Manages browser session data persistence and creation
|
|
138
|
+
|
|
139
|
+
### Usage Patterns
|
|
140
|
+
|
|
141
|
+
- **Tracing initialization**: Initialize via the main Tracing class with appropriate configuration
|
|
142
|
+
- **Context propagation**: Use context to pass trace information between components
|
|
143
|
+
- **Span creation**: Create spans to measure operations with `startSpan()`
|
|
144
|
+
- **Attributes and events**: Add metadata to spans with `setAttribute()` and `addEvent()`
|
|
145
|
+
- **Session management**: Automatically manages user sessions via browser sessionStorage
|
|
146
|
+
|
|
147
|
+
### Integration with Session Replay
|
|
148
|
+
|
|
149
|
+
The Session Replay feature utilizes this tracing infrastructure to:
|
|
150
|
+
|
|
151
|
+
- Track and record user sessions with unique identifiers
|
|
152
|
+
- Associate spans with specific user sessions for complete context
|
|
153
|
+
- Capture timing information for accurate playback
|
|
154
|
+
- Store interaction events as span attributes and events
|
package/.github/workflows/ci.yml
CHANGED
|
@@ -9,19 +9,17 @@ on:
|
|
|
9
9
|
|
|
10
10
|
jobs:
|
|
11
11
|
build:
|
|
12
|
-
runs-on: ubuntu-
|
|
12
|
+
runs-on: ubuntu-22.04
|
|
13
13
|
|
|
14
14
|
strategy:
|
|
15
15
|
matrix:
|
|
16
16
|
include:
|
|
17
|
-
- node: 14
|
|
18
|
-
npm: ^8
|
|
19
|
-
- node: 16
|
|
20
|
-
npm: ^8
|
|
21
17
|
- node: 18
|
|
22
18
|
npm: ^9
|
|
23
19
|
- node: 20
|
|
24
20
|
npm: ^10
|
|
21
|
+
- node: 22
|
|
22
|
+
npm: ^10
|
|
25
23
|
- node: latest
|
|
26
24
|
npm: latest
|
|
27
25
|
|
|
@@ -50,4 +48,4 @@ jobs:
|
|
|
50
48
|
eslint_extensions: js
|
|
51
49
|
|
|
52
50
|
- name: Run tests
|
|
53
|
-
run: npm run
|
|
51
|
+
run: npm run test-ci
|
package/CLAUDE.md
ADDED
|
@@ -0,0 +1,201 @@
|
|
|
1
|
+
## About Rollbar.js
|
|
2
|
+
|
|
3
|
+
Rollbar.js is the official JavaScript SDK for the Rollbar error monitoring service. This library is not standalone - it works in tandem with the Rollbar platform to help developers detect, diagnose, and fix errors in real-time. The SDK sends error data to Rollbar's cloud service where errors are processed, grouped, and notifications are triggered.
|
|
4
|
+
|
|
5
|
+
The library works across platforms, supporting both browser and server-side JavaScript including frameworks like React, Angular, Express, and Next.js. Key features include:
|
|
6
|
+
|
|
7
|
+
- Cross-platform error tracking for client and server-side code
|
|
8
|
+
- Telemetry to provide context around errors (breadcrumbs of events)
|
|
9
|
+
- Automatic error grouping to reduce noise
|
|
10
|
+
- Real-time notifications for critical issues
|
|
11
|
+
- Detailed stack traces with source maps support
|
|
12
|
+
- Distributed tracing and session management
|
|
13
|
+
- Session replay capabilities for reproducing user actions
|
|
14
|
+
|
|
15
|
+
## Project Structure
|
|
16
|
+
|
|
17
|
+
```
|
|
18
|
+
src/
|
|
19
|
+
├── browser/ # Browser-specific implementation
|
|
20
|
+
├── server/ # Node.js-specific implementation
|
|
21
|
+
├── react-native/ # React Native implementation
|
|
22
|
+
├── tracing/ # Distributed tracing support
|
|
23
|
+
└── utility/ # Shared utility functions
|
|
24
|
+
```
|
|
25
|
+
|
|
26
|
+
## Build & Test Commands
|
|
27
|
+
|
|
28
|
+
- Build: `npm run build` (runs Grunt)
|
|
29
|
+
- Lint: `npm run lint` (ESLint)
|
|
30
|
+
- Test all: `npm run test` (runs both server and browser tests)
|
|
31
|
+
- Test browser only: `npm run test-browser`
|
|
32
|
+
- Test server only: `npm run test-server`
|
|
33
|
+
- Test specific browser test: `grunt test-browser:specificTestName`
|
|
34
|
+
- Example: `grunt test-browser:transforms`
|
|
35
|
+
- Single test: `./node_modules/.bin/karma start --single-run --files={path/to/test}`
|
|
36
|
+
|
|
37
|
+
## Modern Development Environment
|
|
38
|
+
|
|
39
|
+
As of version 3.0.0, the SDK has been updated to use modern JavaScript features with appropriate transpilation:
|
|
40
|
+
|
|
41
|
+
- **ES Modules**: The codebase supports ES modules (`import/export`) syntax
|
|
42
|
+
- **Target Compatibility**:
|
|
43
|
+
- Source code uses ECMAScript 2021 features
|
|
44
|
+
- Builds target ES5 for broad browser compatibility
|
|
45
|
+
- Lower versions can use the ES5/CommonJS compatible bundles
|
|
46
|
+
- **Build System**:
|
|
47
|
+
- Webpack 5 with Babel for transpilation
|
|
48
|
+
- ESLint for code quality
|
|
49
|
+
- Configurable output formats (UMD, AMD, vanilla)
|
|
50
|
+
- **Minimum Node.js**: Version 18+ for absolute imports
|
|
51
|
+
- **Toolchain Configuration**:
|
|
52
|
+
- `babel.config.json`: Controls transpilation options
|
|
53
|
+
- `eslint.config.mjs`: Modern ESLint flat config format
|
|
54
|
+
- `webpack.config.js`: Manages bundling and output formats
|
|
55
|
+
|
|
56
|
+
## Code Style Guidelines
|
|
57
|
+
|
|
58
|
+
- Use single quotes for strings
|
|
59
|
+
- Use camelCase for variables (underscore prefix for private)
|
|
60
|
+
- Indentation: 2 spaces
|
|
61
|
+
- Include trailing commas in multiline objects/arrays
|
|
62
|
+
- Max function complexity: 35
|
|
63
|
+
- Unused parameters prefixed with underscore: `function(a, _unused) {}`
|
|
64
|
+
- No whitespace in empty lines
|
|
65
|
+
- Files should end with exactly one newline
|
|
66
|
+
- Control statements (if, for, while, etc.) MUST use braces and newlines, even for single statements
|
|
67
|
+
- Opening braces should be on the same line as the control statement
|
|
68
|
+
- ESLint is used for enforcing code style
|
|
69
|
+
- Prettier for code formatting
|
|
70
|
+
|
|
71
|
+
### Documentation vs. Comments
|
|
72
|
+
|
|
73
|
+
- **Function Documentation (JSDoc/TSDoc)**: Always include comprehensive documentation for functions, classes, and methods using JSDoc/TSDoc format (`/** ... */`). These serve as API documentation, appear in IDE tooltips, and help developers understand purpose, parameters, and return values.
|
|
74
|
+
|
|
75
|
+
- **Inline Code Comments**: Avoid redundant comments that merely restate what the code is doing. Only add comments to explain:
|
|
76
|
+
- Why the code works a certain way (decisions and reasoning)
|
|
77
|
+
- Non-obvious behavior or edge cases
|
|
78
|
+
- Complex algorithms or business logic
|
|
79
|
+
- Workarounds for bugs or limitations
|
|
80
|
+
|
|
81
|
+
- **Self-documenting Code**: Write clear, readable code that explains itself through descriptive variable/function names and straightforward logic. Well-written code rarely needs explanatory comments.
|
|
82
|
+
|
|
83
|
+
- **Examples**:
|
|
84
|
+
```javascript
|
|
85
|
+
// BAD - Redundant comment
|
|
86
|
+
// Add one to x
|
|
87
|
+
x += 1;
|
|
88
|
+
|
|
89
|
+
// GOOD - Explains the non-obvious "why"
|
|
90
|
+
// Increment before sending to API to account for zero-indexing
|
|
91
|
+
x += 1;
|
|
92
|
+
```
|
|
93
|
+
|
|
94
|
+
## SDK Design Principles
|
|
95
|
+
|
|
96
|
+
- **User Problems Are SDK Improvement Opportunities**: When users encounter integration issues, treat these as SDK design improvements rather than user implementation mistakes.
|
|
97
|
+
- Focus on enhancing the SDK to be more robust, intuitive and resilient
|
|
98
|
+
- Implement automatic environment detection and appropriate behavior selection
|
|
99
|
+
- Design APIs that work correctly across all supported contexts without requiring special user handling
|
|
100
|
+
- Errors should be informative and suggest correct usage patterns
|
|
101
|
+
- The burden of complexity should rest with the SDK, not its users
|
|
102
|
+
|
|
103
|
+
## Error Handling
|
|
104
|
+
|
|
105
|
+
- Prefer try/catch blocks around risky operations
|
|
106
|
+
- Log errors through Rollbar's own logger system
|
|
107
|
+
- Scrub sensitive fields in error payloads (see package.json defaults)
|
|
108
|
+
- The codebase uses a comprehensive error tracking approach with appropriate levels:
|
|
109
|
+
- Debug level for development info
|
|
110
|
+
- Warning level for non-critical issues
|
|
111
|
+
- Error level for uncaught exceptions
|
|
112
|
+
|
|
113
|
+
## TypeScript Support
|
|
114
|
+
|
|
115
|
+
- Type definitions in index.d.ts
|
|
116
|
+
- Add JSDoc types to enable intellisense when needed
|
|
117
|
+
|
|
118
|
+
## Common Patterns
|
|
119
|
+
|
|
120
|
+
When working with this codebase, be aware of these patterns:
|
|
121
|
+
|
|
122
|
+
- Error transformation and normalization before sending
|
|
123
|
+
- Telemetry collection for context
|
|
124
|
+
- Queue-based sending with retry logic
|
|
125
|
+
- Environment and context detection
|
|
126
|
+
- Scrubbing of sensitive data
|
|
127
|
+
|
|
128
|
+
## Testing Philosophy
|
|
129
|
+
|
|
130
|
+
- **Analyze Test Failures Objectively**: When tests fail, evaluate both possibilities objectively:
|
|
131
|
+
|
|
132
|
+
- The test could be correctly identifying an actual code issue
|
|
133
|
+
- The test itself might contain errors or invalid expectations
|
|
134
|
+
|
|
135
|
+
- **Diagnostic Process**:
|
|
136
|
+
|
|
137
|
+
1. Examine what the test is expecting vs. what the code actually does
|
|
138
|
+
2. Consider the intended behavior and design of the system
|
|
139
|
+
3. If the test is correct and identifying a legitimate bug, fix the code
|
|
140
|
+
4. If the test contains misconceptions or errors, fix the test
|
|
141
|
+
|
|
142
|
+
- **Default to Code Quality**: When in doubt and both seem potentially valid, prioritize improving code quality over modifying tests to pass
|
|
143
|
+
|
|
144
|
+
## Tracing & Session Replay
|
|
145
|
+
|
|
146
|
+
The `src/tracing/` directory contains an OpenTelemetry-inspired tracing implementation that powers both distributed tracing and session recording features:
|
|
147
|
+
|
|
148
|
+
### Components
|
|
149
|
+
|
|
150
|
+
- **Context & ContextManager**: Manages propagation of tracing context through the application
|
|
151
|
+
- **Span**: Represents a unit of work or operation with timing information and attributes
|
|
152
|
+
- **Tracer**: Creates and manages spans for tracking operations
|
|
153
|
+
- **SpanProcessor & SpanExporter**: Processes and exports spans to their destination
|
|
154
|
+
- **Session**: Manages browser session data persistence and creation
|
|
155
|
+
|
|
156
|
+
### Usage Patterns
|
|
157
|
+
|
|
158
|
+
- **Tracing initialization**: Initialize via the main Tracing class with appropriate configuration
|
|
159
|
+
- **Context propagation**: Use context to pass trace information between components
|
|
160
|
+
- **Span creation**: Create spans to measure operations with `startSpan()`
|
|
161
|
+
- **Attributes and events**: Add metadata to spans with `setAttribute()` and `addEvent()`
|
|
162
|
+
- **Session management**: Automatically manages user sessions via browser sessionStorage
|
|
163
|
+
|
|
164
|
+
### Session Replay Implementation
|
|
165
|
+
|
|
166
|
+
The `src/browser/replay` directory contains the implementation of the Session Replay feature:
|
|
167
|
+
|
|
168
|
+
- **Recorder**: Core class that integrates with rrweb to record DOM events
|
|
169
|
+
- **ReplayMap**: Manages the mapping between error occurrences and session recordings
|
|
170
|
+
- **Configuration**: Configurable options in `defaults.js` for replay behavior
|
|
171
|
+
|
|
172
|
+
The Session Replay feature utilizes our tracing infrastructure to:
|
|
173
|
+
|
|
174
|
+
- Record user interactions using rrweb in a memory-efficient way
|
|
175
|
+
- Store recordings with checkpoints for better performance
|
|
176
|
+
- Generate spans that contain replay events with proper timing
|
|
177
|
+
- Associate recordings with user sessions for complete context
|
|
178
|
+
- Transport recordings to Rollbar servers via the API
|
|
179
|
+
|
|
180
|
+
### Session Replay Flow
|
|
181
|
+
|
|
182
|
+
1. **Recording**: The Recorder class continuously records DOM events using rrweb
|
|
183
|
+
2. **Error Occurrence**: When an error occurs, Queue.addItem() calls ReplayMap.add()
|
|
184
|
+
3. **Correlation**: ReplayMap generates a replayId and attaches it to the error
|
|
185
|
+
4. **Coordination**: After successful error submission, Queue triggers ReplayMap.send()
|
|
186
|
+
5. **Transport**: ReplayMap retrieves stored replay data and sends via api.postSpans()
|
|
187
|
+
|
|
188
|
+
### Testing Infrastructure
|
|
189
|
+
|
|
190
|
+
- **Unit Tests**: Component-focused tests in `test/replay/unit/`
|
|
191
|
+
- **Integration Tests**: Test component interactions in `test/replay/integration/`
|
|
192
|
+
- **End-to-End Tests**: Full flow verification in `test/replay/integration/e2e.test.js`
|
|
193
|
+
- **Mock Implementation**: `test/replay/util/mockRecordFn.js` provides a deterministic mock of rrweb
|
|
194
|
+
- **Fixtures**: Realistic rrweb events in `test/fixtures/replay/` for testing
|
|
195
|
+
- **Test Tasks**: Custom Grunt tasks for testing replay code specifically
|
|
196
|
+
|
|
197
|
+
## File Creation Guidelines
|
|
198
|
+
|
|
199
|
+
- **Newlines**: All new files MUST end with exactly one newline character
|
|
200
|
+
- **Encoding**: Use UTF-8 encoding for all text files
|
|
201
|
+
- **Line Endings**: Use LF (Unix-style) line endings, not CRLF
|
package/Gruntfile.js
CHANGED
|
@@ -112,7 +112,6 @@ module.exports = function (grunt) {
|
|
|
112
112
|
grunt.loadNpmTasks('grunt-karma');
|
|
113
113
|
grunt.loadNpmTasks('grunt-webpack');
|
|
114
114
|
grunt.loadNpmTasks('grunt-text-replace');
|
|
115
|
-
grunt.loadNpmTasks('grunt-vows');
|
|
116
115
|
|
|
117
116
|
var rollbarJsSnippet = fs.readFileSync('dist/rollbar.snippet.js');
|
|
118
117
|
var rollbarjQuerySnippet = fs.readFileSync('dist/plugins/jquery.min.js');
|
|
@@ -120,14 +119,6 @@ module.exports = function (grunt) {
|
|
|
120
119
|
grunt.initConfig({
|
|
121
120
|
pkg: pkg,
|
|
122
121
|
webpack: webpackConfig,
|
|
123
|
-
vows: {
|
|
124
|
-
all: {
|
|
125
|
-
options: {
|
|
126
|
-
reporter: 'spec',
|
|
127
|
-
},
|
|
128
|
-
src: ['test/server.*.test.js'],
|
|
129
|
-
},
|
|
130
|
-
},
|
|
131
122
|
|
|
132
123
|
karma: buildGruntKarmaConfig(singleRun, browserTests, reporters),
|
|
133
124
|
|
|
@@ -145,7 +136,6 @@ module.exports = function (grunt) {
|
|
|
145
136
|
// Main rollbar snippet
|
|
146
137
|
{
|
|
147
138
|
from: new RegExp(
|
|
148
|
-
/* eslint-disable-next-line no-control-regex */
|
|
149
139
|
'^(.*// Rollbar Snippet)[\n\r]+(.*[\n\r])*(.*// End Rollbar Snippet)',
|
|
150
140
|
'm',
|
|
151
141
|
),
|
|
@@ -157,7 +147,6 @@ module.exports = function (grunt) {
|
|
|
157
147
|
// jQuery rollbar plugin snippet
|
|
158
148
|
{
|
|
159
149
|
from: new RegExp(
|
|
160
|
-
/* eslint-disable-next-line no-control-regex */
|
|
161
150
|
'^(.*// Rollbar jQuery Snippet)[\n\r]+(.*[\n\r])*(.*// End Rollbar jQuery Snippet)',
|
|
162
151
|
'm',
|
|
163
152
|
),
|
|
@@ -183,13 +172,11 @@ module.exports = function (grunt) {
|
|
|
183
172
|
|
|
184
173
|
grunt.registerTask('build', ['webpack', 'replace:snippets']);
|
|
185
174
|
grunt.registerTask('default', ['build']);
|
|
186
|
-
grunt.registerTask('test', [
|
|
175
|
+
grunt.registerTask('test', [
|
|
176
|
+
'test-browser',
|
|
177
|
+
]);
|
|
187
178
|
grunt.registerTask('release', ['build', 'copyrelease']);
|
|
188
179
|
|
|
189
|
-
grunt.registerTask('test-server', function (_target) {
|
|
190
|
-
var tasks = ['vows'];
|
|
191
|
-
grunt.task.run.apply(grunt.task, tasks);
|
|
192
|
-
});
|
|
193
180
|
|
|
194
181
|
grunt.registerTask('test-browser', function (target) {
|
|
195
182
|
var karmaTask = 'karma' + (target ? ':' + target : '');
|
|
@@ -197,6 +184,62 @@ module.exports = function (grunt) {
|
|
|
197
184
|
grunt.task.run.apply(grunt.task, tasks);
|
|
198
185
|
});
|
|
199
186
|
|
|
187
|
+
function findReplayTests() {
|
|
188
|
+
return Object.keys(browserTests).filter(function (testName) {
|
|
189
|
+
var testPath = browserTests[testName];
|
|
190
|
+
return (
|
|
191
|
+
testPath.includes('test/replay/') ||
|
|
192
|
+
testPath.includes('test/tracing/') ||
|
|
193
|
+
testPath.match(/test\/browser\.replay\..*\.test\.js/)
|
|
194
|
+
);
|
|
195
|
+
});
|
|
196
|
+
}
|
|
197
|
+
|
|
198
|
+
grunt.registerTask('test-replay', function () {
|
|
199
|
+
var replayTests = findReplayTests();
|
|
200
|
+
|
|
201
|
+
grunt.log.writeln('Running all replay-related tests:');
|
|
202
|
+
replayTests.forEach(function (testName) {
|
|
203
|
+
grunt.log.writeln('- ' + testName + ' (' + browserTests[testName] + ')');
|
|
204
|
+
});
|
|
205
|
+
|
|
206
|
+
replayTests.forEach(function (testName) {
|
|
207
|
+
grunt.task.run('karma:' + testName);
|
|
208
|
+
});
|
|
209
|
+
});
|
|
210
|
+
|
|
211
|
+
grunt.registerTask('test-replay-unit', function () {
|
|
212
|
+
var unitTests = findReplayTests().filter(function (testName) {
|
|
213
|
+
var testPath = browserTests[testName];
|
|
214
|
+
return testPath.includes('/replay/unit/');
|
|
215
|
+
});
|
|
216
|
+
|
|
217
|
+
grunt.log.writeln('Running replay unit tests:');
|
|
218
|
+
unitTests.forEach(function (testName) {
|
|
219
|
+
grunt.log.writeln('- ' + testName + ' (' + browserTests[testName] + ')');
|
|
220
|
+
});
|
|
221
|
+
|
|
222
|
+
unitTests.forEach(function (testName) {
|
|
223
|
+
grunt.task.run('karma:' + testName);
|
|
224
|
+
});
|
|
225
|
+
});
|
|
226
|
+
|
|
227
|
+
grunt.registerTask('test-replay-integration', function () {
|
|
228
|
+
var integrationTests = findReplayTests().filter(function (testName) {
|
|
229
|
+
var testPath = browserTests[testName];
|
|
230
|
+
return testPath.includes('/replay/integration/');
|
|
231
|
+
});
|
|
232
|
+
|
|
233
|
+
grunt.log.writeln('Running replay integration tests:');
|
|
234
|
+
integrationTests.forEach(function (testName) {
|
|
235
|
+
grunt.log.writeln('- ' + testName + ' (' + browserTests[testName] + ')');
|
|
236
|
+
});
|
|
237
|
+
|
|
238
|
+
integrationTests.forEach(function (testName) {
|
|
239
|
+
grunt.task.run('karma:' + testName);
|
|
240
|
+
});
|
|
241
|
+
});
|
|
242
|
+
|
|
200
243
|
grunt.registerTask('copyrelease', function createRelease() {
|
|
201
244
|
var version = pkg.version;
|
|
202
245
|
var builds = ['', '.umd'];
|
package/Makefile
CHANGED
package/SECURITY.md
ADDED
package/codex.md
ADDED
|
@@ -0,0 +1,148 @@
|
|
|
1
|
+
## About Rollbar.js
|
|
2
|
+
|
|
3
|
+
Rollbar.js is the official JavaScript SDK for the Rollbar error monitoring service. This library is not standalone - it works in tandem with the Rollbar platform to help developers detect, diagnose, and fix errors in real-time. The SDK sends error data to Rollbar's cloud service where errors are processed, grouped, and notifications are triggered.
|
|
4
|
+
|
|
5
|
+
The library works across platforms, supporting both browser and server-side JavaScript including frameworks like React, Angular, Express, and Next.js. Key features include:
|
|
6
|
+
|
|
7
|
+
- Cross-platform error tracking for client and server-side code
|
|
8
|
+
- Telemetry to provide context around errors (breadcrumbs of events)
|
|
9
|
+
- Automatic error grouping to reduce noise
|
|
10
|
+
- Real-time notifications for critical issues
|
|
11
|
+
- Detailed stack traces with source maps support
|
|
12
|
+
- Distributed tracing and session management
|
|
13
|
+
- Session replay capabilities for reproducing user actions
|
|
14
|
+
|
|
15
|
+
## Project Structure
|
|
16
|
+
|
|
17
|
+
```
|
|
18
|
+
src/
|
|
19
|
+
├── browser/ # Browser-specific implementation
|
|
20
|
+
├── server/ # Node.js-specific implementation
|
|
21
|
+
├── react-native/ # React Native implementation
|
|
22
|
+
├── tracing/ # Distributed tracing support
|
|
23
|
+
└── utility/ # Shared utility functions
|
|
24
|
+
```
|
|
25
|
+
|
|
26
|
+
## Build & Test Commands
|
|
27
|
+
|
|
28
|
+
- Build: `npm run build` (runs Grunt)
|
|
29
|
+
- Lint: `npm run lint` (ESLint)
|
|
30
|
+
- Test all: `npm run test` (runs both server and browser tests)
|
|
31
|
+
- Test browser only: `npm run test-browser`
|
|
32
|
+
- Test server only: `npm run test-server`
|
|
33
|
+
- Test specific browser test: `grunt test-browser:specificTestName`
|
|
34
|
+
- Example: `grunt test-browser:transforms`
|
|
35
|
+
- Single test: `./node_modules/.bin/karma start --single-run --files={path/to/test}`
|
|
36
|
+
|
|
37
|
+
## Modern Development Environment
|
|
38
|
+
|
|
39
|
+
As of version 3.0.0, the SDK has been updated to use modern JavaScript features with appropriate transpilation:
|
|
40
|
+
|
|
41
|
+
- **ES Modules**: The codebase supports ES modules (`import/export`) syntax
|
|
42
|
+
- **Target Compatibility**:
|
|
43
|
+
- Source code uses ECMAScript 2021 features
|
|
44
|
+
- Builds target ES5 for broad browser compatibility
|
|
45
|
+
- Lower versions can use the ES5/CommonJS compatible bundles
|
|
46
|
+
- **Build System**:
|
|
47
|
+
- Webpack 5 with Babel for transpilation
|
|
48
|
+
- ESLint for code quality
|
|
49
|
+
- Configurable output formats (UMD, AMD, vanilla)
|
|
50
|
+
- **Minimum Node.js**: Version 18+ for absolute imports
|
|
51
|
+
- **Toolchain Configuration**:
|
|
52
|
+
- `babel.config.json`: Controls transpilation options
|
|
53
|
+
- `eslint.config.mjs`: Modern ESLint flat config format
|
|
54
|
+
- `webpack.config.js`: Manages bundling and output formats
|
|
55
|
+
|
|
56
|
+
## Code Style Guidelines
|
|
57
|
+
|
|
58
|
+
- Use single quotes for strings
|
|
59
|
+
- Use camelCase for variables (underscore prefix for private)
|
|
60
|
+
- Indentation: 2 spaces
|
|
61
|
+
- Include trailing commas in multiline objects/arrays
|
|
62
|
+
- Max function complexity: 35
|
|
63
|
+
- Unused parameters prefixed with underscore: `function(a, _unused) {}`
|
|
64
|
+
- No whitespace in empty lines
|
|
65
|
+
- Files should end with exactly one newline
|
|
66
|
+
- Control statements (if, for, while, etc.) MUST use braces and newlines, even for single statements
|
|
67
|
+
- Opening braces should be on the same line as the control statement
|
|
68
|
+
- ESLint is used for enforcing code style
|
|
69
|
+
- Prettier for code formatting
|
|
70
|
+
|
|
71
|
+
## SDK Design Principles
|
|
72
|
+
|
|
73
|
+
- **User Problems Are SDK Improvement Opportunities**: When users encounter integration issues, treat these as SDK design improvements rather than user implementation mistakes.
|
|
74
|
+
- Focus on enhancing the SDK to be more robust, intuitive and resilient
|
|
75
|
+
- Implement automatic environment detection and appropriate behavior selection
|
|
76
|
+
- Design APIs that work correctly across all supported contexts without requiring special user handling
|
|
77
|
+
- Errors should be informative and suggest correct usage patterns
|
|
78
|
+
- The burden of complexity should rest with the SDK, not its users
|
|
79
|
+
|
|
80
|
+
## Error Handling
|
|
81
|
+
|
|
82
|
+
- Prefer try/catch blocks around risky operations
|
|
83
|
+
- Log errors through Rollbar's own logger system
|
|
84
|
+
- Scrub sensitive fields in error payloads (see package.json defaults)
|
|
85
|
+
- The codebase uses a comprehensive error tracking approach with appropriate levels:
|
|
86
|
+
- Debug level for development info
|
|
87
|
+
- Warning level for non-critical issues
|
|
88
|
+
- Error level for uncaught exceptions
|
|
89
|
+
|
|
90
|
+
## TypeScript Support
|
|
91
|
+
|
|
92
|
+
- Type definitions in index.d.ts
|
|
93
|
+
- Add JSDoc types to enable intellisense when needed
|
|
94
|
+
|
|
95
|
+
## Common Patterns
|
|
96
|
+
|
|
97
|
+
When working with this codebase, be aware of these patterns:
|
|
98
|
+
|
|
99
|
+
- Error transformation and normalization before sending
|
|
100
|
+
- Telemetry collection for context
|
|
101
|
+
- Queue-based sending with retry logic
|
|
102
|
+
- Environment and context detection
|
|
103
|
+
- Scrubbing of sensitive data
|
|
104
|
+
|
|
105
|
+
## Testing Philosophy
|
|
106
|
+
|
|
107
|
+
- **Analyze Test Failures Objectively**: When tests fail, evaluate both possibilities objectively:
|
|
108
|
+
|
|
109
|
+
- The test could be correctly identifying an actual code issue
|
|
110
|
+
- The test itself might contain errors or invalid expectations
|
|
111
|
+
|
|
112
|
+
- **Diagnostic Process**:
|
|
113
|
+
|
|
114
|
+
1. Examine what the test is expecting vs. what the code actually does
|
|
115
|
+
2. Consider the intended behavior and design of the system
|
|
116
|
+
3. If the test is correct and identifying a legitimate bug, fix the code
|
|
117
|
+
4. If the test contains misconceptions or errors, fix the test
|
|
118
|
+
|
|
119
|
+
- **Default to Code Quality**: When in doubt and both seem potentially valid, prioritize improving code quality over modifying tests to pass
|
|
120
|
+
|
|
121
|
+
## Tracing & Session Replay
|
|
122
|
+
|
|
123
|
+
The `src/tracing/` directory contains an OpenTelemetry-inspired tracing implementation that powers both distributed tracing and session recording features:
|
|
124
|
+
|
|
125
|
+
### Components
|
|
126
|
+
|
|
127
|
+
- **Context & ContextManager**: Manages propagation of tracing context through the application
|
|
128
|
+
- **Span**: Represents a unit of work or operation with timing information and attributes
|
|
129
|
+
- **Tracer**: Creates and manages spans for tracking operations
|
|
130
|
+
- **SpanProcessor & SpanExporter**: Processes and exports spans to their destination
|
|
131
|
+
- **Session**: Manages browser session data persistence and creation
|
|
132
|
+
|
|
133
|
+
### Usage Patterns
|
|
134
|
+
|
|
135
|
+
- **Tracing initialization**: Initialize via the main Tracing class with appropriate configuration
|
|
136
|
+
- **Context propagation**: Use context to pass trace information between components
|
|
137
|
+
- **Span creation**: Create spans to measure operations with `startSpan()`
|
|
138
|
+
- **Attributes and events**: Add metadata to spans with `setAttribute()` and `addEvent()`
|
|
139
|
+
- **Session management**: Automatically manages user sessions via browser sessionStorage
|
|
140
|
+
|
|
141
|
+
### Integration with Session Replay
|
|
142
|
+
|
|
143
|
+
The Session Replay feature utilizes this tracing infrastructure to:
|
|
144
|
+
|
|
145
|
+
- Track and record user sessions with unique identifiers
|
|
146
|
+
- Associate spans with specific user sessions for complete context
|
|
147
|
+
- Capture timing information for accurate playback
|
|
148
|
+
- Store interaction events as span attributes and events
|