diff --git a/packages/snaps-controllers/src/cronjob/CronjobController.test.ts b/packages/snaps-controllers/src/cronjob/CronjobController.test.ts index 7953d05e49..2e39ec169b 100644 --- a/packages/snaps-controllers/src/cronjob/CronjobController.test.ts +++ b/packages/snaps-controllers/src/cronjob/CronjobController.test.ts @@ -244,6 +244,66 @@ describe('CronjobController', () => { cronjobController.destroy(); }); + it('schedules a cronjob to run in 15 seconds if the cronjob is set to run less than every 15 seconds', () => { + const expression = '*/1 * * * * *'; // Every second + + const rootMessenger = getRootCronjobControllerMessenger(); + const controllerMessenger = + getRestrictedCronjobControllerMessenger(rootMessenger); + + rootMessenger.registerActionHandler( + 'PermissionController:getPermissions', + () => { + return { + [SnapEndowments.Cronjob]: getCronjobPermission({ expression }), + }; + }, + ); + + const cronjobController = new CronjobController({ + messenger: controllerMessenger, + }); + + cronjobController.register(MOCK_SNAP_ID); + + expect(rootMessenger.call).toHaveBeenCalledWith( + 'PermissionController:getPermissions', + MOCK_SNAP_ID, + ); + + jest.advanceTimersByTime(11_000); + + expect(rootMessenger.call).not.toHaveBeenCalledWith( + 'SnapController:handleRequest', + { + snapId: MOCK_SNAP_ID, + origin: '', + handler: HandlerType.OnCronjob, + request: { + method: 'exampleMethod', + params: ['p1'], + }, + }, + ); + + jest.advanceTimersByTime(4_000); + + expect(rootMessenger.call).toHaveBeenCalledWith( + 'SnapController:handleRequest', + { + snapId: MOCK_SNAP_ID, + origin: '', + handler: HandlerType.OnCronjob, + request: { + method: 'exampleMethod', + params: ['p1'], + }, + }, + ); + + cronjobController.destroy(); + }); + it('schedules a background event', () => { const rootMessenger = getRootCronjobControllerMessenger(); const controllerMessenger = diff --git a/packages/snaps-controllers/src/cronjob/CronjobController.ts b/packages/snaps-controllers/src/cronjob/CronjobController.ts index e9ce1625b4..6daeee9cc6 100644 --- a/packages/snaps-controllers/src/cronjob/CronjobController.ts +++ b/packages/snaps-controllers/src/cronjob/CronjobController.ts @@ -266,7 +266,10 @@ export class CronjobController extends BaseController< const parsed = parseCronExpression(job.expression); const next = parsed.next(); const now = new Date(); - const ms = next.getTime() - now.getTime(); + + // If the time until the next run is less than 15 seconds, we increase it + // to 15 seconds to avoid running jobs too frequently. + const ms = Math.max(next.getTime() - now.getTime(), 15_000); // Don't schedule this job yet as it is too far in the future if (ms > DAILY_TIMEOUT) {