firebase / firebase/firebase-admin-node

[Data Connect] getDataConnect() ignores connector field in cache key

Abierto
#3,054 2 comentarios 1 reacción 1 asignado Reclamado por @stephenarosaj Ver en GitHub
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

Abrir la guía de contribución

Evaluación

Este issue todavía no se ha evaluado.

Recibe los nuevos issues en tu correo

Un resumen breve de issues de GitHub para principiantes.