@metamask-previews/multichain-api-middleware 4.0.3-preview-3866c0ff1 → 4.0.3-preview-e3275932a

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 (107) hide show
  1. package/CHANGELOG.md +0 -4
  2. package/dist/handlers/index.cjs +20 -0
  3. package/dist/handlers/index.cjs.map +1 -0
  4. package/dist/handlers/index.d.cts +25 -0
  5. package/dist/handlers/index.d.cts.map +1 -0
  6. package/dist/handlers/index.d.mts +25 -0
  7. package/dist/handlers/index.d.mts.map +1 -0
  8. package/dist/handlers/{index.js → index.mjs} +5 -5
  9. package/dist/handlers/index.mjs.map +1 -0
  10. package/dist/handlers/types.cjs +13 -0
  11. package/dist/handlers/types.cjs.map +1 -0
  12. package/dist/handlers/{types.d.ts → types.d.cts} +5 -5
  13. package/dist/handlers/types.d.cts.map +1 -0
  14. package/dist/handlers/types.d.mts +27 -0
  15. package/dist/handlers/types.d.mts.map +1 -0
  16. package/dist/handlers/{types.js → types.mjs} +2 -1
  17. package/dist/handlers/types.mjs.map +1 -0
  18. package/dist/handlers/wallet-createSession.cjs +179 -0
  19. package/dist/handlers/wallet-createSession.cjs.map +1 -0
  20. package/dist/handlers/{wallet-createSession.d.ts → wallet-createSession.d.cts} +9 -9
  21. package/dist/handlers/wallet-createSession.d.cts.map +1 -0
  22. package/dist/handlers/wallet-createSession.d.mts +70 -0
  23. package/dist/handlers/wallet-createSession.d.mts.map +1 -0
  24. package/dist/handlers/{wallet-createSession.js → wallet-createSession.mjs} +6 -6
  25. package/dist/handlers/wallet-createSession.mjs.map +1 -0
  26. package/dist/handlers/wallet-getSession.cjs +54 -0
  27. package/dist/handlers/wallet-getSession.cjs.map +1 -0
  28. package/dist/handlers/{wallet-getSession.d.ts → wallet-getSession.d.cts} +5 -5
  29. package/dist/handlers/wallet-getSession.d.cts.map +1 -0
  30. package/dist/handlers/wallet-getSession.d.mts +43 -0
  31. package/dist/handlers/wallet-getSession.d.mts.map +1 -0
  32. package/dist/handlers/{wallet-getSession.js → wallet-getSession.mjs} +2 -2
  33. package/dist/handlers/wallet-getSession.mjs.map +1 -0
  34. package/dist/handlers/wallet-invokeMethod.cjs +103 -0
  35. package/dist/handlers/wallet-invokeMethod.cjs.map +1 -0
  36. package/dist/handlers/{wallet-invokeMethod.d.ts → wallet-invokeMethod.d.cts} +7 -7
  37. package/dist/handlers/wallet-invokeMethod.d.cts.map +1 -0
  38. package/dist/handlers/wallet-invokeMethod.d.mts +57 -0
  39. package/dist/handlers/wallet-invokeMethod.d.mts.map +1 -0
  40. package/dist/handlers/{wallet-invokeMethod.js → wallet-invokeMethod.mjs} +4 -4
  41. package/dist/handlers/wallet-invokeMethod.mjs.map +1 -0
  42. package/dist/handlers/wallet-revokeSession.cjs +106 -0
  43. package/dist/handlers/wallet-revokeSession.cjs.map +1 -0
  44. package/dist/handlers/{wallet-revokeSession.d.ts → wallet-revokeSession.d.cts} +6 -6
  45. package/dist/handlers/wallet-revokeSession.d.cts.map +1 -0
  46. package/dist/handlers/wallet-revokeSession.d.mts +45 -0
  47. package/dist/handlers/wallet-revokeSession.d.mts.map +1 -0
  48. package/dist/handlers/{wallet-revokeSession.js → wallet-revokeSession.mjs} +5 -5
  49. package/dist/handlers/wallet-revokeSession.mjs.map +1 -0
  50. package/dist/index.cjs +14 -0
  51. package/dist/index.cjs.map +1 -0
  52. package/dist/index.d.cts +7 -0
  53. package/dist/index.d.cts.map +1 -0
  54. package/dist/index.d.mts +7 -0
  55. package/dist/index.d.mts.map +1 -0
  56. package/dist/index.mjs +6 -0
  57. package/dist/index.mjs.map +1 -0
  58. package/dist/middlewares/MultichainMiddlewareManager.cjs +110 -0
  59. package/dist/middlewares/MultichainMiddlewareManager.cjs.map +1 -0
  60. package/dist/middlewares/{MultichainMiddlewareManager.d.ts → MultichainMiddlewareManager.d.cts} +4 -4
  61. package/dist/middlewares/MultichainMiddlewareManager.d.cts.map +1 -0
  62. package/dist/middlewares/MultichainMiddlewareManager.d.mts +35 -0
  63. package/dist/middlewares/MultichainMiddlewareManager.d.mts.map +1 -0
  64. package/dist/middlewares/MultichainMiddlewareManager.mjs +106 -0
  65. package/dist/middlewares/MultichainMiddlewareManager.mjs.map +1 -0
  66. package/dist/middlewares/MultichainSubscriptionManager.cjs +118 -0
  67. package/dist/middlewares/MultichainSubscriptionManager.cjs.map +1 -0
  68. package/dist/middlewares/{MultichainSubscriptionManager.d.ts → MultichainSubscriptionManager.d.cts} +6 -6
  69. package/dist/middlewares/MultichainSubscriptionManager.d.cts.map +1 -0
  70. package/dist/middlewares/MultichainSubscriptionManager.d.mts +49 -0
  71. package/dist/middlewares/MultichainSubscriptionManager.d.mts.map +1 -0
  72. package/dist/middlewares/MultichainSubscriptionManager.mjs +118 -0
  73. package/dist/middlewares/MultichainSubscriptionManager.mjs.map +1 -0
  74. package/dist/middlewares/multichainMethodCallValidatorMiddleware.cjs +74 -0
  75. package/dist/middlewares/multichainMethodCallValidatorMiddleware.cjs.map +1 -0
  76. package/dist/middlewares/{multichainMethodCallValidatorMiddleware.d.ts → multichainMethodCallValidatorMiddleware.d.cts} +2 -2
  77. package/dist/middlewares/multichainMethodCallValidatorMiddleware.d.cts.map +1 -0
  78. package/dist/middlewares/multichainMethodCallValidatorMiddleware.d.mts +7 -0
  79. package/dist/middlewares/multichainMethodCallValidatorMiddleware.d.mts.map +1 -0
  80. package/dist/middlewares/{multichainMethodCallValidatorMiddleware.js → multichainMethodCallValidatorMiddleware.mjs} +15 -8
  81. package/dist/middlewares/multichainMethodCallValidatorMiddleware.mjs.map +1 -0
  82. package/package.json +17 -13
  83. package/dist/handlers/index.d.ts +0 -25
  84. package/dist/handlers/index.d.ts.map +0 -1
  85. package/dist/handlers/index.js.map +0 -1
  86. package/dist/handlers/types.d.ts.map +0 -1
  87. package/dist/handlers/types.js.map +0 -1
  88. package/dist/handlers/wallet-createSession.d.ts.map +0 -1
  89. package/dist/handlers/wallet-createSession.js.map +0 -1
  90. package/dist/handlers/wallet-getSession.d.ts.map +0 -1
  91. package/dist/handlers/wallet-getSession.js.map +0 -1
  92. package/dist/handlers/wallet-invokeMethod.d.ts.map +0 -1
  93. package/dist/handlers/wallet-invokeMethod.js.map +0 -1
  94. package/dist/handlers/wallet-revokeSession.d.ts.map +0 -1
  95. package/dist/handlers/wallet-revokeSession.js.map +0 -1
  96. package/dist/index.d.ts +0 -7
  97. package/dist/index.d.ts.map +0 -1
  98. package/dist/index.js +0 -6
  99. package/dist/index.js.map +0 -1
  100. package/dist/middlewares/MultichainMiddlewareManager.d.ts.map +0 -1
  101. package/dist/middlewares/MultichainMiddlewareManager.js +0 -93
  102. package/dist/middlewares/MultichainMiddlewareManager.js.map +0 -1
  103. package/dist/middlewares/MultichainSubscriptionManager.d.ts.map +0 -1
  104. package/dist/middlewares/MultichainSubscriptionManager.js +0 -100
  105. package/dist/middlewares/MultichainSubscriptionManager.js.map +0 -1
  106. package/dist/middlewares/multichainMethodCallValidatorMiddleware.d.ts.map +0 -1
  107. package/dist/middlewares/multichainMethodCallValidatorMiddleware.js.map +0 -1
