Functions
Functions are used to mutate webhook payloads (event data) before they are dispatched based on a passed user-defined Javascript function.
Convoy uses goja to provide a JavaScript runtime environment in Go, providing full ECMAScript 5.1 support (including regex and strict mode). Most of the ECMAScript 6 spec is implemented, but this is a work in progress. To enhance the runtime, console support from goja_nodejs was also added.
Importing Modules
require
support also exists but is currently disabled.
Caveats
Certain constraints exist while using functions:
- Multiple functions can be written in the file, but only the
transform
function is invoked. - Only the first argument is used in the
transform
function and that is the payload data. - The
transform
function must return a value.
Use cases
Subscriptions
Functions can be configured when creating or updating a subscription. This is currently only possible in incoming projects. The function is used to mutate ingested event payloads from webhook providers before sending them to the destination endpoints.
Sources
Functions can be configured when creating a message broker source in an outgoing project. The function is used to mutate ingested event payloads from the message broker before sending them to the destination endpoints.
![Create Webhook Function](https://mintlify.s3-us-west-1.amazonaws.com/convoy/images/subscription-create-function.png)
Example
{
"blockchain": "optimism",
"chainId": "10",
"connectedAddresses": [
{
"address": "0xca3a901d1bd21be11b88e4e9d534fb48d35dde48",
"blockchain": "ethereum",
"chainId": "1",
"timestamp": "2023-05-18T16:07: 22Z"
}
],
"profileImageContentValue": {
"image": {
"original": "10/caster/9613/profile_image/original_image.jpg"
}
},
"userAssociatedAddresses": [
"0x4e4814f10e341882438264c85ba8f02ef8f8a592",
"0xca3a901d1bd21be11b88e4e9d534fb48d35dde41",
"0x3628bbc094720495489f6ac726ef7233c3d9587e"
],
"userId": "9613"
}
function transform(payload) {
return {
"event_type": "chain.connected",
"data": {
"addresses": payload.connectedAddresses[0].address,
"created_at": new Date(payload.connectedAddresses[0].timestamp).getTime(),
"user_id": payload.userId
}
};
}
{
"data": {
"addresses": "0xca3a901d1bd21be11b88e4e9d534fb48d35dde48",
"created_at": 1684426042000,
"user_id": "9613"
},
"event_type": "chain.connected"
}