Skip to content

Conversation

@KyleAMathews
Copy link
Collaborator

@KyleAMathews KyleAMathews commented Jan 22, 2026

Summary

Enhanced TimeoutWaitingForTxIdError to provide actionable debugging information when awaitTxId times out, showing which txids arrived during the timeout and linking to documentation about the common cause.

User impact: Developers debugging timeout issues can now see whether transactions are being received at all, making it much easier to diagnose whether the issue is network-related or a pg_current_xact_id() placement problem.


Root Cause (of the DX problem)

When awaitTxId times out, users previously got a generic "Timeout waiting for txId: X" message with no context about what went wrong. The most common cause—calling pg_current_xact_id() outside the transaction that performs the mutation—was not surfaced.

Approach

  1. Track txids during timeout: Capture a snapshot of seen txids at the start of the wait, then record any new txids that arrive during the timeout period
  2. Enhanced error message: Include the list of received txids (or "no txids received") plus a hint about the common cause with a link to documentation

Key code path (electric.ts:639-665):

const txidsAtStart = new Set(seenTxids.state)
const txidsReceivedDuringTimeout: Array<Txid> = []

// In timeout handler:
reject(new TimeoutWaitingForTxIdError(txId, config.id, txidsReceivedDuringTimeout))

// In subscription:
for (const seenTxid of seenTxids.state) {
  if (!txidsAtStart.has(seenTxid) && !txidsReceivedDuringTimeout.includes(seenTxid)) {
    txidsReceivedDuringTimeout.push(seenTxid)
  }
}

Key Invariants

  • The receivedTxids parameter is optional for backward compatibility
  • Tracking only starts when entering the Promise (not on immediate resolution)
  • Duplicate txids are not added to the tracking array

Non-goals

  • Not changing timeout duration or retry behavior
  • Not adding automatic retry logic

Verification

pnpm test

All 404 tests pass.

Files Changed

File Change
packages/electric-db-collection/src/electric.ts Track txids received during timeout, pass to error
packages/electric-db-collection/src/errors.ts Add receivedTxids param, format debugging info, add hint with docs link

Checklist

  • Tested locally with pnpm test
  • Generated changeset

🤖 Generated with Claude Code

Include the txids received during the timeout period in the
TimeoutWaitingForTxIdError message. This helps diagnose the common
issue where pg_current_xact_id() is called outside the transaction
that performs the mutation.

The error now shows:
- The txid that was being awaited
- Which txids were received during the timeout (or none)
- A hint about the common cause and link to documentation
@changeset-bot
Copy link

changeset-bot bot commented Jan 22, 2026

🦋 Changeset detected

Latest commit: 2c8c9a1

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 Jan 22, 2026

More templates

@tanstack/angular-db

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

@tanstack/db

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

@tanstack/db-ivm

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

@tanstack/electric-db-collection

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

@tanstack/offline-transactions

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

@tanstack/powersync-db-collection

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

@tanstack/query-db-collection

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

@tanstack/react-db

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

@tanstack/rxdb-db-collection

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

@tanstack/solid-db

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

@tanstack/svelte-db

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

@tanstack/trailbase-db-collection

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

@tanstack/vue-db

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

commit: 2c8c9a1

@github-actions
Copy link
Contributor

github-actions bot commented Jan 22, 2026

Size Change: 0 B

Total Size: 90.9 kB

ℹ️ View Unchanged
Filename Size
./packages/db/dist/esm/collection/change-events.js 1.39 kB
./packages/db/dist/esm/collection/changes.js 1.19 kB
./packages/db/dist/esm/collection/events.js 388 B
./packages/db/dist/esm/collection/index.js 3.32 kB
./packages/db/dist/esm/collection/indexes.js 1.1 kB
./packages/db/dist/esm/collection/lifecycle.js 1.68 kB
./packages/db/dist/esm/collection/mutations.js 2.34 kB
./packages/db/dist/esm/collection/state.js 3.49 kB
./packages/db/dist/esm/collection/subscription.js 3.62 kB
./packages/db/dist/esm/collection/sync.js 2.41 kB
./packages/db/dist/esm/deferred.js 207 B
./packages/db/dist/esm/errors.js 4.7 kB
./packages/db/dist/esm/event-emitter.js 748 B
./packages/db/dist/esm/index.js 2.69 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 4.08 kB
./packages/db/dist/esm/query/builder/ref-proxy.js 1.05 kB
./packages/db/dist/esm/query/compiler/evaluators.js 1.42 kB
./packages/db/dist/esm/query/compiler/expressions.js 430 B
./packages/db/dist/esm/query/compiler/group-by.js 1.81 kB
./packages/db/dist/esm/query/compiler/index.js 2.02 kB
./packages/db/dist/esm/query/compiler/joins.js 2.07 kB
./packages/db/dist/esm/query/compiler/order-by.js 1.45 kB
./packages/db/dist/esm/query/compiler/select.js 1.06 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.42 kB
./packages/db/dist/esm/query/live/collection-registry.js 264 B
./packages/db/dist/esm/query/live/collection-subscriber.js 1.93 kB
./packages/db/dist/esm/query/live/internal.js 145 B
./packages/db/dist/esm/query/optimizer.js 2.56 kB
./packages/db/dist/esm/query/predicate-utils.js 2.97 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 924 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 Jan 22, 2026

Size Change: 0 B

Total Size: 3.7 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.34 kB
./packages/react-db/dist/esm/useLiveSuspenseQuery.js 559 B
./packages/react-db/dist/esm/usePacedMutations.js 401 B

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

KyleAMathews and others added 2 commits January 22, 2026 16:15
Improves readability by replacing nested ternary with explicit
conditionals in formatReceivedTxidsInfo helper function.

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

Status: Ready for review

Development

Successfully merging this pull request may close these issues.

3 participants