Source: reporter/server_logger.js

import { Logger } from "./logger.js";
import { ServerConnection } from "../server/server_connection.js";
import { Reporter } from "./reporter.js";

/** Default logger that connects to server over websocket */
class ServerLogger extends Logger {

    /**
     * @param {SyslogLevel} fromLevel
     * @param {ServerConnection} serverConnection
     * @param {Reporter} reporter
     */

    constructor(fromLevel, serverConnection, reporter) {

        super(fromLevel, reporter);

        /** @type {ServerConnection} */

        this.server = serverConnection;


        /** @type {Reporter} */

        this.reporter = reporter;


        // when a connection to the server is made / restored
        // upload the cached logs and clear the cache on completion

        this.server.on('connection-changed', function () {
            this._uploadCache()
        })
    }


    /**
     * Temporarily stores Log Objects while the server connection is down
     * @protected
     * @type {Array<LogObject>}
     */

    _logCache = [];


    async _uploadCache() {
        if (this.server.connected === true && this._logCache.length > 0) {
            const response = await this.server.request({
                method: 'post',
                endpoint: 'log',
                data: this._logCache
            });

            if (response.data === true) {
                this.reporter.report({ msg: 'cleared cache' })
            }
        }
    }


    /**
     * @param {LogObject} log
     */

    log = function (log) {

        if (this.server.connected) {
            this.server.request({
                method: 'post',
                endpoint: 'log',
                data: log
            });
        }
        else {
            this._logCache.push(log);
        }
    }

}

export { ServerLogger };




//         /**
//          * @protected
//          * @type {Array<LogObjectString>}
//          */

//         this.uploadCache = []



//                 /**
//          * @protected
//          * @type {(WebSocket|null)}
//          */

//         this.server = reportURL ? new WebSocket( reportURL.href ) : null







// if ( ! reportURL ) {
//     this._logToServer = ( msg, level ) => false
// }


//         // if ( reportURL )
//         // {




//         //     this.logToServer = (

//         //     this.server.addEventListener( 'open', () => {

//         //         let cachedLogStr = ''

//         //         while ( cachedLogStr = this.uploadCache.shift() )
//         //         {
//         //             // await?
//         //             this.server.send( cachedLogStr )
//         //         }
//         //     })
//         // }
//         // else
//         // {


//         //     this._logToServer = ( msg, level ) => false
//         // }





//     /**
//      * @protected
//      * @param {string} msg 
//      * @param {LogLevel} level 
//      */

//     _logToServer( msg, level = 1 ) {

//         const logObj = { msg, level }

//         const logStr = JSON.stringify( logObj )

//         if ( this.server.readyState === 1 )
//         {
//             this.server.send( logStr )
//         }
//         else
//         {
//             this.uploadCache.push( logStr )
//         }

//         return true
//     }