buffer-utils.js 1.4 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364
  1. // Note: Don't use destructuring assignment for `Buffer`, or we'll hit a
  2. // browserify bug that makes the statement invalid, throwing an error in
  3. // sandboxed renderer.
  4. const Buffer = require('buffer').Buffer
  5. const typedArrays = {
  6. Buffer,
  7. ArrayBuffer,
  8. Int8Array,
  9. Uint8Array,
  10. Uint8ClampedArray,
  11. Int16Array,
  12. Uint16Array,
  13. Int32Array,
  14. Uint32Array,
  15. Float32Array,
  16. Float64Array
  17. }
  18. function getType (value) {
  19. for (const type of Object.keys(typedArrays)) {
  20. if (value instanceof typedArrays[type]) {
  21. return type
  22. }
  23. }
  24. return null
  25. }
  26. function getBuffer (value) {
  27. if (value instanceof Buffer) {
  28. return value
  29. } else if (value instanceof ArrayBuffer) {
  30. return Buffer.from(value)
  31. } else {
  32. return Buffer.from(value.buffer, value.byteOffset, value.byteLength)
  33. }
  34. }
  35. exports.isBuffer = function (value) {
  36. return ArrayBuffer.isView(value) || value instanceof ArrayBuffer
  37. }
  38. exports.bufferToMeta = function (value) {
  39. return {
  40. type: getType(value),
  41. data: getBuffer(value),
  42. length: value.length
  43. }
  44. }
  45. exports.metaToBuffer = function (value) {
  46. const constructor = typedArrays[value.type]
  47. const data = getBuffer(value.data)
  48. if (constructor === Buffer) {
  49. return data
  50. } else if (constructor === ArrayBuffer) {
  51. return data.buffer
  52. } else if (constructor) {
  53. return new constructor(data.buffer, data.byteOffset, value.length)
  54. } else {
  55. return data
  56. }
  57. }