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 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
+ [![npm version](https://img.shields.io/npm/v/honeydrop.svg)](https://www.npmjs.com/package/honeydrop)
4
+ [![License: MIT](https://img.shields.io/badge/License-MIT-yellow.svg)](https://opensource.org/licenses/MIT)
5
+ [![Node.js](https://img.shields.io/badge/node-%3E%3D18-brightgreen.svg)](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