cbor-x 1.5.3 → 1.5.5

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.js CHANGED
@@ -821,9 +821,18 @@
821
821
  return (glbl[data[0]] || Error)(data[1], data[2])
822
822
  };
823
823
  const packedTable = (read) => {
824
- if (src[position$1++] != 0x84)
825
- throw new Error('Packed values structure must be followed by a 4 element array')
824
+ if (src[position$1++] != 0x84) {
825
+ let error = new Error('Packed values structure must be followed by a 4 element array');
826
+ if (src.length < position$1)
827
+ error.incomplete = true;
828
+ throw error
829
+ }
826
830
  let newPackedValues = read(); // packed values
831
+ if (!newPackedValues || !newPackedValues.length) {
832
+ let error = new Error('Packed values structure must be followed by a 4 element array');
833
+ error.incomplete = true;
834
+ throw error
835
+ }
827
836
  packedValues = packedValues ? newPackedValues.concat(packedValues.slice(newPackedValues.length)) : newPackedValues;
828
837
  packedValues.prefixes = read();
829
838
  packedValues.suffixes = read();
@@ -841,7 +850,10 @@
841
850
  }
842
851
  if (typeof data == 'number')
843
852
  return packedValues[16 + (data >= 0 ? 2 * data : (-2 * data - 1))]
844
- throw new Error('No support for non-integer packed references yet')
853
+ let error = new Error('No support for non-integer packed references yet');
854
+ if (data === undefined)
855
+ error.incomplete = true;
856
+ throw error
845
857
  };
846
858
 
847
859
  // The following code is an incomplete implementation of http://cbor.schmorp.de/stringref
@@ -967,7 +979,15 @@
967
979
  currentExtensions[littleEndian ? tag : (tag - 4)] = (bytesPerElement == 1 || littleEndian == isLittleEndianMachine$1) ? (buffer) => {
968
980
  if (!TypedArray)
969
981
  throw new Error('Could not find typed array for code ' + tag)
970
- // we have to always slice/copy here to get a new ArrayBuffer that is word/byte aligned
982
+ if (!currentDecoder.copyBuffers) {
983
+ // try provide a direct view, but will only work if we are byte-aligned
984
+ if (bytesPerElement === 1 ||
985
+ bytesPerElement === 2 && !(buffer.byteOffset & 1) ||
986
+ bytesPerElement === 4 && !(buffer.byteOffset & 3) ||
987
+ bytesPerElement === 8 && !(buffer.byteOffset & 7))
988
+ return new TypedArray(buffer.buffer, buffer.byteOffset, buffer.byteLength);
989
+ }
990
+ // we have to slice/copy here to get a new ArrayBuffer, if we are not word/byte aligned
971
991
  return new TypedArray(Uint8Array.prototype.slice.call(buffer, 0).buffer)
972
992
  } : buffer => {
973
993
  if (!TypedArray)
@@ -1653,6 +1673,13 @@
1653
1673
  error.iteratorNotHandled = true;
1654
1674
  throw error;
1655
1675
  }
1676
+ if (this.useToJSON && value.toJSON) {
1677
+ const json = value.toJSON();
1678
+ // if for some reason value.toJSON returns itself it'll loop forever
1679
+ if (json !== value)
1680
+ return encode(json)
1681
+ }
1682
+
1656
1683
  // no extension found, write as object
1657
1684
  writeObject(value, !value.hasOwnProperty); // if it doesn't have hasOwnProperty, don't do hasOwnProperty checks
1658
1685
  }
@@ -1706,7 +1733,7 @@
1706
1733
  }
1707
1734
  if (encoder.keyMap) {
1708
1735
  for (let i = 0; i < length; i++) {
1709
- encode(encodeKey(keys[i]));
1736
+ encode(encoder.encodeKey(keys[i]));
1710
1737
  encode(vals[i]);
1711
1738
  }
1712
1739
  } else {