- ADD React
useRxDocument(collection, primaryKey)hook for subscribing to a single document by primary key with live updates - ADD React
useReplicationStatus(replicationState)hook that exposessyncing,error,lastSyncedAt, andcanceledfrom replication observables - DOCS Mark
liveQueryUpdateThrottleTimeas a beta feature in the documentation - DOCS Move the main
liveQueryUpdateThrottleTimedocumentation torx-query.md;rx-database.mdandrx-collection.mdnow only list the option with a short description and a link - FIX
allAttachments$observable emitting a new value on every document revision even when the set of attachments is unchanged, by filtering emissions withdistinctUntilChangedbased on attachment ids and digests - FIX
RxAttachment.remove()not cleaning up binary attachment data from storage, becausecategorizeBulkWriteRows()only iterated over the new document's_attachmentsand never detected attachments removed between revisions - FIX attachments-compression
isCompressibleType()not stripping RFC 2045 parameters (e.g.; charset=utf-8) from MIME types, causing attachments with a charset-qualified type likeapplication/json; charset=utf-8to silently bypass compression when matched against exact patterns likeapplication/json - FIX backup plugin not removing the folder of a deleted document when the change batch only contained deletions, because
findByIds()returned an empty map and the loop exited early before running the deletion handler - FIX
RxCollection.cleanup()returningundefinedinstead ofbooleanas declared by its TypeScript return type, because the cleanup plugin implementation did not return the result fromcleanupRxCollection() - FIX CRDT plugin
bulkInserthook not including the composite primary key in CRDT operations, causing the primary key field to be lost during conflict resolution rebuild for schemas that use a composite primary key - ADD dev-mode check (SC43) to prevent encrypted fields from being nested inside other encrypted fields. When a parent path is encrypted, the entire object is encrypted so child paths must not be listed separately in the
encryptedarray. - FIX
findByIds()query operationsmodify(),patch(),incrementalModify(),incrementalPatch(), andincrementalRemove()returning an Array instead of a Map. Also fixfindByIds().remove()crashing withTypeError: docs.remove is not a functionbecause it did not handle the Map return type fromfindByIds(). - FIX
getJsonSchemaWithoutMeta()not removing internal meta field references (_deleted,_meta.lwt) from indexes, while correctly removing them from properties and required, causing the returned schema to be internally inconsistent - FIX
getLocal()returning a deleted local document from the document cache instead ofnull, causing inconsistent behavior between cache hits and storage lookups after a local document is removed - FIX
replication-google-driveplugin requestingetagin the Google Drive v3 list APIfieldsparameter, which is rejected by the real API; etag is now fetched separately via the v2 API - FIX
RxLocalDocument.get$()on nested object/array paths emitting spurious values when unrelated document fields changed, becausedistinctUntilChanged()used reference equality which always fails for non-primitive values across document revisions - FIX database-level
RxLocalDocument.$observable emitting events from a collection-level local document that shares the same id, because the filter on the database event stream only checkedisLocaland did not exclude events that originated from a collection - FIX localstorage storage
remove()not deleting attachment data from localStorage, causing orphaned attachment entries to remain after the storage instance is removed - FIX schema migration not forwarding
_attachmentsacross chained migration strategies, so later strategies received the document with_attachmentsasundefinedwhen an earlier strategy returned a new object without forwarding them, breaking theWithAttachments<DocData>contract and preventing strategies from reading or mutating attachment metadata as described in the docs - FIX schema migration losing attachments when the migration strategy returns a new object, because
migrateDocumentData()never restored_attachmentsafter running the strategies while_metaand_deletedwere restored - FIX
RxMigrationState.migratePromise()returningcount.percent: 0instead of100when the migration status isDONEand no migration was needed, which is inconsistent with theupdateStatus()logic that correctly sets percent to100when total is0 - FIX ORM attachment-method names conflicting with built-in
RxAttachmentmethods (getData,getStringData,getDataBase64,remove) not being validated, silently shadowing the built-in method on every attachment instance and preventing users from retrieving their attachment data. Dev-mode now throws a clearRxError(COL17) during collection creation. - FIX ORM document method names conflicting with schema-generated suffixed getters (
field$,field$$,field_) not being validated, causing aTypeErrorcrash at runtime instead of a clearRxError(COL18) during collection creation - FIX
RxDatabase.passwordbeing an enumerable property, which could leak the plaintext password throughObject.keys(), object spreading,Object.assign(), orJSON.stringify()in logging and error reporting contexts - FIX
RxPipelineerror state blocking unrelated reads on the destination collection, because the pipeline'swaitBeforeWriteFnhook always calledawaitIdle()which re-throws the stored handler error forever. After a handler throws, reads on the destination collection now proceed normally instead of re-throwing the pipeline error. - FIX
RxPipelinedeadlock when multiple pipelines share the same destination collection and their handlers read from the destination, because each pipeline'swaitBeforeWriteFnonly recognized its own flagged function name in the stack instead of any pipeline's flagged function prefix - FIX
RxDocument.populate()throwingDOC6for array fields whenrefis defined onitemsinstead of on the array field itself, even thoughcreateRxSchemaaccepts both patterns - FIX
RxDocument.populate()silently returningnullfor invalid schema paths and non-ref fields when the value at that path was falsy. The documentedDOC5/DOC6errors are now thrown consistently, regardless of whether the document has a value at the given path. - FIX
populate()on array ref fields returning documents in wrong order when two documents reference the same set of IDs in different order, becausefindByIdsquery cache deduplication reused a cached query whose Map iteration order matched the first caller instead of preserving each document's own ref array order - FIX query-builder operators (
gt,lt,ne,in, etc.) silently dropping the implicit$eqcondition when a selector shorthand value (e.g.{ age: 5 }) was used and then another operator was chained on the same field via the query-builder API - FIX default cache replacement policy not evicting executed unsubscribed queries when subscribed queries caused the total cache size to exceed
tryToKeepMax, because the eviction count was calculated from only the unsubscribed query count instead of the total cache size - FIX React hooks
useRxQueryanduseLiveRxQueryinitializingloadingstate asfalseinstead oftrue, causing components to briefly render with empty results before the query resolved #8292 - FIX remote storage
remove()not unsubscribing from internal subscriptions and not completing thechangeStream()observable, unlikeclose()which correctly performs both cleanup steps - FIX replication upstream marking documents as successfully pushed when the replication is paused during a push retry, because
masterWrite()returns an empty conflicts array on pause and the upstream updates the meta instance and checkpoint without verifying the push actually succeeded, causing those documents to never be retried on resume - FIX replication
sent$observable emitting documents in the master format (with the user-defineddeletedField) instead of the typedWithDeleted<RxDocType>format (with_deleted: boolean), because thedeletedFieldswap mutated the same row object that was later forwarded to subscribers - FIX replication
sent$observable emittingnullfor documents that were filtered out by apush.modifierreturningnull, violating itsObservable<WithDeleted<RxDocType>>type and falsely reporting filtered documents as sent to the endpoint - FIX RxState
_cleanup()not returningtrueon completion, causing the cleanup plugin loop to never terminate and run indefinitely - FIX RxState
$observable emitting duplicate and stale values on each write because both_ownEmits$andcollection.eventBulks$triggered emissions for own-instance events - FIX
RxState.get$()(and thefield$proxy accessor) emitting a stale value when subscribed after the state was modified, becausestartWith()eagerly captured the current value at observable creation time instead of at subscription time - FIX(types)
RxDocument.collectionlosing theReactivitygeneric because it was passed as the third type argument toRxCollection(which isStaticMethods) instead of the fifth, causingdoc.collection.find().$$and similar calls to be typed as the default reactivity instead of the user's custom reactivity type - FIX
RxDocument.$observable emitting stale document state when subscribed after the document was modified, becausestartWith()eagerly captured the latest data at observable creation time instead of at subscription time - FIX
RxState.set()permanently breaking the write queue when a user-supplied modifier throws, causing all subsequentset()calls to reject with an unrelatedSNHerror instead of performing the write - FIX storage
query()returning all matching documents when the caller passeslimit: 0in the mango query, because the truthy checkquery.limit ? query.limit : Infinitytreated0as "no limit was set" (affects memory, dexie, localstorage, foundationdb, denokv, sqlite-trial, mongodb storages and the query-builder plugin). - FIX
getStartIndexStringFromLowerBound()andgetStartIndexStringFromUpperBound()using space character (\x20) as the minimum boundary for string index fields, causing documents with string values containing control characters (codepoints below 32, e.g.\t,\n) to fall below the index scan range and be silently excluded from query results and counts - FIX WebMCP
changestool returning documents with internal meta fields (_meta,_rev,_attachments,_deleted) instead of stripping them like the query, insert, upsert, and delete tools do viatoJSON()
RxDB Server
- FIX invalid CORS response when the server is configured with the default
cors: '*'. The express adapter always sendsAccess-Control-Allow-Credentials: true, but combining that withAccess-Control-Allow-Origin: *is rejected by browsers per the CORS spec, so credentialed (cookie/auth-header) requests from any cross-origin client would fail. The adapter now reflects the requestOriginback whencorsis'*', keeping the "allow from anywhere" semantics while staying compatible with credentials. - FIX false conflicts during replication push when a
serverOnlyFieldis absent from the stored server document (e.g. because the field is optional and was never set).mergeServerDocumentFieldsMonadpreviously wrote anullvalue for the missing field onto the mergedassumedMasterState, so the extra key causedmasterWrite'sisEqualcheck to report a conflict that did not actually exist, silently reverting the client's update. The helper now deletes the property in that case so the merged row matches the stored master state. - FIX replication pull URL not URL-encoding the checkpoint
id. When a document's primary key contained URL-reserved characters (for example&,#,=), the URL was parsed incorrectly on the server, causing the checkpoint to be truncated. WithbatchSize: 1this could make the pull loop never advance past such a document. The client now encodes theidwithencodeURIComponent. - FIX replication
/pushendpoint allowing clients to populateserverOnlyFieldswhen inserting NEW documents.mergeServerDocumentFieldsMonadreturned the client document unchanged when no server-side document existed yet, so a client-supplied value for a server-only field was passed through toreplicationHandler.masterWrite()and persisted on the server. The merge now strips server-only fields from the client document when the server has no prior state for it, matching the documented contract that clients cannot do writes where one of theserverOnlyFieldsis set. The REST/setendpoint already stripped these fields explicitly, so it was unaffected. - FIX conflict handling for new documents pushed via replication when
serverOnlyFieldsare configured.mergeServerDocumentFieldsMonadincorrectly transformed a falsyassumedMasterState(used for new document inserts) into an object and set server-only fields tonullonnewDocumentState, causing schema validation failures and false conflicts. - FIX replication
/pushendpoint allowing clients to populateserverOnlyFieldswhen inserting NEW documents. Updates of existing documents already preserved the stored server value viamergeServerDocumentFields, but inserts (noassumedMasterState/ no existing serverDoc) passed the client document straight intomasterWrite, so any value the client sent for a server-only field was persisted. The handler now strips server-only fields from the new document state on insert, matching the behavior of the REST/setendpoint and the documented contract that clients cannot do writes where one of theserverOnlyFieldsis set. - FIX missing
awaitinRxRestClient.get(),RxRestClient.set(), andRxRestClient.delete()methods. ThepostRequest()call was not awaited before callinghandleError(), which caused server errors (e.g. 403 Forbidden fromchangeValidator) to be silently swallowed instead of thrown to the caller. - FIX REST client
observeQuerynot URL-encoding the base64 query string. Standard base64 contains+and/; in a URL query parameter+is decoded by the server as a space, so the server'satobrejected the corrupted string withInvalid characterand the SSE handler crashed silently after the response headers were already sent. Any query whose base64 contained+or/(for example, queries that filtered by a unicode value such asfirstName: { $eq: 'ûÿþ' }) would never deliver a document and the client just hung. The base64 is now passed throughencodeURIComponentbefore being appended to the URL. - FIX REST
/deleteendpoint returning 403 Forbidden whenserverOnlyFieldsis configured. The delete handler passed full documents (including server-only fields) to thechangeValidator, which always rejected them because the wrapper checks for the presence of server-only fields. Now the server-only fields are stripped before validation, consistent with the/setendpoint behavior. - FIX REST
/query/observeendpoint not rejecting$regexqueries with a proper 400 response. ThequeryModifierwrapper throws on$regexselectors to prevent DOS attacks (matching the/querybehavior), but the observe handler called the wrapped modifier AFTERsetSSEHeadershad already committed a 200 OK SSE response, and without atry/catch. A client that sent a$regexquery therefore observed a successful 200 status with an empty stream that the server then dropped, instead of the same 400 Bad Request that/queryreturns. The handler now runs the queryModifier (and the JSON/base64 query parsing) inside atry/catchBEFORE setting the SSE headers, so a bad request is answered with a proper 400 response. - FIX REST
/setendpoint not running thechangeValidatorfor inserts of NEW documents. The handler only invoked the validator on the update path (when an existing document was found by primary key), so achangeValidatorthat returnedfalsehad no effect when the client sent a document whose primary key did not yet exist on the server. The handler now runs the validator for inserts as well, withassumedMasterStateset toundefined, matching the behavior of the replication/pushendpoint and the documented contract that the validator gates all writes. - FIX REST
/setendpoint allowing a client to overwrite documents they do not own. When aqueryModifierwas configured, the handler only validated that the client-provided (new) document state matched the modifier but never checked the existing server document. An authenticated user could therefore take over a foreign document by sending a write whose new state matched the modifier while targeting another user's primary key. The handler now also runs the query matcher against the existing server document and rejects the request with 403 Forbidden if it does not match, aligning the behavior with the replication/pushendpoint. - FIX REST endpoint
/setallowing clients to populateserverOnlyFieldswhen inserting NEW documents. Updates to existing documents already stripped client-supplied values for these fields, but the insert path passed the client document straight toRxCollection.insert(), so a client could persist arbitrary values into fields that are documented as server-only. The handler now strips server-only fields from the client document before inserting, matching the documented contract that clients cannot do writes where one of theserverOnlyFieldsis set. - FIX REST endpoint
/setnot protectingserverOnlyFieldsfrom client overwrites. Clients could include server-only fields in write requests to/set, and those values would be stored directly instead of being ignored. The handler now usesmergeServerDocumentFields(consistent with the replication endpoint) to ensure server-only field values are always preserved from the server-side document, not taken from client input.
NOTICE: An overview about all releases can be found at the changelog