forked from Mirrors/doipjs
feat: Add GraphQL fetcher
This commit is contained in:
parent
166d8d5cf3
commit
7d65a21c1d
3 changed files with 83 additions and 0 deletions
|
@ -43,6 +43,8 @@ const Fetcher = {
|
||||||
ACTIVITYPUB: 'activitypub',
|
ACTIVITYPUB: 'activitypub',
|
||||||
/** DNS module from Node.js */
|
/** DNS module from Node.js */
|
||||||
DNS: 'dns',
|
DNS: 'dns',
|
||||||
|
/** GraphQL over HTTP requests */
|
||||||
|
GRAPHQL: 'graphql',
|
||||||
/** Basic HTTP requests */
|
/** Basic HTTP requests */
|
||||||
HTTP: 'http',
|
HTTP: 'http',
|
||||||
/** IRC module from Node.js */
|
/** IRC module from Node.js */
|
||||||
|
|
80
src/fetcher/graphql.js
Normal file
80
src/fetcher/graphql.js
Normal file
|
@ -0,0 +1,80 @@
|
||||||
|
/*
|
||||||
|
Copyright 2023 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 axios = require('axios')
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @module fetcher/graphql
|
||||||
|
*/
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The request's timeout value in milliseconds
|
||||||
|
* @constant {number} timeout
|
||||||
|
*/
|
||||||
|
module.exports.timeout = 5000
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Execute a GraphQL query via HTTP request
|
||||||
|
* @function
|
||||||
|
* @async
|
||||||
|
* @param {object} data - Data used in the request
|
||||||
|
* @param {string} data.url - The URL pointing at the GraphQL HTTP endpoint
|
||||||
|
* @param {string} data.query - The GraphQL query to fetch the data containing the proof
|
||||||
|
* @returns {object|string}
|
||||||
|
*/
|
||||||
|
module.exports.fn = async (data, opts) => {
|
||||||
|
let timeoutHandle
|
||||||
|
const timeoutPromise = new Promise((resolve, reject) => {
|
||||||
|
timeoutHandle = setTimeout(
|
||||||
|
() => reject(new Error('Request was timed out')),
|
||||||
|
data.fetcherTimeout ? data.fetcherTimeout : module.exports.timeout
|
||||||
|
)
|
||||||
|
})
|
||||||
|
|
||||||
|
const fetchPromise = new Promise((resolve, reject) => {
|
||||||
|
if (!data.url) {
|
||||||
|
reject(new Error('No valid URI provided'))
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
let jsonData
|
||||||
|
try {
|
||||||
|
jsonData = JSON.parse(data.query)
|
||||||
|
} catch (error) {
|
||||||
|
reject(new Error('Invalid GraphQL query object'))
|
||||||
|
}
|
||||||
|
|
||||||
|
axios.post(data.url, jsonData, {
|
||||||
|
headers: {
|
||||||
|
'Content-Type': 'application/json',
|
||||||
|
'User-Agent': `doipjs/${require('../../package.json').version}`
|
||||||
|
},
|
||||||
|
validateStatus: function (status) {
|
||||||
|
return status >= 200 && status < 400
|
||||||
|
}
|
||||||
|
})
|
||||||
|
.then(res => {
|
||||||
|
resolve(res.data)
|
||||||
|
})
|
||||||
|
.catch(e => {
|
||||||
|
reject(e)
|
||||||
|
})
|
||||||
|
})
|
||||||
|
|
||||||
|
return Promise.race([fetchPromise, timeoutPromise]).then((result) => {
|
||||||
|
clearTimeout(timeoutHandle)
|
||||||
|
return result
|
||||||
|
})
|
||||||
|
}
|
|
@ -16,6 +16,7 @@ limitations under the License.
|
||||||
|
|
||||||
exports.activitypub = require('./activitypub')
|
exports.activitypub = require('./activitypub')
|
||||||
exports.dns = require('./dns')
|
exports.dns = require('./dns')
|
||||||
|
exports.graphql = require('./graphql')
|
||||||
exports.http = require('./http')
|
exports.http = require('./http')
|
||||||
exports.irc = require('./irc')
|
exports.irc = require('./irc')
|
||||||
exports.matrix = require('./matrix')
|
exports.matrix = require('./matrix')
|
||||||
|
|
Loading…
Reference in a new issue