UNPKG

postgraphile

Version:

Automatic, high performance, and highly customizable GraphQL API for PostgreSQL

114 lines 4.13 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.watchSchema = exports.makeSchema = void 0; exports.postgraphile = postgraphile; // Copy the types through for our dependents require("graphile-build-pg"); const grafast_1 = require("grafast"); const graphile_build_1 = require("graphile-build"); Object.defineProperty(exports, "makeSchema", { enumerable: true, get: function () { return graphile_build_1.makeSchema; } }); Object.defineProperty(exports, "watchSchema", { enumerable: true, get: function () { return graphile_build_1.watchSchema; } }); const graphile_config_1 = require("graphile-config"); function postgraphile(preset) { const resolvedPreset = (0, graphile_config_1.resolvePreset)(preset); let schemaResult; let stopWatchingPromise = null; let released = false; let server; if (resolvedPreset.grafserv?.watch) { let resolve; ({ resolve, promise: schemaResult } = (0, grafast_1.promiseWithResolve)()); stopWatchingPromise = (0, graphile_build_1.watchSchema)(preset, async (error, newParams) => { if (error || !newParams) { console.error("Watch error: ", error); if (!released) { released = true; if (server) { try { await server.release(); } catch (e) { console.error(`Failed to release server: `, e); } } } return; } schemaResult = newParams; if (resolve != null) { resolve(schemaResult); resolve = null; } if (server) { await server.ready(); try { await server.setPreset(schemaResult.resolvedPreset); server.setSchema(schemaResult.schema); } catch (e) { console.error("Error occurred whilst setting preset and schema to new result:"); console.error(e); } } }); } else { schemaResult = (0, graphile_build_1.makeSchema)(preset); } function assertAlive() { if (released) { throw new Error(`PostGraphile instance has been released`); } } return { createServ(grafserv) { assertAlive(); if (server) { throw new Error(`createServ is currently only allowed to be called once; if you'd like to call it multiple times please file an issue with your use case and we can discuss implementing that.`); } const schema = (0, grafast_1.isPromiseLike)(schemaResult) ? schemaResult.then((p) => p.schema) : schemaResult.schema; const newServer = grafserv({ preset, schema, }); newServer.onRelease(() => { if (!released) { throw new Error(`Grafserv instance released before PostGraphile instance; this is forbidden.`); } }); server = newServer; return newServer; }, async getSchemaResult() { assertAlive(); return schemaResult; }, async getSchema() { assertAlive(); return (await schemaResult).schema; }, getResolvedPreset() { return resolvedPreset; }, async release() { assertAlive(); released = true; if (server) { await server.release(); } if (stopWatchingPromise) { try { const cb = await stopWatchingPromise; cb(); } catch (e) { /* nom nom nom */ } } }, }; } exports.default = postgraphile; //# sourceMappingURL=index.js.map