5 var util = require('./util')
11 var packets = exports.packets = {
21 var packetslist = util.keys(packets);
24 * Premade error packet.
27 var err = { type: 'error', data: 'parser error' }
32 * <packet type id> [ `:` <data> ]
43 exports.encodePacket = function (packet) {
44 var encoded = packets[packet.type]
46 // data fragment is optional
47 if (undefined !== packet.data) {
48 encoded += String(packet.data);
57 * @return {Object} with `type` and `data` (if any)
61 exports.decodePacket = function (data) {
62 var type = data.charAt(0);
64 if (Number(type) != type || !packetslist[type]) {
68 if (data.length > 1) {
69 return { type: packetslist[type], data: data.substring(1) };
71 return { type: packetslist[type] };
76 * Encodes multiple messages (payload).
84 * @param {Array} packets
88 exports.encodePayload = function (packets) {
89 if (!packets.length) {
96 for (var i = 0, l = packets.length; i < l; i++) {
97 message = exports.encodePacket(packets[i]);
98 encoded += message.length + ':' + message;
105 * Decodes data when a payload is maybe expected.
107 * @param {String} data
108 * @return {Array} packets
112 exports.decodePayload = function (data) {
114 // parser error - ignoring payload
122 for (var i = 0, l = data.length; i < l; i++) {
123 var chr = data.charAt(i)
128 if ('' == length || (length != (n = Number(length)))) {
129 // parser error - ignoring payload
133 msg = data.substr(i + 1, n);
135 if (length != msg.length) {
136 // parser error - ignoring payload
141 packet = exports.decodePacket(msg);
143 if (err.type == packet.type && err.data == packet.data) {
144 // parser error in individual packet - ignoring payload
148 packets.push(packet);
158 // parser error - ignoring payload