@metamask-previews/network-controller 34.0.0-preview-e0e795054 → 34.0.0-preview-0d2cbf546
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 +11 -0
- package/dist/NetworkController.cjs +8 -3
- package/dist/NetworkController.cjs.map +1 -1
- package/dist/NetworkController.d.cts +10 -1
- package/dist/NetworkController.d.cts.map +1 -1
- package/dist/NetworkController.d.mts +10 -1
- package/dist/NetworkController.d.mts.map +1 -1
- package/dist/NetworkController.mjs +8 -3
- package/dist/NetworkController.mjs.map +1 -1
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +1 -0
- package/dist/index.d.cts.map +1 -1
- package/dist/index.d.mts +1 -0
- package/dist/index.d.mts.map +1 -1
- package/dist/index.mjs.map +1 -1
- package/dist/rpc-service-analytics.cjs +167 -0
- package/dist/rpc-service-analytics.cjs.map +1 -0
- package/dist/rpc-service-analytics.d.cts +79 -0
- package/dist/rpc-service-analytics.d.cts.map +1 -0
- package/dist/rpc-service-analytics.d.mts +79 -0
- package/dist/rpc-service-analytics.d.mts.map +1 -0
- package/dist/rpc-service-analytics.mjs +159 -0
- package/dist/rpc-service-analytics.mjs.map +1 -0
- package/package.json +7 -6
package/dist/index.cjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.cjs","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;AAmCA,6DAM6B;AAL3B,qIAAA,gCAAgC,OAAA;AAChC,oIAAA,+BAA+B,OAAA;AAC/B,gHAAA,WAAW,OAAA;AACX,sHAAA,iBAAiB,OAAA;AACjB,oHAAA,eAAe,OAAA;AAEjB,kDAA4B;AAO5B,qCAA4C;AAAnC,0GAAA,iBAAiB,OAAA;AAK1B,qEAA8D;AAArD,4HAAA,mBAAmB,OAAA;
|
|
1
|
+
{"version":3,"file":"index.cjs","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;AAmCA,6DAM6B;AAL3B,qIAAA,gCAAgC,OAAA;AAChC,oIAAA,+BAA+B,OAAA;AAC/B,gHAAA,WAAW,OAAA;AACX,sHAAA,iBAAiB,OAAA;AACjB,oHAAA,eAAe,OAAA;AAEjB,kDAA4B;AAO5B,qCAA4C;AAAnC,0GAAA,iBAAiB,OAAA;AAK1B,qEAA8D;AAArD,4HAAA,mBAAmB,OAAA;AAK5B,6DAA8D;AAArD,gHAAA,iBAAiB,OAAA","sourcesContent":["export type { AutoManagedNetworkClient } from './create-auto-managed-network-client';\nexport type {\n Block,\n NetworkMetadata,\n NetworkConfiguration,\n BuiltInNetworkClientId,\n CustomNetworkClientId,\n NetworkClientId,\n NetworksMetadata,\n NetworkState,\n BlockTrackerProxy,\n ProviderProxy,\n AddNetworkCustomRpcEndpointFields,\n AddNetworkFields,\n UpdateNetworkFields,\n InfuraRpcEndpoint,\n NetworkControllerStateChangeEvent,\n NetworkControllerNetworkWillChangeEvent,\n NetworkControllerNetworkDidChangeEvent,\n NetworkControllerInfuraIsBlockedEvent,\n NetworkControllerInfuraIsUnblockedEvent,\n NetworkControllerNetworkAddedEvent,\n NetworkControllerNetworkRemovedEvent,\n NetworkControllerEvents,\n NetworkControllerGetStateAction,\n NetworkControllerActions,\n NetworkControllerMessenger,\n NetworkControllerOptions,\n NetworkControllerRpcEndpointChainUnavailableEvent,\n NetworkControllerRpcEndpointUnavailableEvent,\n NetworkControllerRpcEndpointChainDegradedEvent,\n NetworkControllerRpcEndpointDegradedEvent,\n NetworkControllerRpcEndpointChainAvailableEvent,\n NetworkControllerRpcEndpointRetriedEvent,\n} from './NetworkController';\nexport {\n getDefaultNetworkControllerState,\n selectAvailableNetworkClientIds,\n knownKeysOf,\n NetworkController,\n RpcEndpointType,\n} from './NetworkController';\nexport * from './constants';\nexport type { BlockTracker, Provider } from './types';\nexport type {\n NetworkClientConfiguration,\n InfuraNetworkClientConfiguration,\n CustomNetworkClientConfiguration,\n} from './types';\nexport { NetworkClientType } from './types';\nexport type { NetworkClient } from './create-network-client';\nexport type { AbstractRpcService } from './rpc-service/abstract-rpc-service';\nexport type { RpcServiceRequestable } from './rpc-service/rpc-service-requestable';\nexport type { DegradedEventType, RetryReason } from './create-network-client';\nexport { classifyRetryReason } from './create-network-client';\nexport type {\n NetworkControllerAnalyticsOptions,\n RpcServiceEventName,\n} from './rpc-service-analytics';\nexport { isConnectionError } from './rpc-service/rpc-service';\nexport type {\n NetworkControllerGetEthQueryAction,\n NetworkControllerGetNetworkClientByIdAction,\n NetworkControllerGetSelectedNetworkClientAction,\n NetworkControllerGetSelectedChainIdAction,\n NetworkControllerGetEIP1559CompatibilityAction,\n NetworkControllerFindNetworkClientIdByChainIdAction,\n NetworkControllerSetProviderTypeAction,\n NetworkControllerSetActiveNetworkAction,\n NetworkControllerGetNetworkConfigurationByChainIdAction,\n NetworkControllerGetNetworkConfigurationByNetworkClientIdAction,\n NetworkControllerAddNetworkAction,\n NetworkControllerRemoveNetworkAction,\n NetworkControllerUpdateNetworkAction,\n NetworkControllerGetProviderAndBlockTrackerAction,\n NetworkControllerGetNetworkClientRegistryAction,\n NetworkControllerLookupNetworkAction,\n NetworkControllerLookupNetworkByClientIdAction,\n NetworkControllerGet1559CompatibilityWithNetworkClientIdAction,\n NetworkControllerResetConnectionAction,\n NetworkControllerRollbackToPreviousProviderAction,\n NetworkControllerLoadBackupAction,\n} from './NetworkController-method-action-types';\n"]}
|
package/dist/index.d.cts
CHANGED
|
@@ -10,6 +10,7 @@ export type { AbstractRpcService } from "./rpc-service/abstract-rpc-service.cjs"
|
|
|
10
10
|
export type { RpcServiceRequestable } from "./rpc-service/rpc-service-requestable.cjs";
|
|
11
11
|
export type { DegradedEventType, RetryReason } from "./create-network-client.cjs";
|
|
12
12
|
export { classifyRetryReason } from "./create-network-client.cjs";
|
|
13
|
+
export type { NetworkControllerAnalyticsOptions, RpcServiceEventName, } from "./rpc-service-analytics.cjs";
|
|
13
14
|
export { isConnectionError } from "./rpc-service/rpc-service.cjs";
|
|
14
15
|
export type { NetworkControllerGetEthQueryAction, NetworkControllerGetNetworkClientByIdAction, NetworkControllerGetSelectedNetworkClientAction, NetworkControllerGetSelectedChainIdAction, NetworkControllerGetEIP1559CompatibilityAction, NetworkControllerFindNetworkClientIdByChainIdAction, NetworkControllerSetProviderTypeAction, NetworkControllerSetActiveNetworkAction, NetworkControllerGetNetworkConfigurationByChainIdAction, NetworkControllerGetNetworkConfigurationByNetworkClientIdAction, NetworkControllerAddNetworkAction, NetworkControllerRemoveNetworkAction, NetworkControllerUpdateNetworkAction, NetworkControllerGetProviderAndBlockTrackerAction, NetworkControllerGetNetworkClientRegistryAction, NetworkControllerLookupNetworkAction, NetworkControllerLookupNetworkByClientIdAction, NetworkControllerGet1559CompatibilityWithNetworkClientIdAction, NetworkControllerResetConnectionAction, NetworkControllerRollbackToPreviousProviderAction, NetworkControllerLoadBackupAction, } from "./NetworkController-method-action-types.cjs";
|
|
15
16
|
//# sourceMappingURL=index.d.cts.map
|
package/dist/index.d.cts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.cts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,YAAY,EAAE,wBAAwB,EAAE,iDAA6C;AACrF,YAAY,EACV,KAAK,EACL,eAAe,EACf,oBAAoB,EACpB,sBAAsB,EACtB,qBAAqB,EACrB,eAAe,EACf,gBAAgB,EAChB,YAAY,EACZ,iBAAiB,EACjB,aAAa,EACb,iCAAiC,EACjC,gBAAgB,EAChB,mBAAmB,EACnB,iBAAiB,EACjB,iCAAiC,EACjC,uCAAuC,EACvC,sCAAsC,EACtC,qCAAqC,EACrC,uCAAuC,EACvC,kCAAkC,EAClC,oCAAoC,EACpC,uBAAuB,EACvB,+BAA+B,EAC/B,wBAAwB,EACxB,0BAA0B,EAC1B,wBAAwB,EACxB,iDAAiD,EACjD,4CAA4C,EAC5C,8CAA8C,EAC9C,yCAAyC,EACzC,+CAA+C,EAC/C,wCAAwC,GACzC,gCAA4B;AAC7B,OAAO,EACL,gCAAgC,EAChC,+BAA+B,EAC/B,WAAW,EACX,iBAAiB,EACjB,eAAe,GAChB,gCAA4B;AAC7B,gCAA4B;AAC5B,YAAY,EAAE,YAAY,EAAE,QAAQ,EAAE,oBAAgB;AACtD,YAAY,EACV,0BAA0B,EAC1B,gCAAgC,EAChC,gCAAgC,GACjC,oBAAgB;AACjB,OAAO,EAAE,iBAAiB,EAAE,oBAAgB;AAC5C,YAAY,EAAE,aAAa,EAAE,oCAAgC;AAC7D,YAAY,EAAE,kBAAkB,EAAE,+CAA2C;AAC7E,YAAY,EAAE,qBAAqB,EAAE,kDAA8C;AACnF,YAAY,EAAE,iBAAiB,EAAE,WAAW,EAAE,oCAAgC;AAC9E,OAAO,EAAE,mBAAmB,EAAE,oCAAgC;AAC9D,OAAO,EAAE,iBAAiB,EAAE,sCAAkC;AAC9D,YAAY,EACV,kCAAkC,EAClC,2CAA2C,EAC3C,+CAA+C,EAC/C,yCAAyC,EACzC,8CAA8C,EAC9C,mDAAmD,EACnD,sCAAsC,EACtC,uCAAuC,EACvC,uDAAuD,EACvD,+DAA+D,EAC/D,iCAAiC,EACjC,oCAAoC,EACpC,oCAAoC,EACpC,iDAAiD,EACjD,+CAA+C,EAC/C,oCAAoC,EACpC,8CAA8C,EAC9C,8DAA8D,EAC9D,sCAAsC,EACtC,iDAAiD,EACjD,iCAAiC,GAClC,oDAAgD"}
|
|
1
|
+
{"version":3,"file":"index.d.cts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,YAAY,EAAE,wBAAwB,EAAE,iDAA6C;AACrF,YAAY,EACV,KAAK,EACL,eAAe,EACf,oBAAoB,EACpB,sBAAsB,EACtB,qBAAqB,EACrB,eAAe,EACf,gBAAgB,EAChB,YAAY,EACZ,iBAAiB,EACjB,aAAa,EACb,iCAAiC,EACjC,gBAAgB,EAChB,mBAAmB,EACnB,iBAAiB,EACjB,iCAAiC,EACjC,uCAAuC,EACvC,sCAAsC,EACtC,qCAAqC,EACrC,uCAAuC,EACvC,kCAAkC,EAClC,oCAAoC,EACpC,uBAAuB,EACvB,+BAA+B,EAC/B,wBAAwB,EACxB,0BAA0B,EAC1B,wBAAwB,EACxB,iDAAiD,EACjD,4CAA4C,EAC5C,8CAA8C,EAC9C,yCAAyC,EACzC,+CAA+C,EAC/C,wCAAwC,GACzC,gCAA4B;AAC7B,OAAO,EACL,gCAAgC,EAChC,+BAA+B,EAC/B,WAAW,EACX,iBAAiB,EACjB,eAAe,GAChB,gCAA4B;AAC7B,gCAA4B;AAC5B,YAAY,EAAE,YAAY,EAAE,QAAQ,EAAE,oBAAgB;AACtD,YAAY,EACV,0BAA0B,EAC1B,gCAAgC,EAChC,gCAAgC,GACjC,oBAAgB;AACjB,OAAO,EAAE,iBAAiB,EAAE,oBAAgB;AAC5C,YAAY,EAAE,aAAa,EAAE,oCAAgC;AAC7D,YAAY,EAAE,kBAAkB,EAAE,+CAA2C;AAC7E,YAAY,EAAE,qBAAqB,EAAE,kDAA8C;AACnF,YAAY,EAAE,iBAAiB,EAAE,WAAW,EAAE,oCAAgC;AAC9E,OAAO,EAAE,mBAAmB,EAAE,oCAAgC;AAC9D,YAAY,EACV,iCAAiC,EACjC,mBAAmB,GACpB,oCAAgC;AACjC,OAAO,EAAE,iBAAiB,EAAE,sCAAkC;AAC9D,YAAY,EACV,kCAAkC,EAClC,2CAA2C,EAC3C,+CAA+C,EAC/C,yCAAyC,EACzC,8CAA8C,EAC9C,mDAAmD,EACnD,sCAAsC,EACtC,uCAAuC,EACvC,uDAAuD,EACvD,+DAA+D,EAC/D,iCAAiC,EACjC,oCAAoC,EACpC,oCAAoC,EACpC,iDAAiD,EACjD,+CAA+C,EAC/C,oCAAoC,EACpC,8CAA8C,EAC9C,8DAA8D,EAC9D,sCAAsC,EACtC,iDAAiD,EACjD,iCAAiC,GAClC,oDAAgD"}
|
package/dist/index.d.mts
CHANGED
|
@@ -10,6 +10,7 @@ export type { AbstractRpcService } from "./rpc-service/abstract-rpc-service.mjs"
|
|
|
10
10
|
export type { RpcServiceRequestable } from "./rpc-service/rpc-service-requestable.mjs";
|
|
11
11
|
export type { DegradedEventType, RetryReason } from "./create-network-client.mjs";
|
|
12
12
|
export { classifyRetryReason } from "./create-network-client.mjs";
|
|
13
|
+
export type { NetworkControllerAnalyticsOptions, RpcServiceEventName, } from "./rpc-service-analytics.mjs";
|
|
13
14
|
export { isConnectionError } from "./rpc-service/rpc-service.mjs";
|
|
14
15
|
export type { NetworkControllerGetEthQueryAction, NetworkControllerGetNetworkClientByIdAction, NetworkControllerGetSelectedNetworkClientAction, NetworkControllerGetSelectedChainIdAction, NetworkControllerGetEIP1559CompatibilityAction, NetworkControllerFindNetworkClientIdByChainIdAction, NetworkControllerSetProviderTypeAction, NetworkControllerSetActiveNetworkAction, NetworkControllerGetNetworkConfigurationByChainIdAction, NetworkControllerGetNetworkConfigurationByNetworkClientIdAction, NetworkControllerAddNetworkAction, NetworkControllerRemoveNetworkAction, NetworkControllerUpdateNetworkAction, NetworkControllerGetProviderAndBlockTrackerAction, NetworkControllerGetNetworkClientRegistryAction, NetworkControllerLookupNetworkAction, NetworkControllerLookupNetworkByClientIdAction, NetworkControllerGet1559CompatibilityWithNetworkClientIdAction, NetworkControllerResetConnectionAction, NetworkControllerRollbackToPreviousProviderAction, NetworkControllerLoadBackupAction, } from "./NetworkController-method-action-types.mjs";
|
|
15
16
|
//# sourceMappingURL=index.d.mts.map
|
package/dist/index.d.mts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.mts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,YAAY,EAAE,wBAAwB,EAAE,iDAA6C;AACrF,YAAY,EACV,KAAK,EACL,eAAe,EACf,oBAAoB,EACpB,sBAAsB,EACtB,qBAAqB,EACrB,eAAe,EACf,gBAAgB,EAChB,YAAY,EACZ,iBAAiB,EACjB,aAAa,EACb,iCAAiC,EACjC,gBAAgB,EAChB,mBAAmB,EACnB,iBAAiB,EACjB,iCAAiC,EACjC,uCAAuC,EACvC,sCAAsC,EACtC,qCAAqC,EACrC,uCAAuC,EACvC,kCAAkC,EAClC,oCAAoC,EACpC,uBAAuB,EACvB,+BAA+B,EAC/B,wBAAwB,EACxB,0BAA0B,EAC1B,wBAAwB,EACxB,iDAAiD,EACjD,4CAA4C,EAC5C,8CAA8C,EAC9C,yCAAyC,EACzC,+CAA+C,EAC/C,wCAAwC,GACzC,gCAA4B;AAC7B,OAAO,EACL,gCAAgC,EAChC,+BAA+B,EAC/B,WAAW,EACX,iBAAiB,EACjB,eAAe,GAChB,gCAA4B;AAC7B,gCAA4B;AAC5B,YAAY,EAAE,YAAY,EAAE,QAAQ,EAAE,oBAAgB;AACtD,YAAY,EACV,0BAA0B,EAC1B,gCAAgC,EAChC,gCAAgC,GACjC,oBAAgB;AACjB,OAAO,EAAE,iBAAiB,EAAE,oBAAgB;AAC5C,YAAY,EAAE,aAAa,EAAE,oCAAgC;AAC7D,YAAY,EAAE,kBAAkB,EAAE,+CAA2C;AAC7E,YAAY,EAAE,qBAAqB,EAAE,kDAA8C;AACnF,YAAY,EAAE,iBAAiB,EAAE,WAAW,EAAE,oCAAgC;AAC9E,OAAO,EAAE,mBAAmB,EAAE,oCAAgC;AAC9D,OAAO,EAAE,iBAAiB,EAAE,sCAAkC;AAC9D,YAAY,EACV,kCAAkC,EAClC,2CAA2C,EAC3C,+CAA+C,EAC/C,yCAAyC,EACzC,8CAA8C,EAC9C,mDAAmD,EACnD,sCAAsC,EACtC,uCAAuC,EACvC,uDAAuD,EACvD,+DAA+D,EAC/D,iCAAiC,EACjC,oCAAoC,EACpC,oCAAoC,EACpC,iDAAiD,EACjD,+CAA+C,EAC/C,oCAAoC,EACpC,8CAA8C,EAC9C,8DAA8D,EAC9D,sCAAsC,EACtC,iDAAiD,EACjD,iCAAiC,GAClC,oDAAgD"}
|
|
1
|
+
{"version":3,"file":"index.d.mts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,YAAY,EAAE,wBAAwB,EAAE,iDAA6C;AACrF,YAAY,EACV,KAAK,EACL,eAAe,EACf,oBAAoB,EACpB,sBAAsB,EACtB,qBAAqB,EACrB,eAAe,EACf,gBAAgB,EAChB,YAAY,EACZ,iBAAiB,EACjB,aAAa,EACb,iCAAiC,EACjC,gBAAgB,EAChB,mBAAmB,EACnB,iBAAiB,EACjB,iCAAiC,EACjC,uCAAuC,EACvC,sCAAsC,EACtC,qCAAqC,EACrC,uCAAuC,EACvC,kCAAkC,EAClC,oCAAoC,EACpC,uBAAuB,EACvB,+BAA+B,EAC/B,wBAAwB,EACxB,0BAA0B,EAC1B,wBAAwB,EACxB,iDAAiD,EACjD,4CAA4C,EAC5C,8CAA8C,EAC9C,yCAAyC,EACzC,+CAA+C,EAC/C,wCAAwC,GACzC,gCAA4B;AAC7B,OAAO,EACL,gCAAgC,EAChC,+BAA+B,EAC/B,WAAW,EACX,iBAAiB,EACjB,eAAe,GAChB,gCAA4B;AAC7B,gCAA4B;AAC5B,YAAY,EAAE,YAAY,EAAE,QAAQ,EAAE,oBAAgB;AACtD,YAAY,EACV,0BAA0B,EAC1B,gCAAgC,EAChC,gCAAgC,GACjC,oBAAgB;AACjB,OAAO,EAAE,iBAAiB,EAAE,oBAAgB;AAC5C,YAAY,EAAE,aAAa,EAAE,oCAAgC;AAC7D,YAAY,EAAE,kBAAkB,EAAE,+CAA2C;AAC7E,YAAY,EAAE,qBAAqB,EAAE,kDAA8C;AACnF,YAAY,EAAE,iBAAiB,EAAE,WAAW,EAAE,oCAAgC;AAC9E,OAAO,EAAE,mBAAmB,EAAE,oCAAgC;AAC9D,YAAY,EACV,iCAAiC,EACjC,mBAAmB,GACpB,oCAAgC;AACjC,OAAO,EAAE,iBAAiB,EAAE,sCAAkC;AAC9D,YAAY,EACV,kCAAkC,EAClC,2CAA2C,EAC3C,+CAA+C,EAC/C,yCAAyC,EACzC,8CAA8C,EAC9C,mDAAmD,EACnD,sCAAsC,EACtC,uCAAuC,EACvC,uDAAuD,EACvD,+DAA+D,EAC/D,iCAAiC,EACjC,oCAAoC,EACpC,oCAAoC,EACpC,iDAAiD,EACjD,+CAA+C,EAC/C,oCAAoC,EACpC,8CAA8C,EAC9C,8DAA8D,EAC9D,sCAAsC,EACtC,iDAAiD,EACjD,iCAAiC,GAClC,oDAAgD"}
|
package/dist/index.mjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.mjs","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAmCA,OAAO,EACL,gCAAgC,EAChC,+BAA+B,EAC/B,WAAW,EACX,iBAAiB,EACjB,eAAe,EAChB,gCAA4B;AAC7B,gCAA4B;AAO5B,OAAO,EAAE,iBAAiB,EAAE,oBAAgB;AAK5C,OAAO,EAAE,mBAAmB,EAAE,oCAAgC;
|
|
1
|
+
{"version":3,"file":"index.mjs","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAmCA,OAAO,EACL,gCAAgC,EAChC,+BAA+B,EAC/B,WAAW,EACX,iBAAiB,EACjB,eAAe,EAChB,gCAA4B;AAC7B,gCAA4B;AAO5B,OAAO,EAAE,iBAAiB,EAAE,oBAAgB;AAK5C,OAAO,EAAE,mBAAmB,EAAE,oCAAgC;AAK9D,OAAO,EAAE,iBAAiB,EAAE,sCAAkC","sourcesContent":["export type { AutoManagedNetworkClient } from './create-auto-managed-network-client';\nexport type {\n Block,\n NetworkMetadata,\n NetworkConfiguration,\n BuiltInNetworkClientId,\n CustomNetworkClientId,\n NetworkClientId,\n NetworksMetadata,\n NetworkState,\n BlockTrackerProxy,\n ProviderProxy,\n AddNetworkCustomRpcEndpointFields,\n AddNetworkFields,\n UpdateNetworkFields,\n InfuraRpcEndpoint,\n NetworkControllerStateChangeEvent,\n NetworkControllerNetworkWillChangeEvent,\n NetworkControllerNetworkDidChangeEvent,\n NetworkControllerInfuraIsBlockedEvent,\n NetworkControllerInfuraIsUnblockedEvent,\n NetworkControllerNetworkAddedEvent,\n NetworkControllerNetworkRemovedEvent,\n NetworkControllerEvents,\n NetworkControllerGetStateAction,\n NetworkControllerActions,\n NetworkControllerMessenger,\n NetworkControllerOptions,\n NetworkControllerRpcEndpointChainUnavailableEvent,\n NetworkControllerRpcEndpointUnavailableEvent,\n NetworkControllerRpcEndpointChainDegradedEvent,\n NetworkControllerRpcEndpointDegradedEvent,\n NetworkControllerRpcEndpointChainAvailableEvent,\n NetworkControllerRpcEndpointRetriedEvent,\n} from './NetworkController';\nexport {\n getDefaultNetworkControllerState,\n selectAvailableNetworkClientIds,\n knownKeysOf,\n NetworkController,\n RpcEndpointType,\n} from './NetworkController';\nexport * from './constants';\nexport type { BlockTracker, Provider } from './types';\nexport type {\n NetworkClientConfiguration,\n InfuraNetworkClientConfiguration,\n CustomNetworkClientConfiguration,\n} from './types';\nexport { NetworkClientType } from './types';\nexport type { NetworkClient } from './create-network-client';\nexport type { AbstractRpcService } from './rpc-service/abstract-rpc-service';\nexport type { RpcServiceRequestable } from './rpc-service/rpc-service-requestable';\nexport type { DegradedEventType, RetryReason } from './create-network-client';\nexport { classifyRetryReason } from './create-network-client';\nexport type {\n NetworkControllerAnalyticsOptions,\n RpcServiceEventName,\n} from './rpc-service-analytics';\nexport { isConnectionError } from './rpc-service/rpc-service';\nexport type {\n NetworkControllerGetEthQueryAction,\n NetworkControllerGetNetworkClientByIdAction,\n NetworkControllerGetSelectedNetworkClientAction,\n NetworkControllerGetSelectedChainIdAction,\n NetworkControllerGetEIP1559CompatibilityAction,\n NetworkControllerFindNetworkClientIdByChainIdAction,\n NetworkControllerSetProviderTypeAction,\n NetworkControllerSetActiveNetworkAction,\n NetworkControllerGetNetworkConfigurationByChainIdAction,\n NetworkControllerGetNetworkConfigurationByNetworkClientIdAction,\n NetworkControllerAddNetworkAction,\n NetworkControllerRemoveNetworkAction,\n NetworkControllerUpdateNetworkAction,\n NetworkControllerGetProviderAndBlockTrackerAction,\n NetworkControllerGetNetworkClientRegistryAction,\n NetworkControllerLookupNetworkAction,\n NetworkControllerLookupNetworkByClientIdAction,\n NetworkControllerGet1559CompatibilityWithNetworkClientIdAction,\n NetworkControllerResetConnectionAction,\n NetworkControllerRollbackToPreviousProviderAction,\n NetworkControllerLoadBackupAction,\n} from './NetworkController-method-action-types';\n"]}
|
|
@@ -0,0 +1,167 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.trackRpcServiceDegraded = exports.trackRpcServiceUnavailable = exports.buildRpcServiceDegradedAnalyticsTrackingEvent = exports.buildRpcServiceUnavailableAnalyticsTrackingEvent = exports.sanitizeRpcEndpointUrl = void 0;
|
|
4
|
+
const remote_feature_flag_controller_1 = require("@metamask/remote-feature-flag-controller");
|
|
5
|
+
const utils_1 = require("@metamask/utils");
|
|
6
|
+
const rpc_service_1 = require("./rpc-service/rpc-service.cjs");
|
|
7
|
+
/**
|
|
8
|
+
* Hides any API key contained in an RPC endpoint URL by reducing it to its
|
|
9
|
+
* host, but only when the endpoint is considered public. Non-public endpoints
|
|
10
|
+
* (and URLs that cannot be parsed) are reported as the literal string
|
|
11
|
+
* `'custom'`.
|
|
12
|
+
*
|
|
13
|
+
* @param endpointUrl - The URL of the RPC endpoint.
|
|
14
|
+
* @param isPublic - Whether the endpoint is safe to report verbatim.
|
|
15
|
+
* @returns The sanitized value to report.
|
|
16
|
+
*/
|
|
17
|
+
function sanitizeRpcEndpointUrl(endpointUrl, isPublic) {
|
|
18
|
+
if (!isPublic) {
|
|
19
|
+
return 'custom';
|
|
20
|
+
}
|
|
21
|
+
try {
|
|
22
|
+
return new URL(endpointUrl).host;
|
|
23
|
+
}
|
|
24
|
+
catch {
|
|
25
|
+
return 'custom';
|
|
26
|
+
}
|
|
27
|
+
}
|
|
28
|
+
exports.sanitizeRpcEndpointUrl = sanitizeRpcEndpointUrl;
|
|
29
|
+
/**
|
|
30
|
+
* Wraps a name and properties into the shape expected by the
|
|
31
|
+
* `AnalyticsController:trackEvent` action.
|
|
32
|
+
*
|
|
33
|
+
* @param name - The analytics event name.
|
|
34
|
+
* @param properties - The analytics event properties.
|
|
35
|
+
* @returns The analytics tracking event.
|
|
36
|
+
*/
|
|
37
|
+
function toAnalyticsTrackingEvent(name, properties) {
|
|
38
|
+
return {
|
|
39
|
+
name,
|
|
40
|
+
properties,
|
|
41
|
+
sensitiveProperties: {},
|
|
42
|
+
saveDataRecording: false,
|
|
43
|
+
hasProperties: Object.keys(properties).length > 0,
|
|
44
|
+
};
|
|
45
|
+
}
|
|
46
|
+
/**
|
|
47
|
+
* Builds the properties common to both RPC service events.
|
|
48
|
+
*
|
|
49
|
+
* @param args - The arguments.
|
|
50
|
+
* @param args.chainId - The chain ID that the endpoint represents.
|
|
51
|
+
* @param args.endpointUrl - The URL of the endpoint.
|
|
52
|
+
* @param args.error - The connection or response error encountered.
|
|
53
|
+
* @param args.isRpcEndpointUrlPublic - Returns whether the endpoint URL is safe
|
|
54
|
+
* to report verbatim.
|
|
55
|
+
* @returns The common analytics event properties.
|
|
56
|
+
*/
|
|
57
|
+
function buildCommonRpcServiceEventProperties({ chainId, endpointUrl, error, isRpcEndpointUrlPublic, }) {
|
|
58
|
+
const sanitizedUrl = sanitizeRpcEndpointUrl(endpointUrl, isRpcEndpointUrlPublic(endpointUrl));
|
|
59
|
+
// The names of analytics properties have a particular case.
|
|
60
|
+
return {
|
|
61
|
+
chain_id_caip: `eip155:${(0, utils_1.hexToNumber)(chainId)}`,
|
|
62
|
+
rpc_domain: sanitizedUrl,
|
|
63
|
+
rpc_endpoint_url: sanitizedUrl, // @deprecated - Will be removed in a future release.
|
|
64
|
+
...((0, utils_1.isObject)(error) &&
|
|
65
|
+
(0, utils_1.hasProperty)(error, 'httpStatus') &&
|
|
66
|
+
(0, utils_1.isValidJson)(error.httpStatus)
|
|
67
|
+
? { http_status: error.httpStatus }
|
|
68
|
+
: {}),
|
|
69
|
+
};
|
|
70
|
+
}
|
|
71
|
+
/**
|
|
72
|
+
* Builds the "RPC Service Unavailable" analytics tracking event.
|
|
73
|
+
*
|
|
74
|
+
* @param payload - The `rpcEndpointUnavailable` event payload.
|
|
75
|
+
* @param isRpcEndpointUrlPublic - Returns whether the endpoint URL is safe to
|
|
76
|
+
* report verbatim.
|
|
77
|
+
* @returns The analytics tracking event.
|
|
78
|
+
*/
|
|
79
|
+
function buildRpcServiceUnavailableAnalyticsTrackingEvent(payload, isRpcEndpointUrlPublic) {
|
|
80
|
+
return toAnalyticsTrackingEvent('RPC Service Unavailable', buildCommonRpcServiceEventProperties({
|
|
81
|
+
chainId: payload.chainId,
|
|
82
|
+
endpointUrl: payload.endpointUrl,
|
|
83
|
+
error: payload.error,
|
|
84
|
+
isRpcEndpointUrlPublic,
|
|
85
|
+
}));
|
|
86
|
+
}
|
|
87
|
+
exports.buildRpcServiceUnavailableAnalyticsTrackingEvent = buildRpcServiceUnavailableAnalyticsTrackingEvent;
|
|
88
|
+
/**
|
|
89
|
+
* Builds the "RPC Service Degraded" analytics tracking event.
|
|
90
|
+
*
|
|
91
|
+
* @param payload - The `rpcEndpointDegraded` event payload.
|
|
92
|
+
* @param isRpcEndpointUrlPublic - Returns whether the endpoint URL is safe to
|
|
93
|
+
* report verbatim.
|
|
94
|
+
* @returns The analytics tracking event.
|
|
95
|
+
*/
|
|
96
|
+
function buildRpcServiceDegradedAnalyticsTrackingEvent(payload, isRpcEndpointUrlPublic) {
|
|
97
|
+
const { duration, retryReason, rpcMethodName, traceId, type } = payload;
|
|
98
|
+
// The names of analytics properties have a particular case.
|
|
99
|
+
return toAnalyticsTrackingEvent('RPC Service Degraded', {
|
|
100
|
+
...buildCommonRpcServiceEventProperties({
|
|
101
|
+
chainId: payload.chainId,
|
|
102
|
+
endpointUrl: payload.endpointUrl,
|
|
103
|
+
error: payload.error,
|
|
104
|
+
isRpcEndpointUrlPublic,
|
|
105
|
+
}),
|
|
106
|
+
rpc_method_name: rpcMethodName,
|
|
107
|
+
type,
|
|
108
|
+
...(retryReason ? { retry_reason: retryReason } : {}),
|
|
109
|
+
...(duration === undefined ? {} : { duration_ms: duration }),
|
|
110
|
+
...(traceId === undefined ? {} : { trace_id: traceId }),
|
|
111
|
+
});
|
|
112
|
+
}
|
|
113
|
+
exports.buildRpcServiceDegradedAnalyticsTrackingEvent = buildRpcServiceDegradedAnalyticsTrackingEvent;
|
|
114
|
+
/**
|
|
115
|
+
* Delivers an RPC service analytics event via the
|
|
116
|
+
* `AnalyticsController:trackEvent` action, skipping local connection errors,
|
|
117
|
+
* users without an analytics ID, and events that fall outside the configured
|
|
118
|
+
* sample. Failures never propagate to the caller.
|
|
119
|
+
*
|
|
120
|
+
* @param messenger - The controller messenger.
|
|
121
|
+
* @param analyticsOptions - The analytics configuration.
|
|
122
|
+
* @param error - The error encountered, used to skip local connection errors.
|
|
123
|
+
* @param buildTrackingEvent - Builds the event to deliver (only called when the
|
|
124
|
+
* event passes the sampling and analytics-ID checks).
|
|
125
|
+
*/
|
|
126
|
+
function trackRpcServiceEvent(messenger, analyticsOptions, error, buildTrackingEvent) {
|
|
127
|
+
try {
|
|
128
|
+
if ((0, rpc_service_1.isConnectionError)(error)) {
|
|
129
|
+
return;
|
|
130
|
+
}
|
|
131
|
+
const { analyticsId } = messenger.call('AnalyticsController:getState');
|
|
132
|
+
if (!analyticsId) {
|
|
133
|
+
return;
|
|
134
|
+
}
|
|
135
|
+
if ((0, remote_feature_flag_controller_1.generateDeterministicRandomNumber)(analyticsId) >=
|
|
136
|
+
analyticsOptions.rpcServiceEventsSampleRate) {
|
|
137
|
+
return;
|
|
138
|
+
}
|
|
139
|
+
messenger.call('AnalyticsController:trackEvent', buildTrackingEvent());
|
|
140
|
+
}
|
|
141
|
+
catch (caughtError) {
|
|
142
|
+
messenger.captureException?.((0, utils_1.wrapError)(caughtError, 'Could not create analytics event'));
|
|
143
|
+
}
|
|
144
|
+
}
|
|
145
|
+
/**
|
|
146
|
+
* Emits an "RPC Service Unavailable" analytics event.
|
|
147
|
+
*
|
|
148
|
+
* @param messenger - The controller messenger.
|
|
149
|
+
* @param analyticsOptions - The analytics configuration.
|
|
150
|
+
* @param payload - The `rpcEndpointUnavailable` event payload.
|
|
151
|
+
*/
|
|
152
|
+
function trackRpcServiceUnavailable(messenger, analyticsOptions, payload) {
|
|
153
|
+
trackRpcServiceEvent(messenger, analyticsOptions, payload.error, () => buildRpcServiceUnavailableAnalyticsTrackingEvent(payload, analyticsOptions.isRpcEndpointUrlPublic));
|
|
154
|
+
}
|
|
155
|
+
exports.trackRpcServiceUnavailable = trackRpcServiceUnavailable;
|
|
156
|
+
/**
|
|
157
|
+
* Emits an "RPC Service Degraded" analytics event.
|
|
158
|
+
*
|
|
159
|
+
* @param messenger - The controller messenger.
|
|
160
|
+
* @param analyticsOptions - The analytics configuration.
|
|
161
|
+
* @param payload - The `rpcEndpointDegraded` event payload.
|
|
162
|
+
*/
|
|
163
|
+
function trackRpcServiceDegraded(messenger, analyticsOptions, payload) {
|
|
164
|
+
trackRpcServiceEvent(messenger, analyticsOptions, payload.error, () => buildRpcServiceDegradedAnalyticsTrackingEvent(payload, analyticsOptions.isRpcEndpointUrlPublic));
|
|
165
|
+
}
|
|
166
|
+
exports.trackRpcServiceDegraded = trackRpcServiceDegraded;
|
|
167
|
+
//# sourceMappingURL=rpc-service-analytics.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"rpc-service-analytics.cjs","sourceRoot":"","sources":["../src/rpc-service-analytics.ts"],"names":[],"mappings":"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","sourcesContent":["import type { AnalyticsTrackingEvent } from '@metamask/analytics-controller';\nimport { generateDeterministicRandomNumber } from '@metamask/remote-feature-flag-controller';\nimport type { Hex, Json } from '@metamask/utils';\nimport {\n hasProperty,\n hexToNumber,\n isObject,\n isValidJson,\n wrapError,\n} from '@metamask/utils';\n\nimport type {\n NetworkControllerMessenger,\n NetworkControllerRpcEndpointDegradedEvent,\n NetworkControllerRpcEndpointUnavailableEvent,\n} from './NetworkController';\nimport { isConnectionError } from './rpc-service/rpc-service';\n\ntype RpcEndpointUnavailablePayload =\n NetworkControllerRpcEndpointUnavailableEvent['payload'][0];\n\ntype RpcEndpointDegradedPayload =\n NetworkControllerRpcEndpointDegradedEvent['payload'][0];\n\n/**\n * The names of the analytics events that {@link NetworkController} emits when an\n * RPC endpoint becomes unavailable or degraded.\n */\nexport type RpcServiceEventName =\n | 'RPC Service Unavailable'\n | 'RPC Service Degraded';\n\n/**\n * Configuration that enables {@link NetworkController} to emit analytics events\n * for unavailable or degraded RPC endpoints.\n *\n * The pieces here are client-specific and cannot be derived inside the\n * controller: deciding whether an endpoint URL is safe to report depends on the\n * client's lists of known networks, and the sample rate depends on the client's\n * build environment.\n */\nexport type NetworkControllerAnalyticsOptions = {\n /**\n * Returns `true` if the given RPC endpoint URL is safe to report verbatim (a\n * \"public\" endpoint), or `false` if it must be reported as the literal string\n * `'custom'` to avoid leaking private servers.\n */\n isRpcEndpointUrlPublic: (endpointUrl: string) => boolean;\n /**\n * The proportion of events to emit, between 0 and 1. `1` emits every event,\n * `0` emits none. Clients typically use a small value (e.g. `0.01`) in\n * production to stay within their analytics quota, and `1` in development.\n */\n rpcServiceEventsSampleRate: number;\n};\n\n/**\n * Hides any API key contained in an RPC endpoint URL by reducing it to its\n * host, but only when the endpoint is considered public. Non-public endpoints\n * (and URLs that cannot be parsed) are reported as the literal string\n * `'custom'`.\n *\n * @param endpointUrl - The URL of the RPC endpoint.\n * @param isPublic - Whether the endpoint is safe to report verbatim.\n * @returns The sanitized value to report.\n */\nexport function sanitizeRpcEndpointUrl(\n endpointUrl: string,\n isPublic: boolean,\n): string {\n if (!isPublic) {\n return 'custom';\n }\n\n try {\n return new URL(endpointUrl).host;\n } catch {\n return 'custom';\n }\n}\n\n/**\n * Wraps a name and properties into the shape expected by the\n * `AnalyticsController:trackEvent` action.\n *\n * @param name - The analytics event name.\n * @param properties - The analytics event properties.\n * @returns The analytics tracking event.\n */\nfunction toAnalyticsTrackingEvent(\n name: RpcServiceEventName,\n properties: Record<string, Json>,\n): AnalyticsTrackingEvent {\n return {\n name,\n properties,\n sensitiveProperties: {},\n saveDataRecording: false,\n hasProperties: Object.keys(properties).length > 0,\n };\n}\n\n/**\n * Builds the properties common to both RPC service events.\n *\n * @param args - The arguments.\n * @param args.chainId - The chain ID that the endpoint represents.\n * @param args.endpointUrl - The URL of the endpoint.\n * @param args.error - The connection or response error encountered.\n * @param args.isRpcEndpointUrlPublic - Returns whether the endpoint URL is safe\n * to report verbatim.\n * @returns The common analytics event properties.\n */\nfunction buildCommonRpcServiceEventProperties({\n chainId,\n endpointUrl,\n error,\n isRpcEndpointUrlPublic,\n}: {\n chainId: Hex;\n endpointUrl: string;\n error: unknown;\n isRpcEndpointUrlPublic: (endpointUrl: string) => boolean;\n}): Record<string, Json> {\n const sanitizedUrl = sanitizeRpcEndpointUrl(\n endpointUrl,\n isRpcEndpointUrlPublic(endpointUrl),\n );\n\n // The names of analytics properties have a particular case.\n return {\n chain_id_caip: `eip155:${hexToNumber(chainId)}`,\n rpc_domain: sanitizedUrl,\n rpc_endpoint_url: sanitizedUrl, // @deprecated - Will be removed in a future release.\n ...(isObject(error) &&\n hasProperty(error, 'httpStatus') &&\n isValidJson(error.httpStatus)\n ? { http_status: error.httpStatus }\n : {}),\n };\n}\n\n/**\n * Builds the \"RPC Service Unavailable\" analytics tracking event.\n *\n * @param payload - The `rpcEndpointUnavailable` event payload.\n * @param isRpcEndpointUrlPublic - Returns whether the endpoint URL is safe to\n * report verbatim.\n * @returns The analytics tracking event.\n */\nexport function buildRpcServiceUnavailableAnalyticsTrackingEvent(\n payload: RpcEndpointUnavailablePayload,\n isRpcEndpointUrlPublic: (endpointUrl: string) => boolean,\n): AnalyticsTrackingEvent {\n return toAnalyticsTrackingEvent(\n 'RPC Service Unavailable',\n buildCommonRpcServiceEventProperties({\n chainId: payload.chainId,\n endpointUrl: payload.endpointUrl,\n error: payload.error,\n isRpcEndpointUrlPublic,\n }),\n );\n}\n\n/**\n * Builds the \"RPC Service Degraded\" analytics tracking event.\n *\n * @param payload - The `rpcEndpointDegraded` event payload.\n * @param isRpcEndpointUrlPublic - Returns whether the endpoint URL is safe to\n * report verbatim.\n * @returns The analytics tracking event.\n */\nexport function buildRpcServiceDegradedAnalyticsTrackingEvent(\n payload: RpcEndpointDegradedPayload,\n isRpcEndpointUrlPublic: (endpointUrl: string) => boolean,\n): AnalyticsTrackingEvent {\n const { duration, retryReason, rpcMethodName, traceId, type } = payload;\n\n // The names of analytics properties have a particular case.\n return toAnalyticsTrackingEvent('RPC Service Degraded', {\n ...buildCommonRpcServiceEventProperties({\n chainId: payload.chainId,\n endpointUrl: payload.endpointUrl,\n error: payload.error,\n isRpcEndpointUrlPublic,\n }),\n rpc_method_name: rpcMethodName,\n type,\n ...(retryReason ? { retry_reason: retryReason } : {}),\n ...(duration === undefined ? {} : { duration_ms: duration }),\n ...(traceId === undefined ? {} : { trace_id: traceId }),\n });\n}\n\n/**\n * Delivers an RPC service analytics event via the\n * `AnalyticsController:trackEvent` action, skipping local connection errors,\n * users without an analytics ID, and events that fall outside the configured\n * sample. Failures never propagate to the caller.\n *\n * @param messenger - The controller messenger.\n * @param analyticsOptions - The analytics configuration.\n * @param error - The error encountered, used to skip local connection errors.\n * @param buildTrackingEvent - Builds the event to deliver (only called when the\n * event passes the sampling and analytics-ID checks).\n */\nfunction trackRpcServiceEvent(\n messenger: NetworkControllerMessenger,\n analyticsOptions: NetworkControllerAnalyticsOptions,\n error: unknown,\n buildTrackingEvent: () => AnalyticsTrackingEvent,\n): void {\n try {\n if (isConnectionError(error)) {\n return;\n }\n\n const { analyticsId } = messenger.call('AnalyticsController:getState');\n if (!analyticsId) {\n return;\n }\n\n if (\n generateDeterministicRandomNumber(analyticsId) >=\n analyticsOptions.rpcServiceEventsSampleRate\n ) {\n return;\n }\n\n messenger.call('AnalyticsController:trackEvent', buildTrackingEvent());\n } catch (caughtError) {\n messenger.captureException?.(\n wrapError(caughtError, 'Could not create analytics event'),\n );\n }\n}\n\n/**\n * Emits an \"RPC Service Unavailable\" analytics event.\n *\n * @param messenger - The controller messenger.\n * @param analyticsOptions - The analytics configuration.\n * @param payload - The `rpcEndpointUnavailable` event payload.\n */\nexport function trackRpcServiceUnavailable(\n messenger: NetworkControllerMessenger,\n analyticsOptions: NetworkControllerAnalyticsOptions,\n payload: RpcEndpointUnavailablePayload,\n): void {\n trackRpcServiceEvent(messenger, analyticsOptions, payload.error, () =>\n buildRpcServiceUnavailableAnalyticsTrackingEvent(\n payload,\n analyticsOptions.isRpcEndpointUrlPublic,\n ),\n );\n}\n\n/**\n * Emits an \"RPC Service Degraded\" analytics event.\n *\n * @param messenger - The controller messenger.\n * @param analyticsOptions - The analytics configuration.\n * @param payload - The `rpcEndpointDegraded` event payload.\n */\nexport function trackRpcServiceDegraded(\n messenger: NetworkControllerMessenger,\n analyticsOptions: NetworkControllerAnalyticsOptions,\n payload: RpcEndpointDegradedPayload,\n): void {\n trackRpcServiceEvent(messenger, analyticsOptions, payload.error, () =>\n buildRpcServiceDegradedAnalyticsTrackingEvent(\n payload,\n analyticsOptions.isRpcEndpointUrlPublic,\n ),\n );\n}\n"]}
|
|
@@ -0,0 +1,79 @@
|
|
|
1
|
+
import type { AnalyticsTrackingEvent } from "@metamask/analytics-controller";
|
|
2
|
+
import type { NetworkControllerMessenger, NetworkControllerRpcEndpointDegradedEvent, NetworkControllerRpcEndpointUnavailableEvent } from "./NetworkController.cjs";
|
|
3
|
+
type RpcEndpointUnavailablePayload = NetworkControllerRpcEndpointUnavailableEvent['payload'][0];
|
|
4
|
+
type RpcEndpointDegradedPayload = NetworkControllerRpcEndpointDegradedEvent['payload'][0];
|
|
5
|
+
/**
|
|
6
|
+
* The names of the analytics events that {@link NetworkController} emits when an
|
|
7
|
+
* RPC endpoint becomes unavailable or degraded.
|
|
8
|
+
*/
|
|
9
|
+
export type RpcServiceEventName = 'RPC Service Unavailable' | 'RPC Service Degraded';
|
|
10
|
+
/**
|
|
11
|
+
* Configuration that enables {@link NetworkController} to emit analytics events
|
|
12
|
+
* for unavailable or degraded RPC endpoints.
|
|
13
|
+
*
|
|
14
|
+
* The pieces here are client-specific and cannot be derived inside the
|
|
15
|
+
* controller: deciding whether an endpoint URL is safe to report depends on the
|
|
16
|
+
* client's lists of known networks, and the sample rate depends on the client's
|
|
17
|
+
* build environment.
|
|
18
|
+
*/
|
|
19
|
+
export type NetworkControllerAnalyticsOptions = {
|
|
20
|
+
/**
|
|
21
|
+
* Returns `true` if the given RPC endpoint URL is safe to report verbatim (a
|
|
22
|
+
* "public" endpoint), or `false` if it must be reported as the literal string
|
|
23
|
+
* `'custom'` to avoid leaking private servers.
|
|
24
|
+
*/
|
|
25
|
+
isRpcEndpointUrlPublic: (endpointUrl: string) => boolean;
|
|
26
|
+
/**
|
|
27
|
+
* The proportion of events to emit, between 0 and 1. `1` emits every event,
|
|
28
|
+
* `0` emits none. Clients typically use a small value (e.g. `0.01`) in
|
|
29
|
+
* production to stay within their analytics quota, and `1` in development.
|
|
30
|
+
*/
|
|
31
|
+
rpcServiceEventsSampleRate: number;
|
|
32
|
+
};
|
|
33
|
+
/**
|
|
34
|
+
* Hides any API key contained in an RPC endpoint URL by reducing it to its
|
|
35
|
+
* host, but only when the endpoint is considered public. Non-public endpoints
|
|
36
|
+
* (and URLs that cannot be parsed) are reported as the literal string
|
|
37
|
+
* `'custom'`.
|
|
38
|
+
*
|
|
39
|
+
* @param endpointUrl - The URL of the RPC endpoint.
|
|
40
|
+
* @param isPublic - Whether the endpoint is safe to report verbatim.
|
|
41
|
+
* @returns The sanitized value to report.
|
|
42
|
+
*/
|
|
43
|
+
export declare function sanitizeRpcEndpointUrl(endpointUrl: string, isPublic: boolean): string;
|
|
44
|
+
/**
|
|
45
|
+
* Builds the "RPC Service Unavailable" analytics tracking event.
|
|
46
|
+
*
|
|
47
|
+
* @param payload - The `rpcEndpointUnavailable` event payload.
|
|
48
|
+
* @param isRpcEndpointUrlPublic - Returns whether the endpoint URL is safe to
|
|
49
|
+
* report verbatim.
|
|
50
|
+
* @returns The analytics tracking event.
|
|
51
|
+
*/
|
|
52
|
+
export declare function buildRpcServiceUnavailableAnalyticsTrackingEvent(payload: RpcEndpointUnavailablePayload, isRpcEndpointUrlPublic: (endpointUrl: string) => boolean): AnalyticsTrackingEvent;
|
|
53
|
+
/**
|
|
54
|
+
* Builds the "RPC Service Degraded" analytics tracking event.
|
|
55
|
+
*
|
|
56
|
+
* @param payload - The `rpcEndpointDegraded` event payload.
|
|
57
|
+
* @param isRpcEndpointUrlPublic - Returns whether the endpoint URL is safe to
|
|
58
|
+
* report verbatim.
|
|
59
|
+
* @returns The analytics tracking event.
|
|
60
|
+
*/
|
|
61
|
+
export declare function buildRpcServiceDegradedAnalyticsTrackingEvent(payload: RpcEndpointDegradedPayload, isRpcEndpointUrlPublic: (endpointUrl: string) => boolean): AnalyticsTrackingEvent;
|
|
62
|
+
/**
|
|
63
|
+
* Emits an "RPC Service Unavailable" analytics event.
|
|
64
|
+
*
|
|
65
|
+
* @param messenger - The controller messenger.
|
|
66
|
+
* @param analyticsOptions - The analytics configuration.
|
|
67
|
+
* @param payload - The `rpcEndpointUnavailable` event payload.
|
|
68
|
+
*/
|
|
69
|
+
export declare function trackRpcServiceUnavailable(messenger: NetworkControllerMessenger, analyticsOptions: NetworkControllerAnalyticsOptions, payload: RpcEndpointUnavailablePayload): void;
|
|
70
|
+
/**
|
|
71
|
+
* Emits an "RPC Service Degraded" analytics event.
|
|
72
|
+
*
|
|
73
|
+
* @param messenger - The controller messenger.
|
|
74
|
+
* @param analyticsOptions - The analytics configuration.
|
|
75
|
+
* @param payload - The `rpcEndpointDegraded` event payload.
|
|
76
|
+
*/
|
|
77
|
+
export declare function trackRpcServiceDegraded(messenger: NetworkControllerMessenger, analyticsOptions: NetworkControllerAnalyticsOptions, payload: RpcEndpointDegradedPayload): void;
|
|
78
|
+
export {};
|
|
79
|
+
//# sourceMappingURL=rpc-service-analytics.d.cts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"rpc-service-analytics.d.cts","sourceRoot":"","sources":["../src/rpc-service-analytics.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,sBAAsB,EAAE,uCAAuC;AAW7E,OAAO,KAAK,EACV,0BAA0B,EAC1B,yCAAyC,EACzC,4CAA4C,EAC7C,gCAA4B;AAG7B,KAAK,6BAA6B,GAChC,4CAA4C,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC;AAE7D,KAAK,0BAA0B,GAC7B,yCAAyC,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC;AAE1D;;;GAGG;AACH,MAAM,MAAM,mBAAmB,GAC3B,yBAAyB,GACzB,sBAAsB,CAAC;AAE3B;;;;;;;;GAQG;AACH,MAAM,MAAM,iCAAiC,GAAG;IAC9C;;;;OAIG;IACH,sBAAsB,EAAE,CAAC,WAAW,EAAE,MAAM,KAAK,OAAO,CAAC;IACzD;;;;OAIG;IACH,0BAA0B,EAAE,MAAM,CAAC;CACpC,CAAC;AAEF;;;;;;;;;GASG;AACH,wBAAgB,sBAAsB,CACpC,WAAW,EAAE,MAAM,EACnB,QAAQ,EAAE,OAAO,GAChB,MAAM,CAUR;AA+DD;;;;;;;GAOG;AACH,wBAAgB,gDAAgD,CAC9D,OAAO,EAAE,6BAA6B,EACtC,sBAAsB,EAAE,CAAC,WAAW,EAAE,MAAM,KAAK,OAAO,GACvD,sBAAsB,CAUxB;AAED;;;;;;;GAOG;AACH,wBAAgB,6CAA6C,CAC3D,OAAO,EAAE,0BAA0B,EACnC,sBAAsB,EAAE,CAAC,WAAW,EAAE,MAAM,KAAK,OAAO,GACvD,sBAAsB,CAiBxB;AA6CD;;;;;;GAMG;AACH,wBAAgB,0BAA0B,CACxC,SAAS,EAAE,0BAA0B,EACrC,gBAAgB,EAAE,iCAAiC,EACnD,OAAO,EAAE,6BAA6B,GACrC,IAAI,CAON;AAED;;;;;;GAMG;AACH,wBAAgB,uBAAuB,CACrC,SAAS,EAAE,0BAA0B,EACrC,gBAAgB,EAAE,iCAAiC,EACnD,OAAO,EAAE,0BAA0B,GAClC,IAAI,CAON"}
|
|
@@ -0,0 +1,79 @@
|
|
|
1
|
+
import type { AnalyticsTrackingEvent } from "@metamask/analytics-controller";
|
|
2
|
+
import type { NetworkControllerMessenger, NetworkControllerRpcEndpointDegradedEvent, NetworkControllerRpcEndpointUnavailableEvent } from "./NetworkController.mjs";
|
|
3
|
+
type RpcEndpointUnavailablePayload = NetworkControllerRpcEndpointUnavailableEvent['payload'][0];
|
|
4
|
+
type RpcEndpointDegradedPayload = NetworkControllerRpcEndpointDegradedEvent['payload'][0];
|
|
5
|
+
/**
|
|
6
|
+
* The names of the analytics events that {@link NetworkController} emits when an
|
|
7
|
+
* RPC endpoint becomes unavailable or degraded.
|
|
8
|
+
*/
|
|
9
|
+
export type RpcServiceEventName = 'RPC Service Unavailable' | 'RPC Service Degraded';
|
|
10
|
+
/**
|
|
11
|
+
* Configuration that enables {@link NetworkController} to emit analytics events
|
|
12
|
+
* for unavailable or degraded RPC endpoints.
|
|
13
|
+
*
|
|
14
|
+
* The pieces here are client-specific and cannot be derived inside the
|
|
15
|
+
* controller: deciding whether an endpoint URL is safe to report depends on the
|
|
16
|
+
* client's lists of known networks, and the sample rate depends on the client's
|
|
17
|
+
* build environment.
|
|
18
|
+
*/
|
|
19
|
+
export type NetworkControllerAnalyticsOptions = {
|
|
20
|
+
/**
|
|
21
|
+
* Returns `true` if the given RPC endpoint URL is safe to report verbatim (a
|
|
22
|
+
* "public" endpoint), or `false` if it must be reported as the literal string
|
|
23
|
+
* `'custom'` to avoid leaking private servers.
|
|
24
|
+
*/
|
|
25
|
+
isRpcEndpointUrlPublic: (endpointUrl: string) => boolean;
|
|
26
|
+
/**
|
|
27
|
+
* The proportion of events to emit, between 0 and 1. `1` emits every event,
|
|
28
|
+
* `0` emits none. Clients typically use a small value (e.g. `0.01`) in
|
|
29
|
+
* production to stay within their analytics quota, and `1` in development.
|
|
30
|
+
*/
|
|
31
|
+
rpcServiceEventsSampleRate: number;
|
|
32
|
+
};
|
|
33
|
+
/**
|
|
34
|
+
* Hides any API key contained in an RPC endpoint URL by reducing it to its
|
|
35
|
+
* host, but only when the endpoint is considered public. Non-public endpoints
|
|
36
|
+
* (and URLs that cannot be parsed) are reported as the literal string
|
|
37
|
+
* `'custom'`.
|
|
38
|
+
*
|
|
39
|
+
* @param endpointUrl - The URL of the RPC endpoint.
|
|
40
|
+
* @param isPublic - Whether the endpoint is safe to report verbatim.
|
|
41
|
+
* @returns The sanitized value to report.
|
|
42
|
+
*/
|
|
43
|
+
export declare function sanitizeRpcEndpointUrl(endpointUrl: string, isPublic: boolean): string;
|
|
44
|
+
/**
|
|
45
|
+
* Builds the "RPC Service Unavailable" analytics tracking event.
|
|
46
|
+
*
|
|
47
|
+
* @param payload - The `rpcEndpointUnavailable` event payload.
|
|
48
|
+
* @param isRpcEndpointUrlPublic - Returns whether the endpoint URL is safe to
|
|
49
|
+
* report verbatim.
|
|
50
|
+
* @returns The analytics tracking event.
|
|
51
|
+
*/
|
|
52
|
+
export declare function buildRpcServiceUnavailableAnalyticsTrackingEvent(payload: RpcEndpointUnavailablePayload, isRpcEndpointUrlPublic: (endpointUrl: string) => boolean): AnalyticsTrackingEvent;
|
|
53
|
+
/**
|
|
54
|
+
* Builds the "RPC Service Degraded" analytics tracking event.
|
|
55
|
+
*
|
|
56
|
+
* @param payload - The `rpcEndpointDegraded` event payload.
|
|
57
|
+
* @param isRpcEndpointUrlPublic - Returns whether the endpoint URL is safe to
|
|
58
|
+
* report verbatim.
|
|
59
|
+
* @returns The analytics tracking event.
|
|
60
|
+
*/
|
|
61
|
+
export declare function buildRpcServiceDegradedAnalyticsTrackingEvent(payload: RpcEndpointDegradedPayload, isRpcEndpointUrlPublic: (endpointUrl: string) => boolean): AnalyticsTrackingEvent;
|
|
62
|
+
/**
|
|
63
|
+
* Emits an "RPC Service Unavailable" analytics event.
|
|
64
|
+
*
|
|
65
|
+
* @param messenger - The controller messenger.
|
|
66
|
+
* @param analyticsOptions - The analytics configuration.
|
|
67
|
+
* @param payload - The `rpcEndpointUnavailable` event payload.
|
|
68
|
+
*/
|
|
69
|
+
export declare function trackRpcServiceUnavailable(messenger: NetworkControllerMessenger, analyticsOptions: NetworkControllerAnalyticsOptions, payload: RpcEndpointUnavailablePayload): void;
|
|
70
|
+
/**
|
|
71
|
+
* Emits an "RPC Service Degraded" analytics event.
|
|
72
|
+
*
|
|
73
|
+
* @param messenger - The controller messenger.
|
|
74
|
+
* @param analyticsOptions - The analytics configuration.
|
|
75
|
+
* @param payload - The `rpcEndpointDegraded` event payload.
|
|
76
|
+
*/
|
|
77
|
+
export declare function trackRpcServiceDegraded(messenger: NetworkControllerMessenger, analyticsOptions: NetworkControllerAnalyticsOptions, payload: RpcEndpointDegradedPayload): void;
|
|
78
|
+
export {};
|
|
79
|
+
//# sourceMappingURL=rpc-service-analytics.d.mts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"rpc-service-analytics.d.mts","sourceRoot":"","sources":["../src/rpc-service-analytics.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,sBAAsB,EAAE,uCAAuC;AAW7E,OAAO,KAAK,EACV,0BAA0B,EAC1B,yCAAyC,EACzC,4CAA4C,EAC7C,gCAA4B;AAG7B,KAAK,6BAA6B,GAChC,4CAA4C,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC;AAE7D,KAAK,0BAA0B,GAC7B,yCAAyC,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC;AAE1D;;;GAGG;AACH,MAAM,MAAM,mBAAmB,GAC3B,yBAAyB,GACzB,sBAAsB,CAAC;AAE3B;;;;;;;;GAQG;AACH,MAAM,MAAM,iCAAiC,GAAG;IAC9C;;;;OAIG;IACH,sBAAsB,EAAE,CAAC,WAAW,EAAE,MAAM,KAAK,OAAO,CAAC;IACzD;;;;OAIG;IACH,0BAA0B,EAAE,MAAM,CAAC;CACpC,CAAC;AAEF;;;;;;;;;GASG;AACH,wBAAgB,sBAAsB,CACpC,WAAW,EAAE,MAAM,EACnB,QAAQ,EAAE,OAAO,GAChB,MAAM,CAUR;AA+DD;;;;;;;GAOG;AACH,wBAAgB,gDAAgD,CAC9D,OAAO,EAAE,6BAA6B,EACtC,sBAAsB,EAAE,CAAC,WAAW,EAAE,MAAM,KAAK,OAAO,GACvD,sBAAsB,CAUxB;AAED;;;;;;;GAOG;AACH,wBAAgB,6CAA6C,CAC3D,OAAO,EAAE,0BAA0B,EACnC,sBAAsB,EAAE,CAAC,WAAW,EAAE,MAAM,KAAK,OAAO,GACvD,sBAAsB,CAiBxB;AA6CD;;;;;;GAMG;AACH,wBAAgB,0BAA0B,CACxC,SAAS,EAAE,0BAA0B,EACrC,gBAAgB,EAAE,iCAAiC,EACnD,OAAO,EAAE,6BAA6B,GACrC,IAAI,CAON;AAED;;;;;;GAMG;AACH,wBAAgB,uBAAuB,CACrC,SAAS,EAAE,0BAA0B,EACrC,gBAAgB,EAAE,iCAAiC,EACnD,OAAO,EAAE,0BAA0B,GAClC,IAAI,CAON"}
|
|
@@ -0,0 +1,159 @@
|
|
|
1
|
+
import { generateDeterministicRandomNumber } from "@metamask/remote-feature-flag-controller";
|
|
2
|
+
import { hasProperty, hexToNumber, isObject, isValidJson, wrapError } from "@metamask/utils";
|
|
3
|
+
import { isConnectionError } from "./rpc-service/rpc-service.mjs";
|
|
4
|
+
/**
|
|
5
|
+
* Hides any API key contained in an RPC endpoint URL by reducing it to its
|
|
6
|
+
* host, but only when the endpoint is considered public. Non-public endpoints
|
|
7
|
+
* (and URLs that cannot be parsed) are reported as the literal string
|
|
8
|
+
* `'custom'`.
|
|
9
|
+
*
|
|
10
|
+
* @param endpointUrl - The URL of the RPC endpoint.
|
|
11
|
+
* @param isPublic - Whether the endpoint is safe to report verbatim.
|
|
12
|
+
* @returns The sanitized value to report.
|
|
13
|
+
*/
|
|
14
|
+
export function sanitizeRpcEndpointUrl(endpointUrl, isPublic) {
|
|
15
|
+
if (!isPublic) {
|
|
16
|
+
return 'custom';
|
|
17
|
+
}
|
|
18
|
+
try {
|
|
19
|
+
return new URL(endpointUrl).host;
|
|
20
|
+
}
|
|
21
|
+
catch {
|
|
22
|
+
return 'custom';
|
|
23
|
+
}
|
|
24
|
+
}
|
|
25
|
+
/**
|
|
26
|
+
* Wraps a name and properties into the shape expected by the
|
|
27
|
+
* `AnalyticsController:trackEvent` action.
|
|
28
|
+
*
|
|
29
|
+
* @param name - The analytics event name.
|
|
30
|
+
* @param properties - The analytics event properties.
|
|
31
|
+
* @returns The analytics tracking event.
|
|
32
|
+
*/
|
|
33
|
+
function toAnalyticsTrackingEvent(name, properties) {
|
|
34
|
+
return {
|
|
35
|
+
name,
|
|
36
|
+
properties,
|
|
37
|
+
sensitiveProperties: {},
|
|
38
|
+
saveDataRecording: false,
|
|
39
|
+
hasProperties: Object.keys(properties).length > 0,
|
|
40
|
+
};
|
|
41
|
+
}
|
|
42
|
+
/**
|
|
43
|
+
* Builds the properties common to both RPC service events.
|
|
44
|
+
*
|
|
45
|
+
* @param args - The arguments.
|
|
46
|
+
* @param args.chainId - The chain ID that the endpoint represents.
|
|
47
|
+
* @param args.endpointUrl - The URL of the endpoint.
|
|
48
|
+
* @param args.error - The connection or response error encountered.
|
|
49
|
+
* @param args.isRpcEndpointUrlPublic - Returns whether the endpoint URL is safe
|
|
50
|
+
* to report verbatim.
|
|
51
|
+
* @returns The common analytics event properties.
|
|
52
|
+
*/
|
|
53
|
+
function buildCommonRpcServiceEventProperties({ chainId, endpointUrl, error, isRpcEndpointUrlPublic, }) {
|
|
54
|
+
const sanitizedUrl = sanitizeRpcEndpointUrl(endpointUrl, isRpcEndpointUrlPublic(endpointUrl));
|
|
55
|
+
// The names of analytics properties have a particular case.
|
|
56
|
+
return {
|
|
57
|
+
chain_id_caip: `eip155:${hexToNumber(chainId)}`,
|
|
58
|
+
rpc_domain: sanitizedUrl,
|
|
59
|
+
rpc_endpoint_url: sanitizedUrl, // @deprecated - Will be removed in a future release.
|
|
60
|
+
...(isObject(error) &&
|
|
61
|
+
hasProperty(error, 'httpStatus') &&
|
|
62
|
+
isValidJson(error.httpStatus)
|
|
63
|
+
? { http_status: error.httpStatus }
|
|
64
|
+
: {}),
|
|
65
|
+
};
|
|
66
|
+
}
|
|
67
|
+
/**
|
|
68
|
+
* Builds the "RPC Service Unavailable" analytics tracking event.
|
|
69
|
+
*
|
|
70
|
+
* @param payload - The `rpcEndpointUnavailable` event payload.
|
|
71
|
+
* @param isRpcEndpointUrlPublic - Returns whether the endpoint URL is safe to
|
|
72
|
+
* report verbatim.
|
|
73
|
+
* @returns The analytics tracking event.
|
|
74
|
+
*/
|
|
75
|
+
export function buildRpcServiceUnavailableAnalyticsTrackingEvent(payload, isRpcEndpointUrlPublic) {
|
|
76
|
+
return toAnalyticsTrackingEvent('RPC Service Unavailable', buildCommonRpcServiceEventProperties({
|
|
77
|
+
chainId: payload.chainId,
|
|
78
|
+
endpointUrl: payload.endpointUrl,
|
|
79
|
+
error: payload.error,
|
|
80
|
+
isRpcEndpointUrlPublic,
|
|
81
|
+
}));
|
|
82
|
+
}
|
|
83
|
+
/**
|
|
84
|
+
* Builds the "RPC Service Degraded" analytics tracking event.
|
|
85
|
+
*
|
|
86
|
+
* @param payload - The `rpcEndpointDegraded` event payload.
|
|
87
|
+
* @param isRpcEndpointUrlPublic - Returns whether the endpoint URL is safe to
|
|
88
|
+
* report verbatim.
|
|
89
|
+
* @returns The analytics tracking event.
|
|
90
|
+
*/
|
|
91
|
+
export function buildRpcServiceDegradedAnalyticsTrackingEvent(payload, isRpcEndpointUrlPublic) {
|
|
92
|
+
const { duration, retryReason, rpcMethodName, traceId, type } = payload;
|
|
93
|
+
// The names of analytics properties have a particular case.
|
|
94
|
+
return toAnalyticsTrackingEvent('RPC Service Degraded', {
|
|
95
|
+
...buildCommonRpcServiceEventProperties({
|
|
96
|
+
chainId: payload.chainId,
|
|
97
|
+
endpointUrl: payload.endpointUrl,
|
|
98
|
+
error: payload.error,
|
|
99
|
+
isRpcEndpointUrlPublic,
|
|
100
|
+
}),
|
|
101
|
+
rpc_method_name: rpcMethodName,
|
|
102
|
+
type,
|
|
103
|
+
...(retryReason ? { retry_reason: retryReason } : {}),
|
|
104
|
+
...(duration === undefined ? {} : { duration_ms: duration }),
|
|
105
|
+
...(traceId === undefined ? {} : { trace_id: traceId }),
|
|
106
|
+
});
|
|
107
|
+
}
|
|
108
|
+
/**
|
|
109
|
+
* Delivers an RPC service analytics event via the
|
|
110
|
+
* `AnalyticsController:trackEvent` action, skipping local connection errors,
|
|
111
|
+
* users without an analytics ID, and events that fall outside the configured
|
|
112
|
+
* sample. Failures never propagate to the caller.
|
|
113
|
+
*
|
|
114
|
+
* @param messenger - The controller messenger.
|
|
115
|
+
* @param analyticsOptions - The analytics configuration.
|
|
116
|
+
* @param error - The error encountered, used to skip local connection errors.
|
|
117
|
+
* @param buildTrackingEvent - Builds the event to deliver (only called when the
|
|
118
|
+
* event passes the sampling and analytics-ID checks).
|
|
119
|
+
*/
|
|
120
|
+
function trackRpcServiceEvent(messenger, analyticsOptions, error, buildTrackingEvent) {
|
|
121
|
+
try {
|
|
122
|
+
if (isConnectionError(error)) {
|
|
123
|
+
return;
|
|
124
|
+
}
|
|
125
|
+
const { analyticsId } = messenger.call('AnalyticsController:getState');
|
|
126
|
+
if (!analyticsId) {
|
|
127
|
+
return;
|
|
128
|
+
}
|
|
129
|
+
if (generateDeterministicRandomNumber(analyticsId) >=
|
|
130
|
+
analyticsOptions.rpcServiceEventsSampleRate) {
|
|
131
|
+
return;
|
|
132
|
+
}
|
|
133
|
+
messenger.call('AnalyticsController:trackEvent', buildTrackingEvent());
|
|
134
|
+
}
|
|
135
|
+
catch (caughtError) {
|
|
136
|
+
messenger.captureException?.(wrapError(caughtError, 'Could not create analytics event'));
|
|
137
|
+
}
|
|
138
|
+
}
|
|
139
|
+
/**
|
|
140
|
+
* Emits an "RPC Service Unavailable" analytics event.
|
|
141
|
+
*
|
|
142
|
+
* @param messenger - The controller messenger.
|
|
143
|
+
* @param analyticsOptions - The analytics configuration.
|
|
144
|
+
* @param payload - The `rpcEndpointUnavailable` event payload.
|
|
145
|
+
*/
|
|
146
|
+
export function trackRpcServiceUnavailable(messenger, analyticsOptions, payload) {
|
|
147
|
+
trackRpcServiceEvent(messenger, analyticsOptions, payload.error, () => buildRpcServiceUnavailableAnalyticsTrackingEvent(payload, analyticsOptions.isRpcEndpointUrlPublic));
|
|
148
|
+
}
|
|
149
|
+
/**
|
|
150
|
+
* Emits an "RPC Service Degraded" analytics event.
|
|
151
|
+
*
|
|
152
|
+
* @param messenger - The controller messenger.
|
|
153
|
+
* @param analyticsOptions - The analytics configuration.
|
|
154
|
+
* @param payload - The `rpcEndpointDegraded` event payload.
|
|
155
|
+
*/
|
|
156
|
+
export function trackRpcServiceDegraded(messenger, analyticsOptions, payload) {
|
|
157
|
+
trackRpcServiceEvent(messenger, analyticsOptions, payload.error, () => buildRpcServiceDegradedAnalyticsTrackingEvent(payload, analyticsOptions.isRpcEndpointUrlPublic));
|
|
158
|
+
}
|
|
159
|
+
//# sourceMappingURL=rpc-service-analytics.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"rpc-service-analytics.mjs","sourceRoot":"","sources":["../src/rpc-service-analytics.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,iCAAiC,EAAE,iDAAiD;AAE7F,OAAO,EACL,WAAW,EACX,WAAW,EACX,QAAQ,EACR,WAAW,EACX,SAAS,EACV,wBAAwB;AAOzB,OAAO,EAAE,iBAAiB,EAAE,sCAAkC;AAwC9D;;;;;;;;;GASG;AACH,MAAM,UAAU,sBAAsB,CACpC,WAAmB,EACnB,QAAiB;IAEjB,IAAI,CAAC,QAAQ,EAAE,CAAC;QACd,OAAO,QAAQ,CAAC;IAClB,CAAC;IAED,IAAI,CAAC;QACH,OAAO,IAAI,GAAG,CAAC,WAAW,CAAC,CAAC,IAAI,CAAC;IACnC,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,QAAQ,CAAC;IAClB,CAAC;AACH,CAAC;AAED;;;;;;;GAOG;AACH,SAAS,wBAAwB,CAC/B,IAAyB,EACzB,UAAgC;IAEhC,OAAO;QACL,IAAI;QACJ,UAAU;QACV,mBAAmB,EAAE,EAAE;QACvB,iBAAiB,EAAE,KAAK;QACxB,aAAa,EAAE,MAAM,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC,MAAM,GAAG,CAAC;KAClD,CAAC;AACJ,CAAC;AAED;;;;;;;;;;GAUG;AACH,SAAS,oCAAoC,CAAC,EAC5C,OAAO,EACP,WAAW,EACX,KAAK,EACL,sBAAsB,GAMvB;IACC,MAAM,YAAY,GAAG,sBAAsB,CACzC,WAAW,EACX,sBAAsB,CAAC,WAAW,CAAC,CACpC,CAAC;IAEF,4DAA4D;IAC5D,OAAO;QACL,aAAa,EAAE,UAAU,WAAW,CAAC,OAAO,CAAC,EAAE;QAC/C,UAAU,EAAE,YAAY;QACxB,gBAAgB,EAAE,YAAY,EAAE,qDAAqD;QACrF,GAAG,CAAC,QAAQ,CAAC,KAAK,CAAC;YACnB,WAAW,CAAC,KAAK,EAAE,YAAY,CAAC;YAChC,WAAW,CAAC,KAAK,CAAC,UAAU,CAAC;YAC3B,CAAC,CAAC,EAAE,WAAW,EAAE,KAAK,CAAC,UAAU,EAAE;YACnC,CAAC,CAAC,EAAE,CAAC;KACR,CAAC;AACJ,CAAC;AAED;;;;;;;GAOG;AACH,MAAM,UAAU,gDAAgD,CAC9D,OAAsC,EACtC,sBAAwD;IAExD,OAAO,wBAAwB,CAC7B,yBAAyB,EACzB,oCAAoC,CAAC;QACnC,OAAO,EAAE,OAAO,CAAC,OAAO;QACxB,WAAW,EAAE,OAAO,CAAC,WAAW;QAChC,KAAK,EAAE,OAAO,CAAC,KAAK;QACpB,sBAAsB;KACvB,CAAC,CACH,CAAC;AACJ,CAAC;AAED;;;;;;;GAOG;AACH,MAAM,UAAU,6CAA6C,CAC3D,OAAmC,EACnC,sBAAwD;IAExD,MAAM,EAAE,QAAQ,EAAE,WAAW,EAAE,aAAa,EAAE,OAAO,EAAE,IAAI,EAAE,GAAG,OAAO,CAAC;IAExE,4DAA4D;IAC5D,OAAO,wBAAwB,CAAC,sBAAsB,EAAE;QACtD,GAAG,oCAAoC,CAAC;YACtC,OAAO,EAAE,OAAO,CAAC,OAAO;YACxB,WAAW,EAAE,OAAO,CAAC,WAAW;YAChC,KAAK,EAAE,OAAO,CAAC,KAAK;YACpB,sBAAsB;SACvB,CAAC;QACF,eAAe,EAAE,aAAa;QAC9B,IAAI;QACJ,GAAG,CAAC,WAAW,CAAC,CAAC,CAAC,EAAE,YAAY,EAAE,WAAW,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QACrD,GAAG,CAAC,QAAQ,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,WAAW,EAAE,QAAQ,EAAE,CAAC;QAC5D,GAAG,CAAC,OAAO,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,QAAQ,EAAE,OAAO,EAAE,CAAC;KACxD,CAAC,CAAC;AACL,CAAC;AAED;;;;;;;;;;;GAWG;AACH,SAAS,oBAAoB,CAC3B,SAAqC,EACrC,gBAAmD,EACnD,KAAc,EACd,kBAAgD;IAEhD,IAAI,CAAC;QACH,IAAI,iBAAiB,CAAC,KAAK,CAAC,EAAE,CAAC;YAC7B,OAAO;QACT,CAAC;QAED,MAAM,EAAE,WAAW,EAAE,GAAG,SAAS,CAAC,IAAI,CAAC,8BAA8B,CAAC,CAAC;QACvE,IAAI,CAAC,WAAW,EAAE,CAAC;YACjB,OAAO;QACT,CAAC;QAED,IACE,iCAAiC,CAAC,WAAW,CAAC;YAC9C,gBAAgB,CAAC,0BAA0B,EAC3C,CAAC;YACD,OAAO;QACT,CAAC;QAED,SAAS,CAAC,IAAI,CAAC,gCAAgC,EAAE,kBAAkB,EAAE,CAAC,CAAC;IACzE,CAAC;IAAC,OAAO,WAAW,EAAE,CAAC;QACrB,SAAS,CAAC,gBAAgB,EAAE,CAC1B,SAAS,CAAC,WAAW,EAAE,kCAAkC,CAAC,CAC3D,CAAC;IACJ,CAAC;AACH,CAAC;AAED;;;;;;GAMG;AACH,MAAM,UAAU,0BAA0B,CACxC,SAAqC,EACrC,gBAAmD,EACnD,OAAsC;IAEtC,oBAAoB,CAAC,SAAS,EAAE,gBAAgB,EAAE,OAAO,CAAC,KAAK,EAAE,GAAG,EAAE,CACpE,gDAAgD,CAC9C,OAAO,EACP,gBAAgB,CAAC,sBAAsB,CACxC,CACF,CAAC;AACJ,CAAC;AAED;;;;;;GAMG;AACH,MAAM,UAAU,uBAAuB,CACrC,SAAqC,EACrC,gBAAmD,EACnD,OAAmC;IAEnC,oBAAoB,CAAC,SAAS,EAAE,gBAAgB,EAAE,OAAO,CAAC,KAAK,EAAE,GAAG,EAAE,CACpE,6CAA6C,CAC3C,OAAO,EACP,gBAAgB,CAAC,sBAAsB,CACxC,CACF,CAAC;AACJ,CAAC","sourcesContent":["import type { AnalyticsTrackingEvent } from '@metamask/analytics-controller';\nimport { generateDeterministicRandomNumber } from '@metamask/remote-feature-flag-controller';\nimport type { Hex, Json } from '@metamask/utils';\nimport {\n hasProperty,\n hexToNumber,\n isObject,\n isValidJson,\n wrapError,\n} from '@metamask/utils';\n\nimport type {\n NetworkControllerMessenger,\n NetworkControllerRpcEndpointDegradedEvent,\n NetworkControllerRpcEndpointUnavailableEvent,\n} from './NetworkController';\nimport { isConnectionError } from './rpc-service/rpc-service';\n\ntype RpcEndpointUnavailablePayload =\n NetworkControllerRpcEndpointUnavailableEvent['payload'][0];\n\ntype RpcEndpointDegradedPayload =\n NetworkControllerRpcEndpointDegradedEvent['payload'][0];\n\n/**\n * The names of the analytics events that {@link NetworkController} emits when an\n * RPC endpoint becomes unavailable or degraded.\n */\nexport type RpcServiceEventName =\n | 'RPC Service Unavailable'\n | 'RPC Service Degraded';\n\n/**\n * Configuration that enables {@link NetworkController} to emit analytics events\n * for unavailable or degraded RPC endpoints.\n *\n * The pieces here are client-specific and cannot be derived inside the\n * controller: deciding whether an endpoint URL is safe to report depends on the\n * client's lists of known networks, and the sample rate depends on the client's\n * build environment.\n */\nexport type NetworkControllerAnalyticsOptions = {\n /**\n * Returns `true` if the given RPC endpoint URL is safe to report verbatim (a\n * \"public\" endpoint), or `false` if it must be reported as the literal string\n * `'custom'` to avoid leaking private servers.\n */\n isRpcEndpointUrlPublic: (endpointUrl: string) => boolean;\n /**\n * The proportion of events to emit, between 0 and 1. `1` emits every event,\n * `0` emits none. Clients typically use a small value (e.g. `0.01`) in\n * production to stay within their analytics quota, and `1` in development.\n */\n rpcServiceEventsSampleRate: number;\n};\n\n/**\n * Hides any API key contained in an RPC endpoint URL by reducing it to its\n * host, but only when the endpoint is considered public. Non-public endpoints\n * (and URLs that cannot be parsed) are reported as the literal string\n * `'custom'`.\n *\n * @param endpointUrl - The URL of the RPC endpoint.\n * @param isPublic - Whether the endpoint is safe to report verbatim.\n * @returns The sanitized value to report.\n */\nexport function sanitizeRpcEndpointUrl(\n endpointUrl: string,\n isPublic: boolean,\n): string {\n if (!isPublic) {\n return 'custom';\n }\n\n try {\n return new URL(endpointUrl).host;\n } catch {\n return 'custom';\n }\n}\n\n/**\n * Wraps a name and properties into the shape expected by the\n * `AnalyticsController:trackEvent` action.\n *\n * @param name - The analytics event name.\n * @param properties - The analytics event properties.\n * @returns The analytics tracking event.\n */\nfunction toAnalyticsTrackingEvent(\n name: RpcServiceEventName,\n properties: Record<string, Json>,\n): AnalyticsTrackingEvent {\n return {\n name,\n properties,\n sensitiveProperties: {},\n saveDataRecording: false,\n hasProperties: Object.keys(properties).length > 0,\n };\n}\n\n/**\n * Builds the properties common to both RPC service events.\n *\n * @param args - The arguments.\n * @param args.chainId - The chain ID that the endpoint represents.\n * @param args.endpointUrl - The URL of the endpoint.\n * @param args.error - The connection or response error encountered.\n * @param args.isRpcEndpointUrlPublic - Returns whether the endpoint URL is safe\n * to report verbatim.\n * @returns The common analytics event properties.\n */\nfunction buildCommonRpcServiceEventProperties({\n chainId,\n endpointUrl,\n error,\n isRpcEndpointUrlPublic,\n}: {\n chainId: Hex;\n endpointUrl: string;\n error: unknown;\n isRpcEndpointUrlPublic: (endpointUrl: string) => boolean;\n}): Record<string, Json> {\n const sanitizedUrl = sanitizeRpcEndpointUrl(\n endpointUrl,\n isRpcEndpointUrlPublic(endpointUrl),\n );\n\n // The names of analytics properties have a particular case.\n return {\n chain_id_caip: `eip155:${hexToNumber(chainId)}`,\n rpc_domain: sanitizedUrl,\n rpc_endpoint_url: sanitizedUrl, // @deprecated - Will be removed in a future release.\n ...(isObject(error) &&\n hasProperty(error, 'httpStatus') &&\n isValidJson(error.httpStatus)\n ? { http_status: error.httpStatus }\n : {}),\n };\n}\n\n/**\n * Builds the \"RPC Service Unavailable\" analytics tracking event.\n *\n * @param payload - The `rpcEndpointUnavailable` event payload.\n * @param isRpcEndpointUrlPublic - Returns whether the endpoint URL is safe to\n * report verbatim.\n * @returns The analytics tracking event.\n */\nexport function buildRpcServiceUnavailableAnalyticsTrackingEvent(\n payload: RpcEndpointUnavailablePayload,\n isRpcEndpointUrlPublic: (endpointUrl: string) => boolean,\n): AnalyticsTrackingEvent {\n return toAnalyticsTrackingEvent(\n 'RPC Service Unavailable',\n buildCommonRpcServiceEventProperties({\n chainId: payload.chainId,\n endpointUrl: payload.endpointUrl,\n error: payload.error,\n isRpcEndpointUrlPublic,\n }),\n );\n}\n\n/**\n * Builds the \"RPC Service Degraded\" analytics tracking event.\n *\n * @param payload - The `rpcEndpointDegraded` event payload.\n * @param isRpcEndpointUrlPublic - Returns whether the endpoint URL is safe to\n * report verbatim.\n * @returns The analytics tracking event.\n */\nexport function buildRpcServiceDegradedAnalyticsTrackingEvent(\n payload: RpcEndpointDegradedPayload,\n isRpcEndpointUrlPublic: (endpointUrl: string) => boolean,\n): AnalyticsTrackingEvent {\n const { duration, retryReason, rpcMethodName, traceId, type } = payload;\n\n // The names of analytics properties have a particular case.\n return toAnalyticsTrackingEvent('RPC Service Degraded', {\n ...buildCommonRpcServiceEventProperties({\n chainId: payload.chainId,\n endpointUrl: payload.endpointUrl,\n error: payload.error,\n isRpcEndpointUrlPublic,\n }),\n rpc_method_name: rpcMethodName,\n type,\n ...(retryReason ? { retry_reason: retryReason } : {}),\n ...(duration === undefined ? {} : { duration_ms: duration }),\n ...(traceId === undefined ? {} : { trace_id: traceId }),\n });\n}\n\n/**\n * Delivers an RPC service analytics event via the\n * `AnalyticsController:trackEvent` action, skipping local connection errors,\n * users without an analytics ID, and events that fall outside the configured\n * sample. Failures never propagate to the caller.\n *\n * @param messenger - The controller messenger.\n * @param analyticsOptions - The analytics configuration.\n * @param error - The error encountered, used to skip local connection errors.\n * @param buildTrackingEvent - Builds the event to deliver (only called when the\n * event passes the sampling and analytics-ID checks).\n */\nfunction trackRpcServiceEvent(\n messenger: NetworkControllerMessenger,\n analyticsOptions: NetworkControllerAnalyticsOptions,\n error: unknown,\n buildTrackingEvent: () => AnalyticsTrackingEvent,\n): void {\n try {\n if (isConnectionError(error)) {\n return;\n }\n\n const { analyticsId } = messenger.call('AnalyticsController:getState');\n if (!analyticsId) {\n return;\n }\n\n if (\n generateDeterministicRandomNumber(analyticsId) >=\n analyticsOptions.rpcServiceEventsSampleRate\n ) {\n return;\n }\n\n messenger.call('AnalyticsController:trackEvent', buildTrackingEvent());\n } catch (caughtError) {\n messenger.captureException?.(\n wrapError(caughtError, 'Could not create analytics event'),\n );\n }\n}\n\n/**\n * Emits an \"RPC Service Unavailable\" analytics event.\n *\n * @param messenger - The controller messenger.\n * @param analyticsOptions - The analytics configuration.\n * @param payload - The `rpcEndpointUnavailable` event payload.\n */\nexport function trackRpcServiceUnavailable(\n messenger: NetworkControllerMessenger,\n analyticsOptions: NetworkControllerAnalyticsOptions,\n payload: RpcEndpointUnavailablePayload,\n): void {\n trackRpcServiceEvent(messenger, analyticsOptions, payload.error, () =>\n buildRpcServiceUnavailableAnalyticsTrackingEvent(\n payload,\n analyticsOptions.isRpcEndpointUrlPublic,\n ),\n );\n}\n\n/**\n * Emits an \"RPC Service Degraded\" analytics event.\n *\n * @param messenger - The controller messenger.\n * @param analyticsOptions - The analytics configuration.\n * @param payload - The `rpcEndpointDegraded` event payload.\n */\nexport function trackRpcServiceDegraded(\n messenger: NetworkControllerMessenger,\n analyticsOptions: NetworkControllerAnalyticsOptions,\n payload: RpcEndpointDegradedPayload,\n): void {\n trackRpcServiceEvent(messenger, analyticsOptions, payload.error, () =>\n buildRpcServiceDegradedAnalyticsTrackingEvent(\n payload,\n analyticsOptions.isRpcEndpointUrlPublic,\n ),\n );\n}\n"]}
|