-
Notifications
You must be signed in to change notification settings - Fork 0
/
channels.js
117 lines (87 loc) · 2.82 KB
/
channels.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
'use strict';
var inherits = require('inherits');
var Channel = require('jschan/lib/channels').Channel;
var ReadChannel = require('jschan/lib/channels').ReadChannel;
var WriteChannel = require('jschan/lib/channels').WriteChannel;
var ByteStream = require('jschan/lib/channels').ByteStream;
function handle(inStream, outStream) {
/*jshint validthis:true */
this.handleIn(inStream);
this.handleOut(outStream);
return this;
}
function SPDYReadChannel(session, id) {
ReadChannel.call(this, session, id);
}
inherits(SPDYReadChannel, ReadChannel);
SPDYReadChannel.prototype.handle = handle;
SPDYReadChannel.prototype._transform = function transform(buf, enc, done) {
if (this.skipFirstChunk) {
delete this.skipFirstChunk;
return done();
}
var decoded = this._session.encoder.decode(buf);
this.push(decoded);
done();
};
SPDYReadChannel.prototype.handleIn = function handleIn(inStream) {
var that = this;
this._inStream = inStream;
this._inStream.pipe(this);
this._inStream.on('end', function() {
that._outStream.end();
});
this._inStream.on('error', this.emit.bind(this, 'error'));
};
SPDYReadChannel.prototype.handleOut = function handleOut(outStream) {
this._outStream = outStream;
this._outStream.on('error', this.emit.bind(this, 'error'));
};
function SPDYWriteChannel(session, id) {
WriteChannel.call(this, session, id);
}
inherits(SPDYWriteChannel, WriteChannel);
SPDYWriteChannel.prototype.handle = handle;
SPDYWriteChannel.prototype._transform = function transform(buf, enc, done) {
try {
var encoded = this._session.encoder.encode(buf, this);
this.push(encoded.slice(0, encoded.length));
} catch(err) {
this.emit('error', err);
}
done();
};
SPDYWriteChannel.prototype.handleIn = function handle(inStream) {
this._inStream = inStream;
// nothing to do with the input
inStream.resume();
inStream.on('error', this.emit.bind(this, 'error'));
this.on('finish', function() {
// skip all errors
inStream.removeAllListeners('error');
inStream.on('error', function() {});
});
};
SPDYWriteChannel.prototype.handleOut = function handle(outStream) {
this._outStream = outStream;
this.pipe(outStream);
outStream.on('error', this.emit.bind(this, 'error'));
this.on('finish', function() {
// skip all errors
outStream.removeAllListeners('error');
outStream.on('error', function() {});
});
};
function SPDYByteStream(session, id) {
ByteStream.call(this, session, id);
}
inherits(SPDYByteStream, ByteStream);
SPDYByteStream.prototype.handle = handle;
SPDYByteStream.prototype.handleIn = ByteStream.prototype.hookReadable;
SPDYByteStream.prototype.handleOut = ByteStream.prototype.hookWritable;
module.exports = {
Channel: Channel,
ReadChannel: SPDYReadChannel,
WriteChannel: SPDYWriteChannel,
ByteStream: SPDYByteStream
};