/
deployment.js
73 lines (68 loc) · 2.5 KB
/
deployment.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
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
'use strict';
const _ = require('lodash');
const crypto = require('crypto');
const pickWebsocketsTemplatePart = require('./pick-websockets-template-part');
module.exports = {
compileDeployment() {
const dependentResourceIds = _.flatten(
this.validated.events.map((event) => {
const result = [];
if (event.routeResponseSelectionExpression) {
result.push(this.provider.naming.getWebsocketsRouteResponseLogicalId(event.route));
}
result.push(this.provider.naming.getWebsocketsRouteLogicalId(event.route));
return result;
})
);
const websocketsTemplatePart = pickWebsocketsTemplatePart(
this.serverless.service.provider.compiledCloudFormationTemplate,
this.provider.naming.getWebsocketsApiLogicalId()
);
const cfTemplateHash = crypto
.createHash('sha256')
.update(JSON.stringify(websocketsTemplatePart))
.digest('base64');
this.websocketsDeploymentLogicalId =
this.provider.naming.getWebsocketsDeploymentLogicalId(cfTemplateHash);
const resources = this.serverless.service.provider.compiledCloudFormationTemplate.Resources;
_.merge(resources, {
[this.websocketsDeploymentLogicalId]: {
Type: 'AWS::ApiGatewayV2::Deployment',
DependsOn: dependentResourceIds,
Properties: {
ApiId: this.provider.getApiGatewayWebsocketApiId(),
Description:
this.serverless.service.provider.websockets.description || 'Serverless Websockets',
},
},
});
const { apiGateway } = this.serverless.service.provider;
if (apiGateway && apiGateway.websocketApiId) {
resources[this.websocketsDeploymentLogicalId].Properties.StageName = this.provider.getStage();
}
_.merge(this.serverless.service.provider.compiledCloudFormationTemplate.Outputs, {
ServiceEndpointWebsocket: {
Description: 'URL of the service endpoint',
Value: {
'Fn::Join': [
'',
[
'wss://',
this.provider.getApiGatewayWebsocketApiId(),
'.execute-api.',
{ Ref: 'AWS::Region' },
'.',
{ Ref: 'AWS::URLSuffix' },
`/${this.provider.getStage()}`,
],
],
},
},
});
if (resources.WebsocketsDeploymentStage && resources.WebsocketsDeploymentStage.Properties) {
resources.WebsocketsDeploymentStage.Properties.DeploymentId = {
Ref: this.websocketsDeploymentLogicalId,
};
}
},
};