Initial commit
[yaffs-website] / node_modules / websocket-driver / lib / websocket / driver / stream_reader.js
1 'use strict';
2
3 var StreamReader = function() {
4   this._queue     = [];
5   this._queueSize = 0;
6   this._offset    = 0;
7 };
8
9 StreamReader.prototype.put = function(buffer) {
10   if (!buffer || buffer.length === 0) return;
11   if (!buffer.copy) buffer = new Buffer(buffer);
12   this._queue.push(buffer);
13   this._queueSize += buffer.length;
14 };
15
16 StreamReader.prototype.read = function(length) {
17   if (length > this._queueSize) return null;
18   if (length === 0) return new Buffer(0);
19
20   this._queueSize -= length;
21
22   var queue  = this._queue,
23       remain = length,
24       first  = queue[0],
25       buffers, buffer;
26
27   if (first.length >= length) {
28     if (first.length === length) {
29       return queue.shift();
30     } else {
31       buffer = first.slice(0, length);
32       queue[0] = first.slice(length);
33       return buffer;
34     }
35   }
36
37   for (var i = 0, n = queue.length; i < n; i++) {
38     if (remain < queue[i].length) break;
39     remain -= queue[i].length;
40   }
41   buffers = queue.splice(0, i);
42
43   if (remain > 0 && queue.length > 0) {
44     buffers.push(queue[0].slice(0, remain));
45     queue[0] = queue[0].slice(remain);
46   }
47   return this._concat(buffers, length);
48 };
49
50 StreamReader.prototype.eachByte = function(callback, context) {
51   var buffer, n, index;
52
53   while (this._queue.length > 0) {
54     buffer = this._queue[0];
55     n = buffer.length;
56
57     while (this._offset < n) {
58       index = this._offset;
59       this._offset += 1;
60       callback.call(context, buffer[index]);
61     }
62     this._offset = 0;
63     this._queue.shift();
64   }
65 };
66
67 StreamReader.prototype._concat = function(buffers, length) {
68   if (Buffer.concat) return Buffer.concat(buffers, length);
69
70   var buffer = new Buffer(length),
71       offset = 0;
72
73   for (var i = 0, n = buffers.length; i < n; i++) {
74     buffers[i].copy(buffer, offset);
75     offset += buffers[i].length;
76   }
77   return buffer;
78 };
79
80 module.exports = StreamReader;