Version 6.3.2

This commit is contained in:
Chrystian Huot 2022-05-21 09:46:06 -04:00
parent c57489f376
commit 6beae3869b
17 changed files with 407 additions and 359 deletions

View file

@ -13,6 +13,12 @@ _v6.3.1_
- Playback mode catch up to live, then swith to livefeed mode. - 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. - 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 ## Version 6.2
- New max clients options which is 200 by default. - New max clients options which is 200 by default.

View file

@ -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. 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-amd64-v6.3.2.zip
rdio-scanner-darwin-arm64-v6.3.1.zip rdio-scanner-darwin-arm64-v6.3.2.zip
rdio-scanner-freebsd-amd64-v6.3.1.zip rdio-scanner-freebsd-amd64-v6.3.2.zip
rdio-scanner-linux-386-v6.3.1.zip rdio-scanner-linux-386-v6.3.2.zip
rdio-scanner-linux-amd64-v6.3.1.zip rdio-scanner-linux-amd64-v6.3.2.zip
rdio-scanner-linux-arm64-v6.3.1.zip rdio-scanner-linux-arm64-v6.3.2.zip
rdio-scanner-linux-arm-v6.3.1.zip rdio-scanner-linux-arm-v6.3.2.zip
rdio-scanner-windows-amd64-v6.3.1.zip rdio-scanner-windows-amd64-v6.3.2.zip
**Happy Rdio scanning !** **Happy Rdio scanning !**

View file

