@fcanvas/worker
Version:
The plugin provides support for using fCanvas in WebWorker
7 lines (4 loc) • 4.59 kB
JavaScript
import { put, listen, ping, uuid } from '@fcanvas/communicate';
import { Layer, CANVAS_ELEMENT, REMOVE_EVENT, ADD_EVENT, watchEffect, toRaw, STORE_EVENTS, RAW_MAP_LISTENERS, NOOP } from 'fcanvas';
var H=Object.defineProperty,I=Object.defineProperties;var U=Object.getOwnPropertyDescriptors;var v=Object.getOwnPropertySymbols;var X=Object.prototype.hasOwnProperty,q=Object.prototype.propertyIsEnumerable;var b=(t,e,n)=>e in t?H(t,e,{enumerable:!0,configurable:!0,writable:!0,value:n}):t[e]=n,m=(t,e)=>{for(var n in e||(e={}))X.call(e,n)&&b(t,n,e[n]);if(v)for(var n of v(e))q.call(e,n)&&b(t,n,e[n]);return t},E=(t,e)=>I(t,U(e));var p=(t,e,n)=>new Promise((r,a)=>{var o=i=>{try{c(n.next(i));}catch(f){a(f);}},s=i=>{try{c(n.throw(i));}catch(f){a(f);}},c=i=>i.done?r(i.value):Promise.resolve(i.value).then(o,s);c((n=n.apply(t,e)).next());});function l(t){var r;let e=Object.keys(t),n=t;for(;((r=n.constructor)==null?void 0:r.name)!=="Event"&&(n=Object.getPrototypeOf(n));)e.push(...Object.keys(n));return e}function y(t){let e={};return l(t).forEach(n=>{let r=t[n];e[n]=r instanceof Node?null:r;}),e}function k(t){return {__v_type:"TouchList",value:Array.from(t).map(y)}}function P({value:t}){return Object.assign({},t,{item(e){var n;return (n=t[e])!=null?n:null},get length(){return t.length},*[Symbol.iterator](){for(let e=0;e<t.length;e+=1)yield t[e];},[Symbol.toStringTag]:"TouchList"})}function L(t,e){let n=uuid(),r=listen(t,n,e);return setTimeout(r,1e3),{__v_port:!0,id:n}}function O(t,e){return (...n)=>put(t,e.id,...n)}var Q=/^init\w*Event$/;function Y(t){return !!(t==="cancelBubble"||t==="returnValue"||t==="srcElement"||Q.test(t))}var Z=["preventDefault","stopPropagation","stopImmediatePropagation"];function ee(t){return Z.includes(t)}function te(t){return (t+"").slice(8,-1)}function C(t,e,n){let r=l(e),a={};return r.forEach(o=>{if(Y(o))return;if(ee(o)){a[o]={__v_noop:!0};return}let s=e[o];if(s instanceof Node){a[o]=null;return}if(typeof s=="function"){a[o]=n?NOOP:L(t,s.bind(e));return}switch(te(s)){case"TouchList":a[o]=k(s);break;case"Window":a[o]=null;break;default:s&&typeof s=="object"?a[o]=y(s):a[o]=s;}}),a}function R(t,e){return Object.entries(e).forEach(([n,r])=>{r!=null&&r.__v_port&&(e[n]=O(t,r)),(r==null?void 0:r.__v_type)==="TouchList"&&(e[n]=P(r)),r!=null&&r.__v_noop&&(e[n]=NOOP);}),e}var ie=new WeakMap;function ce(t,e){return p(this,null,function*(){if(ie.has(e))return;let n=yield put(t,"fw_create_connect");n.start();let r=new Map,a=new Map;listen(n,"update_layer",o=>{r.forEach((i,f)=>{f in o||(r.delete(f),e.delete(i));});let s={},c=[];return Object.entries(o).forEach(([i,f])=>{let h=r.get(i);if(h){Object.assign(h.$,E(m({},f.$),{width:f.width,height:f.height}));return}let u=new Layer(E(m({},f.$),{autoDraw:!1,width:f.width,height:f.height}));u.uid=i,r.set(i,u),e.add(u),c.push(s[i]=u[CANVAS_ELEMENT].transferControlToOffscreen());}),{return:s,transfer:c}}),listen(n,"listen_events",o=>{a.forEach((s,c)=>{o.some(i=>i.name===c)&&(a.delete(c),e[REMOVE_EVENT](c,s));}),o.forEach(({name:s,offs:c,prevent:i})=>{if(a.has(s))return;a.set(s,f),e[ADD_EVENT](s,f);function f(h){i&&h.preventDefault(),ping(n,"emit_event",{name:h.type,event:C(n,h),info:c.reduce((u,d)=>{let T=r.get(d);if(!T)return u;let w=T[CANVAS_ELEMENT],{left:V,top:W}=w.getBoundingClientRect(),{width:j,height:$,scrollWidth:K,scrollHeight:B}=w;return u[d]={left:V,top:W,width:j,height:$,scrollWidth:K,scrollHeight:B},u},{})});}});}),yield put(t,"fw_setup_done");})}var F=new WeakMap;function le(t){return p(this,null,function*(){if(F.has(t))return;let e;listen(self,"fw_create_connect",()=>(e=new MessageChannel,F.set(t,e),{return:e.port2,transfer:[e.port2]})),listen(self,"fw_setup_done",()=>{let n=new Map;e.port1.start(),watchEffect(()=>{let r=Array.from(t.children.values()).reduce((a,o)=>(n.set(o.uid,o),a[o.uid]={$:toRaw(o.$),width:o[CANVAS_ELEMENT].width,height:o[CANVAS_ELEMENT].height},a),{});n.forEach((a,o)=>{o in r||n.delete(o);}),put(e.port1,"update_layer",r).then(a=>{Object.entries(a).forEach(([o,s])=>{let c=n.get(o);c&&(c[CANVAS_ELEMENT]=s,c.markChange());});});}),listen(e.port1,"emit_event",r=>{var i;let{name:a,event:o,info:s}=r,c=R(e.port1,o);Object.assign(c,{info:s}),(i=t[STORE_EVENTS].get(a))==null||i.handle(c);}),watchEffect(()=>{let r=[];t[STORE_EVENTS].forEach((a,o)=>{var i;let s=[],c=!1;for(let f of a.deps.values()){let h=(i=t[RAW_MAP_LISTENERS].get(f))==null?void 0:i.keys();if(h)for(let u of h)u!==t&&(c||(c=!0),s.push(u.uid));}r.push({name:o,offs:s,prevent:c});}),ping(e.port1,"listen_events",r);});});})}
export { le as portToThread, ce as portToWorker };