Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Websocket #711

Merged
merged 87 commits into from Jul 4, 2019
Merged
Show file tree
Hide file tree
Changes from 55 commits
Commits
Show all changes
87 commits
Select commit Hold shift + click to select a range
c4811ca
demo websoket version
computerpunc May 8, 2019
e32b9fa
Added support for queryStringParameters
computerpunc May 14, 2019
1ea68e0
Bug fixes
computerpunc May 21, 2019
53e9eef
Run WebSocket endpoint on a different port (http port+1)
computerpunc May 23, 2019
602ac7b
GWAPI REST API suppoprt
computerpunc May 26, 2019
c4c6ea6
Changed the way to get function to post-to-connection
computerpunc May 27, 2019
10c377d
Default timeout is 1000ms and can set timeout value via --timeout=
computerpunc May 27, 2019
bca81cd
Minor Improved logs
computerpunc May 27, 2019
da8c749
Update README with new ways of sending messages to clients
computerpunc May 27, 2019
fe4a51d
Merge from upstream/master
computerpunc May 28, 2019
f527670
Leftovers from merge
computerpunc May 28, 2019
4ec82ad
Fix lint errors
computerpunc May 28, 2019
4e61aa5
Fix static AWS = { ... }
computerpunc May 28, 2019
289e8f5
Fix 2 lint errors
computerpunc May 28, 2019
ca34ccb
Removed require('aws-sdk/clients/apigatewaymanagementapi');
computerpunc May 29, 2019
2f3dfbd
Removed the need for require('serverless-offline').AWS
computerpunc May 30, 2019
f9600f8
Last commit leftovers
computerpunc May 30, 2019
f3cf815
Added context and event when calling the handler.
computerpunc Jun 1, 2019
4521b88
Added context and event for connect and disconnect
computerpunc Jun 3, 2019
96dbd16
Merge from master: hapi@18 & hapi-plugin-websocket@2
computerpunc Jun 4, 2019
1e559b7
hapi@18 and hapi-plugin-websocket@2 support
computerpunc Jun 4, 2019
1ea590e
Merge branch 'master' of https://github.com/dherault/serverless-offli…
computerpunc Jun 4, 2019
6638b73
Merge from master and fixes
computerpunc Jun 4, 2019
b51ddb5
added support for callback() in handler
computerpunc Jun 5, 2019
381355b
Moved websocket CreateXXX to websocketHelpers.js
computerpunc Jun 6, 2019
d45ea7a
Restructure manual_test_websocket to include more projects
computerpunc Jun 6, 2019
66ffe6a
Added serverless.yml with warning
computerpunc Jun 6, 2019
02ce0e7
Support for websocketsApiRouteSelectionExpression
computerpunc Jun 11, 2019
3759b06
Fix lint errors
computerpunc Jun 11, 2019
72a1fc4
Merge branch 'master' of https://github.com/dherault/serverless-offli…
computerpunc Jun 11, 2019
687f901
Merge leftovers
computerpunc Jun 11, 2019
b9b0eef
Update README
computerpunc Jun 11, 2019
b6c1095
Update README about WebSocket
computerpunc Jun 11, 2019
e855a4a
Export on exports
dnalborczyk Jun 12, 2019
53da9c1
Extract multi-value-headers function
dnalborczyk Jun 12, 2019
d802dcf
Generate collision resistent ids with cuid (project-wide)
dnalborczyk Jun 12, 2019
aa4f977
Add formatToClfTime function
dnalborczyk Jun 13, 2019
2df8ef8
Order props
dnalborczyk Jun 14, 2019
fd0637d
Remove unused options
dnalborczyk Jun 14, 2019
8a699ab
Add websocket port option
dnalborczyk Jun 14, 2019
7c34178
Fix spelling
dnalborczyk Jun 14, 2019
193e282
Separate ApiGateway and ApiGatewayWebSockets from Plugin
dnalborczyk Jun 15, 2019
536d1b3
Refactor events setup to offline class
dnalborczyk Jun 16, 2019
c51ea7e
Property order nits
dnalborczyk Jun 16, 2019
7b9c942
Spelling
dnalborczyk Jun 17, 2019
5aa2365
Require on top of file
dnalborczyk Jun 17, 2019
25832c8
Use Lambda context for websocket
dnalborczyk Jun 17, 2019
1386954
Add warning for experimental WebSocket support
dnalborczyk Jun 17, 2019
35a3616
Linting
dnalborczyk Jun 17, 2019
ca16506
Remove unused this.clients
dnalborczyk Jun 17, 2019
d631458
Rename variable
dnalborczyk Jun 17, 2019
0e3b4d8
Add websocket to package.json keywords
dnalborczyk Jun 18, 2019
741287b
Update deps
dnalborczyk Jun 18, 2019
d0fe602
Change minimum serverless peer dep to v1.39.0 for websocket support
dnalborczyk Jun 18, 2019
a9f4a09
Merge branch 'master' into websocket-fixes
dnalborczyk Jun 18, 2019
e54cdc3
Lint and rename folders
dherault Jun 22, 2019
fdbd07d
Merge branch 'master' into websocket-fixes
dherault Jun 22, 2019
c38a4bc
Display correct protocol on listen
dherault Jun 22, 2019
9247070
Add replay last request feature
dherault Jun 22, 2019
719a14e
Fix http/https --> HTTP
dherault Jun 22, 2019
209a95e
Use option to enable websocket feature
dherault Jun 22, 2019
6959108
Edit documentation
dherault Jun 22, 2019
e73983c
Fix travis build lint error
dherault Jun 22, 2019
d6eae11
Fix a test that didn't run correctly on AWS
computerpunc Jun 25, 2019
5e19fa6
Fixed test failing when running offline
computerpunc Jun 25, 2019
0f74255
Move to nodejs10.x runtime
computerpunc Jun 26, 2019
9ade958
Merge pull request #720 from computerpunc/websocket-fixes
dherault Jun 28, 2019
c5caceb
Merge branch 'master' into websocket-fixes
dherault Jun 30, 2019
7f56a18
Remove websocket feature toggling
dherault Jun 30, 2019
a77723e
remove --useWebsocket options
dherault Jun 30, 2019
9d84707
lint
dherault Jun 30, 2019
f489781
Update docs
dherault Jun 30, 2019
48c27d8
Merge branch 'master' into websocket-fixes
dherault Jul 1, 2019
1ba79f2
Merge branch 'master' into websocket-fixes
dherault Jul 2, 2019
27639ae
feat: add @connections DELETE route to close websocket
frsechet Jul 2, 2019
d5e14aa
fix: add missing printBlankLine method
frsechet Jul 2, 2019
e70db4b
chore: add tests for connection close
frsechet Jul 2, 2019
28266f2
Merge pull request #725 from frsechet/websocket-fixes
dherault Jul 2, 2019
b83c123
chore: if an error occurs during the $connect action, close the conne…
frsechet Jul 2, 2019
27e1e05
merge master
dnalborczyk Jul 2, 2019
b9b1d72
Merge pull request #726 from frsechet/fix/aws-difference
dherault Jul 2, 2019
c3fcc4c
Rename getUniqueId to createUniqueId
dnalborczyk Jul 3, 2019
b02e874
Merge master
dnalborczyk Jul 3, 2019
4f5ce66
Merge branch 'websocket-fixes' of https://github.com/dherault/serverl…
dnalborczyk Jul 3, 2019
c0bea4c
Remove apiGatewayUrl from websocket event
dnalborczyk Jul 3, 2019
f901507
fix: don't add body and content-type headers to sigv4 for delete call…
frsechet Jul 3, 2019
09d299a
Merge pull request #729 from frsechet/fix/tests-sigv4-delete-connection
dnalborczyk Jul 3, 2019
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Jump to
Jump to file
Failed to load files.
Diff view
Diff view
7 changes: 4 additions & 3 deletions .gitignore
Expand Up @@ -104,6 +104,7 @@ fabric.properties
# auto-generated tag files
tags
=======

.idea/
manual_test/.serverless

.idea/
.serverless
.dynamodb
26 changes: 26 additions & 0 deletions README.md
Expand Up @@ -28,6 +28,7 @@ This plugin is updated by its users, I just do maintenance and ensure that PRs a
* [Custom headers](#custom-headers)
* [Environment variables](#environment-variables)
* [AWS API Gateway features](#aws-api-gateway-features)
* [WebSocket](#websocket)
* [Usage with Webpack](#usage-with-webpack)
* [Velocity nuances](#velocity-nuances)
* [Debug process](#debug-process)
Expand Down Expand Up @@ -75,6 +76,7 @@ All CLI options are optional:
--location -l The root location of the handlers' files. Defaults to the current directory
--host -o Host name to listen on. Default: localhost
--port -P Port to listen on. Default: 3000
--wsPort WebSocket port to listen on. Default: 3001
dherault marked this conversation as resolved.
Show resolved Hide resolved
--stage -s The stage used to populate your templates. Default: the first stage found in your project.
--region -r The region used to populate your templates. Default: the first region for the first stage found.
--noTimeout -t Disables the timeout feature.
Expand Down Expand Up @@ -358,6 +360,30 @@ resources:

To disable the model validation you can use `--disableModelValidation`.

## WebSocket
`This has experimental functionality. Please report any bugs or missing features.`
dherault marked this conversation as resolved.
Show resolved Hide resolved

serverless-offline suports running a WebSocket local endpoint.

Usage in order to send messages back to clients:

`POST http://localhost:{port+1}/@connections/{connectionId}`
dherault marked this conversation as resolved.
Show resolved Hide resolved

Or,

```
dherault marked this conversation as resolved.
Show resolved Hide resolved
let endpoint=event.apiGatewayUrl;
if (!endpoint) endpoint = event.requestContext.domainName+'/'+event.requestContext.stage;
const apiVersion='2018-11-29';
const apiGM=new API.ApiGatewayManagementApi({ apiVersion, endpoint });
apiGM.postToConnection({ConnectionId, Data});
dherault marked this conversation as resolved.
Show resolved Hide resolved
```
Where the `event` is received in the lambda handler function.
dherault marked this conversation as resolved.
Show resolved Hide resolved

There's support for `websocketsApiRouteSelectionExpression` in it's basic form: `$request.body.x.y.z`, where the default value is `$request.body.action`.
dherault marked this conversation as resolved.
Show resolved Hide resolved

Authorizers and wss:// are currectly not supported in serverless-offline.

## Usage with Webpack

Use [serverless-webpack](https://github.com/serverless-heaven/serverless-webpack) to compile and bundle your ES-next code
Expand Down
25 changes: 11 additions & 14 deletions manual_test_websocket/README.md
Expand Up @@ -8,6 +8,7 @@ Set AWS credentials, e.g.: `export AWS_PROFILE=...`

To start AWS DynamoDB locally (can run only after first deploying locally): `sls dynamodb install` `sls dynamodb start`

### In either main or RouteSelection folder the following:

## Deploying locally

Expand All @@ -26,28 +27,24 @@ To start AWS DynamoDB locally (can run only after first deploying locally): `sls

## Testing on AWS

`npm --endpoint={WebSocket endpoint URL on AWS} run test`
`npm --endpoint={WebSocket endpoint URL on AWS} --timeout={timeout in ms} run test`


## Usage Assumption - In order to send messages back to clients
`const newAWSApiGatewayManagementApi=(event, context)=>{`
## Usage in order to send messages back to clients

`POST http://localhost:3001/@connections/{connectionId}`

` const endpoint=event.requestContext.domainName+'/'+event.requestContext.stage;`
Or,

` const apiVersion='2018-11-29';`
`let endpoint=event.apiGatewayUrl;`

` let API=context.API;`
`if (!endpoint) endpoint = event.requestContext.domainName+'/'+event.requestContext.stage;`

` if (!process.env.IS_OFFLINE) {`
`const apiVersion='2018-11-29';`

` API = require('aws-sdk');`
`const apiGM=new API.ApiGatewayManagementApi({ apiVersion, endpoint });`

` require('aws-sdk/clients/apigatewaymanagementapi');`
`apiGM.postToConnection({ConnectionId, Data});`

` }`

` return new API.ApiGatewayManagementApi({ apiVersion, endpoint });`

`};`


@@ -0,0 +1,37 @@
'use strict';

const AWS = require('aws-sdk');


const successfullResponse = {
statusCode: 200,
body: 'Request is OK.'
};

const errorResponse = {
statusCode: 400,
body: 'Request is not OK.'
};

module.exports.echo = async (event, context) => {
const action = JSON.parse(event.body);

await sendToClient(action.message, event.requestContext.connectionId, newAWSApiGatewayManagementApi(event, context));
return successfullResponse;
};

const newAWSApiGatewayManagementApi=(event, context)=>{
let endpoint=event.apiGatewayUrl;
dherault marked this conversation as resolved.
Show resolved Hide resolved

if (!endpoint) endpoint = event.requestContext.domainName+'/'+event.requestContext.stage;
const apiVersion='2018-11-29';
return new AWS.ApiGatewayManagementApi({ apiVersion, endpoint });
};

const sendToClient = (data, connectionId, apigwManagementApi) => {
// console.log(`sendToClient:${connectionId}`);
let sendee=data;
if ('object'==typeof data) sendee=JSON.stringify(data);

return apigwManagementApi.postToConnection({ConnectionId: connectionId, Data: sendee}).promise();
};