Using the JavaScript OpenDXL Client

This article walks through the process of installing, provisioning, and running a subset of the samples that are included with the OpenDXL JavaScript Client.


The samples examined in this article demonstrate how to use the two distinct messaging models that are supported by DXL. A publish/subscribe event-based model and a service-based model with point-to-point (request/response) communication.

Client Installation and Provisioning

The following steps detail how to install and provision the OpenDXL JavaScript Client:

Event-based Communication

The DXL fabric supports an event-based communication model. This model is typically referred to as “publish/subscribe” wherein clients register interest by subscribing to a particular topic and publishers periodically send events to that topic. The event is delivered by the DXL fabric to all of the currently subscribed clients for the topic. Therefore, a single event sent can reach multiple clients (one-to-many). It is important to note that in this model the client passively receives events when they are sent by a publisher.




For example, McAfee Advanced Threat Defense (ATD) servers send events to the topic /mcafee/event/atd/file/report when they have successfully determined the reputation of a submitted file. Any clients currently subscribed to this topic will receive the report and can take immediate action.

Run Sample

A "basic event sample" is included with the OpenDXL JavaScript Client SDK that demonstrates sending and receiving 1000 events via the JavaScript client.


To run the sample execute the following from the root directory of the extracted OpenDXL JavaScript Client SDK:


$ node sample/basic/event-example.js

Sample Output

The output should appear similar to the following (1000 events are received and timing information is displayed).


Code Details

This section walks through the different portions of code that comprise the "basic event sample" in detail. Full code for the sample is available within the extracted SDK or via the OpenDXL JavaScript Client GitHub Repository.



As shown above, several variables are defined in the header of the "basic event sample":

  • EVENT_TOPIC: The topic that the events will be sent (and received) on:
    • /isecg/sample/basicevent
  • TOTAL_EVENTS: The total number of events to send (1000)
  • eventCount: Tracks the number of events that have been received
  • start: The start time of the sample


JavaScript: Create Client from Configuration
  1. // Create DXL configuration from file
  2. var config = dxl.Config.createDxlConfigFromFile(common.CONFIG_FILE)
  3. // Create the client
  4. var client = new dxl.Client(config)


The next portion of code (shown above) creates the DXL client. The first step is to create a DXL Config object that contains the information necessary to connect to a DXL fabric. In this particular sample, the createDxlConfigFromFile method was used to create a configuration object from a configuration file.


The next line of code creates a DXL Client object by passing the previously created configuration object to its constructor.



The next portion of code (shown above) registers an event callback that will receive events that are published to the /isecg/sample/basiceventtopic.


The event callback function is registered with the client via the addEventCallback method. This method will be invoked for each event that is sent to the DXL fabric for topics that are associated with the callback. The main portion of this method displays the payload of the event received and increments the total count of events. If all of the events have been received, the client is stopped (and destroyed) by invoking the client's destroy method.



The final portion of this sample's code (shown above) connects to the DXL fabric and sends out 1000 events on the /isecg/sample/basicevent topic.


To connect to the fabric, the connect method is invoked on the DXL client. The connect method takes an optional argument which is a callback method that will be invoked when the client has completed connecting to the DXL fabric. The body of the callback function passed in this sample contains a for loop that is iterated for TOTAL_EVENTS times (1000). The first step in the body of the for loop is to construct a new Event that will be sent to the /isecg/sample/basicevent topic. Next, a payload is set on the event that contains the index of the loop (from 0 to 999). The final line of the loop body sends the event to the DXL fabric by invoking the sendEvent method on the client.

Service-based Communication

The DXL fabric allows for “services” to be registered and exposed that respond to requests sent by invoking clients. This communication is point-to-point (one-to-one), meaning the communication is solely between an invoking client and the service that is being invoked. It is important to note that in this model the client actively invokes the service by sending it requests.


For example, the McAfee Threat Intelligence Exchange (TIE) service is exposed via DXL allowing for DXL clients to actively request reputations for files and certificates.




Run Sample

A "basic service sample" is included with the OpenDXL JavaScript Client SDK that demonstrates registering and invoking a DXL service.


To run the sample execute the following from the root directory of the extracted OpenDXL JavaScript Client SDK:


$ node sample/basic/service-example.js

Sample Output

The output should appear similar to the following (a request is received by the service and it delivers a response back to the invoking client).


Code: Sample Output
  1. Service received request payload: ping
  2. Client received response payload: pong

Code Details

This section walks through the different portions of code that comprise the "basic service sample" in detail. Full code for the sample is available within the extracted SDK or via the OpenDXL JavaScript Client GitHub Repository.


JavaScript: Define Service Topic
  1. // The topic for the service to respond to
  2. var SERVICE_TOPIC = '/isecg/sample/mybasicservice'


As shown above, a variable is defined that contains a topic to associate with the service. Multiple topics can be associated with a service, each topic represents a different "function" that can be invoked by remote DXL clients.



The next portion of code (shown above) creates a DXL service registration that will respond to requests that are received on the /isecg/sample/mybasicservice topic.


The first step is to create a ServiceRegistrationInfo object that will be used to register the service. Note that the ServiceRegistrationInfo object is created with a name ("myService") to represent the specific instance of the service during registration.


The next step is to register a callback (seen above as the second argument passed into info.addTopic()). This callback function will be invoked for each request that is sent to the DXL fabric for the service topic that is associated with the callback.


The implementation of the callback function displays the payload of the Request message that was received. Next, it creates a Response message that will be sent back to the invoking client. The payload of the Response message is set to "pong". The last line of this function sends the response back to the invoking client by passing the newly created Response object to the sendResponse method of the client.



The next portion of code (shown above) registers and invokes the service. If the invocation of the service is successful, information contained in the received response is displayed.


The first step is to register the service by invoking the registerServiceAsync method of the client, passing in the service registration object that was previously created along with a callback function that will be invoked once registration has completed.


Once registration of the service has completed, the specified callback function will be invoked. The main portion of the callback creates a Request message that will be sent to the /isecg/sample/basicservice topic. The payload of the Request object is set to "ping".


Next, the service is invoked by passing the newly created Request object to the asyncRequest method of the client. The second argument to the asyncRequest method is a callback function that will be invoked when a Response has been received for the Request (or an error has occurred).


If an error has not occurred, the payload associated with the Response message is displayed.