diff --git a/src/v1/internal/buf.js b/src/v1/internal/buf.js index d9356eea5..dfd4939a5 100644 --- a/src/v1/internal/buf.js +++ b/src/v1/internal/buf.js @@ -511,7 +511,7 @@ class CombinedBuffer extends BaseBuffer { */ class NodeBuffer extends BaseBuffer { constructor(arg) { - let buffer = arg instanceof _node.Buffer ? arg : new _node.Buffer(arg); + const buffer = arg instanceof _node.Buffer ? arg : newNodeJSBuffer(arg); super(buffer.length); this._buffer = buffer; } @@ -559,6 +559,16 @@ class NodeBuffer extends BaseBuffer { } } +function newNodeJSBuffer(arg) { + if (typeof arg === 'number' && typeof _node.Buffer.alloc === 'function') { + // use static factory function present in newer NodeJS versions to allocate new buffer with specified size + return _node.Buffer.alloc(arg); + } else { + // fallback to the old, potentially deprecated constructor + return new _node.Buffer(arg); + } +} + // Use HeapBuffer by default, unless Buffer API is available, see below let _DefaultBuffer = HeapBuffer; try { diff --git a/src/v1/internal/utf8.js b/src/v1/internal/utf8.js index 7bb30dbd6..07b74f5fc 100644 --- a/src/v1/internal/utf8.js +++ b/src/v1/internal/utf8.js @@ -20,21 +20,28 @@ // This module defines a cross-platform UTF-8 encoder and decoder that works // with the Buffer API defined in buf.js -import {alloc, NodeBuffer, HeapBuffer, CombinedBuffer} from "./buf"; +import {alloc, CombinedBuffer, HeapBuffer, NodeBuffer} from './buf'; import {StringDecoder} from 'string_decoder'; import {newError} from './../error'; + let platformObj = {}; try { // This will throw an exception is 'buffer' is not available require.resolve("buffer"); - let decoder = new StringDecoder('utf8'); - let node = require("buffer"); + const decoder = new StringDecoder('utf8'); + const node = require('buffer'); + + // use static factory function present in newer NodeJS versions to create a buffer containing the given string + // or fallback to the old, potentially deprecated constructor + const newNodeJSBuffer = typeof node.Buffer.from === 'function' + ? str => node.Buffer.from(str, 'utf8') + : str => new node.Buffer(str, 'utf8'); platformObj = { "encode": function (str) { - return new NodeBuffer(new node.Buffer(str, "UTF-8")); + return new NodeBuffer(newNodeJSBuffer(str)); }, "decode": function (buffer, length) { if (buffer instanceof NodeBuffer) {