@metamask-previews/eth-json-rpc-middleware 21.0.0-preview-70abd50a → 21.0.0-preview-536ed51
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +3 -0
- package/dist/block-cache.cjs +41 -32
- package/dist/block-cache.cjs.map +1 -1
- package/dist/block-cache.d.cts +12 -3
- package/dist/block-cache.d.cts.map +1 -1
- package/dist/block-cache.d.mts +12 -3
- package/dist/block-cache.d.mts.map +1 -1
- package/dist/block-cache.mjs +41 -32
- package/dist/block-cache.mjs.map +1 -1
- package/dist/block-ref-rewrite.cjs +12 -8
- package/dist/block-ref-rewrite.cjs.map +1 -1
- package/dist/block-ref-rewrite.d.cts +3 -3
- package/dist/block-ref-rewrite.d.cts.map +1 -1
- package/dist/block-ref-rewrite.d.mts +3 -3
- package/dist/block-ref-rewrite.d.mts.map +1 -1
- package/dist/block-ref-rewrite.mjs +12 -8
- package/dist/block-ref-rewrite.mjs.map +1 -1
- package/dist/block-ref.cjs +17 -10
- package/dist/block-ref.cjs.map +1 -1
- package/dist/block-ref.d.cts +12 -3
- package/dist/block-ref.d.cts.map +1 -1
- package/dist/block-ref.d.mts +12 -3
- package/dist/block-ref.d.mts.map +1 -1
- package/dist/block-ref.mjs +17 -10
- package/dist/block-ref.mjs.map +1 -1
- package/dist/block-tracker-inspector.cjs +28 -25
- package/dist/block-tracker-inspector.cjs.map +1 -1
- package/dist/block-tracker-inspector.d.cts +3 -3
- package/dist/block-tracker-inspector.d.cts.map +1 -1
- package/dist/block-tracker-inspector.d.mts +3 -3
- package/dist/block-tracker-inspector.d.mts.map +1 -1
- package/dist/block-tracker-inspector.mjs +28 -25
- package/dist/block-tracker-inspector.mjs.map +1 -1
- package/dist/fetch.cjs +8 -12
- package/dist/fetch.cjs.map +1 -1
- package/dist/fetch.d.cts +5 -3
- package/dist/fetch.d.cts.map +1 -1
- package/dist/fetch.d.mts +5 -3
- package/dist/fetch.d.mts.map +1 -1
- package/dist/fetch.mjs +8 -12
- package/dist/fetch.mjs.map +1 -1
- package/dist/inflight-cache.cjs +61 -45
- package/dist/inflight-cache.cjs.map +1 -1
- package/dist/inflight-cache.d.cts +12 -3
- package/dist/inflight-cache.d.cts.map +1 -1
- package/dist/inflight-cache.d.mts +12 -3
- package/dist/inflight-cache.d.mts.map +1 -1
- package/dist/inflight-cache.mjs +61 -45
- package/dist/inflight-cache.mjs.map +1 -1
- package/dist/methods/wallet-request-execution-permissions.cjs +20 -9
- package/dist/methods/wallet-request-execution-permissions.cjs.map +1 -1
- package/dist/methods/wallet-request-execution-permissions.d.cts +14 -3
- package/dist/methods/wallet-request-execution-permissions.d.cts.map +1 -1
- package/dist/methods/wallet-request-execution-permissions.d.mts +14 -3
- package/dist/methods/wallet-request-execution-permissions.d.mts.map +1 -1
- package/dist/methods/wallet-request-execution-permissions.mjs +18 -7
- package/dist/methods/wallet-request-execution-permissions.mjs.map +1 -1
- package/dist/methods/wallet-revoke-execution-permission.cjs +23 -11
- package/dist/methods/wallet-revoke-execution-permission.cjs.map +1 -1
- package/dist/methods/wallet-revoke-execution-permission.d.cts +19 -5
- package/dist/methods/wallet-revoke-execution-permission.d.cts.map +1 -1
- package/dist/methods/wallet-revoke-execution-permission.d.mts +19 -5
- package/dist/methods/wallet-revoke-execution-permission.d.mts.map +1 -1
- package/dist/methods/wallet-revoke-execution-permission.mjs +20 -8
- package/dist/methods/wallet-revoke-execution-permission.mjs.map +1 -1
- package/dist/providerAsMiddleware.cjs +18 -1
- package/dist/providerAsMiddleware.cjs.map +1 -1
- package/dist/providerAsMiddleware.d.cts +18 -3
- package/dist/providerAsMiddleware.d.cts.map +1 -1
- package/dist/providerAsMiddleware.d.mts +18 -3
- package/dist/providerAsMiddleware.d.mts.map +1 -1
- package/dist/providerAsMiddleware.mjs +16 -0
- package/dist/providerAsMiddleware.mjs.map +1 -1
- package/dist/retryOnEmpty.cjs +8 -11
- package/dist/retryOnEmpty.cjs.map +1 -1
- package/dist/retryOnEmpty.d.cts +3 -3
- package/dist/retryOnEmpty.d.cts.map +1 -1
- package/dist/retryOnEmpty.d.mts +3 -3
- package/dist/retryOnEmpty.d.mts.map +1 -1
- package/dist/retryOnEmpty.mjs +8 -11
- package/dist/retryOnEmpty.mjs.map +1 -1
- package/dist/types.cjs.map +1 -1
- package/dist/types.d.cts +0 -5
- package/dist/types.d.cts.map +1 -1
- package/dist/types.d.mts +0 -5
- package/dist/types.d.mts.map +1 -1
- package/dist/types.mjs.map +1 -1
- package/dist/utils/error.cjs +7 -0
- package/dist/utils/error.cjs.map +1 -1
- package/dist/utils/error.d.cts +7 -0
- package/dist/utils/error.d.cts.map +1 -1
- package/dist/utils/error.d.mts +7 -0
- package/dist/utils/error.d.mts.map +1 -1
- package/dist/utils/error.mjs +7 -0
- package/dist/utils/error.mjs.map +1 -1
- package/dist/utils/validation.cjs +34 -2
- package/dist/utils/validation.cjs.map +1 -1
- package/dist/utils/validation.d.cts +29 -3
- package/dist/utils/validation.d.cts.map +1 -1
- package/dist/utils/validation.d.mts +29 -3
- package/dist/utils/validation.d.mts.map +1 -1
- package/dist/utils/validation.mjs +34 -2
- package/dist/utils/validation.mjs.map +1 -1
- package/dist/wallet.cjs +199 -92
- package/dist/wallet.cjs.map +1 -1
- package/dist/wallet.d.cts +35 -8
- package/dist/wallet.d.cts.map +1 -1
- package/dist/wallet.d.mts +35 -8
- package/dist/wallet.d.mts.map +1 -1
- package/dist/wallet.mjs +200 -93
- package/dist/wallet.mjs.map +1 -1
- package/package.json +2 -1
package/dist/fetch.d.cts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"fetch.d.cts","sourceRoot":"","sources":["../src/fetch.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,
|
|
1
|
+
{"version":3,"file":"fetch.d.cts","sourceRoot":"","sources":["../src/fetch.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,iBAAiB,EACjB,iBAAiB,EAClB,qCAAqC;AAEtC,OAAO,KAAK,EAAE,IAAI,EAAE,cAAc,EAAE,wBAAwB;AAG5D,OAAO,KAAK,EAAE,sBAAsB,EAAE,oBAAgB;AAEtD;;;;;;;;;;;GAWG;AACH,wBAAgB,qBAAqB,CAAC,EACpC,UAAU,EACV,OAAY,GACb,EAAE;IACD,UAAU,EAAE,sBAAsB,CAAC;IACnC,OAAO,CAAC,EAAE;QACR,mBAAmB,CAAC,EAAE,MAAM,CAAC;KAC9B,CAAC;CACH,GAAG,iBAAiB,CACnB,cAAc,EACd,IAAI,EACJ,iBAAiB,CAAC;IAAE,MAAM,EAAE,MAAM,CAAA;CAAE,CAAC,CACtC,CA4BA"}
|
package/dist/fetch.d.mts
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import type { JsonRpcMiddleware } from "@metamask/json-rpc-engine";
|
|
2
|
-
import type { Json,
|
|
1
|
+
import type { JsonRpcMiddleware, MiddlewareContext } from "@metamask/json-rpc-engine/v2";
|
|
2
|
+
import type { Json, JsonRpcRequest } from "@metamask/utils";
|
|
3
3
|
import type { AbstractRpcServiceLike } from "./types.mjs";
|
|
4
4
|
/**
|
|
5
5
|
* Creates middleware for sending a JSON-RPC request through the given RPC
|
|
@@ -18,5 +18,7 @@ export declare function createFetchMiddleware({ rpcService, options, }: {
|
|
|
18
18
|
options?: {
|
|
19
19
|
originHttpHeaderKey?: string;
|
|
20
20
|
};
|
|
21
|
-
}): JsonRpcMiddleware<
|
|
21
|
+
}): JsonRpcMiddleware<JsonRpcRequest, Json, MiddlewareContext<{
|
|
22
|
+
origin: string;
|
|
23
|
+
}>>;
|
|
22
24
|
//# sourceMappingURL=fetch.d.mts.map
|
package/dist/fetch.d.mts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"fetch.d.mts","sourceRoot":"","sources":["../src/fetch.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,
|
|
1
|
+
{"version":3,"file":"fetch.d.mts","sourceRoot":"","sources":["../src/fetch.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,iBAAiB,EACjB,iBAAiB,EAClB,qCAAqC;AAEtC,OAAO,KAAK,EAAE,IAAI,EAAE,cAAc,EAAE,wBAAwB;AAG5D,OAAO,KAAK,EAAE,sBAAsB,EAAE,oBAAgB;AAEtD;;;;;;;;;;;GAWG;AACH,wBAAgB,qBAAqB,CAAC,EACpC,UAAU,EACV,OAAY,GACb,EAAE;IACD,UAAU,EAAE,sBAAsB,CAAC;IACnC,OAAO,CAAC,EAAE;QACR,mBAAmB,CAAC,EAAE,MAAM,CAAC;KAC9B,CAAC;CACH,GAAG,iBAAiB,CACnB,cAAc,EACd,IAAI,EACJ,iBAAiB,CAAC;IAAE,MAAM,EAAE,MAAM,CAAA;CAAE,CAAC,CACtC,CA4BA"}
|
package/dist/fetch.mjs
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import { createAsyncMiddleware } from "@metamask/json-rpc-engine";
|
|
2
1
|
import { rpcErrors } from "@metamask/rpc-errors";
|
|
2
|
+
import { klona } from "klona";
|
|
3
3
|
/**
|
|
4
4
|
* Creates middleware for sending a JSON-RPC request through the given RPC
|
|
5
5
|
* service.
|
|
@@ -13,18 +13,14 @@ import { rpcErrors } from "@metamask/rpc-errors";
|
|
|
13
13
|
* @returns The fetch middleware.
|
|
14
14
|
*/
|
|
15
15
|
export function createFetchMiddleware({ rpcService, options = {}, }) {
|
|
16
|
-
return
|
|
16
|
+
return async ({ request, context }) => {
|
|
17
|
+
const origin = context.get('origin');
|
|
17
18
|
const headers = 'originHttpHeaderKey' in options &&
|
|
18
19
|
options.originHttpHeaderKey !== undefined &&
|
|
19
|
-
|
|
20
|
-
? { [options.originHttpHeaderKey]:
|
|
20
|
+
origin !== undefined
|
|
21
|
+
? { [options.originHttpHeaderKey]: origin }
|
|
21
22
|
: {};
|
|
22
|
-
const jsonRpcResponse = await rpcService.request({
|
|
23
|
-
id: req.id,
|
|
24
|
-
jsonrpc: req.jsonrpc,
|
|
25
|
-
method: req.method,
|
|
26
|
-
params: req.params,
|
|
27
|
-
}, {
|
|
23
|
+
const jsonRpcResponse = await rpcService.request(klona(request), {
|
|
28
24
|
headers,
|
|
29
25
|
});
|
|
30
26
|
// NOTE: We intentionally do not test to see if `jsonRpcResponse.error` is
|
|
@@ -38,7 +34,7 @@ export function createFetchMiddleware({ rpcService, options = {}, }) {
|
|
|
38
34
|
}
|
|
39
35
|
// Discard the `id` and `jsonrpc` fields in the response body
|
|
40
36
|
// (the JSON-RPC engine will fill those in)
|
|
41
|
-
|
|
42
|
-
}
|
|
37
|
+
return jsonRpcResponse.result;
|
|
38
|
+
};
|
|
43
39
|
}
|
|
44
40
|
//# sourceMappingURL=fetch.mjs.map
|
package/dist/fetch.mjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"fetch.mjs","sourceRoot":"","sources":["../src/fetch.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"fetch.mjs","sourceRoot":"","sources":["../src/fetch.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,SAAS,EAAE,6BAA6B;AAEjD,OAAO,EAAE,KAAK,EAAE,cAAc;AAI9B;;;;;;;;;;;GAWG;AACH,MAAM,UAAU,qBAAqB,CAAC,EACpC,UAAU,EACV,OAAO,GAAG,EAAE,GAMb;IAKC,OAAO,KAAK,EAAE,EAAE,OAAO,EAAE,OAAO,EAAE,EAAE,EAAE;QACpC,MAAM,MAAM,GAAG,OAAO,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;QACrC,MAAM,OAAO,GACX,qBAAqB,IAAI,OAAO;YAChC,OAAO,CAAC,mBAAmB,KAAK,SAAS;YACzC,MAAM,KAAK,SAAS;YAClB,CAAC,CAAC,EAAE,CAAC,OAAO,CAAC,mBAAmB,CAAC,EAAE,MAAM,EAAE;YAC3C,CAAC,CAAC,EAAE,CAAC;QAET,MAAM,eAAe,GAAG,MAAM,UAAU,CAAC,OAAO,CAAC,KAAK,CAAC,OAAO,CAAC,EAAE;YAC/D,OAAO;SACR,CAAC,CAAC;QAEH,0EAA0E;QAC1E,4CAA4C;QAC5C,sEAAsE;QACtE,uEAAuE;QACvE,IAAI,OAAO,IAAI,eAAe,EAAE;YAC9B,MAAM,SAAS,CAAC,QAAQ,CAAC;gBACvB,IAAI,EAAE,eAAe,CAAC,KAAK;aAC5B,CAAC,CAAC;SACJ;QAED,6DAA6D;QAC7D,2CAA2C;QAC3C,OAAO,eAAe,CAAC,MAAM,CAAC;IAChC,CAAC,CAAC;AACJ,CAAC","sourcesContent":["import type {\n JsonRpcMiddleware,\n MiddlewareContext,\n} from '@metamask/json-rpc-engine/v2';\nimport { rpcErrors } from '@metamask/rpc-errors';\nimport type { Json, JsonRpcRequest } from '@metamask/utils';\nimport { klona } from 'klona';\n\nimport type { AbstractRpcServiceLike } from './types';\n\n/**\n * Creates middleware for sending a JSON-RPC request through the given RPC\n * service.\n *\n * @param args - The arguments to this function.\n * @param args.rpcService - The RPC service to use.\n * @param args.options - Options.\n * @param args.options.originHttpHeaderKey - If provided, the origin field for\n * each JSON-RPC request will be attached to each outgoing fetch request under\n * this header.\n * @returns The fetch middleware.\n */\nexport function createFetchMiddleware({\n rpcService,\n options = {},\n}: {\n rpcService: AbstractRpcServiceLike;\n options?: {\n originHttpHeaderKey?: string;\n };\n}): JsonRpcMiddleware<\n JsonRpcRequest,\n Json,\n MiddlewareContext<{ origin: string }>\n> {\n return async ({ request, context }) => {\n const origin = context.get('origin');\n const headers =\n 'originHttpHeaderKey' in options &&\n options.originHttpHeaderKey !== undefined &&\n origin !== undefined\n ? { [options.originHttpHeaderKey]: origin }\n : {};\n\n const jsonRpcResponse = await rpcService.request(klona(request), {\n headers,\n });\n\n // NOTE: We intentionally do not test to see if `jsonRpcResponse.error` is\n // strictly a JSON-RPC error response as per\n // <https://www.jsonrpc.org/specification#error_object> to account for\n // Ganache returning error objects with extra properties such as `name`\n if ('error' in jsonRpcResponse) {\n throw rpcErrors.internal({\n data: jsonRpcResponse.error,\n });\n }\n\n // Discard the `id` and `jsonrpc` fields in the response body\n // (the JSON-RPC engine will fill those in)\n return jsonRpcResponse.result;\n };\n}\n"]}
|
package/dist/inflight-cache.cjs
CHANGED
|
@@ -1,23 +1,26 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
exports.createInflightCacheMiddleware = void 0;
|
|
4
|
-
const
|
|
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
|
|
12
|
-
|
|
13
|
-
if (req.skipCache) {
|
|
17
|
+
return async ({ request, context, next }) => {
|
|
18
|
+
if (context.get('skipCache')) {
|
|
14
19
|
return next();
|
|
15
20
|
}
|
|
16
|
-
|
|
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',
|
|
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,
|
|
30
|
-
await createActiveRequestHandler(
|
|
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',
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
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
|
-
|
|
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((
|
|
61
|
-
|
|
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":";;;
|
|
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 {
|
|
2
|
-
import type
|
|
3
|
-
|
|
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":"
|
|
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 {
|
|
2
|
-
import type
|
|
3
|
-
|
|
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":"
|
|
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"}
|
package/dist/inflight-cache.mjs
CHANGED
|
@@ -1,20 +1,23 @@
|
|
|
1
|
-
import {
|
|
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
|
|
9
|
-
|
|
10
|
-
if (req.skipCache) {
|
|
14
|
+
return async ({ request, context, next }) => {
|
|
15
|
+
if (context.get('skipCache')) {
|
|
11
16
|
return next();
|
|
12
17
|
}
|
|
13
|
-
|
|
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',
|
|
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,
|
|
27
|
-
await createActiveRequestHandler(
|
|
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',
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
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
|
-
|
|
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((
|
|
58
|
-
|
|
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
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
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":"
|
|
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.
|
|
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,24 @@ 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
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
32
|
+
/**
|
|
33
|
+
* Creates a handler for the `wallet_requestExecutionPermissions` JSON-RPC method.
|
|
34
|
+
*
|
|
35
|
+
* @param options - The options for the handler.
|
|
36
|
+
* @param options.processRequestExecutionPermissions - The function to process the
|
|
37
|
+
* request execution permissions request.
|
|
38
|
+
* @returns A JSON-RPC middleware function that handles the
|
|
39
|
+
* `wallet_requestExecutionPermissions` JSON-RPC method.
|
|
40
|
+
*/
|
|
41
|
+
function createWalletRequestExecutionPermissionsHandler({ processRequestExecutionPermissions, }) {
|
|
42
|
+
return async ({ request }) => {
|
|
43
|
+
if (!processRequestExecutionPermissions) {
|
|
44
|
+
throw rpc_errors_1.rpcErrors.methodNotSupported('wallet_requestExecutionPermissions - no middleware configured');
|
|
45
|
+
}
|
|
46
|
+
const { params } = request;
|
|
47
|
+
(0, validation_1.validateParams)(params, exports.RequestExecutionPermissionsStruct);
|
|
48
|
+
return await processRequestExecutionPermissions(params, request);
|
|
49
|
+
};
|
|
39
50
|
}
|
|
40
|
-
exports.
|
|
51
|
+
exports.createWalletRequestExecutionPermissionsHandler = createWalletRequestExecutionPermissionsHandler;
|
|
41
52
|
//# 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":";;;
|
|
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;;;;;;;;GAQG;AACH,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\n/**\n * Creates a handler for the `wallet_requestExecutionPermissions` JSON-RPC method.\n *\n * @param options - The options for the handler.\n * @param options.processRequestExecutionPermissions - The function to process the\n * request execution permissions request.\n * @returns A JSON-RPC middleware function that handles the\n * `wallet_requestExecutionPermissions` JSON-RPC method.\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
|
|
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,17 @@ 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
|
-
|
|
129
|
+
/**
|
|
130
|
+
* Creates a handler for the `wallet_requestExecutionPermissions` JSON-RPC method.
|
|
131
|
+
*
|
|
132
|
+
* @param options - The options for the handler.
|
|
133
|
+
* @param options.processRequestExecutionPermissions - The function to process the
|
|
134
|
+
* request execution permissions request.
|
|
135
|
+
* @returns A JSON-RPC middleware function that handles the
|
|
136
|
+
* `wallet_requestExecutionPermissions` JSON-RPC method.
|
|
137
|
+
*/
|
|
138
|
+
export declare function createWalletRequestExecutionPermissionsHandler({ processRequestExecutionPermissions, }: {
|
|
128
139
|
processRequestExecutionPermissions?: ProcessRequestExecutionPermissionsHook;
|
|
129
|
-
}):
|
|
140
|
+
}): JsonRpcMiddleware<JsonRpcRequest, Json, WalletMiddlewareContext>;
|
|
130
141
|
export {};
|
|
131
142
|
//# 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":"
|
|
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;;;;;;;;GAQG;AACH,wBAAgB,8CAA8C,CAAC,EAC7D,kCAAkC,GACnC,EAAE;IACD,kCAAkC,CAAC,EAAE,sCAAsC,CAAC;CAC7E,GAAG,iBAAiB,CAAC,cAAc,EAAE,IAAI,EAAE,uBAAuB,CAAC,CAcnE"}
|