@polkadot/types-codec 8.8.3-1 → 8.8.3-4

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (46) hide show
  1. package/abstract/AbstractInt.d.ts +1 -4
  2. package/abstract/AbstractInt.js +7 -14
  3. package/base/Base.d.ts +1 -1
  4. package/base/Base.js +1 -6
  5. package/base/Compact.d.ts +0 -2
  6. package/base/Compact.js +15 -16
  7. package/base/Enum.js +6 -6
  8. package/base/Null.d.ts +2 -8
  9. package/base/Null.js +2 -16
  10. package/base/Option.d.ts +1 -4
  11. package/base/Option.js +1 -10
  12. package/base/Tuple.js +2 -3
  13. package/base/Vec.js +1 -2
  14. package/base/VecFixed.js +1 -2
  15. package/cjs/abstract/AbstractInt.js +6 -13
  16. package/cjs/base/Base.js +1 -6
  17. package/cjs/base/Compact.js +15 -16
  18. package/cjs/base/Enum.js +5 -5
  19. package/cjs/base/Null.js +2 -16
  20. package/cjs/base/Option.js +1 -10
  21. package/cjs/base/Tuple.js +2 -3
  22. package/cjs/base/Vec.js +1 -2
  23. package/cjs/base/VecFixed.js +1 -2
  24. package/cjs/extended/Bytes.js +1 -1
  25. package/cjs/extended/OptionBool.js +1 -8
  26. package/cjs/native/Struct.js +2 -7
  27. package/cjs/native/Text.js +1 -10
  28. package/cjs/packageInfo.js +1 -1
  29. package/cjs/utils/decodeU8a.js +63 -20
  30. package/cjs/utils/index.js +6 -0
  31. package/cjs/utils/mapToTypeMap.js +1 -1
  32. package/extended/Bytes.js +2 -2
  33. package/extended/OptionBool.d.ts +0 -4
  34. package/extended/OptionBool.js +1 -8
  35. package/native/Raw.d.ts +1 -1
  36. package/native/Struct.d.ts +1 -1
  37. package/native/Struct.js +3 -8
  38. package/native/Text.d.ts +2 -5
  39. package/native/Text.js +1 -10
  40. package/package.json +2 -2
  41. package/packageInfo.js +1 -1
  42. package/utils/decodeU8a.d.ts +16 -1
  43. package/utils/decodeU8a.js +57 -19
  44. package/utils/index.d.ts +1 -1
  45. package/utils/index.js +1 -1
  46. package/utils/mapToTypeMap.js +1 -1
@@ -36,8 +36,7 @@ class VecFixed extends _AbstractArray.AbstractArray {
36
36
  } = arguments.length > 4 && arguments[4] !== undefined ? arguments[4] : {};
37
37
  super(registry, length);
38
38
  this.#Type = definition || setDefinition((0, _utils.typeToConstructor)(registry, Type));
