mirror of
https://codeberg.org/keyoxide/doipjs.git
synced 2024-12-22 14:39:28 -07:00
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',
|
||||
/** DNS module from Node.js */
|
||||
DNS: 'dns',
|
||||
/** GraphQL over HTTP requests */
|
||||
GRAPHQL: 'graphql',
|
||||
/** Basic HTTP requests */
|
||||
HTTP: 'http',
|
||||
/** 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.dns = require('./dns')
|
||||
exports.graphql = require('./graphql')
|
||||
exports.http = require('./http')
|
||||
exports.irc = require('./irc')
|
||||
exports.matrix = require('./matrix')
|
||||
|
|
Loading…
Reference in a new issue