UNPKG

@sentry/core

Version:
102 lines (86 loc) 3.18 kB
Object.defineProperty(exports, '__esModule', { value: true }); const utils = require('@sentry/utils'); const debugBuild = require('../debug-build.js'); const DEFAULT_TRANSPORT_BUFFER_SIZE = 64; /** * 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 = {}; const flush = (timeout) => buffer.drain(timeout); function send(envelope) { const filteredEnvelopeItems = []; // Drop rate limited items from envelope utils.forEachEnvelopeItem(envelope, (item, type) => { const dataCategory = utils.envelopeItemTypeToDataCategory(type); if (utils.isRateLimited(rateLimits, dataCategory)) { const event = getEventForEnvelopeItem(item, type); options.recordDroppedEvent('ratelimit_backoff', dataCategory, event); } else { filteredEnvelopeItems.push(item); } }); // Skip sending if envelope is empty after filtering out rate limited events if (filteredEnvelopeItems.length === 0) { return utils.resolvedSyncPromise({}); } // eslint-disable-next-line @typescript-eslint/no-explicit-any const filteredEnvelope = utils.createEnvelope(envelope[0], filteredEnvelopeItems ); // Creates client report for each item in an envelope const recordEnvelopeLoss = (reason) => { utils.forEachEnvelopeItem(filteredEnvelope, (item, type) => { const event = getEventForEnvelopeItem(item, type); options.recordDroppedEvent(reason, utils.envelopeItemTypeToDataCategory(type), event); }); }; const requestTask = () => makeRequest({ body: utils.serializeEnvelope(filteredEnvelope) }).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)) { debugBuild.DEBUG_BUILD && utils.logger.warn(`Sentry responded with status code ${response.statusCode} to sent event.`); } rateLimits = utils.updateRateLimits(rateLimits, response); return response; }, error => { recordEnvelopeLoss('network_error'); throw error; }, ); return buffer.add(requestTask).then( result => result, error => { if (error instanceof utils.SentryError) { debugBuild.DEBUG_BUILD && utils.logger.error('Skipped sending event because buffer is full.'); recordEnvelopeLoss('queue_overflow'); return utils.resolvedSyncPromise({}); } else { throw error; } }, ); } return { send, flush, }; } function getEventForEnvelopeItem(item, type) { if (type !== 'event' && type !== 'transaction') { return undefined; } return Array.isArray(item) ? (item )[1] : undefined; } exports.DEFAULT_TRANSPORT_BUFFER_SIZE = DEFAULT_TRANSPORT_BUFFER_SIZE; exports.createTransport = createTransport; //# sourceMappingURL=base.js.map