gotql
Version:
A GraphQL query framework for serverside apps
131 lines • 5.83 kB
JavaScript
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
return new (P || (P = Promise))(function (resolve, reject) {
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
step((generator = generator.apply(thisArg, _arguments || [])).next());
});
};
var __importDefault = (this && this.__importDefault) || function (mod) {
return (mod && mod.__esModule) ? mod : { "default": mod };
};
Object.defineProperty(exports, "__esModule", { value: true });
exports.run = run;
const debug_1 = __importDefault(require("debug"));
const parser_1 = require("./parser");
const prepend_http_1 = __importDefault(require("prepend-http"));
const RunnerError_1 = require("../errors/RunnerError");
const util_1 = require("util");
const shout = (0, debug_1.default)('gotql:errors');
const info = (0, debug_1.default)('gotql:info:runner');
/**
* Extract the custom header object and mounts it together with the default objects
*
* @param {Object.<string, string>} headers Custom header Object
*/
function getHeaders(headers = {}) {
info('Mounting headers using "%o" as provided headers', headers);
const defaultHeaders = {
'X-Powered-By': 'GotQL - The server-side GraphQL query engine',
'User-Agent': `GotQL ${require('../../package.json').version}`,
'Accept-Encoding': 'gzip, deflate',
'Response-Type': 'application/json'
};
const returnObj = Object.assign(Object.assign({}, defaultHeaders), headers);
info('Mounted header object: %O', returnObj);
return returnObj;
}
/**
* Extract variables from the JSON-like query
*
* @param {Object.<string, { type: string, value: string }>} variables Variable object
*/
function getQueryVariables(variables) {
info('Parsing query variables');
if (!variables)
return null;
const newVars = {};
for (const varName in variables) {
info('Parsing var "%s"', varName);
newVars[varName] = variables[varName].value;
}
info('Variable object created: %O', newVars);
return newVars;
}
/**
* Creates the Got body object to be sent to the GraphQL endpoint
*
* @param {Object.<string, string>} headers Custom header list
* @param {queryType} query JSON-like query type
* @param {string} parsedQuery String-parsed query
*/
function getPayload(headers, options, query, parsedQuery) {
info('Generating final payload');
const returnObject = {
headers: getHeaders(headers),
json: {
query: parsedQuery,
operationName: query.name || null,
variables: getQueryVariables(query.variables) || null
},
http2: options.useHttp2 || false
};
info('Payload to be sent: %O', returnObject);
return returnObject;
}
/**
* Handles Got response object
*
* Treats GraphQL errors and messages
* @param {object} response Got response
* @param {UserOptions} options User options
*/
function handleResponse(response, options) {
info('Response obtained: %O', { errors: response.body.errors, body: response.body, statusCode: response.statusCode });
if (response.body.errors) {
shout('Error on query: %O', response.body.errors);
response.statusCode = options && options.errorStatusCode ? options.errorStatusCode : 500;
response.statusMessage = 'GraphQL Error';
}
const handledResponse = Object.assign(Object.assign({}, JSON.parse(response.body)), { endpoint: response.requestUrl, statusCode: response.statusCode, message: response.statusMessage });
info('Final response: %O', handledResponse);
return handledResponse;
}
/**
*
* @param {string} endPoint GraphQL endpoint to query on
* @param {queryType} query A JSON-like query type
* @param {userOpts} [options] User options
* @param {string} type Can be 'query' or 'mutation'
* @param {any} got The Got object as an injected dependency (for test modularity)
* @return {{data: object, statusCode: number, message: string}} Got handled response
*/
function run(endPoint_1, query_1, type_1, got_1) {
return __awaiter(this, arguments, void 0, function* (endPoint, query, type, got, options = { useHttp2: false }) {
try {
info('Invoking runner with query type %s', type);
if (!['query', 'mutation'].includes(type))
throw new Error('Query type must be either `query` or `mutation`');
info('Parsing query: %O', query);
const graphQuery = (0, parser_1.parse)(query, type); // Parses JSON into GraphQL Query
info('Parsed query: %s', graphQuery);
info('Building payload object');
const headers = options ? options.headers : {};
const gotPayload = getPayload(headers, options, query, graphQuery);
info('Payload object: %O', gotPayload.json);
info('Sending request...');
const response = yield got.post((0, prepend_http_1.default)(endPoint), gotPayload);
info('Response: %O', response.body.toString());
return handleResponse(response, options);
}
catch (error) {
shout('Error on runner: %O', error);
if (error instanceof Error)
throw new RunnerError_1.RunnerError(`Error when executing query: ${error.message}`);
throw new RunnerError_1.RunnerError(`Unknown Error: ${(0, util_1.inspect)(error)}`);
}
});
}
//# sourceMappingURL=runner.js.map
;