@btc-embedded/cdk-extensions 0.20.0 → 0.20.2

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 (47) hide show
  1. package/.jsii +529 -45
  2. package/API.md +491 -15
  3. package/CHANGELOG.md +26 -0
  4. package/lib/constructs/EventPipe.js +1 -1
  5. package/lib/constructs/ExportedService.d.ts +141 -0
  6. package/lib/constructs/ExportedService.js +139 -0
  7. package/lib/constructs/S3Bucket.js +1 -1
  8. package/lib/constructs/SecureRestApi.js +1 -1
  9. package/lib/constructs/SecureRestApiV2.js +1 -1
  10. package/lib/constructs/index.d.ts +1 -0
  11. package/lib/constructs/index.js +2 -1
  12. package/lib/extensions/ApiGatewayExtension.js +1 -1
  13. package/lib/extensions/ApplicationLoadBalancerExtension.js +1 -1
  14. package/lib/extensions/ApplicationLoadBalancerExtensionV2.js +1 -1
  15. package/lib/extensions/CloudMapExtension.d.ts +16 -0
  16. package/lib/extensions/CloudMapExtension.js +11 -2
  17. package/lib/extensions/DeactivatableServiceExtension.js +1 -1
  18. package/lib/extensions/DocumentDbAccessExtension.js +1 -1
  19. package/lib/extensions/DomainEventMessagingExtension.js +1 -1
  20. package/lib/extensions/EfsMountExtension.js +1 -1
  21. package/lib/extensions/ExtraContainerExtension.js +1 -1
  22. package/lib/extensions/HTTPApiExtension.js +1 -1
  23. package/lib/extensions/LogExtension.js +1 -1
  24. package/lib/extensions/ModifyContainerDefinitionExtension.js +1 -1
  25. package/lib/extensions/ModifyTaskDefinitionExtension.js +1 -1
  26. package/lib/extensions/OpenIdExtension.js +1 -1
  27. package/lib/extensions/OpenTelemetryExtension.js +1 -1
  28. package/lib/extensions/PostgresDbAccessExtension.js +1 -1
  29. package/lib/extensions/SharedVolumeExtension.js +1 -1
  30. package/lib/extensions/TcpKeepAliveExtension.js +1 -1
  31. package/lib/platform/ApiGateway.js +1 -1
  32. package/lib/platform/ApiGatewayVpcLink.js +2 -2
  33. package/lib/platform/ApplicationLoadBalancer.js +1 -1
  34. package/lib/platform/ApplicationLoadBalancerV2.d.ts +9 -6
  35. package/lib/platform/ApplicationLoadBalancerV2.js +6 -4
  36. package/lib/platform/BTCLogGroup.js +1 -1
  37. package/lib/platform/CognitoUserPool.js +2 -2
  38. package/lib/platform/DefaultUserPoolClients.js +1 -1
  39. package/lib/platform/DocumentDB.js +2 -2
  40. package/lib/platform/EcsCluster.js +1 -1
  41. package/lib/platform/EfsFileSystem.js +1 -1
  42. package/lib/platform/PrivateDnsNamespace.js +1 -1
  43. package/lib/platform/ResourceServer.js +1 -1
  44. package/lib/platform/Vpc.js +1 -1
  45. package/lib/platform/VpcV2.js +3 -3
  46. package/lib/utils/StackParameter.js +1 -1
  47. package/package.json +1 -1
package/API.md CHANGED
@@ -2896,6 +2896,253 @@ public readonly role: Role;
2896
2896
  ---
2897
2897
 
2898
2898
 
