diff --git a/src/node-cron.js b/src/node-cron.js index 459f161..7bc9fba 100644 --- a/src/node-cron.js +++ b/src/node-cron.js @@ -61,4 +61,14 @@ function getTasks() { return storage.getTasks(); } -module.exports = { schedule, validate, getTasks }; +/** + * Deletes a scheduled task. + * @param {string || ScheduledTask} task This can be a string of the task Id or the task object itself. + * @returns {ScheduledTask[]} The scheduled tasks. + */ +function deleteTask(task) { + storage.delete(task); + return this.getTasks(); +} + +module.exports = { schedule, validate, getTasks, deleteTask }; diff --git a/src/storage.js b/src/storage.js index 6c131a4..4b57b38 100644 --- a/src/storage.js +++ b/src/storage.js @@ -14,6 +14,15 @@ module.exports = (() => { }, getTasks: () => { return global.scheduledTasks; + }, + delete: (task) => { + if (typeof task === 'string') { + global.scheduledTasks.get(task).stop(); + global.scheduledTasks.delete(task); + } else { + task.stop(); + global.scheduledTasks.delete(task.options.name); + } } }; })(); \ No newline at end of file diff --git a/test/node-cron-test.js b/test/node-cron-test.js index d65de1e..cfdb74f 100644 --- a/test/node-cron-test.js +++ b/test/node-cron-test.js @@ -69,6 +69,36 @@ describe('node-cron', () => { assert.equal(0, executed); }); + + it('should delete a scheduled task', () => { + const name = 'testId'; + let executed = 0; + const task = cron.schedule('* * * * * *', () => { + executed += 1; + }, { scheduled: true, name }); + + this.clock.tick(2000); + + assert.equal(2, executed); + assert.equal(cron.getTasks().get(name), task); + cron.deleteTask(task); + assert.equal(cron.getTasks().get(name), undefined); + }); + + it('should delete a scheduled task by name', () => { + const name = 'testId'; + let executed = 0; + const task = cron.schedule('* * * * * *', () => { + executed += 1; + }, { scheduled: true, name }); + + this.clock.tick(2000); + + assert.equal(2, executed); + assert.equal(cron.getTasks().get(name), task); + cron.deleteTask(name); + assert.equal(cron.getTasks().get(name), undefined); + }); it('should start a stoped task', () => { let executed = 0; diff --git a/test/storage-test.js b/test/storage-test.js index b7a7316..fa46e84 100644 --- a/test/storage-test.js +++ b/test/storage-test.js @@ -14,6 +14,15 @@ describe('storage', () => { assert.lengthOf(storage.getTasks(), 1); }); + it('should delete a task', () => { + global.scheduledTasks = new Map(); + global.scheduledTasks.set('id1', 'test'); + global.scheduledTasks.set('id2', 'test2'); + storage.delete('id2'); + assert.equal(storage.getTasks().get('id1'), 'test'); + assert.equal(storage.getTasks().get('id2'), undefined); + }); + describe('on import', () => { it('should keep stored items across imports', () => { delete require.cache[require.resolve('../src/storage')];