UNPKG

2.9 kBJavaScriptView Raw
1import { makePromiseBuffer, forEachEnvelopeItem, envelopeItemTypeToDataCategory, isRateLimited, resolvedSyncPromise, createEnvelope, serializeEnvelope, logger, updateRateLimits, SentryError } from '@sentry/utils';
2
3var DEFAULT_TRANSPORT_BUFFER_SIZE = 30;
4
5/**
6 * Creates an instance of a Sentry `Transport`
7 *
8 * @param options
9 * @param makeRequest
10 */
11function createTransport(
12 options,
13 makeRequest,
14 buffer = makePromiseBuffer(options.bufferSize || DEFAULT_TRANSPORT_BUFFER_SIZE),
15) {
16 let rateLimits = {};
17
18 var flush = (timeout) => buffer.drain(timeout);
19
20 function send(envelope) {
21 var filteredEnvelopeItems = [];
22
23 // Drop rate limited items from envelope
24 forEachEnvelopeItem(envelope, (item, type) => {
25 var envelopeItemDataCategory = envelopeItemTypeToDataCategory(type);
26 if (isRateLimited(rateLimits, envelopeItemDataCategory)) {
27 options.recordDroppedEvent('ratelimit_backoff', envelopeItemDataCategory);
28 } else {
29 filteredEnvelopeItems.push(item);
30 }
31 });
32
33 // Skip sending if envelope is empty after filtering out rate limited events
34 if (filteredEnvelopeItems.length === 0) {
35 return resolvedSyncPromise();
36 }
37
38 var filteredEnvelope = createEnvelope(envelope[0], filteredEnvelopeItems );
39
40 // Creates client report for each item in an envelope
41 var recordEnvelopeLoss = (reason) => {
42 forEachEnvelopeItem(filteredEnvelope, (_, type) => {
43 options.recordDroppedEvent(reason, envelopeItemTypeToDataCategory(type));
44 });
45 };
46
47 var requestTask = () =>
48 makeRequest({ body: serializeEnvelope(filteredEnvelope, options.textEncoder) }).then(
49 response => {
50 // We don't want to throw on NOK responses, but we want to at least log them
51 if (response.statusCode !== undefined && (response.statusCode < 200 || response.statusCode >= 300)) {
52 (typeof __SENTRY_DEBUG__ === 'undefined' || __SENTRY_DEBUG__) && logger.warn(`Sentry responded with status code ${response.statusCode} to sent event.`);
53 }
54
55 rateLimits = updateRateLimits(rateLimits, response);
56 },
57 error => {
58 (typeof __SENTRY_DEBUG__ === 'undefined' || __SENTRY_DEBUG__) && logger.error('Failed while sending event:', error);
59 recordEnvelopeLoss('network_error');
60 },
61 );
62
63 return buffer.add(requestTask).then(
64 result => result,
65 error => {
66 if (error instanceof SentryError) {
67 (typeof __SENTRY_DEBUG__ === 'undefined' || __SENTRY_DEBUG__) && logger.error('Skipped sending event due to full buffer');
68 recordEnvelopeLoss('queue_overflow');
69 return resolvedSyncPromise();
70 } else {
71 throw error;
72 }
73 },
74 );
75 }
76
77 return {
78 send,
79 flush,
80 };
81}
82
83export { DEFAULT_TRANSPORT_BUFFER_SIZE, createTransport };
84//# sourceMappingURL=base.js.map