@shaunlwm/pickle.ts 1.12.2 → 1.12.4

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