@ttoss/graphql-api-server

0.6.4 • Public • Published

@ttoss/graphql-api-server

This package provides a Koa server to run your @ttoss/graphql-api API.

Installation

pnpm add @ttoss/graphql-api-server @ttoss/graphql-api graphql

Getting Started

You can use the createServer method to create your server.

import { createServer } from '@ttoss/graphql-api-server';
import { schemaComposer } from './schemaComposer';

const server = createServer({
  schemaComposer,
  graphiql: true,
});

server.listen(3000, () => {
  console.log('Server listening on port 3000');
});

Authentication Types

The server supports the following authentication types:

No authentication

You can disable authentication by not setting the authenticationType option.

AWS_COGNITO_USER_POOLS

You need to set Cognito user pool ID token or access token to the Authorization header.

import { createServer } from '@ttoss/graphql-api-server';
import { schemaComposer } from './schemaComposer';

const server = createServer({
  schemaComposer,
  authenticationType: 'AWS_COGNITO_USER_POOLS',
  userPoolConfig: {
    userPoolId: process.env.USER_POOL_ID,
    tokenUse: 'access' // or 'id'. Default is 'access'.
    clientId: process.env.CLIENT_ID,
  },
});

server.listen(3000, () => {
  console.log('Server listening on port 3000');
});

Middlewares

You can add middlewares compatible with graphql-middleware to the server using the middlewares option.

import { createServer } from '@ttoss/graphql-api-server';
import { schemaComposer } from './schemaComposer';
import { allow, deny, shield } from 'graphql-shield';

const NotAuthorizedError = new Error('Not authorized!');
/**
 * The error name is the same value `errorType` on GraphQL errors response.
 */
NotAuthorizedError.name = 'NotAuthorizedError';

const permissions = shield(
  {
    Query: {
      '*': deny,
      author: allow,
    },
    Author: {
      id: allow,
      name: allow,
    },
  },
  {
    fallbackRule: deny,
    fallbackError: NotAuthorizedError,
  }
);

const server = createServer({
  schemaComposer,
  middlewares: [permissions],
});

Handling Other Routes

If you want to handle other routes than /graphql, you can use the Router class from koa and add it to the server.

Serving a SPA

import { createServer } from '@ttoss/graphql-api-server';
import { schemaComposer } from './schemaComposer';
import mount from 'koa-mount';
import * as path from 'path';

const server = createServer({
  schemaComposer,
  graphiql: true,
});

const APP_DIR = path.resolve(__dirname, '../../app/dist');

server.use(mount('/', serve(APP_DIR)));

/**
 * Serve a SPA—redirect all requests to index.html
 * https://dejanvasic.wordpress.com/2020/08/22/serving-react-spa-in-koa/
 */
server.use(async (ctx, next) => {
  return await serve(APP_DIR)(Object.assign(ctx, { path: 'index.html' }), next);
});

server.listen(3000, () => {
  console.log('Server listening on port 3000');
});

Serving Another Endpoint

import { Router, createServer } from '@ttoss/graphql-api-server';
import { schemaComposer } from './schemaComposer';

const server = createServer({
  schemaComposer,
  graphiql: true,
});

const router = new Router();

router.get('/health', (ctx: any) => {
  ctx.body = 'OK';
});

server.use(router.routes()).use(router.allowedMethods());

server.listen(3000, () => {
  console.log('Server listening on port 3000');
});

CORS

You can enable CORS by setting the cors option. You can check the available options on @koa/cors package.

import { createServer } from '@ttoss/graphql-api-server';

const server = createServer({
  schemaComposer,
  cors: {
    origin: '*',
    allowMethods: ['GET', 'POST'],
  },
});

Readme

Keywords

Package Sidebar

Install

npm i @ttoss/graphql-api-server

Weekly Downloads

6

Version

0.6.4

License

none

Unpacked Size

50.5 kB

Total Files

8

Last publish

Collaborators

  • pedro-arantes
  • techtriangulostecnologia