Docs
Query State Machine

Query State Machine

FloppyDisk tracks two things separately:

  • Is it running? โ†’ isPending
  • What's the result? โ†’ state

They are independent.

This is how the query state transition flow looks like:

   initial                                                              failed, won't retry
 โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”                                       โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”
 โ”‚ isPending: false           โ”‚                                      โ– โ”‚ isPending: false           โ”‚
 โ”‚ isRevalidating: false      โ”‚                                       โ”‚ isRevalidating: false      โ”‚
 โ”‚                            โ”‚                  โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ–ถ โ”‚                            โ”‚
 โ”‚ state: "INITIAL"           โ”‚                  โ”‚                   โ– โ”‚ state: "ERROR"             โ”‚
 โ”‚ isSuccess: false           โ”‚                  โ”‚                    โ”‚ isSuccess: false           โ”‚
 โ”‚ data: undefined            โ”‚                  โ”‚                    โ”‚ data: undefined            โ”‚
 โ”‚ dataUpdatedAt: undefined   โ”‚                  โ”‚                    โ”‚ dataUpdatedAt: undefined   โ”‚
 โ”‚ dataStaleAt: undefined     โ”‚                  โ”‚                    โ”‚ dataStaleAt: undefined     โ”‚
 โ”‚ isError: false             โ”‚                  โ”‚                   โ– โ”‚ isError: true              โ”‚
 โ”‚ error: undefined           โ”‚                  โ”‚                   โ– โ”‚ error: <TError>            โ”‚
 โ”‚ errorUpdatedAt: undefined  โ”‚                  โ”‚                   โ– โ”‚ errorUpdatedAt: <number>   โ”‚
 โ”‚                            โ”‚                  โ”‚                    โ”‚                            โ”‚
 โ”‚ willRetryAt: undefined     โ”‚                  โ”‚                    โ”‚ willRetryAt: undefined     โ”‚
 โ”‚ isRetrying: false          โ”‚                  โ”‚                   โ€ขโ”‚ isRetrying: false          โ”‚
 โ”‚ retryCount: 0              โ”‚                  โ”‚                   โ€ขโ”‚ retryCount: 0 (reset)      โ”‚
 โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜                  โ”‚                    โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜
               โ”‚                                 โ”‚
               โ”‚ execute                         โ”‚
               โ–ผ                                 โ”‚                      waiting retry delay
 โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”                 (N)                   โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”
โ– โ”‚ isPending: true         [ฦ’]โ”‚                  โ”‚                   โ– โ”‚ isPending: false           โ”‚
 โ”‚ isRevalidating: false      โ”‚    fail          โ”‚                    โ”‚ isRevalidating: false      โ”‚
 โ”‚                            โ”œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ–ถ Should retry? โ”€โ”€โ”€โ”€(Y)โ”€โ”€โ”€โ”€โ–ถ โ”‚                            โ”‚
 โ”‚ state: "INITIAL"           โ”‚                  โ–ฒ                    โ”‚ state: "INITIAL"           โ”‚
 โ”‚ isSuccess: false           โ”‚                  โ”‚                    โ”‚ isSuccess: false           โ”‚
 โ”‚ data: undefined            โ”‚                  โ”‚                    โ”‚ data: undefined            โ”‚
 โ”‚ dataUpdatedAt: undefined   โ”‚                  โ”‚                    โ”‚ dataUpdatedAt: undefined   โ”‚
 โ”‚ dataStaleAt: undefined     โ”‚                  โ”‚                    โ”‚ dataStaleAt: undefined     โ”‚
 โ”‚ isError: false             โ”‚                  โ”‚                    โ”‚ isError: false             โ”‚
 โ”‚ error: undefined           โ”‚                  โ”‚                    โ”‚ error: undefined           โ”‚
 โ”‚ errorUpdatedAt: undefined  โ”‚                  โ”‚                    โ”‚ errorUpdatedAt: undefined  โ”‚
 โ”‚                            โ”‚                  โ”‚                    โ”‚                            โ”‚
 โ”‚ willRetryAt: undefined     โ”‚                  โ”‚                   โ– โ”‚ willRetryAt: <number>      โ”‚
 โ”‚ isRetrying: false          โ”‚                  โ”‚                    โ”‚ isRetrying: false          โ”‚
 โ”‚ retryCount: 0              โ”‚                  โ”‚                    โ”‚ retryCount: <number>       โ”‚
 โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜                  โ”‚                    โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜
               โ”‚                                 โ”‚                                  โ”‚
               โ”‚ success                         โ”‚                                  โ”‚ retrying
               โ–ผ                                 โ”‚                                  โ–ผ
 โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”                  โ”‚                    โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”
