postgraphile
Version:
Automatic, high performance, and highly customizable GraphQL API for PostgreSQL
114 lines • 4.13 kB
JavaScript
;
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