Create a gist now

Instantly share code, notes, and snippets.

Embed
What would you like to do?
Running a "full-featured" REPL using a net.Server and net.Socket
var net = require('net')
var sock = net.connect(1337)
process.stdin.pipe(sock)
sock.pipe(process.stdout)
sock.on('connect', function () {
process.stdin.resume();
process.stdin.setRawMode(true)
})
sock.on('close', function done () {
process.stdin.setRawMode(false)
process.stdin.pause()
sock.removeListener('close', done)
})
process.stdin.on('end', function () {
sock.destroy()
console.log()
})
process.stdin.on('data', function (b) {
if (b.length === 1 && b[0] === 4) {
process.stdin.emit('end')
}
})
var repl = require('repl')
var net = require('net')
net.createServer(function (socket) {
var r = repl.start({
prompt: 'socket '+socket.remoteAddress+':'+socket.remotePort+'> '
, input: socket
, output: socket
, terminal: true
, useGlobal: false
})
r.on('exit', function () {
socket.end()
})
r.context.socket = socket
}).listen(1337)
@benbuckman

This comment has been minimized.

Show comment
Hide comment
@benbuckman

benbuckman Jun 27, 2012

Hi Nate,
I'm trying to set up a repl with stdout piped to it, this seems like a good demo. But when I run this with node 0.6.19, I get this error:

repl-client.js:10
  process.stdin.setRawMode(true)
                ^
TypeError: Object #<ReadStream> has no method 'setRawMode'
    at Socket.<anonymous> (nodejs/repl-demo/repl-client.js:10:17)
    at Socket.emit (events.js:64:17)
    at Object.afterConnect [as oncomplete] (net.js:652:10)

What am I missing?
Thanks!

benbuckman commented Jun 27, 2012

Hi Nate,
I'm trying to set up a repl with stdout piped to it, this seems like a good demo. But when I run this with node 0.6.19, I get this error:

repl-client.js:10
  process.stdin.setRawMode(true)
                ^
TypeError: Object #<ReadStream> has no method 'setRawMode'
    at Socket.<anonymous> (nodejs/repl-demo/repl-client.js:10:17)
    at Socket.emit (events.js:64:17)
    at Object.afterConnect [as oncomplete] (net.js:652:10)

What am I missing?
Thanks!

@TooTallNate

This comment has been minimized.

Show comment
Hide comment
@TooTallNate

TooTallNate Jun 27, 2012

@newleafdigital You need node v0.8.0 for this example.

Owner

TooTallNate commented Jun 27, 2012

@newleafdigital You need node v0.8.0 for this example.

@benbuckman

This comment has been minimized.

Show comment
Hide comment
@benbuckman

benbuckman commented Jun 27, 2012

Thanks

@benbuckman

This comment has been minimized.

Show comment
Hide comment
@benbuckman

benbuckman Jun 27, 2012

Is there any way in 0.6 to pipe stdout / console.log to a repl, so while I'm running commands, I can see the logs? It seems like it should be straightforward, but I can't get it to work.

benbuckman commented Jun 27, 2012

Is there any way in 0.6 to pipe stdout / console.log to a repl, so while I'm running commands, I can see the logs? It seems like it should be straightforward, but I can't get it to work.

@AlexeyKupershtokh

This comment has been minimized.

Show comment
Hide comment
@AlexeyKupershtokh

AlexeyKupershtokh Jun 29, 2012

    r.context.inspect = function(value) {
        r.outputStream.write('\n' + r.writer(value) + '\n');
        r.displayPrompt();
    };

This method is useful as callback to inspect values when console.log() is unavailable.
Example of usage:

socket 127.0.0.1:39022> setTimeout(function() {inspect(user);}, 1000);null;
null // immediate reaction
socket 127.0.0.1:39022> 
{ coins: 10 } // after the timeout
socket 127.0.0.1:39022>

Though please be careful: this code crashes the server if repl client disconnects before the timeout.

AlexeyKupershtokh commented Jun 29, 2012

    r.context.inspect = function(value) {
        r.outputStream.write('\n' + r.writer(value) + '\n');
        r.displayPrompt();
    };

This method is useful as callback to inspect values when console.log() is unavailable.
Example of usage:

socket 127.0.0.1:39022> setTimeout(function() {inspect(user);}, 1000);null;
null // immediate reaction
socket 127.0.0.1:39022> 
{ coins: 10 } // after the timeout
socket 127.0.0.1:39022>

Though please be careful: this code crashes the server if repl client disconnects before the timeout.

@qzaidi

This comment has been minimized.

Show comment
Hide comment
@qzaidi

qzaidi Apr 21, 2013

Looks like this stopped working with 0.10.0, running the client results in the following error.

_stream_readable.js:683
throw new Error('Cannot switch to old mode now.');

qzaidi commented Apr 21, 2013

Looks like this stopped working with 0.10.0, running the client results in the following error.

_stream_readable.js:683
throw new Error('Cannot switch to old mode now.');

@sandover

This comment has been minimized.

Show comment
Hide comment
@sandover

sandover Jul 23, 2013

I'm curious, too -- I'd like a remote REPL participant to be able to see the results of whatever they do, in their own REPL, instead of having that output "leak" back into the terminal where the program is running.

sandover commented Jul 23, 2013

I'm curious, too -- I'd like a remote REPL participant to be able to see the results of whatever they do, in their own REPL, instead of having that output "leak" back into the terminal where the program is running.

@ghost

This comment has been minimized.

Show comment
Hide comment
@jigneshnavsoft

This comment has been minimized.

Show comment
Hide comment
@jigneshnavsoft

jigneshnavsoft Jan 27, 2014

var socket = require('engine.io-client');
console.log(socket.remoteAddress);

i am not getting remote addeess and it gives undefined

jigneshnavsoft commented Jan 27, 2014

var socket = require('engine.io-client');
console.log(socket.remoteAddress);

i am not getting remote addeess and it gives undefined

@jigneshnavsoft

This comment has been minimized.

Show comment
Hide comment
@jigneshnavsoft

jigneshnavsoft Jan 27, 2014

req.headers['x-forwarded-for'] it gives local ip address ...

i want remote ip address

jigneshnavsoft commented Jan 27, 2014

req.headers['x-forwarded-for'] it gives local ip address ...

i want remote ip address

@KrishnaAnanthi

This comment has been minimized.

Show comment
Hide comment
@KrishnaAnanthi

KrishnaAnanthi Apr 25, 2018

how to start the client and server in this application?

KrishnaAnanthi commented Apr 25, 2018

how to start the client and server in this application?

@KrishnaAnanthi

This comment has been minimized.

Show comment
Hide comment
@KrishnaAnanthi

KrishnaAnanthi Apr 25, 2018

i tried node repl-server.js it is giving me an error
module.js:538
throw err;
^

Error: Cannot find module 'C:\D Drive\Learning\repl-server.js'
at Function.Module._resolveFilename (module.js:536:15)
at Function.Module._load (module.js:466:25)
at Function.Module.runMain (module.js:676:10)
at startup (bootstrap_node.js:187:16)
at bootstrap_node.js:608:3

KrishnaAnanthi commented Apr 25, 2018

i tried node repl-server.js it is giving me an error
module.js:538
throw err;
^

Error: Cannot find module 'C:\D Drive\Learning\repl-server.js'
at Function.Module._resolveFilename (module.js:536:15)
at Function.Module._load (module.js:466:25)
at Function.Module.runMain (module.js:676:10)
at startup (bootstrap_node.js:187:16)
at bootstrap_node.js:608:3

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment