iitcp
Version:
IITC Plugin creator and developer tools
135 lines (120 loc) • 3.35 kB
JavaScript
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();
};
;