Skip to content

Instantly share code, notes, and snippets.

@craigphicks
Last active November 21, 2020 04:36
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save craigphicks/f1e3ef35f86747dda64230ed582c2d07 to your computer and use it in GitHub Desktop.
Save craigphicks/f1e3ef35f86747dda64230ed582c2d07 to your computer and use it in GitHub Desktop.
js server-client pair - echo text enter into client terminal
var net = require('net');
var jsesc = require('jsesc');
var ctrlC=false;
//var qwrite=[];
async function Socketing(sock){
return await new Promise((res,rej)=>{
// Event: 'data'
sock.on('data', (d) => {
console.log(`sock data: ${jsesc(Buffer.from(d).toString(),{es6:true})}`);
});
// Event: 'close'
sock.on('close', (hadErr) => {
res([`sock on close: ${hadErr}`]);
});
// Event: 'connect'
sock.on('connect', () => {
console.log(`sock connect`);
});
// Event: 'drain'
sock.on('drain', () => {
console.log(`sock drain`);
});
// Event: 'end'
sock.on('end', () => {
res(['socket on end']);
});
// Event: 'error'
sock.on('error', (e) => {
console.log(`sock error: ${e.message}`);
rej(e);
});
// Event: 'lookup'
sock.on('lookup', () => {
console.log(`sock lookup`);
});
// Event: 'ready'
sock.on('ready', () => {
console.log(`sock ready`);
});
// Event: 'timeout'
sock.on('timeout', () => {
console.log(`sock timeout`);
});
// sock.on('', () => {
// console.log(``);
// });
});
}
function socketWriteAsync(sock,data){
return new Promise((resolve)=>{
sock.write(data,null,resolve);
});
}
async function doIo(sock){
process.stdin.setRawMode(true);
process.stdin.resume();
process.stdin.on('data',async (data)=>{
if (ctrlC)
return;
if (data.includes(3)){
ctrlC=true;
console.log('ctrl-c');
sock.end();
process.stdin.pause();
} else
await socketWriteAsync(sock,data);
});
}
async function main(){
var sock = net.createConnection("/tmp/test.sock");
try {
return await Promise.race([
Socketing(sock),
doIo(sock)
]);
} finally {
sock.unref();
}
}
main()
.then((r)=>{console.log('main.then: '+JSON.stringify(r));})
.catch((e)=>{console.log('main.catch: '+e.message);});
'use strict';
const fs=require('fs');
const net = require('net');
const socketName='/tmp/test.sock';
if (fs.existsSync(socketName))
fs.unlinkSync(socketName);
function socketWriteAsync(sock,data){
return new Promise((resolve)=>{
sock.write(data,null,resolve);
});
}
async function Socketing(sock){
return await new Promise((res,rej)=>{
// Event: 'data'
sock.on('data', (d) => {
console.log(`sock data: ${d}`);
socketWriteAsync(sock,d);
});
// Event: 'close'
sock.on('close', (hadErr) => {
res([`sock close event, hadError=${hadErr}`]);
});
// Event: 'connect'
sock.on('connect', () => {
console.log(`sock connect`);
});
// // Event: 'drain'
// sock.on('drain', () => {
// console.log(`sock drain`);
// });
// Event: 'end'
sock.on('end', () => {
res(['sock end event']);
});
// Event: 'error'
sock.on('error', (e) => {
console.log(`sock on error: ${e.message}`);
rej(e);
});
// Event: 'lookup'
sock.on('lookup', () => {
console.log(`sock lookup`);
});
// Event: 'ready'
sock.on('ready', () => {
console.log(`sock ready`);
});
// Event: 'timeout'
sock.on('timeout', () => {
console.log(`sock timeout`);
});
// sock.on('', () => {
// console.log(``);
// });
});
}
async function Listening(serv){
await new Promise((resolve,reject)=>{
serv.listen(socketName,()=>{
console.log('begin listening');
resolve();
});
serv.on('error', (e) => {
console.log("serv on error: "+ e.message);
reject(e);
});
serv.on('close', () => {
console.log("serv on close (unexpected)");
reject(Error('unexpected serv close'));
});
});
return await new Promise((resolve,reject)=>{
// close, connection,error,listening
serv.on('connection', (sock) => {
console.log('got connection!');
Socketing(sock)
.then((x)=>{
resolve([...x,'Socketing returned']);
})
.catch(reject)
.finally(()=>{sock.unref();});
});
serv.on('error', (e) => {
console.log("serv error: "+ e.message);
reject(e);
});
serv.on('close', () => {
console.log("serv close");
resolve(['server on close']);
});
});
}
async function main(){
const serv = net.createServer();
try {
return await Listening(serv);
// } catch(e){
// throw(e);
} finally {
serv.unref();
}
}
main()
.then((r)=>{console.log('main.then: '+JSON.stringify(r));})
.catch((e)=>{console.log(`main.catch: ${e.message}`);});
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment