@metamask/utils 3.2.0 → 3.3.0
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.
- package/CHANGELOG.md +12 -1
- package/dist/assert.d.ts +26 -2
- package/dist/assert.js +86 -4
- package/dist/assert.js.map +1 -1
- package/dist/bytes.d.ts +23 -0
- package/dist/bytes.js +31 -1
- package/dist/bytes.js.map +1 -1
- package/dist/json.d.ts +80 -53
- package/dist/json.js +98 -136
- package/dist/json.js.map +1 -1
- package/package.json +2 -3
package/CHANGELOG.md
CHANGED
|
@@ -6,6 +6,16 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
|
|
|
6
6
|
|
|
7
7
|
## [Unreleased]
|
|
8
8
|
|
|
9
|
+
## [3.3.0]
|
|
10
|
+
### Added
|
|
11
|
+
- Add more assertion utils ([#49](https://github.com/MetaMask/utils/pull/49))
|
|
12
|
+
- Add JSON-RPC error validation functions ([#46](https://github.com/MetaMask/utils/pull/46))
|
|
13
|
+
- Add convenience function for creating a `DataView` ([#45](https://github.com/MetaMask/utils/pull/45))
|
|
14
|
+
|
|
15
|
+
### Fixed
|
|
16
|
+
- Update JSON validation logic ([#47](https://github.com/MetaMask/utils/pull/47))
|
|
17
|
+
- Validation would previously allow for `undefined` values, which is not a standard JSON type
|
|
18
|
+
|
|
9
19
|
## [3.2.0]
|
|
10
20
|
### Added
|
|
11
21
|
- Add `PendingJsonRpcResponse` type ([#43](https://github.com/MetaMask/utils/pull/43))
|
|
@@ -79,7 +89,8 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
|
|
|
79
89
|
### Added
|
|
80
90
|
- Initial release
|
|
81
91
|
|
|
82
|
-
[Unreleased]: https://github.com/MetaMask/utils/compare/v3.
|
|
92
|
+
[Unreleased]: https://github.com/MetaMask/utils/compare/v3.3.0...HEAD
|
|
93
|
+
[3.3.0]: https://github.com/MetaMask/utils/compare/v3.2.0...v3.3.0
|
|
83
94
|
[3.2.0]: https://github.com/MetaMask/utils/compare/v3.1.0...v3.2.0
|
|
84
95
|
[3.1.0]: https://github.com/MetaMask/utils/compare/v3.0.3...v3.1.0
|
|
85
96
|
[3.0.3]: https://github.com/MetaMask/utils/compare/v3.0.2...v3.0.3
|
package/dist/assert.d.ts
CHANGED
|
@@ -1,3 +1,12 @@
|
|
|
1
|
+
import { Struct } from 'superstruct';
|
|
2
|
+
export declare type AssertionErrorConstructor = (new (args: {
|
|
3
|
+
message: string;
|
|
4
|
+
}) => Error) | ((args: {
|
|
5
|
+
message: string;
|
|
6
|
+
}) => Error);
|
|
7
|
+
/**
|
|
8
|
+
* The default error class that is thrown if an assertion fails.
|
|
9
|
+
*/
|
|
1
10
|
export declare class AssertionError extends Error {
|
|
2
11
|
readonly code = "ERR_ASSERTION";
|
|
3
12
|
constructor(options: {
|
|
@@ -8,12 +17,27 @@ export declare class AssertionError extends Error {
|
|
|
8
17
|
* Same as Node.js assert.
|
|
9
18
|
* If the value is falsy, throws an error, does nothing otherwise.
|
|
10
19
|
*
|
|
11
|
-
* @throws {@link AssertionError}
|
|
20
|
+
* @throws {@link AssertionError} If value is falsy.
|
|
12
21
|
* @param value - The test that should be truthy to pass.
|
|
13
22
|
* @param message - Message to be passed to {@link AssertionError} or an
|
|
14
23
|
* {@link Error} instance to throw.
|
|
24
|
+
* @param ErrorWrapper - The error class to throw if the assertion fails.
|
|
25
|
+
* Defaults to {@link AssertionError}. If a custom error class is provided for
|
|
26
|
+
* the `message` argument, this argument is ignored.
|
|
27
|
+
*/
|
|
28
|
+
export declare function assert(value: any, message?: string | Error, ErrorWrapper?: AssertionErrorConstructor): asserts value;
|
|
29
|
+
/**
|
|
30
|
+
* Assert a value against a Superstruct struct.
|
|
31
|
+
*
|
|
32
|
+
* @param value - The value to validate.
|
|
33
|
+
* @param struct - The struct to validate against.
|
|
34
|
+
* @param errorPrefix - A prefix to add to the error message. Defaults to
|
|
35
|
+
* "Assertion failed".
|
|
36
|
+
* @param ErrorWrapper - The error class to throw if the assertion fails.
|
|
37
|
+
* Defaults to {@link AssertionError}.
|
|
38
|
+
* @throws If the value is not valid.
|
|
15
39
|
*/
|
|
16
|
-
export declare function
|
|
40
|
+
export declare function assertStruct<T, S>(value: unknown, struct: Struct<T, S>, errorPrefix?: string, ErrorWrapper?: AssertionErrorConstructor): asserts value is T;
|
|
17
41
|
/**
|
|
18
42
|
* Use in the default case of a switch that you want to be fully exhaustive.
|
|
19
43
|
* Using this function forces the compiler to enforce exhaustivity during
|
package/dist/assert.js
CHANGED
|
@@ -1,6 +1,65 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.assertExhaustive = exports.assert = exports.AssertionError = void 0;
|
|
3
|
+
exports.assertExhaustive = exports.assertStruct = exports.assert = exports.AssertionError = void 0;
|
|
4
|
+
const superstruct_1 = require("superstruct");
|
|
5
|
+
/**
|
|
6
|
+
* Type guard for determining whether the given value is an error object with a
|
|
7
|
+
* `message` property, such as an instance of Error.
|
|
8
|
+
*
|
|
9
|
+
* @param error - The object to check.
|
|
10
|
+
* @returns True or false, depending on the result.
|
|
11
|
+
*/
|
|
12
|
+
function isErrorWithMessage(error) {
|
|
13
|
+
return typeof error === 'object' && error !== null && 'message' in error;
|
|
14
|
+
}
|
|
15
|
+
/**
|
|
16
|
+
* Check if a value is a constructor, i.e., a function that can be called with
|
|
17
|
+
* the `new` keyword.
|
|
18
|
+
*
|
|
19
|
+
* @param fn - The value to check.
|
|
20
|
+
* @returns `true` if the value is a constructor, or `false` otherwise.
|
|
21
|
+
*/
|
|
22
|
+
function isConstructable(fn) {
|
|
23
|
+
var _a, _b;
|
|
24
|
+
/* istanbul ignore next */
|
|
25
|
+
return Boolean(typeof ((_b = (_a = fn === null || fn === void 0 ? void 0 : fn.prototype) === null || _a === void 0 ? void 0 : _a.constructor) === null || _b === void 0 ? void 0 : _b.name) === 'string');
|
|
26
|
+
}
|
|
27
|
+
/**
|
|
28
|
+
* Get the error message from an unknown error object. If the error object has
|
|
29
|
+
* a `message` property, that property is returned. Otherwise, the stringified
|
|
30
|
+
* error object is returned.
|
|
31
|
+
*
|
|
32
|
+
* @param error - The error object to get the message from.
|
|
33
|
+
* @returns The error message.
|
|
34
|
+
*/
|
|
35
|
+
function getErrorMessage(error) {
|
|
36
|
+
const message = isErrorWithMessage(error) ? error.message : String(error);
|
|
37
|
+
// If the error ends with a period, remove it, as we'll add our own period.
|
|
38
|
+
if (message.endsWith('.')) {
|
|
39
|
+
return message.slice(0, -1);
|
|
40
|
+
}
|
|
41
|
+
return message;
|
|
42
|
+
}
|
|
43
|
+
/**
|
|
44
|
+
* Initialise an {@link AssertionErrorConstructor} error.
|
|
45
|
+
*
|
|
46
|
+
* @param ErrorWrapper - The error class to use.
|
|
47
|
+
* @param message - The error message.
|
|
48
|
+
* @returns The error object.
|
|
49
|
+
*/
|
|
50
|
+
function getError(ErrorWrapper, message) {
|
|
51
|
+
if (isConstructable(ErrorWrapper)) {
|
|
52
|
+
return new ErrorWrapper({
|
|
53
|
+
message,
|
|
54
|
+
});
|
|
55
|
+
}
|
|
56
|
+
return ErrorWrapper({
|
|
57
|
+
message,
|
|
58
|
+
});
|
|
59
|
+
}
|
|
60
|
+
/**
|
|
61
|
+
* The default error class that is thrown if an assertion fails.
|
|
62
|
+
*/
|
|
4
63
|
class AssertionError extends Error {
|
|
5
64
|
constructor(options) {
|
|
6
65
|
super(options.message);
|
|
@@ -12,20 +71,43 @@ exports.AssertionError = AssertionError;
|
|
|
12
71
|
* Same as Node.js assert.
|
|
13
72
|
* If the value is falsy, throws an error, does nothing otherwise.
|
|
14
73
|
*
|
|
15
|
-
* @throws {@link AssertionError}
|
|
74
|
+
* @throws {@link AssertionError} If value is falsy.
|
|
16
75
|
* @param value - The test that should be truthy to pass.
|
|
17
76
|
* @param message - Message to be passed to {@link AssertionError} or an
|
|
18
77
|
* {@link Error} instance to throw.
|
|
78
|
+
* @param ErrorWrapper - The error class to throw if the assertion fails.
|
|
79
|
+
* Defaults to {@link AssertionError}. If a custom error class is provided for
|
|
80
|
+
* the `message` argument, this argument is ignored.
|
|
19
81
|
*/
|
|
20
|
-
function assert(value, message) {
|
|
82
|
+
function assert(value, message = 'Assertion failed.', ErrorWrapper = AssertionError) {
|
|
21
83
|
if (!value) {
|
|
22
84
|
if (message instanceof Error) {
|
|
23
85
|
throw message;
|
|
24
86
|
}
|
|
25
|
-
throw
|
|
87
|
+
throw getError(ErrorWrapper, message);
|
|
26
88
|
}
|
|
27
89
|
}
|
|
28
90
|
exports.assert = assert;
|
|
91
|
+
/**
|
|
92
|
+
* Assert a value against a Superstruct struct.
|
|
93
|
+
*
|
|
94
|
+
* @param value - The value to validate.
|
|
95
|
+
* @param struct - The struct to validate against.
|
|
96
|
+
* @param errorPrefix - A prefix to add to the error message. Defaults to
|
|
97
|
+
* "Assertion failed".
|
|
98
|
+
* @param ErrorWrapper - The error class to throw if the assertion fails.
|
|
99
|
+
* Defaults to {@link AssertionError}.
|
|
100
|
+
* @throws If the value is not valid.
|
|
101
|
+
*/
|
|
102
|
+
function assertStruct(value, struct, errorPrefix = 'Assertion failed', ErrorWrapper = AssertionError) {
|
|
103
|
+
try {
|
|
104
|
+
(0, superstruct_1.assert)(value, struct);
|
|
105
|
+
}
|
|
106
|
+
catch (error) {
|
|
107
|
+
throw getError(ErrorWrapper, `${errorPrefix}: ${getErrorMessage(error)}.`);
|
|
108
|
+
}
|
|
109
|
+
}
|
|
110
|
+
exports.assertStruct = assertStruct;
|
|
29
111
|
/**
|
|
30
112
|
* Use in the default case of a switch that you want to be fully exhaustive.
|
|
31
113
|
* Using this function forces the compiler to enforce exhaustivity during
|
package/dist/assert.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"assert.js","sourceRoot":"","sources":["../src/assert.ts"],"names":[],"mappings":";;;AAAA,MAAa,cAAe,SAAQ,KAAK;IAGvC,YAAY,OAA4B;QACtC,KAAK,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;QAHhB,SAAI,GAAG,eAAe,CAAC;IAIhC,CAAC;CACF;AAND,wCAMC;AAED
|
|
1
|
+
{"version":3,"file":"assert.js","sourceRoot":"","sources":["../src/assert.ts"],"names":[],"mappings":";;;AAAA,6CAAkE;AAMlE;;;;;;GAMG;AACH,SAAS,kBAAkB,CAAC,KAAc;IACxC,OAAO,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,KAAK,IAAI,IAAI,SAAS,IAAI,KAAK,CAAC;AAC3E,CAAC;AAED;;;;;;GAMG;AACH,SAAS,eAAe,CACtB,EAA6B;;IAE7B,0BAA0B;IAC1B,OAAO,OAAO,CAAC,OAAO,CAAA,MAAA,MAAA,EAAE,aAAF,EAAE,uBAAF,EAAE,CAAE,SAAS,0CAAE,WAAW,0CAAE,IAAI,CAAA,KAAK,QAAQ,CAAC,CAAC;AACvE,CAAC;AAED;;;;;;;GAOG;AACH,SAAS,eAAe,CAAC,KAAc;IACrC,MAAM,OAAO,GAAG,kBAAkB,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;IAE1E,2EAA2E;IAC3E,IAAI,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE;QACzB,OAAO,OAAO,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;KAC7B;IAED,OAAO,OAAO,CAAC;AACjB,CAAC;AAED;;;;;;GAMG;AACH,SAAS,QAAQ,CAAC,YAAuC,EAAE,OAAe;IACxE,IAAI,eAAe,CAAC,YAAY,CAAC,EAAE;QACjC,OAAO,IAAI,YAAY,CAAC;YACtB,OAAO;SACR,CAAC,CAAC;KACJ;IACD,OAAO,YAAY,CAAC;QAClB,OAAO;KACR,CAAC,CAAC;AACL,CAAC;AAED;;GAEG;AACH,MAAa,cAAe,SAAQ,KAAK;IAGvC,YAAY,OAA4B;QACtC,KAAK,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;QAHhB,SAAI,GAAG,eAAe,CAAC;IAIhC,CAAC;CACF;AAND,wCAMC;AAED;;;;;;;;;;;GAWG;AACH,SAAgB,MAAM,CACpB,KAAU,EACV,UAA0B,mBAAmB,EAC7C,eAA0C,cAAc;IAExD,IAAI,CAAC,KAAK,EAAE;QACV,IAAI,OAAO,YAAY,KAAK,EAAE;YAC5B,MAAM,OAAO,CAAC;SACf;QAED,MAAM,QAAQ,CAAC,YAAY,EAAE,OAAO,CAAC,CAAC;KACvC;AACH,CAAC;AAZD,wBAYC;AAED;;;;;;;;;;GAUG;AACH,SAAgB,YAAY,CAC1B,KAAc,EACd,MAAoB,EACpB,WAAW,GAAG,kBAAkB,EAChC,eAA0C,cAAc;IAExD,IAAI;QACF,IAAA,oBAAiB,EAAC,KAAK,EAAE,MAAM,CAAC,CAAC;KAClC;IAAC,OAAO,KAAK,EAAE;QACd,MAAM,QAAQ,CAAC,YAAY,EAAE,GAAG,WAAW,KAAK,eAAe,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;KAC5E;AACH,CAAC;AAXD,oCAWC;AAED;;;;;;;;;;;;;;;;;;GAkBG;AACH,SAAgB,gBAAgB,CAAC,OAAc;IAC7C,MAAM,IAAI,KAAK,CACb,gEAAgE,CACjE,CAAC;AACJ,CAAC;AAJD,4CAIC","sourcesContent":["import { assert as assertSuperstruct, Struct } from 'superstruct';\n\nexport type AssertionErrorConstructor =\n | (new (args: { message: string }) => Error)\n | ((args: { message: string }) => Error);\n\n/**\n * Type guard for determining whether the given value is an error object with a\n * `message` property, such as an instance of Error.\n *\n * @param error - The object to check.\n * @returns True or false, depending on the result.\n */\nfunction isErrorWithMessage(error: unknown): error is { message: string } {\n return typeof error === 'object' && error !== null && 'message' in error;\n}\n\n/**\n * Check if a value is a constructor, i.e., a function that can be called with\n * the `new` keyword.\n *\n * @param fn - The value to check.\n * @returns `true` if the value is a constructor, or `false` otherwise.\n */\nfunction isConstructable(\n fn: AssertionErrorConstructor,\n): fn is new (args: { message: string }) => Error {\n /* istanbul ignore next */\n return Boolean(typeof fn?.prototype?.constructor?.name === 'string');\n}\n\n/**\n * Get the error message from an unknown error object. If the error object has\n * a `message` property, that property is returned. Otherwise, the stringified\n * error object is returned.\n *\n * @param error - The error object to get the message from.\n * @returns The error message.\n */\nfunction getErrorMessage(error: unknown): string {\n const message = isErrorWithMessage(error) ? error.message : String(error);\n\n // If the error ends with a period, remove it, as we'll add our own period.\n if (message.endsWith('.')) {\n return message.slice(0, -1);\n }\n\n return message;\n}\n\n/**\n * Initialise an {@link AssertionErrorConstructor} error.\n *\n * @param ErrorWrapper - The error class to use.\n * @param message - The error message.\n * @returns The error object.\n */\nfunction getError(ErrorWrapper: AssertionErrorConstructor, message: string) {\n if (isConstructable(ErrorWrapper)) {\n return new ErrorWrapper({\n message,\n });\n }\n return ErrorWrapper({\n message,\n });\n}\n\n/**\n * The default error class that is thrown if an assertion fails.\n */\nexport class AssertionError extends Error {\n readonly code = 'ERR_ASSERTION';\n\n constructor(options: { message: string }) {\n super(options.message);\n }\n}\n\n/**\n * Same as Node.js assert.\n * If the value is falsy, throws an error, does nothing otherwise.\n *\n * @throws {@link AssertionError} If value is falsy.\n * @param value - The test that should be truthy to pass.\n * @param message - Message to be passed to {@link AssertionError} or an\n * {@link Error} instance to throw.\n * @param ErrorWrapper - The error class to throw if the assertion fails.\n * Defaults to {@link AssertionError}. If a custom error class is provided for\n * the `message` argument, this argument is ignored.\n */\nexport function assert(\n value: any,\n message: string | Error = 'Assertion failed.',\n ErrorWrapper: AssertionErrorConstructor = AssertionError,\n): asserts value {\n if (!value) {\n if (message instanceof Error) {\n throw message;\n }\n\n throw getError(ErrorWrapper, message);\n }\n}\n\n/**\n * Assert a value against a Superstruct struct.\n *\n * @param value - The value to validate.\n * @param struct - The struct to validate against.\n * @param errorPrefix - A prefix to add to the error message. Defaults to\n * \"Assertion failed\".\n * @param ErrorWrapper - The error class to throw if the assertion fails.\n * Defaults to {@link AssertionError}.\n * @throws If the value is not valid.\n */\nexport function assertStruct<T, S>(\n value: unknown,\n struct: Struct<T, S>,\n errorPrefix = 'Assertion failed',\n ErrorWrapper: AssertionErrorConstructor = AssertionError,\n): asserts value is T {\n try {\n assertSuperstruct(value, struct);\n } catch (error) {\n throw getError(ErrorWrapper, `${errorPrefix}: ${getErrorMessage(error)}.`);\n }\n}\n\n/**\n * Use in the default case of a switch that you want to be fully exhaustive.\n * Using this function forces the compiler to enforce exhaustivity during\n * compile-time.\n *\n * @example\n * ```\n * const number = 1;\n * switch (number) {\n * case 0:\n * ...\n * case 1:\n * ...\n * default:\n * assertExhaustive(snapPrefix);\n * }\n * ```\n * @param _object - The object on which the switch is being operated.\n */\nexport function assertExhaustive(_object: never): never {\n throw new Error(\n 'Invalid branch reached. Should be detected during compilation.',\n );\n}\n"]}
|
package/dist/bytes.d.ts
CHANGED
|
@@ -143,3 +143,26 @@ export declare function valueToBytes(value: Bytes): Uint8Array;
|
|
|
143
143
|
* @returns The concatenated bytes as `Uint8Array`.
|
|
144
144
|
*/
|
|
145
145
|
export declare function concatBytes(values: Bytes[]): Uint8Array;
|
|
146
|
+
/**
|
|
147
|
+
* Create a {@link DataView} from a {@link Uint8Array}. This is a convenience
|
|
148
|
+
* function that avoids having to create a {@link DataView} manually, which
|
|
149
|
+
* requires passing the `byteOffset` and `byteLength` parameters every time.
|
|
150
|
+
*
|
|
151
|
+
* Not passing the `byteOffset` and `byteLength` parameters can result in
|
|
152
|
+
* unexpected behavior when the {@link Uint8Array} is a view of a larger
|
|
153
|
+
* {@link ArrayBuffer}, e.g., when using {@link Uint8Array.subarray}.
|
|
154
|
+
*
|
|
155
|
+
* This function also supports Node.js {@link Buffer}s.
|
|
156
|
+
*
|
|
157
|
+
* @example
|
|
158
|
+
* ```typescript
|
|
159
|
+
* const bytes = new Uint8Array([1, 2, 3]);
|
|
160
|
+
*
|
|
161
|
+
* // This is equivalent to:
|
|
162
|
+
* // const dataView = new DataView(bytes.buffer, bytes.byteOffset, bytes.byteLength);
|
|
163
|
+
* const dataView = createDataView(bytes);
|
|
164
|
+
* ```
|
|
165
|
+
* @param bytes - The bytes to create the {@link DataView} from.
|
|
166
|
+
* @returns The {@link DataView}.
|
|
167
|
+
*/
|
|
168
|
+
export declare function createDataView(bytes: Uint8Array): DataView;
|
package/dist/bytes.js
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.concatBytes = exports.valueToBytes = exports.stringToBytes = exports.numberToBytes = exports.signedBigIntToBytes = exports.bigIntToBytes = exports.hexToBytes = exports.bytesToString = exports.bytesToNumber = exports.bytesToSignedBigInt = exports.bytesToBigInt = exports.bytesToHex = exports.assertIsBytes = exports.isBytes = void 0;
|
|
3
|
+
exports.createDataView = exports.concatBytes = exports.valueToBytes = exports.stringToBytes = exports.numberToBytes = exports.signedBigIntToBytes = exports.bigIntToBytes = exports.hexToBytes = exports.bytesToString = exports.bytesToNumber = exports.bytesToSignedBigInt = exports.bytesToBigInt = exports.bytesToHex = exports.assertIsBytes = exports.isBytes = void 0;
|
|
4
4
|
const assert_1 = require("./assert");
|
|
5
5
|
const hex_1 = require("./hex");
|
|
6
6
|
// '0'.charCodeAt(0) === 48
|
|
@@ -341,4 +341,34 @@ function concatBytes(values) {
|
|
|
341
341
|
return bytes;
|
|
342
342
|
}
|
|
343
343
|
exports.concatBytes = concatBytes;
|
|
344
|
+
/**
|
|
345
|
+
* Create a {@link DataView} from a {@link Uint8Array}. This is a convenience
|
|
346
|
+
* function that avoids having to create a {@link DataView} manually, which
|
|
347
|
+
* requires passing the `byteOffset` and `byteLength` parameters every time.
|
|
348
|
+
*
|
|
349
|
+
* Not passing the `byteOffset` and `byteLength` parameters can result in
|
|
350
|
+
* unexpected behavior when the {@link Uint8Array} is a view of a larger
|
|
351
|
+
* {@link ArrayBuffer}, e.g., when using {@link Uint8Array.subarray}.
|
|
352
|
+
*
|
|
353
|
+
* This function also supports Node.js {@link Buffer}s.
|
|
354
|
+
*
|
|
355
|
+
* @example
|
|
356
|
+
* ```typescript
|
|
357
|
+
* const bytes = new Uint8Array([1, 2, 3]);
|
|
358
|
+
*
|
|
359
|
+
* // This is equivalent to:
|
|
360
|
+
* // const dataView = new DataView(bytes.buffer, bytes.byteOffset, bytes.byteLength);
|
|
361
|
+
* const dataView = createDataView(bytes);
|
|
362
|
+
* ```
|
|
363
|
+
* @param bytes - The bytes to create the {@link DataView} from.
|
|
364
|
+
* @returns The {@link DataView}.
|
|
365
|
+
*/
|
|
366
|
+
function createDataView(bytes) {
|
|
367
|
+
if (typeof Buffer !== 'undefined' && bytes instanceof Buffer) {
|
|
368
|
+
const buffer = bytes.buffer.slice(bytes.byteOffset, bytes.byteOffset + bytes.byteLength);
|
|
369
|
+
return new DataView(buffer);
|
|
370
|
+
}
|
|
371
|
+
return new DataView(bytes.buffer, bytes.byteOffset, bytes.byteLength);
|
|
372
|
+
}
|
|
373
|
+
exports.createDataView = createDataView;
|
|
344
374
|
//# sourceMappingURL=bytes.js.map
|
package/dist/bytes.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"bytes.js","sourceRoot":"","sources":["../src/bytes.ts"],"names":[],"mappings":"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","sourcesContent":["import { assert } from './assert';\nimport { add0x, assertIsHexString, Hex, remove0x } from './hex';\n\n// '0'.charCodeAt(0) === 48\nconst HEX_MINIMUM_NUMBER_CHARACTER = 48;\n\n// '9'.charCodeAt(0) === 57\nconst HEX_MAXIMUM_NUMBER_CHARACTER = 58;\nconst HEX_CHARACTER_OFFSET = 87;\n\nexport type Bytes = bigint | number | string | Uint8Array;\n\n/**\n * Memoized function that returns an array to be used as a lookup table for\n * converting bytes to hexadecimal values.\n *\n * The array is created lazily and then cached for future use. The benefit of\n * this approach is that the performance of converting bytes to hex is much\n * better than if we were to call `toString(16)` on each byte.\n *\n * The downside is that the array is created once and then never garbage\n * collected. This is not a problem in practice because the array is only 256\n * elements long.\n *\n * @returns A function that returns the lookup table.\n */\nfunction getPrecomputedHexValuesBuilder(): () => string[] {\n // To avoid issues with tree shaking, we need to use a function to return the\n // array. This is because the array is only used in the `bytesToHex` function\n // and if we were to use a global variable, the array might be removed by the\n // tree shaker.\n const lookupTable: string[] = [];\n\n return () => {\n if (lookupTable.length === 0) {\n for (let i = 0; i < 256; i++) {\n lookupTable.push(i.toString(16).padStart(2, '0'));\n }\n }\n\n return lookupTable;\n };\n}\n\n/**\n * Function implementation of the {@link getPrecomputedHexValuesBuilder}\n * function.\n */\nconst getPrecomputedHexValues = getPrecomputedHexValuesBuilder();\n\n/**\n * Check if a value is a `Uint8Array`.\n *\n * @param value - The value to check.\n * @returns Whether the value is a `Uint8Array`.\n */\nexport function isBytes(value: unknown): value is Uint8Array {\n return value instanceof Uint8Array;\n}\n\n/**\n * Assert that a value is a `Uint8Array`.\n *\n * @param value - The value to check.\n * @throws If the value is not a `Uint8Array`.\n */\nexport function assertIsBytes(value: unknown): asserts value is Uint8Array {\n assert(isBytes(value), 'Value must be a Uint8Array.');\n}\n\n/**\n * Convert a `Uint8Array` to a hexadecimal string.\n *\n * @param bytes - The bytes to convert to a hexadecimal string.\n * @returns The hexadecimal string.\n */\nexport function bytesToHex(bytes: Uint8Array): Hex {\n assertIsBytes(bytes);\n\n if (bytes.length === 0) {\n return '0x';\n }\n\n const lookupTable = getPrecomputedHexValues();\n const hex = new Array(bytes.length);\n\n for (let i = 0; i < bytes.length; i++) {\n // eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n hex[i] = lookupTable[bytes[i]!];\n }\n\n return add0x(hex.join(''));\n}\n\n/**\n * Convert a `Uint8Array` to a `bigint`.\n *\n * To convert a `Uint8Array` to a `number` instead, use {@link bytesToNumber}.\n * To convert a two's complement encoded `Uint8Array` to a `bigint`, use\n * {@link bytesToSignedBigInt}.\n *\n * @param bytes - The bytes to convert to a `bigint`.\n * @returns The `bigint`.\n */\nexport function bytesToBigInt(bytes: Uint8Array): bigint {\n assertIsBytes(bytes);\n\n const hex = bytesToHex(bytes);\n return BigInt(hex);\n}\n\n/**\n * Convert a `Uint8Array` to a signed `bigint`. This assumes that the bytes are\n * encoded in two's complement.\n *\n * To convert a `Uint8Array` to an unsigned `bigint` instead, use\n * {@link bytesToBigInt}.\n *\n * @see https://en.wikipedia.org/wiki/Two%27s_complement\n * @param bytes - The bytes to convert to a signed `bigint`.\n * @returns The signed `bigint`.\n */\nexport function bytesToSignedBigInt(bytes: Uint8Array): bigint {\n assertIsBytes(bytes);\n\n let value = BigInt(0);\n for (const byte of bytes) {\n // eslint-disable-next-line no-bitwise\n value = (value << BigInt(8)) + BigInt(byte);\n }\n\n return BigInt.asIntN(bytes.length * 8, value);\n}\n\n/**\n * Convert a `Uint8Array` to a `number`.\n *\n * To convert a `Uint8Array` to a `bigint` instead, use {@link bytesToBigInt}.\n *\n * @param bytes - The bytes to convert to a number.\n * @returns The number.\n * @throws If the resulting number is not a safe integer.\n */\nexport function bytesToNumber(bytes: Uint8Array): number {\n assertIsBytes(bytes);\n\n const bigint = bytesToBigInt(bytes);\n\n assert(\n bigint <= BigInt(Number.MAX_SAFE_INTEGER),\n 'Number is not a safe integer. Use `bytesToBigInt` instead.',\n );\n\n return Number(bigint);\n}\n\n/**\n * Convert a UTF-8 encoded `Uint8Array` to a `string`.\n *\n * @param bytes - The bytes to convert to a string.\n * @returns The string.\n */\nexport function bytesToString(bytes: Uint8Array): string {\n assertIsBytes(bytes);\n\n return new TextDecoder().decode(bytes);\n}\n\n/**\n * Convert a hexadecimal string to a `Uint8Array`. The string can optionally be\n * prefixed with `0x`. It accepts even and odd length strings.\n *\n * If the value is \"0x\", an empty `Uint8Array` is returned.\n *\n * @param value - The hexadecimal string to convert to bytes.\n * @returns The bytes as `Uint8Array`.\n */\nexport function hexToBytes(value: string): Uint8Array {\n // \"0x\" is often used as empty byte array.\n if (value?.toLowerCase?.() === '0x') {\n return new Uint8Array();\n }\n\n assertIsHexString(value);\n\n // Remove the `0x` prefix if it exists, and pad the string to have an even\n // number of characters.\n const strippedValue = remove0x(value).toLowerCase();\n const normalizedValue =\n strippedValue.length % 2 === 0 ? strippedValue : `0${strippedValue}`;\n const bytes = new Uint8Array(normalizedValue.length / 2);\n\n for (let i = 0; i < bytes.length; i++) {\n // While this is not the prettiest way to convert a hexadecimal string to a\n // `Uint8Array`, it is a lot faster than using `parseInt` to convert each\n // character.\n const c1 = normalizedValue.charCodeAt(i * 2);\n const c2 = normalizedValue.charCodeAt(i * 2 + 1);\n const n1 =\n c1 -\n (c1 < HEX_MAXIMUM_NUMBER_CHARACTER\n ? HEX_MINIMUM_NUMBER_CHARACTER\n : HEX_CHARACTER_OFFSET);\n const n2 =\n c2 -\n (c2 < HEX_MAXIMUM_NUMBER_CHARACTER\n ? HEX_MINIMUM_NUMBER_CHARACTER\n : HEX_CHARACTER_OFFSET);\n\n bytes[i] = n1 * 16 + n2;\n }\n\n return bytes;\n}\n\n/**\n * Convert a `bigint` to a `Uint8Array`.\n *\n * This assumes that the `bigint` is an unsigned integer. To convert a signed\n * `bigint` instead, use {@link signedBigIntToBytes}.\n *\n * @param value - The bigint to convert to bytes.\n * @returns The bytes as `Uint8Array`.\n */\nexport function bigIntToBytes(value: bigint): Uint8Array {\n assert(typeof value === 'bigint', 'Value must be a bigint.');\n assert(value >= BigInt(0), 'Value must be a non-negative bigint.');\n\n const hex = value.toString(16);\n return hexToBytes(hex);\n}\n\n/**\n * Check if a `bigint` fits in a certain number of bytes.\n *\n * @param value - The `bigint` to check.\n * @param bytes - The number of bytes.\n * @returns Whether the `bigint` fits in the number of bytes.\n */\nfunction bigIntFits(value: bigint, bytes: number): boolean {\n assert(bytes > 0);\n\n /* eslint-disable no-bitwise */\n const mask = value >> BigInt(31);\n return !(((~value & mask) + (value & ~mask)) >> BigInt(bytes * 8 + ~0));\n /* eslint-enable no-bitwise */\n}\n\n/**\n * Convert a signed `bigint` to a `Uint8Array`. This uses two's complement\n * encoding to represent negative numbers.\n *\n * To convert an unsigned `bigint` to a `Uint8Array` instead, use\n * {@link bigIntToBytes}.\n *\n * @see https://en.wikipedia.org/wiki/Two%27s_complement\n * @param value - The number to convert to bytes.\n * @param byteLength - The length of the resulting `Uint8Array`. If the number\n * is larger than the maximum value that can be represented by the given length,\n * an error is thrown.\n * @returns The bytes as `Uint8Array`.\n */\nexport function signedBigIntToBytes(\n value: bigint,\n byteLength: number,\n): Uint8Array {\n assert(typeof value === 'bigint', 'Value must be a bigint.');\n assert(typeof byteLength === 'number', 'Byte length must be a number.');\n assert(byteLength > 0, 'Byte length must be greater than 0.');\n assert(\n bigIntFits(value, byteLength),\n 'Byte length is too small to represent the given value.',\n );\n\n // ESLint doesn't like mutating function parameters, so to avoid having to\n // disable the rule, we create a new variable.\n let numberValue = value;\n const bytes = new Uint8Array(byteLength);\n\n for (let i = 0; i < bytes.length; i++) {\n bytes[i] = Number(BigInt.asUintN(8, numberValue));\n // eslint-disable-next-line no-bitwise\n numberValue >>= BigInt(8);\n }\n\n return bytes.reverse();\n}\n\n/**\n * Convert a `number` to a `Uint8Array`.\n *\n * @param value - The number to convert to bytes.\n * @returns The bytes as `Uint8Array`.\n * @throws If the number is not a safe integer.\n */\nexport function numberToBytes(value: number): Uint8Array {\n assert(typeof value === 'number', 'Value must be a number.');\n assert(value >= 0, 'Value must be a non-negative number.');\n assert(\n Number.isSafeInteger(value),\n 'Value is not a safe integer. Use `bigIntToBytes` instead.',\n );\n\n const hex = value.toString(16);\n return hexToBytes(hex);\n}\n\n/**\n * Convert a `string` to a UTF-8 encoded `Uint8Array`.\n *\n * @param value - The string to convert to bytes.\n * @returns The bytes as `Uint8Array`.\n */\nexport function stringToBytes(value: string): Uint8Array {\n assert(typeof value === 'string', 'Value must be a string.');\n\n return new TextEncoder().encode(value);\n}\n\n/**\n * Convert a byte-like value to a `Uint8Array`. The value can be a `Uint8Array`,\n * a `bigint`, a `number`, or a `string`.\n *\n * This will attempt to guess the type of the value based on its type and\n * contents. For more control over the conversion, use the more specific\n * conversion functions, such as {@link hexToBytes} or {@link stringToBytes}.\n *\n * If the value is a `string`, and it is prefixed with `0x`, it will be\n * interpreted as a hexadecimal string. Otherwise, it will be interpreted as a\n * UTF-8 string. To convert a hexadecimal string to bytes without interpreting\n * it as a UTF-8 string, use {@link hexToBytes} instead.\n *\n * If the value is a `bigint`, it is assumed to be unsigned. To convert a signed\n * `bigint` to bytes, use {@link signedBigIntToBytes} instead.\n *\n * If the value is a `Uint8Array`, it will be returned as-is.\n *\n * @param value - The value to convert to bytes.\n * @returns The bytes as `Uint8Array`.\n */\nexport function valueToBytes(value: Bytes): Uint8Array {\n if (typeof value === 'bigint') {\n return bigIntToBytes(value);\n }\n\n if (typeof value === 'number') {\n return numberToBytes(value);\n }\n\n if (typeof value === 'string') {\n if (value.startsWith('0x')) {\n return hexToBytes(value);\n }\n\n return stringToBytes(value);\n }\n\n if (isBytes(value)) {\n return value;\n }\n\n throw new TypeError(`Unsupported value type: \"${typeof value}\".`);\n}\n\n/**\n * Concatenate multiple byte-like values into a single `Uint8Array`. The values\n * can be `Uint8Array`, `bigint`, `number`, or `string`. This uses\n * {@link valueToBytes} under the hood to convert each value to bytes. Refer to\n * the documentation of that function for more information.\n *\n * @param values - The values to concatenate.\n * @returns The concatenated bytes as `Uint8Array`.\n */\nexport function concatBytes(values: Bytes[]): Uint8Array {\n const normalizedValues = new Array(values.length);\n let byteLength = 0;\n\n for (let i = 0; i < values.length; i++) {\n // eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n const value = valueToBytes(values[i]!);\n\n normalizedValues[i] = value;\n byteLength += value.length;\n }\n\n const bytes = new Uint8Array(byteLength);\n for (let i = 0, offset = 0; i < normalizedValues.length; i++) {\n // While we could simply spread the values into an array and use\n // `Uint8Array.from`, that is a lot slower than using `Uint8Array.set`.\n bytes.set(normalizedValues[i], offset);\n offset += normalizedValues[i].length;\n }\n\n return bytes;\n}\n"]}
|
|
1
|
+
{"version":3,"file":"bytes.js","sourceRoot":"","sources":["../src/bytes.ts"],"names":[],"mappings":"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","sourcesContent":["import { assert } from './assert';\nimport { add0x, assertIsHexString, Hex, remove0x } from './hex';\n\n// '0'.charCodeAt(0) === 48\nconst HEX_MINIMUM_NUMBER_CHARACTER = 48;\n\n// '9'.charCodeAt(0) === 57\nconst HEX_MAXIMUM_NUMBER_CHARACTER = 58;\nconst HEX_CHARACTER_OFFSET = 87;\n\nexport type Bytes = bigint | number | string | Uint8Array;\n\n/**\n * Memoized function that returns an array to be used as a lookup table for\n * converting bytes to hexadecimal values.\n *\n * The array is created lazily and then cached for future use. The benefit of\n * this approach is that the performance of converting bytes to hex is much\n * better than if we were to call `toString(16)` on each byte.\n *\n * The downside is that the array is created once and then never garbage\n * collected. This is not a problem in practice because the array is only 256\n * elements long.\n *\n * @returns A function that returns the lookup table.\n */\nfunction getPrecomputedHexValuesBuilder(): () => string[] {\n // To avoid issues with tree shaking, we need to use a function to return the\n // array. This is because the array is only used in the `bytesToHex` function\n // and if we were to use a global variable, the array might be removed by the\n // tree shaker.\n const lookupTable: string[] = [];\n\n return () => {\n if (lookupTable.length === 0) {\n for (let i = 0; i < 256; i++) {\n lookupTable.push(i.toString(16).padStart(2, '0'));\n }\n }\n\n return lookupTable;\n };\n}\n\n/**\n * Function implementation of the {@link getPrecomputedHexValuesBuilder}\n * function.\n */\nconst getPrecomputedHexValues = getPrecomputedHexValuesBuilder();\n\n/**\n * Check if a value is a `Uint8Array`.\n *\n * @param value - The value to check.\n * @returns Whether the value is a `Uint8Array`.\n */\nexport function isBytes(value: unknown): value is Uint8Array {\n return value instanceof Uint8Array;\n}\n\n/**\n * Assert that a value is a `Uint8Array`.\n *\n * @param value - The value to check.\n * @throws If the value is not a `Uint8Array`.\n */\nexport function assertIsBytes(value: unknown): asserts value is Uint8Array {\n assert(isBytes(value), 'Value must be a Uint8Array.');\n}\n\n/**\n * Convert a `Uint8Array` to a hexadecimal string.\n *\n * @param bytes - The bytes to convert to a hexadecimal string.\n * @returns The hexadecimal string.\n */\nexport function bytesToHex(bytes: Uint8Array): Hex {\n assertIsBytes(bytes);\n\n if (bytes.length === 0) {\n return '0x';\n }\n\n const lookupTable = getPrecomputedHexValues();\n const hex = new Array(bytes.length);\n\n for (let i = 0; i < bytes.length; i++) {\n // eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n hex[i] = lookupTable[bytes[i]!];\n }\n\n return add0x(hex.join(''));\n}\n\n/**\n * Convert a `Uint8Array` to a `bigint`.\n *\n * To convert a `Uint8Array` to a `number` instead, use {@link bytesToNumber}.\n * To convert a two's complement encoded `Uint8Array` to a `bigint`, use\n * {@link bytesToSignedBigInt}.\n *\n * @param bytes - The bytes to convert to a `bigint`.\n * @returns The `bigint`.\n */\nexport function bytesToBigInt(bytes: Uint8Array): bigint {\n assertIsBytes(bytes);\n\n const hex = bytesToHex(bytes);\n return BigInt(hex);\n}\n\n/**\n * Convert a `Uint8Array` to a signed `bigint`. This assumes that the bytes are\n * encoded in two's complement.\n *\n * To convert a `Uint8Array` to an unsigned `bigint` instead, use\n * {@link bytesToBigInt}.\n *\n * @see https://en.wikipedia.org/wiki/Two%27s_complement\n * @param bytes - The bytes to convert to a signed `bigint`.\n * @returns The signed `bigint`.\n */\nexport function bytesToSignedBigInt(bytes: Uint8Array): bigint {\n assertIsBytes(bytes);\n\n let value = BigInt(0);\n for (const byte of bytes) {\n // eslint-disable-next-line no-bitwise\n value = (value << BigInt(8)) + BigInt(byte);\n }\n\n return BigInt.asIntN(bytes.length * 8, value);\n}\n\n/**\n * Convert a `Uint8Array` to a `number`.\n *\n * To convert a `Uint8Array` to a `bigint` instead, use {@link bytesToBigInt}.\n *\n * @param bytes - The bytes to convert to a number.\n * @returns The number.\n * @throws If the resulting number is not a safe integer.\n */\nexport function bytesToNumber(bytes: Uint8Array): number {\n assertIsBytes(bytes);\n\n const bigint = bytesToBigInt(bytes);\n\n assert(\n bigint <= BigInt(Number.MAX_SAFE_INTEGER),\n 'Number is not a safe integer. Use `bytesToBigInt` instead.',\n );\n\n return Number(bigint);\n}\n\n/**\n * Convert a UTF-8 encoded `Uint8Array` to a `string`.\n *\n * @param bytes - The bytes to convert to a string.\n * @returns The string.\n */\nexport function bytesToString(bytes: Uint8Array): string {\n assertIsBytes(bytes);\n\n return new TextDecoder().decode(bytes);\n}\n\n/**\n * Convert a hexadecimal string to a `Uint8Array`. The string can optionally be\n * prefixed with `0x`. It accepts even and odd length strings.\n *\n * If the value is \"0x\", an empty `Uint8Array` is returned.\n *\n * @param value - The hexadecimal string to convert to bytes.\n * @returns The bytes as `Uint8Array`.\n */\nexport function hexToBytes(value: string): Uint8Array {\n // \"0x\" is often used as empty byte array.\n if (value?.toLowerCase?.() === '0x') {\n return new Uint8Array();\n }\n\n assertIsHexString(value);\n\n // Remove the `0x` prefix if it exists, and pad the string to have an even\n // number of characters.\n const strippedValue = remove0x(value).toLowerCase();\n const normalizedValue =\n strippedValue.length % 2 === 0 ? strippedValue : `0${strippedValue}`;\n const bytes = new Uint8Array(normalizedValue.length / 2);\n\n for (let i = 0; i < bytes.length; i++) {\n // While this is not the prettiest way to convert a hexadecimal string to a\n // `Uint8Array`, it is a lot faster than using `parseInt` to convert each\n // character.\n const c1 = normalizedValue.charCodeAt(i * 2);\n const c2 = normalizedValue.charCodeAt(i * 2 + 1);\n const n1 =\n c1 -\n (c1 < HEX_MAXIMUM_NUMBER_CHARACTER\n ? HEX_MINIMUM_NUMBER_CHARACTER\n : HEX_CHARACTER_OFFSET);\n const n2 =\n c2 -\n (c2 < HEX_MAXIMUM_NUMBER_CHARACTER\n ? HEX_MINIMUM_NUMBER_CHARACTER\n : HEX_CHARACTER_OFFSET);\n\n bytes[i] = n1 * 16 + n2;\n }\n\n return bytes;\n}\n\n/**\n * Convert a `bigint` to a `Uint8Array`.\n *\n * This assumes that the `bigint` is an unsigned integer. To convert a signed\n * `bigint` instead, use {@link signedBigIntToBytes}.\n *\n * @param value - The bigint to convert to bytes.\n * @returns The bytes as `Uint8Array`.\n */\nexport function bigIntToBytes(value: bigint): Uint8Array {\n assert(typeof value === 'bigint', 'Value must be a bigint.');\n assert(value >= BigInt(0), 'Value must be a non-negative bigint.');\n\n const hex = value.toString(16);\n return hexToBytes(hex);\n}\n\n/**\n * Check if a `bigint` fits in a certain number of bytes.\n *\n * @param value - The `bigint` to check.\n * @param bytes - The number of bytes.\n * @returns Whether the `bigint` fits in the number of bytes.\n */\nfunction bigIntFits(value: bigint, bytes: number): boolean {\n assert(bytes > 0);\n\n /* eslint-disable no-bitwise */\n const mask = value >> BigInt(31);\n return !(((~value & mask) + (value & ~mask)) >> BigInt(bytes * 8 + ~0));\n /* eslint-enable no-bitwise */\n}\n\n/**\n * Convert a signed `bigint` to a `Uint8Array`. This uses two's complement\n * encoding to represent negative numbers.\n *\n * To convert an unsigned `bigint` to a `Uint8Array` instead, use\n * {@link bigIntToBytes}.\n *\n * @see https://en.wikipedia.org/wiki/Two%27s_complement\n * @param value - The number to convert to bytes.\n * @param byteLength - The length of the resulting `Uint8Array`. If the number\n * is larger than the maximum value that can be represented by the given length,\n * an error is thrown.\n * @returns The bytes as `Uint8Array`.\n */\nexport function signedBigIntToBytes(\n value: bigint,\n byteLength: number,\n): Uint8Array {\n assert(typeof value === 'bigint', 'Value must be a bigint.');\n assert(typeof byteLength === 'number', 'Byte length must be a number.');\n assert(byteLength > 0, 'Byte length must be greater than 0.');\n assert(\n bigIntFits(value, byteLength),\n 'Byte length is too small to represent the given value.',\n );\n\n // ESLint doesn't like mutating function parameters, so to avoid having to\n // disable the rule, we create a new variable.\n let numberValue = value;\n const bytes = new Uint8Array(byteLength);\n\n for (let i = 0; i < bytes.length; i++) {\n bytes[i] = Number(BigInt.asUintN(8, numberValue));\n // eslint-disable-next-line no-bitwise\n numberValue >>= BigInt(8);\n }\n\n return bytes.reverse();\n}\n\n/**\n * Convert a `number` to a `Uint8Array`.\n *\n * @param value - The number to convert to bytes.\n * @returns The bytes as `Uint8Array`.\n * @throws If the number is not a safe integer.\n */\nexport function numberToBytes(value: number): Uint8Array {\n assert(typeof value === 'number', 'Value must be a number.');\n assert(value >= 0, 'Value must be a non-negative number.');\n assert(\n Number.isSafeInteger(value),\n 'Value is not a safe integer. Use `bigIntToBytes` instead.',\n );\n\n const hex = value.toString(16);\n return hexToBytes(hex);\n}\n\n/**\n * Convert a `string` to a UTF-8 encoded `Uint8Array`.\n *\n * @param value - The string to convert to bytes.\n * @returns The bytes as `Uint8Array`.\n */\nexport function stringToBytes(value: string): Uint8Array {\n assert(typeof value === 'string', 'Value must be a string.');\n\n return new TextEncoder().encode(value);\n}\n\n/**\n * Convert a byte-like value to a `Uint8Array`. The value can be a `Uint8Array`,\n * a `bigint`, a `number`, or a `string`.\n *\n * This will attempt to guess the type of the value based on its type and\n * contents. For more control over the conversion, use the more specific\n * conversion functions, such as {@link hexToBytes} or {@link stringToBytes}.\n *\n * If the value is a `string`, and it is prefixed with `0x`, it will be\n * interpreted as a hexadecimal string. Otherwise, it will be interpreted as a\n * UTF-8 string. To convert a hexadecimal string to bytes without interpreting\n * it as a UTF-8 string, use {@link hexToBytes} instead.\n *\n * If the value is a `bigint`, it is assumed to be unsigned. To convert a signed\n * `bigint` to bytes, use {@link signedBigIntToBytes} instead.\n *\n * If the value is a `Uint8Array`, it will be returned as-is.\n *\n * @param value - The value to convert to bytes.\n * @returns The bytes as `Uint8Array`.\n */\nexport function valueToBytes(value: Bytes): Uint8Array {\n if (typeof value === 'bigint') {\n return bigIntToBytes(value);\n }\n\n if (typeof value === 'number') {\n return numberToBytes(value);\n }\n\n if (typeof value === 'string') {\n if (value.startsWith('0x')) {\n return hexToBytes(value);\n }\n\n return stringToBytes(value);\n }\n\n if (isBytes(value)) {\n return value;\n }\n\n throw new TypeError(`Unsupported value type: \"${typeof value}\".`);\n}\n\n/**\n * Concatenate multiple byte-like values into a single `Uint8Array`. The values\n * can be `Uint8Array`, `bigint`, `number`, or `string`. This uses\n * {@link valueToBytes} under the hood to convert each value to bytes. Refer to\n * the documentation of that function for more information.\n *\n * @param values - The values to concatenate.\n * @returns The concatenated bytes as `Uint8Array`.\n */\nexport function concatBytes(values: Bytes[]): Uint8Array {\n const normalizedValues = new Array(values.length);\n let byteLength = 0;\n\n for (let i = 0; i < values.length; i++) {\n // eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n const value = valueToBytes(values[i]!);\n\n normalizedValues[i] = value;\n byteLength += value.length;\n }\n\n const bytes = new Uint8Array(byteLength);\n for (let i = 0, offset = 0; i < normalizedValues.length; i++) {\n // While we could simply spread the values into an array and use\n // `Uint8Array.from`, that is a lot slower than using `Uint8Array.set`.\n bytes.set(normalizedValues[i], offset);\n offset += normalizedValues[i].length;\n }\n\n return bytes;\n}\n\n/**\n * Create a {@link DataView} from a {@link Uint8Array}. This is a convenience\n * function that avoids having to create a {@link DataView} manually, which\n * requires passing the `byteOffset` and `byteLength` parameters every time.\n *\n * Not passing the `byteOffset` and `byteLength` parameters can result in\n * unexpected behavior when the {@link Uint8Array} is a view of a larger\n * {@link ArrayBuffer}, e.g., when using {@link Uint8Array.subarray}.\n *\n * This function also supports Node.js {@link Buffer}s.\n *\n * @example\n * ```typescript\n * const bytes = new Uint8Array([1, 2, 3]);\n *\n * // This is equivalent to:\n * // const dataView = new DataView(bytes.buffer, bytes.byteOffset, bytes.byteLength);\n * const dataView = createDataView(bytes);\n * ```\n * @param bytes - The bytes to create the {@link DataView} from.\n * @returns The {@link DataView}.\n */\nexport function createDataView(bytes: Uint8Array): DataView {\n if (typeof Buffer !== 'undefined' && bytes instanceof Buffer) {\n const buffer = bytes.buffer.slice(\n bytes.byteOffset,\n bytes.byteOffset + bytes.byteLength,\n );\n\n return new DataView(buffer);\n }\n\n return new DataView(bytes.buffer, bytes.byteOffset, bytes.byteLength);\n}\n"]}
|
package/dist/json.d.ts
CHANGED
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import { Infer, Struct } from 'superstruct';
|
|
2
|
-
|
|
2
|
+
import { AssertionErrorConstructor } from './assert';
|
|
3
|
+
export declare const JsonStruct: Struct<Json, null>;
|
|
3
4
|
/**
|
|
4
5
|
* Any JSON-compatible value.
|
|
5
6
|
*/
|
|
@@ -7,10 +8,11 @@ export declare type Json = null | boolean | number | string | Json[] | {
|
|
|
7
8
|
[prop: string]: Json;
|
|
8
9
|
};
|
|
9
10
|
/**
|
|
10
|
-
*
|
|
11
|
+
* Check if the given value is a valid {@link Json} value, i.e., a value that is
|
|
12
|
+
* serializable to JSON.
|
|
11
13
|
*
|
|
12
14
|
* @param value - The value to check.
|
|
13
|
-
* @returns Whether the value is valid
|
|
15
|
+
* @returns Whether the value is a valid {@link Json} value.
|
|
14
16
|
*/
|
|
15
17
|
export declare function isValidJson(value: unknown): value is Json;
|
|
16
18
|
/**
|
|
@@ -33,13 +35,13 @@ export declare const JsonRpcIdStruct: Struct<string | number | null, null>;
|
|
|
33
35
|
export declare type JsonRpcId = Infer<typeof JsonRpcIdStruct>;
|
|
34
36
|
export declare const JsonRpcErrorStruct: Struct<{
|
|
35
37
|
code: number;
|
|
36
|
-
data: unknown;
|
|
37
38
|
message: string;
|
|
39
|
+
data?: Json | undefined;
|
|
38
40
|
stack?: string | undefined;
|
|
39
41
|
}, {
|
|
40
42
|
code: Struct<number, null>;
|
|
41
43
|
message: Struct<string, null>;
|
|
42
|
-
data: Struct<
|
|
44
|
+
data: Struct<Json | undefined, null>;
|
|
43
45
|
stack: Struct<string | undefined, null>;
|
|
44
46
|
}>;
|
|
45
47
|
/**
|
|
@@ -91,43 +93,46 @@ export declare const JsonRpcNotificationStruct: Struct<{
|
|
|
91
93
|
*/
|
|
92
94
|
export declare type JsonRpcNotification<Params extends JsonRpcParams> = InferWithParams<typeof JsonRpcNotificationStruct, Params>;
|
|
93
95
|
/**
|
|
94
|
-
*
|
|
95
|
-
* {@link JsonRpcNotification} object to a {@link JsonRpcNotification}.
|
|
96
|
+
* Check if the given value is a valid {@link JsonRpcNotification} object.
|
|
96
97
|
*
|
|
97
|
-
* @param
|
|
98
|
-
* @returns Whether the
|
|
98
|
+
* @param value - The value to check.
|
|
99
|
+
* @returns Whether the given value is a valid {@link JsonRpcNotification}
|
|
100
|
+
* object.
|
|
99
101
|
*/
|
|
100
|
-
export declare function isJsonRpcNotification(
|
|
102
|
+
export declare function isJsonRpcNotification(value: unknown): value is JsonRpcNotification<JsonRpcParams>;
|
|
101
103
|
/**
|
|
102
|
-
*
|
|
103
|
-
* {@link JsonRpcNotification} object to a {@link JsonRpcNotification}.
|
|
104
|
+
* Assert that the given value is a valid {@link JsonRpcNotification} object.
|
|
104
105
|
*
|
|
105
|
-
* @param
|
|
106
|
+
* @param value - The value to check.
|
|
107
|
+
* @param ErrorWrapper - The error class to throw if the assertion fails.
|
|
108
|
+
* Defaults to {@link AssertionError}.
|
|
109
|
+
* @throws If the given value is not a valid {@link JsonRpcNotification} object.
|
|
106
110
|
*/
|
|
107
|
-
export declare function assertIsJsonRpcNotification(
|
|
111
|
+
export declare function assertIsJsonRpcNotification(value: unknown, ErrorWrapper?: AssertionErrorConstructor): asserts value is JsonRpcNotification<JsonRpcParams>;
|
|
108
112
|
/**
|
|
109
|
-
*
|
|
110
|
-
* object to a {@link JsonRpcRequest}.
|
|
113
|
+
* Check if the given value is a valid {@link JsonRpcRequest} object.
|
|
111
114
|
*
|
|
112
|
-
* @param
|
|
113
|
-
* @returns Whether the
|
|
115
|
+
* @param value - The value to check.
|
|
116
|
+
* @returns Whether the given value is a valid {@link JsonRpcRequest} object.
|
|
114
117
|
*/
|
|
115
|
-
export declare function isJsonRpcRequest(
|
|
118
|
+
export declare function isJsonRpcRequest(value: unknown): value is JsonRpcRequest<JsonRpcParams>;
|
|
116
119
|
/**
|
|
117
|
-
*
|
|
118
|
-
* {@link JsonRpcNotification} object to a {@link JsonRpcRequest}.
|
|
120
|
+
* Assert that the given value is a valid {@link JsonRpcRequest} object.
|
|
119
121
|
*
|
|
120
|
-
* @param
|
|
122
|
+
* @param value - The JSON-RPC request or notification to check.
|
|
123
|
+
* @param ErrorWrapper - The error class to throw if the assertion fails.
|
|
124
|
+
* Defaults to {@link AssertionError}.
|
|
125
|
+
* @throws If the given value is not a valid {@link JsonRpcRequest} object.
|
|
121
126
|
*/
|
|
122
|
-
export declare function assertIsJsonRpcRequest(
|
|
127
|
+
export declare function assertIsJsonRpcRequest(value: unknown, ErrorWrapper?: AssertionErrorConstructor): asserts value is JsonRpcRequest<JsonRpcParams>;
|
|
123
128
|
export declare const PendingJsonRpcResponseStruct: Struct<{
|
|
124
129
|
id: string | number | null;
|
|
125
130
|
jsonrpc: "2.0";
|
|
126
131
|
result: unknown;
|
|
127
132
|
error?: {
|
|
128
133
|
code: number;
|
|
129
|
-
data: unknown;
|
|
130
134
|
message: string;
|
|
135
|
+
data?: Json | undefined;
|
|
131
136
|
stack?: string | undefined;
|
|
132
137
|
} | undefined;
|
|
133
138
|
}, {
|
|
@@ -136,13 +141,13 @@ export declare const PendingJsonRpcResponseStruct: Struct<{
|
|
|
136
141
|
result: Struct<unknown, null>;
|
|
137
142
|
error: Struct<{
|
|
138
143
|
code: number;
|
|
139
|
-
data: unknown;
|
|
140
144
|
message: string;
|
|
145
|
+
data?: Json | undefined;
|
|
141
146
|
stack?: string | undefined;
|
|
142
147
|
} | undefined, {
|
|
143
148
|
code: Struct<number, null>;
|
|
144
149
|
message: Struct<string, null>;
|
|
145
|
-
data: Struct<
|
|
150
|
+
data: Struct<Json | undefined, null>;
|
|
146
151
|
stack: Struct<string | undefined, null>;
|
|
147
152
|
}>;
|
|
148
153
|
}>;
|
|
@@ -159,7 +164,7 @@ export declare const JsonRpcSuccessStruct: Struct<{
|
|
|
159
164
|
}, {
|
|
160
165
|
id: Struct<string | number | null, null>;
|
|
161
166
|
jsonrpc: Struct<"2.0", "2.0">;
|
|
162
|
-
result: Struct<Json,
|
|
167
|
+
result: Struct<Json, null>;
|
|
163
168
|
}>;
|
|
164
169
|
/**
|
|
165
170
|
* A successful JSON-RPC response object.
|
|
@@ -205,13 +210,15 @@ export declare type JsonRpcResponse<Result extends Json> = JsonRpcSuccess<Result
|
|
|
205
210
|
*/
|
|
206
211
|
export declare function isPendingJsonRpcResponse(response: unknown): response is PendingJsonRpcResponse<Json>;
|
|
207
212
|
/**
|
|
208
|
-
* Assert that the
|
|
209
|
-
* {@link PendingJsonRpcResponse}.
|
|
213
|
+
* Assert that the given value is a valid {@link PendingJsonRpcResponse} object.
|
|
210
214
|
*
|
|
211
215
|
* @param response - The JSON-RPC response to check.
|
|
212
|
-
* @
|
|
216
|
+
* @param ErrorWrapper - The error class to throw if the assertion fails.
|
|
217
|
+
* Defaults to {@link AssertionError}.
|
|
218
|
+
* @throws If the given value is not a valid {@link PendingJsonRpcResponse}
|
|
219
|
+
* object.
|
|
213
220
|
*/
|
|
214
|
-
export declare function assertIsPendingJsonRpcResponse(response: unknown): asserts response is PendingJsonRpcResponse<Json>;
|
|
221
|
+
export declare function assertIsPendingJsonRpcResponse(response: unknown, ErrorWrapper?: AssertionErrorConstructor): asserts response is PendingJsonRpcResponse<Json>;
|
|
215
222
|
/**
|
|
216
223
|
* Type guard to check if a value is a {@link JsonRpcResponse}.
|
|
217
224
|
*
|
|
@@ -220,42 +227,62 @@ export declare function assertIsPendingJsonRpcResponse(response: unknown): asser
|
|
|
220
227
|
*/
|
|
221
228
|
export declare function isJsonRpcResponse(response: unknown): response is JsonRpcResponse<Json>;
|
|
222
229
|
/**
|
|
223
|
-
*
|
|
230
|
+
* Assert that the given value is a valid {@link JsonRpcResponse} object.
|
|
224
231
|
*
|
|
225
|
-
* @param
|
|
232
|
+
* @param value - The value to check.
|
|
233
|
+
* @param ErrorWrapper - The error class to throw if the assertion fails.
|
|
234
|
+
* Defaults to {@link AssertionError}.
|
|
235
|
+
* @throws If the given value is not a valid {@link JsonRpcResponse} object.
|
|
226
236
|
*/
|
|
227
|
-
export declare function assertIsJsonRpcResponse(
|
|
237
|
+
export declare function assertIsJsonRpcResponse(value: unknown, ErrorWrapper?: AssertionErrorConstructor): asserts value is JsonRpcResponse<Json>;
|
|
228
238
|
/**
|
|
229
|
-
*
|
|
230
|
-
* (or failure).
|
|
239
|
+
* Check if the given value is a valid {@link JsonRpcSuccess} object.
|
|
231
240
|
*
|
|
232
|
-
* @param
|
|
233
|
-
* @returns Whether the
|
|
241
|
+
* @param value - The value to check.
|
|
242
|
+
* @returns Whether the given value is a valid {@link JsonRpcSuccess} object.
|
|
234
243
|
*/
|
|
235
|
-
export declare function isJsonRpcSuccess(
|
|
244
|
+
export declare function isJsonRpcSuccess(value: unknown): value is JsonRpcSuccess<Json>;
|
|
236
245
|
/**
|
|
237
|
-
*
|
|
238
|
-
* (or failure).
|
|
246
|
+
* Assert that the given value is a valid {@link JsonRpcSuccess} object.
|
|
239
247
|
*
|
|
240
|
-
* @param
|
|
248
|
+
* @param value - The value to check.
|
|
249
|
+
* @param ErrorWrapper - The error class to throw if the assertion fails.
|
|
250
|
+
* Defaults to {@link AssertionError}.
|
|
251
|
+
* @throws If the given value is not a valid {@link JsonRpcSuccess} object.
|
|
241
252
|
*/
|
|
242
|
-
export declare function assertIsJsonRpcSuccess(
|
|
253
|
+
export declare function assertIsJsonRpcSuccess(value: unknown, ErrorWrapper?: AssertionErrorConstructor): asserts value is JsonRpcSuccess<Json>;
|
|
243
254
|
/**
|
|
244
|
-
*
|
|
245
|
-
* (or success).
|
|
255
|
+
* Check if the given value is a valid {@link JsonRpcFailure} object.
|
|
246
256
|
*
|
|
247
|
-
* @param
|
|
248
|
-
* @returns Whether the
|
|
249
|
-
* property.
|
|
257
|
+
* @param value - The value to check.
|
|
258
|
+
* @returns Whether the given value is a valid {@link JsonRpcFailure} object.
|
|
250
259
|
*/
|
|
251
|
-
export declare function isJsonRpcFailure(
|
|
260
|
+
export declare function isJsonRpcFailure(value: unknown): value is JsonRpcFailure;
|
|
252
261
|
/**
|
|
253
|
-
*
|
|
254
|
-
* (or success).
|
|
262
|
+
* Assert that the given value is a valid {@link JsonRpcFailure} object.
|
|
255
263
|
*
|
|
256
|
-
* @param
|
|
264
|
+
* @param value - The value to check.
|
|
265
|
+
* @param ErrorWrapper - The error class to throw if the assertion fails.
|
|
266
|
+
* Defaults to {@link AssertionError}.
|
|
267
|
+
* @throws If the given value is not a valid {@link JsonRpcFailure} object.
|
|
268
|
+
*/
|
|
269
|
+
export declare function assertIsJsonRpcFailure(value: unknown, ErrorWrapper?: AssertionErrorConstructor): asserts value is JsonRpcFailure;
|
|
270
|
+
/**
|
|
271
|
+
* Check if the given value is a valid {@link JsonRpcError} object.
|
|
272
|
+
*
|
|
273
|
+
* @param value - The value to check.
|
|
274
|
+
* @returns Whether the given value is a valid {@link JsonRpcError} object.
|
|
275
|
+
*/
|
|
276
|
+
export declare function isJsonRpcError(value: unknown): value is JsonRpcError;
|
|
277
|
+
/**
|
|
278
|
+
* Assert that the given value is a valid {@link JsonRpcError} object.
|
|
279
|
+
*
|
|
280
|
+
* @param value - The value to check.
|
|
281
|
+
* @param ErrorWrapper - The error class to throw if the assertion fails.
|
|
282
|
+
* Defaults to {@link AssertionError}.
|
|
283
|
+
* @throws If the given value is not a valid {@link JsonRpcError} object.
|
|
257
284
|
*/
|
|
258
|
-
export declare function
|
|
285
|
+
export declare function assertIsJsonRpcError(value: unknown, ErrorWrapper?: AssertionErrorConstructor): asserts value is JsonRpcError;
|
|
259
286
|
declare type JsonRpcValidatorOptions = {
|
|
260
287
|
permitEmptyString?: boolean;
|
|
261
288
|
permitFractions?: boolean;
|
package/dist/json.js
CHANGED
|
@@ -1,44 +1,22 @@
|
|
|
1
1
|
"use strict";
|
|
2
|
-
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
-
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
-
};
|
|
5
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
-
exports.validateJsonAndGetSize = exports.getJsonRpcIdValidator = exports.assertIsJsonRpcFailure = exports.isJsonRpcFailure = exports.assertIsJsonRpcSuccess = exports.isJsonRpcSuccess = exports.assertIsJsonRpcResponse = exports.isJsonRpcResponse = exports.assertIsPendingJsonRpcResponse = exports.isPendingJsonRpcResponse = exports.JsonRpcResponseStruct = exports.JsonRpcFailureStruct = exports.JsonRpcSuccessStruct = exports.PendingJsonRpcResponseStruct = exports.assertIsJsonRpcRequest = exports.isJsonRpcRequest = exports.assertIsJsonRpcNotification = exports.isJsonRpcNotification = exports.JsonRpcNotificationStruct = exports.JsonRpcRequestStruct = exports.JsonRpcParamsStruct = exports.JsonRpcErrorStruct = exports.JsonRpcIdStruct = exports.JsonRpcVersionStruct = exports.jsonrpc2 = exports.isValidJson = exports.JsonStruct = void 0;
|
|
7
|
-
const fast_deep_equal_1 = __importDefault(require("fast-deep-equal"));
|
|
3
|
+
exports.validateJsonAndGetSize = exports.getJsonRpcIdValidator = exports.assertIsJsonRpcError = exports.isJsonRpcError = exports.assertIsJsonRpcFailure = exports.isJsonRpcFailure = exports.assertIsJsonRpcSuccess = exports.isJsonRpcSuccess = exports.assertIsJsonRpcResponse = exports.isJsonRpcResponse = exports.assertIsPendingJsonRpcResponse = exports.isPendingJsonRpcResponse = exports.JsonRpcResponseStruct = exports.JsonRpcFailureStruct = exports.JsonRpcSuccessStruct = exports.PendingJsonRpcResponseStruct = exports.assertIsJsonRpcRequest = exports.isJsonRpcRequest = exports.assertIsJsonRpcNotification = exports.isJsonRpcNotification = exports.JsonRpcNotificationStruct = exports.JsonRpcRequestStruct = exports.JsonRpcParamsStruct = exports.JsonRpcErrorStruct = exports.JsonRpcIdStruct = exports.JsonRpcVersionStruct = exports.jsonrpc2 = exports.isValidJson = exports.JsonStruct = void 0;
|
|
8
4
|
const superstruct_1 = require("superstruct");
|
|
9
5
|
const misc_1 = require("./misc");
|
|
6
|
+
const assert_1 = require("./assert");
|
|
7
|
+
exports.JsonStruct = (0, superstruct_1.define)('Json', (value) => {
|
|
8
|
+
const [isValid] = validateJsonAndGetSize(value, true);
|
|
9
|
+
return isValid;
|
|
10
|
+
});
|
|
10
11
|
/**
|
|
11
|
-
*
|
|
12
|
-
*
|
|
13
|
-
*
|
|
14
|
-
* @param error - The object to check.
|
|
15
|
-
* @returns True or false, depending on the result.
|
|
16
|
-
*/
|
|
17
|
-
function isErrorWithMessage(error) {
|
|
18
|
-
return typeof error === 'object' && error !== null && 'message' in error;
|
|
19
|
-
}
|
|
20
|
-
// Note: This struct references itself, so TypeScript cannot infer the type.
|
|
21
|
-
exports.JsonStruct = (0, superstruct_1.union)([
|
|
22
|
-
(0, superstruct_1.literal)(null),
|
|
23
|
-
(0, superstruct_1.boolean)(),
|
|
24
|
-
(0, superstruct_1.number)(),
|
|
25
|
-
(0, superstruct_1.string)(),
|
|
26
|
-
(0, superstruct_1.lazy)(() => (0, superstruct_1.array)(exports.JsonStruct)),
|
|
27
|
-
(0, superstruct_1.lazy)(() => (0, superstruct_1.record)((0, superstruct_1.string)(), exports.JsonStruct)),
|
|
28
|
-
]);
|
|
29
|
-
/**
|
|
30
|
-
* Type guard for {@link Json}.
|
|
12
|
+
* Check if the given value is a valid {@link Json} value, i.e., a value that is
|
|
13
|
+
* serializable to JSON.
|
|
31
14
|
*
|
|
32
15
|
* @param value - The value to check.
|
|
33
|
-
* @returns Whether the value is valid
|
|
16
|
+
* @returns Whether the value is a valid {@link Json} value.
|
|
34
17
|
*/
|
|
35
18
|
function isValidJson(value) {
|
|
36
|
-
|
|
37
|
-
return (0, fast_deep_equal_1.default)(value, JSON.parse(JSON.stringify(value)));
|
|
38
|
-
}
|
|
39
|
-
catch (_) {
|
|
40
|
-
return false;
|
|
41
|
-
}
|
|
19
|
+
return (0, superstruct_1.is)(value, exports.JsonStruct);
|
|
42
20
|
}
|
|
43
21
|
exports.isValidJson = isValidJson;
|
|
44
22
|
/**
|
|
@@ -48,9 +26,9 @@ exports.jsonrpc2 = '2.0';
|
|
|
48
26
|
exports.JsonRpcVersionStruct = (0, superstruct_1.literal)(exports.jsonrpc2);
|
|
49
27
|
exports.JsonRpcIdStruct = (0, superstruct_1.nullable)((0, superstruct_1.union)([(0, superstruct_1.number)(), (0, superstruct_1.string)()]));
|
|
50
28
|
exports.JsonRpcErrorStruct = (0, superstruct_1.object)({
|
|
51
|
-
code: (0, superstruct_1.
|
|
29
|
+
code: (0, superstruct_1.integer)(),
|
|
52
30
|
message: (0, superstruct_1.string)(),
|
|
53
|
-
data: (0, superstruct_1.optional)(
|
|
31
|
+
data: (0, superstruct_1.optional)(exports.JsonStruct),
|
|
54
32
|
stack: (0, superstruct_1.optional)((0, superstruct_1.string)()),
|
|
55
33
|
});
|
|
56
34
|
exports.JsonRpcParamsStruct = (0, superstruct_1.optional)((0, superstruct_1.union)([(0, superstruct_1.object)(), (0, superstruct_1.array)()]));
|
|
@@ -62,57 +40,48 @@ exports.JsonRpcRequestStruct = (0, superstruct_1.object)({
|
|
|
62
40
|
});
|
|
63
41
|
exports.JsonRpcNotificationStruct = (0, superstruct_1.omit)(exports.JsonRpcRequestStruct, ['id']);
|
|
64
42
|
/**
|
|
65
|
-
*
|
|
66
|
-
* {@link JsonRpcNotification} object to a {@link JsonRpcNotification}.
|
|
43
|
+
* Check if the given value is a valid {@link JsonRpcNotification} object.
|
|
67
44
|
*
|
|
68
|
-
* @param
|
|
69
|
-
* @returns Whether the
|
|
45
|
+
* @param value - The value to check.
|
|
46
|
+
* @returns Whether the given value is a valid {@link JsonRpcNotification}
|
|
47
|
+
* object.
|
|
70
48
|
*/
|
|
71
|
-
function isJsonRpcNotification(
|
|
72
|
-
return (0, superstruct_1.is)(
|
|
49
|
+
function isJsonRpcNotification(value) {
|
|
50
|
+
return (0, superstruct_1.is)(value, exports.JsonRpcNotificationStruct);
|
|
73
51
|
}
|
|
74
52
|
exports.isJsonRpcNotification = isJsonRpcNotification;
|
|
75
53
|
/**
|
|
76
|
-
*
|
|
77
|
-
* {@link JsonRpcNotification} object to a {@link JsonRpcNotification}.
|
|
54
|
+
* Assert that the given value is a valid {@link JsonRpcNotification} object.
|
|
78
55
|
*
|
|
79
|
-
* @param
|
|
56
|
+
* @param value - The value to check.
|
|
57
|
+
* @param ErrorWrapper - The error class to throw if the assertion fails.
|
|
58
|
+
* Defaults to {@link AssertionError}.
|
|
59
|
+
* @throws If the given value is not a valid {@link JsonRpcNotification} object.
|
|
80
60
|
*/
|
|
81
|
-
function assertIsJsonRpcNotification(
|
|
82
|
-
|
|
83
|
-
(0, superstruct_1.assert)(requestOrNotification, exports.JsonRpcNotificationStruct);
|
|
84
|
-
}
|
|
85
|
-
catch (error) {
|
|
86
|
-
const message = isErrorWithMessage(error) ? error.message : error;
|
|
87
|
-
throw new Error(`Not a JSON-RPC notification: ${message}.`);
|
|
88
|
-
}
|
|
61
|
+
function assertIsJsonRpcNotification(value, ErrorWrapper) {
|
|
62
|
+
(0, assert_1.assertStruct)(value, exports.JsonRpcNotificationStruct, 'Invalid JSON-RPC notification', ErrorWrapper);
|
|
89
63
|
}
|
|
90
64
|
exports.assertIsJsonRpcNotification = assertIsJsonRpcNotification;
|
|
91
65
|
/**
|
|
92
|
-
*
|
|
93
|
-
* object to a {@link JsonRpcRequest}.
|
|
66
|
+
* Check if the given value is a valid {@link JsonRpcRequest} object.
|
|
94
67
|
*
|
|
95
|
-
* @param
|
|
96
|
-
* @returns Whether the
|
|
68
|
+
* @param value - The value to check.
|
|
69
|
+
* @returns Whether the given value is a valid {@link JsonRpcRequest} object.
|
|
97
70
|
*/
|
|
98
|
-
function isJsonRpcRequest(
|
|
99
|
-
return (0, superstruct_1.is)(
|
|
71
|
+
function isJsonRpcRequest(value) {
|
|
72
|
+
return (0, superstruct_1.is)(value, exports.JsonRpcRequestStruct);
|
|
100
73
|
}
|
|
101
74
|
exports.isJsonRpcRequest = isJsonRpcRequest;
|
|
102
75
|
/**
|
|
103
|
-
*
|
|
104
|
-
* {@link JsonRpcNotification} object to a {@link JsonRpcRequest}.
|
|
76
|
+
* Assert that the given value is a valid {@link JsonRpcRequest} object.
|
|
105
77
|
*
|
|
106
|
-
* @param
|
|
78
|
+
* @param value - The JSON-RPC request or notification to check.
|
|
79
|
+
* @param ErrorWrapper - The error class to throw if the assertion fails.
|
|
80
|
+
* Defaults to {@link AssertionError}.
|
|
81
|
+
* @throws If the given value is not a valid {@link JsonRpcRequest} object.
|
|
107
82
|
*/
|
|
108
|
-
function assertIsJsonRpcRequest(
|
|
109
|
-
|
|
110
|
-
(0, superstruct_1.assert)(requestOrNotification, exports.JsonRpcRequestStruct);
|
|
111
|
-
}
|
|
112
|
-
catch (error) {
|
|
113
|
-
const message = isErrorWithMessage(error) ? error.message : error;
|
|
114
|
-
throw new Error(`Not a JSON-RPC request: ${message}.`);
|
|
115
|
-
}
|
|
83
|
+
function assertIsJsonRpcRequest(value, ErrorWrapper) {
|
|
84
|
+
(0, assert_1.assertStruct)(value, exports.JsonRpcRequestStruct, 'Invalid JSON-RPC request', ErrorWrapper);
|
|
116
85
|
}
|
|
117
86
|
exports.assertIsJsonRpcRequest = assertIsJsonRpcRequest;
|
|
118
87
|
exports.PendingJsonRpcResponseStruct = (0, superstruct_1.object)({
|
|
@@ -147,20 +116,16 @@ function isPendingJsonRpcResponse(response) {
|
|
|
147
116
|
}
|
|
148
117
|
exports.isPendingJsonRpcResponse = isPendingJsonRpcResponse;
|
|
149
118
|
/**
|
|
150
|
-
* Assert that the
|
|
151
|
-
* {@link PendingJsonRpcResponse}.
|
|
119
|
+
* Assert that the given value is a valid {@link PendingJsonRpcResponse} object.
|
|
152
120
|
*
|
|
153
121
|
* @param response - The JSON-RPC response to check.
|
|
154
|
-
* @
|
|
122
|
+
* @param ErrorWrapper - The error class to throw if the assertion fails.
|
|
123
|
+
* Defaults to {@link AssertionError}.
|
|
124
|
+
* @throws If the given value is not a valid {@link PendingJsonRpcResponse}
|
|
125
|
+
* object.
|
|
155
126
|
*/
|
|
156
|
-
function assertIsPendingJsonRpcResponse(response) {
|
|
157
|
-
|
|
158
|
-
(0, superstruct_1.assert)(response, exports.PendingJsonRpcResponseStruct);
|
|
159
|
-
}
|
|
160
|
-
catch (error) {
|
|
161
|
-
const message = isErrorWithMessage(error) ? error.message : error;
|
|
162
|
-
throw new Error(`Not a pending JSON-RPC response: ${message}.`);
|
|
163
|
-
}
|
|
127
|
+
function assertIsPendingJsonRpcResponse(response, ErrorWrapper) {
|
|
128
|
+
(0, assert_1.assertStruct)(response, exports.PendingJsonRpcResponseStruct, 'Invalid pending JSON-RPC response', ErrorWrapper);
|
|
164
129
|
}
|
|
165
130
|
exports.assertIsPendingJsonRpcResponse = assertIsPendingJsonRpcResponse;
|
|
166
131
|
/**
|
|
@@ -174,75 +139,83 @@ function isJsonRpcResponse(response) {
|
|
|
174
139
|
}
|
|
175
140
|
exports.isJsonRpcResponse = isJsonRpcResponse;
|
|
176
141
|
/**
|
|
177
|
-
*
|
|
142
|
+
* Assert that the given value is a valid {@link JsonRpcResponse} object.
|
|
178
143
|
*
|
|
179
|
-
* @param
|
|
144
|
+
* @param value - The value to check.
|
|
145
|
+
* @param ErrorWrapper - The error class to throw if the assertion fails.
|
|
146
|
+
* Defaults to {@link AssertionError}.
|
|
147
|
+
* @throws If the given value is not a valid {@link JsonRpcResponse} object.
|
|
180
148
|
*/
|
|
181
|
-
function assertIsJsonRpcResponse(
|
|
182
|
-
|
|
183
|
-
(0, superstruct_1.assert)(response, exports.JsonRpcResponseStruct);
|
|
184
|
-
}
|
|
185
|
-
catch (error) {
|
|
186
|
-
const message = isErrorWithMessage(error) ? error.message : error;
|
|
187
|
-
throw new Error(`Not a JSON-RPC response: ${message}.`);
|
|
188
|
-
}
|
|
149
|
+
function assertIsJsonRpcResponse(value, ErrorWrapper) {
|
|
150
|
+
(0, assert_1.assertStruct)(value, exports.JsonRpcResponseStruct, 'Invalid JSON-RPC response', ErrorWrapper);
|
|
189
151
|
}
|
|
190
152
|
exports.assertIsJsonRpcResponse = assertIsJsonRpcResponse;
|
|
191
153
|
/**
|
|
192
|
-
*
|
|
193
|
-
* (or failure).
|
|
154
|
+
* Check if the given value is a valid {@link JsonRpcSuccess} object.
|
|
194
155
|
*
|
|
195
|
-
* @param
|
|
196
|
-
* @returns Whether the
|
|
156
|
+
* @param value - The value to check.
|
|
157
|
+
* @returns Whether the given value is a valid {@link JsonRpcSuccess} object.
|
|
197
158
|
*/
|
|
198
|
-
function isJsonRpcSuccess(
|
|
199
|
-
return (0, superstruct_1.is)(
|
|
159
|
+
function isJsonRpcSuccess(value) {
|
|
160
|
+
return (0, superstruct_1.is)(value, exports.JsonRpcSuccessStruct);
|
|
200
161
|
}
|
|
201
162
|
exports.isJsonRpcSuccess = isJsonRpcSuccess;
|
|
202
163
|
/**
|
|
203
|
-
*
|
|
204
|
-
* (or failure).
|
|
164
|
+
* Assert that the given value is a valid {@link JsonRpcSuccess} object.
|
|
205
165
|
*
|
|
206
|
-
* @param
|
|
166
|
+
* @param value - The value to check.
|
|
167
|
+
* @param ErrorWrapper - The error class to throw if the assertion fails.
|
|
168
|
+
* Defaults to {@link AssertionError}.
|
|
169
|
+
* @throws If the given value is not a valid {@link JsonRpcSuccess} object.
|
|
207
170
|
*/
|
|
208
|
-
function assertIsJsonRpcSuccess(
|
|
209
|
-
|
|
210
|
-
(0, superstruct_1.assert)(response, exports.JsonRpcSuccessStruct);
|
|
211
|
-
}
|
|
212
|
-
catch (error) {
|
|
213
|
-
const message = isErrorWithMessage(error) ? error.message : error;
|
|
214
|
-
throw new Error(`Not a successful JSON-RPC response: ${message}.`);
|
|
215
|
-
}
|
|
171
|
+
function assertIsJsonRpcSuccess(value, ErrorWrapper) {
|
|
172
|
+
(0, assert_1.assertStruct)(value, exports.JsonRpcSuccessStruct, 'Invalid JSON-RPC success response', ErrorWrapper);
|
|
216
173
|
}
|
|
217
174
|
exports.assertIsJsonRpcSuccess = assertIsJsonRpcSuccess;
|
|
218
175
|
/**
|
|
219
|
-
*
|
|
220
|
-
* (or success).
|
|
176
|
+
* Check if the given value is a valid {@link JsonRpcFailure} object.
|
|
221
177
|
*
|
|
222
|
-
* @param
|
|
223
|
-
* @returns Whether the
|
|
224
|
-
* property.
|
|
178
|
+
* @param value - The value to check.
|
|
179
|
+
* @returns Whether the given value is a valid {@link JsonRpcFailure} object.
|
|
225
180
|
*/
|
|
226
|
-
function isJsonRpcFailure(
|
|
227
|
-
return (0, superstruct_1.is)(
|
|
181
|
+
function isJsonRpcFailure(value) {
|
|
182
|
+
return (0, superstruct_1.is)(value, exports.JsonRpcFailureStruct);
|
|
228
183
|
}
|
|
229
184
|
exports.isJsonRpcFailure = isJsonRpcFailure;
|
|
230
185
|
/**
|
|
231
|
-
*
|
|
232
|
-
* (or success).
|
|
186
|
+
* Assert that the given value is a valid {@link JsonRpcFailure} object.
|
|
233
187
|
*
|
|
234
|
-
* @param
|
|
188
|
+
* @param value - The value to check.
|
|
189
|
+
* @param ErrorWrapper - The error class to throw if the assertion fails.
|
|
190
|
+
* Defaults to {@link AssertionError}.
|
|
191
|
+
* @throws If the given value is not a valid {@link JsonRpcFailure} object.
|
|
235
192
|
*/
|
|
236
|
-
function assertIsJsonRpcFailure(
|
|
237
|
-
|
|
238
|
-
(0, superstruct_1.assert)(response, exports.JsonRpcFailureStruct);
|
|
239
|
-
}
|
|
240
|
-
catch (error) {
|
|
241
|
-
const message = isErrorWithMessage(error) ? error.message : error;
|
|
242
|
-
throw new Error(`Not a failed JSON-RPC response: ${message}.`);
|
|
243
|
-
}
|
|
193
|
+
function assertIsJsonRpcFailure(value, ErrorWrapper) {
|
|
194
|
+
(0, assert_1.assertStruct)(value, exports.JsonRpcFailureStruct, 'Invalid JSON-RPC failure response', ErrorWrapper);
|
|
244
195
|
}
|
|
245
196
|
exports.assertIsJsonRpcFailure = assertIsJsonRpcFailure;
|
|
197
|
+
/**
|
|
198
|
+
* Check if the given value is a valid {@link JsonRpcError} object.
|
|
199
|
+
*
|
|
200
|
+
* @param value - The value to check.
|
|
201
|
+
* @returns Whether the given value is a valid {@link JsonRpcError} object.
|
|
202
|
+
*/
|
|
203
|
+
function isJsonRpcError(value) {
|
|
204
|
+
return (0, superstruct_1.is)(value, exports.JsonRpcErrorStruct);
|
|
205
|
+
}
|
|
206
|
+
exports.isJsonRpcError = isJsonRpcError;
|
|
207
|
+
/**
|
|
208
|
+
* Assert that the given value is a valid {@link JsonRpcError} object.
|
|
209
|
+
*
|
|
210
|
+
* @param value - The value to check.
|
|
211
|
+
* @param ErrorWrapper - The error class to throw if the assertion fails.
|
|
212
|
+
* Defaults to {@link AssertionError}.
|
|
213
|
+
* @throws If the given value is not a valid {@link JsonRpcError} object.
|
|
214
|
+
*/
|
|
215
|
+
function assertIsJsonRpcError(value, ErrorWrapper) {
|
|
216
|
+
(0, assert_1.assertStruct)(value, exports.JsonRpcErrorStruct, 'Invalid JSON-RPC error', ErrorWrapper);
|
|
217
|
+
}
|
|
218
|
+
exports.assertIsJsonRpcError = assertIsJsonRpcError;
|
|
246
219
|
/**
|
|
247
220
|
* Gets a function for validating JSON-RPC request / response `id` values.
|
|
248
221
|
*
|
|
@@ -307,8 +280,7 @@ function validateJsonAndGetSize(jsObject, skipSizingProcess = false) {
|
|
|
307
280
|
*/
|
|
308
281
|
function getJsonSerializableInfo(value, skipSizing) {
|
|
309
282
|
if (value === undefined) {
|
|
310
|
-
|
|
311
|
-
return [true, 0];
|
|
283
|
+
return [false, 0];
|
|
312
284
|
}
|
|
313
285
|
else if (value === null) {
|
|
314
286
|
// Return already specified constant size for null (special object)
|
|
@@ -388,16 +360,6 @@ function validateJsonAndGetSize(jsObject, skipSizingProcess = false) {
|
|
|
388
360
|
if (skipSizing) {
|
|
389
361
|
return 0;
|
|
390
362
|
}
|
|
391
|
-
// If the size is 0, the value is undefined and undefined in an array
|
|
392
|
-
// when serialized will be replaced with null
|
|
393
|
-
if (size === 0 && Array.isArray(value)) {
|
|
394
|
-
size = misc_1.JsonSize.Null;
|
|
395
|
-
}
|
|
396
|
-
// If the size is 0, that means the object is undefined and
|
|
397
|
-
// the rest of the object structure will be omitted
|
|
398
|
-
if (size === 0) {
|
|
399
|
-
return sum;
|
|
400
|
-
}
|
|
401
363
|
// Objects will have be serialized with "key": value,
|
|
402
364
|
// therefore we include the key in the calculation here
|
|
403
365
|
const keySize = Array.isArray(value)
|
package/dist/json.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"json.js","sourceRoot":"","sources":["../src/json.ts"],"names":[],"mappings":"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","sourcesContent":["import deepEqual from 'fast-deep-equal';\nimport {\n array,\n assert,\n boolean,\n Infer,\n is,\n lazy,\n literal,\n nullable,\n number,\n object,\n omit,\n optional,\n record,\n string,\n Struct,\n union,\n unknown,\n} from 'superstruct';\nimport {\n calculateNumberSize,\n calculateStringSize,\n isPlainObject,\n JsonSize,\n} from './misc';\n\n/**\n * Type guard for determining whether the given value is an error object with a\n * `message` property, such as an instance of Error.\n *\n * @param error - The object to check.\n * @returns True or false, depending on the result.\n */\nfunction isErrorWithMessage(error: unknown): error is { message: string } {\n return typeof error === 'object' && error !== null && 'message' in error;\n}\n\n// Note: This struct references itself, so TypeScript cannot infer the type.\nexport const JsonStruct: Struct<Json> = union([\n literal(null),\n boolean(),\n number(),\n string(),\n lazy(() => array(JsonStruct)),\n lazy(() => record(string(), JsonStruct)),\n]);\n\n/**\n * Any JSON-compatible value.\n */\nexport type Json =\n | null\n | boolean\n | number\n | string\n | Json[]\n | { [prop: string]: Json };\n\n/**\n * Type guard for {@link Json}.\n *\n * @param value - The value to check.\n * @returns Whether the value is valid JSON.\n */\nexport function isValidJson(value: unknown): value is Json {\n try {\n return deepEqual(value, JSON.parse(JSON.stringify(value)));\n } catch (_) {\n return false;\n }\n}\n\n/**\n * The string '2.0'.\n */\nexport const jsonrpc2 = '2.0' as const;\nexport const JsonRpcVersionStruct = literal(jsonrpc2);\n\n/**\n * A String specifying the version of the JSON-RPC protocol.\n * MUST be exactly \"2.0\".\n */\nexport type JsonRpcVersion2 = typeof jsonrpc2;\n\nexport const JsonRpcIdStruct = nullable(union([number(), string()]));\n\n/**\n * An identifier established by the Client that MUST contain a String, Number,\n * or NULL value if included. If it is not included it is assumed to be a\n * notification. The value SHOULD normally not be Null and Numbers SHOULD\n * NOT contain fractional parts.\n */\nexport type JsonRpcId = Infer<typeof JsonRpcIdStruct>;\n\nexport const JsonRpcErrorStruct = object({\n code: number(),\n message: string(),\n data: optional(unknown()),\n stack: optional(string()),\n});\n\n/**\n * Mark a certain key of a type as optional.\n */\nexport type OptionalField<\n Type extends Record<string, unknown>,\n Key extends keyof Type,\n> = Omit<Type, Key> & Partial<Pick<Type, Key>>;\n\n/**\n * A JSON-RPC error object.\n *\n * Note that TypeScript infers `unknown | undefined` as `unknown`, meaning that\n * the `data` field is not optional. To make it optional, we use the\n * `OptionalField` helper, to explicitly make it optional.\n */\nexport type JsonRpcError = OptionalField<\n Infer<typeof JsonRpcErrorStruct>,\n 'data'\n>;\n\nexport const JsonRpcParamsStruct = optional(union([object(), array()]));\n\nexport type JsonRpcParams = Infer<typeof JsonRpcParamsStruct>;\n\nexport const JsonRpcRequestStruct = object({\n id: JsonRpcIdStruct,\n jsonrpc: JsonRpcVersionStruct,\n method: string(),\n params: JsonRpcParamsStruct,\n});\n\nexport type InferWithParams<\n Type extends Struct<any, unknown>,\n Params extends JsonRpcParams,\n> = Omit<Infer<Type>, 'params'> &\n (keyof Params extends undefined\n ? {\n params?: Params;\n }\n : {\n params: Params;\n });\n\n/**\n * A JSON-RPC request object.\n */\nexport type JsonRpcRequest<Params extends JsonRpcParams> = InferWithParams<\n typeof JsonRpcRequestStruct,\n Params\n>;\n\nexport const JsonRpcNotificationStruct = omit(JsonRpcRequestStruct, ['id']);\n\n/**\n * A JSON-RPC notification object.\n */\nexport type JsonRpcNotification<Params extends JsonRpcParams> = InferWithParams<\n typeof JsonRpcNotificationStruct,\n Params\n>;\n\n/**\n * Type guard to narrow a {@link JsonRpcRequest} or\n * {@link JsonRpcNotification} object to a {@link JsonRpcNotification}.\n *\n * @param requestOrNotification - The JSON-RPC request or notification to check.\n * @returns Whether the specified JSON-RPC message is a notification.\n */\nexport function isJsonRpcNotification(\n requestOrNotification: unknown,\n): requestOrNotification is JsonRpcNotification<JsonRpcParams> {\n return is(requestOrNotification, JsonRpcNotificationStruct);\n}\n\n/**\n * Assertion type guard to narrow a {@link JsonRpcRequest} or\n * {@link JsonRpcNotification} object to a {@link JsonRpcNotification}.\n *\n * @param requestOrNotification - The JSON-RPC request or notification to check.\n */\nexport function assertIsJsonRpcNotification(\n requestOrNotification: unknown,\n): asserts requestOrNotification is JsonRpcNotification<JsonRpcParams> {\n try {\n assert(requestOrNotification, JsonRpcNotificationStruct);\n } catch (error) {\n const message = isErrorWithMessage(error) ? error.message : error;\n throw new Error(`Not a JSON-RPC notification: ${message}.`);\n }\n}\n\n/**\n * Type guard to narrow a {@link JsonRpcRequest} or @link JsonRpcNotification}\n * object to a {@link JsonRpcRequest}.\n *\n * @param requestOrNotification - The JSON-RPC request or notification to check.\n * @returns Whether the specified JSON-RPC message is a request.\n */\nexport function isJsonRpcRequest(\n requestOrNotification: unknown,\n): requestOrNotification is JsonRpcRequest<JsonRpcParams> {\n return is(requestOrNotification, JsonRpcRequestStruct);\n}\n\n/**\n * Assertion type guard to narrow a {@link JsonRpcRequest} or\n * {@link JsonRpcNotification} object to a {@link JsonRpcRequest}.\n *\n * @param requestOrNotification - The JSON-RPC request or notification to check.\n */\nexport function assertIsJsonRpcRequest(\n requestOrNotification: unknown,\n): asserts requestOrNotification is JsonRpcRequest<JsonRpcParams> {\n try {\n assert(requestOrNotification, JsonRpcRequestStruct);\n } catch (error) {\n const message = isErrorWithMessage(error) ? error.message : error;\n throw new Error(`Not a JSON-RPC request: ${message}.`);\n }\n}\n\nexport const PendingJsonRpcResponseStruct = object({\n id: JsonRpcIdStruct,\n jsonrpc: JsonRpcVersionStruct,\n result: optional(unknown()),\n error: optional(JsonRpcErrorStruct),\n});\n\n/**\n * A JSON-RPC response object that has not yet been resolved.\n */\nexport type PendingJsonRpcResponse<Result extends Json> = Omit<\n Infer<typeof PendingJsonRpcResponseStruct>,\n 'result'\n> & {\n result?: Result;\n};\n\nexport const JsonRpcSuccessStruct = object({\n id: JsonRpcIdStruct,\n jsonrpc: JsonRpcVersionStruct,\n result: JsonStruct,\n});\n\n/**\n * A successful JSON-RPC response object.\n */\nexport type JsonRpcSuccess<Result extends Json> = Omit<\n Infer<typeof JsonRpcSuccessStruct>,\n 'result'\n> & {\n result: Result;\n};\n\nexport const JsonRpcFailureStruct = object({\n id: JsonRpcIdStruct,\n jsonrpc: JsonRpcVersionStruct,\n error: JsonRpcErrorStruct as Struct<JsonRpcError>,\n});\n\n/**\n * A failed JSON-RPC response object.\n */\nexport type JsonRpcFailure = Infer<typeof JsonRpcFailureStruct>;\n\nexport const JsonRpcResponseStruct = union([\n JsonRpcSuccessStruct,\n JsonRpcFailureStruct,\n]);\n\n/**\n * A JSON-RPC response object. Must be checked to determine whether it's a\n * success or failure.\n *\n * @template Result - The type of the result.\n */\nexport type JsonRpcResponse<Result extends Json> =\n | JsonRpcSuccess<Result>\n | JsonRpcFailure;\n\n/**\n * Type guard to check whether specified JSON-RPC response is a\n * {@link PendingJsonRpcResponse}.\n *\n * @param response - The JSON-RPC response to check.\n * @returns Whether the specified JSON-RPC response is pending.\n */\nexport function isPendingJsonRpcResponse(\n response: unknown,\n): response is PendingJsonRpcResponse<Json> {\n return is(response, PendingJsonRpcResponseStruct);\n}\n\n/**\n * Assert that the specified JSON-RPC response is a\n * {@link PendingJsonRpcResponse}.\n *\n * @param response - The JSON-RPC response to check.\n * @throws If the specified JSON-RPC response is not pending.\n */\nexport function assertIsPendingJsonRpcResponse(\n response: unknown,\n): asserts response is PendingJsonRpcResponse<Json> {\n try {\n assert(response, PendingJsonRpcResponseStruct);\n } catch (error) {\n const message = isErrorWithMessage(error) ? error.message : error;\n throw new Error(`Not a pending JSON-RPC response: ${message}.`);\n }\n}\n\n/**\n * Type guard to check if a value is a {@link JsonRpcResponse}.\n *\n * @param response - The object to check.\n * @returns Whether the object is a JsonRpcResponse.\n */\nexport function isJsonRpcResponse(\n response: unknown,\n): response is JsonRpcResponse<Json> {\n return is(response, JsonRpcResponseStruct);\n}\n\n/**\n * Type assertion to check if a value is a {@link JsonRpcResponse}.\n *\n * @param response - The response to check.\n */\nexport function assertIsJsonRpcResponse(\n response: unknown,\n): asserts response is JsonRpcResponse<Json> {\n try {\n assert(response, JsonRpcResponseStruct);\n } catch (error) {\n const message = isErrorWithMessage(error) ? error.message : error;\n throw new Error(`Not a JSON-RPC response: ${message}.`);\n }\n}\n\n/**\n * Type guard to narrow a {@link JsonRpcResponse} object to a success\n * (or failure).\n *\n * @param response - The response object to check.\n * @returns Whether the response object is a success.\n */\nexport function isJsonRpcSuccess(\n response: unknown,\n): response is JsonRpcSuccess<Json> {\n return is(response, JsonRpcSuccessStruct);\n}\n\n/**\n * Type assertion to narrow a {@link JsonRpcResponse} object to a success\n * (or failure).\n *\n * @param response - The response object to check.\n */\nexport function assertIsJsonRpcSuccess(\n response: unknown,\n): asserts response is JsonRpcSuccess<Json> {\n try {\n assert(response, JsonRpcSuccessStruct);\n } catch (error) {\n const message = isErrorWithMessage(error) ? error.message : error;\n throw new Error(`Not a successful JSON-RPC response: ${message}.`);\n }\n}\n\n/**\n * Type guard to narrow a {@link JsonRpcResponse} object to a failure\n * (or success).\n *\n * @param response - The response object to check.\n * @returns Whether the response object is a failure, i.e. has an `error`\n * property.\n */\nexport function isJsonRpcFailure(\n response: unknown,\n): response is JsonRpcFailure {\n return is(response, JsonRpcFailureStruct);\n}\n\n/**\n * Type assertion to narrow a {@link JsonRpcResponse} object to a failure\n * (or success).\n *\n * @param response - The response object to check.\n */\nexport function assertIsJsonRpcFailure(\n response: unknown,\n): asserts response is JsonRpcFailure {\n try {\n assert(response, JsonRpcFailureStruct);\n } catch (error) {\n const message = isErrorWithMessage(error) ? error.message : error;\n throw new Error(`Not a failed JSON-RPC response: ${message}.`);\n }\n}\n\ntype JsonRpcValidatorOptions = {\n permitEmptyString?: boolean;\n permitFractions?: boolean;\n permitNull?: boolean;\n};\n\n/**\n * Gets a function for validating JSON-RPC request / response `id` values.\n *\n * By manipulating the options of this factory, you can control the behavior\n * of the resulting validator for some edge cases. This is useful because e.g.\n * `null` should sometimes but not always be permitted.\n *\n * Note that the empty string (`''`) is always permitted by the JSON-RPC\n * specification, but that kind of sucks and you may want to forbid it in some\n * instances anyway.\n *\n * For more details, see the\n * [JSON-RPC Specification](https://www.jsonrpc.org/specification).\n *\n * @param options - An options object.\n * @param options.permitEmptyString - Whether the empty string (i.e. `''`)\n * should be treated as a valid ID. Default: `true`\n * @param options.permitFractions - Whether fractional numbers (e.g. `1.2`)\n * should be treated as valid IDs. Default: `false`\n * @param options.permitNull - Whether `null` should be treated as a valid ID.\n * Default: `true`\n * @returns The JSON-RPC ID validator function.\n */\nexport function getJsonRpcIdValidator(options?: JsonRpcValidatorOptions) {\n const { permitEmptyString, permitFractions, permitNull } = {\n permitEmptyString: true,\n permitFractions: false,\n permitNull: true,\n ...options,\n };\n\n /**\n * Type guard for {@link JsonRpcId}.\n *\n * @param id - The JSON-RPC ID value to check.\n * @returns Whether the given ID is valid per the options given to the\n * factory.\n */\n const isValidJsonRpcId = (id: unknown): id is JsonRpcId => {\n return Boolean(\n (typeof id === 'number' && (permitFractions || Number.isInteger(id))) ||\n (typeof id === 'string' && (permitEmptyString || id.length > 0)) ||\n (permitNull && id === null),\n );\n };\n\n return isValidJsonRpcId;\n}\n\n/**\n * Checks whether a value is JSON serializable and counts the total number\n * of bytes needed to store the serialized version of the value.\n *\n * @param jsObject - Potential JSON serializable object.\n * @param skipSizingProcess - Skip JSON size calculation (default: false).\n * @returns Tuple [isValid, plainTextSizeInBytes] containing a boolean that signals whether\n * the value was serializable and a number of bytes that it will use when serialized to JSON.\n */\nexport function validateJsonAndGetSize(\n jsObject: unknown,\n skipSizingProcess = false,\n): [isValid: boolean, plainTextSizeInBytes: number] {\n const seenObjects = new Set();\n /**\n * Checks whether a value is JSON serializable and counts the total number\n * of bytes needed to store the serialized version of the value.\n *\n * This function assumes the encoding of the JSON is done in UTF-8.\n *\n * @param value - Potential JSON serializable value.\n * @param skipSizing - Skip JSON size calculation (default: false).\n * @returns Tuple [isValid, plainTextSizeInBytes] containing a boolean that signals whether\n * the value was serializable and a number of bytes that it will use when serialized to JSON.\n */\n function getJsonSerializableInfo(\n value: unknown,\n skipSizing: boolean,\n ): [isValid: boolean, plainTextSizeInBytes: number] {\n if (value === undefined) {\n // Return zero for undefined, since these are omitted from JSON serialization\n return [true, 0];\n } else if (value === null) {\n // Return already specified constant size for null (special object)\n return [true, skipSizing ? 0 : JsonSize.Null];\n }\n\n // Check and calculate sizes for basic (and some special) types\n const typeOfValue = typeof value;\n try {\n if (typeOfValue === 'function') {\n return [false, 0];\n } else if (typeOfValue === 'string' || value instanceof String) {\n return [\n true,\n skipSizing\n ? 0\n : calculateStringSize(value as string) + JsonSize.Quote * 2,\n ];\n } else if (typeOfValue === 'boolean' || value instanceof Boolean) {\n if (skipSizing) {\n return [true, 0];\n }\n // eslint-disable-next-line eqeqeq\n return [true, value == true ? JsonSize.True : JsonSize.False];\n } else if (typeOfValue === 'number' || value instanceof Number) {\n if (skipSizing) {\n return [true, 0];\n }\n return [true, calculateNumberSize(value as number)];\n } else if (value instanceof Date) {\n if (skipSizing) {\n return [true, 0];\n }\n return [\n true,\n // Note: Invalid dates will serialize to null\n isNaN(value.getDate())\n ? JsonSize.Null\n : JsonSize.Date + JsonSize.Quote * 2,\n ];\n }\n } catch (_) {\n return [false, 0];\n }\n\n // If object is not plain and cannot be serialized properly,\n // stop here and return false for serialization\n if (!isPlainObject(value) && !Array.isArray(value)) {\n return [false, 0];\n }\n\n // Circular object detection (handling)\n // Check if the same object already exists\n if (seenObjects.has(value)) {\n return [false, 0];\n }\n // Add new object to the seen objects set\n // Only the plain objects should be added (Primitive types are skipped)\n seenObjects.add(value);\n\n // Continue object decomposition\n try {\n return [\n true,\n Object.entries(value).reduce(\n (sum, [key, nestedValue], idx, arr) => {\n // Recursively process next nested object or primitive type\n // eslint-disable-next-line prefer-const\n let [valid, size] = getJsonSerializableInfo(\n nestedValue,\n skipSizing,\n );\n if (!valid) {\n throw new Error(\n 'JSON validation did not pass. Validation process stopped.',\n );\n }\n\n // Circular object detection\n // Once a child node is visited and processed remove it from the set.\n // This will prevent false positives with the same adjacent objects.\n seenObjects.delete(value);\n\n if (skipSizing) {\n return 0;\n }\n\n // If the size is 0, the value is undefined and undefined in an array\n // when serialized will be replaced with null\n if (size === 0 && Array.isArray(value)) {\n size = JsonSize.Null;\n }\n\n // If the size is 0, that means the object is undefined and\n // the rest of the object structure will be omitted\n if (size === 0) {\n return sum;\n }\n\n // Objects will have be serialized with \"key\": value,\n // therefore we include the key in the calculation here\n const keySize = Array.isArray(value)\n ? 0\n : key.length + JsonSize.Comma + JsonSize.Colon * 2;\n\n const separator = idx < arr.length - 1 ? JsonSize.Comma : 0;\n\n return sum + keySize + size + separator;\n },\n // Starts at 2 because the serialized JSON string data (plain text)\n // will minimally contain {}/[]\n skipSizing ? 0 : JsonSize.Wrapper * 2,\n ),\n ];\n } catch (_) {\n return [false, 0];\n }\n }\n\n return getJsonSerializableInfo(jsObject, skipSizingProcess);\n}\n"]}
|
|
1
|
+
{"version":3,"file":"json.js","sourceRoot":"","sources":["../src/json.ts"],"names":[],"mappings":"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","sourcesContent":["import {\n array,\n define,\n Infer,\n integer,\n is,\n literal,\n nullable,\n number,\n object,\n omit,\n optional,\n string,\n Struct,\n union,\n unknown,\n} from 'superstruct';\nimport {\n calculateNumberSize,\n calculateStringSize,\n isPlainObject,\n JsonSize,\n} from './misc';\nimport { AssertionErrorConstructor, assertStruct } from './assert';\n\nexport const JsonStruct = define<Json>('Json', (value) => {\n const [isValid] = validateJsonAndGetSize(value, true);\n return isValid;\n});\n\n/**\n * Any JSON-compatible value.\n */\nexport type Json =\n | null\n | boolean\n | number\n | string\n | Json[]\n | { [prop: string]: Json };\n\n/**\n * Check if the given value is a valid {@link Json} value, i.e., a value that is\n * serializable to JSON.\n *\n * @param value - The value to check.\n * @returns Whether the value is a valid {@link Json} value.\n */\nexport function isValidJson(value: unknown): value is Json {\n return is(value, JsonStruct);\n}\n\n/**\n * The string '2.0'.\n */\nexport const jsonrpc2 = '2.0' as const;\nexport const JsonRpcVersionStruct = literal(jsonrpc2);\n\n/**\n * A String specifying the version of the JSON-RPC protocol.\n * MUST be exactly \"2.0\".\n */\nexport type JsonRpcVersion2 = typeof jsonrpc2;\n\nexport const JsonRpcIdStruct = nullable(union([number(), string()]));\n\n/**\n * An identifier established by the Client that MUST contain a String, Number,\n * or NULL value if included. If it is not included it is assumed to be a\n * notification. The value SHOULD normally not be Null and Numbers SHOULD\n * NOT contain fractional parts.\n */\nexport type JsonRpcId = Infer<typeof JsonRpcIdStruct>;\n\nexport const JsonRpcErrorStruct = object({\n code: integer(),\n message: string(),\n data: optional(JsonStruct),\n stack: optional(string()),\n});\n\n/**\n * Mark a certain key of a type as optional.\n */\nexport type OptionalField<\n Type extends Record<string, unknown>,\n Key extends keyof Type,\n> = Omit<Type, Key> & Partial<Pick<Type, Key>>;\n\n/**\n * A JSON-RPC error object.\n *\n * Note that TypeScript infers `unknown | undefined` as `unknown`, meaning that\n * the `data` field is not optional. To make it optional, we use the\n * `OptionalField` helper, to explicitly make it optional.\n */\nexport type JsonRpcError = OptionalField<\n Infer<typeof JsonRpcErrorStruct>,\n 'data'\n>;\n\nexport const JsonRpcParamsStruct = optional(union([object(), array()]));\n\nexport type JsonRpcParams = Infer<typeof JsonRpcParamsStruct>;\n\nexport const JsonRpcRequestStruct = object({\n id: JsonRpcIdStruct,\n jsonrpc: JsonRpcVersionStruct,\n method: string(),\n params: JsonRpcParamsStruct,\n});\n\nexport type InferWithParams<\n Type extends Struct<any, unknown>,\n Params extends JsonRpcParams,\n> = Omit<Infer<Type>, 'params'> &\n (keyof Params extends undefined\n ? {\n params?: Params;\n }\n : {\n params: Params;\n });\n\n/**\n * A JSON-RPC request object.\n */\nexport type JsonRpcRequest<Params extends JsonRpcParams> = InferWithParams<\n typeof JsonRpcRequestStruct,\n Params\n>;\n\nexport const JsonRpcNotificationStruct = omit(JsonRpcRequestStruct, ['id']);\n\n/**\n * A JSON-RPC notification object.\n */\nexport type JsonRpcNotification<Params extends JsonRpcParams> = InferWithParams<\n typeof JsonRpcNotificationStruct,\n Params\n>;\n\n/**\n * Check if the given value is a valid {@link JsonRpcNotification} object.\n *\n * @param value - The value to check.\n * @returns Whether the given value is a valid {@link JsonRpcNotification}\n * object.\n */\nexport function isJsonRpcNotification(\n value: unknown,\n): value is JsonRpcNotification<JsonRpcParams> {\n return is(value, JsonRpcNotificationStruct);\n}\n\n/**\n * Assert that the given value is a valid {@link JsonRpcNotification} object.\n *\n * @param value - The value to check.\n * @param ErrorWrapper - The error class to throw if the assertion fails.\n * Defaults to {@link AssertionError}.\n * @throws If the given value is not a valid {@link JsonRpcNotification} object.\n */\nexport function assertIsJsonRpcNotification(\n value: unknown,\n ErrorWrapper?: AssertionErrorConstructor,\n): asserts value is JsonRpcNotification<JsonRpcParams> {\n assertStruct(\n value,\n JsonRpcNotificationStruct,\n 'Invalid JSON-RPC notification',\n ErrorWrapper,\n );\n}\n\n/**\n * Check if the given value is a valid {@link JsonRpcRequest} object.\n *\n * @param value - The value to check.\n * @returns Whether the given value is a valid {@link JsonRpcRequest} object.\n */\nexport function isJsonRpcRequest(\n value: unknown,\n): value is JsonRpcRequest<JsonRpcParams> {\n return is(value, JsonRpcRequestStruct);\n}\n\n/**\n * Assert that the given value is a valid {@link JsonRpcRequest} object.\n *\n * @param value - The JSON-RPC request or notification to check.\n * @param ErrorWrapper - The error class to throw if the assertion fails.\n * Defaults to {@link AssertionError}.\n * @throws If the given value is not a valid {@link JsonRpcRequest} object.\n */\nexport function assertIsJsonRpcRequest(\n value: unknown,\n ErrorWrapper?: AssertionErrorConstructor,\n): asserts value is JsonRpcRequest<JsonRpcParams> {\n assertStruct(\n value,\n JsonRpcRequestStruct,\n 'Invalid JSON-RPC request',\n ErrorWrapper,\n );\n}\n\nexport const PendingJsonRpcResponseStruct = object({\n id: JsonRpcIdStruct,\n jsonrpc: JsonRpcVersionStruct,\n result: optional(unknown()),\n error: optional(JsonRpcErrorStruct),\n});\n\n/**\n * A JSON-RPC response object that has not yet been resolved.\n */\nexport type PendingJsonRpcResponse<Result extends Json> = Omit<\n Infer<typeof PendingJsonRpcResponseStruct>,\n 'result'\n> & {\n result?: Result;\n};\n\nexport const JsonRpcSuccessStruct = object({\n id: JsonRpcIdStruct,\n jsonrpc: JsonRpcVersionStruct,\n result: JsonStruct,\n});\n\n/**\n * A successful JSON-RPC response object.\n */\nexport type JsonRpcSuccess<Result extends Json> = Omit<\n Infer<typeof JsonRpcSuccessStruct>,\n 'result'\n> & {\n result: Result;\n};\n\nexport const JsonRpcFailureStruct = object({\n id: JsonRpcIdStruct,\n jsonrpc: JsonRpcVersionStruct,\n error: JsonRpcErrorStruct as Struct<JsonRpcError>,\n});\n\n/**\n * A failed JSON-RPC response object.\n */\nexport type JsonRpcFailure = Infer<typeof JsonRpcFailureStruct>;\n\nexport const JsonRpcResponseStruct = union([\n JsonRpcSuccessStruct,\n JsonRpcFailureStruct,\n]);\n\n/**\n * A JSON-RPC response object. Must be checked to determine whether it's a\n * success or failure.\n *\n * @template Result - The type of the result.\n */\nexport type JsonRpcResponse<Result extends Json> =\n | JsonRpcSuccess<Result>\n | JsonRpcFailure;\n\n/**\n * Type guard to check whether specified JSON-RPC response is a\n * {@link PendingJsonRpcResponse}.\n *\n * @param response - The JSON-RPC response to check.\n * @returns Whether the specified JSON-RPC response is pending.\n */\nexport function isPendingJsonRpcResponse(\n response: unknown,\n): response is PendingJsonRpcResponse<Json> {\n return is(response, PendingJsonRpcResponseStruct);\n}\n\n/**\n * Assert that the given value is a valid {@link PendingJsonRpcResponse} object.\n *\n * @param response - The JSON-RPC response to check.\n * @param ErrorWrapper - The error class to throw if the assertion fails.\n * Defaults to {@link AssertionError}.\n * @throws If the given value is not a valid {@link PendingJsonRpcResponse}\n * object.\n */\nexport function assertIsPendingJsonRpcResponse(\n response: unknown,\n ErrorWrapper?: AssertionErrorConstructor,\n): asserts response is PendingJsonRpcResponse<Json> {\n assertStruct(\n response,\n PendingJsonRpcResponseStruct,\n 'Invalid pending JSON-RPC response',\n ErrorWrapper,\n );\n}\n\n/**\n * Type guard to check if a value is a {@link JsonRpcResponse}.\n *\n * @param response - The object to check.\n * @returns Whether the object is a JsonRpcResponse.\n */\nexport function isJsonRpcResponse(\n response: unknown,\n): response is JsonRpcResponse<Json> {\n return is(response, JsonRpcResponseStruct);\n}\n\n/**\n * Assert that the given value is a valid {@link JsonRpcResponse} object.\n *\n * @param value - The value to check.\n * @param ErrorWrapper - The error class to throw if the assertion fails.\n * Defaults to {@link AssertionError}.\n * @throws If the given value is not a valid {@link JsonRpcResponse} object.\n */\nexport function assertIsJsonRpcResponse(\n value: unknown,\n ErrorWrapper?: AssertionErrorConstructor,\n): asserts value is JsonRpcResponse<Json> {\n assertStruct(\n value,\n JsonRpcResponseStruct,\n 'Invalid JSON-RPC response',\n ErrorWrapper,\n );\n}\n\n/**\n * Check if the given value is a valid {@link JsonRpcSuccess} object.\n *\n * @param value - The value to check.\n * @returns Whether the given value is a valid {@link JsonRpcSuccess} object.\n */\nexport function isJsonRpcSuccess(\n value: unknown,\n): value is JsonRpcSuccess<Json> {\n return is(value, JsonRpcSuccessStruct);\n}\n\n/**\n * Assert that the given value is a valid {@link JsonRpcSuccess} object.\n *\n * @param value - The value to check.\n * @param ErrorWrapper - The error class to throw if the assertion fails.\n * Defaults to {@link AssertionError}.\n * @throws If the given value is not a valid {@link JsonRpcSuccess} object.\n */\nexport function assertIsJsonRpcSuccess(\n value: unknown,\n ErrorWrapper?: AssertionErrorConstructor,\n): asserts value is JsonRpcSuccess<Json> {\n assertStruct(\n value,\n JsonRpcSuccessStruct,\n 'Invalid JSON-RPC success response',\n ErrorWrapper,\n );\n}\n\n/**\n * Check if the given value is a valid {@link JsonRpcFailure} object.\n *\n * @param value - The value to check.\n * @returns Whether the given value is a valid {@link JsonRpcFailure} object.\n */\nexport function isJsonRpcFailure(value: unknown): value is JsonRpcFailure {\n return is(value, JsonRpcFailureStruct);\n}\n\n/**\n * Assert that the given value is a valid {@link JsonRpcFailure} object.\n *\n * @param value - The value to check.\n * @param ErrorWrapper - The error class to throw if the assertion fails.\n * Defaults to {@link AssertionError}.\n * @throws If the given value is not a valid {@link JsonRpcFailure} object.\n */\nexport function assertIsJsonRpcFailure(\n value: unknown,\n ErrorWrapper?: AssertionErrorConstructor,\n): asserts value is JsonRpcFailure {\n assertStruct(\n value,\n JsonRpcFailureStruct,\n 'Invalid JSON-RPC failure response',\n ErrorWrapper,\n );\n}\n\n/**\n * Check if the given value is a valid {@link JsonRpcError} object.\n *\n * @param value - The value to check.\n * @returns Whether the given value is a valid {@link JsonRpcError} object.\n */\nexport function isJsonRpcError(value: unknown): value is JsonRpcError {\n return is(value, JsonRpcErrorStruct);\n}\n\n/**\n * Assert that the given value is a valid {@link JsonRpcError} object.\n *\n * @param value - The value to check.\n * @param ErrorWrapper - The error class to throw if the assertion fails.\n * Defaults to {@link AssertionError}.\n * @throws If the given value is not a valid {@link JsonRpcError} object.\n */\nexport function assertIsJsonRpcError(\n value: unknown,\n ErrorWrapper?: AssertionErrorConstructor,\n): asserts value is JsonRpcError {\n assertStruct(\n value,\n JsonRpcErrorStruct,\n 'Invalid JSON-RPC error',\n ErrorWrapper,\n );\n}\n\ntype JsonRpcValidatorOptions = {\n permitEmptyString?: boolean;\n permitFractions?: boolean;\n permitNull?: boolean;\n};\n\n/**\n * Gets a function for validating JSON-RPC request / response `id` values.\n *\n * By manipulating the options of this factory, you can control the behavior\n * of the resulting validator for some edge cases. This is useful because e.g.\n * `null` should sometimes but not always be permitted.\n *\n * Note that the empty string (`''`) is always permitted by the JSON-RPC\n * specification, but that kind of sucks and you may want to forbid it in some\n * instances anyway.\n *\n * For more details, see the\n * [JSON-RPC Specification](https://www.jsonrpc.org/specification).\n *\n * @param options - An options object.\n * @param options.permitEmptyString - Whether the empty string (i.e. `''`)\n * should be treated as a valid ID. Default: `true`\n * @param options.permitFractions - Whether fractional numbers (e.g. `1.2`)\n * should be treated as valid IDs. Default: `false`\n * @param options.permitNull - Whether `null` should be treated as a valid ID.\n * Default: `true`\n * @returns The JSON-RPC ID validator function.\n */\nexport function getJsonRpcIdValidator(options?: JsonRpcValidatorOptions) {\n const { permitEmptyString, permitFractions, permitNull } = {\n permitEmptyString: true,\n permitFractions: false,\n permitNull: true,\n ...options,\n };\n\n /**\n * Type guard for {@link JsonRpcId}.\n *\n * @param id - The JSON-RPC ID value to check.\n * @returns Whether the given ID is valid per the options given to the\n * factory.\n */\n const isValidJsonRpcId = (id: unknown): id is JsonRpcId => {\n return Boolean(\n (typeof id === 'number' && (permitFractions || Number.isInteger(id))) ||\n (typeof id === 'string' && (permitEmptyString || id.length > 0)) ||\n (permitNull && id === null),\n );\n };\n\n return isValidJsonRpcId;\n}\n\n/**\n * Checks whether a value is JSON serializable and counts the total number\n * of bytes needed to store the serialized version of the value.\n *\n * @param jsObject - Potential JSON serializable object.\n * @param skipSizingProcess - Skip JSON size calculation (default: false).\n * @returns Tuple [isValid, plainTextSizeInBytes] containing a boolean that signals whether\n * the value was serializable and a number of bytes that it will use when serialized to JSON.\n */\nexport function validateJsonAndGetSize(\n jsObject: unknown,\n skipSizingProcess = false,\n): [isValid: boolean, plainTextSizeInBytes: number] {\n const seenObjects = new Set();\n /**\n * Checks whether a value is JSON serializable and counts the total number\n * of bytes needed to store the serialized version of the value.\n *\n * This function assumes the encoding of the JSON is done in UTF-8.\n *\n * @param value - Potential JSON serializable value.\n * @param skipSizing - Skip JSON size calculation (default: false).\n * @returns Tuple [isValid, plainTextSizeInBytes] containing a boolean that signals whether\n * the value was serializable and a number of bytes that it will use when serialized to JSON.\n */\n function getJsonSerializableInfo(\n value: unknown,\n skipSizing: boolean,\n ): [isValid: boolean, plainTextSizeInBytes: number] {\n if (value === undefined) {\n return [false, 0];\n } else if (value === null) {\n // Return already specified constant size for null (special object)\n return [true, skipSizing ? 0 : JsonSize.Null];\n }\n\n // Check and calculate sizes for basic (and some special) types\n const typeOfValue = typeof value;\n try {\n if (typeOfValue === 'function') {\n return [false, 0];\n } else if (typeOfValue === 'string' || value instanceof String) {\n return [\n true,\n skipSizing\n ? 0\n : calculateStringSize(value as string) + JsonSize.Quote * 2,\n ];\n } else if (typeOfValue === 'boolean' || value instanceof Boolean) {\n if (skipSizing) {\n return [true, 0];\n }\n // eslint-disable-next-line eqeqeq\n return [true, value == true ? JsonSize.True : JsonSize.False];\n } else if (typeOfValue === 'number' || value instanceof Number) {\n if (skipSizing) {\n return [true, 0];\n }\n return [true, calculateNumberSize(value as number)];\n } else if (value instanceof Date) {\n if (skipSizing) {\n return [true, 0];\n }\n return [\n true,\n // Note: Invalid dates will serialize to null\n isNaN(value.getDate())\n ? JsonSize.Null\n : JsonSize.Date + JsonSize.Quote * 2,\n ];\n }\n } catch (_) {\n return [false, 0];\n }\n\n // If object is not plain and cannot be serialized properly,\n // stop here and return false for serialization\n if (!isPlainObject(value) && !Array.isArray(value)) {\n return [false, 0];\n }\n\n // Circular object detection (handling)\n // Check if the same object already exists\n if (seenObjects.has(value)) {\n return [false, 0];\n }\n // Add new object to the seen objects set\n // Only the plain objects should be added (Primitive types are skipped)\n seenObjects.add(value);\n\n // Continue object decomposition\n try {\n return [\n true,\n Object.entries(value).reduce(\n (sum, [key, nestedValue], idx, arr) => {\n // Recursively process next nested object or primitive type\n // eslint-disable-next-line prefer-const\n let [valid, size] = getJsonSerializableInfo(\n nestedValue,\n skipSizing,\n );\n if (!valid) {\n throw new Error(\n 'JSON validation did not pass. Validation process stopped.',\n );\n }\n\n // Circular object detection\n // Once a child node is visited and processed remove it from the set.\n // This will prevent false positives with the same adjacent objects.\n seenObjects.delete(value);\n\n if (skipSizing) {\n return 0;\n }\n\n // Objects will have be serialized with \"key\": value,\n // therefore we include the key in the calculation here\n const keySize = Array.isArray(value)\n ? 0\n : key.length + JsonSize.Comma + JsonSize.Colon * 2;\n\n const separator = idx < arr.length - 1 ? JsonSize.Comma : 0;\n\n return sum + keySize + size + separator;\n },\n // Starts at 2 because the serialized JSON string data (plain text)\n // will minimally contain {}/[]\n skipSizing ? 0 : JsonSize.Wrapper * 2,\n ),\n ];\n } catch (_) {\n return [false, 0];\n }\n }\n\n return getJsonSerializableInfo(jsObject, skipSizingProcess);\n}\n"]}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@metamask/utils",
|
|
3
|
-
"version": "3.
|
|
3
|
+
"version": "3.3.0",
|
|
4
4
|
"description": "Various JavaScript/TypeScript utilities of wide relevance to the MetaMask codebase.",
|
|
5
5
|
"repository": {
|
|
6
6
|
"type": "git",
|
|
@@ -33,8 +33,7 @@
|
|
|
33
33
|
"dependencies": {
|
|
34
34
|
"@types/debug": "^4.1.7",
|
|
35
35
|
"debug": "^4.3.4",
|
|
36
|
-
"
|
|
37
|
-
"superstruct": "^0.16.5"
|
|
36
|
+
"superstruct": "^0.16.7"
|
|
38
37
|
},
|
|
39
38
|
"devDependencies": {
|
|
40
39
|
"@lavamoat/allow-scripts": "^2.0.3",
|