UNPKG

gotql

Version:

A GraphQL query framework for serverside apps

131 lines 5.83 kB
"use strict"; 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