kalze-ws 1.0.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/README.md +211 -0
- package/dist/client.d.ts +114 -0
- package/dist/client.d.ts.map +1 -0
- package/dist/client.js +337 -0
- package/dist/client.js.map +1 -0
- package/dist/index.d.ts +5 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +6 -0
- package/dist/index.js.map +1 -0
- package/dist/types.d.ts +124 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +2 -0
- package/dist/types.js.map +1 -0
- package/package.json +48 -0
package/README.md
ADDED
|
@@ -0,0 +1,211 @@
|
|
|
1
|
+
# kalze-ws
|
|
2
|
+
|
|
3
|
+
Official WebSocket client for [websocket.cl](https://websocket.cl) - Real-time connections made easy.
|
|
4
|
+
|
|
5
|
+
## Installation
|
|
6
|
+
|
|
7
|
+
```bash
|
|
8
|
+
npm install kalze-ws
|
|
9
|
+
```
|
|
10
|
+
|
|
11
|
+
## Quick Start
|
|
12
|
+
|
|
13
|
+
```typescript
|
|
14
|
+
import Kalze from 'kalze-ws'
|
|
15
|
+
|
|
16
|
+
// Initialize client with your credentials
|
|
17
|
+
const kalze = new Kalze({
|
|
18
|
+
key: 'wpk_live_your_public_key',
|
|
19
|
+
subdomain: 'your-subdomain',
|
|
20
|
+
})
|
|
21
|
+
|
|
22
|
+
// Subscribe to a channel
|
|
23
|
+
const channel = kalze.subscribe('my-channel')
|
|
24
|
+
|
|
25
|
+
// Listen for events
|
|
26
|
+
channel.on('connected', (data) => {
|
|
27
|
+
console.log('Connected!', data.socketId)
|
|
28
|
+
})
|
|
29
|
+
|
|
30
|
+
channel.on('my-event', (data) => {
|
|
31
|
+
console.log('Received:', data)
|
|
32
|
+
})
|
|
33
|
+
|
|
34
|
+
// Handle disconnection
|
|
35
|
+
channel.on('disconnected', ({ code, reason }) => {
|
|
36
|
+
console.log('Disconnected:', code, reason)
|
|
37
|
+
})
|
|
38
|
+
```
|
|
39
|
+
|
|
40
|
+
## Configuration Options
|
|
41
|
+
|
|
42
|
+
```typescript
|
|
43
|
+
const kalze = new Kalze({
|
|
44
|
+
// Required
|
|
45
|
+
key: 'wpk_live_...', // Your public API key
|
|
46
|
+
subdomain: 'your-subdomain', // Your subdomain
|
|
47
|
+
|
|
48
|
+
// Optional
|
|
49
|
+
wsUrl: 'wss://ws.websocket.cl', // WebSocket server URL
|
|
50
|
+
autoReconnect: true, // Auto reconnect on disconnect
|
|
51
|
+
maxReconnectAttempts: 10, // Max reconnect attempts
|
|
52
|
+
reconnectDelay: 1000, // Base delay between reconnects (ms)
|
|
53
|
+
debug: false, // Enable debug logging
|
|
54
|
+
})
|
|
55
|
+
```
|
|
56
|
+
|
|
57
|
+
## Channel API
|
|
58
|
+
|
|
59
|
+
### Subscribing to Events
|
|
60
|
+
|
|
61
|
+
```typescript
|
|
62
|
+
const channel = kalze.subscribe('notifications')
|
|
63
|
+
|
|
64
|
+
// Subscribe to a specific event
|
|
65
|
+
channel.on('new-notification', (data) => {
|
|
66
|
+
console.log('New notification:', data)
|
|
67
|
+
})
|
|
68
|
+
|
|
69
|
+
// Subscribe to all events (wildcard)
|
|
70
|
+
channel.on('*', ({ event, data }) => {
|
|
71
|
+
console.log(`Event: ${event}`, data)
|
|
72
|
+
})
|
|
73
|
+
|
|
74
|
+
// Subscribe once
|
|
75
|
+
channel.once('welcome', (data) => {
|
|
76
|
+
console.log('Welcome message:', data)
|
|
77
|
+
})
|
|
78
|
+
```
|
|
79
|
+
|
|
80
|
+
### Unsubscribing
|
|
81
|
+
|
|
82
|
+
```typescript
|
|
83
|
+
// Unsubscribe specific callback
|
|
84
|
+
const unsubscribe = channel.on('event', callback)
|
|
85
|
+
unsubscribe() // or channel.off('event', callback)
|
|
86
|
+
|
|
87
|
+
// Unsubscribe all listeners for an event
|
|
88
|
+
channel.off('event')
|
|
89
|
+
|
|
90
|
+
// Disconnect from channel
|
|
91
|
+
channel.disconnect()
|
|
92
|
+
```
|
|
93
|
+
|
|
94
|
+
### Client Events
|
|
95
|
+
|
|
96
|
+
Send events to other clients on the same channel:
|
|
97
|
+
|
|
98
|
+
```typescript
|
|
99
|
+
channel.trigger({
|
|
100
|
+
type: 'cursor-move',
|
|
101
|
+
x: 100,
|
|
102
|
+
y: 200
|
|
103
|
+
})
|
|
104
|
+
```
|
|
105
|
+
|
|
106
|
+
### Connection State
|
|
107
|
+
|
|
108
|
+
```typescript
|
|
109
|
+
// Check if connected
|
|
110
|
+
if (channel.isConnected()) {
|
|
111
|
+
// ...
|
|
112
|
+
}
|
|
113
|
+
|
|
114
|
+
// Get socket ID
|
|
115
|
+
const socketId = channel.getSocketId()
|
|
116
|
+
|
|
117
|
+
// Get connection state
|
|
118
|
+
const state = channel.getState() // 'connecting' | 'connected' | 'disconnected' | 'reconnecting'
|
|
119
|
+
|
|
120
|
+
// Listen for state changes
|
|
121
|
+
channel.on('state:change', ({ state }) => {
|
|
122
|
+
console.log('State:', state)
|
|
123
|
+
})
|
|
124
|
+
```
|
|
125
|
+
|
|
126
|
+
### System Events
|
|
127
|
+
|
|
128
|
+
```typescript
|
|
129
|
+
// Connection established
|
|
130
|
+
channel.on('connected', ({ socketId, channel, subdomain }) => {})
|
|
131
|
+
|
|
132
|
+
// Disconnected
|
|
133
|
+
channel.on('disconnected', ({ code, reason }) => {})
|
|
134
|
+
|
|
135
|
+
// Reconnecting
|
|
136
|
+
channel.on('reconnecting', ({ attempt, delay }) => {})
|
|
137
|
+
|
|
138
|
+
// Reconnection failed
|
|
139
|
+
channel.on('reconnect:failed', ({ attempts }) => {})
|
|
140
|
+
|
|
141
|
+
// Error
|
|
142
|
+
channel.on('error', ({ message }) => {})
|
|
143
|
+
```
|
|
144
|
+
|
|
145
|
+
## Multiple Channels
|
|
146
|
+
|
|
147
|
+
```typescript
|
|
148
|
+
const chat = kalze.subscribe('chat')
|
|
149
|
+
const notifications = kalze.subscribe('notifications')
|
|
150
|
+
const presence = kalze.subscribe('presence')
|
|
151
|
+
|
|
152
|
+
// Get all channels
|
|
153
|
+
const channels = kalze.getChannels() // ['chat', 'notifications', 'presence']
|
|
154
|
+
|
|
155
|
+
// Get specific channel
|
|
156
|
+
const chatChannel = kalze.getChannel('chat')
|
|
157
|
+
|
|
158
|
+
// Unsubscribe from a channel
|
|
159
|
+
kalze.unsubscribe('notifications')
|
|
160
|
+
|
|
161
|
+
// Disconnect from all channels
|
|
162
|
+
kalze.disconnectAll()
|
|
163
|
+
```
|
|
164
|
+
|
|
165
|
+
## TypeScript
|
|
166
|
+
|
|
167
|
+
Full TypeScript support with type definitions:
|
|
168
|
+
|
|
169
|
+
```typescript
|
|
170
|
+
import Kalze, { KalzeOptions, ConnectionState } from 'kalze-ws'
|
|
171
|
+
|
|
172
|
+
interface NotificationData {
|
|
173
|
+
id: string
|
|
174
|
+
message: string
|
|
175
|
+
createdAt: string
|
|
176
|
+
}
|
|
177
|
+
|
|
178
|
+
const channel = kalze.subscribe('notifications')
|
|
179
|
+
|
|
180
|
+
channel.on<NotificationData>('new-notification', (data) => {
|
|
181
|
+
// data is typed as NotificationData
|
|
182
|
+
console.log(data.message)
|
|
183
|
+
})
|
|
184
|
+
```
|
|
185
|
+
|
|
186
|
+
## Server-Side Integration
|
|
187
|
+
|
|
188
|
+
To send messages from your server, use the Kalze User API:
|
|
189
|
+
|
|
190
|
+
```typescript
|
|
191
|
+
// Server-side (Node.js)
|
|
192
|
+
const response = await fetch('https://api.websocket.cl/broadcast/my-channel', {
|
|
193
|
+
method: 'POST',
|
|
194
|
+
headers: {
|
|
195
|
+
'Authorization': 'Bearer wsk_live_your_secret_key',
|
|
196
|
+
'Content-Type': 'application/json',
|
|
197
|
+
},
|
|
198
|
+
body: JSON.stringify({
|
|
199
|
+
event: 'new-notification',
|
|
200
|
+
data: {
|
|
201
|
+
id: '123',
|
|
202
|
+
message: 'Hello World!',
|
|
203
|
+
createdAt: new Date().toISOString(),
|
|
204
|
+
}
|
|
205
|
+
})
|
|
206
|
+
})
|
|
207
|
+
```
|
|
208
|
+
|
|
209
|
+
## License
|
|
210
|
+
|
|
211
|
+
MIT © [Kalze SpA](https://kalze.z8.cl)
|
package/dist/client.d.ts
ADDED
|
@@ -0,0 +1,114 @@
|
|
|
1
|
+
import type { KalzeOptions, EventCallback, ConnectionState, Channel } from './types.js';
|
|
2
|
+
/**
|
|
3
|
+
* Kalze Channel - Represents a connection to a specific channel
|
|
4
|
+
*/
|
|
5
|
+
export declare class KalzeChannel implements Channel {
|
|
6
|
+
name: string;
|
|
7
|
+
private options;
|
|
8
|
+
private ws;
|
|
9
|
+
private socketId;
|
|
10
|
+
private state;
|
|
11
|
+
private eventListeners;
|
|
12
|
+
private reconnectAttempts;
|
|
13
|
+
private reconnectTimeout;
|
|
14
|
+
private heartbeatInterval;
|
|
15
|
+
constructor(channelName: string, options: KalzeOptions);
|
|
16
|
+
/**
|
|
17
|
+
* Connect to the WebSocket server
|
|
18
|
+
*/
|
|
19
|
+
private connect;
|
|
20
|
+
/**
|
|
21
|
+
* Handle incoming message
|
|
22
|
+
*/
|
|
23
|
+
private handleMessage;
|
|
24
|
+
/**
|
|
25
|
+
* Handle connection established
|
|
26
|
+
*/
|
|
27
|
+
private handleConnectionEstablished;
|
|
28
|
+
/**
|
|
29
|
+
* Handle connection close
|
|
30
|
+
*/
|
|
31
|
+
private handleClose;
|
|
32
|
+
/**
|
|
33
|
+
* Schedule reconnect
|
|
34
|
+
*/
|
|
35
|
+
private scheduleReconnect;
|
|
36
|
+
/**
|
|
37
|
+
* Start heartbeat
|
|
38
|
+
*/
|
|
39
|
+
private startHeartbeat;
|
|
40
|
+
/**
|
|
41
|
+
* Stop heartbeat
|
|
42
|
+
*/
|
|
43
|
+
private stopHeartbeat;
|
|
44
|
+
/**
|
|
45
|
+
* Emit event to listeners
|
|
46
|
+
*/
|
|
47
|
+
private emit;
|
|
48
|
+
/**
|
|
49
|
+
* Log message if debug is enabled
|
|
50
|
+
*/
|
|
51
|
+
private log;
|
|
52
|
+
/**
|
|
53
|
+
* Subscribe to an event
|
|
54
|
+
*/
|
|
55
|
+
on<T = unknown>(event: string, callback: EventCallback<T>): () => void;
|
|
56
|
+
/**
|
|
57
|
+
* Subscribe to an event once
|
|
58
|
+
*/
|
|
59
|
+
once<T = unknown>(event: string, callback: EventCallback<T>): () => void;
|
|
60
|
+
/**
|
|
61
|
+
* Unsubscribe from an event
|
|
62
|
+
*/
|
|
63
|
+
off(event: string, callback?: EventCallback): void;
|
|
64
|
+
/**
|
|
65
|
+
* Send a client event to the channel
|
|
66
|
+
*/
|
|
67
|
+
trigger<T = unknown>(data: T): void;
|
|
68
|
+
/**
|
|
69
|
+
* Disconnect from channel
|
|
70
|
+
*/
|
|
71
|
+
disconnect(): void;
|
|
72
|
+
/**
|
|
73
|
+
* Check if connected
|
|
74
|
+
*/
|
|
75
|
+
isConnected(): boolean;
|
|
76
|
+
/**
|
|
77
|
+
* Get socket ID
|
|
78
|
+
*/
|
|
79
|
+
getSocketId(): string | null;
|
|
80
|
+
/**
|
|
81
|
+
* Get connection state
|
|
82
|
+
*/
|
|
83
|
+
getState(): ConnectionState;
|
|
84
|
+
}
|
|
85
|
+
/**
|
|
86
|
+
* Kalze Client - Main entry point
|
|
87
|
+
*/
|
|
88
|
+
export declare class Kalze {
|
|
89
|
+
private options;
|
|
90
|
+
private channels;
|
|
91
|
+
constructor(options: KalzeOptions);
|
|
92
|
+
/**
|
|
93
|
+
* Subscribe to a channel
|
|
94
|
+
*/
|
|
95
|
+
subscribe(channelName: string): KalzeChannel;
|
|
96
|
+
/**
|
|
97
|
+
* Unsubscribe from a channel
|
|
98
|
+
*/
|
|
99
|
+
unsubscribe(channelName: string): void;
|
|
100
|
+
/**
|
|
101
|
+
* Get all subscribed channels
|
|
102
|
+
*/
|
|
103
|
+
getChannels(): string[];
|
|
104
|
+
/**
|
|
105
|
+
* Get a specific channel
|
|
106
|
+
*/
|
|
107
|
+
getChannel(channelName: string): KalzeChannel | undefined;
|
|
108
|
+
/**
|
|
109
|
+
* Disconnect from all channels
|
|
110
|
+
*/
|
|
111
|
+
disconnectAll(): void;
|
|
112
|
+
}
|
|
113
|
+
export default Kalze;
|
|
114
|
+
//# sourceMappingURL=client.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../src/client.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,YAAY,EACZ,aAAa,EACb,eAAe,EAGf,OAAO,EACR,MAAM,YAAY,CAAA;AAInB;;GAEG;AACH,qBAAa,YAAa,YAAW,OAAO;IACnC,IAAI,EAAE,MAAM,CAAA;IAEnB,OAAO,CAAC,OAAO,CAAwB;IACvC,OAAO,CAAC,EAAE,CAAyB;IACnC,OAAO,CAAC,QAAQ,CAAsB;IACtC,OAAO,CAAC,KAAK,CAAkC;IAC/C,OAAO,CAAC,cAAc,CAA6C;IACnE,OAAO,CAAC,iBAAiB,CAAI;IAC7B,OAAO,CAAC,gBAAgB,CAA6C;IACrE,OAAO,CAAC,iBAAiB,CAA8C;gBAE3D,WAAW,EAAE,MAAM,EAAE,OAAO,EAAE,YAAY;IAetD;;OAEG;IACH,OAAO,CAAC,OAAO;IAsCf;;OAEG;IACH,OAAO,CAAC,aAAa;IAwBrB;;OAEG;IACH,OAAO,CAAC,2BAA2B;IAcnC;;OAEG;IACH,OAAO,CAAC,WAAW;IAoBnB;;OAEG;IACH,OAAO,CAAC,iBAAiB;IAmBzB;;OAEG;IACH,OAAO,CAAC,cAAc;IAStB;;OAEG;IACH,OAAO,CAAC,aAAa;IAOrB;;OAEG;IACH,OAAO,CAAC,IAAI;IAyBZ;;OAEG;IACH,OAAO,CAAC,GAAG;IAQX;;OAEG;IACH,EAAE,CAAC,CAAC,GAAG,OAAO,EAAE,KAAK,EAAE,MAAM,EAAE,QAAQ,EAAE,aAAa,CAAC,CAAC,CAAC,GAAG,MAAM,IAAI;IAUtE;;OAEG;IACH,IAAI,CAAC,CAAC,GAAG,OAAO,EAAE,KAAK,EAAE,MAAM,EAAE,QAAQ,EAAE,aAAa,CAAC,CAAC,CAAC,GAAG,MAAM,IAAI;IAQxE;;OAEG;IACH,GAAG,CAAC,KAAK,EAAE,MAAM,EAAE,QAAQ,CAAC,EAAE,aAAa,GAAG,IAAI;IAclD;;OAEG;IACH,OAAO,CAAC,CAAC,GAAG,OAAO,EAAE,IAAI,EAAE,CAAC,GAAG,IAAI;IAWnC;;OAEG;IACH,UAAU,IAAI,IAAI;IAkBlB;;OAEG;IACH,WAAW,IAAI,OAAO;IAItB;;OAEG;IACH,WAAW,IAAI,MAAM,GAAG,IAAI;IAI5B;;OAEG;IACH,QAAQ,IAAI,eAAe;CAG5B;AAED;;GAEG;AACH,qBAAa,KAAK;IAChB,OAAO,CAAC,OAAO,CAAc;IAC7B,OAAO,CAAC,QAAQ,CAAuC;gBAE3C,OAAO,EAAE,YAAY;IAWjC;;OAEG;IACH,SAAS,CAAC,WAAW,EAAE,MAAM,GAAG,YAAY;IAU5C;;OAEG;IACH,WAAW,CAAC,WAAW,EAAE,MAAM,GAAG,IAAI;IAQtC;;OAEG;IACH,WAAW,IAAI,MAAM,EAAE;IAIvB;;OAEG;IACH,UAAU,CAAC,WAAW,EAAE,MAAM,GAAG,YAAY,GAAG,SAAS;IAIzD;;OAEG;IACH,aAAa,IAAI,IAAI;CAMtB;AAGD,eAAe,KAAK,CAAA"}
|
package/dist/client.js
ADDED
|
@@ -0,0 +1,337 @@
|
|
|
1
|
+
const DEFAULT_WS_URL = 'wss://ws.websocket.cl';
|
|
2
|
+
/**
|
|
3
|
+
* Kalze Channel - Represents a connection to a specific channel
|
|
4
|
+
*/
|
|
5
|
+
export class KalzeChannel {
|
|
6
|
+
constructor(channelName, options) {
|
|
7
|
+
this.ws = null;
|
|
8
|
+
this.socketId = null;
|
|
9
|
+
this.state = 'disconnected';
|
|
10
|
+
this.eventListeners = new Map();
|
|
11
|
+
this.reconnectAttempts = 0;
|
|
12
|
+
this.reconnectTimeout = null;
|
|
13
|
+
this.heartbeatInterval = null;
|
|
14
|
+
this.name = channelName;
|
|
15
|
+
this.options = {
|
|
16
|
+
key: options.key,
|
|
17
|
+
subdomain: options.subdomain,
|
|
18
|
+
wsUrl: options.wsUrl || DEFAULT_WS_URL,
|
|
19
|
+
autoReconnect: options.autoReconnect ?? true,
|
|
20
|
+
maxReconnectAttempts: options.maxReconnectAttempts ?? 10,
|
|
21
|
+
reconnectDelay: options.reconnectDelay ?? 1000,
|
|
22
|
+
debug: options.debug ?? false,
|
|
23
|
+
};
|
|
24
|
+
this.connect();
|
|
25
|
+
}
|
|
26
|
+
/**
|
|
27
|
+
* Connect to the WebSocket server
|
|
28
|
+
*/
|
|
29
|
+
connect() {
|
|
30
|
+
if (this.state === 'connecting' || this.state === 'connected') {
|
|
31
|
+
return;
|
|
32
|
+
}
|
|
33
|
+
this.state = this.reconnectAttempts > 0 ? 'reconnecting' : 'connecting';
|
|
34
|
+
this.emit('state:change', { state: this.state });
|
|
35
|
+
const url = `${this.options.wsUrl}/c/${this.options.subdomain}/${this.name}?key=${this.options.key}`;
|
|
36
|
+
this.log(`Connecting to ${url}`);
|
|
37
|
+
try {
|
|
38
|
+
this.ws = new WebSocket(url);
|
|
39
|
+
this.ws.onopen = () => {
|
|
40
|
+
this.log('Connection opened');
|
|
41
|
+
};
|
|
42
|
+
this.ws.onmessage = (event) => {
|
|
43
|
+
this.handleMessage(event.data);
|
|
44
|
+
};
|
|
45
|
+
this.ws.onclose = (event) => {
|
|
46
|
+
this.handleClose(event.code, event.reason);
|
|
47
|
+
};
|
|
48
|
+
this.ws.onerror = (event) => {
|
|
49
|
+
this.log('WebSocket error', event);
|
|
50
|
+
this.emit('error', { message: 'WebSocket error' });
|
|
51
|
+
};
|
|
52
|
+
}
|
|
53
|
+
catch (error) {
|
|
54
|
+
this.log('Connection error', error);
|
|
55
|
+
this.emit('error', { message: 'Failed to connect' });
|
|
56
|
+
this.scheduleReconnect();
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
/**
|
|
60
|
+
* Handle incoming message
|
|
61
|
+
*/
|
|
62
|
+
handleMessage(data) {
|
|
63
|
+
try {
|
|
64
|
+
const message = JSON.parse(data);
|
|
65
|
+
this.log('Received:', message);
|
|
66
|
+
// Handle system events
|
|
67
|
+
switch (message.event) {
|
|
68
|
+
case 'connection:established':
|
|
69
|
+
this.handleConnectionEstablished(message.data);
|
|
70
|
+
break;
|
|
71
|
+
case 'pong':
|
|
72
|
+
// Heartbeat response
|
|
73
|
+
break;
|
|
74
|
+
default:
|
|
75
|
+
// Emit to listeners
|
|
76
|
+
this.emit(message.event, message.data);
|
|
77
|
+
}
|
|
78
|
+
}
|
|
79
|
+
catch (error) {
|
|
80
|
+
this.log('Failed to parse message', error);
|
|
81
|
+
}
|
|
82
|
+
}
|
|
83
|
+
/**
|
|
84
|
+
* Handle connection established
|
|
85
|
+
*/
|
|
86
|
+
handleConnectionEstablished(data) {
|
|
87
|
+
this.socketId = data.socketId;
|
|
88
|
+
this.state = 'connected';
|
|
89
|
+
this.reconnectAttempts = 0;
|
|
90
|
+
// Start heartbeat
|
|
91
|
+
this.startHeartbeat();
|
|
92
|
+
this.emit('connected', data);
|
|
93
|
+
this.emit('state:change', { state: this.state });
|
|
94
|
+
this.log(`Connected with socket ID: ${this.socketId}`);
|
|
95
|
+
}
|
|
96
|
+
/**
|
|
97
|
+
* Handle connection close
|
|
98
|
+
*/
|
|
99
|
+
handleClose(code, reason) {
|
|
100
|
+
this.log(`Connection closed: ${code} - ${reason}`);
|
|
101
|
+
this.stopHeartbeat();
|
|
102
|
+
this.ws = null;
|
|
103
|
+
this.socketId = null;
|
|
104
|
+
this.state = 'disconnected';
|
|
105
|
+
this.emit('disconnected', { code, reason });
|
|
106
|
+
this.emit('state:change', { state: this.state });
|
|
107
|
+
// Don't reconnect if intentionally closed or server refused
|
|
108
|
+
if (code === 4000 || code === 4001 || code === 4002 || code === 4999) {
|
|
109
|
+
this.log('Not reconnecting due to error code');
|
|
110
|
+
return;
|
|
111
|
+
}
|
|
112
|
+
this.scheduleReconnect();
|
|
113
|
+
}
|
|
114
|
+
/**
|
|
115
|
+
* Schedule reconnect
|
|
116
|
+
*/
|
|
117
|
+
scheduleReconnect() {
|
|
118
|
+
if (!this.options.autoReconnect)
|
|
119
|
+
return;
|
|
120
|
+
if (this.reconnectAttempts >= this.options.maxReconnectAttempts) {
|
|
121
|
+
this.log('Max reconnect attempts reached');
|
|
122
|
+
this.emit('reconnect:failed', { attempts: this.reconnectAttempts });
|
|
123
|
+
return;
|
|
124
|
+
}
|
|
125
|
+
this.reconnectAttempts++;
|
|
126
|
+
const delay = this.options.reconnectDelay * Math.pow(2, this.reconnectAttempts - 1);
|
|
127
|
+
this.log(`Scheduling reconnect attempt ${this.reconnectAttempts} in ${delay}ms`);
|
|
128
|
+
this.emit('reconnecting', { attempt: this.reconnectAttempts, delay });
|
|
129
|
+
this.reconnectTimeout = setTimeout(() => {
|
|
130
|
+
this.connect();
|
|
131
|
+
}, delay);
|
|
132
|
+
}
|
|
133
|
+
/**
|
|
134
|
+
* Start heartbeat
|
|
135
|
+
*/
|
|
136
|
+
startHeartbeat() {
|
|
137
|
+
this.stopHeartbeat();
|
|
138
|
+
this.heartbeatInterval = setInterval(() => {
|
|
139
|
+
if (this.ws?.readyState === WebSocket.OPEN) {
|
|
140
|
+
this.ws.send(JSON.stringify({ event: 'ping' }));
|
|
141
|
+
}
|
|
142
|
+
}, 25000);
|
|
143
|
+
}
|
|
144
|
+
/**
|
|
145
|
+
* Stop heartbeat
|
|
146
|
+
*/
|
|
147
|
+
stopHeartbeat() {
|
|
148
|
+
if (this.heartbeatInterval) {
|
|
149
|
+
clearInterval(this.heartbeatInterval);
|
|
150
|
+
this.heartbeatInterval = null;
|
|
151
|
+
}
|
|
152
|
+
}
|
|
153
|
+
/**
|
|
154
|
+
* Emit event to listeners
|
|
155
|
+
*/
|
|
156
|
+
emit(event, data) {
|
|
157
|
+
const listeners = this.eventListeners.get(event);
|
|
158
|
+
if (listeners) {
|
|
159
|
+
for (const callback of listeners) {
|
|
160
|
+
try {
|
|
161
|
+
callback(data);
|
|
162
|
+
}
|
|
163
|
+
catch (error) {
|
|
164
|
+
this.log(`Error in event listener for ${event}`, error);
|
|
165
|
+
}
|
|
166
|
+
}
|
|
167
|
+
}
|
|
168
|
+
// Also emit to wildcard listeners
|
|
169
|
+
const wildcardListeners = this.eventListeners.get('*');
|
|
170
|
+
if (wildcardListeners) {
|
|
171
|
+
for (const callback of wildcardListeners) {
|
|
172
|
+
try {
|
|
173
|
+
callback({ event, data });
|
|
174
|
+
}
|
|
175
|
+
catch (error) {
|
|
176
|
+
this.log(`Error in wildcard listener`, error);
|
|
177
|
+
}
|
|
178
|
+
}
|
|
179
|
+
}
|
|
180
|
+
}
|
|
181
|
+
/**
|
|
182
|
+
* Log message if debug is enabled
|
|
183
|
+
*/
|
|
184
|
+
log(message, ...args) {
|
|
185
|
+
if (this.options.debug) {
|
|
186
|
+
console.log(`[Kalze:${this.name}] ${message}`, ...args);
|
|
187
|
+
}
|
|
188
|
+
}
|
|
189
|
+
// Public API
|
|
190
|
+
/**
|
|
191
|
+
* Subscribe to an event
|
|
192
|
+
*/
|
|
193
|
+
on(event, callback) {
|
|
194
|
+
if (!this.eventListeners.has(event)) {
|
|
195
|
+
this.eventListeners.set(event, new Set());
|
|
196
|
+
}
|
|
197
|
+
this.eventListeners.get(event).add(callback);
|
|
198
|
+
// Return unsubscribe function
|
|
199
|
+
return () => this.off(event, callback);
|
|
200
|
+
}
|
|
201
|
+
/**
|
|
202
|
+
* Subscribe to an event once
|
|
203
|
+
*/
|
|
204
|
+
once(event, callback) {
|
|
205
|
+
const wrapper = (data) => {
|
|
206
|
+
this.off(event, wrapper);
|
|
207
|
+
callback(data);
|
|
208
|
+
};
|
|
209
|
+
return this.on(event, wrapper);
|
|
210
|
+
}
|
|
211
|
+
/**
|
|
212
|
+
* Unsubscribe from an event
|
|
213
|
+
*/
|
|
214
|
+
off(event, callback) {
|
|
215
|
+
if (!callback) {
|
|
216
|
+
this.eventListeners.delete(event);
|
|
217
|
+
}
|
|
218
|
+
else {
|
|
219
|
+
const listeners = this.eventListeners.get(event);
|
|
220
|
+
if (listeners) {
|
|
221
|
+
listeners.delete(callback);
|
|
222
|
+
if (listeners.size === 0) {
|
|
223
|
+
this.eventListeners.delete(event);
|
|
224
|
+
}
|
|
225
|
+
}
|
|
226
|
+
}
|
|
227
|
+
}
|
|
228
|
+
/**
|
|
229
|
+
* Send a client event to the channel
|
|
230
|
+
*/
|
|
231
|
+
trigger(data) {
|
|
232
|
+
if (this.ws?.readyState === WebSocket.OPEN) {
|
|
233
|
+
this.ws.send(JSON.stringify({
|
|
234
|
+
event: 'client:event',
|
|
235
|
+
data,
|
|
236
|
+
}));
|
|
237
|
+
}
|
|
238
|
+
else {
|
|
239
|
+
this.log('Cannot trigger event: not connected');
|
|
240
|
+
}
|
|
241
|
+
}
|
|
242
|
+
/**
|
|
243
|
+
* Disconnect from channel
|
|
244
|
+
*/
|
|
245
|
+
disconnect() {
|
|
246
|
+
if (this.reconnectTimeout) {
|
|
247
|
+
clearTimeout(this.reconnectTimeout);
|
|
248
|
+
this.reconnectTimeout = null;
|
|
249
|
+
}
|
|
250
|
+
this.stopHeartbeat();
|
|
251
|
+
if (this.ws) {
|
|
252
|
+
this.ws.close(1000, 'Client disconnect');
|
|
253
|
+
this.ws = null;
|
|
254
|
+
}
|
|
255
|
+
this.socketId = null;
|
|
256
|
+
this.state = 'disconnected';
|
|
257
|
+
this.eventListeners.clear();
|
|
258
|
+
}
|
|
259
|
+
/**
|
|
260
|
+
* Check if connected
|
|
261
|
+
*/
|
|
262
|
+
isConnected() {
|
|
263
|
+
return this.state === 'connected';
|
|
264
|
+
}
|
|
265
|
+
/**
|
|
266
|
+
* Get socket ID
|
|
267
|
+
*/
|
|
268
|
+
getSocketId() {
|
|
269
|
+
return this.socketId;
|
|
270
|
+
}
|
|
271
|
+
/**
|
|
272
|
+
* Get connection state
|
|
273
|
+
*/
|
|
274
|
+
getState() {
|
|
275
|
+
return this.state;
|
|
276
|
+
}
|
|
277
|
+
}
|
|
278
|
+
/**
|
|
279
|
+
* Kalze Client - Main entry point
|
|
280
|
+
*/
|
|
281
|
+
export class Kalze {
|
|
282
|
+
constructor(options) {
|
|
283
|
+
this.channels = new Map();
|
|
284
|
+
if (!options.key) {
|
|
285
|
+
throw new Error('API key is required');
|
|
286
|
+
}
|
|
287
|
+
if (!options.subdomain) {
|
|
288
|
+
throw new Error('Subdomain is required');
|
|
289
|
+
}
|
|
290
|
+
this.options = options;
|
|
291
|
+
}
|
|
292
|
+
/**
|
|
293
|
+
* Subscribe to a channel
|
|
294
|
+
*/
|
|
295
|
+
subscribe(channelName) {
|
|
296
|
+
if (this.channels.has(channelName)) {
|
|
297
|
+
return this.channels.get(channelName);
|
|
298
|
+
}
|
|
299
|
+
const channel = new KalzeChannel(channelName, this.options);
|
|
300
|
+
this.channels.set(channelName, channel);
|
|
301
|
+
return channel;
|
|
302
|
+
}
|
|
303
|
+
/**
|
|
304
|
+
* Unsubscribe from a channel
|
|
305
|
+
*/
|
|
306
|
+
unsubscribe(channelName) {
|
|
307
|
+
const channel = this.channels.get(channelName);
|
|
308
|
+
if (channel) {
|
|
309
|
+
channel.disconnect();
|
|
310
|
+
this.channels.delete(channelName);
|
|
311
|
+
}
|
|
312
|
+
}
|
|
313
|
+
/**
|
|
314
|
+
* Get all subscribed channels
|
|
315
|
+
*/
|
|
316
|
+
getChannels() {
|
|
317
|
+
return Array.from(this.channels.keys());
|
|
318
|
+
}
|
|
319
|
+
/**
|
|
320
|
+
* Get a specific channel
|
|
321
|
+
*/
|
|
322
|
+
getChannel(channelName) {
|
|
323
|
+
return this.channels.get(channelName);
|
|
324
|
+
}
|
|
325
|
+
/**
|
|
326
|
+
* Disconnect from all channels
|
|
327
|
+
*/
|
|
328
|
+
disconnectAll() {
|
|
329
|
+
for (const channel of this.channels.values()) {
|
|
330
|
+
channel.disconnect();
|
|
331
|
+
}
|
|
332
|
+
this.channels.clear();
|
|
333
|
+
}
|
|
334
|
+
}
|
|
335
|
+
// Default export
|
|
336
|
+
export default Kalze;
|
|
337
|
+
//# sourceMappingURL=client.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"client.js","sourceRoot":"","sources":["../src/client.ts"],"names":[],"mappings":"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"}
|
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
export { Kalze, KalzeChannel } from './client.js';
|
|
2
|
+
export type { KalzeOptions, EventCallback, ConnectionState, ServerMessage, ConnectionEstablished, ErrorData, Channel, KalzeClient, } from './types.js';
|
|
3
|
+
import { Kalze } from './client.js';
|
|
4
|
+
export default Kalze;
|
|
5
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,KAAK,EAAE,YAAY,EAAE,MAAM,aAAa,CAAA;AAGjD,YAAY,EACV,YAAY,EACZ,aAAa,EACb,eAAe,EACf,aAAa,EACb,qBAAqB,EACrB,SAAS,EACT,OAAO,EACP,WAAW,GACZ,MAAM,YAAY,CAAA;AAGnB,OAAO,EAAE,KAAK,EAAE,MAAM,aAAa,CAAA;AACnC,eAAe,KAAK,CAAA"}
|
package/dist/index.js
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,eAAe;AACf,OAAO,EAAE,KAAK,EAAE,YAAY,EAAE,MAAM,aAAa,CAAA;AAcjD,iBAAiB;AACjB,OAAO,EAAE,KAAK,EAAE,MAAM,aAAa,CAAA;AACnC,eAAe,KAAK,CAAA"}
|
package/dist/types.d.ts
ADDED
|
@@ -0,0 +1,124 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Event callback type
|
|
3
|
+
*/
|
|
4
|
+
export type EventCallback<T = unknown> = (data: T) => void;
|
|
5
|
+
/**
|
|
6
|
+
* Connection options
|
|
7
|
+
*/
|
|
8
|
+
export interface KalzeOptions {
|
|
9
|
+
/**
|
|
10
|
+
* Your public API key (wpk_live_*)
|
|
11
|
+
*/
|
|
12
|
+
key: string;
|
|
13
|
+
/**
|
|
14
|
+
* Your subdomain (e.g., 'rojo-azul-casa-gato')
|
|
15
|
+
*/
|
|
16
|
+
subdomain: string;
|
|
17
|
+
/**
|
|
18
|
+
* WebSocket server URL (default: wss://ws.websocket.cl)
|
|
19
|
+
*/
|
|
20
|
+
wsUrl?: string;
|
|
21
|
+
/**
|
|
22
|
+
* Auto reconnect on disconnect (default: true)
|
|
23
|
+
*/
|
|
24
|
+
autoReconnect?: boolean;
|
|
25
|
+
/**
|
|
26
|
+
* Max reconnect attempts (default: 10)
|
|
27
|
+
*/
|
|
28
|
+
maxReconnectAttempts?: number;
|
|
29
|
+
/**
|
|
30
|
+
* Base delay between reconnect attempts in ms (default: 1000)
|
|
31
|
+
*/
|
|
32
|
+
reconnectDelay?: number;
|
|
33
|
+
/**
|
|
34
|
+
* Enable debug logging (default: false)
|
|
35
|
+
*/
|
|
36
|
+
debug?: boolean;
|
|
37
|
+
}
|
|
38
|
+
/**
|
|
39
|
+
* Connection state
|
|
40
|
+
*/
|
|
41
|
+
export type ConnectionState = 'connecting' | 'connected' | 'disconnected' | 'reconnecting';
|
|
42
|
+
/**
|
|
43
|
+
* Message from server
|
|
44
|
+
*/
|
|
45
|
+
export interface ServerMessage<T = unknown> {
|
|
46
|
+
event: string;
|
|
47
|
+
data: T;
|
|
48
|
+
timestamp: number;
|
|
49
|
+
}
|
|
50
|
+
/**
|
|
51
|
+
* Connection established event data
|
|
52
|
+
*/
|
|
53
|
+
export interface ConnectionEstablished {
|
|
54
|
+
socketId: string;
|
|
55
|
+
channel: string;
|
|
56
|
+
subdomain: string;
|
|
57
|
+
timestamp: number;
|
|
58
|
+
}
|
|
59
|
+
/**
|
|
60
|
+
* Error event data
|
|
61
|
+
*/
|
|
62
|
+
export interface ErrorData {
|
|
63
|
+
message: string;
|
|
64
|
+
code?: number;
|
|
65
|
+
}
|
|
66
|
+
/**
|
|
67
|
+
* Channel instance type
|
|
68
|
+
*/
|
|
69
|
+
export interface Channel {
|
|
70
|
+
/**
|
|
71
|
+
* Channel name
|
|
72
|
+
*/
|
|
73
|
+
name: string;
|
|
74
|
+
/**
|
|
75
|
+
* Subscribe to an event on this channel
|
|
76
|
+
*/
|
|
77
|
+
on<T = unknown>(event: string, callback: EventCallback<T>): () => void;
|
|
78
|
+
/**
|
|
79
|
+
* Subscribe to an event once
|
|
80
|
+
*/
|
|
81
|
+
once<T = unknown>(event: string, callback: EventCallback<T>): () => void;
|
|
82
|
+
/**
|
|
83
|
+
* Unsubscribe from an event
|
|
84
|
+
*/
|
|
85
|
+
off(event: string, callback?: EventCallback): void;
|
|
86
|
+
/**
|
|
87
|
+
* Send a client event to the channel
|
|
88
|
+
*/
|
|
89
|
+
trigger<T = unknown>(data: T): void;
|
|
90
|
+
/**
|
|
91
|
+
* Disconnect from channel
|
|
92
|
+
*/
|
|
93
|
+
disconnect(): void;
|
|
94
|
+
/**
|
|
95
|
+
* Check if connected
|
|
96
|
+
*/
|
|
97
|
+
isConnected(): boolean;
|
|
98
|
+
/**
|
|
99
|
+
* Get socket ID
|
|
100
|
+
*/
|
|
101
|
+
getSocketId(): string | null;
|
|
102
|
+
}
|
|
103
|
+
/**
|
|
104
|
+
* Main Kalze client type
|
|
105
|
+
*/
|
|
106
|
+
export interface KalzeClient {
|
|
107
|
+
/**
|
|
108
|
+
* Subscribe to a channel
|
|
109
|
+
*/
|
|
110
|
+
subscribe(channelName: string): Channel;
|
|
111
|
+
/**
|
|
112
|
+
* Unsubscribe from a channel
|
|
113
|
+
*/
|
|
114
|
+
unsubscribe(channelName: string): void;
|
|
115
|
+
/**
|
|
116
|
+
* Get all subscribed channels
|
|
117
|
+
*/
|
|
118
|
+
getChannels(): string[];
|
|
119
|
+
/**
|
|
120
|
+
* Disconnect from all channels
|
|
121
|
+
*/
|
|
122
|
+
disconnectAll(): void;
|
|
123
|
+
}
|
|
124
|
+
//# sourceMappingURL=types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,MAAM,MAAM,aAAa,CAAC,CAAC,GAAG,OAAO,IAAI,CAAC,IAAI,EAAE,CAAC,KAAK,IAAI,CAAA;AAE1D;;GAEG;AACH,MAAM,WAAW,YAAY;IAC3B;;OAEG;IACH,GAAG,EAAE,MAAM,CAAA;IAEX;;OAEG;IACH,SAAS,EAAE,MAAM,CAAA;IAEjB;;OAEG;IACH,KAAK,CAAC,EAAE,MAAM,CAAA;IAEd;;OAEG;IACH,aAAa,CAAC,EAAE,OAAO,CAAA;IAEvB;;OAEG;IACH,oBAAoB,CAAC,EAAE,MAAM,CAAA;IAE7B;;OAEG;IACH,cAAc,CAAC,EAAE,MAAM,CAAA;IAEvB;;OAEG;IACH,KAAK,CAAC,EAAE,OAAO,CAAA;CAChB;AAED;;GAEG;AACH,MAAM,MAAM,eAAe,GAAG,YAAY,GAAG,WAAW,GAAG,cAAc,GAAG,cAAc,CAAA;AAE1F;;GAEG;AACH,MAAM,WAAW,aAAa,CAAC,CAAC,GAAG,OAAO;IACxC,KAAK,EAAE,MAAM,CAAA;IACb,IAAI,EAAE,CAAC,CAAA;IACP,SAAS,EAAE,MAAM,CAAA;CAClB;AAED;;GAEG;AACH,MAAM,WAAW,qBAAqB;IACpC,QAAQ,EAAE,MAAM,CAAA;IAChB,OAAO,EAAE,MAAM,CAAA;IACf,SAAS,EAAE,MAAM,CAAA;IACjB,SAAS,EAAE,MAAM,CAAA;CAClB;AAED;;GAEG;AACH,MAAM,WAAW,SAAS;IACxB,OAAO,EAAE,MAAM,CAAA;IACf,IAAI,CAAC,EAAE,MAAM,CAAA;CACd;AAED;;GAEG;AACH,MAAM,WAAW,OAAO;IACtB;;OAEG;IACH,IAAI,EAAE,MAAM,CAAA;IAEZ;;OAEG;IACH,EAAE,CAAC,CAAC,GAAG,OAAO,EAAE,KAAK,EAAE,MAAM,EAAE,QAAQ,EAAE,aAAa,CAAC,CAAC,CAAC,GAAG,MAAM,IAAI,CAAA;IAEtE;;OAEG;IACH,IAAI,CAAC,CAAC,GAAG,OAAO,EAAE,KAAK,EAAE,MAAM,EAAE,QAAQ,EAAE,aAAa,CAAC,CAAC,CAAC,GAAG,MAAM,IAAI,CAAA;IAExE;;OAEG;IACH,GAAG,CAAC,KAAK,EAAE,MAAM,EAAE,QAAQ,CAAC,EAAE,aAAa,GAAG,IAAI,CAAA;IAElD;;OAEG;IACH,OAAO,CAAC,CAAC,GAAG,OAAO,EAAE,IAAI,EAAE,CAAC,GAAG,IAAI,CAAA;IAEnC;;OAEG;IACH,UAAU,IAAI,IAAI,CAAA;IAElB;;OAEG;IACH,WAAW,IAAI,OAAO,CAAA;IAEtB;;OAEG;IACH,WAAW,IAAI,MAAM,GAAG,IAAI,CAAA;CAC7B;AAED;;GAEG;AACH,MAAM,WAAW,WAAW;IAC1B;;OAEG;IACH,SAAS,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAAA;IAEvC;;OAEG;IACH,WAAW,CAAC,WAAW,EAAE,MAAM,GAAG,IAAI,CAAA;IAEtC;;OAEG;IACH,WAAW,IAAI,MAAM,EAAE,CAAA;IAEvB;;OAEG;IACH,aAAa,IAAI,IAAI,CAAA;CACtB"}
|
package/dist/types.js
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":""}
|
package/package.json
ADDED
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "kalze-ws",
|
|
3
|
+
"version": "1.0.0",
|
|
4
|
+
"description": "WebSocket client for websocket.cl - Real-time connections made easy",
|
|
5
|
+
"type": "module",
|
|
6
|
+
"main": "dist/index.js",
|
|
7
|
+
"module": "dist/index.js",
|
|
8
|
+
"types": "dist/index.d.ts",
|
|
9
|
+
"exports": {
|
|
10
|
+
".": {
|
|
11
|
+
"import": "./dist/index.js",
|
|
12
|
+
"types": "./dist/index.d.ts"
|
|
13
|
+
}
|
|
14
|
+
},
|
|
15
|
+
"files": [
|
|
16
|
+
"dist"
|
|
17
|
+
],
|
|
18
|
+
"scripts": {
|
|
19
|
+
"build": "tsc",
|
|
20
|
+
"dev": "tsc --watch",
|
|
21
|
+
"prepublishOnly": "npm run build"
|
|
22
|
+
},
|
|
23
|
+
"keywords": [
|
|
24
|
+
"websocket",
|
|
25
|
+
"realtime",
|
|
26
|
+
"kalze",
|
|
27
|
+
"ws",
|
|
28
|
+
"client"
|
|
29
|
+
],
|
|
30
|
+
"author": "Kalze SpA",
|
|
31
|
+
"license": "MIT",
|
|
32
|
+
"homepage": "https://websocket.cl",
|
|
33
|
+
"repository": {
|
|
34
|
+
"type": "git",
|
|
35
|
+
"url": "https://github.com/kalze-ws/kalze-ws.git"
|
|
36
|
+
},
|
|
37
|
+
"devDependencies": {
|
|
38
|
+
"typescript": "^5.8.3"
|
|
39
|
+
},
|
|
40
|
+
"peerDependencies": {
|
|
41
|
+
"ws": "^8.0.0"
|
|
42
|
+
},
|
|
43
|
+
"peerDependenciesMeta": {
|
|
44
|
+
"ws": {
|
|
45
|
+
"optional": true
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
}
|