UNPKG

iitcp

Version:

IITC Plugin creator and developer tools

135 lines (120 loc) 3.35 kB
'use strict'; const Hapi = require('hapi'), fs = require('fs'), server = new Hapi.Server({ port: 3000, host: 'localhost' }), build = require('./build'); let serverStarting = false; server.route({ method: 'GET', path: '/', handler: function(request, h) { return `<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <meta http-equiv="X-UA-Compatible" content="ie=edge"> <title>IITCP</title> <style type="text/css"> html, body { height: 100%; margin: 0; } #iitcp_wrapper { min-height: 100%; } </style> </head> <script src="/socket.io/socket.io.js"></script> <script> (${socketClient})(); </script> <body> <div id="iitcp_wrapper"> <iframe src="https://www.ingress.com/intel" style="width:100%;height:99.6vh" frameborder="0"></iframe> </div> </body> </html>`; } }); const io = require('socket.io')(server.listener); io.on('connection', function(socket) { console.log('connected'); }); async function startServer() { try { serverStarting = true; //await server.register(Inert); await server.start(); serverStarting = false; console.log(`iitcp is now running in dev mode on ${server.info.uri}`); fs.watch(process.cwd() + '/code', debouncedRestart); } catch (err) { console.log(err); } } // from https://davidwalsh.name/javascript-debounce-function // Returns a function, that, as long as it continues to be invoked, will not // be triggered. The function will be called after it stops being called for // N milliseconds. If `immediate` is passed, trigger the function on the // leading edge, instead of the trailing. function debounce(func, wait, immediate) { var timeout; return function() { var context = this, args = arguments; var later = function() { timeout = null; if (!immediate) func.apply(context, args); }; var callNow = immediate && !timeout; clearTimeout(timeout); timeout = setTimeout(later, wait); if (callNow) func.apply(context, args); }; } const debouncedRestart = debounce(async function restartServer( eventType, filename ) { // don't try to stop thge server while starting if (serverStarting) { return; } try { console.log(eventType, filename); await build(); await server.stop({ timeout: 1000 }); startServer(); console.log('server restarted'); io.emit('update'); } catch (e) { console.log(e); } }, 1000); function socketClient() { const socket = io('http://localhost:3000'); let disconnectReason = ''; socket.on('connect', () => { console.log('IITCP: connected'); if (disconnectReason === 'transport close') { window.location.reload(true); console.log('IITCP: File change detected, reloading page...'); } }); socket.on('disconnect', reason => { if (reason === 'transport close') { console.log('IITCP: Socket Disconnect! Possible File change detected!'); } disconnectReason = reason; }); socket.on('update', function() { console.log('IITCP: update'); window.location.reload(true); }); } exports.start = () => { startServer(); };