@kevisual/router 0.0.51 → 0.0.52

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.
@@ -627,7 +627,7 @@ class QueryRouter {
627
627
  description: '列出当前应用下的所有的路由信息',
628
628
  run: async (ctx) => {
629
629
  const list = this.getList(filter);
630
- ctx.body = list;
630
+ ctx.body = { list };
631
631
  },
632
632
  });
633
633
  this.add(listRoute);
package/dist/router.d.ts CHANGED
@@ -2,8 +2,7 @@ import * as http from 'node:http';
2
2
  import http__default, { IncomingMessage, ServerResponse } from 'node:http';
3
3
  import https from 'node:https';
4
4
  import http2 from 'node:http2';
5
- import EventEmitter from 'node:events';
6
- import { EventEmitter as EventEmitter$1 } from 'events';
5
+ import { EventEmitter } from 'eventemitter3';
7
6
  import { WebSocketServer } from 'ws';
8
7
  import { z } from 'zod';
9
8
  import { IncomingMessage as IncomingMessage$1, ServerResponse as ServerResponse$1 } from 'http';
@@ -626,7 +625,7 @@ declare class ServerBase implements ServerType {
626
625
  _callback: any;
627
626
  cors: Cors$1;
628
627
  listeners: Listener[];
629
- emitter: EventEmitter$1<any>;
628
+ emitter: EventEmitter<string | symbol, any>;
630
629
  showConnected: boolean;
631
630
  constructor(opts?: ServerOpts);
632
631
  listen(port: number, hostname?: string, backlog?: number, listeningListener?: () => void): void;
@@ -654,6 +653,10 @@ declare class ServerBase implements ServerType {
654
653
  createCallback(): (req: IncomingMessage, res: ServerResponse) => Promise<void>;
655
654
  on(listener: OnListener): void;
656
655
  onWebSocket({ ws, message, pathname, token, id }: OnWebSocketOptions): Promise<void>;
656
+ /**
657
+ * 根据emitter提醒关闭ws连接
658
+ * @param ws
659
+ */
657
660
  onWsClose(ws: WS): Promise<void>;
658
661
  sendConnected(ws: WS): Promise<void>;
659
662
  }
package/dist/router.js CHANGED
@@ -3,7 +3,7 @@ import require$$2 from 'node:http';
3
3
  import require$$1$1 from 'node:https';
4
4
  import http2 from 'node:http2';
5
5
  import url from 'node:url';
6
- import require$$0$3, { EventEmitter } from 'node:events';
6
+ import require$$0$3 from 'node:events';
7
7
  import require$$3 from 'node:net';
8
8
  import require$$4 from 'node:tls';
9
9
  import require$$0$2 from 'node:stream';
@@ -649,7 +649,7 @@ class QueryRouter {
649
649
  description: '列出当前应用下的所有的路由信息',
650
650
  run: async (ctx) => {
651
651
  const list = this.getList(filter);
652
- ctx.body = list;
652
+ ctx.body = { list };
653
653
  },
654
654
  });
655
655
  this.add(listRoute);
@@ -1174,6 +1174,360 @@ const parseIfJson = (input) => {
1174
1174
  return str;
1175
1175
  };
1176
1176
 
