From 68919328b525739499090299f45ce7db0b61c021 Mon Sep 17 00:00:00 2001 From: Dawid Sowa Date: Wed, 24 Apr 2024 15:14:35 +0200 Subject: [PATCH] feat: add session to CEClient [WIP] --- packages/dapp-toolkit/src/schemas/index.ts | 22 ++++++ .../src/storage/local-storage-client.ts | 1 + .../connector-extension-client.ts | 72 +++++++++++++++++-- .../transport/connector-extension/subjects.ts | 4 +- 4 files changed, 90 insertions(+), 9 deletions(-) diff --git a/packages/dapp-toolkit/src/schemas/index.ts b/packages/dapp-toolkit/src/schemas/index.ts index caf996d3..0c0884f4 100644 --- a/packages/dapp-toolkit/src/schemas/index.ts +++ b/packages/dapp-toolkit/src/schemas/index.ts @@ -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 diff --git a/packages/dapp-toolkit/src/storage/local-storage-client.ts b/packages/dapp-toolkit/src/storage/local-storage-client.ts index c6cc259e..a74e2ef8 100644 --- a/packages/dapp-toolkit/src/storage/local-storage-client.ts +++ b/packages/dapp-toolkit/src/storage/local-storage-client.ts @@ -11,6 +11,7 @@ type PartitionKey = | 'requests' | 'state' | 'connectButtonStatus' + | 'connectorExtensionSession' type dAppDefinitionAddress = string export type StorageChange = { diff --git a/packages/dapp-toolkit/src/wallet-request/transport/connector-extension/connector-extension-client.ts b/packages/dapp-toolkit/src/wallet-request/transport/connector-extension/connector-extension-client.ts index e6d9afc6..34bf3cb8 100644 --- a/packages/dapp-toolkit/src/wallet-request/transport/connector-extension/connector-extension-client.ts +++ b/packages/dapp-toolkit/src/wallet-request/transport/connector-extension/connector-extension-client.ts @@ -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, @@ -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 @@ -41,6 +46,7 @@ export const ConnectorExtensionClient = (input: { extensionDetectionTime?: number providers: { requestItemClient: RequestItemClient + storageClient: StorageProvider } }) => { const logger = input?.logger?.getSubLogger({ @@ -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 @@ -86,6 +126,20 @@ export const ConnectorExtensionClient = (input: { .subscribe(), ) + const wrapOutgoingInteraction = ( + interaction: WalletInteraction, + ): ResultAsync => { + 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).detail subjects.incomingMessageSubject.next(message) @@ -133,7 +187,7 @@ export const ConnectorExtensionClient = (input: { const sendCancelRequest = () => { subjects.outgoingMessageSubject.next({ interactionId: walletInteraction.interactionId, - items: { discriminator: 'cancelRequest' }, + discriminator: 'cancelInteraction', metadata: walletInteraction.metadata, }) @@ -199,9 +253,13 @@ export const ConnectorExtensionClient = (input: { filter((value): value is Err => !('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), ) @@ -270,7 +328,9 @@ export const ConnectorExtensionClient = (input: { }), ) }, - disconnect: () => {}, + disconnect: () => { + storage.clear() + }, destroy: () => { subscription.unsubscribe() removeEventListener(eventType.incomingMessage, handleIncomingMessage) diff --git a/packages/dapp-toolkit/src/wallet-request/transport/connector-extension/subjects.ts b/packages/dapp-toolkit/src/wallet-request/transport/connector-extension/subjects.ts index 712618e7..79b62d17 100644 --- a/packages/dapp-toolkit/src/wallet-request/transport/connector-extension/subjects.ts +++ b/packages/dapp-toolkit/src/wallet-request/transport/connector-extension/subjects.ts @@ -12,9 +12,7 @@ export type ConnectorExtensionSubjects = ReturnType< > export const ConnectorExtensionSubjects = () => ({ - outgoingMessageSubject: new Subject< - WalletInteraction | ExtensionInteraction - >(), + outgoingMessageSubject: new Subject(), incomingMessageSubject: new Subject< | MessageLifeCycleEvent | MessageLifeCycleExtensionStatusEvent