โ– โ”‚ isPending: false           โ”‚                  โ”‚                   โ– โ”‚ isPending: true         [ฦ’]โ”‚
 โ”‚ isRevalidating: false      โ”‚                  โ”‚            fail    โ”‚ isRevalidating: false      โ”‚
 โ”‚                            โ”‚                  โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ค                            โ”‚
โ– โ”‚ state: "SUCCESS"           โ”‚                                       โ”‚ state: "INITIAL"           โ”‚
โ– โ”‚ isSuccess: true            โ”‚                                       โ”‚ isSuccess: false           โ”‚
โ– โ”‚ data: <TData>              โ”‚                                       โ”‚ data: undefined            โ”‚
โ– โ”‚ dataUpdatedAt: <number>    โ”‚                                       โ”‚ dataUpdatedAt: undefined   โ”‚
โ– โ”‚ dataStaleAt: <number>      โ”‚                                       โ”‚ dataStaleAt: undefined     โ”‚
 โ”‚ isError: false             โ”‚                                       โ”‚ isError: false             โ”‚
 โ”‚ error: undefined           โ”‚                                       โ”‚ error: undefined           โ”‚
 โ”‚ errorUpdatedAt: undefined  โ”‚                            success    โ”‚ errorUpdatedAt: undefined  โ”‚
 โ”‚                            โ”‚ โ—€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ค                            โ”‚
 โ”‚ willRetryAt: undefined     โ”‚                                      โ– โ”‚ willRetryAt: undefined     โ”‚
โ€ขโ”‚ isRetrying: false          โ”‚                                      โ– โ”‚ isRetrying: true           โ”‚
โ€ขโ”‚ retryCount: 0 (reset)      โ”‚                                      โ– โ”‚ retryCount: <number> (+1)  โ”‚
 โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜                                       โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜

And then after success:

   success                                                              failed, won't retry
 โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”                                       โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”
 โ”‚ isPending: false           โ”‚                                      โ– โ”‚ isPending: false                        โ”‚
 โ”‚ isRevalidating: false      โ”‚                                      โ– โ”‚ isRevalidating: false                   โ”‚
 โ”‚                            โ”‚                  โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ–ถ โ”‚                                         โ”‚
 โ”‚ state: "SUCCESS"           โ”‚                  โ”‚                   โ– โ”‚ state: "SUCCESS_BUT_REVALIDATION_ERROR" โ”‚
 โ”‚ isSuccess: true            โ”‚                  โ”‚                    โ”‚ isSuccess: true                         โ”‚
 โ”‚ data: <TData>              โ”‚                  โ”‚                    โ”‚ data: <TData>                           โ”‚
 โ”‚ dataUpdatedAt: <number>    โ”‚                  โ”‚                    โ”‚ dataUpdatedAt: <number>                 โ”‚
 โ”‚ dataStaleAt: <number>      โ”‚                  โ”‚                    โ”‚ dataStaleAt: <number>                   โ”‚
 โ”‚ isError: false             โ”‚                  โ”‚                    โ”‚ isError: false                          โ”‚
 โ”‚ error: undefined           โ”‚                  โ”‚                   โ– โ”‚ error: <TError>                         โ”‚
 โ”‚ errorUpdatedAt: undefined  โ”‚                  โ”‚                   โ– โ”‚ errorUpdatedAt: <number>                โ”‚
 โ”‚                            โ”‚                  โ”‚                    โ”‚                                         โ”‚
 โ”‚ willRetryAt: undefined     โ”‚                  โ”‚                    โ”‚ willRetryAt: undefined                  โ”‚
 โ”‚ isRetrying: false          โ”‚                  โ”‚                   โ€ขโ”‚ isRetrying: false                       โ”‚
 โ”‚ retryCount: 0              โ”‚                  โ”‚                   โ€ขโ”‚ retryCount: 0 (reset)                   โ”‚
 โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜                  โ”‚                    โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜
               โ”‚                                 โ”‚
               โ”‚ revalidate                      โ”‚
               โ–ผ                                 โ”‚                      waiting retry delay
 โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”                 (N)                   โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”
