Skip to content

Commit 65c1a72

Browse files
authored
feat: adds factory for PendingTransactionStorage creation (#4573)
Signed-off-by: Simeon Nakov <[email protected]>
1 parent 8a7783c commit 65c1a72

File tree

3 files changed

+72
-5
lines changed

3 files changed

+72
-5
lines changed

packages/relay/src/lib/relay.ts

Lines changed: 2 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -25,8 +25,7 @@ import HAPIService from './services/hapiService/hapiService';
2525
import { HbarLimitService } from './services/hbarLimitService';
2626
import MetricService from './services/metricService/metricService';
2727
import { registerRpcMethods } from './services/registryService/rpcMethodRegistryService';
28-
import { LocalPendingTransactionStorage } from './services/transactionPoolService/LocalPendingTransactionStorage';
29-
import { RedisPendingTransactionStorage } from './services/transactionPoolService/RedisPendingTransactionStorage';
28+
import { PendingTransactionStorageFactory } from './services/transactionPoolService/PendingTransactionStorageFactory';
3029
import {
3130
IEthExecutionEventPayload,
3231
IExecuteQueryEventPayload,
@@ -327,9 +326,7 @@ export class Relay {
327326
: this.mirrorNodeClient;
328327
this.metricService = new MetricService(this.logger, metricsCollector, this.register, hbarLimitService);
329328

330-
const storage = this.redisClient
331-
? new RedisPendingTransactionStorage(this.redisClient)
332-
: new LocalPendingTransactionStorage();
329+
const storage = PendingTransactionStorageFactory.create(this.redisClient);
333330

334331
// Create Eth implementation with connected Redis client
335332
this.ethImpl = new EthImpl(
Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,26 @@
1+
// SPDX-License-Identifier: Apache-2.0
2+
3+
import { RedisClientType } from 'redis';
4+
5+
import { PendingTransactionStorage } from '../../types/transactionPool';
6+
import { LocalPendingTransactionStorage } from './LocalPendingTransactionStorage';
7+
import { RedisPendingTransactionStorage } from './RedisPendingTransactionStorage';
8+
9+
/**
10+
* Factory for creating PendingTransactionStorage instances.
11+
*
12+
* Encapsulates the logic for selecting the appropriate storage implementation
13+
* based on available infrastructure (Redis vs in-memory).
14+
*/
15+
export class PendingTransactionStorageFactory {
16+
/**
17+
* Creates a PendingTransactionStorage instance.
18+
*
19+
* @param redisClient - Optional Redis client. If provided, creates Redis-backed storage;
20+
* otherwise creates local in-memory storage.
21+
* @returns A PendingTransactionStorage implementation.
22+
*/
23+
static create(redisClient?: RedisClientType): PendingTransactionStorage {
24+
return redisClient ? new RedisPendingTransactionStorage(redisClient) : new LocalPendingTransactionStorage();
25+
}
26+
}
Lines changed: 44 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,44 @@
1+
// SPDX-License-Identifier: Apache-2.0
2+
3+
import chai, { expect } from 'chai';
4+
import chaiAsPromised from 'chai-as-promised';
5+
6+
import { LocalPendingTransactionStorage } from '../../../../src/lib/services/transactionPoolService/LocalPendingTransactionStorage';
7+
import { PendingTransactionStorageFactory } from '../../../../src/lib/services/transactionPoolService/PendingTransactionStorageFactory';
8+
import { RedisPendingTransactionStorage } from '../../../../src/lib/services/transactionPoolService/RedisPendingTransactionStorage';
9+
10+
chai.use(chaiAsPromised);
11+
12+
describe('PendingTransactionStorageFactory', () => {
13+
describe('create', () => {
14+
it('should return LocalPendingTransactionStorage when redisClient is not provided', () => {
15+
const storage = PendingTransactionStorageFactory.create();
16+
17+
expect(storage).to.be.instanceOf(LocalPendingTransactionStorage);
18+
});
19+
20+
it('should return LocalPendingTransactionStorage when redisClient is undefined', () => {
21+
const storage = PendingTransactionStorageFactory.create(undefined);
22+
23+
expect(storage).to.be.instanceOf(LocalPendingTransactionStorage);
24+
});
25+
26+
it('should return RedisPendingTransactionStorage when redisClient is provided', () => {
27+
// Mock Redis client - just needs to be a truthy object for the factory logic
28+
const mockRedisClient = {} as any;
29+
30+
const storage = PendingTransactionStorageFactory.create(mockRedisClient);
31+
32+
expect(storage).to.be.instanceOf(RedisPendingTransactionStorage);
33+
});
34+
35+
it('should create different storage instances on multiple calls', () => {
36+
const storage1 = PendingTransactionStorageFactory.create();
37+
const storage2 = PendingTransactionStorageFactory.create();
38+
39+
expect(storage1).to.not.equal(storage2);
40+
expect(storage1).to.be.instanceOf(LocalPendingTransactionStorage);
41+
expect(storage2).to.be.instanceOf(LocalPendingTransactionStorage);
42+
});
43+
});
44+
});

0 commit comments

Comments
 (0)