@metamask-previews/multichain-api-middleware 4.0.3-preview-abca9bcea → 5.0.0-preview-0a30e47

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (107) hide show
  1. package/CHANGELOG.md +15 -1
  2. package/dist/handlers/index.d.ts +25 -0
  3. package/dist/handlers/index.d.ts.map +1 -0
  4. package/dist/handlers/{index.mjs → index.js} +5 -5
  5. package/dist/handlers/index.js.map +1 -0
  6. package/dist/handlers/{types.d.cts → types.d.ts} +5 -5
  7. package/dist/handlers/types.d.ts.map +1 -0
  8. package/dist/handlers/{types.mjs → types.js} +1 -2
  9. package/dist/handlers/types.js.map +1 -0
  10. package/dist/handlers/{wallet-createSession.d.cts → wallet-createSession.d.ts} +9 -9
  11. package/dist/handlers/wallet-createSession.d.ts.map +1 -0
  12. package/dist/handlers/{wallet-createSession.mjs → wallet-createSession.js} +6 -6
  13. package/dist/handlers/wallet-createSession.js.map +1 -0
  14. package/dist/handlers/{wallet-getSession.d.mts → wallet-getSession.d.ts} +5 -5
  15. package/dist/handlers/wallet-getSession.d.ts.map +1 -0
  16. package/dist/handlers/{wallet-getSession.mjs → wallet-getSession.js} +2 -2
  17. package/dist/handlers/wallet-getSession.js.map +1 -0
  18. package/dist/handlers/{wallet-invokeMethod.d.mts → wallet-invokeMethod.d.ts} +7 -7
  19. package/dist/handlers/wallet-invokeMethod.d.ts.map +1 -0
  20. package/dist/handlers/{wallet-invokeMethod.mjs → wallet-invokeMethod.js} +4 -4
  21. package/dist/handlers/wallet-invokeMethod.js.map +1 -0
  22. package/dist/handlers/{wallet-revokeSession.d.mts → wallet-revokeSession.d.ts} +6 -6
  23. package/dist/handlers/wallet-revokeSession.d.ts.map +1 -0
  24. package/dist/handlers/{wallet-revokeSession.mjs → wallet-revokeSession.js} +5 -5
  25. package/dist/handlers/wallet-revokeSession.js.map +1 -0
  26. package/dist/index.d.ts +7 -0
  27. package/dist/index.d.ts.map +1 -0
  28. package/dist/index.js +6 -0
  29. package/dist/index.js.map +1 -0
  30. package/dist/middlewares/{MultichainMiddlewareManager.d.cts → MultichainMiddlewareManager.d.ts} +4 -4
  31. package/dist/middlewares/MultichainMiddlewareManager.d.ts.map +1 -0
  32. package/dist/middlewares/MultichainMiddlewareManager.js +93 -0
  33. package/dist/middlewares/MultichainMiddlewareManager.js.map +1 -0
  34. package/dist/middlewares/{MultichainSubscriptionManager.d.cts → MultichainSubscriptionManager.d.ts} +6 -6
  35. package/dist/middlewares/MultichainSubscriptionManager.d.ts.map +1 -0
  36. package/dist/middlewares/MultichainSubscriptionManager.js +100 -0
  37. package/dist/middlewares/MultichainSubscriptionManager.js.map +1 -0
  38. package/dist/middlewares/{multichainMethodCallValidatorMiddleware.d.cts → multichainMethodCallValidatorMiddleware.d.ts} +2 -2
  39. package/dist/middlewares/multichainMethodCallValidatorMiddleware.d.ts.map +1 -0
  40. package/dist/middlewares/{multichainMethodCallValidatorMiddleware.mjs → multichainMethodCallValidatorMiddleware.js} +8 -15
  41. package/dist/middlewares/multichainMethodCallValidatorMiddleware.js.map +1 -0
  42. package/package.json +20 -24
  43. package/dist/handlers/index.cjs +0 -20
  44. package/dist/handlers/index.cjs.map +0 -1
  45. package/dist/handlers/index.d.cts +0 -25
  46. package/dist/handlers/index.d.cts.map +0 -1
  47. package/dist/handlers/index.d.mts +0 -25
  48. package/dist/handlers/index.d.mts.map +0 -1
  49. package/dist/handlers/index.mjs.map +0 -1
  50. package/dist/handlers/types.cjs +0 -13
  51. package/dist/handlers/types.cjs.map +0 -1
  52. package/dist/handlers/types.d.cts.map +0 -1
  53. package/dist/handlers/types.d.mts +0 -27
  54. package/dist/handlers/types.d.mts.map +0 -1
  55. package/dist/handlers/types.mjs.map +0 -1
  56. package/dist/handlers/wallet-createSession.cjs +0 -179
  57. package/dist/handlers/wallet-createSession.cjs.map +0 -1
  58. package/dist/handlers/wallet-createSession.d.cts.map +0 -1
  59. package/dist/handlers/wallet-createSession.d.mts +0 -70
  60. package/dist/handlers/wallet-createSession.d.mts.map +0 -1
  61. package/dist/handlers/wallet-createSession.mjs.map +0 -1
  62. package/dist/handlers/wallet-getSession.cjs +0 -54
  63. package/dist/handlers/wallet-getSession.cjs.map +0 -1
  64. package/dist/handlers/wallet-getSession.d.cts +0 -43
  65. package/dist/handlers/wallet-getSession.d.cts.map +0 -1
  66. package/dist/handlers/wallet-getSession.d.mts.map +0 -1
  67. package/dist/handlers/wallet-getSession.mjs.map +0 -1
  68. package/dist/handlers/wallet-invokeMethod.cjs +0 -103
  69. package/dist/handlers/wallet-invokeMethod.cjs.map +0 -1
  70. package/dist/handlers/wallet-invokeMethod.d.cts +0 -57
  71. package/dist/handlers/wallet-invokeMethod.d.cts.map +0 -1
  72. package/dist/handlers/wallet-invokeMethod.d.mts.map +0 -1
  73. package/dist/handlers/wallet-invokeMethod.mjs.map +0 -1
  74. package/dist/handlers/wallet-revokeSession.cjs +0 -106
  75. package/dist/handlers/wallet-revokeSession.cjs.map +0 -1
  76. package/dist/handlers/wallet-revokeSession.d.cts +0 -45
  77. package/dist/handlers/wallet-revokeSession.d.cts.map +0 -1
  78. package/dist/handlers/wallet-revokeSession.d.mts.map +0 -1
  79. package/dist/handlers/wallet-revokeSession.mjs.map +0 -1
  80. package/dist/index.cjs +0 -14
  81. package/dist/index.cjs.map +0 -1
  82. package/dist/index.d.cts +0 -7
  83. package/dist/index.d.cts.map +0 -1
  84. package/dist/index.d.mts +0 -7
  85. package/dist/index.d.mts.map +0 -1
  86. package/dist/index.mjs +0 -6
  87. package/dist/index.mjs.map +0 -1
  88. package/dist/middlewares/MultichainMiddlewareManager.cjs +0 -110
  89. package/dist/middlewares/MultichainMiddlewareManager.cjs.map +0 -1
  90. package/dist/middlewares/MultichainMiddlewareManager.d.cts.map +0 -1
  91. package/dist/middlewares/MultichainMiddlewareManager.d.mts +0 -35
  92. package/dist/middlewares/MultichainMiddlewareManager.d.mts.map +0 -1
  93. package/dist/middlewares/MultichainMiddlewareManager.mjs +0 -106
  94. package/dist/middlewares/MultichainMiddlewareManager.mjs.map +0 -1
  95. package/dist/middlewares/MultichainSubscriptionManager.cjs +0 -118
  96. package/dist/middlewares/MultichainSubscriptionManager.cjs.map +0 -1
  97. package/dist/middlewares/MultichainSubscriptionManager.d.cts.map +0 -1
  98. package/dist/middlewares/MultichainSubscriptionManager.d.mts +0 -49
  99. package/dist/middlewares/MultichainSubscriptionManager.d.mts.map +0 -1
  100. package/dist/middlewares/MultichainSubscriptionManager.mjs +0 -118
  101. package/dist/middlewares/MultichainSubscriptionManager.mjs.map +0 -1
  102. package/dist/middlewares/multichainMethodCallValidatorMiddleware.cjs +0 -74
  103. package/dist/middlewares/multichainMethodCallValidatorMiddleware.cjs.map +0 -1
  104. package/dist/middlewares/multichainMethodCallValidatorMiddleware.d.cts.map +0 -1
  105. package/dist/middlewares/multichainMethodCallValidatorMiddleware.d.mts +0 -7
  106. package/dist/middlewares/multichainMethodCallValidatorMiddleware.d.mts.map +0 -1
  107. package/dist/middlewares/multichainMethodCallValidatorMiddleware.mjs.map +0 -1
