Skip to content

Commit bcc8174

Browse files
authored
Release 3.1.0 (#1464)
1 parent cc2faca commit bcc8174

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

43 files changed

+912
-53
lines changed

dist/rollbar.cjs

Lines changed: 260 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -181,6 +181,9 @@ function isPromise(p) {
181181
function isBrowser() {
182182
return typeof window !== 'undefined';
183183
}
184+
function isRequestObject(input) {
185+
return typeof Request !== 'undefined' && input instanceof Request;
186+
}
184187
function redact() {
185188
return '********';
186189
}
@@ -825,6 +828,70 @@ function merge() {
825828
}
826829
return result;
827830
}
831+
function shouldAddBaggageHeader(options, tracing, url) {
832+
var _options$tracing;
833+
if (!(tracing !== null && tracing !== void 0 && tracing.sessionId) || !url) {
834+
return false;
835+
}
836+
var propagation = options === null || options === void 0 || (_options$tracing = options.tracing) === null || _options$tracing === void 0 ? void 0 : _options$tracing.propagation;
837+
var enabledHeaders = propagation === null || propagation === void 0 ? void 0 : propagation.enabledHeaders;
838+
if (!Array.isArray(enabledHeaders) || !enabledHeaders.includes('baggage')) {
839+
return false;
840+
}
841+
var enabledCorsUrls = propagation === null || propagation === void 0 ? void 0 : propagation.enabledCorsUrls;
842+
if (!Array.isArray(enabledCorsUrls) || enabledCorsUrls.length === 0) {
843+
return false;
844+
}
845+
return enabledCorsUrls.some(function (pattern) {
846+
if (isType(pattern, 'string')) {
847+
return url === pattern;
848+
}
849+
if (isType(pattern, 'regexp')) {
850+
return pattern.test(url);
851+
}
852+
return false;
853+
});
854+
}
855+
function addHeadersToFetch(args, newHeaders) {
856+
var _init;
857+
// Headers may be in the request object or the init object.
858+
// If present in both places, the init object must be used.
859+
//
860+
var init = args[1];
861+
var initHeaders = (_init = init) === null || _init === void 0 ? void 0 : _init.headers;
862+
var reqHeaders = isRequestObject(args[0]) && args[0].headers;
863+
var headers = initHeaders || reqHeaders;
864+
865+
// If headers are not present in either place, they are added to the init object.
866+
// If there is no init object, one must be created and added to args.
867+
if (!headers) {
868+
if (!init) {
869+
args[1] = init = {};
870+
}
871+
headers = init.headers = {};
872+
}
873+
874+
// `headers` may be a Headers object or a plain object.
875+
if (headers instanceof Headers) {
876+
for (var _i = 0, _Object$keys = Object.keys(newHeaders); _i < _Object$keys.length; _i++) {
877+
var key = _Object$keys[_i];
878+
headers.append(key, newHeaders[key]);
879+
}
880+
} else if (isObject(headers)) {
881+
for (var _i2 = 0, _Object$keys2 = Object.keys(newHeaders); _i2 < _Object$keys2.length; _i2++) {
882+
var _key = _Object$keys2[_i2];
883+
headers[_key] = newHeaders[_key];
884+
}
885+
}
886+
}
887+
function getSessionIdFromAsyncLocalStorage(client) {
888+
var storage = client.asyncLocalStorage;
889+
if (!storage || typeof storage.getStore !== 'function') {
890+
return null;
891+
}
892+
var store = storage.getStore();
893+
return (store === null || store === void 0 ? void 0 : store.sessionId) || null;
894+
}
828895

829896
;// ./src/apiUtility.js
830897

@@ -1130,7 +1197,7 @@ function _getOTLPTransport(options, url) {
11301197
/**
11311198
* Default options shared across platforms
11321199
*/
1133-
var version = '3.0.0';
1200+
var version = '3.1.0';
11341201
var endpoint = 'api.rollbar.com/api/1/item/';
11351202
var logLevel = 'debug';
11361203
var reportLevel = 'debug';
@@ -2167,9 +2234,11 @@ Rollbar.prototype._log = function (defaultLevel, item) {
21672234
Rollbar.prototype._addItemAttributes = function (item) {
21682235
var _this$tracing, _this$tracing2;
21692236
var span = (_this$tracing = this.tracing) === null || _this$tracing === void 0 ? void 0 : _this$tracing.getSpan();
2237+
var asyncLocalSessionId = getSessionIdFromAsyncLocalStorage(this);
2238+
var sessionId = asyncLocalSessionId || ((_this$tracing2 = this.tracing) === null || _this$tracing2 === void 0 ? void 0 : _this$tracing2.sessionId);
21702239
var attributes = [{
21712240
key: 'session_id',
2172-
value: (_this$tracing2 = this.tracing) === null || _this$tracing2 === void 0 ? void 0 : _this$tracing2.sessionId
2241+
value: sessionId
21732242
}, {
21742243
key: 'span_id',
21752244
value: span === null || span === void 0 ? void 0 : span.spanId
@@ -3098,6 +3167,83 @@ function defaults_arrayLikeToArray(r, a) { (null == a || a > r.length) && (a = r
30983167
var notifierName = 'node_rollbar';
30993168
var scrubHeaders = commonScrubHeaders;
31003169
var scrubFields = [].concat(_toConsumableArray(commonScrubFields), _toConsumableArray(apiScrubFields), _toConsumableArray(requestScrubFields));
3170+
;// external "node:async_hooks"
3171+
const external_node_async_hooks_namespaceObject = require("node:async_hooks");
3172+
;// ./src/server/middleware/rollbarExpressMiddleware.js
3173+
function rollbarExpressMiddleware_createForOfIteratorHelper(r, e) { var t = "undefined" != typeof Symbol && r[Symbol.iterator] || r["@@iterator"]; if (!t) { if (Array.isArray(r) || (t = rollbarExpressMiddleware_unsupportedIterableToArray(r)) || e && r && "number" == typeof r.length) { t && (r = t); var _n = 0, F = function F() {}; return { s: F, n: function n() { return _n >= r.length ? { done: !0 } : { done: !1, value: r[_n++] }; }, e: function e(r) { throw r; }, f: F }; } throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); } var o, a = !0, u = !1; return { s: function s() { t = t.call(r); }, n: function n() { var r = t.next(); return a = r.done, r; }, e: function e(r) { u = !0, o = r; }, f: function f() { try { a || null == t.return || t.return(); } finally { if (u) throw o; } } }; }
3174+
function rollbarExpressMiddleware_unsupportedIterableToArray(r, a) { if (r) { if ("string" == typeof r) return rollbarExpressMiddleware_arrayLikeToArray(r, a); var t = {}.toString.call(r).slice(8, -1); return "Object" === t && r.constructor && (t = r.constructor.name), "Map" === t || "Set" === t ? Array.from(r) : "Arguments" === t || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(t) ? rollbarExpressMiddleware_arrayLikeToArray(r, a) : void 0; } }
3175+
function rollbarExpressMiddleware_arrayLikeToArray(r, a) { (null == a || a > r.length) && (a = r.length); for (var e = 0, n = Array(a); e < a; e++) n[e] = r[e]; return n; }
3176+
3177+
function extractSessionId(headerValue) {
3178+
if (!headerValue) {
3179+
return null;
3180+
}
3181+
var rawValue = Array.isArray(headerValue) ? headerValue.join(',') : headerValue;
3182+
if (typeof rawValue !== 'string') {
3183+
return null;
3184+
}
3185+
var entries = rawValue.split(',');
3186+
var _iterator = rollbarExpressMiddleware_createForOfIteratorHelper(entries),
3187+
_step;
3188+
try {
3189+
for (_iterator.s(); !(_step = _iterator.n()).done;) {
3190+
var entry = _step.value;
3191+
var trimmed = entry.trim();
3192+
if (!trimmed) {
3193+
continue;
3194+
}
3195+
var equalsIndex = trimmed.indexOf('=');
3196+
if (equalsIndex === -1) {
3197+
continue;
3198+
}
3199+
var key = trimmed.slice(0, equalsIndex).trim();
3200+
if (key !== 'rollbar.session.id') {
3201+
continue;
3202+
}
3203+
var value = trimmed.slice(equalsIndex + 1).trim();
3204+
if (!value) {
3205+
return null;
3206+
}
3207+
try {
3208+
return decodeURIComponent(value);
3209+
} catch (_e) {
3210+
return value;
3211+
}
3212+
}
3213+
} catch (err) {
3214+
_iterator.e(err);
3215+
} finally {
3216+
_iterator.f();
3217+
}
3218+
return null;
3219+
}
3220+
function getBaggageHeader(req) {
3221+
var _req$headers;
3222+
if (!req) {
3223+
return null;
3224+
}
3225+
if (typeof req.get === 'function') {
3226+
return req.get('baggage');
3227+
}
3228+
return ((_req$headers = req.headers) === null || _req$headers === void 0 ? void 0 : _req$headers.baggage) || null;
3229+
}
3230+
function rollbarExpressMiddleware(rollbar) {
3231+
var storage = (rollbar === null || rollbar === void 0 ? void 0 : rollbar.client.asyncLocalStorage) || new external_node_async_hooks_namespaceObject.AsyncLocalStorage();
3232+
if (rollbar) {
3233+
rollbar.client.asyncLocalStorage = storage;
3234+
}
3235+
return function rollbarExpressMiddlewareHandler(req, _res, next) {
3236+
var sessionId = extractSessionId(getBaggageHeader(req));
3237+
if (!sessionId) {
3238+
return next();
3239+
}
3240+
return storage.run({
3241+
sessionId: sessionId
3242+
}, function () {
3243+
return next();
3244+
});
3245+
};
3246+
}
31013247
;// external "http"
31023248
const external_http_namespaceObject = require("http");
31033249
;// external "https"
@@ -3246,6 +3392,9 @@ Instrumenter.prototype.deinstrumentNetwork = function () {
32463392
Instrumenter.prototype.instrumentNetwork = function () {
32473393
utility_replace(external_http_namespaceObject, 'request', networkRequestWrapper.bind(this), this.replacements, 'network');
32483394
utility_replace(external_https_namespaceObject, 'request', networkRequestWrapper.bind(this), this.replacements, 'network');
3395+
if (typeof globalThis.fetch === 'function') {
3396+
utility_replace(globalThis, 'fetch', fetchRequestWrapper.bind(this), this.replacements, 'network');
3397+
}
32493398
};
32503399
function networkRequestWrapper(orig) {
32513400
var _this = this;
@@ -3258,9 +3407,19 @@ function networkRequestWrapper(orig) {
32583407
options = args[1],
32593408
cb = args[2];
32603409
var mergedOptions = mergeOptions(url, options, cb);
3410+
var requestUrl = constructUrl(mergedOptions.options);
3411+
var sessionId = getSessionIdFromAsyncLocalStorage(_this.rollbar.client);
3412+
if (sessionId && shouldAddBaggageHeader(_this.options, {
3413+
sessionId: sessionId
3414+
}, requestUrl)) {
3415+
if (!mergedOptions.options.headers) {
3416+
mergedOptions.options.headers = {};
3417+
}
3418+
mergedOptions.options.headers.baggage = "rollbar.session.id=".concat(sessionId);
3419+
}
32613420
var metadata = {
32623421
method: mergedOptions.options.method || 'GET',
3263-
url: constructUrl(mergedOptions.options),
3422+
url: requestUrl,
32643423
status_code: null,
32653424
start_time_ms: now(),
32663425
end_time_ms: null
@@ -3295,6 +3454,93 @@ function responseCallbackWrapper(options, metadata, callback) {
32953454
}
32963455
};
32973456
}
3457+
function fetchRequestWrapper(orig) {
3458+
var _this2 = this;
3459+
var telemeter = this.telemeter;
3460+
return function () {
3461+
for (var _len2 = arguments.length, args = new Array(_len2), _key2 = 0; _key2 < _len2; _key2++) {
3462+
args[_key2] = arguments[_key2];
3463+
}
3464+
var input = args[0];
3465+
var init = args[1];
3466+
var method = 'GET';
3467+
var url;
3468+
var sessionId = getSessionIdFromAsyncLocalStorage(_this2.rollbar.client);
3469+
if (isType(input, 'string') || input instanceof URL) {
3470+
url = input.toString();
3471+
} else if (input) {
3472+
url = input.url;
3473+
if (input.method) {
3474+
method = input.method;
3475+
}
3476+
}
3477+
if (init && init.method) {
3478+
method = init.method;
3479+
}
3480+
if (sessionId && shouldAddBaggageHeader(_this2.options, {
3481+
sessionId: sessionId
3482+
}, url)) {
3483+
var headers = {
3484+
baggage: "rollbar.session.id=".concat(sessionId)
3485+
};
3486+
addHeadersToFetch(args, headers);
3487+
}
3488+
var metadata = {
3489+
method: method,
3490+
url: url,
3491+
status_code: null,
3492+
start_time_ms: now(),
3493+
end_time_ms: null
3494+
};
3495+
if (_this2.autoInstrument.networkRequestHeaders) {
3496+
var requestHeaders = normalizeFetchHeaders(init && init.headers ? init.headers : input && input.headers);
3497+
if (requestHeaders) {
3498+
metadata.request_headers = requestHeaders;
3499+
}
3500+
}
3501+
telemeter.captureNetwork(metadata, 'fetch');
3502+
return orig.apply(globalThis, args).then(function (res) {
3503+
metadata.end_time_ms = now();
3504+
metadata.status_code = res.status;
3505+
if (_this2.autoInstrument.networkResponseHeaders) {
3506+
var responseHeaders = normalizeFetchHeaders(res.headers);
3507+
if (responseHeaders) {
3508+
metadata.response = metadata.response || {};
3509+
metadata.response.headers = responseHeaders;
3510+
}
3511+
}
3512+
return res;
3513+
}, function (err) {
3514+
metadata.end_time_ms = now();
3515+
metadata.status_code = 0;
3516+
metadata.error = [err.name, err.message].join(': ');
3517+
throw err;
3518+
});
3519+
};
3520+
}
3521+
function normalizeFetchHeaders(headers) {
3522+
if (!headers) return null;
3523+
if (typeof headers.forEach === 'function') {
3524+
var normalized = {};
3525+
headers.forEach(function (value, key) {
3526+
normalized[key] = value;
3527+
});
3528+
return normalized;
3529+
}
3530+
if (Array.isArray(headers)) {
3531+
var _normalized = {};
3532+
headers.forEach(function (pair) {
3533+
if (pair && pair.length > 1) {
3534+
_normalized[pair[0]] = pair[1];
3535+
}
3536+
});
3537+
return _normalized;
3538+
}
3539+
if (isType(headers, 'object')) {
3540+
return headers;
3541+
}
3542+
return null;
3543+
}
32983544
Instrumenter.prototype.captureNetwork = function (metadata, subtype, rollbarUUID) {
32993545
return this.telemeter.captureNetwork(metadata, subtype, rollbarUUID);
33003546
};
@@ -4434,6 +4680,7 @@ function _currentTime() {
44344680

44354681

44364682

4683+
44374684
function rollbar_Rollbar(options, client) {
44384685
if (isType(options, 'string')) {
44394686
var accessToken = options;
@@ -4839,6 +5086,16 @@ rollbar_Rollbar.wrapCallback = function (f) {
48395086
handleUninitialized();
48405087
}
48415088
};
5089+
rollbar_Rollbar.prototype.expressMiddleware = function () {
5090+
return rollbarExpressMiddleware(this);
5091+
};
5092+
rollbar_Rollbar.expressMiddleware = function () {
5093+
if (_instance) {
5094+
return rollbarExpressMiddleware(_instance);
5095+
}
5096+
handleUninitialized();
5097+
return undefined;
5098+
};
48425099
rollbar_Rollbar.prototype.captureEvent = function () {
48435100
var event = createTelemetryEvent(arguments);
48445101
return this.client.captureEvent(event.type, event.metadata, event.level);

0 commit comments

Comments
 (0)