invokeChainCode(securityContext, functionName, args, options) {
        const method = 'invokeChainCode';
        LOG.entry(method, securityContext, functionName, args, options);
        if (!this.businessNetworkIdentifier) {
            return Promise.reject(new Error('No business network has been specified for this connection'));
        }
        // Check that a valid security context has been specified.
        HLFUtil.securityCheck(securityContext);
        // Validate all the arguments.
        if (!functionName) {
            return Promise.reject(new Error('functionName not specified'));
        } else if (!Array.isArray(args)) {
            return Promise.reject(new Error('args not specified'));
        }
        try {
            args.forEach((arg) => {
                if (typeof arg !== 'string') {
                    throw new Error('invalid arg specified: ' + arg);
                }
            });
        } catch(error) {
            return Promise.reject(error);
        }
        let txId = this._validateTxId(options);
        let eventHandler;
        // initialize the channel if it hasn't been initialized already otherwise verification will fail.
        LOG.debug(method, 'loading channel configuration');
        return this._initializeChannel()
            .then(() => {
                // check the event hubs and reconnect if possible. Do it here as the connection attempts are asynchronous
                this._checkEventhubs();
                // Submit the transaction to the endorsers.
                const request = {
                    chaincodeId: this.businessNetworkIdentifier,
                    txId: txId,
                    fcn: functionName,
                    args: args
                };
                return this.channel.sendTransactionProposal(request); // node sdk will target all peers on the channel that are endorsingPeer
            })
            .then((results) => {
                // Validate the endorsement results.
                LOG.debug(method, `Received ${results.length} result(s) from invoking the composer runtime chaincode`, results);
                const proposalResponses = results[0];
                let {validResponses} = this._validatePeerResponses(proposalResponses, true);
                // Submit the endorsed transaction to the primary orderers.
                const proposal = results[1];
                const header = results[2];
                // check that we have a Chaincode listener setup and ready.
                this._checkCCListener();
                eventHandler = HLFConnection.createTxEventHandler(this.eventHubs, txId.getTransactionID(), this.commitTimeout);
                eventHandler.startListening();
                return this.channel.sendTransaction({
                    proposalResponses: validResponses,
                    proposal: proposal,
                    header: header
                });
            })
            .then((response) => {
                // If the transaction was successful, wait for it to be committed.
                LOG.debug(method, 'Received response from orderer', response);
                if (response.status !== 'SUCCESS') {
                    eventHandler.cancelListening();
                    throw new Error(`Failed to send peer responses for transaction '${txId.getTransactionID()}' to orderer. Response status '${response.status}'`);
                }
                return eventHandler.waitForEvents();
            })
            .then(() => {
                LOG.exit(method);
            })
            .catch((error) => {
                const newError = new Error('Error trying invoke business network. ' + error);
                LOG.error(method, newError);
                throw newError;
            });
    }
But this keeps waiting for an event. This approach does not work as of now.