/
api.js
51 lines (42 loc) · 1.65 KB
/
api.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
'use strict';
const _ = require('lodash');
module.exports = {
compileApi() {
const apiGateway = this.serverless.service.provider.apiGateway || {};
// immediately return if we're using an external websocket API id
if (apiGateway.websocketApiId) {
return;
}
this.websocketsApiLogicalId = this.provider.naming.getWebsocketsApiLogicalId();
const RouteSelectionExpression =
this.serverless.service.provider.websockets.apiRouteSelectionExpression ||
'$request.body.action';
_.merge(this.serverless.service.provider.compiledCloudFormationTemplate.Resources, {
[this.websocketsApiLogicalId]: {
Type: 'AWS::ApiGatewayV2::Api',
Properties: {
Name: this.provider.naming.getWebsocketsApiName(),
RouteSelectionExpression,
Description:
this.serverless.service.provider.websockets.description || 'Serverless Websockets',
ProtocolType: 'WEBSOCKET',
},
},
});
const defaultRoleResource =
this.serverless.service.provider.compiledCloudFormationTemplate.Resources[
this.provider.naming.getRoleLogicalId()
];
if (defaultRoleResource) {
// insert policy that allows functions to postToConnection
const websocketsPolicy = {
Effect: 'Allow',
Action: ['execute-api:ManageConnections'],
Resource: [{ 'Fn::Sub': 'arn:${AWS::Partition}:execute-api:*:*:*/@connections/*' }],
};
this.serverless.service.provider.compiledCloudFormationTemplate.Resources[
this.provider.naming.getRoleLogicalId()
].Properties.Policies[0].PolicyDocument.Statement.push(websocketsPolicy);
}
},
};