UbjsonDecoder.js 4.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128
  1. "use strict";
  2. Object.defineProperty(exports, "__esModule", { value: true });
  3. exports.UbjsonDecoder = void 0;
  4. const Reader_1 = require("@jsonjoy.com/util/lib/buffers/Reader");
  5. const JsonPackExtension_1 = require("../JsonPackExtension");
  6. class UbjsonDecoder {
  7. constructor() {
  8. this.reader = new Reader_1.Reader();
  9. }
  10. read(uint8) {
  11. this.reader.reset(uint8);
  12. return this.readAny();
  13. }
  14. decode(uint8) {
  15. this.reader.reset(uint8);
  16. return this.readAny();
  17. }
  18. readAny() {
  19. const reader = this.reader;
  20. const octet = reader.u8();
  21. switch (octet) {
  22. case 0x5a:
  23. return null;
  24. case 0x54:
  25. return true;
  26. case 0x46:
  27. return false;
  28. case 0x55:
  29. return reader.u8();
  30. case 0x69:
  31. return reader.i8();
  32. case 0x49: {
  33. const int = reader.view.getInt16(reader.x, false);
  34. reader.x += 2;
  35. return int;
  36. }
  37. case 0x6c: {
  38. const int = reader.view.getInt32(reader.x, false);
  39. reader.x += 4;
  40. return int;
  41. }
  42. case 0x64: {
  43. const num = reader.view.getFloat32(reader.x, false);
  44. reader.x += 4;
  45. return num;
  46. }
  47. case 0x44: {
  48. const num = reader.view.getFloat64(reader.x, false);
  49. reader.x += 8;
  50. return num;
  51. }
  52. case 0x4c: {
  53. const num = reader.view.getBigInt64(reader.x, false);
  54. reader.x += 8;
  55. return num;
  56. }
  57. case 0x53:
  58. return reader.utf8(+this.readAny());
  59. case 0x43:
  60. return String.fromCharCode(reader.u8());
  61. case 0x5b: {
  62. const uint8 = reader.uint8;
  63. const x = reader.x;
  64. if (uint8[x] === 0x24 && uint8[x + 1] === 0x55 && uint8[x + 2] === 0x23) {
  65. reader.x += 3;
  66. const size = +this.readAny();
  67. return reader.buf(size);
  68. }
  69. let type = -1;
  70. if (uint8[x] === 0x24) {
  71. reader.x++;
  72. type = reader.u8();
  73. }
  74. let count = -1;
  75. if (uint8[x] === 0x23) {
  76. reader.x++;
  77. count = reader.u8();
  78. }
  79. if (uint8[x] === 0x24) {
  80. reader.x++;
  81. type = reader.u8();
  82. }
  83. if (count >= 0) {
  84. let wordSize = 1;
  85. switch (type) {
  86. case 0x49:
  87. wordSize = 2;
  88. break;
  89. case 0x6c:
  90. case 0x64:
  91. wordSize = 4;
  92. break;
  93. case 0x44:
  94. case 0x4c:
  95. wordSize = 8;
  96. break;
  97. }
  98. return new JsonPackExtension_1.JsonPackExtension(type, reader.buf(count * wordSize));
  99. }
  100. else {
  101. const arr = [];
  102. while (uint8[reader.x] !== 0x5d)
  103. arr.push(this.readAny());
  104. reader.x++;
  105. return arr;
  106. }
  107. }
  108. case 0x7b: {
  109. const uint8 = reader.uint8;
  110. const obj = {};
  111. while (uint8[reader.x] !== 0x7d) {
  112. const keySize = +this.readAny();
  113. const key = reader.utf8(keySize);
  114. if (key === '__proto__')
  115. throw 6;
  116. obj[key] = this.readAny();
  117. }
  118. reader.x++;
  119. return obj;
  120. }
  121. case 0x4e:
  122. return undefined;
  123. }
  124. return;
  125. }
  126. }
  127. exports.UbjsonDecoder = UbjsonDecoder;
  128. //# sourceMappingURL=UbjsonDecoder.js.map