UNPKG

ggbgg

Version:

package to collect data from boardgamegeek

84 lines (77 loc) 2.37 kB
const axios = require('axios'); // very long timeouts for some chained promises and collection fetches // the ggdungeon was working incorrectly in case this was set below 10s const WAITING_PERIOD = 20000; const BGGAPI = { results: {}, requestData(type, options) { // var params = self.hash_to_uri(options) // create proper path from the options object const path = `/${type}`; // NEED VALIDATIONS const params = options; return this.createPromise(path, params) .then((response) => { this.results = response.data; return (response); }) .catch((e) => { console.log('failed', e); }); }, createPromise(path, params) { return bggAxios.get(path, { responseType: 'text', timeout: WAITING_PERIOD, params, headers: { retry: 3, retryDelay: 5000, __retryCount: 0, }, }); }, wait(time) { console.log(`waiting ${time} for bgg to respon`); return new Promise(((resolve) => { setTimeout(() => { console.log('Inquiring again'); resolve(); }, time); })); }, }; const bggAxios = axios.create({ baseURL: 'https://boardgamegeek.com/xmlapi2', }); // taken from https://github.com/axios/axios/issues/164#issuecomment-327837467 // doesn't work because it doesn't know the config - needs to pass data in headers bggResponseHandler = (response) => { const { config } = response; const { retry } = config.headers; if (response.status === 200) { // console.log(response); return response; } // If config does not exist or the retry option is not set, reject if (!retry) { return Promise.reject(); } // Check if we've maxed out the total number of retries if (config.headers.__retryCount >= retry) { // Reject with the error return Promise.reject('Number of retries too large'); } // Increase the retry count config.headers.__retryCount += 1; // Create new promise to handle exponential backoff const backoff = new Promise(((resolve) => { setTimeout(() => { resolve(); }, config.headers.retryDelay || 1); })); // Return the promise in which recalls axios to retry the request return backoff.then(() => bggAxios(config)); }; bggAxios.interceptors.response.use(response => bggResponseHandler(response), undefined); module.exports = BGGAPI;