@velajs/vela 1.18.0 → 1.19.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.
Files changed (441) hide show
  1. package/CHANGELOG.md +78 -14
  2. package/dist/configurable-module.builder-5FGMaXG6.js +91 -0
  3. package/dist/configurable-module.builder-5FGMaXG6.js.map +1 -0
  4. package/dist/container-BqUHID4l.js +645 -0
  5. package/dist/container-BqUHID4l.js.map +1 -0
  6. package/dist/cron-matcher-C9qv5OUA.js +113 -0
  7. package/dist/cron-matcher-C9qv5OUA.js.map +1 -0
  8. package/dist/decorate-GcSMAbKn.js +528 -0
  9. package/dist/decorate-GcSMAbKn.js.map +1 -0
  10. package/dist/decorators-C8YBFCIk.js +53 -0
  11. package/dist/decorators-C8YBFCIk.js.map +1 -0
  12. package/dist/define-module-NOyOZNXD.js +235 -0
  13. package/dist/define-module-NOyOZNXD.js.map +1 -0
  14. package/dist/discovery.service-BYm95SSD.js +368 -0
  15. package/dist/discovery.service-BYm95SSD.js.map +1 -0
  16. package/dist/discovery.service-Cpf1QcZ5.d.ts +648 -0
  17. package/dist/i18n/index.d.ts +138 -10
  18. package/dist/i18n/index.js +270 -8
  19. package/dist/i18n/index.js.map +1 -0
  20. package/dist/index-D72EQfcC.d.ts +430 -0
  21. package/dist/index-DhShDLCM.d.ts +2310 -0
  22. package/dist/index.d.ts +6 -66
  23. package/dist/index.js +14 -71
  24. package/dist/internal.d.ts +13 -17
  25. package/dist/internal.js +6 -19
  26. package/dist/live/index.d.ts +2 -12
  27. package/dist/live/index.js +826 -16
  28. package/dist/live/index.js.map +1 -0
  29. package/dist/metadata.registry-D1od8ZBt.d.ts +842 -0
  30. package/dist/plugin-ByBlVOve.js +1387 -0
  31. package/dist/plugin-ByBlVOve.js.map +1 -0
  32. package/dist/queue/index.d.ts +247 -10
  33. package/dist/queue/index.js +384 -12
  34. package/dist/queue/index.js.map +1 -0
  35. package/dist/request-context-C3nCGJNd.js +26 -0
  36. package/dist/request-context-C3nCGJNd.js.map +1 -0
  37. package/dist/route.manager-DRAZ5X04.js +991 -0
  38. package/dist/route.manager-DRAZ5X04.js.map +1 -0
  39. package/dist/schedule-node/index.d.ts +32 -3
  40. package/dist/schedule-node/index.js +97 -3
  41. package/dist/schedule-node/index.js.map +1 -0
  42. package/dist/schedule.registry-DVm7Jp5w.d.ts +55 -0
  43. package/dist/seeder/index.d.ts +75 -5
  44. package/dist/seeder/index.js +105 -4
  45. package/dist/seeder/index.js.map +1 -0
  46. package/dist/signed-url-CMmi0SIb.js +56 -0
  47. package/dist/signed-url-CMmi0SIb.js.map +1 -0
  48. package/dist/signed-url-DKhgja4U.d.ts +16 -0
  49. package/dist/src-eb5CI6Xn.js +2151 -0
  50. package/dist/src-eb5CI6Xn.js.map +1 -0
  51. package/dist/storage/index.d.ts +57 -4
  52. package/dist/storage/index.js +22 -5
  53. package/dist/storage/index.js.map +1 -0
  54. package/dist/streaming/index.d.ts +2 -2
  55. package/dist/streaming/index.js +2 -1
  56. package/dist/websocket/index.d.ts +3 -12
  57. package/dist/websocket/index.js +2 -16
  58. package/dist/websocket-DXmB-MWJ.js +697 -0
  59. package/dist/websocket-DXmB-MWJ.js.map +1 -0
  60. package/dist/websocket-node/index.d.ts +108 -6
  61. package/dist/websocket-node/index.js +228 -6
  62. package/dist/websocket-node/index.js.map +1 -0
  63. package/package.json +67 -53
  64. package/dist/__tests__/workers/entry.d.ts +0 -9
  65. package/dist/__tests__/workers-als/entry-als.d.ts +0 -9
  66. package/dist/application.d.ts +0 -91
  67. package/dist/application.js +0 -308
  68. package/dist/cache/cache.decorators.d.ts +0 -2
  69. package/dist/cache/cache.decorators.js +0 -4
  70. package/dist/cache/cache.interceptor.d.ts +0 -9
  71. package/dist/cache/cache.interceptor.js +0 -60
  72. package/dist/cache/cache.module.d.ts +0 -7
  73. package/dist/cache/cache.module.js +0 -58
  74. package/dist/cache/cache.service.d.ts +0 -9
  75. package/dist/cache/cache.service.js +0 -42
  76. package/dist/cache/cache.store.d.ts +0 -12
  77. package/dist/cache/cache.store.js +0 -51
  78. package/dist/cache/cache.tokens.d.ts +0 -6
  79. package/dist/cache/cache.tokens.js +0 -5
  80. package/dist/cache/cache.types.d.ts +0 -41
  81. package/dist/cache/cache.types.js +0 -1
  82. package/dist/cache/index.d.ts +0 -8
  83. package/dist/cache/index.js +0 -7
  84. package/dist/cache/tiered-cache.store.d.ts +0 -19
  85. package/dist/cache/tiered-cache.store.js +0 -40
  86. package/dist/config/config.module.d.ts +0 -19
  87. package/dist/config/config.module.js +0 -98
  88. package/dist/config/config.service.d.ts +0 -20
  89. package/dist/config/config.service.js +0 -43
  90. package/dist/config/config.store.d.ts +0 -46
  91. package/dist/config/config.store.js +0 -119
  92. package/dist/config/config.tokens.d.ts +0 -13
  93. package/dist/config/config.tokens.js +0 -14
  94. package/dist/config/config.types.d.ts +0 -41
  95. package/dist/config/config.types.js +0 -4
  96. package/dist/config/index.d.ts +0 -7
  97. package/dist/config/index.js +0 -5
  98. package/dist/config/register-as.d.ts +0 -52
  99. package/dist/config/register-as.js +0 -39
  100. package/dist/constants.d.ts +0 -44
  101. package/dist/constants.js +0 -46
  102. package/dist/container/container.d.ts +0 -154
  103. package/dist/container/container.js +0 -849
  104. package/dist/container/decorators.d.ts +0 -17
  105. package/dist/container/decorators.js +0 -57
  106. package/dist/container/disposable.d.ts +0 -5
  107. package/dist/container/disposable.js +0 -33
  108. package/dist/container/index.d.ts +0 -6
  109. package/dist/container/index.js +0 -5
  110. package/dist/container/mixin.d.ts +0 -24
  111. package/dist/container/mixin.js +0 -26
  112. package/dist/container/module-ref.d.ts +0 -21
  113. package/dist/container/module-ref.js +0 -48
  114. package/dist/container/types.d.ts +0 -154
  115. package/dist/container/types.js +0 -49
  116. package/dist/cors/cors.module.d.ts +0 -7
  117. package/dist/cors/cors.module.js +0 -37
  118. package/dist/cors/cors.tokens.d.ts +0 -3
  119. package/dist/cors/cors.tokens.js +0 -2
  120. package/dist/cors/cors.types.d.ts +0 -8
  121. package/dist/cors/cors.types.js +0 -1
  122. package/dist/cors/index.d.ts +0 -3
  123. package/dist/cors/index.js +0 -2
  124. package/dist/crypto/signed-url.d.ts +0 -12
  125. package/dist/crypto/signed-url.js +0 -60
  126. package/dist/discovery/discoverable.decorator.d.ts +0 -38
  127. package/dist/discovery/discoverable.decorator.js +0 -42
  128. package/dist/discovery/discovery.service.d.ts +0 -102
  129. package/dist/discovery/discovery.service.js +0 -177
  130. package/dist/discovery/index.d.ts +0 -2
  131. package/dist/discovery/index.js +0 -2
  132. package/dist/entrypoint/entrypoint.registry.d.ts +0 -42
  133. package/dist/entrypoint/entrypoint.registry.js +0 -112
  134. package/dist/entrypoint/entrypoint.types.d.ts +0 -41
  135. package/dist/entrypoint/entrypoint.types.js +0 -3
  136. package/dist/entrypoint/execution-context.d.ts +0 -15
  137. package/dist/entrypoint/execution-context.js +0 -21
  138. package/dist/entrypoint/execution-scope.d.ts +0 -21
  139. package/dist/entrypoint/execution-scope.js +0 -28
  140. package/dist/entrypoint/index.d.ts +0 -4
  141. package/dist/entrypoint/index.js +0 -4
  142. package/dist/errors/http-exception.d.ts +0 -62
  143. package/dist/errors/http-exception.js +0 -134
  144. package/dist/errors/index.d.ts +0 -1
  145. package/dist/errors/index.js +0 -1
  146. package/dist/event-emitter/event-emitter.decorators.d.ts +0 -1
  147. package/dist/event-emitter/event-emitter.decorators.js +0 -10
  148. package/dist/event-emitter/event-emitter.module.d.ts +0 -2
  149. package/dist/event-emitter/event-emitter.module.js +0 -23
  150. package/dist/event-emitter/event-emitter.service.d.ts +0 -13
  151. package/dist/event-emitter/event-emitter.service.js +0 -127
  152. package/dist/event-emitter/event-emitter.subscriber.d.ts +0 -9
  153. package/dist/event-emitter/event-emitter.subscriber.js +0 -45
  154. package/dist/event-emitter/event-emitter.tokens.d.ts +0 -1
  155. package/dist/event-emitter/event-emitter.tokens.js +0 -1
  156. package/dist/event-emitter/event-emitter.types.d.ts +0 -5
  157. package/dist/event-emitter/event-emitter.types.js +0 -1
  158. package/dist/event-emitter/index.d.ts +0 -6
  159. package/dist/event-emitter/index.js +0 -5
  160. package/dist/factory/adapter.d.ts +0 -36
  161. package/dist/factory/adapter.js +0 -18
  162. package/dist/factory/bootstrap.d.ts +0 -23
  163. package/dist/factory/bootstrap.js +0 -108
  164. package/dist/factory.d.ts +0 -16
  165. package/dist/factory.js +0 -36
  166. package/dist/fetch/fetch.module.d.ts +0 -7
  167. package/dist/fetch/fetch.module.js +0 -31
  168. package/dist/fetch/fetch.service.d.ts +0 -24
  169. package/dist/fetch/fetch.service.js +0 -145
  170. package/dist/fetch/fetch.types.d.ts +0 -24
  171. package/dist/fetch/fetch.types.js +0 -1
  172. package/dist/fetch/index.d.ts +0 -3
  173. package/dist/fetch/index.js +0 -2
  174. package/dist/health/health.http.d.ts +0 -14
  175. package/dist/health/health.http.js +0 -75
  176. package/dist/health/health.indicator.d.ts +0 -9
  177. package/dist/health/health.indicator.js +0 -32
  178. package/dist/health/health.module.d.ts +0 -2
  179. package/dist/health/health.module.js +0 -26
  180. package/dist/health/health.service.d.ts +0 -7
  181. package/dist/health/health.service.js +0 -69
  182. package/dist/health/health.types.d.ts +0 -15
  183. package/dist/health/health.types.js +0 -1
  184. package/dist/health/index.d.ts +0 -6
  185. package/dist/health/index.js +0 -4
  186. package/dist/http/ambient.d.ts +0 -17
  187. package/dist/http/ambient.js +0 -44
  188. package/dist/http/argument-resolver.d.ts +0 -10
  189. package/dist/http/argument-resolver.js +0 -89
  190. package/dist/http/decorators.d.ts +0 -198
  191. package/dist/http/decorators.js +0 -321
  192. package/dist/http/execution-context.d.ts +0 -8
  193. package/dist/http/execution-context.js +0 -35
  194. package/dist/http/handler-executor.d.ts +0 -20
  195. package/dist/http/handler-executor.js +0 -111
  196. package/dist/http/index.d.ts +0 -12
  197. package/dist/http/index.js +0 -7
  198. package/dist/http/instantiate.d.ts +0 -4
  199. package/dist/http/instantiate.js +0 -45
  200. package/dist/http/lazy-param.decorator.d.ts +0 -37
  201. package/dist/http/lazy-param.decorator.js +0 -117
  202. package/dist/http/request-container.d.ts +0 -16
  203. package/dist/http/request-container.js +0 -19
  204. package/dist/http/request-context.d.ts +0 -13
  205. package/dist/http/request-context.js +0 -22
  206. package/dist/http/response-mapper.d.ts +0 -8
  207. package/dist/http/response-mapper.js +0 -42
  208. package/dist/http/route-contributor.d.ts +0 -68
  209. package/dist/http/route-contributor.js +0 -22
  210. package/dist/http/route-map.d.ts +0 -30
  211. package/dist/http/route-map.js +0 -27
  212. package/dist/http/route.manager.d.ts +0 -92
  213. package/dist/http/route.manager.js +0 -481
  214. package/dist/http/types.d.ts +0 -37
  215. package/dist/http/types.js +0 -1
  216. package/dist/http/url/index.d.ts +0 -4
  217. package/dist/http/url/index.js +0 -3
  218. package/dist/http/url/signed-url.guard.d.ts +0 -27
  219. package/dist/http/url/signed-url.guard.js +0 -62
  220. package/dist/http/url/signing-secret.d.ts +0 -20
  221. package/dist/http/url/signing-secret.js +0 -24
  222. package/dist/http/url/url-generator.service.d.ts +0 -52
  223. package/dist/http/url/url-generator.service.js +0 -104
  224. package/dist/i18n/deep-merge.d.ts +0 -2
  225. package/dist/i18n/deep-merge.js +0 -15
  226. package/dist/i18n/i18n.middleware.d.ts +0 -15
  227. package/dist/i18n/i18n.middleware.js +0 -94
  228. package/dist/i18n/i18n.module.d.ts +0 -13
  229. package/dist/i18n/i18n.module.js +0 -69
  230. package/dist/i18n/i18n.options.d.ts +0 -30
  231. package/dist/i18n/i18n.options.js +0 -16
  232. package/dist/i18n/i18n.service.d.ts +0 -20
  233. package/dist/i18n/i18n.service.js +0 -49
  234. package/dist/i18n/i18n.tokens.d.ts +0 -6
  235. package/dist/i18n/i18n.tokens.js +0 -3
  236. package/dist/i18n/i18n.types.d.ts +0 -6
  237. package/dist/i18n/i18n.types.js +0 -1
  238. package/dist/i18n/message-loader.service.d.ts +0 -21
  239. package/dist/i18n/message-loader.service.js +0 -90
  240. package/dist/i18n/message-registry.d.ts +0 -16
  241. package/dist/i18n/message-registry.js +0 -49
  242. package/dist/lifecycle/index.d.ts +0 -20
  243. package/dist/lifecycle/index.js +0 -15
  244. package/dist/live/live.cursor.d.ts +0 -22
  245. package/dist/live/live.cursor.js +0 -56
  246. package/dist/live/live.decorators.d.ts +0 -32
  247. package/dist/live/live.decorators.js +0 -46
  248. package/dist/live/live.delta.d.ts +0 -15
  249. package/dist/live/live.delta.js +0 -51
  250. package/dist/live/live.engine.d.ts +0 -81
  251. package/dist/live/live.engine.js +0 -448
  252. package/dist/live/live.invalidation.d.ts +0 -45
  253. package/dist/live/live.invalidation.js +0 -99
  254. package/dist/live/live.module.d.ts +0 -28
  255. package/dist/live/live.module.js +0 -87
  256. package/dist/live/live.tokens.d.ts +0 -9
  257. package/dist/live/live.tokens.js +0 -8
  258. package/dist/live/live.types.d.ts +0 -138
  259. package/dist/live/live.types.js +0 -1
  260. package/dist/live/presence.d.ts +0 -44
  261. package/dist/live/presence.js +0 -130
  262. package/dist/metadata.d.ts +0 -10
  263. package/dist/metadata.js +0 -20
  264. package/dist/module/configurable-module.builder.d.ts +0 -56
  265. package/dist/module/configurable-module.builder.js +0 -84
  266. package/dist/module/configurable-module.types.d.ts +0 -93
  267. package/dist/module/configurable-module.types.js +0 -5
  268. package/dist/module/decorators.d.ts +0 -10
  269. package/dist/module/decorators.js +0 -47
  270. package/dist/module/define-module.d.ts +0 -112
  271. package/dist/module/define-module.js +0 -232
  272. package/dist/module/graph.d.ts +0 -10
  273. package/dist/module/graph.js +0 -35
  274. package/dist/module/index.d.ts +0 -10
  275. package/dist/module/index.js +0 -7
  276. package/dist/module/lazy-modules.d.ts +0 -82
  277. package/dist/module/lazy-modules.js +0 -231
  278. package/dist/module/lazy-provider.d.ts +0 -65
  279. package/dist/module/lazy-provider.js +0 -111
  280. package/dist/module/middleware.d.ts +0 -30
  281. package/dist/module/middleware.js +0 -67
  282. package/dist/module/module-loader.d.ts +0 -58
  283. package/dist/module/module-loader.js +0 -484
  284. package/dist/module/stable-hash.d.ts +0 -15
  285. package/dist/module/stable-hash.js +0 -52
  286. package/dist/module/types.d.ts +0 -1
  287. package/dist/module/types.js +0 -1
  288. package/dist/openapi/decorators.d.ts +0 -34
  289. package/dist/openapi/decorators.js +0 -66
  290. package/dist/openapi/document.d.ts +0 -3
  291. package/dist/openapi/document.js +0 -316
  292. package/dist/openapi/index.d.ts +0 -7
  293. package/dist/openapi/index.js +0 -6
  294. package/dist/openapi/redoc-ui.d.ts +0 -1
  295. package/dist/openapi/redoc-ui.js +0 -19
  296. package/dist/openapi/scalar-ui.d.ts +0 -1
  297. package/dist/openapi/scalar-ui.js +0 -19
  298. package/dist/openapi/swagger-ui.d.ts +0 -1
  299. package/dist/openapi/swagger-ui.js +0 -23
  300. package/dist/openapi/types.d.ts +0 -182
  301. package/dist/openapi/types.js +0 -4
  302. package/dist/openapi/zod-to-json-schema.d.ts +0 -4
  303. package/dist/openapi/zod-to-json-schema.js +0 -57
  304. package/dist/pipeline/app-providers.d.ts +0 -10
  305. package/dist/pipeline/app-providers.js +0 -43
  306. package/dist/pipeline/component.manager.d.ts +0 -25
  307. package/dist/pipeline/component.manager.js +0 -66
  308. package/dist/pipeline/decorators.d.ts +0 -10
  309. package/dist/pipeline/decorators.js +0 -42
  310. package/dist/pipeline/index.d.ts +0 -12
  311. package/dist/pipeline/index.js +0 -7
  312. package/dist/pipeline/pipeline-runner.d.ts +0 -31
  313. package/dist/pipeline/pipeline-runner.js +0 -40
  314. package/dist/pipeline/pipes.d.ts +0 -48
  315. package/dist/pipeline/pipes.js +0 -104
  316. package/dist/pipeline/reflector.d.ts +0 -86
  317. package/dist/pipeline/reflector.js +0 -121
  318. package/dist/pipeline/scoped-components.d.ts +0 -26
  319. package/dist/pipeline/scoped-components.js +0 -27
  320. package/dist/pipeline/tokens.d.ts +0 -33
  321. package/dist/pipeline/tokens.js +0 -27
  322. package/dist/pipeline/types.d.ts +0 -64
  323. package/dist/pipeline/types.js +0 -1
  324. package/dist/plugin/plugin.d.ts +0 -31
  325. package/dist/plugin/plugin.js +0 -111
  326. package/dist/queue/inline.driver.d.ts +0 -30
  327. package/dist/queue/inline.driver.js +0 -58
  328. package/dist/queue/queue.binding.d.ts +0 -23
  329. package/dist/queue/queue.binding.js +0 -53
  330. package/dist/queue/queue.client.d.ts +0 -20
  331. package/dist/queue/queue.client.js +0 -33
  332. package/dist/queue/queue.decorators.d.ts +0 -23
  333. package/dist/queue/queue.decorators.js +0 -46
  334. package/dist/queue/queue.dispatch.d.ts +0 -36
  335. package/dist/queue/queue.dispatch.js +0 -102
  336. package/dist/queue/queue.module.d.ts +0 -32
  337. package/dist/queue/queue.module.js +0 -80
  338. package/dist/queue/queue.tokens.d.ts +0 -21
  339. package/dist/queue/queue.tokens.js +0 -34
  340. package/dist/queue/queue.types.d.ts +0 -61
  341. package/dist/queue/queue.types.js +0 -4
  342. package/dist/registry/index.d.ts +0 -2
  343. package/dist/registry/index.js +0 -1
  344. package/dist/registry/metadata.registry.d.ts +0 -73
  345. package/dist/registry/metadata.registry.js +0 -357
  346. package/dist/registry/paths.d.ts +0 -3
  347. package/dist/registry/paths.js +0 -15
  348. package/dist/registry/types.d.ts +0 -116
  349. package/dist/registry/types.js +0 -1
  350. package/dist/registry/util.d.ts +0 -3
  351. package/dist/registry/util.js +0 -8
  352. package/dist/schedule/cron-matcher.d.ts +0 -2
  353. package/dist/schedule/cron-matcher.js +0 -62
  354. package/dist/schedule/index.d.ts +0 -8
  355. package/dist/schedule/index.js +0 -5
  356. package/dist/schedule/schedule.decorators.d.ts +0 -2
  357. package/dist/schedule/schedule.decorators.js +0 -18
  358. package/dist/schedule/schedule.module.d.ts +0 -9
  359. package/dist/schedule/schedule.module.js +0 -28
  360. package/dist/schedule/schedule.registry.d.ts +0 -23
  361. package/dist/schedule/schedule.registry.js +0 -63
  362. package/dist/schedule/schedule.tokens.d.ts +0 -2
  363. package/dist/schedule/schedule.tokens.js +0 -2
  364. package/dist/schedule/schedule.types.d.ts +0 -8
  365. package/dist/schedule/schedule.types.js +0 -1
  366. package/dist/schedule-node/schedule-node.module.d.ts +0 -9
  367. package/dist/schedule-node/schedule-node.module.js +0 -28
  368. package/dist/schedule-node/schedule.executor.d.ts +0 -19
  369. package/dist/schedule-node/schedule.executor.js +0 -107
  370. package/dist/seeder/seeder.decorator.d.ts +0 -7
  371. package/dist/seeder/seeder.decorator.js +0 -15
  372. package/dist/seeder/seeder.module.d.ts +0 -16
  373. package/dist/seeder/seeder.module.js +0 -44
  374. package/dist/seeder/seeder.registry.d.ts +0 -23
  375. package/dist/seeder/seeder.registry.js +0 -83
  376. package/dist/seeder/seeder.tokens.d.ts +0 -2
  377. package/dist/seeder/seeder.tokens.js +0 -1
  378. package/dist/seeder/seeder.types.d.ts +0 -20
  379. package/dist/seeder/seeder.types.js +0 -1
  380. package/dist/serialization/index.d.ts +0 -2
  381. package/dist/serialization/index.js +0 -2
  382. package/dist/serialization/serialize.decorator.d.ts +0 -6
  383. package/dist/serialization/serialize.decorator.js +0 -7
  384. package/dist/serialization/serializer.interceptor.d.ts +0 -4
  385. package/dist/serialization/serializer.interceptor.js +0 -16
  386. package/dist/services/index.d.ts +0 -2
  387. package/dist/services/index.js +0 -1
  388. package/dist/services/logger.d.ts +0 -59
  389. package/dist/services/logger.js +0 -159
  390. package/dist/storage/path-template.d.ts +0 -9
  391. package/dist/storage/path-template.js +0 -20
  392. package/dist/storage/storage.types.d.ts +0 -41
  393. package/dist/storage/storage.types.js +0 -5
  394. package/dist/throttler/index.d.ts +0 -6
  395. package/dist/throttler/index.js +0 -5
  396. package/dist/throttler/throttler.decorators.d.ts +0 -3
  397. package/dist/throttler/throttler.decorators.js +0 -4
  398. package/dist/throttler/throttler.guard.d.ts +0 -9
  399. package/dist/throttler/throttler.guard.js +0 -72
  400. package/dist/throttler/throttler.module.d.ts +0 -7
  401. package/dist/throttler/throttler.module.js +0 -41
  402. package/dist/throttler/throttler.storage.d.ts +0 -10
  403. package/dist/throttler/throttler.storage.js +0 -44
  404. package/dist/throttler/throttler.tokens.d.ts +0 -6
  405. package/dist/throttler/throttler.tokens.js +0 -5
  406. package/dist/throttler/throttler.types.d.ts +0 -25
  407. package/dist/throttler/throttler.types.js +0 -1
  408. package/dist/validation/create-zod-dto.d.ts +0 -13
  409. package/dist/validation/create-zod-dto.js +0 -18
  410. package/dist/validation/index.d.ts +0 -3
  411. package/dist/validation/index.js +0 -2
  412. package/dist/validation/validation.pipe.d.ts +0 -4
  413. package/dist/validation/validation.pipe.js +0 -19
  414. package/dist/websocket/websocket.decorators.d.ts +0 -47
  415. package/dist/websocket/websocket.decorators.js +0 -80
  416. package/dist/websocket/websocket.module.d.ts +0 -35
  417. package/dist/websocket/websocket.module.js +0 -63
  418. package/dist/websocket/websocket.tokens.d.ts +0 -30
  419. package/dist/websocket/websocket.tokens.js +0 -27
  420. package/dist/websocket/websocket.types.d.ts +0 -102
  421. package/dist/websocket/websocket.types.js +0 -4
  422. package/dist/websocket/ws-argument-resolver.d.ts +0 -13
  423. package/dist/websocket/ws-argument-resolver.js +0 -40
  424. package/dist/websocket/ws-dispatcher.d.ts +0 -54
  425. package/dist/websocket/ws-dispatcher.js +0 -322
  426. package/dist/websocket/ws-exception.d.ts +0 -16
  427. package/dist/websocket/ws-exception.js +0 -32
  428. package/dist/websocket/ws-execution-context.d.ts +0 -9
  429. package/dist/websocket/ws-execution-context.js +0 -24
  430. package/dist/websocket/ws-server.d.ts +0 -31
  431. package/dist/websocket/ws-server.js +0 -74
  432. package/dist/websocket/ws-sync.d.ts +0 -47
  433. package/dist/websocket/ws-sync.js +0 -74
  434. package/dist/websocket-node/node-ws-client.d.ts +0 -24
  435. package/dist/websocket-node/node-ws-client.js +0 -49
  436. package/dist/websocket-node/redis-live.d.ts +0 -24
  437. package/dist/websocket-node/redis-live.js +0 -57
  438. package/dist/websocket-node/redis-sync.d.ts +0 -33
  439. package/dist/websocket-node/redis-sync.js +0 -56
  440. package/dist/websocket-node/register-gateways.d.ts +0 -20
  441. package/dist/websocket-node/register-gateways.js +0 -61
