diff --git a/CHANGELOG.md b/CHANGELOG.md index 9477b6c0b..f59332b9a 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -12,6 +12,7 @@ Changes: - Adjust output for Ledger saninity checks - Expand exported `bigint` constants to match with those in `BN` - Upgrade dependencies to latest stable versions +- Adjust internal character maps to operate on `Uint8Array` instad of `Array` ## 10.2.6 Jan 13, 2023 diff --git a/packages/util-crypto/src/blake2/asU8a.spec.ts b/packages/util-crypto/src/blake2/asU8a.spec.ts index 003fecf44..f8e88b93d 100644 --- a/packages/util-crypto/src/blake2/asU8a.spec.ts +++ b/packages/util-crypto/src/blake2/asU8a.spec.ts @@ -4,7 +4,7 @@ import { hexToU8a } from '@polkadot/util'; import { waitReady } from '@polkadot/wasm-crypto'; -import { performanceWasm } from '../test/performance'; +import { perfWasm } from '../test'; import { blake2AsU8a } from '.'; describe('blake2AsU8a', (): void => { @@ -61,7 +61,7 @@ describe('blake2AsU8a', (): void => { }); describe.each([256, 512] as (256 | 512)[])('bitLength=$p', (bitLength): void => { - performanceWasm(`blake2AsU8a, bitLength=${bitLength}`, 64000, (input, onlyJs) => + perfWasm(`blake2AsU8a, bitLength=${bitLength}`, 64000, (input, onlyJs) => blake2AsU8a(input, bitLength, null, onlyJs) ); }); diff --git a/packages/util-crypto/src/ed25519/sign.spec.ts b/packages/util-crypto/src/ed25519/sign.spec.ts index ad2bb6e39..478c9c886 100644 --- a/packages/util-crypto/src/ed25519/sign.spec.ts +++ b/packages/util-crypto/src/ed25519/sign.spec.ts @@ -4,7 +4,7 @@ import { stringToU8a } from '@polkadot/util'; import { waitReady } from '@polkadot/wasm-crypto'; -import { performanceWasm } from '../test/performance'; +import { perfWasm } from '../test'; import { ed25519PairFromSeed, ed25519Sign } from '.'; const PAIR = ed25519PairFromSeed( @@ -30,7 +30,7 @@ describe('ed25519Sign', (): void => { }); }); - performanceWasm('ed25519Sign', 250, (input, onlyJs) => + perfWasm('ed25519Sign', 250, (input, onlyJs) => ed25519Sign(input, PAIR, onlyJs) ); }); diff --git a/packages/util-crypto/src/hmac/shaAsU8a.spec.ts b/packages/util-crypto/src/hmac/shaAsU8a.spec.ts index b61f4e727..e37e950da 100644 --- a/packages/util-crypto/src/hmac/shaAsU8a.spec.ts +++ b/packages/util-crypto/src/hmac/shaAsU8a.spec.ts @@ -4,7 +4,7 @@ import { hexToU8a, stringToU8a } from '@polkadot/util'; import { waitReady } from '@polkadot/wasm-crypto'; -import { performanceWasm } from '../test/performance'; +import { perfWasm } from '../test'; import { hmacShaAsU8a } from '.'; describe('hmacShaAsU8a', (): void => { @@ -32,7 +32,7 @@ describe('hmacShaAsU8a', (): void => { }); }); - performanceWasm(`hmacShaAsU8a, bitLength=${bitLength}`, 16000, (input, onlyJs) => + perfWasm(`hmacShaAsU8a, bitLength=${bitLength}`, 16000, (input, onlyJs) => hmacShaAsU8a(input, input, bitLength, onlyJs) ); }); diff --git a/packages/util-crypto/src/keccak/asU8a.spec.ts b/packages/util-crypto/src/keccak/asU8a.spec.ts index 031a7a9c8..a8580b55f 100644 --- a/packages/util-crypto/src/keccak/asU8a.spec.ts +++ b/packages/util-crypto/src/keccak/asU8a.spec.ts @@ -4,7 +4,7 @@ import { hexToU8a, stringToU8a } from '@polkadot/util'; import { waitReady } from '@polkadot/wasm-crypto'; -import { performanceWasm } from '../test/performance'; +import { perfWasm } from '../test'; import { keccakAsU8a } from '.'; describe('keccakAsU8a', (): void => { @@ -43,7 +43,7 @@ describe('keccakAsU8a', (): void => { }); }); - performanceWasm(`keccakAsU8a, bitLength=${bitLength}`, 128000, (input, onlyJs) => + perfWasm(`keccakAsU8a, bitLength=${bitLength}`, 128000, (input, onlyJs) => keccakAsU8a(input, bitLength, onlyJs) ); }); diff --git a/packages/util-crypto/src/pbkdf2/encode.spec.ts b/packages/util-crypto/src/pbkdf2/encode.spec.ts index a067fec71..559985dd2 100644 --- a/packages/util-crypto/src/pbkdf2/encode.spec.ts +++ b/packages/util-crypto/src/pbkdf2/encode.spec.ts @@ -5,7 +5,7 @@ import { u8aEq, u8aToHex } from '@polkadot/util'; import { waitReady } from '@polkadot/wasm-crypto'; import { randomAsU8a } from '../random/asU8a'; -import { performanceWasm } from '../test/performance'; +import { perfWasm } from '../test'; import { pbkdf2Encode } from '.'; const KNOWN_SALT = new Uint8Array([ @@ -42,7 +42,7 @@ describe('pbkdf2Encode', (): void => { }); }); - performanceWasm('pbkdf2Encode', 8, (input, onlyJs) => + perfWasm('pbkdf2Encode', 8, (input, onlyJs) => pbkdf2Encode(input, input, undefined, onlyJs) ); }); diff --git a/packages/util-crypto/src/scrypt/encode.spec.ts b/packages/util-crypto/src/scrypt/encode.spec.ts index 515d199b9..a0d5ef978 100644 --- a/packages/util-crypto/src/scrypt/encode.spec.ts +++ b/packages/util-crypto/src/scrypt/encode.spec.ts @@ -3,7 +3,7 @@ import { waitReady } from '@polkadot/wasm-crypto'; -import { performanceWasm } from '../test/performance'; +import { perfWasm } from '../test'; import { DEFAULT_PARAMS } from './defaults'; import { scryptEncode } from '.'; @@ -30,7 +30,7 @@ describe('scryptEncode', (): void => { }); }); - performanceWasm('scryptEncode', 4, (input, onlyJs) => + perfWasm('scryptEncode', 4, (input, onlyJs) => scryptEncode(input, input, undefined, onlyJs) ); }); diff --git a/packages/util-crypto/src/secp256k1/compress.spec.ts b/packages/util-crypto/src/secp256k1/compress.spec.ts index 3a4251d6e..a95cd1a9a 100644 --- a/packages/util-crypto/src/secp256k1/compress.spec.ts +++ b/packages/util-crypto/src/secp256k1/compress.spec.ts @@ -4,7 +4,7 @@ import { hexToU8a } from '@polkadot/util'; import { waitReady } from '@polkadot/wasm-crypto'; -import { performanceWasm } from '../test/performance'; +import { perfWasm } from '../test'; import { secp256k1Compress } from '.'; describe('secp256k1Compress', (): void => { @@ -36,7 +36,7 @@ describe('secp256k1Compress', (): void => { }); }); - performanceWasm('secp256k1Compress', 100000, (input, onlyJs) => secp256k1Compress(input, onlyJs), + perfWasm('secp256k1Compress', 100000, (input, onlyJs) => secp256k1Compress(input, onlyJs), [[ hexToU8a('0x04b9dc646dd71118e5f7fda681ad9eca36eb3ee96f344f582fbe7b5bcdebb1307763fe926c273235fd979a134076d00fd1683cbd35868cb485d4a3a640e52184af') ]] diff --git a/packages/util-crypto/src/secp256k1/expand.spec.ts b/packages/util-crypto/src/secp256k1/expand.spec.ts index 2e8f62c16..3471e4e52 100644 --- a/packages/util-crypto/src/secp256k1/expand.spec.ts +++ b/packages/util-crypto/src/secp256k1/expand.spec.ts @@ -4,7 +4,7 @@ import { hexToU8a } from '@polkadot/util'; import { waitReady } from '@polkadot/wasm-crypto'; -import { performanceWasm } from '../test/performance'; +import { perfWasm } from '../test'; import { secp256k1Expand } from '.'; describe('secp256k1Expand', (): void => { @@ -36,7 +36,7 @@ describe('secp256k1Expand', (): void => { }); }); - performanceWasm('secp256k1Expand', 2000, (input, onlyJs) => secp256k1Expand(input, onlyJs), + perfWasm('secp256k1Expand', 2000, (input, onlyJs) => secp256k1Expand(input, onlyJs), [[ hexToU8a('0x03b9dc646dd71118e5f7fda681ad9eca36eb3ee96f344f582fbe7b5bcdebb13077') ]] diff --git a/packages/util-crypto/src/secp256k1/pair/fromSeed.spec.ts b/packages/util-crypto/src/secp256k1/pair/fromSeed.spec.ts index 5e69f9c48..2f4e1d11c 100644 --- a/packages/util-crypto/src/secp256k1/pair/fromSeed.spec.ts +++ b/packages/util-crypto/src/secp256k1/pair/fromSeed.spec.ts @@ -5,7 +5,7 @@ import { hexToU8a, u8aToHex } from '@polkadot/util'; import { waitReady } from '@polkadot/wasm-crypto'; import { mnemonicToMiniSecret } from '../../mnemonic'; -import { performanceWasm } from '../../test/performance'; +import { perfWasm } from '../../test'; import { secp256k1PairFromSeed } from '..'; // mnemonic, secret, public, account_id @@ -65,7 +65,7 @@ describe('secp256k1PairFromSeed', (): void => { }); }); - performanceWasm('secp256k1PairFromSeed', 500, (input, onlyJs) => + perfWasm('secp256k1PairFromSeed', 500, (input, onlyJs) => secp256k1PairFromSeed(input, onlyJs) ); }); diff --git a/packages/util-crypto/src/secp256k1/recover.spec.ts b/packages/util-crypto/src/secp256k1/recover.spec.ts index 592a2c6a7..05aeedfe3 100644 --- a/packages/util-crypto/src/secp256k1/recover.spec.ts +++ b/packages/util-crypto/src/secp256k1/recover.spec.ts @@ -5,7 +5,7 @@ import { u8aToHex, u8aToU8a } from '@polkadot/util'; import { waitReady } from '@polkadot/wasm-crypto'; import { keccakAsU8a } from '../keccak'; -import { performanceWasm } from '../test/performance'; +import { perfWasm } from '../test'; import { secp256k1Recover } from '.'; const sig = u8aToU8a('0x7505f2880114da51b3f5d535f8687953c0ab9af4ab81e592eaebebf53b728d2b6dfd9b5bcd70fee412b1f31360e7c2774009305cb84fc50c1d0ff8034dfa5fff'); @@ -25,7 +25,7 @@ describe('secp256k1Recover', (): void => { }); }); - performanceWasm('secp256k1Recover', 200, (_, onlyJs) => + perfWasm('secp256k1Recover', 200, (_, onlyJs) => secp256k1Recover(msg, sig, 0, undefined, onlyJs) ); }); diff --git a/packages/util-crypto/src/secp256k1/sign.spec.ts b/packages/util-crypto/src/secp256k1/sign.spec.ts index cd57f2667..7645c0e52 100644 --- a/packages/util-crypto/src/secp256k1/sign.spec.ts +++ b/packages/util-crypto/src/secp256k1/sign.spec.ts @@ -4,7 +4,7 @@ import { hexToU8a } from '@polkadot/util'; import { waitReady } from '@polkadot/wasm-crypto'; -import { performanceWasm } from '../test/performance'; +import { perfWasm } from '../test'; import { secp256k1PairFromSeed, secp256k1Sign } from '.'; const pair = secp256k1PairFromSeed(hexToU8a('0x4380de832af797688026ce24f85204d508243f201650c1a134929e5458b7fbae')); @@ -29,7 +29,7 @@ describe('sign', (): void => { // since the libsecp256k1 signatures don't match (but can be verified), we // do both signing and verification here (checking the extracted key) - performanceWasm('secp256k1Sign', 1000, (_, onlyJs) => + perfWasm('secp256k1Sign', 1000, (_, onlyJs) => secp256k1Sign(msg, pair, undefined, onlyJs) ); }); diff --git a/packages/util-crypto/src/secp256k1/verify.spec.ts b/packages/util-crypto/src/secp256k1/verify.spec.ts index e01f919d6..4cc71f110 100644 --- a/packages/util-crypto/src/secp256k1/verify.spec.ts +++ b/packages/util-crypto/src/secp256k1/verify.spec.ts @@ -6,7 +6,7 @@ import '../bundleInit'; import { hexToU8a } from '@polkadot/util'; import { waitReady } from '@polkadot/wasm-crypto'; -import { performanceWasm } from '../test/performance'; +import { perfWasm } from '../test'; import { hasher } from './hasher'; import { secp256k1PairFromSeed, secp256k1Verify } from '.'; @@ -63,7 +63,7 @@ describe('secp256k1Verify', (): void => { }); }); - performanceWasm('secp256k1Verify', 100, (_, onlyJs) => + perfWasm('secp256k1Verify', 100, (_, onlyJs) => secp256k1Verify( `\x19Ethereum Signed Message:\n${message.length.toString()}${message}`, '0x55bd020bdbbdc02de34e915effc9b18a99002f4c29f64e22e8dcbb69e722ea6c28e1bb53b9484063fbbfd205e49dcc1f620929f520c9c4c3695150f05a28f52a01', diff --git a/packages/util-crypto/src/sha/asU8a256.spec.ts b/packages/util-crypto/src/sha/asU8a256.spec.ts index e95c6a231..a369212a0 100644 --- a/packages/util-crypto/src/sha/asU8a256.spec.ts +++ b/packages/util-crypto/src/sha/asU8a256.spec.ts @@ -4,7 +4,7 @@ import { hexToU8a } from '@polkadot/util'; import { waitReady } from '@polkadot/wasm-crypto'; -import { performanceWasm } from '../test/performance'; +import { perfWasm } from '../test'; import { sha256AsU8a } from '.'; const TESTS = [ @@ -43,7 +43,7 @@ describe('sha256AsU8a', (): void => { }); }); - performanceWasm('sha256AsU8a', 128000, (input, onlyJs) => + perfWasm('sha256AsU8a', 128000, (input, onlyJs) => sha256AsU8a(input, onlyJs) ); }); diff --git a/packages/util-crypto/src/sha/asU8a512.spec.ts b/packages/util-crypto/src/sha/asU8a512.spec.ts index 8913e7883..f14e62b36 100644 --- a/packages/util-crypto/src/sha/asU8a512.spec.ts +++ b/packages/util-crypto/src/sha/asU8a512.spec.ts @@ -3,7 +3,7 @@ import { waitReady } from '@polkadot/wasm-crypto'; -import { performanceWasm } from '../test/performance'; +import { perfWasm } from '../test'; import { sha512AsU8a } from '.'; describe('sha512AsU8a', (): void => { @@ -23,7 +23,7 @@ describe('sha512AsU8a', (): void => { }); }); - performanceWasm('sha512AsU8a', 64000, (input, onlyJs) => + perfWasm('sha512AsU8a', 64000, (input, onlyJs) => sha512AsU8a(input, onlyJs) ); }); diff --git a/packages/util-crypto/src/test/index.ts b/packages/util-crypto/src/test/index.ts new file mode 100644 index 000000000..b18e1f7c6 --- /dev/null +++ b/packages/util-crypto/src/test/index.ts @@ -0,0 +1,6 @@ +// Copyright 2017-2023 @polkadot/util-crypto authors & contributors +// SPDX-License-Identifier: Apache-2.0 + +export { perf, perfCmp } from '@polkadot/util/test'; + +export { perfWasm } from './performance'; diff --git a/packages/util-crypto/src/test/performance.ts b/packages/util-crypto/src/test/performance.ts index 2783b74f6..f0765cd6d 100644 --- a/packages/util-crypto/src/test/performance.ts +++ b/packages/util-crypto/src/test/performance.ts @@ -2,7 +2,7 @@ // SPDX-License-Identifier: Apache-2.0 import { arrayRange } from '@polkadot/util'; -import { perf, perfCmp } from '@polkadot/util/test/performance'; +import { perf, perfCmp } from '@polkadot/util/test'; import { randomAsU8a } from '..'; @@ -10,7 +10,7 @@ type ExecFn = (input: Uint8Array, onlyJs: boolean) => unknown; const GENERATED = arrayRange(256).map(() => [randomAsU8a()]); -export function performanceWasm (name: string, count: number, exec: ExecFn, inputs = GENERATED): void { +export function perfWasm (name: string, count: number, exec: ExecFn, inputs = GENERATED): void { perfCmp(name, ['WebAssembly', 'JavaScript'], count, inputs, exec); } diff --git a/packages/util-crypto/src/xxhash/asU8a.spec.ts b/packages/util-crypto/src/xxhash/asU8a.spec.ts index fbc7e05c1..2b9ba1deb 100644 --- a/packages/util-crypto/src/xxhash/asU8a.spec.ts +++ b/packages/util-crypto/src/xxhash/asU8a.spec.ts @@ -4,7 +4,7 @@ import { hexToU8a } from '@polkadot/util'; import { waitReady } from '@polkadot/wasm-crypto'; -import { performanceWasm } from '../test/performance'; +import { perfWasm } from '../test'; import { xxhashAsU8a } from '.'; describe('xxhashAsU8a', (): void => { @@ -38,7 +38,7 @@ describe('xxhashAsU8a', (): void => { }); }); - performanceWasm('xxhashAsU8a', 8000, (input, onlyJs) => + perfWasm('xxhashAsU8a', 8000, (input, onlyJs) => xxhashAsU8a(input, 128, onlyJs) ); }); diff --git a/packages/util/src/array/chunk.spec.ts b/packages/util/src/array/chunk.spec.ts index 7ddf45556..54adc03e1 100644 --- a/packages/util/src/array/chunk.spec.ts +++ b/packages/util/src/array/chunk.spec.ts @@ -1,7 +1,7 @@ // Copyright 2017-2023 @polkadot/util authors & contributors // SPDX-License-Identifier: Apache-2.0 -import { perf } from '../test/performance'; +import { perf } from '../test'; import { arrayChunk, arrayRange } from '.'; describe('arrayChunk', (): void => { diff --git a/packages/util/src/array/flatten.spec.ts b/packages/util/src/array/flatten.spec.ts index 61db545eb..de578df16 100644 --- a/packages/util/src/array/flatten.spec.ts +++ b/packages/util/src/array/flatten.spec.ts @@ -1,7 +1,7 @@ // Copyright 2017-2023 @polkadot/util authors & contributors // SPDX-License-Identifier: Apache-2.0 -import { perf } from '../test/performance'; +import { perf } from '../test'; import { arrayFlatten } from '.'; const PERF_ONE = [[1, 2, 3, 4, 5]]; diff --git a/packages/util/src/array/shuffle.spec.ts b/packages/util/src/array/shuffle.spec.ts index 8a60c520f..eaf6290ef 100644 --- a/packages/util/src/array/shuffle.spec.ts +++ b/packages/util/src/array/shuffle.spec.ts @@ -1,7 +1,7 @@ // Copyright 2017-2023 @polkadot/util authors & contributors // SPDX-License-Identifier: Apache-2.0 -import { perf } from '../test/performance'; +import { perf } from '../test'; import { arrayRange, arrayShuffle } from '.'; const ptest = arrayRange(16284); diff --git a/packages/util/src/bi/toU8a.spec.ts b/packages/util/src/bi/toU8a.spec.ts index cba4566c7..179171f81 100644 --- a/packages/util/src/bi/toU8a.spec.ts +++ b/packages/util/src/bi/toU8a.spec.ts @@ -2,7 +2,7 @@ // SPDX-License-Identifier: Apache-2.0 import { arrayRange } from '../array'; -import { perf } from '../test/performance'; +import { perf } from '../test'; import { nToU8a } from '.'; const ptest = arrayRange(65536).map((v) => [v]); diff --git a/packages/util/src/bn/toU8a.spec.ts b/packages/util/src/bn/toU8a.spec.ts index a46a6d1b5..bffa4be46 100644 --- a/packages/util/src/bn/toU8a.spec.ts +++ b/packages/util/src/bn/toU8a.spec.ts @@ -2,7 +2,7 @@ // SPDX-License-Identifier: Apache-2.0 import { arrayRange } from '../array'; -import { perf } from '../test/performance'; +import { perf } from '../test'; import { BN, bnToU8a } from '.'; const ptest = arrayRange(65536).map((v) => [v]); diff --git a/packages/util/src/compact/fromU8a.spec.ts b/packages/util/src/compact/fromU8a.spec.ts index f2b339f17..94076c6b8 100644 --- a/packages/util/src/compact/fromU8a.spec.ts +++ b/packages/util/src/compact/fromU8a.spec.ts @@ -3,7 +3,7 @@ import { BN } from '../bn/bn'; import { hexToU8a } from '../hex/toU8a'; -import { perf } from '../test/performance'; +import { perf } from '../test'; import { compactFromU8a, compactFromU8aLim } from '.'; describe('compactFromU8a', (): void => { diff --git a/packages/util/src/hex/toU8a.spec.ts b/packages/util/src/hex/toU8a.spec.ts index d9be141e4..b8c86aa28 100644 --- a/packages/util/src/hex/toU8a.spec.ts +++ b/packages/util/src/hex/toU8a.spec.ts @@ -1,7 +1,7 @@ // Copyright 2017-2023 @polkadot/util authors & contributors // SPDX-License-Identifier: Apache-2.0 -import { perfCmp } from '../test/performance'; +import { perfCmp } from '../test'; import { hexToU8a as hexToU8aBuffer } from './toU8aBuffer'; import { hexToU8a } from '.'; @@ -72,7 +72,7 @@ describe('hexToU8a', (): void => { ).toThrow(/hex value to convert/); }); - perfCmp('hexToU8a', ['hexToU8aBuffer', 'hexToU8a'], 25, [[ptest]], (s: string, isSecond) => + perfCmp('hexToU8a', ['hexToU8aBuffer', 'hexToU8a'], 40, [[ptest]], (s: string, isSecond) => isSecond ? hexToU8a(s) : hexToU8aBuffer(s) diff --git a/packages/util/src/hex/toU8a.ts b/packages/util/src/hex/toU8a.ts index e07a94d50..e87d9a41a 100644 --- a/packages/util/src/hex/toU8a.ts +++ b/packages/util/src/hex/toU8a.ts @@ -4,8 +4,8 @@ import type { HexString } from '../types'; const CHR = '0123456789abcdef'; -const U8 = new Array(256); -const U16 = new Array(256 * 256); +const U8 = new Uint8Array(256); +const U16 = new Uint8Array(256 * 256); for (let i = 0; i < CHR.length; i++) { U8[CHR[i].charCodeAt(0) | 0] = i | 0; diff --git a/packages/util/src/is/ascii.spec.ts b/packages/util/src/is/ascii.spec.ts index bcd2dd064..91f1855b3 100644 --- a/packages/util/src/is/ascii.spec.ts +++ b/packages/util/src/is/ascii.spec.ts @@ -2,7 +2,7 @@ // SPDX-License-Identifier: Apache-2.0 import { stringToU8a } from '../string'; -import { perf } from '../test/performance'; +import { perf } from '../test'; import { isAscii } from '.'; describe('isAscii', (): void => { diff --git a/packages/util/src/is/codec.spec.ts b/packages/util/src/is/codec.spec.ts index 92fb5a9a7..aaabfa776 100644 --- a/packages/util/src/is/codec.spec.ts +++ b/packages/util/src/is/codec.spec.ts @@ -1,7 +1,7 @@ // Copyright 2017-2023 @polkadot/util authors & contributors // SPDX-License-Identifier: Apache-2.0 -import { perfCmp } from '../test/performance'; +import { perfCmp } from '../test'; import { isCodec } from '.'; const ptest = { diff --git a/packages/util/src/is/hex.spec.ts b/packages/util/src/is/hex.spec.ts index 437f4c00f..e7f36e8e6 100644 --- a/packages/util/src/is/hex.spec.ts +++ b/packages/util/src/is/hex.spec.ts @@ -1,7 +1,7 @@ // Copyright 2017-2023 @polkadot/util authors & contributors // SPDX-License-Identifier: Apache-2.0 -import { perf } from '../test/performance'; +import { perf } from '../test'; import { isHex } from '.'; describe('isHex', (): void => { diff --git a/packages/util/src/is/u8a.spec.ts b/packages/util/src/is/u8a.spec.ts index 85e63407d..09ebd56a3 100644 --- a/packages/util/src/is/u8a.spec.ts +++ b/packages/util/src/is/u8a.spec.ts @@ -1,7 +1,7 @@ // Copyright 2017-2023 @polkadot/util authors & contributors // SPDX-License-Identifier: Apache-2.0 -import { perf } from '../test/performance'; +import { perf } from '../test'; import { isU8a } from '.'; describe('isU8a', (): void => { diff --git a/packages/util/src/is/undefined.spec.ts b/packages/util/src/is/undefined.spec.ts index 13a962cb3..0e14496ee 100644 --- a/packages/util/src/is/undefined.spec.ts +++ b/packages/util/src/is/undefined.spec.ts @@ -1,7 +1,7 @@ // Copyright 2017-2023 @polkadot/util authors & contributors // SPDX-License-Identifier: Apache-2.0 -import { perf } from '../test/performance'; +import { perf } from '../test'; import { isUndefined } from '.'; describe('isUndefined', (): void => { diff --git a/packages/util/src/object/property.spec.ts b/packages/util/src/object/property.spec.ts index cd74a80d7..11f546bdc 100644 --- a/packages/util/src/object/property.spec.ts +++ b/packages/util/src/object/property.spec.ts @@ -1,7 +1,7 @@ // Copyright 2017-2023 @polkadot/util authors & contributors // SPDX-License-Identifier: Apache-2.0 -import { perf } from '../test/performance'; +import { perf } from '../test'; import { objectProperties, objectProperty } from '.'; describe('objectProperty/objectProperties', (): void => { diff --git a/packages/util/src/object/spread.spec.ts b/packages/util/src/object/spread.spec.ts index 0c318448d..ea46884a2 100644 --- a/packages/util/src/object/spread.spec.ts +++ b/packages/util/src/object/spread.spec.ts @@ -1,7 +1,7 @@ // Copyright 2017-2023 @polkadot/util authors & contributors // SPDX-License-Identifier: Apache-2.0 -import { perf } from '../test/performance'; +import { perf } from '../test'; import { objectSpread } from '.'; describe('objectSpread', (): void => { diff --git a/packages/util/src/string/camelCase.spec.ts b/packages/util/src/string/camelCase.spec.ts index 4287c8d19..6d49231f2 100644 --- a/packages/util/src/string/camelCase.spec.ts +++ b/packages/util/src/string/camelCase.spec.ts @@ -4,7 +4,7 @@ import { getRandomValues } from '@polkadot/x-randomvalues'; import { arrayRange } from '../array'; -import { perf } from '../test/performance'; +import { perf } from '../test'; import { stringCamelCase, stringUpperFirst } from '.'; const SEPS = [' ', '_', '-', '.', ',']; diff --git a/packages/util/src/string/lowerFirst.spec.ts b/packages/util/src/string/lowerFirst.spec.ts index e8ba94a0e..9bb1d8cb9 100644 --- a/packages/util/src/string/lowerFirst.spec.ts +++ b/packages/util/src/string/lowerFirst.spec.ts @@ -1,7 +1,7 @@ // Copyright 2017-2023 @polkadot/util authors & contributors // SPDX-License-Identifier: Apache-2.0 -import { perf } from '../test/performance'; +import { perf } from '../test'; import { stringLowerFirst } from '.'; describe('stringLowerFirst', (): void => { diff --git a/packages/util/src/string/upperFirst.spec.ts b/packages/util/src/string/upperFirst.spec.ts index f26fff2e2..22ad3fc8e 100644 --- a/packages/util/src/string/upperFirst.spec.ts +++ b/packages/util/src/string/upperFirst.spec.ts @@ -1,7 +1,7 @@ // Copyright 2017-2023 @polkadot/util authors & contributors // SPDX-License-Identifier: Apache-2.0 -import { perf } from '../test/performance'; +import { perf } from '../test'; import { stringUpperFirst } from '.'; describe('stringUpperFirst', (): void => { diff --git a/packages/util/src/test/index.ts b/packages/util/src/test/index.ts new file mode 100644 index 000000000..0ad5e889c --- /dev/null +++ b/packages/util/src/test/index.ts @@ -0,0 +1,4 @@ +// Copyright 2017-2023 @polkadot/util authors & contributors +// SPDX-License-Identifier: Apache-2.0 + +export { perf, perfCmp } from './performance'; diff --git a/packages/util/src/u8a/cmp.spec.ts b/packages/util/src/u8a/cmp.spec.ts index 56979f0f5..eef7e0eec 100644 --- a/packages/util/src/u8a/cmp.spec.ts +++ b/packages/util/src/u8a/cmp.spec.ts @@ -1,7 +1,7 @@ // Copyright 2017-2023 @polkadot/util authors & contributors // SPDX-License-Identifier: Apache-2.0 -import { perf } from '../test/performance'; +import { perf } from '../test'; import { u8aCmp } from '.'; const ltest = new Uint8Array(32768); diff --git a/packages/util/src/u8a/concat.spec.ts b/packages/util/src/u8a/concat.spec.ts index 90529fd7a..cfde8ab41 100644 --- a/packages/util/src/u8a/concat.spec.ts +++ b/packages/util/src/u8a/concat.spec.ts @@ -4,7 +4,7 @@ import { getRandomValues } from '@polkadot/x-randomvalues'; import { arrayRange } from '../array'; -import { perf } from '../test/performance'; +import { perf } from '../test'; import { u8aConcat, u8aConcatStrict } from '.'; const ptest = arrayRange(10).map(() => getRandomValues(new Uint8Array(32))); diff --git a/packages/util/src/u8a/empty.spec.ts b/packages/util/src/u8a/empty.spec.ts index 5812a7e08..e76371557 100644 --- a/packages/util/src/u8a/empty.spec.ts +++ b/packages/util/src/u8a/empty.spec.ts @@ -1,7 +1,7 @@ // Copyright 2017-2023 @polkadot/util authors & contributors // SPDX-License-Identifier: Apache-2.0 -import { perf } from '../test/performance'; +import { perf } from '../test'; import { u8aEmpty } from '.'; describe('u8aEmpty', (): void => { diff --git a/packages/util/src/u8a/eq.spec.ts b/packages/util/src/u8a/eq.spec.ts index 17e4eefbc..9fa0b309b 100644 --- a/packages/util/src/u8a/eq.spec.ts +++ b/packages/util/src/u8a/eq.spec.ts @@ -1,7 +1,7 @@ // Copyright 2017-2023 @polkadot/util authors & contributors // SPDX-License-Identifier: Apache-2.0 -import { perf } from '../test/performance'; +import { perf } from '../test'; import { u8aEq } from '.'; const ltest = new Uint8Array(32768); diff --git a/packages/util/src/u8a/toBigInt.spec.ts b/packages/util/src/u8a/toBigInt.spec.ts index c4ca3e5a8..b43a1d12f 100644 --- a/packages/util/src/u8a/toBigInt.spec.ts +++ b/packages/util/src/u8a/toBigInt.spec.ts @@ -1,7 +1,7 @@ // Copyright 2017-2023 @polkadot/util authors & contributors // SPDX-License-Identifier: Apache-2.0 -import { perf } from '../test/performance'; +import { perf } from '../test'; import { u8aToBigInt } from '.'; describe('u8aToBigInt', (): void => { diff --git a/packages/util/src/u8a/toBn.spec.ts b/packages/util/src/u8a/toBn.spec.ts index 517a89bef..deaa839be 100644 --- a/packages/util/src/u8a/toBn.spec.ts +++ b/packages/util/src/u8a/toBn.spec.ts @@ -1,7 +1,7 @@ // Copyright 2017-2023 @polkadot/util authors & contributors // SPDX-License-Identifier: Apache-2.0 -import { perf } from '../test/performance'; +import { perf } from '../test'; import { u8aToBn } from '.'; describe('u8aToBn', (): void => { diff --git a/packages/util/src/u8a/toHex.spec.ts b/packages/util/src/u8a/toHex.spec.ts index 618b8290f..c8aad80cd 100644 --- a/packages/util/src/u8a/toHex.spec.ts +++ b/packages/util/src/u8a/toHex.spec.ts @@ -1,7 +1,7 @@ // Copyright 2017-2023 @polkadot/util authors & contributors // SPDX-License-Identifier: Apache-2.0 -import { perfCmp } from '../test/performance'; +import { perfCmp } from '../test'; import { u8aToHex as u8aToHexBuffer } from './toHexBuffer'; import { u8aToHex } from '.'; diff --git a/packages/util/src/u8a/toNumber.spec.ts b/packages/util/src/u8a/toNumber.spec.ts index d6b626dfc..c5d48ebb8 100644 --- a/packages/util/src/u8a/toNumber.spec.ts +++ b/packages/util/src/u8a/toNumber.spec.ts @@ -1,7 +1,7 @@ // Copyright 2017-2023 @polkadot/util authors & contributors // SPDX-License-Identifier: Apache-2.0 -import { perf } from '../test/performance'; +import { perf } from '../test'; import { u8aToNumber } from '.'; describe('u8aToNumber', (): void => { diff --git a/packages/util/src/u8a/toU8a.spec.ts b/packages/util/src/u8a/toU8a.spec.ts index 30bf59c0d..6861a6b01 100644 --- a/packages/util/src/u8a/toU8a.spec.ts +++ b/packages/util/src/u8a/toU8a.spec.ts @@ -1,7 +1,7 @@ // Copyright 2017-2023 @polkadot/util authors & contributors // SPDX-License-Identifier: Apache-2.0 -import { perf } from '../test/performance'; +import { perf } from '../test'; import { u8aToU8a } from '.'; describe('u8aToU8a', (): void => { diff --git a/packages/x-randomvalues/package.json b/packages/x-randomvalues/package.json index cc9c732fb..36e10a99b 100644 --- a/packages/x-randomvalues/package.json +++ b/packages/x-randomvalues/package.json @@ -26,6 +26,7 @@ "@polkadot/x-global": "10.2.7-7-x" }, "devDependencies": { + "@polkadot/util": "10.2.7-7-x", "@types/react-native": "^0.71.0" }, "denoDependencies": { diff --git a/packages/x-randomvalues/src/base64.spec.ts b/packages/x-randomvalues/src/base64.spec.ts index 14bb69fe8..7c86fcb3c 100644 --- a/packages/x-randomvalues/src/base64.spec.ts +++ b/packages/x-randomvalues/src/base64.spec.ts @@ -1,12 +1,16 @@ // Copyright 2017-2023 @polkadot/util-crypto authors & contributors // SPDX-License-Identifier: Apache-2.0 +import { perf } from '@polkadot/util/test'; + import { base64Decode } from './base64'; +const HELLO_DUAL = 'aGVsbG8gd29ybGQg0J/RgNC40LLQtdGC0YHRgtCy0YPRjiDQvNC4IOS9oOWlvQ=='; + const TESTS = [ { // hello world Приветствую ми 你好 - base64: 'aGVsbG8gd29ybGQg0J/RgNC40LLQtdGC0YHRgtCy0YPRjiDQvNC4IOS9oOWlvQ==', + base64: HELLO_DUAL, expect: new Uint8Array([104, 101, 108, 108, 111, 32, 119, 111, 114, 108, 100, 32, 208, 159, 209, 128, 208, 184, 208, 178, 208, 181, 209, 130, 209, 129, 209, 130, 208, 178, 209, 131, 209, 142, 32, 208, 188, 208, 184, 32, 228, 189, 160, 229, 165, 189]) }, { @@ -40,3 +44,5 @@ describe('base64Decode', (): void => { ).toEqual(test.expect); }); }); + +perf('base64Decode (hello, dual)', 100_000, [[HELLO_DUAL]], base64Decode); diff --git a/packages/x-randomvalues/src/base64.ts b/packages/x-randomvalues/src/base64.ts index a2f6fc4a2..99fbc0b51 100644 --- a/packages/x-randomvalues/src/base64.ts +++ b/packages/x-randomvalues/src/base64.ts @@ -9,6 +9,14 @@ // We provide an own (tiny) decoder to not have Buffer deps const chars = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/'; +const map = new Uint8Array(256); + +// We use charCodeAt for access here and in the decoder loop - this is faster +// on lookups (array + numbers) and also faster than accessing the specific +// character via data[i] (around a 50% improvement on perf tests) +for (let i = 0; i < chars.length; i++) { + map[chars.charCodeAt(i)] = i; +} export function base64Decode (data: string): Uint8Array { const bytes = []; @@ -17,7 +25,7 @@ export function base64Decode (data: string): Uint8Array { for (let i = 0; i < data.length && data[i] !== '='; i++) { // each character represents 6 bits - byte = (byte << 6) | chars.indexOf(data[i]); + byte = (byte << 6) | map[data.charCodeAt(i)]; // each byte needs to contain 8 bits if ((bits += 6) >= 8) { diff --git a/packages/x-randomvalues/tsconfig.build.json b/packages/x-randomvalues/tsconfig.build.json index 9f4369850..1d856f796 100644 --- a/packages/x-randomvalues/tsconfig.build.json +++ b/packages/x-randomvalues/tsconfig.build.json @@ -5,6 +5,9 @@ "outDir": "./build", "rootDir": "./src" }, + "exclude": [ + "**/*.spec.ts" + ], "references": [ { "path": "../x-global/tsconfig.build.json" } ] diff --git a/packages/x-randomvalues/tsconfig.spec.json b/packages/x-randomvalues/tsconfig.spec.json new file mode 100644 index 000000000..8d5886f77 --- /dev/null +++ b/packages/x-randomvalues/tsconfig.spec.json @@ -0,0 +1,18 @@ +{ + "extends": "../../tsconfig.base.json", + "compilerOptions": { + "baseUrl": "..", + "outDir": "./build", + "rootDir": "./src", + "resolveJsonModule": true, + "emitDeclarationOnly": false, + "noEmit": true + }, + "include": [ + "**/*.spec.ts" + ], + "references": [ + { "path": "../util/tsconfig.build.json" }, + { "path": "../x-global/tsconfig.build.json" } + ] +} diff --git a/tsconfig.build.json b/tsconfig.build.json index 75ddc8c06..40cec2bbd 100644 --- a/tsconfig.build.json +++ b/tsconfig.build.json @@ -15,6 +15,7 @@ { "path": "./packages/x-fetch/tsconfig.build.json" }, { "path": "./packages/x-global/tsconfig.build.json" }, { "path": "./packages/x-randomvalues/tsconfig.build.json" }, + { "path": "./packages/x-randomvalues/tsconfig.spec.json" }, { "path": "./packages/x-textdecoder/tsconfig.build.json" }, { "path": "./packages/x-textencoder/tsconfig.build.json" }, { "path": "./packages/x-ws/tsconfig.build.json" } diff --git a/yarn.lock b/yarn.lock index 3b384d00d..6f067bdb3 100644 --- a/yarn.lock +++ b/yarn.lock @@ -2411,6 +2411,7 @@ __metadata: resolution: "@polkadot/x-randomvalues@workspace:packages/x-randomvalues" dependencies: "@babel/runtime": ^7.20.13 + "@polkadot/util": 10.2.7-7-x "@polkadot/x-global": 10.2.7-7-x "@types/react-native": ^0.71.0 languageName: unknown