firebase / firebase/firebase-admin-node

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

Đang mở
#3,054 2 bình luận 1 reaction 1 người được giao Được @stephenarosaj nhận Xem trên GitHub
Ngôn ngữ chính
TypeScript
Star
1.7k
Fork
419
Merge trung bình
3 ngày 10 giờ
Pull request đã merge (30 ngày)
16

Mô tả

### [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

Hướng dẫn đóng góp

Mở hướng dẫn đóng góp

Đánh giá

Issue này chưa được đánh giá.

Nhận issue mới trong hộp thư của bạn

Bản tóm tắt ngắn những issue GitHub phù hợp với người mới.