2
0
mirror of https://github.com/ad1217/PrinterStatus synced 2024-12-27 03:55:43 -05:00

Compare commits

...

4 Commits

12 changed files with 688 additions and 877 deletions

View File

@ -1,19 +1,20 @@
{ {
"name": "printer_status", "name": "printer_status",
"version": "0.0.0", "version": "0.0.0",
"type": "module",
"devDependencies": { "devDependencies": {
"@vitejs/plugin-vue": "^3.0.3", "@vitejs/plugin-vue": "^3.1.2",
"sass": "^1.54.5", "sass": "^1.55.0",
"typescript": "^4.7.4", "typescript": "^4.8.4",
"vite": "^3.0.9", "vite": "^3.1.8",
"vue-tsc": "^0.40.1" "vue-tsc": "^1.0.9"
}, },
"dependencies": { "dependencies": {
"@popperjs/core": "^2.11.6", "@popperjs/core": "^2.11.6",
"bootstrap": "^5.2.0", "bootstrap": "^5.2.2",
"hls.js": "^1.2.1", "hls.js": "^1.2.4",
"pretty-ms": "^7.0.1", "pretty-ms": "^8.0.0",
"vue": "^3.2.37" "vue": "^3.2.41"
}, },
"scripts": { "scripts": {
"start": "pnpm run -r --include-workspace-root --parallel dev", "start": "pnpm run -r --include-workspace-root --parallel dev",

492
pnpm-lock.yaml generated
View File

@ -2,57 +2,66 @@ lockfileVersion: 5.4
specifiers: specifiers:
'@popperjs/core': ^2.11.6 '@popperjs/core': ^2.11.6
'@vitejs/plugin-vue': ^3.0.3 '@vitejs/plugin-vue': ^3.1.2
bootstrap: ^5.2.0 bootstrap: ^5.2.2
hls.js: ^1.2.1 hls.js: ^1.2.4
pretty-ms: ^7.0.1 pretty-ms: ^8.0.0
sass: ^1.54.5 sass: ^1.55.0
typescript: ^4.7.4 typescript: ^4.8.4
vite: ^3.0.9 vite: ^3.1.8
vue: ^3.2.37 vue: ^3.2.41
vue-tsc: ^0.40.1 vue-tsc: ^1.0.9
dependencies: dependencies:
'@popperjs/core': 2.11.6 '@popperjs/core': 2.11.6
bootstrap: 5.2.0_@popperjs+core@2.11.6 bootstrap: 5.2.2_@popperjs+core@2.11.6
hls.js: 1.2.1 hls.js: 1.2.4
pretty-ms: 7.0.1 pretty-ms: 8.0.0
vue: 3.2.37 vue: 3.2.41
devDependencies: devDependencies:
'@vitejs/plugin-vue': 3.0.3_vite@3.0.9+vue@3.2.37 '@vitejs/plugin-vue': 3.1.2_vite@3.1.8+vue@3.2.41
sass: 1.54.5 sass: 1.55.0
typescript: 4.7.4 typescript: 4.8.4
vite: 3.0.9_sass@1.54.5 vite: 3.1.8_sass@1.55.0
vue-tsc: 0.40.1_typescript@4.7.4 vue-tsc: 1.0.9_typescript@4.8.4
packages: packages:
/@babel/helper-string-parser/7.18.10: /@babel/helper-string-parser/7.19.4:
resolution: {integrity: sha512-XtIfWmeNY3i4t7t4D2t02q50HvqHybPqW2ki1kosnvWCwuCMeo81Jf0gwr85jy/neUdg5XDdeFE/80DXiO+njw==} resolution: {integrity: sha512-nHtDoQcuqFmwYNYPz3Rah5ph2p8PFeFCsZk9A/48dPc/rGocJ5J3hAAZ7pb76VWX3fZKu+uEr/FhH5jLx7umrw==}
engines: {node: '>=6.9.0'} engines: {node: '>=6.9.0'}
/@babel/helper-validator-identifier/7.18.6: /@babel/helper-validator-identifier/7.19.1:
resolution: {integrity: sha512-MmetCkz9ej86nJQV+sFCxoGGrUbU3q02kgLciwkrt9QqEB7cP39oKEY0PakknEO0Gu20SskMRi+AYZ3b1TpN9g==} resolution: {integrity: sha512-awrNfaMtnHUr653GgGEs++LlAvW6w+DcPrOliSMXWCKo597CwL5Acf/wWdNkf/tfEQE3mjkeD1YOVZOUV/od1w==}
engines: {node: '>=6.9.0'} engines: {node: '>=6.9.0'}
/@babel/parser/7.18.13: /@babel/parser/7.19.6:
resolution: {integrity: sha512-dgXcIfMuQ0kgzLB2b9tRZs7TTFFaGM2AbtA4fJgUUYukzGH4jwsS7hzQHEGs67jdehpm22vkgKwvbU+aEflgwg==} resolution: {integrity: sha512-h1IUp81s2JYJ3mRkdxJgs4UvmSsRvDrx5ICSJbPvtWYv5i1nTBGcBpnog+89rAFMwvvru6E5NUHdBe01UeSzYA==}
engines: {node: '>=6.0.0'} engines: {node: '>=6.0.0'}
hasBin: true hasBin: true
dependencies: dependencies:
'@babel/types': 7.18.13 '@babel/types': 7.19.4
/@babel/types/7.18.13: /@babel/types/7.19.4:
resolution: {integrity: sha512-ePqfTihzW0W6XAU+aMw2ykilisStJfDnsejDCXRchCcMJ4O0+8DhPXf2YUbZ6wjBlsEmZwLK/sPweWtu8hcJYQ==} resolution: {integrity: sha512-M5LK7nAeS6+9j7hAq+b3fQs+pNfUtTGq+yFFfHnauFA8zQtLRfmuipmsKDKKLuyG+wC8ABW43A153YNawNTEtw==}
engines: {node: '>=6.9.0'} engines: {node: '>=6.9.0'}
dependencies: dependencies:
'@babel/helper-string-parser': 7.18.10 '@babel/helper-string-parser': 7.19.4
'@babel/helper-validator-identifier': 7.18.6 '@babel/helper-validator-identifier': 7.19.1
to-fast-properties: 2.0.0 to-fast-properties: 2.0.0
/@esbuild/linux-loong64/0.14.54: /@esbuild/android-arm/0.15.12:
resolution: {integrity: sha512-bZBrLAIX1kpWelV0XemxBZllyRmM6vgFQQG2GdNb+r3Fkp0FOh1NJSvekXDs7jq70k4euu1cryLMfU+mTXlEpw==} resolution: {integrity: sha512-IC7TqIqiyE0MmvAhWkl/8AEzpOtbhRNDo7aph47We1NbE5w2bt/Q+giAhe0YYeVpYnIhGMcuZY92qDK6dQauvA==}
engines: {node: '>=12'}
cpu: [arm]
os: [android]
requiresBuild: true
dev: true
optional: true
/@esbuild/linux-loong64/0.15.12:
resolution: {integrity: sha512-tZEowDjvU7O7I04GYvWQOS4yyP9E/7YlsB0jjw1Ycukgr2ycEzKyIk5tms5WnLBymaewc6VmRKnn5IJWgK4eFw==}
engines: {node: '>=12'} engines: {node: '>=12'}
cpu: [loong64] cpu: [loong64]
os: [linux] os: [linux]
@ -64,125 +73,129 @@ packages:
resolution: {integrity: sha512-50/17A98tWUfQ176raKiOGXuYpLyyVMkxxG6oylzL3BPOlA6ADGdK7EYunSa4I064xerltq9TGXs8HmOk5E+vw==} resolution: {integrity: sha512-50/17A98tWUfQ176raKiOGXuYpLyyVMkxxG6oylzL3BPOlA6ADGdK7EYunSa4I064xerltq9TGXs8HmOk5E+vw==}
dev: false dev: false
/@vitejs/plugin-vue/3.0.3_vite@3.0.9+vue@3.2.37: /@vitejs/plugin-vue/3.1.2_vite@3.1.8+vue@3.2.41:
resolution: {integrity: sha512-U4zNBlz9mg+TA+i+5QPc3N5lQvdUXENZLO2h0Wdzp56gI1MWhqJOv+6R+d4kOzoaSSq6TnGPBdZAXKOe4lXy6g==} resolution: {integrity: sha512-3zxKNlvA3oNaKDYX0NBclgxTQ1xaFdL7PzwF6zj9tGFziKwmBa3Q/6XcJQxudlT81WxDjEhHmevvIC4Orc1LhQ==}
engines: {node: ^14.18.0 || >=16.0.0} engines: {node: ^14.18.0 || >=16.0.0}
peerDependencies: peerDependencies:
vite: ^3.0.0 vite: ^3.0.0
vue: ^3.2.25 vue: ^3.2.25
dependencies: dependencies:
vite: 3.0.9_sass@1.54.5 vite: 3.1.8_sass@1.55.0
vue: 3.2.37 vue: 3.2.41
dev: true dev: true
/@volar/code-gen/0.40.1: /@volar/language-core/1.0.9:
resolution: {integrity: sha512-mN1jn08wRKLoUj+KThltyWfsiEGt6Um1yT6S7bkruwV76yiLlzIR4WZgWng254byGMozJ00qgkZmBhraD5b48A==} resolution: {integrity: sha512-5Fty3slLet6svXiJw2YxhYeo6c7wFdtILrql5bZymYLM+HbiZtJbryW1YnUEKAP7MO9Mbeh+TNH4Z0HFxHgIqw==}
dependencies: dependencies:
'@volar/source-map': 0.40.1 '@volar/source-map': 1.0.9
'@vue/reactivity': 3.2.41
muggle-string: 0.1.0
dev: true dev: true
/@volar/source-map/0.40.1: /@volar/source-map/1.0.9:
resolution: {integrity: sha512-ORYg5W+R4iT2k/k2U4ASkKvDxabIzKtP+lXZ1CcqFIbTF81GOooAv5tJZImf8ifhUV9p8bgGaitFj/VnNzkdYg==} resolution: {integrity: sha512-fazB/vy5ZEJ3yKx4fabJyGNI3CBkdLkfEIRVu6+1P3VixK0Mn+eqyUIkLBrzGYaeFM3GybhCLCvsVdNz0Fu/CQ==}
dev: true
/@volar/typescript-faster/0.40.1:
resolution: {integrity: sha512-UiX8OzVRJtpudGfTY2KgB5m78DIA8oVbwI4QN5i4Ot8oURQPOviH7MahikHeeXidbh3iOy/u4vceMb+mfdizpQ==}
dependencies: dependencies:
semver: 7.3.7 muggle-string: 0.1.0
dev: true dev: true
/@volar/vue-language-core/0.40.1: /@volar/typescript/1.0.9:
resolution: {integrity: sha512-RBU2nQkj+asKZ/ht3sU3hTau+dGuTjJrQS3nNSw4+vnwUJnN/WogO/MmgKdrvVf3pUdLiucIog1E/Us1C8Y5wg==} resolution: {integrity: sha512-dVziu+ShQUWuMukM6bvK2v2O446/gG6l1XkTh2vfkccw1IzjfbiP1TWQoNo1ipTfZOtu5YJGYAx+o5HNrGXWfQ==}
dependencies: dependencies:
'@volar/code-gen': 0.40.1 '@volar/language-core': 1.0.9
'@volar/source-map': 0.40.1
'@vue/compiler-core': 3.2.37
'@vue/compiler-dom': 3.2.37
'@vue/compiler-sfc': 3.2.37
'@vue/reactivity': 3.2.37
'@vue/shared': 3.2.37
dev: true dev: true
/@volar/vue-typescript/0.40.1: /@volar/vue-language-core/1.0.9:
resolution: {integrity: sha512-58nW/Xwy7VBkeIPmbyEmi/j1Ta2HxGl/5aFiEEpWxoas7vI1AM+txz8+MhWho4ZMw0w0eCqPtGgugD2rr+/v7w==} resolution: {integrity: sha512-tofNoR8ShPFenHT1YVMuvoXtXWwoQE+fiXVqSmW0dSKZqEDjWQ3YeXSd0a6aqyKaIbvR7kWWGp34WbpQlwf9Ww==}
dependencies: dependencies:
'@volar/code-gen': 0.40.1 '@volar/language-core': 1.0.9
'@volar/typescript-faster': 0.40.1 '@volar/source-map': 1.0.9
'@volar/vue-language-core': 0.40.1 '@vue/compiler-dom': 3.2.41
'@vue/compiler-sfc': 3.2.41
'@vue/reactivity': 3.2.41
'@vue/shared': 3.2.41
minimatch: 5.1.0
vue-template-compiler: 2.7.13
dev: true dev: true
/@vue/compiler-core/3.2.37: /@volar/vue-typescript/1.0.9:
resolution: {integrity: sha512-81KhEjo7YAOh0vQJoSmAD68wLfYqJvoiD4ulyedzF+OEk/bk6/hx3fTNVfuzugIIaTrOx4PGx6pAiBRe5e9Zmg==} resolution: {integrity: sha512-ZLe4y9YNbviACa7uAMCilzxA76gbbSlKfjspXBzk6fCobd8QCIig+VyDYcjANIlm2HhgSCX8jYTzhCKlegh4mw==}
dependencies: dependencies:
'@babel/parser': 7.18.13 '@volar/typescript': 1.0.9
'@vue/shared': 3.2.37 '@volar/vue-language-core': 1.0.9
dev: true
/@vue/compiler-core/3.2.41:
resolution: {integrity: sha512-oA4mH6SA78DT+96/nsi4p9DX97PHcNROxs51lYk7gb9Z4BPKQ3Mh+BLn6CQZBw857Iuhu28BfMSRHAlPvD4vlw==}
dependencies:
'@babel/parser': 7.19.6
'@vue/shared': 3.2.41
estree-walker: 2.0.2 estree-walker: 2.0.2
source-map: 0.6.1 source-map: 0.6.1
/@vue/compiler-dom/3.2.37: /@vue/compiler-dom/3.2.41:
resolution: {integrity: sha512-yxJLH167fucHKxaqXpYk7x8z7mMEnXOw3G2q62FTkmsvNxu4FQSu5+3UMb+L7fjKa26DEzhrmCxAgFLLIzVfqQ==} resolution: {integrity: sha512-xe5TbbIsonjENxJsYRbDJvthzqxLNk+tb3d/c47zgREDa/PCp6/Y4gC/skM4H6PIuX5DAxm7fFJdbjjUH2QTMw==}
dependencies: dependencies:
'@vue/compiler-core': 3.2.37 '@vue/compiler-core': 3.2.41
'@vue/shared': 3.2.37 '@vue/shared': 3.2.41
/@vue/compiler-sfc/3.2.37: /@vue/compiler-sfc/3.2.41:
resolution: {integrity: sha512-+7i/2+9LYlpqDv+KTtWhOZH+pa8/HnX/905MdVmAcI/mPQOBwkHHIzrsEsucyOIZQYMkXUiTkmZq5am/NyXKkg==} resolution: {integrity: sha512-+1P2m5kxOeaxVmJNXnBskAn3BenbTmbxBxWOtBq3mQTCokIreuMULFantBUclP0+KnzNCMOvcnKinqQZmiOF8w==}
dependencies: dependencies:
'@babel/parser': 7.18.13 '@babel/parser': 7.19.6
'@vue/compiler-core': 3.2.37 '@vue/compiler-core': 3.2.41
'@vue/compiler-dom': 3.2.37 '@vue/compiler-dom': 3.2.41
'@vue/compiler-ssr': 3.2.37 '@vue/compiler-ssr': 3.2.41
'@vue/reactivity-transform': 3.2.37 '@vue/reactivity-transform': 3.2.41
'@vue/shared': 3.2.37 '@vue/shared': 3.2.41
estree-walker: 2.0.2 estree-walker: 2.0.2
magic-string: 0.25.9 magic-string: 0.25.9
postcss: 8.4.16 postcss: 8.4.18
source-map: 0.6.1 source-map: 0.6.1
/@vue/compiler-ssr/3.2.37: /@vue/compiler-ssr/3.2.41:
resolution: {integrity: sha512-7mQJD7HdXxQjktmsWp/J67lThEIcxLemz1Vb5I6rYJHR5vI+lON3nPGOH3ubmbvYGt8xEUaAr1j7/tIFWiEOqw==} resolution: {integrity: sha512-Y5wPiNIiaMz/sps8+DmhaKfDm1xgj6GrH99z4gq2LQenfVQcYXmHIOBcs5qPwl7jaW3SUQWjkAPKMfQemEQZwQ==}
dependencies: dependencies:
'@vue/compiler-dom': 3.2.37 '@vue/compiler-dom': 3.2.41
'@vue/shared': 3.2.37 '@vue/shared': 3.2.41
/@vue/reactivity-transform/3.2.37: /@vue/reactivity-transform/3.2.41:
resolution: {integrity: sha512-IWopkKEb+8qpu/1eMKVeXrK0NLw9HicGviJzhJDEyfxTR9e1WtpnnbYkJWurX6WwoFP0sz10xQg8yL8lgskAZg==} resolution: {integrity: sha512-mK5+BNMsL4hHi+IR3Ft/ho6Za+L3FA5j8WvreJ7XzHrqkPq8jtF/SMo7tuc9gHjLDwKZX1nP1JQOKo9IEAn54A==}
dependencies: dependencies:
'@babel/parser': 7.18.13 '@babel/parser': 7.19.6
'@vue/compiler-core': 3.2.37 '@vue/compiler-core': 3.2.41
'@vue/shared': 3.2.37 '@vue/shared': 3.2.41
estree-walker: 2.0.2 estree-walker: 2.0.2
magic-string: 0.25.9 magic-string: 0.25.9
/@vue/reactivity/3.2.37: /@vue/reactivity/3.2.41:
resolution: {integrity: sha512-/7WRafBOshOc6m3F7plwzPeCu/RCVv9uMpOwa/5PiY1Zz+WLVRWiy0MYKwmg19KBdGtFWsmZ4cD+LOdVPcs52A==} resolution: {integrity: sha512-9JvCnlj8uc5xRiQGZ28MKGjuCoPhhTwcoAdv3o31+cfGgonwdPNuvqAXLhlzu4zwqavFEG5tvaoINQEfxz+l6g==}
dependencies: dependencies:
'@vue/shared': 3.2.37 '@vue/shared': 3.2.41
/@vue/runtime-core/3.2.37: /@vue/runtime-core/3.2.41:
resolution: {integrity: sha512-JPcd9kFyEdXLl/i0ClS7lwgcs0QpUAWj+SKX2ZC3ANKi1U4DOtiEr6cRqFXsPwY5u1L9fAjkinIdB8Rz3FoYNQ==} resolution: {integrity: sha512-0LBBRwqnI0p4FgIkO9q2aJBBTKDSjzhnxrxHYengkAF6dMOjeAIZFDADAlcf2h3GDALWnblbeprYYpItiulSVQ==}
dependencies: dependencies:
'@vue/reactivity': 3.2.37 '@vue/reactivity': 3.2.41
'@vue/shared': 3.2.37 '@vue/shared': 3.2.41
/@vue/runtime-dom/3.2.37: /@vue/runtime-dom/3.2.41:
resolution: {integrity: sha512-HimKdh9BepShW6YozwRKAYjYQWg9mQn63RGEiSswMbW+ssIht1MILYlVGkAGGQbkhSh31PCdoUcfiu4apXJoPw==} resolution: {integrity: sha512-U7zYuR1NVIP8BL6jmOqmapRAHovEFp7CSw4pR2FacqewXNGqZaRfHoNLQsqQvVQ8yuZNZtxSZy0FFyC70YXPpA==}
dependencies: dependencies:
'@vue/runtime-core': 3.2.37 '@vue/runtime-core': 3.2.41
'@vue/shared': 3.2.37 '@vue/shared': 3.2.41
csstype: 2.6.20 csstype: 2.6.21
/@vue/server-renderer/3.2.37_vue@3.2.37: /@vue/server-renderer/3.2.41_vue@3.2.41:
resolution: {integrity: sha512-kLITEJvaYgZQ2h47hIzPh2K3jG8c1zCVbp/o/bzQOyvzaKiCquKS7AaioPI28GNxIsE/zSx+EwWYsNxDCX95MA==} resolution: {integrity: sha512-7YHLkfJdTlsZTV0ae5sPwl9Gn/EGr2hrlbcS/8naXm2CDpnKUwC68i1wGlrYAfIgYWL7vUZwk2GkYLQH5CvFig==}
peerDependencies: peerDependencies:
vue: 3.2.37 vue: 3.2.41
dependencies: dependencies:
'@vue/compiler-ssr': 3.2.37 '@vue/compiler-ssr': 3.2.41
'@vue/shared': 3.2.37 '@vue/shared': 3.2.41
vue: 3.2.37 vue: 3.2.41
/@vue/shared/3.2.37: /@vue/shared/3.2.41:
resolution: {integrity: sha512-4rSJemR2NQIo9Klm1vabqWjD8rs/ZaJSzMxkMNeJS6lHiUjjUeYFbooN19NgFjztubEKh3WlZUeOLVdbbUWHsw==} resolution: {integrity: sha512-W9mfWLHmJhkfAmV+7gDjcHeAWALQtgGT3JErxULl0oz6R6+3ug91I7IErs93eCFhPCZPHBs4QJS7YWEV7A3sxw==}
/anymatch/3.1.2: /anymatch/3.1.2:
resolution: {integrity: sha512-P43ePfOAIupkguHUycrc4qJ9kz8ZiuOUijaETwX7THt0Y/GNK7v0aa8rY816xWjZ7rJdA5XdMcpVFTKMq+RvWg==} resolution: {integrity: sha512-P43ePfOAIupkguHUycrc4qJ9kz8ZiuOUijaETwX7THt0Y/GNK7v0aa8rY816xWjZ7rJdA5XdMcpVFTKMq+RvWg==}
@ -192,19 +205,29 @@ packages:
picomatch: 2.3.1 picomatch: 2.3.1
dev: true dev: true
/balanced-match/1.0.2:
resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==}
dev: true
/binary-extensions/2.2.0: /binary-extensions/2.2.0:
resolution: {integrity: sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==} resolution: {integrity: sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==}
engines: {node: '>=8'} engines: {node: '>=8'}
dev: true dev: true
/bootstrap/5.2.0_@popperjs+core@2.11.6: /bootstrap/5.2.2_@popperjs+core@2.11.6:
resolution: {integrity: sha512-qlnS9GL6YZE6Wnef46GxGv1UpGGzAwO0aPL1yOjzDIJpeApeMvqV24iL+pjr2kU4dduoBA9fINKWKgMToobx9A==} resolution: {integrity: sha512-dEtzMTV71n6Fhmbg4fYJzQsw1N29hJKO1js5ackCgIpDcGid2ETMGC6zwSYw09v05Y+oRdQ9loC54zB1La3hHQ==}
peerDependencies: peerDependencies:
'@popperjs/core': ^2.11.5 '@popperjs/core': ^2.11.6
dependencies: dependencies:
'@popperjs/core': 2.11.6 '@popperjs/core': 2.11.6
dev: false dev: false
/brace-expansion/2.0.1:
resolution: {integrity: sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==}
dependencies:
balanced-match: 1.0.2
dev: true
/braces/3.0.2: /braces/3.0.2:
resolution: {integrity: sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==} resolution: {integrity: sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==}
engines: {node: '>=8'} engines: {node: '>=8'}
@ -227,11 +250,15 @@ packages:
fsevents: 2.3.2 fsevents: 2.3.2
dev: true dev: true
/csstype/2.6.20: /csstype/2.6.21:
resolution: {integrity: sha512-/WwNkdXfckNgw6S5R125rrW8ez139lBHWouiBvX8dfMFtcn6V81REDqnH7+CRpRipfYlyU1CmOnOxrmGcFOjeA==} resolution: {integrity: sha512-Z1PhmomIfypOpoMjRQB70jfvy/wxT50qW08YXO5lMIJkrdq4yOTR+AW7FqutScmB9NkLwxo+jU+kZLbofZZq/w==}
/esbuild-android-64/0.14.54: /de-indent/1.0.2:
resolution: {integrity: sha512-Tz2++Aqqz0rJ7kYBfz+iqyE3QMycD4vk7LBRyWaAVFgFtQ/O8EJOnVmTOiDWYZ/uYzB4kvP+bqejYdVKzE5lAQ==} resolution: {integrity: sha512-e/1zu3xH5MQryN2zdVaF0OrdNLUbvWxzMbi+iNA6Bky7l1RoP8a2fIbRocyHclXt/arDrrR6lL3TqFD9pMQTsg==}
dev: true
/esbuild-android-64/0.15.12:
resolution: {integrity: sha512-MJKXwvPY9g0rGps0+U65HlTsM1wUs9lbjt5CU19RESqycGFDRijMDQsh68MtbzkqWSRdEtiKS1mtPzKneaAI0Q==}
engines: {node: '>=12'} engines: {node: '>=12'}
cpu: [x64] cpu: [x64]
os: [android] os: [android]
@ -239,8 +266,8 @@ packages:
dev: true dev: true
optional: true optional: true
/esbuild-android-arm64/0.14.54: /esbuild-android-arm64/0.15.12:
resolution: {integrity: sha512-F9E+/QDi9sSkLaClO8SOV6etqPd+5DgJje1F9lOWoNncDdOBL2YF59IhsWATSt0TLZbYCf3pNlTHvVV5VfHdvg==} resolution: {integrity: sha512-Hc9SEcZbIMhhLcvhr1DH+lrrec9SFTiRzfJ7EGSBZiiw994gfkVV6vG0sLWqQQ6DD7V4+OggB+Hn0IRUdDUqvA==}
engines: {node: '>=12'} engines: {node: '>=12'}
cpu: [arm64] cpu: [arm64]
os: [android] os: [android]
@ -248,8 +275,8 @@ packages:
dev: true dev: true
optional: true optional: true
/esbuild-darwin-64/0.14.54: /esbuild-darwin-64/0.15.12:
resolution: {integrity: sha512-jtdKWV3nBviOd5v4hOpkVmpxsBy90CGzebpbO9beiqUYVMBtSc0AL9zGftFuBon7PNDcdvNCEuQqw2x0wP9yug==} resolution: {integrity: sha512-qkmqrTVYPFiePt5qFjP8w/S+GIUMbt6k8qmiPraECUWfPptaPJUGkCKrWEfYFRWB7bY23FV95rhvPyh/KARP8Q==}
engines: {node: '>=12'} engines: {node: '>=12'}
cpu: [x64] cpu: [x64]
os: [darwin] os: [darwin]
@ -257,8 +284,8 @@ packages:
dev: true dev: true
optional: true optional: true
/esbuild-darwin-arm64/0.14.54: /esbuild-darwin-arm64/0.15.12:
resolution: {integrity: sha512-OPafJHD2oUPyvJMrsCvDGkRrVCar5aVyHfWGQzY1dWnzErjrDuSETxwA2HSsyg2jORLY8yBfzc1MIpUkXlctmw==} resolution: {integrity: sha512-z4zPX02tQ41kcXMyN3c/GfZpIjKoI/BzHrdKUwhC/Ki5BAhWv59A9M8H+iqaRbwpzYrYidTybBwiZAIWCLJAkw==}
engines: {node: '>=12'} engines: {node: '>=12'}
cpu: [arm64] cpu: [arm64]
os: [darwin] os: [darwin]
@ -266,8 +293,8 @@ packages:
dev: true dev: true
optional: true optional: true
/esbuild-freebsd-64/0.14.54: /esbuild-freebsd-64/0.15.12:
resolution: {integrity: sha512-OKwd4gmwHqOTp4mOGZKe/XUlbDJ4Q9TjX0hMPIDBUWWu/kwhBAudJdBoxnjNf9ocIB6GN6CPowYpR/hRCbSYAg==} resolution: {integrity: sha512-XFL7gKMCKXLDiAiBjhLG0XECliXaRLTZh6hsyzqUqPUf/PY4C6EJDTKIeqqPKXaVJ8+fzNek88285krSz1QECw==}
engines: {node: '>=12'} engines: {node: '>=12'}
cpu: [x64] cpu: [x64]
os: [freebsd] os: [freebsd]
@ -275,8 +302,8 @@ packages:
dev: true dev: true
optional: true optional: true
/esbuild-freebsd-arm64/0.14.54: /esbuild-freebsd-arm64/0.15.12:
resolution: {integrity: sha512-sFwueGr7OvIFiQT6WeG0jRLjkjdqWWSrfbVwZp8iMP+8UHEHRBvlaxL6IuKNDwAozNUmbb8nIMXa7oAOARGs1Q==} resolution: {integrity: sha512-jwEIu5UCUk6TjiG1X+KQnCGISI+ILnXzIzt9yDVrhjug2fkYzlLbl0K43q96Q3KB66v6N1UFF0r5Ks4Xo7i72g==}
engines: {node: '>=12'} engines: {node: '>=12'}
cpu: [arm64] cpu: [arm64]
os: [freebsd] os: [freebsd]
@ -284,8 +311,8 @@ packages:
dev: true dev: true
optional: true optional: true
/esbuild-linux-32/0.14.54: /esbuild-linux-32/0.15.12:
resolution: {integrity: sha512-1ZuY+JDI//WmklKlBgJnglpUL1owm2OX+8E1syCD6UAxcMM/XoWd76OHSjl/0MR0LisSAXDqgjT3uJqT67O3qw==} resolution: {integrity: sha512-uSQuSEyF1kVzGzuIr4XM+v7TPKxHjBnLcwv2yPyCz8riV8VUCnO/C4BF3w5dHiVpCd5Z1cebBtZJNlC4anWpwA==}
engines: {node: '>=12'} engines: {node: '>=12'}
cpu: [ia32] cpu: [ia32]
os: [linux] os: [linux]
@ -293,8 +320,8 @@ packages:
dev: true dev: true
optional: true optional: true
/esbuild-linux-64/0.14.54: /esbuild-linux-64/0.15.12:
resolution: {integrity: sha512-EgjAgH5HwTbtNsTqQOXWApBaPVdDn7XcK+/PtJwZLT1UmpLoznPd8c5CxqsH2dQK3j05YsB3L17T8vE7cp4cCg==} resolution: {integrity: sha512-QcgCKb7zfJxqT9o5z9ZUeGH1k8N6iX1Y7VNsEi5F9+HzN1OIx7ESxtQXDN9jbeUSPiRH1n9cw6gFT3H4qbdvcA==}
engines: {node: '>=12'} engines: {node: '>=12'}
cpu: [x64] cpu: [x64]
os: [linux] os: [linux]
@ -302,8 +329,8 @@ packages:
dev: true dev: true
optional: true optional: true
/esbuild-linux-arm/0.14.54: /esbuild-linux-arm/0.15.12:
resolution: {integrity: sha512-qqz/SjemQhVMTnvcLGoLOdFpCYbz4v4fUo+TfsWG+1aOu70/80RV6bgNpR2JCrppV2moUQkww+6bWxXRL9YMGw==} resolution: {integrity: sha512-Wf7T0aNylGcLu7hBnzMvsTfEXdEdJY/hY3u36Vla21aY66xR0MS5I1Hw8nVquXjTN0A6fk/vnr32tkC/C2lb0A==}
engines: {node: '>=12'} engines: {node: '>=12'}
cpu: [arm] cpu: [arm]
os: [linux] os: [linux]
@ -311,8 +338,8 @@ packages:
dev: true dev: true
optional: true optional: true
/esbuild-linux-arm64/0.14.54: /esbuild-linux-arm64/0.15.12:
resolution: {integrity: sha512-WL71L+0Rwv+Gv/HTmxTEmpv0UgmxYa5ftZILVi2QmZBgX3q7+tDeOQNqGtdXSdsL8TQi1vIaVFHUPDe0O0kdig==} resolution: {integrity: sha512-HtNq5xm8fUpZKwWKS2/YGwSfTF+339L4aIA8yphNKYJckd5hVdhfdl6GM2P3HwLSCORS++++7++//ApEwXEuAQ==}
engines: {node: '>=12'} engines: {node: '>=12'}
cpu: [arm64] cpu: [arm64]
os: [linux] os: [linux]
@ -320,8 +347,8 @@ packages:
dev: true dev: true
optional: true optional: true
/esbuild-linux-mips64le/0.14.54: /esbuild-linux-mips64le/0.15.12:
resolution: {integrity: sha512-qTHGQB8D1etd0u1+sB6p0ikLKRVuCWhYQhAHRPkO+OF3I/iSlTKNNS0Lh2Oc0g0UFGguaFZZiPJdJey3AGpAlw==} resolution: {integrity: sha512-Qol3+AvivngUZkTVFgLpb0H6DT+N5/zM3V1YgTkryPYFeUvuT5JFNDR3ZiS6LxhyF8EE+fiNtzwlPqMDqVcc6A==}
engines: {node: '>=12'} engines: {node: '>=12'}
cpu: [mips64el] cpu: [mips64el]
os: [linux] os: [linux]
@ -329,8 +356,8 @@ packages:
dev: true dev: true
optional: true optional: true
/esbuild-linux-ppc64le/0.14.54: /esbuild-linux-ppc64le/0.15.12:
resolution: {integrity: sha512-j3OMlzHiqwZBDPRCDFKcx595XVfOfOnv68Ax3U4UKZ3MTYQB5Yz3X1mn5GnodEVYzhtZgxEBidLWeIs8FDSfrQ==} resolution: {integrity: sha512-4D8qUCo+CFKaR0cGXtGyVsOI7w7k93Qxb3KFXWr75An0DHamYzq8lt7TNZKoOq/Gh8c40/aKaxvcZnTgQ0TJNg==}
engines: {node: '>=12'} engines: {node: '>=12'}
cpu: [ppc64] cpu: [ppc64]
os: [linux] os: [linux]
@ -338,8 +365,8 @@ packages:
dev: true dev: true
optional: true optional: true
/esbuild-linux-riscv64/0.14.54: /esbuild-linux-riscv64/0.15.12:
resolution: {integrity: sha512-y7Vt7Wl9dkOGZjxQZnDAqqn+XOqFD7IMWiewY5SPlNlzMX39ocPQlOaoxvT4FllA5viyV26/QzHtvTjVNOxHZg==} resolution: {integrity: sha512-G9w6NcuuCI6TUUxe6ka0enjZHDnSVK8bO+1qDhMOCtl7Tr78CcZilJj8SGLN00zO5iIlwNRZKHjdMpfFgNn1VA==}
engines: {node: '>=12'} engines: {node: '>=12'}
cpu: [riscv64] cpu: [riscv64]
os: [linux] os: [linux]
@ -347,8 +374,8 @@ packages:
dev: true dev: true
optional: true optional: true
/esbuild-linux-s390x/0.14.54: /esbuild-linux-s390x/0.15.12:
resolution: {integrity: sha512-zaHpW9dziAsi7lRcyV4r8dhfG1qBidQWUXweUjnw+lliChJqQr+6XD71K41oEIC3Mx1KStovEmlzm+MkGZHnHA==} resolution: {integrity: sha512-Lt6BDnuXbXeqSlVuuUM5z18GkJAZf3ERskGZbAWjrQoi9xbEIsj/hEzVnSAFLtkfLuy2DE4RwTcX02tZFunXww==}
engines: {node: '>=12'} engines: {node: '>=12'}
cpu: [s390x] cpu: [s390x]
os: [linux] os: [linux]
@ -356,8 +383,8 @@ packages:
dev: true dev: true
optional: true optional: true
/esbuild-netbsd-64/0.14.54: /esbuild-netbsd-64/0.15.12:
resolution: {integrity: sha512-PR01lmIMnfJTgeU9VJTDY9ZerDWVFIUzAtJuDHwwceppW7cQWjBBqP48NdeRtoP04/AtO9a7w3viI+PIDr6d+w==} resolution: {integrity: sha512-jlUxCiHO1dsqoURZDQts+HK100o0hXfi4t54MNRMCAqKGAV33JCVvMplLAa2FwviSojT/5ZG5HUfG3gstwAG8w==}
engines: {node: '>=12'} engines: {node: '>=12'}
cpu: [x64] cpu: [x64]
os: [netbsd] os: [netbsd]
@ -365,8 +392,8 @@ packages:
dev: true dev: true
optional: true optional: true
/esbuild-openbsd-64/0.14.54: /esbuild-openbsd-64/0.15.12:
resolution: {integrity: sha512-Qyk7ikT2o7Wu76UsvvDS5q0amJvmRzDyVlL0qf5VLsLchjCa1+IAvd8kTBgUxD7VBUUVgItLkk609ZHUc1oCaw==} resolution: {integrity: sha512-1o1uAfRTMIWNOmpf8v7iudND0L6zRBYSH45sofCZywrcf7NcZA+c7aFsS1YryU+yN7aRppTqdUK1PgbZVaB1Dw==}
engines: {node: '>=12'} engines: {node: '>=12'}
cpu: [x64] cpu: [x64]
os: [openbsd] os: [openbsd]
@ -374,8 +401,8 @@ packages:
dev: true dev: true
optional: true optional: true
/esbuild-sunos-64/0.14.54: /esbuild-sunos-64/0.15.12:
resolution: {integrity: sha512-28GZ24KmMSeKi5ueWzMcco6EBHStL3B6ubM7M51RmPwXQGLe0teBGJocmWhgwccA1GeFXqxzILIxXpHbl9Q/Kw==} resolution: {integrity: sha512-nkl251DpoWoBO9Eq9aFdoIt2yYmp4I3kvQjba3jFKlMXuqQ9A4q+JaqdkCouG3DHgAGnzshzaGu6xofGcXyPXg==}
engines: {node: '>=12'} engines: {node: '>=12'}
cpu: [x64] cpu: [x64]
os: [sunos] os: [sunos]
@ -383,8 +410,8 @@ packages:
dev: true dev: true
optional: true optional: true
/esbuild-windows-32/0.14.54: /esbuild-windows-32/0.15.12:
resolution: {integrity: sha512-T+rdZW19ql9MjS7pixmZYVObd9G7kcaZo+sETqNH4RCkuuYSuv9AGHUVnPoP9hhuE1WM1ZimHz1CIBHBboLU7w==} resolution: {integrity: sha512-WlGeBZHgPC00O08luIp5B2SP4cNCp/PcS+3Pcg31kdcJPopHxLkdCXtadLU9J82LCfw4TVls21A6lilQ9mzHrw==}
engines: {node: '>=12'} engines: {node: '>=12'}
cpu: [ia32] cpu: [ia32]
os: [win32] os: [win32]
@ -392,8 +419,8 @@ packages:
dev: true dev: true
optional: true optional: true
/esbuild-windows-64/0.14.54: /esbuild-windows-64/0.15.12:
resolution: {integrity: sha512-AoHTRBUuYwXtZhjXZbA1pGfTo8cJo3vZIcWGLiUcTNgHpJJMC1rVA44ZereBHMJtotyN71S8Qw0npiCIkW96cQ==} resolution: {integrity: sha512-VActO3WnWZSN//xjSfbiGOSyC+wkZtI8I4KlgrTo5oHJM6z3MZZBCuFaZHd8hzf/W9KPhF0lY8OqlmWC9HO5AA==}
engines: {node: '>=12'} engines: {node: '>=12'}
cpu: [x64] cpu: [x64]
os: [win32] os: [win32]
@ -401,8 +428,8 @@ packages:
dev: true dev: true
optional: true optional: true
/esbuild-windows-arm64/0.14.54: /esbuild-windows-arm64/0.15.12:
resolution: {integrity: sha512-M0kuUvXhot1zOISQGXwWn6YtS+Y/1RT9WrVIOywZnJHo3jCDyewAc79aKNQWFCQm+xNHVTq9h8dZKvygoXQQRg==} resolution: {integrity: sha512-Of3MIacva1OK/m4zCNIvBfz8VVROBmQT+gRX6pFTLPngFYcj6TFH/12VveAqq1k9VB2l28EoVMNMUCcmsfwyuA==}
engines: {node: '>=12'} engines: {node: '>=12'}
cpu: [arm64] cpu: [arm64]
os: [win32] os: [win32]
@ -410,33 +437,34 @@ packages:
dev: true dev: true
optional: true optional: true
/esbuild/0.14.54: /esbuild/0.15.12:
resolution: {integrity: sha512-Cy9llcy8DvET5uznocPyqL3BFRrFXSVqbgpMJ9Wz8oVjZlh/zUSNbPRbov0VX7VxN2JH1Oa0uNxZ7eLRb62pJA==} resolution: {integrity: sha512-PcT+/wyDqJQsRVhaE9uX/Oq4XLrFh0ce/bs2TJh4CSaw9xuvI+xFrH2nAYOADbhQjUgAhNWC5LKoUsakm4dxng==}
engines: {node: '>=12'} engines: {node: '>=12'}
hasBin: true hasBin: true
requiresBuild: true requiresBuild: true
optionalDependencies: optionalDependencies:
'@esbuild/linux-loong64': 0.14.54 '@esbuild/android-arm': 0.15.12
esbuild-android-64: 0.14.54 '@esbuild/linux-loong64': 0.15.12
esbuild-android-arm64: 0.14.54 esbuild-android-64: 0.15.12
esbuild-darwin-64: 0.14.54 esbuild-android-arm64: 0.15.12
esbuild-darwin-arm64: 0.14.54 esbuild-darwin-64: 0.15.12
esbuild-freebsd-64: 0.14.54 esbuild-darwin-arm64: 0.15.12
esbuild-freebsd-arm64: 0.14.54 esbuild-freebsd-64: 0.15.12
esbuild-linux-32: 0.14.54 esbuild-freebsd-arm64: 0.15.12
esbuild-linux-64: 0.14.54 esbuild-linux-32: 0.15.12
esbuild-linux-arm: 0.14.54 esbuild-linux-64: 0.15.12
esbuild-linux-arm64: 0.14.54 esbuild-linux-arm: 0.15.12
esbuild-linux-mips64le: 0.14.54 esbuild-linux-arm64: 0.15.12
esbuild-linux-ppc64le: 0.14.54 esbuild-linux-mips64le: 0.15.12
esbuild-linux-riscv64: 0.14.54 esbuild-linux-ppc64le: 0.15.12
esbuild-linux-s390x: 0.14.54 esbuild-linux-riscv64: 0.15.12
esbuild-netbsd-64: 0.14.54 esbuild-linux-s390x: 0.15.12
esbuild-openbsd-64: 0.14.54 esbuild-netbsd-64: 0.15.12
esbuild-sunos-64: 0.14.54 esbuild-openbsd-64: 0.15.12
esbuild-windows-32: 0.14.54 esbuild-sunos-64: 0.15.12
esbuild-windows-64: 0.14.54 esbuild-windows-32: 0.15.12
esbuild-windows-arm64: 0.14.54 esbuild-windows-64: 0.15.12
esbuild-windows-arm64: 0.15.12
dev: true dev: true
/estree-walker/2.0.2: /estree-walker/2.0.2:
@ -475,8 +503,13 @@ packages:
function-bind: 1.1.1 function-bind: 1.1.1
dev: true dev: true
/hls.js/1.2.1: /he/1.2.0:
resolution: {integrity: sha512-+m/5+ikSpmQQvb6FmVWZUZfzvTJMn/QVfiCGP1Oq9WW4RKrAvxlExkhhbcVGgGqLNPFk1kdFkVQur//wKu3JVw==} resolution: {integrity: sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==}
hasBin: true
dev: true
/hls.js/1.2.4:
resolution: {integrity: sha512-yC3K79Kzq1W+OgjT12JxKMDXv9DbfvulppxmPBl7D04SaTyd2IwWk5eNASQV1mUaPlKbjr16yI9292qpSGo0ig==}
dev: false dev: false
/immutable/4.1.0: /immutable/4.1.0:
@ -490,8 +523,8 @@ packages:
binary-extensions: 2.2.0 binary-extensions: 2.2.0
dev: true dev: true
/is-core-module/2.10.0: /is-core-module/2.11.0:
resolution: {integrity: sha512-Erxj2n/LDAZ7H8WNJXd9tw38GYM3dv8rk8Zcs+jJuxYTW7sozH+SS8NtrSjVL1/vpLvWi1hxy96IzjJ3EHTJJg==} resolution: {integrity: sha512-RRjxlvLDkD1YJwDbroBHMb+cukurkDWNyHx7D3oNB5x9rb5ogcksMC5wHCadcXoo67gVr/+3GFySh3134zi6rw==}
dependencies: dependencies:
has: 1.0.3 has: 1.0.3
dev: true dev: true
@ -513,18 +546,22 @@ packages:
engines: {node: '>=0.12.0'} engines: {node: '>=0.12.0'}
dev: true dev: true
/lru-cache/6.0.0:
resolution: {integrity: sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==}
engines: {node: '>=10'}
dependencies:
yallist: 4.0.0
dev: true
/magic-string/0.25.9: /magic-string/0.25.9:
resolution: {integrity: sha512-RmF0AsMzgt25qzqqLc1+MbHmhdx0ojF2Fvs4XnOqz2ZOBXzzkEwc/dJQZCYHAn7v1jbVOjAZfK8msRn4BxO4VQ==} resolution: {integrity: sha512-RmF0AsMzgt25qzqqLc1+MbHmhdx0ojF2Fvs4XnOqz2ZOBXzzkEwc/dJQZCYHAn7v1jbVOjAZfK8msRn4BxO4VQ==}
dependencies: dependencies:
sourcemap-codec: 1.4.8 sourcemap-codec: 1.4.8
/minimatch/5.1.0:
resolution: {integrity: sha512-9TPBGGak4nHfGZsPBohm9AWg6NoT7QTCehS3BIJABslyZbzxfV78QM2Y6+i741OPZIafFAaiiEMh5OyIrJPgtg==}
engines: {node: '>=10'}
dependencies:
brace-expansion: 2.0.1
dev: true
/muggle-string/0.1.0:
resolution: {integrity: sha512-Tr1knR3d2mKvvWthlk7202rywKbiOm4rVFLsfAaSIhJ6dt9o47W4S+JMtWhd/PW9Wrdew2/S2fSvhz3E2gkfEg==}
dev: true
/nanoid/3.3.4: /nanoid/3.3.4:
resolution: {integrity: sha512-MqBkQh/OHTS2egovRtLk45wEyNXwF+cokD+1YPf9u5VfJiRdAiRwB2froX5Co9Rh20xs4siNPm8naNotSD6RBw==} resolution: {integrity: sha512-MqBkQh/OHTS2egovRtLk45wEyNXwF+cokD+1YPf9u5VfJiRdAiRwB2froX5Co9Rh20xs4siNPm8naNotSD6RBw==}
engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1}
@ -535,9 +572,9 @@ packages:
engines: {node: '>=0.10.0'} engines: {node: '>=0.10.0'}
dev: true dev: true
/parse-ms/2.1.0: /parse-ms/3.0.0:
resolution: {integrity: sha512-kHt7kzLoS9VBZfUsiKjv43mr91ea+U05EyKkEtqp7vNbHxmaVuEqN7XxeEVnGrMtYOAxGrDElSi96K7EgO1zCA==} resolution: {integrity: sha512-Tpb8Z7r7XbbtBTrM9UhpkzzaMrqA2VXMT3YChzYltwV3P3pM6t8wl7TvpMnSTosz1aQAdVib7kdoys7vYOPerw==}
engines: {node: '>=6'} engines: {node: '>=12'}
dev: false dev: false
/path-parse/1.0.7: /path-parse/1.0.7:
@ -552,19 +589,19 @@ packages:
engines: {node: '>=8.6'} engines: {node: '>=8.6'}
dev: true dev: true
/postcss/8.4.16: /postcss/8.4.18:
resolution: {integrity: sha512-ipHE1XBvKzm5xI7hiHCZJCSugxvsdq2mPnsq5+UF+VHCjiBvtDrlxJfMBToWaP9D5XlgNmcFGqoHmUn0EYEaRQ==} resolution: {integrity: sha512-Wi8mWhncLJm11GATDaQKobXSNEYGUHeQLiQqDFG1qQ5UTDPTEvKw0Xt5NsTpktGTwLps3ByrWsBrG0rB8YQ9oA==}
engines: {node: ^10 || ^12 || >=14} engines: {node: ^10 || ^12 || >=14}
dependencies: dependencies:
nanoid: 3.3.4 nanoid: 3.3.4
picocolors: 1.0.0 picocolors: 1.0.0
source-map-js: 1.0.2 source-map-js: 1.0.2
/pretty-ms/7.0.1: /pretty-ms/8.0.0:
resolution: {integrity: sha512-973driJZvxiGOQ5ONsFhOF/DtzPMOMtgC11kCpUrPGMTgqp2q/1gwzCquocrN33is0VZ5GFHXZYMM9l6h67v2Q==} resolution: {integrity: sha512-ASJqOugUF1bbzI35STMBUpZqdfYKlJugy6JBziGi2EE+AL5JPJGSzvpeVXojxrr0ViUYoToUjb5kjSEGf7Y83Q==}
engines: {node: '>=10'} engines: {node: '>=14.16'}
dependencies: dependencies:
parse-ms: 2.1.0 parse-ms: 3.0.0
dev: false dev: false
/readdirp/3.6.0: /readdirp/3.6.0:
@ -578,21 +615,21 @@ packages:
resolution: {integrity: sha512-nBpuuYuY5jFsli/JIs1oldw6fOQCBioohqWZg/2hiaOybXOft4lonv85uDOKXdf8rhyK159cxU5cDcK/NKk8zw==} resolution: {integrity: sha512-nBpuuYuY5jFsli/JIs1oldw6fOQCBioohqWZg/2hiaOybXOft4lonv85uDOKXdf8rhyK159cxU5cDcK/NKk8zw==}
hasBin: true hasBin: true
dependencies: dependencies:
is-core-module: 2.10.0 is-core-module: 2.11.0
path-parse: 1.0.7 path-parse: 1.0.7
supports-preserve-symlinks-flag: 1.0.0 supports-preserve-symlinks-flag: 1.0.0
dev: true dev: true
/rollup/2.77.3: /rollup/2.78.1:
resolution: {integrity: sha512-/qxNTG7FbmefJWoeeYJFbHehJ2HNWnjkAFRKzWN/45eNBBF/r8lo992CwcJXEzyVxs5FmfId+vTSTQDb+bxA+g==} resolution: {integrity: sha512-VeeCgtGi4P+o9hIg+xz4qQpRl6R401LWEXBmxYKOV4zlF82lyhgh2hTZnheFUbANE8l2A41F458iwj2vEYaXJg==}
engines: {node: '>=10.0.0'} engines: {node: '>=10.0.0'}
hasBin: true hasBin: true
optionalDependencies: optionalDependencies:
fsevents: 2.3.2 fsevents: 2.3.2
dev: true dev: true
/sass/1.54.5: /sass/1.55.0:
resolution: {integrity: sha512-p7DTOzxkUPa/63FU0R3KApkRHwcVZYC0PLnLm5iyZACyp15qSi32x7zVUhRdABAATmkALqgGrjCJAcWvobmhHw==} resolution: {integrity: sha512-Pk+PMy7OGLs9WaxZGJMn7S96dvlyVBwwtToX895WmCpAOr5YiJYEUJfiJidMuKb613z2xNWcXCHEuOvjZbqC6A==}
engines: {node: '>=12.0.0'} engines: {node: '>=12.0.0'}
hasBin: true hasBin: true
dependencies: dependencies:
@ -601,14 +638,6 @@ packages:
source-map-js: 1.0.2 source-map-js: 1.0.2
dev: true dev: true
/semver/7.3.7:
resolution: {integrity: sha512-QlYTucUYOews+WeEujDoEGziz4K6c47V/Bd+LjSSYcA94p+DmINdf7ncaUinThfvZyu13lN9OY1XDxt8C0Tw0g==}
engines: {node: '>=10'}
hasBin: true
dependencies:
lru-cache: 6.0.0
dev: true
/source-map-js/1.0.2: /source-map-js/1.0.2:
resolution: {integrity: sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw==} resolution: {integrity: sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw==}
engines: {node: '>=0.10.0'} engines: {node: '>=0.10.0'}
@ -636,14 +665,14 @@ packages:
is-number: 7.0.0 is-number: 7.0.0
dev: true dev: true
/typescript/4.7.4: /typescript/4.8.4:
resolution: {integrity: sha512-C0WQT0gezHuw6AdY1M2jxUO83Rjf0HP7Sk1DtXj6j1EwkQNZrHAg2XPWlq62oqEhYvONq5pkC2Y9oPljWToLmQ==} resolution: {integrity: sha512-QCh+85mCy+h0IGff8r5XWzOVSbBO+KfeYrMQh7NJ58QujwcE22u+NUSmUxqF+un70P9GXKxa2HCNiTTMJknyjQ==}
engines: {node: '>=4.2.0'} engines: {node: '>=4.2.0'}
hasBin: true hasBin: true
dev: true dev: true
/vite/3.0.9_sass@1.54.5: /vite/3.1.8_sass@1.55.0:
resolution: {integrity: sha512-waYABTM+G6DBTCpYAxvevpG50UOlZuynR0ckTK5PawNVt7ebX6X7wNXHaGIO6wYYFXSM7/WcuFuO2QzhBB6aMw==} resolution: {integrity: sha512-m7jJe3nufUbuOfotkntGFupinL/fmuTNuQmiVE7cH2IZMuf4UbfbGYMUT3jVWgGYuRVLY9j8NnrRqgw5rr5QTg==}
engines: {node: ^14.18.0 || >=16.0.0} engines: {node: ^14.18.0 || >=16.0.0}
hasBin: true hasBin: true
peerDependencies: peerDependencies:
@ -661,35 +690,38 @@ packages:
terser: terser:
optional: true optional: true
dependencies: dependencies:
esbuild: 0.14.54 esbuild: 0.15.12
postcss: 8.4.16 postcss: 8.4.18
resolve: 1.22.1 resolve: 1.22.1
rollup: 2.77.3 rollup: 2.78.1
sass: 1.54.5 sass: 1.55.0
optionalDependencies: optionalDependencies:
fsevents: 2.3.2 fsevents: 2.3.2
dev: true dev: true
/vue-tsc/0.40.1_typescript@4.7.4: /vue-template-compiler/2.7.13:
resolution: {integrity: sha512-Z+3rlp/6TrtKvLuaFYwBn03zrdinMR6lBb3mWBJtDA+KwlRu+I4eMoqC1qT9D7i/29u0Bw58dH7ErjMpNLN9bQ==} resolution: {integrity: sha512-jYM6TClwDS9YqP48gYrtAtaOhRKkbYmbzE+Q51gX5YDr777n7tNI/IZk4QV4l/PjQPNh/FVa/E92sh/RqKMrog==}
dependencies:
de-indent: 1.0.2
he: 1.2.0
dev: true
/vue-tsc/1.0.9_typescript@4.8.4:
resolution: {integrity: sha512-vRmHD1K6DmBymNhoHjQy/aYKTRQNLGOu2/ESasChG9Vy113K6CdP0NlhR0bzgFJfv2eFB9Ez/9L5kIciUajBxQ==}
hasBin: true hasBin: true
peerDependencies: peerDependencies:
typescript: '*' typescript: '*'
dependencies: dependencies:
'@volar/vue-language-core': 0.40.1 '@volar/vue-language-core': 1.0.9
'@volar/vue-typescript': 0.40.1 '@volar/vue-typescript': 1.0.9
typescript: 4.7.4 typescript: 4.8.4
dev: true dev: true
/vue/3.2.37: /vue/3.2.41:
resolution: {integrity: sha512-bOKEZxrm8Eh+fveCqS1/NkG/n6aMidsI6hahas7pa0w/l7jkbssJVsRhVDs07IdDq7h9KHswZOgItnwJAgtVtQ==} resolution: {integrity: sha512-uuuvnrDXEeZ9VUPljgHkqB5IaVO8SxhPpqF2eWOukVrBnRBx2THPSGQBnVRt0GrIG1gvCmFXMGbd7FqcT1ixNQ==}
dependencies: dependencies:
'@vue/compiler-dom': 3.2.37 '@vue/compiler-dom': 3.2.41
'@vue/compiler-sfc': 3.2.37 '@vue/compiler-sfc': 3.2.41
'@vue/runtime-dom': 3.2.37 '@vue/runtime-dom': 3.2.41
'@vue/server-renderer': 3.2.37_vue@3.2.37 '@vue/server-renderer': 3.2.41_vue@3.2.41
'@vue/shared': 3.2.37 '@vue/shared': 3.2.41
/yallist/4.0.0:
resolution: {integrity: sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==}
dev: true

View File

@ -1,27 +1,29 @@
{ {
"type": "module",
"devDependencies": { "devDependencies": {
"@types/express": "^4.17.13", "@types/express": "^4.17.14",
"@types/express-ws": "^3.0.1", "@types/express-ws": "^3.0.1",
"@types/fluent-ffmpeg": "^2.1.20", "@types/fluent-ffmpeg": "^2.1.20",
"@types/js-yaml": "^4.0.5", "@types/js-yaml": "^4.0.5",
"@types/node": "^18.7.11", "@types/mp4frag": "^0.6.1",
"@types/node": "^18.11.4",
"@types/node-fetch": "^2.6.2", "@types/node-fetch": "^2.6.2",
"@types/ws": "^8.5.3", "@types/ws": "^8.5.3",
"ts-node-dev": "^2.0.0", "tsx": "^3.11.0",
"typescript": "^4.7.4" "typescript": "^4.8.4"
}, },
"dependencies": { "dependencies": {
"express": "^4.18.1", "express": "^4.18.2",
"express-ws": "^5.0.2", "express-ws": "^5.0.2",
"fluent-ffmpeg": "^2.1.2", "fluent-ffmpeg": "^2.1.2",
"js-yaml": "^4.1.0", "js-yaml": "^4.1.0",
"mp4frag": "^0.6.0", "mp4frag": "^0.6.0",
"node-fetch": "^2.6.7", "node-fetch": "^3.2.10",
"ws": "^8.8.1" "ws": "^8.10.0"
}, },
"scripts": { "scripts": {
"start": "npm run dev", "start": "npm run dev",
"dev": "ts-node-dev --files ./src/server.ts", "dev": "tsx watch ./src/server.ts",
"build": "tsc", "build": "tsc",
"serve": "node dist/server.js" "serve": "node dist/server.js"
} }

789
server/pnpm-lock.yaml generated

File diff suppressed because it is too large Load Diff

View File

@ -1,10 +1,14 @@
import * as WebSocket from 'ws'; import * as ws from 'ws';
import fetch from 'node-fetch'; import fetch from 'node-fetch';
import * as Mp4Frag from 'mp4frag'; import * as Mp4Frag from 'mp4frag';
import { make_mp4frag } from './camera-stream'; import { make_mp4frag } from './camera-stream.js';
import { Message, StatusMessage, SettingsMessage } from '../../types/messages'; import {
import * as octoprint from '../../types/octoprint'; Message,
StatusMessage,
SettingsMessage,
} from '../../types/messages.js';
import * as octoprint from '../../types/octoprint.js';
const PING_TIME = 10000; const PING_TIME = 10000;
const STATUS_TIMEOUT = 30000; const STATUS_TIMEOUT = 30000;
@ -63,7 +67,7 @@ export default class OctoprintConnection {
const url = new URL('/sockjs/websocket', this.address); const url = new URL('/sockjs/websocket', this.address);
url.protocol = 'ws'; url.protocol = 'ws';
let websocket = new WebSocket(url.toString()); let websocket = new ws.WebSocket(url.toString());
websocket websocket
.on('open', () => { .on('open', () => {
pingSender = setInterval(() => websocket.ping(), PING_TIME); pingSender = setInterval(() => websocket.ping(), PING_TIME);
@ -80,7 +84,7 @@ export default class OctoprintConnection {
console.log(`Connected to "${this.slug}"`); console.log(`Connected to "${this.slug}"`);
websocket.send(JSON.stringify({ auth: session_key })); websocket.send(JSON.stringify({ auth: session_key }));
}) })
.on('message', (data: WebSocket.Data) => { .on('message', (data: ws.Data) => {
const event: octoprint.Message = JSON.parse(data as string); const event: octoprint.Message = JSON.parse(data as string);
let ext_event: StatusMessage = { let ext_event: StatusMessage = {
@ -110,7 +114,7 @@ export default class OctoprintConnection {
}); });
} }
heartbeat(websocket: WebSocket, pongTimeout: Timeout): Timeout { heartbeat(websocket: ws.WebSocket, pongTimeout: Timeout): Timeout {
clearTimeout(pongTimeout); clearTimeout(pongTimeout);
return setTimeout(() => { return setTimeout(() => {
console.log(`Missed 2 heartbeats for "${this.slug}", disconnecting`); console.log(`Missed 2 heartbeats for "${this.slug}", disconnecting`);
@ -119,14 +123,19 @@ export default class OctoprintConnection {
} }
async api_get(endpoint: string): Promise<any> { async api_get(endpoint: string): Promise<any> {
const r = await fetch(new URL('/api/' + endpoint, this.address), { const r = await fetch(
new URL('/api/' + endpoint, this.address).toString(),
{
headers: { 'X-Api-Key': this.apikey }, headers: { 'X-Api-Key': this.apikey },
}); }
);
return await r.json(); return await r.json();
} }
async api_post(endpoint: string, data: any): Promise<any> { async api_post(endpoint: string, data: any): Promise<any> {
const r = await fetch(new URL('/api/' + endpoint, this.address), { const r = await fetch(
new URL('/api/' + endpoint, this.address).toString(),
{
headers: { headers: {
'X-Api-Key': this.apikey, 'X-Api-Key': this.apikey,
Accept: 'application/json', Accept: 'application/json',
@ -134,11 +143,12 @@ export default class OctoprintConnection {
}, },
method: 'POST', method: 'POST',
body: JSON.stringify(data), body: JSON.stringify(data),
}); }
);
return await r.json(); return await r.json();
} }
send_init(ws: WebSocket) { send_init(ws: ws.WebSocket) {
if (this.settingsMessage) { if (this.settingsMessage) {
ws.send(JSON.stringify(this.settingsMessage)); ws.send(JSON.stringify(this.settingsMessage));

View File

@ -1,5 +1,5 @@
import * as ffmpeg from 'fluent-ffmpeg'; import ffmpeg from 'fluent-ffmpeg';
import * as Mp4Frag from 'mp4frag'; import Mp4Frag from 'mp4frag';
import { PassThrough } from 'stream'; import { PassThrough } from 'stream';
const RECONNECT_TIME = 5000; const RECONNECT_TIME = 5000;

View File

@ -1,155 +0,0 @@
declare module 'mp4frag' {
import { Transform } from 'stream';
namespace Mp4Frag {
interface SegmentObject {
segment: Buffer;
sequence: number;
duration: number;
timestamp: number;
keyframe: number;
}
}
export = Mp4Frag;
/**
* @fileOverview
* <ul>
* <li>Creates a stream transform for piping a fmp4 (fragmented mp4) from ffmpeg.</li>
* <li>Can be used to generate a fmp4 m3u8 HLS playlist and compatible file fragments.</li>
* <li>Can be used for storing past segments of the mp4 video in a buffer for later access.</li>
* <li>Must use the following ffmpeg args <b><i>-movflags +frag_keyframe+empty_moov+default_base_moof</i></b> to generate
* a valid fmp4 with a compatible file structure : ftyp+moov -> moof+mdat -> moof+mdat -> moof+mdat ...</li>
* </ul>
* @requires stream.Transform
*/
class Mp4Frag extends Transform {
/**
* @constructor
* @param {Object} [options] - Configuration options.
* @param {String} [options.hlsPlaylistBase] - Base name of files in m3u8 playlist. Affects the generated m3u8 playlist by naming file fragments. Must be set to generate m3u8 playlist. e.g. 'front_door'
* @param {Number} [options.hlsPlaylistSize = 4] - Number of segments to use in m3u8 playlist. Must be an integer ranging from 2 to 20.
* @param {Number} [options.hlsPlaylistExtra = 0] - Number of extra segments to keep in memory. Must be an integer ranging from 0 to 10.
* @param {Boolean} [options.hlsPlaylistInit = true] - Indicates that m3u8 playlist should be generated after [initialization]{@link Mp4Frag#initialization} is created and before media segments are created.
* @param {Number} [options.segmentCount = 2] - Number of segments to keep in memory. Has no effect if using options.hlsPlaylistBase. Must be an integer ranging from 2 to 30.
* @returns {Mp4Frag} this - Returns reference to new instance of Mp4Frag for chaining event listeners.
* @throws Will throw an error if options.hlsPlaylistBase contains characters other than letters(a-zA-Z) and underscores(_).
*/
constructor(options?: {
hlsPlaylistBase?: string;
hlsPlaylistSize?: number;
hlsPlaylistExtra?: number;
hlsPlaylistInit?: boolean;
segmentCount?: number;
});
/**
* - Returns the audio codec information as a <b>String</b>.
*
* - Returns <b>Null</b> if requested before [initialized event]{@link Mp4Frag#event:initialized}.
*/
get audioCodec(): string | null;
/**
* - Returns the video codec information as a <b>String</b>.
*
* - Returns <b>Null</b> if requested before [initialized event]{@link Mp4Frag#event:initialized}.
*/
get videoCodec(): string | null;
/**
* - Returns the mime type information as a <b>String</b>.
*
* - Returns <b>Null</b> if requested before [initialized event]{@link Mp4Frag#event:initialized}.
*/
get mime(): string | null;
/**
* - Returns the Mp4 initialization fragment as a <b>Buffer</b>.
*
* - Returns <b>Null</b> if requested before [initialized event]{@link Mp4Frag#event:initialized}.
*/
get initialization(): Buffer | null;
/**
* - Returns the latest Mp4 segment as a <b>Buffer</b>.
*
* - Returns <b>Null</b> if requested before first [segment event]{@link Mp4Frag#event:segment}.
*/
get segment(): Buffer | null;
/**
* - Returns the latest Mp4 segment as an <b>Object</b>.
*
* - <b><code>{segment, sequence, duration, timestamp, keyframe}</code></b>
*
* - Returns <b>{segment: null, sequence: -1, duration: -1; timestamp: -1, keyframe: -1}</b> if requested before first [segment event]{@link Mp4Frag#event:segment}.
*/
get segmentObject(): Mp4Frag.SegmentObject;
/**
* - Returns the timestamp of the latest Mp4 segment as an <b>Integer</b>(<i>milliseconds</i>).
*
* - Returns <b>-1</b> if requested before first [segment event]{@link Mp4Frag#event:segment}.
*/
get timestamp(): number;
/**
* - Returns the duration of latest Mp4 segment as a <b>Float</b>(<i>seconds</i>).
*
* - Returns <b>-1</b> if requested before first [segment event]{@link Mp4Frag#event:segment}.
*/
get duration(): number;
/**
* - Returns the total duration of all Mp4 segments as a <b>Float</b>(<i>seconds</i>).
*
* - Returns <b>-1</b> if requested before first [segment event]{@link Mp4Frag#event:segment}.
*/
get totalDuration(): number;
/**
* - Returns the total byte length of the Mp4 initialization and all Mp4 segments as ant <b>Int</b>(<i>bytes</i>).
*
* - Returns <b>-1</b> if requested before [initialized event]{@link Mp4Frag#event:initialized}.
*/
get totalByteLength(): number;
/**
* - Returns the fmp4 HLS m3u8 playlist as a <b>String</b>.
*
* - Returns <b>Null</b> if requested before [initialized event]{@link Mp4Frag#event:initialized}.
*/
get m3u8(): string | null;
/**
* - Returns the sequence of the latest Mp4 segment as an <b>Integer</b>.
*
* - Returns <b>-1</b> if requested before first [segment event]{@link Mp4Frag#event:segment}.
*/
get sequence(): number;
/**
* - Returns the nal keyframe index of the latest Mp4 segment as an <b>Integer</b>.
*
* - Returns <b>-1</b> if segment contains no keyframe nal.
*/
get keyframe(): number;
/**
* - Returns a boolean indicating if all segments contain a keyframe.
*
* - Returns <b>false</b> if any segments do not contain a keyframe.
*/
get allKeyframes(): boolean;
/**
* - Returns the Mp4 segments as an <b>Array</b> of <b>Objects</b>
*
* - <b><code>[{segment, sequence, duration, timestamp, keyframe},...]</code></b>
*
* - Returns <b>Null</b> if requested before first [segment event]{@link Mp4Frag#event:segment}.
*/
get segmentObjects(): Mp4Frag.SegmentObject[];
/**
* @param {Number|String} sequence - sequence number
* @returns {Object|null}
* - Returns the Mp4 segment that corresponds to the numbered sequence as an <b>Object</b>.
*
* - <b><code>{segment, sequence, duration, timestamp, keyframe}</code></b>
*
* - Returns <b>Null</b> if there is no segment that corresponds to sequence number.
*/
getSegmentObject(sequence: number | string): Mp4Frag.SegmentObject | null;
/**
* Clear cached values
*/
resetCache(): void;
}
}

View File

@ -1,12 +1,12 @@
import * as fs from 'fs'; import * as fs from 'fs';
import * as express from 'express'; import express from 'express';
import * as yaml from 'js-yaml'; import * as yaml from 'js-yaml';
import * as expressWs from 'express-ws'; import expressWs from 'express-ws';
import * as WebSocket from 'ws'; import * as ws from 'ws';
import { Message } from '../../types/messages'; import { Message } from '../../types/messages.js';
import OctoPrintConnection from './OctoPrintConnection'; import OctoPrintConnection from './OctoPrintConnection.js';
const PORT = process.env.PORT || 1234; const PORT = process.env.PORT || 1234;
@ -23,9 +23,9 @@ const config: configuration = yaml.load(
let octoprintConnections: OctoPrintConnection[] = []; let octoprintConnections: OctoPrintConnection[] = [];
function broadcast(data: WebSocket.Data) { function broadcast(data: ws.Data) {
wsInstance.getWss().clients.forEach((client: WebSocket) => { wsInstance.getWss().clients.forEach((client: ws.WebSocket) => {
if (client.readyState === WebSocket.OPEN) { if (client.readyState === ws.WebSocket.OPEN) {
client.send(data); client.send(data);
} }
}); });

View File

@ -1,10 +1,9 @@
{ {
"include": ["src/**/*"], "include": ["src/**/*"],
"compilerOptions": { "compilerOptions": {
"target": "es5", "target": "es6",
"strict": true, "strict": true,
"module": "commonjs", "module": "node16",
"moduleResolution": "node",
"outDir": "dist", "outDir": "dist",
"experimentalDecorators": true "experimentalDecorators": true
} }

View File

@ -51,7 +51,7 @@ import prettyMilliseconds from 'pretty-ms';
import { CurrentOrHistoryPayload } from '../types/octoprint'; import { CurrentOrHistoryPayload } from '../types/octoprint';
import { OctoprintColor } from '../types/messages'; import { OctoprintColor } from '../types/messages';
interface Props { export interface Props {
slug: string; slug: string;
name?: string; name?: string;
lastUpdate: Date; lastUpdate: Date;

View File

@ -2,7 +2,7 @@
"compilerOptions": { "compilerOptions": {
"target": "esnext", "target": "esnext",
"useDefineForClassFields": true, "useDefineForClassFields": true,
"module": "esnext", "module": "node16",
"moduleResolution": "node", "moduleResolution": "node",
"strict": true, "strict": true,
"jsx": "preserve", "jsx": "preserve",

13
types/messages.d.ts vendored
View File

@ -1,4 +1,4 @@
import { Message as OctoprintMessage } from './octoprint'; import { Message as OctoprintMessage } from './octoprint.js';
interface BaseMessage { interface BaseMessage {
printer: string; printer: string;
@ -9,7 +9,16 @@ export interface StatusMessage extends BaseMessage {
msg: OctoprintMessage; msg: OctoprintMessage;
} }
export type OctoprintColor = 'red' | 'orange' | 'yellow' | 'green' | 'blue' | 'violet' | 'black' | 'white' | 'default'; export type OctoprintColor =
| 'red'
| 'orange'
| 'yellow'
| 'green'
| 'blue'
| 'violet'
| 'black'
| 'white'
| 'default';
export interface SettingsMessage extends BaseMessage { export interface SettingsMessage extends BaseMessage {
kind: 'settings'; kind: 'settings';