Version 4.9.0

This commit is contained in:
Chrystian Huot 2021-01-02 07:58:18 -05:00
parent 3b0f2ac843
commit f0752640c2
48 changed files with 390 additions and 318 deletions

View file

@ -1,3 +1,11 @@
# Version 4.9
- Add basic duplicate call detection and rejection.
- Add keyboard shortcuts for the main buttons.
- Add an avoid indicator when the talkgroup is avoided.
- Add an no link indicator when websocket connection is down.
- Node modules update.
# Version 4.8
- Add downstream.system.id_as property to allow export system with a different id.

View file

@ -1,6 +1,6 @@
{
"name": "rdio-scanner-client",
"version": "4.8.5",
"version": "4.9.0",
"lockfileVersion": 1,
"requires": true,
"dependencies": {
@ -1609,9 +1609,9 @@
"dev": true
},
"@types/node": {
"version": "14.14.16",
"resolved": "https://registry.npmjs.org/@types/node/-/node-14.14.16.tgz",
"integrity": "sha512-naXYePhweTi+BMv11TgioE2/FXU4fSl29HAH1ffxVciNsH3rYXjNP2yM8wqmSm7jS20gM8TIklKiTen+1iVncw==",
"version": "14.14.19",
"resolved": "https://registry.npmjs.org/@types/node/-/node-14.14.19.tgz",
"integrity": "sha512-4nhBPStMK04rruRVtVc6cDqhu7S9GZai0fpXgPXrFpcPX6Xul8xnrjSdGB4KPBVYG/R5+fXWdCM8qBoiULWGPQ==",
"dev": true
},
"@types/parse-json": {

View file

@ -19,7 +19,7 @@
"@angular-devkit/build-angular": "~0.1100.5",
"@angular/cli": "^11.0.5",
"@angular/compiler-cli": "~11.0.5",
"@types/node": "~14.14.16",
"@types/node": "~14.14.19",
"codelyzer": "^6.0.1",
"ts-node": "~9.1.1",
"tslint": "~6.1.3",
@ -32,5 +32,5 @@
"build": "ng build --base-href ./ --prod",
"start": "ng serve"
},
"version": "4.8.5"
"version": "4.9.0"
}

View file

