diff --git a/src/fetcher/http.js b/src/fetcher/http.js new file mode 100644 index 0000000..eef874d --- /dev/null +++ b/src/fetcher/http.js @@ -0,0 +1,72 @@ +/* +Copyright 2021 Yarmo Mackenbach + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + +http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ +const bent = require('bent') +const req = bent('GET') + +module.exports = async (url, format) => { + let timeoutHandle + const timeoutPromise = new Promise((resolve, reject) => { + timeoutHandle = setTimeout( + () => reject(new Error('Request was timed out')), + 5000 + ) + }) + + const fetchPromise = new Promise((resolve, reject) => { + if (!url) { + reject('No valid URI provided') + return + } + + switch (format) { + case 'json': + req(url, null, { + Accept: 'application/json', + 'User-Agent': `doipjs/${require('../package.json').version}`, + }) + .then(async (res) => { + return await res.json() + }) + .then((res) => { + resolve(res) + }) + .catch((e) => { + reject(e) + }) + break + case 'text': + req(url) + .then(async (res) => { + return await res.text() + }) + .then((res) => { + resolve(res) + }) + .catch((e) => { + reject(e) + }) + break + default: + reject('No specified data format') + break + } + }) + + return Promise.race([fetchPromise, timeoutPromise]).then((result) => { + clearTimeout(timeoutHandle) + return result + }) +} diff --git a/src/fetcher/index.js b/src/fetcher/index.js index cb49a95..b613cef 100644 --- a/src/fetcher/index.js +++ b/src/fetcher/index.js @@ -14,6 +14,7 @@ See the License for the specific language governing permissions and limitations under the License. */ exports.dns = require('./dns') +exports.http = require('./http') exports.irc = require('./irc') exports.matrix = require('./matrix') exports.twitter = require('./twitter')