@roomkit/worker 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.
Files changed (158) hide show
  1. package/README.md +122 -0
  2. package/dist/src/admin/admin.controller.d.ts +275 -0
  3. package/dist/src/admin/admin.controller.d.ts.map +1 -0
  4. package/dist/src/admin/admin.controller.js +296 -0
  5. package/dist/src/admin/admin.controller.js.map +1 -0
  6. package/dist/src/admin/admin.module.d.ts +3 -0
  7. package/dist/src/admin/admin.module.d.ts.map +1 -0
  8. package/dist/src/admin/admin.module.js +35 -0
  9. package/dist/src/admin/admin.module.js.map +1 -0
  10. package/dist/src/admin/admin.service.d.ts +282 -0
  11. package/dist/src/admin/admin.service.d.ts.map +1 -0
  12. package/dist/src/admin/admin.service.js +508 -0
  13. package/dist/src/admin/admin.service.js.map +1 -0
  14. package/dist/src/auth/auth.module.d.ts +10 -0
  15. package/dist/src/auth/auth.module.d.ts.map +1 -0
  16. package/dist/src/auth/auth.module.js +37 -0
  17. package/dist/src/auth/auth.module.js.map +1 -0
  18. package/dist/src/auth/auth.service.d.ts +21 -0
  19. package/dist/src/auth/auth.service.d.ts.map +1 -0
  20. package/dist/src/auth/auth.service.js +69 -0
  21. package/dist/src/auth/auth.service.js.map +1 -0
  22. package/dist/src/circuit-breaker/circuit-breaker.module.d.ts +3 -0
  23. package/dist/src/circuit-breaker/circuit-breaker.module.d.ts.map +1 -0
  24. package/dist/src/circuit-breaker/circuit-breaker.module.js +24 -0
  25. package/dist/src/circuit-breaker/circuit-breaker.module.js.map +1 -0
  26. package/dist/src/circuit-breaker/circuit-breaker.service.d.ts +89 -0
  27. package/dist/src/circuit-breaker/circuit-breaker.service.d.ts.map +1 -0
  28. package/dist/src/circuit-breaker/circuit-breaker.service.js +207 -0
  29. package/dist/src/circuit-breaker/circuit-breaker.service.js.map +1 -0
  30. package/dist/src/config/config.module.d.ts +3 -0
  31. package/dist/src/config/config.module.d.ts.map +1 -0
  32. package/dist/src/config/config.module.js +22 -0
  33. package/dist/src/config/config.module.js.map +1 -0
  34. package/dist/src/config/config.service.d.ts +19 -0
  35. package/dist/src/config/config.service.d.ts.map +1 -0
  36. package/dist/src/config/config.service.js +58 -0
  37. package/dist/src/config/config.service.js.map +1 -0
  38. package/dist/src/config/worker.config.d.ts +82 -0
  39. package/dist/src/config/worker.config.d.ts.map +1 -0
  40. package/dist/src/config/worker.config.js +35 -0
  41. package/dist/src/config/worker.config.js.map +1 -0
  42. package/dist/src/index.d.ts +48 -0
  43. package/dist/src/index.d.ts.map +1 -0
  44. package/dist/src/index.js +108 -0
  45. package/dist/src/index.js.map +1 -0
  46. package/dist/src/lifecycle/graceful-shutdown.service.d.ts +71 -0
  47. package/dist/src/lifecycle/graceful-shutdown.service.d.ts.map +1 -0
  48. package/dist/src/lifecycle/graceful-shutdown.service.js +221 -0
  49. package/dist/src/lifecycle/graceful-shutdown.service.js.map +1 -0
  50. package/dist/src/lifecycle/index.d.ts +2 -0
  51. package/dist/src/lifecycle/index.d.ts.map +1 -0
  52. package/dist/src/lifecycle/index.js +18 -0
  53. package/dist/src/lifecycle/index.js.map +1 -0
  54. package/dist/src/main.d.ts +2 -0
  55. package/dist/src/main.d.ts.map +1 -0
  56. package/dist/src/main.js +54 -0
  57. package/dist/src/main.js.map +1 -0
  58. package/dist/src/metrics/metrics.controller.d.ts +15 -0
  59. package/dist/src/metrics/metrics.controller.d.ts.map +1 -0
  60. package/dist/src/metrics/metrics.controller.js +44 -0
  61. package/dist/src/metrics/metrics.controller.js.map +1 -0
  62. package/dist/src/metrics/metrics.module.d.ts +7 -0
  63. package/dist/src/metrics/metrics.module.d.ts.map +1 -0
  64. package/dist/src/metrics/metrics.module.js +28 -0
  65. package/dist/src/metrics/metrics.module.js.map +1 -0
  66. package/dist/src/metrics/metrics.service.d.ts +65 -0
  67. package/dist/src/metrics/metrics.service.d.ts.map +1 -0
  68. package/dist/src/metrics/metrics.service.js +306 -0
  69. package/dist/src/metrics/metrics.service.js.map +1 -0
  70. package/dist/src/migration/migration.module.d.ts +3 -0
  71. package/dist/src/migration/migration.module.d.ts.map +1 -0
  72. package/dist/src/migration/migration.module.js +30 -0
  73. package/dist/src/migration/migration.module.js.map +1 -0
  74. package/dist/src/migration/migration.service.d.ts +68 -0
  75. package/dist/src/migration/migration.service.d.ts.map +1 -0
  76. package/dist/src/migration/migration.service.js +295 -0
  77. package/dist/src/migration/migration.service.js.map +1 -0
  78. package/dist/src/migration/room-migration.service.d.ts +92 -0
  79. package/dist/src/migration/room-migration.service.d.ts.map +1 -0
  80. package/dist/src/migration/room-migration.service.js +297 -0
  81. package/dist/src/migration/room-migration.service.js.map +1 -0
  82. package/dist/src/redis/redis.module.d.ts +3 -0
  83. package/dist/src/redis/redis.module.d.ts.map +1 -0
  84. package/dist/src/redis/redis.module.js +22 -0
  85. package/dist/src/redis/redis.module.js.map +1 -0
  86. package/dist/src/redis/redis.service.d.ts +68 -0
  87. package/dist/src/redis/redis.service.d.ts.map +1 -0
  88. package/dist/src/redis/redis.service.js +260 -0
  89. package/dist/src/redis/redis.service.js.map +1 -0
  90. package/dist/src/room/client-proxy.d.ts +43 -0
  91. package/dist/src/room/client-proxy.d.ts.map +1 -0
  92. package/dist/src/room/client-proxy.js +91 -0
  93. package/dist/src/room/client-proxy.js.map +1 -0
  94. package/dist/src/room/game-room.d.ts +243 -0
  95. package/dist/src/room/game-room.d.ts.map +1 -0
  96. package/dist/src/room/game-room.js +434 -0
  97. package/dist/src/room/game-room.js.map +1 -0
  98. package/dist/src/room/message-handler.service.d.ts +70 -0
  99. package/dist/src/room/message-handler.service.d.ts.map +1 -0
  100. package/dist/src/room/message-handler.service.js +541 -0
  101. package/dist/src/room/message-handler.service.js.map +1 -0
  102. package/dist/src/room/room-manager.service.d.ts +132 -0
  103. package/dist/src/room/room-manager.service.d.ts.map +1 -0
  104. package/dist/src/room/room-manager.service.js +571 -0
  105. package/dist/src/room/room-manager.service.js.map +1 -0
  106. package/dist/src/room/room-persistence.service.d.ts +101 -0
  107. package/dist/src/room/room-persistence.service.d.ts.map +1 -0
  108. package/dist/src/room/room-persistence.service.js +307 -0
  109. package/dist/src/room/room-persistence.service.js.map +1 -0
  110. package/dist/src/room/room-registry.service.d.ts +16 -0
  111. package/dist/src/room/room-registry.service.d.ts.map +1 -0
  112. package/dist/src/room/room-registry.service.js +60 -0
  113. package/dist/src/room/room-registry.service.js.map +1 -0
  114. package/dist/src/room/room.module.d.ts +15 -0
  115. package/dist/src/room/room.module.d.ts.map +1 -0
  116. package/dist/src/room/room.module.js +55 -0
  117. package/dist/src/room/room.module.js.map +1 -0
  118. package/dist/src/room/rooms/echo-room.d.ts +18 -0
  119. package/dist/src/room/rooms/echo-room.d.ts.map +1 -0
  120. package/dist/src/room/rooms/echo-room.js +85 -0
  121. package/dist/src/room/rooms/echo-room.js.map +1 -0
  122. package/dist/src/room/rooms/index.d.ts +2 -0
  123. package/dist/src/room/rooms/index.d.ts.map +1 -0
  124. package/dist/src/room/rooms/index.js +6 -0
  125. package/dist/src/room/rooms/index.js.map +1 -0
  126. package/dist/src/worker.module.d.ts +10 -0
  127. package/dist/src/worker.module.d.ts.map +1 -0
  128. package/dist/src/worker.module.js +46 -0
  129. package/dist/src/worker.module.js.map +1 -0
  130. package/dist/test/circuit-breaker/circuit-breaker.service.spec.d.ts +2 -0
  131. package/dist/test/circuit-breaker/circuit-breaker.service.spec.d.ts.map +1 -0
  132. package/dist/test/circuit-breaker/circuit-breaker.service.spec.js +220 -0
  133. package/dist/test/circuit-breaker/circuit-breaker.service.spec.js.map +1 -0
  134. package/dist/test/integration/admin-api.spec.d.ts +2 -0
  135. package/dist/test/integration/admin-api.spec.d.ts.map +1 -0
  136. package/dist/test/integration/admin-api.spec.js +246 -0
  137. package/dist/test/integration/admin-api.spec.js.map +1 -0
  138. package/dist/test/migration/game-room-migration.spec.d.ts +2 -0
  139. package/dist/test/migration/game-room-migration.spec.d.ts.map +1 -0
  140. package/dist/test/migration/game-room-migration.spec.js +222 -0
  141. package/dist/test/migration/game-room-migration.spec.js.map +1 -0
  142. package/dist/test/room/client-proxy.spec.d.ts +2 -0
  143. package/dist/test/room/client-proxy.spec.d.ts.map +1 -0
  144. package/dist/test/room/client-proxy.spec.js +117 -0
  145. package/dist/test/room/client-proxy.spec.js.map +1 -0
  146. package/dist/test/room/game-room.spec.d.ts +2 -0
  147. package/dist/test/room/game-room.spec.d.ts.map +1 -0
  148. package/dist/test/room/game-room.spec.js +219 -0
  149. package/dist/test/room/game-room.spec.js.map +1 -0
  150. package/dist/test/room/room-manager.service.spec.d.ts +2 -0
  151. package/dist/test/room/room-manager.service.spec.d.ts.map +1 -0
  152. package/dist/test/room/room-manager.service.spec.js +280 -0
  153. package/dist/test/room/room-manager.service.spec.js.map +1 -0
  154. package/dist/test/setup.d.ts +2 -0
  155. package/dist/test/setup.d.ts.map +1 -0
  156. package/dist/test/setup.js +56 -0
  157. package/dist/test/setup.js.map +1 -0
  158. package/package.json +74 -0
