From eeae06dc1721f91be296f6e574749a8e17fdbc0d Mon Sep 17 00:00:00 2001 From: Sergey Polyakov Date: Wed, 29 Jan 2025 18:20:37 +0200 Subject: [PATCH] Expose a function for publishing an event with retries; add logging --- lib/api.js | 32 ++++++++++++++++++++++++++++++-- 1 file changed, 30 insertions(+), 2 deletions(-) diff --git a/lib/api.js b/lib/api.js index 7be15bb..27c5103 100644 --- a/lib/api.js +++ b/lib/api.js @@ -1,5 +1,6 @@ const { platformForId, isKnownPlatformId } = require('./platform'); const { config } = require('./config'); +const { delay } = require('./util'); const Particle = require('particle-api-js'); @@ -63,6 +64,22 @@ class ApiClient { return p; } + async publishEvent(name, data, { retries = 0, retryDelay = 1000 } = {}) { + for (;;) { + try { + await this.particle.apiClient.instance.publishEvent({ name, data, auth: this._token }); + } catch (err) { + if (retries <= 0) { + throw err; + } + this._log.warn(`Failed to publish event: ${err.message}\n\tRetrying in ${retryDelay}ms`); + await delay(retryDelay); + retryDelay *= 2; + --retries; + } + } + } + setTestDevices(devices) { this._deviceIds = new Set(devices.map(dev => dev.id)); this._events.clear(); @@ -110,8 +127,19 @@ class ApiClient { deviceId: 'mine', auth: this._token }); - this._stream.on('event', event => this._onEvent(event)); - this._stream.on('error', error => this._onError(error)); + this._stream.on('event', (event) => this._onEvent(event)); + this._stream.on('error', (err) => { + this._log.error(`Event stream error: ${err.message}`); + }); + this._stream.on('reconnect', (err) => { + this._log.warn('Event stream is reconnecting'); + }); + this._stream.on('reconnect-success', () => { + this._log.info('Event stream reconnected'); + }); + this._stream.on('reconnect-error', (err) => { + this._log.error(`Event stream failed to reconnect: ${err.message}`); + }); } _onEvent(event) {