-
Notifications
You must be signed in to change notification settings - Fork 30.5k
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
stream_base: expose bytesRead
getter
#6284
Changes from 3 commits
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
Original file line number | Diff line number | Diff line change |
---|---|---|
|
@@ -97,7 +97,6 @@ exports._normalizeConnectArgs = normalizeConnectArgs; | |
// called when creating new Socket, or when re-using a closed Socket | ||
function initSocketHandle(self) { | ||
self.destroyed = false; | ||
self.bytesRead = 0; | ||
self._bytesDispatched = 0; | ||
self._sockname = null; | ||
|
||
|
@@ -112,6 +111,10 @@ function initSocketHandle(self) { | |
} | ||
} | ||
|
||
|
||
const BYTES_READ = Symbol('bytesRead'); | ||
|
||
|
||
function Socket(options) { | ||
if (!(this instanceof Socket)) return new Socket(options); | ||
|
||
|
@@ -179,6 +182,9 @@ function Socket(options) { | |
// Reserve properties | ||
this.server = null; | ||
this._server = null; | ||
|
||
// Used after `.destroy()` | ||
this[BYTES_READ] = 0; | ||
} | ||
util.inherits(Socket, stream.Duplex); | ||
|
||
|
@@ -470,6 +476,9 @@ Socket.prototype._destroy = function(exception, cb) { | |
if (this !== process.stderr) | ||
debug('close handle'); | ||
var isException = exception ? true : false; | ||
// `bytesRead` should be accessible after `.destroy()` | ||
this[BYTES_READ] = this._handle.bytesRead; | ||
|
||
this._handle.close(() => { | ||
debug('emit close'); | ||
this.emit('close', isException); | ||
|
@@ -521,10 +530,6 @@ function onread(nread, buffer) { | |
// will prevent this from being called again until _read() gets | ||
// called again. | ||
|
||
// if it's not enough data, we'll just call handle.readStart() | ||
// again right away. | ||
self.bytesRead += nread; | ||
|
||
// Optimization: emit the original buffer with end points | ||
var ret = self.push(buffer); | ||
|
||
|
@@ -580,6 +585,9 @@ Socket.prototype._getpeername = function() { | |
return this._peername; | ||
}; | ||
|
||
Socket.prototype.__defineGetter__('bytesRead', function() { | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Since e.g.
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Ack. |
||
return this._handle ? this._handle.bytesRead : this[BYTES_READ]; | ||
}); | ||
|
||
Socket.prototype.__defineGetter__('remoteAddress', function() { | ||
return this._getpeername().address; | ||
|
Original file line number | Diff line number | Diff line change |
---|---|---|
|
@@ -43,6 +43,13 @@ void StreamBase::AddMethods(Environment* env, | |
v8::DEFAULT, | ||
attributes); | ||
|
||
t->InstanceTemplate()->SetAccessor(env->bytes_read_string(), | ||
GetBytesRead<Base>, | ||
nullptr, | ||
env->as_external(), | ||
v8::DEFAULT, | ||
attributes); | ||
|
||
env->SetProtoMethod(t, "readStart", JSMethod<Base, &StreamBase::ReadStart>); | ||
env->SetProtoMethod(t, "readStop", JSMethod<Base, &StreamBase::ReadStop>); | ||
if ((flags & kFlagNoShutdown) == 0) | ||
|
@@ -79,6 +86,16 @@ void StreamBase::GetFD(Local<String> key, | |
} | ||
|
||
|
||
template <class Base> | ||
void StreamBase::GetBytesRead(Local<String> key, | ||
const PropertyCallbackInfo<Value>& args) { | ||
StreamBase* wrap = Unwrap<Base>(args.Holder()); | ||
|
||
// int64_t -> double. 53bits is enough for all real cases. | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more.
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Ack, thanks! |
||
args.GetReturnValue().Set(static_cast<double>(wrap->bytes_read_)); | ||
} | ||
|
||
|
||
template <class Base> | ||
void StreamBase::GetExternal(Local<String> key, | ||
const PropertyCallbackInfo<Value>& args) { | ||
|
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,38 @@ | ||
'use strict'; | ||
|
||
const common = require('../common'); | ||
const assert = require('assert'); | ||
const net = require('net'); | ||
|
||
const big = new Buffer(1024 * 1024); | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more.
actually...
and you can remove the fill on the next line There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Mmm... this may give us some headache during backport to v4 There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Nevertheless, ack. There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Understood. We're going to have that problem in general anyway. Best to use the new APIs moving forward tho There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Yeah, that's why I fixed it ;) |
||
big.fill('-'); | ||
|
||
const server = net.createServer((socket) => { | ||
socket.end(big); | ||
server.close(); | ||
}).listen(common.PORT, () => { | ||
let prev = 0; | ||
|
||
function checkRaise(value) { | ||
assert(value > prev); | ||
prev = value; | ||
} | ||
|
||
const socket = net.connect(common.PORT, () => { | ||
socket.on('data', (chunk) => { | ||
checkRaise(socket.bytesRead); | ||
}); | ||
|
||
socket.on('end', common.mustCall(() => { | ||
assert.equal(socket.bytesRead, prev); | ||
assert.equal(big.length, prev); | ||
})); | ||
|
||
socket.on('close', common.mustCall(() => { | ||
assert(!socket._handle); | ||
assert.equal(socket.bytesRead, prev); | ||
assert.equal(big.length, prev); | ||
})); | ||
}); | ||
socket.end(); | ||
}); |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
I think the naming preference is something like
kBytesRead
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Is it?
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Ok, yep, I've seen comments both ways but the code doesn't lie ;-)