docs: function SlackWebOut(n) {
      RED.nodes.createNode(this, n);
  
      var node = this;
      this.client = n.client;
      this.clientNode = RED.nodes.getNode(this.client);
  
      node.status(statuses.disconnected);
  
      if (node.client) {
        SetConfigNodeConnectionListeners(node);
  
        node.on("input", function(msg) {
          SlackDebug("slack-web-out incomiming message", msg);
  
          var method = msg.topic;
          var options = msg.payload;
  
          if (
            !method ||
            typeof method !== "string" ||
            !method instanceof String
          ) {
            node.error("invalid msg.topic");
            return null;
          }
  
          /**
           * Try to help with common use case, set channel based on lookup if starts with @ or #
           *
           * https://api.slack.com/methods/chat.postMessage
           */
          if (
            method == "chat.postMessage" ||
            method == "chat.postEphemeral" ||
            method == "chat.meMessage"
          ) {
            if (options.channel[0] == "@" || options.channel[0] == "#") {
              var channel = node.clientNode.findChannelByName(options.channel);
              if (channel && channel.id) {
                options.channel = channel.id;
              }
            }
          }
  
          /**
           * special handling for simple use-case
           */
          if (method[0] == "@" || method[0] == "#") {
            var channel = node.clientNode.findChannelByName(method);
            if (!channel || !channel.id) {
              node.error("invalid channel: " + method);
              return null;
            }
            method = "chat.postMessage";
            options = {
              channel: channel.id,
              text: msg.payload
              //as_user: true
            };
          }
  
          /**
           * custom per-method logic
           */
          switch (method) {
            case "chat.postMessage":
            case "chat.postEphemeral":
            case "chat.meMessage":
              // force text to be a string
              options.text = ValueToString(options.text);
              break;
          }
  
          node.status(statuses.sending);
          msg.slackState = node.clientNode.state;
  
          SlackDebug("slack-web-out call", method, options);
          node.clientNode.webClient
            .apiCall(method, options)
            .then(res => {
              SlackDebug("slack-web-out call response", res);
              msg.payload = node.clientNode.dressResponseMessage(res);
              node.send(msg);
              node.status(statuses.connected);
            })
            .catch(e => {
              SlackDebug("slack-web-out error response", e.data);
              msg.payload = e.data;
              node.send(msg);
              node.status(statuses.connected);
            });
        });
      } else {
        node.status(statuses.misconfigured);
      }
    }