import ServerError from"./error.mjs";import Activity from"../components/activity.mjs";import Files from"../files/files.mjs";import sessions from"../sessions.mjs";import ProseMirrorAuthority from"../components/prosemirror.mjs";import Document from"../../common/abstract/document.mjs";import{isSubclass}from"../../common/utils/helpers.mjs";export async function handleEvent(e,t,o,s){const r=this.user;if(!r)throw new Error(`Unrecognized User attacked to socket ${this.id} for event ${e}`);let i;o.options=o.options||{};let n={userId:r?.id,request:o};try{n.result=await t(r,o),i=o.broadcast??!0}catch(e){e=new ServerError(e.message,e.stack),logger.error(e),n.error=e,i=!1}return s?(s(n),i&&this.broadcast.emit(e,n)):i&&this.server.emit(e,n),n}export function handleCustomSocket(e,t,{recipients:o}={},s){if(o instanceof Array)for(let s of o){const o=game.users.find((e=>e.id===s));if(o)for(let s of o.sockets)s.emit(e,t,this.user.id)}else this.broadcast.emit(e,t,this.user.id);s instanceof Function&&s()}export function handleMigrateDocumentData(e,t,o){const s=global.db[e];if(isSubclass(s,Document))if("object"==typeof t)try{o({source:s.fromImport(t).toObject()})}catch(e){o({error:e.message})}else o({error:'Invalid Document data provided to "migrateDocumentData" operation'});else o({error:`Invalid Document name "${e}" provided to "migrateDocumentData" operation`})}export async function handleConfirmTeleportToken({behaviorUuid:e,tokenUuid:t,userId:o},s){if(!this.user.isGM)return s(!1);const r=game.users.find((e=>e.id===o));if(!r)return s(!1);s(await new Promise((o=>r.sockets.forEach((s=>s.emit("confirmTeleportToken",{behaviorUuid:e,tokenUuid:t},o))))))}export async function activate(e,t){const o=e.handshake.query,s={sessionId:null,userId:null},r=sessions.sessions.get(o.session);if(!r)return e.emit("session",null);if(e.session=r,s.sessionId=r.id,game.world&&game.ready){const t=r.worlds[game.world.id],o=game.users.find((e=>e.id===t));o?(e.user=o,e.userId=s.userId=o.id):delete r.worlds[game.world.id]}e.emit("session",s);for(const o of t)o.socket&&e.on(o.socket,(e=>o.handleSocket(r,e)));e.on("getWorldStatus",requestWorldState),Files.socketListeners(e,handleEvent),s.userId&&(Activity.socketListeners(e),e.on("chatBubble",handleCustomSocket.bind(e,"chatBubble")),e.on("av",handleCustomSocket.bind(e,"av")),ProseMirrorAuthority.socketListeners(e),db.DatabaseBackend.socketListeners(e),db.Scene.socketListeners(e),db.JournalEntry.socketListeners(e),db.Playlist.socketListeners(e),db.FogExploration.socketListeners(e),db.Actor.socketListeners(e),db.Region.socketListeners(e),packages.World.socketListeners(e,handleEvent),e.on("migrateDocumentData",handleMigrateDocumentData),e.on("confirmTeleportToken",handleConfirmTeleportToken.bind(e)))}function requestWorldState(e){return e(game.world&&game.ready)}