19 lines
1.7 KiB
TypeScript
19 lines
1.7 KiB
TypeScript
/**
|
|
* 专用图片解码 Worker:使用 createImageBitmap 读取尺寸,立即 close bitmap 后回传纯数据。
|
|
* 它不输出转码图片、不更改原文件,也不创建新上传/生成任务;宿主负责终止 Worker 与核对消息归属。
|
|
*/
|
|
/** 仅声明本入口需要的 Worker 消息能力,不导入 renderer 或 DOM 状态。 */
|
|
const worker=globalThis as unknown as{onmessage:((event:MessageEvent)=>void)|null;postMessage(value:unknown):void};
|
|
/** 仅接收 version=1、安全整数 id、Blob;非法请求直接忽略,不回错误消息。
|
|
* 不在此限制 id 为正数、MIME、字节或像素预算;单任务 Worker 的创建/并发/取消由宿主控制。
|
|
* 异步 handler 本身不排队,重复消息可并行解码;正常宿主每 Worker 只发一个请求。 */
|
|
worker.onmessage=async event=>{
|
|
const {version,id,bytes}=event.data??{};if(version!==1||!Number.isSafeInteger(id)||!(bytes instanceof Blob))return;
|
|
// bitmap 是临时原生资源,尺寸读取即使抛错也由 finally close;成功只发送 width/height 和输入长度。
|
|
try{const bitmap=await createImageBitmap(bytes,{imageOrientation:'from-image'});let width:number,height:number;try{width=bitmap.width;height=bitmap.height;}finally{bitmap.close();}worker.postMessage({version:1,id,byteLength:bytes.size,width,height});}
|
|
// 解码/读取尺寸/close/成功回信失败均尝试发送稳定错误;若通信本身不可用,宿主仍需取消/错误事件收尾。
|
|
catch{worker.postMessage({version:1,id,byteLength:bytes.size,error:'image_decode_failed'});}
|
|
};
|
|
// 标记为独立 TypeScript 模块,避免 Worker 全局声明与其它源码脚本命名空间合并。
|
|
export {};
|