# `@contrast/reporter`

Set up agent IO.

Reporting in the agent follows the PUB-SUB model. Reporters are nothing more than subscribers of messages published by the various agent components. Reporters can collect messages of interest and do with them what they will.

If a reporter want's to communicate with the agent, e.g. send it new settings to update feature behaviors, then it will publish the appropirate message to which the agent component is listening.

### Main Ideas

* Like other services, core will compose `@contrast/reporters` into the dependency container object. 

  ```typescript
  const { reporters } require('@contrast/core')();
  ```

* Clients can than `await` any reporter initialization code and respond to any errors.

  ```typescript
  try {
    await reporters.install();
  } catch (error) {
    // maybe we failed to connect to teamserver or something?
    // decide what to do.
  }
  ```

* Other than that, it's just plugging into the agent's event stream.

  ```typescript
  // e.g. teamserver Protect reporter pseudocode
  module.exports = function(deps) {
    return {
      async install() {
        await this.startup(deps);
        await this.appCreate(deps);
        ['InputAnalysis', 'BlockAtPerimeter', 'SinkEvent', 'HTTPRequest'].forEach((msgName) => {
           deps.messages.on(msgName, (msg) => {
             putInQueueAndReportLater(msgName, msg);
           });
        });
      }
    };
  };
  ```
