diff --git a/lib/__tests__/wallet-sdk.spec.ts b/lib/__tests__/wallet-sdk.spec.ts index ebd96e6..703cd5b 100644 --- a/lib/__tests__/wallet-sdk.spec.ts +++ b/lib/__tests__/wallet-sdk.spec.ts @@ -40,8 +40,11 @@ describe('sdk flow', () => { sdk .request( { - accountAddresses: {}, - personaData: { fields: ['email'] }, + accountAddresses: { reset: true }, + personaData: { + revokeOngoingAccess: ['firstName'], + fields: ['email'], + }, }, callbackSpy ) @@ -58,6 +61,10 @@ describe('sdk flow', () => { const outgoingMessage = outgoingMessageSpy.getFirstValue() expect(outgoingMessage.metadata.networkId).toBe(Network.mainnet) + expect((outgoingMessage.payload as any)[0].reset).toBe(true) + expect((outgoingMessage.payload as any)[1].revokeOngoingAccess).toEqual([ + 'firstName', + ]) sdk.__subjects.incomingMessageSubject.next({ requestId: outgoingMessage.requestId, diff --git a/lib/methods/_types.ts b/lib/methods/_types.ts index 0f22548..e340866 100644 --- a/lib/methods/_types.ts +++ b/lib/methods/_types.ts @@ -1,4 +1,4 @@ -import { RequestItem, RequestWalletResponseType } from './request' +import { WalletRequestItem, RequestWalletResponseType } from './request' export const methodType = { request: 'request', @@ -8,7 +8,7 @@ export const methodType = { export type MethodType = keyof typeof methodType export type WalletRequests = { - request: RequestItem[] + request: WalletRequestItem[] sendTransaction: { transactionManifest: string version: number diff --git a/lib/methods/request/_types.ts b/lib/methods/request/_types.ts index f2163d2..7ed1d7f 100644 --- a/lib/methods/request/_types.ts +++ b/lib/methods/request/_types.ts @@ -7,42 +7,60 @@ export const requestTypeSet = new Set(Object.keys(requestType)) export type RequestTypes = keyof typeof requestType -export type RequestWalletResponse = { - [requestType.accountAddresses]: { - requestType: typeof requestType['accountAddresses'] - addresses: { label: string; address: string }[] - } - [requestType.personaData]: { - requestType: typeof requestType['personaData'] - personaData: { field: string; value: string }[] - } +type AccountAddressesRequestMethodInput = { + numberOfAddresses?: number + ongoing?: boolean + reset?: boolean } -export type RequestWalletResponseType = RequestWalletResponse[RequestTypes] - -export type RequestItem = - | { - requestType: typeof requestType['accountAddresses'] - ongoing: boolean - numberOfAddresses?: number - } - | { - requestType: typeof requestType['personaData'] - ongoing: boolean - fields: string[] - } +type PersonaDataRequestMethodInput = { + fields: string[] + ongoing?: boolean + reset?: boolean + revokeOngoingAccess?: string[] +} export type RequestMethodInput = Partial<{ - accountAddresses: { - numberOfAddresses?: number - ongoing?: boolean - } - personaData: { - fields: string[] - ongoing?: boolean - } + [requestType.accountAddresses]: AccountAddressesRequestMethodInput + [requestType.personaData]: PersonaDataRequestMethodInput }> +type AccountAddressesWalletRequestItem = { + requestType: typeof requestType['accountAddresses'] + ongoing: boolean + numberOfAddresses?: number + reset: boolean +} + +type PersonaDataWalletRequestItem = { + requestType: typeof requestType['personaData'] + ongoing: boolean + fields: string[] + reset: boolean + revokeOngoingAccess?: string[] +} + +export type WalletRequestItem = + | AccountAddressesWalletRequestItem + | PersonaDataWalletRequestItem + +type AccountAddressesRequestWalletResponse = { + requestType: typeof requestType['accountAddresses'] + addresses: { label: string; address: string }[] +} + +type PersonaDataRequestWalletResponse = { + requestType: typeof requestType['personaData'] + personaData: { field: string; value: string }[] +} + +export type RequestWalletResponse = { + [requestType.accountAddresses]: AccountAddressesRequestWalletResponse + [requestType.personaData]: PersonaDataRequestWalletResponse +} + +export type RequestWalletResponseType = RequestWalletResponse[RequestTypes] + export type RequestMethodResponse = Partial<{ [requestType.accountAddresses]: RequestWalletResponse['accountAddresses']['addresses'] [requestType.personaData]: RequestWalletResponse['personaData']['personaData'] diff --git a/lib/methods/request/create-request-message.test.ts b/lib/methods/request/create-request-message.test.ts index b38cfa7..557f1ce 100644 --- a/lib/methods/request/create-request-message.test.ts +++ b/lib/methods/request/create-request-message.test.ts @@ -10,8 +10,8 @@ test('should ignore invalid request types', () => { } as any) ).toEqual( ok([ - { requestType: 'accountAddresses', ongoing: false }, - { requestType: 'personaData', ongoing: false }, + { requestType: 'accountAddresses', ongoing: false, reset: false }, + { requestType: 'personaData', ongoing: false, reset: false }, ]) ) }) @@ -19,7 +19,7 @@ test('should ignore invalid request types', () => { test('should create request message', () => { const result = createRequestMessage({ accountAddresses: { numberOfAddresses: 1 }, - personaData: { fields: ['email'], ongoing: true }, + personaData: { fields: ['email'], ongoing: true, reset: true }, }) if (result.isErr()) throw result.error @@ -33,8 +33,18 @@ test('should create request message', () => { expect(withoutRequestId).toEqual({ method: 'request', payload: [ - { requestType: 'accountAddresses', ongoing: false, numberOfAddresses: 1 }, - { requestType: 'personaData', ongoing: true, fields: ['email'] }, + { + requestType: 'accountAddresses', + ongoing: false, + numberOfAddresses: 1, + reset: false, + }, + { + requestType: 'personaData', + ongoing: true, + fields: ['email'], + reset: true, + }, ], }) }) diff --git a/lib/methods/request/create-request-message.ts b/lib/methods/request/create-request-message.ts index a805340..cb73d44 100644 --- a/lib/methods/request/create-request-message.ts +++ b/lib/methods/request/create-request-message.ts @@ -1,19 +1,20 @@ import { ok, Result } from 'neverthrow' import { createMessage } from '../../messages' import { methodType } from '../_types' -import { RequestMethodInput, RequestItem, requestTypeSet } from './_types' +import { RequestMethodInput, WalletRequestItem, requestTypeSet } from './_types' export const transformInput = ( input: RequestMethodInput -): Result => +): Result => ok( Object.entries(input) .map(([key, value]) => ({ requestType: key, ongoing: !!value.ongoing, + reset: !!value.reset, ...value, })) - .filter((item): item is RequestItem => + .filter((item): item is WalletRequestItem => requestTypeSet.has(item.requestType) ) ) diff --git a/sandbox/sandbox.ts b/sandbox/sandbox.ts index 86530cc..a153a96 100644 --- a/sandbox/sandbox.ts +++ b/sandbox/sandbox.ts @@ -12,8 +12,12 @@ const fetchAccountAddressButtonElement = document.getElementById( fetchAccountAddressButtonElement.onclick = async () => { const result = await sdk.request({ - accountAddresses: {}, - personaData: { fields: ['firstName', 'email'] }, + accountAddresses: { + numberOfAddresses: 1, + }, + personaData: { + fields: ['firstName', 'email'], + }, }) if (result.isErr()) {