@@ -1,322 +0,0 @@
1
- function _ts_decorate(decorators, target, key, desc) {
2
- var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
3
- if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
4
- 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;
5
- return c > 3 && r && Object.defineProperty(target, key, r), r;
6
- }
7
- function _ts_metadata(k, v) {
8
- if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
9
- }
10
- function _ts_param(paramIndex, decorator) {
11
- return function(target, key) {
12
- decorator(target, key, paramIndex);
13
- };
14
- }
15
- import { Container } from "../container/container.js";
16
- import { Inject, Injectable, Optional } from "../container/decorators.js";
17
- import { DiscoveryService } from "../discovery/discovery.service.js";
18
- import { instantiateMany } from "../http/instantiate.js";
19
- import { RouteManager } from "../http/route.manager.js";
20
- import { ComponentManager } from "../pipeline/component.manager.js";
21
- import { shouldFilterCatch } from "../pipeline/decorators.js";
22
- import { PipelineRunner } from "../pipeline/pipeline-runner.js";
23
- import { MetadataRegistry } from "../registry/metadata.registry.js";
24
- import { resolveWsArgs } from "./ws-argument-resolver.js";
25
- import { buildWsExecutionContext } from "./ws-execution-context.js";
26
- import { toErrorFrame, WsException } from "./ws-exception.js";
27
- import { RESERVED_WS_EVENT_PREFIX, WS_GATEWAY_METADATA, WS_RESERVED_METADATA, WS_SERVER, WS_SUBSCRIBE_METADATA } from "./websocket.tokens.js";
28
- function hasAfterInit(x) {
29
- return typeof x?.afterInit === 'function';
30
- }
31
- function hasHandleConnection(x) {
32
- return typeof x?.handleConnection === 'function';
33
- }
34
- function hasHandleDisconnect(x) {
35
- return typeof x?.handleDisconnect === 'function';
36
- }
37
- function isWsResponse(x) {
38
- return typeof x === 'object' && x !== null && typeof x.event === 'string';
39
- }
40
- export class WsDispatcher {
41
- container;
42
- discovery;
43
- server;
44
- routeManager;
45
- gateways = new Map();
46
- reserved = new Map();
47
- constructor(container, discovery, server, routeManager){
48
- this.container = container;
49
- this.discovery = discovery;
50
- this.server = server;
51
- this.routeManager = routeManager;
52
- }
53
- /** Paths of every discovered `@WebSocketGateway` — used by transports to register routes. */ get gatewayPaths() {
54
- return [
55
- ...this.gateways.keys()
56
- ];
57
- }
58
- async onApplicationBootstrap() {
59
- // Reserved-event handlers first: modules claiming a `$…` event
60
- // (@ReservedWsEvent) receive those frames across every gateway path.
61
- for (const found of this.discovery.providersWithMeta(WS_RESERVED_METADATA)){
62
- if (!found.instance) continue;
63
- const event = found.meta.event;
64
- if (this.reserved.has(event)) {
65
- const msg = `[vela] duplicate @ReservedWsEvent('${event}') ` + `(${found.metatype.name}); keeping the first.`;
66
- if (this.container.getDiagnostics() === 'throw') throw new Error(msg);
67
- console.warn(msg);
68
- continue;
69
- }
70
- this.reserved.set(event, found.instance);
71
- }
72
- for (const found of this.discovery.providersWithMeta(WS_GATEWAY_METADATA)){
73
- if (!found.instance) continue;
74
- const gatewayClass = found.metatype;
75
- const instance = found.instance;
76
- const entry = this.buildGatewayEntry(gatewayClass, found.meta, instance);
77
- // Two gateways on the same path (or both defaulting to '') would silently
78
- // overwrite each other in the routing Map — surface it instead.
79
- if (this.gateways.has(entry.path)) {
80
- const msg = `[vela] duplicate @WebSocketGateway path '${entry.path}' ` + `(${gatewayClass.name}); keeping the first. Give each gateway a distinct path.`;
81
- if (this.container.getDiagnostics() === 'throw') throw new Error(msg);
82
- console.warn(msg);
83
- continue;
84
- }
85
- this.gateways.set(entry.path, entry);
86
- if (this.server && hasAfterInit(instance)) {
87
- try {
88
- await instance.afterInit(this.server);
89
- } catch (err) {
90
- this.reportBootstrapError(gatewayClass.name, err);
91
- }
92
- }
93
- }
94
- }
95
- /** One `'websocket'` entrypoint per discovered gateway (authoritative). */ collectEntrypoints() {
96
- return [
97
- ...this.gateways.values()
98
- ].map((entry)=>({
99
- kind: 'websocket',
100
- token: entry.gatewayClass,
101
- instance: entry.instance,
102
- meta: {
103
- path: entry.path,
104
- dispatcher: this
105
- }
106
- }));
107
- }
108
- async handleOpen(path, client) {
109
- const entry = this.gateways.get(path);
110
- if (entry && hasHandleConnection(entry.instance)) {
111
- await entry.instance.handleConnection(client);
112
- }
113
- }
114
- async handleClose(path, client, _code, _reason) {
115
- // Reserved handlers drop per-connection state first (isolated per handler)
116
- // so a throwing gateway handleDisconnect can't leak live subscriptions.
117
- for (const handler of this.reserved.values()){
118
- try {
119
- await handler.handleSocketClose?.(path, client);
120
- } catch (err) {
121
- await this.handleError(path, client, err);
122
- }
123
- }
124
- const entry = this.gateways.get(path);
125
- if (entry && hasHandleDisconnect(entry.instance)) {
126
- await entry.instance.handleDisconnect(client);
127
- }
128
- }
129
- async handleError(path, _client, err) {
130
- if (this.container.getDiagnostics() !== 'silent') {
131
- console.warn(`[vela] websocket error on gateway ${path}:`, err);
132
- }
133
- }
134
- async dispatchMessage(path, client, raw) {
135
- const entry = this.gateways.get(path);
136
- if (!entry) return;
137
- let message;
138
- try {
139
- message = this.parse(raw);
140
- } catch {
141
- this.trySend(client, 'exception', {
142
- message: 'Invalid message'
143
- });
144
- return;
145
- }
146
- // Reserved namespace: `$…` frames route to @ReservedWsEvent handlers
147
- // (after app-wide guards) and NEVER reach gateway handlers; an unclaimed
148
- // reserved event is dropped like any unknown event.
149
- if (message.event.startsWith(RESERVED_WS_EVENT_PREFIX)) {
150
- await this.dispatchReserved(path, client, message);
151
- return;
152
- }
153
- const handler = entry.handlers.get(message.event);
154
- if (!handler) return; // unknown event — ignored (NestJS parity)
155
- const ctx = buildWsExecutionContext(client, message.data, entry.gatewayClass, handler.methodName, message.event);
156
- // App-wide global components (APP_* provider tokens + imperative
157
- // app.useGlobalX()) run first, then controller/handler-tier — mirroring the
158
- // HTTP HandlerExecutor so global guards/pipes/interceptors/filters protect
159
- // gateway messages too. Read live so late registrations propagate.
160
- const globals = this.routeManager?.getGlobalComponents();
161
- const guards = [
162
- ...instantiateMany(globals?.guards ?? [], this.container),
163
- ...instantiateMany(handler.guards, this.container)
164
- ];
165
- const pipes = [
166
- ...instantiateMany(globals?.pipes ?? [], this.container),
167
- ...instantiateMany(handler.pipes, this.container)
168
- ];
169
- const interceptors = [
170
- ...instantiateMany(globals?.interceptors ?? [], this.container),
171
- ...instantiateMany(handler.interceptors, this.container)
172
- ];
173
- // Handler/controller filters first (closest), then global filters last.
174
- const filters = [
175
- ...instantiateMany(handler.filters, this.container),
176
- ...instantiateMany(globals?.filters ?? [], this.container)
177
- ];
178
- try {
179
- const method = entry.instance[handler.methodName];
180
- // Guards → args + pipes → interceptor chain → handler, via the shared
181
- // runner (WS keeps guards-first, unlike HTTP's args-before-guards).
182
- const result = await PipelineRunner.run({
183
- context: ctx,
184
- guards,
185
- interceptors,
186
- resolveArgs: ()=>resolveWsArgs(handler.paramMeta, client, message.data, pipes, handler.paramTypes),
187
- invoke: async (args)=>method.apply(entry.instance, args),
188
- onGuardReject: ()=>new WsException('Forbidden')
189
- });
190
- this.reply(client, message, result);
191
- } catch (error) {
192
- await this.runFilters(client, message, error, filters, ctx);
193
- }
194
- }
195
- /**
196
- * Route a reserved (`$…`) frame to its claiming handler. App-wide (`APP_*` /
197
- * `useGlobalGuards`) guards protect reserved frames exactly like gateway
198
- * messages — guards-first, WS convention; handler/class-tier components are
199
- * the claiming module's own concern (e.g. live resolvers run their scoped
200
- * guards at subscribe).
201
- */ async dispatchReserved(path, client, message) {
202
- const handler = this.reserved.get(message.event);
203
- if (!handler) return;
204
- const ctx = buildWsExecutionContext(client, message.data, handler.constructor, 'handleReservedEvent', message.event);
205
- const globals = this.routeManager?.getGlobalComponents();
206
- const guards = instantiateMany(globals?.guards ?? [], this.container);
207
- try {
208
- for (const guard of guards){
209
- if (!await guard.canActivate(ctx)) {
210
- const frame = toErrorFrame(new WsException('Forbidden'));
211
- this.trySend(client, frame.event, frame.data, message.id);
212
- return;
213
- }
214
- }
215
- await handler.handleReservedEvent(path, client, message);
216
- } catch (err) {
217
- await this.handleError(path, client, err);
218
- }
219
- }
220
- reply(client, message, result) {
221
- if (result === undefined || result === null) return;
222
- if (isWsResponse(result)) {
223
- this.trySend(client, result.event, result.data, message.id);
224
- } else {
225
- this.trySend(client, message.event, result, message.id);
226
- }
227
- }
228
- async runFilters(client, message, error, filters, ctx) {
229
- for (const filter of filters){
230
- if (shouldFilterCatch(filter, error)) {
231
- try {
232
- const handled = await filter.catch(error, ctx);
233
- if (isWsResponse(handled)) {
234
- this.trySend(client, handled.event, handled.data, message.id);
235
- }
236
- } catch {
237
- // A throwing filter falls back to the default error frame (mirrors HandlerExecutor).
238
- const frame = toErrorFrame(error);
239
- this.trySend(client, frame.event, frame.data, message.id);
240
- }
241
- return;
242
- }
243
- }
244
- const errorFrame = toErrorFrame(error);
245
- this.trySend(client, errorFrame.event, errorFrame.data, message.id);
246
- }
247
- // Outbound sends are best-effort: the socket may have closed mid-dispatch.
248
- trySend(client, event, data, id) {
249
- try {
250
- client.send(event, data, id);
251
- } catch {
252
- // socket closed — nothing to do
253
- }
254
- }
255
- reportBootstrapError(name, err) {
256
- const mode = this.container.getDiagnostics();
257
- if (mode === 'throw') throw err;
258
- if (mode === 'log') console.warn(`[vela] websocket gateway ${name} afterInit failed:`, err);
259
- }
260
- parse(raw) {
261
- const text = typeof raw === 'string' ? raw : new TextDecoder().decode(raw);
262
- const parsed = JSON.parse(text);
263
- if (!parsed || typeof parsed !== 'object' || typeof parsed.event !== 'string') {
264
- throw new Error('Invalid WebSocket message envelope');
265
- }
266
- return parsed;
267
- }
268
- buildGatewayEntry(gatewayClass, options, instance) {
269
- const ctor = gatewayClass;
270
- const subs = MetadataRegistry.getCustomClassMeta(ctor, WS_SUBSCRIBE_METADATA) ?? [];
271
- const allParams = MetadataRegistry.getParameters(ctor);
272
- const handlers = new Map();
273
- for (const { event, methodName } of subs){
274
- // The `$` namespace belongs to framework modules (@ReservedWsEvent) — an
275
- // app gateway subscribing to it would never receive the frames anyway.
276
- if (event.startsWith(RESERVED_WS_EVENT_PREFIX)) {
277
- const msg = `[vela] @SubscribeMessage('${event}') on ${gatewayClass.name}: the ` + `'${RESERVED_WS_EVENT_PREFIX}' event prefix is reserved for framework modules — skipped.`;
278
- if (this.container.getDiagnostics() === 'throw') throw new Error(msg);
279
- console.warn(msg);
280
- continue;
281
- }
282
- const paramMeta = [
283
- ...allParams.get(methodName) ?? []
284
- ].sort((a, b)=>a.index - b.index);
285
- const paramTypes = Reflect.getMetadata('design:paramtypes', gatewayClass.prototype, methodName);
286
- handlers.set(event, {
287
- methodName,
288
- paramMeta,
289
- paramTypes,
290
- guards: ComponentManager.getScopedComponents('guard', ctor, methodName),
291
- pipes: ComponentManager.getScopedComponents('pipe', ctor, methodName),
292
- interceptors: ComponentManager.getScopedComponents('interceptor', ctor, methodName),
293
- // Handler → controller → global, so the closest filter runs first (mirrors HandlerExecutor).
294
- filters: [
295
- ...ComponentManager.getScopedComponents('filter', ctor, methodName)
296
- ].reverse()
297
- });
298
- }
299
- return {
300
- path: options.path ?? '',
301
- instance,
302
- gatewayClass,
303
- handlers
304
- };
305
- }
306
- }
307
- WsDispatcher = _ts_decorate([
308
- Injectable(),
309
- _ts_param(0, Inject(Container)),
310
- _ts_param(1, Inject(DiscoveryService)),
311
- _ts_param(2, Optional()),
312
- _ts_param(2, Inject(WS_SERVER)),
313
- _ts_param(3, Optional()),
314
- _ts_param(3, Inject(RouteManager)),
315
- _ts_metadata("design:type", Function),
316
- _ts_metadata("design:paramtypes", [
317
- typeof Container === "undefined" ? Object : Container,
318
- typeof DiscoveryService === "undefined" ? Object : DiscoveryService,
319
- typeof WsServer === "undefined" ? Object : WsServer,
320
- typeof RouteManager === "undefined" ? Object : RouteManager
321
- ])
322
- ], WsDispatcher);
@@ -1,16 +0,0 @@
1
- /**
2
- * WebSocket analogue of `HttpException`. Thrown from guards/pipes/handlers to
3
- * signal a client-facing error; the dispatcher serializes it to an
4
- * `{ event: 'exception', data }` frame unless a matching exception filter
5
- * handles it first.
6
- */
7
- export declare class WsException extends Error {
8
- private readonly err;
9
- constructor(err: string | Record<string, unknown>);
10
- getError(): string | Record<string, unknown>;
11
- }
12
- /** Default serialization of an uncaught error into the outbound exception frame. */
13
- export declare function toErrorFrame(error: unknown): {
14
- event: 'exception';
15
- data: unknown;
16
- };
@@ -1,32 +0,0 @@
1
- /**
2
- * WebSocket analogue of `HttpException`. Thrown from guards/pipes/handlers to
3
- * signal a client-facing error; the dispatcher serializes it to an
4
- * `{ event: 'exception', data }` frame unless a matching exception filter
5
- * handles it first.
6
- */ export class WsException extends Error {
7
- err;
8
- constructor(err){
9
- super(typeof err === 'string' ? err : String(err.message ?? 'WsException')), this.err = err;
10
- this.name = 'WsException';
11
- }
12
- getError() {
13
- return this.err;
14
- }
15
- }
16
- /** Default serialization of an uncaught error into the outbound exception frame. */ export function toErrorFrame(error) {
17
- if (error instanceof WsException) {
18
- const e = error.getError();
19
- return {
20
- event: 'exception',
21
- data: typeof e === 'string' ? {
22
- message: e
23
- } : e
24
- };
25
- }
26
- return {
27
- event: 'exception',
28
- data: {
29
- message: 'Internal server error'
30
- }
31
- };
32
- }
@@ -1,9 +0,0 @@
1
- import type { Type } from '../container/types';
2
- import type { WsClient, WsExecutionContext } from './websocket.types';
3
- /**
4
- * WebSocket sibling of `buildExecutionContext` (`http/execution-context.ts`).
5
- * Guards/pipes/interceptors/filters that read `getClass()`/`getHandler()` or
6
- * call `switchToWs()` reuse unchanged; the HTTP-only accessors throw rather
7
- * than fabricate a fake `Request`.
8
- */
9
- export declare function buildWsExecutionContext(client: WsClient, data: unknown, controller: Type, handlerName: string | symbol, pattern: string): WsExecutionContext;
@@ -1,24 +0,0 @@
1
- const HTTP_ON_WS = (accessor)=>()=>{
2
- throw new Error(`${accessor} called on a WebSocket ExecutionContext. This handler runs over a gateway message, not HTTP — use switchToWs().`);
3
- };
4
- /**
5
- * WebSocket sibling of `buildExecutionContext` (`http/execution-context.ts`).
6
- * Guards/pipes/interceptors/filters that read `getClass()`/`getHandler()` or
7
- * call `switchToWs()` reuse unchanged; the HTTP-only accessors throw rather
8
- * than fabricate a fake `Request`.
9
- */ export function buildWsExecutionContext(client, data, controller, handlerName, pattern) {
10
- const host = {
11
- getClient: ()=>client,
12
- getData: ()=>data,
13
- getPattern: ()=>pattern
14
- };
15
- return {
16
- getType: ()=>'ws',
17
- getClass: ()=>controller,
18
- getHandler: ()=>handlerName,
19
- getContext: HTTP_ON_WS('getContext()'),
20
- getRequest: HTTP_ON_WS('getRequest()'),
21
- switchToHttp: HTTP_ON_WS('switchToHttp()'),
22
- switchToWs: ()=>host
23
- };
24
- }
@@ -1,31 +0,0 @@
1
- import type { SyncDriver } from './ws-sync';
2
- import type { BroadcastOperator, WsServer } from './websocket.types';
3
- /**
4
- * Accumulates `{ rooms, exceptRooms, exceptIds }` across a fluent chain and, on
5
- * `.emit()`, produces a serializable `BroadcastCommand` handed to the active
6
- * `SyncDriver`. The driver decides local-vs-remote delivery.
7
- */
8
- export declare class BroadcastOperatorImpl implements BroadcastOperator {
9
- private readonly driver;
10
- private readonly rooms;
11
- private readonly exceptRooms;
12
- private readonly exceptIds;
13
- constructor(driver: SyncDriver, rooms?: Set<string>, exceptRooms?: Set<string>, exceptIds?: Set<string>);
14
- to(room: string): this;
15
- in(room: string): this;
16
- except(room: string): this;
17
- emit(event: string, data?: unknown): void | Promise<void>;
18
- }
19
- /**
20
- * The `@WebSocketServer()`-injected handle. Server-origin broadcasts never
21
- * pre-exclude anyone (a client-origin `client.to()` seeds `exceptIds` with the
22
- * sender — that lives in the transport's client, not here).
23
- */
24
- export declare class WsServerImpl implements WsServer {
25
- private readonly driver;
26
- constructor(driver: SyncDriver);
27
- emit(event: string, data?: unknown): void | Promise<void>;
28
- to(room: string): BroadcastOperator;
29
- in(room: string): BroadcastOperator;
30
- except(room: string): BroadcastOperator;
31
- }
@@ -1,74 +0,0 @@
1
- /**
2
- * Accumulates `{ rooms, exceptRooms, exceptIds }` across a fluent chain and, on
3
- * `.emit()`, produces a serializable `BroadcastCommand` handed to the active
4
- * `SyncDriver`. The driver decides local-vs-remote delivery.
5
- */ export class BroadcastOperatorImpl {
6
- driver;
7
- rooms;
8
- exceptRooms;
9
- exceptIds;
10
- constructor(driver, rooms = new Set(), exceptRooms = new Set(), exceptIds = new Set()){
11
- this.driver = driver;
12
- this.rooms = rooms;
13
- this.exceptRooms = exceptRooms;
14
- this.exceptIds = exceptIds;
15
- }
16
- to(room) {
17
- this.rooms.add(room);
18
- return this;
19
- }
20
- in(room) {
21
- return this.to(room);
22
- }
23
- except(room) {
24
- this.exceptRooms.add(room);
25
- return this;
26
- }
27
- emit(event, data) {
28
- const cmd = {
29
- rooms: [
30
- ...this.rooms
31
- ],
32
- exceptRooms: this.exceptRooms.size ? [
33
- ...this.exceptRooms
34
- ] : undefined,
35
- exceptIds: this.exceptIds.size ? [
36
- ...this.exceptIds
37
- ] : undefined,
38
- frame: JSON.stringify({
39
- event,
40
- data
41
- })
42
- };
43
- return this.driver.dispatch(cmd);
44
- }
45
- }
46
- /**
47
- * The `@WebSocketServer()`-injected handle. Server-origin broadcasts never
48
- * pre-exclude anyone (a client-origin `client.to()` seeds `exceptIds` with the
49
- * sender — that lives in the transport's client, not here).
50
- */ export class WsServerImpl {
51
- driver;
52
- constructor(driver){
53
- this.driver = driver;
54
- }
55
- emit(event, data) {
56
- // Empty `rooms` means GLOBAL.
57
- return this.driver.dispatch({
58
- rooms: [],
59
- frame: JSON.stringify({
60
- event,
61
- data
62
- })
63
- });
64
- }
65
- to(room) {
66
- return new BroadcastOperatorImpl(this.driver).to(room);
67
- }
68
- in(room) {
69
- return this.to(room);
70
- }
71
- except(room) {
72
- return new BroadcastOperatorImpl(this.driver).except(room);
73
- }
74
- }
@@ -1,47 +0,0 @@
1
- import type { BroadcastCommand, WsClient } from './websocket.types';
2
- /**
3
- * Owns LOCAL room membership and local fan-out for the connections a single
4
- * node/isolate holds. The Cloudflare transport backs this with hibernation
5
- * tags + attachment; node/bun/deno back it with the in-memory implementation
6
- * below. Always edge-safe (no `node:*`).
7
- */
8
- export interface RoomRegistry {
9
- /** Register a connection (called on connect) so global broadcasts can reach it. */
10
- register(client: WsClient): void;
11
- join(client: WsClient, room: string): void | Promise<void>;
12
- leave(client: WsClient, room: string): void | Promise<void>;
13
- /** Remove a connection and all its room memberships (called on disconnect). */
14
- leaveAll(client: WsClient): void | Promise<void>;
15
- /** Deliver a command to the sockets THIS node holds, applying every exclusion. */
16
- deliverLocal(cmd: BroadcastCommand): void | Promise<void>;
17
- localIdsInRoom(room: string): string[];
18
- }
19
- /**
20
- * Pluggable cross-instance transport for broadcast commands. `local()` is the
21
- * zero-config single-instance default; `durableObject()` (Cloudflare) and
22
- * `redis()` (node) are additive and chosen at the composition root.
23
- */
24
- export interface SyncDriver {
25
- readonly kind: string;
26
- /** Wire the local registry so the driver can deliver to locally-held sockets. */
27
- bind(registry: RoomRegistry): void;
28
- /** Route a command so every node that may hold a matching socket delivers it. */
29
- dispatch(cmd: BroadcastCommand): void | Promise<void>;
30
- countRoom?(room: string): Promise<number>;
31
- start?(): void | Promise<void>;
32
- stop?(): void | Promise<void>;
33
- }
34
- /** Single-instance default: deliver straight to the local registry, no cross-node hop. */
35
- export declare function local(): SyncDriver;
36
- /** In-memory `RoomRegistry` for node/bun/deno and tests. Edge-safe (plain Maps). */
37
- export declare class InMemoryRoomRegistry implements RoomRegistry {
38
- private readonly rooms;
39
- private readonly clientRooms;
40
- private readonly clients;
41
- register(client: WsClient): void;
42
- join(client: WsClient, room: string): void;
43
- leave(client: WsClient, room: string): void;
44
- leaveAll(client: WsClient): void;
45
- localIdsInRoom(room: string): string[];
46
- deliverLocal(cmd: BroadcastCommand): void;
47
- }
@@ -1,74 +0,0 @@
1
- /** Single-instance default: deliver straight to the local registry, no cross-node hop. */ export function local() {
2
- let registry;
3
- return {
4
- kind: 'local',
5
- bind (r) {
6
- registry = r;
7
- },
8
- dispatch (cmd) {
9
- return registry?.deliverLocal(cmd);
10
- }
11
- };
12
- }
13
- /** In-memory `RoomRegistry` for node/bun/deno and tests. Edge-safe (plain Maps). */ export class InMemoryRoomRegistry {
14
- rooms = new Map();
15
- clientRooms = new Map();
16
- clients = new Map();
17
- register(client) {
18
- this.clients.set(client.id, client);
19
- }
20
- join(client, room) {
21
- this.register(client);
22
- let members = this.rooms.get(room);
23
- if (!members) {
24
- members = new Set();
25
- this.rooms.set(room, members);
26
- }
27
- members.add(client);
28
- let joined = this.clientRooms.get(client.id);
29
- if (!joined) {
30
- joined = new Set();
31
- this.clientRooms.set(client.id, joined);
32
- }
33
- joined.add(room);
34
- }
35
- leave(client, room) {
36
- const members = this.rooms.get(room);
37
- members?.delete(client);
38
- if (members && members.size === 0) this.rooms.delete(room);
39
- this.clientRooms.get(client.id)?.delete(room);
40
- }
41
- leaveAll(client) {
42
- for (const room of this.clientRooms.get(client.id) ?? []){
43
- const members = this.rooms.get(room);
44
- members?.delete(client);
45
- if (members && members.size === 0) this.rooms.delete(room);
46
- }
47
- this.clientRooms.delete(client.id);
48
- this.clients.delete(client.id);
49
- }
50
- localIdsInRoom(room) {
51
- return [
52
- ...this.rooms.get(room) ?? []
53
- ].map((c)=>c.id);
54
- }
55
- deliverLocal(cmd) {
56
- const excludeIds = new Set(cmd.exceptIds ?? []);
57
- const excludeRooms = cmd.exceptRooms ?? [];
58
- // Empty `rooms` => GLOBAL: every registered connection. Otherwise the union
59
- // of the targeted rooms' members (deduped per connection).
60
- const candidates = cmd.rooms.length === 0 ? new Set(this.clients.values()) : (()=>{
61
- const set = new Set();
62
- for (const room of cmd.rooms){
63
- for (const client of this.rooms.get(room) ?? [])set.add(client);
64
- }
65
- return set;
66
- })();
67
- for (const client of candidates){
68
- if (excludeIds.has(client.id)) continue;
69
- const joined = this.clientRooms.get(client.id);
70
- if (excludeRooms.some((room)=>joined?.has(room))) continue;
71
- client.sendRaw(cmd.frame);
72
- }
73
- }
74
- }
@@ -1,24 +0,0 @@
1
- import type { WSContext } from 'hono/ws';
2
- import type { RoomRegistry, WsClient } from '../websocket/index';
3
- /**
4
- * Core `WsClient` over Hono's `WSContext` (node/bun/deno — no hibernation).
5
- * Room membership is mirrored into the shared `RoomRegistry` so broadcasts from
6
- * the `WsServer` reach this connection.
7
- */
8
- export declare class NodeWsClient<TData extends Record<string, unknown> = Record<string, unknown>> implements WsClient<TData> {
9
- private readonly ws;
10
- private readonly registry;
11
- readonly path: string;
12
- readonly id: string;
13
- data: TData;
14
- private readonly _rooms;
15
- constructor(ws: WSContext, registry: RoomRegistry, path: string);
16
- get rooms(): ReadonlySet<string>;
17
- get raw(): unknown;
18
- send(event: string, data?: unknown, id?: string): void;
19
- sendRaw(payload: string): void;
20
- join(room: string): void | Promise<void>;
21
- leave(room: string): void | Promise<void>;
22
- commit(): void;
23
- close(code?: number, reason?: string): void;
24
- }