-
Notifications
You must be signed in to change notification settings - Fork 1.2k
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Subscription mode #1263
Subscription mode #1263
Conversation
This pull request is automatically built and testable in CodeSandbox. To see build info of the built libraries, click here or the icon next to each commit SHA. Latest deployment of this branch, based on commit 54dfaee:
|
Is this likely to get merged in soon? Subscriptions would be really useful for us |
We're trying to get it into 1.1 or 1.2. But shortly we'd love to collect more use cases of subscription pattern in real world apps so that this API can be well abstract. If there're feedback from you would be very appreciated |
Happy to help if I can. We're using subscriptions to have live data changes on multiple devices. We're using a graphql endpoint and currently have subscriptions set up like in this project. However, they don't handle the disposal of the websockets. I've been trying (and struggling) to implement my own disposal system using a similar hook to yours except it returns the dispose function with the data so that it can be called in the callback of a useEffect like:
|
Thanks! Yeah we still have a couple of concerns:
Overall I think we can try to launch this in version 1.1/1.2 as an unstable API, and polish it overtime. |
At first glance this looks interesting and could be useful. I've not used it before though so would need to read deeper into it to understand it.
I think the subscription mode would need its own set of config options. Some of those options wouldn't just be unusable but unnecessary too. I can't think of a reason why you would need to use polling with a subscription for example. For now it could just be a subset of the current SWR configs though it may need its own options adding in time.
I could see this being useful though probably not necessary for an initial release. I agree about launching this as an unstable API and polishing it over time. |
Is this still going to be delivered? |
Thank you for updating this! To push this forward, we need to set some minimal requirements to get this stable (under a flag or prefixed with unstable_). Here’re my thoughts:
|
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Looks like a good implementation for an initial unstable release! I think the ref counting approach should work with concurrent rendering, but let’s see..
I like the idea of this and i am currently trying to use SWR as a cache for WebSocket connections. In my use case I want to stash all incoming messages and use them as a log. With this current API I can only update the data with the incoming data. It would be nice if there was access to the current saved data through the next function to update the current data with old data and keep the cache. I don't know if this should be a use case for this hook and just wanted to give feedback. Thanks for the work on this. |
@feledori you can always save some complex object in the cache instead of array, something like:
|
@huozhi hey! Any info on which milestone will include this, following 2.0? |
Would love to see this merged! Is my assumption correct, that this can be used with grpc? |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Let's go!
[![Mend Renovate](https://app.renovatebot.com/images/banner.svg)](https://renovatebot.com) This PR contains the following updates: | Package | Change | Age | Adoption | Passing | Confidence | |---|---|---|---|---|---| | [swr](https://swr.vercel.app) ([source](https://github.com/vercel/swr)) | [`2.0.3` -> `2.1.0`](https://renovatebot.com/diffs/npm/swr/2.0.3/2.1.0) | [![age](https://badges.renovateapi.com/packages/npm/swr/2.1.0/age-slim)](https://docs.renovatebot.com/merge-confidence/) | [![adoption](https://badges.renovateapi.com/packages/npm/swr/2.1.0/adoption-slim)](https://docs.renovatebot.com/merge-confidence/) | [![passing](https://badges.renovateapi.com/packages/npm/swr/2.1.0/compatibility-slim/2.0.3)](https://docs.renovatebot.com/merge-confidence/) | [![confidence](https://badges.renovateapi.com/packages/npm/swr/2.1.0/confidence-slim/2.0.3)](https://docs.renovatebot.com/merge-confidence/) | --- ### Release Notes <details> <summary>vercel/swr</summary> ### [`v2.1.0`](https://github.com/vercel/swr/releases/tag/v2.1.0) [Compare Source](https://github.com/vercel/swr/compare/v2.0.4...v2.1.0) #### Feature - Subscription mode by [@​huozhi](https://github.com/huozhi) in [https://github.com/vercel/swr/pull/1263](https://github.com/vercel/swr/pull/1263) - parallel option for useSWRInfinite by [@​koba04](https://github.com/koba04) in [https://github.com/vercel/swr/pull/2404](https://github.com/vercel/swr/pull/2404) Checkout [subscription docs](https://swr.vercel.app/docs/subscription) and [useSWRInfinite parallel fetching docs](https://swr.vercel.app/docs/pagination#parallel-fetching-mode) for more details #### Patches - fix: use the latest config in useSWRMutation by [@​koba04](https://github.com/koba04) in [https://github.com/vercel/swr/pull/2468](https://github.com/vercel/swr/pull/2468) - Fix: type support for suspense and fallbackData([#​2396](https://github.com/vercel/swr/issues/2396)) by [@​taro-28](https://github.com/taro-28) in [https://github.com/vercel/swr/pull/2452](https://github.com/vercel/swr/pull/2452) - Error should be reset when new data comes by [@​huozhi](https://github.com/huozhi) in [https://github.com/vercel/swr/pull/2472](https://github.com/vercel/swr/pull/2472) - fix: avoid creating new snapshot if cache is not updated at client during streaming by [@​promer94](https://github.com/promer94) in [https://github.com/vercel/swr/pull/2475](https://github.com/vercel/swr/pull/2475) - refactor: initialize the cache only on first access by [@​promer94](https://github.com/promer94) in [https://github.com/vercel/swr/pull/2479](https://github.com/vercel/swr/pull/2479) #### Misc - ci: fix publish workflow by [@​promer94](https://github.com/promer94) in [https://github.com/vercel/swr/pull/2453](https://github.com/vercel/swr/pull/2453) - ci: faster e2e test by [@​promer94](https://github.com/promer94) in [https://github.com/vercel/swr/pull/2428](https://github.com/vercel/swr/pull/2428) - test: add a test for keepPreviousData without changing key by [@​koba04](https://github.com/koba04) in [https://github.com/vercel/swr/pull/2470](https://github.com/vercel/swr/pull/2470) - Always assume subscriptions will return sub count from current key by [@​huozhi](https://github.com/huozhi) in [https://github.com/vercel/swr/pull/2460](https://github.com/vercel/swr/pull/2460) - test: Fix flaky e2e test by [@​promer94](https://github.com/promer94) in [https://github.com/vercel/swr/pull/2476](https://github.com/vercel/swr/pull/2476) - chore: Add subscription example by [@​huozhi](https://github.com/huozhi) in [https://github.com/vercel/swr/pull/2480](https://github.com/vercel/swr/pull/2480) #### New Contributors - [@​taro-28](https://github.com/taro-28) made their first contribution in [https://github.com/vercel/swr/pull/2452](https://github.com/vercel/swr/pull/2452) **Full Changelog**: vercel/swr@v2.0.4...v2.1.0 ### [`v2.0.4`](https://github.com/vercel/swr/releases/tag/v2.0.4) [Compare Source](https://github.com/vercel/swr/compare/v2.0.3...v2.0.4) #### Patches - build: fix release job condition by [@​huozhi](https://github.com/huozhi) in [https://github.com/vercel/swr/pull/2392](https://github.com/vercel/swr/pull/2392) - types: fix some mutation type issue by [@​promer94](https://github.com/promer94) in [https://github.com/vercel/swr/pull/2421](https://github.com/vercel/swr/pull/2421) - fix: Error retry should be handled by global revalidator instead of local revalidation function by [@​promer94](https://github.com/promer94) in [https://github.com/vercel/swr/pull/2415](https://github.com/vercel/swr/pull/2415) - fix: ensure initCache setter function stays within bounds of subscriptions by [@​lfbergee](https://github.com/lfbergee) in [https://github.com/vercel/swr/pull/2411](https://github.com/vercel/swr/pull/2411) #### Misc - test: stream ssr e2e by [@​promer94](https://github.com/promer94) in [https://github.com/vercel/swr/pull/2395](https://github.com/vercel/swr/pull/2395) - test: fix an act warning by [@​koba04](https://github.com/koba04) in [https://github.com/vercel/swr/pull/2403](https://github.com/vercel/swr/pull/2403) #### New Contributors - [@​lfbergee](https://github.com/lfbergee) made their first contribution in [https://github.com/vercel/swr/pull/2411](https://github.com/vercel/swr/pull/2411) **Full Changelog**: vercel/swr@v2.0.3...v2.0.4 </details> --- ### Configuration 📅 **Schedule**: Branch creation - At any time (no schedule defined), Automerge - At any time (no schedule defined). 🚦 **Automerge**: Disabled by config. Please merge this manually once you are satisfied. ♻ **Rebasing**: Whenever PR becomes conflicted, or you tick the rebase/retry checkbox. 🔕 **Ignore**: Close this PR and you won't be reminded about this update again. --- - [ ] <!-- rebase-check -->If you want to rebase/retry this PR, check this box --- This PR has been generated by [Mend Renovate](https://www.mend.io/free-developer-tools/renovate/). View repository job log [here](https://app.renovatebot.com/dashboard#github/kula-app/OnLaunch). <!--renovate-debug:eyJjcmVhdGVkSW5WZXIiOiIzNS44LjMiLCJ1cGRhdGVkSW5WZXIiOiIzNS44LjMifQ==-->
[![Mend Renovate](https://app.renovatebot.com/images/banner.svg)](https://renovatebot.com) This PR contains the following updates: | Package | Change | Age | Adoption | Passing | Confidence | |---|---|---|---|---|---| | [swr](https://swr.vercel.app) ([source](https://github.com/vercel/swr)) | [`2.0.4` -> `2.1.5`](https://renovatebot.com/diffs/npm/swr/2.0.4/2.1.5) | [![age](https://badges.renovateapi.com/packages/npm/swr/2.1.5/age-slim)](https://docs.renovatebot.com/merge-confidence/) | [![adoption](https://badges.renovateapi.com/packages/npm/swr/2.1.5/adoption-slim)](https://docs.renovatebot.com/merge-confidence/) | [![passing](https://badges.renovateapi.com/packages/npm/swr/2.1.5/compatibility-slim/2.0.4)](https://docs.renovatebot.com/merge-confidence/) | [![confidence](https://badges.renovateapi.com/packages/npm/swr/2.1.5/confidence-slim/2.0.4)](https://docs.renovatebot.com/merge-confidence/) | --- ### Release Notes <details> <summary>vercel/swr</summary> ### [`v2.1.5`](https://github.com/vercel/swr/releases/tag/v2.1.5) [Compare Source](https://github.com/vercel/swr/compare/v2.1.4...v2.1.5) #### What's Changed - fix: missing interop helpers in bundle by [@​huozhi](https://github.com/huozhi) in [https://github.com/vercel/swr/pull/2582](https://github.com/vercel/swr/pull/2582) **Full Changelog**: vercel/swr@v2.1.4...v2.1.5 ### [`v2.1.4`](https://github.com/vercel/swr/releases/tag/v2.1.4) [Compare Source](https://github.com/vercel/swr/compare/v2.1.3...v2.1.4) #### What's Changed - Upgrade bundler by [@​huozhi](https://github.com/huozhi) in [https://github.com/vercel/swr/pull/2557](https://github.com/vercel/swr/pull/2557) - examples: fix invalid links by [@​fxOne](https://github.com/fxOne) in [https://github.com/vercel/swr/pull/2559](https://github.com/vercel/swr/pull/2559) - types: Allow auto-import by improving generated types by [@​oosawy](https://github.com/oosawy) in [https://github.com/vercel/swr/pull/2563](https://github.com/vercel/swr/pull/2563) - fix: pass serialized args to preload fetcher by [@​oosawy](https://github.com/oosawy) in [https://github.com/vercel/swr/pull/2564](https://github.com/vercel/swr/pull/2564) - chore: use provenance for release by [@​HerringtonDarkholme](https://github.com/HerringtonDarkholme) in [https://github.com/vercel/swr/pull/2571](https://github.com/vercel/swr/pull/2571) - deps: update [@​testing-library/react](https://github.com/testing-library/react) to v14 by [@​koba04](https://github.com/koba04) in [https://github.com/vercel/swr/pull/2578](https://github.com/vercel/swr/pull/2578) - fix: Fix dependency tracking and useSES bug by [@​shuding](https://github.com/shuding) and [@​promer94](https://github.com/promer94) in [https://github.com/vercel/swr/pull/2576](https://github.com/vercel/swr/pull/2576) #### New Contributors - [@​fxOne](https://github.com/fxOne) made their first contribution in [https://github.com/vercel/swr/pull/2559](https://github.com/vercel/swr/pull/2559) - [@​oosawy](https://github.com/oosawy) made their first contribution in [https://github.com/vercel/swr/pull/2563](https://github.com/vercel/swr/pull/2563) - [@​HerringtonDarkholme](https://github.com/HerringtonDarkholme) made their first contribution in [https://github.com/vercel/swr/pull/2571](https://github.com/vercel/swr/pull/2571) **Full Changelog**: vercel/swr@v2.1.3...v2.1.4 ### [`v2.1.3`](https://github.com/vercel/swr/releases/tag/v2.1.3) [Compare Source](https://github.com/vercel/swr/compare/v2.1.2...v2.1.3) #### What's Changed - Fix [#​2548](https://github.com/vercel/swr/issues/2548): pass origin key to subcription callback by [@​Zheaoli](https://github.com/Zheaoli) in [https://github.com/vercel/swr/pull/2550](https://github.com/vercel/swr/pull/2550) - Examples: fix type in axios-typescript example by [@​daochouwangu](https://github.com/daochouwangu) in [https://github.com/vercel/swr/pull/2552](https://github.com/vercel/swr/pull/2552) - Update Cache Interface types by [@​dmmulroy](https://github.com/dmmulroy) in [https://github.com/vercel/swr/pull/2554](https://github.com/vercel/swr/pull/2554) - fix: data passed to refreshInterval function is not latest by [@​hong24](https://github.com/hong24) in [https://github.com/vercel/swr/pull/2354](https://github.com/vercel/swr/pull/2354) - types: allow passing function as `Data` for `useSWRSubscriptionOptions` by [@​promer94](https://github.com/promer94) in [https://github.com/vercel/swr/pull/2551](https://github.com/vercel/swr/pull/2551) #### New Contributors - [@​Zheaoli](https://github.com/Zheaoli) made their first contribution in [https://github.com/vercel/swr/pull/2550](https://github.com/vercel/swr/pull/2550) - [@​daochouwangu](https://github.com/daochouwangu) made their first contribution in [https://github.com/vercel/swr/pull/2552](https://github.com/vercel/swr/pull/2552) - [@​dmmulroy](https://github.com/dmmulroy) made their first contribution in [https://github.com/vercel/swr/pull/2554](https://github.com/vercel/swr/pull/2554) **Full Changelog**: vercel/swr@v2.1.2...v2.1.3 ### [`v2.1.2`](https://github.com/vercel/swr/releases/tag/v2.1.2) [Compare Source](https://github.com/vercel/swr/compare/v2.1.1...v2.1.2) ##### Patches - Improved type inferring for `swr/subscription` - Adding `SWRSubscriptionOptions` type for `swr/subscription` #### Changes - test: add typing test for empty config by [@​koba04](https://github.com/koba04) in [https://github.com/vercel/swr/pull/2521](https://github.com/vercel/swr/pull/2521) - test: fix syntax error in Equal type alias implementation by [@​SACHINnANYAKKARA](https://github.com/SACHINnANYAKKARA) in [https://github.com/vercel/swr/pull/2517](https://github.com/vercel/swr/pull/2517) - chore: remove engines by [@​promer94](https://github.com/promer94) in [https://github.com/vercel/swr/pull/2536](https://github.com/vercel/swr/pull/2536) - types: improve `useSWRSubscription` types by [@​promer94](https://github.com/promer94) in [https://github.com/vercel/swr/pull/2535](https://github.com/vercel/swr/pull/2535) - Rename subscription types by [@​huozhi](https://github.com/huozhi) in [https://github.com/vercel/swr/pull/2537](https://github.com/vercel/swr/pull/2537) #### New Contributors - [@​SACHINnANYAKKARA](https://github.com/SACHINnANYAKKARA) made their first contribution in [https://github.com/vercel/swr/pull/2517](https://github.com/vercel/swr/pull/2517) **Full Changelog**: vercel/swr@v2.1.1...v2.1.2 ### [`v2.1.1`](https://github.com/vercel/swr/releases/tag/v2.1.1) [Compare Source](https://github.com/vercel/swr/compare/v2.1.0...v2.1.1) #### Patches - refactor: remove useless dataRef, always compare cached data by [@​promer94](https://github.com/promer94) in [https://github.com/vercel/swr/pull/2431](https://github.com/vercel/swr/pull/2431) - fix: swr infers incorrect `data` type for default `SWRConfig` generic type by [@​connorch](https://github.com/connorch) in [https://github.com/vercel/swr/pull/2506](https://github.com/vercel/swr/pull/2506) #### Documentation - docs: update subscription example by [@​huozhi](https://github.com/huozhi) in [https://github.com/vercel/swr/pull/2499](https://github.com/vercel/swr/pull/2499) #### New Contributors - [@​connorch](https://github.com/connorch) made their first contribution in [https://github.com/vercel/swr/pull/2506](https://github.com/vercel/swr/pull/2506) **Full Changelog**: vercel/swr@v2.1.0...v2.1.1 ### [`v2.1.0`](https://github.com/vercel/swr/releases/tag/v2.1.0) [Compare Source](https://github.com/vercel/swr/compare/v2.0.4...v2.1.0) #### Feature - Subscription mode by [@​huozhi](https://github.com/huozhi) in [https://github.com/vercel/swr/pull/1263](https://github.com/vercel/swr/pull/1263) - parallel option for useSWRInfinite by [@​koba04](https://github.com/koba04) in [https://github.com/vercel/swr/pull/2404](https://github.com/vercel/swr/pull/2404) Checkout [subscription docs](https://swr.vercel.app/docs/subscription) and [useSWRInfinite parallel fetching docs](https://swr.vercel.app/docs/pagination#parallel-fetching-mode) for more details #### Patches - fix: use the latest config in useSWRMutation by [@​koba04](https://github.com/koba04) in [https://github.com/vercel/swr/pull/2468](https://github.com/vercel/swr/pull/2468) - Fix: type support for suspense and fallbackData([#​2396](https://github.com/vercel/swr/issues/2396)) by [@​taro-28](https://github.com/taro-28) in [https://github.com/vercel/swr/pull/2452](https://github.com/vercel/swr/pull/2452) - Error should be reset when new data comes by [@​huozhi](https://github.com/huozhi) in [https://github.com/vercel/swr/pull/2472](https://github.com/vercel/swr/pull/2472) - fix: avoid creating new snapshot if cache is not updated at client during streaming by [@​promer94](https://github.com/promer94) in [https://github.com/vercel/swr/pull/2475](https://github.com/vercel/swr/pull/2475) - refactor: initialize the cache only on first access by [@​promer94](https://github.com/promer94) in [https://github.com/vercel/swr/pull/2479](https://github.com/vercel/swr/pull/2479) #### Misc - ci: fix publish workflow by [@​promer94](https://github.com/promer94) in [https://github.com/vercel/swr/pull/2453](https://github.com/vercel/swr/pull/2453) - ci: faster e2e test by [@​promer94](https://github.com/promer94) in [https://github.com/vercel/swr/pull/2428](https://github.com/vercel/swr/pull/2428) - test: add a test for keepPreviousData without changing key by [@​koba04](https://github.com/koba04) in [https://github.com/vercel/swr/pull/2470](https://github.com/vercel/swr/pull/2470) - Always assume subscriptions will return sub count from current key by [@​huozhi](https://github.com/huozhi) in [https://github.com/vercel/swr/pull/2460](https://github.com/vercel/swr/pull/2460) - test: Fix flaky e2e test by [@​promer94](https://github.com/promer94) in [https://github.com/vercel/swr/pull/2476](https://github.com/vercel/swr/pull/2476) - chore: Add subscription example by [@​huozhi](https://github.com/huozhi) in [https://github.com/vercel/swr/pull/2480](https://github.com/vercel/swr/pull/2480) #### New Contributors - [@​taro-28](https://github.com/taro-28) made their first contribution in [https://github.com/vercel/swr/pull/2452](https://github.com/vercel/swr/pull/2452) **Full Changelog**: vercel/swr@v2.0.4...v2.1.0 </details> --- ### Configuration 📅 **Schedule**: Branch creation - At any time (no schedule defined), Automerge - At any time (no schedule defined). 🚦 **Automerge**: Enabled. ♻ **Rebasing**: Whenever PR becomes conflicted, or you tick the rebase/retry checkbox. 🔕 **Ignore**: Close this PR and you won't be reminded about this update again. --- - [ ] <!-- rebase-check -->If you want to rebase/retry this PR, check this box --- This PR has been generated by [Mend Renovate](https://www.mend.io/free-developer-tools/renovate/). View repository job log [here](https://app.renovatebot.com/dashboard#github/Unleash/unleash). <!--renovate-debug:eyJjcmVhdGVkSW5WZXIiOiIzNS42OS4zIiwidXBkYXRlZEluVmVyIjoiMzUuNjkuMyIsInRhcmdldEJyYW5jaCI6Im1haW4ifQ==--> Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
To support subscription / disposable / observable data source, adding a new hook useSWRSubscription built on top of useSWR.
API
the purpose is to provider users enough flexibility to manage their own subscription/disposable on user land, but still keep the argument shape different from function type fetcher.
Usage