@shaunlwm/pickle.ts 1.12.4 → 1.13.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/dist/index.d.ts CHANGED
@@ -44,6 +44,8 @@ type LoginResult = {
44
44
  username: string;
45
45
  moderator: boolean;
46
46
  buddyWorlds: string[];
47
+ /** CPJourney: worlds where AFK kick is enforced. */
48
+ afkServers?: string[];
47
49
  };
48
50
  type QueueUpdate = {
49
51
  userId: number;
@@ -1459,7 +1461,7 @@ declare class Client extends EventEmitter {
1459
1461
  get cardJitsu(): CardJitsu;
1460
1462
  get cppslol(): Cppslol;
1461
1463
  constructor(server: AdapterName, options?: ClientOptions);
1462
- login(options: LoginOptions | TokenLoginOptions, operationOptions?: ClientOperationOptions): Promise<ServerInfo[]>;
1464
+ login(options: LoginOptions | TokenLoginOptions, operationOptions?: ClientOperationOptions): Promise<LoginResult>;
1463
1465
  connect(serverName: string, options?: ConnectOptions): Promise<void>;
1464
1466
  private waitForInitialState;
1465
1467
  on<K extends keyof ServerMessages>(event: K, listener: ServerMessageHandler<K>): this;
package/dist/index.js CHANGED
@@ -1,2 +1,2 @@
1
- var ee="Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/149.0.0.0 Safari/537.36",te="en-US,en;q=0.9",ne=new Set(["connection","content-length","host","transfer-encoding","upgrade"]);function j(m="chrome"){return typeof m=="string"?{preset:m,headers:{}}:{preset:m.preset??"chrome",userAgent:m.userAgent,acceptLanguage:m.acceptLanguage,origin:m.origin,referer:m.referer,headers:m.headers??{}}}function re(m){let e=m.match(/^[a-z][a-z0-9+.-]*:\/\//i)?m:`https://${m}`;try{let t=new URL(e);return`${t.protocol==="wss:"?"https:":t.protocol==="ws:"?"http:":t.protocol}//${t.host}`}catch{return m.replace(/\/+$/,"")}}function B(m,e){if(m.origin)return m.origin;if(m.preset!=="node")return re(e)}function H(m,e){let t={},n=B(m,e.defaultOrigin),r=m.referer??(m.preset==="node"||!n?void 0:`${n}/`);return m.preset!=="node"&&(t["User-Agent"]=m.userAgent??ee,t["Accept-Language"]=m.acceptLanguage??te),n&&(t.Origin=n),r&&(t.Referer=r),oe({...t,...m.headers,...e.headers})}function oe(m){let e={};for(let[t,n]of Object.entries(m))n!=null&&(se(t)||(e[t]=String(n)));return e}function se(m){let e=m.toLowerCase();return ne.has(e)||e.startsWith("sec-websocket-")}var ie=/\b(password|token|login[_-]?key|confirmation[_-]?key|secret)(["']?\s*[:=]\s*)(["'])([^"']*)\3/gi,ae=/\b(password|token|login[_-]?key|confirmation[_-]?key|secret)(\s*[:=]\s*)([^\s&,;]+)/gi,de=/\b([a-z][a-z\d+.-]*:\/\/)([^\s/@]+)@/gi;function z(m){return m.replace(de,"$1[REDACTED]@").replace(ie,"$1$2$3[REDACTED]$3").replace(ae,"$1$2[REDACTED]").slice(0,500)}var a=class extends Error{category;phase;retryable;constructor(e){super(z(e.message),{cause:e.cause}),this.name="ClientOperationError",this.category=e.category,this.phase=e.phase,this.retryable=e.retryable}};var L={loginMs:2e4,transportMs:2e4,queueMs:3e5,authenticationMs:2e4,initialStateMs:15e3,requestMs:15e3};var M=class{constructor(e=j()){this.connectionProfile=e}connectionProfile;rejectRequestsOnServerError=!1;socket=null;loginMessage=null;loginStatus="active";connectionTimeouts(e){return{...L,...e?.timeouts}}reportLifecycle(e,t,n){e?.onLifecycleUpdate?.({phase:t,occurredAt:Date.now(),...n?{queue:n}:{}})}resetLoginState(){this.loginMessage=null,this.loginStatus="active"}unsupportedOperation(e){return new a({category:"unsupported_operation",phase:"ready",retryable:!1,message:`${this.id} does not support ${e}`})}socketIoOptions(e){let t=this.connectionHeaders(e),n=this.connectionOrigin(e),r={};return Object.keys(t).length>0&&(r.extraHeaders=t),n&&(r.origin=n),(this.connectionProfile.preset!=="node"||n)&&(r.withCredentials=!0),r}webSocketOptions(e){let t=this.connectionHeaders(e),n=this.connectionOrigin(e);return{...Object.keys(t).length>0?{headers:t}:{},...n?{origin:n}:{}}}connectionHeaders(e,t){return H(this.connectionProfile,{defaultOrigin:e,headers:t})}connectionOrigin(e){return B(this.connectionProfile,e)}normalizeUser(e){throw this.unsupportedOperation("normalizeUser")}normalizePlayer(e){throw this.unsupportedOperation("normalizePlayer")}extractAppearance(e){return{color:e.color??0,head:e.head??0,face:e.face??0,neck:e.neck??0,body:e.body??0,hand:e.hand??0,feet:e.feet??0,flag:e.flag??0,photo:e.photo??0}}sendMessage(e){throw this.unsupportedOperation("sendMessage")}sendEmote(e){throw this.unsupportedOperation("sendEmote")}sendSafe(e){throw this.unsupportedOperation("sendSafe")}walk(e,t){throw this.unsupportedOperation("walk")}sendFrame(e,t){throw this.unsupportedOperation("sendFrame")}snowball(e,t){throw this.unsupportedOperation("snowball")}joinRoom(e,t,n){throw this.unsupportedOperation("joinRoom")}addItem(e){throw this.unsupportedOperation("addItem")}equipColor(e){throw this.unsupportedOperation("equipColor")}equipHead(e){throw this.unsupportedOperation("equipHead")}equipFace(e){throw this.unsupportedOperation("equipFace")}equipNeck(e){throw this.unsupportedOperation("equipNeck")}equipBody(e){throw this.unsupportedOperation("equipBody")}equipHand(e){throw this.unsupportedOperation("equipHand")}equipFeet(e){throw this.unsupportedOperation("equipFeet")}equipFlag(e){throw this.unsupportedOperation("equipFlag")}equipPhoto(e){throw this.unsupportedOperation("equipPhoto")}buddyRequest(e){throw this.unsupportedOperation("buddyRequest")}buddyAccept(e){throw this.unsupportedOperation("buddyAccept")}buddyReject(e){throw this.unsupportedOperation("buddyReject")}buddyRequestSeen(e){throw this.unsupportedOperation("buddyRequestSeen")}getBuddy(e,t){throw this.unsupportedOperation("getBuddy")}findBuddy(e){throw this.unsupportedOperation("findBuddy")}removeBuddy(e){throw this.unsupportedOperation("removeBuddy")}addIgnore(e){throw this.unsupportedOperation("addIgnore")}removeIgnore(e){throw this.unsupportedOperation("removeIgnore")}getPlayer(e){throw this.unsupportedOperation("getPlayer")}getAllSlots(){throw this.unsupportedOperation("getAllSlots")}getMascots(){throw this.unsupportedOperation("getMascots")}sendPostcard(e,t){throw this.unsupportedOperation("sendPostcard")}getStamps(e){throw this.unsupportedOperation("getStamps")}getPostcards(){throw this.unsupportedOperation("getPostcards")}getIglooOpen(e){throw this.unsupportedOperation("getIglooOpen")}getIgloos(){throw this.unsupportedOperation("getIgloos")}getPuffles(e,t){throw this.unsupportedOperation("getPuffles")}getAllPuffles(){throw this.unsupportedOperation("getAllPuffles")}getPuffleWellbeing(e){throw this.unsupportedOperation("getPuffleWellbeing")}playPuffle(e){throw this.unsupportedOperation("playPuffle")}restPuffle(e){throw this.unsupportedOperation("restPuffle")}buyPuffleItem(e,t){throw this.unsupportedOperation("buyPuffleItem")}walkPuffle(e){throw this.unsupportedOperation("walkPuffle")}initializePuffleTower(){throw this.unsupportedOperation("initializePuffleTower")}getBackyardSupplies(){throw this.unsupportedOperation("getBackyardSupplies")}adoptPuffle(e,t){throw this.unsupportedOperation("adoptPuffle")}getIglooLikes(){throw this.unsupportedOperation("getIglooLikes")}checkPuffleSprite(e){throw this.unsupportedOperation("checkPuffleSprite")}openSprite(e){throw this.unsupportedOperation("openSprite")}equipToy(e){throw this.unsupportedOperation("equipToy")}joinIgloo(e,t,n){throw this.unsupportedOperation("joinIgloo")}getStoreMusic(){throw this.unsupportedOperation("getStoreMusic")}buyMusic(e){throw this.unsupportedOperation("buyMusic")}getIglooStoreItems(){throw this.unsupportedOperation("getIglooStoreItems")}buyFurniture(e,t){throw this.unsupportedOperation("buyFurniture")}updateIglooMusic(e){throw this.unsupportedOperation("updateIglooMusic")}updateIglooFurniture(e){throw this.unsupportedOperation("updateIglooFurniture")}autoUpdateIglooFurniture(e){throw this.unsupportedOperation("autoUpdateIglooFurniture")}updateIglooType(e){throw this.unsupportedOperation("updateIglooType")}openIgloo(){throw this.unsupportedOperation("openIgloo")}closeIglooBounds(){throw this.unsupportedOperation("closeIglooBounds")}likeIgloo(){throw this.unsupportedOperation("likeIgloo")}openIglooEditor(){throw this.unsupportedOperation("openIglooEditor")}closeIglooEditor(){throw this.unsupportedOperation("closeIglooEditor")}gameOver(e){throw this.unsupportedOperation("gameOver")}collectStamp(e){throw this.unsupportedOperation("collectStamp")}getNinja(){throw this.unsupportedOperation("getNinja")}getMats(){throw this.unsupportedOperation("getMats")}joinMatchmaking(){throw this.unsupportedOperation("joinMatchmaking")}leaveMatchmaking(){throw this.unsupportedOperation("leaveMatchmaking")}startGame(){throw this.unsupportedOperation("startGame")}selectCard(e){throw this.unsupportedOperation("selectCard")}loadAnimation(e){throw this.unsupportedOperation("loadAnimation")}joinMat(e){throw this.unsupportedOperation("joinMat")}};import{EventEmitter as Le}from"events";import{io as ue}from"socket.io-client";import ce from"socket.io-msgpack-parser";var W="wss://play.cpjourney.net",le="skip",pe=new Set(["Penguin not found. Try Again?","Incorrect password. NOTE: Passwords are CaSe SeNsiTIVE"]),A=class extends M{id="CPJourney";rejectRequestsOnServerError=!0;gameToken;async login(e,t){this.resetLoginState(),this.gameToken="token"in e?e.token:void 0;let n=this.createSocket("/world/login/");return await new Promise((i,o)=>{let s=!1,d=setTimeout(()=>{c(new a({category:"login_timeout",phase:"transport_connecting",retryable:!0,message:"Login timed out"}))},t?.timeoutMs??L.loginMs),u=()=>{clearTimeout(d),n.off("connect",g),n.off("message",_),n.off("connect_error",y),n.off("disconnect",C),t?.signal?.removeEventListener("abort",v)},c=p=>{s||(s=!0,u(),n.disconnect(),o(p))},l=p=>{s||(s=!0,u(),n.disconnect(),i(p))},g=()=>{let p=e.secret??le,f="token"in e?{username:e.username,token:e.token,secret:p}:{username:e.username,password:e.password,secret:p};n.emit("message",{action:"login",args:f})},_=p=>{if(p.action!=="login")return;let f=p.args;if(!f.success){this.loginMessage=f.message??null;let b=f.message??"Login failed";f.message?.startsWith("Banned:")&&(this.loginStatus="banned");let O=pe.has(b);c(new a({category:this.loginStatus==="banned"?"account_banned":O?"invalid_credentials":"login_rejected",phase:"transport_connecting",retryable:!1,message:b}));return}let k=Object.entries(f.populations).map(([b,O])=>({name:b,population:O}));l({servers:k,key:f.key,username:f.username,moderator:f.moderator,buddyWorlds:f.buddyWorlds??[]})},y=p=>{c(new a({category:"transport_error",phase:"transport_connecting",retryable:!0,message:`Login connection failed: ${p.message}`,cause:p}))},C=p=>{c(new a({category:"transport_error",phase:"transport_connecting",retryable:!0,message:`Login connection closed unexpectedly${p?`: ${p}`:""}`}))},v=()=>{c(new a({category:"aborted",phase:"transport_connecting",retryable:!0,message:"Login cancelled"}))};if(t?.signal?.aborted){v();return}n.on("connect",g),n.on("message",_),n.on("connect_error",y),n.on("disconnect",C),t?.signal?.addEventListener("abort",v,{once:!0})})}async connect(e,t,n){this.reportLifecycle(n,"transport_connecting"),await this.queueForServer(e,n),this.reportLifecycle(n,"transport_connecting");let r=this.createSocket(`/world/${e.toLowerCase()}/`);this.socket=r;let i=this.connectionTimeouts(n),o=d=>{d.action==="game_auth"||d.action==="wait_queue_update"||n?.onMessage?.(d)},s=d=>{n?.onDisconnect?.(d??null)};return r.on("message",o),r.on("disconnect",s),await new Promise((d,u)=>{let c=!1,l,g="transport_connecting",_=()=>{l!==void 0&&clearTimeout(l),r.off("connect",p),r.off("message",f),r.off("connect_error",k),r.off("disconnect",b),n?.signal?.removeEventListener("abort",O)},y=h=>{c||(c=!0,_(),r.off("message",o),r.off("disconnect",s),r.disconnect(),this.socket=null,u(h))},C=()=>{c||(c=!0,_(),d())},v=(h,w,S,P)=>{l!==void 0&&clearTimeout(l),l=setTimeout(()=>{y(new a({category:w,phase:S,retryable:!0,message:P}))},h)},p=()=>{g="authenticating",this.reportLifecycle(n,"authenticating"),v(i.authenticationMs,"auth_timeout","authenticating","Game authentication timed out");let h={username:t.username,key:t.key,createToken:!1,joinInvis:!1,takeoverMascot:!1,...this.gameToken?{token:this.gameToken}:{}};r.emit("message",{action:"game_auth",args:h})},f=h=>{switch(h.action){case"wait_queue_update":{let w=h.args;g="queueing",this.reportLifecycle(n,"queueing",w),n?.onQueueUpdate?.(w),v(i.queueMs,"queue_timeout","queueing","Game server queue stopped responding");break}case"game_auth":{if(!h.args.success){y(new a({category:"auth_failed",phase:"authenticating",retryable:!0,message:"Game authentication failed"}));return}this.reportLifecycle(n,"joining_session"),r.emit("message",{action:"join_server",args:{}}),C();break}}},k=h=>{y(new a({category:"transport_error",phase:"transport_connecting",retryable:!0,message:`Game connection failed: ${h.message}`,cause:h}))},b=h=>{y(new a({category:"transport_error",phase:g,retryable:!0,message:`Disconnected before joining the game${h?`: ${h}`:""}`}))},O=()=>{y(new a({category:"aborted",phase:g,retryable:!0,message:"Game connection cancelled"}))};if(n?.signal?.aborted){O();return}r.on("connect",p),r.on("message",f),r.on("connect_error",k),r.on("disconnect",b),n?.signal?.addEventListener("abort",O,{once:!0}),v(i.transportMs,"transport_error","transport_connecting","Game transport connection timed out")}),r}async queueForServer(e,t){let n=this.createSocket("/world/login/"),r=this.connectionTimeouts(t);this.reportLifecycle(t,"queueing"),await new Promise((i,o)=>{let s=!1,d=!1,u,c=()=>{u!==void 0&&clearTimeout(u),u=setTimeout(()=>{g(new a({category:"queue_timeout",phase:"queueing",retryable:!0,message:"Server queue stopped responding"}))},r.queueMs)},l=()=>{u!==void 0&&clearTimeout(u),n.off("connect",y),n.off("message",C),n.off("disconnect",v),n.off("connect_error",p),t?.signal?.removeEventListener("abort",f)},g=k=>{s||(s=!0,l(),n.disconnect(),o(k))},_=()=>{s||(s=!0,d=!0,l(),n.disconnect(),i())},y=()=>{n.emit("message",{action:"queue_server_join",args:{server:e}})},C=k=>{switch(k.action){case"wait_queue_update":{let b=k.args;this.reportLifecycle(t,"queueing",b),t?.onQueueUpdate?.(b),c();break}case"queue_server_join":{_();break}}},v=k=>{d||g(new a({category:"transport_error",phase:"queueing",retryable:!0,message:`Queue connection closed unexpectedly${k?`: ${k}`:""}`}))},p=k=>{g(new a({category:"transport_error",phase:"queueing",retryable:!0,message:`Queue connection failed: ${k.message}`,cause:k}))},f=()=>{g(new a({category:"aborted",phase:"queueing",retryable:!0,message:"Queue wait cancelled"}))};if(t?.signal?.aborted){f();return}n.on("connect",y),n.on("message",C),n.on("disconnect",v),n.on("connect_error",p),t?.signal?.addEventListener("abort",f,{once:!0}),c()})}send(e,t){if(!this.socket)throw new Error("Not connected");this.socket.emit("message",{action:e,args:t})}disconnect(){this.socket?.disconnect(),this.socket=null}normalizeUser(e){let{id:t,username:n,displayName:r,joinTime:i,x:o,y:s,frame:d,walking:u,color:c,head:l,face:g,neck:_,body:y,hand:C,feet:v,flag:p,photo:f,...k}=e;return{...this.extractAppearance(e),id:t,username:n,displayName:r,joinTime:i,x:o??0,y:s??0,frame:d??0,walking:u,meta:k,_raw:e}}normalizePlayer(e){let t=e.user,n=this.normalizeUser(t),{user:r,coins:i,rank:o,inventory:s,furniture:d,flooring:u,buddies:c,buddyRequests:l,ignores:g,igloos:_,...y}=e;return{...n,_raw:e,coins:i??0,rank:o??0,inventory:s??[],furniture:d??[],flooring:u??[],buddies:t.buddies??[],buddyRequests:t.buddyRequests??[],ignores:t.ignores??[],igloos:_??[],meta:{...n.meta,...y}}}sendMessage(e){this.send("send_message",{message:e})}sendEmote(e){this.send("send_emote",{emote:e})}sendSafe(e){this.send("send_safe",{safe:e})}walk(e,t){this.send("send_position",{x:e,y:t})}sendFrame(e,t){this.send("send_frame",{frame:e,set:t})}snowball(e,t){this.send("snowball",{x:e,y:t})}joinRoom(e,t,n){this.send("join_room",{room:e,x:t??0,y:n??0})}addItem(e){this.send("add_item",{item:e})}equipColor(e){this.send("update_color",{item:e})}equipHead(e){this.send("update_head",{item:e})}equipFace(e){this.send("update_face",{item:e})}equipNeck(e){this.send("update_neck",{item:e})}equipBody(e){this.send("update_body",{item:e})}equipHand(e){this.send("update_hand",{item:e})}equipFeet(e){this.send("update_feet",{item:e})}equipFlag(e){this.send("update_flag",{item:e})}equipPhoto(e){this.send("update_photo",{item:e})}buddyRequest(e){this.send("buddy_request",{id:e})}buddyAccept(e){this.send("buddy_accept",{id:e})}buddyReject(e){this.send("buddy_reject",{id:e})}buddyRequestSeen(e){this.send("buddy_request_seen",{id:e})}getBuddy(e,t){this.send("get_buddy",{id:e,type:t})}findBuddy(e){this.send("buddy_find",{id:e})}removeBuddy(e){this.send("remove_buddy",{id:e})}addIgnore(e){this.send("ignore_add",{id:e})}removeIgnore(e){this.send("ignore_remove",{id:e})}getPlayer(e){this.send("get_player",{id:e})}getAllSlots(){this.send("get_all_slots",{})}getMascots(){this.send("get_mascots",{})}sendPostcard(e,t){this.send("send_postcard",{userId:e,cardId:t})}getStamps(e){this.send("get_stamps",{userId:e})}getPostcards(){this.send("get_postcards",{})}getIglooOpen(e){this.send("get_igloo_open",{igloo:e})}getIgloos(){this.send("get_igloos",{})}getPuffles(e,t){this.send("get_puffles",{userId:e,...t!==void 0?{isBackyard:t}:{}})}getAllPuffles(){this.send("get_all_puffles",{})}getPuffleWellbeing(e){this.send("get_wellbeing",{puffle:e})}playPuffle(e){this.send("puffle_play",{puffle:e})}restPuffle(e){this.send("update_puffle_rest",{puffle:e})}buyPuffleItem(e,t){this.send("puffle_buy_item",{puffleId:e,item:t})}walkPuffle(e){this.send("walk_puffle",{puffle:e})}initializePuffleTower(){this.send("tower_init",{})}getBackyardSupplies(){this.send("backyard_supplies",{})}adoptPuffle(e,t){this.send("adopt_puffle",{type:e,name:t})}getIglooLikes(){this.send("get_igloo_likes",{})}checkPuffleSprite(e){this.send("check_puffle_sprite",{puffleSprite:e})}openSprite(e){this.send("open_sprite",{sprite:e})}joinIgloo(e,t,n){this.send("join_igloo",{igloo:e,x:t??0,y:n??0})}getStoreMusic(){this.send("get_store_music",{})}buyMusic(e){this.send("add_music",{music:e})}getIglooStoreItems(){this.send("get_igloostore_items",{})}buyFurniture(e,t){this.send("add_furniture",{furniture:e,amount:t})}updateIglooMusic(e){this.send("update_music",{music:e})}updateIglooFurniture(e){this.send("update_furniture",{furniture:e})}autoUpdateIglooFurniture(e){this.send("update_furniture_auto",{furniture:e})}updateIglooType(e){this.send("update_igloo",{type:e})}openIgloo(){this.send("open_igloo",{})}closeIglooBounds(){this.send("close_igloo_bounds",{})}likeIgloo(){this.send("like_igloo",{})}openIglooEditor(){this.send("igloo_editor_open",{})}closeIglooEditor(){this.send("igloo_editor_closed",{})}gameOver(e){this.send("game_over",{coins:e})}collectStamp(e){this.send("collect_stamp",{stamp:e})}getNinja(){this.send("get_ninja",{})}getMats(){this.send("get_waddles",{})}joinMatchmaking(){this.send("join_matchmaking",{})}leaveMatchmaking(){this.send("leave_matchmaking",{})}startGame(){this.send("start_game",{})}selectCard(e){this.send("select_card",{slot:e})}loadAnimation(e){this.send("load_animation",{animation:e})}joinMat(e){this.send("join_waddle",{waddle:e})}createSocket(e){return ue(W,{...this.socketIoOptions(W),path:e,parser:ce,transports:["polling","websocket"],reconnection:!1})}};import{io as ge}from"socket.io-client";import me from"socket.io-msgpack-parser";var he="https://api.cplegacy.com/login",fe="https://api.cplegacy.com/token_login",Q="https://play.cplegacy.com";function ve(m){let e=m.on.bind(m);return m.on=((t,n)=>t==="message"?e(t,(r,i)=>{n({action:r,args:i??{}})}):e(t,n)),m}var x=class extends M{id="CPLegacy";version="";async login(e,t){this.resetLoginState();let n="token"in e?fe:he,r="token"in e?{username:e.username,token:e.token}:{username:e.username,password:e.password,version:this.version},i=new AbortController,o=!1,s=()=>i.abort();if(t?.signal?.aborted)throw new a({category:"aborted",phase:"transport_connecting",retryable:!0,message:"Login cancelled"});t?.signal?.addEventListener("abort",s,{once:!0});let d=setTimeout(()=>{o=!0,i.abort()},t?.timeoutMs??L.loginMs),u;try{u=await this.postLogin(n,r,i.signal),!u.success&&u.wantedVersion&&(this.version=u.wantedVersion,r.version=this.version,u=await this.postLogin(n,r,i.signal))}catch(l){throw i.signal.aborted?new a({category:o?"login_timeout":"aborted",phase:"transport_connecting",retryable:!0,message:o?"Login timed out":"Login cancelled",cause:l}):new a({category:"transport_error",phase:"transport_connecting",retryable:!0,message:l instanceof Error?`Login connection failed: ${l.message}`:"Login connection failed",cause:l})}finally{clearTimeout(d),t?.signal?.removeEventListener("abort",s)}if(!u.success){this.loginMessage=u.message??null;let l=u.message??"unknown error",g=/password|credential|incorrect|invalid login/i.test(l);throw new a({category:g?"invalid_credentials":"login_rejected",phase:"transport_connecting",retryable:!1,message:`Login failed: ${l}`})}return{servers:Object.entries(u.populations??{}).map(([l,g])=>({name:l,population:g})),key:u.key,username:u.username,moderator:!1,buddyWorlds:[]}}async connect(e,t,n){this.reportLifecycle(n,"transport_connecting");let r=this.createSocket(e);this.socket=r;let i=this.connectionTimeouts(n),o=(d,u)=>{d==="game_auth"||d==="wait_queue_update"||n?.onMessage?.({action:d,args:u??{}})},s=d=>{n?.onDisconnect?.(d??null)};return r.on("message",o),r.on("disconnect",s),await new Promise((d,u)=>{let c=!1,l,g="transport_connecting",_=()=>{l!==void 0&&clearTimeout(l),r.off("connect",p),r.off("message",f),r.off("connect_error",k),r.off("disconnect",b),n?.signal?.removeEventListener("abort",O)},y=h=>{c||(c=!0,_(),r.off("message",o),r.off("disconnect",s),r.disconnect(),this.socket=null,u(h))},C=()=>{c||(c=!0,_(),d())},v=(h,w,S,P)=>{l!==void 0&&clearTimeout(l),l=setTimeout(()=>{y(new a({category:w,phase:S,retryable:!0,message:P}))},h)},p=()=>{g="authenticating",this.reportLifecycle(n,"authenticating"),v(i.authenticationMs,"auth_timeout","authenticating","Game authentication timed out"),r.emit("message","game_auth",{username:t.username,key:t.key,createToken:!1,token:""})},f=(h,w)=>{switch(h){case"wait_queue_update":{let S=w;g="queueing",this.reportLifecycle(n,"queueing",S),n?.onQueueUpdate?.(S),v(i.queueMs,"queue_timeout","queueing","Game server queue stopped responding");break}case"game_auth":{if(!w.success){y(new a({category:"auth_failed",phase:"authenticating",retryable:!0,message:"Game authentication failed"}));return}this.reportLifecycle(n,"joining_session"),r.emit("message","load_player",{}),r.emit("message","join_server",{}),C();break}}},k=h=>{y(new a({category:"transport_error",phase:"transport_connecting",retryable:!0,message:`Game connection failed: ${h.message}`,cause:h}))},b=h=>{y(new a({category:"transport_error",phase:g,retryable:!0,message:`Disconnected before game authentication${h?`: ${h}`:""}`}))},O=()=>{y(new a({category:"aborted",phase:g,retryable:!0,message:"Game connection cancelled"}))};if(n?.signal?.aborted){O();return}r.on("connect",p),r.on("message",f),r.on("connect_error",k),r.on("disconnect",b),n?.signal?.addEventListener("abort",O,{once:!0}),v(i.transportMs,"transport_error","transport_connecting","Game transport connection timed out")}),ve(r)}send(e,t){if(!this.socket)throw new Error("Not connected");this.socket.emit("message",e,t)}disconnect(){this.socket?.disconnect(),this.socket=null}normalizeUser(e){return{...this.extractAppearance(e),id:e.id,username:e.username,displayName:e.realUsername??e.username,joinTime:e.joinTime,x:e.x??0,y:e.y??0,frame:e.frame??0,walking:e.walking??void 0,meta:{internalUsername:e.username,approved:e.approved,emailVerified:e.emailVerified,safeChat:e.safeChat,tutorial:e.tutorial,loginStreak:e.loginStreak,walkingColor:e.walkingColor,stampbookColor:e.stampbookColor,stampbookClasp:e.stampbookClasp,stampbookPattern:e.stampbookPattern,ninjaPoints:e.ninjaPoints,highestNinjaRank:e.highestNinjaRank,character:e.character,transformed:e.transformed},_raw:e}}normalizePlayer(e){let t=e.user;return{...this.normalizeUser(t),_raw:e,coins:t.coins??0,rank:t.rank??0,inventory:e.inventory??[],furniture:e.furniture,buddies:[],buddyRequests:e.pending?.map(n=>n.id)??[],ignores:[],igloos:e.igloos??[]}}sendMessage(e){this.send("send_message",{message:e})}sendEmote(e){this.send("send_emote",{emote:e})}sendSafe(e){this.send("send_safe",{safe:e})}walk(e,t){this.send("send_position",{x:e,y:t})}sendFrame(e,t){this.send("send_frame",{frame:e,set:t})}snowball(e,t){this.send("snowball",{x:e,y:t})}joinRoom(e,t,n){this.send("join_room",{room:e,x:t??0,y:n??0})}addItem(e){this.send("add_item",{item:e})}equipColor(e){this.send("update_color",{item:e})}equipHead(e){this.send("update_head",{item:e})}equipFace(e){this.send("update_face",{item:e})}equipNeck(e){this.send("update_neck",{item:e})}equipBody(e){this.send("update_body",{item:e})}equipHand(e){this.send("update_hand",{item:e})}equipFeet(e){this.send("update_feet",{item:e})}equipFlag(e){this.send("update_flag",{item:e})}equipPhoto(e){this.send("update_photo",{item:e})}buddyRequest(e){this.send("buddy_request",{id:e})}buddyAccept(e){this.send("buddy_accept",{id:e})}buddyReject(e){this.send("buddy_reject",{id:e})}removeBuddy(e){this.send("remove_buddy",{id:e})}addIgnore(e){this.send("ignore_add",{id:e})}removeIgnore(e){this.send("ignore_remove",{id:e})}getPlayer(e){this.send("get_player",{id:e})}getStamps(e){this.send("get_stamps",{userId:e})}getPostcards(){this.send("get_postcards",{})}joinIgloo(e,t,n){this.send("join_igloo",{igloo:e,x:t??0,y:n??0})}gameOver(e){this.send("game_over",{coins:e})}collectStamp(e){this.send("collect_stamp",{stamp:e})}async postLogin(e,t,n){return(await fetch(e,{method:"POST",headers:this.connectionHeaders(Q,{"Content-Type":"application/json",Accept:"application/json"}),body:JSON.stringify(t),signal:n})).json()}createSocket(e){let t=`wss://${e.toLowerCase()}.server.cplegacy.com`;return ge(t,{...this.socketIoOptions(Q),path:"/socket.io/",parser:me,transports:["websocket"],reconnection:!1})}};import{io as be}from"socket.io-client";import{createHmac as ye}from"crypto";function K(m){if(m===null||typeof m!="object")return JSON.stringify(m)??"null";if(Array.isArray(m))return`[${m.map(K).join(",")}]`;let e=m;return`{${Object.keys(e).sort().map(t=>`${JSON.stringify(t)}:${K(e[t])}`).join(",")}}`}var U=class{constructor(e,t,n=Date.now){this.now=n;if(!/^(?:[0-9a-fA-F]{2})+$/.test(e))throw new Error("CPPS.lol returned an invalid packet key");if(!Number.isFinite(t))throw new Error("CPPS.lol returned an invalid server time");this.key=Buffer.from(e,"hex"),this.clockOffsetMs=t-this.now()}now;sequence=0;clockOffsetMs;key;sign(e,t){let n=++this.sequence,r=this.now()+this.clockOffsetMs,i=`${n}.${r}.${e}.${K(t)}`,o=ye("sha256",this.key).update(i).digest("hex");return{action:e,args:t,seq:n,ts:r,mac:o}}};var J="https://play.cpps.lol",E=class extends M{id="CPPS.lol";signer=null;sessionToken="";async login(e,t){this.resetLoginState(),this.sessionToken="";let n=this.createSocket("/world/login/");return new Promise((r,i)=>{let o=!1,s=setTimeout(()=>{u(new a({category:"login_timeout",phase:"transport_connecting",retryable:!0,message:"Login timed out"}))},t?.timeoutMs??L.loginMs),d=()=>{clearTimeout(s),n.off("connect",l),n.off("message",g),n.off("connect_error",_),n.off("disconnect",y),t?.signal?.removeEventListener("abort",C)},u=v=>{o||(o=!0,this.sessionToken="",d(),n.disconnect(),i(v))},c=v=>{o||(o=!0,d(),n.disconnect(),r(v))},l=()=>{let v="token"in e?"token_login":"login",p="token"in e?{username:e.username,token:e.token}:{username:e.username,password:e.password};n.emit("message",{action:v,args:p})},g=v=>{if(v.action!=="login")return;let p=v.args;if(!p.success){this.loginMessage=p.message??null;let k=p.message??"Login failed",b=/password|credential|incorrect|invalid login/i.test(k);u(new a({category:b?"invalid_credentials":"login_rejected",phase:"transport_connecting",retryable:!1,message:k}));return}let f=Object.entries(p.populations).map(([k,b])=>typeof b=="number"?{name:k,population:b}:{name:k,population:b.bars,users:b.users});this.sessionToken="token"in e?e.token:"",c({servers:f,key:p.key,username:p.username,moderator:!1,buddyWorlds:[]})},_=v=>{u(new a({category:"transport_error",phase:"transport_connecting",retryable:!0,message:`Login connection failed: ${v.message}`,cause:v}))},y=v=>{u(new a({category:"transport_error",phase:"transport_connecting",retryable:!0,message:`Login connection closed unexpectedly${v?`: ${v}`:""}`}))},C=()=>{u(new a({category:"aborted",phase:"transport_connecting",retryable:!0,message:"Login cancelled"}))};if(t?.signal?.aborted){C();return}n.on("connect",l),n.on("message",g),n.on("connect_error",_),n.on("disconnect",y),t?.signal?.addEventListener("abort",C,{once:!0})})}async connect(e,t,n){this.signer=null,this.reportLifecycle(n,"transport_connecting");let r=this.createSocket(`/world/${e.toLowerCase()}/`);this.socket=r;let i=this.connectionTimeouts(n),o=d=>{d.action==="game_auth"||d.action==="wait_queue_update"||n?.onMessage?.(d)},s=d=>{this.signer=null,this.sessionToken="",n?.onDisconnect?.(d??null)};return r.on("message",o),r.on("disconnect",s),await new Promise((d,u)=>{let c=!1,l,g="transport_connecting",_=()=>{l!==void 0&&clearTimeout(l),r.off("connect",p),r.off("message",f),r.off("connect_error",k),r.off("disconnect",b),n?.signal?.removeEventListener("abort",O)},y=h=>{c||(c=!0,_(),r.off("message",o),r.off("disconnect",s),this.signer=null,this.sessionToken="",r.disconnect(),this.socket=null,u(h))},C=()=>{c||(c=!0,_(),d())},v=(h,w,S,P)=>{l!==void 0&&clearTimeout(l),l=setTimeout(()=>{y(new a({category:w,phase:S,retryable:!0,message:P}))},h)},p=()=>{g="authenticating",this.reportLifecycle(n,"authenticating"),v(i.authenticationMs,"auth_timeout","authenticating","Game authentication timed out"),r.emit("message",{action:"game_auth",args:{username:t.username,key:t.key,createToken:!0,token:this.sessionToken}})},f=h=>{switch(h.action){case"wait_queue_update":{let w=h.args;g="queueing",this.reportLifecycle(n,"queueing",w),n?.onQueueUpdate?.(w),v(i.queueMs,"queue_timeout","queueing","Game server queue stopped responding");break}case"game_auth":{let w=h.args;if(!w.success||!w.packetKey||typeof w.serverTime!="number"){y(new a({category:"auth_failed",phase:"authenticating",retryable:!0,message:"Game authentication failed"}));return}try{this.signer=new U(w.packetKey,w.serverTime),this.sessionToken=w.token??this.sessionToken}catch(S){y(new a({category:"auth_failed",phase:"authenticating",retryable:!0,message:"Game authentication returned invalid signing data",cause:S}));return}this.reportLifecycle(n,"joining_session"),r.emit("message",{action:"join_server",args:{}}),C();break}}},k=h=>{y(new a({category:"transport_error",phase:"transport_connecting",retryable:!0,message:`Game connection failed: ${h.message}`,cause:h}))},b=h=>{y(new a({category:"transport_error",phase:g,retryable:!0,message:`Disconnected before game authentication${h?`: ${h}`:""}`}))},O=()=>{y(new a({category:"aborted",phase:g,retryable:!0,message:"Game connection cancelled"}))};if(n?.signal?.aborted){O();return}r.on("connect",p),r.on("message",f),r.on("connect_error",k),r.on("disconnect",b),n?.signal?.addEventListener("abort",O,{once:!0}),v(i.transportMs,"transport_error","transport_connecting","Game transport connection timed out")}),r}send(e,t){if(!this.socket||!this.signer)throw new Error("Not connected or authenticated");this.socket.emit("message",this.signer.sign(e,t))}disconnect(){this.signer=null,this.sessionToken="",this.socket?.disconnect(),this.socket=null}normalizeUser(e){return{...this.extractAppearance(e),id:e.id,username:e.username,displayName:e.nickname??e.displayName??e.username,joinTime:e.joinTime,x:e.x??0,y:e.y??0,frame:e.frame??0,meta:{toy:e.toy,headLayer:e.headLayer,headColor:e.headColor,headLayerColor:e.headLayerColor,faceLayer:e.faceLayer,faceColor:e.faceColor,faceLayerColor:e.faceLayerColor,neckLayer:e.neckLayer,neckColor:e.neckColor,neckLayerColor:e.neckLayerColor,bodyLayer:e.bodyLayer,bodyColor:e.bodyColor,bodyLayerColor:e.bodyLayerColor,handLayer:e.handLayer,handColor:e.handColor,handLayerColor:e.handLayerColor,feetLayer:e.feetLayer,feetColor:e.feetColor,feetLayerColor:e.feetLayerColor,flagLayer:e.flagLayer,flagColor:e.flagColor,flagLayerColor:e.flagLayerColor,photoLayer:e.photoLayer,photoColor:e.photoColor,photoLayerColor:e.photoLayerColor,flags:e.flags,isMascot:e.isMascot,invisible:e.invisible,isAfk:e.isAfk,connectionUnstable:e.connectionUnstable,transform:e.transform,playercardMusic:e.playercardMusic,outfits:e.outfits,relationships:e.relationships,likes:e.likes,features:e.features},_raw:e}}normalizePlayer(e){let t=e.user,n=this.normalizeUser(t);return{...n,_raw:e,coins:e.coins??0,rank:e.rank??0,inventory:e.inventory??[],furniture:e.furniture??[],flooring:e.flooring??[],buddies:e.buddies??[],buddyRequests:e.buddyRequests??[],ignores:e.ignores??[],igloos:e.igloos??[],meta:{...n.meta,snowflakes:e.snowflakes,postcards:e.postcards,mascots:e.mascots,pets:e.pets,locations:e.locations}}}sendMessage(e){this.send("send_message",{message:e})}sendEmote(e){this.sendPackedEmote(1,e)}sendSafe(e){this.send("send_safe",{safe:e})}walk(e,t){this.send("send_position",{x:e,y:t})}sendFrame(e,t){this.send("send_frame",{set:t??!0,frame:e})}snowball(e,t){this.send("snowball",{x:e,y:t})}joinRoom(e,t,n){this.leaveWaddle(),this.send("join_room",{room:e,x:t??0,y:n??0})}addItem(e){this.send("add_item",{item:String(e)})}updatePlayer(e){this.send("update_player",{item:e})}equipColor(e){this.updatePlayer(e)}equipHead(e){this.updatePlayer(e)}equipFace(e){this.updatePlayer(e)}equipNeck(e){this.updatePlayer(e)}equipBody(e){this.updatePlayer(e)}equipHand(e){this.updatePlayer(e)}equipFeet(e){this.updatePlayer(e)}equipFlag(e){this.updatePlayer(e)}equipPhoto(e){this.updatePlayer(e)}getIglooOpen(e){this.send("get_igloo_open",{igloo:e})}joinIgloo(e,t,n){this.leaveWaddle(),this.send("join_igloo",{igloo:e,x:t??0,y:n??0})}updateIglooFurniture(e){this.send("update_furniture",{furniture:e})}openIglooRaw(){this.send("open_igloo",{})}sendPackedEmote(e,t){this.send("send_emote",{pack:e,emote:t})}updateLayeredPlayer(e){this.send("update_player",{item:e,layer:!0})}acceptMature(){this.send("accept_mature",{})}removeInventory(e){this.send("remove_inventory",{item:e})}getSnowflakeState(){this.send("get_snowflake_state",{})}getPets(e){this.send("get_pets",{userId:e})}getIglooContest(){this.send("get_igloo_contest",{})}getIglooLikesFor(e){this.send("get_igloo_likes",{iglooId:e})}likeIglooById(e){this.send("like_igloo",{iglooId:e})}sendMail(e,t){this.send("send_mail",{recipient:e,postcardId:t})}marryRequest(e){this.send("marry_request",{id:e})}leaveWaddle(){this.send("leave_waddle",{})}createSocket(e){return be(J,{...this.socketIoOptions(J),path:e,transports:["polling","websocket"],reconnection:!1})}};import{createCipheriv as _e,createDecipheriv as ke,randomBytes as we}from"crypto";import{io as Ce}from"socket.io-client";import N from"tweetnacl";var V="https://media8.newcp.net/assets/media/crumbs/en/crumbs.json",R=class{aesKey=null;keypair=N.box.keyPair();get publicKey(){return Buffer.from(this.keypair.publicKey).toString("base64")}get encrypted(){return this.aesKey!==null}acquireKey(e,t){let n=Buffer.from(e,"base64"),r=Buffer.from(t,"base64"),i=n.subarray(0,N.box.nonceLength),o=n.subarray(N.box.nonceLength),s=N.box.open(new Uint8Array(o),new Uint8Array(i),new Uint8Array(r),this.keypair.secretKey);return s?new TextDecoder().decode(s):null}setKey(e){this.aesKey=Buffer.from(e,"utf-8")}encrypt(e){if(!this.aesKey)throw new Error("Encryption key not set");let t=we(16),n=_e("aes-256-cbc",this.aesKey,t),r=Buffer.concat([n.update(e,"utf-8"),n.final()]);return Buffer.concat([t,r]).toString("base64")}decrypt(e){if(!this.aesKey)throw new Error("Encryption key not set");let t=Buffer.from(e,"base64"),n=t.subarray(0,16),r=t.subarray(16),i=ke("aes-256-cbc",this.aesKey,n);return Buffer.concat([i.update(r),i.final()]).toString("utf-8")}encode(e){return this.encrypted?this.encrypt(JSON.stringify(e)):JSON.stringify(e)}decode(e){return this.encrypted&&typeof e=="string"?JSON.parse(this.decrypt(e)):typeof e=="string"?JSON.parse(e):e}};function X(m,e,t){return new Promise((n,r)=>{let i=!1,o=()=>{m.off("handshake",u),t.removeEventListener("abort",d)},s=c=>{i||(i=!0,o(),r(c))},d=()=>{s(new Error("Handshake cancelled"))},u=(c,l)=>{try{let g=e.acquireKey(c,l);if(!g){s(new Error("Failed to decrypt handshake key"));return}let _=JSON.parse(g);if(_.time&&typeof _.time=="number"&&Math.abs(Date.now()-_.time)>3e5){s(new Error("Server time desync"));return}if(e.setKey(_.key),i)return;i=!0,o(),n()}catch(g){s(g instanceof Error?g:new Error("Handshake failed"))}};if(t.aborted){d();return}m.on("handshake",u),t.addEventListener("abort",d,{once:!0}),m.emit("handshake",e.publicKey)})}function Oe(m,e){let t=m.on.bind(m);return m.on=((n,r)=>n==="message"?t(n,i=>{try{let o=e.decode(i);r({action:o.action,args:o.args??{}})}catch{}}):t(n,r)),m}var F=class extends M{id="NewCP";encryptor=new R;worlds=null;async login(e,t){this.resetLoginState();let n=new AbortController,r=!1,i=()=>n.abort();if(t?.signal?.aborted)throw new a({category:"aborted",phase:"transport_connecting",retryable:!0,message:"Login cancelled"});t?.signal?.addEventListener("abort",i,{once:!0});let o=setTimeout(()=>{r=!0,n.abort()},t?.timeoutMs??L.loginMs),s=null;try{this.worlds||await this.loadWorlds(n.signal);let d=Object.values(this.worlds??{}).find(u=>u.login);if(!d)throw new a({category:"login_rejected",phase:"transport_connecting",retryable:!1,message:"Login world not found in crumbs"});return s=this.createSocket(d.host,d.path),this.encryptor=new R,await new Promise((u,c)=>{let l=!1,g=()=>{s?.off("connect",C),s?.off("message",v),s?.off("connect_error",p),s?.off("disconnect",f),n.signal.removeEventListener("abort",k)},_=b=>{l||(l=!0,g(),s?.disconnect(),c(b))},y=b=>{l||(l=!0,g(),s?.disconnect(),u(b))},C=async()=>{try{if(!s)return;await X(s,this.encryptor,n.signal);let b="token"in e?{username:e.username,token:e.token}:{username:e.username,password:e.password},O=this.encryptor.encode({action:"login",args:b});s.emit("message",O)}catch(b){if(l)return;_(new a({category:n.signal.aborted?r?"login_timeout":"aborted":"transport_error",phase:"transport_connecting",retryable:!0,message:n.signal.aborted?r?"Login timed out":"Login cancelled":b instanceof Error?`Login handshake failed: ${b.message}`:"Login handshake failed",cause:b}))}},v=b=>{try{let O=this.encryptor.decode(b);if(O.action!=="login")return;let h=O.args;if(!h.success){this.loginMessage=h.message??null;let P=h.message??"Login failed",q=/password|credential|incorrect|invalid login/i.test(P);_(new a({category:q?"invalid_credentials":"login_rejected",phase:"transport_connecting",retryable:!1,message:P}));return}let w=(h.worlds??[]).map(P=>({name:P.name,population:P.population})),S=(h.worlds??[]).filter(P=>P.buddies).map(P=>P.name);y({servers:w,key:h.key,username:h.username,moderator:!1,buddyWorlds:S})}catch(O){_(new a({category:"transport_error",phase:"transport_connecting",retryable:!0,message:"Invalid login response",cause:O}))}},p=b=>{_(new a({category:"transport_error",phase:"transport_connecting",retryable:!0,message:`Login connection failed: ${b.message}`,cause:b}))},f=b=>{_(new a({category:"transport_error",phase:"transport_connecting",retryable:!0,message:`Login connection closed unexpectedly${b?`: ${b}`:""}`}))},k=()=>{_(new a({category:r?"login_timeout":"aborted",phase:"transport_connecting",retryable:!0,message:r?"Login timed out":"Login cancelled"}))};s?.on("connect",C),s?.on("message",v),s?.on("connect_error",p),s?.on("disconnect",f),n.signal.addEventListener("abort",k,{once:!0})})}catch(d){throw d instanceof a?d:n.signal.aborted?new a({category:r?"login_timeout":"aborted",phase:"transport_connecting",retryable:!0,message:r?"Login timed out":"Login cancelled",cause:d}):new a({category:"transport_error",phase:"transport_connecting",retryable:!0,message:d instanceof Error?d.message:"Login failed",cause:d})}finally{clearTimeout(o),t?.signal?.removeEventListener("abort",i)}}async connect(e,t,n){this.worlds||await this.loadWorlds(n?.signal);let r=this.worlds?.[e];if(!r)throw new Error(`World config not found for: ${e}`);this.encryptor=new R,this.reportLifecycle(n,"transport_connecting");let i=this.createSocket(r.host,r.path);this.socket=i;let o=this.connectionTimeouts(n),s=new AbortController,d=c=>{try{let l=this.encryptor.decode(c),g=l.action;if(typeof g!="string"||g==="game_auth"||g==="wait_queue_update")return;n?.onMessage?.({action:g,args:l.args??{}})}catch{}},u=c=>{n?.onDisconnect?.(c??null)};return i.on("message",d),i.on("disconnect",u),await new Promise((c,l)=>{let g=!1,_,y="transport_connecting",C=()=>{_!==void 0&&clearTimeout(_),i.off("connect",k),i.off("message",b),i.off("connect_error",O),i.off("disconnect",h),n?.signal?.removeEventListener("abort",w)},v=S=>{g||(g=!0,C(),s.abort(),i.off("message",d),i.off("disconnect",u),i.disconnect(),this.socket=null,l(S))},p=()=>{g||(g=!0,C(),c())},f=(S,P,q,$)=>{_!==void 0&&clearTimeout(_),_=setTimeout(()=>{v(new a({category:P,phase:q,retryable:!0,message:$}))},S)},k=async()=>{y="authenticating",this.reportLifecycle(n,"authenticating"),f(o.authenticationMs,"auth_timeout","authenticating","Game authentication timed out");try{if(await X(i,this.encryptor,s.signal),g)return;let S=this.encryptor.encode({action:"game_auth",args:{username:t.username,key:t.key,createToken:!1}});i.emit("message",S)}catch(S){if(g)return;v(new a({category:"transport_error",phase:"authenticating",retryable:!0,message:S instanceof Error?`Game handshake failed: ${S.message}`:"Game handshake failed",cause:S}))}},b=S=>{try{let P=this.encryptor.decode(S);switch(P.action){case"wait_queue_update":{let q=P.args;y="queueing",this.reportLifecycle(n,"queueing",q),n?.onQueueUpdate?.(q),f(o.queueMs,"queue_timeout","queueing","Game server queue stopped responding");break}case"game_auth":{if(!P.args.success){v(new a({category:"auth_failed",phase:"authenticating",retryable:!0,message:"Game authentication failed"}));return}this.reportLifecycle(n,"joining_session");let $=this.encryptor.encode({action:"join_server",args:{}});i.emit("message",$),p();break}}}catch{}},O=S=>{v(new a({category:"transport_error",phase:"transport_connecting",retryable:!0,message:`Game connection failed: ${S.message}`,cause:S}))},h=S=>{v(new a({category:"transport_error",phase:y,retryable:!0,message:`Disconnected before game authentication${S?`: ${S}`:""}`}))},w=()=>{v(new a({category:"aborted",phase:y,retryable:!0,message:"Game connection cancelled"}))};if(n?.signal?.aborted){w();return}i.on("connect",k),i.on("message",b),i.on("connect_error",O),i.on("disconnect",h),n?.signal?.addEventListener("abort",w,{once:!0}),f(o.transportMs,"transport_error","transport_connecting","Game transport connection timed out")}),Oe(i,this.encryptor)}send(e,t){if(!this.socket)throw new Error("Not connected");let n=this.encryptor.encode({action:e,args:t});this.socket.emit("message",n)}disconnect(){this.socket?.disconnect(),this.socket=null}normalizeUser(e){return{...this.extractAppearance(e),id:e.id,username:e.username,displayName:e.nickname,x:e.x??0,y:e.y??0,frame:e.frame??0,meta:{nickname:e.nickname,registrationDate:e.registrationDate,customNameColor:e.customNameColor,customBubbleColor:e.customBubbleColor,customBubbleTextColor:e.customBubbleTextColor,wallHacks:e.wallHacks,moderator:e.moderator,character:e.character,approved:e.approved,walking:e.walking},_raw:e}}normalizePlayer(e){let t=e.user;return{...this.normalizeUser(t),_raw:e,coins:e.coins??0,rank:e.rank??0,inventory:e.inventory??[],buddies:e.buddies??[],ignores:e.ignores??[],furniture:e.furniture,flooring:e.floorings??[],igloos:e.igloos??[]}}sendMessage(e){this.send("send_message",{message:e})}sendEmote(e){this.send("send_emote",{emote:e})}sendSafe(e){this.send("send_safe",{safe:e})}walk(e,t){this.send("send_position",{x:e,y:t})}sendFrame(e,t){this.send("send_frame",{frame:e,set:t})}snowball(e,t){this.send("snowball",{x:e,y:t})}joinRoom(e,t,n){this.send("join_room",{room:e,x:t??0,y:n??0})}addItem(e){this.send("add_item",{item:e})}equipColor(e){this.send("update_color",{item:e})}equipHead(e){this.send("update_head",{item:e})}equipFace(e){this.send("update_face",{item:e})}equipNeck(e){this.send("update_neck",{item:e})}equipBody(e){this.send("update_body",{item:e})}equipHand(e){this.send("update_hand",{item:e})}equipFeet(e){this.send("update_feet",{item:e})}equipFlag(e){this.send("update_flag",{item:e})}equipPhoto(e){this.send("update_photo",{item:e})}buddyRequest(e){this.send("buddy_request",{id:e})}buddyAccept(e){this.send("buddy_accept",{id:e})}buddyReject(e){this.send("buddy_reject",{id:e})}removeBuddy(e){this.send("remove_buddy",{id:e})}addIgnore(e){this.send("ignore_add",{id:e})}removeIgnore(e){this.send("ignore_remove",{id:e})}getPlayer(e){this.send("get_player",{id:e})}joinIgloo(e,t,n){this.send("join_igloo",{igloo:e,x:t??0,y:n??0})}createSocket(e,t){return Ce(e,{...this.socketIoOptions(e),path:t,transports:["polling","websocket"],reconnection:!1})}async loadWorlds(e){let t=await fetch(V,{headers:this.connectionHeaders(V),signal:e});if(!t.ok)throw new Error(`Failed to fetch crumbs: ${t.status}`);let n=await t.json();this.worlds=n.worlds}};import{io as Se}from"socket.io-client";var Y="https://play.penguinorigins.online",D=class extends M{id="PenguinOrigins";gameToken;async login(e,t){this.resetLoginState(),this.gameToken="token"in e?e.token:void 0;let n=this.createSocket("/world/login/");return await new Promise((i,o)=>{let s=!1,d=setTimeout(()=>{c(new a({category:"login_timeout",phase:"transport_connecting",retryable:!0,message:"Login timed out"}))},t?.timeoutMs??L.loginMs),u=()=>{clearTimeout(d),n.off("connect",g),n.off("message",_),n.off("connect_error",y),n.off("disconnect",C),t?.signal?.removeEventListener("abort",v)},c=p=>{s||(s=!0,u(),n.disconnect(),o(p))},l=p=>{s||(s=!0,u(),n.disconnect(),i(p))},g=()=>{let p="token"in e?"token_login":"login",f="token"in e?{username:e.username,token:e.token}:{username:e.username,password:e.password};n.emit("message",{action:p,args:f})},_=p=>{if(p.action!=="login")return;let f=p.args;if(!f.success){this.loginMessage=f.message??null;let b=f.message??"Login failed",O=/password|credential|incorrect|invalid login|not found/i.test(b);c(new a({category:O?"invalid_credentials":"login_rejected",phase:"transport_connecting",retryable:!1,message:b}));return}let k=Object.entries(f.populations).map(([b,O])=>({name:b,population:O}));l({servers:k,key:f.key,username:f.username,moderator:!1,buddyWorlds:[]})},y=p=>{c(new a({category:"transport_error",phase:"transport_connecting",retryable:!0,message:`Login connection failed: ${p.message}`,cause:p}))},C=p=>{c(new a({category:"transport_error",phase:"transport_connecting",retryable:!0,message:`Login connection closed unexpectedly${p?`: ${p}`:""}`}))},v=()=>{c(new a({category:"aborted",phase:"transport_connecting",retryable:!0,message:"Login cancelled"}))};if(t?.signal?.aborted){v();return}n.on("connect",g),n.on("message",_),n.on("connect_error",y),n.on("disconnect",C),t?.signal?.addEventListener("abort",v,{once:!0})})}async connect(e,t,n){this.reportLifecycle(n,"transport_connecting");let r=this.createSocket(`/world/${e.toLowerCase()}/`);this.socket=r;let i=this.connectionTimeouts(n),o=d=>{d.action==="game_auth"||d.action==="wait_queue_update"||n?.onMessage?.(d)},s=d=>{n?.onDisconnect?.(d??null)};return r.on("message",o),r.on("disconnect",s),await new Promise((d,u)=>{let c=!1,l,g="transport_connecting",_=()=>{l!==void 0&&clearTimeout(l),r.off("connect",p),r.off("message",f),r.off("connect_error",k),r.off("disconnect",b),n?.signal?.removeEventListener("abort",O)},y=h=>{c||(c=!0,_(),r.off("message",o),r.off("disconnect",s),r.disconnect(),this.socket=null,u(h))},C=()=>{c||(c=!0,_(),d())},v=(h,w,S,P)=>{l!==void 0&&clearTimeout(l),l=setTimeout(()=>{y(new a({category:w,phase:S,retryable:!0,message:P}))},h)},p=()=>{g="authenticating",this.reportLifecycle(n,"authenticating"),v(i.authenticationMs,"auth_timeout","authenticating","Game authentication timed out"),r.emit("message",{action:"game_auth",args:{username:t.username,key:t.key,createToken:!0,...this.gameToken?{token:this.gameToken}:{}}})},f=h=>{switch(h.action){case"wait_queue_update":{let w=h.args;g="queueing",this.reportLifecycle(n,"queueing",w),n?.onQueueUpdate?.(w),v(i.queueMs,"queue_timeout","queueing","Game server queue stopped responding");break}case"game_auth":{if(!h.args.success){y(new a({category:"auth_failed",phase:"authenticating",retryable:!0,message:"Game authentication failed"}));return}this.reportLifecycle(n,"joining_session"),r.emit("message",{action:"join_server",args:{}}),C();break}}},k=h=>{y(new a({category:"transport_error",phase:"transport_connecting",retryable:!0,message:`Game connection failed: ${h.message}`,cause:h}))},b=h=>{y(new a({category:"transport_error",phase:g,retryable:!0,message:`Disconnected before game authentication${h?`: ${h}`:""}`}))},O=()=>{y(new a({category:"aborted",phase:g,retryable:!0,message:"Game connection cancelled"}))};if(n?.signal?.aborted){O();return}r.on("connect",p),r.on("message",f),r.on("connect_error",k),r.on("disconnect",b),n?.signal?.addEventListener("abort",O,{once:!0}),v(i.transportMs,"transport_error","transport_connecting","Game transport connection timed out")}),r}send(e,t){if(!this.socket)throw new Error("Not connected");this.socket.emit("message",{action:e,args:t})}disconnect(){this.socket?.disconnect(),this.socket=null}normalizeUser(e){return{...this.extractAppearance(e),id:e.id,username:e.username,displayName:e.nickname??e.username,joinTime:e.joinTime,x:e.x??0,y:e.y??0,frame:e.frame??0,meta:{toy:e.toy},_raw:e}}normalizePlayer(e){let t=e.user,n=this.normalizeUser(t);return{...n,_raw:e,coins:e.coins??0,rank:e.rank??0,inventory:e.inventory??[],furniture:e.furniture??[],flooring:e.flooring??[],buddies:e.buddies??[],buddyRequests:e.buddyRequests??[],ignores:e.ignores??[],igloos:e.igloos??[],meta:{...n.meta,postcards:e.postcards,mascots:e.mascots,pets:e.pets}}}sendMessage(e){this.send("send_message",{message:e})}sendEmote(e){this.send("send_emote",{emote:e})}sendSafe(e){this.send("send_safe",{safe:e})}walk(e,t){this.send("send_position",{x:e,y:t})}sendFrame(e,t){this.send("send_frame",{frame:e,set:t??!1})}snowball(e,t){this.send("snowball",{x:e,y:t})}equipToy(e){this.send("equip_toy",{toy:e})}joinRoom(e,t,n){this.send("join_room",{room:e,x:t??0,y:n??0})}addItem(e){this.send("add_item",{item:e})}equipColor(e){this.send("update_player",{item:e})}equipHead(e){this.send("update_player",{item:e})}equipFace(e){this.send("update_player",{item:e})}equipNeck(e){this.send("update_player",{item:e})}equipBody(e){this.send("update_player",{item:e})}equipHand(e){this.send("update_player",{item:e})}equipFeet(e){this.send("update_player",{item:e})}equipFlag(e){this.send("update_player",{item:e})}equipPhoto(e){this.send("update_player",{item:e})}buddyRequest(e){this.send("buddy_request",{id:e})}buddyAccept(e){this.send("buddy_accept",{id:e})}addIgnore(e){this.send("ignore_add",{id:e})}removeIgnore(e){this.send("ignore_remove",{id:e})}getIglooOpen(e){this.send("get_igloo_open",{igloo:e})}joinIgloo(e,t,n){this.send("join_igloo",{igloo:e,x:t??0,y:n??0})}gameOver(e){this.send("game_over",{coins:e})}createSocket(e){return Se(Y,{...this.socketIoOptions(Y),path:e,transports:["polling","websocket"],reconnection:!1})}};var Pe={CPPSlol:E,CPJourney:A,CPLegacy:x,NewCP:F,PenguinOrigins:D};function Z(m,e){return new Pe[m](j(e))}var I=class{constructor(e,t){this.adapter=e;this.request=t}adapter;request;getNinja(e){return this.request("get_ninja",()=>this.adapter.getNinja(),e)}getMats(e){return this.request("get_waddles",()=>this.adapter.getMats(),e)}joinMat(e){this.adapter.joinMat(e)}joinMatchmaking(e){return this.request("join_matchmaking",()=>this.adapter.joinMatchmaking(),e)}leaveMatchmaking(){this.adapter.leaveMatchmaking()}startGame(e){return this.request("start_game",()=>this.adapter.startGame(),e)}selectCard(e,t){return this.request("move_my_card",()=>this.adapter.selectCard(e),t,n=>n.slot===e)}loadAnimation(e){this.adapter.loadAnimation(e)}};var T=class{constructor(e,t){this.baseAdapter=e;this.request=t}baseAdapter;request;get adapter(){if(this.baseAdapter instanceof E)return this.baseAdapter;throw new a({category:"unsupported_operation",phase:"ready",retryable:!1,message:`${this.baseAdapter.id} does not support CPPS.lol actions`})}sendPackedEmote(e,t){this.adapter.sendPackedEmote(e,t)}updateLayeredPlayer(e){this.adapter.updateLayeredPlayer(e)}acceptMature(){this.adapter.acceptMature()}removeInventory(e,t){return this.request("remove_inventory",()=>this.adapter.removeInventory(e),t,n=>Number(n.id)===e)}getSnowflakeState(e){return this.request("snowflake_state",()=>this.adapter.getSnowflakeState(),e)}getPets(e,t){return this.request("get_pets",()=>this.adapter.getPets(e),t,n=>n.userId===void 0||n.userId===e)}getIglooContest(e){return this.request("igloo_contest",()=>this.adapter.getIglooContest(),e)}getIglooLikes(e,t){return this.request("igloo_likes",()=>this.adapter.getIglooLikesFor(e),t,n=>n.iglooId===e)}likeIgloo(e,t){return this.request("igloo_likes",()=>this.adapter.likeIglooById(e),t,n=>n.iglooId===e)}openIgloo(){this.adapter.openIglooRaw()}sendMail(e,t){this.adapter.sendMail(e,t)}marryRequest(e){this.adapter.marryRequest(e)}leaveWaddle(){this.adapter.leaveWaddle()}};var Me=new Set(["load_player","join_room","add_player","remove_player","send_position","send_frame","update_player","kick","close_with_error","send_message","send_emote","cpj_ping","open_sprite","close_sprite","set_weather","server_error","error","stamp_earned","game_over","join_game_room","get_ninja","get_waddles","update_waddle","join_matchmaking","tick_matchmaking","start_game","set_cards","add_enemy_cards","start_round","enable_cards","remove_card","move_my_card","card_effect","round_over","play_animation","game_won","get_player","buddy_request","buddy_accept","buddy_reject","buddy_request_seen","get_buddy","buddy_find","send_postcard","stamps_result","ignore_add","ignore_remove","add_item","get_postcards","get_igloo_open","get_igloos","get_igloo_likes","join_igloo","get_puffles","get_all_puffles","get_wellbeing","get_walking_puffle","update_wellbeing","puffle_levelup","puffle_popup","buy_puffle_item","walk_puffle","backyard_supplies","receive_postcard","get_store_music","add_music","get_igloostore_items","add_furniture","update_music","igloo_open_status","igloo_bounds_status","igloo_liked","get_mascots","wait_queue_update","slot","snowball","equip_toy","send_safe","stop_walking","update_table","transform_player","adopt_puffle","info","queue_server_join","disconnect","unknown_packet","remove_inventory","snowflake_state","get_pets","igloo_contest","igloo_likes","marry_request"]),G=class extends Le{player=null;room=null;users=new Map;connected=!1;adapter;loginResult=null;log=null;_cardJitsu=null;_cppslol=null;intentionalDisconnect=!1;disconnectNotified=!1;connectionFailure=null;lifecycleReporter;requestTails=new Map;disconnectEpoch=0;lastDisconnectInfo=null;get loginMessage(){return this.adapter.loginMessage}get loginStatus(){return this.adapter.loginStatus}get cardJitsu(){return this._cardJitsu||(this._cardJitsu=new I(this.adapter,this.request.bind(this))),this._cardJitsu}get cppslol(){return this._cppslol||(this._cppslol=new T(this.adapter,this.request.bind(this))),this._cppslol}constructor(e,t){super(),this.adapter=Z(e,t?.connectionProfile),t?.debug&&(this.log=typeof t.debug=="function"?t.debug:console.log.bind(console))}async login(e,t){this.log?.("[login] logging in as",e.username),this.loginResult=null;let n=await this.adapter.login(e,t);return this.loginResult=n,this.log?.("[login] success \u2014",n.servers.length,"servers"),n.servers}async connect(e,t){if(!this.loginResult)throw new Error("Must call login() first");this.log?.("[connect] joining",e),this.intentionalDisconnect=!1,this.disconnectNotified=!1,this.connectionFailure=null,this.lastDisconnectInfo=null,this.lifecycleReporter=t?.onLifecycleUpdate;let n={...t,onQueueUpdate:r=>{this.log?.("[queue]",`#${r.position}/${r.queueLength}`),this.emit("wait_queue_update",r),t?.onQueueUpdate?.(r)},onMessage:r=>{this.handleMessage(r)},onDisconnect:r=>{this.handleAdapterDisconnect(r)}};try{await this.adapter.connect(e,this.loginResult,n),this.reportLifecycle("awaiting_initial_state"),await this.waitForInitialState(n),this.connected=!0,this.connectionFailure=null,this.reportLifecycle("ready")}catch(r){let i=r instanceof a?r:new a({category:"transport_error",phase:"transport_connecting",retryable:!0,message:r instanceof Error?r.message:"Connection failed",cause:r});throw this.intentionalDisconnect=!1,this.adapter.disconnect(),this.cleanup(),this.disconnectNotified||(this.disconnectNotified=!0,this.disconnectEpoch+=1,this.lastDisconnectInfo={intentional:!1,reason:i.message,occurredAt:Date.now()},this.reportLifecycle("disconnected")),i}}waitForInitialState(e){let t=e.timeouts?.initialStateMs??L.initialStateMs;return new Promise((n,r)=>{let i=!1,o,s=()=>{o!==void 0&&clearTimeout(o),this.off("load_player",l),this.off("join_room",l),this.off("kick",g),this.off("close_with_error",_),this.off("server_error",y),this.off("disconnect",C),e.signal?.removeEventListener("abort",v)},d=()=>{i||(i=!0,s(),n())},u=p=>{i||(i=!0,s(),r(p))},c=()=>{if(this.connectionFailure){u(this.connectionFailure);return}this.player!==null&&this.room!==null&&d()},l=()=>c(),g=({reason:p})=>{u(new a({category:"kicked",phase:"awaiting_initial_state",retryable:!0,message:`Kicked before initial state: ${p??"unknown"}`}))},_=({error:p})=>{u(new a({category:"kicked",phase:"awaiting_initial_state",retryable:!0,message:`Connection closed before initial state: ${p??"unknown"}`}))},y=({error:p})=>{u(new a({category:"server_error",phase:"awaiting_initial_state",retryable:!0,message:`Server error before initial state: ${String(p)}`}))},C=p=>{u(new a({category:"disconnected",phase:"awaiting_initial_state",retryable:!p.intentional,message:`Disconnected before initial state${p.reason?`: ${p.reason}`:""}`}))},v=()=>{u(new a({category:"aborted",phase:"awaiting_initial_state",retryable:!0,message:"Initial state wait cancelled"}))};if(this.on("load_player",l),this.on("join_room",l),this.on("kick",g),this.on("close_with_error",_),this.on("server_error",y),this.on("disconnect",C),e.signal?.addEventListener("abort",v,{once:!0}),e.signal?.aborted){v();return}c(),!i&&(o=setTimeout(()=>{u(new a({category:"initial_state_timeout",phase:"awaiting_initial_state",retryable:!0,message:"Waiting for initial player and room state timed out"}))},t))})}on(e,t){return super.on(e,t)}off(e,t){return super.off(e,t)}once(e,t){return super.once(e,t)}emit(e,...t){return super.emit(e,...t)}waitFor(e,t){return this.waitForEvent(e,t)}waitForEvent(e,t,n,r,i){let o=typeof t=="number"?{timeoutMs:t}:t,s=o?.timeoutMs??L.requestMs;return new Promise((d,u)=>{let c=!1,l,g=()=>{l!==void 0&&clearTimeout(l),this.off(e,_),this.off("disconnect",C),i&&this.off("server_error",p),o?.signal?.removeEventListener("abort",v)},_=(f=>{c||r&&!r(f)||(c=!0,g(),d(f))}),y=f=>{c||(c=!0,g(),u(f))},C=f=>{y(new a({category:"disconnected",phase:"ready",retryable:!f?.intentional,message:`Disconnected while waiting for ${String(e)}${f?.reason?`: ${f.reason}`:""}`}))},v=()=>{y(new a({category:"aborted",phase:"ready",retryable:!0,message:`Cancelled while waiting for ${String(e)}`}))},p=({error:f})=>{y(new a({category:"server_error",phase:"ready",retryable:!1,message:`Server error while waiting for ${String(e)}: ${String(f)}`}))};if(o?.signal?.aborted){v();return}if(Number.isFinite(s)&&(l=setTimeout(()=>{y(new a({category:"operation_timeout",phase:"ready",retryable:!0,message:`Timed out waiting for ${String(e)}`}))},s)),this.on(e,_),this.once("disconnect",C),i&&this.once("server_error",p),o?.signal?.addEventListener("abort",v,{once:!0}),n)try{n()}catch(f){if(f instanceof a){y(f);return}y(new a({category:"transport_error",phase:"ready",retryable:!0,message:`Failed to send request for ${String(e)}`,cause:f}))}})}request(e,t,n,r){let i=this.requestTails.get(e),o=this.disconnectEpoch,s=()=>{},d=new Promise(g=>{s=g}),u=i?i.then(()=>d):d;this.requestTails.set(e,u);let c=this.adapter.rejectRequestsOnServerError;return(i?this.waitForRequestTurn(e,i,o,n?.signal).then(()=>this.waitForEvent(e,n,t,r,c)):this.waitForEvent(e,n,t,r,c)).finally(()=>{s(),u.finally(()=>{this.requestTails.get(e)===u&&this.requestTails.delete(e)})})}waitForRequestTurn(e,t,n,r){let i=()=>new a({category:"aborted",phase:"ready",retryable:!0,message:`Cancelled before sending request for ${String(e)}`});return r?.aborted?Promise.reject(i()):new Promise((o,s)=>{let d=!1,u=()=>{r?.removeEventListener("abort",c)},c=()=>{d||(d=!0,u(),s(i()))};r?.addEventListener("abort",c,{once:!0}),t.then(()=>{if(!d){if(d=!0,u(),this.disconnectEpoch!==n){let l=this.lastDisconnectInfo;s(new a({category:"disconnected",phase:"ready",retryable:!l?.intentional,message:`Disconnected before sending request for ${String(e)}${l?.reason?`: ${l.reason}`:""}`}));return}o()}})})}sendMessage(e){this.adapter.sendMessage(e)}sendEmote(e){this.adapter.sendEmote(e)}sendSafe(e){this.adapter.sendSafe(e)}walk(e,t){this.adapter.walk(e,t)}sendFrame(e,t){this.adapter.sendFrame(e,t)}snowball(e,t){this.adapter.snowball(e,t)}joinRoom(e,t,n,r){return this.request("join_room",()=>this.adapter.joinRoom(e,t,n),r,i=>i.room===e)}addItem(e,t){return this.request("add_item",()=>this.adapter.addItem(e),t,n=>Number(n.item)===e)}equipColor(e){this.adapter.equipColor(e)}equipHead(e){this.adapter.equipHead(e)}equipFace(e){this.adapter.equipFace(e)}equipNeck(e){this.adapter.equipNeck(e)}equipBody(e){this.adapter.equipBody(e)}equipHand(e){this.adapter.equipHand(e)}equipFeet(e){this.adapter.equipFeet(e)}equipFlag(e){this.adapter.equipFlag(e)}equipPhoto(e){this.adapter.equipPhoto(e)}buddyRequest(e){this.adapter.buddyRequest(e)}buddyAccept(e,t){return this.request("buddy_accept",()=>this.adapter.buddyAccept(e),t,n=>n.id===e)}buddyReject(e,t){return this.request("buddy_reject",()=>this.adapter.buddyReject(e),t,n=>n.id===e)}buddyRequestSeen(e,t){return this.request("buddy_request_seen",()=>this.adapter.buddyRequestSeen(e),t,n=>n.id===e)}getBuddy(e,t,n){return this.request("get_buddy",()=>this.adapter.getBuddy(e,t),n,r=>r.id===e&&r.type===t)}findBuddy(e,t){return this.request("buddy_find",()=>this.adapter.findBuddy(e),t)}removeBuddy(e){this.adapter.removeBuddy(e)}addIgnore(e,t){return this.request("ignore_add",()=>this.adapter.addIgnore(e),t,n=>n.id===e)}removeIgnore(e,t){return this.request("ignore_remove",()=>this.adapter.removeIgnore(e),t,n=>n.id===e)}getPlayer(e,t){return this.request("get_player",()=>this.adapter.getPlayer(e),t,n=>n.user.id===e)}getAllSlots(e){return this.request("slot",()=>this.adapter.getAllSlots(),e)}getMascots(e){return this.request("get_mascots",()=>this.adapter.getMascots(),e)}sendPostcard(e,t,n){return this.request("send_postcard",()=>this.adapter.sendPostcard(e,t),n)}getStamps(e,t){return this.request("stamps_result",()=>this.adapter.getStamps(e),t)}getPostcards(e){return this.request("get_postcards",()=>this.adapter.getPostcards(),e)}getIglooOpen(e,t){return this.request("get_igloo_open",()=>this.adapter.getIglooOpen(e),t)}getIgloos(e){return this.request("get_igloos",()=>this.adapter.getIgloos(),e)}getPuffles(e,t){return this.request("get_puffles",()=>this.adapter.getPuffles(e,t?.isBackyard),t,n=>n.userId===e)}getAllPuffles(e){return this.request("get_all_puffles",()=>this.adapter.getAllPuffles(),e)}getPuffleWellbeing(e,t){return this.request("get_wellbeing",()=>this.adapter.getPuffleWellbeing(e),t,n=>n.puffleId===e)}playPuffle(e){this.adapter.playPuffle(e)}restPuffle(e){this.adapter.restPuffle(e)}buyPuffleItem(e,t,n){return this.request("buy_puffle_item",()=>this.adapter.buyPuffleItem(e,t),n,r=>r.puffleId===e&&r.item===t)}walkPuffle(e,t){return this.request("get_walking_puffle",()=>this.adapter.walkPuffle(e),t,n=>n.puffle.id===e)}initializePuffleTower(){this.adapter.initializePuffleTower()}getBackyardSupplies(e){return this.request("backyard_supplies",()=>this.adapter.getBackyardSupplies(),e)}adoptPuffle(e,t,n){return this.request("adopt_puffle",()=>this.adapter.adoptPuffle(e,t),n)}getIglooLikes(e){return this.request("get_igloo_likes",()=>this.adapter.getIglooLikes(),e)}checkPuffleSprite(e){this.adapter.checkPuffleSprite(e)}joinIgloo(e,t,n,r){return this.request("join_igloo",()=>this.adapter.joinIgloo(e,t,n),r,i=>i.igloo===e)}getStoreMusic(e){return this.request("get_store_music",()=>this.adapter.getStoreMusic(),e)}buyMusic(e,t){return this.request("add_music",()=>this.adapter.buyMusic(e),t,n=>n.music===e)}getIglooStoreItems(e){return this.request("get_igloostore_items",()=>this.adapter.getIglooStoreItems(),e)}buyFurniture(e,t=1,n){return this.request("add_furniture",()=>this.adapter.buyFurniture(e,t),n,r=>r.furniture===e&&r.amount===t)}updateIglooMusic(e,t){return this.request("update_music",()=>this.adapter.updateIglooMusic(e),t,n=>n.music===e)}updateIglooFurniture(e){this.adapter.updateIglooFurniture(e)}autoUpdateIglooFurniture(e){this.adapter.autoUpdateIglooFurniture(e)}updateIglooType(e){this.adapter.updateIglooType(e)}openIgloo(e){return this.request("igloo_open_status",()=>this.adapter.openIgloo(),e)}closeIglooBounds(e){return this.request("igloo_bounds_status",()=>this.adapter.closeIglooBounds(),e)}likeIgloo(e){return this.request("igloo_liked",()=>this.adapter.likeIgloo(),e)}openIglooEditor(){this.adapter.openIglooEditor()}closeIglooEditor(){this.adapter.closeIglooEditor()}gameOver(e,t){return this.request("game_over",()=>this.adapter.gameOver(e),t)}collectStamp(e,t){return this.request("stamp_earned",()=>this.adapter.collectStamp(e),t)}sleep(e){return new Promise(t=>setTimeout(t,e))}disconnect(){this.log?.("[disconnect] closing connection"),this.intentionalDisconnect=!0,this.reportLifecycle("disconnecting"),this.adapter.disconnect(),this.handleAdapterDisconnect("client disconnect")}reportLifecycle(e){this.lifecycleReporter?.({phase:e,occurredAt:Date.now()})}handleAdapterDisconnect(e){if(this.disconnectNotified)return;this.disconnectNotified=!0;let t={intentional:this.intentionalDisconnect,reason:e,occurredAt:Date.now()};this.disconnectEpoch+=1,this.lastDisconnectInfo=t,!t.intentional&&!this.connected&&(this.connectionFailure=new a({category:"disconnected",phase:"awaiting_initial_state",retryable:!0,message:`Disconnected before initial state${e?`: ${e}`:""}`})),this.log?.("[disconnect]",t.intentional?"connection closed":"connection lost",e??""),this.cleanup(),this.reportLifecycle("disconnected"),this.emit("disconnect",t)}cleanup(){this.connected=!1,this.player=null,this.room=null,this.users.clear()}handleMessage(e){let{action:t,args:n}=e,r=n;switch(t){case"load_player":{let o=this.adapter.normalizePlayer(n);this.player=o,r={user:o},this.log?.("[load_player]",o.username,`id=${o.id}`,`coins=${o.coins}`,`inventory=${o.inventory.length}`);break}case"join_room":{let o=n.room,s=n.users;this.room=o,this.users.clear();let d=[];for(let u of s){let c=this.adapter.normalizeUser(u);this.users.set(c.id,c),d.push(c)}r={room:o,users:d},this.log?.("[join_room]",`room=${o}`,`users=${d.length}`);break}case"add_player":{let o=this.adapter.normalizeUser(n.user);this.users.set(o.id,o),r={user:o},this.log?.("[add_player]",o.username,`id=${o.id}`);break}case"remove_player":{let o=n.user;this.users.delete(o),this.log?.("[remove_player]",`id=${o}`);break}case"send_position":{let o=n.id,s=this.users.get(o);s&&(s.x=n.x,s.y=n.y);break}case"send_frame":{let o=n.id,s=this.users.get(o);s&&(s.frame=n.frame);break}case"join_igloo":{let o=n.igloo,s=n.users;this.room=o,this.users.clear();let d=[];for(let u of s){let c=this.adapter.normalizeUser(u);this.users.set(c.id,c),d.push(c)}r={...n,users:d},this.log?.("[join_igloo]",`igloo=${o}`,`users=${d.length}`);break}case"update_player":{let o=n.id,s=n.slot,d=Number(n.item),u=l=>{s in l?l[s]=d:(s in l.meta||this.adapter.id==="CPPS.lol")&&(l.meta[s]=d)},c=this.users.get(o);c&&u(c),this.player?.id===o&&this.player!==c&&u(this.player);break}case"walk_puffle":{let o=n.user,s=this.users.get(o);s&&(s.walking=n.puffle,s.meta.walkingPuffleType=n.type);break}case"stop_walking":{let o=n.user,s=this.users.get(o);s&&(s.walking=0,s.meta.walkingPuffleType=void 0);break}case"igloo_open_status":{let o=n.status;if(this.player){this.player.meta.iglooOpen=o;let s=this.users.get(this.player.id);s&&(s.meta.iglooOpen=o)}break}case"igloo_bounds_status":{let o=n.status;if(this.player){this.player.meta.iglooBounds=o;let s=this.users.get(this.player.id);s&&(s.meta.iglooBounds=o)}break}case"transform_player":{let o=n.id,s=n.transform,d=this.users.get(o);d&&(d.meta.transform=s),this.player?.id===o&&this.player!==d&&(this.player.meta.transform=s);break}case"remove_inventory":{if(this.adapter.id!=="CPPS.lol"||!this.player)break;let o=Number(n.id);Number.isFinite(o)&&(this.player.inventory=this.player.inventory.filter(s=>s!==o));break}case"add_item":{if(this.adapter.id!=="CPJourney"&&this.adapter.id!=="CPPS.lol")break;let o=n.coins;this.player&&typeof o=="number"&&(this.player.coins=o);let s=Number(n.item);this.player&&Number.isFinite(s)&&!this.player.inventory.includes(s)&&this.player.inventory.push(s);break}case"add_furniture":case"add_music":case"adopt_puffle":case"buy_puffle_item":case"game_over":{if(this.adapter.id!=="CPJourney")break;let o=n.coins;this.player&&typeof o=="number"&&(this.player.coins=o);break}case"kick":{let o=n.reason??"unknown";this.log?.("[kick]",o),this.connected||(this.connectionFailure=new a({category:"kicked",phase:"awaiting_initial_state",retryable:!0,message:`Kicked before initial state: ${o}`})),this.cleanup();break}case"close_with_error":{let o=n.error??"unknown";this.log?.("[kick]",o),this.connected||(this.connectionFailure=new a({category:"kicked",phase:"awaiting_initial_state",retryable:!0,message:`Connection closed before initial state: ${o}`})),this.cleanup();break}case"error":{let o=n.error??"unknown";this.connected||(this.connectionFailure=new a({category:"server_error",phase:"awaiting_initial_state",retryable:!0,message:`Server error before initial state: ${String(o)}`}));break}default:{Me.has(t)||(this.log?.("[unknown_packet]",t,JSON.stringify(n)),this.emit("unknown_packet",{action:t,args:n}));break}}let i=t==="error"?"server_error":t;this.emit(i,r)}};export{M as BaseAdapter,I as CardJitsu,G as Client,a as ClientOperationError,T as Cppslol,L as DEFAULT_CLIENT_CONNECTION_TIMEOUTS,z as sanitizeClientErrorMessage};
1
+ var ee="Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/149.0.0.0 Safari/537.36",te="en-US,en;q=0.9",ne=new Set(["connection","content-length","host","transfer-encoding","upgrade"]);function j(m="chrome"){return typeof m=="string"?{preset:m,headers:{}}:{preset:m.preset??"chrome",userAgent:m.userAgent,acceptLanguage:m.acceptLanguage,origin:m.origin,referer:m.referer,headers:m.headers??{}}}function re(m){let e=m.match(/^[a-z][a-z0-9+.-]*:\/\//i)?m:`https://${m}`;try{let t=new URL(e);return`${t.protocol==="wss:"?"https:":t.protocol==="ws:"?"http:":t.protocol}//${t.host}`}catch{return m.replace(/\/+$/,"")}}function B(m,e){if(m.origin)return m.origin;if(m.preset!=="node")return re(e)}function H(m,e){let t={},n=B(m,e.defaultOrigin),r=m.referer??(m.preset==="node"||!n?void 0:`${n}/`);return m.preset!=="node"&&(t["User-Agent"]=m.userAgent??ee,t["Accept-Language"]=m.acceptLanguage??te),n&&(t.Origin=n),r&&(t.Referer=r),oe({...t,...m.headers,...e.headers})}function oe(m){let e={};for(let[t,n]of Object.entries(m))n!=null&&(se(t)||(e[t]=String(n)));return e}function se(m){let e=m.toLowerCase();return ne.has(e)||e.startsWith("sec-websocket-")}var ie=/\b(password|token|login[_-]?key|confirmation[_-]?key|secret)(["']?\s*[:=]\s*)(["'])([^"']*)\3/gi,ae=/\b(password|token|login[_-]?key|confirmation[_-]?key|secret)(\s*[:=]\s*)([^\s&,;]+)/gi,de=/\b([a-z][a-z\d+.-]*:\/\/)([^\s/@]+)@/gi;function z(m){return m.replace(de,"$1[REDACTED]@").replace(ie,"$1$2$3[REDACTED]$3").replace(ae,"$1$2[REDACTED]").slice(0,500)}var a=class extends Error{category;phase;retryable;constructor(e){super(z(e.message),{cause:e.cause}),this.name="ClientOperationError",this.category=e.category,this.phase=e.phase,this.retryable=e.retryable}};var L={loginMs:2e4,transportMs:2e4,queueMs:3e5,authenticationMs:2e4,initialStateMs:15e3,requestMs:15e3};var M=class{constructor(e=j()){this.connectionProfile=e}connectionProfile;rejectRequestsOnServerError=!1;socket=null;loginMessage=null;loginStatus="active";connectionTimeouts(e){return{...L,...e?.timeouts}}reportLifecycle(e,t,n){e?.onLifecycleUpdate?.({phase:t,occurredAt:Date.now(),...n?{queue:n}:{}})}resetLoginState(){this.loginMessage=null,this.loginStatus="active"}unsupportedOperation(e){return new a({category:"unsupported_operation",phase:"ready",retryable:!1,message:`${this.id} does not support ${e}`})}socketIoOptions(e){let t=this.connectionHeaders(e),n=this.connectionOrigin(e),r={};return Object.keys(t).length>0&&(r.extraHeaders=t),n&&(r.origin=n),(this.connectionProfile.preset!=="node"||n)&&(r.withCredentials=!0),r}webSocketOptions(e){let t=this.connectionHeaders(e),n=this.connectionOrigin(e);return{...Object.keys(t).length>0?{headers:t}:{},...n?{origin:n}:{}}}connectionHeaders(e,t){return H(this.connectionProfile,{defaultOrigin:e,headers:t})}connectionOrigin(e){return B(this.connectionProfile,e)}normalizeUser(e){throw this.unsupportedOperation("normalizeUser")}normalizePlayer(e){throw this.unsupportedOperation("normalizePlayer")}extractAppearance(e){return{color:e.color??0,head:e.head??0,face:e.face??0,neck:e.neck??0,body:e.body??0,hand:e.hand??0,feet:e.feet??0,flag:e.flag??0,photo:e.photo??0}}sendMessage(e){throw this.unsupportedOperation("sendMessage")}sendEmote(e){throw this.unsupportedOperation("sendEmote")}sendSafe(e){throw this.unsupportedOperation("sendSafe")}walk(e,t){throw this.unsupportedOperation("walk")}sendFrame(e,t){throw this.unsupportedOperation("sendFrame")}snowball(e,t){throw this.unsupportedOperation("snowball")}joinRoom(e,t,n){throw this.unsupportedOperation("joinRoom")}addItem(e){throw this.unsupportedOperation("addItem")}equipColor(e){throw this.unsupportedOperation("equipColor")}equipHead(e){throw this.unsupportedOperation("equipHead")}equipFace(e){throw this.unsupportedOperation("equipFace")}equipNeck(e){throw this.unsupportedOperation("equipNeck")}equipBody(e){throw this.unsupportedOperation("equipBody")}equipHand(e){throw this.unsupportedOperation("equipHand")}equipFeet(e){throw this.unsupportedOperation("equipFeet")}equipFlag(e){throw this.unsupportedOperation("equipFlag")}equipPhoto(e){throw this.unsupportedOperation("equipPhoto")}buddyRequest(e){throw this.unsupportedOperation("buddyRequest")}buddyAccept(e){throw this.unsupportedOperation("buddyAccept")}buddyReject(e){throw this.unsupportedOperation("buddyReject")}buddyRequestSeen(e){throw this.unsupportedOperation("buddyRequestSeen")}getBuddy(e,t){throw this.unsupportedOperation("getBuddy")}findBuddy(e){throw this.unsupportedOperation("findBuddy")}removeBuddy(e){throw this.unsupportedOperation("removeBuddy")}addIgnore(e){throw this.unsupportedOperation("addIgnore")}removeIgnore(e){throw this.unsupportedOperation("removeIgnore")}getPlayer(e){throw this.unsupportedOperation("getPlayer")}getAllSlots(){throw this.unsupportedOperation("getAllSlots")}getMascots(){throw this.unsupportedOperation("getMascots")}sendPostcard(e,t){throw this.unsupportedOperation("sendPostcard")}getStamps(e){throw this.unsupportedOperation("getStamps")}getPostcards(){throw this.unsupportedOperation("getPostcards")}getIglooOpen(e){throw this.unsupportedOperation("getIglooOpen")}getIgloos(){throw this.unsupportedOperation("getIgloos")}getPuffles(e,t){throw this.unsupportedOperation("getPuffles")}getAllPuffles(){throw this.unsupportedOperation("getAllPuffles")}getPuffleWellbeing(e){throw this.unsupportedOperation("getPuffleWellbeing")}playPuffle(e){throw this.unsupportedOperation("playPuffle")}restPuffle(e){throw this.unsupportedOperation("restPuffle")}buyPuffleItem(e,t){throw this.unsupportedOperation("buyPuffleItem")}walkPuffle(e){throw this.unsupportedOperation("walkPuffle")}initializePuffleTower(){throw this.unsupportedOperation("initializePuffleTower")}getBackyardSupplies(){throw this.unsupportedOperation("getBackyardSupplies")}adoptPuffle(e,t){throw this.unsupportedOperation("adoptPuffle")}getIglooLikes(){throw this.unsupportedOperation("getIglooLikes")}checkPuffleSprite(e){throw this.unsupportedOperation("checkPuffleSprite")}openSprite(e){throw this.unsupportedOperation("openSprite")}equipToy(e){throw this.unsupportedOperation("equipToy")}joinIgloo(e,t,n){throw this.unsupportedOperation("joinIgloo")}getStoreMusic(){throw this.unsupportedOperation("getStoreMusic")}buyMusic(e){throw this.unsupportedOperation("buyMusic")}getIglooStoreItems(){throw this.unsupportedOperation("getIglooStoreItems")}buyFurniture(e,t){throw this.unsupportedOperation("buyFurniture")}updateIglooMusic(e){throw this.unsupportedOperation("updateIglooMusic")}updateIglooFurniture(e){throw this.unsupportedOperation("updateIglooFurniture")}autoUpdateIglooFurniture(e){throw this.unsupportedOperation("autoUpdateIglooFurniture")}updateIglooType(e){throw this.unsupportedOperation("updateIglooType")}openIgloo(){throw this.unsupportedOperation("openIgloo")}closeIglooBounds(){throw this.unsupportedOperation("closeIglooBounds")}likeIgloo(){throw this.unsupportedOperation("likeIgloo")}openIglooEditor(){throw this.unsupportedOperation("openIglooEditor")}closeIglooEditor(){throw this.unsupportedOperation("closeIglooEditor")}gameOver(e){throw this.unsupportedOperation("gameOver")}collectStamp(e){throw this.unsupportedOperation("collectStamp")}getNinja(){throw this.unsupportedOperation("getNinja")}getMats(){throw this.unsupportedOperation("getMats")}joinMatchmaking(){throw this.unsupportedOperation("joinMatchmaking")}leaveMatchmaking(){throw this.unsupportedOperation("leaveMatchmaking")}startGame(){throw this.unsupportedOperation("startGame")}selectCard(e){throw this.unsupportedOperation("selectCard")}loadAnimation(e){throw this.unsupportedOperation("loadAnimation")}joinMat(e){throw this.unsupportedOperation("joinMat")}};import{EventEmitter as Le}from"events";import{io as ue}from"socket.io-client";import ce from"socket.io-msgpack-parser";var W="wss://play.cpjourney.net",le="skip",pe=new Set(["Penguin not found. Try Again?","Incorrect password. NOTE: Passwords are CaSe SeNsiTIVE"]),A=class extends M{id="CPJourney";rejectRequestsOnServerError=!0;gameToken;async login(e,t){this.resetLoginState(),this.gameToken="token"in e?e.token:void 0;let n=this.createSocket("/world/login/");return await new Promise((i,o)=>{let s=!1,d=setTimeout(()=>{c(new a({category:"login_timeout",phase:"transport_connecting",retryable:!0,message:"Login timed out"}))},t?.timeoutMs??L.loginMs),u=()=>{clearTimeout(d),n.off("connect",g),n.off("message",_),n.off("connect_error",y),n.off("disconnect",C),t?.signal?.removeEventListener("abort",v)},c=p=>{s||(s=!0,u(),n.disconnect(),o(p))},l=p=>{s||(s=!0,u(),n.disconnect(),i(p))},g=()=>{let p=e.secret??le,f="token"in e?{username:e.username,token:e.token,secret:p}:{username:e.username,password:e.password,secret:p};n.emit("message",{action:"login",args:f})},_=p=>{if(p.action!=="login")return;let f=p.args;if(!f.success){this.loginMessage=f.message??null;let b=f.message??"Login failed";f.message?.startsWith("Banned:")&&(this.loginStatus="banned");let O=pe.has(b);c(new a({category:this.loginStatus==="banned"?"account_banned":O?"invalid_credentials":"login_rejected",phase:"transport_connecting",retryable:!1,message:b}));return}let k=Object.entries(f.populations).map(([b,O])=>({name:b,population:O}));l({servers:k,key:f.key,username:f.username,moderator:f.moderator,buddyWorlds:f.buddyWorlds??[],afkServers:f.afkServers})},y=p=>{c(new a({category:"transport_error",phase:"transport_connecting",retryable:!0,message:`Login connection failed: ${p.message}`,cause:p}))},C=p=>{c(new a({category:"transport_error",phase:"transport_connecting",retryable:!0,message:`Login connection closed unexpectedly${p?`: ${p}`:""}`}))},v=()=>{c(new a({category:"aborted",phase:"transport_connecting",retryable:!0,message:"Login cancelled"}))};if(t?.signal?.aborted){v();return}n.on("connect",g),n.on("message",_),n.on("connect_error",y),n.on("disconnect",C),t?.signal?.addEventListener("abort",v,{once:!0})})}async connect(e,t,n){this.reportLifecycle(n,"transport_connecting"),await this.queueForServer(e,n),this.reportLifecycle(n,"transport_connecting");let r=this.createSocket(`/world/${e.toLowerCase()}/`);this.socket=r;let i=this.connectionTimeouts(n),o=d=>{d.action==="game_auth"||d.action==="wait_queue_update"||n?.onMessage?.(d)},s=d=>{n?.onDisconnect?.(d??null)};return r.on("message",o),r.on("disconnect",s),await new Promise((d,u)=>{let c=!1,l,g="transport_connecting",_=()=>{l!==void 0&&clearTimeout(l),r.off("connect",p),r.off("message",f),r.off("connect_error",k),r.off("disconnect",b),n?.signal?.removeEventListener("abort",O)},y=h=>{c||(c=!0,_(),r.off("message",o),r.off("disconnect",s),r.disconnect(),this.socket=null,u(h))},C=()=>{c||(c=!0,_(),d())},v=(h,w,S,P)=>{l!==void 0&&clearTimeout(l),l=setTimeout(()=>{y(new a({category:w,phase:S,retryable:!0,message:P}))},h)},p=()=>{g="authenticating",this.reportLifecycle(n,"authenticating"),v(i.authenticationMs,"auth_timeout","authenticating","Game authentication timed out");let h={username:t.username,key:t.key,createToken:!0,joinInvis:!1,takeoverMascot:!1,...this.gameToken?{token:this.gameToken}:{}};r.emit("message",{action:"game_auth",args:h})},f=h=>{switch(h.action){case"wait_queue_update":{let w=h.args;g="queueing",this.reportLifecycle(n,"queueing",w),n?.onQueueUpdate?.(w),v(i.queueMs,"queue_timeout","queueing","Game server queue stopped responding");break}case"game_auth":{if(!h.args.success){y(new a({category:"auth_failed",phase:"authenticating",retryable:!0,message:"Game authentication failed"}));return}this.reportLifecycle(n,"joining_session"),r.emit("message",{action:"join_server",args:{}}),C();break}}},k=h=>{y(new a({category:"transport_error",phase:"transport_connecting",retryable:!0,message:`Game connection failed: ${h.message}`,cause:h}))},b=h=>{y(new a({category:"transport_error",phase:g,retryable:!0,message:`Disconnected before joining the game${h?`: ${h}`:""}`}))},O=()=>{y(new a({category:"aborted",phase:g,retryable:!0,message:"Game connection cancelled"}))};if(n?.signal?.aborted){O();return}r.on("connect",p),r.on("message",f),r.on("connect_error",k),r.on("disconnect",b),n?.signal?.addEventListener("abort",O,{once:!0}),v(i.transportMs,"transport_error","transport_connecting","Game transport connection timed out")}),r}async queueForServer(e,t){let n=this.createSocket("/world/login/"),r=this.connectionTimeouts(t);this.reportLifecycle(t,"queueing"),await new Promise((i,o)=>{let s=!1,d=!1,u,c=()=>{u!==void 0&&clearTimeout(u),u=setTimeout(()=>{g(new a({category:"queue_timeout",phase:"queueing",retryable:!0,message:"Server queue stopped responding"}))},r.queueMs)},l=()=>{u!==void 0&&clearTimeout(u),n.off("connect",y),n.off("message",C),n.off("disconnect",v),n.off("connect_error",p),t?.signal?.removeEventListener("abort",f)},g=k=>{s||(s=!0,l(),n.disconnect(),o(k))},_=()=>{s||(s=!0,d=!0,l(),n.disconnect(),i())},y=()=>{n.emit("message",{action:"queue_server_join",args:{server:e}})},C=k=>{switch(k.action){case"wait_queue_update":{let b=k.args;this.reportLifecycle(t,"queueing",b),t?.onQueueUpdate?.(b),c();break}case"queue_server_join":{_();break}}},v=k=>{d||g(new a({category:"transport_error",phase:"queueing",retryable:!0,message:`Queue connection closed unexpectedly${k?`: ${k}`:""}`}))},p=k=>{g(new a({category:"transport_error",phase:"queueing",retryable:!0,message:`Queue connection failed: ${k.message}`,cause:k}))},f=()=>{g(new a({category:"aborted",phase:"queueing",retryable:!0,message:"Queue wait cancelled"}))};if(t?.signal?.aborted){f();return}n.on("connect",y),n.on("message",C),n.on("disconnect",v),n.on("connect_error",p),t?.signal?.addEventListener("abort",f,{once:!0}),c()})}send(e,t){if(!this.socket)throw new Error("Not connected");this.socket.emit("message",{action:e,args:t})}disconnect(){this.socket?.disconnect(),this.socket=null}normalizeUser(e){let{id:t,username:n,displayName:r,joinTime:i,x:o,y:s,frame:d,walking:u,color:c,head:l,face:g,neck:_,body:y,hand:C,feet:v,flag:p,photo:f,...k}=e;return{...this.extractAppearance(e),id:t,username:n,displayName:r,joinTime:i,x:o??0,y:s??0,frame:d??0,walking:u,meta:k,_raw:e}}normalizePlayer(e){let t=e.user,n=this.normalizeUser(t),{user:r,coins:i,rank:o,inventory:s,furniture:d,flooring:u,buddies:c,buddyRequests:l,ignores:g,igloos:_,...y}=e;return{...n,_raw:e,coins:i??0,rank:o??0,inventory:s??[],furniture:d??[],flooring:u??[],buddies:t.buddies??[],buddyRequests:t.buddyRequests??[],ignores:t.ignores??[],igloos:_??[],meta:{...n.meta,...y}}}sendMessage(e){this.send("send_message",{message:e})}sendEmote(e){this.send("send_emote",{emote:e})}sendSafe(e){this.send("send_safe",{safe:e})}walk(e,t){this.send("send_position",{x:e,y:t})}sendFrame(e,t){this.send("send_frame",{frame:e,set:t})}snowball(e,t){this.send("snowball",{x:e,y:t})}joinRoom(e,t,n){this.send("join_room",{room:e,x:t??0,y:n??0})}addItem(e){this.send("add_item",{item:e})}equipColor(e){this.send("update_color",{item:e})}equipHead(e){this.send("update_head",{item:e})}equipFace(e){this.send("update_face",{item:e})}equipNeck(e){this.send("update_neck",{item:e})}equipBody(e){this.send("update_body",{item:e})}equipHand(e){this.send("update_hand",{item:e})}equipFeet(e){this.send("update_feet",{item:e})}equipFlag(e){this.send("update_flag",{item:e})}equipPhoto(e){this.send("update_photo",{item:e})}buddyRequest(e){this.send("buddy_request",{id:e})}buddyAccept(e){this.send("buddy_accept",{id:e})}buddyReject(e){this.send("buddy_reject",{id:e})}buddyRequestSeen(e){this.send("buddy_request_seen",{id:e})}getBuddy(e,t){this.send("get_buddy",{id:e,type:t})}findBuddy(e){this.send("buddy_find",{id:e})}removeBuddy(e){this.send("remove_buddy",{id:e})}addIgnore(e){this.send("ignore_add",{id:e})}removeIgnore(e){this.send("ignore_remove",{id:e})}getPlayer(e){this.send("get_player",{id:e})}getAllSlots(){this.send("get_all_slots",{})}getMascots(){this.send("get_mascots",{})}sendPostcard(e,t){this.send("send_postcard",{userId:e,cardId:t})}getStamps(e){this.send("get_stamps",{userId:e})}getPostcards(){this.send("get_postcards",{})}getIglooOpen(e){this.send("get_igloo_open",{igloo:e})}getIgloos(){this.send("get_igloos",{})}getPuffles(e,t){this.send("get_puffles",{userId:e,...t!==void 0?{isBackyard:t}:{}})}getAllPuffles(){this.send("get_all_puffles",{})}getPuffleWellbeing(e){this.send("get_wellbeing",{puffle:e})}playPuffle(e){this.send("puffle_play",{puffle:e})}restPuffle(e){this.send("update_puffle_rest",{puffle:e})}buyPuffleItem(e,t){this.send("puffle_buy_item",{puffleId:e,item:t})}walkPuffle(e){this.send("walk_puffle",{puffle:e})}initializePuffleTower(){this.send("tower_init",{})}getBackyardSupplies(){this.send("backyard_supplies",{})}adoptPuffle(e,t){this.send("adopt_puffle",{type:e,name:t})}getIglooLikes(){this.send("get_igloo_likes",{})}checkPuffleSprite(e){this.send("check_puffle_sprite",{puffleSprite:e})}openSprite(e){this.send("open_sprite",{sprite:e})}joinIgloo(e,t,n){this.send("join_igloo",{igloo:e,x:t??0,y:n??0})}getStoreMusic(){this.send("get_store_music",{})}buyMusic(e){this.send("add_music",{music:e})}getIglooStoreItems(){this.send("get_igloostore_items",{})}buyFurniture(e,t){this.send("add_furniture",{furniture:e,amount:t})}updateIglooMusic(e){this.send("update_music",{music:e})}updateIglooFurniture(e){this.send("update_furniture",{furniture:e})}autoUpdateIglooFurniture(e){this.send("update_furniture_auto",{furniture:e})}updateIglooType(e){this.send("update_igloo",{type:e})}openIgloo(){this.send("open_igloo",{})}closeIglooBounds(){this.send("close_igloo_bounds",{})}likeIgloo(){this.send("like_igloo",{})}openIglooEditor(){this.send("igloo_editor_open",{})}closeIglooEditor(){this.send("igloo_editor_closed",{})}gameOver(e){this.send("game_over",{coins:e})}collectStamp(e){this.send("collect_stamp",{stamp:e})}getNinja(){this.send("get_ninja",{})}getMats(){this.send("get_waddles",{})}joinMatchmaking(){this.send("join_matchmaking",{})}leaveMatchmaking(){this.send("leave_matchmaking",{})}startGame(){this.send("start_game",{})}selectCard(e){this.send("select_card",{slot:e})}loadAnimation(e){this.send("load_animation",{animation:e})}joinMat(e){this.send("join_waddle",{waddle:e})}createSocket(e){return ue(W,{...this.socketIoOptions(W),path:e,parser:ce,transports:["polling","websocket"],reconnection:!1})}};import{io as ge}from"socket.io-client";import me from"socket.io-msgpack-parser";var he="https://api.cplegacy.com/login",fe="https://api.cplegacy.com/token_login",Q="https://play.cplegacy.com";function ve(m){let e=m.on.bind(m);return m.on=((t,n)=>t==="message"?e(t,(r,i)=>{n({action:r,args:i??{}})}):e(t,n)),m}var x=class extends M{id="CPLegacy";version="";async login(e,t){this.resetLoginState();let n="token"in e?fe:he,r="token"in e?{username:e.username,token:e.token}:{username:e.username,password:e.password,version:this.version},i=new AbortController,o=!1,s=()=>i.abort();if(t?.signal?.aborted)throw new a({category:"aborted",phase:"transport_connecting",retryable:!0,message:"Login cancelled"});t?.signal?.addEventListener("abort",s,{once:!0});let d=setTimeout(()=>{o=!0,i.abort()},t?.timeoutMs??L.loginMs),u;try{u=await this.postLogin(n,r,i.signal),!u.success&&u.wantedVersion&&(this.version=u.wantedVersion,r.version=this.version,u=await this.postLogin(n,r,i.signal))}catch(l){throw i.signal.aborted?new a({category:o?"login_timeout":"aborted",phase:"transport_connecting",retryable:!0,message:o?"Login timed out":"Login cancelled",cause:l}):new a({category:"transport_error",phase:"transport_connecting",retryable:!0,message:l instanceof Error?`Login connection failed: ${l.message}`:"Login connection failed",cause:l})}finally{clearTimeout(d),t?.signal?.removeEventListener("abort",s)}if(!u.success){this.loginMessage=u.message??null;let l=u.message??"unknown error",g=/password|credential|incorrect|invalid login/i.test(l);throw new a({category:g?"invalid_credentials":"login_rejected",phase:"transport_connecting",retryable:!1,message:`Login failed: ${l}`})}return{servers:Object.entries(u.populations??{}).map(([l,g])=>({name:l,population:g})),key:u.key,username:u.username,moderator:!1,buddyWorlds:[]}}async connect(e,t,n){this.reportLifecycle(n,"transport_connecting");let r=this.createSocket(e);this.socket=r;let i=this.connectionTimeouts(n),o=(d,u)=>{d==="game_auth"||d==="wait_queue_update"||n?.onMessage?.({action:d,args:u??{}})},s=d=>{n?.onDisconnect?.(d??null)};return r.on("message",o),r.on("disconnect",s),await new Promise((d,u)=>{let c=!1,l,g="transport_connecting",_=()=>{l!==void 0&&clearTimeout(l),r.off("connect",p),r.off("message",f),r.off("connect_error",k),r.off("disconnect",b),n?.signal?.removeEventListener("abort",O)},y=h=>{c||(c=!0,_(),r.off("message",o),r.off("disconnect",s),r.disconnect(),this.socket=null,u(h))},C=()=>{c||(c=!0,_(),d())},v=(h,w,S,P)=>{l!==void 0&&clearTimeout(l),l=setTimeout(()=>{y(new a({category:w,phase:S,retryable:!0,message:P}))},h)},p=()=>{g="authenticating",this.reportLifecycle(n,"authenticating"),v(i.authenticationMs,"auth_timeout","authenticating","Game authentication timed out"),r.emit("message","game_auth",{username:t.username,key:t.key,createToken:!1,token:""})},f=(h,w)=>{switch(h){case"wait_queue_update":{let S=w;g="queueing",this.reportLifecycle(n,"queueing",S),n?.onQueueUpdate?.(S),v(i.queueMs,"queue_timeout","queueing","Game server queue stopped responding");break}case"game_auth":{if(!w.success){y(new a({category:"auth_failed",phase:"authenticating",retryable:!0,message:"Game authentication failed"}));return}this.reportLifecycle(n,"joining_session"),r.emit("message","load_player",{}),r.emit("message","join_server",{}),C();break}}},k=h=>{y(new a({category:"transport_error",phase:"transport_connecting",retryable:!0,message:`Game connection failed: ${h.message}`,cause:h}))},b=h=>{y(new a({category:"transport_error",phase:g,retryable:!0,message:`Disconnected before game authentication${h?`: ${h}`:""}`}))},O=()=>{y(new a({category:"aborted",phase:g,retryable:!0,message:"Game connection cancelled"}))};if(n?.signal?.aborted){O();return}r.on("connect",p),r.on("message",f),r.on("connect_error",k),r.on("disconnect",b),n?.signal?.addEventListener("abort",O,{once:!0}),v(i.transportMs,"transport_error","transport_connecting","Game transport connection timed out")}),ve(r)}send(e,t){if(!this.socket)throw new Error("Not connected");this.socket.emit("message",e,t)}disconnect(){this.socket?.disconnect(),this.socket=null}normalizeUser(e){return{...this.extractAppearance(e),id:e.id,username:e.username,displayName:e.realUsername??e.username,joinTime:e.joinTime,x:e.x??0,y:e.y??0,frame:e.frame??0,walking:e.walking??void 0,meta:{internalUsername:e.username,approved:e.approved,emailVerified:e.emailVerified,safeChat:e.safeChat,tutorial:e.tutorial,loginStreak:e.loginStreak,walkingColor:e.walkingColor,stampbookColor:e.stampbookColor,stampbookClasp:e.stampbookClasp,stampbookPattern:e.stampbookPattern,ninjaPoints:e.ninjaPoints,highestNinjaRank:e.highestNinjaRank,character:e.character,transformed:e.transformed},_raw:e}}normalizePlayer(e){let t=e.user;return{...this.normalizeUser(t),_raw:e,coins:t.coins??0,rank:t.rank??0,inventory:e.inventory??[],furniture:e.furniture,buddies:[],buddyRequests:e.pending?.map(n=>n.id)??[],ignores:[],igloos:e.igloos??[]}}sendMessage(e){this.send("send_message",{message:e})}sendEmote(e){this.send("send_emote",{emote:e})}sendSafe(e){this.send("send_safe",{safe:e})}walk(e,t){this.send("send_position",{x:e,y:t})}sendFrame(e,t){this.send("send_frame",{frame:e,set:t})}snowball(e,t){this.send("snowball",{x:e,y:t})}joinRoom(e,t,n){this.send("join_room",{room:e,x:t??0,y:n??0})}addItem(e){this.send("add_item",{item:e})}equipColor(e){this.send("update_color",{item:e})}equipHead(e){this.send("update_head",{item:e})}equipFace(e){this.send("update_face",{item:e})}equipNeck(e){this.send("update_neck",{item:e})}equipBody(e){this.send("update_body",{item:e})}equipHand(e){this.send("update_hand",{item:e})}equipFeet(e){this.send("update_feet",{item:e})}equipFlag(e){this.send("update_flag",{item:e})}equipPhoto(e){this.send("update_photo",{item:e})}buddyRequest(e){this.send("buddy_request",{id:e})}buddyAccept(e){this.send("buddy_accept",{id:e})}buddyReject(e){this.send("buddy_reject",{id:e})}removeBuddy(e){this.send("remove_buddy",{id:e})}addIgnore(e){this.send("ignore_add",{id:e})}removeIgnore(e){this.send("ignore_remove",{id:e})}getPlayer(e){this.send("get_player",{id:e})}getStamps(e){this.send("get_stamps",{userId:e})}getPostcards(){this.send("get_postcards",{})}joinIgloo(e,t,n){this.send("join_igloo",{igloo:e,x:t??0,y:n??0})}gameOver(e){this.send("game_over",{coins:e})}collectStamp(e){this.send("collect_stamp",{stamp:e})}async postLogin(e,t,n){return(await fetch(e,{method:"POST",headers:this.connectionHeaders(Q,{"Content-Type":"application/json",Accept:"application/json"}),body:JSON.stringify(t),signal:n})).json()}createSocket(e){let t=`wss://${e.toLowerCase()}.server.cplegacy.com`;return ge(t,{...this.socketIoOptions(Q),path:"/socket.io/",parser:me,transports:["websocket"],reconnection:!1})}};import{io as be}from"socket.io-client";import{createHmac as ye}from"crypto";function K(m){if(m===null||typeof m!="object")return JSON.stringify(m)??"null";if(Array.isArray(m))return`[${m.map(K).join(",")}]`;let e=m;return`{${Object.keys(e).sort().map(t=>`${JSON.stringify(t)}:${K(e[t])}`).join(",")}}`}var U=class{constructor(e,t,n=Date.now){this.now=n;if(!/^(?:[0-9a-fA-F]{2})+$/.test(e))throw new Error("CPPS.lol returned an invalid packet key");if(!Number.isFinite(t))throw new Error("CPPS.lol returned an invalid server time");this.key=Buffer.from(e,"hex"),this.clockOffsetMs=t-this.now()}now;sequence=0;clockOffsetMs;key;sign(e,t){let n=++this.sequence,r=this.now()+this.clockOffsetMs,i=`${n}.${r}.${e}.${K(t)}`,o=ye("sha256",this.key).update(i).digest("hex");return{action:e,args:t,seq:n,ts:r,mac:o}}};var J="https://play.cpps.lol",E=class extends M{id="CPPS.lol";signer=null;sessionToken="";async login(e,t){this.resetLoginState(),this.sessionToken="";let n=this.createSocket("/world/login/");return new Promise((r,i)=>{let o=!1,s=setTimeout(()=>{u(new a({category:"login_timeout",phase:"transport_connecting",retryable:!0,message:"Login timed out"}))},t?.timeoutMs??L.loginMs),d=()=>{clearTimeout(s),n.off("connect",l),n.off("message",g),n.off("connect_error",_),n.off("disconnect",y),t?.signal?.removeEventListener("abort",C)},u=v=>{o||(o=!0,this.sessionToken="",d(),n.disconnect(),i(v))},c=v=>{o||(o=!0,d(),n.disconnect(),r(v))},l=()=>{let v="token"in e?"token_login":"login",p="token"in e?{username:e.username,token:e.token}:{username:e.username,password:e.password};n.emit("message",{action:v,args:p})},g=v=>{if(v.action!=="login")return;let p=v.args;if(!p.success){this.loginMessage=p.message??null;let k=p.message??"Login failed",b=/password|credential|incorrect|invalid login/i.test(k);u(new a({category:b?"invalid_credentials":"login_rejected",phase:"transport_connecting",retryable:!1,message:k}));return}let f=Object.entries(p.populations).map(([k,b])=>typeof b=="number"?{name:k,population:b}:{name:k,population:b.bars,users:b.users});this.sessionToken="token"in e?e.token:"",c({servers:f,key:p.key,username:p.username,moderator:!1,buddyWorlds:[]})},_=v=>{u(new a({category:"transport_error",phase:"transport_connecting",retryable:!0,message:`Login connection failed: ${v.message}`,cause:v}))},y=v=>{u(new a({category:"transport_error",phase:"transport_connecting",retryable:!0,message:`Login connection closed unexpectedly${v?`: ${v}`:""}`}))},C=()=>{u(new a({category:"aborted",phase:"transport_connecting",retryable:!0,message:"Login cancelled"}))};if(t?.signal?.aborted){C();return}n.on("connect",l),n.on("message",g),n.on("connect_error",_),n.on("disconnect",y),t?.signal?.addEventListener("abort",C,{once:!0})})}async connect(e,t,n){this.signer=null,this.reportLifecycle(n,"transport_connecting");let r=this.createSocket(`/world/${e.toLowerCase()}/`);this.socket=r;let i=this.connectionTimeouts(n),o=d=>{d.action==="game_auth"||d.action==="wait_queue_update"||n?.onMessage?.(d)},s=d=>{this.signer=null,this.sessionToken="",n?.onDisconnect?.(d??null)};return r.on("message",o),r.on("disconnect",s),await new Promise((d,u)=>{let c=!1,l,g="transport_connecting",_=()=>{l!==void 0&&clearTimeout(l),r.off("connect",p),r.off("message",f),r.off("connect_error",k),r.off("disconnect",b),n?.signal?.removeEventListener("abort",O)},y=h=>{c||(c=!0,_(),r.off("message",o),r.off("disconnect",s),this.signer=null,this.sessionToken="",r.disconnect(),this.socket=null,u(h))},C=()=>{c||(c=!0,_(),d())},v=(h,w,S,P)=>{l!==void 0&&clearTimeout(l),l=setTimeout(()=>{y(new a({category:w,phase:S,retryable:!0,message:P}))},h)},p=()=>{g="authenticating",this.reportLifecycle(n,"authenticating"),v(i.authenticationMs,"auth_timeout","authenticating","Game authentication timed out"),r.emit("message",{action:"game_auth",args:{username:t.username,key:t.key,createToken:!0,token:this.sessionToken}})},f=h=>{switch(h.action){case"wait_queue_update":{let w=h.args;g="queueing",this.reportLifecycle(n,"queueing",w),n?.onQueueUpdate?.(w),v(i.queueMs,"queue_timeout","queueing","Game server queue stopped responding");break}case"game_auth":{let w=h.args;if(!w.success||!w.packetKey||typeof w.serverTime!="number"){y(new a({category:"auth_failed",phase:"authenticating",retryable:!0,message:"Game authentication failed"}));return}try{this.signer=new U(w.packetKey,w.serverTime),this.sessionToken=w.token??this.sessionToken}catch(S){y(new a({category:"auth_failed",phase:"authenticating",retryable:!0,message:"Game authentication returned invalid signing data",cause:S}));return}this.reportLifecycle(n,"joining_session"),r.emit("message",{action:"join_server",args:{}}),C();break}}},k=h=>{y(new a({category:"transport_error",phase:"transport_connecting",retryable:!0,message:`Game connection failed: ${h.message}`,cause:h}))},b=h=>{y(new a({category:"transport_error",phase:g,retryable:!0,message:`Disconnected before game authentication${h?`: ${h}`:""}`}))},O=()=>{y(new a({category:"aborted",phase:g,retryable:!0,message:"Game connection cancelled"}))};if(n?.signal?.aborted){O();return}r.on("connect",p),r.on("message",f),r.on("connect_error",k),r.on("disconnect",b),n?.signal?.addEventListener("abort",O,{once:!0}),v(i.transportMs,"transport_error","transport_connecting","Game transport connection timed out")}),r}send(e,t){if(!this.socket||!this.signer)throw new Error("Not connected or authenticated");this.socket.emit("message",this.signer.sign(e,t))}disconnect(){this.signer=null,this.sessionToken="",this.socket?.disconnect(),this.socket=null}normalizeUser(e){return{...this.extractAppearance(e),id:e.id,username:e.username,displayName:e.nickname??e.displayName??e.username,joinTime:e.joinTime,x:e.x??0,y:e.y??0,frame:e.frame??0,meta:{toy:e.toy,headLayer:e.headLayer,headColor:e.headColor,headLayerColor:e.headLayerColor,faceLayer:e.faceLayer,faceColor:e.faceColor,faceLayerColor:e.faceLayerColor,neckLayer:e.neckLayer,neckColor:e.neckColor,neckLayerColor:e.neckLayerColor,bodyLayer:e.bodyLayer,bodyColor:e.bodyColor,bodyLayerColor:e.bodyLayerColor,handLayer:e.handLayer,handColor:e.handColor,handLayerColor:e.handLayerColor,feetLayer:e.feetLayer,feetColor:e.feetColor,feetLayerColor:e.feetLayerColor,flagLayer:e.flagLayer,flagColor:e.flagColor,flagLayerColor:e.flagLayerColor,photoLayer:e.photoLayer,photoColor:e.photoColor,photoLayerColor:e.photoLayerColor,flags:e.flags,isMascot:e.isMascot,invisible:e.invisible,isAfk:e.isAfk,connectionUnstable:e.connectionUnstable,transform:e.transform,playercardMusic:e.playercardMusic,outfits:e.outfits,relationships:e.relationships,likes:e.likes,features:e.features},_raw:e}}normalizePlayer(e){let t=e.user,n=this.normalizeUser(t);return{...n,_raw:e,coins:e.coins??0,rank:e.rank??0,inventory:e.inventory??[],furniture:e.furniture??[],flooring:e.flooring??[],buddies:e.buddies??[],buddyRequests:e.buddyRequests??[],ignores:e.ignores??[],igloos:e.igloos??[],meta:{...n.meta,snowflakes:e.snowflakes,postcards:e.postcards,mascots:e.mascots,pets:e.pets,locations:e.locations}}}sendMessage(e){this.send("send_message",{message:e})}sendEmote(e){this.sendPackedEmote(1,e)}sendSafe(e){this.send("send_safe",{safe:e})}walk(e,t){this.send("send_position",{x:e,y:t})}sendFrame(e,t){this.send("send_frame",{set:t??!0,frame:e})}snowball(e,t){this.send("snowball",{x:e,y:t})}joinRoom(e,t,n){this.leaveWaddle(),this.send("join_room",{room:e,x:t??0,y:n??0})}addItem(e){this.send("add_item",{item:String(e)})}updatePlayer(e){this.send("update_player",{item:e})}equipColor(e){this.updatePlayer(e)}equipHead(e){this.updatePlayer(e)}equipFace(e){this.updatePlayer(e)}equipNeck(e){this.updatePlayer(e)}equipBody(e){this.updatePlayer(e)}equipHand(e){this.updatePlayer(e)}equipFeet(e){this.updatePlayer(e)}equipFlag(e){this.updatePlayer(e)}equipPhoto(e){this.updatePlayer(e)}getIglooOpen(e){this.send("get_igloo_open",{igloo:e})}joinIgloo(e,t,n){this.leaveWaddle(),this.send("join_igloo",{igloo:e,x:t??0,y:n??0})}updateIglooFurniture(e){this.send("update_furniture",{furniture:e})}openIglooRaw(){this.send("open_igloo",{})}sendPackedEmote(e,t){this.send("send_emote",{pack:e,emote:t})}updateLayeredPlayer(e){this.send("update_player",{item:e,layer:!0})}acceptMature(){this.send("accept_mature",{})}removeInventory(e){this.send("remove_inventory",{item:e})}getSnowflakeState(){this.send("get_snowflake_state",{})}getPets(e){this.send("get_pets",{userId:e})}getIglooContest(){this.send("get_igloo_contest",{})}getIglooLikesFor(e){this.send("get_igloo_likes",{iglooId:e})}likeIglooById(e){this.send("like_igloo",{iglooId:e})}sendMail(e,t){this.send("send_mail",{recipient:e,postcardId:t})}marryRequest(e){this.send("marry_request",{id:e})}leaveWaddle(){this.send("leave_waddle",{})}createSocket(e){return be(J,{...this.socketIoOptions(J),path:e,transports:["polling","websocket"],reconnection:!1})}};import{createCipheriv as _e,createDecipheriv as ke,randomBytes as we}from"crypto";import{io as Ce}from"socket.io-client";import N from"tweetnacl";var V="https://media8.newcp.net/assets/media/crumbs/en/crumbs.json",R=class{aesKey=null;keypair=N.box.keyPair();get publicKey(){return Buffer.from(this.keypair.publicKey).toString("base64")}get encrypted(){return this.aesKey!==null}acquireKey(e,t){let n=Buffer.from(e,"base64"),r=Buffer.from(t,"base64"),i=n.subarray(0,N.box.nonceLength),o=n.subarray(N.box.nonceLength),s=N.box.open(new Uint8Array(o),new Uint8Array(i),new Uint8Array(r),this.keypair.secretKey);return s?new TextDecoder().decode(s):null}setKey(e){this.aesKey=Buffer.from(e,"utf-8")}encrypt(e){if(!this.aesKey)throw new Error("Encryption key not set");let t=we(16),n=_e("aes-256-cbc",this.aesKey,t),r=Buffer.concat([n.update(e,"utf-8"),n.final()]);return Buffer.concat([t,r]).toString("base64")}decrypt(e){if(!this.aesKey)throw new Error("Encryption key not set");let t=Buffer.from(e,"base64"),n=t.subarray(0,16),r=t.subarray(16),i=ke("aes-256-cbc",this.aesKey,n);return Buffer.concat([i.update(r),i.final()]).toString("utf-8")}encode(e){return this.encrypted?this.encrypt(JSON.stringify(e)):JSON.stringify(e)}decode(e){return this.encrypted&&typeof e=="string"?JSON.parse(this.decrypt(e)):typeof e=="string"?JSON.parse(e):e}};function X(m,e,t){return new Promise((n,r)=>{let i=!1,o=()=>{m.off("handshake",u),t.removeEventListener("abort",d)},s=c=>{i||(i=!0,o(),r(c))},d=()=>{s(new Error("Handshake cancelled"))},u=(c,l)=>{try{let g=e.acquireKey(c,l);if(!g){s(new Error("Failed to decrypt handshake key"));return}let _=JSON.parse(g);if(_.time&&typeof _.time=="number"&&Math.abs(Date.now()-_.time)>3e5){s(new Error("Server time desync"));return}if(e.setKey(_.key),i)return;i=!0,o(),n()}catch(g){s(g instanceof Error?g:new Error("Handshake failed"))}};if(t.aborted){d();return}m.on("handshake",u),t.addEventListener("abort",d,{once:!0}),m.emit("handshake",e.publicKey)})}function Oe(m,e){let t=m.on.bind(m);return m.on=((n,r)=>n==="message"?t(n,i=>{try{let o=e.decode(i);r({action:o.action,args:o.args??{}})}catch{}}):t(n,r)),m}var F=class extends M{id="NewCP";encryptor=new R;worlds=null;async login(e,t){this.resetLoginState();let n=new AbortController,r=!1,i=()=>n.abort();if(t?.signal?.aborted)throw new a({category:"aborted",phase:"transport_connecting",retryable:!0,message:"Login cancelled"});t?.signal?.addEventListener("abort",i,{once:!0});let o=setTimeout(()=>{r=!0,n.abort()},t?.timeoutMs??L.loginMs),s=null;try{this.worlds||await this.loadWorlds(n.signal);let d=Object.values(this.worlds??{}).find(u=>u.login);if(!d)throw new a({category:"login_rejected",phase:"transport_connecting",retryable:!1,message:"Login world not found in crumbs"});return s=this.createSocket(d.host,d.path),this.encryptor=new R,await new Promise((u,c)=>{let l=!1,g=()=>{s?.off("connect",C),s?.off("message",v),s?.off("connect_error",p),s?.off("disconnect",f),n.signal.removeEventListener("abort",k)},_=b=>{l||(l=!0,g(),s?.disconnect(),c(b))},y=b=>{l||(l=!0,g(),s?.disconnect(),u(b))},C=async()=>{try{if(!s)return;await X(s,this.encryptor,n.signal);let b="token"in e?{username:e.username,token:e.token}:{username:e.username,password:e.password},O=this.encryptor.encode({action:"login",args:b});s.emit("message",O)}catch(b){if(l)return;_(new a({category:n.signal.aborted?r?"login_timeout":"aborted":"transport_error",phase:"transport_connecting",retryable:!0,message:n.signal.aborted?r?"Login timed out":"Login cancelled":b instanceof Error?`Login handshake failed: ${b.message}`:"Login handshake failed",cause:b}))}},v=b=>{try{let O=this.encryptor.decode(b);if(O.action!=="login")return;let h=O.args;if(!h.success){this.loginMessage=h.message??null;let P=h.message??"Login failed",q=/password|credential|incorrect|invalid login/i.test(P);_(new a({category:q?"invalid_credentials":"login_rejected",phase:"transport_connecting",retryable:!1,message:P}));return}let w=(h.worlds??[]).map(P=>({name:P.name,population:P.population})),S=(h.worlds??[]).filter(P=>P.buddies).map(P=>P.name);y({servers:w,key:h.key,username:h.username,moderator:!1,buddyWorlds:S})}catch(O){_(new a({category:"transport_error",phase:"transport_connecting",retryable:!0,message:"Invalid login response",cause:O}))}},p=b=>{_(new a({category:"transport_error",phase:"transport_connecting",retryable:!0,message:`Login connection failed: ${b.message}`,cause:b}))},f=b=>{_(new a({category:"transport_error",phase:"transport_connecting",retryable:!0,message:`Login connection closed unexpectedly${b?`: ${b}`:""}`}))},k=()=>{_(new a({category:r?"login_timeout":"aborted",phase:"transport_connecting",retryable:!0,message:r?"Login timed out":"Login cancelled"}))};s?.on("connect",C),s?.on("message",v),s?.on("connect_error",p),s?.on("disconnect",f),n.signal.addEventListener("abort",k,{once:!0})})}catch(d){throw d instanceof a?d:n.signal.aborted?new a({category:r?"login_timeout":"aborted",phase:"transport_connecting",retryable:!0,message:r?"Login timed out":"Login cancelled",cause:d}):new a({category:"transport_error",phase:"transport_connecting",retryable:!0,message:d instanceof Error?d.message:"Login failed",cause:d})}finally{clearTimeout(o),t?.signal?.removeEventListener("abort",i)}}async connect(e,t,n){this.worlds||await this.loadWorlds(n?.signal);let r=this.worlds?.[e];if(!r)throw new Error(`World config not found for: ${e}`);this.encryptor=new R,this.reportLifecycle(n,"transport_connecting");let i=this.createSocket(r.host,r.path);this.socket=i;let o=this.connectionTimeouts(n),s=new AbortController,d=c=>{try{let l=this.encryptor.decode(c),g=l.action;if(typeof g!="string"||g==="game_auth"||g==="wait_queue_update")return;n?.onMessage?.({action:g,args:l.args??{}})}catch{}},u=c=>{n?.onDisconnect?.(c??null)};return i.on("message",d),i.on("disconnect",u),await new Promise((c,l)=>{let g=!1,_,y="transport_connecting",C=()=>{_!==void 0&&clearTimeout(_),i.off("connect",k),i.off("message",b),i.off("connect_error",O),i.off("disconnect",h),n?.signal?.removeEventListener("abort",w)},v=S=>{g||(g=!0,C(),s.abort(),i.off("message",d),i.off("disconnect",u),i.disconnect(),this.socket=null,l(S))},p=()=>{g||(g=!0,C(),c())},f=(S,P,q,$)=>{_!==void 0&&clearTimeout(_),_=setTimeout(()=>{v(new a({category:P,phase:q,retryable:!0,message:$}))},S)},k=async()=>{y="authenticating",this.reportLifecycle(n,"authenticating"),f(o.authenticationMs,"auth_timeout","authenticating","Game authentication timed out");try{if(await X(i,this.encryptor,s.signal),g)return;let S=this.encryptor.encode({action:"game_auth",args:{username:t.username,key:t.key,createToken:!1}});i.emit("message",S)}catch(S){if(g)return;v(new a({category:"transport_error",phase:"authenticating",retryable:!0,message:S instanceof Error?`Game handshake failed: ${S.message}`:"Game handshake failed",cause:S}))}},b=S=>{try{let P=this.encryptor.decode(S);switch(P.action){case"wait_queue_update":{let q=P.args;y="queueing",this.reportLifecycle(n,"queueing",q),n?.onQueueUpdate?.(q),f(o.queueMs,"queue_timeout","queueing","Game server queue stopped responding");break}case"game_auth":{if(!P.args.success){v(new a({category:"auth_failed",phase:"authenticating",retryable:!0,message:"Game authentication failed"}));return}this.reportLifecycle(n,"joining_session");let $=this.encryptor.encode({action:"join_server",args:{}});i.emit("message",$),p();break}}}catch{}},O=S=>{v(new a({category:"transport_error",phase:"transport_connecting",retryable:!0,message:`Game connection failed: ${S.message}`,cause:S}))},h=S=>{v(new a({category:"transport_error",phase:y,retryable:!0,message:`Disconnected before game authentication${S?`: ${S}`:""}`}))},w=()=>{v(new a({category:"aborted",phase:y,retryable:!0,message:"Game connection cancelled"}))};if(n?.signal?.aborted){w();return}i.on("connect",k),i.on("message",b),i.on("connect_error",O),i.on("disconnect",h),n?.signal?.addEventListener("abort",w,{once:!0}),f(o.transportMs,"transport_error","transport_connecting","Game transport connection timed out")}),Oe(i,this.encryptor)}send(e,t){if(!this.socket)throw new Error("Not connected");let n=this.encryptor.encode({action:e,args:t});this.socket.emit("message",n)}disconnect(){this.socket?.disconnect(),this.socket=null}normalizeUser(e){return{...this.extractAppearance(e),id:e.id,username:e.username,displayName:e.nickname,x:e.x??0,y:e.y??0,frame:e.frame??0,meta:{nickname:e.nickname,registrationDate:e.registrationDate,customNameColor:e.customNameColor,customBubbleColor:e.customBubbleColor,customBubbleTextColor:e.customBubbleTextColor,wallHacks:e.wallHacks,moderator:e.moderator,character:e.character,approved:e.approved,walking:e.walking},_raw:e}}normalizePlayer(e){let t=e.user;return{...this.normalizeUser(t),_raw:e,coins:e.coins??0,rank:e.rank??0,inventory:e.inventory??[],buddies:e.buddies??[],ignores:e.ignores??[],furniture:e.furniture,flooring:e.floorings??[],igloos:e.igloos??[]}}sendMessage(e){this.send("send_message",{message:e})}sendEmote(e){this.send("send_emote",{emote:e})}sendSafe(e){this.send("send_safe",{safe:e})}walk(e,t){this.send("send_position",{x:e,y:t})}sendFrame(e,t){this.send("send_frame",{frame:e,set:t})}snowball(e,t){this.send("snowball",{x:e,y:t})}joinRoom(e,t,n){this.send("join_room",{room:e,x:t??0,y:n??0})}addItem(e){this.send("add_item",{item:e})}equipColor(e){this.send("update_color",{item:e})}equipHead(e){this.send("update_head",{item:e})}equipFace(e){this.send("update_face",{item:e})}equipNeck(e){this.send("update_neck",{item:e})}equipBody(e){this.send("update_body",{item:e})}equipHand(e){this.send("update_hand",{item:e})}equipFeet(e){this.send("update_feet",{item:e})}equipFlag(e){this.send("update_flag",{item:e})}equipPhoto(e){this.send("update_photo",{item:e})}buddyRequest(e){this.send("buddy_request",{id:e})}buddyAccept(e){this.send("buddy_accept",{id:e})}buddyReject(e){this.send("buddy_reject",{id:e})}removeBuddy(e){this.send("remove_buddy",{id:e})}addIgnore(e){this.send("ignore_add",{id:e})}removeIgnore(e){this.send("ignore_remove",{id:e})}getPlayer(e){this.send("get_player",{id:e})}joinIgloo(e,t,n){this.send("join_igloo",{igloo:e,x:t??0,y:n??0})}createSocket(e,t){return Ce(e,{...this.socketIoOptions(e),path:t,transports:["polling","websocket"],reconnection:!1})}async loadWorlds(e){let t=await fetch(V,{headers:this.connectionHeaders(V),signal:e});if(!t.ok)throw new Error(`Failed to fetch crumbs: ${t.status}`);let n=await t.json();this.worlds=n.worlds}};import{io as Se}from"socket.io-client";var Y="https://play.penguinorigins.online",D=class extends M{id="PenguinOrigins";gameToken;async login(e,t){this.resetLoginState(),this.gameToken="token"in e?e.token:void 0;let n=this.createSocket("/world/login/");return await new Promise((i,o)=>{let s=!1,d=setTimeout(()=>{c(new a({category:"login_timeout",phase:"transport_connecting",retryable:!0,message:"Login timed out"}))},t?.timeoutMs??L.loginMs),u=()=>{clearTimeout(d),n.off("connect",g),n.off("message",_),n.off("connect_error",y),n.off("disconnect",C),t?.signal?.removeEventListener("abort",v)},c=p=>{s||(s=!0,u(),n.disconnect(),o(p))},l=p=>{s||(s=!0,u(),n.disconnect(),i(p))},g=()=>{let p="token"in e?"token_login":"login",f="token"in e?{username:e.username,token:e.token}:{username:e.username,password:e.password};n.emit("message",{action:p,args:f})},_=p=>{if(p.action!=="login")return;let f=p.args;if(!f.success){this.loginMessage=f.message??null;let b=f.message??"Login failed",O=/password|credential|incorrect|invalid login|not found/i.test(b);c(new a({category:O?"invalid_credentials":"login_rejected",phase:"transport_connecting",retryable:!1,message:b}));return}let k=Object.entries(f.populations).map(([b,O])=>({name:b,population:O}));l({servers:k,key:f.key,username:f.username,moderator:!1,buddyWorlds:[]})},y=p=>{c(new a({category:"transport_error",phase:"transport_connecting",retryable:!0,message:`Login connection failed: ${p.message}`,cause:p}))},C=p=>{c(new a({category:"transport_error",phase:"transport_connecting",retryable:!0,message:`Login connection closed unexpectedly${p?`: ${p}`:""}`}))},v=()=>{c(new a({category:"aborted",phase:"transport_connecting",retryable:!0,message:"Login cancelled"}))};if(t?.signal?.aborted){v();return}n.on("connect",g),n.on("message",_),n.on("connect_error",y),n.on("disconnect",C),t?.signal?.addEventListener("abort",v,{once:!0})})}async connect(e,t,n){this.reportLifecycle(n,"transport_connecting");let r=this.createSocket(`/world/${e.toLowerCase()}/`);this.socket=r;let i=this.connectionTimeouts(n),o=d=>{d.action==="game_auth"||d.action==="wait_queue_update"||n?.onMessage?.(d)},s=d=>{n?.onDisconnect?.(d??null)};return r.on("message",o),r.on("disconnect",s),await new Promise((d,u)=>{let c=!1,l,g="transport_connecting",_=()=>{l!==void 0&&clearTimeout(l),r.off("connect",p),r.off("message",f),r.off("connect_error",k),r.off("disconnect",b),n?.signal?.removeEventListener("abort",O)},y=h=>{c||(c=!0,_(),r.off("message",o),r.off("disconnect",s),r.disconnect(),this.socket=null,u(h))},C=()=>{c||(c=!0,_(),d())},v=(h,w,S,P)=>{l!==void 0&&clearTimeout(l),l=setTimeout(()=>{y(new a({category:w,phase:S,retryable:!0,message:P}))},h)},p=()=>{g="authenticating",this.reportLifecycle(n,"authenticating"),v(i.authenticationMs,"auth_timeout","authenticating","Game authentication timed out"),r.emit("message",{action:"game_auth",args:{username:t.username,key:t.key,createToken:!0,...this.gameToken?{token:this.gameToken}:{}}})},f=h=>{switch(h.action){case"wait_queue_update":{let w=h.args;g="queueing",this.reportLifecycle(n,"queueing",w),n?.onQueueUpdate?.(w),v(i.queueMs,"queue_timeout","queueing","Game server queue stopped responding");break}case"game_auth":{if(!h.args.success){y(new a({category:"auth_failed",phase:"authenticating",retryable:!0,message:"Game authentication failed"}));return}this.reportLifecycle(n,"joining_session"),r.emit("message",{action:"join_server",args:{}}),C();break}}},k=h=>{y(new a({category:"transport_error",phase:"transport_connecting",retryable:!0,message:`Game connection failed: ${h.message}`,cause:h}))},b=h=>{y(new a({category:"transport_error",phase:g,retryable:!0,message:`Disconnected before game authentication${h?`: ${h}`:""}`}))},O=()=>{y(new a({category:"aborted",phase:g,retryable:!0,message:"Game connection cancelled"}))};if(n?.signal?.aborted){O();return}r.on("connect",p),r.on("message",f),r.on("connect_error",k),r.on("disconnect",b),n?.signal?.addEventListener("abort",O,{once:!0}),v(i.transportMs,"transport_error","transport_connecting","Game transport connection timed out")}),r}send(e,t){if(!this.socket)throw new Error("Not connected");this.socket.emit("message",{action:e,args:t})}disconnect(){this.socket?.disconnect(),this.socket=null}normalizeUser(e){return{...this.extractAppearance(e),id:e.id,username:e.username,displayName:e.nickname??e.username,joinTime:e.joinTime,x:e.x??0,y:e.y??0,frame:e.frame??0,meta:{toy:e.toy},_raw:e}}normalizePlayer(e){let t=e.user,n=this.normalizeUser(t);return{...n,_raw:e,coins:e.coins??0,rank:e.rank??0,inventory:e.inventory??[],furniture:e.furniture??[],flooring:e.flooring??[],buddies:e.buddies??[],buddyRequests:e.buddyRequests??[],ignores:e.ignores??[],igloos:e.igloos??[],meta:{...n.meta,postcards:e.postcards,mascots:e.mascots,pets:e.pets}}}sendMessage(e){this.send("send_message",{message:e})}sendEmote(e){this.send("send_emote",{emote:e})}sendSafe(e){this.send("send_safe",{safe:e})}walk(e,t){this.send("send_position",{x:e,y:t})}sendFrame(e,t){this.send("send_frame",{frame:e,set:t??!1})}snowball(e,t){this.send("snowball",{x:e,y:t})}equipToy(e){this.send("equip_toy",{toy:e})}joinRoom(e,t,n){this.send("join_room",{room:e,x:t??0,y:n??0})}addItem(e){this.send("add_item",{item:e})}equipColor(e){this.send("update_player",{item:e})}equipHead(e){this.send("update_player",{item:e})}equipFace(e){this.send("update_player",{item:e})}equipNeck(e){this.send("update_player",{item:e})}equipBody(e){this.send("update_player",{item:e})}equipHand(e){this.send("update_player",{item:e})}equipFeet(e){this.send("update_player",{item:e})}equipFlag(e){this.send("update_player",{item:e})}equipPhoto(e){this.send("update_player",{item:e})}buddyRequest(e){this.send("buddy_request",{id:e})}buddyAccept(e){this.send("buddy_accept",{id:e})}addIgnore(e){this.send("ignore_add",{id:e})}removeIgnore(e){this.send("ignore_remove",{id:e})}getIglooOpen(e){this.send("get_igloo_open",{igloo:e})}joinIgloo(e,t,n){this.send("join_igloo",{igloo:e,x:t??0,y:n??0})}gameOver(e){this.send("game_over",{coins:e})}createSocket(e){return Se(Y,{...this.socketIoOptions(Y),path:e,transports:["polling","websocket"],reconnection:!1})}};var Pe={CPPSlol:E,CPJourney:A,CPLegacy:x,NewCP:F,PenguinOrigins:D};function Z(m,e){return new Pe[m](j(e))}var I=class{constructor(e,t){this.adapter=e;this.request=t}adapter;request;getNinja(e){return this.request("get_ninja",()=>this.adapter.getNinja(),e)}getMats(e){return this.request("get_waddles",()=>this.adapter.getMats(),e)}joinMat(e){this.adapter.joinMat(e)}joinMatchmaking(e){return this.request("join_matchmaking",()=>this.adapter.joinMatchmaking(),e)}leaveMatchmaking(){this.adapter.leaveMatchmaking()}startGame(e){return this.request("start_game",()=>this.adapter.startGame(),e)}selectCard(e,t){return this.request("move_my_card",()=>this.adapter.selectCard(e),t,n=>n.slot===e)}loadAnimation(e){this.adapter.loadAnimation(e)}};var T=class{constructor(e,t){this.baseAdapter=e;this.request=t}baseAdapter;request;get adapter(){if(this.baseAdapter instanceof E)return this.baseAdapter;throw new a({category:"unsupported_operation",phase:"ready",retryable:!1,message:`${this.baseAdapter.id} does not support CPPS.lol actions`})}sendPackedEmote(e,t){this.adapter.sendPackedEmote(e,t)}updateLayeredPlayer(e){this.adapter.updateLayeredPlayer(e)}acceptMature(){this.adapter.acceptMature()}removeInventory(e,t){return this.request("remove_inventory",()=>this.adapter.removeInventory(e),t,n=>Number(n.id)===e)}getSnowflakeState(e){return this.request("snowflake_state",()=>this.adapter.getSnowflakeState(),e)}getPets(e,t){return this.request("get_pets",()=>this.adapter.getPets(e),t,n=>n.userId===void 0||n.userId===e)}getIglooContest(e){return this.request("igloo_contest",()=>this.adapter.getIglooContest(),e)}getIglooLikes(e,t){return this.request("igloo_likes",()=>this.adapter.getIglooLikesFor(e),t,n=>n.iglooId===e)}likeIgloo(e,t){return this.request("igloo_likes",()=>this.adapter.likeIglooById(e),t,n=>n.iglooId===e)}openIgloo(){this.adapter.openIglooRaw()}sendMail(e,t){this.adapter.sendMail(e,t)}marryRequest(e){this.adapter.marryRequest(e)}leaveWaddle(){this.adapter.leaveWaddle()}};var Me=new Set(["load_player","join_room","add_player","remove_player","send_position","send_frame","update_player","kick","close_with_error","send_message","send_emote","cpj_ping","open_sprite","close_sprite","set_weather","server_error","error","stamp_earned","game_over","join_game_room","get_ninja","get_waddles","update_waddle","join_matchmaking","tick_matchmaking","start_game","set_cards","add_enemy_cards","start_round","enable_cards","remove_card","move_my_card","card_effect","round_over","play_animation","game_won","get_player","buddy_request","buddy_accept","buddy_reject","buddy_request_seen","get_buddy","buddy_find","send_postcard","stamps_result","ignore_add","ignore_remove","add_item","get_postcards","get_igloo_open","get_igloos","get_igloo_likes","join_igloo","get_puffles","get_all_puffles","get_wellbeing","get_walking_puffle","update_wellbeing","puffle_levelup","puffle_popup","buy_puffle_item","walk_puffle","backyard_supplies","receive_postcard","get_store_music","add_music","get_igloostore_items","add_furniture","update_music","igloo_open_status","igloo_bounds_status","igloo_liked","get_mascots","wait_queue_update","slot","snowball","equip_toy","send_safe","stop_walking","update_table","transform_player","adopt_puffle","info","queue_server_join","disconnect","unknown_packet","remove_inventory","snowflake_state","get_pets","igloo_contest","igloo_likes","marry_request"]),G=class extends Le{player=null;room=null;users=new Map;connected=!1;adapter;loginResult=null;log=null;_cardJitsu=null;_cppslol=null;intentionalDisconnect=!1;disconnectNotified=!1;connectionFailure=null;lifecycleReporter;requestTails=new Map;disconnectEpoch=0;lastDisconnectInfo=null;get loginMessage(){return this.adapter.loginMessage}get loginStatus(){return this.adapter.loginStatus}get cardJitsu(){return this._cardJitsu||(this._cardJitsu=new I(this.adapter,this.request.bind(this))),this._cardJitsu}get cppslol(){return this._cppslol||(this._cppslol=new T(this.adapter,this.request.bind(this))),this._cppslol}constructor(e,t){super(),this.adapter=Z(e,t?.connectionProfile),t?.debug&&(this.log=typeof t.debug=="function"?t.debug:console.log.bind(console))}async login(e,t){this.log?.("[login] logging in as",e.username),this.loginResult=null;let n=await this.adapter.login(e,t);return this.loginResult=n,this.log?.("[login] success \u2014",n.servers.length,"servers"),n}async connect(e,t){if(!this.loginResult)throw new Error("Must call login() first");this.log?.("[connect] joining",e),this.intentionalDisconnect=!1,this.disconnectNotified=!1,this.connectionFailure=null,this.lastDisconnectInfo=null,this.lifecycleReporter=t?.onLifecycleUpdate;let n={...t,onQueueUpdate:r=>{this.log?.("[queue]",`#${r.position}/${r.queueLength}`),this.emit("wait_queue_update",r),t?.onQueueUpdate?.(r)},onMessage:r=>{this.handleMessage(r)},onDisconnect:r=>{this.handleAdapterDisconnect(r)}};try{await this.adapter.connect(e,this.loginResult,n),this.reportLifecycle("awaiting_initial_state"),await this.waitForInitialState(n),this.connected=!0,this.connectionFailure=null,this.reportLifecycle("ready")}catch(r){let i=r instanceof a?r:new a({category:"transport_error",phase:"transport_connecting",retryable:!0,message:r instanceof Error?r.message:"Connection failed",cause:r});throw this.intentionalDisconnect=!1,this.adapter.disconnect(),this.cleanup(),this.disconnectNotified||(this.disconnectNotified=!0,this.disconnectEpoch+=1,this.lastDisconnectInfo={intentional:!1,reason:i.message,occurredAt:Date.now()},this.reportLifecycle("disconnected")),i}}waitForInitialState(e){let t=e.timeouts?.initialStateMs??L.initialStateMs;return new Promise((n,r)=>{let i=!1,o,s=()=>{o!==void 0&&clearTimeout(o),this.off("load_player",l),this.off("join_room",l),this.off("kick",g),this.off("close_with_error",_),this.off("server_error",y),this.off("disconnect",C),e.signal?.removeEventListener("abort",v)},d=()=>{i||(i=!0,s(),n())},u=p=>{i||(i=!0,s(),r(p))},c=()=>{if(this.connectionFailure){u(this.connectionFailure);return}this.player!==null&&this.room!==null&&d()},l=()=>c(),g=({reason:p})=>{u(new a({category:"kicked",phase:"awaiting_initial_state",retryable:!0,message:`Kicked before initial state: ${p??"unknown"}`}))},_=({error:p})=>{u(new a({category:"kicked",phase:"awaiting_initial_state",retryable:!0,message:`Connection closed before initial state: ${p??"unknown"}`}))},y=({error:p})=>{u(new a({category:"server_error",phase:"awaiting_initial_state",retryable:!0,message:`Server error before initial state: ${String(p)}`}))},C=p=>{u(new a({category:"disconnected",phase:"awaiting_initial_state",retryable:!p.intentional,message:`Disconnected before initial state${p.reason?`: ${p.reason}`:""}`}))},v=()=>{u(new a({category:"aborted",phase:"awaiting_initial_state",retryable:!0,message:"Initial state wait cancelled"}))};if(this.on("load_player",l),this.on("join_room",l),this.on("kick",g),this.on("close_with_error",_),this.on("server_error",y),this.on("disconnect",C),e.signal?.addEventListener("abort",v,{once:!0}),e.signal?.aborted){v();return}c(),!i&&(o=setTimeout(()=>{u(new a({category:"initial_state_timeout",phase:"awaiting_initial_state",retryable:!0,message:"Waiting for initial player and room state timed out"}))},t))})}on(e,t){return super.on(e,t)}off(e,t){return super.off(e,t)}once(e,t){return super.once(e,t)}emit(e,...t){return super.emit(e,...t)}waitFor(e,t){return this.waitForEvent(e,t)}waitForEvent(e,t,n,r,i){let o=typeof t=="number"?{timeoutMs:t}:t,s=o?.timeoutMs??L.requestMs;return new Promise((d,u)=>{let c=!1,l,g=()=>{l!==void 0&&clearTimeout(l),this.off(e,_),this.off("disconnect",C),i&&this.off("server_error",p),o?.signal?.removeEventListener("abort",v)},_=(f=>{c||r&&!r(f)||(c=!0,g(),d(f))}),y=f=>{c||(c=!0,g(),u(f))},C=f=>{y(new a({category:"disconnected",phase:"ready",retryable:!f?.intentional,message:`Disconnected while waiting for ${String(e)}${f?.reason?`: ${f.reason}`:""}`}))},v=()=>{y(new a({category:"aborted",phase:"ready",retryable:!0,message:`Cancelled while waiting for ${String(e)}`}))},p=({error:f})=>{y(new a({category:"server_error",phase:"ready",retryable:!1,message:`Server error while waiting for ${String(e)}: ${String(f)}`}))};if(o?.signal?.aborted){v();return}if(Number.isFinite(s)&&(l=setTimeout(()=>{y(new a({category:"operation_timeout",phase:"ready",retryable:!0,message:`Timed out waiting for ${String(e)}`}))},s)),this.on(e,_),this.once("disconnect",C),i&&this.once("server_error",p),o?.signal?.addEventListener("abort",v,{once:!0}),n)try{n()}catch(f){if(f instanceof a){y(f);return}y(new a({category:"transport_error",phase:"ready",retryable:!0,message:`Failed to send request for ${String(e)}`,cause:f}))}})}request(e,t,n,r){let i=this.requestTails.get(e),o=this.disconnectEpoch,s=()=>{},d=new Promise(g=>{s=g}),u=i?i.then(()=>d):d;this.requestTails.set(e,u);let c=this.adapter.rejectRequestsOnServerError;return(i?this.waitForRequestTurn(e,i,o,n?.signal).then(()=>this.waitForEvent(e,n,t,r,c)):this.waitForEvent(e,n,t,r,c)).finally(()=>{s(),u.finally(()=>{this.requestTails.get(e)===u&&this.requestTails.delete(e)})})}waitForRequestTurn(e,t,n,r){let i=()=>new a({category:"aborted",phase:"ready",retryable:!0,message:`Cancelled before sending request for ${String(e)}`});return r?.aborted?Promise.reject(i()):new Promise((o,s)=>{let d=!1,u=()=>{r?.removeEventListener("abort",c)},c=()=>{d||(d=!0,u(),s(i()))};r?.addEventListener("abort",c,{once:!0}),t.then(()=>{if(!d){if(d=!0,u(),this.disconnectEpoch!==n){let l=this.lastDisconnectInfo;s(new a({category:"disconnected",phase:"ready",retryable:!l?.intentional,message:`Disconnected before sending request for ${String(e)}${l?.reason?`: ${l.reason}`:""}`}));return}o()}})})}sendMessage(e){this.adapter.sendMessage(e)}sendEmote(e){this.adapter.sendEmote(e)}sendSafe(e){this.adapter.sendSafe(e)}walk(e,t){this.adapter.walk(e,t)}sendFrame(e,t){this.adapter.sendFrame(e,t)}snowball(e,t){this.adapter.snowball(e,t)}joinRoom(e,t,n,r){return this.request("join_room",()=>this.adapter.joinRoom(e,t,n),r,i=>i.room===e)}addItem(e,t){return this.request("add_item",()=>this.adapter.addItem(e),t,n=>Number(n.item)===e)}equipColor(e){this.adapter.equipColor(e)}equipHead(e){this.adapter.equipHead(e)}equipFace(e){this.adapter.equipFace(e)}equipNeck(e){this.adapter.equipNeck(e)}equipBody(e){this.adapter.equipBody(e)}equipHand(e){this.adapter.equipHand(e)}equipFeet(e){this.adapter.equipFeet(e)}equipFlag(e){this.adapter.equipFlag(e)}equipPhoto(e){this.adapter.equipPhoto(e)}buddyRequest(e){this.adapter.buddyRequest(e)}buddyAccept(e,t){return this.request("buddy_accept",()=>this.adapter.buddyAccept(e),t,n=>n.id===e)}buddyReject(e,t){return this.request("buddy_reject",()=>this.adapter.buddyReject(e),t,n=>n.id===e)}buddyRequestSeen(e,t){return this.request("buddy_request_seen",()=>this.adapter.buddyRequestSeen(e),t,n=>n.id===e)}getBuddy(e,t,n){return this.request("get_buddy",()=>this.adapter.getBuddy(e,t),n,r=>r.id===e&&r.type===t)}findBuddy(e,t){return this.request("buddy_find",()=>this.adapter.findBuddy(e),t)}removeBuddy(e){this.adapter.removeBuddy(e)}addIgnore(e,t){return this.request("ignore_add",()=>this.adapter.addIgnore(e),t,n=>n.id===e)}removeIgnore(e,t){return this.request("ignore_remove",()=>this.adapter.removeIgnore(e),t,n=>n.id===e)}getPlayer(e,t){return this.request("get_player",()=>this.adapter.getPlayer(e),t,n=>n.user.id===e)}getAllSlots(e){return this.request("slot",()=>this.adapter.getAllSlots(),e)}getMascots(e){return this.request("get_mascots",()=>this.adapter.getMascots(),e)}sendPostcard(e,t,n){return this.request("send_postcard",()=>this.adapter.sendPostcard(e,t),n)}getStamps(e,t){return this.request("stamps_result",()=>this.adapter.getStamps(e),t)}getPostcards(e){return this.request("get_postcards",()=>this.adapter.getPostcards(),e)}getIglooOpen(e,t){return this.request("get_igloo_open",()=>this.adapter.getIglooOpen(e),t)}getIgloos(e){return this.request("get_igloos",()=>this.adapter.getIgloos(),e)}getPuffles(e,t){return this.request("get_puffles",()=>this.adapter.getPuffles(e,t?.isBackyard),t,n=>n.userId===e)}getAllPuffles(e){return this.request("get_all_puffles",()=>this.adapter.getAllPuffles(),e)}getPuffleWellbeing(e,t){return this.request("get_wellbeing",()=>this.adapter.getPuffleWellbeing(e),t,n=>n.puffleId===e)}playPuffle(e){this.adapter.playPuffle(e)}restPuffle(e){this.adapter.restPuffle(e)}buyPuffleItem(e,t,n){return this.request("buy_puffle_item",()=>this.adapter.buyPuffleItem(e,t),n,r=>r.puffleId===e&&r.item===t)}walkPuffle(e,t){return this.request("get_walking_puffle",()=>this.adapter.walkPuffle(e),t,n=>n.puffle.id===e)}initializePuffleTower(){this.adapter.initializePuffleTower()}getBackyardSupplies(e){return this.request("backyard_supplies",()=>this.adapter.getBackyardSupplies(),e)}adoptPuffle(e,t,n){return this.request("adopt_puffle",()=>this.adapter.adoptPuffle(e,t),n)}getIglooLikes(e){return this.request("get_igloo_likes",()=>this.adapter.getIglooLikes(),e)}checkPuffleSprite(e){this.adapter.checkPuffleSprite(e)}joinIgloo(e,t,n,r){return this.request("join_igloo",()=>this.adapter.joinIgloo(e,t,n),r,i=>i.igloo===e)}getStoreMusic(e){return this.request("get_store_music",()=>this.adapter.getStoreMusic(),e)}buyMusic(e,t){return this.request("add_music",()=>this.adapter.buyMusic(e),t,n=>n.music===e)}getIglooStoreItems(e){return this.request("get_igloostore_items",()=>this.adapter.getIglooStoreItems(),e)}buyFurniture(e,t=1,n){return this.request("add_furniture",()=>this.adapter.buyFurniture(e,t),n,r=>r.furniture===e&&r.amount===t)}updateIglooMusic(e,t){return this.request("update_music",()=>this.adapter.updateIglooMusic(e),t,n=>n.music===e)}updateIglooFurniture(e){this.adapter.updateIglooFurniture(e)}autoUpdateIglooFurniture(e){this.adapter.autoUpdateIglooFurniture(e)}updateIglooType(e){this.adapter.updateIglooType(e)}openIgloo(e){return this.request("igloo_open_status",()=>this.adapter.openIgloo(),e)}closeIglooBounds(e){return this.request("igloo_bounds_status",()=>this.adapter.closeIglooBounds(),e)}likeIgloo(e){return this.request("igloo_liked",()=>this.adapter.likeIgloo(),e)}openIglooEditor(){this.adapter.openIglooEditor()}closeIglooEditor(){this.adapter.closeIglooEditor()}gameOver(e,t){return this.request("game_over",()=>this.adapter.gameOver(e),t)}collectStamp(e,t){return this.request("stamp_earned",()=>this.adapter.collectStamp(e),t)}sleep(e){return new Promise(t=>setTimeout(t,e))}disconnect(){this.log?.("[disconnect] closing connection"),this.intentionalDisconnect=!0,this.reportLifecycle("disconnecting"),this.adapter.disconnect(),this.handleAdapterDisconnect("client disconnect")}reportLifecycle(e){this.lifecycleReporter?.({phase:e,occurredAt:Date.now()})}handleAdapterDisconnect(e){if(this.disconnectNotified)return;this.disconnectNotified=!0;let t={intentional:this.intentionalDisconnect,reason:e,occurredAt:Date.now()};this.disconnectEpoch+=1,this.lastDisconnectInfo=t,!t.intentional&&!this.connected&&(this.connectionFailure=new a({category:"disconnected",phase:"awaiting_initial_state",retryable:!0,message:`Disconnected before initial state${e?`: ${e}`:""}`})),this.log?.("[disconnect]",t.intentional?"connection closed":"connection lost",e??""),this.cleanup(),this.reportLifecycle("disconnected"),this.emit("disconnect",t)}cleanup(){this.connected=!1,this.player=null,this.room=null,this.users.clear()}handleMessage(e){let{action:t,args:n}=e,r=n;switch(t){case"load_player":{let o=this.adapter.normalizePlayer(n);this.player=o,r={user:o},this.log?.("[load_player]",o.username,`id=${o.id}`,`coins=${o.coins}`,`inventory=${o.inventory.length}`);break}case"join_room":{let o=n.room,s=n.users;this.room=o,this.users.clear();let d=[];for(let u of s){let c=this.adapter.normalizeUser(u);this.users.set(c.id,c),d.push(c)}r={room:o,users:d},this.log?.("[join_room]",`room=${o}`,`users=${d.length}`);break}case"add_player":{let o=this.adapter.normalizeUser(n.user);this.users.set(o.id,o),r={user:o},this.log?.("[add_player]",o.username,`id=${o.id}`);break}case"remove_player":{let o=n.user;this.users.delete(o),this.log?.("[remove_player]",`id=${o}`);break}case"send_position":{let o=n.id,s=this.users.get(o);s&&(s.x=n.x,s.y=n.y);break}case"send_frame":{let o=n.id,s=this.users.get(o);s&&(s.frame=n.frame);break}case"join_igloo":{let o=n.igloo,s=n.users;this.room=o,this.users.clear();let d=[];for(let u of s){let c=this.adapter.normalizeUser(u);this.users.set(c.id,c),d.push(c)}r={...n,users:d},this.log?.("[join_igloo]",`igloo=${o}`,`users=${d.length}`);break}case"update_player":{let o=n.id,s=n.slot,d=Number(n.item),u=l=>{s in l?l[s]=d:(s in l.meta||this.adapter.id==="CPPS.lol")&&(l.meta[s]=d)},c=this.users.get(o);c&&u(c),this.player?.id===o&&this.player!==c&&u(this.player);break}case"walk_puffle":{let o=n.user,s=this.users.get(o);s&&(s.walking=n.puffle,s.meta.walkingPuffleType=n.type);break}case"stop_walking":{let o=n.user,s=this.users.get(o);s&&(s.walking=0,s.meta.walkingPuffleType=void 0);break}case"igloo_open_status":{let o=n.status;if(this.player){this.player.meta.iglooOpen=o;let s=this.users.get(this.player.id);s&&(s.meta.iglooOpen=o)}break}case"igloo_bounds_status":{let o=n.status;if(this.player){this.player.meta.iglooBounds=o;let s=this.users.get(this.player.id);s&&(s.meta.iglooBounds=o)}break}case"transform_player":{let o=n.id,s=n.transform,d=this.users.get(o);d&&(d.meta.transform=s),this.player?.id===o&&this.player!==d&&(this.player.meta.transform=s);break}case"remove_inventory":{if(this.adapter.id!=="CPPS.lol"||!this.player)break;let o=Number(n.id);Number.isFinite(o)&&(this.player.inventory=this.player.inventory.filter(s=>s!==o));break}case"add_item":{if(this.adapter.id!=="CPJourney"&&this.adapter.id!=="CPPS.lol")break;let o=n.coins;this.player&&typeof o=="number"&&(this.player.coins=o);let s=Number(n.item);this.player&&Number.isFinite(s)&&!this.player.inventory.includes(s)&&this.player.inventory.push(s);break}case"add_furniture":case"add_music":case"adopt_puffle":case"buy_puffle_item":case"game_over":{if(this.adapter.id!=="CPJourney")break;let o=n.coins;this.player&&typeof o=="number"&&(this.player.coins=o);break}case"kick":{let o=n.reason??"unknown";this.log?.("[kick]",o),this.connected||(this.connectionFailure=new a({category:"kicked",phase:"awaiting_initial_state",retryable:!0,message:`Kicked before initial state: ${o}`})),this.cleanup();break}case"close_with_error":{let o=n.error??"unknown";this.log?.("[kick]",o),this.connected||(this.connectionFailure=new a({category:"kicked",phase:"awaiting_initial_state",retryable:!0,message:`Connection closed before initial state: ${o}`})),this.cleanup();break}case"error":{let o=n.error??"unknown";this.connected||(this.connectionFailure=new a({category:"server_error",phase:"awaiting_initial_state",retryable:!0,message:`Server error before initial state: ${String(o)}`}));break}default:{Me.has(t)||(this.log?.("[unknown_packet]",t,JSON.stringify(n)),this.emit("unknown_packet",{action:t,args:n}));break}}let i=t==="error"?"server_error":t;this.emit(i,r)}};export{M as BaseAdapter,I as CardJitsu,G as Client,a as ClientOperationError,T as Cppslol,L as DEFAULT_CLIENT_CONNECTION_TIMEOUTS,z as sanitizeClientErrorMessage};
2
2
  //# sourceMappingURL=index.js.map