Skip to content

Conversation

@KyleAMathews
Copy link
Collaborator

Two issues fixed:

  1. isChangeMessage not exported: The isChangeMessage and isControlMessage utilities were exported from electric.ts but not re-exported from the package's index.ts, making them unavailable to users despite documentation stating otherwise.

  2. awaitMatch race condition on inserts: When awaitMatch was called after the Electric messages had already been processed (including up-to-date), it would timeout because:

    • The message buffer (currentBatchMessages) was cleared on up-to-date
    • Immediate matches found in the buffer still waited for another up-to-date to resolve

    Fixed by:

    • Moving buffer clearing to the START of batch processing (preserves messages until next batch)
    • Adding batchCommitted flag to track when a batch is committed
    • For immediate matches: resolve immediately only if batch is committed (consistent with awaitTxId)
    • For immediate matches during batch processing: wait for up-to-date (maintains commit semantics)

Fixes issue reported on Discord where inserts would timeout while updates worked.

🎯 Changes

✅ Checklist

  • I have followed the steps in the Contributing guide.
  • I have tested this code locally with pnpm test:pr.

🚀 Release Impact

  • This change affects published code, and I have generated a changeset.
  • This change is docs/CI/dev-only (no release).

@changeset-bot
Copy link

changeset-bot bot commented Dec 10, 2025

🦋 Changeset detected

Latest commit: 39d4df4

The changes in this PR will be included in the next version bump.

This PR includes changesets to release 1 package
Name Type
@tanstack/electric-db-collection Patch

Not sure what this means? Click here to learn what changesets are.

Click here if you're a maintainer who wants to add another changeset to this PR

@pkg-pr-new
Copy link

pkg-pr-new bot commented Dec 10, 2025

More templates

@tanstack/angular-db

npm i https://pkg.pr.new/@tanstack/angular-db@1000

@tanstack/db

npm i https://pkg.pr.new/@tanstack/db@1000

@tanstack/db-ivm

npm i https://pkg.pr.new/@tanstack/db-ivm@1000

@tanstack/electric-db-collection

npm i https://pkg.pr.new/@tanstack/electric-db-collection@1000

@tanstack/offline-transactions

npm i https://pkg.pr.new/@tanstack/offline-transactions@1000

@tanstack/powersync-db-collection

npm i https://pkg.pr.new/@tanstack/powersync-db-collection@1000

@tanstack/query-db-collection

npm i https://pkg.pr.new/@tanstack/query-db-collection@1000

@tanstack/react-db

npm i https://pkg.pr.new/@tanstack/react-db@1000

@tanstack/rxdb-db-collection

npm i https://pkg.pr.new/@tanstack/rxdb-db-collection@1000

@tanstack/solid-db

npm i https://pkg.pr.new/@tanstack/solid-db@1000

@tanstack/svelte-db

npm i https://pkg.pr.new/@tanstack/svelte-db@1000

@tanstack/trailbase-db-collection

npm i https://pkg.pr.new/@tanstack/trailbase-db-collection@1000

@tanstack/vue-db

npm i https://pkg.pr.new/@tanstack/vue-db@1000

commit: 39d4df4

@github-actions
Copy link
Contributor

github-actions bot commented Dec 10, 2025

Size Change: 0 B

Total Size: 88.2 kB

