typeferry 0.6.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (392) hide show
  1. package/README.md +88 -0
  2. package/dist/auth/client/cross-tab-sync.d.ts +21 -0
  3. package/dist/auth/client/cross-tab-sync.js +56 -0
  4. package/dist/auth/client/cross-tab-sync.js.map +1 -0
  5. package/dist/auth/client/index.d.ts +2 -0
  6. package/dist/auth/client/index.js +3 -0
  7. package/dist/auth/client/index.js.map +1 -0
  8. package/dist/auth/client/oauth/google-provider.d.ts +11 -0
  9. package/dist/auth/client/oauth/google-provider.js +11 -0
  10. package/dist/auth/client/oauth/google-provider.js.map +1 -0
  11. package/dist/auth/client/oauth/index.d.ts +4 -0
  12. package/dist/auth/client/oauth/index.js +3 -0
  13. package/dist/auth/client/oauth/index.js.map +1 -0
  14. package/dist/auth/client/oauth/use-google-login.d.ts +39 -0
  15. package/dist/auth/client/oauth/use-google-login.js +55 -0
  16. package/dist/auth/client/oauth/use-google-login.js.map +1 -0
  17. package/dist/auth/client/token-refresh.d.ts +21 -0
  18. package/dist/auth/client/token-refresh.js +212 -0
  19. package/dist/auth/client/token-refresh.js.map +1 -0
  20. package/dist/auth/index.d.ts +7 -0
  21. package/dist/auth/index.js +9 -0
  22. package/dist/auth/index.js.map +1 -0
  23. package/dist/auth/server/cookie-utils.d.ts +42 -0
  24. package/dist/auth/server/cookie-utils.js +91 -0
  25. package/dist/auth/server/cookie-utils.js.map +1 -0
  26. package/dist/auth/server/device-info.d.ts +23 -0
  27. package/dist/auth/server/device-info.js +52 -0
  28. package/dist/auth/server/device-info.js.map +1 -0
  29. package/dist/auth/server/index.d.ts +4 -0
  30. package/dist/auth/server/index.js +5 -0
  31. package/dist/auth/server/index.js.map +1 -0
  32. package/dist/auth/server/jwt-utils.d.ts +29 -0
  33. package/dist/auth/server/jwt-utils.js +53 -0
  34. package/dist/auth/server/jwt-utils.js.map +1 -0
  35. package/dist/auth/server/oauth/google.d.ts +31 -0
  36. package/dist/auth/server/oauth/google.js +40 -0
  37. package/dist/auth/server/oauth/google.js.map +1 -0
  38. package/dist/auth/server/oauth/index.d.ts +3 -0
  39. package/dist/auth/server/oauth/index.js +2 -0
  40. package/dist/auth/server/oauth/index.js.map +1 -0
  41. package/dist/auth/server/oauth/types.d.ts +37 -0
  42. package/dist/auth/server/oauth/types.js +2 -0
  43. package/dist/auth/server/oauth/types.js.map +1 -0
  44. package/dist/auth/server/session-manager.d.ts +46 -0
  45. package/dist/auth/server/session-manager.js +167 -0
  46. package/dist/auth/server/session-manager.js.map +1 -0
  47. package/dist/auth/types.d.ts +197 -0
  48. package/dist/auth/types.js +2 -0
  49. package/dist/auth/types.js.map +1 -0
  50. package/dist/client/call-method-proxy.d.ts +2 -0
  51. package/dist/client/call-method-proxy.js +22 -0
  52. package/dist/client/call-method-proxy.js.map +1 -0
  53. package/dist/client/client-channel.d.ts +43 -0
  54. package/dist/client/client-channel.js +148 -0
  55. package/dist/client/client-channel.js.map +1 -0
  56. package/dist/client/client-http.d.ts +27 -0
  57. package/dist/client/client-http.js +106 -0
  58. package/dist/client/client-http.js.map +1 -0
  59. package/dist/client/client-socket.d.ts +85 -0
  60. package/dist/client/client-socket.js +317 -0
  61. package/dist/client/client-socket.js.map +1 -0
  62. package/dist/client/client.d.ts +149 -0
  63. package/dist/client/client.js +401 -0
  64. package/dist/client/client.js.map +1 -0
  65. package/dist/client/context-manager.d.ts +54 -0
  66. package/dist/client/context-manager.js +89 -0
  67. package/dist/client/context-manager.js.map +1 -0
  68. package/dist/client/idle-timer.d.ts +35 -0
  69. package/dist/client/idle-timer.js +101 -0
  70. package/dist/client/idle-timer.js.map +1 -0
  71. package/dist/client/index.d.ts +6 -0
  72. package/dist/client/index.js +7 -0
  73. package/dist/client/index.js.map +1 -0
  74. package/dist/client/logger.d.ts +76 -0
  75. package/dist/client/logger.js +129 -0
  76. package/dist/client/logger.js.map +1 -0
  77. package/dist/client/visibility-manager.d.ts +62 -0
  78. package/dist/client/visibility-manager.js +177 -0
  79. package/dist/client/visibility-manager.js.map +1 -0
  80. package/dist/ejson/adjust-types-from-json-value.d.ts +1 -0
  81. package/dist/ejson/adjust-types-from-json-value.js +35 -0
  82. package/dist/ejson/adjust-types-from-json-value.js.map +1 -0
  83. package/dist/ejson/base64.d.ts +11 -0
  84. package/dist/ejson/base64.js +87 -0
  85. package/dist/ejson/base64.js.map +1 -0
  86. package/dist/ejson/built-in-converters.d.ts +1 -0
  87. package/dist/ejson/built-in-converters.js +137 -0
  88. package/dist/ejson/built-in-converters.js.map +1 -0
  89. package/dist/ejson/clone.d.ts +1 -0
  90. package/dist/ejson/clone.js +80 -0
  91. package/dist/ejson/clone.js.map +1 -0
  92. package/dist/ejson/custom-models.d.ts +38 -0
  93. package/dist/ejson/custom-models.js +76 -0
  94. package/dist/ejson/custom-models.js.map +1 -0
  95. package/dist/ejson/custom-types.d.ts +1 -0
  96. package/dist/ejson/custom-types.js +2 -0
  97. package/dist/ejson/custom-types.js.map +1 -0
  98. package/dist/ejson/equals.d.ts +1 -0
  99. package/dist/ejson/equals.js +117 -0
  100. package/dist/ejson/equals.js.map +1 -0
  101. package/dist/ejson/from-json-value.d.ts +1 -0
  102. package/dist/ejson/from-json-value.js +13 -0
  103. package/dist/ejson/from-json-value.js.map +1 -0
  104. package/dist/ejson/helpers/adjust-types-to-json-value.d.ts +1 -0
  105. package/dist/ejson/helpers/adjust-types-to-json-value.js +36 -0
  106. package/dist/ejson/helpers/adjust-types-to-json-value.js.map +1 -0
  107. package/dist/ejson/helpers/from-json-value-helper.d.ts +1 -0
  108. package/dist/ejson/helpers/from-json-value-helper.js +24 -0
  109. package/dist/ejson/helpers/from-json-value-helper.js.map +1 -0
  110. package/dist/ejson/helpers/to-json-value-helper.d.ts +1 -0
  111. package/dist/ejson/helpers/to-json-value-helper.js +15 -0
  112. package/dist/ejson/helpers/to-json-value-helper.js.map +1 -0
  113. package/dist/ejson/index.d.ts +27 -0
  114. package/dist/ejson/index.js +54 -0
  115. package/dist/ejson/index.js.map +1 -0
  116. package/dist/ejson/is-binary.d.ts +2 -0
  117. package/dist/ejson/is-binary.js +5 -0
  118. package/dist/ejson/is-binary.js.map +1 -0
  119. package/dist/ejson/parse.d.ts +6 -0
  120. package/dist/ejson/parse.js +12 -0
  121. package/dist/ejson/parse.js.map +1 -0
  122. package/dist/ejson/stable-stringify.d.ts +10 -0
  123. package/dist/ejson/stable-stringify.js +25 -0
  124. package/dist/ejson/stable-stringify.js.map +1 -0
  125. package/dist/ejson/stringify.d.ts +5 -0
  126. package/dist/ejson/stringify.js +15 -0
  127. package/dist/ejson/stringify.js.map +1 -0
  128. package/dist/ejson/to-json-value.d.ts +1 -0
  129. package/dist/ejson/to-json-value.js +17 -0
  130. package/dist/ejson/to-json-value.js.map +1 -0
  131. package/dist/ejson/utils.d.ts +18 -0
  132. package/dist/ejson/utils.js +43 -0
  133. package/dist/ejson/utils.js.map +1 -0
  134. package/dist/mongodb/change-streams.d.ts +31 -0
  135. package/dist/mongodb/change-streams.js +142 -0
  136. package/dist/mongodb/change-streams.js.map +1 -0
  137. package/dist/mongodb/client.d.ts +13 -0
  138. package/dist/mongodb/client.js +30 -0
  139. package/dist/mongodb/client.js.map +1 -0
  140. package/dist/mongodb/decorators/collection.d.ts +9 -0
  141. package/dist/mongodb/decorators/collection.js +26 -0
  142. package/dist/mongodb/decorators/collection.js.map +1 -0
  143. package/dist/mongodb/decorators/index.d.ts +4 -0
  144. package/dist/mongodb/decorators/index.js +5 -0
  145. package/dist/mongodb/decorators/index.js.map +1 -0
  146. package/dist/mongodb/decorators/metadata.d.ts +21 -0
  147. package/dist/mongodb/decorators/metadata.js +29 -0
  148. package/dist/mongodb/decorators/metadata.js.map +1 -0
  149. package/dist/mongodb/decorators/register.d.ts +3 -0
  150. package/dist/mongodb/decorators/register.js +10 -0
  151. package/dist/mongodb/decorators/register.js.map +1 -0
  152. package/dist/mongodb/decorators/watch.d.ts +4 -0
  153. package/dist/mongodb/decorators/watch.js +10 -0
  154. package/dist/mongodb/decorators/watch.js.map +1 -0
  155. package/dist/mongodb/filters.d.ts +20 -0
  156. package/dist/mongodb/filters.js +40 -0
  157. package/dist/mongodb/filters.js.map +1 -0
  158. package/dist/mongodb/find-one-or-create.d.ts +4 -0
  159. package/dist/mongodb/find-one-or-create.js +16 -0
  160. package/dist/mongodb/find-one-or-create.js.map +1 -0
  161. package/dist/mongodb/index.d.ts +10 -0
  162. package/dist/mongodb/index.js +11 -0
  163. package/dist/mongodb/index.js.map +1 -0
  164. package/dist/mongodb/live/client.d.ts +52 -0
  165. package/dist/mongodb/live/client.js +266 -0
  166. package/dist/mongodb/live/client.js.map +1 -0
  167. package/dist/mongodb/live/engine.d.ts +55 -0
  168. package/dist/mongodb/live/engine.js +440 -0
  169. package/dist/mongodb/live/engine.js.map +1 -0
  170. package/dist/mongodb/live/index.d.ts +5 -0
  171. package/dist/mongodb/live/index.js +6 -0
  172. package/dist/mongodb/live/index.js.map +1 -0
  173. package/dist/mongodb/live/observer.d.ts +58 -0
  174. package/dist/mongodb/live/observer.js +246 -0
  175. package/dist/mongodb/live/observer.js.map +1 -0
  176. package/dist/mongodb/live/publication.d.ts +4 -0
  177. package/dist/mongodb/live/publication.js +30 -0
  178. package/dist/mongodb/live/publication.js.map +1 -0
  179. package/dist/mongodb/live/source.d.ts +55 -0
  180. package/dist/mongodb/live/source.js +197 -0
  181. package/dist/mongodb/live/source.js.map +1 -0
  182. package/dist/mongodb/live/types.d.ts +266 -0
  183. package/dist/mongodb/live/types.js +29 -0
  184. package/dist/mongodb/live/types.js.map +1 -0
  185. package/dist/mongodb/live/window.d.ts +7 -0
  186. package/dist/mongodb/live/window.js +93 -0
  187. package/dist/mongodb/live/window.js.map +1 -0
  188. package/dist/mongodb/registry.d.ts +35 -0
  189. package/dist/mongodb/registry.js +129 -0
  190. package/dist/mongodb/registry.js.map +1 -0
  191. package/dist/mongodb/schema.d.ts +16 -0
  192. package/dist/mongodb/schema.js +43 -0
  193. package/dist/mongodb/schema.js.map +1 -0
  194. package/dist/mongodb/timestamps.d.ts +17 -0
  195. package/dist/mongodb/timestamps.js +27 -0
  196. package/dist/mongodb/timestamps.js.map +1 -0
  197. package/dist/mongodb/types.d.ts +120 -0
  198. package/dist/mongodb/types.js +10 -0
  199. package/dist/mongodb/types.js.map +1 -0
  200. package/dist/react/components/client-provider.d.ts +8 -0
  201. package/dist/react/components/client-provider.js +23 -0
  202. package/dist/react/components/client-provider.js.map +1 -0
  203. package/dist/react/components/index.d.ts +1 -0
  204. package/dist/react/components/index.js +2 -0
  205. package/dist/react/components/index.js.map +1 -0
  206. package/dist/react/hooks/index.d.ts +13 -0
  207. package/dist/react/hooks/index.js +14 -0
  208. package/dist/react/hooks/index.js.map +1 -0
  209. package/dist/react/hooks/use-auth.d.ts +4 -0
  210. package/dist/react/hooks/use-auth.js +35 -0
  211. package/dist/react/hooks/use-auth.js.map +1 -0
  212. package/dist/react/hooks/use-caller.d.ts +5 -0
  213. package/dist/react/hooks/use-caller.js +13 -0
  214. package/dist/react/hooks/use-caller.js.map +1 -0
  215. package/dist/react/hooks/use-channel.d.ts +1 -0
  216. package/dist/react/hooks/use-channel.js +7 -0
  217. package/dist/react/hooks/use-channel.js.map +1 -0
  218. package/dist/react/hooks/use-circuit-breaker.d.ts +6 -0
  219. package/dist/react/hooks/use-circuit-breaker.js +16 -0
  220. package/dist/react/hooks/use-circuit-breaker.js.map +1 -0
  221. package/dist/react/hooks/use-client.d.ts +3 -0
  222. package/dist/react/hooks/use-client.js +13 -0
  223. package/dist/react/hooks/use-client.js.map +1 -0
  224. package/dist/react/hooks/use-connection-state.d.ts +13 -0
  225. package/dist/react/hooks/use-connection-state.js +55 -0
  226. package/dist/react/hooks/use-connection-state.js.map +1 -0
  227. package/dist/react/hooks/use-creation.d.ts +5 -0
  228. package/dist/react/hooks/use-creation.js +17 -0
  229. package/dist/react/hooks/use-creation.js.map +1 -0
  230. package/dist/react/hooks/use-deps-change.d.ts +1 -0
  231. package/dist/react/hooks/use-deps-change.js +11 -0
  232. package/dist/react/hooks/use-deps-change.js.map +1 -0
  233. package/dist/react/hooks/use-local-event.d.ts +13 -0
  234. package/dist/react/hooks/use-local-event.js +32 -0
  235. package/dist/react/hooks/use-local-event.js.map +1 -0
  236. package/dist/react/hooks/use-method-refresh.d.ts +15 -0
  237. package/dist/react/hooks/use-method-refresh.js +48 -0
  238. package/dist/react/hooks/use-method-refresh.js.map +1 -0
  239. package/dist/react/hooks/use-method.d.ts +26 -0
  240. package/dist/react/hooks/use-method.js +161 -0
  241. package/dist/react/hooks/use-method.js.map +1 -0
  242. package/dist/react/hooks/use-mongodb-live-publication.d.ts +13 -0
  243. package/dist/react/hooks/use-mongodb-live-publication.js +26 -0
  244. package/dist/react/hooks/use-mongodb-live-publication.js.map +1 -0
  245. package/dist/react/hooks/use-object.d.ts +2 -0
  246. package/dist/react/hooks/use-object.js +22 -0
  247. package/dist/react/hooks/use-object.js.map +1 -0
  248. package/dist/react/hooks/use-subscribe.d.ts +8 -0
  249. package/dist/react/hooks/use-subscribe.js +49 -0
  250. package/dist/react/hooks/use-subscribe.js.map +1 -0
  251. package/dist/react/hooks/use-throttled-events.d.ts +7 -0
  252. package/dist/react/hooks/use-throttled-events.js +11 -0
  253. package/dist/react/hooks/use-throttled-events.js.map +1 -0
  254. package/dist/react/hooks/use-token-refresh.d.ts +13 -0
  255. package/dist/react/hooks/use-token-refresh.js +40 -0
  256. package/dist/react/hooks/use-token-refresh.js.map +1 -0
  257. package/dist/react/index.d.ts +2 -0
  258. package/dist/react/index.js +3 -0
  259. package/dist/react/index.js.map +1 -0
  260. package/dist/server/client-node.d.ts +76 -0
  261. package/dist/server/client-node.js +159 -0
  262. package/dist/server/client-node.js.map +1 -0
  263. package/dist/server/create-method-proxy.d.ts +2 -0
  264. package/dist/server/create-method-proxy.js +16 -0
  265. package/dist/server/create-method-proxy.js.map +1 -0
  266. package/dist/server/decorators/cached.d.ts +37 -0
  267. package/dist/server/decorators/cached.js +65 -0
  268. package/dist/server/decorators/cached.js.map +1 -0
  269. package/dist/server/decorators/index.d.ts +14 -0
  270. package/dist/server/decorators/index.js +13 -0
  271. package/dist/server/decorators/index.js.map +1 -0
  272. package/dist/server/decorators/infer.d.ts +78 -0
  273. package/dist/server/decorators/infer.js +11 -0
  274. package/dist/server/decorators/infer.js.map +1 -0
  275. package/dist/server/decorators/metadata.d.ts +60 -0
  276. package/dist/server/decorators/metadata.js +77 -0
  277. package/dist/server/decorators/metadata.js.map +1 -0
  278. package/dist/server/decorators/method.d.ts +14 -0
  279. package/dist/server/decorators/method.js +25 -0
  280. package/dist/server/decorators/method.js.map +1 -0
  281. package/dist/server/decorators/namespace.d.ts +25 -0
  282. package/dist/server/decorators/namespace.js +34 -0
  283. package/dist/server/decorators/namespace.js.map +1 -0
  284. package/dist/server/decorators/protected.d.ts +36 -0
  285. package/dist/server/decorators/protected.js +61 -0
  286. package/dist/server/decorators/protected.js.map +1 -0
  287. package/dist/server/decorators/register.d.ts +25 -0
  288. package/dist/server/decorators/register.js +72 -0
  289. package/dist/server/decorators/register.js.map +1 -0
  290. package/dist/server/decorators/schema.d.ts +17 -0
  291. package/dist/server/decorators/schema.js +27 -0
  292. package/dist/server/decorators/schema.js.map +1 -0
  293. package/dist/server/decorators/use.d.ts +22 -0
  294. package/dist/server/decorators/use.js +32 -0
  295. package/dist/server/decorators/use.js.map +1 -0
  296. package/dist/server/default-methods.d.ts +8 -0
  297. package/dist/server/default-methods.js +8 -0
  298. package/dist/server/default-methods.js.map +1 -0
  299. package/dist/server/event.d.ts +42 -0
  300. package/dist/server/event.js +53 -0
  301. package/dist/server/event.js.map +1 -0
  302. package/dist/server/index.d.ts +10 -0
  303. package/dist/server/index.js +11 -0
  304. package/dist/server/index.js.map +1 -0
  305. package/dist/server/method.d.ts +95 -0
  306. package/dist/server/method.js +113 -0
  307. package/dist/server/method.js.map +1 -0
  308. package/dist/server/methods.d.ts +11 -0
  309. package/dist/server/methods.js +74 -0
  310. package/dist/server/methods.js.map +1 -0
  311. package/dist/server/request-types.d.ts +20 -0
  312. package/dist/server/request-types.js +8 -0
  313. package/dist/server/request-types.js.map +1 -0
  314. package/dist/server/room-registry.d.ts +28 -0
  315. package/dist/server/room-registry.js +83 -0
  316. package/dist/server/room-registry.js.map +1 -0
  317. package/dist/server/server-channel.d.ts +32 -0
  318. package/dist/server/server-channel.js +104 -0
  319. package/dist/server/server-channel.js.map +1 -0
  320. package/dist/server/server.d.ts +124 -0
  321. package/dist/server/server.js +243 -0
  322. package/dist/server/server.js.map +1 -0
  323. package/dist/server/transports/hono-rate-limit.d.ts +15 -0
  324. package/dist/server/transports/hono-rate-limit.js +36 -0
  325. package/dist/server/transports/hono-rate-limit.js.map +1 -0
  326. package/dist/server/transports/index.d.ts +4 -0
  327. package/dist/server/transports/index.js +5 -0
  328. package/dist/server/transports/index.js.map +1 -0
  329. package/dist/server/transports/node-hono-transport-contract.d.ts +16 -0
  330. package/dist/server/transports/node-hono-transport-contract.js +18 -0
  331. package/dist/server/transports/node-hono-transport-contract.js.map +1 -0
  332. package/dist/server/transports/node-hono-transport.d.ts +47 -0
  333. package/dist/server/transports/node-hono-transport.js +327 -0
  334. package/dist/server/transports/node-hono-transport.js.map +1 -0
  335. package/dist/server/transports/redis-transport.d.ts +34 -0
  336. package/dist/server/transports/redis-transport.js +84 -0
  337. package/dist/server/transports/redis-transport.js.map +1 -0
  338. package/dist/server/transports/websocket-transport.d.ts +42 -0
  339. package/dist/server/transports/websocket-transport.js +174 -0
  340. package/dist/server/transports/websocket-transport.js.map +1 -0
  341. package/dist/server/transports/ws-shared.d.ts +37 -0
  342. package/dist/server/transports/ws-shared.js +188 -0
  343. package/dist/server/transports/ws-shared.js.map +1 -0
  344. package/dist/server/typeferry-async-local-storage.d.ts +5 -0
  345. package/dist/server/typeferry-async-local-storage.js +6 -0
  346. package/dist/server/typeferry-async-local-storage.js.map +1 -0
  347. package/dist/server/types.d.ts +27 -0
  348. package/dist/server/types.js +11 -0
  349. package/dist/server/types.js.map +1 -0
  350. package/dist/utils/constants.d.ts +72 -0
  351. package/dist/utils/constants.js +79 -0
  352. package/dist/utils/constants.js.map +1 -0
  353. package/dist/utils/environment.d.ts +8 -0
  354. package/dist/utils/environment.js +17 -0
  355. package/dist/utils/environment.js.map +1 -0
  356. package/dist/utils/errors.d.ts +26 -0
  357. package/dist/utils/errors.js +35 -0
  358. package/dist/utils/errors.js.map +1 -0
  359. package/dist/utils/event-emitter.d.ts +37 -0
  360. package/dist/utils/event-emitter.js +104 -0
  361. package/dist/utils/event-emitter.js.map +1 -0
  362. package/dist/utils/events.d.ts +7 -0
  363. package/dist/utils/events.js +23 -0
  364. package/dist/utils/events.js.map +1 -0
  365. package/dist/utils/helpers.d.ts +14 -0
  366. package/dist/utils/helpers.js +40 -0
  367. package/dist/utils/helpers.js.map +1 -0
  368. package/dist/utils/index.d.ts +11 -0
  369. package/dist/utils/index.js +12 -0
  370. package/dist/utils/index.js.map +1 -0
  371. package/dist/utils/intercept.d.ts +7 -0
  372. package/dist/utils/intercept.js +21 -0
  373. package/dist/utils/intercept.js.map +1 -0
  374. package/dist/utils/iterator.d.ts +9 -0
  375. package/dist/utils/iterator.js +28 -0
  376. package/dist/utils/iterator.js.map +1 -0
  377. package/dist/utils/lodash.d.ts +33 -0
  378. package/dist/utils/lodash.js +123 -0
  379. package/dist/utils/lodash.js.map +1 -0
  380. package/dist/utils/presentation.d.ts +19 -0
  381. package/dist/utils/presentation.js +25 -0
  382. package/dist/utils/presentation.js.map +1 -0
  383. package/dist/utils/promise.d.ts +6 -0
  384. package/dist/utils/promise.js +17 -0
  385. package/dist/utils/promise.js.map +1 -0
  386. package/dist/utils/protocol.d.ts +110 -0
  387. package/dist/utils/protocol.js +59 -0
  388. package/dist/utils/protocol.js.map +1 -0
  389. package/dist/utils/types.d.ts +23 -0
  390. package/dist/utils/types.js +2 -0
  391. package/dist/utils/types.js.map +1 -0
  392. package/package.json +187 -0
