Bug:Fix file validation issue
[vnfsdk/refrepo.git] / vnfmarket / src / main / webapp / vnfmarket / node_modules / socket.io / lib / parser.js
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 };