supersonic-scsynth-core 0.37.0 → 0.38.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/package.json
CHANGED
package/wasm/scsynth-nrt.wasm
CHANGED
|
Binary file
|
package/workers/debug_worker.js
CHANGED
|
@@ -1,3 +1,3 @@
|
|
|
1
|
-
(()=>{function B({uint8View:o,dataView:t,bufferStart:e,bufferSize:s,head:S,tail:U,messageMagic:T,paddingMagic:L,headerSize:A,maxMessages:l=1/0,onMessage:D,onCorruption:n}){let E=U,N=0;for(;E!==S&&N<l;){if(s-E<A){E=0;continue}let i=e+E,
|
|
2
|
-
`)&&(D=D.slice(0,-1)),e.push({text:D,timestamp:performance.now(),sequence:L}),C&&(Atomics.add(C,30,1),Atomics.add(C,31,T))},onCorruption:U=>{console.error("[DebugWorker] Corrupted message at position",U)}});return S>0&&Atomics.store(r,c.DEBUG_TAIL,s),e.length>0?e:null},W=()=>{for(;u;)try{let o=Atomics.load(r,c.DEBUG_HEAD),t=Atomics.load(r,c.DEBUG_TAIL);if(o===t){let s=Atomics.wait(r,c.DEBUG_HEAD,o,100);if(!(s==="ok"||s==="not-equal")){if(s==="timed-out")continue}}let e=
|
|
3
|
-
`)&&(S=S.slice(0,-1)),t.push({text:S,timestamp:performance.now(),sequence:e.sequence})}catch(s){console.error("[DebugWorker] Failed to decode message:",s)}t.length>0&&self.postMessage({type:"debug",messages:t})};self.addEventListener("message",o=>{let{data:t}=o;try{switch(t.type){case"init":R=t.mode||"sab",R==="sab"&&
|
|
1
|
+
(()=>{function B({uint8View:o,dataView:t,bufferStart:e,bufferSize:s,head:S,tail:U,messageMagic:T,paddingMagic:L,headerSize:A,maxMessages:l=1/0,onMessage:D,onCorruption:n}){let E=U,N=0;for(;E!==S&&N<l;){if(s-E<A){E=0;continue}let i=e+E,f=t.getUint32(i,!0);if(f===L){E=0;continue}if(f!==T){n&&n(E),E=(E+1)%s;continue}let I=t.getUint32(i+4,!0),G=t.getUint32(i+8,!0),P=t.getUint32(i+12,!0);if(I<A||I>s){n&&n(E),E=(E+1)%s;continue}let m=I-A,d=i+A;D(d,m,G,P),E=(E+I)%s,N++}return{newTail:E,messagesRead:N}}function H(o,t){let e=o+t;return{DEBUG_HEAD:(e+16)/4,DEBUG_TAIL:(e+20)/4}}var R="sab",a=null,p=null,r=null,g=null,x=null,_=null,c={},C=null,u=!1,O=new TextDecoder("utf-8"),Y=(...o)=>{},F=(o,t,e)=>{a=o,p=t,_=e,r=new Int32Array(a),g=new DataView(a),x=new Uint8Array(a),c=H(p,_.CONTROL_START);let s=p+_.METRICS_START;C=new Uint32Array(a,s,_.METRICS_SIZE/4)},w=()=>{let o=Atomics.load(r,c.DEBUG_HEAD),t=Atomics.load(r,c.DEBUG_TAIL);if(o===t)return null;let e=[],{newTail:s,messagesRead:S}=B({uint8View:x,dataView:g,bufferStart:p+_.DEBUG_BUFFER_START,bufferSize:_.DEBUG_BUFFER_SIZE,head:o,tail:t,messageMagic:_.MESSAGE_MAGIC,paddingMagic:_.PADDING_MAGIC,headerSize:_.MESSAGE_HEADER_SIZE,maxMessages:1e3,onMessage:(U,T,L,A)=>{let l=new Uint8Array(T);for(let n=0;n<T;n++)l[n]=x[U+n];let D=O.decode(l);D.endsWith(`
|
|
2
|
+
`)&&(D=D.slice(0,-1)),e.push({text:D,timestamp:performance.now(),sequence:L}),C&&(Atomics.add(C,30,1),Atomics.add(C,31,T))},onCorruption:U=>{console.error("[DebugWorker] Corrupted message at position",U)}});return S>0&&Atomics.store(r,c.DEBUG_TAIL,s),e.length>0?e:null},W=()=>{for(;u;)try{let o=Atomics.load(r,c.DEBUG_HEAD),t=Atomics.load(r,c.DEBUG_TAIL);if(o===t){let s=Atomics.wait(r,c.DEBUG_HEAD,o,100);if(!(s==="ok"||s==="not-equal")){if(s==="timed-out")continue}}let e=w();e&&e.length>0&&self.postMessage({type:"debug",messages:e})}catch(o){console.error("[DebugWorker] Error in wait loop:",o),self.postMessage({type:"error",error:o.message}),Atomics.wait(r,0,r[0],10)}},k=()=>{if(!a){console.error("[DebugWorker] Cannot start - not initialized");return}if(u){console.warn("[DebugWorker] Already running");return}u=!0,W()},Q=()=>{u=!1},K=()=>{a&&(Atomics.store(r,c.DEBUG_HEAD,0),Atomics.store(r,c.DEBUG_TAIL,0))},h=o=>{let t=[];for(let e of o)try{let s=new Uint8Array(e.bytes),S=O.decode(s);S.endsWith(`
|
|
3
|
+
`)&&(S=S.slice(0,-1)),t.push({text:S,timestamp:performance.now(),sequence:e.sequence})}catch(s){console.error("[DebugWorker] Failed to decode message:",s)}t.length>0&&self.postMessage({type:"debug",messages:t})};self.addEventListener("message",o=>{let{data:t}=o;try{switch(t.type){case"init":R=t.mode||"sab",R==="sab"&&F(t.sharedBuffer,t.ringBufferBase,t.bufferConstants),self.postMessage({type:"initialized"});break;case"start":R==="sab"&&k();break;case"stop":Q();break;case"clear":R==="sab"&&K();break;case"debugRaw":t.messages&&h(t.messages);break;default:console.warn("[DebugWorker] Unknown message type:",t.type)}}catch(e){console.error("[DebugWorker] Error:",e),self.postMessage({type:"error",error:e.message})}});Y("[DebugWorker] Script loaded");})();
|
package/workers/osc_in_worker.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
(()=>{function u({uint8View:e,dataView:t,bufferStart:o,bufferSize:s,head:O,tail:I,messageMagic:a,paddingMagic:T,headerSize:i,maxMessages:C=1/0,onMessage:n,onCorruption:S}){let E=I,L=0;for(;E!==O&&L<C;){if(s-E<i){E=0;continue}let D=o+E,f=t.getUint32(D,!0);if(f===T){E=0;continue}if(f!==a){S&&S(E),E=(E+1)%s;continue}let R=t.getUint32(D+4,!0),
|
|
1
|
+
(()=>{function u({uint8View:e,dataView:t,bufferStart:o,bufferSize:s,head:O,tail:I,messageMagic:a,paddingMagic:T,headerSize:i,maxMessages:C=1/0,onMessage:n,onCorruption:S}){let E=I,L=0;for(;E!==O&&L<C;){if(s-E<i){E=0;continue}let D=o+E,f=t.getUint32(D,!0);if(f===T){E=0;continue}if(f!==a){S&&S(E),E=(E+1)%s;continue}let R=t.getUint32(D+4,!0),G=t.getUint32(D+8,!0),M=t.getUint32(D+12,!0);if(R<i||R>s){S&&S(E),E=(E+1)%s;continue}let F=R-i,g=D+i;n(g,F,G,M),E=(E+R)%s,L++}return{newTail:E,messagesRead:L}}function H(e,t){let o=e+t;return{OUT_HEAD:(o+8)/4,OUT_TAIL:(o+12)/4}}var A=null,l=null,_=null,P=null,x=null,c=null,U={},r=null,p=!1,w=(...e)=>{},N=-1,W=(e,t,o)=>{A=e,l=t,c=o,_=new Int32Array(A),P=new DataView(A),x=new Uint8Array(A),U=H(l,c.CONTROL_START);let s=l+c.METRICS_START;r=new Uint32Array(A,s,c.METRICS_SIZE/4)},Q=()=>{let e=Atomics.load(_,U.OUT_HEAD),t=Atomics.load(_,U.OUT_TAIL);if(e===t)return[];let o=[],{newTail:s,messagesRead:O}=u({uint8View:x,dataView:P,bufferStart:l+c.OUT_BUFFER_START,bufferSize:c.OUT_BUFFER_SIZE,head:e,tail:t,messageMagic:c.MESSAGE_MAGIC,paddingMagic:c.PADDING_MAGIC,headerSize:c.MESSAGE_HEADER_SIZE,maxMessages:100,onMessage:(I,a,T,i)=>{if(N>=0){let n=N+1&4294967295;if(T!==n){let S=T-n+4294967296&4294967295;S<1e3&&(console.warn("[OSCInWorker] Detected",S,"dropped messages (expected seq",n,"got",T,")"),r&&Atomics.add(r,28,S))}}N=T;let C=new Uint8Array(a);for(let n=0;n<a;n++)C[n]=x[I+n];o.push({oscData:C,sequence:T}),r&&(Atomics.add(r,26,1),Atomics.add(r,27,a))},onCorruption:I=>{console.error("[OSCInWorker] Corrupted message at position",I),r&&(Atomics.add(r,28,1),Atomics.add(r,29,1))}});return O>0&&Atomics.store(_,U.OUT_TAIL,s),o},k=()=>{for(;p;)try{let e=Atomics.load(_,U.OUT_HEAD),t=Atomics.load(_,U.OUT_TAIL);if(e===t){let s=Atomics.wait(_,U.OUT_HEAD,e,100);if(!(s==="ok"||s==="not-equal")){if(s==="timed-out")continue}}let o=Q();o.length>0&&self.postMessage({type:"messages",messages:o})}catch(e){console.error("[OSCInWorker] Error in wait loop:",e),self.postMessage({type:"error",error:e.message}),Atomics.wait(_,0,_[0],10)}},b=()=>{if(!A){console.error("[OSCInWorker] Cannot start - not initialized");return}if(p){console.warn("[OSCInWorker] Already running");return}p=!0,k()},K=()=>{p=!1};self.addEventListener("message",e=>{let{data:t}=e;try{switch(t.type){case"init":W(t.sharedBuffer,t.ringBufferBase,t.bufferConstants),self.postMessage({type:"initialized"});break;case"start":b();break;case"stop":K();break;default:console.warn("[OSCInWorker] Unknown message type:",t.type)}}catch(o){console.error("[OSCInWorker] Error:",o),self.postMessage({type:"error",error:o.message})}});w("[OSCInWorker] Script loaded");})();
|
|
@@ -1 +1 @@
|
|
|
1
|
-
(()=>{function
|
|
1
|
+
(()=>{function Z(e,t,r){return(r-1-e+t)%r}function q({uint8View:e,dataView:t,bufferStart:r,bufferSize:s,head:n,payload:E,sequence:l,messageMagic:a,headerSize:R,sourceId:S=0,headerScratch:x=null,headerScratchView:h=null}){let M=E.length,D=R+M+3&-4,U=s-n;if(D>U){let u=x||new Uint8Array(R),g=h||new DataView(u.buffer);g.setUint32(0,a,!0),g.setUint32(4,D,!0),g.setUint32(8,l,!0),g.setUint32(12,S,!0);let B=r+n,y=r;if(U>=R){e.set(u,B);let P=U-R;P>0&&e.set(E.subarray(0,P),B+R),e.set(E.subarray(P),y)}else{e.set(u.subarray(0,U),B),e.set(u.subarray(U),y);let P=R-U;e.set(E,y+P)}}else{let u=r+n;t.setUint32(u,a,!0),t.setUint32(u+4,D,!0),t.setUint32(u+8,l,!0),t.setUint32(u+12,S,!0),e.set(E,u+R)}return(n+D)%s}function ge(e,t,r=0,s=!1){for(let n=0;n<=r;n++)if(Atomics.compareExchange(e,t,0,1)===0)return!0;if(s){for(let E=0;E<100;E++)if(Atomics.wait(e,t,1,100),Atomics.compareExchange(e,t,0,1)===0)return!0;return console.error("[RingBuffer] Lock acquisition timeout after 10s - possible deadlock"),!1}return!1}function de(e,t){Atomics.store(e,t,0),Atomics.notify(e,t,1)}function X({atomicView:e,dataView:t,uint8View:r,bufferConstants:s,ringBufferBase:n,controlIndices:E,oscMessage:l,sourceId:a=0,maxSpins:R=0,useWait:S=!1}){let x=l.length,h=s.MESSAGE_HEADER_SIZE+x;if(h>s.IN_BUFFER_SIZE-s.MESSAGE_HEADER_SIZE||!ge(e,E.IN_WRITE_LOCK,R,S))return!1;try{let M=Atomics.load(e,E.IN_HEAD),W=Atomics.load(e,E.IN_TAIL),D=h+3&-4;if(Z(M,W,s.IN_BUFFER_SIZE)<D)return!1;let u=Atomics.add(e,E.IN_SEQUENCE,1),g=q({uint8View:r,dataView:t,bufferStart:n+s.IN_BUFFER_START,bufferSize:s.IN_BUFFER_SIZE,head:M,payload:l,sequence:u,messageMagic:s.MESSAGE_MAGIC,headerSize:s.MESSAGE_HEADER_SIZE,sourceId:a});return Atomics.load(e,E.IN_HEAD),Atomics.store(e,E.IN_HEAD,g),Atomics.notify(e,E.IN_HEAD,1),!0}finally{de(e,E.IN_WRITE_LOCK)}}function $(e,t){let r=e+t;return{IN_HEAD:(r+0)/4,IN_TAIL:(r+4)/4,IN_SEQUENCE:(r+24)/4,IN_WRITE_LOCK:(r+40)/4,IN_LOG_TAIL:(r+44)/4}}var p="sab",w=null,Y=1024,Me=65536,ee=3600,le=4294967295,A=null,N=null,f=null,k=null,ie=null,Se=null,_e={},c=null,m=null,te=null,Q=150,d=(e,t)=>{c&&(p==="sab"?Atomics.store(c,e,t):c[e]=t)},ae=e=>c?p==="sab"?Atomics.load(c,e):c[e]:0,T=(e,t)=>{c&&(p==="sab"?Atomics.add(c,e,t):c[e]+=t)},O=(e,t)=>{c&&(p==="sab"?Atomics.store(c,e,t):c[e]=t)},se=e=>c?p==="sab"?Atomics.load(c,e):c[e]:0,Ne=()=>{if(p!=="postMessage"||te!==null)return;let e=()=>{m&&c&&self.postMessage({type:"preschedulerMetrics",metrics:new Uint32Array(m.slice(0))}),te=setTimeout(e,Q)};e(),_("[PreScheduler] Started metrics sending (every "+Q+"ms)")};var o=[],ue=null,me=0,re=!1,i=[],ne=5,C=65536,Oe=2208988800,fe=50,Te=.5,_=(...e)=>{},Re=()=>(performance.timeOrigin+performance.now())/1e3+Oe,He=e=>{if(e.length>=16&&e[0]===35){let t=new DataView(e.buffer,e.byteOffset),r=t.getUint32(8,!1),s=t.getUint32(12,!1);return r+s/4294967296}return null},xe=()=>{if(!A||!f){console.error("[PreScheduler] Cannot init - missing buffer or constants");return}k=new Int32Array(A),ie=new DataView(A),Se=new Uint8Array(A),_e=$(N,f.CONTROL_START);let e=N+f.METRICS_START;c=new Uint32Array(A,e,f.METRICS_SIZE/4),_("[PreScheduler] SharedArrayBuffer initialized with direct ring buffer writing and metrics")},H=()=>{if(!c)return;d(9,o.length);let e=o.length,t=ae(10);e>t&&d(10,e)},I=(e,t,r=0,s=!1)=>{if(p==="postMessage")return w?(w.postMessage({type:"osc",oscData:e,sourceId:r}),T(12,1),!0):(console.error("[PreScheduler] No worklet port available"),!1);if(!A||!k)return console.error("[PreScheduler] Not initialized for ring buffer writing"),!1;let n=e.length,E=f.MESSAGE_HEADER_SIZE+n;return E>f.IN_BUFFER_SIZE-f.MESSAGE_HEADER_SIZE?(console.error("[PreScheduler] Message too large:",E),!1):X({atomicView:k,dataView:ie,uint8View:Se,bufferConstants:f,ringBufferBase:N,controlIndices:_e,oscMessage:e,sourceId:r,maxSpins:10,useWait:s})?(T(12,1),!0):(t||console.warn("[PreScheduler] Ring buffer full, message will be queued for retry"),!1)},L=(e,t,r=0)=>{let s=o.length+i.length;if(s>=C){console.error("[PreScheduler] Backpressure: dropping retry ("+s+" pending)"),T(17,1);return}i.push({oscData:e,retryCount:0,context:t||"unknown",queuedAt:performance.now(),sourceId:r}),d(18,i.length);let n=ae(19);i.length>n&&d(19,i.length),_("[PreScheduler] Queued message for retry:",t,"queue size:",i.length)},Be=()=>{if(i.length===0)return;let e=0;for(;e<i.length;){let t=i[e];if(I(t.oscData,!0,t.sourceId,!0))i.splice(e,1),T(16,1),T(20,1),d(18,i.length),_("[PreScheduler] Retry succeeded for:",t.context,"after",t.retryCount+1,"attempts");else if(t.retryCount++,T(20,1),t.retryCount>=ne){let s=`Ring buffer full - dropped message after ${ne} retries (${t.context})`;console.error("[PreScheduler]",s),i.splice(e,1),T(17,1),d(18,i.length),self.postMessage({type:"error",error:s})}else e++}},oe=(e,t,r,s=0)=>{let n=o.length+i.length;if(n>=C){let S=`Prescheduler queue full (${n} >= ${C} max)`;return console.warn("[PreScheduler]",S),self.postMessage({type:"error",error:S,code:"PRESCHEDULER_QUEUE_FULL"}),!1}let E=He(e);if(E===null)return _("[PreScheduler] Non-bundle message, dispatching immediately"),I(e,!1,s,!0)||L(e,"immediate message",s),!0;let l=Re(),a=E-l;if(e.length>Y){let S=`Bundle too large for scheduler (${e.length} > ${Y} bytes)`;return console.warn("[PreScheduler]",S),self.postMessage({type:"error",error:S,code:"BUNDLE_TOO_LARGE"}),!1}if(a>ee){let S=`Bundle scheduled too far in future (${a.toFixed(0)}s > ${ee}s max)`;return console.warn("[PreScheduler]",S),self.postMessage({type:"error",error:S,code:"BUNDLE_TOO_FAR_FUTURE"}),!1}let R={ntpTime:E,seq:me++,sessionId:t||0,runTag:r||"",oscData:e,sourceId:s};return ye(R),T(11,1),H(),_("[PreScheduler] Scheduled bundle:","NTP="+E.toFixed(3),"current="+l.toFixed(3),"wait="+(a*1e3).toFixed(1)+"ms","pending="+o.length),!0},ye=e=>{o.push(e),be(o.length-1)},Fe=()=>o.length>0?o[0]:null,Ge=()=>{if(o.length===0)return null;let e=o[0],t=o.pop();return o.length>0&&(o[0]=t,pe(0)),e},be=e=>{for(;e>0;){let t=Math.floor((e-1)/2);if(K(o[e],o[t])>=0)break;Ue(e,t),e=t}},pe=e=>{let t=o.length;for(;;){let r=2*e+1,s=2*e+2,n=e;if(r<t&&K(o[r],o[n])<0&&(n=r),s<t&&K(o[s],o[n])<0&&(n=s),n===e)break;Ue(e,n),e=n}},K=(e,t)=>e.ntpTime===t.ntpTime?e.seq-t.seq:e.ntpTime-t.ntpTime,Ue=(e,t)=>{let r=o[e];o[e]=o[t],o[t]=r},we=()=>{if(ue!==null){console.warn("[PreScheduler] Polling already started");return}_("[PreScheduler] Starting periodic polling (every "+fe+"ms)"),Ae()};var Ae=()=>{re=!0,Be();let e=Re(),t=e+Te,r=0;for(;o.length>0;){let s=Fe();if(s.ntpTime<=t){Ge(),H();let n=s.ntpTime-e;if(T(21,1),n<0){let l=Math.round(-n*1e3);T(15,1);let a=se(23);l>a&&O(23,l)}else{let l=Math.round(n*1e3),a=se(14);(a===le||l<a)&&O(14,l)}_("[PreScheduler] Dispatching bundle:","NTP="+s.ntpTime.toFixed(3),"current="+e.toFixed(3),"early="+(n*1e3).toFixed(1)+"ms","remaining="+o.length),I(s.oscData,!1,s.sourceId,!0)||L(s.oscData,"scheduled bundle NTP="+s.ntpTime.toFixed(3),s.sourceId),r++}else break}(r>0||o.length>0||i.length>0)&&_("[PreScheduler] Dispatch cycle complete:","dispatched="+r,"pending="+o.length,"retrying="+i.length),re=!1,ue=setTimeout(Ae,fe)},v=e=>{if(o.length===0)return;let t=o.length,r=[];for(let n=0;n<o.length;n++){let E=o[n];e(E)||r.push(E)}let s=t-r.length;s>0&&(o=r,Ye(),T(13,s),H(),_("[PreScheduler] Cancelled "+s+" events, "+o.length+" remaining"))},Ye=()=>{for(let e=Math.floor(o.length/2)-1;e>=0;e--)pe(e)},ke=(e,t)=>{v(r=>r.sessionId===e&&r.runTag===t)},Qe=e=>{v(t=>t.sessionId===e)},Ke=e=>{v(t=>t.runTag===e)},ve=()=>{if(o.length===0)return;let e=o.length;T(13,e),o=[],H(),_("[PreScheduler] Cancelled all "+e+" events")},We=e=>!e||e.length<8?!1:e[0]===35&&e[1]===98&&e[2]===117&&e[3]===110&&e[4]===100&&e[5]===108&&e[6]===101&&e[7]===0,Ze=e=>{let t=[],r=new DataView(e.buffer,e.byteOffset,e.byteLength),s=16;for(;s+4<=e.length;){let n=r.getInt32(s,!1);if(s+=4,n<=0||n>Me||s+n>e.length)break;let E=e.slice(s,s+n);for(t.push(E),s+=n;s%4!==0&&s<e.length;)s++}return t},qe=(e,t=0)=>{if(We(e)){let r=Ze(e);for(let s=0;s<r.length;s++)I(r[s],!1,t,!0)||L(r[s],"immediate bundle message "+s,t)}else I(e,!1,t,!0)||L(e,"immediate message",t)};self.addEventListener("message",e=>{let{data:t}=e;try{switch(t.type){case"init":if(p=t.mode||"sab",t.maxPendingMessages&&(C=t.maxPendingMessages),t.snapshotIntervalMs&&(Q=t.snapshotIntervalMs),t.bypassLookaheadS!==void 0&&(Te=t.bypassLookaheadS),p==="sab")A=t.sharedBuffer,N=t.ringBufferBase,f=t.bufferConstants,xe(),f&&f.scheduler_slot_size&&(Y=f.scheduler_slot_size);else{w=t.workletPort;let s=184;m=new ArrayBuffer(s),c=new Uint32Array(m),Ne()}O(14,le),O(23,0),we(),_("[OSCPreSchedulerWorker] Initialized with NTP-based scheduling, mode="+p+", capacity="+C),self.postMessage({type:"initialized"});break;case"addOscSource":let r=e.ports[0];r&&(r.onmessage=s=>{s.data.type==="osc"&&s.data.oscData&&oe(s.data.oscData,0,"",s.data.sourceId||0)},_("[OSCPreSchedulerWorker] Added external OSC source"));break;case"send":oe(t.oscData,t.sessionId||0,t.runTag||"",t.sourceId||0);break;case"sendImmediate":qe(t.oscData,t.sourceId||0);break;case"directDispatch":I(t.oscData,!1,t.sourceId||0,!0)||L(t.oscData,"directDispatch fallback",t.sourceId||0);break;case"cancelSessionTag":t.runTag!==void 0&&t.runTag!==null&&t.runTag!==""&&ke(t.sessionId||0,t.runTag);break;case"cancelSession":Qe(t.sessionId||0);break;case"cancelTag":t.runTag!==void 0&&t.runTag!==null&&t.runTag!==""&&Ke(t.runTag);break;case"cancelAll":ve();break;default:console.warn("[OSCPreSchedulerWorker] Unknown message type:",t.type)}}catch(r){console.error("[OSCPreSchedulerWorker] Error:",r),self.postMessage({type:"error",error:r.message})}});_("[OSCPreSchedulerWorker] Script loaded");})();
|