diff --git a/package.json b/package.json index b41b0c7..bbd9301 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@debros/network-ts-sdk", - "version": "0.6.1", + "version": "0.6.2", "description": "TypeScript SDK for DeBros Network Gateway - Database, PubSub, Cache, Storage, and more", "type": "module", "main": "./dist/index.js", diff --git a/src/core/interfaces/IWebSocketClient.ts b/src/core/interfaces/IWebSocketClient.ts index 5985234..98c1a53 100644 --- a/src/core/interfaces/IWebSocketClient.ts +++ b/src/core/interfaces/IWebSocketClient.ts @@ -41,12 +41,12 @@ export interface IWebSocketClient { /** * Register close handler */ - onClose(handler: () => void): void; + onClose(handler: (code: number, reason: string) => void): void; /** * Unregister close handler */ - offClose(handler: () => void): void; + offClose(handler: (code: number, reason: string) => void): void; /** * Check if WebSocket is connected diff --git a/src/core/ws.ts b/src/core/ws.ts index 4f69baf..bbd3149 100644 --- a/src/core/ws.ts +++ b/src/core/ws.ts @@ -16,7 +16,7 @@ export interface WSClientConfig { export type WSMessageHandler = (data: string) => void; export type WSErrorHandler = (error: Error) => void; -export type WSCloseHandler = () => void; +export type WSCloseHandler = (code: number, reason: string) => void; export type WSOpenHandler = () => void; /** @@ -102,7 +102,12 @@ export class WSClient { this.ws.addEventListener("error", (event: Event) => { console.error("[WSClient] WebSocket error:", event); clearTimeout(timeout); - const error = new SDKError("WebSocket error", 500, "WS_ERROR", event); + // Extract useful details from the event — raw Event objects don't serialize + const details: Record = { type: event.type }; + if ("message" in event) { + details.message = (event as ErrorEvent).message; + } + const error = new SDKError("WebSocket error", 0, "WS_ERROR", details); // Call the network error callback if configured if (this.onNetworkError) { @@ -118,10 +123,13 @@ export class WSClient { reject(error); }); - this.ws.addEventListener("close", () => { + this.ws.addEventListener("close", (event: Event) => { clearTimeout(timeout); - console.log("[WSClient] Connection closed"); - this.closeHandlers.forEach((handler) => handler()); + const closeEvent = event as CloseEvent; + const code = closeEvent.code ?? 1006; + const reason = closeEvent.reason ?? ""; + console.log(`[WSClient] Connection closed (code: ${code}, reason: ${reason || "none"})`); + this.closeHandlers.forEach((handler) => handler(code, reason)); }); } catch (error) { reject(error); @@ -206,7 +214,7 @@ export class WSClient { */ send(data: string): void { if (this.ws?.readyState !== WebSocket.OPEN) { - throw new SDKError("WebSocket is not connected", 500, "WS_NOT_CONNECTED"); + throw new SDKError("WebSocket is not connected", 0, "WS_NOT_CONNECTED"); } this.ws.send(data); } diff --git a/src/pubsub/client.ts b/src/pubsub/client.ts index 87cdd29..0fcfb62 100644 --- a/src/pubsub/client.ts +++ b/src/pubsub/client.ts @@ -176,7 +176,7 @@ export class Subscription { private isClosed = false; private wsMessageHandler: ((data: string) => void) | null = null; private wsErrorHandler: ((error: Error) => void) | null = null; - private wsCloseHandler: (() => void) | null = null; + private wsCloseHandler: ((code: number, reason: string) => void) | null = null; private getPresenceFn: () => Promise; constructor( @@ -271,8 +271,8 @@ export class Subscription { this.wsClient.onError(this.wsErrorHandler); // Register close handler - this.wsCloseHandler = () => { - this.closeHandlers.forEach((handler) => handler()); + this.wsCloseHandler = (code: number, reason: string) => { + this.closeHandlers.forEach((handler) => handler(code, reason)); }; this.wsClient.onClose(this.wsCloseHandler); } diff --git a/src/pubsub/types.ts b/src/pubsub/types.ts index 304a273..6365f51 100644 --- a/src/pubsub/types.ts +++ b/src/pubsub/types.ts @@ -42,5 +42,5 @@ export interface SubscribeOptions { export type MessageHandler = (message: PubSubMessage) => void; export type ErrorHandler = (error: Error) => void; -export type CloseHandler = () => void; +export type CloseHandler = (code: number, reason: string) => void;