1177
+ function getDefaultExportFromCjs (x) {
1178
+ return x && x.__esModule && Object.prototype.hasOwnProperty.call(x, 'default') ? x['default'] : x;
1179
+ }
1180
+
1181
+ var eventemitter3 = {exports: {}};
1182
+
1183
+ var hasRequiredEventemitter3;
1184
+
1185
+ function requireEventemitter3 () {
1186
+ if (hasRequiredEventemitter3) return eventemitter3.exports;
1187
+ hasRequiredEventemitter3 = 1;
1188
+ (function (module) {
1189
+
1190
+ var has = Object.prototype.hasOwnProperty
1191
+ , prefix = '~';
1192
+
1193
+ /**
1194
+ * Constructor to create a storage for our `EE` objects.
1195
+ * An `Events` instance is a plain object whose properties are event names.
1196
+ *
1197
+ * @constructor
1198
+ * @private
1199
+ */
1200
+ function Events() {}
1201
+
1202
+ //
1203
+ // We try to not inherit from `Object.prototype`. In some engines creating an
1204
+ // instance in this way is faster than calling `Object.create(null)` directly.
1205
+ // If `Object.create(null)` is not supported we prefix the event names with a
1206
+ // character to make sure that the built-in object properties are not
1207
+ // overridden or used as an attack vector.
1208
+ //
1209
+ if (Object.create) {
1210
+ Events.prototype = Object.create(null);
1211
+
1212
+ //
1213
+ // This hack is needed because the `__proto__` property is still inherited in
1214
+ // some old browsers like Android 4, iPhone 5.1, Opera 11 and Safari 5.
1215
+ //
1216
+ if (!new Events().__proto__) prefix = false;
1217
+ }
1218
+
1219
+ /**
1220
+ * Representation of a single event listener.
1221
+ *
1222
+ * @param {Function} fn The listener function.
1223
+ * @param {*} context The context to invoke the listener with.
1224
+ * @param {Boolean} [once=false] Specify if the listener is a one-time listener.
1225
+ * @constructor
1226
+ * @private
1227
+ */
1228
+ function EE(fn, context, once) {
1229
+ this.fn = fn;
1230
+ this.context = context;
1231
+ this.once = once || false;
1232
+ }
1233
+
1234
+ /**
1235
+ * Add a listener for a given event.
1236
+ *
1237
+ * @param {EventEmitter} emitter Reference to the `EventEmitter` instance.
1238
+ * @param {(String|Symbol)} event The event name.
1239
+ * @param {Function} fn The listener function.
1240
+ * @param {*} context The context to invoke the listener with.
1241
+ * @param {Boolean} once Specify if the listener is a one-time listener.
1242
+ * @returns {EventEmitter}
1243
+ * @private
1244
+ */
1245
+ function addListener(emitter, event, fn, context, once) {
1246
+ if (typeof fn !== 'function') {
1247
+ throw new TypeError('The listener must be a function');
1248
+ }
1249
+
1250
+ var listener = new EE(fn, context || emitter, once)
1251
+ , evt = prefix ? prefix + event : event;
1252
+
1253
+ if (!emitter._events[evt]) emitter._events[evt] = listener, emitter._eventsCount++;
1254
+ else if (!emitter._events[evt].fn) emitter._events[evt].push(listener);
1255
+ else emitter._events[evt] = [emitter._events[evt], listener];
1256
+
1257
+ return emitter;
1258
+ }
1259
+
1260
+ /**
1261
+ * Clear event by name.
1262
+ *
1263
+ * @param {EventEmitter} emitter Reference to the `EventEmitter` instance.
1264
+ * @param {(String|Symbol)} evt The Event name.
1265
+ * @private
1266
+ */
1267
+ function clearEvent(emitter, evt) {
1268
+ if (--emitter._eventsCount === 0) emitter._events = new Events();
1269
+ else delete emitter._events[evt];
1270
+ }
1271
+
1272
+ /**
1273
+ * Minimal `EventEmitter` interface that is molded against the Node.js
1274
+ * `EventEmitter` interface.
1275
+ *
1276
+ * @constructor
1277
+ * @public
1278
+ */
1279
+ function EventEmitter() {
1280
+ this._events = new Events();
1281
+ this._eventsCount = 0;
1282
+ }
1283
+
1284
+ /**
1285
+ * Return an array listing the events for which the emitter has registered
1286
+ * listeners.
1287
+ *
1288
+ * @returns {Array}
1289
+ * @public
1290
+ */
1291
+ EventEmitter.prototype.eventNames = function eventNames() {
1292
+ var names = []
1293
+ , events
1294
+ , name;
1295
+
1296
+ if (this._eventsCount === 0) return names;
1297
+
1298
+ for (name in (events = this._events)) {
1299
+ if (has.call(events, name)) names.push(prefix ? name.slice(1) : name);
1300
+ }
1301
+
1302
+ if (Object.getOwnPropertySymbols) {
1303
+ return names.concat(Object.getOwnPropertySymbols(events));
1304
+ }
1305
+
1306
+ return names;
1307
+ };
1308
+
1309
+ /**
1310
+ * Return the listeners registered for a given event.
1311
+ *
1312
+ * @param {(String|Symbol)} event The event name.
1313
+ * @returns {Array} The registered listeners.
1314
+ * @public
1315
+ */
1316
+ EventEmitter.prototype.listeners = function listeners(event) {
1317
+ var evt = prefix ? prefix + event : event
1318
+ , handlers = this._events[evt];
1319
+
1320
+ if (!handlers) return [];
1321
+ if (handlers.fn) return [handlers.fn];
1322
+
1323
+ for (var i = 0, l = handlers.length, ee = new Array(l); i < l; i++) {
1324
+ ee[i] = handlers[i].fn;
1325
+ }
1326
+
1327
+ return ee;
1328
+ };
1329
+
1330
+ /**
1331
+ * Return the number of listeners listening to a given event.
1332
+ *
1333
+ * @param {(String|Symbol)} event The event name.
1334
+ * @returns {Number} The number of listeners.
1335
+ * @public
1336
+ */
1337
+ EventEmitter.prototype.listenerCount = function listenerCount(event) {
1338
+ var evt = prefix ? prefix + event : event
1339
+ , listeners = this._events[evt];
1340
+
1341
+ if (!listeners) return 0;
1342
+ if (listeners.fn) return 1;
1343
+ return listeners.length;
1344
+ };
1345
+
1346
+ /**
1347
+ * Calls each of the listeners registered for a given event.
1348
+ *
1349
+ * @param {(String|Symbol)} event The event name.
1350
+ * @returns {Boolean} `true` if the event had listeners, else `false`.
1351
+ * @public
1352
+ */
1353
+ EventEmitter.prototype.emit = function emit(event, a1, a2, a3, a4, a5) {
1354
+ var evt = prefix ? prefix + event : event;
1355
+
1356
+ if (!this._events[evt]) return false;
1357
+
1358
+ var listeners = this._events[evt]
1359
+ , len = arguments.length
1360
+ , args
1361
+ , i;
1362
+
1363
+ if (listeners.fn) {
1364
+ if (listeners.once) this.removeListener(event, listeners.fn, undefined, true);
1365
+
1366
+ switch (len) {
1367
+ case 1: return listeners.fn.call(listeners.context), true;
1368
+ case 2: return listeners.fn.call(listeners.context, a1), true;
1369
+ case 3: return listeners.fn.call(listeners.context, a1, a2), true;
1370
+ case 4: return listeners.fn.call(listeners.context, a1, a2, a3), true;
1371
+ case 5: return listeners.fn.call(listeners.context, a1, a2, a3, a4), true;
1372
+ case 6: return listeners.fn.call(listeners.context, a1, a2, a3, a4, a5), true;
1373
+ }
1374
+
1375
+ for (i = 1, args = new Array(len -1); i < len; i++) {
1376
+ args[i - 1] = arguments[i];
1377
+ }
1378
+
1379
+ listeners.fn.apply(listeners.context, args);
1380
+ } else {
1381
+ var length = listeners.length
1382
+ , j;
1383
+
1384
+ for (i = 0; i < length; i++) {
1385
+ if (listeners[i].once) this.removeListener(event, listeners[i].fn, undefined, true);
1386
+
1387
+ switch (len) {
1388
+ case 1: listeners[i].fn.call(listeners[i].context); break;
1389
+ case 2: listeners[i].fn.call(listeners[i].context, a1); break;
1390
+ case 3: listeners[i].fn.call(listeners[i].context, a1, a2); break;
1391
+ case 4: listeners[i].fn.call(listeners[i].context, a1, a2, a3); break;
1392
+ default:
1393
+ if (!args) for (j = 1, args = new Array(len -1); j < len; j++) {
1394
+ args[j - 1] = arguments[j];
1395
+ }
1396
+
1397
+ listeners[i].fn.apply(listeners[i].context, args);
1398
+ }
1399
+ }
1400
+ }
1401
+
1402
+ return true;
1403
+ };
1404
+
1405
+ /**
1406
+ * Add a listener for a given event.
1407
+ *
1408
+ * @param {(String|Symbol)} event The event name.
1409
+ * @param {Function} fn The listener function.
1410
+ * @param {*} [context=this] The context to invoke the listener with.
1411
+ * @returns {EventEmitter} `this`.
1412
+ * @public
1413
+ */
1414
+ EventEmitter.prototype.on = function on(event, fn, context) {
1415
+ return addListener(this, event, fn, context, false);
1416
+ };
1417
+
1418
+ /**
1419
+ * Add a one-time listener for a given event.
1420
+ *
1421
+ * @param {(String|Symbol)} event The event name.
1422
+ * @param {Function} fn The listener function.
1423
+ * @param {*} [context=this] The context to invoke the listener with.
1424
+ * @returns {EventEmitter} `this`.
1425
+ * @public
1426
+ */
1427
+ EventEmitter.prototype.once = function once(event, fn, context) {
1428
+ return addListener(this, event, fn, context, true);
1429
+ };
1430
+
1431
+ /**
1432
+ * Remove the listeners of a given event.
1433
+ *
1434
+ * @param {(String|Symbol)} event The event name.
1435
+ * @param {Function} fn Only remove the listeners that match this function.
1436
+ * @param {*} context Only remove the listeners that have this context.
1437
+ * @param {Boolean} once Only remove one-time listeners.
1438
+ * @returns {EventEmitter} `this`.
1439
+ * @public
1440
+ */
1441
+ EventEmitter.prototype.removeListener = function removeListener(event, fn, context, once) {
1442
+ var evt = prefix ? prefix + event : event;
1443
+
1444
+ if (!this._events[evt]) return this;
1445
+ if (!fn) {
1446
+ clearEvent(this, evt);
1447
+ return this;
1448
+ }
1449
+
1450
+ var listeners = this._events[evt];
1451
+
1452
+ if (listeners.fn) {
1453
+ if (
1454
+ listeners.fn === fn &&
1455
+ (!once || listeners.once) &&
1456
+ (!context || listeners.context === context)
1457
+ ) {
1458
+ clearEvent(this, evt);
1459
+ }
1460
+ } else {
1461
+ for (var i = 0, events = [], length = listeners.length; i < length; i++) {
1462
+ if (
1463
+ listeners[i].fn !== fn ||
1464
+ (once && !listeners[i].once) ||
1465
+ (context && listeners[i].context !== context)
1466
+ ) {
1467
+ events.push(listeners[i]);
1468
+ }
1469
+ }
1470
+
1471
+ //
1472
+ // Reset the array, or remove it completely if we have no more listeners.
1473
+ //
1474
+ if (events.length) this._events[evt] = events.length === 1 ? events[0] : events;
1475
+ else clearEvent(this, evt);
1476
+ }
1477
+
1478
+ return this;
1479
+ };
1480
+
1481
+ /**
1482
+ * Remove all listeners, or those of the specified event.
1483
+ *
1484
+ * @param {(String|Symbol)} [event] The event name.
1485
+ * @returns {EventEmitter} `this`.
1486
+ * @public
1487
+ */
1488
+ EventEmitter.prototype.removeAllListeners = function removeAllListeners(event) {
1489
+ var evt;
1490
+
1491
+ if (event) {
1492
+ evt = prefix ? prefix + event : event;
1493
+ if (this._events[evt]) clearEvent(this, evt);
1494
+ } else {
1495
+ this._events = new Events();
1496
+ this._eventsCount = 0;
1497
+ }
1498
+
1499
+ return this;
1500
+ };
1501
+
1502
+ //
1503
+ // Alias methods names because people roll like that.
1504
+ //
1505
+ EventEmitter.prototype.off = EventEmitter.prototype.removeListener;
1506
+ EventEmitter.prototype.addListener = EventEmitter.prototype.on;
1507
+
1508
+ //
1509
+ // Expose the prefix.
1510
+ //
1511
+ EventEmitter.prefixed = prefix;
1512
+
1513
+ //
1514
+ // Allow `EventEmitter` to be imported as module namespace.
1515
+ //
1516
+ EventEmitter.EventEmitter = EventEmitter;
1517
+
1518
+ //
1519
+ // Expose the module.
1520
+ //
1521
+ {
1522
+ module.exports = EventEmitter;
1523
+ }
1524
+ } (eventemitter3));
1525
+ return eventemitter3.exports;
1526
+ }
1527
+
1528
+ var eventemitter3Exports = requireEventemitter3();
1529
+ var EventEmitter = /*@__PURE__*/getDefaultExportFromCjs(eventemitter3Exports);
1530
+
1177
1531
  // 实现函数
