Skip to content

Commit 0550a58

Browse files
addaleaxtargos
authored andcommitted
src: remove StreamBase::kFlagHasWritev
Since libuv 1.21.0, pipes on Windows support `writev` on the libuv side. This allows for some simplification, and makes the `StreamBase` API more uniform (multi-buffer `Write()` is always supported now, including when used by other non-JS consumers like HTTP/2). PR-URL: #21527 Reviewed-By: Colin Ihrig <[email protected]> Reviewed-By: James M Snell <[email protected]>
1 parent a8a7575 commit 0550a58

12 files changed

+63
-30
lines changed

lib/net.js

-4
Original file line numberDiff line numberDiff line change
@@ -210,10 +210,6 @@ function initSocketHandle(self) {
210210
self._handle.owner = self;
211211
self._handle.onread = onread;
212212
self[async_id_symbol] = getNewAsyncId(self._handle);
213-
214-
// If handle doesn't support writev - neither do we
215-
if (!self._handle.writev)
216-
self._writev = null;
217213
}
218214
}
219215

src/js_stream.cc

+1-1
Original file line numberDiff line numberDiff line change
@@ -208,7 +208,7 @@ void JSStream::Initialize(Local<Object> target,
208208
env->SetProtoMethod(t, "readBuffer", ReadBuffer);
209209
env->SetProtoMethod(t, "emitEOF", EmitEOF);
210210

211-
StreamBase::AddMethods<JSStream>(env, t, StreamBase::kFlagHasWritev);
211+
StreamBase::AddMethods<JSStream>(env, t);
212212
target->Set(jsStreamString, t->GetFunction());
213213
}
214214

src/node_file.cc

