diff --git a/packages/eth-json-rpc-middleware/CHANGELOG.md b/packages/eth-json-rpc-middleware/CHANGELOG.md index 893803340bb..cf62a038508 100644 --- a/packages/eth-json-rpc-middleware/CHANGELOG.md +++ b/packages/eth-json-rpc-middleware/CHANGELOG.md @@ -7,21 +7,27 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ## [Unreleased] +### Added + +- Add new function `providerAsMiddlewareV2` for converting an `InternalProvider` into a `JsonRpcEngine` v2-compatible middleware ([#7138](https://github.com/MetaMask/core/pull/7138)) + ### Changed -- **BREAKING:** Migrate to `JsonRpcEngineV2` ([#7065](https://github.com/MetaMask/core/pull/7065)) - - Migrates all middleware from `JsonRpcEngine` to `JsonRpcEngineV2`. - - Signatures of various middleware dependencies, e.g. `processTransaction` of `createWalletMiddleware`, have changed - and must be updated by consumers. - - Be advised that request objects are now deeply frozen, and cannot be mutated. +- **BREAKING:** Migrate all middleware from `JsonRpcEngine` to `JsonRpcEngineV2` ([#7065](https://github.com/MetaMask/core/pull/7065)) - To continue using this package with the legacy `JsonRpcEngine`, use the `asLegacyMiddleware` backwards compatibility function. +- **BREAKING:** Change the signatures of hooks for `createWalletMiddleware` ([#7065](https://github.com/MetaMask/core/pull/7065)) + - To wit: + - `getAccounts` takes an origin argument (`string`) instead of a `JsonRpcRequest` + - `processDecryptMessage` and `processEncryptionPublicKey` take a `MessageRequest` from `@metamask/message-manager` instead of `JsonRpcRequest` + - `processPersonalMessage`, `processTransaction`, `processSignTransaction`, `processTypedMessage`, `processTypedMessageV3` and `processTypedMessageV4` take a `context` as the third argument, before any other arguments + - Be advised that request objects are now deeply frozen, and cannot be mutated. - **BREAKING:** Use `InternalProvider` instead of `SafeEventEmitterProvider` ([#6796](https://github.com/MetaMask/core/pull/6796)) - Wherever a `SafeEventEmitterProvider` was expected, an `InternalProvider` is now expected instead. - **BREAKING:** Stop retrying `undefined` results for methods that include a block tag parameter ([#7001](https://github.com/MetaMask/core/pull/7001)) - The `retryOnEmpty` middleware will now throw an error if it encounters an `undefined` result when dispatching a request with a later block number than the originally requested block number. - In practice, this should happen rarely if ever. -- Migrate all uses of `interface` to `type` ([#6885](https://github.com/MetaMask/core/pull/6885)) +- **BREAKING:** Migrate all uses of `interface` to `type` ([#6885](https://github.com/MetaMask/core/pull/6885)) ## [21.0.0] diff --git a/packages/eth-json-rpc-middleware/src/inflight-cache.ts b/packages/eth-json-rpc-middleware/src/inflight-cache.ts index c488cc80bbf..0786d9b1224 100644 --- a/packages/eth-json-rpc-middleware/src/inflight-cache.ts +++ b/packages/eth-json-rpc-middleware/src/inflight-cache.ts @@ -11,7 +11,10 @@ import { import { projectLogger, createModuleLogger } from './logging-utils'; import { cacheIdentifierForRequest } from './utils/cache'; -type RequestHandler = [(result: Json) => void, (error: Error) => void]; +type RequestHandler = [ + (result: Readonly) => void, + (error: unknown) => void, +]; type InflightRequest = { [cacheId: string]: RequestHandler[]; @@ -64,7 +67,7 @@ export function createInflightCacheMiddleware(): JsonRpcMiddleware< // allow request to be handled normally log('Carrying original request forward %o', request); try { - const result = (await next()) as Json; + const result = (await next()) as Readonly; log( 'Running %i collected handler(s) for successful request %o', activeRequestHandlers.length, @@ -78,7 +81,7 @@ export function createInflightCacheMiddleware(): JsonRpcMiddleware< activeRequestHandlers.length, request, ); - runRequestHandlers({ error: error as Error }, activeRequestHandlers); + runRequestHandlers({ error }, activeRequestHandlers); throw error; } finally { delete inflightRequests[cacheId]; @@ -94,11 +97,11 @@ export function createInflightCacheMiddleware(): JsonRpcMiddleware< */ function createActiveRequestHandler( activeRequestHandlers: RequestHandler[], -): Promise { - const { resolve, promise, reject } = createDeferredPromise(); +): Promise> { + const { resolve, promise, reject } = createDeferredPromise>(); activeRequestHandlers.push([ - (result: Json) => resolve(result), - (error: Error) => reject(error), + (result: Readonly) => resolve(result), + (error: unknown) => reject(error), ]); return promise; } @@ -110,7 +113,7 @@ function createActiveRequestHandler( * @param activeRequestHandlers - The active request handlers. */ function runRequestHandlers( - resultOrError: { result: Json } | { error: Error }, + resultOrError: { result: Readonly } | { error: unknown }, activeRequestHandlers: RequestHandler[], ): void { // use setTimeout so we can handle the original request first diff --git a/packages/message-manager/CHANGELOG.md b/packages/message-manager/CHANGELOG.md index ece5141f53f..438feece4f8 100644 --- a/packages/message-manager/CHANGELOG.md +++ b/packages/message-manager/CHANGELOG.md @@ -11,6 +11,11 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 - Rename `OriginalRequest` type to `MessageRequest` and permit string `id` values ([#7065](https://github.com/MetaMask/core/pull/7065)) - Previously, only number values were permitted for the `id` property. + - `OriginalRequest` is kept for backward compatibility. + +### Deprecated + +- Deprecate `OriginalRequest`; use `MessageRequest` instead ([#7138](https://github.com/MetaMask/core/pull/7138)) ## [14.0.0] diff --git a/packages/message-manager/src/AbstractMessageManager.ts b/packages/message-manager/src/AbstractMessageManager.ts index 86fff7f5ba8..38ed9acd424 100644 --- a/packages/message-manager/src/AbstractMessageManager.ts +++ b/packages/message-manager/src/AbstractMessageManager.ts @@ -45,6 +45,13 @@ export type MessageRequest = { securityAlertResponse?: Record; }; +/** + * Represents the request adding a message. + * + * @deprecated Please use `MessageRequest` instead. + */ +export type OriginalRequest = MessageRequest; + /** * @type AbstractMessage * diff --git a/packages/network-controller/CHANGELOG.md b/packages/network-controller/CHANGELOG.md index 754630d8fde..86ecfae5f2e 100644 --- a/packages/network-controller/CHANGELOG.md +++ b/packages/network-controller/CHANGELOG.md @@ -19,6 +19,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 - In practice, this should happen rarely if ever. - **BREAKING:** Migrate `NetworkClient` to `JsonRpcEngineV2` ([#7065](https://github.com/MetaMask/core/pull/7065)) - This ought to be unobservable, but we mark it as breaking out of an abundance of caution. +- **BREAKING:** Update signature of `request` in `AbstractRpcService` and `RpcServiceRequestable` so that the JSON-RPC request must be frozen ([#7138](https://github.com/MetaMask/core/pull/7138)) - Bump `@metamask/controller-utils` from `^11.14.1` to `^11.15.0` ([#7003](https://github.com/MetaMask/core/pull/7003)) ### Fixed diff --git a/packages/network-controller/src/rpc-service/rpc-service-chain.ts b/packages/network-controller/src/rpc-service/rpc-service-chain.ts index 1a1204f64cb..f8e04a69dbc 100644 --- a/packages/network-controller/src/rpc-service/rpc-service-chain.ts +++ b/packages/network-controller/src/rpc-service/rpc-service-chain.ts @@ -106,7 +106,9 @@ export class RpcServiceChain implements RpcServiceRequestable { * @throws A "parse" error if the response is not valid JSON. */ async request( - jsonRpcRequest: JsonRpcRequest & { method: 'eth_getBlockByNumber' }, + jsonRpcRequest: Readonly> & { + method: 'eth_getBlockByNumber'; + }, fetchOptions?: FetchOptions, ): Promise | JsonRpcResponse>; @@ -129,12 +131,12 @@ export class RpcServiceChain implements RpcServiceRequestable { * @throws A "parse" error if the response is not valid JSON. */ async request( - jsonRpcRequest: JsonRpcRequest, + jsonRpcRequest: Readonly>, fetchOptions?: FetchOptions, ): Promise>; async request( - jsonRpcRequest: JsonRpcRequest, + jsonRpcRequest: Readonly>, fetchOptions: FetchOptions = {}, ): Promise> { return this.#services[0].request(jsonRpcRequest, fetchOptions); diff --git a/packages/network-controller/src/rpc-service/rpc-service-requestable.ts b/packages/network-controller/src/rpc-service/rpc-service-requestable.ts index 20cbbb1c972..c3dbcb4a495 100644 --- a/packages/network-controller/src/rpc-service/rpc-service-requestable.ts +++ b/packages/network-controller/src/rpc-service/rpc-service-requestable.ts @@ -62,7 +62,7 @@ export type RpcServiceRequestable = { * Makes a request to the target. */ request( - jsonRpcRequest: JsonRpcRequest, + jsonRpcRequest: Readonly>, fetchOptions?: FetchOptions, ): Promise>; };