โ– โ”‚ isPending: true         [ฦ’]โ”‚                  โ”‚                   โ– โ”‚ isPending: false           โ”‚
โ– โ”‚ isRevalidating: true       โ”‚    fail          โ”‚                   โ– โ”‚ isRevalidating: false      โ”‚
 โ”‚                            โ”œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ–ถ Should retry? โ”€โ”€โ”€โ”€(Y)โ”€โ”€โ”€โ”€โ–ถ โ”‚                            โ”‚
 โ”‚ state: "SUCCESS"           โ”‚                  โ–ฒ                    โ”‚ state: "SUCCESS"           โ”‚
 โ”‚ isSuccess: true            โ”‚                  โ”‚                    โ”‚ isSuccess: true            โ”‚
 โ”‚ data: <TData>              โ”‚                  โ”‚                    โ”‚ data: <TData>              โ”‚
 โ”‚ dataUpdatedAt: <number>    โ”‚                  โ”‚                    โ”‚ dataUpdatedAt: <number>    โ”‚
 โ”‚ dataStaleAt: <number>      โ”‚                  โ”‚                    โ”‚ dataStaleAt: <number>      โ”‚
 โ”‚ isError: false             โ”‚                  โ”‚                    โ”‚ isError: false             โ”‚
 โ”‚ error: undefined           โ”‚                  โ”‚                    โ”‚ error: undefined           โ”‚
 โ”‚ errorUpdatedAt: undefined  โ”‚                  โ”‚                    โ”‚ errorUpdatedAt: undefined  โ”‚
 โ”‚                            โ”‚                  โ”‚                    โ”‚                            โ”‚
 โ”‚ willRetryAt: undefined     โ”‚                  โ”‚                   โ– โ”‚ willRetryAt: <number>      โ”‚
 โ”‚ isRetrying: false          โ”‚                  โ”‚                    โ”‚ isRetrying: false          โ”‚
 โ”‚ retryCount: 0              โ”‚                  โ”‚                    โ”‚ retryCount: <number>       โ”‚
 โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜                  โ”‚                    โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜
               โ”‚                                 โ”‚                                  โ”‚
               โ”‚ success                         โ”‚                                  โ”‚ retrying
               โ–ผ                                 โ”‚                                  โ–ผ
 โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”                  โ”‚                    โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”
โ– โ”‚ isPending: false           โ”‚                  โ”‚                   โ– โ”‚ isPending: true         [ฦ’]โ”‚
โ– โ”‚ isRevalidating: false      โ”‚                  โ”‚            fail   โ– โ”‚ isRevalidating: true       โ”‚
 โ”‚                            โ”‚                  โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ค                            โ”‚
 โ”‚ state: "SUCCESS"           โ”‚                                       โ”‚ state: "SUCCESS"           โ”‚
 โ”‚ isSuccess: true            โ”‚                                       โ”‚ isSuccess: true            โ”‚
โ– โ”‚ data: <TData>              โ”‚                                       โ”‚ data: <TData>              โ”‚
โ– โ”‚ dataUpdatedAt: <number>    โ”‚                                       โ”‚ dataUpdatedAt: <number>    โ”‚
โ– โ”‚ dataStaleAt: <number>      โ”‚                                       โ”‚ dataStaleAt: <number>      โ”‚
 โ”‚ isError: false             โ”‚                                       โ”‚ isError: false             โ”‚
 โ”‚ error: undefined           โ”‚                                       โ”‚ error: undefined           โ”‚
 โ”‚ errorUpdatedAt: undefined  โ”‚                            success    โ”‚ errorUpdatedAt: undefined  โ”‚
 โ”‚                            โ”‚ โ—€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ค                            โ”‚
 โ”‚ willRetryAt: undefined     โ”‚                                      โ– โ”‚ willRetryAt: undefined     โ”‚
โ€ขโ”‚ isRetrying: false          โ”‚                                      โ– โ”‚ isRetrying: true           โ”‚
โ€ขโ”‚ retryCount: 0 (reset)      โ”‚                                      โ– โ”‚ retryCount: <number> (+1)  โ”‚
 โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜                                       โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