@@ -1,106 +0,0 @@
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
@@ -1 +0,0 @@
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"]}
@@ -1,118 +0,0 @@
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
@@ -1 +0,0 @@
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"]}
@@ -1 +0,0 @@
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"}
@@ -1,49 +0,0 @@
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
@@ -1 +0,0 @@
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"}
@@ -1,118 +0,0 @@
1
- var __classPrivateFieldSet = (this && this.__classPrivateFieldSet) || function (receiver, state, value, kind, f) {
2
- if (kind === "m") throw new TypeError("Private method is not writable");
3
- if (kind === "a" && !f) throw new TypeError("Private accessor was defined without a setter");
4
- 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");
5
- return (kind === "a" ? f.call(receiver, value) : f ? f.value = value : state.set(receiver, value)), value;
6
- };
7
- var __classPrivateFieldGet = (this && this.__classPrivateFieldGet) || function (receiver, state, kind, f) {
8
- if (kind === "a" && !f) throw new TypeError("Private accessor was defined without a getter");
9
- 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");
10
- return kind === "m" ? f : kind === "a" ? f.call(receiver) : f ? f.value : state.get(receiver);
11
- };
12
- var _MultichainSubscriptionManager_instances, _MultichainSubscriptionManager_findNetworkClientIdByChainId, _MultichainSubscriptionManager_getNetworkClientById, _MultichainSubscriptionManager_subscriptions, _MultichainSubscriptionManager_getSubscriptionEntry, _MultichainSubscriptionManager_removeSubscriptionEntry, _MultichainSubscriptionManager_unsubscribe;
13
- function $importDefault(module) {
14
- if (module?.__esModule) {
15
- return module.default;
16
- }
17
- return module;
18
- }
19
- import { toHex } from "@metamask/controller-utils";
20
- import $createSubscriptionManager from "@metamask/eth-json-rpc-filters/subscriptionManager.js";
21
- const createSubscriptionManager = $importDefault($createSubscriptionManager);
22
- import SafeEventEmitter from "@metamask/safe-event-emitter";
23
- import { parseCaipChainId } from "@metamask/utils";
24
- import { MultichainApiNotifications } from "../handlers/types.mjs";
25
- /**
26
- * A helper that facilates the lifecycle of a SubscriptionManager instance that
27
- * is meant to handle subscriptons for only one specific scope, origin, and tabId combination.
28
- */
29
- export class MultichainSubscriptionManager extends SafeEventEmitter {
30
- /**
31
- * Construct a MultichainSubscriptionManager.
32
- *
33
- * @param options - The controller options.
34
- * @param options.findNetworkClientIdByChainId - The hook to get the networkClientId from a chainId.
35
- * @param options.getNetworkClientById - The hook to get the network client instance by its networkClientId.
36
- */
37
- constructor(options) {
38
- super();
39
- _MultichainSubscriptionManager_instances.add(this);
40
- _MultichainSubscriptionManager_findNetworkClientIdByChainId.set(this, void 0);
41
- _MultichainSubscriptionManager_getNetworkClientById.set(this, void 0);
42
- _MultichainSubscriptionManager_subscriptions.set(this, []);
43
- __classPrivateFieldSet(this, _MultichainSubscriptionManager_findNetworkClientIdByChainId, options.findNetworkClientIdByChainId, "f");
44
- __classPrivateFieldSet(this, _MultichainSubscriptionManager_getNetworkClientById, options.getNetworkClientById, "f");
45
- }
46
- notify({ scope, origin, tabId }, { method, params }) {
47
- this.emit('notification', origin, tabId, {
48
- method: MultichainApiNotifications.walletNotify,
49
- params: {
50
- scope,
51
- notification: { method, params },
52
- },
53
- });
54
- }
55
- subscribe(subscriptionKey) {
56
- const subscriptionEntry = __classPrivateFieldGet(this, _MultichainSubscriptionManager_instances, "m", _MultichainSubscriptionManager_getSubscriptionEntry).call(this, subscriptionKey);
57
- if (subscriptionEntry) {
58
- return subscriptionEntry.subscriptionManager;
59
- }
60
- const networkClientId = __classPrivateFieldGet(this, _MultichainSubscriptionManager_findNetworkClientIdByChainId, "f").call(this, toHex(parseCaipChainId(subscriptionKey.scope).reference));
61
- const networkClient = __classPrivateFieldGet(this, _MultichainSubscriptionManager_getNetworkClientById, "f").call(this, networkClientId);
62
- const subscriptionManager = createSubscriptionManager({
63
- blockTracker: networkClient.blockTracker,
64
- provider: networkClient.provider,
65
- });
66
- subscriptionManager.events.on('notification', (message) => {
67
- this.notify(subscriptionKey, message);
68
- });
69
- const newSubscriptionManagerEntry = {
70
- ...subscriptionKey,
71
- subscriptionManager,
72
- };
73
- subscriptionManager.destroy = subscriptionManager.middleware.destroy;
74
- subscriptionManager.middleware.destroy = __classPrivateFieldGet(this, _MultichainSubscriptionManager_instances, "m", _MultichainSubscriptionManager_unsubscribe).bind(this, newSubscriptionManagerEntry);
75
- __classPrivateFieldGet(this, _MultichainSubscriptionManager_subscriptions, "f").push(newSubscriptionManagerEntry);
76
- return subscriptionManager;
77
- }
78
- unsubscribeByScope(scope) {
79
- __classPrivateFieldGet(this, _MultichainSubscriptionManager_subscriptions, "f").forEach((subscriptionEntry) => {
80
- if (subscriptionEntry.scope === scope) {
81
- __classPrivateFieldGet(this, _MultichainSubscriptionManager_instances, "m", _MultichainSubscriptionManager_unsubscribe).call(this, subscriptionEntry);
82
- }
83
- });
84
- }
85
- unsubscribeByScopeAndOrigin(scope, origin) {
86
- __classPrivateFieldGet(this, _MultichainSubscriptionManager_subscriptions, "f").forEach((subscriptionEntry) => {
87
- if (subscriptionEntry.scope === scope &&
88
- subscriptionEntry.origin === origin) {
89
- __classPrivateFieldGet(this, _MultichainSubscriptionManager_instances, "m", _MultichainSubscriptionManager_unsubscribe).call(this, subscriptionEntry);
90
- }
91
- });
92
- }
93
- unsubscribeByOriginAndTabId(origin, tabId) {
94
- __classPrivateFieldGet(this, _MultichainSubscriptionManager_subscriptions, "f").forEach((subscriptionEntry) => {
95
- if (subscriptionEntry.origin === origin &&
96
- subscriptionEntry.tabId === tabId) {
97
- __classPrivateFieldGet(this, _MultichainSubscriptionManager_instances, "m", _MultichainSubscriptionManager_unsubscribe).call(this, subscriptionEntry);
98
- }
99
- });
100
- }
101
- }
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.mjs.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"MultichainSubscriptionManager.mjs","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"]}
@@ -1,74 +0,0 @@
1
- "use strict";
2
- var __importDefault = (this && this.__importDefault) || function (mod) {
3
- return (mod && mod.__esModule) ? mod : { "default": mod };
4
- };
5
- Object.defineProperty(exports, "__esModule", { value: true });
6
- exports.multichainMethodCallValidatorMiddleware = void 0;
7
- const api_specs_1 = require("@metamask/api-specs");
8
- const json_rpc_engine_1 = require("@metamask/json-rpc-engine");
9
- const rpc_errors_1 = require("@metamask/rpc-errors");
10
- const utils_1 = require("@metamask/utils");
11
- const dereference_document_1 = __importDefault(require("@open-rpc/schema-utils-js/build/dereference-document.js"));
12
- const parse_open_rpc_document_1 = require("@open-rpc/schema-utils-js/build/parse-open-rpc-document.js");
13
- const jsonschema_1 = require("jsonschema");
14
- const transformError = (error, param, got) => {
15
- // if there is a path, add it to the message
16
- const message = `${param.name}${error.path.length > 0 ? `.${error.path.join('.')}` : ''} ${error.message}`;
17
- return rpc_errors_1.rpcErrors.invalidParams({
18
- message,
19
- data: {
20
- param: param.name,
21
- path: error.path,
22
- schema: error.schema,
23
- got,
24
- },
25
- });
26
- };
27
- const v = new jsonschema_1.Validator();
28
- const dereffedPromise = (0, dereference_document_1.default)(api_specs_1.MultiChainOpenRPCDocument, (0, parse_open_rpc_document_1.makeCustomResolver)({}));
29
- /**
30
- * Helper that utilizes the Multichain method specifications from `@metamask/api-specs`
31
- * to validate the params of a Multichain request.
32
- *
33
- * @param method - The request's method.
34
- * @param params - The request's optional JsonRpcParams object.
35
- * @returns an array of error objects for each validation error or an empty array if no errors.
36
- */
37
- const multichainMethodCallValidator = async (method, params) => {
38
- const dereffed = await dereffedPromise;
39
- const methodToCheck = dereffed.methods.find((m) => m.name === method);
40
- if (!methodToCheck ||
41
- !(0, utils_1.isObject)(methodToCheck) ||
42
- !('params' in methodToCheck)) {
43
- return [rpc_errors_1.rpcErrors.methodNotFound({ data: { method } })];
44
- }
45
- const errors = [];
46
- for (const param of methodToCheck.params) {
47
- if (!(0, utils_1.isObject)(params)) {
48
- return [rpc_errors_1.rpcErrors.invalidParams()];
49
- }
50
- const p = param;
51
- const paramToCheck = params[p.name];
52
- const result = v.validate(paramToCheck, p.schema, {
53
- required: p.required,
54
- });
55
- if (result.errors) {
56
- errors.push(...result.errors.map((e) => {
57
- return transformError(e, p, paramToCheck);
58
- }));
59
- }
60
- }
61
- return errors;
62
- };
63
- /**
64
- * Middleware that validates the params of a Multichain method request
65
- * using the specifications from `@metamask/api-specs`.
66
- */
67
- exports.multichainMethodCallValidatorMiddleware = (0, json_rpc_engine_1.createAsyncMiddleware)(async (request, _response, next) => {
68
- const errors = await multichainMethodCallValidator(request.method, request.params);
69
- if (errors.length > 0) {
70
- throw rpc_errors_1.rpcErrors.invalidParams({ data: errors });
71
- }
72
- return await next();
73
- });
74
- //# sourceMappingURL=multichainMethodCallValidatorMiddleware.cjs.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"multichainMethodCallValidatorMiddleware.cjs","sourceRoot":"","sources":["../../src/middlewares/multichainMethodCallValidatorMiddleware.ts"],"names":[],"mappings":"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","sourcesContent":["import { MultiChainOpenRPCDocument } from '@metamask/api-specs';\nimport { createAsyncMiddleware } from '@metamask/json-rpc-engine';\nimport { rpcErrors } from '@metamask/rpc-errors';\nimport { isObject } from '@metamask/utils';\nimport type { JsonRpcError, JsonRpcParams } from '@metamask/utils';\nimport type {\n ContentDescriptorObject,\n MethodObject,\n OpenrpcDocument,\n ReferenceObject,\n} from '@open-rpc/meta-schema';\nimport dereferenceDocument from '@open-rpc/schema-utils-js/build/dereference-document';\nimport { makeCustomResolver } from '@open-rpc/schema-utils-js/build/parse-open-rpc-document';\nimport type { Schema, ValidationError } from 'jsonschema';\nimport { Validator } from 'jsonschema';\n\nconst transformError = (\n error: ValidationError,\n param: ContentDescriptorObject,\n got: unknown,\n) => {\n // if there is a path, add it to the message\n const message = `${param.name}${\n error.path.length > 0 ? `.${error.path.join('.')}` : ''\n } ${error.message}`;\n\n return rpcErrors.invalidParams({\n message,\n data: {\n param: param.name,\n path: error.path,\n schema: error.schema,\n got,\n },\n });\n};\n\nconst v = new Validator();\n\nconst dereffedPromise = dereferenceDocument(\n MultiChainOpenRPCDocument as unknown as OpenrpcDocument,\n makeCustomResolver({}),\n);\n\n/**\n * Helper that utilizes the Multichain method specifications from `@metamask/api-specs`\n * to validate the params of a Multichain request.\n *\n * @param method - The request's method.\n * @param params - The request's optional JsonRpcParams object.\n * @returns an array of error objects for each validation error or an empty array if no errors.\n */\nconst multichainMethodCallValidator = async (\n method: string,\n params: JsonRpcParams | undefined,\n) => {\n const dereffed = await dereffedPromise;\n\n const methodToCheck = dereffed.methods.find(\n (m: MethodObject | ReferenceObject) => (m as MethodObject).name === method,\n ) as MethodObject | undefined;\n\n if (\n !methodToCheck ||\n !isObject(methodToCheck) ||\n !('params' in methodToCheck)\n ) {\n return [rpcErrors.methodNotFound({ data: { method } })] as JsonRpcError[];\n }\n\n const errors: JsonRpcError[] = [];\n for (const param of methodToCheck.params) {\n if (!isObject(params)) {\n return [rpcErrors.invalidParams()] as JsonRpcError[];\n }\n const p = param as ContentDescriptorObject;\n const paramToCheck = params[p.name];\n\n const result = v.validate(paramToCheck, p.schema as unknown as Schema, {\n required: p.required,\n });\n if (result.errors) {\n errors.push(\n ...result.errors.map((e) => {\n return transformError(e, p, paramToCheck) as JsonRpcError;\n }),\n );\n }\n }\n return errors;\n};\n\n/**\n * Middleware that validates the params of a Multichain method request\n * using the specifications from `@metamask/api-specs`.\n */\nexport const multichainMethodCallValidatorMiddleware = createAsyncMiddleware(\n async (request, _response, next) => {\n const errors = await multichainMethodCallValidator(\n request.method,\n request.params,\n );\n if (errors.length > 0) {\n throw rpcErrors.invalidParams<JsonRpcError[]>({ data: errors });\n }\n return await next();\n },\n);\n"]}
@@ -1 +0,0 @@
1
- {"version":3,"file":"multichainMethodCallValidatorMiddleware.d.cts","sourceRoot":"","sources":["../../src/middlewares/multichainMethodCallValidatorMiddleware.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAgB,aAAa,EAAE,wBAAwB;AAwFnE;;;GAGG;AACH,eAAO,MAAM,uCAAuC,sGAWnD,CAAC"}
@@ -1,7 +0,0 @@
1
- import type { JsonRpcParams } from "@metamask/utils";
2
- /**
3
- * Middleware that validates the params of a Multichain method request
4
- * using the specifications from `@metamask/api-specs`.
5
- */
6
- export declare const multichainMethodCallValidatorMiddleware: import("@metamask/json-rpc-engine").JsonRpcMiddleware<JsonRpcParams, import("@metamask/utils").Json>;
7
- //# sourceMappingURL=multichainMethodCallValidatorMiddleware.d.mts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"multichainMethodCallValidatorMiddleware.d.mts","sourceRoot":"","sources":["../../src/middlewares/multichainMethodCallValidatorMiddleware.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAgB,aAAa,EAAE,wBAAwB;AAwFnE;;;GAGG;AACH,eAAO,MAAM,uCAAuC,sGAWnD,CAAC"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"multichainMethodCallValidatorMiddleware.mjs","sourceRoot":"","sources":["../../src/middlewares/multichainMethodCallValidatorMiddleware.ts"],"names":[],"mappings":"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","sourcesContent":["import { MultiChainOpenRPCDocument } from '@metamask/api-specs';\nimport { createAsyncMiddleware } from '@metamask/json-rpc-engine';\nimport { rpcErrors } from '@metamask/rpc-errors';\nimport { isObject } from '@metamask/utils';\nimport type { JsonRpcError, JsonRpcParams } from '@metamask/utils';\nimport type {\n ContentDescriptorObject,\n MethodObject,\n OpenrpcDocument,\n ReferenceObject,\n} from '@open-rpc/meta-schema';\nimport dereferenceDocument from '@open-rpc/schema-utils-js/build/dereference-document';\nimport { makeCustomResolver } from '@open-rpc/schema-utils-js/build/parse-open-rpc-document';\nimport type { Schema, ValidationError } from 'jsonschema';\nimport { Validator } from 'jsonschema';\n\nconst transformError = (\n error: ValidationError,\n param: ContentDescriptorObject,\n got: unknown,\n) => {\n // if there is a path, add it to the message\n const message = `${param.name}${\n error.path.length > 0 ? `.${error.path.join('.')}` : ''\n } ${error.message}`;\n\n return rpcErrors.invalidParams({\n message,\n data: {\n param: param.name,\n path: error.path,\n schema: error.schema,\n got,\n },\n });\n};\n\nconst v = new Validator();\n\nconst dereffedPromise = dereferenceDocument(\n MultiChainOpenRPCDocument as unknown as OpenrpcDocument,\n makeCustomResolver({}),\n);\n\n/**\n * Helper that utilizes the Multichain method specifications from `@metamask/api-specs`\n * to validate the params of a Multichain request.\n *\n * @param method - The request's method.\n * @param params - The request's optional JsonRpcParams object.\n * @returns an array of error objects for each validation error or an empty array if no errors.\n */\nconst multichainMethodCallValidator = async (\n method: string,\n params: JsonRpcParams | undefined,\n) => {\n const dereffed = await dereffedPromise;\n\n const methodToCheck = dereffed.methods.find(\n (m: MethodObject | ReferenceObject) => (m as MethodObject).name === method,\n ) as MethodObject | undefined;\n\n if (\n !methodToCheck ||\n !isObject(methodToCheck) ||\n !('params' in methodToCheck)\n ) {\n return [rpcErrors.methodNotFound({ data: { method } })] as JsonRpcError[];\n }\n\n const errors: JsonRpcError[] = [];\n for (const param of methodToCheck.params) {\n if (!isObject(params)) {\n return [rpcErrors.invalidParams()] as JsonRpcError[];\n }\n const p = param as ContentDescriptorObject;\n const paramToCheck = params[p.name];\n\n const result = v.validate(paramToCheck, p.schema as unknown as Schema, {\n required: p.required,\n });\n if (result.errors) {\n errors.push(\n ...result.errors.map((e) => {\n return transformError(e, p, paramToCheck) as JsonRpcError;\n }),\n );\n }\n }\n return errors;\n};\n\n/**\n * Middleware that validates the params of a Multichain method request\n * using the specifications from `@metamask/api-specs`.\n */\nexport const multichainMethodCallValidatorMiddleware = createAsyncMiddleware(\n async (request, _response, next) => {\n const errors = await multichainMethodCallValidator(\n request.method,\n request.params,\n );\n if (errors.length > 0) {\n throw rpcErrors.invalidParams<JsonRpcError[]>({ data: errors });\n }\n return await next();\n },\n);\n"]}