Skip to content

Commit a2704b0

Browse files
shanejonasGudahtt
authored andcommitted
Changed PollingController to be a mixin so it can be used with both V1 and V2 controllers (#1736)
## Explanation - Currently the PollingController extends from BaseControllerV2 but we need to use it for both V1 and V2 controllers. - This PR uses typescript [mixins](https://www.typescriptlang.org/docs/handbook/mixins.html) to achieve a faux-multiple inheritance which TypeScript has support for. The pattern allows you to create a class which is a merge of many classes. I've added a V1 and a V2 version of the PollingController that can be used almost the same way as the original `PollingController`. --------- Co-authored-by: Mark Stacey <[email protected]>
1 parent 55c0df7 commit a2704b0

File tree

2 files changed

+139
-144
lines changed

2 files changed

+139
-144
lines changed

packages/polling-controller/src/PollingController.test.ts

+7-21
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,6 @@
11
import { ControllerMessenger } from '@metamask/base-controller';
22

3-
import type { PollingCompleteType } from './PollingController';
4-
import PollingController from './PollingController';
3+
import { PollingController } from './PollingController';
54

65
const TICK_TIME = 1000;
76

@@ -27,7 +26,6 @@ describe('PollingController', () => {
2726
metadata: {},
2827
name: 'PollingController',
2928
state: { foo: 'bar' },
30-
pollingIntervalLength: TICK_TIME,
3129
});
3230
controller.start('mainnet');
3331
jest.advanceTimersByTime(TICK_TIME);
@@ -48,7 +46,6 @@ describe('PollingController', () => {
4846
metadata: {},
4947
name: 'PollingController',
5048
state: { foo: 'bar' },
51-
pollingIntervalLength: TICK_TIME,
5249
});
5350
const pollingToken = controller.start('mainnet');
5451
jest.advanceTimersByTime(TICK_TIME);
@@ -69,7 +66,6 @@ describe('PollingController', () => {
6966
metadata: {},
7067
name: 'PollingController',
7168
state: { foo: 'bar' },
72-
pollingIntervalLength: TICK_TIME,
7369
});
7470
const pollingToken1 = controller.start('mainnet');
7571
controller.start('mainnet');
@@ -93,7 +89,6 @@ describe('PollingController', () => {
9389
metadata: {},
9490
name: 'PollingController',
9591
state: { foo: 'bar' },
96-
pollingIntervalLength: TICK_TIME,
9792
});
9893
controller.start('mainnet');
9994
expect(() => {
@@ -113,7 +108,6 @@ describe('PollingController', () => {
113108
metadata: {},
114109
name: 'PollingController',
115110
state: { foo: 'bar' },
116-
pollingIntervalLength: TICK_TIME,
117111
});
118112
controller.start('mainnet');
119113
expect(() => {
@@ -136,7 +130,6 @@ describe('PollingController', () => {
136130
metadata: {},
137131
name: 'PollingController',
138132
state: { foo: 'bar' },
139-
pollingIntervalLength: TICK_TIME,
140133
});
141134
controller.start('mainnet');
142135
jest.advanceTimersByTime(TICK_TIME);
@@ -158,7 +151,6 @@ describe('PollingController', () => {
158151
metadata: {},
159152
name: 'PollingController',
160153
state: { foo: 'bar' },
161-
pollingIntervalLength: TICK_TIME,
162154
});
163155
controller.start('mainnet');
164156
controller.start('mainnet');
@@ -177,25 +169,20 @@ describe('PollingController', () => {
177169
}
178170
const name = 'PollingController';
179171

180-
const mockMessenger = new ControllerMessenger<
181-
any,
182-
PollingCompleteType<typeof name>
183-
>();
184-
185-
mockMessenger.subscribe(`${name}:pollingComplete`, pollingComplete);
172+
const mockMessenger = new ControllerMessenger<any, any>();
186173

187174
const controller = new MyGasFeeController({
188175
messenger: mockMessenger,
189176
metadata: {},
190177
name,
191178
state: { foo: 'bar' },
192-
pollingIntervalLength: TICK_TIME,
193179
});
180+
controller.onPollingComplete('mainnet', pollingComplete);
194181
const pollingToken = controller.start('mainnet');
195182
controller.stop(pollingToken);
196183
expect(pollingComplete).toHaveBeenCalledTimes(1);
197184
});
198-
it('should poll at the interval length passed via the constructor', async () => {
185+
it('should poll at the interval length when set via setIntervalLength', async () => {
199186
jest.useFakeTimers();
200187

201188
class MyGasFeeController extends PollingController<any, any, any> {
@@ -208,8 +195,8 @@ describe('PollingController', () => {
208195
metadata: {},
209196
name: 'PollingController',
210197
state: { foo: 'bar' },
211-
pollingIntervalLength: TICK_TIME * 3,
212198
});
199+
controller.setIntervalLength(TICK_TIME * 3);
213200
controller.start('mainnet');
214201
jest.advanceTimersByTime(TICK_TIME);
215202
await Promise.resolve();
@@ -238,7 +225,6 @@ describe('PollingController', () => {
238225
metadata: {},
239226
name: 'PollingController',
240227
state: { foo: 'bar' },
241-
pollingIntervalLength: TICK_TIME,
242228
});
243229
controller.start('mainnet');
244230
controller.start('rinkeby');
@@ -259,7 +245,7 @@ describe('PollingController', () => {
259245
controller.stopAll();
260246
});
261247

262-
it('should poll multiple networkClientIds at the interval length passed via the constructor', async () => {
248+
it('should poll multiple networkClientIds when setting interval length', async () => {
263249
jest.useFakeTimers();
264250

265251
class MyGasFeeController extends PollingController<any, any, any> {
@@ -272,8 +258,8 @@ describe('PollingController', () => {
272258
metadata: {},
273259
name: 'PollingController',
274260
state: { foo: 'bar' },
275-
pollingIntervalLength: TICK_TIME * 2,
276261
});
262+
controller.setIntervalLength(TICK_TIME * 2);
277263
controller.start('mainnet');
278264
jest.advanceTimersByTime(TICK_TIME);
279265
await Promise.resolve();

0 commit comments

Comments
 (0)