(events: readonly EnrichedTelemetryEvent[], signal?: AbortSignal)
| 62 | } |
| 63 | |
| 64 | async send(events: readonly EnrichedTelemetryEvent[], signal?: AbortSignal): Promise<void> { |
| 65 | if (events.length === 0) return; |
| 66 | let savedToDisk = false; |
| 67 | const saveEventsToDisk = (): void => { |
| 68 | if (savedToDisk) return; |
| 69 | this.saveToDisk(events); |
| 70 | savedToDisk = true; |
| 71 | }; |
| 72 | if (signal?.aborted === true) { |
| 73 | saveEventsToDisk(); |
| 74 | throw abortError(); |
| 75 | } |
| 76 | |
| 77 | let payload: TelemetryPayload; |
| 78 | try { |
| 79 | payload = buildPayload(events, this.deviceId); |
| 80 | } catch { |
| 81 | return; |
| 82 | } |
| 83 | |
| 84 | try { |
| 85 | for (let attempt = 0; attempt <= this.retryBackoffsMs.length; attempt++) { |
| 86 | try { |
| 87 | await this.sendHttp(payload, signal); |
| 88 | return; |
| 89 | } catch (error) { |
| 90 | if (isSignalAborted(signal) || isAbortError(error)) { |
| 91 | saveEventsToDisk(); |
| 92 | throw error; |
| 93 | } |
| 94 | if (!(error instanceof TransientTelemetryError)) { |
| 95 | break; |
| 96 | } |
| 97 | const backoff = this.retryBackoffsMs[attempt]; |
| 98 | if (backoff === undefined) break; |
| 99 | await this.sleepImpl(backoff, signal); |
| 100 | } |
| 101 | } |
| 102 | } catch (error) { |
| 103 | if (isSignalAborted(signal) || isAbortError(error)) { |
| 104 | saveEventsToDisk(); |
| 105 | throw error; |
| 106 | } |
| 107 | } |
| 108 | |
| 109 | saveEventsToDisk(); |
| 110 | } |
| 111 | |
| 112 | saveToDisk(events: readonly EnrichedTelemetryEvent[]): void { |
| 113 | if (events.length === 0) return; |
nothing calls this directly
no test coverage detected