Connecting Steps
Pre-requisite
Section titled “Pre-requisite”At this point, you’d have already followed the Creating a Processor and Creating a Step guides. Our next goal is to put those two pieces together and connect steps within the processor.
How to connect steps
Section titled “How to connect steps”Now that you have created a step, you can connect it to other steps.
To do so, we use a builder class called ProcessorBuilder to specify a sequence of steps that make up a processor.
- After you’ve instantiated your steps, you need to convert them into
RunnableStep.RunnableStepis a trait that wraps around a step. It provides the necessary input and output channels that feed into the step and allows the step to be spawned in a task. The SDK provides a helper function.into_runnable_stepto convert a step into aRunnableStep. - Setup your first step with
ProcessorBuilder::new_with_inputless_first_step. In almost all cases, the first step should be aTransactionStreamStep. - Connect the previous step to the next step using
.connect_to.connect_touses trait bounds to ensure at compile time that the output type of the previous step matches the input type of the next step. When calling.connect_to, a channel gets created with sizechannel_sizeand connects the previous and next steps. It also spawns a task that continuously loops the previous step — reading data from its input channel, processing the data, and sending the output to its output channel. - Repeat step 3 for each step in your processor.
- To close off the
ProcessorBuilder, use.end_and_return_output_receiver. This returns anInstrumentedAsyncReceiverwhich you can use to process the output of the last step in the graph.
Here’s a simple example of connecting two steps:
let (processor_builder, buffer_receiver) = ProcessorBuilder::new_with_inputless_first_step( transaction_stream_step.into_runnable_step(), ) .connect_to(extractor_step.into_runnable_step(), 10) .end_and_return_output_receiver(10);Here’s a full example from aptos-indexer-processor-example.
Visualizing the processor
Section titled “Visualizing the processor”As you connect steps, ProcessorBuilder in the background is constructing a graphical representation of the steps in your processor using petgraph.
You can see the visual representation of the graph by calling
let dot = processor_builder.graph.dot();println!("{}", dot);This will output a graph in the DOT language that you can visualize using tools like Graphviz.