uint-array.js 2.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869
  1. import {StringDecoder} from 'node:string_decoder';
  2. const {toString: objectToString} = Object.prototype;
  3. export const isArrayBuffer = value => objectToString.call(value) === '[object ArrayBuffer]';
  4. // Is either Uint8Array or Buffer
  5. export const isUint8Array = value => objectToString.call(value) === '[object Uint8Array]';
  6. export const bufferToUint8Array = buffer => new Uint8Array(buffer.buffer, buffer.byteOffset, buffer.byteLength);
  7. const textEncoder = new TextEncoder();
  8. const stringToUint8Array = string => textEncoder.encode(string);
  9. const textDecoder = new TextDecoder();
  10. export const uint8ArrayToString = uint8Array => textDecoder.decode(uint8Array);
  11. export const joinToString = (uint8ArraysOrStrings, encoding) => {
  12. const strings = uint8ArraysToStrings(uint8ArraysOrStrings, encoding);
  13. return strings.join('');
  14. };
  15. const uint8ArraysToStrings = (uint8ArraysOrStrings, encoding) => {
  16. if (encoding === 'utf8' && uint8ArraysOrStrings.every(uint8ArrayOrString => typeof uint8ArrayOrString === 'string')) {
  17. return uint8ArraysOrStrings;
  18. }
  19. const decoder = new StringDecoder(encoding);
  20. const strings = uint8ArraysOrStrings
  21. .map(uint8ArrayOrString => typeof uint8ArrayOrString === 'string'
  22. ? stringToUint8Array(uint8ArrayOrString)
  23. : uint8ArrayOrString)
  24. .map(uint8Array => decoder.write(uint8Array));
  25. const finalString = decoder.end();
  26. return finalString === '' ? strings : [...strings, finalString];
  27. };
  28. export const joinToUint8Array = uint8ArraysOrStrings => {
  29. if (uint8ArraysOrStrings.length === 1 && isUint8Array(uint8ArraysOrStrings[0])) {
  30. return uint8ArraysOrStrings[0];
  31. }
  32. return concatUint8Arrays(stringsToUint8Arrays(uint8ArraysOrStrings));
  33. };
  34. const stringsToUint8Arrays = uint8ArraysOrStrings => uint8ArraysOrStrings.map(uint8ArrayOrString => typeof uint8ArrayOrString === 'string'
  35. ? stringToUint8Array(uint8ArrayOrString)
  36. : uint8ArrayOrString);
  37. export const concatUint8Arrays = uint8Arrays => {
  38. const result = new Uint8Array(getJoinLength(uint8Arrays));
  39. let index = 0;
  40. for (const uint8Array of uint8Arrays) {
  41. result.set(uint8Array, index);
  42. index += uint8Array.length;
  43. }
  44. return result;
  45. };
  46. const getJoinLength = uint8Arrays => {
  47. let joinLength = 0;
  48. for (const uint8Array of uint8Arrays) {
  49. joinLength += uint8Array.length;
  50. }
  51. return joinLength;
  52. };