diff --git a/src/base-controllers.ts b/src/base-controllers.ts new file mode 100644 index 0000000..7e41dce --- /dev/null +++ b/src/base-controllers.ts @@ -0,0 +1,82 @@ +import { JRPCEngineNextCallback, JRPCRequest, JRPCResponse, SafeEventEmitter } from "@toruslabs/openlogin-jrpc"; +import log from "loglevel"; + +import { LOGIN_PROVIDER_TYPE, Maybe, RequestArguments } from "./interfaces"; + +export type BlockData = string | string[]; + +export type Block = Record; + +export type InPageWalletProviderState = { + accounts: string[]; + chainId: string; + isUnlocked: boolean; +}; + +export const PROVIDER_JRPC_METHODS = { + GET_PROVIDER_STATE: "wallet_get_provider_state", +}; + +export const PROVIDER_NOTIFICATIONS = { + ACCOUNTS_CHANGED: "wallet_accounts_changed", + CHAIN_CHANGED: "wallet_chain_changed", + UNLOCK_STATE_CHANGED: "wallet_unlock_state_changed", +}; + +export const COMMUNICATION_NOTIFICATIONS = { + IFRAME_STATUS: "iframe_status", + + // Tell embed to create the window + CREATE_WINDOW: "create_window", + // Tell embed to close the window + CLOSE_WINDOW: "close_window", + + USER_LOGGED_IN: "user_logged_in", + USER_LOGGED_OUT: "user_logged_out", +}; + +export const COMMUNICATION_JRPC_METHODS = { + LOGOUT: "logout", + WALLET_INSTANCE_ID: "wallet_instance_id", + USER_INFO: "user_info", + SET_PROVIDER: "set_provider", + TOPUP: "topup", + IFRAME_STATUS: "iframe_status", + // embed has opened the window as requested + OPENED_WINDOW: "opened_window", + // user has closed the window from embed's side + CLOSED_WINDOW: "closed_window", + GET_PROVIDER_STATE: "get_provider_state", + LOGIN_WITH_PRIVATE_KEY: "login_with_private_key", +}; + +export type CommunicationWalletProviderState = { + isLoggedIn: boolean; + currentLoginProvider: LOGIN_PROVIDER_TYPE; +}; +export type SendAsyncCallBack = (err: Error, providerRes: JRPCResponse) => void; + +export type SendCallBack = (err: any, providerRes: U) => void; + +export interface LoggerMiddlewareOptions { + origin: string; +} + +export function createLoggerMiddleware(options: LoggerMiddlewareOptions) { + return function loggerMiddleware(request: JRPCRequest, response: JRPCResponse, next: JRPCEngineNextCallback): void { + next((callback) => { + if (response.error) { + log.warn("Error in RPC response:\n", response); + } + if ((request as unknown as { isTorusInternal: boolean }).isTorusInternal) return; + log.info(`RPC (${options.origin}):`, request, "->", response); + callback(); + }); + }; +} + +export interface SafeEventEmitterProvider extends SafeEventEmitter { + sendAsync: (req: JRPCRequest) => Promise; + send: (req: JRPCRequest, callback: SendCallBack) => void; + request: (args: RequestArguments) => Promise>; +} diff --git a/src/baseProvider.ts b/src/baseProvider.ts index bfd9505..8551b85 100644 --- a/src/baseProvider.ts +++ b/src/baseProvider.ts @@ -1,4 +1,3 @@ -import { createLoggerMiddleware, SafeEventEmitterProvider, SendCallBack } from "@toruslabs/base-controllers"; import { createIdRemapMiddleware, createStreamMiddleware, @@ -15,6 +14,7 @@ import { duplex as isDuplexStream } from "is-stream"; import pump from "pump"; import type { Duplex } from "readable-stream"; +import { createLoggerMiddleware, SafeEventEmitterProvider, SendCallBack } from "./base-controllers"; import { BaseProviderState, Maybe, ProviderOptions, RequestArguments, UnValidatedJsonRpcRequest } from "./interfaces"; import messages from "./messages"; import { createErrorMiddleware, logStreamDisconnectWarning } from "./utils"; diff --git a/src/communicationProvider.ts b/src/communicationProvider.ts index 323a15a..6e141bd 100644 --- a/src/communicationProvider.ts +++ b/src/communicationProvider.ts @@ -1,8 +1,8 @@ -import { COMMUNICATION_JRPC_METHODS, COMMUNICATION_NOTIFICATIONS, CommunicationWalletProviderState } from "@toruslabs/base-controllers"; import { JRPCRequest } from "@toruslabs/openlogin-jrpc"; import { EthereumRpcError } from "eth-rpc-errors"; import type { Duplex } from "readable-stream"; +import { COMMUNICATION_JRPC_METHODS, COMMUNICATION_NOTIFICATIONS, CommunicationWalletProviderState } from "./base-controllers"; import BaseProvider from "./baseProvider"; import configuration from "./config"; import { documentReady, htmlToElement } from "./embedUtils"; diff --git a/src/embed.ts b/src/embed.ts index ad39ff9..0cb6104 100644 --- a/src/embed.ts +++ b/src/embed.ts @@ -1,8 +1,8 @@ import { PublicKey, SignaturePubkeyPair, Transaction } from "@solana/web3.js"; -import { COMMUNICATION_JRPC_METHODS } from "@toruslabs/base-controllers"; import { setAPIKey } from "@toruslabs/http-helpers"; import { BasePostMessageStream, getRpcPromiseCallback, JRPCRequest } from "@toruslabs/openlogin-jrpc"; +import { COMMUNICATION_JRPC_METHODS } from "./base-controllers"; import TorusCommunicationProvider from "./communicationProvider"; import configuration from "./config"; import { documentReady, htmlToElement } from "./embedUtils"; diff --git a/src/inPageProvider.ts b/src/inPageProvider.ts index 8697bf6..b0b758a 100644 --- a/src/inPageProvider.ts +++ b/src/inPageProvider.ts @@ -1,9 +1,9 @@ -import { InPageWalletProviderState, PROVIDER_JRPC_METHODS, PROVIDER_NOTIFICATIONS } from "@toruslabs/base-controllers"; import { JRPCRequest, JRPCSuccess } from "@toruslabs/openlogin-jrpc"; import { EthereumRpcError } from "eth-rpc-errors"; import dequal from "fast-deep-equal"; import type { Duplex } from "readable-stream"; +import { InPageWalletProviderState, PROVIDER_JRPC_METHODS, PROVIDER_NOTIFICATIONS } from "./base-controllers"; import BaseProvider from "./baseProvider"; import { InPageProviderState, ProviderOptions, RequestArguments, UnValidatedJsonRpcRequest } from "./interfaces"; import log from "./loglevel";