Skip to content

Commit ddb1ce6

Browse files
fix: Move CronjobController init to separate function
1 parent f9d209f commit ddb1ce6

File tree

2 files changed

+115
-1
lines changed

2 files changed

+115
-1
lines changed

packages/snaps-controllers/src/cronjob/CronjobController.test.ts

Lines changed: 91 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -46,6 +46,8 @@ describe('CronjobController', () => {
4646
messenger: controllerMessenger,
4747
});
4848

49+
cronjobController.init();
50+
4951
cronjobController.register(MOCK_SNAP_ID);
5052

5153
expect(rootMessenger.call).toHaveBeenCalledWith(
@@ -92,6 +94,8 @@ describe('CronjobController', () => {
9294
messenger: controllerMessenger,
9395
});
9496

97+
cronjobController.init();
98+
9599
cronjobController.register(MOCK_SNAP_ID);
96100

97101
expect(rootMessenger.call).toHaveBeenCalledWith(
@@ -127,6 +131,8 @@ describe('CronjobController', () => {
127131
messenger: controllerMessenger,
128132
});
129133

134+
cronjobController.init();
135+
130136
cronjobController.register(MOCK_SNAP_ID);
131137
cronjobController.unregister(MOCK_SNAP_ID);
132138

@@ -157,6 +163,8 @@ describe('CronjobController', () => {
157163
messenger: controllerMessenger,
158164
});
159165

166+
cronjobController.init();
167+
160168
// @ts-expect-error: `update` is protected.
161169
cronjobController.update(() => {
162170
return {
@@ -226,6 +234,8 @@ describe('CronjobController', () => {
226234
},
227235
});
228236

237+
cronjobController.init();
238+
229239
await new Promise((resolve) => originalProcessNextTick(resolve));
230240
expect(rootMessenger.call).toHaveBeenCalledWith(
231241
'SnapController:handleRequest',
@@ -245,6 +255,8 @@ describe('CronjobController', () => {
245255
state: cronjobController.state,
246256
});
247257

258+
secondCronjobController.init();
259+
248260
await new Promise((resolve) => originalProcessNextTick(resolve));
249261
expect(handleRequest).toHaveBeenCalledTimes(1);
250262

@@ -272,6 +284,8 @@ describe('CronjobController', () => {
272284
messenger: controllerMessenger,
273285
});
274286

287+
cronjobController.init();
288+
275289
cronjobController.register(MOCK_SNAP_ID);
276290
jest.runOnlyPendingTimers();
277291

@@ -317,6 +331,8 @@ describe('CronjobController', () => {
317331
messenger: controllerMessenger,
318332
});
319333

334+
cronjobController.init();
335+
320336
cronjobController.register(MOCK_SNAP_ID);
321337

322338
jest.advanceTimersByTime(inMilliseconds(1, Duration.Day));
@@ -372,6 +388,8 @@ describe('CronjobController', () => {
372388
messenger: controllerMessenger,
373389
});
374390

391+
cronjobController.init();
392+
375393
cronjobController.register(MOCK_SNAP_ID);
376394
expect(cronjobController.state.events).toStrictEqual({});
377395

@@ -403,6 +421,8 @@ describe('CronjobController', () => {
403421
},
404422
});
405423

424+
cronjobController.init();
425+
406426
jest.advanceTimersByTime(inMilliseconds(1, Duration.Day));
407427

408428
expect(rootMessenger.call).toHaveBeenCalledWith(
@@ -432,6 +452,8 @@ describe('CronjobController', () => {
432452
messenger: controllerMessenger,
433453
});
434454

455+
cronjobController.init();
456+
435457
const snapInfo: TruncatedSnap = {
436458
blocked: false,
437459
enabled: true,
@@ -514,6 +536,8 @@ describe('CronjobController', () => {
514536
},
515537
});
516538

539+
cronjobController.init();
540+
517541
const snapInfo: TruncatedSnap = {
518542
blocked: false,
519543
enabled: true,
@@ -594,6 +618,8 @@ describe('CronjobController', () => {
594618
messenger: controllerMessenger,
595619
});
596620

621+
cronjobController.init();
622+
597623
const snapInfo: TruncatedSnap = {
598624
blocked: false,
599625
enabled: true,
@@ -626,6 +652,8 @@ describe('CronjobController', () => {
626652
messenger: controllerMessenger,
627653
});
628654

655+
cronjobController.init();
656+
629657
const snapInfo: TruncatedSnap = {
630658
blocked: false,
631659
enabled: true,
@@ -686,6 +714,8 @@ describe('CronjobController', () => {
686714
},
687715
});
688716

717+
cronjobController.init();
718+
689719
const snapInfo: TruncatedSnap = {
690720
blocked: false,
691721
enabled: true,
@@ -729,6 +759,8 @@ describe('CronjobController', () => {
729759
messenger: controllerMessenger,
730760
});
731761

762+
cronjobController.init();
763+
732764
cronjobController.register(MOCK_SNAP_ID);
733765

734766
cronjobController.destroy();
@@ -764,6 +796,8 @@ describe('CronjobController', () => {
764796
messenger: controllerMessenger,
765797
});
766798

799+
cronjobController.init();
800+
767801
const error = new Error('Test error.');
768802
rootMessenger.registerActionHandler(
769803
'SnapController:handleRequest',
@@ -795,6 +829,8 @@ describe('CronjobController', () => {
795829
messenger: controllerMessenger,
796830
});
797831

832+
cronjobController.init();
833+
798834
const event = {
799835
snapId: MOCK_SNAP_ID,
800836
schedule: '2022-01-01T01:00Z',
@@ -844,6 +880,8 @@ describe('CronjobController', () => {
844880
messenger: controllerMessenger,
845881
});
846882

883+
cronjobController.init();
884+
847885
const event = {
848886
snapId: MOCK_SNAP_ID,
849887
schedule: '2021-01-01T01:00Z',
@@ -873,6 +911,8 @@ describe('CronjobController', () => {
873911
messenger: controllerMessenger,
874912
});
875913

914+
cronjobController.init();
915+
876916
const event = {
877917
snapId: MOCK_SNAP_ID,
878918
schedule: '2022-01-01T01:00Z',
@@ -911,6 +951,8 @@ describe('CronjobController', () => {
911951
messenger: controllerMessenger,
912952
});
913953

954+
cronjobController.init();
955+
914956
const event = {
915957
snapId: MOCK_SNAP_ID,
916958
schedule: '2022-01-01T01:00Z',
@@ -949,6 +991,8 @@ describe('CronjobController', () => {
949991
messenger: controllerMessenger,
950992
});
951993

994+
cronjobController.init();
995+
952996
const event = {
953997
snapId: MOCK_SNAP_ID,
954998
schedule: '2025-05-21T13:25:21.500Z',
@@ -979,4 +1023,51 @@ describe('CronjobController', () => {
9791023
cronjobController.destroy();
9801024
});
9811025
});
1026+
1027+
describe('CronjobController:init', () => {
1028+
it('initializes the controller', () => {
1029+
const rootMessenger = getRootCronjobControllerMessenger();
1030+
const controllerMessenger =
1031+
getRestrictedCronjobControllerMessenger(rootMessenger);
1032+
1033+
const cronjobController = new CronjobController({
1034+
messenger: controllerMessenger,
1035+
state: {
1036+
events: {
1037+
[`cronjob-${MOCK_SNAP_ID}-0`]: {
1038+
id: `cronjob-${MOCK_SNAP_ID}-0`,
1039+
snapId: MOCK_SNAP_ID,
1040+
date: new Date('2022-01-01T00:00Z').toISOString(),
1041+
scheduledAt: new Date('2022-01-01T00:00Z').toISOString(),
1042+
schedule: 'PT25H',
1043+
recurring: true,
1044+
request: {
1045+
method: 'exampleMethod',
1046+
params: ['p1'],
1047+
},
1048+
},
1049+
},
1050+
},
1051+
});
1052+
1053+
controllerMessenger.call('CronjobController:init');
1054+
1055+
jest.advanceTimersByTime(inMilliseconds(1, Duration.Day));
1056+
1057+
expect(rootMessenger.call).toHaveBeenCalledWith(
1058+
'SnapController:handleRequest',
1059+
{
1060+
snapId: MOCK_SNAP_ID,
1061+
origin: METAMASK_ORIGIN,
1062+
handler: HandlerType.OnCronjob,
1063+
request: {
1064+
method: 'exampleMethod',
1065+
params: ['p1'],
1066+
},
1067+
},
1068+
);
1069+
1070+
cronjobController.destroy();
1071+
});
1072+
});
9821073
});

packages/snaps-controllers/src/cronjob/CronjobController.ts

Lines changed: 24 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -42,6 +42,15 @@ export type CronjobControllerStateChangeEvent = ControllerStateChangeEvent<
4242
CronjobControllerState
4343
>;
4444

45+
/**
46+
* Initialise the CronjobController. This should be called after all controllers
47+
* are created.
48+
*/
49+
export type CronjobControllerInitAction = {
50+
type: `${typeof controllerName}:init`;
51+
handler: CronjobController['init'];
52+
};
53+
4554
export type Schedule = {
4655
type: `${typeof controllerName}:schedule`;
4756
handler: CronjobController['schedule'];
@@ -63,7 +72,8 @@ export type CronjobControllerActions =
6372
| GetPermissions
6473
| Schedule
6574
| Cancel
66-
| Get;
75+
| Get
76+
| CronjobControllerInitAction;
6777

6878
export type CronjobControllerEvents =
6979
| CronjobControllerStateChangeEvent
@@ -189,6 +199,11 @@ export class CronjobController extends BaseController<
189199
this.#handleSnapUpdatedEvent,
190200
);
191201

202+
this.messagingSystem.registerActionHandler(
203+
`${controllerName}:init`,
204+
(...args) => this.init(...args),
205+
);
206+
192207
this.messagingSystem.registerActionHandler(
193208
`${controllerName}:schedule`,
194209
(...args) => this.schedule(...args),
@@ -203,7 +218,15 @@ export class CronjobController extends BaseController<
203218
`${controllerName}:get`,
204219
(...args) => this.get(...args),
205220
);
221+
}
206222

223+
/**
224+
* Initialize the CronjobController.
225+
*
226+
* This starts the daily timer, clears out expired events
227+
* and reschedules any remaining events.
228+
*/
229+
init() {
207230
this.#start();
208231
this.#clear();
209232
this.#reschedule();

0 commit comments

Comments
 (0)