@metamask-previews/eth-json-rpc-middleware 21.0.0-preview-2e88eaea → 21.0.0-preview-c96ff8f

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 (104) hide show
  1. package/CHANGELOG.md +7 -0
  2. package/dist/block-cache.cjs +15 -27
  3. package/dist/block-cache.cjs.map +1 -1
  4. package/dist/block-cache.d.cts +5 -3
  5. package/dist/block-cache.d.cts.map +1 -1
  6. package/dist/block-cache.d.mts +5 -3
  7. package/dist/block-cache.d.mts.map +1 -1
  8. package/dist/block-cache.mjs +15 -27
  9. package/dist/block-cache.mjs.map +1 -1
  10. package/dist/block-ref-rewrite.cjs +12 -8
  11. package/dist/block-ref-rewrite.cjs.map +1 -1
  12. package/dist/block-ref-rewrite.d.cts +3 -3
  13. package/dist/block-ref-rewrite.d.cts.map +1 -1
  14. package/dist/block-ref-rewrite.d.mts +3 -3
  15. package/dist/block-ref-rewrite.d.mts.map +1 -1
  16. package/dist/block-ref-rewrite.mjs +12 -8
  17. package/dist/block-ref-rewrite.mjs.map +1 -1
  18. package/dist/block-ref.cjs +17 -10
  19. package/dist/block-ref.cjs.map +1 -1
  20. package/dist/block-ref.d.cts +12 -3
  21. package/dist/block-ref.d.cts.map +1 -1
  22. package/dist/block-ref.d.mts +12 -3
  23. package/dist/block-ref.d.mts.map +1 -1
  24. package/dist/block-ref.mjs +17 -10
  25. package/dist/block-ref.mjs.map +1 -1
  26. package/dist/block-tracker-inspector.cjs +28 -25
  27. package/dist/block-tracker-inspector.cjs.map +1 -1
  28. package/dist/block-tracker-inspector.d.cts +3 -3
  29. package/dist/block-tracker-inspector.d.cts.map +1 -1
  30. package/dist/block-tracker-inspector.d.mts +3 -3
  31. package/dist/block-tracker-inspector.d.mts.map +1 -1
  32. package/dist/block-tracker-inspector.mjs +28 -25
  33. package/dist/block-tracker-inspector.mjs.map +1 -1
  34. package/dist/fetch.cjs +8 -12
  35. package/dist/fetch.cjs.map +1 -1
  36. package/dist/fetch.d.cts +5 -3
  37. package/dist/fetch.d.cts.map +1 -1
  38. package/dist/fetch.d.mts +5 -3
  39. package/dist/fetch.d.mts.map +1 -1
  40. package/dist/fetch.mjs +8 -12
  41. package/dist/fetch.mjs.map +1 -1
  42. package/dist/inflight-cache.cjs +61 -45
  43. package/dist/inflight-cache.cjs.map +1 -1
  44. package/dist/inflight-cache.d.cts +12 -3
  45. package/dist/inflight-cache.d.cts.map +1 -1
  46. package/dist/inflight-cache.d.mts +12 -3
  47. package/dist/inflight-cache.d.mts.map +1 -1
  48. package/dist/inflight-cache.mjs +61 -45
  49. package/dist/inflight-cache.mjs.map +1 -1
  50. package/dist/methods/wallet-request-execution-permissions.cjs +11 -9
  51. package/dist/methods/wallet-request-execution-permissions.cjs.map +1 -1
  52. package/dist/methods/wallet-request-execution-permissions.d.cts +5 -3
  53. package/dist/methods/wallet-request-execution-permissions.d.cts.map +1 -1
  54. package/dist/methods/wallet-request-execution-permissions.d.mts +5 -3
  55. package/dist/methods/wallet-request-execution-permissions.d.mts.map +1 -1
  56. package/dist/methods/wallet-request-execution-permissions.mjs +9 -7
  57. package/dist/methods/wallet-request-execution-permissions.mjs.map +1 -1
  58. package/dist/methods/wallet-revoke-execution-permission.cjs +14 -11
  59. package/dist/methods/wallet-revoke-execution-permission.cjs.map +1 -1
  60. package/dist/methods/wallet-revoke-execution-permission.d.cts +10 -5
  61. package/dist/methods/wallet-revoke-execution-permission.d.cts.map +1 -1
  62. package/dist/methods/wallet-revoke-execution-permission.d.mts +10 -5
  63. package/dist/methods/wallet-revoke-execution-permission.d.mts.map +1 -1
  64. package/dist/methods/wallet-revoke-execution-permission.mjs +11 -8
  65. package/dist/methods/wallet-revoke-execution-permission.mjs.map +1 -1
  66. package/dist/providerAsMiddleware.cjs +5 -1
  67. package/dist/providerAsMiddleware.cjs.map +1 -1
  68. package/dist/providerAsMiddleware.d.cts +5 -3
  69. package/dist/providerAsMiddleware.d.cts.map +1 -1
  70. package/dist/providerAsMiddleware.d.mts +5 -3
  71. package/dist/providerAsMiddleware.d.mts.map +1 -1
  72. package/dist/providerAsMiddleware.mjs +3 -0
  73. package/dist/providerAsMiddleware.mjs.map +1 -1
  74. package/dist/retryOnEmpty.cjs +9 -16
  75. package/dist/retryOnEmpty.cjs.map +1 -1
  76. package/dist/retryOnEmpty.d.cts +3 -3
  77. package/dist/retryOnEmpty.d.cts.map +1 -1
  78. package/dist/retryOnEmpty.d.mts +3 -3
  79. package/dist/retryOnEmpty.d.mts.map +1 -1
  80. package/dist/retryOnEmpty.mjs +9 -16
  81. package/dist/retryOnEmpty.mjs.map +1 -1
  82. package/dist/types.cjs.map +1 -1
  83. package/dist/types.d.cts +0 -5
  84. package/dist/types.d.cts.map +1 -1
  85. package/dist/types.d.mts +0 -5
  86. package/dist/types.d.mts.map +1 -1
  87. package/dist/types.mjs.map +1 -1
  88. package/dist/utils/validation.cjs +2 -2
  89. package/dist/utils/validation.cjs.map +1 -1
  90. package/dist/utils/validation.d.cts +6 -3
  91. package/dist/utils/validation.d.cts.map +1 -1
  92. package/dist/utils/validation.d.mts +6 -3
  93. package/dist/utils/validation.d.mts.map +1 -1
  94. package/dist/utils/validation.mjs +2 -2
  95. package/dist/utils/validation.mjs.map +1 -1
  96. package/dist/wallet.cjs +87 -92
  97. package/dist/wallet.cjs.map +1 -1
  98. package/dist/wallet.d.cts +8 -5
  99. package/dist/wallet.d.cts.map +1 -1
  100. package/dist/wallet.d.mts +8 -5
  101. package/dist/wallet.d.mts.map +1 -1
  102. package/dist/wallet.mjs +88 -93
  103. package/dist/wallet.mjs.map +1 -1
  104. package/package.json +3 -1
@@ -1,23 +1,26 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.createInflightCacheMiddleware = void 0;
4
- const json_rpc_engine_1 = require("@metamask/json-rpc-engine");
5
- const full_1 = require("klona/full");
4
+ const utils_1 = require("@metamask/utils");
6
5
  const logging_utils_1 = require("./logging-utils.cjs");
7
6
  const cache_1 = require("./utils/cache.cjs");
8
7
  const log = (0, logging_utils_1.createModuleLogger)(logging_utils_1.projectLogger, 'inflight-cache');
