diff --git a/.gitignore b/.gitignore index 76add87..a0d218e 100644 --- a/.gitignore +++ b/.gitignore @@ -1,2 +1,3 @@ node_modules -dist \ No newline at end of file +dist +.env \ No newline at end of file diff --git a/package.json b/package.json index 920ab66..4572338 100644 --- a/package.json +++ b/package.json @@ -19,15 +19,11 @@ "@types/react": "^18.3.1", "@types/react-dom": "^18.3.0", "@types/tough-cookie": "^4.0.5", - "aedes": "^0.47.0", "axios": "^0.27.2", "axios-cookiejar-support": "^4.0.7", - "chroma-js": "^2.4.2", "eslint": "^8.57.0", - "express": "^4.19.2", "grammy": "^1.22.4", "grammy-inline-menu": "^8.0.1", - "nanotimer": "^0.3.15", "prettier": "^2.8.8", "rakkasjs": "0.7.0-next.47", "simplex-noise": "^4.0.1", @@ -37,19 +33,14 @@ "vite-tsconfig-paths": "^3.6.0" }, "dependencies": { - "@grammyjs/web-app": "^1.3.0", "@hattip/adapter-node": "^0.0.35", "@hattip/response": "0.0.45", - "@progress/kendo-react-inputs": "^5.19.0", - "awesome-debounce-promise": "^2.1.0", "colorjs.io": "^0.4.5", "cross-env": "^7.0.3", - "lodash": "^4.17.21", + "dotenv": "^16.4.5", "react": "^18.3.1", "react-colorful": "^5.6.1", "react-dom": "^18.3.1", - "ring-buffer-ts": "^1.2.0", - "telegram-webapps-types": "^1.0.5", - "use-constant": "^1.1.1" + "ring-buffer-ts": "^1.2.0" } } diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index b8c6999..9a74225 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -5,30 +5,21 @@ settings: excludeLinksFromLockfile: false dependencies: - '@grammyjs/web-app': - specifier: ^1.3.0 - version: 1.3.0 '@hattip/adapter-node': specifier: ^0.0.35 version: 0.0.35 '@hattip/response': specifier: 0.0.45 version: 0.0.45 - '@progress/kendo-react-inputs': - specifier: ^5.19.0 - version: 5.19.0(@progress/kendo-drawing@1.20.1)(@progress/kendo-licensing@1.3.5)(@progress/kendo-react-animation@5.19.0)(@progress/kendo-react-form@5.19.0)(@progress/kendo-react-intl@5.19.0)(@progress/kendo-svg-icons@2.3.0)(react-dom@18.3.1)(react@18.3.1) - awesome-debounce-promise: - specifier: ^2.1.0 - version: 2.1.0 colorjs.io: specifier: ^0.4.5 version: 0.4.5 cross-env: specifier: ^7.0.3 version: 7.0.3 - lodash: - specifier: ^4.17.21 - version: 4.17.21 + dotenv: + specifier: ^16.4.5 + version: 16.4.5 react: specifier: ^18.3.1 version: 18.3.1 @@ -41,12 +32,6 @@ dependencies: ring-buffer-ts: specifier: ^1.2.0 version: 1.2.0 - telegram-webapps-types: - specifier: ^1.0.5 - version: 1.0.5 - use-constant: - specifier: ^1.1.1 - version: 1.1.1(react@18.3.1) devDependencies: '@rakkasjs/eslint-config': @@ -64,33 +49,21 @@ devDependencies: '@types/tough-cookie': specifier: ^4.0.5 version: 4.0.5 - aedes: - specifier: ^0.47.0 - version: 0.47.0 axios: specifier: ^0.27.2 version: 0.27.2 axios-cookiejar-support: specifier: ^4.0.7 version: 4.0.7(axios@0.27.2)(tough-cookie@4.1.4) - chroma-js: - specifier: ^2.4.2 - version: 2.4.2 eslint: specifier: ^8.57.0 version: 8.57.0 - express: - specifier: ^4.19.2 - version: 4.19.2 grammy: specifier: ^1.22.4 version: 1.22.4 grammy-inline-menu: specifier: ^8.0.1 version: 8.0.1(grammy@1.22.4) - nanotimer: - specifier: ^0.3.15 - version: 0.3.15 prettier: specifier: ^2.8.8 version: 2.8.8 @@ -279,13 +252,6 @@ packages: '@babel/types': 7.24.0 dev: true - /@babel/runtime@7.24.4: - resolution: {integrity: sha512-dkxf7+hn8mFBwKjs9bvBlArzLVxVbS8usaPUDd5p2a9JCL9tB8OaOVN1isD4+Xyk4ns89/xeOmbQvgdK7IIVdA==} - engines: {node: '>=6.9.0'} - dependencies: - regenerator-runtime: 0.14.1 - dev: false - /@babel/template@7.24.0: resolution: {integrity: sha512-Bkf2q8lMB0AFpX0NFEqSbx1OkTHf0f+0j82mkw+ZpzBnkk7e9Ql0891vlfgi+kHwOk8tQjiQHpqh4LaSa0fKEA==} engines: {node: '>=6.9.0'} @@ -574,12 +540,6 @@ packages: resolution: {integrity: sha512-7OswNRPN72qFUWhysNrY96+5LKBQXgxqw0iNbleYV7G8GB6ZPVdkwFMIZn1Fda2iRKMYT6S6Sxuel0465VGtHQ==} dev: true - /@grammyjs/web-app@1.3.0: - resolution: {integrity: sha512-wQgKFNVcgBPiJLu6LoPM3OGy61JY16qo7v9X7/E4DImob0MFh/873GaZ/7yFHP7PpxCTBXEUwiJ6DlSuYbzyCA==} - dependencies: - '@types/telegram-web-app': 6.9.4 - dev: false - /@hattip/adapter-node@0.0.35: resolution: {integrity: sha512-KzPpwJv5lt0Msqfi2sxR+FMbiIMO/xEuUfALvrmFRRsSMfNErfT0krVmx+dkSWPTFeoc4xxiwbQr1xE16rHiow==} dependencies: @@ -802,213 +762,6 @@ packages: resolution: {integrity: sha512-j7P6Rgr3mmtdkeDGTe0E/aYyWEWVtc5yFXtHCRHs28/jptDEWfaVOc5T7cblqy1XKPPfCxJc/8DwQ5YgLOZOVQ==} dev: true - /@progress/kendo-draggable-common@0.2.3: - resolution: {integrity: sha512-e1FraFsT7zwevswzZlQYL//K+fzmRUvkr/4emp51dzkARLDtGd95BtPNSoXYRG5xYHeueKBS75hzVwQI6Dm3Dg==} - dependencies: - tslib: 1.14.1 - dev: false - - /@progress/kendo-drawing@1.20.1: - resolution: {integrity: sha512-1ihKFZ7vMrqaIPlmXooYWm0/nDvrGWvh0Y1AkRhI1OmfzuvLkEFOUG+MgQgg+/P421RV1hhAWPtd8JER/MwDHQ==} - dependencies: - '@progress/pako-esm': 1.0.1 - dev: false - - /@progress/kendo-inputs-common@3.1.1(@progress/kendo-drawing@1.20.1): - resolution: {integrity: sha512-OqID8+2DuAnUET0W1j357qqTPvws6hnByt2h5+uVS7uK9Wmt/NHA0gVhdYmh+Jyv6Pw+S2epSk47mDsfyreKYA==} - peerDependencies: - '@progress/kendo-drawing': ^1.17.0 - dependencies: - '@progress/kendo-drawing': 1.20.1 - tslib: 2.6.2 - dev: false - - /@progress/kendo-intl@3.1.2: - resolution: {integrity: sha512-rOtMppQSrScwryMfeQSOdsnRi9Oj1l08HFoEC2ticZ0T2N0/JN9CHt+fuToRx5onXK7QkcbbuNM0D09o8TeeMw==} - dev: false - - /@progress/kendo-licensing@1.3.5: - resolution: {integrity: sha512-HWxM6Ov1g0LvOQN9sp+3N1h+YpF0OKq7rWW2bqoJnkyHy8woC8Ve6ew6KmHdbeaKMgikVOYgyo5NTjef2j+gVQ==} - hasBin: true - requiresBuild: true - dependencies: - jsonwebtoken: 9.0.2 - dev: false - - /@progress/kendo-popup-common@1.9.2: - resolution: {integrity: sha512-Gs50UafJcERiGuSP/47Yg7ftPX3HQXiK5M9zHB8sHSoc1/AEYd0/Sj5wh8UrVVBAM9b0pUTwmEuzQ/D5yDDd2Q==} - dev: false - - /@progress/kendo-react-animation@5.19.0(@progress/kendo-licensing@1.3.5)(@progress/kendo-svg-icons@2.3.0)(react-dom@18.3.1)(react@18.3.1): - resolution: {integrity: sha512-nsVRfILrA9vVOV3v8Bys5MTVYu0J6KvGge/Og0Vfgb+CQilMuE7eCl7YXjAhJg6GxIT+h3P3+GzuZZsdAVv52Q==} - peerDependencies: - '@progress/kendo-licensing': ^1.3.0 - react: ^16.8.2 || ^17.0.0 || ^18.0.0 - react-dom: ^16.8.2 || ^17.0.0 || ^18.0.0 - dependencies: - '@progress/kendo-licensing': 1.3.5 - '@progress/kendo-react-common': 5.19.0(@progress/kendo-licensing@1.3.5)(@progress/kendo-svg-icons@2.3.0)(react-dom@18.3.1)(react@18.3.1) - prop-types: 15.8.1 - react: 18.3.1 - react-dom: 18.3.1(react@18.3.1) - react-transition-group: 4.4.2(react-dom@18.3.1)(react@18.3.1) - transitivePeerDependencies: - - '@progress/kendo-svg-icons' - dev: false - - /@progress/kendo-react-buttons@5.19.0(@progress/kendo-licensing@1.3.5)(@progress/kendo-svg-icons@2.3.0)(react-dom@18.3.1)(react@18.3.1): - resolution: {integrity: sha512-Lz8EjNcB2V39h9/vduQGBVKgcFdeKxRdJ1vHAAXplWN6qeRVqYAR8dHWLs/3ZhNJi/zxqehBOTKvhxOjtrRUPA==} - peerDependencies: - '@progress/kendo-licensing': ^1.3.0 - '@progress/kendo-svg-icons': ^2.0.0 - react: ^16.8.2 || ^17.0.0 || ^18.0.0 - react-dom: ^16.8.2 || ^17.0.0 || ^18.0.0 - dependencies: - '@progress/kendo-licensing': 1.3.5 - '@progress/kendo-react-common': 5.19.0(@progress/kendo-licensing@1.3.5)(@progress/kendo-svg-icons@2.3.0)(react-dom@18.3.1)(react@18.3.1) - '@progress/kendo-react-popup': 5.19.0(@progress/kendo-licensing@1.3.5)(@progress/kendo-svg-icons@2.3.0)(react-dom@18.3.1)(react@18.3.1) - '@progress/kendo-svg-icons': 2.3.0 - prop-types: 15.8.1 - react: 18.3.1 - react-dom: 18.3.1(react@18.3.1) - dev: false - - /@progress/kendo-react-common@5.19.0(@progress/kendo-licensing@1.3.5)(@progress/kendo-svg-icons@2.3.0)(react-dom@18.3.1)(react@18.3.1): - resolution: {integrity: sha512-xgneFSVbzK8hmoanYMlYSF6u33zx2dAww3Pj92hmOvrau93qaUcE6cg3RHVXzFtbpItFZiBNdBuxAyg7wLYCnA==} - peerDependencies: - '@progress/kendo-licensing': ^1.3.0 - '@progress/kendo-svg-icons': ^2.0.0 - react: ^16.8.2 || ^17.0.0 || ^18.0.0 - react-dom: ^16.8.2 || ^17.0.0 || ^18.0.0 - dependencies: - '@progress/kendo-draggable-common': 0.2.3 - '@progress/kendo-licensing': 1.3.5 - '@progress/kendo-svg-icons': 2.3.0 - prop-types: 15.8.1 - react: 18.3.1 - react-dom: 18.3.1(react@18.3.1) - dev: false - - /@progress/kendo-react-dialogs@5.19.0(@progress/kendo-licensing@1.3.5)(@progress/kendo-react-buttons@5.19.0)(@progress/kendo-svg-icons@2.3.0)(react-dom@18.3.1)(react@18.3.1): - resolution: {integrity: sha512-NE/Nazs2SaV6j8GfPIapi3VtiKKrVyoPT4WSBUyGU/K1Sxp4yVhzCDWn2rBc3PGbHBag7vZleSX5YO+BSkDIFQ==} - peerDependencies: - '@progress/kendo-licensing': ^1.3.0 - '@progress/kendo-react-buttons': ^5.0.0 - '@progress/kendo-svg-icons': ^2.0.0 - react: ^16.8.2 || ^17.0.0 || ^18.0.0 - react-dom: ^16.8.2 || ^17.0.0 || ^18.0.0 - dependencies: - '@progress/kendo-licensing': 1.3.5 - '@progress/kendo-react-buttons': 5.19.0(@progress/kendo-licensing@1.3.5)(@progress/kendo-svg-icons@2.3.0)(react-dom@18.3.1)(react@18.3.1) - '@progress/kendo-react-common': 5.19.0(@progress/kendo-licensing@1.3.5)(@progress/kendo-svg-icons@2.3.0)(react-dom@18.3.1)(react@18.3.1) - '@progress/kendo-svg-icons': 2.3.0 - prop-types: 15.8.1 - react: 18.3.1 - react-dom: 18.3.1(react@18.3.1) - dev: false - - /@progress/kendo-react-form@5.19.0(@progress/kendo-licensing@1.3.5)(@progress/kendo-svg-icons@2.3.0)(react-dom@18.3.1)(react@18.3.1): - resolution: {integrity: sha512-OPqPy32ICHmHeAEi+C5IdCRWTBitOT/ffIRpwUXiqGX6UnmY7AwEd1omDe6pQ6Ef8uYhWe4WcgmLcFZpJfuzlA==} - peerDependencies: - '@progress/kendo-licensing': ^1.3.0 - react: ^16.8.2 || ^17.0.0 || ^18.0.0 - react-dom: ^16.8.2 || ^17.0.0 || ^18.0.0 - dependencies: - '@progress/kendo-licensing': 1.3.5 - '@progress/kendo-react-common': 5.19.0(@progress/kendo-licensing@1.3.5)(@progress/kendo-svg-icons@2.3.0)(react-dom@18.3.1)(react@18.3.1) - prop-types: 15.8.1 - react: 18.3.1 - react-dom: 18.3.1(react@18.3.1) - transitivePeerDependencies: - - '@progress/kendo-svg-icons' - dev: false - - /@progress/kendo-react-inputs@5.19.0(@progress/kendo-drawing@1.20.1)(@progress/kendo-licensing@1.3.5)(@progress/kendo-react-animation@5.19.0)(@progress/kendo-react-form@5.19.0)(@progress/kendo-react-intl@5.19.0)(@progress/kendo-svg-icons@2.3.0)(react-dom@18.3.1)(react@18.3.1): - resolution: {integrity: sha512-7pKhglm+jl6I8XmUPOXddyL5HjYkZVHM6xCknnGd1RVIbn1CAXEaRg6xRyi8kTftcDbghUwVUm+tLrGeXcef9g==} - peerDependencies: - '@progress/kendo-drawing': ^1.17.2 - '@progress/kendo-licensing': ^1.3.0 - '@progress/kendo-react-animation': ^5.0.0 - '@progress/kendo-react-form': ^5.0.0 - '@progress/kendo-react-intl': ^5.0.0 - '@progress/kendo-svg-icons': ^2.0.0 - react: ^16.8.2 || ^17.0.0 || ^18.0.0 - react-dom: ^16.8.2 || ^17.0.0 || ^18.0.0 - dependencies: - '@progress/kendo-drawing': 1.20.1 - '@progress/kendo-inputs-common': 3.1.1(@progress/kendo-drawing@1.20.1) - '@progress/kendo-licensing': 1.3.5 - '@progress/kendo-react-animation': 5.19.0(@progress/kendo-licensing@1.3.5)(@progress/kendo-svg-icons@2.3.0)(react-dom@18.3.1)(react@18.3.1) - '@progress/kendo-react-buttons': 5.19.0(@progress/kendo-licensing@1.3.5)(@progress/kendo-svg-icons@2.3.0)(react-dom@18.3.1)(react@18.3.1) - '@progress/kendo-react-common': 5.19.0(@progress/kendo-licensing@1.3.5)(@progress/kendo-svg-icons@2.3.0)(react-dom@18.3.1)(react@18.3.1) - '@progress/kendo-react-dialogs': 5.19.0(@progress/kendo-licensing@1.3.5)(@progress/kendo-react-buttons@5.19.0)(@progress/kendo-svg-icons@2.3.0)(react-dom@18.3.1)(react@18.3.1) - '@progress/kendo-react-form': 5.19.0(@progress/kendo-licensing@1.3.5)(@progress/kendo-svg-icons@2.3.0)(react-dom@18.3.1)(react@18.3.1) - '@progress/kendo-react-intl': 5.19.0(@progress/kendo-licensing@1.3.5)(react-dom@18.3.1)(react@18.3.1) - '@progress/kendo-react-labels': 5.19.0(@progress/kendo-licensing@1.3.5)(@progress/kendo-react-intl@5.19.0)(@progress/kendo-svg-icons@2.3.0)(react-dom@18.3.1)(react@18.3.1) - '@progress/kendo-react-popup': 5.19.0(@progress/kendo-licensing@1.3.5)(@progress/kendo-svg-icons@2.3.0)(react-dom@18.3.1)(react@18.3.1) - '@progress/kendo-svg-icons': 2.3.0 - prop-types: 15.8.1 - react: 18.3.1 - react-dom: 18.3.1(react@18.3.1) - dev: false - - /@progress/kendo-react-intl@5.19.0(@progress/kendo-licensing@1.3.5)(react-dom@18.3.1)(react@18.3.1): - resolution: {integrity: sha512-C+vAkYpXfWdj0ct3zK2ysV2tTOiRaV2Ly0VAGEvHYm0ammFyJSKrLuJQKu9RZMlpCcJ/ugbAutOionJuzPs43A==} - peerDependencies: - '@progress/kendo-licensing': ^1.3.0 - react: ^16.8.2 || ^17.0.0 || ^18.0.0 - react-dom: ^16.8.2 || ^17.0.0 || ^18.0.0 - dependencies: - '@progress/kendo-intl': 3.1.2 - '@progress/kendo-licensing': 1.3.5 - prop-types: 15.8.1 - react: 18.3.1 - react-dom: 18.3.1(react@18.3.1) - dev: false - - /@progress/kendo-react-labels@5.19.0(@progress/kendo-licensing@1.3.5)(@progress/kendo-react-intl@5.19.0)(@progress/kendo-svg-icons@2.3.0)(react-dom@18.3.1)(react@18.3.1): - resolution: {integrity: sha512-HE+YauHRx2jtjJGeg1Ljpo7OlXKTBPnMBmoYUSxa5PG/yta4nldSPC34/7bP7g0oSnJIzQ78vRbvW3twitN+Cg==} - peerDependencies: - '@progress/kendo-licensing': ^1.3.0 - '@progress/kendo-react-intl': ^5.0.0 - react: ^16.8.2 || ^17.0.0 || ^18.0.0 - react-dom: ^16.8.2 || ^17.0.0 || ^18.0.0 - dependencies: - '@progress/kendo-licensing': 1.3.5 - '@progress/kendo-react-common': 5.19.0(@progress/kendo-licensing@1.3.5)(@progress/kendo-svg-icons@2.3.0)(react-dom@18.3.1)(react@18.3.1) - '@progress/kendo-react-intl': 5.19.0(@progress/kendo-licensing@1.3.5)(react-dom@18.3.1)(react@18.3.1) - prop-types: 15.8.1 - react: 18.3.1 - react-dom: 18.3.1(react@18.3.1) - transitivePeerDependencies: - - '@progress/kendo-svg-icons' - dev: false - - /@progress/kendo-react-popup@5.19.0(@progress/kendo-licensing@1.3.5)(@progress/kendo-svg-icons@2.3.0)(react-dom@18.3.1)(react@18.3.1): - resolution: {integrity: sha512-7KIR+p3WA1/lMerKe6f51q0YRhZ1WoAjV5Pyl6EGtoqJRYwD0fLiz6lcy8Z9rkceGoFxkLOFs5vpCL+TpDVQuw==} - peerDependencies: - '@progress/kendo-licensing': ^1.3.0 - react: ^16.8.2 || ^17.0.0 || ^18.0.0 - react-dom: ^16.8.2 || ^17.0.0 || ^18.0.0 - dependencies: - '@progress/kendo-licensing': 1.3.5 - '@progress/kendo-popup-common': 1.9.2 - '@progress/kendo-react-common': 5.19.0(@progress/kendo-licensing@1.3.5)(@progress/kendo-svg-icons@2.3.0)(react-dom@18.3.1)(react@18.3.1) - prop-types: 15.8.1 - react: 18.3.1 - react-dom: 18.3.1(react@18.3.1) - transitivePeerDependencies: - - '@progress/kendo-svg-icons' - dev: false - - /@progress/kendo-svg-icons@2.3.0: - resolution: {integrity: sha512-VB4x1o6eVoYcCgTDBMkV88giGXsDlyCEJAMFLd9x99oJlmufx4KC6/bzehFn3CXdTcvhw0ONlTm3H8gM9ZH6JQ==} - dev: false - - /@progress/pako-esm@1.0.1: - resolution: {integrity: sha512-O4A3b1EuE9Xe1pC3Xz9Tcn1M/CYrL71f4y/5TXeytOVTkmkzBgYW97fYP2f+54H0e0erWRaqV/kUUB/a8Uxfbw==} - dev: false - /@rakkasjs/eslint-config@0.6.7(eslint@8.57.0)(typescript@5.4.5): resolution: {integrity: sha512-vEjKBwXBAGvE7G9JCUI1956ef9Xu4MHQAKR7R1y3z3SU+zzFp4nLFgPG/h/EYzmzl4RWt99uX6ZiJ+UHQnD1CQ==} peerDependencies: @@ -1166,10 +919,6 @@ packages: resolution: {integrity: sha512-hw437iINopmQuxWPSUEvqE56NCPsiU8N4AYtfHmJFckclktzK9YQJieD3XkDCDH4OjL+C7zgPUh73R/nrcHrqw==} dev: true - /@types/debounce-promise@3.1.9: - resolution: {integrity: sha512-awNxydYSU+E2vL7EiOAMtiSOfL5gUM5X4YSE2A92qpxDJQ/rXz6oMPYBFDcDywlUmvIDI6zsqgq17cGm5CITQw==} - dev: false - /@types/estree@1.0.5: resolution: {integrity: sha512-/kYRxGDLWzHOB7q+wtSUQlFrtcdUccpfy+X+9iMBpHK8QLLhx2wIPYuS5DYtR9Wa/YlZAbIovy7qVdB1Aq6Lyw==} dev: true @@ -1213,10 +962,6 @@ packages: resolution: {integrity: sha512-I8EUhyrgfLrcTkzV3TSsGyl1tSuPrEDzr0yd5m90UgNxQkyDXULk3b6MlQqTCpZpNtWe1K0hzclnZkTcLBe2UQ==} dev: true - /@types/telegram-web-app@6.9.4: - resolution: {integrity: sha512-Zc1CKYw0D869oz6Z6nGEy+TptJT0In9pATcPgzp25wiUBc+E8UVwbpdO1+BD6mhHTZH+hCu0DLg6Qt6zWYYl0w==} - dev: false - /@types/tough-cookie@4.0.5: resolution: {integrity: sha512-/Ad8+nIOV7Rl++6f1BdKxFSMgmoqEoYbHRpPcx3JEfv8VRsQe9Z4mCXeJBzxs7mbHY/XOZZuXlRNfhpVPbs6ZA==} dev: true @@ -1420,14 +1165,6 @@ packages: event-target-shim: 5.0.1 dev: true - /accepts@1.3.8: - resolution: {integrity: sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==} - engines: {node: '>= 0.6'} - dependencies: - mime-types: 2.1.35 - negotiator: 0.6.3 - dev: true - /acorn-jsx@5.3.2(acorn@8.11.3): resolution: {integrity: sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==} peerDependencies: @@ -1442,45 +1179,6 @@ packages: hasBin: true dev: true - /aedes-packet@3.0.0: - resolution: {integrity: sha512-swASey0BxGs4/npZGWoiVDmnEyPvVFIRY6l2LVKL4rbiW8IhcIGDLfnb20Qo8U20itXlitAKPQ3MVTEbOGG5ZA==} - engines: {node: '>=14'} - dependencies: - mqtt-packet: 7.1.2 - transitivePeerDependencies: - - supports-color - dev: true - - /aedes-persistence@9.1.2: - resolution: {integrity: sha512-2Wlr5pwIK0eQOkiTwb8ZF6C20s8UPUlnsJ4kXYePZ3JlQl0NbBA176mzM8wY294BJ5wybpNc9P5XEQxqadRNcQ==} - engines: {node: '>=14'} - dependencies: - aedes-packet: 3.0.0 - qlobber: 7.0.1 - transitivePeerDependencies: - - supports-color - dev: true - - /aedes@0.47.0: - resolution: {integrity: sha512-ERe7jMI87KlZVj+RWDEEQMTGJ10Nr68Jx5QA+/glBPmLpIoyB1sPv5xgY8FJ/zrnyj4RN04Sv9N6HsS8EmNpNg==} - engines: {node: '>=14'} - dependencies: - aedes-packet: 3.0.0 - aedes-persistence: 9.1.2 - end-of-stream: 1.4.4 - fastfall: 1.5.1 - fastparallel: 2.4.1 - fastseries: 2.0.0 - hyperid: 3.2.0 - mqemitter: 4.5.0 - mqtt-packet: 7.1.2 - retimer: 3.0.0 - reusify: 1.0.4 - uuid: 8.3.2 - transitivePeerDependencies: - - supports-color - dev: true - /agent-base@7.1.1: resolution: {integrity: sha512-H0TSyFNDMomMNJQBn8wFV5YC/2eJ+VXECwOadZJT554xP6cODZHPX3H9QMQECxvrgiSOP1pHjy1sMWQVYJOUOA==} engines: {node: '>= 14'} @@ -1544,10 +1242,6 @@ packages: is-array-buffer: 3.0.4 dev: true - /array-flatten@1.1.1: - resolution: {integrity: sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg==} - dev: true - /array-includes@3.1.8: resolution: {integrity: sha512-itaWrbYbqpGXkGhZPGUulwnhVf5Hpy1xiCFsGqyIGglbBxmG5vSjxQen3/WGOjPpNEv1RtBLKxbmVXm8HpJStQ==} engines: {node: '>= 0.4'} @@ -1653,28 +1347,6 @@ packages: possible-typed-array-names: 1.0.0 dev: true - /awesome-debounce-promise@2.1.0: - resolution: {integrity: sha512-0Dv4j2wKk5BrNZh4jgV2HUdznaeVgEK/WTvcHhZWUElhmQ1RR+iURRoLEwICFyR0S/5VtxfcvY6gR+qSe95jNg==} - engines: {node: '>=8', npm: '>=5'} - dependencies: - '@types/debounce-promise': 3.1.9 - awesome-imperative-promise: 1.0.1 - awesome-only-resolves-last-promise: 1.0.3 - debounce-promise: 3.1.2 - dev: false - - /awesome-imperative-promise@1.0.1: - resolution: {integrity: sha512-EmPr3FqbQGqlNh+WxMNcF9pO9uDQJnOC4/3rLBQNH9m4E9qI+8lbfHCmHpVAsmGqPJPKhCjJLHUQzQW/RBHRdQ==} - engines: {node: '>=8', npm: '>=5'} - dev: false - - /awesome-only-resolves-last-promise@1.0.3: - resolution: {integrity: sha512-7q4WPsYiD8Omvi/yHL314DkvsD/lM//Z2/KcU1vWk0xJotiV0GMJTgHTpWl3n90HJqpXKg7qX+VVNs5YbQyPRQ==} - engines: {node: '>=8', npm: '>=5'} - dependencies: - awesome-imperative-promise: 1.0.1 - dev: false - /axios-cookiejar-support@4.0.7(axios@0.27.2)(tough-cookie@4.1.4): resolution: {integrity: sha512-9vpE3y/a2l2Vs2XEJE4L2z0GWnlpJ4Xj+kDaoCtrpPfS1J3oikXBrxRJX6H62/ZcelOGe+519yW7mqXCIoPXuw==} engines: {node: '>=14.18.0 <15.0.0 || >=16.0.0'} @@ -1704,38 +1376,6 @@ packages: resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==} dev: true - /base64-js@1.5.1: - resolution: {integrity: sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==} - dev: true - - /bl@4.1.0: - resolution: {integrity: sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==} - dependencies: - buffer: 5.7.1 - inherits: 2.0.4 - readable-stream: 3.6.2 - dev: true - - /body-parser@1.20.2: - resolution: {integrity: sha512-ml9pReCu3M61kGlqoTm2umSXTlRTuGTx0bfYj+uIUKKYycG5NtSbeetV3faSU6R7ajOPw0g/J1PvK4qNy7s5bA==} - engines: {node: '>= 0.8', npm: 1.2.8000 || >= 1.4.16} - dependencies: - bytes: 3.1.2 - content-type: 1.0.5 - debug: 2.6.9 - depd: 2.0.0 - destroy: 1.2.0 - http-errors: 2.0.0 - iconv-lite: 0.4.24 - on-finished: 2.4.1 - qs: 6.11.0 - raw-body: 2.5.2 - type-is: 1.6.18 - unpipe: 1.0.0 - transitivePeerDependencies: - - supports-color - dev: true - /boolbase@1.0.0: resolution: {integrity: sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww==} dev: true @@ -1771,28 +1411,12 @@ packages: update-browserslist-db: 1.0.13(browserslist@4.23.0) dev: true - /buffer-equal-constant-time@1.0.1: - resolution: {integrity: sha512-zRpUiDwd/xk6ADqPMATG8vc9VPrkck7T07OIx0gnjmJAnHnTVXNQG3vfvWNuiZIkwu9KrKdA1iJKfsfTVxE6NA==} - dev: false - - /buffer@5.7.1: - resolution: {integrity: sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==} - dependencies: - base64-js: 1.5.1 - ieee754: 1.2.1 - dev: true - /busboy@1.6.0: resolution: {integrity: sha512-8SFQbg/0hQ9xy3UNTB0YEnsNBbWfhf7RtnzpL7TkBiTBRfrQ9Fxcnz7VJsleJpyp6rVLvXiuORqjlHi5q+PYuA==} engines: {node: '>=10.16.0'} dependencies: streamsearch: 1.1.0 - /bytes@3.1.2: - resolution: {integrity: sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==} - engines: {node: '>= 0.8'} - dev: true - /cac@6.7.14: resolution: {integrity: sha512-b6Ilus+c3RrdDk+JhLKUAQfzzgLEPy6wcXqS7f/xe1EETvsDP6GORG7SFuOs6cID5YkqchW/LXZbX5bc8j7ZcQ==} engines: {node: '>=8'} @@ -1858,10 +1482,6 @@ packages: parse5-htmlparser2-tree-adapter: 7.0.0 dev: true - /chroma-js@2.4.2: - resolution: {integrity: sha512-U9eDw6+wt7V8z5NncY2jJfZa+hUH8XEj8FQHgFJTrUFnJfXYf4Ml4adI2vXZOjqRDpFWtYVWypDfZwnJ+HIR4A==} - dev: true - /color-convert@1.9.3: resolution: {integrity: sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==} dependencies: @@ -1903,31 +1523,10 @@ packages: resolution: {integrity: sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==} dev: true - /content-disposition@0.5.4: - resolution: {integrity: sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ==} - engines: {node: '>= 0.6'} - dependencies: - safe-buffer: 5.2.1 - dev: true - - /content-type@1.0.5: - resolution: {integrity: sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==} - engines: {node: '>= 0.6'} - dev: true - /convert-source-map@2.0.0: resolution: {integrity: sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==} dev: true - /cookie-signature@1.0.6: - resolution: {integrity: sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ==} - dev: true - - /cookie@0.6.0: - resolution: {integrity: sha512-U71cyTamuh1CRNCfpGY6to28lxvNwPG4Guz/EVjgf3Jmzv0vlDp1atT9eS5dDjMYHucpHbWns6Lwf3BKz6svdw==} - engines: {node: '>= 0.6'} - dev: true - /cpr@3.0.1: resolution: {integrity: sha512-Xch4PXQ/KC8lJ+KfJ9JI6eG/nmppLrPPWg5Q+vh65Qr9EjuJEubxh/H/Le1TmCZ7+Xv7iJuNRqapyOFZB+wsxA==} hasBin: true @@ -1971,6 +1570,7 @@ packages: /csstype@3.1.3: resolution: {integrity: sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==} + dev: true /data-view-buffer@1.0.1: resolution: {integrity: sha512-0lht7OugA5x3iJLOWFhWK/5ehONdprk0ISXqVFn/NFrDu+cuc8iADFrGQz5BnRK7LLU3JmkbXSxaqX+/mXYtUA==} @@ -1999,21 +1599,6 @@ packages: is-data-view: 1.0.1 dev: true - /debounce-promise@3.1.2: - resolution: {integrity: sha512-rZHcgBkbYavBeD9ej6sP56XfG53d51CD4dnaw989YX/nZ/ZJfgRx/9ePKmTNiUiyQvh4mtrMoS3OAWW+yoYtpg==} - dev: false - - /debug@2.6.9: - resolution: {integrity: sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==} - peerDependencies: - supports-color: '*' - peerDependenciesMeta: - supports-color: - optional: true - dependencies: - ms: 2.0.0 - dev: true - /debug@3.2.7: resolution: {integrity: sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==} peerDependencies: @@ -2064,16 +1649,6 @@ packages: engines: {node: '>=0.4.0'} dev: true - /depd@2.0.0: - resolution: {integrity: sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==} - engines: {node: '>= 0.8'} - dev: true - - /destroy@1.2.0: - resolution: {integrity: sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==} - engines: {node: '>= 0.8', npm: 1.2.8000 || >= 1.4.16} - dev: true - /devalue@4.3.3: resolution: {integrity: sha512-UH8EL6H2ifcY8TbD2QsxwCC/pr5xSwPvv85LrLXVihmHVC3T3YqTCIwnR5ak0yO1KYqlxrPVOA/JVZJYPy2ATg==} dev: true @@ -2099,13 +1674,6 @@ packages: esutils: 2.0.3 dev: true - /dom-helpers@5.2.1: - resolution: {integrity: sha512-nRCa7CK3VTrM2NmGkIy4cbK7IZlgBE/PYMn55rrXefr5xXDP0LdtfPnblFDoVdcAfslJ7or6iqAUnx0CCGIWQA==} - dependencies: - '@babel/runtime': 7.24.4 - csstype: 3.1.3 - dev: false - /dom-serializer@2.0.0: resolution: {integrity: sha512-wIkAryiqt/nV5EQKqQpo3SToSOV9J0DnbJqwK7Wv/Trc92zIAYZ4FlMu+JPFW1DfGFt81ZTCGgDEabffXeLyJg==} dependencies: @@ -2133,18 +1701,13 @@ packages: domhandler: 5.0.3 dev: true - /eastasianwidth@0.2.0: - resolution: {integrity: sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==} - dev: true - - /ecdsa-sig-formatter@1.0.11: - resolution: {integrity: sha512-nagl3RYrbNv6kQkeJIpt6NJZy8twLB/2vtz6yN9Z4vRKHN4/QZJIEbqohALSgwKdnksuY3k5Addp5lg8sVoVcQ==} - dependencies: - safe-buffer: 5.2.1 + /dotenv@16.4.5: + resolution: {integrity: sha512-ZmdL2rui+eB2YwhsWzjInR8LldtZHGDoQ1ugH85ppHKwpUHL7j7rN0Ti9NCnGiQbhaZ11FpR+7ao1dNsmduNUg==} + engines: {node: '>=12'} dev: false - /ee-first@1.1.1: - resolution: {integrity: sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==} + /eastasianwidth@0.2.0: + resolution: {integrity: sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==} dev: true /electron-to-chromium@1.4.750: @@ -2159,17 +1722,6 @@ packages: resolution: {integrity: sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==} dev: true - /encodeurl@1.0.2: - resolution: {integrity: sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==} - engines: {node: '>= 0.8'} - dev: true - - /end-of-stream@1.4.4: - resolution: {integrity: sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==} - dependencies: - once: 1.4.0 - dev: true - /enhanced-resolve@5.16.0: resolution: {integrity: sha512-O+QWCviPNSSLAD9Ucn8Awv+poAkqn3T1XY5/N7kR7rQO9yfSGWkYZDwpJ+iKF7B8rxaQKWngSqACpgzeapSyoA==} engines: {node: '>=10.13.0'} @@ -2338,10 +1890,6 @@ packages: engines: {node: '>=6'} dev: true - /escape-html@1.0.3: - resolution: {integrity: sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==} - dev: true - /escape-string-regexp@1.0.5: resolution: {integrity: sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==} engines: {node: '>=0.8.0'} @@ -2626,55 +2174,11 @@ packages: engines: {node: '>=0.10.0'} dev: true - /etag@1.8.1: - resolution: {integrity: sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==} - engines: {node: '>= 0.6'} - dev: true - /event-target-shim@5.0.1: resolution: {integrity: sha512-i/2XbnSz/uxRCU6+NdVJgKWDTM427+MqYbkQzD321DuCQJUqOuJKIA0IM2+W2xtYHdKOmZ4dR6fExsd4SXL+WQ==} engines: {node: '>=6'} dev: true - /express@4.19.2: - resolution: {integrity: sha512-5T6nhjsT+EOMzuck8JjBHARTHfMht0POzlA60WV2pMD3gyXw2LZnZ+ueGdNxG+0calOJcWKbpFcuzLZ91YWq9Q==} - engines: {node: '>= 0.10.0'} - dependencies: - accepts: 1.3.8 - array-flatten: 1.1.1 - body-parser: 1.20.2 - content-disposition: 0.5.4 - content-type: 1.0.5 - cookie: 0.6.0 - cookie-signature: 1.0.6 - debug: 2.6.9 - depd: 2.0.0 - encodeurl: 1.0.2 - escape-html: 1.0.3 - etag: 1.8.1 - finalhandler: 1.2.0 - fresh: 0.5.2 - http-errors: 2.0.0 - merge-descriptors: 1.0.1 - methods: 1.1.2 - on-finished: 2.4.1 - parseurl: 1.3.3 - path-to-regexp: 0.1.7 - proxy-addr: 2.0.7 - qs: 6.11.0 - range-parser: 1.2.1 - safe-buffer: 5.2.1 - send: 0.18.0 - serve-static: 1.15.0 - setprototypeof: 1.2.0 - statuses: 2.0.1 - type-is: 1.6.18 - utils-merge: 1.0.1 - vary: 1.1.2 - transitivePeerDependencies: - - supports-color - dev: true - /fast-decode-uri-component@1.0.1: resolution: {integrity: sha512-WKgKWg5eUxvRZGwW8FvfbaH7AXSh2cL+3j5fMGzUMCxWBJ3dV3a7Wz8y2f/uQ0e3B6WmodD3oS54jTQ9HVTIIg==} @@ -2706,30 +2210,12 @@ packages: dependencies: fast-decode-uri-component: 1.0.1 - /fastfall@1.5.1: - resolution: {integrity: sha512-KH6p+Z8AKPXnmA7+Iz2Lh8ARCMr+8WNPVludm1LGkZoD2MjY6LVnRMtTKhkdzI+jr0RzQWXKzKyBJm1zoHEL4Q==} - engines: {node: '>=0.10.0'} - dependencies: - reusify: 1.0.4 - dev: true - - /fastparallel@2.4.1: - resolution: {integrity: sha512-qUmhxPgNHmvRjZKBFUNI0oZuuH9OlSIOXmJ98lhKPxMZZ7zS/Fi0wRHOihDSz0R1YiIOjxzOY4bq65YTcdBi2Q==} - dependencies: - reusify: 1.0.4 - xtend: 4.0.2 - dev: true - /fastq@1.17.1: resolution: {integrity: sha512-sRVD3lWVIXWg6By68ZN7vho9a1pQcN/WBFaAAsDDFzlJjvoGx0P8z7V1t72grFJfJhu3YPZBuu25f7Kaw2jN1w==} dependencies: reusify: 1.0.4 dev: true - /fastseries@2.0.0: - resolution: {integrity: sha512-XBU9RXeoYc2/VnvMhplAxEmZLfIk7cvTBu+xwoBuTI8pL19E03cmca17QQycKIdxgwCeFA/a4u27gv1h3ya5LQ==} - dev: true - /file-entry-cache@6.0.1: resolution: {integrity: sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==} engines: {node: ^10.12.0 || >=12.0.0} @@ -2744,21 +2230,6 @@ packages: to-regex-range: 5.0.1 dev: true - /finalhandler@1.2.0: - resolution: {integrity: sha512-5uXcUVftlQMFnWC9qu/svkWv3GTd2PfUhK/3PLkYNAe7FbqJMt3515HaxE6eRL74GdsriiwujiawdaB1BpEISg==} - engines: {node: '>= 0.8'} - dependencies: - debug: 2.6.9 - encodeurl: 1.0.2 - escape-html: 1.0.3 - on-finished: 2.4.1 - parseurl: 1.3.3 - statuses: 2.0.1 - unpipe: 1.0.0 - transitivePeerDependencies: - - supports-color - dev: true - /find-up@5.0.0: resolution: {integrity: sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==} engines: {node: '>=10'} @@ -2813,16 +2284,6 @@ packages: mime-types: 2.1.35 dev: true - /forwarded@0.2.0: - resolution: {integrity: sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==} - engines: {node: '>= 0.6'} - dev: true - - /fresh@0.5.2: - resolution: {integrity: sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==} - engines: {node: '>= 0.6'} - dev: true - /fs.realpath@1.0.0: resolution: {integrity: sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==} dev: true @@ -3077,36 +2538,6 @@ packages: - supports-color dev: true - /http-errors@2.0.0: - resolution: {integrity: sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==} - engines: {node: '>= 0.8'} - dependencies: - depd: 2.0.0 - inherits: 2.0.4 - setprototypeof: 1.2.0 - statuses: 2.0.1 - toidentifier: 1.0.1 - dev: true - - /hyperid@3.2.0: - resolution: {integrity: sha512-PdTtDo+Rmza9nEhTunaDSUKwbC69TIzLEpZUwiB6f+0oqmY0UPfhyHCPt6K1NQ4WFv5yJBTG5vELztVWP+nEVQ==} - dependencies: - buffer: 5.7.1 - uuid: 8.3.2 - uuid-parse: 1.1.0 - dev: true - - /iconv-lite@0.4.24: - resolution: {integrity: sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==} - engines: {node: '>=0.10.0'} - dependencies: - safer-buffer: 2.1.2 - dev: true - - /ieee754@1.2.1: - resolution: {integrity: sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==} - dev: true - /ignore@5.3.1: resolution: {integrity: sha512-5Fytz/IraMjqpwfd34ke28PTVMjZjJG2MPn5t7OE4eUCUNf8BAa7b5WUS9/Qvr6mwOQS7Mk6vdsMno5he+T8Xw==} engines: {node: '>= 4'} @@ -3145,11 +2576,6 @@ packages: side-channel: 1.0.6 dev: true - /ipaddr.js@1.9.1: - resolution: {integrity: sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==} - engines: {node: '>= 0.10'} - dev: true - /is-array-buffer@3.0.4: resolution: {integrity: sha512-wcjaerHw0ydZwfhiKbXJWLDY8A7yV7KhjQOpb83hGgGfId/aQa4TOvwyzn2PuswW2gPCYEL/nEAiSVpdOj1lXw==} engines: {node: '>= 0.4'} @@ -3388,22 +2814,6 @@ packages: hasBin: true dev: true - /jsonwebtoken@9.0.2: - resolution: {integrity: sha512-PRp66vJ865SSqOlgqS8hujT5U4AOgMfhrwYIuIhfKaoSCZcirrmASQr8CX7cUg+RMih+hgznrjp99o+W4pJLHQ==} - engines: {node: '>=12', npm: '>=6'} - dependencies: - jws: 3.2.2 - lodash.includes: 4.3.0 - lodash.isboolean: 3.0.3 - lodash.isinteger: 4.0.4 - lodash.isnumber: 3.0.3 - lodash.isplainobject: 4.0.6 - lodash.isstring: 4.0.1 - lodash.once: 4.1.1 - ms: 2.1.3 - semver: 7.6.0 - dev: false - /jsx-ast-utils@3.3.5: resolution: {integrity: sha512-ZZow9HBI5O6EPgSJLUb8n2NKgmVWTwCvHGwFuJlMjvLFqlGG6pjirPhtdsseaLZjSibD8eegzmYpUZwoIlj2cQ==} engines: {node: '>=4.0'} @@ -3414,21 +2824,6 @@ packages: object.values: 1.2.0 dev: true - /jwa@1.4.1: - resolution: {integrity: sha512-qiLX/xhEEFKUAJ6FiBMbes3w9ATzyk5W7Hvzpa/SLYdxNtng+gcurvrI7TbACjIXlsJyr05/S1oUhZrc63evQA==} - dependencies: - buffer-equal-constant-time: 1.0.1 - ecdsa-sig-formatter: 1.0.11 - safe-buffer: 5.2.1 - dev: false - - /jws@3.2.2: - resolution: {integrity: sha512-YHlZCB6lMTllWDtSPHz/ZXTsi8S00usEV6v1tjq8tOUZzw7DpSDWVXjXDre6ed1w/pd495ODpHZYSdkRTsa0HA==} - dependencies: - jwa: 1.4.1 - safe-buffer: 5.2.1 - dev: false - /keyv@4.5.4: resolution: {integrity: sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==} dependencies: @@ -3454,40 +2849,13 @@ packages: p-locate: 5.0.0 dev: true - /lodash.includes@4.3.0: - resolution: {integrity: sha512-W3Bx6mdkRTGtlJISOvVD/lbqjTlPPUDTMnlXZFnVwi9NKJ6tiAk6LVdlhZMm17VZisqhKcgzpO5Wz91PCt5b0w==} - dev: false - - /lodash.isboolean@3.0.3: - resolution: {integrity: sha512-Bz5mupy2SVbPHURB98VAcw+aHh4vRV5IPNhILUCsOzRmsTmSQ17jIuqopAentWoehktxGd9e/hbIXq980/1QJg==} - dev: false - - /lodash.isinteger@4.0.4: - resolution: {integrity: sha512-DBwtEWN2caHQ9/imiNeEA5ys1JoRtRfY3d7V9wkqtbycnAmTvRRmbHKDV4a0EYc678/dia0jrte4tjYwVBaZUA==} - dev: false - - /lodash.isnumber@3.0.3: - resolution: {integrity: sha512-QYqzpfwO3/CWf3XP+Z+tkQsfaLL/EnUlXWVkIk5FUPc4sBdTehEqZONuyRt2P67PXAk+NXmTBcc97zw9t1FQrw==} - dev: false - - /lodash.isplainobject@4.0.6: - resolution: {integrity: sha512-oSXzaWypCMHkPC3NvBEaPHf0KsA5mvPrOPgQWDsbg8n7orZ290M0BmC/jgRZ4vcJ6DTAhjrsSYgdsW/F+MFOBA==} - dev: false - - /lodash.isstring@4.0.1: - resolution: {integrity: sha512-0wJxfxH1wgO3GrbuP+dTTk7op+6L41QCXbGINEmD+ny/G/eCqGzxyCsh7159S+mgDDcoarnBw6PC1PS5+wUGgw==} - dev: false - /lodash.merge@4.6.2: resolution: {integrity: sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==} dev: true - /lodash.once@4.1.1: - resolution: {integrity: sha512-Sb487aTOCr9drQVL8pIxOzVhafOjZN9UU54hiN8PU3uAiSV7lx1yYNpbNmex2PK6dSJoNTSJUUswT651yww3Mg==} - dev: false - /lodash@4.17.21: resolution: {integrity: sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==} + dev: true /loose-envify@1.4.0: resolution: {integrity: sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==} @@ -3511,6 +2879,7 @@ packages: engines: {node: '>=10'} dependencies: yallist: 4.0.0 + dev: true /magic-string@0.30.10: resolution: {integrity: sha512-iIRwTIf0QKV3UAnYK4PU8uiEc4SRh5jX0mwpIwETPpHdhVM4f53RSwS/vXvN1JhGX+Cs7B8qIq3d6AH49O5fAQ==} @@ -3518,25 +2887,11 @@ packages: '@jridgewell/sourcemap-codec': 1.4.15 dev: true - /media-typer@0.3.0: - resolution: {integrity: sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ==} - engines: {node: '>= 0.6'} - dev: true - - /merge-descriptors@1.0.1: - resolution: {integrity: sha512-cCi6g3/Zr1iqQi6ySbseM1Xvooa98N0w31jzUYrXPX2xqObmFGHJ0tQ5u74H3mVh7wLouTseZyYIq39g8cNp1w==} - dev: true - /merge2@1.4.1: resolution: {integrity: sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==} engines: {node: '>= 8'} dev: true - /methods@1.1.2: - resolution: {integrity: sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w==} - engines: {node: '>= 0.6'} - dev: true - /micromatch@4.0.5: resolution: {integrity: sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==} engines: {node: '>=8.6'} @@ -3555,12 +2910,6 @@ packages: dependencies: mime-db: 1.52.0 - /mime@1.6.0: - resolution: {integrity: sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==} - engines: {node: '>=4'} - hasBin: true - dev: true - /minimatch@3.1.2: resolution: {integrity: sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==} dependencies: @@ -3590,39 +2939,18 @@ packages: minimist: 1.2.8 dev: true - /mqemitter@4.5.0: - resolution: {integrity: sha512-Mp/zytFeIv6piJQkEKnncHcP4R/ErJc5C7dfonkhkNUT2LA/nTayrfNxbipp3M5iCJUTQSUtzfQAQA3XVcKz6w==} - engines: {node: '>=10'} - dependencies: - fastparallel: 2.4.1 - qlobber: 5.0.3 - dev: true - - /mqtt-packet@7.1.2: - resolution: {integrity: sha512-FFZbcZ2omsf4c5TxEQfcX9hI+JzDpDKPT46OmeIBpVA7+t32ey25UNqlqNXTmeZOr5BLsSIERpQQLsFWJS94SQ==} - dependencies: - bl: 4.1.0 - debug: 4.3.4 - process-nextick-args: 2.0.1 - transitivePeerDependencies: - - supports-color - dev: true - /mrmime@2.0.0: resolution: {integrity: sha512-eu38+hdgojoyq63s+yTpN4XMBdt5l8HhMhc4VKLO9KM5caLIBvUm4thi7fFaxyTmCKeNnXZ5pAlBwCUnhA09uw==} engines: {node: '>=10'} dev: true - /ms@2.0.0: - resolution: {integrity: sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==} - dev: true - /ms@2.1.2: resolution: {integrity: sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==} dev: true /ms@2.1.3: resolution: {integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==} + dev: true /mz@2.7.0: resolution: {integrity: sha512-z81GNO7nnYMEhrGh9LeymoE4+Yr0Wn5McHIZMK5cfQCl+NDX08sCZgUc9/6MHni9IWuFLm1Z3HTCXu2z9fN62Q==} @@ -3638,10 +2966,6 @@ packages: hasBin: true dev: true - /nanotimer@0.3.15: - resolution: {integrity: sha512-xj8HcwceqeRbfSuwNIzYhdbyZu3zoiHX3y2cyVB/cLn0RzVCI8ZZVQLZELEUMG2tYEsjqbCLb3b4q1lDC7ENnA==} - dev: true - /natural-compare-lite@1.4.0: resolution: {integrity: sha512-Tj+HTDSJJKaZnfiuw+iaF9skdPpTo2GtEly5JHnWV/hfv2Qj/9RKsGISQtLh2ox3l5EAGw487hnBee0sIJ6v2g==} dev: true @@ -3650,11 +2974,6 @@ packages: resolution: {integrity: sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==} dev: true - /negotiator@0.6.3: - resolution: {integrity: sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==} - engines: {node: '>= 0.6'} - dev: true - /node-fetch-native@1.6.4: resolution: {integrity: sha512-IhOigYzAKHd244OC0JIMIUrjzctirCmPkaIfhDeGcEETWof5zKYUW7e7MYvChGWh/4CJeXEgsRyGzuF334rOOQ==} @@ -3683,6 +3002,7 @@ packages: /object-assign@4.1.1: resolution: {integrity: sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==} engines: {node: '>=0.10.0'} + dev: true /object-inspect@1.13.1: resolution: {integrity: sha512-5qoj1RUiKOMsCCNLV1CBiPYE10sziTsnmNxkAI/rZhiD63CF7IqdFGC/XzjWjpSgLf0LxXX3bDFIh0E18f6UhQ==} @@ -3749,13 +3069,6 @@ packages: es-object-atoms: 1.0.0 dev: true - /on-finished@2.4.1: - resolution: {integrity: sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==} - engines: {node: '>= 0.8'} - dependencies: - ee-first: 1.1.1 - dev: true - /once@1.4.0: resolution: {integrity: sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==} dependencies: @@ -3808,11 +3121,6 @@ packages: entities: 4.5.0 dev: true - /parseurl@1.3.3: - resolution: {integrity: sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==} - engines: {node: '>= 0.8'} - dev: true - /path-exists@4.0.0: resolution: {integrity: sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==} engines: {node: '>=8'} @@ -3839,10 +3147,6 @@ packages: minipass: 7.0.4 dev: true - /path-to-regexp@0.1.7: - resolution: {integrity: sha512-5DFkuoqlv1uYQKxy8omFBeJPQcdoE07Kv2sferDCrAq1ohOU+MSDswDIbnx3YAM60qIOnYa53wBhXW0EbMonrQ==} - dev: true - /path-type@4.0.0: resolution: {integrity: sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==} engines: {node: '>=8'} @@ -3887,23 +3191,12 @@ packages: hasBin: true dev: true - /process-nextick-args@2.0.1: - resolution: {integrity: sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==} - dev: true - /prop-types@15.8.1: resolution: {integrity: sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg==} dependencies: loose-envify: 1.4.0 object-assign: 4.1.1 react-is: 16.13.1 - - /proxy-addr@2.0.7: - resolution: {integrity: sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==} - engines: {node: '>= 0.10'} - dependencies: - forwarded: 0.2.0 - ipaddr.js: 1.9.1 dev: true /psl@1.9.0: @@ -3915,23 +3208,6 @@ packages: engines: {node: '>=6'} dev: true - /qlobber@5.0.3: - resolution: {integrity: sha512-wW4GTZPePyh0RgOsM18oDyOUlXfurVRgoNyJfS+y7VWPyd0GYhQp5T2tycZFZjonH+hngxIfklGJhTP/ghidgQ==} - engines: {node: '>= 8'} - dev: true - - /qlobber@7.0.1: - resolution: {integrity: sha512-FsFg9lMuMEFNKmTO9nV7tlyPhx8BmskPPjH2akWycuYVTtWaVwhW5yCHLJQ6Q+3mvw5cFX2vMfW2l9z2SiYAbg==} - engines: {node: '>= 14'} - dev: true - - /qs@6.11.0: - resolution: {integrity: sha512-MvjoMCJwEarSbUYk5O+nmoSzSutSsTwF85zcHPQ9OrlFoZOYIjaqBAJIqIXjptyD5vThxGq52Xu/MaJzRkIk4Q==} - engines: {node: '>=0.6'} - dependencies: - side-channel: 1.0.6 - dev: true - /querystringify@2.2.0: resolution: {integrity: sha512-FIqgj2EUvTa7R50u0rGsyTftzjYmv/a3hO345bZNrqabNqjtgiDMgmo4mkUjd+nzU5oF3dClKqFIPUKybUyqoQ==} dev: true @@ -3987,21 +3263,6 @@ packages: - supports-color dev: true - /range-parser@1.2.1: - resolution: {integrity: sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==} - engines: {node: '>= 0.6'} - dev: true - - /raw-body@2.5.2: - resolution: {integrity: sha512-8zGqypfENjCIqGhgXToC8aB2r7YrBX+AQAfIPs/Mlk+BtPTztOvTS01NRW/3Eh60J+a48lt8qsCzirQ6loCVfA==} - engines: {node: '>= 0.8'} - dependencies: - bytes: 3.1.2 - http-errors: 2.0.0 - iconv-lite: 0.4.24 - unpipe: 1.0.0 - dev: true - /react-colorful@5.6.1(react-dom@18.3.1)(react@18.3.1): resolution: {integrity: sha512-1exovf0uGTGyq5mXQT0zgQ80uvj2PCwvF8zY1RN9/vbJVSjSo3fsB/4L3ObbF7u70NduSiK4xu4Y6q1MHoUGEw==} peerDependencies: @@ -4023,20 +3284,7 @@ packages: /react-is@16.13.1: resolution: {integrity: sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==} - - /react-transition-group@4.4.2(react-dom@18.3.1)(react@18.3.1): - resolution: {integrity: sha512-/RNYfRAMlZwDSr6z4zNKV6xu53/e2BuaBbGhbyYIXTrmgu/bGHzmqOs7mJSJBHy9Ud+ApHx3QjrkKSp1pxvlFg==} - peerDependencies: - react: '>=16.6.0' - react-dom: '>=16.6.0' - dependencies: - '@babel/runtime': 7.24.4 - dom-helpers: 5.2.1 - loose-envify: 1.4.0 - prop-types: 15.8.1 - react: 18.3.1 - react-dom: 18.3.1(react@18.3.1) - dev: false + dev: true /react@18.3.1: resolution: {integrity: sha512-wS+hAgJShR0KhEvPJArfuPVN1+Hz1t0Y6n5jLrGQbkb4urgPE/0Rve+1kMB1v/oWgHgm4WIcV+i7F2pTVj+2iQ==} @@ -4044,15 +3292,6 @@ packages: dependencies: loose-envify: 1.4.0 - /readable-stream@3.6.2: - resolution: {integrity: sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==} - engines: {node: '>= 6'} - dependencies: - inherits: 2.0.4 - string_decoder: 1.3.0 - util-deprecate: 1.0.2 - dev: true - /recrawl-sync@2.2.3: resolution: {integrity: sha512-vSaTR9t+cpxlskkdUFrsEpnf67kSmPk66yAGT1fZPrDudxQjoMzPgQhSMImQ0pAw5k0NPirefQfhopSjhdUtpQ==} dependencies: @@ -4076,10 +3315,6 @@ packages: which-builtin-type: 1.1.3 dev: true - /regenerator-runtime@0.14.1: - resolution: {integrity: sha512-dYnhHh0nJoMfnkZs6GmmhFknAGRrLznOu5nc9ML+EJxGvrx6H7teuevqVqCuPcPK//3eDrrjQhehXVx9cnkGdw==} - dev: false - /regexp.prototype.flags@1.5.2: resolution: {integrity: sha512-NcDiDkTLuPR+++OCKB0nWafEmhg/Da8aUPLPMQbK+bxKKCm1/S5he+AqYa4PlMCVBalb4/yxIRub6qkEx5yJbw==} engines: {node: '>= 0.4'} @@ -4121,10 +3356,6 @@ packages: supports-preserve-symlinks-flag: 1.0.0 dev: true - /retimer@3.0.0: - resolution: {integrity: sha512-WKE0j11Pa0ZJI5YIk0nflGI7SQsfl2ljihVy7ogh7DeQSeYAUi0ubZ/yEueGtDfUPk6GH5LRw1hBdLq4IwUBWA==} - dev: true - /reusify@1.0.4: resolution: {integrity: sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==} engines: {iojs: '>=1.0.0', node: '>=0.10.0'} @@ -4190,9 +3421,6 @@ packages: isarray: 2.0.5 dev: true - /safe-buffer@5.2.1: - resolution: {integrity: sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==} - /safe-regex-test@1.0.3: resolution: {integrity: sha512-CdASjNJPvRa7roO6Ra/gLYBTzYzzPyyBXxIMdGW3USQLyjWEls2RgW5UBTXaQVp+OrpeCK3bLem8smtmheoRuw==} engines: {node: '>= 0.4'} @@ -4202,10 +3430,6 @@ packages: is-regex: 1.1.4 dev: true - /safer-buffer@2.1.2: - resolution: {integrity: sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==} - dev: true - /scheduler@0.23.2: resolution: {integrity: sha512-UOShsPwz7NrMUqhR6t0hWjFduvOzbtv7toDH1/hIrfRNIDBnnBWd0CwJTGvTpngVlmwGCdP9/Zl/tVrDqcuYzQ==} dependencies: @@ -4222,38 +3446,6 @@ packages: hasBin: true dependencies: lru-cache: 6.0.0 - - /send@0.18.0: - resolution: {integrity: sha512-qqWzuOjSFOuqPjFe4NOsMLafToQQwBSOEpS+FwEt3A2V3vKubTquT3vmLTQpFgMXp8AlFWFuP1qKaJZOtPpVXg==} - engines: {node: '>= 0.8.0'} - dependencies: - debug: 2.6.9 - depd: 2.0.0 - destroy: 1.2.0 - encodeurl: 1.0.2 - escape-html: 1.0.3 - etag: 1.8.1 - fresh: 0.5.2 - http-errors: 2.0.0 - mime: 1.6.0 - ms: 2.1.3 - on-finished: 2.4.1 - range-parser: 1.2.1 - statuses: 2.0.1 - transitivePeerDependencies: - - supports-color - dev: true - - /serve-static@1.15.0: - resolution: {integrity: sha512-XGuRDNjXUijsUL0vl6nSD7cwURuzEgglbOaFuZM9g3kwDXOWVTck0jLzjPzGD+TazWbboZYu52/9/XPdUgne9g==} - engines: {node: '>= 0.8.0'} - dependencies: - encodeurl: 1.0.2 - escape-html: 1.0.3 - parseurl: 1.3.3 - send: 0.18.0 - transitivePeerDependencies: - - supports-color dev: true /set-function-length@1.2.2: @@ -4278,10 +3470,6 @@ packages: has-property-descriptors: 1.0.2 dev: true - /setprototypeof@1.2.0: - resolution: {integrity: sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==} - dev: true - /shebang-command@2.0.0: resolution: {integrity: sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==} engines: {node: '>=8'} @@ -4330,11 +3518,6 @@ packages: engines: {node: '>=0.10.0'} dev: true - /statuses@2.0.1: - resolution: {integrity: sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==} - engines: {node: '>= 0.8'} - dev: true - /streamsearch@1.1.0: resolution: {integrity: sha512-Mcc5wHehp9aXz1ax6bZUyY5afg9u2rv5cqQI3mRrYkGC8rW2hM02jWuwjtL++LS5qinSyhj2QfLyNsuc+VsExg==} engines: {node: '>=10.0.0'} @@ -4402,12 +3585,6 @@ packages: es-object-atoms: 1.0.0 dev: true - /string_decoder@1.3.0: - resolution: {integrity: sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==} - dependencies: - safe-buffer: 5.2.1 - dev: true - /strip-ansi@6.0.1: resolution: {integrity: sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==} engines: {node: '>=8'} @@ -4470,10 +3647,6 @@ packages: engines: {node: '>=6'} dev: true - /telegram-webapps-types@1.0.5: - resolution: {integrity: sha512-QLBBjEgdGdJZmnSshq2jVUrqwolRBiM7e0YPsUpHOFxA2W9nkUYI5yBFd3vGyCqFlNoJw8S6k2Q7lxVffzUwlw==} - dev: false - /text-table@0.2.0: resolution: {integrity: sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==} dev: true @@ -4503,11 +3676,6 @@ packages: is-number: 7.0.0 dev: true - /toidentifier@1.0.1: - resolution: {integrity: sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==} - engines: {node: '>=0.6'} - dev: true - /totalist@3.0.1: resolution: {integrity: sha512-sf4i37nQ2LBx4m3wB74y+ubopq6W/dIzXg0FDGjsYnZHVa1Da8FH853wlL2gtUhg+xJXjfk3kUZS3BRoQeoQBQ==} engines: {node: '>=6'} @@ -4551,6 +3719,7 @@ packages: /tslib@1.14.1: resolution: {integrity: sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==} + dev: true /tslib@2.6.2: resolution: {integrity: sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==} @@ -4582,14 +3751,6 @@ packages: engines: {node: '>=14.16'} dev: true - /type-is@1.6.18: - resolution: {integrity: sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==} - engines: {node: '>= 0.6'} - dependencies: - media-typer: 0.3.0 - mime-types: 2.1.35 - dev: true - /typed-array-buffer@1.0.2: resolution: {integrity: sha512-gEymJYKZtKXzzBzM4jqa9w6Q1Jjm7x2d+sh19AdsD4wqnMPDYyvwpsIc2Q/835kHuo3BEQ7CjelGhfTsoBb2MQ==} engines: {node: '>= 0.4'} @@ -4658,11 +3819,6 @@ packages: engines: {node: '>= 4.0.0'} dev: true - /unpipe@1.0.0: - resolution: {integrity: sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==} - engines: {node: '>= 0.8'} - dev: true - /update-browserslist-db@1.0.13(browserslist@4.23.0): resolution: {integrity: sha512-xebP81SNcPuNpPP3uzeW1NYXxI3rxyJzF3pD6sH4jE7o/IX+WtSpwnVU+qIsDPyk0d3hmFQ7mjqc6AtV604hbg==} hasBin: true @@ -4690,37 +3846,6 @@ packages: /urlpattern-polyfill@10.0.0: resolution: {integrity: sha512-H/A06tKD7sS1O1X2SshBVeA5FLycRpjqiBeqGKmBwBDBy28EnRjORxTNe269KSSr5un5qyWi1iL61wLxpd+ZOg==} - /use-constant@1.1.1(react@18.3.1): - resolution: {integrity: sha512-sy2ttlE4kuAnNbp2P6a5aTZiGYwsZojkqaGZ31yDDjIurteUS8GOcYiPGmJ3y/LHOHkdazDdVRBZPzH3RZHffA==} - peerDependencies: - react: ^16.8.0 || ^17.0.0 || ^18.0.0 - dependencies: - react: 18.3.1 - dev: false - - /util-deprecate@1.0.2: - resolution: {integrity: sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==} - dev: true - - /utils-merge@1.0.1: - resolution: {integrity: sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA==} - engines: {node: '>= 0.4.0'} - dev: true - - /uuid-parse@1.1.0: - resolution: {integrity: sha512-OdmXxA8rDsQ7YpNVbKSJkNzTw2I+S5WsbMDnCtIWSQaosNAcWtFuI/YK1TjzUI6nbkgiqEyh8gWngfcv8Asd9A==} - dev: true - - /uuid@8.3.2: - resolution: {integrity: sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==} - hasBin: true - dev: true - - /vary@1.1.2: - resolution: {integrity: sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==} - engines: {node: '>= 0.8'} - dev: true - /vite-tsconfig-paths@3.6.0(vite@5.2.10): resolution: {integrity: sha512-UfsPYonxLqPD633X8cWcPFVuYzx/CMNHAjZTasYwX69sXpa4gNmQkR0XCjj82h7zhLGdTWagMjC1qfb9S+zv0A==} peerDependencies: @@ -4864,17 +3989,13 @@ packages: resolution: {integrity: sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==} dev: true - /xtend@4.0.2: - resolution: {integrity: sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==} - engines: {node: '>=0.4'} - dev: true - /yallist@3.1.1: resolution: {integrity: sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==} dev: true /yallist@4.0.0: resolution: {integrity: sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==} + dev: true /yocto-queue@0.1.0: resolution: {integrity: sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==} diff --git a/src/backend/colorGen.ts b/src/backend/colorGen.ts new file mode 100644 index 0000000..ef6f8e7 --- /dev/null +++ b/src/backend/colorGen.ts @@ -0,0 +1,86 @@ +import { getTime, preWakeupTime, wakeupTimeWeekend, wakeupTime, HSLToRGB, hexToRgb, clamp } from 'src/helpers' +import { settings } from 'src/settings' +import { pixelsCount, colorNoise, activeColors, colors, dynamic } from './shared' + +let disabledColor = [0, 0, 1] +let frameIndex = 0 +export function getPixels(mode: number): [number, number, number][] { + frameIndex++ + + const pixels = Array(pixelsCount) + .fill([0, 0, 0]) + .map((_, index) => { + if (mode === 0) { + if (index % 1000 === 0) { + const d = new Date() + const day = d.getDay() + const isWeekend = [6, 7].includes(day) + const time = getTime(d.getHours(), d.getMinutes()) + if (time >= preWakeupTime && time <= (isWeekend ? wakeupTimeWeekend : wakeupTime)) { + if (disabledColor[1] !== 1) disabledColor = [0, 1, 0] + } else { + if (disabledColor[2] !== 1) disabledColor = [0, 0, 1] + } + } + return disabledColor + } else if (mode === 1) { + const color = (frameIndex + index) % 360 + return HSLToRGB(color, 50, 100) + } else if (mode === 2) { + const { current, total, lastUpdate } = settings.progress + + const mult = total / pixelsCount + const progress = current / mult || 0 // 0 / 0 = NaN + const dist = Math.abs(progress - index) + + let lightness = clamp(25, progress > index ? 50 : 50 - 20 * dist, 50) + let saturation = lightness * 2 + let color = (frameIndex + index) % 360 + + if (total === 0) { + lightness = 50 + saturation = 50 + } else if (current >= total - 1) { + color = 150 + } + + const framesPerScene = 30 + const scenes = total / framesPerScene + const sceneLength = Math.floor(pixelsCount / scenes) + if (index % sceneLength === 0) { + lightness = 20 + saturation = 0 + } + + if (lastUpdate && Date.now() - lastUpdate.getTime() > 300000 && progress / total < 0.95) { + color = 0 + } + + return HSLToRGB(color, saturation, lightness) + } else if (mode === 3) { + return [255, 255, 255] + } else if (mode === 4) { + return [5, 20, 5] + } else if (mode === 5) { + const x = index / 80 + frameIndex / 200 + const y = frameIndex / 300 + + const baseOffset = ((colorNoise(x, y) + 1) / 2 + index / pixelsCount) % 1 + const segmentWidth = 1 / (activeColors - 1) + const i = baseOffset + dynamic.offset * segmentWidth + const segmentIndex = Math.floor(i / segmentWidth) + const segmentFraction = (i % segmentWidth) / segmentWidth + const colorStart = colors.get(segmentIndex)! + const colorEnd = colors.get(segmentIndex + 1)! + + const mixed = colorStart.mix(colorEnd, segmentFraction, { space: 'lab', outputSpace: 'srgb' }) + + return mixed.coords.map(el => clamp(0, Math.floor(el * 255), 255)) + } else if (mode === 6) { + // console.log('color: ', settings.color) + return hexToRgb(settings.color) + } + }) as [number, number, number][] + + return pixels +} diff --git a/src/backend/config.ts b/src/backend/config.ts new file mode 100644 index 0000000..bcab88a --- /dev/null +++ b/src/backend/config.ts @@ -0,0 +1,6 @@ +import { IConfig } from 'src/typings' +import { config as dotenv } from 'dotenv' + +export const config: IConfig = { + ...(dotenv().parsed as unknown as IConfig), +} diff --git a/src/backend/index.ts b/src/backend/index.ts new file mode 100644 index 0000000..dd544df --- /dev/null +++ b/src/backend/index.ts @@ -0,0 +1,18 @@ +import { startTelegram } from './telegram' +import { startLoop } from './loop' +import { startRouterIntegration } from './router' +import { startUdpServer } from './udp' + +// eslint-disable-next-line no-undef +process.env.TZ = '***REMOVED***' + +let initted = false + +export function init() { + if (initted) return + initted = true + startLoop() + startTelegram() + startUdpServer() + startRouterIntegration() +} diff --git a/src/backend/loop.ts b/src/backend/loop.ts new file mode 100644 index 0000000..50b438f --- /dev/null +++ b/src/backend/loop.ts @@ -0,0 +1,50 @@ +import { getCurrentMode } from 'src/helpers' +import { broadcastMessage } from 'src/routes/debug/stream.api' +import { getPixels } from './colorGen' +import { pixelsCount, dynamic, colors, randomColor } from './shared' +import { socket } from './udp' + +export function startLoop() { + let colorChange = 0 + const buf = new Uint8Array(pixelsCount * 3) + setInterval(() => { + const rawOffset = dynamic.offset + 0.004 + dynamic.offset = rawOffset % 1 + if (rawOffset >= 1) colors.add(randomColor((colorChange += 7 / 3), Math.random() * 5)) + + if (import.meta.env.DEV) { + const mode = 5 + const pixels = getPixels(mode) + broadcastMessage(JSON.stringify(pixels)) + } + + if (!dynamic.target) return + if (Date.now() - (dynamic.lastMessage || 0) > 7000) { + delete dynamic.target + return + } + + const mode = getCurrentMode() + + const pixels = getPixels(mode) + + for (let index = 0; index < pixels.length; index++) { + for (let color = 0; color < 3; color++) { + let actualColor = color + switch (color) { + case 0: + actualColor = 1 + break + case 1: + actualColor = 0 + break + } + const colorValue = pixels[index][actualColor] + buf[index * 3 + actualColor] = actualColor === 0 ? colorValue * 0.5 : colorValue + } + } + + const { address, port } = dynamic.target + socket.send(buf, port, address) + }, 16) +} diff --git a/src/backend/routerIntegration.ts b/src/backend/router.ts similarity index 61% rename from src/backend/routerIntegration.ts rename to src/backend/router.ts index 21130f2..8dc27a2 100644 --- a/src/backend/routerIntegration.ts +++ b/src/backend/router.ts @@ -2,10 +2,12 @@ import { AxiosError, default as axios } from 'axios' import { wrapper } from 'axios-cookiejar-support' import { CookieJar } from 'tough-cookie' import crypto from 'crypto' +import { settings } from 'src/settings' +import { config } from './config' const jar = new CookieJar() -const client = wrapper(axios.create({ jar, baseURL: 'https://***REMOVED***' })) -const auth = { login: 'api', password: '***REMOVED***' } +const client = wrapper(axios.create({ jar, baseURL: config.routerEndpoint })) +const auth = { login: 'api', password: config.routerPassword } async function init() { try { @@ -43,3 +45,22 @@ export async function phoneLastSeen() { console.error('phone last seen failed', (err as AxiosError).response?.data) } } + +let seenTimeout: NodeJS.Timeout | null = null +async function updatePhoneLastSeen() { + const lastSeen = await phoneLastSeen() + // eslint-disable-next-line no-console + console.log('phone last seen:', lastSeen) + if (lastSeen === undefined || lastSeen > 120) { + if (!seenTimeout) seenTimeout = setTimeout(() => (settings.away = true), 120000) + } else { + if (seenTimeout) clearTimeout(seenTimeout) + seenTimeout = null + settings.away = false + } +} + +export function startRouterIntegration() { + setInterval(updatePhoneLastSeen, 120000) + updatePhoneLastSeen() +} diff --git a/src/backend/shared.ts b/src/backend/shared.ts new file mode 100644 index 0000000..0ef42bc --- /dev/null +++ b/src/backend/shared.ts @@ -0,0 +1,19 @@ +// eslint-disable-next-line import/default +import RingBufferTs from 'ring-buffer-ts' +const RingBuffer = RingBufferTs.RingBuffer +import { createNoise2D } from 'simplex-noise' +import Color from 'colorjs.io' +import { IDynamicDto } from 'src/typings' + +export const activeColors = 5 +export const colorNoise = createNoise2D() +export const pixelsCount = 288 + +export const dynamic: IDynamicDto = { + offset: 0, +} + +export const colors = new RingBuffer(activeColors + 1) + +export const randomColor = (x: number, y: number) => new Color('hsl', [((colorNoise(x, y) + 1) * 1000) % 360, 100, 50]) +for (let i = 0; i <= activeColors; i++) colors.add(randomColor(Math.random() * 10, 0)) diff --git a/src/backend/startStrip.ts b/src/backend/startStrip.ts deleted file mode 100644 index 6adb797..0000000 --- a/src/backend/startStrip.ts +++ /dev/null @@ -1,186 +0,0 @@ -// eslint-disable-next-line no-undef -process.env.TZ = '***REMOVED***' -import datagram from 'dgram' -import { initTg } from './grammy' -import { createNoise2D } from 'simplex-noise' -import { settings } from '../settings' -import Color from 'colorjs.io' -// eslint-disable-next-line import/default -import RingBufferTs from 'ring-buffer-ts' -const RingBuffer = RingBufferTs.RingBuffer -import { broadcastMessage } from '../routes/debug-stream.api' -import { phoneLastSeen } from './routerIntegration' -import { HSLToRGB, clamp, getCurrentMode, getTime, hexToRgb, preWakeupTime, wakeupTime, wakeupTimeWeekend } from 'src/helpers' - -const socket = datagram.createSocket('udp4') - -let colorChange = 0 -let offset = 0 -let exec = 0 -const activeColors = 5 -const colorNoise = createNoise2D() -const randomColor = (x: number, y: number) => new Color('hsl', [((colorNoise(x, y) + 1) * 1000) % 360, 100, 50]) -const colors = new RingBuffer(activeColors + 1) -for (let i = 0; i <= activeColors; i++) colors.add(randomColor(Math.random() * 10, 0)) -const pixelsCount = 288 - -let disabledColor = [0, 0, 1] - -function getPixels(mode: number, frameIndex: number): [number, number, number][] { - const pixels = Array(pixelsCount) - .fill([0, 0, 0]) - .map((_, index) => { - if (mode === 0) { - if (index % 1000 === 0) { - const d = new Date() - const day = d.getDay() - const isWeekend = [6, 7].includes(day) - const time = getTime(d.getHours(), d.getMinutes()) - if (time >= preWakeupTime && time <= (isWeekend ? wakeupTimeWeekend : wakeupTime)) { - if (disabledColor[1] !== 1) disabledColor = [0, 1, 0] - } else { - if (disabledColor[2] !== 1) disabledColor = [0, 0, 1] - } - } - return disabledColor - } else if (mode === 1) { - const color = (frameIndex + index) % 360 - return HSLToRGB(color, 50, 100) - } else if (mode === 2) { - const { current, total, lastUpdate } = settings.progress - - const mult = total / pixelsCount - const progress = current / mult || 0 // 0 / 0 = NaN - const dist = Math.abs(progress - index) - - let lightness = clamp(25, progress > index ? 50 : 50 - 20 * dist, 50) - let saturation = lightness * 2 - let color = (frameIndex + index) % 360 - - if (total === 0) { - lightness = 50 - saturation = 50 - } else if (current >= total - 1) { - color = 150 - } - - const framesPerScene = 30 - const scenes = total / framesPerScene - const sceneLength = Math.floor(pixelsCount / scenes) - if (index % sceneLength === 0) { - lightness = 20 - saturation = 0 - } - - if (lastUpdate && Date.now() - lastUpdate.getTime() > 300000 && progress / total < 0.95) { - color = 0 - } - - return HSLToRGB(color, saturation, lightness) - } else if (mode === 3) { - return [255, 255, 255] - } else if (mode === 4) { - return [5, 20, 5] - } else if (mode === 5) { - const x = index / 80 + frameIndex / 200 - const y = frameIndex / 300 - - const baseOffset = ((colorNoise(x, y) + 1) / 2 + index / pixelsCount) % 1 - const segmentWidth = 1 / (activeColors - 1) - const i = baseOffset + offset * segmentWidth - const segmentIndex = Math.floor(i / segmentWidth) - const segmentFraction = (i % segmentWidth) / segmentWidth - const colorStart = colors.get(segmentIndex)! - const colorEnd = colors.get(segmentIndex + 1)! - - const mixed = colorStart.mix(colorEnd, segmentFraction, { space: 'lab', outputSpace: 'srgb' }) - - return mixed.coords.map(el => clamp(0, Math.floor(el * 255), 255)) - } else if (mode === 6) { - // console.log('color: ', settings.color) - return hexToRgb(settings.color) - } - }) as [number, number, number][] - - return pixels -} - -let seenTimeout: NodeJS.Timeout | null = null -async function updatePhoneLastSeen() { - const lastSeen = await phoneLastSeen() - // eslint-disable-next-line no-console - console.log('phone last seen:', lastSeen) - if (lastSeen === undefined || lastSeen > 120) { - if (!seenTimeout) seenTimeout = setTimeout(() => (settings.away = true), 120000) - } else { - if (seenTimeout) clearTimeout(seenTimeout) - seenTimeout = null - settings.away = false - } -} -setInterval(updatePhoneLastSeen, 120000) -updatePhoneLastSeen() - -socket.on('error', e => console.error(e)) - -try { - socket.bind(8008, '0.0.0.0', () => { - // eslint-disable-next-line no-console - console.log('up on 8008') - initTg() - }) -} catch (err) { - console.error(err) -} - -let lastMessage: number -let target: datagram.RemoteInfo | null = null - -socket.on('message', (msg, newTarget) => { - lastMessage = Date.now() - target = newTarget -}) - -// let lastSent = 0 -const buf = new Uint8Array(pixelsCount * 3) -setInterval(() => { - exec++ - const rawOffset = offset + 0.004 - offset = rawOffset % 1 - if (rawOffset >= 1) colors.add(randomColor((colorChange += 7 / 3), Math.random() * 5)) - - if (import.meta.env.DEV) { - const mode = 5 - const pixels = getPixels(mode, exec) - return broadcastMessage(JSON.stringify(pixels)) - } - - if (!target) return - if (Date.now() - lastMessage > 7000) { - target = null - return - } - const { address, port } = target - - const mode = getCurrentMode() - - const pixels = getPixels(mode, exec) - - for (let index = 0; index < pixels.length; index++) { - for (let color = 0; color < 3; color++) { - let actualColor = color - switch (color) { - case 0: - actualColor = 1 - break - case 1: - actualColor = 0 - break - } - const colorValue = pixels[index][actualColor] - buf[index * 3 + actualColor] = actualColor === 0 ? colorValue * 0.5 : colorValue - } - } - - socket.send(buf, port, address) -}, 16) diff --git a/src/backend/grammy.ts b/src/backend/telegram.ts similarity index 90% rename from src/backend/grammy.ts rename to src/backend/telegram.ts index 4a7dcdc..70b0750 100644 --- a/src/backend/grammy.ts +++ b/src/backend/telegram.ts @@ -1,12 +1,13 @@ import { Bot, Context } from 'grammy' import { settings } from '../settings' - -const bot = new Bot('***REMOVED***:***REMOVED***') import { MenuTemplate, MenuMiddleware, createBackMainMenuButtons } from 'grammy-inline-menu' +import { config } from './config' + +const bot = new Bot(config.tgApiKey) const menuTemplate = new MenuTemplate(ctx => `привет ${ctx?.from?.first_name}`) -const allowedUsers = [***REMOVED***] +const allowedUsers = config.tgAllowedUsers.split(',').map(el => parseInt(el)) menuTemplate.interact('ночь', 'nightOverride', { do: async ctx => { @@ -48,6 +49,6 @@ bot.command('start', ctx => { }) bot.use(menuMiddleware) -export function initTg() { +export function startTelegram() { if (import.meta.env.PROD) bot.start().catch(err => console.error(err)) } diff --git a/src/backend/udp.ts b/src/backend/udp.ts new file mode 100644 index 0000000..5ec0e0a --- /dev/null +++ b/src/backend/udp.ts @@ -0,0 +1,21 @@ +import datagram from 'dgram' +import { dynamic } from './shared' + +export const socket = datagram.createSocket('udp4') +socket.on('error', e => console.error(e)) + +export function startUdpServer() { + try { + socket.bind(8008, '0.0.0.0', () => { + // eslint-disable-next-line no-console + console.log('up on 8008') + }) + } catch (err) { + console.error(err) + } +} + +socket.on('message', (msg, newTarget) => { + dynamic.lastMessage = Date.now() + dynamic.target = newTarget +}) diff --git a/src/entry-node.ts b/src/entry-node.ts index 1c5fd23..a16b6ab 100644 --- a/src/entry-node.ts +++ b/src/entry-node.ts @@ -1,4 +1,6 @@ import { createMiddleware } from 'rakkasjs/node-adapter' -import './backend/startStrip.js' +import { init } from './backend' + +init() export default createMiddleware(ctx => import('./entry-hattip').then(m => m.default(ctx))) diff --git a/src/routes/Debug.tsx b/src/routes/debug/Debug.tsx similarity index 93% rename from src/routes/Debug.tsx rename to src/routes/debug/Debug.tsx index 578fc15..1b0c995 100644 --- a/src/routes/Debug.tsx +++ b/src/routes/debug/Debug.tsx @@ -2,14 +2,14 @@ import { Head } from 'rakkasjs' import { useEffect, useRef, useState } from 'react' import classes from './pixel.module.css' -import { rgbToHex } from '../helpers' +import { rgbToHex } from '../../helpers' let eventSource: EventSource // eslint-disable-next-line ssr-friendly/no-dom-globals-in-module-scope if (typeof window !== 'undefined') window.addEventListener('unload', () => eventSource.close()) export default function Debug() { - eventSource = eventSource ?? new EventSource('/debug-stream') + eventSource = eventSource ?? new EventSource('/debug/stream') const [readyState, setReadyState] = useState(eventSource.readyState) const pixelsRef = useRef(null) diff --git a/src/routes/debug.page.tsx b/src/routes/debug/index.page.tsx similarity index 100% rename from src/routes/debug.page.tsx rename to src/routes/debug/index.page.tsx diff --git a/src/routes/pixel.module.css b/src/routes/debug/pixel.module.css similarity index 100% rename from src/routes/pixel.module.css rename to src/routes/debug/pixel.module.css diff --git a/src/routes/debug-stream.api.ts b/src/routes/debug/stream.api.ts similarity index 100% rename from src/routes/debug-stream.api.ts rename to src/routes/debug/stream.api.ts diff --git a/src/typings.ts b/src/typings.ts index 74b917d..9715b67 100644 --- a/src/typings.ts +++ b/src/typings.ts @@ -1,3 +1,5 @@ +import Datagram from 'dgram' + export enum IMode { Disabled, Rainbow, @@ -27,3 +29,16 @@ export interface ISettings { away: boolean alive: Date } + +export interface IDynamicDto { + offset: number + lastMessage?: number + target?: Datagram.RemoteInfo +} + +export interface IConfig { + routerEndpoint: string + tgAllowedUsers: string + tgApiKey: string + routerPassword: string +}