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.
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"
"github.com/armsnyder/awswebsocketadapter"
)
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
}
}