Exemple #1
0
  function copy() {
    binary.writeUInt32LE(OFFSET_BUFFER, 0, 0)
    binary.writeUInt32LE(LENGTH_BUFFER, 0, 0)

    var check = 1
      , length
      , offset

    for(var x = 0; x < 4; ++x) {
      if(command & check) {
        OFFSET_BUFFER[3 - x] = delta[idx++]
      }
      check <<= 1
    }

    for(var x = 0; x < 3; ++x) {
      if(command & check) {
        LENGTH_BUFFER[3 - x] = delta[idx++]
      }
      check <<= 1
    }
    LENGTH_BUFFER[0] = 0

    length = binary.readUInt32BE(LENGTH_BUFFER, 0) || 0x10000
    offset = binary.readUInt32BE(OFFSET_BUFFER, 0)

    binary.copy(target, output_buffer, out_idx, offset, offset + length)
    out_idx += length
  }
Exemple #2
0
function write_string_no_pos(buffer, pos, string) {
  if (Buffer.isBuffer(buffer)) {
    buffer.write(string, pos);
  } else {
    var bufString = bops.from(string, 'utf8');
    bops.copy(bufString, buffer, pos, 0, bufString.length);
  }
}
    encode: function(message) {

        var keys = message.senderKey.split(':');
        var ip = keys[0].split('.');
        var toPack;

        if(message.encrypted) {
            toPack = [
                msgpack.encode(parseInt(ip[0])),
                msgpack.encode(parseInt(ip[1])),
                msgpack.encode(parseInt(ip[2])),
                msgpack.encode(parseInt(ip[3])),
                msgpack.encode(parseInt(keys[1])),
                msgpack.encode(parseInt(keys[2])),
                msgpack.encode(true),
                msgpack.encode(message.key),
                msgpack.encode(message.executeTime),
                msgpack.encode(message.millisecondsSinceMidnight),
                msgpack.encode(message.topic),
                msgpack.encode(message.partition),
                msgpack.encode(message.type),
                msgpack.encode(message.payload)
            ];
        } else {
            toPack = [
                msgpack.encode(parseInt(ip[0])),
                msgpack.encode(parseInt(ip[1])),
                msgpack.encode(parseInt(ip[2])),
                msgpack.encode(parseInt(ip[3])),
                msgpack.encode(parseInt(keys[1])),
                msgpack.encode(parseInt(keys[2])),
                msgpack.encode(false),
                msgpack.encode(parseInt(message.executeTime)),
                msgpack.encode(parseInt(message.millisecondsSinceMidnight)),
                msgpack.encode(message.topic),
                msgpack.encode(message.partition),
                msgpack.encode(message.type),
                msgpack.encode(message.payload)
            ];
        }

        var buff = bops.join(toPack);

        var newBuff = bops.create(buff.length + 2);
        bops.copy(buff, newBuff, 2, 0, buff.length);
        bops.writeUInt16BE(newBuff, buff.length, 0);

        return newBuff;
    }
