@metamask-previews/json-rpc-engine 10.2.4-preview-95a687acf → 10.3.0-preview-53e60e1a5
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 +10 -3
- package/dist/createMethodMiddleware.cjs +56 -0
- package/dist/createMethodMiddleware.cjs.map +1 -0
- package/dist/createMethodMiddleware.d.cts +86 -0
- package/dist/createMethodMiddleware.d.cts.map +1 -0
- package/dist/createMethodMiddleware.d.mts +86 -0
- package/dist/createMethodMiddleware.d.mts.map +1 -0
- package/dist/createMethodMiddleware.mjs +52 -0
- package/dist/createMethodMiddleware.mjs.map +1 -0
- package/dist/index.cjs +3 -1
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +2 -0
- package/dist/index.d.cts.map +1 -1
- package/dist/index.d.mts +2 -0
- package/dist/index.d.mts.map +1 -1
- package/dist/index.mjs +1 -0
- package/dist/index.mjs.map +1 -1
- package/dist/v2/createMethodMiddleware.cjs +8 -31
- package/dist/v2/createMethodMiddleware.cjs.map +1 -1
- package/dist/v2/createMethodMiddleware.d.cts +13 -16
- package/dist/v2/createMethodMiddleware.d.cts.map +1 -1
- package/dist/v2/createMethodMiddleware.d.mts +13 -16
- package/dist/v2/createMethodMiddleware.d.mts.map +1 -1
- package/dist/v2/createMethodMiddleware.mjs +6 -28
- package/dist/v2/createMethodMiddleware.mjs.map +1 -1
- package/dist/v2/index.cjs +2 -2
- package/dist/v2/index.cjs.map +1 -1
- package/dist/v2/index.d.cts +3 -3
- package/dist/v2/index.d.cts.map +1 -1
- package/dist/v2/index.d.mts +3 -3
- package/dist/v2/index.d.mts.map +1 -1
- package/dist/v2/index.mjs +2 -2
- package/dist/v2/index.mjs.map +1 -1
- package/dist/v2/utils.cjs +71 -1
- package/dist/v2/utils.cjs.map +1 -1
- package/dist/v2/utils.d.cts +40 -0
- package/dist/v2/utils.d.cts.map +1 -1
- package/dist/v2/utils.d.mts +40 -0
- package/dist/v2/utils.d.mts.map +1 -1
- package/dist/v2/utils.mjs +67 -0
- package/dist/v2/utils.mjs.map +1 -1
- package/package.json +1 -1
package/CHANGELOG.md
CHANGED
|
@@ -7,11 +7,17 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
|
|
|
7
7
|
|
|
8
8
|
## [Unreleased]
|
|
9
9
|
|
|
10
|
+
## [10.3.0]
|
|
11
|
+
|
|
10
12
|
### Added
|
|
11
13
|
|
|
12
14
|
- Add `createOriginMiddleware` utility to `v2` ([#8522](https://github.com/MetaMask/core/pull/8522))
|
|
13
|
-
- Add `createMethodMiddleware` utility to `v2` ([#8506](https://github.com/MetaMask/core/pull/8506))
|
|
15
|
+
- Add `createMethodMiddleware` utility to `v2` ([#8506](https://github.com/MetaMask/core/pull/8506), [#8583](https://github.com/MetaMask/core/pull/8583))
|
|
14
16
|
- This utility allows JSON-RPC method implementations to use both the hooks pattern and the messenger.
|
|
17
|
+
- Add legacy `createMethodMiddleware` ([#8583](https://github.com/MetaMask/core/pull/8583))
|
|
18
|
+
- Consolidates bespoke `makeMethodMiddlewareMaker` implementations from the MetaMask extension and mobile clients.
|
|
19
|
+
- Handlers may now declare `actionNames` and receive a delegated messenger as the sixth argument to `implementation`, mirroring the v2 `createMethodMiddleware`.
|
|
20
|
+
- Deprecated in favor of the v2 `createMethodMiddleware`.
|
|
15
21
|
|
|
16
22
|
### Changed
|
|
17
23
|
|
|
@@ -112,7 +118,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
|
|
|
112
118
|
["Are the Types Wrong?"](https://arethetypeswrong.github.io/) tool as
|
|
113
119
|
["masquerading as CJS"](https://github.com/arethetypeswrong/arethetypeswrong.github.io/blob/main/docs/problems/FalseCJS.md).
|
|
114
120
|
All of the ATTW checks now pass.
|
|
115
|
-
- Remove chunk files ([#4648](https://github.com/MetaMask/core/pull/4648))
|
|
121
|
+
- Remove chunk files. ([#4648](https://github.com/MetaMask/core/pull/4648))
|
|
116
122
|
- Previously, the build tool we used to generate JavaScript files extracted
|
|
117
123
|
common code to "chunk" files. While this was intended to make this package
|
|
118
124
|
more tree-shakeable, it also made debugging more difficult for our
|
|
@@ -292,7 +298,8 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
|
|
|
292
298
|
This change may affect consumers that depend on the eager execution of middleware _during_ request processing, _outside of_ middleware functions and request handlers.
|
|
293
299
|
- In general, it is a bad practice to work with state that depends on middleware execution, while the middleware are executing.
|
|
294
300
|
|
|
295
|
-
[Unreleased]: https://github.com/MetaMask/core/compare/@metamask/json-rpc-engine@10.
|
|
301
|
+
[Unreleased]: https://github.com/MetaMask/core/compare/@metamask/json-rpc-engine@10.3.0...HEAD
|
|
302
|
+
[10.3.0]: https://github.com/MetaMask/core/compare/@metamask/json-rpc-engine@10.2.4...@metamask/json-rpc-engine@10.3.0
|
|
296
303
|
[10.2.4]: https://github.com/MetaMask/core/compare/@metamask/json-rpc-engine@10.2.3...@metamask/json-rpc-engine@10.2.4
|
|
297
304
|
[10.2.3]: https://github.com/MetaMask/core/compare/@metamask/json-rpc-engine@10.2.2...@metamask/json-rpc-engine@10.2.3
|
|
298
305
|
[10.2.2]: https://github.com/MetaMask/core/compare/@metamask/json-rpc-engine@10.2.1...@metamask/json-rpc-engine@10.2.2
|
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.createMethodMiddleware = void 0;
|
|
4
|
+
const rpc_errors_1 = require("@metamask/rpc-errors");
|
|
5
|
+
const utils_1 = require("./v2/utils.cjs");
|
|
6
|
+
/**
|
|
7
|
+
* Create a JSON-RPC middleware that handles the passed JSON-RPC method handlers using the messenger and hooks.
|
|
8
|
+
*
|
|
9
|
+
* @deprecated Use the v2 `createMethodMiddleware` instead.
|
|
10
|
+
* @param options The options.
|
|
11
|
+
* @param options.handlers - The JSON-RPC method handler implementations.
|
|
12
|
+
* @param options.messenger - The messenger to be used by the handlers.
|
|
13
|
+
* @param options.hooks - The hooks to be used by the handlers.
|
|
14
|
+
* @returns A JsonRpcEngineV2 middleware.
|
|
15
|
+
*/
|
|
16
|
+
function createMethodMiddleware(options) {
|
|
17
|
+
const { messenger: rootMessenger, onError } = options;
|
|
18
|
+
const allHooks = options.hooks;
|
|
19
|
+
const expectedHookNames = new Set(Object.values(options.handlers).flatMap((handler) => handler.hookNames ? Object.getOwnPropertyNames(handler.hookNames) : []));
|
|
20
|
+
(0, utils_1.assertExpectedHooks)(allHooks, expectedHookNames);
|
|
21
|
+
const handlers = Object.entries(options.handlers).reduce((accumulator, [handlerName, handler]) => {
|
|
22
|
+
const handlerHooks = (0, utils_1.selectHooks)(allHooks, handler.hookNames) ?? {};
|
|
23
|
+
const handlerMessenger = (0, utils_1.createHandlerMessenger)({
|
|
24
|
+
namespace: handlerName,
|
|
25
|
+
actionNames: handler.actionNames,
|
|
26
|
+
rootMessenger,
|
|
27
|
+
});
|
|
28
|
+
accumulator[handlerName] = {
|
|
29
|
+
implementation: handler.implementation,
|
|
30
|
+
hooks: handlerHooks,
|
|
31
|
+
messenger: handlerMessenger,
|
|
32
|
+
};
|
|
33
|
+
return accumulator;
|
|
34
|
+
}, {});
|
|
35
|
+
// This should technically use createAsyncMiddleware, but we get around this by catching
|
|
36
|
+
// all handler errors.
|
|
37
|
+
// eslint-disable-next-line @typescript-eslint/no-misused-promises
|
|
38
|
+
return async (req, res, next, end) => {
|
|
39
|
+
const handler = handlers[req.method];
|
|
40
|
+
if (!handler) {
|
|
41
|
+
return next();
|
|
42
|
+
}
|
|
43
|
+
const { implementation, hooks: handlerHooks, messenger } = handler;
|
|
44
|
+
try {
|
|
45
|
+
return await implementation(req, res, next, end, handlerHooks, messenger);
|
|
46
|
+
}
|
|
47
|
+
catch (error) {
|
|
48
|
+
onError?.(error, req);
|
|
49
|
+
return end(error instanceof Error
|
|
50
|
+
? error
|
|
51
|
+
: rpc_errors_1.rpcErrors.internal({ data: error }));
|
|
52
|
+
}
|
|
53
|
+
};
|
|
54
|
+
}
|
|
55
|
+
exports.createMethodMiddleware = createMethodMiddleware;
|
|
56
|
+
//# sourceMappingURL=createMethodMiddleware.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"createMethodMiddleware.cjs","sourceRoot":"","sources":["../src/createMethodMiddleware.ts"],"names":[],"mappings":";;;AAEA,qDAAiD;AAajD,0CAKoB;AAwIpB;;;;;;;;;GASG;AACH,SAAgB,sBAAsB,CAGpC,OAAgD;IAEhD,MAAM,EAAE,SAAS,EAAE,aAAa,EAAE,OAAO,EAAE,GAAG,OAAO,CAAC;IACtD,MAAM,QAAQ,GAAG,OAAO,CAAC,KAAgC,CAAC;IAE1D,MAAM,iBAAiB,GAAG,IAAI,GAAG,CAC/B,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE,CAClD,OAAO,CAAC,SAAS,CAAC,CAAC,CAAC,MAAM,CAAC,mBAAmB,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,EAAE,CACvE,CACF,CAAC;IACF,IAAA,2BAAmB,EAAC,QAAQ,EAAE,iBAAiB,CAAC,CAAC;IAEjD,MAAM,QAAQ,GAAG,MAAM,CAAC,OAAO,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC,MAAM,CAEtD,CAAC,WAAW,EAAE,CAAC,WAAW,EAAE,OAAO,CAAC,EAAE,EAAE;QACxC,MAAM,YAAY,GAAG,IAAA,mBAAW,EAAC,QAAQ,EAAE,OAAO,CAAC,SAAS,CAAC,IAAI,EAAE,CAAC;QACpE,MAAM,gBAAgB,GAAG,IAAA,8BAAsB,EAE7C;YACA,SAAS,EAAE,WAAW;YACtB,WAAW,EAAE,OAAO,CAAC,WAER;YACb,aAAa;SACd,CAAC,CAAC;QAEH,WAAW,CAAC,WAAW,CAAC,GAAG;YACzB,cAAc,EAAE,OAAO,CAAC,cAAc;YACtC,KAAK,EAAE,YAAY;YACnB,SAAS,EAAE,gBAAgB;SAC5B,CAAC;QACF,OAAO,WAAW,CAAC;IACrB,CAAC,EAAE,EAAE,CAAC,CAAC;IAEP,wFAAwF;IACxF,sBAAsB;IACtB,kEAAkE;IAClE,OAAO,KAAK,EAAE,GAAG,EAAE,GAAG,EAAE,IAAI,EAAE,GAAG,EAAE,EAAE;QACnC,MAAM,OAAO,GAAG,QAAQ,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;QACrC,IAAI,CAAC,OAAO,EAAE,CAAC;YACb,OAAO,IAAI,EAAE,CAAC;QAChB,CAAC;QAED,MAAM,EAAE,cAAc,EAAE,KAAK,EAAE,YAAY,EAAE,SAAS,EAAE,GAAG,OAAO,CAAC;QACnE,IAAI,CAAC;YACH,OAAO,MAAM,cAAc,CAAC,GAAG,EAAE,GAAG,EAAE,IAAI,EAAE,GAAG,EAAE,YAAY,EAAE,SAAS,CAAC,CAAC;QAC5E,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,OAAO,EAAE,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC;YACtB,OAAO,GAAG,CACR,KAAK,YAAY,KAAK;gBACpB,CAAC,CAAC,KAAK;gBACP,CAAC,CAAC,sBAAS,CAAC,QAAQ,CAAC,EAAE,IAAI,EAAE,KAAa,EAAE,CAAC,CAChD,CAAC;QACJ,CAAC;IACH,CAAC,CAAC;AACJ,CAAC;AA1DD,wDA0DC","sourcesContent":["import type { ActionConstraint } from '@metamask/messenger';\nimport type { Messenger } from '@metamask/messenger';\nimport { rpcErrors } from '@metamask/rpc-errors';\nimport type {\n Json,\n JsonRpcParams,\n JsonRpcRequest,\n PendingJsonRpcResponse,\n} from '@metamask/utils';\n\nimport type {\n JsonRpcEngineEndCallback,\n JsonRpcEngineNextCallback,\n JsonRpcMiddleware,\n} from './JsonRpcEngine';\nimport {\n assertExpectedHooks,\n createHandlerMessenger,\n selectHooks,\n UnionToIntersection,\n} from './v2/utils';\n\ntype HandlerActions<Handler> = Handler extends {\n implementation: (...args: infer Args) => unknown;\n}\n ? Args extends [\n unknown,\n unknown,\n unknown,\n unknown,\n unknown,\n infer HandlerMessenger,\n ]\n ? HandlerMessenger extends Messenger<string, infer Actions>\n ? Actions\n : never\n : never\n : never;\n\ntype HandlerHooks<Handler> = Handler extends {\n implementation: (...args: infer Args) => unknown;\n}\n ? Args extends [\n unknown,\n unknown,\n unknown,\n unknown,\n infer ArgHooks,\n ...unknown[],\n ]\n ? ArgHooks extends Record<string, unknown>\n ? ArgHooks\n : never\n : never\n : never;\n\n/**\n * A {@link MethodHandler} implementation.\n *\n * @deprecated Use the v2 `createMethodMiddleware` instead.\n */\nexport type MethodHandlerImplementation<\n Hooks extends Record<string, unknown> = never,\n MessengerActions extends ActionConstraint = never,\n Params extends JsonRpcParams = JsonRpcParams,\n Result extends Json = Json,\n RequestExtras extends Record<string, unknown> = Record<string, unknown>,\n> = (\n req: JsonRpcRequest<Params> & RequestExtras,\n res: PendingJsonRpcResponse<Result>,\n next: JsonRpcEngineNextCallback,\n end: JsonRpcEngineEndCallback,\n hooks: Hooks,\n messenger: Messenger<string, MessengerActions>,\n) => Promise<void> | void;\n\n/**\n * A handler for {@link createMethodMiddleware}.\n *\n * @deprecated Use the v2 `createMethodMiddleware` instead.\n */\nexport type MethodHandler<\n Hooks extends Record<string, unknown> = never,\n MessengerActions extends ActionConstraint = never,\n Params extends JsonRpcParams = JsonRpcParams,\n Result extends Json = Json,\n RequestExtras extends Record<string, unknown> = Record<string, unknown>,\n> = {\n implementation: MethodHandlerImplementation<\n Hooks,\n MessengerActions,\n Params,\n Result,\n RequestExtras\n >;\n} & ([Hooks] extends [never]\n ? { hookNames?: undefined }\n : { hookNames: { [Key in keyof Hooks]: true } }) &\n ([MessengerActions] extends [never]\n ? { actionNames?: undefined }\n : { actionNames: readonly MessengerActions['type'][] });\n\ntype AnyMethodHandler = {\n implementation(\n this: void,\n req: JsonRpcRequest,\n res: PendingJsonRpcResponse,\n next: JsonRpcEngineNextCallback,\n end: JsonRpcEngineEndCallback,\n hooks: unknown,\n messenger: unknown,\n ): Promise<void> | void;\n hookNames?: Record<string, true>;\n actionNames?: readonly string[];\n};\n\ntype CreateMethodMiddlewareBaseOptions<\n Handlers extends Record<string, AnyMethodHandler>,\n> = {\n handlers: Handlers;\n // Due to a quirk of TypeScript's inference over generics, the hooks property must\n // be present even if no hooks are needed. Otherwise, TypeScript will fail to infer\n // the correct type for the messenger property. `Record<string, never>` is the\n // (hopefully) least confusing way to satisfy this requirement.\n hooks: [HandlerHooks<Handlers[keyof Handlers]>] extends [never]\n ? Record<string, never>\n : UnionToIntersection<HandlerHooks<Handlers[keyof Handlers]>>;\n /**\n * Called when a handler throws, before the error is forwarded to `end`.\n * Intended for logging; must not throw.\n */\n onError?: (error: unknown, request: JsonRpcRequest) => void;\n};\n\n/**\n * Options for {@link createMethodMiddleware}.\n *\n * @deprecated Use the v2 `createMethodMiddleware` instead.\n */\nexport type CreateMethodMiddlewareOptions<\n Handlers extends Record<string, AnyMethodHandler>,\n> = CreateMethodMiddlewareBaseOptions<Handlers> &\n ([HandlerActions<Handlers[keyof Handlers]>] extends [never]\n ? {\n messenger?: undefined;\n }\n : {\n messenger: Messenger<string, HandlerActions<Handlers[keyof Handlers]>>;\n });\n\ntype ResolvedHandler = {\n implementation: AnyMethodHandler['implementation'];\n hooks: Record<string, unknown>;\n messenger?: Messenger<string, ActionConstraint> | undefined;\n};\n\n/**\n * Create a JSON-RPC middleware that handles the passed JSON-RPC method handlers using the messenger and hooks.\n *\n * @deprecated Use the v2 `createMethodMiddleware` instead.\n * @param options The options.\n * @param options.handlers - The JSON-RPC method handler implementations.\n * @param options.messenger - The messenger to be used by the handlers.\n * @param options.hooks - The hooks to be used by the handlers.\n * @returns A JsonRpcEngineV2 middleware.\n */\nexport function createMethodMiddleware<\n Handlers extends Record<string, AnyMethodHandler>,\n>(\n options: CreateMethodMiddlewareOptions<Handlers>,\n): JsonRpcMiddleware<JsonRpcParams, Json> {\n const { messenger: rootMessenger, onError } = options;\n const allHooks = options.hooks as Record<string, unknown>;\n\n const expectedHookNames = new Set(\n Object.values(options.handlers).flatMap((handler) =>\n handler.hookNames ? Object.getOwnPropertyNames(handler.hookNames) : [],\n ),\n );\n assertExpectedHooks(allHooks, expectedHookNames);\n\n const handlers = Object.entries(options.handlers).reduce<\n Record<string, ResolvedHandler>\n >((accumulator, [handlerName, handler]) => {\n const handlerHooks = selectHooks(allHooks, handler.hookNames) ?? {};\n const handlerMessenger = createHandlerMessenger<\n HandlerActions<Handlers[keyof Handlers]>\n >({\n namespace: handlerName,\n actionNames: handler.actionNames as\n | readonly HandlerActions<Handlers[keyof Handlers]>['type'][]\n | undefined,\n rootMessenger,\n });\n\n accumulator[handlerName] = {\n implementation: handler.implementation,\n hooks: handlerHooks,\n messenger: handlerMessenger,\n };\n return accumulator;\n }, {});\n\n // This should technically use createAsyncMiddleware, but we get around this by catching\n // all handler errors.\n // eslint-disable-next-line @typescript-eslint/no-misused-promises\n return async (req, res, next, end) => {\n const handler = handlers[req.method];\n if (!handler) {\n return next();\n }\n\n const { implementation, hooks: handlerHooks, messenger } = handler;\n try {\n return await implementation(req, res, next, end, handlerHooks, messenger);\n } catch (error) {\n onError?.(error, req);\n return end(\n error instanceof Error\n ? error\n : rpcErrors.internal({ data: error as Json }),\n );\n }\n };\n}\n"]}
|
|
@@ -0,0 +1,86 @@
|
|
|
1
|
+
import type { ActionConstraint } from "@metamask/messenger";
|
|
2
|
+
import type { Messenger } from "@metamask/messenger";
|
|
3
|
+
import type { Json, JsonRpcParams, JsonRpcRequest, PendingJsonRpcResponse } from "@metamask/utils";
|
|
4
|
+
import type { JsonRpcEngineEndCallback, JsonRpcEngineNextCallback, JsonRpcMiddleware } from "./JsonRpcEngine.cjs";
|
|
5
|
+
import { UnionToIntersection } from "./v2/utils.cjs";
|
|
6
|
+
type HandlerActions<Handler> = Handler extends {
|
|
7
|
+
implementation: (...args: infer Args) => unknown;
|
|
8
|
+
} ? Args extends [
|
|
9
|
+
unknown,
|
|
10
|
+
unknown,
|
|
11
|
+
unknown,
|
|
12
|
+
unknown,
|
|
13
|
+
unknown,
|
|
14
|
+
infer HandlerMessenger
|
|
15
|
+
] ? HandlerMessenger extends Messenger<string, infer Actions> ? Actions : never : never : never;
|
|
16
|
+
type HandlerHooks<Handler> = Handler extends {
|
|
17
|
+
implementation: (...args: infer Args) => unknown;
|
|
18
|
+
} ? Args extends [
|
|
19
|
+
unknown,
|
|
20
|
+
unknown,
|
|
21
|
+
unknown,
|
|
22
|
+
unknown,
|
|
23
|
+
infer ArgHooks,
|
|
24
|
+
...unknown[]
|
|
25
|
+
] ? ArgHooks extends Record<string, unknown> ? ArgHooks : never : never : never;
|
|
26
|
+
/**
|
|
27
|
+
* A {@link MethodHandler} implementation.
|
|
28
|
+
*
|
|
29
|
+
* @deprecated Use the v2 `createMethodMiddleware` instead.
|
|
30
|
+
*/
|
|
31
|
+
export type MethodHandlerImplementation<Hooks extends Record<string, unknown> = never, MessengerActions extends ActionConstraint = never, Params extends JsonRpcParams = JsonRpcParams, Result extends Json = Json, RequestExtras extends Record<string, unknown> = Record<string, unknown>> = (req: JsonRpcRequest<Params> & RequestExtras, res: PendingJsonRpcResponse<Result>, next: JsonRpcEngineNextCallback, end: JsonRpcEngineEndCallback, hooks: Hooks, messenger: Messenger<string, MessengerActions>) => Promise<void> | void;
|
|
32
|
+
/**
|
|
33
|
+
* A handler for {@link createMethodMiddleware}.
|
|
34
|
+
*
|
|
35
|
+
* @deprecated Use the v2 `createMethodMiddleware` instead.
|
|
36
|
+
*/
|
|
37
|
+
export type MethodHandler<Hooks extends Record<string, unknown> = never, MessengerActions extends ActionConstraint = never, Params extends JsonRpcParams = JsonRpcParams, Result extends Json = Json, RequestExtras extends Record<string, unknown> = Record<string, unknown>> = {
|
|
38
|
+
implementation: MethodHandlerImplementation<Hooks, MessengerActions, Params, Result, RequestExtras>;
|
|
39
|
+
} & ([Hooks] extends [never] ? {
|
|
40
|
+
hookNames?: undefined;
|
|
41
|
+
} : {
|
|
42
|
+
hookNames: {
|
|
43
|
+
[Key in keyof Hooks]: true;
|
|
44
|
+
};
|
|
45
|
+
}) & ([MessengerActions] extends [never] ? {
|
|
46
|
+
actionNames?: undefined;
|
|
47
|
+
} : {
|
|
48
|
+
actionNames: readonly MessengerActions['type'][];
|
|
49
|
+
});
|
|
50
|
+
type AnyMethodHandler = {
|
|
51
|
+
implementation(this: void, req: JsonRpcRequest, res: PendingJsonRpcResponse, next: JsonRpcEngineNextCallback, end: JsonRpcEngineEndCallback, hooks: unknown, messenger: unknown): Promise<void> | void;
|
|
52
|
+
hookNames?: Record<string, true>;
|
|
53
|
+
actionNames?: readonly string[];
|
|
54
|
+
};
|
|
55
|
+
type CreateMethodMiddlewareBaseOptions<Handlers extends Record<string, AnyMethodHandler>> = {
|
|
56
|
+
handlers: Handlers;
|
|
57
|
+
hooks: [HandlerHooks<Handlers[keyof Handlers]>] extends [never] ? Record<string, never> : UnionToIntersection<HandlerHooks<Handlers[keyof Handlers]>>;
|
|
58
|
+
/**
|
|
59
|
+
* Called when a handler throws, before the error is forwarded to `end`.
|
|
60
|
+
* Intended for logging; must not throw.
|
|
61
|
+
*/
|
|
62
|
+
onError?: (error: unknown, request: JsonRpcRequest) => void;
|
|
63
|
+
};
|
|
64
|
+
/**
|
|
65
|
+
* Options for {@link createMethodMiddleware}.
|
|
66
|
+
*
|
|
67
|
+
* @deprecated Use the v2 `createMethodMiddleware` instead.
|
|
68
|
+
*/
|
|
69
|
+
export type CreateMethodMiddlewareOptions<Handlers extends Record<string, AnyMethodHandler>> = CreateMethodMiddlewareBaseOptions<Handlers> & ([HandlerActions<Handlers[keyof Handlers]>] extends [never] ? {
|
|
70
|
+
messenger?: undefined;
|
|
71
|
+
} : {
|
|
72
|
+
messenger: Messenger<string, HandlerActions<Handlers[keyof Handlers]>>;
|
|
73
|
+
});
|
|
74
|
+
/**
|
|
75
|
+
* Create a JSON-RPC middleware that handles the passed JSON-RPC method handlers using the messenger and hooks.
|
|
76
|
+
*
|
|
77
|
+
* @deprecated Use the v2 `createMethodMiddleware` instead.
|
|
78
|
+
* @param options The options.
|
|
79
|
+
* @param options.handlers - The JSON-RPC method handler implementations.
|
|
80
|
+
* @param options.messenger - The messenger to be used by the handlers.
|
|
81
|
+
* @param options.hooks - The hooks to be used by the handlers.
|
|
82
|
+
* @returns A JsonRpcEngineV2 middleware.
|
|
83
|
+
*/
|
|
84
|
+
export declare function createMethodMiddleware<Handlers extends Record<string, AnyMethodHandler>>(options: CreateMethodMiddlewareOptions<Handlers>): JsonRpcMiddleware<JsonRpcParams, Json>;
|
|
85
|
+
export {};
|
|
86
|
+
//# sourceMappingURL=createMethodMiddleware.d.cts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"createMethodMiddleware.d.cts","sourceRoot":"","sources":["../src/createMethodMiddleware.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,86 @@
|
|
|
1
|
+
import type { ActionConstraint } from "@metamask/messenger";
|
|
2
|
+
import type { Messenger } from "@metamask/messenger";
|
|
3
|
+
import type { Json, JsonRpcParams, JsonRpcRequest, PendingJsonRpcResponse } from "@metamask/utils";
|
|
4
|
+
import type { JsonRpcEngineEndCallback, JsonRpcEngineNextCallback, JsonRpcMiddleware } from "./JsonRpcEngine.mjs";
|
|
5
|
+
import { UnionToIntersection } from "./v2/utils.mjs";
|
|
6
|
+
type HandlerActions<Handler> = Handler extends {
|
|
7
|
+
implementation: (...args: infer Args) => unknown;
|
|
8
|
+
} ? Args extends [
|
|
9
|
+
unknown,
|
|
10
|
+
unknown,
|
|
11
|
+
unknown,
|
|
12
|
+
unknown,
|
|
13
|
+
unknown,
|
|
14
|
+
infer HandlerMessenger
|
|
15
|
+
] ? HandlerMessenger extends Messenger<string, infer Actions> ? Actions : never : never : never;
|
|
16
|
+
type HandlerHooks<Handler> = Handler extends {
|
|
17
|
+
implementation: (...args: infer Args) => unknown;
|
|
18
|
+
} ? Args extends [
|
|
19
|
+
unknown,
|
|
20
|
+
unknown,
|
|
21
|
+
unknown,
|
|
22
|
+
unknown,
|
|
23
|
+
infer ArgHooks,
|
|
24
|
+
...unknown[]
|
|
25
|
+
] ? ArgHooks extends Record<string, unknown> ? ArgHooks : never : never : never;
|
|
26
|
+
/**
|
|
27
|
+
* A {@link MethodHandler} implementation.
|
|
28
|
+
*
|
|
29
|
+
* @deprecated Use the v2 `createMethodMiddleware` instead.
|
|
30
|
+
*/
|
|
31
|
+
export type MethodHandlerImplementation<Hooks extends Record<string, unknown> = never, MessengerActions extends ActionConstraint = never, Params extends JsonRpcParams = JsonRpcParams, Result extends Json = Json, RequestExtras extends Record<string, unknown> = Record<string, unknown>> = (req: JsonRpcRequest<Params> & RequestExtras, res: PendingJsonRpcResponse<Result>, next: JsonRpcEngineNextCallback, end: JsonRpcEngineEndCallback, hooks: Hooks, messenger: Messenger<string, MessengerActions>) => Promise<void> | void;
|
|
32
|
+
/**
|
|
33
|
+
* A handler for {@link createMethodMiddleware}.
|
|
34
|
+
*
|
|
35
|
+
* @deprecated Use the v2 `createMethodMiddleware` instead.
|
|
36
|
+
*/
|
|
37
|
+
export type MethodHandler<Hooks extends Record<string, unknown> = never, MessengerActions extends ActionConstraint = never, Params extends JsonRpcParams = JsonRpcParams, Result extends Json = Json, RequestExtras extends Record<string, unknown> = Record<string, unknown>> = {
|
|
38
|
+
implementation: MethodHandlerImplementation<Hooks, MessengerActions, Params, Result, RequestExtras>;
|
|
39
|
+
} & ([Hooks] extends [never] ? {
|
|
40
|
+
hookNames?: undefined;
|
|
41
|
+
} : {
|
|
42
|
+
hookNames: {
|
|
43
|
+
[Key in keyof Hooks]: true;
|
|
44
|
+
};
|
|
45
|
+
}) & ([MessengerActions] extends [never] ? {
|
|
46
|
+
actionNames?: undefined;
|
|
47
|
+
} : {
|
|
48
|
+
actionNames: readonly MessengerActions['type'][];
|
|
49
|
+
});
|
|
50
|
+
type AnyMethodHandler = {
|
|
51
|
+
implementation(this: void, req: JsonRpcRequest, res: PendingJsonRpcResponse, next: JsonRpcEngineNextCallback, end: JsonRpcEngineEndCallback, hooks: unknown, messenger: unknown): Promise<void> | void;
|
|
52
|
+
hookNames?: Record<string, true>;
|
|
53
|
+
actionNames?: readonly string[];
|
|
54
|
+
};
|
|
55
|
+
type CreateMethodMiddlewareBaseOptions<Handlers extends Record<string, AnyMethodHandler>> = {
|
|
56
|
+
handlers: Handlers;
|
|
57
|
+
hooks: [HandlerHooks<Handlers[keyof Handlers]>] extends [never] ? Record<string, never> : UnionToIntersection<HandlerHooks<Handlers[keyof Handlers]>>;
|
|
58
|
+
/**
|
|
59
|
+
* Called when a handler throws, before the error is forwarded to `end`.
|
|
60
|
+
* Intended for logging; must not throw.
|
|
61
|
+
*/
|
|
62
|
+
onError?: (error: unknown, request: JsonRpcRequest) => void;
|
|
63
|
+
};
|
|
64
|
+
/**
|
|
65
|
+
* Options for {@link createMethodMiddleware}.
|
|
66
|
+
*
|
|
67
|
+
* @deprecated Use the v2 `createMethodMiddleware` instead.
|
|
68
|
+
*/
|
|
69
|
+
export type CreateMethodMiddlewareOptions<Handlers extends Record<string, AnyMethodHandler>> = CreateMethodMiddlewareBaseOptions<Handlers> & ([HandlerActions<Handlers[keyof Handlers]>] extends [never] ? {
|
|
70
|
+
messenger?: undefined;
|
|
71
|
+
} : {
|
|
72
|
+
messenger: Messenger<string, HandlerActions<Handlers[keyof Handlers]>>;
|
|
73
|
+
});
|
|
74
|
+
/**
|
|
75
|
+
* Create a JSON-RPC middleware that handles the passed JSON-RPC method handlers using the messenger and hooks.
|
|
76
|
+
*
|
|
77
|
+
* @deprecated Use the v2 `createMethodMiddleware` instead.
|
|
78
|
+
* @param options The options.
|
|
79
|
+
* @param options.handlers - The JSON-RPC method handler implementations.
|
|
80
|
+
* @param options.messenger - The messenger to be used by the handlers.
|
|
81
|
+
* @param options.hooks - The hooks to be used by the handlers.
|
|
82
|
+
* @returns A JsonRpcEngineV2 middleware.
|
|
83
|
+
*/
|
|
84
|
+
export declare function createMethodMiddleware<Handlers extends Record<string, AnyMethodHandler>>(options: CreateMethodMiddlewareOptions<Handlers>): JsonRpcMiddleware<JsonRpcParams, Json>;
|
|
85
|
+
export {};
|
|
86
|
+
//# sourceMappingURL=createMethodMiddleware.d.mts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"createMethodMiddleware.d.mts","sourceRoot":"","sources":["../src/createMethodMiddleware.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
import { rpcErrors } from "@metamask/rpc-errors";
|
|
2
|
+
import { assertExpectedHooks, createHandlerMessenger, selectHooks } from "./v2/utils.mjs";
|
|
3
|
+
/**
|
|
4
|
+
* Create a JSON-RPC middleware that handles the passed JSON-RPC method handlers using the messenger and hooks.
|
|
5
|
+
*
|
|
6
|
+
* @deprecated Use the v2 `createMethodMiddleware` instead.
|
|
7
|
+
* @param options The options.
|
|
8
|
+
* @param options.handlers - The JSON-RPC method handler implementations.
|
|
9
|
+
* @param options.messenger - The messenger to be used by the handlers.
|
|
10
|
+
* @param options.hooks - The hooks to be used by the handlers.
|
|
11
|
+
* @returns A JsonRpcEngineV2 middleware.
|
|
12
|
+
*/
|
|
13
|
+
export function createMethodMiddleware(options) {
|
|
14
|
+
const { messenger: rootMessenger, onError } = options;
|
|
15
|
+
const allHooks = options.hooks;
|
|
16
|
+
const expectedHookNames = new Set(Object.values(options.handlers).flatMap((handler) => handler.hookNames ? Object.getOwnPropertyNames(handler.hookNames) : []));
|
|
17
|
+
assertExpectedHooks(allHooks, expectedHookNames);
|
|
18
|
+
const handlers = Object.entries(options.handlers).reduce((accumulator, [handlerName, handler]) => {
|
|
19
|
+
const handlerHooks = selectHooks(allHooks, handler.hookNames) ?? {};
|
|
20
|
+
const handlerMessenger = createHandlerMessenger({
|
|
21
|
+
namespace: handlerName,
|
|
22
|
+
actionNames: handler.actionNames,
|
|
23
|
+
rootMessenger,
|
|
24
|
+
});
|
|
25
|
+
accumulator[handlerName] = {
|
|
26
|
+
implementation: handler.implementation,
|
|
27
|
+
hooks: handlerHooks,
|
|
28
|
+
messenger: handlerMessenger,
|
|
29
|
+
};
|
|
30
|
+
return accumulator;
|
|
31
|
+
}, {});
|
|
32
|
+
// This should technically use createAsyncMiddleware, but we get around this by catching
|
|
33
|
+
// all handler errors.
|
|
34
|
+
// eslint-disable-next-line @typescript-eslint/no-misused-promises
|
|
35
|
+
return async (req, res, next, end) => {
|
|
36
|
+
const handler = handlers[req.method];
|
|
37
|
+
if (!handler) {
|
|
38
|
+
return next();
|
|
39
|
+
}
|
|
40
|
+
const { implementation, hooks: handlerHooks, messenger } = handler;
|
|
41
|
+
try {
|
|
42
|
+
return await implementation(req, res, next, end, handlerHooks, messenger);
|
|
43
|
+
}
|
|
44
|
+
catch (error) {
|
|
45
|
+
onError?.(error, req);
|
|
46
|
+
return end(error instanceof Error
|
|
47
|
+
? error
|
|
48
|
+
: rpcErrors.internal({ data: error }));
|
|
49
|
+
}
|
|
50
|
+
};
|
|
51
|
+
}
|
|
52
|
+
//# sourceMappingURL=createMethodMiddleware.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"createMethodMiddleware.mjs","sourceRoot":"","sources":["../src/createMethodMiddleware.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,SAAS,EAAE,6BAA6B;AAajD,OAAO,EACL,mBAAmB,EACnB,sBAAsB,EACtB,WAAW,EAEZ,uBAAmB;AAwIpB;;;;;;;;;GASG;AACH,MAAM,UAAU,sBAAsB,CAGpC,OAAgD;IAEhD,MAAM,EAAE,SAAS,EAAE,aAAa,EAAE,OAAO,EAAE,GAAG,OAAO,CAAC;IACtD,MAAM,QAAQ,GAAG,OAAO,CAAC,KAAgC,CAAC;IAE1D,MAAM,iBAAiB,GAAG,IAAI,GAAG,CAC/B,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE,CAClD,OAAO,CAAC,SAAS,CAAC,CAAC,CAAC,MAAM,CAAC,mBAAmB,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,EAAE,CACvE,CACF,CAAC;IACF,mBAAmB,CAAC,QAAQ,EAAE,iBAAiB,CAAC,CAAC;IAEjD,MAAM,QAAQ,GAAG,MAAM,CAAC,OAAO,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC,MAAM,CAEtD,CAAC,WAAW,EAAE,CAAC,WAAW,EAAE,OAAO,CAAC,EAAE,EAAE;QACxC,MAAM,YAAY,GAAG,WAAW,CAAC,QAAQ,EAAE,OAAO,CAAC,SAAS,CAAC,IAAI,EAAE,CAAC;QACpE,MAAM,gBAAgB,GAAG,sBAAsB,CAE7C;YACA,SAAS,EAAE,WAAW;YACtB,WAAW,EAAE,OAAO,CAAC,WAER;YACb,aAAa;SACd,CAAC,CAAC;QAEH,WAAW,CAAC,WAAW,CAAC,GAAG;YACzB,cAAc,EAAE,OAAO,CAAC,cAAc;YACtC,KAAK,EAAE,YAAY;YACnB,SAAS,EAAE,gBAAgB;SAC5B,CAAC;QACF,OAAO,WAAW,CAAC;IACrB,CAAC,EAAE,EAAE,CAAC,CAAC;IAEP,wFAAwF;IACxF,sBAAsB;IACtB,kEAAkE;IAClE,OAAO,KAAK,EAAE,GAAG,EAAE,GAAG,EAAE,IAAI,EAAE,GAAG,EAAE,EAAE;QACnC,MAAM,OAAO,GAAG,QAAQ,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;QACrC,IAAI,CAAC,OAAO,EAAE,CAAC;YACb,OAAO,IAAI,EAAE,CAAC;QAChB,CAAC;QAED,MAAM,EAAE,cAAc,EAAE,KAAK,EAAE,YAAY,EAAE,SAAS,EAAE,GAAG,OAAO,CAAC;QACnE,IAAI,CAAC;YACH,OAAO,MAAM,cAAc,CAAC,GAAG,EAAE,GAAG,EAAE,IAAI,EAAE,GAAG,EAAE,YAAY,EAAE,SAAS,CAAC,CAAC;QAC5E,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,OAAO,EAAE,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC;YACtB,OAAO,GAAG,CACR,KAAK,YAAY,KAAK;gBACpB,CAAC,CAAC,KAAK;gBACP,CAAC,CAAC,SAAS,CAAC,QAAQ,CAAC,EAAE,IAAI,EAAE,KAAa,EAAE,CAAC,CAChD,CAAC;QACJ,CAAC;IACH,CAAC,CAAC;AACJ,CAAC","sourcesContent":["import type { ActionConstraint } from '@metamask/messenger';\nimport type { Messenger } from '@metamask/messenger';\nimport { rpcErrors } from '@metamask/rpc-errors';\nimport type {\n Json,\n JsonRpcParams,\n JsonRpcRequest,\n PendingJsonRpcResponse,\n} from '@metamask/utils';\n\nimport type {\n JsonRpcEngineEndCallback,\n JsonRpcEngineNextCallback,\n JsonRpcMiddleware,\n} from './JsonRpcEngine';\nimport {\n assertExpectedHooks,\n createHandlerMessenger,\n selectHooks,\n UnionToIntersection,\n} from './v2/utils';\n\ntype HandlerActions<Handler> = Handler extends {\n implementation: (...args: infer Args) => unknown;\n}\n ? Args extends [\n unknown,\n unknown,\n unknown,\n unknown,\n unknown,\n infer HandlerMessenger,\n ]\n ? HandlerMessenger extends Messenger<string, infer Actions>\n ? Actions\n : never\n : never\n : never;\n\ntype HandlerHooks<Handler> = Handler extends {\n implementation: (...args: infer Args) => unknown;\n}\n ? Args extends [\n unknown,\n unknown,\n unknown,\n unknown,\n infer ArgHooks,\n ...unknown[],\n ]\n ? ArgHooks extends Record<string, unknown>\n ? ArgHooks\n : never\n : never\n : never;\n\n/**\n * A {@link MethodHandler} implementation.\n *\n * @deprecated Use the v2 `createMethodMiddleware` instead.\n */\nexport type MethodHandlerImplementation<\n Hooks extends Record<string, unknown> = never,\n MessengerActions extends ActionConstraint = never,\n Params extends JsonRpcParams = JsonRpcParams,\n Result extends Json = Json,\n RequestExtras extends Record<string, unknown> = Record<string, unknown>,\n> = (\n req: JsonRpcRequest<Params> & RequestExtras,\n res: PendingJsonRpcResponse<Result>,\n next: JsonRpcEngineNextCallback,\n end: JsonRpcEngineEndCallback,\n hooks: Hooks,\n messenger: Messenger<string, MessengerActions>,\n) => Promise<void> | void;\n\n/**\n * A handler for {@link createMethodMiddleware}.\n *\n * @deprecated Use the v2 `createMethodMiddleware` instead.\n */\nexport type MethodHandler<\n Hooks extends Record<string, unknown> = never,\n MessengerActions extends ActionConstraint = never,\n Params extends JsonRpcParams = JsonRpcParams,\n Result extends Json = Json,\n RequestExtras extends Record<string, unknown> = Record<string, unknown>,\n> = {\n implementation: MethodHandlerImplementation<\n Hooks,\n MessengerActions,\n Params,\n Result,\n RequestExtras\n >;\n} & ([Hooks] extends [never]\n ? { hookNames?: undefined }\n : { hookNames: { [Key in keyof Hooks]: true } }) &\n ([MessengerActions] extends [never]\n ? { actionNames?: undefined }\n : { actionNames: readonly MessengerActions['type'][] });\n\ntype AnyMethodHandler = {\n implementation(\n this: void,\n req: JsonRpcRequest,\n res: PendingJsonRpcResponse,\n next: JsonRpcEngineNextCallback,\n end: JsonRpcEngineEndCallback,\n hooks: unknown,\n messenger: unknown,\n ): Promise<void> | void;\n hookNames?: Record<string, true>;\n actionNames?: readonly string[];\n};\n\ntype CreateMethodMiddlewareBaseOptions<\n Handlers extends Record<string, AnyMethodHandler>,\n> = {\n handlers: Handlers;\n // Due to a quirk of TypeScript's inference over generics, the hooks property must\n // be present even if no hooks are needed. Otherwise, TypeScript will fail to infer\n // the correct type for the messenger property. `Record<string, never>` is the\n // (hopefully) least confusing way to satisfy this requirement.\n hooks: [HandlerHooks<Handlers[keyof Handlers]>] extends [never]\n ? Record<string, never>\n : UnionToIntersection<HandlerHooks<Handlers[keyof Handlers]>>;\n /**\n * Called when a handler throws, before the error is forwarded to `end`.\n * Intended for logging; must not throw.\n */\n onError?: (error: unknown, request: JsonRpcRequest) => void;\n};\n\n/**\n * Options for {@link createMethodMiddleware}.\n *\n * @deprecated Use the v2 `createMethodMiddleware` instead.\n */\nexport type CreateMethodMiddlewareOptions<\n Handlers extends Record<string, AnyMethodHandler>,\n> = CreateMethodMiddlewareBaseOptions<Handlers> &\n ([HandlerActions<Handlers[keyof Handlers]>] extends [never]\n ? {\n messenger?: undefined;\n }\n : {\n messenger: Messenger<string, HandlerActions<Handlers[keyof Handlers]>>;\n });\n\ntype ResolvedHandler = {\n implementation: AnyMethodHandler['implementation'];\n hooks: Record<string, unknown>;\n messenger?: Messenger<string, ActionConstraint> | undefined;\n};\n\n/**\n * Create a JSON-RPC middleware that handles the passed JSON-RPC method handlers using the messenger and hooks.\n *\n * @deprecated Use the v2 `createMethodMiddleware` instead.\n * @param options The options.\n * @param options.handlers - The JSON-RPC method handler implementations.\n * @param options.messenger - The messenger to be used by the handlers.\n * @param options.hooks - The hooks to be used by the handlers.\n * @returns A JsonRpcEngineV2 middleware.\n */\nexport function createMethodMiddleware<\n Handlers extends Record<string, AnyMethodHandler>,\n>(\n options: CreateMethodMiddlewareOptions<Handlers>,\n): JsonRpcMiddleware<JsonRpcParams, Json> {\n const { messenger: rootMessenger, onError } = options;\n const allHooks = options.hooks as Record<string, unknown>;\n\n const expectedHookNames = new Set(\n Object.values(options.handlers).flatMap((handler) =>\n handler.hookNames ? Object.getOwnPropertyNames(handler.hookNames) : [],\n ),\n );\n assertExpectedHooks(allHooks, expectedHookNames);\n\n const handlers = Object.entries(options.handlers).reduce<\n Record<string, ResolvedHandler>\n >((accumulator, [handlerName, handler]) => {\n const handlerHooks = selectHooks(allHooks, handler.hookNames) ?? {};\n const handlerMessenger = createHandlerMessenger<\n HandlerActions<Handlers[keyof Handlers]>\n >({\n namespace: handlerName,\n actionNames: handler.actionNames as\n | readonly HandlerActions<Handlers[keyof Handlers]>['type'][]\n | undefined,\n rootMessenger,\n });\n\n accumulator[handlerName] = {\n implementation: handler.implementation,\n hooks: handlerHooks,\n messenger: handlerMessenger,\n };\n return accumulator;\n }, {});\n\n // This should technically use createAsyncMiddleware, but we get around this by catching\n // all handler errors.\n // eslint-disable-next-line @typescript-eslint/no-misused-promises\n return async (req, res, next, end) => {\n const handler = handlers[req.method];\n if (!handler) {\n return next();\n }\n\n const { implementation, hooks: handlerHooks, messenger } = handler;\n try {\n return await implementation(req, res, next, end, handlerHooks, messenger);\n } catch (error) {\n onError?.(error, req);\n return end(\n error instanceof Error\n ? error\n : rpcErrors.internal({ data: error as Json }),\n );\n }\n };\n}\n"]}
|
package/dist/index.cjs
CHANGED
|
@@ -1,10 +1,12 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.mergeMiddleware = exports.JsonRpcEngine = exports.createIdRemapMiddleware = exports.getUniqueId = exports.createScaffoldMiddleware = exports.createAsyncMiddleware = exports.asV2Middleware = void 0;
|
|
3
|
+
exports.mergeMiddleware = exports.JsonRpcEngine = exports.createIdRemapMiddleware = exports.getUniqueId = exports.createScaffoldMiddleware = exports.createMethodMiddleware = exports.createAsyncMiddleware = exports.asV2Middleware = void 0;
|
|
4
4
|
var asV2Middleware_1 = require("./asV2Middleware.cjs");
|
|
5
5
|
Object.defineProperty(exports, "asV2Middleware", { enumerable: true, get: function () { return asV2Middleware_1.asV2Middleware; } });
|
|
6
6
|
var createAsyncMiddleware_1 = require("./createAsyncMiddleware.cjs");
|
|
7
7
|
Object.defineProperty(exports, "createAsyncMiddleware", { enumerable: true, get: function () { return createAsyncMiddleware_1.createAsyncMiddleware; } });
|
|
8
|
+
var createMethodMiddleware_1 = require("./createMethodMiddleware.cjs");
|
|
9
|
+
Object.defineProperty(exports, "createMethodMiddleware", { enumerable: true, get: function () { return createMethodMiddleware_1.createMethodMiddleware; } });
|
|
8
10
|
var createScaffoldMiddleware_1 = require("./createScaffoldMiddleware.cjs");
|
|
9
11
|
Object.defineProperty(exports, "createScaffoldMiddleware", { enumerable: true, get: function () { return createScaffoldMiddleware_1.createScaffoldMiddleware; } });
|
|
10
12
|
var getUniqueId_1 = require("./getUniqueId.cjs");
|
package/dist/index.cjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.cjs","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";;;AAAA,uDAAkD;AAAzC,gHAAA,cAAc,OAAA;AAKvB,qEAAgE;AAAvD,8HAAA,qBAAqB,OAAA;
|
|
1
|
+
{"version":3,"file":"index.cjs","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";;;AAAA,uDAAkD;AAAzC,gHAAA,cAAc,OAAA;AAKvB,qEAAgE;AAAvD,8HAAA,qBAAqB,OAAA;AAM9B,uEAAkE;AAAzD,gIAAA,sBAAsB,OAAA;AAC/B,2EAAsE;AAA7D,oIAAA,wBAAwB,OAAA;AACjC,iDAA4C;AAAnC,0GAAA,WAAW,OAAA;AACpB,6DAA8D;AAArD,4HAAA,uBAAuB,OAAA;AAShC,qDAAgD;AAAvC,8GAAA,aAAa,OAAA;AACtB,yDAAoD;AAA3C,kHAAA,eAAe,OAAA","sourcesContent":["export { asV2Middleware } from './asV2Middleware';\nexport type {\n AsyncJsonRpcEngineNextCallback,\n AsyncJsonrpcMiddleware,\n} from './createAsyncMiddleware';\nexport { createAsyncMiddleware } from './createAsyncMiddleware';\nexport type {\n CreateMethodMiddlewareOptions,\n MethodHandler,\n MethodHandlerImplementation,\n} from './createMethodMiddleware';\nexport { createMethodMiddleware } from './createMethodMiddleware';\nexport { createScaffoldMiddleware } from './createScaffoldMiddleware';\nexport { getUniqueId } from './getUniqueId';\nexport { createIdRemapMiddleware } from './idRemapMiddleware';\nexport type {\n JsonRpcEngineCallbackError,\n JsonRpcEngineReturnHandler,\n JsonRpcEngineNextCallback,\n JsonRpcEngineEndCallback,\n JsonRpcMiddleware,\n JsonRpcNotificationHandler,\n} from './JsonRpcEngine';\nexport { JsonRpcEngine } from './JsonRpcEngine';\nexport { mergeMiddleware } from './mergeMiddleware';\n"]}
|
package/dist/index.d.cts
CHANGED
|
@@ -1,6 +1,8 @@
|
|
|
1
1
|
export { asV2Middleware } from "./asV2Middleware.cjs";
|
|
2
2
|
export type { AsyncJsonRpcEngineNextCallback, AsyncJsonrpcMiddleware, } from "./createAsyncMiddleware.cjs";
|
|
3
3
|
export { createAsyncMiddleware } from "./createAsyncMiddleware.cjs";
|
|
4
|
+
export type { CreateMethodMiddlewareOptions, MethodHandler, MethodHandlerImplementation, } from "./createMethodMiddleware.cjs";
|
|
5
|
+
export { createMethodMiddleware } from "./createMethodMiddleware.cjs";
|
|
4
6
|
export { createScaffoldMiddleware } from "./createScaffoldMiddleware.cjs";
|
|
5
7
|
export { getUniqueId } from "./getUniqueId.cjs";
|
|
6
8
|
export { createIdRemapMiddleware } from "./idRemapMiddleware.cjs";
|
package/dist/index.d.cts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.cts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,6BAAyB;AAClD,YAAY,EACV,8BAA8B,EAC9B,sBAAsB,GACvB,oCAAgC;AACjC,OAAO,EAAE,qBAAqB,EAAE,oCAAgC;AAChE,OAAO,EAAE,wBAAwB,EAAE,uCAAmC;AACtE,OAAO,EAAE,WAAW,EAAE,0BAAsB;AAC5C,OAAO,EAAE,uBAAuB,EAAE,gCAA4B;AAC9D,YAAY,EACV,0BAA0B,EAC1B,0BAA0B,EAC1B,yBAAyB,EACzB,wBAAwB,EACxB,iBAAiB,EACjB,0BAA0B,GAC3B,4BAAwB;AACzB,OAAO,EAAE,aAAa,EAAE,4BAAwB;AAChD,OAAO,EAAE,eAAe,EAAE,8BAA0B"}
|
|
1
|
+
{"version":3,"file":"index.d.cts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,6BAAyB;AAClD,YAAY,EACV,8BAA8B,EAC9B,sBAAsB,GACvB,oCAAgC;AACjC,OAAO,EAAE,qBAAqB,EAAE,oCAAgC;AAChE,YAAY,EACV,6BAA6B,EAC7B,aAAa,EACb,2BAA2B,GAC5B,qCAAiC;AAClC,OAAO,EAAE,sBAAsB,EAAE,qCAAiC;AAClE,OAAO,EAAE,wBAAwB,EAAE,uCAAmC;AACtE,OAAO,EAAE,WAAW,EAAE,0BAAsB;AAC5C,OAAO,EAAE,uBAAuB,EAAE,gCAA4B;AAC9D,YAAY,EACV,0BAA0B,EAC1B,0BAA0B,EAC1B,yBAAyB,EACzB,wBAAwB,EACxB,iBAAiB,EACjB,0BAA0B,GAC3B,4BAAwB;AACzB,OAAO,EAAE,aAAa,EAAE,4BAAwB;AAChD,OAAO,EAAE,eAAe,EAAE,8BAA0B"}
|
package/dist/index.d.mts
CHANGED
|
@@ -1,6 +1,8 @@
|
|
|
1
1
|
export { asV2Middleware } from "./asV2Middleware.mjs";
|
|
2
2
|
export type { AsyncJsonRpcEngineNextCallback, AsyncJsonrpcMiddleware, } from "./createAsyncMiddleware.mjs";
|
|
3
3
|
export { createAsyncMiddleware } from "./createAsyncMiddleware.mjs";
|
|
4
|
+
export type { CreateMethodMiddlewareOptions, MethodHandler, MethodHandlerImplementation, } from "./createMethodMiddleware.mjs";
|
|
5
|
+
export { createMethodMiddleware } from "./createMethodMiddleware.mjs";
|
|
4
6
|
export { createScaffoldMiddleware } from "./createScaffoldMiddleware.mjs";
|
|
5
7
|
export { getUniqueId } from "./getUniqueId.mjs";
|
|
6
8
|
export { createIdRemapMiddleware } from "./idRemapMiddleware.mjs";
|
package/dist/index.d.mts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.mts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,6BAAyB;AAClD,YAAY,EACV,8BAA8B,EAC9B,sBAAsB,GACvB,oCAAgC;AACjC,OAAO,EAAE,qBAAqB,EAAE,oCAAgC;AAChE,OAAO,EAAE,wBAAwB,EAAE,uCAAmC;AACtE,OAAO,EAAE,WAAW,EAAE,0BAAsB;AAC5C,OAAO,EAAE,uBAAuB,EAAE,gCAA4B;AAC9D,YAAY,EACV,0BAA0B,EAC1B,0BAA0B,EAC1B,yBAAyB,EACzB,wBAAwB,EACxB,iBAAiB,EACjB,0BAA0B,GAC3B,4BAAwB;AACzB,OAAO,EAAE,aAAa,EAAE,4BAAwB;AAChD,OAAO,EAAE,eAAe,EAAE,8BAA0B"}
|
|
1
|
+
{"version":3,"file":"index.d.mts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,6BAAyB;AAClD,YAAY,EACV,8BAA8B,EAC9B,sBAAsB,GACvB,oCAAgC;AACjC,OAAO,EAAE,qBAAqB,EAAE,oCAAgC;AAChE,YAAY,EACV,6BAA6B,EAC7B,aAAa,EACb,2BAA2B,GAC5B,qCAAiC;AAClC,OAAO,EAAE,sBAAsB,EAAE,qCAAiC;AAClE,OAAO,EAAE,wBAAwB,EAAE,uCAAmC;AACtE,OAAO,EAAE,WAAW,EAAE,0BAAsB;AAC5C,OAAO,EAAE,uBAAuB,EAAE,gCAA4B;AAC9D,YAAY,EACV,0BAA0B,EAC1B,0BAA0B,EAC1B,yBAAyB,EACzB,wBAAwB,EACxB,iBAAiB,EACjB,0BAA0B,GAC3B,4BAAwB;AACzB,OAAO,EAAE,aAAa,EAAE,4BAAwB;AAChD,OAAO,EAAE,eAAe,EAAE,8BAA0B"}
|
package/dist/index.mjs
CHANGED
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
export { asV2Middleware } from "./asV2Middleware.mjs";
|
|
2
2
|
export { createAsyncMiddleware } from "./createAsyncMiddleware.mjs";
|
|
3
|
+
export { createMethodMiddleware } from "./createMethodMiddleware.mjs";
|
|
3
4
|
export { createScaffoldMiddleware } from "./createScaffoldMiddleware.mjs";
|
|
4
5
|
export { getUniqueId } from "./getUniqueId.mjs";
|
|
5
6
|
export { createIdRemapMiddleware } from "./idRemapMiddleware.mjs";
|
package/dist/index.mjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.mjs","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,6BAAyB;AAKlD,OAAO,EAAE,qBAAqB,EAAE,oCAAgC;
|
|
1
|
+
{"version":3,"file":"index.mjs","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,6BAAyB;AAKlD,OAAO,EAAE,qBAAqB,EAAE,oCAAgC;AAMhE,OAAO,EAAE,sBAAsB,EAAE,qCAAiC;AAClE,OAAO,EAAE,wBAAwB,EAAE,uCAAmC;AACtE,OAAO,EAAE,WAAW,EAAE,0BAAsB;AAC5C,OAAO,EAAE,uBAAuB,EAAE,gCAA4B;AAS9D,OAAO,EAAE,aAAa,EAAE,4BAAwB;AAChD,OAAO,EAAE,eAAe,EAAE,8BAA0B","sourcesContent":["export { asV2Middleware } from './asV2Middleware';\nexport type {\n AsyncJsonRpcEngineNextCallback,\n AsyncJsonrpcMiddleware,\n} from './createAsyncMiddleware';\nexport { createAsyncMiddleware } from './createAsyncMiddleware';\nexport type {\n CreateMethodMiddlewareOptions,\n MethodHandler,\n MethodHandlerImplementation,\n} from './createMethodMiddleware';\nexport { createMethodMiddleware } from './createMethodMiddleware';\nexport { createScaffoldMiddleware } from './createScaffoldMiddleware';\nexport { getUniqueId } from './getUniqueId';\nexport { createIdRemapMiddleware } from './idRemapMiddleware';\nexport type {\n JsonRpcEngineCallbackError,\n JsonRpcEngineReturnHandler,\n JsonRpcEngineNextCallback,\n JsonRpcEngineEndCallback,\n JsonRpcMiddleware,\n JsonRpcNotificationHandler,\n} from './JsonRpcEngine';\nexport { JsonRpcEngine } from './JsonRpcEngine';\nexport { mergeMiddleware } from './mergeMiddleware';\n"]}
|
|
@@ -1,7 +1,8 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.
|
|
3
|
+
exports.createMethodMiddleware = void 0;
|
|
4
4
|
const messenger_1 = require("@metamask/messenger");
|
|
5
|
+
const utils_1 = require("./utils.cjs");
|
|
5
6
|
/**
|
|
6
7
|
* Create a JSON-RPC middleware that handles the passed JSON-RPC method handlers using the messenger and hooks.
|
|
7
8
|
*
|
|
@@ -14,15 +15,14 @@ const messenger_1 = require("@metamask/messenger");
|
|
|
14
15
|
function createMethodMiddleware(options) {
|
|
15
16
|
const { messenger: rootMessenger } = options;
|
|
16
17
|
const allHooks = options.hooks;
|
|
18
|
+
const expectedHookNames = new Set(Object.values(options.handlers).flatMap((handler) => handler.hookNames ? Object.getOwnPropertyNames(handler.hookNames) : []));
|
|
19
|
+
(0, utils_1.assertExpectedHooks)(allHooks, expectedHookNames);
|
|
17
20
|
const handlers = Object.entries(options.handlers).reduce((accumulator, [handlerName, handler]) => {
|
|
18
|
-
const handlerHooks = selectHooks(allHooks, handler.hookNames) ?? {};
|
|
19
|
-
const handlerMessenger =
|
|
21
|
+
const handlerHooks = (0, utils_1.selectHooks)(allHooks, handler.hookNames) ?? {};
|
|
22
|
+
const handlerMessenger = (0, utils_1.createHandlerMessenger)({
|
|
20
23
|
namespace: handlerName,
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
rootMessenger.delegate({
|
|
24
|
-
actions: (handler.actionNames ?? []),
|
|
25
|
-
messenger: handlerMessenger,
|
|
24
|
+
actionNames: handler.actionNames,
|
|
25
|
+
rootMessenger,
|
|
26
26
|
});
|
|
27
27
|
accumulator[handlerName] = {
|
|
28
28
|
implementation: handler.implementation,
|
|
@@ -41,27 +41,4 @@ function createMethodMiddleware(options) {
|
|
|
41
41
|
};
|
|
42
42
|
}
|
|
43
43
|
exports.createMethodMiddleware = createMethodMiddleware;
|
|
44
|
-
/**
|
|
45
|
-
* Returns the subset of the specified `hooks` that are included in the
|
|
46
|
-
* `hookNames` object. This is a Principle of Least Authority (POLA) measure
|
|
47
|
-
* to ensure that each RPC method implementation only has access to the
|
|
48
|
-
* API "hooks" it needs to do its job.
|
|
49
|
-
*
|
|
50
|
-
* @param hooks - The hooks to select from.
|
|
51
|
-
* @param hookNames - The names of the hooks to select.
|
|
52
|
-
* @returns The selected hooks.
|
|
53
|
-
* @template Hooks - The hooks to select from.
|
|
54
|
-
* @template HookName - The names of the hooks to select.
|
|
55
|
-
*/
|
|
56
|
-
function selectHooks(hooks, hookNames) {
|
|
57
|
-
if (hookNames) {
|
|
58
|
-
return Object.keys(hookNames).reduce((hookSubset, _hookName) => {
|
|
59
|
-
const hookName = _hookName;
|
|
60
|
-
hookSubset[hookName] = hooks[hookName];
|
|
61
|
-
return hookSubset;
|
|
62
|
-
}, {});
|
|
63
|
-
}
|
|
64
|
-
return undefined;
|
|
65
|
-
}
|
|
66
|
-
exports.selectHooks = selectHooks;
|
|
67
44
|
//# sourceMappingURL=createMethodMiddleware.cjs.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"createMethodMiddleware.cjs","sourceRoot":"","sources":["../../src/v2/createMethodMiddleware.ts"],"names":[],"mappings":";;;AAAA,mDAAkE;
|
|
1
|
+
{"version":3,"file":"createMethodMiddleware.cjs","sourceRoot":"","sources":["../../src/v2/createMethodMiddleware.ts"],"names":[],"mappings":";;;AAAA,mDAAkE;AAIlE,uCAQiB;AAsFjB;;;;;;;;GAQG;AACH,SAAgB,sBAAsB,CAIpC,OAAgD;IAEhD,MAAM,EAAE,SAAS,EAAE,aAAa,EAAE,GAAG,OAAO,CAAC;IAC7C,MAAM,QAAQ,GAAG,OAAO,CAAC,KAAgC,CAAC;IAE1D,MAAM,iBAAiB,GAAG,IAAI,GAAG,CAC/B,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE,CAClD,OAAO,CAAC,SAAS,CAAC,CAAC,CAAC,MAAM,CAAC,mBAAmB,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,EAAE,CACvE,CACF,CAAC;IACF,IAAA,2BAAmB,EAAC,QAAQ,EAAE,iBAAiB,CAAC,CAAC;IAEjD,MAAM,QAAQ,GAAG,MAAM,CAAC,OAAO,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC,MAAM,CAEtD,CAAC,WAAW,EAAE,CAAC,WAAW,EAAE,OAAO,CAAC,EAAE,EAAE;QACxC,MAAM,YAAY,GAAG,IAAA,mBAAW,EAAC,QAAQ,EAAE,OAAO,CAAC,SAAS,CAAC,IAAI,EAAE,CAAC;QACpE,MAAM,gBAAgB,GAAG,IAAA,8BAAsB,EAE7C;YACA,SAAS,EAAE,WAAW;YACtB,WAAW,EAAE,OAAO,CAAC,WAER;YACb,aAAa;SACd,CAAC,CAAC;QAEH,WAAW,CAAC,WAAW,CAAC,GAAG;YACzB,cAAc,EAAE,OAAO,CAAC,cAAc;YACtC,KAAK,EAAE,YAAY;YACnB,SAAS,EAAE,gBAAgB;SAC5B,CAAC;QACF,OAAO,WAAW,CAAC;IACrB,CAAC,EAAE,EAAE,CAAC,CAAC;IAEP,OAAO,CAAC,EAAE,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,EAAE,EAAE;QACpC,MAAM,OAAO,GAAG,QAAQ,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;QACzC,IAAI,OAAO,KAAK,SAAS,EAAE,CAAC;YAC1B,OAAO,IAAI,EAAE,CAAC;QAChB,CAAC;QAED,MAAM,EAAE,cAAc,EAAE,KAAK,EAAE,SAAS,EAAE,GAAG,OAAO,CAAC;QAErD,OAAO,cAAc,CAAC,EAAE,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,KAAK,EAAE,SAAS,EAAE,CAAC,CAAC;IACtE,CAAC,CAAC;AACJ,CAAC;AAhDD,wDAgDC","sourcesContent":["import { ActionConstraint, Messenger } from '@metamask/messenger';\n\nimport { JsonRpcMiddleware, Next } from './JsonRpcEngineV2';\nimport { ContextConstraint } from './MiddlewareContext';\nimport {\n assertExpectedHooks,\n createHandlerMessenger,\n selectHooks,\n Json,\n JsonRpcParams,\n JsonRpcRequest,\n UnionToIntersection,\n} from './utils';\n\ntype HandlerActions<Handler> = Handler extends {\n implementation: (options: infer Options) => unknown;\n}\n ? Options extends { messenger: Messenger<string, infer Actions> }\n ? Actions\n : never\n : never;\n\ntype HandlerHooks<Handler> = Handler extends {\n implementation: (options: infer Options) => unknown;\n}\n ? Options extends { hooks: infer Hooks }\n ? Hooks\n : never\n : never;\n\n/**\n * A `JsonRpcEngineV2` method middleware handler.\n */\nexport type MethodHandler<\n Hooks extends Record<string, unknown> = never,\n MessengerActions extends ActionConstraint = never,\n Parameters extends JsonRpcParams = JsonRpcParams,\n Result extends Json = Json,\n Context extends ContextConstraint = ContextConstraint,\n> = {\n implementation: (options: {\n request: Readonly<JsonRpcRequest<Parameters>>;\n context: Context;\n next: Next<JsonRpcRequest>;\n messenger: Messenger<string, MessengerActions>;\n hooks: Hooks;\n }) => Promise<Result> | Result;\n} & ([Hooks] extends [never]\n ? { hookNames?: undefined }\n : { hookNames: { [Key in keyof Hooks]: true } }) &\n ([MessengerActions] extends [never]\n ? { actionNames?: undefined }\n : { actionNames: MessengerActions['type'][] });\n\ntype AnyMethodHandler = {\n implementation(\n this: void,\n options: {\n request: Readonly<JsonRpcRequest>;\n context: ContextConstraint;\n next: Next<JsonRpcRequest>;\n messenger: unknown;\n hooks: unknown;\n },\n ): Promise<Json> | Json;\n hookNames?: Record<string, true>;\n actionNames?: readonly string[];\n};\n\ntype CreateMethodMiddlewareBaseOptions<\n Handlers extends Record<string, AnyMethodHandler>,\n> = {\n handlers: Handlers;\n hooks: [HandlerHooks<Handlers[keyof Handlers]>] extends [never]\n ? Record<string, never>\n : UnionToIntersection<HandlerHooks<Handlers[keyof Handlers]>>;\n};\n\n/**\n * Options for {@link createMethodMiddleware}.\n */\nexport type CreateMethodMiddlewareOptions<\n Handlers extends Record<string, AnyMethodHandler>,\n> = CreateMethodMiddlewareBaseOptions<Handlers> &\n ([HandlerActions<Handlers[keyof Handlers]>] extends [never]\n ? {\n messenger?: undefined;\n }\n : {\n messenger: Messenger<string, HandlerActions<Handlers[keyof Handlers]>>;\n });\n\ntype ResolvedHandler = {\n implementation: AnyMethodHandler['implementation'];\n hooks: Record<string, unknown>;\n messenger?: Messenger<string, ActionConstraint> | undefined;\n};\n\n/**\n * Create a JSON-RPC middleware that handles the passed JSON-RPC method handlers using the messenger and hooks.\n *\n * @param options The options.\n * @param options.handlers - The JSON-RPC method handler implementations.\n * @param options.messenger - The messenger to be used by the handlers.\n * @param options.hooks - The hooks to be used by the handlers.\n * @returns A JsonRpcEngineV2 middleware.\n */\nexport function createMethodMiddleware<\n Handlers extends Record<string, AnyMethodHandler>,\n Context extends ContextConstraint,\n>(\n options: CreateMethodMiddlewareOptions<Handlers>,\n): JsonRpcMiddleware<JsonRpcRequest, Json, Context> {\n const { messenger: rootMessenger } = options;\n const allHooks = options.hooks as Record<string, unknown>;\n\n const expectedHookNames = new Set(\n Object.values(options.handlers).flatMap((handler) =>\n handler.hookNames ? Object.getOwnPropertyNames(handler.hookNames) : [],\n ),\n );\n assertExpectedHooks(allHooks, expectedHookNames);\n\n const handlers = Object.entries(options.handlers).reduce<\n Record<string, ResolvedHandler>\n >((accumulator, [handlerName, handler]) => {\n const handlerHooks = selectHooks(allHooks, handler.hookNames) ?? {};\n const handlerMessenger = createHandlerMessenger<\n HandlerActions<Handlers[keyof Handlers]>\n >({\n namespace: handlerName,\n actionNames: handler.actionNames as\n | readonly HandlerActions<Handlers[keyof Handlers]>['type'][]\n | undefined,\n rootMessenger,\n });\n\n accumulator[handlerName] = {\n implementation: handler.implementation,\n hooks: handlerHooks,\n messenger: handlerMessenger,\n };\n return accumulator;\n }, {});\n\n return ({ request, context, next }) => {\n const handler = handlers[request.method];\n if (handler === undefined) {\n return next();\n }\n\n const { implementation, hooks, messenger } = handler;\n\n return implementation({ request, context, next, hooks, messenger });\n };\n}\n"]}
|
|
@@ -12,6 +12,9 @@ type HandlerHooks<Handler> = Handler extends {
|
|
|
12
12
|
} ? Options extends {
|
|
13
13
|
hooks: infer Hooks;
|
|
14
14
|
} ? Hooks : never : never;
|
|
15
|
+
/**
|
|
16
|
+
* A `JsonRpcEngineV2` method middleware handler.
|
|
17
|
+
*/
|
|
15
18
|
export type MethodHandler<Hooks extends Record<string, unknown> = never, MessengerActions extends ActionConstraint = never, Parameters extends JsonRpcParams = JsonRpcParams, Result extends Json = Json, Context extends ContextConstraint = ContextConstraint> = {
|
|
16
19
|
implementation: (options: {
|
|
17
20
|
request: Readonly<JsonRpcRequest<Parameters>>;
|
|
@@ -42,11 +45,18 @@ type AnyMethodHandler = {
|
|
|
42
45
|
hookNames?: Record<string, true>;
|
|
43
46
|
actionNames?: readonly string[];
|
|
44
47
|
};
|
|
45
|
-
|
|
48
|
+
type CreateMethodMiddlewareBaseOptions<Handlers extends Record<string, AnyMethodHandler>> = {
|
|
46
49
|
handlers: Handlers;
|
|
47
|
-
|
|
48
|
-
hooks: UnionToIntersection<HandlerHooks<Handlers[keyof Handlers]>>;
|
|
50
|
+
hooks: [HandlerHooks<Handlers[keyof Handlers]>] extends [never] ? Record<string, never> : UnionToIntersection<HandlerHooks<Handlers[keyof Handlers]>>;
|
|
49
51
|
};
|
|
52
|
+
/**
|
|
53
|
+
* Options for {@link createMethodMiddleware}.
|
|
54
|
+
*/
|
|
55
|
+
export type CreateMethodMiddlewareOptions<Handlers extends Record<string, AnyMethodHandler>> = CreateMethodMiddlewareBaseOptions<Handlers> & ([HandlerActions<Handlers[keyof Handlers]>] extends [never] ? {
|
|
56
|
+
messenger?: undefined;
|
|
57
|
+
} : {
|
|
58
|
+
messenger: Messenger<string, HandlerActions<Handlers[keyof Handlers]>>;
|
|
59
|
+
});
|
|
50
60
|
/**
|
|
51
61
|
* Create a JSON-RPC middleware that handles the passed JSON-RPC method handlers using the messenger and hooks.
|
|
52
62
|
*
|
|
@@ -57,18 +67,5 @@ export type CreateMethodMiddlewareOptions<Handlers extends Record<string, AnyMet
|
|
|
57
67
|
* @returns A JsonRpcEngineV2 middleware.
|
|
58
68
|
*/
|
|
59
69
|
export declare function createMethodMiddleware<Handlers extends Record<string, AnyMethodHandler>, Context extends ContextConstraint>(options: CreateMethodMiddlewareOptions<Handlers>): JsonRpcMiddleware<JsonRpcRequest, Json, Context>;
|
|
60
|
-
/**
|
|
61
|
-
* Returns the subset of the specified `hooks` that are included in the
|
|
62
|
-
* `hookNames` object. This is a Principle of Least Authority (POLA) measure
|
|
63
|
-
* to ensure that each RPC method implementation only has access to the
|
|
64
|
-
* API "hooks" it needs to do its job.
|
|
65
|
-
*
|
|
66
|
-
* @param hooks - The hooks to select from.
|
|
67
|
-
* @param hookNames - The names of the hooks to select.
|
|
68
|
-
* @returns The selected hooks.
|
|
69
|
-
* @template Hooks - The hooks to select from.
|
|
70
|
-
* @template HookName - The names of the hooks to select.
|
|
71
|
-
*/
|
|
72
|
-
export declare function selectHooks<Hooks extends Record<string, unknown>, HookName extends keyof Hooks>(hooks: Hooks, hookNames?: Record<HookName, true>): Pick<Hooks, HookName> | undefined;
|
|
73
70
|
export {};
|
|
74
71
|
//# sourceMappingURL=createMethodMiddleware.d.cts.map
|