CborDecoderBase.js 10 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340
  1. "use strict";
  2. Object.defineProperty(exports, "__esModule", { value: true });
  3. exports.CborDecoderBase = void 0;
  4. const tslib_1 = require("tslib");
  5. const f16_1 = require("@jsonjoy.com/util/lib/buffers/f16");
  6. const JsonPackExtension_1 = require("../JsonPackExtension");
  7. const JsonPackValue_1 = require("../JsonPackValue");
  8. const Reader_1 = require("@jsonjoy.com/util/lib/buffers/Reader");
  9. const sharedCachedUtf8Decoder_1 = tslib_1.__importDefault(require("@jsonjoy.com/util/lib/buffers/utf8/sharedCachedUtf8Decoder"));
  10. class CborDecoderBase {
  11. constructor(reader = new Reader_1.Reader(), keyDecoder = sharedCachedUtf8Decoder_1.default) {
  12. this.reader = reader;
  13. this.keyDecoder = keyDecoder;
  14. }
  15. read(uint8) {
  16. this.reader.reset(uint8);
  17. return this.val();
  18. }
  19. decode(uint8) {
  20. this.reader.reset(uint8);
  21. return this.val();
  22. }
  23. val() {
  24. const reader = this.reader;
  25. const octet = reader.u8();
  26. const major = octet >> 5;
  27. const minor = octet & 31;
  28. if (major < 4) {
  29. if (major < 2)
  30. return major === 0 ? this.readUint(minor) : this.readNint(minor);
  31. else
  32. return major === 2 ? this.readBin(minor) : this.readStr(minor);
  33. }
  34. else {
  35. if (major < 6)
  36. return major === 4 ? this.readArr(minor) : this.readObj(minor);
  37. else
  38. return major === 6 ? this.readTag(minor) : this.readTkn(minor);
  39. }
  40. }
  41. readAnyRaw(octet) {
  42. const major = octet >> 5;
  43. const minor = octet & 31;
  44. if (major < 4) {
  45. if (major < 2)
  46. return major === 0 ? this.readUint(minor) : this.readNint(minor);
  47. else
  48. return major === 2 ? this.readBin(minor) : this.readStr(minor);
  49. }
  50. else {
  51. if (major < 6)
  52. return major === 4 ? this.readArr(minor) : this.readObj(minor);
  53. else
  54. return major === 6 ? this.readTag(minor) : this.readTkn(minor);
  55. }
  56. }
  57. readMinorLen(minor) {
  58. if (minor < 24)
  59. return minor;
  60. switch (minor) {
  61. case 24:
  62. return this.reader.u8();
  63. case 25:
  64. return this.reader.u16();
  65. case 26:
  66. return this.reader.u32();
  67. case 27:
  68. return Number(this.reader.u64());
  69. case 31:
  70. return -1;
  71. default:
  72. throw 1;
  73. }
  74. }
  75. readUint(minor) {
  76. if (minor < 25) {
  77. return minor === 24 ? this.reader.u8() : minor;
  78. }
  79. else {
  80. if (minor < 27) {
  81. return minor === 25 ? this.reader.u16() : this.reader.u32();
  82. }
  83. else {
  84. const num = this.reader.u64();
  85. return num > 9007199254740991 ? num : Number(num);
  86. }
  87. }
  88. }
  89. readNint(minor) {
  90. if (minor < 25) {
  91. return minor === 24 ? -this.reader.u8() - 1 : -minor - 1;
  92. }
  93. else {
  94. if (minor < 27) {
  95. return minor === 25 ? -this.reader.u16() - 1 : -this.reader.u32() - 1;
  96. }
  97. else {
  98. const num = this.reader.u64();
  99. return num > 9007199254740991 - 1 ? -num - BigInt(1) : -Number(num) - 1;
  100. }
  101. }
  102. }
  103. readBin(minor) {
  104. const reader = this.reader;
  105. if (minor <= 23)
  106. return reader.buf(minor);
  107. switch (minor) {
  108. case 24:
  109. return reader.buf(reader.u8());
  110. case 25:
  111. return reader.buf(reader.u16());
  112. case 26:
  113. return reader.buf(reader.u32());
  114. case 27:
  115. return reader.buf(Number(reader.u64()));
  116. case 31: {
  117. let size = 0;
  118. const list = [];
  119. while (this.reader.peak() !== 255) {
  120. const uint8 = this.readBinChunk();
  121. size += uint8.length;
  122. list.push(uint8);
  123. }
  124. this.reader.x++;
  125. const res = new Uint8Array(size);
  126. let offset = 0;
  127. const length = list.length;
  128. for (let i = 0; i < length; i++) {
  129. const arr = list[i];
  130. res.set(arr, offset);
  131. offset += arr.length;
  132. }
  133. return res;
  134. }
  135. default:
  136. throw 1;
  137. }
  138. }
  139. readBinChunk() {
  140. const octet = this.reader.u8();
  141. const major = octet >> 5;
  142. const minor = octet & 31;
  143. if (major !== 2)
  144. throw 2;
  145. if (minor > 27)
  146. throw 3;
  147. return this.readBin(minor);
  148. }
  149. readAsStr() {
  150. const reader = this.reader;
  151. const octet = reader.u8();
  152. const major = octet >> 5;
  153. const minor = octet & 31;
  154. if (major !== 3)
  155. throw 11;
  156. return this.readStr(minor);
  157. }
  158. readStr(minor) {
  159. const reader = this.reader;
  160. if (minor <= 23)
  161. return reader.utf8(minor);
  162. switch (minor) {
  163. case 24:
  164. return reader.utf8(reader.u8());
  165. case 25:
  166. return reader.utf8(reader.u16());
  167. case 26:
  168. return reader.utf8(reader.u32());
  169. case 27:
  170. return reader.utf8(Number(reader.u64()));
  171. case 31: {
  172. let str = '';
  173. while (reader.peak() !== 255)
  174. str += this.readStrChunk();
  175. this.reader.x++;
  176. return str;
  177. }
  178. default:
  179. throw 1;
  180. }
  181. }
  182. readStrLen(minor) {
  183. if (minor <= 23)
  184. return minor;
  185. switch (minor) {
  186. case 24:
  187. return this.reader.u8();
  188. case 25:
  189. return this.reader.u16();
  190. case 26:
  191. return this.reader.u32();
  192. case 27:
  193. return Number(this.reader.u64());
  194. default:
  195. throw 1;
  196. }
  197. }
  198. readStrChunk() {
  199. const octet = this.reader.u8();
  200. const major = octet >> 5;
  201. const minor = octet & 31;
  202. if (major !== 3)
  203. throw 4;
  204. if (minor > 27)
  205. throw 5;
  206. return this.readStr(minor);
  207. }
  208. readArr(minor) {
  209. const length = this.readMinorLen(minor);
  210. if (length >= 0)
  211. return this.readArrRaw(length);
  212. return this.readArrIndef();
  213. }
  214. readArrRaw(length) {
  215. const arr = [];
  216. for (let i = 0; i < length; i++)
  217. arr.push(this.val());
  218. return arr;
  219. }
  220. readArrIndef() {
  221. const arr = [];
  222. while (this.reader.peak() !== 255)
  223. arr.push(this.val());
  224. this.reader.x++;
  225. return arr;
  226. }
  227. readObj(minor) {
  228. if (minor < 28) {
  229. let length = minor;
  230. switch (minor) {
  231. case 24:
  232. length = this.reader.u8();
  233. break;
  234. case 25:
  235. length = this.reader.u16();
  236. break;
  237. case 26:
  238. length = this.reader.u32();
  239. break;
  240. case 27:
  241. length = Number(this.reader.u64());
  242. break;
  243. }
  244. const obj = {};
  245. for (let i = 0; i < length; i++) {
  246. const key = this.key();
  247. if (key === '__proto__')
  248. throw 6;
  249. const value = this.val();
  250. obj[key] = value;
  251. }
  252. return obj;
  253. }
  254. else if (minor === 31)
  255. return this.readObjIndef();
  256. else
  257. throw 1;
  258. }
  259. readObjRaw(length) {
  260. const obj = {};
  261. for (let i = 0; i < length; i++) {
  262. const key = this.key();
  263. const value = this.val();
  264. obj[key] = value;
  265. }
  266. return obj;
  267. }
  268. readObjIndef() {
  269. const obj = {};
  270. while (this.reader.peak() !== 255) {
  271. const key = this.key();
  272. if (this.reader.peak() === 255)
  273. throw 7;
  274. const value = this.val();
  275. obj[key] = value;
  276. }
  277. this.reader.x++;
  278. return obj;
  279. }
  280. key() {
  281. const octet = this.reader.u8();
  282. const major = octet >> 5;
  283. const minor = octet & 31;
  284. if (major !== 3)
  285. return String(this.readAnyRaw(octet));
  286. const length = this.readStrLen(minor);
  287. if (length > 31)
  288. return this.reader.utf8(length);
  289. const key = this.keyDecoder.decode(this.reader.uint8, this.reader.x, length);
  290. this.reader.skip(length);
  291. return key;
  292. }
  293. readTag(minor) {
  294. if (minor <= 23)
  295. return this.readTagRaw(minor);
  296. switch (minor) {
  297. case 24:
  298. return this.readTagRaw(this.reader.u8());
  299. case 25:
  300. return this.readTagRaw(this.reader.u16());
  301. case 26:
  302. return this.readTagRaw(this.reader.u32());
  303. case 27:
  304. return this.readTagRaw(Number(this.reader.u64()));
  305. default:
  306. throw 1;
  307. }
  308. }
  309. readTagRaw(tag) {
  310. return new JsonPackExtension_1.JsonPackExtension(tag, this.val());
  311. }
  312. readTkn(minor) {
  313. switch (minor) {
  314. case 0xf4 & 31:
  315. return false;
  316. case 0xf5 & 31:
  317. return true;
  318. case 0xf6 & 31:
  319. return null;
  320. case 0xf7 & 31:
  321. return undefined;
  322. case 0xf8 & 31:
  323. return new JsonPackValue_1.JsonPackValue(this.reader.u8());
  324. case 0xf9 & 31:
  325. return this.f16();
  326. case 0xfa & 31:
  327. return this.reader.f32();
  328. case 0xfb & 31:
  329. return this.reader.f64();
  330. }
  331. if (minor <= 23)
  332. return new JsonPackValue_1.JsonPackValue(minor);
  333. throw 1;
  334. }
  335. f16() {
  336. return (0, f16_1.decodeF16)(this.reader.u16());
  337. }
  338. }
  339. exports.CborDecoderBase = CborDecoderBase;
  340. //# sourceMappingURL=CborDecoderBase.js.map