Optional _logger: LDLoggerOptional Optional _backoff: Pick<DefaultBackoff, "fail" | "success">Optional Private _activePrivate _armBacks off the next write-back attempt after a failed one, and schedules that attempt at the backoff deadline.
Private _armArms a one-shot timer that warns when the write-back's store call is slow to answer. The call is never abandoned: recovery waits for its answer, however long it takes. The timer only logs. It changes no state.
Private _attemptPrivate Readonly _backoffPrivate Readonly _basePrivate _cancelPrivate _cancelPrivate _closedPrivate Optional _embargoPrivate _failurePrivate _handleRecords a failed write-back attempt: backs off the next attempt and logs.
Only the first failure of an outage logs at error level. Later failures in the same outage log at debug level, so an unhealthy store cannot flood the log every poll tick.
Private _handleRecord the result of a mirrored write to the persistence store.
The first failed write marks the store unavailable. A successful write while the store is unavailable starts recovery.
A basis write already wrote the full data set, so it recovers directly. Any other write starts a write-back of the full in-memory data set instead.
Private Optional Readonly _loggerPrivate _markPrivate _markPrivate _memoryPrivate _persistencePrivate Optional _pollPrivate _probePrivate _releaseAbandons the outstanding availability probe once it is past its deadline.
Bumps the generation so a late answer is ignored, and clears the in-flight flag so a fresh probe can be issued. Returns whether it was released.
Private _scheduleSchedules the next write-back attempt at the embargo deadline.
Without this timer, a recovery signal that arrived during the embargo, or a failed write-back with no follow-up write, could leave no later trigger: a store without an availability check has no poller, and a poller's probe can disagree with the write path. At most one timer runs. Recovery and close cancel it. A duplicate trigger with the poll tick is harmless: whichever fires second finds the attempt already in flight or the store recovered.
Private _slowPrivate Optional _slowPrivate _startPoll the persistence store availability check, when it has one, until the store recovers. Stores without an availability check recover through the next successful mirrored write instead. The check is read-only. A write is never used as a check.
Private _stopPrivate _writeWrite the full in-memory data set, including tombstones, to the persistence store. The caller must begin the attempt on _writeBackOp and pass its generation.
Private _writePrivate _writePrivate _writePrivate _writeGet all entities from a collection.
The store should filter out any entities with the property deleted: true.
The type of data to be accessed. The store should not make any assumptions about the format
of the data, but just return an object in which each key is the key property of an entity
and the value is the entity. The actual type of this parameter is
interfaces.DataKind.
Will be called with the resulting map. The actual type of the result value is
interfaces.KeyedItems<VersionedData>.
Applies the provided data onto the existing data, replacing all data or upserting depending on the basis parameter. Must call applyChanges providing basis before calling applyChanges that is not a basis.
If true, completely overwrites the current contents of the data store with the provided data. If false, upserts the items in the provided data. Upserts are made only if provided items have newer versions than existing items.
An object in which each key is the "namespace" of a collection (e.g. "features") and
the value is an object that maps keys to entities. The actual type of this parameter is
interfaces.FullDataSet<VersionedData>.
Will be called after the changes are applied.
Optional initMetadata: InitMetadataOptional metadata to initialize the feature store with.
Optional Optional selector: stringopaque string that uniquely identifies the state that contains the changes
Optional Delete an entity from the store.
Deletion should be implemented by storing a placeholder object with the property
deleted: true and a version property equal to the provided version. In other words,
it should be exactly the same as calling upsert with such an object.
The type of data to be accessed. The actual type of this parameter is interfaces.DataKind.
The unique key of the entity within the specified collection.
A number that must be greater than the version property of the existing entity in
order for it to be deleted. If it is less than or equal to the existing version, the
method should do nothing.
Will be called when the delete operation is complete.
Get an entity from the store.
The store should treat any entity with the property deleted: true as "not found".
The type of data to be accessed. The store should not make any assumptions about the format of the data, but just return a JSON object. The actual type of this parameter is interfaces.DataKind.
The unique key of the entity within the specified collection.
Will be called with the retrieved entity, or null if not found. The actual type of the result value is interfaces.VersionedData.
Get the initialization metadata of the store.
Initialize the store, overwriting any existing data.
An object in which each key is the "namespace" of a collection (e.g. "features") and
the value is an object that maps keys to entities. The actual type of this parameter is
interfaces.FullDataSet<VersionedData>.
Will be called when the store has been initialized. If the store could not apply the data, then it may be called with an error. Implementations are not required to report errors.
Tests whether the store is initialized.
"Initialized" means that the store has been populated with data, either by the client
having called init() within this process, or by another process (if this is a shared
database).
Will be called back with the boolean result.
Add an entity or update an existing entity.
The type of data to be accessed. The actual type of this parameter is interfaces.DataKind.
The contents of the entity, as an object that can be converted to JSON. The store
should check the version property of this object, and should not overwrite any
existing data if the existing version is greater than or equal to that value.
The actual type of this parameter is interfaces.VersionedData.
Will be called after the upsert operation is complete. If the store could not apply the update, then it may be called with an error. Implementations are not required to report errors.
Generated using TypeDoc
Wraps a non-transactional LDFeatureStore and makes it transactional through an in-memory store acting as a cache.
It also monitors the mirrored writes to the persistence store. A failed write marks the store unavailable. When the store recovers, this writes the full in-memory data set back to it.
At most one full-store write is in flight at a time: a new write-back starts only after the previous write-back's store call has answered. A write-back is never abandoned. Its answer, however late, decides the outcome.