RpcMessageEncoder.js 5.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152
  1. "use strict";
  2. Object.defineProperty(exports, "__esModule", { value: true });
  3. exports.RpcMessageEncoder = void 0;
  4. const Writer_1 = require("@jsonjoy.com/util/lib/buffers/Writer");
  5. const Reader_1 = require("@jsonjoy.com/buffers/lib/Reader");
  6. const constants_1 = require("./constants");
  7. const errors_1 = require("./errors");
  8. const messages_1 = require("./messages");
  9. class RpcMessageEncoder {
  10. constructor(writer = new Writer_1.Writer()) {
  11. this.writer = writer;
  12. }
  13. encodeCall(xid, prog, vers, proc, cred, verf, params) {
  14. this.writeCall(xid, prog, vers, proc, cred, verf, params);
  15. return this.writer.flush();
  16. }
  17. encodeAcceptedReply(xid, verf, acceptStat, mismatchInfo, results) {
  18. this.writeAcceptedReply(xid, verf, acceptStat, mismatchInfo, results);
  19. return this.writer.flush();
  20. }
  21. encodeRejectedReply(xid, rejectStat, mismatchInfo, authStat) {
  22. this.writeRejectedReply(xid, rejectStat, mismatchInfo, authStat);
  23. return this.writer.flush();
  24. }
  25. encodeMessage(msg) {
  26. this.writeMessage(msg);
  27. return this.writer.flush();
  28. }
  29. writeMessage(msg) {
  30. if (msg instanceof messages_1.RpcCallMessage) {
  31. this.writeCall(msg.xid, msg.prog, msg.vers, msg.proc, msg.cred, msg.verf, msg.params);
  32. }
  33. else if (msg instanceof messages_1.RpcAcceptedReplyMessage) {
  34. this.writeAcceptedReply(msg.xid, msg.verf, msg.stat, msg.mismatchInfo, msg.results);
  35. }
  36. else if (msg instanceof messages_1.RpcRejectedReplyMessage) {
  37. this.writeRejectedReply(msg.xid, msg.stat, msg.mismatchInfo, msg.authStat);
  38. }
  39. }
  40. writeCall(xid, prog, vers, proc, cred, verf, params) {
  41. const writer = this.writer;
  42. writer.ensureCapacity(16 * 4);
  43. const view = writer.view;
  44. let x = writer.x;
  45. view.setUint32(x, xid, false);
  46. x += 4;
  47. view.setUint32(x, 0, false);
  48. x += 4;
  49. view.setUint32(x, constants_1.RPC_VERSION, false);
  50. x += 4;
  51. view.setUint32(x, prog, false);
  52. x += 4;
  53. view.setUint32(x, vers, false);
  54. x += 4;
  55. view.setUint32(x, proc, false);
  56. x += 4;
  57. writer.x = x;
  58. this.writeOpaqueAuth(cred);
  59. this.writeOpaqueAuth(verf);
  60. if (params instanceof Uint8Array) {
  61. if (params.length > 0)
  62. writer.buf(params, params.length);
  63. }
  64. else if (params instanceof Reader_1.Reader) {
  65. const size = params.size();
  66. if (size > 0)
  67. writer.buf(params.subarray(0, size), size);
  68. }
  69. }
  70. writeAcceptedReply(xid, verf, acceptStat, mismatchInfo, results) {
  71. const writer = this.writer;
  72. writer.ensureCapacity(16 * 4);
  73. const view = writer.view;
  74. let x = writer.x;
  75. view.setUint32(x, xid, false);
  76. x += 4;
  77. view.setUint32(x, 1, false);
  78. x += 4;
  79. view.setUint32(x, 0, false);
  80. x += 4;
  81. writer.x = x;
  82. this.writeOpaqueAuth(verf);
  83. writer.u32(acceptStat);
  84. if (mismatchInfo) {
  85. writer.u32(mismatchInfo.low);
  86. writer.u32(mismatchInfo.high);
  87. }
  88. if (results) {
  89. if (results instanceof Uint8Array) {
  90. if (results.length > 0)
  91. writer.buf(results, results.length);
  92. }
  93. else {
  94. const size = results.size();
  95. if (size > 0)
  96. writer.buf(results.uint8, size);
  97. }
  98. }
  99. }
  100. writeRejectedReply(xid, rejectStat, mismatchInfo, authStat) {
  101. const writer = this.writer;
  102. writer.ensureCapacity(7 * 4);
  103. const view = writer.view;
  104. let x = writer.x;
  105. view.setUint32(x, xid, false);
  106. x += 4;
  107. view.setUint32(x, 1, false);
  108. x += 4;
  109. view.setUint32(x, 1, false);
  110. x += 4;
  111. view.setUint32(x, rejectStat, false);
  112. x += 4;
  113. if (mismatchInfo) {
  114. view.setUint32(x, mismatchInfo.low, false);
  115. x += 4;
  116. view.setUint32(x, mismatchInfo.high, false);
  117. x += 4;
  118. }
  119. if (authStat !== undefined) {
  120. view.setUint32(x, authStat, false);
  121. x += 4;
  122. }
  123. writer.x = x;
  124. }
  125. writeOpaqueAuth(auth) {
  126. const writer = this.writer;
  127. const body = auth.body;
  128. const length = body.size();
  129. if (length > 400)
  130. throw new errors_1.RpcEncodingError('Auth body too large');
  131. writer.ensureCapacity(2 * 4 + length + 3);
  132. const view = writer.view;
  133. let x = writer.x;
  134. view.setUint32(x, auth.flavor, false);
  135. x += 4;
  136. view.setUint32(x, length, false);
  137. x += 4;
  138. if (length > 0) {
  139. writer.x = x;
  140. writer.buf(body.subarray(0, length), length);
  141. x = writer.x;
  142. const padding = (4 - (length % 4)) % 4;
  143. for (let i = 0; i < padding; i++) {
  144. view.setUint8(x, 0);
  145. x += 1;
  146. }
  147. }
  148. writer.x = x;
  149. }
  150. }
  151. exports.RpcMessageEncoder = RpcMessageEncoder;
  152. //# sourceMappingURL=RpcMessageEncoder.js.map