buffer-source.js 3.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115
  1. "use strict";
  2. Object.defineProperty(exports, "__esModule", { value: true });
  3. exports.isArrayBuffer = isArrayBuffer;
  4. exports.isSharedArrayBuffer = isSharedArrayBuffer;
  5. exports.isArrayBufferLike = isArrayBufferLike;
  6. exports.isArrayBufferView = isArrayBufferView;
  7. exports.isBufferSource = isBufferSource;
  8. exports.assertBufferSource = assertBufferSource;
  9. exports.toUint8Array = toUint8Array;
  10. exports.toUint8ArrayCopy = toUint8ArrayCopy;
  11. exports.toArrayBuffer = toArrayBuffer;
  12. exports.toArrayBufferLike = toArrayBufferLike;
  13. exports.toView = toView;
  14. exports.toViewCopy = toViewCopy;
  15. const ARRAY_BUFFER_TAG = "[object ArrayBuffer]";
  16. const SHARED_ARRAY_BUFFER_TAG = "[object SharedArrayBuffer]";
  17. function tagOf(value) {
  18. return Object.prototype.toString.call(value);
  19. }
  20. function isDataViewConstructor(type) {
  21. return type === DataView || type.prototype instanceof DataView;
  22. }
  23. function bytesPerElement(type) {
  24. if (isDataViewConstructor(type)) {
  25. return 1;
  26. }
  27. const value = type.BYTES_PER_ELEMENT;
  28. return value ?? 1;
  29. }
  30. function isArrayBufferViewLike(value) {
  31. if (ArrayBuffer.isView(value)) {
  32. return true;
  33. }
  34. if (!value || typeof value !== "object") {
  35. return false;
  36. }
  37. const view = value;
  38. return typeof view.byteOffset === "number"
  39. && typeof view.byteLength === "number"
  40. && isArrayBufferLike(view.buffer);
  41. }
  42. function copyBytes(data) {
  43. const view = toUint8Array(data);
  44. const copy = new Uint8Array(view.byteLength);
  45. copy.set(view);
  46. return copy;
  47. }
  48. function isArrayBuffer(value) {
  49. return tagOf(value) === ARRAY_BUFFER_TAG;
  50. }
  51. function isSharedArrayBuffer(value) {
  52. return typeof SharedArrayBuffer !== "undefined" && tagOf(value) === SHARED_ARRAY_BUFFER_TAG;
  53. }
  54. function isArrayBufferLike(value) {
  55. return isArrayBuffer(value) || isSharedArrayBuffer(value);
  56. }
  57. function isArrayBufferView(value) {
  58. return isArrayBufferViewLike(value);
  59. }
  60. function isBufferSource(value) {
  61. return isArrayBufferLike(value) || isArrayBufferView(value);
  62. }
  63. function assertBufferSource(value) {
  64. if (!isBufferSource(value)) {
  65. throw new TypeError("Expected ArrayBuffer, SharedArrayBuffer, or ArrayBufferView");
  66. }
  67. }
  68. function toUint8Array(data) {
  69. assertBufferSource(data);
  70. if (isArrayBufferLike(data)) {
  71. return new Uint8Array(data);
  72. }
  73. return new Uint8Array(data.buffer, data.byteOffset, data.byteLength);
  74. }
  75. function toUint8ArrayCopy(data) {
  76. return copyBytes(data);
  77. }
  78. function toArrayBuffer(data) {
  79. assertBufferSource(data);
  80. if (isArrayBuffer(data)) {
  81. return data;
  82. }
  83. const buffer = new ArrayBuffer(data.byteLength);
  84. new Uint8Array(buffer).set(toUint8Array(data));
  85. return buffer;
  86. }
  87. function toArrayBufferLike(data) {
  88. assertBufferSource(data);
  89. if (isArrayBufferLike(data)) {
  90. return data;
  91. }
  92. if (data.byteOffset === 0 && data.byteLength === data.buffer.byteLength) {
  93. return data.buffer;
  94. }
  95. return copyBytes(data).buffer;
  96. }
  97. function toView(data, type) {
  98. assertBufferSource(data);
  99. if (ArrayBuffer.isView(data) && data.constructor === type) {
  100. return data;
  101. }
  102. const view = toUint8Array(data);
  103. const elementSize = bytesPerElement(type);
  104. if (view.byteOffset % elementSize !== 0 || view.byteLength % elementSize !== 0) {
  105. throw new RangeError(`Cannot create ${type.name} over unaligned byte range`);
  106. }
  107. if (isDataViewConstructor(type)) {
  108. return new type(view.buffer, view.byteOffset, view.byteLength);
  109. }
  110. return new type(view.buffer, view.byteOffset, view.byteLength / elementSize);
  111. }
  112. function toViewCopy(data, type) {
  113. const copy = toUint8ArrayCopy(data);
  114. return toView(copy, type);
  115. }