alepha 0.14.4 → 0.15.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 (322) hide show
  1. package/README.md +44 -102
  2. package/dist/api/audits/index.d.ts +331 -443
  3. package/dist/api/audits/index.d.ts.map +1 -1
  4. package/dist/api/audits/index.js +2 -2
  5. package/dist/api/audits/index.js.map +1 -1
  6. package/dist/api/files/index.d.ts +0 -113
  7. package/dist/api/files/index.d.ts.map +1 -1
  8. package/dist/api/files/index.js +2 -3
  9. package/dist/api/files/index.js.map +1 -1
  10. package/dist/api/jobs/index.d.ts +151 -262
  11. package/dist/api/jobs/index.d.ts.map +1 -1
  12. package/dist/api/notifications/index.browser.js +4 -4
  13. package/dist/api/notifications/index.browser.js.map +1 -1
  14. package/dist/api/notifications/index.d.ts +164 -276
  15. package/dist/api/notifications/index.d.ts.map +1 -1
  16. package/dist/api/notifications/index.js +4 -4
  17. package/dist/api/notifications/index.js.map +1 -1
  18. package/dist/api/parameters/index.d.ts +265 -377
  19. package/dist/api/parameters/index.d.ts.map +1 -1
  20. package/dist/api/users/index.browser.js +1 -2
  21. package/dist/api/users/index.browser.js.map +1 -1
  22. package/dist/api/users/index.d.ts +195 -301
  23. package/dist/api/users/index.d.ts.map +1 -1
  24. package/dist/api/users/index.js +203 -184
  25. package/dist/api/users/index.js.map +1 -1
  26. package/dist/api/verifications/index.d.ts.map +1 -1
  27. package/dist/batch/index.d.ts.map +1 -1
  28. package/dist/batch/index.js +1 -2
  29. package/dist/batch/index.js.map +1 -1
  30. package/dist/bucket/index.d.ts.map +1 -1
  31. package/dist/cache/core/index.d.ts.map +1 -1
  32. package/dist/cache/redis/index.d.ts.map +1 -1
  33. package/dist/cache/redis/index.js +2 -2
  34. package/dist/cache/redis/index.js.map +1 -1
  35. package/dist/cli/index.d.ts +5900 -165
  36. package/dist/cli/index.d.ts.map +1 -1
  37. package/dist/cli/index.js +1481 -639
  38. package/dist/cli/index.js.map +1 -1
  39. package/dist/command/index.d.ts +8 -4
  40. package/dist/command/index.d.ts.map +1 -1
  41. package/dist/command/index.js +29 -25
  42. package/dist/command/index.js.map +1 -1
  43. package/dist/core/index.browser.js +563 -54
  44. package/dist/core/index.browser.js.map +1 -1
  45. package/dist/core/index.d.ts +175 -8
  46. package/dist/core/index.d.ts.map +1 -1
  47. package/dist/core/index.js +564 -54
  48. package/dist/core/index.js.map +1 -1
  49. package/dist/core/index.native.js +563 -54
  50. package/dist/core/index.native.js.map +1 -1
  51. package/dist/datetime/index.d.ts.map +1 -1
  52. package/dist/datetime/index.js +4 -4
  53. package/dist/datetime/index.js.map +1 -1
  54. package/dist/email/index.d.ts +89 -42
  55. package/dist/email/index.d.ts.map +1 -1
  56. package/dist/email/index.js +129 -33
  57. package/dist/email/index.js.map +1 -1
  58. package/dist/fake/index.d.ts +7969 -2
  59. package/dist/fake/index.d.ts.map +1 -1
  60. package/dist/fake/index.js +22 -22
  61. package/dist/fake/index.js.map +1 -1
  62. package/dist/file/index.d.ts +134 -1
  63. package/dist/file/index.d.ts.map +1 -1
  64. package/dist/file/index.js +253 -1
  65. package/dist/file/index.js.map +1 -1
  66. package/dist/lock/core/index.d.ts.map +1 -1
  67. package/dist/lock/redis/index.d.ts.map +1 -1
  68. package/dist/logger/index.d.ts +1 -2
  69. package/dist/logger/index.d.ts.map +1 -1
  70. package/dist/logger/index.js +1 -5
  71. package/dist/logger/index.js.map +1 -1
  72. package/dist/mcp/index.d.ts +19 -1
  73. package/dist/mcp/index.d.ts.map +1 -1
  74. package/dist/mcp/index.js +28 -4
  75. package/dist/mcp/index.js.map +1 -1
  76. package/dist/orm/chunk-DH6iiROE.js +38 -0
  77. package/dist/orm/index.browser.js +9 -9
  78. package/dist/orm/index.browser.js.map +1 -1
  79. package/dist/orm/index.bun.js +2821 -0
  80. package/dist/orm/index.bun.js.map +1 -0
  81. package/dist/orm/index.d.ts +318 -169
  82. package/dist/orm/index.d.ts.map +1 -1
  83. package/dist/orm/index.js +2086 -1776
  84. package/dist/orm/index.js.map +1 -1
  85. package/dist/queue/core/index.d.ts +4 -4
  86. package/dist/queue/core/index.d.ts.map +1 -1
  87. package/dist/queue/redis/index.d.ts.map +1 -1
  88. package/dist/redis/index.bun.js +285 -0
  89. package/dist/redis/index.bun.js.map +1 -0
  90. package/dist/redis/index.d.ts +13 -31
  91. package/dist/redis/index.d.ts.map +1 -1
  92. package/dist/redis/index.js +18 -38
  93. package/dist/redis/index.js.map +1 -1
  94. package/dist/retry/index.d.ts.map +1 -1
  95. package/dist/router/index.d.ts.map +1 -1
  96. package/dist/scheduler/index.d.ts +83 -1
  97. package/dist/scheduler/index.d.ts.map +1 -1
  98. package/dist/scheduler/index.js +393 -1
  99. package/dist/scheduler/index.js.map +1 -1
  100. package/dist/security/index.browser.js +5 -1
  101. package/dist/security/index.browser.js.map +1 -1
  102. package/dist/security/index.d.ts +598 -112
  103. package/dist/security/index.d.ts.map +1 -1
  104. package/dist/security/index.js +1808 -97
  105. package/dist/security/index.js.map +1 -1
  106. package/dist/server/auth/index.d.ts +1200 -175
  107. package/dist/server/auth/index.d.ts.map +1 -1
  108. package/dist/server/auth/index.js +1268 -37
  109. package/dist/server/auth/index.js.map +1 -1
  110. package/dist/server/cache/index.d.ts +6 -3
  111. package/dist/server/cache/index.d.ts.map +1 -1
  112. package/dist/server/cache/index.js +1 -1
  113. package/dist/server/cache/index.js.map +1 -1
  114. package/dist/server/compress/index.d.ts.map +1 -1
  115. package/dist/server/cookies/index.d.ts.map +1 -1
  116. package/dist/server/cookies/index.js +3 -3
  117. package/dist/server/cookies/index.js.map +1 -1
  118. package/dist/server/core/index.d.ts +115 -13
  119. package/dist/server/core/index.d.ts.map +1 -1
  120. package/dist/server/core/index.js +321 -139
  121. package/dist/server/core/index.js.map +1 -1
  122. package/dist/server/cors/index.d.ts +0 -1
  123. package/dist/server/cors/index.d.ts.map +1 -1
  124. package/dist/server/health/index.d.ts +0 -1
  125. package/dist/server/health/index.d.ts.map +1 -1
  126. package/dist/server/helmet/index.d.ts.map +1 -1
  127. package/dist/server/links/index.browser.js +9 -1
  128. package/dist/server/links/index.browser.js.map +1 -1
  129. package/dist/server/links/index.d.ts +1 -2
  130. package/dist/server/links/index.d.ts.map +1 -1
  131. package/dist/server/links/index.js +14 -7
  132. package/dist/server/links/index.js.map +1 -1
  133. package/dist/server/metrics/index.d.ts +514 -1
  134. package/dist/server/metrics/index.d.ts.map +1 -1
  135. package/dist/server/metrics/index.js +4462 -4
  136. package/dist/server/metrics/index.js.map +1 -1
  137. package/dist/server/multipart/index.d.ts.map +1 -1
  138. package/dist/server/proxy/index.d.ts +0 -1
  139. package/dist/server/proxy/index.d.ts.map +1 -1
  140. package/dist/server/rate-limit/index.d.ts.map +1 -1
  141. package/dist/server/static/index.d.ts.map +1 -1
  142. package/dist/server/swagger/index.d.ts +1 -2
  143. package/dist/server/swagger/index.d.ts.map +1 -1
  144. package/dist/server/swagger/index.js +1 -2
  145. package/dist/server/swagger/index.js.map +1 -1
  146. package/dist/sms/index.d.ts +3 -1
  147. package/dist/sms/index.d.ts.map +1 -1
  148. package/dist/sms/index.js +10 -10
  149. package/dist/sms/index.js.map +1 -1
  150. package/dist/thread/index.d.ts +0 -1
  151. package/dist/thread/index.d.ts.map +1 -1
  152. package/dist/thread/index.js +2 -2
  153. package/dist/thread/index.js.map +1 -1
  154. package/dist/topic/core/index.d.ts.map +1 -1
  155. package/dist/topic/redis/index.d.ts.map +1 -1
  156. package/dist/vite/index.d.ts +6315 -149
  157. package/dist/vite/index.d.ts.map +1 -1
  158. package/dist/vite/index.js +140 -469
  159. package/dist/vite/index.js.map +1 -1
  160. package/dist/websocket/index.browser.js +9 -9
  161. package/dist/websocket/index.browser.js.map +1 -1
  162. package/dist/websocket/index.d.ts +28 -28
  163. package/dist/websocket/index.d.ts.map +1 -1
  164. package/dist/websocket/index.js +9 -9
  165. package/dist/websocket/index.js.map +1 -1
  166. package/package.json +13 -18
  167. package/src/api/files/controllers/AdminFileStatsController.ts +0 -1
  168. package/src/api/users/atoms/realmAuthSettingsAtom.ts +5 -0
  169. package/src/api/users/controllers/{UserRealmController.ts → RealmController.ts} +11 -11
  170. package/src/api/users/entities/users.ts +1 -1
  171. package/src/api/users/index.ts +8 -8
  172. package/src/api/users/primitives/{$userRealm.ts → $realm.ts} +17 -19
  173. package/src/api/users/providers/{UserRealmProvider.ts → RealmProvider.ts} +26 -30
  174. package/src/api/users/schemas/{userRealmConfigSchema.ts → realmConfigSchema.ts} +2 -2
  175. package/src/api/users/services/CredentialService.ts +7 -7
  176. package/src/api/users/services/IdentityService.ts +4 -4
  177. package/src/api/users/services/RegistrationService.spec.ts +25 -27
  178. package/src/api/users/services/RegistrationService.ts +38 -27
  179. package/src/api/users/services/SessionCrudService.ts +3 -3
  180. package/src/api/users/services/SessionService.spec.ts +3 -3
  181. package/src/api/users/services/SessionService.ts +27 -18
  182. package/src/api/users/services/UserService.ts +7 -7
  183. package/src/batch/providers/BatchProvider.ts +1 -2
  184. package/src/cli/apps/AlephaCli.ts +2 -2
  185. package/src/cli/apps/AlephaPackageBuilderCli.ts +47 -20
  186. package/src/cli/assets/apiHelloControllerTs.ts +19 -0
  187. package/src/cli/assets/apiIndexTs.ts +16 -0
  188. package/src/cli/assets/biomeJson.ts +2 -1
  189. package/src/cli/assets/claudeMd.ts +308 -0
  190. package/src/cli/assets/dummySpecTs.ts +2 -1
  191. package/src/cli/assets/editorconfig.ts +2 -1
  192. package/src/cli/assets/mainBrowserTs.ts +4 -3
  193. package/src/cli/assets/mainCss.ts +24 -0
  194. package/src/cli/assets/mainServerTs.ts +24 -0
  195. package/src/cli/assets/tsconfigJson.ts +2 -1
  196. package/src/cli/assets/webAppRouterTs.ts +16 -0
  197. package/src/cli/assets/webHelloComponentTsx.ts +20 -0
  198. package/src/cli/assets/webIndexTs.ts +16 -0
  199. package/src/cli/atoms/appEntryOptions.ts +13 -0
  200. package/src/cli/atoms/buildOptions.ts +1 -1
  201. package/src/cli/atoms/changelogOptions.ts +1 -1
  202. package/src/cli/commands/build.ts +97 -61
  203. package/src/cli/commands/db.ts +21 -18
  204. package/src/cli/commands/deploy.ts +17 -5
  205. package/src/cli/commands/dev.ts +26 -47
  206. package/src/cli/commands/gen/env.ts +1 -1
  207. package/src/cli/commands/init.ts +79 -25
  208. package/src/cli/commands/lint.ts +9 -3
  209. package/src/cli/commands/test.ts +8 -2
  210. package/src/cli/commands/typecheck.ts +5 -1
  211. package/src/cli/commands/verify.ts +4 -2
  212. package/src/cli/defineConfig.ts +9 -0
  213. package/src/cli/index.ts +2 -1
  214. package/src/cli/providers/AppEntryProvider.ts +131 -0
  215. package/src/cli/providers/ViteBuildProvider.ts +82 -0
  216. package/src/cli/providers/ViteDevServerProvider.ts +350 -0
  217. package/src/cli/providers/ViteTemplateProvider.ts +27 -0
  218. package/src/cli/services/AlephaCliUtils.ts +72 -602
  219. package/src/cli/services/PackageManagerUtils.ts +308 -0
  220. package/src/cli/services/ProjectScaffolder.ts +329 -0
  221. package/src/command/helpers/Runner.ts +15 -3
  222. package/src/core/Alepha.ts +2 -8
  223. package/src/core/__tests__/Alepha-graph.spec.ts +4 -0
  224. package/src/core/index.shared.ts +1 -0
  225. package/src/core/index.ts +2 -0
  226. package/src/core/primitives/$hook.ts +6 -2
  227. package/src/core/primitives/$module.spec.ts +4 -0
  228. package/src/core/primitives/$module.ts +12 -0
  229. package/src/core/providers/AlsProvider.ts +1 -1
  230. package/src/core/providers/CodecManager.spec.ts +12 -6
  231. package/src/core/providers/CodecManager.ts +26 -6
  232. package/src/core/providers/EventManager.ts +169 -13
  233. package/src/core/providers/KeylessJsonSchemaCodec.spec.ts +878 -0
  234. package/src/core/providers/KeylessJsonSchemaCodec.ts +789 -0
  235. package/src/core/providers/SchemaValidator.spec.ts +236 -0
  236. package/src/core/providers/StateManager.spec.ts +27 -16
  237. package/src/email/providers/LocalEmailProvider.spec.ts +111 -87
  238. package/src/email/providers/LocalEmailProvider.ts +52 -15
  239. package/src/email/providers/NodemailerEmailProvider.ts +167 -56
  240. package/src/file/errors/FileError.ts +7 -0
  241. package/src/file/index.ts +9 -1
  242. package/src/file/providers/MemoryFileSystemProvider.ts +393 -0
  243. package/src/logger/providers/PrettyFormatterProvider.ts +0 -9
  244. package/src/mcp/errors/McpError.ts +30 -0
  245. package/src/mcp/index.ts +3 -0
  246. package/src/mcp/transports/SseMcpTransport.ts +16 -6
  247. package/src/orm/index.browser.ts +1 -19
  248. package/src/orm/index.bun.ts +77 -0
  249. package/src/orm/index.shared-server.ts +22 -0
  250. package/src/orm/index.shared.ts +15 -0
  251. package/src/orm/index.ts +19 -39
  252. package/src/orm/providers/DrizzleKitProvider.ts +3 -5
  253. package/src/orm/providers/drivers/BunPostgresProvider.ts +3 -5
  254. package/src/orm/providers/drivers/BunSqliteProvider.ts +1 -1
  255. package/src/orm/providers/drivers/CloudflareD1Provider.ts +4 -0
  256. package/src/orm/providers/drivers/DatabaseProvider.ts +4 -0
  257. package/src/orm/providers/drivers/PglitePostgresProvider.ts +4 -0
  258. package/src/orm/services/Repository.ts +19 -0
  259. package/src/redis/index.bun.ts +35 -0
  260. package/src/redis/providers/BunRedisProvider.ts +12 -43
  261. package/src/redis/providers/BunRedisSubscriberProvider.ts +2 -3
  262. package/src/redis/providers/NodeRedisProvider.ts +16 -34
  263. package/src/{server/security → security}/__tests__/BasicAuth.spec.ts +11 -11
  264. package/src/{server/security → security}/__tests__/ServerSecurityProvider-realm.spec.ts +21 -16
  265. package/src/{server/security/providers → security/__tests__}/ServerSecurityProvider.spec.ts +5 -5
  266. package/src/security/index.browser.ts +5 -0
  267. package/src/security/index.ts +90 -7
  268. package/src/security/primitives/{$realm.spec.ts → $issuer.spec.ts} +11 -11
  269. package/src/security/primitives/{$realm.ts → $issuer.ts} +20 -17
  270. package/src/security/primitives/$role.ts +5 -5
  271. package/src/security/primitives/$serviceAccount.spec.ts +5 -5
  272. package/src/security/primitives/$serviceAccount.ts +3 -3
  273. package/src/{server/security → security}/providers/ServerSecurityProvider.ts +5 -7
  274. package/src/server/auth/primitives/$auth.ts +10 -10
  275. package/src/server/auth/primitives/$authCredentials.ts +3 -3
  276. package/src/server/auth/primitives/$authGithub.ts +3 -3
  277. package/src/server/auth/primitives/$authGoogle.ts +3 -3
  278. package/src/server/auth/providers/ServerAuthProvider.ts +13 -13
  279. package/src/server/cache/providers/ServerCacheProvider.ts +1 -1
  280. package/src/server/cookies/providers/ServerCookiesProvider.ts +3 -3
  281. package/src/server/core/index.ts +1 -1
  282. package/src/server/core/providers/BunHttpServerProvider.ts +1 -1
  283. package/src/server/core/providers/NodeHttpServerProvider.spec.ts +125 -0
  284. package/src/server/core/providers/NodeHttpServerProvider.ts +92 -24
  285. package/src/server/core/providers/ServerBodyParserProvider.ts +19 -23
  286. package/src/server/core/providers/ServerLoggerProvider.ts +23 -19
  287. package/src/server/core/providers/ServerProvider.ts +144 -24
  288. package/src/server/core/providers/ServerRouterProvider.ts +259 -115
  289. package/src/server/core/providers/ServerTimingProvider.ts +2 -2
  290. package/src/server/links/atoms/apiLinksAtom.ts +7 -0
  291. package/src/server/links/index.browser.ts +2 -0
  292. package/src/server/links/index.ts +3 -1
  293. package/src/server/links/providers/LinkProvider.ts +1 -1
  294. package/src/server/swagger/index.ts +1 -1
  295. package/src/sms/providers/LocalSmsProvider.spec.ts +153 -111
  296. package/src/sms/providers/LocalSmsProvider.ts +8 -7
  297. package/src/vite/index.ts +3 -2
  298. package/src/vite/tasks/buildClient.ts +0 -1
  299. package/src/vite/tasks/buildServer.ts +80 -22
  300. package/src/vite/tasks/copyAssets.ts +5 -4
  301. package/src/vite/tasks/generateCloudflare.ts +7 -0
  302. package/src/vite/tasks/generateSitemap.ts +64 -23
  303. package/src/vite/tasks/index.ts +0 -2
  304. package/src/vite/tasks/prerenderPages.ts +49 -24
  305. package/dist/server/security/index.browser.js +0 -13
  306. package/dist/server/security/index.browser.js.map +0 -1
  307. package/dist/server/security/index.d.ts +0 -173
  308. package/dist/server/security/index.d.ts.map +0 -1
  309. package/dist/server/security/index.js +0 -311
  310. package/dist/server/security/index.js.map +0 -1
  311. package/src/cli/assets/appRouterTs.ts +0 -9
  312. package/src/cli/assets/indexHtml.ts +0 -15
  313. package/src/cli/assets/mainTs.ts +0 -13
  314. package/src/cli/commands/format.ts +0 -17
  315. package/src/server/security/index.browser.ts +0 -10
  316. package/src/server/security/index.ts +0 -94
  317. package/src/vite/helpers/boot.ts +0 -106
  318. package/src/vite/plugins/viteAlephaDev.ts +0 -177
  319. package/src/vite/tasks/devServer.ts +0 -69
  320. package/src/vite/tasks/runAlepha.ts +0 -270
  321. /package/src/{server/security → security}/primitives/$basicAuth.ts +0 -0
  322. /package/src/{server/security → security}/providers/ServerBasicAuthProvider.ts +0 -0
