@metamask-previews/network-controller 33.0.0-preview-ba933fc1b → 33.0.0-preview-14cbc2873

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/CHANGELOG.md CHANGED
@@ -7,6 +7,18 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
7
7
 
8
8
  ## [Unreleased]
9
9
 
10
+ ### Added
11
+
12
+ - Add optional `analytics` constructor option that makes `NetworkController` emit `RPC Service Unavailable` and `RPC Service Degraded` analytics events via the `AnalyticsController:trackEvent` action when an RPC endpoint becomes unavailable or degraded ([#9270](https://github.com/MetaMask/core/pull/9270))
13
+ - The option takes `isRpcEndpointUrlPublic` (decides whether an endpoint URL is safe to report verbatim or as `'custom'`) and `rpcServiceEventsSampleRate` (the proportion of events to emit, between `0` and `1`).
14
+ - No analytics are emitted when the option is omitted.
15
+ - Adds the `NetworkControllerAnalyticsOptions` and `RpcServiceEventName` types.
16
+
17
+ ### Changed
18
+
19
+ - The `NetworkControllerMessenger` now allows the `AnalyticsController:getState` and `AnalyticsController:trackEvent` actions ([#9270](https://github.com/MetaMask/core/pull/9270))
20
+ - Consumers that pass the `analytics` option must delegate these actions to the network controller messenger.
21
+
10
22
  ## [33.0.0]
11
23
 
12
24
  ### Added
@@ -36,12 +36,13 @@ var __classPrivateFieldGet = (this && this.__classPrivateFieldGet) || function (
36
36
  var __importDefault = (this && this.__importDefault) || function (mod) {
37
37
  return (mod && mod.__esModule) ? mod : { "default": mod };
38
38
  };
39
- var _NetworkController_instances, _NetworkController_ethQuery, _NetworkController_infuraProjectId, _NetworkController_failoverUrls, _NetworkController_previouslySelectedNetworkClientId, _NetworkController_providerProxy, _NetworkController_blockTrackerProxy, _NetworkController_autoManagedNetworkClientRegistry, _NetworkController_autoManagedNetworkClient, _NetworkController_log, _NetworkController_getRpcServiceOptions, _NetworkController_getBlockTrackerOptions, _NetworkController_networkConfigurationsByNetworkClientId, _NetworkController_isRpcFailoverEnabled, _NetworkController_updateRpcFailoverEnabled, _NetworkController_refreshNetwork, _NetworkController_determineNetworkMetadata, _NetworkController_lookupGivenNetwork, _NetworkController_lookupSelectedNetwork, _NetworkController_updateMetadataForNetwork, _NetworkController_getLatestBlock, _NetworkController_determineEIP1559Compatibility, _NetworkController_validateNetworkFields, _NetworkController_determineNetworkConfigurationToPersist, _NetworkController_registerNetworkClientsAsNeeded, _NetworkController_unregisterNetworkClientsAsNeeded, _NetworkController_updateNetworkConfigurations, _NetworkController_ensureAutoManagedNetworkClientRegistryPopulated, _NetworkController_createAutoManagedNetworkClientRegistry, _NetworkController_applyNetworkSelection;
39
+ var _NetworkController_instances, _NetworkController_ethQuery, _NetworkController_infuraProjectId, _NetworkController_failoverUrls, _NetworkController_previouslySelectedNetworkClientId, _NetworkController_providerProxy, _NetworkController_blockTrackerProxy, _NetworkController_autoManagedNetworkClientRegistry, _NetworkController_autoManagedNetworkClient, _NetworkController_log, _NetworkController_getRpcServiceOptions, _NetworkController_getBlockTrackerOptions, _NetworkController_analytics, _NetworkController_networkConfigurationsByNetworkClientId, _NetworkController_isRpcFailoverEnabled, _NetworkController_trackRpcServiceEvent, _NetworkController_updateRpcFailoverEnabled, _NetworkController_refreshNetwork, _NetworkController_determineNetworkMetadata, _NetworkController_lookupGivenNetwork, _NetworkController_lookupSelectedNetwork, _NetworkController_updateMetadataForNetwork, _NetworkController_getLatestBlock, _NetworkController_determineEIP1559Compatibility, _NetworkController_validateNetworkFields, _NetworkController_determineNetworkConfigurationToPersist, _NetworkController_registerNetworkClientsAsNeeded, _NetworkController_unregisterNetworkClientsAsNeeded, _NetworkController_updateNetworkConfigurations, _NetworkController_ensureAutoManagedNetworkClientRegistryPopulated, _NetworkController_createAutoManagedNetworkClientRegistry, _NetworkController_applyNetworkSelection;
40
40
  Object.defineProperty(exports, "__esModule", { value: true });
41
41
  exports.NetworkController = exports.selectAvailableNetworkClientIds = exports.getAvailableNetworkClientIds = exports.selectNetworkConfigurations = exports.getNetworkConfigurations = exports.getDefaultNetworkControllerState = exports.knownKeysOf = exports.RpcEndpointType = void 0;
42
42
  const base_controller_1 = require("@metamask/base-controller");
43
43
  const controller_utils_1 = require("@metamask/controller-utils");
44
44
  const eth_query_1 = __importDefault(require("@metamask/eth-query"));
45
+ const remote_feature_flag_controller_1 = require("@metamask/remote-feature-flag-controller");
45
46
  const rpc_errors_1 = require("@metamask/rpc-errors");
46
47
  const swappable_obj_proxy_1 = require("@metamask/swappable-obj-proxy");
47
48
  const utils_1 = require("@metamask/utils");
@@ -54,6 +55,8 @@ const uuid_1 = require("uuid");
54
55
  const constants_1 = require("./constants.cjs");
55
56
  const create_auto_managed_network_client_1 = require("./create-auto-managed-network-client.cjs");
56
57
  const logger_1 = require("./logger.cjs");
58
+ const rpc_service_events_1 = require("./rpc-service-events.cjs");
59
+ const rpc_service_1 = require("./rpc-service/rpc-service.cjs");
57
60
  const selectors_1 = require("./selectors.cjs");
58
61
  const types_1 = require("./types.cjs");
59
62
  const debugLog = (0, logger_1.createModuleLogger)(logger_1.projectLogger, 'NetworkController');
@@ -393,7 +396,7 @@ class NetworkController extends base_controller_1.BaseController {
393
396
  * @param options - The options; see {@link NetworkControllerOptions}.
394
397
  */
395
398
  constructor(options) {
396
- const { messenger, state, infuraProjectId, failoverUrls, log, getRpcServiceOptions, getBlockTrackerOptions, } = options;
399
+ const { messenger, state, infuraProjectId, failoverUrls, log, getRpcServiceOptions, getBlockTrackerOptions, analytics, } = options;
397
400
  const initialState = {
398
401
  ...getDefaultNetworkControllerState(),
399
402
  ...state,
@@ -440,6 +443,7 @@ class NetworkController extends base_controller_1.BaseController {
440
443
  _NetworkController_log.set(this, void 0);
441
444
  _NetworkController_getRpcServiceOptions.set(this, void 0);
442
445
  _NetworkController_getBlockTrackerOptions.set(this, void 0);
446
+ _NetworkController_analytics.set(this, void 0);
443
447
  _NetworkController_networkConfigurationsByNetworkClientId.set(this, void 0);
444
448
  _NetworkController_isRpcFailoverEnabled.set(this, false);
445
449
  __classPrivateFieldSet(this, _NetworkController_infuraProjectId, infuraProjectId, "f");
@@ -447,6 +451,7 @@ class NetworkController extends base_controller_1.BaseController {
447
451
  __classPrivateFieldSet(this, _NetworkController_log, log, "f");
448
452
  __classPrivateFieldSet(this, _NetworkController_getRpcServiceOptions, getRpcServiceOptions, "f");
449
453
  __classPrivateFieldSet(this, _NetworkController_getBlockTrackerOptions, getBlockTrackerOptions, "f");
454
+ __classPrivateFieldSet(this, _NetworkController_analytics, analytics, "f");
450
455
  __classPrivateFieldSet(this, _NetworkController_previouslySelectedNetworkClientId, this.state.selectedNetworkClientId, "f");
451
456
  __classPrivateFieldSet(this, _NetworkController_networkConfigurationsByNetworkClientId, buildNetworkConfigurationsByNetworkClientId(this.state.networkConfigurationsByChainId), "f");
452
457
  this.messenger.registerMethodActionHandlers(this, MESSENGER_EXPOSED_METHODS);
@@ -465,6 +470,28 @@ class NetworkController extends base_controller_1.BaseController {
465
470
  networkStatus: constants_1.NetworkStatus.Available,
466
471
  });
467
472
  });
473
+ if (__classPrivateFieldGet(this, _NetworkController_analytics, "f")) {
474
+ const analyticsOptions = __classPrivateFieldGet(this, _NetworkController_analytics, "f");
475
+ this.messenger.subscribe(`${this.name}:rpcEndpointUnavailable`, ({ chainId, endpointUrl, error }) => {
476
+ __classPrivateFieldGet(this, _NetworkController_instances, "m", _NetworkController_trackRpcServiceEvent).call(this, analyticsOptions, 'RPC Service Unavailable', {
477
+ chainId,
478
+ endpointUrl,
479
+ error,
480
+ });
481
+ });
482
+ this.messenger.subscribe(`${this.name}:rpcEndpointDegraded`, ({ chainId, duration, endpointUrl, error, retryReason, rpcMethodName, traceId, type, }) => {
483
+ __classPrivateFieldGet(this, _NetworkController_instances, "m", _NetworkController_trackRpcServiceEvent).call(this, analyticsOptions, 'RPC Service Degraded', {
484
+ chainId,
485
+ duration,
486
+ endpointUrl,
487
+ error,
488
+ retryReason,
489
+ rpcMethodName,
490
+ traceId,
491
+ type,
492
+ });
493
+ });
494
+ }
468
495
  this.messenger.subscribe(
469
496
  // eslint-disable-next-line no-restricted-syntax
470
497
  'RemoteFeatureFlagController:stateChange', (isRpcFailoverEnabled) => {
@@ -1063,7 +1090,36 @@ class NetworkController extends base_controller_1.BaseController {
1063
1090
  }
1064
1091
  }
1065
1092
  exports.NetworkController = NetworkController;
1066
- _NetworkController_ethQuery = new WeakMap(), _NetworkController_infuraProjectId = new WeakMap(), _NetworkController_failoverUrls = new WeakMap(), _NetworkController_previouslySelectedNetworkClientId = new WeakMap(), _NetworkController_providerProxy = new WeakMap(), _NetworkController_blockTrackerProxy = new WeakMap(), _NetworkController_autoManagedNetworkClientRegistry = new WeakMap(), _NetworkController_autoManagedNetworkClient = new WeakMap(), _NetworkController_log = new WeakMap(), _NetworkController_getRpcServiceOptions = new WeakMap(), _NetworkController_getBlockTrackerOptions = new WeakMap(), _NetworkController_networkConfigurationsByNetworkClientId = new WeakMap(), _NetworkController_isRpcFailoverEnabled = new WeakMap(), _NetworkController_instances = new WeakSet(), _NetworkController_updateRpcFailoverEnabled = function _NetworkController_updateRpcFailoverEnabled(newIsRpcFailoverEnabled) {
1093
+ _NetworkController_ethQuery = new WeakMap(), _NetworkController_infuraProjectId = new WeakMap(), _NetworkController_failoverUrls = new WeakMap(), _NetworkController_previouslySelectedNetworkClientId = new WeakMap(), _NetworkController_providerProxy = new WeakMap(), _NetworkController_blockTrackerProxy = new WeakMap(), _NetworkController_autoManagedNetworkClientRegistry = new WeakMap(), _NetworkController_autoManagedNetworkClient = new WeakMap(), _NetworkController_log = new WeakMap(), _NetworkController_getRpcServiceOptions = new WeakMap(), _NetworkController_getBlockTrackerOptions = new WeakMap(), _NetworkController_analytics = new WeakMap(), _NetworkController_networkConfigurationsByNetworkClientId = new WeakMap(), _NetworkController_isRpcFailoverEnabled = new WeakMap(), _NetworkController_instances = new WeakSet(), _NetworkController_trackRpcServiceEvent = function _NetworkController_trackRpcServiceEvent(analytics, name, payload) {
1094
+ try {
1095
+ if ((0, rpc_service_1.isConnectionError)(payload.error)) {
1096
+ return;
1097
+ }
1098
+ const { analyticsId } = this.messenger.call('AnalyticsController:getState');
1099
+ if (!analyticsId) {
1100
+ return;
1101
+ }
1102
+ if ((0, remote_feature_flag_controller_1.generateDeterministicRandomNumber)(analyticsId) >=
1103
+ analytics.rpcServiceEventsSampleRate) {
1104
+ return;
1105
+ }
1106
+ const properties = (0, rpc_service_events_1.buildRpcServiceEventProperties)({
1107
+ chainId: payload.chainId,
1108
+ endpointUrl: payload.endpointUrl,
1109
+ error: payload.error,
1110
+ isRpcEndpointUrlPublic: analytics.isRpcEndpointUrlPublic,
1111
+ duration: payload.duration,
1112
+ retryReason: payload.retryReason,
1113
+ rpcMethodName: payload.rpcMethodName,
1114
+ traceId: payload.traceId,
1115
+ type: payload.type,
1116
+ });
1117
+ this.messenger.call('AnalyticsController:trackEvent', (0, rpc_service_events_1.toAnalyticsTrackingEvent)(name, properties));
1118
+ }
1119
+ catch (error) {
1120
+ this.messenger.captureException?.(error);
1121
+ }
1122
+ }, _NetworkController_updateRpcFailoverEnabled = function _NetworkController_updateRpcFailoverEnabled(newIsRpcFailoverEnabled) {
1067
1123
  if (__classPrivateFieldGet(this, _NetworkController_isRpcFailoverEnabled, "f") === newIsRpcFailoverEnabled) {
1068
1124
  return;
1069
1125
  }