Skip to content

Commit 0092b1f

Browse files
committed
refactor: use adapters
1 parent cd55d0c commit 0092b1f

File tree

12 files changed

+69
-28
lines changed

12 files changed

+69
-28
lines changed

packages/browser-sdk/src/providers/embedded/adapters/index.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,4 +2,5 @@ export * from "./storage";
22
export * from "./url-params";
33
export * from "./auth";
44
export * from "./phantom-app";
5+
export * from "./spending-limits";
56
export * from "./logger";
Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
import type { SpendingLimitsProvider } from "@phantom/embedded-provider-core";
2+
3+
export class BrowserSpendingLimitsProvider implements SpendingLimitsProvider {
4+
upsertSpendingLimit(_args: unknown): Promise<unknown> {
5+
return Promise.resolve();
6+
}
7+
}

packages/browser-sdk/src/providers/embedded/index.ts

Lines changed: 10 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,14 @@
11
import { EmbeddedProvider as CoreEmbeddedProvider } from "@phantom/embedded-provider-core";
22
import type { EmbeddedProviderConfig, PlatformAdapter } from "@phantom/embedded-provider-core";
33
import { IndexedDbStamper } from "@phantom/indexed-db-stamper";
4-
import { BrowserStorage, BrowserURLParamsAccessor, BrowserAuthProvider, BrowserPhantomAppProvider, BrowserLogger } from "./adapters";
4+
import {
5+
BrowserStorage,
6+
BrowserURLParamsAccessor,
7+
BrowserAuthProvider,
8+
BrowserPhantomAppProvider,
9+
BrowserLogger,
10+
BrowserSpendingLimitsProvider,
11+
} from "./adapters";
512
import { debug, DebugCategory } from "../../debug";
613
import { detectBrowser, getPlatformName } from "../../utils/browser-detection";
714
import type { Provider } from "../../types";
@@ -20,12 +27,13 @@ export class EmbeddedProvider extends CoreEmbeddedProvider implements Provider {
2027
});
2128

2229
const platformName = getPlatformName();
23-
const { name: browserName, version} = detectBrowser();
30+
const { name: browserName, version } = detectBrowser();
2431

2532
const platform: PlatformAdapter = {
2633
storage: new BrowserStorage(),
2734
authProvider: new BrowserAuthProvider(urlParamsAccessor),
2835
phantomAppProvider: new BrowserPhantomAppProvider(),
36+
spendingLimitsProvider: new BrowserSpendingLimitsProvider(),
2937
urlParamsAccessor,
3038
stamper,
3139
name: platformName, // Use detected browser name and version for identification

packages/client/src/PhantomClient.ts

Lines changed: 0 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -734,11 +734,6 @@ export class PhantomClient {
734734
}
735735
}
736736

737-
// TODO(Aaron): Add strictly typed implementation with error handling and documentation
738-
async upsertSpendingLimit(_params: unknown): Promise<unknown> {
739-
return Promise.resolve();
740-
}
741-
742737
/**
743738
* Stamp an axios request with the provided stamper
744739
*/

packages/embedded-provider-core/src/auth-flow.test.ts

