Mercurial > hg > nodescore
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 }; |