Skip to content

Commit fc83d41

Browse files
committed
WIP
1 parent c5f630e commit fc83d41

File tree

4 files changed

+609
-253
lines changed

4 files changed

+609
-253
lines changed

packages/base-controller/src/BaseControllerV2.test.ts

Lines changed: 88 additions & 95 deletions
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,6 @@ import {
1313
isBaseController,
1414
} from './BaseControllerV2';
1515
import { Messenger } from './Messenger';
16-
import type { RestrictedMessenger } from './RestrictedMessenger';
1716
import { JsonRpcEngine } from '../../json-rpc-engine/src';
1817

1918
export const countControllerName = 'CountController';
@@ -39,31 +38,19 @@ export const countControllerStateMetadata = {
3938
},
4039
};
4140

42-
type CountMessenger = RestrictedMessenger<
43-
typeof countControllerName,
41+
type CountMessenger = Messenger<
4442
CountControllerAction,
4543
CountControllerEvent,
46-
never,
47-
never
44+
typeof countControllerName
4845
>;
4946

5047
/**
51-
* Constructs a restricted messenger for the Count controller.
48+
* Construct the Count controller messenger.
5249
*
53-
* @param messenger - The messenger.
54-
* @returns A restricted messenger for the Count controller.
50+
* @returns The Count controller messenger.
5551
*/
56-
export function getCountMessenger(
57-
messenger?: Messenger<CountControllerAction, CountControllerEvent>,
58-
): CountMessenger {
59-
if (!messenger) {
60-
messenger = new Messenger<CountControllerAction, CountControllerEvent>();
61-
}
62-
return messenger.getRestricted({
63-
name: countControllerName,
64-
allowedActions: [],
65-
allowedEvents: [],
66-
});
52+
export function getCountMessenger(): CountMessenger {
53+
return new Messenger({ namespace: countControllerName });
6754
}
6855

6956
export class CountController extends BaseController<
@@ -118,34 +105,19 @@ const messagesControllerStateMetadata = {
118105
},
119106
};
120107

121-
type MessagesMessenger = RestrictedMessenger<
122-
typeof messagesControllerName,
108+
type MessagesMessenger = Messenger<
123109
MessagesControllerAction,
124110
MessagesControllerEvent,
125-
never,
126-
never
111+
typeof messagesControllerName
127112
>;
128113