1178
1532
  function createHandleCtx(req, res) {
1179
1533
  // 用于存储所有的 Set-Cookie 字符串
@@ -1419,6 +1773,10 @@ class ServerBase {
1419
1773
  end({ code: 500, message: `${type} server is error` });
1420
1774
  }
1421
1775
  }
1776
+ /**
1777
+ * 根据emitter提醒关闭ws连接
1778
+ * @param ws
1779
+ */
1422
1780
  async onWsClose(ws) {
1423
1781
  const id = ws?.data?.id || '';
1424
1782
  if (id) {
@@ -1436,10 +1794,6 @@ class ServerBase {
1436
1794
  }
1437
1795
  }
1438
1796
 
1439
- function getDefaultExportFromCjs (x) {
1440
- return x && x.__esModule && Object.prototype.hasOwnProperty.call(x, 'default') ? x['default'] : x;
1441
- }
1442
-
1443
1797
  var constants;
1444
1798
  var hasRequiredConstants;
1445
1799
 
@@ -6390,6 +6744,8 @@ class WsServerBase {
6390
6744
  });
6391
6745
  this.server.sendConnected(ws);
6392
6746
  this.wss.on('close', () => {
6747
+ // @ts-ignore
6748
+ ws?.data?.close?.();
6393
6749
  this.server.onWsClose(ws);
6394
6750
  });
