* WIP publish test
* add actor based implementation, seems the most promising
* add notes into channel manager as well
* use unlimited channel on the receiver to avoid launching to send
* carry over remaining subscribers into a new flow
* dispatch errors from upstream to all downstreams
* carry over all leftovers at once to avoid starting producer before all is added to the list
* handle swapping channel managers in the consumer
This CL fixes an issue where we wouldn't unsubscribe from the right channel if
the downstream is moved between channel managers due to not receiving any event
after registering.
I've also cleaned up dispatchError to close the channel with error instead of
passing it down as if it is value and throwing again
* allow live buffering
this adds a live buffering functionality to actor publish where
it only buffers if the upstream is still running
* remove logging
* move into src
* code cleanup, more comments
* first shot at new internal store, tests pass, code ugly
* tmp builder for real internal store, starting pipeline tests
* more wip in fixing pipeline store tests, a lot to cleanup
* all tests pass
* code cleanup
* move multiplexer inside store4
* lots of cleanup of unnecessary code
* release barriers that are not used
* don't use pipeline persister.
also fixed a barrier cleanup code in source of truth with barrier
* revert simple persister as flowable change
cleanup for clearstorememorytest
* close multiplexers in fetcher controller when not used
* code style fixes
This CL avoids having two different codepaths based on whether
we skip disk cache or not. It should eventually make it easier
to implement sharing, if we decide to do it here
* Introduce StoreResponse
This CL changes Pipeline API to dispatch StoreResponse instead of Output.
It will allow us to add more metadata into it and also handle things like
source attribution and/or loading state.
This CL only makes the tests pass, does not do anything for actually dispatching
loading state
* first shot at adding a loading state
This CL adds proper StoreResponse to the built in pipelines such
that they can merge information between network and disk.
It needs some cleanup and PipelinePersister's merging logic is
fairly complicated but i couldn't yet find a simpler way to achieve it
* Add more tests to pipeline
Also fixed a bug in cached where it would emit cached value as
Loading even if no refresh is requested
* fix room sample after rebase
* Update the room sample to support refresh
Also some code cleanup in PipelinePersister
* code cleanup
* explain network + disk flow
* Change StoreResponse for plan D
This CL changes store response to act like plan D described here:
https://paper.dropbox.com/doc/Streaming-Data-How-To--AkwrNu0A7\~BikNOP2m20\~R2_AQ-oLBV39GrNimqGDe1vNQMb
Now StoreResponse has 3 types: Data, Error, Loading and each of these have an field.
Loading and Error does not carry over last data anymore, instead, it is expected downstream
to merge them for UI, if desired.
This change makes Store more verbose but i think it is the right direction to allow
developer to expand on it as desired
* update AGP to 3.6-alpha11
* update pipeline store tests to check finite streams
This CL updates PipelineStoreTest to consume the whole stream
when we expect it to finish rather than limiting the number of
dispatched items
* update RoomActivity to respect new StoreResponse
* add search to room activity
* code cleanup
* Updated coroutines to RC02 and fix Flow invariance
This PR fixes an invariance problem in side collect where it was
creating a scope and emitting from there.
* Fix KeyTracker not to lose emissions
KeyTracker would lose some emissions if they happen in rapid succession
between different keys. This new implementation maintains a separate
channel for each key to avoid that. Since we now create a channel per key,
we also need to track and clean them up to avoid consuming too much memory
This PR fixes an issue in NoOpPersister where it was using a CoroutineScope w/o
really needing one as there wasn't any actual deferred work going on. As a side
effect of that, it was flaking the StoreTest.
After this change, the test does not flake aynmore (tried by setting test to be re-run
until failure
* try delegaitng get calls to steam
* WIP handle null
This CL changes pipeline persister to handle null reader response to fetch.
This is WIP, need another fix before it can be used
* move StoreTest and StoreWithParserTest to coroutines testing lib
The test coroutine scope checks for any remaining jobs at the end of a test
which helped us find two bugs (#17, #18) both of which were discovered when
i tried to move this tests to the TestCoroutineScope after the streamOnly
change.
This change completes the move to avoid further regressions. Eventually,
we should move all tests
* remove unused get method from PipelineStore
* Fix KeyTracker subscription order
This PR fixes a race condition where if the SimplePersisterAsFlowable's write
is called inside a reader, reader wouldn't be notified again
* Fix StreamOneKeyTest
This test was passing by mistake :/. Right now, when we create the backport
Store from a Pipeline, the method skips memory cache but uses
disk cache. This test was not initializing the disk cache w/ empty value,
which meant the initial read would get first value as if it is cached and
then would also get the new value.'
The test didn't fail before because KeyTracker had a concurrency but where
it missed 1 invalidation call
This PR fixes a bug in side-collect where it was not cancelling the side
collection when main flow stops.
It still does not handle the case where side collect fails but that can only be fixed when we have error handling.
Needed to move the method to a non-private place to be able to write tests :/
StoreRequest to encapsulate the get/stream into an object that can be passed down/modified/scaled.
The suspend cache APIs became a bit weird due to supporting both implementations. We can clean it up once we have only 1 implementation.
This PR adds a cache implementation that has all APIs as suspend functions.
It uses guava's cache under the hood and handles query deduplication in a custom
Entry type that we keep in the cache
* AGP 3.5.0-beta05
* Inflight as constructor argument
* New builder class
* Rename addPersister to persister
* Rename addParser to parser
* Rename addCache to cache
* AGP 3.5.0-beta04
* Stream implementation defined in the interface
* New class StoreWrapper
* Delete StoreBuilder
* Rename plus methods
* Move stalePolicy to Persister
* Simplify code
* Move inflight request management to a new class
* Move cache management to a new class
* Move wrappers to new package
* Delete StoreWrapper class
* New test
* Restored old versions
* Restored old versions
* Restored old versions
* Restored old versions
* Restored old versions
* Restored old versions
* Add runCatching to ignore exceptions on persisters
* Backward compatible RealStoreBuilder implementation
* Fix tests