2899
+ ### ExportedService <a name="ExportedService" id="@btc-embedded/cdk-extensions.ExportedService"></a>
2900
+
2901
+ - *Implements:* <a href="#@btc-embedded/cdk-extensions.IExportedService">IExportedService</a>
2902
+
2903
+ Represents an ECS service exported from another CDK stack.
2904
+
2905
+ This construct enables cross-stack service connectivity by transporting service
2906
+ metadata (security group ID and namespace) across stack boundaries using StackParameter.
2907
+ The port must be specified when importing the service.
2908
+
2909
+ On the provider side (where the service is defined), use ExportedService
2910
+ within the CloudMapExtension to expose the service. On the consumer side,
2911
+ use ExportedService.fromAttributes() to import the service with the port.
2912
+
2913
+ *Example*
2914
+
2915
+ ```typescript
2916
+ // Consumer side
2917
+ const exportedService = ExportedService.fromAttributes(scope, id, {
2918
+ stackName: 'my-service-stack',
2919
+ serviceName: 'my-service',
2920
+ port: 8080,
2921
+ });
2922
+
2923
+ exportedService.allowFrom(myService);
2924
+ const url = exportedService.apiUrl();
2925
+ ```
2926
+
2927
+
2928
+ #### Initializers <a name="Initializers" id="@btc-embedded/cdk-extensions.ExportedService.Initializer"></a>
2929
+
2930
+ ```typescript
2931
+ import { ExportedService } from '@btc-embedded/cdk-extensions'
2932
+
2933
+ new ExportedService(scope: Construct, id: string, props: ExportedServiceProps)
2934
+ ```
2935
+
2936
+ | **Name** | **Type** | **Description** |
2937
+ | --- | --- | --- |
2938
+ | <code><a href="#@btc-embedded/cdk-extensions.ExportedService.Initializer.parameter.scope">scope</a></code> | <code>constructs.Construct</code> | *No description.* |
2939
+ | <code><a href="#@btc-embedded/cdk-extensions.ExportedService.Initializer.parameter.id">id</a></code> | <code>string</code> | *No description.* |
2940
+ | <code><a href="#@btc-embedded/cdk-extensions.ExportedService.Initializer.parameter.props">props</a></code> | <code><a href="#@btc-embedded/cdk-extensions.ExportedServiceProps">ExportedServiceProps</a></code> | *No description.* |
2941
+
2942
+ ---
2943
+
2944
+ ##### `scope`<sup>Required</sup> <a name="scope" id="@btc-embedded/cdk-extensions.ExportedService.Initializer.parameter.scope"></a>
2945
+
2946
+ - *Type:* constructs.Construct
2947
+
2948
+ ---
2949
+
2950
+ ##### `id`<sup>Required</sup> <a name="id" id="@btc-embedded/cdk-extensions.ExportedService.Initializer.parameter.id"></a>
2951
+
2952
+ - *Type:* string
2953
+
2954
+ ---
2955
+
2956
+ ##### `props`<sup>Required</sup> <a name="props" id="@btc-embedded/cdk-extensions.ExportedService.Initializer.parameter.props"></a>
2957
+
2958
+ - *Type:* <a href="#@btc-embedded/cdk-extensions.ExportedServiceProps">ExportedServiceProps</a>
2959
+
2960
+ ---
2961
+
2962
+ #### Methods <a name="Methods" id="Methods"></a>
2963
+
2964
+ | **Name** | **Description** |
2965
+ | --- | --- |
2966
+ | <code><a href="#@btc-embedded/cdk-extensions.ExportedService.toString">toString</a></code> | Returns a string representation of this construct. |
2967
+ | <code><a href="#@btc-embedded/cdk-extensions.ExportedService.allowFrom">allowFrom</a></code> | Allow an ECS service to connect to this exported service. |
2968
+ | <code><a href="#@btc-embedded/cdk-extensions.ExportedService.apiUrl">apiUrl</a></code> | Get the internal API URL of the service. |
2969
+
2970
+ ---
2971
+
2972
+ ##### `toString` <a name="toString" id="@btc-embedded/cdk-extensions.ExportedService.toString"></a>
2973
+
2974
+ ```typescript
2975
+ public toString(): string
2976
+ ```
2977
+
2978
+ Returns a string representation of this construct.
2979
+
2980
+ ##### `allowFrom` <a name="allowFrom" id="@btc-embedded/cdk-extensions.ExportedService.allowFrom"></a>
2981
+
2982
+ ```typescript
2983
+ public allowFrom(service: Service, description?: string): void
2984
+ ```
2985
+
2986
+ Allow an ECS service to connect to this exported service.
2987
+
2988
+ This method adds a security group ingress rule allowing traffic from the
2989
+ given service to this exported service on its configured port.
2990
+
2991
+ ###### `service`<sup>Required</sup> <a name="service" id="@btc-embedded/cdk-extensions.ExportedService.allowFrom.parameter.service"></a>
2992
+
2993
+ - *Type:* @aws-cdk-containers/ecs-service-extensions.Service
2994
+
2995
+ The ECS service to allow connections from.
2996
+
2997
+ ---
2998
+
2999
+ ###### `description`<sup>Optional</sup> <a name="description" id="@btc-embedded/cdk-extensions.ExportedService.allowFrom.parameter.description"></a>
3000
+
3001
+ - *Type:* string
3002
+
3003
+ Optional description for the security group rule.
3004
+
3005
+ ---
3006
+
3007
+ ##### `apiUrl` <a name="apiUrl" id="@btc-embedded/cdk-extensions.ExportedService.apiUrl"></a>
3008
+
3009
+ ```typescript
3010
+ public apiUrl(): string
3011
+ ```
3012
+
3013
+ Get the internal API URL of the service.
3014
+
3015
+ The URL format is: http://<service-name>.<namespace>:<port>/
3016
+
3017
+ #### Static Functions <a name="Static Functions" id="Static Functions"></a>
3018
+
3019
+ | **Name** | **Description** |
3020
+ | --- | --- |
3021
+ | <code><a href="#@btc-embedded/cdk-extensions.ExportedService.isConstruct">isConstruct</a></code> | Checks if `x` is a construct. |
3022
+ | <code><a href="#@btc-embedded/cdk-extensions.ExportedService.fromAttributes">fromAttributes</a></code> | Import an ExportedService from another stack. |
3023
+
3024
+ ---
3025
+
3026
+ ##### `isConstruct` <a name="isConstruct" id="@btc-embedded/cdk-extensions.ExportedService.isConstruct"></a>
3027
+
3028
+ ```typescript
3029
+ import { ExportedService } from '@btc-embedded/cdk-extensions'
3030
+
3031
+ ExportedService.isConstruct(x: any)
3032
+ ```
3033
+
3034
+ Checks if `x` is a construct.
3035
+
3036
+ Use this method instead of `instanceof` to properly detect `Construct`
3037
+ instances, even when the construct library is symlinked.
3038
+
3039
+ Explanation: in JavaScript, multiple copies of the `constructs` library on
3040
+ disk are seen as independent, completely different libraries. As a
3041
+ consequence, the class `Construct` in each copy of the `constructs` library
3042
+ is seen as a different class, and an instance of one class will not test as
3043
+ `instanceof` the other class. `npm install` will not create installations
3044
+ like this, but users may manually symlink construct libraries together or
3045
+ use a monorepo tool: in those cases, multiple copies of the `constructs`
3046
+ library can be accidentally installed, and `instanceof` will behave
3047
+ unpredictably. It is safest to avoid using `instanceof`, and using
3048
+ this type-testing method instead.
3049
+
3050
+ ###### `x`<sup>Required</sup> <a name="x" id="@btc-embedded/cdk-extensions.ExportedService.isConstruct.parameter.x"></a>
3051
+
3052
+ - *Type:* any
3053
+
3054
+ Any object.
3055
+
3056
+ ---
3057
+
3058
+ ##### `fromAttributes` <a name="fromAttributes" id="@btc-embedded/cdk-extensions.ExportedService.fromAttributes"></a>
3059
+
3060
+ ```typescript
3061
+ import { ExportedService } from '@btc-embedded/cdk-extensions'
3062
+
3063
+ ExportedService.fromAttributes(scope: Construct, id: string, attrs: ExportedServiceLookupOptions)
3064
+ ```
3065
+
3066
+ Import an ExportedService from another stack.
3067
+
3068
+ This method imports the service metadata (security group and namespace)
3069
+ that was exported by the provider stack and constructs an IExportedService
3070
+ instance that can be used for establishing connections.
3071
+
3072
+ ###### `scope`<sup>Required</sup> <a name="scope" id="@btc-embedded/cdk-extensions.ExportedService.fromAttributes.parameter.scope"></a>
3073
+
3074
+ - *Type:* constructs.Construct
3075
+
3076
+ The scope in which to define the construct.
3077
+
3078
+ ---
3079
+
3080
+ ###### `id`<sup>Required</sup> <a name="id" id="@btc-embedded/cdk-extensions.ExportedService.fromAttributes.parameter.id"></a>
3081
+
3082
+ - *Type:* string
3083
+
3084
+ The construct ID.
3085
+
3086
+ ---
3087
+
3088
+ ###### `attrs`<sup>Required</sup> <a name="attrs" id="@btc-embedded/cdk-extensions.ExportedService.fromAttributes.parameter.attrs"></a>
3089
+
3090
+ - *Type:* <a href="#@btc-embedded/cdk-extensions.ExportedServiceLookupOptions">ExportedServiceLookupOptions</a>
3091
+
3092
+ The exported service lookup options (stackName, serviceName, and port).
3093
+
3094
+ ---
3095
+
3096
+ #### Properties <a name="Properties" id="Properties"></a>
3097
+
3098
+ | **Name** | **Type** | **Description** |
3099
+ | --- | --- | --- |
3100
+ | <code><a href="#@btc-embedded/cdk-extensions.ExportedService.property.node">node</a></code> | <code>constructs.Node</code> | The tree node. |
3101
+ | <code><a href="#@btc-embedded/cdk-extensions.ExportedService.property.connections">connections</a></code> | <code>aws-cdk-lib.aws_ec2.Connections</code> | Get the connections object for this service. |
3102
+ | <code><a href="#@btc-embedded/cdk-extensions.ExportedService.property.securityGroup">securityGroup</a></code> | <code>aws-cdk-lib.aws_ec2.ISecurityGroup</code> | The security group of the exported ECS service. |
3103
+
3104
+ ---
3105
+
3106
+ ##### `node`<sup>Required</sup> <a name="node" id="@btc-embedded/cdk-extensions.ExportedService.property.node"></a>
3107
+
3108
+ ```typescript
3109
+ public readonly node: Node;
3110
+ ```
3111
+
3112
+ - *Type:* constructs.Node
3113
+
3114
+ The tree node.
3115
+
3116
+ ---
3117
+
3118
+ ##### `connections`<sup>Required</sup> <a name="connections" id="@btc-embedded/cdk-extensions.ExportedService.property.connections"></a>
3119
+
3120
+ ```typescript
3121
+ public readonly connections: Connections;
3122
+ ```
3123
+
3124
+ - *Type:* aws-cdk-lib.aws_ec2.Connections
3125
+
3126
+ Get the connections object for this service.
3127
+
3128
+ This allows the ExportedService to be used with the standard CDK IConnectable
3129
+ pattern for security group management.
3130
+
3131
+ ---
3132
+
3133
+ ##### `securityGroup`<sup>Required</sup> <a name="securityGroup" id="@btc-embedded/cdk-extensions.ExportedService.property.securityGroup"></a>
3134
+
3135
+ ```typescript
3136
+ public readonly securityGroup: ISecurityGroup;
3137
+ ```
3138
+
3139
+ - *Type:* aws-cdk-lib.aws_ec2.ISecurityGroup
3140
+
3141
+ The security group of the exported ECS service.
3142
+
3143
+ ---
3144
+
3145
+
2899
3146
  ### PrivateDnsNamespace <a name="PrivateDnsNamespace" id="@btc-embedded/cdk-extensions.PrivateDnsNamespace"></a>
2900
3147
 
2901
3148
  - *Implements:* <a href="#@btc-embedded/cdk-extensions.IPrivateDnsNamespace">IPrivateDnsNamespace</a>
@@ -5485,10 +5732,10 @@ const applicationLoadBalancerPropsV2: ApplicationLoadBalancerPropsV2 = { ... }
5485
5732
  | --- | --- | --- |
5486
5733
  | <code><a href="#@btc-embedded/cdk-extensions.ApplicationLoadBalancerPropsV2.property.healtCheckPath">healtCheckPath</a></code> | <code>string</code> | The health check path for the target group. |
