irc-message-ts
v3.0.6
Published
Performant, streaming IRC message parser based off of github.com/sigkell/irc-message
Downloads
143
Readme
irc-message-ts
Performant, streaming IRC message parser - a fork of sigkell/irc-message with a more simplified feature set and TypeScript support.
There are some breaking changes between the original library and this one, namely the lack of stream options, and the tags
property will only ever be an object with string values.
This is important to note because there were times when irc-message
returned true
on a key within the tags
object, I have however removed this behaviour in favour of keeping tag types more consistent. This however has the breaking impact that it falls back to an empty string, which is considered falsy in JavaScript. So this means where you may have gotten something like message.tags["my-key"] === true
, it will now be message.tags["my-key"] === ""
, and this equates to a falsy value, if for example used in an if statement. I believe this is a reasonable compromise over supporting two different types in the object.
irc-message-ts provides an object stream capable of parsing RFC1459-compliant IRC messages, with support for IRCv3 message tags. This also includes server-to-server protocols such as TS6, Spanning Tree, and the UnrealIRCd protocol.
Attribution
As previously stated, this is nothing more than a TypeScript version of sigkell's irc-message library. I'd like to give full credit to him for his original creation.
The reason why this isn't a pull request is this makes breaking and opinionated changes to the library that were mainly to suit my own needs, those being the breaking changes listed above.
Installation
yarn add irc-message-ts
Usage
createStream()
Returns an object stream, taking in Buffer
s/String
s of raw IRC data. Data should not be line-buffered, this stream handles splitting and buffering automatically. and pushing objects containing the following keys.
raw
- unparsed IRC message (string)tags
- IRCv3 message tagsprefix
- message prefix/sourcecommand
- message command/verbparams
- an array of middle and trailing parametersparam
- the first param in the params array, or an empty stringtrailing
- the last param in the params array, or an empty string
We don't support options like the irc-message library does right now. I felt like these added un-needed bulk and didn't think it was worth adding two extra packages, as it's pretty easy to abstract this on your own. It would also probably involve overloads on the types which I didn't want to add, the goal is to keep the types extremely simple.
import * as net from "net";
import {createStream, IRCMessage} from "irc-message-ts";
net.connect(6667, "irc.freenode.net")
.pipe(createStream())
.on("data", (message: IRCMessage) => {
console.log(message)
});
parse(data)
You can also access the message parser directly. The parser function expects a string without any CRLF sequences. If the string is malformed, null
is returned. Otherwise, an object representing the message is returned (see createStream()
for format).
import {parse} from "irc-message-ts";
console.log(parse(":hello!sir@madam PRIVMSG #test :Hello, world!"))
/* {
* raw: ":hello!sir@madam PRIVMSG #test :Hello, world!",
* tags: {},
* prefix: "hello!sir@madam",
* command: "PRIVMSG",
* params: ["#test", "Hello, world!"],
* param: "#test",
* trailing: "Hello, world!"
* }
*/