The Crosser Edge node is a real-time engine designed to process Messages. A message can be pushed from an external source, such as a MQTT or HTTP client, or it can be pulled from the Edge node using connectors for different protocols/services. Messages can also be generated internally, eg by a data generator. All messages are handled by modules. Getting data from external sources, processing messages and delivering processed data to external recievers are all handled by different modules available in the Crosser module library.
Processing of messages is defined by combining modules into Flows, where the output of one module is sent to the input of one or several other modules. In this way a sequence of processing events can be configured. Flows are designed using the FlowStudio editor using a graphical drag&drop interface. A flow starts with a data source module, typically an input module or a time trigger. Processing in modules starts as soon as a message is recieved and the result is delivered to the next module as soon as it is available. A flow ends with one or several output modules where the result is delivered to an external system. No data is stored in the edge node, data is processed as soon as it is recieved and the results are delivered as soon as they are available. There is one exception to this rule and that is the MemoryBuffer module which can be used to temporarily hold messages until external connectivity or services become available.
The messages sent between modules are dynamic C# objects that can handle any data type and structure. Message formats can also be changed within a flow using modules such as the Property Mapper. This allows for normalization of formats on the input and adapting results to the formats expected by the recieving ends. The internal format should not be mistaken for JSON, even though it may look similar. If JSON data is recieved it must be converted to the internal format before any processing is applied. Same thing if the external reciever expects JSON formatted data it must be converted on the output. These conversions are in most cases handled by the input/output modules but explicit conversion can also be done using the JSON module. This module can convert back and forth between JSON and the internal format.