5487
5734
  | <code><a href="#@btc-embedded/cdk-extensions.ApplicationLoadBalancerPropsV2.property.hostedZone">hostedZone</a></code> | <code>aws-cdk-lib.aws_route53.IHostedZone</code> | The Route 53 hosted zone where the ALB's DNS record will be created. |
5488
- | <code><a href="#@btc-embedded/cdk-extensions.ApplicationLoadBalancerPropsV2.property.recordName">recordName</a></code> | <code>string</code> | The domain prefix or record name for configuring the ALB domain. |
5489
5735
  | <code><a href="#@btc-embedded/cdk-extensions.ApplicationLoadBalancerPropsV2.property.trafficPort">trafficPort</a></code> | <code>number</code> | The port on which the target group will receive traffic. |
5490
5736
  | <code><a href="#@btc-embedded/cdk-extensions.ApplicationLoadBalancerPropsV2.property.userPool">userPool</a></code> | <code><a href="#@btc-embedded/cdk-extensions.ICognitoUserPool">ICognitoUserPool</a></code> | The Cognito User Pool of this base platform. |
5491
5737
  | <code><a href="#@btc-embedded/cdk-extensions.ApplicationLoadBalancerPropsV2.property.vpc">vpc</a></code> | <code>aws-cdk-lib.aws_ec2.IVpc</code> | The VPC in which the Application Load Balancer will be deployed. |
5738
+ | <code><a href="#@btc-embedded/cdk-extensions.ApplicationLoadBalancerPropsV2.property.recordName">recordName</a></code> | <code>string</code> | The domain prefix or record name for configuring the ALB domain. |
5492
5739
 
5493
5740
  ---
5494
5741
 
@@ -5516,20 +5763,6 @@ The Route 53 hosted zone where the ALB's DNS record will be created.
5516
5763
 
5517
5764
  ---
5518
5765
 
5519
- ##### `recordName`<sup>Required</sup> <a name="recordName" id="@btc-embedded/cdk-extensions.ApplicationLoadBalancerPropsV2.property.recordName"></a>
5520
-
5521
- ```typescript
5522
- public readonly recordName: string;
5523
- ```
5524
-
5525
- - *Type:* string
5526
-
5527
- The domain prefix or record name for configuring the ALB domain.
5528
-
5529
- This name is used to register an A record in the given hosted zone.
5530
-
5531
- ---
5532
-
5533
5766
  ##### `trafficPort`<sup>Required</sup> <a name="trafficPort" id="@btc-embedded/cdk-extensions.ApplicationLoadBalancerPropsV2.property.trafficPort"></a>
5534
5767
 