@@ -1 +1 @@
1
- {"version":3,"file":"index.browser.js","names":["url"],"sources":["../../src/websocket/primitives/$channel.ts","../../src/websocket/providers/WebSocketServerProvider.ts","../../src/websocket/primitives/$websocket.ts","../../src/websocket/services/WebSocketClient.ts","../../src/websocket/errors/WebSocketError.ts","../../src/websocket/interfaces/WebSocketInterfaces.ts","../../src/websocket/services/RoomManager.ts","../../src/websocket/services/WebSocketTopicService.ts","../../src/websocket/index.browser.ts"],"sourcesContent":["import {\n createPrimitive,\n KIND,\n Primitive,\n type TObject,\n type TString,\n type TUnion,\n} from \"alepha\";\n\nexport type TWSObject = TObject | TUnion;\n\n/**\n * Channel primitive options\n */\nexport interface ChannelPrimitiveOptions<\n TClient extends TWSObject,\n TServer extends TWSObject,\n> {\n /**\n * WebSocket endpoint path (e.g., \"/ws/chat\")\n */\n path: string;\n\n /**\n * Optional description for documentation\n */\n description?: string;\n\n /**\n * Message schemas for bidirectional communication\n */\n schema: {\n /**\n * Optional room ID schema validation\n * Default: t.text() (any string)\n * Can be enforced at application level: t.uuid(), t.regex(/^[a-f0-9\\-]{36}$/)\n */\n roomId?: TString;\n\n /**\n * Messages from server to client\n * This is what clients will receive\n */\n in: TClient;\n\n /**\n * Messages from client to server\n * This is what the server will receive\n */\n out: TServer;\n };\n}\n\n/**\n * Defines a WebSocket channel with specified client and server message schemas.\n *\n * Channels must be defined as class properties to be registered in the Alepha context.\n * They define the \"vocabulary\" for communication - the schema for messages flowing\n * in both directions (server→client and client→server).\n *\n * @example Server-side with $websocket\n * ```typescript\n * class ChatController {\n * // Channel must be defined inside a class\n * chatChannel = $channel({\n * path: \"/ws/chat\",\n * description: \"Real-time chat channel\",\n * schema: {\n * // Server → Client messages\n * in: t.union([\n * t.object({\n * type: t.const(\"append\"),\n * content: t.text(),\n * username: t.text()\n * }),\n * t.object({\n * type: t.const(\"system\"),\n * message: t.text()\n * })\n * ]),\n * // Client → Server messages\n * out: t.object({\n * content: t.text()\n * })\n * }\n * });\n *\n * chat = $websocket({\n * channel: this.chatChannel,\n * handler: async ({ message, reply }) => {\n * await reply({\n * message: { type: \"append\", content: message.content, username: \"user\" }\n * });\n * }\n * });\n * }\n * ```\n *\n * @example Browser-side with useRoom\n * ```typescript\n * // Define channel in a class for browser context\n * class ChatClient {\n * chatChannel = $channel({\n * path: \"/ws/chat\",\n * schema: { in: inSchema, out: outSchema }\n * });\n * }\n *\n * // Use in React component\n * function Chat() {\n * const client = useInject(ChatClient);\n * const chat = useRoom({ roomId: \"lobby\", channel: client.chatChannel, handler: ... }, []);\n * }\n * ```\n */\nexport const $channel = <TClient extends TWSObject, TServer extends TWSObject>(\n options: ChannelPrimitiveOptions<TClient, TServer>,\n): ChannelPrimitive<TClient, TServer> => {\n return createPrimitive(ChannelPrimitive<TClient, TServer>, options);\n};\n\n// ---------------------------------------------------------------------------------------------------------------------\n\nexport class ChannelPrimitive<\n TClient extends TWSObject,\n TServer extends TWSObject,\n> extends Primitive<ChannelPrimitiveOptions<TClient, TServer>> {\n // Channels are just schema definitions - no initialization logic needed\n}\n\n$channel[KIND] = ChannelPrimitive;\n","import type {\n EmitOptions,\n WebSocketConnection,\n WebSocketPrimitiveOptions,\n} from \"../interfaces/WebSocketInterfaces.ts\";\nimport type { TWSObject } from \"../primitives/$channel.ts\";\n\n/**\n * Abstract WebSocket server provider\n *\n * This class provides the base interface that must be implemented by\n * platform-specific providers (Node.js, Browser, etc.)\n */\nexport abstract class WebSocketServerProvider {\n /**\n * Register a WebSocket endpoint with its channel configuration\n */\n abstract registerEndpoint<\n TClient extends TWSObject,\n TServer extends TWSObject,\n >(config: WebSocketPrimitiveOptions<TClient, TServer>): void;\n\n /**\n * Emit a message to clients based on targeting criteria\n *\n * This method distributes messages across all server instances via pub/sub.\n */\n abstract emit<TClient extends TWSObject>(\n channelPath: string,\n options: EmitOptions<TClient>,\n ): Promise<void>;\n\n /**\n * Get all active connections (local to this server instance)\n */\n abstract getConnections(): WebSocketConnection[];\n\n /**\n * Get connections in a specific room (local to this server instance)\n */\n abstract getRoomConnections(roomId: string): WebSocketConnection[];\n\n /**\n * Get connections for a specific user (local to this server instance)\n */\n abstract getUserConnections(userId: string): WebSocketConnection[];\n\n /**\n * Close a specific connection\n */\n abstract closeConnection(\n connectionId: string,\n code?: number,\n reason?: string,\n ): Promise<void>;\n}\n","import { $inject, createPrimitive, KIND, Primitive } from \"alepha\";\nimport type {\n EmitOptions,\n WebSocketPrimitiveOptions,\n} from \"../interfaces/WebSocketInterfaces.ts\";\nimport { WebSocketServerProvider } from \"../providers/WebSocketServerProvider.ts\";\nimport type { TWSObject } from \"./$channel.ts\";\n\n/**\n * Defines a WebSocket server endpoint for a specific channel.\n *\n * Server-side only. Creates a WebSocket endpoint that:\n * - Accepts connections from clients\n * - Validates incoming messages against the channel schema\n * - Provides room-based messaging\n * - Integrates with alepha/security for authentication (optional)\n * - Supports horizontal scaling via alepha/topic\n *\n * @example\n * ```typescript\n * class ChatController {\n * chat = $websocket({\n * channel: chatChannel,\n * handler: async ({ connectionId, userId, roomId, message, reply }) => {\n * // Broadcast to all in room except sender\n * await reply({\n * message: {\n * type: \"append\",\n * username: userId,\n * content: message.content\n * },\n * exceptSelf: true\n * });\n * }\n * });\n *\n * async broadcastAnnouncement(roomId: string, text: string) {\n * await this.chat.emit({\n * roomId,\n * message: {\n * type: \"append\",\n * username: \"System\",\n * content: text\n * }\n * });\n * }\n * }\n * ```\n */\nexport const $websocket = <\n TClient extends TWSObject,\n TServer extends TWSObject,\n>(\n options: WebSocketPrimitiveOptions<TClient, TServer>,\n): WebSocketPrimitive<TClient, TServer> => {\n return createPrimitive(WebSocketPrimitive<TClient, TServer>, options);\n};\n\n// ---------------------------------------------------------------------------------------------------------------------\n\nexport class WebSocketPrimitive<\n TClient extends TWSObject,\n TServer extends TWSObject,\n> extends Primitive<WebSocketPrimitiveOptions<TClient, TServer>> {\n protected readonly webSocketServerProvider = $inject(WebSocketServerProvider);\n\n protected onInit() {\n this.webSocketServerProvider.registerEndpoint(this.options);\n }\n\n /**\n * Emit message to clients\n *\n * Send messages from the server to connected clients based on targeting criteria.\n * Messages are distributed across all server instances via pub/sub.\n *\n * @example\n * ```typescript\n * // Send to specific room\n * await websocket.emit({\n * roomId: \"room-123\",\n * message: { type: \"update\", data: {...} }\n * });\n *\n * // Send to specific user (all their connections)\n * await websocket.emit({\n * userId: \"user-456\",\n * message: { type: \"notification\", text: \"Hello!\" }\n * });\n *\n * // Send to multiple rooms, except certain users\n * await websocket.emit({\n * roomIds: [\"room-1\", \"room-2\"],\n * exceptUserIds: [\"user-123\"],\n * message: { type: \"broadcast\", content: \"System announcement\" }\n * });\n * ```\n */\n public async emit(options: EmitOptions<TClient>): Promise<void> {\n await this.webSocketServerProvider.emit(\n this.options.channel.options.path,\n options,\n );\n }\n}\n\n$websocket[KIND] = WebSocketPrimitive;\n","import {\n $env,\n $inject,\n Alepha,\n AlephaError,\n type Static,\n t,\n Value,\n} from \"alepha\";\nimport { $logger } from \"alepha/logger\";\nimport type { ChannelPrimitive, TWSObject } from \"../primitives/$channel.ts\";\n\nconst envSchema = t.object({\n WEBSOCKET_URL: t.text({\n default: \"\",\n description:\n \"WebSocket server URL (e.g., ws://localhost:3001). Leave empty to auto-detect.\",\n }),\n WEBSOCKET_RECONNECT_INTERVAL: t.integer({\n default: 3000,\n description: \"Reconnection interval in milliseconds\",\n }),\n WEBSOCKET_MAX_RECONNECT_ATTEMPTS: t.integer({\n default: 10,\n description:\n \"Maximum number of reconnection attempts. Set to -1 for infinite.\",\n }),\n});\n\ndeclare module \"alepha\" {\n interface Env extends Partial<Static<typeof envSchema>> {}\n}\n\n/**\n * Room subscription\n */\ninterface RoomSubscription<TClient extends TWSObject> {\n roomId: string;\n handler: (message: Static<TClient>) => void;\n}\n\n/**\n * WebSocket channel connection\n *\n * Manages a single WebSocket connection to a channel with multiple room subscriptions.\n * One connection can handle multiple rooms on the same channel.\n */\nexport class WebSocketChannelConnection<\n TClient extends TWSObject,\n TServer extends TWSObject,\n> {\n protected readonly alepha = $inject(Alepha);\n protected readonly log = $logger();\n protected ws?: WebSocket;\n protected reconnectAttempts = 0;\n protected reconnectTimer?: number;\n protected messageQueue: Array<{ roomId: string; message: Static<TServer> }> =\n [];\n\n // Room subscriptions: Map<roomId, handler>\n protected subscriptions = new Map<\n string,\n (message: Static<TClient>) => void\n >();\n\n // Connection state\n public isConnected = false;\n public isConnecting = false;\n public isError = false;\n public error?: Error;\n\n // Connection callbacks\n protected onConnectCallbacks = new Set<() => void>();\n protected onDisconnectCallbacks = new Set<() => void>();\n protected onErrorCallbacks = new Set<(error: Error) => void>();\n\n constructor(\n protected readonly channel: ChannelPrimitive<TClient, TServer>,\n protected readonly options: {\n url?: string;\n autoReconnect?: boolean;\n reconnectInterval?: number;\n maxReconnectAttempts?: number;\n },\n protected readonly env: Static<typeof envSchema>,\n ) {}\n\n /**\n * Build WebSocket URL\n */\n protected buildUrl(): string {\n this.log.trace(\"Building WebSocket URL\", {\n hasCustomUrl: !!this.options.url,\n channelPath: this.channel.options.path,\n });\n\n if (this.options.url) {\n this.log.debug(\"Using custom WebSocket URL\", { url: this.options.url });\n return this.options.url;\n }\n\n // Auto-detect URL from current location (browser only)\n if (typeof window !== \"undefined\") {\n const protocol = window.location.protocol === \"https:\" ? \"wss:\" : \"ws:\";\n const host = window.location.host;\n const path = this.channel.options.path;\n // Send all room IDs as query params\n const roomIds = Array.from(this.subscriptions.keys());\n const roomParam =\n roomIds.length > 0 ? `?roomIds=${roomIds.join(\",\")}` : \"\";\n const url = `${protocol}//${host}${path}${roomParam}`;\n this.log.debug(\"Auto-detected WebSocket URL\", { url, roomIds });\n return url;\n }\n\n // Fallback to env URL\n const url = `${this.env.WEBSOCKET_URL}${this.channel.options.path}`;\n this.log.debug(\"Using env WebSocket URL\", { url });\n return url;\n }\n\n /**\n * Subscribe to a room on this channel\n */\n public subscribe(\n roomId: string,\n handler: (message: Static<TClient>) => void,\n callbacks?: {\n onConnect?: () => void;\n onDisconnect?: () => void;\n onError?: (error: Error) => void;\n },\n ): () => void {\n this.log.debug(\"Subscribing to room\", {\n roomId,\n channelPath: this.channel.options.path,\n existingSubscriptions: this.subscriptions.size,\n });\n\n // Add subscription\n this.subscriptions.set(roomId, handler);\n\n // Add callbacks\n if (callbacks?.onConnect) this.onConnectCallbacks.add(callbacks.onConnect);\n if (callbacks?.onDisconnect)\n this.onDisconnectCallbacks.add(callbacks.onDisconnect);\n if (callbacks?.onError) this.onErrorCallbacks.add(callbacks.onError);\n\n // Connect if not already connected\n if (!this.ws || this.ws.readyState !== WebSocket.OPEN) {\n this.log.trace(\"No active connection, initiating connect\");\n this.connect().catch((error) => {\n this.log.error(\"Failed to connect:\", error);\n });\n } else {\n this.log.trace(\"Already connected, reusing existing connection\");\n }\n\n // Return unsubscribe function\n return () => {\n this.log.debug(\"Unsubscribing from room\", { roomId });\n this.subscriptions.delete(roomId);\n if (callbacks?.onConnect)\n this.onConnectCallbacks.delete(callbacks.onConnect);\n if (callbacks?.onDisconnect)\n this.onDisconnectCallbacks.delete(callbacks.onDisconnect);\n if (callbacks?.onError) this.onErrorCallbacks.delete(callbacks.onError);\n\n // Disconnect if no more subscriptions\n if (this.subscriptions.size === 0) {\n this.log.debug(\"No more subscriptions, disconnecting\");\n this.disconnect();\n }\n };\n }\n\n /**\n * Connect to WebSocket server\n */\n protected async connect(): Promise<void> {\n if (this.ws?.readyState === WebSocket.OPEN) {\n this.log.trace(\"Already connected, skipping connect\");\n return;\n }\n\n this.isConnecting = true;\n this.isError = false;\n this.error = undefined;\n\n const url = this.buildUrl();\n this.log.info(\"Connecting to WebSocket server\", { url });\n\n return new Promise((resolve, reject) => {\n try {\n const ws = new WebSocket(url);\n this.ws = ws;\n\n ws.onopen = () => {\n this.isConnected = true;\n this.isConnecting = false;\n this.isError = false;\n this.error = undefined;\n this.reconnectAttempts = 0;\n\n this.log.info(\"WebSocket connected\", {\n channelPath: this.channel.options.path,\n rooms: Array.from(this.subscriptions.keys()),\n });\n\n // Flush queued messages\n if (this.messageQueue.length > 0) {\n this.log.debug(\"Flushing queued messages\", {\n count: this.messageQueue.length,\n });\n }\n while (this.messageQueue.length > 0) {\n const msg = this.messageQueue.shift();\n if (msg) {\n this.log.trace(\"Sending queued message\", { roomId: msg.roomId });\n ws.send(\n JSON.stringify({\n roomId: msg.roomId,\n message: msg.message,\n }),\n );\n }\n }\n\n // Call all connect callbacks\n for (const callback of this.onConnectCallbacks) {\n callback();\n }\n\n resolve();\n };\n\n ws.onmessage = (event) => {\n this.log.trace(\"Message received\", {\n dataLength: event.data?.length,\n });\n this.handleMessage(event.data);\n };\n\n ws.onclose = (event) => {\n this.isConnected = false;\n this.isConnecting = false;\n this.ws = undefined;\n\n this.log.info(\"WebSocket disconnected\", {\n code: event.code,\n reason: event.reason,\n wasClean: event.wasClean,\n });\n\n // Call all disconnect callbacks\n for (const callback of this.onDisconnectCallbacks) {\n callback();\n }\n\n // Attempt reconnection\n if (this.options.autoReconnect !== false) {\n this.scheduleReconnect();\n }\n };\n\n ws.onerror = () => {\n const err = new Error(\"WebSocket connection error\");\n this.isError = true;\n this.error = err;\n this.isConnecting = false;\n\n this.log.error(\"WebSocket error\", { url });\n\n // Call all error callbacks\n for (const callback of this.onErrorCallbacks) {\n callback(err);\n }\n\n reject(err);\n };\n } catch (err) {\n const error =\n err instanceof Error ? err : new Error(\"Connection failed\");\n this.isError = true;\n this.error = error;\n this.isConnecting = false;\n\n this.log.error(\"Failed to create WebSocket\", { error: error.message });\n\n // Call all error callbacks\n for (const callback of this.onErrorCallbacks) {\n callback(error);\n }\n\n reject(error);\n }\n });\n }\n\n /**\n * Handle incoming message\n */\n protected handleMessage(data: string): void {\n try {\n const parsed = JSON.parse(data);\n this.log.trace(\"Parsed incoming message\", { parsed });\n\n // Validate incoming message against schema\n const inSchema = this.channel.options.schema.in;\n this.alepha.codec.validate(inSchema, parsed);\n\n this.log.debug(\"Dispatching message to handlers\", {\n handlerCount: this.subscriptions.size,\n });\n\n // Extract roomId from message if present (server should send it back)\n // For now, broadcast to all subscribed rooms\n // TODO: Server should include roomId in response\n for (const handler of this.subscriptions.values()) {\n handler(parsed as Static<TClient>);\n }\n } catch (err) {\n this.log.error(\"Error handling message:\", err);\n }\n }\n\n /**\n * Send message to a specific room\n */\n public async send(roomId: string, message: Static<TServer>): Promise<void> {\n this.log.trace(\"Sending message\", { roomId, message });\n\n // Validate outgoing message against schema\n const outSchema = this.channel.options.schema.out;\n if (!Value.Check(outSchema, message)) {\n const errors = Array.from(Value.Errors(outSchema, message));\n this.log.warn(\"Message validation failed\", { errors });\n throw new Error(\n `Message validation failed: ${errors.map((e) => e.message).join(\", \")}`,\n );\n }\n\n if (!this.ws || this.ws.readyState !== WebSocket.OPEN) {\n // Queue message\n this.log.debug(\"Connection not ready, queuing message\", {\n roomId,\n queueSize: this.messageQueue.length + 1,\n });\n this.messageQueue.push({ roomId, message });\n return;\n }\n\n this.log.debug(\"Sending message to server\", { roomId });\n this.ws.send(\n JSON.stringify({\n roomId,\n message,\n }),\n );\n }\n\n /**\n * Schedule reconnection\n */\n protected scheduleReconnect(): void {\n const maxAttempts =\n this.options.maxReconnectAttempts ??\n this.env.WEBSOCKET_MAX_RECONNECT_ATTEMPTS ??\n 10;\n const reconnectInterval =\n this.options.reconnectInterval ??\n this.env.WEBSOCKET_RECONNECT_INTERVAL ??\n 3000;\n\n if (maxAttempts !== -1 && this.reconnectAttempts >= maxAttempts) {\n this.log.warn(\"Max reconnection attempts reached\", {\n attempts: this.reconnectAttempts,\n maxAttempts,\n });\n return;\n }\n\n this.reconnectAttempts++;\n\n this.log.debug(\"Scheduling reconnection\", {\n attempt: this.reconnectAttempts,\n maxAttempts,\n intervalMs: reconnectInterval,\n });\n\n this.reconnectTimer = window.setTimeout(() => {\n this.log.info(\"Reconnecting...\", {\n attempt: this.reconnectAttempts,\n maxAttempts,\n });\n this.connect().catch((error) => {\n this.log.error(\"Reconnection failed:\", error);\n });\n }, reconnectInterval);\n }\n\n /**\n * Disconnect from server\n */\n public disconnect(): void {\n this.log.debug(\"Disconnecting\", {\n hasTimer: !!this.reconnectTimer,\n hasConnection: !!this.ws,\n });\n\n if (this.reconnectTimer) {\n clearTimeout(this.reconnectTimer);\n this.reconnectTimer = undefined;\n }\n\n if (this.ws) {\n this.ws.close();\n this.ws = undefined;\n }\n\n this.isConnected = false;\n this.isConnecting = false;\n\n this.log.info(\"Disconnected\");\n }\n\n /**\n * Reconnect manually\n */\n public reconnect(): void {\n this.log.info(\"Manual reconnect requested\");\n this.disconnect();\n this.connect().catch((error) => {\n this.log.error(\"Manual reconnection failed:\", error);\n });\n }\n\n /**\n * Check if subscribed to a room\n */\n public hasRoom(roomId: string): boolean {\n return this.subscriptions.has(roomId);\n }\n\n /**\n * Get all subscribed rooms\n */\n public getRooms(): string[] {\n return Array.from(this.subscriptions.keys());\n }\n}\n\n/**\n * WebSocket Client Service\n *\n * Manages WebSocket connections from the client side (browser).\n * One connection per channel, multiple rooms per connection.\n */\nexport class WebSocketClient {\n protected readonly log = $logger();\n protected readonly alepha = $inject(Alepha);\n protected readonly env = $env(envSchema);\n\n // Map<channelPath, connection>\n protected connections = new Map<\n string,\n WebSocketChannelConnection<any, any>\n >();\n\n /**\n * Subscribe to a room on a channel\n */\n public subscribe<TClient extends TWSObject, TServer extends TWSObject>(\n roomId: string,\n channel: ChannelPrimitive<TClient, TServer>,\n handler: (message: Static<TClient>) => void,\n options: {\n url?: string;\n autoReconnect?: boolean;\n reconnectInterval?: number;\n maxReconnectAttempts?: number;\n onConnect?: () => void;\n onDisconnect?: () => void;\n onError?: (error: Error) => void;\n } = {},\n ): () => void {\n const channelPath = channel.options.path;\n\n this.log.debug(\"WebSocketClient.subscribe\", {\n roomId,\n channelPath,\n existingConnections: this.connections.size,\n });\n\n // Get or create connection for this channel\n let connection = this.connections.get(\n channelPath,\n ) as WebSocketChannelConnection<TClient, TServer>;\n\n if (!connection) {\n this.log.debug(\"Creating new connection for channel\", { channelPath });\n connection = this.alepha.inject(WebSocketChannelConnection, {\n lifetime: \"transient\",\n args: [\n channel,\n {\n url: options.url,\n autoReconnect: options.autoReconnect,\n reconnectInterval: options.reconnectInterval,\n maxReconnectAttempts: options.maxReconnectAttempts,\n },\n this.env,\n ],\n }) as WebSocketChannelConnection<any, any>;\n\n this.connections.set(channelPath, connection);\n } else {\n this.log.trace(\"Reusing existing connection for channel\", {\n channelPath,\n });\n }\n\n // Subscribe to the room on this connection\n const unsubscribe = connection.subscribe(roomId, handler, {\n onConnect: options.onConnect,\n onDisconnect: options.onDisconnect,\n onError: options.onError,\n });\n\n // Return unsubscribe function\n return () => {\n this.log.debug(\"WebSocketClient.unsubscribe\", { roomId, channelPath });\n unsubscribe();\n\n // Clean up connection if no more rooms\n if (connection.getRooms().length === 0) {\n this.log.debug(\"Removing connection for channel (no more rooms)\", {\n channelPath,\n });\n this.connections.delete(channelPath);\n }\n };\n }\n\n /**\n * Send message to a room on a channel\n */\n public async send<TClient extends TWSObject, TServer extends TWSObject>(\n roomId: string,\n channel: ChannelPrimitive<TClient, TServer>,\n message: Static<TServer>,\n ): Promise<void> {\n const channelPath = channel.options.path;\n\n this.log.trace(\"WebSocketClient.send\", { roomId, channelPath });\n\n const connection = this.connections.get(\n channelPath,\n ) as WebSocketChannelConnection<TClient, TServer>;\n\n if (!connection) {\n this.log.warn(\"Attempted to send on unsubscribed channel\", {\n channelPath,\n });\n throw new AlephaError(\n `Not subscribed to channel ${channelPath}. Subscribe first before sending messages.`,\n );\n }\n\n await connection.send(roomId, message);\n }\n\n /**\n * Get connection for a channel\n */\n public getConnection<TClient extends TWSObject, TServer extends TWSObject>(\n channel: ChannelPrimitive<TClient, TServer>,\n ): WebSocketChannelConnection<TClient, TServer> | undefined {\n const channelPath = channel.options.path;\n const connection = this.connections.get(channelPath) as\n | WebSocketChannelConnection<TClient, TServer>\n | undefined;\n\n this.log.trace(\"WebSocketClient.getConnection\", {\n channelPath,\n found: !!connection,\n });\n\n return connection;\n }\n\n /**\n * Disconnect all connections\n */\n public disconnectAll(): void {\n this.log.info(\"Disconnecting all connections\", {\n count: this.connections.size,\n });\n\n for (const connection of this.connections.values()) {\n connection.disconnect();\n }\n this.connections.clear();\n\n this.log.debug(\"All connections disconnected\");\n }\n}\n","/**\n * Base WebSocket error class\n */\nexport class WebSocketError extends Error {\n constructor(\n message: string,\n public readonly code?: number,\n ) {\n super(message);\n this.name = \"WebSocketError\";\n }\n}\n\n/**\n * Error thrown when WebSocket connection fails\n */\nexport class WebSocketConnectionError extends WebSocketError {\n constructor(message: string, code?: number) {\n super(message, code);\n this.name = \"WebSocketConnectionError\";\n }\n}\n\n/**\n * Error thrown when WebSocket message validation fails\n */\nexport class WebSocketValidationError extends WebSocketError {\n constructor(message: string) {\n super(message);\n this.name = \"WebSocketValidationError\";\n }\n}\n","import type { Static } from \"alepha\";\nimport type { ChannelPrimitive, TWSObject } from \"../primitives/$channel.ts\";\n\n/**\n * WebSocket connection interface\n */\nexport interface WebSocketConnection {\n /**\n * Unique connection ID\n */\n id: string;\n\n /**\n * User ID (if authenticated and security module is used)\n */\n userId?: string;\n\n /**\n * Room IDs that this connection is currently in\n */\n roomIds: string[];\n\n /**\n * Send a message to this connection\n */\n send(message: any): Promise<void>;\n\n /**\n * Close this connection\n */\n close(code?: number, reason?: string): Promise<void>;\n\n /**\n * Connection metadata (custom data)\n */\n metadata?: Record<string, any>;\n\n /**\n * Connection state\n */\n readyState: WebSocketState;\n}\n\n/**\n * WebSocket state enum\n */\nexport enum WebSocketState {\n CONNECTING = 0,\n OPEN = 1,\n CLOSING = 2,\n CLOSED = 3,\n}\n\n/**\n * WebSocket endpoint configuration (server-side)\n */\nexport interface WebSocketPrimitiveOptions<\n TClient extends TWSObject,\n TServer extends TWSObject,\n> {\n /**\n * Channel definition with schema and path\n */\n channel: ChannelPrimitive<TClient, TServer>;\n\n /**\n * Handler for incoming messages from clients\n */\n handler: WebSocketHandler<TClient, TServer>;\n\n /**\n * Optional connection handler (called when a client connects)\n */\n onConnect?: (params: {\n /**\n * Unique connection ID of the client\n */\n connectionId: string;\n\n /**\n * User ID of the connected client (if authenticated and security module is used)\n */\n userId?: string;\n\n /**\n * Room IDs that the client is connecting to\n */\n roomIds: string[];\n }) => Promise<void> | void;\n\n /**\n * Optional disconnection handler (called when a client disconnects)\n */\n onDisconnect?: (params: {\n /**\n * Unique connection ID of the client\n */\n connectionId: string;\n\n /**\n * User ID of the connected client (if authenticated and security module is used)\n */\n userId?: string;\n\n /**\n * Room IDs that the client was connected to\n */\n roomIds: string[];\n }) => Promise<void> | void;\n\n /**\n * Change WebSocket server provider (for custom implementations)\n */\n provider?: any;\n\n /**\n * Whether to enforce security (authentication, authorization) on this WebSocket endpoint\n * Requires alepha/security integration\n */\n secure?: boolean;\n\n /**\n * Limit number of connections per user (if authenticated)\n */\n maxConnectionsPerUser?: number;\n}\n\n/**\n * WebSocket message handler\n */\nexport type WebSocketHandler<\n TClient extends TWSObject,\n TServer extends TWSObject,\n> = (\n context: WebSocketHandlerContext<TClient, TServer>,\n) => Promise<void> | void;\n\n/**\n * WebSocket handler context\n */\nexport interface WebSocketHandlerContext<\n TClient extends TWSObject,\n TServer extends TWSObject,\n> {\n /**\n * Unique connection ID of the client\n */\n connectionId: string;\n\n /**\n * User ID of the connected client (if authenticated and security module is used)\n */\n userId?: string;\n\n /**\n * Room ID that the client sent the message from\n */\n roomId: string;\n\n /**\n * The parsed and validated message from the client\n */\n message: Static<TServer>;\n\n /**\n * Reply function tailored to current context (connectionId, roomId)\n */\n reply: (options: {\n /**\n * Message to send\n */\n message: Static<TClient>;\n\n /**\n * Optional: specify room ID to send to (defaults to sender's room ID)\n */\n roomId?: string;\n\n /**\n * Optional: exclude the sender connection from receiving the message\n * Will populate exceptConnectionIds with sender connection ID behind the scenes\n */\n exceptSelf?: boolean;\n\n /**\n * Optional: exclude specific connection IDs from receiving the message\n */\n exceptConnectionIds?: string[];\n\n /**\n * Optional: exclude specific user IDs from receiving the message\n * Requires alepha/security integration\n */\n exceptUserIds?: string[];\n }) => Promise<void>;\n}\n\n/**\n * Emit options for sending messages from the server\n */\nexport interface EmitOptions<TClient extends TWSObject> {\n /**\n * Message to send to clients\n */\n message: Static<TClient>;\n\n /**\n * Room ID to send the message to\n */\n roomId?: string;\n\n /**\n * Room IDs to send the message to\n */\n roomIds?: string[];\n\n /**\n * User ID to send the message to (if authenticated)\n */\n userId?: string;\n\n /**\n * User IDs to send the message to (if authenticated)\n */\n userIds?: string[];\n\n /**\n * Connection ID to send the message to\n */\n connectionId?: string;\n\n /**\n * Connection IDs to send the message to\n */\n connectionIds?: string[];\n\n /**\n * Optional: exclude specific connection IDs from receiving the message\n */\n exceptConnectionIds?: string[];\n\n /**\n * Optional: exclude specific user IDs from receiving the message\n * Requires alepha/security integration\n */\n exceptUserIds?: string[];\n}\n","import { $logger } from \"alepha/logger\";\n\n/**\n * Manages WebSocket room memberships\n *\n * Rooms are logical groupings of connections. A connection can be in multiple rooms,\n * and messages can be targeted to specific rooms.\n */\nexport class RoomManager {\n protected readonly log = $logger();\n\n /**\n * Maps roomId → Set<connectionId>\n */\n protected readonly rooms = new Map<string, Set<string>>();\n\n /**\n * Maps connectionId → Set<roomId>\n * Inverse index for fast lookup of connection's rooms\n */\n protected readonly connectionRooms = new Map<string, Set<string>>();\n\n /**\n * Join a connection to one or more rooms\n */\n public joinRooms(connectionId: string, roomIds: string[]): void {\n for (const roomId of roomIds) {\n this.joinRoom(connectionId, roomId);\n }\n }\n\n /**\n * Join a connection to a room\n */\n public joinRoom(connectionId: string, roomId: string): void {\n // Add to room\n let room = this.rooms.get(roomId);\n if (!room) {\n room = new Set();\n this.rooms.set(roomId, room);\n }\n room.add(connectionId);\n\n // Update inverse index\n let connRooms = this.connectionRooms.get(connectionId);\n if (!connRooms) {\n connRooms = new Set();\n this.connectionRooms.set(connectionId, connRooms);\n }\n connRooms.add(roomId);\n\n this.log.debug(`Connection ${connectionId} joined room ${roomId}`);\n }\n\n /**\n * Leave a connection from a room\n */\n public leaveRoom(connectionId: string, roomId: string): void {\n // Remove from room\n const room = this.rooms.get(roomId);\n if (room) {\n room.delete(connectionId);\n if (room.size === 0) {\n this.rooms.delete(roomId);\n }\n }\n\n // Update inverse index\n const connRooms = this.connectionRooms.get(connectionId);\n if (connRooms) {\n connRooms.delete(roomId);\n if (connRooms.size === 0) {\n this.connectionRooms.delete(connectionId);\n }\n }\n\n this.log.debug(`Connection ${connectionId} left room ${roomId}`);\n }\n\n /**\n * Remove a connection from all rooms\n */\n public leaveAllRooms(connectionId: string): void {\n const connRooms = this.connectionRooms.get(connectionId);\n if (!connRooms) {\n return;\n }\n\n for (const roomId of connRooms) {\n const room = this.rooms.get(roomId);\n if (room) {\n room.delete(connectionId);\n if (room.size === 0) {\n this.rooms.delete(roomId);\n }\n }\n }\n\n this.connectionRooms.delete(connectionId);\n this.log.debug(`Connection ${connectionId} left all rooms`);\n }\n\n /**\n * Get all connection IDs in a room\n */\n public getRoomConnections(roomId: string): string[] {\n const room = this.rooms.get(roomId);\n return room ? Array.from(room) : [];\n }\n\n /**\n * Get all room IDs for a connection\n */\n public getConnectionRooms(connectionId: string): string[] {\n const connRooms = this.connectionRooms.get(connectionId);\n return connRooms ? Array.from(connRooms) : [];\n }\n\n /**\n * Check if a connection is in a room\n */\n public isInRoom(connectionId: string, roomId: string): boolean {\n const connRooms = this.connectionRooms.get(connectionId);\n return connRooms ? connRooms.has(roomId) : false;\n }\n\n /**\n * Get all active rooms\n */\n public getAllRooms(): string[] {\n return Array.from(this.rooms.keys());\n }\n\n /**\n * Get total number of connections across all rooms\n */\n public getTotalConnections(): number {\n return this.connectionRooms.size;\n }\n\n /**\n * Get room statistics\n */\n public getStats(): {\n totalRooms: number;\n totalConnections: number;\n roomSizes: Map<string, number>;\n } {\n const roomSizes = new Map<string, number>();\n for (const [roomId, connections] of this.rooms) {\n roomSizes.set(roomId, connections.size);\n }\n\n return {\n totalRooms: this.rooms.size,\n totalConnections: this.connectionRooms.size,\n roomSizes,\n };\n }\n}\n","import { type Static, t } from \"alepha\";\nimport { $logger } from \"alepha/logger\";\nimport { $topic } from \"alepha/topic\";\n\n/**\n * WebSocket message distribution event\n */\nconst webSocketMessageSchema = {\n payload: t.object({\n /**\n * Channel path (e.g., \"/ws/chat\")\n */\n channelPath: t.text(),\n\n /**\n * Target room ID(s)\n */\n roomIds: t.optional(t.array(t.text())),\n\n /**\n * Target user ID(s)\n */\n userIds: t.optional(t.array(t.text())),\n\n /**\n * Target connection ID(s)\n */\n connectionIds: t.optional(t.array(t.text())),\n\n /**\n * Exclude connection ID(s) from receiving the message\n */\n exceptConnectionIds: t.optional(t.array(t.text())),\n\n /**\n * Exclude user ID(s) from receiving the message\n */\n exceptUserIds: t.optional(t.array(t.text())),\n\n /**\n * The message payload to send\n */\n message: t.any(),\n }),\n};\n\n/**\n * WebSocket Topic Service\n *\n * Manages pub/sub messaging for WebSocket connections across multiple server instances.\n * Uses alepha/topic for cross-instance message distribution, enabling horizontal scaling.\n *\n * When a WebSocket message needs to be sent:\n * 1. Server instance A publishes to the topic\n * 2. All server instances (A, B, C, etc.) receive the message\n * 3. Each instance sends to its local connections that match the criteria\n *\n * This enables:\n * - Multiple server instances handling WebSocket connections\n * - Redis-backed message distribution (with alepha/topic/redis)\n * - Horizontal scaling without losing messages\n */\nexport class WebSocketTopicService {\n protected readonly log = $logger();\n\n /**\n * Handler function to be called when a message is received from the topic\n * This is set by the WebSocket provider during initialization\n */\n public messageHandler?: (\n event: Static<(typeof webSocketMessageSchema)[\"payload\"]>,\n ) => Promise<void>;\n\n /**\n * Topic for distributing WebSocket messages across server instances\n */\n public readonly topic = $topic({\n name: \"websocket:broadcast\",\n description:\n \"Distributes WebSocket messages across server instances for horizontal scaling\",\n schema: webSocketMessageSchema,\n handler: async (message) => {\n if (this.messageHandler) {\n await this.messageHandler(message.payload);\n }\n },\n });\n\n /**\n * Publish a message to be distributed across all server instances\n */\n public async publish(\n event: Static<(typeof webSocketMessageSchema)[\"payload\"]>,\n ): Promise<void> {\n await this.topic.publish(event);\n }\n\n /**\n * Set the handler for incoming messages\n */\n public setMessageHandler(\n handler: (\n event: Static<(typeof webSocketMessageSchema)[\"payload\"]>,\n ) => Promise<void>,\n ): void {\n this.messageHandler = handler;\n }\n}\n","import { $module, type Alepha } from \"alepha\";\nimport { AlephaTopic } from \"alepha/topic\";\nimport { $channel } from \"./primitives/$channel.ts\";\nimport { $websocket } from \"./primitives/$websocket.ts\";\nimport { WebSocketClient } from \"./services/WebSocketClient.ts\";\n\n/**\n * alepha/websocket (Browser)\n *\n * Browser-side WebSocket client module. Provides WebSocketClient service\n * for managing WebSocket connections from the browser.\n *\n * For React applications, use alepha/react/websocket with the useRoom hook.\n */\nexport * from \"./index.shared.ts\";\n\nexport const AlephaWebSocket = $module({\n name: \"alepha.websocket\",\n primitives: [$channel, $websocket],\n services: [WebSocketClient],\n register: (alepha: Alepha) => {\n alepha.with(AlephaTopic);\n alepha.with(WebSocketClient);\n },\n});\n"],"mappings":"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"}
1
+ {"version":3,"file":"index.browser.js","names":[],"sources":["../../src/websocket/primitives/$channel.ts","../../src/websocket/providers/WebSocketServerProvider.ts","../../src/websocket/primitives/$websocket.ts","../../src/websocket/services/WebSocketClient.ts","../../src/websocket/errors/WebSocketError.ts","../../src/websocket/interfaces/WebSocketInterfaces.ts","../../src/websocket/services/RoomManager.ts","../../src/websocket/services/WebSocketTopicService.ts","../../src/websocket/index.browser.ts"],"sourcesContent":["import {\n createPrimitive,\n KIND,\n Primitive,\n type TObject,\n type TString,\n type TUnion,\n} from \"alepha\";\n\nexport type TWSObject = TObject | TUnion;\n\n/**\n * Channel primitive options\n */\nexport interface ChannelPrimitiveOptions<\n TClient extends TWSObject,\n TServer extends TWSObject,\n> {\n /**\n * WebSocket endpoint path (e.g., \"/ws/chat\")\n */\n path: string;\n\n /**\n * Optional description for documentation\n */\n description?: string;\n\n /**\n * Message schemas for bidirectional communication\n */\n schema: {\n /**\n * Optional room ID schema validation\n * Default: t.text() (any string)\n * Can be enforced at application level: t.uuid(), t.regex(/^[a-f0-9\\-]{36}$/)\n */\n roomId?: TString;\n\n /**\n * Messages from server to client\n * This is what clients will receive\n */\n in: TClient;\n\n /**\n * Messages from client to server\n * This is what the server will receive\n */\n out: TServer;\n };\n}\n\n/**\n * Defines a WebSocket channel with specified client and server message schemas.\n *\n * Channels must be defined as class properties to be registered in the Alepha context.\n * They define the \"vocabulary\" for communication - the schema for messages flowing\n * in both directions (server→client and client→server).\n *\n * @example Server-side with $websocket\n * ```typescript\n * class ChatController {\n * // Channel must be defined inside a class\n * chatChannel = $channel({\n * path: \"/ws/chat\",\n * description: \"Real-time chat channel\",\n * schema: {\n * // Server → Client messages\n * in: t.union([\n * t.object({\n * type: t.const(\"append\"),\n * content: t.text(),\n * username: t.text()\n * }),\n * t.object({\n * type: t.const(\"system\"),\n * message: t.text()\n * })\n * ]),\n * // Client → Server messages\n * out: t.object({\n * content: t.text()\n * })\n * }\n * });\n *\n * chat = $websocket({\n * channel: this.chatChannel,\n * handler: async ({ message, reply }) => {\n * await reply({\n * message: { type: \"append\", content: message.content, username: \"user\" }\n * });\n * }\n * });\n * }\n * ```\n *\n * @example Browser-side with useRoom\n * ```typescript\n * // Define channel in a class for browser context\n * class ChatClient {\n * chatChannel = $channel({\n * path: \"/ws/chat\",\n * schema: { in: inSchema, out: outSchema }\n * });\n * }\n *\n * // Use in React component\n * function Chat() {\n * const client = useInject(ChatClient);\n * const chat = useRoom({ roomId: \"lobby\", channel: client.chatChannel, handler: ... }, []);\n * }\n * ```\n */\nexport const $channel = <TClient extends TWSObject, TServer extends TWSObject>(\n options: ChannelPrimitiveOptions<TClient, TServer>,\n): ChannelPrimitive<TClient, TServer> => {\n return createPrimitive(ChannelPrimitive<TClient, TServer>, options);\n};\n\n// ---------------------------------------------------------------------------------------------------------------------\n\nexport class ChannelPrimitive<\n TClient extends TWSObject,\n TServer extends TWSObject,\n> extends Primitive<ChannelPrimitiveOptions<TClient, TServer>> {\n // Channels are just schema definitions - no initialization logic needed\n}\n\n$channel[KIND] = ChannelPrimitive;\n","import type {\n EmitOptions,\n WebSocketConnection,\n WebSocketPrimitiveOptions,\n} from \"../interfaces/WebSocketInterfaces.ts\";\nimport type { TWSObject } from \"../primitives/$channel.ts\";\n\n/**\n * Abstract WebSocket server provider\n *\n * This class provides the base interface that must be implemented by\n * platform-specific providers (Node.js, Browser, etc.)\n */\nexport abstract class WebSocketServerProvider {\n /**\n * Register a WebSocket endpoint with its channel configuration\n */\n abstract registerEndpoint<\n TClient extends TWSObject,\n TServer extends TWSObject,\n >(config: WebSocketPrimitiveOptions<TClient, TServer>): void;\n\n /**\n * Emit a message to clients based on targeting criteria\n *\n * This method distributes messages across all server instances via pub/sub.\n */\n abstract emit<TClient extends TWSObject>(\n channelPath: string,\n options: EmitOptions<TClient>,\n ): Promise<void>;\n\n /**\n * Get all active connections (local to this server instance)\n */\n abstract getConnections(): WebSocketConnection[];\n\n /**\n * Get connections in a specific room (local to this server instance)\n */\n abstract getRoomConnections(roomId: string): WebSocketConnection[];\n\n /**\n * Get connections for a specific user (local to this server instance)\n */\n abstract getUserConnections(userId: string): WebSocketConnection[];\n\n /**\n * Close a specific connection\n */\n abstract closeConnection(\n connectionId: string,\n code?: number,\n reason?: string,\n ): Promise<void>;\n}\n","import { $inject, createPrimitive, KIND, Primitive } from \"alepha\";\nimport type {\n EmitOptions,\n WebSocketPrimitiveOptions,\n} from \"../interfaces/WebSocketInterfaces.ts\";\nimport { WebSocketServerProvider } from \"../providers/WebSocketServerProvider.ts\";\nimport type { TWSObject } from \"./$channel.ts\";\n\n/**\n * Defines a WebSocket server endpoint for a specific channel.\n *\n * Server-side only. Creates a WebSocket endpoint that:\n * - Accepts connections from clients\n * - Validates incoming messages against the channel schema\n * - Provides room-based messaging\n * - Integrates with alepha/security for authentication (optional)\n * - Supports horizontal scaling via alepha/topic\n *\n * @example\n * ```typescript\n * class ChatController {\n * chat = $websocket({\n * channel: chatChannel,\n * handler: async ({ connectionId, userId, roomId, message, reply }) => {\n * // Broadcast to all in room except sender\n * await reply({\n * message: {\n * type: \"append\",\n * username: userId,\n * content: message.content\n * },\n * exceptSelf: true\n * });\n * }\n * });\n *\n * async broadcastAnnouncement(roomId: string, text: string) {\n * await this.chat.emit({\n * roomId,\n * message: {\n * type: \"append\",\n * username: \"System\",\n * content: text\n * }\n * });\n * }\n * }\n * ```\n */\nexport const $websocket = <\n TClient extends TWSObject,\n TServer extends TWSObject,\n>(\n options: WebSocketPrimitiveOptions<TClient, TServer>,\n): WebSocketPrimitive<TClient, TServer> => {\n return createPrimitive(WebSocketPrimitive<TClient, TServer>, options);\n};\n\n// ---------------------------------------------------------------------------------------------------------------------\n\nexport class WebSocketPrimitive<\n TClient extends TWSObject,\n TServer extends TWSObject,\n> extends Primitive<WebSocketPrimitiveOptions<TClient, TServer>> {\n protected readonly webSocketServerProvider = $inject(WebSocketServerProvider);\n\n protected onInit() {\n this.webSocketServerProvider.registerEndpoint(this.options);\n }\n\n /**\n * Emit message to clients\n *\n * Send messages from the server to connected clients based on targeting criteria.\n * Messages are distributed across all server instances via pub/sub.\n *\n * @example\n * ```typescript\n * // Send to specific room\n * await websocket.emit({\n * roomId: \"room-123\",\n * message: { type: \"update\", data: {...} }\n * });\n *\n * // Send to specific user (all their connections)\n * await websocket.emit({\n * userId: \"user-456\",\n * message: { type: \"notification\", text: \"Hello!\" }\n * });\n *\n * // Send to multiple rooms, except certain users\n * await websocket.emit({\n * roomIds: [\"room-1\", \"room-2\"],\n * exceptUserIds: [\"user-123\"],\n * message: { type: \"broadcast\", content: \"System announcement\" }\n * });\n * ```\n */\n public async emit(options: EmitOptions<TClient>): Promise<void> {\n await this.webSocketServerProvider.emit(\n this.options.channel.options.path,\n options,\n );\n }\n}\n\n$websocket[KIND] = WebSocketPrimitive;\n","import {\n $env,\n $inject,\n Alepha,\n AlephaError,\n type Static,\n t,\n Value,\n} from \"alepha\";\nimport { $logger } from \"alepha/logger\";\nimport type { ChannelPrimitive, TWSObject } from \"../primitives/$channel.ts\";\n\nconst envSchema = t.object({\n WEBSOCKET_URL: t.text({\n default: \"\",\n description:\n \"WebSocket server URL (e.g., ws://localhost:3001). Leave empty to auto-detect.\",\n }),\n WEBSOCKET_RECONNECT_INTERVAL: t.integer({\n default: 3000,\n description: \"Reconnection interval in milliseconds\",\n }),\n WEBSOCKET_MAX_RECONNECT_ATTEMPTS: t.integer({\n default: 10,\n description:\n \"Maximum number of reconnection attempts. Set to -1 for infinite.\",\n }),\n});\n\ndeclare module \"alepha\" {\n interface Env extends Partial<Static<typeof envSchema>> {}\n}\n\n/**\n * Room subscription\n */\ninterface RoomSubscription<TClient extends TWSObject> {\n roomId: string;\n handler: (message: Static<TClient>) => void;\n}\n\n/**\n * WebSocket channel connection\n *\n * Manages a single WebSocket connection to a channel with multiple room subscriptions.\n * One connection can handle multiple rooms on the same channel.\n */\nexport class WebSocketChannelConnection<\n TClient extends TWSObject,\n TServer extends TWSObject,\n> {\n protected readonly alepha = $inject(Alepha);\n protected readonly log = $logger();\n protected ws?: WebSocket;\n protected reconnectAttempts = 0;\n protected reconnectTimer?: number;\n protected messageQueue: Array<{ roomId: string; message: Static<TServer> }> =\n [];\n\n // Room subscriptions: Map<roomId, handler>\n protected subscriptions = new Map<\n string,\n (message: Static<TClient>) => void\n >();\n\n // Connection state\n public isConnected = false;\n public isConnecting = false;\n public isError = false;\n public error?: Error;\n\n // Connection callbacks\n protected onConnectCallbacks = new Set<() => void>();\n protected onDisconnectCallbacks = new Set<() => void>();\n protected onErrorCallbacks = new Set<(error: Error) => void>();\n\n constructor(\n protected readonly channel: ChannelPrimitive<TClient, TServer>,\n protected readonly options: {\n url?: string;\n autoReconnect?: boolean;\n reconnectInterval?: number;\n maxReconnectAttempts?: number;\n },\n protected readonly env: Static<typeof envSchema>,\n ) {}\n\n /**\n * Build WebSocket URL\n */\n protected buildUrl(): string {\n this.log.trace(\"Building WebSocket URL\", {\n hasCustomUrl: !!this.options.url,\n channelPath: this.channel.options.path,\n });\n\n if (this.options.url) {\n this.log.debug(\"Using custom WebSocket URL\", { url: this.options.url });\n return this.options.url;\n }\n\n // Auto-detect URL from current location (browser only)\n if (typeof window !== \"undefined\") {\n const protocol = window.location.protocol === \"https:\" ? \"wss:\" : \"ws:\";\n const host = window.location.host;\n const path = this.channel.options.path;\n // Send all room IDs as query params\n const roomIds = Array.from(this.subscriptions.keys());\n const roomParam =\n roomIds.length > 0 ? `?roomIds=${roomIds.join(\",\")}` : \"\";\n const url = `${protocol}//${host}${path}${roomParam}`;\n this.log.debug(\"Auto-detected WebSocket URL\", { url, roomIds });\n return url;\n }\n\n // Fallback to env URL\n const url = `${this.env.WEBSOCKET_URL}${this.channel.options.path}`;\n this.log.debug(\"Using env WebSocket URL\", { url });\n return url;\n }\n\n /**\n * Subscribe to a room on this channel\n */\n public subscribe(\n roomId: string,\n handler: (message: Static<TClient>) => void,\n callbacks?: {\n onConnect?: () => void;\n onDisconnect?: () => void;\n onError?: (error: Error) => void;\n },\n ): () => void {\n this.log.debug(\"Subscribing to room\", {\n roomId,\n channelPath: this.channel.options.path,\n existingSubscriptions: this.subscriptions.size,\n });\n\n // Add subscription\n this.subscriptions.set(roomId, handler);\n\n // Add callbacks\n if (callbacks?.onConnect) this.onConnectCallbacks.add(callbacks.onConnect);\n if (callbacks?.onDisconnect)\n this.onDisconnectCallbacks.add(callbacks.onDisconnect);\n if (callbacks?.onError) this.onErrorCallbacks.add(callbacks.onError);\n\n // Connect if not already connected\n if (!this.ws || this.ws.readyState !== WebSocket.OPEN) {\n this.log.trace(\"No active connection, initiating connect\");\n this.connect().catch((error) => {\n this.log.error(\"Failed to connect:\", error);\n });\n } else {\n this.log.trace(\"Already connected, reusing existing connection\");\n }\n\n // Return unsubscribe function\n return () => {\n this.log.debug(\"Unsubscribing from room\", { roomId });\n this.subscriptions.delete(roomId);\n if (callbacks?.onConnect)\n this.onConnectCallbacks.delete(callbacks.onConnect);\n if (callbacks?.onDisconnect)\n this.onDisconnectCallbacks.delete(callbacks.onDisconnect);\n if (callbacks?.onError) this.onErrorCallbacks.delete(callbacks.onError);\n\n // Disconnect if no more subscriptions\n if (this.subscriptions.size === 0) {\n this.log.debug(\"No more subscriptions, disconnecting\");\n this.disconnect();\n }\n };\n }\n\n /**\n * Connect to WebSocket server\n */\n protected async connect(): Promise<void> {\n if (this.ws?.readyState === WebSocket.OPEN) {\n this.log.trace(\"Already connected, skipping connect\");\n return;\n }\n\n this.isConnecting = true;\n this.isError = false;\n this.error = undefined;\n\n const url = this.buildUrl();\n this.log.info(\"Connecting to WebSocket server\", { url });\n\n return new Promise((resolve, reject) => {\n try {\n const ws = new WebSocket(url);\n this.ws = ws;\n\n ws.onopen = () => {\n this.isConnected = true;\n this.isConnecting = false;\n this.isError = false;\n this.error = undefined;\n this.reconnectAttempts = 0;\n\n this.log.info(\"WebSocket connected\", {\n channelPath: this.channel.options.path,\n rooms: Array.from(this.subscriptions.keys()),\n });\n\n // Flush queued messages\n if (this.messageQueue.length > 0) {\n this.log.debug(\"Flushing queued messages\", {\n count: this.messageQueue.length,\n });\n }\n while (this.messageQueue.length > 0) {\n const msg = this.messageQueue.shift();\n if (msg) {\n this.log.trace(\"Sending queued message\", { roomId: msg.roomId });\n ws.send(\n JSON.stringify({\n roomId: msg.roomId,\n message: msg.message,\n }),\n );\n }\n }\n\n // Call all connect callbacks\n for (const callback of this.onConnectCallbacks) {\n callback();\n }\n\n resolve();\n };\n\n ws.onmessage = (event) => {\n this.log.trace(\"Message received\", {\n dataLength: event.data?.length,\n });\n this.handleMessage(event.data);\n };\n\n ws.onclose = (event) => {\n this.isConnected = false;\n this.isConnecting = false;\n this.ws = undefined;\n\n this.log.info(\"WebSocket disconnected\", {\n code: event.code,\n reason: event.reason,\n wasClean: event.wasClean,\n });\n\n // Call all disconnect callbacks\n for (const callback of this.onDisconnectCallbacks) {\n callback();\n }\n\n // Attempt reconnection\n if (this.options.autoReconnect !== false) {\n this.scheduleReconnect();\n }\n };\n\n ws.onerror = () => {\n const err = new Error(\"WebSocket connection error\");\n this.isError = true;\n this.error = err;\n this.isConnecting = false;\n\n this.log.error(\"WebSocket error\", { url });\n\n // Call all error callbacks\n for (const callback of this.onErrorCallbacks) {\n callback(err);\n }\n\n reject(err);\n };\n } catch (err) {\n const error =\n err instanceof Error ? err : new Error(\"Connection failed\");\n this.isError = true;\n this.error = error;\n this.isConnecting = false;\n\n this.log.error(\"Failed to create WebSocket\", { error: error.message });\n\n // Call all error callbacks\n for (const callback of this.onErrorCallbacks) {\n callback(error);\n }\n\n reject(error);\n }\n });\n }\n\n /**\n * Handle incoming message\n */\n protected handleMessage(data: string): void {\n try {\n const parsed = JSON.parse(data);\n this.log.trace(\"Parsed incoming message\", { parsed });\n\n // Validate incoming message against schema\n const inSchema = this.channel.options.schema.in;\n this.alepha.codec.validate(inSchema, parsed);\n\n this.log.debug(\"Dispatching message to handlers\", {\n handlerCount: this.subscriptions.size,\n });\n\n // Extract roomId from message if present (server should send it back)\n // For now, broadcast to all subscribed rooms\n // TODO: Server should include roomId in response\n for (const handler of this.subscriptions.values()) {\n handler(parsed as Static<TClient>);\n }\n } catch (err) {\n this.log.error(\"Error handling message:\", err);\n }\n }\n\n /**\n * Send message to a specific room\n */\n public async send(roomId: string, message: Static<TServer>): Promise<void> {\n this.log.trace(\"Sending message\", { roomId, message });\n\n // Validate outgoing message against schema\n const outSchema = this.channel.options.schema.out;\n if (!Value.Check(outSchema, message)) {\n const errors = Array.from(Value.Errors(outSchema, message));\n this.log.warn(\"Message validation failed\", { errors });\n throw new Error(\n `Message validation failed: ${errors.map((e) => e.message).join(\", \")}`,\n );\n }\n\n if (!this.ws || this.ws.readyState !== WebSocket.OPEN) {\n // Queue message\n this.log.debug(\"Connection not ready, queuing message\", {\n roomId,\n queueSize: this.messageQueue.length + 1,\n });\n this.messageQueue.push({ roomId, message });\n return;\n }\n\n this.log.debug(\"Sending message to server\", { roomId });\n this.ws.send(\n JSON.stringify({\n roomId,\n message,\n }),\n );\n }\n\n /**\n * Schedule reconnection\n */\n protected scheduleReconnect(): void {\n const maxAttempts =\n this.options.maxReconnectAttempts ??\n this.env.WEBSOCKET_MAX_RECONNECT_ATTEMPTS ??\n 10;\n const reconnectInterval =\n this.options.reconnectInterval ??\n this.env.WEBSOCKET_RECONNECT_INTERVAL ??\n 3000;\n\n if (maxAttempts !== -1 && this.reconnectAttempts >= maxAttempts) {\n this.log.warn(\"Max reconnection attempts reached\", {\n attempts: this.reconnectAttempts,\n maxAttempts,\n });\n return;\n }\n\n this.reconnectAttempts++;\n\n this.log.debug(\"Scheduling reconnection\", {\n attempt: this.reconnectAttempts,\n maxAttempts,\n intervalMs: reconnectInterval,\n });\n\n this.reconnectTimer = window.setTimeout(() => {\n this.log.info(\"Reconnecting...\", {\n attempt: this.reconnectAttempts,\n maxAttempts,\n });\n this.connect().catch((error) => {\n this.log.error(\"Reconnection failed:\", error);\n });\n }, reconnectInterval);\n }\n\n /**\n * Disconnect from server\n */\n public disconnect(): void {\n this.log.debug(\"Disconnecting\", {\n hasTimer: !!this.reconnectTimer,\n hasConnection: !!this.ws,\n });\n\n if (this.reconnectTimer) {\n clearTimeout(this.reconnectTimer);\n this.reconnectTimer = undefined;\n }\n\n if (this.ws) {\n this.ws.close();\n this.ws = undefined;\n }\n\n this.isConnected = false;\n this.isConnecting = false;\n\n this.log.info(\"Disconnected\");\n }\n\n /**\n * Reconnect manually\n */\n public reconnect(): void {\n this.log.info(\"Manual reconnect requested\");\n this.disconnect();\n this.connect().catch((error) => {\n this.log.error(\"Manual reconnection failed:\", error);\n });\n }\n\n /**\n * Check if subscribed to a room\n */\n public hasRoom(roomId: string): boolean {\n return this.subscriptions.has(roomId);\n }\n\n /**\n * Get all subscribed rooms\n */\n public getRooms(): string[] {\n return Array.from(this.subscriptions.keys());\n }\n}\n\n/**\n * WebSocket Client Service\n *\n * Manages WebSocket connections from the client side (browser).\n * One connection per channel, multiple rooms per connection.\n */\nexport class WebSocketClient {\n protected readonly log = $logger();\n protected readonly alepha = $inject(Alepha);\n protected readonly env = $env(envSchema);\n\n // Map<channelPath, connection>\n protected connections = new Map<\n string,\n WebSocketChannelConnection<any, any>\n >();\n\n /**\n * Subscribe to a room on a channel\n */\n public subscribe<TClient extends TWSObject, TServer extends TWSObject>(\n roomId: string,\n channel: ChannelPrimitive<TClient, TServer>,\n handler: (message: Static<TClient>) => void,\n options: {\n url?: string;\n autoReconnect?: boolean;\n reconnectInterval?: number;\n maxReconnectAttempts?: number;\n onConnect?: () => void;\n onDisconnect?: () => void;\n onError?: (error: Error) => void;\n } = {},\n ): () => void {\n const channelPath = channel.options.path;\n\n this.log.debug(\"WebSocketClient.subscribe\", {\n roomId,\n channelPath,\n existingConnections: this.connections.size,\n });\n\n // Get or create connection for this channel\n let connection = this.connections.get(\n channelPath,\n ) as WebSocketChannelConnection<TClient, TServer>;\n\n if (!connection) {\n this.log.debug(\"Creating new connection for channel\", { channelPath });\n connection = this.alepha.inject(WebSocketChannelConnection, {\n lifetime: \"transient\",\n args: [\n channel,\n {\n url: options.url,\n autoReconnect: options.autoReconnect,\n reconnectInterval: options.reconnectInterval,\n maxReconnectAttempts: options.maxReconnectAttempts,\n },\n this.env,\n ],\n }) as WebSocketChannelConnection<any, any>;\n\n this.connections.set(channelPath, connection);\n } else {\n this.log.trace(\"Reusing existing connection for channel\", {\n channelPath,\n });\n }\n\n // Subscribe to the room on this connection\n const unsubscribe = connection.subscribe(roomId, handler, {\n onConnect: options.onConnect,\n onDisconnect: options.onDisconnect,\n onError: options.onError,\n });\n\n // Return unsubscribe function\n return () => {\n this.log.debug(\"WebSocketClient.unsubscribe\", { roomId, channelPath });\n unsubscribe();\n\n // Clean up connection if no more rooms\n if (connection.getRooms().length === 0) {\n this.log.debug(\"Removing connection for channel (no more rooms)\", {\n channelPath,\n });\n this.connections.delete(channelPath);\n }\n };\n }\n\n /**\n * Send message to a room on a channel\n */\n public async send<TClient extends TWSObject, TServer extends TWSObject>(\n roomId: string,\n channel: ChannelPrimitive<TClient, TServer>,\n message: Static<TServer>,\n ): Promise<void> {\n const channelPath = channel.options.path;\n\n this.log.trace(\"WebSocketClient.send\", { roomId, channelPath });\n\n const connection = this.connections.get(\n channelPath,\n ) as WebSocketChannelConnection<TClient, TServer>;\n\n if (!connection) {\n this.log.warn(\"Attempted to send on unsubscribed channel\", {\n channelPath,\n });\n throw new AlephaError(\n `Not subscribed to channel ${channelPath}. Subscribe first before sending messages.`,\n );\n }\n\n await connection.send(roomId, message);\n }\n\n /**\n * Get connection for a channel\n */\n public getConnection<TClient extends TWSObject, TServer extends TWSObject>(\n channel: ChannelPrimitive<TClient, TServer>,\n ): WebSocketChannelConnection<TClient, TServer> | undefined {\n const channelPath = channel.options.path;\n const connection = this.connections.get(channelPath) as\n | WebSocketChannelConnection<TClient, TServer>\n | undefined;\n\n this.log.trace(\"WebSocketClient.getConnection\", {\n channelPath,\n found: !!connection,\n });\n\n return connection;\n }\n\n /**\n * Disconnect all connections\n */\n public disconnectAll(): void {\n this.log.info(\"Disconnecting all connections\", {\n count: this.connections.size,\n });\n\n for (const connection of this.connections.values()) {\n connection.disconnect();\n }\n this.connections.clear();\n\n this.log.debug(\"All connections disconnected\");\n }\n}\n","/**\n * Base WebSocket error class\n */\nexport class WebSocketError extends Error {\n constructor(\n message: string,\n public readonly code?: number,\n ) {\n super(message);\n this.name = \"WebSocketError\";\n }\n}\n\n/**\n * Error thrown when WebSocket connection fails\n */\nexport class WebSocketConnectionError extends WebSocketError {\n constructor(message: string, code?: number) {\n super(message, code);\n this.name = \"WebSocketConnectionError\";\n }\n}\n\n/**\n * Error thrown when WebSocket message validation fails\n */\nexport class WebSocketValidationError extends WebSocketError {\n constructor(message: string) {\n super(message);\n this.name = \"WebSocketValidationError\";\n }\n}\n","import type { Static } from \"alepha\";\nimport type { ChannelPrimitive, TWSObject } from \"../primitives/$channel.ts\";\n\n/**\n * WebSocket connection interface\n */\nexport interface WebSocketConnection {\n /**\n * Unique connection ID\n */\n id: string;\n\n /**\n * User ID (if authenticated and security module is used)\n */\n userId?: string;\n\n /**\n * Room IDs that this connection is currently in\n */\n roomIds: string[];\n\n /**\n * Send a message to this connection\n */\n send(message: any): Promise<void>;\n\n /**\n * Close this connection\n */\n close(code?: number, reason?: string): Promise<void>;\n\n /**\n * Connection metadata (custom data)\n */\n metadata?: Record<string, any>;\n\n /**\n * Connection state\n */\n readyState: WebSocketState;\n}\n\n/**\n * WebSocket state enum\n */\nexport enum WebSocketState {\n CONNECTING = 0,\n OPEN = 1,\n CLOSING = 2,\n CLOSED = 3,\n}\n\n/**\n * WebSocket endpoint configuration (server-side)\n */\nexport interface WebSocketPrimitiveOptions<\n TClient extends TWSObject,\n TServer extends TWSObject,\n> {\n /**\n * Channel definition with schema and path\n */\n channel: ChannelPrimitive<TClient, TServer>;\n\n /**\n * Handler for incoming messages from clients\n */\n handler: WebSocketHandler<TClient, TServer>;\n\n /**\n * Optional connection handler (called when a client connects)\n */\n onConnect?: (params: {\n /**\n * Unique connection ID of the client\n */\n connectionId: string;\n\n /**\n * User ID of the connected client (if authenticated and security module is used)\n */\n userId?: string;\n\n /**\n * Room IDs that the client is connecting to\n */\n roomIds: string[];\n }) => Promise<void> | void;\n\n /**\n * Optional disconnection handler (called when a client disconnects)\n */\n onDisconnect?: (params: {\n /**\n * Unique connection ID of the client\n */\n connectionId: string;\n\n /**\n * User ID of the connected client (if authenticated and security module is used)\n */\n userId?: string;\n\n /**\n * Room IDs that the client was connected to\n */\n roomIds: string[];\n }) => Promise<void> | void;\n\n /**\n * Change WebSocket server provider (for custom implementations)\n */\n provider?: any;\n\n /**\n * Whether to enforce security (authentication, authorization) on this WebSocket endpoint\n * Requires alepha/security integration\n */\n secure?: boolean;\n\n /**\n * Limit number of connections per user (if authenticated)\n */\n maxConnectionsPerUser?: number;\n}\n\n/**\n * WebSocket message handler\n */\nexport type WebSocketHandler<\n TClient extends TWSObject,\n TServer extends TWSObject,\n> = (\n context: WebSocketHandlerContext<TClient, TServer>,\n) => Promise<void> | void;\n\n/**\n * WebSocket handler context\n */\nexport interface WebSocketHandlerContext<\n TClient extends TWSObject,\n TServer extends TWSObject,\n> {\n /**\n * Unique connection ID of the client\n */\n connectionId: string;\n\n /**\n * User ID of the connected client (if authenticated and security module is used)\n */\n userId?: string;\n\n /**\n * Room ID that the client sent the message from\n */\n roomId: string;\n\n /**\n * The parsed and validated message from the client\n */\n message: Static<TServer>;\n\n /**\n * Reply function tailored to current context (connectionId, roomId)\n */\n reply: (options: {\n /**\n * Message to send\n */\n message: Static<TClient>;\n\n /**\n * Optional: specify room ID to send to (defaults to sender's room ID)\n */\n roomId?: string;\n\n /**\n * Optional: exclude the sender connection from receiving the message\n * Will populate exceptConnectionIds with sender connection ID behind the scenes\n */\n exceptSelf?: boolean;\n\n /**\n * Optional: exclude specific connection IDs from receiving the message\n */\n exceptConnectionIds?: string[];\n\n /**\n * Optional: exclude specific user IDs from receiving the message\n * Requires alepha/security integration\n */\n exceptUserIds?: string[];\n }) => Promise<void>;\n}\n\n/**\n * Emit options for sending messages from the server\n */\nexport interface EmitOptions<TClient extends TWSObject> {\n /**\n * Message to send to clients\n */\n message: Static<TClient>;\n\n /**\n * Room ID to send the message to\n */\n roomId?: string;\n\n /**\n * Room IDs to send the message to\n */\n roomIds?: string[];\n\n /**\n * User ID to send the message to (if authenticated)\n */\n userId?: string;\n\n /**\n * User IDs to send the message to (if authenticated)\n */\n userIds?: string[];\n\n /**\n * Connection ID to send the message to\n */\n connectionId?: string;\n\n /**\n * Connection IDs to send the message to\n */\n connectionIds?: string[];\n\n /**\n * Optional: exclude specific connection IDs from receiving the message\n */\n exceptConnectionIds?: string[];\n\n /**\n * Optional: exclude specific user IDs from receiving the message\n * Requires alepha/security integration\n */\n exceptUserIds?: string[];\n}\n","import { $logger } from \"alepha/logger\";\n\n/**\n * Manages WebSocket room memberships\n *\n * Rooms are logical groupings of connections. A connection can be in multiple rooms,\n * and messages can be targeted to specific rooms.\n */\nexport class RoomManager {\n protected readonly log = $logger();\n\n /**\n * Maps roomId → Set<connectionId>\n */\n protected readonly rooms = new Map<string, Set<string>>();\n\n /**\n * Maps connectionId → Set<roomId>\n * Inverse index for fast lookup of connection's rooms\n */\n protected readonly connectionRooms = new Map<string, Set<string>>();\n\n /**\n * Join a connection to one or more rooms\n */\n public joinRooms(connectionId: string, roomIds: string[]): void {\n for (const roomId of roomIds) {\n this.joinRoom(connectionId, roomId);\n }\n }\n\n /**\n * Join a connection to a room\n */\n public joinRoom(connectionId: string, roomId: string): void {\n // Add to room\n let room = this.rooms.get(roomId);\n if (!room) {\n room = new Set();\n this.rooms.set(roomId, room);\n }\n room.add(connectionId);\n\n // Update inverse index\n let connRooms = this.connectionRooms.get(connectionId);\n if (!connRooms) {\n connRooms = new Set();\n this.connectionRooms.set(connectionId, connRooms);\n }\n connRooms.add(roomId);\n\n this.log.debug(`Connection ${connectionId} joined room ${roomId}`);\n }\n\n /**\n * Leave a connection from a room\n */\n public leaveRoom(connectionId: string, roomId: string): void {\n // Remove from room\n const room = this.rooms.get(roomId);\n if (room) {\n room.delete(connectionId);\n if (room.size === 0) {\n this.rooms.delete(roomId);\n }\n }\n\n // Update inverse index\n const connRooms = this.connectionRooms.get(connectionId);\n if (connRooms) {\n connRooms.delete(roomId);\n if (connRooms.size === 0) {\n this.connectionRooms.delete(connectionId);\n }\n }\n\n this.log.debug(`Connection ${connectionId} left room ${roomId}`);\n }\n\n /**\n * Remove a connection from all rooms\n */\n public leaveAllRooms(connectionId: string): void {\n const connRooms = this.connectionRooms.get(connectionId);\n if (!connRooms) {\n return;\n }\n\n for (const roomId of connRooms) {\n const room = this.rooms.get(roomId);\n if (room) {\n room.delete(connectionId);\n if (room.size === 0) {\n this.rooms.delete(roomId);\n }\n }\n }\n\n this.connectionRooms.delete(connectionId);\n this.log.debug(`Connection ${connectionId} left all rooms`);\n }\n\n /**\n * Get all connection IDs in a room\n */\n public getRoomConnections(roomId: string): string[] {\n const room = this.rooms.get(roomId);\n return room ? Array.from(room) : [];\n }\n\n /**\n * Get all room IDs for a connection\n */\n public getConnectionRooms(connectionId: string): string[] {\n const connRooms = this.connectionRooms.get(connectionId);\n return connRooms ? Array.from(connRooms) : [];\n }\n\n /**\n * Check if a connection is in a room\n */\n public isInRoom(connectionId: string, roomId: string): boolean {\n const connRooms = this.connectionRooms.get(connectionId);\n return connRooms ? connRooms.has(roomId) : false;\n }\n\n /**\n * Get all active rooms\n */\n public getAllRooms(): string[] {\n return Array.from(this.rooms.keys());\n }\n\n /**\n * Get total number of connections across all rooms\n */\n public getTotalConnections(): number {\n return this.connectionRooms.size;\n }\n\n /**\n * Get room statistics\n */\n public getStats(): {\n totalRooms: number;\n totalConnections: number;\n roomSizes: Map<string, number>;\n } {\n const roomSizes = new Map<string, number>();\n for (const [roomId, connections] of this.rooms) {\n roomSizes.set(roomId, connections.size);\n }\n\n return {\n totalRooms: this.rooms.size,\n totalConnections: this.connectionRooms.size,\n roomSizes,\n };\n }\n}\n","import { type Static, t } from \"alepha\";\nimport { $logger } from \"alepha/logger\";\nimport { $topic } from \"alepha/topic\";\n\n/**\n * WebSocket message distribution event\n */\nconst webSocketMessageSchema = {\n payload: t.object({\n /**\n * Channel path (e.g., \"/ws/chat\")\n */\n channelPath: t.text(),\n\n /**\n * Target room ID(s)\n */\n roomIds: t.optional(t.array(t.text())),\n\n /**\n * Target user ID(s)\n */\n userIds: t.optional(t.array(t.text())),\n\n /**\n * Target connection ID(s)\n */\n connectionIds: t.optional(t.array(t.text())),\n\n /**\n * Exclude connection ID(s) from receiving the message\n */\n exceptConnectionIds: t.optional(t.array(t.text())),\n\n /**\n * Exclude user ID(s) from receiving the message\n */\n exceptUserIds: t.optional(t.array(t.text())),\n\n /**\n * The message payload to send\n */\n message: t.any(),\n }),\n};\n\n/**\n * WebSocket Topic Service\n *\n * Manages pub/sub messaging for WebSocket connections across multiple server instances.\n * Uses alepha/topic for cross-instance message distribution, enabling horizontal scaling.\n *\n * When a WebSocket message needs to be sent:\n * 1. Server instance A publishes to the topic\n * 2. All server instances (A, B, C, etc.) receive the message\n * 3. Each instance sends to its local connections that match the criteria\n *\n * This enables:\n * - Multiple server instances handling WebSocket connections\n * - Redis-backed message distribution (with alepha/topic/redis)\n * - Horizontal scaling without losing messages\n */\nexport class WebSocketTopicService {\n protected readonly log = $logger();\n\n /**\n * Handler function to be called when a message is received from the topic\n * This is set by the WebSocket provider during initialization\n */\n public messageHandler?: (\n event: Static<(typeof webSocketMessageSchema)[\"payload\"]>,\n ) => Promise<void>;\n\n /**\n * Topic for distributing WebSocket messages across server instances\n */\n public readonly topic = $topic({\n name: \"websocket:broadcast\",\n description:\n \"Distributes WebSocket messages across server instances for horizontal scaling\",\n schema: webSocketMessageSchema,\n handler: async (message) => {\n if (this.messageHandler) {\n await this.messageHandler(message.payload);\n }\n },\n });\n\n /**\n * Publish a message to be distributed across all server instances\n */\n public async publish(\n event: Static<(typeof webSocketMessageSchema)[\"payload\"]>,\n ): Promise<void> {\n await this.topic.publish(event);\n }\n\n /**\n * Set the handler for incoming messages\n */\n public setMessageHandler(\n handler: (\n event: Static<(typeof webSocketMessageSchema)[\"payload\"]>,\n ) => Promise<void>,\n ): void {\n this.messageHandler = handler;\n }\n}\n","import { $module, type Alepha } from \"alepha\";\nimport { AlephaTopic } from \"alepha/topic\";\nimport { $channel } from \"./primitives/$channel.ts\";\nimport { $websocket } from \"./primitives/$websocket.ts\";\nimport { WebSocketClient } from \"./services/WebSocketClient.ts\";\n\n/**\n * alepha/websocket (Browser)\n *\n * Browser-side WebSocket client module. Provides WebSocketClient service\n * for managing WebSocket connections from the browser.\n *\n * For React applications, use alepha/react/websocket with the useRoom hook.\n */\nexport * from \"./index.shared.ts\";\n\nexport const AlephaWebSocket = $module({\n name: \"alepha.websocket\",\n primitives: [$channel, $websocket],\n services: [WebSocketClient],\n register: (alepha: Alepha) => {\n alepha.with(AlephaTopic);\n alepha.with(WebSocketClient);\n },\n});\n"],"mappings":"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"}
@@ -1,4 +1,4 @@
1
- import * as alepha42 from "alepha";
1
+ import * as alepha6 from "alepha";
2
2
  import { Alepha, KIND, Primitive, Static, TObject, TString, TUnion } from "alepha";
