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,101 @@
1
+ import { throttle } from '../utils/lodash.js';
2
+ import { ClientEvents, Environment } from '../utils/index.js';
3
+ const ACTIVITY_EVENTS = [
4
+ 'focus',
5
+ 'mousemove',
6
+ 'mousedown',
7
+ 'keydown',
8
+ 'scroll',
9
+ 'touchstart',
10
+ 'pageshow',
11
+ 'pagehide',
12
+ ];
13
+ /**
14
+ * Disconnects the client after a period of inactivity.
15
+ * Only instantiated when `idlenessTimeout` is configured.
16
+ *
17
+ * Extracted from the former IdleTimeout class to isolate idle-disconnect
18
+ * logic from visibility-based reconnection (now in VisibilityManager).
19
+ */
20
+ export class IdleTimer {
21
+ client;
22
+ timeout;
23
+ timerId = null;
24
+ resetHandler = null;
25
+ constructor(client, timeout) {
26
+ this.client = client;
27
+ this.timeout = timeout;
28
+ this.setup();
29
+ }
30
+ /** Starts the idle countdown. Fires `client.close()` when it expires. */
31
+ start() {
32
+ if (typeof this.timeout !== 'number')
33
+ return;
34
+ if (!Environment.isBrowser && !Environment.isTest)
35
+ return;
36
+ this.timerId = setTimeout(() => {
37
+ this.client.close();
38
+ if (this.client.options?.debug) {
39
+ console.log('TypeFerry: Disconnected due to inactivity');
40
+ }
41
+ }, this.timeout);
42
+ }
43
+ /** Clears the current idle countdown. */
44
+ stop() {
45
+ if (this.timerId) {
46
+ clearTimeout(this.timerId);
47
+ this.timerId = null;
48
+ }
49
+ }
50
+ /**
51
+ * Resets the idle timer and reconnects if the socket is disconnected.
52
+ * Called on user activity (mousemove, keydown, etc.).
53
+ *
54
+ * Only reconnects if the socket is actually down — does NOT force
55
+ * reconnection when initialized=false, which would create loops.
56
+ */
57
+ /**
58
+ * Resets the idle timer and reconnects if the socket is disconnected.
59
+ * Defers restarting the idle countdown until after the connection is
60
+ * established to prevent the timer from firing mid-reconnect.
61
+ */
62
+ async reset() {
63
+ this.stop();
64
+ const socket = this.client.clientSocket.socket;
65
+ if (socket?.readyState === WebSocket.OPEN) {
66
+ this.start();
67
+ return;
68
+ }
69
+ this.client.clientSocket.connect();
70
+ await this.client.waitFor(ClientEvents.WEBSOCKET_CONNECTED, 10000);
71
+ this.start();
72
+ }
73
+ /** Removes all event listeners and cleans up resources. */
74
+ destroy() {
75
+ this.stop();
76
+ if (this.resetHandler) {
77
+ this.resetHandler.cancel();
78
+ }
79
+ if (typeof window !== 'undefined' && this.resetHandler) {
80
+ for (const event of ACTIVITY_EVENTS) {
81
+ window.removeEventListener(event, this.resetHandler);
82
+ }
83
+ }
84
+ this.resetHandler = null;
85
+ }
86
+ setup() {
87
+ this.client.on(ClientEvents.CLOSE, () => this.stop());
88
+ // Defer the first start so the constructor completes first
89
+ setTimeout(() => this.start(), 0);
90
+ if (typeof window === 'undefined')
91
+ return;
92
+ this.resetHandler = throttle(this.reset.bind(this), this.timeout / 2, {
93
+ leading: true,
94
+ trailing: true,
95
+ });
96
+ for (const event of ACTIVITY_EVENTS) {
97
+ window.addEventListener(event, this.resetHandler);
98
+ }
99
+ }
100
+ }
101
+ //# sourceMappingURL=idle-timer.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"idle-timer.js","sourceRoot":"","sources":["../../src/client/idle-timer.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,iBAAiB,CAAA;AAE1C,OAAO,EAAE,YAAY,EAAE,WAAW,EAAE,MAAM,UAAU,CAAA;AAMpD,MAAM,eAAe,GAAG;IACtB,OAAO;IACP,WAAW;IACX,WAAW;IACX,SAAS;IACT,QAAQ;IACR,YAAY;IACZ,UAAU;IACV,UAAU;CACX,CAAA;AAED;;;;;;GAMG;AACH,MAAM,OAAO,SAAS;IAKV;IACA;IALF,OAAO,GAAmB,IAAI,CAAA;IAC9B,YAAY,GAA6B,IAAI,CAAA;IAErD,YACU,MAAc,EACd,OAAe;QADf,WAAM,GAAN,MAAM,CAAQ;QACd,YAAO,GAAP,OAAO,CAAQ;QAEvB,IAAI,CAAC,KAAK,EAAE,CAAA;IACd,CAAC;IAED,yEAAyE;IACzE,KAAK;QACH,IAAI,OAAO,IAAI,CAAC,OAAO,KAAK,QAAQ;YAAE,OAAM;QAC5C,IAAI,CAAC,WAAW,CAAC,SAAS,IAAI,CAAC,WAAW,CAAC,MAAM;YAAE,OAAM;QAEzD,IAAI,CAAC,OAAO,GAAG,UAAU,CAAC,GAAG,EAAE;YAC7B,IAAI,CAAC,MAAM,CAAC,KAAK,EAAE,CAAA;YACnB,IAAI,IAAI,CAAC,MAAM,CAAC,OAAO,EAAE,KAAK,EAAE,CAAC;gBAC/B,OAAO,CAAC,GAAG,CAAC,2CAA2C,CAAC,CAAA;YAC1D,CAAC;QACH,CAAC,EAAE,IAAI,CAAC,OAAO,CAAC,CAAA;IAClB,CAAC;IAED,yCAAyC;IACzC,IAAI;QACF,IAAI,IAAI,CAAC,OAAO,EAAE,CAAC;YACjB,YAAY,CAAC,IAAI,CAAC,OAAO,CAAC,CAAA;YAC1B,IAAI,CAAC,OAAO,GAAG,IAAI,CAAA;QACrB,CAAC;IACH,CAAC;IAED;;;;;;OAMG;IACH;;;;OAIG;IACH,KAAK,CAAC,KAAK;QACT,IAAI,CAAC,IAAI,EAAE,CAAA;QAEX,MAAM,MAAM,GAAG,IAAI,CAAC,MAAM,CAAC,YAAY,CAAC,MAAM,CAAA;QAC9C,IAAI,MAAM,EAAE,UAAU,KAAK,SAAS,CAAC,IAAI,EAAE,CAAC;YAC1C,IAAI,CAAC,KAAK,EAAE,CAAA;YACZ,OAAM;QACR,CAAC;QAED,IAAI,CAAC,MAAM,CAAC,YAAY,CAAC,OAAO,EAAE,CAAA;QAClC,MAAM,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,YAAY,CAAC,mBAAmB,EAAE,KAAK,CAAC,CAAA;QAClE,IAAI,CAAC,KAAK,EAAE,CAAA;IACd,CAAC;IAED,2DAA2D;IAC3D,OAAO;QACL,IAAI,CAAC,IAAI,EAAE,CAAA;QAEX,IAAI,IAAI,CAAC,YAAY,EAAE,CAAC;YACtB,IAAI,CAAC,YAAY,CAAC,MAAM,EAAE,CAAA;QAC5B,CAAC;QAED,IAAI,OAAO,MAAM,KAAK,WAAW,IAAI,IAAI,CAAC,YAAY,EAAE,CAAC;YACvD,KAAK,MAAM,KAAK,IAAI,eAAe,EAAE,CAAC;gBACpC,MAAM,CAAC,mBAAmB,CAAC,KAAK,EAAE,IAAI,CAAC,YAAY,CAAC,CAAA;YACtD,CAAC;QACH,CAAC;QAED,IAAI,CAAC,YAAY,GAAG,IAAI,CAAA;IAC1B,CAAC;IAEO,KAAK;QACX,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,YAAY,CAAC,KAAK,EAAE,GAAG,EAAE,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC,CAAA;QAErD,2DAA2D;QAC3D,UAAU,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC,CAAA;QAEjC,IAAI,OAAO,MAAM,KAAK,WAAW;YAAE,OAAM;QAEzC,IAAI,CAAC,YAAY,GAAG,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,IAAI,CAAC,OAAO,GAAG,CAAC,EAAE;YACpE,OAAO,EAAE,IAAI;YACb,QAAQ,EAAE,IAAI;SACf,CAAC,CAAA;QAEF,KAAK,MAAM,KAAK,IAAI,eAAe,EAAE,CAAC;YACpC,MAAM,CAAC,gBAAgB,CAAC,KAAK,EAAE,IAAI,CAAC,YAAY,CAAC,CAAA;QACnD,CAAC;IACH,CAAC;CACF"}
@@ -0,0 +1,6 @@
1
+ export * from './client.js';
2
+ export * from './client-channel.js';
3
+ export * from './client-http.js';
4
+ export * from './client-socket.js';
5
+ export * from './context-manager.js';
6
+ export * from './logger.js';
@@ -0,0 +1,7 @@
1
+ export * from './client.js';
2
+ export * from './client-channel.js';
3
+ export * from './client-http.js';
4
+ export * from './client-socket.js';
5
+ export * from './context-manager.js';
6
+ export * from './logger.js';
7
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/client/index.ts"],"names":[],"mappings":"AAAA,cAAc,UAAU,CAAA;AACxB,cAAc,kBAAkB,CAAA;AAChC,cAAc,eAAe,CAAA;AAC7B,cAAc,iBAAiB,CAAA;AAC/B,cAAc,mBAAmB,CAAA;AACjC,cAAc,UAAU,CAAA"}
@@ -0,0 +1,76 @@
1
+ /**
2
+ * Centralized logging for TypeFerry client.
3
+ * Provides structured logging with categories and levels for easier debugging.
4
+ */
5
+ export declare enum LogLevel {
6
+ DEBUG = 0,
7
+ INFO = 1,
8
+ WARN = 2,
9
+ ERROR = 3,
10
+ SILENT = 4
11
+ }
12
+ export declare enum LogCategory {
13
+ CONNECTION = "connection",
14
+ AUTH = "auth",
15
+ METHOD = "method",
16
+ SUBSCRIPTION = "subscription",
17
+ CHANNEL = "channel"
18
+ }
19
+ export interface LogEntry {
20
+ level: LogLevel;
21
+ category: LogCategory;
22
+ message: string;
23
+ context?: Record<string, unknown>;
24
+ error?: Error;
25
+ timestamp: number;
26
+ }
27
+ export type LogListener = (entry: LogEntry) => void;
28
+ /**
29
+ * Logger for TypeFerry client with structured logging support.
30
+ *
31
+ * @example
32
+ * ```ts
33
+ * const logger = new TypeFerryLogger()
34
+ * logger.setLevel(LogLevel.DEBUG)
35
+ *
36
+ * // Subscribe to all logs
37
+ * const unsubscribe = logger.onLog(entry => {
38
+ * // Send to external service
39
+ * })
40
+ *
41
+ * // Log with context
42
+ * logger.method(LogLevel.ERROR, 'Method call failed', {
43
+ * method: 'boards.get',
44
+ * timeout: 30000,
45
+ * })
46
+ * ```
47
+ */
48
+ export declare class TypeFerryLogger {
49
+ private level;
50
+ private listeners;
51
+ /**
52
+ * Set the minimum log level. Messages below this level are ignored.
53
+ */
54
+ setLevel(level: LogLevel): void;
55
+ /**
56
+ * Get the current log level.
57
+ */
58
+ getLevel(): LogLevel;
59
+ /**
60
+ * Subscribe to log entries.
61
+ * Returns an unsubscribe function.
62
+ */
63
+ onLog(listener: LogListener): () => void;
64
+ /**
65
+ * Core logging method.
66
+ */
67
+ log(entry: Omit<LogEntry, 'timestamp'>): void;
68
+ private output;
69
+ connection(level: LogLevel, message: string, context?: Record<string, unknown>, error?: Error): void;
70
+ auth(level: LogLevel, message: string, context?: Record<string, unknown>, error?: Error): void;
71
+ method(level: LogLevel, message: string, context?: Record<string, unknown>, error?: Error): void;
72
+ subscription(level: LogLevel, message: string, context?: Record<string, unknown>, error?: Error): void;
73
+ channel(level: LogLevel, message: string, context?: Record<string, unknown>, error?: Error): void;
74
+ }
75
+ /** Shared logger instance for the TypeFerry client. */
76
+ export declare const logger: TypeFerryLogger;
@@ -0,0 +1,129 @@
1
+ /**
2
+ * Centralized logging for TypeFerry client.
3
+ * Provides structured logging with categories and levels for easier debugging.
4
+ */
5
+ export var LogLevel;
6
+ (function (LogLevel) {
7
+ LogLevel[LogLevel["DEBUG"] = 0] = "DEBUG";
8
+ LogLevel[LogLevel["INFO"] = 1] = "INFO";
9
+ LogLevel[LogLevel["WARN"] = 2] = "WARN";
10
+ LogLevel[LogLevel["ERROR"] = 3] = "ERROR";
11
+ LogLevel[LogLevel["SILENT"] = 4] = "SILENT";
12
+ })(LogLevel || (LogLevel = {}));
13
+ export var LogCategory;
14
+ (function (LogCategory) {
15
+ LogCategory["CONNECTION"] = "connection";
16
+ LogCategory["AUTH"] = "auth";
17
+ LogCategory["METHOD"] = "method";
18
+ LogCategory["SUBSCRIPTION"] = "subscription";
19
+ LogCategory["CHANNEL"] = "channel";
20
+ })(LogCategory || (LogCategory = {}));
21
+ /**
22
+ * Logger for TypeFerry client with structured logging support.
23
+ *
24
+ * @example
25
+ * ```ts
26
+ * const logger = new TypeFerryLogger()
27
+ * logger.setLevel(LogLevel.DEBUG)
28
+ *
29
+ * // Subscribe to all logs
30
+ * const unsubscribe = logger.onLog(entry => {
31
+ * // Send to external service
32
+ * })
33
+ *
34
+ * // Log with context
35
+ * logger.method(LogLevel.ERROR, 'Method call failed', {
36
+ * method: 'boards.get',
37
+ * timeout: 30000,
38
+ * })
39
+ * ```
40
+ */
41
+ export class TypeFerryLogger {
42
+ level = LogLevel.WARN;
43
+ listeners = new Set();
44
+ /**
45
+ * Set the minimum log level. Messages below this level are ignored.
46
+ */
47
+ setLevel(level) {
48
+ this.level = level;
49
+ }
50
+ /**
51
+ * Get the current log level.
52
+ */
53
+ getLevel() {
54
+ return this.level;
55
+ }
56
+ /**
57
+ * Subscribe to log entries.
58
+ * Returns an unsubscribe function.
59
+ */
60
+ onLog(listener) {
61
+ this.listeners.add(listener);
62
+ return () => {
63
+ this.listeners.delete(listener);
64
+ };
65
+ }
66
+ /**
67
+ * Core logging method.
68
+ */
69
+ log(entry) {
70
+ if (entry.level < this.level)
71
+ return;
72
+ const fullEntry = { ...entry, timestamp: Date.now() };
73
+ this.output(fullEntry);
74
+ this.listeners.forEach(listener => listener(fullEntry));
75
+ }
76
+ output(entry) {
77
+ const prefix = `[TypeFerry:${entry.category}]`;
78
+ const args = [prefix, entry.message];
79
+ if (entry.context)
80
+ args.push(entry.context);
81
+ if (entry.error)
82
+ args.push(entry.error);
83
+ switch (entry.level) {
84
+ case LogLevel.DEBUG:
85
+ console.debug(...args);
86
+ break;
87
+ case LogLevel.INFO:
88
+ console.log(...args);
89
+ break;
90
+ case LogLevel.WARN:
91
+ console.warn(...args);
92
+ break;
93
+ case LogLevel.ERROR:
94
+ console.error(...args);
95
+ break;
96
+ }
97
+ }
98
+ // Category-specific convenience methods
99
+ connection(level, message, context, error) {
100
+ this.log({
101
+ level,
102
+ category: LogCategory.CONNECTION,
103
+ message,
104
+ context,
105
+ error,
106
+ });
107
+ }
108
+ auth(level, message, context, error) {
109
+ this.log({ level, category: LogCategory.AUTH, message, context, error });
110
+ }
111
+ method(level, message, context, error) {
112
+ this.log({ level, category: LogCategory.METHOD, message, context, error });
113
+ }
114
+ subscription(level, message, context, error) {
115
+ this.log({
116
+ level,
117
+ category: LogCategory.SUBSCRIPTION,
118
+ message,
119
+ context,
120
+ error,
121
+ });
122
+ }
123
+ channel(level, message, context, error) {
124
+ this.log({ level, category: LogCategory.CHANNEL, message, context, error });
125
+ }
126
+ }
127
+ /** Shared logger instance for the TypeFerry client. */
128
+ export const logger = new TypeFerryLogger();
129
+ //# sourceMappingURL=logger.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"logger.js","sourceRoot":"","sources":["../../src/client/logger.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,62 @@
1
+ import type { Client } from './client.js';
2
+ import type { IdleTimer } from './idle-timer.js';
3
+ /**
4
+ * Handles tab visibility changes and reconnects after browser/OS sleep.
5
+ * Always instantiated — visibility recovery is always active regardless
6
+ * of whether idle timeout is configured.
7
+ *
8
+ * Uses both `visibilitychange` events and a setInterval heartbeat to
9
+ * detect sleep. macOS may not fire `visibilitychange` before idle-triggered
10
+ * sleep, so the heartbeat catches gaps the event misses.
11
+ */
12
+ export declare class VisibilityManager {
13
+ private client;
14
+ private idleTimer;
15
+ /**
16
+ * Optional async hook called before reconnecting after tab visibility restore.
17
+ * Used by the auth system to proactively refresh expired access tokens so the
18
+ * socket reconnects with a valid token instead of failing auth first.
19
+ */
20
+ onBeforeReconnect: (() => Promise<void>) | null;
21
+ private visibilityHandler;
22
+ private hiddenAt;
23
+ private heartbeatTimer;
24
+ private lastHeartbeat;
25
+ /**
26
+ * Guards against duplicate reconnects when both the heartbeat and
27
+ * visibilitychange fire in quick succession after wake.
28
+ */
29
+ private reconnecting;
30
+ constructor(client: Client, idleTimer: IdleTimer | null);
31
+ /**
32
+ * Tears down the existing socket and creates a fresh connection.
33
+ * After tab sleep, the socket may be in a stale state — so we always
34
+ * do a full cleanup before reconnecting.
35
+ */
36
+ reconnect(): void;
37
+ /** Removes all listeners and timers to prevent memory leaks. */
38
+ destroy(): void;
39
+ private setup;
40
+ private startHeartbeat;
41
+ private stopHeartbeat;
42
+ private handlePageHide;
43
+ /**
44
+ * Unified entry point for sleep detection from both the heartbeat
45
+ * timer and `visibilitychange`. Uses `reconnecting` to prevent
46
+ * duplicate reconnects when both fire after wake.
47
+ */
48
+ private handleSleepDetected;
49
+ /**
50
+ * Runs the pre-reconnect hook with bounded retries (WiFi may take
51
+ * seconds to reconnect after wake), then reconnects. Falls back to
52
+ * reconnecting even if all retry attempts fail.
53
+ */
54
+ private runHookAndReconnect;
55
+ /**
56
+ * Determines whether reconnection is needed and triggers it. Routes
57
+ * through `handleSleepDetected` for deduplication with the heartbeat.
58
+ */
59
+ private handlePageVisible;
60
+ /** Promisified delay for hook retry backoff. */
61
+ private delay;
62
+ }
@@ -0,0 +1,177 @@
1
+ import { ClientEvents } from '../utils/index.js';
2
+ /**
3
+ * Time threshold below which we trust the socket connection is healthy.
4
+ * If hidden for less than this, we only reconnect if the socket is actually
5
+ * disconnected.
6
+ */
7
+ const FORCE_RECONNECT_THRESHOLD = 60 * 60 * 1000; // 1 hour
8
+ /** Heartbeat fires every 30s to detect OS sleep gaps. */
9
+ const HEARTBEAT_INTERVAL_MS = 30_000;
10
+ /** If the gap between heartbeats exceeds 2x the interval, we were sleeping. */
11
+ const HEARTBEAT_THRESHOLD_MS = 60_000;
12
+ /** Max retry attempts for the pre-reconnect hook (network may not be ready on wake). */
13
+ const HOOK_RETRY_ATTEMPTS = 3;
14
+ /** Delay between hook retry attempts in ms. */
15
+ const HOOK_RETRY_DELAY_MS = 2_000;
16
+ /**
17
+ * Handles tab visibility changes and reconnects after browser/OS sleep.
18
+ * Always instantiated — visibility recovery is always active regardless
19
+ * of whether idle timeout is configured.
20
+ *
21
+ * Uses both `visibilitychange` events and a setInterval heartbeat to
22
+ * detect sleep. macOS may not fire `visibilitychange` before idle-triggered
23
+ * sleep, so the heartbeat catches gaps the event misses.
24
+ */
25
+ export class VisibilityManager {
26
+ client;
27
+ idleTimer;
28
+ /**
29
+ * Optional async hook called before reconnecting after tab visibility restore.
30
+ * Used by the auth system to proactively refresh expired access tokens so the
31
+ * socket reconnects with a valid token instead of failing auth first.
32
+ */
33
+ onBeforeReconnect = null;
34
+ visibilityHandler = null;
35
+ hiddenAt = null;
36
+ heartbeatTimer = null;
37
+ lastHeartbeat = Date.now();
38
+ /**
39
+ * Guards against duplicate reconnects when both the heartbeat and
40
+ * visibilitychange fire in quick succession after wake.
41
+ */
42
+ reconnecting = false;
43
+ constructor(client, idleTimer) {
44
+ this.client = client;
45
+ this.idleTimer = idleTimer;
46
+ this.setup();
47
+ }
48
+ /**
49
+ * Tears down the existing socket and creates a fresh connection.
50
+ * After tab sleep, the socket may be in a stale state — so we always
51
+ * do a full cleanup before reconnecting.
52
+ */
53
+ reconnect() {
54
+ const wasInitialized = this.client.initialized;
55
+ this.client.initialized = false;
56
+ this.client.initializing = false;
57
+ const existingSocket = this.client.clientSocket.socket;
58
+ if (existingSocket) {
59
+ existingSocket.close();
60
+ this.client.clientSocket.socket = undefined;
61
+ }
62
+ this.client.clientSocket.connect();
63
+ this.lastHeartbeat = Date.now();
64
+ this.reconnecting = false;
65
+ if (wasInitialized) {
66
+ this.client.emit(ClientEvents.WEBSOCKET_RECONNECTING);
67
+ }
68
+ }
69
+ /** Removes all listeners and timers to prevent memory leaks. */
70
+ destroy() {
71
+ if (typeof document !== 'undefined' && this.visibilityHandler) {
72
+ document.removeEventListener('visibilitychange', this.visibilityHandler);
73
+ }
74
+ this.visibilityHandler = null;
75
+ this.stopHeartbeat();
76
+ }
77
+ setup() {
78
+ if (typeof window === 'undefined')
79
+ return;
80
+ this.visibilityHandler = () => {
81
+ if (document.visibilityState === 'hidden') {
82
+ this.hiddenAt = Date.now();
83
+ this.handlePageHide();
84
+ }
85
+ else if (document.visibilityState === 'visible') {
86
+ this.handlePageVisible();
87
+ }
88
+ };
89
+ document.addEventListener('visibilitychange', this.visibilityHandler);
90
+ this.startHeartbeat();
91
+ }
92
+ startHeartbeat() {
93
+ this.lastHeartbeat = Date.now();
94
+ this.heartbeatTimer = setInterval(() => {
95
+ const now = Date.now();
96
+ const gap = now - this.lastHeartbeat;
97
+ this.lastHeartbeat = now;
98
+ if (gap > HEARTBEAT_THRESHOLD_MS) {
99
+ this.handleSleepDetected('heartbeat', gap);
100
+ }
101
+ }, HEARTBEAT_INTERVAL_MS);
102
+ }
103
+ stopHeartbeat() {
104
+ if (this.heartbeatTimer) {
105
+ clearInterval(this.heartbeatTimer);
106
+ this.heartbeatTimer = null;
107
+ }
108
+ }
109
+ handlePageHide() {
110
+ if (this.client.options?.ws?.disconnectOnPageHide) {
111
+ this.client.close();
112
+ if (this.client.options?.debug) {
113
+ console.log('TypeFerry: Disconnected on page hide');
114
+ }
115
+ }
116
+ }
117
+ /**
118
+ * Unified entry point for sleep detection from both the heartbeat
119
+ * timer and `visibilitychange`. Uses `reconnecting` to prevent
120
+ * duplicate reconnects when both fire after wake.
121
+ */
122
+ handleSleepDetected(source, durationMs) {
123
+ if (this.reconnecting)
124
+ return;
125
+ this.reconnecting = true;
126
+ if (this.client.options?.debug) {
127
+ console.log(`TypeFerry: Sleep detected via ${source} (${Math.round(durationMs / 1000)}s gap), reconnecting`);
128
+ }
129
+ this.runHookAndReconnect();
130
+ }
131
+ /**
132
+ * Runs the pre-reconnect hook with bounded retries (WiFi may take
133
+ * seconds to reconnect after wake), then reconnects. Falls back to
134
+ * reconnecting even if all retry attempts fail.
135
+ */
136
+ async runHookAndReconnect() {
137
+ if (this.onBeforeReconnect) {
138
+ for (let attempt = 0; attempt < HOOK_RETRY_ATTEMPTS; attempt++) {
139
+ try {
140
+ await this.onBeforeReconnect();
141
+ break;
142
+ }
143
+ catch {
144
+ const isLastAttempt = attempt === HOOK_RETRY_ATTEMPTS - 1;
145
+ if (!isLastAttempt) {
146
+ await this.delay(HOOK_RETRY_DELAY_MS);
147
+ }
148
+ }
149
+ }
150
+ }
151
+ this.reconnect();
152
+ }
153
+ /**
154
+ * Determines whether reconnection is needed and triggers it. Routes
155
+ * through `handleSleepDetected` for deduplication with the heartbeat.
156
+ */
157
+ handlePageVisible() {
158
+ const hiddenDuration = this.hiddenAt ? Date.now() - this.hiddenAt : 0;
159
+ this.hiddenAt = null;
160
+ const socket = this.client.clientSocket.socket;
161
+ const isConnected = socket?.readyState === WebSocket.OPEN && this.client.initialized;
162
+ const needsReconnect = !isConnected || hiddenDuration > FORCE_RECONNECT_THRESHOLD;
163
+ if (needsReconnect) {
164
+ this.handleSleepDetected('visibility', hiddenDuration);
165
+ return;
166
+ }
167
+ if (this.idleTimer) {
168
+ this.idleTimer.stop();
169
+ this.idleTimer.start();
170
+ }
171
+ }
172
+ /** Promisified delay for hook retry backoff. */
173
+ delay(ms) {
174
+ return new Promise(resolve => setTimeout(resolve, ms));
175
+ }
176
+ }
177
+ //# sourceMappingURL=visibility-manager.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"visibility-manager.js","sourceRoot":"","sources":["../../src/client/visibility-manager.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1 @@
1
+ export declare const adjustTypesFromJSONValue: (obj: any) => any;
@@ -0,0 +1,35 @@
1
+ /**
2
+ * for both arrays and objects. Tries its best to just
3
+ * use the object you hand it, but may return something
4
+ * different if the object you hand it itself needs changing.
5
+ */
6
+ import { fromJSONValueHelper } from './helpers/from-json-value-helper.js';
7
+ import { isObject, keysOf } from './utils.js';
8
+ export const adjustTypesFromJSONValue = obj => {
9
+ if (obj === null) {
10
+ return null;
11
+ }
12
+ const maybeChanged = fromJSONValueHelper(obj);
13
+ if (maybeChanged !== obj) {
14
+ return maybeChanged;
15
+ }
16
+ // Other atoms are unchanged.
17
+ if (!isObject(obj)) {
18
+ return obj;
19
+ }
20
+ keysOf(obj).forEach(key => {
21
+ const value = obj[key];
22
+ if (isObject(value)) {
23
+ const changed = fromJSONValueHelper(value);
24
+ if (value !== changed) {
25
+ obj[key] = changed;
26
+ return;
27
+ }
28
+ // if we get here, value is an object but not adjustable
29
+ // at this level. recurse.
30
+ adjustTypesFromJSONValue(value);
31
+ }
32
+ });
33
+ return obj;
34
+ };
35
+ //# sourceMappingURL=adjust-types-from-json-value.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"adjust-types-from-json-value.js","sourceRoot":"","sources":["../../src/ejson/adjust-types-from-json-value.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AACH,OAAO,EAAE,mBAAmB,EAAE,MAAM,kCAAkC,CAAA;AACtE,OAAO,EAAE,QAAQ,EAAE,MAAM,EAAE,MAAM,SAAS,CAAA;AAE1C,MAAM,CAAC,MAAM,wBAAwB,GAAG,GAAG,CAAC,EAAE;IAC5C,IAAI,GAAG,KAAK,IAAI,EAAE,CAAC;QACjB,OAAO,IAAI,CAAA;IACb,CAAC;IAED,MAAM,YAAY,GAAG,mBAAmB,CAAC,GAAG,CAAC,CAAA;IAC7C,IAAI,YAAY,KAAK,GAAG,EAAE,CAAC;QACzB,OAAO,YAAY,CAAA;IACrB,CAAC;IAED,6BAA6B;IAC7B,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE,CAAC;QACnB,OAAO,GAAG,CAAA;IACZ,CAAC;IAED,MAAM,CAAC,GAAG,CAAC,CAAC,OAAO,CAAC,GAAG,CAAC,EAAE;QACxB,MAAM,KAAK,GAAG,GAAG,CAAC,GAAG,CAAC,CAAA;QACtB,IAAI,QAAQ,CAAC,KAAK,CAAC,EAAE,CAAC;YACpB,MAAM,OAAO,GAAG,mBAAmB,CAAC,KAAK,CAAC,CAAA;YAC1C,IAAI,KAAK,KAAK,OAAO,EAAE,CAAC;gBACtB,GAAG,CAAC,GAAG,CAAC,GAAG,OAAO,CAAA;gBAClB,OAAM;YACR,CAAC;YACD,wDAAwD;YACxD,2BAA2B;YAC3B,wBAAwB,CAAC,KAAK,CAAC,CAAA;QACjC,CAAC;IACH,CAAC,CAAC,CAAA;IACF,OAAO,GAAG,CAAA;AACZ,CAAC,CAAA"}
@@ -0,0 +1,11 @@
1
+ import { newBinary } from './utils.js';
2
+ /**
3
+ * Encodes binary payloads for EJSON without relying on a CJS-only dependency
4
+ * that breaks browser ESM loading in source-first consumers.
5
+ */
6
+ export declare function encodeBase64(bytes: Uint8Array): string;
7
+ /**
8
+ * Decodes EJSON base64 payloads while preserving the legacy polyfill
9
+ * behavior for runtimes without `Uint8Array`.
10
+ */
11
+ export declare function decodeBase64(value: string): Uint8Array | ReturnType<typeof newBinary>;