| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235 | /* eslint-disable  */var path = require('path');const merge = require('webpack-merge');const common = require('./webpack.common.js');const bodyParser = require('body-parser')const MiniCssExtractPlugin = require('mini-css-extract-plugin');const { config } = require('process');const HtmlWebPackPlugin = require('html-webpack-plugin');const SpriteLoaderPlugin = require('svg-sprite-loader/plugin');const { Command } = require('commander');let  cmdLines= { };const data = {    messages: require("../mock/messages.json"),    messagequeue: require("../mock/messages.json"),    commands: require("../mock/commands.json"),    scan: require("../mock/scan.json"),    ap: require("../mock/ap.json"),    config: require("../mock/config.json"),    statusdefinition: require("../mock/statusdefinition.json"),    status: require("../mock/status.json")};const messagingTypes= {	MESSAGING_INFO : 'MESSAGING_INFO',	MESSAGING_WARNING : 'MESSAGING_WARNING',	MESSAGING_ERROR : 'MESSAGING_ERROR'};const messagingClass= {	MESSAGING_CLASS_OTA : 'MESSAGING_CLASS_OTA',	MESSAGING_CLASS_SYSTEM : 'MESSAGING_CLASS_SYSTEM',	MESSAGING_CLASS_STATS : 'MESSAGING_CLASS_STATS',	MESSAGING_CLASS_CFGCMD: 'MESSAGING_CLASS_CFGCMD',	MESSAGING_CLASS_BT: 'MESSAGING_CLASS_BT'} ;function requeueMessages(){    data.messagequeue.push(...data.messages);    console.log(`Re-queued ${data.messages.length} messages. Total queue length is: ${data.messagequeue.length}`);}function sendMessaging(cmdname,msgtype,msgClass,msg){    let message_txt=`${cmdname}\n${msg}`;    var d = new Date();    var n = d.getMilliseconds();    data.messagequeue.push({        message:	message_txt,        type:	msgtype,        class:	msgClass,        sent_time:	n,        current_time:	n});    console.log(`Queued message ~${data.messagequeue.length} type ${msgtype}, class ${msgClass}: ${message_txt}`);}Array.prototype.filter = function(fun /*, thisp*/) {    var len = this.length >>> 0;    if (typeof fun != "function")      throw new TypeError();    var res = [];    var thisp = arguments[1];    for (var i = 0; i < len; i++) {      if (i in this) {        var val = this[i];        if (fun.call(thisp, val, i, this))          res.push(val);      }    }    return res;  };for(const cmdIdx in data.commands.commands){    const cmd = data.commands.commands[cmdIdx];    //console.log(`Creating command structure for ${cmd.name}`);    cmdLines[cmd.name] = {        cmd: new Command(),    };    cmdLines[cmd.name].cmd        .storeOptionsAsProperties(false)        .name(cmd.name)        .exitOverride();    for(const argIdx in cmd.argtable){        const arg=cmd.argtable[argIdx];        const optstr=((arg.shortopts?'-'+arg.shortopts:'')+         (arg.shortopts && arg.longopts?', ':'')+        (arg.longopts?'--'+arg.longopts:'') +         (arg.hasvalue?`${(arg.shortopts || arg.longopts?' ':'')}<${arg.datatype.replace(/[<>]/gm,'')}>`:''));        //console.log(`   Option: ${optstr}, Glossary: ${arg.glossary}`);        if(arg.mincount>0){            cmdLines[cmd.name].cmd.requiredOption( optstr,arg.glossary);        }        else {            cmdLines[cmd.name].cmd.option( optstr,arg.glossary);        }    }}const connectReturnCode = {    UPDATE_CONNECTION_OK : 0,       UPDATE_FAILED_ATTEMPT : 1,      UPDATE_USER_DISCONNECT : 2,      UPDATE_LOST_CONNECTION : 3,      UPDATE_FAILED_ATTEMPT_AND_RESTORE : 4  }module.exports = merge(common, {    mode: 'development',    devtool: 'inline-source-map',    entry: {        test: './src/test.ts'    },        devServer: {        contentBase: path.join(__dirname, 'dist'),        publicPath: '/',        port: 9100,        host: 'desktop-n8u8515',//your ip address        disableHostCheck: true,        overlay: true,        before: function(app) {            app.use(bodyParser.json()) // for parsing application/json            app.use(bodyParser.urlencoded({ extended: true })) // for parsing application/x-www-form-urlencoded            app.get('/ap.json', function(req, res) { res.json( data.ap ); });            app.get('/scan.json', function(req, res) { res.json( data.scan ); });            app.get('/config.json', function(req, res) { res.json( data.config ); });            app.get('/status.json', function(req, res) { res.json( data.status ); });            app.get('/messages.json', function(req, res) {                 res.json( data.messagequeue ) ;                 data.messagequeue=[];            });                        app.get('/statusdefinition.json', function(req, res) { res.json( data.statusdefinition ); });            app.get('/commands.json', function(req, res) { res.json( data.commands ); });            app.post('/commands.json', function(req, res) {                 console.log(req.body.command);                try {                    const cmdName=req.body.command.split(" ")[0];                    const args=('node '+req.body.command).split(" ");                    let cmd=cmdLines[cmdName].cmd;                    if(cmd){                        cmd.parse(args);                        const msg=`Received Options: ${JSON.stringify(cmd.opts())}\n`;                        console.log('Options: ', cmd.opts());                        console.log('Remaining arguments: ', cmd.args);                        sendMessaging(cmdName,messagingTypes.MESSAGING_INFO,messagingClass.MESSAGING_CLASS_CFGCMD,msg);                    }                                    } catch (error) {                    console.error(error);                }                res.json( { 'Result' : 'Success' } );             });            app.post('/config.json', function(req, res) {                 console.log(req.body);                console.log(data.config);                for (const property in req.body.config) {                    console.log(`${property}: ${req.body.config[property].value}`);                    if(data.config[property]=== undefined){                        console.log(`Added config value ${property} [${req.body.config[property].value}]`);                        data.config[property] = {value: req.body.config[property].value};                    }                    else if (data.config[property].value!=req.body.config[property].value){                        console.log(`Updated config value ${property}\nFrom: ${data.config[property].value}\nTo: ${req.body.config[property].value}]`);                        data.config[property].value=req.body.config[property].value;                    }                  }                res.json( {} );             });            app.post('/status.json', function(req, res) {                 for (const property in req.body.status) {                    if(data.status[property]=== undefined){                        console.log(`Added status value ${property} [${req.body.status[property]}]`);                        data.status[property] = {value: req.body.status[property]};                    }                    else if (data.status[property]!==req.body.status[property]){                        console.log(`Updated status value ${property}\nFrom: ${data.status[property]}\nTo: ${req.body.status[property]}`);                        data.status[property]=req.body.status[property];                    }                  }                res.json( {} );             });                        app.post('/connect.json', function(req, res) {                 setTimeout(function(r){                if(r.body.ssid.search('fail')>=0){                    if(data.status.ssid){                        // in this case, the same ssid will be reused - the ESP32 would restore its previous state on failure                        data.status.urc=connectReturnCode.UPDATE_FAILED_ATTEMPT_AND_RESTORE;                    }                    else {                        data.status.urc=connectReturnCode.UPDATE_FAILED_ATTEMPT;                    }                }                else {                    data.status.ssid=r.body.ssid;                    data.status.urc=connectReturnCode.UPDATE_CONNECTION_OK;                }                }, 1000, req);                res.json( {} );             });            app.post('/reboot_ota.json', function(req, res) {                 data.status.recovery=0;                requeueMessages();                res.json( {} );             });            app.post('/reboot.json', function(req, res) {                 res.json( {} );                 requeueMessages();            });            app.post('/recovery.json', function(req, res) {                 data.status.recovery=1;                requeueMessages();                res.json( { } );             });            app.post('/flash.json', function(req, res) {                 if(data.status.recovery>0){                    res.json({});                  }                  else {                    res.status(404).end();                   }              });                              app.delete('/connect.json', function(req, res) {                 data.status.ssid='';                res.json( {} ); });            app.get('/reboot', function(req, res) { res.json( {} ); });        },    },    plugins: [        new MiniCssExtractPlugin({            filename: 'css/[name].css',            chunkFilename: 'css/[id].css' ,        }),        new HtmlWebPackPlugin({            title: 'SqueezeESP32-test',            template: './src/test.ejs',            filename: 'test',            minify: false,            excludeChunks: ['index'],        }),                new SpriteLoaderPlugin({plainSprite: true})    ],});
 |