Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
82 changes: 82 additions & 0 deletions src/base-controllers.ts
Original file line number Diff line number Diff line change
@@ -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<string, BlockData>;

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<Block>) => void;

export type SendCallBack<U> = (err: any, providerRes: U) => void;

export interface LoggerMiddlewareOptions {
origin: string;
}

export function createLoggerMiddleware(options: LoggerMiddlewareOptions) {
return function loggerMiddleware(request: JRPCRequest<unknown>, response: JRPCResponse<unknown>, 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: <T, U>(req: JRPCRequest<T>) => Promise<U>;
send: <T, U>(req: JRPCRequest<T>, callback: SendCallBack<U>) => void;
request: <T, U>(args: RequestArguments<T>) => Promise<Maybe<U>>;
}
2 changes: 1 addition & 1 deletion src/baseProvider.ts
Original file line number Diff line number Diff line change
@@ -1,4 +1,3 @@
import { createLoggerMiddleware, SafeEventEmitterProvider, SendCallBack } from "@toruslabs/base-controllers";
import {
createIdRemapMiddleware,
createStreamMiddleware,
Expand All @@ -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";
Expand Down
2 changes: 1 addition & 1 deletion src/communicationProvider.ts
Original file line number Diff line number Diff line change
@@ -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";
Expand Down
2 changes: 1 addition & 1 deletion src/embed.ts
Original file line number Diff line number Diff line change
@@ -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";
Expand Down
2 changes: 1 addition & 1 deletion src/inPageProvider.ts
Original file line number Diff line number Diff line change
@@ -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";
Expand Down