docs: function SyncMessage(type, name, content) {
    if(!SyncMessage.isValidType(type)) {
      throw "Invalid type";
    }
    if(!SyncMessage.isValidName(name)) {
      throw "Invalid name";
    }
  
    this.type = type;
    this.name = name;
    this.content = content || null;
  
    // Sugar for testing instance data
    var that = this;
    this.is = {
      // Types
      get request() {
        return that.type === SyncMessage.REQUEST;
      },
      get response() {
        return that.type === SyncMessage.RESPONSE;
      },
      get error() {
        return that.type === SyncMessage.ERROR;
      },
  
      // Names
      get sourceList() {
        return that.name === SyncMessage.SOURCELIST;
      },
      get sync() {
        return that.name === SyncMessage.SYNC;
      },
      get checksums() {
        return that.name === SyncMessage.CHECKSUMS;
      },
      get diffs() {
        return that.name === SyncMessage.DIFFS;
      },
      get patch() {
        return that.name === SyncMessage.PATCH;
      },
      get verification() {
        return that.name === SyncMessage.VERIFICATION;
      },
      get reset() {
        return that.name === SyncMessage.RESET;
      },
      get locked() {
        return that.name === SyncMessage.LOCKED;
      },
      get authz() {
        return that.name === SyncMessage.AUTHZ;
      },
      get impl() {
        return that.name === SyncMessage.IMPL;
      },
      get content() {
        return that.name === SyncMessage.INCONT;
      },
      get serverReset() {
        return that.name === SyncMessage.SERVER_RESET;
      },
      get downstreamLocked() {
        return that.name === SyncMessage.DOWNSTREAM_LOCKED;
      },
      get fileSizeError() {
        return that.type === SyncMessage.ERROR && that.name === SyncMessage.MAXSIZE;
      },
      get root() {
        return that.name === SyncMessage.ROOT;
      },
      get needsDownstream() {
        return that.type === SyncMessage.ERROR && that.name === SyncMessage.NEEDS_DOWNSTREAM;
      },
      get interrupted() {
        return that.name === SyncMessage.INTERRUPTED;
      },
      get delay() {
        return that.type === SyncMessage.REQUEST && that.name === SyncMessage.DELAY;
      },
      get rename() {
        return that.name === SyncMessage.RENAME;
      },
      get del() {
        return that.name === SyncMessage.DEL;
      }
    };
  }