8
+ /**
9
+ * Creates a middleware that caches inflight requests.
10
+ * If a request is already in flight, the middleware will wait for the request to complete
11
+ * and then return the result.
12
+ *
13
+ * @returns A middleware that caches inflight requests.
14
+ */
9
15
  function createInflightCacheMiddleware() {
10
16
  const inflightRequests = {};
11
- return (0, json_rpc_engine_1.createAsyncMiddleware)(async (req, res, next) => {
12
- // allow cach to be skipped if so specified
13
- if (req.skipCache) {
17
+ return async ({ request, context, next }) => {
18
+ if (context.get('skipCache')) {
14
19
  return next();
15
20
  }
16
- // get cacheId, if cacheable
17
- const cacheId = (0, cache_1.cacheIdentifierForRequest)(req);
18
- // if not cacheable, skip
21
+ const cacheId = (0, cache_1.cacheIdentifierForRequest)(request);
19
22
  if (!cacheId) {
20
- log('Request is not cacheable, proceeding. req = %o', req);
23
+ log('Request is not cacheable, proceeding. req = %o', request);
21
24
  return next();
22
25
  }
23
26
  // check for matching requests
@@ -26,55 +29,68 @@ function createInflightCacheMiddleware() {
26
29
  if (activeRequestHandlers) {
27
30
  // setup the response listener and wait for it to be called
28
31
  // it will handle copying the result and request fields
29
- log('Running %i handler(s) for request %o', activeRequestHandlers.length, req);
30
- await createActiveRequestHandler(res, activeRequestHandlers);
31
- return undefined;
32
+ log('Running %i handler(s) for request %o', activeRequestHandlers.length, request);
33
+ return await createActiveRequestHandler(activeRequestHandlers);
32
34
  }
33
35
  // setup response handler array for subsequent requests
34
36
  activeRequestHandlers = [];
35
37
  inflightRequests[cacheId] = activeRequestHandlers;
36
38
  // allow request to be handled normally
37
- log('Carrying original request forward %o', req);
38
- await next();
39
- // clear inflight requests
40
- delete inflightRequests[cacheId];
41
- // schedule activeRequestHandlers to be handled
42
- log('Running %i collected handler(s) for request %o', activeRequestHandlers.length, req);
43
- handleActiveRequest(res, activeRequestHandlers);
44
- // complete
45
- return undefined;
46
- });
47
- async function createActiveRequestHandler(res, activeRequestHandlers) {
48
- const { resolve, promise } = deferredPromise();
49
- activeRequestHandlers.push((handledRes) => {
50
- // append a copy of the result and error to the response
51
- res.result = (0, full_1.klona)(handledRes.result);
52
- res.error = (0, full_1.klona)(handledRes.error);
53
- resolve();
39
+ log('Carrying original request forward %o', request);
40
+ try {
41
+ const result = (await next());
42
+ log('Running %i collected handler(s) for successful request %o', activeRequestHandlers.length, request);
43
+ handleSuccess(result, activeRequestHandlers);
44
+ return result;
45
+ }
46
+ catch (error) {
47
+ log('Running %i collected handler(s) for failed request %o', activeRequestHandlers.length, request);
48
+ handleError(error, activeRequestHandlers);
49
+ throw error;
50
+ }
51
+ finally {
52
+ delete inflightRequests[cacheId];
53
+ }
54
+ };
55
+ /**
56
+ * Creates a new request handler for the active request.
57
+ *
58
+ * @param activeRequestHandlers - The active request handlers.
59
+ * @returns A promise that resolves to the result of the request.
60
+ */
61
+ function createActiveRequestHandler(activeRequestHandlers) {
62
+ const { resolve, promise, reject } = (0, utils_1.createDeferredPromise)();
63
+ activeRequestHandlers.push({
64
+ onSuccess: (result) => resolve(result),
65
+ onError: (error) => reject(error),
54
66
  });
55
67
  return promise;
56
68
  }
57
- function handleActiveRequest(res, activeRequestHandlers) {
69
+ /**
70
+ * Handles successful requests.
71
+ *
72
+ * @param result - The result of the request.
73
+ * @param activeRequestHandlers - The active request handlers.
74
+ */
75
+ function handleSuccess(result, activeRequestHandlers) {
58
76
  // use setTimeout so we can resolve our original request first
59
77
  setTimeout(() => {
60
- activeRequestHandlers.forEach((handler) => {
61
- try {
62
- handler(res);
63
- }
64
- catch (err) {
65
- // catch error so all requests are handled correctly
66
- console.error(err);
67
- }
78
+ activeRequestHandlers.forEach(({ onSuccess }) => {
79
+ onSuccess(result);
68
80
  });
69
81
  });
70
82
  }
83
+ /**
84
+ * Handles failed requests.
85
+ *
86
+ * @param error - The error of the request.
87
+ * @param activeRequestHandlers - The active request handlers.
88
+ */
89
+ function handleError(error, activeRequestHandlers) {
90
+ activeRequestHandlers.forEach(({ onError }) => {
91
+ onError(error);
92
+ });
93
+ }
71
94
  }
72
95
  exports.createInflightCacheMiddleware = createInflightCacheMiddleware;
73
- function deferredPromise() {
74
- let resolve;
75
- const promise = new Promise((_resolve) => {
76
- resolve = _resolve;
77
- });
78
- return { resolve, promise };
79
- }
80
96
  //# sourceMappingURL=inflight-cache.cjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"inflight-cache.cjs","sourceRoot":"","sources":["../src/inflight-cache.ts"],"names":[],"mappings":"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","sourcesContent":["import { createAsyncMiddleware } from '@metamask/json-rpc-engine';\nimport type {\n JsonRpcParams,\n Json,\n PendingJsonRpcResponse,\n} from '@metamask/utils';\nimport { klona } from 'klona/full';\n\nimport { projectLogger, createModuleLogger } from './logging-utils';\nimport type { JsonRpcRequestToCache, JsonRpcCacheMiddleware } from './types';\nimport { cacheIdentifierForRequest } from './utils/cache';\n\ntype RequestHandlers = (handledRes: PendingJsonRpcResponse) => void;\ntype InflightRequest = {\n [cacheId: string]: RequestHandlers[];\n};\n\nconst log = createModuleLogger(projectLogger, 'inflight-cache');\n\nexport function createInflightCacheMiddleware(): JsonRpcCacheMiddleware<\n JsonRpcParams,\n Json\n> {\n const inflightRequests: InflightRequest = {};\n\n return createAsyncMiddleware(\n async (req: JsonRpcRequestToCache<JsonRpcParams>, res, next) => {\n // allow cach to be skipped if so specified\n if (req.skipCache) {\n return next();\n }\n // get cacheId, if cacheable\n const cacheId: string | null = cacheIdentifierForRequest(req);\n // if not cacheable, skip\n if (!cacheId) {\n log('Request is not cacheable, proceeding. req = %o', req);\n return next();\n }\n // check for matching requests\n let activeRequestHandlers: RequestHandlers[] = inflightRequests[cacheId];\n // if found, wait for the active request to be handled\n if (activeRequestHandlers) {\n // setup the response listener and wait for it to be called\n // it will handle copying the result and request fields\n log(\n 'Running %i handler(s) for request %o',\n activeRequestHandlers.length,\n req,\n );\n await createActiveRequestHandler(res, activeRequestHandlers);\n return undefined;\n }\n // setup response handler array for subsequent requests\n activeRequestHandlers = [];\n inflightRequests[cacheId] = activeRequestHandlers;\n // allow request to be handled normally\n log('Carrying original request forward %o', req);\n await next();\n\n // clear inflight requests\n delete inflightRequests[cacheId];\n // schedule activeRequestHandlers to be handled\n log(\n 'Running %i collected handler(s) for request %o',\n activeRequestHandlers.length,\n req,\n );\n handleActiveRequest(res, activeRequestHandlers);\n // complete\n return undefined;\n },\n );\n\n async function createActiveRequestHandler(\n res: PendingJsonRpcResponse,\n activeRequestHandlers: RequestHandlers[],\n ): Promise<void> {\n const { resolve, promise } = deferredPromise();\n activeRequestHandlers.push((handledRes: PendingJsonRpcResponse) => {\n // append a copy of the result and error to the response\n res.result = klona(handledRes.result);\n res.error = klona(handledRes.error);\n resolve();\n });\n return promise;\n }\n\n function handleActiveRequest(\n res: PendingJsonRpcResponse,\n activeRequestHandlers: RequestHandlers[],\n ): void {\n // use setTimeout so we can resolve our original request first\n setTimeout(() => {\n activeRequestHandlers.forEach((handler) => {\n try {\n handler(res);\n } catch (err) {\n // catch error so all requests are handled correctly\n console.error(err);\n }\n });\n });\n }\n}\n\nfunction deferredPromise() {\n let resolve: any;\n const promise: Promise<void> = new Promise((_resolve) => {\n resolve = _resolve;\n });\n return { resolve, promise };\n}\n"]}
1
+ {"version":3,"file":"inflight-cache.cjs","sourceRoot":"","sources":["../src/inflight-cache.ts"],"names":[],"mappings":"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","sourcesContent":["import type {\n JsonRpcMiddleware,\n MiddlewareContext,\n} from '@metamask/json-rpc-engine/v2';\nimport {\n type Json,\n type JsonRpcRequest,\n createDeferredPromise,\n} from '@metamask/utils';\n\nimport { projectLogger, createModuleLogger } from './logging-utils';\nimport { cacheIdentifierForRequest } from './utils/cache';\n\ntype RequestHandler = {\n onSuccess: (result: Json) => void;\n onError: (error: Error) => void;\n};\ntype InflightRequest = {\n [cacheId: string]: RequestHandler[];\n};\n\nconst log = createModuleLogger(projectLogger, 'inflight-cache');\n\n/**\n * Creates a middleware that caches inflight requests.\n * If a request is already in flight, the middleware will wait for the request to complete\n * and then return the result.\n *\n * @returns A middleware that caches inflight requests.\n */\nexport function createInflightCacheMiddleware(): JsonRpcMiddleware<\n JsonRpcRequest,\n Json,\n MiddlewareContext<{ skipCache: boolean }>\n> {\n const inflightRequests: InflightRequest = {};\n\n return async ({ request, context, next }) => {\n if (context.get('skipCache')) {\n return next();\n }\n\n const cacheId: string | null = cacheIdentifierForRequest(request);\n if (!cacheId) {\n log('Request is not cacheable, proceeding. req = %o', request);\n return next();\n }\n\n // check for matching requests\n let activeRequestHandlers: RequestHandler[] = inflightRequests[cacheId];\n // if found, wait for the active request to be handled\n if (activeRequestHandlers) {\n // setup the response listener and wait for it to be called\n // it will handle copying the result and request fields\n log(\n 'Running %i handler(s) for request %o',\n activeRequestHandlers.length,\n request,\n );\n return await createActiveRequestHandler(activeRequestHandlers);\n }\n\n // setup response handler array for subsequent requests\n activeRequestHandlers = [];\n inflightRequests[cacheId] = activeRequestHandlers;\n // allow request to be handled normally\n log('Carrying original request forward %o', request);\n try {\n const result = (await next()) as Json;\n log(\n 'Running %i collected handler(s) for successful request %o',\n activeRequestHandlers.length,\n request,\n );\n handleSuccess(result, activeRequestHandlers);\n return result;\n } catch (error) {\n log(\n 'Running %i collected handler(s) for failed request %o',\n activeRequestHandlers.length,\n request,\n );\n handleError(error as Error, activeRequestHandlers);\n throw error;\n } finally {\n delete inflightRequests[cacheId];\n }\n };\n\n /**\n * Creates a new request handler for the active request.\n *\n * @param activeRequestHandlers - The active request handlers.\n * @returns A promise that resolves to the result of the request.\n */\n function createActiveRequestHandler(\n activeRequestHandlers: RequestHandler[],\n ): Promise<Json> {\n const { resolve, promise, reject } = createDeferredPromise<Json>();\n activeRequestHandlers.push({\n onSuccess: (result: Json) => resolve(result),\n onError: (error: Error) => reject(error),\n });\n return promise;\n }\n\n /**\n * Handles successful requests.\n *\n * @param result - The result of the request.\n * @param activeRequestHandlers - The active request handlers.\n */\n function handleSuccess(\n result: Json,\n activeRequestHandlers: RequestHandler[],\n ): void {\n // use setTimeout so we can resolve our original request first\n setTimeout(() => {\n activeRequestHandlers.forEach(({ onSuccess }) => {\n onSuccess(result);\n });\n });\n }\n\n /**\n * Handles failed requests.\n *\n * @param error - The error of the request.\n * @param activeRequestHandlers - The active request handlers.\n */\n function handleError(\n error: Error,\n activeRequestHandlers: RequestHandler[],\n ): void {\n activeRequestHandlers.forEach(({ onError }) => {\n onError(error);\n });\n }\n}\n"]}
@@ -1,4 +1,13 @@
1
- import type { JsonRpcParams, Json } from "@metamask/utils";
2
- import type { JsonRpcCacheMiddleware } from "./types.cjs";
3
- export declare function createInflightCacheMiddleware(): JsonRpcCacheMiddleware<JsonRpcParams, Json>;
1
+ import type { JsonRpcMiddleware, MiddlewareContext } from "@metamask/json-rpc-engine/v2";
2
+ import { type Json, type JsonRpcRequest } from "@metamask/utils";
3
+ /**
4
+ * Creates a middleware that caches inflight requests.
5
+ * If a request is already in flight, the middleware will wait for the request to complete
6
+ * and then return the result.
7
+ *
8
+ * @returns A middleware that caches inflight requests.
9
+ */
10
+ export declare function createInflightCacheMiddleware(): JsonRpcMiddleware<JsonRpcRequest, Json, MiddlewareContext<{
11
+ skipCache: boolean;
12
+ }>>;
4
13
  //# sourceMappingURL=inflight-cache.d.cts.map
@@ -1 +1 @@
1
- {"version":3,"file":"inflight-cache.d.cts","sourceRoot":"","sources":["../src/inflight-cache.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EACV,aAAa,EACb,IAAI,EAEL,wBAAwB;AAIzB,OAAO,KAAK,EAAyB,sBAAsB,EAAE,oBAAgB;AAU7E,wBAAgB,6BAA6B,IAAI,sBAAsB,CACrE,aAAa,EACb,IAAI,CACL,CAiFA"}
1
+ {"version":3,"file":"inflight-cache.d.cts","sourceRoot":"","sources":["../src/inflight-cache.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,iBAAiB,EACjB,iBAAiB,EAClB,qCAAqC;AACtC,OAAO,EACL,KAAK,IAAI,EACT,KAAK,cAAc,EAEpB,wBAAwB;AAezB;;;;;;GAMG;AACH,wBAAgB,6BAA6B,IAAI,iBAAiB,CAChE,cAAc,EACd,IAAI,EACJ,iBAAiB,CAAC;IAAE,SAAS,EAAE,OAAO,CAAA;CAAE,CAAC,CAC1C,CAwGA"}
@@ -1,4 +1,13 @@
1
- import type { JsonRpcParams, Json } from "@metamask/utils";
2
- import type { JsonRpcCacheMiddleware } from "./types.mjs";
3
- export declare function createInflightCacheMiddleware(): JsonRpcCacheMiddleware<JsonRpcParams, Json>;
1
+ import type { JsonRpcMiddleware, MiddlewareContext } from "@metamask/json-rpc-engine/v2";
2
+ import { type Json, type JsonRpcRequest } from "@metamask/utils";
3
+ /**
4
+ * Creates a middleware that caches inflight requests.
5
+ * If a request is already in flight, the middleware will wait for the request to complete
6
+ * and then return the result.
7
+ *
8
+ * @returns A middleware that caches inflight requests.
9
+ */
10
+ export declare function createInflightCacheMiddleware(): JsonRpcMiddleware<JsonRpcRequest, Json, MiddlewareContext<{
11
+ skipCache: boolean;
12
+ }>>;
4
13
  //# sourceMappingURL=inflight-cache.d.mts.map
@@ -1 +1 @@
1
- {"version":3,"file":"inflight-cache.d.mts","sourceRoot":"","sources":["../src/inflight-cache.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EACV,aAAa,EACb,IAAI,EAEL,wBAAwB;AAIzB,OAAO,KAAK,EAAyB,sBAAsB,EAAE,oBAAgB;AAU7E,wBAAgB,6BAA6B,IAAI,sBAAsB,CACrE,aAAa,EACb,IAAI,CACL,CAiFA"}
1
+ {"version":3,"file":"inflight-cache.d.mts","sourceRoot":"","sources":["../src/inflight-cache.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,iBAAiB,EACjB,iBAAiB,EAClB,qCAAqC;AACtC,OAAO,EACL,KAAK,IAAI,EACT,KAAK,cAAc,EAEpB,wBAAwB;AAezB;;;;;;GAMG;AACH,wBAAgB,6BAA6B,IAAI,iBAAiB,CAChE,cAAc,EACd,IAAI,EACJ,iBAAiB,CAAC;IAAE,SAAS,EAAE,OAAO,CAAA;CAAE,CAAC,CAC1C,CAwGA"}
@@ -1,20 +1,23 @@
1
- import { createAsyncMiddleware } from "@metamask/json-rpc-engine";
2
- import { klona } from "klona/full";
1
+ import { createDeferredPromise } from "@metamask/utils";
3
2
  import { projectLogger, createModuleLogger } from "./logging-utils.mjs";
4
3
  import { cacheIdentifierForRequest } from "./utils/cache.mjs";
5
4
  const log = createModuleLogger(projectLogger, 'inflight-cache');
5
+ /**
6
+ * Creates a middleware that caches inflight requests.
7
+ * If a request is already in flight, the middleware will wait for the request to complete
8
+ * and then return the result.
9
+ *
10
+ * @returns A middleware that caches inflight requests.
11
+ */
6
12
  export function createInflightCacheMiddleware() {
7
13
  const inflightRequests = {};
8
- return createAsyncMiddleware(async (req, res, next) => {
9
- // allow cach to be skipped if so specified
10
- if (req.skipCache) {
14
+ return async ({ request, context, next }) => {
15
+ if (context.get('skipCache')) {
11
16
  return next();
12
17
  }
13
- // get cacheId, if cacheable
14
- const cacheId = cacheIdentifierForRequest(req);
15
- // if not cacheable, skip
18
+ const cacheId = cacheIdentifierForRequest(request);
16
19
  if (!cacheId) {
17
- log('Request is not cacheable, proceeding. req = %o', req);
20
+ log('Request is not cacheable, proceeding. req = %o', request);
18
21
  return next();
19
22
  }
20
23
  // check for matching requests
@@ -23,54 +26,67 @@ export function createInflightCacheMiddleware() {
23
26
  if (activeRequestHandlers) {
24
27
  // setup the response listener and wait for it to be called
25
28
  // it will handle copying the result and request fields
26
- log('Running %i handler(s) for request %o', activeRequestHandlers.length, req);
27
- await createActiveRequestHandler(res, activeRequestHandlers);
28
- return undefined;
29
+ log('Running %i handler(s) for request %o', activeRequestHandlers.length, request);
30
+ return await createActiveRequestHandler(activeRequestHandlers);
29
31
  }
30
32
  // setup response handler array for subsequent requests
31
33
  activeRequestHandlers = [];
32
34
  inflightRequests[cacheId] = activeRequestHandlers;
33
35
  // allow request to be handled normally
34
- log('Carrying original request forward %o', req);
35
- await next();
36
- // clear inflight requests
37
- delete inflightRequests[cacheId];
38
- // schedule activeRequestHandlers to be handled
39
- log('Running %i collected handler(s) for request %o', activeRequestHandlers.length, req);
40
- handleActiveRequest(res, activeRequestHandlers);
41
- // complete
42
- return undefined;
43
- });
44
- async function createActiveRequestHandler(res, activeRequestHandlers) {
45
- const { resolve, promise } = deferredPromise();
46
- activeRequestHandlers.push((handledRes) => {
47
- // append a copy of the result and error to the response
48
- res.result = klona(handledRes.result);
49
- res.error = klona(handledRes.error);
50
- resolve();
36
+ log('Carrying original request forward %o', request);
37
+ try {
38
+ const result = (await next());
39
+ log('Running %i collected handler(s) for successful request %o', activeRequestHandlers.length, request);
40
+ handleSuccess(result, activeRequestHandlers);
41
+ return result;
42
+ }
43
+ catch (error) {
44
+ log('Running %i collected handler(s) for failed request %o', activeRequestHandlers.length, request);
45
+ handleError(error, activeRequestHandlers);
46
+ throw error;
47
+ }
48
+ finally {
49
+ delete inflightRequests[cacheId];
50
+ }
51
+ };
52
+ /**
53
+ * Creates a new request handler for the active request.
54
+ *
55
+ * @param activeRequestHandlers - The active request handlers.
56
+ * @returns A promise that resolves to the result of the request.
57
+ */
58
+ function createActiveRequestHandler(activeRequestHandlers) {
59
+ const { resolve, promise, reject } = createDeferredPromise();
60
+ activeRequestHandlers.push({
61
+ onSuccess: (result) => resolve(result),
62
+ onError: (error) => reject(error),
51
63
  });
52
64
  return promise;
53
65
  }
54
- function handleActiveRequest(res, activeRequestHandlers) {
66
+ /**
67
+ * Handles successful requests.
68
+ *
69
+ * @param result - The result of the request.
70
+ * @param activeRequestHandlers - The active request handlers.
71
+ */
72
+ function handleSuccess(result, activeRequestHandlers) {
55
73
  // use setTimeout so we can resolve our original request first
56
74
  setTimeout(() => {
57
- activeRequestHandlers.forEach((handler) => {
58
- try {
59
- handler(res);
60
- }
61
- catch (err) {
62
- // catch error so all requests are handled correctly
63
- console.error(err);
64
- }
75
+ activeRequestHandlers.forEach(({ onSuccess }) => {
76
+ onSuccess(result);
65
77
  });
66
78
  });
67
79
  }
68
- }
69
- function deferredPromise() {
70
- let resolve;
71
- const promise = new Promise((_resolve) => {
72
- resolve = _resolve;
73
- });
74
- return { resolve, promise };
80
+ /**
81
+ * Handles failed requests.
82
+ *
83
+ * @param error - The error of the request.
84
+ * @param activeRequestHandlers - The active request handlers.
85
+ */
86
+ function handleError(error, activeRequestHandlers) {
87
+ activeRequestHandlers.forEach(({ onError }) => {
88
+ onError(error);
89
+ });
90
+ }
75
91
  }
76
92
  //# sourceMappingURL=inflight-cache.mjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"inflight-cache.mjs","sourceRoot":"","sources":["../src/inflight-cache.ts"],"names":[],"mappings":"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","sourcesContent":["import { createAsyncMiddleware } from '@metamask/json-rpc-engine';\nimport type {\n JsonRpcParams,\n Json,\n PendingJsonRpcResponse,\n} from '@metamask/utils';\nimport { klona } from 'klona/full';\n\nimport { projectLogger, createModuleLogger } from './logging-utils';\nimport type { JsonRpcRequestToCache, JsonRpcCacheMiddleware } from './types';\nimport { cacheIdentifierForRequest } from './utils/cache';\n\ntype RequestHandlers = (handledRes: PendingJsonRpcResponse) => void;\ntype InflightRequest = {\n [cacheId: string]: RequestHandlers[];\n};\n\nconst log = createModuleLogger(projectLogger, 'inflight-cache');\n\nexport function createInflightCacheMiddleware(): JsonRpcCacheMiddleware<\n JsonRpcParams,\n Json\n> {\n const inflightRequests: InflightRequest = {};\n\n return createAsyncMiddleware(\n async (req: JsonRpcRequestToCache<JsonRpcParams>, res, next) => {\n // allow cach to be skipped if so specified\n if (req.skipCache) {\n return next();\n }\n // get cacheId, if cacheable\n const cacheId: string | null = cacheIdentifierForRequest(req);\n // if not cacheable, skip\n if (!cacheId) {\n log('Request is not cacheable, proceeding. req = %o', req);\n return next();\n }\n // check for matching requests\n let activeRequestHandlers: RequestHandlers[] = inflightRequests[cacheId];\n // if found, wait for the active request to be handled\n if (activeRequestHandlers) {\n // setup the response listener and wait for it to be called\n // it will handle copying the result and request fields\n log(\n 'Running %i handler(s) for request %o',\n activeRequestHandlers.length,\n req,\n );\n await createActiveRequestHandler(res, activeRequestHandlers);\n return undefined;\n }\n // setup response handler array for subsequent requests\n activeRequestHandlers = [];\n inflightRequests[cacheId] = activeRequestHandlers;\n // allow request to be handled normally\n log('Carrying original request forward %o', req);\n await next();\n\n // clear inflight requests\n delete inflightRequests[cacheId];\n // schedule activeRequestHandlers to be handled\n log(\n 'Running %i collected handler(s) for request %o',\n activeRequestHandlers.length,\n req,\n );\n handleActiveRequest(res, activeRequestHandlers);\n // complete\n return undefined;\n },\n );\n\n async function createActiveRequestHandler(\n res: PendingJsonRpcResponse,\n activeRequestHandlers: RequestHandlers[],\n ): Promise<void> {\n const { resolve, promise } = deferredPromise();\n activeRequestHandlers.push((handledRes: PendingJsonRpcResponse) => {\n // append a copy of the result and error to the response\n res.result = klona(handledRes.result);\n res.error = klona(handledRes.error);\n resolve();\n });\n return promise;\n }\n\n function handleActiveRequest(\n res: PendingJsonRpcResponse,\n activeRequestHandlers: RequestHandlers[],\n ): void {\n // use setTimeout so we can resolve our original request first\n setTimeout(() => {\n activeRequestHandlers.forEach((handler) => {\n try {\n handler(res);\n } catch (err) {\n // catch error so all requests are handled correctly\n console.error(err);\n }\n });\n });\n }\n}\n\nfunction deferredPromise() {\n let resolve: any;\n const promise: Promise<void> = new Promise((_resolve) => {\n resolve = _resolve;\n });\n return { resolve, promise };\n}\n"]}
1
+ {"version":3,"file":"inflight-cache.mjs","sourceRoot":"","sources":["../src/inflight-cache.ts"],"names":[],"mappings":"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","sourcesContent":["import type {\n JsonRpcMiddleware,\n MiddlewareContext,\n} from '@metamask/json-rpc-engine/v2';\nimport {\n type Json,\n type JsonRpcRequest,\n createDeferredPromise,\n} from '@metamask/utils';\n\nimport { projectLogger, createModuleLogger } from './logging-utils';\nimport { cacheIdentifierForRequest } from './utils/cache';\n\ntype RequestHandler = {\n onSuccess: (result: Json) => void;\n onError: (error: Error) => void;\n};\ntype InflightRequest = {\n [cacheId: string]: RequestHandler[];\n};\n\nconst log = createModuleLogger(projectLogger, 'inflight-cache');\n\n/**\n * Creates a middleware that caches inflight requests.\n * If a request is already in flight, the middleware will wait for the request to complete\n * and then return the result.\n *\n * @returns A middleware that caches inflight requests.\n */\nexport function createInflightCacheMiddleware(): JsonRpcMiddleware<\n JsonRpcRequest,\n Json,\n MiddlewareContext<{ skipCache: boolean }>\n> {\n const inflightRequests: InflightRequest = {};\n\n return async ({ request, context, next }) => {\n if (context.get('skipCache')) {\n return next();\n }\n\n const cacheId: string | null = cacheIdentifierForRequest(request);\n if (!cacheId) {\n log('Request is not cacheable, proceeding. req = %o', request);\n return next();\n }\n\n // check for matching requests\n let activeRequestHandlers: RequestHandler[] = inflightRequests[cacheId];\n // if found, wait for the active request to be handled\n if (activeRequestHandlers) {\n // setup the response listener and wait for it to be called\n // it will handle copying the result and request fields\n log(\n 'Running %i handler(s) for request %o',\n activeRequestHandlers.length,\n request,\n );\n return await createActiveRequestHandler(activeRequestHandlers);\n }\n\n // setup response handler array for subsequent requests\n activeRequestHandlers = [];\n inflightRequests[cacheId] = activeRequestHandlers;\n // allow request to be handled normally\n log('Carrying original request forward %o', request);\n try {\n const result = (await next()) as Json;\n log(\n 'Running %i collected handler(s) for successful request %o',\n activeRequestHandlers.length,\n request,\n );\n handleSuccess(result, activeRequestHandlers);\n return result;\n } catch (error) {\n log(\n 'Running %i collected handler(s) for failed request %o',\n activeRequestHandlers.length,\n request,\n );\n handleError(error as Error, activeRequestHandlers);\n throw error;\n } finally {\n delete inflightRequests[cacheId];\n }\n };\n\n /**\n * Creates a new request handler for the active request.\n *\n * @param activeRequestHandlers - The active request handlers.\n * @returns A promise that resolves to the result of the request.\n */\n function createActiveRequestHandler(\n activeRequestHandlers: RequestHandler[],\n ): Promise<Json> {\n const { resolve, promise, reject } = createDeferredPromise<Json>();\n activeRequestHandlers.push({\n onSuccess: (result: Json) => resolve(result),\n onError: (error: Error) => reject(error),\n });\n return promise;\n }\n\n /**\n * Handles successful requests.\n *\n * @param result - The result of the request.\n * @param activeRequestHandlers - The active request handlers.\n */\n function handleSuccess(\n result: Json,\n activeRequestHandlers: RequestHandler[],\n ): void {\n // use setTimeout so we can resolve our original request first\n setTimeout(() => {\n activeRequestHandlers.forEach(({ onSuccess }) => {\n onSuccess(result);\n });\n });\n }\n\n /**\n * Handles failed requests.\n *\n * @param error - The error of the request.\n * @param activeRequestHandlers - The active request handlers.\n */\n function handleError(\n error: Error,\n activeRequestHandlers: RequestHandler[],\n ): void {\n activeRequestHandlers.forEach(({ onError }) => {\n onError(error);\n });\n }\n}\n"]}
@@ -1,6 +1,6 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.walletRequestExecutionPermissions = exports.RequestExecutionPermissionsStruct = void 0;
3
+ exports.createWalletRequestExecutionPermissionsHandler = exports.RequestExecutionPermissionsStruct = void 0;
4
4
  const rpc_errors_1 = require("@metamask/rpc-errors");
5
5
  const superstruct_1 = require("@metamask/superstruct");
6
6
  const utils_1 = require("@metamask/utils");
@@ -29,13 +29,15 @@ const PermissionRequestStruct = (0, superstruct_1.object)({
29
29
  rules: (0, superstruct_1.optional)((0, superstruct_1.union)([(0, superstruct_1.array)(RuleStruct), (0, superstruct_1.literal)(null)])),
30
30
  });
31
31
  exports.RequestExecutionPermissionsStruct = (0, superstruct_1.array)(PermissionRequestStruct);
32
- async function walletRequestExecutionPermissions(req, res, { processRequestExecutionPermissions, }) {
33
- if (!processRequestExecutionPermissions) {
34
- throw rpc_errors_1.rpcErrors.methodNotSupported('wallet_requestExecutionPermissions - no middleware configured');
35
- }
36
- const { params } = req;
37
- (0, validation_1.validateParams)(params, exports.RequestExecutionPermissionsStruct);
38
- res.result = await processRequestExecutionPermissions(params, req);
32
+ function createWalletRequestExecutionPermissionsHandler({ processRequestExecutionPermissions, }) {
33
+ return async ({ request }) => {
34
+ if (!processRequestExecutionPermissions) {
35
+ throw rpc_errors_1.rpcErrors.methodNotSupported('wallet_requestExecutionPermissions - no middleware configured');
36
+ }
37
+ const { params } = request;
38
+ (0, validation_1.validateParams)(params, exports.RequestExecutionPermissionsStruct);
39
+ return await processRequestExecutionPermissions(params, request);
40
+ };
39
41
  }
40
- exports.walletRequestExecutionPermissions = walletRequestExecutionPermissions;
42
+ exports.createWalletRequestExecutionPermissionsHandler = createWalletRequestExecutionPermissionsHandler;
41
43
  //# sourceMappingURL=wallet-request-execution-permissions.cjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"wallet-request-execution-permissions.cjs","sourceRoot":"","sources":["../../src/methods/wallet-request-execution-permissions.ts"],"names":[],"mappings":";;;AAAA,qDAAiD;AAEjD,uDAU+B;AAC/B,2CAOyB;AAEzB,wDAAqD;AAErD,MAAM,gBAAgB,GAAG,IAAA,oBAAM,EAAC;IAC9B,IAAI,EAAE,IAAA,oBAAM,GAAE;IACd,mBAAmB,EAAE,IAAA,qBAAO,GAAE;IAC9B,IAAI,EAAE,IAAA,oBAAM,EAAC,IAAA,oBAAM,GAAE,EAAE,IAAA,qBAAO,GAAE,CAAC;CAClC,CAAC,CAAC;AAEH,MAAM,UAAU,GAAG,IAAA,oBAAM,EAAC;IACxB,IAAI,EAAE,IAAA,oBAAM,GAAE;IACd,mBAAmB,EAAE,IAAA,qBAAO,GAAE;IAC9B,IAAI,EAAE,IAAA,oBAAM,EAAC,IAAA,oBAAM,GAAE,EAAE,IAAA,qBAAO,GAAE,CAAC;CAClC,CAAC,CAAC;AAEH,MAAM,mBAAmB,GAAG,IAAA,oBAAM,EAAC;IACjC,IAAI,EAAE,IAAA,qBAAO,EAAC,SAAS,CAAC;IACxB,IAAI,EAAE,IAAA,oBAAM,EAAC;QACX,OAAO,EAAE,gCAAwB;KAClC,CAAC;CACH,CAAC,CAAC;AAEH,MAAM,uBAAuB,GAAG,IAAA,oBAAM,EAAC;IACrC,OAAO,EAAE,uBAAe;IACxB,OAAO,EAAE,IAAA,sBAAQ,EAAC,gCAAwB,CAAC;IAC3C,MAAM,EAAE,mBAAmB;IAC3B,UAAU,EAAE,gBAAgB;IAC5B,KAAK,EAAE,IAAA,sBAAQ,EAAC,IAAA,mBAAK,EAAC,CAAC,IAAA,mBAAK,EAAC,UAAU,CAAC,EAAE,IAAA,qBAAO,EAAC,IAAI,CAAC,CAAC,CAAC,CAAC;CAC3D,CAAC,CAAC;AAEU,QAAA,iCAAiC,GAAG,IAAA,mBAAK,EAAC,uBAAuB,CAAC,CAAC;AAiBzE,KAAK,UAAU,iCAAiC,CACrD,GAAmB,EACnB,GAA2B,EAC3B,EACE,kCAAkC,GAGnC;IAED,IAAI,CAAC,kCAAkC,EAAE;QACvC,MAAM,sBAAS,CAAC,kBAAkB,CAChC,+DAA+D,CAChE,CAAC;KACH;IAED,MAAM,EAAE,MAAM,EAAE,GAAG,GAAG,CAAC;IAEvB,IAAA,2BAAc,EAAC,MAAM,EAAE,yCAAiC,CAAC,CAAC;IAE1D,GAAG,CAAC,MAAM,GAAG,MAAM,kCAAkC,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;AACrE,CAAC;AApBD,8EAoBC","sourcesContent":["import { rpcErrors } from '@metamask/rpc-errors';\nimport type { Infer } from '@metamask/superstruct';\nimport {\n array,\n boolean,\n literal,\n object,\n optional,\n record,\n string,\n union,\n unknown,\n} from '@metamask/superstruct';\nimport {\n HexChecksumAddressStruct,\n type Hex,\n type Json,\n type JsonRpcRequest,\n type PendingJsonRpcResponse,\n StrictHexStruct,\n} from '@metamask/utils';\n\nimport { validateParams } from '../utils/validation';\n\nconst PermissionStruct = object({\n type: string(),\n isAdjustmentAllowed: boolean(),\n data: record(string(), unknown()),\n});\n\nconst RuleStruct = object({\n type: string(),\n isAdjustmentAllowed: boolean(),\n data: record(string(), unknown()),\n});\n\nconst AccountSignerStruct = object({\n type: literal('account'),\n data: object({\n address: HexChecksumAddressStruct,\n }),\n});\n\nconst PermissionRequestStruct = object({\n chainId: StrictHexStruct,\n address: optional(HexChecksumAddressStruct),\n signer: AccountSignerStruct,\n permission: PermissionStruct,\n rules: optional(union([array(RuleStruct), literal(null)])),\n});\n\nexport const RequestExecutionPermissionsStruct = array(PermissionRequestStruct);\n\n// RequestExecutionPermissions API types\nexport type RequestExecutionPermissionsRequestParams = Infer<\n typeof RequestExecutionPermissionsStruct\n>;\n\nexport type RequestExecutionPermissionsResult = Json &\n (Infer<typeof PermissionRequestStruct> & {\n context: Hex;\n })[];\n\nexport type ProcessRequestExecutionPermissionsHook = (\n request: RequestExecutionPermissionsRequestParams,\n req: JsonRpcRequest,\n) => Promise<RequestExecutionPermissionsResult>;\n\nexport async function walletRequestExecutionPermissions(\n req: JsonRpcRequest,\n res: PendingJsonRpcResponse,\n {\n processRequestExecutionPermissions,\n }: {\n processRequestExecutionPermissions?: ProcessRequestExecutionPermissionsHook;\n },\n): Promise<void> {\n if (!processRequestExecutionPermissions) {\n throw rpcErrors.methodNotSupported(\n 'wallet_requestExecutionPermissions - no middleware configured',\n );\n }\n\n const { params } = req;\n\n validateParams(params, RequestExecutionPermissionsStruct);\n\n res.result = await processRequestExecutionPermissions(params, req);\n}\n"]}
1
+ {"version":3,"file":"wallet-request-execution-permissions.cjs","sourceRoot":"","sources":["../../src/methods/wallet-request-execution-permissions.ts"],"names":[],"mappings":";;;AACA,qDAAiD;AAEjD,uDAU+B;AAC/B,2CAMyB;AAEzB,wDAAqD;AAGrD,MAAM,gBAAgB,GAAG,IAAA,oBAAM,EAAC;IAC9B,IAAI,EAAE,IAAA,oBAAM,GAAE;IACd,mBAAmB,EAAE,IAAA,qBAAO,GAAE;IAC9B,IAAI,EAAE,IAAA,oBAAM,EAAC,IAAA,oBAAM,GAAE,EAAE,IAAA,qBAAO,GAAE,CAAC;CAClC,CAAC,CAAC;AAEH,MAAM,UAAU,GAAG,IAAA,oBAAM,EAAC;IACxB,IAAI,EAAE,IAAA,oBAAM,GAAE;IACd,mBAAmB,EAAE,IAAA,qBAAO,GAAE;IAC9B,IAAI,EAAE,IAAA,oBAAM,EAAC,IAAA,oBAAM,GAAE,EAAE,IAAA,qBAAO,GAAE,CAAC;CAClC,CAAC,CAAC;AAEH,MAAM,mBAAmB,GAAG,IAAA,oBAAM,EAAC;IACjC,IAAI,EAAE,IAAA,qBAAO,EAAC,SAAS,CAAC;IACxB,IAAI,EAAE,IAAA,oBAAM,EAAC;QACX,OAAO,EAAE,gCAAwB;KAClC,CAAC;CACH,CAAC,CAAC;AAEH,MAAM,uBAAuB,GAAG,IAAA,oBAAM,EAAC;IACrC,OAAO,EAAE,uBAAe;IACxB,OAAO,EAAE,IAAA,sBAAQ,EAAC,gCAAwB,CAAC;IAC3C,MAAM,EAAE,mBAAmB;IAC3B,UAAU,EAAE,gBAAgB;IAC5B,KAAK,EAAE,IAAA,sBAAQ,EAAC,IAAA,mBAAK,EAAC,CAAC,IAAA,mBAAK,EAAC,UAAU,CAAC,EAAE,IAAA,qBAAO,EAAC,IAAI,CAAC,CAAC,CAAC,CAAC;CAC3D,CAAC,CAAC;AAEU,QAAA,iCAAiC,GAAG,IAAA,mBAAK,EAAC,uBAAuB,CAAC,CAAC;AAiBhF,SAAgB,8CAA8C,CAAC,EAC7D,kCAAkC,GAGnC;IACC,OAAO,KAAK,EAAE,EAAE,OAAO,EAAE,EAAE,EAAE;QAC3B,IAAI,CAAC,kCAAkC,EAAE;YACvC,MAAM,sBAAS,CAAC,kBAAkB,CAChC,+DAA+D,CAChE,CAAC;SACH;QAED,MAAM,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC;QAE3B,IAAA,2BAAc,EAAC,MAAM,EAAE,yCAAiC,CAAC,CAAC;QAE1D,OAAO,MAAM,kCAAkC,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACnE,CAAC,CAAC;AACJ,CAAC;AAlBD,wGAkBC","sourcesContent":["import type { JsonRpcMiddleware } from '@metamask/json-rpc-engine/v2';\nimport { rpcErrors } from '@metamask/rpc-errors';\nimport type { Infer } from '@metamask/superstruct';\nimport {\n array,\n boolean,\n literal,\n object,\n optional,\n record,\n string,\n union,\n unknown,\n} from '@metamask/superstruct';\nimport {\n HexChecksumAddressStruct,\n type Hex,\n type Json,\n type JsonRpcRequest,\n StrictHexStruct,\n} from '@metamask/utils';\n\nimport { validateParams } from '../utils/validation';\nimport type { WalletMiddlewareContext } from '../wallet';\n\nconst PermissionStruct = object({\n type: string(),\n isAdjustmentAllowed: boolean(),\n data: record(string(), unknown()),\n});\n\nconst RuleStruct = object({\n type: string(),\n isAdjustmentAllowed: boolean(),\n data: record(string(), unknown()),\n});\n\nconst AccountSignerStruct = object({\n type: literal('account'),\n data: object({\n address: HexChecksumAddressStruct,\n }),\n});\n\nconst PermissionRequestStruct = object({\n chainId: StrictHexStruct,\n address: optional(HexChecksumAddressStruct),\n signer: AccountSignerStruct,\n permission: PermissionStruct,\n rules: optional(union([array(RuleStruct), literal(null)])),\n});\n\nexport const RequestExecutionPermissionsStruct = array(PermissionRequestStruct);\n\n// RequestExecutionPermissions API types\nexport type RequestExecutionPermissionsRequestParams = Infer<\n typeof RequestExecutionPermissionsStruct\n>;\n\nexport type RequestExecutionPermissionsResult = Json &\n (Infer<typeof PermissionRequestStruct> & {\n context: Hex;\n })[];\n\nexport type ProcessRequestExecutionPermissionsHook = (\n request: RequestExecutionPermissionsRequestParams,\n req: JsonRpcRequest,\n) => Promise<RequestExecutionPermissionsResult>;\n\nexport function createWalletRequestExecutionPermissionsHandler({\n processRequestExecutionPermissions,\n}: {\n processRequestExecutionPermissions?: ProcessRequestExecutionPermissionsHook;\n}): JsonRpcMiddleware<JsonRpcRequest, Json, WalletMiddlewareContext> {\n return async ({ request }) => {\n if (!processRequestExecutionPermissions) {\n throw rpcErrors.methodNotSupported(\n 'wallet_requestExecutionPermissions - no middleware configured',\n );\n }\n\n const { params } = request;\n\n validateParams(params, RequestExecutionPermissionsStruct);\n\n return await processRequestExecutionPermissions(params, request);\n };\n}\n"]}
@@ -1,5 +1,7 @@
1
+ import type { JsonRpcMiddleware } from "@metamask/json-rpc-engine/v2";
1
2
  import type { Infer } from "@metamask/superstruct";
2
- import { type Hex, type Json, type JsonRpcRequest, type PendingJsonRpcResponse } from "@metamask/utils";
3
+ import { type Hex, type Json, type JsonRpcRequest } from "@metamask/utils";
4
+ import type { WalletMiddlewareContext } from "../wallet.cjs";
3
5
  declare const PermissionRequestStruct: import("@metamask/superstruct").Struct<{
4
6
  chainId: `0x${string}`;
5
7
  signer: {
@@ -124,8 +126,8 @@ export type RequestExecutionPermissionsResult = Json & (Infer<typeof PermissionR
124
126
  context: Hex;
125
127
  })[];
126
128
  export type ProcessRequestExecutionPermissionsHook = (request: RequestExecutionPermissionsRequestParams, req: JsonRpcRequest) => Promise<RequestExecutionPermissionsResult>;
127
- export declare function walletRequestExecutionPermissions(req: JsonRpcRequest, res: PendingJsonRpcResponse, { processRequestExecutionPermissions, }: {
129
+ export declare function createWalletRequestExecutionPermissionsHandler({ processRequestExecutionPermissions, }: {
128
130
  processRequestExecutionPermissions?: ProcessRequestExecutionPermissionsHook;
129
- }): Promise<void>;
131
+ }): JsonRpcMiddleware<JsonRpcRequest, Json, WalletMiddlewareContext>;
130
132
  export {};
131
133
  //# sourceMappingURL=wallet-request-execution-permissions.d.cts.map
@@ -1 +1 @@
1
- {"version":3,"file":"wallet-request-execution-permissions.d.cts","sourceRoot":"","sources":["../../src/methods/wallet-request-execution-permissions.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,KAAK,EAAE,8BAA8B;AAYnD,OAAO,EAEL,KAAK,GAAG,EACR,KAAK,IAAI,EACT,KAAK,cAAc,EACnB,KAAK,sBAAsB,EAE5B,wBAAwB;AAuBzB,QAAA,MAAM,uBAAuB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAM3B,CAAC;AAEH,eAAO,MAAM,iCAAiC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAAiC,CAAC;AAGhF,MAAM,MAAM,wCAAwC,GAAG,KAAK,CAC1D,OAAO,iCAAiC,CACzC,CAAC;AAEF,MAAM,MAAM,iCAAiC,GAAG,IAAI,GAClD,CAAC,KAAK,CAAC,OAAO,uBAAuB,CAAC,GAAG;IACvC,OAAO,EAAE,GAAG,CAAC;CACd,CAAC,EAAE,CAAC;AAEP,MAAM,MAAM,sCAAsC,GAAG,CACnD,OAAO,EAAE,wCAAwC,EACjD,GAAG,EAAE,cAAc,KAChB,OAAO,CAAC,iCAAiC,CAAC,CAAC;AAEhD,wBAAsB,iCAAiC,CACrD,GAAG,EAAE,cAAc,EACnB,GAAG,EAAE,sBAAsB,EAC3B,EACE,kCAAkC,GACnC,EAAE;IACD,kCAAkC,CAAC,EAAE,sCAAsC,CAAC;CAC7E,GACA,OAAO,CAAC,IAAI,CAAC,CAYf"}
1
+ {"version":3,"file":"wallet-request-execution-permissions.d.cts","sourceRoot":"","sources":["../../src/methods/wallet-request-execution-permissions.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,iBAAiB,EAAE,qCAAqC;AAEtE,OAAO,KAAK,EAAE,KAAK,EAAE,8BAA8B;AAYnD,OAAO,EAEL,KAAK,GAAG,EACR,KAAK,IAAI,EACT,KAAK,cAAc,EAEpB,wBAAwB;AAGzB,OAAO,KAAK,EAAE,uBAAuB,EAAE,sBAAkB;AAqBzD,QAAA,MAAM,uBAAuB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAM3B,CAAC;AAEH,eAAO,MAAM,iCAAiC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAAiC,CAAC;AAGhF,MAAM,MAAM,wCAAwC,GAAG,KAAK,CAC1D,OAAO,iCAAiC,CACzC,CAAC;AAEF,MAAM,MAAM,iCAAiC,GAAG,IAAI,GAClD,CAAC,KAAK,CAAC,OAAO,uBAAuB,CAAC,GAAG;IACvC,OAAO,EAAE,GAAG,CAAC;CACd,CAAC,EAAE,CAAC;AAEP,MAAM,MAAM,sCAAsC,GAAG,CACnD,OAAO,EAAE,wCAAwC,EACjD,GAAG,EAAE,cAAc,KAChB,OAAO,CAAC,iCAAiC,CAAC,CAAC;AAEhD,wBAAgB,8CAA8C,CAAC,EAC7D,kCAAkC,GACnC,EAAE;IACD,kCAAkC,CAAC,EAAE,sCAAsC,CAAC;CAC7E,GAAG,iBAAiB,CAAC,cAAc,EAAE,IAAI,EAAE,uBAAuB,CAAC,CAcnE"}
@@ -1,5 +1,7 @@
1
+ import type { JsonRpcMiddleware } from "@metamask/json-rpc-engine/v2";
1
2
  import type { Infer } from "@metamask/superstruct";
2
- import { type Hex, type Json, type JsonRpcRequest, type PendingJsonRpcResponse } from "@metamask/utils";
3
+ import { type Hex, type Json, type JsonRpcRequest } from "@metamask/utils";
4
+ import type { WalletMiddlewareContext } from "../wallet.mjs";
3
5
  declare const PermissionRequestStruct: import("@metamask/superstruct").Struct<{
4
6
  chainId: `0x${string}`;
5
7
  signer: {
@@ -124,8 +126,8 @@ export type RequestExecutionPermissionsResult = Json & (Infer<typeof PermissionR
124
126
  context: Hex;
125
127
  })[];
126
128
  export type ProcessRequestExecutionPermissionsHook = (request: RequestExecutionPermissionsRequestParams, req: JsonRpcRequest) => Promise<RequestExecutionPermissionsResult>;
127
- export declare function walletRequestExecutionPermissions(req: JsonRpcRequest, res: PendingJsonRpcResponse, { processRequestExecutionPermissions, }: {
129
+ export declare function createWalletRequestExecutionPermissionsHandler({ processRequestExecutionPermissions, }: {
128
130
  processRequestExecutionPermissions?: ProcessRequestExecutionPermissionsHook;
129
- }): Promise<void>;
131
+ }): JsonRpcMiddleware<JsonRpcRequest, Json, WalletMiddlewareContext>;
130
132
  export {};
131
133
  //# sourceMappingURL=wallet-request-execution-permissions.d.mts.map
@@ -1 +1 @@
1
- {"version":3,"file":"wallet-request-execution-permissions.d.mts","sourceRoot":"","sources":["../../src/methods/wallet-request-execution-permissions.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,KAAK,EAAE,8BAA8B;AAYnD,OAAO,EAEL,KAAK,GAAG,EACR,KAAK,IAAI,EACT,KAAK,cAAc,EACnB,KAAK,sBAAsB,EAE5B,wBAAwB;AAuBzB,QAAA,MAAM,uBAAuB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAM3B,CAAC;AAEH,eAAO,MAAM,iCAAiC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAAiC,CAAC;AAGhF,MAAM,MAAM,wCAAwC,GAAG,KAAK,CAC1D,OAAO,iCAAiC,CACzC,CAAC;AAEF,MAAM,MAAM,iCAAiC,GAAG,IAAI,GAClD,CAAC,KAAK,CAAC,OAAO,uBAAuB,CAAC,GAAG;IACvC,OAAO,EAAE,GAAG,CAAC;CACd,CAAC,EAAE,CAAC;AAEP,MAAM,MAAM,sCAAsC,GAAG,CACnD,OAAO,EAAE,wCAAwC,EACjD,GAAG,EAAE,cAAc,KAChB,OAAO,CAAC,iCAAiC,CAAC,CAAC;AAEhD,wBAAsB,iCAAiC,CACrD,GAAG,EAAE,cAAc,EACnB,GAAG,EAAE,sBAAsB,EAC3B,EACE,kCAAkC,GACnC,EAAE;IACD,kCAAkC,CAAC,EAAE,sCAAsC,CAAC;CAC7E,GACA,OAAO,CAAC,IAAI,CAAC,CAYf"}
1
+ {"version":3,"file":"wallet-request-execution-permissions.d.mts","sourceRoot":"","sources":["../../src/methods/wallet-request-execution-permissions.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,iBAAiB,EAAE,qCAAqC;AAEtE,OAAO,KAAK,EAAE,KAAK,EAAE,8BAA8B;AAYnD,OAAO,EAEL,KAAK,GAAG,EACR,KAAK,IAAI,EACT,KAAK,cAAc,EAEpB,wBAAwB;AAGzB,OAAO,KAAK,EAAE,uBAAuB,EAAE,sBAAkB;AAqBzD,QAAA,MAAM,uBAAuB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAM3B,CAAC;AAEH,eAAO,MAAM,iCAAiC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAAiC,CAAC;AAGhF,MAAM,MAAM,wCAAwC,GAAG,KAAK,CAC1D,OAAO,iCAAiC,CACzC,CAAC;AAEF,MAAM,MAAM,iCAAiC,GAAG,IAAI,GAClD,CAAC,KAAK,CAAC,OAAO,uBAAuB,CAAC,GAAG;IACvC,OAAO,EAAE,GAAG,CAAC;CACd,CAAC,EAAE,CAAC;AAEP,MAAM,MAAM,sCAAsC,GAAG,CACnD,OAAO,EAAE,wCAAwC,EACjD,GAAG,EAAE,cAAc,KAChB,OAAO,CAAC,iCAAiC,CAAC,CAAC;AAEhD,wBAAgB,8CAA8C,CAAC,EAC7D,kCAAkC,GACnC,EAAE;IACD,kCAAkC,CAAC,EAAE,sCAAsC,CAAC;CAC7E,GAAG,iBAAiB,CAAC,cAAc,EAAE,IAAI,EAAE,uBAAuB,CAAC,CAcnE"}
@@ -26,12 +26,14 @@ const PermissionRequestStruct = object({
26
26
  rules: optional(union([array(RuleStruct), literal(null)])),
27
27
  });
28
28
  export const RequestExecutionPermissionsStruct = array(PermissionRequestStruct);
29
- export async function walletRequestExecutionPermissions(req, res, { processRequestExecutionPermissions, }) {
30
- if (!processRequestExecutionPermissions) {
31
- throw rpcErrors.methodNotSupported('wallet_requestExecutionPermissions - no middleware configured');
32
- }
33
- const { params } = req;
34
- validateParams(params, RequestExecutionPermissionsStruct);
35
- res.result = await processRequestExecutionPermissions(params, req);
29
+ export function createWalletRequestExecutionPermissionsHandler({ processRequestExecutionPermissions, }) {
30
+ return async ({ request }) => {
31
+ if (!processRequestExecutionPermissions) {
32
+ throw rpcErrors.methodNotSupported('wallet_requestExecutionPermissions - no middleware configured');
33
+ }
34
+ const { params } = request;
35
+ validateParams(params, RequestExecutionPermissionsStruct);
36
+ return await processRequestExecutionPermissions(params, request);
37
+ };
36
38
  }
37
39
  //# sourceMappingURL=wallet-request-execution-permissions.mjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"wallet-request-execution-permissions.mjs","sourceRoot":"","sources":["../../src/methods/wallet-request-execution-permissions.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,6BAA6B;AAEjD,OAAO,EACL,KAAK,EACL,OAAO,EACP,OAAO,EACP,MAAM,EACN,QAAQ,EACR,MAAM,EACN,MAAM,EACN,KAAK,EACL,OAAO,EACR,8BAA8B;AAC/B,OAAO,EACL,wBAAwB,EAKxB,eAAe,EAChB,wBAAwB;AAEzB,OAAO,EAAE,cAAc,EAAE,gCAA4B;AAErD,MAAM,gBAAgB,GAAG,MAAM,CAAC;IAC9B,IAAI,EAAE,MAAM,EAAE;IACd,mBAAmB,EAAE,OAAO,EAAE;IAC9B,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,EAAE,OAAO,EAAE,CAAC;CAClC,CAAC,CAAC;AAEH,MAAM,UAAU,GAAG,MAAM,CAAC;IACxB,IAAI,EAAE,MAAM,EAAE;IACd,mBAAmB,EAAE,OAAO,EAAE;IAC9B,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,EAAE,OAAO,EAAE,CAAC;CAClC,CAAC,CAAC;AAEH,MAAM,mBAAmB,GAAG,MAAM,CAAC;IACjC,IAAI,EAAE,OAAO,CAAC,SAAS,CAAC;IACxB,IAAI,EAAE,MAAM,CAAC;QACX,OAAO,EAAE,wBAAwB;KAClC,CAAC;CACH,CAAC,CAAC;AAEH,MAAM,uBAAuB,GAAG,MAAM,CAAC;IACrC,OAAO,EAAE,eAAe;IACxB,OAAO,EAAE,QAAQ,CAAC,wBAAwB,CAAC;IAC3C,MAAM,EAAE,mBAAmB;IAC3B,UAAU,EAAE,gBAAgB;IAC5B,KAAK,EAAE,QAAQ,CAAC,KAAK,CAAC,CAAC,KAAK,CAAC,UAAU,CAAC,EAAE,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;CAC3D,CAAC,CAAC;AAEH,MAAM,CAAC,MAAM,iCAAiC,GAAG,KAAK,CAAC,uBAAuB,CAAC,CAAC;AAiBhF,MAAM,CAAC,KAAK,UAAU,iCAAiC,CACrD,GAAmB,EACnB,GAA2B,EAC3B,EACE,kCAAkC,GAGnC;IAED,IAAI,CAAC,kCAAkC,EAAE;QACvC,MAAM,SAAS,CAAC,kBAAkB,CAChC,+DAA+D,CAChE,CAAC;KACH;IAED,MAAM,EAAE,MAAM,EAAE,GAAG,GAAG,CAAC;IAEvB,cAAc,CAAC,MAAM,EAAE,iCAAiC,CAAC,CAAC;IAE1D,GAAG,CAAC,MAAM,GAAG,MAAM,kCAAkC,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;AACrE,CAAC","sourcesContent":["import { rpcErrors } from '@metamask/rpc-errors';\nimport type { Infer } from '@metamask/superstruct';\nimport {\n array,\n boolean,\n literal,\n object,\n optional,\n record,\n string,\n union,\n unknown,\n} from '@metamask/superstruct';\nimport {\n HexChecksumAddressStruct,\n type Hex,\n type Json,\n type JsonRpcRequest,\n type PendingJsonRpcResponse,\n StrictHexStruct,\n} from '@metamask/utils';\n\nimport { validateParams } from '../utils/validation';\n\nconst PermissionStruct = object({\n type: string(),\n isAdjustmentAllowed: boolean(),\n data: record(string(), unknown()),\n});\n\nconst RuleStruct = object({\n type: string(),\n isAdjustmentAllowed: boolean(),\n data: record(string(), unknown()),\n});\n\nconst AccountSignerStruct = object({\n type: literal('account'),\n data: object({\n address: HexChecksumAddressStruct,\n }),\n});\n\nconst PermissionRequestStruct = object({\n chainId: StrictHexStruct,\n address: optional(HexChecksumAddressStruct),\n signer: AccountSignerStruct,\n permission: PermissionStruct,\n rules: optional(union([array(RuleStruct), literal(null)])),\n});\n\nexport const RequestExecutionPermissionsStruct = array(PermissionRequestStruct);\n\n// RequestExecutionPermissions API types\nexport type RequestExecutionPermissionsRequestParams = Infer<\n typeof RequestExecutionPermissionsStruct\n>;\n\nexport type RequestExecutionPermissionsResult = Json &\n (Infer<typeof PermissionRequestStruct> & {\n context: Hex;\n })[];\n\nexport type ProcessRequestExecutionPermissionsHook = (\n request: RequestExecutionPermissionsRequestParams,\n req: JsonRpcRequest,\n) => Promise<RequestExecutionPermissionsResult>;\n\nexport async function walletRequestExecutionPermissions(\n req: JsonRpcRequest,\n res: PendingJsonRpcResponse,\n {\n processRequestExecutionPermissions,\n }: {\n processRequestExecutionPermissions?: ProcessRequestExecutionPermissionsHook;\n },\n): Promise<void> {\n if (!processRequestExecutionPermissions) {\n throw rpcErrors.methodNotSupported(\n 'wallet_requestExecutionPermissions - no middleware configured',\n );\n }\n\n const { params } = req;\n\n validateParams(params, RequestExecutionPermissionsStruct);\n\n res.result = await processRequestExecutionPermissions(params, req);\n}\n"]}
1
+ {"version":3,"file":"wallet-request-execution-permissions.mjs","sourceRoot":"","sources":["../../src/methods/wallet-request-execution-permissions.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,SAAS,EAAE,6BAA6B;AAEjD,OAAO,EACL,KAAK,EACL,OAAO,EACP,OAAO,EACP,MAAM,EACN,QAAQ,EACR,MAAM,EACN,MAAM,EACN,KAAK,EACL,OAAO,EACR,8BAA8B;AAC/B,OAAO,EACL,wBAAwB,EAIxB,eAAe,EAChB,wBAAwB;AAEzB,OAAO,EAAE,cAAc,EAAE,gCAA4B;AAGrD,MAAM,gBAAgB,GAAG,MAAM,CAAC;IAC9B,IAAI,EAAE,MAAM,EAAE;IACd,mBAAmB,EAAE,OAAO,EAAE;IAC9B,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,EAAE,OAAO,EAAE,CAAC;CAClC,CAAC,CAAC;AAEH,MAAM,UAAU,GAAG,MAAM,CAAC;IACxB,IAAI,EAAE,MAAM,EAAE;IACd,mBAAmB,EAAE,OAAO,EAAE;IAC9B,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,EAAE,OAAO,EAAE,CAAC;CAClC,CAAC,CAAC;AAEH,MAAM,mBAAmB,GAAG,MAAM,CAAC;IACjC,IAAI,EAAE,OAAO,CAAC,SAAS,CAAC;IACxB,IAAI,EAAE,MAAM,CAAC;QACX,OAAO,EAAE,wBAAwB;KAClC,CAAC;CACH,CAAC,CAAC;AAEH,MAAM,uBAAuB,GAAG,MAAM,CAAC;IACrC,OAAO,EAAE,eAAe;IACxB,OAAO,EAAE,QAAQ,CAAC,wBAAwB,CAAC;IAC3C,MAAM,EAAE,mBAAmB;IAC3B,UAAU,EAAE,gBAAgB;IAC5B,KAAK,EAAE,QAAQ,CAAC,KAAK,CAAC,CAAC,KAAK,CAAC,UAAU,CAAC,EAAE,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;CAC3D,CAAC,CAAC;AAEH,MAAM,CAAC,MAAM,iCAAiC,GAAG,KAAK,CAAC,uBAAuB,CAAC,CAAC;AAiBhF,MAAM,UAAU,8CAA8C,CAAC,EAC7D,kCAAkC,GAGnC;IACC,OAAO,KAAK,EAAE,EAAE,OAAO,EAAE,EAAE,EAAE;QAC3B,IAAI,CAAC,kCAAkC,EAAE;YACvC,MAAM,SAAS,CAAC,kBAAkB,CAChC,+DAA+D,CAChE,CAAC;SACH;QAED,MAAM,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC;QAE3B,cAAc,CAAC,MAAM,EAAE,iCAAiC,CAAC,CAAC;QAE1D,OAAO,MAAM,kCAAkC,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACnE,CAAC,CAAC;AACJ,CAAC","sourcesContent":["import type { JsonRpcMiddleware } from '@metamask/json-rpc-engine/v2';\nimport { rpcErrors } from '@metamask/rpc-errors';\nimport type { Infer } from '@metamask/superstruct';\nimport {\n array,\n boolean,\n literal,\n object,\n optional,\n record,\n string,\n union,\n unknown,\n} from '@metamask/superstruct';\nimport {\n HexChecksumAddressStruct,\n type Hex,\n type Json,\n type JsonRpcRequest,\n StrictHexStruct,\n} from '@metamask/utils';\n\nimport { validateParams } from '../utils/validation';\nimport type { WalletMiddlewareContext } from '../wallet';\n\nconst PermissionStruct = object({\n type: string(),\n isAdjustmentAllowed: boolean(),\n data: record(string(), unknown()),\n});\n\nconst RuleStruct = object({\n type: string(),\n isAdjustmentAllowed: boolean(),\n data: record(string(), unknown()),\n});\n\nconst AccountSignerStruct = object({\n type: literal('account'),\n data: object({\n address: HexChecksumAddressStruct,\n }),\n});\n\nconst PermissionRequestStruct = object({\n chainId: StrictHexStruct,\n address: optional(HexChecksumAddressStruct),\n signer: AccountSignerStruct,\n permission: PermissionStruct,\n rules: optional(union([array(RuleStruct), literal(null)])),\n});\n\nexport const RequestExecutionPermissionsStruct = array(PermissionRequestStruct);\n\n// RequestExecutionPermissions API types\nexport type RequestExecutionPermissionsRequestParams = Infer<\n typeof RequestExecutionPermissionsStruct\n>;\n\nexport type RequestExecutionPermissionsResult = Json &\n (Infer<typeof PermissionRequestStruct> & {\n context: Hex;\n })[];\n\nexport type ProcessRequestExecutionPermissionsHook = (\n request: RequestExecutionPermissionsRequestParams,\n req: JsonRpcRequest,\n) => Promise<RequestExecutionPermissionsResult>;\n\nexport function createWalletRequestExecutionPermissionsHandler({\n processRequestExecutionPermissions,\n}: {\n processRequestExecutionPermissions?: ProcessRequestExecutionPermissionsHook;\n}): JsonRpcMiddleware<JsonRpcRequest, Json, WalletMiddlewareContext> {\n return async ({ request }) => {\n if (!processRequestExecutionPermissions) {\n throw rpcErrors.methodNotSupported(\n 'wallet_requestExecutionPermissions - no middleware configured',\n );\n }\n\n const { params } = request;\n\n validateParams(params, RequestExecutionPermissionsStruct);\n\n return await processRequestExecutionPermissions(params, request);\n };\n}\n"]}
@@ -1,20 +1,23 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.walletRevokeExecutionPermission = exports.RevokeExecutionPermissionRequestParamsStruct = exports.RevokeExecutionPermissionResultStruct = void 0;
3
+ exports.createWalletRevokeExecutionPermissionHandler = exports.RevokeExecutionPermissionRequestParamsStruct = exports.RevokeExecutionPermissionResultStruct = void 0;
4
4
  const rpc_errors_1 = require("@metamask/rpc-errors");
5
+ const superstruct_1 = require("@metamask/superstruct");
5
6
  const utils_1 = require("@metamask/utils");
6
7
  const validation_1 = require("../utils/validation.cjs");
7
- exports.RevokeExecutionPermissionResultStruct = (0, utils_1.object)({});
8
- exports.RevokeExecutionPermissionRequestParamsStruct = (0, utils_1.object)({
8
+ exports.RevokeExecutionPermissionResultStruct = (0, superstruct_1.object)({});
9
+ exports.RevokeExecutionPermissionRequestParamsStruct = (0, superstruct_1.object)({
9
10
  permissionContext: utils_1.StrictHexStruct,
10
11
  });
11
- async function walletRevokeExecutionPermission(req, res, { processRevokeExecutionPermission, }) {
12
- if (!processRevokeExecutionPermission) {
13
- throw rpc_errors_1.rpcErrors.methodNotSupported('wallet_revokeExecutionPermission - no middleware configured');
14
- }
15
- const { params } = req;
16
- (0, validation_1.validateParams)(params, exports.RevokeExecutionPermissionRequestParamsStruct);
17
- res.result = await processRevokeExecutionPermission(params, req);
12
+ function createWalletRevokeExecutionPermissionHandler({ processRevokeExecutionPermission, }) {
13
+ return async ({ request }) => {
14
+ if (!processRevokeExecutionPermission) {
15
+ throw rpc_errors_1.rpcErrors.methodNotSupported('wallet_revokeExecutionPermission - no middleware configured');
16
+ }
17
+ const { params } = request;
18
+ (0, validation_1.validateParams)(params, exports.RevokeExecutionPermissionRequestParamsStruct);
19
+ return await processRevokeExecutionPermission(params, request);
20
+ };
18
21
  }
19
- exports.walletRevokeExecutionPermission = walletRevokeExecutionPermission;
22
+ exports.createWalletRevokeExecutionPermissionHandler = createWalletRevokeExecutionPermissionHandler;
20
23
  //# sourceMappingURL=wallet-revoke-execution-permission.cjs.map