# host/init_ao_state.js

    'use strict'

    const clientID = require('../util/gen_client_id')
    const _isFunction = require('lodash/isFunction')
    const AsyncEventEmitter = require('../async_event_emitter')

    /**
     * Creates the initial state object for an algo order, after processing
     * and validating the provided arguments.
     *
     * @param {object} aoDef - algo order definition object
     * @param {object} args - instance arguments
     * @returns {object} initialState
     */
    module.exports = (aoDef = {}, args = {}) => {
      const { meta = {}, id, name } = aoDef
      const { validateParams, processParams, initState, genOrderLabel } = meta
      const params = _isFunction(processParams)
        ? processParams(args)
        : args

      if (_isFunction(validateParams)) {
        const vError = validateParams(params)

        if (vError) {
          throw new Error(vError)
        }
      }

      const initialState = _isFunction(initState)
        ? initState(params)
        : {}

      const gid = clientID() + ''

      // All AOs and the AO host + helpers depend on the structure below; as such
      // it should be modified with great care
      return {
        channels: [],
        orders: {}, // active
        cancelledOrders: {}, // cancelled by us (not via UI)
        allOrders: {}, // active + closed
        ev: new AsyncEventEmitter(),
        active: false,
        label: genOrderLabel ? genOrderLabel({ args: params }) : name,
        name,
        args,
        gid,
        id,

        ...initialState
      }
    }