'use strict'; const fetch = require('node-fetch'); const { addonDefinitionSchema } = require('./addon-schema'); class Addon { constructor(definition, { getLogger }) { this.logger = getLogger(`addon/${definition.name}`); const { error } = addonDefinitionSchema.validate(definition); if (error) { this.logger.warn( `Could not load addon provider ${definition.name}`, error, ); throw error; } this._name = definition.name; this._definition = definition; } get name() { return this._name; } get definition() { return this._definition; } async fetchRetry(url, options = {}, retries = 1, backoff = 300) { const retryCodes = [408, 500, 502, 503, 504, 522, 524]; let res; try { res = await fetch(url, options); } catch (error) { res = { status: 500, ok: false }; } if (res.ok) { return res; } if (retries > 0 && retryCodes.includes(res.status)) { setTimeout( () => this.fetchRetry(url, options, retries - 1, backoff * 2), backoff, ); } return res; } } module.exports = Addon;