MsgPackDecoderFast.js 6.1 KB

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