@keetanetwork/keetanet-client 0.18.0 → 0.18.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (128) hide show
  1. package/client/builder.d.ts +23 -10
  2. package/client/index-browser.d.ts +1 -1
  3. package/client/index-browser.js +208 -81
  4. package/client/index.d.ts +1 -1
  5. package/client/index.js +146 -43
  6. package/docs/assets/hierarchy.js +1 -1
  7. package/docs/assets/search.js +1 -1
  8. package/docs/classes/KeetaNetSDK.Referenced.BaseSet.html +1 -1
  9. package/docs/classes/KeetaNetSDK.Referenced.BaseVoteBuilder.html +1 -1
  10. package/docs/classes/KeetaNetSDK.Referenced.BlockOperation.html +1 -1
  11. package/docs/classes/KeetaNetSDK.Referenced.BlockOperationCREATE_IDENTIFIER.html +1 -1
  12. package/docs/classes/KeetaNetSDK.Referenced.BlockOperationMANAGE_CERTIFICATE.html +1 -1
  13. package/docs/classes/KeetaNetSDK.Referenced.BlockOperationMODIFY_PERMISSIONS.html +1 -1
  14. package/docs/classes/KeetaNetSDK.Referenced.BlockOperationRECEIVE.html +1 -1
  15. package/docs/classes/KeetaNetSDK.Referenced.BlockOperationSEND.html +1 -1
  16. package/docs/classes/KeetaNetSDK.Referenced.BlockOperationSET_INFO.html +1 -1
  17. package/docs/classes/KeetaNetSDK.Referenced.BlockOperationSET_REP.html +1 -1
  18. package/docs/classes/KeetaNetSDK.Referenced.BlockOperationTOKEN_ADMIN_MODIFY_BALANCE.html +1 -1
  19. package/docs/classes/KeetaNetSDK.Referenced.BlockOperationTOKEN_ADMIN_SUPPLY.html +1 -1
  20. package/docs/classes/KeetaNetSDK.Referenced.Certificate.html +1 -4
  21. package/docs/classes/KeetaNetSDK.Referenced.ECDSAKeyPair.html +1 -1
  22. package/docs/classes/KeetaNetSDK.Referenced.ECDSASECP256K1KeyPair.html +1 -1
  23. package/docs/classes/KeetaNetSDK.Referenced.ECDSASECP256K1PrivateKey.html +1 -1
  24. package/docs/classes/KeetaNetSDK.Referenced.ECDSASECP256K1PublicKey.html +1 -1
  25. package/docs/classes/KeetaNetSDK.Referenced.ECDSASECP256K1Signature.html +1 -1
  26. package/docs/classes/KeetaNetSDK.Referenced.ECDSASECP256R1KeyPair.html +1 -1
  27. package/docs/classes/KeetaNetSDK.Referenced.ECDSASECP256R1PrivateKey.html +1 -1
  28. package/docs/classes/KeetaNetSDK.Referenced.ECDSASECP256R1PublicKey.html +1 -1
  29. package/docs/classes/KeetaNetSDK.Referenced.ECDSASECP256R1Signature.html +1 -1
  30. package/docs/classes/KeetaNetSDK.Referenced.ED25519KeyPair.html +1 -1
  31. package/docs/classes/KeetaNetSDK.Referenced.ED25519PrivateKey.html +1 -1
  32. package/docs/classes/KeetaNetSDK.Referenced.ED25519PublicKey.html +1 -1
  33. package/docs/classes/KeetaNetSDK.Referenced.ED25519Signature.html +1 -1
  34. package/docs/classes/KeetaNetSDK.Referenced.ExternalKeyPair.html +1 -1
  35. package/docs/classes/KeetaNetSDK.Referenced.ExternalSet.html +1 -1
  36. package/docs/classes/KeetaNetSDK.Referenced.IdempotentKey.html +1 -1
  37. package/docs/classes/KeetaNetSDK.Referenced.IdentifierKey.html +1 -1
  38. package/docs/classes/KeetaNetSDK.Referenced.IdentifierKeyPair.html +1 -1
  39. package/docs/classes/KeetaNetSDK.Referenced.KeetaNetError.html +1 -1
  40. package/docs/classes/KeetaNetSDK.Referenced.KeetaNetErrorBase.html +1 -1
  41. package/docs/classes/KeetaNetSDK.Referenced.KeetaNetLedgerError.html +1 -1
  42. package/docs/classes/KeetaNetSDK.Referenced.KeetaNetLedgerIdempotentKeyError.html +1 -1
  43. package/docs/classes/KeetaNetSDK.Referenced.KeetaNetLedgerVoteError.html +1 -1
  44. package/docs/classes/KeetaNetSDK.Referenced.KeyInterface.html +1 -1
  45. package/docs/classes/KeetaNetSDK.Referenced.KeyStorage.html +1 -1
  46. package/docs/classes/KeetaNetSDK.Referenced.Log.html +2 -2
  47. package/docs/classes/KeetaNetSDK.Referenced.PermissionSetHolder.html +1 -1
  48. package/docs/classes/KeetaNetSDK.Referenced.PossiblyExpiredVote.html +1 -1
  49. package/docs/classes/KeetaNetSDK.Referenced.PossiblyUnsignedBlock.html +1 -1
  50. package/docs/classes/KeetaNetSDK.Referenced.SignatureStorage.html +1 -1
  51. package/docs/classes/KeetaNetSDK.Referenced.Stats.html +1 -1
  52. package/docs/classes/KeetaNetSDK.Referenced.StatsPending.html +1 -1
  53. package/docs/classes/KeetaNetSDK.Referenced.UnsignedBlock.html +1 -1
  54. package/docs/classes/KeetaNetSDK.Referenced.UserClientBuilder.html +1 -1
  55. package/docs/classes/KeetaNetSDK.Referenced.VoteBlockBundle.html +1 -1
  56. package/docs/classes/KeetaNetSDK.Referenced.VoteBuilder.html +1 -1
  57. package/docs/classes/KeetaNetSDK.Referenced.VoteHash.html +1 -1
  58. package/docs/classes/KeetaNetSDK.Referenced.VoteLikeBase.html +1 -1
  59. package/docs/classes/KeetaNetSDK.Referenced.VoteQuoteBuilder.html +1 -1
  60. package/docs/classes/KeetaNetSDK.Referenced.VoteStapleHash.html +1 -1
  61. package/docs/classes/KeetaNetSDK.Referenced.src_lib_utils_buffer.BufferStorage.html +1 -1
  62. package/docs/classes/KeetaNetSDK.UserClient.html +2 -2
  63. package/docs/hierarchy.html +1 -1
  64. package/docs/interfaces/KeetaNetSDK.Referenced.ASN1ExplicitContextTag.html +1 -1
  65. package/docs/interfaces/KeetaNetSDK.Referenced.ASN1ImplicitContextTag.html +1 -1
  66. package/docs/interfaces/KeetaNetSDK.Referenced.ASN1Object.html +1 -1
  67. package/docs/interfaces/KeetaNetSDK.Referenced.AccountACLRow.html +1 -1
  68. package/docs/interfaces/KeetaNetSDK.Referenced.BaseACLRow.html +1 -1
  69. package/docs/interfaces/KeetaNetSDK.Referenced.BaseAccountInfo.html +1 -1
  70. package/docs/interfaces/KeetaNetSDK.Referenced.BaseExternalKeyPairFunctions.html +1 -1
  71. package/docs/interfaces/KeetaNetSDK.Referenced.BaseGenerationConfig.html +1 -1
  72. package/docs/interfaces/KeetaNetSDK.Referenced.BaseIdentifierAccountInfo.html +1 -1
  73. package/docs/interfaces/KeetaNetSDK.Referenced.BaseIdentifierCreateArguments.html +1 -1
  74. package/docs/interfaces/KeetaNetSDK.Referenced.BlockJSONOperation.html +1 -1
  75. package/docs/interfaces/KeetaNetSDK.Referenced.BlockJSONOperationCREATE_IDENTIFIER.html +1 -1
  76. package/docs/interfaces/KeetaNetSDK.Referenced.BlockJSONOperationMANAGE_CERTIFICATE.html +1 -1
  77. package/docs/interfaces/KeetaNetSDK.Referenced.BlockJSONOperationMODIFY_PERMISSIONS.html +1 -1
  78. package/docs/interfaces/KeetaNetSDK.Referenced.BlockJSONOperationRECEIVE.html +1 -1
  79. package/docs/interfaces/KeetaNetSDK.Referenced.BlockJSONOperationSEND.html +1 -1
  80. package/docs/interfaces/KeetaNetSDK.Referenced.BlockJSONOperationSET_INFO.html +1 -1
  81. package/docs/interfaces/KeetaNetSDK.Referenced.BlockJSONOperationSET_REP.html +1 -1
  82. package/docs/interfaces/KeetaNetSDK.Referenced.BlockJSONOperationTOKEN_ADMIN_MODIFY_BALANCE.html +1 -1
  83. package/docs/interfaces/KeetaNetSDK.Referenced.BlockJSONOperationTOKEN_ADMIN_SUPPLY.html +1 -1
  84. package/docs/interfaces/KeetaNetSDK.Referenced.BlockV1Canonical.html +1 -1
  85. package/docs/interfaces/KeetaNetSDK.Referenced.BlockV2Canonical.html +1 -1
  86. package/docs/interfaces/KeetaNetSDK.Referenced.CertificateACLRow.html +1 -1
  87. package/docs/interfaces/KeetaNetSDK.Referenced.Constructor.html +1 -1
  88. package/docs/interfaces/KeetaNetSDK.Referenced.DisposableTimingHandle.html +1 -1
  89. package/docs/interfaces/KeetaNetSDK.Referenced.ECDSA_SECP256K1AccountInfo.html +1 -1
  90. package/docs/interfaces/KeetaNetSDK.Referenced.ECDSA_SECP256R1AccountInfo.html +1 -1
  91. package/docs/interfaces/KeetaNetSDK.Referenced.ED25519AccountInfo.html +1 -1
  92. package/docs/interfaces/KeetaNetSDK.Referenced.ExternalKeyPairFunctionsNoEncryption.html +1 -1
  93. package/docs/interfaces/KeetaNetSDK.Referenced.ExternalKeyPairFunctionsSupportsEncryption.html +1 -1
  94. package/docs/interfaces/KeetaNetSDK.Referenced.InitialConfigSupply.html +1 -1
  95. package/docs/interfaces/KeetaNetSDK.Referenced.InstanceSet.html +1 -1
  96. package/docs/interfaces/KeetaNetSDK.Referenced.KVGenericOptionsType.html +1 -1
  97. package/docs/interfaces/KeetaNetSDK.Referenced.KVSetOptionsType.html +1 -1
  98. package/docs/interfaces/KeetaNetSDK.Referenced.ModifyTokenBalanceEntry.html +1 -1
  99. package/docs/interfaces/KeetaNetSDK.Referenced.MultiSigIdentifierCreateArguments.html +1 -1
  100. package/docs/interfaces/KeetaNetSDK.Referenced.MultisigAccountInfo.html +1 -1
  101. package/docs/interfaces/KeetaNetSDK.Referenced.MultisigConfig.html +1 -1
  102. package/docs/interfaces/KeetaNetSDK.Referenced.NumericValueEntry.html +1 -1
  103. package/docs/interfaces/KeetaNetSDK.Referenced.P2PPeerBase.html +1 -1
  104. package/docs/interfaces/KeetaNetSDK.Referenced.P2PPeerListener.html +1 -1
  105. package/docs/interfaces/KeetaNetSDK.Referenced.P2PPeerRepBase.html +1 -1
  106. package/docs/interfaces/KeetaNetSDK.Referenced.PendingOperations.html +2 -2
  107. package/docs/interfaces/KeetaNetSDK.Referenced.PendingOperationsJSON.html +2 -2
  108. package/docs/interfaces/KeetaNetSDK.Referenced.PublicKeyStorage.html +1 -1
  109. package/docs/interfaces/KeetaNetSDK.Referenced.RequestTokenReceiveEntry.html +1 -1
  110. package/docs/interfaces/KeetaNetSDK.Referenced.StorageAccountInfo.html +1 -1
  111. package/docs/interfaces/KeetaNetSDK.Referenced.TokenAccountInfo.html +1 -1
  112. package/docs/interfaces/KeetaNetSDK.Referenced.TokenNumericEntry.html +1 -1
  113. package/docs/interfaces/KeetaNetSDK.Referenced.WithIsInstance.html +1 -1
  114. package/docs/interfaces/KeetaNetSDK.Referenced.src_lib_utils_asn1.ASN1BitString.html +1 -1
  115. package/docs/interfaces/KeetaNetSDK.Referenced.src_lib_utils_asn1.ASN1Date.html +1 -1
  116. package/docs/interfaces/KeetaNetSDK.Referenced.src_lib_utils_asn1.ASN1OID.html +1 -1
  117. package/docs/interfaces/KeetaNetSDK.Referenced.src_lib_utils_asn1.ASN1Set.html +1 -1
  118. package/docs/interfaces/KeetaNetSDK.Referenced.src_lib_utils_asn1.ASN1String.html +1 -1
  119. package/docs/interfaces/KeetaNetSDK.Referenced.src_lib_utils_asn1.ASN1Struct.html +1 -1
  120. package/docs/types/KeetaNetSDK.Referenced.LogOptions.html +13 -3
  121. package/lib/log/common.d.ts +1 -1
  122. package/lib/log/index.d.ts +21 -6
  123. package/lib/utils/certificate.d.ts +0 -1
  124. package/lib/utils/external-keys/passkey-prf.js +100 -21
  125. package/lib/utils/helper_testing.d.ts +10 -0
  126. package/npm-shrinkwrap.json +10 -17
  127. package/package.json +2 -2
  128. package/version.d.ts +1 -1
