@cloud-cli/gw
TypeScript icon, indicating that this package has built-in type declarations

1.7.3 • Public • Published

Gateway

Minimalist REST HTTP server implementation.

API

Short example:

// index.js
import api from '@cloud-cli/gw';
import Foo from './foo.js';

const { gateway } = api();
gateway.add('foo', new Foo());

With a custom logger:

import { Gateway } from '@cloud-cli/gw';
import Foo from './foo.js';
import logger from './logger.js';

const gateway = new Gateway(logger);
gateway.add('foo', new Foo());

Restful API

Assume your API runs at https://example.com/

List available resources:

List all registered resources

curl https://example.com/

Invoke a method in a resource (get, post, etc):

Just like any REST endpoint, invoke a resource with an HTTP method. Valid methods: HEAD, GET, POST, PUT, DELETE, PATCH and OPTIONS.

curl -d 'test' https://example.com/foo
curl https://example.com/foo/123
curl --head https://example.com/foo/123
curl -X DELETE https://example.com/foo/123

Resource class and custom HTTP server

import { Gateway, Resource } from '@cloud-cli/gw';
import { createServer } from 'http';

class Ponies extends Resource {
  get(request, response) {
    response.writeHead(200);
    response.end(JSON.stringify(['list', 'of', 'ponies']));
  }
}

const gw = new Gateway();
gw.add('ponies', new Ponies());

createServer((request, response) => gw.dispatch(request, response)).listen(80);

Then invoke the resource with an HTTP call

GET /ponies

A resource can implement any of the valid HTTP methods: get, post, put, delete, patch and options. The methods are called with the request/response objects from a vanilla Node.JS HTTP server.

CORS

Add a property to a resource implmementation with the options to enable CORS. The available options are the same as the cors module

import { Resource } from '@cloud-cli/gw';

export class ResourceWithCors extends Resource {
  cors = { ... }
}

Body parser

Add a property to a resource class with the options to enable CORS. The available options are the same as the body-parser module options

The resulting request body will be available as request.body.

import { Resource } from '@cloud-cli/gw';

export class ResourceWithBody extends Resource {
  // provide ONLY ONE of the 4 possible options:
  body = {
    json: {};
    raw: {};
    text: {};
    urlencoded: {};
  };
}

Authorization

Implement the resource method called auth to protect resources. The method is async.

import { Resource } from '@cloud-cli/gw';

export class ProtectedResource extends Resource {
  async auth(request: IncomingMessage, response: ServerResponse) {
    return this.isAllowed() || Promise.reject(new Error('Nope'));
  }

  isAllowed() {
    // return "true" to authorize
  }
}

Readme

Keywords

Package Sidebar

Install

npm i @cloud-cli/gw

Weekly Downloads

4

Version

1.7.3

License

none

Unpacked Size

25.4 kB

Total Files

12

Last publish

Collaborators

  • darlanalves