Skip to content

Releases: pubkey/rxdb

17.5.0

Choose a tag to compare

@github-actions github-actions released this 20 Aug 12:56
Immutable release. Only release title and notes can be modified.

JavaScript Database

  • CHANGE Update the Angular example and the Ionic example from Angular 21 to Angular 22. Both examples now use TypeScript 6.0 because @angular/build v22 requires it.
  • CHANGE Update the @angular/core devDependency that the reactivity-angular plugin is built and type checked against from 21.2.18 to 22.1.0. The @angular/core peer dependency stays optional and unpinned, so RxDB keeps working with older Angular versions.
  • FIX dexie RxStorage: the reference counting in dexie-helper.ts never closed the underlying Dexie connections and never evicted the state cache entry, so the connections leaked and creating a database with the same name again after the IndexedDB databases were deleted threw DatabaseClosedError. Added a testcase for it in test/unit/rx-storage-dexie.test.ts. #8793
  • IMPROVE Serve the docs favicon as .ico in addition to the .svg, so browsers without SVG favicon support fall back to /files/logo/icon.ico.
  • FIX Running tsc --noEmit inside docs-src/ reported 482 type errors. The docs tsconfig now sets allowImportingTsExtensions (the RxDB sources in src/ use explicit .ts file endings) and the @theme/* module declarations of the Docusaurus theme packages are referenced, so the swizzled components in docs-src/src/theme/ resolve. The remaining errors in the docs components and in a few src/ files were fixed, the docs typecheck is clean now.
  • FIX deleteFolder() of the backup plugin used the deprecated fs.rmdirSync(path, { recursive: true }), it now uses fs.rmSync().
  • ADD Discord chat hint to RxDB error messages so users can ask for help at https://rxdb.info/chat
  • FIX An interrupted schema migration could never complete. Documents that were already stored in the new storage were pushed with assumedMasterState: undefined, so the replication protocol reported each of them as a conflict. Resolving these conflicts wrote the new document state back into the old storage which emitted on the fork change stream and started the same cycle again, so addCollections() never resolved and the migration spun conflict cycles until the tab ran out of memory. Push-conflicts of the migration replication are now ignored as intended and the document that is already stored in the new storage is kept.
  • FIX Canceling a running schema migration left the storage instances that the migration had opened behind. RxMigrationState.cancel() now closes them, so an interrupted migration no longer leaks the old storage instance, its replication meta storage and their multi-instance BroadcastChannel reference.
    FIX schema migration would leave the leader-election BroadcastChannel open when the migration threw (for example when a migrationStrategy failed), keeping the tab leader forever and blocking other tabs from running the migration. The channel is now closed on every code path. (#7827)
  • FIX useLiveRxQuery never unsubscribed from the live query because useEffect dropped the cleanup returned by the async runQuery callback. Added an unmount test in test/react/react-hooks.test.tsx. #8964
  • CHANGE Update graphql from 16.14.2 to 17.0.2. GraphQL.js v17 requires Node.js 22 or newer, so npm install rxdb on older Node.js versions prints an EBADENGINE warning for the graphql package. RxDB itself does not import from graphql, it is only needed as the peer dependency of graphql-ws and for the GraphQL servers in the tests and examples. The dev dependencies graphql-http and graphql-subscriptions still declare a peer dependency range that stops at v16, they are pinned to the root graphql version via overrides. See the GraphQL.js v16 to v17 upgrade guide.
  • CHANGE Update graphql-ws from 5.16.2 to 6.2.0. The GraphQL replication now imports the client from graphql-ws/client instead of the package root, so bundles no longer pull in the graphql-ws server code and its graphql peer dependency. Users who run their own graphql-ws server have to remove the /lib/ part from their imports (graphql-ws/lib/use/ws becomes graphql-ws/use/ws) and, when they use the schema, context, onSubscribe, onOperation, onError, onNext or onComplete server hooks, adapt them to the new argument list where the full message was replaced by the id and the payload. See the graphql-ws v6 migration notes.
  • CHANGE Raise the required Node.js version from 18 to 20 because graphql-ws v6 no longer supports Node.js 18, which reached its end of life in April 2025.
  • ADD exportJSON() of the json-dump plugin now supports the attachments: true option to include the attachments data as base64 strings in the dump. importJSON() restores these attachments. The default is false so that dumps stay small. Added testcases. #8924
  • FIX The JD1, JD2 and JD3 error messages linked to the backup plugin page. They now link to the new JSON Import and Export page which documents the json-dump plugin. #8924
  • FIX RxDatabase.close() resolved before the leader election was finished and before the broadcast channel was closed, which made a still running election post on the already closed channel #8893
  • UPDATE broadcast-channel to 7.4.0 which stops a dead leader elector from becoming leader and posting on a closed channel #8893
  • FIX Make the testcase groups live query write bursts before _ensureEqual when enabled no longer fail randomly. The auditTime() window of liveQueryUpdateThrottleTime opens with the change event of the first insert, not when the write burst is done. On slow storages and loaded CI machines the burst itself took longer than the throttle time, so _ensureEqual() legitimately ran while the later inserts were still going on. The testcase now measures the wall clock time of the burst, only asserts when the burst did fit into the throttle window, and retries the burst otherwise.
  • IMPROVE Reduce the ESM bundle size by no longer down-transpiling native class syntax in the dist/esm build. The class-lowering babel transforms now only run for the CJS/es5 build, which removes the @babel/runtime helper imports (inheritsLoose, createClass, readOnlyError, wrapNativeSuper) from the ESM output. This shrinks the measured core+memory bundle from 45088 to 44279 bytes gzip (~1.8%) and removes @babel/runtime from the ESM tree entirely. The CJS build and all other syntax transforms are unchanged.
  • CHANGE Remove the reconnecting-websocket dependency, which was unmaintained since 2020. The websocket replication now uses a small reconnecting websocket client that ships with RxDB itself. The behavior stays the same: the client reconnects with an exponential backoff and queues the messages that are sent while it is not connected. A connection attempt that does not open within the connection timeout now emits the new error code RC_WEBSOCKET_TIMEOUT on the error$ stream of the replication.
  • FIX [replication-microsoft-onedrive] Make realtime sync reliable by sending a durable signaling message on every push in addition to the ephemeral WebRTC RESYNC ping. A ping to a peer whose WebRTC datachannel is not connected (handshake not finished yet or the connection dropped) was silently lost with no other trigger to re-pull, which made the should realtime sync on both sides test flaky. Peers now also converge over the polled signaling channel and keep the poll backoff responsive while there is traffic.
  • IMPROVE Add field-level comments to the RxJsonSchema typings so coding agents and IDE users see the RxDB-specific schema rules (ref, final, default, maxLength on indexed strings, minimum/maximum/multipleOf on indexed numbers) directly at the fields. Also document that schema title and description are read by LLMs when plugins like webmcp pass the JSON schema to AI agents. #8832
  • Update the Svelte example from Svelte 4 to Svelte 5 with runes. Shared state now lives in a store.svelte.js module with $state, and the RxDB query subscription is created in an $effect so it is cleaned up when the component is destroyed.
  • FIX In the Svelte example, saving an already existing note threw because RxDocument.update() was used without the update plugin being added. The note editor now uses the core incrementalPatch() method. Also added an e2e testcase that edits an existing note.
  • FIX The Tauri example e2e testcase should insert a hero asserted on the rendered hero after a fixed browser.pause(100). On a slow CI runner the insert through the SQLite trial storage plus the re-render of the query subscription takes longer than that, so the testcase failed with Expected length: 1, Received length: 0. It now waits for the hero element to exist instead of pausing for a fixed time. (#8919)
  • Refactored the [WebMCP plugin]...
Read more

17.4.0

Choose a tag to compare

@github-actions github-actions released this 13 Jul 13:11
Immutable release. Only release title and notes can be modified.

JavaScript Database

ADD test to ensure awaitDocumentPushed() resolves after a document push first had a conflict that was later resolved. (#8632)
ADD replicationState.awaitDocumentPushed(rxDocument) which returns a promise that resolves once the given RxDocument state was successfully pushed to the server. (#8632)

  • ADD Datenschutzerklärung / Privacy Policy page (German and English) at /privacy/, set to noindex, and linked in the docs footer next to the Legal Notice.
  • ADD replicationState.conflict$ observable that emits each conflict that was reported by the remote in the response of the push handler, together with the output of the conflictHandler that resolved it. (#8742)
  • Add a create-sem-page Claude skill that generates a new SEM landingpage under docs-src/src/pages/sem from a slug plus 3 titles, 3 descriptions and 3 sets of bulletpoints that are a/b tested against each other. Adds the getSemVariation() helper in docs-src/src/components/a-b-tests.tsx for stable per visitor variation assignment and tracking. See https://github.com/pubkey/rxdb
    FIX broken links on the alternatives page. Ten alternative article pages had a redundant alternatives/ prefix in their slug frontmatter, which Docusaurus resolves relative to the file directory and produced doubled URLs like /articles/alternatives/alternatives/aws-amplify-datastore-alternative.html.
    FIX awaitDocumentPushed() never resolved for documents that were already pushed when the storage uses a non-default checkpoint format, like the sharding RxStorage. It now compares the document state with the assumed master state from the replication meta instance instead of the push checkpoint. (#8632)
  • FIX CI failing on dependency-update PRs with ETARGET No matching version found by removing NPM_CONFIG_PREFER_OFFLINE from the workflows so npm revalidates cached registry metadata.
  • FIX Reserve explicit width/height on the docs images that Google Search Console reported with Cumulative Layout Shift (CLS), starting from the localStorage article. Covers the two in-article RxDB logos, the navbar logo, the footer logo, the footer community icons, and the "Was this page helpful?" thumbs-up and Discord icons so the browser reserves space before the SVGs load.
  • FIX Add an accessible aria-label to the icon-only Discord and GitHub navbar links and an alt text to the footer Discord icon.
  • CHANGE Replace the raw centered logo <img> HTML in all articles with a reusable RxdbLogo MDX component that derives an explicit height from the width, so every article reserves image space and avoids CLS.
  • CHANGE Emit source maps in the production docs build (devtool: 'source-map') so tools like Lighthouse can map the minified bundle back to the source and give more detailed tips.
  • FIX document the non-premium collection limit in the addCollections docs and premium pricing page, linked to #8614
  • FIX dev-mode: COL13 and COL16 errors now report the type of the invalid value instead of a constant wrong type, and the field name check no longer accepts square brackets in field names because they cannot be used as javascript variables.
  • FIX DocumentCache no longer downgrades the cached latest document state when an older change event arrives out of order in multiInstance mode. This prevents two instances from diverging and fixes a flaky upsertLocal() concurrency test. Fixes #8609
  • Fix npm run docs:build so it installs docs-src dependencies when needed before building the docs.
  • FIX Add accessible alt text to the "Was this page helpful?" thumbs-up and thumbs-down icons in the docs footer that an accessibility audit flagged as missing the alt attribute.
  • FIX reduce RxDB bundle size by using the internal flatClone() helper in RxSchema instead of importing it from event-reduce-js
  • FIX Handle 409 conflict errors and retry in upsertLocal to prevent concurrency hazards with other browser tabs. Fixes #8609
  • FIX: createEmptyFile() in the Microsoft OneDrive replication plugin now uses the POST response body directly instead of an extra listFilesInFolder call, avoiding a race condition. The test assertion for fileId.length was also relaxed to > 0 since the mock server can generate short IDs.
  • FIX: Increased the OPEN_COLLECTIONS retry timeout from 1050ms (35×30ms) to 9000ms (300×30ms) to prevent false COL23 errors when using slow storage backends like MongoDB where tests hold collections open for several seconds. Also fixed startTime tracking so timeInRetry in the error now reflects the total wait time.
  • FIX: queries with $gt/$lt bounds outside the schema minimum/maximum now correctly include boundary documents instead of excluding them due to index-string clamping. Fixed #8601
  • FIX SEM landingpages always showed the first variation after clearing localStorage. getSemVariation() in docs-src/src/components/a-b-tests.tsx returned an in-memory cached index before reading localStorage, so clearing storage had no effect until a full page reload reset the module state (which does not happen on client side navigations or with dev server hot module replacement). localStorage is now the single source of truth, so a cleared storage reliably re-randomizes one of the variations. See https://github.com/pubkey/rxdb
    Removed the appended | RxDB - JavaScript Database site-title suffix from SEO page titles by swizzling the PageMetadata theme component, so the <title> and og:title now contain only the page title. See https://github.com/pubkey/rxdb
  • FIX storage-sqlite: removed console.dir calls which are undefined in production React Native / Hermes runtimes and threw TypeError: undefined is not a function inside openSqliteTransaction, masking the real SQLite error and bypassing the BEGIN; retry loop. #8635
  • FIX utils: getFromObjectOrThrow() no longer throws on existing falsy values like 0, '' or false, and flattenObject() no longer drops keys whose value is null.
    Fix WebMCP v3 tests by resetting the WebMCP polyfill state between unit tests so navigator.modelContextTesting is reinstalled reliably after each test run. Related to PR #8673
  • IMPROVE query planner: $in queries on indexed fields now limit the scanned index range to the min/max of the given values instead of doing a full scan. This makes $in queries with multiple values use the index in all RxStorage implementations that use the RxDB query planner. #8631
  • IMPROVE trial SQLite storage: raise the document limit from 300 to 500, stop counting deleted (tombstone) documents towards the limit, and log a loud warning on each write once usage reaches ~80% of the document or operation limit. See https://rxdb.info/rx-storage-sqlite.html
  • CHANGE Display Pro and Pro Plus tier pricing as per-month figures, update title to "RxDB for Professionals", merge subtitles, and clean up redundant header sections.
  • Disallow crawling of the published .md files (generated for the llms.txt via generateMarkdownFiles) in robots.txt so the raw markdown sources do not appear as duplicate content in search engines. See https://github.com/pubkey/rxdb
  • Add an optional sem.bulletpoints field to the landingpage SemPage config so SEM pages can customly define and a/b test the hero section bulletpoints like "Build apps that work offline". When not set, the default bulletpoints are used. See https://github.com/pubkey/rxdb
  • Add SEM landingpage gaawsds1 (a/b testing 3 title/description/bulletpoint variations for migrating off deprecated offline sync) at /sem/gaawsds1.html.
  • Add SEM landingpage gaawsds2 (a/b testing 3 title/description/bulletpoint variations for the open-source local-first database) at /sem/gaawsds2.html.
  • Add SEM landingpage gaawsds3 (a/b testing 3 title/description/bulletpoint variations for reliable offline sync you control) at /sem/gaawsds3.html.
  • Add SEM landingpage gaencdb1 (encrypted local database for JavaScript apps) that a/b tests 3 title, description and bulletpoint variations at /sem/gaencdb1.html.
  • Add SEM landingpage gaencdb2 (field-level encryption for JavaScript and TypeScript apps) that a/b tests 3 title, description and bulletpoint variations at /sem/gaencdb2.html.
  • Add SEM landingpage gaencdb3 (encrypt local app data on web and mobile) that a/b tests 3 title, description and bulletpoint variations at /sem/gaencdb3.html.
  • ADD SEM landingpages /sem/gaidxdb1.html, /sem/gaidxdb2.html and /sem/gaidxdb3.html, each a/b testing 3 variations of the hero title, description and bulletpoints.
  • Added SEM landingpage gajsondb1 (JSON database for JavaScript apps) that a/b tests 3 title, description and bulletpoint variations.
  • Added SEM landingpage gajsondb2 (open-source NoSQL JSON database) that a/b tests 3 title, description and bulletpoint variations.
  • Added SEM landingpage gajsondb3 (real JSON database vs JSON files) that a/b tests 3 title, description and bulletpoint variations.
  • Add SEM landingpage garealm1 (maintained local database with realtime sync for teams migrating off deprecated mobile sync) that a/b tests 3 title, description and bulletpoint variations at /sem/garealm1.html.
  • Add SEM landingpage garealm2 (local-first JavaScript database with self-hostable sync) that a/b tests 3 title, description and bulletpoint variations at /sem/garealm2.html.
  • Add SEM landingpa...
Read more

17.3.0

Choose a tag to compare

@github-actions github-actions released this 28 May 14:32
Immutable release. Only release title and notes can be modified.

JavaScript Database

  • TEST add reproduction for composite primary key auto-fill when only name and number are set in a preInsert hook without id (#8527)
  • DOCS expand partial-sync.md to fully describe what partial sync is, when to use it, how to implement it with multiple replicateRxCollection states, per-scope checkpoints, document tagging via pull.modifier/push.modifier, scope cleanup, real-time pull streams, and tradeoffs.
  • FIX allow preInsert hooks to set composite primary key fields (for example name and number) without manually setting id, so RxDB computes the composite primary key afterwards (#8527)
  • FIX live-query subscriptions being delayed under concurrent writes, by using a fixed promiseWait(20) in the _execOverDatabase() rerun path instead of increasing the wait time with each rerun #8444
  • FIX schema using patternProperties with square bracket character classes no longer gets incorrectly interpreted as an array index in dev-mode schema validation. #8522
  • FIX Use the lighter background color var(--bg-color) for pricing tiers on the premium page.
  • FIX Add IconChevronsRight component and use it as the icon for all pricing tier buttons on the premium page.
  • FIX Keep IconArrowUpRight component for future use.
  • FIX Update .pricing-tier styling in custom.css to use width: 90% on screens smaller than 768px.
  • FIX Position tier-note elements at the very top of each tier header block.
  • FIX Add a tablet media query to limit .pricing-tiers max-width to 560px for screen sizes between 769px and 1120px to enforce a balanced 2-2 layout.
  • FIX React RxDatabaseProvider TypeScript typings to accept RxDatabase instances with concrete typed collection maps that do not use a string index signature
  • FIX generated .d.ts files under dist/types/ contained .ts extension import specifiers that TypeScript with moduleResolution: "bundler" could not resolve, causing reactive field types (doc.field$$) to degrade to Signal<unknown> in Angular projects. scripts/fix-types.mjs now rewrites all generated declaration files. See #8488
  • ADD replication-google-drive space: 'drive' | 'appDataFolder' option to sync into Google Drive's hidden per-application data folder. When set to appDataFolder, the plugin stores data under the appDataFolder root, scopes every files.list request with spaces=appDataFolder, and makes folderPath optional. Requires the https://www.googleapis.com/auth/drive.appdata OAuth scope.
  • FIX writes to an RxCollection while a schema migration is pending or running now fail fast with a clear COL25 error instead of racing the migration and surfacing as RC_PUSH.
  • ADD replication-google-drive plugin now supports attachment replication. Attachment binary data is stored as base64 in a separate _attachments_data field of the document JSON file on Google Drive, keeping _attachments as clean stubs. Attachment replication is enabled automatically when the collection schema has attachments: {} defined and can be disabled by passing attachments: false to replicateGoogleDrive().
  • ADD replication-microsoft-onedrive plugin now supports attachment replication. Attachment binary data is stored as base64 in a separate _attachments_data field of the document JSON file on OneDrive, keeping _attachments as clean stubs. Attachment replication is enabled automatically when the collection schema has attachments: {} defined and can be disabled by passing attachments: false to replicateMicrosoftOneDrive().
  • REFACTOR move the attachment serialisation helpers (serializeDocAttachments, deserializeDocAttachments, stripAllAttachmentDataForComparison) to src/replication-protocol/helper.ts so they can be shared between the google-drive and microsoft-onedrive replication plugins.

RxDB Premium

  • FIX (storage-indexeddb) Eliminated unhandled TransactionInactiveError rejections that occurred during bulk replication pulls when concurrent reads hit the WAL flush window. See #8497

NOTICE: An overview about all releases can be found at the changelog

Join RxDB:

17.2.0

Choose a tag to compare

@github-actions github-actions released this 04 May 13:44

JavaScript Database

  • ADD React useRxDocument(collection, primaryKey) hook for subscribing to a single document by primary key with live updates
  • ADD React useReplicationStatus(replicationState) hook that exposes syncing, error, lastSyncedAt, and canceled from replication observables
  • DOCS Mark liveQueryUpdateThrottleTime as a beta feature in the documentation
  • DOCS Move the main liveQueryUpdateThrottleTime documentation to rx-query.md; rx-database.md and rx-collection.md now 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 with distinctUntilChanged based on attachment ids and digests
  • FIX RxAttachment.remove() not cleaning up binary attachment data from storage, because categorizeBulkWriteRows() only iterated over the new document's _attachments and 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 like application/json; charset=utf-8 to silently bypass compression when matched against exact patterns like application/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() returning undefined instead of boolean as declared by its TypeScript return type, because the cleanup plugin implementation did not return the result from cleanupRxCollection()
  • FIX CRDT plugin bulkInsert hook 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 encrypted array.
  • FIX findByIds() query operations modify(), patch(), incrementalModify(), incrementalPatch(), and incrementalRemove() returning an Array instead of a Map. Also fix findByIds().remove() crashing with TypeError: docs.remove is not a function because it did not handle the Map return type from findByIds().
  • 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 of null, causing inconsistent behavior between cache hits and storage lookups after a local document is removed
  • FIX replication-google-drive plugin requesting etag in the Google Drive v3 list API fields parameter, 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, because distinctUntilChanged() 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 checked isLocal and 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 _attachments across chained migration strategies, so later strategies received the document with _attachments as undefined when an earlier strategy returned a new object without forwarding them, breaking the WithAttachments<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 _attachments after running the strategies while _meta and _deleted were restored
  • FIX RxMigrationState.migratePromise() returning count.percent: 0 instead of 100 when the migration status is DONE and no migration was needed, which is inconsistent with the updateStatus() logic that correctly sets percent to 100 when total is 0
  • FIX ORM attachment-method names conflicting with built-in RxAttachment methods (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 clear RxError (COL17) during collection creation.
  • FIX ORM document method names conflicting with schema-generated suffixed getters (field$, field$$, field_) not being validated, causing a TypeError crash at runtime instead of a clear RxError (COL18) during collection creation
  • FIX RxDatabase.password being an enumerable property, which could leak the plaintext password through Object.keys(), object spreading, Object.assign(), or JSON.stringify() in logging and error reporting contexts
  • FIX RxPipeline error state blocking unrelated reads on the destination collection, because the pipeline's waitBeforeWriteFn hook always called awaitIdle() 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 RxPipeline deadlock when multiple pipelines share the same destination collection and their handlers read from the destination, because each pipeline's waitBeforeWriteFn only recognized its own flagged function name in the stack instead of any pipeline's flagged function prefix
  • FIX RxDocument.populate() throwing DOC6 for array fields when ref is defined on items instead of on the array field itself, even though createRxSchema accepts both patterns
  • FIX RxDocument.populate() silently returning null for invalid schema paths and non-ref fields when the value at that path was falsy. The documented DOC5 / DOC6 errors 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, because findByIds query 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 $eq condition 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 useRxQuery and useLiveRxQuery initializing loading state as false instead of true, 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 the changeStream() observable, unlike close() 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-defined deletedField) instead of the typed WithDeleted<RxDocType> format (with _deleted: boolean), because the deletedField swap mutated the same row object that was later forwarded to subscribers
  • FIX replication sent$ observable emitting null for documents that were filtered out by a push.modifier returning null, violating its Observable<WithDeleted<RxDocType>> type and falsely reporting filtered documents as sent to the endpoint
  • FIX RxState _cleanup() not returning true on 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$ and collection.eventBulks$ triggered emissions for own-instance events
  • FIX RxState.get$() (and the field$ proxy accessor) emitting a stale value when subscribed after the state was modified, because startWith() eagerly captured the current value at observable creation time instead of at subscription time
  • FIX(types) RxDocument.collection losing the Reactivity generic because it was passed as the third type argument to RxCollection (which is StaticMethods) instead of the fifth, causing doc.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, because `startW...
Read more

17.1.0

Choose a tag to compare

@github-actions github-actions released this 02 Apr 14:26

JavaScript Database

  • FIX CRDT plugin bulkInsert hook not including schema default values in CRDT operations, causing data loss during conflict resolution rebuild when fields rely on schema defaults

  • FIX RxDocument.get$() on nested object/array paths emitting spurious values when unrelated document fields changed, because distinctUntilChanged() used reference equality which always fails for non-primitive values across document revisions

  • FIX incrementalUpsert() throwing a CONFLICT error when a concurrent upsert()/insert() creates the same document between the internal findOne() and insert() calls

  • FIX upsertLocal() on a previously removed local document keeping the document in deleted state instead of un-deleting it

  • FIX push-only replication losing local writes that occur during a pause because reSync() events were filtered out when no pull handler was configured

  • FIX getStartIndexStringFromUpperBound() incorrectly mapping INDEX_MIN to '1' for boolean index fields, causing queries with exclusive bounds ($gt/$lt) on a field preceding a boolean index field to include boundary documents in the results

  • FIX leader-election plugin not calling die() on the LeaderElector when the database is closed, because LEADER_ELECTORS_OF_DB was never populated due to a dead code branch

  • FIX encryption plugin schema transformation not correctly handling nested dot-notation encrypted paths (e.g. 'nested.field'), causing validation failures when using a validator storage with non-string nested encrypted fields

  • FIX dev-mode checkSchema() not validating composite primary key fields for encryption (SC15), index (SC13), unique (SC14), and type (SC16) constraints because it compared property names against the primaryKey object instead of resolving the primary field path

  • FIX findOne().remove() crashing with TypeError: Cannot read properties of null when no document matches the query, instead of returning null

  • ADD findOne().remove(true) to throw when no document matches, consistent with findOne().exec(true)

  • FIX schema migration losing _deleted state when migration strategy returns a new object, causing deleted documents to be resurrected after migration

  • FIX RxPipeline.remove() not properly cleaning up checkpoint when called during active processing, causing a re-added pipeline with the same identifier to skip already-processed documents instead of starting fresh

  • FIX cleanup plugin prematurely exiting its retry loop when storageInstance.cleanup() returns false (batched cleanup), because Array.find() returns the found value false and !false evaluates to true, causing isDone to be set incorrectly

  • FIX encryption plugin validatePassword() leaking the plaintext password in RxError parameters and error messages when password validation fails

  • FIX database.remove() not calling collection onRemove handlers, because close() unsubscribed all listeners before the remove operation could trigger them

  • FIX query-builder eq()/equals() silently overwriting other operator conditions on the same field because the value was stored as a raw primitive instead of using the $eq operator form

  • FIX deleted$ observable emitting on every document revision instead of only when the deleted state changes, by adding distinctUntilChanged()

  • FIX postSave collection hook not receiving the RxDocument instance as the second argument, unlike postInsert and postRemove which correctly pass it

  • FIX getJsonSchemaWithoutMeta() not removing _rev from schema properties, while correctly removing other internal meta properties (_deleted, _meta, _attachments)

  • FIX allAttachments$ observable emitting attachments with a stale document reference, causing attachment.doc to point to an outdated document version instead of the latest one

  • FIX RxState not correctly recovering full-state replacements (via set('', modifier)) from disk on database reopen, causing corrupted state

  • FIX memory storage count() returning incorrect results when the selector is not fully satisfied by the index and the query has a limit set

  • FIX replicateRxCollection().remove() on a never-started replication now creates the meta instance and deletes its data instead of skipping cleanup

  • FIX REPLICATION_STATE_BY_COLLECTION not cleaned up on cancel()/remove(), leaking replication state references

  • FIX floating-point rounding overflow in index string decimal generation, where Math.round could produce a value equal to the multiplier (e.g. 10 instead of max 9), creating a string one character too long and breaking sort order in compound indexes

  • FIX normalizeMangoQuery() skipped fully-matching indexes when choosing default sort order, falling back to the first index instead of using the best match

  • FIX RxState set('', modifier) passed undefined to the modifier instead of the current state

  • FIX RxMigrationStatus.count.percent returning NaN instead of 100 when migrating a collection with 0 documents

  • FIX fillWithDefaultSettings() index deduplication was broken because Array.filter() return value was discarded, causing duplicate indexes in schemas when user-defined indexes become identical after adding _deleted prefix and primary key suffix

  • FIX encryption plugin not stripping type-specific schema keywords (maxLength, required, items, etc.) from encrypted fields, causing validation errors when using a validator storage with encryption

  • FIX incorrect index string generation for negative decimal numbers causing wrong sort order and query results

  • FIX rateQueryPlan() evaluated startKeys twice instead of endKeys, causing suboptimal index selection for $lt/$lte queries.

  • FIX event-reduce mutating cached docsDataMap causing missing documents after insert-delete cycles

  • FIX modify() not deep-cloning document data, allowing the modifier to corrupt internal state via shared nested references

  • FIX fillObjectWithDefaults shared mutable references for non-primitive schema defaults (arrays/objects) causing corrupted values on subsequent inserts

NOTICE: An overview about all releases can be found at the changelog

Join RxDB:

17.0.0

Choose a tag to compare

@github-actions github-actions released this 30 Mar 19:10

JavaScript Database

🚀 RxDB v15 is released

  • A list of changes for RxDB v17 can be found here

NOTICE: An overview about all releases can be found at the changelog

Join RxDB:

17.0.0-beta.25

17.0.0-beta.25 Pre-release
Pre-release

Choose a tag to compare

@github-actions github-actions released this 24 Mar 15:50

JavaScript Database

  • A list of changes for RxDB v17 can be found here

NOTICE: An overview about all releases can be found at the changelog

Join RxDB:

17.0.0-beta.24

17.0.0-beta.24 Pre-release
Pre-release

Choose a tag to compare

@github-actions github-actions released this 24 Mar 09:54

JavaScript Database

  • A list of changes for RxDB v17 can be found here

NOTICE: An overview about all releases can be found at the changelog

Join RxDB:

17.0.0-beta.23

17.0.0-beta.23 Pre-release
Pre-release

Choose a tag to compare

@github-actions github-actions released this 20 Mar 14:31

JavaScript Database

  • A list of changes for RxDB v17 can be found here

NOTICE: An overview about all releases can be found at the changelog

Join RxDB:

17.0.0-beta.22

17.0.0-beta.22 Pre-release
Pre-release

Choose a tag to compare

@github-actions github-actions released this 20 Mar 09:36

JavaScript Database

  • A list of changes for RxDB v17 can be found here

NOTICE: An overview about all releases can be found at the changelog

Join RxDB: