From 0b30b5f59cf54554bbd1a94fbf04a36ccab22b04 Mon Sep 17 00:00:00 2001 From: Essem Date: Fri, 29 May 2026 23:01:40 -0500 Subject: [PATCH] refactor: Remove PM2 clustering It's gone. --- README.md | 2 +- commands/general/stats.js | 13 +- package.json | 3 +- pnpm-lock.yaml | 772 -------------------------------------- src/app.ts | 72 +--- src/cluster/pm2.ts | 185 --------- src/events/ready.ts | 4 +- src/utils/misc.ts | 40 +- 8 files changed, 7 insertions(+), 1084 deletions(-) delete mode 100644 src/cluster/pm2.ts diff --git a/README.md b/README.md index 79278e2d..1836dfaa 100644 --- a/README.md +++ b/README.md @@ -15,7 +15,7 @@ esmBot is a free and open-source Discord bot designed to entertain your server. - Low RAM and CPU usage when idle - Support for slash/application commands and classic, prefix-based message commands - Support for multiple database backends (PostgreSQL and SQLite backends included) -- Cluster/shard handling powered by `node:cluster` or [PM2](https://pm2.keymetrics.io) +- Cluster/shard handling powered by `node:cluster` - Flexible command handler allowing you to create new commands by adding script files ## Usage diff --git a/commands/general/stats.js b/commands/general/stats.js index 400ff51e..20d928cd 100644 --- a/commands/general/stats.js +++ b/commands/general/stats.js @@ -6,8 +6,6 @@ import detectRuntime from "#utils/detectRuntime.js"; import { getServers } from "#utils/misc.js"; import packageJson from "../../package.json" with { type: "json" }; -const pm2 = process.env.CLUSTER_TYPE === "pm2" ? (await import("pm2")).default : null; - class StatsCommand extends Command { async run() { if (!this.permissions.has("EMBED_LINKS")) { @@ -109,16 +107,7 @@ class StatsCommand extends Command { * @returns {Promise} */ getMem() { - if (pm2) { - return new Promise((resolve, reject) => { - pm2.list((err, list) => { - if (err) return reject(err); - const procList = list.filter((v) => v.name?.includes("esmBot-proc")); - const value = procList.reduce((prev, cur) => prev + (cur.monit?.memory ?? 0), 0) / 1000 / 1000; - resolve(`${value.toFixed(2)} MB`); - }); - }); - } else if (process.env.CLUSTER_TYPE === "node") { + if (process.env.CLUSTER_TYPE === "node") { return new Promise((resolve, reject) => { const listener = (/** @type {{ data: { type: string; totalMem: number; }; }} */ message) => { if (message.data?.type === "memResponse") { diff --git a/package.json b/package.json index 5bdd68cc..f77b22b0 100644 --- a/package.json +++ b/package.json @@ -83,8 +83,7 @@ }, "optionalDependencies": { "@sentry/deno": "^10.55.0", - "@sentry/node-core": "^10.55.0", - "pm2": "^7.0.1" + "@sentry/node-core": "^10.55.0" }, "engines": { "node": ">=22" diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index f668843e..0350c283 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -76,9 +76,6 @@ importers: '@sentry/node-core': specifier: ^10.55.0 version: 10.55.0(@opentelemetry/api@1.9.1) - pm2: - specifier: ^7.0.1 - version: 7.0.1(bufferutil@4.1.0) packages: @@ -358,18 +355,6 @@ packages: cpu: [x64] os: [win32] - '@pm2/blessed@0.1.81': - resolution: {integrity: sha512-ZcNHqQjMuNRcQ7Z1zJbFIQZO/BDKV3KbiTckWdfbUaYhj7uNmUwb+FbdDWSCkvxNr9dBJQwvV17o6QBkAvgO0g==} - engines: {node: '>= 0.8.0'} - hasBin: true - - '@pm2/js-api@0.8.0': - resolution: {integrity: sha512-nmWzrA/BQZik3VBz+npRcNIu01kdBhWL0mxKmP1ciF/gTcujPTQqt027N9fc1pK9ERM8RipFhymw7RcmCyOEYA==} - engines: {node: '>=4.0'} - - '@pm2/pm2-version-check@1.0.4': - resolution: {integrity: sha512-SXsM27SGH3yTWKc2fKR4SYNxsmnvuBQ9dd6QHtEWmiZ/VqaOYPAIlS8+vMcn27YLtAEBGvNRSh3TPNvtjZgfqA==} - '@sentry/core@10.55.0': resolution: {integrity: sha512-XUyoNtDSYCvgJnoNzlh+YeAXfIPhCRIXbhWqqM3GQ3AFtZICi85lkyfsrwXEl9wzlPGYnU+Eg8F4tOfScx+FcQ==} engines: {node: '>=18'} @@ -420,9 +405,6 @@ packages: '@tokenizer/token@0.3.0': resolution: {integrity: sha512-OvjF+z51L3ov0OyAU0duzsYuvO01PH7x4t6DJx+guahgTnBHkhJdG7soQeTSFLWN3efnHyibZ4Z8l2EuWwJN3A==} - '@tootallnate/quickjs-emscripten@0.23.0': - resolution: {integrity: sha512-C5Mc6rdnsaJDjO3UpGW/CQTHtCKaYlScZTly4JIu97Jxo/odCiH0ITnDXSJPTOrEKk/ycSZ0AOgTmkDtkOsvIA==} - '@types/better-sqlite3@7.6.13': resolution: {integrity: sha512-NMv9ASNARoKksWtsq/SHakpYAYnhBrQgGD8zkLYk/jaK8jUGn08CfEdTRgYhMypUQAfzSP8W6gNLe0q19/t4VA==} @@ -445,16 +427,6 @@ packages: engines: {node: '>=0.4.0'} hasBin: true - agent-base@7.1.4: - resolution: {integrity: sha512-MnA+YT8fwfJPgBx3m60MNqakm30XOkyIoH1y6huTQvC0PwZG7ki8NacLBcrPbNoo8vEZy7Jpuk7+jMO+CUovTQ==} - engines: {node: '>= 14'} - - amp-message@0.1.2: - resolution: {integrity: sha512-JqutcFwoU1+jhv7ArgW38bqrE+LQdcRv4NxNw0mp0JHQyB6tXesWRjtYKlDgHRY2o3JE5UTaBGUK8kSWUdxWUg==} - - amp@0.3.1: - resolution: {integrity: sha512-OwIuC4yZaRogHKiuU5WlMR5Xk/jAcpPtawWL05Gj8Lvm2F6mwoJt4O/bHI+DHwG79vWd+8OFYM4/BzYqyRd3qw==} - ansi-regex@5.0.1: resolution: {integrity: sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==} engines: {node: '>=8'} @@ -463,56 +435,22 @@ packages: resolution: {integrity: sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==} engines: {node: '>=8'} - ansis@4.0.0-node10: - resolution: {integrity: sha512-BRrU0Bo1X9dFGw6KgGz6hWrqQuOlVEDOzkb0QSLZY9sXHqA7pNj7yHPVJRz7y/rj4EOJ3d/D5uxH+ee9leYgsg==} - engines: {node: '>=10'} - - anymatch@3.1.3: - resolution: {integrity: sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==} - engines: {node: '>= 8'} - - argparse@2.0.1: - resolution: {integrity: sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==} - - ast-types@0.13.4: - resolution: {integrity: sha512-x1FCFnFifvYDDzTaLII71vG5uvDwgtmDTEVWAxrgeiR8VjMONcCXJx7E+USjDtHlwFmt9MysbqgF9b9Vjr6w+w==} - engines: {node: '>=4'} - - async@2.6.4: - resolution: {integrity: sha512-mzo5dfJYwAn29PeiJ0zvwTo04zj8HDJj0Mn8TD7sno7q12prdbnasKJHhkm2c1LgrhlJ0teaea8860oxi51mGA==} - async@3.2.6: resolution: {integrity: sha512-htCUDlxyyCLMgaM3xXg0C0LW2xqfuQ6p05pCEIsXuyQ+a1koYKTuBMzRNwmybfLgvJDMd0r1LTn4+E0Ti6C2AA==} base64-js@1.5.1: resolution: {integrity: sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==} - basic-ftp@5.1.0: - resolution: {integrity: sha512-RkaJzeJKDbaDWTIPiJwubyljaEPwpVWkm9Rt5h9Nd6h7tEXTJ3VB4qxdZBioV7JO5yLUaOKwz7vDOzlncUsegw==} - engines: {node: '>=10.0.0'} - deprecated: Security vulnerability fixed in 5.2.1, please upgrade - better-sqlite3@12.10.0: resolution: {integrity: sha512-CyzaZRQKyHkB2ZInfTTl2nvT33EbDpjkLEbE8/Zck3Ll6O0qqvuGdrJ45HgtH+HykRg88ITY3AdreBGN70aBSQ==} engines: {node: 20.x || 22.x || 23.x || 24.x || 25.x || 26.x} - binary-extensions@2.3.0: - resolution: {integrity: sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw==} - engines: {node: '>=8'} - bindings@1.5.0: resolution: {integrity: sha512-p2q/t/mhvuOj/UeLlV6566GD/guowlr0hHxClI0W9m7MWYkL1F0hLo+0Aexs9HSPCtR1SXQ0TD3MMKrXZajbiQ==} bl@4.1.0: resolution: {integrity: sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==} - bodec@0.1.0: - resolution: {integrity: sha512-Ylo+MAo5BDUq1KA3f3R/MFhh+g8cnHmo8bz3YPGhI1znrMaf77ol1sfvYJzsw3nTE+Y2GryfDxBaR+AqpAkEHQ==} - - braces@3.0.3: - resolution: {integrity: sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==} - engines: {node: '>=8'} - buffer@5.7.1: resolution: {integrity: sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==} @@ -520,14 +458,6 @@ packages: resolution: {integrity: sha512-ZMANVnAixE6AWWnPzlW2KpUrxhm9woycYvPOo67jWHyFowASTEd9s+QN1EIMsSDtwhIxN4sWE1jotpuDUIgyIw==} engines: {node: '>=6.14.2'} - chalk@3.0.0: - resolution: {integrity: sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==} - engines: {node: '>=8'} - - chokidar@3.6.0: - resolution: {integrity: sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==} - engines: {node: '>= 8.10.0'} - chownr@1.1.4: resolution: {integrity: sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg==} @@ -538,10 +468,6 @@ packages: cjs-module-lexer@2.2.0: resolution: {integrity: sha512-4bHTS2YuzUvtoLjdy+98ykbNB5jS0+07EvFNXerqZQJ89F7DI6ET7OQo/HJuW6K0aVsKA9hj9/RVb2kQVOrPDQ==} - cli-tableau@2.0.1: - resolution: {integrity: sha512-he+WTicka9cl0Fg/y+YyxcN6/bfQ/1O3QmgxRXDhABKqLzvoOSM4fMzp39uMyLBulAFuywD2N7UaoQE7WaADxQ==} - engines: {node: '>=8.10.0'} - cliui@8.0.1: resolution: {integrity: sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==} engines: {node: '>=12'} @@ -574,31 +500,6 @@ packages: resolution: {integrity: sha512-ezmVcLR3xAVp8kYOm4GS45ZLLgIE6SPAFoduLr6hTDajwb3KZ2F46gulK3XpcwRFb5KKGCSezCBAY4Dw4HsyXA==} engines: {node: '>=18'} - commander@2.15.1: - resolution: {integrity: sha512-VlfT9F3V0v+jr4yxPc5gg9s62/fIVWsd2Bk2iD435um1NlGMYdVCq+MjcXnhYq2icNOizHr1kK+5TI6H0Hy0ag==} - - croner@4.1.97: - resolution: {integrity: sha512-/f6gpQuxDaqXu+1kwQYSckUglPaOrHdbIlBAu0YuW8/Cdb45XwXYNUBXg3r/9Mo6n540Kn/smKcZWko5x99KrQ==} - - culvert@0.1.2: - resolution: {integrity: sha512-yi1x3EAWKjQTreYWeSd98431AV+IEE0qoDyOoaHJ7KJ21gv6HtBXHVLX74opVSGqcR8/AbjJBHAHpcOy2bj5Gg==} - - data-uri-to-buffer@6.0.2: - resolution: {integrity: sha512-7hvf7/GW8e86rW0ptuwS3OcBGDjIi6SZva7hCyWC0yYry2cOPmLIjXAUHI6DK2HsnwJd9ifmt57i8eV2n4YNpw==} - engines: {node: '>= 14'} - - dayjs@1.11.15: - resolution: {integrity: sha512-MC+DfnSWiM9APs7fpiurHGCoeIx0Gdl6QZBy+5lu8MbYKN5FZEXqOgrundfibdfhGZ15o9hzmZ2xJjZnbvgKXQ==} - - debug@4.3.7: - resolution: {integrity: sha512-Er2nc/H7RrMXZBFCEim6TCmMk02Z8vLC2Rbi1KEBggpo0fS6l0S1nnapwmIi3yW/+GOJap1Krg4w0Hg80oCqgQ==} - engines: {node: '>=6.0'} - peerDependencies: - supports-color: '*' - peerDependenciesMeta: - supports-color: - optional: true - debug@4.4.3: resolution: {integrity: sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==} engines: {node: '>=6.0'} @@ -616,10 +517,6 @@ packages: resolution: {integrity: sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==} engines: {node: '>=4.0.0'} - degenerator@5.0.1: - resolution: {integrity: sha512-TllpMR/t0M5sqCXfj85i4XaAzxmS5tVA16dqvdkMwGmzI+dXLXnw3J+3Vdv7VKw+ThlTMboK6i9rnZ6Nntj5CQ==} - engines: {node: '>= 14'} - detect-libc@2.1.2: resolution: {integrity: sha512-Btj2BOOO83o3WyH59e8MgXsxEQVcarkUOpEYrubB0urwnN10yQ364rsiByU11nZlqWYZm05i/of7io4mzihBtQ==} engines: {node: '>=8'} @@ -641,37 +538,10 @@ packages: resolution: {integrity: sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==} engines: {node: '>=6'} - escodegen@2.1.0: - resolution: {integrity: sha512-2NlIDTwUWJN0mRPQOdtQBzbUHvdGY2P1VXSyU83Q3xKxM7WHX2Ql8dKq782Q9TgQUNOLEzEYu9bzLNj1q88I5w==} - engines: {node: '>=6.0'} - hasBin: true - - esprima@4.0.1: - resolution: {integrity: sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==} - engines: {node: '>=4'} - hasBin: true - - estraverse@5.3.0: - resolution: {integrity: sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==} - engines: {node: '>=4.0'} - - esutils@2.0.3: - resolution: {integrity: sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==} - engines: {node: '>=0.10.0'} - - eventemitter2@6.4.9: - resolution: {integrity: sha512-JEPTiaOt9f04oa6NOkc4aH+nVp5I3wEjpHbIPqfgCdD5v5bUzy7xQqwcVO2aDQgOWhI28da57HksMrzK9HlRxg==} - expand-template@2.0.3: resolution: {integrity: sha512-XYfuKMvj4O35f/pOXLObndIRvyQ+/+6AhODh+OKWj9S9498pHHn/IMszH+gt0fBCRWMNfk1ZSp5x3AifmnI2vg==} engines: {node: '>=6'} - extrareqp2@1.0.0: - resolution: {integrity: sha512-Gum0g1QYb6wpPJCVypWP3bbIuaibcFiJcpuPM10YSXp/tzqi84x9PJageob+eN4xVRIOto4wjSGNLyMD54D2xA==} - - fast-json-patch@3.1.1: - resolution: {integrity: sha512-vf6IHUX2SBcA+5/+4883dsIjpBTqmfBjmYiWK1savxQmFk4JfBMLa7ynTYOs1Rolp/T1betJxHiGD3g1Mn8lUQ==} - fecha@4.2.3: resolution: {integrity: sha512-OP2IUU6HeYKJi3i0z4A19kHMQoLVs4Hc+DPqqxI2h/DPZHTm/vjsfC6P0b4jCMy14XizLBqvndQ+UilD7707Jw==} @@ -682,22 +552,9 @@ packages: file-uri-to-path@1.0.0: resolution: {integrity: sha512-0Zt+s3L7Vf1biwWZ29aARiVYLx7iMGnEUl9x33fbB/j3jR81u/O2LbqK+Bm1CDSNDKVtJ/YjwY7TUd5SkeLQLw==} - fill-range@7.1.1: - resolution: {integrity: sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==} - engines: {node: '>=8'} - fn.name@1.1.0: resolution: {integrity: sha512-GRnmB5gPyJpAhTQdSZTSp9uaPSvl09KoYcMQtsB9rQoOmzs9dH6ffeccH+Z+cv6P68Hu5bC6JjRh4Ah/mHSNRw==} - follow-redirects@1.15.11: - resolution: {integrity: sha512-deG2P0JfjrTxl50XGCDyfI97ZGVCxIpfKYmfyrQ54n5FO/0gfIES8C/Psl6kWVDolizcaaxZJnTS0QSMxvnsBQ==} - engines: {node: '>=4.0'} - peerDependencies: - debug: '*' - peerDependenciesMeta: - debug: - optional: true - format-duration@3.0.2: resolution: {integrity: sha512-pKzJDSRgK2lqAiPW3uizDaIJaJnataZclsahz25UMwfdryBGDa+1HlbXGjzpMvX/2kMh4O0sNevFXKaEfCjHsA==} @@ -708,52 +565,16 @@ packages: resolution: {integrity: sha512-VWSRii4t0AFm6ixFFmLLx1t7wS1gh+ckoa84aOeapGum0h+EZd1EhEumSB+ZdDLnEPuucsVB9oB7cxJHap6Afg==} engines: {node: '>=14.14'} - fsevents@2.3.3: - resolution: {integrity: sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==} - engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0} - os: [darwin] - get-caller-file@2.0.5: resolution: {integrity: sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==} engines: {node: 6.* || 8.* || >= 10.*} - get-uri@6.0.5: - resolution: {integrity: sha512-b1O07XYq8eRuVzBNgJLstU6FYc1tS6wnMtF1I1D9lE8LxZSOGZ7LhxN54yPP6mGw5f2CkXY2BQUL9Fx41qvcIg==} - engines: {node: '>= 14'} - - git-node-fs@1.0.0: - resolution: {integrity: sha512-bLQypt14llVXBg0S0u8q8HmU7g9p3ysH+NvVlae5vILuUvs759665HvmR5+wb04KjHyjFcDRxdYb4kyNnluMUQ==} - peerDependencies: - js-git: ^0.7.8 - peerDependenciesMeta: - js-git: - optional: true - - git-sha1@0.1.2: - resolution: {integrity: sha512-2e/nZezdVlyCopOCYHeW0onkbZg7xP1Ad6pndPy1rCygeRykefUS6r7oA5cJRGEFvseiaz5a/qUHFVX1dd6Isg==} - github-from-package@0.0.0: resolution: {integrity: sha512-SyHy3T1v2NUXn29OsWdxmK6RwHD+vkj3v8en8AOBZ1wBQ/hCAQ5bAQTD02kW4W9tUp/3Qh6J8r9EvntiyCmOOw==} - glob-parent@5.1.2: - resolution: {integrity: sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==} - engines: {node: '>= 6'} - graceful-fs@4.2.11: resolution: {integrity: sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==} - has-flag@4.0.0: - resolution: {integrity: sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==} - engines: {node: '>=8'} - - http-proxy-agent@7.0.2: - resolution: {integrity: sha512-T1gkAiYYDWYx3V5Bmyu7HcfcvL7mUrTWiM6yOfa3PIphViJ/gFPbvidQ+veqSOHci/PxBcDabeUNCzpOODJZig==} - engines: {node: '>= 14'} - - https-proxy-agent@7.0.6: - resolution: {integrity: sha512-vK9P5/iUfdl95AI+JVyUuIcVtd4ofvtrOr3HNtM2yxC9bnMbEdp3x01OhQNnjb8IJYi38VlTE3mBXwcfvywuSw==} - engines: {node: '>= 14'} - ieee754@1.2.1: resolution: {integrity: sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==} @@ -767,34 +588,14 @@ packages: ini@1.3.8: resolution: {integrity: sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==} - ip-address@10.1.0: - resolution: {integrity: sha512-XXADHxXmvT9+CRxhXg56LJovE+bmWnEWB78LB83VZTprKTmaC5QfruXocxzTZ2Kl0DNwKuBdlIhjL8LeY8Sf8Q==} - engines: {node: '>= 12'} - ipaddr.js@2.4.0: resolution: {integrity: sha512-9VGk3HGanVE6JoZXHiCpnGy5X0jYDnN4EA4lntFPj+1vIWlFhIylq2CrrCOJH9EAhc5CYhq18F2Av2tgoAPsYQ==} engines: {node: '>= 10'} - is-binary-path@2.1.0: - resolution: {integrity: sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==} - engines: {node: '>=8'} - - is-extglob@2.1.1: - resolution: {integrity: sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==} - engines: {node: '>=0.10.0'} - is-fullwidth-code-point@3.0.0: resolution: {integrity: sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==} engines: {node: '>=8'} - is-glob@4.0.3: - resolution: {integrity: sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==} - engines: {node: '>=0.10.0'} - - is-number@7.0.0: - resolution: {integrity: sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==} - engines: {node: '>=0.12.0'} - is-stream@2.0.1: resolution: {integrity: sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==} engines: {node: '>=8'} @@ -803,33 +604,16 @@ packages: resolution: {integrity: sha512-LpB/54B+/2J5hqQ7imZHfdU31OlgQqx7ZicVlkm9kzg9/w8GKLEcFfJl/t7DCEDueOyBAD6zCCwTO6Fzs0NoEQ==} engines: {node: '>=16'} - js-git@0.7.8: - resolution: {integrity: sha512-+E5ZH/HeRnoc/LW0AmAyhU+mNcWBzAKE+30+IDMLSLbbK+Tdt02AdkOKq9u15rlJsDEGFqtgckc8ZM59LhhiUA==} - - js-yaml@4.1.1: - resolution: {integrity: sha512-qQKT4zQxXl8lLwBtHMWwaTcGfFOZviOJet3Oy/xmGk2gZH677CJM9EvtfdSkgWcATZhj/55JZ0rmy3myCT5lsA==} - hasBin: true - - json-stringify-safe@5.0.1: - resolution: {integrity: sha512-ZClg6AaYvamvYEE82d3Iyd3vSSIjQ+odgjaTzRuO3s7toCdFKczob2i0zCh7JE8kWn17yvAWhUVxvqGwUalsRA==} - jsonfile@6.2.0: resolution: {integrity: sha512-FGuPw30AdOIUTRMC2OMRtQV+jkVj2cfPqSeWXv1NEAJ1qZ5zb1X6z1mFhbfOB/iy3ssJCD+3KuZ8r8C3uVFlAg==} kuler@2.0.0: resolution: {integrity: sha512-Xq9nH7KlWZmXAtodXDDRE7vs6DU1gTU8zYDHDiWLSip45Egwq3plLHzPn27NgvzL2r1LMPC1vdqh98sQxtqj4A==} - lodash@4.17.23: - resolution: {integrity: sha512-LgVTMpQtIopCi79SJeDiP0TfWi5CNEc/L/aRdTh3yIvmZXTnheWpKjSZhnvMl8iXbC1tFg9gdHHDMLoV7CnG+w==} - logform@2.7.0: resolution: {integrity: sha512-TFYA4jnP7PVbmlBIfhlSe+WKxs9dklXMTEGcBCIvLhE/Tn3H6Gk1norupVW7m5Cnd4bLcr08AytbyV/xj7f/kQ==} engines: {node: '>= 12.0.0'} - lru-cache@7.18.3: - resolution: {integrity: sha512-jumlc0BIUrS3qJGgIkWZsyfAM7NCWiBcCDhnd+3NNM5KbBmLTgHVfWBcg6W+rLUsIpzpERPsvwUP7CckAQSOoA==} - engines: {node: '>=12'} - mimic-response@3.1.0: resolution: {integrity: sha512-z0yWI+4FDrrweS8Zmt4Ej5HdJmky15+L2e6Wgn3+iK5fWzb6T3fhNFq2+MeTRb064c6Wr4N/wv0DzQTjNzHNGQ==} engines: {node: '>=10'} @@ -857,10 +641,6 @@ packages: napi-build-utils@2.0.0: resolution: {integrity: sha512-GEbrYkbfF7MoNaoh2iGG84Mnf/WZfB0GdGEsM8wz7Expx/LlWf5U8t9nvJKXSp3qr5IsEbK04cBGhol/KwOsWA==} - netmask@2.0.2: - resolution: {integrity: sha512-dBpDMdxv9Irdq66304OLfEmQ9tbNRFnFTuZiLo+bD+r332bBmMJ8GBLXklIXXgxd3+v9+KUnZaUR5PJMa75Gsg==} - engines: {node: '>= 0.4.0'} - node-abi@3.87.0: resolution: {integrity: sha512-+CGM1L1CgmtheLcBuleyYOn7NWPVu0s0EJH2C4puxgEZb9h8QpR9G2dBfZJOAUhi7VQxuBPMd0hiISWcTyiYyQ==} engines: {node: '>=10'} @@ -876,10 +656,6 @@ packages: resolution: {integrity: sha512-LA4ZjwlnUblHVgq0oBF3Jl/6h/Nvs5fzBLwdEF4nuxnFdsfajde4WfxtJr3CaiH+F6ewcIB/q4jQ4UzPyid+CQ==} hasBin: true - normalize-path@3.0.0: - resolution: {integrity: sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==} - engines: {node: '>=0.10.0'} - oceanic.js@1.14.0: resolution: {integrity: sha512-h8KfbN0GEWoi4kiHXj10uJzQe+L//VMZX6cRDBU4GuGP8wNDWsami20wbpErP8fFzN78kpVshF3g70vd/niP3g==} engines: {node: '>=18.13.0'} @@ -916,41 +692,6 @@ packages: vite-plus: optional: true - pac-proxy-agent@7.2.0: - resolution: {integrity: sha512-TEB8ESquiLMc0lV8vcd5Ql/JAKAoyzHFXaStwjkzpOpC5Yv+pIzLfHvjTSdf3vpa2bMiUQrg9i6276yn8666aA==} - engines: {node: '>= 14'} - - pac-resolver@7.0.1: - resolution: {integrity: sha512-5NPgf87AT2STgwa2ntRMr45jTKrYBGkVU36yT0ig/n/GMAa3oPqhZfIQ2kMEimReg0+t9kZViDVZ83qfVUlckg==} - engines: {node: '>= 14'} - - pako@0.2.9: - resolution: {integrity: sha512-NUcwaKxUxWrZLpDG+z/xZaCgQITkA/Dv4V/T6bw7VON6l1Xz/VnrBqrYjZQ12TamKHzITTfOEIYUj48y2KXImA==} - - picomatch@2.3.1: - resolution: {integrity: sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==} - engines: {node: '>=8.6'} - - pidusage@2.0.21: - resolution: {integrity: sha512-cv3xAQos+pugVX+BfXpHsbyz/dLzX+lr44zNMsYiGxUw+kV5sgQCIcLd1z+0vq+KyC7dJ+/ts2PsfgWfSC3WXA==} - engines: {node: '>=8'} - - pidusage@4.0.1: - resolution: {integrity: sha512-yCH2dtLHfEBnzlHUJymR/Z1nN2ePG3m392Mv8TFlTP1B0xkpMQNHAnfkY0n2tAi6ceKO6YWhxYfZ96V4vVkh/g==} - engines: {node: '>=18'} - - pm2-deploy@1.0.2: - resolution: {integrity: sha512-YJx6RXKrVrWaphEYf++EdOOx9EH18vM8RSZN/P1Y+NokTKqYAca/ejXwVLyiEpNju4HPZEk3Y2uZouwMqUlcgg==} - engines: {node: '>=4.0.0'} - - pm2-sysmonit@1.2.8: - resolution: {integrity: sha512-ACOhlONEXdCTVwKieBIQLSi2tQZ8eKinhcr9JpZSUAL8Qy0ajIgRtsLxG/lwPOW3JEKqPyw/UaHmTWhUzpP4kA==} - - pm2@7.0.1: - resolution: {integrity: sha512-h/DI7WomfdAWDzDRtjhnNfsG4Do6kuOY+VGKbqffHW3yRZMUoWzwyBDkXjrOWvnBlwuY3lYBKkozDdCagfRI4Q==} - engines: {node: '>=18.0.0'} - hasBin: true - postgres@3.4.9: resolution: {integrity: sha512-GD3qdB0x1z9xgFI6cdRD6xu2Sp2WCOEoe3mtnyB5Ee0XrrL5Pe+e4CCnJrRMnL1zYtRDZmQQVbvOttLnKDLnaw==} engines: {node: '>=12'} @@ -961,13 +702,6 @@ packages: deprecated: No longer maintained. Please contact the author of the relevant native addon; alternatives are available. hasBin: true - proxy-agent@6.5.0: - resolution: {integrity: sha512-TmatMXdr2KlRiA2CyDu8GqR8EjahTG3aY3nXjdzFyoZbmB8hrBsTyMezhULIXKnC0jpfjlmiZ3+EaCzoInSu/A==} - engines: {node: '>= 14'} - - proxy-from-env@1.1.0: - resolution: {integrity: sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==} - pump@3.0.3: resolution: {integrity: sha512-todwxLMY7/heScKmntwQG8CXVkWUOdYxIvY2s0VWAAMh/nd8SoYiRaKjlr7+iCs984f2P8zvrfWcDDYVb73NfA==} @@ -979,17 +713,10 @@ packages: resolution: {integrity: sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==} engines: {node: '>= 6'} - readdirp@3.6.0: - resolution: {integrity: sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==} - engines: {node: '>=8.10.0'} - require-directory@2.1.1: resolution: {integrity: sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==} engines: {node: '>=0.10.0'} - run-series@1.1.9: - resolution: {integrity: sha512-Arc4hUN896vjkqCYrUXquBFtRZdv1PfLbTYP71efP6butxyQ0kWpiNJyAgsxscmQg1cqvHY32/UCBzXedTpU2g==} - safe-buffer@5.2.1: resolution: {integrity: sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==} @@ -997,11 +724,6 @@ packages: resolution: {integrity: sha512-b3rppTKm9T+PsVCBEOUR46GWI7fdOs00VKZ1+9c1EWDaDMvjQc6tUwuFyIprgGgTcWoVHSKrU8H31ZHA2e0RHA==} engines: {node: '>=10'} - semver@7.7.2: - resolution: {integrity: sha512-RF0Fw+rO5AMf9MAyaRXI4AV0Ulj5lMHqVxxdSgiVbixSCXoEmmX/jk0CuJw4+3SqroYO9VoUh+HcuJivvtJemA==} - engines: {node: '>=10'} - hasBin: true - semver@7.7.3: resolution: {integrity: sha512-SdsKMrI9TdgjdweUSR9MweHA4EJ8YxHn8DFaDisvhVlUOe4BF1tLD7GAj0lIqWVl+dPb/rExr0Btby5loQm20Q==} engines: {node: '>=10'} @@ -1017,22 +739,6 @@ packages: simple-get@4.0.1: resolution: {integrity: sha512-brv7p5WgH0jmQJr1ZDDfKDOSeWWg+OVypG99A/5vYGPqJ6pxiaHLy8nxtFjBA7oMa01ebA9gfh1uMCFqOuXxvA==} - smart-buffer@4.2.0: - resolution: {integrity: sha512-94hK0Hh8rPqQl2xXc3HsaBoOXKV20MToPkcXvwbISWLEs+64sBq5kFgn2kJDHb1Pry9yrP0dxrCI9RRci7RXKg==} - engines: {node: '>= 6.0.0', npm: '>= 3.0.0'} - - socks-proxy-agent@8.0.5: - resolution: {integrity: sha512-HehCEsotFqbPW9sJ8WVYB6UbmIMv7kUUORIF2Nncq4VQvBfNBLibW9YZR5dlYCSUhwcD628pRllm7n+E+YTzJw==} - engines: {node: '>= 14'} - - socks@2.8.7: - resolution: {integrity: sha512-HLpt+uLy/pxB+bum/9DzAgiKS8CX1EvbWxI4zlmgGCExImLdiad2iCwXT5Z4c9c3Eq8rP2318mPW2c+QbtjK8A==} - engines: {node: '>= 10.0.0', npm: '>= 3.0.0'} - - source-map@0.6.1: - resolution: {integrity: sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==} - engines: {node: '>=0.10.0'} - stack-trace@0.0.10: resolution: {integrity: sha512-KGzahc7puUKkzyMt+IqAep+TVNbKP+k2Lmwhub39m1AsTSkaDutx56aDCo+HLDzf/D26BIHTJWNiTG1KAJiQCg==} @@ -1055,16 +761,6 @@ packages: resolution: {integrity: sha512-ki4hZQfh5rX0QDLLkOCj+h+CVNkqmp/CMf8v8kZpkNVK6jGQooMytqzLZYUVYIZcFZ6yDB70EfD8POcFXiF5oA==} engines: {node: '>=18'} - supports-color@7.2.0: - resolution: {integrity: sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==} - engines: {node: '>=8'} - - systeminformation@5.31.6: - resolution: {integrity: sha512-Uv2b2uGGM6ns+26czgW2cYRabYdnswM0ddSOOlryHOaelzsmDSet1iM/NT7VOYxW8x/BW+HkY+b1Ve2pLTSGSA==} - engines: {node: '>=8.0.0'} - os: [darwin, linux, win32, freebsd, openbsd, netbsd, sunos, android] - hasBin: true - tar-fs@2.1.4: resolution: {integrity: sha512-mDAjwmZdh7LTT6pNleZ05Yt65HC3E+NiQzl672vQG38jIrehtJk/J3mNwIg+vShQPcLF/LV7CMnDW6vjj6sfYQ==} @@ -1084,10 +780,6 @@ packages: resolution: {integrity: sha512-Pugqs6M0m7Lv1I7FtxN4aoyToKg1C4tu+/381vH35y8oENM/Ai7f7C4StcoK4/+BSw9ebcS8jRiVrORFKCALLw==} engines: {node: ^20.0.0 || >=22.0.0} - to-regex-range@5.0.1: - resolution: {integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==} - engines: {node: '>=8.0'} - token-types@6.1.2: resolution: {integrity: sha512-dRXchy+C0IgK8WPC6xvCHFRIWYUbqqdEIKPaKo/AcTUNzwLTK6AH7RjdLWsEZcAN/TBdtfUw3PYEgPr5VPr6ww==} engines: {node: '>=14.16'} @@ -1102,13 +794,6 @@ packages: tunnel-agent@0.6.0: resolution: {integrity: sha512-McnNiV1l8RYeY8tBgEpuodCC1mLUdbSN+CYBL7kJsJNInOP8UjDDEwdk6Mw60vdLLrr5NHKZhMAOSrR2NZuQ+w==} - tv4@1.3.0: - resolution: {integrity: sha512-afizzfpJgvPr+eDkREK4MxJ/+r8nEEHcmitwgnPUqpaP+FpwQyadnxNoSACbgc/b1LsZYtODGoPiFxQrgJgjvw==} - engines: {node: '>= 0.8.0'} - - tx2@1.0.5: - resolution: {integrity: sha512-sJ24w0y03Md/bxzK4FU8J8JveYYUbSs2FViLJ2D/8bytSiyPRbuE3DyL/9UKYXTZlV3yXq0L8GLlhobTnekCVg==} - typescript@6.0.3: resolution: {integrity: sha512-y2TvuxSZPDyQakkFRPZHKFm+KKVqIisdg9/CZwm9ftvKXLP8NRWj38/ODjNbr43SsoXqNuAisEf1GdCxqWcdBw==} engines: {node: '>=14.17'} @@ -1131,10 +816,6 @@ packages: util-deprecate@1.0.2: resolution: {integrity: sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==} - vizion@2.2.1: - resolution: {integrity: sha512-sfAcO2yeSU0CSPFI/DmZp3FsFE9T+8913nv1xWBOyzODv13fwkn6Vl7HqxGpkr9F608M+8SuFId3s+BlZqfXww==} - engines: {node: '>=4.0'} - which@6.0.0: resolution: {integrity: sha512-f+gEpIKMR9faW/JgAgPK1D7mekkFoqbmiwvNzuhsHetni20QSgzg9Vhn0g2JSJkkfehQnqdUAx7/e15qS1lPxg==} engines: {node: ^20.17.0 || >=22.9.0} @@ -1155,30 +836,6 @@ packages: wrappy@1.0.2: resolution: {integrity: sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==} - ws@7.5.10: - resolution: {integrity: sha512-+dbF1tHwZpXcbOJdVOkzLDxZP1ailvSxM6ZweXTegylPny803bFhA+vqBYw4s31NSAk4S2Qz+AKXK9a4wkdjcQ==} - engines: {node: '>=8.3.0'} - peerDependencies: - bufferutil: ^4.0.1 - utf-8-validate: ^5.0.2 - peerDependenciesMeta: - bufferutil: - optional: true - utf-8-validate: - optional: true - - ws@8.20.0: - resolution: {integrity: sha512-sAt8BhgNbzCtgGbt2OxmpuryO63ZoDk/sqaB/znQm94T4fCEsy/yV+7CdC1kJhOU9lboAEU7R3kquuycDoibVA==} - engines: {node: '>=10.0.0'} - peerDependencies: - bufferutil: ^4.0.1 - utf-8-validate: '>=5.0.2' - peerDependenciesMeta: - bufferutil: - optional: true - utf-8-validate: - optional: true - ws@8.21.0: resolution: {integrity: sha512-Vsp28b7DRcimFQvrqu2Wek3z1iYxDCWqHYB8Qsnk/S4RfaCQzPGPyBNuVjJV3cd6UiKtUtp6sNM77gWvzcCH+g==} engines: {node: '>=10.0.0'} @@ -1380,29 +1037,6 @@ snapshots: '@oxlint/binding-win32-x64-msvc@1.67.0': optional: true - '@pm2/blessed@0.1.81': - optional: true - - '@pm2/js-api@0.8.0(bufferutil@4.1.0)': - dependencies: - async: 2.6.4 - debug: 4.3.7 - eventemitter2: 6.4.9 - extrareqp2: 1.0.0(debug@4.3.7) - ws: 7.5.10(bufferutil@4.1.0) - transitivePeerDependencies: - - bufferutil - - supports-color - - utf-8-validate - optional: true - - '@pm2/pm2-version-check@1.0.4': - dependencies: - debug: 4.4.3 - transitivePeerDependencies: - - supports-color - optional: true - '@sentry/core@10.55.0': optional: true @@ -1441,9 +1075,6 @@ snapshots: '@tokenizer/token@0.3.0': {} - '@tootallnate/quickjs-emscripten@0.23.0': - optional: true - '@types/better-sqlite3@7.6.13': dependencies: '@types/node': 22.19.7 @@ -1466,60 +1097,21 @@ snapshots: acorn@8.15.0: optional: true - agent-base@7.1.4: - optional: true - - amp-message@0.1.2: - dependencies: - amp: 0.3.1 - optional: true - - amp@0.3.1: - optional: true - ansi-regex@5.0.1: {} ansi-styles@4.3.0: dependencies: color-convert: 2.0.1 - ansis@4.0.0-node10: - optional: true - - anymatch@3.1.3: - dependencies: - normalize-path: 3.0.0 - picomatch: 2.3.1 - optional: true - - argparse@2.0.1: - optional: true - - ast-types@0.13.4: - dependencies: - tslib: 2.8.1 - optional: true - - async@2.6.4: - dependencies: - lodash: 4.17.23 - optional: true - async@3.2.6: {} base64-js@1.5.1: {} - basic-ftp@5.1.0: - optional: true - better-sqlite3@12.10.0: dependencies: bindings: 1.5.0 prebuild-install: 7.1.3 - binary-extensions@2.3.0: - optional: true - bindings@1.5.0: dependencies: file-uri-to-path: 1.0.0 @@ -1530,14 +1122,6 @@ snapshots: inherits: 2.0.4 readable-stream: 3.6.2 - bodec@0.1.0: - optional: true - - braces@3.0.3: - dependencies: - fill-range: 7.1.1 - optional: true - buffer@5.7.1: dependencies: base64-js: 1.5.1 @@ -1547,25 +1131,6 @@ snapshots: dependencies: node-gyp-build: 4.8.4 - chalk@3.0.0: - dependencies: - ansi-styles: 4.3.0 - supports-color: 7.2.0 - optional: true - - chokidar@3.6.0: - dependencies: - anymatch: 3.1.3 - braces: 3.0.3 - glob-parent: 5.1.2 - is-binary-path: 2.1.0 - is-glob: 4.0.3 - normalize-path: 3.0.0 - readdirp: 3.6.0 - optionalDependencies: - fsevents: 2.3.3 - optional: true - chownr@1.1.4: {} chownr@3.0.0: {} @@ -1573,11 +1138,6 @@ snapshots: cjs-module-lexer@2.2.0: optional: true - cli-tableau@2.0.1: - dependencies: - chalk: 3.0.0 - optional: true - cliui@8.0.1: dependencies: string-width: 4.2.3 @@ -1619,26 +1179,6 @@ snapshots: color-convert: 3.1.3 color-string: 2.1.4 - commander@2.15.1: - optional: true - - croner@4.1.97: - optional: true - - culvert@0.1.2: - optional: true - - data-uri-to-buffer@6.0.2: - optional: true - - dayjs@1.11.15: - optional: true - - debug@4.3.7: - dependencies: - ms: 2.1.3 - optional: true - debug@4.4.3: dependencies: ms: 2.1.3 @@ -1649,13 +1189,6 @@ snapshots: deep-extend@0.6.0: {} - degenerator@5.0.1: - dependencies: - ast-types: 0.13.4 - escodegen: 2.1.0 - esprima: 4.0.1 - optional: true - detect-libc@2.1.2: {} dotenv@17.4.2: {} @@ -1670,39 +1203,8 @@ snapshots: escalade@3.2.0: {} - escodegen@2.1.0: - dependencies: - esprima: 4.0.1 - estraverse: 5.3.0 - esutils: 2.0.3 - optionalDependencies: - source-map: 0.6.1 - optional: true - - esprima@4.0.1: - optional: true - - estraverse@5.3.0: - optional: true - - esutils@2.0.3: - optional: true - - eventemitter2@6.4.9: - optional: true - expand-template@2.0.3: {} - extrareqp2@1.0.0(debug@4.3.7): - dependencies: - follow-redirects: 1.15.11(debug@4.3.7) - transitivePeerDependencies: - - debug - optional: true - - fast-json-patch@3.1.1: - optional: true - fecha@4.2.3: {} file-type@22.0.1: @@ -1716,18 +1218,8 @@ snapshots: file-uri-to-path@1.0.0: {} - fill-range@7.1.1: - dependencies: - to-regex-range: 5.0.1 - optional: true - fn.name@1.1.0: {} - follow-redirects@1.15.11(debug@4.3.7): - optionalDependencies: - debug: 4.3.7 - optional: true - format-duration@3.0.2: {} fs-constants@1.0.0: {} @@ -1738,56 +1230,12 @@ snapshots: jsonfile: 6.2.0 universalify: 2.0.1 - fsevents@2.3.3: - optional: true - get-caller-file@2.0.5: {} - get-uri@6.0.5: - dependencies: - basic-ftp: 5.1.0 - data-uri-to-buffer: 6.0.2 - debug: 4.4.3 - transitivePeerDependencies: - - supports-color - optional: true - - git-node-fs@1.0.0(js-git@0.7.8): - optionalDependencies: - js-git: 0.7.8 - optional: true - - git-sha1@0.1.2: - optional: true - github-from-package@0.0.0: {} - glob-parent@5.1.2: - dependencies: - is-glob: 4.0.3 - optional: true - graceful-fs@4.2.11: {} - has-flag@4.0.0: - optional: true - - http-proxy-agent@7.0.2: - dependencies: - agent-base: 7.1.4 - debug: 4.4.3 - transitivePeerDependencies: - - supports-color - optional: true - - https-proxy-agent@7.0.6: - dependencies: - agent-base: 7.1.4 - debug: 4.4.3 - transitivePeerDependencies: - - supports-color - optional: true - ieee754@1.2.1: {} import-in-the-middle@3.0.0: @@ -1802,49 +1250,14 @@ snapshots: ini@1.3.8: {} - ip-address@10.1.0: - optional: true - ipaddr.js@2.4.0: {} - is-binary-path@2.1.0: - dependencies: - binary-extensions: 2.3.0 - optional: true - - is-extglob@2.1.1: - optional: true - is-fullwidth-code-point@3.0.0: {} - is-glob@4.0.3: - dependencies: - is-extglob: 2.1.1 - optional: true - - is-number@7.0.0: - optional: true - is-stream@2.0.1: {} isexe@3.1.1: {} - js-git@0.7.8: - dependencies: - bodec: 0.1.0 - culvert: 0.1.2 - git-sha1: 0.1.2 - pako: 0.2.9 - optional: true - - js-yaml@4.1.1: - dependencies: - argparse: 2.0.1 - optional: true - - json-stringify-safe@5.0.1: - optional: true - jsonfile@6.2.0: dependencies: universalify: 2.0.1 @@ -1853,9 +1266,6 @@ snapshots: kuler@2.0.0: {} - lodash@4.17.23: - optional: true - logform@2.7.0: dependencies: '@colors/colors': 1.6.0 @@ -1865,9 +1275,6 @@ snapshots: safe-stable-stringify: 2.5.0 triple-beam: 1.4.1 - lru-cache@7.18.3: - optional: true - mimic-response@3.1.0: {} minimist@1.2.8: {} @@ -1887,9 +1294,6 @@ snapshots: napi-build-utils@2.0.0: {} - netmask@2.0.2: - optional: true - node-abi@3.87.0: dependencies: semver: 7.7.3 @@ -1900,9 +1304,6 @@ snapshots: node-gyp-build@4.8.4: {} - normalize-path@3.0.0: - optional: true - oceanic.js@1.14.0(bufferutil@4.1.0): dependencies: tslib: 2.8.1 @@ -1965,91 +1366,6 @@ snapshots: '@oxlint/binding-win32-ia32-msvc': 1.67.0 '@oxlint/binding-win32-x64-msvc': 1.67.0 - pac-proxy-agent@7.2.0: - dependencies: - '@tootallnate/quickjs-emscripten': 0.23.0 - agent-base: 7.1.4 - debug: 4.4.3 - get-uri: 6.0.5 - http-proxy-agent: 7.0.2 - https-proxy-agent: 7.0.6 - pac-resolver: 7.0.1 - socks-proxy-agent: 8.0.5 - transitivePeerDependencies: - - supports-color - optional: true - - pac-resolver@7.0.1: - dependencies: - degenerator: 5.0.1 - netmask: 2.0.2 - optional: true - - pako@0.2.9: - optional: true - - picomatch@2.3.1: - optional: true - - pidusage@2.0.21: - dependencies: - safe-buffer: 5.2.1 - optional: true - - pidusage@4.0.1: - dependencies: - safe-buffer: 5.2.1 - optional: true - - pm2-deploy@1.0.2: - dependencies: - run-series: 1.1.9 - tv4: 1.3.0 - optional: true - - pm2-sysmonit@1.2.8: - dependencies: - async: 3.2.6 - debug: 4.4.3 - pidusage: 2.0.21 - systeminformation: 5.31.6 - tx2: 1.0.5 - transitivePeerDependencies: - - supports-color - optional: true - - pm2@7.0.1(bufferutil@4.1.0): - dependencies: - '@pm2/blessed': 0.1.81 - '@pm2/js-api': 0.8.0(bufferutil@4.1.0) - '@pm2/pm2-version-check': 1.0.4 - amp: 0.3.1 - amp-message: 0.1.2 - ansis: 4.0.0-node10 - async: 3.2.6 - chokidar: 3.6.0 - cli-tableau: 2.0.1 - commander: 2.15.1 - croner: 4.1.97 - dayjs: 1.11.15 - debug: 4.4.3 - eventemitter2: 6.4.9 - fast-json-patch: 3.1.1 - js-yaml: 4.1.1 - pidusage: 4.0.1 - pm2-deploy: 1.0.2 - proxy-agent: 6.5.0 - semver: 7.7.2 - vizion: 2.2.1 - ws: 8.20.0(bufferutil@4.1.0) - optionalDependencies: - pm2-sysmonit: 1.2.8 - transitivePeerDependencies: - - bufferutil - - supports-color - - utf-8-validate - optional: true - postgres@3.4.9: {} prebuild-install@7.1.3: @@ -2067,23 +1383,6 @@ snapshots: tar-fs: 2.1.4 tunnel-agent: 0.6.0 - proxy-agent@6.5.0: - dependencies: - agent-base: 7.1.4 - debug: 4.4.3 - http-proxy-agent: 7.0.2 - https-proxy-agent: 7.0.6 - lru-cache: 7.18.3 - pac-proxy-agent: 7.2.0 - proxy-from-env: 1.1.0 - socks-proxy-agent: 8.0.5 - transitivePeerDependencies: - - supports-color - optional: true - - proxy-from-env@1.1.0: - optional: true - pump@3.0.3: dependencies: end-of-stream: 1.4.5 @@ -2102,23 +1401,12 @@ snapshots: string_decoder: 1.3.0 util-deprecate: 1.0.2 - readdirp@3.6.0: - dependencies: - picomatch: 2.3.1 - optional: true - require-directory@2.1.1: {} - run-series@1.1.9: - optional: true - safe-buffer@5.2.1: {} safe-stable-stringify@2.5.0: {} - semver@7.7.2: - optional: true - semver@7.7.3: {} shoukaku@4.3.0(bufferutil@4.1.0): @@ -2136,27 +1424,6 @@ snapshots: once: 1.4.0 simple-concat: 1.0.1 - smart-buffer@4.2.0: - optional: true - - socks-proxy-agent@8.0.5: - dependencies: - agent-base: 7.1.4 - debug: 4.4.3 - socks: 2.8.7 - transitivePeerDependencies: - - supports-color - optional: true - - socks@2.8.7: - dependencies: - ip-address: 10.1.0 - smart-buffer: 4.2.0 - optional: true - - source-map@0.6.1: - optional: true - stack-trace@0.0.10: {} string-width@4.2.3: @@ -2179,14 +1446,6 @@ snapshots: dependencies: '@tokenizer/token': 0.3.0 - supports-color@7.2.0: - dependencies: - has-flag: 4.0.0 - optional: true - - systeminformation@5.31.6: - optional: true - tar-fs@2.1.4: dependencies: chownr: 1.1.4 @@ -2214,11 +1473,6 @@ snapshots: tinypool@2.1.0: {} - to-regex-range@5.0.1: - dependencies: - is-number: 7.0.0 - optional: true - token-types@6.1.2: dependencies: '@borewit/text-codec': 0.2.1 @@ -2233,14 +1487,6 @@ snapshots: dependencies: safe-buffer: 5.2.1 - tv4@1.3.0: - optional: true - - tx2@1.0.5: - dependencies: - json-stringify-safe: 5.0.1 - optional: true - typescript@6.0.3: {} uint8array-extras@1.5.0: {} @@ -2253,14 +1499,6 @@ snapshots: util-deprecate@1.0.2: {} - vizion@2.2.1: - dependencies: - async: 2.6.4 - git-node-fs: 1.0.0(js-git@0.7.8) - ini: 1.3.8 - js-git: 0.7.8 - optional: true - which@6.0.0: dependencies: isexe: 3.1.1 @@ -2293,16 +1531,6 @@ snapshots: wrappy@1.0.2: {} - ws@7.5.10(bufferutil@4.1.0): - optionalDependencies: - bufferutil: 4.1.0 - optional: true - - ws@8.20.0(bufferutil@4.1.0): - optionalDependencies: - bufferutil: 4.1.0 - optional: true - ws@8.21.0(bufferutil@4.1.0): optionalDependencies: bufferutil: 4.1.0 diff --git a/src/app.ts b/src/app.ts index 1694d1e0..43e84376 100644 --- a/src/app.ts +++ b/src/app.ts @@ -160,76 +160,8 @@ for (const [name, event] of Object.entries(events)) { } logger.log("info", "Registered events."); -// PM2-specific handling -if (process.env.CLUSTER_TYPE === "pm2") { - const { default: pm2 } = await import("pm2"); - // callback hell :) - pm2.launchBus((err, pm2Bus) => { - if (err) { - logger.error(err); - return; - } - pm2.list((err, list) => { - if (err) { - logger.error(err); - return; - } - const managerProc = list.find((v) => v.name === "esmBot-manager"); - pm2Bus.on("process:msg", async (packet: { data?: { type: string; from?: string; message: string } }) => { - if (packet.data?.from === process.env.pm_id) return; - switch (packet.data?.type) { - case "reload": { - const cmdPath = paths.get(packet.data.message); - if (cmdPath) await load(cmdPath); - break; - } - case "soundreload": - await reload(client); - break; - case "mediareload": - await reloadMediaConnections(); - break; - case "broadcastStart": - startBroadcast(client, packet.data.message); - break; - case "broadcastEnd": - endBroadcast(client); - break; - case "eval": - // oxlint-disable-next-line no-eval - eval(packet.data.message); - break; - case "serverCounts": - if (!managerProc) break; - pm2.sendDataToProcessId( - managerProc.pm_id as number, - { - id: managerProc.pm_id, - type: "process:msg", - data: { - type: "serverCounts", - guilds: client.guilds.size, - shards: client.shards.map((v) => { - return { - id: v.id, - procId: Number.parseInt(process.env.pm_id as string), - latency: v.latency, - status: v.status, - }; - }), - }, - topic: true, - }, - (err) => { - if (err) logger.error(err); - }, - ); - break; - } - }); - }); - }); -} else if (process.env.CLUSTER_TYPE === "node") { +// Cluster-specific handling +if (process.env.CLUSTER_TYPE === "node") { process.on("message", async (packet: { data?: { type: string; from?: string; message: string } }) => { if (packet.data?.from === process.env.pm_id) return; switch (packet.data?.type) { diff --git a/src/cluster/pm2.ts b/src/cluster/pm2.ts deleted file mode 100644 index a0009191..00000000 --- a/src/cluster/pm2.ts +++ /dev/null @@ -1,185 +0,0 @@ -import "dotenv/config"; -import process from "node:process"; -import pm2, { type ProcessDescription } from "pm2"; -import logger from "#utils/logger.js"; -import { - calcShards, - createManageServer, - getGatewayData, - type IncomingProcMessage, - type ServerCountMessage, - type ShardData, -} from "./common.ts"; - -let serverCount = 0; -let shardData: ShardData[] = []; -let clusterCount = 0; -let responseCount = 0; -let totalMem = 0; - -process.on("message", async (packet: IncomingProcMessage) => { - if (packet.data?.type === "getCount") { - process.send?.({ - type: "process:msg", - data: { - type: "countResponse", - serverCount, - }, - }); - } - if (packet.data?.type === "getMem") { - await updateStats(); - process.send?.({ - type: "process:msg", - data: { - type: "memResponse", - totalMem, - }, - }); - } -}); - -function getProcesses(): Promise { - return new Promise((resolve, reject) => { - pm2.list((err, list) => { - if (err) reject(err); - resolve(list.filter((v) => v.name?.includes("esmBot-proc"))); - }); - }); -} - -async function updateStats() { - serverCount = 0; - shardData = []; - responseCount = 0; - totalMem = process.memoryUsage().heapUsed; - const processes = await getProcesses(); - clusterCount = processes.length; - let timeout: ReturnType | undefined; - const listener = (packet: IncomingProcMessage) => { - if (packet.data?.type === "serverCounts") { - const countData = packet as ServerCountMessage; - clearTimeout(timeout); - serverCount += countData.data.guilds; - shardData = [...shardData, ...countData.data.shards].sort((a, b) => a.id - b.id); - responseCount += 1; - totalMem += countData.data.mem; - if (responseCount >= clusterCount) { - process.removeListener("message", listener); - return; - } - timeout = setTimeout(() => { - process.removeListener("message", listener); - logger.error("Timed out while waiting for stats"); - }, 5000); - } - }; - timeout = setTimeout(() => { - process.removeListener("message", listener); - logger.error("Timed out while waiting for stats"); - }, 5000); - process.on("message", listener); - process.send?.({ - type: "process:msg", - data: { - type: "serverCounts", - }, - }); -} - -const port = process.env.CLUSTER_PORT ?? process.env.METRICS; - -if (port && port !== "") { - createManageServer( - port, - () => { - return { - shards: shardData, - servers: serverCount, - totalMem, - }; - }, - (id) => { - pm2.restart(id, (e) => logger.error(e)); - return true; - }, - async () => { - for (let i = 1; i <= clusterCount; i++) { - await new Promise((resolve, reject) => { - pm2.restart(i, (e) => { - if (e) return reject(e); - resolve(); - }); - }); - } - }, - ); -} - -setInterval(updateStats, 60000); // 1 minute -setTimeout(updateStats, 10000); - -logger.info("Started esmBot management process."); - -(async function init() { - logger.log("main", "Getting gateway connection data..."); - const { procAmount, shards } = await getGatewayData(); - logger.log("main", `Obtained data, connecting with ${shards} shard(s) across ${procAmount} process(es)...`); - - const runningProc = await getProcesses(); - if (runningProc.length === procAmount) { - logger.log("main", "All processes already running"); - return; - } - - const shardArray = []; - for (let i = 0; i < shards; i++) { - shardArray.push(i); - } - const shardArrays = calcShards(shardArray, procAmount); - - let i = 1; - - if (runningProc.length < procAmount && runningProc.length !== 0) { - i = runningProc.length + 1; - logger.log( - "main", - `Some processes already running, attempting to start ${shardArrays.length - runningProc.length} missing processes starting from ${i}...`, - ); - } - - for (i; i <= shardArrays.length; i++) { - await awaitStart(i, shardArrays[i - 1]); - } - - await updateStats(); -})(); - -function awaitStart(i: number, shardArray: number[]): Promise { - return new Promise((resolve) => { - pm2.start( - { - name: `esmBot-proc${i}`, - script: "dist/app.js", - autorestart: true, - exp_backoff_restart_delay: 1000, - wait_ready: true, - listen_timeout: 60000, - watch: false, - env: { - SHARDS: JSON.stringify(shardArray), - CLUSTER_TYPE: "pm2", - }, - }, - (err) => { - if (err) { - logger.error(`Failed to start esmBot process ${i}: ${err}`); - process.exit(0); - } else { - logger.info(`Started esmBot process ${i}.`); - resolve(); - } - }, - ); - }); -} diff --git a/src/events/ready.ts b/src/events/ready.ts index a3cec245..fb19f1f5 100644 --- a/src/events/ready.ts +++ b/src/events/ready.ts @@ -37,9 +37,7 @@ export default async ({ client, database }: EventParams) => { ready = true; - if (process.env.CLUSTER_TYPE === "pm2") { - process.send?.("ready"); - } else if (process.env.CLUSTER_TYPE === "node") { + if (process.env.CLUSTER_TYPE === "node") { process.send?.({ data: { type: "ready", diff --git a/src/utils/misc.ts b/src/utils/misc.ts index 066a6934..bd8508db 100644 --- a/src/utils/misc.ts +++ b/src/utils/misc.ts @@ -19,8 +19,6 @@ import packageJson from "../../package.json" with { type: "json" }; import type { DatabasePlugin } from "../database.ts"; import { disconnect, servers } from "./media.ts"; -const pm2 = process.env.CLUSTER_TYPE === "pm2" ? (await import("pm2")).default : null; - let broadcast = false; export async function getVers() { @@ -172,43 +170,7 @@ export async function exit(client: Client, database: DatabasePlugin | undefined) export function getServers(bot: Client): Promise { return new Promise((resolve, reject) => { - if (pm2) { - pm2.launchBus((_err, pm2Bus) => { - const listener = (packet: { data: { type: string; serverCount: number } }) => { - if (packet.data?.type === "countResponse") { - resolve(packet.data.serverCount); - pm2Bus.off("process:msg"); - } - }; - pm2Bus.on("process:msg", listener); - - pm2.list((err, list) => { - if (err) { - reject(err); - return; - } - const managerProc = list.find((v) => v.name === "esmBot-manager"); - if (!managerProc) { - pm2Bus.off("process:msg"); - return resolve(bot.guilds.size); - } - pm2.sendDataToProcessId( - managerProc.pm_id as number, - { - id: managerProc.pm_id, - type: "process:msg", - data: { - type: "getCount", - }, - topic: true, - }, - (err) => { - if (err) reject(err); - }, - ); - }); - }); - } else if (process.env.CLUSTER_TYPE === "node") { + if (process.env.CLUSTER_TYPE === "node") { const listener = (packet: { data: { type: string; serverCount: number } }) => { if (packet.data?.type === "countResponse") { clearTimeout(timeout); -- 2.51.2