string-byte-slice
Version:
Like `string.slice()` but bytewise
53 lines (33 loc) • 1.14 kB
JavaScript
import{getByteEnd,getByteStart}from"./bytes.js";
export const textEncoderSlice=(input,byteStart,byteEnd)=>{
const{textEncoder,textDecoder}=getEncoderDecoder();
const buffer=getBuffer(input);
const{written}=textEncoder.encodeInto(input,buffer);
const byteStartA=getByteStart(buffer,written,byteStart);
const byteEndA=getByteEnd(buffer,written,byteEnd);
const byteEndB=
byteEndA===undefined?written:Math.min(byteEndA,written);
const bufferA=buffer.subarray(byteStartA,byteEndB);
return textDecoder.decode(bufferA)
};
const getEncoderDecoder=()=>{
if(textEncoderCache===undefined){
textEncoderCache=new globalThis.TextEncoder;
textDecoderCache=new globalThis.TextDecoder("utf8",{fatal:false})
}
return{textEncoder:textEncoderCache,textDecoder:textDecoderCache}
};
let textEncoderCache;
let textDecoderCache;
const getBuffer=(input)=>{
const size=input.length*3;
if(size>CACHE_MAX_MEMORY){
return new Uint8Array(size)
}
if(cachedEncoderBuffer===undefined||cachedEncoderBuffer.length<size){
cachedEncoderBuffer=new Uint8Array(size)
}
return cachedEncoderBuffer
};
export const CACHE_MAX_MEMORY=1e5;
let cachedEncoderBuffer;