@metamask/multichain-api-middleware 0.1.0
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 +17 -0
- package/LICENSE +20 -0
- package/README.md +15 -0
- package/dist/handlers/wallet-getSession.cjs +47 -0
- package/dist/handlers/wallet-getSession.cjs.map +1 -0
- package/dist/handlers/wallet-getSession.d.cts +37 -0
- package/dist/handlers/wallet-getSession.d.cts.map +1 -0
- package/dist/handlers/wallet-getSession.d.mts +37 -0
- package/dist/handlers/wallet-getSession.d.mts.map +1 -0
- package/dist/handlers/wallet-getSession.mjs +44 -0
- package/dist/handlers/wallet-getSession.mjs.map +1 -0
- package/dist/handlers/wallet-invokeMethod.cjs +98 -0
- package/dist/handlers/wallet-invokeMethod.cjs.map +1 -0
- package/dist/handlers/wallet-invokeMethod.d.cts +53 -0
- package/dist/handlers/wallet-invokeMethod.d.cts.map +1 -0
- package/dist/handlers/wallet-invokeMethod.d.mts +53 -0
- package/dist/handlers/wallet-invokeMethod.d.mts.map +1 -0
- package/dist/handlers/wallet-invokeMethod.mjs +95 -0
- package/dist/handlers/wallet-invokeMethod.mjs.map +1 -0
- package/dist/handlers/wallet-revokeSession.cjs +43 -0
- package/dist/handlers/wallet-revokeSession.cjs.map +1 -0
- package/dist/handlers/wallet-revokeSession.d.cts +31 -0
- package/dist/handlers/wallet-revokeSession.d.cts.map +1 -0
- package/dist/handlers/wallet-revokeSession.d.mts +31 -0
- package/dist/handlers/wallet-revokeSession.d.mts.map +1 -0
- package/dist/handlers/wallet-revokeSession.mjs +40 -0
- package/dist/handlers/wallet-revokeSession.mjs.map +1 -0
- package/dist/index.cjs +16 -0
- package/dist/index.cjs.map +1 -0
- package/dist/index.d.cts +7 -0
- package/dist/index.d.cts.map +1 -0
- package/dist/index.d.mts +7 -0
- package/dist/index.d.mts.map +1 -0
- package/dist/index.mjs +7 -0
- package/dist/index.mjs.map +1 -0
- package/dist/middlewares/MultichainMiddlewareManager.cjs +110 -0
- package/dist/middlewares/MultichainMiddlewareManager.cjs.map +1 -0
- package/dist/middlewares/MultichainMiddlewareManager.d.cts +35 -0
- package/dist/middlewares/MultichainMiddlewareManager.d.cts.map +1 -0
- package/dist/middlewares/MultichainMiddlewareManager.d.mts +35 -0
- package/dist/middlewares/MultichainMiddlewareManager.d.mts.map +1 -0
- package/dist/middlewares/MultichainMiddlewareManager.mjs +106 -0
- package/dist/middlewares/MultichainMiddlewareManager.mjs.map +1 -0
- package/dist/middlewares/MultichainSubscriptionManager.cjs +117 -0
- package/dist/middlewares/MultichainSubscriptionManager.cjs.map +1 -0
- package/dist/middlewares/MultichainSubscriptionManager.d.cts +49 -0
- package/dist/middlewares/MultichainSubscriptionManager.d.cts.map +1 -0
- package/dist/middlewares/MultichainSubscriptionManager.d.mts +49 -0
- package/dist/middlewares/MultichainSubscriptionManager.d.mts.map +1 -0
- package/dist/middlewares/MultichainSubscriptionManager.mjs +117 -0
- package/dist/middlewares/MultichainSubscriptionManager.mjs.map +1 -0
- package/dist/middlewares/multichainMethodCallValidatorMiddleware.cjs +74 -0
- package/dist/middlewares/multichainMethodCallValidatorMiddleware.cjs.map +1 -0
- package/dist/middlewares/multichainMethodCallValidatorMiddleware.d.cts +7 -0
- package/dist/middlewares/multichainMethodCallValidatorMiddleware.d.cts.map +1 -0
- package/dist/middlewares/multichainMethodCallValidatorMiddleware.d.mts +7 -0
- package/dist/middlewares/multichainMethodCallValidatorMiddleware.d.mts.map +1 -0
- package/dist/middlewares/multichainMethodCallValidatorMiddleware.mjs +75 -0
- package/dist/middlewares/multichainMethodCallValidatorMiddleware.mjs.map +1 -0
- package/package.json +80 -0
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.walletRevokeSession = void 0;
|
|
4
|
+
const chain_agnostic_permission_1 = require("@metamask/chain-agnostic-permission");
|
|
5
|
+
const permission_controller_1 = require("@metamask/permission-controller");
|
|
6
|
+
const rpc_errors_1 = require("@metamask/rpc-errors");
|
|
7
|
+
/**
|
|
8
|
+
* Handler for the `wallet_revokeSession` RPC method as specified by [CAIP-285](https://chainagnostic.org/CAIPs/caip-285).
|
|
9
|
+
* The implementation below deviates from the linked spec in that it ignores the `sessionId` param
|
|
10
|
+
* and instead revokes the singular session for the origin if available. Additionally,
|
|
11
|
+
* the handler also does not return an error if there is currently no active session and instead
|
|
12
|
+
* returns true which is the same result returned if an active session was actually revoked.
|
|
13
|
+
*
|
|
14
|
+
* @param _request - The JSON-RPC request object. Unused.
|
|
15
|
+
* @param response - The JSON-RPC response object.
|
|
16
|
+
* @param _next - The next middleware function. Unused.
|
|
17
|
+
* @param end - The end callback function.
|
|
18
|
+
* @param hooks - The hooks object.
|
|
19
|
+
* @param hooks.revokePermissionForOrigin - The hook for revoking a permission for an origin function.
|
|
20
|
+
* @returns Nothing.
|
|
21
|
+
*/
|
|
22
|
+
async function walletRevokeSessionHandler(_request, response, _next, end, hooks) {
|
|
23
|
+
try {
|
|
24
|
+
hooks.revokePermissionForOrigin(chain_agnostic_permission_1.Caip25EndowmentPermissionName);
|
|
25
|
+
}
|
|
26
|
+
catch (err) {
|
|
27
|
+
if (!(err instanceof permission_controller_1.UnrecognizedSubjectError) &&
|
|
28
|
+
!(err instanceof permission_controller_1.PermissionDoesNotExistError)) {
|
|
29
|
+
console.error(err);
|
|
30
|
+
return end(rpc_errors_1.rpcErrors.internal());
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
response.result = true;
|
|
34
|
+
return end();
|
|
35
|
+
}
|
|
36
|
+
exports.walletRevokeSession = {
|
|
37
|
+
methodNames: ['wallet_revokeSession'],
|
|
38
|
+
implementation: walletRevokeSessionHandler,
|
|
39
|
+
hookNames: {
|
|
40
|
+
revokePermissionForOrigin: true,
|
|
41
|
+
},
|
|
42
|
+
};
|
|
43
|
+
//# sourceMappingURL=wallet-revokeSession.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"wallet-revokeSession.cjs","sourceRoot":"","sources":["../../src/handlers/wallet-revokeSession.ts"],"names":[],"mappings":";;;AAAA,mFAAoF;AAKpF,2EAGyC;AACzC,qDAAiD;AAGjD;;;;;;;;;;;;;;GAcG;AACH,KAAK,UAAU,0BAA0B,CACvC,QAA6C,EAC7C,QAA8B,EAC9B,KAAgC,EAChC,GAA6B,EAC7B,KAEC;IAED,IAAI;QACF,KAAK,CAAC,yBAAyB,CAAC,yDAA6B,CAAC,CAAC;KAChE;IAAC,OAAO,GAAG,EAAE;QACZ,IACE,CAAC,CAAC,GAAG,YAAY,gDAAwB,CAAC;YAC1C,CAAC,CAAC,GAAG,YAAY,mDAA2B,CAAC,EAC7C;YACA,OAAO,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;YACnB,OAAO,GAAG,CAAC,sBAAS,CAAC,QAAQ,EAAE,CAAC,CAAC;SAClC;KACF;IAED,QAAQ,CAAC,MAAM,GAAG,IAAI,CAAC;IACvB,OAAO,GAAG,EAAE,CAAC;AACf,CAAC;AACY,QAAA,mBAAmB,GAAG;IACjC,WAAW,EAAE,CAAC,sBAAsB,CAAC;IACrC,cAAc,EAAE,0BAA0B;IAC1C,SAAS,EAAE;QACT,yBAAyB,EAAE,IAAI;KAChC;CACF,CAAC","sourcesContent":["import { Caip25EndowmentPermissionName } from '@metamask/chain-agnostic-permission';\nimport type {\n JsonRpcEngineNextCallback,\n JsonRpcEngineEndCallback,\n} from '@metamask/json-rpc-engine';\nimport {\n PermissionDoesNotExistError,\n UnrecognizedSubjectError,\n} from '@metamask/permission-controller';\nimport { rpcErrors } from '@metamask/rpc-errors';\nimport type { JsonRpcSuccess, Json, JsonRpcRequest } from '@metamask/utils';\n\n/**\n * Handler for the `wallet_revokeSession` RPC method as specified by [CAIP-285](https://chainagnostic.org/CAIPs/caip-285).\n * The implementation below deviates from the linked spec in that it ignores the `sessionId` param\n * and instead revokes the singular session for the origin if available. Additionally,\n * the handler also does not return an error if there is currently no active session and instead\n * returns true which is the same result returned if an active session was actually revoked.\n *\n * @param _request - The JSON-RPC request object. Unused.\n * @param response - The JSON-RPC response object.\n * @param _next - The next middleware function. Unused.\n * @param end - The end callback function.\n * @param hooks - The hooks object.\n * @param hooks.revokePermissionForOrigin - The hook for revoking a permission for an origin function.\n * @returns Nothing.\n */\nasync function walletRevokeSessionHandler(\n _request: JsonRpcRequest & { origin: string },\n response: JsonRpcSuccess<Json>,\n _next: JsonRpcEngineNextCallback,\n end: JsonRpcEngineEndCallback,\n hooks: {\n revokePermissionForOrigin: (permissionName: string) => void;\n },\n) {\n try {\n hooks.revokePermissionForOrigin(Caip25EndowmentPermissionName);\n } catch (err) {\n if (\n !(err instanceof UnrecognizedSubjectError) &&\n !(err instanceof PermissionDoesNotExistError)\n ) {\n console.error(err);\n return end(rpcErrors.internal());\n }\n }\n\n response.result = true;\n return end();\n}\nexport const walletRevokeSession = {\n methodNames: ['wallet_revokeSession'],\n implementation: walletRevokeSessionHandler,\n hookNames: {\n revokePermissionForOrigin: true,\n },\n};\n"]}
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
import type { JsonRpcEngineNextCallback, JsonRpcEngineEndCallback } from "@metamask/json-rpc-engine";
|
|
2
|
+
import type { JsonRpcSuccess, Json, JsonRpcRequest } from "@metamask/utils";
|
|
3
|
+
/**
|
|
4
|
+
* Handler for the `wallet_revokeSession` RPC method as specified by [CAIP-285](https://chainagnostic.org/CAIPs/caip-285).
|
|
5
|
+
* The implementation below deviates from the linked spec in that it ignores the `sessionId` param
|
|
6
|
+
* and instead revokes the singular session for the origin if available. Additionally,
|
|
7
|
+
* the handler also does not return an error if there is currently no active session and instead
|
|
8
|
+
* returns true which is the same result returned if an active session was actually revoked.
|
|
9
|
+
*
|
|
10
|
+
* @param _request - The JSON-RPC request object. Unused.
|
|
11
|
+
* @param response - The JSON-RPC response object.
|
|
12
|
+
* @param _next - The next middleware function. Unused.
|
|
13
|
+
* @param end - The end callback function.
|
|
14
|
+
* @param hooks - The hooks object.
|
|
15
|
+
* @param hooks.revokePermissionForOrigin - The hook for revoking a permission for an origin function.
|
|
16
|
+
* @returns Nothing.
|
|
17
|
+
*/
|
|
18
|
+
declare function walletRevokeSessionHandler(_request: JsonRpcRequest & {
|
|
19
|
+
origin: string;
|
|
20
|
+
}, response: JsonRpcSuccess<Json>, _next: JsonRpcEngineNextCallback, end: JsonRpcEngineEndCallback, hooks: {
|
|
21
|
+
revokePermissionForOrigin: (permissionName: string) => void;
|
|
22
|
+
}): Promise<void>;
|
|
23
|
+
export declare const walletRevokeSession: {
|
|
24
|
+
methodNames: string[];
|
|
25
|
+
implementation: typeof walletRevokeSessionHandler;
|
|
26
|
+
hookNames: {
|
|
27
|
+
revokePermissionForOrigin: boolean;
|
|
28
|
+
};
|
|
29
|
+
};
|
|
30
|
+
export {};
|
|
31
|
+
//# sourceMappingURL=wallet-revokeSession.d.cts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"wallet-revokeSession.d.cts","sourceRoot":"","sources":["../../src/handlers/wallet-revokeSession.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EACV,yBAAyB,EACzB,wBAAwB,EACzB,kCAAkC;AAMnC,OAAO,KAAK,EAAE,cAAc,EAAE,IAAI,EAAE,cAAc,EAAE,wBAAwB;AAE5E;;;;;;;;;;;;;;GAcG;AACH,iBAAe,0BAA0B,CACvC,QAAQ,EAAE,cAAc,GAAG;IAAE,MAAM,EAAE,MAAM,CAAA;CAAE,EAC7C,QAAQ,EAAE,cAAc,CAAC,IAAI,CAAC,EAC9B,KAAK,EAAE,yBAAyB,EAChC,GAAG,EAAE,wBAAwB,EAC7B,KAAK,EAAE;IACL,yBAAyB,EAAE,CAAC,cAAc,EAAE,MAAM,KAAK,IAAI,CAAC;CAC7D,iBAgBF;AACD,eAAO,MAAM,mBAAmB;;;;;;CAM/B,CAAC"}
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
import type { JsonRpcEngineNextCallback, JsonRpcEngineEndCallback } from "@metamask/json-rpc-engine";
|
|
2
|
+
import type { JsonRpcSuccess, Json, JsonRpcRequest } from "@metamask/utils";
|
|
3
|
+
/**
|
|
4
|
+
* Handler for the `wallet_revokeSession` RPC method as specified by [CAIP-285](https://chainagnostic.org/CAIPs/caip-285).
|
|
5
|
+
* The implementation below deviates from the linked spec in that it ignores the `sessionId` param
|
|
6
|
+
* and instead revokes the singular session for the origin if available. Additionally,
|
|
7
|
+
* the handler also does not return an error if there is currently no active session and instead
|
|
8
|
+
* returns true which is the same result returned if an active session was actually revoked.
|
|
9
|
+
*
|
|
10
|
+
* @param _request - The JSON-RPC request object. Unused.
|
|
11
|
+
* @param response - The JSON-RPC response object.
|
|
12
|
+
* @param _next - The next middleware function. Unused.
|
|
13
|
+
* @param end - The end callback function.
|
|
14
|
+
* @param hooks - The hooks object.
|
|
15
|
+
* @param hooks.revokePermissionForOrigin - The hook for revoking a permission for an origin function.
|
|
16
|
+
* @returns Nothing.
|
|
17
|
+
*/
|
|
18
|
+
declare function walletRevokeSessionHandler(_request: JsonRpcRequest & {
|
|
19
|
+
origin: string;
|
|
20
|
+
}, response: JsonRpcSuccess<Json>, _next: JsonRpcEngineNextCallback, end: JsonRpcEngineEndCallback, hooks: {
|
|
21
|
+
revokePermissionForOrigin: (permissionName: string) => void;
|
|
22
|
+
}): Promise<void>;
|
|
23
|
+
export declare const walletRevokeSession: {
|
|
24
|
+
methodNames: string[];
|
|
25
|
+
implementation: typeof walletRevokeSessionHandler;
|
|
26
|
+
hookNames: {
|
|
27
|
+
revokePermissionForOrigin: boolean;
|
|
28
|
+
};
|
|
29
|
+
};
|
|
30
|
+
export {};
|
|
31
|
+
//# sourceMappingURL=wallet-revokeSession.d.mts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"wallet-revokeSession.d.mts","sourceRoot":"","sources":["../../src/handlers/wallet-revokeSession.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EACV,yBAAyB,EACzB,wBAAwB,EACzB,kCAAkC;AAMnC,OAAO,KAAK,EAAE,cAAc,EAAE,IAAI,EAAE,cAAc,EAAE,wBAAwB;AAE5E;;;;;;;;;;;;;;GAcG;AACH,iBAAe,0BAA0B,CACvC,QAAQ,EAAE,cAAc,GAAG;IAAE,MAAM,EAAE,MAAM,CAAA;CAAE,EAC7C,QAAQ,EAAE,cAAc,CAAC,IAAI,CAAC,EAC9B,KAAK,EAAE,yBAAyB,EAChC,GAAG,EAAE,wBAAwB,EAC7B,KAAK,EAAE;IACL,yBAAyB,EAAE,CAAC,cAAc,EAAE,MAAM,KAAK,IAAI,CAAC;CAC7D,iBAgBF;AACD,eAAO,MAAM,mBAAmB;;;;;;CAM/B,CAAC"}
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
import { Caip25EndowmentPermissionName } from "@metamask/chain-agnostic-permission";
|
|
2
|
+
import { PermissionDoesNotExistError, UnrecognizedSubjectError } from "@metamask/permission-controller";
|
|
3
|
+
import { rpcErrors } from "@metamask/rpc-errors";
|
|
4
|
+
/**
|
|
5
|
+
* Handler for the `wallet_revokeSession` RPC method as specified by [CAIP-285](https://chainagnostic.org/CAIPs/caip-285).
|
|
6
|
+
* The implementation below deviates from the linked spec in that it ignores the `sessionId` param
|
|
7
|
+
* and instead revokes the singular session for the origin if available. Additionally,
|
|
8
|
+
* the handler also does not return an error if there is currently no active session and instead
|
|
9
|
+
* returns true which is the same result returned if an active session was actually revoked.
|
|
10
|
+
*
|
|
11
|
+
* @param _request - The JSON-RPC request object. Unused.
|
|
12
|
+
* @param response - The JSON-RPC response object.
|
|
13
|
+
* @param _next - The next middleware function. Unused.
|
|
14
|
+
* @param end - The end callback function.
|
|
15
|
+
* @param hooks - The hooks object.
|
|
16
|
+
* @param hooks.revokePermissionForOrigin - The hook for revoking a permission for an origin function.
|
|
17
|
+
* @returns Nothing.
|
|
18
|
+
*/
|
|
19
|
+
async function walletRevokeSessionHandler(_request, response, _next, end, hooks) {
|
|
20
|
+
try {
|
|
21
|
+
hooks.revokePermissionForOrigin(Caip25EndowmentPermissionName);
|
|
22
|
+
}
|
|
23
|
+
catch (err) {
|
|
24
|
+
if (!(err instanceof UnrecognizedSubjectError) &&
|
|
25
|
+
!(err instanceof PermissionDoesNotExistError)) {
|
|
26
|
+
console.error(err);
|
|
27
|
+
return end(rpcErrors.internal());
|
|
28
|
+
}
|
|
29
|
+
}
|
|
30
|
+
response.result = true;
|
|
31
|
+
return end();
|
|
32
|
+
}
|
|
33
|
+
export const walletRevokeSession = {
|
|
34
|
+
methodNames: ['wallet_revokeSession'],
|
|
35
|
+
implementation: walletRevokeSessionHandler,
|
|
36
|
+
hookNames: {
|
|
37
|
+
revokePermissionForOrigin: true,
|
|
38
|
+
},
|
|
39
|
+
};
|
|
40
|
+
//# sourceMappingURL=wallet-revokeSession.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"wallet-revokeSession.mjs","sourceRoot":"","sources":["../../src/handlers/wallet-revokeSession.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,6BAA6B,EAAE,4CAA4C;AAKpF,OAAO,EACL,2BAA2B,EAC3B,wBAAwB,EACzB,wCAAwC;AACzC,OAAO,EAAE,SAAS,EAAE,6BAA6B;AAGjD;;;;;;;;;;;;;;GAcG;AACH,KAAK,UAAU,0BAA0B,CACvC,QAA6C,EAC7C,QAA8B,EAC9B,KAAgC,EAChC,GAA6B,EAC7B,KAEC;IAED,IAAI;QACF,KAAK,CAAC,yBAAyB,CAAC,6BAA6B,CAAC,CAAC;KAChE;IAAC,OAAO,GAAG,EAAE;QACZ,IACE,CAAC,CAAC,GAAG,YAAY,wBAAwB,CAAC;YAC1C,CAAC,CAAC,GAAG,YAAY,2BAA2B,CAAC,EAC7C;YACA,OAAO,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;YACnB,OAAO,GAAG,CAAC,SAAS,CAAC,QAAQ,EAAE,CAAC,CAAC;SAClC;KACF;IAED,QAAQ,CAAC,MAAM,GAAG,IAAI,CAAC;IACvB,OAAO,GAAG,EAAE,CAAC;AACf,CAAC;AACD,MAAM,CAAC,MAAM,mBAAmB,GAAG;IACjC,WAAW,EAAE,CAAC,sBAAsB,CAAC;IACrC,cAAc,EAAE,0BAA0B;IAC1C,SAAS,EAAE;QACT,yBAAyB,EAAE,IAAI;KAChC;CACF,CAAC","sourcesContent":["import { Caip25EndowmentPermissionName } from '@metamask/chain-agnostic-permission';\nimport type {\n JsonRpcEngineNextCallback,\n JsonRpcEngineEndCallback,\n} from '@metamask/json-rpc-engine';\nimport {\n PermissionDoesNotExistError,\n UnrecognizedSubjectError,\n} from '@metamask/permission-controller';\nimport { rpcErrors } from '@metamask/rpc-errors';\nimport type { JsonRpcSuccess, Json, JsonRpcRequest } from '@metamask/utils';\n\n/**\n * Handler for the `wallet_revokeSession` RPC method as specified by [CAIP-285](https://chainagnostic.org/CAIPs/caip-285).\n * The implementation below deviates from the linked spec in that it ignores the `sessionId` param\n * and instead revokes the singular session for the origin if available. Additionally,\n * the handler also does not return an error if there is currently no active session and instead\n * returns true which is the same result returned if an active session was actually revoked.\n *\n * @param _request - The JSON-RPC request object. Unused.\n * @param response - The JSON-RPC response object.\n * @param _next - The next middleware function. Unused.\n * @param end - The end callback function.\n * @param hooks - The hooks object.\n * @param hooks.revokePermissionForOrigin - The hook for revoking a permission for an origin function.\n * @returns Nothing.\n */\nasync function walletRevokeSessionHandler(\n _request: JsonRpcRequest & { origin: string },\n response: JsonRpcSuccess<Json>,\n _next: JsonRpcEngineNextCallback,\n end: JsonRpcEngineEndCallback,\n hooks: {\n revokePermissionForOrigin: (permissionName: string) => void;\n },\n) {\n try {\n hooks.revokePermissionForOrigin(Caip25EndowmentPermissionName);\n } catch (err) {\n if (\n !(err instanceof UnrecognizedSubjectError) &&\n !(err instanceof PermissionDoesNotExistError)\n ) {\n console.error(err);\n return end(rpcErrors.internal());\n }\n }\n\n response.result = true;\n return end();\n}\nexport const walletRevokeSession = {\n methodNames: ['wallet_revokeSession'],\n implementation: walletRevokeSessionHandler,\n hookNames: {\n revokePermissionForOrigin: true,\n },\n};\n"]}
|
package/dist/index.cjs
ADDED
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.MultichainSubscriptionManager = exports.MultichainMiddlewareManager = exports.multichainMethodCallValidatorMiddleware = exports.walletRevokeSession = exports.walletInvokeMethod = exports.walletGetSession = void 0;
|
|
4
|
+
var wallet_getSession_1 = require("./handlers/wallet-getSession.cjs");
|
|
5
|
+
Object.defineProperty(exports, "walletGetSession", { enumerable: true, get: function () { return wallet_getSession_1.walletGetSession; } });
|
|
6
|
+
var wallet_invokeMethod_1 = require("./handlers/wallet-invokeMethod.cjs");
|
|
7
|
+
Object.defineProperty(exports, "walletInvokeMethod", { enumerable: true, get: function () { return wallet_invokeMethod_1.walletInvokeMethod; } });
|
|
8
|
+
var wallet_revokeSession_1 = require("./handlers/wallet-revokeSession.cjs");
|
|
9
|
+
Object.defineProperty(exports, "walletRevokeSession", { enumerable: true, get: function () { return wallet_revokeSession_1.walletRevokeSession; } });
|
|
10
|
+
var multichainMethodCallValidatorMiddleware_1 = require("./middlewares/multichainMethodCallValidatorMiddleware.cjs");
|
|
11
|
+
Object.defineProperty(exports, "multichainMethodCallValidatorMiddleware", { enumerable: true, get: function () { return multichainMethodCallValidatorMiddleware_1.multichainMethodCallValidatorMiddleware; } });
|
|
12
|
+
var MultichainMiddlewareManager_1 = require("./middlewares/MultichainMiddlewareManager.cjs");
|
|
13
|
+
Object.defineProperty(exports, "MultichainMiddlewareManager", { enumerable: true, get: function () { return MultichainMiddlewareManager_1.MultichainMiddlewareManager; } });
|
|
14
|
+
var MultichainSubscriptionManager_1 = require("./middlewares/MultichainSubscriptionManager.cjs");
|
|
15
|
+
Object.defineProperty(exports, "MultichainSubscriptionManager", { enumerable: true, get: function () { return MultichainSubscriptionManager_1.MultichainSubscriptionManager; } });
|
|
16
|
+
//# sourceMappingURL=index.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.cjs","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";;;AAAA,sEAAgE;AAAvD,qHAAA,gBAAgB,OAAA;AACzB,0EAAoE;AAA3D,yHAAA,kBAAkB,OAAA;AAC3B,4EAAsE;AAA7D,2HAAA,mBAAmB,OAAA;AAE5B,qHAAgH;AAAvG,kKAAA,uCAAuC,OAAA;AAChD,6FAAwF;AAA/E,0IAAA,2BAA2B,OAAA;AACpC,iGAA4F;AAAnF,8IAAA,6BAA6B,OAAA","sourcesContent":["export { walletGetSession } from './handlers/wallet-getSession';\nexport { walletInvokeMethod } from './handlers/wallet-invokeMethod';\nexport { walletRevokeSession } from './handlers/wallet-revokeSession';\n\nexport { multichainMethodCallValidatorMiddleware } from './middlewares/multichainMethodCallValidatorMiddleware';\nexport { MultichainMiddlewareManager } from './middlewares/MultichainMiddlewareManager';\nexport { MultichainSubscriptionManager } from './middlewares/MultichainSubscriptionManager';\n"]}
|
package/dist/index.d.cts
ADDED
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
export { walletGetSession } from "./handlers/wallet-getSession.cjs";
|
|
2
|
+
export { walletInvokeMethod } from "./handlers/wallet-invokeMethod.cjs";
|
|
3
|
+
export { walletRevokeSession } from "./handlers/wallet-revokeSession.cjs";
|
|
4
|
+
export { multichainMethodCallValidatorMiddleware } from "./middlewares/multichainMethodCallValidatorMiddleware.cjs";
|
|
5
|
+
export { MultichainMiddlewareManager } from "./middlewares/MultichainMiddlewareManager.cjs";
|
|
6
|
+
export { MultichainSubscriptionManager } from "./middlewares/MultichainSubscriptionManager.cjs";
|
|
7
|
+
//# sourceMappingURL=index.d.cts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.cts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,gBAAgB,EAAE,yCAAqC;AAChE,OAAO,EAAE,kBAAkB,EAAE,2CAAuC;AACpE,OAAO,EAAE,mBAAmB,EAAE,4CAAwC;AAEtE,OAAO,EAAE,uCAAuC,EAAE,kEAA8D;AAChH,OAAO,EAAE,2BAA2B,EAAE,sDAAkD;AACxF,OAAO,EAAE,6BAA6B,EAAE,wDAAoD"}
|
package/dist/index.d.mts
ADDED
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
export { walletGetSession } from "./handlers/wallet-getSession.mjs";
|
|
2
|
+
export { walletInvokeMethod } from "./handlers/wallet-invokeMethod.mjs";
|
|
3
|
+
export { walletRevokeSession } from "./handlers/wallet-revokeSession.mjs";
|
|
4
|
+
export { multichainMethodCallValidatorMiddleware } from "./middlewares/multichainMethodCallValidatorMiddleware.mjs";
|
|
5
|
+
export { MultichainMiddlewareManager } from "./middlewares/MultichainMiddlewareManager.mjs";
|
|
6
|
+
export { MultichainSubscriptionManager } from "./middlewares/MultichainSubscriptionManager.mjs";
|
|
7
|
+
//# sourceMappingURL=index.d.mts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.mts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,gBAAgB,EAAE,yCAAqC;AAChE,OAAO,EAAE,kBAAkB,EAAE,2CAAuC;AACpE,OAAO,EAAE,mBAAmB,EAAE,4CAAwC;AAEtE,OAAO,EAAE,uCAAuC,EAAE,kEAA8D;AAChH,OAAO,EAAE,2BAA2B,EAAE,sDAAkD;AACxF,OAAO,EAAE,6BAA6B,EAAE,wDAAoD"}
|
package/dist/index.mjs
ADDED
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
export { walletGetSession } from "./handlers/wallet-getSession.mjs";
|
|
2
|
+
export { walletInvokeMethod } from "./handlers/wallet-invokeMethod.mjs";
|
|
3
|
+
export { walletRevokeSession } from "./handlers/wallet-revokeSession.mjs";
|
|
4
|
+
export { multichainMethodCallValidatorMiddleware } from "./middlewares/multichainMethodCallValidatorMiddleware.mjs";
|
|
5
|
+
export { MultichainMiddlewareManager } from "./middlewares/MultichainMiddlewareManager.mjs";
|
|
6
|
+
export { MultichainSubscriptionManager } from "./middlewares/MultichainSubscriptionManager.mjs";
|
|
7
|
+
//# sourceMappingURL=index.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.mjs","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,gBAAgB,EAAE,yCAAqC;AAChE,OAAO,EAAE,kBAAkB,EAAE,2CAAuC;AACpE,OAAO,EAAE,mBAAmB,EAAE,4CAAwC;AAEtE,OAAO,EAAE,uCAAuC,EAAE,kEAA8D;AAChH,OAAO,EAAE,2BAA2B,EAAE,sDAAkD;AACxF,OAAO,EAAE,6BAA6B,EAAE,wDAAoD","sourcesContent":["export { walletGetSession } from './handlers/wallet-getSession';\nexport { walletInvokeMethod } from './handlers/wallet-invokeMethod';\nexport { walletRevokeSession } from './handlers/wallet-revokeSession';\n\nexport { multichainMethodCallValidatorMiddleware } from './middlewares/multichainMethodCallValidatorMiddleware';\nexport { MultichainMiddlewareManager } from './middlewares/MultichainMiddlewareManager';\nexport { MultichainSubscriptionManager } from './middlewares/MultichainSubscriptionManager';\n"]}
|
|
@@ -0,0 +1,110 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __classPrivateFieldGet = (this && this.__classPrivateFieldGet) || function (receiver, state, kind, f) {
|
|
3
|
+
if (kind === "a" && !f) throw new TypeError("Private accessor was defined without a getter");
|
|
4
|
+
if (typeof state === "function" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError("Cannot read private member from an object whose class did not declare it");
|
|
5
|
+
return kind === "m" ? f : kind === "a" ? f.call(receiver) : f ? f.value : state.get(receiver);
|
|
6
|
+
};
|
|
7
|
+
var __classPrivateFieldSet = (this && this.__classPrivateFieldSet) || function (receiver, state, value, kind, f) {
|
|
8
|
+
if (kind === "m") throw new TypeError("Private method is not writable");
|
|
9
|
+
if (kind === "a" && !f) throw new TypeError("Private accessor was defined without a setter");
|
|
10
|
+
if (typeof state === "function" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError("Cannot write private member to an object whose class did not declare it");
|
|
11
|
+
return (kind === "a" ? f.call(receiver, value) : f ? f.value = value : state.set(receiver, value)), value;
|
|
12
|
+
};
|
|
13
|
+
var _MultichainMiddlewareManager_instances, _MultichainMiddlewareManager_middlewares, _MultichainMiddlewareManager_getMiddlewareEntry, _MultichainMiddlewareManager_removeMiddlewareEntry, _MultichainMiddlewareManager_removeMiddleware;
|
|
14
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
15
|
+
exports.MultichainMiddlewareManager = void 0;
|
|
16
|
+
const rpc_errors_1 = require("@metamask/rpc-errors");
|
|
17
|
+
// Methods related to eth_subscriptions
|
|
18
|
+
const SubscriptionMethods = ['eth_subscribe', 'eth_unsubscribe'];
|
|
19
|
+
/**
|
|
20
|
+
* A helper that facilates registering and calling of provided middleware instances
|
|
21
|
+
* in the RPC pipeline based on the incoming request's scope, origin, and tabId.
|
|
22
|
+
* The core purpose of this class is to enable and manage multichain subscriptions
|
|
23
|
+
* (i.e. eth_subscribe called accross different chains and domains).
|
|
24
|
+
*
|
|
25
|
+
* Note that only one middleware instance can be registered per scope, origin, tabId key.
|
|
26
|
+
*/
|
|
27
|
+
class MultichainMiddlewareManager {
|
|
28
|
+
constructor() {
|
|
29
|
+
_MultichainMiddlewareManager_instances.add(this);
|
|
30
|
+
_MultichainMiddlewareManager_middlewares.set(this, []);
|
|
31
|
+
}
|
|
32
|
+
addMiddleware(middlewareEntry) {
|
|
33
|
+
const { scope, origin, tabId } = middlewareEntry;
|
|
34
|
+
if (!__classPrivateFieldGet(this, _MultichainMiddlewareManager_instances, "m", _MultichainMiddlewareManager_getMiddlewareEntry).call(this, { scope, origin, tabId })) {
|
|
35
|
+
__classPrivateFieldGet(this, _MultichainMiddlewareManager_middlewares, "f").push(middlewareEntry);
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
removeMiddlewareByScope(scope) {
|
|
39
|
+
__classPrivateFieldGet(this, _MultichainMiddlewareManager_middlewares, "f").forEach((middlewareEntry) => {
|
|
40
|
+
if (middlewareEntry.scope === scope) {
|
|
41
|
+
__classPrivateFieldGet(this, _MultichainMiddlewareManager_instances, "m", _MultichainMiddlewareManager_removeMiddleware).call(this, middlewareEntry);
|
|
42
|
+
}
|
|
43
|
+
});
|
|
44
|
+
}
|
|
45
|
+
removeMiddlewareByScopeAndOrigin(scope, origin) {
|
|
46
|
+
__classPrivateFieldGet(this, _MultichainMiddlewareManager_middlewares, "f").forEach((middlewareEntry) => {
|
|
47
|
+
if (middlewareEntry.scope === scope &&
|
|
48
|
+
middlewareEntry.origin === origin) {
|
|
49
|
+
__classPrivateFieldGet(this, _MultichainMiddlewareManager_instances, "m", _MultichainMiddlewareManager_removeMiddleware).call(this, middlewareEntry);
|
|
50
|
+
}
|
|
51
|
+
});
|
|
52
|
+
}
|
|
53
|
+
removeMiddlewareByOriginAndTabId(origin, tabId) {
|
|
54
|
+
__classPrivateFieldGet(this, _MultichainMiddlewareManager_middlewares, "f").forEach((middlewareEntry) => {
|
|
55
|
+
if (middlewareEntry.origin === origin &&
|
|
56
|
+
middlewareEntry.tabId === tabId) {
|
|
57
|
+
__classPrivateFieldGet(this, _MultichainMiddlewareManager_instances, "m", _MultichainMiddlewareManager_removeMiddleware).call(this, middlewareEntry);
|
|
58
|
+
}
|
|
59
|
+
});
|
|
60
|
+
}
|
|
61
|
+
generateMultichainMiddlewareForOriginAndTabId(origin, tabId) {
|
|
62
|
+
const middleware = (req, res, next, end) => {
|
|
63
|
+
const { scope } = req;
|
|
64
|
+
const middlewareEntry = __classPrivateFieldGet(this, _MultichainMiddlewareManager_instances, "m", _MultichainMiddlewareManager_getMiddlewareEntry).call(this, {
|
|
65
|
+
scope,
|
|
66
|
+
origin,
|
|
67
|
+
tabId,
|
|
68
|
+
});
|
|
69
|
+
if (SubscriptionMethods.includes(req.method)) {
|
|
70
|
+
if (middlewareEntry) {
|
|
71
|
+
middlewareEntry.middleware(req, res, next, end);
|
|
72
|
+
}
|
|
73
|
+
else {
|
|
74
|
+
// TODO: Temporary safety guard to prevent requests with these methods
|
|
75
|
+
// from being forwarded to the RPC endpoint even though this scenario
|
|
76
|
+
// should not be possible.
|
|
77
|
+
return end(rpc_errors_1.rpcErrors.methodNotFound());
|
|
78
|
+
}
|
|
79
|
+
}
|
|
80
|
+
else {
|
|
81
|
+
return next();
|
|
82
|
+
}
|
|
83
|
+
return undefined;
|
|
84
|
+
};
|
|
85
|
+
middleware.destroy = this.removeMiddlewareByOriginAndTabId.bind(this, origin, tabId);
|
|
86
|
+
return middleware;
|
|
87
|
+
}
|
|
88
|
+
}
|
|
89
|
+
exports.MultichainMiddlewareManager = MultichainMiddlewareManager;
|
|
90
|
+
_MultichainMiddlewareManager_middlewares = new WeakMap(), _MultichainMiddlewareManager_instances = new WeakSet(), _MultichainMiddlewareManager_getMiddlewareEntry = function _MultichainMiddlewareManager_getMiddlewareEntry({ scope, origin, tabId, }) {
|
|
91
|
+
return __classPrivateFieldGet(this, _MultichainMiddlewareManager_middlewares, "f").find((middlewareEntry) => {
|
|
92
|
+
return (middlewareEntry.scope === scope &&
|
|
93
|
+
middlewareEntry.origin === origin &&
|
|
94
|
+
middlewareEntry.tabId === tabId);
|
|
95
|
+
});
|
|
96
|
+
}, _MultichainMiddlewareManager_removeMiddlewareEntry = function _MultichainMiddlewareManager_removeMiddlewareEntry({ scope, origin, tabId }) {
|
|
97
|
+
__classPrivateFieldSet(this, _MultichainMiddlewareManager_middlewares, __classPrivateFieldGet(this, _MultichainMiddlewareManager_middlewares, "f").filter((middlewareEntry) => {
|
|
98
|
+
return (middlewareEntry.scope !== scope ||
|
|
99
|
+
middlewareEntry.origin !== origin ||
|
|
100
|
+
middlewareEntry.tabId !== tabId);
|
|
101
|
+
}), "f");
|
|
102
|
+
}, _MultichainMiddlewareManager_removeMiddleware = function _MultichainMiddlewareManager_removeMiddleware(middlewareEntry) {
|
|
103
|
+
// When the destroy function on the middleware is async,
|
|
104
|
+
// we don't need to wait for it complete
|
|
105
|
+
Promise.resolve(middlewareEntry.middleware.destroy?.()).catch(() => {
|
|
106
|
+
// do nothing
|
|
107
|
+
});
|
|
108
|
+
__classPrivateFieldGet(this, _MultichainMiddlewareManager_instances, "m", _MultichainMiddlewareManager_removeMiddlewareEntry).call(this, middlewareEntry);
|
|
109
|
+
};
|
|
110
|
+
//# sourceMappingURL=MultichainMiddlewareManager.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"MultichainMiddlewareManager.cjs","sourceRoot":"","sources":["../../src/middlewares/MultichainMiddlewareManager.ts"],"names":[],"mappings":"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","sourcesContent":["import type { ExternalScopeString } from '@metamask/chain-agnostic-permission';\nimport type {\n JsonRpcEngineEndCallback,\n JsonRpcEngineNextCallback,\n} from '@metamask/json-rpc-engine';\nimport { rpcErrors } from '@metamask/rpc-errors';\nimport type {\n Json,\n JsonRpcRequest,\n PendingJsonRpcResponse,\n} from '@metamask/utils';\n\nexport type ExtendedJsonRpcMiddleware = {\n (\n req: JsonRpcRequest & { scope: string },\n res: PendingJsonRpcResponse<Json>,\n next: JsonRpcEngineNextCallback,\n end: JsonRpcEngineEndCallback,\n ): void;\n destroy?: () => void | Promise<void>;\n};\n\ntype MiddlewareKey = {\n scope: ExternalScopeString;\n origin: string;\n tabId?: number;\n};\ntype MiddlewareEntry = MiddlewareKey & {\n middleware: ExtendedJsonRpcMiddleware;\n};\n\n// Methods related to eth_subscriptions\nconst SubscriptionMethods = ['eth_subscribe', 'eth_unsubscribe'];\n\n/**\n * A helper that facilates registering and calling of provided middleware instances\n * in the RPC pipeline based on the incoming request's scope, origin, and tabId.\n * The core purpose of this class is to enable and manage multichain subscriptions\n * (i.e. eth_subscribe called accross different chains and domains).\n *\n * Note that only one middleware instance can be registered per scope, origin, tabId key.\n */\nexport class MultichainMiddlewareManager {\n #middlewares: MiddlewareEntry[] = [];\n\n #getMiddlewareEntry({\n scope,\n origin,\n tabId,\n }: MiddlewareKey): MiddlewareEntry | undefined {\n return this.#middlewares.find((middlewareEntry) => {\n return (\n middlewareEntry.scope === scope &&\n middlewareEntry.origin === origin &&\n middlewareEntry.tabId === tabId\n );\n });\n }\n\n #removeMiddlewareEntry({ scope, origin, tabId }: MiddlewareEntry) {\n this.#middlewares = this.#middlewares.filter((middlewareEntry) => {\n return (\n middlewareEntry.scope !== scope ||\n middlewareEntry.origin !== origin ||\n middlewareEntry.tabId !== tabId\n );\n });\n }\n\n addMiddleware(middlewareEntry: MiddlewareEntry) {\n const { scope, origin, tabId } = middlewareEntry;\n if (!this.#getMiddlewareEntry({ scope, origin, tabId })) {\n this.#middlewares.push(middlewareEntry);\n }\n }\n\n #removeMiddleware(middlewareEntry: MiddlewareEntry) {\n // When the destroy function on the middleware is async,\n // we don't need to wait for it complete\n Promise.resolve(middlewareEntry.middleware.destroy?.()).catch(() => {\n // do nothing\n });\n\n this.#removeMiddlewareEntry(middlewareEntry);\n }\n\n removeMiddlewareByScope(scope: ExternalScopeString) {\n this.#middlewares.forEach((middlewareEntry) => {\n if (middlewareEntry.scope === scope) {\n this.#removeMiddleware(middlewareEntry);\n }\n });\n }\n\n removeMiddlewareByScopeAndOrigin(scope: ExternalScopeString, origin: string) {\n this.#middlewares.forEach((middlewareEntry) => {\n if (\n middlewareEntry.scope === scope &&\n middlewareEntry.origin === origin\n ) {\n this.#removeMiddleware(middlewareEntry);\n }\n });\n }\n\n removeMiddlewareByOriginAndTabId(origin: string, tabId?: number) {\n this.#middlewares.forEach((middlewareEntry) => {\n if (\n middlewareEntry.origin === origin &&\n middlewareEntry.tabId === tabId\n ) {\n this.#removeMiddleware(middlewareEntry);\n }\n });\n }\n\n generateMultichainMiddlewareForOriginAndTabId(\n origin: string,\n tabId?: number,\n ) {\n const middleware: ExtendedJsonRpcMiddleware = (req, res, next, end) => {\n const { scope } = req;\n const middlewareEntry = this.#getMiddlewareEntry({\n scope,\n origin,\n tabId,\n });\n\n if (SubscriptionMethods.includes(req.method)) {\n if (middlewareEntry) {\n middlewareEntry.middleware(req, res, next, end);\n } else {\n // TODO: Temporary safety guard to prevent requests with these methods\n // from being forwarded to the RPC endpoint even though this scenario\n // should not be possible.\n return end(rpcErrors.methodNotFound());\n }\n } else {\n return next();\n }\n return undefined;\n };\n middleware.destroy = this.removeMiddlewareByOriginAndTabId.bind(\n this,\n origin,\n tabId,\n );\n\n return middleware;\n }\n}\n"]}
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
import type { ExternalScopeString } from "@metamask/chain-agnostic-permission";
|
|
2
|
+
import type { JsonRpcEngineEndCallback, JsonRpcEngineNextCallback } from "@metamask/json-rpc-engine";
|
|
3
|
+
import type { Json, JsonRpcRequest, PendingJsonRpcResponse } from "@metamask/utils";
|
|
4
|
+
export type ExtendedJsonRpcMiddleware = {
|
|
5
|
+
(req: JsonRpcRequest & {
|
|
6
|
+
scope: string;
|
|
7
|
+
}, res: PendingJsonRpcResponse<Json>, next: JsonRpcEngineNextCallback, end: JsonRpcEngineEndCallback): void;
|
|
8
|
+
destroy?: () => void | Promise<void>;
|
|
9
|
+
};
|
|
10
|
+
type MiddlewareKey = {
|
|
11
|
+
scope: ExternalScopeString;
|
|
12
|
+
origin: string;
|
|
13
|
+
tabId?: number;
|
|
14
|
+
};
|
|
15
|
+
type MiddlewareEntry = MiddlewareKey & {
|
|
16
|
+
middleware: ExtendedJsonRpcMiddleware;
|
|
17
|
+
};
|
|
18
|
+
/**
|
|
19
|
+
* A helper that facilates registering and calling of provided middleware instances
|
|
20
|
+
* in the RPC pipeline based on the incoming request's scope, origin, and tabId.
|
|
21
|
+
* The core purpose of this class is to enable and manage multichain subscriptions
|
|
22
|
+
* (i.e. eth_subscribe called accross different chains and domains).
|
|
23
|
+
*
|
|
24
|
+
* Note that only one middleware instance can be registered per scope, origin, tabId key.
|
|
25
|
+
*/
|
|
26
|
+
export declare class MultichainMiddlewareManager {
|
|
27
|
+
#private;
|
|
28
|
+
addMiddleware(middlewareEntry: MiddlewareEntry): void;
|
|
29
|
+
removeMiddlewareByScope(scope: ExternalScopeString): void;
|
|
30
|
+
removeMiddlewareByScopeAndOrigin(scope: ExternalScopeString, origin: string): void;
|
|
31
|
+
removeMiddlewareByOriginAndTabId(origin: string, tabId?: number): void;
|
|
32
|
+
generateMultichainMiddlewareForOriginAndTabId(origin: string, tabId?: number): ExtendedJsonRpcMiddleware;
|
|
33
|
+
}
|
|
34
|
+
export {};
|
|
35
|
+
//# sourceMappingURL=MultichainMiddlewareManager.d.cts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"MultichainMiddlewareManager.d.cts","sourceRoot":"","sources":["../../src/middlewares/MultichainMiddlewareManager.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,mBAAmB,EAAE,4CAA4C;AAC/E,OAAO,KAAK,EACV,wBAAwB,EACxB,yBAAyB,EAC1B,kCAAkC;AAEnC,OAAO,KAAK,EACV,IAAI,EACJ,cAAc,EACd,sBAAsB,EACvB,wBAAwB;AAEzB,MAAM,MAAM,yBAAyB,GAAG;IACtC,CACE,GAAG,EAAE,cAAc,GAAG;QAAE,KAAK,EAAE,MAAM,CAAA;KAAE,EACvC,GAAG,EAAE,sBAAsB,CAAC,IAAI,CAAC,EACjC,IAAI,EAAE,yBAAyB,EAC/B,GAAG,EAAE,wBAAwB,GAC5B,IAAI,CAAC;IACR,OAAO,CAAC,EAAE,MAAM,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;CACtC,CAAC;AAEF,KAAK,aAAa,GAAG;IACnB,KAAK,EAAE,mBAAmB,CAAC;IAC3B,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB,CAAC;AACF,KAAK,eAAe,GAAG,aAAa,GAAG;IACrC,UAAU,EAAE,yBAAyB,CAAC;CACvC,CAAC;AAKF;;;;;;;GAOG;AACH,qBAAa,2BAA2B;;IA2BtC,aAAa,CAAC,eAAe,EAAE,eAAe;IAiB9C,uBAAuB,CAAC,KAAK,EAAE,mBAAmB;IAQlD,gCAAgC,CAAC,KAAK,EAAE,mBAAmB,EAAE,MAAM,EAAE,MAAM;IAW3E,gCAAgC,CAAC,MAAM,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,MAAM;IAW/D,6CAA6C,CAC3C,MAAM,EAAE,MAAM,EACd,KAAK,CAAC,EAAE,MAAM;CAgCjB"}
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
import type { ExternalScopeString } from "@metamask/chain-agnostic-permission";
|
|
2
|
+
import type { JsonRpcEngineEndCallback, JsonRpcEngineNextCallback } from "@metamask/json-rpc-engine";
|
|
3
|
+
import type { Json, JsonRpcRequest, PendingJsonRpcResponse } from "@metamask/utils";
|
|
4
|
+
export type ExtendedJsonRpcMiddleware = {
|
|
5
|
+
(req: JsonRpcRequest & {
|
|
6
|
+
scope: string;
|
|
7
|
+
}, res: PendingJsonRpcResponse<Json>, next: JsonRpcEngineNextCallback, end: JsonRpcEngineEndCallback): void;
|
|
8
|
+
destroy?: () => void | Promise<void>;
|
|
9
|
+
};
|
|
10
|
+
type MiddlewareKey = {
|
|
11
|
+
scope: ExternalScopeString;
|
|
12
|
+
origin: string;
|
|
13
|
+
tabId?: number;
|
|
14
|
+
};
|
|
15
|
+
type MiddlewareEntry = MiddlewareKey & {
|
|
16
|
+
middleware: ExtendedJsonRpcMiddleware;
|
|
17
|
+
};
|
|
18
|
+
/**
|
|
19
|
+
* A helper that facilates registering and calling of provided middleware instances
|
|
20
|
+
* in the RPC pipeline based on the incoming request's scope, origin, and tabId.
|
|
21
|
+
* The core purpose of this class is to enable and manage multichain subscriptions
|
|
22
|
+
* (i.e. eth_subscribe called accross different chains and domains).
|
|
23
|
+
*
|
|
24
|
+
* Note that only one middleware instance can be registered per scope, origin, tabId key.
|
|
25
|
+
*/
|
|
26
|
+
export declare class MultichainMiddlewareManager {
|
|
27
|
+
#private;
|
|
28
|
+
addMiddleware(middlewareEntry: MiddlewareEntry): void;
|
|
29
|
+
removeMiddlewareByScope(scope: ExternalScopeString): void;
|
|
30
|
+
removeMiddlewareByScopeAndOrigin(scope: ExternalScopeString, origin: string): void;
|
|
31
|
+
removeMiddlewareByOriginAndTabId(origin: string, tabId?: number): void;
|
|
32
|
+
generateMultichainMiddlewareForOriginAndTabId(origin: string, tabId?: number): ExtendedJsonRpcMiddleware;
|
|
33
|
+
}
|
|
34
|
+
export {};
|
|
35
|
+
//# sourceMappingURL=MultichainMiddlewareManager.d.mts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"MultichainMiddlewareManager.d.mts","sourceRoot":"","sources":["../../src/middlewares/MultichainMiddlewareManager.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,mBAAmB,EAAE,4CAA4C;AAC/E,OAAO,KAAK,EACV,wBAAwB,EACxB,yBAAyB,EAC1B,kCAAkC;AAEnC,OAAO,KAAK,EACV,IAAI,EACJ,cAAc,EACd,sBAAsB,EACvB,wBAAwB;AAEzB,MAAM,MAAM,yBAAyB,GAAG;IACtC,CACE,GAAG,EAAE,cAAc,GAAG;QAAE,KAAK,EAAE,MAAM,CAAA;KAAE,EACvC,GAAG,EAAE,sBAAsB,CAAC,IAAI,CAAC,EACjC,IAAI,EAAE,yBAAyB,EAC/B,GAAG,EAAE,wBAAwB,GAC5B,IAAI,CAAC;IACR,OAAO,CAAC,EAAE,MAAM,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;CACtC,CAAC;AAEF,KAAK,aAAa,GAAG;IACnB,KAAK,EAAE,mBAAmB,CAAC;IAC3B,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB,CAAC;AACF,KAAK,eAAe,GAAG,aAAa,GAAG;IACrC,UAAU,EAAE,yBAAyB,CAAC;CACvC,CAAC;AAKF;;;;;;;GAOG;AACH,qBAAa,2BAA2B;;IA2BtC,aAAa,CAAC,eAAe,EAAE,eAAe;IAiB9C,uBAAuB,CAAC,KAAK,EAAE,mBAAmB;IAQlD,gCAAgC,CAAC,KAAK,EAAE,mBAAmB,EAAE,MAAM,EAAE,MAAM;IAW3E,gCAAgC,CAAC,MAAM,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,MAAM;IAW/D,6CAA6C,CAC3C,MAAM,EAAE,MAAM,EACd,KAAK,CAAC,EAAE,MAAM;CAgCjB"}
|
|
@@ -0,0 +1,106 @@
|
|
|
1
|
+
var __classPrivateFieldGet = (this && this.__classPrivateFieldGet) || function (receiver, state, kind, f) {
|
|
2
|
+
if (kind === "a" && !f) throw new TypeError("Private accessor was defined without a getter");
|
|
3
|
+
if (typeof state === "function" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError("Cannot read private member from an object whose class did not declare it");
|
|
4
|
+
return kind === "m" ? f : kind === "a" ? f.call(receiver) : f ? f.value : state.get(receiver);
|
|
5
|
+
};
|
|
6
|
+
var __classPrivateFieldSet = (this && this.__classPrivateFieldSet) || function (receiver, state, value, kind, f) {
|
|
7
|
+
if (kind === "m") throw new TypeError("Private method is not writable");
|
|
8
|
+
if (kind === "a" && !f) throw new TypeError("Private accessor was defined without a setter");
|
|
9
|
+
if (typeof state === "function" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError("Cannot write private member to an object whose class did not declare it");
|
|
10
|
+
return (kind === "a" ? f.call(receiver, value) : f ? f.value = value : state.set(receiver, value)), value;
|
|
11
|
+
};
|
|
12
|
+
var _MultichainMiddlewareManager_instances, _MultichainMiddlewareManager_middlewares, _MultichainMiddlewareManager_getMiddlewareEntry, _MultichainMiddlewareManager_removeMiddlewareEntry, _MultichainMiddlewareManager_removeMiddleware;
|
|
13
|
+
import { rpcErrors } from "@metamask/rpc-errors";
|
|
14
|
+
// Methods related to eth_subscriptions
|
|
15
|
+
const SubscriptionMethods = ['eth_subscribe', 'eth_unsubscribe'];
|
|
16
|
+
/**
|
|
17
|
+
* A helper that facilates registering and calling of provided middleware instances
|
|
18
|
+
* in the RPC pipeline based on the incoming request's scope, origin, and tabId.
|
|
19
|
+
* The core purpose of this class is to enable and manage multichain subscriptions
|
|
20
|
+
* (i.e. eth_subscribe called accross different chains and domains).
|
|
21
|
+
*
|
|
22
|
+
* Note that only one middleware instance can be registered per scope, origin, tabId key.
|
|
23
|
+
*/
|
|
24
|
+
export class MultichainMiddlewareManager {
|
|
25
|
+
constructor() {
|
|
26
|
+
_MultichainMiddlewareManager_instances.add(this);
|
|
27
|
+
_MultichainMiddlewareManager_middlewares.set(this, []);
|
|
28
|
+
}
|
|
29
|
+
addMiddleware(middlewareEntry) {
|
|
30
|
+
const { scope, origin, tabId } = middlewareEntry;
|
|
31
|
+
if (!__classPrivateFieldGet(this, _MultichainMiddlewareManager_instances, "m", _MultichainMiddlewareManager_getMiddlewareEntry).call(this, { scope, origin, tabId })) {
|
|
32
|
+
__classPrivateFieldGet(this, _MultichainMiddlewareManager_middlewares, "f").push(middlewareEntry);
|
|
33
|
+
}
|
|
34
|
+
}
|
|
35
|
+
removeMiddlewareByScope(scope) {
|
|
36
|
+
__classPrivateFieldGet(this, _MultichainMiddlewareManager_middlewares, "f").forEach((middlewareEntry) => {
|
|
37
|
+
if (middlewareEntry.scope === scope) {
|
|
38
|
+
__classPrivateFieldGet(this, _MultichainMiddlewareManager_instances, "m", _MultichainMiddlewareManager_removeMiddleware).call(this, middlewareEntry);
|
|
39
|
+
}
|
|
40
|
+
});
|
|
41
|
+
}
|
|
42
|
+
removeMiddlewareByScopeAndOrigin(scope, origin) {
|
|
43
|
+
__classPrivateFieldGet(this, _MultichainMiddlewareManager_middlewares, "f").forEach((middlewareEntry) => {
|
|
44
|
+
if (middlewareEntry.scope === scope &&
|
|
45
|
+
middlewareEntry.origin === origin) {
|
|
46
|
+
__classPrivateFieldGet(this, _MultichainMiddlewareManager_instances, "m", _MultichainMiddlewareManager_removeMiddleware).call(this, middlewareEntry);
|
|
47
|
+
}
|
|
48
|
+
});
|
|
49
|
+
}
|
|
50
|
+
removeMiddlewareByOriginAndTabId(origin, tabId) {
|
|
51
|
+
__classPrivateFieldGet(this, _MultichainMiddlewareManager_middlewares, "f").forEach((middlewareEntry) => {
|
|
52
|
+
if (middlewareEntry.origin === origin &&
|
|
53
|
+
middlewareEntry.tabId === tabId) {
|
|
54
|
+
__classPrivateFieldGet(this, _MultichainMiddlewareManager_instances, "m", _MultichainMiddlewareManager_removeMiddleware).call(this, middlewareEntry);
|
|
55
|
+
}
|
|
56
|
+
});
|
|
57
|
+
}
|
|
58
|
+
generateMultichainMiddlewareForOriginAndTabId(origin, tabId) {
|
|
59
|
+
const middleware = (req, res, next, end) => {
|
|
60
|
+
const { scope } = req;
|
|
61
|
+
const middlewareEntry = __classPrivateFieldGet(this, _MultichainMiddlewareManager_instances, "m", _MultichainMiddlewareManager_getMiddlewareEntry).call(this, {
|
|
62
|
+
scope,
|
|
63
|
+
origin,
|
|
64
|
+
tabId,
|
|
65
|
+
});
|
|
66
|
+
if (SubscriptionMethods.includes(req.method)) {
|
|
67
|
+
if (middlewareEntry) {
|
|
68
|
+
middlewareEntry.middleware(req, res, next, end);
|
|
69
|
+
}
|
|
70
|
+
else {
|
|
71
|
+
// TODO: Temporary safety guard to prevent requests with these methods
|
|
72
|
+
// from being forwarded to the RPC endpoint even though this scenario
|
|
73
|
+
// should not be possible.
|
|
74
|
+
return end(rpcErrors.methodNotFound());
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
else {
|
|
78
|
+
return next();
|
|
79
|
+
}
|
|
80
|
+
return undefined;
|
|
81
|
+
};
|
|
82
|
+
middleware.destroy = this.removeMiddlewareByOriginAndTabId.bind(this, origin, tabId);
|
|
83
|
+
return middleware;
|
|
84
|
+
}
|
|
85
|
+
}
|
|
86
|
+
_MultichainMiddlewareManager_middlewares = new WeakMap(), _MultichainMiddlewareManager_instances = new WeakSet(), _MultichainMiddlewareManager_getMiddlewareEntry = function _MultichainMiddlewareManager_getMiddlewareEntry({ scope, origin, tabId, }) {
|
|
87
|
+
return __classPrivateFieldGet(this, _MultichainMiddlewareManager_middlewares, "f").find((middlewareEntry) => {
|
|
88
|
+
return (middlewareEntry.scope === scope &&
|
|
89
|
+
middlewareEntry.origin === origin &&
|
|
90
|
+
middlewareEntry.tabId === tabId);
|
|
91
|
+
});
|
|
92
|
+
}, _MultichainMiddlewareManager_removeMiddlewareEntry = function _MultichainMiddlewareManager_removeMiddlewareEntry({ scope, origin, tabId }) {
|
|
93
|
+
__classPrivateFieldSet(this, _MultichainMiddlewareManager_middlewares, __classPrivateFieldGet(this, _MultichainMiddlewareManager_middlewares, "f").filter((middlewareEntry) => {
|
|
94
|
+
return (middlewareEntry.scope !== scope ||
|
|
95
|
+
middlewareEntry.origin !== origin ||
|
|
96
|
+
middlewareEntry.tabId !== tabId);
|
|
97
|
+
}), "f");
|
|
98
|
+
}, _MultichainMiddlewareManager_removeMiddleware = function _MultichainMiddlewareManager_removeMiddleware(middlewareEntry) {
|
|
99
|
+
// When the destroy function on the middleware is async,
|
|
100
|
+
// we don't need to wait for it complete
|
|
101
|
+
Promise.resolve(middlewareEntry.middleware.destroy?.()).catch(() => {
|
|
102
|
+
// do nothing
|
|
103
|
+
});
|
|
104
|
+
__classPrivateFieldGet(this, _MultichainMiddlewareManager_instances, "m", _MultichainMiddlewareManager_removeMiddlewareEntry).call(this, middlewareEntry);
|
|
105
|
+
};
|
|
106
|
+
//# sourceMappingURL=MultichainMiddlewareManager.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"MultichainMiddlewareManager.mjs","sourceRoot":"","sources":["../../src/middlewares/MultichainMiddlewareManager.ts"],"names":[],"mappings":"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","sourcesContent":["import type { ExternalScopeString } from '@metamask/chain-agnostic-permission';\nimport type {\n JsonRpcEngineEndCallback,\n JsonRpcEngineNextCallback,\n} from '@metamask/json-rpc-engine';\nimport { rpcErrors } from '@metamask/rpc-errors';\nimport type {\n Json,\n JsonRpcRequest,\n PendingJsonRpcResponse,\n} from '@metamask/utils';\n\nexport type ExtendedJsonRpcMiddleware = {\n (\n req: JsonRpcRequest & { scope: string },\n res: PendingJsonRpcResponse<Json>,\n next: JsonRpcEngineNextCallback,\n end: JsonRpcEngineEndCallback,\n ): void;\n destroy?: () => void | Promise<void>;\n};\n\ntype MiddlewareKey = {\n scope: ExternalScopeString;\n origin: string;\n tabId?: number;\n};\ntype MiddlewareEntry = MiddlewareKey & {\n middleware: ExtendedJsonRpcMiddleware;\n};\n\n// Methods related to eth_subscriptions\nconst SubscriptionMethods = ['eth_subscribe', 'eth_unsubscribe'];\n\n/**\n * A helper that facilates registering and calling of provided middleware instances\n * in the RPC pipeline based on the incoming request's scope, origin, and tabId.\n * The core purpose of this class is to enable and manage multichain subscriptions\n * (i.e. eth_subscribe called accross different chains and domains).\n *\n * Note that only one middleware instance can be registered per scope, origin, tabId key.\n */\nexport class MultichainMiddlewareManager {\n #middlewares: MiddlewareEntry[] = [];\n\n #getMiddlewareEntry({\n scope,\n origin,\n tabId,\n }: MiddlewareKey): MiddlewareEntry | undefined {\n return this.#middlewares.find((middlewareEntry) => {\n return (\n middlewareEntry.scope === scope &&\n middlewareEntry.origin === origin &&\n middlewareEntry.tabId === tabId\n );\n });\n }\n\n #removeMiddlewareEntry({ scope, origin, tabId }: MiddlewareEntry) {\n this.#middlewares = this.#middlewares.filter((middlewareEntry) => {\n return (\n middlewareEntry.scope !== scope ||\n middlewareEntry.origin !== origin ||\n middlewareEntry.tabId !== tabId\n );\n });\n }\n\n addMiddleware(middlewareEntry: MiddlewareEntry) {\n const { scope, origin, tabId } = middlewareEntry;\n if (!this.#getMiddlewareEntry({ scope, origin, tabId })) {\n this.#middlewares.push(middlewareEntry);\n }\n }\n\n #removeMiddleware(middlewareEntry: MiddlewareEntry) {\n // When the destroy function on the middleware is async,\n // we don't need to wait for it complete\n Promise.resolve(middlewareEntry.middleware.destroy?.()).catch(() => {\n // do nothing\n });\n\n this.#removeMiddlewareEntry(middlewareEntry);\n }\n\n removeMiddlewareByScope(scope: ExternalScopeString) {\n this.#middlewares.forEach((middlewareEntry) => {\n if (middlewareEntry.scope === scope) {\n this.#removeMiddleware(middlewareEntry);\n }\n });\n }\n\n removeMiddlewareByScopeAndOrigin(scope: ExternalScopeString, origin: string) {\n this.#middlewares.forEach((middlewareEntry) => {\n if (\n middlewareEntry.scope === scope &&\n middlewareEntry.origin === origin\n ) {\n this.#removeMiddleware(middlewareEntry);\n }\n });\n }\n\n removeMiddlewareByOriginAndTabId(origin: string, tabId?: number) {\n this.#middlewares.forEach((middlewareEntry) => {\n if (\n middlewareEntry.origin === origin &&\n middlewareEntry.tabId === tabId\n ) {\n this.#removeMiddleware(middlewareEntry);\n }\n });\n }\n\n generateMultichainMiddlewareForOriginAndTabId(\n origin: string,\n tabId?: number,\n ) {\n const middleware: ExtendedJsonRpcMiddleware = (req, res, next, end) => {\n const { scope } = req;\n const middlewareEntry = this.#getMiddlewareEntry({\n scope,\n origin,\n tabId,\n });\n\n if (SubscriptionMethods.includes(req.method)) {\n if (middlewareEntry) {\n middlewareEntry.middleware(req, res, next, end);\n } else {\n // TODO: Temporary safety guard to prevent requests with these methods\n // from being forwarded to the RPC endpoint even though this scenario\n // should not be possible.\n return end(rpcErrors.methodNotFound());\n }\n } else {\n return next();\n }\n return undefined;\n };\n middleware.destroy = this.removeMiddlewareByOriginAndTabId.bind(\n this,\n origin,\n tabId,\n );\n\n return middleware;\n }\n}\n"]}
|