codec.js 5.7 KB

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