firebase / firebase/firebase-tools
[Emulator] Using runTransaction with Firestore Enterprise results in UNKNOWN error on Admin SDK
- Dominant language
- TypeScript
- Stars
- 4.5k
- Forks
- 1.3k
- Avg merge
- 1d 12h
- Merged PRs (30d)
- 84
Description
### [REQUIRED] Environment info
**firebase-tools:** 15.20.0
**firebase-admin:** 14.0.0
**Platform:** Linux (Ubuntu 26.04) and macOS (Tahoe 26.5.1)
### [REQUIRED] Test case
Make sure to set `edition: "enterprise"` in `firebase.json`.
```json
{
"emulators": {
"firestore": {
"port": 8080,
"edition": "enterprise"
},
"singleProjectMode": true
},
"firestore": {
"database": "enterprise",
"edition": "enterprise",
"location": "eur3",
"rules": "firestore.rules",
"indexes": "firestore.indexes.json"
}
}
```
### [REQUIRED] Steps to reproduce
Simply run example below in the Admin SDK environment. It doesn't have to be an aggregate query, any query will do.
```typescript
import { initializeApp } from 'firebase-admin/app';
import { getFirestore } from 'firebase-admin/firestore';
const app = initializeApp();
const firestore = getFirestore(app);
await firestore.runTransaction(async (transaction) => {
const querySnapshot = await transaction.get(
firestore.collection('test').count()
);
console.log(querySnapshot.data().count);
});
```
### [REQUIRED] Expected behavior
Transaction to execute and return the result.
### [REQUIRED] Actual behavior
Instead it results in an UNKNOWN error.
```json
{"severity":"ERROR","message":"Unhandled error Error: 2 UNKNOWN: \n at callErrorFromStatus (/Users/someuser/Sites/someproject/functions/node_modules/.pnpm/@grpc+grpc-js@1.14.4/node_modules/@grpc/grpc-js/build/src/call.js:32:19)\n at Object.onReceiveStatus (/Users/someuser/Sites/someproject/functions/node_modules/.pnpm/@grpc+grpc-js@1.14.4/node_modules/@grpc/grpc-js/build/src/client.js:359:73)\n at Object.onReceiveStatus (/Users/someuser/Sites/someproject/functions/node_modules/.pnpm/@grpc+grpc-js@1.14.4/node_modules/@grpc/grpc-js/build/src/client-interceptors.js:327:181)\n at /Users/someuser/Sites/someproject/functions/node_modules/.pnpm/@grpc+grpc-js@1.14.4/node_modules/@grpc/grpc-js/build/src/resolving-call.js:135:78\n at process.processTicksAndRejections (node:internal/process/task_queues:85:11)\nfor call at\n at ServiceClientImpl.makeServerStreamRequest (/Users/someuser/Sites/someproject/functions/node_modules/.pnpm/@grpc+grpc-js@1.14.4/node_modules/@grpc/grpc-js/build/src/client.js:342:32)\n at ServiceClientImpl. (/Users/someuser/Sites/someproject/functions/node_modules/.pnpm/@grpc+grpc-js@1.14.4/node_modules/@grpc/grpc-js/build/src/make-client.js:105:19)\n at /Users/someuser/Sites/someproject/functions/node_modules/.pnpm/@google-cloud+firestore@8.6.0/node_modules/@google-cloud/firestore/build/src/v1/firestore_client.js:257:29\n at /Users/someuser/Sites/someproject/functions/node_modules/.pnpm/google-gax@5.0.7/node_modules/google-gax/build/src/streamingCalls/streamingApiCaller.js:39:28\n at /Users/someuser/Sites/someproject/functions/node_modules/.pnpm/google-gax@5.0.7/node_modules/google-gax/build/src/normalCalls/timeout.js:44:16\n at Object.request (/Users/someuser/Sites/someproject/functions/node_modules/.pnpm/google-gax@5.0.7/node_modules/google-gax/build/src/streamingCalls/streaming.js:248:40)\n at Timeout.makeRequest [as _onTimeout] (/Users/someuser/Sites/someproject/functions/node_modules/.pnpm/retry-request@8.0.3/node_modules/retry-request/index.js:159:28)\n at listOnTimeout (node:internal/timers:605:17)\n at process.processTimers (node:internal/timers:541:7)\nCaused by: Error\n at QueryUtil._getResponse (/Users/someuser/Sites/someproject/functions/node_modules/.pnpm/@google-cloud+firestore@8.6.0/node_modules/@google-cloud/firestore/build/src/reference/query-util.js:47:23)\n at Query._getResponse (/Users/someuser/Sites/someproject/functions/node_modules/.pnpm/@google-cloud+firestore@8.6.0/node_modules/@google-cloud/firestore/build/src/reference/query.js:905:32)\n at Query._get (/Users/someuser/Sites/someproject/functions/node_modules/.pnpm/@google-cloud+firestore@8.6.0/node_modules/@google-cloud/firestore/build/src/reference/query.js:898:35)\n at Transaction.getQueryFn (/Users/someuser/Sites/someproject/functions/node_modules/.pnpm/@google-cloud+firestore@8.6.0/node_modules/@google-cloud/firestore/build/src/transaction.js:579:22)\n at Transaction.withLazyStartedTransaction (/Users/someuser/Sites/someproject/functions/node_modules/.pnpm/@google-cloud+firestore@8.6.0/node_modules/@google-cloud/firestore/build/src/transaction.js:551:48)\n at /Users/someuser/Sites/someproject/functions/node_modules/.pnpm/@google-cloud+firestore@8.6.0/node_modules/@google-cloud/firestore/build/src/transaction.js:125:29\n at /Users/someuser/Sites/someproject/functions/node_modules/.pnpm/@google-cloud+firestore@8.6.0/node_modules/@google-cloud/firestore/build/src/telemetry/enabled-trace-util.js:125:30\n at NoopContextManager.with (/Users/someuser/Sites/someproject/functions/node_modules/.pnpm/@opentelemetry+api@1.9.1/node_modules/@opentelemetry/api/build/src/context/NoopContextManager.js:14:19)\n at ContextAPI.with (/Users/someuser/Sites/someproject/functions/node_modules/.pnpm/@opentelemetry+api@1.9.1/node_modules/@opentelemetry/api/build/src/api/context.js:51:46)\n at NoopTracer.startActiveSpan (/Users/someuser/Sites/someproject/functions/node_modules/.pnpm/@opentelemetry+api@1.9.1/node_modules/@opentelemetry/api/build/src/trace/NoopTracer.js:54:31) {\n code: 2,\n details: '',\n metadata: Metadata {\n internalRepr: Map(1) { 'content-type' => [Array] },\n opaqueData: Map(0) {},\n options: {}\n }\n}"}
```
Contributor guide
Research direction
Start with the firebase.json emulator configuration and run the provided TypeScript Admin SDK reproduction using Firestore Enterprise and runTransaction. Trace the emulator's transaction query handling for the count query, then verify that the transaction completes and returns the query result instead of an UNKNOWN error.
Written by the indexing model from the issue text.
Assessment
- Tech stack
- firebase, typescript
- Domain
- cli, databases
- Issue type
- Bug
- Difficulty
- 4/5
- Estimated time
- 3-5 days
- Activity status
- Quiet
- Clarity
- Mostly clear
- Newbie friendliness
- 48/100