diff --git a/docs/deprecations.md b/docs/deprecations.md index 086a97d7c5f..3c43134f1f2 100644 --- a/docs/deprecations.md +++ b/docs/deprecations.md @@ -36,6 +36,20 @@ Note: - The `serverless.yml` setting is ineffective for deprecations reported before the configuration is read. - `SLS_DEPRECATION_DISABLE` and `disabledDeprecations` remain respected, and no errors will be thrown for mentioned deprecation codes. +
 
+ +## Grouping websockets settings under `provider.websockets` + +Deprecation code: `PROVIDER_WEBSOCKETS_SETTINGS_v3` + +Websockets-related settings of _provider_ including `websocketsApiName`, `websocketsApiRouteSelectionExpression` and `websocketsDescription` are also now supported at `websockets` property. Refer to the [Websocket Guide](/docs/providers/aws/events/websocket.md). + +- `provider.websocketsApiName` -> `provider.websockets.apiName` +- `provider.websocketsApiRouteSelectionExpression` -> `provider.websockets.apiRouteSelectionExpression` +- `provider.websocketsDescription` -> `provider.websockets.description` + +Starting with v4.0.0 old versions of settings will no longer be supported +
 
## Property `variablesResolutionMode` diff --git a/docs/providers/aws/events/websocket.md b/docs/providers/aws/events/websocket.md index 798ab837d8b..e801391e572 100644 --- a/docs/providers/aws/events/websocket.md +++ b/docs/providers/aws/events/websocket.md @@ -76,9 +76,10 @@ service: serverless-ws-test provider: name: aws runtime: nodejs12.x - websocketsApiName: custom-websockets-api-name - websocketsApiRouteSelectionExpression: $request.body.action # custom routes are selected by the value of the action property in the body - websocketsDescription: Custom Serverless Websockets + websockets: + apiName: custom-websockets-api-name + apiRouteSelectionExpression: $request.body.action # custom routes are selected by the value of the action property in the body + description: Custom Serverless Websockets functions: connectionHandler: diff --git a/docs/providers/aws/guide/serverless.yml.md b/docs/providers/aws/guide/serverless.yml.md index 721caf1fd1a..ca658e79895 100644 --- a/docs/providers/aws/guide/serverless.yml.md +++ b/docs/providers/aws/guide/serverless.yml.md @@ -237,12 +237,6 @@ provider: apiName: custom-api-name # Endpoint type for API Gateway REST API: edge or regional (default: edge) endpointType: regional - # Use a custom name for the websockets API - websocketsApiName: custom-websockets-api-name - # custom route selection expression - websocketsApiRouteSelectionExpression: $request.body.route - # Use a custom description for the websockets API - websocketsDescription: Custom Serverless Websockets # Optional API Gateway REST API global config apiGateway: # Attach to an externally created REST API via its ID: @@ -310,6 +304,13 @@ provider: name: GlobalModel # Optional: Description of the API Gateway model description: 'A global model that can be referenced in functions' + # Use a custom name for the websockets API + websockets: + apiName: custom-websockets-api-name + # custom route selection expression + apiRouteSelectionExpression: $request.body.route + # Use a custom description for the websockets API + description: Custom Serverless Websockets ``` ### ALB diff --git a/lib/plugins/aws/lib/naming.js b/lib/plugins/aws/lib/naming.js index a32c4edbc60..feb6696a615 100644 --- a/lib/plugins/aws/lib/naming.js +++ b/lib/plugins/aws/lib/naming.js @@ -207,6 +207,12 @@ module.exports = { // Websockets API getWebsocketsApiName() { + if (_.get(this.provider.serverless.service.provider.websockets)) { + return ( + `${this.provider.serverless.service.provider.websockets.apiName}` || + `${this.provider.getStage()}-${this.provider.serverless.service.service}-websockets` + ); + } if ( this.provider.serverless.service.provider.websocketsApiName && typeof this.provider.serverless.service.provider.websocketsApiName === 'string' diff --git a/lib/plugins/aws/package/compile/events/websockets/lib/api.js b/lib/plugins/aws/package/compile/events/websockets/lib/api.js index b4c39638357..dd54f262f88 100644 --- a/lib/plugins/aws/package/compile/events/websockets/lib/api.js +++ b/lib/plugins/aws/package/compile/events/websockets/lib/api.js @@ -13,9 +13,14 @@ module.exports = { this.websocketsApiLogicalId = this.provider.naming.getWebsocketsApiLogicalId(); - const RouteSelectionExpression = - this.serverless.service.provider.websocketsApiRouteSelectionExpression || - '$request.body.action'; + const RouteSelectionExpression = _.get( + this.provider, + 'serverless.service.provider.websockets.routeSelectionExpression' + ) + ? this.serverless.service.provider.websockets.routeSelectionExpression || + '$request.body.action' + : this.serverless.service.provider.websocketsRouteSelectionExpression || + '$request.body.action'; _.merge(this.serverless.service.provider.compiledCloudFormationTemplate.Resources, { [this.websocketsApiLogicalId]: { @@ -23,8 +28,9 @@ module.exports = { Properties: { Name: this.provider.naming.getWebsocketsApiName(), RouteSelectionExpression, - Description: - this.serverless.service.provider.websocketsDescription || 'Serverless Websockets', + Description: this.serverless.service.provider.websockets + ? this.serverless.service.provider.websockets.description || 'Serverless Websockets' + : this.serverless.service.provider.websocketsDescription || 'Serverless Websockets', ProtocolType: 'WEBSOCKET', }, }, diff --git a/lib/plugins/aws/package/compile/events/websockets/lib/deployment.js b/lib/plugins/aws/package/compile/events/websockets/lib/deployment.js index 60cf98780e4..ef54d86efc5 100644 --- a/lib/plugins/aws/package/compile/events/websockets/lib/deployment.js +++ b/lib/plugins/aws/package/compile/events/websockets/lib/deployment.js @@ -34,8 +34,9 @@ module.exports = { DependsOn: dependentResourceIds, Properties: { ApiId: this.provider.getApiGatewayWebsocketApiId(), - Description: - this.serverless.service.provider.websocketsDescription || 'Serverless Websockets', + Description: this.serverless.service.provider.websockets + ? this.serverless.service.provider.websockets.description + : this.serverless.service.provider.websocketsDescription || 'Serverless Websockets', }, }, }); diff --git a/lib/plugins/aws/package/compile/events/websockets/lib/stage.js b/lib/plugins/aws/package/compile/events/websockets/lib/stage.js index 837f1e09054..f83e03fc84b 100644 --- a/lib/plugins/aws/package/compile/events/websockets/lib/stage.js +++ b/lib/plugins/aws/package/compile/events/websockets/lib/stage.js @@ -30,8 +30,9 @@ module.exports = { ApiId: this.provider.getApiGatewayWebsocketApiId(), // DeploymentId is generated at deployment.js file StageName: this.provider.getStage(), - Description: - this.serverless.service.provider.websocketsDescription || 'Serverless Websockets', + Description: this.serverless.service.provider.websockets + ? this.serverless.service.provider.websockets.description || 'Serverless Websockets' + : this.serverless.service.provider.websocketsDescription || 'Serverless Websockets', }, }; diff --git a/lib/plugins/aws/provider.js b/lib/plugins/aws/provider.js index 1a5ef46b335..bec5f417809 100644 --- a/lib/plugins/aws/provider.js +++ b/lib/plugins/aws/provider.js @@ -1198,6 +1198,15 @@ class AwsProvider { websocketsApiName: { type: 'string' }, websocketsApiRouteSelectionExpression: { type: 'string' }, websocketsDescription: { type: 'string' }, + websockets: { + type: 'object', + properties: { + apiName: { type: 'string' }, + apiRouteSelectionExpression: { type: 'string' }, + description: { type: 'string' }, + }, + additionalProperties: false, + }, }, }, function: { diff --git a/test/unit/lib/plugins/aws/lib/naming.test.js b/test/unit/lib/plugins/aws/lib/naming.test.js index 1c62257e763..efd365d0454 100644 --- a/test/unit/lib/plugins/aws/lib/naming.test.js +++ b/test/unit/lib/plugins/aws/lib/naming.test.js @@ -233,7 +233,7 @@ describe('#naming()', () => { }); }); - describe('#getWebsocketsApiName()', () => { + describe('#get()', () => { it('should return the composition of stage & service name if custom name not provided', () => { serverless.service.service = 'myService'; expect(sdk.naming.getWebsocketsApiName()).to.equal(