+1-1
Original file line numberDiff line numberDiff line change
@@ -1997,7 +1997,7 @@ void Initialize(Local<Object> target,
19971997
Local<String> handleString =
19981998
FIXED_ONE_BYTE_STRING(env->isolate(), "FileHandle");
19991999
fd->SetClassName(handleString);
2000-
StreamBase::AddMethods<FileHandle>(env, fd, StreamBase::kFlagNone);
2000+
StreamBase::AddMethods<FileHandle>(env, fd);
20012001
target->Set(context, handleString, fd->GetFunction()).FromJust();
20022002
env->set_fd_constructor_template(fdt);
20032003

src/node_http2.cc

+1-1
Original file line numberDiff line numberDiff line change
@@ -2840,7 +2840,7 @@ void Initialize(Local<Object> target,
28402840
env->SetProtoMethod(stream, "rstStream", Http2Stream::RstStream);
28412841
env->SetProtoMethod(stream, "refreshState", Http2Stream::RefreshState);
28422842
AsyncWrap::AddWrapMethods(env, stream);
2843-
StreamBase::AddMethods<Http2Stream>(env, stream, StreamBase::kFlagHasWritev);
2843+
StreamBase::AddMethods<Http2Stream>(env, stream);
28442844
Local<ObjectTemplate> streamt = stream->InstanceTemplate();
28452845
streamt->SetInternalFieldCount(1);
28462846
env->set_http2stream_constructor_template(streamt);

src/pipe_wrap.cc

-4
Original file line numberDiff line numberDiff line change
@@ -83,11 +83,7 @@ void PipeWrap::Initialize(Local<Object> target,
8383
env->SetProtoMethod(t, "ref", HandleWrap::Ref);
8484
env->SetProtoMethod(t, "hasRef", HandleWrap::HasRef);
8585

86-
#ifdef _WIN32
8786
LibuvStreamWrap::AddMethods(env, t);
88-
#else
89-
LibuvStreamWrap::AddMethods(env, t, StreamBase::kFlagHasWritev);
90-
#endif
9187

9288
env->SetProtoMethod(t, "bind", Bind);
9389
env->SetProtoMethod(t, "listen", Listen);

src/stream_base-inl.h

+2-5
Original file line numberDiff line numberDiff line change
@@ -266,9 +266,7 @@ inline WriteWrap* StreamBase::CreateWriteWrap(
266266
}
267267

268268
template <class Base>
269-
void StreamBase::AddMethods(Environment* env,
270-
Local<FunctionTemplate> t,
271-
int flags) {
269+
void StreamBase::AddMethods(Environment* env, Local<FunctionTemplate> t) {
272270
HandleScope scope(env->isolate());
273271

274272
enum PropertyAttribute attributes =
@@ -324,8 +322,7 @@ void StreamBase::AddMethods(Environment* env,
324322
env->SetProtoMethod(t, "readStart", JSMethod<Base, &StreamBase::ReadStartJS>);
325323
env->SetProtoMethod(t, "readStop", JSMethod<Base, &StreamBase::ReadStopJS>);
326324
env->SetProtoMethod(t, "shutdown", JSMethod<Base, &StreamBase::Shutdown>);
327-
if ((flags & kFlagHasWritev) != 0)
328-
env->SetProtoMethod(t, "writev", JSMethod<Base, &StreamBase::Writev>);
325+
env->SetProtoMethod(t, "writev", JSMethod<Base, &StreamBase::Writev>);
329326
env->SetProtoMethod(t,
330327
"writeBuffer",
331328
JSMethod<Base, &StreamBase::WriteBuffer>);

src/stream_base.h

+1-7
Original file line numberDiff line numberDiff line change
@@ -255,15 +255,9 @@ class StreamResource {
255255

256256
class StreamBase : public StreamResource {
257257
public:
258-
enum Flags {
259-
kFlagNone = 0x0,
260-
kFlagHasWritev = 0x1
261-
};
262-
263258
template <class Base>
264259
static inline void AddMethods(Environment* env,
265-
v8::Local<v8::FunctionTemplate> target,
266-
int flags = kFlagNone);
260+
v8::Local<v8::FunctionTemplate> target);
267261

268262
virtual bool IsAlive() = 0;
269263
virtual bool IsClosing() = 0;

src/stream_wrap.cc

+2-3
Original file line numberDiff line numberDiff line change
@@ -97,8 +97,7 @@ LibuvStreamWrap::LibuvStreamWrap(Environment* env,
9797

9898

9999
void LibuvStreamWrap::AddMethods(Environment* env,
100-
v8::Local<v8::FunctionTemplate> target,
101-
int flags) {
100+
v8::Local<v8::FunctionTemplate> target) {
102101
Local<FunctionTemplate> get_write_queue_size =
103102
FunctionTemplate::New(env->isolate(),
104103
GetWriteQueueSize,
@@ -110,7 +109,7 @@ void LibuvStreamWrap::AddMethods(Environment* env,
110109
Local<FunctionTemplate>(),
111110
static_cast<PropertyAttribute>(ReadOnly | DontDelete));
112111
env->SetProtoMethod(target, "setBlocking", SetBlocking);
113-
StreamBase::AddMethods<LibuvStreamWrap>(env, target, flags);
112+
StreamBase::AddMethods<LibuvStreamWrap>(env, target);
114113
}
115114

116115

src/stream_wrap.h

+1-2
Original file line numberDiff line numberDiff line change
@@ -85,8 +85,7 @@ class LibuvStreamWrap : public HandleWrap, public StreamBase {
8585
AsyncWrap* GetAsyncWrap() override;
8686

8787
static void AddMethods(Environment* env,
88-
v8::Local<v8::FunctionTemplate> target,
89-
int flags = StreamBase::kFlagNone);
88+
v8::Local<v8::FunctionTemplate> target);
9089

9190
protected:
9291
inline void set_fd(int fd) {

src/tcp_wrap.cc

+1-1
Original file line numberDiff line numberDiff line change
@@ -93,7 +93,7 @@ void TCPWrap::Initialize(Local<Object> target,
9393
env->SetProtoMethod(t, "unref", HandleWrap::Unref);
9494
env->SetProtoMethod(t, "hasRef", HandleWrap::HasRef);
9595

96-
LibuvStreamWrap::AddMethods(env, t, StreamBase::kFlagHasWritev);
96+
LibuvStreamWrap::AddMethods(env, t);
9797

9898
env->SetProtoMethod(t, "open", Open);
9999
env->SetProtoMethod(t, "bind", Bind);

src/tls_wrap.cc

+1-1
Original file line numberDiff line numberDiff line change
@@ -895,7 +895,7 @@ void TLSWrap::Initialize(Local<Object> target,
895895
env->SetProtoMethod(t, "destroySSL", DestroySSL);
896896
env->SetProtoMethod(t, "enableCertCb", EnableCertCb);
897897

898-
StreamBase::AddMethods<TLSWrap>(env, t, StreamBase::kFlagHasWritev);
898+
StreamBase::AddMethods<TLSWrap>(env, t);
899899
SSLWrap<TLSWrap>::AddMethods(env, t);
900900

901901
env->SetProtoMethod(t, "getServername", GetServername);
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,52 @@
1+
'use strict';
2+
3+
const common = require('../common');
4+
if (!common.hasCrypto)
5+
common.skip('missing crypto');
6+
const fixtures = require('../common/fixtures');
7+
const assert = require('assert');
8+
const http2 = require('http2');
9+
const fs = require('fs');
10+
const net = require('net');
11+
const path = require('path');
12+
13+
// HTTP/2 servers can listen on a named pipe.
14+
15+
const tmpdir = require('../common/tmpdir');
16+
tmpdir.refresh();
17+
const loc = fixtures.path('url-tests.js');
18+
const fn = path.join(tmpdir.path, 'http2-url-tests.js');
19+
20+
const server = http2.createServer();
21+
22+
server.on('stream', common.mustCall((stream) => {
23+
const dest = stream.pipe(fs.createWriteStream(fn));
24+
25+
dest.on('finish', () => {
26+
assert.strictEqual(fs.readFileSync(loc).length,
27+
fs.readFileSync(fn).length);
28+
});
29+
stream.respond();
30+
stream.end();
31+
}));
32+
33+
server.listen(common.PIPE, common.mustCall(() => {
34+
const client = http2.connect('http://localhost', {
35+
createConnection(url) {
36+
return net.connect(server.address());
37+
}
38+
});
39+
40+
const req = client.request({ ':method': 'POST' });
41+
req.on('response', common.mustCall());
42+
req.resume();
43+
44+
req.on('close', common.mustCall(() => {
45+
server.close();
46+
client.close();
47+
}));
48+
49+
const str = fs.createReadStream(loc);
50+
str.on('end', common.mustCall());
51+
str.pipe(req);
52+
}));

0 commit comments

Comments
 (0)