Exemple #4
0
exports.toBuffer = function (data) {
  if (typeof data === 'string') {
    return bops.from(data).buffer

  } else if (bops.is(data)) {
    // If data is a TypedArrayView (Uint8Array) then copy the buffer, so the
    // underlying buffer will be exactly the right size. We care about this
    // because the Chrome `sendTo` function will be passed the underlying
    // ArrayBuffer.
    var newBuf = bops.create(data.length)
    bops.copy(data, newBuf, 0, 0, data.length)
    return newBuf.buffer

  } else if (data.buffer) {
    return data.buffer

  } else if (data instanceof ArrayBuffer) {
    return data

  } else {
    throw new Error('Cannot convert data to ArrayBuffer type')
  }

}
Exemple #5
0
function encode(value, buffer, offset) {
  var type = typeof value;
  var length, size;

  // Strings Bytes
  if (type === "string") {
    value = bops.from(value);
    length = value.length;
    // fixstr
    if (length < 0x20) {
      buffer[offset] = length | 0xa0;
      bops.copy(value, buffer, offset + 1);
      return 1 + length;
    }
    // str 8
    if (length < 0x100) {
      buffer[offset] = 0xd9;
      bops.writeUInt8(buffer, length, offset + 1);
      bops.copy(value, buffer, offset + 2);
      return 2 + length;
    }
    // str 16
    if (length < 0x10000) {
      buffer[offset] = 0xda;
      bops.writeUInt16BE(buffer, length, offset + 1);
      bops.copy(value, buffer, offset + 3);
      return 3 + length;
    }
    // str 32
    if (length < 0x100000000) {
      buffer[offset] = 0xdb;
      bops.writeUInt32BE(buffer, length, offset + 1);
      bops.copy(value, buffer, offset + 5);
      return 5 + length;
    }
  }

  if (bops.is(value)) {
    length = value.length;
    // bin 8
    if (length < 0x100) {
      buffer[offset] = 0xc4;
      bops.writeUInt8(buffer, length, offset + 1);
      bops.copy(value, buffer, offset + 2);
      return 2 + length;
    }
    // bin 16
    if (length < 0x10000) {
      buffer[offset] = 0xd8;
      bops.writeUInt16BE(buffer, length, offset + 1);
      bops.copy(value, buffer, offset + 3);
      return 3 + length;
    }
    // bin 32
    if (length < 0x100000000) {
      buffer[offset] = 0xd9;
      bops.writeUInt32BE(buffer, length, offset + 1);
      bops.copy(value, buffer, offset + 5);
      return 5 + length;
    }
  }

  if (type === "number") {
    // Floating Point
    if ((value << 0) !== value) {
      buffer[offset] =  0xcb;
      bops.writeDoubleBE(buffer, value, offset + 1);
      return 9;
    }

    // Integers
    if (value >=0) {
      // positive fixnum
      if (value < 0x80) {
        buffer[offset] = value;
        return 1;
      }
      // uint 8
      if (value < 0x100) {
        buffer[offset] = 0xcc;
        buffer[offset + 1] = value;
        return 2;
      }
      // uint 16
      if (value < 0x10000) {
        buffer[offset] = 0xcd;
        bops.writeUInt16BE(buffer, value, offset + 1);
        return 3;
      }
      // uint 32
      if (value < 0x100000000) {
        buffer[offset] = 0xce;
        bops.writeUInt32BE(buffer, value, offset + 1);
        return 5;
      }
      // uint 64
      if (value < 0x10000000000000000) {
        buffer[offset] = 0xcf;
        bops.writeUInt64BE(buffer, value, offset + 1);
        return 9;
      }
      throw new Error("Number too big 0x" + value.toString(16));
    }
    // negative fixnum
    if (value >= -0x20) {
      bops.writeInt8(buffer, value, offset);
      return 1;
    }
    // int 8
    if (value >= -0x80) {
      buffer[offset] = 0xd0;
      bops.writeInt8(buffer, value, offset + 1);
      return 2;
    }
    // int 16
    if (value >= -0x8000) {
      buffer[offset] = 0xd1;
      bops.writeInt16BE(buffer, value, offset + 1);
      return 3;
    }
    // int 32
    if (value >= -0x80000000) {
      buffer[offset] = 0xd2;
      bops.writeInt32BE(buffer, value, offset + 1);
      return 5;
    }
    // int 64
    if (value >= -0x8000000000000000) {
      buffer[offset] = 0xd3;
      bops.writeInt64BE(buffer, value, offset + 1);
      return 9;
    }
    throw new Error("Number too small -0x" + value.toString(16).substr(1));
  }

  if (type === "undefined") {
    buffer[offset] = 0xd4;
    buffer[offset + 1] = 0x00; // fixext special type/value
    buffer[offset + 2] = 0x00;
    return 1;
  }

  // null
  if (value === null) {
    buffer[offset] = 0xc0;
    return 1;
  }

  // Boolean
  if (type === "boolean") {
    buffer[offset] = value ? 0xc3 : 0xc2;
    return 1;
  }

  // Custom toJSON function.
  if (typeof value.toJSON === 'function') {
    return encode(value.toJSON(), buffer, offset);
  }

  // Container Types
  if (type === "object") {

    size = 0;
    var isArray = Array.isArray(value);

    if (isArray) {
      length = value.length;
    }
    else {
      var keys = encodeableKeys(value);
      length = keys.length;
    }

    // fixarray
    if (length < 0x10) {
      buffer[offset] = length | (isArray ? 0x90 : 0x80);
      size = 1;
    }
    // array 16 / map 16
    else if (length < 0x10000) {
      buffer[offset] = isArray ? 0xdc : 0xde;
      bops.writeUInt16BE(buffer, length, offset + 1);
      size = 3;
    }
    // array 32 / map 32
    else if (length < 0x100000000) {
      buffer[offset] = isArray ? 0xdd : 0xdf;
      bops.writeUInt32BE(buffer, length, offset + 1);
      size = 5;
    }

    if (isArray) {
      for (var i = 0; i < length; i++) {
        size += encode(value[i], buffer, offset + size);
      }
    }
    else {
      for (var i = 0; i < length; i++) {
        var key = keys[i];
        size += encode(key, buffer, offset + size);
        size += encode(value[key], buffer, offset + size);
      }
    }

    return size;
  }
  if (type === "function") return undefined;
  throw new Error("Unknown type " + type);
}
Exemple #6
0
 value.forEach(function(e) { bops.copy(e, buffer, offset + size); size += e.length; });
Exemple #7
0
 function insert() {
   binary.copy(delta, output_buffer, out_idx, idx, command + idx)
   idx += command
   out_idx += command
 }
Exemple #8
0
function write_buffer(buffer, pos, src) {
  bops.copy(src, buffer, pos); 
  return src.length;
}