/** SASL PLAIN (IRCv3). No import. */ function bareIrcB64Encode(bytes) { var table = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/' var s = '' var i = 0 while (i < bytes.length) { var a = bytes[i++] var b = i < bytes.length ? bytes[i++] : NaN var c = i < bytes.length ? bytes[i++] : NaN var triple = ((a & 255) << 16) | ((Number.isFinite(b) ? b & 255 : 0) << 8) | (Number.isFinite(c) ? c & 255 : 0) s += table.charAt((triple >> 18) & 63) s += table.charAt((triple >> 12) & 63) s += Number.isFinite(b) ? table.charAt((triple >> 6) & 63) : '=' s += Number.isFinite(c) ? table.charAt(triple & 63) : '=' } return s } function bareIrcUtf8Bytes(str) { var s = String(str == null ? '' : str) if (typeof TextEncoder !== 'undefined') return Array.from(new TextEncoder().encode(s)) var out = [] for (var i = 0; i < s.length; i++) out.push(s.charCodeAt(i) & 255) return out } /** * AUTHENTICATE PLAIN payload (account \0 account \0 password), chunked ≤400. * @returns {string[]} */ function bareIrcSaslPlainChunks(user, pass) { var u = String(user || '') var p = String(pass || '') var raw = bareIrcUtf8Bytes('\0' + u + '\0' + p) var b64 = bareIrcB64Encode(raw) var chunks = [] var i = 0 if (!b64) return ['+'] while (i < b64.length) { chunks.push(b64.slice(i, i + 400)) i += 400 } return chunks }