123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869 |
- import {StringDecoder} from 'node:string_decoder';
- const {toString: objectToString} = Object.prototype;
- export const isArrayBuffer = value => objectToString.call(value) === '[object ArrayBuffer]';
- // Is either Uint8Array or Buffer
- export const isUint8Array = value => objectToString.call(value) === '[object Uint8Array]';
- export const bufferToUint8Array = buffer => new Uint8Array(buffer.buffer, buffer.byteOffset, buffer.byteLength);
- const textEncoder = new TextEncoder();
- const stringToUint8Array = string => textEncoder.encode(string);
- const textDecoder = new TextDecoder();
- export const uint8ArrayToString = uint8Array => textDecoder.decode(uint8Array);
- export const joinToString = (uint8ArraysOrStrings, encoding) => {
- const strings = uint8ArraysToStrings(uint8ArraysOrStrings, encoding);
- return strings.join('');
- };
- const uint8ArraysToStrings = (uint8ArraysOrStrings, encoding) => {
- if (encoding === 'utf8' && uint8ArraysOrStrings.every(uint8ArrayOrString => typeof uint8ArrayOrString === 'string')) {
- return uint8ArraysOrStrings;
- }
- const decoder = new StringDecoder(encoding);
- const strings = uint8ArraysOrStrings
- .map(uint8ArrayOrString => typeof uint8ArrayOrString === 'string'
- ? stringToUint8Array(uint8ArrayOrString)
- : uint8ArrayOrString)
- .map(uint8Array => decoder.write(uint8Array));
- const finalString = decoder.end();
- return finalString === '' ? strings : [...strings, finalString];
- };
- export const joinToUint8Array = uint8ArraysOrStrings => {
- if (uint8ArraysOrStrings.length === 1 && isUint8Array(uint8ArraysOrStrings[0])) {
- return uint8ArraysOrStrings[0];
- }
- return concatUint8Arrays(stringsToUint8Arrays(uint8ArraysOrStrings));
- };
- const stringsToUint8Arrays = uint8ArraysOrStrings => uint8ArraysOrStrings.map(uint8ArrayOrString => typeof uint8ArrayOrString === 'string'
- ? stringToUint8Array(uint8ArrayOrString)
- : uint8ArrayOrString);
- export const concatUint8Arrays = uint8Arrays => {
- const result = new Uint8Array(getJoinLength(uint8Arrays));
- let index = 0;
- for (const uint8Array of uint8Arrays) {
- result.set(uint8Array, index);
- index += uint8Array.length;
- }
- return result;
- };
- const getJoinLength = uint8Arrays => {
- let joinLength = 0;
- for (const uint8Array of uint8Arrays) {
- joinLength += uint8Array.length;
- }
- return joinLength;
- };
|