codec.js 5.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129
  1. "use strict";
  2. Object.defineProperty(exports, "__esModule", { value: true });
  3. exports.stringify = exports.wrapBinary = exports.stringifyBinary = exports.parse = exports.unwrapBinary = void 0;
  4. const msgpack_1 = require("../msgpack");
  5. const fromBase64_1 = require("@jsonjoy.com/base64/lib/fromBase64");
  6. const toBase64_1 = require("@jsonjoy.com/base64/lib/toBase64");
  7. const isUint8Array_1 = require("@jsonjoy.com/util/lib/buffers/isUint8Array");
  8. const constants_1 = require("./constants");
  9. const binUriStartLength = constants_1.binUriStart.length;
  10. const msgPackUriStartLength = constants_1.msgPackUriStart.length;
  11. const msgPackExtStartLength = constants_1.msgPackExtStart.length;
  12. const minDataUri = Math.min(binUriStartLength, msgPackUriStartLength);
  13. const parseExtDataUri = (uri) => {
  14. uri = uri.substring(msgPackExtStartLength);
  15. const commaIndex = uri.indexOf(',');
  16. if (commaIndex === -1)
  17. throw new Error('INVALID_EXT_DATA_URI');
  18. const typeString = uri.substring(0, commaIndex);
  19. const buf = (0, fromBase64_1.fromBase64)(uri.substring(commaIndex + 1));
  20. return new msgpack_1.JsonPackExtension(Number(typeString), buf);
  21. };
  22. const unwrapBinary = (value) => {
  23. if (!value)
  24. return value;
  25. if (value instanceof Array) {
  26. const len = value.length;
  27. for (let i = 0; i < len; i++) {
  28. const item = value[i];
  29. switch (typeof item) {
  30. case 'object': {
  31. (0, exports.unwrapBinary)(item);
  32. continue;
  33. }
  34. case 'string': {
  35. if (item.length < minDataUri)
  36. continue;
  37. if (item.substring(0, binUriStartLength) === constants_1.binUriStart)
  38. value[i] = (0, fromBase64_1.fromBase64)(item.substring(binUriStartLength));
  39. else if (item.substring(0, msgPackUriStartLength) === constants_1.msgPackUriStart)
  40. value[i] = new msgpack_1.JsonPackValue((0, fromBase64_1.fromBase64)(item.substring(msgPackUriStartLength)));
  41. else if (item.substring(0, msgPackExtStartLength) === constants_1.msgPackExtStart)
  42. value[i] = parseExtDataUri(item);
  43. }
  44. }
  45. }
  46. return value;
  47. }
  48. if (typeof value === 'object') {
  49. for (const key in value) {
  50. const item = value[key];
  51. switch (typeof item) {
  52. case 'object': {
  53. (0, exports.unwrapBinary)(item);
  54. continue;
  55. }
  56. case 'string': {
  57. if (item.length < minDataUri)
  58. continue;
  59. if (item.substring(0, binUriStartLength) === constants_1.binUriStart) {
  60. const buf = (0, fromBase64_1.fromBase64)(item.substring(binUriStartLength));
  61. value[key] = buf;
  62. }
  63. else if (item.substring(0, msgPackUriStartLength) === constants_1.msgPackUriStart) {
  64. value[key] = new msgpack_1.JsonPackValue((0, fromBase64_1.fromBase64)(item.substring(msgPackUriStartLength)));
  65. }
  66. else if (item.substring(0, msgPackExtStartLength) === constants_1.msgPackExtStart)
  67. value[key] = parseExtDataUri(item);
  68. }
  69. }
  70. }
  71. return value;
  72. }
  73. if (typeof value === 'string') {
  74. if (value.length < minDataUri)
  75. return value;
  76. if (value.substring(0, binUriStartLength) === constants_1.binUriStart)
  77. return (0, fromBase64_1.fromBase64)(value.substring(binUriStartLength));
  78. if (value.substring(0, msgPackUriStartLength) === constants_1.msgPackUriStart)
  79. return new msgpack_1.JsonPackValue((0, fromBase64_1.fromBase64)(value.substring(msgPackUriStartLength)));
  80. if (value.substring(0, msgPackExtStartLength) === constants_1.msgPackExtStart)
  81. return parseExtDataUri(value);
  82. else
  83. return value;
  84. }
  85. return value;
  86. };
  87. exports.unwrapBinary = unwrapBinary;
  88. const parse = (json) => {
  89. const parsed = JSON.parse(json);
  90. return (0, exports.unwrapBinary)(parsed);
  91. };
  92. exports.parse = parse;
  93. const stringifyBinary = (value) => (constants_1.binUriStart + (0, toBase64_1.toBase64)(value));
  94. exports.stringifyBinary = stringifyBinary;
  95. const wrapBinary = (value) => {
  96. if (!value)
  97. return value;
  98. if ((0, isUint8Array_1.isUint8Array)(value))
  99. return (0, exports.stringifyBinary)(value);
  100. if (value instanceof Array) {
  101. const out = [];
  102. const len = value.length;
  103. for (let i = 0; i < len; i++) {
  104. const item = value[i];
  105. out.push(!item || typeof item !== 'object' ? item : (0, exports.wrapBinary)(item));
  106. }
  107. return out;
  108. }
  109. if (value instanceof msgpack_1.JsonPackValue)
  110. return constants_1.msgPackUriStart + (0, toBase64_1.toBase64)(value.val);
  111. if (value instanceof msgpack_1.JsonPackExtension)
  112. return constants_1.msgPackExtStart + value.tag + ',' + (0, toBase64_1.toBase64)(value.val);
  113. if (typeof value === 'object') {
  114. const out = {};
  115. for (const key in value) {
  116. const item = value[key];
  117. out[key] = !item || typeof item !== 'object' ? item : (0, exports.wrapBinary)(item);
  118. }
  119. return out;
  120. }
  121. return value;
  122. };
  123. exports.wrapBinary = wrapBinary;
  124. const stringify = (value, replacer, space) => {
  125. const wrapped = (0, exports.wrapBinary)(value);
  126. return JSON.stringify(wrapped, replacer, space);
  127. };
  128. exports.stringify = stringify;
  129. //# sourceMappingURL=codec.js.map