├── .gitignore ├── LICENSE ├── README.md ├── copilot ├── .workspace ├── environments │ └── test │ │ └── manifest.yml ├── queue-consumer │ ├── addons │ │ └── task-protection.yml │ └── manifest.yml └── websocket │ ├── addons │ └── task-protection.yml │ └── manifest.yml ├── queue-consumer ├── .dockerignore ├── Dockerfile ├── README.md ├── index.js ├── lib │ └── protection-manager.js ├── package-lock.json └── package.json └── websocket ├── .dockerignore ├── Dockerfile ├── index.js ├── lib └── protection-manager.js ├── package-lock.json ├── package.json └── public └── index.html /.gitignore: -------------------------------------------------------------------------------- 1 | node_modules 2 | .DS_Store -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | Apache License 2 | Version 2.0, January 2004 3 | http://www.apache.org/licenses/ 4 | 5 | TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION 6 | 7 | 1. Definitions. 8 | 9 | "License" shall mean the terms and conditions for use, reproduction, 10 | and distribution as defined by Sections 1 through 9 of this document. 11 | 12 | "Licensor" shall mean the copyright owner or entity authorized by 13 | the copyright owner that is granting the License. 14 | 15 | "Legal Entity" shall mean the union of the acting entity and all 16 | other entities that control, are controlled by, or are under common 17 | control with that entity. For the purposes of this definition, 18 | "control" means (i) the power, direct or indirect, to cause the 19 | direction or management of such entity, whether by contract or 20 | otherwise, or (ii) ownership of fifty percent (50%) or more of the 21 | outstanding shares, or (iii) beneficial ownership of such entity. 22 | 23 | "You" (or "Your") shall mean an individual or Legal Entity 24 | exercising permissions granted by this License. 25 | 26 | "Source" form shall mean the preferred form for making modifications, 27 | including but not limited to software source code, documentation 28 | source, and configuration files. 29 | 30 | "Object" form shall mean any form resulting from mechanical 31 | transformation or translation of a Source form, including but 32 | not limited to compiled object code, generated documentation, 33 | and conversions to other media types. 34 | 35 | "Work" shall mean the work of authorship, whether in Source or 36 | Object form, made available under the License, as indicated by a 37 | copyright notice that is included in or attached to the work 38 | (an example is provided in the Appendix below). 39 | 40 | "Derivative Works" shall mean any work, whether in Source or Object 41 | form, that is based on (or derived from) the Work and for which the 42 | editorial revisions, annotations, elaborations, or other modifications 43 | represent, as a whole, an original work of authorship. For the purposes 44 | of this License, Derivative Works shall not include works that remain 45 | separable from, or merely link (or bind by name) to the interfaces of, 46 | the Work and Derivative Works thereof. 47 | 48 | "Contribution" shall mean any work of authorship, including 49 | the original version of the Work and any modifications or additions 50 | to that Work or Derivative Works thereof, that is intentionally 51 | submitted to Licensor for inclusion in the Work by the copyright owner 52 | or by an individual or Legal Entity authorized to submit on behalf of 53 | the copyright owner. For the purposes of this definition, "submitted" 54 | means any form of electronic, verbal, or written communication sent 55 | to the Licensor or its representatives, including but not limited to 56 | communication on electronic mailing lists, source code control systems, 57 | and issue tracking systems that are managed by, or on behalf of, the 58 | Licensor for the purpose of discussing and improving the Work, but 59 | excluding communication that is conspicuously marked or otherwise 60 | designated in writing by the copyright owner as "Not a Contribution." 61 | 62 | "Contributor" shall mean Licensor and any individual or Legal Entity 63 | on behalf of whom a Contribution has been received by Licensor and 64 | subsequently incorporated within the Work. 65 | 66 | 2. Grant of Copyright License. Subject to the terms and conditions of 67 | this License, each Contributor hereby grants to You a perpetual, 68 | worldwide, non-exclusive, no-charge, royalty-free, irrevocable 69 | copyright license to reproduce, prepare Derivative Works of, 70 | publicly display, publicly perform, sublicense, and distribute the 71 | Work and such Derivative Works in Source or Object form. 72 | 73 | 3. Grant of Patent License. Subject to the terms and conditions of 74 | this License, each Contributor hereby grants to You a perpetual, 75 | worldwide, non-exclusive, no-charge, royalty-free, irrevocable 76 | (except as stated in this section) patent license to make, have made, 77 | use, offer to sell, sell, import, and otherwise transfer the Work, 78 | where such license applies only to those patent claims licensable 79 | by such Contributor that are necessarily infringed by their 80 | Contribution(s) alone or by combination of their Contribution(s) 81 | with the Work to which such Contribution(s) was submitted. If You 82 | institute patent litigation against any entity (including a 83 | cross-claim or counterclaim in a lawsuit) alleging that the Work 84 | or a Contribution incorporated within the Work constitutes direct 85 | or contributory patent infringement, then any patent licenses 86 | granted to You under this License for that Work shall terminate 87 | as of the date such litigation is filed. 88 | 89 | 4. Redistribution. You may reproduce and distribute copies of the 90 | Work or Derivative Works thereof in any medium, with or without 91 | modifications, and in Source or Object form, provided that You 92 | meet the following conditions: 93 | 94 | (a) You must give any other recipients of the Work or 95 | Derivative Works a copy of this License; and 96 | 97 | (b) You must cause any modified files to carry prominent notices 98 | stating that You changed the files; and 99 | 100 | (c) You must retain, in the Source form of any Derivative Works 101 | that You distribute, all copyright, patent, trademark, and 102 | attribution notices from the Source form of the Work, 103 | excluding those notices that do not pertain to any part of 104 | the Derivative Works; and 105 | 106 | (d) If the Work includes a "NOTICE" text file as part of its 107 | distribution, then any Derivative Works that You distribute must 108 | include a readable copy of the attribution notices contained 109 | within such NOTICE file, excluding those notices that do not 110 | pertain to any part of the Derivative Works, in at least one 111 | of the following places: within a NOTICE text file distributed 112 | as part of the Derivative Works; within the Source form or 113 | documentation, if provided along with the Derivative Works; or, 114 | within a display generated by the Derivative Works, if and 115 | wherever such third-party notices normally appear. The contents 116 | of the NOTICE file are for informational purposes only and 117 | do not modify the License. You may add Your own attribution 118 | notices within Derivative Works that You distribute, alongside 119 | or as an addendum to the NOTICE text from the Work, provided 120 | that such additional attribution notices cannot be construed 121 | as modifying the License. 122 | 123 | You may add Your own copyright statement to Your modifications and 124 | may provide additional or different license terms and conditions 125 | for use, reproduction, or distribution of Your modifications, or 126 | for any such Derivative Works as a whole, provided Your use, 127 | reproduction, and distribution of the Work otherwise complies with 128 | the conditions stated in this License. 129 | 130 | 5. Submission of Contributions. Unless You explicitly state otherwise, 131 | any Contribution intentionally submitted for inclusion in the Work 132 | by You to the Licensor shall be under the terms and conditions of 133 | this License, without any additional terms or conditions. 134 | Notwithstanding the above, nothing herein shall supersede or modify 135 | the terms of any separate license agreement you may have executed 136 | with Licensor regarding such Contributions. 137 | 138 | 6. Trademarks. This License does not grant permission to use the trade 139 | names, trademarks, service marks, or product names of the Licensor, 140 | except as required for reasonable and customary use in describing the 141 | origin of the Work and reproducing the content of the NOTICE file. 142 | 143 | 7. Disclaimer of Warranty. Unless required by applicable law or 144 | agreed to in writing, Licensor provides the Work (and each 145 | Contributor provides its Contributions) on an "AS IS" BASIS, 146 | WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or 147 | implied, including, without limitation, any warranties or conditions 148 | of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A 149 | PARTICULAR PURPOSE. You are solely responsible for determining the 150 | appropriateness of using or redistributing the Work and assume any 151 | risks associated with Your exercise of permissions under this License. 152 | 153 | 8. Limitation of Liability. In no event and under no legal theory, 154 | whether in tort (including negligence), contract, or otherwise, 155 | unless required by applicable law (such as deliberate and grossly 156 | negligent acts) or agreed to in writing, shall any Contributor be 157 | liable to You for damages, including any direct, indirect, special, 158 | incidental, or consequential damages of any character arising as a 159 | result of this License or out of the use or inability to use the 160 | Work (including but not limited to damages for loss of goodwill, 161 | work stoppage, computer failure or malfunction, or any and all 162 | other commercial damages or losses), even if such Contributor 163 | has been advised of the possibility of such damages. 164 | 165 | 9. Accepting Warranty or Additional Liability. While redistributing 166 | the Work or Derivative Works thereof, You may choose to offer, 167 | and charge a fee for, acceptance of support, warranty, indemnity, 168 | or other liability obligations and/or rights consistent with this 169 | License. However, in accepting such obligations, You may act only 170 | on Your own behalf and on Your sole responsibility, not on behalf 171 | of any other Contributor, and only if You agree to indemnify, 172 | defend, and hold each Contributor harmless for any liability 173 | incurred by, or claims asserted against, such Contributor by reason 174 | of your accepting any such warranty or additional liability. 175 | 176 | END OF TERMS AND CONDITIONS 177 | 178 | APPENDIX: How to apply the Apache License to your work. 179 | 180 | To apply the Apache License to your work, attach the following 181 | boilerplate notice, with the fields enclosed by brackets "[]" 182 | replaced with your own identifying information. (Don't include 183 | the brackets!) The text should be enclosed in the appropriate 184 | comment syntax for the file format. We also recommend that a 185 | file or class name and description of purpose be included on the 186 | same "printed page" as the copyright notice for easier 187 | identification within third-party archives. 188 | 189 | Copyright [yyyy] [name of copyright owner] 190 | 191 | Licensed under the Apache License, Version 2.0 (the "License"); 192 | you may not use this file except in compliance with the License. 193 | You may obtain a copy of the License at 194 | 195 | http://www.apache.org/licenses/LICENSE-2.0 196 | 197 | Unless required by applicable law or agreed to in writing, software 198 | distributed under the License is distributed on an "AS IS" BASIS, 199 | WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 200 | See the License for the specific language governing permissions and 201 | limitations under the License. 202 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # Elastic Container Service (ECS) Task Protection Examples 2 | 3 | This repository contains two sample applications that demonstrate 4 | the usage of the ECS task protection feature. You can find detailed deployment 5 | instructions and other related resources at the [Containers on AWS pattern: "Background worker that gets jobs from an SQS queue"](https://containersonaws.com/pattern/background-worker-sqs-queue-container-copilot) 6 | 7 | ## Prerequisites 8 | 9 | To deploy these samples you must install [AWS Copilot](https://aws.github.io/copilot-cli/), 10 | the official command line tool for Elastic Container Service. 11 | 12 | Additionally you need to have Docker installed locally for building the container images. 13 | 14 | Examples are written in Node.js but there is no need to have Node installed locally 15 | as all Node.js usage will happen inside the container image. 16 | 17 | ## `ProtectionManager` class 18 | 19 | The code for both demo apps is utilizing the same JS wrapper class 20 | called [`ProtectionManager`](/queue-consumer/lib/protection-manager.js). 21 | 22 | This class is responsible for calling the ECS API on your behalf to set the task 23 | protection state. 24 | 25 | __Usage:__ 26 | 27 | ```js 28 | import ProtectionManager from './lib/protection-manager.js'; 29 | const TaskProtection = new ProtectionManager({ 30 | // Duration to protect the task for each time task protection is 31 | // set or refreshed 32 | desiredProtectionDurationInMins: 5, 33 | 34 | // If protection is released before X% of the duration has passed 35 | // then keep the protection going. This is useful in case you have 36 | // short duration jobs or a mix of short and long duration jobs, as 37 | // there is a rate limit on often you can set and unset task protection. 38 | maintainProtectionPercentage: 10, 39 | 40 | // At the X% mark go ahead and preemptively refresh the protection. This 41 | // keeps protection going if a particular job or socket connection takes too long 42 | // so protection is going to expire too early. The manager class will 43 | // automatically extend the protection at this point. 44 | refreshProtectionPercentage: 80, 45 | 46 | // How many ms to wait between checks 47 | protectionAdjustIntervalInMs: 10 * 1000 48 | }); 49 | ``` 50 | 51 | Once instantiated the `ProtectionManager` has the following methods that can be used 52 | to acquire or release task protection based on what your application is doing: 53 | 54 | ```js 55 | const TaskProtection = new ProtectionManager(settings); 56 | 57 | async function main() { 58 | await TaskProtection.acquire(); 59 | 60 | // Do protected logic that you don't want to interrupt here 61 | 62 | TaskProtection.release(); 63 | } 64 | ``` 65 | 66 | Note that for full usage of the `ProtectionManager` class your protected 67 | logic should not be event loop blocking. Ensure that you use asynchronous 68 | methods or yield back to the event loop by breaking heavy workload up into 69 | multiple smaller computational chunks with `setImmediate()`. This is necessary 70 | so that the background interval inside the `ProtectionManager` can trigger 71 | periodically to check if task protection needs to be extended during long 72 | running jobs. 73 | 74 | The `ProtectionManager` class is an `EventEmitter` so you 75 | can bind to the following events to run your own custom logic when 76 | task protection state changes: 77 | 78 | ```js 79 | // Event triggers when task protection is acquired or 80 | // task protection duration is refreshed 81 | TaskProtection.on('protected', function() { 82 | 83 | }); 84 | 85 | // Event triggers when task protection is released 86 | TaskProtection.on('unprotected', function() { 87 | 88 | }); 89 | 90 | // This can happen if Amazon ECS rejects your attempt to protect 91 | // the task, which happens on rate limiting, or if a task blocks 92 | // a rolling deployment for an extended period of time. 93 | TaskProtection.on('rejected', function() { 94 | 95 | }); 96 | ``` 97 | 98 | ## Queue Consumer 99 | 100 | This application simulates a worker grabbing jobs off of an SQS queue. 101 | You can configure how long each simulated job takes by passing a duration 102 | in the body of the SQS message. The worker will set task protection on itself 103 | before and during the processing of each job, then release task protection 104 | after it finishes processing each job. 105 | 106 | Deploy with AWS Copilot by typing `copilot init` and make the following choices: 107 | 108 | ``` 109 | Use existing application: No 110 | Application name: task-protection 111 | Workload type: Worker Service 112 | Service name: queue-consumer 113 | Dockerfile: queue-consumer/Dockerfile 114 | ``` 115 | 116 | AWS Copilot will automatically create an SQS queue and a container deployment 117 | for the application. You can add work to the queue by navigating to the SQS 118 | console, selecting the SQS queue and sending a message into it. You can put a number 119 | into the body of the message which is the number of milliseconds you want that 120 | job to take. For example `10000` is 10 seconds of time. 121 | 122 | After submitting some work into the SQS queue check the logs for the worker queue 123 | consumer application. You will see output similar to this: 124 | 125 | ``` 126 | 2022-11-07T17:11:18.593-05:00 Acquiring task protection 127 | 2022-11-07T17:11:18.617-05:00 Long polling for messages 128 | 2022-11-07T17:11:37.641-05:00 0744dc66-c746-4561-ad38-7c2d90717d4a - Received 129 | 2022-11-07T17:11:37.641-05:00 0744dc66-c746-4561-ad38-7c2d90717d4a - Working for 10000 milliseconds 130 | 2022-11-07T17:11:47.655-05:00 0744dc66-c746-4561-ad38-7c2d90717d4a - Done 131 | 2022-11-07T17:11:47.655-05:00 Releasing task protection 132 | 2022-11-07T17:11:47.698-05:00 Task protection released 133 | 2022-11-07T17:11:47.698-05:00 Acquiring task protection 134 | 2022-11-07T17:11:47.725-05:00 Long polling for messages 135 | 2022-11-07T17:11:47.731-05:00 c701269a-07cd-4a83-bb71-3734c5306d88 - Received 136 | 2022-11-07T17:11:47.731-05:00 c701269a-07cd-4a83-bb71-3734c5306d88 - Working for 10000 milliseconds 137 | 2022-11-07T17:11:57.739-05:00 c701269a-07cd-4a83-bb71-3734c5306d88 - Done 138 | 2022-11-07T17:11:57.739-05:00 Releasing task protection 139 | ``` 140 | 141 | To test out task protection submit an SQS job with a longer duration, for example 142 | `360000` (or 5 minutes). Then use the ECS console to edit the service and set 143 | desired count to zero, to attempt to scale it down. You will observe the ECS task remaining 144 | for some time, and see a message in the ECS service events tab saying something similar to this: 145 | 146 | ``` 147 | (service task-protection-test-queue-consumer-Service-tjlfn1NmI0yU, taskSet ecs-svc/6163164058718610164) was unable to scale in due to (reason 1 tasks under protection) 148 | ``` 149 | 150 | When the queue consumer finishes the simulated 5 minute task it will release the 151 | task protection and ECS will then be able to stop the task. Alternatively you can 152 | force kill the task immediately by selecting it and using the "Stop" action in the dropdown. 153 | 154 | ## WebSocket Server 155 | 156 | This application simulates a persistent websocket connection server, such 157 | as a game server or chat server. While there are connected clients the 158 | process sets task protection on itself so that the server will not be 159 | prematurely terminated and break connections if the ECS service decides to 160 | scale in or do a rolling deployment. 161 | 162 | Deploy with AWS Copilot by typing `copilot init` and make the following choices. 163 | Note that if you have already created the `task-protection` application 164 | by deploying the queue consumer service then you can reuse that existing application. 165 | 166 | ``` 167 | Use existing application: No 168 | Application name: task-protection 169 | Workload type: Load Balanced Application 170 | Service name: websocket 171 | Dockerfile: websocket/Dockerfile 172 | ``` 173 | 174 | AWS Copilot will deploy the websocket server behind an Application Load Balancer. 175 | It will then output an autogenerated DNS name similar to: 176 | 177 | ``` 178 | http://task-Publi-A1IGB3OGHUZ4-998409289.us-east-2.elb.amazonaws.com 179 | ``` 180 | 181 | You can open the URL in your web browser to connect to the websocket server. 182 | 183 | You will see activity messages in the browser tab like this: 184 | 185 | ``` 186 | Attempting to connect... 187 | Connected! 188 | Server says: "Welcome! There are 1 connections" 189 | Client sent: "ping" 190 | Server says: "pong" 191 | Client sent: "ping" 192 | Server says: "pong" 193 | ``` 194 | 195 | As long as there is at least one connected client the application will keep 196 | its own task protected from scale in. If you look at the server side logs 197 | for the application task you will messages similar to this: 198 | 199 | ``` 200 | 2022-11-07T16:53:26.124-05:00 New client connection opened. There are 1 connections 201 | 2022-11-07T16:53:26.170-05:00 Task protection acquired 202 | 2022-11-07T16:53:28.153-05:00 received: ping 203 | 2022-11-07T16:53:30.153-05:00 received: ping 204 | 2022-11-07T16:53:32.156-05:00 received: ping 205 | 2022-11-07T16:53:32.451-05:00 Task protection acquired 206 | 2022-11-07T16:53:34.156-05:00 received: ping 207 | 2022-11-07T16:57:04.160-05:00 received: ping 208 | 2022-11-07T16:57:05.557-05:00 Client connection closed. There are 0 connections 209 | 2022-11-07T16:57:05.605-05:00 Task protection released 210 | ``` 211 | 212 | To test out task protection open a browser tab to the service to open a websocket connection between your browser and the the server. Then edit the service in the ECS console and adjust desired count to zero. 213 | Just as with the queue consumer service you will observe ECS waiting instead 214 | of immediately stopping the task. You will also see a message in the service events tab 215 | similar to this: 216 | 217 | ``` 218 | (service task-protection-test-websocket-Service-M9Q0bnYMjlQ4, taskSet ecs-svc/1888478596191510698) was unable to scale in due to (reason 1 tasks under protection) 219 | ``` 220 | 221 | ## Cleanup 222 | 223 | After you are done testing these demo applications you can use AWS Copilot to clean up 224 | your account by running `copilot app delete`. This will delete the `task-protection` application 225 | and both the `queue-worker` and `websocket` services deployed within the application. 226 | -------------------------------------------------------------------------------- /copilot/.workspace: -------------------------------------------------------------------------------- 1 | application: task-protection 2 | path: "" 3 | -------------------------------------------------------------------------------- /copilot/environments/test/manifest.yml: -------------------------------------------------------------------------------- 1 | # The manifest for the "test" environment. 2 | # Read the full specification for the "Environment" type at: 3 | # https://aws.github.io/copilot-cli/docs/manifest/environment/ 4 | 5 | # Your environment name will be used in naming your resources like VPC, cluster, etc. 6 | name: test 7 | type: Environment 8 | 9 | # Import your own VPC and subnets or configure how they should be created. 10 | # network: 11 | # vpc: 12 | # id: 13 | 14 | # Configure the load balancers in your environment, once created. 15 | # http: 16 | # public: 17 | # private: 18 | 19 | # Configure observability for your environment resources. 20 | observability: 21 | container_insights: false 22 | -------------------------------------------------------------------------------- /copilot/queue-consumer/addons/task-protection.yml: -------------------------------------------------------------------------------- 1 | # You can use any of these parameters to create conditions or mappings in your template. 2 | Parameters: 3 | App: 4 | Type: String 5 | Description: Your application's name. 6 | Env: 7 | Type: String 8 | Description: The environment name your service, job, or workflow is being deployed to. 9 | Name: 10 | Type: String 11 | Description: The name of the service, job, or workflow being deployed. 12 | 13 | Resources: 14 | 15 | # Permission for the task to protect itself using the 16 | # TaskProtection API for ECS 17 | TaskProtectionPolicy: 18 | Type: AWS::IAM::ManagedPolicy 19 | Properties: 20 | PolicyDocument: 21 | Version: '2012-10-17' 22 | Statement: 23 | - Sid: TaskProtection 24 | Effect: Allow 25 | Action: 26 | - ecs:UpdateTaskProtection 27 | - ecs:GetTaskProtection 28 | Resource: '*' 29 | 30 | Outputs: 31 | TaskProtectionPolicyArn: 32 | Description: "The ARN of the ManagedPolicy to attach to the task role." 33 | Value: !Ref TaskProtectionPolicy -------------------------------------------------------------------------------- /copilot/queue-consumer/manifest.yml: -------------------------------------------------------------------------------- 1 | # The manifest for the "queue-consumer" service. 2 | # Read the full specification for the "Worker Service" type at: 3 | # https://aws.github.io/copilot-cli/docs/manifest/worker-service/ 4 | 5 | # Your service name will be used in naming your resources like log groups, ECS services, etc. 6 | name: queue-consumer 7 | type: Worker Service 8 | 9 | # Configuration for your containers and service. 10 | image: 11 | # Docker build arguments. 12 | build: queue-consumer/Dockerfile 13 | 14 | cpu: 256 # Number of CPU units for the task. 15 | memory: 512 # Amount of memory in MiB used by the task. 16 | count: 1 # Number of tasks that should be running in your service. 17 | exec: true # Enable running commands in your container. 18 | 19 | # You can register to topics from other services. 20 | # The events can be be received from an SQS queue via the env var $COPILOT_QUEUE_URI. 21 | # subscribe: 22 | # topics: 23 | # - name: topic-from-another-service 24 | # service: another-service 25 | 26 | # Optional fields for more advanced use-cases. 27 | # 28 | #variables: # Pass environment variables as key value pairs. 29 | # LOG_LEVEL: info 30 | 31 | #secrets: # Pass secrets from AWS Systems Manager (SSM) Parameter Store. 32 | # GITHUB_TOKEN: GITHUB_TOKEN # The key is the name of the environment variable, the value is the name of the SSM parameter. 33 | 34 | # You can override any of the values defined above by environment. 35 | #environments: 36 | # test: 37 | # count: 2 # Number of tasks to run for the "test" environment. 38 | # deployment: # The deployment strategy for the "test" environment. 39 | # rolling: 'recreate' # Stops existing tasks before new ones are started for faster deployments. 40 | -------------------------------------------------------------------------------- /copilot/websocket/addons/task-protection.yml: -------------------------------------------------------------------------------- 1 | # You can use any of these parameters to create conditions or mappings in your template. 2 | Parameters: 3 | App: 4 | Type: String 5 | Description: Your application's name. 6 | Env: 7 | Type: String 8 | Description: The environment name your service, job, or workflow is being deployed to. 9 | Name: 10 | Type: String 11 | Description: The name of the service, job, or workflow being deployed. 12 | 13 | Resources: 14 | 15 | # Permission for the task to protect itself using the 16 | # TaskProtection API for ECS 17 | TaskProtectionPolicy: 18 | Type: AWS::IAM::ManagedPolicy 19 | Properties: 20 | PolicyDocument: 21 | Version: '2012-10-17' 22 | Statement: 23 | - Sid: TaskProtection 24 | Effect: Allow 25 | Action: 26 | - ecs:UpdateTaskProtection 27 | - ecs:GetTaskProtection 28 | Resource: '*' 29 | 30 | Outputs: 31 | TaskProtectionPolicyArn: 32 | Description: "The ARN of the ManagedPolicy to attach to the task role." 33 | Value: !Ref TaskProtectionPolicy -------------------------------------------------------------------------------- /copilot/websocket/manifest.yml: -------------------------------------------------------------------------------- 1 | # The manifest for the "websocket" service. 2 | # Read the full specification for the "Load Balanced Web Service" type at: 3 | # https://aws.github.io/copilot-cli/docs/manifest/lb-web-service/ 4 | 5 | # Your service name will be used in naming your resources like log groups, ECS services, etc. 6 | name: websocket 7 | type: Load Balanced Web Service 8 | 9 | # Distribute traffic to your service. 10 | http: 11 | # Requests to this path will be forwarded to your service. 12 | # To match all requests you can use the "/" path. 13 | path: '/' 14 | # You can specify a custom health check path. The default is "/". 15 | # healthcheck: '/' 16 | 17 | # Configuration for your containers and service. 18 | image: 19 | # Docker build arguments. For additional overrides: https://aws.github.io/copilot-cli/docs/manifest/lb-web-service/#image-build 20 | build: websocket/Dockerfile 21 | # Port exposed through your container to route traffic to it. 22 | port: 3000 23 | 24 | cpu: 256 # Number of CPU units for the task. 25 | memory: 512 # Amount of memory in MiB used by the task. 26 | count: 1 # Number of tasks that should be running in your service. 27 | exec: true # Enable running commands in your container. 28 | 29 | # Optional fields for more advanced use-cases. 30 | # 31 | #variables: # Pass environment variables as key value pairs. 32 | # LOG_LEVEL: info 33 | 34 | #secrets: # Pass secrets from AWS Systems Manager (SSM) Parameter Store. 35 | # GITHUB_TOKEN: GITHUB_TOKEN # The key is the name of the environment variable, the value is the name of the SSM parameter. 36 | 37 | # You can override any of the values defined above by environment. 38 | #environments: 39 | # test: 40 | # count: 2 # Number of tasks to run for the "test" environment. 41 | # deployment: # The deployment strategy for the "test" environment. 42 | # rolling: 'recreate' # Stops existing tasks before new ones are started for faster deployments. 43 | -------------------------------------------------------------------------------- /queue-consumer/.dockerignore: -------------------------------------------------------------------------------- 1 | node_modules 2 | -------------------------------------------------------------------------------- /queue-consumer/Dockerfile: -------------------------------------------------------------------------------- 1 | FROM public.ecr.aws/docker/library/node:18 AS build 2 | WORKDIR /srv 3 | ADD package.json . 4 | ADD package-lock.json . 5 | RUN npm install 6 | 7 | FROM public.ecr.aws/docker/library/node:18-slim 8 | RUN apt-get update && apt-get install -y \ 9 | curl \ 10 | --no-install-recommends \ 11 | && rm -rf /var/lib/apt/lists/* && apt-get clean 12 | COPY --from=build /srv . 13 | ADD . . 14 | EXPOSE 3000 15 | CMD ["node", "index.js"] -------------------------------------------------------------------------------- /queue-consumer/README.md: -------------------------------------------------------------------------------- 1 | 1. Install AWS Copilot 2 | 2. Make the following choices 3 | ``` 4 | Use existing application: No 5 | Application name: task-protection 6 | Workload type: Worker Service 7 | Service name: queue-consumer 8 | Dockerfile: queue-consumer/Dockerfile 9 | ``` -------------------------------------------------------------------------------- /queue-consumer/index.js: -------------------------------------------------------------------------------- 1 | import { SQSClient, ReceiveMessageCommand, DeleteMessageCommand } from '@aws-sdk/client-sqs'; 2 | var sqs; 3 | 4 | if (process.env.QUEUE_REGION) { 5 | console.log(`Using queue in region ${process.env.QUEUE_REGION}`) 6 | sqs = new SQSClient({ region: process.env.QUEUE_REGION }); 7 | } else { 8 | sqs = new SQSClient(); 9 | } 10 | 11 | const QUEUE_URL = process.env.COPILOT_QUEUE_URI; 12 | if (!QUEUE_URL) { 13 | throw new Error('COPILOT_QUEUE_URI environment variable must be set so that the worker knows what queue to watch'); 14 | } 15 | 16 | import ProtectionManager from './lib/protection-manager.js'; 17 | const TaskProtection = new ProtectionManager({ 18 | // Protect task for 1 min at a time when protection is acquired 19 | desiredProtectionDurationInMins: 1, 20 | // If protection released early keep it going for a little while just in case another job arrives right away 21 | maintainProtectionPercentage: 10, 22 | // At the 80% mark go ahead and preemptively refresh the protection. This 23 | // keeps protection going if a job arrives that takes too long to process 24 | // so protection is going to expire before the job ends. 25 | refreshProtectionPercentage: 80, 26 | // Check every 10 seconds to see if protection state should be adjusted. 27 | protectionAdjustIntervalInMs: 10 * 1000 28 | }); 29 | 30 | const ONE_HOUR_IN_SECONDS = 60 * 60; 31 | var timeToQuit = false; 32 | 33 | function maybeContinuePolling() { 34 | if (timeToQuit) { 35 | console.log('Exiting as requested'); 36 | process.exit(0); 37 | } else { 38 | setImmediate(pollForWork); 39 | } 40 | } 41 | 42 | async function receiveMessage() { 43 | // Get a message if there is a message waiting in SQS. 44 | var receiveMessageResponse; 45 | try { 46 | console.log("Long polling for messages"); 47 | receiveMessageResponse = await sqs.send(new ReceiveMessageCommand({ 48 | QueueUrl: QUEUE_URL, 49 | MaxNumberOfMessages: 1, 50 | WaitTimeSeconds: 20, // Wait up to 20 seconds on the SQS server side for messages to arrive 51 | VisibilityTimeout: ONE_HOUR_IN_SECONDS // Reserve received messages for one hour 52 | })); 53 | } catch (e) { 54 | // Error response from the SQS service 55 | console.error('Failed to receive messages because ', e.toString()); 56 | return; 57 | } 58 | 59 | var messages = receiveMessageResponse.Messages; 60 | if (!messages) { 61 | // Empty response, no work to do. 62 | return; 63 | } 64 | 65 | return messages[0]; 66 | } 67 | 68 | async function deleteMessage(handle) { 69 | try { 70 | await sqs.send(new DeleteMessageCommand({ 71 | QueueUrl: QUEUE_URL, 72 | ReceiptHandle: handle 73 | })); 74 | } catch (e) { 75 | console.error('Failed to delete handled message because ', e.toString()) 76 | } 77 | } 78 | 79 | // Do the work for a single message. 80 | async function processMessage(message) { 81 | console.log(`${message.MessageId} - Received`); 82 | 83 | var waitPeriod = Number(message.Body); 84 | if (waitPeriod === NaN) { 85 | waitPeriod = 1000; 86 | } 87 | 88 | console.log(`${message.MessageId} - Working for ${waitPeriod} milliseconds`); 89 | 90 | // Wait for a while to simulate some computationally 91 | // heavy work being done. 92 | await new Promise(function (done) { 93 | setTimeout(done, waitPeriod); 94 | }); 95 | 96 | await deleteMessage(message.ReceiptHandle); 97 | 98 | console.log(`${message.MessageId} - Done`); 99 | } 100 | 101 | // Acquire task protection, grab a message, and then release protection 102 | async function pollForWork() { 103 | console.log('Acquiring task protection'); 104 | await TaskProtection.acquire(); 105 | 106 | var message = await receiveMessage(); 107 | 108 | if (message) { 109 | await processMessage(message); 110 | } 111 | 112 | console.log('Releasing task protection'); 113 | 114 | await TaskProtection.release(); 115 | return maybeContinuePolling(); 116 | } 117 | 118 | process.on('SIGTERM', () => { 119 | console.log('Received SIGTERM signal, will quit when all work is done'); 120 | timeToQuit = true; 121 | }); 122 | 123 | TaskProtection.on('rejected', (e) => { 124 | if (e.response && e.response.body) { 125 | console.log('Failed to acquire task protection because ', e.response.body); 126 | } else { 127 | console.log('Failed to acquire task protection because ', e.toString()) 128 | } 129 | timeToQuit = true; 130 | }); 131 | 132 | TaskProtection.on('unprotected', (e) => { 133 | console.log('Task protection released'); 134 | }); 135 | 136 | setImmediate(pollForWork); -------------------------------------------------------------------------------- /queue-consumer/lib/protection-manager.js: -------------------------------------------------------------------------------- 1 | import got from 'got'; 2 | import { EventEmitter } from 'node:events'; 3 | 4 | // This class manages the task protection state. It implements basic 5 | // rate limiting, and emits events to let you know when it changes state. 6 | // you can await the acquire() and release() methods if you want to ensure 7 | // that task protection has reached the desired state before moving on. 8 | export default class ProtectionManager extends EventEmitter { 9 | /** 10 | * @constructor 11 | * @param {*} protectionSettings 12 | * @param {*} protectionSettings.desiredProtectionDurationInMins - How long in minutes to protect the process on calling the acquire method 13 | * @param {*} protectionSettings.maintainProtectionPercentage - Number between 0 and 100 that expresses percentage of desired protection to maintain if release is called early 14 | * @param {*} protectionSettings.refreshProtectionPercentage - Number between 0 and 100 that expresses percentage of desired protection duration to let pass before doing an early refresh 15 | * @param {*} protectionSettings.protectionAdjustIntervalInMs - How frequently in ms to attempt/verify state matches desire 16 | */ 17 | constructor(protectionSettings) { 18 | super(); 19 | this.desiredProtectionDurationInMins = protectionSettings.desiredProtectionDurationInMins; 20 | this.protectionAdjustIntervalInMs = protectionSettings.protectionAdjustIntervalInMs; 21 | this.maintainProtectionPercentage = protectionSettings.maintainProtectionPercentage; 22 | this.refreshProtectionPercentage = protectionSettings.refreshProtectionPercentage; 23 | this.ECS_AGENT_URI = process.env.ECS_AGENT_URI; 24 | 25 | if (!this.ECS_AGENT_URI) { 26 | throw new Error('ECS_AGENT_URI environment variable must be set. This is set automatically in an ECS task environment'); 27 | } 28 | 29 | this.desiredState = 'unprotected'; 30 | this.currentState = 'unprotected'; 31 | this.lastStateChange = new Date().getTime(); 32 | this.interval = setInterval(this.attemptAdjustProtection.bind(this), protectionSettings.protectionAdjustIntervalInMs); 33 | } 34 | 35 | attemptAdjustProtection = async function () { 36 | if (this.currentState == 'unprotected' && 37 | this.desiredState == 'unprotected') { 38 | // Already unprotected so nothing to do right now. 39 | this.emit(this.currentState); 40 | return; 41 | } 42 | 43 | var now = new Date().getTime(); 44 | var timeSinceLastChange = now - this.lastStateChange; 45 | var timeUntilProtectRefresh = this.desiredProtectionDurationInMins * 60 * 1000 * (this.refreshProtectionPercentage / 100); 46 | var timeUntilProtectRelease = this.desiredProtectionDurationInMins * 60 * 1000 * (this.maintainProtectionPercentage / 100); 47 | 48 | if (this.currentState == 'protected' && 49 | this.desiredState == 'protected' && 50 | timeSinceLastChange < timeUntilProtectRefresh) { 51 | // We are already protected and haven't yet reached 80% of the acquired protection duration 52 | // so no need to do an early refresh. 53 | this.emit(this.currentState); 54 | return; 55 | } 56 | 57 | if (this.currentState == 'protected' && 58 | this.desiredState == 'unprotected' && 59 | timeSinceLastChange < timeUntilProtectRelease) { 60 | // We are currently protected and not enough duration has passed since we became protected 61 | // so don't actually release the protection yet, maintain it for now. 62 | this.emit(this.currentState); 63 | return; 64 | } 65 | 66 | var ecsAgentParams; 67 | if (this.desiredState == 'unprotected') { 68 | ecsAgentParams = { 69 | ProtectionEnabled: false 70 | }; 71 | } else if (this.desiredState == 'protected') { 72 | ecsAgentParams = { 73 | ProtectionEnabled: true, 74 | ExpiresInMinutes: this.desiredProtectionDurationInMins 75 | }; 76 | } 77 | 78 | try { 79 | await got(`${this.ECS_AGENT_URI}/task-protection/v1/state`, { 80 | method: 'PUT', 81 | json: ecsAgentParams 82 | }); 83 | } catch (e) { 84 | return this.emit('rejected', e); 85 | } 86 | 87 | this.lastStateChange = new Date().getTime(); 88 | this.currentState = this.desiredState; 89 | this.emit(this.currentState); 90 | } 91 | 92 | /** 93 | * Set the desired state to protected and wait for protection to be successfully acquired 94 | */ 95 | acquire = async function () { 96 | var self = this; 97 | this.desiredState = 'protected'; 98 | return new Promise(function (resolve, reject) { 99 | self.once('protected', resolve); 100 | self.attemptAdjustProtection(); // Immediate attempt to make an adjustment 101 | }); 102 | } 103 | 104 | /** 105 | * Set the desired state to unprotected and wait for protection to be successfully released 106 | */ 107 | release = async function () { 108 | var self = this; 109 | this.desiredState = 'unprotected'; 110 | return new Promise(function (resolve, reject) { 111 | self.once('unprotected', resolve); 112 | self.attemptAdjustProtection(); // Immediate attempt to make an adjustment 113 | }); 114 | } 115 | 116 | /** 117 | * When it is time to stop the process this clears 118 | * the interval so that it no longer keeps the event loop alive. 119 | */ 120 | close = function () { 121 | clearInterval(this.interval); 122 | } 123 | } 124 | -------------------------------------------------------------------------------- /queue-consumer/package-lock.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "queue-consumer", 3 | "lockfileVersion": 2, 4 | "requires": true, 5 | "packages": { 6 | "": { 7 | "name": "queue-consumer", 8 | "dependencies": { 9 | "@aws-sdk/client-sqs": "3.354.0", 10 | "got": "^12.5.2" 11 | } 12 | }, 13 | "node_modules/@aws-crypto/crc32": { 14 | "version": "3.0.0", 15 | "resolved": "https://registry.npmjs.org/@aws-crypto/crc32/-/crc32-3.0.0.tgz", 16 | "integrity": "sha512-IzSgsrxUcsrejQbPVilIKy16kAT52EwB6zSaI+M3xxIhKh5+aldEyvI+z6erM7TCLB2BJsFrtHjp6/4/sr+3dA==", 17 | "dependencies": { 18 | "@aws-crypto/util": "^3.0.0", 19 | "@aws-sdk/types": "^3.222.0", 20 | "tslib": "^1.11.1" 21 | } 22 | }, 23 | "node_modules/@aws-crypto/crc32/node_modules/tslib": { 24 | "version": "1.14.1", 25 | "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", 26 | "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==" 27 | }, 28 | "node_modules/@aws-crypto/ie11-detection": { 29 | "version": "3.0.0", 30 | "resolved": "https://registry.npmjs.org/@aws-crypto/ie11-detection/-/ie11-detection-3.0.0.tgz", 31 | "integrity": "sha512-341lBBkiY1DfDNKai/wXM3aujNBkXR7tq1URPQDL9wi3AUbI80NR74uF1TXHMm7po1AcnFk8iu2S2IeU/+/A+Q==", 32 | "dependencies": { 33 | "tslib": "^1.11.1" 34 | } 35 | }, 36 | "node_modules/@aws-crypto/ie11-detection/node_modules/tslib": { 37 | "version": "1.14.1", 38 | "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", 39 | "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==" 40 | }, 41 | "node_modules/@aws-crypto/sha256-browser": { 42 | "version": "3.0.0", 43 | "resolved": "https://registry.npmjs.org/@aws-crypto/sha256-browser/-/sha256-browser-3.0.0.tgz", 44 | "integrity": "sha512-8VLmW2B+gjFbU5uMeqtQM6Nj0/F1bro80xQXCW6CQBWgosFWXTx77aeOF5CAIAmbOK64SdMBJdNr6J41yP5mvQ==", 45 | "dependencies": { 46 | "@aws-crypto/ie11-detection": "^3.0.0", 47 | "@aws-crypto/sha256-js": "^3.0.0", 48 | "@aws-crypto/supports-web-crypto": "^3.0.0", 49 | "@aws-crypto/util": "^3.0.0", 50 | "@aws-sdk/types": "^3.222.0", 51 | "@aws-sdk/util-locate-window": "^3.0.0", 52 | "@aws-sdk/util-utf8-browser": "^3.0.0", 53 | "tslib": "^1.11.1" 54 | } 55 | }, 56 | "node_modules/@aws-crypto/sha256-browser/node_modules/tslib": { 57 | "version": "1.14.1", 58 | "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", 59 | "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==" 60 | }, 61 | "node_modules/@aws-crypto/sha256-js": { 62 | "version": "3.0.0", 63 | "resolved": "https://registry.npmjs.org/@aws-crypto/sha256-js/-/sha256-js-3.0.0.tgz", 64 | "integrity": "sha512-PnNN7os0+yd1XvXAy23CFOmTbMaDxgxXtTKHybrJ39Y8kGzBATgBFibWJKH6BhytLI/Zyszs87xCOBNyBig6vQ==", 65 | "dependencies": { 66 | "@aws-crypto/util": "^3.0.0", 67 | "@aws-sdk/types": "^3.222.0", 68 | "tslib": "^1.11.1" 69 | } 70 | }, 71 | "node_modules/@aws-crypto/sha256-js/node_modules/tslib": { 72 | "version": "1.14.1", 73 | "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", 74 | "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==" 75 | }, 76 | "node_modules/@aws-crypto/supports-web-crypto": { 77 | "version": "3.0.0", 78 | "resolved": "https://registry.npmjs.org/@aws-crypto/supports-web-crypto/-/supports-web-crypto-3.0.0.tgz", 79 | "integrity": "sha512-06hBdMwUAb2WFTuGG73LSC0wfPu93xWwo5vL2et9eymgmu3Id5vFAHBbajVWiGhPO37qcsdCap/FqXvJGJWPIg==", 80 | "dependencies": { 81 | "tslib": "^1.11.1" 82 | } 83 | }, 84 | "node_modules/@aws-crypto/supports-web-crypto/node_modules/tslib": { 85 | "version": "1.14.1", 86 | "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", 87 | "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==" 88 | }, 89 | "node_modules/@aws-crypto/util": { 90 | "version": "3.0.0", 91 | "resolved": "https://registry.npmjs.org/@aws-crypto/util/-/util-3.0.0.tgz", 92 | "integrity": "sha512-2OJlpeJpCR48CC8r+uKVChzs9Iungj9wkZrl8Z041DWEWvyIHILYKCPNzJghKsivj+S3mLo6BVc7mBNzdxA46w==", 93 | "dependencies": { 94 | "@aws-sdk/types": "^3.222.0", 95 | "@aws-sdk/util-utf8-browser": "^3.0.0", 96 | "tslib": "^1.11.1" 97 | } 98 | }, 99 | "node_modules/@aws-crypto/util/node_modules/tslib": { 100 | "version": "1.14.1", 101 | "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", 102 | "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==" 103 | }, 104 | "node_modules/@aws-sdk/abort-controller": { 105 | "version": "3.347.0", 106 | "resolved": "https://registry.npmjs.org/@aws-sdk/abort-controller/-/abort-controller-3.347.0.tgz", 107 | "integrity": "sha512-P/2qE6ntYEmYG4Ez535nJWZbXqgbkJx8CMz7ChEuEg3Gp3dvVYEKg+iEUEvlqQ2U5dWP5J3ehw5po9t86IsVPQ==", 108 | "dependencies": { 109 | "@aws-sdk/types": "3.347.0", 110 | "tslib": "^2.5.0" 111 | }, 112 | "engines": { 113 | "node": ">=14.0.0" 114 | } 115 | }, 116 | "node_modules/@aws-sdk/client-sqs": { 117 | "version": "3.354.0", 118 | "resolved": "https://registry.npmjs.org/@aws-sdk/client-sqs/-/client-sqs-3.354.0.tgz", 119 | "integrity": "sha512-zHhOU0nbxtwVBeuR4HJQyKjh5eBth+n2wULZet83RwMPT1EICAJbREKWbBW6Cyg395Lxtuc41Ie4lQZoKx2how==", 120 | "dependencies": { 121 | "@aws-crypto/sha256-browser": "3.0.0", 122 | "@aws-crypto/sha256-js": "3.0.0", 123 | "@aws-sdk/client-sts": "3.354.0", 124 | "@aws-sdk/config-resolver": "3.354.0", 125 | "@aws-sdk/credential-provider-node": "3.354.0", 126 | "@aws-sdk/fetch-http-handler": "3.353.0", 127 | "@aws-sdk/hash-node": "3.347.0", 128 | "@aws-sdk/invalid-dependency": "3.347.0", 129 | "@aws-sdk/md5-js": "3.347.0", 130 | "@aws-sdk/middleware-content-length": "3.347.0", 131 | "@aws-sdk/middleware-endpoint": "3.347.0", 132 | "@aws-sdk/middleware-host-header": "3.347.0", 133 | "@aws-sdk/middleware-logger": "3.347.0", 134 | "@aws-sdk/middleware-recursion-detection": "3.347.0", 135 | "@aws-sdk/middleware-retry": "3.354.0", 136 | "@aws-sdk/middleware-sdk-sqs": "3.347.0", 137 | "@aws-sdk/middleware-serde": "3.347.0", 138 | "@aws-sdk/middleware-signing": "3.354.0", 139 | "@aws-sdk/middleware-stack": "3.347.0", 140 | "@aws-sdk/middleware-user-agent": "3.352.0", 141 | "@aws-sdk/node-config-provider": "3.354.0", 142 | "@aws-sdk/node-http-handler": "3.350.0", 143 | "@aws-sdk/smithy-client": "3.347.0", 144 | "@aws-sdk/types": "3.347.0", 145 | "@aws-sdk/url-parser": "3.347.0", 146 | "@aws-sdk/util-base64": "3.310.0", 147 | "@aws-sdk/util-body-length-browser": "3.310.0", 148 | "@aws-sdk/util-body-length-node": "3.310.0", 149 | "@aws-sdk/util-defaults-mode-browser": "3.353.0", 150 | "@aws-sdk/util-defaults-mode-node": "3.354.0", 151 | "@aws-sdk/util-endpoints": "3.352.0", 152 | "@aws-sdk/util-retry": "3.347.0", 153 | "@aws-sdk/util-user-agent-browser": "3.347.0", 154 | "@aws-sdk/util-user-agent-node": "3.354.0", 155 | "@aws-sdk/util-utf8": "3.310.0", 156 | "@smithy/protocol-http": "^1.0.1", 157 | "@smithy/types": "^1.0.0", 158 | "fast-xml-parser": "4.2.4", 159 | "tslib": "^2.5.0" 160 | }, 161 | "engines": { 162 | "node": ">=14.0.0" 163 | } 164 | }, 165 | "node_modules/@aws-sdk/client-sso": { 166 | "version": "3.354.0", 167 | "resolved": "https://registry.npmjs.org/@aws-sdk/client-sso/-/client-sso-3.354.0.tgz", 168 | "integrity": "sha512-4jmvjJYDaaPmm1n2TG4LYfTEnHLKcJmImgBqhgzhMgaypb4u/k1iw0INV2r/afYPL/FsrLFwc46RM3HYx3nc4A==", 169 | "dependencies": { 170 | "@aws-crypto/sha256-browser": "3.0.0", 171 | "@aws-crypto/sha256-js": "3.0.0", 172 | "@aws-sdk/config-resolver": "3.354.0", 173 | "@aws-sdk/fetch-http-handler": "3.353.0", 174 | "@aws-sdk/hash-node": "3.347.0", 175 | "@aws-sdk/invalid-dependency": "3.347.0", 176 | "@aws-sdk/middleware-content-length": "3.347.0", 177 | "@aws-sdk/middleware-endpoint": "3.347.0", 178 | "@aws-sdk/middleware-host-header": "3.347.0", 179 | "@aws-sdk/middleware-logger": "3.347.0", 180 | "@aws-sdk/middleware-recursion-detection": "3.347.0", 181 | "@aws-sdk/middleware-retry": "3.354.0", 182 | "@aws-sdk/middleware-serde": "3.347.0", 183 | "@aws-sdk/middleware-stack": "3.347.0", 184 | "@aws-sdk/middleware-user-agent": "3.352.0", 185 | "@aws-sdk/node-config-provider": "3.354.0", 186 | "@aws-sdk/node-http-handler": "3.350.0", 187 | "@aws-sdk/smithy-client": "3.347.0", 188 | "@aws-sdk/types": "3.347.0", 189 | "@aws-sdk/url-parser": "3.347.0", 190 | "@aws-sdk/util-base64": "3.310.0", 191 | "@aws-sdk/util-body-length-browser": "3.310.0", 192 | "@aws-sdk/util-body-length-node": "3.310.0", 193 | "@aws-sdk/util-defaults-mode-browser": "3.353.0", 194 | "@aws-sdk/util-defaults-mode-node": "3.354.0", 195 | "@aws-sdk/util-endpoints": "3.352.0", 196 | "@aws-sdk/util-retry": "3.347.0", 197 | "@aws-sdk/util-user-agent-browser": "3.347.0", 198 | "@aws-sdk/util-user-agent-node": "3.354.0", 199 | "@aws-sdk/util-utf8": "3.310.0", 200 | "@smithy/protocol-http": "^1.0.1", 201 | "@smithy/types": "^1.0.0", 202 | "tslib": "^2.5.0" 203 | }, 204 | "engines": { 205 | "node": ">=14.0.0" 206 | } 207 | }, 208 | "node_modules/@aws-sdk/client-sso-oidc": { 209 | "version": "3.354.0", 210 | "resolved": "https://registry.npmjs.org/@aws-sdk/client-sso-oidc/-/client-sso-oidc-3.354.0.tgz", 211 | "integrity": "sha512-XZcg4s2zKb4S8ltluiw5yxpm974uZqzo2HTECt1lbzUJgVgLsMAh/nPJ1fLqg4jadT+rf8Lq2FEFqOM/vxWT8A==", 212 | "dependencies": { 213 | "@aws-crypto/sha256-browser": "3.0.0", 214 | "@aws-crypto/sha256-js": "3.0.0", 215 | "@aws-sdk/config-resolver": "3.354.0", 216 | "@aws-sdk/fetch-http-handler": "3.353.0", 217 | "@aws-sdk/hash-node": "3.347.0", 218 | "@aws-sdk/invalid-dependency": "3.347.0", 219 | "@aws-sdk/middleware-content-length": "3.347.0", 220 | "@aws-sdk/middleware-endpoint": "3.347.0", 221 | "@aws-sdk/middleware-host-header": "3.347.0", 222 | "@aws-sdk/middleware-logger": "3.347.0", 223 | "@aws-sdk/middleware-recursion-detection": "3.347.0", 224 | "@aws-sdk/middleware-retry": "3.354.0", 225 | "@aws-sdk/middleware-serde": "3.347.0", 226 | "@aws-sdk/middleware-stack": "3.347.0", 227 | "@aws-sdk/middleware-user-agent": "3.352.0", 228 | "@aws-sdk/node-config-provider": "3.354.0", 229 | "@aws-sdk/node-http-handler": "3.350.0", 230 | "@aws-sdk/smithy-client": "3.347.0", 231 | "@aws-sdk/types": "3.347.0", 232 | "@aws-sdk/url-parser": "3.347.0", 233 | "@aws-sdk/util-base64": "3.310.0", 234 | "@aws-sdk/util-body-length-browser": "3.310.0", 235 | "@aws-sdk/util-body-length-node": "3.310.0", 236 | "@aws-sdk/util-defaults-mode-browser": "3.353.0", 237 | "@aws-sdk/util-defaults-mode-node": "3.354.0", 238 | "@aws-sdk/util-endpoints": "3.352.0", 239 | "@aws-sdk/util-retry": "3.347.0", 240 | "@aws-sdk/util-user-agent-browser": "3.347.0", 241 | "@aws-sdk/util-user-agent-node": "3.354.0", 242 | "@aws-sdk/util-utf8": "3.310.0", 243 | "@smithy/protocol-http": "^1.0.1", 244 | "@smithy/types": "^1.0.0", 245 | "tslib": "^2.5.0" 246 | }, 247 | "engines": { 248 | "node": ">=14.0.0" 249 | } 250 | }, 251 | "node_modules/@aws-sdk/client-sts": { 252 | "version": "3.354.0", 253 | "resolved": "https://registry.npmjs.org/@aws-sdk/client-sts/-/client-sts-3.354.0.tgz", 254 | "integrity": "sha512-l9Ar/C/3PNlToM1ukHVfBtp4plbRUxLMYY2DOTMI0nb3jzfcvETBcdEGCP51fX4uAfJ2vc4g5qBF/qXKX0LMWA==", 255 | "dependencies": { 256 | "@aws-crypto/sha256-browser": "3.0.0", 257 | "@aws-crypto/sha256-js": "3.0.0", 258 | "@aws-sdk/config-resolver": "3.354.0", 259 | "@aws-sdk/credential-provider-node": "3.354.0", 260 | "@aws-sdk/fetch-http-handler": "3.353.0", 261 | "@aws-sdk/hash-node": "3.347.0", 262 | "@aws-sdk/invalid-dependency": "3.347.0", 263 | "@aws-sdk/middleware-content-length": "3.347.0", 264 | "@aws-sdk/middleware-endpoint": "3.347.0", 265 | "@aws-sdk/middleware-host-header": "3.347.0", 266 | "@aws-sdk/middleware-logger": "3.347.0", 267 | "@aws-sdk/middleware-recursion-detection": "3.347.0", 268 | "@aws-sdk/middleware-retry": "3.354.0", 269 | "@aws-sdk/middleware-sdk-sts": "3.354.0", 270 | "@aws-sdk/middleware-serde": "3.347.0", 271 | "@aws-sdk/middleware-signing": "3.354.0", 272 | "@aws-sdk/middleware-stack": "3.347.0", 273 | "@aws-sdk/middleware-user-agent": "3.352.0", 274 | "@aws-sdk/node-config-provider": "3.354.0", 275 | "@aws-sdk/node-http-handler": "3.350.0", 276 | "@aws-sdk/smithy-client": "3.347.0", 277 | "@aws-sdk/types": "3.347.0", 278 | "@aws-sdk/url-parser": "3.347.0", 279 | "@aws-sdk/util-base64": "3.310.0", 280 | "@aws-sdk/util-body-length-browser": "3.310.0", 281 | "@aws-sdk/util-body-length-node": "3.310.0", 282 | "@aws-sdk/util-defaults-mode-browser": "3.353.0", 283 | "@aws-sdk/util-defaults-mode-node": "3.354.0", 284 | "@aws-sdk/util-endpoints": "3.352.0", 285 | "@aws-sdk/util-retry": "3.347.0", 286 | "@aws-sdk/util-user-agent-browser": "3.347.0", 287 | "@aws-sdk/util-user-agent-node": "3.354.0", 288 | "@aws-sdk/util-utf8": "3.310.0", 289 | "@smithy/protocol-http": "^1.0.1", 290 | "@smithy/types": "^1.0.0", 291 | "fast-xml-parser": "4.2.4", 292 | "tslib": "^2.5.0" 293 | }, 294 | "engines": { 295 | "node": ">=14.0.0" 296 | } 297 | }, 298 | "node_modules/@aws-sdk/config-resolver": { 299 | "version": "3.354.0", 300 | "resolved": "https://registry.npmjs.org/@aws-sdk/config-resolver/-/config-resolver-3.354.0.tgz", 301 | "integrity": "sha512-K4XWie8yJPT8bpYVX54VJMQhiJRTw8PrjEs9QrKqvwoCcZ3G4qEt40tIu33XksuokXxk8rrVH5d7odOPBsAtdg==", 302 | "dependencies": { 303 | "@aws-sdk/types": "3.347.0", 304 | "@aws-sdk/util-config-provider": "3.310.0", 305 | "@aws-sdk/util-middleware": "3.347.0", 306 | "tslib": "^2.5.0" 307 | }, 308 | "engines": { 309 | "node": ">=14.0.0" 310 | } 311 | }, 312 | "node_modules/@aws-sdk/credential-provider-env": { 313 | "version": "3.353.0", 314 | "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-env/-/credential-provider-env-3.353.0.tgz", 315 | "integrity": "sha512-Y4VsNS8O1FAD5J7S5itOhnOghQ5LIXlZ44t35nF8cbcF+JPvY3ToKzYpjYN1jM7DXKqU4shtqgYpzSqxlvEgKQ==", 316 | "dependencies": { 317 | "@aws-sdk/property-provider": "3.353.0", 318 | "@aws-sdk/types": "3.347.0", 319 | "tslib": "^2.5.0" 320 | }, 321 | "engines": { 322 | "node": ">=14.0.0" 323 | } 324 | }, 325 | "node_modules/@aws-sdk/credential-provider-imds": { 326 | "version": "3.354.0", 327 | "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-imds/-/credential-provider-imds-3.354.0.tgz", 328 | "integrity": "sha512-AB+PuDd1jX6qgz+JYvIyOn8Kz9/lQ60KuY1TFb7g3S8zURw+DSeMJNR1jzEsorWICTzhxXmyasHVMa4Eo4Uq+Q==", 329 | "dependencies": { 330 | "@aws-sdk/node-config-provider": "3.354.0", 331 | "@aws-sdk/property-provider": "3.353.0", 332 | "@aws-sdk/types": "3.347.0", 333 | "@aws-sdk/url-parser": "3.347.0", 334 | "tslib": "^2.5.0" 335 | }, 336 | "engines": { 337 | "node": ">=14.0.0" 338 | } 339 | }, 340 | "node_modules/@aws-sdk/credential-provider-ini": { 341 | "version": "3.354.0", 342 | "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-ini/-/credential-provider-ini-3.354.0.tgz", 343 | "integrity": "sha512-bn2ifrRsxWpxzwXa25jRdUECQ1dC+NB3YlRYnGdIaIQLF559N2jnfCabYzqyfKI++WU7aQeMofPe2PxVGlbv9Q==", 344 | "dependencies": { 345 | "@aws-sdk/credential-provider-env": "3.353.0", 346 | "@aws-sdk/credential-provider-imds": "3.354.0", 347 | "@aws-sdk/credential-provider-process": "3.354.0", 348 | "@aws-sdk/credential-provider-sso": "3.354.0", 349 | "@aws-sdk/credential-provider-web-identity": "3.354.0", 350 | "@aws-sdk/property-provider": "3.353.0", 351 | "@aws-sdk/shared-ini-file-loader": "3.354.0", 352 | "@aws-sdk/types": "3.347.0", 353 | "tslib": "^2.5.0" 354 | }, 355 | "engines": { 356 | "node": ">=14.0.0" 357 | } 358 | }, 359 | "node_modules/@aws-sdk/credential-provider-node": { 360 | "version": "3.354.0", 361 | "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-node/-/credential-provider-node-3.354.0.tgz", 362 | "integrity": "sha512-ltKiRtHfqDaCcrb44DIoSHQ9MposFl/aDtNdu5OdQv/2Q1r7M/r2fQdq9DHOrxeQQjaUH4C6k6fGTsxALTHyNA==", 363 | "dependencies": { 364 | "@aws-sdk/credential-provider-env": "3.353.0", 365 | "@aws-sdk/credential-provider-imds": "3.354.0", 366 | "@aws-sdk/credential-provider-ini": "3.354.0", 367 | "@aws-sdk/credential-provider-process": "3.354.0", 368 | "@aws-sdk/credential-provider-sso": "3.354.0", 369 | "@aws-sdk/credential-provider-web-identity": "3.354.0", 370 | "@aws-sdk/property-provider": "3.353.0", 371 | "@aws-sdk/shared-ini-file-loader": "3.354.0", 372 | "@aws-sdk/types": "3.347.0", 373 | "tslib": "^2.5.0" 374 | }, 375 | "engines": { 376 | "node": ">=14.0.0" 377 | } 378 | }, 379 | "node_modules/@aws-sdk/credential-provider-process": { 380 | "version": "3.354.0", 381 | "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-process/-/credential-provider-process-3.354.0.tgz", 382 | "integrity": "sha512-AxpASm+tS8V1PY4PLfG9dtqa96lzBJ3niTQb+RAm4uYCddW7gxNDkGB+jSCzVdUPVa3xA2ITBS/ka3C5yM8YWg==", 383 | "dependencies": { 384 | "@aws-sdk/property-provider": "3.353.0", 385 | "@aws-sdk/shared-ini-file-loader": "3.354.0", 386 | "@aws-sdk/types": "3.347.0", 387 | "tslib": "^2.5.0" 388 | }, 389 | "engines": { 390 | "node": ">=14.0.0" 391 | } 392 | }, 393 | "node_modules/@aws-sdk/credential-provider-sso": { 394 | "version": "3.354.0", 395 | "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-sso/-/credential-provider-sso-3.354.0.tgz", 396 | "integrity": "sha512-ihiaUxh8V/nQgTOgQZxWQcbckXhM+J6Wdc4F0z9soi48iSOqzRpzPw5E14wSZScEZjNY/gKEDz8gCt8WkT/G0w==", 397 | "dependencies": { 398 | "@aws-sdk/client-sso": "3.354.0", 399 | "@aws-sdk/property-provider": "3.353.0", 400 | "@aws-sdk/shared-ini-file-loader": "3.354.0", 401 | "@aws-sdk/token-providers": "3.354.0", 402 | "@aws-sdk/types": "3.347.0", 403 | "tslib": "^2.5.0" 404 | }, 405 | "engines": { 406 | "node": ">=14.0.0" 407 | } 408 | }, 409 | "node_modules/@aws-sdk/credential-provider-web-identity": { 410 | "version": "3.354.0", 411 | "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-web-identity/-/credential-provider-web-identity-3.354.0.tgz", 412 | "integrity": "sha512-scx9mAf4m3Hc3uMX2Vh8GciEcC/5GqeDI8qc0zBj+UF/5c/GtihZA4WoCV3Sg3jMPDUKY81DiFCtcKHhtUqKfg==", 413 | "dependencies": { 414 | "@aws-sdk/property-provider": "3.353.0", 415 | "@aws-sdk/types": "3.347.0", 416 | "tslib": "^2.5.0" 417 | }, 418 | "engines": { 419 | "node": ">=14.0.0" 420 | } 421 | }, 422 | "node_modules/@aws-sdk/eventstream-codec": { 423 | "version": "3.347.0", 424 | "resolved": "https://registry.npmjs.org/@aws-sdk/eventstream-codec/-/eventstream-codec-3.347.0.tgz", 425 | "integrity": "sha512-61q+SyspjsaQ4sdgjizMyRgVph2CiW4aAtfpoH69EJFJfTxTR/OqnZ9Jx/3YiYi0ksrvDenJddYodfWWJqD8/w==", 426 | "dependencies": { 427 | "@aws-crypto/crc32": "3.0.0", 428 | "@aws-sdk/types": "3.347.0", 429 | "@aws-sdk/util-hex-encoding": "3.310.0", 430 | "tslib": "^2.5.0" 431 | } 432 | }, 433 | "node_modules/@aws-sdk/fetch-http-handler": { 434 | "version": "3.353.0", 435 | "resolved": "https://registry.npmjs.org/@aws-sdk/fetch-http-handler/-/fetch-http-handler-3.353.0.tgz", 436 | "integrity": "sha512-8ic2+4E6jzfDevd++QS1rOR05QFkAhEFbi5Ja3/Zzp7TkWIS8wv5wwMATjNkbbdsXYuB5Lhl/OsjfZmIv5aqRw==", 437 | "dependencies": { 438 | "@aws-sdk/protocol-http": "3.347.0", 439 | "@aws-sdk/querystring-builder": "3.347.0", 440 | "@aws-sdk/types": "3.347.0", 441 | "@aws-sdk/util-base64": "3.310.0", 442 | "tslib": "^2.5.0" 443 | } 444 | }, 445 | "node_modules/@aws-sdk/hash-node": { 446 | "version": "3.347.0", 447 | "resolved": "https://registry.npmjs.org/@aws-sdk/hash-node/-/hash-node-3.347.0.tgz", 448 | "integrity": "sha512-96+ml/4EaUaVpzBdOLGOxdoXOjkPgkoJp/0i1fxOJEvl8wdAQSwc3IugVK9wZkCxy2DlENtgOe6DfIOhfffm/g==", 449 | "dependencies": { 450 | "@aws-sdk/types": "3.347.0", 451 | "@aws-sdk/util-buffer-from": "3.310.0", 452 | "@aws-sdk/util-utf8": "3.310.0", 453 | "tslib": "^2.5.0" 454 | }, 455 | "engines": { 456 | "node": ">=14.0.0" 457 | } 458 | }, 459 | "node_modules/@aws-sdk/invalid-dependency": { 460 | "version": "3.347.0", 461 | "resolved": "https://registry.npmjs.org/@aws-sdk/invalid-dependency/-/invalid-dependency-3.347.0.tgz", 462 | "integrity": "sha512-8imQcwLwqZ/wTJXZqzXT9pGLIksTRckhGLZaXT60tiBOPKuerTsus2L59UstLs5LP8TKaVZKFFSsjRIn9dQdmQ==", 463 | "dependencies": { 464 | "@aws-sdk/types": "3.347.0", 465 | "tslib": "^2.5.0" 466 | } 467 | }, 468 | "node_modules/@aws-sdk/is-array-buffer": { 469 | "version": "3.310.0", 470 | "resolved": "https://registry.npmjs.org/@aws-sdk/is-array-buffer/-/is-array-buffer-3.310.0.tgz", 471 | "integrity": "sha512-urnbcCR+h9NWUnmOtet/s4ghvzsidFmspfhYaHAmSRdy9yDjdjBJMFjjsn85A1ODUktztm+cVncXjQ38WCMjMQ==", 472 | "dependencies": { 473 | "tslib": "^2.5.0" 474 | }, 475 | "engines": { 476 | "node": ">=14.0.0" 477 | } 478 | }, 479 | "node_modules/@aws-sdk/md5-js": { 480 | "version": "3.347.0", 481 | "resolved": "https://registry.npmjs.org/@aws-sdk/md5-js/-/md5-js-3.347.0.tgz", 482 | "integrity": "sha512-mChE+7DByTY9H4cQ6fnWp2x5jf8e6OZN+AdLp6WQ+W99z35zBeqBxVmgm8ziJwkMIrkSTv9j3Y7T9Ve3RIcSfg==", 483 | "dependencies": { 484 | "@aws-sdk/types": "3.347.0", 485 | "@aws-sdk/util-utf8": "3.310.0", 486 | "tslib": "^2.5.0" 487 | } 488 | }, 489 | "node_modules/@aws-sdk/middleware-content-length": { 490 | "version": "3.347.0", 491 | "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-content-length/-/middleware-content-length-3.347.0.tgz", 492 | "integrity": "sha512-i4qtWTDImMaDUtwKQPbaZpXsReiwiBomM1cWymCU4bhz81HL01oIxOxOBuiM+3NlDoCSPr3KI6txZSz/8cqXCQ==", 493 | "dependencies": { 494 | "@aws-sdk/protocol-http": "3.347.0", 495 | "@aws-sdk/types": "3.347.0", 496 | "tslib": "^2.5.0" 497 | }, 498 | "engines": { 499 | "node": ">=14.0.0" 500 | } 501 | }, 502 | "node_modules/@aws-sdk/middleware-endpoint": { 503 | "version": "3.347.0", 504 | "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-endpoint/-/middleware-endpoint-3.347.0.tgz", 505 | "integrity": "sha512-unF0c6dMaUL1ffU+37Ugty43DgMnzPWXr/Jup/8GbK5fzzWT5NQq6dj9KHPubMbWeEjQbmczvhv25JuJdK8gNQ==", 506 | "dependencies": { 507 | "@aws-sdk/middleware-serde": "3.347.0", 508 | "@aws-sdk/types": "3.347.0", 509 | "@aws-sdk/url-parser": "3.347.0", 510 | "@aws-sdk/util-middleware": "3.347.0", 511 | "tslib": "^2.5.0" 512 | }, 513 | "engines": { 514 | "node": ">=14.0.0" 515 | } 516 | }, 517 | "node_modules/@aws-sdk/middleware-host-header": { 518 | "version": "3.347.0", 519 | "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-host-header/-/middleware-host-header-3.347.0.tgz", 520 | "integrity": "sha512-kpKmR9OvMlnReqp5sKcJkozbj1wmlblbVSbnQAIkzeQj2xD5dnVR3Nn2ogQKxSmU1Fv7dEroBtrruJ1o3fY38A==", 521 | "dependencies": { 522 | "@aws-sdk/protocol-http": "3.347.0", 523 | "@aws-sdk/types": "3.347.0", 524 | "tslib": "^2.5.0" 525 | }, 526 | "engines": { 527 | "node": ">=14.0.0" 528 | } 529 | }, 530 | "node_modules/@aws-sdk/middleware-logger": { 531 | "version": "3.347.0", 532 | "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-logger/-/middleware-logger-3.347.0.tgz", 533 | "integrity": "sha512-NYC+Id5UCkVn+3P1t/YtmHt75uED06vwaKyxDy0UmB2K66PZLVtwWbLpVWrhbroaw1bvUHYcRyQ9NIfnVcXQjA==", 534 | "dependencies": { 535 | "@aws-sdk/types": "3.347.0", 536 | "tslib": "^2.5.0" 537 | }, 538 | "engines": { 539 | "node": ">=14.0.0" 540 | } 541 | }, 542 | "node_modules/@aws-sdk/middleware-recursion-detection": { 543 | "version": "3.347.0", 544 | "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-recursion-detection/-/middleware-recursion-detection-3.347.0.tgz", 545 | "integrity": "sha512-qfnSvkFKCAMjMHR31NdsT0gv5Sq/ZHTUD4yQsSLpbVQ6iYAS834lrzXt41iyEHt57Y514uG7F/Xfvude3u4icQ==", 546 | "dependencies": { 547 | "@aws-sdk/protocol-http": "3.347.0", 548 | "@aws-sdk/types": "3.347.0", 549 | "tslib": "^2.5.0" 550 | }, 551 | "engines": { 552 | "node": ">=14.0.0" 553 | } 554 | }, 555 | "node_modules/@aws-sdk/middleware-retry": { 556 | "version": "3.354.0", 557 | "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-retry/-/middleware-retry-3.354.0.tgz", 558 | "integrity": "sha512-dnG5Nd/mobbhcWCM71DQWI9+f6b6fDSzALXftFIP/8lsXKRcWDSQuYjrnVST2wZzk/QmdF8TnVD0C1xL14K6CQ==", 559 | "dependencies": { 560 | "@aws-sdk/protocol-http": "3.347.0", 561 | "@aws-sdk/service-error-classification": "3.347.0", 562 | "@aws-sdk/types": "3.347.0", 563 | "@aws-sdk/util-middleware": "3.347.0", 564 | "@aws-sdk/util-retry": "3.347.0", 565 | "tslib": "^2.5.0", 566 | "uuid": "^8.3.2" 567 | }, 568 | "engines": { 569 | "node": ">=14.0.0" 570 | } 571 | }, 572 | "node_modules/@aws-sdk/middleware-sdk-sqs": { 573 | "version": "3.347.0", 574 | "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-sdk-sqs/-/middleware-sdk-sqs-3.347.0.tgz", 575 | "integrity": "sha512-TSBTQoOVe9cDm9am4NOov1YZxbQ3LPBl7Ex0jblDFgUXqE9kNU3Kx/yc8edOLcq+5AFrgqT0NFD7pwFlQPh3KQ==", 576 | "dependencies": { 577 | "@aws-sdk/types": "3.347.0", 578 | "@aws-sdk/util-hex-encoding": "3.310.0", 579 | "@aws-sdk/util-utf8": "3.310.0", 580 | "tslib": "^2.5.0" 581 | }, 582 | "engines": { 583 | "node": ">=14.0.0" 584 | } 585 | }, 586 | "node_modules/@aws-sdk/middleware-sdk-sts": { 587 | "version": "3.354.0", 588 | "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-sdk-sts/-/middleware-sdk-sts-3.354.0.tgz", 589 | "integrity": "sha512-L6vyAwYrdcOoB4YgCqNJNr+ZZtLHEF2Ym3CTfmFm2srXHqHuRB+mBu0NLV/grz77znIArK1H1ZL/ZaH2I5hclA==", 590 | "dependencies": { 591 | "@aws-sdk/middleware-signing": "3.354.0", 592 | "@aws-sdk/types": "3.347.0", 593 | "tslib": "^2.5.0" 594 | }, 595 | "engines": { 596 | "node": ">=14.0.0" 597 | } 598 | }, 599 | "node_modules/@aws-sdk/middleware-serde": { 600 | "version": "3.347.0", 601 | "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-serde/-/middleware-serde-3.347.0.tgz", 602 | "integrity": "sha512-x5Foi7jRbVJXDu9bHfyCbhYDH5pKK+31MmsSJ3k8rY8keXLBxm2XEEg/AIoV9/TUF9EeVvZ7F1/RmMpJnWQsEg==", 603 | "dependencies": { 604 | "@aws-sdk/types": "3.347.0", 605 | "tslib": "^2.5.0" 606 | }, 607 | "engines": { 608 | "node": ">=14.0.0" 609 | } 610 | }, 611 | "node_modules/@aws-sdk/middleware-signing": { 612 | "version": "3.354.0", 613 | "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-signing/-/middleware-signing-3.354.0.tgz", 614 | "integrity": "sha512-Dd+vIhJL0VqqKWqlTKlKC5jkCaEIk73ZEXNfv44XbsI25a0vXbatHp1M8jB/cgkJC/Mri1TX9dmckP/C0FDEwA==", 615 | "dependencies": { 616 | "@aws-sdk/property-provider": "3.353.0", 617 | "@aws-sdk/protocol-http": "3.347.0", 618 | "@aws-sdk/signature-v4": "3.354.0", 619 | "@aws-sdk/types": "3.347.0", 620 | "@aws-sdk/util-middleware": "3.347.0", 621 | "tslib": "^2.5.0" 622 | }, 623 | "engines": { 624 | "node": ">=14.0.0" 625 | } 626 | }, 627 | "node_modules/@aws-sdk/middleware-stack": { 628 | "version": "3.347.0", 629 | "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-stack/-/middleware-stack-3.347.0.tgz", 630 | "integrity": "sha512-Izidg4rqtYMcKuvn2UzgEpPLSmyd8ub9+LQ2oIzG3mpIzCBITq7wp40jN1iNkMg+X6KEnX9vdMJIYZsPYMCYuQ==", 631 | "dependencies": { 632 | "tslib": "^2.5.0" 633 | }, 634 | "engines": { 635 | "node": ">=14.0.0" 636 | } 637 | }, 638 | "node_modules/@aws-sdk/middleware-user-agent": { 639 | "version": "3.352.0", 640 | "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-user-agent/-/middleware-user-agent-3.352.0.tgz", 641 | "integrity": "sha512-QGqblMTsVDqeomy22KPm9LUW8PHZXBA2Hjk9Hcw8U1uFS8IKYJrewInG3ae2+9FAcTyug4LFWDf8CRr9YH2B3Q==", 642 | "dependencies": { 643 | "@aws-sdk/protocol-http": "3.347.0", 644 | "@aws-sdk/types": "3.347.0", 645 | "@aws-sdk/util-endpoints": "3.352.0", 646 | "tslib": "^2.5.0" 647 | }, 648 | "engines": { 649 | "node": ">=14.0.0" 650 | } 651 | }, 652 | "node_modules/@aws-sdk/node-config-provider": { 653 | "version": "3.354.0", 654 | "resolved": "https://registry.npmjs.org/@aws-sdk/node-config-provider/-/node-config-provider-3.354.0.tgz", 655 | "integrity": "sha512-pF1ZGWWvmwbrloNHYF3EDqCb9hq5wfZwDqAwAPhWkYnUYKkR7E7MZVuTwUDU48io8k6Z5pM52l/54w8e8aedTw==", 656 | "dependencies": { 657 | "@aws-sdk/property-provider": "3.353.0", 658 | "@aws-sdk/shared-ini-file-loader": "3.354.0", 659 | "@aws-sdk/types": "3.347.0", 660 | "tslib": "^2.5.0" 661 | }, 662 | "engines": { 663 | "node": ">=14.0.0" 664 | } 665 | }, 666 | "node_modules/@aws-sdk/node-http-handler": { 667 | "version": "3.350.0", 668 | "resolved": "https://registry.npmjs.org/@aws-sdk/node-http-handler/-/node-http-handler-3.350.0.tgz", 669 | "integrity": "sha512-oD96GAlmpzYilCdC8wwyURM5lNfNHZCjm/kxBkQulHKa2kRbIrnD9GfDqdCkWA5cTpjh1NzGLT4D6e6UFDjt9w==", 670 | "dependencies": { 671 | "@aws-sdk/abort-controller": "3.347.0", 672 | "@aws-sdk/protocol-http": "3.347.0", 673 | "@aws-sdk/querystring-builder": "3.347.0", 674 | "@aws-sdk/types": "3.347.0", 675 | "tslib": "^2.5.0" 676 | }, 677 | "engines": { 678 | "node": ">=14.0.0" 679 | } 680 | }, 681 | "node_modules/@aws-sdk/property-provider": { 682 | "version": "3.353.0", 683 | "resolved": "https://registry.npmjs.org/@aws-sdk/property-provider/-/property-provider-3.353.0.tgz", 684 | "integrity": "sha512-Iu6J59hncaew7eBKroTcLjZ8cgrom0IWyZZ09rsow3rZDHVtw7LQSrUyuqsSbKGY9eRtL7Wa6ZtYHnXFiAE2kg==", 685 | "dependencies": { 686 | "@aws-sdk/types": "3.347.0", 687 | "tslib": "^2.5.0" 688 | }, 689 | "engines": { 690 | "node": ">=14.0.0" 691 | } 692 | }, 693 | "node_modules/@aws-sdk/protocol-http": { 694 | "version": "3.347.0", 695 | "resolved": "https://registry.npmjs.org/@aws-sdk/protocol-http/-/protocol-http-3.347.0.tgz", 696 | "integrity": "sha512-2YdBhc02Wvy03YjhGwUxF0UQgrPWEy8Iq75pfS42N+/0B/+eWX1aQgfjFxIpLg7YSjT5eKtYOQGlYd4MFTgj9g==", 697 | "dependencies": { 698 | "@aws-sdk/types": "3.347.0", 699 | "tslib": "^2.5.0" 700 | }, 701 | "engines": { 702 | "node": ">=14.0.0" 703 | } 704 | }, 705 | "node_modules/@aws-sdk/querystring-builder": { 706 | "version": "3.347.0", 707 | "resolved": "https://registry.npmjs.org/@aws-sdk/querystring-builder/-/querystring-builder-3.347.0.tgz", 708 | "integrity": "sha512-phtKTe6FXoV02MoPkIVV6owXI8Mwr5IBN3bPoxhcPvJG2AjEmnetSIrhb8kwc4oNhlwfZwH6Jo5ARW/VEWbZtg==", 709 | "dependencies": { 710 | "@aws-sdk/types": "3.347.0", 711 | "@aws-sdk/util-uri-escape": "3.310.0", 712 | "tslib": "^2.5.0" 713 | }, 714 | "engines": { 715 | "node": ">=14.0.0" 716 | } 717 | }, 718 | "node_modules/@aws-sdk/querystring-parser": { 719 | "version": "3.347.0", 720 | "resolved": "https://registry.npmjs.org/@aws-sdk/querystring-parser/-/querystring-parser-3.347.0.tgz", 721 | "integrity": "sha512-5VXOhfZz78T2W7SuXf2avfjKglx1VZgZgp9Zfhrt/Rq+MTu2D+PZc5zmJHhYigD7x83jLSLogpuInQpFMA9LgA==", 722 | "dependencies": { 723 | "@aws-sdk/types": "3.347.0", 724 | "tslib": "^2.5.0" 725 | }, 726 | "engines": { 727 | "node": ">=14.0.0" 728 | } 729 | }, 730 | "node_modules/@aws-sdk/service-error-classification": { 731 | "version": "3.347.0", 732 | "resolved": "https://registry.npmjs.org/@aws-sdk/service-error-classification/-/service-error-classification-3.347.0.tgz", 733 | "integrity": "sha512-xZ3MqSY81Oy2gh5g0fCtooAbahqh9VhsF8vcKjVX8+XPbGC8y+kej82+MsMg4gYL8gRFB9u4hgYbNgIS6JTAvg==", 734 | "engines": { 735 | "node": ">=14.0.0" 736 | } 737 | }, 738 | "node_modules/@aws-sdk/shared-ini-file-loader": { 739 | "version": "3.354.0", 740 | "resolved": "https://registry.npmjs.org/@aws-sdk/shared-ini-file-loader/-/shared-ini-file-loader-3.354.0.tgz", 741 | "integrity": "sha512-UL9loGEsdzpHBu/PtlwUvkl/yRdmWXkySp22jUaeeRtBhiGAnyeYhxJLIt+u+UkX7Mwz+810SaZJqA9ptOXNAg==", 742 | "dependencies": { 743 | "@aws-sdk/types": "3.347.0", 744 | "tslib": "^2.5.0" 745 | }, 746 | "engines": { 747 | "node": ">=14.0.0" 748 | } 749 | }, 750 | "node_modules/@aws-sdk/signature-v4": { 751 | "version": "3.354.0", 752 | "resolved": "https://registry.npmjs.org/@aws-sdk/signature-v4/-/signature-v4-3.354.0.tgz", 753 | "integrity": "sha512-bDp43P5NkwwznpZqmsr78DuyqNcjtS4mriuajb8XPhFNo8DrMXUrdrKJ+5aNABW7YG8uK8PSKBpq88ado692/w==", 754 | "dependencies": { 755 | "@aws-sdk/eventstream-codec": "3.347.0", 756 | "@aws-sdk/is-array-buffer": "3.310.0", 757 | "@aws-sdk/types": "3.347.0", 758 | "@aws-sdk/util-hex-encoding": "3.310.0", 759 | "@aws-sdk/util-middleware": "3.347.0", 760 | "@aws-sdk/util-uri-escape": "3.310.0", 761 | "@aws-sdk/util-utf8": "3.310.0", 762 | "tslib": "^2.5.0" 763 | }, 764 | "engines": { 765 | "node": ">=14.0.0" 766 | } 767 | }, 768 | "node_modules/@aws-sdk/smithy-client": { 769 | "version": "3.347.0", 770 | "resolved": "https://registry.npmjs.org/@aws-sdk/smithy-client/-/smithy-client-3.347.0.tgz", 771 | "integrity": "sha512-PaGTDsJLGK0sTjA6YdYQzILRlPRN3uVFyqeBUkfltXssvUzkm8z2t1lz2H4VyJLAhwnG5ZuZTNEV/2mcWrU7JQ==", 772 | "dependencies": { 773 | "@aws-sdk/middleware-stack": "3.347.0", 774 | "@aws-sdk/types": "3.347.0", 775 | "tslib": "^2.5.0" 776 | }, 777 | "engines": { 778 | "node": ">=14.0.0" 779 | } 780 | }, 781 | "node_modules/@aws-sdk/token-providers": { 782 | "version": "3.354.0", 783 | "resolved": "https://registry.npmjs.org/@aws-sdk/token-providers/-/token-providers-3.354.0.tgz", 784 | "integrity": "sha512-KcijiySy0oIyafKQagcwgu0fo35mK+2K8pwxRU1WfXqe80Gn1qGceeWcG4iW+t/rUaxa/LVo857N0LcagxCrZA==", 785 | "dependencies": { 786 | "@aws-sdk/client-sso-oidc": "3.354.0", 787 | "@aws-sdk/property-provider": "3.353.0", 788 | "@aws-sdk/shared-ini-file-loader": "3.354.0", 789 | "@aws-sdk/types": "3.347.0", 790 | "tslib": "^2.5.0" 791 | }, 792 | "engines": { 793 | "node": ">=14.0.0" 794 | } 795 | }, 796 | "node_modules/@aws-sdk/types": { 797 | "version": "3.347.0", 798 | "resolved": "https://registry.npmjs.org/@aws-sdk/types/-/types-3.347.0.tgz", 799 | "integrity": "sha512-GkCMy79mdjU9OTIe5KT58fI/6uqdf8UmMdWqVHmFJ+UpEzOci7L/uw4sOXWo7xpPzLs6cJ7s5ouGZW4GRPmHFA==", 800 | "dependencies": { 801 | "tslib": "^2.5.0" 802 | }, 803 | "engines": { 804 | "node": ">=14.0.0" 805 | } 806 | }, 807 | "node_modules/@aws-sdk/url-parser": { 808 | "version": "3.347.0", 809 | "resolved": "https://registry.npmjs.org/@aws-sdk/url-parser/-/url-parser-3.347.0.tgz", 810 | "integrity": "sha512-lhrnVjxdV7hl+yCnJfDZOaVLSqKjxN20MIOiijRiqaWGLGEAiSqBreMhL89X1WKCifxAs4zZf9YB9SbdziRpAA==", 811 | "dependencies": { 812 | "@aws-sdk/querystring-parser": "3.347.0", 813 | "@aws-sdk/types": "3.347.0", 814 | "tslib": "^2.5.0" 815 | } 816 | }, 817 | "node_modules/@aws-sdk/util-base64": { 818 | "version": "3.310.0", 819 | "resolved": "https://registry.npmjs.org/@aws-sdk/util-base64/-/util-base64-3.310.0.tgz", 820 | "integrity": "sha512-v3+HBKQvqgdzcbL+pFswlx5HQsd9L6ZTlyPVL2LS9nNXnCcR3XgGz9jRskikRUuUvUXtkSG1J88GAOnJ/apTPg==", 821 | "dependencies": { 822 | "@aws-sdk/util-buffer-from": "3.310.0", 823 | "tslib": "^2.5.0" 824 | }, 825 | "engines": { 826 | "node": ">=14.0.0" 827 | } 828 | }, 829 | "node_modules/@aws-sdk/util-body-length-browser": { 830 | "version": "3.310.0", 831 | "resolved": "https://registry.npmjs.org/@aws-sdk/util-body-length-browser/-/util-body-length-browser-3.310.0.tgz", 832 | "integrity": "sha512-sxsC3lPBGfpHtNTUoGXMQXLwjmR0zVpx0rSvzTPAuoVILVsp5AU/w5FphNPxD5OVIjNbZv9KsKTuvNTiZjDp9g==", 833 | "dependencies": { 834 | "tslib": "^2.5.0" 835 | } 836 | }, 837 | "node_modules/@aws-sdk/util-body-length-node": { 838 | "version": "3.310.0", 839 | "resolved": "https://registry.npmjs.org/@aws-sdk/util-body-length-node/-/util-body-length-node-3.310.0.tgz", 840 | "integrity": "sha512-2tqGXdyKhyA6w4zz7UPoS8Ip+7sayOg9BwHNidiGm2ikbDxm1YrCfYXvCBdwaJxa4hJfRVz+aL9e+d3GqPI9pQ==", 841 | "dependencies": { 842 | "tslib": "^2.5.0" 843 | }, 844 | "engines": { 845 | "node": ">=14.0.0" 846 | } 847 | }, 848 | "node_modules/@aws-sdk/util-buffer-from": { 849 | "version": "3.310.0", 850 | "resolved": "https://registry.npmjs.org/@aws-sdk/util-buffer-from/-/util-buffer-from-3.310.0.tgz", 851 | "integrity": "sha512-i6LVeXFtGih5Zs8enLrt+ExXY92QV25jtEnTKHsmlFqFAuL3VBeod6boeMXkN2p9lbSVVQ1sAOOYZOHYbYkntw==", 852 | "dependencies": { 853 | "@aws-sdk/is-array-buffer": "3.310.0", 854 | "tslib": "^2.5.0" 855 | }, 856 | "engines": { 857 | "node": ">=14.0.0" 858 | } 859 | }, 860 | "node_modules/@aws-sdk/util-config-provider": { 861 | "version": "3.310.0", 862 | "resolved": "https://registry.npmjs.org/@aws-sdk/util-config-provider/-/util-config-provider-3.310.0.tgz", 863 | "integrity": "sha512-xIBaYo8dwiojCw8vnUcIL4Z5tyfb1v3yjqyJKJWV/dqKUFOOS0U591plmXbM+M/QkXyML3ypon1f8+BoaDExrg==", 864 | "dependencies": { 865 | "tslib": "^2.5.0" 866 | }, 867 | "engines": { 868 | "node": ">=14.0.0" 869 | } 870 | }, 871 | "node_modules/@aws-sdk/util-defaults-mode-browser": { 872 | "version": "3.353.0", 873 | "resolved": "https://registry.npmjs.org/@aws-sdk/util-defaults-mode-browser/-/util-defaults-mode-browser-3.353.0.tgz", 874 | "integrity": "sha512-ushvOQKJIH7S6E//xMDPyf2/Bbu0K2A0GJRB88qQV6VKRBo4PEbeHTb6BbzPhYVX0IbY3uR/X7+Xwk4FeEkMWg==", 875 | "dependencies": { 876 | "@aws-sdk/property-provider": "3.353.0", 877 | "@aws-sdk/types": "3.347.0", 878 | "bowser": "^2.11.0", 879 | "tslib": "^2.5.0" 880 | }, 881 | "engines": { 882 | "node": ">= 10.0.0" 883 | } 884 | }, 885 | "node_modules/@aws-sdk/util-defaults-mode-node": { 886 | "version": "3.354.0", 887 | "resolved": "https://registry.npmjs.org/@aws-sdk/util-defaults-mode-node/-/util-defaults-mode-node-3.354.0.tgz", 888 | "integrity": "sha512-CaaRVBdOYX4wZadj+CDUxpO+4RjyYJcSv71A60jV6CZ/ya1+oYfmPbG5QZ4AlV6crdev2B+aUoR2LPIYqn/GnQ==", 889 | "dependencies": { 890 | "@aws-sdk/config-resolver": "3.354.0", 891 | "@aws-sdk/credential-provider-imds": "3.354.0", 892 | "@aws-sdk/node-config-provider": "3.354.0", 893 | "@aws-sdk/property-provider": "3.353.0", 894 | "@aws-sdk/types": "3.347.0", 895 | "tslib": "^2.5.0" 896 | }, 897 | "engines": { 898 | "node": ">= 10.0.0" 899 | } 900 | }, 901 | "node_modules/@aws-sdk/util-endpoints": { 902 | "version": "3.352.0", 903 | "resolved": "https://registry.npmjs.org/@aws-sdk/util-endpoints/-/util-endpoints-3.352.0.tgz", 904 | "integrity": "sha512-PjWMPdoIUWfBPgAWLyOrWFbdSS/3DJtc0OmFb/JrE8C8rKFYl+VGW5f1p0cVdRWiDR0xCGr0s67p8itAakVqjw==", 905 | "dependencies": { 906 | "@aws-sdk/types": "3.347.0", 907 | "tslib": "^2.5.0" 908 | }, 909 | "engines": { 910 | "node": ">=14.0.0" 911 | } 912 | }, 913 | "node_modules/@aws-sdk/util-hex-encoding": { 914 | "version": "3.310.0", 915 | "resolved": "https://registry.npmjs.org/@aws-sdk/util-hex-encoding/-/util-hex-encoding-3.310.0.tgz", 916 | "integrity": "sha512-sVN7mcCCDSJ67pI1ZMtk84SKGqyix6/0A1Ab163YKn+lFBQRMKexleZzpYzNGxYzmQS6VanP/cfU7NiLQOaSfA==", 917 | "dependencies": { 918 | "tslib": "^2.5.0" 919 | }, 920 | "engines": { 921 | "node": ">=14.0.0" 922 | } 923 | }, 924 | "node_modules/@aws-sdk/util-locate-window": { 925 | "version": "3.310.0", 926 | "resolved": "https://registry.npmjs.org/@aws-sdk/util-locate-window/-/util-locate-window-3.310.0.tgz", 927 | "integrity": "sha512-qo2t/vBTnoXpjKxlsC2e1gBrRm80M3bId27r0BRB2VniSSe7bL1mmzM+/HFtujm0iAxtPM+aLEflLJlJeDPg0w==", 928 | "dependencies": { 929 | "tslib": "^2.5.0" 930 | }, 931 | "engines": { 932 | "node": ">=14.0.0" 933 | } 934 | }, 935 | "node_modules/@aws-sdk/util-middleware": { 936 | "version": "3.347.0", 937 | "resolved": "https://registry.npmjs.org/@aws-sdk/util-middleware/-/util-middleware-3.347.0.tgz", 938 | "integrity": "sha512-8owqUA3ePufeYTUvlzdJ7Z0miLorTwx+rNol5lourGQZ9JXsVMo23+yGA7nOlFuXSGkoKpMOtn6S0BT2bcfeiw==", 939 | "dependencies": { 940 | "tslib": "^2.5.0" 941 | }, 942 | "engines": { 943 | "node": ">=14.0.0" 944 | } 945 | }, 946 | "node_modules/@aws-sdk/util-retry": { 947 | "version": "3.347.0", 948 | "resolved": "https://registry.npmjs.org/@aws-sdk/util-retry/-/util-retry-3.347.0.tgz", 949 | "integrity": "sha512-NxnQA0/FHFxriQAeEgBonA43Q9/VPFQa8cfJDuT2A1YZruMasgjcltoZszi1dvoIRWSZsFTW42eY2gdOd0nffQ==", 950 | "dependencies": { 951 | "@aws-sdk/service-error-classification": "3.347.0", 952 | "tslib": "^2.5.0" 953 | }, 954 | "engines": { 955 | "node": ">= 14.0.0" 956 | } 957 | }, 958 | "node_modules/@aws-sdk/util-uri-escape": { 959 | "version": "3.310.0", 960 | "resolved": "https://registry.npmjs.org/@aws-sdk/util-uri-escape/-/util-uri-escape-3.310.0.tgz", 961 | "integrity": "sha512-drzt+aB2qo2LgtDoiy/3sVG8w63cgLkqFIa2NFlGpUgHFWTXkqtbgf4L5QdjRGKWhmZsnqkbtL7vkSWEcYDJ4Q==", 962 | "dependencies": { 963 | "tslib": "^2.5.0" 964 | }, 965 | "engines": { 966 | "node": ">=14.0.0" 967 | } 968 | }, 969 | "node_modules/@aws-sdk/util-user-agent-browser": { 970 | "version": "3.347.0", 971 | "resolved": "https://registry.npmjs.org/@aws-sdk/util-user-agent-browser/-/util-user-agent-browser-3.347.0.tgz", 972 | "integrity": "sha512-ydxtsKVtQefgbk1Dku1q7pMkjDYThauG9/8mQkZUAVik55OUZw71Zzr3XO8J8RKvQG8lmhPXuAQ0FKAyycc0RA==", 973 | "dependencies": { 974 | "@aws-sdk/types": "3.347.0", 975 | "bowser": "^2.11.0", 976 | "tslib": "^2.5.0" 977 | } 978 | }, 979 | "node_modules/@aws-sdk/util-user-agent-node": { 980 | "version": "3.354.0", 981 | "resolved": "https://registry.npmjs.org/@aws-sdk/util-user-agent-node/-/util-user-agent-node-3.354.0.tgz", 982 | "integrity": "sha512-2xkblZS3PGxxh//0lgCwJw2gvh9ZBcI9H9xv05YP7hcwlz9BmkAlbei2i6Uew6agJMLO4unfgWoBTpzp3WLaKg==", 983 | "dependencies": { 984 | "@aws-sdk/node-config-provider": "3.354.0", 985 | "@aws-sdk/types": "3.347.0", 986 | "tslib": "^2.5.0" 987 | }, 988 | "engines": { 989 | "node": ">=14.0.0" 990 | }, 991 | "peerDependencies": { 992 | "aws-crt": ">=1.0.0" 993 | }, 994 | "peerDependenciesMeta": { 995 | "aws-crt": { 996 | "optional": true 997 | } 998 | } 999 | }, 1000 | "node_modules/@aws-sdk/util-utf8": { 1001 | "version": "3.310.0", 1002 | "resolved": "https://registry.npmjs.org/@aws-sdk/util-utf8/-/util-utf8-3.310.0.tgz", 1003 | "integrity": "sha512-DnLfFT8uCO22uOJc0pt0DsSNau1GTisngBCDw8jQuWT5CqogMJu4b/uXmwEqfj8B3GX6Xsz8zOd6JpRlPftQoA==", 1004 | "dependencies": { 1005 | "@aws-sdk/util-buffer-from": "3.310.0", 1006 | "tslib": "^2.5.0" 1007 | }, 1008 | "engines": { 1009 | "node": ">=14.0.0" 1010 | } 1011 | }, 1012 | "node_modules/@aws-sdk/util-utf8-browser": { 1013 | "version": "3.259.0", 1014 | "resolved": "https://registry.npmjs.org/@aws-sdk/util-utf8-browser/-/util-utf8-browser-3.259.0.tgz", 1015 | "integrity": "sha512-UvFa/vR+e19XookZF8RzFZBrw2EUkQWxiBW0yYQAhvk3C+QVGl0H3ouca8LDBlBfQKXwmW3huo/59H8rwb1wJw==", 1016 | "dependencies": { 1017 | "tslib": "^2.3.1" 1018 | } 1019 | }, 1020 | "node_modules/@sindresorhus/is": { 1021 | "version": "5.3.0", 1022 | "resolved": "https://registry.npmjs.org/@sindresorhus/is/-/is-5.3.0.tgz", 1023 | "integrity": "sha512-CX6t4SYQ37lzxicAqsBtxA3OseeoVrh9cSJ5PFYam0GksYlupRfy1A+Q4aYD3zvcfECLc0zO2u+ZnR2UYKvCrw==", 1024 | "engines": { 1025 | "node": ">=14.16" 1026 | }, 1027 | "funding": { 1028 | "url": "https://github.com/sindresorhus/is?sponsor=1" 1029 | } 1030 | }, 1031 | "node_modules/@smithy/protocol-http": { 1032 | "version": "1.1.0", 1033 | "resolved": "https://registry.npmjs.org/@smithy/protocol-http/-/protocol-http-1.1.0.tgz", 1034 | "integrity": "sha512-H5y/kZOqfJSqRkwtcAoVbqONmhdXwSgYNJ1Glk5Ry8qlhVVy5qUzD9EklaCH8/XLnoCsLO/F/Giee8MIvaBRkg==", 1035 | "dependencies": { 1036 | "@smithy/types": "^1.1.0", 1037 | "tslib": "^2.5.0" 1038 | }, 1039 | "engines": { 1040 | "node": ">=14.0.0" 1041 | } 1042 | }, 1043 | "node_modules/@smithy/types": { 1044 | "version": "1.1.0", 1045 | "resolved": "https://registry.npmjs.org/@smithy/types/-/types-1.1.0.tgz", 1046 | "integrity": "sha512-KzmvisMmuwD2jZXuC9e65JrgsZM97y5NpDU7g347oB+Q+xQLU6hQZ5zFNNbEfwwOJHoOvEVTna+dk1h/lW7alw==", 1047 | "dependencies": { 1048 | "tslib": "^2.5.0" 1049 | }, 1050 | "engines": { 1051 | "node": ">=14.0.0" 1052 | } 1053 | }, 1054 | "node_modules/@szmarczak/http-timer": { 1055 | "version": "5.0.1", 1056 | "resolved": "https://registry.npmjs.org/@szmarczak/http-timer/-/http-timer-5.0.1.tgz", 1057 | "integrity": "sha512-+PmQX0PiAYPMeVYe237LJAYvOMYW1j2rH5YROyS3b4CTVJum34HfRvKvAzozHAQG0TnHNdUfY9nCeUyRAs//cw==", 1058 | "dependencies": { 1059 | "defer-to-connect": "^2.0.1" 1060 | }, 1061 | "engines": { 1062 | "node": ">=14.16" 1063 | } 1064 | }, 1065 | "node_modules/@types/http-cache-semantics": { 1066 | "version": "4.0.1", 1067 | "resolved": "https://registry.npmjs.org/@types/http-cache-semantics/-/http-cache-semantics-4.0.1.tgz", 1068 | "integrity": "sha512-SZs7ekbP8CN0txVG2xVRH6EgKmEm31BOxA07vkFaETzZz1xh+cbt8BcI0slpymvwhx5dlFnQG2rTlPVQn+iRPQ==" 1069 | }, 1070 | "node_modules/bowser": { 1071 | "version": "2.11.0", 1072 | "resolved": "https://registry.npmjs.org/bowser/-/bowser-2.11.0.tgz", 1073 | "integrity": "sha512-AlcaJBi/pqqJBIQ8U9Mcpc9i8Aqxn88Skv5d+xBX006BY5u8N3mGLHa5Lgppa7L/HfwgwLgZ6NYs+Ag6uUmJRA==" 1074 | }, 1075 | "node_modules/cacheable-lookup": { 1076 | "version": "7.0.0", 1077 | "resolved": "https://registry.npmjs.org/cacheable-lookup/-/cacheable-lookup-7.0.0.tgz", 1078 | "integrity": "sha512-+qJyx4xiKra8mZrcwhjMRMUhD5NR1R8esPkzIYxX96JiecFoxAXFuz/GpR3+ev4PE1WamHip78wV0vcmPQtp8w==", 1079 | "engines": { 1080 | "node": ">=14.16" 1081 | } 1082 | }, 1083 | "node_modules/cacheable-request": { 1084 | "version": "10.2.2", 1085 | "resolved": "https://registry.npmjs.org/cacheable-request/-/cacheable-request-10.2.2.tgz", 1086 | "integrity": "sha512-KxjQZM3UIo7/J6W4sLpwFvu1GB3Whv8NtZ8ZrUL284eiQjiXeeqWTdhixNrp/NLZ/JNuFBo6BD4ZaO8ZJ5BN8Q==", 1087 | "dependencies": { 1088 | "@types/http-cache-semantics": "^4.0.1", 1089 | "get-stream": "^6.0.1", 1090 | "http-cache-semantics": "^4.1.0", 1091 | "keyv": "^4.5.0", 1092 | "mimic-response": "^4.0.0", 1093 | "normalize-url": "^7.2.0", 1094 | "responselike": "^3.0.0" 1095 | }, 1096 | "engines": { 1097 | "node": ">=14.16" 1098 | } 1099 | }, 1100 | "node_modules/decompress-response": { 1101 | "version": "6.0.0", 1102 | "resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-6.0.0.tgz", 1103 | "integrity": "sha512-aW35yZM6Bb/4oJlZncMH2LCoZtJXTRxES17vE3hoRiowU2kWHaJKFkSBDnDR+cm9J+9QhXmREyIfv0pji9ejCQ==", 1104 | "dependencies": { 1105 | "mimic-response": "^3.1.0" 1106 | }, 1107 | "engines": { 1108 | "node": ">=10" 1109 | }, 1110 | "funding": { 1111 | "url": "https://github.com/sponsors/sindresorhus" 1112 | } 1113 | }, 1114 | "node_modules/decompress-response/node_modules/mimic-response": { 1115 | "version": "3.1.0", 1116 | "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-3.1.0.tgz", 1117 | "integrity": "sha512-z0yWI+4FDrrweS8Zmt4Ej5HdJmky15+L2e6Wgn3+iK5fWzb6T3fhNFq2+MeTRb064c6Wr4N/wv0DzQTjNzHNGQ==", 1118 | "engines": { 1119 | "node": ">=10" 1120 | }, 1121 | "funding": { 1122 | "url": "https://github.com/sponsors/sindresorhus" 1123 | } 1124 | }, 1125 | "node_modules/defer-to-connect": { 1126 | "version": "2.0.1", 1127 | "resolved": "https://registry.npmjs.org/defer-to-connect/-/defer-to-connect-2.0.1.tgz", 1128 | "integrity": "sha512-4tvttepXG1VaYGrRibk5EwJd1t4udunSOVMdLSAL6mId1ix438oPwPZMALY41FCijukO1L0twNcGsdzS7dHgDg==", 1129 | "engines": { 1130 | "node": ">=10" 1131 | } 1132 | }, 1133 | "node_modules/fast-xml-parser": { 1134 | "version": "4.2.4", 1135 | "resolved": "https://registry.npmjs.org/fast-xml-parser/-/fast-xml-parser-4.2.4.tgz", 1136 | "integrity": "sha512-fbfMDvgBNIdDJLdLOwacjFAPYt67tr31H9ZhWSm45CDAxvd0I6WTlSOUo7K2P/K5sA5JgMKG64PI3DMcaFdWpQ==", 1137 | "funding": [ 1138 | { 1139 | "type": "paypal", 1140 | "url": "https://paypal.me/naturalintelligence" 1141 | }, 1142 | { 1143 | "type": "github", 1144 | "url": "https://github.com/sponsors/NaturalIntelligence" 1145 | } 1146 | ], 1147 | "dependencies": { 1148 | "strnum": "^1.0.5" 1149 | }, 1150 | "bin": { 1151 | "fxparser": "src/cli/cli.js" 1152 | } 1153 | }, 1154 | "node_modules/form-data-encoder": { 1155 | "version": "2.1.3", 1156 | "resolved": "https://registry.npmjs.org/form-data-encoder/-/form-data-encoder-2.1.3.tgz", 1157 | "integrity": "sha512-KqU0nnPMgIJcCOFTNJFEA8epcseEaoox4XZffTgy8jlI6pL/5EFyR54NRG7CnCJN0biY7q52DO3MH6/sJ/TKlQ==", 1158 | "engines": { 1159 | "node": ">= 14.17" 1160 | } 1161 | }, 1162 | "node_modules/get-stream": { 1163 | "version": "6.0.1", 1164 | "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz", 1165 | "integrity": "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==", 1166 | "engines": { 1167 | "node": ">=10" 1168 | }, 1169 | "funding": { 1170 | "url": "https://github.com/sponsors/sindresorhus" 1171 | } 1172 | }, 1173 | "node_modules/got": { 1174 | "version": "12.5.2", 1175 | "resolved": "https://registry.npmjs.org/got/-/got-12.5.2.tgz", 1176 | "integrity": "sha512-guHGMSEcsA5m1oPRweXUJnug0vuvlkX9wx5hzOka+ZBrBUOJHU0Z1JcNu3QE5IPGnA5aXUsQHdWOD4eJg9/v3A==", 1177 | "dependencies": { 1178 | "@sindresorhus/is": "^5.2.0", 1179 | "@szmarczak/http-timer": "^5.0.1", 1180 | "cacheable-lookup": "^7.0.0", 1181 | "cacheable-request": "^10.2.1", 1182 | "decompress-response": "^6.0.0", 1183 | "form-data-encoder": "^2.1.2", 1184 | "get-stream": "^6.0.1", 1185 | "http2-wrapper": "^2.1.10", 1186 | "lowercase-keys": "^3.0.0", 1187 | "p-cancelable": "^3.0.0", 1188 | "responselike": "^3.0.0" 1189 | }, 1190 | "engines": { 1191 | "node": ">=14.16" 1192 | }, 1193 | "funding": { 1194 | "url": "https://github.com/sindresorhus/got?sponsor=1" 1195 | } 1196 | }, 1197 | "node_modules/http-cache-semantics": { 1198 | "version": "4.1.1", 1199 | "resolved": "https://registry.npmjs.org/http-cache-semantics/-/http-cache-semantics-4.1.1.tgz", 1200 | "integrity": "sha512-er295DKPVsV82j5kw1Gjt+ADA/XYHsajl82cGNQG2eyoPkvgUhX+nDIyelzhIWbbsXP39EHcI6l5tYs2FYqYXQ==" 1201 | }, 1202 | "node_modules/http2-wrapper": { 1203 | "version": "2.1.11", 1204 | "resolved": "https://registry.npmjs.org/http2-wrapper/-/http2-wrapper-2.1.11.tgz", 1205 | "integrity": "sha512-aNAk5JzLturWEUiuhAN73Jcbq96R7rTitAoXV54FYMatvihnpD2+6PUgU4ce3D/m5VDbw+F5CsyKSF176ptitQ==", 1206 | "dependencies": { 1207 | "quick-lru": "^5.1.1", 1208 | "resolve-alpn": "^1.2.0" 1209 | }, 1210 | "engines": { 1211 | "node": ">=10.19.0" 1212 | } 1213 | }, 1214 | "node_modules/json-buffer": { 1215 | "version": "3.0.1", 1216 | "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.1.tgz", 1217 | "integrity": "sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==" 1218 | }, 1219 | "node_modules/keyv": { 1220 | "version": "4.5.0", 1221 | "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.5.0.tgz", 1222 | "integrity": "sha512-2YvuMsA+jnFGtBareKqgANOEKe1mk3HKiXu2fRmAfyxG0MJAywNhi5ttWA3PMjl4NmpyjZNbFifR2vNjW1znfA==", 1223 | "dependencies": { 1224 | "json-buffer": "3.0.1" 1225 | } 1226 | }, 1227 | "node_modules/lowercase-keys": { 1228 | "version": "3.0.0", 1229 | "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-3.0.0.tgz", 1230 | "integrity": "sha512-ozCC6gdQ+glXOQsveKD0YsDy8DSQFjDTz4zyzEHNV5+JP5D62LmfDZ6o1cycFx9ouG940M5dE8C8CTewdj2YWQ==", 1231 | "engines": { 1232 | "node": "^12.20.0 || ^14.13.1 || >=16.0.0" 1233 | }, 1234 | "funding": { 1235 | "url": "https://github.com/sponsors/sindresorhus" 1236 | } 1237 | }, 1238 | "node_modules/mimic-response": { 1239 | "version": "4.0.0", 1240 | "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-4.0.0.tgz", 1241 | "integrity": "sha512-e5ISH9xMYU0DzrT+jl8q2ze9D6eWBto+I8CNpe+VI+K2J/F/k3PdkdTdz4wvGVH4NTpo+NRYTVIuMQEMMcsLqg==", 1242 | "engines": { 1243 | "node": "^12.20.0 || ^14.13.1 || >=16.0.0" 1244 | }, 1245 | "funding": { 1246 | "url": "https://github.com/sponsors/sindresorhus" 1247 | } 1248 | }, 1249 | "node_modules/normalize-url": { 1250 | "version": "7.2.0", 1251 | "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-7.2.0.tgz", 1252 | "integrity": "sha512-uhXOdZry0L6M2UIo9BTt7FdpBDiAGN/7oItedQwPKh8jh31ZlvC8U9Xl/EJ3aijDHaywXTW3QbZ6LuCocur1YA==", 1253 | "engines": { 1254 | "node": ">=12.20" 1255 | }, 1256 | "funding": { 1257 | "url": "https://github.com/sponsors/sindresorhus" 1258 | } 1259 | }, 1260 | "node_modules/p-cancelable": { 1261 | "version": "3.0.0", 1262 | "resolved": "https://registry.npmjs.org/p-cancelable/-/p-cancelable-3.0.0.tgz", 1263 | "integrity": "sha512-mlVgR3PGuzlo0MmTdk4cXqXWlwQDLnONTAg6sm62XkMJEiRxN3GL3SffkYvqwonbkJBcrI7Uvv5Zh9yjvn2iUw==", 1264 | "engines": { 1265 | "node": ">=12.20" 1266 | } 1267 | }, 1268 | "node_modules/quick-lru": { 1269 | "version": "5.1.1", 1270 | "resolved": "https://registry.npmjs.org/quick-lru/-/quick-lru-5.1.1.tgz", 1271 | "integrity": "sha512-WuyALRjWPDGtt/wzJiadO5AXY+8hZ80hVpe6MyivgraREW751X3SbhRvG3eLKOYN+8VEvqLcf3wdnt44Z4S4SA==", 1272 | "engines": { 1273 | "node": ">=10" 1274 | }, 1275 | "funding": { 1276 | "url": "https://github.com/sponsors/sindresorhus" 1277 | } 1278 | }, 1279 | "node_modules/resolve-alpn": { 1280 | "version": "1.2.1", 1281 | "resolved": "https://registry.npmjs.org/resolve-alpn/-/resolve-alpn-1.2.1.tgz", 1282 | "integrity": "sha512-0a1F4l73/ZFZOakJnQ3FvkJ2+gSTQWz/r2KE5OdDY0TxPm5h4GkqkWWfM47T7HsbnOtcJVEF4epCVy6u7Q3K+g==" 1283 | }, 1284 | "node_modules/responselike": { 1285 | "version": "3.0.0", 1286 | "resolved": "https://registry.npmjs.org/responselike/-/responselike-3.0.0.tgz", 1287 | "integrity": "sha512-40yHxbNcl2+rzXvZuVkrYohathsSJlMTXKryG5y8uciHv1+xDLHQpgjG64JUO9nrEq2jGLH6IZ8BcZyw3wrweg==", 1288 | "dependencies": { 1289 | "lowercase-keys": "^3.0.0" 1290 | }, 1291 | "engines": { 1292 | "node": ">=14.16" 1293 | }, 1294 | "funding": { 1295 | "url": "https://github.com/sponsors/sindresorhus" 1296 | } 1297 | }, 1298 | "node_modules/strnum": { 1299 | "version": "1.0.5", 1300 | "resolved": "https://registry.npmjs.org/strnum/-/strnum-1.0.5.tgz", 1301 | "integrity": "sha512-J8bbNyKKXl5qYcR36TIO8W3mVGVHrmmxsd5PAItGkmyzwJvybiw2IVq5nqd0i4LSNSkB/sx9VHllbfFdr9k1JA==" 1302 | }, 1303 | "node_modules/tslib": { 1304 | "version": "2.5.3", 1305 | "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.5.3.tgz", 1306 | "integrity": "sha512-mSxlJJwl3BMEQCUNnxXBU9jP4JBktcEGhURcPR6VQVlnP0FdDEsIaz0C35dXNGLyRfrATNofF0F5p2KPxQgB+w==" 1307 | }, 1308 | "node_modules/uuid": { 1309 | "version": "8.3.2", 1310 | "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz", 1311 | "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==", 1312 | "bin": { 1313 | "uuid": "dist/bin/uuid" 1314 | } 1315 | } 1316 | }, 1317 | "dependencies": { 1318 | "@aws-crypto/crc32": { 1319 | "version": "3.0.0", 1320 | "resolved": "https://registry.npmjs.org/@aws-crypto/crc32/-/crc32-3.0.0.tgz", 1321 | "integrity": "sha512-IzSgsrxUcsrejQbPVilIKy16kAT52EwB6zSaI+M3xxIhKh5+aldEyvI+z6erM7TCLB2BJsFrtHjp6/4/sr+3dA==", 1322 | "requires": { 1323 | "@aws-crypto/util": "^3.0.0", 1324 | "@aws-sdk/types": "^3.222.0", 1325 | "tslib": "^1.11.1" 1326 | }, 1327 | "dependencies": { 1328 | "tslib": { 1329 | "version": "1.14.1", 1330 | "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", 1331 | "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==" 1332 | } 1333 | } 1334 | }, 1335 | "@aws-crypto/ie11-detection": { 1336 | "version": "3.0.0", 1337 | "resolved": "https://registry.npmjs.org/@aws-crypto/ie11-detection/-/ie11-detection-3.0.0.tgz", 1338 | "integrity": "sha512-341lBBkiY1DfDNKai/wXM3aujNBkXR7tq1URPQDL9wi3AUbI80NR74uF1TXHMm7po1AcnFk8iu2S2IeU/+/A+Q==", 1339 | "requires": { 1340 | "tslib": "^1.11.1" 1341 | }, 1342 | "dependencies": { 1343 | "tslib": { 1344 | "version": "1.14.1", 1345 | "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", 1346 | "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==" 1347 | } 1348 | } 1349 | }, 1350 | "@aws-crypto/sha256-browser": { 1351 | "version": "3.0.0", 1352 | "resolved": "https://registry.npmjs.org/@aws-crypto/sha256-browser/-/sha256-browser-3.0.0.tgz", 1353 | "integrity": "sha512-8VLmW2B+gjFbU5uMeqtQM6Nj0/F1bro80xQXCW6CQBWgosFWXTx77aeOF5CAIAmbOK64SdMBJdNr6J41yP5mvQ==", 1354 | "requires": { 1355 | "@aws-crypto/ie11-detection": "^3.0.0", 1356 | "@aws-crypto/sha256-js": "^3.0.0", 1357 | "@aws-crypto/supports-web-crypto": "^3.0.0", 1358 | "@aws-crypto/util": "^3.0.0", 1359 | "@aws-sdk/types": "^3.222.0", 1360 | "@aws-sdk/util-locate-window": "^3.0.0", 1361 | "@aws-sdk/util-utf8-browser": "^3.0.0", 1362 | "tslib": "^1.11.1" 1363 | }, 1364 | "dependencies": { 1365 | "tslib": { 1366 | "version": "1.14.1", 1367 | "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", 1368 | "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==" 1369 | } 1370 | } 1371 | }, 1372 | "@aws-crypto/sha256-js": { 1373 | "version": "3.0.0", 1374 | "resolved": "https://registry.npmjs.org/@aws-crypto/sha256-js/-/sha256-js-3.0.0.tgz", 1375 | "integrity": "sha512-PnNN7os0+yd1XvXAy23CFOmTbMaDxgxXtTKHybrJ39Y8kGzBATgBFibWJKH6BhytLI/Zyszs87xCOBNyBig6vQ==", 1376 | "requires": { 1377 | "@aws-crypto/util": "^3.0.0", 1378 | "@aws-sdk/types": "^3.222.0", 1379 | "tslib": "^1.11.1" 1380 | }, 1381 | "dependencies": { 1382 | "tslib": { 1383 | "version": "1.14.1", 1384 | "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", 1385 | "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==" 1386 | } 1387 | } 1388 | }, 1389 | "@aws-crypto/supports-web-crypto": { 1390 | "version": "3.0.0", 1391 | "resolved": "https://registry.npmjs.org/@aws-crypto/supports-web-crypto/-/supports-web-crypto-3.0.0.tgz", 1392 | "integrity": "sha512-06hBdMwUAb2WFTuGG73LSC0wfPu93xWwo5vL2et9eymgmu3Id5vFAHBbajVWiGhPO37qcsdCap/FqXvJGJWPIg==", 1393 | "requires": { 1394 | "tslib": "^1.11.1" 1395 | }, 1396 | "dependencies": { 1397 | "tslib": { 1398 | "version": "1.14.1", 1399 | "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", 1400 | "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==" 1401 | } 1402 | } 1403 | }, 1404 | "@aws-crypto/util": { 1405 | "version": "3.0.0", 1406 | "resolved": "https://registry.npmjs.org/@aws-crypto/util/-/util-3.0.0.tgz", 1407 | "integrity": "sha512-2OJlpeJpCR48CC8r+uKVChzs9Iungj9wkZrl8Z041DWEWvyIHILYKCPNzJghKsivj+S3mLo6BVc7mBNzdxA46w==", 1408 | "requires": { 1409 | "@aws-sdk/types": "^3.222.0", 1410 | "@aws-sdk/util-utf8-browser": "^3.0.0", 1411 | "tslib": "^1.11.1" 1412 | }, 1413 | "dependencies": { 1414 | "tslib": { 1415 | "version": "1.14.1", 1416 | "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", 1417 | "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==" 1418 | } 1419 | } 1420 | }, 1421 | "@aws-sdk/abort-controller": { 1422 | "version": "3.347.0", 1423 | "resolved": "https://registry.npmjs.org/@aws-sdk/abort-controller/-/abort-controller-3.347.0.tgz", 1424 | "integrity": "sha512-P/2qE6ntYEmYG4Ez535nJWZbXqgbkJx8CMz7ChEuEg3Gp3dvVYEKg+iEUEvlqQ2U5dWP5J3ehw5po9t86IsVPQ==", 1425 | "requires": { 1426 | "@aws-sdk/types": "3.347.0", 1427 | "tslib": "^2.5.0" 1428 | } 1429 | }, 1430 | "@aws-sdk/client-sqs": { 1431 | "version": "3.354.0", 1432 | "resolved": "https://registry.npmjs.org/@aws-sdk/client-sqs/-/client-sqs-3.354.0.tgz", 1433 | "integrity": "sha512-zHhOU0nbxtwVBeuR4HJQyKjh5eBth+n2wULZet83RwMPT1EICAJbREKWbBW6Cyg395Lxtuc41Ie4lQZoKx2how==", 1434 | "requires": { 1435 | "@aws-crypto/sha256-browser": "3.0.0", 1436 | "@aws-crypto/sha256-js": "3.0.0", 1437 | "@aws-sdk/client-sts": "3.354.0", 1438 | "@aws-sdk/config-resolver": "3.354.0", 1439 | "@aws-sdk/credential-provider-node": "3.354.0", 1440 | "@aws-sdk/fetch-http-handler": "3.353.0", 1441 | "@aws-sdk/hash-node": "3.347.0", 1442 | "@aws-sdk/invalid-dependency": "3.347.0", 1443 | "@aws-sdk/md5-js": "3.347.0", 1444 | "@aws-sdk/middleware-content-length": "3.347.0", 1445 | "@aws-sdk/middleware-endpoint": "3.347.0", 1446 | "@aws-sdk/middleware-host-header": "3.347.0", 1447 | "@aws-sdk/middleware-logger": "3.347.0", 1448 | "@aws-sdk/middleware-recursion-detection": "3.347.0", 1449 | "@aws-sdk/middleware-retry": "3.354.0", 1450 | "@aws-sdk/middleware-sdk-sqs": "3.347.0", 1451 | "@aws-sdk/middleware-serde": "3.347.0", 1452 | "@aws-sdk/middleware-signing": "3.354.0", 1453 | "@aws-sdk/middleware-stack": "3.347.0", 1454 | "@aws-sdk/middleware-user-agent": "3.352.0", 1455 | "@aws-sdk/node-config-provider": "3.354.0", 1456 | "@aws-sdk/node-http-handler": "3.350.0", 1457 | "@aws-sdk/smithy-client": "3.347.0", 1458 | "@aws-sdk/types": "3.347.0", 1459 | "@aws-sdk/url-parser": "3.347.0", 1460 | "@aws-sdk/util-base64": "3.310.0", 1461 | "@aws-sdk/util-body-length-browser": "3.310.0", 1462 | "@aws-sdk/util-body-length-node": "3.310.0", 1463 | "@aws-sdk/util-defaults-mode-browser": "3.353.0", 1464 | "@aws-sdk/util-defaults-mode-node": "3.354.0", 1465 | "@aws-sdk/util-endpoints": "3.352.0", 1466 | "@aws-sdk/util-retry": "3.347.0", 1467 | "@aws-sdk/util-user-agent-browser": "3.347.0", 1468 | "@aws-sdk/util-user-agent-node": "3.354.0", 1469 | "@aws-sdk/util-utf8": "3.310.0", 1470 | "@smithy/protocol-http": "^1.0.1", 1471 | "@smithy/types": "^1.0.0", 1472 | "fast-xml-parser": "4.2.4", 1473 | "tslib": "^2.5.0" 1474 | } 1475 | }, 1476 | "@aws-sdk/client-sso": { 1477 | "version": "3.354.0", 1478 | "resolved": "https://registry.npmjs.org/@aws-sdk/client-sso/-/client-sso-3.354.0.tgz", 1479 | "integrity": "sha512-4jmvjJYDaaPmm1n2TG4LYfTEnHLKcJmImgBqhgzhMgaypb4u/k1iw0INV2r/afYPL/FsrLFwc46RM3HYx3nc4A==", 1480 | "requires": { 1481 | "@aws-crypto/sha256-browser": "3.0.0", 1482 | "@aws-crypto/sha256-js": "3.0.0", 1483 | "@aws-sdk/config-resolver": "3.354.0", 1484 | "@aws-sdk/fetch-http-handler": "3.353.0", 1485 | "@aws-sdk/hash-node": "3.347.0", 1486 | "@aws-sdk/invalid-dependency": "3.347.0", 1487 | "@aws-sdk/middleware-content-length": "3.347.0", 1488 | "@aws-sdk/middleware-endpoint": "3.347.0", 1489 | "@aws-sdk/middleware-host-header": "3.347.0", 1490 | "@aws-sdk/middleware-logger": "3.347.0", 1491 | "@aws-sdk/middleware-recursion-detection": "3.347.0", 1492 | "@aws-sdk/middleware-retry": "3.354.0", 1493 | "@aws-sdk/middleware-serde": "3.347.0", 1494 | "@aws-sdk/middleware-stack": "3.347.0", 1495 | "@aws-sdk/middleware-user-agent": "3.352.0", 1496 | "@aws-sdk/node-config-provider": "3.354.0", 1497 | "@aws-sdk/node-http-handler": "3.350.0", 1498 | "@aws-sdk/smithy-client": "3.347.0", 1499 | "@aws-sdk/types": "3.347.0", 1500 | "@aws-sdk/url-parser": "3.347.0", 1501 | "@aws-sdk/util-base64": "3.310.0", 1502 | "@aws-sdk/util-body-length-browser": "3.310.0", 1503 | "@aws-sdk/util-body-length-node": "3.310.0", 1504 | "@aws-sdk/util-defaults-mode-browser": "3.353.0", 1505 | "@aws-sdk/util-defaults-mode-node": "3.354.0", 1506 | "@aws-sdk/util-endpoints": "3.352.0", 1507 | "@aws-sdk/util-retry": "3.347.0", 1508 | "@aws-sdk/util-user-agent-browser": "3.347.0", 1509 | "@aws-sdk/util-user-agent-node": "3.354.0", 1510 | "@aws-sdk/util-utf8": "3.310.0", 1511 | "@smithy/protocol-http": "^1.0.1", 1512 | "@smithy/types": "^1.0.0", 1513 | "tslib": "^2.5.0" 1514 | } 1515 | }, 1516 | "@aws-sdk/client-sso-oidc": { 1517 | "version": "3.354.0", 1518 | "resolved": "https://registry.npmjs.org/@aws-sdk/client-sso-oidc/-/client-sso-oidc-3.354.0.tgz", 1519 | "integrity": "sha512-XZcg4s2zKb4S8ltluiw5yxpm974uZqzo2HTECt1lbzUJgVgLsMAh/nPJ1fLqg4jadT+rf8Lq2FEFqOM/vxWT8A==", 1520 | "requires": { 1521 | "@aws-crypto/sha256-browser": "3.0.0", 1522 | "@aws-crypto/sha256-js": "3.0.0", 1523 | "@aws-sdk/config-resolver": "3.354.0", 1524 | "@aws-sdk/fetch-http-handler": "3.353.0", 1525 | "@aws-sdk/hash-node": "3.347.0", 1526 | "@aws-sdk/invalid-dependency": "3.347.0", 1527 | "@aws-sdk/middleware-content-length": "3.347.0", 1528 | "@aws-sdk/middleware-endpoint": "3.347.0", 1529 | "@aws-sdk/middleware-host-header": "3.347.0", 1530 | "@aws-sdk/middleware-logger": "3.347.0", 1531 | "@aws-sdk/middleware-recursion-detection": "3.347.0", 1532 | "@aws-sdk/middleware-retry": "3.354.0", 1533 | "@aws-sdk/middleware-serde": "3.347.0", 1534 | "@aws-sdk/middleware-stack": "3.347.0", 1535 | "@aws-sdk/middleware-user-agent": "3.352.0", 1536 | "@aws-sdk/node-config-provider": "3.354.0", 1537 | "@aws-sdk/node-http-handler": "3.350.0", 1538 | "@aws-sdk/smithy-client": "3.347.0", 1539 | "@aws-sdk/types": "3.347.0", 1540 | "@aws-sdk/url-parser": "3.347.0", 1541 | "@aws-sdk/util-base64": "3.310.0", 1542 | "@aws-sdk/util-body-length-browser": "3.310.0", 1543 | "@aws-sdk/util-body-length-node": "3.310.0", 1544 | "@aws-sdk/util-defaults-mode-browser": "3.353.0", 1545 | "@aws-sdk/util-defaults-mode-node": "3.354.0", 1546 | "@aws-sdk/util-endpoints": "3.352.0", 1547 | "@aws-sdk/util-retry": "3.347.0", 1548 | "@aws-sdk/util-user-agent-browser": "3.347.0", 1549 | "@aws-sdk/util-user-agent-node": "3.354.0", 1550 | "@aws-sdk/util-utf8": "3.310.0", 1551 | "@smithy/protocol-http": "^1.0.1", 1552 | "@smithy/types": "^1.0.0", 1553 | "tslib": "^2.5.0" 1554 | } 1555 | }, 1556 | "@aws-sdk/client-sts": { 1557 | "version": "3.354.0", 1558 | "resolved": "https://registry.npmjs.org/@aws-sdk/client-sts/-/client-sts-3.354.0.tgz", 1559 | "integrity": "sha512-l9Ar/C/3PNlToM1ukHVfBtp4plbRUxLMYY2DOTMI0nb3jzfcvETBcdEGCP51fX4uAfJ2vc4g5qBF/qXKX0LMWA==", 1560 | "requires": { 1561 | "@aws-crypto/sha256-browser": "3.0.0", 1562 | "@aws-crypto/sha256-js": "3.0.0", 1563 | "@aws-sdk/config-resolver": "3.354.0", 1564 | "@aws-sdk/credential-provider-node": "3.354.0", 1565 | "@aws-sdk/fetch-http-handler": "3.353.0", 1566 | "@aws-sdk/hash-node": "3.347.0", 1567 | "@aws-sdk/invalid-dependency": "3.347.0", 1568 | "@aws-sdk/middleware-content-length": "3.347.0", 1569 | "@aws-sdk/middleware-endpoint": "3.347.0", 1570 | "@aws-sdk/middleware-host-header": "3.347.0", 1571 | "@aws-sdk/middleware-logger": "3.347.0", 1572 | "@aws-sdk/middleware-recursion-detection": "3.347.0", 1573 | "@aws-sdk/middleware-retry": "3.354.0", 1574 | "@aws-sdk/middleware-sdk-sts": "3.354.0", 1575 | "@aws-sdk/middleware-serde": "3.347.0", 1576 | "@aws-sdk/middleware-signing": "3.354.0", 1577 | "@aws-sdk/middleware-stack": "3.347.0", 1578 | "@aws-sdk/middleware-user-agent": "3.352.0", 1579 | "@aws-sdk/node-config-provider": "3.354.0", 1580 | "@aws-sdk/node-http-handler": "3.350.0", 1581 | "@aws-sdk/smithy-client": "3.347.0", 1582 | "@aws-sdk/types": "3.347.0", 1583 | "@aws-sdk/url-parser": "3.347.0", 1584 | "@aws-sdk/util-base64": "3.310.0", 1585 | "@aws-sdk/util-body-length-browser": "3.310.0", 1586 | "@aws-sdk/util-body-length-node": "3.310.0", 1587 | "@aws-sdk/util-defaults-mode-browser": "3.353.0", 1588 | "@aws-sdk/util-defaults-mode-node": "3.354.0", 1589 | "@aws-sdk/util-endpoints": "3.352.0", 1590 | "@aws-sdk/util-retry": "3.347.0", 1591 | "@aws-sdk/util-user-agent-browser": "3.347.0", 1592 | "@aws-sdk/util-user-agent-node": "3.354.0", 1593 | "@aws-sdk/util-utf8": "3.310.0", 1594 | "@smithy/protocol-http": "^1.0.1", 1595 | "@smithy/types": "^1.0.0", 1596 | "fast-xml-parser": "4.2.4", 1597 | "tslib": "^2.5.0" 1598 | } 1599 | }, 1600 | "@aws-sdk/config-resolver": { 1601 | "version": "3.354.0", 1602 | "resolved": "https://registry.npmjs.org/@aws-sdk/config-resolver/-/config-resolver-3.354.0.tgz", 1603 | "integrity": "sha512-K4XWie8yJPT8bpYVX54VJMQhiJRTw8PrjEs9QrKqvwoCcZ3G4qEt40tIu33XksuokXxk8rrVH5d7odOPBsAtdg==", 1604 | "requires": { 1605 | "@aws-sdk/types": "3.347.0", 1606 | "@aws-sdk/util-config-provider": "3.310.0", 1607 | "@aws-sdk/util-middleware": "3.347.0", 1608 | "tslib": "^2.5.0" 1609 | } 1610 | }, 1611 | "@aws-sdk/credential-provider-env": { 1612 | "version": "3.353.0", 1613 | "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-env/-/credential-provider-env-3.353.0.tgz", 1614 | "integrity": "sha512-Y4VsNS8O1FAD5J7S5itOhnOghQ5LIXlZ44t35nF8cbcF+JPvY3ToKzYpjYN1jM7DXKqU4shtqgYpzSqxlvEgKQ==", 1615 | "requires": { 1616 | "@aws-sdk/property-provider": "3.353.0", 1617 | "@aws-sdk/types": "3.347.0", 1618 | "tslib": "^2.5.0" 1619 | } 1620 | }, 1621 | "@aws-sdk/credential-provider-imds": { 1622 | "version": "3.354.0", 1623 | "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-imds/-/credential-provider-imds-3.354.0.tgz", 1624 | "integrity": "sha512-AB+PuDd1jX6qgz+JYvIyOn8Kz9/lQ60KuY1TFb7g3S8zURw+DSeMJNR1jzEsorWICTzhxXmyasHVMa4Eo4Uq+Q==", 1625 | "requires": { 1626 | "@aws-sdk/node-config-provider": "3.354.0", 1627 | "@aws-sdk/property-provider": "3.353.0", 1628 | "@aws-sdk/types": "3.347.0", 1629 | "@aws-sdk/url-parser": "3.347.0", 1630 | "tslib": "^2.5.0" 1631 | } 1632 | }, 1633 | "@aws-sdk/credential-provider-ini": { 1634 | "version": "3.354.0", 1635 | "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-ini/-/credential-provider-ini-3.354.0.tgz", 1636 | "integrity": "sha512-bn2ifrRsxWpxzwXa25jRdUECQ1dC+NB3YlRYnGdIaIQLF559N2jnfCabYzqyfKI++WU7aQeMofPe2PxVGlbv9Q==", 1637 | "requires": { 1638 | "@aws-sdk/credential-provider-env": "3.353.0", 1639 | "@aws-sdk/credential-provider-imds": "3.354.0", 1640 | "@aws-sdk/credential-provider-process": "3.354.0", 1641 | "@aws-sdk/credential-provider-sso": "3.354.0", 1642 | "@aws-sdk/credential-provider-web-identity": "3.354.0", 1643 | "@aws-sdk/property-provider": "3.353.0", 1644 | "@aws-sdk/shared-ini-file-loader": "3.354.0", 1645 | "@aws-sdk/types": "3.347.0", 1646 | "tslib": "^2.5.0" 1647 | } 1648 | }, 1649 | "@aws-sdk/credential-provider-node": { 1650 | "version": "3.354.0", 1651 | "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-node/-/credential-provider-node-3.354.0.tgz", 1652 | "integrity": "sha512-ltKiRtHfqDaCcrb44DIoSHQ9MposFl/aDtNdu5OdQv/2Q1r7M/r2fQdq9DHOrxeQQjaUH4C6k6fGTsxALTHyNA==", 1653 | "requires": { 1654 | "@aws-sdk/credential-provider-env": "3.353.0", 1655 | "@aws-sdk/credential-provider-imds": "3.354.0", 1656 | "@aws-sdk/credential-provider-ini": "3.354.0", 1657 | "@aws-sdk/credential-provider-process": "3.354.0", 1658 | "@aws-sdk/credential-provider-sso": "3.354.0", 1659 | "@aws-sdk/credential-provider-web-identity": "3.354.0", 1660 | "@aws-sdk/property-provider": "3.353.0", 1661 | "@aws-sdk/shared-ini-file-loader": "3.354.0", 1662 | "@aws-sdk/types": "3.347.0", 1663 | "tslib": "^2.5.0" 1664 | } 1665 | }, 1666 | "@aws-sdk/credential-provider-process": { 1667 | "version": "3.354.0", 1668 | "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-process/-/credential-provider-process-3.354.0.tgz", 1669 | "integrity": "sha512-AxpASm+tS8V1PY4PLfG9dtqa96lzBJ3niTQb+RAm4uYCddW7gxNDkGB+jSCzVdUPVa3xA2ITBS/ka3C5yM8YWg==", 1670 | "requires": { 1671 | "@aws-sdk/property-provider": "3.353.0", 1672 | "@aws-sdk/shared-ini-file-loader": "3.354.0", 1673 | "@aws-sdk/types": "3.347.0", 1674 | "tslib": "^2.5.0" 1675 | } 1676 | }, 1677 | "@aws-sdk/credential-provider-sso": { 1678 | "version": "3.354.0", 1679 | "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-sso/-/credential-provider-sso-3.354.0.tgz", 1680 | "integrity": "sha512-ihiaUxh8V/nQgTOgQZxWQcbckXhM+J6Wdc4F0z9soi48iSOqzRpzPw5E14wSZScEZjNY/gKEDz8gCt8WkT/G0w==", 1681 | "requires": { 1682 | "@aws-sdk/client-sso": "3.354.0", 1683 | "@aws-sdk/property-provider": "3.353.0", 1684 | "@aws-sdk/shared-ini-file-loader": "3.354.0", 1685 | "@aws-sdk/token-providers": "3.354.0", 1686 | "@aws-sdk/types": "3.347.0", 1687 | "tslib": "^2.5.0" 1688 | } 1689 | }, 1690 | "@aws-sdk/credential-provider-web-identity": { 1691 | "version": "3.354.0", 1692 | "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-web-identity/-/credential-provider-web-identity-3.354.0.tgz", 1693 | "integrity": "sha512-scx9mAf4m3Hc3uMX2Vh8GciEcC/5GqeDI8qc0zBj+UF/5c/GtihZA4WoCV3Sg3jMPDUKY81DiFCtcKHhtUqKfg==", 1694 | "requires": { 1695 | "@aws-sdk/property-provider": "3.353.0", 1696 | "@aws-sdk/types": "3.347.0", 1697 | "tslib": "^2.5.0" 1698 | } 1699 | }, 1700 | "@aws-sdk/eventstream-codec": { 1701 | "version": "3.347.0", 1702 | "resolved": "https://registry.npmjs.org/@aws-sdk/eventstream-codec/-/eventstream-codec-3.347.0.tgz", 1703 | "integrity": "sha512-61q+SyspjsaQ4sdgjizMyRgVph2CiW4aAtfpoH69EJFJfTxTR/OqnZ9Jx/3YiYi0ksrvDenJddYodfWWJqD8/w==", 1704 | "requires": { 1705 | "@aws-crypto/crc32": "3.0.0", 1706 | "@aws-sdk/types": "3.347.0", 1707 | "@aws-sdk/util-hex-encoding": "3.310.0", 1708 | "tslib": "^2.5.0" 1709 | } 1710 | }, 1711 | "@aws-sdk/fetch-http-handler": { 1712 | "version": "3.353.0", 1713 | "resolved": "https://registry.npmjs.org/@aws-sdk/fetch-http-handler/-/fetch-http-handler-3.353.0.tgz", 1714 | "integrity": "sha512-8ic2+4E6jzfDevd++QS1rOR05QFkAhEFbi5Ja3/Zzp7TkWIS8wv5wwMATjNkbbdsXYuB5Lhl/OsjfZmIv5aqRw==", 1715 | "requires": { 1716 | "@aws-sdk/protocol-http": "3.347.0", 1717 | "@aws-sdk/querystring-builder": "3.347.0", 1718 | "@aws-sdk/types": "3.347.0", 1719 | "@aws-sdk/util-base64": "3.310.0", 1720 | "tslib": "^2.5.0" 1721 | } 1722 | }, 1723 | "@aws-sdk/hash-node": { 1724 | "version": "3.347.0", 1725 | "resolved": "https://registry.npmjs.org/@aws-sdk/hash-node/-/hash-node-3.347.0.tgz", 1726 | "integrity": "sha512-96+ml/4EaUaVpzBdOLGOxdoXOjkPgkoJp/0i1fxOJEvl8wdAQSwc3IugVK9wZkCxy2DlENtgOe6DfIOhfffm/g==", 1727 | "requires": { 1728 | "@aws-sdk/types": "3.347.0", 1729 | "@aws-sdk/util-buffer-from": "3.310.0", 1730 | "@aws-sdk/util-utf8": "3.310.0", 1731 | "tslib": "^2.5.0" 1732 | } 1733 | }, 1734 | "@aws-sdk/invalid-dependency": { 1735 | "version": "3.347.0", 1736 | "resolved": "https://registry.npmjs.org/@aws-sdk/invalid-dependency/-/invalid-dependency-3.347.0.tgz", 1737 | "integrity": "sha512-8imQcwLwqZ/wTJXZqzXT9pGLIksTRckhGLZaXT60tiBOPKuerTsus2L59UstLs5LP8TKaVZKFFSsjRIn9dQdmQ==", 1738 | "requires": { 1739 | "@aws-sdk/types": "3.347.0", 1740 | "tslib": "^2.5.0" 1741 | } 1742 | }, 1743 | "@aws-sdk/is-array-buffer": { 1744 | "version": "3.310.0", 1745 | "resolved": "https://registry.npmjs.org/@aws-sdk/is-array-buffer/-/is-array-buffer-3.310.0.tgz", 1746 | "integrity": "sha512-urnbcCR+h9NWUnmOtet/s4ghvzsidFmspfhYaHAmSRdy9yDjdjBJMFjjsn85A1ODUktztm+cVncXjQ38WCMjMQ==", 1747 | "requires": { 1748 | "tslib": "^2.5.0" 1749 | } 1750 | }, 1751 | "@aws-sdk/md5-js": { 1752 | "version": "3.347.0", 1753 | "resolved": "https://registry.npmjs.org/@aws-sdk/md5-js/-/md5-js-3.347.0.tgz", 1754 | "integrity": "sha512-mChE+7DByTY9H4cQ6fnWp2x5jf8e6OZN+AdLp6WQ+W99z35zBeqBxVmgm8ziJwkMIrkSTv9j3Y7T9Ve3RIcSfg==", 1755 | "requires": { 1756 | "@aws-sdk/types": "3.347.0", 1757 | "@aws-sdk/util-utf8": "3.310.0", 1758 | "tslib": "^2.5.0" 1759 | } 1760 | }, 1761 | "@aws-sdk/middleware-content-length": { 1762 | "version": "3.347.0", 1763 | "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-content-length/-/middleware-content-length-3.347.0.tgz", 1764 | "integrity": "sha512-i4qtWTDImMaDUtwKQPbaZpXsReiwiBomM1cWymCU4bhz81HL01oIxOxOBuiM+3NlDoCSPr3KI6txZSz/8cqXCQ==", 1765 | "requires": { 1766 | "@aws-sdk/protocol-http": "3.347.0", 1767 | "@aws-sdk/types": "3.347.0", 1768 | "tslib": "^2.5.0" 1769 | } 1770 | }, 1771 | "@aws-sdk/middleware-endpoint": { 1772 | "version": "3.347.0", 1773 | "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-endpoint/-/middleware-endpoint-3.347.0.tgz", 1774 | "integrity": "sha512-unF0c6dMaUL1ffU+37Ugty43DgMnzPWXr/Jup/8GbK5fzzWT5NQq6dj9KHPubMbWeEjQbmczvhv25JuJdK8gNQ==", 1775 | "requires": { 1776 | "@aws-sdk/middleware-serde": "3.347.0", 1777 | "@aws-sdk/types": "3.347.0", 1778 | "@aws-sdk/url-parser": "3.347.0", 1779 | "@aws-sdk/util-middleware": "3.347.0", 1780 | "tslib": "^2.5.0" 1781 | } 1782 | }, 1783 | "@aws-sdk/middleware-host-header": { 1784 | "version": "3.347.0", 1785 | "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-host-header/-/middleware-host-header-3.347.0.tgz", 1786 | "integrity": "sha512-kpKmR9OvMlnReqp5sKcJkozbj1wmlblbVSbnQAIkzeQj2xD5dnVR3Nn2ogQKxSmU1Fv7dEroBtrruJ1o3fY38A==", 1787 | "requires": { 1788 | "@aws-sdk/protocol-http": "3.347.0", 1789 | "@aws-sdk/types": "3.347.0", 1790 | "tslib": "^2.5.0" 1791 | } 1792 | }, 1793 | "@aws-sdk/middleware-logger": { 1794 | "version": "3.347.0", 1795 | "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-logger/-/middleware-logger-3.347.0.tgz", 1796 | "integrity": "sha512-NYC+Id5UCkVn+3P1t/YtmHt75uED06vwaKyxDy0UmB2K66PZLVtwWbLpVWrhbroaw1bvUHYcRyQ9NIfnVcXQjA==", 1797 | "requires": { 1798 | "@aws-sdk/types": "3.347.0", 1799 | "tslib": "^2.5.0" 1800 | } 1801 | }, 1802 | "@aws-sdk/middleware-recursion-detection": { 1803 | "version": "3.347.0", 1804 | "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-recursion-detection/-/middleware-recursion-detection-3.347.0.tgz", 1805 | "integrity": "sha512-qfnSvkFKCAMjMHR31NdsT0gv5Sq/ZHTUD4yQsSLpbVQ6iYAS834lrzXt41iyEHt57Y514uG7F/Xfvude3u4icQ==", 1806 | "requires": { 1807 | "@aws-sdk/protocol-http": "3.347.0", 1808 | "@aws-sdk/types": "3.347.0", 1809 | "tslib": "^2.5.0" 1810 | } 1811 | }, 1812 | "@aws-sdk/middleware-retry": { 1813 | "version": "3.354.0", 1814 | "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-retry/-/middleware-retry-3.354.0.tgz", 1815 | "integrity": "sha512-dnG5Nd/mobbhcWCM71DQWI9+f6b6fDSzALXftFIP/8lsXKRcWDSQuYjrnVST2wZzk/QmdF8TnVD0C1xL14K6CQ==", 1816 | "requires": { 1817 | "@aws-sdk/protocol-http": "3.347.0", 1818 | "@aws-sdk/service-error-classification": "3.347.0", 1819 | "@aws-sdk/types": "3.347.0", 1820 | "@aws-sdk/util-middleware": "3.347.0", 1821 | "@aws-sdk/util-retry": "3.347.0", 1822 | "tslib": "^2.5.0", 1823 | "uuid": "^8.3.2" 1824 | } 1825 | }, 1826 | "@aws-sdk/middleware-sdk-sqs": { 1827 | "version": "3.347.0", 1828 | "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-sdk-sqs/-/middleware-sdk-sqs-3.347.0.tgz", 1829 | "integrity": "sha512-TSBTQoOVe9cDm9am4NOov1YZxbQ3LPBl7Ex0jblDFgUXqE9kNU3Kx/yc8edOLcq+5AFrgqT0NFD7pwFlQPh3KQ==", 1830 | "requires": { 1831 | "@aws-sdk/types": "3.347.0", 1832 | "@aws-sdk/util-hex-encoding": "3.310.0", 1833 | "@aws-sdk/util-utf8": "3.310.0", 1834 | "tslib": "^2.5.0" 1835 | } 1836 | }, 1837 | "@aws-sdk/middleware-sdk-sts": { 1838 | "version": "3.354.0", 1839 | "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-sdk-sts/-/middleware-sdk-sts-3.354.0.tgz", 1840 | "integrity": "sha512-L6vyAwYrdcOoB4YgCqNJNr+ZZtLHEF2Ym3CTfmFm2srXHqHuRB+mBu0NLV/grz77znIArK1H1ZL/ZaH2I5hclA==", 1841 | "requires": { 1842 | "@aws-sdk/middleware-signing": "3.354.0", 1843 | "@aws-sdk/types": "3.347.0", 1844 | "tslib": "^2.5.0" 1845 | } 1846 | }, 1847 | "@aws-sdk/middleware-serde": { 1848 | "version": "3.347.0", 1849 | "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-serde/-/middleware-serde-3.347.0.tgz", 1850 | "integrity": "sha512-x5Foi7jRbVJXDu9bHfyCbhYDH5pKK+31MmsSJ3k8rY8keXLBxm2XEEg/AIoV9/TUF9EeVvZ7F1/RmMpJnWQsEg==", 1851 | "requires": { 1852 | "@aws-sdk/types": "3.347.0", 1853 | "tslib": "^2.5.0" 1854 | } 1855 | }, 1856 | "@aws-sdk/middleware-signing": { 1857 | "version": "3.354.0", 1858 | "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-signing/-/middleware-signing-3.354.0.tgz", 1859 | "integrity": "sha512-Dd+vIhJL0VqqKWqlTKlKC5jkCaEIk73ZEXNfv44XbsI25a0vXbatHp1M8jB/cgkJC/Mri1TX9dmckP/C0FDEwA==", 1860 | "requires": { 1861 | "@aws-sdk/property-provider": "3.353.0", 1862 | "@aws-sdk/protocol-http": "3.347.0", 1863 | "@aws-sdk/signature-v4": "3.354.0", 1864 | "@aws-sdk/types": "3.347.0", 1865 | "@aws-sdk/util-middleware": "3.347.0", 1866 | "tslib": "^2.5.0" 1867 | } 1868 | }, 1869 | "@aws-sdk/middleware-stack": { 1870 | "version": "3.347.0", 1871 | "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-stack/-/middleware-stack-3.347.0.tgz", 1872 | "integrity": "sha512-Izidg4rqtYMcKuvn2UzgEpPLSmyd8ub9+LQ2oIzG3mpIzCBITq7wp40jN1iNkMg+X6KEnX9vdMJIYZsPYMCYuQ==", 1873 | "requires": { 1874 | "tslib": "^2.5.0" 1875 | } 1876 | }, 1877 | "@aws-sdk/middleware-user-agent": { 1878 | "version": "3.352.0", 1879 | "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-user-agent/-/middleware-user-agent-3.352.0.tgz", 1880 | "integrity": "sha512-QGqblMTsVDqeomy22KPm9LUW8PHZXBA2Hjk9Hcw8U1uFS8IKYJrewInG3ae2+9FAcTyug4LFWDf8CRr9YH2B3Q==", 1881 | "requires": { 1882 | "@aws-sdk/protocol-http": "3.347.0", 1883 | "@aws-sdk/types": "3.347.0", 1884 | "@aws-sdk/util-endpoints": "3.352.0", 1885 | "tslib": "^2.5.0" 1886 | } 1887 | }, 1888 | "@aws-sdk/node-config-provider": { 1889 | "version": "3.354.0", 1890 | "resolved": "https://registry.npmjs.org/@aws-sdk/node-config-provider/-/node-config-provider-3.354.0.tgz", 1891 | "integrity": "sha512-pF1ZGWWvmwbrloNHYF3EDqCb9hq5wfZwDqAwAPhWkYnUYKkR7E7MZVuTwUDU48io8k6Z5pM52l/54w8e8aedTw==", 1892 | "requires": { 1893 | "@aws-sdk/property-provider": "3.353.0", 1894 | "@aws-sdk/shared-ini-file-loader": "3.354.0", 1895 | "@aws-sdk/types": "3.347.0", 1896 | "tslib": "^2.5.0" 1897 | } 1898 | }, 1899 | "@aws-sdk/node-http-handler": { 1900 | "version": "3.350.0", 1901 | "resolved": "https://registry.npmjs.org/@aws-sdk/node-http-handler/-/node-http-handler-3.350.0.tgz", 1902 | "integrity": "sha512-oD96GAlmpzYilCdC8wwyURM5lNfNHZCjm/kxBkQulHKa2kRbIrnD9GfDqdCkWA5cTpjh1NzGLT4D6e6UFDjt9w==", 1903 | "requires": { 1904 | "@aws-sdk/abort-controller": "3.347.0", 1905 | "@aws-sdk/protocol-http": "3.347.0", 1906 | "@aws-sdk/querystring-builder": "3.347.0", 1907 | "@aws-sdk/types": "3.347.0", 1908 | "tslib": "^2.5.0" 1909 | } 1910 | }, 1911 | "@aws-sdk/property-provider": { 1912 | "version": "3.353.0", 1913 | "resolved": "https://registry.npmjs.org/@aws-sdk/property-provider/-/property-provider-3.353.0.tgz", 1914 | "integrity": "sha512-Iu6J59hncaew7eBKroTcLjZ8cgrom0IWyZZ09rsow3rZDHVtw7LQSrUyuqsSbKGY9eRtL7Wa6ZtYHnXFiAE2kg==", 1915 | "requires": { 1916 | "@aws-sdk/types": "3.347.0", 1917 | "tslib": "^2.5.0" 1918 | } 1919 | }, 1920 | "@aws-sdk/protocol-http": { 1921 | "version": "3.347.0", 1922 | "resolved": "https://registry.npmjs.org/@aws-sdk/protocol-http/-/protocol-http-3.347.0.tgz", 1923 | "integrity": "sha512-2YdBhc02Wvy03YjhGwUxF0UQgrPWEy8Iq75pfS42N+/0B/+eWX1aQgfjFxIpLg7YSjT5eKtYOQGlYd4MFTgj9g==", 1924 | "requires": { 1925 | "@aws-sdk/types": "3.347.0", 1926 | "tslib": "^2.5.0" 1927 | } 1928 | }, 1929 | "@aws-sdk/querystring-builder": { 1930 | "version": "3.347.0", 1931 | "resolved": "https://registry.npmjs.org/@aws-sdk/querystring-builder/-/querystring-builder-3.347.0.tgz", 1932 | "integrity": "sha512-phtKTe6FXoV02MoPkIVV6owXI8Mwr5IBN3bPoxhcPvJG2AjEmnetSIrhb8kwc4oNhlwfZwH6Jo5ARW/VEWbZtg==", 1933 | "requires": { 1934 | "@aws-sdk/types": "3.347.0", 1935 | "@aws-sdk/util-uri-escape": "3.310.0", 1936 | "tslib": "^2.5.0" 1937 | } 1938 | }, 1939 | "@aws-sdk/querystring-parser": { 1940 | "version": "3.347.0", 1941 | "resolved": "https://registry.npmjs.org/@aws-sdk/querystring-parser/-/querystring-parser-3.347.0.tgz", 1942 | "integrity": "sha512-5VXOhfZz78T2W7SuXf2avfjKglx1VZgZgp9Zfhrt/Rq+MTu2D+PZc5zmJHhYigD7x83jLSLogpuInQpFMA9LgA==", 1943 | "requires": { 1944 | "@aws-sdk/types": "3.347.0", 1945 | "tslib": "^2.5.0" 1946 | } 1947 | }, 1948 | "@aws-sdk/service-error-classification": { 1949 | "version": "3.347.0", 1950 | "resolved": "https://registry.npmjs.org/@aws-sdk/service-error-classification/-/service-error-classification-3.347.0.tgz", 1951 | "integrity": "sha512-xZ3MqSY81Oy2gh5g0fCtooAbahqh9VhsF8vcKjVX8+XPbGC8y+kej82+MsMg4gYL8gRFB9u4hgYbNgIS6JTAvg==" 1952 | }, 1953 | "@aws-sdk/shared-ini-file-loader": { 1954 | "version": "3.354.0", 1955 | "resolved": "https://registry.npmjs.org/@aws-sdk/shared-ini-file-loader/-/shared-ini-file-loader-3.354.0.tgz", 1956 | "integrity": "sha512-UL9loGEsdzpHBu/PtlwUvkl/yRdmWXkySp22jUaeeRtBhiGAnyeYhxJLIt+u+UkX7Mwz+810SaZJqA9ptOXNAg==", 1957 | "requires": { 1958 | "@aws-sdk/types": "3.347.0", 1959 | "tslib": "^2.5.0" 1960 | } 1961 | }, 1962 | "@aws-sdk/signature-v4": { 1963 | "version": "3.354.0", 1964 | "resolved": "https://registry.npmjs.org/@aws-sdk/signature-v4/-/signature-v4-3.354.0.tgz", 1965 | "integrity": "sha512-bDp43P5NkwwznpZqmsr78DuyqNcjtS4mriuajb8XPhFNo8DrMXUrdrKJ+5aNABW7YG8uK8PSKBpq88ado692/w==", 1966 | "requires": { 1967 | "@aws-sdk/eventstream-codec": "3.347.0", 1968 | "@aws-sdk/is-array-buffer": "3.310.0", 1969 | "@aws-sdk/types": "3.347.0", 1970 | "@aws-sdk/util-hex-encoding": "3.310.0", 1971 | "@aws-sdk/util-middleware": "3.347.0", 1972 | "@aws-sdk/util-uri-escape": "3.310.0", 1973 | "@aws-sdk/util-utf8": "3.310.0", 1974 | "tslib": "^2.5.0" 1975 | } 1976 | }, 1977 | "@aws-sdk/smithy-client": { 1978 | "version": "3.347.0", 1979 | "resolved": "https://registry.npmjs.org/@aws-sdk/smithy-client/-/smithy-client-3.347.0.tgz", 1980 | "integrity": "sha512-PaGTDsJLGK0sTjA6YdYQzILRlPRN3uVFyqeBUkfltXssvUzkm8z2t1lz2H4VyJLAhwnG5ZuZTNEV/2mcWrU7JQ==", 1981 | "requires": { 1982 | "@aws-sdk/middleware-stack": "3.347.0", 1983 | "@aws-sdk/types": "3.347.0", 1984 | "tslib": "^2.5.0" 1985 | } 1986 | }, 1987 | "@aws-sdk/token-providers": { 1988 | "version": "3.354.0", 1989 | "resolved": "https://registry.npmjs.org/@aws-sdk/token-providers/-/token-providers-3.354.0.tgz", 1990 | "integrity": "sha512-KcijiySy0oIyafKQagcwgu0fo35mK+2K8pwxRU1WfXqe80Gn1qGceeWcG4iW+t/rUaxa/LVo857N0LcagxCrZA==", 1991 | "requires": { 1992 | "@aws-sdk/client-sso-oidc": "3.354.0", 1993 | "@aws-sdk/property-provider": "3.353.0", 1994 | "@aws-sdk/shared-ini-file-loader": "3.354.0", 1995 | "@aws-sdk/types": "3.347.0", 1996 | "tslib": "^2.5.0" 1997 | } 1998 | }, 1999 | "@aws-sdk/types": { 2000 | "version": "3.347.0", 2001 | "resolved": "https://registry.npmjs.org/@aws-sdk/types/-/types-3.347.0.tgz", 2002 | "integrity": "sha512-GkCMy79mdjU9OTIe5KT58fI/6uqdf8UmMdWqVHmFJ+UpEzOci7L/uw4sOXWo7xpPzLs6cJ7s5ouGZW4GRPmHFA==", 2003 | "requires": { 2004 | "tslib": "^2.5.0" 2005 | } 2006 | }, 2007 | "@aws-sdk/url-parser": { 2008 | "version": "3.347.0", 2009 | "resolved": "https://registry.npmjs.org/@aws-sdk/url-parser/-/url-parser-3.347.0.tgz", 2010 | "integrity": "sha512-lhrnVjxdV7hl+yCnJfDZOaVLSqKjxN20MIOiijRiqaWGLGEAiSqBreMhL89X1WKCifxAs4zZf9YB9SbdziRpAA==", 2011 | "requires": { 2012 | "@aws-sdk/querystring-parser": "3.347.0", 2013 | "@aws-sdk/types": "3.347.0", 2014 | "tslib": "^2.5.0" 2015 | } 2016 | }, 2017 | "@aws-sdk/util-base64": { 2018 | "version": "3.310.0", 2019 | "resolved": "https://registry.npmjs.org/@aws-sdk/util-base64/-/util-base64-3.310.0.tgz", 2020 | "integrity": "sha512-v3+HBKQvqgdzcbL+pFswlx5HQsd9L6ZTlyPVL2LS9nNXnCcR3XgGz9jRskikRUuUvUXtkSG1J88GAOnJ/apTPg==", 2021 | "requires": { 2022 | "@aws-sdk/util-buffer-from": "3.310.0", 2023 | "tslib": "^2.5.0" 2024 | } 2025 | }, 2026 | "@aws-sdk/util-body-length-browser": { 2027 | "version": "3.310.0", 2028 | "resolved": "https://registry.npmjs.org/@aws-sdk/util-body-length-browser/-/util-body-length-browser-3.310.0.tgz", 2029 | "integrity": "sha512-sxsC3lPBGfpHtNTUoGXMQXLwjmR0zVpx0rSvzTPAuoVILVsp5AU/w5FphNPxD5OVIjNbZv9KsKTuvNTiZjDp9g==", 2030 | "requires": { 2031 | "tslib": "^2.5.0" 2032 | } 2033 | }, 2034 | "@aws-sdk/util-body-length-node": { 2035 | "version": "3.310.0", 2036 | "resolved": "https://registry.npmjs.org/@aws-sdk/util-body-length-node/-/util-body-length-node-3.310.0.tgz", 2037 | "integrity": "sha512-2tqGXdyKhyA6w4zz7UPoS8Ip+7sayOg9BwHNidiGm2ikbDxm1YrCfYXvCBdwaJxa4hJfRVz+aL9e+d3GqPI9pQ==", 2038 | "requires": { 2039 | "tslib": "^2.5.0" 2040 | } 2041 | }, 2042 | "@aws-sdk/util-buffer-from": { 2043 | "version": "3.310.0", 2044 | "resolved": "https://registry.npmjs.org/@aws-sdk/util-buffer-from/-/util-buffer-from-3.310.0.tgz", 2045 | "integrity": "sha512-i6LVeXFtGih5Zs8enLrt+ExXY92QV25jtEnTKHsmlFqFAuL3VBeod6boeMXkN2p9lbSVVQ1sAOOYZOHYbYkntw==", 2046 | "requires": { 2047 | "@aws-sdk/is-array-buffer": "3.310.0", 2048 | "tslib": "^2.5.0" 2049 | } 2050 | }, 2051 | "@aws-sdk/util-config-provider": { 2052 | "version": "3.310.0", 2053 | "resolved": "https://registry.npmjs.org/@aws-sdk/util-config-provider/-/util-config-provider-3.310.0.tgz", 2054 | "integrity": "sha512-xIBaYo8dwiojCw8vnUcIL4Z5tyfb1v3yjqyJKJWV/dqKUFOOS0U591plmXbM+M/QkXyML3ypon1f8+BoaDExrg==", 2055 | "requires": { 2056 | "tslib": "^2.5.0" 2057 | } 2058 | }, 2059 | "@aws-sdk/util-defaults-mode-browser": { 2060 | "version": "3.353.0", 2061 | "resolved": "https://registry.npmjs.org/@aws-sdk/util-defaults-mode-browser/-/util-defaults-mode-browser-3.353.0.tgz", 2062 | "integrity": "sha512-ushvOQKJIH7S6E//xMDPyf2/Bbu0K2A0GJRB88qQV6VKRBo4PEbeHTb6BbzPhYVX0IbY3uR/X7+Xwk4FeEkMWg==", 2063 | "requires": { 2064 | "@aws-sdk/property-provider": "3.353.0", 2065 | "@aws-sdk/types": "3.347.0", 2066 | "bowser": "^2.11.0", 2067 | "tslib": "^2.5.0" 2068 | } 2069 | }, 2070 | "@aws-sdk/util-defaults-mode-node": { 2071 | "version": "3.354.0", 2072 | "resolved": "https://registry.npmjs.org/@aws-sdk/util-defaults-mode-node/-/util-defaults-mode-node-3.354.0.tgz", 2073 | "integrity": "sha512-CaaRVBdOYX4wZadj+CDUxpO+4RjyYJcSv71A60jV6CZ/ya1+oYfmPbG5QZ4AlV6crdev2B+aUoR2LPIYqn/GnQ==", 2074 | "requires": { 2075 | "@aws-sdk/config-resolver": "3.354.0", 2076 | "@aws-sdk/credential-provider-imds": "3.354.0", 2077 | "@aws-sdk/node-config-provider": "3.354.0", 2078 | "@aws-sdk/property-provider": "3.353.0", 2079 | "@aws-sdk/types": "3.347.0", 2080 | "tslib": "^2.5.0" 2081 | } 2082 | }, 2083 | "@aws-sdk/util-endpoints": { 2084 | "version": "3.352.0", 2085 | "resolved": "https://registry.npmjs.org/@aws-sdk/util-endpoints/-/util-endpoints-3.352.0.tgz", 2086 | "integrity": "sha512-PjWMPdoIUWfBPgAWLyOrWFbdSS/3DJtc0OmFb/JrE8C8rKFYl+VGW5f1p0cVdRWiDR0xCGr0s67p8itAakVqjw==", 2087 | "requires": { 2088 | "@aws-sdk/types": "3.347.0", 2089 | "tslib": "^2.5.0" 2090 | } 2091 | }, 2092 | "@aws-sdk/util-hex-encoding": { 2093 | "version": "3.310.0", 2094 | "resolved": "https://registry.npmjs.org/@aws-sdk/util-hex-encoding/-/util-hex-encoding-3.310.0.tgz", 2095 | "integrity": "sha512-sVN7mcCCDSJ67pI1ZMtk84SKGqyix6/0A1Ab163YKn+lFBQRMKexleZzpYzNGxYzmQS6VanP/cfU7NiLQOaSfA==", 2096 | "requires": { 2097 | "tslib": "^2.5.0" 2098 | } 2099 | }, 2100 | "@aws-sdk/util-locate-window": { 2101 | "version": "3.310.0", 2102 | "resolved": "https://registry.npmjs.org/@aws-sdk/util-locate-window/-/util-locate-window-3.310.0.tgz", 2103 | "integrity": "sha512-qo2t/vBTnoXpjKxlsC2e1gBrRm80M3bId27r0BRB2VniSSe7bL1mmzM+/HFtujm0iAxtPM+aLEflLJlJeDPg0w==", 2104 | "requires": { 2105 | "tslib": "^2.5.0" 2106 | } 2107 | }, 2108 | "@aws-sdk/util-middleware": { 2109 | "version": "3.347.0", 2110 | "resolved": "https://registry.npmjs.org/@aws-sdk/util-middleware/-/util-middleware-3.347.0.tgz", 2111 | "integrity": "sha512-8owqUA3ePufeYTUvlzdJ7Z0miLorTwx+rNol5lourGQZ9JXsVMo23+yGA7nOlFuXSGkoKpMOtn6S0BT2bcfeiw==", 2112 | "requires": { 2113 | "tslib": "^2.5.0" 2114 | } 2115 | }, 2116 | "@aws-sdk/util-retry": { 2117 | "version": "3.347.0", 2118 | "resolved": "https://registry.npmjs.org/@aws-sdk/util-retry/-/util-retry-3.347.0.tgz", 2119 | "integrity": "sha512-NxnQA0/FHFxriQAeEgBonA43Q9/VPFQa8cfJDuT2A1YZruMasgjcltoZszi1dvoIRWSZsFTW42eY2gdOd0nffQ==", 2120 | "requires": { 2121 | "@aws-sdk/service-error-classification": "3.347.0", 2122 | "tslib": "^2.5.0" 2123 | } 2124 | }, 2125 | "@aws-sdk/util-uri-escape": { 2126 | "version": "3.310.0", 2127 | "resolved": "https://registry.npmjs.org/@aws-sdk/util-uri-escape/-/util-uri-escape-3.310.0.tgz", 2128 | "integrity": "sha512-drzt+aB2qo2LgtDoiy/3sVG8w63cgLkqFIa2NFlGpUgHFWTXkqtbgf4L5QdjRGKWhmZsnqkbtL7vkSWEcYDJ4Q==", 2129 | "requires": { 2130 | "tslib": "^2.5.0" 2131 | } 2132 | }, 2133 | "@aws-sdk/util-user-agent-browser": { 2134 | "version": "3.347.0", 2135 | "resolved": "https://registry.npmjs.org/@aws-sdk/util-user-agent-browser/-/util-user-agent-browser-3.347.0.tgz", 2136 | "integrity": "sha512-ydxtsKVtQefgbk1Dku1q7pMkjDYThauG9/8mQkZUAVik55OUZw71Zzr3XO8J8RKvQG8lmhPXuAQ0FKAyycc0RA==", 2137 | "requires": { 2138 | "@aws-sdk/types": "3.347.0", 2139 | "bowser": "^2.11.0", 2140 | "tslib": "^2.5.0" 2141 | } 2142 | }, 2143 | "@aws-sdk/util-user-agent-node": { 2144 | "version": "3.354.0", 2145 | "resolved": "https://registry.npmjs.org/@aws-sdk/util-user-agent-node/-/util-user-agent-node-3.354.0.tgz", 2146 | "integrity": "sha512-2xkblZS3PGxxh//0lgCwJw2gvh9ZBcI9H9xv05YP7hcwlz9BmkAlbei2i6Uew6agJMLO4unfgWoBTpzp3WLaKg==", 2147 | "requires": { 2148 | "@aws-sdk/node-config-provider": "3.354.0", 2149 | "@aws-sdk/types": "3.347.0", 2150 | "tslib": "^2.5.0" 2151 | } 2152 | }, 2153 | "@aws-sdk/util-utf8": { 2154 | "version": "3.310.0", 2155 | "resolved": "https://registry.npmjs.org/@aws-sdk/util-utf8/-/util-utf8-3.310.0.tgz", 2156 | "integrity": "sha512-DnLfFT8uCO22uOJc0pt0DsSNau1GTisngBCDw8jQuWT5CqogMJu4b/uXmwEqfj8B3GX6Xsz8zOd6JpRlPftQoA==", 2157 | "requires": { 2158 | "@aws-sdk/util-buffer-from": "3.310.0", 2159 | "tslib": "^2.5.0" 2160 | } 2161 | }, 2162 | "@aws-sdk/util-utf8-browser": { 2163 | "version": "3.259.0", 2164 | "resolved": "https://registry.npmjs.org/@aws-sdk/util-utf8-browser/-/util-utf8-browser-3.259.0.tgz", 2165 | "integrity": "sha512-UvFa/vR+e19XookZF8RzFZBrw2EUkQWxiBW0yYQAhvk3C+QVGl0H3ouca8LDBlBfQKXwmW3huo/59H8rwb1wJw==", 2166 | "requires": { 2167 | "tslib": "^2.3.1" 2168 | } 2169 | }, 2170 | "@sindresorhus/is": { 2171 | "version": "5.3.0", 2172 | "resolved": "https://registry.npmjs.org/@sindresorhus/is/-/is-5.3.0.tgz", 2173 | "integrity": "sha512-CX6t4SYQ37lzxicAqsBtxA3OseeoVrh9cSJ5PFYam0GksYlupRfy1A+Q4aYD3zvcfECLc0zO2u+ZnR2UYKvCrw==" 2174 | }, 2175 | "@smithy/protocol-http": { 2176 | "version": "1.1.0", 2177 | "resolved": "https://registry.npmjs.org/@smithy/protocol-http/-/protocol-http-1.1.0.tgz", 2178 | "integrity": "sha512-H5y/kZOqfJSqRkwtcAoVbqONmhdXwSgYNJ1Glk5Ry8qlhVVy5qUzD9EklaCH8/XLnoCsLO/F/Giee8MIvaBRkg==", 2179 | "requires": { 2180 | "@smithy/types": "^1.1.0", 2181 | "tslib": "^2.5.0" 2182 | } 2183 | }, 2184 | "@smithy/types": { 2185 | "version": "1.1.0", 2186 | "resolved": "https://registry.npmjs.org/@smithy/types/-/types-1.1.0.tgz", 2187 | "integrity": "sha512-KzmvisMmuwD2jZXuC9e65JrgsZM97y5NpDU7g347oB+Q+xQLU6hQZ5zFNNbEfwwOJHoOvEVTna+dk1h/lW7alw==", 2188 | "requires": { 2189 | "tslib": "^2.5.0" 2190 | } 2191 | }, 2192 | "@szmarczak/http-timer": { 2193 | "version": "5.0.1", 2194 | "resolved": "https://registry.npmjs.org/@szmarczak/http-timer/-/http-timer-5.0.1.tgz", 2195 | "integrity": "sha512-+PmQX0PiAYPMeVYe237LJAYvOMYW1j2rH5YROyS3b4CTVJum34HfRvKvAzozHAQG0TnHNdUfY9nCeUyRAs//cw==", 2196 | "requires": { 2197 | "defer-to-connect": "^2.0.1" 2198 | } 2199 | }, 2200 | "@types/http-cache-semantics": { 2201 | "version": "4.0.1", 2202 | "resolved": "https://registry.npmjs.org/@types/http-cache-semantics/-/http-cache-semantics-4.0.1.tgz", 2203 | "integrity": "sha512-SZs7ekbP8CN0txVG2xVRH6EgKmEm31BOxA07vkFaETzZz1xh+cbt8BcI0slpymvwhx5dlFnQG2rTlPVQn+iRPQ==" 2204 | }, 2205 | "bowser": { 2206 | "version": "2.11.0", 2207 | "resolved": "https://registry.npmjs.org/bowser/-/bowser-2.11.0.tgz", 2208 | "integrity": "sha512-AlcaJBi/pqqJBIQ8U9Mcpc9i8Aqxn88Skv5d+xBX006BY5u8N3mGLHa5Lgppa7L/HfwgwLgZ6NYs+Ag6uUmJRA==" 2209 | }, 2210 | "cacheable-lookup": { 2211 | "version": "7.0.0", 2212 | "resolved": "https://registry.npmjs.org/cacheable-lookup/-/cacheable-lookup-7.0.0.tgz", 2213 | "integrity": "sha512-+qJyx4xiKra8mZrcwhjMRMUhD5NR1R8esPkzIYxX96JiecFoxAXFuz/GpR3+ev4PE1WamHip78wV0vcmPQtp8w==" 2214 | }, 2215 | "cacheable-request": { 2216 | "version": "10.2.2", 2217 | "resolved": "https://registry.npmjs.org/cacheable-request/-/cacheable-request-10.2.2.tgz", 2218 | "integrity": "sha512-KxjQZM3UIo7/J6W4sLpwFvu1GB3Whv8NtZ8ZrUL284eiQjiXeeqWTdhixNrp/NLZ/JNuFBo6BD4ZaO8ZJ5BN8Q==", 2219 | "requires": { 2220 | "@types/http-cache-semantics": "^4.0.1", 2221 | "get-stream": "^6.0.1", 2222 | "http-cache-semantics": "^4.1.0", 2223 | "keyv": "^4.5.0", 2224 | "mimic-response": "^4.0.0", 2225 | "normalize-url": "^7.2.0", 2226 | "responselike": "^3.0.0" 2227 | } 2228 | }, 2229 | "decompress-response": { 2230 | "version": "6.0.0", 2231 | "resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-6.0.0.tgz", 2232 | "integrity": "sha512-aW35yZM6Bb/4oJlZncMH2LCoZtJXTRxES17vE3hoRiowU2kWHaJKFkSBDnDR+cm9J+9QhXmREyIfv0pji9ejCQ==", 2233 | "requires": { 2234 | "mimic-response": "^3.1.0" 2235 | }, 2236 | "dependencies": { 2237 | "mimic-response": { 2238 | "version": "3.1.0", 2239 | "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-3.1.0.tgz", 2240 | "integrity": "sha512-z0yWI+4FDrrweS8Zmt4Ej5HdJmky15+L2e6Wgn3+iK5fWzb6T3fhNFq2+MeTRb064c6Wr4N/wv0DzQTjNzHNGQ==" 2241 | } 2242 | } 2243 | }, 2244 | "defer-to-connect": { 2245 | "version": "2.0.1", 2246 | "resolved": "https://registry.npmjs.org/defer-to-connect/-/defer-to-connect-2.0.1.tgz", 2247 | "integrity": "sha512-4tvttepXG1VaYGrRibk5EwJd1t4udunSOVMdLSAL6mId1ix438oPwPZMALY41FCijukO1L0twNcGsdzS7dHgDg==" 2248 | }, 2249 | "fast-xml-parser": { 2250 | "version": "4.2.4", 2251 | "resolved": "https://registry.npmjs.org/fast-xml-parser/-/fast-xml-parser-4.2.4.tgz", 2252 | "integrity": "sha512-fbfMDvgBNIdDJLdLOwacjFAPYt67tr31H9ZhWSm45CDAxvd0I6WTlSOUo7K2P/K5sA5JgMKG64PI3DMcaFdWpQ==", 2253 | "requires": { 2254 | "strnum": "^1.0.5" 2255 | } 2256 | }, 2257 | "form-data-encoder": { 2258 | "version": "2.1.3", 2259 | "resolved": "https://registry.npmjs.org/form-data-encoder/-/form-data-encoder-2.1.3.tgz", 2260 | "integrity": "sha512-KqU0nnPMgIJcCOFTNJFEA8epcseEaoox4XZffTgy8jlI6pL/5EFyR54NRG7CnCJN0biY7q52DO3MH6/sJ/TKlQ==" 2261 | }, 2262 | "get-stream": { 2263 | "version": "6.0.1", 2264 | "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz", 2265 | "integrity": "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==" 2266 | }, 2267 | "got": { 2268 | "version": "12.5.2", 2269 | "resolved": "https://registry.npmjs.org/got/-/got-12.5.2.tgz", 2270 | "integrity": "sha512-guHGMSEcsA5m1oPRweXUJnug0vuvlkX9wx5hzOka+ZBrBUOJHU0Z1JcNu3QE5IPGnA5aXUsQHdWOD4eJg9/v3A==", 2271 | "requires": { 2272 | "@sindresorhus/is": "^5.2.0", 2273 | "@szmarczak/http-timer": "^5.0.1", 2274 | "cacheable-lookup": "^7.0.0", 2275 | "cacheable-request": "^10.2.1", 2276 | "decompress-response": "^6.0.0", 2277 | "form-data-encoder": "^2.1.2", 2278 | "get-stream": "^6.0.1", 2279 | "http2-wrapper": "^2.1.10", 2280 | "lowercase-keys": "^3.0.0", 2281 | "p-cancelable": "^3.0.0", 2282 | "responselike": "^3.0.0" 2283 | } 2284 | }, 2285 | "http-cache-semantics": { 2286 | "version": "4.1.1", 2287 | "resolved": "https://registry.npmjs.org/http-cache-semantics/-/http-cache-semantics-4.1.1.tgz", 2288 | "integrity": "sha512-er295DKPVsV82j5kw1Gjt+ADA/XYHsajl82cGNQG2eyoPkvgUhX+nDIyelzhIWbbsXP39EHcI6l5tYs2FYqYXQ==" 2289 | }, 2290 | "http2-wrapper": { 2291 | "version": "2.1.11", 2292 | "resolved": "https://registry.npmjs.org/http2-wrapper/-/http2-wrapper-2.1.11.tgz", 2293 | "integrity": "sha512-aNAk5JzLturWEUiuhAN73Jcbq96R7rTitAoXV54FYMatvihnpD2+6PUgU4ce3D/m5VDbw+F5CsyKSF176ptitQ==", 2294 | "requires": { 2295 | "quick-lru": "^5.1.1", 2296 | "resolve-alpn": "^1.2.0" 2297 | } 2298 | }, 2299 | "json-buffer": { 2300 | "version": "3.0.1", 2301 | "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.1.tgz", 2302 | "integrity": "sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==" 2303 | }, 2304 | "keyv": { 2305 | "version": "4.5.0", 2306 | "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.5.0.tgz", 2307 | "integrity": "sha512-2YvuMsA+jnFGtBareKqgANOEKe1mk3HKiXu2fRmAfyxG0MJAywNhi5ttWA3PMjl4NmpyjZNbFifR2vNjW1znfA==", 2308 | "requires": { 2309 | "json-buffer": "3.0.1" 2310 | } 2311 | }, 2312 | "lowercase-keys": { 2313 | "version": "3.0.0", 2314 | "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-3.0.0.tgz", 2315 | "integrity": "sha512-ozCC6gdQ+glXOQsveKD0YsDy8DSQFjDTz4zyzEHNV5+JP5D62LmfDZ6o1cycFx9ouG940M5dE8C8CTewdj2YWQ==" 2316 | }, 2317 | "mimic-response": { 2318 | "version": "4.0.0", 2319 | "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-4.0.0.tgz", 2320 | "integrity": "sha512-e5ISH9xMYU0DzrT+jl8q2ze9D6eWBto+I8CNpe+VI+K2J/F/k3PdkdTdz4wvGVH4NTpo+NRYTVIuMQEMMcsLqg==" 2321 | }, 2322 | "normalize-url": { 2323 | "version": "7.2.0", 2324 | "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-7.2.0.tgz", 2325 | "integrity": "sha512-uhXOdZry0L6M2UIo9BTt7FdpBDiAGN/7oItedQwPKh8jh31ZlvC8U9Xl/EJ3aijDHaywXTW3QbZ6LuCocur1YA==" 2326 | }, 2327 | "p-cancelable": { 2328 | "version": "3.0.0", 2329 | "resolved": "https://registry.npmjs.org/p-cancelable/-/p-cancelable-3.0.0.tgz", 2330 | "integrity": "sha512-mlVgR3PGuzlo0MmTdk4cXqXWlwQDLnONTAg6sm62XkMJEiRxN3GL3SffkYvqwonbkJBcrI7Uvv5Zh9yjvn2iUw==" 2331 | }, 2332 | "quick-lru": { 2333 | "version": "5.1.1", 2334 | "resolved": "https://registry.npmjs.org/quick-lru/-/quick-lru-5.1.1.tgz", 2335 | "integrity": "sha512-WuyALRjWPDGtt/wzJiadO5AXY+8hZ80hVpe6MyivgraREW751X3SbhRvG3eLKOYN+8VEvqLcf3wdnt44Z4S4SA==" 2336 | }, 2337 | "resolve-alpn": { 2338 | "version": "1.2.1", 2339 | "resolved": "https://registry.npmjs.org/resolve-alpn/-/resolve-alpn-1.2.1.tgz", 2340 | "integrity": "sha512-0a1F4l73/ZFZOakJnQ3FvkJ2+gSTQWz/r2KE5OdDY0TxPm5h4GkqkWWfM47T7HsbnOtcJVEF4epCVy6u7Q3K+g==" 2341 | }, 2342 | "responselike": { 2343 | "version": "3.0.0", 2344 | "resolved": "https://registry.npmjs.org/responselike/-/responselike-3.0.0.tgz", 2345 | "integrity": "sha512-40yHxbNcl2+rzXvZuVkrYohathsSJlMTXKryG5y8uciHv1+xDLHQpgjG64JUO9nrEq2jGLH6IZ8BcZyw3wrweg==", 2346 | "requires": { 2347 | "lowercase-keys": "^3.0.0" 2348 | } 2349 | }, 2350 | "strnum": { 2351 | "version": "1.0.5", 2352 | "resolved": "https://registry.npmjs.org/strnum/-/strnum-1.0.5.tgz", 2353 | "integrity": "sha512-J8bbNyKKXl5qYcR36TIO8W3mVGVHrmmxsd5PAItGkmyzwJvybiw2IVq5nqd0i4LSNSkB/sx9VHllbfFdr9k1JA==" 2354 | }, 2355 | "tslib": { 2356 | "version": "2.5.3", 2357 | "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.5.3.tgz", 2358 | "integrity": "sha512-mSxlJJwl3BMEQCUNnxXBU9jP4JBktcEGhURcPR6VQVlnP0FdDEsIaz0C35dXNGLyRfrATNofF0F5p2KPxQgB+w==" 2359 | }, 2360 | "uuid": { 2361 | "version": "8.3.2", 2362 | "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz", 2363 | "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==" 2364 | } 2365 | } 2366 | } 2367 | -------------------------------------------------------------------------------- /queue-consumer/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "type": "module", 3 | "dependencies": { 4 | "@aws-sdk/client-sqs": "3.354.0", 5 | "got": "^12.5.2" 6 | }, 7 | "scripts": { 8 | "start": "node index.js" 9 | } 10 | } -------------------------------------------------------------------------------- /websocket/.dockerignore: -------------------------------------------------------------------------------- 1 | node_modules 2 | -------------------------------------------------------------------------------- /websocket/Dockerfile: -------------------------------------------------------------------------------- 1 | FROM public.ecr.aws/docker/library/node:18 AS build 2 | WORKDIR /srv 3 | ADD package.json . 4 | ADD package-lock.json . 5 | RUN npm install 6 | 7 | FROM public.ecr.aws/docker/library/node:18-slim 8 | RUN apt-get update && apt-get install -y \ 9 | curl \ 10 | --no-install-recommends \ 11 | && rm -rf /var/lib/apt/lists/* && apt-get clean 12 | COPY --from=build /srv . 13 | ADD . . 14 | EXPOSE 3000 15 | CMD ["node", "index.js"] -------------------------------------------------------------------------------- /websocket/index.js: -------------------------------------------------------------------------------- 1 | import express from 'express'; 2 | import http from 'http'; 3 | import { WebSocketServer, WebSocket } from 'ws'; 4 | 5 | const app = express(); 6 | const server = http.Server(app); 7 | const wss = new WebSocketServer({ server }); 8 | 9 | import ProtectionManager from './lib/protection-manager.js'; 10 | const TaskProtection = new ProtectionManager({ 11 | // Protect task for 30 min at a time when protection is acquired 12 | desiredProtectionDurationInMins: 30, 13 | // Release task protection right away when no one is connected. 14 | // If there are frequent connection and disconnection, then setting this 15 | // higher will help avoid rate limiting on task protection. 16 | maintainProtectionPercentage: 0, 17 | // At the 80% mark go ahead and preemptively refresh the protection. This 18 | // keeps protection going if a web socket client stays connected for a long time. 19 | refreshProtectionPercentage: 80, 20 | // Check every 10 seconds to see if protection state should be adjusted. 21 | protectionAdjustIntervalInMs: 10 * 1000 22 | }); 23 | 24 | var connections = 0; 25 | 26 | async function protectTask() { 27 | // Refresh the ECS task protection if there are live 28 | // connected clients to this websocket server. 29 | if (connections > 0) { 30 | await TaskProtection.acquire(); 31 | } else { 32 | TaskProtection.release(); 33 | } 34 | } 35 | 36 | TaskProtection.on('protected', function () { 37 | console.log('Task protection acquired'); 38 | }); 39 | 40 | TaskProtection.on('unprotected', function () { 41 | console.log('Task protection released'); 42 | }); 43 | 44 | TaskProtection.on('rejected', function () { 45 | console.log('Task protection rejected'); 46 | 47 | // Notify all connected clients that task protection was 48 | // rejected, therefore it will expire soon and the server 49 | // will shutdown. 50 | wss.clients.forEach(function each(client) { 51 | if (client.readyState === WebSocket.OPEN) { 52 | client.send('server shutting down soon'); 53 | } 54 | }); 55 | }); 56 | 57 | wss.on('connection', function connection(ws) { 58 | connections++; 59 | console.log(`New client connection opened. There are ${connections} connections`); 60 | protectTask(); // Check to see if we need to protect the task 61 | 62 | ws.on('message', function message(data) { 63 | console.log('received: %s', data); 64 | 65 | if (data.toString() === 'ping') { 66 | ws.send('pong') 67 | } 68 | }); 69 | 70 | ws.send(`Welcome! There are ${connections} connections`); 71 | 72 | ws.on('close', async function () { 73 | connections--; 74 | console.log(`Client connection closed. There are ${connections} connections`); 75 | protectTask(); // Check to see if we still need to protect the task 76 | }); 77 | }); 78 | 79 | // Path to serve the static HTML client app that connects to this server 80 | app.use(express.static('public')) 81 | 82 | // This supplies a route for the application load balancer 83 | // to healthcheck on. 84 | app.get('/', function (req, res) { 85 | res.send('Healthy'); 86 | }); 87 | 88 | server.listen(3000); -------------------------------------------------------------------------------- /websocket/lib/protection-manager.js: -------------------------------------------------------------------------------- 1 | import got from 'got'; 2 | import { EventEmitter } from 'node:events'; 3 | 4 | // This class manages the task protection state. It implements basic 5 | // rate limiting, and emits events to let you know when it changes state. 6 | // you can await the acquire() and release() methods if you want to ensure 7 | // that task protection has reached the desired state before moving on. 8 | export default class ProtectionManager extends EventEmitter { 9 | /** 10 | * @constructor 11 | * @param {*} protectionSettings 12 | * @param {*} protectionSettings.desiredProtectionDurationInMins - How long in minutes to protect the process on calling the acquire method 13 | * @param {*} protectionSettings.maintainProtectionPercentage - Number between 0 and 100 that expresses percentage of desired protection to maintain if release is called early 14 | * @param {*} protectionSettings.refreshProtectionPercentage - Number between 0 and 100 that expresses percentage of desired protection duration to let pass before doing an early refresh 15 | * @param {*} protectionSettings.protectionAdjustIntervalInMs - How frequently in ms to attempt/verify state matches desire 16 | */ 17 | constructor(protectionSettings) { 18 | super(); 19 | this.desiredProtectionDurationInMins = protectionSettings.desiredProtectionDurationInMins; 20 | this.protectionAdjustIntervalInMs = protectionSettings.protectionAdjustIntervalInMs; 21 | this.maintainProtectionPercentage = protectionSettings.maintainProtectionPercentage; 22 | this.refreshProtectionPercentage = protectionSettings.refreshProtectionPercentage; 23 | this.ECS_AGENT_URI = process.env.ECS_AGENT_URI; 24 | 25 | if (!this.ECS_AGENT_URI) { 26 | throw new Error('ECS_AGENT_URI environment variable must be set. This is set automatically in an ECS task environment'); 27 | } 28 | 29 | this.desiredState = 'unprotected'; 30 | this.currentState = 'unprotected'; 31 | this.lastStateChange = new Date().getTime(); 32 | this.interval = setInterval(this.attemptAdjustProtection.bind(this), protectionSettings.protectionAdjustIntervalInMs); 33 | } 34 | 35 | attemptAdjustProtection = async function () { 36 | if (this.currentState == 'unprotected' && 37 | this.desiredState == 'unprotected') { 38 | // Already unprotected so nothing to do right now. 39 | this.emit(this.currentState); 40 | return; 41 | } 42 | 43 | var now = new Date().getTime(); 44 | var timeSinceLastChange = now - this.lastStateChange; 45 | var timeUntilProtectRefresh = this.desiredProtectionDurationInMins * 60 * 1000 * (this.refreshProtectionPercentage / 100); 46 | var timeUntilProtectRelease = this.desiredProtectionDurationInMins * 60 * 1000 * (this.maintainProtectionPercentage / 100); 47 | 48 | if (this.currentState == 'protected' && 49 | this.desiredState == 'protected' && 50 | timeSinceLastChange < timeUntilProtectRefresh) { 51 | // We are already protected and haven't yet reached 80% of the acquired protection duration 52 | // so no need to do an early refresh. 53 | this.emit(this.currentState); 54 | return; 55 | } 56 | 57 | if (this.currentState == 'protected' && 58 | this.desiredState == 'unprotected' && 59 | timeSinceLastChange < timeUntilProtectRelease) { 60 | // We are currently protected and not enough duration has passed since we became protected 61 | // so don't actually release the protection yet, maintain it for now. 62 | this.emit(this.currentState); 63 | return; 64 | } 65 | 66 | var ecsAgentParams; 67 | if (this.desiredState == 'unprotected') { 68 | ecsAgentParams = { 69 | ProtectionEnabled: false 70 | }; 71 | } else if (this.desiredState == 'protected') { 72 | ecsAgentParams = { 73 | ProtectionEnabled: true, 74 | ExpiresInMinutes: this.desiredProtectionDurationInMins 75 | }; 76 | } 77 | 78 | try { 79 | await got(`${this.ECS_AGENT_URI}/task-protection/v1/state`, { 80 | method: 'PUT', 81 | json: ecsAgentParams 82 | }); 83 | } catch (e) { 84 | return this.emit('rejected', e); 85 | } 86 | 87 | this.lastStateChange = new Date().getTime(); 88 | this.currentState = this.desiredState; 89 | this.emit(this.currentState); 90 | } 91 | 92 | /** 93 | * Set the desired state to protected and wait for protection to be successfully acquired 94 | */ 95 | acquire = async function () { 96 | var self = this; 97 | this.desiredState = 'protected'; 98 | return new Promise(function (resolve, reject) { 99 | self.once('protected', resolve); 100 | self.attemptAdjustProtection(); // Immediate attempt to make an adjustment 101 | }); 102 | } 103 | 104 | /** 105 | * Set the desired state to unprotected and wait for protection to be successfully released 106 | */ 107 | release = async function () { 108 | var self = this; 109 | this.desiredState = 'unprotected'; 110 | return new Promise(function (resolve, reject) { 111 | self.once('unprotected', resolve); 112 | self.attemptAdjustProtection(); // Immediate attempt to make an adjustment 113 | }); 114 | } 115 | 116 | /** 117 | * When it is time to stop the process this clears 118 | * the interval so that it no longer keeps the event loop alive. 119 | */ 120 | close = function () { 121 | clearInterval(this.interval); 122 | } 123 | } 124 | -------------------------------------------------------------------------------- /websocket/package-lock.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "websocket", 3 | "lockfileVersion": 2, 4 | "requires": true, 5 | "packages": { 6 | "": { 7 | "dependencies": { 8 | "express": "^4.18.2", 9 | "got": "^12.5.2", 10 | "ws": "^8.10.0" 11 | } 12 | }, 13 | "node_modules/@sindresorhus/is": { 14 | "version": "5.3.0", 15 | "resolved": "https://registry.npmjs.org/@sindresorhus/is/-/is-5.3.0.tgz", 16 | "integrity": "sha512-CX6t4SYQ37lzxicAqsBtxA3OseeoVrh9cSJ5PFYam0GksYlupRfy1A+Q4aYD3zvcfECLc0zO2u+ZnR2UYKvCrw==", 17 | "engines": { 18 | "node": ">=14.16" 19 | }, 20 | "funding": { 21 | "url": "https://github.com/sindresorhus/is?sponsor=1" 22 | } 23 | }, 24 | "node_modules/@szmarczak/http-timer": { 25 | "version": "5.0.1", 26 | "resolved": "https://registry.npmjs.org/@szmarczak/http-timer/-/http-timer-5.0.1.tgz", 27 | "integrity": "sha512-+PmQX0PiAYPMeVYe237LJAYvOMYW1j2rH5YROyS3b4CTVJum34HfRvKvAzozHAQG0TnHNdUfY9nCeUyRAs//cw==", 28 | "dependencies": { 29 | "defer-to-connect": "^2.0.1" 30 | }, 31 | "engines": { 32 | "node": ">=14.16" 33 | } 34 | }, 35 | "node_modules/@types/http-cache-semantics": { 36 | "version": "4.0.1", 37 | "resolved": "https://registry.npmjs.org/@types/http-cache-semantics/-/http-cache-semantics-4.0.1.tgz", 38 | "integrity": "sha512-SZs7ekbP8CN0txVG2xVRH6EgKmEm31BOxA07vkFaETzZz1xh+cbt8BcI0slpymvwhx5dlFnQG2rTlPVQn+iRPQ==" 39 | }, 40 | "node_modules/accepts": { 41 | "version": "1.3.8", 42 | "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.8.tgz", 43 | "integrity": "sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==", 44 | "dependencies": { 45 | "mime-types": "~2.1.34", 46 | "negotiator": "0.6.3" 47 | }, 48 | "engines": { 49 | "node": ">= 0.6" 50 | } 51 | }, 52 | "node_modules/array-flatten": { 53 | "version": "1.1.1", 54 | "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", 55 | "integrity": "sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg==" 56 | }, 57 | "node_modules/body-parser": { 58 | "version": "1.20.1", 59 | "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.1.tgz", 60 | "integrity": "sha512-jWi7abTbYwajOytWCQc37VulmWiRae5RyTpaCyDcS5/lMdtwSz5lOpDE67srw/HYe35f1z3fDQw+3txg7gNtWw==", 61 | "dependencies": { 62 | "bytes": "3.1.2", 63 | "content-type": "~1.0.4", 64 | "debug": "2.6.9", 65 | "depd": "2.0.0", 66 | "destroy": "1.2.0", 67 | "http-errors": "2.0.0", 68 | "iconv-lite": "0.4.24", 69 | "on-finished": "2.4.1", 70 | "qs": "6.11.0", 71 | "raw-body": "2.5.1", 72 | "type-is": "~1.6.18", 73 | "unpipe": "1.0.0" 74 | }, 75 | "engines": { 76 | "node": ">= 0.8", 77 | "npm": "1.2.8000 || >= 1.4.16" 78 | } 79 | }, 80 | "node_modules/bytes": { 81 | "version": "3.1.2", 82 | "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", 83 | "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==", 84 | "engines": { 85 | "node": ">= 0.8" 86 | } 87 | }, 88 | "node_modules/cacheable-lookup": { 89 | "version": "7.0.0", 90 | "resolved": "https://registry.npmjs.org/cacheable-lookup/-/cacheable-lookup-7.0.0.tgz", 91 | "integrity": "sha512-+qJyx4xiKra8mZrcwhjMRMUhD5NR1R8esPkzIYxX96JiecFoxAXFuz/GpR3+ev4PE1WamHip78wV0vcmPQtp8w==", 92 | "engines": { 93 | "node": ">=14.16" 94 | } 95 | }, 96 | "node_modules/cacheable-request": { 97 | "version": "10.2.2", 98 | "resolved": "https://registry.npmjs.org/cacheable-request/-/cacheable-request-10.2.2.tgz", 99 | "integrity": "sha512-KxjQZM3UIo7/J6W4sLpwFvu1GB3Whv8NtZ8ZrUL284eiQjiXeeqWTdhixNrp/NLZ/JNuFBo6BD4ZaO8ZJ5BN8Q==", 100 | "dependencies": { 101 | "@types/http-cache-semantics": "^4.0.1", 102 | "get-stream": "^6.0.1", 103 | "http-cache-semantics": "^4.1.0", 104 | "keyv": "^4.5.0", 105 | "mimic-response": "^4.0.0", 106 | "normalize-url": "^7.2.0", 107 | "responselike": "^3.0.0" 108 | }, 109 | "engines": { 110 | "node": ">=14.16" 111 | } 112 | }, 113 | "node_modules/call-bind": { 114 | "version": "1.0.2", 115 | "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz", 116 | "integrity": "sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==", 117 | "dependencies": { 118 | "function-bind": "^1.1.1", 119 | "get-intrinsic": "^1.0.2" 120 | }, 121 | "funding": { 122 | "url": "https://github.com/sponsors/ljharb" 123 | } 124 | }, 125 | "node_modules/content-disposition": { 126 | "version": "0.5.4", 127 | "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.4.tgz", 128 | "integrity": "sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ==", 129 | "dependencies": { 130 | "safe-buffer": "5.2.1" 131 | }, 132 | "engines": { 133 | "node": ">= 0.6" 134 | } 135 | }, 136 | "node_modules/content-type": { 137 | "version": "1.0.4", 138 | "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.4.tgz", 139 | "integrity": "sha512-hIP3EEPs8tB9AT1L+NUqtwOAps4mk2Zob89MWXMHjHWg9milF/j4osnnQLXBCBFBk/tvIG/tUc9mOUJiPBhPXA==", 140 | "engines": { 141 | "node": ">= 0.6" 142 | } 143 | }, 144 | "node_modules/cookie": { 145 | "version": "0.5.0", 146 | "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.5.0.tgz", 147 | "integrity": "sha512-YZ3GUyn/o8gfKJlnlX7g7xq4gyO6OSuhGPKaaGssGB2qgDUS0gPgtTvoyZLTt9Ab6dC4hfc9dV5arkvc/OCmrw==", 148 | "engines": { 149 | "node": ">= 0.6" 150 | } 151 | }, 152 | "node_modules/cookie-signature": { 153 | "version": "1.0.6", 154 | "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz", 155 | "integrity": "sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ==" 156 | }, 157 | "node_modules/debug": { 158 | "version": "2.6.9", 159 | "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", 160 | "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", 161 | "dependencies": { 162 | "ms": "2.0.0" 163 | } 164 | }, 165 | "node_modules/decompress-response": { 166 | "version": "6.0.0", 167 | "resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-6.0.0.tgz", 168 | "integrity": "sha512-aW35yZM6Bb/4oJlZncMH2LCoZtJXTRxES17vE3hoRiowU2kWHaJKFkSBDnDR+cm9J+9QhXmREyIfv0pji9ejCQ==", 169 | "dependencies": { 170 | "mimic-response": "^3.1.0" 171 | }, 172 | "engines": { 173 | "node": ">=10" 174 | }, 175 | "funding": { 176 | "url": "https://github.com/sponsors/sindresorhus" 177 | } 178 | }, 179 | "node_modules/decompress-response/node_modules/mimic-response": { 180 | "version": "3.1.0", 181 | "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-3.1.0.tgz", 182 | "integrity": "sha512-z0yWI+4FDrrweS8Zmt4Ej5HdJmky15+L2e6Wgn3+iK5fWzb6T3fhNFq2+MeTRb064c6Wr4N/wv0DzQTjNzHNGQ==", 183 | "engines": { 184 | "node": ">=10" 185 | }, 186 | "funding": { 187 | "url": "https://github.com/sponsors/sindresorhus" 188 | } 189 | }, 190 | "node_modules/defer-to-connect": { 191 | "version": "2.0.1", 192 | "resolved": "https://registry.npmjs.org/defer-to-connect/-/defer-to-connect-2.0.1.tgz", 193 | "integrity": "sha512-4tvttepXG1VaYGrRibk5EwJd1t4udunSOVMdLSAL6mId1ix438oPwPZMALY41FCijukO1L0twNcGsdzS7dHgDg==", 194 | "engines": { 195 | "node": ">=10" 196 | } 197 | }, 198 | "node_modules/depd": { 199 | "version": "2.0.0", 200 | "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", 201 | "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==", 202 | "engines": { 203 | "node": ">= 0.8" 204 | } 205 | }, 206 | "node_modules/destroy": { 207 | "version": "1.2.0", 208 | "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.2.0.tgz", 209 | "integrity": "sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==", 210 | "engines": { 211 | "node": ">= 0.8", 212 | "npm": "1.2.8000 || >= 1.4.16" 213 | } 214 | }, 215 | "node_modules/ee-first": { 216 | "version": "1.1.1", 217 | "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", 218 | "integrity": "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==" 219 | }, 220 | "node_modules/encodeurl": { 221 | "version": "1.0.2", 222 | "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", 223 | "integrity": "sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==", 224 | "engines": { 225 | "node": ">= 0.8" 226 | } 227 | }, 228 | "node_modules/escape-html": { 229 | "version": "1.0.3", 230 | "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", 231 | "integrity": "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==" 232 | }, 233 | "node_modules/etag": { 234 | "version": "1.8.1", 235 | "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", 236 | "integrity": "sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==", 237 | "engines": { 238 | "node": ">= 0.6" 239 | } 240 | }, 241 | "node_modules/express": { 242 | "version": "4.18.2", 243 | "resolved": "https://registry.npmjs.org/express/-/express-4.18.2.tgz", 244 | "integrity": "sha512-5/PsL6iGPdfQ/lKM1UuielYgv3BUoJfz1aUwU9vHZ+J7gyvwdQXFEBIEIaxeGf0GIcreATNyBExtalisDbuMqQ==", 245 | "dependencies": { 246 | "accepts": "~1.3.8", 247 | "array-flatten": "1.1.1", 248 | "body-parser": "1.20.1", 249 | "content-disposition": "0.5.4", 250 | "content-type": "~1.0.4", 251 | "cookie": "0.5.0", 252 | "cookie-signature": "1.0.6", 253 | "debug": "2.6.9", 254 | "depd": "2.0.0", 255 | "encodeurl": "~1.0.2", 256 | "escape-html": "~1.0.3", 257 | "etag": "~1.8.1", 258 | "finalhandler": "1.2.0", 259 | "fresh": "0.5.2", 260 | "http-errors": "2.0.0", 261 | "merge-descriptors": "1.0.1", 262 | "methods": "~1.1.2", 263 | "on-finished": "2.4.1", 264 | "parseurl": "~1.3.3", 265 | "path-to-regexp": "0.1.7", 266 | "proxy-addr": "~2.0.7", 267 | "qs": "6.11.0", 268 | "range-parser": "~1.2.1", 269 | "safe-buffer": "5.2.1", 270 | "send": "0.18.0", 271 | "serve-static": "1.15.0", 272 | "setprototypeof": "1.2.0", 273 | "statuses": "2.0.1", 274 | "type-is": "~1.6.18", 275 | "utils-merge": "1.0.1", 276 | "vary": "~1.1.2" 277 | }, 278 | "engines": { 279 | "node": ">= 0.10.0" 280 | } 281 | }, 282 | "node_modules/finalhandler": { 283 | "version": "1.2.0", 284 | "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.2.0.tgz", 285 | "integrity": "sha512-5uXcUVftlQMFnWC9qu/svkWv3GTd2PfUhK/3PLkYNAe7FbqJMt3515HaxE6eRL74GdsriiwujiawdaB1BpEISg==", 286 | "dependencies": { 287 | "debug": "2.6.9", 288 | "encodeurl": "~1.0.2", 289 | "escape-html": "~1.0.3", 290 | "on-finished": "2.4.1", 291 | "parseurl": "~1.3.3", 292 | "statuses": "2.0.1", 293 | "unpipe": "~1.0.0" 294 | }, 295 | "engines": { 296 | "node": ">= 0.8" 297 | } 298 | }, 299 | "node_modules/form-data-encoder": { 300 | "version": "2.1.3", 301 | "resolved": "https://registry.npmjs.org/form-data-encoder/-/form-data-encoder-2.1.3.tgz", 302 | "integrity": "sha512-KqU0nnPMgIJcCOFTNJFEA8epcseEaoox4XZffTgy8jlI6pL/5EFyR54NRG7CnCJN0biY7q52DO3MH6/sJ/TKlQ==", 303 | "engines": { 304 | "node": ">= 14.17" 305 | } 306 | }, 307 | "node_modules/forwarded": { 308 | "version": "0.2.0", 309 | "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz", 310 | "integrity": "sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==", 311 | "engines": { 312 | "node": ">= 0.6" 313 | } 314 | }, 315 | "node_modules/fresh": { 316 | "version": "0.5.2", 317 | "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", 318 | "integrity": "sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==", 319 | "engines": { 320 | "node": ">= 0.6" 321 | } 322 | }, 323 | "node_modules/function-bind": { 324 | "version": "1.1.1", 325 | "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", 326 | "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==" 327 | }, 328 | "node_modules/get-intrinsic": { 329 | "version": "1.1.3", 330 | "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.1.3.tgz", 331 | "integrity": "sha512-QJVz1Tj7MS099PevUG5jvnt9tSkXN8K14dxQlikJuPt4uD9hHAHjLyLBiLR5zELelBdD9QNRAXZzsJx0WaDL9A==", 332 | "dependencies": { 333 | "function-bind": "^1.1.1", 334 | "has": "^1.0.3", 335 | "has-symbols": "^1.0.3" 336 | }, 337 | "funding": { 338 | "url": "https://github.com/sponsors/ljharb" 339 | } 340 | }, 341 | "node_modules/get-stream": { 342 | "version": "6.0.1", 343 | "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz", 344 | "integrity": "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==", 345 | "engines": { 346 | "node": ">=10" 347 | }, 348 | "funding": { 349 | "url": "https://github.com/sponsors/sindresorhus" 350 | } 351 | }, 352 | "node_modules/got": { 353 | "version": "12.5.2", 354 | "resolved": "https://registry.npmjs.org/got/-/got-12.5.2.tgz", 355 | "integrity": "sha512-guHGMSEcsA5m1oPRweXUJnug0vuvlkX9wx5hzOka+ZBrBUOJHU0Z1JcNu3QE5IPGnA5aXUsQHdWOD4eJg9/v3A==", 356 | "dependencies": { 357 | "@sindresorhus/is": "^5.2.0", 358 | "@szmarczak/http-timer": "^5.0.1", 359 | "cacheable-lookup": "^7.0.0", 360 | "cacheable-request": "^10.2.1", 361 | "decompress-response": "^6.0.0", 362 | "form-data-encoder": "^2.1.2", 363 | "get-stream": "^6.0.1", 364 | "http2-wrapper": "^2.1.10", 365 | "lowercase-keys": "^3.0.0", 366 | "p-cancelable": "^3.0.0", 367 | "responselike": "^3.0.0" 368 | }, 369 | "engines": { 370 | "node": ">=14.16" 371 | }, 372 | "funding": { 373 | "url": "https://github.com/sindresorhus/got?sponsor=1" 374 | } 375 | }, 376 | "node_modules/has": { 377 | "version": "1.0.3", 378 | "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", 379 | "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", 380 | "dependencies": { 381 | "function-bind": "^1.1.1" 382 | }, 383 | "engines": { 384 | "node": ">= 0.4.0" 385 | } 386 | }, 387 | "node_modules/has-symbols": { 388 | "version": "1.0.3", 389 | "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz", 390 | "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==", 391 | "engines": { 392 | "node": ">= 0.4" 393 | }, 394 | "funding": { 395 | "url": "https://github.com/sponsors/ljharb" 396 | } 397 | }, 398 | "node_modules/http-cache-semantics": { 399 | "version": "4.1.1", 400 | "resolved": "https://registry.npmjs.org/http-cache-semantics/-/http-cache-semantics-4.1.1.tgz", 401 | "integrity": "sha512-er295DKPVsV82j5kw1Gjt+ADA/XYHsajl82cGNQG2eyoPkvgUhX+nDIyelzhIWbbsXP39EHcI6l5tYs2FYqYXQ==" 402 | }, 403 | "node_modules/http-errors": { 404 | "version": "2.0.0", 405 | "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.0.tgz", 406 | "integrity": "sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==", 407 | "dependencies": { 408 | "depd": "2.0.0", 409 | "inherits": "2.0.4", 410 | "setprototypeof": "1.2.0", 411 | "statuses": "2.0.1", 412 | "toidentifier": "1.0.1" 413 | }, 414 | "engines": { 415 | "node": ">= 0.8" 416 | } 417 | }, 418 | "node_modules/http2-wrapper": { 419 | "version": "2.1.11", 420 | "resolved": "https://registry.npmjs.org/http2-wrapper/-/http2-wrapper-2.1.11.tgz", 421 | "integrity": "sha512-aNAk5JzLturWEUiuhAN73Jcbq96R7rTitAoXV54FYMatvihnpD2+6PUgU4ce3D/m5VDbw+F5CsyKSF176ptitQ==", 422 | "dependencies": { 423 | "quick-lru": "^5.1.1", 424 | "resolve-alpn": "^1.2.0" 425 | }, 426 | "engines": { 427 | "node": ">=10.19.0" 428 | } 429 | }, 430 | "node_modules/iconv-lite": { 431 | "version": "0.4.24", 432 | "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", 433 | "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", 434 | "dependencies": { 435 | "safer-buffer": ">= 2.1.2 < 3" 436 | }, 437 | "engines": { 438 | "node": ">=0.10.0" 439 | } 440 | }, 441 | "node_modules/inherits": { 442 | "version": "2.0.4", 443 | "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", 444 | "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" 445 | }, 446 | "node_modules/ipaddr.js": { 447 | "version": "1.9.1", 448 | "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz", 449 | "integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==", 450 | "engines": { 451 | "node": ">= 0.10" 452 | } 453 | }, 454 | "node_modules/json-buffer": { 455 | "version": "3.0.1", 456 | "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.1.tgz", 457 | "integrity": "sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==" 458 | }, 459 | "node_modules/keyv": { 460 | "version": "4.5.2", 461 | "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.5.2.tgz", 462 | "integrity": "sha512-5MHbFaKn8cNSmVW7BYnijeAVlE4cYA/SVkifVgrh7yotnfhKmjuXpDKjrABLnT0SfHWV21P8ow07OGfRrNDg8g==", 463 | "dependencies": { 464 | "json-buffer": "3.0.1" 465 | } 466 | }, 467 | "node_modules/lowercase-keys": { 468 | "version": "3.0.0", 469 | "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-3.0.0.tgz", 470 | "integrity": "sha512-ozCC6gdQ+glXOQsveKD0YsDy8DSQFjDTz4zyzEHNV5+JP5D62LmfDZ6o1cycFx9ouG940M5dE8C8CTewdj2YWQ==", 471 | "engines": { 472 | "node": "^12.20.0 || ^14.13.1 || >=16.0.0" 473 | }, 474 | "funding": { 475 | "url": "https://github.com/sponsors/sindresorhus" 476 | } 477 | }, 478 | "node_modules/media-typer": { 479 | "version": "0.3.0", 480 | "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", 481 | "integrity": "sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ==", 482 | "engines": { 483 | "node": ">= 0.6" 484 | } 485 | }, 486 | "node_modules/merge-descriptors": { 487 | "version": "1.0.1", 488 | "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz", 489 | "integrity": "sha512-cCi6g3/Zr1iqQi6ySbseM1Xvooa98N0w31jzUYrXPX2xqObmFGHJ0tQ5u74H3mVh7wLouTseZyYIq39g8cNp1w==" 490 | }, 491 | "node_modules/methods": { 492 | "version": "1.1.2", 493 | "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", 494 | "integrity": "sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w==", 495 | "engines": { 496 | "node": ">= 0.6" 497 | } 498 | }, 499 | "node_modules/mime": { 500 | "version": "1.6.0", 501 | "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", 502 | "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==", 503 | "bin": { 504 | "mime": "cli.js" 505 | }, 506 | "engines": { 507 | "node": ">=4" 508 | } 509 | }, 510 | "node_modules/mime-db": { 511 | "version": "1.52.0", 512 | "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", 513 | "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", 514 | "engines": { 515 | "node": ">= 0.6" 516 | } 517 | }, 518 | "node_modules/mime-types": { 519 | "version": "2.1.35", 520 | "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", 521 | "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", 522 | "dependencies": { 523 | "mime-db": "1.52.0" 524 | }, 525 | "engines": { 526 | "node": ">= 0.6" 527 | } 528 | }, 529 | "node_modules/mimic-response": { 530 | "version": "4.0.0", 531 | "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-4.0.0.tgz", 532 | "integrity": "sha512-e5ISH9xMYU0DzrT+jl8q2ze9D6eWBto+I8CNpe+VI+K2J/F/k3PdkdTdz4wvGVH4NTpo+NRYTVIuMQEMMcsLqg==", 533 | "engines": { 534 | "node": "^12.20.0 || ^14.13.1 || >=16.0.0" 535 | }, 536 | "funding": { 537 | "url": "https://github.com/sponsors/sindresorhus" 538 | } 539 | }, 540 | "node_modules/ms": { 541 | "version": "2.0.0", 542 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", 543 | "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" 544 | }, 545 | "node_modules/negotiator": { 546 | "version": "0.6.3", 547 | "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz", 548 | "integrity": "sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==", 549 | "engines": { 550 | "node": ">= 0.6" 551 | } 552 | }, 553 | "node_modules/normalize-url": { 554 | "version": "7.2.0", 555 | "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-7.2.0.tgz", 556 | "integrity": "sha512-uhXOdZry0L6M2UIo9BTt7FdpBDiAGN/7oItedQwPKh8jh31ZlvC8U9Xl/EJ3aijDHaywXTW3QbZ6LuCocur1YA==", 557 | "engines": { 558 | "node": ">=12.20" 559 | }, 560 | "funding": { 561 | "url": "https://github.com/sponsors/sindresorhus" 562 | } 563 | }, 564 | "node_modules/object-inspect": { 565 | "version": "1.12.2", 566 | "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.12.2.tgz", 567 | "integrity": "sha512-z+cPxW0QGUp0mcqcsgQyLVRDoXFQbXOwBaqyF7VIgI4TWNQsDHrBpUQslRmIfAoYWdYzs6UlKJtB2XJpTaNSpQ==", 568 | "funding": { 569 | "url": "https://github.com/sponsors/ljharb" 570 | } 571 | }, 572 | "node_modules/on-finished": { 573 | "version": "2.4.1", 574 | "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz", 575 | "integrity": "sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==", 576 | "dependencies": { 577 | "ee-first": "1.1.1" 578 | }, 579 | "engines": { 580 | "node": ">= 0.8" 581 | } 582 | }, 583 | "node_modules/p-cancelable": { 584 | "version": "3.0.0", 585 | "resolved": "https://registry.npmjs.org/p-cancelable/-/p-cancelable-3.0.0.tgz", 586 | "integrity": "sha512-mlVgR3PGuzlo0MmTdk4cXqXWlwQDLnONTAg6sm62XkMJEiRxN3GL3SffkYvqwonbkJBcrI7Uvv5Zh9yjvn2iUw==", 587 | "engines": { 588 | "node": ">=12.20" 589 | } 590 | }, 591 | "node_modules/parseurl": { 592 | "version": "1.3.3", 593 | "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", 594 | "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==", 595 | "engines": { 596 | "node": ">= 0.8" 597 | } 598 | }, 599 | "node_modules/path-to-regexp": { 600 | "version": "0.1.7", 601 | "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz", 602 | "integrity": "sha512-5DFkuoqlv1uYQKxy8omFBeJPQcdoE07Kv2sferDCrAq1ohOU+MSDswDIbnx3YAM60qIOnYa53wBhXW0EbMonrQ==" 603 | }, 604 | "node_modules/proxy-addr": { 605 | "version": "2.0.7", 606 | "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.7.tgz", 607 | "integrity": "sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==", 608 | "dependencies": { 609 | "forwarded": "0.2.0", 610 | "ipaddr.js": "1.9.1" 611 | }, 612 | "engines": { 613 | "node": ">= 0.10" 614 | } 615 | }, 616 | "node_modules/qs": { 617 | "version": "6.11.0", 618 | "resolved": "https://registry.npmjs.org/qs/-/qs-6.11.0.tgz", 619 | "integrity": "sha512-MvjoMCJwEarSbUYk5O+nmoSzSutSsTwF85zcHPQ9OrlFoZOYIjaqBAJIqIXjptyD5vThxGq52Xu/MaJzRkIk4Q==", 620 | "dependencies": { 621 | "side-channel": "^1.0.4" 622 | }, 623 | "engines": { 624 | "node": ">=0.6" 625 | }, 626 | "funding": { 627 | "url": "https://github.com/sponsors/ljharb" 628 | } 629 | }, 630 | "node_modules/quick-lru": { 631 | "version": "5.1.1", 632 | "resolved": "https://registry.npmjs.org/quick-lru/-/quick-lru-5.1.1.tgz", 633 | "integrity": "sha512-WuyALRjWPDGtt/wzJiadO5AXY+8hZ80hVpe6MyivgraREW751X3SbhRvG3eLKOYN+8VEvqLcf3wdnt44Z4S4SA==", 634 | "engines": { 635 | "node": ">=10" 636 | }, 637 | "funding": { 638 | "url": "https://github.com/sponsors/sindresorhus" 639 | } 640 | }, 641 | "node_modules/range-parser": { 642 | "version": "1.2.1", 643 | "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz", 644 | "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==", 645 | "engines": { 646 | "node": ">= 0.6" 647 | } 648 | }, 649 | "node_modules/raw-body": { 650 | "version": "2.5.1", 651 | "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.5.1.tgz", 652 | "integrity": "sha512-qqJBtEyVgS0ZmPGdCFPWJ3FreoqvG4MVQln/kCgF7Olq95IbOp0/BWyMwbdtn4VTvkM8Y7khCQ2Xgk/tcrCXig==", 653 | "dependencies": { 654 | "bytes": "3.1.2", 655 | "http-errors": "2.0.0", 656 | "iconv-lite": "0.4.24", 657 | "unpipe": "1.0.0" 658 | }, 659 | "engines": { 660 | "node": ">= 0.8" 661 | } 662 | }, 663 | "node_modules/resolve-alpn": { 664 | "version": "1.2.1", 665 | "resolved": "https://registry.npmjs.org/resolve-alpn/-/resolve-alpn-1.2.1.tgz", 666 | "integrity": "sha512-0a1F4l73/ZFZOakJnQ3FvkJ2+gSTQWz/r2KE5OdDY0TxPm5h4GkqkWWfM47T7HsbnOtcJVEF4epCVy6u7Q3K+g==" 667 | }, 668 | "node_modules/responselike": { 669 | "version": "3.0.0", 670 | "resolved": "https://registry.npmjs.org/responselike/-/responselike-3.0.0.tgz", 671 | "integrity": "sha512-40yHxbNcl2+rzXvZuVkrYohathsSJlMTXKryG5y8uciHv1+xDLHQpgjG64JUO9nrEq2jGLH6IZ8BcZyw3wrweg==", 672 | "dependencies": { 673 | "lowercase-keys": "^3.0.0" 674 | }, 675 | "engines": { 676 | "node": ">=14.16" 677 | }, 678 | "funding": { 679 | "url": "https://github.com/sponsors/sindresorhus" 680 | } 681 | }, 682 | "node_modules/safe-buffer": { 683 | "version": "5.2.1", 684 | "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", 685 | "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", 686 | "funding": [ 687 | { 688 | "type": "github", 689 | "url": "https://github.com/sponsors/feross" 690 | }, 691 | { 692 | "type": "patreon", 693 | "url": "https://www.patreon.com/feross" 694 | }, 695 | { 696 | "type": "consulting", 697 | "url": "https://feross.org/support" 698 | } 699 | ] 700 | }, 701 | "node_modules/safer-buffer": { 702 | "version": "2.1.2", 703 | "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", 704 | "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" 705 | }, 706 | "node_modules/send": { 707 | "version": "0.18.0", 708 | "resolved": "https://registry.npmjs.org/send/-/send-0.18.0.tgz", 709 | "integrity": "sha512-qqWzuOjSFOuqPjFe4NOsMLafToQQwBSOEpS+FwEt3A2V3vKubTquT3vmLTQpFgMXp8AlFWFuP1qKaJZOtPpVXg==", 710 | "dependencies": { 711 | "debug": "2.6.9", 712 | "depd": "2.0.0", 713 | "destroy": "1.2.0", 714 | "encodeurl": "~1.0.2", 715 | "escape-html": "~1.0.3", 716 | "etag": "~1.8.1", 717 | "fresh": "0.5.2", 718 | "http-errors": "2.0.0", 719 | "mime": "1.6.0", 720 | "ms": "2.1.3", 721 | "on-finished": "2.4.1", 722 | "range-parser": "~1.2.1", 723 | "statuses": "2.0.1" 724 | }, 725 | "engines": { 726 | "node": ">= 0.8.0" 727 | } 728 | }, 729 | "node_modules/send/node_modules/ms": { 730 | "version": "2.1.3", 731 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", 732 | "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==" 733 | }, 734 | "node_modules/serve-static": { 735 | "version": "1.15.0", 736 | "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.15.0.tgz", 737 | "integrity": "sha512-XGuRDNjXUijsUL0vl6nSD7cwURuzEgglbOaFuZM9g3kwDXOWVTck0jLzjPzGD+TazWbboZYu52/9/XPdUgne9g==", 738 | "dependencies": { 739 | "encodeurl": "~1.0.2", 740 | "escape-html": "~1.0.3", 741 | "parseurl": "~1.3.3", 742 | "send": "0.18.0" 743 | }, 744 | "engines": { 745 | "node": ">= 0.8.0" 746 | } 747 | }, 748 | "node_modules/setprototypeof": { 749 | "version": "1.2.0", 750 | "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz", 751 | "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==" 752 | }, 753 | "node_modules/side-channel": { 754 | "version": "1.0.4", 755 | "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.4.tgz", 756 | "integrity": "sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==", 757 | "dependencies": { 758 | "call-bind": "^1.0.0", 759 | "get-intrinsic": "^1.0.2", 760 | "object-inspect": "^1.9.0" 761 | }, 762 | "funding": { 763 | "url": "https://github.com/sponsors/ljharb" 764 | } 765 | }, 766 | "node_modules/statuses": { 767 | "version": "2.0.1", 768 | "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz", 769 | "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==", 770 | "engines": { 771 | "node": ">= 0.8" 772 | } 773 | }, 774 | "node_modules/toidentifier": { 775 | "version": "1.0.1", 776 | "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz", 777 | "integrity": "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==", 778 | "engines": { 779 | "node": ">=0.6" 780 | } 781 | }, 782 | "node_modules/type-is": { 783 | "version": "1.6.18", 784 | "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz", 785 | "integrity": "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==", 786 | "dependencies": { 787 | "media-typer": "0.3.0", 788 | "mime-types": "~2.1.24" 789 | }, 790 | "engines": { 791 | "node": ">= 0.6" 792 | } 793 | }, 794 | "node_modules/unpipe": { 795 | "version": "1.0.0", 796 | "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", 797 | "integrity": "sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==", 798 | "engines": { 799 | "node": ">= 0.8" 800 | } 801 | }, 802 | "node_modules/utils-merge": { 803 | "version": "1.0.1", 804 | "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz", 805 | "integrity": "sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA==", 806 | "engines": { 807 | "node": ">= 0.4.0" 808 | } 809 | }, 810 | "node_modules/vary": { 811 | "version": "1.1.2", 812 | "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", 813 | "integrity": "sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==", 814 | "engines": { 815 | "node": ">= 0.8" 816 | } 817 | }, 818 | "node_modules/ws": { 819 | "version": "8.10.0", 820 | "resolved": "https://registry.npmjs.org/ws/-/ws-8.10.0.tgz", 821 | "integrity": "sha512-+s49uSmZpvtAsd2h37vIPy1RBusaLawVe8of+GyEPsaJTCMpj/2v8NpeK1SHXjBlQ95lQTmQofOJnFiLoaN3yw==", 822 | "engines": { 823 | "node": ">=10.0.0" 824 | }, 825 | "peerDependencies": { 826 | "bufferutil": "^4.0.1", 827 | "utf-8-validate": "^5.0.2" 828 | }, 829 | "peerDependenciesMeta": { 830 | "bufferutil": { 831 | "optional": true 832 | }, 833 | "utf-8-validate": { 834 | "optional": true 835 | } 836 | } 837 | } 838 | }, 839 | "dependencies": { 840 | "@sindresorhus/is": { 841 | "version": "5.3.0", 842 | "resolved": "https://registry.npmjs.org/@sindresorhus/is/-/is-5.3.0.tgz", 843 | "integrity": "sha512-CX6t4SYQ37lzxicAqsBtxA3OseeoVrh9cSJ5PFYam0GksYlupRfy1A+Q4aYD3zvcfECLc0zO2u+ZnR2UYKvCrw==" 844 | }, 845 | "@szmarczak/http-timer": { 846 | "version": "5.0.1", 847 | "resolved": "https://registry.npmjs.org/@szmarczak/http-timer/-/http-timer-5.0.1.tgz", 848 | "integrity": "sha512-+PmQX0PiAYPMeVYe237LJAYvOMYW1j2rH5YROyS3b4CTVJum34HfRvKvAzozHAQG0TnHNdUfY9nCeUyRAs//cw==", 849 | "requires": { 850 | "defer-to-connect": "^2.0.1" 851 | } 852 | }, 853 | "@types/http-cache-semantics": { 854 | "version": "4.0.1", 855 | "resolved": "https://registry.npmjs.org/@types/http-cache-semantics/-/http-cache-semantics-4.0.1.tgz", 856 | "integrity": "sha512-SZs7ekbP8CN0txVG2xVRH6EgKmEm31BOxA07vkFaETzZz1xh+cbt8BcI0slpymvwhx5dlFnQG2rTlPVQn+iRPQ==" 857 | }, 858 | "accepts": { 859 | "version": "1.3.8", 860 | "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.8.tgz", 861 | "integrity": "sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==", 862 | "requires": { 863 | "mime-types": "~2.1.34", 864 | "negotiator": "0.6.3" 865 | } 866 | }, 867 | "array-flatten": { 868 | "version": "1.1.1", 869 | "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", 870 | "integrity": "sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg==" 871 | }, 872 | "body-parser": { 873 | "version": "1.20.1", 874 | "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.1.tgz", 875 | "integrity": "sha512-jWi7abTbYwajOytWCQc37VulmWiRae5RyTpaCyDcS5/lMdtwSz5lOpDE67srw/HYe35f1z3fDQw+3txg7gNtWw==", 876 | "requires": { 877 | "bytes": "3.1.2", 878 | "content-type": "~1.0.4", 879 | "debug": "2.6.9", 880 | "depd": "2.0.0", 881 | "destroy": "1.2.0", 882 | "http-errors": "2.0.0", 883 | "iconv-lite": "0.4.24", 884 | "on-finished": "2.4.1", 885 | "qs": "6.11.0", 886 | "raw-body": "2.5.1", 887 | "type-is": "~1.6.18", 888 | "unpipe": "1.0.0" 889 | } 890 | }, 891 | "bytes": { 892 | "version": "3.1.2", 893 | "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", 894 | "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==" 895 | }, 896 | "cacheable-lookup": { 897 | "version": "7.0.0", 898 | "resolved": "https://registry.npmjs.org/cacheable-lookup/-/cacheable-lookup-7.0.0.tgz", 899 | "integrity": "sha512-+qJyx4xiKra8mZrcwhjMRMUhD5NR1R8esPkzIYxX96JiecFoxAXFuz/GpR3+ev4PE1WamHip78wV0vcmPQtp8w==" 900 | }, 901 | "cacheable-request": { 902 | "version": "10.2.2", 903 | "resolved": "https://registry.npmjs.org/cacheable-request/-/cacheable-request-10.2.2.tgz", 904 | "integrity": "sha512-KxjQZM3UIo7/J6W4sLpwFvu1GB3Whv8NtZ8ZrUL284eiQjiXeeqWTdhixNrp/NLZ/JNuFBo6BD4ZaO8ZJ5BN8Q==", 905 | "requires": { 906 | "@types/http-cache-semantics": "^4.0.1", 907 | "get-stream": "^6.0.1", 908 | "http-cache-semantics": "^4.1.0", 909 | "keyv": "^4.5.0", 910 | "mimic-response": "^4.0.0", 911 | "normalize-url": "^7.2.0", 912 | "responselike": "^3.0.0" 913 | } 914 | }, 915 | "call-bind": { 916 | "version": "1.0.2", 917 | "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz", 918 | "integrity": "sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==", 919 | "requires": { 920 | "function-bind": "^1.1.1", 921 | "get-intrinsic": "^1.0.2" 922 | } 923 | }, 924 | "content-disposition": { 925 | "version": "0.5.4", 926 | "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.4.tgz", 927 | "integrity": "sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ==", 928 | "requires": { 929 | "safe-buffer": "5.2.1" 930 | } 931 | }, 932 | "content-type": { 933 | "version": "1.0.4", 934 | "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.4.tgz", 935 | "integrity": "sha512-hIP3EEPs8tB9AT1L+NUqtwOAps4mk2Zob89MWXMHjHWg9milF/j4osnnQLXBCBFBk/tvIG/tUc9mOUJiPBhPXA==" 936 | }, 937 | "cookie": { 938 | "version": "0.5.0", 939 | "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.5.0.tgz", 940 | "integrity": "sha512-YZ3GUyn/o8gfKJlnlX7g7xq4gyO6OSuhGPKaaGssGB2qgDUS0gPgtTvoyZLTt9Ab6dC4hfc9dV5arkvc/OCmrw==" 941 | }, 942 | "cookie-signature": { 943 | "version": "1.0.6", 944 | "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz", 945 | "integrity": "sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ==" 946 | }, 947 | "debug": { 948 | "version": "2.6.9", 949 | "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", 950 | "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", 951 | "requires": { 952 | "ms": "2.0.0" 953 | } 954 | }, 955 | "decompress-response": { 956 | "version": "6.0.0", 957 | "resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-6.0.0.tgz", 958 | "integrity": "sha512-aW35yZM6Bb/4oJlZncMH2LCoZtJXTRxES17vE3hoRiowU2kWHaJKFkSBDnDR+cm9J+9QhXmREyIfv0pji9ejCQ==", 959 | "requires": { 960 | "mimic-response": "^3.1.0" 961 | }, 962 | "dependencies": { 963 | "mimic-response": { 964 | "version": "3.1.0", 965 | "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-3.1.0.tgz", 966 | "integrity": "sha512-z0yWI+4FDrrweS8Zmt4Ej5HdJmky15+L2e6Wgn3+iK5fWzb6T3fhNFq2+MeTRb064c6Wr4N/wv0DzQTjNzHNGQ==" 967 | } 968 | } 969 | }, 970 | "defer-to-connect": { 971 | "version": "2.0.1", 972 | "resolved": "https://registry.npmjs.org/defer-to-connect/-/defer-to-connect-2.0.1.tgz", 973 | "integrity": "sha512-4tvttepXG1VaYGrRibk5EwJd1t4udunSOVMdLSAL6mId1ix438oPwPZMALY41FCijukO1L0twNcGsdzS7dHgDg==" 974 | }, 975 | "depd": { 976 | "version": "2.0.0", 977 | "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", 978 | "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==" 979 | }, 980 | "destroy": { 981 | "version": "1.2.0", 982 | "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.2.0.tgz", 983 | "integrity": "sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==" 984 | }, 985 | "ee-first": { 986 | "version": "1.1.1", 987 | "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", 988 | "integrity": "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==" 989 | }, 990 | "encodeurl": { 991 | "version": "1.0.2", 992 | "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", 993 | "integrity": "sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==" 994 | }, 995 | "escape-html": { 996 | "version": "1.0.3", 997 | "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", 998 | "integrity": "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==" 999 | }, 1000 | "etag": { 1001 | "version": "1.8.1", 1002 | "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", 1003 | "integrity": "sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==" 1004 | }, 1005 | "express": { 1006 | "version": "4.18.2", 1007 | "resolved": "https://registry.npmjs.org/express/-/express-4.18.2.tgz", 1008 | "integrity": "sha512-5/PsL6iGPdfQ/lKM1UuielYgv3BUoJfz1aUwU9vHZ+J7gyvwdQXFEBIEIaxeGf0GIcreATNyBExtalisDbuMqQ==", 1009 | "requires": { 1010 | "accepts": "~1.3.8", 1011 | "array-flatten": "1.1.1", 1012 | "body-parser": "1.20.1", 1013 | "content-disposition": "0.5.4", 1014 | "content-type": "~1.0.4", 1015 | "cookie": "0.5.0", 1016 | "cookie-signature": "1.0.6", 1017 | "debug": "2.6.9", 1018 | "depd": "2.0.0", 1019 | "encodeurl": "~1.0.2", 1020 | "escape-html": "~1.0.3", 1021 | "etag": "~1.8.1", 1022 | "finalhandler": "1.2.0", 1023 | "fresh": "0.5.2", 1024 | "http-errors": "2.0.0", 1025 | "merge-descriptors": "1.0.1", 1026 | "methods": "~1.1.2", 1027 | "on-finished": "2.4.1", 1028 | "parseurl": "~1.3.3", 1029 | "path-to-regexp": "0.1.7", 1030 | "proxy-addr": "~2.0.7", 1031 | "qs": "6.11.0", 1032 | "range-parser": "~1.2.1", 1033 | "safe-buffer": "5.2.1", 1034 | "send": "0.18.0", 1035 | "serve-static": "1.15.0", 1036 | "setprototypeof": "1.2.0", 1037 | "statuses": "2.0.1", 1038 | "type-is": "~1.6.18", 1039 | "utils-merge": "1.0.1", 1040 | "vary": "~1.1.2" 1041 | } 1042 | }, 1043 | "finalhandler": { 1044 | "version": "1.2.0", 1045 | "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.2.0.tgz", 1046 | "integrity": "sha512-5uXcUVftlQMFnWC9qu/svkWv3GTd2PfUhK/3PLkYNAe7FbqJMt3515HaxE6eRL74GdsriiwujiawdaB1BpEISg==", 1047 | "requires": { 1048 | "debug": "2.6.9", 1049 | "encodeurl": "~1.0.2", 1050 | "escape-html": "~1.0.3", 1051 | "on-finished": "2.4.1", 1052 | "parseurl": "~1.3.3", 1053 | "statuses": "2.0.1", 1054 | "unpipe": "~1.0.0" 1055 | } 1056 | }, 1057 | "form-data-encoder": { 1058 | "version": "2.1.3", 1059 | "resolved": "https://registry.npmjs.org/form-data-encoder/-/form-data-encoder-2.1.3.tgz", 1060 | "integrity": "sha512-KqU0nnPMgIJcCOFTNJFEA8epcseEaoox4XZffTgy8jlI6pL/5EFyR54NRG7CnCJN0biY7q52DO3MH6/sJ/TKlQ==" 1061 | }, 1062 | "forwarded": { 1063 | "version": "0.2.0", 1064 | "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz", 1065 | "integrity": "sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==" 1066 | }, 1067 | "fresh": { 1068 | "version": "0.5.2", 1069 | "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", 1070 | "integrity": "sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==" 1071 | }, 1072 | "function-bind": { 1073 | "version": "1.1.1", 1074 | "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", 1075 | "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==" 1076 | }, 1077 | "get-intrinsic": { 1078 | "version": "1.1.3", 1079 | "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.1.3.tgz", 1080 | "integrity": "sha512-QJVz1Tj7MS099PevUG5jvnt9tSkXN8K14dxQlikJuPt4uD9hHAHjLyLBiLR5zELelBdD9QNRAXZzsJx0WaDL9A==", 1081 | "requires": { 1082 | "function-bind": "^1.1.1", 1083 | "has": "^1.0.3", 1084 | "has-symbols": "^1.0.3" 1085 | } 1086 | }, 1087 | "get-stream": { 1088 | "version": "6.0.1", 1089 | "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz", 1090 | "integrity": "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==" 1091 | }, 1092 | "got": { 1093 | "version": "12.5.2", 1094 | "resolved": "https://registry.npmjs.org/got/-/got-12.5.2.tgz", 1095 | "integrity": "sha512-guHGMSEcsA5m1oPRweXUJnug0vuvlkX9wx5hzOka+ZBrBUOJHU0Z1JcNu3QE5IPGnA5aXUsQHdWOD4eJg9/v3A==", 1096 | "requires": { 1097 | "@sindresorhus/is": "^5.2.0", 1098 | "@szmarczak/http-timer": "^5.0.1", 1099 | "cacheable-lookup": "^7.0.0", 1100 | "cacheable-request": "^10.2.1", 1101 | "decompress-response": "^6.0.0", 1102 | "form-data-encoder": "^2.1.2", 1103 | "get-stream": "^6.0.1", 1104 | "http2-wrapper": "^2.1.10", 1105 | "lowercase-keys": "^3.0.0", 1106 | "p-cancelable": "^3.0.0", 1107 | "responselike": "^3.0.0" 1108 | } 1109 | }, 1110 | "has": { 1111 | "version": "1.0.3", 1112 | "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", 1113 | "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", 1114 | "requires": { 1115 | "function-bind": "^1.1.1" 1116 | } 1117 | }, 1118 | "has-symbols": { 1119 | "version": "1.0.3", 1120 | "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz", 1121 | "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==" 1122 | }, 1123 | "http-cache-semantics": { 1124 | "version": "4.1.1", 1125 | "resolved": "https://registry.npmjs.org/http-cache-semantics/-/http-cache-semantics-4.1.1.tgz", 1126 | "integrity": "sha512-er295DKPVsV82j5kw1Gjt+ADA/XYHsajl82cGNQG2eyoPkvgUhX+nDIyelzhIWbbsXP39EHcI6l5tYs2FYqYXQ==" 1127 | }, 1128 | "http-errors": { 1129 | "version": "2.0.0", 1130 | "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.0.tgz", 1131 | "integrity": "sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==", 1132 | "requires": { 1133 | "depd": "2.0.0", 1134 | "inherits": "2.0.4", 1135 | "setprototypeof": "1.2.0", 1136 | "statuses": "2.0.1", 1137 | "toidentifier": "1.0.1" 1138 | } 1139 | }, 1140 | "http2-wrapper": { 1141 | "version": "2.1.11", 1142 | "resolved": "https://registry.npmjs.org/http2-wrapper/-/http2-wrapper-2.1.11.tgz", 1143 | "integrity": "sha512-aNAk5JzLturWEUiuhAN73Jcbq96R7rTitAoXV54FYMatvihnpD2+6PUgU4ce3D/m5VDbw+F5CsyKSF176ptitQ==", 1144 | "requires": { 1145 | "quick-lru": "^5.1.1", 1146 | "resolve-alpn": "^1.2.0" 1147 | } 1148 | }, 1149 | "iconv-lite": { 1150 | "version": "0.4.24", 1151 | "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", 1152 | "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", 1153 | "requires": { 1154 | "safer-buffer": ">= 2.1.2 < 3" 1155 | } 1156 | }, 1157 | "inherits": { 1158 | "version": "2.0.4", 1159 | "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", 1160 | "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" 1161 | }, 1162 | "ipaddr.js": { 1163 | "version": "1.9.1", 1164 | "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz", 1165 | "integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==" 1166 | }, 1167 | "json-buffer": { 1168 | "version": "3.0.1", 1169 | "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.1.tgz", 1170 | "integrity": "sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==" 1171 | }, 1172 | "keyv": { 1173 | "version": "4.5.2", 1174 | "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.5.2.tgz", 1175 | "integrity": "sha512-5MHbFaKn8cNSmVW7BYnijeAVlE4cYA/SVkifVgrh7yotnfhKmjuXpDKjrABLnT0SfHWV21P8ow07OGfRrNDg8g==", 1176 | "requires": { 1177 | "json-buffer": "3.0.1" 1178 | } 1179 | }, 1180 | "lowercase-keys": { 1181 | "version": "3.0.0", 1182 | "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-3.0.0.tgz", 1183 | "integrity": "sha512-ozCC6gdQ+glXOQsveKD0YsDy8DSQFjDTz4zyzEHNV5+JP5D62LmfDZ6o1cycFx9ouG940M5dE8C8CTewdj2YWQ==" 1184 | }, 1185 | "media-typer": { 1186 | "version": "0.3.0", 1187 | "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", 1188 | "integrity": "sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ==" 1189 | }, 1190 | "merge-descriptors": { 1191 | "version": "1.0.1", 1192 | "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz", 1193 | "integrity": "sha512-cCi6g3/Zr1iqQi6ySbseM1Xvooa98N0w31jzUYrXPX2xqObmFGHJ0tQ5u74H3mVh7wLouTseZyYIq39g8cNp1w==" 1194 | }, 1195 | "methods": { 1196 | "version": "1.1.2", 1197 | "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", 1198 | "integrity": "sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w==" 1199 | }, 1200 | "mime": { 1201 | "version": "1.6.0", 1202 | "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", 1203 | "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==" 1204 | }, 1205 | "mime-db": { 1206 | "version": "1.52.0", 1207 | "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", 1208 | "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==" 1209 | }, 1210 | "mime-types": { 1211 | "version": "2.1.35", 1212 | "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", 1213 | "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", 1214 | "requires": { 1215 | "mime-db": "1.52.0" 1216 | } 1217 | }, 1218 | "mimic-response": { 1219 | "version": "4.0.0", 1220 | "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-4.0.0.tgz", 1221 | "integrity": "sha512-e5ISH9xMYU0DzrT+jl8q2ze9D6eWBto+I8CNpe+VI+K2J/F/k3PdkdTdz4wvGVH4NTpo+NRYTVIuMQEMMcsLqg==" 1222 | }, 1223 | "ms": { 1224 | "version": "2.0.0", 1225 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", 1226 | "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" 1227 | }, 1228 | "negotiator": { 1229 | "version": "0.6.3", 1230 | "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz", 1231 | "integrity": "sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==" 1232 | }, 1233 | "normalize-url": { 1234 | "version": "7.2.0", 1235 | "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-7.2.0.tgz", 1236 | "integrity": "sha512-uhXOdZry0L6M2UIo9BTt7FdpBDiAGN/7oItedQwPKh8jh31ZlvC8U9Xl/EJ3aijDHaywXTW3QbZ6LuCocur1YA==" 1237 | }, 1238 | "object-inspect": { 1239 | "version": "1.12.2", 1240 | "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.12.2.tgz", 1241 | "integrity": "sha512-z+cPxW0QGUp0mcqcsgQyLVRDoXFQbXOwBaqyF7VIgI4TWNQsDHrBpUQslRmIfAoYWdYzs6UlKJtB2XJpTaNSpQ==" 1242 | }, 1243 | "on-finished": { 1244 | "version": "2.4.1", 1245 | "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz", 1246 | "integrity": "sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==", 1247 | "requires": { 1248 | "ee-first": "1.1.1" 1249 | } 1250 | }, 1251 | "p-cancelable": { 1252 | "version": "3.0.0", 1253 | "resolved": "https://registry.npmjs.org/p-cancelable/-/p-cancelable-3.0.0.tgz", 1254 | "integrity": "sha512-mlVgR3PGuzlo0MmTdk4cXqXWlwQDLnONTAg6sm62XkMJEiRxN3GL3SffkYvqwonbkJBcrI7Uvv5Zh9yjvn2iUw==" 1255 | }, 1256 | "parseurl": { 1257 | "version": "1.3.3", 1258 | "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", 1259 | "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==" 1260 | }, 1261 | "path-to-regexp": { 1262 | "version": "0.1.7", 1263 | "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz", 1264 | "integrity": "sha512-5DFkuoqlv1uYQKxy8omFBeJPQcdoE07Kv2sferDCrAq1ohOU+MSDswDIbnx3YAM60qIOnYa53wBhXW0EbMonrQ==" 1265 | }, 1266 | "proxy-addr": { 1267 | "version": "2.0.7", 1268 | "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.7.tgz", 1269 | "integrity": "sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==", 1270 | "requires": { 1271 | "forwarded": "0.2.0", 1272 | "ipaddr.js": "1.9.1" 1273 | } 1274 | }, 1275 | "qs": { 1276 | "version": "6.11.0", 1277 | "resolved": "https://registry.npmjs.org/qs/-/qs-6.11.0.tgz", 1278 | "integrity": "sha512-MvjoMCJwEarSbUYk5O+nmoSzSutSsTwF85zcHPQ9OrlFoZOYIjaqBAJIqIXjptyD5vThxGq52Xu/MaJzRkIk4Q==", 1279 | "requires": { 1280 | "side-channel": "^1.0.4" 1281 | } 1282 | }, 1283 | "quick-lru": { 1284 | "version": "5.1.1", 1285 | "resolved": "https://registry.npmjs.org/quick-lru/-/quick-lru-5.1.1.tgz", 1286 | "integrity": "sha512-WuyALRjWPDGtt/wzJiadO5AXY+8hZ80hVpe6MyivgraREW751X3SbhRvG3eLKOYN+8VEvqLcf3wdnt44Z4S4SA==" 1287 | }, 1288 | "range-parser": { 1289 | "version": "1.2.1", 1290 | "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz", 1291 | "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==" 1292 | }, 1293 | "raw-body": { 1294 | "version": "2.5.1", 1295 | "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.5.1.tgz", 1296 | "integrity": "sha512-qqJBtEyVgS0ZmPGdCFPWJ3FreoqvG4MVQln/kCgF7Olq95IbOp0/BWyMwbdtn4VTvkM8Y7khCQ2Xgk/tcrCXig==", 1297 | "requires": { 1298 | "bytes": "3.1.2", 1299 | "http-errors": "2.0.0", 1300 | "iconv-lite": "0.4.24", 1301 | "unpipe": "1.0.0" 1302 | } 1303 | }, 1304 | "resolve-alpn": { 1305 | "version": "1.2.1", 1306 | "resolved": "https://registry.npmjs.org/resolve-alpn/-/resolve-alpn-1.2.1.tgz", 1307 | "integrity": "sha512-0a1F4l73/ZFZOakJnQ3FvkJ2+gSTQWz/r2KE5OdDY0TxPm5h4GkqkWWfM47T7HsbnOtcJVEF4epCVy6u7Q3K+g==" 1308 | }, 1309 | "responselike": { 1310 | "version": "3.0.0", 1311 | "resolved": "https://registry.npmjs.org/responselike/-/responselike-3.0.0.tgz", 1312 | "integrity": "sha512-40yHxbNcl2+rzXvZuVkrYohathsSJlMTXKryG5y8uciHv1+xDLHQpgjG64JUO9nrEq2jGLH6IZ8BcZyw3wrweg==", 1313 | "requires": { 1314 | "lowercase-keys": "^3.0.0" 1315 | } 1316 | }, 1317 | "safe-buffer": { 1318 | "version": "5.2.1", 1319 | "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", 1320 | "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==" 1321 | }, 1322 | "safer-buffer": { 1323 | "version": "2.1.2", 1324 | "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", 1325 | "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" 1326 | }, 1327 | "send": { 1328 | "version": "0.18.0", 1329 | "resolved": "https://registry.npmjs.org/send/-/send-0.18.0.tgz", 1330 | "integrity": "sha512-qqWzuOjSFOuqPjFe4NOsMLafToQQwBSOEpS+FwEt3A2V3vKubTquT3vmLTQpFgMXp8AlFWFuP1qKaJZOtPpVXg==", 1331 | "requires": { 1332 | "debug": "2.6.9", 1333 | "depd": "2.0.0", 1334 | "destroy": "1.2.0", 1335 | "encodeurl": "~1.0.2", 1336 | "escape-html": "~1.0.3", 1337 | "etag": "~1.8.1", 1338 | "fresh": "0.5.2", 1339 | "http-errors": "2.0.0", 1340 | "mime": "1.6.0", 1341 | "ms": "2.1.3", 1342 | "on-finished": "2.4.1", 1343 | "range-parser": "~1.2.1", 1344 | "statuses": "2.0.1" 1345 | }, 1346 | "dependencies": { 1347 | "ms": { 1348 | "version": "2.1.3", 1349 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", 1350 | "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==" 1351 | } 1352 | } 1353 | }, 1354 | "serve-static": { 1355 | "version": "1.15.0", 1356 | "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.15.0.tgz", 1357 | "integrity": "sha512-XGuRDNjXUijsUL0vl6nSD7cwURuzEgglbOaFuZM9g3kwDXOWVTck0jLzjPzGD+TazWbboZYu52/9/XPdUgne9g==", 1358 | "requires": { 1359 | "encodeurl": "~1.0.2", 1360 | "escape-html": "~1.0.3", 1361 | "parseurl": "~1.3.3", 1362 | "send": "0.18.0" 1363 | } 1364 | }, 1365 | "setprototypeof": { 1366 | "version": "1.2.0", 1367 | "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz", 1368 | "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==" 1369 | }, 1370 | "side-channel": { 1371 | "version": "1.0.4", 1372 | "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.4.tgz", 1373 | "integrity": "sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==", 1374 | "requires": { 1375 | "call-bind": "^1.0.0", 1376 | "get-intrinsic": "^1.0.2", 1377 | "object-inspect": "^1.9.0" 1378 | } 1379 | }, 1380 | "statuses": { 1381 | "version": "2.0.1", 1382 | "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz", 1383 | "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==" 1384 | }, 1385 | "toidentifier": { 1386 | "version": "1.0.1", 1387 | "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz", 1388 | "integrity": "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==" 1389 | }, 1390 | "type-is": { 1391 | "version": "1.6.18", 1392 | "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz", 1393 | "integrity": "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==", 1394 | "requires": { 1395 | "media-typer": "0.3.0", 1396 | "mime-types": "~2.1.24" 1397 | } 1398 | }, 1399 | "unpipe": { 1400 | "version": "1.0.0", 1401 | "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", 1402 | "integrity": "sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==" 1403 | }, 1404 | "utils-merge": { 1405 | "version": "1.0.1", 1406 | "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz", 1407 | "integrity": "sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA==" 1408 | }, 1409 | "vary": { 1410 | "version": "1.1.2", 1411 | "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", 1412 | "integrity": "sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==" 1413 | }, 1414 | "ws": { 1415 | "version": "8.10.0", 1416 | "resolved": "https://registry.npmjs.org/ws/-/ws-8.10.0.tgz", 1417 | "integrity": "sha512-+s49uSmZpvtAsd2h37vIPy1RBusaLawVe8of+GyEPsaJTCMpj/2v8NpeK1SHXjBlQ95lQTmQofOJnFiLoaN3yw==", 1418 | "requires": {} 1419 | } 1420 | } 1421 | } 1422 | -------------------------------------------------------------------------------- /websocket/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "type": "module", 3 | "dependencies": { 4 | "express": "^4.18.2", 5 | "got": "^12.5.2", 6 | "ws": "^8.10.0" 7 | }, 8 | "scripts": { 9 | "start": "node index.js" 10 | } 11 | } 12 | -------------------------------------------------------------------------------- /websocket/public/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 |
4 | 5 | 6 | 54 | 55 | --------------------------------------------------------------------------------