@@ -1 +0,0 @@
1
- {"version":3,"file":"wallet-revokeSession.d.ts","sourceRoot":"","sources":["../../src/handlers/wallet-revokeSession.ts"],"names":[],"mappings":"AAMA,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,qCAAqC,CAAC;AAC7E,OAAO,KAAK,EACV,wBAAwB,EACxB,yBAAyB,EACzB,aAAa,EACd,MAAM,2BAA2B,CAAC;AACnC,OAAO,EAEL,2BAA2B,EAG5B,MAAM,iCAAiC,CAAC;AAGzC,OAAO,KAAK,EACV,IAAI,EACJ,cAAc,EACd,sBAAsB,EACvB,MAAM,iBAAiB,CAAC;AAEzB,OAAO,KAAK,EAAgB,sBAAsB,EAAE,MAAM,YAAY,CAAC;AAEvE,MAAM,MAAM,wBAAwB,GAAG,sBAAsB,GAAG;IAC9D,yBAAyB,EAAE,CACzB,cAAc,EAAE,MAAM,KACnB,UAAU,CAAC,2BAA2B,CAAC,mBAAmB,CAAC,CAAC,CAAC;IAClE,YAAY,EAAE,CACZ,MAAM,EAAE,MAAM,EACd,UAAU,EAAE,MAAM,EAClB,WAAW,EAAE,iBAAiB,KAC3B,UAAU,CAAC,2BAA2B,CAAC,cAAc,CAAC,CAAC,CAAC;CAC9D,CAAC;AAEF,KAAK,yBAAyB,GAAG;IAAE,MAAM,CAAC,EAAE,MAAM,EAAE,CAAA;CAAE,CAAC;AAiFvD;;;;;;;;;;;;;;;;GAgBG;AACH,iBAAe,yBAAyB,CACtC,OAAO,EAAE,cAAc,CAAC,yBAAyB,CAAC,GAAG;IAAE,MAAM,EAAE,MAAM,CAAA;CAAE,EACvE,QAAQ,EAAE,sBAAsB,CAAC,IAAI,CAAC,EACtC,KAAK,EAAE,yBAAyB,EAChC,GAAG,EAAE,wBAAwB,EAC7B,KAAK,EAAE,wBAAwB,iBAiBhC;AAED,MAAM,MAAM,0BAA0B,GAAG,aAAa,CACpD,wBAAwB,EACxB,KAAK,EACL,yBAAyB,EACzB,IAAI,EACJ;IAAE,MAAM,EAAE,MAAM,CAAA;CAAE,CACnB,CAAC;AAEF,eAAO,MAAM,0BAA0B;;;;;;;CAOD,CAAC"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"wallet-revokeSession.js","sourceRoot":"","sources":["../../src/handlers/wallet-revokeSession.ts"],"names":[],"mappings":"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","sourcesContent":["import {\n Caip25CaveatMutators,\n Caip25CaveatType,\n Caip25EndowmentPermissionName,\n getCaipAccountIdsFromCaip25CaveatValue,\n} from '@metamask/chain-agnostic-permission';\nimport type { Caip25CaveatValue } from '@metamask/chain-agnostic-permission';\nimport type {\n JsonRpcEngineEndCallback,\n JsonRpcEngineNextCallback,\n MethodHandler,\n} from '@metamask/json-rpc-engine';\nimport {\n CaveatMutatorOperation,\n GenericPermissionController,\n PermissionDoesNotExistError,\n UnrecognizedSubjectError,\n} from '@metamask/permission-controller';\nimport { rpcErrors } from '@metamask/rpc-errors';\nimport { isObject } from '@metamask/utils';\nimport type {\n Json,\n JsonRpcRequest,\n PendingJsonRpcResponse,\n} from '@metamask/utils';\n\nimport type { Caip25Caveat, GetCaveatForOriginHook } from './types.js';\n\nexport type WalletRevokeSessionHooks = GetCaveatForOriginHook & {\n revokePermissionForOrigin: (\n permissionName: string,\n ) => ReturnType<GenericPermissionController['revokePermissions']>;\n updateCaveat: (\n target: string,\n caveatType: string,\n caveatValue: Caip25CaveatValue,\n ) => ReturnType<GenericPermissionController['updateCaveat']>;\n};\n\ntype WalletRevokeSessionParams = { scopes?: string[] };\n\n/**\n * Check whether the given error is a permission error.\n *\n * @param error - The error to check.\n * @returns Whether the error is a permission error.\n */\nfunction isPermissionError(error: unknown) {\n if (\n !isObject(error) ||\n !('name' in error) ||\n typeof error.name !== 'string'\n ) {\n return false;\n }\n\n return [\n UnrecognizedSubjectError.name,\n PermissionDoesNotExistError.name,\n ].includes(error.name);\n}\n\n/**\n * Revokes specific session scopes from an existing caveat.\n * Fully revokes permission if no accounts remain permitted after iterating through scopes.\n *\n * @param scopes - Array of scope strings to remove from the caveat.\n * @param hooks - The hooks object.\n * @param hooks.revokePermissionForOrigin - The hook for revoking a permission for an origin function.\n * @param hooks.updateCaveat - The hook used to conditionally update the caveat rather than fully revoke the permission.\n * @param hooks.getCaveatForOrigin - The hook to fetch an existing caveat for the origin of the request.\n */\nfunction partialRevokePermissions(\n scopes: string[],\n hooks: WalletRevokeSessionHooks,\n) {\n const caveat = hooks.getCaveatForOrigin(\n Caip25EndowmentPermissionName,\n Caip25CaveatType,\n ) as Caip25Caveat | undefined;\n if (!caveat) {\n return;\n }\n\n let updatedCaveatValue = caveat.value;\n\n for (const scopeString of scopes) {\n const result = Caip25CaveatMutators[Caip25CaveatType].removeScope(\n updatedCaveatValue,\n scopeString,\n );\n\n // If operation is a Noop, it means a scope was passed that was not present in the permission, so we proceed with the loop\n if (result.operation === CaveatMutatorOperation.Noop) {\n continue;\n }\n\n updatedCaveatValue = result?.value ?? {\n requiredScopes: {},\n optionalScopes: {},\n sessionProperties: {},\n isMultichainOrigin: true,\n };\n }\n\n const caipAccountIds =\n getCaipAccountIdsFromCaip25CaveatValue(updatedCaveatValue);\n\n // We fully revoke permission if no accounts are left after scope removal loop.\n if (!caipAccountIds.length) {\n hooks.revokePermissionForOrigin(Caip25EndowmentPermissionName);\n } else {\n hooks.updateCaveat(\n Caip25EndowmentPermissionName,\n Caip25CaveatType,\n updatedCaveatValue,\n );\n }\n}\n\n/**\n * Handler for the `wallet_revokeSession` RPC method as specified by [CAIP-285](https://chainagnostic.org/CAIPs/caip-285).\n * The implementation below deviates from the linked spec in that it ignores the `sessionId` param\n * and instead revokes the singular session for the origin if available. Additionally,\n * the handler also does not return an error if there is currently no active session and instead\n * returns true which is the same result returned if an active session was actually revoked.\n *\n * @param request - The JSON-RPC request object. Unused.\n * @param response - The JSON-RPC response object.\n * @param _next - The next middleware function. Unused.\n * @param end - The end callback function.\n * @param hooks - The hooks object.\n * @param hooks.revokePermissionForOrigin - The hook for revoking a permission for an origin function.\n * @param hooks.updateCaveat - The hook used to conditionally update the caveat rather than fully revoke the permission.\n * @param hooks.getCaveatForOrigin - The hook to fetch an existing caveat for the origin of the request.\n * @returns Nothing.\n */\nasync function handleWalletRevokeSession(\n request: JsonRpcRequest<WalletRevokeSessionParams> & { origin: string },\n response: PendingJsonRpcResponse<Json>,\n _next: JsonRpcEngineNextCallback,\n end: JsonRpcEngineEndCallback,\n hooks: WalletRevokeSessionHooks,\n) {\n try {\n if (request.params?.scopes?.length) {\n partialRevokePermissions(request.params.scopes, hooks);\n } else {\n hooks.revokePermissionForOrigin(Caip25EndowmentPermissionName);\n }\n } catch (err) {\n if (!isPermissionError(err)) {\n console.error(err);\n return end(rpcErrors.internal());\n }\n }\n\n response.result = true;\n return end();\n}\n\nexport type WalletRevokeSessionHandler = MethodHandler<\n WalletRevokeSessionHooks,\n never,\n WalletRevokeSessionParams,\n Json,\n { origin: string }\n>;\n\nexport const walletRevokeSessionHandler = {\n implementation: handleWalletRevokeSession,\n hookNames: {\n revokePermissionForOrigin: true,\n updateCaveat: true,\n getCaveatForOrigin: true,\n },\n} satisfies WalletRevokeSessionHandler;\n"]}
package/dist/index.d.ts DELETED
@@ -1,7 +0,0 @@
1
- export { methodHandlers } from './handlers/index.js';
2
- export type { MethodHandlerHooks } from './handlers/index.js';
3
- export { multichainMethodCallValidatorMiddleware } from './middlewares/multichainMethodCallValidatorMiddleware.js';
4
- export { MultichainMiddlewareManager } from './middlewares/MultichainMiddlewareManager.js';
5
- export { MultichainSubscriptionManager } from './middlewares/MultichainSubscriptionManager.js';
6
- export { MultichainApiNotifications } from './handlers/types.js';
7
- //# sourceMappingURL=index.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAC;AACrD,YAAY,EAAE,kBAAkB,EAAE,MAAM,qBAAqB,CAAC;AAE9D,OAAO,EAAE,uCAAuC,EAAE,MAAM,0DAA0D,CAAC;AACnH,OAAO,EAAE,2BAA2B,EAAE,MAAM,8CAA8C,CAAC;AAC3F,OAAO,EAAE,6BAA6B,EAAE,MAAM,gDAAgD,CAAC;AAC/F,OAAO,EAAE,0BAA0B,EAAE,MAAM,qBAAqB,CAAC"}
package/dist/index.js DELETED
@@ -1,6 +0,0 @@
1
- export { methodHandlers } from './handlers/index.js';
2
- export { multichainMethodCallValidatorMiddleware } from './middlewares/multichainMethodCallValidatorMiddleware.js';
3
- export { MultichainMiddlewareManager } from './middlewares/MultichainMiddlewareManager.js';
4
- export { MultichainSubscriptionManager } from './middlewares/MultichainSubscriptionManager.js';
5
- export { MultichainApiNotifications } from './handlers/types.js';
6
- //# sourceMappingURL=index.js.map
package/dist/index.js.map DELETED
@@ -1 +0,0 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAC;AAGrD,OAAO,EAAE,uCAAuC,EAAE,MAAM,0DAA0D,CAAC;AACnH,OAAO,EAAE,2BAA2B,EAAE,MAAM,8CAA8C,CAAC;AAC3F,OAAO,EAAE,6BAA6B,EAAE,MAAM,gDAAgD,CAAC;AAC/F,OAAO,EAAE,0BAA0B,EAAE,MAAM,qBAAqB,CAAC","sourcesContent":["export { methodHandlers } from './handlers/index.js';\nexport type { MethodHandlerHooks } from './handlers/index.js';\n\nexport { multichainMethodCallValidatorMiddleware } from './middlewares/multichainMethodCallValidatorMiddleware.js';\nexport { MultichainMiddlewareManager } from './middlewares/MultichainMiddlewareManager.js';\nexport { MultichainSubscriptionManager } from './middlewares/MultichainSubscriptionManager.js';\nexport { MultichainApiNotifications } from './handlers/types.js';\n"]}
@@ -1 +0,0 @@
1
- {"version":3,"file":"MultichainMiddlewareManager.d.ts","sourceRoot":"","sources":["../../src/middlewares/MultichainMiddlewareManager.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,qCAAqC,CAAC;AAC/E,OAAO,KAAK,EACV,wBAAwB,EACxB,yBAAyB,EAC1B,MAAM,2BAA2B,CAAC;AAEnC,OAAO,KAAK,EAAE,cAAc,EAAE,sBAAsB,EAAE,MAAM,iBAAiB,CAAC;AAE9E,MAAM,MAAM,yBAAyB,GAAG;IACtC,CACE,GAAG,EAAE,cAAc,GAAG;QAAE,KAAK,EAAE,MAAM,CAAA;KAAE,EACvC,GAAG,EAAE,sBAAsB,EAC3B,IAAI,EAAE,yBAAyB,EAC/B,GAAG,EAAE,wBAAwB,GAC5B,IAAI,CAAC;IACR,OAAO,CAAC,EAAE,MAAM,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;CACtC,CAAC;AAEF,KAAK,aAAa,GAAG;IACnB,KAAK,EAAE,mBAAmB,CAAC;IAC3B,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB,CAAC;AACF,KAAK,eAAe,GAAG,aAAa,GAAG;IACrC,UAAU,EAAE,yBAAyB,CAAC;CACvC,CAAC;AAKF;;;;;;;GAOG;AACH,qBAAa,2BAA2B;;IA2BtC,aAAa,CAAC,eAAe,EAAE,eAAe,QAK7C;IAYD,uBAAuB,CAAC,KAAK,EAAE,mBAAmB,QAMjD;IAED,gCAAgC,CAAC,KAAK,EAAE,mBAAmB,EAAE,MAAM,EAAE,MAAM,QAS1E;IAED,gCAAgC,CAAC,MAAM,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,MAAM,QAS9D;IAED,6CAA6C,CAC3C,MAAM,EAAE,MAAM,EACd,KAAK,CAAC,EAAE,MAAM,6BA+Bf;CACF"}
@@ -1,93 +0,0 @@
1
- import { rpcErrors } from '@metamask/rpc-errors';
2
- // Methods related to eth_subscriptions
3
- const SubscriptionMethods = ['eth_subscribe', 'eth_unsubscribe'];
4
- /**
5
- * A helper that facilates registering and calling of provided middleware instances
6
- * in the RPC pipeline based on the incoming request's scope, origin, and tabId.
7
- * The core purpose of this class is to enable and manage multichain subscriptions
8
- * (i.e. eth_subscribe called accross different chains and domains).
9
- *
10
- * Note that only one middleware instance can be registered per scope, origin, tabId key.
11
- */
12
- export class MultichainMiddlewareManager {
13
- #middlewares = [];
14
- #getMiddlewareEntry({ scope, origin, tabId, }) {
15
- return this.#middlewares.find((middlewareEntry) => {
16
- return (middlewareEntry.scope === scope &&
17
- middlewareEntry.origin === origin &&
18
- middlewareEntry.tabId === tabId);
19
- });
20
- }
21
- #removeMiddlewareEntry({ scope, origin, tabId }) {
22
- this.#middlewares = this.#middlewares.filter((middlewareEntry) => {
23
- return (middlewareEntry.scope !== scope ||
24
- middlewareEntry.origin !== origin ||
25
- middlewareEntry.tabId !== tabId);
26
- });
27
- }
28
- addMiddleware(middlewareEntry) {
29
- const { scope, origin, tabId } = middlewareEntry;
30
- if (!this.#getMiddlewareEntry({ scope, origin, tabId })) {
31
- this.#middlewares.push(middlewareEntry);
32
- }
33
- }
34
- #removeMiddleware(middlewareEntry) {
35
- // When the destroy function on the middleware is async,
36
- // we don't need to wait for it complete
37
- Promise.resolve(middlewareEntry.middleware.destroy?.()).catch(() => {
38
- // do nothing
39
- });
40
- this.#removeMiddlewareEntry(middlewareEntry);
41
- }
42
- removeMiddlewareByScope(scope) {
43
- this.#middlewares.forEach((middlewareEntry) => {
44
- if (middlewareEntry.scope === scope) {
45
- this.#removeMiddleware(middlewareEntry);
46
- }
47
- });
48
- }
49
- removeMiddlewareByScopeAndOrigin(scope, origin) {
50
- this.#middlewares.forEach((middlewareEntry) => {
51
- if (middlewareEntry.scope === scope &&
52
- middlewareEntry.origin === origin) {
53
- this.#removeMiddleware(middlewareEntry);
54
- }
55
- });
56
- }
57
- removeMiddlewareByOriginAndTabId(origin, tabId) {
58
- this.#middlewares.forEach((middlewareEntry) => {
59
- if (middlewareEntry.origin === origin &&
60
- middlewareEntry.tabId === tabId) {
61
- this.#removeMiddleware(middlewareEntry);
62
- }
63
- });
64
- }
65
- generateMultichainMiddlewareForOriginAndTabId(origin, tabId) {
66
- const middleware = (req, res, next, end) => {
67
- const { scope } = req;
68
- const middlewareEntry = this.#getMiddlewareEntry({
69
- scope,
70
- origin,
71
- tabId,
72
- });
73
- if (SubscriptionMethods.includes(req.method)) {
74
- if (middlewareEntry) {
75
- middlewareEntry.middleware(req, res, next, end);
76
- }
77
- else {
78
- // TODO: Temporary safety guard to prevent requests with these methods
79
- // from being forwarded to the RPC endpoint even though this scenario
80
- // should not be possible.
81
- return end(rpcErrors.methodNotFound());
82
- }
83
- }
84
- else {
85
- return next();
86
- }
87
- return undefined;
88
- };
89
- middleware.destroy = this.removeMiddlewareByOriginAndTabId.bind(this, origin, tabId);
90
- return middleware;
91
- }
92
- }
93
- //# sourceMappingURL=MultichainMiddlewareManager.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"MultichainMiddlewareManager.js","sourceRoot":"","sources":["../../src/middlewares/MultichainMiddlewareManager.ts"],"names":[],"mappings":"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","sourcesContent":["import type { ExternalScopeString } from '@metamask/chain-agnostic-permission';\nimport type {\n JsonRpcEngineEndCallback,\n JsonRpcEngineNextCallback,\n} from '@metamask/json-rpc-engine';\nimport { rpcErrors } from '@metamask/rpc-errors';\nimport type { JsonRpcRequest, PendingJsonRpcResponse } from '@metamask/utils';\n\nexport type ExtendedJsonRpcMiddleware = {\n (\n req: JsonRpcRequest & { scope: string },\n res: PendingJsonRpcResponse,\n next: JsonRpcEngineNextCallback,\n end: JsonRpcEngineEndCallback,\n ): void;\n destroy?: () => void | Promise<void>;\n};\n\ntype MiddlewareKey = {\n scope: ExternalScopeString;\n origin: string;\n tabId?: number;\n};\ntype MiddlewareEntry = MiddlewareKey & {\n middleware: ExtendedJsonRpcMiddleware;\n};\n\n// Methods related to eth_subscriptions\nconst SubscriptionMethods = ['eth_subscribe', 'eth_unsubscribe'];\n\n/**\n * A helper that facilates registering and calling of provided middleware instances\n * in the RPC pipeline based on the incoming request's scope, origin, and tabId.\n * The core purpose of this class is to enable and manage multichain subscriptions\n * (i.e. eth_subscribe called accross different chains and domains).\n *\n * Note that only one middleware instance can be registered per scope, origin, tabId key.\n */\nexport class MultichainMiddlewareManager {\n #middlewares: MiddlewareEntry[] = [];\n\n #getMiddlewareEntry({\n scope,\n origin,\n tabId,\n }: MiddlewareKey): MiddlewareEntry | undefined {\n return this.#middlewares.find((middlewareEntry) => {\n return (\n middlewareEntry.scope === scope &&\n middlewareEntry.origin === origin &&\n middlewareEntry.tabId === tabId\n );\n });\n }\n\n #removeMiddlewareEntry({ scope, origin, tabId }: MiddlewareEntry) {\n this.#middlewares = this.#middlewares.filter((middlewareEntry) => {\n return (\n middlewareEntry.scope !== scope ||\n middlewareEntry.origin !== origin ||\n middlewareEntry.tabId !== tabId\n );\n });\n }\n\n addMiddleware(middlewareEntry: MiddlewareEntry) {\n const { scope, origin, tabId } = middlewareEntry;\n if (!this.#getMiddlewareEntry({ scope, origin, tabId })) {\n this.#middlewares.push(middlewareEntry);\n }\n }\n\n #removeMiddleware(middlewareEntry: MiddlewareEntry) {\n // When the destroy function on the middleware is async,\n // we don't need to wait for it complete\n Promise.resolve(middlewareEntry.middleware.destroy?.()).catch(() => {\n // do nothing\n });\n\n this.#removeMiddlewareEntry(middlewareEntry);\n }\n\n removeMiddlewareByScope(scope: ExternalScopeString) {\n this.#middlewares.forEach((middlewareEntry) => {\n if (middlewareEntry.scope === scope) {\n this.#removeMiddleware(middlewareEntry);\n }\n });\n }\n\n removeMiddlewareByScopeAndOrigin(scope: ExternalScopeString, origin: string) {\n this.#middlewares.forEach((middlewareEntry) => {\n if (\n middlewareEntry.scope === scope &&\n middlewareEntry.origin === origin\n ) {\n this.#removeMiddleware(middlewareEntry);\n }\n });\n }\n\n removeMiddlewareByOriginAndTabId(origin: string, tabId?: number) {\n this.#middlewares.forEach((middlewareEntry) => {\n if (\n middlewareEntry.origin === origin &&\n middlewareEntry.tabId === tabId\n ) {\n this.#removeMiddleware(middlewareEntry);\n }\n });\n }\n\n generateMultichainMiddlewareForOriginAndTabId(\n origin: string,\n tabId?: number,\n ) {\n const middleware: ExtendedJsonRpcMiddleware = (req, res, next, end) => {\n const { scope } = req;\n const middlewareEntry = this.#getMiddlewareEntry({\n scope,\n origin,\n tabId,\n });\n\n if (SubscriptionMethods.includes(req.method)) {\n if (middlewareEntry) {\n middlewareEntry.middleware(req, res, next, end);\n } else {\n // TODO: Temporary safety guard to prevent requests with these methods\n // from being forwarded to the RPC endpoint even though this scenario\n // should not be possible.\n return end(rpcErrors.methodNotFound());\n }\n } else {\n return next();\n }\n return undefined;\n };\n middleware.destroy = this.removeMiddlewareByOriginAndTabId.bind(\n this,\n origin,\n tabId,\n );\n\n return middleware;\n }\n}\n"]}
@@ -1 +0,0 @@
1
- {"version":3,"file":"MultichainSubscriptionManager.d.ts","sourceRoot":"","sources":["../../src/middlewares/MultichainSubscriptionManager.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,qCAAqC,CAAC;AAG/E,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,8BAA8B,CAAC;AACtE,OAAO,gBAAgB,MAAM,8BAA8B,CAAC;AAC5D,OAAO,KAAK,EAAe,GAAG,EAAE,MAAM,iBAAiB,CAAC;AAIxD,OAAO,KAAK,EAAE,yBAAyB,EAAE,MAAM,kCAAkC,CAAC;AAElF,MAAM,MAAM,mBAAmB,GAAG;IAChC,MAAM,EAAE,gBAAgB,CAAC;IACzB,OAAO,CAAC,EAAE,MAAM,IAAI,CAAC;IACrB,UAAU,EAAE,yBAAyB,CAAC;CACvC,CAAC;AAEF,KAAK,6BAA6B,GAAG;IACnC,OAAO,EAAE,KAAK,CAAC;IACf,MAAM,EAAE,kBAAkB,CAAC;IAC3B,MAAM,EAAE;QACN,YAAY,EAAE,GAAG,CAAC;QAClB,MAAM,EAAE,OAAO,CAAC;KACjB,CAAC;CACH,CAAC;AAEF,KAAK,eAAe,GAAG;IACrB,KAAK,EAAE,mBAAmB,CAAC;IAC3B,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB,CAAC;AAKF,KAAK,oCAAoC,GAAG;IAC1C,4BAA4B,EAAE,iBAAiB,CAAC,8BAA8B,CAAC,CAAC;IAChF,oBAAoB,EAAE,iBAAiB,CAAC,sBAAsB,CAAC,CAAC;CACjE,CAAC;AAEF;;;GAGG;AACH,qBAAa,6BAA8B,SAAQ,gBAAgB;;IAOjE;;;;;;OAMG;IACH,YAAY,OAAO,EAAE,oCAAoC,EAIxD;IAED,MAAM,CACJ,EAAE,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,EAAE,eAAe,EACzC,EAAE,MAAM,EAAE,MAAM,EAAE,EAAE,6BAA6B,QASlD;IA0BD,SAAS,CAAC,eAAe,EAAE,eAAe,OAmCzC;IAQD,kBAAkB,CAAC,KAAK,EAAE,mBAAmB,QAM5C;IAED,2BAA2B,CAAC,KAAK,EAAE,mBAAmB,EAAE,MAAM,EAAE,MAAM,QASrE;IAED,2BAA2B,CAAC,MAAM,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,MAAM,QASzD;CACF"}
@@ -1,100 +0,0 @@
1
- import { toHex } from '@metamask/controller-utils';
2
- import createSubscriptionManager from '@metamask/eth-json-rpc-filters/subscriptionManager';
3
- import SafeEventEmitter from '@metamask/safe-event-emitter';
4
- import { parseCaipChainId } from '@metamask/utils';
5
- import { MultichainApiNotifications } from '../handlers/types.js';
6
- /**
7
- * A helper that facilates the lifecycle of a SubscriptionManager instance that
8
- * is meant to handle subscriptons for only one specific scope, origin, and tabId combination.
9
- */
10
- export class MultichainSubscriptionManager extends SafeEventEmitter {
11
- #findNetworkClientIdByChainId;
12
- #getNetworkClientById;
13
- #subscriptions = [];
14
- /**
15
- * Construct a MultichainSubscriptionManager.
16
- *
17
- * @param options - The controller options.
18
- * @param options.findNetworkClientIdByChainId - The hook to get the networkClientId from a chainId.
19
- * @param options.getNetworkClientById - The hook to get the network client instance by its networkClientId.
20
- */
21
- constructor(options) {
22
- super();
23
- this.#findNetworkClientIdByChainId = options.findNetworkClientIdByChainId;
24
- this.#getNetworkClientById = options.getNetworkClientById;
25
- }
26
- notify({ scope, origin, tabId }, { method, params }) {
27
- this.emit('notification', origin, tabId, {
28
- method: MultichainApiNotifications.walletNotify,
29
- params: {
30
- scope,
31
- notification: { method, params },
32
- },
33
- });
34
- }
35
- #getSubscriptionEntry({ scope, origin, tabId, }) {
36
- return this.#subscriptions.find((subscriptionEntry) => {
37
- return (subscriptionEntry.scope === scope &&
38
- subscriptionEntry.origin === origin &&
39
- subscriptionEntry.tabId === tabId);
40
- });
41
- }
42
- #removeSubscriptionEntry({ scope, origin, tabId }) {
43
- this.#subscriptions = this.#subscriptions.filter((subscriptionEntry) => {
44
- return (subscriptionEntry.scope !== scope ||
45
- subscriptionEntry.origin !== origin ||
46
- subscriptionEntry.tabId !== tabId);
47
- });
48
- }
49
- subscribe(subscriptionKey) {
50
- const subscriptionEntry = this.#getSubscriptionEntry(subscriptionKey);
51
- if (subscriptionEntry) {
52
- return subscriptionEntry.subscriptionManager;
53
- }
54
- const networkClientId = this.#findNetworkClientIdByChainId(toHex(parseCaipChainId(subscriptionKey.scope).reference));
55
- const networkClient = this.#getNetworkClientById(networkClientId);
56
- const subscriptionManager = createSubscriptionManager({
57
- blockTracker: networkClient.blockTracker,
58
- provider: networkClient.provider,
59
- });
60
- subscriptionManager.events.on('notification', (message) => {
61
- this.notify(subscriptionKey, message);
62
- });
63
- const newSubscriptionManagerEntry = {
64
- ...subscriptionKey,
65
- subscriptionManager,
66
- };
67
- subscriptionManager.destroy = subscriptionManager.middleware.destroy;
68
- subscriptionManager.middleware.destroy = this.#unsubscribe.bind(this, newSubscriptionManagerEntry);
69
- this.#subscriptions.push(newSubscriptionManagerEntry);
70
- return subscriptionManager;
71
- }
72
- #unsubscribe(subscriptionEntry) {
73
- subscriptionEntry.subscriptionManager.destroy?.();
74
- this.#removeSubscriptionEntry(subscriptionEntry);
75
- }
76
- unsubscribeByScope(scope) {
77
- this.#subscriptions.forEach((subscriptionEntry) => {
78
- if (subscriptionEntry.scope === scope) {
79
- this.#unsubscribe(subscriptionEntry);
80
- }
81
- });
82
- }
83
- unsubscribeByScopeAndOrigin(scope, origin) {
84
- this.#subscriptions.forEach((subscriptionEntry) => {
85
- if (subscriptionEntry.scope === scope &&
86
- subscriptionEntry.origin === origin) {
87
- this.#unsubscribe(subscriptionEntry);
88
- }
89
- });
90
- }
91
- unsubscribeByOriginAndTabId(origin, tabId) {
92
- this.#subscriptions.forEach((subscriptionEntry) => {
93
- if (subscriptionEntry.origin === origin &&
94
- subscriptionEntry.tabId === tabId) {
95
- this.#unsubscribe(subscriptionEntry);
96
- }
97
- });
98
- }
99
- }
100
- //# sourceMappingURL=MultichainSubscriptionManager.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"MultichainSubscriptionManager.js","sourceRoot":"","sources":["../../src/middlewares/MultichainSubscriptionManager.ts"],"names":[],"mappings":"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","sourcesContent":["import type { ExternalScopeString } from '@metamask/chain-agnostic-permission';\nimport { toHex } from '@metamask/controller-utils';\nimport createSubscriptionManager from '@metamask/eth-json-rpc-filters/subscriptionManager';\nimport type { NetworkController } from '@metamask/network-controller';\nimport SafeEventEmitter from '@metamask/safe-event-emitter';\nimport type { CaipChainId, Hex } from '@metamask/utils';\nimport { parseCaipChainId } from '@metamask/utils';\n\nimport { MultichainApiNotifications } from '../handlers/types.js';\nimport type { ExtendedJsonRpcMiddleware } from './MultichainMiddlewareManager.js';\n\nexport type SubscriptionManager = {\n events: SafeEventEmitter;\n destroy?: () => void;\n middleware: ExtendedJsonRpcMiddleware;\n};\n\ntype SubscriptionNotificationEvent = {\n jsonrpc: '2.0';\n method: 'eth_subscription';\n params: {\n subscription: Hex;\n result: unknown;\n };\n};\n\ntype SubscriptionKey = {\n scope: ExternalScopeString;\n origin: string;\n tabId?: number;\n};\ntype SubscriptionEntry = SubscriptionKey & {\n subscriptionManager: SubscriptionManager;\n};\n\ntype MultichainSubscriptionManagerOptions = {\n findNetworkClientIdByChainId: NetworkController['findNetworkClientIdByChainId'];\n getNetworkClientById: NetworkController['getNetworkClientById'];\n};\n\n/**\n * A helper that facilates the lifecycle of a SubscriptionManager instance that\n * is meant to handle subscriptons for only one specific scope, origin, and tabId combination.\n */\nexport class MultichainSubscriptionManager extends SafeEventEmitter {\n readonly #findNetworkClientIdByChainId: NetworkController['findNetworkClientIdByChainId'];\n\n readonly #getNetworkClientById: NetworkController['getNetworkClientById'];\n\n #subscriptions: SubscriptionEntry[] = [];\n\n /**\n * Construct a MultichainSubscriptionManager.\n *\n * @param options - The controller options.\n * @param options.findNetworkClientIdByChainId - The hook to get the networkClientId from a chainId.\n * @param options.getNetworkClientById - The hook to get the network client instance by its networkClientId.\n */\n constructor(options: MultichainSubscriptionManagerOptions) {\n super();\n this.#findNetworkClientIdByChainId = options.findNetworkClientIdByChainId;\n this.#getNetworkClientById = options.getNetworkClientById;\n }\n\n notify(\n { scope, origin, tabId }: SubscriptionKey,\n { method, params }: SubscriptionNotificationEvent,\n ) {\n this.emit('notification', origin, tabId, {\n method: MultichainApiNotifications.walletNotify,\n params: {\n scope,\n notification: { method, params },\n },\n });\n }\n\n #getSubscriptionEntry({\n scope,\n origin,\n tabId,\n }: SubscriptionKey): SubscriptionEntry | undefined {\n return this.#subscriptions.find((subscriptionEntry) => {\n return (\n subscriptionEntry.scope === scope &&\n subscriptionEntry.origin === origin &&\n subscriptionEntry.tabId === tabId\n );\n });\n }\n\n #removeSubscriptionEntry({ scope, origin, tabId }: SubscriptionEntry) {\n this.#subscriptions = this.#subscriptions.filter((subscriptionEntry) => {\n return (\n subscriptionEntry.scope !== scope ||\n subscriptionEntry.origin !== origin ||\n subscriptionEntry.tabId !== tabId\n );\n });\n }\n\n subscribe(subscriptionKey: SubscriptionKey) {\n const subscriptionEntry = this.#getSubscriptionEntry(subscriptionKey);\n if (subscriptionEntry) {\n return subscriptionEntry.subscriptionManager;\n }\n\n const networkClientId = this.#findNetworkClientIdByChainId(\n toHex(parseCaipChainId(subscriptionKey.scope as CaipChainId).reference),\n );\n const networkClient = this.#getNetworkClientById(networkClientId);\n const subscriptionManager = createSubscriptionManager({\n blockTracker: networkClient.blockTracker,\n provider: networkClient.provider,\n });\n\n subscriptionManager.events.on(\n 'notification',\n (message: SubscriptionNotificationEvent) => {\n this.notify(subscriptionKey, message);\n },\n );\n\n const newSubscriptionManagerEntry = {\n ...subscriptionKey,\n subscriptionManager,\n };\n subscriptionManager.destroy = subscriptionManager.middleware.destroy;\n subscriptionManager.middleware.destroy = this.#unsubscribe.bind(\n this,\n newSubscriptionManagerEntry,\n );\n\n this.#subscriptions.push(newSubscriptionManagerEntry);\n\n return subscriptionManager;\n }\n\n #unsubscribe(subscriptionEntry: SubscriptionEntry) {\n subscriptionEntry.subscriptionManager.destroy?.();\n\n this.#removeSubscriptionEntry(subscriptionEntry);\n }\n\n unsubscribeByScope(scope: ExternalScopeString) {\n this.#subscriptions.forEach((subscriptionEntry) => {\n if (subscriptionEntry.scope === scope) {\n this.#unsubscribe(subscriptionEntry);\n }\n });\n }\n\n unsubscribeByScopeAndOrigin(scope: ExternalScopeString, origin: string) {\n this.#subscriptions.forEach((subscriptionEntry) => {\n if (\n subscriptionEntry.scope === scope &&\n subscriptionEntry.origin === origin\n ) {\n this.#unsubscribe(subscriptionEntry);\n }\n });\n }\n\n unsubscribeByOriginAndTabId(origin: string, tabId?: number) {\n this.#subscriptions.forEach((subscriptionEntry) => {\n if (\n subscriptionEntry.origin === origin &&\n subscriptionEntry.tabId === tabId\n ) {\n this.#unsubscribe(subscriptionEntry);\n }\n });\n }\n}\n"]}
@@ -1 +0,0 @@
1
- {"version":3,"file":"multichainMethodCallValidatorMiddleware.d.ts","sourceRoot":"","sources":["../../src/middlewares/multichainMethodCallValidatorMiddleware.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAgB,aAAa,EAAE,MAAM,iBAAiB,CAAC;AAwFnE;;;GAGG;AACH,eAAO,MAAM,uCAAuC,sGAWnD,CAAC"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"multichainMethodCallValidatorMiddleware.js","sourceRoot":"","sources":["../../src/middlewares/multichainMethodCallValidatorMiddleware.ts"],"names":[],"mappings":"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","sourcesContent":["import { MultiChainOpenRPCDocument } from '@metamask/api-specs';\nimport { createAsyncMiddleware } from '@metamask/json-rpc-engine';\nimport { rpcErrors } from '@metamask/rpc-errors';\nimport { isObject } from '@metamask/utils';\nimport type { JsonRpcError, JsonRpcParams } from '@metamask/utils';\nimport type {\n ContentDescriptorObject,\n MethodObject,\n OpenrpcDocument,\n ReferenceObject,\n} from '@open-rpc/meta-schema';\nimport { dereferenceDocument } from '@open-rpc/schema-utils-js';\nimport { makeCustomResolver } from '@open-rpc/schema-utils-js/build/parse-open-rpc-document.js';\nimport type { Schema, ValidationError } from 'jsonschema';\nimport { Validator } from 'jsonschema';\n\nconst transformError = (\n error: ValidationError,\n param: ContentDescriptorObject,\n got: unknown,\n) => {\n // if there is a path, add it to the message\n const message = `${param.name}${\n error.path.length > 0 ? `.${error.path.join('.')}` : ''\n } ${error.message}`;\n\n return rpcErrors.invalidParams({\n message,\n data: {\n param: param.name,\n path: error.path,\n schema: error.schema,\n got,\n },\n });\n};\n\nconst v = new Validator();\n\nconst dereffedPromise = dereferenceDocument(\n MultiChainOpenRPCDocument as unknown as OpenrpcDocument,\n makeCustomResolver({}),\n);\n\n/**\n * Helper that utilizes the Multichain method specifications from `@metamask/api-specs`\n * to validate the params of a Multichain request.\n *\n * @param method - The request's method.\n * @param params - The request's optional JsonRpcParams object.\n * @returns an array of error objects for each validation error or an empty array if no errors.\n */\nconst multichainMethodCallValidator = async (\n method: string,\n params: JsonRpcParams | undefined,\n) => {\n const dereffed = await dereffedPromise;\n\n const methodToCheck = dereffed.methods.find(\n (m: MethodObject | ReferenceObject) => (m as MethodObject).name === method,\n ) as MethodObject | undefined;\n\n if (\n !methodToCheck ||\n !isObject(methodToCheck) ||\n !('params' in methodToCheck)\n ) {\n return [rpcErrors.methodNotFound({ data: { method } })] as JsonRpcError[];\n }\n\n const errors: JsonRpcError[] = [];\n for (const param of methodToCheck.params) {\n if (!isObject(params)) {\n return [rpcErrors.invalidParams()] as JsonRpcError[];\n }\n const p = param as ContentDescriptorObject;\n const paramToCheck = params[p.name];\n\n const result = v.validate(paramToCheck, p.schema as unknown as Schema, {\n required: p.required,\n });\n if (result.errors) {\n errors.push(\n ...result.errors.map((e) => {\n return transformError(e, p, paramToCheck) as JsonRpcError;\n }),\n );\n }\n }\n return errors;\n};\n\n/**\n * Middleware that validates the params of a Multichain method request\n * using the specifications from `@metamask/api-specs`.\n */\nexport const multichainMethodCallValidatorMiddleware = createAsyncMiddleware(\n async (request, _response, next) => {\n const errors = await multichainMethodCallValidator(\n request.method,\n request.params,\n );\n if (errors.length > 0) {\n throw rpcErrors.invalidParams<JsonRpcError[]>({ data: errors });\n }\n return await next();\n },\n);\n"]}