Skip to content

Commit

Permalink
feat: add session to CEClient [WIP]
Browse files Browse the repository at this point in the history
  • Loading branch information
dawidsowardx committed Apr 24, 2024
1 parent 5efbeb3 commit 6891932
Show file tree
Hide file tree
Showing 4 changed files with 90 additions and 9 deletions.
22 changes: 22 additions & 0 deletions packages/dapp-toolkit/src/schemas/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -381,9 +381,31 @@ export type OpenPopupExtensionInteraction = Output<
typeof OpenPopupExtensionInteraction
>

export type WalletInteractionExtensionInteraction = Output<
typeof WalletInteractionExtensionInteraction
>

export const WalletInteractionExtensionInteraction = object({
interactionId: string(),
discriminator: literal('walletInteraction'),
interaction: WalletInteraction,
})

export type CancelInteractionExtensionInteraction = Output<
typeof CancelInteractionExtensionInteraction
>

export const CancelInteractionExtensionInteraction = object({
interactionId: string(),
discriminator: literal('cancelInteraction'),
metadata: Metadata,
})

export const ExtensionInteraction = union([
StatusExtensionInteraction,
OpenPopupExtensionInteraction,
WalletInteractionExtensionInteraction,
CancelInteractionExtensionInteraction,
])

export type ExtensionInteraction = Output<typeof ExtensionInteraction>
Expand Down
1 change: 1 addition & 0 deletions packages/dapp-toolkit/src/storage/local-storage-client.ts
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,7 @@ type PartitionKey =
| 'requests'
| 'state'
| 'connectButtonStatus'
| 'connectorExtensionSession'
type dAppDefinitionAddress = string

export type StorageChange<T> = {
Expand Down
Original file line number Diff line number Diff line change
@@ -1,6 +1,8 @@
import { WalletInteractionExtensionInteraction } from './../../../schemas'
import { Curve25519 } from './../../crypto/curve25519'
import { ConnectorExtensionSubjects } from './subjects'

import { Err, Result, ResultAsync, err, ok } from 'neverthrow'
import { Err, Result, ResultAsync, err, ok, okAsync } from 'neverthrow'
import {
Subject,
Subscription,
Expand Down Expand Up @@ -30,6 +32,9 @@ import {
} from '../../../schemas'
import { SdkError } from '../../../error'
import { RequestItemClient } from '../../request-items'
import { StorageProvider } from '../../../storage'
import { SessionClient } from '../../session/session'
import { IdentityClient } from '../../identity/identity'

export type ConnectorExtensionClient = ReturnType<
typeof ConnectorExtensionClient
Expand All @@ -41,6 +46,7 @@ export const ConnectorExtensionClient = (input: {
extensionDetectionTime?: number
providers: {
requestItemClient: RequestItemClient
storageClient: StorageProvider
}
}) => {
const logger = input?.logger?.getSubLogger({
Expand All @@ -50,6 +56,40 @@ export const ConnectorExtensionClient = (input: {
const subscription = new Subscription()
const extensionDetectionTime = input?.extensionDetectionTime ?? 100
const requestItemClient = input.providers.requestItemClient
const storage = input.providers.storageClient.getPartition(
'connectorExtensionSession',
)

storage.getState().map((state) => {})

const sessionClient = SessionClient({
providers: {
storageClient: input.providers.storageClient.getPartition(
'connectorExtensionSession',
),
identityClient: IdentityClient({
providers: {
storageClient:
input.providers.storageClient.getPartition('identities'),
KeyPairClient: Curve25519,
},
}),
},
})

// sessionClient
// .getCurrentSession()
// .map((session) => {
// console.log(session)
// sessionClient
// .convertToActiveSession(session.sessionId, 'abc')
// .andThen((h) => {
// console.log(h)
// })
// })
// .mapErr((error) => {
// console.error(error)
// })

subscription.add(
subjects.incomingMessageSubject
Expand Down Expand Up @@ -86,6 +126,20 @@ export const ConnectorExtensionClient = (input: {
.subscribe(),
)

const wrapOutgoingInteraction = (
interaction: WalletInteraction,
): ResultAsync<WalletInteractionExtensionInteraction, Error> => {
return storage.getState().andThen((state) => {
const sessionId = state.sessionId || crypto.randomUUID()
return okAsync({
interactionId: interaction.interactionId,
interaction,
sessionId,
discriminator: 'walletInteraction' as const,
})
})
}

const handleIncomingMessage = (event: Event) => {
const message = (event as CustomEvent<IncomingMessage>).detail
subjects.incomingMessageSubject.next(message)
Expand Down Expand Up @@ -133,7 +187,7 @@ export const ConnectorExtensionClient = (input: {
const sendCancelRequest = () => {
subjects.outgoingMessageSubject.next({
interactionId: walletInteraction.interactionId,
items: { discriminator: 'cancelRequest' },
discriminator: 'cancelInteraction',
metadata: walletInteraction.metadata,
})

Expand Down Expand Up @@ -199,9 +253,13 @@ export const ConnectorExtensionClient = (input: {
filter((value): value is Err<never, SdkError> => !('eventType' in value)),
)

const sendWalletRequest$ = of(walletInteraction).pipe(
tap((message) => {
subjects.outgoingMessageSubject.next(message)
const sendWalletRequest$ = of(
wrapOutgoingInteraction(walletInteraction),
).pipe(
tap((result) => {
result.map((message) => {
subjects.outgoingMessageSubject.next(message)
})
}),
filter((_): _ is never => false),
)
Expand Down Expand Up @@ -270,7 +328,9 @@ export const ConnectorExtensionClient = (input: {
}),
)
},
disconnect: () => {},
disconnect: () => {
storage.clear()
},
destroy: () => {
subscription.unsubscribe()
removeEventListener(eventType.incomingMessage, handleIncomingMessage)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -12,9 +12,7 @@ export type ConnectorExtensionSubjects = ReturnType<
>

export const ConnectorExtensionSubjects = () => ({
outgoingMessageSubject: new Subject<
WalletInteraction | ExtensionInteraction
>(),
outgoingMessageSubject: new Subject<ExtensionInteraction>(),
incomingMessageSubject: new Subject<
| MessageLifeCycleEvent
| MessageLifeCycleExtensionStatusEvent
Expand Down

0 comments on commit 6891932

Please sign in to comment.