Convert to WebSockets #1
4 changed files with 56 additions and 36 deletions
1
.gitignore
vendored
Normal file
1
.gitignore
vendored
Normal file
|
|
@ -0,0 +1 @@
|
|||
node_modules/
|
||||
76
index.js
76
index.js
|
|
@ -1,7 +1,9 @@
|
|||
const
|
||||
{ version } = require('./package.json'),
|
||||
http = require('http');
|
||||
const { version } = require('./package.json');
|
||||
const WebSocket = require('ws');
|
||||
|
||||
/**
|
||||
* @type WebSocket.Server[]
|
||||
*/
|
||||
const servers = {};
|
||||
|
||||
module.exports = {
|
||||
|
|
@ -18,56 +20,62 @@ module.exports = {
|
|||
*/
|
||||
default: async ({ Window, Ouput }, _, { help, open: portToOpen, close: portToClose, closeAll }) => {
|
||||
let res = '';
|
||||
if(help){
|
||||
if (help) {
|
||||
return `remote v${version}`
|
||||
+ `\nUsage : remote [--open <port>]`
|
||||
+ `\n remote [--close <port>]`
|
||||
+ `\n remote [--close-all]`;
|
||||
+ `\nUsage : remote [--open <port>]`
|
||||
+ `\n remote [--close <port>]`
|
||||
+ `\n remote [--close-all]`;
|
||||
}
|
||||
if(portToOpen){
|
||||
if(servers[portToOpen])
|
||||
|
||||
if (portToOpen) {
|
||||
if (servers[portToOpen])
|
||||
res += `Port ${portToOpen} already open.\n`;
|
||||
else {
|
||||
const server = http.createServer((req, res) => {
|
||||
if(req.method === 'POST'){
|
||||
let body = '';
|
||||
req.on('data', chunk => body += chunk.toString());
|
||||
req.on('end', () => {
|
||||
try {
|
||||
const _res = eval(body);
|
||||
res.writeHead(200);
|
||||
res.end(_res && _res.toString());
|
||||
} catch(error){
|
||||
res.writeHead(400);
|
||||
res.end(error.stack);
|
||||
}
|
||||
});
|
||||
}
|
||||
else {
|
||||
res.writeHead(405);
|
||||
res.end();
|
||||
}
|
||||
const wss = new WebSocket.Server({ port: portToOpen });
|
||||
|
||||
wss.on('connection', (ws) => {
|
||||
ws.on('message', (msg) => {
|
||||
const data = JSON.parse(msg);
|
||||
|
||||
try {
|
||||
const response = eval(data.payload);
|
||||
ws.send(JSON.stringify({
|
||||
error: false,
|
||||
id: data.id,
|
||||
response
|
||||
}));
|
||||
} catch (ex) {
|
||||
ws.send(JSON.stringify({
|
||||
error: true,
|
||||
id: data.id,
|
||||
response: ex
|
||||
}));
|
||||
}
|
||||
})
|
||||
});
|
||||
await new Promise(resolve => server.listen(portToOpen, () => resolve()));
|
||||
servers[portToOpen] = server;
|
||||
|
||||
servers[portToOpen] = wss;
|
||||
res += `Port ${portToOpen} open.\n`;
|
||||
}
|
||||
}
|
||||
if(portToClose){
|
||||
if(servers[portToClose]){
|
||||
|
||||
if (portToClose) {
|
||||
if (servers[portToClose]) {
|
||||
await new Promise(resolve => servers[portToClose].close(resolve));
|
||||
delete servers[portToClose];
|
||||
res += `Port ${portToClose} closed.\n`;
|
||||
}
|
||||
else res += `Port ${portToClose} wasn't open.\n`;
|
||||
}
|
||||
if(closeAll){
|
||||
for(const [port, server] of Object.entries(servers)){
|
||||
|
||||
if (closeAll) {
|
||||
for (const [port, server] of Object.entries(servers)) {
|
||||
await new Promise(resolve => server.close(resolve));
|
||||
delete servers[port];
|
||||
res += `Port ${port} closed.\n`;
|
||||
}
|
||||
}
|
||||
|
||||
return res.trim();
|
||||
}
|
||||
};
|
||||
|
|
@ -1,4 +1,7 @@
|
|||
{
|
||||
"name": "@thornhill-corp/remote",
|
||||
"version": "0.1.0"
|
||||
}
|
||||
"version": "0.1.0",
|
||||
"dependencies": {
|
||||
"ws": "^7.4.3"
|
||||
}
|
||||
}
|
||||
|
|
|
|||
8
yarn.lock
Normal file
8
yarn.lock
Normal file
|
|
@ -0,0 +1,8 @@
|
|||
# THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY.
|
||||
# yarn lockfile v1
|
||||
|
||||
|
||||
ws@^7.4.3:
|
||||
version "7.4.3"
|
||||
resolved "https://registry.yarnpkg.com/ws/-/ws-7.4.3.tgz#1f9643de34a543b8edb124bdcbc457ae55a6e5cd"
|
||||
integrity sha512-hr6vCR76GsossIRsr8OLR9acVVm1jyfEWvhbNjtgPOrfvAlKzvyeg/P6r8RuDjRyrcQoPQT7K0DGEPc7Ae6jzA==
|
||||
Reference in a new issue