CborDecoder.js 9.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356
  1. "use strict";
  2. Object.defineProperty(exports, "__esModule", { value: true });
  3. exports.CborDecoder = void 0;
  4. const CborDecoderBase_1 = require("./CborDecoderBase");
  5. const JsonPackValue_1 = require("../JsonPackValue");
  6. class CborDecoder extends CborDecoderBase_1.CborDecoderBase {
  7. readAsMap() {
  8. const octet = this.reader.u8();
  9. const major = octet >> 5;
  10. const minor = octet & 31;
  11. switch (major) {
  12. case 5:
  13. return this.readMap(minor);
  14. default:
  15. throw 0;
  16. }
  17. }
  18. readMap(minor) {
  19. const length = this.readMinorLen(minor);
  20. if (length >= 0)
  21. return this.readMapRaw(length);
  22. else
  23. return this.readMapIndef();
  24. }
  25. readMapRaw(length) {
  26. const map = new Map();
  27. for (let i = 0; i < length; i++) {
  28. const key = this.val();
  29. const value = this.val();
  30. map.set(key, value);
  31. }
  32. return map;
  33. }
  34. readMapIndef() {
  35. const map = new Map();
  36. while (this.reader.peak() !== 255) {
  37. const key = this.val();
  38. if (this.reader.peak() === 255)
  39. throw 7;
  40. const value = this.val();
  41. map.set(key, value);
  42. }
  43. this.reader.x++;
  44. return map;
  45. }
  46. skipN(n) {
  47. for (let i = 0; i < n; i++)
  48. this.skipAny();
  49. }
  50. skipAny() {
  51. this.skipAnyRaw(this.reader.u8());
  52. }
  53. skipAnyRaw(octet) {
  54. const major = octet >> 5;
  55. const minor = octet & 31;
  56. switch (major) {
  57. case 0:
  58. case 1:
  59. this.skipUNint(minor);
  60. break;
  61. case 2:
  62. this.skipBin(minor);
  63. break;
  64. case 3:
  65. this.skipStr(minor);
  66. break;
  67. case 4:
  68. this.skipArr(minor);
  69. break;
  70. case 5:
  71. this.skipObj(minor);
  72. break;
  73. case 7:
  74. this.skipTkn(minor);
  75. break;
  76. case 6:
  77. this.skipTag(minor);
  78. break;
  79. }
  80. }
  81. skipMinorLen(minor) {
  82. if (minor <= 23)
  83. return minor;
  84. switch (minor) {
  85. case 24:
  86. return this.reader.u8();
  87. case 25:
  88. return this.reader.u16();
  89. case 26:
  90. return this.reader.u32();
  91. case 27:
  92. return Number(this.reader.u64());
  93. case 31:
  94. return -1;
  95. default:
  96. throw 1;
  97. }
  98. }
  99. skipUNint(minor) {
  100. if (minor <= 23)
  101. return;
  102. switch (minor) {
  103. case 24:
  104. return this.reader.skip(1);
  105. case 25:
  106. return this.reader.skip(2);
  107. case 26:
  108. return this.reader.skip(4);
  109. case 27:
  110. return this.reader.skip(8);
  111. default:
  112. throw 1;
  113. }
  114. }
  115. skipBin(minor) {
  116. const length = this.skipMinorLen(minor);
  117. if (length >= 0)
  118. this.reader.skip(length);
  119. else {
  120. while (this.reader.peak() !== 255)
  121. this.skipBinChunk();
  122. this.reader.x++;
  123. }
  124. }
  125. skipBinChunk() {
  126. const octet = this.reader.u8();
  127. const major = octet >> 5;
  128. const minor = octet & 31;
  129. if (major !== 2)
  130. throw 2;
  131. if (minor > 27)
  132. throw 3;
  133. this.skipBin(minor);
  134. }
  135. skipStr(minor) {
  136. const length = this.skipMinorLen(minor);
  137. if (length >= 0)
  138. this.reader.skip(length);
  139. else {
  140. while (this.reader.peak() !== 255)
  141. this.skipStrChunk();
  142. this.reader.x++;
  143. }
  144. }
  145. skipStrChunk() {
  146. const octet = this.reader.u8();
  147. const major = octet >> 5;
  148. const minor = octet & 31;
  149. if (major !== 3)
  150. throw 4;
  151. if (minor > 27)
  152. throw 5;
  153. this.skipStr(minor);
  154. }
  155. skipArr(minor) {
  156. const length = this.skipMinorLen(minor);
  157. if (length >= 0)
  158. this.skipN(length);
  159. else {
  160. while (this.reader.peak() !== 255)
  161. this.skipAny();
  162. this.reader.x++;
  163. }
  164. }
  165. skipObj(minor) {
  166. const length = this.readMinorLen(minor);
  167. if (length >= 0)
  168. return this.skipN(length * 2);
  169. else {
  170. while (this.reader.peak() !== 255) {
  171. this.skipAny();
  172. if (this.reader.peak() === 255)
  173. throw 7;
  174. this.skipAny();
  175. }
  176. this.reader.x++;
  177. }
  178. }
  179. skipTag(minor) {
  180. const length = this.skipMinorLen(minor);
  181. if (length < 0)
  182. throw 1;
  183. this.skipAny();
  184. }
  185. skipTkn(minor) {
  186. switch (minor) {
  187. case 0xf8 & 31:
  188. this.reader.skip(1);
  189. return;
  190. case 0xf9 & 31:
  191. this.reader.skip(2);
  192. return;
  193. case 0xfa & 31:
  194. this.reader.skip(4);
  195. return;
  196. case 0xfb & 31:
  197. this.reader.skip(8);
  198. return;
  199. }
  200. if (minor <= 23)
  201. return;
  202. throw 1;
  203. }
  204. validate(value, offset = 0, size = value.length) {
  205. this.reader.reset(value);
  206. this.reader.x = offset;
  207. const start = offset;
  208. this.skipAny();
  209. const end = this.reader.x;
  210. if (end - start !== size)
  211. throw 8;
  212. }
  213. decodeLevel(value) {
  214. this.reader.reset(value);
  215. return this.readLevel();
  216. }
  217. readLevel() {
  218. const octet = this.reader.u8();
  219. const major = octet >> 5;
  220. const minor = octet & 31;
  221. switch (major) {
  222. case 4:
  223. return this.readArrLevel(minor);
  224. case 5:
  225. return this.readObjLevel(minor);
  226. default:
  227. return super.readAnyRaw(octet);
  228. }
  229. }
  230. readPrimitiveOrVal() {
  231. const octet = this.reader.peak();
  232. const major = octet >> 5;
  233. switch (major) {
  234. case 4:
  235. case 5:
  236. return this.readAsValue();
  237. default:
  238. return this.val();
  239. }
  240. }
  241. readAsValue() {
  242. const reader = this.reader;
  243. const start = reader.x;
  244. this.skipAny();
  245. const end = reader.x;
  246. return new JsonPackValue_1.JsonPackValue(reader.uint8.subarray(start, end));
  247. }
  248. readObjLevel(minor) {
  249. const length = this.readMinorLen(minor);
  250. if (length >= 0)
  251. return this.readObjRawLevel(length);
  252. else
  253. return this.readObjIndefLevel();
  254. }
  255. readObjRawLevel(length) {
  256. const obj = {};
  257. for (let i = 0; i < length; i++) {
  258. const key = this.key();
  259. const value = this.readPrimitiveOrVal();
  260. obj[key] = value;
  261. }
  262. return obj;
  263. }
  264. readObjIndefLevel() {
  265. const obj = {};
  266. while (this.reader.peak() !== 255) {
  267. const key = this.key();
  268. if (this.reader.peak() === 255)
  269. throw 7;
  270. const value = this.readPrimitiveOrVal();
  271. obj[key] = value;
  272. }
  273. this.reader.x++;
  274. return obj;
  275. }
  276. readArrLevel(minor) {
  277. const length = this.readMinorLen(minor);
  278. if (length >= 0)
  279. return this.readArrRawLevel(length);
  280. return this.readArrIndefLevel();
  281. }
  282. readArrRawLevel(length) {
  283. const arr = [];
  284. for (let i = 0; i < length; i++)
  285. arr.push(this.readPrimitiveOrVal());
  286. return arr;
  287. }
  288. readArrIndefLevel() {
  289. const arr = [];
  290. while (this.reader.peak() !== 255)
  291. arr.push(this.readPrimitiveOrVal());
  292. this.reader.x++;
  293. return arr;
  294. }
  295. readHdr(expectedMajor) {
  296. const octet = this.reader.u8();
  297. const major = octet >> 5;
  298. if (major !== expectedMajor)
  299. throw 0;
  300. const minor = octet & 31;
  301. if (minor < 24)
  302. return minor;
  303. switch (minor) {
  304. case 24:
  305. return this.reader.u8();
  306. case 25:
  307. return this.reader.u16();
  308. case 26:
  309. return this.reader.u32();
  310. case 27:
  311. return Number(this.reader.u64());
  312. case 31:
  313. return -1;
  314. }
  315. throw 1;
  316. }
  317. readStrHdr() {
  318. return this.readHdr(3);
  319. }
  320. readObjHdr() {
  321. return this.readHdr(5);
  322. }
  323. readArrHdr() {
  324. return this.readHdr(4);
  325. }
  326. findKey(key) {
  327. const size = this.readObjHdr();
  328. for (let i = 0; i < size; i++) {
  329. const k = this.key();
  330. if (k === key)
  331. return this;
  332. this.skipAny();
  333. }
  334. throw 9;
  335. }
  336. findIndex(index) {
  337. const size = this.readArrHdr();
  338. if (index >= size)
  339. throw 10;
  340. for (let i = 0; i < index; i++)
  341. this.skipAny();
  342. return this;
  343. }
  344. find(path) {
  345. for (let i = 0; i < path.length; i++) {
  346. const segment = path[i];
  347. if (typeof segment === 'string')
  348. this.findKey(segment);
  349. else
  350. this.findIndex(segment);
  351. }
  352. return this;
  353. }
  354. }
  355. exports.CborDecoder = CborDecoder;
  356. //# sourceMappingURL=CborDecoder.js.map