diff --git a/CHANGELOG.md b/CHANGELOG.md index e76139f..66e58ce 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -13,6 +13,12 @@ _v6.3.1_ - Playback mode catch up to live, then swith to livefeed mode. - Removed the mutex lock on Clients.Count which led to a deadlock and froze call ingestion. +_v6.3.2_ + +- New #TGLBL metatag for dirwatch for ProScan (%C) or alike. +- Fix `semacquire` lockup in Clients (issue #177, #181, #182). +- Replay button now replays from history if pressed multiple times quickly (issue #186). + ## Version 6.2 - New max clients options which is 200 by default. diff --git a/COMPILING.md b/COMPILING.md index c4a0fdf..6a2120f 100644 --- a/COMPILING.md +++ b/COMPILING.md @@ -27,13 +27,13 @@ Clone the official repository on your computer and start the build process. When finished, you will find the precompiled versions for various platforms in the `dist` folder. - rdio-scanner-darwin-amd64-v6.3.1.zip - rdio-scanner-darwin-arm64-v6.3.1.zip - rdio-scanner-freebsd-amd64-v6.3.1.zip - rdio-scanner-linux-386-v6.3.1.zip - rdio-scanner-linux-amd64-v6.3.1.zip - rdio-scanner-linux-arm64-v6.3.1.zip - rdio-scanner-linux-arm-v6.3.1.zip - rdio-scanner-windows-amd64-v6.3.1.zip + rdio-scanner-darwin-amd64-v6.3.2.zip + rdio-scanner-darwin-arm64-v6.3.2.zip + rdio-scanner-freebsd-amd64-v6.3.2.zip + rdio-scanner-linux-386-v6.3.2.zip + rdio-scanner-linux-amd64-v6.3.2.zip + rdio-scanner-linux-arm64-v6.3.2.zip + rdio-scanner-linux-arm-v6.3.2.zip + rdio-scanner-windows-amd64-v6.3.2.zip **Happy Rdio scanning !** \ No newline at end of file diff --git a/Makefile b/Makefile index 9bd3d2a..77d0d32 100644 --- a/Makefile +++ b/Makefile @@ -16,8 +16,8 @@ ################################################################################ app := rdio-scanner -date := 2022/05/20 -ver := 6.3.1 +date := 2022/05/21 +ver := 6.3.2 client := $(wildcard client/*.json client/*.ts) server := $(wildcard server/*.go) diff --git a/client/package-lock.json b/client/package-lock.json index b035532..c820aa9 100644 --- a/client/package-lock.json +++ b/client/package-lock.json @@ -1,12 +1,12 @@ { "name": "rdio-scanner", - "version": "6.3.1", + "version": "6.3.2", "lockfileVersion": 2, "requires": true, "packages": { "": { "name": "rdio-scanner", - "version": "6.3.1", + "version": "6.3.2", "license": "LICENSE", "dependencies": { "@angular/animations": "^13.3.9", @@ -477,21 +477,21 @@ } }, "node_modules/@angular/compiler-cli/node_modules/@babel/core": { - "version": "7.17.12", - "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.17.12.tgz", - "integrity": "sha512-44ODe6O1IVz9s2oJE3rZ4trNNKTX9O7KpQpfAP4t8QII/zwrVRHL7i2pxhqtcY7tqMLrrKfMlBKnm1QlrRFs5w==", + "version": "7.18.0", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.18.0.tgz", + "integrity": "sha512-Xyw74OlJwDijToNi0+6BBI5mLLR5+5R3bcSH80LXzjzEGEUlvNzujEE71BaD/ApEZHAvFI/Mlmp4M5lIkdeeWw==", "dev": true, "dependencies": { "@ampproject/remapping": "^2.1.0", "@babel/code-frame": "^7.16.7", - "@babel/generator": "^7.17.12", + "@babel/generator": "^7.18.0", "@babel/helper-compilation-targets": "^7.17.10", - "@babel/helper-module-transforms": "^7.17.12", - "@babel/helpers": "^7.17.9", - "@babel/parser": "^7.17.12", + "@babel/helper-module-transforms": "^7.18.0", + "@babel/helpers": "^7.18.0", + "@babel/parser": "^7.18.0", "@babel/template": "^7.16.7", - "@babel/traverse": "^7.17.12", - "@babel/types": "^7.17.12", + "@babel/traverse": "^7.18.0", + "@babel/types": "^7.18.0", "convert-source-map": "^1.7.0", "debug": "^4.1.0", "gensync": "^1.0.0-beta.2", @@ -516,12 +516,12 @@ } }, "node_modules/@angular/compiler-cli/node_modules/@babel/generator": { - "version": "7.17.12", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.17.12.tgz", - "integrity": "sha512-V49KtZiiiLjH/CnIW6OjJdrenrGoyh6AmKQ3k2AZFKozC1h846Q4NYlZ5nqAigPDUXfGzC88+LOUuG8yKd2kCw==", + "version": "7.18.0", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.18.0.tgz", + "integrity": "sha512-81YO9gGx6voPXlvYdZBliFXAZU8vZ9AZ6z+CjlmcnaeOcYSFbMTpdeDUO9xD9dh/68Vq03I8ZspfUTPfitcDHg==", "dev": true, "dependencies": { - "@babel/types": "^7.17.12", + "@babel/types": "^7.18.0", "@jridgewell/gen-mapping": "^0.3.0", "jsesc": "^2.5.1" }, @@ -828,9 +828,9 @@ } }, "node_modules/@babel/helper-create-class-features-plugin": { - "version": "7.17.12", - "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.17.12.tgz", - "integrity": "sha512-sZoOeUTkFJMyhqCei2+Z+wtH/BehW8NVKQt7IRUQlRiOARuXymJYfN/FCcI8CvVbR0XVyDM6eLFOlR7YtiXnew==", + "version": "7.18.0", + "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.18.0.tgz", + "integrity": "sha512-Kh8zTGR9de3J63e5nS0rQUdRs/kbtwoeQQ0sriS0lItjC96u8XXZN6lKpuyWd2coKSU13py/y+LTmThLuVX0Pg==", "dev": true, "dependencies": { "@babel/helper-annotate-as-pure": "^7.16.7", @@ -966,9 +966,9 @@ } }, "node_modules/@babel/helper-module-transforms": { - "version": "7.17.12", - "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.17.12.tgz", - "integrity": "sha512-t5s2BeSWIghhFRPh9XMn6EIGmvn8Lmw5RVASJzkIx1mSemubQQBNIZiQD7WzaFmaHIrjAec4x8z9Yx8SjJ1/LA==", + "version": "7.18.0", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.18.0.tgz", + "integrity": "sha512-kclUYSUBIjlvnzN2++K9f2qzYKFgjmnmjwL4zlmU5f8ZtzgWe8s0rUPSTGy2HmK4P8T52MQsS+HTQAgZd3dMEA==", "dev": true, "dependencies": { "@babel/helper-environment-visitor": "^7.16.7", @@ -977,8 +977,8 @@ "@babel/helper-split-export-declaration": "^7.16.7", "@babel/helper-validator-identifier": "^7.16.7", "@babel/template": "^7.16.7", - "@babel/traverse": "^7.17.12", - "@babel/types": "^7.17.12" + "@babel/traverse": "^7.18.0", + "@babel/types": "^7.18.0" }, "engines": { "node": ">=6.9.0" @@ -1105,14 +1105,14 @@ } }, "node_modules/@babel/helpers": { - "version": "7.17.9", - "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.17.9.tgz", - "integrity": "sha512-cPCt915ShDWUEzEp3+UNRktO2n6v49l5RSnG9M5pS24hA+2FAc5si+Pn1i4VVbQQ+jh+bIZhPFQOJOzbrOYY1Q==", + "version": "7.18.0", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.18.0.tgz", + "integrity": "sha512-AE+HMYhmlMIbho9nbvicHyxFwhrO+xhKB6AhRxzl8w46Yj0VXTZjEsAoBVC7rB2I0jzX+yWyVybnO08qkfx6kg==", "dev": true, "dependencies": { "@babel/template": "^7.16.7", - "@babel/traverse": "^7.17.9", - "@babel/types": "^7.17.0" + "@babel/traverse": "^7.18.0", + "@babel/types": "^7.18.0" }, "engines": { "node": ">=6.9.0" @@ -1133,9 +1133,9 @@ } }, "node_modules/@babel/parser": { - "version": "7.17.12", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.17.12.tgz", - "integrity": "sha512-FLzHmN9V3AJIrWfOpvRlZCeVg/WLdicSnTMsLur6uDj9TT8ymUlG9XxURdW/XvuygK+2CW0poOJABdA4m/YKxA==", + "version": "7.18.0", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.18.0.tgz", + "integrity": "sha512-AqDccGC+m5O/iUStSJy3DGRIUFu7WbY/CppZYwrEUB4N0tZlnI8CSTsgL7v5fHVFmUbRv2sd+yy27o8Ydt4MGg==", "dev": true, "bin": { "parser": "bin/babel-parser.js" @@ -1210,12 +1210,12 @@ } }, "node_modules/@babel/plugin-proposal-class-static-block": { - "version": "7.17.12", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-class-static-block/-/plugin-proposal-class-static-block-7.17.12.tgz", - "integrity": "sha512-8ILyDG6eL14F8iub97dVc8q35Md0PJYAnA5Kz9NACFOkt6ffCcr0FISyUPKHsvuAy36fkpIitxZ9bVYPFMGQHA==", + "version": "7.18.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-class-static-block/-/plugin-proposal-class-static-block-7.18.0.tgz", + "integrity": "sha512-t+8LsRMMDE74c6sV7KShIw13sqbqd58tlqNrsWoWBTIMw7SVQ0cZ905wLNS/FBCy/3PyooRHLFFlfrUNyyz5lA==", "dev": true, "dependencies": { - "@babel/helper-create-class-features-plugin": "^7.17.12", + "@babel/helper-create-class-features-plugin": "^7.18.0", "@babel/helper-plugin-utils": "^7.17.12", "@babel/plugin-syntax-class-static-block": "^7.14.5" }, @@ -1323,9 +1323,9 @@ } }, "node_modules/@babel/plugin-proposal-object-rest-spread": { - "version": "7.17.12", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.17.12.tgz", - "integrity": "sha512-6l9cO3YXXRh4yPCPRA776ZyJ3RobG4ZKJZhp7NDRbKIOeV3dBPG8FXCF7ZtiO2RTCIOkQOph1xDDcc01iWVNjQ==", + "version": "7.18.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.18.0.tgz", + "integrity": "sha512-nbTv371eTrFabDfHLElkn9oyf9VG+VKK6WMzhY2o4eHKaG19BToD9947zzGMO6I/Irstx9d8CwX6njPNIAR/yw==", "dev": true, "dependencies": { "@babel/compat-data": "^7.17.10", @@ -1701,9 +1701,9 @@ } }, "node_modules/@babel/plugin-transform-destructuring": { - "version": "7.17.12", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.17.12.tgz", - "integrity": "sha512-P8pt0YiKtX5UMUL5Xzsc9Oyij+pJE6JuC+F1k0/brq/OOGs5jDa1If3OY0LRWGvJsJhI+8tsiecL3nJLc0WTlg==", + "version": "7.18.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.18.0.tgz", + "integrity": "sha512-Mo69klS79z6KEfrLg/1WkmVnB8javh75HX4pi2btjvlIoasuxilEyjtsQW6XPrubNd7AQy0MMaNIaQE4e7+PQw==", "dev": true, "dependencies": { "@babel/helper-plugin-utils": "^7.17.12" @@ -1763,9 +1763,9 @@ } }, "node_modules/@babel/plugin-transform-for-of": { - "version": "7.17.12", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.17.12.tgz", - "integrity": "sha512-76lTwYaCxw8ldT7tNmye4LLwSoKDbRCBzu6n/DcK/P3FOR29+38CIIaVIZfwol9By8W/QHORYEnYSLuvcQKrsg==", + "version": "7.18.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.18.1.tgz", + "integrity": "sha512-+TTB5XwvJ5hZbO8xvl2H4XaMDOAK57zF4miuC9qQJgysPNEAZZ9Z69rdF5LJkozGdZrjBIUAIyKUWRMmebI7vg==", "dev": true, "dependencies": { "@babel/helper-plugin-utils": "^7.17.12" @@ -1825,12 +1825,12 @@ } }, "node_modules/@babel/plugin-transform-modules-amd": { - "version": "7.17.12", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.17.12.tgz", - "integrity": "sha512-p5rt9tB5Ndcc2Za7CeNxVf7YAjRcUMR6yi8o8tKjb9KhRkEvXwa+C0hj6DA5bVDkKRxB0NYhMUGbVKoFu4+zEA==", + "version": "7.18.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.18.0.tgz", + "integrity": "sha512-h8FjOlYmdZwl7Xm2Ug4iX2j7Qy63NANI+NQVWQzv6r25fqgg7k2dZl03p95kvqNclglHs4FZ+isv4p1uXMA+QA==", "dev": true, "dependencies": { - "@babel/helper-module-transforms": "^7.17.12", + "@babel/helper-module-transforms": "^7.18.0", "@babel/helper-plugin-utils": "^7.17.12", "babel-plugin-dynamic-import-node": "^2.3.3" }, @@ -1842,12 +1842,12 @@ } }, "node_modules/@babel/plugin-transform-modules-commonjs": { - "version": "7.17.12", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.17.12.tgz", - "integrity": "sha512-tVPs6MImAJz+DiX8Y1xXEMdTk5Lwxu9jiPjlS+nv5M2A59R7+/d1+9A8C/sbuY0b3QjIxqClkj6KAplEtRvzaA==", + "version": "7.18.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.18.0.tgz", + "integrity": "sha512-cCeR0VZWtfxWS4YueAK2qtHtBPJRSaJcMlbS8jhSIm/A3E2Kpro4W1Dn4cqJtp59dtWfXjQwK7SPKF8ghs7rlw==", "dev": true, "dependencies": { - "@babel/helper-module-transforms": "^7.17.12", + "@babel/helper-module-transforms": "^7.18.0", "@babel/helper-plugin-utils": "^7.17.12", "@babel/helper-simple-access": "^7.17.7", "babel-plugin-dynamic-import-node": "^2.3.3" @@ -1860,13 +1860,13 @@ } }, "node_modules/@babel/plugin-transform-modules-systemjs": { - "version": "7.17.12", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.17.12.tgz", - "integrity": "sha512-NVhDb0q00hqZcuLduUf/kMzbOQHiocmPbIxIvk23HLiEqaTKC/l4eRxeC7lO63M72BmACoiKOcb9AkOAJRerpw==", + "version": "7.18.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.18.0.tgz", + "integrity": "sha512-vwKpxdHnlM5tIrRt/eA0bzfbi7gUBLN08vLu38np1nZevlPySRe6yvuATJB5F/WPJ+ur4OXwpVYq9+BsxqAQuQ==", "dev": true, "dependencies": { "@babel/helper-hoist-variables": "^7.16.7", - "@babel/helper-module-transforms": "^7.17.12", + "@babel/helper-module-transforms": "^7.18.0", "@babel/helper-plugin-utils": "^7.17.12", "@babel/helper-validator-identifier": "^7.16.7", "babel-plugin-dynamic-import-node": "^2.3.3" @@ -1879,12 +1879,12 @@ } }, "node_modules/@babel/plugin-transform-modules-umd": { - "version": "7.17.12", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.17.12.tgz", - "integrity": "sha512-BnsPkrUHsjzZGpnrmJeDFkOMMljWFHPjDc9xDcz71/C+ybF3lfC3V4m3dwXPLZrE5b3bgd4V+3/Pj+3620d7IA==", + "version": "7.18.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.18.0.tgz", + "integrity": "sha512-d/zZ8I3BWli1tmROLxXLc9A6YXvGK8egMxHp+E/rRwMh1Kip0AP77VwZae3snEJ33iiWwvNv2+UIIhfalqhzZA==", "dev": true, "dependencies": { - "@babel/helper-module-transforms": "^7.17.12", + "@babel/helper-module-transforms": "^7.18.0", "@babel/helper-plugin-utils": "^7.17.12" }, "engines": { @@ -1972,11 +1972,12 @@ } }, "node_modules/@babel/plugin-transform-regenerator": { - "version": "7.17.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.17.9.tgz", - "integrity": "sha512-Lc2TfbxR1HOyn/c6b4Y/b6NHoTb67n/IoWLxTu4kC7h4KQnWlhCq2S8Tx0t2SVvv5Uu87Hs+6JEJ5kt2tYGylQ==", + "version": "7.18.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.18.0.tgz", + "integrity": "sha512-C8YdRw9uzx25HSIzwA7EM7YP0FhCe5wNvJbZzjVNHHPGVcDJ3Aie+qGYYdS1oVQgn+B3eAIJbWFLrJ4Jipv7nw==", "dev": true, "dependencies": { + "@babel/helper-plugin-utils": "^7.17.12", "regenerator-transform": "^0.15.0" }, "engines": { @@ -2277,19 +2278,19 @@ } }, "node_modules/@babel/traverse": { - "version": "7.17.12", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.17.12.tgz", - "integrity": "sha512-zULPs+TbCvOkIFd4FrG53xrpxvCBwLIgo6tO0tJorY7YV2IWFxUfS/lXDJbGgfyYt9ery/Gxj2niwttNnB0gIw==", + "version": "7.18.0", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.18.0.tgz", + "integrity": "sha512-oNOO4vaoIQoGjDQ84LgtF/IAlxlyqL4TUuoQ7xLkQETFaHkY1F7yazhB4Kt3VcZGL0ZF/jhrEpnXqUb0M7V3sw==", "dev": true, "dependencies": { "@babel/code-frame": "^7.16.7", - "@babel/generator": "^7.17.12", + "@babel/generator": "^7.18.0", "@babel/helper-environment-visitor": "^7.16.7", "@babel/helper-function-name": "^7.17.9", "@babel/helper-hoist-variables": "^7.16.7", "@babel/helper-split-export-declaration": "^7.16.7", - "@babel/parser": "^7.17.12", - "@babel/types": "^7.17.12", + "@babel/parser": "^7.18.0", + "@babel/types": "^7.18.0", "debug": "^4.1.0", "globals": "^11.1.0" }, @@ -2298,12 +2299,12 @@ } }, "node_modules/@babel/traverse/node_modules/@babel/generator": { - "version": "7.17.12", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.17.12.tgz", - "integrity": "sha512-V49KtZiiiLjH/CnIW6OjJdrenrGoyh6AmKQ3k2AZFKozC1h846Q4NYlZ5nqAigPDUXfGzC88+LOUuG8yKd2kCw==", + "version": "7.18.0", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.18.0.tgz", + "integrity": "sha512-81YO9gGx6voPXlvYdZBliFXAZU8vZ9AZ6z+CjlmcnaeOcYSFbMTpdeDUO9xD9dh/68Vq03I8ZspfUTPfitcDHg==", "dev": true, "dependencies": { - "@babel/types": "^7.17.12", + "@babel/types": "^7.18.0", "@jridgewell/gen-mapping": "^0.3.0", "jsesc": "^2.5.1" }, @@ -2326,9 +2327,9 @@ } }, "node_modules/@babel/types": { - "version": "7.17.12", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.17.12.tgz", - "integrity": "sha512-rH8i29wcZ6x9xjzI5ILHL/yZkbQnCERdHlogKuIb4PUr7do4iT8DPekrTbBLWTnRQm6U0GYABbTMSzijmEqlAg==", + "version": "7.18.0", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.18.0.tgz", + "integrity": "sha512-vhAmLPAiC8j9K2GnsnLPCIH5wCrPpYIVBCWRBFDCB7Y/BXLqi/O+1RSTTM2bsmg6U/551+FCf9PNPxjABmxHTw==", "dev": true, "dependencies": { "@babel/helper-validator-identifier": "^7.16.7", @@ -2401,15 +2402,15 @@ } }, "node_modules/@eslint/eslintrc": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-1.2.3.tgz", - "integrity": "sha512-uGo44hIwoLGNyduRpjdEpovcbMdd+Nv7amtmJxnKmI8xj6yd5LncmSwDa5NgX/41lIFJtkjD6YdVfgEzPfJ5UA==", + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-1.3.0.tgz", + "integrity": "sha512-UWW0TMTmk2d7hLcWD1/e2g5HDM/HQ3csaLSqXCfqwh4uNDuNqlaKWXmEsL4Cs41Z0KnILNvwbHAah3C2yt06kw==", "dev": true, "dependencies": { "ajv": "^6.12.4", "debug": "^4.3.2", "espree": "^9.3.2", - "globals": "^13.9.0", + "globals": "^13.15.0", "ignore": "^5.2.0", "import-fresh": "^3.2.1", "js-yaml": "^4.1.0", @@ -5686,12 +5687,12 @@ } }, "node_modules/eslint": { - "version": "8.15.0", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.15.0.tgz", - "integrity": "sha512-GG5USZ1jhCu8HJkzGgeK8/+RGnHaNYZGrGDzUtigK3BsGESW/rs2az23XqE0WVwDxy1VRvvjSSGu5nB0Bu+6SA==", + "version": "8.16.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.16.0.tgz", + "integrity": "sha512-MBndsoXY/PeVTDJeWsYj7kLZ5hQpJOfMYLsF6LicLHQWbRDG19lK5jOix4DPl8yY4SUFcE3txy86OzFLWT+yoA==", "dev": true, "dependencies": { - "@eslint/eslintrc": "^1.2.3", + "@eslint/eslintrc": "^1.3.0", "@humanwhocodes/config-array": "^0.9.2", "ajv": "^6.10.0", "chalk": "^4.0.0", @@ -5709,7 +5710,7 @@ "file-entry-cache": "^6.0.1", "functional-red-black-tree": "^1.0.1", "glob-parent": "^6.0.1", - "globals": "^13.6.0", + "globals": "^13.15.0", "ignore": "^5.2.0", "import-fresh": "^3.0.0", "imurmurhash": "^0.1.4", @@ -8647,9 +8648,9 @@ } }, "node_modules/npm-registry-fetch/node_modules/make-fetch-happen": { - "version": "10.1.4", - "resolved": "https://registry.npmjs.org/make-fetch-happen/-/make-fetch-happen-10.1.4.tgz", - "integrity": "sha512-hU1w68PqfH7FdMgjbiziJoACY0edlbIZ0CyKnpcEruVdCjsUrN+qoenOCIayNqVBK7toSWwbDxvQlrhH0gjRdg==", + "version": "10.1.5", + "resolved": "https://registry.npmjs.org/make-fetch-happen/-/make-fetch-happen-10.1.5.tgz", + "integrity": "sha512-mucOj2H0Jn/ax7H9K9T1bf0p1nn/mBFa551Os7ed9xRfLEx20aZhZeLslmRYfAaAqXZUGipcs+m5KOKvOH0XKA==", "dev": true, "dependencies": { "agentkeepalive": "^4.2.1", @@ -8703,9 +8704,9 @@ } }, "node_modules/npm-registry-fetch/node_modules/ssri": { - "version": "9.0.0", - "resolved": "https://registry.npmjs.org/ssri/-/ssri-9.0.0.tgz", - "integrity": "sha512-Y1Z6J8UYnexKFN1R/hxUaYoY2LVdKEzziPmVAFKiKX8fiwvCJTVzn/xYE9TEWod5OVyNfIHHuVfIEuBClL/uJQ==", + "version": "9.0.1", + "resolved": "https://registry.npmjs.org/ssri/-/ssri-9.0.1.tgz", + "integrity": "sha512-o57Wcn66jMQvfHG1FlYbWeZWW/dHZhJXjpIcTfXldXEk5nz5lStPo3mK0OJQfGR3RbZUlbISexbljkJzuEj/8Q==", "dev": true, "dependencies": { "minipass": "^3.1.1" @@ -9371,9 +9372,9 @@ } }, "node_modules/postcss-color-functional-notation": { - "version": "4.2.2", - "resolved": "https://registry.npmjs.org/postcss-color-functional-notation/-/postcss-color-functional-notation-4.2.2.tgz", - "integrity": "sha512-DXVtwUhIk4f49KK5EGuEdgx4Gnyj6+t2jBSEmxvpIK9QI40tWrpS2Pua8Q7iIZWBrki2QOaeUdEaLPPa91K0RQ==", + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/postcss-color-functional-notation/-/postcss-color-functional-notation-4.2.3.tgz", + "integrity": "sha512-5fbr6FzFzjwHXKsVnkmEYrJYG8VNNzvD1tAXaPPWR97S6rhKI5uh2yOfV5TAzhDkZoq4h+chxEplFDc8GeyFtw==", "dev": true, "dependencies": { "postcss-value-parser": "^4.2.0" @@ -9381,6 +9382,10 @@ "engines": { "node": "^12 || ^14 || >=16" }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + }, "peerDependencies": { "postcss": "^8.4" } @@ -9725,9 +9730,9 @@ } }, "node_modules/postcss-nesting": { - "version": "10.1.6", - "resolved": "https://registry.npmjs.org/postcss-nesting/-/postcss-nesting-10.1.6.tgz", - "integrity": "sha512-8C0X0pOOShlgqYkCzB4wlWLyulos+GXFpw7r2+x7g+ROQ1RwN8MlN2NCcpNQScNBPfbjxbjwY8e25raTcEXqmg==", + "version": "10.1.7", + "resolved": "https://registry.npmjs.org/postcss-nesting/-/postcss-nesting-10.1.7.tgz", + "integrity": "sha512-Btho5XzDTpl117SmB3tvUHP8txg5n7Ayv7vQ5m4b1zXkfs1Y52C67uZjZ746h7QvOJ+rLRg50OlhhjFW+IQY6A==", "dev": true, "dependencies": { "@csstools/selector-specificity": "1.0.0", @@ -12411,21 +12416,21 @@ }, "dependencies": { "@babel/core": { - "version": "7.17.12", - "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.17.12.tgz", - "integrity": "sha512-44ODe6O1IVz9s2oJE3rZ4trNNKTX9O7KpQpfAP4t8QII/zwrVRHL7i2pxhqtcY7tqMLrrKfMlBKnm1QlrRFs5w==", + "version": "7.18.0", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.18.0.tgz", + "integrity": "sha512-Xyw74OlJwDijToNi0+6BBI5mLLR5+5R3bcSH80LXzjzEGEUlvNzujEE71BaD/ApEZHAvFI/Mlmp4M5lIkdeeWw==", "dev": true, "requires": { "@ampproject/remapping": "^2.1.0", "@babel/code-frame": "^7.16.7", - "@babel/generator": "^7.17.12", + "@babel/generator": "^7.18.0", "@babel/helper-compilation-targets": "^7.17.10", - "@babel/helper-module-transforms": "^7.17.12", - "@babel/helpers": "^7.17.9", - "@babel/parser": "^7.17.12", + "@babel/helper-module-transforms": "^7.18.0", + "@babel/helpers": "^7.18.0", + "@babel/parser": "^7.18.0", "@babel/template": "^7.16.7", - "@babel/traverse": "^7.17.12", - "@babel/types": "^7.17.12", + "@babel/traverse": "^7.18.0", + "@babel/types": "^7.18.0", "convert-source-map": "^1.7.0", "debug": "^4.1.0", "gensync": "^1.0.0-beta.2", @@ -12442,12 +12447,12 @@ } }, "@babel/generator": { - "version": "7.17.12", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.17.12.tgz", - "integrity": "sha512-V49KtZiiiLjH/CnIW6OjJdrenrGoyh6AmKQ3k2AZFKozC1h846Q4NYlZ5nqAigPDUXfGzC88+LOUuG8yKd2kCw==", + "version": "7.18.0", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.18.0.tgz", + "integrity": "sha512-81YO9gGx6voPXlvYdZBliFXAZU8vZ9AZ6z+CjlmcnaeOcYSFbMTpdeDUO9xD9dh/68Vq03I8ZspfUTPfitcDHg==", "dev": true, "requires": { - "@babel/types": "^7.17.12", + "@babel/types": "^7.18.0", "@jridgewell/gen-mapping": "^0.3.0", "jsesc": "^2.5.1" } @@ -12647,9 +12652,9 @@ } }, "@babel/helper-create-class-features-plugin": { - "version": "7.17.12", - "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.17.12.tgz", - "integrity": "sha512-sZoOeUTkFJMyhqCei2+Z+wtH/BehW8NVKQt7IRUQlRiOARuXymJYfN/FCcI8CvVbR0XVyDM6eLFOlR7YtiXnew==", + "version": "7.18.0", + "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.18.0.tgz", + "integrity": "sha512-Kh8zTGR9de3J63e5nS0rQUdRs/kbtwoeQQ0sriS0lItjC96u8XXZN6lKpuyWd2coKSU13py/y+LTmThLuVX0Pg==", "dev": true, "requires": { "@babel/helper-annotate-as-pure": "^7.16.7", @@ -12751,9 +12756,9 @@ } }, "@babel/helper-module-transforms": { - "version": "7.17.12", - "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.17.12.tgz", - "integrity": "sha512-t5s2BeSWIghhFRPh9XMn6EIGmvn8Lmw5RVASJzkIx1mSemubQQBNIZiQD7WzaFmaHIrjAec4x8z9Yx8SjJ1/LA==", + "version": "7.18.0", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.18.0.tgz", + "integrity": "sha512-kclUYSUBIjlvnzN2++K9f2qzYKFgjmnmjwL4zlmU5f8ZtzgWe8s0rUPSTGy2HmK4P8T52MQsS+HTQAgZd3dMEA==", "dev": true, "requires": { "@babel/helper-environment-visitor": "^7.16.7", @@ -12762,8 +12767,8 @@ "@babel/helper-split-export-declaration": "^7.16.7", "@babel/helper-validator-identifier": "^7.16.7", "@babel/template": "^7.16.7", - "@babel/traverse": "^7.17.12", - "@babel/types": "^7.17.12" + "@babel/traverse": "^7.18.0", + "@babel/types": "^7.18.0" } }, "@babel/helper-optimise-call-expression": { @@ -12857,14 +12862,14 @@ } }, "@babel/helpers": { - "version": "7.17.9", - "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.17.9.tgz", - "integrity": "sha512-cPCt915ShDWUEzEp3+UNRktO2n6v49l5RSnG9M5pS24hA+2FAc5si+Pn1i4VVbQQ+jh+bIZhPFQOJOzbrOYY1Q==", + "version": "7.18.0", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.18.0.tgz", + "integrity": "sha512-AE+HMYhmlMIbho9nbvicHyxFwhrO+xhKB6AhRxzl8w46Yj0VXTZjEsAoBVC7rB2I0jzX+yWyVybnO08qkfx6kg==", "dev": true, "requires": { "@babel/template": "^7.16.7", - "@babel/traverse": "^7.17.9", - "@babel/types": "^7.17.0" + "@babel/traverse": "^7.18.0", + "@babel/types": "^7.18.0" } }, "@babel/highlight": { @@ -12879,9 +12884,9 @@ } }, "@babel/parser": { - "version": "7.17.12", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.17.12.tgz", - "integrity": "sha512-FLzHmN9V3AJIrWfOpvRlZCeVg/WLdicSnTMsLur6uDj9TT8ymUlG9XxURdW/XvuygK+2CW0poOJABdA4m/YKxA==", + "version": "7.18.0", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.18.0.tgz", + "integrity": "sha512-AqDccGC+m5O/iUStSJy3DGRIUFu7WbY/CppZYwrEUB4N0tZlnI8CSTsgL7v5fHVFmUbRv2sd+yy27o8Ydt4MGg==", "dev": true }, "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": { @@ -12926,12 +12931,12 @@ } }, "@babel/plugin-proposal-class-static-block": { - "version": "7.17.12", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-class-static-block/-/plugin-proposal-class-static-block-7.17.12.tgz", - "integrity": "sha512-8ILyDG6eL14F8iub97dVc8q35Md0PJYAnA5Kz9NACFOkt6ffCcr0FISyUPKHsvuAy36fkpIitxZ9bVYPFMGQHA==", + "version": "7.18.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-class-static-block/-/plugin-proposal-class-static-block-7.18.0.tgz", + "integrity": "sha512-t+8LsRMMDE74c6sV7KShIw13sqbqd58tlqNrsWoWBTIMw7SVQ0cZ905wLNS/FBCy/3PyooRHLFFlfrUNyyz5lA==", "dev": true, "requires": { - "@babel/helper-create-class-features-plugin": "^7.17.12", + "@babel/helper-create-class-features-plugin": "^7.18.0", "@babel/helper-plugin-utils": "^7.17.12", "@babel/plugin-syntax-class-static-block": "^7.14.5" } @@ -12997,9 +13002,9 @@ } }, "@babel/plugin-proposal-object-rest-spread": { - "version": "7.17.12", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.17.12.tgz", - "integrity": "sha512-6l9cO3YXXRh4yPCPRA776ZyJ3RobG4ZKJZhp7NDRbKIOeV3dBPG8FXCF7ZtiO2RTCIOkQOph1xDDcc01iWVNjQ==", + "version": "7.18.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.18.0.tgz", + "integrity": "sha512-nbTv371eTrFabDfHLElkn9oyf9VG+VKK6WMzhY2o4eHKaG19BToD9947zzGMO6I/Irstx9d8CwX6njPNIAR/yw==", "dev": true, "requires": { "@babel/compat-data": "^7.17.10", @@ -13252,9 +13257,9 @@ } }, "@babel/plugin-transform-destructuring": { - "version": "7.17.12", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.17.12.tgz", - "integrity": "sha512-P8pt0YiKtX5UMUL5Xzsc9Oyij+pJE6JuC+F1k0/brq/OOGs5jDa1If3OY0LRWGvJsJhI+8tsiecL3nJLc0WTlg==", + "version": "7.18.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.18.0.tgz", + "integrity": "sha512-Mo69klS79z6KEfrLg/1WkmVnB8javh75HX4pi2btjvlIoasuxilEyjtsQW6XPrubNd7AQy0MMaNIaQE4e7+PQw==", "dev": true, "requires": { "@babel/helper-plugin-utils": "^7.17.12" @@ -13290,9 +13295,9 @@ } }, "@babel/plugin-transform-for-of": { - "version": "7.17.12", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.17.12.tgz", - "integrity": "sha512-76lTwYaCxw8ldT7tNmye4LLwSoKDbRCBzu6n/DcK/P3FOR29+38CIIaVIZfwol9By8W/QHORYEnYSLuvcQKrsg==", + "version": "7.18.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.18.1.tgz", + "integrity": "sha512-+TTB5XwvJ5hZbO8xvl2H4XaMDOAK57zF4miuC9qQJgysPNEAZZ9Z69rdF5LJkozGdZrjBIUAIyKUWRMmebI7vg==", "dev": true, "requires": { "@babel/helper-plugin-utils": "^7.17.12" @@ -13328,48 +13333,48 @@ } }, "@babel/plugin-transform-modules-amd": { - "version": "7.17.12", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.17.12.tgz", - "integrity": "sha512-p5rt9tB5Ndcc2Za7CeNxVf7YAjRcUMR6yi8o8tKjb9KhRkEvXwa+C0hj6DA5bVDkKRxB0NYhMUGbVKoFu4+zEA==", + "version": "7.18.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.18.0.tgz", + "integrity": "sha512-h8FjOlYmdZwl7Xm2Ug4iX2j7Qy63NANI+NQVWQzv6r25fqgg7k2dZl03p95kvqNclglHs4FZ+isv4p1uXMA+QA==", "dev": true, "requires": { - "@babel/helper-module-transforms": "^7.17.12", + "@babel/helper-module-transforms": "^7.18.0", "@babel/helper-plugin-utils": "^7.17.12", "babel-plugin-dynamic-import-node": "^2.3.3" } }, "@babel/plugin-transform-modules-commonjs": { - "version": "7.17.12", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.17.12.tgz", - "integrity": "sha512-tVPs6MImAJz+DiX8Y1xXEMdTk5Lwxu9jiPjlS+nv5M2A59R7+/d1+9A8C/sbuY0b3QjIxqClkj6KAplEtRvzaA==", + "version": "7.18.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.18.0.tgz", + "integrity": "sha512-cCeR0VZWtfxWS4YueAK2qtHtBPJRSaJcMlbS8jhSIm/A3E2Kpro4W1Dn4cqJtp59dtWfXjQwK7SPKF8ghs7rlw==", "dev": true, "requires": { - "@babel/helper-module-transforms": "^7.17.12", + "@babel/helper-module-transforms": "^7.18.0", "@babel/helper-plugin-utils": "^7.17.12", "@babel/helper-simple-access": "^7.17.7", "babel-plugin-dynamic-import-node": "^2.3.3" } }, "@babel/plugin-transform-modules-systemjs": { - "version": "7.17.12", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.17.12.tgz", - "integrity": "sha512-NVhDb0q00hqZcuLduUf/kMzbOQHiocmPbIxIvk23HLiEqaTKC/l4eRxeC7lO63M72BmACoiKOcb9AkOAJRerpw==", + "version": "7.18.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.18.0.tgz", + "integrity": "sha512-vwKpxdHnlM5tIrRt/eA0bzfbi7gUBLN08vLu38np1nZevlPySRe6yvuATJB5F/WPJ+ur4OXwpVYq9+BsxqAQuQ==", "dev": true, "requires": { "@babel/helper-hoist-variables": "^7.16.7", - "@babel/helper-module-transforms": "^7.17.12", + "@babel/helper-module-transforms": "^7.18.0", "@babel/helper-plugin-utils": "^7.17.12", "@babel/helper-validator-identifier": "^7.16.7", "babel-plugin-dynamic-import-node": "^2.3.3" } }, "@babel/plugin-transform-modules-umd": { - "version": "7.17.12", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.17.12.tgz", - "integrity": "sha512-BnsPkrUHsjzZGpnrmJeDFkOMMljWFHPjDc9xDcz71/C+ybF3lfC3V4m3dwXPLZrE5b3bgd4V+3/Pj+3620d7IA==", + "version": "7.18.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.18.0.tgz", + "integrity": "sha512-d/zZ8I3BWli1tmROLxXLc9A6YXvGK8egMxHp+E/rRwMh1Kip0AP77VwZae3snEJ33iiWwvNv2+UIIhfalqhzZA==", "dev": true, "requires": { - "@babel/helper-module-transforms": "^7.17.12", + "@babel/helper-module-transforms": "^7.18.0", "@babel/helper-plugin-utils": "^7.17.12" } }, @@ -13421,11 +13426,12 @@ } }, "@babel/plugin-transform-regenerator": { - "version": "7.17.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.17.9.tgz", - "integrity": "sha512-Lc2TfbxR1HOyn/c6b4Y/b6NHoTb67n/IoWLxTu4kC7h4KQnWlhCq2S8Tx0t2SVvv5Uu87Hs+6JEJ5kt2tYGylQ==", + "version": "7.18.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.18.0.tgz", + "integrity": "sha512-C8YdRw9uzx25HSIzwA7EM7YP0FhCe5wNvJbZzjVNHHPGVcDJ3Aie+qGYYdS1oVQgn+B3eAIJbWFLrJ4Jipv7nw==", "dev": true, "requires": { + "@babel/helper-plugin-utils": "^7.17.12", "regenerator-transform": "^0.15.0" } }, @@ -13649,30 +13655,30 @@ } }, "@babel/traverse": { - "version": "7.17.12", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.17.12.tgz", - "integrity": "sha512-zULPs+TbCvOkIFd4FrG53xrpxvCBwLIgo6tO0tJorY7YV2IWFxUfS/lXDJbGgfyYt9ery/Gxj2niwttNnB0gIw==", + "version": "7.18.0", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.18.0.tgz", + "integrity": "sha512-oNOO4vaoIQoGjDQ84LgtF/IAlxlyqL4TUuoQ7xLkQETFaHkY1F7yazhB4Kt3VcZGL0ZF/jhrEpnXqUb0M7V3sw==", "dev": true, "requires": { "@babel/code-frame": "^7.16.7", - "@babel/generator": "^7.17.12", + "@babel/generator": "^7.18.0", "@babel/helper-environment-visitor": "^7.16.7", "@babel/helper-function-name": "^7.17.9", "@babel/helper-hoist-variables": "^7.16.7", "@babel/helper-split-export-declaration": "^7.16.7", - "@babel/parser": "^7.17.12", - "@babel/types": "^7.17.12", + "@babel/parser": "^7.18.0", + "@babel/types": "^7.18.0", "debug": "^4.1.0", "globals": "^11.1.0" }, "dependencies": { "@babel/generator": { - "version": "7.17.12", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.17.12.tgz", - "integrity": "sha512-V49KtZiiiLjH/CnIW6OjJdrenrGoyh6AmKQ3k2AZFKozC1h846Q4NYlZ5nqAigPDUXfGzC88+LOUuG8yKd2kCw==", + "version": "7.18.0", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.18.0.tgz", + "integrity": "sha512-81YO9gGx6voPXlvYdZBliFXAZU8vZ9AZ6z+CjlmcnaeOcYSFbMTpdeDUO9xD9dh/68Vq03I8ZspfUTPfitcDHg==", "dev": true, "requires": { - "@babel/types": "^7.17.12", + "@babel/types": "^7.18.0", "@jridgewell/gen-mapping": "^0.3.0", "jsesc": "^2.5.1" } @@ -13691,9 +13697,9 @@ } }, "@babel/types": { - "version": "7.17.12", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.17.12.tgz", - "integrity": "sha512-rH8i29wcZ6x9xjzI5ILHL/yZkbQnCERdHlogKuIb4PUr7do4iT8DPekrTbBLWTnRQm6U0GYABbTMSzijmEqlAg==", + "version": "7.18.0", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.18.0.tgz", + "integrity": "sha512-vhAmLPAiC8j9K2GnsnLPCIH5wCrPpYIVBCWRBFDCB7Y/BXLqi/O+1RSTTM2bsmg6U/551+FCf9PNPxjABmxHTw==", "dev": true, "requires": { "@babel/helper-validator-identifier": "^7.16.7", @@ -13738,15 +13744,15 @@ "dev": true }, "@eslint/eslintrc": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-1.2.3.tgz", - "integrity": "sha512-uGo44hIwoLGNyduRpjdEpovcbMdd+Nv7amtmJxnKmI8xj6yd5LncmSwDa5NgX/41lIFJtkjD6YdVfgEzPfJ5UA==", + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-1.3.0.tgz", + "integrity": "sha512-UWW0TMTmk2d7hLcWD1/e2g5HDM/HQ3csaLSqXCfqwh4uNDuNqlaKWXmEsL4Cs41Z0KnILNvwbHAah3C2yt06kw==", "dev": true, "requires": { "ajv": "^6.12.4", "debug": "^4.3.2", "espree": "^9.3.2", - "globals": "^13.9.0", + "globals": "^13.15.0", "ignore": "^5.2.0", "import-fresh": "^3.2.1", "js-yaml": "^4.1.0", @@ -16135,12 +16141,12 @@ "dev": true }, "eslint": { - "version": "8.15.0", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.15.0.tgz", - "integrity": "sha512-GG5USZ1jhCu8HJkzGgeK8/+RGnHaNYZGrGDzUtigK3BsGESW/rs2az23XqE0WVwDxy1VRvvjSSGu5nB0Bu+6SA==", + "version": "8.16.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.16.0.tgz", + "integrity": "sha512-MBndsoXY/PeVTDJeWsYj7kLZ5hQpJOfMYLsF6LicLHQWbRDG19lK5jOix4DPl8yY4SUFcE3txy86OzFLWT+yoA==", "dev": true, "requires": { - "@eslint/eslintrc": "^1.2.3", + "@eslint/eslintrc": "^1.3.0", "@humanwhocodes/config-array": "^0.9.2", "ajv": "^6.10.0", "chalk": "^4.0.0", @@ -16158,7 +16164,7 @@ "file-entry-cache": "^6.0.1", "functional-red-black-tree": "^1.0.1", "glob-parent": "^6.0.1", - "globals": "^13.6.0", + "globals": "^13.15.0", "ignore": "^5.2.0", "import-fresh": "^3.0.0", "imurmurhash": "^0.1.4", @@ -18353,9 +18359,9 @@ "dev": true }, "make-fetch-happen": { - "version": "10.1.4", - "resolved": "https://registry.npmjs.org/make-fetch-happen/-/make-fetch-happen-10.1.4.tgz", - "integrity": "sha512-hU1w68PqfH7FdMgjbiziJoACY0edlbIZ0CyKnpcEruVdCjsUrN+qoenOCIayNqVBK7toSWwbDxvQlrhH0gjRdg==", + "version": "10.1.5", + "resolved": "https://registry.npmjs.org/make-fetch-happen/-/make-fetch-happen-10.1.5.tgz", + "integrity": "sha512-mucOj2H0Jn/ax7H9K9T1bf0p1nn/mBFa551Os7ed9xRfLEx20aZhZeLslmRYfAaAqXZUGipcs+m5KOKvOH0XKA==", "dev": true, "requires": { "agentkeepalive": "^4.2.1", @@ -18400,9 +18406,9 @@ } }, "ssri": { - "version": "9.0.0", - "resolved": "https://registry.npmjs.org/ssri/-/ssri-9.0.0.tgz", - "integrity": "sha512-Y1Z6J8UYnexKFN1R/hxUaYoY2LVdKEzziPmVAFKiKX8fiwvCJTVzn/xYE9TEWod5OVyNfIHHuVfIEuBClL/uJQ==", + "version": "9.0.1", + "resolved": "https://registry.npmjs.org/ssri/-/ssri-9.0.1.tgz", + "integrity": "sha512-o57Wcn66jMQvfHG1FlYbWeZWW/dHZhJXjpIcTfXldXEk5nz5lStPo3mK0OJQfGR3RbZUlbISexbljkJzuEj/8Q==", "dev": true, "requires": { "minipass": "^3.1.1" @@ -18914,9 +18920,9 @@ } }, "postcss-color-functional-notation": { - "version": "4.2.2", - "resolved": "https://registry.npmjs.org/postcss-color-functional-notation/-/postcss-color-functional-notation-4.2.2.tgz", - "integrity": "sha512-DXVtwUhIk4f49KK5EGuEdgx4Gnyj6+t2jBSEmxvpIK9QI40tWrpS2Pua8Q7iIZWBrki2QOaeUdEaLPPa91K0RQ==", + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/postcss-color-functional-notation/-/postcss-color-functional-notation-4.2.3.tgz", + "integrity": "sha512-5fbr6FzFzjwHXKsVnkmEYrJYG8VNNzvD1tAXaPPWR97S6rhKI5uh2yOfV5TAzhDkZoq4h+chxEplFDc8GeyFtw==", "dev": true, "requires": { "postcss-value-parser": "^4.2.0" @@ -19124,9 +19130,9 @@ } }, "postcss-nesting": { - "version": "10.1.6", - "resolved": "https://registry.npmjs.org/postcss-nesting/-/postcss-nesting-10.1.6.tgz", - "integrity": "sha512-8C0X0pOOShlgqYkCzB4wlWLyulos+GXFpw7r2+x7g+ROQ1RwN8MlN2NCcpNQScNBPfbjxbjwY8e25raTcEXqmg==", + "version": "10.1.7", + "resolved": "https://registry.npmjs.org/postcss-nesting/-/postcss-nesting-10.1.7.tgz", + "integrity": "sha512-Btho5XzDTpl117SmB3tvUHP8txg5n7Ayv7vQ5m4b1zXkfs1Y52C67uZjZ746h7QvOJ+rLRg50OlhhjFW+IQY6A==", "dev": true, "requires": { "@csstools/selector-specificity": "1.0.0", diff --git a/client/package.json b/client/package.json index 4285ad4..a9c4411 100644 --- a/client/package.json +++ b/client/package.json @@ -38,5 +38,5 @@ "build": "ng build --base-href ./ --configuration production", "start": "ng serve" }, - "version": "6.3.1" + "version": "6.3.2" } diff --git a/client/src/app/components/rdio-scanner/admin/admin.service.ts b/client/src/app/components/rdio-scanner/admin/admin.service.ts index 5534272..6f18321 100644 --- a/client/src/app/components/rdio-scanner/admin/admin.service.ts +++ b/client/src/app/components/rdio-scanner/admin/admin.service.ts @@ -717,7 +717,7 @@ export class RdioScannerAdminService implements OnDestroy { return null; } - const masks = ['#DATE', '#GROUP', '#HZ', '#KHZ', '#MHZ', '#SYS', '#SYSLBL', '#TAG', '#TG', '#TGAFS', '#TGHZ', '#TGKHZ', '#TGMHZ', '#TIME', '#UNIT', '#ZTIME']; + const masks = ['#DATE', '#GROUP', '#HZ', '#KHZ', '#MHZ', '#SYS', '#SYSLBL', '#TAG', '#TG', '#TGAFS', '#TGHZ', '#TGKHZ', '#TGLBL', '#TGMHZ', '#TIME', '#UNIT', '#ZTIME']; const metas = control.value.match(/(#[A-Z]+)/g) || []; diff --git a/client/src/app/components/rdio-scanner/admin/config/dir-watch/dir-watch.component.html b/client/src/app/components/rdio-scanner/admin/config/dir-watch/dir-watch.component.html index 47f1796..53596c8 100644 --- a/client/src/app/components/rdio-scanner/admin/config/dir-watch/dir-watch.component.html +++ b/client/src/app/components/rdio-scanner/admin/config/dir-watch/dir-watch.component.html @@ -132,6 +132,7 @@
  • #TGAFS - extract the talkgroup id like 11-061 in AFS (agency-fleet-subfleet) format.
  • #TGHZ - extract the frequency in hertz like 119100000 and set the talkgroup id to 119100.
  • #TGKHZ - extract the frequency in kilohertz like 119100.000 or 119100 and set the talkgroup id to 119100.
  • +
  • #TGLBL - extract the talkgroup label.
  • #TGMHZ - extract the frequency in megahertz like 119.100000 or 119 and set the talkgroup id to 119100.
  • #TIME - extract the local time like 0853439 (HHMMSS), 08-34-39 (HH-MM-SS) or 08:34:39 (HH:MM:SS).
  • #UNIT - extract the unit id like 4424001.
  • diff --git a/client/src/app/components/rdio-scanner/main/main.component.ts b/client/src/app/components/rdio-scanner/main/main.component.ts index c97bad2..8b8bfc6 100644 --- a/client/src/app/components/rdio-scanner/main/main.component.ts +++ b/client/src/app/components/rdio-scanner/main/main.component.ts @@ -52,7 +52,7 @@ export class RdioScannerMainComponent implements OnDestroy, OnInit { call: RdioScannerCall | undefined; callError = '0'; callFrequency: string = this.formatFrequency(0); - callHistory: RdioScannerCall[] = new Array(5); + callHistory: RdioScannerCall[] | undefined; callPrevious: RdioScannerCall | undefined; callProgress = new Date(0, 0, 0, 0, 0, 0); callQueue = 0; @@ -125,7 +125,9 @@ export class RdioScannerMainComponent implements OnDestroy, OnInit { private rdioScannerService: RdioScannerService, private ngChangeDetectorRef: ChangeDetectorRef, private ngFormBuilder: FormBuilder, - ) { } + ) { + this.callHistory = this.rdioScannerService.getHistory(); + } authenticate(password = this.authForm.value.password): void { this.authForm.disable(); @@ -356,7 +358,7 @@ export class RdioScannerMainComponent implements OnDestroy, OnInit { const password = this.authForm.get('password')?.value; if (password) { - window?.localStorage?.setItem(LOCAL_STORAGE_KEY, btoa(password)); + window?.localStorage?.setItem(LOCAL_STORAGE_KEY, window.btoa(password)); this.authForm.reset(); } @@ -374,6 +376,10 @@ export class RdioScannerMainComponent implements OnDestroy, OnInit { this.authForm.get('password')?.setErrors({ expired: true }); } + if ('history' in event) { + this.callHistory = event.history || []; + } + if ('holdSys' in event) { this.holdSys = event.holdSys || false; } @@ -524,16 +530,6 @@ export class RdioScannerMainComponent implements OnDestroy, OnInit { this.callUnit = typeof this.call.source === 'number' ? `${this.call.source}` : ''; } - - if ( - this.callPrevious && - this.callPrevious.id !== this.call.id && - !this.callHistory.find((call: RdioScannerCall) => call?.id === this.callPrevious?.id) - ) { - this.callHistory.pop(); - - this.callHistory.unshift(this.callPrevious); - } } const call = this.call || this.callPrevious; diff --git a/client/src/app/components/rdio-scanner/rdio-scanner.service.ts b/client/src/app/components/rdio-scanner/rdio-scanner.service.ts index c72d265..1c10e06 100644 --- a/client/src/app/components/rdio-scanner/rdio-scanner.service.ts +++ b/client/src/app/components/rdio-scanner/rdio-scanner.service.ts @@ -73,7 +73,7 @@ export class RdioScannerService implements OnDestroy { private beepContext: AudioContext | undefined; private call: RdioScannerCall | undefined; - private callPrevious: RdioScannerCall | undefined; + private callHistory: RdioScannerCall[] = new Array(5); private callQueue: RdioScannerCall[] = []; private categories: RdioScannerCategory[] = []; @@ -98,6 +98,9 @@ export class RdioScannerService implements OnDestroy { private playbackPending: number | undefined; private playbackRefreshing = false; + private replayDelay: Subscription | undefined; + private replayOffset = 0; + private skipDelay: Subscription | undefined; private websocket: WebSocket | undefined; @@ -114,7 +117,7 @@ export class RdioScannerService implements OnDestroy { } authenticate(password: string): void { - this.sendtoWebsocket(WebsocketCommand.Pin, btoa(password)); + this.sendtoWebsocket(WebsocketCommand.Pin, window.btoa(password)); } avoid(options: RdioScannerAvoidOptions = {}): void { @@ -153,7 +156,7 @@ export class RdioScannerService implements OnDestroy { }); } else { - const call = this.call || this.callPrevious; + const call = this.call || this.callHistory[0]; if (call) { const sys = call.system; @@ -222,8 +225,12 @@ export class RdioScannerService implements OnDestroy { }); } + getHistory(): RdioScannerCall[] { + return this.callHistory; + } + holdSystem(options?: { resubscribe?: boolean }): void { - const call = this.call || this.callPrevious; + const call = this.call || this.callHistory[0]; if (call && this.livefeedMap) { if (this.livefeedMapPriorToHoldSystem) { @@ -277,7 +284,7 @@ export class RdioScannerService implements OnDestroy { } holdTalkgroup(options?: { resubscribe?: boolean }): void { - const call = this.call || this.callPrevious; + const call = this.call || this.callHistory[0]; if (call && this.livefeedMap) { if (this.livefeedMapPriorToHoldTalkgroup) { @@ -501,7 +508,17 @@ export class RdioScannerService implements OnDestroy { } replay(): void { - this.play(this.call || this.callPrevious); + if (this.replayDelay instanceof Subscription) { + this.replayDelay.unsubscribe(); + this.replayOffset = Math.min(this.callHistory.length - 1, this.replayOffset + 1); + } + + this.replayDelay = timer(750).subscribe(() => { + this.replayDelay = undefined; + this.replayOffset = 0; + }); + + this.play(this.replayOffset > 0 ? this.callHistory[this.replayOffset] : this.call || this.callHistory[0]); } searchCalls(options: RdioScannerSearchOptions): void { @@ -556,7 +573,11 @@ export class RdioScannerService implements OnDestroy { } if (this.call) { - this.callPrevious = this.call; + if (!this.callHistory.find((call: RdioScannerCall) => call?.id === this.call?.id)) { + this.callHistory.pop(); + this.callHistory.unshift(this.call); + this.event.emit({ history: this.callHistory }); + } this.call = undefined; } @@ -750,7 +771,7 @@ export class RdioScannerService implements OnDestroy { this.sendtoWebsocket(WebsocketCommand.Call, `${id}`, flags); } - private getPlaybackQueueCount(id = this.call?.id || this.callPrevious?.id): number { + private getPlaybackQueueCount(id = this.call?.id || this.callHistory[0]?.id): number { let queueCount = 0; if (id && this.playbackList) { @@ -901,7 +922,7 @@ export class RdioScannerService implements OnDestroy { return; } - const index = this.playbackList.results.findIndex((call) => call.id === this.callPrevious?.id); + const index = this.playbackList.results.findIndex((call) => call.id === this.callHistory[0]?.id); if (this.playbackList.options.sort === -1) { if (index === -1) { diff --git a/client/src/app/components/rdio-scanner/rdio-scanner.ts b/client/src/app/components/rdio-scanner/rdio-scanner.ts index bc43fda..5be0240 100644 --- a/client/src/app/components/rdio-scanner/rdio-scanner.ts +++ b/client/src/app/components/rdio-scanner/rdio-scanner.ts @@ -105,6 +105,7 @@ export interface RdioScannerEvent { call?: RdioScannerCall; config?: RdioScannerConfig; expired?: boolean; + history?: RdioScannerCall[]; holdSys?: boolean; holdTg?: boolean; linked?: boolean; diff --git a/docs/platforms/darwin.md b/docs/platforms/darwin.md index 1c80db9..15bb20b 100644 --- a/docs/platforms/darwin.md +++ b/docs/platforms/darwin.md @@ -42,8 +42,8 @@ ALWAYS DOWNLOAD THE LATEST VERSION OF [RDIO SCANNER](https://github.com/chuot/rd rdio@macos ~ % mkdir rdio-scanner rdio@macos ~ % cd rdio-scanner rdio@macos rdio-scanner % unzip \ - > ~/Downloads/rdio-scanner-darwin-arm64-v6.3.1.zip - Archive: /Users/rdio/Downloads/rdio-scanner-darwin-arm64-v6.3.1.zip + > ~/Downloads/rdio-scanner-darwin-arm64-v6.3.2.zip + Archive: /Users/rdio/Downloads/rdio-scanner-darwin-arm64-v6.3.2.zip inflating: rdio-scanner inflating: rdio-scanner.pdf @@ -51,11 +51,11 @@ ALWAYS DOWNLOAD THE LATEST VERSION OF [RDIO SCANNER](https://github.com/chuot/rd rdio@macos rdio-scanner % ./rdio-scanner - Rdio Scanner v6.3.1 + Rdio Scanner v6.3.2 ---------------------------------- - 2022/05/19 08:38:06 server started - 2022/05/19 08:38:06 main interface at http://macos.local:3000 - 2022/05/19 08:38:06 admin interface at http://macos.local:3000/admin + 2022/05/21 08:38:06 server started + 2022/05/21 08:38:06 main interface at http://macos.local:3000 + 2022/05/21 08:38:06 admin interface at http://macos.local:3000/admin 4. Access the administrative dashboard to finalize the configuration. @@ -77,11 +77,11 @@ Here we want our [Rdio Scanner](https://guthub.com/chuot/rdio-scanner) instance rdio@macos rdio-scanner % ./rdio-scanner --listen :80 - Rdio Scanner v6.3.1 + Rdio Scanner v6.3.2 ---------------------------------- - 2022/05/19 08:48:03 server started - 2022/05/19 08:48:03 main interface at http://macos.local - 2022/05/19 08:48:03 admin interface at http://macos.local/admin + 2022/05/21 08:48:03 server started + 2022/05/21 08:48:03 main interface at http://macos.local + 2022/05/21 08:48:03 admin interface at http://macos.local/admin ## Listening on a SSL port @@ -95,12 +95,12 @@ You can use your own SSL certificates that match your domain name with `-ssl_cer > -ssl_key_file mykey.key \ > -ssl_listen :443 - Rdio Scanner v6.3.1 + Rdio Scanner v6.3.2 ---------------------------------- - 2022/05/19 08:50:58 server started - 2022/05/19 08:50:58 main interface at http://macos.local - 2022/05/19 08:50:58 main interface at https://macos.local - 2022/05/19 08:50:58 admin interface at https://macos.local/admin + 2022/05/21 08:50:58 server started + 2022/05/21 08:50:58 main interface at http://macos.local + 2022/05/21 08:50:58 main interface at https://macos.local + 2022/05/21 08:50:58 admin interface at https://macos.local/admin If you don't want to worry about SSL certificates, you can use the built-in Let's Encrypt auto-cert feature. This requires that you have both port 80 (HTTP) and port 443 (HTTPS) open to the world. Also, your domain name should point to your IP address where [Rdio Scanner](https://github.com/chuot/rdio-scanner/) is running. The advantage of this approach is that everything is done automatically, no certificate request, no certificate renewal. @@ -118,7 +118,7 @@ You don't want to have to type everytime a long list of arguments. No problem, y > -ssl_auto_cert mydomain.com \ > -ssl_listen :443 \ > -config_save - 2022/05/19 08:52:24 rdio-scanner.ini file created + 2022/05/21 08:52:24 rdio-scanner.ini file created All of your parameters passed as arguments to [Rdio Scanner](https://github.com/chuot/rdio-scanner) have been saved to an INI file which has the same arguments/values list. @@ -132,12 +132,12 @@ Then simply run [Rdio Scanner](https://github.com/chuot/rdio-scanner) without an rdio@macos rdio-scanner % ./rdio-scanner - Rdio Scanner v6.3.1 + Rdio Scanner v6.3.2 ---------------------------------- - 2022/05/19 08:54:08 server started - 2022/05/19 08:54:08 main interface at http://macos.local - 2022/05/19 08:54:08 main interface at https://macos.local - 2022/05/19 08:54:08 admin interface at https://macos.local/admin + 2022/05/21 08:54:08 server started + 2022/05/21 08:54:08 main interface at http://macos.local + 2022/05/21 08:54:08 main interface at https://macos.local + 2022/05/21 08:54:08 admin interface at https://macos.local/admin ## Install Rdio Scanner as a service diff --git a/docs/platforms/freebsd.md b/docs/platforms/freebsd.md index 3f4d0bf..87953d6 100644 --- a/docs/platforms/freebsd.md +++ b/docs/platforms/freebsd.md @@ -42,8 +42,8 @@ ALWAYS DOWNLOAD THE LATEST VERSION OF [RDIO SCANNER](https://github.com/chuot/rd rdio@pc-freebsd:~ $ mkdir rdio-scanner rdio@pc-freebsd:~ $ cd rdio-scanner rdio@pc-freebsd:~/rdio-scanner $ unzip \ - > ~/rdio-scanner-freebsd-amd64-v6.3.1.zip - Archive: ../rdio-scanner-freebsd-amd64-v6.3.1.zip + > ~/rdio-scanner-freebsd-amd64-v6.3.2.zip + Archive: ../rdio-scanner-freebsd-amd64-v6.3.2.zip extracting: rdio-scanner extracting: rdio-scanner.pdf @@ -51,11 +51,11 @@ ALWAYS DOWNLOAD THE LATEST VERSION OF [RDIO SCANNER](https://github.com/chuot/rd rdio@pc-freebsd:~/rdio-scanner $ ./rdio-scanner - Rdio Scanner v6.3.1 + Rdio Scanner v6.3.2 ---------------------------------- - 2022/05/19 08:16:36 server started - 2022/05/19 08:16:36 main interface at http://pc-freebsd:3000 - 2022/05/19 08:16:36 admin interface at http://pc-freebsd:3000/admin + 2022/05/21 08:16:36 server started + 2022/05/21 08:16:36 main interface at http://pc-freebsd:3000 + 2022/05/21 08:16:36 admin interface at http://pc-freebsd:3000/admin 4. Access the administrative dashboard to finalize the configuration. @@ -81,11 +81,11 @@ Here we want our [Rdio Scanner](https://guthub.com/chuot/rdio-scanner) instance Password: root@pc-freebsd:/home/rdio/rdio-scanner # ./rdio-scanner -listen :80 - Rdio Scanner v6.3.1 + Rdio Scanner v6.3.2 ---------------------------------- - 2022/05/19 08:19:38 server started - 2022/05/19 08:19:38 main interface at http://pc-freebsd - 2022/05/19 08:19:38 admin interface at http://pc-freebsd/admin + 2022/05/21 08:19:38 server started + 2022/05/21 08:19:38 main interface at http://pc-freebsd + 2022/05/21 08:19:38 admin interface at http://pc-freebsd/admin ## Listening on a SSL port @@ -101,12 +101,12 @@ You can use your own SSL certificates that match your domain name with `-ssl_cer > -ssl_key_file mykey.key \ > -ssl_listen :443 - Rdio Scanner v6.3.1 + Rdio Scanner v6.3.2 ---------------------------------- - 2022/05/19 10:34:29 server started - 2022/05/19 10:34:29 main interface at http://pc-freebsd - 2022/05/19 10:34:29 main interface at https://pc-freebsd - 2022/05/19 10:34:29 admin interface at https://pc-freebsd/admin + 2022/05/21 10:34:29 server started + 2022/05/21 10:34:29 main interface at http://pc-freebsd + 2022/05/21 10:34:29 main interface at https://pc-freebsd + 2022/05/21 10:34:29 admin interface at https://pc-freebsd/admin If you don't want to worry about SSL certificates, you can use the built-in Let's Encrypt auto-cert feature. This requires that you have both port 80 (HTTP) and port 443 (HTTPS) open to the world. Also, your domain name should point to your IP address where [Rdio Scanner](https://github.com/chuot/rdio-scanner/) is running. The advantage of this approach is that everything is done automatically, no certificate request, no certificate renewal. @@ -126,7 +126,7 @@ You don't want to have to type everytime a long list of arguments. No problem, y > -ssl_auto_cert mydomain.com \ > -ssl_listen :443 \ > -config_save - 2022/05/19 10:37:00 rdio-scanner.ini file created + 2022/05/21 10:37:00 rdio-scanner.ini file created All of your parameters passed as arguments to [Rdio Scanner](https://github.com/chuot/rdio-scanner) have been saved to an INI file which has the same arguments/values list. @@ -142,12 +142,12 @@ Then simply run [Rdio Scanner](https://github.com/chuot/rdio-scanner) without an Password: root@pc-freebsd:/home/rdio/rdio-scanner # ./rdio-scanner - Rdio Scanner v6.3.1 + Rdio Scanner v6.3.2 ---------------------------------- - 2022/05/19 10:38:28 server started - 2022/05/19 10:38:29 main interface at http://pc-freebsd - 2022/05/19 10:38:29 main interface at https://pc-freebsd - 2022/05/19 10:38:29 admin interface at https://pc-freebsd/admin + 2022/05/21 10:38:28 server started + 2022/05/21 10:38:29 main interface at http://pc-freebsd + 2022/05/21 10:38:29 main interface at https://pc-freebsd + 2022/05/21 10:38:29 admin interface at https://pc-freebsd/admin ## Install Rdio Scanner as a service diff --git a/docs/platforms/linux.md b/docs/platforms/linux.md index 54f7ea7..e9b0d08 100644 --- a/docs/platforms/linux.md +++ b/docs/platforms/linux.md @@ -42,8 +42,8 @@ ALWAYS DOWNLOAD THE LATEST VERSION OF [RDIO SCANNER](https://github.com/chuot/rd [rdio@pc-linux ~]$ mkdir rdio-scanner [rdio@pc-linux ~]$ cd rdio-scanner [rdio@pc-linux rdio-scanner]$ unzip \ - > ~/Downloads/rdio-scanner-linux-amd64-v6.3.1.zip - Archive: /home/rdio/Downloads/rdio-scanner-linux-amd64-v6.3.1.zip + > ~/Downloads/rdio-scanner-linux-amd64-v6.3.2.zip + Archive: /home/rdio/Downloads/rdio-scanner-linux-amd64-v6.3.2.zip inflating: rdio-scanner inflating: rdio-scanner.pdf @@ -51,11 +51,11 @@ ALWAYS DOWNLOAD THE LATEST VERSION OF [RDIO SCANNER](https://github.com/chuot/rd [rdio@pc-linux rdio-scanner]$ ./rdio-scanner - Rdio Scanner v6.3.1 + Rdio Scanner v6.3.2 ---------------------------------- - 2022/05/19 09:11:48 server started - 2022/05/19 09:11:48 main interface at http://pc-linux:3000 - 2022/05/19 09:11:48 admin interface at http://pc-linux:3000/admin + 2022/05/21 09:11:48 server started + 2022/05/21 09:11:48 main interface at http://pc-linux:3000 + 2022/05/21 09:11:48 admin interface at http://pc-linux:3000/admin 4. Access the administrative dashboard to finalize the configuration. @@ -78,11 +78,11 @@ Here we want our [Rdio Scanner](https://guthub.com/chuot/rdio-scanner) instance [rdio@pc-linux rdio-scanner]$ sudo ./rdio-scanner -listen :80 [sudo] password for rdio: - Rdio Scanner v6.3.1 + Rdio Scanner v6.3.2 ---------------------------------- - 2022/05/19 09:14:00 server started - 2022/05/19 09:14:00 main interface at http://pc-linux - 2022/05/19 09:14:00 admin interface at http://pc-linux/admin + 2022/05/21 09:14:00 server started + 2022/05/21 09:14:00 main interface at http://pc-linux + 2022/05/21 09:14:00 admin interface at http://pc-linux/admin ## Listening on a SSL port @@ -97,12 +97,12 @@ You can use your own SSL certificates that match your domain name with `-ssl_cer > -ssl_listen :443 [sudo] password for rdio: - Rdio Scanner v6.3.1 + Rdio Scanner v6.3.2 ---------------------------------- - 2022/05/19 09:16:47 server started - 2022/05/19 09:16:47 main interface at http://pc-linux - 2022/05/19 09:16:47 main interface at https://pc-linux - 2022/05/19 09:16:47 admin interface at https://pc-linux/admin + 2022/05/21 09:16:47 server started + 2022/05/21 09:16:47 main interface at http://pc-linux + 2022/05/21 09:16:47 main interface at https://pc-linux + 2022/05/21 09:16:47 admin interface at https://pc-linux/admin If you don't want to worry about SSL certificates, you can use the built-in Let's Encrypt auto-cert feature. This requires that you have both port 80 (HTTP) and port 443 (HTTPS) open to the world. Also, your domain name should point to your IP address where [Rdio Scanner](https://github.com/chuot/rdio-scanner/) is running. The advantage of this approach is that everything is done automatically, no certificate request, no certificate renewal. @@ -120,7 +120,7 @@ You don't want to have to type everytime a long list of arguments. No problem, y > -ssl_auto_cert mydomain.com \ > -ssl_listen :443 \ > -config_save - 2022/05/19 09:19:29 rdio-scanner.ini file created + 2022/05/21 09:19:29 rdio-scanner.ini file created All of your parameters passed as arguments to [Rdio Scanner](https://github.com/chuot/rdio-scanner) have been saved to an INI file which has the same arguments/values list. @@ -135,12 +135,12 @@ Then simply run [Rdio Scanner](https://github.com/chuot/rdio-scanner) without an [rdio@pc-linux rdio-scanner]$ sudo ./rdio-scanner [sudo] Mot de passe de rdio : - Rdio Scanner v6.3.1 + Rdio Scanner v6.3.2 ---------------------------------- - 2022/05/19 09:20:40 server started - 2022/05/19 09:20:40 main interface at http://pc-linux - 2022/05/19 09:20:40 main interface at https://pc-linux - 2022/05/19 09:20:40 admin interface at https://pc-linux/admin + 2022/05/21 09:20:40 server started + 2022/05/21 09:20:40 main interface at http://pc-linux + 2022/05/21 09:20:40 main interface at https://pc-linux + 2022/05/21 09:20:40 admin interface at https://pc-linux/admin ## Install Rdio Scanner as a service diff --git a/docs/platforms/windows.md b/docs/platforms/windows.md index 9560f5c..1247bf1 100644 --- a/docs/platforms/windows.md +++ b/docs/platforms/windows.md @@ -44,7 +44,7 @@ ALWAYS DOWNLOAD THE LATEST VERSION OF [RDIO SCANNER](https://github.com/chuot/rd C:\Users\rdio> cd rdio-scanner C:\Users\rdio\rdio-scanner> tar -xvf ^ - ..\downloads\rdio-scanner-windows-amd64-v6.3.1.zip + ..\downloads\rdio-scanner-windows-amd64-v6.3.2.zip x rdio-scanner.exe x rdio-scanner.pdf @@ -52,11 +52,11 @@ ALWAYS DOWNLOAD THE LATEST VERSION OF [RDIO SCANNER](https://github.com/chuot/rd C:\Users\rdio\rdio-scanner>rdio-scanner - Rdio Scanner v6.3.1 + Rdio Scanner v6.3.2 ---------------------------------- - 2022/05/19 13:48:48 server started - 2022/05/19 13:48:48 main interface at http://pc-windows:3000 - 2022/05/19 13:48:48 admin interface at http://pc-windows:3000/admin + 2022/05/21 13:48:48 server started + 2022/05/21 13:48:48 main interface at http://pc-windows:3000 + 2022/05/21 13:48:48 admin interface at http://pc-windows:3000/admin 4. Access the administrative dashboard to finalize the configuration. @@ -78,11 +78,11 @@ Here we want our [Rdio Scanner](https://guthub.com/chuot/rdio-scanner) instance C:\Users\rdio\rdio-scanner>rdio-scanner -listen :80 - Rdio Scanner v6.3.1 + Rdio Scanner v6.3.2 ---------------------------------- - 2022/05/19 10:53:31 server started - 2022/05/19 10:53:31 main interface at http://pc-windows - 2022/05/19 10:53:31 admin interface at http://pc-windows/admin + 2022/05/21 10:53:31 server started + 2022/05/21 10:53:31 main interface at http://pc-windows + 2022/05/21 10:53:31 admin interface at http://pc-windows/admin ## Listening on a SSL port @@ -96,12 +96,12 @@ You can use your own SSL certificates that match your domain name with `-ssl_cer -ssl_key_file meykey.key ^ -ssl_listen :443 - Rdio Scanner v6.3.1 + Rdio Scanner v6.3.2 ---------------------------------- - 2022/05/19 11:05:43 server started - 2022/05/19 11:05:43 main interface at http://pc-windows - 2022/05/19 11:05:43 main interface at https://pc-windows - 2022/05/19 11:05:43 admin interface at https://pc-windows/admin + 2022/05/21 11:05:43 server started + 2022/05/21 11:05:43 main interface at http://pc-windows + 2022/05/21 11:05:43 main interface at https://pc-windows + 2022/05/21 11:05:43 admin interface at https://pc-windows/admin If you don't want to worry about SSL certificates, you can use the built-in Let's Encrypt auto-cert feature. This requires that you have both port 80 (HTTP) and port 443 (HTTPS) open to the world. Also, your domain name should point to your IP address where [Rdio Scanner](https://github.com/chuot/rdio-scanner/) is running. The advantage of this approach is that everything is done automatically, no certificate request, no certificate renewal. @@ -119,7 +119,7 @@ You don't want to have to type everytime a long list of arguments. No problem, y -ssl_auto_cert mydomain.com ^ -ssl_listen :443 ^ -config_save - 2022/05/19 11:08:28 rdio-scanner.ini file created + 2022/05/21 11:08:28 rdio-scanner.ini file created All of your parameters passed as arguments to [Rdio Scanner](https://github.com/chuot/rdio-scanner) have been saved to an INI file which has the same arguments/values list. @@ -133,12 +133,12 @@ Then simply run [Rdio Scanner](https://github.com/chuot/rdio-scanner) without an C:\Users\rdio\rdio-scanner>rdio-scanner - Rdio Scanner v6.3.1 + Rdio Scanner v6.3.2 ---------------------------------- - 2022/05/19 11:11:28 server started - 2022/05/19 11:11:28 main interface at http://pc-windows - 2022/05/19 11:11:28 main interface at https://pc-windows - 2022/05/19 11:11:28 admin interface at https://pc-windows/admin + 2022/05/21 11:11:28 server started + 2022/05/21 11:11:28 main interface at http://pc-windows + 2022/05/21 11:11:28 main interface at https://pc-windows + 2022/05/21 11:11:28 admin interface at https://pc-windows/admin \pagebreak{} diff --git a/server/client.go b/server/client.go index 178cd80..068f306 100644 --- a/server/client.go +++ b/server/client.go @@ -178,85 +178,94 @@ func (client *Client) SendListenersCount(count int) { } type Clients struct { - Map map[*Client]bool - mutex sync.Mutex + Map sync.Map } func NewClients() *Clients { - return &Clients{ - Map: make(map[*Client]bool), - mutex: sync.Mutex{}, - } + return &Clients{Map: sync.Map{}} } func (clients *Clients) AccessCount(client *Client) int { - clients.mutex.Lock() - defer clients.mutex.Unlock() - count := 0 - for c := range clients.Map { - if c.Access == client.Access { - count++ + clients.Map.Range(func(k interface{}, _ interface{}) bool { + switch c := k.(type) { + case *Client: + if c.Access == client.Access { + count++ + } } - } + return true + }) return count } func (clients *Clients) Add(client *Client) { - clients.mutex.Lock() - defer clients.mutex.Unlock() - - clients.Map[client] = true + clients.Map.Store(client, true) } func (clients *Clients) Count() int { - return len(clients.Map) + count := 0 + + clients.Map.Range(func(k, v interface{}) bool { + count++ + + return true + }) + + return count } func (clients *Clients) EmitCall(call *Call, restricted bool) { - clients.mutex.Lock() - defer clients.mutex.Unlock() - - for c := range clients.Map { - if (!restricted || c.Access.HasAccess(call)) && c.Livefeed.IsEnabled(call) { - c.Send <- &Message{Command: MessageCommandCall, Payload: call} + clients.Map.Range(func(k interface{}, _ interface{}) bool { + switch c := k.(type) { + case *Client: + if (!restricted || c.Access.HasAccess(call)) && c.Livefeed.IsEnabled(call) { + c.Send <- &Message{Command: MessageCommandCall, Payload: call} + } } - } + + return true + }) } func (clients *Clients) EmitConfig(groups *Groups, options *Options, systems *Systems, tags *Tags, restricted bool) { - clients.mutex.Lock() - defer clients.mutex.Unlock() + count := clients.Count() - for c := range clients.Map { - if restricted { - c.Send <- &Message{Command: MessageCommandPin} - } else { - c.SendConfig(groups, options, systems, tags) + clients.Map.Range(func(k interface{}, _ interface{}) bool { + switch c := k.(type) { + case *Client: + if restricted { + c.Send <- &Message{Command: MessageCommandPin} + } else { + c.SendConfig(groups, options, systems, tags) + } + + if options.ShowListenersCount { + c.SendListenersCount(count) + } } - if options.ShowListenersCount { - c.SendListenersCount(len(clients.Map)) - } - } + return true + }) } func (clients *Clients) EmitListenersCount() { - clients.mutex.Lock() - defer clients.mutex.Unlock() + count := clients.Count() - for c := range clients.Map { - c.SendListenersCount(len(clients.Map)) - } + clients.Map.Range(func(k interface{}, _ interface{}) bool { + switch c := k.(type) { + case *Client: + c.SendListenersCount(count) + } + + return true + }) } func (clients *Clients) Remove(client *Client) { - clients.mutex.Lock() - defer clients.mutex.Unlock() - - delete(clients.Map, client) + clients.Map.Delete(client) close(client.Send) } diff --git a/server/dirwatch.go b/server/dirwatch.go index c0a59d4..83fdf0f 100644 --- a/server/dirwatch.go +++ b/server/dirwatch.go @@ -326,16 +326,17 @@ func (dirwatch *Dirwatch) ingestTrunkRecorder(p string) error { func (dirwatch *Dirwatch) parseMask(call *Call) { var meta = [][]string{ {"date", "#DATE", `[\d-_]+`}, - {"group", "#GROUP", `[a-zA-Z0-9\ \.-]+`}, + {"group", "#GROUP", `[a-zA-Z0-9\.\ -]+`}, {"hz", "#HZ", `\d+`}, {"khz", "#KHZ", `[\d\.]+`}, {"mhz", "#MHZ", `[\d\.]+`}, - {"syslbl", "#SYSLBL", `[a-zA-Z0-9\ \.-]+`}, + {"syslbl", "#SYSLBL", `[a-zA-Z0-9,\.\ -]+`}, {"sys", "#SYS", `\d+`}, - {"tag", "#TAG", `[a-zA-Z0-9\ \.-]+`}, + {"tag", "#TAG", `[a-zA-Z0-9\.\ -]+`}, {"tgafs", "#TGAFS", `\d{2}-\d{3}`}, {"tghz", "#TGHZ", `\d+`}, {"tgkhz", "#TGKHZ", `[\d\.]+`}, + {"tglbl", "#TGLBL", `[a-zA-Z0-9,\.\ -]+`}, {"tgmhz", "#TGMHZ", `[\d\.]+`}, {"tg", "#TG", `\d+`}, {"time", "#TIME", `[\d-:]+`}, @@ -456,7 +457,7 @@ func (dirwatch *Dirwatch) parseMask(call *Call) { switch v := metaval["tag"].(type) { case string: if len(v) > 0 && v != "-" { - call.talkgroupGroup = v + call.talkgroupTag = v } } @@ -504,6 +505,13 @@ func (dirwatch *Dirwatch) parseMask(call *Call) { } } + switch v := metaval["tglbl"].(type) { + case string: + if len(v) > 0 { + call.talkgroupLabel = v + } + } + switch v := metaval["unit"].(type) { case string: if i, err := strconv.Atoi(v); err == nil { diff --git a/server/version.go b/server/version.go index 34c18f0..8bfd571 100644 --- a/server/version.go +++ b/server/version.go @@ -15,4 +15,4 @@ package main -const Version = "6.3.1" +const Version = "6.3.2"