@shaunlwm/pickle.ts 0.0.1 → 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAkC,MAAM,aAAa,CAAA;AACpE,OAAO,EAAE,WAAW,EAAuB,MAAM,4BAA4B,CAAA"}
1
+ {"version":3,"sources":["../src/client.ts","../src/adapters/cpjourney-adapter.ts","../src/adapters/base-adapter.ts","../src/adapters/cplegacy-adapter.ts","../src/adapters/index.ts"],"sourcesContent":["import { EventEmitter } from \"node:events\"\nimport { createAdapter, type AdapterName } from \"./adapters/index.js\"\nimport type { BaseAdapter, ConnectOptions } from \"./adapters/base-adapter.js\"\nimport type { LoginOptions, LoginResult, QueueUpdate, ServerInfo, TokenLoginOptions } from \"./types/adapter-types.js\"\nimport type { ServerMessages } from \"./types/message-types.js\"\nimport type { PlayerData, RoomUser } from \"./types/player-types.js\"\n\ntype ServerMessageHandler<K extends keyof ServerMessages> = (args: ServerMessages[K]) => void\n\nexport type LogFn = (message: string, ...args: unknown[]) => void\n\nexport type ClientOptions = {\n debug?: boolean | LogFn\n}\n\ntype MessagePayload = {\n action: string\n args: Record<string, unknown>\n}\n\nfunction isMessagePayload(msg: unknown): msg is MessagePayload {\n return typeof msg === \"object\" && msg !== null && \"action\" in msg && \"args\" in msg\n}\n\nexport class Client extends EventEmitter {\n player: PlayerData | null = null\n room: number | null = null\n users: Map<number, RoomUser> = new Map()\n connected = false\n\n private adapter: BaseAdapter\n private loginResult: LoginResult | null = null\n private log: LogFn | null = null\n\n constructor(server: AdapterName, options?: ClientOptions) {\n super()\n this.adapter = createAdapter(server)\n\n if (options?.debug) {\n this.log = typeof options.debug === \"function\"\n ? options.debug\n : console.log.bind(console)\n }\n }\n\n async login(options: LoginOptions | TokenLoginOptions): Promise<ServerInfo[]> {\n this.log?.(\"[login] logging in as\", options.username)\n this.loginResult = await this.adapter.login(options)\n this.log?.(\"[login] success —\", this.loginResult.servers.length, \"servers\")\n return this.loginResult.servers\n }\n\n async connect(serverName: string, options?: ConnectOptions): Promise<void> {\n if (!this.loginResult) throw new Error(\"Must call login() first\")\n\n this.log?.(\"[connect] joining\", serverName)\n\n const connectOptions: ConnectOptions = {\n ...options,\n onQueueUpdate: (update: QueueUpdate) => {\n this.log?.(\"[queue]\", `#${update.position}/${update.queueLength}`)\n this.emit(\"wait_queue_update\", update)\n options?.onQueueUpdate?.(update)\n },\n }\n\n const socket = await this.adapter.connect(serverName, this.loginResult, connectOptions)\n\n socket.on(\"message\", (msg: unknown) => {\n if (!isMessagePayload(msg)) return\n this.handleMessage(msg)\n })\n\n socket.on(\"disconnect\", () => {\n this.log?.(\"[disconnect] connection lost\")\n this.cleanup()\n this.emit(\"disconnect\")\n })\n\n await new Promise<void>((resolve, reject) => {\n const timeout = setTimeout(() => {\n reject(new Error(\"Waiting for load_player timed out\"))\n }, 10_000)\n\n let playerLoaded = false\n let roomJoined = false\n\n const checkReady = (): void => {\n if (playerLoaded && roomJoined) {\n clearTimeout(timeout)\n this.connected = true\n resolve()\n }\n }\n\n const onMessage = (msg: unknown): void => {\n if (!isMessagePayload(msg)) return\n switch (msg.action) {\n case \"load_player\":\n playerLoaded = true\n checkReady()\n break\n case \"join_room\":\n roomJoined = true\n checkReady()\n break\n case \"kick\":\n clearTimeout(timeout)\n socket.off(\"message\", onMessage)\n reject(new Error(`Kicked: ${(msg.args as { reason?: string }).reason ?? \"unknown\"}`))\n break\n case \"close_with_error\":\n clearTimeout(timeout)\n socket.off(\"message\", onMessage)\n reject(new Error(`Kicked: ${(msg.args as { error?: string }).error ?? \"unknown\"}`))\n break\n }\n }\n\n const onDisconnect = (): void => {\n if (!playerLoaded || !roomJoined) {\n clearTimeout(timeout)\n reject(new Error(\"Disconnected before fully loaded\"))\n }\n }\n\n socket.on(\"message\", onMessage)\n socket.once(\"disconnect\", onDisconnect)\n })\n }\n\n on<K extends keyof ServerMessages>(event: K, listener: ServerMessageHandler<K>): this\n on(event: string, listener: (...args: unknown[]) => void): this\n on(event: string, listener: (...args: unknown[]) => void): this {\n return super.on(event, listener)\n }\n\n off<K extends keyof ServerMessages>(event: K, listener: ServerMessageHandler<K>): this\n off(event: string, listener: (...args: unknown[]) => void): this\n off(event: string, listener: (...args: unknown[]) => void): this {\n return super.off(event, listener)\n }\n\n once<K extends keyof ServerMessages>(event: K, listener: ServerMessageHandler<K>): this\n once(event: string, listener: (...args: unknown[]) => void): this\n once(event: string, listener: (...args: unknown[]) => void): this {\n return super.once(event, listener)\n }\n\n emit<K extends keyof ServerMessages>(event: K, args: ServerMessages[K]): boolean\n emit(event: string, ...args: unknown[]): boolean\n emit(event: string, ...args: unknown[]): boolean {\n return super.emit(event, ...args)\n }\n\n sendMessage(message: string): void { this.adapter.sendMessage(message) }\n sendEmote(emote: number): void { this.adapter.sendEmote(emote) }\n sendSafe(safe: number): void { this.adapter.sendSafe(safe) }\n walk(x: number, y: number): void { this.adapter.walk(x, y) }\n sendFrame(frame: number, set?: boolean): void { this.adapter.sendFrame(frame, set) }\n snowball(x: number, y: number): void { this.adapter.snowball(x, y) }\n joinRoom(room: number, x?: number, y?: number): void { this.adapter.joinRoom(room, x, y) }\n addItem(item: number): void { this.adapter.addItem(item) }\n equipColor(item: number): void { this.adapter.equipColor(item) }\n equipHead(item: number): void { this.adapter.equipHead(item) }\n equipFace(item: number): void { this.adapter.equipFace(item) }\n equipNeck(item: number): void { this.adapter.equipNeck(item) }\n equipBody(item: number): void { this.adapter.equipBody(item) }\n equipHand(item: number): void { this.adapter.equipHand(item) }\n equipFeet(item: number): void { this.adapter.equipFeet(item) }\n equipFlag(item: number): void { this.adapter.equipFlag(item) }\n equipPhoto(item: number): void { this.adapter.equipPhoto(item) }\n buddyRequest(id: number): void { this.adapter.buddyRequest(id) }\n buddyAccept(id: number): void { this.adapter.buddyAccept(id) }\n buddyReject(id: number): void { this.adapter.buddyReject(id) }\n buddyRequestSeen(id: number): void { this.adapter.buddyRequestSeen(id) }\n getBuddy(id: number, type: \"buddies\" | \"buddyRequests\"): void { this.adapter.getBuddy(id, type) }\n removeBuddy(id: number): void { this.adapter.removeBuddy(id) }\n addIgnore(id: number): void { this.adapter.addIgnore(id) }\n removeIgnore(id: number): void { this.adapter.removeIgnore(id) }\n getPlayer(id: number): void { this.adapter.getPlayer(id) }\n getAllSlots(): void { this.adapter.getAllSlots() }\n getMascots(): void { this.adapter.getMascots() }\n sendPostcard(userId: number, cardId: string): void { this.adapter.sendPostcard(userId, cardId) }\n getStamps(userId: number): void { this.adapter.getStamps(userId) }\n getIglooOpen(igloo: number): void { this.adapter.getIglooOpen(igloo) }\n joinIgloo(igloo: number, x?: number, y?: number): void { this.adapter.joinIgloo(igloo, x, y) }\n\n sleep(ms: number): Promise<void> {\n return new Promise(resolve => setTimeout(resolve, ms))\n }\n\n disconnect(): void {\n this.log?.(\"[disconnect] closing connection\")\n this.adapter.disconnect()\n this.cleanup()\n }\n\n private cleanup(): void {\n this.connected = false\n this.player = null\n this.room = null\n this.users.clear()\n }\n\n private handleMessage(msg: MessagePayload): void {\n const { action, args } = msg\n\n switch (action) {\n case \"load_player\": {\n const user = args.user as PlayerData\n this.player = user\n this.log?.(\"[load_player]\", user.username, `id=${user.id}`)\n break\n }\n case \"join_room\": {\n const room = args.room as number\n const users = args.users as RoomUser[]\n this.room = room\n this.users.clear()\n for (const user of users) {\n this.users.set(user.id, user)\n }\n this.log?.(\"[join_room]\", `room=${room}`, `users=${users.length}`)\n break\n }\n case \"add_player\": {\n const user = args.user as RoomUser\n this.users.set(user.id, user)\n this.log?.(\"[add_player]\", user.username, `id=${user.id}`)\n break\n }\n case \"remove_player\": {\n const id = args.user as number\n this.users.delete(id)\n this.log?.(\"[remove_player]\", `id=${id}`)\n break\n }\n case \"send_position\": {\n const id = args.id as number\n const user = this.users.get(id)\n if (user) {\n user.x = args.x as number\n user.y = args.y as number\n }\n break\n }\n case \"send_frame\": {\n const id = args.id as number\n const user = this.users.get(id)\n if (user) {\n user.frame = args.frame as number\n }\n break\n }\n case \"update_player\": {\n const id = args.id as number\n const slot = args.slot as string\n const item = args.item as number\n const user = this.users.get(id)\n if (user && slot in user) {\n (user as Record<string, unknown>)[slot] = item\n }\n break\n }\n case \"kick\": {\n const reason = (args as { reason?: string }).reason ?? \"unknown\"\n this.log?.(\"[kick]\", reason)\n this.cleanup()\n break\n }\n case \"close_with_error\": {\n const error = (args as { error?: string }).error ?? \"unknown\"\n this.log?.(\"[kick]\", error)\n this.cleanup()\n break\n }\n default: {\n this.log?.(`[${action}]`, JSON.stringify(args))\n break\n }\n }\n\n this.emit(action, args)\n }\n}\n","import { io, type Socket } from \"socket.io-client\"\nimport msgpackParser from \"socket.io-msgpack-parser\"\nimport type { LoginOptions, LoginResult, QueueUpdate, ServerInfo, TokenLoginOptions } from \"../types/adapter-types.js\"\nimport { BaseAdapter, type ConnectOptions } from \"./base-adapter.js\"\n\nconst BASE_URL = \"wss://play.cpjourney.net\"\nconst DEFAULT_SECRET = \"skip\"\n\ntype LoginResponse = {\n success: boolean\n username: string\n key: string\n populations: Record<string, number>\n moderator: boolean\n buddyWorlds: string[]\n}\n\ntype GameAuthResponse = {\n success: boolean\n token?: string\n}\n\ntype ServerMessage = {\n action: string\n args: Record<string, unknown>\n}\n\nexport class CpjourneyAdapter extends BaseAdapter {\n readonly id = \"CPJourney\"\n\n async login(options: LoginOptions | TokenLoginOptions): Promise<LoginResult> {\n const loginSocket = this.createSocket(\"/world/login/\")\n\n const result = await new Promise<LoginResult>((resolve, reject) => {\n const timeout = setTimeout(() => {\n loginSocket.disconnect()\n reject(new Error(\"Login timed out\"))\n }, 10_000)\n\n loginSocket.on(\"connect\", () => {\n const secret = options.secret ?? DEFAULT_SECRET\n const args = \"token\" in options\n ? { username: options.username, token: options.token, secret }\n : { username: options.username, password: options.password, secret }\n\n loginSocket.emit(\"message\", { action: \"login\", args })\n })\n\n loginSocket.on(\"message\", (msg: ServerMessage) => {\n if (msg.action !== \"login\") return\n\n clearTimeout(timeout)\n loginSocket.disconnect()\n\n const response = msg.args as LoginResponse\n\n if (!response.success) {\n reject(new Error(\"Login failed\"))\n return\n }\n\n const servers: ServerInfo[] = Object.entries(response.populations).map(\n ([name, population]) => ({ name, population })\n )\n\n resolve({\n servers,\n key: response.key,\n username: response.username,\n moderator: response.moderator,\n buddyWorlds: response.buddyWorlds ?? [],\n })\n })\n\n loginSocket.on(\"connect_error\", (err: Error) => {\n clearTimeout(timeout)\n loginSocket.disconnect()\n reject(new Error(`Login connection failed: ${err.message}`))\n })\n })\n\n return result\n }\n\n async connect(serverName: string, loginResult: LoginResult, options?: ConnectOptions): Promise<Socket> {\n const gameSocket = this.createSocket(`/world/${serverName.toLowerCase()}/`)\n this.socket = gameSocket\n\n await new Promise<void>((resolve, reject) => {\n let authSent = false\n\n gameSocket.on(\"connect\", () => {\n gameSocket.emit(\"message\", {\n action: \"game_auth\",\n args: {\n username: loginResult.username,\n key: loginResult.key,\n createToken: false,\n joinInvis: false,\n takeoverMascot: false,\n token: \"\",\n },\n })\n })\n\n gameSocket.on(\"message\", (msg: ServerMessage) => {\n switch (msg.action) {\n case \"wait_queue_update\": {\n options?.onQueueUpdate?.(msg.args as QueueUpdate)\n break\n }\n case \"game_auth\": {\n if (authSent) break\n authSent = true\n\n const response = msg.args as GameAuthResponse\n if (!response.success) {\n gameSocket.disconnect()\n reject(new Error(\"Game auth failed\"))\n return\n }\n\n gameSocket.emit(\"message\", { action: \"join_server\", args: {} })\n resolve()\n break\n }\n }\n })\n\n gameSocket.on(\"connect_error\", (err: Error) => {\n gameSocket.disconnect()\n reject(new Error(`Game connection failed: ${err.message}`))\n })\n })\n\n return gameSocket\n }\n\n send(action: string, args: Record<string, unknown>): void {\n if (!this.socket) throw new Error(\"Not connected\")\n this.socket.emit(\"message\", { action, args })\n }\n\n disconnect(): void {\n this.socket?.disconnect()\n this.socket = null\n }\n\n private createSocket(path: string): Socket {\n return io(BASE_URL, {\n path,\n parser: msgpackParser,\n transports: [\"polling\", \"websocket\"],\n reconnection: false,\n })\n }\n}\n","import type { Socket } from \"socket.io-client\"\nimport type { LoginOptions, LoginResult, QueueUpdate, TokenLoginOptions } from \"../types/adapter-types.js\"\n\nexport type ConnectOptions = {\n onQueueUpdate?: (update: QueueUpdate) => void\n}\n\nexport abstract class BaseAdapter {\n abstract readonly id: string\n protected socket: Socket | null = null\n\n abstract login(options: LoginOptions | TokenLoginOptions): Promise<LoginResult>\n abstract connect(serverName: string, loginResult: LoginResult, options?: ConnectOptions): Promise<Socket>\n abstract disconnect(): void\n abstract send(action: string, args: Record<string, unknown>): void\n\n sendMessage(message: string): void {\n this.send(\"send_message\", { message })\n }\n\n sendEmote(emote: number): void {\n this.send(\"send_emote\", { emote })\n }\n\n sendSafe(safe: number): void {\n this.send(\"send_safe\", { safe })\n }\n\n walk(x: number, y: number): void {\n this.send(\"send_position\", { x, y })\n }\n\n sendFrame(frame: number, set?: boolean): void {\n this.send(\"send_frame\", { frame, set })\n }\n\n snowball(x: number, y: number): void {\n this.send(\"snowball\", { x, y })\n }\n\n joinRoom(room: number, x?: number, y?: number): void {\n this.send(\"join_room\", { room, x: x ?? 0, y: y ?? 0 })\n }\n\n addItem(item: number): void {\n this.send(\"add_item\", { item })\n }\n\n equipColor(item: number): void {\n this.send(\"update_color\", { item })\n }\n\n equipHead(item: number): void {\n this.send(\"update_head\", { item })\n }\n\n equipFace(item: number): void {\n this.send(\"update_face\", { item })\n }\n\n equipNeck(item: number): void {\n this.send(\"update_neck\", { item })\n }\n\n equipBody(item: number): void {\n this.send(\"update_body\", { item })\n }\n\n equipHand(item: number): void {\n this.send(\"update_hand\", { item })\n }\n\n equipFeet(item: number): void {\n this.send(\"update_feet\", { item })\n }\n\n equipFlag(item: number): void {\n this.send(\"update_flag\", { item })\n }\n\n equipPhoto(item: number): void {\n this.send(\"update_photo\", { item })\n }\n\n buddyRequest(id: number): void {\n this.send(\"buddy_request\", { id })\n }\n\n buddyAccept(id: number): void {\n this.send(\"buddy_accept\", { id })\n }\n\n buddyReject(id: number): void {\n this.send(\"buddy_reject\", { id })\n }\n\n buddyRequestSeen(id: number): void {\n this.send(\"buddy_request_seen\", { id })\n }\n\n getBuddy(id: number, type: \"buddies\" | \"buddyRequests\"): void {\n this.send(\"get_buddy\", { id, type })\n }\n\n removeBuddy(id: number): void {\n this.send(\"remove_buddy\", { id })\n }\n\n addIgnore(id: number): void {\n this.send(\"ignore_add\", { id })\n }\n\n removeIgnore(id: number): void {\n this.send(\"ignore_remove\", { id })\n }\n\n getPlayer(id: number): void {\n this.send(\"get_player\", { id })\n }\n\n getAllSlots(): void {\n this.send(\"get_all_slots\", {})\n }\n\n getMascots(): void {\n this.send(\"get_mascots\", {})\n }\n\n sendPostcard(userId: number, cardId: string): void {\n this.send(\"send_postcard\", { userId, cardId })\n }\n\n getStamps(userId: number): void {\n this.send(\"get_stamps\", { userId })\n }\n\n getIglooOpen(igloo: number): void {\n this.send(\"get_igloo_open\", { igloo })\n }\n\n joinIgloo(igloo: number, x?: number, y?: number): void {\n this.send(\"join_igloo\", { igloo, x: x ?? 0, y: y ?? 0 })\n }\n}\n","import { io, type Socket } from \"socket.io-client\"\nimport msgpackParser from \"socket.io-msgpack-parser\"\nimport type { LoginOptions, LoginResult, QueueUpdate, ServerInfo, TokenLoginOptions } from \"../types/adapter-types.js\"\nimport { BaseAdapter, type ConnectOptions } from \"./base-adapter.js\"\n\nconst LOGIN_URL = \"https://api.cplegacy.com/login\"\nconst TOKEN_LOGIN_URL = \"https://api.cplegacy.com/token_login\"\n\ntype LoginResponse = {\n success: boolean\n username: string\n key: string\n populations: Record<string, number>\n requires2FA: boolean\n message?: string\n wantedVersion?: string\n}\n\ntype GameAuthResponse = {\n success: boolean\n}\n\n/**\n * Wraps a CPLegacy socket to normalize its positional message format\n * `(\"message\", action, args)` into the `{ action, args }` envelope\n * that the Client class expects.\n */\nfunction wrapSocket(raw: Socket): Socket {\n const original = raw.on.bind(raw)\n\n raw.on = function (event: string, listener: (...args: unknown[]) => void) {\n if (event === \"message\") {\n return original(event, (action: unknown, args: unknown) => {\n listener({ action, args: args ?? {} })\n })\n }\n return original(event, listener)\n } as typeof raw.on\n\n return raw\n}\n\nexport class CplegacyAdapter extends BaseAdapter {\n readonly id = \"CPLegacy\"\n private version = \"\"\n\n async login(options: LoginOptions | TokenLoginOptions): Promise<LoginResult> {\n const url = \"token\" in options ? TOKEN_LOGIN_URL : LOGIN_URL\n const body: Record<string, unknown> = \"token\" in options\n ? { username: options.username, token: options.token }\n : { username: options.username, password: options.password, version: this.version }\n\n let data = await this.postLogin(url, body)\n\n // Version negotiation: server returns wantedVersion when ours is stale/empty\n if (!data.success && data.wantedVersion) {\n this.version = data.wantedVersion\n body.version = this.version\n data = await this.postLogin(url, body)\n }\n\n if (!data.success) {\n throw new Error(`Login failed: ${data.message ?? \"unknown error\"}`)\n }\n\n const servers: ServerInfo[] = Object.entries(data.populations ?? {}).map(\n ([name, population]) => ({ name, population })\n )\n\n return {\n servers,\n key: data.key,\n username: data.username,\n moderator: false,\n buddyWorlds: [],\n }\n }\n\n async connect(serverName: string, loginResult: LoginResult, options?: ConnectOptions): Promise<Socket> {\n const wsUrl = `wss://${serverName.toLowerCase()}.server.cplegacy.com`\n const rawSocket = io(wsUrl, {\n path: \"/socket.io/\",\n parser: msgpackParser,\n transports: [\"websocket\"],\n reconnection: false,\n })\n this.socket = rawSocket\n\n await new Promise<void>((resolve, reject) => {\n const timeout = setTimeout(() => {\n rawSocket.disconnect()\n reject(new Error(\"Game connection timed out\"))\n }, 15_000)\n\n rawSocket.on(\"connect\", () => {\n rawSocket.emit(\"message\", \"game_auth\", {\n username: loginResult.username,\n key: loginResult.key,\n createToken: false,\n token: \"\",\n })\n })\n\n rawSocket.on(\"message\", (action: string, args: Record<string, unknown>) => {\n switch (action) {\n case \"wait_queue_update\": {\n options?.onQueueUpdate?.(args as unknown as QueueUpdate)\n break\n }\n case \"game_auth\": {\n const response = args as unknown as GameAuthResponse\n if (!response.success) {\n clearTimeout(timeout)\n rawSocket.disconnect()\n reject(new Error(\"Game auth failed\"))\n return\n }\n\n // CPLegacy requires explicitly requesting load_player before join_server\n rawSocket.emit(\"message\", \"load_player\", {})\n rawSocket.emit(\"message\", \"join_server\", {})\n clearTimeout(timeout)\n resolve()\n break\n }\n }\n })\n\n rawSocket.on(\"connect_error\", (err: Error) => {\n clearTimeout(timeout)\n rawSocket.disconnect()\n reject(new Error(`Game connection failed: ${err.message}`))\n })\n })\n\n // Return wrapped socket so Client receives normalized { action, args } messages\n return wrapSocket(rawSocket)\n }\n\n send(action: string, args: Record<string, unknown>): void {\n if (!this.socket) throw new Error(\"Not connected\")\n this.socket.emit(\"message\", action, args)\n }\n\n disconnect(): void {\n this.socket?.disconnect()\n this.socket = null\n }\n\n private async postLogin(url: string, body: Record<string, unknown>): Promise<LoginResponse> {\n const resp = await fetch(url, {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n Accept: \"application/json\",\n },\n body: JSON.stringify(body),\n })\n\n return resp.json() as Promise<LoginResponse>\n }\n}\n","import type { BaseAdapter } from \"./base-adapter.js\"\nimport { CpjourneyAdapter } from \"./cpjourney-adapter.js\"\nimport { CplegacyAdapter } from \"./cplegacy-adapter.js\"\n\nconst ADAPTERS = {\n CPJourney: CpjourneyAdapter,\n CPLegacy: CplegacyAdapter,\n} as const\n\nexport type AdapterName = keyof typeof ADAPTERS\n\nexport function createAdapter(name: AdapterName): BaseAdapter {\n return new ADAPTERS[name]()\n}\n"],"mappings":"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","names":["EventEmitter","io","msgpackParser","BaseAdapter","message","emote","safe","x","y","frame","set","room","item","id","type","userId","cardId","igloo","BASE_URL","DEFAULT_SECRET","CpjourneyAdapter","BaseAdapter","options","loginSocket","resolve","reject","timeout","secret","args","msg","response","servers","name","population","err","serverName","loginResult","gameSocket","authSent","action","path","io","msgpackParser","io","msgpackParser","LOGIN_URL","TOKEN_LOGIN_URL","wrapSocket","raw","original","event","listener","action","args","CplegacyAdapter","BaseAdapter","options","url","body","data","name","population","serverName","loginResult","wsUrl","rawSocket","io","msgpackParser","resolve","reject","timeout","err","ADAPTERS","CpjourneyAdapter","CplegacyAdapter","createAdapter","name","isMessagePayload","msg","Client","EventEmitter","server","options","createAdapter","serverName","connectOptions","update","socket","resolve","reject","timeout","playerLoaded","roomJoined","checkReady","onMessage","onDisconnect","event","listener","args","message","emote","safe","x","y","frame","set","room","item","id","type","userId","cardId","igloo","ms","action","user","users","slot","reason","error"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@shaunlwm/pickle.ts",
3
- "version": "0.0.1",
3
+ "version": "0.1.0",
4
4
  "description": "Club Penguin Private Server client library",
5
5
  "type": "module",
6
6
  "main": "./dist/index.js",
@@ -12,8 +12,8 @@
12
12
  }
13
13
  },
