const Koa = require('koa') const fs = require('fs') const path = require('path') const localEvent = require('./localEvent') const WebSocket = require('ws') const exec = require('child_process').exec const Printer = require('./PrinterDev') // koa middleware const KoaLogger = require('koa-morgan') const KoaEjs = require('koa-ejs') const KoaMount = require('koa-mount') const KoaStatic = require('koa-static') const KoaRouter = require('koa-router') const Kcors = require('kcors') const app = new Koa() let config = {} let setupMode = false try { let chk = new Promise((resolve, reject) => { fs.access(path.resolve(process.env.PROJECT_ROOT, 'config.json'), (err) => { if (err) { setupMode = true resolve(0) return } config = require('./config.json') resolve(1) }) }) await chk //eslint-disable-line } catch (err) { setupMode = true } const server = app.listen(config.port || 10230, () => { console.log(`Server start on port ${server.address().port}`) }) const ws = new WebSocket.Server({ server }) app.use(Kcors()) app.use(KoaLogger('short')) app.use(KoaStatic(path.resolve(__dirname, 'public'))) KoaEjs(app, { root: path.resolve(__dirname, 'views'), layout: false, viewExt: 'ejs', cache: false, debug: false }) let router = null if (setupMode) { console.log(`start setup mode`) router = require('./route/install') } else { console.log(`start normal mode`) router = require('./route/dashboard') Printer.serial = config.printer.serial Printer.feed = config.printer.feed await Printer.connect() if (config.ble.enable) { require('./ble') } } if (router !== null) { // set Route app.use(router.routes()) app.use(router.allowedMethods()) router.put('/reboot_sys', async (c, n) => { setTimeout(function () { process.exit(1) }, 2000) c.body = '1' }) } // listen print event localEvent.on('print', async str => { let chk = await Printer.printerString(str) localEvent.emit('printResult', chk) }) let systemStatus = { ble: { enable: false, mac: '', service: '', characteristic: '' }, printer: { connect: false, serial: '', feed: 0 }, pcount: 0, lastprint: '', secret: '' } systemStatus.ble.enable = config.ble.enable systemStatus.secret = config.api.secret if (config.ble.enable) { systemStatus.ble.mac = await getBTAddr() systemStatus.ble.service = config.ble.uuid.service systemStatus.ble.characteristic = config.ble.uuid.characteristic } function getPrinterStatus() { systemStatus.printer.connect = Printer.isOpen systemStatus.printer.serial = Printer.serial systemStatus.printer.feed = Printer.feed systemStatus.pcount = Printer.count systemStatus.lastprint = Printer.lastPrint } getPrinterStatus() ws.on('connection', async (client, req) => { getPrinterStatus() client.send(JSON.stringify({ type: 'status', data: systemStatus })) Printer.on('printDone', () => { getPrinterStatus() client.send(JSON.stringify({ type: 'status', data: systemStatus })) }) client.on('message', msg => { let m = {} try { m = JSON.parse(msg) } catch (err) { return } switch (m.type) { case 'status': client.send(JSON.stringify({ type: 'status', data: systemStatus })) break } }) }) async function getBTAddr() { let address = await new Promise((resolve, reject) => { exec('bt-adapter -i | grep -i address', (err, sout, serr) => { if (err) return resolve('') resolve(sout) }) }) address = address.trim() let arr = address.split(' ') if (arr.length !== 2) return '' return arr[1].trim() }