package/client/index.js CHANGED
@@ -57418,14 +57418,28 @@ class UserClientBuilder {
57418
57418
  }
57419
57419
  if (operations.permissionsChanges !== undefined) {
57420
57420
  pendingOperations.permissionsChanges = {};
57421
- for (const accountPubKey in operations.permissionsChanges) {
57422
- pendingOperations.permissionsChanges[accountPubKey] = {};
57423
- for (const targetPubKey in operations.permissionsChanges[accountPubKey]) {
57421
+ for (const [certificateOrAccountKey, changes] of Object.entries(operations.permissionsChanges)) {
57422
+ pendingOperations.permissionsChanges[certificateOrAccountKey] = {
57423
+ principal: (() => {
57424
+ if (typeof changes.principal === 'string') {
57425
+ return (account_1.Account.toAccount(changes.principal));
57426
+ }
57427
+ else {
57428
+ return ({
57429
+ usingCertificate: true,
57430
+ certificate: new certificate_1.Certificate.Hash(changes.principal.certificate),
57431
+ certificateAccount: account_1.Account.toAccount(changes.principal.certificateAccount)
57432
+ });
57433
+ }
57434
+ })(),
57435
+ targets: {}
57436
+ };
57437
+ for (const targetPubKey in changes.targets) {
57424
57438
  const updateArray = [];
57425
- for (const { method, permissions } of operations.permissionsChanges[accountPubKey][targetPubKey]) {
57439
+ for (const { method, permissions } of changes.targets[targetPubKey]) {
57426
57440
  updateArray.push({ method, permissions: permissions_1.Permissions.FromAcceptedTypes(permissions) });
57427
57441
  }
57428
- pendingOperations.permissionsChanges[accountPubKey][targetPubKey] = updateArray;
57442
+ pendingOperations.permissionsChanges[certificateOrAccountKey].targets[targetPubKey] = updateArray;
57429
57443
  }
57430
57444
  }
57431
57445
  }
@@ -57802,9 +57816,9 @@ class UserClientBuilder {
57802
57816
  amount: amount
57803
57817
  });
57804
57818
  }
57805
- for (const principalPubKey in pending.permissionsChanges) {
57806
- for (const targetPubKey in pending.permissionsChanges[principalPubKey]) {
57807
- for (const change of pending.permissionsChanges[principalPubKey][targetPubKey]) {
57819
+ for (const { targets, principal } of Object.values(pending.permissionsChanges ?? {})) {
57820
+ for (const targetPubKey in targets) {
57821
+ for (const change of targets[targetPubKey]) {
57808
57822
  const { method, permissions } = change;
57809
57823
  let target;
57810
57824
  if (!account.comparePublicKey(targetPubKey)) {
@@ -57812,7 +57826,18 @@ class UserClientBuilder {
57812
57826
  }
57813
57827
  operations.push({
57814
57828
  type: block_1.Block.OperationType.MODIFY_PERMISSIONS,
57815
- principal: account_1.Account.fromPublicKeyString(principalPubKey),
57829
+ principal: (() => {
57830
+ if (account_1.Account.isInstance(principal)) {
57831
+ return (principal);
57832
+ }
57833
+ else {
57834
+ return ({
57835
+ usingCertificate: true,
57836
+ certificateHash: principal.certificate,
57837
+ certificateAccount: principal.certificateAccount
57838
+ });
57839
+ }
57840
+ })(),
57816
57841
  target: target,
57817
57842
  method: method,
57818
57843
  permissions: permissions
@@ -57860,18 +57885,24 @@ class UserClientBuilder {
57860
57885
  updatePermissions(principal, permissions, target, method, options = {}) {
57861
57886
  __classPrivateFieldGet(this, _UserClientBuilder_instances, "m", _UserClientBuilder_useOptions).call(this, options);
57862
57887
  method = method ?? block_1.Block.AdjustMethod.SET;
57863
- const principalPubKey = principal.publicKeyString.get();
57864
- const targetPubKey = (target ?? __classPrivateFieldGet(this, _UserClientBuilder_pendingOptions, "f").account).publicKeyString.get();
57888
+ let principalKey;
57889
+ if (typeof principal === 'string' || account_1.Account.isInstance(principal)) {
57890
+ principalKey = account_1.Account.toAccount(principal).publicKeyString.get();
57891
+ }
57892
+ else {
57893
+ principalKey = principal.certificate.toString();
57894
+ }
57865
57895
  if (!__classPrivateFieldGet(this, _UserClientBuilder_pendingOperations, "f").permissionsChanges) {
57866
57896
  __classPrivateFieldGet(this, _UserClientBuilder_pendingOperations, "f").permissionsChanges = {};
57867
57897
  }
57868
- if (!__classPrivateFieldGet(this, _UserClientBuilder_pendingOperations, "f").permissionsChanges[principalPubKey]) {
57869
- __classPrivateFieldGet(this, _UserClientBuilder_pendingOperations, "f").permissionsChanges[principalPubKey] = {};
57898
+ if (!__classPrivateFieldGet(this, _UserClientBuilder_pendingOperations, "f").permissionsChanges[principalKey]) {
57899
+ __classPrivateFieldGet(this, _UserClientBuilder_pendingOperations, "f").permissionsChanges[principalKey] = { principal, targets: {} };
57870
57900
  }
57871
- if (!__classPrivateFieldGet(this, _UserClientBuilder_pendingOperations, "f").permissionsChanges[principalPubKey][targetPubKey]) {
57872
- __classPrivateFieldGet(this, _UserClientBuilder_pendingOperations, "f").permissionsChanges[principalPubKey][targetPubKey] = [];
57901
+ const targetPubKey = (target ?? __classPrivateFieldGet(this, _UserClientBuilder_pendingOptions, "f").account).publicKeyString.get();
57902
+ if (!__classPrivateFieldGet(this, _UserClientBuilder_pendingOperations, "f").permissionsChanges[principalKey].targets[targetPubKey]) {
57903
+ __classPrivateFieldGet(this, _UserClientBuilder_pendingOperations, "f").permissionsChanges[principalKey].targets[targetPubKey] = [];
57873
57904
  }
57874
- __classPrivateFieldGet(this, _UserClientBuilder_pendingOperations, "f").permissionsChanges[principalPubKey][targetPubKey].push({
57905
+ __classPrivateFieldGet(this, _UserClientBuilder_pendingOperations, "f").permissionsChanges[principalKey].targets[targetPubKey].push({
57875
57906
  method: method,
57876
57907
  permissions: permissions_1.Permissions.FromAcceptedTypes(permissions)
57877
57908
  });
@@ -60563,7 +60594,14 @@ class UserClient {
60563
60594
  */
60564
60595
  async updatePermissions(principal, permissions, target, method, options = {}) {
60565
60596
  const builder = this.initBuilder(options);
60566
- builder.updatePermissions(account_1.default.toAccount(principal), permissions, account_1.default.toAccount(target), method, options);
60597
+ let principalValue;
60598
+ if (typeof principal === 'string' || account_1.default.isInstance(principal)) {
60599
+ principalValue = account_1.default.toAccount(principal);
60600
+ }
60601
+ else {
60602
+ principalValue = principal;
60603
+ }
60604
+ builder.updatePermissions(principalValue, permissions, account_1.default.toAccount(target), method, options);
60567
60605
  return (await this.publishBuilder(builder));
60568
60606
  }
60569
60607
  /**
@@ -67160,11 +67198,13 @@ async function computeLedgerEffect(options, effects, storageProvider, network, t
67160
67198
  }
67161
67199
  }
67162
67200
  }
67163
- if (prefetchPromises.length > 70) {
67201
+ // Process promises in batches to avoid spanner's 100 concurrent read per session limit
67202
+ if (prefetchPromises.length > 50) {
67164
67203
  const toAwait = prefetchPromises.splice(0);
67165
67204
  await Promise.all(toAwait);
67166
67205
  }
67167
67206
  }
67207
+ // Wait for the final batch to complete
67168
67208
  await Promise.all(prefetchPromises);
67169
67209
  const supplies = {};
67170
67210
  const balances = {};
@@ -69720,13 +69760,17 @@ _LedgerAtomicInterface_network = new WeakMap(), _LedgerAtomicInterface_subnet =
69720
69760
  throw (new ledger_1.KeetaNetLedgerError('LEDGER_INVALID_PERMISSIONS', `Quorum of ${foundInfo.multisigQuorum} not reached for ${multisigPubKey} -- got ${foundSingerLength}`));
69721
69761
  }
69722
69762
  }
69723
- const checkPromises = [];
69724
- for (const principalPubKey in requirementsByPrincipal) {
69725
- const accountRequirements = requirementsByPrincipal[principalPubKey];
69726
- const principal = account_1.default.fromPublicKeyString(principalPubKey);
69727
- checkPromises.push(__classPrivateFieldGet(this, _LedgerAtomicInterface_instances, "m", _LedgerAtomicInterface_checkSingleAccountPermissions).call(this, principal, accountRequirements, foundAccountInfo));
69763
+ // Process promises in batches to avoid spanner's 100 concurrent read per session limit
69764
+ const batchSize = 50;
69765
+ const principalPubKeys = Object.keys(requirementsByPrincipal);
69766
+ for (let i = 0; i < principalPubKeys.length; i += batchSize) {
69767
+ const batch = principalPubKeys.slice(i, i + batchSize).map((principalPubKey) => {
69768
+ const accountRequirements = requirementsByPrincipal[principalPubKey];
69769
+ const principal = account_1.default.fromPublicKeyString(principalPubKey);
69770
+ return (__classPrivateFieldGet(this, _LedgerAtomicInterface_instances, "m", _LedgerAtomicInterface_checkSingleAccountPermissions).call(this, principal, accountRequirements, foundAccountInfo));
69771
+ });
69772
+ await Promise.all(batch);
69728
69773
  }
69729
- await Promise.all(checkPromises);
69730
69774
  return ({ newOwners });
69731
69775
  }, _LedgerAtomicInterface_validateBlockOperations = async function _LedgerAtomicInterface_validateBlockOperations(blocks) {
69732
69776
  if (__classPrivateFieldGet(this, _LedgerAtomicInterface_operations, "f") === undefined) {
@@ -70542,8 +70586,9 @@ var __classPrivateFieldSet = (this && this.__classPrivateFieldSet) || function (
70542
70586
  var __importDefault = (this && this.__importDefault) || function (mod) {
70543
70587
  return (mod && mod.__esModule) ? mod : { "default": mod };
70544
70588
  };
70545
- var _Log_instances, _Log_logs, _Log_autoSyncInterval, _Log_isSyncing, _Log_shouldSyncAgain, _Log_destroyed, _Log_emitOnLog, _Log_logDebugTracing, _Log_targets, _Log_log, _Log_extractArguments;
70589
+ var _Log_instances, _Log_logs, _Log_autoSyncInterval, _Log_isSyncing, _Log_shouldSyncAgain, _Log_destroyed, _Log_emitOnLog, _Log__logDebugTracing, _Log_targets, _Log__filter, _Log__logLevel, _Log_logDebugTracing_get, _Log_filter_get, _Log_logLevel_get, _Log_log, _Log_extractArguments;
70546
70590
  Object.defineProperty(exports, "__esModule", ({ value: true }));
70591
+ const common_1 = __webpack_require__(7364);
70547
70592
  const helper_generated_1 = __webpack_require__(5910);
70548
70593
  const target_console_1 = __importDefault(__webpack_require__(9022));
70549
70594
  /**
@@ -70642,18 +70687,36 @@ class Log {
70642
70687
  /**
70643
70688
  * Whether or not to generate debug tracing information for each log entry
70644
70689
  */
70645
- _Log_logDebugTracing.set(this, false);
70690
+ _Log__logDebugTracing.set(this, void 0);
70691
+ /**
70692
+ * Registered log targets (sinks) to send logs to, keyed by a unique
70693
+ * ID returned by `registerTarget()`
70694
+ */
70646
70695
  _Log_targets.set(this, new Map());
70647
70696
  /**
70648
- * The maximum number of log entries to send to each target at a time
70697
+ * Filter to apply before sending to targets
70649
70698
  */
70650
- this.batchSize = 10;
70699
+ _Log__filter.set(this, void 0);
70700
+ /**
70701
+ * Log-level to filter for at the logger level
70702
+ */
70703
+ _Log__logLevel.set(this, void 0);
70651
70704
  /**
70652
70705
  * Parent logger, if any -- used for creating hierarchical loggers
70653
70706
  */
70654
70707
  this.parent = null;
70708
+ /**
70709
+ * The maximum number of log entries to send to each target at a time
70710
+ */
70711
+ this.batchSize = 10;
70655
70712
  if (options?.logDebugTracing !== undefined) {
70656
- __classPrivateFieldSet(this, _Log_logDebugTracing, options.logDebugTracing, "f");
70713
+ __classPrivateFieldSet(this, _Log__logDebugTracing, options.logDebugTracing, "f");
70714
+ }
70715
+ if (options?.filter !== undefined) {
70716
+ __classPrivateFieldSet(this, _Log__filter, options.filter, "f");
70717
+ }
70718
+ if (options?.logLevel !== undefined) {
70719
+ __classPrivateFieldSet(this, _Log__logLevel, options.logLevel, "f");
70657
70720
  }
70658
70721
  }
70659
70722
  log(...args) {
@@ -70742,10 +70805,8 @@ class Log {
70742
70805
  * Since the child shares the same targets, registering or unregistering targets
70743
70806
  * from either the parent or child will affect both.
70744
70807
  */
70745
- createChild() {
70746
- const child = new Log({
70747
- logDebugTracing: __classPrivateFieldGet(this, _Log_logDebugTracing, "f")
70748
- });
70808
+ createChild(options) {
70809
+ const child = new Log(options);
70749
70810
  /**
70750
70811
  * Attach child nodes to our own parent to collapse
70751
70812
  * chains of loggers
@@ -70838,12 +70899,39 @@ class Log {
70838
70899
  /**
70839
70900
  * Dispose of the logger instance, clearing all logs and targets
70840
70901
  */
70841
- [(_Log_logs = new WeakMap(), _Log_autoSyncInterval = new WeakMap(), _Log_isSyncing = new WeakMap(), _Log_shouldSyncAgain = new WeakMap(), _Log_destroyed = new WeakMap(), _Log_emitOnLog = new WeakMap(), _Log_logDebugTracing = new WeakMap(), _Log_targets = new WeakMap(), _Log_instances = new WeakSet(), _Log_log = function _Log_log(level, options, from, ...args) {
70902
+ [(_Log_logs = new WeakMap(), _Log_autoSyncInterval = new WeakMap(), _Log_isSyncing = new WeakMap(), _Log_shouldSyncAgain = new WeakMap(), _Log_destroyed = new WeakMap(), _Log_emitOnLog = new WeakMap(), _Log__logDebugTracing = new WeakMap(), _Log_targets = new WeakMap(), _Log__filter = new WeakMap(), _Log__logLevel = new WeakMap(), _Log_instances = new WeakSet(), _Log_logDebugTracing_get = function _Log_logDebugTracing_get() {
70903
+ if (__classPrivateFieldGet(this, _Log__logDebugTracing, "f") !== undefined) {
70904
+ return (__classPrivateFieldGet(this, _Log__logDebugTracing, "f"));
70905
+ }
70906
+ if (this.parent) {
70907
+ return (__classPrivateFieldGet(this.parent, _Log_instances, "a", _Log_logDebugTracing_get));
70908
+ }
70909
+ return (false);
70910
+ }, _Log_filter_get = function _Log_filter_get() {
70911
+ if (__classPrivateFieldGet(this, _Log__filter, "f") !== undefined) {
70912
+ return (__classPrivateFieldGet(this, _Log__filter, "f"));
70913
+ }
70914
+ if (this.parent) {
70915
+ return (__classPrivateFieldGet(this.parent, _Log_instances, "a", _Log_filter_get));
70916
+ }
70917
+ return (null);
70918
+ }, _Log_logLevel_get = function _Log_logLevel_get() {
70919
+ if (__classPrivateFieldGet(this, _Log__logLevel, "f") !== undefined) {
70920
+ return (__classPrivateFieldGet(this, _Log__logLevel, "f"));
70921
+ }
70922
+ if (this.parent) {
70923
+ return (__classPrivateFieldGet(this.parent, _Log_instances, "a", _Log_logLevel_get));
70924
+ }
70925
+ return ('ALL');
70926
+ }, _Log_log = function _Log_log(level, options, from, ...args) {
70842
70927
  if (__classPrivateFieldGet(this, _Log_destroyed, "f")) {
70843
70928
  return;
70844
70929
  }
70845
70930
  const log = { options, level, from, args };
70846
- if (__classPrivateFieldGet(this, _Log_logDebugTracing, "f")) {
70931
+ if ((0, common_1.filterLog)({ logLevel: __classPrivateFieldGet(this, _Log_instances, "a", _Log_logLevel_get), filter: __classPrivateFieldGet(this, _Log_instances, "a", _Log_filter_get) }, log) === null) {
70932
+ return;
70933
+ }
70934
+ if (__classPrivateFieldGet(this, _Log_instances, "a", _Log_logDebugTracing_get)) {
70847
70935
  log.trace = new Error().stack?.split('\n').slice(2).join('\n') ?? '[No stack trace available]';
70848
70936
  }
70849
70937
  __classPrivateFieldGet(this, _Log_logs, "f").push(log);
@@ -76618,7 +76706,7 @@ var __classPrivateFieldGet = (this && this.__classPrivateFieldGet) || function (
76618
76706
  var __importDefault = (this && this.__importDefault) || function (mod) {
76619
76707
  return (mod && mod.__esModule) ? mod : { "default": mod };
76620
76708
  };
76621
- var _CertificateBuilder_params, _CertificateBuilder_caPathLen, _CertificateBundle_raw, _CertificateBundle_contents, _Certificate_instances, _Certificate_raw, _Certificate_hash, _Certificate_extensionsRaw, _Certificate_extensionsProcessed, _Certificate_finalizeConstructionCalled, _Certificate_isSelfSigned, _Certificate_processExtensionsInternal, _Certificate_processBaseExtensions, _Certificate_parseKeyUsage, _Certificate_processBaseExtension, _Certificate_assertAllCriticalExtensionsProcessed, _Certificate_checkValid, _Certificate_checkIssued;
76709
+ var _CertificateBuilder_params, _CertificateBuilder_caPathLen, _CertificateBundle_raw, _CertificateBundle_contents, _Certificate_instances, _Certificate_raw, _Certificate_hash, _Certificate_extensionsRaw, _Certificate_extensionsProcessed, _Certificate_finalizeConstructionCalled, _Certificate_isSelfSigned, _Certificate_processExtensionsInternal, _Certificate_processBaseExtensions, _Certificate_parseKeyUsage, _Certificate_processBaseExtension, _Certificate_assertAllCriticalExtensionsProcessed, _Certificate_checkValid, _Certificate_checkIssued, _Certificate_computeHash;
76622
76710
  Object.defineProperty(exports, "__esModule", ({ value: true }));
76623
76711
  exports.Certificate = exports.CertificateBundle = exports.CertificateHash = exports.CertificateBuilder = void 0;
76624
76712
  const ASN1 = __importStar(__webpack_require__(6045));
@@ -77598,7 +77686,18 @@ class Certificate {
77598
77686
  }
77599
77687
  }
77600
77688
  }
77601
- verifyChain(store, _ignore_seenCerts /* XXX:TODO */) {
77689
+ verifyChain(store, seenHashes = new CertificateHash.Set()) {
77690
+ /**
77691
+ * Loop detection: reject any certificate already on the current
77692
+ * verification path, per RFC 4158 Section 2.4.1 (no certificate may
77693
+ * repeat in a path) and Section 5.2 (detection guidance).
77694
+ *
77695
+ * @see {@link https://datatracker.ietf.org/doc/html/rfc4158#section-5.2 RFC 4158 Section 5.2}
77696
+ * @see {@link https://datatracker.ietf.org/doc/html/rfc4158#section-2.4.1 RFC 4158 Section 2.4.1}
77697
+ */
77698
+ if (seenHashes.has(__classPrivateFieldGet(this, _Certificate_instances, "m", _Certificate_computeHash).call(this))) {
77699
+ return (null);
77700
+ }
77602
77701
  /*
77603
77702
  * Check to see if the certificate is signed by any of the Root CAs
77604
77703
  */
@@ -77629,6 +77728,8 @@ class Certificate {
77629
77728
  * Check to see if the certificate is signed by any of the specified intermediates
77630
77729
  */
77631
77730
  if (store.intermediate !== undefined) {
77731
+ const nextSeen = new CertificateHash.Set(seenHashes);
77732
+ nextSeen.add(__classPrivateFieldGet(this, _Certificate_instances, "m", _Certificate_computeHash).call(this));
77632
77733
  store.intermediate.forEach((intermediateCertificate) => {
77633
77734
  if (retval !== null) {
77634
77735
  return;
@@ -77636,7 +77737,7 @@ class Certificate {
77636
77737
  const checkIssued = __classPrivateFieldGet(this, _Certificate_instances, "m", _Certificate_checkIssued).call(this, intermediateCertificate);
77637
77738
  if (checkIssued.issued) {
77638
77739
  if (intermediateCertificate.checkValid(this.moment)) {
77639
- const moreChain = intermediateCertificate.verifyChain(store, undefined /* seenCerts XXX:TODO */);
77740
+ const moreChain = intermediateCertificate.verifyChain(store, nextSeen);
77640
77741
  if (moreChain !== null) {
77641
77742
  const checkRetval = [...moreChain, intermediateCertificate];
77642
77743
  const validChain = Certificate.verifyChainDepth([...checkRetval, this]);
@@ -77792,10 +77893,7 @@ class Certificate {
77792
77893
  */
77793
77894
  hash() {
77794
77895
  this.assertConstructed();
77795
- if (!__classPrivateFieldGet(this, _Certificate_hash, "f")) {
77796
- __classPrivateFieldSet(this, _Certificate_hash, CertificateHash.fromData(Buffer.from(__classPrivateFieldGet(this, _Certificate_raw, "f"))), "f");
77797
- }
77798
- return (__classPrivateFieldGet(this, _Certificate_hash, "f"));
77896
+ return (__classPrivateFieldGet(this, _Certificate_instances, "m", _Certificate_computeHash).call(this));
77799
77897
  }
77800
77898
  /**
77801
77899
  * Get a JSON representation of the certificate
@@ -78033,6 +78131,11 @@ _Certificate_raw = new WeakMap(), _Certificate_hash = new WeakMap(), _Certificat
78033
78131
  return ({ issued: false, reason: 'Signature verification failed' });
78034
78132
  }
78035
78133
  return ({ issued: true });
78134
+ }, _Certificate_computeHash = function _Certificate_computeHash() {
78135
+ if (!__classPrivateFieldGet(this, _Certificate_hash, "f")) {
78136
+ __classPrivateFieldSet(this, _Certificate_hash, CertificateHash.fromData(Buffer.from(__classPrivateFieldGet(this, _Certificate_raw, "f"))), "f");
78137
+ }
78138
+ return (__classPrivateFieldGet(this, _Certificate_hash, "f"));
78036
78139
  };
78037
78140
  /**
78038
78141
  * The Certificate Builder
@@ -81230,7 +81333,7 @@ exports.Testing = { findRDN, blockHashesFromVote, feeFromVote, hashDataSchema, f
81230
81333
 
81231
81334
  Object.defineProperty(exports, "__esModule", ({ value: true }));
81232
81335
  exports.version = void 0;
81233
- exports.version = '0.18.0+g5417d9af948be899fcebb75694edb492ff971891';
81336
+ exports.version = '0.18.2+gac0baac4139da80613edd4a1ebc7532f37fc834a';
81234
81337
  exports["default"] = exports.version;
81235
81338
 
81236
81339
 
@@ -1 +1 @@
1
- window.hierarchyData = "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"
1
+ window.hierarchyData = "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"