@stacksjs/ts-cloud-core 0.1.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (251) hide show
  1. package/LICENSE.md +21 -0
  2. package/README.md +321 -0
  3. package/package.json +31 -0
  4. package/src/advanced-features.test.ts +465 -0
  5. package/src/aws/cloudformation.ts +421 -0
  6. package/src/aws/cloudfront.ts +158 -0
  7. package/src/aws/credentials.test.ts +132 -0
  8. package/src/aws/credentials.ts +545 -0
  9. package/src/aws/index.ts +87 -0
  10. package/src/aws/s3.test.ts +188 -0
  11. package/src/aws/s3.ts +1088 -0
  12. package/src/aws/signature.test.ts +670 -0
  13. package/src/aws/signature.ts +1155 -0
  14. package/src/backup/disaster-recovery.test.ts +726 -0
  15. package/src/backup/disaster-recovery.ts +500 -0
  16. package/src/backup/index.ts +34 -0
  17. package/src/backup/manager.test.ts +498 -0
  18. package/src/backup/manager.ts +432 -0
  19. package/src/cicd/circleci.ts +430 -0
  20. package/src/cicd/github-actions.ts +424 -0
  21. package/src/cicd/gitlab-ci.ts +255 -0
  22. package/src/cicd/index.ts +8 -0
  23. package/src/cli/history.ts +396 -0
  24. package/src/cli/index.ts +10 -0
  25. package/src/cli/progress.ts +458 -0
  26. package/src/cli/repl.ts +454 -0
  27. package/src/cli/suggestions.ts +327 -0
  28. package/src/cli/table.test.ts +319 -0
  29. package/src/cli/table.ts +332 -0
  30. package/src/cloudformation/builder.test.ts +327 -0
  31. package/src/cloudformation/builder.ts +378 -0
  32. package/src/cloudformation/builders/api-gateway.ts +449 -0
  33. package/src/cloudformation/builders/cache.ts +334 -0
  34. package/src/cloudformation/builders/cdn.ts +278 -0
  35. package/src/cloudformation/builders/compute.ts +485 -0
  36. package/src/cloudformation/builders/database.ts +392 -0
  37. package/src/cloudformation/builders/functions.ts +343 -0
  38. package/src/cloudformation/builders/messaging.ts +140 -0
  39. package/src/cloudformation/builders/monitoring.ts +300 -0
  40. package/src/cloudformation/builders/network.ts +264 -0
  41. package/src/cloudformation/builders/queue.ts +147 -0
  42. package/src/cloudformation/builders/security.ts +399 -0
  43. package/src/cloudformation/builders/storage.ts +285 -0
  44. package/src/cloudformation/index.ts +30 -0
  45. package/src/cloudformation/types.ts +173 -0
  46. package/src/compliance/aws-config.ts +543 -0
  47. package/src/compliance/cloudtrail.ts +376 -0
  48. package/src/compliance/compliance.test.ts +423 -0
  49. package/src/compliance/guardduty.ts +446 -0
  50. package/src/compliance/index.ts +66 -0
  51. package/src/compliance/security-hub.ts +456 -0
  52. package/src/containers/build-optimization.ts +416 -0
  53. package/src/containers/containers.test.ts +508 -0
  54. package/src/containers/image-scanning.ts +360 -0
  55. package/src/containers/index.ts +9 -0
  56. package/src/containers/registry.ts +293 -0
  57. package/src/containers/service-mesh.ts +520 -0
  58. package/src/database/database.test.ts +762 -0
  59. package/src/database/index.ts +9 -0
  60. package/src/database/migrations.ts +444 -0
  61. package/src/database/performance.ts +528 -0
  62. package/src/database/replicas.ts +534 -0
  63. package/src/database/users.ts +494 -0
  64. package/src/dependency-graph.ts +143 -0
  65. package/src/deployment/ab-testing.ts +582 -0
  66. package/src/deployment/blue-green.ts +452 -0
  67. package/src/deployment/canary.ts +500 -0
  68. package/src/deployment/deployment.test.ts +526 -0
  69. package/src/deployment/index.ts +61 -0
  70. package/src/deployment/progressive.ts +62 -0
  71. package/src/dns/dns.test.ts +641 -0
  72. package/src/dns/dnssec.ts +315 -0
  73. package/src/dns/index.ts +8 -0
  74. package/src/dns/resolver.ts +496 -0
  75. package/src/dns/routing.ts +593 -0
  76. package/src/email/advanced/analytics.ts +445 -0
  77. package/src/email/advanced/index.ts +11 -0
  78. package/src/email/advanced/rules.ts +465 -0
  79. package/src/email/advanced/scheduling.ts +352 -0
  80. package/src/email/advanced/search.ts +412 -0
  81. package/src/email/advanced/shared-mailboxes.ts +404 -0
  82. package/src/email/advanced/templates.ts +455 -0
  83. package/src/email/advanced/threading.ts +281 -0
  84. package/src/email/analytics.ts +467 -0
  85. package/src/email/bounce-handling.ts +425 -0
  86. package/src/email/email.test.ts +431 -0
  87. package/src/email/handlers/__tests__/inbound.test.ts +38 -0
  88. package/src/email/handlers/__tests__/outbound.test.ts +37 -0
  89. package/src/email/handlers/converter.ts +227 -0
  90. package/src/email/handlers/feedback.ts +228 -0
  91. package/src/email/handlers/inbound.ts +169 -0
  92. package/src/email/handlers/outbound.ts +178 -0
  93. package/src/email/index.ts +15 -0
  94. package/src/email/reputation.ts +303 -0
  95. package/src/email/templates.ts +352 -0
  96. package/src/errors/index.test.ts +434 -0
  97. package/src/errors/index.ts +416 -0
  98. package/src/health-checks/index.ts +40 -0
  99. package/src/index.ts +360 -0
  100. package/src/intrinsic-functions.ts +118 -0
  101. package/src/lambda/concurrency.ts +330 -0
  102. package/src/lambda/destinations.ts +345 -0
  103. package/src/lambda/dlq.ts +425 -0
  104. package/src/lambda/index.ts +11 -0
  105. package/src/lambda/lambda.test.ts +840 -0
  106. package/src/lambda/layers.ts +263 -0
  107. package/src/lambda/versions.ts +376 -0
  108. package/src/lambda/vpc.ts +399 -0
  109. package/src/local/config.ts +114 -0
  110. package/src/local/index.ts +6 -0
  111. package/src/local/mock-aws.ts +351 -0
  112. package/src/modules/ai.ts +340 -0
  113. package/src/modules/api.ts +478 -0
  114. package/src/modules/auth.ts +805 -0
  115. package/src/modules/cache.ts +417 -0
  116. package/src/modules/cdn.ts +1062 -0
  117. package/src/modules/communication.ts +1094 -0
  118. package/src/modules/compute.ts +3348 -0
  119. package/src/modules/database.ts +554 -0
  120. package/src/modules/deployment.ts +1079 -0
  121. package/src/modules/dns.ts +337 -0
  122. package/src/modules/email.ts +1538 -0
  123. package/src/modules/filesystem.ts +515 -0
  124. package/src/modules/index.ts +32 -0
  125. package/src/modules/messaging.ts +486 -0
  126. package/src/modules/monitoring.ts +2086 -0
  127. package/src/modules/network.ts +664 -0
  128. package/src/modules/parameter-store.ts +325 -0
  129. package/src/modules/permissions.ts +1081 -0
  130. package/src/modules/phone.ts +494 -0
  131. package/src/modules/queue.ts +1260 -0
  132. package/src/modules/redirects.ts +464 -0
  133. package/src/modules/registry.ts +699 -0
  134. package/src/modules/search.ts +401 -0
  135. package/src/modules/secrets.ts +416 -0
  136. package/src/modules/security.ts +731 -0
  137. package/src/modules/sms.ts +389 -0
  138. package/src/modules/storage.ts +1120 -0
  139. package/src/modules/workflow.ts +680 -0
  140. package/src/multi-account/config.ts +521 -0
  141. package/src/multi-account/index.ts +7 -0
  142. package/src/multi-account/manager.ts +427 -0
  143. package/src/multi-region/cross-region.ts +410 -0
  144. package/src/multi-region/index.ts +8 -0
  145. package/src/multi-region/manager.ts +483 -0
  146. package/src/multi-region/regions.ts +435 -0
  147. package/src/network-security/index.ts +48 -0
  148. package/src/observability/index.ts +9 -0
  149. package/src/observability/logs.ts +522 -0
  150. package/src/observability/metrics.ts +460 -0
  151. package/src/observability/observability.test.ts +782 -0
  152. package/src/observability/synthetics.ts +568 -0
  153. package/src/observability/xray.ts +358 -0
  154. package/src/phone/advanced/analytics.ts +349 -0
  155. package/src/phone/advanced/callbacks.ts +428 -0
  156. package/src/phone/advanced/index.ts +8 -0
  157. package/src/phone/advanced/ivr-builder.ts +504 -0
  158. package/src/phone/advanced/recording.ts +310 -0
  159. package/src/phone/handlers/__tests__/incoming-call.test.ts +40 -0
  160. package/src/phone/handlers/incoming-call.ts +117 -0
  161. package/src/phone/handlers/missed-call.ts +116 -0
  162. package/src/phone/handlers/voicemail.ts +179 -0
  163. package/src/phone/index.ts +9 -0
  164. package/src/presets/api-backend.ts +134 -0
  165. package/src/presets/data-pipeline.ts +204 -0
  166. package/src/presets/extend.test.ts +295 -0
  167. package/src/presets/extend.ts +297 -0
  168. package/src/presets/fullstack-app.ts +144 -0
  169. package/src/presets/index.ts +27 -0
  170. package/src/presets/jamstack.ts +135 -0
  171. package/src/presets/microservices.ts +167 -0
  172. package/src/presets/ml-api.ts +208 -0
  173. package/src/presets/nodejs-server.ts +104 -0
  174. package/src/presets/nodejs-serverless.ts +114 -0
  175. package/src/presets/realtime-app.ts +184 -0
  176. package/src/presets/static-site.ts +64 -0
  177. package/src/presets/traditional-web-app.ts +339 -0
  178. package/src/presets/wordpress.ts +138 -0
  179. package/src/preview/github.test.ts +249 -0
  180. package/src/preview/github.ts +297 -0
  181. package/src/preview/index.ts +37 -0
  182. package/src/preview/manager.test.ts +440 -0
  183. package/src/preview/manager.ts +326 -0
  184. package/src/preview/notifications.test.ts +582 -0
  185. package/src/preview/notifications.ts +341 -0
  186. package/src/queue/batch-processing.ts +402 -0
  187. package/src/queue/dlq-monitoring.ts +402 -0
  188. package/src/queue/fifo.ts +342 -0
  189. package/src/queue/index.ts +9 -0
  190. package/src/queue/management.ts +428 -0
  191. package/src/queue/queue.test.ts +429 -0
  192. package/src/resource-mgmt/index.ts +39 -0
  193. package/src/resource-naming.ts +62 -0
  194. package/src/s3/index.ts +523 -0
  195. package/src/schema/cloud-config.schema.json +554 -0
  196. package/src/schema/index.ts +68 -0
  197. package/src/security/certificate-manager.ts +492 -0
  198. package/src/security/index.ts +9 -0
  199. package/src/security/scanning.ts +545 -0
  200. package/src/security/secrets-manager.ts +476 -0
  201. package/src/security/secrets-rotation.ts +456 -0
  202. package/src/security/security.test.ts +738 -0
  203. package/src/sms/advanced/ab-testing.ts +389 -0
  204. package/src/sms/advanced/analytics.ts +336 -0
  205. package/src/sms/advanced/campaigns.ts +523 -0
  206. package/src/sms/advanced/chatbot.ts +224 -0
  207. package/src/sms/advanced/index.ts +10 -0
  208. package/src/sms/advanced/link-tracking.ts +248 -0
  209. package/src/sms/advanced/mms.ts +308 -0
  210. package/src/sms/handlers/__tests__/send.test.ts +40 -0
  211. package/src/sms/handlers/delivery-status.ts +133 -0
  212. package/src/sms/handlers/receive.ts +162 -0
  213. package/src/sms/handlers/send.ts +174 -0
  214. package/src/sms/index.ts +9 -0
  215. package/src/stack-diff.ts +389 -0
  216. package/src/static-site/index.ts +85 -0
  217. package/src/template-builder.ts +110 -0
  218. package/src/template-validator.ts +574 -0
  219. package/src/utils/cache.ts +291 -0
  220. package/src/utils/diff.ts +269 -0
  221. package/src/utils/hash.ts +227 -0
  222. package/src/utils/index.ts +8 -0
  223. package/src/utils/parallel.ts +294 -0
  224. package/src/validators/credentials.test.ts +274 -0
  225. package/src/validators/credentials.ts +233 -0
  226. package/src/validators/quotas.test.ts +434 -0
  227. package/src/validators/quotas.ts +217 -0
  228. package/test/ai.test.ts +327 -0
  229. package/test/api.test.ts +511 -0
  230. package/test/auth.test.ts +632 -0
  231. package/test/cache.test.ts +406 -0
  232. package/test/cdn.test.ts +247 -0
  233. package/test/compute.test.ts +861 -0
  234. package/test/database.test.ts +523 -0
  235. package/test/deployment.test.ts +499 -0
  236. package/test/dns.test.ts +270 -0
  237. package/test/email.test.ts +439 -0
  238. package/test/filesystem.test.ts +382 -0
  239. package/test/integration.test.ts +350 -0
  240. package/test/messaging.test.ts +514 -0
  241. package/test/monitoring.test.ts +634 -0
  242. package/test/network.test.ts +425 -0
  243. package/test/permissions.test.ts +488 -0
  244. package/test/queue.test.ts +484 -0
  245. package/test/registry.test.ts +306 -0
  246. package/test/security.test.ts +462 -0
  247. package/test/storage.test.ts +463 -0
  248. package/test/template-validator.test.ts +559 -0
  249. package/test/workflow.test.ts +592 -0
  250. package/tsconfig.json +16 -0
  251. package/tsconfig.tsbuildinfo +1 -0
@@ -0,0 +1,520 @@
1
+ /**
2
+ * Service Mesh Integration
3
+ * AWS App Mesh configuration for microservices
4
+ */
5
+
6
+ export interface ServiceMesh {
7
+ id: string
8
+ name: string
9
+ meshType: 'app_mesh' | 'istio' | 'linkerd'
10
+ services: MeshService[]
11
+ virtualNodes?: VirtualNode[]
12
+ virtualRouters?: VirtualRouter[]
13
+ virtualGateways?: VirtualGateway[]
14
+ }
15
+
16
+ export interface MeshService {
17
+ id: string
18
+ name: string
19
+ namespace: string
20
+ port: number
21
+ protocol: 'http' | 'http2' | 'grpc' | 'tcp'
22
+ backends?: string[]
23
+ healthCheck?: HealthCheck
24
+ }
25
+
26
+ export interface VirtualNode {
27
+ id: string
28
+ name: string
29
+ serviceName: string
30
+ listeners: Listener[]
31
+ backends?: Backend[]
32
+ serviceDiscovery: ServiceDiscovery
33
+ }
34
+
35
+ export interface Listener {
36
+ port: number
37
+ protocol: 'http' | 'http2' | 'grpc' | 'tcp'
38
+ healthCheck?: HealthCheck
39
+ timeout?: Timeout
40
+ tls?: TLSConfig
41
+ }
42
+
43
+ export interface HealthCheck {
44
+ protocol: 'http' | 'tcp' | 'grpc'
45
+ path?: string
46
+ port?: number
47
+ interval: number // seconds
48
+ timeout: number // seconds
49
+ healthyThreshold: number
50
+ unhealthyThreshold: number
51
+ }
52
+
53
+ export interface Timeout {
54
+ perRequest?: number // milliseconds
55
+ idle?: number // milliseconds
56
+ }
57
+
58
+ export interface TLSConfig {
59
+ mode: 'STRICT' | 'PERMISSIVE' | 'DISABLED'
60
+ certificate?: {
61
+ acm?: string
62
+ file?: {
63
+ certificateChain: string
64
+ privateKey: string
65
+ }
66
+ }
67
+ validation?: {
68
+ trust: {
69
+ acm?: string[]
70
+ file?: {
71
+ certificateChain: string
72
+ }
73
+ }
74
+ }
75
+ }
76
+
77
+ export interface Backend {
78
+ virtualServiceName: string
79
+ clientPolicy?: ClientPolicy
80
+ }
81
+
82
+ export interface ClientPolicy {
83
+ tls?: {
84
+ enforce: boolean
85
+ ports?: number[]
86
+ validation: {
87
+ trust: {
88
+ acm?: string[]
89
+ }
90
+ }
91
+ }
92
+ }
93
+
94
+ export interface ServiceDiscovery {
95
+ type: 'aws_cloud_map' | 'dns'
96
+ namespace?: string
97
+ serviceName?: string
98
+ hostname?: string
99
+ }
100
+
101
+ export interface VirtualRouter {
102
+ id: string
103
+ name: string
104
+ listeners: RouterListener[]
105
+ routes: Route[]
106
+ }
107
+
108
+ export interface RouterListener {
109
+ port: number
110
+ protocol: 'http' | 'http2' | 'grpc' | 'tcp'
111
+ }
112
+
113
+ export interface Route {
114
+ name: string
115
+ match: RouteMatch
116
+ action: RouteAction
117
+ priority?: number
118
+ retryPolicy?: RetryPolicy
119
+ }
120
+
121
+ export interface RouteMatch {
122
+ prefix?: string
123
+ path?: string
124
+ headers?: HeaderMatch[]
125
+ method?: string
126
+ }
127
+
128
+ export interface HeaderMatch {
129
+ name: string
130
+ match?: {
131
+ exact?: string
132
+ prefix?: string
133
+ suffix?: string
134
+ regex?: string
135
+ }
136
+ }
137
+
138
+ export interface RouteAction {
139
+ weightedTargets: WeightedTarget[]
140
+ }
141
+
142
+ export interface WeightedTarget {
143
+ virtualNode: string
144
+ weight: number
145
+ port?: number
146
+ }
147
+
148
+ export interface RetryPolicy {
149
+ maxRetries: number
150
+ perRetryTimeout: number
151
+ httpRetryEvents?: string[]
152
+ tcpRetryEvents?: string[]
153
+ }
154
+
155
+ export interface VirtualGateway {
156
+ id: string
157
+ name: string
158
+ listeners: GatewayListener[]
159
+ logging?: {
160
+ accessLog?: {
161
+ file?: {
162
+ path: string
163
+ }
164
+ }
165
+ }
166
+ }
167
+
168
+ export interface GatewayListener {
169
+ port: number
170
+ protocol: 'http' | 'http2' | 'grpc'
171
+ healthCheck?: HealthCheck
172
+ tls?: TLSConfig
173
+ }
174
+
175
+ /**
176
+ * Service mesh manager
177
+ */
178
+ export class ServiceMeshManager {
179
+ private meshes: Map<string, ServiceMesh> = new Map()
180
+ private virtualNodes: Map<string, VirtualNode> = new Map()
181
+ private virtualRouters: Map<string, VirtualRouter> = new Map()
182
+ private virtualGateways: Map<string, VirtualGateway> = new Map()
183
+ private meshCounter = 0
184
+ private nodeCounter = 0
185
+ private routerCounter = 0
186
+ private gatewayCounter = 0
187
+
188
+ /**
189
+ * Create service mesh
190
+ */
191
+ createMesh(mesh: Omit<ServiceMesh, 'id'>): ServiceMesh {
192
+ const id = `mesh-${Date.now()}-${this.meshCounter++}`
193
+
194
+ const serviceMesh: ServiceMesh = {
195
+ id,
196
+ ...mesh,
197
+ }
198
+
199
+ this.meshes.set(id, serviceMesh)
200
+
201
+ return serviceMesh
202
+ }
203
+
204
+ /**
205
+ * Create App Mesh
206
+ */
207
+ createAppMesh(options: {
208
+ name: string
209
+ services: MeshService[]
210
+ }): ServiceMesh {
211
+ return this.createMesh({
212
+ name: options.name,
213
+ meshType: 'app_mesh',
214
+ services: options.services,
215
+ virtualNodes: [],
216
+ virtualRouters: [],
217
+ virtualGateways: [],
218
+ })
219
+ }
220
+
221
+ /**
222
+ * Create virtual node
223
+ */
224
+ createVirtualNode(node: Omit<VirtualNode, 'id'>): VirtualNode {
225
+ const id = `vnode-${Date.now()}-${this.nodeCounter++}`
226
+
227
+ const virtualNode: VirtualNode = {
228
+ id,
229
+ ...node,
230
+ }
231
+
232
+ this.virtualNodes.set(id, virtualNode)
233
+
234
+ return virtualNode
235
+ }
236
+
237
+ /**
238
+ * Create HTTP virtual node
239
+ */
240
+ createHTTPVirtualNode(options: {
241
+ name: string
242
+ serviceName: string
243
+ port: number
244
+ namespace: string
245
+ }): VirtualNode {
246
+ return this.createVirtualNode({
247
+ name: options.name,
248
+ serviceName: options.serviceName,
249
+ listeners: [
250
+ {
251
+ port: options.port,
252
+ protocol: 'http',
253
+ healthCheck: {
254
+ protocol: 'http',
255
+ path: '/health',
256
+ interval: 30,
257
+ timeout: 10,
258
+ healthyThreshold: 2,
259
+ unhealthyThreshold: 3,
260
+ },
261
+ timeout: {
262
+ perRequest: 15000,
263
+ idle: 300000,
264
+ },
265
+ },
266
+ ],
267
+ serviceDiscovery: {
268
+ type: 'aws_cloud_map',
269
+ namespace: options.namespace,
270
+ serviceName: options.serviceName,
271
+ },
272
+ })
273
+ }
274
+
275
+ /**
276
+ * Create virtual router
277
+ */
278
+ createVirtualRouter(router: Omit<VirtualRouter, 'id'>): VirtualRouter {
279
+ const id = `vrouter-${Date.now()}-${this.routerCounter++}`
280
+
281
+ const virtualRouter: VirtualRouter = {
282
+ id,
283
+ ...router,
284
+ }
285
+
286
+ this.virtualRouters.set(id, virtualRouter)
287
+
288
+ return virtualRouter
289
+ }
290
+
291
+ /**
292
+ * Create canary route
293
+ */
294
+ createCanaryRoute(options: {
295
+ name: string
296
+ port: number
297
+ protocol: 'http' | 'http2' | 'grpc'
298
+ stableTarget: string
299
+ canaryTarget: string
300
+ canaryWeight: number // 0-100
301
+ }): VirtualRouter {
302
+ return this.createVirtualRouter({
303
+ name: options.name,
304
+ listeners: [
305
+ {
306
+ port: options.port,
307
+ protocol: options.protocol,
308
+ },
309
+ ],
310
+ routes: [
311
+ {
312
+ name: 'canary-route',
313
+ match: {
314
+ prefix: '/',
315
+ },
316
+ action: {
317
+ weightedTargets: [
318
+ {
319
+ virtualNode: options.stableTarget,
320
+ weight: 100 - options.canaryWeight,
321
+ },
322
+ {
323
+ virtualNode: options.canaryTarget,
324
+ weight: options.canaryWeight,
325
+ },
326
+ ],
327
+ },
328
+ retryPolicy: {
329
+ maxRetries: 3,
330
+ perRetryTimeout: 5000,
331
+ httpRetryEvents: ['server-error', 'gateway-error'],
332
+ tcpRetryEvents: ['connection-error'],
333
+ },
334
+ },
335
+ ],
336
+ })
337
+ }
338
+
339
+ /**
340
+ * Create virtual gateway
341
+ */
342
+ createVirtualGateway(gateway: Omit<VirtualGateway, 'id'>): VirtualGateway {
343
+ const id = `vgateway-${Date.now()}-${this.gatewayCounter++}`
344
+
345
+ const virtualGateway: VirtualGateway = {
346
+ id,
347
+ ...gateway,
348
+ }
349
+
350
+ this.virtualGateways.set(id, virtualGateway)
351
+
352
+ return virtualGateway
353
+ }
354
+
355
+ /**
356
+ * Create ingress gateway
357
+ */
358
+ createIngressGateway(options: {
359
+ name: string
360
+ port: number
361
+ enableTLS?: boolean
362
+ certificateArn?: string
363
+ }): VirtualGateway {
364
+ const listener: GatewayListener = {
365
+ port: options.port,
366
+ protocol: 'http',
367
+ healthCheck: {
368
+ protocol: 'http',
369
+ path: '/health',
370
+ interval: 30,
371
+ timeout: 10,
372
+ healthyThreshold: 2,
373
+ unhealthyThreshold: 3,
374
+ },
375
+ }
376
+
377
+ if (options.enableTLS && options.certificateArn) {
378
+ listener.tls = {
379
+ mode: 'STRICT',
380
+ certificate: {
381
+ acm: options.certificateArn,
382
+ },
383
+ }
384
+ }
385
+
386
+ return this.createVirtualGateway({
387
+ name: options.name,
388
+ listeners: [listener],
389
+ logging: {
390
+ accessLog: {
391
+ file: {
392
+ path: '/dev/stdout',
393
+ },
394
+ },
395
+ },
396
+ })
397
+ }
398
+
399
+ /**
400
+ * Get mesh
401
+ */
402
+ getMesh(id: string): ServiceMesh | undefined {
403
+ return this.meshes.get(id)
404
+ }
405
+
406
+ /**
407
+ * List meshes
408
+ */
409
+ listMeshes(): ServiceMesh[] {
410
+ return Array.from(this.meshes.values())
411
+ }
412
+
413
+ /**
414
+ * Get virtual node
415
+ */
416
+ getVirtualNode(id: string): VirtualNode | undefined {
417
+ return this.virtualNodes.get(id)
418
+ }
419
+
420
+ /**
421
+ * List virtual nodes
422
+ */
423
+ listVirtualNodes(): VirtualNode[] {
424
+ return Array.from(this.virtualNodes.values())
425
+ }
426
+
427
+ /**
428
+ * Generate CloudFormation for App Mesh
429
+ */
430
+ generateMeshCF(mesh: ServiceMesh): any {
431
+ return {
432
+ Type: 'AWS::AppMesh::Mesh',
433
+ Properties: {
434
+ MeshName: mesh.name,
435
+ Spec: {
436
+ EgressFilter: {
437
+ Type: 'ALLOW_ALL',
438
+ },
439
+ },
440
+ },
441
+ }
442
+ }
443
+
444
+ /**
445
+ * Generate CloudFormation for Virtual Node
446
+ */
447
+ generateVirtualNodeCF(node: VirtualNode, meshName: string): any {
448
+ return {
449
+ Type: 'AWS::AppMesh::VirtualNode',
450
+ Properties: {
451
+ MeshName: meshName,
452
+ VirtualNodeName: node.name,
453
+ Spec: {
454
+ Listeners: node.listeners.map(listener => ({
455
+ PortMapping: {
456
+ Port: listener.port,
457
+ Protocol: listener.protocol,
458
+ },
459
+ ...(listener.healthCheck && {
460
+ HealthCheck: {
461
+ Protocol: listener.healthCheck.protocol,
462
+ ...(listener.healthCheck.path && { Path: listener.healthCheck.path }),
463
+ IntervalMillis: listener.healthCheck.interval * 1000,
464
+ TimeoutMillis: listener.healthCheck.timeout * 1000,
465
+ HealthyThreshold: listener.healthCheck.healthyThreshold,
466
+ UnhealthyThreshold: listener.healthCheck.unhealthyThreshold,
467
+ },
468
+ }),
469
+ })),
470
+ ServiceDiscovery: {
471
+ AWSCloudMap: {
472
+ NamespaceName: node.serviceDiscovery.namespace,
473
+ ServiceName: node.serviceDiscovery.serviceName,
474
+ },
475
+ },
476
+ },
477
+ },
478
+ }
479
+ }
480
+
481
+ /**
482
+ * Generate CloudFormation for Virtual Router
483
+ */
484
+ generateVirtualRouterCF(router: VirtualRouter, meshName: string): any {
485
+ return {
486
+ Type: 'AWS::AppMesh::VirtualRouter',
487
+ Properties: {
488
+ MeshName: meshName,
489
+ VirtualRouterName: router.name,
490
+ Spec: {
491
+ Listeners: router.listeners.map(listener => ({
492
+ PortMapping: {
493
+ Port: listener.port,
494
+ Protocol: listener.protocol,
495
+ },
496
+ })),
497
+ },
498
+ },
499
+ }
500
+ }
501
+
502
+ /**
503
+ * Clear all data
504
+ */
505
+ clear(): void {
506
+ this.meshes.clear()
507
+ this.virtualNodes.clear()
508
+ this.virtualRouters.clear()
509
+ this.virtualGateways.clear()
510
+ this.meshCounter = 0
511
+ this.nodeCounter = 0
512
+ this.routerCounter = 0
513
+ this.gatewayCounter = 0
514
+ }
515
+ }
516
+
517
+ /**
518
+ * Global service mesh manager instance
519
+ */
520
+ export const serviceMeshManager: ServiceMeshManager = new ServiceMeshManager()