2019-06-23 03:35:23 -07:00
import { ITriggerFunctions } from 'n8n-core' ;
2022-08-19 03:45:04 -07:00
import {
INodeType ,
INodeTypeDescription ,
ITriggerResponse ,
NodeHelpers ,
toCronExpression ,
TriggerTime ,
} from 'n8n-workflow' ;
2019-06-23 03:35:23 -07:00
import { CronJob } from 'cron' ;
export class Cron implements INodeType {
description : INodeTypeDescription = {
displayName : 'Cron' ,
name : 'cron' ,
icon : 'fa:calendar' ,
2022-04-11 06:12:13 -07:00
group : [ 'trigger' , 'schedule' ] ,
2019-06-23 03:35:23 -07:00
version : 1 ,
description : 'Triggers the workflow at a specific time' ,
:sparkles: Improve Waiting Webhook call state in WF Canvas (#2430)
* N8N-2586 Improve Waiting Webhook call state in WF Canvas
* N8N-2586 Added watcher for showing Webhook's Node Tooltip on execution
* N8N-2586 Show helping tooltip for trigger node if wokrflow is running, it is a trigger node, if it is only one trigger node in WF
* N8N-2586 Rework/Move logic to computed property, Created getter for ActveTriggerNodesInWokrflow, Add style to trigger node's tooltip, remove comments
* N8N-2586 Added EventTriggerDescription prop in INodeTypeDescription Interface, Updated Logic for TriggerNode Tooltip based on the new prop
* N8N-2586 Add new use cases/watcher to show Trigger Nodes Tooltip / If has issues, if paused, if wokrlfow is running, Refactor Getter
* N8N-2586 Added z-index to tooltip, Added new Scenario for Tooltip if it is Draged&Droped on the WF
* N8N-2586 Refactor computed property for draged nodes
* N8N-2586 Fixed Conflicts
* N8N-2586 Fixed Tooltip
* N8N-2586 Dont show tooltip on core trigger nodes that execute automatically
* N8N-2586 Fixed Webhook tooltip when adding/deleting canvas during WF execution
* N8N-2586 Updated Logic, Simplify the code
* N8N-2586 Simplify Code
* N8N-2586 Added check for nodetype
* update dragging to use local state
* N8N-2586 Added eventTriggerDescription to Interval Node
* add comment, use new getter
* update to always check
Co-authored-by: Mutasem <mutdmour@gmail.com>
2021-11-25 14:33:41 -08:00
eventTriggerDescription : '' ,
2022-08-01 13:47:55 -07:00
activationMessage :
'Your cron trigger will now trigger executions on the schedule you have defined.' ,
2019-06-23 03:35:23 -07:00
defaults : {
name : 'Cron' ,
color : '#00FF00' ,
} ,
2022-04-22 09:29:51 -07:00
// eslint-disable-next-line n8n-nodes-base/node-class-description-inputs-wrong-regular-node
2019-06-23 03:35:23 -07:00
inputs : [ ] ,
outputs : [ 'main' ] ,
properties : [
2022-06-20 12:39:24 -07:00
{
2022-08-01 13:47:55 -07:00
displayName :
'This workflow will run on the schedule you define here once you <a data-key="activate">activate</a> it.<br><br>For testing, you can also trigger it manually: by going back to the canvas and clicking ‘ execute workflow’ ' ,
2022-06-20 12:39:24 -07:00
name : 'notice' ,
type : 'notice' ,
default : '' ,
} ,
2019-06-23 03:35:23 -07:00
{
displayName : 'Trigger Times' ,
name : 'triggerTimes' ,
type : 'fixedCollection' ,
typeOptions : {
multipleValues : true ,
multipleValueButtonText : 'Add Time' ,
} ,
default : { } ,
description : 'Triggers for the workflow' ,
placeholder : 'Add Cron Time' ,
2022-08-19 03:45:04 -07:00
options : NodeHelpers.cronNodeOptions ,
2020-10-22 06:46:03 -07:00
} ,
] ,
2019-06-23 03:35:23 -07:00
} ;
async trigger ( this : ITriggerFunctions ) : Promise < ITriggerResponse > {
const triggerTimes = this . getNodeParameter ( 'triggerTimes' ) as unknown as {
item : TriggerTime [ ] ;
} ;
// Get all the trigger times
2022-08-19 03:45:04 -07:00
const cronTimes = ( triggerTimes . item || [ ] ) . map ( toCronExpression ) ;
2019-06-23 03:35:23 -07:00
// The trigger function to execute when the cron-time got reached
// or when manually triggered
const executeTrigger = ( ) = > {
this . emit ( [ this . helpers . returnJsonArray ( [ { } ] ) ] ) ;
} ;
const timezone = this . getTimezone ( ) ;
// Start the cron-jobs
2022-08-19 03:45:04 -07:00
const cronJobs = cronTimes . map ( cronTime = > new CronJob ( cronTime , executeTrigger , undefined , true , timezone ) ) ;
2019-06-23 03:35:23 -07:00
// Stop the cron-jobs
async function closeFunction() {
for ( const cronJob of cronJobs ) {
cronJob . stop ( ) ;
}
}
async function manualTriggerFunction() {
executeTrigger ( ) ;
}
return {
closeFunction ,
manualTriggerFunction ,
} ;
}
}