@sentry/core
Version:
Base implementation for all Sentry JavaScript SDKs
88 lines (73 loc) • 2.93 kB
JavaScript
Object.defineProperty(exports, '__esModule', { value: true });
var utils = require('@sentry/utils');
var DEFAULT_TRANSPORT_BUFFER_SIZE = 30;
/**
* Creates an instance of a Sentry `Transport`
*
* @param options
* @param makeRequest
*/
function createTransport(
options,
makeRequest,
buffer = utils.makePromiseBuffer(options.bufferSize || DEFAULT_TRANSPORT_BUFFER_SIZE),
) {
let rateLimits = {};
var flush = (timeout) => buffer.drain(timeout);
function send(envelope) {
var filteredEnvelopeItems = [];
// Drop rate limited items from envelope
utils.forEachEnvelopeItem(envelope, (item, type) => {
var envelopeItemDataCategory = utils.envelopeItemTypeToDataCategory(type);
if (utils.isRateLimited(rateLimits, envelopeItemDataCategory)) {
options.recordDroppedEvent('ratelimit_backoff', envelopeItemDataCategory);
} else {
filteredEnvelopeItems.push(item);
}
});
// Skip sending if envelope is empty after filtering out rate limited events
if (filteredEnvelopeItems.length === 0) {
return utils.resolvedSyncPromise();
}
var filteredEnvelope = utils.createEnvelope(envelope[0], filteredEnvelopeItems );
// Creates client report for each item in an envelope
var recordEnvelopeLoss = (reason) => {
utils.forEachEnvelopeItem(filteredEnvelope, (_, type) => {
options.recordDroppedEvent(reason, utils.envelopeItemTypeToDataCategory(type));
});
};
var requestTask = () =>
makeRequest({ body: utils.serializeEnvelope(filteredEnvelope, options.textEncoder) }).then(
response => {
// We don't want to throw on NOK responses, but we want to at least log them
if (response.statusCode !== undefined && (response.statusCode < 200 || response.statusCode >= 300)) {
(typeof __SENTRY_DEBUG__ === 'undefined' || __SENTRY_DEBUG__) && utils.logger.warn(`Sentry responded with status code ${response.statusCode} to sent event.`);
}
rateLimits = utils.updateRateLimits(rateLimits, response);
},
error => {
(typeof __SENTRY_DEBUG__ === 'undefined' || __SENTRY_DEBUG__) && utils.logger.error('Failed while sending event:', error);
recordEnvelopeLoss('network_error');
},
);
return buffer.add(requestTask).then(
result => result,
error => {
if (error instanceof utils.SentryError) {
(typeof __SENTRY_DEBUG__ === 'undefined' || __SENTRY_DEBUG__) && utils.logger.error('Skipped sending event due to full buffer');
recordEnvelopeLoss('queue_overflow');
return utils.resolvedSyncPromise();
} else {
throw error;
}
},
);
}
return {
send,
flush,
};
}
exports.DEFAULT_TRANSPORT_BUFFER_SIZE = DEFAULT_TRANSPORT_BUFFER_SIZE;
exports.createTransport = createTransport;
//# sourceMappingURL=base.js.map