Input & Output
Success port, lane_N_* memory structure, lane_outputs collection, and the complete data flow after joining.
Output Ports
| Port | When Triggered | Description |
|---|---|---|
success |
After ALL parallel lanes have completed (successfully or with errors when fail_fast is false) | Fires exactly once after the last lane reports completion. The full merged execution context — including all lane_N_* prefixed results and the lane_outputs collection — is available to all downstream nodes connected to this port. |
Output Data Structure
| Field | Type | Description |
|---|---|---|
lane_outputs |
array | Ordered array of each lane's complete final execution context. Index 0 = lane 0 context, index 1 = lane 1 context, etc. Iterate this array to process all lane results generically. |
lane_0_*, lane_1_*, ... |
various | All variables produced within each lane, prefixed with the lane index. Enables direct access to specific lane results by name: $var.lane_0_emailSent, $var.lane_2_documentUrl. |
lane_success_count |
integer | Count of lanes that completed without error. |
lane_failure_count |
integer | Count of lanes that completed with error. Zero when fail_fast cancelled remaining lanes. |
IsParallelExecutionActive |
boolean (false) |
Reset to false — normal sequential execution resumes. |
| Pre-fork base context | as before fork | All variables and data that existed before the Fork node fired are preserved unchanged in the base context alongside the lane result keys. |
Complete Data Flow Example
// === Pre-fork context ===
{
"orderId": "ORD-2024-112",
"customerId": "C-5501",
"IsParallelExecutionActive": false
}
// === Parallel Fork fires (3 lanes) ===
// Lane 0: SendEmail → sets emailSent=true, emailId="MSG-001"
// Lane 1: SendSms → sets smsSent=true, smsId="SMS-889"
// Lane 2: PostSlackMsg → sets slackPosted=true, slackTs="1234567890.001"
// === All lanes complete → Parallel Join fires success port ===
{
// Pre-fork base context (unchanged)
"orderId": "ORD-2024-112",
"customerId": "C-5501",
// Parallel execution state reset
"IsParallelExecutionActive": false,
// Per-lane prefixed results
"lane_0_emailSent": true,
"lane_0_emailId": "MSG-001",
"lane_1_smsSent": true,
"lane_1_smsId": "SMS-889",
"lane_2_slackPosted": true,
"lane_2_slackTs": "1234567890.001",
// Aggregate counts
"lane_success_count": 3,
"lane_failure_count": 0,
// Full lane contexts as array
"lane_outputs": [
{ "emailSent": true, "emailId": "MSG-001", ... },
{ "smsSent": true, "smsId": "SMS-889", ... },
{ "slackPosted": true, "slackTs": "...", ... }
]
}
Accessing Lane Results Downstream
After the Join's success port fires, downstream nodes can access any lane result using standard $var expressions:
// Check if all notification channels succeeded
$var.lane_success_count === 3
// Access specific lane result
$var.lane_0_emailId // "MSG-001"
$var.lane_1_smsSent // true
// Use lane_outputs for generic iteration (e.g., in a Loop)
// items = "lane_outputs"
// current_item.emailSent, current_item.smsSent, etc.