3
3
  import * as alepha_topic0 from "alepha/topic";
4
4
  import * as alepha_logger1 from "alepha/logger";
@@ -171,7 +171,7 @@ declare enum WebSocketState {
171
171
  CONNECTING = 0,
172
172
  OPEN = 1,
173
173
  CLOSING = 2,
174
- CLOSED = 3,
174
+ CLOSED = 3
175
175
  }
176
176
  /**
177
177
  * WebSocket endpoint configuration (server-side)
@@ -509,10 +509,10 @@ declare class RoomManager {
509
509
  }
510
510
  //#endregion
511
511
  //#region ../../src/websocket/services/WebSocketClient.d.ts
512
- declare const envSchema$1: alepha42.TObject<{
513
- WEBSOCKET_URL: alepha42.TString;
514
- WEBSOCKET_RECONNECT_INTERVAL: alepha42.TInteger;
515
- WEBSOCKET_MAX_RECONNECT_ATTEMPTS: alepha42.TInteger;
512
+ declare const envSchema$1: alepha6.TObject<{
513
+ WEBSOCKET_URL: alepha6.TString;
514
+ WEBSOCKET_RECONNECT_INTERVAL: alepha6.TInteger;
515
+ WEBSOCKET_MAX_RECONNECT_ATTEMPTS: alepha6.TInteger;
516
516
  }>;
517
517
  declare module "alepha" {
518
518
  interface Env extends Partial<Static<typeof envSchema$1>> {}
@@ -646,35 +646,35 @@ declare class WebSocketClient {
646
646
  * WebSocket message distribution event
647
647
  */
