4 * Copyright(c) 2011 LearnBoost <dev@learnboost.com>
16 var packets = exports.packets = {
27 , packetslist = Object.keys(packets);
33 var reasons = exports.reasons = {
34 'transport not supported': 0
35 , 'client not handshaken': 1
38 , reasonslist = Object.keys(reasons);
44 var advice = exports.advice = {
47 , advicelist = Object.keys(advice);
55 exports.encodePacket = function (packet) {
56 var type = packets[packet.type]
57 , id = packet.id || ''
58 , endpoint = packet.endpoint || ''
62 switch (packet.type) {
64 if (packet.data !== '')
69 var ev = { name: packet.name };
71 if (packet.args && packet.args.length) {
72 ev.args = packet.args;
75 data = JSON.stringify(ev);
79 data = JSON.stringify(packet.data);
84 + (packet.args && packet.args.length
85 ? '+' + JSON.stringify(packet.args) : '');
94 var reason = packet.reason ? reasons[packet.reason] : ''
95 , adv = packet.advice ? advice[packet.advice] : ''
97 if (reason !== '' || adv !== '')
98 data = reason + (adv !== '' ? ('+' + adv) : '')
103 // construct packet with required fragments
104 var encoded = type + ':' + id + (ack == 'data' ? '+' : '') + ':' + endpoint;
106 // data fragment is optional
107 if (data !== null && data !== undefined)
108 encoded += ':' + data;
114 * Encodes multiple messages (payload).
116 * @param {Array} messages
120 exports.encodePayload = function (packets) {
123 if (packets.length == 1)
126 for (var i = 0, l = packets.length; i < l; i++) {
127 var packet = packets[i];
128 decoded += '\ufffd' + packet.length + '\ufffd' + packets[i]
140 var regexp = /([^:]+):([0-9]+)?(\+)?:([^:]+)?:?([\s\S]*)?/;
143 * Wrap the JSON.parse in a seperate function the crankshaft optimizer will
144 * only punish this function for the usage for try catch
149 function parse (data) {
150 try { return JSON.parse(data) }
151 catch (e) { return false }
154 exports.decodePacket = function (data) {
155 var pieces = data.match(regexp);
157 if (!pieces) return {};
159 var id = pieces[2] || ''
160 , data = pieces[5] || ''
162 type: packetslist[pieces[1]]
163 , endpoint: pieces[4] || ''
166 // whether we need to acknowledge the packet
175 // handle different packet types
176 switch (packet.type) {
178 packet.data = data || '';
182 pieces = parse(data);
184 packet.name = pieces.name;
185 packet.args = pieces.args;
188 packet.args = packet.args || [];
192 packet.data = parse(data);
196 packet.qs = data || '';
200 pieces = data.match(/^([0-9]+)(\+)?(.*)/);
202 packet.ackId = pieces[1];
206 packet.args = parse(pieces[3]) || [];
212 pieces = data.split('+');
213 packet.reason = reasonslist[pieces[0]] || '';
214 packet.advice = advicelist[pieces[1]] || '';
221 * Decodes data payload. Detects multiple messages
223 * @return {Array} messages
227 exports.decodePayload = function (data) {
228 if (undefined == data || null == data) {
232 if (data[0] == '\ufffd') {
235 for (var i = 1, length = ''; i < data.length; i++) {
236 if (data[i] == '\ufffd') {
237 ret.push(exports.decodePacket(data.substr(i + 1, length)));
238 i += Number(length) + 1;
247 return [exports.decodePacket(data)];