5535
5768
  ```typescript
@@ -5566,6 +5799,22 @@ The VPC in which the Application Load Balancer will be deployed.
5566
5799
 
5567
5800
  ---
5568
5801
 
5802
+ ##### `recordName`<sup>Optional</sup> <a name="recordName" id="@btc-embedded/cdk-extensions.ApplicationLoadBalancerPropsV2.property.recordName"></a>
5803
+
5804
+ ```typescript
5805
+ public readonly recordName: string;
5806
+ ```
5807
+
5808
+ - *Type:* string
5809
+ - *Default:* zone root
5810
+
5811
+ The domain prefix or record name for configuring the ALB domain.
5812
+
5813
+ This name is used to register an A record in the given hosted zone. If not
5814
+ provided, the zone's root will be used.
5815
+
5816
+ ---
5817
+
5569
5818
  ### ApplicationLoadBalancerV2LookupOptions <a name="ApplicationLoadBalancerV2LookupOptions" id="@btc-embedded/cdk-extensions.ApplicationLoadBalancerV2LookupOptions"></a>
5570
5819
 
5571
5820
  #### Initializer <a name="Initializer" id="@btc-embedded/cdk-extensions.ApplicationLoadBalancerV2LookupOptions.Initializer"></a>
@@ -5833,6 +6082,7 @@ const cloudMapExtensionProps: CloudMapExtensionProps = { ... }
5833
6082
  | **Name** | **Type** | **Description** |
5834
6083
  | --- | --- | --- |
5835
6084
  | <code><a href="#@btc-embedded/cdk-extensions.CloudMapExtensionProps.property.platformStackName">platformStackName</a></code> | <code>string</code> | The name of the platform stack to import the namespace parameter details from. |
6085
+ | <code><a href="#@btc-embedded/cdk-extensions.CloudMapExtensionProps.property.exportService">exportService</a></code> | <code>boolean</code> | Whether to export this service for cross-stack consumption. |
5836
6086
 
5837
6087
  ---
5838
6088
 
@@ -5848,6 +6098,23 @@ The name of the platform stack to import the namespace parameter details from.
5848
6098
 
5849
6099
  ---
5850
6100
 
6101
+ ##### `exportService`<sup>Optional</sup> <a name="exportService" id="@btc-embedded/cdk-extensions.CloudMapExtensionProps.property.exportService"></a>
6102
+
6103
+ ```typescript
6104
+ public readonly exportService: boolean;
6105
+ ```
6106
+
6107
+ - *Type:* boolean
6108
+ - *Default:* false
6109
+
6110
+ Whether to export this service for cross-stack consumption.
6111
+
6112
+ When enabled, the service metadata (security group, namespace, port) is
6113
+ exported as stack parameters, allowing other stacks to import and connect
6114
+ to this service using ExportedService.fromAttributes().
6115
+
6116
+ ---
6117
+
5851
6118
  ### CognitoUserPoolProps <a name="CognitoUserPoolProps" id="@btc-embedded/cdk-extensions.CognitoUserPoolProps"></a>
5852
6119
 
5853
6120
  #### Initializer <a name="Initializer" id="@btc-embedded/cdk-extensions.CognitoUserPoolProps.Initializer"></a>
@@ -8029,6 +8296,122 @@ public readonly logGroup: ILogGroup;
8029
8296
 
8030
8297
  ---
8031
8298
 
8299
+ ### ExportedServiceLookupOptions <a name="ExportedServiceLookupOptions" id="@btc-embedded/cdk-extensions.ExportedServiceLookupOptions"></a>
8300
+
8301
+ Options for importing an ExportedService from another stack.
8302
+
8303
+ #### Initializer <a name="Initializer" id="@btc-embedded/cdk-extensions.ExportedServiceLookupOptions.Initializer"></a>
8304
+
8305
+ ```typescript
8306
+ import { ExportedServiceLookupOptions } from '@btc-embedded/cdk-extensions'
8307
+
8308
+ const exportedServiceLookupOptions: ExportedServiceLookupOptions = { ... }
8309
+ ```
8310
+
8311
+ #### Properties <a name="Properties" id="Properties"></a>
8312
+
8313
+ | **Name** | **Type** | **Description** |
8314
+ | --- | --- | --- |
8315
+ | <code><a href="#@btc-embedded/cdk-extensions.ExportedServiceLookupOptions.property.port">port</a></code> | <code>number</code> | The port on which the service is listening. |
8316
+ | <code><a href="#@btc-embedded/cdk-extensions.ExportedServiceLookupOptions.property.serviceName">serviceName</a></code> | <code>string</code> | The name of the exported ECS service. |
8317
+ | <code><a href="#@btc-embedded/cdk-extensions.ExportedServiceLookupOptions.property.stackName">stackName</a></code> | <code>string</code> | The name of the stack where the service was exported. |
8318
+
8319
+ ---
8320
+
8321
+ ##### `port`<sup>Required</sup> <a name="port" id="@btc-embedded/cdk-extensions.ExportedServiceLookupOptions.property.port"></a>
8322
+
8323
+ ```typescript
8324
+ public readonly port: number;
8325
+ ```
8326
+
8327
+ - *Type:* number
8328
+
8329
+ The port on which the service is listening.
8330
+
8331
+ ---
8332
+
8333
+ ##### `serviceName`<sup>Required</sup> <a name="serviceName" id="@btc-embedded/cdk-extensions.ExportedServiceLookupOptions.property.serviceName"></a>
8334
+
8335
+ ```typescript
8336
+ public readonly serviceName: string;
8337
+ ```
8338
+
8339
+ - *Type:* string
8340
+
8341
+ The name of the exported ECS service.
8342
+
8343
+ ---
8344
+
8345
+ ##### `stackName`<sup>Required</sup> <a name="stackName" id="@btc-embedded/cdk-extensions.ExportedServiceLookupOptions.property.stackName"></a>
8346
+
8347
+ ```typescript
8348
+ public readonly stackName: string;
8349
+ ```
8350
+
8351
+ - *Type:* string
8352
+
8353
+ The name of the stack where the service was exported.
8354
+
8355
+ ---
8356
+
8357
+ ### ExportedServiceProps <a name="ExportedServiceProps" id="@btc-embedded/cdk-extensions.ExportedServiceProps"></a>
8358
+
8359
+ Properties for creating a new ExportedService.
8360
+
8361
+ #### Initializer <a name="Initializer" id="@btc-embedded/cdk-extensions.ExportedServiceProps.Initializer"></a>
8362
+
8363
+ ```typescript
8364
+ import { ExportedServiceProps } from '@btc-embedded/cdk-extensions'
8365
+
8366
+ const exportedServiceProps: ExportedServiceProps = { ... }
8367
+ ```
8368
+
8369
+ #### Properties <a name="Properties" id="Properties"></a>
8370
+
8371
+ | **Name** | **Type** | **Description** |
8372
+ | --- | --- | --- |
8373
+ | <code><a href="#@btc-embedded/cdk-extensions.ExportedServiceProps.property.namespaceName">namespaceName</a></code> | <code>string</code> | The namespace name where the service is registered (CloudMap namespace). |
8374
+ | <code><a href="#@btc-embedded/cdk-extensions.ExportedServiceProps.property.securityGroup">securityGroup</a></code> | <code>aws-cdk-lib.aws_ec2.ISecurityGroup</code> | The security group of the ECS service. |
8375
+ | <code><a href="#@btc-embedded/cdk-extensions.ExportedServiceProps.property.serviceName">serviceName</a></code> | <code>string</code> | The name of the ECS service being exported. |
8376
+
8377
+ ---
8378
+
8379
+ ##### `namespaceName`<sup>Required</sup> <a name="namespaceName" id="@btc-embedded/cdk-extensions.ExportedServiceProps.property.namespaceName"></a>
8380
+
8381
+ ```typescript
8382
+ public readonly namespaceName: string;
8383
+ ```
8384
+
8385
+ - *Type:* string
8386
+
8387
+ The namespace name where the service is registered (CloudMap namespace).
8388
+
8389
+ ---
8390
+
8391
+ ##### `securityGroup`<sup>Required</sup> <a name="securityGroup" id="@btc-embedded/cdk-extensions.ExportedServiceProps.property.securityGroup"></a>
8392
+
8393
+ ```typescript
8394
+ public readonly securityGroup: ISecurityGroup;
8395
+ ```
8396
+
8397
+ - *Type:* aws-cdk-lib.aws_ec2.ISecurityGroup
8398
+
8399
+ The security group of the ECS service.
8400
+
8401
+ ---
8402
+
8403
+ ##### `serviceName`<sup>Required</sup> <a name="serviceName" id="@btc-embedded/cdk-extensions.ExportedServiceProps.property.serviceName"></a>
8404
+
8405
+ ```typescript
8406
+ public readonly serviceName: string;
8407
+ ```
8408
+
8409
+ - *Type:* string
8410
+
8411
+ The name of the ECS service being exported.
8412
+
8413
+ ---
8414
+
8032
8415
  ### ExtraContainerExtensionProps <a name="ExtraContainerExtensionProps" id="@btc-embedded/cdk-extensions.ExtraContainerExtensionProps"></a>
8033
8416
 
8034
8417
  #### Initializer <a name="Initializer" id="@btc-embedded/cdk-extensions.ExtraContainerExtensionProps.Initializer"></a>
@@ -10245,6 +10628,7 @@ The created task definition to add containers to.
10245
10628
  | <code><a href="#@btc-embedded/cdk-extensions.CloudMapExtension.property.container">container</a></code> | <code>aws-cdk-lib.aws_ecs.ContainerDefinition</code> | The container for this extension. |
10246
10629
  | <code><a href="#@btc-embedded/cdk-extensions.CloudMapExtension.property.props">props</a></code> | <code><a href="#@btc-embedded/cdk-extensions.CloudMapExtensionProps">CloudMapExtensionProps</a></code> | *No description.* |
10247
10630
  | <code><a href="#@btc-embedded/cdk-extensions.CloudMapExtension.property.serviceName">serviceName</a></code> | <code>string</code> | *No description.* |
10631
+ | <code><a href="#@btc-embedded/cdk-extensions.CloudMapExtension.property.exportedServiceConstruct">exportedServiceConstruct</a></code> | <code><a href="#@btc-embedded/cdk-extensions.ExportedService">ExportedService</a></code> | The exported service construct, if exportService is enabled. |
10248
10632
 
10249
10633
  ---
10250
10634
 
@@ -10297,6 +10681,20 @@ public readonly serviceName: string;
10297
10681
 
10298
10682
  ---
10299
10683
 
10684
+ ##### `exportedServiceConstruct`<sup>Optional</sup> <a name="exportedServiceConstruct" id="@btc-embedded/cdk-extensions.CloudMapExtension.property.exportedServiceConstruct"></a>
10685
+
10686
+ ```typescript
10687
+ public readonly exportedServiceConstruct: ExportedService;
10688
+ ```
10689
+
10690
+ - *Type:* <a href="#@btc-embedded/cdk-extensions.ExportedService">ExportedService</a>
10691
+
10692
+ The exported service construct, if exportService is enabled.
10693
+
10694
+ Available after the service has been configured.
10695
+
10696
+ ---
10697
+
10300
10698
 
10301
10699
  ### DeactivatableServiceExtension <a name="DeactivatableServiceExtension" id="@btc-embedded/cdk-extensions.DeactivatableServiceExtension"></a>
10302
10700
 
@@ -14337,6 +14735,84 @@ The access mode for the grantee.
14337
14735
  ---
14338
14736
 
14339
14737
 
14738
+ ### IExportedService <a name="IExportedService" id="@btc-embedded/cdk-extensions.IExportedService"></a>
14739
+
14740
+ - *Extends:* aws-cdk-lib.aws_ec2.IConnectable
14741
+
14742
+ - *Implemented By:* <a href="#@btc-embedded/cdk-extensions.ExportedService">ExportedService</a>, <a href="#@btc-embedded/cdk-extensions.IExportedService">IExportedService</a>
14743
+
14744
+ Public interface for an ExportedService.
14745
+
14746
+ #### Methods <a name="Methods" id="Methods"></a>
14747
+
14748
+ | **Name** | **Description** |
14749
+ | --- | --- |
14750
+ | <code><a href="#@btc-embedded/cdk-extensions.IExportedService.allowFrom">allowFrom</a></code> | Allow an ECS service to connect to this exported service. |
14751
+ | <code><a href="#@btc-embedded/cdk-extensions.IExportedService.apiUrl">apiUrl</a></code> | Get the internal API URL of the service. |
14752
+
14753
+ ---
14754
+
14755
+ ##### `allowFrom` <a name="allowFrom" id="@btc-embedded/cdk-extensions.IExportedService.allowFrom"></a>
14756
+
14757
+ ```typescript
14758
+ public allowFrom(service: Service, description?: string): void
14759
+ ```
14760
+
14761
+ Allow an ECS service to connect to this exported service.
14762
+
14763
+ ###### `service`<sup>Required</sup> <a name="service" id="@btc-embedded/cdk-extensions.IExportedService.allowFrom.parameter.service"></a>
14764
+
14765
+ - *Type:* @aws-cdk-containers/ecs-service-extensions.Service
14766
+
14767
+ ---
14768
+
14769
+ ###### `description`<sup>Optional</sup> <a name="description" id="@btc-embedded/cdk-extensions.IExportedService.allowFrom.parameter.description"></a>
14770
+
14771
+ - *Type:* string
14772
+
14773
+ ---
14774
+
14775
+ ##### `apiUrl` <a name="apiUrl" id="@btc-embedded/cdk-extensions.IExportedService.apiUrl"></a>
14776
+
14777
+ ```typescript
14778
+ public apiUrl(): string
14779
+ ```
14780
+
14781
+ Get the internal API URL of the service.
14782
+
14783
+ #### Properties <a name="Properties" id="Properties"></a>
14784
+
14785
+ | **Name** | **Type** | **Description** |
14786
+ | --- | --- | --- |
14787
+ | <code><a href="#@btc-embedded/cdk-extensions.IExportedService.property.connections">connections</a></code> | <code>aws-cdk-lib.aws_ec2.Connections</code> | The network connections associated with this resource. |
14788
+ | <code><a href="#@btc-embedded/cdk-extensions.IExportedService.property.securityGroup">securityGroup</a></code> | <code>aws-cdk-lib.aws_ec2.ISecurityGroup</code> | The security group of the exported ECS service. |
14789
+
14790
+ ---
14791
+
14792
+ ##### `connections`<sup>Required</sup> <a name="connections" id="@btc-embedded/cdk-extensions.IExportedService.property.connections"></a>
14793
+
14794
+ ```typescript
14795
+ public readonly connections: Connections;
14796
+ ```
14797
+
14798
+ - *Type:* aws-cdk-lib.aws_ec2.Connections
14799
+
14800
+ The network connections associated with this resource.
14801
+
14802
+ ---
14803
+
14804
+ ##### `securityGroup`<sup>Required</sup> <a name="securityGroup" id="@btc-embedded/cdk-extensions.IExportedService.property.securityGroup"></a>
14805
+
14806
+ ```typescript
14807
+ public readonly securityGroup: ISecurityGroup;
14808
+ ```
14809
+
14810
+ - *Type:* aws-cdk-lib.aws_ec2.ISecurityGroup
14811
+
14812
+ The security group of the exported ECS service.
14813
+
14814
+ ---
14815
+
14340
14816
  ### IPrivateDnsNamespace <a name="IPrivateDnsNamespace" id="@btc-embedded/cdk-extensions.IPrivateDnsNamespace"></a>
14341
14817
 
14342
14818
  - *Implemented By:* <a href="#@btc-embedded/cdk-extensions.PrivateDnsNamespace">PrivateDnsNamespace</a>, <a href="#@btc-embedded/cdk-extensions.IPrivateDnsNamespace">IPrivateDnsNamespace</a>
package/CHANGELOG.md CHANGED
@@ -1,4 +1,30 @@
1
1
 
2
+ ## [0.20.1](https://github.com/btc-embedded/cdk-extensions/compare/v0.20.0...v0.20.1) (2026-01-15)
3
+
4
+
5
+ ### Bug Fixes
6
+
7
+ * vpc creation when vpcName is set ([3e8d1d4](https://github.com/btc-embedded/cdk-extensions/commit/3e8d1d46b194b0cbdfe89c6a0bbcdf53561b9472))
8
+
9
+ ## [0.20.0](https://github.com/btc-embedded/cdk-extensions/compare/v0.19.0...v0.20.0) (2026-01-15)
10
+
11
+
12
+ ### ⚠ BREAKING CHANGES
13
+
14
+ * Provinding VPC and ECS cluster as constructs
15
+
16
+ ### Features
17
+
18
+ * add fargate spot capacity provider to ecs cluster ([72db2cf](https://github.com/btc-embedded/cdk-extensions/commit/72db2cf970526dd3cb65eb8877924e0fb45082bd))
19
+ * Provinding VPC and ECS cluster as constructs ([553f891](https://github.com/btc-embedded/cdk-extensions/commit/553f891b2e66654668eacbbf3e640628ce9a908f))
20
+
21
+
22
+ ### Bug Fixes
23
+
24
+ * code bug ([99bd9f0](https://github.com/btc-embedded/cdk-extensions/commit/99bd9f023875abae2bde5568318c146a410d3cd3))
25
+ * refactor the code ([f633af6](https://github.com/btc-embedded/cdk-extensions/commit/f633af629963cccbb70053619299d70ae7f6e9b2))
26
+ * update doc and vpcv2 instance variables ([c07c72e](https://github.com/btc-embedded/cdk-extensions/commit/c07c72e6b3fbcd3c023600cce72836b8a0b61c4c))
27
+
2
28
  ## [0.19.0](https://github.com/btc-embedded/cdk-extensions/compare/v0.18.1...v0.19.0) (2026-01-14)
3
29
 
4
30
 
@@ -145,5 +145,5 @@ class EventPipe extends construct_1.Construct {
145
145
  }
146
146
  exports.EventPipe = EventPipe;
147
147
  _a = JSII_RTTI_SYMBOL_1;
148
- EventPipe[_a] = { fqn: "@btc-embedded/cdk-extensions.EventPipe", version: "0.20.0" };
148
+ EventPipe[_a] = { fqn: "@btc-embedded/cdk-extensions.EventPipe", version: "0.20.2" };
149
149
  //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiRXZlbnRQaXBlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL2NvbnN0cnVjdHMvRXZlbnRQaXBlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7O0FBQUEsNkNBQTBDO0FBQzFDLGlEQUE2RDtBQUU3RCxxREFBZ0Q7QUFHaEQsd0RBQXFEO0FBQ3JELDBDQUEwQztBQUMxQyx3RUFBdUU7QUFzQ3ZFLElBQVksUUFpQlg7QUFqQkQsV0FBWSxRQUFRO0lBQ2xCOztPQUVHO0lBQ0gsdUJBQVcsQ0FBQTtJQUNYOztPQUVHO0lBQ0gsMkJBQWUsQ0FBQTtJQUNmOztPQUVHO0lBQ0gseUJBQWEsQ0FBQTtJQUNiOztPQUVHO0lBQ0gsMkJBQWUsQ0FBQTtBQUNqQixDQUFDLEVBakJXLFFBQVEsd0JBQVIsUUFBUSxRQWlCbkI7QUFFRDs7R0FFRztBQUNILElBQVksY0FjWDtBQWRELFdBQVksY0FBYztJQUN4Qjs7Ozs7T0FLRztJQUNILDJFQUFnQixDQUFBO0lBQ2hCOzs7O09BSUc7SUFDSCx5RUFBZSxDQUFBO0FBQ2pCLENBQUMsRUFkVyxjQUFjLDhCQUFkLGNBQWMsUUFjekI7QUEyRkQ7O0dBRUc7QUFDSCxNQUFhLFNBQVUsU0FBUSxxQkFBUztJQUd0QyxZQUFZLEtBQWdCLEVBQUUsRUFBVSxFQUFFLEtBQXFCO1FBQzdELEtBQUssQ0FBQyxLQUFLLEVBQUUsRUFBRSxDQUFDLENBQUM7UUFFakIsSUFBSSxrQkFBa0IsR0FDcEIsY0FBYyxJQUFJLEtBQUssQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxNQUFNLENBQUMsWUFBWSxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUM7UUFDekUsSUFBSSw0QkFBNEIsR0FDOUIsWUFBWSxJQUFJLEtBQUssQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxNQUFNLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUM7UUFFckUsSUFBSSxXQUFXLEdBQUcsT0FBTyxJ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QUUsQ0FBQztRQUVQLElBQUksbUJBQU8sQ0FBQyxJQUFJLEVBQUUsV0FBVyxFQUFFO1lBQzdCLEdBQUcsaUJBQWlCO1lBQ3BCLE9BQU8sRUFBRSxJQUFJLENBQUMsSUFBSSxDQUFDLE9BQU87WUFDMUIsTUFBTSxFQUFFLEtBQUssQ0FBQyxNQUFNLENBQUMsUUFBUTtZQUM3QixNQUFNLEVBQUUsU0FBUztZQUNqQixnQkFBZ0IsRUFBRSxnQkFBZ0I7WUFDbEMsZ0JBQWdCLEVBQUUsZ0JBQWdCO1lBQ2xDLFlBQVksRUFBRSxZQUFZO1NBQzNCLENBQUMsQ0FBQztRQUVILEtBQUssQ0FBQyxNQUFNLENBQUMsb0JBQW9CLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQzdDLFdBQVcsRUFBRSxpQkFBaUIsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDMUMsa0JBQWtCLEVBQUUsbUJBQW1CLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQ25ELFFBQVEsRUFBRSxVQUFVLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDO0lBQ2xDLENBQUM7SUFFTyxjQUFjLENBQUMsS0FBcUI7UUFDMUMsT0FBTyxLQUFLLENBQUMsUUFBUSxLQUFLLFNBQVMsSUFBSSxLQUFLLENBQUMsUUFBUSxLQUFLLFFBQVEsQ0FBQyxHQUFHLENBQUM7SUFDekUsQ0FBQzs7QUE5R0gsOEJBK0dDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQW5ub3RhdGlvbnMgfSBmcm9tIFwiYXdzLWNkay1saWJcIjtcbmltcG9ydCB7IFJvbGUsIFNlcnZpY2VQcmluY2lwYWwgfSBmcm9tIFwiYXdzLWNkay1saWIvYXdzLWlhbVwiO1xuaW1wb3J0IHsgSUxvZ0dyb3VwIH0gZnJvbSBcImF3cy1jZGstbGliL2F3cy1sb2dzXCI7XG5pbXBvcnQgeyBDZm5QaXBlIH0gZnJvbSBcImF3cy1jZGstbGliL2F3cy1waXBlc1wiO1xuaW1wb3J0IHsgSVF1ZXVlIH0gZnJvbSBcImF3cy1jZGstbGliL2F3cy1zcXNcIjtcbmltcG9ydCB7IElTdGF0ZU1hY2hpbmUgfSBmcm9tIFwiYXdzLWNkay1saWIvYXdzLXN0ZXBmdW5jdGlvbnNcIjtcbmltcG9ydCB7IENvbnN0cnVjdCB9IGZyb20gXCJjb25zdHJ1Y3RzL2xpYi9jb25zdHJ1Y3RcIjtcbmltcG9ydCB7IEJUQ0xvZ0dyb3VwIH0gZnJvbSBcIi4uL3BsYXRmb3JtXCI7XG5pbXBvcnQgeyBpc0RlYWN0aXZhdGVkQ29uc3RydWN0IH0gZnJvbSBcIi4uL3V0aWxzL2RlYWN0aXZhdGVkQ29uc3RydWN0XCI7XG5cbi8qKlxuICogUHJvcGVydGllcyBmb3IgcGlwZSBjb25zdHJ1Y3Rpb24uXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgRXZlbnRQaXBlUHJvcHMge1xuICAvKipcbiAgICogVGhlIHNvdXJjZSBTUVMgcXVldWUuIE5vIG90aGVyIHNvdXJjZSB0eXBlcyBhcmUgc3VwcG9ydGVkIGF0IHRoZSBtb21lbnQuXG4gICAqL1xuICByZWFkb25seSBzb3VyY2U6IElRdWV1ZTtcblxuICAvKipcbiAgICogVGhlIHRhcmdldCBTUVMgcXVldWUgb3IgdGFyZ2V0IHN0ZXAgZnVuY3Rpb24uXG4gICAqL1xuICByZWFkb25seSB0YXJnZXQ6IFRhcmdldFF1ZXVlIHwgVGFyZ2V0U3RlcEZ1bmN0aW9uO1xuXG4gIC8qKlxuICAgKiBUaGUgcm9sZSB1c2VkIGJ5IHRoZSBldmVudCBwaXBlLiBJZiBvbWl0dGVkLCBhIG5ldyByb2xlIGlzIGNyZWF0ZWQuXG4gICAqL1xuICByZWFkb25seSByb2xlPzogUm9sZTtcblxuICAvKipcbiAgICogQW4gb3B0aW9uYWwgZmlsdGVyIGZvciB0aGUgcGlwZS5cbiAgICovXG4gIHJlYWRvbmx5IGZpbHRlcj86IFBpcGVGaWx0ZXI7XG5cbiAgLyoqXG4gICAqIFNldCB0aGUgbG9nIGxldmVsIGZvciB0aGUgcGlwZS4gQ3JlYXRlcyBhIG5ldyBsb2cgZ3JvdXAsIGlmIGVuYWJsZWQuXG4gICAqIERlZmF1bHQ6IERpc2FibGVkLlxuICAgKi9cbiAgcmVhZG9ubHkgbG9nTGV2ZWw/OiBMb2dMZXZlbDtcblxuICAvKipcbiAgICogVXNlIGFuIGV4aXN0aW5nIGxvZyBncm91cC4gSWYgbm9uZSBpcyBnaXZlbiBhbmQgbG9nZ2luZyBpcyBlbmFibGVkLCBhIG5ldyBsb2cgZ3JvdXAgd2lsbCBiZSBjcmVhdGVkLlxuICAgKi9cbiAgcmVhZG9ubHkgbG9nR3JvdXA/OiBJTG9nR3JvdXA7XG59XG5cbmV4cG9ydCBlbnVtIExvZ0xldmVsIHtcbiAgLyoqXG4gICAqIERlYWN0aXZhdGUgbG9nZ2luZy4gTm8gbG9nIGdyb3VwIHdpbGwgYmUgY3JlYXRlZC5cbiAgICovXG4gIE9GRiA9IFwiT0ZGXCIsXG4gIC8qKlxuICAgKiBPbmx5IGxvZyBlcnJvcnMuXG4gICAqL1xuICBFUlJPUiA9IFwiRVJST1JcIixcbiAgLyoqXG4gICAqIExvZyBlcnJvcnMgYW5kIGluZm9ybWF0aW9uYWwgbWVzc2FnZXMuXG4gICAqL1xuICBJTkZPID0gXCJJTkZPXCIsXG4gIC8qKlxuICAgKiBMb2cgdmVyeSB2ZXJib3NlLlxuICAgKi9cbiAgVFJBQ0UgPSBcIlRSQUNFXCIsXG59XG5cbi8qKlxuICogVGhlIGludm9jYXRpb24gdHlwZSBvZiB0aGUgc3RlcCBmdW5jdGlvbi5cbiAqL1xuZXhwb3J0IGVudW0gSW52b2NhdGlvblR5cGUge1xuICAvKipcbiAgICogKGRlZmF1bHQpIC0gSW52b2tlIHN5bmNocm9ub3VzbHkuIEZvciBtb3JlIGluZm9ybWF0aW9uLCBzZWVcbiAgICogW1N0YXJ0U3luY0V4ZWN1dGlvbl0oaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL3N0ZXAtZnVuY3Rpb25zL2xhdGVzdC9hcGlyZWZlcmVuY2UvQVBJX1N0YXJ0U3luY0V4ZWN1dGlvbi5odG1sKVxuICAgKiBpbiB0aGUgKkFXUyBTdGVwIEZ1bmN0aW9ucyBBUEkgUmVmZXJlbmNlKi5cbiAgICogPiBgUkVRVUVTVF9SRVNQT05TRWAgaXMgbm90IHN1cHBvcnRlZCBmb3IgYFNUQU5EQVJEYCBzdGF0ZSBtYWNoaW5lIHdvcmtmbG93cy5cbiAgICovXG4gIFJFUVVFU1RfUkVTUE9OU0UsXG4gIC8qKlxuICAgKiBJbnZva2UgYXN5bmNocm9ub3VzbHkuIEZvciBtb3JlIGluZm9ybWF0aW9uLCBzZWVcbiAgICogW1N0YXJ0RXhlY3V0aW9uXShodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vc3RlcC1mdW5jdGlvbnMvbGF0ZXN0L2FwaXJlZmVyZW5jZS9BUElfU3RhcnRFeGVjdXRpb24uaHRtbClcbiAgICogaW4gdGhlICpBV1MgU3RlcCBGdW5jdGlvbnMgQVBJIFJlZmVyZW5jZSouXG4gICAqL1xuICBGSVJFX0FORF9GT1JHRVQsXG59XG5cbi8qKlxuICogVGhlIGlucHV0IHRlbXBsYXRlLlxuICogTm90ZSB0aGF0IHNvbWUgdmFsdWVzIGluIHRoZSByZXN1bHRpbmcgY29kZSBzaG91bGQgbm90IGhhdmUgcXVvdGVzIGFyb3VuZCB0aGUgdmFsdWUsIGUuZy4gaWYgYW4gb2JqZWN0XG4gKiBzaGFsbCBiZSBhZGRlZC4gVG8gcmVmbGVjdCB0aGlzLCBhZGQgY3VybHkgYnJhY2tldHMgYXJvdW5kIHRoZSB2YWx1ZSwgZS5nLiBge3s8JC5ib2R5Pn19YC5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBJbnB1dFRlbXBsYXRlIHtcbiAgLyoqXG4gICAqIEBqc2lpIGlnbm9yZVxuICAgKi9cbiAgcmVhZG9ubHkgW2tleTogc3RyaW5nXTogc3RyaW5nO1xufVxuXG4vKipcbiAqIFNRUyBxdWV1ZSBhcyBwaXBlIHRhcmdldC5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBUYXJnZXRRdWV1ZSB7XG4gIHJlYWRvbmx5IHF1ZXVlOiBJUXVldWU7XG59XG5cbi8qKlxuICogU3RlcEZ1bmN0aW9uIGFzIHBpcGUgdGFyZ2V0LlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFRhcmdldFN0ZXBGdW5jdGlvbiB7XG4gIHJlYWRvbmx5IHN0ZXBGdW5jdGlvbjogSVN0YXRlTWFjaGluZTtcbiAgcmVhZG9ubHkgcGFyYW1ldGVycz86IFRhcmdldFN0ZXBGdW5jdGlvblBhcmFtZXRlcnM7XG59XG5cbi8qKlxuICogUGFyYW1ldGVycyBmb3IgYSBzdGVwIGZ1bmN0aW9uIHRhcmdldC5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBUYXJnZXRTdGVwRnVuY3Rpb25QYXJhbWV0ZXJzIHtcbiAgcmVhZG9ubHkgaW5wdXRUZW1wbGF0ZT86IElucHV0VGVtcGxhdGU7XG4gIHJlYWRvbmx5IGludm9jYXRpb25UeXBlPzogSW52b2NhdGlvblR5cGU7XG59XG5cbi8qKlxuICogQmFzZSB0eXBlIGZvciBmaWx0ZXIgcnVsZXMuIE5vdCBhbGwgYXZhaWxhYmxlIHJ1bGVzIGFyZSBjdXJyZW50bHkgaW1wbGVtZW50ZWQuXG4gKi9cbmV4cG9ydCB0eXBlIEZpbHRlclJ1bGUgPVxuICB8IFByZWZpeEZpbHRlclJ1bGVcbiAgfCBTdWZmaXhGaWx0ZXJSdWxlXG4gIHwgQW55dGhpbmdCdXRGaWx0ZXJSdWxlXG4gIHwgRmlsdGVyRXF1YWxzSWdub3JlQ2FzZTtcblxuLyoqXG4gKiBSdWxlIHRoYXQgYSBwcm9wZXJ0eSBoYXMgdG8gc3RhcnQgd2l0aCBhIHByZWZpeC5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBQcmVmaXhGaWx0ZXJSdWxlIHtcbiAgcmVhZG9ubHkgcHJlZml4OiBzdHJpbmcgfCBGaWx0ZXJFcXVhbHNJZ25vcmVDYXNlO1xufVxuXG4vKipcbiAqIFJ1bGUgdGhhdCBhIHByb3BlcnR5IGhhcyB0byBlbmQgd2l0aCBhIHN1ZmZpeC5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBTdWZmaXhGaWx0ZXJSdWxlIHtcbiAgcmVhZG9ubHkgc3VmZml4OiBzdHJpbmcgfCBGaWx0ZXJFcXVhbHNJZ25vcmVDYXNlO1xufVxuXG4vKipcbiAqIFJ1bGUgdGhhdCBhbGxvd3MgYWxsIHZhbHVlcyBleGNlcHQgdGhlIGdpdmVuIG9uZXMuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQW55dGhpbmdCdXRGaWx0ZXJSdWxlIHtcbiAgLyoqXG4gICAqIEBqc2lpIGlnbm9yZVxuICAgKi9cbiAgcmVhZG9ubHkgXCJhbnl0aGluZy1idXRcIjogc3RyaW5nW10gfCBGaWx0ZXJSdWxlO1xufVxuXG4vKipcbiAqIFJ1bGUgdGhhdCBtYXRjaGVzIGEgc3RyaW5nLCBpZ25vcmluZyB0aGUgY2FzZS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBGaWx0ZXJFcXVhbHNJZ25vcmVDYXNlIHtcbiAgLyoqXG4gICAqIEBqc2lpIGlnbm9yZVxuICAgKi9cbiAgcmVhZG9ubHkgXCJlcXVhbHMtaWdub3JlLWNhc2VcIjogc3RyaW5nIHwgc3RyaW5nW107XG59XG5cbi8qKlxuICogQSBmaWx0ZXIgZm9yIG1lc3NhZ2VzIGluIHRoZSBwaXBlLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFBpcGVGaWx0ZXIge1xuICAvKipcbiAgICogVGhlIHJ1bGVzIGZvciBlYWNoIGF0dHJpYnV0ZSBvZiB0aGUgYm9keS5cbiAgICogQGpzaWkgaWdub3JlXG4gICAqL1xuICByZWFkb25seSBba2V5OiBzdHJpbmddOiBGaWx0ZXJSdWxlW107XG59XG5cbi8qKlxuICogQSB3cmFwcGVyIGZvciB0aGUgTDEgZXZlbnQgcGlwZSB3aXRoIHRoZSBhYmlsaXR5IHRvIGRlYWN0aXZhdGUgaXQgd2l0aGluIHRoZSBzdGFjay5cbiAqL1xuZXhwb3J0IGNsYXNzIEV2ZW50UGlwZSBleHRlbmRzIENvbnN0cnVjdCB7XG4gIHB1YmxpYyByZWFkb25seSByb2xlOiBSb2xlO1xuXG4gIGNvbnN0cnVjdG9yKHNjb3BlOiBDb25zdHJ1Y3QsIGlkOiBzdHJpbmcsIHByb3BzOiBFdmVudFBpcGVQcm9wcykge1xuICAgIHN1cGVyKHNjb3BlLCBpZCk7XG5cbiAgICBsZXQgdGFyZ2V0U3RlcEZ1bmN0aW9uID1cbiAgICAgIFwic3RlcEZ1bmN0aW9uXCIgaW4gcHJvcHMudGFyZ2V0ID8gcHJvcHMudGFyZ2V0LnN0ZXBGdW5jdGlvbiA6IHVuZGVmaW5lZDtcbiAgICBsZXQgdGFyZ2V0U3RlcEZ1bmN0aW9uUGFyYW1ldGVycyA9XG4gICAgICBcInBhcmFtZXRlcnNcIiBpbiBwcm9wcy50YXJnZXQgPyBwcm9wcy50YXJnZXQucGFyYW1ldGVycyA6IHVuZGVmaW5lZDtcblxuICAgIGxldCB0YXJnZXRRdWV1ZSA9IFwicXVldWVcIiBpbiBwcm9wcy50YXJnZXQgPyBwcm9wcy50YXJnZXQucXVldWUgOiB1bmRlZmluZWQ7XG5cbiAgICBsZXQgc3FzVGFyZ2V0ID0gdGFyZ2V0UXVldWUgIT09IHVuZGVmaW5lZDtcblxuICAgIGxldCB0YXJnZXRBcm4gPSBzcXNUYXJnZXRcbiAgICAgID8gdGFyZ2V0UXVldWUhLnF1ZXVlQXJuXG4gICAgICA6IHRhcmdldFN0ZXBGdW5jdGlvbiEuc3RhdGVNYWNoaW5lQXJuO1xuXG4gICAgbGV0IGRlc2lyZWRTdGF0ZSA9IFwiUlVOTklOR1wiO1xuICAgIGlmIChpc0RlYWN0aXZhdGVkQ29uc3RydWN0KGlkKSkge1xuICAgICAgQW5ub3RhdGlvbnMub2YodGhpcykuYWRkSW5mbyhgJHtpZH0gaXMgc2V0IGRvIGJlIGRlYWN0aXZhdGVkLmApO1xuICAgICAgZGVzaXJlZFN0YXRlID0gXCJTVE9QUEVEXCI7XG4gICAgfVxuXG4gICAgdGhpcy5yb2xlID1cbiAgICAgIHByb3BzLnJvbGUgfHxcbiAgICAgIG5ldyBSb2xlKHRoaXMsIFwiRXZlbnRQaXBlUm9sZVwiLCB7XG4gICAgICAgIGFzc3VtZWRCeTogbmV3IFNlcnZpY2VQcmluY2lwYWwoXCJwaXBlcy5hbWF6b25hd3MuY29tXCIpLFxuICAgICAgfSk7XG5cbiAgICBsZXQgZmlsdGVyQ3JpdGVyaWEgPSBwcm9wcy5maWx0ZXJcbiAgICAgID8ge1xuICAgICAgICAgIGZpbHRlcnM6IFtcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgcGF0dGVybjogSlNPTi5zdHJpbmdpZnkoe1xuICAgICAgICAgICAgICAgIGJvZHk6IHtcbiAgICAgICAgICAgICAgICAgIC4uLnByb3BzLmZpbHRlcixcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICB9KSxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgXSxcbiAgICAgICAgfVxuICAgICAgOiB1bmRlZmluZWQ7XG5cbiAgICBsZXQgdGFyZ2V0UGFyYW1ldGVyczogQ2ZuUGlwZS5QaXBlVGFyZ2V0UGFyYW1ldGVyc1Byb3BlcnR5ID0ge307XG4gICAgaWYgKHRhcmdldFF1ZXVlKSB7XG4gICAgICB0YXJnZXRQYXJhbWV0ZXJzID0ge1xuICAgICAgICBzcXNRdWV1ZVBhcmFtZXRlcnM6IHtcbiAgICAgICAgICBtZXNzYWdlR3JvdXBJZDogXCJkZWZhdWx0XCIsXG4gICAgICAgIH0sXG4gICAgICB9O1xuICAgIH0gZWxzZSB7XG4gICAgICB0YXJnZXRQYXJhbWV0ZXJzID0ge1xuICAgICAgICBzdGVwRnVuY3Rpb25TdGF0ZU1hY2hpbmVQYXJhbWV0ZXJzOiB7XG4gICAgICAgICAgaW52b2NhdGlvblR5cGU6IHRhcmdldFN0ZXBGdW5jdGlvblBhcmFtZXRlcnM/Lmludm9jYXRpb25UeXBlXG4gICAgICAgICAgICA/IEludm9jYXRpb25UeXBlW3RhcmdldFN0ZXBGdW5jdGlvblBhcmFtZXRlcnMuaW52b2NhdGlvblR5cGVdXG4gICAgICAgICAgICA6IEludm9jYXRpb25UeXBlW0ludm9jYXRpb25UeXBlLlJFUVVFU1RfUkVTUE9OU0VdLFxuICAgICAgICB9LFxuICAgICAgICAuLi4odGFyZ2V0U3RlcEZ1bmN0aW9uUGFyYW1ldGVycz8uaW5wdXRUZW1wbGF0ZSAmJiB7XG4gICAgICAgICAgaW5wdXRUZW1wbGF0ZTogSlNPTi5zdHJpbmdpZnkoXG4gICAgICAgICAgICB0YXJnZXRTdGVwRnVuY3Rpb25QYXJhbWV0ZXJzLmlucHV0VGVtcGxhdGUsXG4gICAgICAgICAgKS5yZXBsYWNlKC9cIlxce1xceyguKz8pXFx9XFx9XCIvLCBcIiQxXCIpLFxuICAgICAgICB9KSxcbiAgICAgIH07XG4gICAgfVxuXG4gICAgbGV0IHNvdXJjZVBhcmFtZXRlcnMgPSB7XG4gICAgICBzcXNRdWV1ZVBhcmFtZXRlcnM6IHtcbiAgICAgICAgYmF0Y2hTaXplOiAxLFxuICAgICAgfSxcbiAgICAgIC4uLihmaWx0ZXJDcml0ZXJpYSAmJiB7IGZpbHRlckNyaXRlcmlhOiBmaWx0ZXJDcml0ZXJpYSB9KSxcbiAgICB9O1xuXG4gICAgY29uc3QgbG9nR3JvdXAgPSB0aGlzLmxvZ2dpbmdFbmFibGVkKHByb3BzKVxuICAgICAgPyAocHJvcHMubG9nR3JvdXAgPz9cbiAgICAgICAgbmV3IEJUQ0xvZ0dyb3VwKHRoaXMsIFwiRXZlbnRQaXBlTG9nR3JvdXBcIiwge1xuICAgICAgICAgIGxvZ1R5cGU6IFwiZXZlbnQtcGlwZVwiLFxuICAgICAgICB9KSlcbiAgICAgIDogdW5kZWZpbmVkO1xuXG4gICAgY29uc3QgcGlwZUNvbmZpZ3VyYXRpb24gPSB0aGlzLmxvZ2dpbmdFbmFibGVkKHByb3BzKVxuICAgICAgPyB7XG4gICAgICAgICAgbG9nQ29uZmlndXJhdGlvbjoge1xuICAgICAgICAgICAgY2xvdWR3YXRjaExvZ3NMb2dEZXN0aW5hdGlvbjoge1xuICAgICAgICAgICAgICBsb2dHcm91cEFybjogbG9nR3JvdXAhLmxvZ0dyb3VwQXJuLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGxldmVsOiBwcm9wcy5sb2dMZXZlbCxcbiAgICAgICAgICB9LFxuICAgICAgICB9XG4gICAgICA6IHt9O1xuXG4gICAgbmV3IENmblBpcGUodGhpcywgXCJFdmVudFBpcGVcIiwge1xuICAgICAgLi4ucGlwZUNvbmZpZ3VyYXRpb24sXG4gICAgICByb2xlQXJuOiB0aGlzLnJvbGUucm9sZUFybixcbiAgICAgIHNvdXJjZTogcHJvcHMuc291cmNlLnF1ZXVlQXJuLFxuICAgICAgdGFyZ2V0OiB0YXJnZXRBcm4sXG4gICAgICBzb3VyY2VQYXJhbWV0ZXJzOiBzb3VyY2VQYXJhbWV0ZXJzLFxuICAgICAgdGFyZ2V0UGFyYW1ldGVyczogdGFyZ2V0UGFyYW1ldGVycyxcbiAgICAgIGRlc2lyZWRTdGF0ZTogZGVzaXJlZFN0YXRlLFxuICAgIH0pO1xuXG4gICAgcHJvcHMuc291cmNlLmdyYW50Q29uc3VtZU1lc3NhZ2VzKHRoaXMucm9sZSk7XG4gICAgdGFyZ2V0UXVldWU/LmdyYW50U2VuZE1lc3NhZ2VzKHRoaXMucm9sZSk7XG4gICAgdGFyZ2V0U3RlcEZ1bmN0aW9uPy5ncmFudFN0YXJ0RXhlY3V0aW9uKHRoaXMucm9sZSk7XG4gICAgbG9nR3JvdXA/LmdyYW50V3JpdGUodGhpcy5yb2xlKTtcbiAgfVxuXG4gIHByaXZhdGUgbG9nZ2luZ0VuYWJsZWQocHJvcHM6IEV2ZW50UGlwZVByb3BzKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHByb3BzLmxvZ0xldmVsICE9PSB1bmRlZmluZWQgJiYgcHJvcHMubG9nTGV2ZWwgIT09IExvZ0xldmVsLk9GRjtcbiAgfVxufVxuIl19