Go to file
Svante Bengtson 5d358740fb update readme about version 2021-07-12 16:35:46 +00:00
.github/workflows update readme about version 2021-07-12 16:35:46 +00:00
src fix tests 2021-07-12 16:26:26 +00:00
tests fix lint 2021-07-12 15:37:47 +00:00
.eslintrc.js initial commit 2021-07-12 15:34:50 +00:00
.gitignore initial commit 2021-07-12 15:34:50 +00:00
.mocharc.js initial commit 2021-07-12 15:34:50 +00:00
LICENSE initial commit 2021-07-12 15:34:50 +00:00
README.md update readme about version 2021-07-12 16:35:46 +00:00
package-lock.json initial commit 2021-07-12 15:34:50 +00:00
package.json start getting full ICU data for node 12 2021-07-12 16:01:32 +00:00
tsconfig.json initial commit 2021-07-12 15:34:50 +00:00
tsconfig.production.json initial commit 2021-07-12 15:34:50 +00:00

README.md

irctokens

JavaScript Style Guide QA Publish to NPM and GCR codecov

TypeScript port of the python library irctokens. The major and minor version of this library will aim to follow upstream, patch will be increased independently.

rationale

there's far too many IRC client implementations out in the world that do not tokenise data correctly and thus fall victim to things like colons either being where you don't expect them or not being where you expect them.

usage

installation

$ npm install irctokens

tokenisation

import { tokenise } from 'irctokens'
const line = tokenise('@id=123 :Swant!~swant@hostname PRIVMSG #chat :hello there!')

console.log(line.tags)
// { id: '123' }

console.log(line.source)
// 'Swant!~swant@hostname'

console.log(line.hostmask)
// Hostmask { nickname: 'Swant', username: '~swant', hostname: 'hostname' }

console.log(line.command)
// 'PRIVMSG'

console.log(line.params)
// ['#chat', 'hello there!']

formatting

import { Line } from 'irctokens'
const line = new Line({ command: 'USER', params: ['user', '0', '*', 'real name'] })

console.log(line.format())
// 'USER user 0 * :real name'

stateful

below is an example of a fully socket-wise safe IRC client connection that will connect and join a channel. both protocol sending and receiving are handled by irctokens.

import { Socket } from 'net'
import { Line, StatefulEncoder, StatefulDecoder } from 'irctokens'

const NICK = 'nickname'
const CHAN = '#channel'

const d = new StatefulDecoder()
const e = new StatefulEncoder()
const s = new Socket()
s.connect(6667, '127.0.0.1')

function send (line: Line) {
  console.log(`> ${line.format()}`)
  e.push(line)
  const pending = e.pending()
  s.write(pending)
  e.pop(pending.length)
}

s.once('connect', () => {
  send(new Line({ command: 'USER', params: ['username', '0', '*', 'real name'] }))
  send(new Line({ command: 'NICK', params: [NICK] }))
})

s.on('data', data => {
  const lines = d.push(Uint8Array.from(data))

  if (!lines) return

  for (const line of lines) {
    console.log(`< ${line.format()}`)
    if (line.command === 'PING') send(new Line({ command: 'PONG', params: [line.params[0]] }))
    else if (line.command === '001') send(new Line({ command: 'JOIN', params: [CHAN] }))
  }
})

contact

Come say hi at #irctokens on irc.libera.chat