@jsonjoy.com/json-pack
Version:
High-performance JSON serialization library
659 lines • 23.5 kB
JavaScript
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.Nfsv3Encoder = void 0;
const Writer_1 = require("@jsonjoy.com/buffers/lib/Writer");
const XdrEncoder_1 = require("../../xdr/XdrEncoder");
const errors_1 = require("./errors");
class Nfsv3Encoder {
constructor(writer = new Writer_1.Writer()) {
this.writer = writer;
this.xdr = new XdrEncoder_1.XdrEncoder(writer);
}
encodeMessage(message, proc, isRequest) {
if (isRequest)
this.writeRequest(message, proc);
else
this.writeResponse(message, proc);
return this.writer.flush();
}
writeMessage(message, proc, isRequest) {
if (isRequest)
this.writeRequest(message, proc);
else
this.writeResponse(message, proc);
}
writeRequest(request, proc) {
switch (proc) {
case 1 /* Nfsv3Proc.GETATTR */:
return this.writeGetattrRequest(request);
case 2 /* Nfsv3Proc.SETATTR */:
return this.writeSetattrRequest(request);
case 3 /* Nfsv3Proc.LOOKUP */:
return this.writeLookupRequest(request);
case 4 /* Nfsv3Proc.ACCESS */:
return this.writeAccessRequest(request);
case 5 /* Nfsv3Proc.READLINK */:
return this.writeReadlinkRequest(request);
case 6 /* Nfsv3Proc.READ */:
return this.writeReadRequest(request);
case 7 /* Nfsv3Proc.WRITE */:
return this.writeWriteRequest(request);
case 8 /* Nfsv3Proc.CREATE */:
return this.writeCreateRequest(request);
case 9 /* Nfsv3Proc.MKDIR */:
return this.writeMkdirRequest(request);
case 10 /* Nfsv3Proc.SYMLINK */:
return this.writeSymlinkRequest(request);
case 11 /* Nfsv3Proc.MKNOD */:
return this.writeMknodRequest(request);
case 12 /* Nfsv3Proc.REMOVE */:
return this.writeRemoveRequest(request);
case 13 /* Nfsv3Proc.RMDIR */:
return this.writeRmdirRequest(request);
case 14 /* Nfsv3Proc.RENAME */:
return this.writeRenameRequest(request);
case 15 /* Nfsv3Proc.LINK */:
return this.writeLinkRequest(request);
case 16 /* Nfsv3Proc.READDIR */:
return this.writeReaddirRequest(request);
case 17 /* Nfsv3Proc.READDIRPLUS */:
return this.writeReaddirplusRequest(request);
case 18 /* Nfsv3Proc.FSSTAT */:
return this.writeFsstatRequest(request);
case 19 /* Nfsv3Proc.FSINFO */:
return this.writeFsinfoRequest(request);
case 20 /* Nfsv3Proc.PATHCONF */:
return this.writePathconfRequest(request);
case 21 /* Nfsv3Proc.COMMIT */:
return this.writeCommitRequest(request);
default:
throw new errors_1.Nfsv3EncodingError(`Unknown procedure: ${proc}`);
}
}
writeResponse(response, proc) {
switch (proc) {
case 1 /* Nfsv3Proc.GETATTR */:
return this.writeGetattrResponse(response);
case 2 /* Nfsv3Proc.SETATTR */:
return this.writeSetattrResponse(response);
case 3 /* Nfsv3Proc.LOOKUP */:
return this.writeLookupResponse(response);
case 4 /* Nfsv3Proc.ACCESS */:
return this.writeAccessResponse(response);
case 5 /* Nfsv3Proc.READLINK */:
return this.writeReadlinkResponse(response);
case 6 /* Nfsv3Proc.READ */:
return this.writeReadResponse(response);
case 7 /* Nfsv3Proc.WRITE */:
return this.writeWriteResponse(response);
case 8 /* Nfsv3Proc.CREATE */:
return this.writeCreateResponse(response);
case 9 /* Nfsv3Proc.MKDIR */:
return this.writeMkdirResponse(response);
case 10 /* Nfsv3Proc.SYMLINK */:
return this.writeSymlinkResponse(response);
case 11 /* Nfsv3Proc.MKNOD */:
return this.writeMknodResponse(response);
case 12 /* Nfsv3Proc.REMOVE */:
return this.writeRemoveResponse(response);
case 13 /* Nfsv3Proc.RMDIR */:
return this.writeRmdirResponse(response);
case 14 /* Nfsv3Proc.RENAME */:
return this.writeRenameResponse(response);
case 15 /* Nfsv3Proc.LINK */:
return this.writeLinkResponse(response);
case 16 /* Nfsv3Proc.READDIR */:
return this.writeReaddirResponse(response);
case 17 /* Nfsv3Proc.READDIRPLUS */:
return this.writeReaddirplusResponse(response);
case 18 /* Nfsv3Proc.FSSTAT */:
return this.writeFsstatResponse(response);
case 19 /* Nfsv3Proc.FSINFO */:
return this.writeFsinfoResponse(response);
case 20 /* Nfsv3Proc.PATHCONF */:
return this.writePathconfResponse(response);
case 21 /* Nfsv3Proc.COMMIT */:
return this.writeCommitResponse(response);
default:
throw new errors_1.Nfsv3EncodingError(`Unknown procedure: ${proc}`);
}
}
writeFh(fh) {
this.xdr.writeVarlenOpaque(fh.data);
}
writeFilename(filename) {
this.xdr.writeStr(filename);
}
writeTime(time) {
const xdr = this.xdr;
xdr.writeUnsignedInt(time.seconds);
xdr.writeUnsignedInt(time.nseconds);
}
writeSpecData(spec) {
const xdr = this.xdr;
xdr.writeUnsignedInt(spec.specdata1);
xdr.writeUnsignedInt(spec.specdata2);
}
writeFattr(attr) {
const xdr = this.xdr;
xdr.writeUnsignedInt(attr.type);
xdr.writeUnsignedInt(attr.mode);
xdr.writeUnsignedInt(attr.nlink);
xdr.writeUnsignedInt(attr.uid);
xdr.writeUnsignedInt(attr.gid);
xdr.writeUnsignedHyper(attr.size);
xdr.writeUnsignedHyper(attr.used);
this.writeSpecData(attr.rdev);
xdr.writeUnsignedHyper(attr.fsid);
xdr.writeUnsignedHyper(attr.fileid);
this.writeTime(attr.atime);
this.writeTime(attr.mtime);
this.writeTime(attr.ctime);
}
writePostOpAttr(attr) {
this.xdr.writeBoolean(attr.attributesFollow);
if (attr.attributesFollow && attr.attributes) {
this.writeFattr(attr.attributes);
}
}
writeWccAttr(attr) {
this.xdr.writeUnsignedHyper(attr.size);
this.writeTime(attr.mtime);
this.writeTime(attr.ctime);
}
writePreOpAttr(attr) {
this.xdr.writeBoolean(attr.attributesFollow);
if (attr.attributesFollow && attr.attributes) {
this.writeWccAttr(attr.attributes);
}
}
writeWccData(wcc) {
this.writePreOpAttr(wcc.before);
this.writePostOpAttr(wcc.after);
}
writePostOpFh(fh) {
this.xdr.writeBoolean(fh.handleFollows);
if (fh.handleFollows && fh.handle) {
this.writeFh(fh.handle);
}
}
writeSetMode(setMode) {
const xdr = this.xdr;
xdr.writeBoolean(setMode.set);
if (setMode.set && setMode.mode !== undefined) {
xdr.writeUnsignedInt(setMode.mode);
}
}
writeSetUid(setUid) {
const xdr = this.xdr;
xdr.writeBoolean(setUid.set);
if (setUid.set && setUid.uid !== undefined) {
xdr.writeUnsignedInt(setUid.uid);
}
}
writeSetGid(setGid) {
const xdr = this.xdr;
xdr.writeBoolean(setGid.set);
if (setGid.set && setGid.gid !== undefined) {
xdr.writeUnsignedInt(setGid.gid);
}
}
writeSetSize(setSize) {
const xdr = this.xdr;
xdr.writeBoolean(setSize.set);
if (setSize.set && setSize.size !== undefined) {
xdr.writeUnsignedHyper(setSize.size);
}
}
writeSetAtime(setAtime) {
this.xdr.writeUnsignedInt(setAtime.how);
if (setAtime.how === 2 /* Nfsv3TimeHow.SET_TO_CLIENT_TIME */ && setAtime.atime) {
this.writeTime(setAtime.atime);
}
}
writeSetMtime(setMtime) {
const xdr = this.xdr;
xdr.writeUnsignedInt(setMtime.how);
if (setMtime.how === 2 /* Nfsv3TimeHow.SET_TO_CLIENT_TIME */ && setMtime.mtime) {
this.writeTime(setMtime.mtime);
}
}
writeSattr(sattr) {
this.writeSetMode(sattr.mode);
this.writeSetUid(sattr.uid);
this.writeSetGid(sattr.gid);
this.writeSetSize(sattr.size);
this.writeSetAtime(sattr.atime);
this.writeSetMtime(sattr.mtime);
}
writeSattrGuard(guard) {
const xdr = this.xdr;
xdr.writeBoolean(guard.check);
if (guard.check && guard.objCtime) {
this.writeTime(guard.objCtime);
}
}
writeDirOpArgs(args) {
this.writeFh(args.dir);
this.writeFilename(args.name);
}
writeCreateHow(how) {
const xdr = this.xdr;
xdr.writeUnsignedInt(how.mode);
switch (how.mode) {
case 0 /* Nfsv3CreateMode.UNCHECKED */:
case 1 /* Nfsv3CreateMode.GUARDED */:
if (how.objAttributes) {
this.writeSattr(how.objAttributes);
}
break;
case 2 /* Nfsv3CreateMode.EXCLUSIVE */:
if (how.verf) {
xdr.writeOpaque(how.verf);
}
break;
}
}
writeMknodData(data) {
this.xdr.writeUnsignedInt(data.type);
switch (data.type) {
case 4 /* Nfsv3FType.NF3CHR */:
if (data.chr) {
this.writeSattr(data.chr.devAttributes);
this.writeSpecData(data.chr.spec);
}
break;
case 3 /* Nfsv3FType.NF3BLK */:
if (data.blk) {
this.writeSattr(data.blk.devAttributes);
this.writeSpecData(data.blk.spec);
}
break;
case 6 /* Nfsv3FType.NF3SOCK */:
if (data.sock) {
this.writeSattr(data.sock);
}
break;
case 7 /* Nfsv3FType.NF3FIFO */:
if (data.pipe) {
this.writeSattr(data.pipe);
}
break;
}
}
writeEntry(entry) {
const xdr = this.xdr;
if (!entry) {
xdr.writeBoolean(false);
return;
}
xdr.writeBoolean(true);
xdr.writeUnsignedHyper(entry.fileid);
this.writeFilename(entry.name);
xdr.writeUnsignedHyper(entry.cookie);
this.writeEntry(entry.nextentry);
}
writeEntryPlus(entry) {
const xdr = this.xdr;
if (!entry) {
xdr.writeBoolean(false);
return;
}
xdr.writeBoolean(true);
xdr.writeUnsignedHyper(entry.fileid);
this.writeFilename(entry.name);
xdr.writeUnsignedHyper(entry.cookie);
this.writePostOpAttr(entry.nameAttributes);
this.writePostOpFh(entry.nameHandle);
this.writeEntryPlus(entry.nextentry);
}
writeDirList(dirList) {
this.writeEntry(dirList.entries);
this.xdr.writeBoolean(dirList.eof);
}
writeDirListPlus(dirList) {
this.writeEntryPlus(dirList.entries);
this.xdr.writeBoolean(dirList.eof);
}
writeGetattrRequest(req) {
this.writeFh(req.object);
}
writeGetattrResponse(res) {
this.xdr.writeUnsignedInt(res.status);
if (res.status === 0 && res.resok) {
this.writeFattr(res.resok.objAttributes);
}
}
writeSetattrRequest(req) {
this.writeFh(req.object);
this.writeSattr(req.newAttributes);
this.writeSattrGuard(req.guard);
}
writeSetattrResponse(res) {
this.xdr.writeUnsignedInt(res.status);
if (res.status === 0 && res.resok) {
this.writeWccData(res.resok.objWcc);
}
else if (res.resfail) {
this.writeWccData(res.resfail.objWcc);
}
}
writeLookupRequest(req) {
this.writeDirOpArgs(req.what);
}
writeLookupResponse(res) {
this.xdr.writeUnsignedInt(res.status);
if (res.status === 0 && res.resok) {
this.writeFh(res.resok.object);
this.writePostOpAttr(res.resok.objAttributes);
this.writePostOpAttr(res.resok.dirAttributes);
}
else if (res.resfail) {
this.writePostOpAttr(res.resfail.dirAttributes);
}
}
writeAccessRequest(req) {
this.writeFh(req.object);
this.xdr.writeUnsignedInt(req.access);
}
writeAccessResponse(res) {
const xdr = this.xdr;
xdr.writeUnsignedInt(res.status);
if (res.status === 0 && res.resok) {
this.writePostOpAttr(res.resok.objAttributes);
xdr.writeUnsignedInt(res.resok.access);
}
else if (res.resfail) {
this.writePostOpAttr(res.resfail.objAttributes);
}
}
writeReadlinkRequest(req) {
this.writeFh(req.symlink);
}
writeReadlinkResponse(res) {
this.xdr.writeUnsignedInt(res.status);
if (res.status === 0 && res.resok) {
this.writePostOpAttr(res.resok.symlinkAttributes);
this.writeFilename(res.resok.data);
}
else if (res.resfail) {
this.writePostOpAttr(res.resfail.symlinkAttributes);
}
}
writeReadRequest(req) {
this.writeFh(req.file);
const xdr = this.xdr;
xdr.writeUnsignedHyper(req.offset);
xdr.writeUnsignedInt(req.count);
}
writeReadResponse(res) {
const xdr = this.xdr;
xdr.writeUnsignedInt(res.status);
if (res.status === 0 && res.resok) {
this.writePostOpAttr(res.resok.fileAttributes);
xdr.writeUnsignedInt(res.resok.count);
xdr.writeBoolean(res.resok.eof);
xdr.writeVarlenOpaque(res.resok.data);
}
else if (res.resfail) {
this.writePostOpAttr(res.resfail.fileAttributes);
}
}
writeWriteRequest(req) {
this.writeFh(req.file);
const xdr = this.xdr;
xdr.writeUnsignedHyper(req.offset);
xdr.writeUnsignedInt(req.count);
xdr.writeUnsignedInt(req.stable);
xdr.writeVarlenOpaque(req.data);
}
writeWriteResponse(res) {
const xdr = this.xdr;
xdr.writeUnsignedInt(res.status);
if (res.status === 0 && res.resok) {
this.writeWccData(res.resok.fileWcc);
xdr.writeUnsignedInt(res.resok.count);
xdr.writeUnsignedInt(res.resok.committed);
xdr.writeOpaque(res.resok.verf);
}
else if (res.resfail) {
this.writeWccData(res.resfail.fileWcc);
}
}
writeCreateRequest(req) {
this.writeDirOpArgs(req.where);
this.writeCreateHow(req.how);
}
writeCreateResponse(res) {
this.xdr.writeUnsignedInt(res.status);
if (res.status === 0 && res.resok) {
this.writePostOpFh(res.resok.obj);
this.writePostOpAttr(res.resok.objAttributes);
this.writeWccData(res.resok.dirWcc);
}
else if (res.resfail) {
this.writeWccData(res.resfail.dirWcc);
}
}
writeMkdirRequest(req) {
this.writeDirOpArgs(req.where);
this.writeSattr(req.attributes);
}
writeMkdirResponse(res) {
this.xdr.writeUnsignedInt(res.status);
if (res.status === 0 && res.resok) {
this.writePostOpFh(res.resok.obj);
this.writePostOpAttr(res.resok.objAttributes);
this.writeWccData(res.resok.dirWcc);
}
else if (res.resfail) {
this.writeWccData(res.resfail.dirWcc);
}
}
writeSymlinkRequest(req) {
this.writeDirOpArgs(req.where);
this.writeSattr(req.symlinkAttributes);
this.writeFilename(req.symlinkData);
}
writeSymlinkResponse(res) {
this.xdr.writeUnsignedInt(res.status);
if (res.status === 0 && res.resok) {
this.writePostOpFh(res.resok.obj);
this.writePostOpAttr(res.resok.objAttributes);
this.writeWccData(res.resok.dirWcc);
}
else if (res.resfail) {
this.writeWccData(res.resfail.dirWcc);
}
}
writeMknodRequest(req) {
this.writeDirOpArgs(req.where);
this.writeMknodData(req.what);
}
writeMknodResponse(res) {
this.xdr.writeUnsignedInt(res.status);
if (res.status === 0 && res.resok) {
this.writePostOpFh(res.resok.obj);
this.writePostOpAttr(res.resok.objAttributes);
this.writeWccData(res.resok.dirWcc);
}
else if (res.resfail) {
this.writeWccData(res.resfail.dirWcc);
}
}
writeRemoveRequest(req) {
this.writeDirOpArgs(req.object);
}
writeRemoveResponse(res) {
this.xdr.writeUnsignedInt(res.status);
if (res.status === 0 && res.resok) {
this.writeWccData(res.resok.dirWcc);
}
else if (res.resfail) {
this.writeWccData(res.resfail.dirWcc);
}
}
writeRmdirRequest(req) {
this.writeDirOpArgs(req.object);
}
writeRmdirResponse(res) {
this.xdr.writeUnsignedInt(res.status);
if (res.status === 0 && res.resok) {
this.writeWccData(res.resok.dirWcc);
}
else if (res.resfail) {
this.writeWccData(res.resfail.dirWcc);
}
}
writeRenameRequest(req) {
this.writeDirOpArgs(req.from);
this.writeDirOpArgs(req.to);
}
writeRenameResponse(res) {
this.xdr.writeUnsignedInt(res.status);
if (res.status === 0 && res.resok) {
this.writeWccData(res.resok.fromDirWcc);
this.writeWccData(res.resok.toDirWcc);
}
else if (res.resfail) {
this.writeWccData(res.resfail.fromDirWcc);
this.writeWccData(res.resfail.toDirWcc);
}
}
writeLinkRequest(req) {
this.writeFh(req.file);
this.writeDirOpArgs(req.link);
}
writeLinkResponse(res) {
this.xdr.writeUnsignedInt(res.status);
if (res.status === 0 && res.resok) {
this.writePostOpAttr(res.resok.fileAttributes);
this.writeWccData(res.resok.linkDirWcc);
}
else if (res.resfail) {
this.writePostOpAttr(res.resfail.fileAttributes);
this.writeWccData(res.resfail.linkDirWcc);
}
}
writeReaddirRequest(req) {
this.writeFh(req.dir);
const xdr = this.xdr;
xdr.writeUnsignedHyper(req.cookie);
xdr.writeOpaque(req.cookieverf);
xdr.writeUnsignedInt(req.count);
}
writeReaddirResponse(res) {
const xdr = this.xdr;
xdr.writeUnsignedInt(res.status);
if (res.status === 0 && res.resok) {
this.writePostOpAttr(res.resok.dirAttributes);
xdr.writeOpaque(res.resok.cookieverf);
this.writeDirList(res.resok.reply);
}
else if (res.resfail) {
this.writePostOpAttr(res.resfail.dirAttributes);
}
}
writeReaddirplusRequest(req) {
this.writeFh(req.dir);
const xdr = this.xdr;
xdr.writeUnsignedHyper(req.cookie);
xdr.writeOpaque(req.cookieverf);
xdr.writeUnsignedInt(req.dircount);
xdr.writeUnsignedInt(req.maxcount);
}
writeReaddirplusResponse(res) {
const xdr = this.xdr;
xdr.writeUnsignedInt(res.status);
if (res.status === 0 && res.resok) {
this.writePostOpAttr(res.resok.dirAttributes);
xdr.writeOpaque(res.resok.cookieverf);
this.writeDirListPlus(res.resok.reply);
}
else if (res.resfail) {
this.writePostOpAttr(res.resfail.dirAttributes);
}
}
writeFsstatRequest(req) {
this.writeFh(req.fsroot);
}
writeFsstatResponse(res) {
const xdr = this.xdr;
xdr.writeUnsignedInt(res.status);
if (res.status === 0 && res.resok) {
this.writePostOpAttr(res.resok.objAttributes);
xdr.writeUnsignedHyper(res.resok.tbytes);
xdr.writeUnsignedHyper(res.resok.fbytes);
xdr.writeUnsignedHyper(res.resok.abytes);
xdr.writeUnsignedHyper(res.resok.tfiles);
xdr.writeUnsignedHyper(res.resok.ffiles);
xdr.writeUnsignedHyper(res.resok.afiles);
xdr.writeUnsignedInt(res.resok.invarsec);
}
else if (res.resfail) {
this.writePostOpAttr(res.resfail.objAttributes);
}
}
writeFsinfoRequest(req) {
this.writeFh(req.fsroot);
}
writeFsinfoResponse(res) {
const xdr = this.xdr;
xdr.writeUnsignedInt(res.status);
if (res.status === 0 && res.resok) {
this.writePostOpAttr(res.resok.objAttributes);
xdr.writeUnsignedInt(res.resok.rtmax);
xdr.writeUnsignedInt(res.resok.rtpref);
xdr.writeUnsignedInt(res.resok.rtmult);
xdr.writeUnsignedInt(res.resok.wtmax);
xdr.writeUnsignedInt(res.resok.wtpref);
xdr.writeUnsignedInt(res.resok.wtmult);
xdr.writeUnsignedInt(res.resok.dtpref);
xdr.writeUnsignedHyper(res.resok.maxfilesize);
xdr.writeUnsignedInt(res.resok.timeDelta.seconds);
xdr.writeUnsignedInt(res.resok.timeDelta.nseconds);
xdr.writeUnsignedInt(res.resok.properties);
}
else if (res.resfail) {
this.writePostOpAttr(res.resfail.objAttributes);
}
}
writePathconfRequest(req) {
this.writeFh(req.object);
}
writePathconfResponse(res) {
const xdr = this.xdr;
xdr.writeUnsignedInt(res.status);
if (res.status === 0 && res.resok) {
this.writePostOpAttr(res.resok.objAttributes);
xdr.writeUnsignedInt(res.resok.linkmax);
xdr.writeUnsignedInt(res.resok.namemax);
xdr.writeBoolean(res.resok.noTrunc);
xdr.writeBoolean(res.resok.chownRestricted);
xdr.writeBoolean(res.resok.caseInsensitive);
xdr.writeBoolean(res.resok.casePreserving);
}
else if (res.resfail) {
this.writePostOpAttr(res.resfail.objAttributes);
}
}
writeCommitRequest(req) {
this.writeFh(req.file);
const xdr = this.xdr;
xdr.writeUnsignedHyper(req.offset);
xdr.writeUnsignedInt(req.count);
}
writeCommitResponse(res) {
const xdr = this.xdr;
xdr.writeUnsignedInt(res.status);
if (res.status === 0 && res.resok) {
this.writeWccData(res.resok.fileWcc);
xdr.writeOpaque(res.resok.verf);
}
else if (res.resfail) {
this.writeWccData(res.resfail.fileWcc);
}
}
}
exports.Nfsv3Encoder = Nfsv3Encoder;
//# sourceMappingURL=Nfsv3Encoder.js.map