Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

feat: Add QueuedRequestController batching #22865

Merged
merged 6 commits into from
Mar 21, 2024
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
31 changes: 10 additions & 21 deletions app/scripts/background.js
Original file line number Diff line number Diff line change
Expand Up @@ -797,6 +797,11 @@ export function setupController(
updateBadge,
);

controller.controllerMessenger.subscribe(
METAMASK_CONTROLLER_EVENTS.QUEUED_REQUEST_STATE_CHANGE,
updateBadge,
);

controller.txController.initApprovals();

/**
Expand All @@ -820,35 +825,19 @@ export function setupController(
}

function getUnapprovedTransactionCount() {
let count = controller.appStateController.waitingForUnlock.length;
let count =
controller.appStateController.waitingForUnlock.length +
controller.approvalController.getTotalApprovalCount();

if (controller.preferencesController.getUseRequestQueue()) {
count += controller.queuedRequestController.length();
} else {
count += controller.approvalController.getTotalApprovalCount();
count += controller.queuedRequestController.state.queuedRequestCount;
}
return count;
}

controller.controllerMessenger.subscribe(
'QueuedRequestController:countChanged',
(count) => {
updateBadge();
if (count > 0) {
triggerUi();
}
},
);

notificationManager.on(
NOTIFICATION_MANAGER_EVENTS.POPUP_CLOSED,
({ automaticallyClosed }) => {
if (controller.preferencesController.getUseRequestQueue()) {
// when the feature flag is on, rejecting unnapproved notifications in this way does nothing (since the controllers havent seen the requests yet)
// Also, the updating of badge / triggering of UI happens from the countChanged event when the feature flag is on, so we dont need that here either.
// The only thing that we might want to add here is possibly calling a method to empty the queue / do the same thing as rejecting all confirmed?
return;
}

if (!automaticallyClosed) {
rejectUnapprovedNotifications();
} else if (getUnapprovedTransactionCount() > 0) {
Expand Down
10 changes: 9 additions & 1 deletion app/scripts/metamask-controller.js
Original file line number Diff line number Diff line change
Expand Up @@ -313,6 +313,7 @@ export const METAMASK_CONTROLLER_EVENTS = {
UPDATE_BADGE: 'updateBadge',
// TODO: Add this and similar enums to the `controllers` repo and export them
APPROVAL_STATE_CHANGE: 'ApprovalController:stateChange',
QUEUED_REQUEST_STATE_CHANGE: 'QueuedRequestController:stateChange',
};

// stream channels
Expand Down Expand Up @@ -405,6 +406,11 @@ export default class MetamaskController extends EventEmitter {
this.queuedRequestController = new QueuedRequestController({
messenger: this.controllerMessenger.getRestricted({
name: 'QueuedRequestController',
allowedActions: [
'NetworkController:getState',
'NetworkController:setActiveNetwork',
'SelectedNetworkController:getNetworkClientIdForDomain',
],
}),
});

Expand Down Expand Up @@ -4839,7 +4845,9 @@ export default class MetamaskController extends EventEmitter {
}

const requestQueueMiddleware = createQueuedRequestMiddleware({
messenger: this.controllerMessenger,
enqueueRequest: this.queuedRequestController.enqueueRequest.bind(
this.queuedRequestController,
),
useRequestQueue: this.preferencesController.getUseRequestQueue.bind(
this.preferencesController,
),
Expand Down
36 changes: 20 additions & 16 deletions lavamoat/browserify/beta/policy.json
Original file line number Diff line number Diff line change
Expand Up @@ -1882,29 +1882,33 @@
},
"@metamask/queued-request-controller": {
"packages": {
"@metamask/base-controller": true,
"@metamask/providers>@metamask/json-rpc-engine": true,
"@metamask/providers>@metamask/rpc-errors": true,
"@metamask/queued-request-controller>@metamask/controller-utils": true,
"@metamask/selected-network-controller": true
"@metamask/queued-request-controller>@metamask/base-controller": true,
"@metamask/queued-request-controller>@metamask/json-rpc-engine": true,
"@metamask/utils": true
}
},
"@metamask/queued-request-controller>@metamask/controller-utils": {
"@metamask/queued-request-controller>@metamask/base-controller": {
"globals": {
"URL": true,
"console.error": true,
"fetch": true,
"setTimeout": true
},
"packages": {
"@ethereumjs/tx>@ethereumjs/util": true,
"@metamask/controller-utils>@spruceid/siwe-parser": true,
"@metamask/ethjs>@metamask/ethjs-unit": true,
"@metamask/utils": true,
"bn.js": true,
"browserify>buffer": true,
"eslint>fast-deep-equal": true,
"eth-ens-namehash": true
"immer": true
}
},
"@metamask/queued-request-controller>@metamask/json-rpc-engine": {
"packages": {
"@metamask/providers>@metamask/rpc-errors": true,
"@metamask/queued-request-controller>@metamask/json-rpc-engine>@metamask/safe-event-emitter": true,
"@metamask/utils": true
}
},
"@metamask/queued-request-controller>@metamask/json-rpc-engine>@metamask/safe-event-emitter": {
"globals": {
"setTimeout": true
},
"packages": {
"webpack>events": true
}
},
"@metamask/rpc-methods-flask>nanoid": {
Expand Down
36 changes: 20 additions & 16 deletions lavamoat/browserify/desktop/policy.json
Original file line number Diff line number Diff line change
Expand Up @@ -2033,29 +2033,33 @@
},
"@metamask/queued-request-controller": {
"packages": {
"@metamask/base-controller": true,
"@metamask/providers>@metamask/json-rpc-engine": true,
"@metamask/providers>@metamask/rpc-errors": true,
"@metamask/queued-request-controller>@metamask/controller-utils": true,
"@metamask/selected-network-controller": true
"@metamask/queued-request-controller>@metamask/base-controller": true,
"@metamask/queued-request-controller>@metamask/json-rpc-engine": true,
"@metamask/utils": true
}
},
"@metamask/queued-request-controller>@metamask/controller-utils": {
"@metamask/queued-request-controller>@metamask/base-controller": {
"globals": {
"URL": true,
"console.error": true,
"fetch": true,
"setTimeout": true
},
"packages": {
"@ethereumjs/tx>@ethereumjs/util": true,
"@metamask/controller-utils>@spruceid/siwe-parser": true,
"@metamask/ethjs>@metamask/ethjs-unit": true,
"@metamask/utils": true,
"bn.js": true,
"browserify>buffer": true,
"eslint>fast-deep-equal": true,
"eth-ens-namehash": true
"immer": true
}
},
"@metamask/queued-request-controller>@metamask/json-rpc-engine": {
"packages": {
"@metamask/providers>@metamask/rpc-errors": true,
"@metamask/queued-request-controller>@metamask/json-rpc-engine>@metamask/safe-event-emitter": true,
"@metamask/utils": true
}
},
"@metamask/queued-request-controller>@metamask/json-rpc-engine>@metamask/safe-event-emitter": {
"globals": {
"setTimeout": true
},
"packages": {
"webpack>events": true
}
},
"@metamask/rate-limit-controller": {
Expand Down
36 changes: 20 additions & 16 deletions lavamoat/browserify/flask/policy.json
Original file line number Diff line number Diff line change
Expand Up @@ -2085,29 +2085,33 @@
},
"@metamask/queued-request-controller": {
"packages": {
"@metamask/base-controller": true,
"@metamask/providers>@metamask/json-rpc-engine": true,
"@metamask/providers>@metamask/rpc-errors": true,
"@metamask/queued-request-controller>@metamask/controller-utils": true,
"@metamask/selected-network-controller": true
"@metamask/queued-request-controller>@metamask/base-controller": true,
"@metamask/queued-request-controller>@metamask/json-rpc-engine": true,
"@metamask/utils": true
}
},
"@metamask/queued-request-controller>@metamask/controller-utils": {
"@metamask/queued-request-controller>@metamask/base-controller": {
"globals": {
"URL": true,
"console.error": true,
"fetch": true,
"setTimeout": true
},
"packages": {
"@ethereumjs/tx>@ethereumjs/util": true,
"@metamask/controller-utils>@spruceid/siwe-parser": true,
"@metamask/ethjs>@metamask/ethjs-unit": true,
"@metamask/utils": true,
"bn.js": true,
"browserify>buffer": true,
"eslint>fast-deep-equal": true,
"eth-ens-namehash": true
"immer": true
}
},
"@metamask/queued-request-controller>@metamask/json-rpc-engine": {
"packages": {
"@metamask/providers>@metamask/rpc-errors": true,
"@metamask/queued-request-controller>@metamask/json-rpc-engine>@metamask/safe-event-emitter": true,
"@metamask/utils": true
}
},
"@metamask/queued-request-controller>@metamask/json-rpc-engine>@metamask/safe-event-emitter": {
"globals": {
"setTimeout": true
},
"packages": {
"webpack>events": true
}
},
"@metamask/rate-limit-controller": {
Expand Down
36 changes: 20 additions & 16 deletions lavamoat/browserify/main/policy.json
Original file line number Diff line number Diff line change
Expand Up @@ -2008,29 +2008,33 @@
},
"@metamask/queued-request-controller": {
"packages": {
"@metamask/base-controller": true,
"@metamask/providers>@metamask/json-rpc-engine": true,
"@metamask/providers>@metamask/rpc-errors": true,
"@metamask/queued-request-controller>@metamask/controller-utils": true,
"@metamask/selected-network-controller": true
Gudahtt marked this conversation as resolved.
Show resolved Hide resolved
"@metamask/queued-request-controller>@metamask/base-controller": true,
"@metamask/queued-request-controller>@metamask/json-rpc-engine": true,
"@metamask/utils": true
}
},
"@metamask/queued-request-controller>@metamask/controller-utils": {
"@metamask/queued-request-controller>@metamask/base-controller": {
"globals": {
"URL": true,
"console.error": true,
"fetch": true,
"setTimeout": true
},
"packages": {
"@ethereumjs/tx>@ethereumjs/util": true,
"@metamask/controller-utils>@spruceid/siwe-parser": true,
"@metamask/ethjs>@metamask/ethjs-unit": true,
"@metamask/utils": true,
"bn.js": true,
"browserify>buffer": true,
"eslint>fast-deep-equal": true,
"eth-ens-namehash": true
"immer": true
}
},
"@metamask/queued-request-controller>@metamask/json-rpc-engine": {
"packages": {
"@metamask/providers>@metamask/rpc-errors": true,
"@metamask/queued-request-controller>@metamask/json-rpc-engine>@metamask/safe-event-emitter": true,
"@metamask/utils": true
}
},
"@metamask/queued-request-controller>@metamask/json-rpc-engine>@metamask/safe-event-emitter": {
"globals": {
"setTimeout": true
},
"packages": {
"webpack>events": true
}
},
"@metamask/rate-limit-controller": {
Expand Down
36 changes: 20 additions & 16 deletions lavamoat/browserify/mmi/policy.json
Original file line number Diff line number Diff line change
Expand Up @@ -2141,29 +2141,33 @@
},
"@metamask/queued-request-controller": {
"packages": {
"@metamask/base-controller": true,
"@metamask/providers>@metamask/json-rpc-engine": true,
"@metamask/providers>@metamask/rpc-errors": true,
"@metamask/queued-request-controller>@metamask/controller-utils": true,
"@metamask/selected-network-controller": true
"@metamask/queued-request-controller>@metamask/base-controller": true,
"@metamask/queued-request-controller>@metamask/json-rpc-engine": true,
"@metamask/utils": true
}
},
"@metamask/queued-request-controller>@metamask/controller-utils": {
"@metamask/queued-request-controller>@metamask/base-controller": {
"globals": {
"URL": true,
"console.error": true,
"fetch": true,
"setTimeout": true
},
"packages": {
"@ethereumjs/tx>@ethereumjs/util": true,
"@metamask/controller-utils>@spruceid/siwe-parser": true,
"@metamask/ethjs>@metamask/ethjs-unit": true,
"@metamask/utils": true,
"bn.js": true,
"browserify>buffer": true,
"eslint>fast-deep-equal": true,
"eth-ens-namehash": true
"immer": true
}
},
"@metamask/queued-request-controller>@metamask/json-rpc-engine": {
"packages": {
"@metamask/providers>@metamask/rpc-errors": true,
"@metamask/queued-request-controller>@metamask/json-rpc-engine>@metamask/safe-event-emitter": true,
"@metamask/utils": true
}
},
"@metamask/queued-request-controller>@metamask/json-rpc-engine>@metamask/safe-event-emitter": {
"globals": {
"setTimeout": true
},
"packages": {
"webpack>events": true
}
},
"@metamask/rate-limit-controller": {
Expand Down
2 changes: 1 addition & 1 deletion package.json
Original file line number Diff line number Diff line change
Expand Up @@ -303,7 +303,7 @@
"@metamask/post-message-stream": "^8.0.0",
"@metamask/ppom-validator": "^0.28.0",
"@metamask/providers": "^14.0.2",
"@metamask/queued-request-controller": "^0.3.0",
"@metamask/queued-request-controller": "^0.6.0",
Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This is resulting in a bunch of peer dependency warnings

TODO: Validate that they're safe to ignore, or bump the other packages as well in the same PR

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Seems like theres only the one warning about queued request controller using a different version of selected network controller:

@metamask/selected-network-controller is listed by your project with version 9.0.0, which doesn't satisfy what @metamask/queued-request-controller (p81a9c) requests (^10.0.0).

the main change in 10.x.x is the update to base controller. The API afaik is the same, the typings have changed a bit here and there, but we arent getting any type errors so I think we are good to go.

https://github.com/MetaMask/core/blob/main/packages/selected-network-controller/CHANGELOG.md#1000

"@metamask/rate-limit-controller": "^3.0.0",
"@metamask/safe-event-emitter": "^2.0.0",
"@metamask/scure-bip39": "^2.0.3",
Expand Down
Loading
Loading