6395
6751
  });
@@ -6731,6 +7087,7 @@ class BunServer extends ServerBase {
6731
7087
  },
6732
7088
  close: (ws) => {
6733
7089
  // WebSocket 连接关闭
7090
+ ws?.data?.close?.();
6734
7091
  this.onWsClose(ws);
6735
7092
  },
6736
7093
  },
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "$schema": "https://json.schemastore.org/package",
3
3
  "name": "@kevisual/router",
4
- "version": "0.0.51",
4
+ "version": "0.0.52",
5
5
  "description": "",
6
6
  "type": "module",
7
7
  "main": "./dist/router.js",
@@ -32,9 +32,8 @@
32
32
  "@types/bun": "^1.3.5",
33
33
  "@types/node": "^25.0.3",
34
34
  "@types/send": "^1.2.1",
35
- "@types/ws": "^8.18.1",
36
35
  "@types/xml2js": "^0.4.14",
37
- "cookie": "^1.1.1",
36
+ "@types/ws": "^8.18.1",
38
37
  "nanoid": "^5.1.6",
39
38
  "rollup": "^4.54.0",
40
39
  "rollup-plugin-dts": "^6.3.0",
@@ -43,15 +42,16 @@
43
42
  "tslib": "^2.8.1",
44
43
  "tsx": "^4.21.0",
