@chativa/connector-websocket 0.0.1

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.cjs ADDED
@@ -0,0 +1,2 @@
1
+ "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});class o{constructor(t){this.name="websocket",this.addSentToHistory=!0,this.ws=null,this.messageHandler=null,this.connectHandler=null,this.disconnectHandler=null,this.reconnectAttempts=0,this.options={protocols:[],reconnect:!0,reconnectDelay:2e3,maxReconnectAttempts:5,...t}}async connect(){return new Promise((t,s)=>{this.ws=new WebSocket(this.options.url,this.options.protocols),this.ws.onopen=()=>{this.reconnectAttempts=0,this.connectHandler?.(),t()},this.ws.onerror=e=>{s(new Error(`WebSocket error: ${JSON.stringify(e)}`))},this.ws.onmessage=e=>{try{const n=JSON.parse(e.data);this.messageHandler?.(n)}catch{this.messageHandler?.({id:`ws-${Date.now()}`,type:"text",data:{text:e.data},timestamp:Date.now()})}},this.ws.onclose=e=>{this.disconnectHandler?.(e.reason),this.options.reconnect&&this.reconnectAttempts<this.options.maxReconnectAttempts&&(this.reconnectAttempts++,setTimeout(()=>this.connect(),this.options.reconnectDelay))}})}async disconnect(){this.ws?.close(),this.ws=null}async sendMessage(t){if(!this.ws||this.ws.readyState!==WebSocket.OPEN)throw new Error("WebSocketConnector: not connected.");this.ws.send(JSON.stringify(t))}onMessage(t){this.messageHandler=t}onConnect(t){this.connectHandler=t}onDisconnect(t){this.disconnectHandler=t}}exports.WebSocketConnector=o;
2
+ //# sourceMappingURL=index.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.cjs","sources":["../src/WebSocketConnector.ts"],"sourcesContent":["import type {\n IConnector,\n MessageHandler,\n ConnectHandler,\n DisconnectHandler,\n} from \"@chativa/core\";\nimport type { OutgoingMessage } from \"@chativa/core\";\n\nexport interface WebSocketConnectorOptions {\n url: string;\n protocols?: string | string[];\n reconnect?: boolean;\n reconnectDelay?: number;\n maxReconnectAttempts?: number;\n}\n\n/**\n * WebSocketConnector — native browser WebSocket adapter.\n */\nexport class WebSocketConnector implements IConnector {\n readonly name = \"websocket\";\n readonly addSentToHistory = true;\n\n private ws: WebSocket | null = null;\n private options: Required<WebSocketConnectorOptions>;\n\n private messageHandler: MessageHandler | null = null;\n private connectHandler: ConnectHandler | null = null;\n private disconnectHandler: DisconnectHandler | null = null;\n\n private reconnectAttempts = 0;\n\n constructor(options: WebSocketConnectorOptions) {\n this.options = {\n protocols: [],\n reconnect: true,\n reconnectDelay: 2000,\n maxReconnectAttempts: 5,\n ...options,\n };\n }\n\n async connect(): Promise<void> {\n return new Promise((resolve, reject) => {\n this.ws = new WebSocket(this.options.url, this.options.protocols);\n\n this.ws.onopen = () => {\n this.reconnectAttempts = 0;\n this.connectHandler?.();\n resolve();\n };\n\n this.ws.onerror = (event) => {\n reject(new Error(`WebSocket error: ${JSON.stringify(event)}`));\n };\n\n this.ws.onmessage = (event: MessageEvent) => {\n try {\n const data = JSON.parse(event.data as string);\n this.messageHandler?.(data);\n } catch {\n this.messageHandler?.({\n id: `ws-${Date.now()}`,\n type: \"text\",\n data: { text: event.data as string },\n timestamp: Date.now(),\n });\n }\n };\n\n this.ws.onclose = (event) => {\n this.disconnectHandler?.(event.reason);\n if (\n this.options.reconnect &&\n this.reconnectAttempts < this.options.maxReconnectAttempts\n ) {\n this.reconnectAttempts++;\n setTimeout(() => this.connect(), this.options.reconnectDelay);\n }\n };\n });\n }\n\n async disconnect(): Promise<void> {\n this.ws?.close();\n this.ws = null;\n }\n\n async sendMessage(message: OutgoingMessage): Promise<void> {\n if (!this.ws || this.ws.readyState !== WebSocket.OPEN) {\n throw new Error(\"WebSocketConnector: not connected.\");\n }\n this.ws.send(JSON.stringify(message));\n }\n\n onMessage(callback: MessageHandler): void {\n this.messageHandler = callback;\n }\n\n onConnect(callback: ConnectHandler): void {\n this.connectHandler = callback;\n }\n\n onDisconnect(callback: DisconnectHandler): void {\n this.disconnectHandler = callback;\n }\n}\n"],"names":["WebSocketConnector","options","resolve","reject","event","data","message","callback"],"mappings":"gFAmBO,MAAMA,CAAyC,CAapD,YAAYC,EAAoC,CAZhD,KAAS,KAAO,YAChB,KAAS,iBAAmB,GAE5B,KAAQ,GAAuB,KAG/B,KAAQ,eAAwC,KAChD,KAAQ,eAAwC,KAChD,KAAQ,kBAA8C,KAEtD,KAAQ,kBAAoB,EAG1B,KAAK,QAAU,CACb,UAAW,CAAA,EACX,UAAW,GACX,eAAgB,IAChB,qBAAsB,EACtB,GAAGA,CAAA,CAEP,CAEA,MAAM,SAAyB,CAC7B,OAAO,IAAI,QAAQ,CAACC,EAASC,IAAW,CACtC,KAAK,GAAK,IAAI,UAAU,KAAK,QAAQ,IAAK,KAAK,QAAQ,SAAS,EAEhE,KAAK,GAAG,OAAS,IAAM,CACrB,KAAK,kBAAoB,EACzB,KAAK,iBAAA,EACLD,EAAA,CACF,EAEA,KAAK,GAAG,QAAWE,GAAU,CAC3BD,EAAO,IAAI,MAAM,oBAAoB,KAAK,UAAUC,CAAK,CAAC,EAAE,CAAC,CAC/D,EAEA,KAAK,GAAG,UAAaA,GAAwB,CAC3C,GAAI,CACF,MAAMC,EAAO,KAAK,MAAMD,EAAM,IAAc,EAC5C,KAAK,iBAAiBC,CAAI,CAC5B,MAAQ,CACN,KAAK,iBAAiB,CACpB,GAAI,MAAM,KAAK,IAAA,CAAK,GACpB,KAAM,OACN,KAAM,CAAE,KAAMD,EAAM,IAAA,EACpB,UAAW,KAAK,IAAA,CAAI,CACrB,CACH,CACF,EAEA,KAAK,GAAG,QAAWA,GAAU,CAC3B,KAAK,oBAAoBA,EAAM,MAAM,EAEnC,KAAK,QAAQ,WACb,KAAK,kBAAoB,KAAK,QAAQ,uBAEtC,KAAK,oBACL,WAAW,IAAM,KAAK,QAAA,EAAW,KAAK,QAAQ,cAAc,EAEhE,CACF,CAAC,CACH,CAEA,MAAM,YAA4B,CAChC,KAAK,IAAI,MAAA,EACT,KAAK,GAAK,IACZ,CAEA,MAAM,YAAYE,EAAyC,CACzD,GAAI,CAAC,KAAK,IAAM,KAAK,GAAG,aAAe,UAAU,KAC/C,MAAM,IAAI,MAAM,oCAAoC,EAEtD,KAAK,GAAG,KAAK,KAAK,UAAUA,CAAO,CAAC,CACtC,CAEA,UAAUC,EAAgC,CACxC,KAAK,eAAiBA,CACxB,CAEA,UAAUA,EAAgC,CACxC,KAAK,eAAiBA,CACxB,CAEA,aAAaA,EAAmC,CAC9C,KAAK,kBAAoBA,CAC3B,CACF"}
@@ -0,0 +1,36 @@
1
+ import { ConnectHandler } from '../../core/src/index.ts';
2
+ import { DisconnectHandler } from '../../core/src/index.ts';
3
+ import { IConnector } from '../../core/src/index.ts';
4
+ import { MessageHandler } from '../../core/src/index.ts';
5
+ import { OutgoingMessage } from '../../core/src/index.ts';
6
+
7
+ /**
8
+ * WebSocketConnector — native browser WebSocket adapter.
9
+ */
10
+ export declare class WebSocketConnector implements IConnector {
11
+ readonly name = "websocket";
12
+ readonly addSentToHistory = true;
13
+ private ws;
14
+ private options;
15
+ private messageHandler;
16
+ private connectHandler;
17
+ private disconnectHandler;
18
+ private reconnectAttempts;
19
+ constructor(options: WebSocketConnectorOptions);
20
+ connect(): Promise<void>;
21
+ disconnect(): Promise<void>;
22
+ sendMessage(message: OutgoingMessage): Promise<void>;
23
+ onMessage(callback: MessageHandler): void;
24
+ onConnect(callback: ConnectHandler): void;
25
+ onDisconnect(callback: DisconnectHandler): void;
26
+ }
27
+
28
+ export declare interface WebSocketConnectorOptions {
29
+ url: string;
30
+ protocols?: string | string[];
31
+ reconnect?: boolean;
32
+ reconnectDelay?: number;
33
+ maxReconnectAttempts?: number;
34
+ }
35
+
36
+ export { }
package/dist/index.js ADDED
@@ -0,0 +1,55 @@
1
+ class c {
2
+ constructor(t) {
3
+ this.name = "websocket", this.addSentToHistory = !0, this.ws = null, this.messageHandler = null, this.connectHandler = null, this.disconnectHandler = null, this.reconnectAttempts = 0, this.options = {
4
+ protocols: [],
5
+ reconnect: !0,
6
+ reconnectDelay: 2e3,
7
+ maxReconnectAttempts: 5,
8
+ ...t
9
+ };
10
+ }
11
+ async connect() {
12
+ return new Promise((t, s) => {
13
+ this.ws = new WebSocket(this.options.url, this.options.protocols), this.ws.onopen = () => {
14
+ this.reconnectAttempts = 0, this.connectHandler?.(), t();
15
+ }, this.ws.onerror = (e) => {
16
+ s(new Error(`WebSocket error: ${JSON.stringify(e)}`));
17
+ }, this.ws.onmessage = (e) => {
18
+ try {
19
+ const n = JSON.parse(e.data);
20
+ this.messageHandler?.(n);
21
+ } catch {
22
+ this.messageHandler?.({
23
+ id: `ws-${Date.now()}`,
24
+ type: "text",
25
+ data: { text: e.data },
26
+ timestamp: Date.now()
27
+ });
28
+ }
29
+ }, this.ws.onclose = (e) => {
30
+ this.disconnectHandler?.(e.reason), this.options.reconnect && this.reconnectAttempts < this.options.maxReconnectAttempts && (this.reconnectAttempts++, setTimeout(() => this.connect(), this.options.reconnectDelay));
31
+ };
32
+ });
33
+ }
34
+ async disconnect() {
35
+ this.ws?.close(), this.ws = null;
36
+ }
37
+ async sendMessage(t) {
38
+ if (!this.ws || this.ws.readyState !== WebSocket.OPEN)
39
+ throw new Error("WebSocketConnector: not connected.");
40
+ this.ws.send(JSON.stringify(t));
41
+ }
42
+ onMessage(t) {
43
+ this.messageHandler = t;
44
+ }
45
+ onConnect(t) {
46
+ this.connectHandler = t;
47
+ }
48
+ onDisconnect(t) {
49
+ this.disconnectHandler = t;
50
+ }
51
+ }
52
+ export {
53
+ c as WebSocketConnector
54
+ };
55
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sources":["../src/WebSocketConnector.ts"],"sourcesContent":["import type {\n IConnector,\n MessageHandler,\n ConnectHandler,\n DisconnectHandler,\n} from \"@chativa/core\";\nimport type { OutgoingMessage } from \"@chativa/core\";\n\nexport interface WebSocketConnectorOptions {\n url: string;\n protocols?: string | string[];\n reconnect?: boolean;\n reconnectDelay?: number;\n maxReconnectAttempts?: number;\n}\n\n/**\n * WebSocketConnector — native browser WebSocket adapter.\n */\nexport class WebSocketConnector implements IConnector {\n readonly name = \"websocket\";\n readonly addSentToHistory = true;\n\n private ws: WebSocket | null = null;\n private options: Required<WebSocketConnectorOptions>;\n\n private messageHandler: MessageHandler | null = null;\n private connectHandler: ConnectHandler | null = null;\n private disconnectHandler: DisconnectHandler | null = null;\n\n private reconnectAttempts = 0;\n\n constructor(options: WebSocketConnectorOptions) {\n this.options = {\n protocols: [],\n reconnect: true,\n reconnectDelay: 2000,\n maxReconnectAttempts: 5,\n ...options,\n };\n }\n\n async connect(): Promise<void> {\n return new Promise((resolve, reject) => {\n this.ws = new WebSocket(this.options.url, this.options.protocols);\n\n this.ws.onopen = () => {\n this.reconnectAttempts = 0;\n this.connectHandler?.();\n resolve();\n };\n\n this.ws.onerror = (event) => {\n reject(new Error(`WebSocket error: ${JSON.stringify(event)}`));\n };\n\n this.ws.onmessage = (event: MessageEvent) => {\n try {\n const data = JSON.parse(event.data as string);\n this.messageHandler?.(data);\n } catch {\n this.messageHandler?.({\n id: `ws-${Date.now()}`,\n type: \"text\",\n data: { text: event.data as string },\n timestamp: Date.now(),\n });\n }\n };\n\n this.ws.onclose = (event) => {\n this.disconnectHandler?.(event.reason);\n if (\n this.options.reconnect &&\n this.reconnectAttempts < this.options.maxReconnectAttempts\n ) {\n this.reconnectAttempts++;\n setTimeout(() => this.connect(), this.options.reconnectDelay);\n }\n };\n });\n }\n\n async disconnect(): Promise<void> {\n this.ws?.close();\n this.ws = null;\n }\n\n async sendMessage(message: OutgoingMessage): Promise<void> {\n if (!this.ws || this.ws.readyState !== WebSocket.OPEN) {\n throw new Error(\"WebSocketConnector: not connected.\");\n }\n this.ws.send(JSON.stringify(message));\n }\n\n onMessage(callback: MessageHandler): void {\n this.messageHandler = callback;\n }\n\n onConnect(callback: ConnectHandler): void {\n this.connectHandler = callback;\n }\n\n onDisconnect(callback: DisconnectHandler): void {\n this.disconnectHandler = callback;\n }\n}\n"],"names":["WebSocketConnector","options","resolve","reject","event","data","message","callback"],"mappings":"AAmBO,MAAMA,EAAyC;AAAA,EAapD,YAAYC,GAAoC;AAZhD,SAAS,OAAO,aAChB,KAAS,mBAAmB,IAE5B,KAAQ,KAAuB,MAG/B,KAAQ,iBAAwC,MAChD,KAAQ,iBAAwC,MAChD,KAAQ,oBAA8C,MAEtD,KAAQ,oBAAoB,GAG1B,KAAK,UAAU;AAAA,MACb,WAAW,CAAA;AAAA,MACX,WAAW;AAAA,MACX,gBAAgB;AAAA,MAChB,sBAAsB;AAAA,MACtB,GAAGA;AAAA,IAAA;AAAA,EAEP;AAAA,EAEA,MAAM,UAAyB;AAC7B,WAAO,IAAI,QAAQ,CAACC,GAASC,MAAW;AACtC,WAAK,KAAK,IAAI,UAAU,KAAK,QAAQ,KAAK,KAAK,QAAQ,SAAS,GAEhE,KAAK,GAAG,SAAS,MAAM;AACrB,aAAK,oBAAoB,GACzB,KAAK,iBAAA,GACLD,EAAA;AAAA,MACF,GAEA,KAAK,GAAG,UAAU,CAACE,MAAU;AAC3B,QAAAD,EAAO,IAAI,MAAM,oBAAoB,KAAK,UAAUC,CAAK,CAAC,EAAE,CAAC;AAAA,MAC/D,GAEA,KAAK,GAAG,YAAY,CAACA,MAAwB;AAC3C,YAAI;AACF,gBAAMC,IAAO,KAAK,MAAMD,EAAM,IAAc;AAC5C,eAAK,iBAAiBC,CAAI;AAAA,QAC5B,QAAQ;AACN,eAAK,iBAAiB;AAAA,YACpB,IAAI,MAAM,KAAK,IAAA,CAAK;AAAA,YACpB,MAAM;AAAA,YACN,MAAM,EAAE,MAAMD,EAAM,KAAA;AAAA,YACpB,WAAW,KAAK,IAAA;AAAA,UAAI,CACrB;AAAA,QACH;AAAA,MACF,GAEA,KAAK,GAAG,UAAU,CAACA,MAAU;AAC3B,aAAK,oBAAoBA,EAAM,MAAM,GAEnC,KAAK,QAAQ,aACb,KAAK,oBAAoB,KAAK,QAAQ,yBAEtC,KAAK,qBACL,WAAW,MAAM,KAAK,QAAA,GAAW,KAAK,QAAQ,cAAc;AAAA,MAEhE;AAAA,IACF,CAAC;AAAA,EACH;AAAA,EAEA,MAAM,aAA4B;AAChC,SAAK,IAAI,MAAA,GACT,KAAK,KAAK;AAAA,EACZ;AAAA,EAEA,MAAM,YAAYE,GAAyC;AACzD,QAAI,CAAC,KAAK,MAAM,KAAK,GAAG,eAAe,UAAU;AAC/C,YAAM,IAAI,MAAM,oCAAoC;AAEtD,SAAK,GAAG,KAAK,KAAK,UAAUA,CAAO,CAAC;AAAA,EACtC;AAAA,EAEA,UAAUC,GAAgC;AACxC,SAAK,iBAAiBA;AAAA,EACxB;AAAA,EAEA,UAAUA,GAAgC;AACxC,SAAK,iBAAiBA;AAAA,EACxB;AAAA,EAEA,aAAaA,GAAmC;AAC9C,SAAK,oBAAoBA;AAAA,EAC3B;AACF;"}
package/package.json ADDED
@@ -0,0 +1,50 @@
1
+ {
2
+ "name": "@chativa/connector-websocket",
3
+ "version": "0.0.1",
4
+ "description": "Chativa WebSocket connector — native browser WebSocket adapter.",
5
+ "author": "Hamza Agar",
6
+ "license": "MIT",
7
+ "type": "module",
8
+ "main": "./dist/index.cjs",
9
+ "module": "./dist/index.js",
10
+ "types": "./dist/index.d.ts",
11
+ "exports": {
12
+ ".": {
13
+ "import": "./dist/index.js",
14
+ "require": "./dist/index.cjs",
15
+ "types": "./dist/index.d.ts"
16
+ }
17
+ },
18
+ "files": [
19
+ "dist"
20
+ ],
21
+ "keywords": [
22
+ "chativa",
23
+ "chat",
24
+ "connector",
25
+ "websocket"
26
+ ],
27
+ "homepage": "https://github.com/AimTune/chativa#readme",
28
+ "bugs": {
29
+ "url": "https://github.com/AimTune/chativa/issues"
30
+ },
31
+ "repository": {
32
+ "type": "git",
33
+ "url": "git+https://github.com/AimTune/chativa.git"
34
+ },
35
+ "peerDependencies": {
36
+ "@chativa/core": ">=0.0.1"
37
+ },
38
+ "devDependencies": {
39
+ "typescript": "~5.8.3",
40
+ "vite": "^7.0.3",
41
+ "vite-plugin-dts": "^4.5.4",
42
+ "vitest": "^4.0.18",
43
+ "@chativa/core": "0.0.1"
44
+ },
45
+ "scripts": {
46
+ "build": "vite build",
47
+ "test": "vitest run --passWithNoTests",
48
+ "typecheck": "tsc --noEmit"
49
+ }
50
+ }