requestHandler(payload) {
		const requestID = payload.requestID ? "with requestID '" + payload.requestID + "' " : "";
		this.logger.debug(
			`<= Request '${payload.action}' ${requestID}received from '${payload.sender}' node.`
		);

		try {
			if (this.broker.stopping) {
				this.logger.warn(
					`Incoming '${payload.action}' ${requestID}request from '${payload.sender}' node is dropped because broker is stopped.`
				);
				throw new E.ServiceNotAvailableError({
					action: payload.action,
					nodeID: this.nodeID
				});
			}

			let pass;
			if (payload.stream !== undefined) {
				pass = this._handleIncomingRequestStream(payload);
				// eslint-disable-next-line security/detect-possible-timing-attacks
				if (pass === null) return this.Promise.resolve();
			}

			const endpoint = this.broker._getLocalActionEndpoint(payload.action);

			// Recreate caller context
			const ctx = new this.broker.ContextFactory(this.broker);
			ctx.setEndpoint(endpoint);
			ctx.id = payload.id;
			ctx.setParams(pass ? pass : payload.params, this.broker.options.contextParamsCloning);
			ctx.parentID = payload.parentID;
			ctx.requestID = payload.requestID;
			ctx.caller = payload.caller;
			ctx.meta = payload.meta || {};
			ctx.level = payload.level;
			ctx.tracing = payload.tracing;
			ctx.nodeID = payload.sender;

			if (payload.timeout != null) ctx.options.timeout = payload.timeout;

			const p = endpoint.action.handler(ctx);
			// Pointer to Context
			p.ctx = ctx;

			return p
				.then(res => this.sendResponse(payload.sender, payload.id, ctx.meta, res, null))
				.catch(err => this.sendResponse(payload.sender, payload.id, ctx.meta, null, err));
		} catch (err) {
			return this.sendResponse(payload.sender, payload.id, payload.meta, null, err);
		}
	}
Handle incoming request

@param {Object} payload
@returns {Promise<any>}
@memberof Transit