docs: static JsMessage createInboundWebMessage(String data) throws MessageDecodeFailedException {
          if (TraceComponent.isAnyTracingEnabled() && tc.isEntryEnabled())
              SibTr.entry(tc, "createInboundWebMessage");
          JsJmsMessage result = null;
  
          if (TraceComponent.isAnyTracingEnabled() && tc.isDebugEnabled())
              SibTr.debug(tc, "Decoding message from web data", data);
  
          // The inbound data consists of a number of '~' delimited fields. Refer to the
          // description in WebJsJmsMessageEncoderImpl for details.
          StringTokenizer st = new StringTokenizer(data, "~", true);
  
          // Pull out the header fields and the message payload.  Remember that it is possible
          // for fields to be empty strings which will be encoded consecutive delimiters.
          String version, id, type, format, topic, props, body;
          version = id = type = format = topic = props = body = null;
          try {
              version = st.nextToken();
              st.nextToken();
              String s = st.nextToken();
              if (!s.equals("~")) {
                  id = s;
                  st.nextToken();
              }
              s = st.nextToken();
              if (!s.equals("~")) {
                  type = s;
                  st.nextToken();
              }
              s = st.nextToken();
              if (!s.equals("~")) {
                  format = s;
                  st.nextToken();
              }
              s = st.nextToken();
              if (!s.equals("~")) {
                  topic = s;
                  st.nextToken();
              }
              s = st.nextToken();
              if (!s.equals("~")) {
                  props = s;
                  // This may be the end
                  if (st.hasMoreTokens())
                      st.nextToken();
              }
              // The body may be omitted completely
              if (st.hasMoreTokens()) {
                  body = st.nextToken();
              }
          } catch (NoSuchElementException e) {
              FFDCFilter.processException(e, "com.ibm.ws.sib.mfp.impl.WebJsMessageFactoryImpl.createInboundWebMessage", "119");
              throw new MessageDecodeFailedException("Inccorect WebClient encoding", e);
          }
  
          // Verify the data
          if (!version.equals("1"))
              throw new MessageDecodeFailedException("Incorrect WebClient encoding version: " + version);
          if (!format.startsWith(SIApiConstants.JMS_FORMAT))
              throw new MessageDecodeFailedException("Incorrect WebClient message format: " + format);
  
          // Decode the mesasge
          if (format.equalsIgnoreCase(SIApiConstants.JMS_FORMAT_TEXT))
              result = decodeTextBody(body);
          else if (format.equalsIgnoreCase(SIApiConstants.JMS_FORMAT_BYTES))
              result = decodeBytesBody(body);
          else if (format.equalsIgnoreCase(SIApiConstants.JMS_FORMAT_OBJECT))
              result = decodeObjectBody(body);
          else if (format.equalsIgnoreCase(SIApiConstants.JMS_FORMAT_STREAM))
              result = decodeStreamBody(body);
          else if (format.equalsIgnoreCase(SIApiConstants.JMS_FORMAT_MAP))
              result = decodeMapBody(body);
          else
              result = new JsJmsMessageImpl(MfpConstants.CONSTRUCTOR_NO_OP);
  
          decodeHeader(result, id, type, topic, props);
  
          if (TraceComponent.isAnyTracingEnabled() && tc.isDebugEnabled())
              SibTr.debug(tc, "Decoded Web Message", ((MessageImpl) result).debugMsg());
          if (TraceComponent.isAnyTracingEnabled() && tc.isEntryEnabled())
              SibTr.exit(tc, "createInboundWebMessage");
          return result;
      }