firebase / firebase/firebase-admin-node
[Data Connect] getDataConnect() ignores connector field in cache key
- Lenguaje dominante
- TypeScript
- Estrellas
- 1.7k
- Forks
- 419
- Merge medio
- 3 d 10 h
- PR fusionados (30 d)
- 16
Descripción
### [READ] Step 1: Are you in the right place?
Yes, this is a bug in the `firebase-admin/data-connect` module code.
### [REQUIRED] Step 2: Describe your environment
* Operating System version: macOS / Linux
* Firebase SDK version: firebase-admin@13.x (all versions with Data Connect support)
* Firebase Product: Data Connect
* Node.js version: 24.x
* NPM version: 11.x
### [REQUIRED] Step 3: Describe the problem
#### Summary
The `DataConnectService.getDataConnect()` method caches `DataConnect` instances using only `location` and `serviceId` as the cache key, ignoring the `connector` field from `ConnectorConfig`.
This causes incorrect behavior when using multiple connectors with the same Data Connect service.
#### Steps to reproduce:
1. Create a Data Connect service with multiple connectors (e.g., `public`, `user`, `admin`)
2. Call `getDataConnect()` with different connector configs that share the same `location` and `serviceId`
3. Observe that both calls return the same `DataConnect` instance
#### Expected behavior:
Each unique combination of `location`, `serviceId`, and `connector` should return a distinct `DataConnect` instance.
#### Actual behavior:
The second call returns the cached instance from the first call, ignoring the different `connector` value.
#### Relevant Code:
```typescript
import { getDataConnect, ConnectorConfig } from 'firebase-admin/data-connect';
const publicConfig: ConnectorConfig = {
location: 'us-west2',
serviceId: 'my-service',
connector: 'public',
};
const userConfig: ConnectorConfig = {
location: 'us-west2',
serviceId: 'my-service',
connector: 'user', // Different connector!
};
const publicDc = getDataConnect(publicConfig);
const userDc = getDataConnect(userConfig);
console.log(publicDc === userDc); // true (BUG! Should be false)
console.log(userDc.connectorConfig.connector); // 'public' (BUG! Should be 'user')
```
#### Impact:
When using multiple connectors (a common pattern for role-based access control), operations intended for one connector are incorrectly routed to another, causing "operation not found" errors.
#### Root cause:
In `src/data-connect/data-connect.ts`, line 39:
```typescript
const id = `${connectorConfig.location}-${connectorConfig.serviceId}`;
```
The cache key should also include the `connector` field:
```typescript
const id = `${connectorConfig.location}-${connectorConfig.serviceId}-${connectorConfig.connector ?? ''}`;
```
I have a fix ready with tests: #3055
Guía de contribución
Evaluación
Este issue todavía no se ha evaluado.