comparison node_modules/socket.io/lib/parser.js @ 69:333afcfd3f3a

added node_modules to project and fixed path to chronometer also added deps to installer script
author tzara <rc-web@kiben.net>
date Sat, 26 Oct 2013 14:12:50 +0100
parents
children
comparison
equal deleted inserted replaced
68:b076cd17638c 69:333afcfd3f3a
1
2 /*!
3 * socket.io-node
4 * Copyright(c) 2011 LearnBoost <dev@learnboost.com>
5 * MIT Licensed
6 */
7
8 /**
9 * Module dependencies.
10 */
11
12 /**
13 * Packet types.
14 */
15
16 var packets = exports.packets = {
17 'disconnect': 0
18 , 'connect': 1
19 , 'heartbeat': 2
20 , 'message': 3
21 , 'json': 4
22 , 'event': 5
23 , 'ack': 6
24 , 'error': 7
25 , 'noop': 8
26 }
27 , packetslist = Object.keys(packets);
28
29 /**
30 * Errors reasons.
31 */
32
33 var reasons = exports.reasons = {
34 'transport not supported': 0
35 , 'client not handshaken': 1
36 , 'unauthorized': 2
37 }
38 , reasonslist = Object.keys(reasons);
39
40 /**
41 * Errors advice.
42 */
43
44 var advice = exports.advice = {
45 'reconnect': 0
46 }
47 , advicelist = Object.keys(advice);
48
49 /**
50 * Encodes a packet.
51 *
52 * @api private
53 */
54
55 exports.encodePacket = function (packet) {
56 var type = packets[packet.type]
57 , id = packet.id || ''
58 , endpoint = packet.endpoint || ''
59 , ack = packet.ack
60 , data = null;
61
62 switch (packet.type) {
63 case 'message':
64 if (packet.data !== '')
65 data = packet.data;
66 break;
67
68 case 'event':
69 var ev = { name: packet.name };
70
71 if (packet.args && packet.args.length) {
72 ev.args = packet.args;
73 }
74
75 data = JSON.stringify(ev);
76 break;
77
78 case 'json':
79 data = JSON.stringify(packet.data);
80 break;
81
82 case 'ack':
83 data = packet.ackId
84 + (packet.args && packet.args.length
85 ? '+' + JSON.stringify(packet.args) : '');
86 break;
87
88 case 'connect':
89 if (packet.qs)
90 data = packet.qs;
91 break;
92
93 case 'error':
94 var reason = packet.reason ? reasons[packet.reason] : ''
95 , adv = packet.advice ? advice[packet.advice] : ''
96
97 if (reason !== '' || adv !== '')
98 data = reason + (adv !== '' ? ('+' + adv) : '')
99
100 break;
101 }
102
103 // construct packet with required fragments
104 var encoded = type + ':' + id + (ack == 'data' ? '+' : '') + ':' + endpoint;
105
106 // data fragment is optional
107 if (data !== null && data !== undefined)
108 encoded += ':' + data;
109
110 return encoded;
111 };
112
113 /**
114 * Encodes multiple messages (payload).
115 *
116 * @param {Array} messages
117 * @api private
118 */
119
120 exports.encodePayload = function (packets) {
121 var decoded = '';
122
123 if (packets.length == 1)
124 return packets[0];
125
126 for (var i = 0, l = packets.length; i < l; i++) {
127 var packet = packets[i];
128 decoded += '\ufffd' + packet.length + '\ufffd' + packets[i]
129 }
130
131 return decoded;
132 };
133
134 /**
135 * Decodes a packet
136 *
137 * @api private
138 */
139
140 var regexp = /([^:]+):([0-9]+)?(\+)?:([^:]+)?:?([\s\S]*)?/;
141
142 /**
143 * Wrap the JSON.parse in a seperate function the crankshaft optimizer will
144 * only punish this function for the usage for try catch
145 *
146 * @api private
147 */
148
149 function parse (data) {
150 try { return JSON.parse(data) }
151 catch (e) { return false }
152 }
153
154 exports.decodePacket = function (data) {
155 var pieces = data.match(regexp);
156
157 if (!pieces) return {};
158
159 var id = pieces[2] || ''
160 , data = pieces[5] || ''
161 , packet = {
162 type: packetslist[pieces[1]]
163 , endpoint: pieces[4] || ''
164 };
165
166 // whether we need to acknowledge the packet
167 if (id) {
168 packet.id = id;
169 if (pieces[3])
170 packet.ack = 'data';
171 else
172 packet.ack = true;
173 }
174
175 // handle different packet types
176 switch (packet.type) {
177 case 'message':
178 packet.data = data || '';
179 break;
180
181 case 'event':
182 pieces = parse(data);
183 if (pieces) {
184 packet.name = pieces.name;
185 packet.args = pieces.args;
186 }
187
188 packet.args = packet.args || [];
189 break;
190
191 case 'json':
192 packet.data = parse(data);
193 break;
194
195 case 'connect':
196 packet.qs = data || '';
197 break;
198
199 case 'ack':
200 pieces = data.match(/^([0-9]+)(\+)?(.*)/);
201 if (pieces) {
202 packet.ackId = pieces[1];
203 packet.args = [];
204
205 if (pieces[3]) {
206 packet.args = parse(pieces[3]) || [];
207 }
208 }
209 break;
210
211 case 'error':
212 pieces = data.split('+');
213 packet.reason = reasonslist[pieces[0]] || '';
214 packet.advice = advicelist[pieces[1]] || '';
215 }
216
217 return packet;
218 };
219
220 /**
221 * Decodes data payload. Detects multiple messages
222 *
223 * @return {Array} messages
224 * @api public
225 */
226
227 exports.decodePayload = function (data) {
228 if (undefined == data || null == data) {
229 return [];
230 }
231
232 if (data[0] == '\ufffd') {
233 var ret = [];
234
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;
239 length = '';
240 } else {
241 length += data[i];
242 }
243 }
244
245 return ret;
246 } else {
247 return [exports.decodePacket(data)];
248 }
249 };