0.1.5 • Published 5 years ago

@lawcket/websocket v0.1.5

Weekly downloads
-
License
MIT
Repository
github
Last release
5 years ago

@lawcket/websocket

Downloads Version License

A pluggable API Gateway Lambda wrapper that mimics server websockets

NOTE: Supports Serverless >=1.38 For pre-1.38 use @lawcket/websockets@0.1.4

Installation

npm install @lawcket/websocket

or

yarn add @lawcket/websocket

Usage

Servereless Project

Configure your function to accept all routes/actions.

Example:

functions:
  websocket:
    handler: src/index.default
    memorySize: 3008
    events:
      - websocket:
          route: $connect
      - websocket:
          route: $disconnect
      - websocket:
          route: $default
Lambda

The lambda will need to be constructed by the @lawcket/websocket library. It modifies incoming messages and handles the federation of middleware and plugins.

Example:

// pre-ES6
// const lawcket = require('@lawcket/websocket');

// ES6
import lawcket from '@lawcket/websocket';

const handler = async (event, connection, publish) => {
  console.log(`Connection: ${JSON.stringify(connection, null, 2)}`);
  // publish is only available during a message event
  if (connection.event === 'message' && publish) {
    await publish({ message: 'hello from server' });
  }
};

export default lawcket({
  middleware: [],
  plugins: [],
  handler,
});

The lambda implementation will be called with three params; event, connection, and publish.

event:

  • the original lambda event
  • contains header information during a CONNECT request

connection:

  • a subset of collection info, useful for storing
  • object structure

    • event: 'close' | 'connect' | 'message'
    • connectionId: string
    • stage: string,
    • domainName: string

publish:

  • only available during a message event
  • needs to be called asynchronously
  • supports base64, or stringifiable data
Plugins

Plugins mimic how the handler is called and is invoked asychronously. A good use case for this is storing connection information, or for processing connection-related tasks that do not pertain to the general flow of the lambda.

Example:

import lawcket from '@lawcket/websocket';

// ... handler here

const dynamo = async  (originalEvent, connection) => {
    if (connection.event === 'connect') {
        // store connection to dynamo
    }
    if (connection.event === 'close') {
        // remove connection from dynamo
    }
}

export default lawcket({
  middleware: [],
  plugins: [dynamo],
  handler,
});

Middleware

Middleware are used to modify or interrupt the lambda event. An excellent use-case for this is authentication. Internally @lawcket/websocket uses a middleware to automatically parse incoming body data. Be aware, middleware are processed in-order.

Example:

import lawcket from '@lawcket/websocket';

// ... handler here

const auth = (originalEvent) => {
    const { requestContext, headers } = originalEvent;
    if (headers && headers.Authorization 
        && requestContext.eventType === 'CONNECT') {
        // check authorization here
    }
    
    // middleware must return the event if not throwing
    return originalEvent;
}

export default lawcket({
  middleware: [auth],
  plugins: [],
  handler,
});

Click here for a full example of @lawcket/websocket usage.

0.1.5

5 years ago

0.1.4

5 years ago

0.1.3

5 years ago

0.1.2

5 years ago

0.1.1

5 years ago

0.1.0

5 years ago

0.0.4

5 years ago

0.0.3

5 years ago

0.0.2

5 years ago

0.0.1

5 years ago