Lifetime management is difficult (and very messy) for these objects because blob handles can outlive configured backend/store instances. Rather than scoping lifetimes to each config file update, lifetimes are now managed by factory instances, which allow sharing resources between backends and only releasing them when the application stops.
[CL 30846935 by ben marsh in ue5-main branch]
* IStorageBackend now includes methods for manipulating aliases and refs. All interaction with blobs is done through BlobLocators. This is the level of abstraction that the HTTP backend / controllers operate at.
* IStorageClient only manipulates blobs via handles, which abstracts any packing/compression/buffering that BundleStorageClient does.
* IBlobHandles no longer needs to include methods for partial reads, nesting, etc... Nesting of blobs within packets/bundles is now an implementation detail within the bundle storage client.
[CL 30648868 by ben marsh in ue5-main branch]
To support this, the Node base class and serialization methods have been removed, and serialization is performed through a BlobConverter<T> instance created and cached according to a BlobSerializationOptions object. Custom instances of serializers with different configurations may be registered with this object, allowing different code paths to use different serialization settings.
#jira UE-203605
[CL 30591420 by ben marsh in ue5-main branch]
- Adds a new StreamWrapper class to EpicGames.Core which wraps another stream and forwards all overridable methods to it.
- Adds an extension method to create a StreamWrapper that overrides Dispose/DisposeAsync methods to dispose of other owned resources.
[CL 29935350 by ben marsh in ue5-main branch]
* Both client and server implementations can now use the vanilla IStorageClient implementation, which now includes methods for requesting HTTP redirects.
* On the server, IStorageClient instances can be created by injecting a IStorageClientFactory instance, scoped to the request lifetime. This ensures the same configuration passed in via IOptionsSnapshot<> will be used, and any auth requests will be valid against the same configuration.
#jira
[CL 28789141 by ben marsh in ue5-main branch]