@ -1,6 +1,6 @@
/*
* *****************************************************************************
* Copyright (C) 2019-2020 Chrystian Huot
* Copyright (C) 2019-2021 Chrystian Huot
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by

View file

@ -1,6 +1,6 @@
/*
* *****************************************************************************
* Copyright (C) 2019-2020 Chrystian Huot
* Copyright (C) 2019-2021 Chrystian Huot
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by

View file

@ -1,6 +1,6 @@
/*
* *****************************************************************************
* Copyright (C) 2019-2020 Chrystian Huot
* Copyright (C) 2019-2021 Chrystian Huot
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by

View file

@ -1,6 +1,6 @@
/*
* *****************************************************************************
* Copyright (C) 2019-2020 Chrystian Huot
* Copyright (C) 2019-2021 Chrystian Huot
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by

View file

@ -2,14 +2,18 @@
<div class="led" [ngClass]="ledStyle"></div>
</div>
<div class="rdio-display" [ngClass]="{ idle: !dimmer }" (dblclick)="toggleFullscreen.emit()">
<div class="row margin">
<div class="row">
<div>
<span>{{ clock | date:'HH:mm' }}</span>
</div>
<div *ngIf="!linked">
<span>NO LINK</span>
</div>
<div>
<span>Q: {{ callQueue }}</span>
</div>
</div>
<div class="row small"></div>
<div class="row">
<div>
<span>{{ callSystem }}</span>
@ -26,7 +30,7 @@
<span>{{ callProgress | date:'HH:mm' }}</span>
</div>
</div>
<div class="row bold">
<div class="row big">
<span>{{ callTalkgroupName }}</span>
</div>
<div class="row">
@ -37,7 +41,7 @@
<span>TGID: {{ callTalkgroupId || 0 }}</span>
</div>
</div>
<div class="row margin">
<div class="row">
<div>
<span>E: {{ callError || 0 }} S: {{ callSpike || 0 }}</span>
</div>
@ -45,6 +49,12 @@
<span *ngIf="callUnit">UID: {{ callUnit }}</span>
</div>
</div>
<div class="row small">
<div></div>
<div>
<span class="avoid" [ngClass]="{ avoided: avoided }">AVOID</span>
</div>
</div>
<div class="wrapper">
<div class="auth" [ngClass]="{ visible: auth }">
<form class="mat-elevation-z8" autocomplete="off" [formGroup]="authForm" (ngSubmit)="authenticate()">

View file

@ -35,6 +35,22 @@
&.idle {
background: rgb(190, 190, 174);
.avoid {
color: rgb(190, 190, 174);
}
}
.avoid {
background: rgba(0, 0, 0, 0.8);
border-radius: 3px;
color: rgb(209, 238, 238);
padding: 0 3px;
visibility: hidden;
}
.avoided {
visibility: visible;
}
* {
@ -80,14 +96,16 @@
height: 20px;
justify-content: space-between;
&.bold {
&.big {
font-size: 24px;
height: 32px;
line-height: 32px;
}
&.margin {
margin-bottom: 12px;
&.small {
font-size: 12px;
height: 14px;
line-height: 14px;
}
}

View file

@ -1,6 +1,6 @@
/*
* *****************************************************************************
* Copyright (C) 2019-2020 Chrystian Huot
* Copyright (C) 2019-2021 Chrystian Huot
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
@ -17,12 +17,20 @@
* ****************************************************************************
*/
import { ChangeDetectorRef, Component, EventEmitter, OnDestroy, OnInit, Output, ViewChild } from '@angular/core';
import { ChangeDetectorRef, Component, EventEmitter, HostListener, OnDestroy, OnInit, Output, ViewChild } from '@angular/core';
import { FormBuilder } from '@angular/forms';
import { MatInput } from '@angular/material/input';
import { Subscription, timer } from 'rxjs';
import { name as appName, version } from '../../../../../package.json';
import { RdioScannerAvoidOptions, RdioScannerBeepStyle, RdioScannerCall, RdioScannerConfig, RdioScannerEvent, RdioScannerLivefeedMode } from '../rdio-scanner';
import {
RdioScannerAvoidOptions,
RdioScannerBeepStyle,
RdioScannerCall,
RdioScannerConfig,
RdioScannerEvent,
RdioScannerLivefeedMap,
RdioScannerLivefeedMode,
} from '../rdio-scanner';
import { AppRdioScannerService } from '../rdio-scanner.service';
const LOCAL_STORAGE_KEY = AppRdioScannerService.LOCAL_STORAGE_KEY + '-pin';
@ -39,6 +47,8 @@ export class AppRdioScannerMainComponent implements OnDestroy, OnInit {
auth = false;
authForm = this.ngFormBuilder.group({ password: [] });
avoided = false;
call: RdioScannerCall | undefined;
callError = '0';
callFrequency: string = this.formatFrequency(0);
@ -64,10 +74,14 @@ export class AppRdioScannerMainComponent implements OnDestroy, OnInit {
ledStyle = '';
linked = false;
livefeedOffline = true;
livefeedOnline = false;
livefeedPaused = false;
map: RdioScannerLivefeedMap = {};
playbackMode = false;
@Output() openSearchPanel = new EventEmitter<void>();
@ -104,16 +118,24 @@ export class AppRdioScannerMainComponent implements OnDestroy, OnInit {
}
}
@HostListener('document:keydown.a')
avoid(options?: RdioScannerAvoidOptions): void {
if (this.auth) {
this.authFocus();
} else {
if (options || this.call || this.callPrevious) {
this.appRdioScannerService.beep(RdioScannerBeepStyle.Activate);
const call = this.call || this.callPrevious;
if (options || call) {
this.appRdioScannerService.avoid(options);
if (call && !this.map[call.system][call.talkgroup]) {
this.appRdioScannerService.beep(RdioScannerBeepStyle.Activate);
} else {
this.appRdioScannerService.beep(RdioScannerBeepStyle.Deactivate);
}
} else {
this.appRdioScannerService.beep(RdioScannerBeepStyle.Denied);
}
@ -122,6 +144,7 @@ export class AppRdioScannerMainComponent implements OnDestroy, OnInit {
}
}
@HostListener('document:keydown.s')
holdSystem(): void {
if (this.auth) {
this.authFocus();
@ -140,6 +163,7 @@ export class AppRdioScannerMainComponent implements OnDestroy, OnInit {
}
}
@HostListener('document:keydown.t')
holdTalkgroup(): void {
if (this.auth) {
this.authFocus();
@ -158,6 +182,7 @@ export class AppRdioScannerMainComponent implements OnDestroy, OnInit {
}
}
@HostListener('document:keydown.l')
livefeed(): void {
if (this.auth) {
this.authFocus();
@ -181,7 +206,11 @@ export class AppRdioScannerMainComponent implements OnDestroy, OnInit {
this.syncClock();
}
pause(): void {
@HostListener('document:keydown.space', ['$event'])
@HostListener('document:keydown.p')
pause(event?: KeyboardEvent): void {
event?.preventDefault();
if (this.auth) {
this.authFocus();
@ -199,6 +228,7 @@ export class AppRdioScannerMainComponent implements OnDestroy, OnInit {
}
}
@HostListener('document:keydown.r')
replay(): void {
if (this.auth) {
this.authFocus();
@ -247,6 +277,7 @@ export class AppRdioScannerMainComponent implements OnDestroy, OnInit {
}
}
@HostListener('document:keydown.n')
skip(options?: { delay?: boolean }): void {
if (this.auth) {
this.authFocus();
@ -334,6 +365,10 @@ export class AppRdioScannerMainComponent implements OnDestroy, OnInit {
this.holdTg = event.holdTg || false;
}
if ('linked' in event) {
this.linked = event.linked || false;
}
if ('livefeedMode' in event && event.livefeedMode) {
this.livefeedOffline = event.livefeedMode === RdioScannerLivefeedMode.Offline;
@ -342,6 +377,10 @@ export class AppRdioScannerMainComponent implements OnDestroy, OnInit {
this.playbackMode = event.livefeedMode === RdioScannerLivefeedMode.Playback;
}
if ('map' in event) {
this.map = event.map || {};
}
if ('pause' in event) {
this.livefeedPaused = event.pause || false;
}
@ -456,6 +495,15 @@ export class AppRdioScannerMainComponent implements OnDestroy, OnInit {
}
}
const call = this.call || this.callPrevious;
if (call && this.map[call.system]) {
this.avoided = !this.map[call.system][call.talkgroup];
} else {
this.avoided = false;
}
const colors = ['blue', 'cyan', 'green', 'magenta', 'red', 'white', 'yellow'];
this.ledStyle = this.call && this.livefeedPaused ? 'on paused' : this.call ? 'on' : 'off';

View file

@ -1,6 +1,6 @@
/*
* *****************************************************************************
* Copyright (C) 2019-2020 Chrystian Huot
* Copyright (C) 2019-2021 Chrystian Huot
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
@ -58,7 +58,6 @@ export class AppRdioScannerComponent implements OnDestroy {
this.appRdioScannerService.stopLivefeed();
this.searchPanel?.close();
this.selectPanel?.close();
}
@ -66,7 +65,11 @@ export class AppRdioScannerComponent implements OnDestroy {
this.eventSubscription.unsubscribe();
}
toggleFullscreen(): void {
@HostListener('document:keydown.f')
@HostListener('document:keydown.tab', ['$event'])
toggleFullscreen(event?: KeyboardEvent): void {
event?.preventDefault();
if (document.fullscreenElement) {
const el: {
exitFullscreen?: () => void;
@ -111,4 +114,28 @@ export class AppRdioScannerComponent implements OnDestroy {
this.livefeedMode = event.livefeedMode;
}
}
@HostListener('document:keydown.arrowleft', ['$event'])
private keyLeftArrow(event?: KeyboardEvent): void {
event?.preventDefault();
if (this.selectPanel?.opened) {
this.selectPanel?.close();
} else {
this.searchPanel?.open();
}
}
@HostListener('document:keydown.arrowright', ['$event'])
private keyRightArrow(event?: KeyboardEvent): void {
event?.preventDefault();
if (this.searchPanel?.opened) {
this.searchPanel?.close();
} else {
this.selectPanel?.open();
}
}
}

View file

@ -1,6 +1,6 @@
/*
* *****************************************************************************
* Copyright (C) 2019-2020 Chrystian Huot
* Copyright (C) 2019-2021 Chrystian Huot
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by

View file

@ -1,6 +1,6 @@
/*
* *****************************************************************************
* Copyright (C) 2019-2020 Chrystian Huot
* Copyright (C) 2019-2021 Chrystian Huot
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
@ -152,7 +152,9 @@ export class AppRdioScannerService implements OnDestroy {
}
}
this.cleanQueue();
if (this.livefeedMode !== RdioScannerLivefeedMode.Playback) {
this.cleanQueue();
}
this.rebuildGroups();
@ -731,14 +733,18 @@ export class AppRdioScannerService implements OnDestroy {
this.websocket = new WebSocket(websocketUrl);
this.websocket.onclose = (ev: CloseEvent) => {
this.event.emit({ linked: false });
if (ev.code !== 1000) {
timer(2000).subscribe(() => this.reconnectWebsocket());
}
};
this.websocket.onerror = () => { };
this.websocket.onerror = () => this.event.emit({ linked: false });
this.websocket.onopen = () => {
this.event.emit({ linked: true });
if (this.websocket instanceof WebSocket) {
this.websocket.onmessage = (ev: MessageEvent) => this.parseWebsocketMessage(ev.data);
}

View file

@ -1,6 +1,6 @@
/*
* *****************************************************************************
* Copyright (C) 2019-2020 Chrystian Huot
* Copyright (C) 2019-2021 Chrystian Huot
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
@ -85,6 +85,7 @@ export interface RdioScannerEvent {
groups?: RdioScannerGroup[];
holdSys?: boolean;
holdTg?: boolean;
linked?: boolean;
livefeedMode?: RdioScannerLivefeedMode;
map?: RdioScannerLivefeedMap;
pause?: boolean;

View file

@ -1,6 +1,6 @@
/*
* *****************************************************************************
* Copyright (C) 2019-2020 Chrystian Huot
* Copyright (C) 2019-2021 Chrystian Huot
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by

View file

@ -1,6 +1,6 @@
/*
* *****************************************************************************
* Copyright (C) 2019-2020 Chrystian Huot
* Copyright (C) 2019-2021 Chrystian Huot
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by

View file

@ -1,6 +1,6 @@
/*
* *****************************************************************************
* Copyright (C) 2019-2020 Chrystian Huot
* Copyright (C) 2019-2021 Chrystian Huot
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by

View file

@ -1,6 +1,6 @@
/*
* *****************************************************************************
* Copyright (C) 2019-2020 Chrystian Huot
* Copyright (C) 2019-2021 Chrystian Huot
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by

View file

@ -1,6 +1,6 @@
/*
* *****************************************************************************
* Copyright (C) 2019-2020 Chrystian Huot
* Copyright (C) 2019-2021 Chrystian Huot
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by

View file

@ -1,6 +1,6 @@
/*
* *****************************************************************************
* Copyright (C) 2019-2020 Chrystian Huot
* Copyright (C) 2019-2021 Chrystian Huot
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by

View file

@ -2,7 +2,7 @@
##
## #############################################################################
## Copyright (C) 2019-2020 Chrystian Huot
## Copyright (C) 2019-2021 Chrystian Huot
##
## This program is free software: you can redistribute it and/or modify
## it under the terms of the GNU General Public License as published by

View file

@ -36,23 +36,23 @@ The color is _green_ by default, but can be customized in `config.json` by the s
- **UID: 4612205** - the unit ID or alias name
- History - The last five played audio files
> Note that you can double-click or double-tap the display area to switch to full-screen display (also on mobile devices).
> Note that you can double-click, double-tap the display area, press the `f key` or the `tab key` to switch to full-screen display (also on mobile devices).
### Control area
![Control Area](./images/rdio_scanner_control.png?raw=true "Control Area")
| Button | Description |
| ------------------------------------------------------------------------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| ![LIVE FEED](./images/rdio_scanner_control_livefeed_offline.png?raw=true "LIVE FEED") | When active, incoming audio will be played according to the active systems/talkgroups on the **SELECT TG** panel. The LED can also be _yellow_ if playing audio from the archive while **LIVE FEED** is inactive, this is called **offline playback mode**. Disabling **LIVE FEED** will also stop any playing audio and will clear the listening queue. |
| ![HOLD SYS](./images/rdio_scanner_control_holdsys.png?raw=true "HOLD SYS") | Temporarily maintain the current system in live feed mode. |
| ![HOLD TG](./images/rdio_scanner_control_holdtg.png?raw=true "HOLD TG") | Temporarily maintain the current talkgroup in live feed mode. |
| ![REPLAY LAST](./images/rdio_scanner_control_replay.png?raw=true "REPLAY LAST") | Replay the current audio from the beginning or the previous one if there is none active. |
| ![SKIP NEXT](./images/rdio_scanner_control_skip.png?raw=true "SKIP NEXT") | Stop the audio currently playing and play the next one in the listening queue. This is useful when playing boring or encrypted sound. |
| ![AVOID](./images/rdio_scanner_control_avoid.png?raw=true "AVOID") | Activate and deactivate the talkgroup from the current or previous audio. |
| ![SEARCH CALL](./images/rdio_scanner_control_search.png?raw=true "SEARCH CALL") | Display the archived audio panel. |
| ![PAUSE](./images/rdio_scanner_control_pause.png?raw=true "PAUSE") | Stop playing queue audio. Useful if you have to answer the phone without losing what's queued up for playing. |
| ![SELECT TG](./images/rdio_scanner_control_select.png?raw=true "SELECT TG") | Display the systems/talkgroups selection panel where you decide which audio you want to listen to in \*_LIVE FEED_ (not in offline playback mode). |
| Button | Keyboard | Description |
| ------------------------------------------------------------------------------------- | -------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| ![LIVE FEED](./images/rdio_scanner_control_livefeed_offline.png?raw=true "LIVE FEED") | l | When active, incoming audio will be played according to the active systems/talkgroups on the **SELECT TG** panel. The LED can also be _yellow_ if playing audio from the archive while **LIVE FEED** is inactive, this is called **offline playback mode**. Disabling **LIVE FEED** will also stop any playing audio and will clear the listening queue. |
| ![HOLD SYS](./images/rdio_scanner_control_holdsys.png?raw=true "HOLD SYS") | s | Temporarily maintain the current system in live feed mode. |
| ![HOLD TG](./images/rdio_scanner_control_holdtg.png?raw=true "HOLD TG") | t | Temporarily maintain the current talkgroup in live feed mode. |
| ![REPLAY LAST](./images/rdio_scanner_control_replay.png?raw=true "REPLAY LAST") | r | Replay the current audio from the beginning or the previous one if there is none active. |
| ![SKIP NEXT](./images/rdio_scanner_control_skip.png?raw=true "SKIP NEXT") | n | Stop the audio currently playing and play the next one in the listening queue. This is useful when playing boring or encrypted sound. |
| ![AVOID](./images/rdio_scanner_control_avoid.png?raw=true "AVOID") | a | Activate and deactivate the talkgroup from the current or previous audio. |
| ![SEARCH CALL](./images/rdio_scanner_control_search.png?raw=true "SEARCH CALL") | &larr; | Display the archived audio panel. |
| ![PAUSE](./images/rdio_scanner_control_pause.png?raw=true "PAUSE") | p, space | Stop playing queue audio. Useful if you have to answer the phone without losing what's queued up for playing. |
| ![SELECT TG](./images/rdio_scanner_control_select.png?raw=true "SELECT TG") | &rarr; | Display the systems/talkgroups selection panel where you decide which audio you want to listen to in \*_LIVE FEED_ (not in offline playback mode). |
### Systems/Talkgroups selection panel

View file

@ -10,5 +10,5 @@
"start": "node run",
"update": "node update"
},
"version": "4.8.5"
"version": "4.9.0"
}

2
run.js
View file

@ -1,6 +1,6 @@
/*
* *****************************************************************************
* Copyright (C) 2019-2020 Chrystian Huot
* Copyright (C) 2019-2021 Chrystian Huot
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by

View file

@ -1,6 +1,6 @@
/*
* *****************************************************************************
* Copyright (C) 2019-2020 Chrystian Huot
* Copyright (C) 2019-2021 Chrystian Huot
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by

View file

@ -1,6 +1,6 @@
/*
* *****************************************************************************
* Copyright (C) 2019-2020 Chrystian Huot
* Copyright (C) 2019-2021 Chrystian Huot
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by

View file

@ -1,6 +1,6 @@
/*
* *****************************************************************************
* Copyright (C) 2019-2020 Chrystian Huot
* Copyright (C) 2019-2021 Chrystian Huot
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by

View file

@ -1,6 +1,6 @@
/*
* *****************************************************************************
* Copyright (C) 2019-2020 Chrystian Huot
* Copyright (C) 2019-2021 Chrystian Huot
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by

View file

@ -1,6 +1,6 @@
/*
* *****************************************************************************
* Copyright (C) 2019-2020 Chrystian Huot
* Copyright (C) 2019-2021 Chrystian Huot
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
@ -492,6 +492,29 @@ class Controller extends EventEmitter {
return;
}
const dateFrom = new Date(call.dateTime);
const dateTo = new Date(call.dateTime);
dateFrom.setMilliseconds(dateFrom.getMilliseconds() - 500);
dateTo.setMilliseconds(dateTo.getMilliseconds() + 500);
const duplicateCall = await this.models.call.findOne({
where: {
dateTime: {
[Op.gte]: dateFrom,
[Op.lte]: dateTo,
},
system: call.system,
talkgroup: call.talkgroup,
},
});
if (duplicateCall) {
console.log(`NewCall: system=${call.system} talkgroup=${call.talkgroup} file=${call.audioName} Duplicate call rejected`);
return;
}
if (!this.config.disableAudioConversion && call.audioType !== 'audio/aac') {
try {
call = await this.convertCallAudio(call);

View file

@ -1,6 +1,6 @@
/*
* *****************************************************************************
* Copyright (C) 2019-2020 Chrystian Huot
* Copyright (C) 2019-2021 Chrystian Huot
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by

View file

@ -1,6 +1,6 @@
/*
* *****************************************************************************
* Copyright (C) 2019-2020 Chrystian Huot
* Copyright (C) 2019-2021 Chrystian Huot
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by

View file

@ -1,6 +1,6 @@
/*
* *****************************************************************************
* Copyright (C) 2019-2020 Chrystian Huot
* Copyright (C) 2019-2021 Chrystian Huot
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by

View file

@ -1,6 +1,6 @@
/*
* *****************************************************************************
* Copyright (C) 2019-2020 Chrystian Huot
* Copyright (C) 2019-2021 Chrystian Huot
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by

View file

@ -1,6 +1,6 @@
/*
* *****************************************************************************
* Copyright (C) 2019-2020 Chrystian Huot
* Copyright (C) 2019-2021 Chrystian Huot
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by

View file

@ -1,6 +1,6 @@
/*
* *****************************************************************************
* Copyright (C) 2019-2020 Chrystian Huot
* Copyright (C) 2019-2021 Chrystian Huot
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by

View file

@ -1,6 +1,6 @@
/*
* *****************************************************************************
* Copyright (C) 2019-2020 Chrystian Huot
* Copyright (C) 2019-2021 Chrystian Huot
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by

View file

@ -1,6 +1,6 @@
/*
* *****************************************************************************
* Copyright (C) 2019-2020 Chrystian Huot
* Copyright (C) 2019-2021 Chrystian Huot
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by

View file

@ -1,6 +1,6 @@
/*
* *****************************************************************************
* Copyright (C) 2019-2020 Chrystian Huot
* Copyright (C) 2019-2021 Chrystian Huot
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by

View file

@ -1,6 +1,6 @@
/*
* *****************************************************************************
* Copyright (C) 2019-2020 Chrystian Huot
* Copyright (C) 2019-2021 Chrystian Huot
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by

View file

@ -1,6 +1,6 @@
/*
* *****************************************************************************
* Copyright (C) 2019-2020 Chrystian Huot
* Copyright (C) 2019-2021 Chrystian Huot
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by

View file

@ -1,6 +1,6 @@
/*
* *****************************************************************************
* Copyright (C) 2019-2020 Chrystian Huot
* Copyright (C) 2019-2021 Chrystian Huot
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by

View file

@ -1,6 +1,6 @@
/*
* *****************************************************************************
* Copyright (C) 2019-2020 Chrystian Huot
* Copyright (C) 2019-2021 Chrystian Huot
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by

View file

@ -1,6 +1,6 @@
/*
* *****************************************************************************
* Copyright (C) 2019-2020 Chrystian Huot
* Copyright (C) 2019-2021 Chrystian Huot
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by

View file

@ -1,6 +1,6 @@
/*
* *****************************************************************************
* Copyright (C) 2019-2020 Chrystian Huot
* Copyright (C) 2019-2021 Chrystian Huot
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by

407
server/package-lock.json generated
View file

@ -1,6 +1,6 @@
{
"name": "rdio-scanner-server",
"version": "4.8.5",
"version": "4.9.0",
"lockfileVersion": 1,
"requires": true,
"dependencies": {
@ -67,6 +67,12 @@
}
}
},
"@discoveryjs/json-ext": {
"version": "0.5.2",
"resolved": "https://registry.npmjs.org/@discoveryjs/json-ext/-/json-ext-0.5.2.tgz",
"integrity": "sha512-HyYEUDeIj5rRQU2Hk5HTB2uHsbRQpF70nvMhVzi+VJR0X+xNEhjPui4/kBf3VeH/wqD28PT4sVOm8qqLjBrSZg==",
"dev": true
},
"@eslint/eslintrc": {
"version": "0.2.2",
"resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-0.2.2.tgz",
@ -339,18 +345,18 @@
}
},
"@webpack-cli/info": {
"version": "1.1.0",
"resolved": "https://registry.npmjs.org/@webpack-cli/info/-/info-1.1.0.tgz",
"integrity": "sha512-uNWSdaYHc+f3LdIZNwhdhkjjLDDl3jP2+XBqAq9H8DjrJUvlOKdP8TNruy1yEaDfgpAIgbSAN7pye4FEHg9tYQ==",
"version": "1.2.1",
"resolved": "https://registry.npmjs.org/@webpack-cli/info/-/info-1.2.1.tgz",
"integrity": "sha512-fLnDML5HZ5AEKzHul8xLAksoKN2cibu6MgonkUj8R9V7bbeVRkd1XbGEGWrAUNYHbX1jcqCsDEpBviE5StPMzQ==",
"dev": true,
"requires": {
"envinfo": "^7.7.3"
}
},
"@webpack-cli/serve": {
"version": "1.1.0",
"resolved": "https://registry.npmjs.org/@webpack-cli/serve/-/serve-1.1.0.tgz",
"integrity": "sha512-7RfnMXCpJ/NThrhq4gYQYILB18xWyoQcBey81oIyVbmgbc6m5ZHHyFK+DyH7pLHJf0p14MxL4mTsoPAgBSTpIg==",
"version": "1.2.1",
"resolved": "https://registry.npmjs.org/@webpack-cli/serve/-/serve-1.2.1.tgz",
"integrity": "sha512-Zj1z6AyS+vqV6Hfi7ngCjFGdHV5EwZNIHo6QfFTNe9PyW+zBU1zJ9BiOW1pmUEq950RC4+Dym6flyA/61/vhyw==",
"dev": true
},
"@xtuc/ieee754": {
@ -518,12 +524,6 @@
"sprintf-js": "~1.0.2"
}
},
"array-back": {
"version": "4.0.1",
"resolved": "https://registry.npmjs.org/array-back/-/array-back-4.0.1.tgz",
"integrity": "sha512-Z/JnaVEXv+A9xabHzN43FiiiWEE7gPCRXMrVmRm00tWbjZRul1iHm7ECzlyNq1p4a4ATXz+G9FJ3GqGOkOV3fg==",
"dev": true
},
"array-flatten": {
"version": "1.1.1",
"resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz",
@ -727,9 +727,9 @@
"integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg=="
},
"caniuse-lite": {
"version": "1.0.30001170",
"resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001170.tgz",
"integrity": "sha512-Dd4d/+0tsK0UNLrZs3CvNukqalnVTRrxb5mcQm8rHL49t7V5ZaTygwXkrq+FB+dVDf++4ri8eJnFEJAB8332PA==",
"version": "1.0.30001171",
"resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001171.tgz",
"integrity": "sha512-5Alrh8TTYPG9IH4UkRqEBZoEToWRLvPbSQokvzSz0lii8/FOWKG4keO1HoYfPWs8IF/NH/dyNPg1cmJGvV3Zlg==",
"dev": true
},
"caseless": {
@ -841,55 +841,6 @@
"delayed-stream": "~1.0.0"
}
},
"command-line-usage": {
"version": "6.1.1",
"resolved": "https://registry.npmjs.org/command-line-usage/-/command-line-usage-6.1.1.tgz",
"integrity": "sha512-F59pEuAR9o1SF/bD0dQBDluhpT4jJQNWUHEuVBqpDmCUo6gPjCi+m9fCWnWZVR/oG6cMTUms4h+3NPl74wGXvA==",
"dev": true,
"requires": {
"array-back": "^4.0.1",
"chalk": "^2.4.2",
"table-layout": "^1.0.1",
"typical": "^5.2.0"
},
"dependencies": {
"ansi-styles": {
"version": "3.2.1",
"resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz",
"integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==",
"dev": true,
"requires": {
"color-convert": "^1.9.0"
}
},
"chalk": {
"version": "2.4.2",
"resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz",
"integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==",
"dev": true,
"requires": {
"ansi-styles": "^3.2.1",
"escape-string-regexp": "^1.0.5",
"supports-color": "^5.3.0"
}
},
"color-convert": {
"version": "1.9.3",
"resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz",
"integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==",
"dev": true,
"requires": {
"color-name": "1.1.3"
}
},
"color-name": {
"version": "1.1.3",
"resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz",
"integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=",
"dev": true
}
}
},
"commander": {
"version": "2.20.3",
"resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz",
@ -1222,9 +1173,9 @@
"dev": true
},
"eslint": {
"version": "7.16.0",
"resolved": "https://registry.npmjs.org/eslint/-/eslint-7.16.0.tgz",
"integrity": "sha512-iVWPS785RuDA4dWuhhgXTNrGxHHK3a8HLSMBgbbU59ruJDubUraXN8N5rn7kb8tG6sjg74eE0RA3YWT51eusEw==",
"version": "7.17.0",
"resolved": "https://registry.npmjs.org/eslint/-/eslint-7.17.0.tgz",
"integrity": "sha512-zJk08MiBgwuGoxes5sSQhOtibZ75pz0J35XTRlZOk9xMffhpA9BTbQZxoXZzOl5zMbleShbGwtw+1kGferfFwQ==",
"dev": true,
"requires": {
"@babel/code-frame": "^7.0.0",
@ -1454,30 +1405,27 @@
"dev": true
},
"execa": {
"version": "4.1.0",
"resolved": "https://registry.npmjs.org/execa/-/execa-4.1.0.tgz",
"integrity": "sha512-j5W0//W7f8UxAn8hXVnwG8tLwdiUy4FJLcSupCg6maBYZDpyBvTApK7KyuI4bKj8KOh1r2YH+6ucuYtJv1bTZA==",
"version": "5.0.0",
"resolved": "https://registry.npmjs.org/execa/-/execa-5.0.0.tgz",
"integrity": "sha512-ov6w/2LCiuyO4RLYGdpFGjkcs0wMTgGE8PrkTHikeUy5iJekXyPIKUjifk5CsE0pt7sMCrMZ3YNqoCj6idQOnQ==",
"dev": true,
"requires": {
"cross-spawn": "^7.0.0",
"get-stream": "^5.0.0",
"human-signals": "^1.1.1",
"cross-spawn": "^7.0.3",
"get-stream": "^6.0.0",
"human-signals": "^2.1.0",
"is-stream": "^2.0.0",
"merge-stream": "^2.0.0",
"npm-run-path": "^4.0.0",
"onetime": "^5.1.0",
"signal-exit": "^3.0.2",
"npm-run-path": "^4.0.1",
"onetime": "^5.1.2",
"signal-exit": "^3.0.3",
"strip-final-newline": "^2.0.0"
},
"dependencies": {
"get-stream": {
"version": "5.2.0",
"resolved": "https://registry.npmjs.org/get-stream/-/get-stream-5.2.0.tgz",
"integrity": "sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==",
"dev": true,
"requires": {
"pump": "^3.0.0"
}
"version": "6.0.0",
"resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.0.tgz",
"integrity": "sha512-A1B3Bh1UmL0bidM/YX2NsCOTnGJePL9rO/M+Mw3m9f2gUpfokS0hi5Eah0WSUEWZdZhIZtMjkIYS7mDfOqNHbg==",
"dev": true
}
}
},
@ -1546,6 +1494,12 @@
"integrity": "sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc=",
"dev": true
},
"fastest-levenshtein": {
"version": "1.0.12",
"resolved": "https://registry.npmjs.org/fastest-levenshtein/-/fastest-levenshtein-1.0.12.tgz",
"integrity": "sha512-On2N+BpYJ15xIC974QNVuYGMOlEVt4s0EOI3wwMqOmK1fdDY+FN/zltPV8vosq4ad4c/gJ1KHScUn/6AWIgiow==",
"dev": true
},
"file-entry-cache": {
"version": "6.0.0",
"resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-6.0.0.tgz",
@ -1578,12 +1532,12 @@
}
},
"find-up": {
"version": "4.1.0",
"resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz",
"integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==",
"version": "5.0.0",
"resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz",
"integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==",
"dev": true,
"requires": {
"locate-path": "^5.0.0",
"locate-path": "^6.0.0",
"path-exists": "^4.0.0"
}
},
@ -1864,9 +1818,9 @@
"integrity": "sha512-UqBRqi4ju7T+TqGNdqAO0PaSVGsDGJUBQvk9eUWNGRY1CFGDzYhLWoM7JQEemnlvVcv/YEmc2wNW8BC24EnUsw=="
},
"helmet": {
"version": "4.2.0",
"resolved": "https://registry.npmjs.org/helmet/-/helmet-4.2.0.tgz",
"integrity": "sha512-aoiSxXMd0ks1ojYpSCFoCRzgv4rY/uB9jKStaw8PkXwsdLYa/Gq+Nc5l0soH0cwBIsLAlujPnx4HLQs+LaXCrQ=="
"version": "4.3.1",
"resolved": "https://registry.npmjs.org/helmet/-/helmet-4.3.1.tgz",
"integrity": "sha512-WsafDyKsIexB0+pUNkq3rL1rB5GVAghR68TP8ssM9DPEMzfBiluEQlVzJ/FEj6Vq2Ag3CNuxf7aYMjXrN0X49Q=="
},
"http-cache-semantics": {
"version": "4.1.0",
@ -1897,9 +1851,9 @@
}
},
"human-signals": {
"version": "1.1.1",
"resolved": "https://registry.npmjs.org/human-signals/-/human-signals-1.1.1.tgz",
"integrity": "sha512-SEQu7vl8KjNL2eoGBLF3+wAjpsNfA9XMlXAYj/3EdaNfAlxKthD1xjEQfGOUhllCGGJVNY34bRr6lPINhNjyZw==",
"version": "2.1.0",
"resolved": "https://registry.npmjs.org/human-signals/-/human-signals-2.1.0.tgz",
"integrity": "sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==",
"dev": true
},
"iconv-lite": {
@ -1952,6 +1906,54 @@
"requires": {
"pkg-dir": "^4.2.0",
"resolve-cwd": "^3.0.0"
},
"dependencies": {
"find-up": {
"version": "4.1.0",
"resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz",
"integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==",
"dev": true,
"requires": {
"locate-path": "^5.0.0",
"path-exists": "^4.0.0"
}
},
"locate-path": {
"version": "5.0.0",
"resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz",
"integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==",
"dev": true,
"requires": {
"p-locate": "^4.1.0"
}
},
"p-limit": {
"version": "2.3.0",
"resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz",
"integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==",
"dev": true,
"requires": {
"p-try": "^2.0.0"
}
},
"p-locate": {
"version": "4.1.0",
"resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz",
"integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==",
"dev": true,
"requires": {
"p-limit": "^2.2.0"
}
},
"pkg-dir": {
"version": "4.2.0",
"resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-4.2.0.tgz",
"integrity": "sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==",
"dev": true,
"requires": {
"find-up": "^4.0.0"
}
}
}
},
"imurmurhash": {
@ -2011,9 +2013,9 @@
}
},
"is-core-module": {
"version": "2.1.0",
"resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.1.0.tgz",
"integrity": "sha512-YcV7BgVMRFRua2FqQzKtTDMz8iCuLEyGKjr70q8Zm1yy2qKcurbFEd79PAdHV77oL3NrAaOVQIbMmiHQCHB7ZA==",
"version": "2.2.0",
"resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.2.0.tgz",
"integrity": "sha512-XRAfAdyyY5F5cOXn7hYQDqh2Xmii+DEfIcQGxK/uNwMHhIkPWO0g8msXcbzLe+MpGoR951MlqM/2iIlU4vKDdQ==",
"dev": true,
"requires": {
"has": "^1.0.3"
@ -2215,12 +2217,6 @@
"package-json": "^6.3.0"
}
},
"leven": {
"version": "3.1.0",
"resolved": "https://registry.npmjs.org/leven/-/leven-3.1.0.tgz",
"integrity": "sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A==",
"dev": true
},
"levn": {
"version": "0.4.1",
"resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz",
@ -2238,12 +2234,12 @@
"dev": true
},
"locate-path": {
"version": "5.0.0",
"resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz",
"integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==",
"version": "6.0.0",
"resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz",
"integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==",
"dev": true,
"requires": {
"p-locate": "^4.1.0"
"p-locate": "^5.0.0"
}
},
"lodash": {
@ -2355,16 +2351,16 @@
"integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg=="
},
"mime-db": {
"version": "1.44.0",
"resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.44.0.tgz",
"integrity": "sha512-/NOTfLrsPBVeH7YtFPgsVWveuL+4SjjYxaQ1xtM1KMFj7HdxlBlxeyNLzhyJVx7r4rZGJAZ/6lkKCitSc/Nmpg=="
"version": "1.45.0",
"resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.45.0.tgz",
"integrity": "sha512-CkqLUxUk15hofLoLyljJSrukZi8mAtgd+yE5uO4tqRZsdsAJKv0O+rFMhVDRJgozy+yG6md5KwuXhD4ocIoP+w=="
},
"mime-types": {
"version": "2.1.27",
"resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.27.tgz",
"integrity": "sha512-JIhqnCasI9yD+SsmkquHBxTSEuZdQX5BuQnS2Vc7puQQQ+8yiP5AY5uWhpdv4YL4VM5c6iliiYWPgJ/nJQLp7w==",
"version": "2.1.28",
"resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.28.tgz",
"integrity": "sha512-0TO2yJ5YHYr7M2zzT7gDU1tbwHxEUWBCLt0lscSNpcdAfFyJOVEpRYNS7EXVcTLNj/25QO8gulHC5JtTzSE2UQ==",
"requires": {
"mime-db": "1.44.0"
"mime-db": "1.45.0"
}
},
"mimic-fn": {
@ -2803,21 +2799,21 @@
"integrity": "sha512-s73XxOZ4zpt1edZYZzvhqFa6uvQc1vwUa0K0BdtIZgQMAJj9IbebH+JkgKZc9h+B05PKHLOTl4ajG1BmNrVZlw=="
},
"p-limit": {
"version": "2.3.0",
"resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz",
"integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==",
"version": "3.1.0",
"resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz",
"integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==",
"dev": true,
"requires": {
"p-try": "^2.0.0"
"yocto-queue": "^0.1.0"
}
},
"p-locate": {
"version": "4.1.0",
"resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz",
"integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==",
"version": "5.0.0",
"resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz",
"integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==",
"dev": true,
"requires": {
"p-limit": "^2.2.0"
"p-limit": "^3.0.2"
}
},
"p-try": {
@ -2957,12 +2953,12 @@
"integrity": "sha512-q0M/9eZHzmr0AulXyPwNfZjtwZ/RBZlbN3K3CErVrk50T2ASYI7Bye0EvekFY3IP1Nt2DHu0re+V2ZHIpMkuWg=="
},
"pkg-dir": {
"version": "4.2.0",
"resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-4.2.0.tgz",
"integrity": "sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==",
"version": "5.0.0",
"resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-5.0.0.tgz",
"integrity": "sha512-NPE8TDbzl/3YQYY7CSS228s3g2ollTFnc+Qi3tqmqJp9Vg2ovUpixcJEo2HJScN2Ez+kEaal6y70c0ehqJBJeA==",
"dev": true,
"requires": {
"find-up": "^4.0.0"
"find-up": "^5.0.0"
}
},
"please-upgrade-node": {
@ -3134,12 +3130,6 @@
"resolve": "^1.9.0"
}
},
"reduce-flatten": {
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/reduce-flatten/-/reduce-flatten-2.0.0.tgz",
"integrity": "sha512-EJ4UNY/U1t2P/2k6oqotuX2Cc3T6nxJwsM0N0asT7dhrtH1ltUxDn4NalSYmPE2rCkVpcf/X6R0wDwcFpzhd4w==",
"dev": true
},
"regexpp": {
"version": "3.1.0",
"resolved": "https://registry.npmjs.org/regexpp/-/regexpp-3.1.0.tgz",
@ -3215,6 +3205,12 @@
}
}
},
"require-from-string": {
"version": "2.0.2",
"resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz",
"integrity": "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==",
"dev": true
},
"resolve": {
"version": "1.19.0",
"resolved": "https://registry.npmjs.org/resolve/-/resolve-1.19.0.tgz",
@ -3654,27 +3650,35 @@
}
},
"table": {
"version": "6.0.4",
"resolved": "https://registry.npmjs.org/table/-/table-6.0.4.tgz",
"integrity": "sha512-sBT4xRLdALd+NFBvwOz8bw4b15htyythha+q+DVZqy2RS08PPC8O2sZFgJYEY7bJvbCFKccs+WIZ/cd+xxTWCw==",
"version": "6.0.6",
"resolved": "https://registry.npmjs.org/table/-/table-6.0.6.tgz",
"integrity": "sha512-OInCtPmDNieVBkVFi6C8RwU2S2H0h8mF3e3TQK4nreaUNCpooQUkI+A/KuEkm5FawfhWIfNqG+qfelVVR+V00g==",
"dev": true,
"requires": {
"ajv": "^6.12.4",
"ajv": "^7.0.2",
"lodash": "^4.17.20",
"slice-ansi": "^4.0.0",
"string-width": "^4.2.0"
}
},
"table-layout": {
"version": "1.0.1",
"resolved": "https://registry.npmjs.org/table-layout/-/table-layout-1.0.1.tgz",
"integrity": "sha512-dEquqYNJiGwY7iPfZ3wbXDI944iqanTSchrACLL2nOB+1r+h1Nzu2eH+DuPPvWvm5Ry7iAPeFlgEtP5bIp5U7Q==",
"dev": true,
"requires": {
"array-back": "^4.0.1",
"deep-extend": "~0.6.0",
"typical": "^5.2.0",
"wordwrapjs": "^4.0.0"
},
"dependencies": {
"ajv": {
"version": "7.0.3",
"resolved": "https://registry.npmjs.org/ajv/-/ajv-7.0.3.tgz",
"integrity": "sha512-R50QRlXSxqXcQP5SvKUrw8VZeypvo12i2IX0EeR5PiZ7bEKeHWgzgo264LDadUsCU42lTJVhFikTqJwNeH34gQ==",
"dev": true,
"requires": {
"fast-deep-equal": "^3.1.1",
"json-schema-traverse": "^1.0.0",
"require-from-string": "^2.0.2",
"uri-js": "^4.2.2"
}
},
"json-schema-traverse": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz",
"integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==",
"dev": true
}
}
},
"tapable": {
@ -3730,17 +3734,6 @@
"serialize-javascript": "^5.0.1",
"source-map": "^0.6.1",
"terser": "^5.3.8"
},
"dependencies": {
"p-limit": {
"version": "3.1.0",
"resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz",
"integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==",
"dev": true,
"requires": {
"yocto-queue": "^0.1.0"
}
}
}
},
"text-table": {
@ -3847,12 +3840,6 @@
"is-typedarray": "^1.0.0"
}
},
"typical": {
"version": "5.2.0",
"resolved": "https://registry.npmjs.org/typical/-/typical-5.2.0.tgz",
"integrity": "sha512-dvdQgNDNJo+8B2uBQoqdb11eUCE1JQXhvjC/CZtgvZseVd5TYMXnq0+vuUemXbd/Se29cTaUuPX3YIc2xgbvIg==",
"dev": true
},
"umzug": {
"version": "2.3.0",
"resolved": "https://registry.npmjs.org/umzug/-/umzug-2.3.0.tgz",
@ -3971,9 +3958,9 @@
}
},
"webpack": {
"version": "5.11.0",
"resolved": "https://registry.npmjs.org/webpack/-/webpack-5.11.0.tgz",
"integrity": "sha512-ubWv7iP54RqAC/VjixgpnLLogCFbAfSOREcSWnnOlZEU8GICC5eKmJSu6YEnph2N2amKqY9rvxSwgyHxVqpaRw==",
"version": "5.11.1",
"resolved": "https://registry.npmjs.org/webpack/-/webpack-5.11.1.tgz",
"integrity": "sha512-tNUIdAmYJv+nupRs/U/gqmADm6fgrf5xE+rSlSsf2PgsGO7j2WG7ccU6AWNlOJlHFl+HnmXlBmHIkiLf+XA9mQ==",
"dev": true,
"requires": {
"@types/eslint-scope": "^3.7.0",
@ -4007,80 +3994,34 @@
"resolved": "https://registry.npmjs.org/acorn/-/acorn-8.0.4.tgz",
"integrity": "sha512-XNP0PqF1XD19ZlLKvB7cMmnZswW4C/03pRHgirB30uSJTaS3A3V1/P4sS3HPvFmjoriPCJQs+JDSbm4bL1TxGQ==",
"dev": true
},
"find-up": {
"version": "5.0.0",
"resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz",
"integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==",
"dev": true,
"requires": {
"locate-path": "^6.0.0",
"path-exists": "^4.0.0"
}
},
"locate-path": {
"version": "6.0.0",
"resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz",
"integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==",
"dev": true,
"requires": {
"p-locate": "^5.0.0"
}
},
"p-limit": {
"version": "3.1.0",
"resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz",
"integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==",
"dev": true,
"requires": {
"yocto-queue": "^0.1.0"
}
},
"p-locate": {
"version": "5.0.0",
"resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz",
"integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==",
"dev": true,
"requires": {
"p-limit": "^3.0.2"
}
},
"pkg-dir": {
"version": "5.0.0",
"resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-5.0.0.tgz",
"integrity": "sha512-NPE8TDbzl/3YQYY7CSS228s3g2ollTFnc+Qi3tqmqJp9Vg2ovUpixcJEo2HJScN2Ez+kEaal6y70c0ehqJBJeA==",
"dev": true,
"requires": {
"find-up": "^5.0.0"
}
}
}
},
"webpack-cli": {
"version": "4.2.0",
"resolved": "https://registry.npmjs.org/webpack-cli/-/webpack-cli-4.2.0.tgz",
"integrity": "sha512-EIl3k88vaF4fSxWSgtAQR+VwicfLMTZ9amQtqS4o+TDPW9HGaEpbFBbAZ4A3ZOT5SOnMxNOzROsSTPiE8tBJPA==",
"version": "4.3.1",
"resolved": "https://registry.npmjs.org/webpack-cli/-/webpack-cli-4.3.1.tgz",
"integrity": "sha512-/F4+9QNZM/qKzzL9/06Am8NXIkGV+/NqQ62Dx7DSqudxxpAgBqYn6V7+zp+0Y7JuWksKUbczRY3wMTd+7Uj6OA==",
"dev": true,
"requires": {
"@webpack-cli/info": "^1.1.0",
"@webpack-cli/serve": "^1.1.0",
"@discoveryjs/json-ext": "^0.5.0",
"@webpack-cli/info": "^1.2.1",
"@webpack-cli/serve": "^1.2.1",
"colorette": "^1.2.1",
"command-line-usage": "^6.1.0",
"commander": "^6.2.0",
"enquirer": "^2.3.6",
"execa": "^4.1.0",
"execa": "^5.0.0",
"fastest-levenshtein": "^1.0.12",
"import-local": "^3.0.2",
"interpret": "^2.2.0",
"leven": "^3.1.0",
"rechoir": "^0.7.0",
"v8-compile-cache": "^2.2.0",
"webpack-merge": "^4.2.2"
},
"dependencies": {
"commander": {
"version": "6.2.0",
"resolved": "https://registry.npmjs.org/commander/-/commander-6.2.0.tgz",
"integrity": "sha512-zP4jEKbe8SHzKJYQmq8Y9gYjtO/POJLgIdKgV7B9qNmABVFVc+ctqSX6iXh4mCpJfRBOabiZ2YKPg8ciDw6C+Q==",
"version": "6.2.1",
"resolved": "https://registry.npmjs.org/commander/-/commander-6.2.1.tgz",
"integrity": "sha512-U7VdrJFnJgo4xjrHpTzu0yrHPGImdsmD95ZlgYSEajAn2JKzDhDTPG9kBTefmObL2w/ngeZnilk+OV9CG3d7UA==",
"dev": true
}
}
@ -4173,16 +4114,6 @@
"integrity": "sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ==",
"dev": true
},
"wordwrapjs": {
"version": "4.0.0",
"resolved": "https://registry.npmjs.org/wordwrapjs/-/wordwrapjs-4.0.0.tgz",
"integrity": "sha512-Svqw723a3R34KvsMgpjFBYCgNOSdcW3mQFK4wIfhGQhtaFVOJmdYoXgi63ne3dTlWgatVcUc7t4HtQ/+bUVIzQ==",
"dev": true,
"requires": {
"reduce-flatten": "^2.0.0",
"typical": "^5.0.0"
}
},
"wrappy": {
"version": "1.0.2",
"resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz",
@ -4200,9 +4131,9 @@
}
},
"ws": {
"version": "7.4.1",
"resolved": "https://registry.npmjs.org/ws/-/ws-7.4.1.tgz",
"integrity": "sha512-pTsP8UAfhy3sk1lSk/O/s4tjD0CRwvMnzvwr4OKGX7ZvqZtUyx4KIJB5JWbkykPoc55tixMGgTNoh3k4FkNGFQ=="
"version": "7.4.2",
"resolved": "https://registry.npmjs.org/ws/-/ws-7.4.2.tgz",
"integrity": "sha512-T4tewALS3+qsrpGI/8dqNMLIVdq/g/85U98HPMa6F0m6xTbvhXU6RCQLqPH3+SlomNV/LdY6RXEbBpMH6EOJnA=="
},
"xdg-basedir": {
"version": "4.0.0",

View file

@ -6,9 +6,9 @@
"dotenv": "^8.2.0",
"express": "^4.17.1",
"form-data": "^3.0.0",
"helmet": "^4.2.0",
"helmet": "^4.3.1",
"mariadb": "^2.5.2",
"mime-types": "^2.1.27",
"mime-types": "^2.1.28",
"multer": "^1.4.2",
"mysql2": "^2.2.5",
"nodemon": "^2.0.6",
@ -17,12 +17,12 @@
"sqlite3": "^5.0.0",
"umzug": "^2.3.0",
"uuid": "^8.3.2",
"ws": "^7.4.1"
"ws": "^7.4.2"
},
"devDependencies": {
"eslint": "^7.16.0",
"webpack": "^5.11.0",
"webpack-cli": "^4.2.0",
"eslint": "^7.17.0",
"webpack": "^5.11.1",
"webpack-cli": "^4.3.1",
"webpack-node-externals": "^2.5.2"
},
"license": "LICENSE",
@ -39,5 +39,5 @@
"build": "webpack",
"start": "nodemon"
},
"version": "4.8.5"
"version": "4.9.0"
}

View file

@ -1,6 +1,6 @@
/*
* *****************************************************************************
* Copyright (C) 2019-2020 Chrystian Huot
* Copyright (C) 2019-2021 Chrystian Huot
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by

View file

@ -1,6 +1,6 @@
/*
* *****************************************************************************
* Copyright (C) 2019-2020 Chrystian Huot
* Copyright (C) 2019-2021 Chrystian Huot
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by