FullNfsv3Encoder.js 3.0 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273
  1. "use strict";
  2. Object.defineProperty(exports, "__esModule", { value: true });
  3. exports.FullNfsv3Encoder = void 0;
  4. const Writer_1 = require("@jsonjoy.com/util/lib/buffers/Writer");
  5. const Nfsv3Encoder_1 = require("./Nfsv3Encoder");
  6. const RpcMessageEncoder_1 = require("../../rpc/RpcMessageEncoder");
  7. const RmRecordEncoder_1 = require("../../rm/RmRecordEncoder");
  8. const MAX_SINGLE_FRAME_SIZE = 0x7fffffff;
  9. const RM_HEADER_SIZE = 4;
  10. class FullNfsv3Encoder {
  11. constructor(program = 100003, writer = new Writer_1.Writer()) {
  12. this.program = program;
  13. this.writer = writer;
  14. this.nfsEncoder = new Nfsv3Encoder_1.Nfsv3Encoder(writer);
  15. this.rpcEncoder = new RpcMessageEncoder_1.RpcMessageEncoder(writer);
  16. this.rmEncoder = new RmRecordEncoder_1.RmRecordEncoder(writer);
  17. }
  18. encodeCall(xid, proc, cred, verf, request) {
  19. this.writeCall(xid, proc, cred, verf, request);
  20. return this.writer.flush();
  21. }
  22. writeCall(xid, proc, cred, verf, request) {
  23. const writer = this.writer;
  24. const rmHeaderPosition = writer.x;
  25. writer.x += RM_HEADER_SIZE;
  26. this.rpcEncoder.writeCall(xid, 100003, 3, proc, cred, verf);
  27. this.nfsEncoder.writeMessage(request, proc, true);
  28. this.writeRmHeader(rmHeaderPosition, writer.x);
  29. }
  30. encodeAcceptedReply(xid, proc, verf, response) {
  31. this.writeAcceptedReply(xid, proc, verf, response);
  32. return this.writer.flush();
  33. }
  34. writeAcceptedReply(xid, proc, verf, response) {
  35. const writer = this.writer;
  36. const rmHeaderPosition = writer.x;
  37. writer.x += RM_HEADER_SIZE;
  38. this.rpcEncoder.writeAcceptedReply(xid, verf, 0);
  39. this.nfsEncoder.writeMessage(response, proc, false);
  40. this.writeRmHeader(rmHeaderPosition, writer.x);
  41. }
  42. encodeRejectedReply(xid, rejectStat, mismatchInfo, authStat) {
  43. this.writeRejectedReply(xid, rejectStat, mismatchInfo, authStat);
  44. return this.writer.flush();
  45. }
  46. writeRejectedReply(xid, rejectStat, mismatchInfo, authStat) {
  47. const writer = this.writer;
  48. const rmHeaderPosition = writer.x;
  49. writer.x += RM_HEADER_SIZE;
  50. this.rpcEncoder.writeRejectedReply(xid, rejectStat, mismatchInfo, authStat);
  51. this.writeRmHeader(rmHeaderPosition, writer.x);
  52. }
  53. writeRmHeader(rmHeaderPosition, endPosition) {
  54. const writer = this.writer;
  55. const rmEncoder = this.rmEncoder;
  56. const totalSize = endPosition - rmHeaderPosition - RM_HEADER_SIZE;
  57. if (totalSize <= MAX_SINGLE_FRAME_SIZE) {
  58. const currentX = writer.x;
  59. writer.x = rmHeaderPosition;
  60. rmEncoder.writeHdr(1, totalSize);
  61. writer.x = currentX;
  62. }
  63. else {
  64. const currentX = writer.x;
  65. writer.x = rmHeaderPosition;
  66. const data = writer.uint8.subarray(rmHeaderPosition + RM_HEADER_SIZE, currentX);
  67. writer.reset();
  68. rmEncoder.writeRecord(data);
  69. }
  70. }
  71. }
  72. exports.FullNfsv3Encoder = FullNfsv3Encoder;
  73. //# sourceMappingURL=FullNfsv3Encoder.js.map