MsgPackDecoderFast.js 6.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182
  1. "use strict";
  2. Object.defineProperty(exports, "__esModule", { value: true });
  3. exports.MsgPackDecoderFast = void 0;
  4. const tslib_1 = require("tslib");
  5. const JsonPackExtension_1 = require("../JsonPackExtension");
  6. const Reader_1 = require("@jsonjoy.com/util/lib/buffers/Reader");
  7. const sharedCachedUtf8Decoder_1 = tslib_1.__importDefault(require("@jsonjoy.com/util/lib/buffers/utf8/sharedCachedUtf8Decoder"));
  8. class MsgPackDecoderFast {
  9. constructor(reader = new Reader_1.Reader(), keyDecoder = sharedCachedUtf8Decoder_1.default) {
  10. this.reader = reader;
  11. this.keyDecoder = keyDecoder;
  12. }
  13. decode(uint8) {
  14. this.reader.reset(uint8);
  15. return this.val();
  16. }
  17. read(uint8) {
  18. this.reader.reset(uint8);
  19. return this.val();
  20. }
  21. val() {
  22. const reader = this.reader;
  23. const byte = reader.u8();
  24. if (byte >= 0xe0)
  25. return byte - 0x100;
  26. if (byte <= 0xbf) {
  27. if (byte < 0x90) {
  28. if (byte <= 0b1111111)
  29. return byte;
  30. return this.obj(byte & 0b1111);
  31. }
  32. else {
  33. if (byte < 0xa0)
  34. return this.arr(byte & 0b1111);
  35. else
  36. return reader.utf8(byte & 0b11111);
  37. }
  38. }
  39. if (byte <= 0xd0) {
  40. if (byte <= 0xc8) {
  41. if (byte <= 0xc4) {
  42. if (byte <= 0xc2)
  43. return byte === 0xc2 ? false : byte === 0xc0 ? null : undefined;
  44. else
  45. return byte === 0xc4 ? reader.buf(reader.u8()) : true;
  46. }
  47. else {
  48. if (byte <= 0xc6)
  49. return byte === 0xc6 ? reader.buf(reader.u32()) : reader.buf(reader.u16());
  50. else
  51. return byte === 0xc8 ? this.ext(reader.u16()) : this.ext(reader.u8());
  52. }
  53. }
  54. else {
  55. return byte <= 0xcc
  56. ? byte <= 0xca
  57. ? byte === 0xca
  58. ? reader.f32()
  59. : this.ext(reader.u32())
  60. : byte === 0xcc
  61. ? reader.u8()
  62. : reader.f64()
  63. : byte <= 0xce
  64. ? byte === 0xce
  65. ? reader.u32()
  66. : reader.u16()
  67. : byte === 0xd0
  68. ? reader.i8()
  69. : reader.u32() * 4294967296 + reader.u32();
  70. }
  71. }
  72. else if (byte <= 0xd8) {
  73. return byte <= 0xd4
  74. ? byte <= 0xd2
  75. ? byte === 0xd2
  76. ? reader.i32()
  77. : reader.i16()
  78. : byte === 0xd4
  79. ? this.ext(1)
  80. : reader.i32() * 4294967296 + reader.u32()
  81. : byte <= 0xd6
  82. ? byte === 0xd6
  83. ? this.ext(4)
  84. : this.ext(2)
  85. : byte === 0xd8
  86. ? this.ext(16)
  87. : this.ext(8);
  88. }
  89. else {
  90. switch (byte) {
  91. case 0xd9:
  92. return reader.utf8(reader.u8());
  93. case 0xda:
  94. return reader.utf8(reader.u16());
  95. case 0xdb:
  96. return reader.utf8(reader.u32());
  97. case 0xdc:
  98. return this.arr(reader.u16());
  99. case 0xdd:
  100. return this.arr(reader.u32());
  101. case 0xde:
  102. return this.obj(reader.u16());
  103. case 0xdf:
  104. return this.obj(reader.u32());
  105. }
  106. }
  107. return undefined;
  108. }
  109. str() {
  110. const reader = this.reader;
  111. const byte = reader.u8();
  112. if (byte >> 5 === 0b101)
  113. return reader.utf8(byte & 0b11111);
  114. switch (byte) {
  115. case 0xd9:
  116. return reader.utf8(reader.u8());
  117. case 0xda:
  118. return reader.utf8(reader.u16());
  119. case 0xdb:
  120. return reader.utf8(reader.u32());
  121. }
  122. return undefined;
  123. }
  124. obj(size) {
  125. const obj = {};
  126. for (let i = 0; i < size; i++) {
  127. const key = this.key();
  128. if (key === '__proto__')
  129. throw 6;
  130. obj[key] = this.val();
  131. }
  132. return obj;
  133. }
  134. key() {
  135. const reader = this.reader;
  136. const byte = reader.view.getUint8(reader.x);
  137. if (byte >= 0b10100000 && byte <= 0b10111111) {
  138. const size = byte & 0b11111;
  139. const key = this.keyDecoder.decode(reader.uint8, reader.x + 1, size);
  140. reader.x += 1 + size;
  141. return key;
  142. }
  143. else if (byte === 0xd9) {
  144. const size = reader.view.getUint8(reader.x + 1);
  145. if (size < 32) {
  146. const key = this.keyDecoder.decode(reader.uint8, reader.x + 2, size);
  147. reader.x += 2 + size;
  148. return key;
  149. }
  150. }
  151. reader.x++;
  152. switch (byte) {
  153. case 0xd9:
  154. return reader.utf8(reader.u8());
  155. case 0xda:
  156. return reader.utf8(reader.u16());
  157. case 0xdb:
  158. return reader.utf8(reader.u32());
  159. default:
  160. return '';
  161. }
  162. }
  163. arr(size) {
  164. const arr = [];
  165. for (let i = 0; i < size; i++)
  166. arr.push(this.val());
  167. return arr;
  168. }
  169. ext(size) {
  170. const reader = this.reader;
  171. const type = reader.u8();
  172. const end = reader.x + size;
  173. const buf = reader.uint8.subarray(reader.x, end);
  174. reader.x = end;
  175. return new JsonPackExtension_1.JsonPackExtension(type, buf);
  176. }
  177. back(bytes) {
  178. this.reader.x -= bytes;
  179. }
  180. }
  181. exports.MsgPackDecoderFast = MsgPackDecoderFast;
  182. //# sourceMappingURL=MsgPackDecoderFast.js.map