-
-
Notifications
You must be signed in to change notification settings - Fork 1.2k
Adds OAuth Controller required for seedless onboarding #14889
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
base: main
Are you sure you want to change the base?
Changes from all commits
8051e3b
af381bc
664ac70
6143a4a
53c367d
7ad5fd4
ac5607e
c6f4590
f8952b1
cef712b
ab32e19
3833daf
ef332ad
de8f5ac
1c1e958
14ab169
3599963
db56659
5824e0c
a5c3b42
adea362
563849e
9c7b458
c8e5b1a
d3bdd54
e4f0af6
d49a2fc
0fd98b5
31f3725
f52172f
b2b2511
28d92de
2f4b52e
fa26464
3fdaafc
5ed2216
098d6cf
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,81 @@ | ||
import { seedlessOnboardingControllerInit } from '.'; | ||
import { ExtendedControllerMessenger } from '../../../ExtendedControllerMessenger'; | ||
import { buildControllerInitRequestMock } from '../../utils/test-utils'; | ||
import { ControllerInitRequest } from '../../types'; | ||
import { | ||
SeedlessOnboardingController, | ||
SeedlessOnboardingControllerMessenger, | ||
SeedlessOnboardingControllerState, | ||
} from '@metamask/seedless-onboarding-controller'; | ||
|
||
jest.mock('@metamask/seedless-onboarding-controller', () => { | ||
const actualSeedlessOnboardingController = jest.requireActual( | ||
'@metamask/seedless-onboarding-controller', | ||
); | ||
return { | ||
controllerName: actualSeedlessOnboardingController.controllerName, | ||
getDefaultSeedlessOnboardingControllerState: | ||
actualSeedlessOnboardingController.getDefaultSeedlessOnboardingControllerState, | ||
SeedlessOnboardingController: jest.fn(), | ||
Web3AuthNetwork: actualSeedlessOnboardingController.Web3AuthNetwork, | ||
}; | ||
}); | ||
|
||
describe('seedless onboarding controller init', () => { | ||
const seedlessOnboardingControllerClassMock = jest.mocked( | ||
SeedlessOnboardingController, | ||
); | ||
let initRequestMock: jest.Mocked< | ||
ControllerInitRequest<SeedlessOnboardingControllerMessenger> | ||
>; | ||
|
||
beforeEach(() => { | ||
jest.resetAllMocks(); | ||
const baseControllerMessenger = new ExtendedControllerMessenger(); | ||
// Create controller init request mock | ||
initRequestMock = buildControllerInitRequestMock(baseControllerMessenger); | ||
}); | ||
|
||
it('returns controller instance', () => { | ||
expect( | ||
seedlessOnboardingControllerInit(initRequestMock).controller, | ||
).toBeInstanceOf(SeedlessOnboardingController); | ||
}); | ||
|
||
it('controller state should be default state when no initial state is passed in', () => { | ||
const defaultSeedlessOnboardingControllerState = jest | ||
.requireActual('@metamask/seedless-onboarding-controller') | ||
.getDefaultSeedlessOnboardingControllerState(); | ||
|
||
seedlessOnboardingControllerInit(initRequestMock); | ||
|
||
const seedlessOnboardingControllerState = | ||
seedlessOnboardingControllerClassMock.mock.calls[0][0].state; | ||
|
||
expect(seedlessOnboardingControllerState).toEqual( | ||
defaultSeedlessOnboardingControllerState, | ||
); | ||
}); | ||
|
||
it('controller state should be initial state when initial state is passed in', () => { | ||
const initialSeedlessOnboardingControllerState: Partial<SeedlessOnboardingControllerState> = | ||
{ | ||
vault: undefined, | ||
nodeAuthTokens: undefined, | ||
}; | ||
|
||
initRequestMock.persistedState = { | ||
...initRequestMock.persistedState, | ||
SeedlessOnboardingController: initialSeedlessOnboardingControllerState, | ||
}; | ||
|
||
seedlessOnboardingControllerInit(initRequestMock); | ||
|
||
const seedlessOnboardingControllerState = | ||
seedlessOnboardingControllerClassMock.mock.calls[0][0].state; | ||
|
||
expect(seedlessOnboardingControllerState).toStrictEqual( | ||
initialSeedlessOnboardingControllerState, | ||
); | ||
}); | ||
}); |
Original file line number | Diff line number | Diff line change | ||||
---|---|---|---|---|---|---|
@@ -0,0 +1,46 @@ | ||||||
import type { ControllerInitFunction } from '../../types'; | ||||||
import { | ||||||
SeedlessOnboardingController, | ||||||
SeedlessOnboardingControllerState, | ||||||
Web3AuthNetwork, | ||||||
getDefaultSeedlessOnboardingControllerState, | ||||||
type SeedlessOnboardingControllerMessenger, | ||||||
} from '@metamask/seedless-onboarding-controller'; | ||||||
import { Encryptor, LEGACY_DERIVATION_OPTIONS } from '../../../Encryptor'; | ||||||
|
||||||
export const web3AuthNetwork = process.env.Web3AuthNetwork as Web3AuthNetwork; | ||||||
|
||||||
if (!web3AuthNetwork) { | ||||||
throw new Error('Missing environment variables'); | ||||||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more.
Suggested change
|
||||||
} | ||||||
|
||||||
const encryptor = new Encryptor({ | ||||||
keyDerivationOptions: LEGACY_DERIVATION_OPTIONS, | ||||||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. I'm not familiar with the different types of derivation options but I know we're using it in many places. @ccharly Can you take a look at this if it's fine? |
||||||
}); | ||||||
|
||||||
/** | ||||||
* Initialize the SeedlessOnboardingController. | ||||||
* | ||||||
* @param request - The request object. | ||||||
* @returns The SeedlessOnboardingController. | ||||||
*/ | ||||||
export const seedlessOnboardingControllerInit: ControllerInitFunction< | ||||||
SeedlessOnboardingController, | ||||||
SeedlessOnboardingControllerMessenger | ||||||
> = (request) => { | ||||||
const { controllerMessenger, persistedState } = request; | ||||||
|
||||||
const seedlessOnboardingControllerState = | ||||||
persistedState.SeedlessOnboardingController ?? | ||||||
getDefaultSeedlessOnboardingControllerState(); | ||||||
|
||||||
const controller = new SeedlessOnboardingController({ | ||||||
messenger: controllerMessenger, | ||||||
state: | ||||||
seedlessOnboardingControllerState as SeedlessOnboardingControllerState, | ||||||
encryptor, | ||||||
network: web3AuthNetwork, | ||||||
}); | ||||||
|
||||||
return { controller }; | ||||||
}; |
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,21 @@ | ||
import { BaseControllerMessenger } from '../../types'; | ||
|
||
export type SeedlessOnboardingControllerMessenger = ReturnType< | ||
typeof getSeedlessOnboardingControllerMessenger | ||
>; | ||
|
||
/** | ||
* Get the SeedlessOnboardingControllerMessenger for the SeedlessOnboardingController. | ||
* | ||
* @param baseControllerMessenger - The base controller messenger. | ||
* @returns The SeedlessOnboardingControllerMessenger. | ||
*/ | ||
export function getSeedlessOnboardingControllerMessenger( | ||
baseControllerMessenger: BaseControllerMessenger, | ||
) { | ||
return baseControllerMessenger.getRestricted({ | ||
name: 'SeedlessOnboardingController', | ||
allowedEvents: [], | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. I don't have visibility to the seedless onboarding controller. Does the controller use actions or events of other controllers? |
||
allowedActions: [], | ||
}); | ||
} |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Also, should this be moved into a constants file or just use the env var inline