mirror of
https://github.com/janishutz/MusicPlayerV2.git
synced 2025-11-25 04:54:23 +00:00
Compare commits
5 Commits
669cc620bf
...
master
| Author | SHA1 | Date | |
|---|---|---|---|
| 576b6f9490 | |||
| e0dcfa6964 | |||
|
|
69d2db8c37 | ||
| 9a347c9206 | |||
| 60ea4669ab |
@@ -1,19 +1,193 @@
|
||||
{
|
||||
"ages": {
|
||||
"below": "red",
|
||||
"16-18": "",
|
||||
"18+": ""
|
||||
"below": "Orange",
|
||||
"16-18": "Yellow",
|
||||
"18+": "Turquoise"
|
||||
},
|
||||
"offering": {
|
||||
"test": {
|
||||
"name": "Test drink",
|
||||
"price": 700,
|
||||
"id": "test"
|
||||
"big-bar": {
|
||||
"offering": {
|
||||
"softdrinks": {
|
||||
"name": "Softdrinks",
|
||||
"price": 400,
|
||||
"id": "softdrinks"
|
||||
},
|
||||
"energy": {
|
||||
"name": "Energy",
|
||||
"price": 400,
|
||||
"id": "energy"
|
||||
},
|
||||
"mate": {
|
||||
"name": "Mate",
|
||||
"price": 500,
|
||||
"id": "mate",
|
||||
"depot": 200
|
||||
},
|
||||
"sparkly-water": {
|
||||
"name": "Mineralwasser mit",
|
||||
"price": 300,
|
||||
"id": "sparkly-water",
|
||||
"showLine": true
|
||||
},
|
||||
"rose": {
|
||||
"name": "Rosé",
|
||||
"price": 1500,
|
||||
"id": "rose",
|
||||
"depot": 200
|
||||
},
|
||||
"red": {
|
||||
"name": "Rotwein",
|
||||
"price": 2000,
|
||||
"id": "red",
|
||||
"depot": 200
|
||||
},
|
||||
"wine-glasses": {
|
||||
"name": "Weingläser",
|
||||
"price": 0,
|
||||
"id": "wine-glasses",
|
||||
"depot": 200
|
||||
},
|
||||
"appenzeller": {
|
||||
"name": "Appenzeller Vollmond",
|
||||
"price": 500,
|
||||
"id": "appenzeller",
|
||||
"depot": 200
|
||||
},
|
||||
"feldschloesschen": {
|
||||
"name": "Feldschlösschen",
|
||||
"price": 500,
|
||||
"id": "feldschloesschen",
|
||||
"depot": 200
|
||||
},
|
||||
"sommersby": {
|
||||
"name": "Sommersby",
|
||||
"price": 500,
|
||||
"id": "sommersby",
|
||||
"depot": 200
|
||||
},
|
||||
"jever-fun": {
|
||||
"name": "Jever Fun",
|
||||
"price": 400,
|
||||
"id": "jever-fun",
|
||||
"depot": 200
|
||||
},
|
||||
"trojka-ice": {
|
||||
"name": "Trojka Ice",
|
||||
"price": 600,
|
||||
"id": "trojka-ice",
|
||||
"depot": 200,
|
||||
"showLine": true
|
||||
},
|
||||
"vodka-red-energy": {
|
||||
"name": "Vodka Rot Energy",
|
||||
"price": 800,
|
||||
"id": "vodka-red-energy"
|
||||
},
|
||||
"vodka-green-citro": {
|
||||
"name": "Vodka Grün Citro",
|
||||
"price": 800,
|
||||
"id": "vodka-green-citro"
|
||||
},
|
||||
"vodka-white-energy": {
|
||||
"name": "Vodka White Energy",
|
||||
"price": 900,
|
||||
"id": "vodka-white-energy"
|
||||
},
|
||||
"gin-tonic": {
|
||||
"name": "Gin Tonic",
|
||||
"price": 900,
|
||||
"id": "gin-tonic"
|
||||
},
|
||||
"rum-cola": {
|
||||
"name": "Rum Cola",
|
||||
"price": 900,
|
||||
"id": "rum-cola"
|
||||
},
|
||||
"whiskey-cola": {
|
||||
"name": "Whiskey Cola",
|
||||
"price": 900,
|
||||
"id": "whiskey-cola"
|
||||
},
|
||||
"mate-mit-schuss": {
|
||||
"name": "Mate mit Schuss",
|
||||
"price": 1200,
|
||||
"id": "mate-mit-schuss",
|
||||
"depot": 200,
|
||||
"showLine": true
|
||||
},
|
||||
"poseidon": {
|
||||
"name": "Poseidon",
|
||||
"price": 900,
|
||||
"id": "poseidon"
|
||||
},
|
||||
"arielle": {
|
||||
"name": "Arielle",
|
||||
"price": 900,
|
||||
"id": "arielle"
|
||||
},
|
||||
"pearl-driver": {
|
||||
"name": "Pearl Driver",
|
||||
"price": 400,
|
||||
"id": "pearl-driver"
|
||||
}
|
||||
},
|
||||
"name": "Poseidon's Quelle",
|
||||
"id": "big-bar"
|
||||
},
|
||||
"test-2": {
|
||||
"name": "Test drink 2",
|
||||
"price": 500,
|
||||
"id": "test-2"
|
||||
"small-bar": {
|
||||
"offering": {
|
||||
"softdrinks": {
|
||||
"name": "Softdrinks (Alle)",
|
||||
"price": 300,
|
||||
"id": "softdrinks",
|
||||
"showLine": true
|
||||
},
|
||||
"appenzeller": {
|
||||
"name": "Appenzeller Vollmond",
|
||||
"price": 500,
|
||||
"id": "appenzeller",
|
||||
"depot": 200
|
||||
},
|
||||
"feldschloesschen": {
|
||||
"name": "Feldschlösschen",
|
||||
"price": 500,
|
||||
"id": "feldschloesschen",
|
||||
"depot": 200
|
||||
},
|
||||
"sommersby": {
|
||||
"name": "Sommersby",
|
||||
"price": 500,
|
||||
"id": "sommersby",
|
||||
"depot": 200
|
||||
},
|
||||
"jever-fun": {
|
||||
"name": "Jever Fun",
|
||||
"price": 400,
|
||||
"id": "jever-fun",
|
||||
"depot": 200,
|
||||
"showLine": true
|
||||
},
|
||||
"rose": {
|
||||
"name": "Rosé",
|
||||
"price": 1500,
|
||||
"id": "rose",
|
||||
"depot": 200
|
||||
},
|
||||
"red": {
|
||||
"name": "Rotwein",
|
||||
"price": 2000,
|
||||
"id": "red",
|
||||
"depot": 200
|
||||
},
|
||||
"wine-glasses": {
|
||||
"name": "Weingläser",
|
||||
"price": 0,
|
||||
"id": "wine-glasses",
|
||||
"depot": 200
|
||||
}
|
||||
},
|
||||
"name": "Seepferdchenbar",
|
||||
"id": "small-bar"
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -8,7 +8,10 @@
|
||||
<!-- TODO: Make prettier -->
|
||||
</div>
|
||||
<div v-else-if="!$props.isLoggedIn" class="not-logged-in">
|
||||
<p>You are not logged into Apple Music. We therefore can't show you your playlists. <a href="" title="Refreshes the page, allowing you to log in">Change that</a></p>
|
||||
<p>
|
||||
You are not logged into Apple Music. We therefore can't show you your playlists.
|
||||
<a href="" title="Refreshes the page, allowing you to log in">Change that</a>
|
||||
</p>
|
||||
<p>Use the button below to load songs from your local disk</p>
|
||||
<input
|
||||
id="pl-loader"
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
// These functions handle connections to the backend with socket.io
|
||||
|
||||
import {
|
||||
io, type Socket
|
||||
type Socket, io
|
||||
} from 'socket.io-client';
|
||||
import type {
|
||||
SSEMap
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
// These functions handle connections to the backend with socket.io
|
||||
|
||||
import {
|
||||
io, type Socket
|
||||
type Socket, io
|
||||
} from 'socket.io-client';
|
||||
import type {
|
||||
SSEMap
|
||||
@@ -57,7 +57,8 @@ class NotificationHandler {
|
||||
*/
|
||||
connect ( roomName: string, useAntiTamper: boolean ): Promise<void> {
|
||||
return new Promise( ( resolve, reject ) => {
|
||||
fetch( localStorage.getItem( 'url' ) + '/createRoomToken?roomName=' + roomName + '&useAntiTamper=' + useAntiTamper, {
|
||||
fetch( localStorage.getItem( 'url' ) + '/createRoomToken?roomName='
|
||||
+ roomName + '&useAntiTamper=' + useAntiTamper, {
|
||||
'credentials': 'include'
|
||||
} ).then( res => {
|
||||
if ( res.status === 200 ) {
|
||||
@@ -110,7 +111,8 @@ class NotificationHandler {
|
||||
'credentials': 'include'
|
||||
} ).then( res => {
|
||||
if ( res.status === 200 ) {
|
||||
this.eventSource = new EventSource( localStorage.getItem( 'url' ) + '/socket/connection?room=' + this.roomName, {
|
||||
this.eventSource = new EventSource( localStorage.getItem( 'url' )
|
||||
+ '/socket/connection?room=' + this.roomName, {
|
||||
'withCredentials': true
|
||||
} );
|
||||
|
||||
@@ -118,7 +120,8 @@ class NotificationHandler {
|
||||
this.isConnected = true;
|
||||
this.connectionWasSuccessful = true;
|
||||
this.reconnectRetryCount = 0;
|
||||
console.log( '[ SSE Connection ] - ' + new Date().toISOString() + ': Connection successfully established!' );
|
||||
console.log( '[ SSE Connection ] - '
|
||||
+ new Date().toISOString() + ': Connection successfully established!' );
|
||||
resolve();
|
||||
};
|
||||
|
||||
@@ -135,8 +138,10 @@ class NotificationHandler {
|
||||
this.isConnected = false;
|
||||
this.eventSource?.close();
|
||||
this.openConnectionsCount -= 1;
|
||||
console.debug( e );
|
||||
console.log( '[ SSE Connection ] - ' + new Date().toISOString() + ': Reconnecting due to connection error!' );
|
||||
console.debug( '[ SSE Connection ] - Error encountered: ', e );
|
||||
console.log( '[ SSE Connection ] - '
|
||||
+ new Date().toISOString()
|
||||
+ ': Reconnecting due to connection error!' );
|
||||
|
||||
this.eventSource = undefined;
|
||||
|
||||
@@ -146,7 +151,8 @@ class NotificationHandler {
|
||||
}, 1000 * this.reconnectRetryCount );
|
||||
}
|
||||
};
|
||||
} else if ( res.status === 403 || res.status === 401 || res.status === 404 || res.status === 402 ) {
|
||||
} else if ( res.status === 403 || res.status === 401
|
||||
|| res.status === 404 || res.status === 402 ) {
|
||||
document.dispatchEvent( new Event( 'musicplayer:autherror' ) );
|
||||
reject( 'ERR_UNAUTHORIZED' );
|
||||
} else {
|
||||
@@ -158,7 +164,8 @@ class NotificationHandler {
|
||||
reject( 'ERR_ROOM_CONNECTING' );
|
||||
} else {
|
||||
this.openConnectionsCount -= 1;
|
||||
console.log( '[ SSE Connection ] - ' + new Date().toISOString() + ': Reconnecting due to severe connection error!' );
|
||||
console.log( '[ SSE Connection ] - ' + new Date().toISOString()
|
||||
+ ': Reconnecting due to severe connection error!' );
|
||||
|
||||
this.eventSource = undefined;
|
||||
|
||||
|
||||
@@ -5,22 +5,32 @@
|
||||
} from 'vue';
|
||||
|
||||
interface FullConfig {
|
||||
'offering': BarConfig,
|
||||
'ages': Ages
|
||||
'offering': Bars;
|
||||
'ages': Ages;
|
||||
}
|
||||
|
||||
interface Bars {
|
||||
[name: string]: {
|
||||
'offering': BarConfig;
|
||||
'name': string;
|
||||
'id': string;
|
||||
}
|
||||
}
|
||||
|
||||
interface Ages {
|
||||
'18+': string,
|
||||
'16-18': string
|
||||
'18+': string;
|
||||
'16-18': string;
|
||||
}
|
||||
|
||||
interface BarConfig {
|
||||
[id: string]: Offer;
|
||||
[id: string]: Offer
|
||||
}
|
||||
|
||||
interface Offer {
|
||||
'name': string;
|
||||
'price': number; // In cents
|
||||
'depot'?: number; // In cents
|
||||
'showLine'?: boolean;
|
||||
'id': string;
|
||||
}
|
||||
|
||||
@@ -33,25 +43,38 @@
|
||||
'16-18': '',
|
||||
'below': ''
|
||||
} );
|
||||
const offering: Ref<BarConfig> = ref( {} );
|
||||
const offering: Ref<Bars> = ref( {} );
|
||||
const selection: Ref<Selection> = ref( {} );
|
||||
const selectedBar: Ref<string> = ref( '' );
|
||||
const enableDepotReminder = ref( true );
|
||||
|
||||
fetch( '/bar-config.json' ).then( res => {
|
||||
let cashinInDepot = false;
|
||||
|
||||
fetch( '/bar-config.json', {
|
||||
'cache': 'no-store'
|
||||
} ).then( res => {
|
||||
if ( res.status === 200 ) {
|
||||
res.json().then( json => {
|
||||
const data: FullConfig = json;
|
||||
|
||||
offering.value = data.offering;
|
||||
ages.value = data.ages;
|
||||
reset();
|
||||
} );
|
||||
} else {
|
||||
alert( 'Failed to load' );
|
||||
}
|
||||
} );
|
||||
|
||||
const reset = () => {
|
||||
const keys = Object.keys( offering.value );
|
||||
const reset = ( skipCheck = true ) => {
|
||||
if ( !skipCheck && !Object.keys( offering.value ).includes( selectedBar.value ) ) return;
|
||||
|
||||
if ( cashinInDepot && enableDepotReminder.value ) alert( 'Hand out chips for depot' );
|
||||
|
||||
cashinInDepot = false;
|
||||
|
||||
const keys = Object.keys( offering.value[ selectedBar.value ].offering );
|
||||
|
||||
selection.value = {};
|
||||
|
||||
keys.forEach( val => {
|
||||
selection.value[ val ] = 0;
|
||||
@@ -62,14 +85,22 @@
|
||||
const keys = Object.keys( selection.value );
|
||||
|
||||
let totalPrice = 0;
|
||||
let totalDepot = 0;
|
||||
|
||||
for ( let i = 0; i < keys.length; i++ ) {
|
||||
const o = selection.value[ keys[ i ] ];
|
||||
|
||||
totalPrice += o * offering.value[ keys[ i ] ].price;
|
||||
totalPrice += o * offering.value[ selectedBar.value ].offering[ keys[ i ] ].price;
|
||||
totalDepot += o * ( offering.value[ selectedBar.value ].offering[ keys[ i ] ].depot ?? 0 );
|
||||
}
|
||||
|
||||
return totalPrice / 100;
|
||||
if ( totalDepot > 0 ) {
|
||||
cashinInDepot = true;
|
||||
}
|
||||
|
||||
totalPrice += totalDepot;
|
||||
|
||||
return ( totalPrice / 100 ) + ( totalDepot ? ` (Depot = ${ totalDepot })` : '' );
|
||||
} );
|
||||
|
||||
const changeValue = ( id: string, amount: number ) => {
|
||||
@@ -83,17 +114,40 @@
|
||||
|
||||
<template>
|
||||
<div class="bar-utility">
|
||||
<h1>Bar utility</h1>
|
||||
<div style="margin: 0">
|
||||
<label> Depot chips reminder</label>
|
||||
<input v-model="enableDepotReminder" type="checkbox">
|
||||
</div>
|
||||
<h1 style="margin: 15px;">
|
||||
Bar utility
|
||||
</h1>
|
||||
<div>
|
||||
<label for="bar-select">Select bar </label>
|
||||
<select id="bar-select" v-model="selectedBar" @change="reset()">
|
||||
<option v-for="bar in Object.values( offering )" :key="bar.id" :value="bar.id">
|
||||
{{ bar.name }}
|
||||
</option>
|
||||
</select>
|
||||
<button @click="reset( false )">
|
||||
Reset
|
||||
</button>
|
||||
</div>
|
||||
<p>Check ages! (18+: {{ ages[ '18+' ] }}, 16-18: {{ ages[ '16-18' ] }})</p>
|
||||
<button @click="reset()">
|
||||
Reset
|
||||
</button>
|
||||
<p>Total: CHF {{ total }}</p>
|
||||
<table class="offering-wrapper">
|
||||
<p v-if="Object.keys( offering ).includes( selectedBar )">
|
||||
Total: CHF {{ total }}
|
||||
</p>
|
||||
<table v-if="Object.keys( offering ).includes( selectedBar )" class="offering-wrapper">
|
||||
<tbody>
|
||||
<tr v-for="offer in offering" :key="offer.id" class="offering">
|
||||
<tr
|
||||
v-for="offer in offering[ selectedBar ].offering"
|
||||
:key="offer.id"
|
||||
:class="[ 'offering', offer.showLine ? 'show-line' : '' ]"
|
||||
>
|
||||
<td>
|
||||
<p>{{ offer.name }} (CHF {{ offer.price / 100 }})</p>
|
||||
<p>
|
||||
{{ offer.name }} (CHF {{ offer.price / 100 }}{{
|
||||
offer.depot ? ' + ' + ( offer.depot / 100 ) : '' }})
|
||||
</p>
|
||||
</td>
|
||||
<td>
|
||||
<div>
|
||||
@@ -109,6 +163,9 @@
|
||||
</tr>
|
||||
</tbody>
|
||||
</table>
|
||||
<p v-if="Object.keys( offering ).includes( selectedBar )">
|
||||
Total: CHF {{ total }}
|
||||
</p>
|
||||
</div>
|
||||
</template>
|
||||
|
||||
@@ -120,7 +177,16 @@
|
||||
flex-direction: column;
|
||||
|
||||
>.offering-wrapper {
|
||||
border-collapse: collapse;
|
||||
margin-bottom: 5vh;
|
||||
|
||||
.offering {
|
||||
&.show-line {
|
||||
>td {
|
||||
border-bottom: solid 1px black;
|
||||
}
|
||||
}
|
||||
|
||||
>td {
|
||||
padding: 5px;
|
||||
p {
|
||||
|
||||
@@ -21,6 +21,7 @@ import storeSDK from '@janishutz/store-sdk';
|
||||
import sdk from '@janishutz/login-sdk-server';
|
||||
import sse from './sse';
|
||||
import socket from './socket';
|
||||
import logger from './logger';
|
||||
|
||||
// const isFossVersion = true;
|
||||
//
|
||||
@@ -42,15 +43,13 @@ const run = () => {
|
||||
const httpServer = createServer( app );
|
||||
|
||||
if ( !isFossVersion ) {
|
||||
console.error( '[ APP ] Starting in non-FOSS version' );
|
||||
logger.info( '[ APP ] Starting in non-FOSS version' );
|
||||
|
||||
const storeConfig = JSON.parse( fs.readFileSync( path.join(
|
||||
__dirname,
|
||||
'/config/store-sdk.config.secret.json'
|
||||
) ).toString() );
|
||||
|
||||
console.error( storeConfig );
|
||||
|
||||
storeSDK.configure( storeConfig );
|
||||
|
||||
// ───────────────────────────────────────────────────────────────────
|
||||
@@ -139,6 +138,7 @@ const run = () => {
|
||||
'useAntiTamper': request.query.useAntiTamper === 'true'
|
||||
? true : false,
|
||||
};
|
||||
logger.debug( `Created room "${ roomName }"` );
|
||||
response.send( roomToken );
|
||||
} else {
|
||||
if (
|
||||
@@ -211,7 +211,7 @@ const run = () => {
|
||||
} else {
|
||||
storeSDK.getSubscriptions( uid )
|
||||
.then( stat => {
|
||||
console.error( 'Subscription check was successful' );
|
||||
logger.log( 'Subscription check was successful' );
|
||||
const now = new Date().getTime();
|
||||
|
||||
for ( const sub in stat ) {
|
||||
@@ -232,7 +232,7 @@ const run = () => {
|
||||
resolve( false );
|
||||
} )
|
||||
.catch( e => {
|
||||
console.error( 'Subscription check unsuccessful with error', e );
|
||||
logger.error( 'Subscription check unsuccessful with error', e );
|
||||
reject( 'ERR_NOT_OWNED' );
|
||||
} );
|
||||
}
|
||||
|
||||
104
backend/src/logger.ts
Normal file
104
backend/src/logger.ts
Normal file
@@ -0,0 +1,104 @@
|
||||
import {
|
||||
writeFile
|
||||
} from 'node:fs';
|
||||
|
||||
const log = ( ...msg: string[] ) => {
|
||||
output( 'log', log.caller.toString(), ...msg );
|
||||
};
|
||||
|
||||
const info = ( ...msg: string[] ) => {
|
||||
output( 'info', log.caller.toString(), ...msg );
|
||||
};
|
||||
|
||||
const debug = ( ...msg: string[] ) => {
|
||||
output( 'debug', log.caller.toString(), ...msg );
|
||||
};
|
||||
|
||||
const warn = ( ...msg: string[] ) => {
|
||||
output( 'warn', log.caller.toString(), ...msg );
|
||||
};
|
||||
|
||||
const error = ( ...msg: string[] ) => {
|
||||
output( 'error', log.caller.toString(), ...msg );
|
||||
};
|
||||
|
||||
const fatal = ( ...msg: string[] ) => {
|
||||
output( 'fatal', log.caller.toString(), ...msg );
|
||||
};
|
||||
|
||||
|
||||
let loc = 'stderr';
|
||||
let lev = 0;
|
||||
type LogLevel = 'debug' | 'info' | 'log' | 'warn' | 'error' | 'fatal';
|
||||
const levels = [
|
||||
'debug',
|
||||
'info',
|
||||
'log',
|
||||
'warn',
|
||||
'error',
|
||||
'fatal'
|
||||
];
|
||||
|
||||
const configure = ( location: 'stderr' | 'file', minLevel: LogLevel, file?: string ) => {
|
||||
if ( location === 'file' && !file ) {
|
||||
throw new Error( 'File parameter required when location is "file"' );
|
||||
}
|
||||
|
||||
loc = location === 'stderr' ? 'stderr' : file;
|
||||
lev = levels.indexOf( minLevel );
|
||||
};
|
||||
|
||||
|
||||
const logfile: string[] = [];
|
||||
|
||||
const output = ( level: LogLevel, caller: string, ...message: string[] ) => {
|
||||
if ( levels.indexOf( level ) < lev ) {
|
||||
return;
|
||||
}
|
||||
|
||||
const msg = message.join( ' ' );
|
||||
const out = `[${ level.toUpperCase() }] (${ new Date().toISOString() }) in ${ caller }: ${ msg }`;
|
||||
|
||||
if ( loc === 'stderr' ) {
|
||||
console.error( out );
|
||||
} else {
|
||||
logfile.push( out );
|
||||
save();
|
||||
}
|
||||
};
|
||||
|
||||
let isSaving = false;
|
||||
let waitingOnSave = false;
|
||||
|
||||
const save = () => {
|
||||
if ( isSaving ) {
|
||||
waitingOnSave = true;
|
||||
|
||||
return;
|
||||
}
|
||||
|
||||
isSaving = true;
|
||||
writeFile( loc, JSON.stringify( logfile ), err => {
|
||||
if ( err )
|
||||
console.error( '[LOGGER] Failed to save with error ' + err );
|
||||
|
||||
if ( waitingOnSave ) {
|
||||
waitingOnSave = false;
|
||||
isSaving = false;
|
||||
save();
|
||||
}
|
||||
|
||||
isSaving = false;
|
||||
} );
|
||||
};
|
||||
|
||||
|
||||
export default {
|
||||
log,
|
||||
info,
|
||||
debug,
|
||||
warn,
|
||||
error,
|
||||
fatal,
|
||||
configure
|
||||
};
|
||||
@@ -4,6 +4,7 @@ import bodyParser from 'body-parser';
|
||||
import {
|
||||
SocketData
|
||||
} from './definitions';
|
||||
import logger from './logger';
|
||||
|
||||
const useSSE = (
|
||||
app: express.Application,
|
||||
@@ -86,7 +87,11 @@ const useSSE = (
|
||||
|
||||
for ( const c in cl ) {
|
||||
if ( cl[ c ] === sid ) {
|
||||
cl.splice( parseInt( c ), 1 );
|
||||
try {
|
||||
cl.splice( parseInt( c ), 1 );
|
||||
// eslint-disable-next-line @typescript-eslint/no-unused-vars
|
||||
} catch ( _ ) { /* empty */ }
|
||||
|
||||
break;
|
||||
}
|
||||
}
|
||||
@@ -120,12 +125,13 @@ const useSSE = (
|
||||
( request: express.Request, response: express.Response ) => {
|
||||
if ( request.query.room ) {
|
||||
if ( socketData[ String( request.query.room ) ] ) {
|
||||
logger.debug( `Room "${ request.query.room }" was joined` );
|
||||
response.send( 'ok' );
|
||||
} else {
|
||||
response.status( 404 ).send( 'ERR_ROOM_NOT_FOUND' );
|
||||
}
|
||||
} else {
|
||||
response.status( 404 ).send( 'ERR_NO_ROOM_SPECIFIED' );
|
||||
response.status( 400 ).send( 'ERR_NO_ROOM_SPECIFIED' );
|
||||
}
|
||||
}
|
||||
);
|
||||
@@ -138,8 +144,17 @@ const useSSE = (
|
||||
( request: express.Request, response: express.Response ) => {
|
||||
if ( socketData[ request.body.roomName ] ) {
|
||||
if ( request.body.event === 'tampering' ) {
|
||||
logger.debug( `Room "${
|
||||
request.query.roomName }" has new event: Tampering` );
|
||||
|
||||
const clients = clientReference[ request.body.roomName ];
|
||||
|
||||
if ( !clients ) {
|
||||
response.send( 'ERR_CANNOT_SEND' );
|
||||
|
||||
return;
|
||||
}
|
||||
|
||||
for ( const client in clients ) {
|
||||
if ( importantClients[ clients[ client ] ] ) {
|
||||
importantClients[ clients[ client ] ]
|
||||
@@ -181,9 +196,18 @@ const useSSE = (
|
||||
.playlistIndex = request.body.data;
|
||||
}
|
||||
|
||||
logger.debug( `Room "${
|
||||
request.query.roomName }" has new event: ${ update }` );
|
||||
|
||||
if ( send ) {
|
||||
const clients = clientReference[ request.body.roomName ];
|
||||
|
||||
if ( !clients ) {
|
||||
response.send( 'ERR_CANNOT_SEND' );
|
||||
|
||||
return;
|
||||
}
|
||||
|
||||
for ( const client in clients ) {
|
||||
if ( connectedClients[ clients[ client ] ] ) {
|
||||
connectedClients[ clients[ client ] ]
|
||||
@@ -222,9 +246,17 @@ const useSSE = (
|
||||
socketData[ request.body.roomName ].roomToken
|
||||
=== request.body.roomToken
|
||||
) {
|
||||
logger.debug( `Room "${
|
||||
request.query.roomName }" was deleted` );
|
||||
socketData[ request.body.roomName ] = undefined;
|
||||
const clients = clientReference[ request.body.roomName ];
|
||||
|
||||
if ( !clients ) {
|
||||
response.send( 'ok' );
|
||||
|
||||
return;
|
||||
}
|
||||
|
||||
for ( const client in clients ) {
|
||||
if ( connectedClients[ clients[ client ] ] ) {
|
||||
connectedClients[ clients[ client ] ]
|
||||
@@ -234,6 +266,8 @@ const useSSE = (
|
||||
} ) + '\n\n' );
|
||||
}
|
||||
}
|
||||
|
||||
response.send( 'ok' );
|
||||
} else {
|
||||
response.send( 403 ).send( 'ERR_UNAUTHORIZED' );
|
||||
}
|
||||
|
||||
@@ -10,6 +10,7 @@
|
||||
import path from 'path';
|
||||
import fs from 'fs';
|
||||
import * as sqlDB from './mysqldb.js';
|
||||
import logger from '../logger.js';
|
||||
|
||||
declare let __dirname: string | undefined;
|
||||
|
||||
@@ -33,9 +34,9 @@ dbh.connect();
|
||||
*/
|
||||
const initDB = (): undefined => {
|
||||
( async () => {
|
||||
console.log( '[ DB ] Setting up...' );
|
||||
logger.info( '[ DB ] Setting up...' );
|
||||
dbh.setupDB();
|
||||
console.log( '[ DB ] Setting up complete!' );
|
||||
logger.info( '[ DB ] Setting up complete!' );
|
||||
} )();
|
||||
};
|
||||
|
||||
|
||||
@@ -10,6 +10,7 @@
|
||||
import mysql from 'mysql';
|
||||
import fs from 'fs';
|
||||
import path from 'path';
|
||||
import logger from '../logger';
|
||||
|
||||
declare let __dirname: string | undefined;
|
||||
|
||||
@@ -63,20 +64,20 @@ class SQLDB {
|
||||
const self = this;
|
||||
|
||||
if ( this.isRecovering ) {
|
||||
console.log( '[ SQL ] Attempting to recover from critical error' );
|
||||
logger.info( '[ SQL ] Attempting to recover from critical error' );
|
||||
this.sqlConnection = mysql.createConnection( this.config );
|
||||
this.isRecovering = false;
|
||||
}
|
||||
|
||||
this.sqlConnection.connect( err => {
|
||||
if ( err ) {
|
||||
console.error( '[ SQL ]: An error ocurred whilst connecting: ' + err.stack );
|
||||
logger.error( '[ SQL ]: An error ocurred whilst connecting: ' + err.stack );
|
||||
reject( err );
|
||||
|
||||
return;
|
||||
}
|
||||
|
||||
console.log( '[ SQL ] Connected to database successfully' );
|
||||
logger.info( '[ SQL ] Connected to database successfully' );
|
||||
self.sqlConnection.on( 'error', err => {
|
||||
if ( err.code === 'ECONNRESET' ) {
|
||||
self.isRecovering = true;
|
||||
@@ -85,7 +86,7 @@ class SQLDB {
|
||||
self.connect();
|
||||
}, 1000 );
|
||||
} else {
|
||||
console.error( err );
|
||||
logger.error( err );
|
||||
}
|
||||
} );
|
||||
resolve( 'connection' );
|
||||
|
||||
Reference in New Issue
Block a user