@btc-vision/bitcoin 6.4.10 → 6.5.1
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/.babelrc +13 -4
- package/.mocharc.json +13 -13
- package/.prettierrc.json +12 -12
- package/CHANGELOG.md +403 -403
- package/CONTRIBUTING.md +83 -83
- package/LICENSE +21 -21
- package/README.md +201 -201
- package/browser/chunks/crypto-C6FlKKmp.js +2006 -0
- package/browser/chunks/payments-BE4vwHhV.js +1045 -0
- package/browser/chunks/psbt-Dlosf9CT.js +3853 -0
- package/browser/chunks/script-COWGdiOo.js +318 -0
- package/browser/chunks/transaction-BiXwH2v4.js +421 -0
- package/browser/chunks/utils-BKmkTzNZ.js +759 -0
- package/browser/crypto/crypto.d.ts +1 -1
- package/browser/index.d.ts +7 -27
- package/browser/index.js +92 -2
- package/build/index.d.ts +7 -27
- package/build/index.js +2 -2
- package/cjs/package.json +3 -3
- package/gulpfile.js +42 -42
- package/package.json +153 -150
- package/src/bip66.ts +107 -107
- package/src/block.ts +233 -233
- package/src/bufferutils.ts +188 -188
- package/src/crypto.ts +108 -108
- package/src/ecc_lib.ts +94 -94
- package/src/hooks/AdvancedSignatureManager.ts +104 -104
- package/src/hooks/SignatureManager.ts +84 -84
- package/src/index.ts +83 -105
- package/src/merkle.ts +31 -31
- package/src/opcodes.ts +280 -280
- package/src/payments/bip341.ts +140 -140
- package/src/payments/embed.ts +61 -61
- package/src/payments/index.ts +172 -172
- package/src/payments/lazy.ts +28 -28
- package/src/payments/p2ms.ts +156 -156
- package/src/payments/p2op.ts +195 -195
- package/src/payments/p2pk.ts +93 -93
- package/src/payments/p2pkh.ts +214 -214
- package/src/payments/p2tr.ts +309 -309
- package/src/psbt/bip371.ts +441 -441
- package/src/push_data.ts +97 -97
- package/src/script.ts +247 -247
- package/src/script_number.ts +72 -72
- package/src/script_signature.ts +91 -91
- package/src/transaction.ts +656 -656
- package/test/address.spec.ts +155 -155
- package/test/bitcoin.core.spec.ts +212 -212
- package/test/block.spec.ts +171 -171
- package/test/bufferutils.spec.ts +450 -450
- package/test/crypto.spec.ts +49 -49
- package/test/fixtures/address.json +329 -329
- package/test/fixtures/block.json +148 -148
- package/test/fixtures/bufferutils.json +102 -102
- package/test/fixtures/core/README.md +26 -26
- package/test/fixtures/core/base58_encode_decode.json +50 -50
- package/test/fixtures/core/base58_keys_invalid.json +152 -152
- package/test/fixtures/core/base58_keys_valid.json +452 -452
- package/test/fixtures/core/blocks.json +27 -27
- package/test/fixtures/core/sig_canonical.json +7 -7
- package/test/fixtures/core/sig_noncanonical.json +33 -33
- package/test/fixtures/core/sighash.json +3505 -3505
- package/test/fixtures/core/tx_valid.json +2023 -2023
- package/test/fixtures/crypto.json +43 -43
- package/test/fixtures/ecdsa.json +217 -217
- package/test/fixtures/ecpair.json +141 -141
- package/test/fixtures/embed.json +108 -108
- package/test/fixtures/p2ms.json +434 -434
- package/test/fixtures/p2pk.json +179 -179
- package/test/fixtures/p2pkh.json +276 -276
- package/test/fixtures/p2sh.json +508 -508
- package/test/fixtures/p2tr.json +1198 -1198
- package/test/fixtures/p2wpkh.json +290 -290
- package/test/fixtures/p2wsh.json +489 -489
- package/test/fixtures/psbt.json +924 -924
- package/test/fixtures/script.json +465 -465
- package/test/fixtures/script_number.json +225 -225
- package/test/fixtures/signature.json +140 -140
- package/test/fixtures/transaction.json +916 -916
- package/test/integration/_regtest.ts +6 -6
- package/test/integration/addresses.spec.ts +142 -142
- package/test/integration/bip32.spec.ts +130 -130
- package/test/integration/blocks.spec.ts +28 -28
- package/test/integration/cltv.spec.ts +241 -241
- package/test/integration/csv.spec.ts +452 -452
- package/test/integration/payments.spec.ts +110 -110
- package/test/integration/taproot.spec.ts +663 -663
- package/test/integration/transactions.spec.ts +668 -668
- package/test/payments.spec.ts +114 -114
- package/test/payments.utils.ts +165 -165
- package/test/psbt.spec.ts +1285 -1285
- package/test/script.spec.ts +186 -186
- package/test/script_number.spec.ts +26 -26
- package/test/script_signature.spec.ts +66 -66
- package/test/transaction.spec.ts +337 -337
- package/test/ts-node-register.js +7 -7
- package/test/tsconfig.json +48 -48
- package/test/types.spec.ts +53 -53
- package/tsconfig.base.json +27 -27
- package/tsconfig.json +19 -19
- package/tsconfig.webpack.json +18 -18
- package/vite.config.browser.ts +93 -0
- package/.yarn/unplugged/node-gyp-npm-10.2.0-cad1109948/node_modules/node-gyp/.ready +0 -0
- package/.yarn/unplugged/node-gyp-npm-10.2.0-cad1109948/node_modules/node-gyp/.release-please-manifest.json +0 -3
- package/.yarn/unplugged/node-gyp-npm-10.2.0-cad1109948/node_modules/node-gyp/CHANGELOG.md +0 -962
- package/.yarn/unplugged/node-gyp-npm-10.2.0-cad1109948/node_modules/node-gyp/CONTRIBUTING.md +0 -34
- package/.yarn/unplugged/node-gyp-npm-10.2.0-cad1109948/node_modules/node-gyp/LICENSE +0 -24
- package/.yarn/unplugged/node-gyp-npm-10.2.0-cad1109948/node_modules/node-gyp/README.md +0 -273
- package/.yarn/unplugged/node-gyp-npm-10.2.0-cad1109948/node_modules/node-gyp/SECURITY.md +0 -2
- package/.yarn/unplugged/node-gyp-npm-10.2.0-cad1109948/node_modules/node-gyp/addon.gypi +0 -204
- package/.yarn/unplugged/node-gyp-npm-10.2.0-cad1109948/node_modules/node-gyp/bin/node-gyp.js +0 -138
- package/.yarn/unplugged/node-gyp-npm-10.2.0-cad1109948/node_modules/node-gyp/gyp/.release-please-manifest.json +0 -3
- package/.yarn/unplugged/node-gyp-npm-10.2.0-cad1109948/node_modules/node-gyp/gyp/LICENSE +0 -28
- package/.yarn/unplugged/node-gyp-npm-10.2.0-cad1109948/node_modules/node-gyp/gyp/data/ninja/build.ninja +0 -4
- package/.yarn/unplugged/node-gyp-npm-10.2.0-cad1109948/node_modules/node-gyp/gyp/data/win/large-pdb-shim.cc +0 -12
- package/.yarn/unplugged/node-gyp-npm-10.2.0-cad1109948/node_modules/node-gyp/gyp/docs/GypVsCMake.md +0 -116
- package/.yarn/unplugged/node-gyp-npm-10.2.0-cad1109948/node_modules/node-gyp/gyp/docs/Hacking.md +0 -46
- package/.yarn/unplugged/node-gyp-npm-10.2.0-cad1109948/node_modules/node-gyp/gyp/docs/InputFormatReference.md +0 -1080
- package/.yarn/unplugged/node-gyp-npm-10.2.0-cad1109948/node_modules/node-gyp/gyp/docs/LanguageSpecification.md +0 -430
- package/.yarn/unplugged/node-gyp-npm-10.2.0-cad1109948/node_modules/node-gyp/gyp/docs/README.md +0 -27
- package/.yarn/unplugged/node-gyp-npm-10.2.0-cad1109948/node_modules/node-gyp/gyp/docs/Testing.md +0 -450
- package/.yarn/unplugged/node-gyp-npm-10.2.0-cad1109948/node_modules/node-gyp/gyp/docs/UserDocumentation.md +0 -965
- package/.yarn/unplugged/node-gyp-npm-10.2.0-cad1109948/node_modules/node-gyp/gyp/gyp +0 -8
- package/.yarn/unplugged/node-gyp-npm-10.2.0-cad1109948/node_modules/node-gyp/gyp/gyp.bat +0 -5
- package/.yarn/unplugged/node-gyp-npm-10.2.0-cad1109948/node_modules/node-gyp/gyp/gyp_main.py +0 -45
- package/.yarn/unplugged/node-gyp-npm-10.2.0-cad1109948/node_modules/node-gyp/gyp/pylib/gyp/MSVSNew.py +0 -365
- package/.yarn/unplugged/node-gyp-npm-10.2.0-cad1109948/node_modules/node-gyp/gyp/pylib/gyp/MSVSProject.py +0 -206
- package/.yarn/unplugged/node-gyp-npm-10.2.0-cad1109948/node_modules/node-gyp/gyp/pylib/gyp/MSVSSettings.py +0 -1272
- package/.yarn/unplugged/node-gyp-npm-10.2.0-cad1109948/node_modules/node-gyp/gyp/pylib/gyp/MSVSSettings_test.py +0 -1547
- package/.yarn/unplugged/node-gyp-npm-10.2.0-cad1109948/node_modules/node-gyp/gyp/pylib/gyp/MSVSToolFile.py +0 -59
- package/.yarn/unplugged/node-gyp-npm-10.2.0-cad1109948/node_modules/node-gyp/gyp/pylib/gyp/MSVSUserFile.py +0 -153
- package/.yarn/unplugged/node-gyp-npm-10.2.0-cad1109948/node_modules/node-gyp/gyp/pylib/gyp/MSVSUtil.py +0 -271
- package/.yarn/unplugged/node-gyp-npm-10.2.0-cad1109948/node_modules/node-gyp/gyp/pylib/gyp/MSVSVersion.py +0 -574
- package/.yarn/unplugged/node-gyp-npm-10.2.0-cad1109948/node_modules/node-gyp/gyp/pylib/gyp/__init__.py +0 -692
- package/.yarn/unplugged/node-gyp-npm-10.2.0-cad1109948/node_modules/node-gyp/gyp/pylib/gyp/common.py +0 -711
- package/.yarn/unplugged/node-gyp-npm-10.2.0-cad1109948/node_modules/node-gyp/gyp/pylib/gyp/common_test.py +0 -171
- package/.yarn/unplugged/node-gyp-npm-10.2.0-cad1109948/node_modules/node-gyp/gyp/pylib/gyp/easy_xml.py +0 -169
- package/.yarn/unplugged/node-gyp-npm-10.2.0-cad1109948/node_modules/node-gyp/gyp/pylib/gyp/easy_xml_test.py +0 -113
- package/.yarn/unplugged/node-gyp-npm-10.2.0-cad1109948/node_modules/node-gyp/gyp/pylib/gyp/flock_tool.py +0 -55
- package/.yarn/unplugged/node-gyp-npm-10.2.0-cad1109948/node_modules/node-gyp/gyp/pylib/gyp/generator/__init__.py +0 -0
- package/.yarn/unplugged/node-gyp-npm-10.2.0-cad1109948/node_modules/node-gyp/gyp/pylib/gyp/generator/analyzer.py +0 -804
- package/.yarn/unplugged/node-gyp-npm-10.2.0-cad1109948/node_modules/node-gyp/gyp/pylib/gyp/generator/android.py +0 -1173
- package/.yarn/unplugged/node-gyp-npm-10.2.0-cad1109948/node_modules/node-gyp/gyp/pylib/gyp/generator/cmake.py +0 -1318
- package/.yarn/unplugged/node-gyp-npm-10.2.0-cad1109948/node_modules/node-gyp/gyp/pylib/gyp/generator/compile_commands_json.py +0 -127
- package/.yarn/unplugged/node-gyp-npm-10.2.0-cad1109948/node_modules/node-gyp/gyp/pylib/gyp/generator/dump_dependency_json.py +0 -103
- package/.yarn/unplugged/node-gyp-npm-10.2.0-cad1109948/node_modules/node-gyp/gyp/pylib/gyp/generator/eclipse.py +0 -461
- package/.yarn/unplugged/node-gyp-npm-10.2.0-cad1109948/node_modules/node-gyp/gyp/pylib/gyp/generator/gypd.py +0 -89
- package/.yarn/unplugged/node-gyp-npm-10.2.0-cad1109948/node_modules/node-gyp/gyp/pylib/gyp/generator/gypsh.py +0 -57
- package/.yarn/unplugged/node-gyp-npm-10.2.0-cad1109948/node_modules/node-gyp/gyp/pylib/gyp/generator/make.py +0 -2745
- package/.yarn/unplugged/node-gyp-npm-10.2.0-cad1109948/node_modules/node-gyp/gyp/pylib/gyp/generator/msvs.py +0 -3976
- package/.yarn/unplugged/node-gyp-npm-10.2.0-cad1109948/node_modules/node-gyp/gyp/pylib/gyp/generator/msvs_test.py +0 -44
- package/.yarn/unplugged/node-gyp-npm-10.2.0-cad1109948/node_modules/node-gyp/gyp/pylib/gyp/generator/ninja.py +0 -2964
- package/.yarn/unplugged/node-gyp-npm-10.2.0-cad1109948/node_modules/node-gyp/gyp/pylib/gyp/generator/ninja_test.py +0 -67
- package/.yarn/unplugged/node-gyp-npm-10.2.0-cad1109948/node_modules/node-gyp/gyp/pylib/gyp/generator/xcode.py +0 -1391
- package/.yarn/unplugged/node-gyp-npm-10.2.0-cad1109948/node_modules/node-gyp/gyp/pylib/gyp/generator/xcode_test.py +0 -25
- package/.yarn/unplugged/node-gyp-npm-10.2.0-cad1109948/node_modules/node-gyp/gyp/pylib/gyp/input.py +0 -3115
- package/.yarn/unplugged/node-gyp-npm-10.2.0-cad1109948/node_modules/node-gyp/gyp/pylib/gyp/input_test.py +0 -98
- package/.yarn/unplugged/node-gyp-npm-10.2.0-cad1109948/node_modules/node-gyp/gyp/pylib/gyp/mac_tool.py +0 -771
- package/.yarn/unplugged/node-gyp-npm-10.2.0-cad1109948/node_modules/node-gyp/gyp/pylib/gyp/msvs_emulation.py +0 -1260
- package/.yarn/unplugged/node-gyp-npm-10.2.0-cad1109948/node_modules/node-gyp/gyp/pylib/gyp/ninja_syntax.py +0 -174
- package/.yarn/unplugged/node-gyp-npm-10.2.0-cad1109948/node_modules/node-gyp/gyp/pylib/gyp/simple_copy.py +0 -61
- package/.yarn/unplugged/node-gyp-npm-10.2.0-cad1109948/node_modules/node-gyp/gyp/pylib/gyp/win_tool.py +0 -373
- package/.yarn/unplugged/node-gyp-npm-10.2.0-cad1109948/node_modules/node-gyp/gyp/pylib/gyp/xcode_emulation.py +0 -1938
- package/.yarn/unplugged/node-gyp-npm-10.2.0-cad1109948/node_modules/node-gyp/gyp/pylib/gyp/xcode_emulation_test.py +0 -53
- package/.yarn/unplugged/node-gyp-npm-10.2.0-cad1109948/node_modules/node-gyp/gyp/pylib/gyp/xcode_ninja.py +0 -302
- package/.yarn/unplugged/node-gyp-npm-10.2.0-cad1109948/node_modules/node-gyp/gyp/pylib/gyp/xcodeproj_file.py +0 -3198
- package/.yarn/unplugged/node-gyp-npm-10.2.0-cad1109948/node_modules/node-gyp/gyp/pylib/gyp/xml_fix.py +0 -65
- package/.yarn/unplugged/node-gyp-npm-10.2.0-cad1109948/node_modules/node-gyp/gyp/pylib/packaging/LICENSE +0 -3
- package/.yarn/unplugged/node-gyp-npm-10.2.0-cad1109948/node_modules/node-gyp/gyp/pylib/packaging/LICENSE.APACHE +0 -177
- package/.yarn/unplugged/node-gyp-npm-10.2.0-cad1109948/node_modules/node-gyp/gyp/pylib/packaging/LICENSE.BSD +0 -23
- package/.yarn/unplugged/node-gyp-npm-10.2.0-cad1109948/node_modules/node-gyp/gyp/pylib/packaging/__init__.py +0 -15
- package/.yarn/unplugged/node-gyp-npm-10.2.0-cad1109948/node_modules/node-gyp/gyp/pylib/packaging/_elffile.py +0 -108
- package/.yarn/unplugged/node-gyp-npm-10.2.0-cad1109948/node_modules/node-gyp/gyp/pylib/packaging/_manylinux.py +0 -252
- package/.yarn/unplugged/node-gyp-npm-10.2.0-cad1109948/node_modules/node-gyp/gyp/pylib/packaging/_musllinux.py +0 -83
- package/.yarn/unplugged/node-gyp-npm-10.2.0-cad1109948/node_modules/node-gyp/gyp/pylib/packaging/_parser.py +0 -359
- package/.yarn/unplugged/node-gyp-npm-10.2.0-cad1109948/node_modules/node-gyp/gyp/pylib/packaging/_structures.py +0 -61
- package/.yarn/unplugged/node-gyp-npm-10.2.0-cad1109948/node_modules/node-gyp/gyp/pylib/packaging/_tokenizer.py +0 -192
- package/.yarn/unplugged/node-gyp-npm-10.2.0-cad1109948/node_modules/node-gyp/gyp/pylib/packaging/markers.py +0 -252
- package/.yarn/unplugged/node-gyp-npm-10.2.0-cad1109948/node_modules/node-gyp/gyp/pylib/packaging/metadata.py +0 -825
- package/.yarn/unplugged/node-gyp-npm-10.2.0-cad1109948/node_modules/node-gyp/gyp/pylib/packaging/py.typed +0 -0
- package/.yarn/unplugged/node-gyp-npm-10.2.0-cad1109948/node_modules/node-gyp/gyp/pylib/packaging/requirements.py +0 -90
- package/.yarn/unplugged/node-gyp-npm-10.2.0-cad1109948/node_modules/node-gyp/gyp/pylib/packaging/specifiers.py +0 -1030
- package/.yarn/unplugged/node-gyp-npm-10.2.0-cad1109948/node_modules/node-gyp/gyp/pylib/packaging/tags.py +0 -553
- package/.yarn/unplugged/node-gyp-npm-10.2.0-cad1109948/node_modules/node-gyp/gyp/pylib/packaging/utils.py +0 -172
- package/.yarn/unplugged/node-gyp-npm-10.2.0-cad1109948/node_modules/node-gyp/gyp/pylib/packaging/version.py +0 -563
- package/.yarn/unplugged/node-gyp-npm-10.2.0-cad1109948/node_modules/node-gyp/gyp/pyproject.toml +0 -120
- package/.yarn/unplugged/node-gyp-npm-10.2.0-cad1109948/node_modules/node-gyp/gyp/release-please-config.json +0 -11
- package/.yarn/unplugged/node-gyp-npm-10.2.0-cad1109948/node_modules/node-gyp/gyp/test_gyp.py +0 -261
- package/.yarn/unplugged/node-gyp-npm-10.2.0-cad1109948/node_modules/node-gyp/lib/Find-VisualStudio.cs +0 -250
- package/.yarn/unplugged/node-gyp-npm-10.2.0-cad1109948/node_modules/node-gyp/lib/build.js +0 -227
- package/.yarn/unplugged/node-gyp-npm-10.2.0-cad1109948/node_modules/node-gyp/lib/clean.js +0 -15
- package/.yarn/unplugged/node-gyp-npm-10.2.0-cad1109948/node_modules/node-gyp/lib/configure.js +0 -328
- package/.yarn/unplugged/node-gyp-npm-10.2.0-cad1109948/node_modules/node-gyp/lib/create-config-gypi.js +0 -150
- package/.yarn/unplugged/node-gyp-npm-10.2.0-cad1109948/node_modules/node-gyp/lib/download.js +0 -39
- package/.yarn/unplugged/node-gyp-npm-10.2.0-cad1109948/node_modules/node-gyp/lib/find-node-directory.js +0 -63
- package/.yarn/unplugged/node-gyp-npm-10.2.0-cad1109948/node_modules/node-gyp/lib/find-python.js +0 -310
- package/.yarn/unplugged/node-gyp-npm-10.2.0-cad1109948/node_modules/node-gyp/lib/find-visualstudio.js +0 -590
- package/.yarn/unplugged/node-gyp-npm-10.2.0-cad1109948/node_modules/node-gyp/lib/install.js +0 -415
- package/.yarn/unplugged/node-gyp-npm-10.2.0-cad1109948/node_modules/node-gyp/lib/list.js +0 -26
- package/.yarn/unplugged/node-gyp-npm-10.2.0-cad1109948/node_modules/node-gyp/lib/log.js +0 -168
- package/.yarn/unplugged/node-gyp-npm-10.2.0-cad1109948/node_modules/node-gyp/lib/node-gyp.js +0 -188
- package/.yarn/unplugged/node-gyp-npm-10.2.0-cad1109948/node_modules/node-gyp/lib/process-release.js +0 -146
- package/.yarn/unplugged/node-gyp-npm-10.2.0-cad1109948/node_modules/node-gyp/lib/rebuild.js +0 -12
- package/.yarn/unplugged/node-gyp-npm-10.2.0-cad1109948/node_modules/node-gyp/lib/remove.js +0 -43
- package/.yarn/unplugged/node-gyp-npm-10.2.0-cad1109948/node_modules/node-gyp/lib/util.js +0 -81
- package/.yarn/unplugged/node-gyp-npm-10.2.0-cad1109948/node_modules/node-gyp/macOS_Catalina_acid_test.sh +0 -21
- package/.yarn/unplugged/node-gyp-npm-10.2.0-cad1109948/node_modules/node-gyp/package.json +0 -51
- package/.yarn/unplugged/node-gyp-npm-10.2.0-cad1109948/node_modules/node-gyp/release-please-config.json +0 -40
- package/.yarn/unplugged/node-gyp-npm-10.2.0-cad1109948/node_modules/node-gyp/src/win_delay_load_hook.cc +0 -39
- package/browser/index.js.LICENSE.txt +0 -14
- package/browser/ops.d.ts +0 -126
- package/build/ops.d.ts +0 -126
- package/build/ops.js +0 -127
- package/coverage/tmp/coverage-31752-1735543485354-0.json +0 -1
- package/coverage/tmp/coverage-59920-1735543484555-0.json +0 -1
- package/coverage/tmp/coverage-66252-1735543483919-0.json +0 -1
- package/coverage/tmp/coverage-68440-1735543485236-0.json +0 -1
- package/coverage/tmp/coverage-70588-1735543484426-0.json +0 -1
- package/coverage/tmp/coverage-79292-1735543485296-0.json +0 -1
- package/coverage/tmp/coverage-80212-1735543483980-0.json +0 -1
package/src/ecc_lib.ts
CHANGED
|
@@ -1,94 +1,94 @@
|
|
|
1
|
-
import { TinySecp256k1Interface } from './types.js';
|
|
2
|
-
|
|
3
|
-
const _ECCLIB_CACHE: { eccLib?: TinySecp256k1Interface } = {};
|
|
4
|
-
|
|
5
|
-
/**
|
|
6
|
-
* Initializes the ECC library with the provided instance.
|
|
7
|
-
* If `eccLib` is `undefined`, the library will be cleared.
|
|
8
|
-
* If `eccLib` is a new instance, it will be verified before setting it as the active library.
|
|
9
|
-
*
|
|
10
|
-
* @param eccLib The instance of the ECC library to initialize.
|
|
11
|
-
*/
|
|
12
|
-
export function initEccLib(eccLib: TinySecp256k1Interface | undefined): void {
|
|
13
|
-
if (!eccLib) {
|
|
14
|
-
// allow clearing the library
|
|
15
|
-
_ECCLIB_CACHE.eccLib = eccLib;
|
|
16
|
-
} else if (eccLib !== _ECCLIB_CACHE.eccLib) {
|
|
17
|
-
// new instance, verify it
|
|
18
|
-
verifyEcc(eccLib!);
|
|
19
|
-
_ECCLIB_CACHE.eccLib = eccLib;
|
|
20
|
-
}
|
|
21
|
-
}
|
|
22
|
-
|
|
23
|
-
/**
|
|
24
|
-
* Retrieves the ECC Library instance.
|
|
25
|
-
* Throws an error if the ECC Library is not provided.
|
|
26
|
-
* You must call initEccLib() with a valid TinySecp256k1Interface instance before calling this function.
|
|
27
|
-
* @returns The ECC Library instance.
|
|
28
|
-
* @throws Error if the ECC Library is not provided.
|
|
29
|
-
*/
|
|
30
|
-
export function getEccLib(): TinySecp256k1Interface {
|
|
31
|
-
if (!_ECCLIB_CACHE.eccLib)
|
|
32
|
-
throw new Error(
|
|
33
|
-
'No ECC Library provided. You must call initEccLib() with a valid TinySecp256k1Interface instance',
|
|
34
|
-
);
|
|
35
|
-
return _ECCLIB_CACHE.eccLib;
|
|
36
|
-
}
|
|
37
|
-
|
|
38
|
-
const h = (hex: string): Buffer => Buffer.from(hex, 'hex');
|
|
39
|
-
|
|
40
|
-
/**
|
|
41
|
-
* Verifies the ECC functionality.
|
|
42
|
-
*
|
|
43
|
-
* @param ecc - The TinySecp256k1Interface object.
|
|
44
|
-
*/
|
|
45
|
-
function verifyEcc(ecc: TinySecp256k1Interface): void {
|
|
46
|
-
assert(typeof ecc.isXOnlyPoint === 'function');
|
|
47
|
-
assert(ecc.isXOnlyPoint(h('79be667ef9dcbbac55a06295ce870b07029bfcdb2dce28d959f2815b16f81798')));
|
|
48
|
-
assert(ecc.isXOnlyPoint(h('fffffffffffffffffffffffffffffffffffffffffffffffffffffffeeffffc2e')));
|
|
49
|
-
assert(ecc.isXOnlyPoint(h('f9308a019258c31049344f85f89d5229b531c845836f99b08601f113bce036f9')));
|
|
50
|
-
assert(ecc.isXOnlyPoint(h('0000000000000000000000000000000000000000000000000000000000000001')));
|
|
51
|
-
assert(
|
|
52
|
-
!ecc.isXOnlyPoint(h('0000000000000000000000000000000000000000000000000000000000000000')),
|
|
53
|
-
);
|
|
54
|
-
assert(
|
|
55
|
-
!ecc.isXOnlyPoint(h('fffffffffffffffffffffffffffffffffffffffffffffffffffffffefffffc2f')),
|
|
56
|
-
);
|
|
57
|
-
|
|
58
|
-
assert(typeof ecc.xOnlyPointAddTweak === 'function');
|
|
59
|
-
tweakAddVectors.forEach((t) => {
|
|
60
|
-
const r = ecc.xOnlyPointAddTweak(h(t.pubkey), h(t.tweak));
|
|
61
|
-
if (t.result === null) {
|
|
62
|
-
assert(r === null);
|
|
63
|
-
} else {
|
|
64
|
-
assert(r !== null);
|
|
65
|
-
assert(r!.parity === t.parity);
|
|
66
|
-
assert(Buffer.from(r!.xOnlyPubkey).equals(h(t.result)));
|
|
67
|
-
}
|
|
68
|
-
});
|
|
69
|
-
}
|
|
70
|
-
|
|
71
|
-
function assert(bool: boolean): void {
|
|
72
|
-
if (!bool) throw new Error('ecc library invalid');
|
|
73
|
-
}
|
|
74
|
-
|
|
75
|
-
const tweakAddVectors = [
|
|
76
|
-
{
|
|
77
|
-
pubkey: '79be667ef9dcbbac55a06295ce870b07029bfcdb2dce28d959f2815b16f81798',
|
|
78
|
-
tweak: 'fffffffffffffffffffffffffffffffebaaedce6af48a03bbfd25e8cd0364140',
|
|
79
|
-
parity: -1,
|
|
80
|
-
result: null,
|
|
81
|
-
},
|
|
82
|
-
{
|
|
83
|
-
pubkey: '1617d38ed8d8657da4d4761e8057bc396ea9e4b9d29776d4be096016dbd2509b',
|
|
84
|
-
tweak: 'a8397a935f0dfceba6ba9618f6451ef4d80637abf4e6af2669fbc9de6a8fd2ac',
|
|
85
|
-
parity: 1,
|
|
86
|
-
result: 'e478f99dab91052ab39a33ea35fd5e6e4933f4d28023cd597c9a1f6760346adf',
|
|
87
|
-
},
|
|
88
|
-
{
|
|
89
|
-
pubkey: '2c0b7cf95324a07d05398b240174dc0c2be444d96b159aa6c7f7b1e668680991',
|
|
90
|
-
tweak: '823c3cd2142744b075a87eade7e1b8678ba308d566226a0056ca2b7a76f86b47',
|
|
91
|
-
parity: 0,
|
|
92
|
-
result: '9534f8dc8c6deda2dc007655981c78b49c5d96c778fbf363462a11ec9dfd948c',
|
|
93
|
-
},
|
|
94
|
-
];
|
|
1
|
+
import { TinySecp256k1Interface } from './types.js';
|
|
2
|
+
|
|
3
|
+
const _ECCLIB_CACHE: { eccLib?: TinySecp256k1Interface } = {};
|
|
4
|
+
|
|
5
|
+
/**
|
|
6
|
+
* Initializes the ECC library with the provided instance.
|
|
7
|
+
* If `eccLib` is `undefined`, the library will be cleared.
|
|
8
|
+
* If `eccLib` is a new instance, it will be verified before setting it as the active library.
|
|
9
|
+
*
|
|
10
|
+
* @param eccLib The instance of the ECC library to initialize.
|
|
11
|
+
*/
|
|
12
|
+
export function initEccLib(eccLib: TinySecp256k1Interface | undefined): void {
|
|
13
|
+
if (!eccLib) {
|
|
14
|
+
// allow clearing the library
|
|
15
|
+
_ECCLIB_CACHE.eccLib = eccLib;
|
|
16
|
+
} else if (eccLib !== _ECCLIB_CACHE.eccLib) {
|
|
17
|
+
// new instance, verify it
|
|
18
|
+
verifyEcc(eccLib!);
|
|
19
|
+
_ECCLIB_CACHE.eccLib = eccLib;
|
|
20
|
+
}
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
/**
|
|
24
|
+
* Retrieves the ECC Library instance.
|
|
25
|
+
* Throws an error if the ECC Library is not provided.
|
|
26
|
+
* You must call initEccLib() with a valid TinySecp256k1Interface instance before calling this function.
|
|
27
|
+
* @returns The ECC Library instance.
|
|
28
|
+
* @throws Error if the ECC Library is not provided.
|
|
29
|
+
*/
|
|
30
|
+
export function getEccLib(): TinySecp256k1Interface {
|
|
31
|
+
if (!_ECCLIB_CACHE.eccLib)
|
|
32
|
+
throw new Error(
|
|
33
|
+
'No ECC Library provided. You must call initEccLib() with a valid TinySecp256k1Interface instance',
|
|
34
|
+
);
|
|
35
|
+
return _ECCLIB_CACHE.eccLib;
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
const h = (hex: string): Buffer => Buffer.from(hex, 'hex');
|
|
39
|
+
|
|
40
|
+
/**
|
|
41
|
+
* Verifies the ECC functionality.
|
|
42
|
+
*
|
|
43
|
+
* @param ecc - The TinySecp256k1Interface object.
|
|
44
|
+
*/
|
|
45
|
+
function verifyEcc(ecc: TinySecp256k1Interface): void {
|
|
46
|
+
assert(typeof ecc.isXOnlyPoint === 'function');
|
|
47
|
+
assert(ecc.isXOnlyPoint(h('79be667ef9dcbbac55a06295ce870b07029bfcdb2dce28d959f2815b16f81798')));
|
|
48
|
+
assert(ecc.isXOnlyPoint(h('fffffffffffffffffffffffffffffffffffffffffffffffffffffffeeffffc2e')));
|
|
49
|
+
assert(ecc.isXOnlyPoint(h('f9308a019258c31049344f85f89d5229b531c845836f99b08601f113bce036f9')));
|
|
50
|
+
assert(ecc.isXOnlyPoint(h('0000000000000000000000000000000000000000000000000000000000000001')));
|
|
51
|
+
assert(
|
|
52
|
+
!ecc.isXOnlyPoint(h('0000000000000000000000000000000000000000000000000000000000000000')),
|
|
53
|
+
);
|
|
54
|
+
assert(
|
|
55
|
+
!ecc.isXOnlyPoint(h('fffffffffffffffffffffffffffffffffffffffffffffffffffffffefffffc2f')),
|
|
56
|
+
);
|
|
57
|
+
|
|
58
|
+
assert(typeof ecc.xOnlyPointAddTweak === 'function');
|
|
59
|
+
tweakAddVectors.forEach((t) => {
|
|
60
|
+
const r = ecc.xOnlyPointAddTweak(h(t.pubkey), h(t.tweak));
|
|
61
|
+
if (t.result === null) {
|
|
62
|
+
assert(r === null);
|
|
63
|
+
} else {
|
|
64
|
+
assert(r !== null);
|
|
65
|
+
assert(r!.parity === t.parity);
|
|
66
|
+
assert(Buffer.from(r!.xOnlyPubkey).equals(h(t.result)));
|
|
67
|
+
}
|
|
68
|
+
});
|
|
69
|
+
}
|
|
70
|
+
|
|
71
|
+
function assert(bool: boolean): void {
|
|
72
|
+
if (!bool) throw new Error('ecc library invalid');
|
|
73
|
+
}
|
|
74
|
+
|
|
75
|
+
const tweakAddVectors = [
|
|
76
|
+
{
|
|
77
|
+
pubkey: '79be667ef9dcbbac55a06295ce870b07029bfcdb2dce28d959f2815b16f81798',
|
|
78
|
+
tweak: 'fffffffffffffffffffffffffffffffebaaedce6af48a03bbfd25e8cd0364140',
|
|
79
|
+
parity: -1,
|
|
80
|
+
result: null,
|
|
81
|
+
},
|
|
82
|
+
{
|
|
83
|
+
pubkey: '1617d38ed8d8657da4d4761e8057bc396ea9e4b9d29776d4be096016dbd2509b',
|
|
84
|
+
tweak: 'a8397a935f0dfceba6ba9618f6451ef4d80637abf4e6af2669fbc9de6a8fd2ac',
|
|
85
|
+
parity: 1,
|
|
86
|
+
result: 'e478f99dab91052ab39a33ea35fd5e6e4933f4d28023cd597c9a1f6760346adf',
|
|
87
|
+
},
|
|
88
|
+
{
|
|
89
|
+
pubkey: '2c0b7cf95324a07d05398b240174dc0c2be444d96b159aa6c7f7b1e668680991',
|
|
90
|
+
tweak: '823c3cd2142744b075a87eade7e1b8678ba308d566226a0056ca2b7a76f86b47',
|
|
91
|
+
parity: 0,
|
|
92
|
+
result: '9534f8dc8c6deda2dc007655981c78b49c5d96c778fbf363462a11ec9dfd948c',
|
|
93
|
+
},
|
|
94
|
+
];
|
|
@@ -1,104 +1,104 @@
|
|
|
1
|
-
export interface CacheEntry {
|
|
2
|
-
pubKey: string;
|
|
3
|
-
dataRef: WeakRef<Buffer>;
|
|
4
|
-
signature: Buffer;
|
|
5
|
-
}
|
|
6
|
-
|
|
7
|
-
export class AdvancedSignatureManager {
|
|
8
|
-
private static instance: AdvancedSignatureManager;
|
|
9
|
-
|
|
10
|
-
/**
|
|
11
|
-
* Map to index cache entries by signer public key.
|
|
12
|
-
* Key: Public Key (string)
|
|
13
|
-
* Value: Set of CacheEntries
|
|
14
|
-
*/
|
|
15
|
-
private cacheBySigner: Map<string, Set<CacheEntry>> = new Map();
|
|
16
|
-
|
|
17
|
-
/**
|
|
18
|
-
* FinalizationRegistry to clean up cache entries when their data buffers are garbage collected.
|
|
19
|
-
*/
|
|
20
|
-
private registry: FinalizationRegistry<CacheEntry>;
|
|
21
|
-
|
|
22
|
-
private constructor() {
|
|
23
|
-
this.registry = new FinalizationRegistry((entry: CacheEntry) => {
|
|
24
|
-
// Remove the entry directly using its pubKey
|
|
25
|
-
const set = this.cacheBySigner.get(entry.pubKey);
|
|
26
|
-
if (set) {
|
|
27
|
-
set.delete(entry);
|
|
28
|
-
|
|
29
|
-
// Clean up the set if it's empty
|
|
30
|
-
if (set.size === 0) {
|
|
31
|
-
this.cacheBySigner.delete(entry.pubKey);
|
|
32
|
-
}
|
|
33
|
-
}
|
|
34
|
-
});
|
|
35
|
-
}
|
|
36
|
-
|
|
37
|
-
// Singleton instance accessor
|
|
38
|
-
public static getInstance(): AdvancedSignatureManager {
|
|
39
|
-
if (!AdvancedSignatureManager.instance) {
|
|
40
|
-
AdvancedSignatureManager.instance = new AdvancedSignatureManager();
|
|
41
|
-
}
|
|
42
|
-
return AdvancedSignatureManager.instance;
|
|
43
|
-
}
|
|
44
|
-
|
|
45
|
-
/**
|
|
46
|
-
* Adds (caches) the signature for the given data buffer and signer public key.
|
|
47
|
-
* @param pubKey The signer's public key.
|
|
48
|
-
* @param data The data buffer.
|
|
49
|
-
* @param signature The signature buffer.
|
|
50
|
-
*/
|
|
51
|
-
public addSignature(pubKey: string, data: Buffer, signature: Buffer): Buffer {
|
|
52
|
-
const entry: CacheEntry = {
|
|
53
|
-
pubKey,
|
|
54
|
-
dataRef: new WeakRef(data),
|
|
55
|
-
signature,
|
|
56
|
-
};
|
|
57
|
-
|
|
58
|
-
if (!this.cacheBySigner.has(pubKey)) {
|
|
59
|
-
this.cacheBySigner.set(pubKey, new Set<CacheEntry>());
|
|
60
|
-
}
|
|
61
|
-
|
|
62
|
-
const set = this.cacheBySigner.get(pubKey)!;
|
|
63
|
-
set.add(entry);
|
|
64
|
-
|
|
65
|
-
// Register the data buffer with the FinalizationRegistry.
|
|
66
|
-
this.registry.register(data, entry);
|
|
67
|
-
|
|
68
|
-
return signature;
|
|
69
|
-
}
|
|
70
|
-
|
|
71
|
-
/**
|
|
72
|
-
* Retrieves the signature for the given data buffer and signer public key.
|
|
73
|
-
* @param pubKey The signer's public key.
|
|
74
|
-
* @param data The data buffer.
|
|
75
|
-
* @returns The signature buffer if found; otherwise, undefined.
|
|
76
|
-
*/
|
|
77
|
-
public getSignature(pubKey: string, data: Buffer): Buffer | undefined {
|
|
78
|
-
const set = this.cacheBySigner.get(pubKey);
|
|
79
|
-
if (!set) return undefined;
|
|
80
|
-
|
|
81
|
-
for (const entry of set) {
|
|
82
|
-
const cachedData = entry.dataRef.deref();
|
|
83
|
-
if (cachedData && cachedData.equals(data)) {
|
|
84
|
-
return entry.signature;
|
|
85
|
-
}
|
|
86
|
-
}
|
|
87
|
-
return undefined;
|
|
88
|
-
}
|
|
89
|
-
|
|
90
|
-
/**
|
|
91
|
-
* Use with caution as it removes all cached signatures for all signers.
|
|
92
|
-
*/
|
|
93
|
-
public clearCache(): void {
|
|
94
|
-
this.cacheBySigner.clear();
|
|
95
|
-
}
|
|
96
|
-
|
|
97
|
-
/**
|
|
98
|
-
* Clears the cache for a specific signer.
|
|
99
|
-
* @param pubKey The signer's public key.
|
|
100
|
-
*/
|
|
101
|
-
public clearCacheForSigner(pubKey: string): void {
|
|
102
|
-
this.cacheBySigner.delete(pubKey);
|
|
103
|
-
}
|
|
104
|
-
}
|
|
1
|
+
export interface CacheEntry {
|
|
2
|
+
pubKey: string;
|
|
3
|
+
dataRef: WeakRef<Buffer>;
|
|
4
|
+
signature: Buffer;
|
|
5
|
+
}
|
|
6
|
+
|
|
7
|
+
export class AdvancedSignatureManager {
|
|
8
|
+
private static instance: AdvancedSignatureManager;
|
|
9
|
+
|
|
10
|
+
/**
|
|
11
|
+
* Map to index cache entries by signer public key.
|
|
12
|
+
* Key: Public Key (string)
|
|
13
|
+
* Value: Set of CacheEntries
|
|
14
|
+
*/
|
|
15
|
+
private cacheBySigner: Map<string, Set<CacheEntry>> = new Map();
|
|
16
|
+
|
|
17
|
+
/**
|
|
18
|
+
* FinalizationRegistry to clean up cache entries when their data buffers are garbage collected.
|
|
19
|
+
*/
|
|
20
|
+
private registry: FinalizationRegistry<CacheEntry>;
|
|
21
|
+
|
|
22
|
+
private constructor() {
|
|
23
|
+
this.registry = new FinalizationRegistry((entry: CacheEntry) => {
|
|
24
|
+
// Remove the entry directly using its pubKey
|
|
25
|
+
const set = this.cacheBySigner.get(entry.pubKey);
|
|
26
|
+
if (set) {
|
|
27
|
+
set.delete(entry);
|
|
28
|
+
|
|
29
|
+
// Clean up the set if it's empty
|
|
30
|
+
if (set.size === 0) {
|
|
31
|
+
this.cacheBySigner.delete(entry.pubKey);
|
|
32
|
+
}
|
|
33
|
+
}
|
|
34
|
+
});
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
// Singleton instance accessor
|
|
38
|
+
public static getInstance(): AdvancedSignatureManager {
|
|
39
|
+
if (!AdvancedSignatureManager.instance) {
|
|
40
|
+
AdvancedSignatureManager.instance = new AdvancedSignatureManager();
|
|
41
|
+
}
|
|
42
|
+
return AdvancedSignatureManager.instance;
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
/**
|
|
46
|
+
* Adds (caches) the signature for the given data buffer and signer public key.
|
|
47
|
+
* @param pubKey The signer's public key.
|
|
48
|
+
* @param data The data buffer.
|
|
49
|
+
* @param signature The signature buffer.
|
|
50
|
+
*/
|
|
51
|
+
public addSignature(pubKey: string, data: Buffer, signature: Buffer): Buffer {
|
|
52
|
+
const entry: CacheEntry = {
|
|
53
|
+
pubKey,
|
|
54
|
+
dataRef: new WeakRef(data),
|
|
55
|
+
signature,
|
|
56
|
+
};
|
|
57
|
+
|
|
58
|
+
if (!this.cacheBySigner.has(pubKey)) {
|
|
59
|
+
this.cacheBySigner.set(pubKey, new Set<CacheEntry>());
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
const set = this.cacheBySigner.get(pubKey)!;
|
|
63
|
+
set.add(entry);
|
|
64
|
+
|
|
65
|
+
// Register the data buffer with the FinalizationRegistry.
|
|
66
|
+
this.registry.register(data, entry);
|
|
67
|
+
|
|
68
|
+
return signature;
|
|
69
|
+
}
|
|
70
|
+
|
|
71
|
+
/**
|
|
72
|
+
* Retrieves the signature for the given data buffer and signer public key.
|
|
73
|
+
* @param pubKey The signer's public key.
|
|
74
|
+
* @param data The data buffer.
|
|
75
|
+
* @returns The signature buffer if found; otherwise, undefined.
|
|
76
|
+
*/
|
|
77
|
+
public getSignature(pubKey: string, data: Buffer): Buffer | undefined {
|
|
78
|
+
const set = this.cacheBySigner.get(pubKey);
|
|
79
|
+
if (!set) return undefined;
|
|
80
|
+
|
|
81
|
+
for (const entry of set) {
|
|
82
|
+
const cachedData = entry.dataRef.deref();
|
|
83
|
+
if (cachedData && cachedData.equals(data)) {
|
|
84
|
+
return entry.signature;
|
|
85
|
+
}
|
|
86
|
+
}
|
|
87
|
+
return undefined;
|
|
88
|
+
}
|
|
89
|
+
|
|
90
|
+
/**
|
|
91
|
+
* Use with caution as it removes all cached signatures for all signers.
|
|
92
|
+
*/
|
|
93
|
+
public clearCache(): void {
|
|
94
|
+
this.cacheBySigner.clear();
|
|
95
|
+
}
|
|
96
|
+
|
|
97
|
+
/**
|
|
98
|
+
* Clears the cache for a specific signer.
|
|
99
|
+
* @param pubKey The signer's public key.
|
|
100
|
+
*/
|
|
101
|
+
public clearCacheForSigner(pubKey: string): void {
|
|
102
|
+
this.cacheBySigner.delete(pubKey);
|
|
103
|
+
}
|
|
104
|
+
}
|
|
@@ -1,84 +1,84 @@
|
|
|
1
|
-
export interface CacheEntry {
|
|
2
|
-
length: number;
|
|
3
|
-
dataRef: WeakRef<Buffer>;
|
|
4
|
-
signature: Buffer;
|
|
5
|
-
}
|
|
6
|
-
|
|
7
|
-
export class SignatureManager {
|
|
8
|
-
/**
|
|
9
|
-
* Map to index cache entries by buffer length.
|
|
10
|
-
* Key: Buffer length
|
|
11
|
-
* Value: Set of CacheEntries with that buffer length
|
|
12
|
-
*/
|
|
13
|
-
private cacheByLength: Map<number, Set<CacheEntry>> = new Map();
|
|
14
|
-
|
|
15
|
-
/**
|
|
16
|
-
* FinalizationRegistry to clean up cache entries when their data buffers are garbage collected.
|
|
17
|
-
*/
|
|
18
|
-
private registry: FinalizationRegistry<CacheEntry>;
|
|
19
|
-
|
|
20
|
-
constructor() {
|
|
21
|
-
this.registry = new FinalizationRegistry((entry: CacheEntry) => {
|
|
22
|
-
const set = this.cacheByLength.get(entry.length);
|
|
23
|
-
if (set) {
|
|
24
|
-
set.delete(entry);
|
|
25
|
-
// Clean up the set if it's empty
|
|
26
|
-
if (set.size === 0) {
|
|
27
|
-
this.cacheByLength.delete(entry.length);
|
|
28
|
-
}
|
|
29
|
-
}
|
|
30
|
-
});
|
|
31
|
-
}
|
|
32
|
-
|
|
33
|
-
/**
|
|
34
|
-
* Adds (caches) the signature for the given data buffer.
|
|
35
|
-
* @param data The data buffer.
|
|
36
|
-
* @param signature The signature buffer.
|
|
37
|
-
*/
|
|
38
|
-
public addSignature(data: Buffer, signature: Buffer): Buffer {
|
|
39
|
-
const length = data.length;
|
|
40
|
-
const entry: CacheEntry = {
|
|
41
|
-
length,
|
|
42
|
-
dataRef: new WeakRef(data),
|
|
43
|
-
signature,
|
|
44
|
-
};
|
|
45
|
-
|
|
46
|
-
if (!this.cacheByLength.has(length)) {
|
|
47
|
-
this.cacheByLength.set(length, new Set<CacheEntry>());
|
|
48
|
-
}
|
|
49
|
-
|
|
50
|
-
const set = this.cacheByLength.get(length)!;
|
|
51
|
-
set.add(entry);
|
|
52
|
-
|
|
53
|
-
// Register the data buffer with the FinalizationRegistry.
|
|
54
|
-
this.registry.register(data, entry);
|
|
55
|
-
|
|
56
|
-
return signature;
|
|
57
|
-
}
|
|
58
|
-
|
|
59
|
-
/**
|
|
60
|
-
* Retrieves the signature for the given data buffer.
|
|
61
|
-
* @param data The data buffer.
|
|
62
|
-
* @returns The signature buffer if found; otherwise, undefined.
|
|
63
|
-
*/
|
|
64
|
-
public getSignature(data: Buffer): Buffer | undefined {
|
|
65
|
-
const length = data.length;
|
|
66
|
-
const set = this.cacheByLength.get(length);
|
|
67
|
-
if (!set) return undefined;
|
|
68
|
-
|
|
69
|
-
for (const entry of set) {
|
|
70
|
-
const cachedData = entry.dataRef.deref();
|
|
71
|
-
if (cachedData && cachedData.equals(data)) {
|
|
72
|
-
return entry.signature;
|
|
73
|
-
}
|
|
74
|
-
}
|
|
75
|
-
return undefined;
|
|
76
|
-
}
|
|
77
|
-
|
|
78
|
-
/**
|
|
79
|
-
* Use with caution as it removes all cached signatures.
|
|
80
|
-
*/
|
|
81
|
-
public clearCache(): void {
|
|
82
|
-
this.cacheByLength.clear();
|
|
83
|
-
}
|
|
84
|
-
}
|
|
1
|
+
export interface CacheEntry {
|
|
2
|
+
length: number;
|
|
3
|
+
dataRef: WeakRef<Buffer>;
|
|
4
|
+
signature: Buffer;
|
|
5
|
+
}
|
|
6
|
+
|
|
7
|
+
export class SignatureManager {
|
|
8
|
+
/**
|
|
9
|
+
* Map to index cache entries by buffer length.
|
|
10
|
+
* Key: Buffer length
|
|
11
|
+
* Value: Set of CacheEntries with that buffer length
|
|
12
|
+
*/
|
|
13
|
+
private cacheByLength: Map<number, Set<CacheEntry>> = new Map();
|
|
14
|
+
|
|
15
|
+
/**
|
|
16
|
+
* FinalizationRegistry to clean up cache entries when their data buffers are garbage collected.
|
|
17
|
+
*/
|
|
18
|
+
private registry: FinalizationRegistry<CacheEntry>;
|
|
19
|
+
|
|
20
|
+
constructor() {
|
|
21
|
+
this.registry = new FinalizationRegistry((entry: CacheEntry) => {
|
|
22
|
+
const set = this.cacheByLength.get(entry.length);
|
|
23
|
+
if (set) {
|
|
24
|
+
set.delete(entry);
|
|
25
|
+
// Clean up the set if it's empty
|
|
26
|
+
if (set.size === 0) {
|
|
27
|
+
this.cacheByLength.delete(entry.length);
|
|
28
|
+
}
|
|
29
|
+
}
|
|
30
|
+
});
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
/**
|
|
34
|
+
* Adds (caches) the signature for the given data buffer.
|
|
35
|
+
* @param data The data buffer.
|
|
36
|
+
* @param signature The signature buffer.
|
|
37
|
+
*/
|
|
38
|
+
public addSignature(data: Buffer, signature: Buffer): Buffer {
|
|
39
|
+
const length = data.length;
|
|
40
|
+
const entry: CacheEntry = {
|
|
41
|
+
length,
|
|
42
|
+
dataRef: new WeakRef(data),
|
|
43
|
+
signature,
|
|
44
|
+
};
|
|
45
|
+
|
|
46
|
+
if (!this.cacheByLength.has(length)) {
|
|
47
|
+
this.cacheByLength.set(length, new Set<CacheEntry>());
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
const set = this.cacheByLength.get(length)!;
|
|
51
|
+
set.add(entry);
|
|
52
|
+
|
|
53
|
+
// Register the data buffer with the FinalizationRegistry.
|
|
54
|
+
this.registry.register(data, entry);
|
|
55
|
+
|
|
56
|
+
return signature;
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
/**
|
|
60
|
+
* Retrieves the signature for the given data buffer.
|
|
61
|
+
* @param data The data buffer.
|
|
62
|
+
* @returns The signature buffer if found; otherwise, undefined.
|
|
63
|
+
*/
|
|
64
|
+
public getSignature(data: Buffer): Buffer | undefined {
|
|
65
|
+
const length = data.length;
|
|
66
|
+
const set = this.cacheByLength.get(length);
|
|
67
|
+
if (!set) return undefined;
|
|
68
|
+
|
|
69
|
+
for (const entry of set) {
|
|
70
|
+
const cachedData = entry.dataRef.deref();
|
|
71
|
+
if (cachedData && cachedData.equals(data)) {
|
|
72
|
+
return entry.signature;
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
return undefined;
|
|
76
|
+
}
|
|
77
|
+
|
|
78
|
+
/**
|
|
79
|
+
* Use with caution as it removes all cached signatures.
|
|
80
|
+
*/
|
|
81
|
+
public clearCache(): void {
|
|
82
|
+
this.cacheByLength.clear();
|
|
83
|
+
}
|
|
84
|
+
}
|