Bug:Fix file validation issue
[vnfsdk/refrepo.git] / vnfmarket / src / main / webapp / vnfmarket / node_modules / socket.io-client / components / learnboost-engine.io-client / lib / parser.js
1 /**
2  * Module dependencies.
3  */
4
5 var util = require('./util')
6
7 /**
8  * Packet types.
9  */
10
11 var packets = exports.packets = {
12     open:     0    // non-ws
13   , close:    1    // non-ws
14   , ping:     2
15   , pong:     3
16   , message:  4
17   , upgrade:  5
18   , noop:     6
19 };
20
21 var packetslist = util.keys(packets);
22
23 /**
24  * Premade error packet.
25  */
26
27 var err = { type: 'error', data: 'parser error' }
28
29 /**
30  * Encodes a packet.
31  *
32  *     <packet type id> [ `:` <data> ]
33  *
34  * Example:
35  *
36  *     5:hello world
37  *     3
38  *     4
39  *
40  * @api private
41  */
42
43 exports.encodePacket = function (packet) {
44   var encoded = packets[packet.type]
45
46   // data fragment is optional
47   if (undefined !== packet.data) {
48     encoded += String(packet.data);
49   }
50
51   return '' + encoded;
52 };
53
54 /**
55  * Decodes a packet.
56  *
57  * @return {Object} with `type` and `data` (if any)
58  * @api private
59  */
60
61 exports.decodePacket = function (data) {
62   var type = data.charAt(0);
63
64   if (Number(type) != type || !packetslist[type]) {
65     return err;
66   }
67
68   if (data.length > 1) {
69     return { type: packetslist[type], data: data.substring(1) };
70   } else {
71     return { type: packetslist[type] };
72   }
73 };
74
75 /**
76  * Encodes multiple messages (payload).
77  * 
78  *     <length>:data
79  *
80  * Example:
81  *
82  *     11:hello world2:hi
83  *
84  * @param {Array} packets
85  * @api private
86  */
87
88 exports.encodePayload = function (packets) {
89   if (!packets.length) {
90     return '0:';
91   }
92
93   var encoded = ''
94     , message
95
96   for (var i = 0, l = packets.length; i < l; i++) {
97     message = exports.encodePacket(packets[i]);
98     encoded += message.length + ':' + message;
99   }
100
101   return encoded;
102 };
103
104 /*
105  * Decodes data when a payload is maybe expected.
106  *
107  * @param {String} data
108  * @return {Array} packets
109  * @api public
110  */
111
112 exports.decodePayload = function (data) {
113   if (data == '') {
114     // parser error - ignoring payload
115     return [err];
116   }
117
118   var packets = []
119     , length = ''
120     , n, msg, packet
121
122   for (var i = 0, l = data.length; i < l; i++) {
123     var chr = data.charAt(i)
124
125     if (':' != chr) {
126       length += chr;
127     } else {
128       if ('' == length || (length != (n = Number(length)))) {
129         // parser error - ignoring payload
130         return [err];
131       }
132
133       msg = data.substr(i + 1, n);
134
135       if (length != msg.length) {
136         // parser error - ignoring payload
137         return [err];
138       }
139
140       if (msg.length) {
141         packet = exports.decodePacket(msg);
142
143         if (err.type == packet.type && err.data == packet.data) {
144           // parser error in individual packet - ignoring payload
145           return [err];
146         }
147
148         packets.push(packet);
149       }
150
151       // advance cursor
152       i += n;
153       length = ''
154     }
155   }
156
157   if (length != '') {
158     // parser error - ignoring payload
159     return [err];
160   }
161
162   return packets;
163 };