_handleTradeMessage (msg, chanData) {
    const eventName = msg[1][0] === 'f'
      ? msg[1] // Funding trades are passed to fte/ftu handlers
      : msg[1] === 'te'
        ? 'trade-entry'
        : 'trades'

    let payload = getMessagePayload(msg)

    if (!Array.isArray(payload[0])) {
      payload = [payload]
    }

    let data = payload

    if (this._transform) { // correctly parse single trade/array of trades
      const M = eventName[0] === 'f' && msg[2].length === 8 ? FundingTrade : PublicTrade
      const trades = M.unserialize(data)

      if (_isArray(trades) && trades.length === 1) {
        data = trades[0]
      } else {
        data = trades
      }

      data = new M(data)
    }

    const internalMessage = [chanData.chanId, eventName, data]
    internalMessage.filterOverride = [chanData.symbol || chanData.pair]

    this._propagateMessageToListeners(internalMessage, chanData, false)
    this.emit('trades', chanData.symbol || chanData.pair, data)
  }
@param {Array} msg - incoming message
@param {object} chanData - channel definition
@private