UNPKG

@jsonjoy.com/json-pack

Version:

High-performance JSON serialization library

960 lines 39.2 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.Nfsv4Decoder = void 0; const tslib_1 = require("tslib"); const Reader_1 = require("@jsonjoy.com/buffers/lib/Reader"); const XdrDecoder_1 = require("../../xdr/XdrDecoder"); const errors_1 = require("./errors"); const msg = tslib_1.__importStar(require("./messages")); const structs = tslib_1.__importStar(require("./structs")); class Nfsv4Decoder { constructor(reader = new Reader_1.Reader()) { this.xdr = new XdrDecoder_1.XdrDecoder(reader); } decodeCompound(reader, isRequest) { if (isRequest) { return this.decodeCompoundRequest(reader); } else { return this.decodeCompoundResponse(reader); } } decodeCompoundRequest(reader) { const xdr = this.xdr; xdr.reader = reader; const tag = xdr.readString(); const minorversion = xdr.readUnsignedInt(); const argarray = []; const count = xdr.readUnsignedInt(); for (let i = 0; i < count; i++) { const op = xdr.readUnsignedInt(); const request = this.decodeRequest(op); if (request) argarray.push(request); } return new msg.Nfsv4CompoundRequest(tag, minorversion, argarray); } decodeCompoundResponse(reader) { const xdr = this.xdr; xdr.reader = reader; const status = xdr.readUnsignedInt(); const tag = xdr.readString(); const resarray = []; const count = xdr.readUnsignedInt(); for (let i = 0; i < count; i++) { const op = xdr.readUnsignedInt(); const response = this.decodeResponse(op); if (response) resarray.push(response); } return new msg.Nfsv4CompoundResponse(status, tag, resarray); } decodeRequest(op) { const xdr = this.xdr; switch (op) { case 3 /* Nfsv4Op.ACCESS */: return msg.Nfsv4AccessRequest.decode(xdr); case 4 /* Nfsv4Op.CLOSE */: return msg.Nfsv4CloseRequest.decode(xdr); case 5 /* Nfsv4Op.COMMIT */: return msg.Nfsv4CommitRequest.decode(xdr); case 6 /* Nfsv4Op.CREATE */: return this.decodeCreateRequest(); case 7 /* Nfsv4Op.DELEGPURGE */: return msg.Nfsv4DelegpurgeRequest.decode(xdr); case 8 /* Nfsv4Op.DELEGRETURN */: return msg.Nfsv4DelegreturnRequest.decode(xdr); case 9 /* Nfsv4Op.GETATTR */: return this.decodeGetattrRequest(); case 10 /* Nfsv4Op.GETFH */: return this.decodeGetfhRequest(); case 11 /* Nfsv4Op.LINK */: return this.decodeLinkRequest(); case 12 /* Nfsv4Op.LOCK */: return this.decodeLockRequest(); case 13 /* Nfsv4Op.LOCKT */: return this.decodeLocktRequest(); case 14 /* Nfsv4Op.LOCKU */: return this.decodeLockuRequest(); case 15 /* Nfsv4Op.LOOKUP */: return this.decodeLookupRequest(); case 16 /* Nfsv4Op.LOOKUPP */: return this.decodeLookuppRequest(); case 17 /* Nfsv4Op.NVERIFY */: return this.decodeNverifyRequest(); case 18 /* Nfsv4Op.OPEN */: return this.decodeOpenRequest(); case 19 /* Nfsv4Op.OPENATTR */: return this.decodeOpenattrRequest(); case 20 /* Nfsv4Op.OPEN_CONFIRM */: return this.decodeOpenConfirmRequest(); case 21 /* Nfsv4Op.OPEN_DOWNGRADE */: return this.decodeOpenDowngradeRequest(); case 22 /* Nfsv4Op.PUTFH */: return this.decodePutfhRequest(); case 23 /* Nfsv4Op.PUTPUBFH */: return new msg.Nfsv4PutpubfhRequest(); case 24 /* Nfsv4Op.PUTROOTFH */: return new msg.Nfsv4PutrootfhRequest(); case 25 /* Nfsv4Op.READ */: return this.decodeReadRequest(); case 26 /* Nfsv4Op.READDIR */: return this.decodeReaddirRequest(); case 27 /* Nfsv4Op.READLINK */: return this.decodeReadlinkRequest(); case 28 /* Nfsv4Op.REMOVE */: return this.decodeRemoveRequest(); case 29 /* Nfsv4Op.RENAME */: return this.decodeRenameRequest(); case 30 /* Nfsv4Op.RENEW */: return this.decodeRenewRequest(); case 31 /* Nfsv4Op.RESTOREFH */: return this.decodeRestorefhRequest(); case 32 /* Nfsv4Op.SAVEFH */: return new msg.Nfsv4SavefhRequest(); case 33 /* Nfsv4Op.SECINFO */: return this.decodeSecinfoRequest(); case 34 /* Nfsv4Op.SETATTR */: return this.decodeSetattrRequest(); case 35 /* Nfsv4Op.SETCLIENTID */: return this.decodeSetclientidRequest(); case 36 /* Nfsv4Op.SETCLIENTID_CONFIRM */: return this.decodeSetclientidConfirmRequest(); case 37 /* Nfsv4Op.VERIFY */: return this.decodeVerifyRequest(); case 38 /* Nfsv4Op.WRITE */: return this.decodeWriteRequest(); case 39 /* Nfsv4Op.RELEASE_LOCKOWNER */: return this.decodeReleaseLockOwnerRequest(); case 10044 /* Nfsv4Op.ILLEGAL */: return this.decodeIllegalRequest(); default: // Per RFC 7530 §15.2.4, operations 0, 1, 2 are not defined and any // unknown operation code should be treated as ILLEGAL return this.decodeIllegalRequest(); } } decodeResponse(op) { const xdr = this.xdr; switch (op) { case 3 /* Nfsv4Op.ACCESS */: return this.decodeAccessResponse(); case 4 /* Nfsv4Op.CLOSE */: return this.decodeCloseResponse(); case 5 /* Nfsv4Op.COMMIT */: return this.decodeCommitResponse(); case 6 /* Nfsv4Op.CREATE */: return this.decodeCreateResponse(); case 7 /* Nfsv4Op.DELEGPURGE */: return this.decodeDelegpurgeResponse(); case 8 /* Nfsv4Op.DELEGRETURN */: return this.decodeDelegreturnResponse(); case 9 /* Nfsv4Op.GETATTR */: return this.decodeGetattrResponse(); case 10 /* Nfsv4Op.GETFH */: return this.decodeGetfhResponse(); case 11 /* Nfsv4Op.LINK */: return this.decodeLinkResponse(); case 12 /* Nfsv4Op.LOCK */: return this.decodeLockResponse(); case 13 /* Nfsv4Op.LOCKT */: return this.decodeLocktResponse(); case 14 /* Nfsv4Op.LOCKU */: return this.decodeLockuResponse(); case 15 /* Nfsv4Op.LOOKUP */: return this.decodeLookupResponse(); case 16 /* Nfsv4Op.LOOKUPP */: return this.decodeLookuppResponse(); case 17 /* Nfsv4Op.NVERIFY */: return this.decodeNverifyResponse(); case 18 /* Nfsv4Op.OPEN */: return this.decodeOpenResponse(); case 19 /* Nfsv4Op.OPENATTR */: return this.decodeOpenattrResponse(); case 20 /* Nfsv4Op.OPEN_CONFIRM */: return this.decodeOpenConfirmResponse(); case 21 /* Nfsv4Op.OPEN_DOWNGRADE */: return this.decodeOpenDowngradeResponse(); case 22 /* Nfsv4Op.PUTFH */: return this.decodePutfhResponse(); case 23 /* Nfsv4Op.PUTPUBFH */: return msg.Nfsv4PutpubfhResponse.decode(xdr); case 24 /* Nfsv4Op.PUTROOTFH */: return this.decodePutrootfhResponse(); case 25 /* Nfsv4Op.READ */: return this.decodeReadResponse(); case 26 /* Nfsv4Op.READDIR */: return this.decodeReaddirResponse(); case 27 /* Nfsv4Op.READLINK */: return this.decodeReadlinkResponse(); case 28 /* Nfsv4Op.REMOVE */: return this.decodeRemoveResponse(); case 29 /* Nfsv4Op.RENAME */: return this.decodeRenameResponse(); case 30 /* Nfsv4Op.RENEW */: return this.decodeRenewResponse(); case 31 /* Nfsv4Op.RESTOREFH */: return this.decodeRestorefhResponse(); case 32 /* Nfsv4Op.SAVEFH */: return this.decodeSavefhResponse(); case 33 /* Nfsv4Op.SECINFO */: return this.decodeSecinfoResponse(); case 34 /* Nfsv4Op.SETATTR */: return this.decodeSetattrResponse(); case 35 /* Nfsv4Op.SETCLIENTID */: return this.decodeSetclientidResponse(); case 36 /* Nfsv4Op.SETCLIENTID_CONFIRM */: return this.decodeSetclientidConfirmResponse(); case 37 /* Nfsv4Op.VERIFY */: return this.decodeVerifyResponse(); case 38 /* Nfsv4Op.WRITE */: return this.decodeWriteResponse(); case 39 /* Nfsv4Op.RELEASE_LOCKOWNER */: return this.decodeReleaseLockOwnerResponse(); case 10044 /* Nfsv4Op.ILLEGAL */: return this.decodeIllegalResponse(); default: // Per RFC 7530 §15.2.4, treat unknown operation codes as ILLEGAL return this.decodeIllegalResponse(); } } readFh() { const data = this.xdr.readVarlenOpaque(); return new structs.Nfsv4Fh(data); } readVerifier() { const data = this.xdr.readOpaque(8); return new structs.Nfsv4Verifier(data); } readStateid() { return structs.Nfsv4Stateid.decode(this.xdr); } readBitmap() { const xdr = this.xdr; const count = xdr.readUnsignedInt(); if (count > 8) throw 10036 /* Nfsv4Stat.NFS4ERR_BADXDR */; const mask = []; for (let i = 0; i < count; i++) mask.push(xdr.readUnsignedInt()); return new structs.Nfsv4Bitmap(mask); } readFattr() { const attrmask = this.readBitmap(); const attrVals = this.xdr.readVarlenOpaque(); return new structs.Nfsv4Fattr(attrmask, attrVals); } readChangeInfo() { const xdr = this.xdr; const atomic = xdr.readBoolean(); const before = xdr.readUnsignedHyper(); const after = xdr.readUnsignedHyper(); return new structs.Nfsv4ChangeInfo(atomic, before, after); } readClientAddr() { const xdr = this.xdr; const rNetid = xdr.readString(); const rAddr = xdr.readString(); return new structs.Nfsv4ClientAddr(rNetid, rAddr); } readCbClient() { const cbProgram = this.xdr.readUnsignedInt(); const cbLocation = this.readClientAddr(); return new structs.Nfsv4CbClient(cbProgram, cbLocation); } readClientId() { const verifier = this.readVerifier(); const id = this.xdr.readVarlenOpaque(); return new structs.Nfsv4ClientId(verifier, id); } readOpenOwner() { const xdr = this.xdr; const clientid = xdr.readUnsignedHyper(); const owner = xdr.readVarlenOpaque(); return new structs.Nfsv4OpenOwner(clientid, owner); } readLockOwner() { const xdr = this.xdr; const clientid = xdr.readUnsignedHyper(); const owner = xdr.readVarlenOpaque(); return new structs.Nfsv4LockOwner(clientid, owner); } readOpenToLockOwner() { const xdr = this.xdr; const openSeqid = xdr.readUnsignedInt(); const openStateid = this.readStateid(); const lockSeqid = xdr.readUnsignedInt(); const lockOwner = this.readLockOwner(); return new structs.Nfsv4OpenToLockOwner(openSeqid, openStateid, lockSeqid, lockOwner); } readLockOwnerInfo() { const xdr = this.xdr; const newLockOwner = xdr.readBoolean(); if (newLockOwner) { const openToLockOwner = this.readOpenToLockOwner(); return new structs.Nfsv4LockOwnerInfo(true, new structs.Nfsv4LockNewOwner(openToLockOwner)); } else { const lockStateid = this.readStateid(); const lockSeqid = xdr.readUnsignedInt(); return new structs.Nfsv4LockOwnerInfo(false, new structs.Nfsv4LockExistingOwner(lockStateid, lockSeqid)); } } readOpenClaim() { const xdr = this.xdr; const claimType = xdr.readUnsignedInt(); switch (claimType) { case 0: { const file = xdr.readString(); return new structs.Nfsv4OpenClaim(claimType, new structs.Nfsv4OpenClaimNull(file)); } case 1: { const delegateType = xdr.readUnsignedInt(); return new structs.Nfsv4OpenClaim(claimType, new structs.Nfsv4OpenClaimPrevious(delegateType)); } case 2: { const delegateStateid = this.readStateid(); const file = xdr.readString(); return new structs.Nfsv4OpenClaim(claimType, new structs.Nfsv4OpenClaimDelegateCur(delegateStateid, file)); } case 3: { const file = xdr.readString(); return new structs.Nfsv4OpenClaim(claimType, new structs.Nfsv4OpenClaimDelegatePrev(file)); } default: throw new errors_1.Nfsv4DecodingError(`Unknown open claim type: ${claimType}`); } } readOpenHow() { const xdr = this.xdr; const opentype = xdr.readUnsignedInt(); if (opentype === 0 /* Nfsv4OpenFlags.OPEN4_NOCREATE */) return new structs.Nfsv4OpenHow(opentype); const mode = xdr.readUnsignedInt(); switch (mode) { case 0 /* Nfsv4CreateMode.UNCHECKED4 */: case 1 /* Nfsv4CreateMode.GUARDED4 */: { const createattrs = this.readFattr(); return new structs.Nfsv4OpenHow(opentype, new structs.Nfsv4CreateHow(mode, new structs.Nfsv4CreateAttrs(createattrs))); } case 2 /* Nfsv4CreateMode.EXCLUSIVE4 */: { const createverf = this.readVerifier(); return new structs.Nfsv4OpenHow(opentype, new structs.Nfsv4CreateHow(mode, new structs.Nfsv4CreateVerf(createverf))); } default: throw new errors_1.Nfsv4DecodingError(`Unknown create mode: ${mode}`); } } readOpenDelegation() { const xdr = this.xdr; const delegationType = xdr.readUnsignedInt(); switch (delegationType) { case 0 /* Nfsv4DelegType.OPEN_DELEGATE_NONE */: return new structs.Nfsv4OpenDelegation(delegationType); case 1 /* Nfsv4DelegType.OPEN_DELEGATE_READ */: { const stateid = this.readStateid(); const recall = xdr.readBoolean(); const aceCount = xdr.readUnsignedInt(); const permissions = []; for (let i = 0; i < aceCount; i++) { permissions.push(this.readAce()); } return new structs.Nfsv4OpenDelegation(delegationType, new structs.Nfsv4OpenReadDelegation(stateid, recall, permissions)); } case 2 /* Nfsv4DelegType.OPEN_DELEGATE_WRITE */: { const stateid = this.readStateid(); const recall = xdr.readBoolean(); const spaceLimit = xdr.readUnsignedHyper(); const aceCount = xdr.readUnsignedInt(); const permissions = []; for (let i = 0; i < aceCount; i++) { permissions.push(this.readAce()); } return new structs.Nfsv4OpenDelegation(delegationType, new structs.Nfsv4OpenWriteDelegation(stateid, recall, spaceLimit, permissions)); } default: throw new errors_1.Nfsv4DecodingError(`Unknown delegation type: ${delegationType}`); } } readAce() { const xdr = this.xdr; const type = xdr.readUnsignedInt(); const flag = xdr.readUnsignedInt(); const accessMask = xdr.readUnsignedInt(); const who = xdr.readString(); return new structs.Nfsv4Ace(type, flag, accessMask, who); } readSecInfoFlavor() { const xdr = this.xdr; const flavor = xdr.readUnsignedInt(); if (flavor === 6) { const oid = xdr.readVarlenOpaque(); const qop = xdr.readUnsignedInt(); const service = xdr.readUnsignedInt(); const flavorInfo = new structs.Nfsv4RpcSecGssInfo(oid, qop, service); return new structs.Nfsv4SecInfoFlavor(flavor, flavorInfo); } return new structs.Nfsv4SecInfoFlavor(flavor); } decodeAccessResponse() { const xdr = this.xdr; const status = xdr.readUnsignedInt(); if (status === 0) { const supported = xdr.readUnsignedInt(); const access = xdr.readUnsignedInt(); return new msg.Nfsv4AccessResponse(status, new msg.Nfsv4AccessResOk(supported, access)); } return new msg.Nfsv4AccessResponse(status); } decodeCloseResponse() { const status = this.xdr.readUnsignedInt(); if (status === 0) { const openStateid = this.readStateid(); return new msg.Nfsv4CloseResponse(status, new msg.Nfsv4CloseResOk(openStateid)); } return new msg.Nfsv4CloseResponse(status); } decodeCommitResponse() { const status = this.xdr.readUnsignedInt(); if (status === 0) { const writeverf = this.readVerifier(); return new msg.Nfsv4CommitResponse(status, new msg.Nfsv4CommitResOk(writeverf)); } return new msg.Nfsv4CommitResponse(status); } decodeCreateRequest() { const xdr = this.xdr; const type = xdr.readUnsignedInt(); let objtype; switch (type) { case 5 /* Nfsv4FType.NF4LNK */: { const linkdata = xdr.readString(); objtype = new structs.Nfsv4CreateType(type, new structs.Nfsv4CreateTypeLink(linkdata)); break; } case 3 /* Nfsv4FType.NF4BLK */: case 4 /* Nfsv4FType.NF4CHR */: { const specdata1 = xdr.readUnsignedInt(); const specdata2 = xdr.readUnsignedInt(); const devdata = new structs.Nfsv4SpecData(specdata1, specdata2); objtype = new structs.Nfsv4CreateType(type, new structs.Nfsv4CreateTypeDevice(devdata)); break; } default: { objtype = new structs.Nfsv4CreateType(type, new structs.Nfsv4CreateTypeVoid()); break; } } const objname = xdr.readString(); const createattrs = this.readFattr(); return new msg.Nfsv4CreateRequest(objtype, objname, createattrs); } decodeCreateResponse() { const status = this.xdr.readUnsignedInt(); if (status === 0) { const cinfo = this.readChangeInfo(); const attrset = this.readBitmap(); return new msg.Nfsv4CreateResponse(status, new msg.Nfsv4CreateResOk(cinfo, attrset)); } return new msg.Nfsv4CreateResponse(status); } decodeDelegpurgeResponse() { const status = this.xdr.readUnsignedInt(); return new msg.Nfsv4DelegpurgeResponse(status); } decodeDelegreturnResponse() { const status = this.xdr.readUnsignedInt(); return new msg.Nfsv4DelegreturnResponse(status); } decodeGetattrRequest() { const attrRequest = this.readBitmap(); return new msg.Nfsv4GetattrRequest(attrRequest); } decodeGetattrResponse() { const status = this.xdr.readUnsignedInt(); if (status === 0) { const objAttributes = this.readFattr(); return new msg.Nfsv4GetattrResponse(status, new msg.Nfsv4GetattrResOk(objAttributes)); } return new msg.Nfsv4GetattrResponse(status); } decodeGetfhRequest() { return new msg.Nfsv4GetfhRequest(); } decodeGetfhResponse() { const status = this.xdr.readUnsignedInt(); if (status === 0) { const object = this.readFh(); return new msg.Nfsv4GetfhResponse(status, new msg.Nfsv4GetfhResOk(object)); } return new msg.Nfsv4GetfhResponse(status); } decodeLinkRequest() { const newname = this.xdr.readString(); return new msg.Nfsv4LinkRequest(newname); } decodeLinkResponse() { const status = this.xdr.readUnsignedInt(); if (status === 0) { const cinfo = this.readChangeInfo(); return new msg.Nfsv4LinkResponse(status, new msg.Nfsv4LinkResOk(cinfo)); } return new msg.Nfsv4LinkResponse(status); } decodeLockRequest() { const xdr = this.xdr; const locktype = xdr.readUnsignedInt(); const reclaim = xdr.readBoolean(); const offset = xdr.readUnsignedHyper(); const length = xdr.readUnsignedHyper(); const locker = this.readLockOwnerInfo(); return new msg.Nfsv4LockRequest(locktype, reclaim, offset, length, locker); } decodeLockResponse() { const xdr = this.xdr; const status = xdr.readUnsignedInt(); if (status === 0) { const lockStateid = this.readStateid(); return new msg.Nfsv4LockResponse(status, new msg.Nfsv4LockResOk(lockStateid)); } else if (status === 10010) { const offset = xdr.readUnsignedHyper(); const length = xdr.readUnsignedHyper(); const locktype = xdr.readUnsignedInt(); const owner = this.readLockOwner(); return new msg.Nfsv4LockResponse(status, undefined, new msg.Nfsv4LockResDenied(offset, length, locktype, owner)); } return new msg.Nfsv4LockResponse(status); } decodeLocktRequest() { const xdr = this.xdr; const locktype = xdr.readUnsignedInt(); const offset = xdr.readUnsignedHyper(); const length = xdr.readUnsignedHyper(); const owner = this.readLockOwner(); return new msg.Nfsv4LocktRequest(locktype, offset, length, owner); } decodeLocktResponse() { const xdr = this.xdr; const status = xdr.readUnsignedInt(); if (status === 10010) { const offset = xdr.readUnsignedHyper(); const length = xdr.readUnsignedHyper(); const locktype = xdr.readUnsignedInt(); const owner = this.readLockOwner(); return new msg.Nfsv4LocktResponse(status, new msg.Nfsv4LocktResDenied(offset, length, locktype, owner)); } return new msg.Nfsv4LocktResponse(status); } decodeLockuRequest() { const xdr = this.xdr; const locktype = xdr.readUnsignedInt(); const seqid = xdr.readUnsignedInt(); const lockStateid = this.readStateid(); const offset = xdr.readUnsignedHyper(); const length = xdr.readUnsignedHyper(); return new msg.Nfsv4LockuRequest(locktype, seqid, lockStateid, offset, length); } decodeLockuResponse() { const status = this.xdr.readUnsignedInt(); if (status === 0) { const lockStateid = this.readStateid(); return new msg.Nfsv4LockuResponse(status, new msg.Nfsv4LockuResOk(lockStateid)); } return new msg.Nfsv4LockuResponse(status); } decodeLookupRequest() { const objname = this.xdr.readString(); return new msg.Nfsv4LookupRequest(objname); } decodeLookupResponse() { const status = this.xdr.readUnsignedInt(); return new msg.Nfsv4LookupResponse(status); } decodeLookuppRequest() { return new msg.Nfsv4LookuppRequest(); } decodeLookuppResponse() { const status = this.xdr.readUnsignedInt(); return new msg.Nfsv4LookuppResponse(status); } decodeNverifyRequest() { const objAttributes = this.readFattr(); return new msg.Nfsv4NverifyRequest(objAttributes); } decodeNverifyResponse() { const status = this.xdr.readUnsignedInt(); return new msg.Nfsv4NverifyResponse(status); } decodeOpenRequest() { const xdr = this.xdr; const seqid = xdr.readUnsignedInt(); const shareAccess = xdr.readUnsignedInt(); const shareDeny = xdr.readUnsignedInt(); const owner = this.readOpenOwner(); const openhow = this.readOpenHow(); const claim = this.readOpenClaim(); return new msg.Nfsv4OpenRequest(seqid, shareAccess, shareDeny, owner, openhow, claim); } decodeOpenResponse() { const xdr = this.xdr; const status = xdr.readUnsignedInt(); if (status === 0) { const stateid = this.readStateid(); const cinfo = this.readChangeInfo(); const rflags = xdr.readUnsignedInt(); const attrset = this.readBitmap(); const delegation = this.readOpenDelegation(); return new msg.Nfsv4OpenResponse(status, new msg.Nfsv4OpenResOk(stateid, cinfo, rflags, attrset, delegation)); } return new msg.Nfsv4OpenResponse(status); } decodeOpenattrRequest() { const createdir = this.xdr.readBoolean(); return new msg.Nfsv4OpenattrRequest(createdir); } decodeOpenattrResponse() { const status = this.xdr.readUnsignedInt(); return new msg.Nfsv4OpenattrResponse(status); } decodeOpenConfirmRequest() { const openStateid = this.readStateid(); const seqid = this.xdr.readUnsignedInt(); return new msg.Nfsv4OpenConfirmRequest(openStateid, seqid); } decodeOpenConfirmResponse() { const status = this.xdr.readUnsignedInt(); if (status === 0) { const openStateid = this.readStateid(); return new msg.Nfsv4OpenConfirmResponse(status, new msg.Nfsv4OpenConfirmResOk(openStateid)); } return new msg.Nfsv4OpenConfirmResponse(status); } decodeOpenDowngradeRequest() { const xdr = this.xdr; const openStateid = this.readStateid(); const seqid = xdr.readUnsignedInt(); const shareAccess = xdr.readUnsignedInt(); const shareDeny = xdr.readUnsignedInt(); return new msg.Nfsv4OpenDowngradeRequest(openStateid, seqid, shareAccess, shareDeny); } decodeOpenDowngradeResponse() { const status = this.xdr.readUnsignedInt(); if (status === 0) { const openStateid = this.readStateid(); return new msg.Nfsv4OpenDowngradeResponse(status, new msg.Nfsv4OpenDowngradeResOk(openStateid)); } return new msg.Nfsv4OpenDowngradeResponse(status); } decodePutfhRequest() { const object = this.readFh(); return new msg.Nfsv4PutfhRequest(object); } decodePutfhResponse() { const status = this.xdr.readUnsignedInt(); return new msg.Nfsv4PutfhResponse(status); } decodePutrootfhResponse() { const status = this.xdr.readUnsignedInt(); return new msg.Nfsv4PutrootfhResponse(status); } decodeReadRequest() { const xdr = this.xdr; const stateid = this.readStateid(); const offset = xdr.readUnsignedHyper(); const count = xdr.readUnsignedInt(); return new msg.Nfsv4ReadRequest(stateid, offset, count); } decodeReadResponse() { const xdr = this.xdr; const status = xdr.readUnsignedInt(); if (status === 0) { const eof = xdr.readBoolean(); const data = xdr.readVarlenOpaque(); return new msg.Nfsv4ReadResponse(status, new msg.Nfsv4ReadResOk(eof, data)); } return new msg.Nfsv4ReadResponse(status); } decodeReaddirRequest() { const xdr = this.xdr; const cookie = xdr.readUnsignedHyper(); const cookieverf = this.readVerifier(); const dircount = xdr.readUnsignedInt(); const maxcount = xdr.readUnsignedInt(); const attrRequest = this.readBitmap(); return new msg.Nfsv4ReaddirRequest(cookie, cookieverf, dircount, maxcount, attrRequest); } decodeReaddirResponse() { const xdr = this.xdr; const status = xdr.readUnsignedInt(); if (status === 0) { const cookieverf = this.readVerifier(); const entries = []; while (xdr.readBoolean()) { const cookie = xdr.readUnsignedHyper(); const name = xdr.readString(); const attrs = this.readFattr(); entries.push(new structs.Nfsv4Entry(cookie, name, attrs)); } const eof = xdr.readBoolean(); return new msg.Nfsv4ReaddirResponse(status, new msg.Nfsv4ReaddirResOk(cookieverf, entries, eof)); } return new msg.Nfsv4ReaddirResponse(status); } decodeReadlinkRequest() { return new msg.Nfsv4ReadlinkRequest(); } decodeReadlinkResponse() { const xdr = this.xdr; const status = xdr.readUnsignedInt(); if (status === 0) { const link = xdr.readString(); return new msg.Nfsv4ReadlinkResponse(status, new msg.Nfsv4ReadlinkResOk(link)); } return new msg.Nfsv4ReadlinkResponse(status); } decodeRemoveRequest() { const target = this.xdr.readString(); return new msg.Nfsv4RemoveRequest(target); } decodeRemoveResponse() { const status = this.xdr.readUnsignedInt(); if (status === 0) { const cinfo = this.readChangeInfo(); return new msg.Nfsv4RemoveResponse(status, new msg.Nfsv4RemoveResOk(cinfo)); } return new msg.Nfsv4RemoveResponse(status); } decodeRenameRequest() { const xdr = this.xdr; const oldname = xdr.readString(); const newname = xdr.readString(); return new msg.Nfsv4RenameRequest(oldname, newname); } decodeRenameResponse() { const xdr = this.xdr; const status = xdr.readUnsignedInt(); if (status === 0) { const sourceCinfo = this.readChangeInfo(); const targetCinfo = this.readChangeInfo(); return new msg.Nfsv4RenameResponse(status, new msg.Nfsv4RenameResOk(sourceCinfo, targetCinfo)); } return new msg.Nfsv4RenameResponse(status); } decodeRenewRequest() { const clientid = this.xdr.readUnsignedHyper(); return new msg.Nfsv4RenewRequest(clientid); } decodeRenewResponse() { const status = this.xdr.readUnsignedInt(); return new msg.Nfsv4RenewResponse(status); } decodeRestorefhRequest() { return new msg.Nfsv4RestorefhRequest(); } decodeRestorefhResponse() { const status = this.xdr.readUnsignedInt(); return new msg.Nfsv4RestorefhResponse(status); } decodeSavefhResponse() { const status = this.xdr.readUnsignedInt(); return new msg.Nfsv4SavefhResponse(status); } decodeSecinfoRequest() { const name = this.xdr.readString(); return new msg.Nfsv4SecinfoRequest(name); } decodeSecinfoResponse() { const xdr = this.xdr; const status = xdr.readUnsignedInt(); if (status === 0) { const count = xdr.readUnsignedInt(); const flavors = []; for (let i = 0; i < count; i++) flavors.push(this.readSecInfoFlavor()); return new msg.Nfsv4SecinfoResponse(status, new msg.Nfsv4SecinfoResOk(flavors)); } return new msg.Nfsv4SecinfoResponse(status); } decodeSetattrRequest() { const stateid = this.readStateid(); const objAttributes = this.readFattr(); return new msg.Nfsv4SetattrRequest(stateid, objAttributes); } decodeSetattrResponse() { const status = this.xdr.readUnsignedInt(); const attrset = this.readBitmap(); return new msg.Nfsv4SetattrResponse(status, new msg.Nfsv4SetattrResOk(attrset)); } decodeSetclientidRequest() { const client = this.readClientId(); const callback = this.readCbClient(); const callbackIdent = this.xdr.readUnsignedInt(); return new msg.Nfsv4SetclientidRequest(client, callback, callbackIdent); } decodeSetclientidResponse() { const xdr = this.xdr; const status = xdr.readUnsignedInt(); if (status === 0) { const clientid = xdr.readUnsignedHyper(); const setclientidConfirm = this.readVerifier(); return new msg.Nfsv4SetclientidResponse(status, new msg.Nfsv4SetclientidResOk(clientid, setclientidConfirm)); } return new msg.Nfsv4SetclientidResponse(status); } decodeSetclientidConfirmRequest() { const clientid = this.xdr.readUnsignedHyper(); const setclientidConfirm = this.readVerifier(); return new msg.Nfsv4SetclientidConfirmRequest(clientid, setclientidConfirm); } decodeSetclientidConfirmResponse() { const status = this.xdr.readUnsignedInt(); return new msg.Nfsv4SetclientidConfirmResponse(status); } decodeVerifyRequest() { const objAttributes = this.readFattr(); return new msg.Nfsv4VerifyRequest(objAttributes); } decodeVerifyResponse() { const status = this.xdr.readUnsignedInt(); return new msg.Nfsv4VerifyResponse(status); } decodeWriteRequest() { const xdr = this.xdr; const stateid = this.readStateid(); const offset = xdr.readUnsignedHyper(); const stable = xdr.readUnsignedInt(); const data = xdr.readVarlenOpaque(); return new msg.Nfsv4WriteRequest(stateid, offset, stable, data); } decodeWriteResponse() { const xdr = this.xdr; const status = xdr.readUnsignedInt(); if (status === 0) { const count = xdr.readUnsignedInt(); const committed = xdr.readUnsignedInt(); const writeverf = this.readVerifier(); return new msg.Nfsv4WriteResponse(status, new msg.Nfsv4WriteResOk(count, committed, writeverf)); } return new msg.Nfsv4WriteResponse(status); } decodeReleaseLockOwnerRequest() { const lockOwner = this.readLockOwner(); return new msg.Nfsv4ReleaseLockOwnerRequest(lockOwner); } decodeReleaseLockOwnerResponse() { const status = this.xdr.readUnsignedInt(); return new msg.Nfsv4ReleaseLockOwnerResponse(status); } decodeIllegalRequest() { return new msg.Nfsv4IllegalRequest(); } decodeIllegalResponse() { const status = this.xdr.readUnsignedInt(); return new msg.Nfsv4IllegalResponse(status); } decodeCbCompound(reader, isRequest) { this.xdr.reader = reader; const startPos = reader.x; try { if (isRequest) { return this.decodeCbCompoundRequest(); } else { return this.decodeCbCompoundResponse(); } } catch (err) { if (err instanceof RangeError) { reader.x = startPos; return undefined; } throw err; } } decodeCbCompoundRequest() { const xdr = this.xdr; const tag = xdr.readString(); const minorversion = xdr.readUnsignedInt(); const callbackIdent = xdr.readUnsignedInt(); const argarray = []; const count = xdr.readUnsignedInt(); for (let i = 0; i < count; i++) { const op = xdr.readUnsignedInt(); const request = this.decodeCbRequest(op); if (request) argarray.push(request); } return new msg.Nfsv4CbCompoundRequest(tag, minorversion, callbackIdent, argarray); } decodeCbCompoundResponse() { const xdr = this.xdr; const status = xdr.readUnsignedInt(); const tag = xdr.readString(); const resarray = []; const count = xdr.readUnsignedInt(); for (let i = 0; i < count; i++) { const op = xdr.readUnsignedInt(); const response = this.decodeCbResponse(op); if (response) resarray.push(response); } return new msg.Nfsv4CbCompoundResponse(status, tag, resarray); } decodeCbRequest(op) { switch (op) { case 3 /* Nfsv4CbOp.CB_GETATTR */: return this.decodeCbGetattrRequest(); case 4 /* Nfsv4CbOp.CB_RECALL */: return this.decodeCbRecallRequest(); case 10044 /* Nfsv4CbOp.CB_ILLEGAL */: return this.decodeCbIllegalRequest(); default: throw new errors_1.Nfsv4DecodingError(`Unknown callback operation: ${op}`); } } decodeCbResponse(op) { switch (op) { case 3 /* Nfsv4CbOp.CB_GETATTR */: return this.decodeCbGetattrResponse(); case 4 /* Nfsv4CbOp.CB_RECALL */: return this.decodeCbRecallResponse(); case 10044 /* Nfsv4CbOp.CB_ILLEGAL */: return this.decodeCbIllegalResponse(); default: throw new errors_1.Nfsv4DecodingError(`Unknown callback operation: ${op}`); } } decodeCbGetattrRequest() { const fh = this.readFh(); const attrRequest = this.readBitmap(); return new msg.Nfsv4CbGetattrRequest(fh, attrRequest); } decodeCbGetattrResponse() { const status = this.xdr.readUnsignedInt(); if (status === 0) { const objAttributes = this.readFattr(); return new msg.Nfsv4CbGetattrResponse(status, new msg.Nfsv4CbGetattrResOk(objAttributes)); } return new msg.Nfsv4CbGetattrResponse(status); } decodeCbRecallRequest() { const stateid = this.readStateid(); const truncate = this.xdr.readBoolean(); const fh = this.readFh(); return new msg.Nfsv4CbRecallRequest(stateid, truncate, fh); } decodeCbRecallResponse() { const status = this.xdr.readUnsignedInt(); return new msg.Nfsv4CbRecallResponse(status); } decodeCbIllegalRequest() { return new msg.Nfsv4CbIllegalRequest(); } decodeCbIllegalResponse() { const status = this.xdr.readUnsignedInt(); return new msg.Nfsv4CbIllegalResponse(status); } } exports.Nfsv4Decoder = Nfsv4Decoder; //# sourceMappingURL=Nfsv4Decoder.js.map