@cran/gql.koa
Version:
Cran/GraphQL Koa Server
85 lines (84 loc) • 3.1 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
exports.KoaServer = void 0;
const tslib_1 = require("tslib");
const apollo_server_core_1 = require("apollo-server-core");
const koa_1 = (0, tslib_1.__importDefault)(require("koa"));
const router_1 = (0, tslib_1.__importDefault)(require("@koa/router"));
const koa_bodyparser_1 = (0, tslib_1.__importDefault)(require("koa-bodyparser"));
const cors_1 = (0, tslib_1.__importDefault)(require("@koa/cors"));
const http_1 = require("http");
const middleware_1 = require("./middleware");
class KoaServer extends koa_1.default {
server;
apollo;
constructor(options) {
super();
this.server = options.server || (0, http_1.createServer)();
if (false !== options.cors) {
this.use((0, cors_1.default)("object" === typeof options.cors ? options.cors : undefined));
}
if (false !== options.options) {
this.use(function useOptions(ctx, next) {
if ("OPTIONS" === ctx.request.method) {
return Object.assign(ctx, { status: 204, body: "", });
}
return next();
});
}
if (false !== options.bodyParser) {
this.use((0, koa_bodyparser_1.default)("object" === typeof options.bodyParser
? options.bodyParser : undefined));
}
}
getApollo() {
return this.apollo;
}
getServer() {
return this.server;
}
getApolloPlugins() {
return [
(0, apollo_server_core_1.ApolloServerPluginDrainHttpServer)({ httpServer: this.server, }),
];
}
useRouter(router) {
return this.use(router.routes()).use(router.allowedMethods());
}
useApollo(apollo, { path = "/graphql", middleware = [], } = {}) {
this.apollo = apollo;
const router = new router_1.default();
const apolloMiddleware = apollo.getMiddleware();
router.get(path, ...middleware, apolloMiddleware);
router.post(path, ...middleware, apolloMiddleware);
return this.useRouter(router);
}
useSystemMiddleware(options = {}) {
if (false !== options.sqlPreview) {
this.use(middleware_1.sqlPreview);
}
const router = new router_1.default({
prefix: options.prefix || "/-",
});
if (false !== options.health) {
router.get("/health", (0, middleware_1.health)("boolean" === typeof options.health
? undefined : options.health));
}
if (false !== options.metrics) {
router.get("/metrics", middleware_1.metrics);
}
return this.useRouter(router);
}
async start(options = { port: Number(process.env.PORT) || 0, }) {
if (this.apollo) {
await this.apollo.start();
}
this.server.on("request", this.callback());
return new Promise((resolve) => {
this.server.listen(options, () => {
resolve(this);
});
});
}
}
exports.KoaServer = KoaServer;