Lines changed: 14 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@ import type {
77
AuthResult,
88
EmbeddedStorage,
99
AuthProvider,
10+
SpendingLimitsProvider,
1011
URLParamsAccessor,
1112
} from "./interfaces";
1213
import type { StamperWithKeyManagement } from "@phantom/sdk-types";
@@ -20,10 +21,10 @@ jest.mock("@phantom/parsers", () => ({
2021
parseMessage: jest.fn().mockReturnValue({ base64url: "mock-base64url" }),
2122
parseTransactionToBase64Url: jest.fn().mockResolvedValue({ base64url: "mock-base64url", originalFormat: "mock" }),
2223
parseSignMessageResponse: jest.fn().mockReturnValue({ signature: "mock-signature", rawSignature: "mock-raw" }),
23-
parseTransactionResponse: jest.fn().mockReturnValue({
24-
hash: "mock-transaction-hash",
24+
parseTransactionResponse: jest.fn().mockReturnValue({
25+
hash: "mock-transaction-hash",
2526
rawTransaction: "mock-raw-tx",
26-
blockExplorer: "https://explorer.com/tx/mock-transaction-hash"
27+
blockExplorer: "https://explorer.com/tx/mock-transaction-hash",
2728
}),
2829
parseSolanaTransactionSignature: jest.fn().mockReturnValue({ signature: "mock-signature", fallback: false }),
2930
}));
@@ -87,6 +88,7 @@ describe("EmbeddedProvider Auth Flows", () => {
8788
let mockLogger: DebugLogger;
8889
let mockStorage: jest.Mocked<EmbeddedStorage>;
8990
let mockAuthProvider: jest.Mocked<AuthProvider>;
91+
let mockSpendingLimitsProvider: jest.Mocked<SpendingLimitsProvider>;
9092
let mockURLParamsAccessor: jest.Mocked<URLParamsAccessor>;
9193
let mockStamper: jest.Mocked<StamperWithKeyManagement>;
9294
let mockClient: jest.Mocked<PhantomClient>;
@@ -129,6 +131,11 @@ describe("EmbeddedProvider Auth Flows", () => {
129131
resumeAuthFromRedirect: jest.fn(),
130132
};
131133

134+
// Mock spending limits provider
135+
mockSpendingLimitsProvider = {
136+
upsertSpendingLimit: jest.fn(),
137+
};
138+
132139
// Mock URL params accessor
133140
mockURLParamsAccessor = {
134141
getParam: jest.fn().mockReturnValue(null),
@@ -151,6 +158,7 @@ describe("EmbeddedProvider Auth Flows", () => {
151158
name: "test-platform",
152159
storage: mockStorage,
153160
authProvider: mockAuthProvider,
161+
spendingLimitsProvider: mockSpendingLimitsProvider,
154162
urlParamsAccessor: mockURLParamsAccessor,
155163
stamper: mockStamper,
156164
};
@@ -415,8 +423,6 @@ describe("EmbeddedProvider Auth Flows", () => {
415423
expect(mockAuthProvider.authenticate).toHaveBeenCalled();
416424
});
417425

418-
419-
420426
it("should fall back to fresh authentication when session is missing from database but URL has session_id", async () => {
421427
// Setup: URL contains session_id parameter (session was wiped from DB)
422428
mockURLParamsAccessor.getParam.mockReturnValue("wiped-session-123");
@@ -865,7 +871,9 @@ describe("EmbeddedProvider Auth Flows", () => {
865871
mockStorage.getSession.mockResolvedValue(null);
866872
mockAuthProvider.authenticate.mockRejectedValue(new Error("IndexedDB access denied"));
867873

868-
await expect(provider.connect()).rejects.toThrow("Storage error: Unable to access browser storage. Please ensure storage is available and try again.");
874+
await expect(provider.connect()).rejects.toThrow(
875+
"Storage error: Unable to access browser storage. Please ensure storage is available and try again.",
876+
);
869877
});
870878

871879
it("should clean up state on authentication failures", async () => {

packages/embedded-provider-core/src/embedded-provider.ts

Lines changed: 6 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@ import { EmbeddedEthereumChain, EmbeddedSolanaChain } from "./chains";
2020
import type {
2121
AuthProvider,
2222
AuthResult,
23+
SpendingLimitsProvider,
2324
DebugLogger,
2425
EmbeddedStorage,
2526
PlatformAdapter,
@@ -86,6 +87,7 @@ export class EmbeddedProvider {
8687
private authProvider: AuthProvider;
8788
// Phantom App (mobile and extension provider) deeplinks to our wallet for phantom connect
8889
private phantomAppProvider: PhantomAppProvider;
90+
private spendingLimitsProvider: SpendingLimitsProvider;
8991
private urlParamsAccessor: URLParamsAccessor;
9092
private stamper: StamperWithKeyManagement;
9193
private logger: DebugLogger;
@@ -113,6 +115,7 @@ export class EmbeddedProvider {
113115
this.storage = platform.storage;
114116
this.authProvider = platform.authProvider;
115117
this.phantomAppProvider = platform.phantomAppProvider;
118+
this.spendingLimitsProvider = platform.spendingLimitsProvider;
116119
this.urlParamsAccessor = platform.urlParamsAccessor;
117120
this.stamper = platform.stamper;
118121
this.jwtAuth = new JWTAuth();
@@ -891,13 +894,12 @@ export class EmbeddedProvider {
891894
return await parseTransactionResponse(rawResponse.rawTransaction, params.networkId, rawResponse.hash);
892895
}
893896

894-
// TODO(Aaron): Add strictly typed implementation with logging, error handling and documentation
895-
async upsertSpendingLimit(_params: unknown): Promise<unknown> {
897+
async upsertSpendingLimit(_args: unknown): Promise<unknown> {
896898
if (!this.client || !this.walletId) {
897899
throw new Error("Not connected");
898900
}
899901

900-
return await this.client.upsertSpendingLimit(_params);
902+
return await this.spendingLimitsProvider.upsertSpendingLimit(_args);
901903
}
902904

903905
getAddresses(): WalletAddress[] {
@@ -1057,11 +1059,7 @@ export class EmbeddedProvider {
10571059
* 4. Start a polling mechanism to check for auth completion
10581060
* 5. Update the session when the mobile app completes the auth
10591061
*/
1060-
private async handlePhantomAuth(
1061-
publicKey: string,
1062-
stamperInfo: StamperInfo,
1063-
expiresInMs: number,
1064-
): Promise<Session> {
1062+
private async handlePhantomAuth(publicKey: string, stamperInfo: StamperInfo, expiresInMs: number): Promise<Session> {
10651063
this.logger.info("EMBEDDED_PROVIDER", "Starting Phantom authentication flow");
10661064

10671065
// Check if Phantom app is available (extension or mobile)
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
export * from "./storage";
22
export * from "./url-params";
33
export * from "./auth";
4+
export * from "./spending-limits";
45
export * from "./platform";

packages/embedded-provider-core/src/interfaces/platform.ts

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,8 @@ import type { EmbeddedStorage } from "./storage";
22
import type { AuthProvider, PhantomAppProvider } from "./auth";
33
import type { URLParamsAccessor } from "./url-params";
44
import type { StamperWithKeyManagement } from "@phantom/sdk-types";
5-
import type { ClientSideSdkHeaders } from "@phantom/constants";
5+
import type { ClientSideSdkHeaders } from "@phantom/constants";
6+
import type { SpendingLimitsProvider } from "./spending-limits";
67

78
export interface PlatformAdapter {
89
name: string; // Platform identifier like "web", "ios", "android", "react-native", etc.
@@ -11,6 +12,7 @@ export interface PlatformAdapter {
1112
storage: EmbeddedStorage;
1213
authProvider: AuthProvider;
1314
phantomAppProvider: PhantomAppProvider;
15+
spendingLimitsProvider: SpendingLimitsProvider;
1416
urlParamsAccessor: URLParamsAccessor;
1517
stamper: StamperWithKeyManagement;
1618
analyticsHeaders?: Partial<ClientSideSdkHeaders>;
Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
export interface SpendingLimitsProvider {
2+
upsertSpendingLimit(args: unknown): Promise<unknown>;
3+
}

packages/embedded-provider-core/src/renewal.test.ts

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
import { EmbeddedProvider } from "./embedded-provider";
2-
import type { EmbeddedProviderConfig, PlatformAdapter, Session } from "./interfaces";
2+
import type { EmbeddedProviderConfig, PlatformAdapter, Session, SpendingLimitsProvider } from "./interfaces";
33
import type { StamperWithKeyManagement } from "@phantom/sdk-types";
44
import type { PhantomClient } from "@phantom/client";
55

@@ -26,6 +26,7 @@ describe.skip("EmbeddedProvider Renewal Tests", () => {
2626
let provider: EmbeddedProvider;
2727
let mockStamper: jest.Mocked<StamperWithKeyManagement>;
2828
let mockClient: jest.Mocked<PhantomClient>;
29+
let mockSpendingLimitsProvider: jest.Mocked<SpendingLimitsProvider>;
2930
let mockStorage: { [key: string]: any };
3031
let originalDate: typeof Date;
3132

@@ -85,10 +86,15 @@ describe.skip("EmbeddedProvider Renewal Tests", () => {
8586
}),
8687
} as any;
8788

89+
mockSpendingLimitsProvider = {
90+
upsertSpendingLimit: jest.fn(),
91+
};
92+
8893
// Mock platform adapter
8994
const mockPlatform: PlatformAdapter = {
9095
storage: mockEmbeddedStorage,
9196
authProvider: {} as any,
97+
spendingLimitsProvider: mockSpendingLimitsProvider,
9298
urlParamsAccessor: {} as any,
9399
stamper: mockStamper,
94100
name: "test-platform",

0 commit comments

Comments
 (0)