@ -16,8 +16,8 @@
################################################################################ ################################################################################
app := rdio-scanner app := rdio-scanner
date := 2022/05/20 date := 2022/05/21
ver := 6.3.1 ver := 6.3.2
client := $(wildcard client/*.json client/*.ts) client := $(wildcard client/*.json client/*.ts)
server := $(wildcard server/*.go) server := $(wildcard server/*.go)

390
client/package-lock.json generated
View file

@ -1,12 +1,12 @@
{ {
"name": "rdio-scanner", "name": "rdio-scanner",
"version": "6.3.1", "version": "6.3.2",
"lockfileVersion": 2, "lockfileVersion": 2,
"requires": true, "requires": true,
"packages": { "packages": {
"": { "": {
"name": "rdio-scanner", "name": "rdio-scanner",
"version": "6.3.1", "version": "6.3.2",
"license": "LICENSE", "license": "LICENSE",
"dependencies": { "dependencies": {
"@angular/animations": "^13.3.9", "@angular/animations": "^13.3.9",
@ -477,21 +477,21 @@
} }
}, },
"node_modules/@angular/compiler-cli/node_modules/@babel/core": { "node_modules/@angular/compiler-cli/node_modules/@babel/core": {
"version": "7.17.12", "version": "7.18.0",
"resolved": "https://registry.npmjs.org/@babel/core/-/core-7.17.12.tgz", "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.18.0.tgz",
"integrity": "sha512-44ODe6O1IVz9s2oJE3rZ4trNNKTX9O7KpQpfAP4t8QII/zwrVRHL7i2pxhqtcY7tqMLrrKfMlBKnm1QlrRFs5w==", "integrity": "sha512-Xyw74OlJwDijToNi0+6BBI5mLLR5+5R3bcSH80LXzjzEGEUlvNzujEE71BaD/ApEZHAvFI/Mlmp4M5lIkdeeWw==",
"dev": true, "dev": true,
"dependencies": { "dependencies": {
"@ampproject/remapping": "^2.1.0", "@ampproject/remapping": "^2.1.0",
"@babel/code-frame": "^7.16.7", "@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-compilation-targets": "^7.17.10",
"@babel/helper-module-transforms": "^7.17.12", "@babel/helper-module-transforms": "^7.18.0",
"@babel/helpers": "^7.17.9", "@babel/helpers": "^7.18.0",
"@babel/parser": "^7.17.12", "@babel/parser": "^7.18.0",
"@babel/template": "^7.16.7", "@babel/template": "^7.16.7",
"@babel/traverse": "^7.17.12", "@babel/traverse": "^7.18.0",
"@babel/types": "^7.17.12", "@babel/types": "^7.18.0",
"convert-source-map": "^1.7.0", "convert-source-map": "^1.7.0",
"debug": "^4.1.0", "debug": "^4.1.0",
"gensync": "^1.0.0-beta.2", "gensync": "^1.0.0-beta.2",
@ -516,12 +516,12 @@
} }
}, },
"node_modules/@angular/compiler-cli/node_modules/@babel/generator": { "node_modules/@angular/compiler-cli/node_modules/@babel/generator": {
"version": "7.17.12", "version": "7.18.0",
"resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.17.12.tgz", "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.18.0.tgz",
"integrity": "sha512-V49KtZiiiLjH/CnIW6OjJdrenrGoyh6AmKQ3k2AZFKozC1h846Q4NYlZ5nqAigPDUXfGzC88+LOUuG8yKd2kCw==", "integrity": "sha512-81YO9gGx6voPXlvYdZBliFXAZU8vZ9AZ6z+CjlmcnaeOcYSFbMTpdeDUO9xD9dh/68Vq03I8ZspfUTPfitcDHg==",
"dev": true, "dev": true,
"dependencies": { "dependencies": {
"@babel/types": "^7.17.12", "@babel/types": "^7.18.0",
"@jridgewell/gen-mapping": "^0.3.0", "@jridgewell/gen-mapping": "^0.3.0",
"jsesc": "^2.5.1" "jsesc": "^2.5.1"
}, },
@ -828,9 +828,9 @@
} }
}, },
"node_modules/@babel/helper-create-class-features-plugin": { "node_modules/@babel/helper-create-class-features-plugin": {
"version": "7.17.12", "version": "7.18.0",
"resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.17.12.tgz", "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.18.0.tgz",
"integrity": "sha512-sZoOeUTkFJMyhqCei2+Z+wtH/BehW8NVKQt7IRUQlRiOARuXymJYfN/FCcI8CvVbR0XVyDM6eLFOlR7YtiXnew==", "integrity": "sha512-Kh8zTGR9de3J63e5nS0rQUdRs/kbtwoeQQ0sriS0lItjC96u8XXZN6lKpuyWd2coKSU13py/y+LTmThLuVX0Pg==",
"dev": true, "dev": true,
"dependencies": { "dependencies": {
"@babel/helper-annotate-as-pure": "^7.16.7", "@babel/helper-annotate-as-pure": "^7.16.7",
@ -966,9 +966,9 @@
} }
}, },
"node_modules/@babel/helper-module-transforms": { "node_modules/@babel/helper-module-transforms": {
"version": "7.17.12", "version": "7.18.0",
"resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.17.12.tgz", "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.18.0.tgz",
"integrity": "sha512-t5s2BeSWIghhFRPh9XMn6EIGmvn8Lmw5RVASJzkIx1mSemubQQBNIZiQD7WzaFmaHIrjAec4x8z9Yx8SjJ1/LA==", "integrity": "sha512-kclUYSUBIjlvnzN2++K9f2qzYKFgjmnmjwL4zlmU5f8ZtzgWe8s0rUPSTGy2HmK4P8T52MQsS+HTQAgZd3dMEA==",
"dev": true, "dev": true,
"dependencies": { "dependencies": {
"@babel/helper-environment-visitor": "^7.16.7", "@babel/helper-environment-visitor": "^7.16.7",
@ -977,8 +977,8 @@
"@babel/helper-split-export-declaration": "^7.16.7", "@babel/helper-split-export-declaration": "^7.16.7",
"@babel/helper-validator-identifier": "^7.16.7", "@babel/helper-validator-identifier": "^7.16.7",
"@babel/template": "^7.16.7", "@babel/template": "^7.16.7",
"@babel/traverse": "^7.17.12", "@babel/traverse": "^7.18.0",
"@babel/types": "^7.17.12" "@babel/types": "^7.18.0"
}, },
"engines": { "engines": {
"node": ">=6.9.0" "node": ">=6.9.0"
@ -1105,14 +1105,14 @@
} }
}, },
"node_modules/@babel/helpers": { "node_modules/@babel/helpers": {
"version": "7.17.9", "version": "7.18.0",
"resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.17.9.tgz", "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.18.0.tgz",
"integrity": "sha512-cPCt915ShDWUEzEp3+UNRktO2n6v49l5RSnG9M5pS24hA+2FAc5si+Pn1i4VVbQQ+jh+bIZhPFQOJOzbrOYY1Q==", "integrity": "sha512-AE+HMYhmlMIbho9nbvicHyxFwhrO+xhKB6AhRxzl8w46Yj0VXTZjEsAoBVC7rB2I0jzX+yWyVybnO08qkfx6kg==",
"dev": true, "dev": true,
"dependencies": { "dependencies": {
"@babel/template": "^7.16.7", "@babel/template": "^7.16.7",
"@babel/traverse": "^7.17.9", "@babel/traverse": "^7.18.0",
"@babel/types": "^7.17.0" "@babel/types": "^7.18.0"
}, },
"engines": { "engines": {
"node": ">=6.9.0" "node": ">=6.9.0"
@ -1133,9 +1133,9 @@
} }
}, },
"node_modules/@babel/parser": { "node_modules/@babel/parser": {
"version": "7.17.12", "version": "7.18.0",
"resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.17.12.tgz", "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.18.0.tgz",
"integrity": "sha512-FLzHmN9V3AJIrWfOpvRlZCeVg/WLdicSnTMsLur6uDj9TT8ymUlG9XxURdW/XvuygK+2CW0poOJABdA4m/YKxA==", "integrity": "sha512-AqDccGC+m5O/iUStSJy3DGRIUFu7WbY/CppZYwrEUB4N0tZlnI8CSTsgL7v5fHVFmUbRv2sd+yy27o8Ydt4MGg==",
"dev": true, "dev": true,
"bin": { "bin": {
"parser": "bin/babel-parser.js" "parser": "bin/babel-parser.js"
@ -1210,12 +1210,12 @@
} }
}, },
"node_modules/@babel/plugin-proposal-class-static-block": { "node_modules/@babel/plugin-proposal-class-static-block": {
"version": "7.17.12", "version": "7.18.0",
"resolved": "https://registry.npmjs.org/@babel/plugin-proposal-class-static-block/-/plugin-proposal-class-static-block-7.17.12.tgz", "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-class-static-block/-/plugin-proposal-class-static-block-7.18.0.tgz",
"integrity": "sha512-8ILyDG6eL14F8iub97dVc8q35Md0PJYAnA5Kz9NACFOkt6ffCcr0FISyUPKHsvuAy36fkpIitxZ9bVYPFMGQHA==", "integrity": "sha512-t+8LsRMMDE74c6sV7KShIw13sqbqd58tlqNrsWoWBTIMw7SVQ0cZ905wLNS/FBCy/3PyooRHLFFlfrUNyyz5lA==",
"dev": true, "dev": true,
"dependencies": { "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/helper-plugin-utils": "^7.17.12",
"@babel/plugin-syntax-class-static-block": "^7.14.5" "@babel/plugin-syntax-class-static-block": "^7.14.5"
}, },
@ -1323,9 +1323,9 @@
} }
}, },
"node_modules/@babel/plugin-proposal-object-rest-spread": { "node_modules/@babel/plugin-proposal-object-rest-spread": {
"version": "7.17.12", "version": "7.18.0",
"resolved": "https://registry.npmjs.org/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.17.12.tgz", "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.18.0.tgz",
"integrity": "sha512-6l9cO3YXXRh4yPCPRA776ZyJ3RobG4ZKJZhp7NDRbKIOeV3dBPG8FXCF7ZtiO2RTCIOkQOph1xDDcc01iWVNjQ==", "integrity": "sha512-nbTv371eTrFabDfHLElkn9oyf9VG+VKK6WMzhY2o4eHKaG19BToD9947zzGMO6I/Irstx9d8CwX6njPNIAR/yw==",
"dev": true, "dev": true,
"dependencies": { "dependencies": {
"@babel/compat-data": "^7.17.10", "@babel/compat-data": "^7.17.10",
@ -1701,9 +1701,9 @@
} }
}, },
"node_modules/@babel/plugin-transform-destructuring": { "node_modules/@babel/plugin-transform-destructuring": {
"version": "7.17.12", "version": "7.18.0",
"resolved": "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.17.12.tgz", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.18.0.tgz",
"integrity": "sha512-P8pt0YiKtX5UMUL5Xzsc9Oyij+pJE6JuC+F1k0/brq/OOGs5jDa1If3OY0LRWGvJsJhI+8tsiecL3nJLc0WTlg==", "integrity": "sha512-Mo69klS79z6KEfrLg/1WkmVnB8javh75HX4pi2btjvlIoasuxilEyjtsQW6XPrubNd7AQy0MMaNIaQE4e7+PQw==",
"dev": true, "dev": true,
"dependencies": { "dependencies": {
"@babel/helper-plugin-utils": "^7.17.12" "@babel/helper-plugin-utils": "^7.17.12"
@ -1763,9 +1763,9 @@
} }
}, },
"node_modules/@babel/plugin-transform-for-of": { "node_modules/@babel/plugin-transform-for-of": {
"version": "7.17.12", "version": "7.18.1",
"resolved": "https://registry.npmjs.org/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.17.12.tgz", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.18.1.tgz",
"integrity": "sha512-76lTwYaCxw8ldT7tNmye4LLwSoKDbRCBzu6n/DcK/P3FOR29+38CIIaVIZfwol9By8W/QHORYEnYSLuvcQKrsg==", "integrity": "sha512-+TTB5XwvJ5hZbO8xvl2H4XaMDOAK57zF4miuC9qQJgysPNEAZZ9Z69rdF5LJkozGdZrjBIUAIyKUWRMmebI7vg==",
"dev": true, "dev": true,
"dependencies": { "dependencies": {
"@babel/helper-plugin-utils": "^7.17.12" "@babel/helper-plugin-utils": "^7.17.12"
@ -1825,12 +1825,12 @@
} }
}, },
"node_modules/@babel/plugin-transform-modules-amd": { "node_modules/@babel/plugin-transform-modules-amd": {
"version": "7.17.12", "version": "7.18.0",
"resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.17.12.tgz", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.18.0.tgz",
"integrity": "sha512-p5rt9tB5Ndcc2Za7CeNxVf7YAjRcUMR6yi8o8tKjb9KhRkEvXwa+C0hj6DA5bVDkKRxB0NYhMUGbVKoFu4+zEA==", "integrity": "sha512-h8FjOlYmdZwl7Xm2Ug4iX2j7Qy63NANI+NQVWQzv6r25fqgg7k2dZl03p95kvqNclglHs4FZ+isv4p1uXMA+QA==",
"dev": true, "dev": true,
"dependencies": { "dependencies": {
"@babel/helper-module-transforms": "^7.17.12", "@babel/helper-module-transforms": "^7.18.0",
"@babel/helper-plugin-utils": "^7.17.12", "@babel/helper-plugin-utils": "^7.17.12",
"babel-plugin-dynamic-import-node": "^2.3.3" "babel-plugin-dynamic-import-node": "^2.3.3"
}, },
@ -1842,12 +1842,12 @@
} }
}, },
"node_modules/@babel/plugin-transform-modules-commonjs": { "node_modules/@babel/plugin-transform-modules-commonjs": {
"version": "7.17.12", "version": "7.18.0",
"resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.17.12.tgz", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.18.0.tgz",
"integrity": "sha512-tVPs6MImAJz+DiX8Y1xXEMdTk5Lwxu9jiPjlS+nv5M2A59R7+/d1+9A8C/sbuY0b3QjIxqClkj6KAplEtRvzaA==", "integrity": "sha512-cCeR0VZWtfxWS4YueAK2qtHtBPJRSaJcMlbS8jhSIm/A3E2Kpro4W1Dn4cqJtp59dtWfXjQwK7SPKF8ghs7rlw==",
"dev": true, "dev": true,
"dependencies": { "dependencies": {
"@babel/helper-module-transforms": "^7.17.12", "@babel/helper-module-transforms": "^7.18.0",
"@babel/helper-plugin-utils": "^7.17.12", "@babel/helper-plugin-utils": "^7.17.12",
"@babel/helper-simple-access": "^7.17.7", "@babel/helper-simple-access": "^7.17.7",
"babel-plugin-dynamic-import-node": "^2.3.3" "babel-plugin-dynamic-import-node": "^2.3.3"
@ -1860,13 +1860,13 @@
} }
}, },
"node_modules/@babel/plugin-transform-modules-systemjs": { "node_modules/@babel/plugin-transform-modules-systemjs": {
"version": "7.17.12", "version": "7.18.0",
"resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.17.12.tgz", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.18.0.tgz",
"integrity": "sha512-NVhDb0q00hqZcuLduUf/kMzbOQHiocmPbIxIvk23HLiEqaTKC/l4eRxeC7lO63M72BmACoiKOcb9AkOAJRerpw==", "integrity": "sha512-vwKpxdHnlM5tIrRt/eA0bzfbi7gUBLN08vLu38np1nZevlPySRe6yvuATJB5F/WPJ+ur4OXwpVYq9+BsxqAQuQ==",
"dev": true, "dev": true,
"dependencies": { "dependencies": {
"@babel/helper-hoist-variables": "^7.16.7", "@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-plugin-utils": "^7.17.12",
"@babel/helper-validator-identifier": "^7.16.7", "@babel/helper-validator-identifier": "^7.16.7",
"babel-plugin-dynamic-import-node": "^2.3.3" "babel-plugin-dynamic-import-node": "^2.3.3"
@ -1879,12 +1879,12 @@
} }
}, },
"node_modules/@babel/plugin-transform-modules-umd": { "node_modules/@babel/plugin-transform-modules-umd": {
"version": "7.17.12", "version": "7.18.0",
"resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.17.12.tgz", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.18.0.tgz",
"integrity": "sha512-BnsPkrUHsjzZGpnrmJeDFkOMMljWFHPjDc9xDcz71/C+ybF3lfC3V4m3dwXPLZrE5b3bgd4V+3/Pj+3620d7IA==", "integrity": "sha512-d/zZ8I3BWli1tmROLxXLc9A6YXvGK8egMxHp+E/rRwMh1Kip0AP77VwZae3snEJ33iiWwvNv2+UIIhfalqhzZA==",
"dev": true, "dev": true,
"dependencies": { "dependencies": {
"@babel/helper-module-transforms": "^7.17.12", "@babel/helper-module-transforms": "^7.18.0",
"@babel/helper-plugin-utils": "^7.17.12" "@babel/helper-plugin-utils": "^7.17.12"
}, },
"engines": { "engines": {
@ -1972,11 +1972,12 @@
} }
}, },
"node_modules/@babel/plugin-transform-regenerator": { "node_modules/@babel/plugin-transform-regenerator": {
"version": "7.17.9", "version": "7.18.0",
"resolved": "https://registry.npmjs.org/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.17.9.tgz", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.18.0.tgz",
"integrity": "sha512-Lc2TfbxR1HOyn/c6b4Y/b6NHoTb67n/IoWLxTu4kC7h4KQnWlhCq2S8Tx0t2SVvv5Uu87Hs+6JEJ5kt2tYGylQ==", "integrity": "sha512-C8YdRw9uzx25HSIzwA7EM7YP0FhCe5wNvJbZzjVNHHPGVcDJ3Aie+qGYYdS1oVQgn+B3eAIJbWFLrJ4Jipv7nw==",
"dev": true, "dev": true,
"dependencies": { "dependencies": {
"@babel/helper-plugin-utils": "^7.17.12",
"regenerator-transform": "^0.15.0" "regenerator-transform": "^0.15.0"
}, },
"engines": { "engines": {
@ -2277,19 +2278,19 @@
} }
}, },
"node_modules/@babel/traverse": { "node_modules/@babel/traverse": {
"version": "7.17.12", "version": "7.18.0",
"resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.17.12.tgz", "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.18.0.tgz",
"integrity": "sha512-zULPs+TbCvOkIFd4FrG53xrpxvCBwLIgo6tO0tJorY7YV2IWFxUfS/lXDJbGgfyYt9ery/Gxj2niwttNnB0gIw==", "integrity": "sha512-oNOO4vaoIQoGjDQ84LgtF/IAlxlyqL4TUuoQ7xLkQETFaHkY1F7yazhB4Kt3VcZGL0ZF/jhrEpnXqUb0M7V3sw==",
"dev": true, "dev": true,
"dependencies": { "dependencies": {
"@babel/code-frame": "^7.16.7", "@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-environment-visitor": "^7.16.7",
"@babel/helper-function-name": "^7.17.9", "@babel/helper-function-name": "^7.17.9",
"@babel/helper-hoist-variables": "^7.16.7", "@babel/helper-hoist-variables": "^7.16.7",
"@babel/helper-split-export-declaration": "^7.16.7", "@babel/helper-split-export-declaration": "^7.16.7",
"@babel/parser": "^7.17.12", "@babel/parser": "^7.18.0",
"@babel/types": "^7.17.12", "@babel/types": "^7.18.0",
"debug": "^4.1.0", "debug": "^4.1.0",
"globals": "^11.1.0" "globals": "^11.1.0"
}, },
@ -2298,12 +2299,12 @@
} }
}, },
"node_modules/@babel/traverse/node_modules/@babel/generator": { "node_modules/@babel/traverse/node_modules/@babel/generator": {
"version": "7.17.12", "version": "7.18.0",
"resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.17.12.tgz", "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.18.0.tgz",
"integrity": "sha512-V49KtZiiiLjH/CnIW6OjJdrenrGoyh6AmKQ3k2AZFKozC1h846Q4NYlZ5nqAigPDUXfGzC88+LOUuG8yKd2kCw==", "integrity": "sha512-81YO9gGx6voPXlvYdZBliFXAZU8vZ9AZ6z+CjlmcnaeOcYSFbMTpdeDUO9xD9dh/68Vq03I8ZspfUTPfitcDHg==",
"dev": true, "dev": true,
"dependencies": { "dependencies": {
"@babel/types": "^7.17.12", "@babel/types": "^7.18.0",
"@jridgewell/gen-mapping": "^0.3.0", "@jridgewell/gen-mapping": "^0.3.0",
"jsesc": "^2.5.1" "jsesc": "^2.5.1"
}, },
@ -2326,9 +2327,9 @@
} }
}, },
"node_modules/@babel/types": { "node_modules/@babel/types": {
"version": "7.17.12", "version": "7.18.0",
"resolved": "https://registry.npmjs.org/@babel/types/-/types-7.17.12.tgz", "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.18.0.tgz",
"integrity": "sha512-rH8i29wcZ6x9xjzI5ILHL/yZkbQnCERdHlogKuIb4PUr7do4iT8DPekrTbBLWTnRQm6U0GYABbTMSzijmEqlAg==", "integrity": "sha512-vhAmLPAiC8j9K2GnsnLPCIH5wCrPpYIVBCWRBFDCB7Y/BXLqi/O+1RSTTM2bsmg6U/551+FCf9PNPxjABmxHTw==",
"dev": true, "dev": true,
"dependencies": { "dependencies": {
"@babel/helper-validator-identifier": "^7.16.7", "@babel/helper-validator-identifier": "^7.16.7",
@ -2401,15 +2402,15 @@
} }
}, },
"node_modules/@eslint/eslintrc": { "node_modules/@eslint/eslintrc": {
"version": "1.2.3", "version": "1.3.0",
"resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-1.2.3.tgz", "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-1.3.0.tgz",
"integrity": "sha512-uGo44hIwoLGNyduRpjdEpovcbMdd+Nv7amtmJxnKmI8xj6yd5LncmSwDa5NgX/41lIFJtkjD6YdVfgEzPfJ5UA==", "integrity": "sha512-UWW0TMTmk2d7hLcWD1/e2g5HDM/HQ3csaLSqXCfqwh4uNDuNqlaKWXmEsL4Cs41Z0KnILNvwbHAah3C2yt06kw==",
"dev": true, "dev": true,
"dependencies": { "dependencies": {
"ajv": "^6.12.4", "ajv": "^6.12.4",
"debug": "^4.3.2", "debug": "^4.3.2",
"espree": "^9.3.2", "espree": "^9.3.2",
"globals": "^13.9.0", "globals": "^13.15.0",
"ignore": "^5.2.0", "ignore": "^5.2.0",
"import-fresh": "^3.2.1", "import-fresh": "^3.2.1",
"js-yaml": "^4.1.0", "js-yaml": "^4.1.0",
@ -5686,12 +5687,12 @@
} }
}, },
"node_modules/eslint": { "node_modules/eslint": {
"version": "8.15.0", "version": "8.16.0",
"resolved": "https://registry.npmjs.org/eslint/-/eslint-8.15.0.tgz", "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.16.0.tgz",
"integrity": "sha512-GG5USZ1jhCu8HJkzGgeK8/+RGnHaNYZGrGDzUtigK3BsGESW/rs2az23XqE0WVwDxy1VRvvjSSGu5nB0Bu+6SA==", "integrity": "sha512-MBndsoXY/PeVTDJeWsYj7kLZ5hQpJOfMYLsF6LicLHQWbRDG19lK5jOix4DPl8yY4SUFcE3txy86OzFLWT+yoA==",
"dev": true, "dev": true,
"dependencies": { "dependencies": {
"@eslint/eslintrc": "^1.2.3", "@eslint/eslintrc": "^1.3.0",
"@humanwhocodes/config-array": "^0.9.2", "@humanwhocodes/config-array": "^0.9.2",
"ajv": "^6.10.0", "ajv": "^6.10.0",
"chalk": "^4.0.0", "chalk": "^4.0.0",
@ -5709,7 +5710,7 @@
"file-entry-cache": "^6.0.1", "file-entry-cache": "^6.0.1",
"functional-red-black-tree": "^1.0.1", "functional-red-black-tree": "^1.0.1",
"glob-parent": "^6.0.1", "glob-parent": "^6.0.1",
"globals": "^13.6.0", "globals": "^13.15.0",
"ignore": "^5.2.0", "ignore": "^5.2.0",
"import-fresh": "^3.0.0", "import-fresh": "^3.0.0",
"imurmurhash": "^0.1.4", "imurmurhash": "^0.1.4",
@ -8647,9 +8648,9 @@
} }
}, },
"node_modules/npm-registry-fetch/node_modules/make-fetch-happen": { "node_modules/npm-registry-fetch/node_modules/make-fetch-happen": {
"version": "10.1.4", "version": "10.1.5",
"resolved": "https://registry.npmjs.org/make-fetch-happen/-/make-fetch-happen-10.1.4.tgz", "resolved": "https://registry.npmjs.org/make-fetch-happen/-/make-fetch-happen-10.1.5.tgz",
"integrity": "sha512-hU1w68PqfH7FdMgjbiziJoACY0edlbIZ0CyKnpcEruVdCjsUrN+qoenOCIayNqVBK7toSWwbDxvQlrhH0gjRdg==", "integrity": "sha512-mucOj2H0Jn/ax7H9K9T1bf0p1nn/mBFa551Os7ed9xRfLEx20aZhZeLslmRYfAaAqXZUGipcs+m5KOKvOH0XKA==",
"dev": true, "dev": true,
"dependencies": { "dependencies": {
"agentkeepalive": "^4.2.1", "agentkeepalive": "^4.2.1",
@ -8703,9 +8704,9 @@
} }
}, },
"node_modules/npm-registry-fetch/node_modules/ssri": { "node_modules/npm-registry-fetch/node_modules/ssri": {
"version": "9.0.0", "version": "9.0.1",
"resolved": "https://registry.npmjs.org/ssri/-/ssri-9.0.0.tgz", "resolved": "https://registry.npmjs.org/ssri/-/ssri-9.0.1.tgz",
"integrity": "sha512-Y1Z6J8UYnexKFN1R/hxUaYoY2LVdKEzziPmVAFKiKX8fiwvCJTVzn/xYE9TEWod5OVyNfIHHuVfIEuBClL/uJQ==", "integrity": "sha512-o57Wcn66jMQvfHG1FlYbWeZWW/dHZhJXjpIcTfXldXEk5nz5lStPo3mK0OJQfGR3RbZUlbISexbljkJzuEj/8Q==",
"dev": true, "dev": true,
"dependencies": { "dependencies": {
"minipass": "^3.1.1" "minipass": "^3.1.1"
@ -9371,9 +9372,9 @@
} }
}, },
"node_modules/postcss-color-functional-notation": { "node_modules/postcss-color-functional-notation": {
"version": "4.2.2", "version": "4.2.3",
"resolved": "https://registry.npmjs.org/postcss-color-functional-notation/-/postcss-color-functional-notation-4.2.2.tgz", "resolved": "https://registry.npmjs.org/postcss-color-functional-notation/-/postcss-color-functional-notation-4.2.3.tgz",
"integrity": "sha512-DXVtwUhIk4f49KK5EGuEdgx4Gnyj6+t2jBSEmxvpIK9QI40tWrpS2Pua8Q7iIZWBrki2QOaeUdEaLPPa91K0RQ==", "integrity": "sha512-5fbr6FzFzjwHXKsVnkmEYrJYG8VNNzvD1tAXaPPWR97S6rhKI5uh2yOfV5TAzhDkZoq4h+chxEplFDc8GeyFtw==",
"dev": true, "dev": true,
"dependencies": { "dependencies": {
"postcss-value-parser": "^4.2.0" "postcss-value-parser": "^4.2.0"
@ -9381,6 +9382,10 @@
"engines": { "engines": {
"node": "^12 || ^14 || >=16" "node": "^12 || ^14 || >=16"
}, },
"funding": {
"type": "opencollective",
"url": "https://opencollective.com/csstools"
},
"peerDependencies": { "peerDependencies": {
"postcss": "^8.4" "postcss": "^8.4"
} }
@ -9725,9 +9730,9 @@
} }
}, },
"node_modules/postcss-nesting": { "node_modules/postcss-nesting": {
"version": "10.1.6", "version": "10.1.7",
"resolved": "https://registry.npmjs.org/postcss-nesting/-/postcss-nesting-10.1.6.tgz", "resolved": "https://registry.npmjs.org/postcss-nesting/-/postcss-nesting-10.1.7.tgz",
"integrity": "sha512-8C0X0pOOShlgqYkCzB4wlWLyulos+GXFpw7r2+x7g+ROQ1RwN8MlN2NCcpNQScNBPfbjxbjwY8e25raTcEXqmg==", "integrity": "sha512-Btho5XzDTpl117SmB3tvUHP8txg5n7Ayv7vQ5m4b1zXkfs1Y52C67uZjZ746h7QvOJ+rLRg50OlhhjFW+IQY6A==",
"dev": true, "dev": true,
"dependencies": { "dependencies": {
"@csstools/selector-specificity": "1.0.0", "@csstools/selector-specificity": "1.0.0",
@ -12411,21 +12416,21 @@
}, },
"dependencies": { "dependencies": {
"@babel/core": { "@babel/core": {
"version": "7.17.12", "version": "7.18.0",
"resolved": "https://registry.npmjs.org/@babel/core/-/core-7.17.12.tgz", "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.18.0.tgz",
"integrity": "sha512-44ODe6O1IVz9s2oJE3rZ4trNNKTX9O7KpQpfAP4t8QII/zwrVRHL7i2pxhqtcY7tqMLrrKfMlBKnm1QlrRFs5w==", "integrity": "sha512-Xyw74OlJwDijToNi0+6BBI5mLLR5+5R3bcSH80LXzjzEGEUlvNzujEE71BaD/ApEZHAvFI/Mlmp4M5lIkdeeWw==",
"dev": true, "dev": true,
"requires": { "requires": {
"@ampproject/remapping": "^2.1.0", "@ampproject/remapping": "^2.1.0",
"@babel/code-frame": "^7.16.7", "@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-compilation-targets": "^7.17.10",
"@babel/helper-module-transforms": "^7.17.12", "@babel/helper-module-transforms": "^7.18.0",
"@babel/helpers": "^7.17.9", "@babel/helpers": "^7.18.0",
"@babel/parser": "^7.17.12", "@babel/parser": "^7.18.0",
"@babel/template": "^7.16.7", "@babel/template": "^7.16.7",
"@babel/traverse": "^7.17.12", "@babel/traverse": "^7.18.0",
"@babel/types": "^7.17.12", "@babel/types": "^7.18.0",
"convert-source-map": "^1.7.0", "convert-source-map": "^1.7.0",
"debug": "^4.1.0", "debug": "^4.1.0",
"gensync": "^1.0.0-beta.2", "gensync": "^1.0.0-beta.2",
@ -12442,12 +12447,12 @@
} }
}, },
"@babel/generator": { "@babel/generator": {
"version": "7.17.12", "version": "7.18.0",
"resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.17.12.tgz", "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.18.0.tgz",
"integrity": "sha512-V49KtZiiiLjH/CnIW6OjJdrenrGoyh6AmKQ3k2AZFKozC1h846Q4NYlZ5nqAigPDUXfGzC88+LOUuG8yKd2kCw==", "integrity": "sha512-81YO9gGx6voPXlvYdZBliFXAZU8vZ9AZ6z+CjlmcnaeOcYSFbMTpdeDUO9xD9dh/68Vq03I8ZspfUTPfitcDHg==",
"dev": true, "dev": true,
"requires": { "requires": {
"@babel/types": "^7.17.12", "@babel/types": "^7.18.0",
"@jridgewell/gen-mapping": "^0.3.0", "@jridgewell/gen-mapping": "^0.3.0",
"jsesc": "^2.5.1" "jsesc": "^2.5.1"
} }
@ -12647,9 +12652,9 @@
} }
}, },
"@babel/helper-create-class-features-plugin": { "@babel/helper-create-class-features-plugin": {
"version": "7.17.12", "version": "7.18.0",
"resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.17.12.tgz", "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.18.0.tgz",
"integrity": "sha512-sZoOeUTkFJMyhqCei2+Z+wtH/BehW8NVKQt7IRUQlRiOARuXymJYfN/FCcI8CvVbR0XVyDM6eLFOlR7YtiXnew==", "integrity": "sha512-Kh8zTGR9de3J63e5nS0rQUdRs/kbtwoeQQ0sriS0lItjC96u8XXZN6lKpuyWd2coKSU13py/y+LTmThLuVX0Pg==",
"dev": true, "dev": true,
"requires": { "requires": {
"@babel/helper-annotate-as-pure": "^7.16.7", "@babel/helper-annotate-as-pure": "^7.16.7",
@ -12751,9 +12756,9 @@
} }
}, },
"@babel/helper-module-transforms": { "@babel/helper-module-transforms": {
"version": "7.17.12", "version": "7.18.0",
"resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.17.12.tgz", "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.18.0.tgz",
"integrity": "sha512-t5s2BeSWIghhFRPh9XMn6EIGmvn8Lmw5RVASJzkIx1mSemubQQBNIZiQD7WzaFmaHIrjAec4x8z9Yx8SjJ1/LA==", "integrity": "sha512-kclUYSUBIjlvnzN2++K9f2qzYKFgjmnmjwL4zlmU5f8ZtzgWe8s0rUPSTGy2HmK4P8T52MQsS+HTQAgZd3dMEA==",
"dev": true, "dev": true,
"requires": { "requires": {
"@babel/helper-environment-visitor": "^7.16.7", "@babel/helper-environment-visitor": "^7.16.7",
@ -12762,8 +12767,8 @@
"@babel/helper-split-export-declaration": "^7.16.7", "@babel/helper-split-export-declaration": "^7.16.7",
"@babel/helper-validator-identifier": "^7.16.7", "@babel/helper-validator-identifier": "^7.16.7",
"@babel/template": "^7.16.7", "@babel/template": "^7.16.7",
"@babel/traverse": "^7.17.12", "@babel/traverse": "^7.18.0",
"@babel/types": "^7.17.12" "@babel/types": "^7.18.0"
} }
}, },
"@babel/helper-optimise-call-expression": { "@babel/helper-optimise-call-expression": {
@ -12857,14 +12862,14 @@
} }
}, },
"@babel/helpers": { "@babel/helpers": {
"version": "7.17.9", "version": "7.18.0",
"resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.17.9.tgz", "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.18.0.tgz",
"integrity": "sha512-cPCt915ShDWUEzEp3+UNRktO2n6v49l5RSnG9M5pS24hA+2FAc5si+Pn1i4VVbQQ+jh+bIZhPFQOJOzbrOYY1Q==", "integrity": "sha512-AE+HMYhmlMIbho9nbvicHyxFwhrO+xhKB6AhRxzl8w46Yj0VXTZjEsAoBVC7rB2I0jzX+yWyVybnO08qkfx6kg==",
"dev": true, "dev": true,
"requires": { "requires": {
"@babel/template": "^7.16.7", "@babel/template": "^7.16.7",
"@babel/traverse": "^7.17.9", "@babel/traverse": "^7.18.0",
"@babel/types": "^7.17.0" "@babel/types": "^7.18.0"
} }
}, },
"@babel/highlight": { "@babel/highlight": {
@ -12879,9 +12884,9 @@
} }
}, },
"@babel/parser": { "@babel/parser": {
"version": "7.17.12", "version": "7.18.0",
"resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.17.12.tgz", "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.18.0.tgz",
"integrity": "sha512-FLzHmN9V3AJIrWfOpvRlZCeVg/WLdicSnTMsLur6uDj9TT8ymUlG9XxURdW/XvuygK+2CW0poOJABdA4m/YKxA==", "integrity": "sha512-AqDccGC+m5O/iUStSJy3DGRIUFu7WbY/CppZYwrEUB4N0tZlnI8CSTsgL7v5fHVFmUbRv2sd+yy27o8Ydt4MGg==",
"dev": true "dev": true
}, },
"@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": { "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": {
@ -12926,12 +12931,12 @@
} }
}, },
"@babel/plugin-proposal-class-static-block": { "@babel/plugin-proposal-class-static-block": {
"version": "7.17.12", "version": "7.18.0",
"resolved": "https://registry.npmjs.org/@babel/plugin-proposal-class-static-block/-/plugin-proposal-class-static-block-7.17.12.tgz", "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-class-static-block/-/plugin-proposal-class-static-block-7.18.0.tgz",
"integrity": "sha512-8ILyDG6eL14F8iub97dVc8q35Md0PJYAnA5Kz9NACFOkt6ffCcr0FISyUPKHsvuAy36fkpIitxZ9bVYPFMGQHA==", "integrity": "sha512-t+8LsRMMDE74c6sV7KShIw13sqbqd58tlqNrsWoWBTIMw7SVQ0cZ905wLNS/FBCy/3PyooRHLFFlfrUNyyz5lA==",
"dev": true, "dev": true,
"requires": { "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/helper-plugin-utils": "^7.17.12",
"@babel/plugin-syntax-class-static-block": "^7.14.5" "@babel/plugin-syntax-class-static-block": "^7.14.5"
} }
@ -12997,9 +13002,9 @@
} }
}, },
"@babel/plugin-proposal-object-rest-spread": { "@babel/plugin-proposal-object-rest-spread": {
"version": "7.17.12", "version": "7.18.0",
"resolved": "https://registry.npmjs.org/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.17.12.tgz", "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.18.0.tgz",
"integrity": "sha512-6l9cO3YXXRh4yPCPRA776ZyJ3RobG4ZKJZhp7NDRbKIOeV3dBPG8FXCF7ZtiO2RTCIOkQOph1xDDcc01iWVNjQ==", "integrity": "sha512-nbTv371eTrFabDfHLElkn9oyf9VG+VKK6WMzhY2o4eHKaG19BToD9947zzGMO6I/Irstx9d8CwX6njPNIAR/yw==",
"dev": true, "dev": true,
"requires": { "requires": {
"@babel/compat-data": "^7.17.10", "@babel/compat-data": "^7.17.10",
@ -13252,9 +13257,9 @@
} }
}, },
"@babel/plugin-transform-destructuring": { "@babel/plugin-transform-destructuring": {
"version": "7.17.12", "version": "7.18.0",
"resolved": "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.17.12.tgz", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.18.0.tgz",
"integrity": "sha512-P8pt0YiKtX5UMUL5Xzsc9Oyij+pJE6JuC+F1k0/brq/OOGs5jDa1If3OY0LRWGvJsJhI+8tsiecL3nJLc0WTlg==", "integrity": "sha512-Mo69klS79z6KEfrLg/1WkmVnB8javh75HX4pi2btjvlIoasuxilEyjtsQW6XPrubNd7AQy0MMaNIaQE4e7+PQw==",
"dev": true, "dev": true,
"requires": { "requires": {
"@babel/helper-plugin-utils": "^7.17.12" "@babel/helper-plugin-utils": "^7.17.12"
@ -13290,9 +13295,9 @@
} }
}, },
"@babel/plugin-transform-for-of": { "@babel/plugin-transform-for-of": {
"version": "7.17.12", "version": "7.18.1",
"resolved": "https://registry.npmjs.org/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.17.12.tgz", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.18.1.tgz",
"integrity": "sha512-76lTwYaCxw8ldT7tNmye4LLwSoKDbRCBzu6n/DcK/P3FOR29+38CIIaVIZfwol9By8W/QHORYEnYSLuvcQKrsg==", "integrity": "sha512-+TTB5XwvJ5hZbO8xvl2H4XaMDOAK57zF4miuC9qQJgysPNEAZZ9Z69rdF5LJkozGdZrjBIUAIyKUWRMmebI7vg==",
"dev": true, "dev": true,
"requires": { "requires": {
"@babel/helper-plugin-utils": "^7.17.12" "@babel/helper-plugin-utils": "^7.17.12"
@ -13328,48 +13333,48 @@
} }
}, },
"@babel/plugin-transform-modules-amd": { "@babel/plugin-transform-modules-amd": {
"version": "7.17.12", "version": "7.18.0",
"resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.17.12.tgz", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.18.0.tgz",
"integrity": "sha512-p5rt9tB5Ndcc2Za7CeNxVf7YAjRcUMR6yi8o8tKjb9KhRkEvXwa+C0hj6DA5bVDkKRxB0NYhMUGbVKoFu4+zEA==", "integrity": "sha512-h8FjOlYmdZwl7Xm2Ug4iX2j7Qy63NANI+NQVWQzv6r25fqgg7k2dZl03p95kvqNclglHs4FZ+isv4p1uXMA+QA==",
"dev": true, "dev": true,
"requires": { "requires": {
"@babel/helper-module-transforms": "^7.17.12", "@babel/helper-module-transforms": "^7.18.0",
"@babel/helper-plugin-utils": "^7.17.12", "@babel/helper-plugin-utils": "^7.17.12",
"babel-plugin-dynamic-import-node": "^2.3.3" "babel-plugin-dynamic-import-node": "^2.3.3"
} }
}, },
"@babel/plugin-transform-modules-commonjs": { "@babel/plugin-transform-modules-commonjs": {
"version": "7.17.12", "version": "7.18.0",
"resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.17.12.tgz", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.18.0.tgz",
"integrity": "sha512-tVPs6MImAJz+DiX8Y1xXEMdTk5Lwxu9jiPjlS+nv5M2A59R7+/d1+9A8C/sbuY0b3QjIxqClkj6KAplEtRvzaA==", "integrity": "sha512-cCeR0VZWtfxWS4YueAK2qtHtBPJRSaJcMlbS8jhSIm/A3E2Kpro4W1Dn4cqJtp59dtWfXjQwK7SPKF8ghs7rlw==",
"dev": true, "dev": true,
"requires": { "requires": {
"@babel/helper-module-transforms": "^7.17.12", "@babel/helper-module-transforms": "^7.18.0",
"@babel/helper-plugin-utils": "^7.17.12", "@babel/helper-plugin-utils": "^7.17.12",
"@babel/helper-simple-access": "^7.17.7", "@babel/helper-simple-access": "^7.17.7",
"babel-plugin-dynamic-import-node": "^2.3.3" "babel-plugin-dynamic-import-node": "^2.3.3"
} }
}, },
"@babel/plugin-transform-modules-systemjs": { "@babel/plugin-transform-modules-systemjs": {
"version": "7.17.12", "version": "7.18.0",
"resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.17.12.tgz", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.18.0.tgz",
"integrity": "sha512-NVhDb0q00hqZcuLduUf/kMzbOQHiocmPbIxIvk23HLiEqaTKC/l4eRxeC7lO63M72BmACoiKOcb9AkOAJRerpw==", "integrity": "sha512-vwKpxdHnlM5tIrRt/eA0bzfbi7gUBLN08vLu38np1nZevlPySRe6yvuATJB5F/WPJ+ur4OXwpVYq9+BsxqAQuQ==",
"dev": true, "dev": true,
"requires": { "requires": {
"@babel/helper-hoist-variables": "^7.16.7", "@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-plugin-utils": "^7.17.12",
"@babel/helper-validator-identifier": "^7.16.7", "@babel/helper-validator-identifier": "^7.16.7",
"babel-plugin-dynamic-import-node": "^2.3.3" "babel-plugin-dynamic-import-node": "^2.3.3"
} }
}, },
"@babel/plugin-transform-modules-umd": { "@babel/plugin-transform-modules-umd": {
"version": "7.17.12", "version": "7.18.0",
"resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.17.12.tgz", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.18.0.tgz",
"integrity": "sha512-BnsPkrUHsjzZGpnrmJeDFkOMMljWFHPjDc9xDcz71/C+ybF3lfC3V4m3dwXPLZrE5b3bgd4V+3/Pj+3620d7IA==", "integrity": "sha512-d/zZ8I3BWli1tmROLxXLc9A6YXvGK8egMxHp+E/rRwMh1Kip0AP77VwZae3snEJ33iiWwvNv2+UIIhfalqhzZA==",
"dev": true, "dev": true,
"requires": { "requires": {
"@babel/helper-module-transforms": "^7.17.12", "@babel/helper-module-transforms": "^7.18.0",
"@babel/helper-plugin-utils": "^7.17.12" "@babel/helper-plugin-utils": "^7.17.12"
} }
}, },
@ -13421,11 +13426,12 @@
} }
}, },
"@babel/plugin-transform-regenerator": { "@babel/plugin-transform-regenerator": {
"version": "7.17.9", "version": "7.18.0",
"resolved": "https://registry.npmjs.org/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.17.9.tgz", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.18.0.tgz",
"integrity": "sha512-Lc2TfbxR1HOyn/c6b4Y/b6NHoTb67n/IoWLxTu4kC7h4KQnWlhCq2S8Tx0t2SVvv5Uu87Hs+6JEJ5kt2tYGylQ==", "integrity": "sha512-C8YdRw9uzx25HSIzwA7EM7YP0FhCe5wNvJbZzjVNHHPGVcDJ3Aie+qGYYdS1oVQgn+B3eAIJbWFLrJ4Jipv7nw==",
"dev": true, "dev": true,
"requires": { "requires": {
"@babel/helper-plugin-utils": "^7.17.12",
"regenerator-transform": "^0.15.0" "regenerator-transform": "^0.15.0"
} }
}, },
@ -13649,30 +13655,30 @@
} }
}, },
"@babel/traverse": { "@babel/traverse": {
"version": "7.17.12", "version": "7.18.0",
"resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.17.12.tgz", "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.18.0.tgz",
"integrity": "sha512-zULPs+TbCvOkIFd4FrG53xrpxvCBwLIgo6tO0tJorY7YV2IWFxUfS/lXDJbGgfyYt9ery/Gxj2niwttNnB0gIw==", "integrity": "sha512-oNOO4vaoIQoGjDQ84LgtF/IAlxlyqL4TUuoQ7xLkQETFaHkY1F7yazhB4Kt3VcZGL0ZF/jhrEpnXqUb0M7V3sw==",
"dev": true, "dev": true,
"requires": { "requires": {
"@babel/code-frame": "^7.16.7", "@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-environment-visitor": "^7.16.7",
"@babel/helper-function-name": "^7.17.9", "@babel/helper-function-name": "^7.17.9",
"@babel/helper-hoist-variables": "^7.16.7", "@babel/helper-hoist-variables": "^7.16.7",
"@babel/helper-split-export-declaration": "^7.16.7", "@babel/helper-split-export-declaration": "^7.16.7",
"@babel/parser": "^7.17.12", "@babel/parser": "^7.18.0",
"@babel/types": "^7.17.12", "@babel/types": "^7.18.0",
"debug": "^4.1.0", "debug": "^4.1.0",
"globals": "^11.1.0" "globals": "^11.1.0"
}, },
"dependencies": { "dependencies": {
"@babel/generator": { "@babel/generator": {
"version": "7.17.12", "version": "7.18.0",
"resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.17.12.tgz", "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.18.0.tgz",
"integrity": "sha512-V49KtZiiiLjH/CnIW6OjJdrenrGoyh6AmKQ3k2AZFKozC1h846Q4NYlZ5nqAigPDUXfGzC88+LOUuG8yKd2kCw==", "integrity": "sha512-81YO9gGx6voPXlvYdZBliFXAZU8vZ9AZ6z+CjlmcnaeOcYSFbMTpdeDUO9xD9dh/68Vq03I8ZspfUTPfitcDHg==",
"dev": true, "dev": true,
"requires": { "requires": {
"@babel/types": "^7.17.12", "@babel/types": "^7.18.0",
"@jridgewell/gen-mapping": "^0.3.0", "@jridgewell/gen-mapping": "^0.3.0",
"jsesc": "^2.5.1" "jsesc": "^2.5.1"
} }
@ -13691,9 +13697,9 @@
} }
}, },
"@babel/types": { "@babel/types": {
"version": "7.17.12", "version": "7.18.0",
"resolved": "https://registry.npmjs.org/@babel/types/-/types-7.17.12.tgz", "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.18.0.tgz",
"integrity": "sha512-rH8i29wcZ6x9xjzI5ILHL/yZkbQnCERdHlogKuIb4PUr7do4iT8DPekrTbBLWTnRQm6U0GYABbTMSzijmEqlAg==", "integrity": "sha512-vhAmLPAiC8j9K2GnsnLPCIH5wCrPpYIVBCWRBFDCB7Y/BXLqi/O+1RSTTM2bsmg6U/551+FCf9PNPxjABmxHTw==",
"dev": true, "dev": true,
"requires": { "requires": {
"@babel/helper-validator-identifier": "^7.16.7", "@babel/helper-validator-identifier": "^7.16.7",
@ -13738,15 +13744,15 @@
"dev": true "dev": true
}, },
"@eslint/eslintrc": { "@eslint/eslintrc": {
"version": "1.2.3", "version": "1.3.0",
"resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-1.2.3.tgz", "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-1.3.0.tgz",
"integrity": "sha512-uGo44hIwoLGNyduRpjdEpovcbMdd+Nv7amtmJxnKmI8xj6yd5LncmSwDa5NgX/41lIFJtkjD6YdVfgEzPfJ5UA==", "integrity": "sha512-UWW0TMTmk2d7hLcWD1/e2g5HDM/HQ3csaLSqXCfqwh4uNDuNqlaKWXmEsL4Cs41Z0KnILNvwbHAah3C2yt06kw==",
"dev": true, "dev": true,
"requires": { "requires": {
"ajv": "^6.12.4", "ajv": "^6.12.4",
"debug": "^4.3.2", "debug": "^4.3.2",
"espree": "^9.3.2", "espree": "^9.3.2",
"globals": "^13.9.0", "globals": "^13.15.0",
"ignore": "^5.2.0", "ignore": "^5.2.0",
"import-fresh": "^3.2.1", "import-fresh": "^3.2.1",
"js-yaml": "^4.1.0", "js-yaml": "^4.1.0",
@ -16135,12 +16141,12 @@
"dev": true "dev": true
}, },
"eslint": { "eslint": {
"version": "8.15.0", "version": "8.16.0",
"resolved": "https://registry.npmjs.org/eslint/-/eslint-8.15.0.tgz", "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.16.0.tgz",
"integrity": "sha512-GG5USZ1jhCu8HJkzGgeK8/+RGnHaNYZGrGDzUtigK3BsGESW/rs2az23XqE0WVwDxy1VRvvjSSGu5nB0Bu+6SA==", "integrity": "sha512-MBndsoXY/PeVTDJeWsYj7kLZ5hQpJOfMYLsF6LicLHQWbRDG19lK5jOix4DPl8yY4SUFcE3txy86OzFLWT+yoA==",
"dev": true, "dev": true,
"requires": { "requires": {
"@eslint/eslintrc": "^1.2.3", "@eslint/eslintrc": "^1.3.0",
"@humanwhocodes/config-array": "^0.9.2", "@humanwhocodes/config-array": "^0.9.2",
"ajv": "^6.10.0", "ajv": "^6.10.0",
"chalk": "^4.0.0", "chalk": "^4.0.0",
@ -16158,7 +16164,7 @@
"file-entry-cache": "^6.0.1", "file-entry-cache": "^6.0.1",
"functional-red-black-tree": "^1.0.1", "functional-red-black-tree": "^1.0.1",
"glob-parent": "^6.0.1", "glob-parent": "^6.0.1",
"globals": "^13.6.0", "globals": "^13.15.0",
"ignore": "^5.2.0", "ignore": "^5.2.0",
"import-fresh": "^3.0.0", "import-fresh": "^3.0.0",
"imurmurhash": "^0.1.4", "imurmurhash": "^0.1.4",
@ -18353,9 +18359,9 @@
"dev": true "dev": true
}, },
"make-fetch-happen": { "make-fetch-happen": {
"version": "10.1.4", "version": "10.1.5",
"resolved": "https://registry.npmjs.org/make-fetch-happen/-/make-fetch-happen-10.1.4.tgz", "resolved": "https://registry.npmjs.org/make-fetch-happen/-/make-fetch-happen-10.1.5.tgz",
"integrity": "sha512-hU1w68PqfH7FdMgjbiziJoACY0edlbIZ0CyKnpcEruVdCjsUrN+qoenOCIayNqVBK7toSWwbDxvQlrhH0gjRdg==", "integrity": "sha512-mucOj2H0Jn/ax7H9K9T1bf0p1nn/mBFa551Os7ed9xRfLEx20aZhZeLslmRYfAaAqXZUGipcs+m5KOKvOH0XKA==",
"dev": true, "dev": true,
"requires": { "requires": {
"agentkeepalive": "^4.2.1", "agentkeepalive": "^4.2.1",
@ -18400,9 +18406,9 @@
} }
}, },
"ssri": { "ssri": {
"version": "9.0.0", "version": "9.0.1",
"resolved": "https://registry.npmjs.org/ssri/-/ssri-9.0.0.tgz", "resolved": "https://registry.npmjs.org/ssri/-/ssri-9.0.1.tgz",
"integrity": "sha512-Y1Z6J8UYnexKFN1R/hxUaYoY2LVdKEzziPmVAFKiKX8fiwvCJTVzn/xYE9TEWod5OVyNfIHHuVfIEuBClL/uJQ==", "integrity": "sha512-o57Wcn66jMQvfHG1FlYbWeZWW/dHZhJXjpIcTfXldXEk5nz5lStPo3mK0OJQfGR3RbZUlbISexbljkJzuEj/8Q==",
"dev": true, "dev": true,
"requires": { "requires": {
"minipass": "^3.1.1" "minipass": "^3.1.1"
@ -18914,9 +18920,9 @@
} }
}, },
"postcss-color-functional-notation": { "postcss-color-functional-notation": {
"version": "4.2.2", "version": "4.2.3",
"resolved": "https://registry.npmjs.org/postcss-color-functional-notation/-/postcss-color-functional-notation-4.2.2.tgz", "resolved": "https://registry.npmjs.org/postcss-color-functional-notation/-/postcss-color-functional-notation-4.2.3.tgz",
"integrity": "sha512-DXVtwUhIk4f49KK5EGuEdgx4Gnyj6+t2jBSEmxvpIK9QI40tWrpS2Pua8Q7iIZWBrki2QOaeUdEaLPPa91K0RQ==", "integrity": "sha512-5fbr6FzFzjwHXKsVnkmEYrJYG8VNNzvD1tAXaPPWR97S6rhKI5uh2yOfV5TAzhDkZoq4h+chxEplFDc8GeyFtw==",
"dev": true, "dev": true,
"requires": { "requires": {
"postcss-value-parser": "^4.2.0" "postcss-value-parser": "^4.2.0"
@ -19124,9 +19130,9 @@
} }
}, },
"postcss-nesting": { "postcss-nesting": {
"version": "10.1.6", "version": "10.1.7",
"resolved": "https://registry.npmjs.org/postcss-nesting/-/postcss-nesting-10.1.6.tgz", "resolved": "https://registry.npmjs.org/postcss-nesting/-/postcss-nesting-10.1.7.tgz",
"integrity": "sha512-8C0X0pOOShlgqYkCzB4wlWLyulos+GXFpw7r2+x7g+ROQ1RwN8MlN2NCcpNQScNBPfbjxbjwY8e25raTcEXqmg==", "integrity": "sha512-Btho5XzDTpl117SmB3tvUHP8txg5n7Ayv7vQ5m4b1zXkfs1Y52C67uZjZ746h7QvOJ+rLRg50OlhhjFW+IQY6A==",
"dev": true, "dev": true,
"requires": { "requires": {
"@csstools/selector-specificity": "1.0.0", "@csstools/selector-specificity": "1.0.0",

View file

@ -38,5 +38,5 @@
"build": "ng build --base-href ./ --configuration production", "build": "ng build --base-href ./ --configuration production",
"start": "ng serve" "start": "ng serve"
}, },
"version": "6.3.1" "version": "6.3.2"
} }

View file

@ -717,7 +717,7 @@ export class RdioScannerAdminService implements OnDestroy {
return null; 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) || []; const metas = control.value.match(/(#[A-Z]+)/g) || [];

View file

@ -132,6 +132,7 @@
<li><b>#TGAFS</b> - extract the talkgroup id like 11-061 in AFS (agency-fleet-subfleet) format.</li> <li><b>#TGAFS</b> - extract the talkgroup id like 11-061 in AFS (agency-fleet-subfleet) format.</li>
<li><b>#TGHZ</b> - extract the frequency in hertz like 119100000 and set the talkgroup id to 119100.</li> <li><b>#TGHZ</b> - extract the frequency in hertz like 119100000 and set the talkgroup id to 119100.</li>
<li><b>#TGKHZ</b> - extract the frequency in kilohertz like 119100.000 or 119100 and set the talkgroup id to 119100.</li> <li><b>#TGKHZ</b> - extract the frequency in kilohertz like 119100.000 or 119100 and set the talkgroup id to 119100.</li>
<li><b>#TGLBL</b> - extract the talkgroup label.</li>
<li><b>#TGMHZ</b> - extract the frequency in megahertz like 119.100000 or 119 and set the talkgroup id to 119100.</li> <li><b>#TGMHZ</b> - extract the frequency in megahertz like 119.100000 or 119 and set the talkgroup id to 119100.</li>
<li><b>#TIME</b> - extract the local time like 0853439&nbsp;(HHMMSS), 08-34-39&nbsp;(HH-MM-SS) or 08:34:39&nbsp;(HH:MM:SS).</li> <li><b>#TIME</b> - extract the local time like 0853439&nbsp;(HHMMSS), 08-34-39&nbsp;(HH-MM-SS) or 08:34:39&nbsp;(HH:MM:SS).</li>
<li><b>#UNIT</b> - extract the unit id like 4424001.</li> <li><b>#UNIT</b> - extract the unit id like 4424001.</li>

View file

@ -52,7 +52,7 @@ export class RdioScannerMainComponent implements OnDestroy, OnInit {
call: RdioScannerCall | undefined; call: RdioScannerCall | undefined;
callError = '0'; callError = '0';
callFrequency: string = this.formatFrequency(0); callFrequency: string = this.formatFrequency(0);
callHistory: RdioScannerCall[] = new Array<RdioScannerCall>(5); callHistory: RdioScannerCall[] | undefined;
callPrevious: RdioScannerCall | undefined; callPrevious: RdioScannerCall | undefined;
callProgress = new Date(0, 0, 0, 0, 0, 0); callProgress = new Date(0, 0, 0, 0, 0, 0);
callQueue = 0; callQueue = 0;
@ -125,7 +125,9 @@ export class RdioScannerMainComponent implements OnDestroy, OnInit {
private rdioScannerService: RdioScannerService, private rdioScannerService: RdioScannerService,
private ngChangeDetectorRef: ChangeDetectorRef, private ngChangeDetectorRef: ChangeDetectorRef,
private ngFormBuilder: FormBuilder, private ngFormBuilder: FormBuilder,
) { } ) {
this.callHistory = this.rdioScannerService.getHistory();
}
authenticate(password = this.authForm.value.password): void { authenticate(password = this.authForm.value.password): void {
this.authForm.disable(); this.authForm.disable();
@ -356,7 +358,7 @@ export class RdioScannerMainComponent implements OnDestroy, OnInit {
const password = this.authForm.get('password')?.value; const password = this.authForm.get('password')?.value;
if (password) { if (password) {
window?.localStorage?.setItem(LOCAL_STORAGE_KEY, btoa(password)); window?.localStorage?.setItem(LOCAL_STORAGE_KEY, window.btoa(password));
this.authForm.reset(); this.authForm.reset();
} }
@ -374,6 +376,10 @@ export class RdioScannerMainComponent implements OnDestroy, OnInit {
this.authForm.get('password')?.setErrors({ expired: true }); this.authForm.get('password')?.setErrors({ expired: true });
} }
if ('history' in event) {
this.callHistory = event.history || [];
}
if ('holdSys' in event) { if ('holdSys' in event) {
this.holdSys = event.holdSys || false; 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}` : ''; 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; const call = this.call || this.callPrevious;

View file

@ -73,7 +73,7 @@ export class RdioScannerService implements OnDestroy {
private beepContext: AudioContext | undefined; private beepContext: AudioContext | undefined;
private call: RdioScannerCall | undefined; private call: RdioScannerCall | undefined;
private callPrevious: RdioScannerCall | undefined; private callHistory: RdioScannerCall[] = new Array<RdioScannerCall>(5);
private callQueue: RdioScannerCall[] = []; private callQueue: RdioScannerCall[] = [];
private categories: RdioScannerCategory[] = []; private categories: RdioScannerCategory[] = [];
@ -98,6 +98,9 @@ export class RdioScannerService implements OnDestroy {
private playbackPending: number | undefined; private playbackPending: number | undefined;
private playbackRefreshing = false; private playbackRefreshing = false;
private replayDelay: Subscription | undefined;
private replayOffset = 0;
private skipDelay: Subscription | undefined; private skipDelay: Subscription | undefined;
private websocket: WebSocket | undefined; private websocket: WebSocket | undefined;
@ -114,7 +117,7 @@ export class RdioScannerService implements OnDestroy {
} }
authenticate(password: string): void { authenticate(password: string): void {
this.sendtoWebsocket(WebsocketCommand.Pin, btoa(password)); this.sendtoWebsocket(WebsocketCommand.Pin, window.btoa(password));
} }
avoid(options: RdioScannerAvoidOptions = {}): void { avoid(options: RdioScannerAvoidOptions = {}): void {
@ -153,7 +156,7 @@ export class RdioScannerService implements OnDestroy {
}); });
} else { } else {
const call = this.call || this.callPrevious; const call = this.call || this.callHistory[0];
if (call) { if (call) {
const sys = call.system; const sys = call.system;
@ -222,8 +225,12 @@ export class RdioScannerService implements OnDestroy {
}); });
} }
getHistory(): RdioScannerCall[] {
return this.callHistory;
}
holdSystem(options?: { resubscribe?: boolean }): void { holdSystem(options?: { resubscribe?: boolean }): void {
const call = this.call || this.callPrevious; const call = this.call || this.callHistory[0];
if (call && this.livefeedMap) { if (call && this.livefeedMap) {
if (this.livefeedMapPriorToHoldSystem) { if (this.livefeedMapPriorToHoldSystem) {
@ -277,7 +284,7 @@ export class RdioScannerService implements OnDestroy {
} }
holdTalkgroup(options?: { resubscribe?: boolean }): void { holdTalkgroup(options?: { resubscribe?: boolean }): void {
const call = this.call || this.callPrevious; const call = this.call || this.callHistory[0];
if (call && this.livefeedMap) { if (call && this.livefeedMap) {
if (this.livefeedMapPriorToHoldTalkgroup) { if (this.livefeedMapPriorToHoldTalkgroup) {
@ -501,7 +508,17 @@ export class RdioScannerService implements OnDestroy {
} }
replay(): void { 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 { searchCalls(options: RdioScannerSearchOptions): void {
@ -556,7 +573,11 @@ export class RdioScannerService implements OnDestroy {
} }
if (this.call) { 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; this.call = undefined;
} }
@ -750,7 +771,7 @@ export class RdioScannerService implements OnDestroy {
this.sendtoWebsocket(WebsocketCommand.Call, `${id}`, flags); 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; let queueCount = 0;
if (id && this.playbackList) { if (id && this.playbackList) {
@ -901,7 +922,7 @@ export class RdioScannerService implements OnDestroy {
return; 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 (this.playbackList.options.sort === -1) {
if (index === -1) { if (index === -1) {

View file

@ -105,6 +105,7 @@ export interface RdioScannerEvent {
call?: RdioScannerCall; call?: RdioScannerCall;
config?: RdioScannerConfig; config?: RdioScannerConfig;
expired?: boolean; expired?: boolean;
history?: RdioScannerCall[];
holdSys?: boolean; holdSys?: boolean;
holdTg?: boolean; holdTg?: boolean;
linked?: boolean; linked?: boolean;

View file

@ -42,8 +42,8 @@ ALWAYS DOWNLOAD THE LATEST VERSION OF [RDIO SCANNER](https://github.com/chuot/rd
rdio@macos ~ % mkdir rdio-scanner rdio@macos ~ % mkdir rdio-scanner
rdio@macos ~ % cd rdio-scanner rdio@macos ~ % cd rdio-scanner
rdio@macos rdio-scanner % unzip \ rdio@macos rdio-scanner % unzip \
> ~/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.1.zip Archive: /Users/rdio/Downloads/rdio-scanner-darwin-arm64-v6.3.2.zip
inflating: rdio-scanner inflating: rdio-scanner
inflating: rdio-scanner.pdf 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@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/21 08:38:06 server started
2022/05/19 08:38:06 main interface at http://macos.local:3000 2022/05/21 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 admin interface at http://macos.local:3000/admin
4. Access the administrative dashboard to finalize the configuration. 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@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/21 08:48:03 server started
2022/05/19 08:48:03 main interface at http://macos.local 2022/05/21 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 admin interface at http://macos.local/admin
## Listening on a SSL port ## 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_key_file mykey.key \
> -ssl_listen :443 > -ssl_listen :443
Rdio Scanner v6.3.1 Rdio Scanner v6.3.2
---------------------------------- ----------------------------------
2022/05/19 08:50:58 server started 2022/05/21 08:50:58 server started
2022/05/19 08:50:58 main interface at http://macos.local 2022/05/21 08:50:58 main interface at http://macos.local
2022/05/19 08:50:58 main interface at https://macos.local 2022/05/21 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 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. 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_auto_cert mydomain.com \
> -ssl_listen :443 \ > -ssl_listen :443 \
> -config_save > -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. 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@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/21 08:54:08 server started
2022/05/19 08:54:08 main interface at http://macos.local 2022/05/21 08:54:08 main interface at http://macos.local
2022/05/19 08:54:08 main interface at https://macos.local 2022/05/21 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 admin interface at https://macos.local/admin
## Install Rdio Scanner as a service ## Install Rdio Scanner as a service

View file

@ -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:~ $ mkdir rdio-scanner
rdio@pc-freebsd:~ $ cd rdio-scanner rdio@pc-freebsd:~ $ cd rdio-scanner
rdio@pc-freebsd:~/rdio-scanner $ unzip \ rdio@pc-freebsd:~/rdio-scanner $ unzip \
> ~/rdio-scanner-freebsd-amd64-v6.3.1.zip > ~/rdio-scanner-freebsd-amd64-v6.3.2.zip
Archive: ../rdio-scanner-freebsd-amd64-v6.3.1.zip Archive: ../rdio-scanner-freebsd-amd64-v6.3.2.zip
extracting: rdio-scanner extracting: rdio-scanner
extracting: rdio-scanner.pdf 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@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/21 08:16:36 server started
2022/05/19 08:16:36 main interface at http://pc-freebsd:3000 2022/05/21 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 admin interface at http://pc-freebsd:3000/admin
4. Access the administrative dashboard to finalize the configuration. 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: Password:
root@pc-freebsd:/home/rdio/rdio-scanner # ./rdio-scanner -listen :80 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/21 08:19:38 server started
2022/05/19 08:19:38 main interface at http://pc-freebsd 2022/05/21 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 admin interface at http://pc-freebsd/admin
## Listening on a SSL port ## 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_key_file mykey.key \
> -ssl_listen :443 > -ssl_listen :443
Rdio Scanner v6.3.1 Rdio Scanner v6.3.2
---------------------------------- ----------------------------------
2022/05/19 10:34:29 server started 2022/05/21 10:34:29 server started
2022/05/19 10:34:29 main interface at http://pc-freebsd 2022/05/21 10:34:29 main interface at http://pc-freebsd
2022/05/19 10:34:29 main interface at https://pc-freebsd 2022/05/21 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 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. 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_auto_cert mydomain.com \
> -ssl_listen :443 \ > -ssl_listen :443 \
> -config_save > -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. 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: Password:
root@pc-freebsd:/home/rdio/rdio-scanner # ./rdio-scanner 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/21 10:38:28 server started
2022/05/19 10:38:29 main interface at http://pc-freebsd 2022/05/21 10:38:29 main interface at http://pc-freebsd
2022/05/19 10:38:29 main interface at https://pc-freebsd 2022/05/21 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:29 admin interface at https://pc-freebsd/admin
## Install Rdio Scanner as a service ## Install Rdio Scanner as a service

View file

@ -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 ~]$ mkdir rdio-scanner
[rdio@pc-linux ~]$ cd rdio-scanner [rdio@pc-linux ~]$ cd rdio-scanner
[rdio@pc-linux rdio-scanner]$ unzip \ [rdio@pc-linux rdio-scanner]$ unzip \
> ~/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.1.zip Archive: /home/rdio/Downloads/rdio-scanner-linux-amd64-v6.3.2.zip
inflating: rdio-scanner inflating: rdio-scanner
inflating: rdio-scanner.pdf 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@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/21 09:11:48 server started
2022/05/19 09:11:48 main interface at http://pc-linux:3000 2022/05/21 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 admin interface at http://pc-linux:3000/admin
4. Access the administrative dashboard to finalize the configuration. 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 [rdio@pc-linux rdio-scanner]$ sudo ./rdio-scanner -listen :80
[sudo] password for rdio: [sudo] password for rdio:
Rdio Scanner v6.3.1 Rdio Scanner v6.3.2
---------------------------------- ----------------------------------
2022/05/19 09:14:00 server started 2022/05/21 09:14:00 server started
2022/05/19 09:14:00 main interface at http://pc-linux 2022/05/21 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 admin interface at http://pc-linux/admin
## Listening on a SSL port ## 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 > -ssl_listen :443
[sudo] password for rdio: [sudo] password for rdio:
Rdio Scanner v6.3.1 Rdio Scanner v6.3.2
---------------------------------- ----------------------------------
2022/05/19 09:16:47 server started 2022/05/21 09:16:47 server started
2022/05/19 09:16:47 main interface at http://pc-linux 2022/05/21 09:16:47 main interface at http://pc-linux
2022/05/19 09:16:47 main interface at https://pc-linux 2022/05/21 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 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. 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_auto_cert mydomain.com \
> -ssl_listen :443 \ > -ssl_listen :443 \
> -config_save > -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. 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 [rdio@pc-linux rdio-scanner]$ sudo ./rdio-scanner
[sudo] Mot de passe de rdio : [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/21 09:20:40 server started
2022/05/19 09:20:40 main interface at http://pc-linux 2022/05/21 09:20:40 main interface at http://pc-linux
2022/05/19 09:20:40 main interface at https://pc-linux 2022/05/21 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 admin interface at https://pc-linux/admin
## Install Rdio Scanner as a service ## Install Rdio Scanner as a service

View file

@ -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> cd rdio-scanner
C:\Users\rdio\rdio-scanner> tar -xvf ^ 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.exe
x rdio-scanner.pdf 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 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/21 13:48:48 server started
2022/05/19 13:48:48 main interface at http://pc-windows:3000 2022/05/21 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 admin interface at http://pc-windows:3000/admin
4. Access the administrative dashboard to finalize the configuration. 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 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/21 10:53:31 server started
2022/05/19 10:53:31 main interface at http://pc-windows 2022/05/21 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 admin interface at http://pc-windows/admin
## Listening on a SSL port ## 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_key_file meykey.key ^
-ssl_listen :443 -ssl_listen :443
Rdio Scanner v6.3.1 Rdio Scanner v6.3.2
---------------------------------- ----------------------------------
2022/05/19 11:05:43 server started 2022/05/21 11:05:43 server started
2022/05/19 11:05:43 main interface at http://pc-windows 2022/05/21 11:05:43 main interface at http://pc-windows
2022/05/19 11:05:43 main interface at https://pc-windows 2022/05/21 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 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. 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_auto_cert mydomain.com ^
-ssl_listen :443 ^ -ssl_listen :443 ^
-config_save -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. 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 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/21 11:11:28 server started
2022/05/19 11:11:28 main interface at http://pc-windows 2022/05/21 11:11:28 main interface at http://pc-windows
2022/05/19 11:11:28 main interface at https://pc-windows 2022/05/21 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 admin interface at https://pc-windows/admin
\pagebreak{} \pagebreak{}

View file

@ -178,85 +178,94 @@ func (client *Client) SendListenersCount(count int) {
} }
type Clients struct { type Clients struct {
Map map[*Client]bool Map sync.Map
mutex sync.Mutex
} }
func NewClients() *Clients { func NewClients() *Clients {
return &Clients{ return &Clients{Map: sync.Map{}}
Map: make(map[*Client]bool),
mutex: sync.Mutex{},
}
} }
func (clients *Clients) AccessCount(client *Client) int { func (clients *Clients) AccessCount(client *Client) int {
clients.mutex.Lock()
defer clients.mutex.Unlock()
count := 0 count := 0
for c := range clients.Map { clients.Map.Range(func(k interface{}, _ interface{}) bool {
if c.Access == client.Access { switch c := k.(type) {
count++ case *Client:
if c.Access == client.Access {
count++
}
} }
} return true
})
return count return count
} }
func (clients *Clients) Add(client *Client) { func (clients *Clients) Add(client *Client) {
clients.mutex.Lock() clients.Map.Store(client, true)
defer clients.mutex.Unlock()
clients.Map[client] = true
} }
func (clients *Clients) Count() int { 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) { func (clients *Clients) EmitCall(call *Call, restricted bool) {
clients.mutex.Lock() clients.Map.Range(func(k interface{}, _ interface{}) bool {
defer clients.mutex.Unlock() switch c := k.(type) {
case *Client:
for c := range clients.Map { if (!restricted || c.Access.HasAccess(call)) && c.Livefeed.IsEnabled(call) {
if (!restricted || c.Access.HasAccess(call)) && c.Livefeed.IsEnabled(call) { c.Send <- &Message{Command: MessageCommandCall, Payload: call}
c.Send <- &Message{Command: MessageCommandCall, Payload: call} }
} }
}
return true
})
} }
func (clients *Clients) EmitConfig(groups *Groups, options *Options, systems *Systems, tags *Tags, restricted bool) { func (clients *Clients) EmitConfig(groups *Groups, options *Options, systems *Systems, tags *Tags, restricted bool) {
clients.mutex.Lock() count := clients.Count()
defer clients.mutex.Unlock()
for c := range clients.Map { clients.Map.Range(func(k interface{}, _ interface{}) bool {
if restricted { switch c := k.(type) {
c.Send <- &Message{Command: MessageCommandPin} case *Client:
} else { if restricted {
c.SendConfig(groups, options, systems, tags) c.Send <- &Message{Command: MessageCommandPin}
} else {
c.SendConfig(groups, options, systems, tags)
}
if options.ShowListenersCount {
c.SendListenersCount(count)
}
} }
if options.ShowListenersCount { return true
c.SendListenersCount(len(clients.Map)) })
}
}
} }
func (clients *Clients) EmitListenersCount() { func (clients *Clients) EmitListenersCount() {
clients.mutex.Lock() count := clients.Count()
defer clients.mutex.Unlock()
for c := range clients.Map { clients.Map.Range(func(k interface{}, _ interface{}) bool {
c.SendListenersCount(len(clients.Map)) switch c := k.(type) {
} case *Client:
c.SendListenersCount(count)
}
return true
})
} }
func (clients *Clients) Remove(client *Client) { func (clients *Clients) Remove(client *Client) {
clients.mutex.Lock() clients.Map.Delete(client)
defer clients.mutex.Unlock()
delete(clients.Map, client)
close(client.Send) close(client.Send)
} }

View file

@ -326,16 +326,17 @@ func (dirwatch *Dirwatch) ingestTrunkRecorder(p string) error {
func (dirwatch *Dirwatch) parseMask(call *Call) { func (dirwatch *Dirwatch) parseMask(call *Call) {
var meta = [][]string{ var meta = [][]string{
{"date", "#DATE", `[\d-_]+`}, {"date", "#DATE", `[\d-_]+`},
{"group", "#GROUP", `[a-zA-Z0-9\ \.-]+`}, {"group", "#GROUP", `[a-zA-Z0-9\.\ -]+`},
{"hz", "#HZ", `\d+`}, {"hz", "#HZ", `\d+`},
{"khz", "#KHZ", `[\d\.]+`}, {"khz", "#KHZ", `[\d\.]+`},
{"mhz", "#MHZ", `[\d\.]+`}, {"mhz", "#MHZ", `[\d\.]+`},
{"syslbl", "#SYSLBL", `[a-zA-Z0-9\ \.-]+`}, {"syslbl", "#SYSLBL", `[a-zA-Z0-9,\.\ -]+`},
{"sys", "#SYS", `\d+`}, {"sys", "#SYS", `\d+`},
{"tag", "#TAG", `[a-zA-Z0-9\ \.-]+`}, {"tag", "#TAG", `[a-zA-Z0-9\.\ -]+`},
{"tgafs", "#TGAFS", `\d{2}-\d{3}`}, {"tgafs", "#TGAFS", `\d{2}-\d{3}`},
{"tghz", "#TGHZ", `\d+`}, {"tghz", "#TGHZ", `\d+`},
{"tgkhz", "#TGKHZ", `[\d\.]+`}, {"tgkhz", "#TGKHZ", `[\d\.]+`},
{"tglbl", "#TGLBL", `[a-zA-Z0-9,\.\ -]+`},
{"tgmhz", "#TGMHZ", `[\d\.]+`}, {"tgmhz", "#TGMHZ", `[\d\.]+`},
{"tg", "#TG", `\d+`}, {"tg", "#TG", `\d+`},
{"time", "#TIME", `[\d-:]+`}, {"time", "#TIME", `[\d-:]+`},
@ -456,7 +457,7 @@ func (dirwatch *Dirwatch) parseMask(call *Call) {
switch v := metaval["tag"].(type) { switch v := metaval["tag"].(type) {
case string: case string:
if len(v) > 0 && v != "-" { 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) { switch v := metaval["unit"].(type) {
case string: case string:
if i, err := strconv.Atoi(v); err == nil { if i, err := strconv.Atoi(v); err == nil {

View file

@ -15,4 +15,4 @@
package main package main
const Version = "6.3.1" const Version = "6.3.2"