Skip to content

Commit b8c8370

Browse files
authored
Improve BaseControllerV2 messenger type (#556)
The new base controller now accepts the messenger type as a generic parameter, rather than hard-coding it to be `RestrictedControllerMessenger<N, any, any, string, string>`. This allows controllers to use the messenger directly without sacrificing any type safety.
1 parent 5ab9cd6 commit b8c8370

7 files changed

+59
-48
lines changed

src/BaseControllerV2.test.ts

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -60,7 +60,8 @@ function getCountMessenger(
6060

6161
class CountController extends BaseController<
6262
typeof countControllerName,
63-
CountControllerState
63+
CountControllerState,
64+
CountMessenger
6465
> {
6566
update(
6667
callback: (
@@ -653,7 +654,8 @@ describe('getPersistentState', () => {
653654
>;
654655
class VisitorController extends BaseController<
655656
typeof visitorName,
656-
VisitorControllerState
657+
VisitorControllerState,
658+
VisitorMessenger
657659
> {
658660
constructor(messagingSystem: VisitorMessenger) {
659661
super({
@@ -716,7 +718,8 @@ describe('getPersistentState', () => {
716718

717719
class VisitorOverflowController extends BaseController<
718720
typeof visitorOverflowName,
719-
VisitorOverflowControllerState
721+
VisitorOverflowControllerState,
722+
VisitorOverflowMessenger
720723
> {
721724
constructor(messagingSystem: VisitorOverflowMessenger) {
722725
super({

src/BaseControllerV2.ts

Lines changed: 4 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -110,17 +110,12 @@ export type Json =
110110
*/
111111
export class BaseController<
112112
N extends string,
113-
S extends Record<string, unknown>
113+
S extends Record<string, unknown>,
114+
messenger extends RestrictedControllerMessenger<N, any, any, string, string>
114115
> {
115116
private internalState: IsJsonable<S>;
116117

117-
protected messagingSystem: RestrictedControllerMessenger<
118-
N,
119-
any,
120-
any,
121-
string,
122-
string
123-
>;
118+
protected messagingSystem: messenger;
124119

125120
/**
126121
* The name of the controller.
@@ -155,7 +150,7 @@ export class BaseController<
155150
name,
156151
state,
157152
}: {
158-
messenger: RestrictedControllerMessenger<N, any, any, string, string>;
153+
messenger: messenger;
159154
metadata: StateMetadata<S>;
160155
name: N;
161156
state: IsJsonable<S>;

src/ComposableController.test.ts

Lines changed: 11 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,14 @@ type FooControllerEvent = {
2828
payload: [FooControllerState, Patch[]];
2929
};
3030

31+
type FooMessenger = RestrictedControllerMessenger<
32+
'FooController',
33+
never,
34+
FooControllerEvent,
35+
string,
36+
never
37+
>;
38+
3139
const fooControllerStateMetadata = {
3240
foo: {
3341
persist: true,
@@ -37,17 +45,10 @@ const fooControllerStateMetadata = {
3745

3846
class FooController extends BaseControllerV2<
3947
'FooController',
40-
FooControllerState
48+
FooControllerState,
49+
FooMessenger
4150
> {
42-
constructor(
43-
messagingSystem: RestrictedControllerMessenger<
44-
'FooController',
45-
never,
46-
FooControllerEvent,
47-
string,
48-
never
49-
>,
50-
) {
51+
constructor(messagingSystem: FooMessenger) {
5152
super({
5253
messenger: messagingSystem,
5354
metadata: fooControllerStateMetadata,

src/ControllerMessenger.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -33,11 +33,11 @@ type SelectorEventHandler<SelectorReturnValue> = (
3333
previousValue: SelectorReturnValue | undefined,
3434
) => void;
3535

36-
type ActionConstraint = {
36+
export type ActionConstraint = {
3737
type: string;
3838
handler: (...args: any) => unknown;
3939
};
40-
type EventConstraint = { type: string; payload: unknown[] };
40+
export type EventConstraint = { type: string; payload: unknown[] };
4141

4242
type EventSubscriptionMap = Map<
4343
GenericEventHandler | SelectorEventHandler<unknown>,

src/assets/CurrencyRateController.ts

Lines changed: 11 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -40,6 +40,14 @@ export type GetCurrencyRateState = {
4040
handler: () => CurrencyRateState;
4141
};
4242

43+
type CurrencyRateMessenger = RestrictedControllerMessenger<
44+
typeof name,
45+
GetCurrencyRateState,
46+
CurrencyRateStateChange,
47+
never,
48+
never
49+
>;
50+
4351
const metadata = {
4452
conversionDate: { persist: true, anonymous: true },
4553
conversionRate: { persist: true, anonymous: true },
@@ -66,7 +74,8 @@ const defaultState = {
6674
*/
6775
export class CurrencyRateController extends BaseController<
6876
typeof name,
69-
CurrencyRateState
77+
CurrencyRateState,
78+
CurrencyRateMessenger
7079
> {
7180
private mutex = new Mutex();
7281

@@ -97,13 +106,7 @@ export class CurrencyRateController extends BaseController<
97106
}: {
98107
includeUsdRate?: boolean;
99108
interval?: number;
100-
messenger: RestrictedControllerMessenger<
101-
typeof name,
102-
GetCurrencyRateState,
103-
CurrencyRateStateChange,
104-
never,
105-
never
106-
>;
109+
messenger: CurrencyRateMessenger;
107110
state?: Partial<CurrencyRateState>;
108111
fetchExchangeRate?: typeof defaultFetchExchangeRate;
109112
}) {

src/assets/TokenListController.ts

Lines changed: 11 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -72,6 +72,14 @@ interface TokensChainsCache {
7272
[chainSlug: string]: DataCache;
7373
}
7474

75+
type TokenListMessenger = RestrictedControllerMessenger<
76+
typeof name,
77+
GetTokenListState,
78+
TokenListStateChange,
79+
never,
80+
never
81+
>;
82+
7583
const metadata = {
7684
tokenList: { persist: true, anonymous: true },
7785
tokensChainsCache: { persist: true, anonymous: true },
@@ -87,7 +95,8 @@ const defaultState: TokenListState = {
8795
*/
8896
export class TokenListController extends BaseController<
8997
typeof name,
90-
TokenListState
98+
TokenListState,
99+
TokenListMessenger
91100
> {
92101
private mutex = new Mutex();
93102

@@ -129,13 +138,7 @@ export class TokenListController extends BaseController<
129138
) => void;
130139
interval?: number;
131140
cacheRefreshThreshold?: number;
132-
messenger: RestrictedControllerMessenger<
133-
typeof name,
134-
GetTokenListState,
135-
TokenListStateChange,
136-
never,
137-
never
138-
>;
141+
messenger: TokenListMessenger;
139142
state?: Partial<TokenListState>;
140143
}) {
141144
super({

src/gas/GasFeeController.ts

Lines changed: 14 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -189,6 +189,14 @@ export type GetGasFeeState = {
189189
handler: () => GasFeeState;
190190
};
191191

192+
type GasFeeMessenger = RestrictedControllerMessenger<
193+
typeof name,
194+
GetGasFeeState,
195+
GasFeeStateChange,
196+
never,
197+
never
198+
>;
199+
192200
const defaultState: GasFeeState = {
193201
gasFeeEstimates: {},
194202
estimatedGasFeeTimeBounds: {},
@@ -198,7 +206,11 @@ const defaultState: GasFeeState = {
198206
/**
199207
* Controller that retrieves gas fee estimate data and polls for updated data on a set interval
200208
*/
201-
export class GasFeeController extends BaseController<typeof name, GasFeeState> {
209+
export class GasFeeController extends BaseController<
210+
typeof name,
211+
GasFeeState,
212+
GasFeeMessenger
213+
> {
202214
private intervalId?: NodeJS.Timeout;
203215

204216
private intervalDelay;
@@ -248,13 +260,7 @@ export class GasFeeController extends BaseController<typeof name, GasFeeState> {
248260
EIP1559APIEndpoint = GAS_FEE_API,
249261
}: {
250262
interval?: number;
251-
messenger: RestrictedControllerMessenger<
252-
typeof name,
253-
GetGasFeeState,
254-
GasFeeStateChange,
255-
never,
256-
never
257-
>;
263+
messenger: GasFeeMessenger;
258264
state?: GasFeeState;
259265
fetchGasEstimates?: typeof defaultFetchGasEstimates;
260266
fetchEthGasPriceEstimate?: typeof defaultFetchEthGasPriceEstimate;

0 commit comments

Comments
 (0)