@@ -0,0 +1,174 @@
1
+ import { WebSocketServer } from 'ws';
2
+ import { TYPEFERRY_WS_PATH, isPongMessage, isRpcMessage, isRpcVoidMessage, Presentation, ServerEvents, } from '../../utils/index.js';
3
+ import { ClientNode } from '../client-node.js';
4
+ import { RoomRegistry } from '../room-registry.js';
5
+ import { SocketState } from '../types.js';
6
+ import { PING_INTERVAL_MS, PING_PAYLOAD, authenticateNode, handleRpc, handleRpcVoid, parseMeta, validateUuid, } from './ws-shared.js';
7
+ export var WebSocketTransportEvents;
8
+ (function (WebSocketTransportEvents) {
9
+ WebSocketTransportEvents["WEBSOCKET_SERVER_ERROR"] = "websocket:server:error";
10
+ })(WebSocketTransportEvents || (WebSocketTransportEvents = {}));
11
+ const UPGRADE_NOT_FOUND_RESPONSE = 'HTTP/1.1 404 Not Found\r\nConnection: close\r\nContent-Length: 0\r\n\r\n';
12
+ const UPGRADE_FORBIDDEN_RESPONSE = 'HTTP/1.1 403 Forbidden\r\nConnection: close\r\nContent-Length: 0\r\n\r\n';
13
+ /**
14
+ * Node.js WebSocket transport using the `ws` package.
15
+ */
16
+ export class WebSocketTransport {
17
+ server;
18
+ wss;
19
+ rooms = new RoomRegistry();
20
+ path;
21
+ origins;
22
+ handshakeAuthenticator;
23
+ pingTimers = new Map();
24
+ pongReceived = new Map();
25
+ constructor(server, origins, opts) {
26
+ this.server = server;
27
+ this.path = opts?.path ?? TYPEFERRY_WS_PATH;
28
+ this.origins = origins?.length ? new Set(origins) : null;
29
+ this.handshakeAuthenticator = opts?.handshakeAuthenticator;
30
+ this.wss = new WebSocketServer({ noServer: true });
31
+ this.wss.on('error', (error) => server.emit(WebSocketTransportEvents.WEBSOCKET_SERVER_ERROR, error));
32
+ this.attachUpgradeHandler();
33
+ }
34
+ attachUpgradeHandler() {
35
+ const httpTransport = this.server.httpTransport;
36
+ if (!httpTransport.http) {
37
+ throw new Error('HTTP transport must exist before WebSocket attachment');
38
+ }
39
+ httpTransport.http.on('upgrade', (req, socket, head) => {
40
+ const url = new URL(req.url ?? '', 'http://localhost');
41
+ if (url.pathname !== this.path) {
42
+ this.rejectUpgrade(socket, UPGRADE_NOT_FOUND_RESPONSE);
43
+ return;
44
+ }
45
+ if (!this.server.acceptConnections) {
46
+ socket.destroy();
47
+ return;
48
+ }
49
+ if (!this.validateOrigin(req)) {
50
+ this.rejectUpgrade(socket, UPGRADE_FORBIDDEN_RESPONSE);
51
+ return;
52
+ }
53
+ this.wss.handleUpgrade(req, socket, head, ws => {
54
+ this.handleConnection(ws, req);
55
+ });
56
+ });
57
+ }
58
+ /** Flushes the HTTP rejection and then closes both halves of the raw socket. */
59
+ rejectUpgrade(socket, response) {
60
+ socket.end(response, () => socket.destroy());
61
+ }
62
+ validateOrigin(req) {
63
+ if (!this.origins)
64
+ return true;
65
+ const origin = req.headers.origin;
66
+ if (!origin)
67
+ return true;
68
+ return this.origins.has(origin);
69
+ }
70
+ handleConnection(ws, req) {
71
+ const url = new URL(req.url ?? '', 'http://localhost');
72
+ const uuid = validateUuid(url.searchParams.get('uuid'));
73
+ const token = url.searchParams.get('token') ?? undefined;
74
+ const meta = parseMeta(url.searchParams.get('meta'));
75
+ const handshake = {
76
+ path: url.pathname,
77
+ headers: Object.fromEntries(Object.entries(req.headers).flatMap(([name, value]) => {
78
+ if (typeof value === 'string')
79
+ return [[name, value]];
80
+ if (Array.isArray(value))
81
+ return [[name, value.join(', ')]];
82
+ return [];
83
+ })),
84
+ query: Object.fromEntries(url.searchParams.entries()),
85
+ };
86
+ const node = new ClientNode(this.server, ws, undefined, undefined, this.server.rateLimit);
87
+ node.setId(uuid);
88
+ node.meta = meta;
89
+ node.setTrackingProperties(req);
90
+ this.server.addClient(node);
91
+ this.server.emit(ServerEvents.CONNECTION, node);
92
+ ws.on('message', (raw) => {
93
+ this.handleMessage(node, raw);
94
+ });
95
+ ws.on('close', () => {
96
+ this.stopPing(ws);
97
+ this.rooms.leaveAll(ws);
98
+ node.close();
99
+ this.server.deleteClient(node);
100
+ });
101
+ ws.on('error', (error) => {
102
+ this.server.emit(ServerEvents.SOCKET_ERROR, ws, error);
103
+ });
104
+ this.startPing(ws);
105
+ authenticateNode(this.server, node, token, this.handshakeAuthenticator, handshake);
106
+ }
107
+ handleMessage(node, raw) {
108
+ try {
109
+ const text = typeof raw === 'string' ? raw : raw.toString('utf8');
110
+ const msg = Presentation.decode(text);
111
+ if (isRpcMessage(msg)) {
112
+ handleRpc(this.server, node, msg.id, msg.method, msg.params);
113
+ }
114
+ else if (isRpcVoidMessage(msg)) {
115
+ handleRpcVoid(this.server, node, msg.method, msg.params);
116
+ }
117
+ else if (isPongMessage(msg) && node.socket) {
118
+ this.pongReceived.set(node.socket, true);
119
+ }
120
+ }
121
+ catch {
122
+ // Malformed message — ignore
123
+ }
124
+ }
125
+ // ---------------------------------------------------------------------------
126
+ // Ping / Pong keep-alive
127
+ // ---------------------------------------------------------------------------
128
+ startPing(ws) {
129
+ this.pongReceived.set(ws, true);
130
+ const timer = setInterval(() => {
131
+ if (!this.pongReceived.get(ws)) {
132
+ ws.terminate();
133
+ return;
134
+ }
135
+ this.pongReceived.set(ws, false);
136
+ if (ws.readyState === SocketState.OPEN) {
137
+ ws.send(PING_PAYLOAD);
138
+ }
139
+ }, PING_INTERVAL_MS);
140
+ this.pingTimers.set(ws, timer);
141
+ ws.on('pong', () => {
142
+ this.pongReceived.set(ws, true);
143
+ });
144
+ }
145
+ stopPing(ws) {
146
+ const timer = this.pingTimers.get(ws);
147
+ if (timer) {
148
+ clearInterval(timer);
149
+ this.pingTimers.delete(ws);
150
+ }
151
+ this.pongReceived.delete(ws);
152
+ }
153
+ close() {
154
+ return new Promise((resolve, reject) => {
155
+ for (const [ws, timer] of this.pingTimers) {
156
+ clearInterval(timer);
157
+ if (ws.readyState === SocketState.OPEN)
158
+ ws.close();
159
+ }
160
+ this.pingTimers.clear();
161
+ this.pongReceived.clear();
162
+ this.wss.close(error => {
163
+ if (error &&
164
+ error.code !== 'ERR_SERVER_NOT_RUNNING' &&
165
+ error.message !== 'The server is not running') {
166
+ reject(error);
167
+ return;
168
+ }
169
+ resolve();
170
+ });
171
+ });
172
+ }
173
+ }
174
+ //# sourceMappingURL=websocket-transport.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"websocket-transport.js","sourceRoot":"","sources":["../../../src/server/transports/websocket-transport.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,eAAe,EAAE,MAAM,IAAI,CAAA;AAEpC,OAAO,EACL,iBAAiB,EACjB,aAAa,EACb,YAAY,EACZ,gBAAgB,EAChB,YAAY,EACZ,YAAY,GACb,MAAM,aAAa,CAAA;AACpB,OAAO,EAAE,UAAU,EAAE,MAAM,gBAAgB,CAAA;AAC3C,OAAO,EAAE,YAAY,EAAE,MAAM,kBAAkB,CAAA;AAG/C,OAAO,EAAE,WAAW,EAAE,MAAM,UAAU,CAAA;AAGtC,OAAO,EACL,gBAAgB,EAChB,YAAY,EACZ,gBAAgB,EAChB,SAAS,EACT,aAAa,EACb,SAAS,EAGT,YAAY,GACb,MAAM,aAAa,CAAA;AAOpB,MAAM,CAAN,IAAY,wBAEX;AAFD,WAAY,wBAAwB;IAClC,6EAAiD,CAAA;AACnD,CAAC,EAFW,wBAAwB,KAAxB,wBAAwB,QAEnC;AAED,MAAM,0BAA0B,GAC9B,0EAA0E,CAAA;AAC5E,MAAM,0BAA0B,GAC9B,0EAA0E,CAAA;AAc5E;;GAEG;AACH,MAAM,OAAO,kBAAkB;IAC7B,MAAM,CAAQ;IACd,GAAG,CAAiB;IACpB,KAAK,GAAG,IAAI,YAAY,EAAE,CAAA;IAElB,IAAI,CAAQ;IACZ,OAAO,CAAoB;IAC3B,sBAAsB,CAAkC;IACxD,UAAU,GAAG,IAAI,GAAG,EAAmD,CAAA;IACvE,YAAY,GAAG,IAAI,GAAG,EAA4B,CAAA;IAE1D,YACE,MAAc,EACd,OAA6B,EAC7B,IAAgC;QAEhC,IAAI,CAAC,MAAM,GAAG,MAAM,CAAA;QACpB,IAAI,CAAC,IAAI,GAAG,IAAI,EAAE,IAAI,IAAI,iBAAiB,CAAA;QAC3C,IAAI,CAAC,OAAO,GAAG,OAAO,EAAE,MAAM,CAAC,CAAC,CAAC,IAAI,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,IAAI,CAAA;QACxD,IAAI,CAAC,sBAAsB,GAAG,IAAI,EAAE,sBAAsB,CAAA;QAE1D,IAAI,CAAC,GAAG,GAAG,IAAI,eAAe,CAAC,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC,CAAA;QAClD,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,OAAO,EAAE,CAAC,KAAY,EAAE,EAAE,CACpC,MAAM,CAAC,IAAI,CAAC,wBAAwB,CAAC,sBAAsB,EAAE,KAAK,CAAC,CACpE,CAAA;QAED,IAAI,CAAC,oBAAoB,EAAE,CAAA;IAC7B,CAAC;IAEO,oBAAoB;QAC1B,MAAM,aAAa,GAAG,IAAI,CAAC,MAAM,CAAC,aAAkC,CAAA;QACpE,IAAI,CAAC,aAAa,CAAC,IAAI,EAAE,CAAC;YACxB,MAAM,IAAI,KAAK,CAAC,uDAAuD,CAAC,CAAA;QAC1E,CAAC;QACD,aAAa,CAAC,IAAI,CAAC,EAAE,CACnB,SAAS,EACT,CAAC,GAAyB,EAAE,MAAc,EAAE,IAAY,EAAE,EAAE;YAC1D,MAAM,GAAG,GAAG,IAAI,GAAG,CAAC,GAAG,CAAC,GAAG,IAAI,EAAE,EAAE,kBAAkB,CAAC,CAAA;YAEtD,IAAI,GAAG,CAAC,QAAQ,KAAK,IAAI,CAAC,IAAI,EAAE,CAAC;gBAC/B,IAAI,CAAC,aAAa,CAAC,MAAM,EAAE,0BAA0B,CAAC,CAAA;gBACtD,OAAM;YACR,CAAC;YAED,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,iBAAiB,EAAE,CAAC;gBACnC,MAAM,CAAC,OAAO,EAAE,CAAA;gBAChB,OAAM;YACR,CAAC;YAED,IAAI,CAAC,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC,EAAE,CAAC;gBAC9B,IAAI,CAAC,aAAa,CAAC,MAAM,EAAE,0BAA0B,CAAC,CAAA;gBACtD,OAAM;YACR,CAAC;YAED,IAAI,CAAC,GAAG,CAAC,aAAa,CAAC,GAAG,EAAE,MAAM,EAAE,IAAI,EAAE,EAAE,CAAC,EAAE;gBAC7C,IAAI,CAAC,gBAAgB,CAAC,EAAE,EAAE,GAAG,CAAC,CAAA;YAChC,CAAC,CAAC,CAAA;QACJ,CAAC,CACF,CAAA;IACH,CAAC;IAED,gFAAgF;IACxE,aAAa,CAAC,MAAc,EAAE,QAAgB;QACpD,MAAM,CAAC,GAAG,CAAC,QAAQ,EAAE,GAAG,EAAE,CAAC,MAAM,CAAC,OAAO,EAAE,CAAC,CAAA;IAC9C,CAAC;IAEO,cAAc,CAAC,GAAyB;QAC9C,IAAI,CAAC,IAAI,CAAC,OAAO;YAAE,OAAO,IAAI,CAAA;QAC9B,MAAM,MAAM,GAAG,GAAG,CAAC,OAAO,CAAC,MAAM,CAAA;QACjC,IAAI,CAAC,MAAM;YAAE,OAAO,IAAI,CAAA;QACxB,OAAO,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,CAAA;IACjC,CAAC;IAEO,gBAAgB,CAAC,EAAa,EAAE,GAAyB;QAC/D,MAAM,GAAG,GAAG,IAAI,GAAG,CAAC,GAAG,CAAC,GAAG,IAAI,EAAE,EAAE,kBAAkB,CAAC,CAAA;QAEtD,MAAM,IAAI,GAAG,YAAY,CAAC,GAAG,CAAC,YAAY,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,CAAA;QACvD,MAAM,KAAK,GAAG,GAAG,CAAC,YAAY,CAAC,GAAG,CAAC,OAAO,CAAC,IAAI,SAAS,CAAA;QACxD,MAAM,IAAI,GAAG,SAAS,CAAC,GAAG,CAAC,YAAY,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,CAAA;QACpD,MAAM,SAAS,GAAuB;YACpC,IAAI,EAAE,GAAG,CAAC,QAAQ;YAClB,OAAO,EAAE,MAAM,CAAC,WAAW,CACzB,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,EAAE,KAAK,CAAC,EAAE,EAAE;gBACpD,IAAI,OAAO,KAAK,KAAK,QAAQ;oBAAE,OAAO,CAAC,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC,CAAA;gBACrD,IAAI,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC;oBAAE,OAAO,CAAC,CAAC,IAAI,EAAE,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,CAAA;gBAC3D,OAAO,EAAE,CAAA;YACX,CAAC,CAAC,CACH;YACD,KAAK,EAAE,MAAM,CAAC,WAAW,CAAC,GAAG,CAAC,YAAY,CAAC,OAAO,EAAE,CAAC;SACtD,CAAA;QAED,MAAM,IAAI,GAAG,IAAI,UAAU,CACzB,IAAI,CAAC,MAAM,EACX,EAAE,EACF,SAAS,EACT,SAAS,EACT,IAAI,CAAC,MAAM,CAAC,SAAS,CACtB,CAAA;QAED,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAA;QAChB,IAAI,CAAC,IAAI,GAAG,IAAI,CAAA;QAChB,IAAI,CAAC,qBAAqB,CAAC,GAAG,CAAC,CAAA;QAE/B,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,IAAI,CAAC,CAAA;QAC3B,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,YAAY,CAAC,UAAU,EAAE,IAAI,CAAC,CAAA;QAE/C,EAAE,CAAC,EAAE,CAAC,SAAS,EAAE,CAAC,GAAoB,EAAE,EAAE;YACxC,IAAI,CAAC,aAAa,CAAC,IAAI,EAAE,GAAG,CAAC,CAAA;QAC/B,CAAC,CAAC,CAAA;QAEF,EAAE,CAAC,EAAE,CAAC,OAAO,EAAE,GAAG,EAAE;YAClB,IAAI,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAA;YACjB,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAA;YACvB,IAAI,CAAC,KAAK,EAAE,CAAA;YACZ,IAAI,CAAC,MAAM,CAAC,YAAY,CAAC,IAAI,CAAC,CAAA;QAChC,CAAC,CAAC,CAAA;QAEF,EAAE,CAAC,EAAE,CAAC,OAAO,EAAE,CAAC,KAAY,EAAE,EAAE;YAC9B,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,YAAY,CAAC,YAAY,EAAE,EAAE,EAAE,KAAK,CAAC,CAAA;QACxD,CAAC,CAAC,CAAA;QAEF,IAAI,CAAC,SAAS,CAAC,EAAE,CAAC,CAAA;QAClB,gBAAgB,CACd,IAAI,CAAC,MAAM,EACX,IAAI,EACJ,KAAK,EACL,IAAI,CAAC,sBAAsB,EAC3B,SAAS,CACV,CAAA;IACH,CAAC;IAEO,aAAa,CAAC,IAAgB,EAAE,GAAoB;QAC1D,IAAI,CAAC;YACH,MAAM,IAAI,GAAG,OAAO,GAAG,KAAK,QAAQ,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAA;YACjE,MAAM,GAAG,GAAG,YAAY,CAAC,MAAM,CAAgB,IAAI,CAAC,CAAA;YAEpD,IAAI,YAAY,CAAC,GAAG,CAAC,EAAE,CAAC;gBACtB,SAAS,CAAC,IAAI,CAAC,MAAM,EAAE,IAAI,EAAE,GAAG,CAAC,EAAE,EAAE,GAAG,CAAC,MAAM,EAAE,GAAG,CAAC,MAAM,CAAC,CAAA;YAC9D,CAAC;iBAAM,IAAI,gBAAgB,CAAC,GAAG,CAAC,EAAE,CAAC;gBACjC,aAAa,CAAC,IAAI,CAAC,MAAM,EAAE,IAAI,EAAE,GAAG,CAAC,MAAM,EAAE,GAAG,CAAC,MAAM,CAAC,CAAA;YAC1D,CAAC;iBAAM,IAAI,aAAa,CAAC,GAAG,CAAC,IAAI,IAAI,CAAC,MAAM,EAAE,CAAC;gBAC7C,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,IAAI,CAAC,MAAM,EAAE,IAAI,CAAC,CAAA;YAC1C,CAAC;QACH,CAAC;QAAC,MAAM,CAAC;YACP,6BAA6B;QAC/B,CAAC;IACH,CAAC;IAED,8EAA8E;IAC9E,yBAAyB;IACzB,8EAA8E;IAEtE,SAAS,CAAC,EAAa;QAC7B,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,EAAE,EAAE,IAAI,CAAC,CAAA;QAE/B,MAAM,KAAK,GAAG,WAAW,CAAC,GAAG,EAAE;YAC7B,IAAI,CAAC,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,CAAC;gBAC/B,EAAE,CAAC,SAAS,EAAE,CAAA;gBACd,OAAM;YACR,CAAC;YAED,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,EAAE,EAAE,KAAK,CAAC,CAAA;YAEhC,IAAI,EAAE,CAAC,UAAU,KAAK,WAAW,CAAC,IAAI,EAAE,CAAC;gBACvC,EAAE,CAAC,IAAI,CAAC,YAAY,CAAC,CAAA;YACvB,CAAC;QACH,CAAC,EAAE,gBAAgB,CAAC,CAAA;QAEpB,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE,EAAE,KAAK,CAAC,CAAA;QAE9B,EAAE,CAAC,EAAE,CAAC,MAAM,EAAE,GAAG,EAAE;YACjB,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,EAAE,EAAE,IAAI,CAAC,CAAA;QACjC,CAAC,CAAC,CAAA;IACJ,CAAC;IAEO,QAAQ,CAAC,EAAa;QAC5B,MAAM,KAAK,GAAG,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC,CAAA;QACrC,IAAI,KAAK,EAAE,CAAC;YACV,aAAa,CAAC,KAAK,CAAC,CAAA;YACpB,IAAI,CAAC,UAAU,CAAC,MAAM,CAAC,EAAE,CAAC,CAAA;QAC5B,CAAC;QACD,IAAI,CAAC,YAAY,CAAC,MAAM,CAAC,EAAE,CAAC,CAAA;IAC9B,CAAC;IAED,KAAK;QACH,OAAO,IAAI,OAAO,CAAO,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;YAC3C,KAAK,MAAM,CAAC,EAAE,EAAE,KAAK,CAAC,IAAI,IAAI,CAAC,UAAU,EAAE,CAAC;gBAC1C,aAAa,CAAC,KAAK,CAAC,CAAA;gBACpB,IAAI,EAAE,CAAC,UAAU,KAAK,WAAW,CAAC,IAAI;oBAAE,EAAE,CAAC,KAAK,EAAE,CAAA;YACpD,CAAC;YACD,IAAI,CAAC,UAAU,CAAC,KAAK,EAAE,CAAA;YACvB,IAAI,CAAC,YAAY,CAAC,KAAK,EAAE,CAAA;YAEzB,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,EAAE;gBACrB,IACE,KAAK;oBACJ,KAA+B,CAAC,IAAI,KAAK,wBAAwB;oBAClE,KAAK,CAAC,OAAO,KAAK,2BAA2B,EAC7C,CAAC;oBACD,MAAM,CAAC,KAAK,CAAC,CAAA;oBACb,OAAM;gBACR,CAAC;gBACD,OAAO,EAAE,CAAA;YACX,CAAC,CAAC,CAAA;QACJ,CAAC,CAAC,CAAA;IACJ,CAAC;CACF"}
@@ -0,0 +1,37 @@
1
+ import type { ClientNode } from '../client-node.js';
2
+ import type { Server } from '../server.js';
3
+ export declare const AUTH_TIMEOUT_MS = 5000;
4
+ export declare const MAX_UUID_LENGTH = 64;
5
+ export declare const MAX_META_SIZE = 10000;
6
+ export declare const PING_INTERVAL_MS = 25000;
7
+ /** Pre-encoded ping payload — avoids EJSON.stringify on every tick. */
8
+ export declare const PING_PAYLOAD: string;
9
+ /**
10
+ * Framework-neutral metadata exposed to an application handshake authenticator.
11
+ */
12
+ export interface WebSocketHandshake {
13
+ readonly path: string;
14
+ readonly headers: Readonly<Record<string, string>>;
15
+ readonly query: Readonly<Record<string, string>>;
16
+ }
17
+ /**
18
+ * Optional application-owned authentication for an admitted WebSocket.
19
+ */
20
+ export type WebSocketHandshakeAuthenticator = (node: ClientNode, handshake: WebSocketHandshake) => unknown | Promise<unknown>;
21
+ /** Handles an RPC call and sends the response correlated by `id`. */
22
+ export declare function handleRpc(server: Server, node: ClientNode, id: string, method: string, params?: unknown): Promise<void>;
23
+ /** Handles fire-and-forget RPC calls (no response sent). */
24
+ export declare function handleRpcVoid(server: Server, node: ClientNode, method: string, params?: unknown): Promise<void>;
25
+ /** Sends a correlated RPC response to the client. */
26
+ export declare function sendResponse(node: ClientNode, id: string, result?: unknown, error?: string, errors?: unknown): void;
27
+ /**
28
+ * Authenticates a node after connection. Guards against the node
29
+ * disconnecting during the async auth call.
30
+ */
31
+ export declare function authenticateNode(server: Server, node: ClientNode, token: string | undefined, handshakeAuthenticator?: WebSocketHandshakeAuthenticator, handshake?: WebSocketHandshake): Promise<void>;
32
+ /** Validates and sanitizes a UUID from the client query string. */
33
+ export declare function validateUuid(uuid: unknown): string;
34
+ /** Validates and sanitizes a meta object. */
35
+ export declare function validateMeta(meta: unknown): Record<string, unknown>;
36
+ /** Parses meta from a query string value (JSON-encoded in the URL). */
37
+ export declare function parseMeta(raw: string | null): Record<string, unknown>;
@@ -0,0 +1,188 @@
1
+ /**
2
+ * Shared WebSocket transport logic used by both the ws-based and
3
+ * Shared WebSocket protocol helpers, kept separate from listener lifecycle.
4
+ */
5
+ import { Errors, MessageType, Presentation, PublicError, SchemaValidationError, ServerEvents, } from '../../utils/index.js';
6
+ import { redactMethodTelemetry } from '../method.js';
7
+ import { SocketState } from '../types.js';
8
+ export const AUTH_TIMEOUT_MS = 5000;
9
+ export const MAX_UUID_LENGTH = 64;
10
+ export const MAX_META_SIZE = 10000;
11
+ export const PING_INTERVAL_MS = 25000;
12
+ /** Pre-encoded ping payload — avoids EJSON.stringify on every tick. */
13
+ export const PING_PAYLOAD = Presentation.encode({ t: MessageType.PING });
14
+ // ---------------------------------------------------------------------------
15
+ // RPC handling
16
+ // ---------------------------------------------------------------------------
17
+ /** Handles an RPC call and sends the response correlated by `id`. */
18
+ export async function handleRpc(server, node, id, method, params) {
19
+ if (node.limiter && !node.limiter.tryRemoveTokens(1)) {
20
+ return sendResponse(node, id, undefined, Errors.RATE_LIMIT_EXCEEDED);
21
+ }
22
+ const methodInstance = server.methods.get(method);
23
+ if (!methodInstance) {
24
+ return sendResponse(node, id, undefined, Errors.METHOD_NOT_FOUND);
25
+ }
26
+ if (methodInstance.isProtected && !node.authenticated) {
27
+ return sendResponse(node, id, undefined, Errors.METHOD_FORBIDDEN);
28
+ }
29
+ try {
30
+ const result = await methodInstance.exec(params, node);
31
+ sendResponse(node, id, result);
32
+ }
33
+ catch (error) {
34
+ handleRpcError(server, node, methodInstance, error, id, method, params);
35
+ }
36
+ }
37
+ /** Handles fire-and-forget RPC calls (no response sent). */
38
+ export async function handleRpcVoid(server, node, method, params) {
39
+ if (node.limiter && !node.limiter.tryRemoveTokens(1)) {
40
+ console.warn('[TypeFerry] Rate limit exceeded for void call:', method);
41
+ return;
42
+ }
43
+ const methodInstance = server.methods.get(method);
44
+ if (!methodInstance) {
45
+ console.warn('[TypeFerry] Method not found for void call:', method);
46
+ return;
47
+ }
48
+ if (methodInstance.isProtected && !node.authenticated) {
49
+ console.warn('[TypeFerry] Method forbidden for void call:', method);
50
+ return;
51
+ }
52
+ try {
53
+ await methodInstance.exec(params, node);
54
+ }
55
+ catch (error) {
56
+ if (methodInstance.isSensitive) {
57
+ console.error(`[TypeFerry] Sensitive void method "${method}" failed`);
58
+ }
59
+ else {
60
+ console.error('[TypeFerry] Void method execution error:', error);
61
+ }
62
+ server.emit(ServerEvents.METHOD_ERROR, {
63
+ error: redactMethodTelemetry(methodInstance, error),
64
+ method,
65
+ params: redactMethodTelemetry(methodInstance, params),
66
+ userId: node.userId,
67
+ userEmail: node.context?.user?.email,
68
+ remoteAddress: node.remoteAddress,
69
+ userAgent: node.userAgent,
70
+ });
71
+ }
72
+ }
73
+ /** Sends a correlated RPC response to the client. */
74
+ export function sendResponse(node, id, result, error, errors) {
75
+ if (!node.socket || node.socket.readyState !== SocketState.OPEN)
76
+ return;
77
+ const payload = {
78
+ t: MessageType.RPC_RESPONSE,
79
+ id,
80
+ };
81
+ if (error) {
82
+ payload.error = error;
83
+ if (errors)
84
+ payload.errors = errors;
85
+ }
86
+ else {
87
+ payload.result = result;
88
+ }
89
+ node.socket.send(Presentation.encode(payload));
90
+ }
91
+ function handleRpcError(server, node, methodInstance, error, id, method, params) {
92
+ if (error instanceof PublicError) {
93
+ return sendResponse(node, id, undefined, error.message);
94
+ }
95
+ if (methodInstance.isSensitive) {
96
+ console.error(`[TypeFerry] Sensitive method "${method}" failed`);
97
+ }
98
+ else {
99
+ console.error(error);
100
+ }
101
+ server.emit(ServerEvents.METHOD_ERROR, {
102
+ error: redactMethodTelemetry(methodInstance, error),
103
+ method,
104
+ params: redactMethodTelemetry(methodInstance, params),
105
+ userId: node.userId,
106
+ userEmail: node.context?.user?.email,
107
+ remoteAddress: node.remoteAddress,
108
+ userAgent: node.userAgent,
109
+ });
110
+ if (error instanceof SchemaValidationError) {
111
+ return sendResponse(node, id, undefined, error.message, error.errors);
112
+ }
113
+ sendResponse(node, id, undefined, Errors.INTERNAL_ERROR);
114
+ }
115
+ // ---------------------------------------------------------------------------
116
+ // Authentication
117
+ // ---------------------------------------------------------------------------
118
+ /**
119
+ * Authenticates a node after connection. Guards against the node
120
+ * disconnecting during the async auth call.
121
+ */
122
+ export async function authenticateNode(server, node, token, handshakeAuthenticator, handshake) {
123
+ if (!handshakeAuthenticator && (!server.isAuthEnabled || !token)) {
124
+ node.emitAuthResult(false);
125
+ return;
126
+ }
127
+ try {
128
+ const authPromise = handshakeAuthenticator
129
+ ? Promise.resolve(handshakeAuthenticator(node, handshake ?? { path: '', headers: {}, query: {} }))
130
+ : server.auth.call(node, { token });
131
+ const timeoutPromise = new Promise((_, reject) => setTimeout(() => reject(new Error('Auth timeout')), AUTH_TIMEOUT_MS));
132
+ const result = await Promise.race([authPromise, timeoutPromise]);
133
+ if (!node.socket || node.socket.readyState !== SocketState.OPEN)
134
+ return;
135
+ if (result) {
136
+ node.authenticated = true;
137
+ node.setContext(result);
138
+ server.emit(ServerEvents.AUTHENTICATION, node);
139
+ }
140
+ node.emitAuthResult(node.authenticated);
141
+ }
142
+ catch (error) {
143
+ console.error('[TypeFerry] Auth error:', error);
144
+ if (node.socket?.readyState === SocketState.OPEN) {
145
+ node.emitAuthResult(false);
146
+ }
147
+ }
148
+ }
149
+ // ---------------------------------------------------------------------------
150
+ // Connection parameter validation
151
+ // ---------------------------------------------------------------------------
152
+ /** Validates and sanitizes a UUID from the client query string. */
153
+ export function validateUuid(uuid) {
154
+ if (typeof uuid !== 'string' ||
155
+ uuid.length === 0 ||
156
+ uuid.length > MAX_UUID_LENGTH) {
157
+ return (crypto.randomUUID?.() ??
158
+ `${Date.now()}-${Math.random().toString(36).slice(2)}`);
159
+ }
160
+ return uuid.replace(/[^a-zA-Z0-9-]/g, '').slice(0, MAX_UUID_LENGTH);
161
+ }
162
+ /** Validates and sanitizes a meta object. */
163
+ export function validateMeta(meta) {
164
+ if (!meta || typeof meta !== 'object' || Array.isArray(meta))
165
+ return {};
166
+ try {
167
+ if (JSON.stringify(meta).length > MAX_META_SIZE) {
168
+ console.warn('[TypeFerry] Meta object too large, ignoring');
169
+ return {};
170
+ }
171
+ }
172
+ catch {
173
+ return {};
174
+ }
175
+ return meta;
176
+ }
177
+ /** Parses meta from a query string value (JSON-encoded in the URL). */
178
+ export function parseMeta(raw) {
179
+ if (!raw)
180
+ return {};
181
+ try {
182
+ return validateMeta(JSON.parse(raw));
183
+ }
184
+ catch {
185
+ return {};
186
+ }
187
+ }
188
+ //# sourceMappingURL=ws-shared.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ws-shared.js","sourceRoot":"","sources":["../../../src/server/transports/ws-shared.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,5 @@
1
+ import { AsyncLocalStorage } from 'async_hooks';
2
+ /**
3
+ * https://nodejs.org/api/async_context.html
4
+ */
5
+ export declare const TypeFerryAsyncLocalStorage: AsyncLocalStorage<unknown>;
@@ -0,0 +1,6 @@
1
+ import { AsyncLocalStorage } from 'async_hooks';
2
+ /**
3
+ * https://nodejs.org/api/async_context.html
4
+ */
5
+ export const TypeFerryAsyncLocalStorage = new AsyncLocalStorage();
6
+ //# sourceMappingURL=typeferry-async-local-storage.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"typeferry-async-local-storage.js","sourceRoot":"","sources":["../../src/server/typeferry-async-local-storage.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,iBAAiB,EAAE,MAAM,aAAa,CAAA;AAE/C;;GAEG;AACH,MAAM,CAAC,MAAM,0BAA0B,GAAG,IAAI,iBAAiB,EAAE,CAAA"}
@@ -0,0 +1,27 @@
1
+ /**
2
+ * WebSocket readyState constants matching the W3C spec.
3
+ * Used instead of instance-level constants to keep the socket contract small.
4
+ */
5
+ export declare const SocketState: {
6
+ readonly CONNECTING: 0;
7
+ readonly OPEN: 1;
8
+ readonly CLOSING: 2;
9
+ readonly CLOSED: 3;
10
+ };
11
+ /**
12
+ * Minimal WebSocket interface consumed by TypeFerry server components.
13
+ */
14
+ export interface TypeFerrySocket {
15
+ readonly readyState: number;
16
+ /** Bytes accepted by the runtime but not yet flushed to the network. */
17
+ readonly bufferedAmount?: number;
18
+ send(data: string | Buffer): void;
19
+ close(code?: number, reason?: string): void;
20
+ }
21
+ /** Result of a direct server-to-client event send. */
22
+ export interface TypeFerrySendState {
23
+ /** Whether the frame was accepted by an open socket. */
24
+ readonly accepted: boolean;
25
+ /** Native bytes waiting to flush after the send. */
26
+ readonly bufferedBytes: number;
27
+ }
@@ -0,0 +1,11 @@
1
+ /**
2
+ * WebSocket readyState constants matching the W3C spec.
3
+ * Used instead of instance-level constants to keep the socket contract small.
4
+ */
5
+ export const SocketState = {
6
+ CONNECTING: 0,
7
+ OPEN: 1,
8
+ CLOSING: 2,
9
+ CLOSED: 3,
10
+ };
11
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/server/types.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,MAAM,CAAC,MAAM,WAAW,GAAG;IACzB,UAAU,EAAE,CAAC;IACb,IAAI,EAAE,CAAC;IACP,OAAO,EAAE,CAAC;IACV,MAAM,EAAE,CAAC;CACD,CAAA"}
@@ -0,0 +1,72 @@
1
+ export declare enum TypeFerryEvents {
2
+ METHOD_REFRESH = "typeferry:method:refresh",
3
+ SERVER_SENT_EVENTS_CONNECTED = "server:sent:events:connected",
4
+ COMMIT_PENDING_SUBSCRIPTIONS = "commit:pending:subscriptions",
5
+ COMMIT_PENDING_UNSUBSCRIPTIONS = "commit:pending:unsubscriptions"
6
+ }
7
+ export declare enum WebSocketEvents {
8
+ OPEN = "open",
9
+ MESSAGE = "message",
10
+ CONNECTION = "connection",
11
+ CLOSE = "close",
12
+ ERROR = "error",
13
+ CONNECT = "connect",
14
+ DISCONNECT = "disconnect"
15
+ }
16
+ export declare enum ServerEvents {
17
+ AUTHENTICATION = "authentication",
18
+ LOGOUT = "logout",
19
+ UPGRADE = "upgrade",
20
+ REQUEST = "request",
21
+ HTTP_LISTENING = "http:listening",
22
+ WEBSOCKET_LISTENING = "websocket:listening",
23
+ CONNECTION = "connection",
24
+ DISCONNECTION = "disconnection",
25
+ DISCONNECT = "disconnect",
26
+ SOCKET_ERROR = "socket:error",
27
+ ERROR = "error",
28
+ REDIS_CONNECT = "redis:connect",
29
+ READY = "ready",
30
+ METHOD_EXECUTION = "method:execution",
31
+ METHOD_ERROR = "method:error",
32
+ CLOSED = "closed",
33
+ USER_DISCONNECTED = "user:disconnected"
34
+ }
35
+ export declare enum ClientEvents {
36
+ LOGOUT = "auth:logout",
37
+ ERROR = "error",
38
+ INITIALIZING = "initializing",
39
+ INITIALIZED = "initialized",
40
+ INITIALIZATION_FAILED = "initialization:failed",
41
+ INITIALIZATION_RETRY = "initialization:retry",
42
+ CONTEXT_CHANGED = "context:changed",
43
+ OUTBOUND_MESSAGE = "outbound:message",
44
+ INBOUND_MESSAGE = "inbound:message",
45
+ CONNECTING = "connecting",
46
+ WEBSOCKET_CONNECTED = "websocket:connected",
47
+ WEBSOCKET_CLOSED = "websocket:closed",
48
+ WEBSOCKET_RECONNECTING = "websocket:reconnecting",
49
+ CLOSE = "client:close"
50
+ }
51
+ export declare enum RedisListeners {
52
+ CONNECT = "connect",
53
+ EVENTS = "events",
54
+ MESSAGE = "message"
55
+ }
56
+ export declare const TYPEFERRY_WS_PATH = "/typeferry-ws";
57
+ export declare const NO_CHANNEL = "NO_CHANNEL";
58
+ export declare const CLIENT_ID_HEADER_KEY = "x-client-id";
59
+ export declare const TOKEN_HEADER_KEY = "x-api-key";
60
+ export declare enum Methods {
61
+ RPC_LOGIN = "rpc:login",
62
+ RPC_LOGOUT = "rpc:logout",
63
+ RPC_ON = "rpc:on",
64
+ RPC_OFF = "rpc:off",
65
+ LIST_METHODS = "list:methods"
66
+ }
67
+ export declare const WebSocketState: {
68
+ CONNECTING: number;
69
+ OPEN: number;
70
+ CLOSING: number;
71
+ CLOSED: number;
72
+ };
@@ -0,0 +1,79 @@
1
+ export var TypeFerryEvents;
2
+ (function (TypeFerryEvents) {
3
+ TypeFerryEvents["METHOD_REFRESH"] = "typeferry:method:refresh";
4
+ TypeFerryEvents["SERVER_SENT_EVENTS_CONNECTED"] = "server:sent:events:connected";
5
+ TypeFerryEvents["COMMIT_PENDING_SUBSCRIPTIONS"] = "commit:pending:subscriptions";
6
+ TypeFerryEvents["COMMIT_PENDING_UNSUBSCRIPTIONS"] = "commit:pending:unsubscriptions";
7
+ })(TypeFerryEvents || (TypeFerryEvents = {}));
8
+ export var WebSocketEvents;
9
+ (function (WebSocketEvents) {
10
+ WebSocketEvents["OPEN"] = "open";
11
+ WebSocketEvents["MESSAGE"] = "message";
12
+ WebSocketEvents["CONNECTION"] = "connection";
13
+ WebSocketEvents["CLOSE"] = "close";
14
+ WebSocketEvents["ERROR"] = "error";
15
+ WebSocketEvents["CONNECT"] = "connect";
16
+ WebSocketEvents["DISCONNECT"] = "disconnect";
17
+ })(WebSocketEvents || (WebSocketEvents = {}));
18
+ export var ServerEvents;
19
+ (function (ServerEvents) {
20
+ ServerEvents["AUTHENTICATION"] = "authentication";
21
+ ServerEvents["LOGOUT"] = "logout";
22
+ ServerEvents["UPGRADE"] = "upgrade";
23
+ ServerEvents["REQUEST"] = "request";
24
+ ServerEvents["HTTP_LISTENING"] = "http:listening";
25
+ ServerEvents["WEBSOCKET_LISTENING"] = "websocket:listening";
26
+ ServerEvents["CONNECTION"] = "connection";
27
+ ServerEvents["DISCONNECTION"] = "disconnection";
28
+ ServerEvents["DISCONNECT"] = "disconnect";
29
+ ServerEvents["SOCKET_ERROR"] = "socket:error";
30
+ ServerEvents["ERROR"] = "error";
31
+ ServerEvents["REDIS_CONNECT"] = "redis:connect";
32
+ ServerEvents["READY"] = "ready";
33
+ ServerEvents["METHOD_EXECUTION"] = "method:execution";
34
+ ServerEvents["METHOD_ERROR"] = "method:error";
35
+ ServerEvents["CLOSED"] = "closed";
36
+ ServerEvents["USER_DISCONNECTED"] = "user:disconnected";
37
+ })(ServerEvents || (ServerEvents = {}));
38
+ export var ClientEvents;
39
+ (function (ClientEvents) {
40
+ ClientEvents["LOGOUT"] = "auth:logout";
41
+ ClientEvents["ERROR"] = "error";
42
+ ClientEvents["INITIALIZING"] = "initializing";
43
+ ClientEvents["INITIALIZED"] = "initialized";
44
+ ClientEvents["INITIALIZATION_FAILED"] = "initialization:failed";
45
+ ClientEvents["INITIALIZATION_RETRY"] = "initialization:retry";
46
+ ClientEvents["CONTEXT_CHANGED"] = "context:changed";
47
+ ClientEvents["OUTBOUND_MESSAGE"] = "outbound:message";
48
+ ClientEvents["INBOUND_MESSAGE"] = "inbound:message";
49
+ ClientEvents["CONNECTING"] = "connecting";
50
+ ClientEvents["WEBSOCKET_CONNECTED"] = "websocket:connected";
51
+ ClientEvents["WEBSOCKET_CLOSED"] = "websocket:closed";
52
+ ClientEvents["WEBSOCKET_RECONNECTING"] = "websocket:reconnecting";
53
+ ClientEvents["CLOSE"] = "client:close";
54
+ })(ClientEvents || (ClientEvents = {}));
55
+ export var RedisListeners;
56
+ (function (RedisListeners) {
57
+ RedisListeners["CONNECT"] = "connect";
58
+ RedisListeners["EVENTS"] = "events";
59
+ RedisListeners["MESSAGE"] = "message";
60
+ })(RedisListeners || (RedisListeners = {}));
61
+ export const TYPEFERRY_WS_PATH = '/typeferry-ws';
62
+ export const NO_CHANNEL = 'NO_CHANNEL';
63
+ export const CLIENT_ID_HEADER_KEY = 'x-client-id';
64
+ export const TOKEN_HEADER_KEY = 'x-api-key';
65
+ export var Methods;
66
+ (function (Methods) {
67
+ Methods["RPC_LOGIN"] = "rpc:login";
68
+ Methods["RPC_LOGOUT"] = "rpc:logout";
69
+ Methods["RPC_ON"] = "rpc:on";
70
+ Methods["RPC_OFF"] = "rpc:off";
71
+ Methods["LIST_METHODS"] = "list:methods";
72
+ })(Methods || (Methods = {}));
73
+ export const WebSocketState = {
74
+ CONNECTING: 0,
75
+ OPEN: 1,
76
+ CLOSING: 2,
77
+ CLOSED: 3,
78
+ };
79
+ //# sourceMappingURL=constants.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"constants.js","sourceRoot":"","sources":["../../src/utils/constants.ts"],"names":[],"mappings":"AAAA,MAAM,CAAN,IAAY,eAMX;AAND,WAAY,eAAe;IACzB,8DAA2C,CAAA;IAC3C,gFAA6D,CAAA;IAE7D,gFAA6D,CAAA;IAC7D,oFAAiE,CAAA;AACnE,CAAC,EANW,eAAe,KAAf,eAAe,QAM1B;AAED,MAAM,CAAN,IAAY,eAQX;AARD,WAAY,eAAe;IACzB,gCAAa,CAAA;IACb,sCAAmB,CAAA;IACnB,4CAAyB,CAAA;IACzB,kCAAe,CAAA;IACf,kCAAe,CAAA;IACf,sCAAmB,CAAA;IACnB,4CAAyB,CAAA;AAC3B,CAAC,EARW,eAAe,KAAf,eAAe,QAQ1B;AAED,MAAM,CAAN,IAAY,YAkBX;AAlBD,WAAY,YAAY;IACtB,iDAAiC,CAAA;IACjC,iCAAiB,CAAA;IACjB,mCAAmB,CAAA;IACnB,mCAAmB,CAAA;IACnB,iDAAiC,CAAA;IACjC,2DAA2C,CAAA;IAC3C,yCAAyB,CAAA;IACzB,+CAA+B,CAAA;IAC/B,yCAAyB,CAAA;IACzB,6CAA6B,CAAA;IAC7B,+BAAe,CAAA;IACf,+CAA+B,CAAA;IAC/B,+BAAe,CAAA;IACf,qDAAqC,CAAA;IACrC,6CAA6B,CAAA;IAC7B,iCAAiB,CAAA;IACjB,uDAAuC,CAAA;AACzC,CAAC,EAlBW,YAAY,KAAZ,YAAY,QAkBvB;AAED,MAAM,CAAN,IAAY,YAiBX;AAjBD,WAAY,YAAY;IACtB,sCAAsB,CAAA;IACtB,+BAAe,CAAA;IACf,6CAA6B,CAAA;IAC7B,2CAA2B,CAAA;IAC3B,+DAA+C,CAAA;IAC/C,6DAA6C,CAAA;IAC7C,mDAAmC,CAAA;IACnC,qDAAqC,CAAA;IACrC,mDAAmC,CAAA;IACnC,yCAAyB,CAAA;IAEzB,2DAA2C,CAAA;IAC3C,qDAAqC,CAAA;IACrC,iEAAiD,CAAA;IAEjD,sCAAsB,CAAA;AACxB,CAAC,EAjBW,YAAY,KAAZ,YAAY,QAiBvB;AAED,MAAM,CAAN,IAAY,cAIX;AAJD,WAAY,cAAc;IACxB,qCAAmB,CAAA;IACnB,mCAAiB,CAAA;IACjB,qCAAmB,CAAA;AACrB,CAAC,EAJW,cAAc,KAAd,cAAc,QAIzB;AAED,MAAM,CAAC,MAAM,iBAAiB,GAAG,eAAe,CAAA;AAEhD,MAAM,CAAC,MAAM,UAAU,GAAG,YAAY,CAAA;AAEtC,MAAM,CAAC,MAAM,oBAAoB,GAAG,aAAa,CAAA;AACjD,MAAM,CAAC,MAAM,gBAAgB,GAAG,WAAW,CAAA;AAE3C,MAAM,CAAN,IAAY,OAMX;AAND,WAAY,OAAO;IACjB,kCAAuB,CAAA;IACvB,oCAAyB,CAAA;IACzB,4BAAiB,CAAA;IACjB,8BAAmB,CAAA;IACnB,wCAA6B,CAAA;AAC/B,CAAC,EANW,OAAO,KAAP,OAAO,QAMlB;AAED,MAAM,CAAC,MAAM,cAAc,GAAG;IAC5B,UAAU,EAAE,CAAC;IACb,IAAI,EAAE,CAAC;IACP,OAAO,EAAE,CAAC;IACV,MAAM,EAAE,CAAC;CACV,CAAA"}
@@ -0,0 +1,8 @@
1
+ export declare namespace Environment {
2
+ const isNode: boolean;
3
+ const isBrowser: boolean;
4
+ const isTest: boolean;
5
+ const isDevelopment: boolean;
6
+ const canUseDOM: boolean;
7
+ const isServer: boolean;
8
+ }