Skip to content

Commit

Permalink
fix: let the provider decide when to reuse an existing subscription ID (
Browse files Browse the repository at this point in the history
#2929)

Fix for #2926

Signed-off-by: Giuseppe Bertone <[email protected]>
  • Loading branch information
Neurone authored Sep 3, 2024
1 parent 5018b23 commit 9e3ccd3
Show file tree
Hide file tree
Showing 3 changed files with 47 additions and 5 deletions.
1 change: 1 addition & 0 deletions docs/configuration.md
Original file line number Diff line number Diff line change
Expand Up @@ -123,6 +123,7 @@ Unless you need to set a non-default value, it is recommended to only populate o
| `WS_CACHE_TTL` | "20000" | The time to live for cached entries. |
| `WS_NEW_HEADS_ENABLED`. | "true" | Enables subscriptions for the latest blocks, `newHeads`. |
| `WS_PING_INTERVAL` | "100000" | Interval between ping messages. Set to `0` to disable pinger. |
| `WS_SAME_SUB_FOR_SAME_EVENT` | "true" | The relay will return the same subscription ID when a client subscribes to the same event multiple times using a single connection. When set to false, the relay will always create a new subscription ID for each `eth_subscribe' request. |

## Sample for connecting to Hedera Environments

Expand Down
16 changes: 11 additions & 5 deletions packages/relay/src/lib/subscriptionController.ts
Original file line number Diff line number Diff line change
Expand Up @@ -41,6 +41,7 @@ export class SubscriptionController {
private cache;
private activeSubscriptionHistogram: Histogram;
private resultsSentToSubscribersCounter: Counter;
private useTheSameSubscriptionForTheSameEvent: boolean;

constructor(poller: Poller, logger: Logger, register: Registry) {
this.poller = poller;
Expand Down Expand Up @@ -76,6 +77,9 @@ export class SubscriptionController {
registers: [register],
labelNames: ['subId', 'tag'],
});

// Default: true
this.useTheSameSubscriptionForTheSameEvent = process.env.WS_SAME_SUB_FOR_SAME_EVENT?.toLowerCase() !== 'false';
}

createHash(data) {
Expand All @@ -99,11 +103,13 @@ export class SubscriptionController {
this.subscriptions[tag] = [];
}

// Check if the connection is already subscribed to this event
const existingSub = this.subscriptions[tag].find((sub) => sub.connection.id === connection.id);
if (existingSub) {
this.logger.debug(`Connection ${connection.id}: Attempting to subscribe to ${tag}; already subscribed`);
return existingSub.subscriptionId;
if (this.useTheSameSubscriptionForTheSameEvent) {
// Check if the connection is already subscribed to this event
const existingSub = this.subscriptions[tag].find((sub) => sub.connection.id === connection.id);
if (existingSub) {
this.logger.debug(`Connection ${connection.id}: Attempting to subscribe to ${tag}; already subscribed`);
return existingSub.subscriptionId;
}
}

const subId = this.generateId();
Expand Down
35 changes: 35 additions & 0 deletions packages/relay/tests/lib/subscriptionController.spec.ts
Original file line number Diff line number Diff line change
Expand Up @@ -263,4 +263,39 @@ describe('subscriptionController', async function () {
subscriptionController.unsubscribe(wsConnection, subId);
subscriptionController.unsubscribe(wsConnection, subId2);
});

describe('With WS_SAME_SUB_FOR_SAME_EVENT == `false`', async function () {
let originalEnv;
let originalSubscriptionController;

before(() => {
originalEnv = process.env.WS_SAME_SUB_FOR_SAME_EVENT;
originalSubscriptionController = subscriptionController;

process.env.WS_SAME_SUB_FOR_SAME_EVENT = 'false';
const registry = new Registry();
poller = new Poller(ethImpl, logger, registry);
subscriptionController = new SubscriptionController(poller, logger, registry);
});

after(() => {
process.env.WS_SAME_SUB_FOR_SAME_EVENT = originalEnv;
subscriptionController = originalSubscriptionController;
});

it('Subscribing to the same event and filters should return different subscription id', async function () {
const connectionId = '7';
const wsConnection = new MockWsConnection(connectionId);
const tag1 = {
event: 'logs',
filters: { topics: ['0xddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef'] },
};
const subId = subscriptionController.subscribe(wsConnection, tag1.event);
const subId2 = subscriptionController.subscribe(wsConnection, tag1.event);

expect(subId).to.be.not.eq(subId2);
subscriptionController.unsubscribe(wsConnection, subId);
subscriptionController.unsubscribe(wsConnection, subId2);
});
});
});

0 comments on commit 9e3ccd3

Please sign in to comment.