@rvncom/socket-bun-engine 1.0.0 → 1.0.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -1,5 +1,8 @@
1
1
  # @rvncom/socket-bun-engine
2
2
 
3
+ [![npm version](https://img.shields.io/npm/v/@rvncom/socket-bun-engine.svg)](https://www.npmjs.com/package/@rvncom/socket-bun-engine)
4
+ [![npm downloads](https://img.shields.io/npm/dm/@rvncom/socket-bun-engine.svg)](https://www.npmjs.com/package/@rvncom/socket-bun-engine)
5
+
3
6
  Engine.IO server implementation for the Bun runtime. Provides native WebSocket and HTTP long-polling transports for [Socket.IO](https://socket.io/).
4
7
 
5
8
  Fork of `@socket.io/bun-engine` with bug fixes, improved API, and active maintenance.
@@ -7,13 +10,13 @@ Fork of `@socket.io/bun-engine` with bug fixes, improved API, and active mainten
7
10
  ## Installation
8
11
 
9
12
  ```bash
10
- bun add @rvn/bun-engine
13
+ bun add @rvncom/socket-bun-engine
11
14
  ```
12
15
 
13
16
  ## Usage
14
17
 
15
18
  ```ts
16
- import { Server as Engine } from "@rvn/bun-engine";
19
+ import { Server as Engine } from "@rvncom/socket-bun-engine";
17
20
  import { Server } from "socket.io";
18
21
 
19
22
  const engine = new Engine({
package/dist/index.d.ts CHANGED
@@ -1,3 +1,4 @@
1
1
  export { Server, type ServerOptions } from "./server";
2
+ export { Socket, type CloseReason } from "./socket";
2
3
  export { type RawData } from "./parser";
3
4
  export { type BunWebSocket, type WebSocketData } from "./transports/websocket";
package/dist/index.js CHANGED
@@ -1,3 +1,4 @@
1
1
  export { Server } from "./server";
2
+ export { Socket } from "./socket";
2
3
  export {} from "./parser";
3
4
  export {} from "./transports/websocket";
package/dist/server.d.ts CHANGED
@@ -73,7 +73,7 @@ export declare class Server extends EventEmitter<Record<never, never>, Record<ne
73
73
  * @param req
74
74
  * @param server
75
75
  */
76
- handleRequest(req: Request, server: Bun.Server<WebSocketData>): Promise<Response>;
76
+ handleRequest(req: Request, server: Bun.Server<WebSocketData>, _url?: URL): Promise<Response>;
77
77
  onWebSocketOpen(ws: BunWebSocket): void;
78
78
  onWebSocketMessage(ws: BunWebSocket, message: RawData): void;
79
79
  onWebSocketClose(ws: BunWebSocket, code: number, message: string): void;
@@ -96,9 +96,17 @@ export declare class Server extends EventEmitter<Record<never, never>, Record<ne
96
96
  */
97
97
  private handshake;
98
98
  /**
99
- * Closes all clients.
99
+ * Returns an iterator over all connected sockets.
100
100
  */
101
- close(): void;
101
+ get sockets(): IterableIterator<Socket>;
102
+ /**
103
+ * Returns the socket with the given id, if any.
104
+ */
105
+ getSocket(id: string): Socket | undefined;
106
+ /**
107
+ * Closes all clients and returns a Promise that resolves when all are closed.
108
+ */
109
+ close(): Promise<void>;
102
110
  /**
103
111
  * Creates a request handler.
104
112
  *
package/dist/server.js CHANGED
@@ -48,8 +48,8 @@ export class Server extends EventEmitter {
48
48
  * @param req
49
49
  * @param server
50
50
  */
51
- async handleRequest(req, server) {
52
- const url = new URL(req.url);
51
+ async handleRequest(req, server, _url) {
52
+ const url = _url ?? new URL(req.url);
53
53
  debug(`handling ${req.method} ${req.url}`);
54
54
  const responseHeaders = new Headers();
55
55
  if (this.opts.cors) {
@@ -279,11 +279,37 @@ export class Server extends EventEmitter {
279
279
  return promise;
280
280
  }
281
281
  /**
282
- * Closes all clients.
282
+ * Returns an iterator over all connected sockets.
283
+ */
284
+ get sockets() {
285
+ return this.clients.values();
286
+ }
287
+ /**
288
+ * Returns the socket with the given id, if any.
289
+ */
290
+ getSocket(id) {
291
+ return this.clients.get(id);
292
+ }
293
+ /**
294
+ * Closes all clients and returns a Promise that resolves when all are closed.
283
295
  */
284
296
  close() {
285
297
  debug("closing all open clients");
286
- this.clients.forEach((client) => client.close());
298
+ if (this.clients.size === 0) {
299
+ return Promise.resolve();
300
+ }
301
+ return new Promise((resolve) => {
302
+ let remaining = this.clients.size;
303
+ const onClose = () => {
304
+ if (--remaining === 0) {
305
+ resolve();
306
+ }
307
+ };
308
+ this.clients.forEach((client) => {
309
+ client.once("close", onClose);
310
+ client.close();
311
+ });
312
+ });
287
313
  }
288
314
  /**
289
315
  * Creates a request handler.
@@ -323,7 +349,7 @@ export class Server extends EventEmitter {
323
349
  fetch: (req, server) => {
324
350
  const url = new URL(req.url);
325
351
  if (url.pathname === this.opts.path) {
326
- return this.handleRequest(req, server);
352
+ return this.handleRequest(req, server, url);
327
353
  }
328
354
  else {
329
355
  return new Response(null, { status: 404 });
@@ -11,13 +11,19 @@ export class WS extends Transport {
11
11
  return [];
12
12
  }
13
13
  send(packets) {
14
- for (const packet of packets) {
15
- const data = Parser.encodePacket(packet, true);
16
- if (this.writable && this.socket?.readyState === WebSocket.OPEN) {
17
- // TODO use ws.cork() once https://github.com/oven-sh/bun/issues/21588 is resolved
18
- this.socket.send(data);
19
- }
14
+ if (!this.writable || !this.socket || this.socket.readyState !== WebSocket.OPEN) {
15
+ return;
16
+ }
17
+ if (packets.length === 1) {
18
+ this.socket.send(Parser.encodePacket(packets[0], true));
19
+ return;
20
20
  }
21
+ // Batch multiple packets into a single syscall via cork()
22
+ this.socket.cork(() => {
23
+ for (const packet of packets) {
24
+ this.socket.send(Parser.encodePacket(packet, true));
25
+ }
26
+ });
21
27
  }
22
28
  doClose() {
23
29
  this.socket?.close();
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@rvncom/socket-bun-engine",
3
- "version": "1.0.0",
3
+ "version": "1.0.1",
4
4
  "description": "Engine.IO server implementation for Bun runtime",
5
5
  "type": "module",
6
6
  "main": "./dist/index.js",
@@ -32,5 +32,10 @@
32
32
  "peerDependencies": {
33
33
  "typescript": "^5"
34
34
  },
35
- "license": "MIT"
35
+ "license": "MIT",
36
+ "homepage": "https://github.com/rvncom/socket-bun-engine#readme",
37
+ "repository": {
38
+ "type": "git",
39
+ "url": "git+https://github.com/rvncom/socket-bun-engine.git"
40
+ }
36
41
  }