1 | import { makePromiseBuffer, forEachEnvelopeItem, envelopeItemTypeToDataCategory, isRateLimited, resolvedSyncPromise, createEnvelope, serializeEnvelope, logger, updateRateLimits, SentryError } from '@sentry/utils';
|
2 |
|
3 | var DEFAULT_TRANSPORT_BUFFER_SIZE = 30;
|
4 |
|
5 |
|
6 |
|
7 |
|
8 |
|
9 |
|
10 |
|
11 | function 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 |
|
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 |
|
34 | if (filteredEnvelopeItems.length === 0) {
|
35 | return resolvedSyncPromise();
|
36 | }
|
37 |
|
38 | var filteredEnvelope = createEnvelope(envelope[0], filteredEnvelopeItems );
|
39 |
|
40 |
|
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 |
|
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 |
|
83 | export { DEFAULT_TRANSPORT_BUFFER_SIZE, createTransport };
|
84 |
|