@@ -0,0 +1 @@
1
+ {"version":3,"file":"auth.service.js","sourceRoot":"","sources":["../../../src/auth/auth.service.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;AAAA,2CAAsE;AAGtE;;GAEG;AACU,QAAA,YAAY,GAAG,cAAc,CAAC;AAE3C;;;GAGG;AAEI,IAAM,WAAW,mBAAjB,MAAM,WAAW;IAI+B;IAHpC,MAAM,GAAG,IAAI,eAAM,CAAC,aAAW,CAAC,IAAI,CAAC,CAAC;IAEvD,YACqD,iBAA+B;QAA/B,sBAAiB,GAAjB,iBAAiB,CAAc;IACjF,CAAC;IAEJ;;;;OAIG;IACH,KAAK,CAAC,WAAW,CAAC,KAAa;QAC7B,IAAI,CAAC,KAAK,EAAE,CAAC;YACX,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,gBAAgB,EAAE,CAAC;QACnD,CAAC;QAED,kBAAkB;QAClB,IAAI,IAAI,CAAC,iBAAiB,EAAE,CAAC;YAC3B,IAAI,CAAC;gBACH,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,iBAAiB,CAAC,KAAK,CAAC,CAAC;gBACnD,IAAI,MAAM,CAAC,KAAK,EAAE,CAAC;oBACjB,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,yBAAyB,MAAM,CAAC,MAAM,EAAE,CAAC,CAAC;gBAC5D,CAAC;gBACD,OAAO,MAAM,CAAC;YAChB,CAAC;YAAC,OAAO,KAAK,EAAE,CAAC;gBACf,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,sBAAsB,KAAK,EAAE,CAAC,CAAC;gBACjD,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,YAAY,EAAE,CAAC;YAC/C,CAAC;QACH,CAAC;QAED,yCAAyC;QACzC,6BAA6B;QAC7B,MAAM,MAAM,GAAG,KAAK,CAAC,UAAU,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,QAAQ,KAAK,EAAE,CAAC;QACnE,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,gCAAgC,MAAM,EAAE,CAAC,CAAC;QAC1D,OAAO,EAAE,KAAK,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC;IACjC,CAAC;CACF,CAAA;AArCY,kCAAW;sBAAX,WAAW;IADvB,IAAA,mBAAU,GAAE;IAKR,WAAA,IAAA,iBAAQ,GAAE,CAAA;IAAE,WAAA,IAAA,eAAM,EAAC,oBAAY,CAAC,CAAA;;GAJxB,WAAW,CAqCvB"}
@@ -0,0 +1,3 @@
1
+ export declare class CircuitBreakerModule {
2
+ }
3
+ //# sourceMappingURL=circuit-breaker.module.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"circuit-breaker.module.d.ts","sourceRoot":"","sources":["../../../src/circuit-breaker/circuit-breaker.module.ts"],"names":[],"mappings":"AAIA,qBAMa,oBAAoB;CAAG"}
@@ -0,0 +1,24 @@
1
+ "use strict";
2
+ var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
3
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
4
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
5
+ else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
6
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
7
+ };
8
+ Object.defineProperty(exports, "__esModule", { value: true });
9
+ exports.CircuitBreakerModule = void 0;
10
+ const common_1 = require("@nestjs/common");
11
+ const circuit_breaker_service_1 = require("./circuit-breaker.service");
12
+ const config_module_1 = require("../config/config.module");
13
+ let CircuitBreakerModule = class CircuitBreakerModule {
14
+ };
15
+ exports.CircuitBreakerModule = CircuitBreakerModule;
16
+ exports.CircuitBreakerModule = CircuitBreakerModule = __decorate([
17
+ (0, common_1.Global)(),
18
+ (0, common_1.Module)({
19
+ imports: [config_module_1.ConfigModule],
20
+ providers: [circuit_breaker_service_1.CircuitBreakerService],
21
+ exports: [circuit_breaker_service_1.CircuitBreakerService],
22
+ })
23
+ ], CircuitBreakerModule);
24
+ //# sourceMappingURL=circuit-breaker.module.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"circuit-breaker.module.js","sourceRoot":"","sources":["../../../src/circuit-breaker/circuit-breaker.module.ts"],"names":[],"mappings":";;;;;;;;;AAAA,2CAAgD;AAChD,uEAAkE;AAClE,2DAAuD;AAQhD,IAAM,oBAAoB,GAA1B,MAAM,oBAAoB;CAAG,CAAA;AAAvB,oDAAoB;+BAApB,oBAAoB;IANhC,IAAA,eAAM,GAAE;IACR,IAAA,eAAM,EAAC;QACN,OAAO,EAAE,CAAC,4BAAY,CAAC;QACvB,SAAS,EAAE,CAAC,+CAAqB,CAAC;QAClC,OAAO,EAAE,CAAC,+CAAqB,CAAC;KACjC,CAAC;GACW,oBAAoB,CAAG"}
@@ -0,0 +1,89 @@
1
+ import { ConfigService } from '../config/config.service';
2
+ /**
3
+ * 熔断器状态
4
+ */
5
+ export type CircuitState = 'closed' | 'open' | 'half-open';
6
+ /**
7
+ * 熔断器统计信息
8
+ */
9
+ export interface CircuitStats {
10
+ state: CircuitState;
11
+ failures: number;
12
+ successes: number;
13
+ lastFailureTime?: number;
14
+ lastOpenTime?: number;
15
+ pendingRequests: number;
16
+ }
17
+ /**
18
+ * 熔断器服务
19
+ *
20
+ * 状态说明:
21
+ * - closed: 正常状态,请求正常处理
22
+ * - open: 熔断状态,拒绝所有请求
23
+ * - half-open: 半开状态,允许少量请求测试恢复
24
+ */
25
+ export declare class CircuitBreakerService {
26
+ private readonly configService;
27
+ private readonly logger;
28
+ private state;
29
+ private consecutiveFailures;
30
+ private halfOpenSuccesses;
31
+ private lastOpenTime;
32
+ private lastFailureTime;
33
+ private pendingRequests;
34
+ private readonly failureThreshold;
35
+ private readonly successThreshold;
36
+ private readonly openTimeout;
37
+ private readonly maxPendingRequests;
38
+ private readonly halfOpenMaxRequests;
39
+ constructor(configService: ConfigService);
40
+ /**
41
+ * 检查是否允许请求通过
42
+ * @returns { allowed: boolean, reason?: string }
43
+ */
44
+ canProcess(): {
45
+ allowed: boolean;
46
+ reason?: string;
47
+ };
48
+ /**
49
+ * 开始处理请求
50
+ */
51
+ startRequest(): void;
52
+ /**
53
+ * 请求处理成功
54
+ */
55
+ onSuccess(): void;
56
+ /**
57
+ * 请求处理失败
58
+ */
59
+ onFailure(error?: Error): void;
60
+ /**
61
+ * 状态转换
62
+ */
63
+ private transitionTo;
64
+ /**
65
+ * 手动重置熔断器
66
+ */
67
+ reset(): void;
68
+ /**
69
+ * 手动触发熔断
70
+ */
71
+ trip(reason?: string): void;
72
+ /**
73
+ * 获取当前状态
74
+ */
75
+ getState(): CircuitState;
76
+ /**
77
+ * 获取统计信息
78
+ */
79
+ getStats(): CircuitStats;
80
+ /**
81
+ * 是否处于健康状态
82
+ */
83
+ isHealthy(): boolean;
84
+ /**
85
+ * 装饰器:包装函数以应用熔断逻辑
86
+ */
87
+ execute<T>(fn: () => Promise<T>): Promise<T>;
88
+ }
89
+ //# sourceMappingURL=circuit-breaker.service.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"circuit-breaker.service.d.ts","sourceRoot":"","sources":["../../../src/circuit-breaker/circuit-breaker.service.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,aAAa,EAAE,MAAM,0BAA0B,CAAC;AAEzD;;GAEG;AACH,MAAM,MAAM,YAAY,GAAG,QAAQ,GAAG,MAAM,GAAG,WAAW,CAAC;AAE3D;;GAEG;AACH,MAAM,WAAW,YAAY;IAC3B,KAAK,EAAE,YAAY,CAAC;IACpB,QAAQ,EAAE,MAAM,CAAC;IACjB,SAAS,EAAE,MAAM,CAAC;IAClB,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,eAAe,EAAE,MAAM,CAAC;CACzB;AAED;;;;;;;GAOG;AACH,qBACa,qBAAqB;IAyBpB,OAAO,CAAC,QAAQ,CAAC,aAAa;IAxB1C,OAAO,CAAC,QAAQ,CAAC,MAAM,CAA0C;IAGjE,OAAO,CAAC,KAAK,CAA0B;IAGvC,OAAO,CAAC,mBAAmB,CAAK;IAEhC,OAAO,CAAC,iBAAiB,CAAK;IAE9B,OAAO,CAAC,YAAY,CAAK;IAEzB,OAAO,CAAC,eAAe,CAAK;IAG5B,OAAO,CAAC,eAAe,CAAK;IAG5B,OAAO,CAAC,QAAQ,CAAC,gBAAgB,CAAS;IAC1C,OAAO,CAAC,QAAQ,CAAC,gBAAgB,CAAS;IAC1C,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAS;IACrC,OAAO,CAAC,QAAQ,CAAC,kBAAkB,CAAS;IAC5C,OAAO,CAAC,QAAQ,CAAC,mBAAmB,CAAS;gBAEhB,aAAa,EAAE,aAAa;IAazD;;;OAGG;IACH,UAAU,IAAI;QAAE,OAAO,EAAE,OAAO,CAAC;QAAC,MAAM,CAAC,EAAE,MAAM,CAAA;KAAE;IA8BnD;;OAEG;IACH,YAAY,IAAI,IAAI;IAIpB;;OAEG;IACH,SAAS,IAAI,IAAI;IAYjB;;OAEG;IACH,SAAS,CAAC,KAAK,CAAC,EAAE,KAAK,GAAG,IAAI;IAoB9B;;OAEG;IACH,OAAO,CAAC,YAAY;IAqBpB;;OAEG;IACH,KAAK,IAAI,IAAI;IAOb;;OAEG;IACH,IAAI,CAAC,MAAM,CAAC,EAAE,MAAM,GAAG,IAAI;IAK3B;;OAEG;IACH,QAAQ,IAAI,YAAY;IAIxB;;OAEG;IACH,QAAQ,IAAI,YAAY;IAWxB;;OAEG;IACH,SAAS,IAAI,OAAO;IAIpB;;OAEG;IACG,OAAO,CAAC,CAAC,EAAE,EAAE,EAAE,MAAM,OAAO,CAAC,CAAC,CAAC,GAAG,OAAO,CAAC,CAAC,CAAC;CAgBnD"}
@@ -0,0 +1,207 @@
1
+ "use strict";
2
+ var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
3
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
4
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
5
+ else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
6
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
7
+ };
8
+ var __metadata = (this && this.__metadata) || function (k, v) {
9
+ if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
10
+ };
11
+ var CircuitBreakerService_1;
12
+ Object.defineProperty(exports, "__esModule", { value: true });
13
+ exports.CircuitBreakerService = void 0;
14
+ const common_1 = require("@nestjs/common");
15
+ const config_service_1 = require("../config/config.service");
16
+ /**
17
+ * 熔断器服务
18
+ *
19
+ * 状态说明:
20
+ * - closed: 正常状态,请求正常处理
21
+ * - open: 熔断状态,拒绝所有请求
22
+ * - half-open: 半开状态,允许少量请求测试恢复
23
+ */
24
+ let CircuitBreakerService = CircuitBreakerService_1 = class CircuitBreakerService {
25
+ configService;
26
+ logger = new common_1.Logger(CircuitBreakerService_1.name);
27
+ // 熔断状态
28
+ state = 'closed';
29
+ // 连续失败计数
30
+ consecutiveFailures = 0;
31
+ // 半开状态成功计数
32
+ halfOpenSuccesses = 0;
33
+ // 上次熔断开启时间
34
+ lastOpenTime = 0;
35
+ // 上次失败时间
36
+ lastFailureTime = 0;
37
+ // 待处理请求数
38
+ pendingRequests = 0;
39
+ // 配置参数
40
+ failureThreshold;
41
+ successThreshold;
42
+ openTimeout;
43
+ maxPendingRequests;
44
+ halfOpenMaxRequests;
45
+ constructor(configService) {
46
+ this.configService = configService;
47
+ this.failureThreshold = configService.circuitFailureThreshold ?? 10;
48
+ this.successThreshold = configService.circuitSuccessThreshold ?? 5;
49
+ this.openTimeout = configService.circuitOpenTimeout ?? 30000;
50
+ this.maxPendingRequests = configService.maxPendingRequests ?? 1000;
51
+ this.halfOpenMaxRequests = 3;
52
+ this.logger.log(`CircuitBreaker initialized: failureThreshold=${this.failureThreshold}, ` +
53
+ `successThreshold=${this.successThreshold}, openTimeout=${this.openTimeout}ms`);
54
+ }
55
+ /**
56
+ * 检查是否允许请求通过
57
+ * @returns { allowed: boolean, reason?: string }
58
+ */
59
+ canProcess() {
60
+ // 检查待处理请求数
61
+ if (this.pendingRequests >= this.maxPendingRequests) {
62
+ return { allowed: false, reason: 'WORKER_OVERLOADED' };
63
+ }
64
+ switch (this.state) {
65
+ case 'closed':
66
+ return { allowed: true };
67
+ case 'open':
68
+ // 检查是否可以进入半开状态
69
+ if (Date.now() - this.lastOpenTime >= this.openTimeout) {
70
+ this.transitionTo('half-open');
71
+ return { allowed: true };
72
+ }
73
+ return { allowed: false, reason: 'CIRCUIT_OPEN' };
74
+ case 'half-open':
75
+ // 半开状态允许有限的请求
76
+ if (this.pendingRequests < this.halfOpenMaxRequests) {
77
+ return { allowed: true };
78
+ }
79
+ return { allowed: false, reason: 'CIRCUIT_HALF_OPEN_LIMIT' };
80
+ default:
81
+ return { allowed: true };
82
+ }
83
+ }
84
+ /**
85
+ * 开始处理请求
86
+ */
87
+ startRequest() {
88
+ this.pendingRequests++;
89
+ }
90
+ /**
91
+ * 请求处理成功
92
+ */
93
+ onSuccess() {
94
+ this.pendingRequests = Math.max(0, this.pendingRequests - 1);
95
+ this.consecutiveFailures = 0;
96
+ if (this.state === 'half-open') {
97
+ this.halfOpenSuccesses++;
98
+ if (this.halfOpenSuccesses >= this.successThreshold) {
99
+ this.transitionTo('closed');
100
+ }
101
+ }
102
+ }
103
+ /**
104
+ * 请求处理失败
105
+ */
106
+ onFailure(error) {
107
+ this.pendingRequests = Math.max(0, this.pendingRequests - 1);
108
+ this.consecutiveFailures++;
109
+ this.lastFailureTime = Date.now();
110
+ if (this.state === 'half-open') {
111
+ // 半开状态失败,立即回到熔断
112
+ this.transitionTo('open');
113
+ return;
114
+ }
115
+ if (this.state === 'closed' && this.consecutiveFailures >= this.failureThreshold) {
116
+ this.transitionTo('open');
117
+ this.logger.warn(`Circuit breaker opened after ${this.consecutiveFailures} consecutive failures`, error?.message);
118
+ }
119
+ }
120
+ /**
121
+ * 状态转换
122
+ */
123
+ transitionTo(newState) {
124
+ const oldState = this.state;
125
+ this.state = newState;
126
+ switch (newState) {
127
+ case 'open':
128
+ this.lastOpenTime = Date.now();
129
+ this.halfOpenSuccesses = 0;
130
+ break;
131
+ case 'half-open':
132
+ this.halfOpenSuccesses = 0;
133
+ break;
134
+ case 'closed':
135
+ this.consecutiveFailures = 0;
136
+ this.halfOpenSuccesses = 0;
137
+ break;
138
+ }
139
+ this.logger.log(`Circuit breaker state: ${oldState} -> ${newState}`);
140
+ }
141
+ /**
142
+ * 手动重置熔断器
143
+ */
144
+ reset() {
145
+ this.transitionTo('closed');
146
+ this.consecutiveFailures = 0;
147
+ this.halfOpenSuccesses = 0;
148
+ this.logger.log('Circuit breaker manually reset');
149
+ }
150
+ /**
151
+ * 手动触发熔断
152
+ */
153
+ trip(reason) {
154
+ this.transitionTo('open');
155
+ this.logger.warn(`Circuit breaker manually tripped: ${reason || 'manual'}`);
156
+ }
157
+ /**
158
+ * 获取当前状态
159
+ */
160
+ getState() {
161
+ return this.state;
162
+ }
163
+ /**
164
+ * 获取统计信息
165
+ */
166
+ getStats() {
167
+ return {
168
+ state: this.state,
169
+ failures: this.consecutiveFailures,
170
+ successes: this.halfOpenSuccesses,
171
+ lastFailureTime: this.lastFailureTime || undefined,
172
+ lastOpenTime: this.lastOpenTime || undefined,
173
+ pendingRequests: this.pendingRequests,
174
+ };
175
+ }
176
+ /**
177
+ * 是否处于健康状态
178
+ */
179
+ isHealthy() {
180
+ return this.state === 'closed' && this.pendingRequests < this.maxPendingRequests * 0.8;
181
+ }
182
+ /**
183
+ * 装饰器:包装函数以应用熔断逻辑
184
+ */
185
+ async execute(fn) {
186
+ const check = this.canProcess();
187
+ if (!check.allowed) {
188
+ throw new Error(check.reason);
189
+ }
190
+ this.startRequest();
191
+ try {
192
+ const result = await fn();
193
+ this.onSuccess();
194
+ return result;
195
+ }
196
+ catch (error) {
197
+ this.onFailure(error);
198
+ throw error;
199
+ }
200
+ }
201
+ };
202
+ exports.CircuitBreakerService = CircuitBreakerService;
203
+ exports.CircuitBreakerService = CircuitBreakerService = CircuitBreakerService_1 = __decorate([
204
+ (0, common_1.Injectable)(),
205
+ __metadata("design:paramtypes", [config_service_1.ConfigService])
206
+ ], CircuitBreakerService);
207
+ //# sourceMappingURL=circuit-breaker.service.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"circuit-breaker.service.js","sourceRoot":"","sources":["../../../src/circuit-breaker/circuit-breaker.service.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ export declare class ConfigModule {
2
+ }
3
+ //# sourceMappingURL=config.module.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config.module.d.ts","sourceRoot":"","sources":["../../../src/config/config.module.ts"],"names":[],"mappings":"AAGA,qBAKa,YAAY;CAAG"}
@@ -0,0 +1,22 @@
1
+ "use strict";
2
+ var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
3
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
4
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
5
+ else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
6
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
7
+ };
8
+ Object.defineProperty(exports, "__esModule", { value: true });
9
+ exports.ConfigModule = void 0;
10
+ const common_1 = require("@nestjs/common");
11
+ const config_service_1 = require("./config.service");
12
+ let ConfigModule = class ConfigModule {
13
+ };
14
+ exports.ConfigModule = ConfigModule;
15
+ exports.ConfigModule = ConfigModule = __decorate([
16
+ (0, common_1.Global)(),
17
+ (0, common_1.Module)({
18
+ providers: [config_service_1.ConfigService],
19
+ exports: [config_service_1.ConfigService],
20
+ })
21
+ ], ConfigModule);
22
+ //# sourceMappingURL=config.module.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config.module.js","sourceRoot":"","sources":["../../../src/config/config.module.ts"],"names":[],"mappings":";;;;;;;;;AAAA,2CAAgD;AAChD,qDAAiD;AAO1C,IAAM,YAAY,GAAlB,MAAM,YAAY;CAAG,CAAA;AAAf,oCAAY;uBAAZ,YAAY;IALxB,IAAA,eAAM,GAAE;IACR,IAAA,eAAM,EAAC;QACN,SAAS,EAAE,CAAC,8BAAa,CAAC;QAC1B,OAAO,EAAE,CAAC,8BAAa,CAAC;KACzB,CAAC;GACW,YAAY,CAAG"}
@@ -0,0 +1,19 @@
1
+ export declare class ConfigService {
2
+ readonly workerId: string;
3
+ readonly adminPort: number;
4
+ readonly redisHost: string;
5
+ readonly redisPort: number;
6
+ readonly redisPassword?: string;
7
+ readonly maxRooms: number;
8
+ readonly circuitFailureThreshold: number;
9
+ readonly circuitSuccessThreshold: number;
10
+ readonly circuitOpenTimeout: number;
11
+ readonly maxPendingRequests: number;
12
+ readonly persistenceEnabled: boolean;
13
+ readonly snapshotInterval: number;
14
+ readonly eventFlushInterval: number;
15
+ readonly snapshotTTL: number;
16
+ readonly eventTTL: number;
17
+ constructor();
18
+ }
19
+ //# sourceMappingURL=config.service.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config.service.d.ts","sourceRoot":"","sources":["../../../src/config/config.service.ts"],"names":[],"mappings":"AAGA,qBACa,aAAa;IACxB,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,aAAa,CAAC,EAAE,MAAM,CAAC;IAChC,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAG1B,QAAQ,CAAC,uBAAuB,EAAE,MAAM,CAAC;IACzC,QAAQ,CAAC,uBAAuB,EAAE,MAAM,CAAC;IACzC,QAAQ,CAAC,kBAAkB,EAAE,MAAM,CAAC;IACpC,QAAQ,CAAC,kBAAkB,EAAE,MAAM,CAAC;IAGpC,QAAQ,CAAC,kBAAkB,EAAE,OAAO,CAAC;IACrC,QAAQ,CAAC,gBAAgB,EAAE,MAAM,CAAC;IAClC,QAAQ,CAAC,kBAAkB,EAAE,MAAM,CAAC;IACpC,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;IAC7B,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;;CAuB3B"}
@@ -0,0 +1,58 @@
1
+ "use strict";
2
+ var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
3
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
4
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
5
+ else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
6
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
7
+ };
8
+ var __metadata = (this && this.__metadata) || function (k, v) {
9
+ if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
10
+ };
11
+ Object.defineProperty(exports, "__esModule", { value: true });
12
+ exports.ConfigService = void 0;
13
+ const common_1 = require("@nestjs/common");
14
+ const uuid_1 = require("uuid");
15
+ let ConfigService = class ConfigService {
16
+ workerId;
17
+ adminPort;
18
+ redisHost;
19
+ redisPort;
20
+ redisPassword;
21
+ maxRooms;
22
+ // 熔断器配置
23
+ circuitFailureThreshold;
24
+ circuitSuccessThreshold;
25
+ circuitOpenTimeout;
26
+ maxPendingRequests;
27
+ // 持久化配置
28
+ persistenceEnabled;
29
+ snapshotInterval;
30
+ eventFlushInterval;
31
+ snapshotTTL;
32
+ eventTTL;
33
+ constructor() {
34
+ this.workerId = process.env.GW_WORKER_ID || `worker-${(0, uuid_1.v4)().substring(0, 8)}`;
35
+ this.adminPort = parseInt(process.env.GW_WORKER_ADMIN_PORT || '28200', 10);
36
+ this.redisHost = process.env.GW_REDIS_HOST || 'localhost';
37
+ this.redisPort = parseInt(process.env.GW_REDIS_PORT || '6379', 10);
38
+ this.redisPassword = process.env.GW_REDIS_PASSWORD;
39
+ this.maxRooms = parseInt(process.env.GW_MAX_ROOMS || '500', 10);
40
+ // 熔断器配置
41
+ this.circuitFailureThreshold = parseInt(process.env.GW_CIRCUIT_FAILURE_THRESHOLD || '10', 10);
42
+ this.circuitSuccessThreshold = parseInt(process.env.GW_CIRCUIT_SUCCESS_THRESHOLD || '5', 10);
43
+ this.circuitOpenTimeout = parseInt(process.env.GW_CIRCUIT_OPEN_TIMEOUT || '30000', 10);
44
+ this.maxPendingRequests = parseInt(process.env.GW_MAX_PENDING_REQUESTS || '1000', 10);
45
+ // 持久化配置
46
+ this.persistenceEnabled = process.env.GW_PERSISTENCE_ENABLED !== 'false'; // 默认开启
47
+ this.snapshotInterval = parseInt(process.env.GW_SNAPSHOT_INTERVAL || '10000', 10); // 10秒
48
+ this.eventFlushInterval = parseInt(process.env.GW_EVENT_FLUSH_INTERVAL || '1000', 10); // 1秒
49
+ this.snapshotTTL = parseInt(process.env.GW_SNAPSHOT_TTL || '3600', 10); // 1小时
50
+ this.eventTTL = parseInt(process.env.GW_EVENT_TTL || '3600', 10); // 1小时
51
+ }
52
+ };
53
+ exports.ConfigService = ConfigService;
54
+ exports.ConfigService = ConfigService = __decorate([
55
+ (0, common_1.Injectable)(),
56
+ __metadata("design:paramtypes", [])
57
+ ], ConfigService);
58
+ //# sourceMappingURL=config.service.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config.service.js","sourceRoot":"","sources":["../../../src/config/config.service.ts"],"names":[],"mappings":";;;;;;;;;;;;AAAA,2CAA4C;AAC5C,+BAAkC;AAG3B,IAAM,aAAa,GAAnB,MAAM,aAAa;IACf,QAAQ,CAAS;IACjB,SAAS,CAAS;IAClB,SAAS,CAAS;IAClB,SAAS,CAAS;IAClB,aAAa,CAAU;IACvB,QAAQ,CAAS;IAE1B,QAAQ;IACC,uBAAuB,CAAS;IAChC,uBAAuB,CAAS;IAChC,kBAAkB,CAAS;IAC3B,kBAAkB,CAAS;IAEpC,QAAQ;IACC,kBAAkB,CAAU;IAC5B,gBAAgB,CAAS;IACzB,kBAAkB,CAAS;IAC3B,WAAW,CAAS;IACpB,QAAQ,CAAS;IAE1B;QACE,IAAI,CAAC,QAAQ,GAAG,OAAO,CAAC,GAAG,CAAC,YAAY,IAAI,UAAU,IAAA,SAAI,GAAE,CAAC,SAAS,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC;QAC/E,IAAI,CAAC,SAAS,GAAG,QAAQ,CAAC,OAAO,CAAC,GAAG,CAAC,oBAAoB,IAAI,OAAO,EAAE,EAAE,CAAC,CAAC;QAC3E,IAAI,CAAC,SAAS,GAAG,OAAO,CAAC,GAAG,CAAC,aAAa,IAAI,WAAW,CAAC;QAC1D,IAAI,CAAC,SAAS,GAAG,QAAQ,CAAC,OAAO,CAAC,GAAG,CAAC,aAAa,IAAI,MAAM,EAAE,EAAE,CAAC,CAAC;QACnE,IAAI,CAAC,aAAa,GAAG,OAAO,CAAC,GAAG,CAAC,iBAAiB,CAAC;QACnD,IAAI,CAAC,QAAQ,GAAG,QAAQ,CAAC,OAAO,CAAC,GAAG,CAAC,YAAY,IAAI,KAAK,EAAE,EAAE,CAAC,CAAC;QAEhE,QAAQ;QACR,IAAI,CAAC,uBAAuB,GAAG,QAAQ,CAAC,OAAO,CAAC,GAAG,CAAC,4BAA4B,IAAI,IAAI,EAAE,EAAE,CAAC,CAAC;QAC9F,IAAI,CAAC,uBAAuB,GAAG,QAAQ,CAAC,OAAO,CAAC,GAAG,CAAC,4BAA4B,IAAI,GAAG,EAAE,EAAE,CAAC,CAAC;QAC7F,IAAI,CAAC,kBAAkB,GAAG,QAAQ,CAAC,OAAO,CAAC,GAAG,CAAC,uBAAuB,IAAI,OAAO,EAAE,EAAE,CAAC,CAAC;QACvF,IAAI,CAAC,kBAAkB,GAAG,QAAQ,CAAC,OAAO,CAAC,GAAG,CAAC,uBAAuB,IAAI,MAAM,EAAE,EAAE,CAAC,CAAC;QAEtF,QAAQ;QACR,IAAI,CAAC,kBAAkB,GAAG,OAAO,CAAC,GAAG,CAAC,sBAAsB,KAAK,OAAO,CAAC,CAAC,OAAO;QACjF,IAAI,CAAC,gBAAgB,GAAG,QAAQ,CAAC,OAAO,CAAC,GAAG,CAAC,oBAAoB,IAAI,OAAO,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM;QACzF,IAAI,CAAC,kBAAkB,GAAG,QAAQ,CAAC,OAAO,CAAC,GAAG,CAAC,uBAAuB,IAAI,MAAM,EAAE,EAAE,CAAC,CAAC,CAAC,KAAK;QAC5F,IAAI,CAAC,WAAW,GAAG,QAAQ,CAAC,OAAO,CAAC,GAAG,CAAC,eAAe,IAAI,MAAM,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM;QAC9E,IAAI,CAAC,QAAQ,GAAG,QAAQ,CAAC,OAAO,CAAC,GAAG,CAAC,YAAY,IAAI,MAAM,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM;IAC1E,CAAC;CACF,CAAA;AA1CY,sCAAa;wBAAb,aAAa;IADzB,IAAA,mBAAU,GAAE;;GACA,aAAa,CA0CzB"}
@@ -0,0 +1,82 @@
1
+ /**
2
+ * Worker Configuration Types
3
+ */
4
+ export interface RedisConfig {
5
+ /** Redis URL (e.g., redis://localhost:6379 or redis://:password@host:port) */
6
+ url?: string;
7
+ /** Redis host */
8
+ host?: string;
9
+ /** Redis port */
10
+ port?: number;
11
+ /** Redis password */
12
+ password?: string;
13
+ /** Redis database index */
14
+ db?: number;
15
+ }
16
+ export interface CircuitBreakerConfig {
17
+ /** Number of failures before opening circuit */
18
+ failureThreshold?: number;
19
+ /** Number of successes to close circuit */
20
+ successThreshold?: number;
21
+ /** Time to wait before trying again (ms) */
22
+ openTimeout?: number;
23
+ }
24
+ export interface AdminConfig {
25
+ /** Admin API port */
26
+ port?: number;
27
+ /** Enable admin API */
28
+ enabled?: boolean;
29
+ }
30
+ /**
31
+ * Authentication result from custom auth handler
32
+ */
33
+ export interface AuthResult {
34
+ /** Whether authentication is valid */
35
+ valid: boolean;
36
+ /** User ID (required if valid is true) */
37
+ userId?: string;
38
+ /** Error message (if valid is false) */
39
+ error?: string;
40
+ /** Additional user data to attach to the session */
41
+ userData?: Record<string, unknown>;
42
+ }
43
+ /**
44
+ * Custom authentication handler function
45
+ * Developers can provide their own authentication logic
46
+ */
47
+ export type AuthHandler = (token: string) => Promise<AuthResult> | AuthResult;
48
+ export interface WorkerConfig {
49
+ /** Worker unique identifier (auto-generated if not provided) */
50
+ id?: string;
51
+ /** Redis configuration */
52
+ redis: RedisConfig | string;
53
+ /** Room types to register */
54
+ rooms?: Record<string, new (...args: any[]) => any>;
55
+ /** Circuit breaker configuration */
56
+ circuitBreaker?: CircuitBreakerConfig;
57
+ /** Admin API configuration */
58
+ admin?: AdminConfig;
59
+ /**
60
+ * Custom authentication handler
61
+ * If not provided, uses default pass-through authentication (token = userId)
62
+ *
63
+ * @example
64
+ * ```typescript
65
+ * auth: async (token) => {
66
+ * const user = await myAuthService.verify(token);
67
+ * return user ? { valid: true, userId: user.id } : { valid: false, error: 'INVALID_TOKEN' };
68
+ * }
69
+ * ```
70
+ */
71
+ auth?: AuthHandler;
72
+ }
73
+ /**
74
+ * Normalize Redis config from string or object
75
+ */
76
+ export declare function normalizeRedisConfig(config: RedisConfig | string): RedisConfig;
77
+ /**
78
+ * Default configurations
79
+ */
80
+ export declare const DEFAULT_CIRCUIT_BREAKER_CONFIG: Required<CircuitBreakerConfig>;
81
+ export declare const DEFAULT_ADMIN_CONFIG: Required<AdminConfig>;
82
+ //# sourceMappingURL=worker.config.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"worker.config.d.ts","sourceRoot":"","sources":["../../../src/config/worker.config.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,MAAM,WAAW,WAAW;IAC1B,8EAA8E;IAC9E,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,iBAAiB;IACjB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,iBAAiB;IACjB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,qBAAqB;IACrB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,2BAA2B;IAC3B,EAAE,CAAC,EAAE,MAAM,CAAC;CACb;AAED,MAAM,WAAW,oBAAoB;IACnC,gDAAgD;IAChD,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,2CAA2C;IAC3C,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,4CAA4C;IAC5C,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;AAED,MAAM,WAAW,WAAW;IAC1B,qBAAqB;IACrB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,uBAAuB;IACvB,OAAO,CAAC,EAAE,OAAO,CAAC;CACnB;AAED;;GAEG;AACH,MAAM,WAAW,UAAU;IACzB,sCAAsC;IACtC,KAAK,EAAE,OAAO,CAAC;IACf,0CAA0C;IAC1C,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,wCAAwC;IACxC,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,oDAAoD;IACpD,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CACpC;AAED;;;GAGG;AACH,MAAM,MAAM,WAAW,GAAG,CAAC,KAAK,EAAE,MAAM,KAAK,OAAO,CAAC,UAAU,CAAC,GAAG,UAAU,CAAC;AAE9E,MAAM,WAAW,YAAY;IAC3B,gEAAgE;IAChE,EAAE,CAAC,EAAE,MAAM,CAAC;IACZ,0BAA0B;IAC1B,KAAK,EAAE,WAAW,GAAG,MAAM,CAAC;IAC5B,6BAA6B;IAC7B,KAAK,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,KAAK,GAAG,IAAI,EAAE,GAAG,EAAE,KAAK,GAAG,CAAC,CAAC;IACpD,oCAAoC;IACpC,cAAc,CAAC,EAAE,oBAAoB,CAAC;IACtC,8BAA8B;IAC9B,KAAK,CAAC,EAAE,WAAW,CAAC;IACpB;;;;;;;;;;;OAWG;IACH,IAAI,CAAC,EAAE,WAAW,CAAC;CACpB;AAED;;GAEG;AACH,wBAAgB,oBAAoB,CAAC,MAAM,EAAE,WAAW,GAAG,MAAM,GAAG,WAAW,CAW9E;AAED;;GAEG;AACH,eAAO,MAAM,8BAA8B,EAAE,QAAQ,CAAC,oBAAoB,CAIzE,CAAC;AAEF,eAAO,MAAM,oBAAoB,EAAE,QAAQ,CAAC,WAAW,CAGtD,CAAC"}
@@ -0,0 +1,35 @@
1
+ "use strict";
2
+ /**
3
+ * Worker Configuration Types
4
+ */
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.DEFAULT_ADMIN_CONFIG = exports.DEFAULT_CIRCUIT_BREAKER_CONFIG = void 0;
7
+ exports.normalizeRedisConfig = normalizeRedisConfig;
8
+ /**
9
+ * Normalize Redis config from string or object
10
+ */
11
+ function normalizeRedisConfig(config) {
12
+ if (typeof config === 'string') {
13
+ const url = new URL(config);
14
+ return {
15
+ host: url.hostname,
16
+ port: parseInt(url.port) || 6379,
17
+ password: url.password || undefined,
18
+ db: url.pathname ? parseInt(url.pathname.slice(1)) : 0,
19
+ };
20
+ }
21
+ return config;
22
+ }
23
+ /**
24
+ * Default configurations
25
+ */
26
+ exports.DEFAULT_CIRCUIT_BREAKER_CONFIG = {
27
+ failureThreshold: 10,
28
+ successThreshold: 5,
29
+ openTimeout: 30000,
30
+ };
31
+ exports.DEFAULT_ADMIN_CONFIG = {
32
+ port: 18082,
33
+ enabled: true,
34
+ };
35
+ //# sourceMappingURL=worker.config.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"worker.config.js","sourceRoot":"","sources":["../../../src/config/worker.config.ts"],"names":[],"mappings":";AAAA;;GAEG;;;AAgFH,oDAWC;AAdD;;GAEG;AACH,SAAgB,oBAAoB,CAAC,MAA4B;IAC/D,IAAI,OAAO,MAAM,KAAK,QAAQ,EAAE,CAAC;QAC/B,MAAM,GAAG,GAAG,IAAI,GAAG,CAAC,MAAM,CAAC,CAAC;QAC5B,OAAO;YACL,IAAI,EAAE,GAAG,CAAC,QAAQ;YAClB,IAAI,EAAE,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,IAAI;YAChC,QAAQ,EAAE,GAAG,CAAC,QAAQ,IAAI,SAAS;YACnC,EAAE,EAAE,GAAG,CAAC,QAAQ,CAAC,CAAC,CAAC,QAAQ,CAAC,GAAG,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;SACvD,CAAC;IACJ,CAAC;IACD,OAAO,MAAM,CAAC;AAChB,CAAC;AAED;;GAEG;AACU,QAAA,8BAA8B,GAAmC;IAC5E,gBAAgB,EAAE,EAAE;IACpB,gBAAgB,EAAE,CAAC;IACnB,WAAW,EAAE,KAAK;CACnB,CAAC;AAEW,QAAA,oBAAoB,GAA0B;IACzD,IAAI,EAAE,KAAK;IACX,OAAO,EAAE,IAAI;CACd,CAAC"}
@@ -0,0 +1,48 @@
1
+ /**
2
+ * @roomkit/worker - Worker Server for Gateway-Worker Framework
3
+ *
4
+ * Creates a game logic worker that handles room management
5
+ * and game state, communicating with gateways via Redis.
6
+ *
7
+ * @example
8
+ * ```typescript
9
+ * import { createWorker, GameRoom } from '@roomkit/worker';
10
+ *
11
+ * class PokerRoom extends GameRoom {
12
+ * onCreate(options) { }
13
+ * onJoin(client, options) { }
14
+ * onMessage(client, msgId, payload) { }
15
+ * onLeave(client, reason) { }
16
+ * onDispose() { }
17
+ * }
18
+ *
19
+ * const worker = await createWorker({
20
+ * redis: 'redis://localhost:6379',
21
+ * rooms: { 'poker': PokerRoom },
22
+ * });
23
+ *
24
+ * await worker.listen();
25
+ * ```
26
+ */
27
+ import { WorkerConfig } from './config/worker.config';
28
+ export interface WorkerInstance {
29
+ /** Start the worker server */
30
+ listen(): Promise<void>;
31
+ /** Stop the worker server */
32
+ close(): Promise<void>;
33
+ /** Get worker ID */
34
+ readonly id: string;
35
+ /** Get Admin API port */
36
+ readonly adminPort: number;
37
+ /** Get registered game types */
38
+ readonly gameTypes: string[];
39
+ }
40
+ /**
41
+ * Create a Worker server instance
42
+ */
43
+ export declare function createWorker(config: WorkerConfig): Promise<WorkerInstance>;
44
+ export { GameRoom } from './room/game-room';
45
+ export { ClientProxy } from './room/client-proxy';
46
+ export * from './config/worker.config';
47
+ export { WorkerModule } from './worker.module';
48
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;GAyBG;AAKH,OAAO,EACL,YAAY,EAIb,MAAM,wBAAwB,CAAC;AAGhC,MAAM,WAAW,cAAc;IAC7B,8BAA8B;IAC9B,MAAM,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;IACxB,6BAA6B;IAC7B,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;IACvB,oBAAoB;IACpB,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAC;IACpB,yBAAyB;IACzB,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,gCAAgC;IAChC,QAAQ,CAAC,SAAS,EAAE,MAAM,EAAE,CAAC;CAC9B;AAED;;GAEG;AACH,wBAAsB,YAAY,CAAC,MAAM,EAAE,YAAY,GAAG,OAAO,CAAC,cAAc,CAAC,CAoDhF;AAGD,OAAO,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AAC5C,OAAO,EAAE,WAAW,EAAE,MAAM,qBAAqB,CAAC;AAClD,cAAc,wBAAwB,CAAC;AACvC,OAAO,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAC"}