postgraphile 4.12.11 → 5.0.0-0.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +46 -0
- package/LICENSE.md +15 -20
- package/README.md +20 -171
- package/dist/cli-run.d.ts +3 -0
- package/dist/cli-run.d.ts.map +1 -0
- package/dist/cli-run.js +7 -0
- package/dist/cli-run.js.map +1 -0
- package/dist/cli.d.ts +21 -0
- package/dist/cli.d.ts.map +1 -0
- package/dist/cli.js +180 -0
- package/dist/cli.js.map +1 -0
- package/dist/index.d.ts +14 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +88 -0
- package/dist/index.js.map +1 -0
- package/dist/plugins/PgV4BehaviorPlugin.d.ts +11 -0
- package/dist/plugins/PgV4BehaviorPlugin.d.ts.map +1 -0
- package/dist/plugins/PgV4BehaviorPlugin.js +73 -0
- package/dist/plugins/PgV4BehaviorPlugin.js.map +1 -0
- package/dist/plugins/PgV4InflectionPlugin.d.ts +11 -0
- package/dist/plugins/PgV4InflectionPlugin.d.ts.map +1 -0
- package/dist/plugins/PgV4InflectionPlugin.js +91 -0
- package/dist/plugins/PgV4InflectionPlugin.js.map +1 -0
- package/dist/plugins/PgV4NoIgnoreIndexes.d.ts +2 -0
- package/dist/plugins/PgV4NoIgnoreIndexes.d.ts.map +1 -0
- package/dist/plugins/PgV4NoIgnoreIndexes.js +72 -0
- package/dist/plugins/PgV4NoIgnoreIndexes.js.map +1 -0
- package/dist/plugins/PgV4SmartTagsPlugin.d.ts +11 -0
- package/dist/plugins/PgV4SmartTagsPlugin.d.ts.map +1 -0
- package/dist/plugins/PgV4SmartTagsPlugin.js +190 -0
- package/dist/plugins/PgV4SmartTagsPlugin.js.map +1 -0
- package/dist/presets/amber.d.ts +5 -0
- package/dist/presets/amber.d.ts.map +1 -0
- package/dist/presets/amber.js +38 -0
- package/dist/presets/amber.js.map +1 -0
- package/dist/presets/v4.d.ts +34 -0
- package/dist/presets/v4.d.ts.map +1 -0
- package/dist/presets/v4.js +142 -0
- package/dist/presets/v4.js.map +1 -0
- package/dist/schema.d.ts +34 -0
- package/dist/schema.d.ts.map +1 -0
- package/dist/schema.js +82 -0
- package/dist/schema.js.map +1 -0
- package/package.json +77 -154
- package/build/assets/favicon.ico.d.ts +0 -3
- package/build/assets/favicon.ico.js +0 -6
- package/build/assets/graphiql.html.d.ts +0 -2
- package/build/assets/graphiql.html.js +0 -6
- package/build/index.d.ts +0 -8
- package/build/index.js +0 -34
- package/build/interfaces.d.ts +0 -162
- package/build/interfaces.js +0 -3
- package/build/plugins.d.ts +0 -3
- package/build/plugins.js +0 -53
- package/build/postgraphile/cli.d.ts +0 -3
- package/build/postgraphile/cli.js +0 -541
- package/build/postgraphile/extendedFormatError.d.ts +0 -9
- package/build/postgraphile/extendedFormatError.js +0 -51
- package/build/postgraphile/http/createPostGraphileHttpRequestHandler.d.ts +0 -11
- package/build/postgraphile/http/createPostGraphileHttpRequestHandler.js +0 -974
- package/build/postgraphile/http/frameworks.d.ts +0 -110
- package/build/postgraphile/http/frameworks.js +0 -258
- package/build/postgraphile/http/liveSubscribe.d.ts +0 -22
- package/build/postgraphile/http/liveSubscribe.js +0 -89
- package/build/postgraphile/http/mapAsyncIterator.d.ts +0 -15
- package/build/postgraphile/http/mapAsyncIterator.js +0 -71
- package/build/postgraphile/http/setupServerSentEvents.d.ts +0 -9
- package/build/postgraphile/http/setupServerSentEvents.js +0 -51
- package/build/postgraphile/http/subscriptions.d.ts +0 -7
- package/build/postgraphile/http/subscriptions.js +0 -410
- package/build/postgraphile/index.d.ts +0 -5
- package/build/postgraphile/index.js +0 -14
- package/build/postgraphile/pluginHook.d.ts +0 -104
- package/build/postgraphile/pluginHook.js +0 -100
- package/build/postgraphile/postgraphile.d.ts +0 -20
- package/build/postgraphile/postgraphile.js +0 -332
- package/build/postgraphile/postgraphilerc.d.ts +0 -2
- package/build/postgraphile/postgraphilerc.js +0 -16
- package/build/postgraphile/schema/exportPostGraphileSchema.d.ts +0 -6
- package/build/postgraphile/schema/exportPostGraphileSchema.js +0 -45
- package/build/postgraphile/shutdownActions.d.ts +0 -41
- package/build/postgraphile/shutdownActions.js +0 -87
- package/build/postgraphile/withPostGraphileContext.d.ts +0 -55
- package/build/postgraphile/withPostGraphileContext.js +0 -457
- package/build/postgres/inventory/pgClientFromContext.d.ts +0 -8
- package/build/postgres/inventory/pgClientFromContext.js +0 -21
- package/build-turbo/assets/favicon.ico.d.ts +0 -3
- package/build-turbo/assets/favicon.ico.js +0 -6
- package/build-turbo/assets/graphiql.html.d.ts +0 -2
- package/build-turbo/assets/graphiql.html.js +0 -6
- package/build-turbo/index.d.ts +0 -8
- package/build-turbo/index.js +0 -34
- package/build-turbo/interfaces.d.ts +0 -162
- package/build-turbo/interfaces.js +0 -3
- package/build-turbo/plugins.d.ts +0 -3
- package/build-turbo/plugins.js +0 -53
- package/build-turbo/postgraphile/cli.d.ts +0 -3
- package/build-turbo/postgraphile/cli.js +0 -572
- package/build-turbo/postgraphile/extendedFormatError.d.ts +0 -9
- package/build-turbo/postgraphile/extendedFormatError.js +0 -61
- package/build-turbo/postgraphile/http/createPostGraphileHttpRequestHandler.d.ts +0 -11
- package/build-turbo/postgraphile/http/createPostGraphileHttpRequestHandler.js +0 -982
- package/build-turbo/postgraphile/http/frameworks.d.ts +0 -110
- package/build-turbo/postgraphile/http/frameworks.js +0 -258
- package/build-turbo/postgraphile/http/liveSubscribe.d.ts +0 -22
- package/build-turbo/postgraphile/http/liveSubscribe.js +0 -89
- package/build-turbo/postgraphile/http/mapAsyncIterator.d.ts +0 -15
- package/build-turbo/postgraphile/http/mapAsyncIterator.js +0 -71
- package/build-turbo/postgraphile/http/setupServerSentEvents.d.ts +0 -9
- package/build-turbo/postgraphile/http/setupServerSentEvents.js +0 -51
- package/build-turbo/postgraphile/http/subscriptions.d.ts +0 -7
- package/build-turbo/postgraphile/http/subscriptions.js +0 -409
- package/build-turbo/postgraphile/index.d.ts +0 -5
- package/build-turbo/postgraphile/index.js +0 -14
- package/build-turbo/postgraphile/pluginHook.d.ts +0 -104
- package/build-turbo/postgraphile/pluginHook.js +0 -100
- package/build-turbo/postgraphile/postgraphile.d.ts +0 -20
- package/build-turbo/postgraphile/postgraphile.js +0 -337
- package/build-turbo/postgraphile/postgraphilerc.d.ts +0 -2
- package/build-turbo/postgraphile/postgraphilerc.js +0 -16
- package/build-turbo/postgraphile/schema/exportPostGraphileSchema.d.ts +0 -6
- package/build-turbo/postgraphile/schema/exportPostGraphileSchema.js +0 -45
- package/build-turbo/postgraphile/shutdownActions.d.ts +0 -41
- package/build-turbo/postgraphile/shutdownActions.js +0 -87
- package/build-turbo/postgraphile/withPostGraphileContext.d.ts +0 -55
- package/build-turbo/postgraphile/withPostGraphileContext.js +0 -466
- package/build-turbo/postgres/inventory/pgClientFromContext.d.ts +0 -8
- package/build-turbo/postgres/inventory/pgClientFromContext.js +0 -21
- package/cli.js +0 -6
- package/index.js +0 -5
- package/isTurbo.js +0 -11
- package/plugins.d.ts +0 -1
- package/plugins.js +0 -5
- package/sponsors.json +0 -150
|
@@ -1,100 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.pluginHookFromOptions = exports.makePluginHook = void 0;
|
|
4
|
-
// @ts-ignore Allow importing JSON
|
|
5
|
-
const package_json_1 = require("../../package.json");
|
|
6
|
-
const graphql = require("graphql");
|
|
7
|
-
const identityHook = (input) => input;
|
|
8
|
-
const identityPluginHook = (_hookName, input, _options) => input;
|
|
9
|
-
function contextIsSame(context1, context2) {
|
|
10
|
-
// Shortcut if obvious
|
|
11
|
-
if (context1 === context2) {
|
|
12
|
-
return true;
|
|
13
|
-
}
|
|
14
|
-
// Blacklist approach from now on
|
|
15
|
-
const keys1 = Object.keys(context1);
|
|
16
|
-
const keys2 = Object.keys(context2);
|
|
17
|
-
if (keys1.length !== keys2.length) {
|
|
18
|
-
return false;
|
|
19
|
-
}
|
|
20
|
-
// tslint:disable-next-line one-variable-per-declaration
|
|
21
|
-
for (let i = 0, l = keys1.length; i < l; i++) {
|
|
22
|
-
const key = keys1[i];
|
|
23
|
-
if (context1[key] !== context2[key]) {
|
|
24
|
-
return false;
|
|
25
|
-
}
|
|
26
|
-
if (!keys2.includes(key)) {
|
|
27
|
-
return false;
|
|
28
|
-
}
|
|
29
|
-
}
|
|
30
|
-
return true;
|
|
31
|
-
}
|
|
32
|
-
// Caches the last value of the hook, in case it's called with exactly the same
|
|
33
|
-
// arguments again.
|
|
34
|
-
function memoizeHook(hook) {
|
|
35
|
-
let lastCall = null;
|
|
36
|
-
return (argument, context) => {
|
|
37
|
-
if (lastCall && lastCall.argument === argument && contextIsSame(lastCall.context, context)) {
|
|
38
|
-
return lastCall.result;
|
|
39
|
-
}
|
|
40
|
-
else {
|
|
41
|
-
const result = hook(argument, context);
|
|
42
|
-
lastCall = {
|
|
43
|
-
argument,
|
|
44
|
-
context,
|
|
45
|
-
result,
|
|
46
|
-
};
|
|
47
|
-
return result;
|
|
48
|
-
}
|
|
49
|
-
};
|
|
50
|
-
}
|
|
51
|
-
function shouldMemoizeHook(hookName) {
|
|
52
|
-
return hookName === 'withPostGraphileContext';
|
|
53
|
-
}
|
|
54
|
-
function makeHook(plugins, hookName) {
|
|
55
|
-
const combinedHook = plugins.reduce((previousHook, plugin) => {
|
|
56
|
-
if (typeof plugin[hookName] === 'function') {
|
|
57
|
-
return (argument, context) => {
|
|
58
|
-
return plugin[hookName](previousHook(argument, context), context);
|
|
59
|
-
};
|
|
60
|
-
}
|
|
61
|
-
else {
|
|
62
|
-
return previousHook;
|
|
63
|
-
}
|
|
64
|
-
}, identityHook);
|
|
65
|
-
if (combinedHook === identityHook) {
|
|
66
|
-
return identityHook;
|
|
67
|
-
}
|
|
68
|
-
else if (shouldMemoizeHook(hookName)) {
|
|
69
|
-
return memoizeHook(combinedHook);
|
|
70
|
-
}
|
|
71
|
-
else {
|
|
72
|
-
return combinedHook;
|
|
73
|
-
}
|
|
74
|
-
}
|
|
75
|
-
function makePluginHook(plugins) {
|
|
76
|
-
const hooks = {};
|
|
77
|
-
const emptyObject = {}; // caching this makes memoization faster when no context is needed
|
|
78
|
-
function rawPluginHook(hookName, argument, context = emptyObject) {
|
|
79
|
-
if (!hooks[hookName]) {
|
|
80
|
-
hooks[hookName] = makeHook(plugins, hookName);
|
|
81
|
-
}
|
|
82
|
-
return hooks[hookName](argument, context);
|
|
83
|
-
}
|
|
84
|
-
const pluginHook = rawPluginHook('pluginHook', rawPluginHook, {});
|
|
85
|
-
// Use this hook to check your hook is compatible with this version of
|
|
86
|
-
// PostGraphile, also to get a reference to shared graphql instance.
|
|
87
|
-
pluginHook('init', null, { version: package_json_1.version, graphql });
|
|
88
|
-
return pluginHook;
|
|
89
|
-
}
|
|
90
|
-
exports.makePluginHook = makePluginHook;
|
|
91
|
-
function pluginHookFromOptions(options) {
|
|
92
|
-
if (typeof options.pluginHook === 'function') {
|
|
93
|
-
return options.pluginHook;
|
|
94
|
-
}
|
|
95
|
-
else {
|
|
96
|
-
return identityPluginHook;
|
|
97
|
-
}
|
|
98
|
-
}
|
|
99
|
-
exports.pluginHookFromOptions = pluginHookFromOptions;
|
|
100
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGx1Z2luSG9vay5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9wb3N0Z3JhcGhpbGUvcGx1Z2luSG9vay50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFRQSxrQ0FBa0M7QUFDbEMscURBQTZDO0FBQzdDLG1DQUFtQztBQTJIbkMsTUFBTSxZQUFZLEdBQUcsQ0FBSSxLQUFRLEVBQUssRUFBRSxDQUFDLEtBQUssQ0FBQztBQUMvQyxNQUFNLGtCQUFrQixHQUFpQixDQUFDLFNBQVMsRUFBRSxLQUFLLEVBQUUsUUFBUSxFQUFFLEVBQUUsQ0FBQyxLQUFLLENBQUM7QUFFL0UsU0FBUyxhQUFhLENBQUMsUUFBNkIsRUFBRSxRQUE2QjtJQUNqRixzQkFBc0I7SUFDdEIsSUFBSSxRQUFRLEtBQUssUUFBUSxFQUFFO1FBQ3pCLE9BQU8sSUFBSSxDQUFDO0tBQ2I7SUFDRCxpQ0FBaUM7SUFDakMsTUFBTSxLQUFLLEdBQUcsTUFBTSxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQztJQUNwQyxNQUFNLEtBQUssR0FBRyxNQUFNLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDO0lBQ3BDLElBQUksS0FBSyxDQUFDLE1BQU0sS0FBSyxLQUFLLENBQUMsTUFBTSxFQUFFO1FBQ2pDLE9BQU8sS0FBSyxDQUFDO0tBQ2Q7SUFDRCx3REFBd0Q7SUFDeEQsS0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLEtBQUssQ0FBQyxNQUFNLEVBQUUsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEVBQUUsRUFBRTtRQUM1QyxNQUFNLEdBQUcsR0FBRyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDckIsSUFBSSxRQUFRLENBQUMsR0FBRyxDQUFDLEtBQUssUUFBUSxDQUFDLEdBQUcsQ0FBQyxFQUFFO1lBQ25DLE9BQU8sS0FBSyxDQUFDO1NBQ2Q7UUFDRCxJQUFJLENBQUMsS0FBSyxDQUFDLFFBQVEsQ0FBQyxHQUFHLENB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
|
|
@@ -1,20 +0,0 @@
|
|
|
1
|
-
/// <reference types="node" />
|
|
2
|
-
import { Pool, PoolConfig } from 'pg';
|
|
3
|
-
import { IncomingMessage, ServerResponse } from 'http';
|
|
4
|
-
import { GraphQLSchema } from 'graphql';
|
|
5
|
-
import { EventEmitter } from 'events';
|
|
6
|
-
import { PostGraphileOptions, HttpRequestHandler } from '../interfaces';
|
|
7
|
-
import { ShutdownActions } from './shutdownActions';
|
|
8
|
-
export interface PostgraphileSchemaBuilder<Request extends IncomingMessage = IncomingMessage, Response extends ServerResponse = ServerResponse> {
|
|
9
|
-
_emitter: EventEmitter;
|
|
10
|
-
getGraphQLSchema: () => Promise<GraphQLSchema>;
|
|
11
|
-
options: PostGraphileOptions<Request, Response>;
|
|
12
|
-
}
|
|
13
|
-
/**
|
|
14
|
-
* Creates a PostGraphile Http request handler by first introspecting the
|
|
15
|
-
* database to get a GraphQL schema, and then using that to create the Http
|
|
16
|
-
* request handler.
|
|
17
|
-
*/
|
|
18
|
-
export declare function getPostgraphileSchemaBuilder<Request extends IncomingMessage = IncomingMessage, Response extends ServerResponse = ServerResponse>(pgPool: Pool, schema: string | Array<string>, incomingOptions: PostGraphileOptions<Request, Response>, shutdownActions?: ShutdownActions): PostgraphileSchemaBuilder;
|
|
19
|
-
export default function postgraphile<Request extends IncomingMessage = IncomingMessage, Response extends ServerResponse = ServerResponse>(poolOrConfig?: Pool | PoolConfig | string, schema?: string | Array<string>, options?: PostGraphileOptions<Request, Response>): HttpRequestHandler;
|
|
20
|
-
export default function postgraphile<Request extends IncomingMessage = IncomingMessage, Response extends ServerResponse = ServerResponse>(poolOrConfig?: Pool | PoolConfig | string, options?: PostGraphileOptions<Request, Response>): HttpRequestHandler;
|
|
@@ -1,332 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.getPostgraphileSchemaBuilder = void 0;
|
|
4
|
-
const pg_1 = require("pg");
|
|
5
|
-
const graphql_1 = require("graphql");
|
|
6
|
-
const events_1 = require("events");
|
|
7
|
-
const postgraphile_core_1 = require("postgraphile-core");
|
|
8
|
-
const createPostGraphileHttpRequestHandler_1 = require("./http/createPostGraphileHttpRequestHandler");
|
|
9
|
-
const exportPostGraphileSchema_1 = require("./schema/exportPostGraphileSchema");
|
|
10
|
-
const pluginHook_1 = require("./pluginHook");
|
|
11
|
-
const chalk_1 = require("chalk");
|
|
12
|
-
const withPostGraphileContext_1 = require("./withPostGraphileContext");
|
|
13
|
-
const shutdownActions_1 = require("./shutdownActions");
|
|
14
|
-
const sleep = (ms) => new Promise(resolve => setTimeout(resolve, ms));
|
|
15
|
-
// tslint:disable-next-line no-any
|
|
16
|
-
function isPlainObject(obj) {
|
|
17
|
-
if (!obj || typeof obj !== 'object' || String(obj) !== '[object Object]')
|
|
18
|
-
return false;
|
|
19
|
-
const proto = Object.getPrototypeOf(obj);
|
|
20
|
-
if (proto === null || proto === Object.prototype) {
|
|
21
|
-
return true;
|
|
22
|
-
}
|
|
23
|
-
return false;
|
|
24
|
-
}
|
|
25
|
-
/**
|
|
26
|
-
* Creates a PostGraphile Http request handler by first introspecting the
|
|
27
|
-
* database to get a GraphQL schema, and then using that to create the Http
|
|
28
|
-
* request handler.
|
|
29
|
-
*/
|
|
30
|
-
function getPostgraphileSchemaBuilder(pgPool, schema, incomingOptions, shutdownActions = new shutdownActions_1.ShutdownActions()) {
|
|
31
|
-
if (incomingOptions.live && incomingOptions.subscriptions == null) {
|
|
32
|
-
// live implies subscriptions
|
|
33
|
-
incomingOptions.subscriptions = true;
|
|
34
|
-
}
|
|
35
|
-
const pluginHook = pluginHook_1.pluginHookFromOptions(incomingOptions);
|
|
36
|
-
const options = pluginHook('postgraphile:options', incomingOptions, {
|
|
37
|
-
pgPool,
|
|
38
|
-
schema,
|
|
39
|
-
});
|
|
40
|
-
// Check for a jwtSecret without a jwtPgTypeIdentifier
|
|
41
|
-
// a secret without a token identifier prevents JWT creation
|
|
42
|
-
if (options.jwtSecret && !options.jwtPgTypeIdentifier) {
|
|
43
|
-
// tslint:disable-next-line no-console
|
|
44
|
-
console.warn('WARNING: jwtSecret provided, however jwtPgTypeIdentifier (token identifier) not provided.');
|
|
45
|
-
}
|
|
46
|
-
if (options.handleErrors && (options.extendedErrors || options.showErrorStack)) {
|
|
47
|
-
throw new Error(`You cannot combine 'handleErrors' with the other error options`);
|
|
48
|
-
}
|
|
49
|
-
// Creates the Postgres schemas array.
|
|
50
|
-
const pgSchemas = Array.isArray(schema) ? schema : [schema];
|
|
51
|
-
const _emitter = options['_emitter'] || new events_1.EventEmitter();
|
|
52
|
-
// Creates a promise which will resolve to a GraphQL schema. Connects a
|
|
53
|
-
// client from our pool to introspect the database.
|
|
54
|
-
//
|
|
55
|
-
// This is not a constant because when we are in watch mode, we want to swap
|
|
56
|
-
// out the `gqlSchema`.
|
|
57
|
-
let gqlSchema;
|
|
58
|
-
const gqlSchemaPromise = createGqlSchema();
|
|
59
|
-
return {
|
|
60
|
-
_emitter,
|
|
61
|
-
getGraphQLSchema: () => (gqlSchema ? Promise.resolve(gqlSchema) : gqlSchemaPromise),
|
|
62
|
-
options,
|
|
63
|
-
};
|
|
64
|
-
async function createGqlSchema() {
|
|
65
|
-
let attempts = 0;
|
|
66
|
-
let isShuttingDown = false;
|
|
67
|
-
shutdownActions.add(async () => {
|
|
68
|
-
isShuttingDown = true;
|
|
69
|
-
});
|
|
70
|
-
/*
|
|
71
|
-
* This function should be called after every `await` in the try{} block
|
|
72
|
-
* below so that if a shutdown occurs whilst we're awaiting something else
|
|
73
|
-
* we immediately clean up.
|
|
74
|
-
*/
|
|
75
|
-
const assertAlive = () => {
|
|
76
|
-
if (isShuttingDown) {
|
|
77
|
-
throw Object.assign(new Error('PostGraphile is shutting down'), { isShutdownAction: true });
|
|
78
|
-
}
|
|
79
|
-
};
|
|
80
|
-
// If we're in watch mode, cancel watch mode on shutdown
|
|
81
|
-
let releaseWatchFnPromise = null;
|
|
82
|
-
shutdownActions.add(async () => {
|
|
83
|
-
if (releaseWatchFnPromise) {
|
|
84
|
-
try {
|
|
85
|
-
const releaseWatchFn = await releaseWatchFnPromise;
|
|
86
|
-
await releaseWatchFn();
|
|
87
|
-
}
|
|
88
|
-
catch (e) {
|
|
89
|
-
// Ignore errors during shutdown.
|
|
90
|
-
}
|
|
91
|
-
}
|
|
92
|
-
});
|
|
93
|
-
// If the server shuts down, make sure the schema has resolved or
|
|
94
|
-
// rejected before signaling shutdown is complete. If it rejected,
|
|
95
|
-
// don't propagate the error.
|
|
96
|
-
let gqlSchemaPromise = null;
|
|
97
|
-
shutdownActions.add(async () => {
|
|
98
|
-
if (gqlSchemaPromise) {
|
|
99
|
-
await gqlSchemaPromise.catch(() => null);
|
|
100
|
-
}
|
|
101
|
-
});
|
|
102
|
-
// eslint-disable-next-line no-constant-condition
|
|
103
|
-
while (true) {
|
|
104
|
-
assertAlive();
|
|
105
|
-
try {
|
|
106
|
-
if (options.watchPg) {
|
|
107
|
-
// We must register the value used by the shutdown action immediately to avoid a race condition.
|
|
108
|
-
releaseWatchFnPromise = postgraphile_core_1.watchPostGraphileSchema(pgPool, pgSchemas, options, newSchema => {
|
|
109
|
-
gqlSchema = newSchema;
|
|
110
|
-
_emitter.emit('schemas:changed');
|
|
111
|
-
exportGqlSchema(gqlSchema);
|
|
112
|
-
});
|
|
113
|
-
// Wait for the watch to be set up before progressing.
|
|
114
|
-
await releaseWatchFnPromise;
|
|
115
|
-
assertAlive();
|
|
116
|
-
if (!gqlSchema) {
|
|
117
|
-
throw new Error("Consistency error: watchPostGraphileSchema promises to call the callback before the promise resolves; but this hasn't happened");
|
|
118
|
-
}
|
|
119
|
-
}
|
|
120
|
-
else {
|
|
121
|
-
// We must register the value used by the shutdown action immediately to avoid a race condition.
|
|
122
|
-
gqlSchemaPromise = postgraphile_core_1.createPostGraphileSchema(pgPool, pgSchemas, options);
|
|
123
|
-
gqlSchema = await gqlSchemaPromise;
|
|
124
|
-
assertAlive();
|
|
125
|
-
exportGqlSchema(gqlSchema);
|
|
126
|
-
}
|
|
127
|
-
if (attempts > 0) {
|
|
128
|
-
// tslint:disable-next-line no-console
|
|
129
|
-
console.error(`Schema ${attempts > 15 ? 'eventually' : attempts > 5 ? 'finally' : 'now'} generated successfully`);
|
|
130
|
-
}
|
|
131
|
-
return gqlSchema;
|
|
132
|
-
}
|
|
133
|
-
catch (error) {
|
|
134
|
-
releaseWatchFnPromise = null;
|
|
135
|
-
gqlSchemaPromise = null;
|
|
136
|
-
attempts++;
|
|
137
|
-
const delay = Math.min(100 * Math.pow(attempts, 2), 30000);
|
|
138
|
-
if (error.isShutdownAction) {
|
|
139
|
-
throw error;
|
|
140
|
-
}
|
|
141
|
-
else if (isShuttingDown) {
|
|
142
|
-
console.error('An error occurred whilst building the schema. However, the server was shutting down, which might have caused it.');
|
|
143
|
-
console.error(error);
|
|
144
|
-
throw error;
|
|
145
|
-
}
|
|
146
|
-
else if (typeof options.retryOnInitFail === 'function') {
|
|
147
|
-
try {
|
|
148
|
-
const start = process.hrtime();
|
|
149
|
-
const retry = await options.retryOnInitFail(error, attempts);
|
|
150
|
-
const diff = process.hrtime(start);
|
|
151
|
-
const dur = diff[0] * 1e3 + diff[1] * 1e-6;
|
|
152
|
-
if (isShuttingDown) {
|
|
153
|
-
throw error;
|
|
154
|
-
}
|
|
155
|
-
else if (!retry) {
|
|
156
|
-
// Trigger a shutdown, and swallow any new errors so old error is still thrown
|
|
157
|
-
await shutdownActions.invokeAll().catch(e => {
|
|
158
|
-
console.error('An additional error occured whilst calling shutdownActions.invokeAll():');
|
|
159
|
-
console.error(e);
|
|
160
|
-
});
|
|
161
|
-
throw error;
|
|
162
|
-
}
|
|
163
|
-
else {
|
|
164
|
-
if (dur < 50) {
|
|
165
|
-
// retryOnInitFail didn't wait long enough; use default wait.
|
|
166
|
-
console.error(`Your retryOnInitFail function should include a delay before resolving; falling back to a ${delay}ms wait (attempts = ${attempts}) to avoid overwhelming the database.`);
|
|
167
|
-
await sleep(delay);
|
|
168
|
-
}
|
|
169
|
-
}
|
|
170
|
-
}
|
|
171
|
-
catch (e) {
|
|
172
|
-
throw Object.defineProperties(new graphql_1.GraphQLError('Failed to initialize GraphQL schema.', undefined, undefined, undefined, undefined, e), {
|
|
173
|
-
status: {
|
|
174
|
-
value: 503,
|
|
175
|
-
enumerable: false,
|
|
176
|
-
},
|
|
177
|
-
});
|
|
178
|
-
}
|
|
179
|
-
}
|
|
180
|
-
else {
|
|
181
|
-
const exitOnFail = !options.retryOnInitFail;
|
|
182
|
-
// If we fail to build our schema, log the error and either exit or retry shortly
|
|
183
|
-
logSeriousError(error, 'building the initial schema' + (attempts > 1 ? ` (attempt ${attempts})` : ''), exitOnFail
|
|
184
|
-
? 'Exiting because `retryOnInitFail` is not set.'
|
|
185
|
-
: `We'll try again in ${delay}ms.`);
|
|
186
|
-
if (exitOnFail) {
|
|
187
|
-
process.exit(34);
|
|
188
|
-
}
|
|
189
|
-
// Retry shortly
|
|
190
|
-
await sleep(delay);
|
|
191
|
-
}
|
|
192
|
-
}
|
|
193
|
-
}
|
|
194
|
-
}
|
|
195
|
-
async function exportGqlSchema(newGqlSchema) {
|
|
196
|
-
try {
|
|
197
|
-
await exportPostGraphileSchema_1.default(newGqlSchema, options);
|
|
198
|
-
}
|
|
199
|
-
catch (error) {
|
|
200
|
-
// If we exit cleanly; let calling scripts know there was a problem.
|
|
201
|
-
process.exitCode = 35;
|
|
202
|
-
// If we fail to export our schema, log the error.
|
|
203
|
-
logSeriousError(error, 'exporting the schema');
|
|
204
|
-
}
|
|
205
|
-
}
|
|
206
|
-
}
|
|
207
|
-
exports.getPostgraphileSchemaBuilder = getPostgraphileSchemaBuilder;
|
|
208
|
-
function postgraphile(poolOrConfig, schemaOrOptions, maybeOptions) {
|
|
209
|
-
let schema;
|
|
210
|
-
// These are the raw options we're passed in; getPostgraphileSchemaBuilder
|
|
211
|
-
// must process them with `pluginHook` before we can rely on them.
|
|
212
|
-
let incomingOptions;
|
|
213
|
-
// If the second argument is a string or array, it is the schemas so set the
|
|
214
|
-
// `schema` value and try to use the third argument (or a default) for
|
|
215
|
-
// `incomingOptions`.
|
|
216
|
-
if (typeof schemaOrOptions === 'string' || Array.isArray(schemaOrOptions)) {
|
|
217
|
-
schema = schemaOrOptions;
|
|
218
|
-
incomingOptions = maybeOptions || {};
|
|
219
|
-
}
|
|
220
|
-
// If the second argument is null or an object then use default `schema`
|
|
221
|
-
// and set incomingOptions to second or third argument (or default).
|
|
222
|
-
else if (typeof schemaOrOptions === 'object') {
|
|
223
|
-
schema = 'public';
|
|
224
|
-
incomingOptions = schemaOrOptions || maybeOptions || {};
|
|
225
|
-
}
|
|
226
|
-
// Otherwise if the second argument is present it's invalid: throw an error.
|
|
227
|
-
else if (arguments.length > 1) {
|
|
228
|
-
throw new Error('The second argument to postgraphile was invalid... did you mean to set a schema?');
|
|
229
|
-
}
|
|
230
|
-
// No schema or options specified, use defaults.
|
|
231
|
-
else {
|
|
232
|
-
schema = 'public';
|
|
233
|
-
incomingOptions = {};
|
|
234
|
-
}
|
|
235
|
-
if (typeof poolOrConfig === 'undefined' && arguments.length >= 1) {
|
|
236
|
-
throw new Error('The first argument to postgraphile was `undefined`... did you mean to set pool options?');
|
|
237
|
-
}
|
|
238
|
-
const shutdownActions = new shutdownActions_1.ShutdownActions();
|
|
239
|
-
// Do some things with `poolOrConfig` so that in the end, we actually get a
|
|
240
|
-
// Postgres pool.
|
|
241
|
-
const { pgPool, releasePgPool } = toPgPool(poolOrConfig);
|
|
242
|
-
if (releasePgPool) {
|
|
243
|
-
shutdownActions.add(releasePgPool);
|
|
244
|
-
}
|
|
245
|
-
pgPool.on('error', err => {
|
|
246
|
-
/*
|
|
247
|
-
* This handler is required so that client connection errors don't bring
|
|
248
|
-
* the server down (via `unhandledError`).
|
|
249
|
-
*
|
|
250
|
-
* `pg` will automatically terminate the client and remove it from the
|
|
251
|
-
* pool, so we don't actually need to take any action here, just ensure
|
|
252
|
-
* that the event listener is registered.
|
|
253
|
-
*/
|
|
254
|
-
// tslint:disable-next-line no-console
|
|
255
|
-
console.error('PostgreSQL client generated error: ', err.message);
|
|
256
|
-
});
|
|
257
|
-
pgPool.on('connect', pgClient => {
|
|
258
|
-
// Enhance our Postgres client with debugging stuffs.
|
|
259
|
-
withPostGraphileContext_1.debugPgClient(pgClient, !!options.allowExplain);
|
|
260
|
-
});
|
|
261
|
-
const { getGraphQLSchema, options, _emitter } = getPostgraphileSchemaBuilder(pgPool, schema, incomingOptions, shutdownActions);
|
|
262
|
-
return createPostGraphileHttpRequestHandler_1.default(Object.assign(Object.assign(Object.assign({}, (typeof poolOrConfig === 'string' ? { ownerConnectionString: poolOrConfig } : {})), options), { getGqlSchema: getGraphQLSchema, pgPool,
|
|
263
|
-
_emitter,
|
|
264
|
-
shutdownActions }));
|
|
265
|
-
}
|
|
266
|
-
exports.default = postgraphile;
|
|
267
|
-
function logSeriousError(error, when, nextSteps) {
|
|
268
|
-
// tslint:disable-next-line no-console
|
|
269
|
-
console.error(`A ${chalk_1.default.bold('serious error')} occurred when ${chalk_1.default.bold(when)}. ${nextSteps ? nextSteps + ' ' : ''}Error details:\n\n${error.stack}\n`);
|
|
270
|
-
}
|
|
271
|
-
function hasPoolConstructor(obj) {
|
|
272
|
-
return (
|
|
273
|
-
// tslint:disable-next-line no-any
|
|
274
|
-
(obj && typeof obj.constructor === 'function' && obj.constructor === pg_1.Pool.super_) ||
|
|
275
|
-
false);
|
|
276
|
-
}
|
|
277
|
-
function constructorName(obj) {
|
|
278
|
-
return ((obj &&
|
|
279
|
-
typeof obj.constructor === 'function' &&
|
|
280
|
-
obj.constructor.name &&
|
|
281
|
-
String(obj.constructor.name)) ||
|
|
282
|
-
null);
|
|
283
|
-
}
|
|
284
|
-
// tslint:disable-next-line no-any
|
|
285
|
-
function toPgPool(poolOrConfig) {
|
|
286
|
-
if (quacksLikePgPool(poolOrConfig)) {
|
|
287
|
-
// If it is already a `Pool`, just use it.
|
|
288
|
-
return { pgPool: poolOrConfig, releasePgPool: null };
|
|
289
|
-
}
|
|
290
|
-
if (typeof poolOrConfig === 'string') {
|
|
291
|
-
// If it is a string, let us parse it to get a config to create a `Pool`.
|
|
292
|
-
const pgPool = new pg_1.Pool({ connectionString: poolOrConfig });
|
|
293
|
-
return { pgPool, releasePgPool: () => pgPool.end() };
|
|
294
|
-
}
|
|
295
|
-
else if (!poolOrConfig) {
|
|
296
|
-
// Use an empty config and let the defaults take over.
|
|
297
|
-
const pgPool = new pg_1.Pool({});
|
|
298
|
-
return { pgPool, releasePgPool: () => pgPool.end() };
|
|
299
|
-
}
|
|
300
|
-
else if (isPlainObject(poolOrConfig)) {
|
|
301
|
-
// The user handed over a configuration object, pass it through
|
|
302
|
-
const pgPool = new pg_1.Pool(poolOrConfig);
|
|
303
|
-
return { pgPool, releasePgPool: () => pgPool.end() };
|
|
304
|
-
}
|
|
305
|
-
else {
|
|
306
|
-
throw new Error('Invalid connection string / Pool ');
|
|
307
|
-
}
|
|
308
|
-
}
|
|
309
|
-
// tslint:disable-next-line no-any
|
|
310
|
-
function quacksLikePgPool(pgConfig) {
|
|
311
|
-
if (pgConfig instanceof pg_1.Pool)
|
|
312
|
-
return true;
|
|
313
|
-
if (hasPoolConstructor(pgConfig))
|
|
314
|
-
return true;
|
|
315
|
-
// A diagnosis of exclusion
|
|
316
|
-
if (!pgConfig || typeof pgConfig !== 'object')
|
|
317
|
-
return false;
|
|
318
|
-
if (constructorName(pgConfig) !== 'Pool' && constructorName(pgConfig) !== 'BoundPool')
|
|
319
|
-
return false;
|
|
320
|
-
if (!pgConfig['Client'])
|
|
321
|
-
return false;
|
|
322
|
-
if (!pgConfig['options'])
|
|
323
|
-
return false;
|
|
324
|
-
if (typeof pgConfig['connect'] !== 'function')
|
|
325
|
-
return false;
|
|
326
|
-
if (typeof pgConfig['end'] !== 'function')
|
|
327
|
-
return false;
|
|
328
|
-
if (typeof pgConfig['query'] !== 'function')
|
|
329
|
-
return false;
|
|
330
|
-
return true;
|
|
331
|
-
}
|
|
332
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicG9zdGdyYXBoaWxlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL3Bvc3RncmFwaGlsZS9wb3N0Z3JhcGhpbGUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBQUEsMkJBQXNDO0FBRXRDLHFDQUFzRDtBQUN0RCxtQ0FBc0M7QUFDdEMseURBQXNGO0FBQ3RGLHNHQUErRjtBQUMvRixnRkFBeUU7QUFDekUsNkNBQXFEO0FBRXJELGlDQUEwQjtBQUMxQix1RUFBMEQ7QUFDMUQsdURBQW9EO0FBRXBELE1BQU0sS0FBSyxHQUFHLENBQUMsRUFBVSxFQUFFLEVBQUUsQ0FBQyxJQUFJLE9BQU8sQ0FBQyxPQUFPLENBQUMsRUFBRSxDQUFDLFVBQVUsQ0FBQyxPQUFPLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQztBQUU5RSxrQ0FBa0M7QUFDbEMsU0FBUyxhQUFhLENBQUMsR0FBUTtJQUM3QixJQUFJLENBQUMsR0FBRyxJQUFJLE9BQU8sR0FBRyxLQUFLLFFBQVEsSUFBSSxNQUFNLENBQUMsR0FBRyxDQUFDLEtBQUssaUJBQWlCO1FBQUUsT0FBTyxLQUFLLENBQUM7SUFDdkYsTUFBTSxLQUFLLEdBQUcsTUFBTSxDQUFDLGNBQWMsQ0FBQyxHQUFHLENBQUMsQ0FBQztJQUN6QyxJQUFJLEtBQUssS0FBSyxJQUFJLElBQUksS0FBSyxLQUFLLE1BQU0sQ0FBQyxTQUFTLEVBQUU7UUFDaEQsT0FBTyxJQUFJLENBQUM7S0FDYjtJQUNELE9BQU8sS0FBSyxDQUFDO0FBQ2YsQ0FBQztBQVdEOzs7O0dBSUc7QUFDSCxTQUFnQiw0QkFBNEIsQ0FJMUMsTUFBWSxFQUNaLE1BQThCLEVBQzlCLGVBQXVELEVBQ3ZELGtCQUFtQyxJQUFJLGlDQUFlLEVBQUU7SUFFeEQsSUFBSSxlQUFlLENBQUMsSUFBSSxJQUFJLGVBQWUsQ0FBQyxhQUFhLElBQUksSUFBSSxFQUFFO1FBQ2pFLDZCQUE2QjtRQUM3QixlQUFlLENBQUMsYUFBYSxHQUFHLElBQUksQ0FB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
|
|
@@ -1,16 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
// tslint:disable no-console
|
|
4
|
-
let postgraphileRCFile = null;
|
|
5
|
-
try {
|
|
6
|
-
postgraphileRCFile = require.resolve(process.cwd() + '/.postgraphilerc');
|
|
7
|
-
}
|
|
8
|
-
catch (e) {
|
|
9
|
-
// No postgraphileRC; carry on
|
|
10
|
-
}
|
|
11
|
-
const config = postgraphileRCFile ? require(postgraphileRCFile) : {}; // tslint:disable-line no-var-requires
|
|
12
|
-
if (postgraphileRCFile && !Object.prototype.hasOwnProperty.call(config, 'options')) {
|
|
13
|
-
console.warn('WARNING: Your configuration file does not export any options');
|
|
14
|
-
}
|
|
15
|
-
exports.default = config;
|
|
16
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicG9zdGdyYXBoaWxlcmMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvcG9zdGdyYXBoaWxlL3Bvc3RncmFwaGlsZXJjLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7O0FBQUEsNEJBQTRCO0FBQzVCLElBQUksa0JBQWtCLEdBQWtCLElBQUksQ0FBQztBQUM3QyxJQUFJO0lBQ0Ysa0JBQWtCLEdBQUcsT0FBTyxDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQUMsR0FBRyxFQUFFLEdBQUcsa0JBQWtCLENBQUMsQ0FBQztDQUMxRTtBQUFDLE9BQU8sQ0FBQyxFQUFFO0lBQ1YsOEJBQThCO0NBQy9CO0FBRUQsTUFBTSxNQUFNLEdBQUcsa0JBQWtCLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxrQkFBa0IsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxzQ0FBc0M7QUFDNUcsSUFBSSxrQkFBa0IsSUFBSSxDQUFDLE1BQU0sQ0FBQyxTQUFTLENBQUMsY0FBYyxDQUFDLElBQUksQ0FBQyxNQUFNLEVBQUUsU0FBUyxDQUFDLEVBQUU7SUFDbEYsT0FBTyxDQUFDLElBQUksQ0FBQyw4REFBOEQsQ0FBQyxDQUFDO0NBQzlFO0FBRUQsa0JBQWUsTUFBTSxDQUFDIn0=
|
|
@@ -1,6 +0,0 @@
|
|
|
1
|
-
import { GraphQLSchema } from 'graphql';
|
|
2
|
-
import { PostGraphileOptions } from '../../interfaces';
|
|
3
|
-
/**
|
|
4
|
-
* Exports a PostGraphile schema by looking at a Postgres client.
|
|
5
|
-
*/
|
|
6
|
-
export default function exportPostGraphileSchema(schema: GraphQLSchema, options?: PostGraphileOptions): Promise<void>;
|
|
@@ -1,45 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
const fs_1 = require("fs");
|
|
4
|
-
const graphql_1 = require("graphql");
|
|
5
|
-
const GQL = require("graphql");
|
|
6
|
-
const util_1 = require("util");
|
|
7
|
-
const introspectionQuery = typeof GQL.getIntrospectionQuery === 'function'
|
|
8
|
-
? GQL.getIntrospectionQuery()
|
|
9
|
-
: GQL.introspectionQuery;
|
|
10
|
-
const readFile = util_1.promisify(fs_1.readFile);
|
|
11
|
-
const writeFile = util_1.promisify(fs_1.writeFile);
|
|
12
|
-
async function writeFileIfDiffers(path, contents) {
|
|
13
|
-
let oldContents = null;
|
|
14
|
-
try {
|
|
15
|
-
oldContents = await readFile(path, 'utf8');
|
|
16
|
-
}
|
|
17
|
-
catch (e) {
|
|
18
|
-
/* noop */
|
|
19
|
-
}
|
|
20
|
-
if (oldContents !== contents) {
|
|
21
|
-
await writeFile(path, contents);
|
|
22
|
-
}
|
|
23
|
-
}
|
|
24
|
-
/**
|
|
25
|
-
* Exports a PostGraphile schema by looking at a Postgres client.
|
|
26
|
-
*/
|
|
27
|
-
async function exportPostGraphileSchema(schema, options = {}) {
|
|
28
|
-
const jsonPath = typeof options.exportJsonSchemaPath === 'string' ? options.exportJsonSchemaPath : null;
|
|
29
|
-
const graphqlPath = typeof options.exportGqlSchemaPath === 'string' ? options.exportGqlSchemaPath : null;
|
|
30
|
-
// Sort schema, if requested
|
|
31
|
-
const finalSchema = options.sortExport && graphql_1.lexicographicSortSchema && (jsonPath || graphqlPath)
|
|
32
|
-
? graphql_1.lexicographicSortSchema(schema)
|
|
33
|
-
: schema;
|
|
34
|
-
// JSON version
|
|
35
|
-
if (jsonPath) {
|
|
36
|
-
const result = await graphql_1.graphql(finalSchema, introspectionQuery);
|
|
37
|
-
await writeFileIfDiffers(jsonPath, JSON.stringify(result, null, 2));
|
|
38
|
-
}
|
|
39
|
-
// Schema language version
|
|
40
|
-
if (graphqlPath) {
|
|
41
|
-
await writeFileIfDiffers(graphqlPath, graphql_1.printSchema(finalSchema));
|
|
42
|
-
}
|
|
43
|
-
}
|
|
44
|
-
exports.default = exportPostGraphileSchema;
|
|
45
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZXhwb3J0UG9zdEdyYXBoaWxlU2NoZW1hLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL3Bvc3RncmFwaGlsZS9zY2hlbWEvZXhwb3J0UG9zdEdyYXBoaWxlU2NoZW1hLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7O0FBQUEsMkJBQTBFO0FBQzFFLHFDQUF1RjtBQUN2RiwrQkFBK0I7QUFFL0IsK0JBQWlDO0FBRWpDLE1BQU0sa0JBQWtCLEdBQ3RCLE9BQU8sR0FBRyxDQUFDLHFCQUFxQixLQUFLLFVBQVU7SUFDN0MsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxxQkFBcUIsRUFBRTtJQUM3QixDQUFDLENBQUUsR0FBVyxDQUFDLGtCQUFrQixDQUFDO0FBRXRDLE1BQU0sUUFBUSxHQUFHLGdCQUFTLENBQUMsYUFBWSxDQUFDLENBQUM7QUFDekMsTUFBTSxTQUFTLEdBQUcsZ0JBQVMsQ0FBQyxjQUFhLENBQUMsQ0FBQztBQUUzQyxLQUFLLFVBQVUsa0JBQWtCLENBQUMsSUFBWSxFQUFFLFFBQWdCO0lBQzlELElBQUksV0FBVyxHQUFrQixJQUFJLENBQUM7SUFDdEMsSUFBSTtRQUNGLFdBQVcsR0FBRyxNQUFNLFFBQVEsQ0FBQyxJQUFJLEVBQUUsTUFBTSxDQUFDLENBQUM7S0FDNUM7SUFBQyxPQUFPLENBQUMsRUFBRTtRQUNWLFVBQVU7S0FDWDtJQUNELElBQUksV0FBVyxLQUFLLFFBQVEsRUFBRTtRQUM1QixNQUFNLFNBQVMsQ0FBQyxJQUFJLEVBQUUsUUFBUSxDQUFDLENBQUM7S0FDakM7QUFDSCxDQUFDO0FBRUQ7O0dBRUc7QUFDWSxLQUFLLFVBQVUsd0JBQXdCLENBQ3BELE1BQXFCLEVBQ3JCLFVBQStCLEVBQUU7SUFFakMsTUFBTSxRQUFRLEdBQ1osT0FBTyxPQUFPLENBQUMsb0JBQW9CLEtBQUssUUFBUSxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsb0JBQW9CLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQztJQUN6RixNQUFNLFdBQVcsR0FDZixPQUFPLE9BQU8sQ0FBQyxtQkFBbUIsS0FBSyxRQUFRLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxtQkFBbUIsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDO0lBRXZGLDRCQUE0QjtJQUM1QixNQUFNLFdBQVcsR0FDZixPQUFPLENBQUMsVUFBVSxJQUFJLGlDQUF1QixJQUFJLENBQUMsUUFBUSxJQUFJLFdBQVcsQ0FBQztRQUN4RSxDQUFDLENBQUMsaUNBQXVCLENBQUMsTUFBTSxDQUFDO1FBQ2pDLENBQUMsQ0FBQyxNQUFNLENBQUM7SUFFYixlQUFlO0lBQ2YsSUFBSSxRQUFRLEVBQUU7UUFDWixNQUFNLE1BQU0sR0FBRyxNQUFNLGlCQUFPLENBQUMsV0FBVyxFQUFFLGtCQUFrQixDQUFDLENBQUM7UUFDOUQsTUFBTSxrQkFBa0IsQ0FBQyxRQUFRLEVBQUUsSUFBSSxDQUFDLFNBQVMsQ0FBQyxNQUFNLEVBQUUsSUFBSSxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUM7S0FDckU7SUFFRCwwQkFBMEI7SUFDMUIsSUFBSSxXQUFXLEVBQUU7UUFDZixNQUFNLGtCQUFrQixDQUFDLFdBQVcsRUFBRSxxQkFBVyxDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUM7S0FDakU7QUFDSCxDQUFDO0FBekJELDJDQXlCQyJ9
|
|
@@ -1,41 +0,0 @@
|
|
|
1
|
-
export declare type Action = () => void | Promise<void>;
|
|
2
|
-
/**
|
|
3
|
-
* This class tracks actions that must be taken when PostGraphile is shut down
|
|
4
|
-
* (released) in order to make sure that all the resources it has consumed has
|
|
5
|
-
* been cleaned up.
|
|
6
|
-
*
|
|
7
|
-
* Since PostGraphile is extensible via plugins and plugins may have their own
|
|
8
|
-
* shutdown actions we use this generic system to handle them all. If your
|
|
9
|
-
* plugin sets up something that would keep running after PostGraphile is
|
|
10
|
-
* `.release()`d (such as a timer, interval, network connection, filesystem
|
|
11
|
-
* monitoring, or similar activity) then you should register an action via
|
|
12
|
-
* `shutdownActions` to clean it up.
|
|
13
|
-
*
|
|
14
|
-
* This class currently has "experimental" status, it may have breaking
|
|
15
|
-
* changes in future semver minor releases.
|
|
16
|
-
*/
|
|
17
|
-
export declare class ShutdownActions {
|
|
18
|
-
private actions;
|
|
19
|
-
private didInvoke;
|
|
20
|
-
/**
|
|
21
|
-
* Register a function to be called when PostGraphile is released.
|
|
22
|
-
*/
|
|
23
|
-
add(action: Action): void;
|
|
24
|
-
/**
|
|
25
|
-
* If your action is no longer relevant (for example it has completed, or it
|
|
26
|
-
* was only relevant whilst in a particular mode) then be sure to remove it so
|
|
27
|
-
* it won't be called when PostGraphile is released.
|
|
28
|
-
*/
|
|
29
|
-
remove(action: Action): void;
|
|
30
|
-
/**
|
|
31
|
-
* Calls the release actions in reverse order and returns the array of resulting
|
|
32
|
-
* promises/results. Will not throw unless the shutdown actions have already
|
|
33
|
-
* been invoked.
|
|
34
|
-
*/
|
|
35
|
-
invoke(): Array<Promise<void> | void>;
|
|
36
|
-
/**
|
|
37
|
-
* Calls all the release actions and resolves when complete (rejecting if an
|
|
38
|
-
* error occurred).
|
|
39
|
-
*/
|
|
40
|
-
invokeAll(): Promise<void>;
|
|
41
|
-
}
|