39
- const [, decodedLengthNoOffset] = (0, _util.isU8a)(value) ? (0, _utils.decodeU8aVec)(registry, this, value, 0, this.#Type) : (0, _Vec.decodeVec)(registry, this, value, 0, this.#Type);
40
- this.initialU8aLength = decodedLengthNoOffset;
39
+ this.initialU8aLength = ((0, _util.isU8a)(value) ? (0, _utils.decodeU8aVec)(registry, this, value, 0, this.#Type) : (0, _Vec.decodeVec)(registry, this, value, 0, this.#Type))[1];
41
40
  }
42
41
 
43
42
  static with(Type, length) {
@@ -38,7 +38,7 @@ function decodeBytesU8a(value) {
38
38
 
39
39
  class Bytes extends _Raw.Raw {
40
40
  constructor(registry, value) {
41
- const [u8a, decodedLength] = (0, _util.isU8a)(value) && !((0, _util.isCodec)(value) && value instanceof _Raw.Raw) ? decodeBytesU8a(value) : Array.isArray(value) || (0, _util.isString)(value) ? [(0, _util.u8aToU8a)(value), 0] : [value, 0];
41
+ const [u8a, decodedLength] = (0, _util.isU8a)(value) && !(value instanceof _Raw.Raw) ? decodeBytesU8a(value) : Array.isArray(value) || (0, _util.isString)(value) ? [(0, _util.u8aToU8a)(value), 0] : [value, 0];
42
42
  super(registry, u8a, decodedLength);
43
43
  }
44
44
  /**
@@ -29,6 +29,7 @@ function decodeU8a(registry, value) {
29
29
  class OptionBool extends _Option.Option {
30
30
  constructor(registry, value) {
31
31
  super(registry, _Bool.bool, (0, _util.isU8a)(value) || (0, _util.isHex)(value) ? decodeU8a(registry, (0, _util.u8aToU8a)(value)) : value);
32
+ this.initialU8aLength = 1;
32
33
  }
33
34
  /**
34
35
  * @description The length of the value when encoded as a Uint8Array
@@ -38,14 +39,6 @@ class OptionBool extends _Option.Option {
38
39
  get encodedLength() {
39
40
  return 1;
40
41
  }
41
- /**
42
- * @description The length of the initial encoded value (Only available when constructed from a Uint8Array)
43
- */
44
-
45
-
46
- get initialU8aLength() {
47
- return 1;
48
- }
49
42
  /**
50
43
  * @description Checks if the value is an empty value (always false)
51
44
  */
@@ -82,7 +82,6 @@ function decodeStructFromObject(registry, _ref, value, jsonMap) {
82
82
 
83
83
 
84
84
  class Struct extends Map {
85
- #registry;
86
85
  #jsonMap;
87
86
  #Types;
88
87
 
@@ -93,10 +92,10 @@ class Struct extends Map {
93
92
  setDefinition = noopSetDefinition
94
93
  } = arguments.length > 4 && arguments[4] !== undefined ? arguments[4] : {};
95
94
  const typeMap = definition || setDefinition((0, _utils.mapToTypeMap)(registry, Types));
96
- const [decoded, decodedLength] = (0, _util.isU8a)(value) || (0, _util.isHex)(value) ? (0, _utils.decodeU8a)(registry, new Array(typeMap[0].length), (0, _util.u8aToU8a)(value), typeMap, true) : value instanceof Struct ? [value, 0] : decodeStructFromObject(registry, typeMap, value || {}, jsonMap);
95
+ const [decoded, decodedLength] = (0, _util.isU8a)(value) || (0, _util.isHex)(value) ? (0, _utils.decodeU8aStruct)(registry, new Array(typeMap[0].length), (0, _util.u8aToU8a)(value), typeMap) : value instanceof Struct ? [value, 0] : decodeStructFromObject(registry, typeMap, value || {}, jsonMap);
97
96
  super(decoded);
98
- this.#registry = registry;
99
97
  this.initialU8aLength = decodedLength;
98
+ this.registry = registry;
100
99
  this.#jsonMap = jsonMap;
101
100
  this.#Types = typeMap;
102
101
  }
@@ -181,10 +180,6 @@ class Struct extends Map {
181
180
  get hash() {
182
181
  return this.registry.hash(this.toU8a());
183
182
  }
184
-
185
- get registry() {
186
- return this.#registry;
187
- }
188
183
  /**
189
184
  * @description Compares the value of the input to see if there is a match
190
185
  */
@@ -48,14 +48,13 @@ function decodeText(value) {
48
48
 
49
49
 
50
50
  class Text extends String {
51
- #initialU8aLength;
52
51
  #override = null;
53
52
 
54
53
  constructor(registry, value) {
55
54
  const [str, decodedLength] = decodeText(value);
56
55
  super(str);
57
56
  this.registry = registry;
58
- this.#initialU8aLength = decodedLength;
57
+ this.initialU8aLength = decodedLength;
59
58
  }
60
59
  /**
61
60
  * @description The length of the value when encoded as a Uint8Array
@@ -65,14 +64,6 @@ class Text extends String {
65
64
  get encodedLength() {
66
65
  return this.toU8a().length;
67
66
  }
68
- /**
69
- * @description The length of the initial encoded value (Only available when constructed from a Uint8Array)
70
- */
71
-
72
-
73
- get initialU8aLength() {
74
- return this.#initialU8aLength;
75
- }
76
67
  /**
77
68
  * @description returns a hash of the contents
78
69
  */
@@ -11,6 +11,6 @@ const packageInfo = {
11
11
  name: '@polkadot/types-codec',
12
12
  path: typeof __dirname === 'string' ? __dirname : 'auto',
13
13
  type: 'cjs',
14
- version: '8.8.3-1'
14
+ version: '8.8.3-4'
15
15
  };
16
16
  exports.packageInfo = packageInfo;
@@ -4,24 +4,31 @@ Object.defineProperty(exports, "__esModule", {
4
4
  value: true
5
5
  });
6
6
  exports.decodeU8a = decodeU8a;
7
+ exports.decodeU8aStruct = decodeU8aStruct;
7
8
  exports.decodeU8aVec = decodeU8aVec;
8
9
 
9
10
  var _util = require("@polkadot/util");
10
11
 
11
12
  // Copyright 2017-2022 @polkadot/types-codec authors & contributors
12
13
  // SPDX-License-Identifier: Apache-2.0
13
- function formatFailure(error, type, u8a, key) {
14
- return `decodeU8a: failed at ${(0, _util.u8aToHex)(u8a)}…${key ? ` on ${key}` : ''}${type ? `: ${type}` : ''}:: ${error.message}`;
15
- }
16
14
 
17
- function getRawType(registry, Type) {
15
+ /** @internal */
16
+ function formatFailure(registry, _ref, u8a, i, count, Type, key) {
17
+ let {
18
+ message
19
+ } = _ref;
20
+ let type = '';
21
+
18
22
  try {
19
- return new Type(registry).toRawType();
20
- } catch {
21
- return null;
23
+ type = `: ${new Type(registry).toRawType()}`;
24
+ } catch {// ignore
22
25
  }
26
+
27
+ return `decodeU8a: failed at ${(0, _util.u8aToHex)(u8a.subarray(0, 16))}…${key ? ` on ${key}` : ''} (index ${i}/${count})${type}:: ${message}`;
23
28
  }
24
29
  /**
30
+ * @internal
31
+ *
25
32
  * Given an u8a, and an array of Type constructors, decode the u8a against the
26
33
  * types, and return an array of decoded values.
27
34
  *
@@ -31,38 +38,74 @@ function getRawType(registry, Type) {
31
38
  */
32
39
 
33
40
 
34
- function decodeU8a(registry, result, u8a, _ref, withZip) {
35
- let [Types, keys] = _ref;
41
+ function decodeU8a(registry, result, u8a, _ref2) {
42
+ let [Types, keys] = _ref2;
36
43
  const count = result.length;
37
44
  let offset = 0;
45
+ let i = 0;
38
46
 
39
- for (let i = 0; i < count; i++) {
40
- try {
47
+ try {
48
+ while (i < count) {
41
49
  const value = new Types[i](registry, u8a.subarray(offset));
42
50
  offset += value.initialU8aLength || value.encodedLength;
43
- result[i] = withZip ? [keys[i], value] : value;
44
- } catch (error) {
45
- throw new Error(formatFailure(error, getRawType(registry, Types[i]), u8a.subarray(offset, offset + 16), keys[i]));
51
+ result[i] = value;
52
+ i++;
46
53
  }
54
+ } catch (error) {
55
+ throw new Error(formatFailure(registry, error, u8a.subarray(offset), i, count, Types[i], keys[i]));
47
56
  }
48
57
 
49
58
  return [result, offset];
50
- } // Split from decodeU8a since this is specialized to 1 instance ... yes duplication, but
51
- // since we have to do less checks (and these are intensive anyway), much faster
59
+ }
60
+ /**
61
+ * @internal
62
+ *
63
+ * Split from decodeU8a since this is specialized to zip returns ... while we duplicate, this
64
+ * is all on the hot-path, so it is not great, however there is (some) method behind the madness
65
+ */
66
+
67
+
68
+ function decodeU8aStruct(registry, result, u8a, _ref3) {
69
+ let [Types, keys] = _ref3;
70
+ const count = result.length;
71
+ let offset = 0;
72
+ let i = 0;
73
+
74
+ try {
75
+ while (i < count) {
76
+ const value = new Types[i](registry, u8a.subarray(offset));
77
+ offset += value.initialU8aLength || value.encodedLength;
78
+ result[i] = [keys[i], value];
79
+ i++;
80
+ }
81
+ } catch (error) {
82
+ throw new Error(formatFailure(registry, error, u8a.subarray(offset), i, count, Types[i], keys[i]));
83
+ }
84
+
85
+ return [result, offset];
86
+ }
87
+ /**
88
+ * @internal
89
+ *
90
+ * Split from decodeU8a since this is specialized to 1 instance ... while we duplicate, this
91
+ * is all on the hot-path, so it is not great, however there is (some) method behind the madness
92
+ */
52
93
 
53
94
 
54
95
  function decodeU8aVec(registry, result, u8a, startAt, Type) {
55
96
  const count = result.length;
56
97
  let offset = startAt;
98
+ let i = 0;
57
99
 
58
- for (let i = 0; i < count; i++) {
59
- try {
100
+ try {
101
+ while (i < count) {
60
102
  const value = new Type(registry, u8a.subarray(offset));
61
103
  offset += value.initialU8aLength || value.encodedLength;
62
104
  result[i] = value;
63
- } catch (error) {
64
- throw new Error(formatFailure(error, getRawType(registry, Type), u8a.subarray(offset, offset + 16)));
105
+ i++;
65
106
  }
107
+ } catch (error) {
108
+ throw new Error(formatFailure(registry, error, u8a.subarray(offset), i, count, Type));
66
109
  }
67
110
 
68
111
  return [offset, offset - startAt];
@@ -27,6 +27,12 @@ Object.defineProperty(exports, "decodeU8a", {
27
27
  return _decodeU8a.decodeU8a;
28
28
  }
29
29
  });
30
+ Object.defineProperty(exports, "decodeU8aStruct", {
31
+ enumerable: true,
32
+ get: function () {
33
+ return _decodeU8a.decodeU8aStruct;
34
+ }
35
+ });
30
36
  Object.defineProperty(exports, "decodeU8aVec", {
31
37
  enumerable: true,
32
38
  get: function () {
@@ -18,7 +18,7 @@ function mapToTypeMap(registry, input) {
18
18
  const count = entries.length;
19
19
  const output = [new Array(count), new Array(count)];
20
20
 
21
- for (let i = 0; i < entries.length; i++) {
21
+ for (let i = 0; i < count; i++) {
22
22
  output[1][i] = entries[i][0];
23
23
  output[0][i] = (0, _typeToConstructor.typeToConstructor)(registry, entries[i][1]);
24
24
  }
package/extended/Bytes.js CHANGED
@@ -1,6 +1,6 @@
1
1
  // Copyright 2017-2022 @polkadot/types-codec authors & contributors
2
2
  // SPDX-License-Identifier: Apache-2.0
3
- import { assert, compactAddLength, compactFromU8aLim, compactToU8a, isCodec, isString, isU8a, u8aToU8a } from '@polkadot/util';
3
+ import { assert, compactAddLength, compactFromU8aLim, compactToU8a, isString, isU8a, u8aToU8a } from '@polkadot/util';
4
4
  import { Raw } from "../native/Raw.js"; // Bytes are used for things like on-chain code, so it has a healthy limit
5
5
 
6
6
  const MAX_LENGTH = 10 * 1024 * 1024;
@@ -29,7 +29,7 @@ function decodeBytesU8a(value) {
29
29
 
30
30
  export class Bytes extends Raw {
31
31
  constructor(registry, value) {
32
- const [u8a, decodedLength] = isU8a(value) && !(isCodec(value) && value instanceof Raw) ? decodeBytesU8a(value) : Array.isArray(value) || isString(value) ? [u8aToU8a(value), 0] : [value, 0];
32
+ const [u8a, decodedLength] = isU8a(value) && !(value instanceof Raw) ? decodeBytesU8a(value) : Array.isArray(value) || isString(value) ? [u8aToU8a(value), 0] : [value, 0];
33
33
  super(registry, u8a, decodedLength);
34
34
  }
35
35
  /**
@@ -12,10 +12,6 @@ export declare class OptionBool extends Option<Bool> {
12
12
  * @description The length of the value when encoded as a Uint8Array
13
13
  */
14
14
  get encodedLength(): number;
15
- /**
16
- * @description The length of the initial encoded value (Only available when constructed from a Uint8Array)
17
- */
18
- get initialU8aLength(): number;
19
15
  /**
20
16
  * @description Checks if the value is an empty value (always false)
21
17
  */
@@ -20,6 +20,7 @@ function decodeU8a(registry, value) {
20
20
  export class OptionBool extends Option {
21
21
  constructor(registry, value) {
22
22
  super(registry, Bool, isU8a(value) || isHex(value) ? decodeU8a(registry, u8aToU8a(value)) : value);
23
+ this.initialU8aLength = 1;
23
24
  }
24
25
  /**
25
26
  * @description The length of the value when encoded as a Uint8Array
@@ -29,14 +30,6 @@ export class OptionBool extends Option {
29
30
  get encodedLength() {
30
31
  return 1;
31
32
  }
32
- /**
33
- * @description The length of the initial encoded value (Only available when constructed from a Uint8Array)
34
- */
35
-
36
-
37
- get initialU8aLength() {
38
- return 1;
39
- }
40
33
  /**
41
34
  * @description Checks if the value is an empty value (always false)
42
35
  */
package/native/Raw.d.ts CHANGED
@@ -10,9 +10,9 @@ import type { AnyJson, AnyU8a, Inspect, IU8a, Registry } from '../types';
10
10
  * @noInheritDoc
11
11
  */
12
12
  export declare class Raw extends Uint8Array implements IU8a {
13
- readonly registry: Registry;
14
13
  createdAtHash?: IU8a;
15
14
  readonly initialU8aLength?: number;
15
+ readonly registry: Registry;
16
16
  constructor(registry: Registry, value?: AnyU8a, initialU8aLength?: number);
17
17
  /**
18
18
  * @description The length of the value when encoded as a Uint8Array
@@ -28,6 +28,7 @@ export declare class Struct<S extends TypesDef = TypesDef, V extends {
28
28
  #private;
29
29
  createdAtHash?: IU8a;
30
30
  readonly initialU8aLength?: number;
31
+ readonly registry: Registry;
31
32
  constructor(registry: Registry, Types: S, value?: V | Map<unknown, unknown> | unknown[] | HexString | null, jsonMap?: Map<string, string>, { definition, setDefinition }?: Options);
32
33
  static with<S extends TypesDef>(Types: S, jsonMap?: Map<string, string>): CodecClass<Struct<S>>;
33
34
  /**
@@ -51,7 +52,6 @@ export declare class Struct<S extends TypesDef = TypesDef, V extends {
51
52
  * @description returns a hash of the contents
52
53
  */
53
54
  get hash(): IU8a;
54
- get registry(): Registry;
55
55
  /**
56
56
  * @description Compares the value of the input to see if there is a match
57
57
  */
package/native/Struct.js CHANGED
@@ -1,7 +1,7 @@
1
1
  // Copyright 2017-2022 @polkadot/types-codec authors & contributors
2
2
  // SPDX-License-Identifier: Apache-2.0
3
3
  import { assert, isBoolean, isFunction, isHex, isObject, isU8a, isUndefined, objectProperties, stringCamelCase, stringify, u8aConcatStrict, u8aToHex, u8aToU8a } from '@polkadot/util';
4
- import { compareMap, decodeU8a, mapToTypeMap, typesToMap } from "../utils/index.js";
4
+ import { compareMap, decodeU8aStruct, mapToTypeMap, typesToMap } from "../utils/index.js";
5
5
 
6
6
  function noopSetDefinition(d) {
7
7
  return d;
@@ -73,7 +73,6 @@ function decodeStructFromObject(registry, [Types, keys], value, jsonMap) {
73
73
 
74
74
 
75
75
  export class Struct extends Map {
76
- #registry;
77
76
  #jsonMap;
78
77
  #Types;
79
78
 
@@ -82,10 +81,10 @@ export class Struct extends Map {
82
81
  setDefinition = noopSetDefinition
83
82
  } = {}) {
84
83
  const typeMap = definition || setDefinition(mapToTypeMap(registry, Types));
85
- const [decoded, decodedLength] = isU8a(value) || isHex(value) ? decodeU8a(registry, new Array(typeMap[0].length), u8aToU8a(value), typeMap, true) : value instanceof Struct ? [value, 0] : decodeStructFromObject(registry, typeMap, value || {}, jsonMap);
84
+ const [decoded, decodedLength] = isU8a(value) || isHex(value) ? decodeU8aStruct(registry, new Array(typeMap[0].length), u8aToU8a(value), typeMap) : value instanceof Struct ? [value, 0] : decodeStructFromObject(registry, typeMap, value || {}, jsonMap);
86
85
  super(decoded);
87
- this.#registry = registry;
88
86
  this.initialU8aLength = decodedLength;
87
+ this.registry = registry;
89
88
  this.#jsonMap = jsonMap;
90
89
  this.#Types = typeMap;
91
90
  }
@@ -170,10 +169,6 @@ export class Struct extends Map {
170
169
  get hash() {
171
170
  return this.registry.hash(this.toU8a());
172
171
  }
173
-
174
- get registry() {
175
- return this.#registry;
176
- }
177
172
  /**
178
173
  * @description Compares the value of the input to see if there is a match
179
174
  */
package/native/Text.d.ts CHANGED
@@ -10,8 +10,9 @@ import type { AnyString, AnyU8a, Inspect, IText, IU8a, Registry } from '../types
10
10
  */
11
11
  export declare class Text extends String implements IText {
12
12
  #private;
13
- readonly registry: Registry;
14
13
  createdAtHash?: IU8a;
14
+ readonly initialU8aLength?: number;
15
+ readonly registry: Registry;
15
16
  constructor(registry: Registry, value?: null | AnyString | AnyU8a | {
16
17
  toString: () => string;
17
18
  });
@@ -19,10 +20,6 @@ export declare class Text extends String implements IText {
19
20
  * @description The length of the value when encoded as a Uint8Array
20
21
  */
21
22
  get encodedLength(): number;
22
- /**
23
- * @description The length of the initial encoded value (Only available when constructed from a Uint8Array)
24
- */
25
- get initialU8aLength(): number | undefined;
26
23
  /**
27
24
  * @description returns a hash of the contents
28
25
  */
package/native/Text.js CHANGED
@@ -39,14 +39,13 @@ function decodeText(value) {
39
39
 
40
40
 
41
41
  export class Text extends String {
42
- #initialU8aLength;
43
42
  #override = null;
44
43
 
45
44
  constructor(registry, value) {
46
45
  const [str, decodedLength] = decodeText(value);
47
46
  super(str);
48
47
  this.registry = registry;
49
- this.#initialU8aLength = decodedLength;
48
+ this.initialU8aLength = decodedLength;
50
49
  }
51
50
  /**
52
51
  * @description The length of the value when encoded as a Uint8Array
@@ -56,14 +55,6 @@ export class Text extends String {
56
55
  get encodedLength() {
57
56
  return this.toU8a().length;
58
57
  }
59
- /**
60
- * @description The length of the initial encoded value (Only available when constructed from a Uint8Array)
61
- */
62
-
63
-
64
- get initialU8aLength() {
65
- return this.#initialU8aLength;
66
- }
67
58
  /**
68
59
  * @description returns a hash of the contents
69
60
  */
package/package.json CHANGED
@@ -20,7 +20,7 @@
20
20
  "./cjs/detectPackage.js"
21
21
  ],
22
22
  "type": "module",
23
- "version": "8.8.3-1",
23
+ "version": "8.8.3-4",
24
24
  "main": "./cjs/index.js",
25
25
  "module": "./index.js",
26
26
  "types": "./index.d.ts",
@@ -415,6 +415,6 @@
415
415
  },
416
416
  "dependencies": {
417
417
  "@babel/runtime": "^7.18.3",
418
- "@polkadot/util": "^9.4.1"
418
+ "@polkadot/util": "^9.4.2-22"
419
419
  }
420
420
  }
package/packageInfo.js CHANGED
@@ -5,5 +5,5 @@ export const packageInfo = {
5
5
  name: '@polkadot/types-codec',
6
6
  path: (import.meta && import.meta.url) ? new URL(import.meta.url).pathname.substring(0, new URL(import.meta.url).pathname.lastIndexOf('/') + 1) : 'auto',
7
7
  type: 'esm',
8
- version: '8.8.3-1'
8
+ version: '8.8.3-4'
9
9
  };
@@ -1,5 +1,7 @@
1
1
  import type { Codec, CodecClass, Registry } from '../types';
2
2
  /**
3
+ * @internal
4
+ *
3
5
  * Given an u8a, and an array of Type constructors, decode the u8a against the
4
6
  * types, and return an array of decoded values.
5
7
  *
@@ -7,5 +9,18 @@ import type { Codec, CodecClass, Registry } from '../types';
7
9
  * @param result - The result array (will be returned with values pushed)
8
10
  * @param types - The array of CodecClass to decode the U8a against.
9
11
  */
10
- export declare function decodeU8a<T extends Codec = Codec, E = T>(registry: Registry, result: unknown[], u8a: Uint8Array, [Types, keys]: [CodecClass[], string[]], withZip?: boolean): [E[], number];
12
+ export declare function decodeU8a<T extends Codec = Codec>(registry: Registry, result: T[], u8a: Uint8Array, [Types, keys]: [CodecClass<T>[], string[]]): [T[], number];
13
+ /**
14
+ * @internal
15
+ *
16
+ * Split from decodeU8a since this is specialized to zip returns ... while we duplicate, this
17
+ * is all on the hot-path, so it is not great, however there is (some) method behind the madness
18
+ */
19
+ export declare function decodeU8aStruct(registry: Registry, result: [string, Codec][], u8a: Uint8Array, [Types, keys]: [CodecClass[], string[]]): [[string, Codec][], number];
20
+ /**
21
+ * @internal
22
+ *
23
+ * Split from decodeU8a since this is specialized to 1 instance ... while we duplicate, this
24
+ * is all on the hot-path, so it is not great, however there is (some) method behind the madness
25
+ */
11
26
  export declare function decodeU8aVec<T extends Codec = Codec>(registry: Registry, result: unknown[], u8a: Uint8Array, startAt: number, Type: CodecClass<T>): [number, number];
@@ -1,19 +1,23 @@
1
1
  // Copyright 2017-2022 @polkadot/types-codec authors & contributors
2
2
  // SPDX-License-Identifier: Apache-2.0
3
3
  import { u8aToHex } from '@polkadot/util';
4
+ /** @internal */
4
5
 
5
- function formatFailure(error, type, u8a, key) {
6
- return `decodeU8a: failed at ${u8aToHex(u8a)}…${key ? ` on ${key}` : ''}${type ? `: ${type}` : ''}:: ${error.message}`;
7
- }
6
+ function formatFailure(registry, {
7
+ message
8
+ }, u8a, i, count, Type, key) {
9
+ let type = '';
8
10
 
9
- function getRawType(registry, Type) {
10
11
  try {
11
- return new Type(registry).toRawType();
12
- } catch {
13
- return null;
12
+ type = `: ${new Type(registry).toRawType()}`;
13
+ } catch {// ignore
14
14
  }
15
+
16
+ return `decodeU8a: failed at ${u8aToHex(u8a.subarray(0, 16))}…${key ? ` on ${key}` : ''} (index ${i}/${count})${type}:: ${message}`;
15
17
  }
16
18
  /**
19
+ * @internal
20
+ *
17
21
  * Given an u8a, and an array of Type constructors, decode the u8a against the
18
22
  * types, and return an array of decoded values.
19
23
  *
@@ -23,36 +27,70 @@ function getRawType(registry, Type) {
23
27
  */
24
28
 
25
29
 
26
- export function decodeU8a(registry, result, u8a, [Types, keys], withZip) {
30
+ export function decodeU8a(registry, result, u8a, [Types, keys]) {
27
31
  const count = result.length;
28
32
  let offset = 0;
33
+ let i = 0;
29
34
 
30
- for (let i = 0; i < count; i++) {
31
- try {
35
+ try {
36
+ while (i < count) {
32
37
  const value = new Types[i](registry, u8a.subarray(offset));
33
38
  offset += value.initialU8aLength || value.encodedLength;
34
- result[i] = withZip ? [keys[i], value] : value;
35
- } catch (error) {
36
- throw new Error(formatFailure(error, getRawType(registry, Types[i]), u8a.subarray(offset, offset + 16), keys[i]));
39
+ result[i] = value;
40
+ i++;
37
41
  }
42
+ } catch (error) {
43
+ throw new Error(formatFailure(registry, error, u8a.subarray(offset), i, count, Types[i], keys[i]));
38
44
  }
39
45
 
40
46
  return [result, offset];
41
- } // Split from decodeU8a since this is specialized to 1 instance ... yes duplication, but
42
- // since we have to do less checks (and these are intensive anyway), much faster
47
+ }
48
+ /**
49
+ * @internal
50
+ *
51
+ * Split from decodeU8a since this is specialized to zip returns ... while we duplicate, this
52
+ * is all on the hot-path, so it is not great, however there is (some) method behind the madness
53
+ */
54
+
55
+ export function decodeU8aStruct(registry, result, u8a, [Types, keys]) {
56
+ const count = result.length;
57
+ let offset = 0;
58
+ let i = 0;
59
+
60
+ try {
61
+ while (i < count) {
62
+ const value = new Types[i](registry, u8a.subarray(offset));
63
+ offset += value.initialU8aLength || value.encodedLength;
64
+ result[i] = [keys[i], value];
65
+ i++;
66
+ }
67
+ } catch (error) {
68
+ throw new Error(formatFailure(registry, error, u8a.subarray(offset), i, count, Types[i], keys[i]));
69
+ }
70
+
71
+ return [result, offset];
72
+ }
73
+ /**
74
+ * @internal
75
+ *
76
+ * Split from decodeU8a since this is specialized to 1 instance ... while we duplicate, this
77
+ * is all on the hot-path, so it is not great, however there is (some) method behind the madness
78
+ */
43
79
 
44
80
  export function decodeU8aVec(registry, result, u8a, startAt, Type) {
45
81
  const count = result.length;
46
82
  let offset = startAt;
83
+ let i = 0;
47
84
 
48
- for (let i = 0; i < count; i++) {
49
- try {
85
+ try {
86
+ while (i < count) {
50
87
  const value = new Type(registry, u8a.subarray(offset));
51
88
  offset += value.initialU8aLength || value.encodedLength;
52
89
  result[i] = value;
53
- } catch (error) {
54
- throw new Error(formatFailure(error, getRawType(registry, Type), u8a.subarray(offset, offset + 16)));
90
+ i++;
55
91
  }
92
+ } catch (error) {
93
+ throw new Error(formatFailure(registry, error, u8a.subarray(offset), i, count, Type));
56
94
  }
57
95
 
58
96
  return [offset, offset - startAt];
package/utils/index.d.ts CHANGED
@@ -1,7 +1,7 @@
1
1
  export { compareArray } from './compareArray';
2
2
  export { compareMap } from './compareMap';
3
3
  export { compareSet } from './compareSet';
4
- export { decodeU8a, decodeU8aVec } from './decodeU8a';
4
+ export { decodeU8a, decodeU8aStruct, decodeU8aVec } from './decodeU8a';
5
5
  export { mapToTypeMap } from './mapToTypeMap';
6
6
  export { typeToConstructor } from './typeToConstructor';
7
7
  export { sanitize } from './sanitize';
package/utils/index.js CHANGED
@@ -3,7 +3,7 @@
3
3
  export { compareArray } from "./compareArray.js";
4
4
  export { compareMap } from "./compareMap.js";
5
5
  export { compareSet } from "./compareSet.js";
6
- export { decodeU8a, decodeU8aVec } from "./decodeU8a.js";
6
+ export { decodeU8a, decodeU8aStruct, decodeU8aVec } from "./decodeU8a.js";
7
7
  export { mapToTypeMap } from "./mapToTypeMap.js";
8
8
  export { typeToConstructor } from "./typeToConstructor.js";
9
9
  export { sanitize } from "./sanitize.js";
@@ -10,7 +10,7 @@ export function mapToTypeMap(registry, input) {
10
10
  const count = entries.length;
11
11
  const output = [new Array(count), new Array(count)];
12
12
 
13
- for (let i = 0; i < entries.length; i++) {
13
+ for (let i = 0; i < count; i++) {
14
14
  output[1][i] = entries[i][0];
15
15
  output[0][i] = typeToConstructor(registry, entries[i][1]);
16
16
  }