code: function CustomBuffer(existingBuffer) {
      var buffer = existingBuffer || new Buffer(48);
      var offset = 0;
  
      this.writeVarInt = function(val) {
          while (true) {
              if ((val & 0xFFFFFF80) == 0) {
                  this.writeUByte(val);
  
                  return;
              }
  
              this.writeUByte(val & 0x7F | 0x80);
  
              val = val >>> 7;
          }
      };
  
      this.writeString = function(string) {
          this.writeVarInt(string.length);
  
          if (offset + string.length >= buffer.length) {
              Buffer.concat([buffer, new Buffer(string.length)]);
          }
  
          buffer.write(string, offset, string.length, "UTF-8");
  
          offset += string.length;
      };
  
      this.writeUShort = function(val) {
          this.writeUByte(val >> 8);
          this.writeUByte(val & 0xFF);
      };
  
      this.writeUByte = function(val) {
          if (offset + 1 >= buffer.length) {
              Buffer.concat([buffer, new Buffer(50)]);
          }
  
          buffer.writeUInt8(val, offset++);
      };
  
      this.readVarInt = function() {
          var val = 0;
          var count = 0;
  
          while (true) {
              var i = buffer.readUInt8(offset++);
  
              val |= (i & 0x7F) << count++ * 7;
  
              if ((i & 0x80) != 128) {
                  break
              }
          }
  
          return val;
      };
  
      this.readString = function() {
          var length = this.readVarInt();
          var str = buffer.toString("UTF-8", offset, offset + length);
  
          offset += length;
          
          return str;
      };
  
      this.buffer = function() {
          return buffer.slice(0, offset);
      };
  
      this.offset = function() {
          return offset;
      };
  }
docs: Credits to @Cryptkeeper