awswebsocketadapter

package module
v0.0.2 Latest Latest
Warning

This package is not in the latest version of its module.

Go to latest
Published: Feb 10, 2021 License: MIT Imports: 13 Imported by: 0

README

AWS Websocket Adapter

This awswebsocketadapter Go package can be used to run an AWS Lambda function integration for a websocket-type API Gateway, locally.

It implements http.Handler to handle websocket connections and invokes the provided AWS Lambda handler function for any CONNECT, DISCONNECT or MESSAGE events.

It also implements the apigatewaymanagementapiiface.ApiGatewayManagementApiAPI client interface from aws-sdk-go, so it can be used to write messages back to a client.

Example

package main

import (
	"context"
	"log"
	"net/http"

	"github.com/aws/aws-lambda-go/events"
	"github.com/aws/aws-sdk-go/service/apigatewaymanagementapi"
	"github.com/aws/aws-sdk-go/service/apigatewaymanagementapi/apigatewaymanagementapiiface"

	awswebsocketadapter "github.com/armsnyder/aws-websocket-adapter"
)

func main() {
	// Create the adapter.
	var adapter awswebsocketadapter.Adapter

	// Set the LambdaHandler to a real lambda handler function.
	adapter.LambdaHandler = createHandler(&adapter)

	// Listen for ws:// requests.
	err := http.ListenAndServe(":8080", &adapter)
	log.Fatal(err)
}

// createHandler returns a handler function that can be passed to lambda.Start,
// from the aws-lambda-go SDK.
func createHandler(client apigatewaymanagementapiiface.ApiGatewayManagementApiAPI) func(context.Context, events.APIGatewayWebsocketProxyRequest) (events.APIGatewayProxyResponse, error) {
	return func(ctx context.Context, request events.APIGatewayWebsocketProxyRequest) (resp events.APIGatewayProxyResponse, err error) {
		resp = events.APIGatewayProxyResponse{StatusCode: 200}

		// As an example, send a message in response to every message received.
		// This demonstrates how Adapter can be used as an API Gateway Management API client.
		if request.RequestContext.EventType == "MESSAGE" {
			reply := &apigatewaymanagementapi.PostToConnectionInput{
				ConnectionId: &request.RequestContext.ConnectionID,
				Data:         []byte("hello"),
			}

			_, err = client.PostToConnectionWithContext(ctx, reply)
		}

		return resp, err
	}
}

Documentation

Overview

Package awswebsocketadapter can be used to run an AWS Lambda function integration for a websocket-type API Gateway, locally.

It implements http.Handler to handle websocket connections and invokes the provided AWS Lambda handler function for any CONNECT, DISCONNECT or MESSAGE events.

It also implements the apigatewaymanagementapiiface.ApiGatewayManagementApiAPI client interface, so it can be used to write messages back to a client.

Example
package main

import (
	"context"
	"log"
	"net/http"

	"github.com/aws/aws-lambda-go/events"
	"github.com/aws/aws-sdk-go/service/apigatewaymanagementapi"
	"github.com/aws/aws-sdk-go/service/apigatewaymanagementapi/apigatewaymanagementapiiface"

	awswebsocketadapter "github.com/armsnyder/aws-websocket-adapter"
)

func main() {
	// Create the adapter.
	var adapter awswebsocketadapter.Adapter

	// Set the LambdaHandler to a real lambda handler function.
	adapter.LambdaHandler = createHandler(&adapter)

	// Listen for ws:// requests.
	err := http.ListenAndServe(":8080", &adapter)
	log.Fatal(err)
}

// createHandler returns a handler function that can be passed to lambda.Start,
// from the aws-lambda-go SDK.
func createHandler(client apigatewaymanagementapiiface.ApiGatewayManagementApiAPI) func(context.Context, events.APIGatewayWebsocketProxyRequest) (events.APIGatewayProxyResponse, error) {
	return func(ctx context.Context, request events.APIGatewayWebsocketProxyRequest) (resp events.APIGatewayProxyResponse, err error) {
		resp = events.APIGatewayProxyResponse{StatusCode: 200}

		// As an example, send a message in response to every message received.
		// This demonstrates how Adapter can be used as an API Gateway Management API client.
		if request.RequestContext.EventType == "MESSAGE" {
			reply := &apigatewaymanagementapi.PostToConnectionInput{
				ConnectionId: &request.RequestContext.ConnectionID,
				Data:         []byte("hello"),
			}

			_, err = client.PostToConnectionWithContext(ctx, reply)
		}

		return resp, err
	}
}
Output:

Index

Examples

Constants

This section is empty.

Variables

This section is empty.

Functions

This section is empty.

Types

type Adapter

type Adapter struct {
	LambdaHandler LambdaHandler
	// contains filtered or unexported fields
}

Adapter is an implementation of an API Gateway Websocket API that invokes an AWS Lambda function in-memory. It is a handler that upgrades requests to websockets and invokes an AWS Lambda handler on each message. It also provides API Gateway Management APIs for writing back to connections.

func (*Adapter) ServeHTTP

func (a *Adapter) ServeHTTP(w http.ResponseWriter, r *http.Request)

ServeHTTP upgrades the request from HTTP to WS and then continues to send and receive websocket messages over the connection.

Jump to

Keyboard shortcuts

? : This menu
/ : Search site
f or F : Jump to
y or Y : Canonical URL