ℹ️ View Unchanged
Filename Size
./packages/db/dist/esm/collection/change-events.js 1.39 kB
./packages/db/dist/esm/collection/changes.js 977 B
./packages/db/dist/esm/collection/events.js 388 B
./packages/db/dist/esm/collection/index.js 3.24 kB
./packages/db/dist/esm/collection/indexes.js 1.1 kB
./packages/db/dist/esm/collection/lifecycle.js 1.67 kB
./packages/db/dist/esm/collection/mutations.js 2.31 kB
./packages/db/dist/esm/collection/state.js 3.42 kB
./packages/db/dist/esm/collection/subscription.js 2.71 kB
./packages/db/dist/esm/collection/sync.js 2.37 kB
./packages/db/dist/esm/deferred.js 207 B
./packages/db/dist/esm/errors.js 4.19 kB
./packages/db/dist/esm/event-emitter.js 748 B
./packages/db/dist/esm/index.js 2.66 kB
./packages/db/dist/esm/indexes/auto-index.js 742 B
./packages/db/dist/esm/indexes/base-index.js 766 B
./packages/db/dist/esm/indexes/btree-index.js 1.93 kB
./packages/db/dist/esm/indexes/lazy-index.js 1.1 kB
./packages/db/dist/esm/indexes/reverse-index.js 513 B
./packages/db/dist/esm/local-only.js 837 B
./packages/db/dist/esm/local-storage.js 2.1 kB
./packages/db/dist/esm/optimistic-action.js 359 B
./packages/db/dist/esm/paced-mutations.js 496 B
./packages/db/dist/esm/proxy.js 3.75 kB
./packages/db/dist/esm/query/builder/functions.js 733 B
./packages/db/dist/esm/query/builder/index.js 3.96 kB
./packages/db/dist/esm/query/builder/ref-proxy.js 917 B
./packages/db/dist/esm/query/compiler/evaluators.js 1.35 kB
./packages/db/dist/esm/query/compiler/expressions.js 430 B
./packages/db/dist/esm/query/compiler/group-by.js 1.8 kB
./packages/db/dist/esm/query/compiler/index.js 1.96 kB
./packages/db/dist/esm/query/compiler/joins.js 2 kB
./packages/db/dist/esm/query/compiler/order-by.js 1.46 kB
./packages/db/dist/esm/query/compiler/select.js 1.07 kB
./packages/db/dist/esm/query/expression-helpers.js 1.43 kB
./packages/db/dist/esm/query/ir.js 673 B
./packages/db/dist/esm/query/live-query-collection.js 360 B
./packages/db/dist/esm/query/live/collection-config-builder.js 5.33 kB
./packages/db/dist/esm/query/live/collection-registry.js 264 B
./packages/db/dist/esm/query/live/collection-subscriber.js 1.74 kB
./packages/db/dist/esm/query/live/internal.js 130 B
./packages/db/dist/esm/query/optimizer.js 2.56 kB
./packages/db/dist/esm/query/predicate-utils.js 2.91 kB
./packages/db/dist/esm/query/subset-dedupe.js 921 B
./packages/db/dist/esm/scheduler.js 1.3 kB
./packages/db/dist/esm/SortedMap.js 1.3 kB
./packages/db/dist/esm/strategies/debounceStrategy.js 247 B
./packages/db/dist/esm/strategies/queueStrategy.js 428 B
./packages/db/dist/esm/strategies/throttleStrategy.js 246 B
./packages/db/dist/esm/transactions.js 2.9 kB
./packages/db/dist/esm/utils.js 881 B
./packages/db/dist/esm/utils/browser-polyfills.js 304 B
./packages/db/dist/esm/utils/btree.js 5.61 kB
./packages/db/dist/esm/utils/comparison.js 852 B
./packages/db/dist/esm/utils/cursor.js 457 B
./packages/db/dist/esm/utils/index-optimization.js 1.51 kB
./packages/db/dist/esm/utils/type-guards.js 157 B

compressed-size-action::db-package-size

@github-actions
Copy link
Contributor

github-actions bot commented Dec 10, 2025

Size Change: 0 B

Total Size: 3.35 kB

ℹ️ View Unchanged
Filename Size
./packages/react-db/dist/esm/index.js 225 B
./packages/react-db/dist/esm/useLiveInfiniteQuery.js 1.17 kB
./packages/react-db/dist/esm/useLiveQuery.js 1.12 kB
./packages/react-db/dist/esm/useLiveSuspenseQuery.js 431 B
./packages/react-db/dist/esm/usePacedMutations.js 401 B

compressed-size-action::react-db-package-size

… and export isChangeMessage

Two issues fixed:

1. **isChangeMessage not exported**: The `isChangeMessage` and `isControlMessage` utilities
   were exported from electric.ts but not re-exported from the package's index.ts, making
   them unavailable to users despite documentation stating otherwise.

2. **awaitMatch race condition on inserts**: When `awaitMatch` was called after the Electric
   messages had already been processed (including up-to-date), it would timeout because:
   - The message buffer (`currentBatchMessages`) was cleared on up-to-date
   - Immediate matches found in the buffer still waited for another up-to-date to resolve

   Fixed by:
   - Moving buffer clearing to the START of batch processing (preserves messages until next batch)
   - Adding `batchCommitted` flag to track when a batch is committed
   - For immediate matches: resolve immediately only if batch is committed (consistent with awaitTxId)
   - For immediate matches during batch processing: wait for up-to-date (maintains commit semantics)
   - Set `batchCommitted` BEFORE `resolveMatchedPendingMatches()` to avoid timing window
   - Set `batchCommitted` on snapshot-end in on-demand mode (matching "ready" semantics)

Fixes issue reported on Discord where inserts would timeout while updates worked.
@KyleAMathews KyleAMathews force-pushed the claude/fix-await-match-inserts-018S3Nh8HHeZ8gjEYYvm9Xyy branch from 197c810 to 0c7e819 Compare December 11, 2025 01:51
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants