buffer-utils.js 1.4 KB

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