Skip to content
This repository has been archived by the owner on Aug 16, 2024. It is now read-only.

Commit

Permalink
feat: add revoke and reset to request method
Browse files Browse the repository at this point in the history
  • Loading branch information
xstelea committed Oct 24, 2022
1 parent 670e188 commit 44c6cc1
Show file tree
Hide file tree
Showing 6 changed files with 84 additions and 44 deletions.
11 changes: 9 additions & 2 deletions lib/__tests__/wallet-sdk.spec.ts
Original file line number Diff line number Diff line change
Expand Up @@ -40,8 +40,11 @@ describe('sdk flow', () => {
sdk
.request(
{
accountAddresses: {},
personaData: { fields: ['email'] },
accountAddresses: { reset: true },
personaData: {
revokeOngoingAccess: ['firstName'],
fields: ['email'],
},
},
callbackSpy
)
Expand All @@ -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,
Expand Down
4 changes: 2 additions & 2 deletions lib/methods/_types.ts
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
import { RequestItem, RequestWalletResponseType } from './request'
import { WalletRequestItem, RequestWalletResponseType } from './request'

export const methodType = {
request: 'request',
Expand All @@ -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
Expand Down
78 changes: 48 additions & 30 deletions lib/methods/request/_types.ts
Original file line number Diff line number Diff line change
Expand Up @@ -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']
Expand Down
20 changes: 15 additions & 5 deletions lib/methods/request/create-request-message.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -10,16 +10,16 @@ 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 },
])
)
})

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
Expand All @@ -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,
},
],
})
})
7 changes: 4 additions & 3 deletions lib/methods/request/create-request-message.ts
Original file line number Diff line number Diff line change
@@ -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<RequestItem[], never> =>
): Result<WalletRequestItem[], never> =>
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)
)
)
Expand Down
8 changes: 6 additions & 2 deletions sandbox/sandbox.ts
Original file line number Diff line number Diff line change
Expand Up @@ -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()) {
Expand Down

0 comments on commit 44c6cc1

Please sign in to comment.