code: function checkMsg(msg, protos) {
      if (!protos || !msg) {
          console.warn('no protos or msg exist! msg : %j, protos : %j', msg, protos);
          return false;
      }
  
      for (const name in protos) {
          if (protos.hasOwnProperty(name)) {
              let message;
              const proto = protos[name];
  
              // All required element must exist
              switch (proto.option) {
              case 'required' :
                  if (typeof (msg[name]) === 'undefined') {
                      console.warn('no property exist for required! name: %j, proto: %j, msg: %j', name, proto, msg);
                      return false;
                  }
              case 'optional' :    // eslint-disable-line
                  if (typeof (msg[name]) !== 'undefined') {
                      message = protos.__messages[proto.type] || Encoder.protos[`message ${proto.type}`];
                      if (!!message && !checkMsg(msg[name], message)) {
                          console.warn('inner proto error! name: %j, proto: %j, msg: %j', name, proto, msg);
                          return false;
                      }
                  }
                  break;
              case 'repeated' :
                  // Check nest message in repeated elements
                  message = protos.__messages[proto.type] || Encoder.protos[`message ${proto.type}`];
                  if (!!msg[name] && !!message) {
                      for (let i = 0; i < msg[name].length; i++) {
                          if (!checkMsg(msg[name][i], message)) {
                              return false;
                          }
                      }
                  }
                  break;
              default:
                  break;
              }
          }
      }
  
      return true;
  }
docs: Check if the msg follow the defination in the protos