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,317 @@
1
+ import { TYPEFERRY_WS_PATH, ClientEvents, MessageType, Presentation, isAuthMessage, isEventMessage, isPingMessage, isRpcResponse, } from '../utils/index.js';
2
+ import EventEmitter2 from '../utils/event-emitter.js';
3
+ import { LogLevel } from './logger.js';
4
+ const MAX_RECONNECT_ATTEMPTS = 10;
5
+ const BASE_RECONNECT_DELAY = 500;
6
+ const MAX_RECONNECT_DELAY = 10000;
7
+ const JITTER_FACTOR = 0.5;
8
+ /**
9
+ * Native WebSocket transport for the TypeFerry client.
10
+ *
11
+ * Replaces Socket.IO with the browser's built-in WebSocket API. RPC calls
12
+ * are correlated via UUID — the client generates an `id` per call and the
13
+ * server echoes it back in the response.
14
+ *
15
+ * Reconnection uses exponential backoff (500ms → 10s, 10 attempts, 0.5
16
+ * jitter) matching the previous Socket.IO configuration.
17
+ */
18
+ export class ClientSocket extends EventEmitter2 {
19
+ client;
20
+ socket;
21
+ protocol;
22
+ uri;
23
+ stopped = false;
24
+ connecting = false;
25
+ options = {
26
+ path: TYPEFERRY_WS_PATH,
27
+ };
28
+ /** UUID-keyed map of in-flight RPC calls awaiting responses. */
29
+ pending = new Map();
30
+ reconnectAttempt = 0;
31
+ reconnectTimer;
32
+ /** Prevents infinite loop between scheduleReconnect and VisibilityManager. */
33
+ exhaustedReconnect = false;
34
+ get ready() {
35
+ return this.socket?.readyState === WebSocket.OPEN;
36
+ }
37
+ constructor(client, options = {}) {
38
+ super();
39
+ this.client = client;
40
+ Object.assign(this.options, options ?? {});
41
+ const wsProtocol = this.client.options.secure ? 'wss://' : 'ws://';
42
+ this.protocol = this.client.options.secure ? 'https://' : 'http://';
43
+ if (this.client.options.port) {
44
+ this.uri = `${wsProtocol}${this.client.options.host}:${this.client.options.port}`;
45
+ }
46
+ else {
47
+ this.uri = `${wsProtocol}${this.client.options.host}`;
48
+ }
49
+ }
50
+ /**
51
+ * Opens a socket immediately and supersedes any scheduled backoff attempt.
52
+ */
53
+ connect() {
54
+ // An explicit connection supersedes exponential backoff for the old socket.
55
+ this.clearReconnectTimer();
56
+ if (this.ready) {
57
+ this.client.logger.connection(LogLevel.WARN, 'Already connected');
58
+ return;
59
+ }
60
+ this.stopped = false;
61
+ this.connecting = true;
62
+ this.reconnectAttempt = 0;
63
+ this.client.emit(ClientEvents.CONNECTING);
64
+ this.createSocket();
65
+ }
66
+ /**
67
+ * Builds the WebSocket URL with auth data as query parameters and opens
68
+ * a new connection. Query params mirror the old `socket.handshake.auth`.
69
+ */
70
+ createSocket() {
71
+ const { token } = this.client.context ?? {};
72
+ const params = new URLSearchParams();
73
+ if (token)
74
+ params.set('token', String(token));
75
+ params.set('uuid', this.client.uuid);
76
+ const meta = this.client.options.meta;
77
+ if (meta && Object.keys(meta).length > 0) {
78
+ params.set('meta', JSON.stringify(meta));
79
+ }
80
+ const url = `${this.uri}${this.options.path}?${params.toString()}`;
81
+ const ws = new WebSocket(url);
82
+ this.socket = ws;
83
+ /**
84
+ * Event handlers are bound per-socket to prevent stale close events
85
+ * from old sockets (which fire asynchronously) from affecting the
86
+ * current connection. Each handler checks `this.socket === ws` to
87
+ * ensure it's still the active socket.
88
+ */
89
+ ws.onopen = () => {
90
+ if (this.socket === ws)
91
+ this.handleOpen();
92
+ };
93
+ ws.onmessage = (ev) => {
94
+ if (this.socket === ws)
95
+ this.handleMessage(ev.data);
96
+ };
97
+ ws.onclose = () => {
98
+ if (this.socket === ws)
99
+ this.handleClose();
100
+ };
101
+ ws.onerror = () => {
102
+ if (this.socket === ws) {
103
+ this.handleSocketError(new Error('WebSocket error'));
104
+ }
105
+ };
106
+ }
107
+ async close() {
108
+ this.stopped = true;
109
+ this.connecting = false;
110
+ this.clearReconnectTimer();
111
+ this.clearAllPending();
112
+ if (!this.socket) {
113
+ this.client.emit(ClientEvents.WEBSOCKET_CLOSED);
114
+ return;
115
+ }
116
+ if (this.socket.readyState === WebSocket.CLOSED) {
117
+ this.socket = undefined;
118
+ this.client.emit(ClientEvents.WEBSOCKET_CLOSED);
119
+ return;
120
+ }
121
+ const socketToClose = this.socket;
122
+ const closed = new Promise(resolve => {
123
+ if (!socketToClose)
124
+ return resolve();
125
+ const onClose = () => {
126
+ socketToClose.removeEventListener('close', onClose);
127
+ resolve();
128
+ };
129
+ socketToClose.addEventListener('close', onClose);
130
+ });
131
+ socketToClose.close();
132
+ await closed;
133
+ // Only clear if this is still the active socket (connect() may have
134
+ // replaced it with a new one during the async close wait).
135
+ if (this.socket === socketToClose) {
136
+ this.socket = undefined;
137
+ }
138
+ this.client.emit(ClientEvents.WEBSOCKET_CLOSED);
139
+ }
140
+ /**
141
+ * Sends a fire-and-forget RPC message (void call).
142
+ * @param data - Object containing `method` and optional `params`
143
+ */
144
+ send(_event, data) {
145
+ if (!this.ready) {
146
+ this.client.logger.connection(LogLevel.WARN, 'Socket not ready, cannot send', { ready: this.ready, connecting: this.connecting });
147
+ return;
148
+ }
149
+ this.socket?.send(Presentation.encode({
150
+ t: MessageType.RPC_VOID,
151
+ method: data.method,
152
+ params: data.params,
153
+ }));
154
+ }
155
+ /**
156
+ * Sends an RPC call and returns a promise that resolves when the server
157
+ * responds with a correlated `{ t: "rpc:res", id }` message.
158
+ *
159
+ * Uses UUID-based request correlation instead of Socket.IO acknowledgments.
160
+ */
161
+ emitWithAck(_event, data, timeout = 20000) {
162
+ return new Promise((resolve, reject) => {
163
+ if (!this.ready) {
164
+ reject(new Error('Socket not ready'));
165
+ return;
166
+ }
167
+ const id = Presentation.uuid();
168
+ const timer = setTimeout(() => {
169
+ this.pending.delete(id);
170
+ reject(new Error('Acknowledgment timeout'));
171
+ }, timeout);
172
+ this.pending.set(id, {
173
+ resolve: resolve,
174
+ reject,
175
+ timer,
176
+ });
177
+ this.socket?.send(Presentation.encode({
178
+ t: MessageType.RPC,
179
+ id,
180
+ method: data.method,
181
+ params: data.params,
182
+ }));
183
+ });
184
+ }
185
+ // ---------------------------------------------------------------------------
186
+ // Message handling
187
+ // ---------------------------------------------------------------------------
188
+ handleMessage(raw) {
189
+ try {
190
+ const msg = Presentation.decode(raw);
191
+ if (isRpcResponse(msg)) {
192
+ this.handleRpcResponse(msg);
193
+ }
194
+ else if (isEventMessage(msg)) {
195
+ this.handleTypedEvent(raw);
196
+ }
197
+ else if (isAuthMessage(msg)) {
198
+ this.handleTypedAuth(msg);
199
+ }
200
+ else if (isPingMessage(msg)) {
201
+ this.socket?.send(Presentation.encode({ t: MessageType.PONG }));
202
+ }
203
+ }
204
+ catch {
205
+ // Malformed message — ignore
206
+ }
207
+ }
208
+ /**
209
+ * Resolves or rejects the pending RPC call matching the response `id`.
210
+ */
211
+ handleRpcResponse(msg) {
212
+ const entry = this.pending.get(msg.id);
213
+ if (!entry)
214
+ return;
215
+ this.pending.delete(msg.id);
216
+ clearTimeout(entry.timer);
217
+ if (msg.error) {
218
+ entry.reject(new Error(msg.error));
219
+ }
220
+ else {
221
+ entry.resolve(msg.result);
222
+ }
223
+ }
224
+ /** Handles subscription events from the server. */
225
+ handleTypedEvent(raw) {
226
+ const payload = Presentation.decode(raw);
227
+ if (!payload)
228
+ return;
229
+ this.client.handleEvent(payload);
230
+ }
231
+ /** Handles authentication result from the server. */
232
+ handleTypedAuth(msg) {
233
+ this.client.authenticated = msg.authenticated;
234
+ this.client.initialize();
235
+ }
236
+ // ---------------------------------------------------------------------------
237
+ // Connection lifecycle
238
+ // ---------------------------------------------------------------------------
239
+ handleOpen() {
240
+ this.client.emit(ClientEvents.WEBSOCKET_CONNECTED);
241
+ this.connecting = false;
242
+ this.reconnectAttempt = 0;
243
+ this.exhaustedReconnect = false;
244
+ }
245
+ handleClose() {
246
+ this.client.initialized = false;
247
+ this.client.initializing = false;
248
+ this.rejectAllPending('Connection lost');
249
+ this.client.emit(ClientEvents.WEBSOCKET_CLOSED);
250
+ if (this.stopped) {
251
+ this.socket = undefined;
252
+ return;
253
+ }
254
+ this.scheduleReconnect();
255
+ }
256
+ handleSocketError = (error) => {
257
+ this.connecting = false;
258
+ this.client.logger.connection(LogLevel.ERROR, 'Socket error', { uri: this.uri, socketReady: this.ready }, error);
259
+ this.client.emit(ClientEvents.ERROR, error);
260
+ };
261
+ // ---------------------------------------------------------------------------
262
+ // Reconnection with exponential backoff
263
+ // ---------------------------------------------------------------------------
264
+ /**
265
+ * Schedules a reconnection attempt with exponential backoff and jitter.
266
+ * After exhausting all attempts, delegates to VisibilityManager for a
267
+ * full reconnect (token refresh + new socket). Stops after one
268
+ * VisibilityManager cycle to prevent infinite loops when the server
269
+ * is unreachable.
270
+ */
271
+ scheduleReconnect() {
272
+ if (this.stopped)
273
+ return;
274
+ this.reconnectAttempt++;
275
+ if (this.reconnectAttempt > MAX_RECONNECT_ATTEMPTS) {
276
+ if (!this.exhaustedReconnect) {
277
+ this.exhaustedReconnect = true;
278
+ this.client.visibilityManager?.reconnect();
279
+ }
280
+ return;
281
+ }
282
+ const base = Math.min(BASE_RECONNECT_DELAY * Math.pow(2, this.reconnectAttempt - 1), MAX_RECONNECT_DELAY);
283
+ const jitter = base * JITTER_FACTOR * Math.random();
284
+ const delay = base + jitter;
285
+ this.connecting = true;
286
+ this.reconnectTimer = setTimeout(() => {
287
+ this.reconnectTimer = undefined;
288
+ this.socket = undefined;
289
+ this.createSocket();
290
+ }, delay);
291
+ }
292
+ clearReconnectTimer() {
293
+ if (this.reconnectTimer) {
294
+ clearTimeout(this.reconnectTimer);
295
+ this.reconnectTimer = undefined;
296
+ }
297
+ }
298
+ /** Rejects all in-flight RPC calls on unexpected disconnect. */
299
+ rejectAllPending(reason) {
300
+ for (const [, entry] of this.pending) {
301
+ clearTimeout(entry.timer);
302
+ entry.reject(new Error(reason));
303
+ }
304
+ this.pending.clear();
305
+ }
306
+ /**
307
+ * Clears all in-flight RPC calls without rejecting during intentional close.
308
+ * Prevents unhandled rejections when callers don't `.catch()` abandoned calls.
309
+ */
310
+ clearAllPending() {
311
+ for (const [, entry] of this.pending) {
312
+ clearTimeout(entry.timer);
313
+ }
314
+ this.pending.clear();
315
+ }
316
+ }
317
+ //# sourceMappingURL=client-socket.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"client-socket.js","sourceRoot":"","sources":["../../src/client/client-socket.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,149 @@
1
+ import type { CallOptions, MethodParams, ServerMethods } from '../utils/index.js';
2
+ import { Presentation } from '../utils/index.js';
3
+ import { ClientChannel } from './client-channel.js';
4
+ import { ClientHttp } from './client-http.js';
5
+ import { ClientSocket } from './client-socket.js';
6
+ import type { TypeFerryContext } from './context-manager.js';
7
+ import { ContextManager } from './context-manager.js';
8
+ import { IdleTimer } from './idle-timer.js';
9
+ import type { TypeFerryLogger } from './logger.js';
10
+ import { LogLevel } from './logger.js';
11
+ import { VisibilityManager } from './visibility-manager.js';
12
+ type Timeout = ReturnType<typeof setTimeout>;
13
+ export type ErrorHandler = (error: Record<string, any>) => any;
14
+ export type WebSocketOptions = {
15
+ path?: string;
16
+ /**
17
+ * Workaround for Safari not reconnecting after the app is brought back to the foreground.
18
+ */
19
+ disconnectOnPageHide?: boolean;
20
+ };
21
+ export type WebSocketRequestParams = {
22
+ [x: string]: any;
23
+ [x: number]: any;
24
+ };
25
+ export type ClientOptions = {
26
+ host?: string;
27
+ port?: number;
28
+ /**
29
+ * Port for HTTP requests (login, refresh). When omitted, falls back
30
+ * to `port`. Leave undefined in dev so HTTP goes through Vite's proxy
31
+ * (same origin as page), ensuring HttpOnly cookies work correctly.
32
+ */
33
+ httpPort?: number;
34
+ secure?: boolean;
35
+ ws?: WebSocketOptions;
36
+ errorHandler?: ErrorHandler;
37
+ /** @deprecated Use logLevel instead */
38
+ debug?: boolean;
39
+ /** Log level for the client (default: WARN) */
40
+ logLevel?: LogLevel;
41
+ allowedContextKeys?: string[];
42
+ meta?: Record<string, any>;
43
+ idlenessTimeout?: number;
44
+ /**
45
+ * Initial context to set before the first WebSocket connection.
46
+ * With native WebSocket, auth data is sent as query parameters during
47
+ * connection — the token must be available at socket creation time.
48
+ */
49
+ initialContext?: Record<string, unknown>;
50
+ };
51
+ export type ProxyMethodCall = {
52
+ [key: string]: ProxyMethodCall;
53
+ } & (<T = any, R = any>(params?: MethodParams<T>, options?: CallOptions) => Promise<R>);
54
+ /**
55
+ * When working with Next.js, it is probably a good idea to not run this in the
56
+ * server side by using it inside a `useEffect` hook.
57
+ */
58
+ export declare class Client<MethodsType extends ServerMethods = ServerMethods> extends ClientChannel {
59
+ uuid: string;
60
+ clientSocket: ClientSocket;
61
+ clientHttp: ClientHttp;
62
+ contextManager: ContextManager;
63
+ errorHandler: ErrorHandler;
64
+ channels: Map<string, ClientChannel>;
65
+ timeouts: Set<Timeout>;
66
+ initialized: boolean;
67
+ authenticated: boolean;
68
+ options: ClientOptions;
69
+ /** Logger instance for this client */
70
+ logger: TypeFerryLogger;
71
+ initializing: boolean;
72
+ visibilityManager: VisibilityManager;
73
+ idleTimer: IdleTimer | null;
74
+ m: MethodsType;
75
+ get context(): TypeFerryContext;
76
+ set context(value: TypeFerryContext);
77
+ constructor(options?: ClientOptions);
78
+ get isConnecting(): boolean;
79
+ /**
80
+ * Forces a reconnection. Useful for testing or manual recovery.
81
+ */
82
+ reconnect(): void;
83
+ get isOffline(): boolean;
84
+ get isOnline(): boolean;
85
+ get connected(): boolean;
86
+ /**
87
+ * Opens the WebSocket connection and waits for initialization.
88
+ * Reconnection is handled entirely by ClientSocket's exponential
89
+ * backoff — this method just waits for the first successful init.
90
+ */
91
+ connect(): Promise<void>;
92
+ /** Delegates to ContextManager. */
93
+ loadContext(): void;
94
+ /** Delegates to ContextManager. */
95
+ setContext(context: Record<string, unknown>): void;
96
+ /**
97
+ * Sets context (if changed) and reconnects the socket to re-authenticate.
98
+ * Stops the current socket without triggering auto-reconnection, then
99
+ * opens a fresh connection with the new context (token in query params).
100
+ */
101
+ setContextAndReInit(context: Record<string, unknown>): Promise<void>;
102
+ /** Delegates to ContextManager. */
103
+ updateContext(context: Record<string, unknown>): void;
104
+ /** Delegates to ContextManager. */
105
+ clearContext(): void;
106
+ close(): Promise<void>;
107
+ /**
108
+ * Initializes the client. It should be called before any other method.
109
+ *
110
+ * It should be called whenever a transport is connected, either on reconnection or from calling `connect`.
111
+ * Auth now happens during connection handshake. The authenticated state is set by AUTH_RESULT message.
112
+ */
113
+ initialize(): Promise<boolean>;
114
+ /**
115
+ * The login method is always called via http so a http-only cookie can be set if the user so prefers.
116
+ */
117
+ login(params: WebSocketRequestParams, opts?: CallOptions): Promise<void>;
118
+ logout(): Promise<void>;
119
+ resubscribeAllChannels(): Promise<void>;
120
+ disconnect(): Promise<void>;
121
+ /**
122
+ * Calls a method without expecting a return value (fire-and-forget).
123
+ */
124
+ void<T = any>(method: string, params?: MethodParams<T>, { http, httpFallback }?: CallOptions): Promise<void>;
125
+ private waitForInitialization;
126
+ /**
127
+ * Executes a method call using WebSocket RPC or HTTP fallback.
128
+ * Uses UUID-based request/response correlation.
129
+ */
130
+ private executeCall;
131
+ private static readonly DEFAULT_CALL_OPTIONS;
132
+ private normalizeCallOptions;
133
+ private retryCall;
134
+ call<P = Record<string, any>, R = any>(method: string, params?: P, options?: CallOptions): Promise<R>;
135
+ typed<T extends ServerMethods>(types: T): Client<T>;
136
+ combine<T extends Client>(methods: T): Client<InferClientMethods<T> & MethodsType>;
137
+ /** Handles subscription events from the server. */
138
+ handleEvent(payload: Presentation.Payload): boolean;
139
+ /**
140
+ * Generates a URL path from string parts. The last argument can be a query
141
+ * string object definition.
142
+ */
143
+ href(...path: (string | Record<string, any>)[]): string;
144
+ channel(name?: string | object): ClientChannel;
145
+ isConnected(): Promise<unknown>;
146
+ fetch(url: string, options?: Record<string, unknown>): Promise<Response>;
147
+ }
148
+ export type InferClientMethods<T extends Client> = T['m'];
149
+ export {};