From 2e6a0a2eb62d51394bf6c141688e0bf14addd1e7 Mon Sep 17 00:00:00 2001 From: Gancho Radkov Date: Wed, 29 Nov 2023 16:16:25 +0200 Subject: [PATCH] feat: implements static `decrypt notifications` & `getMetadata` utils --- packages/web3wallet/src/client.ts | 11 +++++++++ packages/web3wallet/src/controllers/engine.ts | 5 ++++ packages/web3wallet/src/types/client.ts | 21 ++++++++++++++-- packages/web3wallet/src/types/engine.ts | 8 +++++++ packages/web3wallet/src/utils/index.ts | 1 + .../web3wallet/src/utils/notifications.ts | 24 +++++++++++++++++++ 6 files changed, 68 insertions(+), 2 deletions(-) create mode 100644 packages/web3wallet/src/utils/index.ts create mode 100644 packages/web3wallet/src/utils/notifications.ts diff --git a/packages/web3wallet/src/client.ts b/packages/web3wallet/src/client.ts index 87142748c..7991bf03f 100644 --- a/packages/web3wallet/src/client.ts +++ b/packages/web3wallet/src/client.ts @@ -2,6 +2,7 @@ import EventEmitter from "events"; import { CLIENT_CONTEXT } from "./constants"; import { Engine } from "./controllers"; import { IWeb3Wallet, Web3WalletTypes } from "./types"; +import { Notifications } from "./utils"; export class Web3Wallet extends IWeb3Wallet { public name: IWeb3Wallet["name"]; @@ -10,6 +11,7 @@ export class Web3Wallet extends IWeb3Wallet { public events: IWeb3Wallet["events"] = new EventEmitter(); public engine: IWeb3Wallet["engine"]; public metadata: IWeb3Wallet["metadata"]; + public static notifications: Web3WalletTypes.INotifications = Notifications; static async init(opts: Web3WalletTypes.Options) { const client = new Web3Wallet(opts); @@ -173,6 +175,15 @@ export class Web3Wallet extends IWeb3Wallet { } }; + public registerDeviceToken: IWeb3Wallet["registerDeviceToken"] = (params) => { + try { + return this.engine.registerDeviceToken(params); + } catch (error: any) { + this.logger.error(error.message); + throw error; + } + }; + // ---------- Private ----------------------------------------------- // private async initialize() { diff --git a/packages/web3wallet/src/controllers/engine.ts b/packages/web3wallet/src/controllers/engine.ts index f13a05c91..6b151b27b 100644 --- a/packages/web3wallet/src/controllers/engine.ts +++ b/packages/web3wallet/src/controllers/engine.ts @@ -98,6 +98,11 @@ export class Engine extends IWeb3WalletEngine { return this.authClient.formatMessage(params, iss); }; + // Push // + public registerDeviceToken: IWeb3WalletEngine["registerDeviceToken"] = (params) => { + return this.client.core.echo.registerDeviceToken(params); + }; + // ---------- Private ----------------------------------------------- // private onSessionRequest = (event: Web3WalletTypes.SessionRequest) => { diff --git a/packages/web3wallet/src/types/client.ts b/packages/web3wallet/src/types/client.ts index 0e13c00ce..e47901947 100644 --- a/packages/web3wallet/src/types/client.ts +++ b/packages/web3wallet/src/types/client.ts @@ -1,8 +1,9 @@ import EventEmmiter, { EventEmitter } from "events"; -import { ICore, ProposalTypes, Verify } from "@walletconnect/types"; +import { ICore, CoreTypes, ProposalTypes, Verify } from "@walletconnect/types"; import { AuthClientTypes } from "@walletconnect/auth-client"; import { IWeb3WalletEngine } from "./engine"; import { Logger } from "@walletconnect/logger"; +import { JsonRpcPayload, JsonRpcRequest } from "@walletconnect/jsonrpc-utils"; export declare namespace Web3WalletTypes { type Event = "session_proposal" | "session_request" | "session_delete" | "auth_request"; @@ -41,7 +42,21 @@ export declare namespace Web3WalletTypes { name?: string; } - type Metadata = AuthClientTypes.Metadata; + type Metadata = CoreTypes.Metadata; + + interface INotifications { + decryptMessage: (params: { + topic: string; + encryptedMessage: string; + storageOptions?: CoreTypes.Options["storageOptions"]; + storage?: CoreTypes.Options["storage"]; + }) => Promise; + getMetadata: (params: { + topic: string; + storageOptions?: CoreTypes.Options["storageOptions"]; + storage?: CoreTypes.Options["storage"]; + }) => Promise; + } } export abstract class IWeb3WalletEvents extends EventEmmiter { @@ -104,6 +119,8 @@ export abstract class IWeb3Wallet { public abstract respondAuthRequest: IWeb3WalletEngine["respondAuthRequest"]; public abstract getPendingAuthRequests: IWeb3WalletEngine["getPendingAuthRequests"]; public abstract formatMessage: IWeb3WalletEngine["formatMessage"]; + // push + public abstract registerDeviceToken: IWeb3WalletEngine["registerDeviceToken"]; // ---------- Event Handlers ----------------------------------------------- // public abstract on: ( diff --git a/packages/web3wallet/src/types/engine.ts b/packages/web3wallet/src/types/engine.ts index 47b4ae6cb..bb121be5e 100644 --- a/packages/web3wallet/src/types/engine.ts +++ b/packages/web3wallet/src/types/engine.ts @@ -83,4 +83,12 @@ export abstract class IWeb3WalletEngine { // format payload to message string public abstract formatMessage(payload: AuthEngineTypes.CacaoRequestPayload, iss: string): string; + + // ---------- Push ------------------------------------------------- // + public abstract registerDeviceToken(params: { + clientId: string; + token: string; + notificationType: "fcm" | "apns" | "apns-sandbox" | "noop"; + enableAlwaysDecrypted?: boolean; + }): Promise; } diff --git a/packages/web3wallet/src/utils/index.ts b/packages/web3wallet/src/utils/index.ts new file mode 100644 index 000000000..adcb2c9f5 --- /dev/null +++ b/packages/web3wallet/src/utils/index.ts @@ -0,0 +1 @@ +export * from "./notifications"; diff --git a/packages/web3wallet/src/utils/notifications.ts b/packages/web3wallet/src/utils/notifications.ts new file mode 100644 index 000000000..b279fcaa4 --- /dev/null +++ b/packages/web3wallet/src/utils/notifications.ts @@ -0,0 +1,24 @@ +import { Core } from "@walletconnect/core"; +import { Web3WalletTypes } from "../types"; +import { SessionStore } from "@walletconnect/sign-client"; + +export const Notifications: Web3WalletTypes.INotifications = { + decryptMessage: async (params) => { + const core = new Core({ + storageOptions: params.storageOptions, + storage: params.storage, + }); + await core.crypto.init(); + return core.crypto.decode(params.topic, params.encryptedMessage); + }, + getMetadata: async (params) => { + const core = new Core({ + storageOptions: params.storageOptions, + storage: params.storage, + }); + const sessionStore = new SessionStore(core, core.logger); + await sessionStore.init(); + const session = sessionStore.get(params.topic); + return session?.peer.metadata; + }, +};