70 lines
		
	
	
		
			2.3 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
			
		
		
	
	
			70 lines
		
	
	
		
			2.3 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
| 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;
 | |
| };
 |