14
14
  "scripts": {
15
- "build": "tsc",
16
- "dev": "tsc --watch",
15
+ "build": "tsup",
16
+ "dev": "tsup --watch",
17
17
  "typecheck": "tsc --noEmit",
18
18
  "prepare": "npm run build",
19
19
  "prepublishOnly": "npm run build"
@@ -24,10 +24,15 @@
24
24
  },
25
25
  "devDependencies": {
26
26
  "@types/node": "^22.0.0",
27
+ "tsup": "^8.5.1",
27
28
  "typescript": "^5.7.2"
28
29
  },
29
30
  "files": [
30
31
  "dist"
31
32
  ],
33
+ "repository": {
34
+ "type": "git",
35
+ "url": "https://github.com/ShaunLWM/pickle.ts"
36
+ },
32
37
  "license": "MIT"
33
38
  }
@@ -1,39 +0,0 @@
1
- import type { Socket } from "socket.io-client";
2
- import type { LoginOptions, LoginResult, QueueUpdate, TokenLoginOptions } from "../types/adapter-types.js";
3
- export type ConnectOptions = {
4
- onQueueUpdate?: (update: QueueUpdate) => void;
5
- };
6
- export declare abstract class BaseAdapter {
7
- abstract readonly id: string;
8
- protected socket: Socket | null;
9
- abstract login(options: LoginOptions | TokenLoginOptions): Promise<LoginResult>;
10
- abstract connect(serverName: string, loginResult: LoginResult, options?: ConnectOptions): Promise<Socket>;
11
- abstract disconnect(): void;
12
- abstract send(action: string, args: Record<string, unknown>): void;
13
- sendMessage(message: string): void;
14
- sendEmote(emote: number): void;
15
- sendSafe(safe: number): void;
16
- walk(x: number, y: number): void;
17
- sendFrame(frame: number, set?: boolean): void;
18
- snowball(x: number, y: number): void;
19
- joinRoom(room: number, x?: number, y?: number): void;
20
- addItem(item: number): void;
21
- equipColor(item: number): void;
22
- equipHead(item: number): void;
23
- equipFace(item: number): void;
24
- equipNeck(item: number): void;
25
- equipBody(item: number): void;
26
- equipHand(item: number): void;
27
- equipFeet(item: number): void;
28
- equipFlag(item: number): void;
29
- equipPhoto(item: number): void;
30
- buddyRequest(id: number): void;
31
- buddyAccept(id: number): void;
32
- removeBuddy(id: number): void;
33
- addIgnore(id: number): void;
34
- removeIgnore(id: number): void;
35
- getPlayer(id: number): void;
36
- getAllSlots(): void;
37
- getMascots(): void;
38
- }
39
- //# sourceMappingURL=base-adapter.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"base-adapter.d.ts","sourceRoot":"","sources":["../../src/adapters/base-adapter.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,kBAAkB,CAAA;AAC9C,OAAO,KAAK,EAAE,YAAY,EAAE,WAAW,EAAE,WAAW,EAAE,iBAAiB,EAAE,MAAM,2BAA2B,CAAA;AAE1G,MAAM,MAAM,cAAc,GAAG;IAC3B,aAAa,CAAC,EAAE,CAAC,MAAM,EAAE,WAAW,KAAK,IAAI,CAAA;CAC9C,CAAA;AAED,8BAAsB,WAAW;IAC/B,QAAQ,CAAC,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAA;IAC5B,SAAS,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI,CAAO;IAEtC,QAAQ,CAAC,KAAK,CAAC,OAAO,EAAE,YAAY,GAAG,iBAAiB,GAAG,OAAO,CAAC,WAAW,CAAC;IAC/E,QAAQ,CAAC,OAAO,CAAC,UAAU,EAAE,MAAM,EAAE,WAAW,EAAE,WAAW,EAAE,OAAO,CAAC,EAAE,cAAc,GAAG,OAAO,CAAC,MAAM,CAAC;IACzG,QAAQ,CAAC,UAAU,IAAI,IAAI;IAC3B,QAAQ,CAAC,IAAI,CAAC,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI;IAElE,WAAW,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI;IAIlC,SAAS,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI;IAI9B,QAAQ,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI;IAI5B,IAAI,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,GAAG,IAAI;IAIhC,SAAS,CAAC,KAAK,EAAE,MAAM,EAAE,GAAG,CAAC,EAAE,OAAO,GAAG,IAAI;IAI7C,QAAQ,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,GAAG,IAAI;IAIpC,QAAQ,CAAC,IAAI,EAAE,MAAM,EAAE,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,CAAC,EAAE,MAAM,GAAG,IAAI;IAIpD,OAAO,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI;IAI3B,UAAU,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI;IAI9B,SAAS,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI;IAI7B,SAAS,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI;IAI7B,SAAS,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI;IAI7B,SAAS,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI;IAI7B,SAAS,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI;IAI7B,SAAS,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI;IAI7B,SAAS,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI;IAI7B,UAAU,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI;IAI9B,YAAY,CAAC,EAAE,EAAE,MAAM,GAAG,IAAI;IAI9B,WAAW,CAAC,EAAE,EAAE,MAAM,GAAG,IAAI;IAI7B,WAAW,CAAC,EAAE,EAAE,MAAM,GAAG,IAAI;IAI7B,SAAS,CAAC,EAAE,EAAE,MAAM,GAAG,IAAI;IAI3B,YAAY,CAAC,EAAE,EAAE,MAAM,GAAG,IAAI;IAI9B,SAAS,CAAC,EAAE,EAAE,MAAM,GAAG,IAAI;IAI3B,WAAW,IAAI,IAAI;IAInB,UAAU,IAAI,IAAI;CAGnB"}
@@ -1,79 +0,0 @@
1
- export class BaseAdapter {
2
- socket = null;
3
- sendMessage(message) {
4
- this.send("send_message", { message });
5
- }
6
- sendEmote(emote) {
7
- this.send("send_emote", { emote });
8
- }
9
- sendSafe(safe) {
10
- this.send("send_safe", { safe });
11
- }
12
- walk(x, y) {
13
- this.send("send_position", { x, y });
14
- }
15
- sendFrame(frame, set) {
16
- this.send("send_frame", { frame, set });
17
- }
18
- snowball(x, y) {
19
- this.send("snowball", { x, y });
20
- }
21
- joinRoom(room, x, y) {
22
- this.send("join_room", { room, x: x ?? 0, y: y ?? 0 });
23
- }
24
- addItem(item) {
25
- this.send("add_item", { item });
26
- }
27
- equipColor(item) {
28
- this.send("update_color", { item });
29
- }
30
- equipHead(item) {
31
- this.send("update_head", { item });
32
- }
33
- equipFace(item) {
34
- this.send("update_face", { item });
35
- }
36
- equipNeck(item) {
37
- this.send("update_neck", { item });
38
- }
39
- equipBody(item) {
40
- this.send("update_body", { item });
41
- }
42
- equipHand(item) {
43
- this.send("update_hand", { item });
44
- }
45
- equipFeet(item) {
46
- this.send("update_feet", { item });
47
- }
48
- equipFlag(item) {
49
- this.send("update_flag", { item });
50
- }
51
- equipPhoto(item) {
52
- this.send("update_photo", { item });
53
- }
54
- buddyRequest(id) {
55
- this.send("buddy_request", { id });
56
- }
57
- buddyAccept(id) {
58
- this.send("buddy_accept", { id });
59
- }
60
- removeBuddy(id) {
61
- this.send("remove_buddy", { id });
62
- }
63
- addIgnore(id) {
64
- this.send("add_ignore", { id });
65
- }
66
- removeIgnore(id) {
67
- this.send("remove_ignore", { id });
68
- }
69
- getPlayer(id) {
70
- this.send("get_player", { id });
71
- }
72
- getAllSlots() {
73
- this.send("get_all_slots", {});
74
- }
75
- getMascots() {
76
- this.send("get_mascots", {});
77
- }
78
- }
79
- //# sourceMappingURL=base-adapter.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"base-adapter.js","sourceRoot":"","sources":["../../src/adapters/base-adapter.ts"],"names":[],"mappings":"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"}
@@ -1,12 +0,0 @@
1
- import { type Socket } from "socket.io-client";
2
- import type { LoginOptions, LoginResult, TokenLoginOptions } from "../types/adapter-types.js";
3
- import { BaseAdapter, type ConnectOptions } from "./base-adapter.js";
4
- export declare class CpjourneyAdapter extends BaseAdapter {
5
- readonly id = "CPJourney";
6
- login(options: LoginOptions | TokenLoginOptions): Promise<LoginResult>;
7
- connect(serverName: string, loginResult: LoginResult, options?: ConnectOptions): Promise<Socket>;
8
- send(action: string, args: Record<string, unknown>): void;
9
- disconnect(): void;
10
- private createSocket;
11
- }
12
- //# sourceMappingURL=cpjourney-adapter.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"cpjourney-adapter.d.ts","sourceRoot":"","sources":["../../src/adapters/cpjourney-adapter.ts"],"names":[],"mappings":"AAAA,OAAO,EAAM,KAAK,MAAM,EAAE,MAAM,kBAAkB,CAAA;AAElD,OAAO,KAAK,EAAE,YAAY,EAAE,WAAW,EAA2B,iBAAiB,EAAE,MAAM,2BAA2B,CAAA;AACtH,OAAO,EAAE,WAAW,EAAE,KAAK,cAAc,EAAE,MAAM,mBAAmB,CAAA;AAwBpE,qBAAa,gBAAiB,SAAQ,WAAW;IAC/C,QAAQ,CAAC,EAAE,eAAc;IAEnB,KAAK,CAAC,OAAO,EAAE,YAAY,GAAG,iBAAiB,GAAG,OAAO,CAAC,WAAW,CAAC;IAsDtE,OAAO,CAAC,UAAU,EAAE,MAAM,EAAE,WAAW,EAAE,WAAW,EAAE,OAAO,CAAC,EAAE,cAAc,GAAG,OAAO,CAAC,MAAM,CAAC;IAsDtG,IAAI,CAAC,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI;IAKzD,UAAU,IAAI,IAAI;IAKlB,OAAO,CAAC,YAAY;CAQrB"}
@@ -1,114 +0,0 @@
1
- import { io } from "socket.io-client";
2
- import msgpackParser from "socket.io-msgpack-parser";
3
- import { BaseAdapter } from "./base-adapter.js";
4
- const BASE_URL = "wss://play.cpjourney.net";
5
- const DEFAULT_SECRET = "skip";
6
- export class CpjourneyAdapter extends BaseAdapter {
7
- id = "CPJourney";
8
- async login(options) {
9
- const loginSocket = this.createSocket("/world/login/");
10
- const result = await new Promise((resolve, reject) => {
11
- const timeout = setTimeout(() => {
12
- loginSocket.disconnect();
13
- reject(new Error("Login timed out"));
14
- }, 10_000);
15
- loginSocket.on("connect", () => {
16
- const secret = options.secret ?? DEFAULT_SECRET;
17
- const args = "token" in options
18
- ? { username: options.username, token: options.token, secret }
19
- : { username: options.username, password: options.password, secret };
20
- loginSocket.emit("message", { action: "login", args });
21
- });
22
- loginSocket.on("message", (msg) => {
23
- if (msg.action !== "login")
24
- return;
25
- clearTimeout(timeout);
26
- loginSocket.disconnect();
27
- const response = msg.args;
28
- if (!response.success) {
29
- reject(new Error("Login failed"));
30
- return;
31
- }
32
- const servers = Object.entries(response.populations).map(([name, population]) => ({ name, population }));
33
- resolve({
34
- servers,
35
- key: response.key,
36
- username: response.username,
37
- moderator: response.moderator,
38
- buddyWorlds: response.buddyWorlds ?? [],
39
- });
40
- });
41
- loginSocket.on("connect_error", (err) => {
42
- clearTimeout(timeout);
43
- loginSocket.disconnect();
44
- reject(new Error(`Login connection failed: ${err.message}`));
45
- });
46
- });
47
- return result;
48
- }
49
- async connect(serverName, loginResult, options) {
50
- const gameSocket = this.createSocket(`/world/${serverName.toLowerCase()}/`);
51
- this.socket = gameSocket;
52
- await new Promise((resolve, reject) => {
53
- let authSent = false;
54
- gameSocket.on("connect", () => {
55
- gameSocket.emit("message", {
56
- action: "game_auth",
57
- args: {
58
- username: loginResult.username,
59
- key: loginResult.key,
60
- createToken: false,
61
- joinInvis: false,
62
- takeoverMascot: false,
63
- token: "",
64
- },
65
- });
66
- });
67
- gameSocket.on("message", (msg) => {
68
- switch (msg.action) {
69
- case "wait_queue_update": {
70
- options?.onQueueUpdate?.(msg.args);
71
- break;
72
- }
73
- case "game_auth": {
74
- if (authSent)
75
- break;
76
- authSent = true;
77
- const response = msg.args;
78
- if (!response.success) {
79
- gameSocket.disconnect();
80
- reject(new Error("Game auth failed"));
81
- return;
82
- }
83
- gameSocket.emit("message", { action: "join_server", args: {} });
84
- resolve();
85
- break;
86
- }
87
- }
88
- });
89
- gameSocket.on("connect_error", (err) => {
90
- gameSocket.disconnect();
91
- reject(new Error(`Game connection failed: ${err.message}`));
92
- });
93
- });
94
- return gameSocket;
95
- }
96
- send(action, args) {
97
- if (!this.socket)
98
- throw new Error("Not connected");
99
- this.socket.emit("message", { action, args });
100
- }
101
- disconnect() {
102
- this.socket?.disconnect();
103
- this.socket = null;
104
- }
105
- createSocket(path) {
106
- return io(BASE_URL, {
107
- path,
108
- parser: msgpackParser,
109
- transports: ["polling", "websocket"],
110
- reconnection: false,
111
- });
112
- }
113
- }
114
- //# sourceMappingURL=cpjourney-adapter.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"cpjourney-adapter.js","sourceRoot":"","sources":["../../src/adapters/cpjourney-adapter.ts"],"names":[],"mappings":"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"}
@@ -1,9 +0,0 @@
1
- import type { BaseAdapter } from "./base-adapter.js";
2
- import { CpjourneyAdapter } from "./cpjourney-adapter.js";
3
- declare const ADAPTERS: {
4
- readonly CPJourney: typeof CpjourneyAdapter;
5
- };
6
- export type AdapterName = keyof typeof ADAPTERS;
7
- export declare function createAdapter(name: AdapterName): BaseAdapter;
8
- export {};
9
- //# sourceMappingURL=index.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/adapters/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAA;AACpD,OAAO,EAAE,gBAAgB,EAAE,MAAM,wBAAwB,CAAA;AAEzD,QAAA,MAAM,QAAQ;;CAEJ,CAAA;AAEV,MAAM,MAAM,WAAW,GAAG,MAAM,OAAO,QAAQ,CAAA;AAE/C,wBAAgB,aAAa,CAAC,IAAI,EAAE,WAAW,GAAG,WAAW,CAE5D"}
@@ -1,8 +0,0 @@
1
- import { CpjourneyAdapter } from "./cpjourney-adapter.js";
2
- const ADAPTERS = {
3
- CPJourney: CpjourneyAdapter,
4
- };
5
- export function createAdapter(name) {
6
- return new ADAPTERS[name]();
7
- }
8
- //# sourceMappingURL=index.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/adapters/index.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,gBAAgB,EAAE,MAAM,wBAAwB,CAAA;AAEzD,MAAM,QAAQ,GAAG;IACf,SAAS,EAAE,gBAAgB;CACnB,CAAA;AAIV,MAAM,UAAU,aAAa,CAAC,IAAiB;IAC7C,OAAO,IAAI,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAA;AAC7B,CAAC"}
package/dist/client.d.ts DELETED
@@ -1,60 +0,0 @@
1
- import { EventEmitter } from "node:events";
2
- import { type AdapterName } from "./adapters/index.js";
3
- import type { ConnectOptions } from "./adapters/base-adapter.js";
4
- import type { LoginOptions, ServerInfo, TokenLoginOptions } from "./types/adapter-types.js";
5
- import type { ServerMessages } from "./types/message-types.js";
6
- import type { PlayerData, RoomUser } from "./types/player-types.js";
7
- type ServerMessageHandler<K extends keyof ServerMessages> = (args: ServerMessages[K]) => void;
8
- export type LogFn = (message: string, ...args: unknown[]) => void;
9
- export type ClientOptions = {
10
- debug?: boolean | LogFn;
11
- };
12
- export declare class Client extends EventEmitter {
13
- player: PlayerData | null;
14
- room: number | null;
15
- users: Map<number, RoomUser>;
16
- private adapter;
17
- private loginResult;
18
- private log;
19
- constructor(server: AdapterName, options?: ClientOptions);
20
- login(options: LoginOptions | TokenLoginOptions): Promise<ServerInfo[]>;
21
- connect(serverName: string, options?: ConnectOptions): Promise<void>;
22
- on<K extends keyof ServerMessages>(event: K, listener: ServerMessageHandler<K>): this;
23
- on(event: string, listener: (...args: unknown[]) => void): this;
24
- off<K extends keyof ServerMessages>(event: K, listener: ServerMessageHandler<K>): this;
25
- off(event: string, listener: (...args: unknown[]) => void): this;
26
- once<K extends keyof ServerMessages>(event: K, listener: ServerMessageHandler<K>): this;
27
- once(event: string, listener: (...args: unknown[]) => void): this;
28
- emit<K extends keyof ServerMessages>(event: K, args: ServerMessages[K]): boolean;
29
- emit(event: string, ...args: unknown[]): boolean;
30
- sendMessage(message: string): void;
31
- sendEmote(emote: number): void;
32
- sendSafe(safe: number): void;
33
- walk(x: number, y: number): void;
34
- sendFrame(frame: number, set?: boolean): void;
35
- snowball(x: number, y: number): void;
36
- joinRoom(room: number, x?: number, y?: number): void;
37
- addItem(item: number): void;
38
- equipColor(item: number): void;
39
- equipHead(item: number): void;
40
- equipFace(item: number): void;
41
- equipNeck(item: number): void;
42
- equipBody(item: number): void;
43
- equipHand(item: number): void;
44
- equipFeet(item: number): void;
45
- equipFlag(item: number): void;
46
- equipPhoto(item: number): void;
47
- buddyRequest(id: number): void;
48
- buddyAccept(id: number): void;
49
- removeBuddy(id: number): void;
50
- addIgnore(id: number): void;
51
- removeIgnore(id: number): void;
52
- getPlayer(id: number): void;
53
- getAllSlots(): void;
54
- getMascots(): void;
55
- sleep(ms: number): Promise<void>;
56
- disconnect(): void;
57
- private handleMessage;
58
- }
59
- export {};
60
- //# sourceMappingURL=client.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../src/client.ts"],"names":[],"mappings":"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"}