648
648
  declare const webSocketMessageSchema: {
649
- payload: alepha42.TObject<{
649
+ payload: alepha6.TObject<{
650
650
  /**
651
651
  * Channel path (e.g., "/ws/chat")
652
652
  */
653
- channelPath: alepha42.TString;
653
+ channelPath: alepha6.TString;
654
654
  /**
655
655
  * Target room ID(s)
656
656
  */
657
- roomIds: alepha42.TOptional<alepha42.TArray<alepha42.TString>>;
657
+ roomIds: alepha6.TOptional<alepha6.TArray<alepha6.TString>>;
658
658
  /**
659
659
  * Target user ID(s)
660
660
  */
661
- userIds: alepha42.TOptional<alepha42.TArray<alepha42.TString>>;
661
+ userIds: alepha6.TOptional<alepha6.TArray<alepha6.TString>>;
662
662
  /**
663
663
  * Target connection ID(s)
664
664
  */
665
- connectionIds: alepha42.TOptional<alepha42.TArray<alepha42.TString>>;
665
+ connectionIds: alepha6.TOptional<alepha6.TArray<alepha6.TString>>;
666
666
  /**
667
667
  * Exclude connection ID(s) from receiving the message
668
668
  */
669
- exceptConnectionIds: alepha42.TOptional<alepha42.TArray<alepha42.TString>>;
669
+ exceptConnectionIds: alepha6.TOptional<alepha6.TArray<alepha6.TString>>;
670
670
  /**
671
671
  * Exclude user ID(s) from receiving the message
672
672
  */
673
- exceptUserIds: alepha42.TOptional<alepha42.TArray<alepha42.TString>>;
673
+ exceptUserIds: alepha6.TOptional<alepha6.TArray<alepha6.TString>>;
674
674
  /**
675
675
  * The message payload to send
676
676
  */
677
- message: alepha42.TAny;
677
+ message: alepha6.TAny;
678
678
  }>;
679
679
  };
680
680
  /**
@@ -704,35 +704,35 @@ declare class WebSocketTopicService {
704
704
  * Topic for distributing WebSocket messages across server instances
705
705
  */
706
706
  readonly topic: alepha_topic0.TopicPrimitive<{
707
- payload: alepha42.TObject<{
707
+ payload: alepha6.TObject<{
708
708
  /**
709
709
  * Channel path (e.g., "/ws/chat")
710
710
  */
711
- channelPath: alepha42.TString;
711
+ channelPath: alepha6.TString;
712
712
  /**
713
713
  * Target room ID(s)
714
714
  */
715
- roomIds: alepha42.TOptional<alepha42.TArray<alepha42.TString>>;
715
+ roomIds: alepha6.TOptional<alepha6.TArray<alepha6.TString>>;
716
716
  /**
717
717
  * Target user ID(s)
718
718
  */
719
- userIds: alepha42.TOptional<alepha42.TArray<alepha42.TString>>;
719
+ userIds: alepha6.TOptional<alepha6.TArray<alepha6.TString>>;
720
720
  /**
721
721
  * Target connection ID(s)
722
722
  */
723
- connectionIds: alepha42.TOptional<alepha42.TArray<alepha42.TString>>;
723
+ connectionIds: alepha6.TOptional<alepha6.TArray<alepha6.TString>>;
724
724
  /**
725
725
  * Exclude connection ID(s) from receiving the message
726
726
  */
727
- exceptConnectionIds: alepha42.TOptional<alepha42.TArray<alepha42.TString>>;
727
+ exceptConnectionIds: alepha6.TOptional<alepha6.TArray<alepha6.TString>>;
728
728
  /**
729
729
  * Exclude user ID(s) from receiving the message
730
730
  */
731
- exceptUserIds: alepha42.TOptional<alepha42.TArray<alepha42.TString>>;
731
+ exceptUserIds: alepha6.TOptional<alepha6.TArray<alepha6.TString>>;
732
732
  /**
733
733
  * The message payload to send
734
734
  */
735
- message: alepha42.TAny;
735
+ message: alepha6.TAny;
736
736
  }>;
737
737
  }>;
738
738
  /**
@@ -746,8 +746,8 @@ declare class WebSocketTopicService {
746
746
  }
747
747
  //#endregion
748
748
  //#region ../../src/websocket/providers/NodeWebSocketServerProvider.d.ts
749
- declare const envSchema: alepha42.TObject<{
750
- WEBSOCKET_PATH: alepha42.TString;
749
+ declare const envSchema: alepha6.TObject<{
750
+ WEBSOCKET_PATH: alepha6.TString;
751
751
  }>;
752
752
  declare module "alepha" {
753
753
  interface Env extends Partial<Static<typeof envSchema>> {}
@@ -785,9 +785,9 @@ declare class NodeWebSocketServerProvider extends WebSocketServerProvider {
785
785
  exceptConnectionIds?: string[];
786
786
  exceptUserIds?: string[];
787
787
  }): Promise<void>;
788
- protected readonly start: alepha42.HookPrimitive<"start">;
789
- protected readonly ready: alepha42.HookPrimitive<"ready">;
790
- protected readonly stop: alepha42.HookPrimitive<"stop">;
788
+ protected readonly start: alepha6.HookPrimitive<"start">;
789
+ protected readonly ready: alepha6.HookPrimitive<"ready">;
790
+ protected readonly stop: alepha6.HookPrimitive<"stop">;
791
791
  }
792
792
  declare class NodeWebSocketConnection implements WebSocketConnection {
793
793
  readonly id: string;
@@ -855,7 +855,7 @@ declare module "alepha" {
855
855
  * @see {@link $websocket}
856
856
  * @module alepha.websockets
857
857
  */
858
- declare const AlephaWebSocket: alepha42.Service<alepha42.Module>;
858
+ declare const AlephaWebSocket: alepha6.Service<alepha6.Module>;
859
859
  //#endregion
860
860
  export { $channel, $websocket, AlephaWebSocket, ChannelPrimitive, ChannelPrimitiveOptions, EmitOptions, NodeWebSocketConnection, NodeWebSocketServerProvider, RoomManager, TWSObject, WebSocketChannelConnection, WebSocketClient, WebSocketConnection, WebSocketConnectionError, WebSocketError, WebSocketHandler, WebSocketHandlerContext, WebSocketPrimitive, WebSocketPrimitiveOptions, WebSocketServerProvider, WebSocketState, WebSocketTopicService, WebSocketValidationError };
861
861
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","names":[],"sources":["../../src/websocket/errors/WebSocketError.ts","../../src/websocket/primitives/$channel.ts","../../src/websocket/interfaces/WebSocketInterfaces.ts","../../src/websocket/providers/WebSocketServerProvider.ts","../../src/websocket/primitives/$websocket.ts","../../src/websocket/services/RoomManager.ts","../../src/websocket/services/WebSocketClient.ts","../../src/websocket/services/WebSocketTopicService.ts","../../src/websocket/providers/NodeWebSocketServerProvider.ts","../../src/websocket/index.ts"],"sourcesContent":[],"mappings":"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"}
1
+ {"version":3,"file":"index.d.ts","names":[],"sources":["../../src/websocket/errors/WebSocketError.ts","../../src/websocket/primitives/$channel.ts","../../src/websocket/interfaces/WebSocketInterfaces.ts","../../src/websocket/providers/WebSocketServerProvider.ts","../../src/websocket/primitives/$websocket.ts","../../src/websocket/services/RoomManager.ts","../../src/websocket/services/WebSocketClient.ts","../../src/websocket/services/WebSocketTopicService.ts","../../src/websocket/providers/NodeWebSocketServerProvider.ts","../../src/websocket/index.ts"],"mappings":"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"}
@@ -664,12 +664,12 @@ var NodeWebSocketConnection = class {
664
664
  /**
665
665
  * WebSocket state enum
666
666
  */
667
- let WebSocketState = /* @__PURE__ */ function(WebSocketState$1) {
668
- WebSocketState$1[WebSocketState$1["CONNECTING"] = 0] = "CONNECTING";
669
- WebSocketState$1[WebSocketState$1["OPEN"] = 1] = "OPEN";
670
- WebSocketState$1[WebSocketState$1["CLOSING"] = 2] = "CLOSING";
671
- WebSocketState$1[WebSocketState$1["CLOSED"] = 3] = "CLOSED";
672
- return WebSocketState$1;
667
+ let WebSocketState = /* @__PURE__ */ function(WebSocketState) {
668
+ WebSocketState[WebSocketState["CONNECTING"] = 0] = "CONNECTING";
669
+ WebSocketState[WebSocketState["OPEN"] = 1] = "OPEN";
670
+ WebSocketState[WebSocketState["CLOSING"] = 2] = "CLOSING";
671
+ WebSocketState[WebSocketState["CLOSED"] = 3] = "CLOSED";
672
+ return WebSocketState;
673
673
  }({});
674
674
 
675
675
  //#endregion
@@ -731,12 +731,12 @@ var WebSocketChannelConnection = class {
731
731
  const host = window.location.host;
732
732
  const path = this.channel.options.path;
733
733
  const roomIds = Array.from(this.subscriptions.keys());
734
- const url$1 = `${protocol}//${host}${path}${roomIds.length > 0 ? `?roomIds=${roomIds.join(",")}` : ""}`;
734
+ const url = `${protocol}//${host}${path}${roomIds.length > 0 ? `?roomIds=${roomIds.join(",")}` : ""}`;
735
735
  this.log.debug("Auto-detected WebSocket URL", {
736
- url: url$1,
736
+ url,
737
737
  roomIds
738
738
  });
739
- return url$1;
739
+ return url;
740
740
  }
741
741
  const url = `${this.env.WEBSOCKET_URL}${this.channel.options.path}`;
742
742
  this.log.debug("Using env WebSocket URL", { url });