In this README, you'll learn how to run any Node.js code on a schedule using Pipedream.
Watch this short video or step through the commands below.
Install the Pipedream CLI:
curl https://cli.pipedream.com/install | shCreate a file with a single console.log() statement:
echo 'console.log("Hello, world")' > cronjob.jsAnd run that code once every 15 seconds:
pd deploy --run cronjob.js --timer --frequency 15s # cron expressions also supported with --cronYou'll be asked to sign up or sign in to Pipedream at this step. Once that's done, the CLI should deploy your code.
Each time this script runs, it prints "Hello, world". The CLI will automatically display new logs as the job runs. You can also press Ctrl-C and listen for new logs anytime by running:
pd logs cronjob-jsYou can delete the job and all its logs by running:
pd delete cronjob-js- Overview
- Running code on a schedule
- Using the REST API
- Example cron jobs
- Logs
- Consuming event data from your own app, outside Pipedream
- Using npm packages
- Pause a component
- Change a component's schedule
- Delete a component
- Pricing
- Limits
- Getting Support
Pipedream is a platform for running hosted, backend components.
In this README, you'll learn what components are and how to use them to run code on a schedule. You can run Node code directly on Pipedream or use components to trigger external services.
Pipedream components are reusable Node.js modules that run code on specific events: timers and HTTP requests. Components are free to run and simple to learn. Here's a component that prints "Hello, world" once a minute:
module.exports = {
name: "cronjob",
version: "0.0.1",
props: {
timer: {
type: "$.interface.timer",
default: {
cron: "* * * * *",
},
},
},
async run() {
console.log("Run any Node.js code here");
},
};You can use components to:
- Run any Node code on a schedule
- Operate a lightweight HTTP server
- Create event sources that collect data from services like Github or Stripe.
Components come with a built-in key-value store, an interface for passing input via props, and more. You deploy and manage components using Pipedream's REST API, CLI, or UI.
Components can emit events, which can be retrieved programmatically via CLI, API or SSE. They can also trigger Pipedream workflows on every event. For example, you can process items from an RSS feed and access the items via REST API, or trigger code to run on every new item using the SSE interface or a workflow. Components that emit events are called event sources.
You can run code from a few different sources:
- Upload a local file
- Run a script hosted on Github
- Deploy your own component from scratch
- Send an HTTP request to a URL to trigger external code
In the examples below, you'll use the Pipedream CLI to deploy scheduled jobs. This is the simplest way to interact with Pipedream while you're learning. Install the Pipedream CLI before you begin:
curl https://cli.pipedream.com/install | shYou can also deploy components using the Pipedream UI or REST API.
Create a local file, job.js, that contains the following Node code:
console.log("Hello, world");You can run this script on a schedule using pd deploy:
pd deploy --timer --cron "0 0 * * *" --run job.jsThe argument passed to the --cron option — the "0 0 * * *" — is a cron expression. Cron expressions allow you to specify your job's frequency using a terse, but expressive, syntax. Cron expressions are tied to the UTC timezone.
You can also run a job every N seconds, minutes, or hours using the --frequency option:
pd deploy --timer --frequency 60s --run job.js # Runs every 60 seconds
pd deploy --timer --frequency 30m --run job.js # Runs every 30 minutes
pd deploy --timer --frequency 2h --run job.js # Runs every 2 hoursWhen you run the command above, Pipedream generates a component from the code in job.js, placing it into the component's run method. Then, the CLI deploys that component to Pipedream's infrastructure and runs it at the schedule you specified.
You can view the component code in the Configuration tab tied to that component in the Pipedream UI, or by running
pd describe <component-name> --codeIf you'd like to save the component code locally, just run:
pd describe <component-name> --code > component.jsYou can also deploy any Node.js code hosted on Github:
pd deploy --timer --cron "0 0 * * *" --run https://github.com/PipedreamHQ/pipedream/blob/master/interfaces/timer/examples/code.jsYou'll need to copy the URL tied to the file in the Github repo UI, not the raw URL tied to the file's contents you get when you press the Raw button. That is, pass this:
https://github.com/PipedreamHQ/pipedream/blob/master/interfaces/timer/examples/code.js
not this:
https://raw.githubusercontent.com/PipedreamHQ/pipedream/master/interfaces/timer/examples/code.js
Components are Node.js modules that export an object with the following properties:
module.exports = {
name: "cronjob", // required
version: "0.0.1", // required
props,
methods,
run() {
console.log("Run any Node.js code here");
},
};The component API is deliberately simple. Your component must define a name, version, a run function, and optional props that allow the component to accept inputs on deploy.
To run code on a schedule, just include it in your run function. Here's a simple console.log() statement that runs once an hour:
module.exports = {
name: "cronjob",
version: "0.0.1",
props: {
timer: {
type: "$.interface.timer",
default: {
cron: "0 0 * * *",
},
},
},
run() {
console.log("Run any Node.js code here");
},
};Save this file and deploy it to Pipedream:
pd deploy job.jsNotice the difference between this and the pd deploy commands in the examples above. Before, you deployed Node code directly from a local script or Github. That code wasn't wrapped in a component, so you had to specify the --timer flag to indicate it should be run on a schedule, and pass the --run flag to tell the CLI what code to run. This directed the CLI to generate a component with the correct timer prop, a name, version, and put the code you passed to the --run flag into the component's run method.
Here, you've written the component yourself, so you can pd deploy that directly to Pipedream.
If you already have an HTTP endpoint in front of code hosted on another platform, and just need to make an HTTP request to invoke it, use axios or another HTTP client library to make the request from your run function:
module.exports = {
name: "invoke-http-function",
version: "0.0.1",
props: {
timer: {
type: "$.interface.timer",
default: {
cron: "0 0 * * *",
},
},
},
async run() {
const axios = require("axios");
const resp = await axios({
method: "GET",
url: `https://swapi.co/api/films/`,
});
console.log(resp.data);
},
};You can deploy this example component by running:
pd deploy https://github.com/PipedreamHQ/pipedream/blob/master/interface/timer/examples/send-http-request.jsSee our guide on making HTTP requests with axios for more example code.
You can schedule code using a cron expression or a frequency in seconds, minutes, or hours. See the examples below for how to specify these schedules using the CLI and via component props.
Schedule code using a cron expression:
pd deploy --timer --cron "0 0 * * *" --run job.jsAll cron schedules are tied to the UTC timezone.
You can also run a job every N seconds, minutes, or hours using the --frequency option:
pd deploy --timer --frequency 60s --run job.js # Runs every 60 seconds
pd deploy --timer --frequency 30m --run job.js # Runs every 30 minutes
pd deploy --timer --frequency 2h --run job.js # Runs every 2 hoursIf you're deploying a component directly, you can specify a cron schedule directly in props using the cron property:
module.exports = {
name: "cronjob",
version: "0.0.1",
props: {
timer: {
type: "$.interface.timer",
default: {
cron: "0 0 * * *",
},
},
},
run() {
console.log("Run any Node.js code here");
},
};All cron schedules are tied to the UTC timezone.
You can also schedule a job to run every N seconds using the intervalSeconds property, instead:
module.exports = {
name: "cronjob",
version: "0.0.1",
props: {
timer: {
type: "$.interface.timer",
default: {
intervalSeconds: 60,
},
},
},
run() {
console.log("Run any Node.js code here");
},
};Any cron schedule you specify using the --cron option is tied to the UTC timezone. If you need help converting your schedule to UTC, Google can help. If you'd like to run a job every day at 8:00pm local time, for example, just Google "8:00pm local time to UTC".
Scheduled code can run up to once every 15 seconds. If you need to run a job at this frequency, you'll need to use the --frequency scheduling option, since cron expressions cannot exceed frequencies of once per minute:
pd deploy --timer --frequency 15s --run code.jsMore generally, components are subject to the limits of the Pipedream platform.
You can also create a scheduled job using the REST API.
You can deploy a new component by sending a POST request to the /sources endpoint. This accepts two parameters:
component_code: the code for the Pipedream component. You'll need to create your own component, with your code in the run method, then include the full component code in this property.name: the name you'd like to attach to the deployed component
The examples/create-component/api-payload.json file contains a sample payload, with a component that prints a single console.log statement once a minute. You can deploy this component using this cURL command:
curl -d @examples/create-component/api-payload.json \
-H 'Content-Type: application/json' \
-H 'Authorization: Bearer <PIPEDREAM_API_KEY>' \
https://api.pipedream.com/v1/sourcesor using the sample Node code in the examples/create-component directory:
const axios = require("axios");
require("dotenv").config();
const data = require("./api-payload.json");
axios({
method: "POST",
url: "https://api.pipedream.com/v1/sources",
headers: {
Authorization: `Bearer ${process.env.PIPEDREAM_API_KEY}`,
},
data,
})
.then((res) => console.log(res))
.catch((err) => console.log(`Error: ${err}`));This repo contains a number of example components that run code on a schedule.
Each time your job runs, Pipedream marks its start and end times in the LOGS attached to your component in the UI.
Pipedream refers to logs as "observations" in certain contexts, since they contain a superset of standard output / error, as well as events emitted by your component, and start and end markers for each job run.
Any standard output or errors raised by your component are also logged here. You can watch these logs in realtime using the pd logs CLI command:
pd logs <component-name>Components can emit data that you can access from any application. Within your run method, pass the data you'd like to emit to the this.$emit function:
this.$emit({
name: "Luke Skywalker",
});Each time you run this.$emit(), you emit the data as an event. Components that emit data are called event sources.
Events can be retrieved using the REST API, CLI, or SSE stream tied to your cron job. For example, you can use the CLI to retrieve the last 3 events:
λ pd events -n 3 <job-name>
{ name: "Luke Skywalker" }
{ name: "Leia Organa" }
{ name: "Han Solo" }This makes it easy to retrieve data processed by your cron job from another app. Typically, you'll want to use the REST API to retrieve events in batch, and connect to the SSE stream to process them in real time.
To use an npm package in a code step, just require it:
const _ = require("lodash");When you deploy a component, Pipedream downloads these packages and bundles them with your deployment. There's no need to include a package.json file with your component.
Some packages — for example, packages like Puppeteer, which includes large dependencies like Chromium — may not work on Pipedream. Please reach out if you encounter a specific issue.
You can stop a component from running using pd update:
pd update <component-name> --active falseYou can activate a component again by running:
pd update <component-name> --active trueYou can update a component's schedule by downloading the component's code and changing its timer props.
For example, let's say you have a component that runs once an hour:
module.exports = {
name: "cronjob",
version: "0.0.1",
props: {
timer: {
type: "$.interface.timer",
default: {
cron: "0 0 * * *",
},
},
},
run() {
console.log("Run any Node.js code here");
},
};Download this code locally:
pd describe <component-name> --code > component.jsand modify the cron prop (or intervalSeconds, if you specified the job to run at a frequency). For example, if you want to change the job to run once an hour, change cron to:
cron: "0 * * * *"
Once you update the code, run
pd update <component-name> --code component.jsYou can stop a component from running, deleting all of its events and logs, using pd delete:
pd delete <component-name>Pipedream is currently free (paid tiers are coming soon), subject to the limits noted below.
If you exceed any of these limits, please reach out.
Components are subject to the limits of the Pipedream platform. Key limits include:
- 30 minutes of component runtime per UTC day
- 300 second limit on the execution of a specific run
- 192MB of available memory and 512 MB of disk on
/tmpduring the execution of your code.
If you exceed any of these limits, please reach out.
You can get help on our public Slack or reach out to our team directly with any questions or feedback. We'd love to hear from you!
