UNPKG

ppu-paddle-ocr

Version:

Lightweight, probably the fastest PaddleOCR SDK in TypeScript. Runs anywhere JavaScript runs: Node.js, Bun, Deno, mobile react-native, web browsers, and browser extensions. Docker & CLI supported. The official SDK is browser-only. Accurate text detection

1 lines 2.21 kB
function toAbortError(signal){return signal.reason instanceof Error?signal.reason:new DOMException("The batch operation was aborted.","AbortError")}function toAsyncIterator(inputs){if(Symbol.asyncIterator in inputs){return inputs[Symbol.asyncIterator]()}let sync=inputs[Symbol.iterator]();return{next:()=>Promise.resolve(sync.next()),return:(value)=>Promise.resolve(sync.return?.(value)??{done:true,value:undefined})}}export async function runPool(inputs,options,task,onSettle){const{settle,signal}=options;let concurrency=Math.max(1,Math.floor(options.concurrency));if(signal?.aborted)throw toAbortError(signal);let nextIndex=0;let done=0;let stopped=false;let failed=false;let failure;let array=Array.isArray(inputs)?inputs:null;let iterator=array?null:toAsyncIterator(inputs);let lock=Promise.resolve();let nextItem=async()=>{let previous=lock;let release;lock=new Promise((resolve)=>{release=resolve});await previous;try{return await iterator.next()}finally{release()}};let onAbort=()=>{stopped=true};signal?.addEventListener("abort",onAbort,{once:true});let worker=async()=>{while(!stopped){let item;let index;if(array){if(nextIndex>=array.length)return;index=nextIndex++;item=array[index]}else{let next=await nextItem();if(next.done||stopped)return;index=nextIndex++;item=next.value}try{let value=await task(item,index);if(stopped)return;onSettle({index,status:"fulfilled",value})}catch(reason){if(settle){onSettle({index,status:"rejected",reason})}else{stopped=true;failed=true;failure=reason;return}}finally{done++;options.onProgress?.(done,options.total)}}};try{await Promise.all(Array.from({length:concurrency},()=>worker()))}finally{signal?.removeEventListener("abort",onAbort);await iterator?.return?.()}if(signal?.aborted)throw toAbortError(signal);if(failed)throw failure}export function createAsyncQueue(){let items=[];let wake=null;let closed=false;let failure=null;let notify=()=>{let w=wake;wake=null;w?.()};return{push(item){items.push(item);notify()},close(){closed=true;notify()},fail(error){failure={error};closed=true;notify()},async*drain(){while(true){while(items.length>0){yield items.shift()}if(failure)throw failure.error;if(closed)return;await new Promise((resolve)=>{wake=resolve})}}}}