45
44
  "typescript": "^5.9.3",
46
- "ws": "npm:@kevisual/ws",
47
45
  "xml2js": "^0.6.2",
48
- "zod": "^4.2.1"
46
+ "zod": "^4.2.1",
47
+ "ws": "npm:@kevisual/ws"
49
48
  },
50
49
  "repository": {
51
50
  "type": "git",
52
51
  "url": "git+https://github.com/abearxiong/kevisual-router.git"
53
52
  },
54
53
  "dependencies": {
54
+ "eventemitter3": "^5.0.1",
55
55
  "path-to-regexp": "^8.3.0",
56
56
  "selfsigned": "^5.4.0",
57
57
  "send": "^1.2.1"
@@ -95,4 +95,4 @@
95
95
  "require": "./src/*"
96
96
  }
97
97
  }
98
- }
98
+ }
package/src/route.ts CHANGED
@@ -562,7 +562,7 @@ export class QueryRouter {
562
562
  description: '列出当前应用下的所有的路由信息',
563
563
  run: async (ctx: RouteContext) => {
564
564
  const list = this.getList(filter);
565
- ctx.body = list;
565
+ ctx.body = { list };
566
566
  },
567
567
  });
568
568
  this.add(listRoute);
@@ -3,7 +3,7 @@ import { handleServer } from './handle-server.ts';
3
3
  import * as cookie from './cookie.ts';
