diff --git a/package.json b/package.json index 68ba074..056e3ba 100644 --- a/package.json +++ b/package.json @@ -3,17 +3,17 @@ "version": "0.0.0", "devDependencies": { "@vitejs/plugin-vue": "^2.0.1", - "sass": "^1.45.1", + "sass": "^1.45.2", "typescript": "^4.5.4", - "vite": "^2.7.6", - "vue-tsc": "^0.30.0" + "vite": "^2.7.10", + "vue-tsc": "^0.30.2" }, "dependencies": { - "@popperjs/core": "^2.11.0", + "@popperjs/core": "^2.11.2", "bootstrap": "^5.1.3", "hls.js": "^1.1.2", "pretty-ms": "^7.0.1", - "vue": "^3.2.0" + "vue": "^3.2.26" }, "scripts": { "start": "pnpm run -r --parallel dev", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 5bfb75b..8d90570 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -1,48 +1,48 @@ lockfileVersion: 5.3 specifiers: - '@popperjs/core': ^2.11.0 + '@popperjs/core': ^2.11.2 '@vitejs/plugin-vue': ^2.0.1 bootstrap: ^5.1.3 hls.js: ^1.1.2 pretty-ms: ^7.0.1 - sass: ^1.45.1 + sass: ^1.45.2 typescript: ^4.5.4 - vite: ^2.7.6 - vue: ^3.2.0 - vue-tsc: ^0.30.0 + vite: ^2.7.10 + vue: ^3.2.26 + vue-tsc: ^0.30.2 dependencies: - '@popperjs/core': 2.11.0 - bootstrap: 5.1.3_@popperjs+core@2.11.0 + '@popperjs/core': 2.11.2 + bootstrap: 5.1.3_@popperjs+core@2.11.2 hls.js: 1.1.2 pretty-ms: 7.0.1 vue: 3.2.26 devDependencies: - '@vitejs/plugin-vue': 2.0.1_vite@2.7.6+vue@3.2.26 - sass: 1.45.1 + '@vitejs/plugin-vue': 2.0.1_vite@2.7.10+vue@3.2.26 + sass: 1.45.2 typescript: 4.5.4 - vite: 2.7.6_sass@1.45.1 - vue-tsc: 0.30.0_typescript@4.5.4 + vite: 2.7.10_sass@1.45.2 + vue-tsc: 0.30.2_typescript@4.5.4 packages: - /@babel/helper-validator-identifier/7.15.7: - resolution: {integrity: sha512-K4JvCtQqad9OY2+yTU8w+E82ywk/fe+ELNlt1G8z3bVGlZfn/hOcQQsUhGhW/N+tb3fxK800wLtKOE/aM0m72w==} + /@babel/helper-validator-identifier/7.16.7: + resolution: {integrity: sha512-hsEnFemeiW4D08A5gUAZxLBTXpZ39P+a+DGDsHw1yxqyQ/jzFEnxf5uTEGp+3bzAbNOxU1paTgYS4ECU/IgfDw==} engines: {node: '>=6.9.0'} dev: true - /@babel/parser/7.16.6: - resolution: {integrity: sha512-Gr86ujcNuPDnNOY8mi383Hvi8IYrJVJYuf3XcuBM/Dgd+bINn/7tHqsj+tKkoreMbmGsFLsltI/JJd8fOFWGDQ==} + /@babel/parser/7.16.7: + resolution: {integrity: sha512-sR4eaSrnM7BV7QPzGfEX5paG/6wrZM3I0HDzfIAK06ESvo9oy3xBuVBxE3MbQaKNhvg8g/ixjMWo2CGpzpHsDA==} engines: {node: '>=6.0.0'} hasBin: true - /@babel/types/7.16.0: - resolution: {integrity: sha512-PJgg/k3SdLsGb3hhisFvtLOw5ts113klrpLuIPtCJIU+BB24fqq6lf8RWqKJEjzqXR9AEH1rIb5XTqwBHB+kQg==} + /@babel/types/7.16.7: + resolution: {integrity: sha512-E8HuV7FO9qLpx6OtoGfUQ2cjIYnbFwvZWYBS+87EwtdMvmUPJSwykpovFB+8insbpF0uJcpr8KMUi64XZntZcg==} engines: {node: '>=6.9.0'} dependencies: - '@babel/helper-validator-identifier': 7.15.7 + '@babel/helper-validator-identifier': 7.16.7 to-fast-properties: 2.0.0 dev: true @@ -62,30 +62,30 @@ packages: resolution: {integrity: sha512-8HqW8EVqjnCmWXVpqAOZf+EGESdkR27odcMMMGefgKXtar00SoYNSryGv//TELI4T3QFsECo78p+0lmalk/CFA==} dev: true - /@popperjs/core/2.11.0: - resolution: {integrity: sha512-zrsUxjLOKAzdewIDRWy9nsV1GQsKBCWaGwsZQlCgr6/q+vjyZhFgqedLfFBuI9anTPEUT4APq9Mu0SZBTzIcGQ==} + /@popperjs/core/2.11.2: + resolution: {integrity: sha512-92FRmppjjqz29VMJ2dn+xdyXZBrMlE42AV6Kq6BwjWV7CNUW1hs2FtxSNLQE+gJhaZ6AAmYuO9y8dshhcBl7vA==} dev: false - /@vitejs/plugin-vue/2.0.1_vite@2.7.6+vue@3.2.26: + /@vitejs/plugin-vue/2.0.1_vite@2.7.10+vue@3.2.26: resolution: {integrity: sha512-wtdMnGVvys9K8tg+DxowU1ytTrdVveXr3LzdhaKakysgGXyrsfaeds2cDywtvujEASjWOwWL/OgWM+qoeM8Plg==} engines: {node: '>=12.0.0'} peerDependencies: vite: ^2.5.10 vue: ^3.2.25 dependencies: - vite: 2.7.6_sass@1.45.1 + vite: 2.7.10_sass@1.45.2 vue: 3.2.26 dev: true - /@volar/code-gen/0.30.0: - resolution: {integrity: sha512-5Wl32LebqeGe1a30TGX8DDB28lUyBJ/jX1GazInkj6O605FomWXu/ju/0WTJH2L+wjD09ZND79iuFmTna2UXMw==} + /@volar/code-gen/0.30.2: + resolution: {integrity: sha512-75rlb3rw/O/HiXxrOsVJ8JhEssqtN4dJ0i6oG4kL0udr+QM0TwN0PqaEhoMRyMFV6kBPPSunBBJQ3XNAb0PtGA==} dependencies: - '@volar/shared': 0.30.0 - '@volar/source-map': 0.30.0 + '@volar/shared': 0.30.2 + '@volar/source-map': 0.30.2 dev: true - /@volar/html2pug/0.30.0: - resolution: {integrity: sha512-MchpYvwqv5V6P6l1c0fPIFhZ8ahLXCR6lWTb4ZRtvUdMFjJH0yXzkrb6U8UghzdV7Yok/nJuf2Unf4DmU+sTjw==} + /@volar/html2pug/0.30.2: + resolution: {integrity: sha512-k/DLGoXALaQgnacP1MoJ77AwnCHlKcsQKJJug8Qdou3+yOrzYjSSEP6uwG8BS0Fv1h4d4JYmlXsxW8gJPGXSQQ==} dependencies: domelementtype: 2.2.0 domhandler: 4.3.0 @@ -93,33 +93,34 @@ packages: pug: 3.0.2 dev: true - /@volar/shared/0.30.0: - resolution: {integrity: sha512-zfQMIQWAbRd/u8iqKFUd/24EGEDKwr6QuKwEoXe1/UAhA8TIWBljnfm/pgMdyUzWPqnNFKeFLRHMlt8NUoDHJQ==} + /@volar/shared/0.30.2: + resolution: {integrity: sha512-93Q7i758WjScg4ptvDcpk66r4Paz9StVMH/M5RCsU4/9F5a1xSCUJbkbpwE0zESkVzcuBatDqk79PaZ8TZKqRg==} dependencies: upath: 2.0.1 vscode-jsonrpc: 8.0.0-next.4 vscode-uri: 3.0.3 dev: true - /@volar/source-map/0.30.0: - resolution: {integrity: sha512-uS/+4+pyGhcUPjKZLcUfccyqGD2iUoGRRljCW9qJKUJ+PGQh2HvjYzMzX2tBSqZ6LaRZZw8kIVidzSQdFfpK/g==} + /@volar/source-map/0.30.2: + resolution: {integrity: sha512-gwa9OiSjUOZWYutJX53m/KDU/zaF0yN3RP2B8J0aMVyT5dE/VaIfknSxPAW5QFC6AT79Ea1HKGtChuSBgqHCfA==} dependencies: - '@volar/shared': 0.30.0 + '@volar/shared': 0.30.2 + vscode-languageserver-textdocument: 1.0.3 dev: true - /@volar/transforms/0.30.0: - resolution: {integrity: sha512-Jnbh/lYt91bzbq7pJMkApG8laWe4+gAqMhsgi+Ulitu98fvdZKlc+qseSa2kezfUN+565pQpuMk5FPT2c1tFCQ==} + /@volar/transforms/0.30.2: + resolution: {integrity: sha512-bc+55NGlBbMLHkpChqAEgsblYJxjNHiKVMbVUMi52xKa2l9gOWXNbn5WRsHfz4AR+Cq/Zm0AvVJ10ehLQsGsow==} dependencies: - '@volar/shared': 0.30.0 - vscode-languageserver: 8.0.0-next.5 + '@volar/shared': 0.30.2 + vscode-languageserver-types: 3.17.0-next.5 dev: true - /@volar/vue-code-gen/0.30.0: - resolution: {integrity: sha512-PK4wMPrxzJMVrkVUYoZQvGAVLaXrmRdaeFqa02nMeGrdjjrg6XX8vAmgQ34/ZNUMV/oMWm7soQ0n7BN0Vab/iA==} + /@volar/vue-code-gen/0.30.2: + resolution: {integrity: sha512-kJyVkQFhMvVQ32aDaC6h5DdXG1GJbJjeeAkCnjfCJfMmuYjM5R4QNZHDz1TI0dETgF9vP+kbAukQKNWecHK3qg==} dependencies: - '@volar/code-gen': 0.30.0 - '@volar/shared': 0.30.0 - '@volar/source-map': 0.30.0 + '@volar/code-gen': 0.30.2 + '@volar/shared': 0.30.2 + '@volar/source-map': 0.30.2 '@vue/compiler-core': 3.2.26 '@vue/compiler-dom': 3.2.26 '@vue/shared': 3.2.26 @@ -140,7 +141,7 @@ packages: /@vue/compiler-core/3.2.26: resolution: {integrity: sha512-N5XNBobZbaASdzY9Lga2D9Lul5vdCIOXvUMd6ThcN8zgqQhPKfCV+wfAJNNJKQkSHudnYRO2gEB+lp0iN3g2Tw==} dependencies: - '@babel/parser': 7.16.6 + '@babel/parser': 7.16.7 '@vue/shared': 3.2.26 estree-walker: 2.0.2 source-map: 0.6.1 @@ -154,7 +155,7 @@ packages: /@vue/compiler-sfc/3.2.26: resolution: {integrity: sha512-ePpnfktV90UcLdsDQUh2JdiTuhV0Skv2iYXxfNMOK/F3Q+2BO0AulcVcfoksOpTJGmhhfosWfMyEaEf0UaWpIw==} dependencies: - '@babel/parser': 7.16.6 + '@babel/parser': 7.16.7 '@vue/compiler-core': 3.2.26 '@vue/compiler-dom': 3.2.26 '@vue/compiler-ssr': 3.2.26 @@ -176,7 +177,7 @@ packages: /@vue/reactivity-transform/3.2.26: resolution: {integrity: sha512-XKMyuCmzNA7nvFlYhdKwD78rcnmPb7q46uoR00zkX6yZrUmcCQ5OikiwUEVbvNhL5hBJuvbSO95jB5zkUon+eQ==} dependencies: - '@babel/parser': 7.16.6 + '@babel/parser': 7.16.7 '@vue/compiler-core': 3.2.26 '@vue/shared': 3.2.26 estree-walker: 2.0.2 @@ -227,7 +228,7 @@ packages: engines: {node: '>= 8'} dependencies: normalize-path: 3.0.0 - picomatch: 2.3.0 + picomatch: 2.3.1 dev: true /asap/2.0.6: @@ -242,7 +243,7 @@ packages: resolution: {integrity: sha512-GAwkz0AihzY5bkwIY5QDR+LvsRQgB/B+1foMPvi0FZPMl5fjD7ICiznUiBdLYMH1QYe6vqu4gWYytZOccLouFw==} engines: {node: '>= 10.0.0'} dependencies: - '@babel/types': 7.16.0 + '@babel/types': 7.16.7 dev: true /binary-extensions/2.2.0: @@ -250,12 +251,12 @@ packages: engines: {node: '>=8'} dev: true - /bootstrap/5.1.3_@popperjs+core@2.11.0: + /bootstrap/5.1.3_@popperjs+core@2.11.2: resolution: {integrity: sha512-fcQztozJ8jToQWXxVuEyXWW+dSo8AiXWKwiSSrKWsRB/Qt+Ewwza+JWoLKiTuQLaEPhdNAJ7+Dosc9DOIqNy7Q==} peerDependencies: '@popperjs/core': ^2.10.2 dependencies: - '@popperjs/core': 2.11.0 + '@popperjs/core': 2.11.2 dev: false /braces/3.0.2: @@ -296,8 +297,8 @@ packages: /constantinople/4.0.1: resolution: {integrity: sha512-vCrqcSIq4//Gx74TXXCGnHpulY1dskqLTFGDmhrGxzeXL8lF8kvXv6mpNWlJj1uD4DW23D4ljAqbY4RRaaUZIw==} dependencies: - '@babel/parser': 7.16.6 - '@babel/types': 7.16.0 + '@babel/parser': 7.16.7 + '@babel/types': 7.16.7 dev: true /csstype/2.6.19: @@ -692,8 +693,8 @@ packages: /picocolors/1.0.0: resolution: {integrity: sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==} - /picomatch/2.3.0: - resolution: {integrity: sha512-lY1Q/PiJGC2zOv/z391WOTD+Z02bCgsFfvxoXXf6h7kv9o+WmsmzYqrAwY63sNgOxE4xEdq0WyUnXfKeBrSvYw==} + /picomatch/2.3.1: + resolution: {integrity: sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==} engines: {node: '>=8.6'} dev: true @@ -750,7 +751,7 @@ packages: jstransformer: 1.0.0 pug-error: 2.0.0 pug-walk: 2.0.0 - resolve: 1.20.0 + resolve: 1.21.0 dev: true /pug-lexer/5.0.1: @@ -813,30 +814,32 @@ packages: resolution: {integrity: sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==} engines: {node: '>=8.10.0'} dependencies: - picomatch: 2.3.0 + picomatch: 2.3.1 dev: true - /request-light/0.5.5: - resolution: {integrity: sha512-AvjfJuhyT6dYfhtIBF+IpTPQco+Td1QJ6PsIJ5xui110vQ5p9HxHk+m1XJqXazLQT6CxxSx9eNv6R/+fu4bZig==} + /request-light/0.5.6: + resolution: {integrity: sha512-mIfRkYujBF6qQQi+uJGHFzYD2P7WwfIMyJ3/DcTtOFB3iypwIVOXmsr3RMnFwTJRVcYLLZdjkIx43E8Zn2hRng==} dev: true - /resolve/1.20.0: - resolution: {integrity: sha512-wENBPt4ySzg4ybFQW2TT1zMQucPK95HSh/nq2CFTZVOGut2+pQvSsgtda4d26YrYcr067wjbmzOG8byDPBX63A==} + /resolve/1.21.0: + resolution: {integrity: sha512-3wCbTpk5WJlyE4mSOtDLhqQmGFi0/TD9VPwmiolnk8U0wRgMEktqCXd3vy5buTO3tljvalNvKrjHEfrd2WpEKA==} + hasBin: true dependencies: is-core-module: 2.8.0 path-parse: 1.0.7 + supports-preserve-symlinks-flag: 1.0.0 dev: true - /rollup/2.61.1: - resolution: {integrity: sha512-BbTXlEvB8d+XFbK/7E5doIcRtxWPRiqr0eb5vQ0+2paMM04Ye4PZY5nHOQef2ix24l/L0SpLd5hwcH15QHPdvA==} + /rollup/2.63.0: + resolution: {integrity: sha512-nps0idjmD+NXl6OREfyYXMn/dar3WGcyKn+KBzPdaLecub3x/LrId0wUcthcr8oZUAcZAR8NKcfGGFlNgGL1kQ==} engines: {node: '>=10.0.0'} hasBin: true optionalDependencies: fsevents: 2.3.2 dev: true - /sass/1.45.1: - resolution: {integrity: sha512-pwPRiq29UR0o4X3fiQyCtrESldXvUQAAE0QmcJTpsI4kuHHcLzZ54M1oNBVIXybQv8QF2zfkpFcTxp8ta97dUA==} + /sass/1.45.2: + resolution: {integrity: sha512-cKfs+F9AMPAFlbbTXNsbGvg3y58nV0mXA3E94jqaySKcC8Kq3/8983zVKQ0TLMUrHw7hF9Tnd3Bz9z5Xgtrl9g==} engines: {node: '>=8.9.0'} hasBin: true dependencies: @@ -865,6 +868,11 @@ packages: resolution: {integrity: sha512-9NykojV5Uih4lgo5So5dtw+f0JgJX30KCNI8gwhz2J9A15wD0Ml6tjHKwf6fTSa6fAdVBdZeNOs9eJ71qCk8vA==} dev: false + /supports-preserve-symlinks-flag/1.0.0: + resolution: {integrity: sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==} + engines: {node: '>= 0.4'} + dev: true + /to-fast-properties/2.0.0: resolution: {integrity: sha1-3F5pjL0HkmW8c+A3doGk5Og/YW4=} engines: {node: '>=4'} @@ -892,8 +900,8 @@ packages: engines: {node: '>=4'} dev: true - /vite/2.7.6_sass@1.45.1: - resolution: {integrity: sha512-PBNoc87rDYLtkpFU9dbVeGdbcyKzz6c34oScqivE3FEa3BhVa4ASupCzcz0eDIiSECovfLcQnLUJt9vhiEU08g==} + /vite/2.7.10_sass@1.45.2: + resolution: {integrity: sha512-KEY96ntXUid1/xJihJbgmLZx7QSC2D4Tui0FdS0Old5OokYzFclcofhtxtjDdGOk/fFpPbHv9yw88+rB93Tb8w==} engines: {node: '>=12.2.0'} hasBin: true peerDependencies: @@ -910,9 +918,9 @@ packages: dependencies: esbuild: 0.13.15 postcss: 8.4.5 - resolve: 1.20.0 - rollup: 2.61.1 - sass: 1.45.1 + resolve: 1.21.0 + rollup: 2.63.0 + sass: 1.45.2 optionalDependencies: fsevents: 2.3.2 dev: true @@ -985,26 +993,28 @@ packages: resolution: {integrity: sha512-u0Lw+IYlgbEJFF6/qAqG2d1jQmJl0eyAGJHoAJqr2HT4M2BNuQYSEiSE75f52pXHSJm8AlTjnLLbBFPrdz2hpA==} dev: true - /vscode-pug-languageservice/0.30.0: - resolution: {integrity: sha512-vSBf4ZXIUDK/COxAMkIe5wDKWNQUcdjndir/r3MoknEuC0LLE8GEH80x25yAGMXnMDhXUwL+ekCOzgb4RH6upA==} + /vscode-pug-languageservice/0.30.2: + resolution: {integrity: sha512-YkrBodqSzNrtLaEIeMnRJAcnqCWysIiOdkzxF6XHuOc+wDvbZ1U4XgxoLvNNjQdzNQIEYKbsLW0ldq5TYphjiA==} dependencies: - '@volar/code-gen': 0.30.0 - '@volar/shared': 0.30.0 - '@volar/source-map': 0.30.0 - '@volar/transforms': 0.30.0 + '@volar/code-gen': 0.30.2 + '@volar/shared': 0.30.2 + '@volar/source-map': 0.30.2 + '@volar/transforms': 0.30.2 pug-lexer: 5.0.1 pug-parser: 6.0.0 - vscode-languageserver: 8.0.0-next.5 + vscode-languageserver-textdocument: 1.0.3 + vscode-languageserver-types: 3.17.0-next.5 dev: true - /vscode-typescript-languageservice/0.30.0: - resolution: {integrity: sha512-Os+1yxz7+xZLeUNPS/cpiUsOxrSFIC6s79ir56W3QWd9jV/jcL1rt69Wsz8AilmQ7zSA9Cri5wqOb4VHj8IICQ==} + /vscode-typescript-languageservice/0.30.2: + resolution: {integrity: sha512-5l+gMfbHTZnJy7V7xdH78ai1ViR/scrIVQT5KFraDWLKTYHjGBkHDZ1E9fF+jbeyEizyy2ayldTQ7kCz8jWqVA==} dependencies: - '@volar/shared': 0.30.0 + '@volar/shared': 0.30.2 semver: 7.3.5 upath: 2.0.1 - vscode-languageserver: 8.0.0-next.5 + vscode-languageserver-protocol: 3.17.0-next.11 vscode-languageserver-textdocument: 1.0.3 + vscode-nls: 5.0.0 dev: true /vscode-uri/2.1.2: @@ -1015,38 +1025,39 @@ packages: resolution: {integrity: sha512-EcswR2S8bpR7fD0YPeS7r2xXExrScVMxg4MedACaWHEtx9ftCF/qHG1xGkolzTPcEmjTavCQgbVzHUIdTMzFGA==} dev: true - /vscode-vue-languageservice/0.30.0: - resolution: {integrity: sha512-1O7wv3nrQxRwwuFXdWcBqj+szl3Hs/FrvoP3AkUNfMuY9ZPRNvqhObekcizzOCSe1vM1bZxXPai/5NeW/6AOkA==} + /vscode-vue-languageservice/0.30.2: + resolution: {integrity: sha512-P0g92JmnVkV2zrWhDbT2zxuOUp0X2kMM9VHlrT7ALZq8wAhPOW0B4nhhb9a6jKBh6qqFBDquNeQRvTEZp4NJMA==} dependencies: - '@volar/code-gen': 0.30.0 - '@volar/html2pug': 0.30.0 - '@volar/shared': 0.30.0 - '@volar/source-map': 0.30.0 - '@volar/transforms': 0.30.0 - '@volar/vue-code-gen': 0.30.0 + '@volar/code-gen': 0.30.2 + '@volar/html2pug': 0.30.2 + '@volar/shared': 0.30.2 + '@volar/source-map': 0.30.2 + '@volar/transforms': 0.30.2 + '@volar/vue-code-gen': 0.30.2 '@vscode/emmet-helper': 2.8.3 '@vue/reactivity': 3.2.26 '@vue/shared': 3.2.26 - request-light: 0.5.5 + request-light: 0.5.6 upath: 2.0.1 vscode-css-languageservice: 5.1.9 vscode-html-languageservice: 4.2.1 vscode-json-languageservice: 4.1.10 vscode-languageserver: 8.0.0-next.5 + vscode-languageserver-protocol: 3.17.0-next.11 vscode-languageserver-textdocument: 1.0.3 - vscode-pug-languageservice: 0.30.0 - vscode-typescript-languageservice: 0.30.0 + vscode-pug-languageservice: 0.30.2 + vscode-typescript-languageservice: 0.30.2 dev: true - /vue-tsc/0.30.0_typescript@4.5.4: - resolution: {integrity: sha512-gtak7jRYpoERneZIItE+UoLPjV2Ba73nTA/MUzR+Wg3JnINhP4xgke+VHesM2JVTkABmAwj3yyaiMjDP0pY9jA==} + /vue-tsc/0.30.2_typescript@4.5.4: + resolution: {integrity: sha512-A8KIk5KwQTbSdsrDxwJkFYLPqDJ1zM86w3X8cgpi6rveozKUGDMPt300awEz61sTuBM9fAfUhNRcsWbsJ1I+TQ==} hasBin: true peerDependencies: typescript: '*' dependencies: - '@volar/shared': 0.30.0 + '@volar/shared': 0.30.2 typescript: 4.5.4 - vscode-vue-languageservice: 0.30.0 + vscode-vue-languageservice: 0.30.2 dev: true /vue/3.2.26: @@ -1063,8 +1074,8 @@ packages: resolution: {integrity: sha512-RNGKj82nUPg3g5ygxkQl0R937xLyho1J24ItRCBTr/m1YnZkzJy1hUiHUJrc/VlsDQzsCnInEGSg3bci0Lmd4w==} engines: {node: '>= 10.0.0'} dependencies: - '@babel/parser': 7.16.6 - '@babel/types': 7.16.0 + '@babel/parser': 7.16.7 + '@babel/types': 7.16.7 assert-never: 1.2.1 babel-walk: 3.0.0-canary-5 dev: true diff --git a/server/package.json b/server/package.json index 5ab4678..8693733 100644 --- a/server/package.json +++ b/server/package.json @@ -1,23 +1,23 @@ { "devDependencies": { - "@types/express": "^4.17.8", - "@types/express-ws": "^3.0.0", - "@types/fluent-ffmpeg": "^2.1.19", - "@types/js-yaml": "^4.0.3", - "@types/node": "^16.10.3", + "@types/express": "^4.17.13", + "@types/express-ws": "^3.0.1", + "@types/fluent-ffmpeg": "^2.1.20", + "@types/js-yaml": "^4.0.5", + "@types/node": "^17.0.8", "@types/node-fetch": "^2.5.12", - "@types/ws": "^8.2.0", + "@types/ws": "^8.2.2", "ts-node": "^10.4.0", - "typescript": "^4.4.3" + "typescript": "^4.5.4" }, "dependencies": { - "express": "^4.17.1", + "express": "^4.17.2", "express-ws": "^5.0.2", "fluent-ffmpeg": "^2.1.2", "js-yaml": "^4.1.0", - "mp4frag": "^0.4.2", - "node-fetch": "^2.6.5", - "ws": "^8.2.3" + "mp4frag": "^0.5.4", + "node-fetch": "^2.6.6", + "ws": "^8.4.0" }, "scripts": { "start": "npm run dev", diff --git a/server/pnpm-lock.yaml b/server/pnpm-lock.yaml index e60297a..3b11c0f 100644 --- a/server/pnpm-lock.yaml +++ b/server/pnpm-lock.yaml @@ -1,29 +1,29 @@ lockfileVersion: 5.3 specifiers: - '@types/express': ^4.17.8 - '@types/express-ws': ^3.0.0 - '@types/fluent-ffmpeg': ^2.1.19 - '@types/js-yaml': ^4.0.3 - '@types/node': ^16.10.3 + '@types/express': ^4.17.13 + '@types/express-ws': ^3.0.1 + '@types/fluent-ffmpeg': ^2.1.20 + '@types/js-yaml': ^4.0.5 + '@types/node': ^17.0.8 '@types/node-fetch': ^2.5.12 - '@types/ws': ^8.2.0 - express: ^4.17.1 + '@types/ws': ^8.2.2 + express: ^4.17.2 express-ws: ^5.0.2 fluent-ffmpeg: ^2.1.2 js-yaml: ^4.1.0 - mp4frag: ^0.4.2 - node-fetch: ^2.6.5 + mp4frag: ^0.5.4 + node-fetch: ^2.6.6 ts-node: ^10.4.0 - typescript: ^4.4.3 - ws: ^8.2.3 + typescript: ^4.5.4 + ws: ^8.4.0 dependencies: express: 4.17.2 express-ws: 5.0.2_express@4.17.2 fluent-ffmpeg: 2.1.2 js-yaml: 4.1.0 - mp4frag: 0.4.2 + mp4frag: 0.5.4 node-fetch: 2.6.6 ws: 8.4.0 @@ -32,10 +32,10 @@ devDependencies: '@types/express-ws': 3.0.1 '@types/fluent-ffmpeg': 2.1.20 '@types/js-yaml': 4.0.5 - '@types/node': 16.11.19 + '@types/node': 17.0.8 '@types/node-fetch': 2.5.12 '@types/ws': 8.2.2 - ts-node: 10.4.0_c0a8ca172db2ce87bc71f1a1cb132fc8 + ts-node: 10.4.0_faf01e1d5a40372a98081522dcafc186 typescript: 4.5.4 packages: @@ -72,19 +72,19 @@ packages: resolution: {integrity: sha512-ALYone6pm6QmwZoAgeyNksccT9Q4AWZQ6PvfwR37GT6r6FWUPguq6sUmNGSMV2Wr761oQoBxwGGa6DR5o1DC9g==} dependencies: '@types/connect': 3.4.35 - '@types/node': 16.11.19 + '@types/node': 17.0.8 dev: true /@types/connect/3.4.35: resolution: {integrity: sha512-cdeYyv4KWoEgpBISTxWvqYsVy444DOqehiF3fM3ne10AmJ62RSyNkUnxMJXHQWRQQX2eR94m5y1IZyDwBjV9FQ==} dependencies: - '@types/node': 16.11.19 + '@types/node': 17.0.8 dev: true /@types/express-serve-static-core/4.17.27: resolution: {integrity: sha512-e/sVallzUTPdyOTiqi8O8pMdBBphscvI6E4JYaKlja4Lm+zh7UFSSdW5VMkRbhDtmrONqOUHOXRguPsDckzxNA==} dependencies: - '@types/node': 16.11.19 + '@types/node': 17.0.8 '@types/qs': 6.9.7 '@types/range-parser': 1.2.4 dev: true @@ -109,7 +109,7 @@ packages: /@types/fluent-ffmpeg/2.1.20: resolution: {integrity: sha512-B+OvhCdJ3LgEq2PhvWNOiB/EfwnXLElfMCgc4Z1K5zXgSfo9I6uGKwR/lqmNPFQuebNnes7re3gqkV77SyypLg==} dependencies: - '@types/node': 16.11.19 + '@types/node': 17.0.8 dev: true /@types/js-yaml/4.0.5: @@ -123,12 +123,12 @@ packages: /@types/node-fetch/2.5.12: resolution: {integrity: sha512-MKgC4dlq4kKNa/mYrwpKfzQMB5X3ee5U6fSprkKpToBqBmX4nFZL9cW5jl6sWn+xpRJ7ypWh2yyqqr8UUCstSw==} dependencies: - '@types/node': 16.11.19 + '@types/node': 17.0.8 form-data: 3.0.1 dev: true - /@types/node/16.11.19: - resolution: {integrity: sha512-BPAcfDPoHlRQNKktbsbnpACGdypPFBuX4xQlsWDE7B8XXcfII+SpOLay3/qZmCLb39kV5S1RTYwXdkx2lwLYng==} + /@types/node/17.0.8: + resolution: {integrity: sha512-YofkM6fGv4gDJq78g4j0mMuGMkZVxZDgtU0JRdx6FgiJDG+0fY0GKVolOV8WqVmEhLCXkQRjwDdKyPxJp/uucg==} dev: true /@types/qs/6.9.7: @@ -143,13 +143,13 @@ packages: resolution: {integrity: sha512-nCkHGI4w7ZgAdNkrEu0bv+4xNV/XDqW+DydknebMOQwkpDGx8G+HTlj7R7ABI8i8nKxVw0wtKPi1D+lPOkh4YQ==} dependencies: '@types/mime': 1.3.2 - '@types/node': 16.11.19 + '@types/node': 17.0.8 dev: true /@types/ws/8.2.2: resolution: {integrity: sha512-NOn5eIcgWLOo6qW8AcuLZ7G8PycXu0xTxxkS6Q18VWFxgPUSOwV0pBj2a/4viNZVu25i7RIB7GttdkAIUUXOOg==} dependencies: - '@types/node': 16.11.19 + '@types/node': 17.0.8 dev: true /accepts/1.3.7: @@ -448,8 +448,8 @@ packages: hasBin: true dev: false - /mp4frag/0.4.2: - resolution: {integrity: sha512-7fxdk04N9JIBim496YsqbKAmwdYKXHq6BwqylUFlWW9+SMQeapeJy2o8VacOMRRHH1aDc3u+AXx/Vfz4j/r7Vg==} + /mp4frag/0.5.4: + resolution: {integrity: sha512-gFWDsvii4UlhFgNNC52rMpmqjVpgQH2Uj47qc1IFa1VhZLQYrbLK8c8HYQFBtQNrzKlwjyi3YvEVqWDULoO88g==} dev: false /ms/2.0.0: @@ -571,7 +571,7 @@ packages: resolution: {integrity: sha1-gYT9NH2snNwYWZLzpmIuFLnZq2o=} dev: false - /ts-node/10.4.0_c0a8ca172db2ce87bc71f1a1cb132fc8: + /ts-node/10.4.0_faf01e1d5a40372a98081522dcafc186: resolution: {integrity: sha512-g0FlPvvCXSIO1JDF6S232P5jPYqBkRL9qly81ZgAOSU7rwI0stphCgd2kLiCrU9DjQCrJMWEqcNSjQL02s6d8A==} hasBin: true peerDependencies: @@ -590,7 +590,7 @@ packages: '@tsconfig/node12': 1.0.9 '@tsconfig/node14': 1.0.1 '@tsconfig/node16': 1.0.2 - '@types/node': 16.11.19 + '@types/node': 17.0.8 acorn: 8.7.0 acorn-walk: 8.2.0 arg: 4.1.3 diff --git a/server/src/mp4frag.d.ts b/server/src/mp4frag.d.ts index 9c2e3c4..2e06ff9 100644 --- a/server/src/mp4frag.d.ts +++ b/server/src/mp4frag.d.ts @@ -93,6 +93,18 @@ declare module 'mp4frag' { * - Returns -1 if requested before first [segment event]{@link Mp4Frag#event:segment}. */ get duration(): number; + /** + * - Returns the total duration of all Mp4 segments as a Float(seconds). + * + * - Returns -1 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 Int(bytes). + * + * - Returns -1 if requested before [initialized event]{@link Mp4Frag#event:initialized}. + */ + get totalByteLength(): number; /** * - Returns the fmp4 HLS m3u8 playlist as a String. * @@ -111,6 +123,12 @@ declare module 'mp4frag' { * - Returns -1 if segment contains no keyframe nal. */ get keyframe(): number; + /** + * - Returns a boolean indicating if all segments contain a keyframe. + * + * - Returns false if any segments do not contain a keyframe. + */ + get allKeyframes(): boolean; /** * - Returns the Mp4 segments as an Array of Objects * @@ -118,73 +136,10 @@ declare module 'mp4frag' { * * - Returns Null if requested before first [segment event]{@link Mp4Frag#event:segment}. */ - get segmentObjectList(): Mp4Frag.SegmentObject[] | null; - /** - * @param {Number} [startIndex = -1] - positive or negative starting index for segment search - * @param {Boolean} [isKeyframe = true] - indicate if segment should contain keyframe - * @param {Number} [count = 1] - stop searching when count is reached - * - Returns the Mp4 segments as an Array of Objects - * - * - Returns Null if requested before first [segment event]{@link Mp4Frag#event:segment}. - * - * - Returns Null if no segment found when filtered with startIndex and isKeyframe. - */ - getSegmentObjectList( - startIndex?: number, - isKeyframe?: boolean, - count?: number - ): Mp4Frag.SegmentObject[] | null; - /** - * - Returns the Mp4 segments concatenated as a single Buffer. - * - * - Returns Null if requested before first [segment event]{@link Mp4Frag#event:segment}. - */ - get segmentList(): Buffer | null; - /** - * @param {Number} [startIndex = -1] - positive or negative starting index for segment search - * @param {Boolean} [isKeyframe = true] - indicate if segment should contain keyframe - * @param {Number} [count = 1] - stop searching when count is reached - * - Returns the Mp4 segments concatenated as a single Buffer. - * - * - Returns Null if requested before first [segment event]{@link Mp4Frag#event:segment}. - * - * - Returns Null if no segment found when filtered with startIndex and isKeyframe. - */ - getSegmentList( - startIndex?: number, - isKeyframe?: boolean, - count?: number - ): any | null; - /** - * - Returns the [initialization]{@link Mp4Frag#initialization} and [segmentList]{@link Mp4Frag#segmentList} concatenated as a single Buffer. - * - * - Returns Null if requested before first [segment event]{@link Mp4Frag#event:segment}. - */ - get buffer(): Buffer | null; - /** - * @param {Number} [startIndex = -1] - positive or negative starting index for segment search - * @param {Boolean} [isKeyframe = true] - indicate if segment should contain keyframe - * @param {Number} [count = 1] - stop searching when count is reached - * - Returns the [initialization]{@link Mp4Frag#initialization} and [segmentList]{@link Mp4Frag#segmentList} concatenated as a single Buffer. - * - * - Returns Null if requested before first [segment event]{@link Mp4Frag#event:segment}. - * - * - Returns Null if no segment found when filtered with startIndex and isKeyframe. - */ - getBuffer( - startIndex?: number, - isKeyframe?: boolean, - count?: number - ): Buffer | null; - /** - * @param {Number|String} sequence - sequence number - * - Returns the Mp4 segment that corresponds to the numbered sequence as a Buffer. - * - * - Returns Null if there is no segment that corresponds to sequence number. - */ - getSegment(sequence: number | string): Buffer | null; + 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 Object. * * - {segment, sequence, duration, timestamp, keyframe} @@ -196,22 +151,5 @@ declare module 'mp4frag' { * Clear cached values */ resetCache(): void; - - // TODO: should be able to override event emitter types - - // on(event: string | symbol, listener: (...args: any[]) => void): this; - // on( - // event: "initialized", - // listener: (init: { - // mime: String; - // initialization: Buffer; - // m3u8: String; - // }) => void - // ): this; - // on(event: "reset", listener: () => void): this; - // on( - // event: "segment", - // listener: (segmentObject: Mp4Frag.SegmentObject) => void - // ): this; } } diff --git a/server/src/server.ts b/server/src/server.ts index e3072f5..7659bfe 100644 --- a/server/src/server.ts +++ b/server/src/server.ts @@ -80,10 +80,10 @@ app.get('/webcam/:printer([^\\d]+):id(\\d+).m4s', (req, res) => { ); if (printer?.webcamStream) { - const segment = printer.webcamStream.getSegment(req.params.id); - if (segment) { + const segment_obj = printer.webcamStream.getSegmentObject(req.params.id); + if (segment_obj) { res.writeHead(200, { 'Content-Type': 'video/mp4' }); - res.end(segment); + res.end(segment_obj.segment); } else { res.sendStatus(503); }