UNPKG

@sentry/core

Version:
105 lines (88 loc) 3.43 kB
Object.defineProperty(exports, '__esModule', { value: true }); const utils = require('@sentry/utils'); const 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 = {}; const flush = (timeout) => buffer.drain(timeout); function send(envelope) { const filteredEnvelopeItems = []; // Drop rate limited items from envelope utils.forEachEnvelopeItem(envelope, (item, type) => { const envelopeItemDataCategory = utils.envelopeItemTypeToDataCategory(type); if (utils.isRateLimited(rateLimits, envelopeItemDataCategory)) { const event = getEventForEnvelopeItem(item, type); options.recordDroppedEvent('ratelimit_backoff', envelopeItemDataCategory, 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, 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); return response; }, error => { recordEnvelopeLoss('network_error'); throw 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 because buffer is full.'); recordEnvelopeLoss('queue_overflow'); return utils.resolvedSyncPromise(); } else { throw error; } }, ); } // We use this to identifify if the transport is the base transport // TODO (v8): Remove this again as we'll no longer need it send.__sentry__baseTransport__ = true; 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