4 * Copyright(c) 2011 LearnBoost <dev@learnboost.com>
8 (function (exports, io) {
16 var parser = exports.parser = {};
22 var packets = parser.packets = [
38 var reasons = parser.reasons = [
39 'transport not supported'
40 , 'client not handshaken'
48 var advice = parser.advice = [
57 , indexOf = io.util.indexOf;
65 parser.encodePacket = function (packet) {
66 var type = indexOf(packets, packet.type)
67 , id = packet.id || ''
68 , endpoint = packet.endpoint || ''
72 switch (packet.type) {
74 var reason = packet.reason ? indexOf(reasons, packet.reason) : ''
75 , adv = packet.advice ? indexOf(advice, packet.advice) : '';
77 if (reason !== '' || adv !== '')
78 data = reason + (adv !== '' ? ('+' + adv) : '');
83 if (packet.data !== '')
88 var ev = { name: packet.name };
90 if (packet.args && packet.args.length) {
91 ev.args = packet.args;
94 data = JSON.stringify(ev);
98 data = JSON.stringify(packet.data);
108 + (packet.args && packet.args.length
109 ? '+' + JSON.stringify(packet.args) : '');
113 // construct packet with required fragments
116 , id + (ack == 'data' ? '+' : '')
120 // data fragment is optional
121 if (data !== null && data !== undefined)
124 return encoded.join(':');
128 * Encodes multiple messages (payload).
130 * @param {Array} messages
134 parser.encodePayload = function (packets) {
137 if (packets.length == 1)
140 for (var i = 0, l = packets.length; i < l; i++) {
141 var packet = packets[i];
142 decoded += '\ufffd' + packet.length + '\ufffd' + packets[i];
154 var regexp = /([^:]+):([0-9]+)?(\+)?:([^:]+)?:?([\s\S]*)?/;
156 parser.decodePacket = function (data) {
157 var pieces = data.match(regexp);
159 if (!pieces) return {};
161 var id = pieces[2] || ''
162 , data = pieces[5] || ''
164 type: packets[pieces[1]]
165 , endpoint: pieces[4] || ''
168 // whether we need to acknowledge the packet
177 // handle different packet types
178 switch (packet.type) {
180 var pieces = data.split('+');
181 packet.reason = reasons[pieces[0]] || '';
182 packet.advice = advice[pieces[1]] || '';
186 packet.data = data || '';
191 var opts = JSON.parse(data);
192 packet.name = opts.name;
193 packet.args = opts.args;
196 packet.args = packet.args || [];
201 packet.data = JSON.parse(data);
206 packet.qs = data || '';
210 var pieces = data.match(/^([0-9]+)(\+)?(.*)/);
212 packet.ackId = pieces[1];
217 packet.args = pieces[3] ? JSON.parse(pieces[3]) : [];
232 * Decodes data payload. Detects multiple messages
234 * @return {Array} messages
238 parser.decodePayload = function (data) {
239 // IE doesn't like data[i] for unicode chars, charAt works fine
240 if (data.charAt(0) == '\ufffd') {
243 for (var i = 1, length = ''; i < data.length; i++) {
244 if (data.charAt(i) == '\ufffd') {
245 ret.push(parser.decodePacket(data.substr(i + 1).substr(0, length)));
246 i += Number(length) + 1;
249 length += data.charAt(i);
255 return [parser.decodePacket(data)];
260 'undefined' != typeof io ? io : module.exports
261 , 'undefined' != typeof io ? io : module.parent.exports