4
4
  import { ServerType, Listener, OnListener, ServerOpts, OnWebSocketOptions, OnWebSocketFn, WebSocketListenerFun, ListenerFun, HttpListenerFun, WS } from './server-type.ts';
5
5
  import { parseIfJson } from '../utils/parse.ts';
6
- import { EventEmitter } from 'events';
6
+ import { EventEmitter } from 'eventemitter3';
7
7
  type CookieFn = (name: string, value: string, options?: cookie.SerializeOptions, end?: boolean) => void;
8
8
 
9
9
  export type HandleCtx = {
@@ -273,6 +273,10 @@ export class ServerBase implements ServerType {
273
273
  end({ code: 500, message: `${type} server is error` });
274
274
  }
275
275
  }
276
+ /**
277
+ * 根据emitter提醒关闭ws连接
278
+ * @param ws
279
+ */
276
280
  async onWsClose(ws: WS) {
277
281
  const id = ws?.data?.id || '';
278
282
  if (id) {
@@ -253,6 +253,7 @@ export class BunServer extends ServerBase implements ServerType {
253
253
  },
254
254
  close: (ws: any) => {
255
255
  // WebSocket 连接关闭
256
+ ws?.data?.close?.();
256
257
  this.onWsClose(ws);
257
258
  },
258
259
  },
@@ -1,4 +1,4 @@
1
- import EventEmitter from 'node:events';
1
+ import { EventEmitter } from 'eventemitter3';
2
2
  import * as http from 'node:http';
3
3
 
4
4
 
@@ -2,7 +2,6 @@
2
2
  import { WebSocketServer } from 'ws';
3
3
  import type { WebSocket } from 'ws';
4
4
  import { ServerType } from './server-type.ts'
5
- import { parseIfJson } from '../utils/parse.ts';
6
5
  import { isBun } from '../utils/is-engine.ts';
7
6
 
8
7
 
@@ -62,6 +61,8 @@ export class WsServerBase {
62
61
  });
63
62
  this.server.sendConnected(ws);
64
63
  this.wss.on('close', () => {
64
+ // @ts-ignore
65
+ ws?.data?.close?.();
65
66
  this.server.onWsClose(ws);
66
67
  });
67
68
  });