@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 +12 -1
- package/dist/index.js +1 -1
- package/dist/index.js.map +1 -1
- package/package.json +1 -1
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
|