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,401 @@
1
+ import isEqual from 'fast-deep-equal';
2
+ import qs from 'query-string';
3
+ import { isEmpty, isPlainObject, merge } from '../utils/lodash.js';
4
+ import { TypeFerryEvents, ClientEvents, Environment, Errors, Methods, NO_CHANNEL, PayloadType, Presentation, TOKEN_HEADER_KEY, } from '../utils/index.js';
5
+ import { callMethodProxy } from './call-method-proxy.js';
6
+ import { ClientChannel } from './client-channel.js';
7
+ import { ClientHttp } from './client-http.js';
8
+ import { ClientSocket } from './client-socket.js';
9
+ import { ContextManager } from './context-manager.js';
10
+ import { IdleTimer } from './idle-timer.js';
11
+ import { logger, LogLevel } from './logger.js';
12
+ import { VisibilityManager } from './visibility-manager.js';
13
+ /**
14
+ * When working with Next.js, it is probably a good idea to not run this in the
15
+ * server side by using it inside a `useEffect` hook.
16
+ */
17
+ export class Client extends ClientChannel {
18
+ uuid;
19
+ clientSocket;
20
+ clientHttp;
21
+ contextManager;
22
+ errorHandler;
23
+ channels = new Map();
24
+ timeouts = new Set();
25
+ initialized = false;
26
+ authenticated = false;
27
+ options = {
28
+ host: 'localhost',
29
+ secure: false,
30
+ errorHandler: null,
31
+ debug: false,
32
+ logLevel: LogLevel.WARN,
33
+ allowedContextKeys: [],
34
+ meta: {},
35
+ };
36
+ /** Logger instance for this client */
37
+ logger = logger;
38
+ initializing;
39
+ visibilityManager;
40
+ idleTimer = null;
41
+ m;
42
+ // Note: Heartbeat is handled by application-level ping/pong in the WebSocket transport
43
+ get context() {
44
+ return this.contextManager.context;
45
+ }
46
+ set context(value) {
47
+ this.contextManager.context = value;
48
+ }
49
+ constructor(options = {}) {
50
+ super(NO_CHANNEL);
51
+ this.m = callMethodProxy(this);
52
+ this.uuid = Presentation.uuid();
53
+ this.setClient(this);
54
+ this.options = merge(this.options, options);
55
+ const storage = typeof localStorage !== 'undefined' ? localStorage : undefined;
56
+ this.contextManager = new ContextManager(storage);
57
+ this.contextManager.on(ClientEvents.CONTEXT_CHANGED, () => this.emit(ClientEvents.CONTEXT_CHANGED));
58
+ this.clientHttp = new ClientHttp(this);
59
+ this.channels.set(NO_CHANNEL, this);
60
+ /**
61
+ * The client should only ever be ready when the context is loaded,
62
+ * scheduling the client socket construction for after the context
63
+ * is first loaded does the trick as the init event is only emitted after
64
+ * the ClientSocket is built.
65
+ */
66
+ this.loadContext();
67
+ if (this.options.initialContext) {
68
+ this.setContext(this.options.initialContext);
69
+ }
70
+ this.authenticated = !!this.context.token;
71
+ this.clientSocket = new ClientSocket(this, this.options.ws);
72
+ // Configure logger level
73
+ if (this.options.logLevel !== undefined) {
74
+ this.logger.setLevel(this.options.logLevel);
75
+ }
76
+ else if (this.options.debug) {
77
+ this.logger.setLevel(LogLevel.DEBUG);
78
+ }
79
+ this.on(ClientEvents.ERROR, error => {
80
+ this.logger.connection(LogLevel.ERROR, 'Client error', { error });
81
+ });
82
+ if (Environment.isBrowser && Environment.isDevelopment) {
83
+ // @ts-ignore
84
+ window.TypeFerry = this;
85
+ }
86
+ this.connect().catch(error => {
87
+ this.logger.connection(LogLevel.ERROR, 'Connection failed', { error });
88
+ });
89
+ const { idlenessTimeout } = this.options;
90
+ this.idleTimer = idlenessTimeout
91
+ ? new IdleTimer(this, idlenessTimeout)
92
+ : null;
93
+ this.visibilityManager = new VisibilityManager(this, this.idleTimer);
94
+ }
95
+ get isConnecting() {
96
+ return !!this.clientSocket?.connecting;
97
+ }
98
+ /**
99
+ * Forces a reconnection. Useful for testing or manual recovery.
100
+ */
101
+ reconnect() {
102
+ this.visibilityManager.reconnect();
103
+ }
104
+ get isOffline() {
105
+ return !this.clientSocket?.ready;
106
+ }
107
+ get isOnline() {
108
+ return !!this.clientSocket?.ready;
109
+ }
110
+ get connected() {
111
+ return this.clientSocket.ready;
112
+ }
113
+ /**
114
+ * Opens the WebSocket connection and waits for initialization.
115
+ * Reconnection is handled entirely by ClientSocket's exponential
116
+ * backoff — this method just waits for the first successful init.
117
+ */
118
+ async connect() {
119
+ this.clientSocket.connect();
120
+ try {
121
+ await this.waitFor(ClientEvents.INITIALIZED, 30000);
122
+ }
123
+ catch (error) {
124
+ this.logger.connection(LogLevel.ERROR, 'Initialization failed', {}, error);
125
+ this.emit(ClientEvents.INITIALIZATION_FAILED, { error });
126
+ }
127
+ }
128
+ /** Delegates to ContextManager. */
129
+ loadContext() {
130
+ this.contextManager.loadContext();
131
+ }
132
+ /** Delegates to ContextManager. */
133
+ setContext(context) {
134
+ this.contextManager.setContext(context);
135
+ }
136
+ /**
137
+ * Sets context (if changed) and reconnects the socket to re-authenticate.
138
+ * Stops the current socket without triggering auto-reconnection, then
139
+ * opens a fresh connection with the new context (token in query params).
140
+ */
141
+ async setContextAndReInit(context) {
142
+ if (!isEqual(this.context, context)) {
143
+ this.setContext(context);
144
+ }
145
+ // Stop any ongoing reconnection attempts before starting fresh.
146
+ this.clientSocket.stopped = true;
147
+ this.clientSocket.clearReconnectTimer();
148
+ const oldSocket = this.clientSocket.socket;
149
+ if (oldSocket) {
150
+ oldSocket.onclose = null;
151
+ oldSocket.onerror = null;
152
+ oldSocket.onmessage = null;
153
+ oldSocket.close();
154
+ this.clientSocket.socket = undefined;
155
+ }
156
+ this.logger.auth(LogLevel.DEBUG, 'setContextAndReInit: connecting');
157
+ this.clientSocket.connect();
158
+ this.logger.auth(LogLevel.DEBUG, 'setContextAndReInit: waiting for INITIALIZED');
159
+ await this.waitFor(ClientEvents.INITIALIZED, 10000);
160
+ this.logger.auth(LogLevel.DEBUG, 'setContextAndReInit: done');
161
+ }
162
+ /** Delegates to ContextManager. */
163
+ updateContext(context) {
164
+ this.contextManager.updateContext(context);
165
+ }
166
+ /** Delegates to ContextManager. */
167
+ clearContext() {
168
+ this.contextManager.clearContext();
169
+ }
170
+ async close() {
171
+ this.emit(ClientEvents.CLOSE);
172
+ this.timeouts.forEach(timeout => clearTimeout(timeout));
173
+ this.idleTimer?.destroy();
174
+ this.visibilityManager.destroy();
175
+ // Clear event sub/unsub timeouts.
176
+ this.channels.forEach(channel => {
177
+ channel.emit(TypeFerryEvents.COMMIT_PENDING_SUBSCRIPTIONS, {});
178
+ });
179
+ this.channels.forEach(channel => {
180
+ channel.emit(TypeFerryEvents.COMMIT_PENDING_UNSUBSCRIPTIONS, {});
181
+ });
182
+ await this.clientSocket.close();
183
+ }
184
+ /**
185
+ * Initializes the client. It should be called before any other method.
186
+ *
187
+ * It should be called whenever a transport is connected, either on reconnection or from calling `connect`.
188
+ * Auth now happens during connection handshake. The authenticated state is set by AUTH_RESULT message.
189
+ */
190
+ async initialize() {
191
+ if (this.initializing) {
192
+ await this.waitFor(ClientEvents.INITIALIZED);
193
+ return;
194
+ }
195
+ this.initializing = true;
196
+ this.initialized = false;
197
+ this.loadContext();
198
+ this.emit(ClientEvents.INITIALIZING);
199
+ this.initialized = true;
200
+ this.initializing = false;
201
+ await this.resubscribeAllChannels();
202
+ this.emit(ClientEvents.INITIALIZED, this.authenticated);
203
+ return true;
204
+ }
205
+ /**
206
+ * The login method is always called via http so a http-only cookie can be set if the user so prefers.
207
+ */
208
+ async login(params, opts) {
209
+ const response = await this.call(Methods.RPC_LOGIN, params, {
210
+ ...opts,
211
+ http: true,
212
+ });
213
+ if (!response || isEmpty(response)) {
214
+ throw new Error(Errors.AUTHENTICATION_FAILED);
215
+ }
216
+ if (isPlainObject(response)) {
217
+ await this.setContextAndReInit(response);
218
+ }
219
+ }
220
+ async logout() {
221
+ await this.call(Methods.RPC_LOGOUT);
222
+ this.authenticated = false;
223
+ this.clearContext();
224
+ this.emit(ClientEvents.LOGOUT, false);
225
+ }
226
+ async resubscribeAllChannels() {
227
+ for (const [, channel] of this.channels) {
228
+ await channel.resubscribe();
229
+ }
230
+ }
231
+ async disconnect() {
232
+ return this.close();
233
+ }
234
+ /**
235
+ * Calls a method without expecting a return value (fire-and-forget).
236
+ */
237
+ void(method, params, { http, httpFallback = true } = {}) {
238
+ return new Promise((resolve, reject) => {
239
+ const payload = { method, params };
240
+ this.emit(ClientEvents.OUTBOUND_MESSAGE, payload);
241
+ if (http || (!this.clientSocket.ready && httpFallback)) {
242
+ const uuid = Presentation.uuid();
243
+ const httpPayload = {
244
+ type: PayloadType.METHOD,
245
+ uuid,
246
+ method,
247
+ params,
248
+ void: true,
249
+ };
250
+ return this.clientHttp.request(httpPayload, null, reject);
251
+ }
252
+ // Fire-and-forget: send without waiting for acknowledgment
253
+ this.clientSocket.send('rpc:void', payload);
254
+ resolve();
255
+ });
256
+ }
257
+ async waitForInitialization(timeout) {
258
+ try {
259
+ this.logger.connection(LogLevel.DEBUG, 'Waiting for initialization', {
260
+ timeout,
261
+ });
262
+ await this.waitFor(ClientEvents.INITIALIZED, Math.floor(timeout / 2));
263
+ }
264
+ catch {
265
+ throw new Error('TypeFerry: Client not initialized');
266
+ }
267
+ }
268
+ /**
269
+ * Executes a method call using WebSocket RPC or HTTP fallback.
270
+ * Uses UUID-based request/response correlation.
271
+ */
272
+ async executeCall(method, params, http, httpFallback, timeout) {
273
+ this.emit(ClientEvents.OUTBOUND_MESSAGE, { method, params });
274
+ // HTTP path: used when http=true or socket not ready with fallback enabled
275
+ if (http || (!this.clientSocket.ready && httpFallback)) {
276
+ return new Promise((resolve, reject) => {
277
+ const uuid = Presentation.uuid();
278
+ const payload = { uuid, type: PayloadType.METHOD, method, params };
279
+ this.clientHttp.request(payload, resolve, reject);
280
+ });
281
+ }
282
+ // WebSocket path: use UUID-correlated RPC
283
+ try {
284
+ return await this.clientSocket.emitWithAck('rpc', { method, params }, timeout);
285
+ }
286
+ catch (error) {
287
+ // Pass through errorHandler if configured
288
+ if (this.errorHandler) {
289
+ this.errorHandler(error);
290
+ }
291
+ throw error;
292
+ }
293
+ }
294
+ static DEFAULT_CALL_OPTIONS = {
295
+ timeout: 20000,
296
+ http: undefined,
297
+ httpFallback: true,
298
+ ignoreInit: false,
299
+ maxRetries: 0,
300
+ delayBetweenRetriesMs: 3000,
301
+ };
302
+ normalizeCallOptions(options) {
303
+ return { ...Client.DEFAULT_CALL_OPTIONS, ...options };
304
+ }
305
+ async retryCall(method, params, opts) {
306
+ let lastError;
307
+ for (let attempt = 0; attempt <= opts.maxRetries; attempt++) {
308
+ try {
309
+ return await this.executeCall(method, params, opts.http, opts.httpFallback, opts.timeout);
310
+ }
311
+ catch (error) {
312
+ lastError = error;
313
+ if (attempt > 0) {
314
+ this.logger.method(LogLevel.WARN, 'Method call retry failed', {
315
+ method,
316
+ attempt: attempt + 1,
317
+ maxRetries: opts.maxRetries,
318
+ error: error.message,
319
+ });
320
+ }
321
+ if (attempt >= opts.maxRetries)
322
+ throw lastError;
323
+ await new Promise(resolve => setTimeout(resolve, opts.delayBetweenRetriesMs));
324
+ }
325
+ }
326
+ }
327
+ async call(method, params, options) {
328
+ const opts = this.normalizeCallOptions(options);
329
+ const shouldWaitForInit = !opts.ignoreInit && !this.initialized;
330
+ if (shouldWaitForInit)
331
+ await this.waitForInitialization(opts.timeout);
332
+ return this.retryCall(method, params, opts);
333
+ }
334
+ typed(types) {
335
+ return this;
336
+ }
337
+ combine(methods) {
338
+ return this;
339
+ }
340
+ /** Handles subscription events from the server. */
341
+ handleEvent(payload) {
342
+ this.emit(ClientEvents.INBOUND_MESSAGE, payload);
343
+ this.logger.channel(LogLevel.DEBUG, 'Event received', {
344
+ channel: payload.channel,
345
+ event: payload.event,
346
+ });
347
+ return this.channel(payload.channel).emit(payload.event, payload.params);
348
+ }
349
+ /**
350
+ * Generates a URL path from string parts. The last argument can be a query
351
+ * string object definition.
352
+ */
353
+ href(...path) {
354
+ let queryString = '';
355
+ if (isPlainObject(path.at(-1))) {
356
+ const params = path.pop();
357
+ queryString = '?'.concat(qs.stringify(params));
358
+ }
359
+ if (path.some(isPlainObject))
360
+ throw new Error('Parameters are only allowed in the last argument.');
361
+ return `${this.clientHttp.host}/${path
362
+ .join('/')
363
+ .replace(/^\/|\/{2,}/, '')}${queryString}`;
364
+ }
365
+ channel(name = NO_CHANNEL) {
366
+ if (name != null &&
367
+ typeof name === 'object' &&
368
+ name.constructor.name === 'ObjectId' &&
369
+ typeof name.toString === 'function') {
370
+ name = name.toString();
371
+ }
372
+ if (!name || typeof name !== 'string')
373
+ return null;
374
+ if (name === NO_CHANNEL)
375
+ return this;
376
+ const channelName = name;
377
+ if (this.channels.has(channelName))
378
+ return this.channels.get(channelName);
379
+ const channel = new ClientChannel(channelName);
380
+ channel.setClient(this);
381
+ this.channels.set(channelName, channel);
382
+ return channel;
383
+ }
384
+ isConnected() {
385
+ return new Promise(resolve => {
386
+ if (this.connected)
387
+ return resolve(true);
388
+ this.once(ClientEvents.INITIALIZED, () => resolve(true));
389
+ });
390
+ }
391
+ fetch(url, options = {}) {
392
+ return fetch(url, {
393
+ credentials: 'include',
394
+ headers: {
395
+ [TOKEN_HEADER_KEY]: this.context.token,
396
+ },
397
+ ...options,
398
+ });
399
+ }
400
+ }
401
+ //# sourceMappingURL=client.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"client.js","sourceRoot":"","sources":["../../src/client/client.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,54 @@
1
+ import EventEmitter2 from '../utils/event-emitter.js';
2
+ /**
3
+ * Known client-side context fields used by the auth/refresh system.
4
+ * The index signature allows arbitrary additional keys while giving
5
+ * first-class types to commonly accessed properties.
6
+ */
7
+ export interface TypeFerryContext {
8
+ token?: string;
9
+ exp?: number;
10
+ iat?: number;
11
+ /** Local timestamp when the token was received — used for clock-skew-safe refresh scheduling. */
12
+ _tokenReceivedAt?: number;
13
+ [key: string]: unknown;
14
+ }
15
+ /**
16
+ * Manages client context (auth tokens, user data) with localStorage persistence
17
+ * and equality-guarded event emission. Extracted from Client to isolate context
18
+ * concerns from connection/RPC logic.
19
+ */
20
+ export declare class ContextManager extends EventEmitter2 {
21
+ private storage?;
22
+ context: TypeFerryContext;
23
+ constructor(storage?: Storage);
24
+ /**
25
+ * Restores context from localStorage. Skips the update (and the resulting
26
+ * CONTEXT_CHANGED event) when the stored context matches what's already
27
+ * in memory — prevents redundant refresh cascades during initialize().
28
+ */
29
+ loadContext(): void;
30
+ /**
31
+ * Replaces context entirely, persists to storage, and emits CONTEXT_CHANGED.
32
+ *
33
+ * Sensitive keys like `refreshToken` are stripped before persisting to
34
+ * localStorage — the refresh token lives exclusively in an HttpOnly
35
+ * cookie to prevent XSS exfiltration.
36
+ */
37
+ setContext(context: Record<string, unknown>): void;
38
+ /**
39
+ * Merges partial context into the current context and persists the result.
40
+ * Skips the update (and the resulting CONTEXT_CHANGED event) when the
41
+ * merged context is identical to the current one — prevents redundant
42
+ * event cascades that cause infinite refresh loops on unstable transports.
43
+ */
44
+ updateContext(context: Record<string, unknown>): void;
45
+ /** Resets context to empty, removes from storage, and emits CONTEXT_CHANGED. */
46
+ clearContext(): void;
47
+ }
48
+ /**
49
+ * Clock-skew-safe token expiry check. Uses `iat` + `_tokenReceivedAt` when
50
+ * available to compute elapsed time relative to when the token was received
51
+ * locally, preventing false positives when the client clock diverges from
52
+ * the server.
53
+ */
54
+ export declare function isTokenExpired(context: TypeFerryContext): boolean;
@@ -0,0 +1,89 @@
1
+ import isEqual from 'fast-deep-equal';
2
+ import { merge } from '../utils/lodash.js';
3
+ import { EJSON } from '../ejson/index.js';
4
+ import EventEmitter2 from '../utils/event-emitter.js';
5
+ import { ClientEvents } from '../utils/index.js';
6
+ const STORAGE_KEY = 'context';
7
+ /**
8
+ * Manages client context (auth tokens, user data) with localStorage persistence
9
+ * and equality-guarded event emission. Extracted from Client to isolate context
10
+ * concerns from connection/RPC logic.
11
+ */
12
+ export class ContextManager extends EventEmitter2 {
13
+ storage;
14
+ context = {};
15
+ constructor(storage) {
16
+ super({ maxListeners: 512 });
17
+ this.storage = storage;
18
+ }
19
+ /**
20
+ * Restores context from localStorage. Skips the update (and the resulting
21
+ * CONTEXT_CHANGED event) when the stored context matches what's already
22
+ * in memory — prevents redundant refresh cascades during initialize().
23
+ */
24
+ loadContext() {
25
+ if (!this.storage)
26
+ return;
27
+ const raw = this.storage.getItem(STORAGE_KEY);
28
+ if (!raw)
29
+ return;
30
+ const stored = EJSON.parse(raw);
31
+ if (isEqual(this.context, stored))
32
+ return;
33
+ this.updateContext(stored);
34
+ }
35
+ /**
36
+ * Replaces context entirely, persists to storage, and emits CONTEXT_CHANGED.
37
+ *
38
+ * Sensitive keys like `refreshToken` are stripped before persisting to
39
+ * localStorage — the refresh token lives exclusively in an HttpOnly
40
+ * cookie to prevent XSS exfiltration.
41
+ */
42
+ setContext(context) {
43
+ this.context = context;
44
+ if (this.storage) {
45
+ const { refreshToken: _, ...safe } = context;
46
+ this.storage.setItem(STORAGE_KEY, EJSON.stringify(safe));
47
+ }
48
+ this.emit(ClientEvents.CONTEXT_CHANGED);
49
+ }
50
+ /**
51
+ * Merges partial context into the current context and persists the result.
52
+ * Skips the update (and the resulting CONTEXT_CHANGED event) when the
53
+ * merged context is identical to the current one — prevents redundant
54
+ * event cascades that cause infinite refresh loops on unstable transports.
55
+ */
56
+ updateContext(context) {
57
+ const newContext = merge({}, this.context, context);
58
+ if (isEqual(this.context, newContext))
59
+ return;
60
+ this.setContext(newContext);
61
+ }
62
+ /** Resets context to empty, removes from storage, and emits CONTEXT_CHANGED. */
63
+ clearContext() {
64
+ this.context = {};
65
+ if (this.storage) {
66
+ this.storage.removeItem(STORAGE_KEY);
67
+ }
68
+ this.emit(ClientEvents.CONTEXT_CHANGED);
69
+ }
70
+ }
71
+ /**
72
+ * Clock-skew-safe token expiry check. Uses `iat` + `_tokenReceivedAt` when
73
+ * available to compute elapsed time relative to when the token was received
74
+ * locally, preventing false positives when the client clock diverges from
75
+ * the server.
76
+ */
77
+ export function isTokenExpired(context) {
78
+ const { exp, iat, _tokenReceivedAt } = context;
79
+ if (!exp)
80
+ return false;
81
+ if (iat && _tokenReceivedAt) {
82
+ const tokenTtlMs = (exp - iat) * 1000;
83
+ const elapsedMs = Date.now() - _tokenReceivedAt;
84
+ return elapsedMs > tokenTtlMs;
85
+ }
86
+ const now = Math.floor(Date.now() / 1000);
87
+ return exp < now;
88
+ }
89
+ //# sourceMappingURL=context-manager.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"context-manager.js","sourceRoot":"","sources":["../../src/client/context-manager.ts"],"names":[],"mappings":"AAAA,OAAO,OAAO,MAAM,iBAAiB,CAAA;AAErC,OAAO,EAAE,KAAK,EAAE,MAAM,iBAAiB,CAAA;AAEvC,OAAO,EAAE,KAAK,EAAE,MAAM,UAAU,CAAA;AAChC,OAAO,aAAa,MAAM,wBAAwB,CAAA;AAClD,OAAO,EAAE,YAAY,EAAE,MAAM,UAAU,CAAA;AAEvC,MAAM,WAAW,GAAG,SAAS,CAAA;AAgB7B;;;;GAIG;AACH,MAAM,OAAO,cAAe,SAAQ,aAAa;IAG3B;IAFpB,OAAO,GAAqB,EAAE,CAAA;IAE9B,YAAoB,OAAiB;QACnC,KAAK,CAAC,EAAE,YAAY,EAAE,GAAG,EAAE,CAAC,CAAA;QADV,YAAO,GAAP,OAAO,CAAU;IAErC,CAAC;IAED;;;;OAIG;IACH,WAAW;QACT,IAAI,CAAC,IAAI,CAAC,OAAO;YAAE,OAAM;QACzB,MAAM,GAAG,GAAG,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,WAAW,CAAC,CAAA;QAC7C,IAAI,CAAC,GAAG;YAAE,OAAM;QAEhB,MAAM,MAAM,GAAG,KAAK,CAAC,KAAK,CAAC,GAAG,CAA4B,CAAA;QAC1D,IAAI,OAAO,CAAC,IAAI,CAAC,OAAO,EAAE,MAAM,CAAC;YAAE,OAAM;QAEzC,IAAI,CAAC,aAAa,CAAC,MAAM,CAAC,CAAA;IAC5B,CAAC;IAED;;;;;;OAMG;IACH,UAAU,CAAC,OAAgC;QACzC,IAAI,CAAC,OAAO,GAAG,OAAO,CAAA;QAEtB,IAAI,IAAI,CAAC,OAAO,EAAE,CAAC;YACjB,MAAM,EAAE,YAAY,EAAE,CAAC,EAAE,GAAG,IAAI,EAAE,GAAG,OAAO,CAAA;YAC5C,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,WAAW,EAAE,KAAK,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC,CAAA;QAC1D,CAAC;QAED,IAAI,CAAC,IAAI,CAAC,YAAY,CAAC,eAAe,CAAC,CAAA;IACzC,CAAC;IAED;;;;;OAKG;IACH,aAAa,CAAC,OAAgC;QAC5C,MAAM,UAAU,GAAG,KAAK,CAAC,EAAE,EAAE,IAAI,CAAC,OAAO,EAAE,OAAO,CAAC,CAAA;QAEnD,IAAI,OAAO,CAAC,IAAI,CAAC,OAAO,EAAE,UAAU,CAAC;YAAE,OAAM;QAE7C,IAAI,CAAC,UAAU,CAAC,UAAU,CAAC,CAAA;IAC7B,CAAC;IAED,gFAAgF;IAChF,YAAY;QACV,IAAI,CAAC,OAAO,GAAG,EAAE,CAAA;QAEjB,IAAI,IAAI,CAAC,OAAO,EAAE,CAAC;YACjB,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,WAAW,CAAC,CAAA;QACtC,CAAC;QAED,IAAI,CAAC,IAAI,CAAC,YAAY,CAAC,eAAe,CAAC,CAAA;IACzC,CAAC;CACF;AAED;;;;;GAKG;AACH,MAAM,UAAU,cAAc,CAAC,OAAyB;IACtD,MAAM,EAAE,GAAG,EAAE,GAAG,EAAE,gBAAgB,EAAE,GAAG,OAAO,CAAA;IAC9C,IAAI,CAAC,GAAG;QAAE,OAAO,KAAK,CAAA;IAEtB,IAAI,GAAG,IAAI,gBAAgB,EAAE,CAAC;QAC5B,MAAM,UAAU,GAAG,CAAC,GAAG,GAAG,GAAG,CAAC,GAAG,IAAI,CAAA;QACrC,MAAM,SAAS,GAAG,IAAI,CAAC,GAAG,EAAE,GAAG,gBAAgB,CAAA;QAC/C,OAAO,SAAS,GAAG,UAAU,CAAA;IAC/B,CAAC;IAED,MAAM,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,IAAI,CAAC,CAAA;IACzC,OAAO,GAAG,GAAG,GAAG,CAAA;AAClB,CAAC"}
@@ -0,0 +1,35 @@
1
+ import type { Client } from './client.js';
2
+ /**
3
+ * Disconnects the client after a period of inactivity.
4
+ * Only instantiated when `idlenessTimeout` is configured.
5
+ *
6
+ * Extracted from the former IdleTimeout class to isolate idle-disconnect
7
+ * logic from visibility-based reconnection (now in VisibilityManager).
8
+ */
9
+ export declare class IdleTimer {
10
+ private client;
11
+ private timeout;
12
+ private timerId;
13
+ private resetHandler;
14
+ constructor(client: Client, timeout: number);
15
+ /** Starts the idle countdown. Fires `client.close()` when it expires. */
16
+ start(): void;
17
+ /** Clears the current idle countdown. */
18
+ stop(): void;
19
+ /**
20
+ * Resets the idle timer and reconnects if the socket is disconnected.
21
+ * Called on user activity (mousemove, keydown, etc.).
22
+ *
23
+ * Only reconnects if the socket is actually down — does NOT force
24
+ * reconnection when initialized=false, which would create loops.
25
+ */
26
+ /**
27
+ * Resets the idle timer and reconnects if the socket is disconnected.
28
+ * Defers restarting the idle countdown until after the connection is
29
+ * established to prevent the timer from firing mid-reconnect.
30
+ */
31
+ reset(): Promise<void>;
32
+ /** Removes all event listeners and cleans up resources. */
33
+ destroy(): void;
34
+ private setup;
35
+ }