core
core copied to clipboard
[composable-controller] Implement type validation of constructor options
Requirements
When initializing a ComposableController
class, given a ComposableControllerState
type:
-
A type error should be raised if the list of child controllers specified in the
controllers
array constructor option does not exactly match the list of controllers included in theComposableControllerState
type. -
A type error should be raised if the controller-messenger instance passed into the
messenger
constructor option has an event allowlist that does not include all of thestateChange
events for the list of controllers in theComposableControllerState
type.
References
- Follows from https://github.com/MetaMask/core/issues/3627
@MajorLift Can you update the ticket to include the solutions you have tried for number 2 above and the roadblocks you hit so that others have that context?
Seems like we probably need some spikes to figure out how to solve or approach. So waiting to estimate until we have a chance to do that.
-
controllers
:- Validating with a union type consisting of the child controllers allows
controllers
lists that are incomplete. - Validating with a tuple type consisting of the child controllers forces us to pass in a
controllers
list that matches the order of the tuple type, not just the contents.- Because the tuple type is likely to be derived from a union type, its order cannot necessarily be determined based on the order of controllers presented in the
ComposableControllerState
type.
- Because the tuple type is likely to be derived from a union type, its order cannot necessarily be determined based on the order of controllers presented in the
- Validating with a union type consisting of the child controllers allows
-
messenger
:- Given an event allowlist
T
, andU
s.t.U <: T
, TypeScript does not recognize thatRestrictedControllerMessenger<..., U> <: RestrictedControllerMessenger<..., T>
. - Wrap class constructor into a factory function that takes the event allowlist as a parameter, and validate that parameter?
- Given an event allowlist
Following up on the last bullet point in the above comment, the wallet framework proposal also suggests refactoring the ComposableController
into a compose
function that returns a class instance that composes the input child controllers.
This should make it easier to validate the input params of the compose
function, as we can let TypeScript use the input arguments as sources of inference for generic params, and then apply generic constraints.
Here's an example of this concept in action.
Priority analysis:
- If ComposableController is only used internally: Nice-to-have.
- If ComposableController is included in the Wallet Framework: Should at least aim for partial improvements.