"use strict";(self.webpackChunk_N_E=self.webpackChunk_N_E||[]).push([[3623],{63623:function(e,t,r){r.d(t,{R0:function(){return b},m_:function(){return y}});var o=r(27573),a=r(7653),n=r(81695),s=r(19369),i=r(46546),l=r(15127),d=r(56672),c=r(42427),u=r(86393),h=r(25653),w=r(98184),f=r(78536),g=r(71646);let m=async e=>{let{room:t,guid:r}=e,o=(0,s.tD)(r),a={},n=localStorage.getItem("jwt");a.Authorization="Bearer ".concat(n);let i=await fetch("".concat(o,"/join"),{method:"POST",headers:a,body:JSON.stringify({room:t})});if(i.ok)await i.json();else{let e=await i.text();console.warn("failed to join, status code: "+i.status+": "+e)}},p=async e=>{let t=await (0,l.v)(),r=["uploads",crypto.randomUUID(),e.name].join("/"),o="".concat(i.b7,"/").concat(r),a=await fetch(o,{method:"PUT",headers:{Authorization:"Bearer ".concat(t)},body:e});if(a.ok)return await a.json();{let t=await a.text();throw Error("could not upload file: ".concat(e.name,": ").concat(t))}},v=a.createContext(void 0);function y(){let e=a.useContext(v);if(!e)throw Error("useMultiplayerActions must be used within a MultiplayerActionsProvider");return e}let E=()=>({id:"",name:"",previewUrl:"",capabilities:[]});function b(e){let{children:t}=e,r=(0,n.useRouter)(),{setIsAgentLoading:i}=(0,h.r)(),[l,y]=a.useState(0),[b,k]=a.useState(()=>{let e=!1,t="",o=null,a=E(),n=new u.cz,l=new Map,h=new u.DF,v=[],b=()=>{y(e=>e+1)},k=function(e){let t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{},r=arguments.length>2?arguments[2]:void 0,n=arguments.length>3?arguments[3]:void 0;if(o){let{id:s,name:i}=a,l=new Date,d={method:e,userId:s,name:i,args:t,attachments:r,human:"boolean"!=typeof(null==n?void 0:n.human)||n.human,hidden:!!(null==n?void 0:n.hidden),timestamp:l};o.sendChatMessage(d)}else console.warn("can't send message: not connected")},M={getConnected:()=>e,getRoom:()=>t,getCrdtDoc:()=>{let e=null==o?void 0:o.realms;if(!e)return null;{let t=e.getClosestRealm(e.lastRootRealmKey);return t?t.networkedCrdtClient.getDoc():null}},getLocalPlayerSpec:()=>a,getPlayersMap:()=>n,getPlayersCache:()=>l,getTypingMap:()=>h,getMessages:()=>v,setMultiplayerConnectionParameters:r=>{let s=(null==r?void 0:r.room)||"",i=(null==r?void 0:r.localPlayerSpec)||E();if(t!==s){if(t=s,a=i,v=[],o&&(o.disconnect(),o=null),t){if(!(null==i?void 0:i.id)||!(null==i?void 0:i.name)||!(null==i?void 0:i.previewUrl))throw Error("Invalid local player spec: "+JSON.stringify(i,null,2));let r={...i,capabilities:["human"]};o=new c.J({room:t,profile:r});let a=c.J.logLevels.debug;o.addEventListener("log",e=>{let{args:t,logLevel:r}=e.data;a>=r&&console.log(...t)}),o.addEventListener("chat",e=>{let{message:t}=e.data,{userId:r,name:o,method:a,args:n}=t;switch(a){case"say":case"join":case"leave":case"nudge":case"mediaPerception":case"browserAction":case"paymentRequest":break;case"log":{let{text:e}=n;console.log(e);break}case"typing":{let{typing:e}=n;h.set(r,{userId:r,name:o,typing:e});break}default:console.log("unhandled method",JSON.stringify(t))}}),(async()=>{console.log("multiplayer connecting..."),await o.waitForConnect(),console.log("multiplayer connected")})(),o.addEventListener("connect",t=>{e=!0,b()}),o.addEventListener("disconnect",t=>{e=!1,b()}),o.addEventListener("chat",e=>{let{message:t}=e.data;v=[...v,t],b()}),n=o.playersMap,h=o.typingMap,n.addEventListener("join",e=>{let{player:t}=e.data,{id:r,name:o}=t.getPlayerSpec(),a={method:"join",userId:r,name:o,args:{},timestamp:Date.now()};v=[...v,a],b()}),n.addEventListener("leave",e=>{let{player:t}=e.data,{id:r,name:o}=t.getPlayerSpec(),a={method:"leave",userId:r,name:o,args:{},timestamp:Date.now()};v=[...v,a],b()}),h.addEventListener("typingchange",e=>{b()}),(()=>{let e=()=>{for(let[e,t]of(globalThis.playersMap=n,globalThis.playersCache=l,n.getMap()))l.set(e,t);b()};e(),["join","leave"].forEach(t=>{n.addEventListener(t,e)})})(),(()=>{let e=new Map,t=new g.y;n.addEventListener("audiostart",r=>{let{playerId:o,streamId:a,type:n,disposition:s}=r.data;if("audio"===s){let r=new d.a,{sampleRate:s}=r,i=new w.Y({type:n,sampleRate:s,format:"f32",codecs:f}),l=i.writable.getWriter();l.metadata={playerId:o},e.set(a,l),(async()=>{await t.waitForTurn(async e=>{let{signal:t}=e;t.addEventListener("abort",e=>{i.abort(e.reason),r.abort(e.reason)}),await i.readable.pipeTo(r)})})().catch(e=>{console.error("error in audio pipeline",e)})}}),n.addEventListener("audio",t=>{let{playerId:r,streamId:o,data:a}=t.data,n=e.get(o);n&&n.write(a)}),n.addEventListener("audioend",t=>{let{playerId:r,streamId:o,data:a}=t.data,n=e.get(o);n?(n.close(),e.delete(o)):console.warn("dropping audioend data",t.data)})})()}b()}},sendChatMessage:e=>k("say",{text:e}),sendMediaMessage:async e=>{let t=await p(e);k("say",void 0,[{id:crypto.randomUUID(),type:e.type,url:t}])},sendNudgeMessage:e=>{k("nudge",{targetUserId:e},void 0,{hidden:!0})},agentJoin:async e=>{let t=M.getRoom()||crypto.randomUUID();console.log("agent join",{guid:e,room:t}),i(!0),/\/rooms\//.test(location.pathname)||r.push("/rooms/".concat(t)),await new Promise(e=>setTimeout(e,1e3)),await m({room:t,guid:e}),i(!1)},agentJoinRandom:async e=>{let t=M.getRoom()||crypto.randomUUID(),o=e[Math.floor(Math.random()*e.length)].id;console.log("agent join",{guid:o,room:t}),i(!0),/\/rooms\//.test(location.pathname)||r.push("/rooms/".concat(t)),await new Promise(e=>setTimeout(e,1e3)),await m({room:t,guid:o}),i(!1)},agentLeave:async(e,t)=>{console.log("agent leave",{guid:e,room:t});let r=(0,s.u9)(e),o="".concat(r,"leave");console.log("click x",o);let a=await fetch(o,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({room:t})});a.ok&&await a.blob()},addAudioSource:e=>{if(o)return o.addAudioSource(e);throw Error("realms not connected")},removeAudioSource:e=>{if(o)o.removeAudioSource(e);else throw Error("realms not connected")},addVideoSource:e=>{if(o)return o.addVideoSource(e);throw Error("realms not connected")},removeVideoSource:e=>{if(o)o.removeVideoSource(e);else throw Error("realms not connected")},typingMap:h};return M}),M=b.getConnected(),C=b.getRoom(),S=b.getCrdtDoc,P=b.getLocalPlayerSpec(),D=b.getPlayersMap(),L=b.getPlayersCache(),R=b.getMessages(),A=b.getTypingMap(),x=b.setMultiplayerConnectionParameters,j=b.sendChatMessage,I=b.sendMediaMessage,T=b.sendNudgeMessage,W=b.agentJoin,U=b.agentJoinRandom,O=b.agentLeave,J=b.addAudioSource,F=b.removeAudioSource,N=b.addVideoSource,_=b.removeVideoSource;return(0,o.jsx)(v.Provider,{value:{connected:M,room:C,getCrdtDoc:S,localPlayerSpec:P,playersMap:D,playersCache:L,messages:R,setMultiplayerConnectionParameters:x,sendChatMessage:j,sendMediaMessage:I,sendNudgeMessage:T,agentJoin:W,agentJoinRandom:U,agentLeave:O,addAudioSource:J,removeAudioSource:F,addVideoSource:N,removeVideoSource:_,typingMap:A,epoch:l},children:t})}},56672:function(e,t,r){let o;r.d(t,{I:function(){return a},a:function(){return s}});let a=(o=null,()=>{if(null===o){o=new AudioContext({latencyHint:"interactive"});let e=(async()=>{await Promise.all([o.audioWorklet.addModule("/audio-worker/ws-input-worklet.js"),o.audioWorklet.addModule("/audio-worker/ws-output-worklet.js")])})();o.waitForLoad=()=>e}return o}),n=async(e,t)=>{let{signal:r}=t;await e.waitForLoad();let o=new AudioWorkletNode(e,"ws-output-worklet");return o.flushed=!0,o.write=e=>{o.flushed=!1,o.port.postMessage(e)},o.waitForFlush=async()=>{o.flushed||await new Promise((e,t)=>{o.addEventListener("flush",e,{once:!0})})},o.port.onmessage=e=>{let{method:t}=e.data;switch(t){case"flush":o.flushed=!0,o.dispatchEvent(new MessageEvent("flush",{data:null}));break;case"volume":break;default:console.warn("unhandled audio worklet node message method",e.data)}},r.aborted||(o.connect(e.destination),r.addEventListener("abort",()=>{o.disconnect()})),o};class s extends WritableStream{constructor(){let e=new AbortController,{signal:t}=e;super({write:async e=>{(await r).write(e)},close:async()=>{let t=await r;await t.waitForFlush(),e.abort(Error("close() called"))},abort(t){e.abort(t)}}),this.audioContext=a(),this.sampleRate=this.audioContext.sampleRate;let r=n(this.audioContext,{signal:t})}}},25653:function(e,t,r){r.d(t,{P:function(){return i},r:function(){return s}});var o=r(27573),a=r(7653);let n=a.createContext(void 0);function s(){let e=a.useContext(n);if(!e)throw Error("useSidebarContext must be used within a SidebarProvider");return e}function i(e){let{children:t}=e,[r,s]=a.useState(!1);return(0,o.jsx)(n.Provider,{value:{isAgentLoading:r,setIsAgentLoading:s},children:t})}},37904:function(e,t,r){r.d(t,{Kt:function(){return d},QC:function(){return l},WV:function(){return s},Zt:function(){return i}});var o=r(74404),a=r(29649),n=r(16373);function s(e){let{mediaStream:t,audioContext:r}=e;if(!r)throw Error("missing audio context");if(!t)throw Error("missing media stream");let o=new n._,s=new a.Is(t,{audioContext:r,sampleRate:48e3});return(async()=>{for(;;){let e=await s.read();if(e.done){o.end();break}o.write(e.value.data)}})(),{id:crypto.randomUUID(),output:o,mediaStream:t,audioReader:s,close(){s.cancel()}}}function i(e){let t,{sampleRate:r,format:a="f32",transferBuffers:n,codecs:s}=e;if(!r)throw Error("missing sample rate");if(!a)throw Error("missing format");if(!s)throw Error("missing codecs");let{promise:i,resolve:l,reject:d}=Promise.withResolvers(),c=new TransformStream({start:e=>{t=e},transform:e=>{u.decode(e)},flush:async()=>{u.decode(null),await i}}),u=new o.ZX({sampleRate:r,format:a,codecs:s,transferBuffers:n,output:e=>{e?t.enqueue(e.data):l()},error:function(e){console.warn("mp3 decoder error",e)}});return c.readable.sampleRate=r,c.readable.format=a,c.abort=e=>{c.readable.cancel(e),c.writable.abort(e),u.close()},c}function l(e){let t,{sampleRate:r,format:a="f32",codecs:n}=e;if(!r)throw Error("missing sample rate");if(!a)throw Error("missing format");if(!n)throw Error("missing codecs");let{promise:s,resolve:i,reject:l}=Promise.withResolvers(),d=new TransformStream({start:e=>{t=e},transform:e=>{c.decode(e)},flush:async()=>{c.decode(null),await s}}),c=new o.JO({sampleRate:r,format:a,codecs:n,output:e=>{console.log("decode data",e.data),e?t.enqueue(e.data):i()},error:function(e){console.warn("opus decoder error",e)}});return d.readable.sampleRate=r,d.readable.format=a,d.abort=e=>{d.readable.cancel(e),d.writable.abort(e),c.close()},d}function d(e){let{sampleRate:t,format:r="f32"}=e;if(!t)throw Error("missing sample rate");if(!r)throw Error("missing format");throw Error("not implemented")}},98184:function(e,t,r){r.d(t,{Y:function(){return a}});var o=r(37904);class a{constructor({type:e,sampleRate:t,format:r,codecs:a}){if(!a)throw Error("no codecs");switch(e){case"audio/mpeg":return(0,o.Zt)({sampleRate:t,format:r,codecs:a});case"audio/opus":return(0,o.QC)({sampleRate:t,format:r});case"audio/pcm-f32":return(0,o.Kt)({sampleRate:t,format:r});default:throw Error("unhandled audio mime type: ".concat(e))}}}},29649:function(e,t,r){r.d(t,{Is:function(){return s},Zd:function(){return a}});var o=r(29717);class a{set(e){this.data=e}constructor(){this.data=null,this.buffer={getChannelData:e=>this.data}}}class n{setDone(e){this.done=e}constructor(e){this.value=e,this.done=!1}}class s{read(){if(this.buffers.length>0){let e=this.buffers.shift();return e?this.fakeAudioData.set(e):this.fakeIteratorResult.setDone(!0),Promise.resolve(this.fakeIteratorResult)}{let e;let t=new Promise((t,r)=>{e=t});return this.cbs.push(t=>{t?this.fakeAudioData.set(t):this.fakeIteratorResult.setDone(!0),e(this.fakeIteratorResult)}),t}}cancel(){this.pushAudioData(null),this.cleanup()}pushAudioData(e){this.cbs.length>0?this.cbs.shift()(e):this.buffers.push(e)}constructor(e,{audioContext:t,sampleRate:r}){t||console.warn("need audio context"),this.buffers=[],this.cbs=[],this.fakeAudioData=new a,this.fakeIteratorResult=new n(this.fakeAudioData);let s=t.createMediaStreamSource(e),i=new AudioWorkletNode(t,"ws-input-worklet");i.onprocessorerror=e=>{console.warn("audio worklet error",e)},i.port.onmessage=e=>{let a=e.data;void 0!==r&&(a=(0,o.s)(a,t.sampleRate,r)),this.pushAudioData(a)},s.connect(i);let l=e=>{this.cancel()};e.addEventListener("close",l),this.cleanup=()=>{e.removeEventListener("close",l)}}}},74404:function(e,t,r){r.d(t,{JO:function(){return a},ZX:function(){return n}});var o=r(29649);class a{decode(e){this.worker.postMessage(e,null!==e?[e.buffer]:[])}constructor({sampleRate:e,format:t,codecs:r,output:a,error:n}){if(!r.WsOpusCodec)throw console.warn("no WsOpusCodec",r),Error("no WsOpusCodec");this.worker=new r.WsOpusCodec;let s=new o.Zd;this.worker.addEventListener("message",e=>{e.data.data?(s.set(e.data.data),a(s)):a(null)}),this.worker.addEventListener("error",n),this.worker.postMessage({mode:"decode",sampleRate:e,format:t})}}class n{decode(e){this.worker.postMessage(e,this.transferBuffers&&null!==e?[e.buffer]:[])}close(){this.worker.terminate()}constructor({sampleRate:e,format:t,transferBuffers:r=!0,codecs:a,output:n,error:s}){if(!e)throw Error("no sample rate");if(!a)throw Error("no codecs");if(this.transferBuffers=r,!a.WsMp3Decoder)throw console.warn("no WsMp3Decoder",a),Error("no WsMp3Decoder");this.worker=new a.WsMp3Decoder;let i=new o.Zd;this.worker.addEventListener("message",e=>{e.data.data?(i.set(e.data.data),n(i)):n(null)}),this.worker.addEventListener("error",s),this.worker.postMessage({sampleRate:e,format:t})}}},71646:function(e,t,r){r.d(t,{y:function(){return l}});var o=r(10917),a=r(50646);class n{constructor(e,t=new AbortController){this.fn=e,this.abortController=t}}let s=Error("abort");s.isAbortError=!0;var i=new WeakSet;class l extends EventTarget{isIdle(){return 0===this.runningEntries.length}next(){let e,t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:1;for(e=0;e<t;e++){let e=this.runningEntries.shift();if(e){e.abortController.abort(s);continue}}return e===t}async waitForTurn(e){let t=new n(e);return await (0,o._)(this,i,d).call(this,t)}constructor({parallelism:e=1}={}){super(),(0,a._)(this,i),this.parallelism=e,this.runningEntries=[],this.queue=[]}}async function d(e){if(this.runningEntries.length<this.parallelism){let t,r;this.runningEntries.push(e),1===this.runningEntries.length&&this.dispatchEvent(new MessageEvent("idlechange",{data:{idle:!1}}));try{let{fn:r,abortController:o}=e,{signal:a}=o;t=await r({signal:a})}catch(e){r=e}let a=this.runningEntries.indexOf(e);if(this.runningEntries.splice(a,1),this.queue.length>0){let e=this.queue.shift();(0,o._)(this,i,d).call(this,e)}else 0===this.runningEntries.length&&this.dispatchEvent(new MessageEvent("idlechange",{data:{idle:!0}}));if(void 0===r||r===s)return t;throw r}{let{fn:t,abortController:r}=e,{promise:o,resolve:a,reject:i}=Promise.withResolvers(),l=new n(async function(){let e,r;for(var o=arguments.length,n=Array(o),l=0;l<o;l++)n[l]=arguments[l];try{e=await t(...n)}catch(e){r=e}if(void 0===r||r===s)return a(e),e;throw i(r),r},r);return this.queue.push(l),await o}}}}]);