honeydrop 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/LICENSE +21 -0
- package/README.md +325 -0
- package/dist/honeydrop.cjs.js +2 -0
- package/dist/honeydrop.cjs.js.map +1 -0
- package/dist/honeydrop.esm.js +2 -0
- package/dist/honeydrop.esm.js.map +1 -0
- package/dist/honeydrop.umd.js +2 -0
- package/dist/honeydrop.umd.js.map +1 -0
- package/dist/index.d.ts +748 -0
- package/package.json +75 -0
package/LICENSE
ADDED
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
MIT License
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2024
|
|
4
|
+
|
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
6
|
+
of this software and associated documentation files (the "Software"), to deal
|
|
7
|
+
in the Software without restriction, including without limitation the rights
|
|
8
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
9
|
+
copies of the Software, and to permit persons to whom the Software is
|
|
10
|
+
furnished to do so, subject to the following conditions:
|
|
11
|
+
|
|
12
|
+
The above copyright notice and this permission notice shall be included in all
|
|
13
|
+
copies or substantial portions of the Software.
|
|
14
|
+
|
|
15
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
16
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
17
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
18
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
19
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
20
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
21
|
+
SOFTWARE.
|
package/README.md
ADDED
|
@@ -0,0 +1,325 @@
|
|
|
1
|
+
# Honeydrop 🍯
|
|
2
|
+
|
|
3
|
+
[](https://www.npmjs.com/package/honeydrop)
|
|
4
|
+
[](https://opensource.org/licenses/MIT)
|
|
5
|
+
[](https://nodejs.org)
|
|
6
|
+
|
|
7
|
+
A lightweight, developer-friendly helper library for Socket.IO applications. Simplifies real-time communication in web apps with easy connection management, automatic reconnection, and powerful utilities.
|
|
8
|
+
|
|
9
|
+
## 💡 Why Honeydrop?
|
|
10
|
+
|
|
11
|
+
I was working on a real-time project using Socket.IO myself and realized how much repetitive work was involved — managing rooms, handling reconnections, queuing events while offline, and retrying failed emits. That's why I decided to create **Honeydrop.js**, a lightweight, developer-friendly library that simplifies real-time communication and makes building robust Socket.IO apps faster and easier.
|
|
12
|
+
|
|
13
|
+
## ✨ Features
|
|
14
|
+
|
|
15
|
+
- 🔌 **Easy Connection Management** - Simple API to connect, disconnect, and manage Socket.IO connections
|
|
16
|
+
- 🎯 **Event Handling with Auto-Cleanup** - Register events that are automatically cleaned up on disconnect
|
|
17
|
+
- 🔄 **Automatic Reconnection** - Configurable retry strategies (linear/exponential backoff)
|
|
18
|
+
- 📛 **Namespaced Events** - Organize events into logical channels
|
|
19
|
+
- ⚡ **Utility Functions** - Multi-emit, multi-listen, throttle, debounce, and more
|
|
20
|
+
- 🐛 **Debug Logging** - Pretty-printed development logs
|
|
21
|
+
- 📦 **Lightweight** - No bundled dependencies, Socket.IO as peer dependency
|
|
22
|
+
- 🎨 **TypeScript Support** - Full type definitions included
|
|
23
|
+
|
|
24
|
+
## 📦 Installation
|
|
25
|
+
|
|
26
|
+
```bash
|
|
27
|
+
npm install honeydrop socket.io-client
|
|
28
|
+
```
|
|
29
|
+
|
|
30
|
+
## 🚀 Quick Start
|
|
31
|
+
|
|
32
|
+
```javascript
|
|
33
|
+
import Honeydrop from 'honeydrop';
|
|
34
|
+
|
|
35
|
+
// Create a client with auto-connect
|
|
36
|
+
const client = new Honeydrop('http://localhost:3000', {
|
|
37
|
+
debug: true,
|
|
38
|
+
reconnection: {
|
|
39
|
+
enabled: true,
|
|
40
|
+
maxAttempts: 5,
|
|
41
|
+
strategy: 'exponential'
|
|
42
|
+
}
|
|
43
|
+
});
|
|
44
|
+
|
|
45
|
+
// Listen for events
|
|
46
|
+
client.on('message', (data) => {
|
|
47
|
+
console.log('Received:', data);
|
|
48
|
+
});
|
|
49
|
+
|
|
50
|
+
// Emit events
|
|
51
|
+
client.emit('chat:message', { text: 'Hello, World!' });
|
|
52
|
+
|
|
53
|
+
// Disconnect (all listeners automatically cleaned up)
|
|
54
|
+
client.disconnect();
|
|
55
|
+
```
|
|
56
|
+
|
|
57
|
+
## 📖 API Reference
|
|
58
|
+
|
|
59
|
+
### Constructor
|
|
60
|
+
|
|
61
|
+
```javascript
|
|
62
|
+
new Honeydrop(url, options?)
|
|
63
|
+
```
|
|
64
|
+
|
|
65
|
+
| Option | Type | Default | Description |
|
|
66
|
+
|--------|------|---------|-------------|
|
|
67
|
+
| `debug` | `boolean` | `false` | Enable debug logging |
|
|
68
|
+
| `logLevel` | `'debug' \| 'info' \| 'warn' \| 'error'` | `'info'` | Minimum log level |
|
|
69
|
+
| `autoConnect` | `boolean` | `true` | Auto-connect on instantiation |
|
|
70
|
+
| `namespaceDelimiter` | `':' \| '/' \| '.' \| '_'` | `':'` | Delimiter for namespaced events |
|
|
71
|
+
| `reconnection` | `ReconnectionOptions` | — | Reconnection configuration |
|
|
72
|
+
| `offlineQueue` | `OfflineQueueOptions` | `{ enabled: true }` | Offline message queue configuration |
|
|
73
|
+
| `connectionMonitor` | `ConnectionMonitorOptions` | `{ enabled: true }` | Connection health monitoring |
|
|
74
|
+
| `roomManager` | `RoomManagerOptions` | — | Room join/leave event names |
|
|
75
|
+
| `socketOptions` | `object` | — | Socket.IO client options |
|
|
76
|
+
|
|
77
|
+
#### Reconnection Options
|
|
78
|
+
|
|
79
|
+
```javascript
|
|
80
|
+
{
|
|
81
|
+
enabled: true, // Enable auto-reconnection
|
|
82
|
+
maxAttempts: 10, // Maximum retry attempts
|
|
83
|
+
delay: 1000, // Initial delay (ms)
|
|
84
|
+
maxDelay: 30000, // Maximum delay (ms)
|
|
85
|
+
strategy: 'exponential', // 'linear' or 'exponential'
|
|
86
|
+
onReconnecting: (attempt) => {}, // Called on each attempt
|
|
87
|
+
onReconnected: () => {}, // Called on success
|
|
88
|
+
onFailed: () => {} // Called when max attempts reached
|
|
89
|
+
}
|
|
90
|
+
```
|
|
91
|
+
|
|
92
|
+
#### Offline Queue Options
|
|
93
|
+
|
|
94
|
+
```javascript
|
|
95
|
+
{
|
|
96
|
+
enabled: true, // Enable offline queueing (default: true)
|
|
97
|
+
maxSize: 100, // Maximum events to queue (0 = unlimited)
|
|
98
|
+
maxAge: 0, // Max age in ms before discard (0 = no expiry)
|
|
99
|
+
onQueued: (event) => {}, // Called when event is queued
|
|
100
|
+
onFlushed: (count) => {}, // Called when queue is flushed on reconnect
|
|
101
|
+
onDropped: (event) => {} // Called when event is dropped (queue full)
|
|
102
|
+
}
|
|
103
|
+
```
|
|
104
|
+
|
|
105
|
+
|
|
106
|
+
### Connection Methods
|
|
107
|
+
|
|
108
|
+
```javascript
|
|
109
|
+
// Connect to server
|
|
110
|
+
client.connect();
|
|
111
|
+
|
|
112
|
+
// Disconnect and cleanup
|
|
113
|
+
client.disconnect();
|
|
114
|
+
|
|
115
|
+
// Check connection status
|
|
116
|
+
client.connected; // boolean
|
|
117
|
+
client.id; // socket ID
|
|
118
|
+
|
|
119
|
+
// Get detailed connection info
|
|
120
|
+
client.getConnectionInfo();
|
|
121
|
+
// { connected: boolean, id: string | null, transport: string | null }
|
|
122
|
+
|
|
123
|
+
// Manual reconnection
|
|
124
|
+
client.reconnect();
|
|
125
|
+
```
|
|
126
|
+
|
|
127
|
+
### Event Handling
|
|
128
|
+
|
|
129
|
+
```javascript
|
|
130
|
+
// Register event listener
|
|
131
|
+
client.on('event', (data) => { /* ... */ });
|
|
132
|
+
|
|
133
|
+
// One-time listener
|
|
134
|
+
client.once('event', (data) => { /* ... */ });
|
|
135
|
+
|
|
136
|
+
// Remove listener
|
|
137
|
+
client.off('event', handler);
|
|
138
|
+
client.off('event'); // Remove all listeners for event
|
|
139
|
+
|
|
140
|
+
// Listen to multiple events
|
|
141
|
+
client.onMultiple(['user:join', 'user:leave'], (event, data) => {
|
|
142
|
+
console.log(`${event}:`, data);
|
|
143
|
+
});
|
|
144
|
+
|
|
145
|
+
// Fire once on any of the events
|
|
146
|
+
client.onceAny(['success', 'error'], (event, data) => {
|
|
147
|
+
console.log(`Got ${event}:`, data);
|
|
148
|
+
});
|
|
149
|
+
```
|
|
150
|
+
|
|
151
|
+
### Emitting Events
|
|
152
|
+
|
|
153
|
+
```javascript
|
|
154
|
+
// Basic emit
|
|
155
|
+
client.emit('event', data);
|
|
156
|
+
|
|
157
|
+
// Emit multiple events
|
|
158
|
+
client.emitMultiple([
|
|
159
|
+
{ event: 'init', data: { userId: 1 } },
|
|
160
|
+
{ event: 'status', data: { online: true } }
|
|
161
|
+
]);
|
|
162
|
+
|
|
163
|
+
// Emit with acknowledgment
|
|
164
|
+
const response = await client.emitWithAck('request', data, 5000);
|
|
165
|
+
|
|
166
|
+
// Emit multiple with acknowledgment
|
|
167
|
+
const responses = await client.emitMultipleWithAck([
|
|
168
|
+
{ event: 'validate', data: input1 },
|
|
169
|
+
{ event: 'validate', data: input2, timeout: 3000 }
|
|
170
|
+
]);
|
|
171
|
+
|
|
172
|
+
// Request/Response (RPC pattern)
|
|
173
|
+
const user = await client.request('getUser', { id: 123 });
|
|
174
|
+
// Server should emit 'getUser:response' with the result
|
|
175
|
+
|
|
176
|
+
// Emit with automatic retry
|
|
177
|
+
const result = await client.emitWithRetry('criticalAction', data, {
|
|
178
|
+
maxRetries: 3,
|
|
179
|
+
retryDelay: 1000,
|
|
180
|
+
onRetry: (attempt, error) => console.log(`Retry ${attempt}`)
|
|
181
|
+
});
|
|
182
|
+
```
|
|
183
|
+
|
|
184
|
+
### Room Management
|
|
185
|
+
|
|
186
|
+
```javascript
|
|
187
|
+
// Join a room
|
|
188
|
+
client.join('room-1');
|
|
189
|
+
|
|
190
|
+
// Leave a room
|
|
191
|
+
client.leave('room-1');
|
|
192
|
+
|
|
193
|
+
// Emit to a specific room
|
|
194
|
+
client.toRoom('room-1').emit('message', { text: 'Hello room!' });
|
|
195
|
+
|
|
196
|
+
// Get joined rooms
|
|
197
|
+
console.log(client.getRooms()); // ['room-1']
|
|
198
|
+
|
|
199
|
+
// Check if in a room
|
|
200
|
+
console.log(client.isInRoom('room-1')); // true
|
|
201
|
+
```
|
|
202
|
+
|
|
203
|
+
### Waiting for Events
|
|
204
|
+
|
|
205
|
+
```javascript
|
|
206
|
+
// Wait for a specific event
|
|
207
|
+
const data = await client.waitFor('ready', 5000);
|
|
208
|
+
|
|
209
|
+
// Wait for any of the events
|
|
210
|
+
const { event, data } = await client.waitForAny(['success', 'error']);
|
|
211
|
+
```
|
|
212
|
+
|
|
213
|
+
### Namespaced Events
|
|
214
|
+
|
|
215
|
+
```javascript
|
|
216
|
+
// Create a namespace
|
|
217
|
+
const chat = client.namespace('chat');
|
|
218
|
+
|
|
219
|
+
// All events are prefixed with 'chat:'
|
|
220
|
+
chat.on('message', handler); // Listens to 'chat:message'
|
|
221
|
+
chat.emit('message', data); // Emits 'chat:message'
|
|
222
|
+
|
|
223
|
+
// Create sub-namespaces
|
|
224
|
+
const room = chat.sub('room1');
|
|
225
|
+
room.emit('join'); // Emits 'chat:room1:join'
|
|
226
|
+
|
|
227
|
+
// Custom delimiter
|
|
228
|
+
const api = client.namespace('api', { delimiter: '/' });
|
|
229
|
+
api.emit('users', query); // Emits 'api/users'
|
|
230
|
+
```
|
|
231
|
+
|
|
232
|
+
### Throttle & Debounce
|
|
233
|
+
|
|
234
|
+
```javascript
|
|
235
|
+
// Throttled emit (max once per interval)
|
|
236
|
+
const throttledUpdate = client.throttle('position', 100);
|
|
237
|
+
// Call as often as you want, emits max 10 times/sec
|
|
238
|
+
throttledUpdate({ x: 100, y: 200 });
|
|
239
|
+
|
|
240
|
+
// Debounced emit (waits for pause in calls)
|
|
241
|
+
const debouncedSearch = client.debounce('search', 300);
|
|
242
|
+
// Only emits after 300ms of no calls
|
|
243
|
+
debouncedSearch({ query: 'hello' });
|
|
244
|
+
```
|
|
245
|
+
|
|
246
|
+
### Offline Queue
|
|
247
|
+
|
|
248
|
+
Events are automatically queued when disconnected and sent when reconnected:
|
|
249
|
+
|
|
250
|
+
```javascript
|
|
251
|
+
// Events emitted while offline are queued automatically
|
|
252
|
+
client.emit('message', { text: 'Hello' }); // Queued if offline
|
|
253
|
+
|
|
254
|
+
// Check queue status
|
|
255
|
+
console.log(client.getQueueLength()); // Number of queued events
|
|
256
|
+
console.log(client.getQueuedEvents()); // Array of queued events
|
|
257
|
+
|
|
258
|
+
// Clear the queue
|
|
259
|
+
client.clearQueue();
|
|
260
|
+
|
|
261
|
+
// Disable/enable offline queueing
|
|
262
|
+
client.setOfflineQueue(false);
|
|
263
|
+
```
|
|
264
|
+
|
|
265
|
+
### Connection Health
|
|
266
|
+
|
|
267
|
+
Monitor connection latency and quality:
|
|
268
|
+
|
|
269
|
+
```javascript
|
|
270
|
+
// Perform a ping and get latency
|
|
271
|
+
const latency = await client.ping(); // Returns latency in ms
|
|
272
|
+
|
|
273
|
+
// Get average latency
|
|
274
|
+
console.log(client.getLatency()); // Average latency in ms
|
|
275
|
+
|
|
276
|
+
// Get connection quality
|
|
277
|
+
console.log(client.getConnectionQuality()); // 'excellent' | 'good' | 'fair' | 'poor' | 'disconnected'
|
|
278
|
+
|
|
279
|
+
// Disable/enable monitoring
|
|
280
|
+
client.setConnectionMonitoring(false);
|
|
281
|
+
```
|
|
282
|
+
|
|
283
|
+
### Debugging
|
|
284
|
+
|
|
285
|
+
```javascript
|
|
286
|
+
// Enable/disable debug mode
|
|
287
|
+
client.setDebug(true);
|
|
288
|
+
|
|
289
|
+
// Set log level
|
|
290
|
+
client.setLogLevel('debug'); // 'debug' | 'info' | 'warn' | 'error'
|
|
291
|
+
```
|
|
292
|
+
|
|
293
|
+
## 🎮 Demo
|
|
294
|
+
|
|
295
|
+
Run the included demo to see Honeydrop in action:
|
|
296
|
+
|
|
297
|
+
```bash
|
|
298
|
+
cd demo
|
|
299
|
+
npm install
|
|
300
|
+
npm start
|
|
301
|
+
```
|
|
302
|
+
|
|
303
|
+
Then open `http://localhost:3000` in multiple browser tabs to test real-time communication.
|
|
304
|
+
|
|
305
|
+
## 🌐 Browser Usage
|
|
306
|
+
|
|
307
|
+
### With Bundler (Webpack, Vite, etc.)
|
|
308
|
+
|
|
309
|
+
```javascript
|
|
310
|
+
import Honeydrop from 'honeydrop';
|
|
311
|
+
```
|
|
312
|
+
|
|
313
|
+
### Via Script Tag
|
|
314
|
+
|
|
315
|
+
```html
|
|
316
|
+
<script src="https://cdn.socket.io/4.7.4/socket.io.min.js"></script>
|
|
317
|
+
<script src="path/to/honeydrop.umd.js"></script>
|
|
318
|
+
<script>
|
|
319
|
+
const client = new Honeydrop.Honeydrop('http://localhost:3000');
|
|
320
|
+
</script>
|
|
321
|
+
```
|
|
322
|
+
|
|
323
|
+
## 📄 License
|
|
324
|
+
|
|
325
|
+
MIT © 2024
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
"use strict";Object.defineProperty(exports,"__esModule",{value:!0});var e=require("socket.io-client");const t={debug:0,info:1,warn:2,error:3,none:4},n={debug:"#9E9E9E",info:"#2196F3",warn:"#FF9800",error:"#F44336",none:""};class o{constructor(e={}){this.level=e.level??"info",this.prefix=e.prefix??"[Honeydrop]",this.enabled=e.enabled??!1,this.isBrowser="undefined"!=typeof window}setLevel(e){this.level=e}setEnabled(e){this.enabled=e}shouldLog(e){return!!this.enabled&&t[e]>=t[this.level]}formatMessage(e,t){const o=(new Date).toISOString().split("T")[1].slice(0,-1);return this.isBrowser?[`%c${this.prefix} %c${e.toUpperCase()} %c[${o}] %c${t}`,"color: #FFC107; font-weight: bold",`color: ${n[e]}; font-weight: bold`,"color: #9E9E9E","color: inherit"]:[`${this.prefix} ${e.toUpperCase()} [${o}] ${t}`]}debug(e,...t){if(this.shouldLog("debug")){const n=this.formatMessage("debug",e);console.debug(...n,...t)}}info(e,...t){if(this.shouldLog("info")){const n=this.formatMessage("info",e);console.info(...n,...t)}}warn(e,...t){if(this.shouldLog("warn")){const n=this.formatMessage("warn",e);console.warn(...n,...t)}}error(e,...t){if(this.shouldLog("error")){const n=this.formatMessage("error",e);console.error(...n,...t)}}connection(e,t){this.info({connected:"🟢 Connected to server",disconnected:"🔴 Disconnected from server",reconnecting:"🟡 Attempting to reconnect...",reconnected:"🟢 Reconnected to server"}[e],t??"")}emit(e,t){this.debug(`📤 Emit: ${e}`,void 0!==t?t:"")}receive(e,t){this.debug(`📥 Received: ${e}`,void 0!==t?t:"")}}new o;class i{constructor(e){this.listeners=new Map,this.socket=null,this.logger=e}setSocket(e){this.socket=e}on(e,t){if(!this.socket)throw new Error("Socket not initialized. Call connect() first.");const n=(...n)=>{this.logger.receive(e,1===n.length?n[0]:n),t(...n)};this.socket.on(e,n),this.addListener(e,n,!1)}once(e,t){if(!this.socket)throw new Error("Socket not initialized. Call connect() first.");const n=(...o)=>{this.logger.receive(e,1===o.length?o[0]:o),this.removeListener(e,n),t(...o)};this.socket.once(e,n),this.addListener(e,n,!0)}off(e,t){if(this.socket)if(t)this.socket.off(e,t),this.removeListener(e,t);else{const t=this.listeners.get(e);t&&(t.forEach(t=>{this.socket?.off(e,t.handler)}),this.listeners.delete(e))}}onMultiple(e,t){e.forEach(e=>{this.on(e,(...n)=>t(e,...n))})}onceAny(e,t){let n=!1;const o=()=>{n||(n=!0,e.forEach(e=>this.off(e)))};e.forEach(e=>{this.on(e,(...i)=>{n||(o(),t(e,...i))})})}listenerCount(e){return this.listeners.get(e)?.length??0}eventNames(){return Array.from(this.listeners.keys())}removeAllListeners(){this.socket&&(this.listeners.forEach((e,t)=>{e.forEach(e=>{this.socket?.off(t,e.handler)})}),this.listeners.clear(),this.logger.debug("All event listeners removed"))}addListener(e,t,n){const o=this.listeners.get(e)??[];o.push({event:e,handler:t,once:n}),this.listeners.set(e,o)}removeListener(e,t){const n=this.listeners.get(e);if(n){const o=n.findIndex(e=>e.handler===t);-1!==o&&(n.splice(o,1),0===n.length&&this.listeners.delete(e))}}}const s={enabled:!0,maxAttempts:10,delay:1e3,maxDelay:3e4,strategy:"exponential"};class r{constructor(e,t){this.socket=null,this.attempts=0,this.timer=null,this.isReconnecting=!1,this.options={...s,...e},this.callbacks={onReconnecting:e.onReconnecting,onReconnected:e.onReconnected,onFailed:e.onFailed},this.logger=t}setSocket(e){this.socket=e,this.setupListeners()}calculateDelay(){let e;return e="exponential"===this.options.strategy?this.options.delay*Math.pow(2,this.attempts-1):this.options.delay,Math.min(e,this.options.maxDelay)}setupListeners(){this.socket&&(this.socket.on("disconnect",e=>{this.logger.connection("disconnected",{reason:e}),"io client disconnect"!==e&&this.options.enabled&&this.startReconnection()}),this.socket.on("connect",()=>{this.isReconnecting?(this.logger.connection("reconnected"),this.callbacks.onReconnected?.(),this.reset()):this.logger.connection("connected")}),this.socket.on("connect_error",()=>{this.isReconnecting&&this.attemptReconnection()}))}startReconnection(){this.isReconnecting||(this.isReconnecting=!0,this.attempts=0,this.attemptReconnection())}attemptReconnection(){if(!this.socket||!this.isReconnecting)return;if(this.attempts++,this.attempts>this.options.maxAttempts)return this.logger.error(`Reconnection failed after ${this.options.maxAttempts} attempts`),this.callbacks.onFailed?.(),void this.reset();const e=this.calculateDelay();this.logger.connection("reconnecting",{attempt:this.attempts,delay:e}),this.callbacks.onReconnecting?.(this.attempts),this.timer=setTimeout(()=>{this.socket&&this.isReconnecting&&this.socket.connect()},e)}reconnect(){if(!this.socket)throw new Error("Socket not initialized");this.reset(),this.socket.connect()}reset(){this.isReconnecting=!1,this.attempts=0,this.timer&&(clearTimeout(this.timer),this.timer=null)}stop(){this.reset(),this.logger.debug("Reconnection handler stopped")}getStatus(){return{isReconnecting:this.isReconnecting,attempts:this.attempts}}updateOptions(e){Object.assign(this.options,e),void 0!==e.onReconnecting&&(this.callbacks.onReconnecting=e.onReconnecting),void 0!==e.onReconnected&&(this.callbacks.onReconnected=e.onReconnected),void 0!==e.onFailed&&(this.callbacks.onFailed=e.onFailed)}}class c{constructor(e,t,n={}){this.name=e,this.emitter=t,this.delimiter=n.delimiter??":"}getEventName(e){return`${this.name}${this.delimiter}${e}`}on(e,t){this.emitter.on(this.getEventName(e),t)}once(e,t){this.emitter.once(this.getEventName(e),t)}off(e,t){this.emitter.off(this.getEventName(e),t)}emit(e,...t){this.emitter.emit(this.getEventName(e),...t)}getName(){return this.name}getDelimiter(){return this.delimiter}sub(e){return new c(`${this.name}${this.delimiter}${e}`,this.emitter,{delimiter:this.delimiter})}}const h={enabled:!0,maxSize:100,maxAge:0};class l{constructor(e={},t){this.queue=[],this.socket=null,this.options={...h,...e},this.logger=t}setSocket(e){this.socket=e,e.on("connect",()=>{this.flush()})}enqueue(e,...t){if(!this.options.enabled)return!1;const n={event:e,args:t,timestamp:Date.now()};return this.options.maxSize&&this.options.maxSize>0&&this.queue.length>=this.options.maxSize?(this.logger.warn(`Offline queue full. Dropping event: ${e}`),this.options.onDropped?.(n),!1):(this.queue.push(n),this.logger.debug(`Event queued offline: ${e} (queue size: ${this.queue.length})`),this.options.onQueued?.(n),!0)}flush(){if(!this.socket?.connected||0===this.queue.length)return;if(this.options.maxAge&&this.options.maxAge>0){const e=Date.now(),t=this.queue.length;this.queue=this.queue.filter(t=>e-t.timestamp<this.options.maxAge);const n=t-this.queue.length;n>0&&this.logger.debug(`Discarded ${n} expired events from queue`)}const e=this.queue.length;if(0!==e){for(this.logger.info(`Flushing ${e} queued events...`);this.queue.length>0;){const e=this.queue.shift();this.socket.emit(e.event,...e.args),this.logger.debug(`Flushed: ${e.event}`)}this.options.onFlushed?.(e),this.logger.info(`Successfully flushed ${e} events`)}}get length(){return this.queue.length}getQueue(){return[...this.queue]}clear(){const e=this.queue.length;this.queue=[],this.logger.debug(`Cleared ${e} events from offline queue`)}get enabled(){return this.options.enabled??!0}setEnabled(e){this.options.enabled=e}}const a={enabled:!0,pingInterval:5e3,pingTimeout:3e3,sampleSize:5,thresholds:{excellent:50,good:100,fair:300}};class u{constructor(e={},t){this.socket=null,this.intervalId=null,this.latencySamples=[],this.currentQuality="disconnected",this.lastPingTime=0,this.options={...a,...e,thresholds:{...a.thresholds,...e.thresholds}},this.logger=t}setSocket(e){this.socket=e,e.on("connect",()=>{this.options.enabled&&this.start()}),e.on("disconnect",()=>{this.stop(),this.updateQuality("disconnected",0)}),e.on("pong",()=>{const e=Date.now()-this.lastPingTime;this.recordLatency(e)}),e.connected&&this.options.enabled&&this.start()}start(){this.intervalId||(this.logger.debug("Connection monitoring started"),this.intervalId=setInterval(()=>{this.ping().catch(()=>{})},this.options.pingInterval??a.pingInterval),this.ping().catch(()=>{}))}stop(){this.intervalId&&(clearInterval(this.intervalId),this.intervalId=null,this.logger.debug("Connection monitoring stopped"))}async ping(){if(!this.socket?.connected)throw new Error("Socket not connected");return new Promise((e,t)=>{const n=this.options.pingTimeout??a.pingTimeout,o=setTimeout(()=>{t(new Error("Ping timeout")),this.recordLatency(n)},n);this.lastPingTime=Date.now(),this.socket.volatile.emit("ping",()=>{clearTimeout(o);const t=Date.now()-this.lastPingTime;this.recordLatency(t),e(t)})})}recordLatency(e){const t=this.options.sampleSize??a.sampleSize;this.latencySamples.push(e),this.latencySamples.length>t&&this.latencySamples.shift();const n=this.getAverageLatency(),o=this.calculateQuality(n);o!==this.currentQuality&&this.updateQuality(o,n)}updateQuality(e,t){const n=this.currentQuality;this.currentQuality=e,this.logger.debug(`Connection quality: ${n} -> ${e} (${t}ms)`),this.options.onQualityChange?.(e,t)}calculateQuality(e){const t={...a.thresholds,...this.options.thresholds};return e<=t.excellent?"excellent":e<=t.good?"good":e<=t.fair?"fair":"poor"}getAverageLatency(){if(0===this.latencySamples.length)return 0;const e=this.latencySamples.reduce((e,t)=>e+t,0);return Math.round(e/this.latencySamples.length)}getLatency(){return this.latencySamples[this.latencySamples.length-1]??0}getQuality(){return this.currentQuality}getLatencySamples(){return[...this.latencySamples]}get isMonitoring(){return null!==this.intervalId}setEnabled(e){this.options.enabled=e,e&&this.socket?.connected?this.start():e||this.stop()}}const g={joinEvent:"join",leaveEvent:"leave"};class d{constructor(e={},t){this.socket=null,this.joinedRooms=new Set,this.options={...g,...e},this.logger=t}setSocket(e){this.socket=e,e.on("disconnect",()=>{this.joinedRooms.clear(),this.logger.debug("Cleared room list on disconnect")})}join(e,t){if(!this.socket?.connected)throw new Error("Socket not connected. Cannot join room.");const n=this.options.joinEvent??g.joinEvent;void 0!==t?this.socket.emit(n,e,t):this.socket.emit(n,e),this.joinedRooms.add(e),this.logger.debug(`Joined room: ${e}`)}leave(e,t){if(!this.socket?.connected)throw new Error("Socket not connected. Cannot leave room.");const n=this.options.leaveEvent??g.leaveEvent;void 0!==t?this.socket.emit(n,e,t):this.socket.emit(n,e),this.joinedRooms.delete(e),this.logger.debug(`Left room: ${e}`)}toRoom(e){return{emit:(t,...n)=>{if(!this.socket?.connected)throw new Error("Socket not connected. Cannot emit to room.");this.socket.emit(t,e,...n),this.logger.debug(`Emitted to room ${e}: ${t}`)}}}getRooms(){return Array.from(this.joinedRooms)}isInRoom(e){return this.joinedRooms.has(e)}leaveAll(){for(const e of this.joinedRooms)this.leave(e)}}function m(e,t){t.forEach(({event:t,data:n})=>{void 0!==n?e.emit(t,n):e.emit(t)})}async function p(e,t){const n=t.map(async({event:t,data:n,timeout:o=5e3})=>new Promise((i,s)=>{const r=setTimeout(()=>{s(new Error(`Timeout waiting for ack: ${t}`))},o),c=void 0!==n?[n]:[];e.emit(t,...c,e=>{clearTimeout(r),i(e)})}));return Promise.all(n)}function f(e,t,n=5e3){return new Promise((o,i)=>{const s=setTimeout(()=>{e.off(t,r),i(new Error(`Timeout waiting for event: ${t}`))},n),r=e=>{clearTimeout(s),o(e)};e.once(t,r)})}function k(e,t,n=5e3){return new Promise((o,i)=>{const s=new Map,r=setTimeout(()=>{c(),i(new Error(`Timeout waiting for events: ${t.join(", ")}`))},n),c=()=>{s.forEach((t,n)=>{e.off(n,t)})};t.forEach(t=>{const n=e=>{clearTimeout(r),c(),o({event:t,data:e})};s.set(t,n),e.once(t,n)})})}function v(e,t,n,o=5e3){return new Promise((i,s)=>{const r=setTimeout(()=>{s(new Error(`Timeout waiting for ack: ${t}`))},o),c=void 0!==n?[n]:[];e.emit(t,...c,e=>{clearTimeout(r),i(e)})})}function w(e){return e?.connected??!1}function y(e){return e?{connected:e.connected,id:e.id??null,transport:e.io?.engine?.transport?.name??null}:{connected:!1,id:null,transport:null}}function E(e,t,n){let o,i=0,s=null;return r=>{const c=Date.now(),h=c-i;h>=n?(i=c,void 0!==r?e.emit(t,r):e.emit(t)):(o=r,s||(s=setTimeout(()=>{i=Date.now(),void 0!==o?e.emit(t,o):e.emit(t),s=null},n-h)))}}function b(e,t,n){let o=null;return i=>{o&&clearTimeout(o),o=setTimeout(()=>{void 0!==i?e.emit(t,i):e.emit(t),o=null},n)}}const R={debug:!1,logLevel:"info",namespaceDelimiter:":",autoConnect:!0};class S{constructor(e,t={}){this.socket=null,this.reconnectionHandler=null,this.namespaces=new Map,this.url=e,this.options={...R,...t},this.logger=new o({enabled:this.options.debug,level:this.options.logLevel}),this.eventManager=new i(this.logger),this.offlineQueue=new l(this.options.offlineQueue??{},this.logger),this.connectionMonitor=new u(this.options.connectionMonitor??{},this.logger),this.roomManager=new d(this.options.roomManager??{},this.logger),!1!==this.options.reconnection?.enabled&&(this.reconnectionHandler=new r(this.options.reconnection??{},this.logger)),this.options.autoConnect&&this.connect()}connect(){if(this.socket?.connected)return this.logger.warn("Already connected"),this.socket;const t={...this.options.socketOptions,reconnection:!1};return this.socket=e.io(this.url,t),this.eventManager.setSocket(this.socket),this.offlineQueue.setSocket(this.socket),this.connectionMonitor.setSocket(this.socket),this.roomManager.setSocket(this.socket),this.reconnectionHandler&&this.reconnectionHandler.setSocket(this.socket),this.socket}disconnect(){this.socket&&(this.eventManager.removeAllListeners(),this.reconnectionHandler?.stop(),this.connectionMonitor.stop(),this.socket.disconnect(),this.logger.connection("disconnected"))}on(e,t){return this.eventManager.on(e,t),this}once(e,t){return this.eventManager.once(e,t),this}off(e,t){return this.eventManager.off(e,t),this}emit(e,...t){if(!this.socket)throw new Error("Socket not initialized. Call connect() first.");return!this.socket.connected&&this.offlineQueue.enabled?(this.offlineQueue.enqueue(e,...t),this):(this.logger.emit(e,1===t.length?t[0]:t),this.socket.emit(e,...t),this)}emitMultiple(e){if(!this.socket)throw new Error("Socket not initialized. Call connect() first.");return m(this.socket,e),this}async emitWithAck(e,t,n){if(!this.socket)throw new Error("Socket not initialized. Call connect() first.");return v(this.socket,e,t,n)}async request(e,t,n={}){if(!this.socket)throw new Error("Socket not initialized. Call connect() first.");const o=n.timeout??5e3,i=n.responseEvent??`${e}:response`;return new Promise((n,s)=>{const r=setTimeout(()=>{this.socket?.off(i,c),s(new Error(`Request timeout: ${e} (${o}ms)`))},o),c=e=>{clearTimeout(r),n(e)};this.socket.once(i,c),this.logger.emit(e,t),void 0!==t?this.socket.emit(e,t):this.socket.emit(e)})}async emitWithRetry(e,t,n={}){if(!this.socket)throw new Error("Socket not initialized. Call connect() first.");const o=n.maxRetries??3,i=n.retryDelay??1e3,s=n.timeout??5e3;let r=new Error("Unknown error");for(let c=1;c<=o;c++)try{return await v(this.socket,e,t,s)}catch(t){r=t instanceof Error?t:new Error(String(t)),this.logger.warn(`Emit failed (attempt ${c}/${o}): ${e}`),n.onRetry?.(c,r),c<o&&await new Promise(e=>setTimeout(e,i))}throw new Error(`Emit failed after ${o} attempts: ${e}. Last error: ${r.message}`)}async emitMultipleWithAck(e){if(!this.socket)throw new Error("Socket not initialized. Call connect() first.");return p(this.socket,e)}onMultiple(e,t){return this.eventManager.onMultiple(e,t),this}onceAny(e,t){return this.eventManager.onceAny(e,t),this}async waitFor(e,t){if(!this.socket)throw new Error("Socket not initialized. Call connect() first.");return f(this.socket,e,t)}async waitForAny(e,t){if(!this.socket)throw new Error("Socket not initialized. Call connect() first.");return k(this.socket,e,t)}namespace(e,t){const n=e;if(!this.namespaces.has(n)){const o={delimiter:t?.delimiter??this.options.namespaceDelimiter};this.namespaces.set(n,new c(e,this,o))}return this.namespaces.get(n)}throttle(e,t){if(!this.socket)throw new Error("Socket not initialized. Call connect() first.");return E(this.socket,e,t)}debounce(e,t){if(!this.socket)throw new Error("Socket not initialized. Call connect() first.");return b(this.socket,e,t)}getSocket(){return this.socket}get connected(){return w(this.socket)}get id(){return this.socket?.id}getConnectionInfo(){return y(this.socket)}reconnect(){if(!this.reconnectionHandler)throw new Error("Reconnection is not enabled");this.reconnectionHandler.reconnect()}getReconnectionStatus(){return this.reconnectionHandler?.getStatus()??null}listenerCount(e){return this.eventManager.listenerCount(e)}eventNames(){return this.eventManager.eventNames()}setDebug(e){return this.logger.setEnabled(e),this}setLogLevel(e){return this.logger.setLevel(e),this}getQueueLength(){return this.offlineQueue.length}getQueuedEvents(){return this.offlineQueue.getQueue()}clearQueue(){return this.offlineQueue.clear(),this}setOfflineQueue(e){return this.offlineQueue.setEnabled(e),this}async ping(){return this.connectionMonitor.ping()}getLatency(){return this.connectionMonitor.getAverageLatency()}getConnectionQuality(){return this.connectionMonitor.getQuality()}setConnectionMonitoring(e){return this.connectionMonitor.setEnabled(e),this}join(e,t){return this.roomManager.join(e,t),this}leave(e,t){return this.roomManager.leave(e,t),this}toRoom(e){return this.roomManager.toRoom(e)}getRooms(){return this.roomManager.getRooms()}isInRoom(e){return this.roomManager.isInRoom(e)}}exports.ConnectionMonitor=u,exports.EventManager=i,exports.Honeydrop=S,exports.Logger=o,exports.NamespacedEvents=c,exports.OfflineQueue=l,exports.ReconnectionHandler=r,exports.RoomManager=d,exports.createDebouncedEmit=b,exports.createThrottledEmit=E,exports.default=S,exports.emitMultiple=m,exports.emitMultipleWithAck=p,exports.emitWithAck=v,exports.getConnectionInfo=y,exports.isConnected=w,exports.waitForAnyEvent=k,exports.waitForEvent=f;
|
|
2
|
+
//# sourceMappingURL=honeydrop.cjs.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"honeydrop.cjs.js","sources":["../src/logger.ts","../src/EventManager.ts","../src/ReconnectionHandler.ts","../src/NamespacedEvents.ts","../src/OfflineQueue.ts","../src/ConnectionMonitor.ts","../src/RoomManager.ts","../src/utils.ts","../src/Honeydrop.ts"],"sourcesContent":[null,null,null,null,null,null,null,null,null],"names":["LOG_LEVELS","debug","info","warn","error","none","LOG_COLORS","Logger","constructor","options","this","level","prefix","enabled","isBrowser","window","setLevel","setEnabled","shouldLog","formatMessage","message","timestamp","Date","toISOString","split","slice","toUpperCase","args","formatted","console","connection","event","details","connected","disconnected","reconnecting","reconnected","emit","data","undefined","receive","EventManager","logger","listeners","Map","socket","setSocket","on","handler","Error","wrappedHandler","length","addListener","once","removeListener","off","eventListeners","get","forEach","listener","delete","onMultiple","events","onceAny","fired","cleanup","listenerCount","eventNames","Array","from","keys","removeAllListeners","clear","push","set","index","findIndex","l","splice","DEFAULT_OPTIONS","maxAttempts","delay","maxDelay","strategy","ReconnectionHandler","attempts","timer","isReconnecting","callbacks","onReconnecting","onReconnected","onFailed","setupListeners","calculateDelay","Math","pow","min","reason","startReconnection","reset","attemptReconnection","attempt","setTimeout","connect","reconnect","clearTimeout","stop","getStatus","updateOptions","Object","assign","NamespacedEvents","name","emitter","delimiter","getEventName","getName","getDelimiter","sub","maxSize","maxAge","OfflineQueue","queue","flush","enqueue","queuedEvent","now","onDropped","onQueued","originalLength","filter","e","expired","count","shift","onFlushed","getQueue","pingInterval","pingTimeout","sampleSize","thresholds","excellent","good","fair","ConnectionMonitor","intervalId","latencySamples","currentQuality","lastPingTime","start","updateQuality","latency","recordLatency","setInterval","ping","catch","clearInterval","Promise","resolve","reject","timeout","volatile","avgLatency","getAverageLatency","quality","calculateQuality","previousQuality","onQualityChange","sum","reduce","a","b","round","getLatency","getQuality","getLatencySamples","isMonitoring","joinEvent","leaveEvent","RoomManager","joinedRooms","Set","join","room","add","leave","toRoom","getRooms","isInRoom","has","leaveAll","emitMultiple","async","emitMultipleWithAck","promises","map","response","all","waitForEvent","waitForAnyEvent","handlers","emitWithAck","isConnected","getConnectionInfo","id","transport","io","engine","createThrottledEmit","intervalMs","pendingData","lastEmit","timeSinceLastEmit","createDebouncedEmit","delayMs","logLevel","namespaceDelimiter","autoConnect","Honeydrop","url","reconnectionHandler","namespaces","eventManager","offlineQueue","connectionMonitor","roomManager","reconnection","socketOptions","disconnect","request","responseEvent","emitWithRetry","maxRetries","retryDelay","lastError","String","onRetry","waitFor","waitForAny","namespace","key","namespaceOptions","throttle","debounce","getSocket","getReconnectionStatus","setDebug","setLogLevel","getQueueLength","getQueuedEvents","clearQueue","setOfflineQueue","getConnectionQuality","setConnectionMonitoring"],"mappings":"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"}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
import{io as e}from"socket.io-client";const t={debug:0,info:1,warn:2,error:3,none:4},n={debug:"#9E9E9E",info:"#2196F3",warn:"#FF9800",error:"#F44336",none:""};class i{constructor(e={}){this.level=e.level??"info",this.prefix=e.prefix??"[Honeydrop]",this.enabled=e.enabled??!1,this.isBrowser="undefined"!=typeof window}setLevel(e){this.level=e}setEnabled(e){this.enabled=e}shouldLog(e){return!!this.enabled&&t[e]>=t[this.level]}formatMessage(e,t){const i=(new Date).toISOString().split("T")[1].slice(0,-1);return this.isBrowser?[`%c${this.prefix} %c${e.toUpperCase()} %c[${i}] %c${t}`,"color: #FFC107; font-weight: bold",`color: ${n[e]}; font-weight: bold`,"color: #9E9E9E","color: inherit"]:[`${this.prefix} ${e.toUpperCase()} [${i}] ${t}`]}debug(e,...t){if(this.shouldLog("debug")){const n=this.formatMessage("debug",e);console.debug(...n,...t)}}info(e,...t){if(this.shouldLog("info")){const n=this.formatMessage("info",e);console.info(...n,...t)}}warn(e,...t){if(this.shouldLog("warn")){const n=this.formatMessage("warn",e);console.warn(...n,...t)}}error(e,...t){if(this.shouldLog("error")){const n=this.formatMessage("error",e);console.error(...n,...t)}}connection(e,t){this.info({connected:"🟢 Connected to server",disconnected:"🔴 Disconnected from server",reconnecting:"🟡 Attempting to reconnect...",reconnected:"🟢 Reconnected to server"}[e],t??"")}emit(e,t){this.debug(`📤 Emit: ${e}`,void 0!==t?t:"")}receive(e,t){this.debug(`📥 Received: ${e}`,void 0!==t?t:"")}}new i;class o{constructor(e){this.listeners=new Map,this.socket=null,this.logger=e}setSocket(e){this.socket=e}on(e,t){if(!this.socket)throw new Error("Socket not initialized. Call connect() first.");const n=(...n)=>{this.logger.receive(e,1===n.length?n[0]:n),t(...n)};this.socket.on(e,n),this.addListener(e,n,!1)}once(e,t){if(!this.socket)throw new Error("Socket not initialized. Call connect() first.");const n=(...i)=>{this.logger.receive(e,1===i.length?i[0]:i),this.removeListener(e,n),t(...i)};this.socket.once(e,n),this.addListener(e,n,!0)}off(e,t){if(this.socket)if(t)this.socket.off(e,t),this.removeListener(e,t);else{const t=this.listeners.get(e);t&&(t.forEach(t=>{this.socket?.off(e,t.handler)}),this.listeners.delete(e))}}onMultiple(e,t){e.forEach(e=>{this.on(e,(...n)=>t(e,...n))})}onceAny(e,t){let n=!1;const i=()=>{n||(n=!0,e.forEach(e=>this.off(e)))};e.forEach(e=>{this.on(e,(...o)=>{n||(i(),t(e,...o))})})}listenerCount(e){return this.listeners.get(e)?.length??0}eventNames(){return Array.from(this.listeners.keys())}removeAllListeners(){this.socket&&(this.listeners.forEach((e,t)=>{e.forEach(e=>{this.socket?.off(t,e.handler)})}),this.listeners.clear(),this.logger.debug("All event listeners removed"))}addListener(e,t,n){const i=this.listeners.get(e)??[];i.push({event:e,handler:t,once:n}),this.listeners.set(e,i)}removeListener(e,t){const n=this.listeners.get(e);if(n){const i=n.findIndex(e=>e.handler===t);-1!==i&&(n.splice(i,1),0===n.length&&this.listeners.delete(e))}}}const s={enabled:!0,maxAttempts:10,delay:1e3,maxDelay:3e4,strategy:"exponential"};class r{constructor(e,t){this.socket=null,this.attempts=0,this.timer=null,this.isReconnecting=!1,this.options={...s,...e},this.callbacks={onReconnecting:e.onReconnecting,onReconnected:e.onReconnected,onFailed:e.onFailed},this.logger=t}setSocket(e){this.socket=e,this.setupListeners()}calculateDelay(){let e;return e="exponential"===this.options.strategy?this.options.delay*Math.pow(2,this.attempts-1):this.options.delay,Math.min(e,this.options.maxDelay)}setupListeners(){this.socket&&(this.socket.on("disconnect",e=>{this.logger.connection("disconnected",{reason:e}),"io client disconnect"!==e&&this.options.enabled&&this.startReconnection()}),this.socket.on("connect",()=>{this.isReconnecting?(this.logger.connection("reconnected"),this.callbacks.onReconnected?.(),this.reset()):this.logger.connection("connected")}),this.socket.on("connect_error",()=>{this.isReconnecting&&this.attemptReconnection()}))}startReconnection(){this.isReconnecting||(this.isReconnecting=!0,this.attempts=0,this.attemptReconnection())}attemptReconnection(){if(!this.socket||!this.isReconnecting)return;if(this.attempts++,this.attempts>this.options.maxAttempts)return this.logger.error(`Reconnection failed after ${this.options.maxAttempts} attempts`),this.callbacks.onFailed?.(),void this.reset();const e=this.calculateDelay();this.logger.connection("reconnecting",{attempt:this.attempts,delay:e}),this.callbacks.onReconnecting?.(this.attempts),this.timer=setTimeout(()=>{this.socket&&this.isReconnecting&&this.socket.connect()},e)}reconnect(){if(!this.socket)throw new Error("Socket not initialized");this.reset(),this.socket.connect()}reset(){this.isReconnecting=!1,this.attempts=0,this.timer&&(clearTimeout(this.timer),this.timer=null)}stop(){this.reset(),this.logger.debug("Reconnection handler stopped")}getStatus(){return{isReconnecting:this.isReconnecting,attempts:this.attempts}}updateOptions(e){Object.assign(this.options,e),void 0!==e.onReconnecting&&(this.callbacks.onReconnecting=e.onReconnecting),void 0!==e.onReconnected&&(this.callbacks.onReconnected=e.onReconnected),void 0!==e.onFailed&&(this.callbacks.onFailed=e.onFailed)}}class c{constructor(e,t,n={}){this.name=e,this.emitter=t,this.delimiter=n.delimiter??":"}getEventName(e){return`${this.name}${this.delimiter}${e}`}on(e,t){this.emitter.on(this.getEventName(e),t)}once(e,t){this.emitter.once(this.getEventName(e),t)}off(e,t){this.emitter.off(this.getEventName(e),t)}emit(e,...t){this.emitter.emit(this.getEventName(e),...t)}getName(){return this.name}getDelimiter(){return this.delimiter}sub(e){return new c(`${this.name}${this.delimiter}${e}`,this.emitter,{delimiter:this.delimiter})}}const h={enabled:!0,maxSize:100,maxAge:0};class l{constructor(e={},t){this.queue=[],this.socket=null,this.options={...h,...e},this.logger=t}setSocket(e){this.socket=e,e.on("connect",()=>{this.flush()})}enqueue(e,...t){if(!this.options.enabled)return!1;const n={event:e,args:t,timestamp:Date.now()};return this.options.maxSize&&this.options.maxSize>0&&this.queue.length>=this.options.maxSize?(this.logger.warn(`Offline queue full. Dropping event: ${e}`),this.options.onDropped?.(n),!1):(this.queue.push(n),this.logger.debug(`Event queued offline: ${e} (queue size: ${this.queue.length})`),this.options.onQueued?.(n),!0)}flush(){if(!this.socket?.connected||0===this.queue.length)return;if(this.options.maxAge&&this.options.maxAge>0){const e=Date.now(),t=this.queue.length;this.queue=this.queue.filter(t=>e-t.timestamp<this.options.maxAge);const n=t-this.queue.length;n>0&&this.logger.debug(`Discarded ${n} expired events from queue`)}const e=this.queue.length;if(0!==e){for(this.logger.info(`Flushing ${e} queued events...`);this.queue.length>0;){const e=this.queue.shift();this.socket.emit(e.event,...e.args),this.logger.debug(`Flushed: ${e.event}`)}this.options.onFlushed?.(e),this.logger.info(`Successfully flushed ${e} events`)}}get length(){return this.queue.length}getQueue(){return[...this.queue]}clear(){const e=this.queue.length;this.queue=[],this.logger.debug(`Cleared ${e} events from offline queue`)}get enabled(){return this.options.enabled??!0}setEnabled(e){this.options.enabled=e}}const a={enabled:!0,pingInterval:5e3,pingTimeout:3e3,sampleSize:5,thresholds:{excellent:50,good:100,fair:300}};class u{constructor(e={},t){this.socket=null,this.intervalId=null,this.latencySamples=[],this.currentQuality="disconnected",this.lastPingTime=0,this.options={...a,...e,thresholds:{...a.thresholds,...e.thresholds}},this.logger=t}setSocket(e){this.socket=e,e.on("connect",()=>{this.options.enabled&&this.start()}),e.on("disconnect",()=>{this.stop(),this.updateQuality("disconnected",0)}),e.on("pong",()=>{const e=Date.now()-this.lastPingTime;this.recordLatency(e)}),e.connected&&this.options.enabled&&this.start()}start(){this.intervalId||(this.logger.debug("Connection monitoring started"),this.intervalId=setInterval(()=>{this.ping().catch(()=>{})},this.options.pingInterval??a.pingInterval),this.ping().catch(()=>{}))}stop(){this.intervalId&&(clearInterval(this.intervalId),this.intervalId=null,this.logger.debug("Connection monitoring stopped"))}async ping(){if(!this.socket?.connected)throw new Error("Socket not connected");return new Promise((e,t)=>{const n=this.options.pingTimeout??a.pingTimeout,i=setTimeout(()=>{t(new Error("Ping timeout")),this.recordLatency(n)},n);this.lastPingTime=Date.now(),this.socket.volatile.emit("ping",()=>{clearTimeout(i);const t=Date.now()-this.lastPingTime;this.recordLatency(t),e(t)})})}recordLatency(e){const t=this.options.sampleSize??a.sampleSize;this.latencySamples.push(e),this.latencySamples.length>t&&this.latencySamples.shift();const n=this.getAverageLatency(),i=this.calculateQuality(n);i!==this.currentQuality&&this.updateQuality(i,n)}updateQuality(e,t){const n=this.currentQuality;this.currentQuality=e,this.logger.debug(`Connection quality: ${n} -> ${e} (${t}ms)`),this.options.onQualityChange?.(e,t)}calculateQuality(e){const t={...a.thresholds,...this.options.thresholds};return e<=t.excellent?"excellent":e<=t.good?"good":e<=t.fair?"fair":"poor"}getAverageLatency(){if(0===this.latencySamples.length)return 0;const e=this.latencySamples.reduce((e,t)=>e+t,0);return Math.round(e/this.latencySamples.length)}getLatency(){return this.latencySamples[this.latencySamples.length-1]??0}getQuality(){return this.currentQuality}getLatencySamples(){return[...this.latencySamples]}get isMonitoring(){return null!==this.intervalId}setEnabled(e){this.options.enabled=e,e&&this.socket?.connected?this.start():e||this.stop()}}const g={joinEvent:"join",leaveEvent:"leave"};class d{constructor(e={},t){this.socket=null,this.joinedRooms=new Set,this.options={...g,...e},this.logger=t}setSocket(e){this.socket=e,e.on("disconnect",()=>{this.joinedRooms.clear(),this.logger.debug("Cleared room list on disconnect")})}join(e,t){if(!this.socket?.connected)throw new Error("Socket not connected. Cannot join room.");const n=this.options.joinEvent??g.joinEvent;void 0!==t?this.socket.emit(n,e,t):this.socket.emit(n,e),this.joinedRooms.add(e),this.logger.debug(`Joined room: ${e}`)}leave(e,t){if(!this.socket?.connected)throw new Error("Socket not connected. Cannot leave room.");const n=this.options.leaveEvent??g.leaveEvent;void 0!==t?this.socket.emit(n,e,t):this.socket.emit(n,e),this.joinedRooms.delete(e),this.logger.debug(`Left room: ${e}`)}toRoom(e){return{emit:(t,...n)=>{if(!this.socket?.connected)throw new Error("Socket not connected. Cannot emit to room.");this.socket.emit(t,e,...n),this.logger.debug(`Emitted to room ${e}: ${t}`)}}}getRooms(){return Array.from(this.joinedRooms)}isInRoom(e){return this.joinedRooms.has(e)}leaveAll(){for(const e of this.joinedRooms)this.leave(e)}}function m(e,t){t.forEach(({event:t,data:n})=>{void 0!==n?e.emit(t,n):e.emit(t)})}async function f(e,t){const n=t.map(async({event:t,data:n,timeout:i=5e3})=>new Promise((o,s)=>{const r=setTimeout(()=>{s(new Error(`Timeout waiting for ack: ${t}`))},i),c=void 0!==n?[n]:[];e.emit(t,...c,e=>{clearTimeout(r),o(e)})}));return Promise.all(n)}function p(e,t,n=5e3){return new Promise((i,o)=>{const s=setTimeout(()=>{e.off(t,r),o(new Error(`Timeout waiting for event: ${t}`))},n),r=e=>{clearTimeout(s),i(e)};e.once(t,r)})}function k(e,t,n=5e3){return new Promise((i,o)=>{const s=new Map,r=setTimeout(()=>{c(),o(new Error(`Timeout waiting for events: ${t.join(", ")}`))},n),c=()=>{s.forEach((t,n)=>{e.off(n,t)})};t.forEach(t=>{const n=e=>{clearTimeout(r),c(),i({event:t,data:e})};s.set(t,n),e.once(t,n)})})}function v(e,t,n,i=5e3){return new Promise((o,s)=>{const r=setTimeout(()=>{s(new Error(`Timeout waiting for ack: ${t}`))},i),c=void 0!==n?[n]:[];e.emit(t,...c,e=>{clearTimeout(r),o(e)})})}function w(e){return e?.connected??!1}function y(e){return e?{connected:e.connected,id:e.id??null,transport:e.io?.engine?.transport?.name??null}:{connected:!1,id:null,transport:null}}function E(e,t,n){let i,o=0,s=null;return r=>{const c=Date.now(),h=c-o;h>=n?(o=c,void 0!==r?e.emit(t,r):e.emit(t)):(i=r,s||(s=setTimeout(()=>{o=Date.now(),void 0!==i?e.emit(t,i):e.emit(t),s=null},n-h)))}}function b(e,t,n){let i=null;return o=>{i&&clearTimeout(i),i=setTimeout(()=>{void 0!==o?e.emit(t,o):e.emit(t),i=null},n)}}const S={debug:!1,logLevel:"info",namespaceDelimiter:":",autoConnect:!0};class R{constructor(e,t={}){this.socket=null,this.reconnectionHandler=null,this.namespaces=new Map,this.url=e,this.options={...S,...t},this.logger=new i({enabled:this.options.debug,level:this.options.logLevel}),this.eventManager=new o(this.logger),this.offlineQueue=new l(this.options.offlineQueue??{},this.logger),this.connectionMonitor=new u(this.options.connectionMonitor??{},this.logger),this.roomManager=new d(this.options.roomManager??{},this.logger),!1!==this.options.reconnection?.enabled&&(this.reconnectionHandler=new r(this.options.reconnection??{},this.logger)),this.options.autoConnect&&this.connect()}connect(){if(this.socket?.connected)return this.logger.warn("Already connected"),this.socket;const t={...this.options.socketOptions,reconnection:!1};return this.socket=e(this.url,t),this.eventManager.setSocket(this.socket),this.offlineQueue.setSocket(this.socket),this.connectionMonitor.setSocket(this.socket),this.roomManager.setSocket(this.socket),this.reconnectionHandler&&this.reconnectionHandler.setSocket(this.socket),this.socket}disconnect(){this.socket&&(this.eventManager.removeAllListeners(),this.reconnectionHandler?.stop(),this.connectionMonitor.stop(),this.socket.disconnect(),this.logger.connection("disconnected"))}on(e,t){return this.eventManager.on(e,t),this}once(e,t){return this.eventManager.once(e,t),this}off(e,t){return this.eventManager.off(e,t),this}emit(e,...t){if(!this.socket)throw new Error("Socket not initialized. Call connect() first.");return!this.socket.connected&&this.offlineQueue.enabled?(this.offlineQueue.enqueue(e,...t),this):(this.logger.emit(e,1===t.length?t[0]:t),this.socket.emit(e,...t),this)}emitMultiple(e){if(!this.socket)throw new Error("Socket not initialized. Call connect() first.");return m(this.socket,e),this}async emitWithAck(e,t,n){if(!this.socket)throw new Error("Socket not initialized. Call connect() first.");return v(this.socket,e,t,n)}async request(e,t,n={}){if(!this.socket)throw new Error("Socket not initialized. Call connect() first.");const i=n.timeout??5e3,o=n.responseEvent??`${e}:response`;return new Promise((n,s)=>{const r=setTimeout(()=>{this.socket?.off(o,c),s(new Error(`Request timeout: ${e} (${i}ms)`))},i),c=e=>{clearTimeout(r),n(e)};this.socket.once(o,c),this.logger.emit(e,t),void 0!==t?this.socket.emit(e,t):this.socket.emit(e)})}async emitWithRetry(e,t,n={}){if(!this.socket)throw new Error("Socket not initialized. Call connect() first.");const i=n.maxRetries??3,o=n.retryDelay??1e3,s=n.timeout??5e3;let r=new Error("Unknown error");for(let c=1;c<=i;c++)try{return await v(this.socket,e,t,s)}catch(t){r=t instanceof Error?t:new Error(String(t)),this.logger.warn(`Emit failed (attempt ${c}/${i}): ${e}`),n.onRetry?.(c,r),c<i&&await new Promise(e=>setTimeout(e,o))}throw new Error(`Emit failed after ${i} attempts: ${e}. Last error: ${r.message}`)}async emitMultipleWithAck(e){if(!this.socket)throw new Error("Socket not initialized. Call connect() first.");return f(this.socket,e)}onMultiple(e,t){return this.eventManager.onMultiple(e,t),this}onceAny(e,t){return this.eventManager.onceAny(e,t),this}async waitFor(e,t){if(!this.socket)throw new Error("Socket not initialized. Call connect() first.");return p(this.socket,e,t)}async waitForAny(e,t){if(!this.socket)throw new Error("Socket not initialized. Call connect() first.");return k(this.socket,e,t)}namespace(e,t){const n=e;if(!this.namespaces.has(n)){const i={delimiter:t?.delimiter??this.options.namespaceDelimiter};this.namespaces.set(n,new c(e,this,i))}return this.namespaces.get(n)}throttle(e,t){if(!this.socket)throw new Error("Socket not initialized. Call connect() first.");return E(this.socket,e,t)}debounce(e,t){if(!this.socket)throw new Error("Socket not initialized. Call connect() first.");return b(this.socket,e,t)}getSocket(){return this.socket}get connected(){return w(this.socket)}get id(){return this.socket?.id}getConnectionInfo(){return y(this.socket)}reconnect(){if(!this.reconnectionHandler)throw new Error("Reconnection is not enabled");this.reconnectionHandler.reconnect()}getReconnectionStatus(){return this.reconnectionHandler?.getStatus()??null}listenerCount(e){return this.eventManager.listenerCount(e)}eventNames(){return this.eventManager.eventNames()}setDebug(e){return this.logger.setEnabled(e),this}setLogLevel(e){return this.logger.setLevel(e),this}getQueueLength(){return this.offlineQueue.length}getQueuedEvents(){return this.offlineQueue.getQueue()}clearQueue(){return this.offlineQueue.clear(),this}setOfflineQueue(e){return this.offlineQueue.setEnabled(e),this}async ping(){return this.connectionMonitor.ping()}getLatency(){return this.connectionMonitor.getAverageLatency()}getConnectionQuality(){return this.connectionMonitor.getQuality()}setConnectionMonitoring(e){return this.connectionMonitor.setEnabled(e),this}join(e,t){return this.roomManager.join(e,t),this}leave(e,t){return this.roomManager.leave(e,t),this}toRoom(e){return this.roomManager.toRoom(e)}getRooms(){return this.roomManager.getRooms()}isInRoom(e){return this.roomManager.isInRoom(e)}}export{u as ConnectionMonitor,o as EventManager,R as Honeydrop,i as Logger,c as NamespacedEvents,l as OfflineQueue,r as ReconnectionHandler,d as RoomManager,b as createDebouncedEmit,E as createThrottledEmit,R as default,m as emitMultiple,f as emitMultipleWithAck,v as emitWithAck,y as getConnectionInfo,w as isConnected,k as waitForAnyEvent,p as waitForEvent};
|
|
2
|
+
//# sourceMappingURL=honeydrop.esm.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"honeydrop.esm.js","sources":["../src/logger.ts","../src/EventManager.ts","../src/ReconnectionHandler.ts","../src/NamespacedEvents.ts","../src/OfflineQueue.ts","../src/ConnectionMonitor.ts","../src/RoomManager.ts","../src/utils.ts","../src/Honeydrop.ts"],"sourcesContent":[null,null,null,null,null,null,null,null,null],"names":["LOG_LEVELS","debug","info","warn","error","none","LOG_COLORS","Logger","constructor","options","this","level","prefix","enabled","isBrowser","window","setLevel","setEnabled","shouldLog","formatMessage","message","timestamp","Date","toISOString","split","slice","toUpperCase","args","formatted","console","connection","event","details","connected","disconnected","reconnecting","reconnected","emit","data","undefined","receive","EventManager","logger","listeners","Map","socket","setSocket","on","handler","Error","wrappedHandler","length","addListener","once","removeListener","off","eventListeners","get","forEach","listener","delete","onMultiple","events","onceAny","fired","cleanup","listenerCount","eventNames","Array","from","keys","removeAllListeners","clear","push","set","index","findIndex","l","splice","DEFAULT_OPTIONS","maxAttempts","delay","maxDelay","strategy","ReconnectionHandler","attempts","timer","isReconnecting","callbacks","onReconnecting","onReconnected","onFailed","setupListeners","calculateDelay","Math","pow","min","reason","startReconnection","reset","attemptReconnection","attempt","setTimeout","connect","reconnect","clearTimeout","stop","getStatus","updateOptions","Object","assign","NamespacedEvents","name","emitter","delimiter","getEventName","getName","getDelimiter","sub","maxSize","maxAge","OfflineQueue","queue","flush","enqueue","queuedEvent","now","onDropped","onQueued","originalLength","filter","e","expired","count","shift","onFlushed","getQueue","pingInterval","pingTimeout","sampleSize","thresholds","excellent","good","fair","ConnectionMonitor","intervalId","latencySamples","currentQuality","lastPingTime","start","updateQuality","latency","recordLatency","setInterval","ping","catch","clearInterval","Promise","resolve","reject","timeout","volatile","avgLatency","getAverageLatency","quality","calculateQuality","previousQuality","onQualityChange","sum","reduce","a","b","round","getLatency","getQuality","getLatencySamples","isMonitoring","joinEvent","leaveEvent","RoomManager","joinedRooms","Set","join","room","add","leave","toRoom","getRooms","isInRoom","has","leaveAll","emitMultiple","async","emitMultipleWithAck","promises","map","response","all","waitForEvent","waitForAnyEvent","handlers","emitWithAck","isConnected","getConnectionInfo","id","transport","io","engine","createThrottledEmit","intervalMs","pendingData","lastEmit","timeSinceLastEmit","createDebouncedEmit","delayMs","logLevel","namespaceDelimiter","autoConnect","Honeydrop","url","reconnectionHandler","namespaces","eventManager","offlineQueue","connectionMonitor","roomManager","reconnection","socketOptions","disconnect","request","responseEvent","emitWithRetry","maxRetries","retryDelay","lastError","String","onRetry","waitFor","waitForAny","namespace","key","namespaceOptions","throttle","debounce","getSocket","getReconnectionStatus","setDebug","setLogLevel","getQueueLength","getQueuedEvents","clearQueue","setOfflineQueue","getConnectionQuality","setConnectionMonitoring"],"mappings":"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"}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
!function(e,t){"object"==typeof exports&&"undefined"!=typeof module?t(exports,require("socket.io-client")):"function"==typeof define&&define.amd?define(["exports","socket.io-client"],t):t((e="undefined"!=typeof globalThis?globalThis:e||self).Honeydrop={},e.io)}(this,function(e,t){"use strict";const n={debug:0,info:1,warn:2,error:3,none:4},i={debug:"#9E9E9E",info:"#2196F3",warn:"#FF9800",error:"#F44336",none:""};class o{constructor(e={}){this.level=e.level??"info",this.prefix=e.prefix??"[Honeydrop]",this.enabled=e.enabled??!1,this.isBrowser="undefined"!=typeof window}setLevel(e){this.level=e}setEnabled(e){this.enabled=e}shouldLog(e){return!!this.enabled&&n[e]>=n[this.level]}formatMessage(e,t){const n=(new Date).toISOString().split("T")[1].slice(0,-1);return this.isBrowser?[`%c${this.prefix} %c${e.toUpperCase()} %c[${n}] %c${t}`,"color: #FFC107; font-weight: bold",`color: ${i[e]}; font-weight: bold`,"color: #9E9E9E","color: inherit"]:[`${this.prefix} ${e.toUpperCase()} [${n}] ${t}`]}debug(e,...t){if(this.shouldLog("debug")){const n=this.formatMessage("debug",e);console.debug(...n,...t)}}info(e,...t){if(this.shouldLog("info")){const n=this.formatMessage("info",e);console.info(...n,...t)}}warn(e,...t){if(this.shouldLog("warn")){const n=this.formatMessage("warn",e);console.warn(...n,...t)}}error(e,...t){if(this.shouldLog("error")){const n=this.formatMessage("error",e);console.error(...n,...t)}}connection(e,t){this.info({connected:"🟢 Connected to server",disconnected:"🔴 Disconnected from server",reconnecting:"🟡 Attempting to reconnect...",reconnected:"🟢 Reconnected to server"}[e],t??"")}emit(e,t){this.debug(`📤 Emit: ${e}`,void 0!==t?t:"")}receive(e,t){this.debug(`📥 Received: ${e}`,void 0!==t?t:"")}}new o;class s{constructor(e){this.listeners=new Map,this.socket=null,this.logger=e}setSocket(e){this.socket=e}on(e,t){if(!this.socket)throw new Error("Socket not initialized. Call connect() first.");const n=(...n)=>{this.logger.receive(e,1===n.length?n[0]:n),t(...n)};this.socket.on(e,n),this.addListener(e,n,!1)}once(e,t){if(!this.socket)throw new Error("Socket not initialized. Call connect() first.");const n=(...i)=>{this.logger.receive(e,1===i.length?i[0]:i),this.removeListener(e,n),t(...i)};this.socket.once(e,n),this.addListener(e,n,!0)}off(e,t){if(this.socket)if(t)this.socket.off(e,t),this.removeListener(e,t);else{const t=this.listeners.get(e);t&&(t.forEach(t=>{this.socket?.off(e,t.handler)}),this.listeners.delete(e))}}onMultiple(e,t){e.forEach(e=>{this.on(e,(...n)=>t(e,...n))})}onceAny(e,t){let n=!1;const i=()=>{n||(n=!0,e.forEach(e=>this.off(e)))};e.forEach(e=>{this.on(e,(...o)=>{n||(i(),t(e,...o))})})}listenerCount(e){return this.listeners.get(e)?.length??0}eventNames(){return Array.from(this.listeners.keys())}removeAllListeners(){this.socket&&(this.listeners.forEach((e,t)=>{e.forEach(e=>{this.socket?.off(t,e.handler)})}),this.listeners.clear(),this.logger.debug("All event listeners removed"))}addListener(e,t,n){const i=this.listeners.get(e)??[];i.push({event:e,handler:t,once:n}),this.listeners.set(e,i)}removeListener(e,t){const n=this.listeners.get(e);if(n){const i=n.findIndex(e=>e.handler===t);-1!==i&&(n.splice(i,1),0===n.length&&this.listeners.delete(e))}}}const r={enabled:!0,maxAttempts:10,delay:1e3,maxDelay:3e4,strategy:"exponential"};class c{constructor(e,t){this.socket=null,this.attempts=0,this.timer=null,this.isReconnecting=!1,this.options={...r,...e},this.callbacks={onReconnecting:e.onReconnecting,onReconnected:e.onReconnected,onFailed:e.onFailed},this.logger=t}setSocket(e){this.socket=e,this.setupListeners()}calculateDelay(){let e;return e="exponential"===this.options.strategy?this.options.delay*Math.pow(2,this.attempts-1):this.options.delay,Math.min(e,this.options.maxDelay)}setupListeners(){this.socket&&(this.socket.on("disconnect",e=>{this.logger.connection("disconnected",{reason:e}),"io client disconnect"!==e&&this.options.enabled&&this.startReconnection()}),this.socket.on("connect",()=>{this.isReconnecting?(this.logger.connection("reconnected"),this.callbacks.onReconnected?.(),this.reset()):this.logger.connection("connected")}),this.socket.on("connect_error",()=>{this.isReconnecting&&this.attemptReconnection()}))}startReconnection(){this.isReconnecting||(this.isReconnecting=!0,this.attempts=0,this.attemptReconnection())}attemptReconnection(){if(!this.socket||!this.isReconnecting)return;if(this.attempts++,this.attempts>this.options.maxAttempts)return this.logger.error(`Reconnection failed after ${this.options.maxAttempts} attempts`),this.callbacks.onFailed?.(),void this.reset();const e=this.calculateDelay();this.logger.connection("reconnecting",{attempt:this.attempts,delay:e}),this.callbacks.onReconnecting?.(this.attempts),this.timer=setTimeout(()=>{this.socket&&this.isReconnecting&&this.socket.connect()},e)}reconnect(){if(!this.socket)throw new Error("Socket not initialized");this.reset(),this.socket.connect()}reset(){this.isReconnecting=!1,this.attempts=0,this.timer&&(clearTimeout(this.timer),this.timer=null)}stop(){this.reset(),this.logger.debug("Reconnection handler stopped")}getStatus(){return{isReconnecting:this.isReconnecting,attempts:this.attempts}}updateOptions(e){Object.assign(this.options,e),void 0!==e.onReconnecting&&(this.callbacks.onReconnecting=e.onReconnecting),void 0!==e.onReconnected&&(this.callbacks.onReconnected=e.onReconnected),void 0!==e.onFailed&&(this.callbacks.onFailed=e.onFailed)}}class h{constructor(e,t,n={}){this.name=e,this.emitter=t,this.delimiter=n.delimiter??":"}getEventName(e){return`${this.name}${this.delimiter}${e}`}on(e,t){this.emitter.on(this.getEventName(e),t)}once(e,t){this.emitter.once(this.getEventName(e),t)}off(e,t){this.emitter.off(this.getEventName(e),t)}emit(e,...t){this.emitter.emit(this.getEventName(e),...t)}getName(){return this.name}getDelimiter(){return this.delimiter}sub(e){return new h(`${this.name}${this.delimiter}${e}`,this.emitter,{delimiter:this.delimiter})}}const l={enabled:!0,maxSize:100,maxAge:0};class a{constructor(e={},t){this.queue=[],this.socket=null,this.options={...l,...e},this.logger=t}setSocket(e){this.socket=e,e.on("connect",()=>{this.flush()})}enqueue(e,...t){if(!this.options.enabled)return!1;const n={event:e,args:t,timestamp:Date.now()};return this.options.maxSize&&this.options.maxSize>0&&this.queue.length>=this.options.maxSize?(this.logger.warn(`Offline queue full. Dropping event: ${e}`),this.options.onDropped?.(n),!1):(this.queue.push(n),this.logger.debug(`Event queued offline: ${e} (queue size: ${this.queue.length})`),this.options.onQueued?.(n),!0)}flush(){if(!this.socket?.connected||0===this.queue.length)return;if(this.options.maxAge&&this.options.maxAge>0){const e=Date.now(),t=this.queue.length;this.queue=this.queue.filter(t=>e-t.timestamp<this.options.maxAge);const n=t-this.queue.length;n>0&&this.logger.debug(`Discarded ${n} expired events from queue`)}const e=this.queue.length;if(0!==e){for(this.logger.info(`Flushing ${e} queued events...`);this.queue.length>0;){const e=this.queue.shift();this.socket.emit(e.event,...e.args),this.logger.debug(`Flushed: ${e.event}`)}this.options.onFlushed?.(e),this.logger.info(`Successfully flushed ${e} events`)}}get length(){return this.queue.length}getQueue(){return[...this.queue]}clear(){const e=this.queue.length;this.queue=[],this.logger.debug(`Cleared ${e} events from offline queue`)}get enabled(){return this.options.enabled??!0}setEnabled(e){this.options.enabled=e}}const u={enabled:!0,pingInterval:5e3,pingTimeout:3e3,sampleSize:5,thresholds:{excellent:50,good:100,fair:300}};class g{constructor(e={},t){this.socket=null,this.intervalId=null,this.latencySamples=[],this.currentQuality="disconnected",this.lastPingTime=0,this.options={...u,...e,thresholds:{...u.thresholds,...e.thresholds}},this.logger=t}setSocket(e){this.socket=e,e.on("connect",()=>{this.options.enabled&&this.start()}),e.on("disconnect",()=>{this.stop(),this.updateQuality("disconnected",0)}),e.on("pong",()=>{const e=Date.now()-this.lastPingTime;this.recordLatency(e)}),e.connected&&this.options.enabled&&this.start()}start(){this.intervalId||(this.logger.debug("Connection monitoring started"),this.intervalId=setInterval(()=>{this.ping().catch(()=>{})},this.options.pingInterval??u.pingInterval),this.ping().catch(()=>{}))}stop(){this.intervalId&&(clearInterval(this.intervalId),this.intervalId=null,this.logger.debug("Connection monitoring stopped"))}async ping(){if(!this.socket?.connected)throw new Error("Socket not connected");return new Promise((e,t)=>{const n=this.options.pingTimeout??u.pingTimeout,i=setTimeout(()=>{t(new Error("Ping timeout")),this.recordLatency(n)},n);this.lastPingTime=Date.now(),this.socket.volatile.emit("ping",()=>{clearTimeout(i);const t=Date.now()-this.lastPingTime;this.recordLatency(t),e(t)})})}recordLatency(e){const t=this.options.sampleSize??u.sampleSize;this.latencySamples.push(e),this.latencySamples.length>t&&this.latencySamples.shift();const n=this.getAverageLatency(),i=this.calculateQuality(n);i!==this.currentQuality&&this.updateQuality(i,n)}updateQuality(e,t){const n=this.currentQuality;this.currentQuality=e,this.logger.debug(`Connection quality: ${n} -> ${e} (${t}ms)`),this.options.onQualityChange?.(e,t)}calculateQuality(e){const t={...u.thresholds,...this.options.thresholds};return e<=t.excellent?"excellent":e<=t.good?"good":e<=t.fair?"fair":"poor"}getAverageLatency(){if(0===this.latencySamples.length)return 0;const e=this.latencySamples.reduce((e,t)=>e+t,0);return Math.round(e/this.latencySamples.length)}getLatency(){return this.latencySamples[this.latencySamples.length-1]??0}getQuality(){return this.currentQuality}getLatencySamples(){return[...this.latencySamples]}get isMonitoring(){return null!==this.intervalId}setEnabled(e){this.options.enabled=e,e&&this.socket?.connected?this.start():e||this.stop()}}const d={joinEvent:"join",leaveEvent:"leave"};class m{constructor(e={},t){this.socket=null,this.joinedRooms=new Set,this.options={...d,...e},this.logger=t}setSocket(e){this.socket=e,e.on("disconnect",()=>{this.joinedRooms.clear(),this.logger.debug("Cleared room list on disconnect")})}join(e,t){if(!this.socket?.connected)throw new Error("Socket not connected. Cannot join room.");const n=this.options.joinEvent??d.joinEvent;void 0!==t?this.socket.emit(n,e,t):this.socket.emit(n,e),this.joinedRooms.add(e),this.logger.debug(`Joined room: ${e}`)}leave(e,t){if(!this.socket?.connected)throw new Error("Socket not connected. Cannot leave room.");const n=this.options.leaveEvent??d.leaveEvent;void 0!==t?this.socket.emit(n,e,t):this.socket.emit(n,e),this.joinedRooms.delete(e),this.logger.debug(`Left room: ${e}`)}toRoom(e){return{emit:(t,...n)=>{if(!this.socket?.connected)throw new Error("Socket not connected. Cannot emit to room.");this.socket.emit(t,e,...n),this.logger.debug(`Emitted to room ${e}: ${t}`)}}}getRooms(){return Array.from(this.joinedRooms)}isInRoom(e){return this.joinedRooms.has(e)}leaveAll(){for(const e of this.joinedRooms)this.leave(e)}}function f(e,t){t.forEach(({event:t,data:n})=>{void 0!==n?e.emit(t,n):e.emit(t)})}async function p(e,t){const n=t.map(async({event:t,data:n,timeout:i=5e3})=>new Promise((o,s)=>{const r=setTimeout(()=>{s(new Error(`Timeout waiting for ack: ${t}`))},i),c=void 0!==n?[n]:[];e.emit(t,...c,e=>{clearTimeout(r),o(e)})}));return Promise.all(n)}function k(e,t,n=5e3){return new Promise((i,o)=>{const s=setTimeout(()=>{e.off(t,r),o(new Error(`Timeout waiting for event: ${t}`))},n),r=e=>{clearTimeout(s),i(e)};e.once(t,r)})}function v(e,t,n=5e3){return new Promise((i,o)=>{const s=new Map,r=setTimeout(()=>{c(),o(new Error(`Timeout waiting for events: ${t.join(", ")}`))},n),c=()=>{s.forEach((t,n)=>{e.off(n,t)})};t.forEach(t=>{const n=e=>{clearTimeout(r),c(),i({event:t,data:e})};s.set(t,n),e.once(t,n)})})}function w(e,t,n,i=5e3){return new Promise((o,s)=>{const r=setTimeout(()=>{s(new Error(`Timeout waiting for ack: ${t}`))},i),c=void 0!==n?[n]:[];e.emit(t,...c,e=>{clearTimeout(r),o(e)})})}function y(e){return e?.connected??!1}function E(e){return e?{connected:e.connected,id:e.id??null,transport:e.io?.engine?.transport?.name??null}:{connected:!1,id:null,transport:null}}function b(e,t,n){let i,o=0,s=null;return r=>{const c=Date.now(),h=c-o;h>=n?(o=c,void 0!==r?e.emit(t,r):e.emit(t)):(i=r,s||(s=setTimeout(()=>{o=Date.now(),void 0!==i?e.emit(t,i):e.emit(t),s=null},n-h)))}}function R(e,t,n){let i=null;return o=>{i&&clearTimeout(i),i=setTimeout(()=>{void 0!==o?e.emit(t,o):e.emit(t),i=null},n)}}const S={debug:!1,logLevel:"info",namespaceDelimiter:":",autoConnect:!0};class M{constructor(e,t={}){this.socket=null,this.reconnectionHandler=null,this.namespaces=new Map,this.url=e,this.options={...S,...t},this.logger=new o({enabled:this.options.debug,level:this.options.logLevel}),this.eventManager=new s(this.logger),this.offlineQueue=new a(this.options.offlineQueue??{},this.logger),this.connectionMonitor=new g(this.options.connectionMonitor??{},this.logger),this.roomManager=new m(this.options.roomManager??{},this.logger),!1!==this.options.reconnection?.enabled&&(this.reconnectionHandler=new c(this.options.reconnection??{},this.logger)),this.options.autoConnect&&this.connect()}connect(){if(this.socket?.connected)return this.logger.warn("Already connected"),this.socket;const e={...this.options.socketOptions,reconnection:!1};return this.socket=t.io(this.url,e),this.eventManager.setSocket(this.socket),this.offlineQueue.setSocket(this.socket),this.connectionMonitor.setSocket(this.socket),this.roomManager.setSocket(this.socket),this.reconnectionHandler&&this.reconnectionHandler.setSocket(this.socket),this.socket}disconnect(){this.socket&&(this.eventManager.removeAllListeners(),this.reconnectionHandler?.stop(),this.connectionMonitor.stop(),this.socket.disconnect(),this.logger.connection("disconnected"))}on(e,t){return this.eventManager.on(e,t),this}once(e,t){return this.eventManager.once(e,t),this}off(e,t){return this.eventManager.off(e,t),this}emit(e,...t){if(!this.socket)throw new Error("Socket not initialized. Call connect() first.");return!this.socket.connected&&this.offlineQueue.enabled?(this.offlineQueue.enqueue(e,...t),this):(this.logger.emit(e,1===t.length?t[0]:t),this.socket.emit(e,...t),this)}emitMultiple(e){if(!this.socket)throw new Error("Socket not initialized. Call connect() first.");return f(this.socket,e),this}async emitWithAck(e,t,n){if(!this.socket)throw new Error("Socket not initialized. Call connect() first.");return w(this.socket,e,t,n)}async request(e,t,n={}){if(!this.socket)throw new Error("Socket not initialized. Call connect() first.");const i=n.timeout??5e3,o=n.responseEvent??`${e}:response`;return new Promise((n,s)=>{const r=setTimeout(()=>{this.socket?.off(o,c),s(new Error(`Request timeout: ${e} (${i}ms)`))},i),c=e=>{clearTimeout(r),n(e)};this.socket.once(o,c),this.logger.emit(e,t),void 0!==t?this.socket.emit(e,t):this.socket.emit(e)})}async emitWithRetry(e,t,n={}){if(!this.socket)throw new Error("Socket not initialized. Call connect() first.");const i=n.maxRetries??3,o=n.retryDelay??1e3,s=n.timeout??5e3;let r=new Error("Unknown error");for(let c=1;c<=i;c++)try{return await w(this.socket,e,t,s)}catch(t){r=t instanceof Error?t:new Error(String(t)),this.logger.warn(`Emit failed (attempt ${c}/${i}): ${e}`),n.onRetry?.(c,r),c<i&&await new Promise(e=>setTimeout(e,o))}throw new Error(`Emit failed after ${i} attempts: ${e}. Last error: ${r.message}`)}async emitMultipleWithAck(e){if(!this.socket)throw new Error("Socket not initialized. Call connect() first.");return p(this.socket,e)}onMultiple(e,t){return this.eventManager.onMultiple(e,t),this}onceAny(e,t){return this.eventManager.onceAny(e,t),this}async waitFor(e,t){if(!this.socket)throw new Error("Socket not initialized. Call connect() first.");return k(this.socket,e,t)}async waitForAny(e,t){if(!this.socket)throw new Error("Socket not initialized. Call connect() first.");return v(this.socket,e,t)}namespace(e,t){const n=e;if(!this.namespaces.has(n)){const i={delimiter:t?.delimiter??this.options.namespaceDelimiter};this.namespaces.set(n,new h(e,this,i))}return this.namespaces.get(n)}throttle(e,t){if(!this.socket)throw new Error("Socket not initialized. Call connect() first.");return b(this.socket,e,t)}debounce(e,t){if(!this.socket)throw new Error("Socket not initialized. Call connect() first.");return R(this.socket,e,t)}getSocket(){return this.socket}get connected(){return y(this.socket)}get id(){return this.socket?.id}getConnectionInfo(){return E(this.socket)}reconnect(){if(!this.reconnectionHandler)throw new Error("Reconnection is not enabled");this.reconnectionHandler.reconnect()}getReconnectionStatus(){return this.reconnectionHandler?.getStatus()??null}listenerCount(e){return this.eventManager.listenerCount(e)}eventNames(){return this.eventManager.eventNames()}setDebug(e){return this.logger.setEnabled(e),this}setLogLevel(e){return this.logger.setLevel(e),this}getQueueLength(){return this.offlineQueue.length}getQueuedEvents(){return this.offlineQueue.getQueue()}clearQueue(){return this.offlineQueue.clear(),this}setOfflineQueue(e){return this.offlineQueue.setEnabled(e),this}async ping(){return this.connectionMonitor.ping()}getLatency(){return this.connectionMonitor.getAverageLatency()}getConnectionQuality(){return this.connectionMonitor.getQuality()}setConnectionMonitoring(e){return this.connectionMonitor.setEnabled(e),this}join(e,t){return this.roomManager.join(e,t),this}leave(e,t){return this.roomManager.leave(e,t),this}toRoom(e){return this.roomManager.toRoom(e)}getRooms(){return this.roomManager.getRooms()}isInRoom(e){return this.roomManager.isInRoom(e)}}e.ConnectionMonitor=g,e.EventManager=s,e.Honeydrop=M,e.Logger=o,e.NamespacedEvents=h,e.OfflineQueue=a,e.ReconnectionHandler=c,e.RoomManager=m,e.createDebouncedEmit=R,e.createThrottledEmit=b,e.default=M,e.emitMultiple=f,e.emitMultipleWithAck=p,e.emitWithAck=w,e.getConnectionInfo=E,e.isConnected=y,e.waitForAnyEvent=v,e.waitForEvent=k,Object.defineProperty(e,"__esModule",{value:!0})});
|
|
2
|
+
//# sourceMappingURL=honeydrop.umd.js.map
|