A standards compliant Telnet implementation for Node.js
In addition to RFC 854, a number of additional RFCs, proposed RFCs, and adopted options such as GMCP and MSSP are implemented. An emphasis on standards used with ANSI-BBS related terminals is taken, though PRs are certainly welcome if something of use is missing.
Some additional standards include:
- RFC 856 - Telnet Binary Transmission
- RFC 857 - Telnet Echo Option
- RFC 858 - Telnet Suppress Go Ahead Option
- RFC 1073 - Telnet Window Size Option
- RFC 1091 - Telnet Terminal-Type Option
- RFC 1572 - Telnet Environment Option
See telnet_spec.js for more information and additional standards.
const { TelnetSocket, TelnetSpec } = require('telnet-socket');
const telnetSocket = TelnetSocket(rawSocket);
// request client to send NAWS
telnetSocket.do.naws();
telnetSocket.on('SB', command => {
if (TelnetSpec.Options.NAWS === command.option) {
// client sent us NAWS
const { width, height } = command.optionData;
// ...do something with height and width
}
});
ℹ️ You can see example usage in ENiGMA 1/2 BBS here
passthrough
: Set totrue
to enable passthrough mode. Defaults tofalse
.escapeIACs
: Set tofalse
to disable escaping of telnetIAC
characters. Defaults totrue
.rawSocket
: Access the underlying socket.
data
(data)
: Non-protocol datacommand error
(command, error)
: An error ocurred whilest processing a command.end
()
: Socketend
.error
(error)
: A socket error has occurred.
Events are emitted for specific Telnet commands such as (but not limited to) DO
, DONT
, WILL
, WONT
and AYT
with the signature of (command)
where command
has the following properties:
code
: The raw byte code of the command.name
: The command name (DO
,DONT
, ...) orunknown comand
.option
: Option sent with the command.optionName
: The name of the option such asNAWS
orunknown option
.optionData
: For options that contain additional data. For example,NAWS
containsheight
andwidth
members, whileTTYPE
contains attype
member.
Unknown commands are emitted as unknown command
with the same signature described above.
- Q: How do I receive characters instead of lines?
- A: Issue
socket.will.sga()
See LICENSE.md