tuple.js 1.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263
  1. import { defineProperties } from "../../utils/properties.js";
  2. import { Typed } from "../typed.js";
  3. import { Coder } from "./abstract-coder.js";
  4. import { pack, unpack } from "./array.js";
  5. /**
  6. * @_ignore
  7. */
  8. export class TupleCoder extends Coder {
  9. coders;
  10. constructor(coders, localName) {
  11. let dynamic = false;
  12. const types = [];
  13. coders.forEach((coder) => {
  14. if (coder.dynamic) {
  15. dynamic = true;
  16. }
  17. types.push(coder.type);
  18. });
  19. const type = ("tuple(" + types.join(",") + ")");
  20. super("tuple", type, localName, dynamic);
  21. defineProperties(this, { coders: Object.freeze(coders.slice()) });
  22. }
  23. defaultValue() {
  24. const values = [];
  25. this.coders.forEach((coder) => {
  26. values.push(coder.defaultValue());
  27. });
  28. // We only output named properties for uniquely named coders
  29. const uniqueNames = this.coders.reduce((accum, coder) => {
  30. const name = coder.localName;
  31. if (name) {
  32. if (!accum[name]) {
  33. accum[name] = 0;
  34. }
  35. accum[name]++;
  36. }
  37. return accum;
  38. }, {});
  39. // Add named values
  40. this.coders.forEach((coder, index) => {
  41. let name = coder.localName;
  42. if (!name || uniqueNames[name] !== 1) {
  43. return;
  44. }
  45. if (name === "length") {
  46. name = "_length";
  47. }
  48. if (values[name] != null) {
  49. return;
  50. }
  51. values[name] = values[index];
  52. });
  53. return Object.freeze(values);
  54. }
  55. encode(writer, _value) {
  56. const value = Typed.dereference(_value, "tuple");
  57. return pack(writer, this.coders, value);
  58. }
  59. decode(reader) {
  60. return unpack(reader, this.coders);
  61. }
  62. }
  63. //# sourceMappingURL=tuple.js.map