@shaunlwm/pickle.ts 1.12.1 → 1.12.3

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
@@ -359,6 +359,7 @@ type ConnectOptions = {
359
359
  declare abstract class BaseAdapter {
360
360
  protected readonly connectionProfile: NormalizedConnectionProfile;
361
361
  abstract readonly id: string;
362
+ readonly rejectRequestsOnServerError: boolean;
362
363
  protected socket: Socket | null;
363
364
  loginMessage: string | null;
364
365
  loginStatus: "active" | "banned";
@@ -427,6 +428,8 @@ declare abstract class BaseAdapter {
427
428
  adoptPuffle(_type: number, _name: string): void;
428
429
  getIglooLikes(): void;
429
430
  checkPuffleSprite(_puffleSprite: boolean): void;
431
+ openSprite(_sprite: string): void;
432
+ equipToy(_toy: number): void;
430
433
  joinIgloo(_igloo: number, _x?: number, _y?: number): void;
431
434
  getStoreMusic(): void;
432
435
  buyMusic(_music: string): void;
@@ -479,6 +482,7 @@ declare abstract class BaseAdapter {
479
482
 
480
483
  declare class CpjourneyAdapter extends BaseAdapter {
481
484
  readonly id = "CPJourney";
485
+ readonly rejectRequestsOnServerError = true;
482
486
  private gameToken;
483
487
  login(options: LoginOptions | TokenLoginOptions, operationOptions?: ClientOperationOptions): Promise<LoginResult>;
484
488
  connect(serverName: string, loginResult: LoginResult, options?: ConnectOptions): Promise<Socket>;
@@ -533,6 +537,7 @@ declare class CpjourneyAdapter extends BaseAdapter {
533
537
  adoptPuffle(type: number, name: string): void;
534
538
  getIglooLikes(): void;
535
539
  checkPuffleSprite(puffleSprite: boolean): void;
540
+ openSprite(sprite: string): void;
536
541
  joinIgloo(igloo: number, x?: number, y?: number): void;
537
542
  getStoreMusic(): void;
538
543
  buyMusic(music: string): void;
@@ -706,6 +711,7 @@ declare class NewcpAdapter extends BaseAdapter {
706
711
 
707
712
  declare class PenguinoriginsAdapter extends BaseAdapter {
708
713
  readonly id = "PenguinOrigins";
714
+ private gameToken;
709
715
  login(options: LoginOptions | TokenLoginOptions, operationOptions?: ClientOperationOptions): Promise<LoginResult>;
710
716
  connect(serverName: string, loginResult: LoginResult, options?: ConnectOptions): Promise<Socket>;
711
717
  send(action: string, args: Record<string, unknown>): void;
@@ -718,6 +724,7 @@ declare class PenguinoriginsAdapter extends BaseAdapter {
718
724
  walk(x: number, y: number): void;
719
725
  sendFrame(frame: number, set?: boolean): void;
720
726
  snowball(x: number, y: number): void;
727
+ equipToy(toy: number): void;
721
728
  joinRoom(room: number, x?: number, y?: number): void;
722
729
  addItem(item: number): void;
723
730
  equipColor(item: number): void;
@@ -875,6 +882,12 @@ type ClientMessages = {
875
882
  check_puffle_sprite: {
876
883
  puffleSprite: unknown;
877
884
  };
885
+ open_sprite: {
886
+ sprite: string;
887
+ };
888
+ equip_toy: {
889
+ toy: number;
890
+ };
878
891
  get_all_puffles: Record<string, never>;
879
892
  get_wellbeing: {
880
893
  puffle: number;
@@ -1365,7 +1378,7 @@ type CppslolClientMessages = Pick<ClientMessages, "leave_waddle" | "remove_inven
1365
1378
  /** CPPS.lol-only events captured from its signed Socket.IO protocol. */
1366
1379
  type CppslolServerMessages = Pick<ServerMessages, "remove_inventory" | "snowflake_state" | "get_pets" | "igloo_contest" | "igloo_likes" | "marry_request">;
1367
1380
  /** CPJourney-only commands captured from its Socket.IO protocol. */
1368
- type CpjourneyClientMessages = Pick<ClientMessages, "get_puffles" | "adopt_puffle" | "check_puffle_sprite" | "get_all_puffles" | "get_wellbeing" | "puffle_play" | "update_puffle_rest" | "puffle_buy_item" | "walk_puffle" | "backyard_supplies" | "buddy_find" | "get_store_music" | "add_music" | "get_igloostore_items" | "add_furniture" | "update_music" | "update_furniture" | "update_furniture_auto" | "update_igloo" | "open_igloo" | "close_igloo_bounds" | "like_igloo" | "igloo_editor_open" | "igloo_editor_closed" | "tower_init">;
1381
+ type CpjourneyClientMessages = Pick<ClientMessages, "get_puffles" | "adopt_puffle" | "check_puffle_sprite" | "get_all_puffles" | "get_wellbeing" | "puffle_play" | "update_puffle_rest" | "puffle_buy_item" | "walk_puffle" | "backyard_supplies" | "buddy_find" | "get_store_music" | "add_music" | "get_igloostore_items" | "add_furniture" | "update_music" | "update_furniture" | "update_furniture_auto" | "update_igloo" | "open_igloo" | "close_igloo_bounds" | "like_igloo" | "igloo_editor_open" | "igloo_editor_closed" | "open_sprite" | "tower_init">;
1369
1382
  /** CPJourney-only events captured from its Socket.IO protocol. */
1370
1383
  type CpjourneyServerMessages = Pick<ServerMessages, "game_over" | "get_postcards" | "join_igloo" | "get_puffles" | "adopt_puffle" | "get_all_puffles" | "get_wellbeing" | "get_walking_puffle" | "update_wellbeing" | "puffle_levelup" | "puffle_popup" | "buy_puffle_item" | "walk_puffle" | "backyard_supplies" | "buddy_find" | "receive_postcard" | "get_store_music" | "add_music" | "get_igloostore_items" | "add_furniture" | "update_music" | "igloo_open_status" | "igloo_bounds_status" | "igloo_liked">;
1371
1384
 
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(h="chrome"){return typeof h=="string"?{preset:h,headers:{}}:{preset:h.preset??"chrome",userAgent:h.userAgent,acceptLanguage:h.acceptLanguage,origin:h.origin,referer:h.referer,headers:h.headers??{}}}function re(h){let e=h.match(/^[a-z][a-z0-9+.-]*:\/\//i)?h:`https://${h}`;try{let t=new URL(e);return`${t.protocol==="wss:"?"https:":t.protocol==="ws:"?"http:":t.protocol}//${t.host}`}catch{return h.replace(/\/+$/,"")}}function $(h,e){if(h.origin)return h.origin;if(h.preset!=="node")return re(e)}function H(h,e){let t={},n=$(h,e.defaultOrigin),r=h.referer??(h.preset==="node"||!n?void 0:`${n}/`);return h.preset!=="node"&&(t["User-Agent"]=h.userAgent??ee,t["Accept-Language"]=h.acceptLanguage??te),n&&(t.Origin=n),r&&(t.Referer=r),oe({...t,...h.headers,...e.headers})}function oe(h){let e={};for(let[t,n]of Object.entries(h))n!=null&&(se(t)||(e[t]=String(n)));return e}function se(h){let e=h.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(h){return h.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;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 $(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")}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";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(()=>{l(new a({category:"login_timeout",phase:"transport_connecting",retryable:!0,message:"Login timed out"}))},t?.timeoutMs??L.loginMs),u=()=>{clearTimeout(d),n.off("connect",f),n.off("message",v),n.off("connect_error",y),n.off("disconnect",C),t?.signal?.removeEventListener("abort",g)},l=p=>{s||(s=!0,u(),n.disconnect(),o(p))},c=p=>{s||(s=!0,u(),n.disconnect(),i(p))},f=()=>{let p=e.secret??le,_="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:_})},v=p=>{if(p.action!=="login")return;let _=p.args;if(!_.success){this.loginMessage=_.message??null;let b=_.message??"Login failed";_.message?.startsWith("Banned:")&&(this.loginStatus="banned");let S=pe.has(b);l(new a({category:this.loginStatus==="banned"?"account_banned":S?"invalid_credentials":"login_rejected",phase:"transport_connecting",retryable:!1,message:b}));return}let k=Object.entries(_.populations).map(([b,S])=>({name:b,population:S}));c({servers:k,key:_.key,username:_.username,moderator:_.moderator,buddyWorlds:_.buddyWorlds??[]})},y=p=>{l(new a({category:"transport_error",phase:"transport_connecting",retryable:!0,message:`Login connection failed: ${p.message}`,cause:p}))},C=p=>{l(new a({category:"transport_error",phase:"transport_connecting",retryable:!0,message:`Login connection closed unexpectedly${p?`: ${p}`:""}`}))},g=()=>{l(new a({category:"aborted",phase:"transport_connecting",retryable:!0,message:"Login cancelled"}))};if(t?.signal?.aborted){g();return}n.on("connect",f),n.on("message",v),n.on("connect_error",y),n.on("disconnect",C),t?.signal?.addEventListener("abort",g,{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 l=!1,c,f="transport_connecting",v=()=>{c!==void 0&&clearTimeout(c),r.off("connect",p),r.off("message",_),r.off("connect_error",k),r.off("disconnect",b),n?.signal?.removeEventListener("abort",S)},y=m=>{l||(l=!0,v(),r.off("message",o),r.off("disconnect",s),r.disconnect(),this.socket=null,u(m))},C=()=>{l||(l=!0,v(),d())},g=(m,O,w,P)=>{c!==void 0&&clearTimeout(c),c=setTimeout(()=>{y(new a({category:O,phase:w,retryable:!0,message:P}))},m)},p=()=>{f="authenticating",this.reportLifecycle(n,"authenticating"),g(i.authenticationMs,"auth_timeout","authenticating","Game authentication timed out");let m={username:t.username,key:t.key,createToken:!1,joinInvis:!1,takeoverMascot:!1,token:this.gameToken??""};r.emit("message",{action:"game_auth",args:m})},_=m=>{switch(m.action){case"wait_queue_update":{let O=m.args;f="queueing",this.reportLifecycle(n,"queueing",O),n?.onQueueUpdate?.(O),g(i.queueMs,"queue_timeout","queueing","Game server queue stopped responding");break}case"game_auth":{if(!m.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=m=>{y(new a({category:"transport_error",phase:"transport_connecting",retryable:!0,message:`Game connection failed: ${m.message}`,cause:m}))},b=m=>{y(new a({category:"transport_error",phase:f,retryable:!0,message:`Disconnected before joining the game${m?`: ${m}`:""}`}))},S=()=>{y(new a({category:"aborted",phase:f,retryable:!0,message:"Game connection cancelled"}))};if(n?.signal?.aborted){S();return}r.on("connect",p),r.on("message",_),r.on("connect_error",k),r.on("disconnect",b),n?.signal?.addEventListener("abort",S,{once:!0}),g(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,l=()=>{u!==void 0&&clearTimeout(u),u=setTimeout(()=>{f(new a({category:"queue_timeout",phase:"queueing",retryable:!0,message:"Server queue stopped responding"}))},r.queueMs)},c=()=>{u!==void 0&&clearTimeout(u),n.off("connect",y),n.off("message",C),n.off("disconnect",g),n.off("connect_error",p),t?.signal?.removeEventListener("abort",_)},f=k=>{s||(s=!0,c(),n.disconnect(),o(k))},v=()=>{s||(s=!0,d=!0,c(),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),l();break}case"queue_server_join":{v();break}}},g=k=>{d||f(new a({category:"transport_error",phase:"queueing",retryable:!0,message:`Queue connection closed unexpectedly${k?`: ${k}`:""}`}))},p=k=>{f(new a({category:"transport_error",phase:"queueing",retryable:!0,message:`Queue connection failed: ${k.message}`,cause:k}))},_=()=>{f(new a({category:"aborted",phase:"queueing",retryable:!0,message:"Queue wait cancelled"}))};if(t?.signal?.aborted){_();return}n.on("connect",y),n.on("message",C),n.on("disconnect",g),n.on("connect_error",p),t?.signal?.addEventListener("abort",_,{once:!0}),l()})}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:l,head:c,face:f,neck:v,body:y,hand:C,feet:g,flag:p,photo:_,...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:l,buddyRequests:c,ignores:f,igloos:v,...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:v??[],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})}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(h){let e=h.on.bind(h);return h.on=((t,n)=>t==="message"?e(t,(r,i)=>{n({action:r,args:i??{}})}):e(t,n)),h}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(c){throw i.signal.aborted?new a({category:o?"login_timeout":"aborted",phase:"transport_connecting",retryable:!0,message:o?"Login timed out":"Login cancelled",cause:c}):new a({category:"transport_error",phase:"transport_connecting",retryable:!0,message:c instanceof Error?`Login connection failed: ${c.message}`:"Login connection failed",cause:c})}finally{clearTimeout(d),t?.signal?.removeEventListener("abort",s)}if(!u.success){this.loginMessage=u.message??null;let c=u.message??"unknown error",f=/password|credential|incorrect|invalid login/i.test(c);throw new a({category:f?"invalid_credentials":"login_rejected",phase:"transport_connecting",retryable:!1,message:`Login failed: ${c}`})}return{servers:Object.entries(u.populations??{}).map(([c,f])=>({name:c,population:f})),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 l=!1,c,f="transport_connecting",v=()=>{c!==void 0&&clearTimeout(c),r.off("connect",p),r.off("message",_),r.off("connect_error",k),r.off("disconnect",b),n?.signal?.removeEventListener("abort",S)},y=m=>{l||(l=!0,v(),r.off("message",o),r.off("disconnect",s),r.disconnect(),this.socket=null,u(m))},C=()=>{l||(l=!0,v(),d())},g=(m,O,w,P)=>{c!==void 0&&clearTimeout(c),c=setTimeout(()=>{y(new a({category:O,phase:w,retryable:!0,message:P}))},m)},p=()=>{f="authenticating",this.reportLifecycle(n,"authenticating"),g(i.authenticationMs,"auth_timeout","authenticating","Game authentication timed out"),r.emit("message","game_auth",{username:t.username,key:t.key,createToken:!1,token:""})},_=(m,O)=>{switch(m){case"wait_queue_update":{let w=O;f="queueing",this.reportLifecycle(n,"queueing",w),n?.onQueueUpdate?.(w),g(i.queueMs,"queue_timeout","queueing","Game server queue stopped responding");break}case"game_auth":{if(!O.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=m=>{y(new a({category:"transport_error",phase:"transport_connecting",retryable:!0,message:`Game connection failed: ${m.message}`,cause:m}))},b=m=>{y(new a({category:"transport_error",phase:f,retryable:!0,message:`Disconnected before game authentication${m?`: ${m}`:""}`}))},S=()=>{y(new a({category:"aborted",phase:f,retryable:!0,message:"Game connection cancelled"}))};if(n?.signal?.aborted){S();return}r.on("connect",p),r.on("message",_),r.on("connect_error",k),r.on("disconnect",b),n?.signal?.addEventListener("abort",S,{once:!0}),g(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(h){if(h===null||typeof h!="object")return JSON.stringify(h)??"null";if(Array.isArray(h))return`[${h.map(K).join(",")}]`;let e=h;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",q=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",c),n.off("message",f),n.off("connect_error",v),n.off("disconnect",y),t?.signal?.removeEventListener("abort",C)},u=g=>{o||(o=!0,this.sessionToken="",d(),n.disconnect(),i(g))},l=g=>{o||(o=!0,d(),n.disconnect(),r(g))},c=()=>{let g="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:g,args:p})},f=g=>{if(g.action!=="login")return;let p=g.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 _=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:"",l({servers:_,key:p.key,username:p.username,moderator:!1,buddyWorlds:[]})},v=g=>{u(new a({category:"transport_error",phase:"transport_connecting",retryable:!0,message:`Login connection failed: ${g.message}`,cause:g}))},y=g=>{u(new a({category:"transport_error",phase:"transport_connecting",retryable:!0,message:`Login connection closed unexpectedly${g?`: ${g}`:""}`}))},C=()=>{u(new a({category:"aborted",phase:"transport_connecting",retryable:!0,message:"Login cancelled"}))};if(t?.signal?.aborted){C();return}n.on("connect",c),n.on("message",f),n.on("connect_error",v),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 l=!1,c,f="transport_connecting",v=()=>{c!==void 0&&clearTimeout(c),r.off("connect",p),r.off("message",_),r.off("connect_error",k),r.off("disconnect",b),n?.signal?.removeEventListener("abort",S)},y=m=>{l||(l=!0,v(),r.off("message",o),r.off("disconnect",s),this.signer=null,this.sessionToken="",r.disconnect(),this.socket=null,u(m))},C=()=>{l||(l=!0,v(),d())},g=(m,O,w,P)=>{c!==void 0&&clearTimeout(c),c=setTimeout(()=>{y(new a({category:O,phase:w,retryable:!0,message:P}))},m)},p=()=>{f="authenticating",this.reportLifecycle(n,"authenticating"),g(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}})},_=m=>{switch(m.action){case"wait_queue_update":{let O=m.args;f="queueing",this.reportLifecycle(n,"queueing",O),n?.onQueueUpdate?.(O),g(i.queueMs,"queue_timeout","queueing","Game server queue stopped responding");break}case"game_auth":{let O=m.args;if(!O.success||!O.packetKey||typeof O.serverTime!="number"){y(new a({category:"auth_failed",phase:"authenticating",retryable:!0,message:"Game authentication failed"}));return}try{this.signer=new U(O.packetKey,O.serverTime),this.sessionToken=O.token??this.sessionToken}catch(w){y(new a({category:"auth_failed",phase:"authenticating",retryable:!0,message:"Game authentication returned invalid signing data",cause:w}));return}this.reportLifecycle(n,"joining_session"),r.emit("message",{action:"join_server",args:{}}),C();break}}},k=m=>{y(new a({category:"transport_error",phase:"transport_connecting",retryable:!0,message:`Game connection failed: ${m.message}`,cause:m}))},b=m=>{y(new a({category:"transport_error",phase:f,retryable:!0,message:`Disconnected before game authentication${m?`: ${m}`:""}`}))},S=()=>{y(new a({category:"aborted",phase:f,retryable:!0,message:"Game connection cancelled"}))};if(n?.signal?.aborted){S();return}r.on("connect",p),r.on("message",_),r.on("connect_error",k),r.on("disconnect",b),n?.signal?.addEventListener("abort",S,{once:!0}),g(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",I=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(h,e,t){return new Promise((n,r)=>{let i=!1,o=()=>{h.off("handshake",u),t.removeEventListener("abort",d)},s=l=>{i||(i=!0,o(),r(l))},d=()=>{s(new Error("Handshake cancelled"))},u=(l,c)=>{try{let f=e.acquireKey(l,c);if(!f){s(new Error("Failed to decrypt handshake key"));return}let v=JSON.parse(f);if(v.time&&typeof v.time=="number"&&Math.abs(Date.now()-v.time)>3e5){s(new Error("Server time desync"));return}if(e.setKey(v.key),i)return;i=!0,o(),n()}catch(f){s(f instanceof Error?f:new Error("Handshake failed"))}};if(t.aborted){d();return}h.on("handshake",u),t.addEventListener("abort",d,{once:!0}),h.emit("handshake",e.publicKey)})}function Oe(h,e){let t=h.on.bind(h);return h.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)),h}var F=class extends M{id="NewCP";encryptor=new I;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 I,await new Promise((u,l)=>{let c=!1,f=()=>{s?.off("connect",C),s?.off("message",g),s?.off("connect_error",p),s?.off("disconnect",_),n.signal.removeEventListener("abort",k)},v=b=>{c||(c=!0,f(),s?.disconnect(),l(b))},y=b=>{c||(c=!0,f(),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},S=this.encryptor.encode({action:"login",args:b});s.emit("message",S)}catch(b){if(c)return;v(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}))}},g=b=>{try{let S=this.encryptor.decode(b);if(S.action!=="login")return;let m=S.args;if(!m.success){this.loginMessage=m.message??null;let w=m.message??"Login failed",P=/password|credential|incorrect|invalid login/i.test(w);v(new a({category:P?"invalid_credentials":"login_rejected",phase:"transport_connecting",retryable:!1,message:w}));return}let O=Object.entries(m.populations??{}).map(([w,P])=>({name:w,population:P}));y({servers:O,key:m.key,username:m.username,moderator:m.moderator??!1,buddyWorlds:m.buddyWorlds??[]})}catch(S){v(new a({category:"transport_error",phase:"transport_connecting",retryable:!0,message:"Invalid login response",cause:S}))}},p=b=>{v(new a({category:"transport_error",phase:"transport_connecting",retryable:!0,message:`Login connection failed: ${b.message}`,cause:b}))},_=b=>{v(new a({category:"transport_error",phase:"transport_connecting",retryable:!0,message:`Login connection closed unexpectedly${b?`: ${b}`:""}`}))},k=()=>{v(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",g),s?.on("connect_error",p),s?.on("disconnect",_),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 I,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=l=>{try{let c=this.encryptor.decode(l),f=c.action;if(typeof f!="string"||f==="game_auth"||f==="wait_queue_update")return;n?.onMessage?.({action:f,args:c.args??{}})}catch{}},u=l=>{n?.onDisconnect?.(l??null)};return i.on("message",d),i.on("disconnect",u),await new Promise((l,c)=>{let f=!1,v,y="transport_connecting",C=()=>{v!==void 0&&clearTimeout(v),i.off("connect",k),i.off("message",b),i.off("connect_error",S),i.off("disconnect",m),n?.signal?.removeEventListener("abort",O)},g=w=>{f||(f=!0,C(),s.abort(),i.off("message",d),i.off("disconnect",u),i.disconnect(),this.socket=null,c(w))},p=()=>{f||(f=!0,C(),l())},_=(w,P,E,B)=>{v!==void 0&&clearTimeout(v),v=setTimeout(()=>{g(new a({category:P,phase:E,retryable:!0,message:B}))},w)},k=async()=>{y="authenticating",this.reportLifecycle(n,"authenticating"),_(o.authenticationMs,"auth_timeout","authenticating","Game authentication timed out");try{if(await X(i,this.encryptor,s.signal),f)return;let w=this.encryptor.encode({action:"game_auth",args:{username:t.username,key:t.key,createToken:!1}});i.emit("message",w)}catch(w){if(f)return;g(new a({category:"transport_error",phase:"authenticating",retryable:!0,message:w instanceof Error?`Game handshake failed: ${w.message}`:"Game handshake failed",cause:w}))}},b=w=>{try{let P=this.encryptor.decode(w);switch(P.action){case"wait_queue_update":{let E=P.args;y="queueing",this.reportLifecycle(n,"queueing",E),n?.onQueueUpdate?.(E),_(o.queueMs,"queue_timeout","queueing","Game server queue stopped responding");break}case"game_auth":{if(!P.args.success){g(new a({category:"auth_failed",phase:"authenticating",retryable:!0,message:"Game authentication failed"}));return}this.reportLifecycle(n,"joining_session");let B=this.encryptor.encode({action:"join_server",args:{}});i.emit("message",B),p();break}}}catch{}},S=w=>{g(new a({category:"transport_error",phase:"transport_connecting",retryable:!0,message:`Game connection failed: ${w.message}`,cause:w}))},m=w=>{g(new a({category:"transport_error",phase:y,retryable:!0,message:`Disconnected before game authentication${w?`: ${w}`:""}`}))},O=()=>{g(new a({category:"aborted",phase:y,retryable:!0,message:"Game connection cancelled"}))};if(n?.signal?.aborted){O();return}i.on("connect",k),i.on("message",b),i.on("connect_error",S),i.on("disconnect",m),n?.signal?.addEventListener("abort",O,{once:!0}),_(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";async login(e,t){this.resetLoginState();let n=this.createSocket("/world/login/");return await new Promise((i,o)=>{let s=!1,d=setTimeout(()=>{l(new a({category:"login_timeout",phase:"transport_connecting",retryable:!0,message:"Login timed out"}))},t?.timeoutMs??L.loginMs),u=()=>{clearTimeout(d),n.off("connect",f),n.off("message",v),n.off("connect_error",y),n.off("disconnect",C),t?.signal?.removeEventListener("abort",g)},l=p=>{s||(s=!0,u(),n.disconnect(),o(p))},c=p=>{s||(s=!0,u(),n.disconnect(),i(p))},f=()=>{let p="token"in e?"token_login":"login",_="token"in e?{username:e.username,token:e.token}:{username:e.username,password:e.password};n.emit("message",{action:p,args:_})},v=p=>{if(p.action!=="login")return;let _=p.args;if(!_.success){this.loginMessage=_.message??null;let b=_.message??"Login failed",S=/password|credential|incorrect|invalid login/i.test(b);l(new a({category:S?"invalid_credentials":"login_rejected",phase:"transport_connecting",retryable:!1,message:b}));return}let k=Object.entries(_.populations).map(([b,S])=>({name:b,population:S}));c({servers:k,key:_.key,username:_.username,moderator:!1,buddyWorlds:[]})},y=p=>{l(new a({category:"transport_error",phase:"transport_connecting",retryable:!0,message:`Login connection failed: ${p.message}`,cause:p}))},C=p=>{l(new a({category:"transport_error",phase:"transport_connecting",retryable:!0,message:`Login connection closed unexpectedly${p?`: ${p}`:""}`}))},g=()=>{l(new a({category:"aborted",phase:"transport_connecting",retryable:!0,message:"Login cancelled"}))};if(t?.signal?.aborted){g();return}n.on("connect",f),n.on("message",v),n.on("connect_error",y),n.on("disconnect",C),t?.signal?.addEventListener("abort",g,{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 l=!1,c,f="transport_connecting",v=()=>{c!==void 0&&clearTimeout(c),r.off("connect",p),r.off("message",_),r.off("connect_error",k),r.off("disconnect",b),n?.signal?.removeEventListener("abort",S)},y=m=>{l||(l=!0,v(),r.off("message",o),r.off("disconnect",s),r.disconnect(),this.socket=null,u(m))},C=()=>{l||(l=!0,v(),d())},g=(m,O,w,P)=>{c!==void 0&&clearTimeout(c),c=setTimeout(()=>{y(new a({category:O,phase:w,retryable:!0,message:P}))},m)},p=()=>{f="authenticating",this.reportLifecycle(n,"authenticating"),g(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:""}})},_=m=>{switch(m.action){case"wait_queue_update":{let O=m.args;f="queueing",this.reportLifecycle(n,"queueing",O),n?.onQueueUpdate?.(O),g(i.queueMs,"queue_timeout","queueing","Game server queue stopped responding");break}case"game_auth":{if(!m.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=m=>{y(new a({category:"transport_error",phase:"transport_connecting",retryable:!0,message:`Game connection failed: ${m.message}`,cause:m}))},b=m=>{y(new a({category:"transport_error",phase:f,retryable:!0,message:`Disconnected before game authentication${m?`: ${m}`:""}`}))},S=()=>{y(new a({category:"aborted",phase:f,retryable:!0,message:"Game connection cancelled"}))};if(n?.signal?.aborted){S();return}r.on("connect",p),r.on("message",_),r.on("connect_error",k),r.on("disconnect",b),n?.signal?.addEventListener("abort",S,{once:!0}),g(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})}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:q,CPJourney:A,CPLegacy:x,NewCP:F,PenguinOrigins:D};function Z(h,e){return new Pe[h](j(e))}var R=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 q)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","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 R(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",c),this.off("join_room",c),this.off("kick",f),this.off("close_with_error",v),this.off("server_error",y),this.off("disconnect",C),e.signal?.removeEventListener("abort",g)},d=()=>{i||(i=!0,s(),n())},u=p=>{i||(i=!0,s(),r(p))},l=()=>{if(this.connectionFailure){u(this.connectionFailure);return}this.player!==null&&this.room!==null&&d()},c=()=>l(),f=({reason:p})=>{u(new a({category:"kicked",phase:"awaiting_initial_state",retryable:!0,message:`Kicked before initial state: ${p??"unknown"}`}))},v=({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}`:""}`}))},g=()=>{u(new a({category:"aborted",phase:"awaiting_initial_state",retryable:!0,message:"Initial state wait cancelled"}))};if(this.on("load_player",c),this.on("join_room",c),this.on("kick",f),this.on("close_with_error",v),this.on("server_error",y),this.on("disconnect",C),e.signal?.addEventListener("abort",g,{once:!0}),e.signal?.aborted){g();return}l(),!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){let i=typeof t=="number"?{timeoutMs:t}:t,o=i?.timeoutMs??L.requestMs;return new Promise((s,d)=>{let u=!1,l,c=()=>{l!==void 0&&clearTimeout(l),this.off(e,f),this.off("disconnect",y),i?.signal?.removeEventListener("abort",C)},f=(g=>{u||r&&!r(g)||(u=!0,c(),s(g))}),v=g=>{u||(u=!0,c(),d(g))},y=g=>{v(new a({category:"disconnected",phase:"ready",retryable:!g?.intentional,message:`Disconnected while waiting for ${String(e)}${g?.reason?`: ${g.reason}`:""}`}))},C=()=>{v(new a({category:"aborted",phase:"ready",retryable:!0,message:`Cancelled while waiting for ${String(e)}`}))};if(i?.signal?.aborted){C();return}if(Number.isFinite(o)&&(l=setTimeout(()=>{v(new a({category:"operation_timeout",phase:"ready",retryable:!0,message:`Timed out waiting for ${String(e)}`}))},o)),this.on(e,f),this.once("disconnect",y),i?.signal?.addEventListener("abort",C,{once:!0}),n)try{n()}catch(g){if(g instanceof a){v(g);return}v(new a({category:"transport_error",phase:"ready",retryable:!0,message:`Failed to send request for ${String(e)}`,cause:g}))}})}request(e,t,n,r){let i=this.requestTails.get(e),o=this.disconnectEpoch,s=()=>{},d=new Promise(c=>{s=c}),u=i?i.then(()=>d):d;return this.requestTails.set(e,u),(i?this.waitForRequestTurn(e,i,o,n?.signal).then(()=>this.waitForEvent(e,n,t,r)):this.waitForEvent(e,n,t,r)).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",l)},l=()=>{d||(d=!0,u(),s(i()))};r?.addEventListener("abort",l,{once:!0}),t.then(()=>{if(!d){if(d=!0,u(),this.disconnectEpoch!==n){let c=this.lastDisconnectInfo;s(new a({category:"disconnected",phase:"ready",retryable:!c?.intentional,message:`Disconnected before sending request for ${String(e)}${c?.reason?`: ${c.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 l=this.adapter.normalizeUser(u);this.users.set(l.id,l),d.push(l)}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 l=this.adapter.normalizeUser(u);this.users.set(l.id,l),d.push(l)}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=c=>{s in c?c[s]=d:(s in c.meta||this.adapter.id==="CPPS.lol")&&(c.meta[s]=d)},l=this.users.get(o);l&&u(l),this.player?.id===o&&this.player!==l&&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,R 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??[]})},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/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};
2
2
  //# sourceMappingURL=index.js.map