@metamask-previews/multichain-api-middleware 4.0.3-preview-4f4c98e → 4.0.3-preview-5b293ee50
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 +0 -4
- package/dist/handlers/index.cjs +20 -0
- package/dist/handlers/index.cjs.map +1 -0
- package/dist/handlers/index.d.cts +25 -0
- package/dist/handlers/index.d.cts.map +1 -0
- package/dist/handlers/index.d.mts +25 -0
- package/dist/handlers/index.d.mts.map +1 -0
- package/dist/handlers/{index.js → index.mjs} +5 -5
- package/dist/handlers/index.mjs.map +1 -0
- package/dist/handlers/types.cjs +13 -0
- package/dist/handlers/types.cjs.map +1 -0
- package/dist/handlers/{types.d.ts → types.d.cts} +5 -5
- package/dist/handlers/types.d.cts.map +1 -0
- package/dist/handlers/types.d.mts +27 -0
- package/dist/handlers/types.d.mts.map +1 -0
- package/dist/handlers/{types.js → types.mjs} +2 -1
- package/dist/handlers/types.mjs.map +1 -0
- package/dist/handlers/wallet-createSession.cjs +179 -0
- package/dist/handlers/wallet-createSession.cjs.map +1 -0
- package/dist/handlers/{wallet-createSession.d.ts → wallet-createSession.d.cts} +9 -9
- package/dist/handlers/wallet-createSession.d.cts.map +1 -0
- package/dist/handlers/wallet-createSession.d.mts +70 -0
- package/dist/handlers/wallet-createSession.d.mts.map +1 -0
- package/dist/handlers/{wallet-createSession.js → wallet-createSession.mjs} +6 -6
- package/dist/handlers/wallet-createSession.mjs.map +1 -0
- package/dist/handlers/wallet-getSession.cjs +54 -0
- package/dist/handlers/wallet-getSession.cjs.map +1 -0
- package/dist/handlers/{wallet-getSession.d.ts → wallet-getSession.d.cts} +5 -5
- package/dist/handlers/wallet-getSession.d.cts.map +1 -0
- package/dist/handlers/wallet-getSession.d.mts +43 -0
- package/dist/handlers/wallet-getSession.d.mts.map +1 -0
- package/dist/handlers/{wallet-getSession.js → wallet-getSession.mjs} +2 -2
- package/dist/handlers/wallet-getSession.mjs.map +1 -0
- package/dist/handlers/wallet-invokeMethod.cjs +103 -0
- package/dist/handlers/wallet-invokeMethod.cjs.map +1 -0
- package/dist/handlers/{wallet-invokeMethod.d.ts → wallet-invokeMethod.d.cts} +7 -7
- package/dist/handlers/wallet-invokeMethod.d.cts.map +1 -0
- package/dist/handlers/wallet-invokeMethod.d.mts +57 -0
- package/dist/handlers/wallet-invokeMethod.d.mts.map +1 -0
- package/dist/handlers/{wallet-invokeMethod.js → wallet-invokeMethod.mjs} +4 -4
- package/dist/handlers/wallet-invokeMethod.mjs.map +1 -0
- package/dist/handlers/wallet-revokeSession.cjs +106 -0
- package/dist/handlers/wallet-revokeSession.cjs.map +1 -0
- package/dist/handlers/{wallet-revokeSession.d.ts → wallet-revokeSession.d.cts} +6 -6
- package/dist/handlers/wallet-revokeSession.d.cts.map +1 -0
- package/dist/handlers/wallet-revokeSession.d.mts +45 -0
- package/dist/handlers/wallet-revokeSession.d.mts.map +1 -0
- package/dist/handlers/{wallet-revokeSession.js → wallet-revokeSession.mjs} +5 -5
- package/dist/handlers/wallet-revokeSession.mjs.map +1 -0
- package/dist/index.cjs +14 -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 +6 -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.ts → MultichainMiddlewareManager.d.cts} +4 -4
- 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.js → MultichainMiddlewareManager.mjs} +2 -2
- package/dist/middlewares/MultichainMiddlewareManager.mjs.map +1 -0
- package/dist/middlewares/MultichainSubscriptionManager.cjs +118 -0
- package/dist/middlewares/MultichainSubscriptionManager.cjs.map +1 -0
- package/dist/middlewares/{MultichainSubscriptionManager.d.ts → MultichainSubscriptionManager.d.cts} +6 -6
- 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.js → MultichainSubscriptionManager.mjs} +13 -6
- 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.ts → multichainMethodCallValidatorMiddleware.d.cts} +2 -2
- 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.js → multichainMethodCallValidatorMiddleware.mjs} +15 -8
- package/dist/middlewares/multichainMethodCallValidatorMiddleware.mjs.map +1 -0
- package/package.json +17 -13
- package/dist/handlers/index.d.ts +0 -25
- package/dist/handlers/index.d.ts.map +0 -1
- package/dist/handlers/index.js.map +0 -1
- package/dist/handlers/types.d.ts.map +0 -1
- package/dist/handlers/types.js.map +0 -1
- package/dist/handlers/wallet-createSession.d.ts.map +0 -1
- package/dist/handlers/wallet-createSession.js.map +0 -1
- package/dist/handlers/wallet-getSession.d.ts.map +0 -1
- package/dist/handlers/wallet-getSession.js.map +0 -1
- package/dist/handlers/wallet-invokeMethod.d.ts.map +0 -1
- package/dist/handlers/wallet-invokeMethod.js.map +0 -1
- package/dist/handlers/wallet-revokeSession.d.ts.map +0 -1
- package/dist/handlers/wallet-revokeSession.js.map +0 -1
- package/dist/index.d.ts +0 -7
- package/dist/index.d.ts.map +0 -1
- package/dist/index.js +0 -6
- package/dist/index.js.map +0 -1
- package/dist/middlewares/MultichainMiddlewareManager.d.ts.map +0 -1
- package/dist/middlewares/MultichainMiddlewareManager.js.map +0 -1
- package/dist/middlewares/MultichainSubscriptionManager.d.ts.map +0 -1
- package/dist/middlewares/MultichainSubscriptionManager.js.map +0 -1
- package/dist/middlewares/multichainMethodCallValidatorMiddleware.d.ts.map +0 -1
- package/dist/middlewares/multichainMethodCallValidatorMiddleware.js.map +0 -1
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
import type { Caip25CaveatValue } from "@metamask/chain-agnostic-permission";
|
|
2
|
+
import type { JsonRpcEngineEndCallback, JsonRpcEngineNextCallback, MethodHandler } from "@metamask/json-rpc-engine";
|
|
3
|
+
import { GenericPermissionController } from "@metamask/permission-controller";
|
|
4
|
+
import type { Json, JsonRpcRequest, PendingJsonRpcResponse } from "@metamask/utils";
|
|
5
|
+
import type { GetCaveatForOriginHook } from "./types.mjs";
|
|
6
|
+
export type WalletRevokeSessionHooks = GetCaveatForOriginHook & {
|
|
7
|
+
revokePermissionForOrigin: (permissionName: string) => ReturnType<GenericPermissionController['revokePermissions']>;
|
|
8
|
+
updateCaveat: (target: string, caveatType: string, caveatValue: Caip25CaveatValue) => ReturnType<GenericPermissionController['updateCaveat']>;
|
|
9
|
+
};
|
|
10
|
+
type WalletRevokeSessionParams = {
|
|
11
|
+
scopes?: string[];
|
|
12
|
+
};
|
|
13
|
+
/**
|
|
14
|
+
* Handler for the `wallet_revokeSession` RPC method as specified by [CAIP-285](https://chainagnostic.org/CAIPs/caip-285).
|
|
15
|
+
* The implementation below deviates from the linked spec in that it ignores the `sessionId` param
|
|
16
|
+
* and instead revokes the singular session for the origin if available. Additionally,
|
|
17
|
+
* the handler also does not return an error if there is currently no active session and instead
|
|
18
|
+
* returns true which is the same result returned if an active session was actually revoked.
|
|
19
|
+
*
|
|
20
|
+
* @param request - The JSON-RPC request object. Unused.
|
|
21
|
+
* @param response - The JSON-RPC response object.
|
|
22
|
+
* @param _next - The next middleware function. Unused.
|
|
23
|
+
* @param end - The end callback function.
|
|
24
|
+
* @param hooks - The hooks object.
|
|
25
|
+
* @param hooks.revokePermissionForOrigin - The hook for revoking a permission for an origin function.
|
|
26
|
+
* @param hooks.updateCaveat - The hook used to conditionally update the caveat rather than fully revoke the permission.
|
|
27
|
+
* @param hooks.getCaveatForOrigin - The hook to fetch an existing caveat for the origin of the request.
|
|
28
|
+
* @returns Nothing.
|
|
29
|
+
*/
|
|
30
|
+
declare function handleWalletRevokeSession(request: JsonRpcRequest<WalletRevokeSessionParams> & {
|
|
31
|
+
origin: string;
|
|
32
|
+
}, response: PendingJsonRpcResponse<Json>, _next: JsonRpcEngineNextCallback, end: JsonRpcEngineEndCallback, hooks: WalletRevokeSessionHooks): Promise<void>;
|
|
33
|
+
export type WalletRevokeSessionHandler = MethodHandler<WalletRevokeSessionHooks, never, WalletRevokeSessionParams, Json, {
|
|
34
|
+
origin: string;
|
|
35
|
+
}>;
|
|
36
|
+
export declare const walletRevokeSessionHandler: {
|
|
37
|
+
implementation: typeof handleWalletRevokeSession;
|
|
38
|
+
hookNames: {
|
|
39
|
+
revokePermissionForOrigin: true;
|
|
40
|
+
updateCaveat: true;
|
|
41
|
+
getCaveatForOrigin: true;
|
|
42
|
+
};
|
|
43
|
+
};
|
|
44
|
+
export {};
|
|
45
|
+
//# 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":"AAMA,OAAO,KAAK,EAAE,iBAAiB,EAAE,4CAA4C;AAC7E,OAAO,KAAK,EACV,wBAAwB,EACxB,yBAAyB,EACzB,aAAa,EACd,kCAAkC;AACnC,OAAO,EAEL,2BAA2B,EAG5B,wCAAwC;AAGzC,OAAO,KAAK,EACV,IAAI,EACJ,cAAc,EACd,sBAAsB,EACvB,wBAAwB;AAEzB,OAAO,KAAK,EAAgB,sBAAsB,EAAE,oBAAmB;AAEvE,MAAM,MAAM,wBAAwB,GAAG,sBAAsB,GAAG;IAC9D,yBAAyB,EAAE,CACzB,cAAc,EAAE,MAAM,KACnB,UAAU,CAAC,2BAA2B,CAAC,mBAAmB,CAAC,CAAC,CAAC;IAClE,YAAY,EAAE,CACZ,MAAM,EAAE,MAAM,EACd,UAAU,EAAE,MAAM,EAClB,WAAW,EAAE,iBAAiB,KAC3B,UAAU,CAAC,2BAA2B,CAAC,cAAc,CAAC,CAAC,CAAC;CAC9D,CAAC;AAEF,KAAK,yBAAyB,GAAG;IAAE,MAAM,CAAC,EAAE,MAAM,EAAE,CAAA;CAAE,CAAC;AAiFvD;;;;;;;;;;;;;;;;GAgBG;AACH,iBAAe,yBAAyB,CACtC,OAAO,EAAE,cAAc,CAAC,yBAAyB,CAAC,GAAG;IAAE,MAAM,EAAE,MAAM,CAAA;CAAE,EACvE,QAAQ,EAAE,sBAAsB,CAAC,IAAI,CAAC,EACtC,KAAK,EAAE,yBAAyB,EAChC,GAAG,EAAE,wBAAwB,EAC7B,KAAK,EAAE,wBAAwB,iBAiBhC;AAED,MAAM,MAAM,0BAA0B,GAAG,aAAa,CACpD,wBAAwB,EACxB,KAAK,EACL,yBAAyB,EACzB,IAAI,EACJ;IAAE,MAAM,EAAE,MAAM,CAAA;CAAE,CACnB,CAAC;AAEF,eAAO,MAAM,0BAA0B;;;;;;;CAOD,CAAC"}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
|
-
import { Caip25CaveatMutators, Caip25CaveatType, Caip25EndowmentPermissionName, getCaipAccountIdsFromCaip25CaveatValue
|
|
2
|
-
import { CaveatMutatorOperation, PermissionDoesNotExistError, UnrecognizedSubjectError
|
|
3
|
-
import { rpcErrors } from
|
|
4
|
-
import { isObject } from
|
|
1
|
+
import { Caip25CaveatMutators, Caip25CaveatType, Caip25EndowmentPermissionName, getCaipAccountIdsFromCaip25CaveatValue } from "@metamask/chain-agnostic-permission";
|
|
2
|
+
import { CaveatMutatorOperation, PermissionDoesNotExistError, UnrecognizedSubjectError } from "@metamask/permission-controller";
|
|
3
|
+
import { rpcErrors } from "@metamask/rpc-errors";
|
|
4
|
+
import { isObject } from "@metamask/utils";
|
|
5
5
|
/**
|
|
6
6
|
* Check whether the given error is a permission error.
|
|
7
7
|
*
|
|
@@ -100,4 +100,4 @@ export const walletRevokeSessionHandler = {
|
|
|
100
100
|
getCaveatForOrigin: true,
|
|
101
101
|
},
|
|
102
102
|
};
|
|
103
|
-
//# sourceMappingURL=wallet-revokeSession.
|
|
103
|
+
//# sourceMappingURL=wallet-revokeSession.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"wallet-revokeSession.mjs","sourceRoot":"","sources":["../../src/handlers/wallet-revokeSession.ts"],"names":[],"mappings":"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","sourcesContent":["import {\n Caip25CaveatMutators,\n Caip25CaveatType,\n Caip25EndowmentPermissionName,\n getCaipAccountIdsFromCaip25CaveatValue,\n} from '@metamask/chain-agnostic-permission';\nimport type { Caip25CaveatValue } from '@metamask/chain-agnostic-permission';\nimport type {\n JsonRpcEngineEndCallback,\n JsonRpcEngineNextCallback,\n MethodHandler,\n} from '@metamask/json-rpc-engine';\nimport {\n CaveatMutatorOperation,\n GenericPermissionController,\n PermissionDoesNotExistError,\n UnrecognizedSubjectError,\n} from '@metamask/permission-controller';\nimport { rpcErrors } from '@metamask/rpc-errors';\nimport { isObject } from '@metamask/utils';\nimport type {\n Json,\n JsonRpcRequest,\n PendingJsonRpcResponse,\n} from '@metamask/utils';\n\nimport type { Caip25Caveat, GetCaveatForOriginHook } from './types.js';\n\nexport type WalletRevokeSessionHooks = GetCaveatForOriginHook & {\n revokePermissionForOrigin: (\n permissionName: string,\n ) => ReturnType<GenericPermissionController['revokePermissions']>;\n updateCaveat: (\n target: string,\n caveatType: string,\n caveatValue: Caip25CaveatValue,\n ) => ReturnType<GenericPermissionController['updateCaveat']>;\n};\n\ntype WalletRevokeSessionParams = { scopes?: string[] };\n\n/**\n * Check whether the given error is a permission error.\n *\n * @param error - The error to check.\n * @returns Whether the error is a permission error.\n */\nfunction isPermissionError(error: unknown) {\n if (\n !isObject(error) ||\n !('name' in error) ||\n typeof error.name !== 'string'\n ) {\n return false;\n }\n\n return [\n UnrecognizedSubjectError.name,\n PermissionDoesNotExistError.name,\n ].includes(error.name);\n}\n\n/**\n * Revokes specific session scopes from an existing caveat.\n * Fully revokes permission if no accounts remain permitted after iterating through scopes.\n *\n * @param scopes - Array of scope strings to remove from the caveat.\n * @param hooks - The hooks object.\n * @param hooks.revokePermissionForOrigin - The hook for revoking a permission for an origin function.\n * @param hooks.updateCaveat - The hook used to conditionally update the caveat rather than fully revoke the permission.\n * @param hooks.getCaveatForOrigin - The hook to fetch an existing caveat for the origin of the request.\n */\nfunction partialRevokePermissions(\n scopes: string[],\n hooks: WalletRevokeSessionHooks,\n) {\n const caveat = hooks.getCaveatForOrigin(\n Caip25EndowmentPermissionName,\n Caip25CaveatType,\n ) as Caip25Caveat | undefined;\n if (!caveat) {\n return;\n }\n\n let updatedCaveatValue = caveat.value;\n\n for (const scopeString of scopes) {\n const result = Caip25CaveatMutators[Caip25CaveatType].removeScope(\n updatedCaveatValue,\n scopeString,\n );\n\n // If operation is a Noop, it means a scope was passed that was not present in the permission, so we proceed with the loop\n if (result.operation === CaveatMutatorOperation.Noop) {\n continue;\n }\n\n updatedCaveatValue = result?.value ?? {\n requiredScopes: {},\n optionalScopes: {},\n sessionProperties: {},\n isMultichainOrigin: true,\n };\n }\n\n const caipAccountIds =\n getCaipAccountIdsFromCaip25CaveatValue(updatedCaveatValue);\n\n // We fully revoke permission if no accounts are left after scope removal loop.\n if (!caipAccountIds.length) {\n hooks.revokePermissionForOrigin(Caip25EndowmentPermissionName);\n } else {\n hooks.updateCaveat(\n Caip25EndowmentPermissionName,\n Caip25CaveatType,\n updatedCaveatValue,\n );\n }\n}\n\n/**\n * Handler for the `wallet_revokeSession` RPC method as specified by [CAIP-285](https://chainagnostic.org/CAIPs/caip-285).\n * The implementation below deviates from the linked spec in that it ignores the `sessionId` param\n * and instead revokes the singular session for the origin if available. Additionally,\n * the handler also does not return an error if there is currently no active session and instead\n * returns true which is the same result returned if an active session was actually revoked.\n *\n * @param request - The JSON-RPC request object. Unused.\n * @param response - The JSON-RPC response object.\n * @param _next - The next middleware function. Unused.\n * @param end - The end callback function.\n * @param hooks - The hooks object.\n * @param hooks.revokePermissionForOrigin - The hook for revoking a permission for an origin function.\n * @param hooks.updateCaveat - The hook used to conditionally update the caveat rather than fully revoke the permission.\n * @param hooks.getCaveatForOrigin - The hook to fetch an existing caveat for the origin of the request.\n * @returns Nothing.\n */\nasync function handleWalletRevokeSession(\n request: JsonRpcRequest<WalletRevokeSessionParams> & { origin: string },\n response: PendingJsonRpcResponse<Json>,\n _next: JsonRpcEngineNextCallback,\n end: JsonRpcEngineEndCallback,\n hooks: WalletRevokeSessionHooks,\n) {\n try {\n if (request.params?.scopes?.length) {\n partialRevokePermissions(request.params.scopes, hooks);\n } else {\n hooks.revokePermissionForOrigin(Caip25EndowmentPermissionName);\n }\n } catch (err) {\n if (!isPermissionError(err)) {\n console.error(err);\n return end(rpcErrors.internal());\n }\n }\n\n response.result = true;\n return end();\n}\n\nexport type WalletRevokeSessionHandler = MethodHandler<\n WalletRevokeSessionHooks,\n never,\n WalletRevokeSessionParams,\n Json,\n { origin: string }\n>;\n\nexport const walletRevokeSessionHandler = {\n implementation: handleWalletRevokeSession,\n hookNames: {\n revokePermissionForOrigin: true,\n updateCaveat: true,\n getCaveatForOrigin: true,\n },\n} satisfies WalletRevokeSessionHandler;\n"]}
|
package/dist/index.cjs
ADDED
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.MultichainApiNotifications = exports.MultichainSubscriptionManager = exports.MultichainMiddlewareManager = exports.multichainMethodCallValidatorMiddleware = exports.methodHandlers = void 0;
|
|
4
|
+
var index_js_1 = require("./handlers/index.cjs");
|
|
5
|
+
Object.defineProperty(exports, "methodHandlers", { enumerable: true, get: function () { return index_js_1.methodHandlers; } });
|
|
6
|
+
var multichainMethodCallValidatorMiddleware_js_1 = require("./middlewares/multichainMethodCallValidatorMiddleware.cjs");
|
|
7
|
+
Object.defineProperty(exports, "multichainMethodCallValidatorMiddleware", { enumerable: true, get: function () { return multichainMethodCallValidatorMiddleware_js_1.multichainMethodCallValidatorMiddleware; } });
|
|
8
|
+
var MultichainMiddlewareManager_js_1 = require("./middlewares/MultichainMiddlewareManager.cjs");
|
|
9
|
+
Object.defineProperty(exports, "MultichainMiddlewareManager", { enumerable: true, get: function () { return MultichainMiddlewareManager_js_1.MultichainMiddlewareManager; } });
|
|
10
|
+
var MultichainSubscriptionManager_js_1 = require("./middlewares/MultichainSubscriptionManager.cjs");
|
|
11
|
+
Object.defineProperty(exports, "MultichainSubscriptionManager", { enumerable: true, get: function () { return MultichainSubscriptionManager_js_1.MultichainSubscriptionManager; } });
|
|
12
|
+
var types_js_1 = require("./handlers/types.cjs");
|
|
13
|
+
Object.defineProperty(exports, "MultichainApiNotifications", { enumerable: true, get: function () { return types_js_1.MultichainApiNotifications; } });
|
|
14
|
+
//# sourceMappingURL=index.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.cjs","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";;;AAAA,iDAAqD;AAA5C,0GAAA,cAAc,OAAA;AAGvB,wHAAmH;AAA1G,qKAAA,uCAAuC,OAAA;AAChD,gGAA2F;AAAlF,6IAAA,2BAA2B,OAAA;AACpC,oGAA+F;AAAtF,iJAAA,6BAA6B,OAAA;AACtC,iDAAiE;AAAxD,sHAAA,0BAA0B,OAAA","sourcesContent":["export { methodHandlers } from './handlers/index.js';\nexport type { MethodHandlerHooks } from './handlers/index.js';\n\nexport { multichainMethodCallValidatorMiddleware } from './middlewares/multichainMethodCallValidatorMiddleware.js';\nexport { MultichainMiddlewareManager } from './middlewares/MultichainMiddlewareManager.js';\nexport { MultichainSubscriptionManager } from './middlewares/MultichainSubscriptionManager.js';\nexport { MultichainApiNotifications } from './handlers/types.js';\n"]}
|
package/dist/index.d.cts
ADDED
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
export { methodHandlers } from "./handlers/index.cjs";
|
|
2
|
+
export type { MethodHandlerHooks } from "./handlers/index.cjs";
|
|
3
|
+
export { multichainMethodCallValidatorMiddleware } from "./middlewares/multichainMethodCallValidatorMiddleware.cjs";
|
|
4
|
+
export { MultichainMiddlewareManager } from "./middlewares/MultichainMiddlewareManager.cjs";
|
|
5
|
+
export { MultichainSubscriptionManager } from "./middlewares/MultichainSubscriptionManager.cjs";
|
|
6
|
+
export { MultichainApiNotifications } from "./handlers/types.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,cAAc,EAAE,6BAA4B;AACrD,YAAY,EAAE,kBAAkB,EAAE,6BAA4B;AAE9D,OAAO,EAAE,uCAAuC,EAAE,kEAAiE;AACnH,OAAO,EAAE,2BAA2B,EAAE,sDAAqD;AAC3F,OAAO,EAAE,6BAA6B,EAAE,wDAAuD;AAC/F,OAAO,EAAE,0BAA0B,EAAE,6BAA4B"}
|
package/dist/index.d.mts
ADDED
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
export { methodHandlers } from "./handlers/index.mjs";
|
|
2
|
+
export type { MethodHandlerHooks } from "./handlers/index.mjs";
|
|
3
|
+
export { multichainMethodCallValidatorMiddleware } from "./middlewares/multichainMethodCallValidatorMiddleware.mjs";
|
|
4
|
+
export { MultichainMiddlewareManager } from "./middlewares/MultichainMiddlewareManager.mjs";
|
|
5
|
+
export { MultichainSubscriptionManager } from "./middlewares/MultichainSubscriptionManager.mjs";
|
|
6
|
+
export { MultichainApiNotifications } from "./handlers/types.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,cAAc,EAAE,6BAA4B;AACrD,YAAY,EAAE,kBAAkB,EAAE,6BAA4B;AAE9D,OAAO,EAAE,uCAAuC,EAAE,kEAAiE;AACnH,OAAO,EAAE,2BAA2B,EAAE,sDAAqD;AAC3F,OAAO,EAAE,6BAA6B,EAAE,wDAAuD;AAC/F,OAAO,EAAE,0BAA0B,EAAE,6BAA4B"}
|
package/dist/index.mjs
ADDED
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
export { methodHandlers } from "./handlers/index.mjs";
|
|
2
|
+
export { multichainMethodCallValidatorMiddleware } from "./middlewares/multichainMethodCallValidatorMiddleware.mjs";
|
|
3
|
+
export { MultichainMiddlewareManager } from "./middlewares/MultichainMiddlewareManager.mjs";
|
|
4
|
+
export { MultichainSubscriptionManager } from "./middlewares/MultichainSubscriptionManager.mjs";
|
|
5
|
+
export { MultichainApiNotifications } from "./handlers/types.mjs";
|
|
6
|
+
//# sourceMappingURL=index.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.mjs","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,6BAA4B;AAGrD,OAAO,EAAE,uCAAuC,EAAE,kEAAiE;AACnH,OAAO,EAAE,2BAA2B,EAAE,sDAAqD;AAC3F,OAAO,EAAE,6BAA6B,EAAE,wDAAuD;AAC/F,OAAO,EAAE,0BAA0B,EAAE,6BAA4B","sourcesContent":["export { methodHandlers } from './handlers/index.js';\nexport type { MethodHandlerHooks } from './handlers/index.js';\n\nexport { multichainMethodCallValidatorMiddleware } from './middlewares/multichainMethodCallValidatorMiddleware.js';\nexport { MultichainMiddlewareManager } from './middlewares/MultichainMiddlewareManager.js';\nexport { MultichainSubscriptionManager } from './middlewares/MultichainSubscriptionManager.js';\nexport { MultichainApiNotifications } from './handlers/types.js';\n"]}
|
|
@@ -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 { JsonRpcRequest, PendingJsonRpcResponse } from '@metamask/utils';\n\nexport type ExtendedJsonRpcMiddleware = {\n (\n req: JsonRpcRequest & { scope: string },\n res: PendingJsonRpcResponse,\n next: JsonRpcEngineNextCallback,\n end: JsonRpcEngineEndCallback,\n ): void;\n destroy?: () => void | Promise<void>;\n};\n\ntype MiddlewareKey = {\n scope: ExternalScopeString;\n origin: string;\n tabId?: number;\n};\ntype MiddlewareEntry = MiddlewareKey & {\n middleware: ExtendedJsonRpcMiddleware;\n};\n\n// Methods related to eth_subscriptions\nconst SubscriptionMethods = ['eth_subscribe', 'eth_unsubscribe'];\n\n/**\n * A helper that facilates registering and calling of provided middleware instances\n * in the RPC pipeline based on the incoming request's scope, origin, and tabId.\n * The core purpose of this class is to enable and manage multichain subscriptions\n * (i.e. eth_subscribe called accross different chains and domains).\n *\n * Note that only one middleware instance can be registered per scope, origin, tabId key.\n */\nexport class MultichainMiddlewareManager {\n #middlewares: MiddlewareEntry[] = [];\n\n #getMiddlewareEntry({\n scope,\n origin,\n tabId,\n }: MiddlewareKey): MiddlewareEntry | undefined {\n return this.#middlewares.find((middlewareEntry) => {\n return (\n middlewareEntry.scope === scope &&\n middlewareEntry.origin === origin &&\n middlewareEntry.tabId === tabId\n );\n });\n }\n\n #removeMiddlewareEntry({ scope, origin, tabId }: MiddlewareEntry) {\n this.#middlewares = this.#middlewares.filter((middlewareEntry) => {\n return (\n middlewareEntry.scope !== scope ||\n middlewareEntry.origin !== origin ||\n middlewareEntry.tabId !== tabId\n );\n });\n }\n\n addMiddleware(middlewareEntry: MiddlewareEntry) {\n const { scope, origin, tabId } = middlewareEntry;\n if (!this.#getMiddlewareEntry({ scope, origin, tabId })) {\n this.#middlewares.push(middlewareEntry);\n }\n }\n\n #removeMiddleware(middlewareEntry: MiddlewareEntry) {\n // When the destroy function on the middleware is async,\n // we don't need to wait for it complete\n Promise.resolve(middlewareEntry.middleware.destroy?.()).catch(() => {\n // do nothing\n });\n\n this.#removeMiddlewareEntry(middlewareEntry);\n }\n\n removeMiddlewareByScope(scope: ExternalScopeString) {\n this.#middlewares.forEach((middlewareEntry) => {\n if (middlewareEntry.scope === scope) {\n this.#removeMiddleware(middlewareEntry);\n }\n });\n }\n\n removeMiddlewareByScopeAndOrigin(scope: ExternalScopeString, origin: string) {\n this.#middlewares.forEach((middlewareEntry) => {\n if (\n middlewareEntry.scope === scope &&\n middlewareEntry.origin === origin\n ) {\n this.#removeMiddleware(middlewareEntry);\n }\n });\n }\n\n removeMiddlewareByOriginAndTabId(origin: string, tabId?: number) {\n this.#middlewares.forEach((middlewareEntry) => {\n if (\n middlewareEntry.origin === origin &&\n middlewareEntry.tabId === tabId\n ) {\n this.#removeMiddleware(middlewareEntry);\n }\n });\n }\n\n generateMultichainMiddlewareForOriginAndTabId(\n origin: string,\n tabId?: number,\n ) {\n const middleware: ExtendedJsonRpcMiddleware = (req, res, next, end) => {\n const { scope } = req;\n const middlewareEntry = this.#getMiddlewareEntry({\n scope,\n origin,\n tabId,\n });\n\n if (SubscriptionMethods.includes(req.method)) {\n if (middlewareEntry) {\n middlewareEntry.middleware(req, res, next, end);\n } else {\n // TODO: Temporary safety guard to prevent requests with these methods\n // from being forwarded to the RPC endpoint even though this scenario\n // should not be possible.\n return end(rpcErrors.methodNotFound());\n }\n } else {\n return next();\n }\n return undefined;\n };\n middleware.destroy = this.removeMiddlewareByOriginAndTabId.bind(\n this,\n origin,\n tabId,\n );\n\n return middleware;\n }\n}\n"]}
|
package/dist/middlewares/{MultichainMiddlewareManager.d.ts → MultichainMiddlewareManager.d.cts}
RENAMED
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
import type { ExternalScopeString } from
|
|
2
|
-
import type { JsonRpcEngineEndCallback, JsonRpcEngineNextCallback } from
|
|
3
|
-
import type { JsonRpcRequest, PendingJsonRpcResponse } from
|
|
1
|
+
import type { ExternalScopeString } from "@metamask/chain-agnostic-permission";
|
|
2
|
+
import type { JsonRpcEngineEndCallback, JsonRpcEngineNextCallback } from "@metamask/json-rpc-engine";
|
|
3
|
+
import type { JsonRpcRequest, PendingJsonRpcResponse } from "@metamask/utils";
|
|
4
4
|
export type ExtendedJsonRpcMiddleware = {
|
|
5
5
|
(req: JsonRpcRequest & {
|
|
6
6
|
scope: string;
|
|
@@ -32,4 +32,4 @@ export declare class MultichainMiddlewareManager {
|
|
|
32
32
|
generateMultichainMiddlewareForOriginAndTabId(origin: string, tabId?: number): ExtendedJsonRpcMiddleware;
|
|
33
33
|
}
|
|
34
34
|
export {};
|
|
35
|
-
//# sourceMappingURL=MultichainMiddlewareManager.d.
|
|
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,EAAE,cAAc,EAAE,sBAAsB,EAAE,wBAAwB;AAE9E,MAAM,MAAM,yBAAyB,GAAG;IACtC,CACE,GAAG,EAAE,cAAc,GAAG;QAAE,KAAK,EAAE,MAAM,CAAA;KAAE,EACvC,GAAG,EAAE,sBAAsB,EAC3B,IAAI,EAAE,yBAAyB,EAC/B,GAAG,EAAE,wBAAwB,GAC5B,IAAI,CAAC;IACR,OAAO,CAAC,EAAE,MAAM,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;CACtC,CAAC;AAEF,KAAK,aAAa,GAAG;IACnB,KAAK,EAAE,mBAAmB,CAAC;IAC3B,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB,CAAC;AACF,KAAK,eAAe,GAAG,aAAa,GAAG;IACrC,UAAU,EAAE,yBAAyB,CAAC;CACvC,CAAC;AAKF;;;;;;;GAOG;AACH,qBAAa,2BAA2B;;IA2BtC,aAAa,CAAC,eAAe,EAAE,eAAe;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 { JsonRpcRequest, PendingJsonRpcResponse } from "@metamask/utils";
|
|
4
|
+
export type ExtendedJsonRpcMiddleware = {
|
|
5
|
+
(req: JsonRpcRequest & {
|
|
6
|
+
scope: string;
|
|
7
|
+
}, res: PendingJsonRpcResponse, 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,EAAE,cAAc,EAAE,sBAAsB,EAAE,wBAAwB;AAE9E,MAAM,MAAM,yBAAyB,GAAG;IACtC,CACE,GAAG,EAAE,cAAc,GAAG;QAAE,KAAK,EAAE,MAAM,CAAA;KAAE,EACvC,GAAG,EAAE,sBAAsB,EAC3B,IAAI,EAAE,yBAAyB,EAC/B,GAAG,EAAE,wBAAwB,GAC5B,IAAI,CAAC;IACR,OAAO,CAAC,EAAE,MAAM,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;CACtC,CAAC;AAEF,KAAK,aAAa,GAAG;IACnB,KAAK,EAAE,mBAAmB,CAAC;IAC3B,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB,CAAC;AACF,KAAK,eAAe,GAAG,aAAa,GAAG;IACrC,UAAU,EAAE,yBAAyB,CAAC;CACvC,CAAC;AAKF;;;;;;;GAOG;AACH,qBAAa,2BAA2B;;IA2BtC,aAAa,CAAC,eAAe,EAAE,eAAe;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"}
|
|
@@ -10,7 +10,7 @@ var __classPrivateFieldSet = (this && this.__classPrivateFieldSet) || function (
|
|
|
10
10
|
return (kind === "a" ? f.call(receiver, value) : f ? f.value = value : state.set(receiver, value)), value;
|
|
11
11
|
};
|
|
12
12
|
var _MultichainMiddlewareManager_instances, _MultichainMiddlewareManager_middlewares, _MultichainMiddlewareManager_getMiddlewareEntry, _MultichainMiddlewareManager_removeMiddlewareEntry, _MultichainMiddlewareManager_removeMiddleware;
|
|
13
|
-
import { rpcErrors } from
|
|
13
|
+
import { rpcErrors } from "@metamask/rpc-errors";
|
|
14
14
|
// Methods related to eth_subscriptions
|
|
15
15
|
const SubscriptionMethods = ['eth_subscribe', 'eth_unsubscribe'];
|
|
16
16
|
/**
|
|
@@ -103,4 +103,4 @@ _MultichainMiddlewareManager_middlewares = new WeakMap(), _MultichainMiddlewareM
|
|
|
103
103
|
});
|
|
104
104
|
__classPrivateFieldGet(this, _MultichainMiddlewareManager_instances, "m", _MultichainMiddlewareManager_removeMiddlewareEntry).call(this, middlewareEntry);
|
|
105
105
|
};
|
|
106
|
-
//# sourceMappingURL=MultichainMiddlewareManager.
|
|
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 { JsonRpcRequest, PendingJsonRpcResponse } from '@metamask/utils';\n\nexport type ExtendedJsonRpcMiddleware = {\n (\n req: JsonRpcRequest & { scope: string },\n res: PendingJsonRpcResponse,\n next: JsonRpcEngineNextCallback,\n end: JsonRpcEngineEndCallback,\n ): void;\n destroy?: () => void | Promise<void>;\n};\n\ntype MiddlewareKey = {\n scope: ExternalScopeString;\n origin: string;\n tabId?: number;\n};\ntype MiddlewareEntry = MiddlewareKey & {\n middleware: ExtendedJsonRpcMiddleware;\n};\n\n// Methods related to eth_subscriptions\nconst SubscriptionMethods = ['eth_subscribe', 'eth_unsubscribe'];\n\n/**\n * A helper that facilates registering and calling of provided middleware instances\n * in the RPC pipeline based on the incoming request's scope, origin, and tabId.\n * The core purpose of this class is to enable and manage multichain subscriptions\n * (i.e. eth_subscribe called accross different chains and domains).\n *\n * Note that only one middleware instance can be registered per scope, origin, tabId key.\n */\nexport class MultichainMiddlewareManager {\n #middlewares: MiddlewareEntry[] = [];\n\n #getMiddlewareEntry({\n scope,\n origin,\n tabId,\n }: MiddlewareKey): MiddlewareEntry | undefined {\n return this.#middlewares.find((middlewareEntry) => {\n return (\n middlewareEntry.scope === scope &&\n middlewareEntry.origin === origin &&\n middlewareEntry.tabId === tabId\n );\n });\n }\n\n #removeMiddlewareEntry({ scope, origin, tabId }: MiddlewareEntry) {\n this.#middlewares = this.#middlewares.filter((middlewareEntry) => {\n return (\n middlewareEntry.scope !== scope ||\n middlewareEntry.origin !== origin ||\n middlewareEntry.tabId !== tabId\n );\n });\n }\n\n addMiddleware(middlewareEntry: MiddlewareEntry) {\n const { scope, origin, tabId } = middlewareEntry;\n if (!this.#getMiddlewareEntry({ scope, origin, tabId })) {\n this.#middlewares.push(middlewareEntry);\n }\n }\n\n #removeMiddleware(middlewareEntry: MiddlewareEntry) {\n // When the destroy function on the middleware is async,\n // we don't need to wait for it complete\n Promise.resolve(middlewareEntry.middleware.destroy?.()).catch(() => {\n // do nothing\n });\n\n this.#removeMiddlewareEntry(middlewareEntry);\n }\n\n removeMiddlewareByScope(scope: ExternalScopeString) {\n this.#middlewares.forEach((middlewareEntry) => {\n if (middlewareEntry.scope === scope) {\n this.#removeMiddleware(middlewareEntry);\n }\n });\n }\n\n removeMiddlewareByScopeAndOrigin(scope: ExternalScopeString, origin: string) {\n this.#middlewares.forEach((middlewareEntry) => {\n if (\n middlewareEntry.scope === scope &&\n middlewareEntry.origin === origin\n ) {\n this.#removeMiddleware(middlewareEntry);\n }\n });\n }\n\n removeMiddlewareByOriginAndTabId(origin: string, tabId?: number) {\n this.#middlewares.forEach((middlewareEntry) => {\n if (\n middlewareEntry.origin === origin &&\n middlewareEntry.tabId === tabId\n ) {\n this.#removeMiddleware(middlewareEntry);\n }\n });\n }\n\n generateMultichainMiddlewareForOriginAndTabId(\n origin: string,\n tabId?: number,\n ) {\n const middleware: ExtendedJsonRpcMiddleware = (req, res, next, end) => {\n const { scope } = req;\n const middlewareEntry = this.#getMiddlewareEntry({\n scope,\n origin,\n tabId,\n });\n\n if (SubscriptionMethods.includes(req.method)) {\n if (middlewareEntry) {\n middlewareEntry.middleware(req, res, next, end);\n } else {\n // TODO: Temporary safety guard to prevent requests with these methods\n // from being forwarded to the RPC endpoint even though this scenario\n // should not be possible.\n return end(rpcErrors.methodNotFound());\n }\n } else {\n return next();\n }\n return undefined;\n };\n middleware.destroy = this.removeMiddlewareByOriginAndTabId.bind(\n this,\n origin,\n tabId,\n );\n\n return middleware;\n }\n}\n"]}
|
|
@@ -0,0 +1,118 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __classPrivateFieldSet = (this && this.__classPrivateFieldSet) || function (receiver, state, value, kind, f) {
|
|
3
|
+
if (kind === "m") throw new TypeError("Private method is not writable");
|
|
4
|
+
if (kind === "a" && !f) throw new TypeError("Private accessor was defined without a setter");
|
|
5
|
+
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");
|
|
6
|
+
return (kind === "a" ? f.call(receiver, value) : f ? f.value = value : state.set(receiver, value)), value;
|
|
7
|
+
};
|
|
8
|
+
var __classPrivateFieldGet = (this && this.__classPrivateFieldGet) || function (receiver, state, kind, f) {
|
|
9
|
+
if (kind === "a" && !f) throw new TypeError("Private accessor was defined without a getter");
|
|
10
|
+
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");
|
|
11
|
+
return kind === "m" ? f : kind === "a" ? f.call(receiver) : f ? f.value : state.get(receiver);
|
|
12
|
+
};
|
|
13
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
14
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
15
|
+
};
|
|
16
|
+
var _MultichainSubscriptionManager_instances, _MultichainSubscriptionManager_findNetworkClientIdByChainId, _MultichainSubscriptionManager_getNetworkClientById, _MultichainSubscriptionManager_subscriptions, _MultichainSubscriptionManager_getSubscriptionEntry, _MultichainSubscriptionManager_removeSubscriptionEntry, _MultichainSubscriptionManager_unsubscribe;
|
|
17
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
18
|
+
exports.MultichainSubscriptionManager = void 0;
|
|
19
|
+
const controller_utils_1 = require("@metamask/controller-utils");
|
|
20
|
+
const subscriptionManager_1 = __importDefault(require("@metamask/eth-json-rpc-filters/subscriptionManager.js"));
|
|
21
|
+
const safe_event_emitter_1 = __importDefault(require("@metamask/safe-event-emitter"));
|
|
22
|
+
const utils_1 = require("@metamask/utils");
|
|
23
|
+
const types_js_1 = require("../handlers/types.cjs");
|
|
24
|
+
/**
|
|
25
|
+
* A helper that facilates the lifecycle of a SubscriptionManager instance that
|
|
26
|
+
* is meant to handle subscriptons for only one specific scope, origin, and tabId combination.
|
|
27
|
+
*/
|
|
28
|
+
class MultichainSubscriptionManager extends safe_event_emitter_1.default {
|
|
29
|
+
/**
|
|
30
|
+
* Construct a MultichainSubscriptionManager.
|
|
31
|
+
*
|
|
32
|
+
* @param options - The controller options.
|
|
33
|
+
* @param options.findNetworkClientIdByChainId - The hook to get the networkClientId from a chainId.
|
|
34
|
+
* @param options.getNetworkClientById - The hook to get the network client instance by its networkClientId.
|
|
35
|
+
*/
|
|
36
|
+
constructor(options) {
|
|
37
|
+
super();
|
|
38
|
+
_MultichainSubscriptionManager_instances.add(this);
|
|
39
|
+
_MultichainSubscriptionManager_findNetworkClientIdByChainId.set(this, void 0);
|
|
40
|
+
_MultichainSubscriptionManager_getNetworkClientById.set(this, void 0);
|
|
41
|
+
_MultichainSubscriptionManager_subscriptions.set(this, []);
|
|
42
|
+
__classPrivateFieldSet(this, _MultichainSubscriptionManager_findNetworkClientIdByChainId, options.findNetworkClientIdByChainId, "f");
|
|
43
|
+
__classPrivateFieldSet(this, _MultichainSubscriptionManager_getNetworkClientById, options.getNetworkClientById, "f");
|
|
44
|
+
}
|
|
45
|
+
notify({ scope, origin, tabId }, { method, params }) {
|
|
46
|
+
this.emit('notification', origin, tabId, {
|
|
47
|
+
method: types_js_1.MultichainApiNotifications.walletNotify,
|
|
48
|
+
params: {
|
|
49
|
+
scope,
|
|
50
|
+
notification: { method, params },
|
|
51
|
+
},
|
|
52
|
+
});
|
|
53
|
+
}
|
|
54
|
+
subscribe(subscriptionKey) {
|
|
55
|
+
const subscriptionEntry = __classPrivateFieldGet(this, _MultichainSubscriptionManager_instances, "m", _MultichainSubscriptionManager_getSubscriptionEntry).call(this, subscriptionKey);
|
|
56
|
+
if (subscriptionEntry) {
|
|
57
|
+
return subscriptionEntry.subscriptionManager;
|
|
58
|
+
}
|
|
59
|
+
const networkClientId = __classPrivateFieldGet(this, _MultichainSubscriptionManager_findNetworkClientIdByChainId, "f").call(this, (0, controller_utils_1.toHex)((0, utils_1.parseCaipChainId)(subscriptionKey.scope).reference));
|
|
60
|
+
const networkClient = __classPrivateFieldGet(this, _MultichainSubscriptionManager_getNetworkClientById, "f").call(this, networkClientId);
|
|
61
|
+
const subscriptionManager = (0, subscriptionManager_1.default)({
|
|
62
|
+
blockTracker: networkClient.blockTracker,
|
|
63
|
+
provider: networkClient.provider,
|
|
64
|
+
});
|
|
65
|
+
subscriptionManager.events.on('notification', (message) => {
|
|
66
|
+
this.notify(subscriptionKey, message);
|
|
67
|
+
});
|
|
68
|
+
const newSubscriptionManagerEntry = {
|
|
69
|
+
...subscriptionKey,
|
|
70
|
+
subscriptionManager,
|
|
71
|
+
};
|
|
72
|
+
subscriptionManager.destroy = subscriptionManager.middleware.destroy;
|
|
73
|
+
subscriptionManager.middleware.destroy = __classPrivateFieldGet(this, _MultichainSubscriptionManager_instances, "m", _MultichainSubscriptionManager_unsubscribe).bind(this, newSubscriptionManagerEntry);
|
|
74
|
+
__classPrivateFieldGet(this, _MultichainSubscriptionManager_subscriptions, "f").push(newSubscriptionManagerEntry);
|
|
75
|
+
return subscriptionManager;
|
|
76
|
+
}
|
|
77
|
+
unsubscribeByScope(scope) {
|
|
78
|
+
__classPrivateFieldGet(this, _MultichainSubscriptionManager_subscriptions, "f").forEach((subscriptionEntry) => {
|
|
79
|
+
if (subscriptionEntry.scope === scope) {
|
|
80
|
+
__classPrivateFieldGet(this, _MultichainSubscriptionManager_instances, "m", _MultichainSubscriptionManager_unsubscribe).call(this, subscriptionEntry);
|
|
81
|
+
}
|
|
82
|
+
});
|
|
83
|
+
}
|
|
84
|
+
unsubscribeByScopeAndOrigin(scope, origin) {
|
|
85
|
+
__classPrivateFieldGet(this, _MultichainSubscriptionManager_subscriptions, "f").forEach((subscriptionEntry) => {
|
|
86
|
+
if (subscriptionEntry.scope === scope &&
|
|
87
|
+
subscriptionEntry.origin === origin) {
|
|
88
|
+
__classPrivateFieldGet(this, _MultichainSubscriptionManager_instances, "m", _MultichainSubscriptionManager_unsubscribe).call(this, subscriptionEntry);
|
|
89
|
+
}
|
|
90
|
+
});
|
|
91
|
+
}
|
|
92
|
+
unsubscribeByOriginAndTabId(origin, tabId) {
|
|
93
|
+
__classPrivateFieldGet(this, _MultichainSubscriptionManager_subscriptions, "f").forEach((subscriptionEntry) => {
|
|
94
|
+
if (subscriptionEntry.origin === origin &&
|
|
95
|
+
subscriptionEntry.tabId === tabId) {
|
|
96
|
+
__classPrivateFieldGet(this, _MultichainSubscriptionManager_instances, "m", _MultichainSubscriptionManager_unsubscribe).call(this, subscriptionEntry);
|
|
97
|
+
}
|
|
98
|
+
});
|
|
99
|
+
}
|
|
100
|
+
}
|
|
101
|
+
exports.MultichainSubscriptionManager = MultichainSubscriptionManager;
|
|
102
|
+
_MultichainSubscriptionManager_findNetworkClientIdByChainId = new WeakMap(), _MultichainSubscriptionManager_getNetworkClientById = new WeakMap(), _MultichainSubscriptionManager_subscriptions = new WeakMap(), _MultichainSubscriptionManager_instances = new WeakSet(), _MultichainSubscriptionManager_getSubscriptionEntry = function _MultichainSubscriptionManager_getSubscriptionEntry({ scope, origin, tabId, }) {
|
|
103
|
+
return __classPrivateFieldGet(this, _MultichainSubscriptionManager_subscriptions, "f").find((subscriptionEntry) => {
|
|
104
|
+
return (subscriptionEntry.scope === scope &&
|
|
105
|
+
subscriptionEntry.origin === origin &&
|
|
106
|
+
subscriptionEntry.tabId === tabId);
|
|
107
|
+
});
|
|
108
|
+
}, _MultichainSubscriptionManager_removeSubscriptionEntry = function _MultichainSubscriptionManager_removeSubscriptionEntry({ scope, origin, tabId }) {
|
|
109
|
+
__classPrivateFieldSet(this, _MultichainSubscriptionManager_subscriptions, __classPrivateFieldGet(this, _MultichainSubscriptionManager_subscriptions, "f").filter((subscriptionEntry) => {
|
|
110
|
+
return (subscriptionEntry.scope !== scope ||
|
|
111
|
+
subscriptionEntry.origin !== origin ||
|
|
112
|
+
subscriptionEntry.tabId !== tabId);
|
|
113
|
+
}), "f");
|
|
114
|
+
}, _MultichainSubscriptionManager_unsubscribe = function _MultichainSubscriptionManager_unsubscribe(subscriptionEntry) {
|
|
115
|
+
subscriptionEntry.subscriptionManager.destroy?.();
|
|
116
|
+
__classPrivateFieldGet(this, _MultichainSubscriptionManager_instances, "m", _MultichainSubscriptionManager_removeSubscriptionEntry).call(this, subscriptionEntry);
|
|
117
|
+
};
|
|
118
|
+
//# sourceMappingURL=MultichainSubscriptionManager.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"MultichainSubscriptionManager.cjs","sourceRoot":"","sources":["../../src/middlewares/MultichainSubscriptionManager.ts"],"names":[],"mappings":"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","sourcesContent":["import type { ExternalScopeString } from '@metamask/chain-agnostic-permission';\nimport { toHex } from '@metamask/controller-utils';\nimport createSubscriptionManager from '@metamask/eth-json-rpc-filters/subscriptionManager';\nimport type { NetworkController } from '@metamask/network-controller';\nimport SafeEventEmitter from '@metamask/safe-event-emitter';\nimport type { CaipChainId, Hex } from '@metamask/utils';\nimport { parseCaipChainId } from '@metamask/utils';\n\nimport { MultichainApiNotifications } from '../handlers/types.js';\nimport type { ExtendedJsonRpcMiddleware } from './MultichainMiddlewareManager.js';\n\nexport type SubscriptionManager = {\n events: SafeEventEmitter;\n destroy?: () => void;\n middleware: ExtendedJsonRpcMiddleware;\n};\n\ntype SubscriptionNotificationEvent = {\n jsonrpc: '2.0';\n method: 'eth_subscription';\n params: {\n subscription: Hex;\n result: unknown;\n };\n};\n\ntype SubscriptionKey = {\n scope: ExternalScopeString;\n origin: string;\n tabId?: number;\n};\ntype SubscriptionEntry = SubscriptionKey & {\n subscriptionManager: SubscriptionManager;\n};\n\ntype MultichainSubscriptionManagerOptions = {\n findNetworkClientIdByChainId: NetworkController['findNetworkClientIdByChainId'];\n getNetworkClientById: NetworkController['getNetworkClientById'];\n};\n\n/**\n * A helper that facilates the lifecycle of a SubscriptionManager instance that\n * is meant to handle subscriptons for only one specific scope, origin, and tabId combination.\n */\nexport class MultichainSubscriptionManager extends SafeEventEmitter {\n readonly #findNetworkClientIdByChainId: NetworkController['findNetworkClientIdByChainId'];\n\n readonly #getNetworkClientById: NetworkController['getNetworkClientById'];\n\n #subscriptions: SubscriptionEntry[] = [];\n\n /**\n * Construct a MultichainSubscriptionManager.\n *\n * @param options - The controller options.\n * @param options.findNetworkClientIdByChainId - The hook to get the networkClientId from a chainId.\n * @param options.getNetworkClientById - The hook to get the network client instance by its networkClientId.\n */\n constructor(options: MultichainSubscriptionManagerOptions) {\n super();\n this.#findNetworkClientIdByChainId = options.findNetworkClientIdByChainId;\n this.#getNetworkClientById = options.getNetworkClientById;\n }\n\n notify(\n { scope, origin, tabId }: SubscriptionKey,\n { method, params }: SubscriptionNotificationEvent,\n ) {\n this.emit('notification', origin, tabId, {\n method: MultichainApiNotifications.walletNotify,\n params: {\n scope,\n notification: { method, params },\n },\n });\n }\n\n #getSubscriptionEntry({\n scope,\n origin,\n tabId,\n }: SubscriptionKey): SubscriptionEntry | undefined {\n return this.#subscriptions.find((subscriptionEntry) => {\n return (\n subscriptionEntry.scope === scope &&\n subscriptionEntry.origin === origin &&\n subscriptionEntry.tabId === tabId\n );\n });\n }\n\n #removeSubscriptionEntry({ scope, origin, tabId }: SubscriptionEntry) {\n this.#subscriptions = this.#subscriptions.filter((subscriptionEntry) => {\n return (\n subscriptionEntry.scope !== scope ||\n subscriptionEntry.origin !== origin ||\n subscriptionEntry.tabId !== tabId\n );\n });\n }\n\n subscribe(subscriptionKey: SubscriptionKey) {\n const subscriptionEntry = this.#getSubscriptionEntry(subscriptionKey);\n if (subscriptionEntry) {\n return subscriptionEntry.subscriptionManager;\n }\n\n const networkClientId = this.#findNetworkClientIdByChainId(\n toHex(parseCaipChainId(subscriptionKey.scope as CaipChainId).reference),\n );\n const networkClient = this.#getNetworkClientById(networkClientId);\n const subscriptionManager = createSubscriptionManager({\n blockTracker: networkClient.blockTracker,\n provider: networkClient.provider,\n });\n\n subscriptionManager.events.on(\n 'notification',\n (message: SubscriptionNotificationEvent) => {\n this.notify(subscriptionKey, message);\n },\n );\n\n const newSubscriptionManagerEntry = {\n ...subscriptionKey,\n subscriptionManager,\n };\n subscriptionManager.destroy = subscriptionManager.middleware.destroy;\n subscriptionManager.middleware.destroy = this.#unsubscribe.bind(\n this,\n newSubscriptionManagerEntry,\n );\n\n this.#subscriptions.push(newSubscriptionManagerEntry);\n\n return subscriptionManager;\n }\n\n #unsubscribe(subscriptionEntry: SubscriptionEntry) {\n subscriptionEntry.subscriptionManager.destroy?.();\n\n this.#removeSubscriptionEntry(subscriptionEntry);\n }\n\n unsubscribeByScope(scope: ExternalScopeString) {\n this.#subscriptions.forEach((subscriptionEntry) => {\n if (subscriptionEntry.scope === scope) {\n this.#unsubscribe(subscriptionEntry);\n }\n });\n }\n\n unsubscribeByScopeAndOrigin(scope: ExternalScopeString, origin: string) {\n this.#subscriptions.forEach((subscriptionEntry) => {\n if (\n subscriptionEntry.scope === scope &&\n subscriptionEntry.origin === origin\n ) {\n this.#unsubscribe(subscriptionEntry);\n }\n });\n }\n\n unsubscribeByOriginAndTabId(origin: string, tabId?: number) {\n this.#subscriptions.forEach((subscriptionEntry) => {\n if (\n subscriptionEntry.origin === origin &&\n subscriptionEntry.tabId === tabId\n ) {\n this.#unsubscribe(subscriptionEntry);\n }\n });\n }\n}\n"]}
|
package/dist/middlewares/{MultichainSubscriptionManager.d.ts → MultichainSubscriptionManager.d.cts}
RENAMED
|
@@ -1,8 +1,8 @@
|
|
|
1
|
-
import type { ExternalScopeString } from
|
|
2
|
-
import type { NetworkController } from
|
|
3
|
-
import SafeEventEmitter from
|
|
4
|
-
import type { Hex } from
|
|
5
|
-
import type { ExtendedJsonRpcMiddleware } from
|
|
1
|
+
import type { ExternalScopeString } from "@metamask/chain-agnostic-permission";
|
|
2
|
+
import type { NetworkController } from "@metamask/network-controller";
|
|
3
|
+
import SafeEventEmitter from "@metamask/safe-event-emitter";
|
|
4
|
+
import type { Hex } from "@metamask/utils";
|
|
5
|
+
import type { ExtendedJsonRpcMiddleware } from "./MultichainMiddlewareManager.cjs";
|
|
6
6
|
export type SubscriptionManager = {
|
|
7
7
|
events: SafeEventEmitter;
|
|
8
8
|
destroy?: () => void;
|
|
@@ -46,4 +46,4 @@ export declare class MultichainSubscriptionManager extends SafeEventEmitter {
|
|
|
46
46
|
unsubscribeByOriginAndTabId(origin: string, tabId?: number): void;
|
|
47
47
|
}
|
|
48
48
|
export {};
|
|
49
|
-
//# sourceMappingURL=MultichainSubscriptionManager.d.
|
|
49
|
+
//# sourceMappingURL=MultichainSubscriptionManager.d.cts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"MultichainSubscriptionManager.d.cts","sourceRoot":"","sources":["../../src/middlewares/MultichainSubscriptionManager.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,mBAAmB,EAAE,4CAA4C;AAG/E,OAAO,KAAK,EAAE,iBAAiB,EAAE,qCAAqC;AACtE,OAAO,gBAAgB,qCAAqC;AAC5D,OAAO,KAAK,EAAe,GAAG,EAAE,wBAAwB;AAIxD,OAAO,KAAK,EAAE,yBAAyB,EAAE,0CAAyC;AAElF,MAAM,MAAM,mBAAmB,GAAG;IAChC,MAAM,EAAE,gBAAgB,CAAC;IACzB,OAAO,CAAC,EAAE,MAAM,IAAI,CAAC;IACrB,UAAU,EAAE,yBAAyB,CAAC;CACvC,CAAC;AAEF,KAAK,6BAA6B,GAAG;IACnC,OAAO,EAAE,KAAK,CAAC;IACf,MAAM,EAAE,kBAAkB,CAAC;IAC3B,MAAM,EAAE;QACN,YAAY,EAAE,GAAG,CAAC;QAClB,MAAM,EAAE,OAAO,CAAC;KACjB,CAAC;CACH,CAAC;AAEF,KAAK,eAAe,GAAG;IACrB,KAAK,EAAE,mBAAmB,CAAC;IAC3B,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB,CAAC;AAKF,KAAK,oCAAoC,GAAG;IAC1C,4BAA4B,EAAE,iBAAiB,CAAC,8BAA8B,CAAC,CAAC;IAChF,oBAAoB,EAAE,iBAAiB,CAAC,sBAAsB,CAAC,CAAC;CACjE,CAAC;AAEF;;;GAGG;AACH,qBAAa,6BAA8B,SAAQ,gBAAgB;;IAOjE;;;;;;OAMG;gBACS,OAAO,EAAE,oCAAoC;IAMzD,MAAM,CACJ,EAAE,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,EAAE,eAAe,EACzC,EAAE,MAAM,EAAE,MAAM,EAAE,EAAE,6BAA6B;IAmCnD,SAAS,CAAC,eAAe,EAAE,eAAe;IA2C1C,kBAAkB,CAAC,KAAK,EAAE,mBAAmB;IAQ7C,2BAA2B,CAAC,KAAK,EAAE,mBAAmB,EAAE,MAAM,EAAE,MAAM;IAWtE,2BAA2B,CAAC,MAAM,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,MAAM;CAU3D"}
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
import type { ExternalScopeString } from "@metamask/chain-agnostic-permission";
|
|
2
|
+
import type { NetworkController } from "@metamask/network-controller";
|
|
3
|
+
import SafeEventEmitter from "@metamask/safe-event-emitter";
|
|
4
|
+
import type { Hex } from "@metamask/utils";
|
|
5
|
+
import type { ExtendedJsonRpcMiddleware } from "./MultichainMiddlewareManager.mjs";
|
|
6
|
+
export type SubscriptionManager = {
|
|
7
|
+
events: SafeEventEmitter;
|
|
8
|
+
destroy?: () => void;
|
|
9
|
+
middleware: ExtendedJsonRpcMiddleware;
|
|
10
|
+
};
|
|
11
|
+
type SubscriptionNotificationEvent = {
|
|
12
|
+
jsonrpc: '2.0';
|
|
13
|
+
method: 'eth_subscription';
|
|
14
|
+
params: {
|
|
15
|
+
subscription: Hex;
|
|
16
|
+
result: unknown;
|
|
17
|
+
};
|
|
18
|
+
};
|
|
19
|
+
type SubscriptionKey = {
|
|
20
|
+
scope: ExternalScopeString;
|
|
21
|
+
origin: string;
|
|
22
|
+
tabId?: number;
|
|
23
|
+
};
|
|
24
|
+
type MultichainSubscriptionManagerOptions = {
|
|
25
|
+
findNetworkClientIdByChainId: NetworkController['findNetworkClientIdByChainId'];
|
|
26
|
+
getNetworkClientById: NetworkController['getNetworkClientById'];
|
|
27
|
+
};
|
|
28
|
+
/**
|
|
29
|
+
* A helper that facilates the lifecycle of a SubscriptionManager instance that
|
|
30
|
+
* is meant to handle subscriptons for only one specific scope, origin, and tabId combination.
|
|
31
|
+
*/
|
|
32
|
+
export declare class MultichainSubscriptionManager extends SafeEventEmitter {
|
|
33
|
+
#private;
|
|
34
|
+
/**
|
|
35
|
+
* Construct a MultichainSubscriptionManager.
|
|
36
|
+
*
|
|
37
|
+
* @param options - The controller options.
|
|
38
|
+
* @param options.findNetworkClientIdByChainId - The hook to get the networkClientId from a chainId.
|
|
39
|
+
* @param options.getNetworkClientById - The hook to get the network client instance by its networkClientId.
|
|
40
|
+
*/
|
|
41
|
+
constructor(options: MultichainSubscriptionManagerOptions);
|
|
42
|
+
notify({ scope, origin, tabId }: SubscriptionKey, { method, params }: SubscriptionNotificationEvent): void;
|
|
43
|
+
subscribe(subscriptionKey: SubscriptionKey): any;
|
|
44
|
+
unsubscribeByScope(scope: ExternalScopeString): void;
|
|
45
|
+
unsubscribeByScopeAndOrigin(scope: ExternalScopeString, origin: string): void;
|
|
46
|
+
unsubscribeByOriginAndTabId(origin: string, tabId?: number): void;
|
|
47
|
+
}
|
|
48
|
+
export {};
|
|
49
|
+
//# sourceMappingURL=MultichainSubscriptionManager.d.mts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"MultichainSubscriptionManager.d.mts","sourceRoot":"","sources":["../../src/middlewares/MultichainSubscriptionManager.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,mBAAmB,EAAE,4CAA4C;AAG/E,OAAO,KAAK,EAAE,iBAAiB,EAAE,qCAAqC;AACtE,OAAO,gBAAgB,qCAAqC;AAC5D,OAAO,KAAK,EAAe,GAAG,EAAE,wBAAwB;AAIxD,OAAO,KAAK,EAAE,yBAAyB,EAAE,0CAAyC;AAElF,MAAM,MAAM,mBAAmB,GAAG;IAChC,MAAM,EAAE,gBAAgB,CAAC;IACzB,OAAO,CAAC,EAAE,MAAM,IAAI,CAAC;IACrB,UAAU,EAAE,yBAAyB,CAAC;CACvC,CAAC;AAEF,KAAK,6BAA6B,GAAG;IACnC,OAAO,EAAE,KAAK,CAAC;IACf,MAAM,EAAE,kBAAkB,CAAC;IAC3B,MAAM,EAAE;QACN,YAAY,EAAE,GAAG,CAAC;QAClB,MAAM,EAAE,OAAO,CAAC;KACjB,CAAC;CACH,CAAC;AAEF,KAAK,eAAe,GAAG;IACrB,KAAK,EAAE,mBAAmB,CAAC;IAC3B,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB,CAAC;AAKF,KAAK,oCAAoC,GAAG;IAC1C,4BAA4B,EAAE,iBAAiB,CAAC,8BAA8B,CAAC,CAAC;IAChF,oBAAoB,EAAE,iBAAiB,CAAC,sBAAsB,CAAC,CAAC;CACjE,CAAC;AAEF;;;GAGG;AACH,qBAAa,6BAA8B,SAAQ,gBAAgB;;IAOjE;;;;;;OAMG;gBACS,OAAO,EAAE,oCAAoC;IAMzD,MAAM,CACJ,EAAE,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,EAAE,eAAe,EACzC,EAAE,MAAM,EAAE,MAAM,EAAE,EAAE,6BAA6B;IAmCnD,SAAS,CAAC,eAAe,EAAE,eAAe;IA2C1C,kBAAkB,CAAC,KAAK,EAAE,mBAAmB;IAQ7C,2BAA2B,CAAC,KAAK,EAAE,mBAAmB,EAAE,MAAM,EAAE,MAAM;IAWtE,2BAA2B,CAAC,MAAM,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,MAAM;CAU3D"}
|