129114
/**
130-
* Constructs a restricted messenger for the Messages controller.
115+
* Construct the Messages controller messenger.
131116
*
132-
* @param messenger - The messenger.
133-
* @returns A restricted messenger for the Messages controller.
117+
* @returns The Messages controller messenger.
134118
*/
135-
function getMessagesMessenger(
136-
messenger?: Messenger<MessagesControllerAction, MessagesControllerEvent>,
137-
): MessagesMessenger {
138-
if (!messenger) {
139-
messenger = new Messenger<
140-
MessagesControllerAction,
141-
MessagesControllerEvent
142-
>();
143-
}
144-
return messenger.getRestricted({
145-
name: messagesControllerName,
146-
allowedActions: [],
147-
allowedEvents: [],
148-
});
119+
function getMessagesMessenger(): MessagesMessenger {
120+
return new Messenger({ namespace: messagesControllerName });
149121
}
150122

151123
class MessagesController extends BaseController<
@@ -173,12 +145,8 @@ class MessagesController extends BaseController<
173145

174146
describe('isBaseController', () => {
175147
it('should return true if passed a V2 controller', () => {
176-
const messenger = new Messenger<
177-
CountControllerAction,
178-
CountControllerEvent
179-
>();
180148
const controller = new CountController({
181-
messenger: getCountMessenger(messenger),
149+
messenger: getCountMessenger(),
182150
name: countControllerName,
183151
state: { count: 0 },
184152
metadata: countControllerStateMetadata,
@@ -209,12 +177,9 @@ describe('BaseController', () => {
209177
});
210178

211179
it('should allow getting state via the getState action', () => {
212-
const messenger = new Messenger<
213-
CountControllerAction,
214-
CountControllerEvent
215-
>();
180+
const messenger = getCountMessenger();
216181
new CountController({
217-
messenger: getCountMessenger(messenger),
182+
messenger,
218183
name: countControllerName,
219184
state: { count: 0 },
220185
metadata: countControllerStateMetadata,
@@ -409,9 +374,9 @@ describe('BaseController', () => {
409374
});
410375

411376
it('should inform subscribers of state changes as a result of applying patches', () => {
412-
const messenger = new Messenger<never, CountControllerEvent>();
377+
const messenger = getCountMessenger();
413378
const controller = new CountController({
414-
messenger: getCountMessenger(messenger),
379+
messenger,
415380
name: 'CountController',
416381
state: { count: 0 },
417382
metadata: countControllerStateMetadata,
@@ -438,9 +403,9 @@ describe('BaseController', () => {
438403
});
439404

440405
it('should inform subscribers of state changes', () => {
441-
const messenger = new Messenger<never, CountControllerEvent>();
406+
const messenger = getCountMessenger();
442407
const controller = new CountController({
443-
messenger: getCountMessenger(messenger),
408+
messenger,
444409
name: 'CountController',
445410
state: { count: 0 },
446411
metadata: countControllerStateMetadata,
@@ -467,9 +432,9 @@ describe('BaseController', () => {
467432
});
468433

469434
it('should notify a subscriber with a selector of state changes', () => {
470-
const messenger = new Messenger<never, CountControllerEvent>();
435+
const messenger = getCountMessenger();
471436
const controller = new CountController({
472-
messenger: getCountMessenger(messenger),
437+
messenger,
473438
name: 'CountController',
474439
state: { count: 0 },
475440
metadata: countControllerStateMetadata,
@@ -493,9 +458,9 @@ describe('BaseController', () => {
493458
});
494459

495460
it('should not inform a subscriber of state changes if the selected value is unchanged', () => {
496-
const messenger = new Messenger<never, CountControllerEvent>();
461+
const messenger = getCountMessenger();
497462
const controller = new CountController({
498-
messenger: getCountMessenger(messenger),
463+
messenger,
499464
name: 'CountController',
500465
state: { count: 0 },
501466
metadata: countControllerStateMetadata,
@@ -519,9 +484,9 @@ describe('BaseController', () => {
519484
});
520485

521486
it('should inform a subscriber of each state change once even after multiple subscriptions', () => {
522-
const messenger = new Messenger<never, CountControllerEvent>();
487+
const messenger = getCountMessenger();
523488
const controller = new CountController({
524-
messenger: getCountMessenger(messenger),
489+
messenger,
525490
name: 'CountController',
526491
state: { count: 0 },
527492
metadata: countControllerStateMetadata,
@@ -543,9 +508,9 @@ describe('BaseController', () => {
543508
});
544509

545510
it('should no longer inform a subscriber about state changes after unsubscribing', () => {
546-
const messenger = new Messenger<never, CountControllerEvent>();
511+
const messenger = getCountMessenger();
547512
const controller = new CountController({
548-
messenger: getCountMessenger(messenger),
513+
messenger,
549514
name: 'CountController',
550515
state: { count: 0 },
551516
metadata: countControllerStateMetadata,
@@ -562,9 +527,9 @@ describe('BaseController', () => {
562527
});
563528

564529
it('should no longer inform a subscriber about state changes after unsubscribing once, even if they subscribed many times', () => {
565-
const messenger = new Messenger<never, CountControllerEvent>();
530+
const messenger = getCountMessenger();
566531
const controller = new CountController({
567-
messenger: getCountMessenger(messenger),
532+
messenger,
568533
name: 'CountController',
569534
state: { count: 0 },
570535
metadata: countControllerStateMetadata,
@@ -582,9 +547,9 @@ describe('BaseController', () => {
582547
});
583548

584549
it('should throw when unsubscribing listener who was never subscribed', () => {
585-
const messenger = new Messenger<never, CountControllerEvent>();
550+
const messenger = getCountMessenger();
586551
new CountController({
587-
messenger: getCountMessenger(messenger),
552+
messenger,
588553
name: 'CountController',
589554
state: { count: 0 },
590555
metadata: countControllerStateMetadata,
@@ -597,9 +562,9 @@ describe('BaseController', () => {
597562
});
598563

599564
it('should no longer update subscribers after being destroyed', () => {
600-
const messenger = new Messenger<never, CountControllerEvent>();
565+
const messenger = getCountMessenger();
601566
const controller = new CountController({
602-
messenger: getCountMessenger(messenger),
567+
messenger,
603568
name: 'CountController',
604569
state: { count: 0 },
605570
metadata: countControllerStateMetadata,
@@ -985,14 +950,16 @@ describe('getPersistentState', () => {
985950
type VisitorControllerState = {
986951
visitors: string[];
987952
};
988-
type VisitorControllerAction = {
953+
type VisitorControllerClear = {
989954
type: `${typeof visitorName}:clear`;
990955
handler: () => void;
991956
};
992-
type VisitorControllerEvent = {
957+
type VisitorControllerStateChange = {
993958
type: `${typeof visitorName}:stateChange`;
994959
payload: [VisitorControllerState, Patch[]];
995960
};
961+
type VisitorControllerActions = VisitorControllerClear;
962+
type VisitorControllerEvents = VisitorControllerStateChange;
996963

997964
const visitorControllerStateMetadata = {
998965
visitors: {
@@ -1001,12 +968,10 @@ describe('getPersistentState', () => {
1001968
},
1002969
};
1003970

1004-
type VisitorMessenger = RestrictedMessenger<
1005-
typeof visitorName,
1006-
VisitorControllerAction | VisitorOverflowControllerAction,
1007-
VisitorControllerEvent | VisitorOverflowControllerEvent,
1008-
never,
1009-
never
971+
type VisitorMessenger = Messenger<
972+
VisitorControllerActions,
973+
VisitorControllerEvents,
974+
typeof visitorName
1010975
>;
1011976
class VisitorController extends BaseController<
1012977
typeof visitorName,
@@ -1049,14 +1014,20 @@ describe('getPersistentState', () => {
10491014
type VisitorOverflowControllerState = {
10501015
maxVisitors: number;
10511016
};
1052-
type VisitorOverflowControllerAction = {
1017+
type VisitorOverflowControllerUpdateMax = {
10531018
type: `${typeof visitorOverflowName}:updateMax`;
10541019
handler: (max: number) => void;
10551020
};
1056-
type VisitorOverflowControllerEvent = {
1021+
type VisitorOverflowControllerStateChange = {
10571022
type: `${typeof visitorOverflowName}:stateChange`;
10581023
payload: [VisitorOverflowControllerState, Patch[]];
10591024
};
1025+
type VisitorOverflowControllerActions = VisitorOverflowControllerUpdateMax;
1026+
type VisitorOverflowControllerEvents = VisitorOverflowControllerStateChange;
1027+
1028+
type VisitorOverflowControllerDelegatedActions = VisitorControllerClear;
1029+
type VisitorOverflowControllerDelegatedEvents =
1030+
VisitorControllerStateChange;
10601031

10611032
const visitorOverflowControllerMetadata = {
10621033
maxVisitors: {
@@ -1065,12 +1036,12 @@ describe('getPersistentState', () => {
10651036
},
10661037
};
10671038

1068-
type VisitorOverflowMessenger = RestrictedMessenger<
1069-
typeof visitorOverflowName,
1070-
VisitorControllerAction | VisitorOverflowControllerAction,
1071-
VisitorControllerEvent | VisitorOverflowControllerEvent,
1072-
`${typeof visitorName}:clear`,
1073-
`${typeof visitorName}:stateChange`
1039+
type VisitorOverflowMessenger = Messenger<
1040+
| VisitorOverflowControllerActions
1041+
| VisitorOverflowControllerDelegatedActions,
1042+
| VisitorOverflowControllerEvents
1043+
| VisitorOverflowControllerDelegatedEvents,
1044+
typeof visitorOverflowName
10741045
>;
10751046

10761047
class VisitorOverflowController extends BaseController<
@@ -1116,21 +1087,43 @@ describe('getPersistentState', () => {
11161087

11171088
it('should allow messaging between controllers', () => {
11181089
const messenger = new Messenger<
1119-
VisitorControllerAction | VisitorOverflowControllerAction,
1120-
VisitorControllerEvent | VisitorOverflowControllerEvent
1121-
>();
1122-
const visitorControllerMessenger = messenger.getRestricted({
1123-
name: visitorName,
1124-
allowedActions: [],
1125-
allowedEvents: [],
1090+
VisitorControllerActions | VisitorOverflowControllerActions,
1091+
VisitorControllerEvents | VisitorOverflowControllerEvents,
1092+
'Global'
1093+
>({ namespace: 'Global' });
1094+
const visitorControllerMessenger = new Messenger<
1095+
VisitorControllerActions,
1096+
VisitorControllerEvents,
1097+
typeof visitorName
1098+
>({
1099+
namespace: visitorName,
1100+
});
1101+
visitorControllerMessenger.delegate({
1102+
actions: ['VisitorController:clear'],
1103+
events: ['VisitorController:stateChange'],
1104+
messenger,
11261105
});
11271106
const visitorController = new VisitorController(
11281107
visitorControllerMessenger,
11291108
);
1130-
const visitorOverflowControllerMessenger = messenger.getRestricted({
1131-
name: visitorOverflowName,
1132-
allowedActions: ['VisitorController:clear'],
1133-
allowedEvents: ['VisitorController:stateChange'],
1109+
const visitorOverflowControllerMessenger = new Messenger<
1110+
| VisitorOverflowControllerActions
1111+
| VisitorOverflowControllerDelegatedActions,
1112+
| VisitorOverflowControllerEvents
1113+
| VisitorOverflowControllerDelegatedEvents,
1114+
typeof visitorOverflowName
1115+
>({
1116+
namespace: visitorOverflowName,
1117+
});
1118+
visitorOverflowControllerMessenger.delegate({
1119+
actions: ['VisitorOverflowController:updateMax'],
1120+
events: ['VisitorOverflowController:stateChange'],
1121+
messenger,
1122+
});
1123+
messenger.delegate({
1124+
actions: ['VisitorController:clear'],
1125+
events: ['VisitorController:stateChange'],
1126+
messenger: visitorOverflowControllerMessenger,
11341127
});
11351128
const visitorOverflowController = new VisitorOverflowController(
11361129
visitorOverflowControllerMessenger,

packages/base-controller/src/BaseControllerV2.ts

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -124,7 +124,7 @@ export type BaseControllerInstance = Omit<
124124
BaseController<
125125
string,
126126
StateConstraint,
127-
Messenger<ActionConstraint, EventConstraint>
127+
Messenger<ActionConstraint, EventConstraint, string>
128128
>
129129
>,
130130
'metadata'
@@ -167,9 +167,9 @@ export class BaseController<
167167
// TODO: Either fix this lint violation or explain why it's necessary to ignore.
168168
// eslint-disable-next-line @typescript-eslint/naming-convention
169169
messenger extends Messenger<
170-
ControllerName,
171170
ActionConstraint | ControllerActions<ControllerName, ControllerState>,
172-
EventConstraint | ControllerEvents<ControllerName, ControllerState>
171+
EventConstraint | ControllerEvents<ControllerName, ControllerState>,
172+
ControllerName
173173
>,
174174
> {
175175
#internalState: ControllerState;

0 commit comments

Comments
 (0)