@@ -107,8 +107,8 @@ enum node_zlib_mode {
107
107
BROTLI_ENCODE
108
108
};
109
109
110
- # define GZIP_HEADER_ID1 0x1f
111
- # define GZIP_HEADER_ID2 0x8b
110
+ constexpr uint8_t GZIP_HEADER_ID1 = 0x1f ;
111
+ constexpr uint8_t GZIP_HEADER_ID2 = 0x8b ;
112
112
113
113
struct CompressionError {
114
114
CompressionError (const char * message, const char * code, int err)
@@ -127,14 +127,14 @@ struct CompressionError {
127
127
inline bool IsError () const { return code != nullptr ; }
128
128
};
129
129
130
- class ZlibContext : public MemoryRetainer {
130
+ class ZlibContext final : public MemoryRetainer {
131
131
public:
132
132
ZlibContext () = default ;
133
133
134
134
// Streaming-related, should be available for all compression libraries:
135
135
void Close ();
136
136
void DoThreadPoolWork ();
137
- void SetBuffers (char * in, uint32_t in_len, char * out, uint32_t out_len);
137
+ void SetBuffers (const char * in, uint32_t in_len, char * out, uint32_t out_len);
138
138
void SetFlush (int flush);
139
139
void GetAfterWriteOffsets (uint32_t * avail_in, uint32_t * avail_out) const ;
140
140
CompressionError GetErrorInfo () const ;
@@ -183,7 +183,7 @@ class BrotliContext : public MemoryRetainer {
183
183
public:
184
184
BrotliContext () = default ;
185
185
186
- void SetBuffers (char * in, uint32_t in_len, char * out, uint32_t out_len);
186
+ void SetBuffers (const char * in, uint32_t in_len, char * out, uint32_t out_len);
187
187
void SetFlush (int flush);
188
188
void GetAfterWriteOffsets (uint32_t * avail_in, uint32_t * avail_out) const ;
189
189
inline void SetMode (node_zlib_mode mode) { mode_ = mode; }
@@ -193,7 +193,7 @@ class BrotliContext : public MemoryRetainer {
193
193
194
194
protected:
195
195
node_zlib_mode mode_ = NONE;
196
- uint8_t * next_in_ = nullptr ;
196
+ const uint8_t * next_in_ = nullptr ;
197
197
uint8_t * next_out_ = nullptr ;
198
198
size_t avail_in_ = 0 ;
199
199
size_t avail_out_ = 0 ;
@@ -251,6 +251,12 @@ class BrotliDecoderContext final : public BrotliContext {
251
251
template <typename CompressionContext>
252
252
class CompressionStream : public AsyncWrap , public ThreadPoolWork {
253
253
public:
254
+ enum InternalFields {
255
+ kCompressionStreamBaseField = AsyncWrap::kInternalFieldCount ,
256
+ kWriteJSCallback ,
257
+ kInternalFieldCount
258
+ };
259
+
254
260
CompressionStream (Environment* env, Local<Object> wrap)
255
261
: AsyncWrap(env, wrap, AsyncWrap::PROVIDER_ZLIB),
256
262
ThreadPoolWork (env),
@@ -259,7 +265,7 @@ class CompressionStream : public AsyncWrap, public ThreadPoolWork {
259
265
}
260
266
261
267
~CompressionStream () override {
262
- CHECK_EQ ( false , write_in_progress_ && " write in progress " );
268
+ CHECK (! write_in_progress_);
263
269
Close ();
264
270
CHECK_EQ (zlib_memory_, 0 );
265
271
CHECK_EQ (unreported_allocations_, 0 );
@@ -295,7 +301,7 @@ class CompressionStream : public AsyncWrap, public ThreadPoolWork {
295
301
CHECK_EQ (args.Length (), 7 );
296
302
297
303
uint32_t in_off, in_len, out_off, out_len, flush;
298
- char * in;
304
+ const char * in;
299
305
char * out;
300
306
301
307
CHECK_EQ (false , args[0 ]->IsUndefined () && " must provide flush value" );
@@ -340,7 +346,7 @@ class CompressionStream : public AsyncWrap, public ThreadPoolWork {
340
346
341
347
template <bool async>
342
348
void Write (uint32_t flush,
343
- char * in, uint32_t in_len,
349
+ const char * in, uint32_t in_len,
344
350
char * out, uint32_t out_len) {
345
351
AllocScope alloc_scope (this );
346
352
@@ -394,6 +400,7 @@ class CompressionStream : public AsyncWrap, public ThreadPoolWork {
394
400
395
401
// v8 land!
396
402
void AfterThreadPoolWork (int status) override {
403
+ DCHECK (init_done_);
397
404
AllocScope alloc_scope (this );
398
405
auto on_scope_leave = OnScopeLeave ([&]() { Unref (); });
399
406
@@ -416,9 +423,8 @@ class CompressionStream : public AsyncWrap, public ThreadPoolWork {
416
423
UpdateWriteResult ();
417
424
418
425
// call the write() cb
419
- Local<Function> cb = PersistentToLocal::Default (env->isolate (),
420
- write_js_callback_);
421
- MakeCallback (cb, 0 , nullptr );
426
+ Local<Value> cb = object ()->GetInternalField (kWriteJSCallback );
427
+ MakeCallback (cb.As <Function>(), 0 , nullptr );
422
428
423
429
if (pending_close_)
424
430
Close ();
@@ -431,7 +437,7 @@ class CompressionStream : public AsyncWrap, public ThreadPoolWork {
431
437
CHECK_EQ (env->context (), env->isolate ()->GetCurrentContext ());
432
438
433
439
HandleScope scope (env->isolate ());
434
- Local<Value> args[3 ] = {
440
+ Local<Value> args[] = {
435
441
OneByteString (env->isolate (), err.message ),
436
442
Integer::New (env->isolate (), err.err ),
437
443
OneByteString (env->isolate (), err.code )
@@ -465,7 +471,7 @@ class CompressionStream : public AsyncWrap, public ThreadPoolWork {
465
471
466
472
void InitStream (uint32_t * write_result, Local<Function> write_js_callback) {
467
473
write_result_ = write_result;
468
- write_js_callback_. Reset ( AsyncWrap::env ( )->isolate () , write_js_callback);
474
+ object ( )->SetInternalField ( kWriteJSCallback , write_js_callback);
469
475
init_done_ = true ;
470
476
}
471
477
@@ -540,14 +546,13 @@ class CompressionStream : public AsyncWrap, public ThreadPoolWork {
540
546
bool closed_ = false ;
541
547
unsigned int refs_ = 0 ;
542
548
uint32_t * write_result_ = nullptr ;
543
- Global<Function> write_js_callback_;
544
549
std::atomic<ssize_t > unreported_allocations_{0 };
545
550
size_t zlib_memory_ = 0 ;
546
551
547
552
CompressionContext ctx_;
548
553
};
549
554
550
- class ZlibStream : public CompressionStream <ZlibContext> {
555
+ class ZlibStream final : public CompressionStream<ZlibContext> {
551
556
public:
552
557
ZlibStream (Environment* env, Local<Object> wrap, node_zlib_mode mode)
553
558
: CompressionStream(env, wrap) {
@@ -646,7 +651,8 @@ class ZlibStream : public CompressionStream<ZlibContext> {
646
651
};
647
652
648
653
template <typename CompressionContext>
649
- class BrotliCompressionStream : public CompressionStream <CompressionContext> {
654
+ class BrotliCompressionStream final :
655
+ public CompressionStream<CompressionContext> {
650
656
public:
651
657
BrotliCompressionStream (Environment* env,
652
658
Local<Object> wrap,
@@ -857,10 +863,10 @@ void ZlibContext::DoThreadPoolWork() {
857
863
}
858
864
859
865
860
- void ZlibContext::SetBuffers (char * in, uint32_t in_len,
866
+ void ZlibContext::SetBuffers (const char * in, uint32_t in_len,
861
867
char * out, uint32_t out_len) {
862
868
strm_.avail_in = in_len;
863
- strm_.next_in = reinterpret_cast <Bytef*>(in);
869
+ strm_.next_in = const_cast <Bytef*>( reinterpret_cast <const Bytef*>(in) );
864
870
strm_.avail_out = out_len;
865
871
strm_.next_out = reinterpret_cast <Bytef*>(out);
866
872
}
@@ -1093,9 +1099,9 @@ CompressionError ZlibContext::SetParams(int level, int strategy) {
1093
1099
}
1094
1100
1095
1101
1096
- void BrotliContext::SetBuffers (char * in, uint32_t in_len,
1102
+ void BrotliContext::SetBuffers (const char * in, uint32_t in_len,
1097
1103
char * out, uint32_t out_len) {
1098
- next_in_ = reinterpret_cast <uint8_t *>(in);
1104
+ next_in_ = reinterpret_cast <const uint8_t *>(in);
1099
1105
next_out_ = reinterpret_cast <uint8_t *>(out);
1100
1106
avail_in_ = in_len;
1101
1107
avail_out_ = out_len;
0 commit comments