ggbgg
Version:
package to collect data from boardgamegeek
84 lines (77 loc) • 2.37 kB
JavaScript
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;