├── .gitignore ├── README.md ├── bot ├── bot.js ├── db.js ├── package-lock.json ├── package.json └── queue.js ├── download_worker ├── download_worker.py └── requirements.txt ├── env.sample ├── file_server ├── db.js ├── package-lock.json ├── package.json └── server.js └── screenshots ├── download_sample.jpeg └── youtube-downloader-bot-arch-diagram.jpeg /.gitignore: -------------------------------------------------------------------------------- 1 | node_modules/ 2 | .env 3 | downloads/ -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | 2 | # Youtube Downloader Bot 3 | 4 | ### High Level Architecture Diagram 5 | ![App Screenshot](https://github.com/jayesh-saini/youtube-downloader-bot/blob/main/screenshots/youtube-downloader-bot-arch-diagram.jpeg?raw=true) 6 | 7 | ### Bot Screenshot 8 | ![App Screenshot](https://github.com/jayesh-saini/youtube-downloader-bot/blob/main/screenshots/download_sample.jpeg?raw=true) 9 | 10 | ## Introduction: 11 | 12 | This telegram bot streamlines the retrieval and management of YouTube videos. It simplifies the process by allowing users to send the video URL to the bot, which then promptly responds with the YouTube video itself, its download URL, or both, as per user preference. 13 | 14 | ## Functional Modules: 15 | 16 | The bot comprises three primary modules: 17 | 18 | #### 1. Telegram Bot: 19 | - This component, built using Node.js and leveraging the "node-telegram-bot-api" module, serves as the interface for user interaction. 20 | - Upon receipt of a video link, the Telegram Bot module validates it and enqueues the link for processing. This queuing mechanism ensures uninterrupted service by preventing blockages from concurrent requests. 21 | - Upon completion of video processing, the module publishes an event that triggers the transmission of the video file back to the user. 22 | - Notably, for video files exceeding 50 MB in size, direct transmission via Telegram is prohibited. In such cases, users are provided with a download link to access the video content. 23 | 24 | #### 2. Download Worker: 25 | - This essential module is responsible for downloading YouTube videos. Operating in tandem with the queuing system, it retrieves video URLs from the queue and initiates download processes sequentially. 26 | - The download worker's scalability is adjustable to accommodate varying request volumes. Multiple workers can be deployed as needed to handle increased demand efficiently. 27 | - Upon successful completion of a download, the module logs relevant metadata into a SQL database and triggers an event to inform the bot module. 28 | 29 | #### 3. File Server: 30 | - Facilitating internet-based access to video files, the file server employs ngrok for seamless file delivery. 31 | - Incoming requests are processed by the server, which verifies the video ID from URL parameters in the database. Upon validation, the corresponding video file is dispatched to the user for downloading. 32 | 33 | 34 | ### Usage Instructions: 35 | To utilize our Telegram bot, follow these simple steps: 36 | 37 | 1. Open Telegram and search for "@youtube_downloader_19_bot". 38 | 2. Send "video " to download the video. 39 | 3. Alternatively, send "audio " to download the audio. 40 | 41 | ### Deployment Guidelines: 42 | 43 | For users interested in deploying their own instance of the bot, the following prerequisites and setup steps are required: 44 | 45 | #### 1. Prerequisites: 46 | - Node.js 47 | - Python3 48 | - Redis 49 | - MySQL 50 | - Telegram account 51 | - Ngrok account 52 | 53 | #### 2. Bot Configuration: 54 | - Create a bot on Telegram and obtain the bot access token. (Check here if you are not sure how to do it: https://smartbotsland.com/create-edit-bot/get-token-botfather-telegram/) 55 | - Sign up for an account on Ngrok and obtain the auth token. (Dashboard > Getting Started > Your Authtoken) 56 | 57 | #### 3. MySQL Database Setup: 58 | - Login to mysql 59 | ```bash 60 | mysql -u root -p 61 | ``` 62 | - Create a database 63 | ```bash 64 | CREATE DATABASE DB-NAME 65 | ``` 66 | - Create user 67 | ```bash 68 | CREATE USER 'username'@'localhost' IDENTIFIED WITH mysql_native_password BY 'password'; 69 | ``` 70 | - Grant access to this user. 71 | ```bash 72 | GRANT ALL PRIVILEGES ON DB-NAME.* TO 'username'@'localhost'; 73 | ``` 74 | - Flush Privileges 75 | ```bash 76 | FLUSH PRIVILEGES; 77 | ``` 78 | - Create table 79 | ```bash 80 | CREATE TABLE big_file_urls ( 81 | id int NOT NULL AUTO_INCREMENT, 82 | chat_id varchar(100) DEFAULT NULL, 83 | uuid varchar(500) DEFAULT NULL, 84 | file_name varchar(500) DEFAULT NULL, 85 | name varchar(100) DEFAULT NULL, 86 | username varchar(100) DEFAULT NULL, 87 | download_time timestamp NULL DEFAULT CURRENT_TIMESTAMP, 88 | PRIMARY KEY (id) 89 | ); 90 | ``` 91 | 92 | 93 | #### 4. Module Setup: 94 | - Navigate to the respective directories ("bot" and "file_server") and install dependencies 95 | - Bot Module 96 | ```bash 97 | cd bot/ 98 | npm install 99 | ``` 100 | - File Server 101 | ```bash 102 | cd file_server/ 103 | npm install 104 | ``` 105 | 106 | - For the download worker module, enter the "download_worker" directory and install dependencies 107 | ```bash 108 | pip3 install -r requirements.txt 109 | ``` 110 | 111 | Finally, initiate the modules by running the provided commands in separate terminals, ensuring seamless operation of your bot instance. 112 | - Bot 113 | ```bash 114 | node bot/bot.js 115 | ``` 116 | - Download Worker 117 | ```bash 118 | python3 download_worker/download_worker.py 119 | ``` 120 | - File Server 121 | ```bash 122 | node file_serve/server.js 123 | ``` 124 | 125 | Your bot is ready to use now. Send the youtube video urls to the bot you had created using bot father. -------------------------------------------------------------------------------- /bot/bot.js: -------------------------------------------------------------------------------- 1 | require('dotenv').config() 2 | const TelegramBot = require('node-telegram-bot-api') 3 | const { sql } = require('./db') 4 | const fs = require("fs") 5 | 6 | const queue = require('./queue') 7 | 8 | const token = process.env.TELEGRAM_BOT_TOKEN 9 | 10 | const bot = new TelegramBot(token, { polling: true }); 11 | 12 | var NGROK_BASE_URL = null 13 | 14 | setTimeout(async () => { 15 | console.log(`Setting NGROK Base URL from cache!`) 16 | NGROK_BASE_URL = await queue.cache.get("NGROK_BASE_URL") 17 | }, 3000); 18 | 19 | const isValidURL = (video_url) => { 20 | if (video_url.startsWith("https://youtube.com") || video_url.startsWith("https://youtu.be") || video_url.startsWith("https://www.youtube.com")) { 21 | return true 22 | } 23 | return false 24 | } 25 | 26 | queue.subscriber.subscribe('download_complete', (video_id) => { 27 | console.log(video_id) 28 | sql.query(`SELECT * FROM big_file_urls WHERE uuid = '${video_id}'`, (error, data) => { 29 | if (error) { 30 | console.log(error) 31 | } else { 32 | const file_size = fs.statSync(data[0].file_name).size 33 | const caption = `NOTE: The provided url is temporary, and may expire any time.\nPlease download the file asap!\n\n${NGROK_BASE_URL}/video?video_id=${data[0].uuid}` 34 | if (file_size > 50000000) { 35 | // Send URL! 36 | bot.sendMessage(+data[0].chat_id, caption) 37 | } else { 38 | // Send file! 39 | bot.sendDocument(+data[0].chat_id, data[0].file_name, { caption }) 40 | } 41 | } 42 | }) 43 | }) 44 | 45 | queue.subscriber.subscribe('NGROK_BASE_URL_UPDATED', (updated_base_url) => { 46 | console.log(`NGROK Base URL Updated!`) 47 | NGROK_BASE_URL = updated_base_url 48 | }) 49 | 50 | bot.on('message', async (msg) => { 51 | const chatId = msg.chat.id 52 | const messageText = msg.text 53 | 54 | const { first_name = "f_name", last_name = "l_name", username = "u_name" } = msg.from 55 | 56 | console.log(chatId, messageText); 57 | 58 | if (messageText === '/start') { 59 | bot.sendMessage(chatId, 'Welcome to the bot!'); 60 | } else if (isValidURL(messageText)) { 61 | bot.sendMessage(chatId, 'Your video would be downloaded soon!') 62 | if (queue != null) { 63 | await queue.push(JSON.stringify({ 64 | video_url: messageText, 65 | name: `${first_name} ${last_name}`, 66 | username, 67 | chat_id: chatId 68 | })) 69 | } 70 | } else { 71 | bot.sendMessage(chatId, "Please send a valid URl!") 72 | } 73 | }) -------------------------------------------------------------------------------- /bot/db.js: -------------------------------------------------------------------------------- 1 | const mysql = require('mysql') 2 | 3 | // ----------- DB -------------- 4 | const sql = mysql.createPool({ 5 | host: process.env.DB_HOSTNAME, 6 | user: process.env.DB_USERNAME, 7 | password: process.env.DB_PASSWORD, 8 | database: process.env.DB_DATABASE, 9 | debug: false 10 | }) 11 | 12 | sql.getConnection((err, connection) => { 13 | if (err) { 14 | console.log(err) 15 | process.exit(-1) 16 | } else { 17 | console.log('Database connected successfully'); 18 | connection.release(); 19 | } 20 | }) 21 | 22 | module.exports = { sql } -------------------------------------------------------------------------------- /bot/package-lock.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "telegram-downloader-bot", 3 | "version": "1.0.0", 4 | "lockfileVersion": 3, 5 | "requires": true, 6 | "packages": { 7 | "": { 8 | "name": "telegram-downloader-bot", 9 | "version": "1.0.0", 10 | "license": "ISC", 11 | "dependencies": { 12 | "dotenv": "^16.4.5", 13 | "mysql": "^2.18.1", 14 | "node-telegram-bot-api": "^0.65.1", 15 | "redis": "^4.6.13" 16 | } 17 | }, 18 | "node_modules/@cypress/request": { 19 | "version": "3.0.1", 20 | "resolved": "https://registry.npmjs.org/@cypress/request/-/request-3.0.1.tgz", 21 | "integrity": "sha512-TWivJlJi8ZDx2wGOw1dbLuHJKUYX7bWySw377nlnGOW3hP9/MUKIsEdXT/YngWxVdgNCHRBmFlBipE+5/2ZZlQ==", 22 | "dependencies": { 23 | "aws-sign2": "~0.7.0", 24 | "aws4": "^1.8.0", 25 | "caseless": "~0.12.0", 26 | "combined-stream": "~1.0.6", 27 | "extend": "~3.0.2", 28 | "forever-agent": "~0.6.1", 29 | "form-data": "~2.3.2", 30 | "http-signature": "~1.3.6", 31 | "is-typedarray": "~1.0.0", 32 | "isstream": "~0.1.2", 33 | "json-stringify-safe": "~5.0.1", 34 | "mime-types": "~2.1.19", 35 | "performance-now": "^2.1.0", 36 | "qs": "6.10.4", 37 | "safe-buffer": "^5.1.2", 38 | "tough-cookie": "^4.1.3", 39 | "tunnel-agent": "^0.6.0", 40 | "uuid": "^8.3.2" 41 | }, 42 | "engines": { 43 | "node": ">= 6" 44 | } 45 | }, 46 | "node_modules/@cypress/request-promise": { 47 | "version": "5.0.0", 48 | "resolved": "https://registry.npmjs.org/@cypress/request-promise/-/request-promise-5.0.0.tgz", 49 | "integrity": "sha512-eKdYVpa9cBEw2kTBlHeu1PP16Blwtum6QHg/u9s/MoHkZfuo1pRGka1VlUHXF5kdew82BvOJVVGk0x8X0nbp+w==", 50 | "dependencies": { 51 | "bluebird": "^3.5.0", 52 | "request-promise-core": "1.1.3", 53 | "stealthy-require": "^1.1.1", 54 | "tough-cookie": "^4.1.3" 55 | }, 56 | "engines": { 57 | "node": ">=0.10.0" 58 | }, 59 | "peerDependencies": { 60 | "@cypress/request": "^3.0.0" 61 | } 62 | }, 63 | "node_modules/@redis/bloom": { 64 | "version": "1.2.0", 65 | "resolved": "https://registry.npmjs.org/@redis/bloom/-/bloom-1.2.0.tgz", 66 | "integrity": "sha512-HG2DFjYKbpNmVXsa0keLHp/3leGJz1mjh09f2RLGGLQZzSHpkmZWuwJbAvo3QcRY8p80m5+ZdXZdYOSBLlp7Cg==", 67 | "peerDependencies": { 68 | "@redis/client": "^1.0.0" 69 | } 70 | }, 71 | "node_modules/@redis/client": { 72 | "version": "1.5.14", 73 | "resolved": "https://registry.npmjs.org/@redis/client/-/client-1.5.14.tgz", 74 | "integrity": "sha512-YGn0GqsRBFUQxklhY7v562VMOP0DcmlrHHs3IV1mFE3cbxe31IITUkqhBcIhVSI/2JqtWAJXg5mjV4aU+zD0HA==", 75 | "dependencies": { 76 | "cluster-key-slot": "1.1.2", 77 | "generic-pool": "3.9.0", 78 | "yallist": "4.0.0" 79 | }, 80 | "engines": { 81 | "node": ">=14" 82 | } 83 | }, 84 | "node_modules/@redis/graph": { 85 | "version": "1.1.1", 86 | "resolved": "https://registry.npmjs.org/@redis/graph/-/graph-1.1.1.tgz", 87 | "integrity": "sha512-FEMTcTHZozZciLRl6GiiIB4zGm5z5F3F6a6FZCyrfxdKOhFlGkiAqlexWMBzCi4DcRoyiOsuLfW+cjlGWyExOw==", 88 | "peerDependencies": { 89 | "@redis/client": "^1.0.0" 90 | } 91 | }, 92 | "node_modules/@redis/json": { 93 | "version": "1.0.6", 94 | "resolved": "https://registry.npmjs.org/@redis/json/-/json-1.0.6.tgz", 95 | "integrity": "sha512-rcZO3bfQbm2zPRpqo82XbW8zg4G/w4W3tI7X8Mqleq9goQjAGLL7q/1n1ZX4dXEAmORVZ4s1+uKLaUOg7LrUhw==", 96 | "peerDependencies": { 97 | "@redis/client": "^1.0.0" 98 | } 99 | }, 100 | "node_modules/@redis/search": { 101 | "version": "1.1.6", 102 | "resolved": "https://registry.npmjs.org/@redis/search/-/search-1.1.6.tgz", 103 | "integrity": "sha512-mZXCxbTYKBQ3M2lZnEddwEAks0Kc7nauire8q20oA0oA/LoA+E/b5Y5KZn232ztPb1FkIGqo12vh3Lf+Vw5iTw==", 104 | "peerDependencies": { 105 | "@redis/client": "^1.0.0" 106 | } 107 | }, 108 | "node_modules/@redis/time-series": { 109 | "version": "1.0.5", 110 | "resolved": "https://registry.npmjs.org/@redis/time-series/-/time-series-1.0.5.tgz", 111 | "integrity": "sha512-IFjIgTusQym2B5IZJG3XKr5llka7ey84fw/NOYqESP5WUfQs9zz1ww/9+qoz4ka/S6KcGBodzlCeZ5UImKbscg==", 112 | "peerDependencies": { 113 | "@redis/client": "^1.0.0" 114 | } 115 | }, 116 | "node_modules/ajv": { 117 | "version": "6.12.6", 118 | "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", 119 | "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", 120 | "peer": true, 121 | "dependencies": { 122 | "fast-deep-equal": "^3.1.1", 123 | "fast-json-stable-stringify": "^2.0.0", 124 | "json-schema-traverse": "^0.4.1", 125 | "uri-js": "^4.2.2" 126 | }, 127 | "funding": { 128 | "type": "github", 129 | "url": "https://github.com/sponsors/epoberezkin" 130 | } 131 | }, 132 | "node_modules/array-buffer-byte-length": { 133 | "version": "1.0.1", 134 | "resolved": "https://registry.npmjs.org/array-buffer-byte-length/-/array-buffer-byte-length-1.0.1.tgz", 135 | "integrity": "sha512-ahC5W1xgou+KTXix4sAO8Ki12Q+jf4i0+tmk3sC+zgcynshkHxzpXdImBehiUYKKKDwvfFiJl1tZt6ewscS1Mg==", 136 | "dependencies": { 137 | "call-bind": "^1.0.5", 138 | "is-array-buffer": "^3.0.4" 139 | }, 140 | "engines": { 141 | "node": ">= 0.4" 142 | }, 143 | "funding": { 144 | "url": "https://github.com/sponsors/ljharb" 145 | } 146 | }, 147 | "node_modules/array.prototype.findindex": { 148 | "version": "2.2.3", 149 | "resolved": "https://registry.npmjs.org/array.prototype.findindex/-/array.prototype.findindex-2.2.3.tgz", 150 | "integrity": "sha512-Saz3pStJ2X5bg27GTWWLyhJrcwbMVLsnbho2zUVQFW2Pgrh0mSKKvAeZr6BPww7E1AygK33cX7w0W1YERC1RHA==", 151 | "dependencies": { 152 | "call-bind": "^1.0.7", 153 | "define-properties": "^1.2.1", 154 | "es-abstract": "^1.23.0", 155 | "es-object-atoms": "^1.0.0", 156 | "es-shim-unscopables": "^1.0.2" 157 | } 158 | }, 159 | "node_modules/arraybuffer.prototype.slice": { 160 | "version": "1.0.3", 161 | "resolved": "https://registry.npmjs.org/arraybuffer.prototype.slice/-/arraybuffer.prototype.slice-1.0.3.tgz", 162 | "integrity": "sha512-bMxMKAjg13EBSVscxTaYA4mRc5t1UAXa2kXiGTNfZ079HIWXEkKmkgFrh/nJqamaLSrXO5H4WFFkPEaLJWbs3A==", 163 | "dependencies": { 164 | "array-buffer-byte-length": "^1.0.1", 165 | "call-bind": "^1.0.5", 166 | "define-properties": "^1.2.1", 167 | "es-abstract": "^1.22.3", 168 | "es-errors": "^1.2.1", 169 | "get-intrinsic": "^1.2.3", 170 | "is-array-buffer": "^3.0.4", 171 | "is-shared-array-buffer": "^1.0.2" 172 | }, 173 | "engines": { 174 | "node": ">= 0.4" 175 | }, 176 | "funding": { 177 | "url": "https://github.com/sponsors/ljharb" 178 | } 179 | }, 180 | "node_modules/asn1": { 181 | "version": "0.2.6", 182 | "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.6.tgz", 183 | "integrity": "sha512-ix/FxPn0MDjeyJ7i/yoHGFt/EX6LyNbxSEhPPXODPL+KB0VPk86UYfL0lMdy+KCnv+fmvIzySwaK5COwqVbWTQ==", 184 | "dependencies": { 185 | "safer-buffer": "~2.1.0" 186 | } 187 | }, 188 | "node_modules/assert-plus": { 189 | "version": "1.0.0", 190 | "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", 191 | "integrity": "sha512-NfJ4UzBCcQGLDlQq7nHxH+tv3kyZ0hHQqF5BO6J7tNJeP5do1llPr8dZ8zHonfhAu0PHAdMkSo+8o0wxg9lZWw==", 192 | "engines": { 193 | "node": ">=0.8" 194 | } 195 | }, 196 | "node_modules/asynckit": { 197 | "version": "0.4.0", 198 | "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", 199 | "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==" 200 | }, 201 | "node_modules/available-typed-arrays": { 202 | "version": "1.0.7", 203 | "resolved": "https://registry.npmjs.org/available-typed-arrays/-/available-typed-arrays-1.0.7.tgz", 204 | "integrity": "sha512-wvUjBtSGN7+7SjNpq/9M2Tg350UZD3q62IFZLbRAR1bSMlCo1ZaeW+BJ+D090e4hIIZLBcTDWe4Mh4jvUDajzQ==", 205 | "dependencies": { 206 | "possible-typed-array-names": "^1.0.0" 207 | }, 208 | "engines": { 209 | "node": ">= 0.4" 210 | }, 211 | "funding": { 212 | "url": "https://github.com/sponsors/ljharb" 213 | } 214 | }, 215 | "node_modules/aws-sign2": { 216 | "version": "0.7.0", 217 | "resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.7.0.tgz", 218 | "integrity": "sha512-08kcGqnYf/YmjoRhfxyu+CLxBjUtHLXLXX/vUfx9l2LYzG3c1m61nrpyFUZI6zeS+Li/wWMMidD9KgrqtGq3mA==", 219 | "engines": { 220 | "node": "*" 221 | } 222 | }, 223 | "node_modules/aws4": { 224 | "version": "1.12.0", 225 | "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.12.0.tgz", 226 | "integrity": "sha512-NmWvPnx0F1SfrQbYwOi7OeaNGokp9XhzNioJ/CSBs8Qa4vxug81mhJEAVZwxXuBmYB5KDRfMq/F3RR0BIU7sWg==" 227 | }, 228 | "node_modules/bcrypt-pbkdf": { 229 | "version": "1.0.2", 230 | "resolved": "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz", 231 | "integrity": "sha512-qeFIXtP4MSoi6NLqO12WfqARWWuCKi2Rn/9hJLEmtB5yTNr9DqFWkJRCf2qShWzPeAMRnOgCrq0sg/KLv5ES9w==", 232 | "dependencies": { 233 | "tweetnacl": "^0.14.3" 234 | } 235 | }, 236 | "node_modules/bignumber.js": { 237 | "version": "9.0.0", 238 | "resolved": "https://registry.npmjs.org/bignumber.js/-/bignumber.js-9.0.0.tgz", 239 | "integrity": "sha512-t/OYhhJ2SD+YGBQcjY8GzzDHEk9f3nerxjtfa6tlMXfe7frs/WozhvCNoGvpM0P3bNf3Gq5ZRMlGr5f3r4/N8A==", 240 | "engines": { 241 | "node": "*" 242 | } 243 | }, 244 | "node_modules/bl": { 245 | "version": "1.2.3", 246 | "resolved": "https://registry.npmjs.org/bl/-/bl-1.2.3.tgz", 247 | "integrity": "sha512-pvcNpa0UU69UT341rO6AYy4FVAIkUHuZXRIWbq+zHnsVcRzDDjIAhGuuYoi0d//cwIwtt4pkpKycWEfjdV+vww==", 248 | "dependencies": { 249 | "readable-stream": "^2.3.5", 250 | "safe-buffer": "^5.1.1" 251 | } 252 | }, 253 | "node_modules/bluebird": { 254 | "version": "3.7.2", 255 | "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.7.2.tgz", 256 | "integrity": "sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg==" 257 | }, 258 | "node_modules/call-bind": { 259 | "version": "1.0.7", 260 | "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.7.tgz", 261 | "integrity": "sha512-GHTSNSYICQ7scH7sZ+M2rFopRoLh8t2bLSW6BbgrtLsahOIB5iyAVJf9GjWK3cYTDaMj4XdBpM1cA6pIS0Kv2w==", 262 | "dependencies": { 263 | "es-define-property": "^1.0.0", 264 | "es-errors": "^1.3.0", 265 | "function-bind": "^1.1.2", 266 | "get-intrinsic": "^1.2.4", 267 | "set-function-length": "^1.2.1" 268 | }, 269 | "engines": { 270 | "node": ">= 0.4" 271 | }, 272 | "funding": { 273 | "url": "https://github.com/sponsors/ljharb" 274 | } 275 | }, 276 | "node_modules/caseless": { 277 | "version": "0.12.0", 278 | "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz", 279 | "integrity": "sha512-4tYFyifaFfGacoiObjJegolkwSU4xQNGbVgUiNYVUxbQ2x2lUsFvY4hVgVzGiIe6WLOPqycWXA40l+PWsxthUw==" 280 | }, 281 | "node_modules/cluster-key-slot": { 282 | "version": "1.1.2", 283 | "resolved": "https://registry.npmjs.org/cluster-key-slot/-/cluster-key-slot-1.1.2.tgz", 284 | "integrity": "sha512-RMr0FhtfXemyinomL4hrWcYJxmX6deFdCxpJzhDttxgO1+bcCnkk+9drydLVDmAMG7NE6aN/fl4F7ucU/90gAA==", 285 | "engines": { 286 | "node": ">=0.10.0" 287 | } 288 | }, 289 | "node_modules/combined-stream": { 290 | "version": "1.0.8", 291 | "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", 292 | "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", 293 | "dependencies": { 294 | "delayed-stream": "~1.0.0" 295 | }, 296 | "engines": { 297 | "node": ">= 0.8" 298 | } 299 | }, 300 | "node_modules/core-util-is": { 301 | "version": "1.0.3", 302 | "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.3.tgz", 303 | "integrity": "sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==" 304 | }, 305 | "node_modules/dashdash": { 306 | "version": "1.14.1", 307 | "resolved": "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz", 308 | "integrity": "sha512-jRFi8UDGo6j+odZiEpjazZaWqEal3w/basFjQHQEwVtZJGDpxbH1MeYluwCS8Xq5wmLJooDlMgvVarmWfGM44g==", 309 | "dependencies": { 310 | "assert-plus": "^1.0.0" 311 | }, 312 | "engines": { 313 | "node": ">=0.10" 314 | } 315 | }, 316 | "node_modules/data-view-buffer": { 317 | "version": "1.0.1", 318 | "resolved": "https://registry.npmjs.org/data-view-buffer/-/data-view-buffer-1.0.1.tgz", 319 | "integrity": "sha512-0lht7OugA5x3iJLOWFhWK/5ehONdprk0ISXqVFn/NFrDu+cuc8iADFrGQz5BnRK7LLU3JmkbXSxaqX+/mXYtUA==", 320 | "dependencies": { 321 | "call-bind": "^1.0.6", 322 | "es-errors": "^1.3.0", 323 | "is-data-view": "^1.0.1" 324 | }, 325 | "engines": { 326 | "node": ">= 0.4" 327 | }, 328 | "funding": { 329 | "url": "https://github.com/sponsors/ljharb" 330 | } 331 | }, 332 | "node_modules/data-view-byte-length": { 333 | "version": "1.0.1", 334 | "resolved": "https://registry.npmjs.org/data-view-byte-length/-/data-view-byte-length-1.0.1.tgz", 335 | "integrity": "sha512-4J7wRJD3ABAzr8wP+OcIcqq2dlUKp4DVflx++hs5h5ZKydWMI6/D/fAot+yh6g2tHh8fLFTvNOaVN357NvSrOQ==", 336 | "dependencies": { 337 | "call-bind": "^1.0.7", 338 | "es-errors": "^1.3.0", 339 | "is-data-view": "^1.0.1" 340 | }, 341 | "engines": { 342 | "node": ">= 0.4" 343 | }, 344 | "funding": { 345 | "url": "https://github.com/sponsors/ljharb" 346 | } 347 | }, 348 | "node_modules/data-view-byte-offset": { 349 | "version": "1.0.0", 350 | "resolved": "https://registry.npmjs.org/data-view-byte-offset/-/data-view-byte-offset-1.0.0.tgz", 351 | "integrity": "sha512-t/Ygsytq+R995EJ5PZlD4Cu56sWa8InXySaViRzw9apusqsOO2bQP+SbYzAhR0pFKoB+43lYy8rWban9JSuXnA==", 352 | "dependencies": { 353 | "call-bind": "^1.0.6", 354 | "es-errors": "^1.3.0", 355 | "is-data-view": "^1.0.1" 356 | }, 357 | "engines": { 358 | "node": ">= 0.4" 359 | }, 360 | "funding": { 361 | "url": "https://github.com/sponsors/ljharb" 362 | } 363 | }, 364 | "node_modules/debug": { 365 | "version": "3.2.7", 366 | "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", 367 | "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", 368 | "dependencies": { 369 | "ms": "^2.1.1" 370 | } 371 | }, 372 | "node_modules/define-data-property": { 373 | "version": "1.1.4", 374 | "resolved": "https://registry.npmjs.org/define-data-property/-/define-data-property-1.1.4.tgz", 375 | "integrity": "sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==", 376 | "dependencies": { 377 | "es-define-property": "^1.0.0", 378 | "es-errors": "^1.3.0", 379 | "gopd": "^1.0.1" 380 | }, 381 | "engines": { 382 | "node": ">= 0.4" 383 | }, 384 | "funding": { 385 | "url": "https://github.com/sponsors/ljharb" 386 | } 387 | }, 388 | "node_modules/define-properties": { 389 | "version": "1.2.1", 390 | "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.2.1.tgz", 391 | "integrity": "sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg==", 392 | "dependencies": { 393 | "define-data-property": "^1.0.1", 394 | "has-property-descriptors": "^1.0.0", 395 | "object-keys": "^1.1.1" 396 | }, 397 | "engines": { 398 | "node": ">= 0.4" 399 | }, 400 | "funding": { 401 | "url": "https://github.com/sponsors/ljharb" 402 | } 403 | }, 404 | "node_modules/delayed-stream": { 405 | "version": "1.0.0", 406 | "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", 407 | "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==", 408 | "engines": { 409 | "node": ">=0.4.0" 410 | } 411 | }, 412 | "node_modules/dotenv": { 413 | "version": "16.4.5", 414 | "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-16.4.5.tgz", 415 | "integrity": "sha512-ZmdL2rui+eB2YwhsWzjInR8LldtZHGDoQ1ugH85ppHKwpUHL7j7rN0Ti9NCnGiQbhaZ11FpR+7ao1dNsmduNUg==", 416 | "engines": { 417 | "node": ">=12" 418 | }, 419 | "funding": { 420 | "url": "https://dotenvx.com" 421 | } 422 | }, 423 | "node_modules/ecc-jsbn": { 424 | "version": "0.1.2", 425 | "resolved": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz", 426 | "integrity": "sha512-eh9O+hwRHNbG4BLTjEl3nw044CkGm5X6LoaCf7LPp7UU8Qrt47JYNi6nPX8xjW97TKGKm1ouctg0QSpZe9qrnw==", 427 | "dependencies": { 428 | "jsbn": "~0.1.0", 429 | "safer-buffer": "^2.1.0" 430 | } 431 | }, 432 | "node_modules/end-of-stream": { 433 | "version": "1.4.4", 434 | "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.4.tgz", 435 | "integrity": "sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==", 436 | "dependencies": { 437 | "once": "^1.4.0" 438 | } 439 | }, 440 | "node_modules/es-abstract": { 441 | "version": "1.23.3", 442 | "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.23.3.tgz", 443 | "integrity": "sha512-e+HfNH61Bj1X9/jLc5v1owaLYuHdeHHSQlkhCBiTK8rBvKaULl/beGMxwrMXjpYrv4pz22BlY570vVePA2ho4A==", 444 | "dependencies": { 445 | "array-buffer-byte-length": "^1.0.1", 446 | "arraybuffer.prototype.slice": "^1.0.3", 447 | "available-typed-arrays": "^1.0.7", 448 | "call-bind": "^1.0.7", 449 | "data-view-buffer": "^1.0.1", 450 | "data-view-byte-length": "^1.0.1", 451 | "data-view-byte-offset": "^1.0.0", 452 | "es-define-property": "^1.0.0", 453 | "es-errors": "^1.3.0", 454 | "es-object-atoms": "^1.0.0", 455 | "es-set-tostringtag": "^2.0.3", 456 | "es-to-primitive": "^1.2.1", 457 | "function.prototype.name": "^1.1.6", 458 | "get-intrinsic": "^1.2.4", 459 | "get-symbol-description": "^1.0.2", 460 | "globalthis": "^1.0.3", 461 | "gopd": "^1.0.1", 462 | "has-property-descriptors": "^1.0.2", 463 | "has-proto": "^1.0.3", 464 | "has-symbols": "^1.0.3", 465 | "hasown": "^2.0.2", 466 | "internal-slot": "^1.0.7", 467 | "is-array-buffer": "^3.0.4", 468 | "is-callable": "^1.2.7", 469 | "is-data-view": "^1.0.1", 470 | "is-negative-zero": "^2.0.3", 471 | "is-regex": "^1.1.4", 472 | "is-shared-array-buffer": "^1.0.3", 473 | "is-string": "^1.0.7", 474 | "is-typed-array": "^1.1.13", 475 | "is-weakref": "^1.0.2", 476 | "object-inspect": "^1.13.1", 477 | "object-keys": "^1.1.1", 478 | "object.assign": "^4.1.5", 479 | "regexp.prototype.flags": "^1.5.2", 480 | "safe-array-concat": "^1.1.2", 481 | "safe-regex-test": "^1.0.3", 482 | "string.prototype.trim": "^1.2.9", 483 | "string.prototype.trimend": "^1.0.8", 484 | "string.prototype.trimstart": "^1.0.8", 485 | "typed-array-buffer": "^1.0.2", 486 | "typed-array-byte-length": "^1.0.1", 487 | "typed-array-byte-offset": "^1.0.2", 488 | "typed-array-length": "^1.0.6", 489 | "unbox-primitive": "^1.0.2", 490 | "which-typed-array": "^1.1.15" 491 | }, 492 | "engines": { 493 | "node": ">= 0.4" 494 | }, 495 | "funding": { 496 | "url": "https://github.com/sponsors/ljharb" 497 | } 498 | }, 499 | "node_modules/es-define-property": { 500 | "version": "1.0.0", 501 | "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.0.tgz", 502 | "integrity": "sha512-jxayLKShrEqqzJ0eumQbVhTYQM27CfT1T35+gCgDFoL82JLsXqTJ76zv6A0YLOgEnLUMvLzsDsGIrl8NFpT2gQ==", 503 | "dependencies": { 504 | "get-intrinsic": "^1.2.4" 505 | }, 506 | "engines": { 507 | "node": ">= 0.4" 508 | } 509 | }, 510 | "node_modules/es-errors": { 511 | "version": "1.3.0", 512 | "resolved": "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz", 513 | "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==", 514 | "engines": { 515 | "node": ">= 0.4" 516 | } 517 | }, 518 | "node_modules/es-object-atoms": { 519 | "version": "1.0.0", 520 | "resolved": "https://registry.npmjs.org/es-object-atoms/-/es-object-atoms-1.0.0.tgz", 521 | "integrity": "sha512-MZ4iQ6JwHOBQjahnjwaC1ZtIBH+2ohjamzAO3oaHcXYup7qxjF2fixyH+Q71voWHeOkI2q/TnJao/KfXYIZWbw==", 522 | "dependencies": { 523 | "es-errors": "^1.3.0" 524 | }, 525 | "engines": { 526 | "node": ">= 0.4" 527 | } 528 | }, 529 | "node_modules/es-set-tostringtag": { 530 | "version": "2.0.3", 531 | "resolved": "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.0.3.tgz", 532 | "integrity": "sha512-3T8uNMC3OQTHkFUsFq8r/BwAXLHvU/9O9mE0fBc/MY5iq/8H7ncvO947LmYA6ldWw9Uh8Yhf25zu6n7nML5QWQ==", 533 | "dependencies": { 534 | "get-intrinsic": "^1.2.4", 535 | "has-tostringtag": "^1.0.2", 536 | "hasown": "^2.0.1" 537 | }, 538 | "engines": { 539 | "node": ">= 0.4" 540 | } 541 | }, 542 | "node_modules/es-shim-unscopables": { 543 | "version": "1.0.2", 544 | "resolved": "https://registry.npmjs.org/es-shim-unscopables/-/es-shim-unscopables-1.0.2.tgz", 545 | "integrity": "sha512-J3yBRXCzDu4ULnQwxyToo/OjdMx6akgVC7K6few0a7F/0wLtmKKN7I73AH5T2836UuXRqN7Qg+IIUw/+YJksRw==", 546 | "dependencies": { 547 | "hasown": "^2.0.0" 548 | } 549 | }, 550 | "node_modules/es-to-primitive": { 551 | "version": "1.2.1", 552 | "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.1.tgz", 553 | "integrity": "sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==", 554 | "dependencies": { 555 | "is-callable": "^1.1.4", 556 | "is-date-object": "^1.0.1", 557 | "is-symbol": "^1.0.2" 558 | }, 559 | "engines": { 560 | "node": ">= 0.4" 561 | }, 562 | "funding": { 563 | "url": "https://github.com/sponsors/ljharb" 564 | } 565 | }, 566 | "node_modules/eventemitter3": { 567 | "version": "3.1.2", 568 | "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-3.1.2.tgz", 569 | "integrity": "sha512-tvtQIeLVHjDkJYnzf2dgVMxfuSGJeM/7UCG17TT4EumTfNtF+0nebF/4zWOIkCreAbtNqhGEboB6BWrwqNaw4Q==" 570 | }, 571 | "node_modules/extend": { 572 | "version": "3.0.2", 573 | "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", 574 | "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==" 575 | }, 576 | "node_modules/extsprintf": { 577 | "version": "1.3.0", 578 | "resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.3.0.tgz", 579 | "integrity": "sha512-11Ndz7Nv+mvAC1j0ktTa7fAb0vLyGGX+rMHNBYQviQDGU0Hw7lhctJANqbPhu9nV9/izT/IntTgZ7Im/9LJs9g==", 580 | "engines": [ 581 | "node >=0.6.0" 582 | ] 583 | }, 584 | "node_modules/fast-deep-equal": { 585 | "version": "3.1.3", 586 | "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", 587 | "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", 588 | "peer": true 589 | }, 590 | "node_modules/fast-json-stable-stringify": { 591 | "version": "2.1.0", 592 | "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", 593 | "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", 594 | "peer": true 595 | }, 596 | "node_modules/file-type": { 597 | "version": "3.9.0", 598 | "resolved": "https://registry.npmjs.org/file-type/-/file-type-3.9.0.tgz", 599 | "integrity": "sha512-RLoqTXE8/vPmMuTI88DAzhMYC99I8BWv7zYP4A1puo5HIjEJ5EX48ighy4ZyKMG9EDXxBgW6e++cn7d1xuFghA==", 600 | "engines": { 601 | "node": ">=0.10.0" 602 | } 603 | }, 604 | "node_modules/for-each": { 605 | "version": "0.3.3", 606 | "resolved": "https://registry.npmjs.org/for-each/-/for-each-0.3.3.tgz", 607 | "integrity": "sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw==", 608 | "dependencies": { 609 | "is-callable": "^1.1.3" 610 | } 611 | }, 612 | "node_modules/forever-agent": { 613 | "version": "0.6.1", 614 | "resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz", 615 | "integrity": "sha512-j0KLYPhm6zeac4lz3oJ3o65qvgQCcPubiyotZrXqEaG4hNagNYO8qdlUrX5vwqv9ohqeT/Z3j6+yW067yWWdUw==", 616 | "engines": { 617 | "node": "*" 618 | } 619 | }, 620 | "node_modules/form-data": { 621 | "version": "2.3.3", 622 | "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.3.3.tgz", 623 | "integrity": "sha512-1lLKB2Mu3aGP1Q/2eCOx0fNbRMe7XdwktwOruhfqqd0rIJWwN4Dh+E3hrPSlDCXnSR7UtZ1N38rVXm+6+MEhJQ==", 624 | "dependencies": { 625 | "asynckit": "^0.4.0", 626 | "combined-stream": "^1.0.6", 627 | "mime-types": "^2.1.12" 628 | }, 629 | "engines": { 630 | "node": ">= 0.12" 631 | } 632 | }, 633 | "node_modules/function-bind": { 634 | "version": "1.1.2", 635 | "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", 636 | "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", 637 | "funding": { 638 | "url": "https://github.com/sponsors/ljharb" 639 | } 640 | }, 641 | "node_modules/function.prototype.name": { 642 | "version": "1.1.6", 643 | "resolved": "https://registry.npmjs.org/function.prototype.name/-/function.prototype.name-1.1.6.tgz", 644 | "integrity": "sha512-Z5kx79swU5P27WEayXM1tBi5Ze/lbIyiNgU3qyXUOf9b2rgXYyF9Dy9Cx+IQv/Lc8WCG6L82zwUPpSS9hGehIg==", 645 | "dependencies": { 646 | "call-bind": "^1.0.2", 647 | "define-properties": "^1.2.0", 648 | "es-abstract": "^1.22.1", 649 | "functions-have-names": "^1.2.3" 650 | }, 651 | "engines": { 652 | "node": ">= 0.4" 653 | }, 654 | "funding": { 655 | "url": "https://github.com/sponsors/ljharb" 656 | } 657 | }, 658 | "node_modules/functions-have-names": { 659 | "version": "1.2.3", 660 | "resolved": "https://registry.npmjs.org/functions-have-names/-/functions-have-names-1.2.3.tgz", 661 | "integrity": "sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==", 662 | "funding": { 663 | "url": "https://github.com/sponsors/ljharb" 664 | } 665 | }, 666 | "node_modules/generic-pool": { 667 | "version": "3.9.0", 668 | "resolved": "https://registry.npmjs.org/generic-pool/-/generic-pool-3.9.0.tgz", 669 | "integrity": "sha512-hymDOu5B53XvN4QT9dBmZxPX4CWhBPPLguTZ9MMFeFa/Kg0xWVfylOVNlJji/E7yTZWFd/q9GO5TxDLq156D7g==", 670 | "engines": { 671 | "node": ">= 4" 672 | } 673 | }, 674 | "node_modules/get-intrinsic": { 675 | "version": "1.2.4", 676 | "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.4.tgz", 677 | "integrity": "sha512-5uYhsJH8VJBTv7oslg4BznJYhDoRI6waYCxMmCdnTrcCrHA/fCFKoTFz2JKKE0HdDFUF7/oQuhzumXJK7paBRQ==", 678 | "dependencies": { 679 | "es-errors": "^1.3.0", 680 | "function-bind": "^1.1.2", 681 | "has-proto": "^1.0.1", 682 | "has-symbols": "^1.0.3", 683 | "hasown": "^2.0.0" 684 | }, 685 | "engines": { 686 | "node": ">= 0.4" 687 | }, 688 | "funding": { 689 | "url": "https://github.com/sponsors/ljharb" 690 | } 691 | }, 692 | "node_modules/get-symbol-description": { 693 | "version": "1.0.2", 694 | "resolved": "https://registry.npmjs.org/get-symbol-description/-/get-symbol-description-1.0.2.tgz", 695 | "integrity": "sha512-g0QYk1dZBxGwk+Ngc+ltRH2IBp2f7zBkBMBJZCDerh6EhlhSR6+9irMCuT/09zD6qkarHUSn529sK/yL4S27mg==", 696 | "dependencies": { 697 | "call-bind": "^1.0.5", 698 | "es-errors": "^1.3.0", 699 | "get-intrinsic": "^1.2.4" 700 | }, 701 | "engines": { 702 | "node": ">= 0.4" 703 | }, 704 | "funding": { 705 | "url": "https://github.com/sponsors/ljharb" 706 | } 707 | }, 708 | "node_modules/getpass": { 709 | "version": "0.1.7", 710 | "resolved": "https://registry.npmjs.org/getpass/-/getpass-0.1.7.tgz", 711 | "integrity": "sha512-0fzj9JxOLfJ+XGLhR8ze3unN0KZCgZwiSSDz168VERjK8Wl8kVSdcu2kspd4s4wtAa1y/qrVRiAA0WclVsu0ng==", 712 | "dependencies": { 713 | "assert-plus": "^1.0.0" 714 | } 715 | }, 716 | "node_modules/globalthis": { 717 | "version": "1.0.3", 718 | "resolved": "https://registry.npmjs.org/globalthis/-/globalthis-1.0.3.tgz", 719 | "integrity": "sha512-sFdI5LyBiNTHjRd7cGPWapiHWMOXKyuBNX/cWJ3NfzrZQVa8GI/8cofCl74AOVqq9W5kNmguTIzJ/1s2gyI9wA==", 720 | "dependencies": { 721 | "define-properties": "^1.1.3" 722 | }, 723 | "engines": { 724 | "node": ">= 0.4" 725 | }, 726 | "funding": { 727 | "url": "https://github.com/sponsors/ljharb" 728 | } 729 | }, 730 | "node_modules/gopd": { 731 | "version": "1.0.1", 732 | "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.0.1.tgz", 733 | "integrity": "sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==", 734 | "dependencies": { 735 | "get-intrinsic": "^1.1.3" 736 | }, 737 | "funding": { 738 | "url": "https://github.com/sponsors/ljharb" 739 | } 740 | }, 741 | "node_modules/har-schema": { 742 | "version": "2.0.0", 743 | "resolved": "https://registry.npmjs.org/har-schema/-/har-schema-2.0.0.tgz", 744 | "integrity": "sha512-Oqluz6zhGX8cyRaTQlFMPw80bSJVG2x/cFb8ZPhUILGgHka9SsokCCOQgpveePerqidZOrT14ipqfJb7ILcW5Q==", 745 | "peer": true, 746 | "engines": { 747 | "node": ">=4" 748 | } 749 | }, 750 | "node_modules/har-validator": { 751 | "version": "5.1.5", 752 | "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-5.1.5.tgz", 753 | "integrity": "sha512-nmT2T0lljbxdQZfspsno9hgrG3Uir6Ks5afism62poxqBM6sDnMEuPmzTq8XN0OEwqKLLdh1jQI3qyE66Nzb3w==", 754 | "deprecated": "this library is no longer supported", 755 | "peer": true, 756 | "dependencies": { 757 | "ajv": "^6.12.3", 758 | "har-schema": "^2.0.0" 759 | }, 760 | "engines": { 761 | "node": ">=6" 762 | } 763 | }, 764 | "node_modules/has-bigints": { 765 | "version": "1.0.2", 766 | "resolved": "https://registry.npmjs.org/has-bigints/-/has-bigints-1.0.2.tgz", 767 | "integrity": "sha512-tSvCKtBr9lkF0Ex0aQiP9N+OpV4zi2r/Nee5VkRDbaqv35RLYMzbwQfFSZZH0kR+Rd6302UJZ2p/bJCEoR3VoQ==", 768 | "funding": { 769 | "url": "https://github.com/sponsors/ljharb" 770 | } 771 | }, 772 | "node_modules/has-property-descriptors": { 773 | "version": "1.0.2", 774 | "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.2.tgz", 775 | "integrity": "sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==", 776 | "dependencies": { 777 | "es-define-property": "^1.0.0" 778 | }, 779 | "funding": { 780 | "url": "https://github.com/sponsors/ljharb" 781 | } 782 | }, 783 | "node_modules/has-proto": { 784 | "version": "1.0.3", 785 | "resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.0.3.tgz", 786 | "integrity": "sha512-SJ1amZAJUiZS+PhsVLf5tGydlaVB8EdFpaSO4gmiUKUOxk8qzn5AIy4ZeJUmh22znIdk/uMAUT2pl3FxzVUH+Q==", 787 | "engines": { 788 | "node": ">= 0.4" 789 | }, 790 | "funding": { 791 | "url": "https://github.com/sponsors/ljharb" 792 | } 793 | }, 794 | "node_modules/has-symbols": { 795 | "version": "1.0.3", 796 | "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz", 797 | "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==", 798 | "engines": { 799 | "node": ">= 0.4" 800 | }, 801 | "funding": { 802 | "url": "https://github.com/sponsors/ljharb" 803 | } 804 | }, 805 | "node_modules/has-tostringtag": { 806 | "version": "1.0.2", 807 | "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.2.tgz", 808 | "integrity": "sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==", 809 | "dependencies": { 810 | "has-symbols": "^1.0.3" 811 | }, 812 | "engines": { 813 | "node": ">= 0.4" 814 | }, 815 | "funding": { 816 | "url": "https://github.com/sponsors/ljharb" 817 | } 818 | }, 819 | "node_modules/hasown": { 820 | "version": "2.0.2", 821 | "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz", 822 | "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==", 823 | "dependencies": { 824 | "function-bind": "^1.1.2" 825 | }, 826 | "engines": { 827 | "node": ">= 0.4" 828 | } 829 | }, 830 | "node_modules/http-signature": { 831 | "version": "1.3.6", 832 | "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.3.6.tgz", 833 | "integrity": "sha512-3adrsD6zqo4GsTqtO7FyrejHNv+NgiIfAfv68+jVlFmSr9OGy7zrxONceFRLKvnnZA5jbxQBX1u9PpB6Wi32Gw==", 834 | "dependencies": { 835 | "assert-plus": "^1.0.0", 836 | "jsprim": "^2.0.2", 837 | "sshpk": "^1.14.1" 838 | }, 839 | "engines": { 840 | "node": ">=0.10" 841 | } 842 | }, 843 | "node_modules/inherits": { 844 | "version": "2.0.4", 845 | "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", 846 | "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" 847 | }, 848 | "node_modules/internal-slot": { 849 | "version": "1.0.7", 850 | "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.0.7.tgz", 851 | "integrity": "sha512-NGnrKwXzSms2qUUih/ILZ5JBqNTSa1+ZmP6flaIp6KmSElgE9qdndzS3cqjrDovwFdmwsGsLdeFgB6suw+1e9g==", 852 | "dependencies": { 853 | "es-errors": "^1.3.0", 854 | "hasown": "^2.0.0", 855 | "side-channel": "^1.0.4" 856 | }, 857 | "engines": { 858 | "node": ">= 0.4" 859 | } 860 | }, 861 | "node_modules/is-array-buffer": { 862 | "version": "3.0.4", 863 | "resolved": "https://registry.npmjs.org/is-array-buffer/-/is-array-buffer-3.0.4.tgz", 864 | "integrity": "sha512-wcjaerHw0ydZwfhiKbXJWLDY8A7yV7KhjQOpb83hGgGfId/aQa4TOvwyzn2PuswW2gPCYEL/nEAiSVpdOj1lXw==", 865 | "dependencies": { 866 | "call-bind": "^1.0.2", 867 | "get-intrinsic": "^1.2.1" 868 | }, 869 | "engines": { 870 | "node": ">= 0.4" 871 | }, 872 | "funding": { 873 | "url": "https://github.com/sponsors/ljharb" 874 | } 875 | }, 876 | "node_modules/is-bigint": { 877 | "version": "1.0.4", 878 | "resolved": "https://registry.npmjs.org/is-bigint/-/is-bigint-1.0.4.tgz", 879 | "integrity": "sha512-zB9CruMamjym81i2JZ3UMn54PKGsQzsJeo6xvN3HJJ4CAsQNB6iRutp2To77OfCNuoxspsIhzaPoO1zyCEhFOg==", 880 | "dependencies": { 881 | "has-bigints": "^1.0.1" 882 | }, 883 | "funding": { 884 | "url": "https://github.com/sponsors/ljharb" 885 | } 886 | }, 887 | "node_modules/is-boolean-object": { 888 | "version": "1.1.2", 889 | "resolved": "https://registry.npmjs.org/is-boolean-object/-/is-boolean-object-1.1.2.tgz", 890 | "integrity": "sha512-gDYaKHJmnj4aWxyj6YHyXVpdQawtVLHU5cb+eztPGczf6cjuTdwve5ZIEfgXqH4e57An1D1AKf8CZ3kYrQRqYA==", 891 | "dependencies": { 892 | "call-bind": "^1.0.2", 893 | "has-tostringtag": "^1.0.0" 894 | }, 895 | "engines": { 896 | "node": ">= 0.4" 897 | }, 898 | "funding": { 899 | "url": "https://github.com/sponsors/ljharb" 900 | } 901 | }, 902 | "node_modules/is-callable": { 903 | "version": "1.2.7", 904 | "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.7.tgz", 905 | "integrity": "sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==", 906 | "engines": { 907 | "node": ">= 0.4" 908 | }, 909 | "funding": { 910 | "url": "https://github.com/sponsors/ljharb" 911 | } 912 | }, 913 | "node_modules/is-data-view": { 914 | "version": "1.0.1", 915 | "resolved": "https://registry.npmjs.org/is-data-view/-/is-data-view-1.0.1.tgz", 916 | "integrity": "sha512-AHkaJrsUVW6wq6JS8y3JnM/GJF/9cf+k20+iDzlSaJrinEo5+7vRiteOSwBhHRiAyQATN1AmY4hwzxJKPmYf+w==", 917 | "dependencies": { 918 | "is-typed-array": "^1.1.13" 919 | }, 920 | "engines": { 921 | "node": ">= 0.4" 922 | }, 923 | "funding": { 924 | "url": "https://github.com/sponsors/ljharb" 925 | } 926 | }, 927 | "node_modules/is-date-object": { 928 | "version": "1.0.5", 929 | "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.5.tgz", 930 | "integrity": "sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ==", 931 | "dependencies": { 932 | "has-tostringtag": "^1.0.0" 933 | }, 934 | "engines": { 935 | "node": ">= 0.4" 936 | }, 937 | "funding": { 938 | "url": "https://github.com/sponsors/ljharb" 939 | } 940 | }, 941 | "node_modules/is-negative-zero": { 942 | "version": "2.0.3", 943 | "resolved": "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.3.tgz", 944 | "integrity": "sha512-5KoIu2Ngpyek75jXodFvnafB6DJgr3u8uuK0LEZJjrU19DrMD3EVERaR8sjz8CCGgpZvxPl9SuE1GMVPFHx1mw==", 945 | "engines": { 946 | "node": ">= 0.4" 947 | }, 948 | "funding": { 949 | "url": "https://github.com/sponsors/ljharb" 950 | } 951 | }, 952 | "node_modules/is-number-object": { 953 | "version": "1.0.7", 954 | "resolved": "https://registry.npmjs.org/is-number-object/-/is-number-object-1.0.7.tgz", 955 | "integrity": "sha512-k1U0IRzLMo7ZlYIfzRu23Oh6MiIFasgpb9X76eqfFZAqwH44UI4KTBvBYIZ1dSL9ZzChTB9ShHfLkR4pdW5krQ==", 956 | "dependencies": { 957 | "has-tostringtag": "^1.0.0" 958 | }, 959 | "engines": { 960 | "node": ">= 0.4" 961 | }, 962 | "funding": { 963 | "url": "https://github.com/sponsors/ljharb" 964 | } 965 | }, 966 | "node_modules/is-regex": { 967 | "version": "1.1.4", 968 | "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.1.4.tgz", 969 | "integrity": "sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg==", 970 | "dependencies": { 971 | "call-bind": "^1.0.2", 972 | "has-tostringtag": "^1.0.0" 973 | }, 974 | "engines": { 975 | "node": ">= 0.4" 976 | }, 977 | "funding": { 978 | "url": "https://github.com/sponsors/ljharb" 979 | } 980 | }, 981 | "node_modules/is-shared-array-buffer": { 982 | "version": "1.0.3", 983 | "resolved": "https://registry.npmjs.org/is-shared-array-buffer/-/is-shared-array-buffer-1.0.3.tgz", 984 | "integrity": "sha512-nA2hv5XIhLR3uVzDDfCIknerhx8XUKnstuOERPNNIinXG7v9u+ohXF67vxm4TPTEPU6lm61ZkwP3c9PCB97rhg==", 985 | "dependencies": { 986 | "call-bind": "^1.0.7" 987 | }, 988 | "engines": { 989 | "node": ">= 0.4" 990 | }, 991 | "funding": { 992 | "url": "https://github.com/sponsors/ljharb" 993 | } 994 | }, 995 | "node_modules/is-string": { 996 | "version": "1.0.7", 997 | "resolved": "https://registry.npmjs.org/is-string/-/is-string-1.0.7.tgz", 998 | "integrity": "sha512-tE2UXzivje6ofPW7l23cjDOMa09gb7xlAqG6jG5ej6uPV32TlWP3NKPigtaGeHNu9fohccRYvIiZMfOOnOYUtg==", 999 | "dependencies": { 1000 | "has-tostringtag": "^1.0.0" 1001 | }, 1002 | "engines": { 1003 | "node": ">= 0.4" 1004 | }, 1005 | "funding": { 1006 | "url": "https://github.com/sponsors/ljharb" 1007 | } 1008 | }, 1009 | "node_modules/is-symbol": { 1010 | "version": "1.0.4", 1011 | "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.4.tgz", 1012 | "integrity": "sha512-C/CPBqKWnvdcxqIARxyOh4v1UUEOCHpgDa0WYgpKDFMszcrPcffg5uhwSgPCLD2WWxmq6isisz87tzT01tuGhg==", 1013 | "dependencies": { 1014 | "has-symbols": "^1.0.2" 1015 | }, 1016 | "engines": { 1017 | "node": ">= 0.4" 1018 | }, 1019 | "funding": { 1020 | "url": "https://github.com/sponsors/ljharb" 1021 | } 1022 | }, 1023 | "node_modules/is-typed-array": { 1024 | "version": "1.1.13", 1025 | "resolved": "https://registry.npmjs.org/is-typed-array/-/is-typed-array-1.1.13.tgz", 1026 | "integrity": "sha512-uZ25/bUAlUY5fR4OKT4rZQEBrzQWYV9ZJYGGsUmEJ6thodVJ1HX64ePQ6Z0qPWP+m+Uq6e9UugrE38jeYsDSMw==", 1027 | "dependencies": { 1028 | "which-typed-array": "^1.1.14" 1029 | }, 1030 | "engines": { 1031 | "node": ">= 0.4" 1032 | }, 1033 | "funding": { 1034 | "url": "https://github.com/sponsors/ljharb" 1035 | } 1036 | }, 1037 | "node_modules/is-typedarray": { 1038 | "version": "1.0.0", 1039 | "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", 1040 | "integrity": "sha512-cyA56iCMHAh5CdzjJIa4aohJyeO1YbwLi3Jc35MmRU6poroFjIGZzUzupGiRPOjgHg9TLu43xbpwXk523fMxKA==" 1041 | }, 1042 | "node_modules/is-weakref": { 1043 | "version": "1.0.2", 1044 | "resolved": "https://registry.npmjs.org/is-weakref/-/is-weakref-1.0.2.tgz", 1045 | "integrity": "sha512-qctsuLZmIQ0+vSSMfoVvyFe2+GSEvnmZ2ezTup1SBse9+twCCeial6EEi3Nc2KFcf6+qz2FBPnjXsk8xhKSaPQ==", 1046 | "dependencies": { 1047 | "call-bind": "^1.0.2" 1048 | }, 1049 | "funding": { 1050 | "url": "https://github.com/sponsors/ljharb" 1051 | } 1052 | }, 1053 | "node_modules/isarray": { 1054 | "version": "1.0.0", 1055 | "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", 1056 | "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==" 1057 | }, 1058 | "node_modules/isstream": { 1059 | "version": "0.1.2", 1060 | "resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz", 1061 | "integrity": "sha512-Yljz7ffyPbrLpLngrMtZ7NduUgVvi6wG9RJ9IUcyCd59YQ911PBJphODUcbOVbqYfxe1wuYf/LJ8PauMRwsM/g==" 1062 | }, 1063 | "node_modules/jsbn": { 1064 | "version": "0.1.1", 1065 | "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz", 1066 | "integrity": "sha512-UVU9dibq2JcFWxQPA6KCqj5O42VOmAY3zQUfEKxU0KpTGXwNoCjkX1e13eHNvw/xPynt6pU0rZ1htjWTNTSXsg==" 1067 | }, 1068 | "node_modules/json-schema": { 1069 | "version": "0.4.0", 1070 | "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.4.0.tgz", 1071 | "integrity": "sha512-es94M3nTIfsEPisRafak+HDLfHXnKBhV3vU5eqPcS3flIWqcxJWgXHXiey3YrpaNsanY5ei1VoYEbOzijuq9BA==" 1072 | }, 1073 | "node_modules/json-schema-traverse": { 1074 | "version": "0.4.1", 1075 | "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", 1076 | "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", 1077 | "peer": true 1078 | }, 1079 | "node_modules/json-stringify-safe": { 1080 | "version": "5.0.1", 1081 | "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz", 1082 | "integrity": "sha512-ZClg6AaYvamvYEE82d3Iyd3vSSIjQ+odgjaTzRuO3s7toCdFKczob2i0zCh7JE8kWn17yvAWhUVxvqGwUalsRA==" 1083 | }, 1084 | "node_modules/jsprim": { 1085 | "version": "2.0.2", 1086 | "resolved": "https://registry.npmjs.org/jsprim/-/jsprim-2.0.2.tgz", 1087 | "integrity": "sha512-gqXddjPqQ6G40VdnI6T6yObEC+pDNvyP95wdQhkWkg7crHH3km5qP1FsOXEkzEQwnz6gz5qGTn1c2Y52wP3OyQ==", 1088 | "engines": [ 1089 | "node >=0.6.0" 1090 | ], 1091 | "dependencies": { 1092 | "assert-plus": "1.0.0", 1093 | "extsprintf": "1.3.0", 1094 | "json-schema": "0.4.0", 1095 | "verror": "1.10.0" 1096 | } 1097 | }, 1098 | "node_modules/lodash": { 1099 | "version": "4.17.21", 1100 | "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", 1101 | "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==" 1102 | }, 1103 | "node_modules/mime": { 1104 | "version": "1.6.0", 1105 | "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", 1106 | "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==", 1107 | "bin": { 1108 | "mime": "cli.js" 1109 | }, 1110 | "engines": { 1111 | "node": ">=4" 1112 | } 1113 | }, 1114 | "node_modules/mime-db": { 1115 | "version": "1.52.0", 1116 | "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", 1117 | "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", 1118 | "engines": { 1119 | "node": ">= 0.6" 1120 | } 1121 | }, 1122 | "node_modules/mime-types": { 1123 | "version": "2.1.35", 1124 | "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", 1125 | "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", 1126 | "dependencies": { 1127 | "mime-db": "1.52.0" 1128 | }, 1129 | "engines": { 1130 | "node": ">= 0.6" 1131 | } 1132 | }, 1133 | "node_modules/ms": { 1134 | "version": "2.1.3", 1135 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", 1136 | "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==" 1137 | }, 1138 | "node_modules/mysql": { 1139 | "version": "2.18.1", 1140 | "resolved": "https://registry.npmjs.org/mysql/-/mysql-2.18.1.tgz", 1141 | "integrity": "sha512-Bca+gk2YWmqp2Uf6k5NFEurwY/0td0cpebAucFpY/3jhrwrVGuxU2uQFCHjU19SJfje0yQvi+rVWdq78hR5lig==", 1142 | "dependencies": { 1143 | "bignumber.js": "9.0.0", 1144 | "readable-stream": "2.3.7", 1145 | "safe-buffer": "5.1.2", 1146 | "sqlstring": "2.3.1" 1147 | }, 1148 | "engines": { 1149 | "node": ">= 0.6" 1150 | } 1151 | }, 1152 | "node_modules/mysql/node_modules/readable-stream": { 1153 | "version": "2.3.7", 1154 | "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", 1155 | "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", 1156 | "dependencies": { 1157 | "core-util-is": "~1.0.0", 1158 | "inherits": "~2.0.3", 1159 | "isarray": "~1.0.0", 1160 | "process-nextick-args": "~2.0.0", 1161 | "safe-buffer": "~5.1.1", 1162 | "string_decoder": "~1.1.1", 1163 | "util-deprecate": "~1.0.1" 1164 | } 1165 | }, 1166 | "node_modules/mysql/node_modules/safe-buffer": { 1167 | "version": "5.1.2", 1168 | "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", 1169 | "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" 1170 | }, 1171 | "node_modules/node-telegram-bot-api": { 1172 | "version": "0.65.1", 1173 | "resolved": "https://registry.npmjs.org/node-telegram-bot-api/-/node-telegram-bot-api-0.65.1.tgz", 1174 | "integrity": "sha512-YhMSgUZCKWxI+MlCuh/2yuMvsqMnZGAA2QOjD10GWk8KszNN5LQOzO+kp1K1wMYuOJoZ7v0+epLpJsSrnmlyQQ==", 1175 | "dependencies": { 1176 | "@cypress/request": "^3.0.1", 1177 | "@cypress/request-promise": "^5.0.0", 1178 | "array.prototype.findindex": "^2.0.2", 1179 | "bl": "^1.2.3", 1180 | "debug": "^3.2.7", 1181 | "eventemitter3": "^3.0.0", 1182 | "file-type": "^3.9.0", 1183 | "mime": "^1.6.0", 1184 | "pump": "^2.0.0" 1185 | }, 1186 | "engines": { 1187 | "node": ">=0.12" 1188 | } 1189 | }, 1190 | "node_modules/oauth-sign": { 1191 | "version": "0.9.0", 1192 | "resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.9.0.tgz", 1193 | "integrity": "sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ==", 1194 | "peer": true, 1195 | "engines": { 1196 | "node": "*" 1197 | } 1198 | }, 1199 | "node_modules/object-inspect": { 1200 | "version": "1.13.1", 1201 | "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.1.tgz", 1202 | "integrity": "sha512-5qoj1RUiKOMsCCNLV1CBiPYE10sziTsnmNxkAI/rZhiD63CF7IqdFGC/XzjWjpSgLf0LxXX3bDFIh0E18f6UhQ==", 1203 | "funding": { 1204 | "url": "https://github.com/sponsors/ljharb" 1205 | } 1206 | }, 1207 | "node_modules/object-keys": { 1208 | "version": "1.1.1", 1209 | "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", 1210 | "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==", 1211 | "engines": { 1212 | "node": ">= 0.4" 1213 | } 1214 | }, 1215 | "node_modules/object.assign": { 1216 | "version": "4.1.5", 1217 | "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.5.tgz", 1218 | "integrity": "sha512-byy+U7gp+FVwmyzKPYhW2h5l3crpmGsxl7X2s8y43IgxvG4g3QZ6CffDtsNQy1WsmZpQbO+ybo0AlW7TY6DcBQ==", 1219 | "dependencies": { 1220 | "call-bind": "^1.0.5", 1221 | "define-properties": "^1.2.1", 1222 | "has-symbols": "^1.0.3", 1223 | "object-keys": "^1.1.1" 1224 | }, 1225 | "engines": { 1226 | "node": ">= 0.4" 1227 | }, 1228 | "funding": { 1229 | "url": "https://github.com/sponsors/ljharb" 1230 | } 1231 | }, 1232 | "node_modules/once": { 1233 | "version": "1.4.0", 1234 | "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", 1235 | "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", 1236 | "dependencies": { 1237 | "wrappy": "1" 1238 | } 1239 | }, 1240 | "node_modules/performance-now": { 1241 | "version": "2.1.0", 1242 | "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz", 1243 | "integrity": "sha512-7EAHlyLHI56VEIdK57uwHdHKIaAGbnXPiw0yWbarQZOKaKpvUIgW0jWRVLiatnM+XXlSwsanIBH/hzGMJulMow==" 1244 | }, 1245 | "node_modules/possible-typed-array-names": { 1246 | "version": "1.0.0", 1247 | "resolved": "https://registry.npmjs.org/possible-typed-array-names/-/possible-typed-array-names-1.0.0.tgz", 1248 | "integrity": "sha512-d7Uw+eZoloe0EHDIYoe+bQ5WXnGMOpmiZFTuMWCwpjzzkL2nTjcKiAk4hh8TjnGye2TwWOk3UXucZ+3rbmBa8Q==", 1249 | "engines": { 1250 | "node": ">= 0.4" 1251 | } 1252 | }, 1253 | "node_modules/process-nextick-args": { 1254 | "version": "2.0.1", 1255 | "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", 1256 | "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==" 1257 | }, 1258 | "node_modules/psl": { 1259 | "version": "1.9.0", 1260 | "resolved": "https://registry.npmjs.org/psl/-/psl-1.9.0.tgz", 1261 | "integrity": "sha512-E/ZsdU4HLs/68gYzgGTkMicWTLPdAftJLfJFlLUAAKZGkStNU72sZjT66SnMDVOfOWY/YAoiD7Jxa9iHvngcag==" 1262 | }, 1263 | "node_modules/pump": { 1264 | "version": "2.0.1", 1265 | "resolved": "https://registry.npmjs.org/pump/-/pump-2.0.1.tgz", 1266 | "integrity": "sha512-ruPMNRkN3MHP1cWJc9OWr+T/xDP0jhXYCLfJcBuX54hhfIBnaQmAUMfDcG4DM5UMWByBbJY69QSphm3jtDKIkA==", 1267 | "dependencies": { 1268 | "end-of-stream": "^1.1.0", 1269 | "once": "^1.3.1" 1270 | } 1271 | }, 1272 | "node_modules/punycode": { 1273 | "version": "2.3.1", 1274 | "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz", 1275 | "integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==", 1276 | "engines": { 1277 | "node": ">=6" 1278 | } 1279 | }, 1280 | "node_modules/qs": { 1281 | "version": "6.10.4", 1282 | "resolved": "https://registry.npmjs.org/qs/-/qs-6.10.4.tgz", 1283 | "integrity": "sha512-OQiU+C+Ds5qiH91qh/mg0w+8nwQuLjM4F4M/PbmhDOoYehPh+Fb0bDjtR1sOvy7YKxvj28Y/M0PhP5uVX0kB+g==", 1284 | "dependencies": { 1285 | "side-channel": "^1.0.4" 1286 | }, 1287 | "engines": { 1288 | "node": ">=0.6" 1289 | }, 1290 | "funding": { 1291 | "url": "https://github.com/sponsors/ljharb" 1292 | } 1293 | }, 1294 | "node_modules/querystringify": { 1295 | "version": "2.2.0", 1296 | "resolved": "https://registry.npmjs.org/querystringify/-/querystringify-2.2.0.tgz", 1297 | "integrity": "sha512-FIqgj2EUvTa7R50u0rGsyTftzjYmv/a3hO345bZNrqabNqjtgiDMgmo4mkUjd+nzU5oF3dClKqFIPUKybUyqoQ==" 1298 | }, 1299 | "node_modules/readable-stream": { 1300 | "version": "2.3.8", 1301 | "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz", 1302 | "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==", 1303 | "dependencies": { 1304 | "core-util-is": "~1.0.0", 1305 | "inherits": "~2.0.3", 1306 | "isarray": "~1.0.0", 1307 | "process-nextick-args": "~2.0.0", 1308 | "safe-buffer": "~5.1.1", 1309 | "string_decoder": "~1.1.1", 1310 | "util-deprecate": "~1.0.1" 1311 | } 1312 | }, 1313 | "node_modules/readable-stream/node_modules/safe-buffer": { 1314 | "version": "5.1.2", 1315 | "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", 1316 | "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" 1317 | }, 1318 | "node_modules/redis": { 1319 | "version": "4.6.13", 1320 | "resolved": "https://registry.npmjs.org/redis/-/redis-4.6.13.tgz", 1321 | "integrity": "sha512-MHgkS4B+sPjCXpf+HfdetBwbRz6vCtsceTmw1pHNYJAsYxrfpOP6dz+piJWGos8wqG7qb3vj/Rrc5qOlmInUuA==", 1322 | "dependencies": { 1323 | "@redis/bloom": "1.2.0", 1324 | "@redis/client": "1.5.14", 1325 | "@redis/graph": "1.1.1", 1326 | "@redis/json": "1.0.6", 1327 | "@redis/search": "1.1.6", 1328 | "@redis/time-series": "1.0.5" 1329 | } 1330 | }, 1331 | "node_modules/regexp.prototype.flags": { 1332 | "version": "1.5.2", 1333 | "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.5.2.tgz", 1334 | "integrity": "sha512-NcDiDkTLuPR+++OCKB0nWafEmhg/Da8aUPLPMQbK+bxKKCm1/S5he+AqYa4PlMCVBalb4/yxIRub6qkEx5yJbw==", 1335 | "dependencies": { 1336 | "call-bind": "^1.0.6", 1337 | "define-properties": "^1.2.1", 1338 | "es-errors": "^1.3.0", 1339 | "set-function-name": "^2.0.1" 1340 | }, 1341 | "engines": { 1342 | "node": ">= 0.4" 1343 | }, 1344 | "funding": { 1345 | "url": "https://github.com/sponsors/ljharb" 1346 | } 1347 | }, 1348 | "node_modules/request": { 1349 | "version": "2.88.2", 1350 | "resolved": "https://registry.npmjs.org/request/-/request-2.88.2.tgz", 1351 | "integrity": "sha512-MsvtOrfG9ZcrOwAW+Qi+F6HbD0CWXEh9ou77uOb7FM2WPhwT7smM833PzanhJLsgXjN89Ir6V2PczXNnMpwKhw==", 1352 | "deprecated": "request has been deprecated, see https://github.com/request/request/issues/3142", 1353 | "peer": true, 1354 | "dependencies": { 1355 | "aws-sign2": "~0.7.0", 1356 | "aws4": "^1.8.0", 1357 | "caseless": "~0.12.0", 1358 | "combined-stream": "~1.0.6", 1359 | "extend": "~3.0.2", 1360 | "forever-agent": "~0.6.1", 1361 | "form-data": "~2.3.2", 1362 | "har-validator": "~5.1.3", 1363 | "http-signature": "~1.2.0", 1364 | "is-typedarray": "~1.0.0", 1365 | "isstream": "~0.1.2", 1366 | "json-stringify-safe": "~5.0.1", 1367 | "mime-types": "~2.1.19", 1368 | "oauth-sign": "~0.9.0", 1369 | "performance-now": "^2.1.0", 1370 | "qs": "~6.5.2", 1371 | "safe-buffer": "^5.1.2", 1372 | "tough-cookie": "~2.5.0", 1373 | "tunnel-agent": "^0.6.0", 1374 | "uuid": "^3.3.2" 1375 | }, 1376 | "engines": { 1377 | "node": ">= 6" 1378 | } 1379 | }, 1380 | "node_modules/request-promise-core": { 1381 | "version": "1.1.3", 1382 | "resolved": "https://registry.npmjs.org/request-promise-core/-/request-promise-core-1.1.3.tgz", 1383 | "integrity": "sha512-QIs2+ArIGQVp5ZYbWD5ZLCY29D5CfWizP8eWnm8FoGD1TX61veauETVQbrV60662V0oFBkrDOuaBI8XgtuyYAQ==", 1384 | "dependencies": { 1385 | "lodash": "^4.17.15" 1386 | }, 1387 | "engines": { 1388 | "node": ">=0.10.0" 1389 | }, 1390 | "peerDependencies": { 1391 | "request": "^2.34" 1392 | } 1393 | }, 1394 | "node_modules/request/node_modules/http-signature": { 1395 | "version": "1.2.0", 1396 | "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.2.0.tgz", 1397 | "integrity": "sha512-CAbnr6Rz4CYQkLYUtSNXxQPUH2gK8f3iWexVlsnMeD+GjlsQ0Xsy1cOX+mN3dtxYomRy21CiOzU8Uhw6OwncEQ==", 1398 | "peer": true, 1399 | "dependencies": { 1400 | "assert-plus": "^1.0.0", 1401 | "jsprim": "^1.2.2", 1402 | "sshpk": "^1.7.0" 1403 | }, 1404 | "engines": { 1405 | "node": ">=0.8", 1406 | "npm": ">=1.3.7" 1407 | } 1408 | }, 1409 | "node_modules/request/node_modules/jsprim": { 1410 | "version": "1.4.2", 1411 | "resolved": "https://registry.npmjs.org/jsprim/-/jsprim-1.4.2.tgz", 1412 | "integrity": "sha512-P2bSOMAc/ciLz6DzgjVlGJP9+BrJWu5UDGK70C2iweC5QBIeFf0ZXRvGjEj2uYgrY2MkAAhsSWHDWlFtEroZWw==", 1413 | "peer": true, 1414 | "dependencies": { 1415 | "assert-plus": "1.0.0", 1416 | "extsprintf": "1.3.0", 1417 | "json-schema": "0.4.0", 1418 | "verror": "1.10.0" 1419 | }, 1420 | "engines": { 1421 | "node": ">=0.6.0" 1422 | } 1423 | }, 1424 | "node_modules/request/node_modules/qs": { 1425 | "version": "6.5.3", 1426 | "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.3.tgz", 1427 | "integrity": "sha512-qxXIEh4pCGfHICj1mAJQ2/2XVZkjCDTcEgfoSQxc/fYivUZxTkk7L3bDBJSoNrEzXI17oUO5Dp07ktqE5KzczA==", 1428 | "peer": true, 1429 | "engines": { 1430 | "node": ">=0.6" 1431 | } 1432 | }, 1433 | "node_modules/request/node_modules/tough-cookie": { 1434 | "version": "2.5.0", 1435 | "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.5.0.tgz", 1436 | "integrity": "sha512-nlLsUzgm1kfLXSXfRZMc1KLAugd4hqJHDTvc2hDIwS3mZAfMEuMbc03SujMF+GEcpaX/qboeycw6iO8JwVv2+g==", 1437 | "peer": true, 1438 | "dependencies": { 1439 | "psl": "^1.1.28", 1440 | "punycode": "^2.1.1" 1441 | }, 1442 | "engines": { 1443 | "node": ">=0.8" 1444 | } 1445 | }, 1446 | "node_modules/request/node_modules/uuid": { 1447 | "version": "3.4.0", 1448 | "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.4.0.tgz", 1449 | "integrity": "sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==", 1450 | "deprecated": "Please upgrade to version 7 or higher. Older versions may use Math.random() in certain circumstances, which is known to be problematic. See https://v8.dev/blog/math-random for details.", 1451 | "peer": true, 1452 | "bin": { 1453 | "uuid": "bin/uuid" 1454 | } 1455 | }, 1456 | "node_modules/requires-port": { 1457 | "version": "1.0.0", 1458 | "resolved": "https://registry.npmjs.org/requires-port/-/requires-port-1.0.0.tgz", 1459 | "integrity": "sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ==" 1460 | }, 1461 | "node_modules/safe-array-concat": { 1462 | "version": "1.1.2", 1463 | "resolved": "https://registry.npmjs.org/safe-array-concat/-/safe-array-concat-1.1.2.tgz", 1464 | "integrity": "sha512-vj6RsCsWBCf19jIeHEfkRMw8DPiBb+DMXklQ/1SGDHOMlHdPUkZXFQ2YdplS23zESTijAcurb1aSgJA3AgMu1Q==", 1465 | "dependencies": { 1466 | "call-bind": "^1.0.7", 1467 | "get-intrinsic": "^1.2.4", 1468 | "has-symbols": "^1.0.3", 1469 | "isarray": "^2.0.5" 1470 | }, 1471 | "engines": { 1472 | "node": ">=0.4" 1473 | }, 1474 | "funding": { 1475 | "url": "https://github.com/sponsors/ljharb" 1476 | } 1477 | }, 1478 | "node_modules/safe-array-concat/node_modules/isarray": { 1479 | "version": "2.0.5", 1480 | "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.5.tgz", 1481 | "integrity": "sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==" 1482 | }, 1483 | "node_modules/safe-buffer": { 1484 | "version": "5.2.1", 1485 | "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", 1486 | "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", 1487 | "funding": [ 1488 | { 1489 | "type": "github", 1490 | "url": "https://github.com/sponsors/feross" 1491 | }, 1492 | { 1493 | "type": "patreon", 1494 | "url": "https://www.patreon.com/feross" 1495 | }, 1496 | { 1497 | "type": "consulting", 1498 | "url": "https://feross.org/support" 1499 | } 1500 | ] 1501 | }, 1502 | "node_modules/safe-regex-test": { 1503 | "version": "1.0.3", 1504 | "resolved": "https://registry.npmjs.org/safe-regex-test/-/safe-regex-test-1.0.3.tgz", 1505 | "integrity": "sha512-CdASjNJPvRa7roO6Ra/gLYBTzYzzPyyBXxIMdGW3USQLyjWEls2RgW5UBTXaQVp+OrpeCK3bLem8smtmheoRuw==", 1506 | "dependencies": { 1507 | "call-bind": "^1.0.6", 1508 | "es-errors": "^1.3.0", 1509 | "is-regex": "^1.1.4" 1510 | }, 1511 | "engines": { 1512 | "node": ">= 0.4" 1513 | }, 1514 | "funding": { 1515 | "url": "https://github.com/sponsors/ljharb" 1516 | } 1517 | }, 1518 | "node_modules/safer-buffer": { 1519 | "version": "2.1.2", 1520 | "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", 1521 | "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" 1522 | }, 1523 | "node_modules/set-function-length": { 1524 | "version": "1.2.2", 1525 | "resolved": "https://registry.npmjs.org/set-function-length/-/set-function-length-1.2.2.tgz", 1526 | "integrity": "sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg==", 1527 | "dependencies": { 1528 | "define-data-property": "^1.1.4", 1529 | "es-errors": "^1.3.0", 1530 | "function-bind": "^1.1.2", 1531 | "get-intrinsic": "^1.2.4", 1532 | "gopd": "^1.0.1", 1533 | "has-property-descriptors": "^1.0.2" 1534 | }, 1535 | "engines": { 1536 | "node": ">= 0.4" 1537 | } 1538 | }, 1539 | "node_modules/set-function-name": { 1540 | "version": "2.0.2", 1541 | "resolved": "https://registry.npmjs.org/set-function-name/-/set-function-name-2.0.2.tgz", 1542 | "integrity": "sha512-7PGFlmtwsEADb0WYyvCMa1t+yke6daIG4Wirafur5kcf+MhUnPms1UeR0CKQdTZD81yESwMHbtn+TR+dMviakQ==", 1543 | "dependencies": { 1544 | "define-data-property": "^1.1.4", 1545 | "es-errors": "^1.3.0", 1546 | "functions-have-names": "^1.2.3", 1547 | "has-property-descriptors": "^1.0.2" 1548 | }, 1549 | "engines": { 1550 | "node": ">= 0.4" 1551 | } 1552 | }, 1553 | "node_modules/side-channel": { 1554 | "version": "1.0.6", 1555 | "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.6.tgz", 1556 | "integrity": "sha512-fDW/EZ6Q9RiO8eFG8Hj+7u/oW+XrPTIChwCOM2+th2A6OblDtYYIpve9m+KvI9Z4C9qSEXlaGR6bTEYHReuglA==", 1557 | "dependencies": { 1558 | "call-bind": "^1.0.7", 1559 | "es-errors": "^1.3.0", 1560 | "get-intrinsic": "^1.2.4", 1561 | "object-inspect": "^1.13.1" 1562 | }, 1563 | "engines": { 1564 | "node": ">= 0.4" 1565 | }, 1566 | "funding": { 1567 | "url": "https://github.com/sponsors/ljharb" 1568 | } 1569 | }, 1570 | "node_modules/sqlstring": { 1571 | "version": "2.3.1", 1572 | "resolved": "https://registry.npmjs.org/sqlstring/-/sqlstring-2.3.1.tgz", 1573 | "integrity": "sha512-ooAzh/7dxIG5+uDik1z/Rd1vli0+38izZhGzSa34FwR7IbelPWCCKSNIl8jlL/F7ERvy8CB2jNeM1E9i9mXMAQ==", 1574 | "engines": { 1575 | "node": ">= 0.6" 1576 | } 1577 | }, 1578 | "node_modules/sshpk": { 1579 | "version": "1.18.0", 1580 | "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.18.0.tgz", 1581 | "integrity": "sha512-2p2KJZTSqQ/I3+HX42EpYOa2l3f8Erv8MWKsy2I9uf4wA7yFIkXRffYdsx86y6z4vHtV8u7g+pPlr8/4ouAxsQ==", 1582 | "dependencies": { 1583 | "asn1": "~0.2.3", 1584 | "assert-plus": "^1.0.0", 1585 | "bcrypt-pbkdf": "^1.0.0", 1586 | "dashdash": "^1.12.0", 1587 | "ecc-jsbn": "~0.1.1", 1588 | "getpass": "^0.1.1", 1589 | "jsbn": "~0.1.0", 1590 | "safer-buffer": "^2.0.2", 1591 | "tweetnacl": "~0.14.0" 1592 | }, 1593 | "bin": { 1594 | "sshpk-conv": "bin/sshpk-conv", 1595 | "sshpk-sign": "bin/sshpk-sign", 1596 | "sshpk-verify": "bin/sshpk-verify" 1597 | }, 1598 | "engines": { 1599 | "node": ">=0.10.0" 1600 | } 1601 | }, 1602 | "node_modules/stealthy-require": { 1603 | "version": "1.1.1", 1604 | "resolved": "https://registry.npmjs.org/stealthy-require/-/stealthy-require-1.1.1.tgz", 1605 | "integrity": "sha512-ZnWpYnYugiOVEY5GkcuJK1io5V8QmNYChG62gSit9pQVGErXtrKuPC55ITaVSukmMta5qpMU7vqLt2Lnni4f/g==", 1606 | "engines": { 1607 | "node": ">=0.10.0" 1608 | } 1609 | }, 1610 | "node_modules/string_decoder": { 1611 | "version": "1.1.1", 1612 | "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", 1613 | "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", 1614 | "dependencies": { 1615 | "safe-buffer": "~5.1.0" 1616 | } 1617 | }, 1618 | "node_modules/string_decoder/node_modules/safe-buffer": { 1619 | "version": "5.1.2", 1620 | "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", 1621 | "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" 1622 | }, 1623 | "node_modules/string.prototype.trim": { 1624 | "version": "1.2.9", 1625 | "resolved": "https://registry.npmjs.org/string.prototype.trim/-/string.prototype.trim-1.2.9.tgz", 1626 | "integrity": "sha512-klHuCNxiMZ8MlsOihJhJEBJAiMVqU3Z2nEXWfWnIqjN0gEFS9J9+IxKozWWtQGcgoa1WUZzLjKPTr4ZHNFTFxw==", 1627 | "dependencies": { 1628 | "call-bind": "^1.0.7", 1629 | "define-properties": "^1.2.1", 1630 | "es-abstract": "^1.23.0", 1631 | "es-object-atoms": "^1.0.0" 1632 | }, 1633 | "engines": { 1634 | "node": ">= 0.4" 1635 | }, 1636 | "funding": { 1637 | "url": "https://github.com/sponsors/ljharb" 1638 | } 1639 | }, 1640 | "node_modules/string.prototype.trimend": { 1641 | "version": "1.0.8", 1642 | "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.8.tgz", 1643 | "integrity": "sha512-p73uL5VCHCO2BZZ6krwwQE3kCzM7NKmis8S//xEC6fQonchbum4eP6kR4DLEjQFO3Wnj3Fuo8NM0kOSjVdHjZQ==", 1644 | "dependencies": { 1645 | "call-bind": "^1.0.7", 1646 | "define-properties": "^1.2.1", 1647 | "es-object-atoms": "^1.0.0" 1648 | }, 1649 | "funding": { 1650 | "url": "https://github.com/sponsors/ljharb" 1651 | } 1652 | }, 1653 | "node_modules/string.prototype.trimstart": { 1654 | "version": "1.0.8", 1655 | "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.8.tgz", 1656 | "integrity": "sha512-UXSH262CSZY1tfu3G3Secr6uGLCFVPMhIqHjlgCUtCCcgihYc/xKs9djMTMUOb2j1mVSeU8EU6NWc/iQKU6Gfg==", 1657 | "dependencies": { 1658 | "call-bind": "^1.0.7", 1659 | "define-properties": "^1.2.1", 1660 | "es-object-atoms": "^1.0.0" 1661 | }, 1662 | "engines": { 1663 | "node": ">= 0.4" 1664 | }, 1665 | "funding": { 1666 | "url": "https://github.com/sponsors/ljharb" 1667 | } 1668 | }, 1669 | "node_modules/tough-cookie": { 1670 | "version": "4.1.3", 1671 | "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-4.1.3.tgz", 1672 | "integrity": "sha512-aX/y5pVRkfRnfmuX+OdbSdXvPe6ieKX/G2s7e98f4poJHnqH3281gDPm/metm6E/WRamfx7WC4HUqkWHfQHprw==", 1673 | "dependencies": { 1674 | "psl": "^1.1.33", 1675 | "punycode": "^2.1.1", 1676 | "universalify": "^0.2.0", 1677 | "url-parse": "^1.5.3" 1678 | }, 1679 | "engines": { 1680 | "node": ">=6" 1681 | } 1682 | }, 1683 | "node_modules/tunnel-agent": { 1684 | "version": "0.6.0", 1685 | "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz", 1686 | "integrity": "sha512-McnNiV1l8RYeY8tBgEpuodCC1mLUdbSN+CYBL7kJsJNInOP8UjDDEwdk6Mw60vdLLrr5NHKZhMAOSrR2NZuQ+w==", 1687 | "dependencies": { 1688 | "safe-buffer": "^5.0.1" 1689 | }, 1690 | "engines": { 1691 | "node": "*" 1692 | } 1693 | }, 1694 | "node_modules/tweetnacl": { 1695 | "version": "0.14.5", 1696 | "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz", 1697 | "integrity": "sha512-KXXFFdAbFXY4geFIwoyNK+f5Z1b7swfXABfL7HXCmoIWMKU3dmS26672A4EeQtDzLKy7SXmfBu51JolvEKwtGA==" 1698 | }, 1699 | "node_modules/typed-array-buffer": { 1700 | "version": "1.0.2", 1701 | "resolved": "https://registry.npmjs.org/typed-array-buffer/-/typed-array-buffer-1.0.2.tgz", 1702 | "integrity": "sha512-gEymJYKZtKXzzBzM4jqa9w6Q1Jjm7x2d+sh19AdsD4wqnMPDYyvwpsIc2Q/835kHuo3BEQ7CjelGhfTsoBb2MQ==", 1703 | "dependencies": { 1704 | "call-bind": "^1.0.7", 1705 | "es-errors": "^1.3.0", 1706 | "is-typed-array": "^1.1.13" 1707 | }, 1708 | "engines": { 1709 | "node": ">= 0.4" 1710 | } 1711 | }, 1712 | "node_modules/typed-array-byte-length": { 1713 | "version": "1.0.1", 1714 | "resolved": "https://registry.npmjs.org/typed-array-byte-length/-/typed-array-byte-length-1.0.1.tgz", 1715 | "integrity": "sha512-3iMJ9q0ao7WE9tWcaYKIptkNBuOIcZCCT0d4MRvuuH88fEoEH62IuQe0OtraD3ebQEoTRk8XCBoknUNc1Y67pw==", 1716 | "dependencies": { 1717 | "call-bind": "^1.0.7", 1718 | "for-each": "^0.3.3", 1719 | "gopd": "^1.0.1", 1720 | "has-proto": "^1.0.3", 1721 | "is-typed-array": "^1.1.13" 1722 | }, 1723 | "engines": { 1724 | "node": ">= 0.4" 1725 | }, 1726 | "funding": { 1727 | "url": "https://github.com/sponsors/ljharb" 1728 | } 1729 | }, 1730 | "node_modules/typed-array-byte-offset": { 1731 | "version": "1.0.2", 1732 | "resolved": "https://registry.npmjs.org/typed-array-byte-offset/-/typed-array-byte-offset-1.0.2.tgz", 1733 | "integrity": "sha512-Ous0vodHa56FviZucS2E63zkgtgrACj7omjwd/8lTEMEPFFyjfixMZ1ZXenpgCFBBt4EC1J2XsyVS2gkG0eTFA==", 1734 | "dependencies": { 1735 | "available-typed-arrays": "^1.0.7", 1736 | "call-bind": "^1.0.7", 1737 | "for-each": "^0.3.3", 1738 | "gopd": "^1.0.1", 1739 | "has-proto": "^1.0.3", 1740 | "is-typed-array": "^1.1.13" 1741 | }, 1742 | "engines": { 1743 | "node": ">= 0.4" 1744 | }, 1745 | "funding": { 1746 | "url": "https://github.com/sponsors/ljharb" 1747 | } 1748 | }, 1749 | "node_modules/typed-array-length": { 1750 | "version": "1.0.6", 1751 | "resolved": "https://registry.npmjs.org/typed-array-length/-/typed-array-length-1.0.6.tgz", 1752 | "integrity": "sha512-/OxDN6OtAk5KBpGb28T+HZc2M+ADtvRxXrKKbUwtsLgdoxgX13hyy7ek6bFRl5+aBs2yZzB0c4CnQfAtVypW/g==", 1753 | "dependencies": { 1754 | "call-bind": "^1.0.7", 1755 | "for-each": "^0.3.3", 1756 | "gopd": "^1.0.1", 1757 | "has-proto": "^1.0.3", 1758 | "is-typed-array": "^1.1.13", 1759 | "possible-typed-array-names": "^1.0.0" 1760 | }, 1761 | "engines": { 1762 | "node": ">= 0.4" 1763 | }, 1764 | "funding": { 1765 | "url": "https://github.com/sponsors/ljharb" 1766 | } 1767 | }, 1768 | "node_modules/unbox-primitive": { 1769 | "version": "1.0.2", 1770 | "resolved": "https://registry.npmjs.org/unbox-primitive/-/unbox-primitive-1.0.2.tgz", 1771 | "integrity": "sha512-61pPlCD9h51VoreyJ0BReideM3MDKMKnh6+V9L08331ipq6Q8OFXZYiqP6n/tbHx4s5I9uRhcye6BrbkizkBDw==", 1772 | "dependencies": { 1773 | "call-bind": "^1.0.2", 1774 | "has-bigints": "^1.0.2", 1775 | "has-symbols": "^1.0.3", 1776 | "which-boxed-primitive": "^1.0.2" 1777 | }, 1778 | "funding": { 1779 | "url": "https://github.com/sponsors/ljharb" 1780 | } 1781 | }, 1782 | "node_modules/universalify": { 1783 | "version": "0.2.0", 1784 | "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.2.0.tgz", 1785 | "integrity": "sha512-CJ1QgKmNg3CwvAv/kOFmtnEN05f0D/cn9QntgNOQlQF9dgvVTHj3t+8JPdjqawCHk7V/KA+fbUqzZ9XWhcqPUg==", 1786 | "engines": { 1787 | "node": ">= 4.0.0" 1788 | } 1789 | }, 1790 | "node_modules/uri-js": { 1791 | "version": "4.4.1", 1792 | "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", 1793 | "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", 1794 | "peer": true, 1795 | "dependencies": { 1796 | "punycode": "^2.1.0" 1797 | } 1798 | }, 1799 | "node_modules/url-parse": { 1800 | "version": "1.5.10", 1801 | "resolved": "https://registry.npmjs.org/url-parse/-/url-parse-1.5.10.tgz", 1802 | "integrity": "sha512-WypcfiRhfeUP9vvF0j6rw0J3hrWrw6iZv3+22h6iRMJ/8z1Tj6XfLP4DsUix5MhMPnXpiHDoKyoZ/bdCkwBCiQ==", 1803 | "dependencies": { 1804 | "querystringify": "^2.1.1", 1805 | "requires-port": "^1.0.0" 1806 | } 1807 | }, 1808 | "node_modules/util-deprecate": { 1809 | "version": "1.0.2", 1810 | "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", 1811 | "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==" 1812 | }, 1813 | "node_modules/uuid": { 1814 | "version": "8.3.2", 1815 | "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz", 1816 | "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==", 1817 | "bin": { 1818 | "uuid": "dist/bin/uuid" 1819 | } 1820 | }, 1821 | "node_modules/verror": { 1822 | "version": "1.10.0", 1823 | "resolved": "https://registry.npmjs.org/verror/-/verror-1.10.0.tgz", 1824 | "integrity": "sha512-ZZKSmDAEFOijERBLkmYfJ+vmk3w+7hOLYDNkRCuRuMJGEmqYNCNLyBBFwWKVMhfwaEF3WOd0Zlw86U/WC/+nYw==", 1825 | "engines": [ 1826 | "node >=0.6.0" 1827 | ], 1828 | "dependencies": { 1829 | "assert-plus": "^1.0.0", 1830 | "core-util-is": "1.0.2", 1831 | "extsprintf": "^1.2.0" 1832 | } 1833 | }, 1834 | "node_modules/verror/node_modules/core-util-is": { 1835 | "version": "1.0.2", 1836 | "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", 1837 | "integrity": "sha512-3lqz5YjWTYnW6dlDa5TLaTCcShfar1e40rmcJVwCBJC6mWlFuj0eCHIElmG1g5kyuJ/GD+8Wn4FFCcz4gJPfaQ==" 1838 | }, 1839 | "node_modules/which-boxed-primitive": { 1840 | "version": "1.0.2", 1841 | "resolved": "https://registry.npmjs.org/which-boxed-primitive/-/which-boxed-primitive-1.0.2.tgz", 1842 | "integrity": "sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg==", 1843 | "dependencies": { 1844 | "is-bigint": "^1.0.1", 1845 | "is-boolean-object": "^1.1.0", 1846 | "is-number-object": "^1.0.4", 1847 | "is-string": "^1.0.5", 1848 | "is-symbol": "^1.0.3" 1849 | }, 1850 | "funding": { 1851 | "url": "https://github.com/sponsors/ljharb" 1852 | } 1853 | }, 1854 | "node_modules/which-typed-array": { 1855 | "version": "1.1.15", 1856 | "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.15.tgz", 1857 | "integrity": "sha512-oV0jmFtUky6CXfkqehVvBP/LSWJ2sy4vWMioiENyJLePrBO/yKyV9OyJySfAKosh+RYkIl5zJCNZ8/4JncrpdA==", 1858 | "dependencies": { 1859 | "available-typed-arrays": "^1.0.7", 1860 | "call-bind": "^1.0.7", 1861 | "for-each": "^0.3.3", 1862 | "gopd": "^1.0.1", 1863 | "has-tostringtag": "^1.0.2" 1864 | }, 1865 | "engines": { 1866 | "node": ">= 0.4" 1867 | }, 1868 | "funding": { 1869 | "url": "https://github.com/sponsors/ljharb" 1870 | } 1871 | }, 1872 | "node_modules/wrappy": { 1873 | "version": "1.0.2", 1874 | "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", 1875 | "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==" 1876 | }, 1877 | "node_modules/yallist": { 1878 | "version": "4.0.0", 1879 | "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", 1880 | "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" 1881 | } 1882 | } 1883 | } 1884 | -------------------------------------------------------------------------------- /bot/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "telegram-downloader-bot", 3 | "version": "1.0.0", 4 | "description": "This telegram bot can download youtube videos.", 5 | "main": "bot.js", 6 | "scripts": { 7 | "test": "echo \"Error: no test specified\" && exit 1" 8 | }, 9 | "repository": { 10 | "type": "git", 11 | "url": "git+https://github.com/jayesh-saini/telegram-downloader-bot.git" 12 | }, 13 | "author": "Jayesh Saini", 14 | "license": "ISC", 15 | "bugs": { 16 | "url": "https://github.com/jayesh-saini/telegram-downloader-bot/issues" 17 | }, 18 | "homepage": "https://github.com/jayesh-saini/telegram-downloader-bot#readme", 19 | "dependencies": { 20 | "dotenv": "^16.4.5", 21 | "mysql": "^2.18.1", 22 | "node-telegram-bot-api": "^0.65.1", 23 | "redis": "^4.6.13" 24 | } 25 | } 26 | -------------------------------------------------------------------------------- /bot/queue.js: -------------------------------------------------------------------------------- 1 | const redis = require('redis') 2 | 3 | let queue = null, subscriber = null, cache = null; 4 | 5 | (() => { 6 | return new Promise(async (resolve, reject) => { 7 | queue = redis.createClient( { host: "redis", port: 6379 } ) 8 | subscriber = redis.createClient( { host: "redis", port: 6379 } ) 9 | publisher = redis.createClient( { host: "redis", port: 6379 } ) 10 | cache = redis.createClient( { host: "redis", port: 6379 } ) 11 | 12 | await subscriber.connect() 13 | await publisher.connect() 14 | await cache.connect() 15 | await queue.connect() 16 | 17 | queue.on("error", (error) => { 18 | console.error(`Error : ${error}`) 19 | return reject(error) 20 | }) 21 | 22 | console.log('Redis connected!'); 23 | resolve(queue) 24 | }) 25 | })() 26 | 27 | exports.cache = cache 28 | exports.subscriber = subscriber 29 | 30 | exports.push = async (value) => { 31 | try { 32 | const r = await queue.lPush('youtube_download_queue', value) 33 | return r 34 | } catch (error) { 35 | console.log(error) 36 | } 37 | } 38 | 39 | exports.pop = async (value) => { 40 | return new Promise(async(resolve, reject) => { 41 | try { 42 | const data = await queue.rPop('youtube_download_queue') 43 | return resolve(data) 44 | } catch (error) { 45 | console.log(error) 46 | return reject(error) 47 | } 48 | }) 49 | } -------------------------------------------------------------------------------- /download_worker/download_worker.py: -------------------------------------------------------------------------------- 1 | import redis 2 | from time import sleep 3 | from pytube import YouTube 4 | import mysql.connector 5 | import uuid 6 | import os 7 | import json 8 | from dotenv import load_dotenv 9 | 10 | load_dotenv() 11 | queue = redis.Redis(decode_responses=True) 12 | 13 | publicYtDownloadPath = os.path.join(os.getcwd(), "downloads") 14 | 15 | def log(id, chat_id, rsp, name, username): 16 | try: 17 | mydb = mysql.connector.connect( 18 | host=os.getenv("DB_HOSTNAME"), 19 | user=os.getenv("DB_USERNAME"), 20 | password=os.getenv("DB_PASSWORD"), 21 | database=os.getenv("DB_DATABASE"), 22 | auth_plugin=os.getenv("DB_AUTH_PLUGIN") 23 | ) 24 | 25 | statement = "INSERT INTO big_file_urls(UUID, CHAT_ID, FILE_NAME, NAME, USERNAME) VALUES(%s, %s, %s, %s, %s)" 26 | 27 | data = (id, chat_id, rsp, name, username) 28 | cur = mydb.cursor() 29 | cur.execute(statement, data) 30 | mydb.commit() 31 | cur.close() 32 | mydb.close() 33 | return 1 34 | except mysql.connector.Error as my_error: 35 | print(my_error) 36 | return 0 37 | 38 | while True: 39 | 40 | data = json.loads(queue.brpop("youtube_download_queue")[1]) 41 | print('----------') 42 | video_url = data["video_url"] 43 | name = data["name"] 44 | username = data["username"] 45 | chat_id = data["chat_id"] 46 | 47 | yt = YouTube(video_url, use_oauth=True, allow_oauth_cache=True) 48 | 49 | print("Downloading: ", yt.title) 50 | rsp = yt.streams.get_highest_resolution().download(publicYtDownloadPath) 51 | print("File Path: ", rsp) 52 | fileSize = os.path.getsize(rsp) 53 | id = str(uuid.uuid4()) 54 | 55 | r = log(id, chat_id, rsp, name, username) 56 | if (r == 1): 57 | queue.publish('download_complete', id) 58 | else: 59 | print("Unable to update DB!") -------------------------------------------------------------------------------- /download_worker/requirements.txt: -------------------------------------------------------------------------------- 1 | redis 2 | pytube 3 | mysql.connector 4 | uuid 5 | dotenv -------------------------------------------------------------------------------- /env.sample: -------------------------------------------------------------------------------- 1 | TELEGRAM_BOT_TOKEN="5xxxxxxxx9:Axxxxxxxxxxxxxxxxxxxxxxxxxw" 2 | DB_HOSTNAME="localhost" 3 | DB_USERNAME="" 4 | DB_PASSWORD="" 5 | DB_DATABASE="" 6 | DB_AUTH_PLUGIN="mysql_native_password" 7 | NGROK_AUTHTOKEN="2xxxxxxxxxxxxxxxxxxxxxxxxxg" -------------------------------------------------------------------------------- /file_server/db.js: -------------------------------------------------------------------------------- 1 | const mysql = require('mysql') 2 | 3 | // ----------- DB -------------- 4 | const sql = mysql.createPool({ 5 | host: process.env.DB_HOSTNAME, 6 | user: process.env.DB_USERNAME, 7 | password: process.env.DB_PASSWORD, 8 | database: process.env.DB_DATABASE, 9 | debug: false 10 | }) 11 | 12 | sql.getConnection((err, connection) => { 13 | if (err) { 14 | console.log(err) 15 | process.exit(-1) 16 | } else { 17 | console.log('Database connected successfully'); 18 | connection.release(); 19 | } 20 | }) 21 | 22 | module.exports = { sql } -------------------------------------------------------------------------------- /file_server/package-lock.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "file_server", 3 | "version": "1.0.0", 4 | "lockfileVersion": 3, 5 | "requires": true, 6 | "packages": { 7 | "": { 8 | "name": "file_server", 9 | "version": "1.0.0", 10 | "license": "ISC", 11 | "dependencies": { 12 | "@ngrok/ngrok": "^1.2.0", 13 | "dotenv": "^16.4.5", 14 | "mysql": "^2.18.1", 15 | "redis": "^4.6.13" 16 | } 17 | }, 18 | "node_modules/@ngrok/ngrok": { 19 | "version": "1.2.0", 20 | "resolved": "https://registry.npmjs.org/@ngrok/ngrok/-/ngrok-1.2.0.tgz", 21 | "integrity": "sha512-KOM7lHTKzsQ8IQewgigOGynJKHQRt3z0lHyEgK63H2wq9tI47tWlxWYmrQoqWLcvPgP2JA24nXWeMf/ZE2BaZg==", 22 | "engines": { 23 | "node": ">= 10" 24 | }, 25 | "optionalDependencies": { 26 | "@ngrok/ngrok-android-arm-eabi": "1.2.0", 27 | "@ngrok/ngrok-android-arm64": "1.2.0", 28 | "@ngrok/ngrok-darwin-arm64": "1.2.0", 29 | "@ngrok/ngrok-darwin-universal": "1.2.0", 30 | "@ngrok/ngrok-darwin-x64": "1.2.0", 31 | "@ngrok/ngrok-freebsd-x64": "1.2.0", 32 | "@ngrok/ngrok-linux-arm-gnueabihf": "1.2.0", 33 | "@ngrok/ngrok-linux-arm64-gnu": "1.2.0", 34 | "@ngrok/ngrok-linux-arm64-musl": "1.2.0", 35 | "@ngrok/ngrok-linux-x64-gnu": "1.2.0", 36 | "@ngrok/ngrok-linux-x64-musl": "1.2.0", 37 | "@ngrok/ngrok-win32-ia32-msvc": "1.2.0", 38 | "@ngrok/ngrok-win32-x64-msvc": "1.2.0" 39 | } 40 | }, 41 | "node_modules/@ngrok/ngrok-android-arm-eabi": { 42 | "version": "1.2.0", 43 | "resolved": "https://registry.npmjs.org/@ngrok/ngrok-android-arm-eabi/-/ngrok-android-arm-eabi-1.2.0.tgz", 44 | "integrity": "sha512-eGSZ443VQDfLLCef7E2GDX8oRYp+Fahr7nGeNY7nHu6bMEiYA92VpFOlpO9iF6HsyK/94NJiN3CbLJ7aMUHmJA==", 45 | "cpu": [ 46 | "arm" 47 | ], 48 | "optional": true, 49 | "os": [ 50 | "android" 51 | ], 52 | "engines": { 53 | "node": ">= 10" 54 | } 55 | }, 56 | "node_modules/@ngrok/ngrok-android-arm64": { 57 | "version": "1.2.0", 58 | "resolved": "https://registry.npmjs.org/@ngrok/ngrok-android-arm64/-/ngrok-android-arm64-1.2.0.tgz", 59 | "integrity": "sha512-nwGcgK4OkFKNxEVu4Q4R8LR15OUvfESJIQ3gS5frMwa0r/FdHKNc5rmUfGSFhGGg+4ttiTzlEKMHW2tEp12FYQ==", 60 | "cpu": [ 61 | "arm64" 62 | ], 63 | "optional": true, 64 | "os": [ 65 | "android" 66 | ], 67 | "engines": { 68 | "node": ">= 10" 69 | } 70 | }, 71 | "node_modules/@ngrok/ngrok-darwin-arm64": { 72 | "version": "1.2.0", 73 | "resolved": "https://registry.npmjs.org/@ngrok/ngrok-darwin-arm64/-/ngrok-darwin-arm64-1.2.0.tgz", 74 | "integrity": "sha512-Df0U42wYty4UnYB9Bm+bo3akIVe0lOX/ejDSCrPABK0Cf65184ZcqUu9kBabXQRag5rTq4uG7TzCGhaMXV44RQ==", 75 | "cpu": [ 76 | "arm64" 77 | ], 78 | "optional": true, 79 | "os": [ 80 | "darwin" 81 | ], 82 | "engines": { 83 | "node": ">= 10" 84 | } 85 | }, 86 | "node_modules/@ngrok/ngrok-darwin-universal": { 87 | "version": "1.2.0", 88 | "resolved": "https://registry.npmjs.org/@ngrok/ngrok-darwin-universal/-/ngrok-darwin-universal-1.2.0.tgz", 89 | "integrity": "sha512-z5srpqZjQKomLBsY/b2Oc44V4BqIqE7Tn3YdsN3ucZg4yH9aFTHLiD2Ioubb/8u48mRvwsT9FqFTGlswWA8dew==", 90 | "optional": true, 91 | "os": [ 92 | "darwin" 93 | ], 94 | "engines": { 95 | "node": ">= 10" 96 | } 97 | }, 98 | "node_modules/@ngrok/ngrok-darwin-x64": { 99 | "version": "1.2.0", 100 | "resolved": "https://registry.npmjs.org/@ngrok/ngrok-darwin-x64/-/ngrok-darwin-x64-1.2.0.tgz", 101 | "integrity": "sha512-EkH2qFoXyaZkLn2Nw5NvK1F6T3332xzTVXeJMF/oLme2K567rRHmFUfN9mUORm1snHO+Ct/uW9Tciz6+hlyTLg==", 102 | "cpu": [ 103 | "x64" 104 | ], 105 | "optional": true, 106 | "os": [ 107 | "darwin" 108 | ], 109 | "engines": { 110 | "node": ">= 10" 111 | } 112 | }, 113 | "node_modules/@ngrok/ngrok-freebsd-x64": { 114 | "version": "1.2.0", 115 | "resolved": "https://registry.npmjs.org/@ngrok/ngrok-freebsd-x64/-/ngrok-freebsd-x64-1.2.0.tgz", 116 | "integrity": "sha512-mwD1QBKsWV7J8IGYCsLvPvk6yoMpwlNsCt7d/nkrw2AQvx0UJgZw+q3YW93Ii7r392DtvmzDDO3jxlx/Gl0mXQ==", 117 | "cpu": [ 118 | "x64" 119 | ], 120 | "optional": true, 121 | "os": [ 122 | "freebsd" 123 | ], 124 | "engines": { 125 | "node": ">= 10" 126 | } 127 | }, 128 | "node_modules/@ngrok/ngrok-linux-arm-gnueabihf": { 129 | "version": "1.2.0", 130 | "resolved": "https://registry.npmjs.org/@ngrok/ngrok-linux-arm-gnueabihf/-/ngrok-linux-arm-gnueabihf-1.2.0.tgz", 131 | "integrity": "sha512-yvDEgCSL/EAAHV5EuAjULKZ8/P/i5UCN31oyp8x3hPIpTl2Lq9GfPfoAIvpM8segsbkXwlFPIA7FjMbNweQa2A==", 132 | "cpu": [ 133 | "arm" 134 | ], 135 | "optional": true, 136 | "os": [ 137 | "linux" 138 | ], 139 | "engines": { 140 | "node": ">= 10" 141 | } 142 | }, 143 | "node_modules/@ngrok/ngrok-linux-arm64-gnu": { 144 | "version": "1.2.0", 145 | "resolved": "https://registry.npmjs.org/@ngrok/ngrok-linux-arm64-gnu/-/ngrok-linux-arm64-gnu-1.2.0.tgz", 146 | "integrity": "sha512-fEVMO7OiLTHWRDBSCvXtLhZ8C9l9aCUBduYXqCtIRx0unczEX7/jpAAD0rq32eioNfywj30s0RZRusYdrPbDTQ==", 147 | "cpu": [ 148 | "arm64" 149 | ], 150 | "optional": true, 151 | "os": [ 152 | "linux" 153 | ], 154 | "engines": { 155 | "node": ">= 10" 156 | } 157 | }, 158 | "node_modules/@ngrok/ngrok-linux-arm64-musl": { 159 | "version": "1.2.0", 160 | "resolved": "https://registry.npmjs.org/@ngrok/ngrok-linux-arm64-musl/-/ngrok-linux-arm64-musl-1.2.0.tgz", 161 | "integrity": "sha512-3P6YRcID3A8J+uOEf6JIUFbEnaS4SM2dDxqYgjkoo5Qjjn/V3tZdMpbGzs/R6ly9eZ8vPQNI6A4mtHGmfHjaTA==", 162 | "cpu": [ 163 | "arm64" 164 | ], 165 | "optional": true, 166 | "os": [ 167 | "linux" 168 | ], 169 | "engines": { 170 | "node": ">= 10" 171 | } 172 | }, 173 | "node_modules/@ngrok/ngrok-linux-x64-gnu": { 174 | "version": "1.2.0", 175 | "resolved": "https://registry.npmjs.org/@ngrok/ngrok-linux-x64-gnu/-/ngrok-linux-x64-gnu-1.2.0.tgz", 176 | "integrity": "sha512-geiZ4rTzTySIbLyxEkIV7aPdJ2hr3cKIGv1nN7uFzJPHPwxwRYLctyXHOrjbNLaKUcoEzuyqHVhu2/qUL9FZDg==", 177 | "cpu": [ 178 | "x64" 179 | ], 180 | "optional": true, 181 | "os": [ 182 | "linux" 183 | ], 184 | "engines": { 185 | "node": ">= 10" 186 | } 187 | }, 188 | "node_modules/@ngrok/ngrok-linux-x64-musl": { 189 | "version": "1.2.0", 190 | "resolved": "https://registry.npmjs.org/@ngrok/ngrok-linux-x64-musl/-/ngrok-linux-x64-musl-1.2.0.tgz", 191 | "integrity": "sha512-s4nfAUuCM2X4T+Z9RWzD3NbhEnzeTrpsQq51RNQ9JEjN6guab3FdT/Bn9nXkULJdZOPvqguHg878KmTwi8t3mA==", 192 | "cpu": [ 193 | "x64" 194 | ], 195 | "optional": true, 196 | "os": [ 197 | "linux" 198 | ], 199 | "engines": { 200 | "node": ">= 10" 201 | } 202 | }, 203 | "node_modules/@ngrok/ngrok-win32-ia32-msvc": { 204 | "version": "1.2.0", 205 | "resolved": "https://registry.npmjs.org/@ngrok/ngrok-win32-ia32-msvc/-/ngrok-win32-ia32-msvc-1.2.0.tgz", 206 | "integrity": "sha512-R4ovlTz22AuP7trn8CnzXqDrxFuStpx2657AMDSop/3yhS1hCxTqycRSQwXqhJisV5midaJY/e7YwNBmYnbUIA==", 207 | "cpu": [ 208 | "ia32" 209 | ], 210 | "optional": true, 211 | "os": [ 212 | "win32" 213 | ], 214 | "engines": { 215 | "node": ">= 10" 216 | } 217 | }, 218 | "node_modules/@ngrok/ngrok-win32-x64-msvc": { 219 | "version": "1.2.0", 220 | "resolved": "https://registry.npmjs.org/@ngrok/ngrok-win32-x64-msvc/-/ngrok-win32-x64-msvc-1.2.0.tgz", 221 | "integrity": "sha512-A5sIaZ3pXLWZO5ft0o4oyNWg6itCAaZ4Mln8Y/sMsx4AjAcaHqBod1J2We2jt5Et52sr5JRaDwBokz84ZUNi6A==", 222 | "cpu": [ 223 | "x64" 224 | ], 225 | "optional": true, 226 | "os": [ 227 | "win32" 228 | ], 229 | "engines": { 230 | "node": ">= 10" 231 | } 232 | }, 233 | "node_modules/@redis/bloom": { 234 | "version": "1.2.0", 235 | "resolved": "https://registry.npmjs.org/@redis/bloom/-/bloom-1.2.0.tgz", 236 | "integrity": "sha512-HG2DFjYKbpNmVXsa0keLHp/3leGJz1mjh09f2RLGGLQZzSHpkmZWuwJbAvo3QcRY8p80m5+ZdXZdYOSBLlp7Cg==", 237 | "peerDependencies": { 238 | "@redis/client": "^1.0.0" 239 | } 240 | }, 241 | "node_modules/@redis/client": { 242 | "version": "1.5.14", 243 | "resolved": "https://registry.npmjs.org/@redis/client/-/client-1.5.14.tgz", 244 | "integrity": "sha512-YGn0GqsRBFUQxklhY7v562VMOP0DcmlrHHs3IV1mFE3cbxe31IITUkqhBcIhVSI/2JqtWAJXg5mjV4aU+zD0HA==", 245 | "dependencies": { 246 | "cluster-key-slot": "1.1.2", 247 | "generic-pool": "3.9.0", 248 | "yallist": "4.0.0" 249 | }, 250 | "engines": { 251 | "node": ">=14" 252 | } 253 | }, 254 | "node_modules/@redis/graph": { 255 | "version": "1.1.1", 256 | "resolved": "https://registry.npmjs.org/@redis/graph/-/graph-1.1.1.tgz", 257 | "integrity": "sha512-FEMTcTHZozZciLRl6GiiIB4zGm5z5F3F6a6FZCyrfxdKOhFlGkiAqlexWMBzCi4DcRoyiOsuLfW+cjlGWyExOw==", 258 | "peerDependencies": { 259 | "@redis/client": "^1.0.0" 260 | } 261 | }, 262 | "node_modules/@redis/json": { 263 | "version": "1.0.6", 264 | "resolved": "https://registry.npmjs.org/@redis/json/-/json-1.0.6.tgz", 265 | "integrity": "sha512-rcZO3bfQbm2zPRpqo82XbW8zg4G/w4W3tI7X8Mqleq9goQjAGLL7q/1n1ZX4dXEAmORVZ4s1+uKLaUOg7LrUhw==", 266 | "peerDependencies": { 267 | "@redis/client": "^1.0.0" 268 | } 269 | }, 270 | "node_modules/@redis/search": { 271 | "version": "1.1.6", 272 | "resolved": "https://registry.npmjs.org/@redis/search/-/search-1.1.6.tgz", 273 | "integrity": "sha512-mZXCxbTYKBQ3M2lZnEddwEAks0Kc7nauire8q20oA0oA/LoA+E/b5Y5KZn232ztPb1FkIGqo12vh3Lf+Vw5iTw==", 274 | "peerDependencies": { 275 | "@redis/client": "^1.0.0" 276 | } 277 | }, 278 | "node_modules/@redis/time-series": { 279 | "version": "1.0.5", 280 | "resolved": "https://registry.npmjs.org/@redis/time-series/-/time-series-1.0.5.tgz", 281 | "integrity": "sha512-IFjIgTusQym2B5IZJG3XKr5llka7ey84fw/NOYqESP5WUfQs9zz1ww/9+qoz4ka/S6KcGBodzlCeZ5UImKbscg==", 282 | "peerDependencies": { 283 | "@redis/client": "^1.0.0" 284 | } 285 | }, 286 | "node_modules/bignumber.js": { 287 | "version": "9.0.0", 288 | "resolved": "https://registry.npmjs.org/bignumber.js/-/bignumber.js-9.0.0.tgz", 289 | "integrity": "sha512-t/OYhhJ2SD+YGBQcjY8GzzDHEk9f3nerxjtfa6tlMXfe7frs/WozhvCNoGvpM0P3bNf3Gq5ZRMlGr5f3r4/N8A==", 290 | "engines": { 291 | "node": "*" 292 | } 293 | }, 294 | "node_modules/cluster-key-slot": { 295 | "version": "1.1.2", 296 | "resolved": "https://registry.npmjs.org/cluster-key-slot/-/cluster-key-slot-1.1.2.tgz", 297 | "integrity": "sha512-RMr0FhtfXemyinomL4hrWcYJxmX6deFdCxpJzhDttxgO1+bcCnkk+9drydLVDmAMG7NE6aN/fl4F7ucU/90gAA==", 298 | "engines": { 299 | "node": ">=0.10.0" 300 | } 301 | }, 302 | "node_modules/core-util-is": { 303 | "version": "1.0.3", 304 | "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.3.tgz", 305 | "integrity": "sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==" 306 | }, 307 | "node_modules/dotenv": { 308 | "version": "16.4.5", 309 | "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-16.4.5.tgz", 310 | "integrity": "sha512-ZmdL2rui+eB2YwhsWzjInR8LldtZHGDoQ1ugH85ppHKwpUHL7j7rN0Ti9NCnGiQbhaZ11FpR+7ao1dNsmduNUg==", 311 | "engines": { 312 | "node": ">=12" 313 | }, 314 | "funding": { 315 | "url": "https://dotenvx.com" 316 | } 317 | }, 318 | "node_modules/generic-pool": { 319 | "version": "3.9.0", 320 | "resolved": "https://registry.npmjs.org/generic-pool/-/generic-pool-3.9.0.tgz", 321 | "integrity": "sha512-hymDOu5B53XvN4QT9dBmZxPX4CWhBPPLguTZ9MMFeFa/Kg0xWVfylOVNlJji/E7yTZWFd/q9GO5TxDLq156D7g==", 322 | "engines": { 323 | "node": ">= 4" 324 | } 325 | }, 326 | "node_modules/inherits": { 327 | "version": "2.0.4", 328 | "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", 329 | "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" 330 | }, 331 | "node_modules/isarray": { 332 | "version": "1.0.0", 333 | "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", 334 | "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==" 335 | }, 336 | "node_modules/mysql": { 337 | "version": "2.18.1", 338 | "resolved": "https://registry.npmjs.org/mysql/-/mysql-2.18.1.tgz", 339 | "integrity": "sha512-Bca+gk2YWmqp2Uf6k5NFEurwY/0td0cpebAucFpY/3jhrwrVGuxU2uQFCHjU19SJfje0yQvi+rVWdq78hR5lig==", 340 | "dependencies": { 341 | "bignumber.js": "9.0.0", 342 | "readable-stream": "2.3.7", 343 | "safe-buffer": "5.1.2", 344 | "sqlstring": "2.3.1" 345 | }, 346 | "engines": { 347 | "node": ">= 0.6" 348 | } 349 | }, 350 | "node_modules/process-nextick-args": { 351 | "version": "2.0.1", 352 | "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", 353 | "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==" 354 | }, 355 | "node_modules/readable-stream": { 356 | "version": "2.3.7", 357 | "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", 358 | "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", 359 | "dependencies": { 360 | "core-util-is": "~1.0.0", 361 | "inherits": "~2.0.3", 362 | "isarray": "~1.0.0", 363 | "process-nextick-args": "~2.0.0", 364 | "safe-buffer": "~5.1.1", 365 | "string_decoder": "~1.1.1", 366 | "util-deprecate": "~1.0.1" 367 | } 368 | }, 369 | "node_modules/redis": { 370 | "version": "4.6.13", 371 | "resolved": "https://registry.npmjs.org/redis/-/redis-4.6.13.tgz", 372 | "integrity": "sha512-MHgkS4B+sPjCXpf+HfdetBwbRz6vCtsceTmw1pHNYJAsYxrfpOP6dz+piJWGos8wqG7qb3vj/Rrc5qOlmInUuA==", 373 | "dependencies": { 374 | "@redis/bloom": "1.2.0", 375 | "@redis/client": "1.5.14", 376 | "@redis/graph": "1.1.1", 377 | "@redis/json": "1.0.6", 378 | "@redis/search": "1.1.6", 379 | "@redis/time-series": "1.0.5" 380 | } 381 | }, 382 | "node_modules/safe-buffer": { 383 | "version": "5.1.2", 384 | "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", 385 | "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" 386 | }, 387 | "node_modules/sqlstring": { 388 | "version": "2.3.1", 389 | "resolved": "https://registry.npmjs.org/sqlstring/-/sqlstring-2.3.1.tgz", 390 | "integrity": "sha512-ooAzh/7dxIG5+uDik1z/Rd1vli0+38izZhGzSa34FwR7IbelPWCCKSNIl8jlL/F7ERvy8CB2jNeM1E9i9mXMAQ==", 391 | "engines": { 392 | "node": ">= 0.6" 393 | } 394 | }, 395 | "node_modules/string_decoder": { 396 | "version": "1.1.1", 397 | "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", 398 | "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", 399 | "dependencies": { 400 | "safe-buffer": "~5.1.0" 401 | } 402 | }, 403 | "node_modules/util-deprecate": { 404 | "version": "1.0.2", 405 | "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", 406 | "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==" 407 | }, 408 | "node_modules/yallist": { 409 | "version": "4.0.0", 410 | "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", 411 | "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" 412 | } 413 | } 414 | } 415 | -------------------------------------------------------------------------------- /file_server/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "file_server", 3 | "version": "1.0.0", 4 | "description": "This file server would be required to download the video/audio files >50 MB, as telegram has limit of 50 MB.", 5 | "main": "server.js", 6 | "scripts": { 7 | "test": "echo \"Error: no test specified\" && exit 1", 8 | "start": "node server.js" 9 | }, 10 | "author": "Jayesh Saini", 11 | "license": "ISC", 12 | "dependencies": { 13 | "@ngrok/ngrok": "^1.2.0", 14 | "dotenv": "^16.4.5", 15 | "mysql": "^2.18.1", 16 | "redis": "^4.6.13" 17 | } 18 | } 19 | -------------------------------------------------------------------------------- /file_server/server.js: -------------------------------------------------------------------------------- 1 | require("dotenv").config() 2 | const url = require("url") 3 | const http = require('http') 4 | const ngrok = require('@ngrok/ngrok') 5 | const redis = require('redis') 6 | const { sql } = require('./db') 7 | const fs = require("fs") 8 | 9 | let NGROK_BASE_URL = ""; 10 | let cache = null, publisher = null; 11 | 12 | (async () => { 13 | cache = redis.createClient() 14 | publisher = redis.createClient() 15 | 16 | await cache.connect() 17 | await publisher.connect() 18 | 19 | cache.on("error", (error) => { 20 | console.error(`Error : ${error}`) 21 | }) 22 | 23 | console.log('Redis connected!') 24 | })() 25 | 26 | // Create webserver 27 | http.createServer((req, res) => { 28 | console.log(req.url) 29 | var requestedURL = req.url 30 | if (requestedURL.startsWith('/video')) { 31 | 32 | const parsedUrl = url.parse(requestedURL, true) 33 | 34 | // Get the query parameters from the parsed URL 35 | const { video_id } = parsedUrl.query; 36 | 37 | if (video_id == null) { 38 | return res.end("Invalid video id") 39 | } 40 | 41 | sql.query("SELECT file_name FROM big_file_urls WHERE uuid = ?", video_id, (err, data) => { 42 | if (err) { 43 | console.log(err) 44 | return res.end("Something went wrong!") 45 | } else if (data.length == 1) { 46 | const videoPath = data[0].file_name 47 | 48 | fs.stat(videoPath, (err, stats) => { 49 | if (err) { 50 | console.error('Error reading video file:', err) 51 | res.statusCode = 500; 52 | res.end('Internal Server Error'); 53 | return 54 | } 55 | 56 | // Set headers 57 | res.writeHead(200, { 58 | 'Content-Type': 'video/mp4', 59 | 'Content-Length': stats.size 60 | }) 61 | 62 | const videoStream = fs.createReadStream(videoPath) 63 | videoStream.pipe(res) 64 | }) 65 | } else { 66 | console.log(data) 67 | return res.end("Video not found!") 68 | } 69 | }) 70 | } 71 | }).listen(8080, () => console.log('Node.js web server at 8080 is running...')) 72 | 73 | // Get your endpoint online 74 | ngrok.connect({ addr: 8080, authtoken_from_env: true }) 75 | .then((listener) => { 76 | NGROK_BASE_URL = listener.url() 77 | cache.set("NGROK_BASE_URL", NGROK_BASE_URL) 78 | publisher.publish("NGROK_BASE_URL_UPDATED", NGROK_BASE_URL) 79 | console.log(`Ingress established at: ${listener.url()}`) 80 | }) 81 | -------------------------------------------------------------------------------- /screenshots/download_sample.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jayesh-saini/youtube-downloader-bot/bc234f4a684cdbddcd681700acf3a1c5f738cec9/screenshots/download_sample.jpeg -------------------------------------------------------------------------------- /screenshots/youtube-downloader-bot-arch-diagram.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jayesh-saini/youtube-downloader-bot/bc234f4a684cdbddcd681700acf3a1c5f738cec9/screenshots/youtube-downloader-bot-arch-diagram.jpeg --------------------------------------------------------------------------------