diff --git a/.changeset/real-rabbits-pretend.md b/.changeset/real-rabbits-pretend.md new file mode 100644 index 00000000000..461655290b5 --- /dev/null +++ b/.changeset/real-rabbits-pretend.md @@ -0,0 +1,9 @@ +--- +'@audius/sdk': major +--- + +Create SDK without services by default in all cases + +Updates the `sdk()` constructor to create the SDK without the old services and API structure regardless of config. This will align all configurations to have the same API surface that matches existing docs and examples. + +To maintain compatibility, older legacy apps can use `createSdkWithServices()` instead of `sdk()` when initting the SDK. This is not advised for third-party apps. diff --git a/packages/commands/src/utils.ts b/packages/commands/src/utils.ts index 6294db423c4..ce62fdbfc7d 100644 --- a/packages/commands/src/utils.ts +++ b/packages/commands/src/utils.ts @@ -1,5 +1,5 @@ import { - sdk, + createSdkWithServices, SolanaRelay, Configuration, createHedgehogWalletClient, @@ -163,7 +163,7 @@ export const initializeAudiusSdk = async ({ const audiusWalletClient = createHedgehogWalletClient(getHedgehog()) - audiusSdk = sdk({ + audiusSdk = createSdkWithServices({ appName: 'audius-cmd', environment: 'development', services: { diff --git a/packages/common/src/api/tan-query/batchers/types.ts b/packages/common/src/api/tan-query/batchers/types.ts index 67f3403d84b..1aecbd1366d 100644 --- a/packages/common/src/api/tan-query/batchers/types.ts +++ b/packages/common/src/api/tan-query/batchers/types.ts @@ -1,11 +1,11 @@ -import type { AudiusSdk } from '@audius/sdk' +import type { AudiusSdkWithServices } from '@audius/sdk' import { QueryClient } from '@tanstack/react-query' import { AnyAction, Dispatch } from 'redux' import { ID } from '~/models/Identifiers' export type BatchContext = { - sdk: AudiusSdk + sdk: AudiusSdkWithServices currentUserId: ID | null | undefined queryClient: QueryClient dispatch: Dispatch diff --git a/packages/common/src/api/tan-query/collection/useCollection.ts b/packages/common/src/api/tan-query/collection/useCollection.ts index b178303256c..4d9fb342bbb 100644 --- a/packages/common/src/api/tan-query/collection/useCollection.ts +++ b/packages/common/src/api/tan-query/collection/useCollection.ts @@ -1,6 +1,6 @@ import { useMemo } from 'react' -import { AudiusSdk } from '@audius/sdk' +import type { AudiusSdkWithServices } from '@audius/sdk' import { useQuery, useQueryClient, QueryClient } from '@tanstack/react-query' import { useDispatch } from 'react-redux' import { AnyAction, Dispatch } from 'redux' @@ -26,7 +26,7 @@ export const getCollectionQueryFn = async ( collectionId: ID, currentUserId: number | null | undefined, queryClient: QueryClient, - sdk: AudiusSdk, + sdk: AudiusSdkWithServices, dispatch: Dispatch ) => { const batchGetCollections = getCollectionsBatcher({ diff --git a/packages/common/src/api/tan-query/jupiter/executors.ts b/packages/common/src/api/tan-query/jupiter/executors.ts index 620b7a36fb4..d93d51b7554 100644 --- a/packages/common/src/api/tan-query/jupiter/executors.ts +++ b/packages/common/src/api/tan-query/jupiter/executors.ts @@ -1,5 +1,5 @@ import { FixedDecimal } from '@audius/fixed-decimal' -import { AudiusSdk } from '@audius/sdk' +import type { AudiusSdkWithServices } from '@audius/sdk' import { SwapRequest } from '@jup-ag/api' import { createAssociatedTokenAccountIdempotentInstruction, @@ -72,7 +72,7 @@ async function executeMeteoraSwap( swapDirection: 'audioToCoin' | 'coinToAudio', inputAmountUi: number, dependencies: { - sdk: AudiusSdk + sdk: AudiusSdkWithServices userPublicKey: PublicKey keypair: Keypair ethAddress: string diff --git a/packages/common/src/api/tan-query/jupiter/types.ts b/packages/common/src/api/tan-query/jupiter/types.ts index 0c435f17610..670b843e002 100644 --- a/packages/common/src/api/tan-query/jupiter/types.ts +++ b/packages/common/src/api/tan-query/jupiter/types.ts @@ -1,4 +1,4 @@ -import type { AudiusSdk } from '@audius/sdk' +import type { AudiusSdkWithServices } from '@audius/sdk' import { PublicKey } from '@solana/web3.js' import type { Keypair } from '@solana/web3.js' import { useQueryClient } from '@tanstack/react-query' @@ -74,7 +74,7 @@ export interface UserBankManagedTokenInfo { } export type SwapDependencies = { - sdk: AudiusSdk + sdk: AudiusSdkWithServices keypair: Keypair userPublicKey: PublicKey feePayer: PublicKey diff --git a/packages/common/src/api/tan-query/jupiter/useCoinExchangeRate.ts b/packages/common/src/api/tan-query/jupiter/useCoinExchangeRate.ts index f7bf079cf67..52576f984d6 100644 --- a/packages/common/src/api/tan-query/jupiter/useCoinExchangeRate.ts +++ b/packages/common/src/api/tan-query/jupiter/useCoinExchangeRate.ts @@ -1,7 +1,7 @@ import { useMemo } from 'react' import { FixedDecimal } from '@audius/fixed-decimal' -import type { AudiusSdk } from '@audius/sdk' +import type { AudiusSdkWithServices } from '@audius/sdk' import { QuoteResponse, SwapMode } from '@jup-ag/api' import { QueryClient, useQuery, useQueryClient } from '@tanstack/react-query' @@ -116,7 +116,7 @@ export const getDirectQuote = async ( swapMode?: SwapMode }, queryClient: QueryClient, - sdk: AudiusSdk + sdk: AudiusSdkWithServices ): Promise => { const { hasPool: inputHasPool } = getCoinPoolState( params.inputMint, @@ -172,7 +172,7 @@ export const getIndirectQuoteViaAudio = async ( swapMode?: SwapMode }, queryClient: QueryClient, - sdk: AudiusSdk + sdk: AudiusSdkWithServices ): Promise => { const { hasPool: inputHasPool } = getCoinPoolState( params.inputMint, @@ -273,7 +273,7 @@ export const getQuoteViaMeteoraDBC = async ( amountUi: number swapMode?: SwapMode }, - sdk: AudiusSdk + sdk: AudiusSdkWithServices ): Promise => { const { inputMint, outputMint, inputDecimals, outputDecimals, amountUi } = params diff --git a/packages/common/src/api/tan-query/jupiter/utils.ts b/packages/common/src/api/tan-query/jupiter/utils.ts index b5f17c79552..c09637194df 100644 --- a/packages/common/src/api/tan-query/jupiter/utils.ts +++ b/packages/common/src/api/tan-query/jupiter/utils.ts @@ -1,5 +1,5 @@ import { USDC } from '@audius/fixed-decimal' -import type { AudiusSdk } from '@audius/sdk' +import type { AudiusSdkWithServices } from '@audius/sdk' import { SwapInstructionsResponse, SwapRequest } from '@jup-ag/api' import { createAssociatedTokenAccountIdempotentInstruction, @@ -121,7 +121,7 @@ export async function addTransferToUserBankInstructions({ ethAddress: string amountLamports: bigint sourceAta: PublicKey - sdk: AudiusSdk + sdk: AudiusSdkWithServices feePayer: PublicKey instructions: TransactionInstruction[] }): Promise { @@ -372,7 +372,7 @@ export const getJupiterSwapInstructions = async ( } export const buildAndSendTransaction = async ( - sdk: AudiusSdk, + sdk: AudiusSdkWithServices, keypair: Keypair, feePayer: PublicKey, instructions: TransactionInstruction[], @@ -421,7 +421,7 @@ export const invalidateSwapQueries = async ( } export const prepareOutputUserBank = async ( - sdk: AudiusSdk, + sdk: AudiusSdkWithServices, ethAddress: string, outputTokenConfig: UserBankManagedTokenInfo ): Promise => { diff --git a/packages/common/src/api/tan-query/tracks/useTrack.ts b/packages/common/src/api/tan-query/tracks/useTrack.ts index f1204ae6460..e5a36d180d8 100644 --- a/packages/common/src/api/tan-query/tracks/useTrack.ts +++ b/packages/common/src/api/tan-query/tracks/useTrack.ts @@ -1,6 +1,6 @@ import { useMemo } from 'react' -import { AudiusSdk } from '@audius/sdk' +import { AudiusSdkWithServices } from '@audius/sdk' import { QueryClient, useQuery, useQueryClient } from '@tanstack/react-query' import { useDispatch } from 'react-redux' import { AnyAction, Dispatch } from 'redux' @@ -23,7 +23,7 @@ export const getTrackQueryFn = async ( trackId: ID, currentUserId: ID | null | undefined, queryClient: QueryClient, - sdk: AudiusSdk, + sdk: AudiusSdkWithServices, dispatch: Dispatch ) => { const batchGetTracks = getTracksBatcher({ diff --git a/packages/common/src/api/tan-query/users/account/useUpdatePlaylistLibrary.ts b/packages/common/src/api/tan-query/users/account/useUpdatePlaylistLibrary.ts index 7a2afa57326..2124fda017d 100644 --- a/packages/common/src/api/tan-query/users/account/useUpdatePlaylistLibrary.ts +++ b/packages/common/src/api/tan-query/users/account/useUpdatePlaylistLibrary.ts @@ -1,4 +1,4 @@ -import { AudiusSdk } from '@audius/sdk' +import { AudiusSdkWithServices } from '@audius/sdk' import { useQueryClient, useMutation, QueryClient } from '@tanstack/react-query' import { useDispatch } from 'react-redux' import { Dispatch } from 'redux' @@ -34,7 +34,7 @@ export const useUpdatePlaylistLibrary = () => { // feature-tan-query TODO: migrate saga usages, then remove this export const updatePlaylistLibrary = async ( - audiusSdk: AudiusSdk, + audiusSdk: AudiusSdkWithServices, userId: ID | null | undefined, playlistLibrary: PlaylistLibrary, queryClient: QueryClient, diff --git a/packages/common/src/api/tan-query/users/useUpdateUser.ts b/packages/common/src/api/tan-query/users/useUpdateUser.ts index b66803867e9..b1236f66ffd 100644 --- a/packages/common/src/api/tan-query/users/useUpdateUser.ts +++ b/packages/common/src/api/tan-query/users/useUpdateUser.ts @@ -1,4 +1,4 @@ -import { AudiusSdk, OptionalId } from '@audius/sdk' +import { AudiusSdkWithServices, OptionalId } from '@audius/sdk' import { useMutation, useQueryClient } from '@tanstack/react-query' import { userMetadataToSdk } from '~/adapters/user' @@ -84,7 +84,7 @@ export const useUpdateUser = () => { } export async function updateUser( - sdk: AudiusSdk, + sdk: AudiusSdkWithServices, userId: number, metadata: Partial | { playlist_library: PlaylistLibrary }, coverArtFile?: File, diff --git a/packages/common/src/api/tan-query/users/useUser.ts b/packages/common/src/api/tan-query/users/useUser.ts index d9e27e9803e..7b4cf069fe9 100644 --- a/packages/common/src/api/tan-query/users/useUser.ts +++ b/packages/common/src/api/tan-query/users/useUser.ts @@ -1,6 +1,6 @@ import { useMemo } from 'react' -import { AudiusSdk } from '@audius/sdk' +import { AudiusSdkWithServices } from '@audius/sdk' import { QueryClient, useQuery, useQueryClient } from '@tanstack/react-query' import { useDispatch } from 'react-redux' import { AnyAction, Dispatch } from 'redux' @@ -32,7 +32,7 @@ export const getUserQueryFn = async ( userId: ID, currentUserId: ID | null | undefined, queryClient: QueryClient, - sdk: AudiusSdk, + sdk: AudiusSdkWithServices, dispatch: Dispatch ) => { const batchGetUsers = getUsersBatcher({ diff --git a/packages/common/src/api/tan-query/utils/QueryContext.ts b/packages/common/src/api/tan-query/utils/QueryContext.ts index 30cab2fa4f0..abafa33581b 100644 --- a/packages/common/src/api/tan-query/utils/QueryContext.ts +++ b/packages/common/src/api/tan-query/utils/QueryContext.ts @@ -1,6 +1,6 @@ import { createContext, useContext } from 'react' -import type { AudiusSdk } from '@audius/sdk' +import type { AudiusSdkWithServices } from '@audius/sdk' import type { Dispatch } from 'redux' import { getContext } from 'typed-redux-saga' @@ -21,7 +21,7 @@ import { } from '../../../models' export type QueryContextType = { - audiusSdk: () => Promise + audiusSdk: () => Promise audiusBackend: AudiusBackend authService: AuthService solanaWalletService: SolanaWalletService diff --git a/packages/common/src/context/appContext.ts b/packages/common/src/context/appContext.ts index 0c68c9407c1..e62f58237af 100644 --- a/packages/common/src/context/appContext.ts +++ b/packages/common/src/context/appContext.ts @@ -1,6 +1,6 @@ import { createContext, useContext } from 'react' -import type { AudiusSdk } from '@audius/sdk' +import type { AudiusSdkWithServices } from '@audius/sdk' import { AnalyticsEvent, AllTrackingEvents } from '~/models/Analytics' import { AudiusBackend } from '~/services/audius-backend' @@ -25,7 +25,7 @@ type AppContextType = { getHostUrl: () => string audiusBackend: AudiusBackend trackDownload: TrackDownload - audiusSdk?: AudiusSdk + audiusSdk?: AudiusSdkWithServices remoteConfig: RemoteConfigInstance localStorage: LocalStorage } diff --git a/packages/common/src/hooks/useGetDiscordOAuthLink.ts b/packages/common/src/hooks/useGetDiscordOAuthLink.ts index 68d1ad4ca44..4325e30e318 100644 --- a/packages/common/src/hooks/useGetDiscordOAuthLink.ts +++ b/packages/common/src/hooks/useGetDiscordOAuthLink.ts @@ -1,6 +1,6 @@ import { useCallback } from 'react' -import { AudiusSdk } from '@audius/sdk' +import { AudiusSdkWithServices } from '@audius/sdk' import { useQueryContext } from '~/api' import { Env } from '~/services/env' @@ -16,7 +16,7 @@ const getRandomSignableCharacter = () => { // The JWT will be sent thru the discord OAuth flow and then back to the discord server eventually // The purpose of this is so that the discord server can verify that the user is the one signing, // while also not exposing any details since the oauth flow requires data be passed via query params -const requestDiscordJWT = async (sdk: AudiusSdk, env: Env) => { +const requestDiscordJWT = async (sdk: AudiusSdkWithServices, env: Env) => { const data = getRandomSignableCharacter() const signature = await sdk.services.audiusWalletClient.signMessage({ message: data diff --git a/packages/common/src/services/audius-backend/AudiusBackend.ts b/packages/common/src/services/audius-backend/AudiusBackend.ts index 3c018951be4..f7c4ec7aac9 100644 --- a/packages/common/src/services/audius-backend/AudiusBackend.ts +++ b/packages/common/src/services/audius-backend/AudiusBackend.ts @@ -1,6 +1,10 @@ import { AUDIO, AudioWei, wAUDIO } from '@audius/fixed-decimal' import type { LocalStorage } from '@audius/hedgehog' -import { AudiusSdk, Id, HedgehogWalletNotFoundError } from '@audius/sdk' +import { + type AudiusSdkWithServices, + Id, + HedgehogWalletNotFoundError +} from '@audius/sdk' import { ASSOCIATED_TOKEN_PROGRAM_ID, createAssociatedTokenAccountIdempotentInstruction, @@ -159,7 +163,7 @@ export const audiusBackend = ({ }: { userId: ID trackId: ID - sdk: AudiusSdk + sdk: AudiusSdkWithServices }) { try { const { data, signature } = await signIdentityServiceRequest({ sdk }) @@ -189,7 +193,7 @@ export const audiusBackend = ({ ComputedUserProperties, 'updatedProfilePicture' | 'updatedCoverPhoto' > - sdk: AudiusSdk + sdk: AudiusSdkWithServices }) { let newMetadata = { ...metadata } try { @@ -217,7 +221,11 @@ export const audiusBackend = ({ return null } - async function clearNotificationBadges({ sdk }: { sdk: AudiusSdk }) { + async function clearNotificationBadges({ + sdk + }: { + sdk: AudiusSdkWithServices + }) { try { const { data, signature } = await signIdentityServiceRequest({ sdk }) return await fetch(`${identityServiceUrl}/notifications/clear_badges`, { @@ -233,7 +241,11 @@ export const audiusBackend = ({ } } - async function getEmailNotificationSettings({ sdk }: { sdk: AudiusSdk }) { + async function getEmailNotificationSettings({ + sdk + }: { + sdk: AudiusSdkWithServices + }) { try { const { data, signature } = await signIdentityServiceRequest({ sdk }) const res = await fetch(`${identityServiceUrl}/notifications/settings`, { @@ -255,7 +267,7 @@ export const audiusBackend = ({ emailFrequency, userId }: { - sdk: AudiusSdk + sdk: AudiusSdkWithServices emailFrequency: string userId: ID }) { @@ -283,7 +295,7 @@ export const audiusBackend = ({ sdk, settings }: { - sdk: AudiusSdk + sdk: AudiusSdkWithServices settings: Partial> }) { try { @@ -309,7 +321,7 @@ export const audiusBackend = ({ sdk, settings }: { - sdk: AudiusSdk + sdk: AudiusSdkWithServices settings: Partial> }) { try { @@ -328,7 +340,13 @@ export const audiusBackend = ({ } } - async function signData({ sdk, data }: { sdk: AudiusSdk; data: string }) { + async function signData({ + sdk, + data + }: { + sdk: AudiusSdkWithServices + data: string + }) { try { const signature = await sdk.services.audiusWalletClient.signMessage({ message: data @@ -344,12 +362,20 @@ export const audiusBackend = ({ } } - async function signGatedContentRequest({ sdk }: { sdk: AudiusSdk }) { + async function signGatedContentRequest({ + sdk + }: { + sdk: AudiusSdkWithServices + }) { const data = `Gated content user signature at ${Date.now()}` return await signData({ sdk, data }) } - async function signIdentityServiceRequest({ sdk }: { sdk: AudiusSdk }) { + async function signIdentityServiceRequest({ + sdk + }: { + sdk: AudiusSdkWithServices + }) { const unixTs = Math.round(new Date().getTime() / 1000) // current unix timestamp (sec) const data = `Click sign to authenticate with identity service: ${unixTs}` return await signData({ sdk, data }) @@ -359,7 +385,7 @@ export const audiusBackend = ({ sdk, input }: { - sdk: AudiusSdk + sdk: AudiusSdkWithServices input?: any }) { let data @@ -375,7 +401,7 @@ export const audiusBackend = ({ async function getBrowserPushNotificationSettings({ sdk }: { - sdk: AudiusSdk + sdk: AudiusSdkWithServices }) { try { const { data, signature } = await signIdentityServiceRequest({ sdk }) @@ -400,7 +426,7 @@ export const audiusBackend = ({ sdk, pushEndpoint }: { - sdk: AudiusSdk + sdk: AudiusSdkWithServices pushEndpoint: string }) { try { @@ -427,7 +453,7 @@ export const audiusBackend = ({ sdk, deviceToken }: { - sdk: AudiusSdk + sdk: AudiusSdkWithServices deviceToken: string }) { try { @@ -454,7 +480,7 @@ export const audiusBackend = ({ enabled = true, subscription }: { - sdk: AudiusSdk + sdk: AudiusSdkWithServices enabled: boolean subscription: PushSubscription }) { @@ -477,7 +503,7 @@ export const audiusBackend = ({ sdk, subscription }: { - sdk: AudiusSdk + sdk: AudiusSdkWithServices subscription: PushSubscription }) { const { data, signature } = await signIdentityServiceRequest({ sdk }) @@ -495,7 +521,11 @@ export const audiusBackend = ({ ).then((res) => res.json()) } - async function getPushNotificationSettings({ sdk }: { sdk: AudiusSdk }) { + async function getPushNotificationSettings({ + sdk + }: { + sdk: AudiusSdkWithServices + }) { try { const { data, signature } = await signIdentityServiceRequest({ sdk }) return await fetch(`${identityServiceUrl}/push_notifications/settings`, { @@ -517,7 +547,7 @@ export const audiusBackend = ({ deviceToken, deviceType }: { - sdk: AudiusSdk + sdk: AudiusSdkWithServices deviceToken: string deviceType: string }) { @@ -547,7 +577,7 @@ export const audiusBackend = ({ sdk, deviceToken }: { - sdk: AudiusSdk + sdk: AudiusSdkWithServices deviceToken: string }) { try { @@ -571,7 +601,11 @@ export const audiusBackend = ({ } } - async function updateUserLocationTimezone({ sdk }: { sdk: AudiusSdk }) { + async function updateUserLocationTimezone({ + sdk + }: { + sdk: AudiusSdkWithServices + }) { try { const { data, signature } = await signIdentityServiceRequest({ sdk }) const timezone = dayjs.tz.guess() @@ -594,7 +628,7 @@ export const audiusBackend = ({ sdk, name }: { - sdk: AudiusSdk + sdk: AudiusSdkWithServices name: string }) { try { @@ -617,7 +651,7 @@ export const audiusBackend = ({ sdk, hasSignedInNativeMobile }: { - sdk: AudiusSdk + sdk: AudiusSdkWithServices hasSignedInNativeMobile: boolean }) { try { @@ -641,7 +675,7 @@ export const audiusBackend = ({ sdk, token }: { - sdk: AudiusSdk + sdk: AudiusSdkWithServices token: string }) { try { @@ -672,7 +706,7 @@ export const audiusBackend = ({ sdk }: { ethAddress: string - sdk: AudiusSdk + sdk: AudiusSdkWithServices }): Promise { if (!ethAddress) return null @@ -699,7 +733,7 @@ export const audiusBackend = ({ sdk }: { ethAddress: string - sdk: AudiusSdk + sdk: AudiusSdkWithServices }): Promise { try { const userBank = await sdk.services.claimableTokensClient.deriveUserBank({ @@ -735,7 +769,7 @@ export const audiusBackend = ({ sdk }: { address: string - sdk: AudiusSdk + sdk: AudiusSdkWithServices }): Promise { try { const addressPubKey = new PublicKey(address) @@ -754,7 +788,10 @@ export const audiusBackend = ({ * @param bustCache * @returns balance or null if error */ - async function getAddressTotalStakedBalance(address: string, sdk: AudiusSdk) { + async function getAddressTotalStakedBalance( + address: string, + sdk: AudiusSdkWithServices + ) { if (!address) return null try { @@ -783,7 +820,7 @@ export const audiusBackend = ({ connection: Connection, address: string, mint: PublicKey, - sdk: AudiusSdk + sdk: AudiusSdkWithServices ) { if (!window.phantom) { throw new Error( @@ -847,7 +884,7 @@ export const audiusBackend = ({ mint }: { address: string - sdk: AudiusSdk + sdk: AudiusSdkWithServices mint: PublicKey }) { const connection = sdk.services.solanaClient.connection @@ -908,7 +945,7 @@ export const audiusBackend = ({ address: string amount: AudioWei ethAddress: string - sdk: AudiusSdk + sdk: AudiusSdkWithServices mint: PublicKey recipientEthAddress?: string // When provided, derives user-bank ATA for the recipient }) { @@ -951,7 +988,7 @@ export const audiusBackend = ({ ethAddress: string destination: PublicKey amount: AudioWei - sdk: AudiusSdk + sdk: AudiusSdkWithServices mint: MintName | PublicKey }) { console.info( @@ -1002,7 +1039,13 @@ export const audiusBackend = ({ return signature } - async function getSignature({ data, sdk }: { data: any; sdk: AudiusSdk }) { + async function getSignature({ + data, + sdk + }: { + data: any + sdk: AudiusSdkWithServices + }) { return signData({ data, sdk }) } @@ -1016,7 +1059,7 @@ export const audiusBackend = ({ sdk }: { address: string - sdk: AudiusSdk + sdk: AudiusSdkWithServices }) { try { const { amount } = await getAssociatedTokenAccountInfo({ @@ -1069,7 +1112,7 @@ export const audiusBackend = ({ mint = 'wAUDIO' }: { address: string - sdk: AudiusSdk + sdk: AudiusSdkWithServices mint?: MintName | PublicKey }) { const connection = sdk.services.solanaClient.connection diff --git a/packages/common/src/services/audius-backend/solana.ts b/packages/common/src/services/audius-backend/solana.ts index b9a0c12ff8b..6c674e6ea7d 100644 --- a/packages/common/src/services/audius-backend/solana.ts +++ b/packages/common/src/services/audius-backend/solana.ts @@ -1,4 +1,4 @@ -import { AudiusSdk } from '@audius/sdk' +import type { AudiusSdkWithServices } from '@audius/sdk' import { u8 } from '@solana/buffer-layout' import { Account, @@ -91,7 +91,7 @@ function isCreateUserBankIfNeededError( * userbank does not exist, returns null. */ export const getUserbankAccountInfo = async ( - sdk: AudiusSdk, + sdk: AudiusSdkWithServices, { ethAddress: sourceEthAddress, mint = DEFAULT_MINT }: UserBankConfig, commitment?: Commitment ): Promise => { @@ -119,7 +119,7 @@ export const getUserbankAccountInfo = async ( * Defaults to AUDIO mint and the current user's wallet. */ export const createUserBankIfNeeded = async ( - sdk: AudiusSdk, + sdk: AudiusSdkWithServices, { recordAnalytics, mint = DEFAULT_MINT, @@ -173,7 +173,7 @@ export const createUserBankIfNeeded = async ( * @throws an error if the balance doesn't change within the timeout. */ export const pollForTokenBalanceChange = async ( - sdk: AudiusSdk, + sdk: AudiusSdkWithServices, { tokenAccount, initialBalance, @@ -254,7 +254,7 @@ export const findAssociatedTokenAddress = async ( * by the current user's Solana root wallet and the provided fee payer (likely via relay). */ export const decorateCoinflowWithdrawalTransaction = async ( - sdk: AudiusSdk, + sdk: AudiusSdkWithServices, audiusBackendInstance: AudiusBackend, { transaction, @@ -361,7 +361,7 @@ export const decorateCoinflowWithdrawalTransaction = async ( * this transfer and handles it appropriately. */ type RecoverUsdcFromRootWalletParams = { - sdk: AudiusSdk + sdk: AudiusSdkWithServices /** The root wallet key pair */ sender: Keypair /** The ethereum wallet address of the user, used to derive user bank */ @@ -431,7 +431,7 @@ export const recoverUsdcFromRootWallet = async ({ * destination token account doesn't exist this might fail. */ type TransferFromUserBankParams = { - sdk: AudiusSdk + sdk: AudiusSdkWithServices /** The token mint address */ mint: PublicKey connection: Connection diff --git a/packages/common/src/services/wallet-client/WalletClient.ts b/packages/common/src/services/wallet-client/WalletClient.ts index db586532da7..e2e91896e70 100644 --- a/packages/common/src/services/wallet-client/WalletClient.ts +++ b/packages/common/src/services/wallet-client/WalletClient.ts @@ -1,5 +1,5 @@ import { AUDIO, wAUDIO, AudioWei } from '@audius/fixed-decimal' -import { AudiusSdk, Id } from '@audius/sdk' +import { type AudiusSdkWithServices, Id } from '@audius/sdk' import { PublicKey } from '@solana/web3.js' import { userWalletsFromSDK } from '~/adapters' @@ -18,13 +18,13 @@ export const MIN_TRANSFERRABLE_WEI = AUDIO('0.001').value type WalletClientConfig = { audiusBackendInstance: AudiusBackend - audiusSdk: () => Promise + audiusSdk: () => Promise env: Env } export class WalletClient { audiusBackendInstance: AudiusBackend - audiusSdk: () => Promise + audiusSdk: () => Promise env: Env constructor(config: WalletClientConfig) { diff --git a/packages/common/src/store/pages/chat/middleware.ts b/packages/common/src/store/pages/chat/middleware.ts index 8279f198d36..24679d013fa 100644 --- a/packages/common/src/store/pages/chat/middleware.ts +++ b/packages/common/src/store/pages/chat/middleware.ts @@ -1,4 +1,4 @@ -import { type AudiusSdk, ChatEvents, Id } from '@audius/sdk' +import { type AudiusSdkWithServices, ChatEvents, Id } from '@audius/sdk' import { QueryClient } from '@tanstack/react-query' import { Middleware } from 'redux' @@ -13,7 +13,10 @@ const { connect, disconnect, addMessage, setMessageReactionSucceeded } = chatActions export const chatMiddleware = - (audiusSdk: () => Promise, queryClient: QueryClient): Middleware => + ( + audiusSdk: () => Promise, + queryClient: QueryClient + ): Middleware => (store) => { let messageListener: ChatEvents['message'] | null = null let reactionListener: ChatEvents['reaction'] | null = null diff --git a/packages/common/src/store/purchase-content/sagas.ts b/packages/common/src/store/purchase-content/sagas.ts index 30aace203a4..4799582bf03 100644 --- a/packages/common/src/store/purchase-content/sagas.ts +++ b/packages/common/src/store/purchase-content/sagas.ts @@ -1,5 +1,5 @@ import { USDC, UsdcWei } from '@audius/fixed-decimal' -import { Id, OptionalId, type AudiusSdk } from '@audius/sdk' +import { Id, OptionalId, type AudiusSdkWithServices } from '@audius/sdk' import type { createJupiterApiClient, QuoteResponse } from '@jup-ag/api' import { getAccount, getAssociatedTokenAddressSync } from '@solana/spl-token' import { @@ -320,7 +320,7 @@ type GetPurchaseMetadataArgs = { * @see {@link https://github.com/AudiusProject/apps/blob/75169cfb00894f5462a612b423129895f58a53fe/packages/libs/src/sdk/api/tracks/TracksApi.ts#L386 purchase} */ function* purchaseTrackWithCoinflow(args: { - sdk: AudiusSdk + sdk: AudiusSdkWithServices trackId: ID userId: ID price: number @@ -428,7 +428,7 @@ function* purchaseTrackWithCoinflow(args: { * @see {@link https://github.com/AudiusProject/apps/blob/75169cfb00894f5462a612b423129895f58a53fe/packages/libs/src/sdk/api/albums/AlbumsApi.ts#L386 purchase} */ function* purchaseAlbumWithCoinflow(args: { - sdk: AudiusSdk + sdk: AudiusSdkWithServices albumId: ID userId: ID price: number diff --git a/packages/common/src/store/sdkUtils.ts b/packages/common/src/store/sdkUtils.ts index 929efd5e733..3a096ccf5a9 100644 --- a/packages/common/src/store/sdkUtils.ts +++ b/packages/common/src/store/sdkUtils.ts @@ -1,9 +1,9 @@ -import { AudiusSdk } from '@audius/sdk' +import type { AudiusSdkWithServices } from '@audius/sdk' import { call, getContext } from 'typed-redux-saga' // These are defined explicitly here to avoid including the entire `storeContext` module // as that creates some nasty circular dependencies. -type AudiusSDKContext = () => Promise +type AudiusSDKContext = () => Promise /** Helper generator that returns a fully-awaited AudiusSDK instance */ export function* getSDK() { diff --git a/packages/common/src/store/storeContext.ts b/packages/common/src/store/storeContext.ts index 926b84ee08a..36dff0e096c 100644 --- a/packages/common/src/store/storeContext.ts +++ b/packages/common/src/store/storeContext.ts @@ -1,4 +1,4 @@ -import type { AudiusSdk } from '@audius/sdk' +import type { AudiusSdkWithServices } from '@audius/sdk' import { VersionedTransaction } from '@solana/web3.js' import { QueryClient } from '@tanstack/react-query' import { Location } from 'history' @@ -77,7 +77,7 @@ export type CommonStoreContext = { instagramAppId?: string instagramRedirectUrl?: string share: (url: string, message?: string) => Promise | void - audiusSdk: () => Promise + audiusSdk: () => Promise authService: AuthService identityService: IdentityService solanaWalletService: SolanaWalletService diff --git a/packages/discovery-provider/plugins/pedalboard/apps/archiver/src/sdk.ts b/packages/discovery-provider/plugins/pedalboard/apps/archiver/src/sdk.ts index 405ce371299..bfdc8e0414d 100644 --- a/packages/discovery-provider/plugins/pedalboard/apps/archiver/src/sdk.ts +++ b/packages/discovery-provider/plugins/pedalboard/apps/archiver/src/sdk.ts @@ -1,4 +1,4 @@ -import { AudiusSdk, sdk } from '@audius/sdk' +import { createSdkWithServices, type AudiusSdkWithServices } from '@audius/sdk' import { readConfig, Environment } from './config' const environmentToSdkEnvironment: Record< @@ -9,12 +9,12 @@ const environmentToSdkEnvironment: Record< prod: 'production' } -let audiusSdk: AudiusSdk | undefined = undefined +let audiusSdk: AudiusSdkWithServices | undefined = undefined export const getAudiusSdk = () => { if (audiusSdk === undefined) { const config = readConfig() - audiusSdk = sdk({ + audiusSdk = createSdkWithServices({ appName: 'audius-client', environment: environmentToSdkEnvironment[config.environment] }) diff --git a/packages/discovery-provider/plugins/pedalboard/apps/relay/src/coreRelay.ts b/packages/discovery-provider/plugins/pedalboard/apps/relay/src/coreRelay.ts index 6aaae1ee9ee..3b17acfdfbc 100644 --- a/packages/discovery-provider/plugins/pedalboard/apps/relay/src/coreRelay.ts +++ b/packages/discovery-provider/plugins/pedalboard/apps/relay/src/coreRelay.ts @@ -114,7 +114,7 @@ export const coreRelay = async ( metadata, subjectSig, nonce: nonceBytes - } = audiusSdk.services.entityManager.decodeManageEntity( + } = audiusSdk.services.entityManager!.decodeManageEntity( encodedABI as `0x${string}` ) diff --git a/packages/discovery-provider/plugins/pedalboard/apps/relay/src/index.ts b/packages/discovery-provider/plugins/pedalboard/apps/relay/src/index.ts index f241d829ee2..014a6535130 100644 --- a/packages/discovery-provider/plugins/pedalboard/apps/relay/src/index.ts +++ b/packages/discovery-provider/plugins/pedalboard/apps/relay/src/index.ts @@ -5,14 +5,18 @@ import { logger } from './logger' import { initializeDiscoveryDb } from '@pedalboard/basekit' import { connectWeb3 } from './web3' import { app } from './server' -import { AudiusSdk, sdk } from '@audius/sdk' +import { + AudiusSdk, + createSdkWithServices, + type AudiusSdkWithServices +} from '@audius/sdk' export type SharedData = { config: Config web3: ethers.providers.JsonRpcProvider sdk: AudiusSdk wallets: WalletManager - audiusSdk: AudiusSdk + audiusSdk: AudiusSdkWithServices } export const config = readConfig() @@ -27,15 +31,12 @@ export const discoveryDb = initializeDiscoveryDb( export let web3: providers.JsonRpcProvider export let wallets: WalletManager -export let audiusSdk: AudiusSdk +export let audiusSdk: AudiusSdkWithServices const main = async () => { - audiusSdk = sdk({ + audiusSdk = createSdkWithServices({ appName: 'relay', - environment: - config.environment === 'dev' - ? 'development' - : 'production' + environment: config.environment === 'dev' ? 'development' : 'production' }) try { // async config diff --git a/packages/discovery-provider/plugins/pedalboard/apps/relay/src/middleware/rateLimiter.ts b/packages/discovery-provider/plugins/pedalboard/apps/relay/src/middleware/rateLimiter.ts index 193a5967a11..24c210f65bd 100644 --- a/packages/discovery-provider/plugins/pedalboard/apps/relay/src/middleware/rateLimiter.ts +++ b/packages/discovery-provider/plugins/pedalboard/apps/relay/src/middleware/rateLimiter.ts @@ -92,7 +92,7 @@ export const rateLimiterMiddleware = async ( } export const getEntityManagerActionKey = (encodedABI: string): string => { - const decodedABI = audiusSdk.services.entityManager.decodeManageEntity( + const decodedABI = audiusSdk.services.entityManager!.decodeManageEntity( encodedABI as `0x${string}` ) const { action, entityType } = decodedABI diff --git a/packages/discovery-provider/plugins/pedalboard/apps/relay/src/middleware/validator.ts b/packages/discovery-provider/plugins/pedalboard/apps/relay/src/middleware/validator.ts index 9a114455813..898ec818b4d 100644 --- a/packages/discovery-provider/plugins/pedalboard/apps/relay/src/middleware/validator.ts +++ b/packages/discovery-provider/plugins/pedalboard/apps/relay/src/middleware/validator.ts @@ -15,7 +15,7 @@ import { getEntityManagerActionKey } from './rateLimiter' const MAX_ACDC_GAS_LIMIT = 10485760 const validateSender = async (encodedABI: string, senderAddress: string) => { - const recoveredAddress = await audiusSdk.services.entityManager.recoverSigner( + const recoveredAddress = await audiusSdk.services.entityManager!.recoverSigner( encodedABI as `0x${string}` ) return recoveredAddress.toLowerCase() === senderAddress.toLowerCase() @@ -210,7 +210,7 @@ export const retrieveUser = async ( // if entitymanager transaction, recover signer if (contractRegistryKey === 'EntityManager') { const recoveredAddress = - await audiusSdk.services.entityManager.recoverSigner( + await audiusSdk.services.entityManager!.recoverSigner( encodedABI as `0x${string}` ) @@ -247,7 +247,7 @@ export const retrieveDeveloperApp = async (params: { contractAddress: string }): Promise => { const { encodedABI } = params - const recoveredAddress = await audiusSdk.services.entityManager.recoverSigner( + const recoveredAddress = await audiusSdk.services.entityManager!.recoverSigner( encodedABI as `0x${string}` ) return await discoveryDb(Table.DeveloperApps) diff --git a/packages/discovery-provider/plugins/pedalboard/apps/relay/src/utils.ts b/packages/discovery-provider/plugins/pedalboard/apps/relay/src/utils.ts index 3c04970aab5..f43f2f0b2a2 100644 --- a/packages/discovery-provider/plugins/pedalboard/apps/relay/src/utils.ts +++ b/packages/discovery-provider/plugins/pedalboard/apps/relay/src/utils.ts @@ -1,7 +1,7 @@ import { audiusSdk } from '.' export const isUserCreate = (encodedABI: string): boolean => { - const decodedAbi = audiusSdk.services.entityManager.decodeManageEntity( + const decodedAbi = audiusSdk.services.entityManager!.decodeManageEntity( encodedABI as `0x${string}` ) return decodedAbi.action === 'Create' && decodedAbi.entityType === 'User' @@ -11,7 +11,7 @@ export const isUserDeactivate = ( isDeactivated: boolean, encodedABI: string ): boolean => { - const decodedAbi = audiusSdk.services.entityManager.decodeManageEntity( + const decodedAbi = audiusSdk.services.entityManager!.decodeManageEntity( encodedABI as `0x${string}` ) return ( @@ -23,14 +23,14 @@ export const isUserDeactivate = ( } export const isTrackDownload = (encodedABI: string) => { - const decodedAbi = audiusSdk.services.entityManager.decodeManageEntity( + const decodedAbi = audiusSdk.services.entityManager!.decodeManageEntity( encodedABI as `0x${string}` ) return decodedAbi.action === 'Download' && decodedAbi.entityType === 'Track' } export const isViewNotification = (encodedABI: string): boolean => { - const decodedAbi = audiusSdk.services.entityManager.decodeManageEntity( + const decodedAbi = audiusSdk.services.entityManager!.decodeManageEntity( encodedABI as `0x${string}` ) return ( @@ -39,7 +39,7 @@ export const isViewNotification = (encodedABI: string): boolean => { } export const isViewPlaylistNotification = (encodedABI: string): boolean => { - const decodedAbi = audiusSdk.services.entityManager.decodeManageEntity( + const decodedAbi = audiusSdk.services.entityManager!.decodeManageEntity( encodedABI as `0x${string}` ) return ( diff --git a/packages/discovery-provider/plugins/pedalboard/apps/relay/src/validate.ts b/packages/discovery-provider/plugins/pedalboard/apps/relay/src/validate.ts index 99251488c79..05992aaf464 100644 --- a/packages/discovery-provider/plugins/pedalboard/apps/relay/src/validate.ts +++ b/packages/discovery-provider/plugins/pedalboard/apps/relay/src/validate.ts @@ -2,7 +2,7 @@ import { audiusSdk } from '.' /// async in case we need to make a db call export const validateTransactionData = async (encodedABI: string) => { - const decoded = audiusSdk.services.entityManager.decodeManageEntity( + const decoded = audiusSdk.services.entityManager!.decodeManageEntity( encodedABI as `0x${string}` ) // TODO: validate decoded tx with zod diff --git a/packages/discovery-provider/plugins/pedalboard/apps/trending-challenge-rewards/src/sdk.ts b/packages/discovery-provider/plugins/pedalboard/apps/trending-challenge-rewards/src/sdk.ts index 4ce7fe289e1..96c68268e1c 100644 --- a/packages/discovery-provider/plugins/pedalboard/apps/trending-challenge-rewards/src/sdk.ts +++ b/packages/discovery-provider/plugins/pedalboard/apps/trending-challenge-rewards/src/sdk.ts @@ -4,7 +4,7 @@ import { SolanaRelayWalletAdapter, SolanaClient, SolanaRelay, - sdk + createSdkWithServices } from '@audius/sdk' const makeAAOSelector = () => @@ -62,7 +62,7 @@ export const audiusSdk = ({ const solanaClient = solanaRpcEndpoint ? makeSolanaClient(solanaRelay, solanaRpcEndpoint) : undefined - return sdk({ + return createSdkWithServices({ appName: 'trending-challenge-rewards', apiKey, apiSecret, diff --git a/packages/mobile/src/services/sdk/audius-sdk.ts b/packages/mobile/src/services/sdk/audius-sdk.ts index c33e8df0934..707a13ad216 100644 --- a/packages/mobile/src/services/sdk/audius-sdk.ts +++ b/packages/mobile/src/services/sdk/audius-sdk.ts @@ -1,7 +1,12 @@ import { EventEmitter } from 'events' -import type { AudiusSdk } from '@audius/sdk' -import { Configuration, SolanaRelay, sdk, ArchiverService } from '@audius/sdk' +import { + Configuration, + SolanaRelay, + createSdkWithServices, + type AudiusSdkWithServices, + ArchiverService +} from '@audius/sdk' import { env } from 'app/services/env' @@ -10,7 +15,7 @@ import { getAudiusWalletClient } from './auth' let inProgress = false const SDK_LOADED_EVENT_NAME = 'AUDIUS_SDK_LOADED' const sdkEventEmitter = new EventEmitter() -let sdkInstance: AudiusSdk +let sdkInstance: AudiusSdkWithServices const initSdk = async () => { inProgress = true @@ -53,7 +58,7 @@ const initSdk = async () => { // Overrides some DN configuration from optimizely const audiusWalletClient = await getAudiusWalletClient() - const audiusSdk = sdk({ + const audiusSdk = createSdkWithServices({ appName: env.APP_NAME, apiKey: env.API_KEY, environment: env.ENVIRONMENT, diff --git a/packages/sdk/src/sdk/api/uploads/UploadsApi.ts b/packages/sdk/src/sdk/api/uploads/UploadsApi.ts index 85652f029ee..fd659adef07 100644 --- a/packages/sdk/src/sdk/api/uploads/UploadsApi.ts +++ b/packages/sdk/src/sdk/api/uploads/UploadsApi.ts @@ -7,7 +7,7 @@ export class UploadsApi { private readonly storage constructor(services: UploadsApiServicesConfig) { - this.storage = services.storageService + this.storage = services.storage } /** diff --git a/packages/sdk/src/sdk/api/uploads/types.ts b/packages/sdk/src/sdk/api/uploads/types.ts index 74ce0a4f3f2..fd772698c6d 100644 --- a/packages/sdk/src/sdk/api/uploads/types.ts +++ b/packages/sdk/src/sdk/api/uploads/types.ts @@ -1,5 +1,5 @@ import type { StorageService } from '../../services' export type UploadsApiServicesConfig = { - storageService: StorageService + storage: StorageService } diff --git a/packages/sdk/src/sdk/createSdkWithoutServices.ts b/packages/sdk/src/sdk/createSdk.ts similarity index 92% rename from packages/sdk/src/sdk/createSdkWithoutServices.ts rename to packages/sdk/src/sdk/createSdk.ts index c7080fb5515..f6a6d7a971b 100644 --- a/packages/sdk/src/sdk/createSdkWithoutServices.ts +++ b/packages/sdk/src/sdk/createSdk.ts @@ -1,5 +1,6 @@ import fetch from 'cross-fetch' +import { ResolveApi } from './api/ResolveApi' import { ChallengesApi, CoinsApi, @@ -12,7 +13,6 @@ import { NotificationsApi, PlaylistsApi, PrizesApi, - ResolveApi, RewardsApi, SearchApi, TipsApi, @@ -32,9 +32,10 @@ import { import { OAuth } from './oauth' import { OAuthTokenStore } from './oauth/tokenStore' import { Logger, Storage, StorageNodeSelector } from './services' -import { type SdkConfig } from './types' +import { SdkConfigSchema, type SdkConfig } from './types' -export const createSdkWithoutServices = (config: SdkConfig) => { +export const createSdk = (config: SdkConfig) => { + SdkConfigSchema.parse(config) const { services, environment } = config const appName = 'appName' in config ? config.appName : undefined @@ -65,7 +66,8 @@ export const createSdkWithoutServices = (config: SdkConfig) => { ? new OAuth({ apiKey, tokenStore, - basePath + basePath, + logger }) : undefined @@ -116,6 +118,7 @@ export const createSdkWithoutServices = (config: SdkConfig) => { // Initialize API clients const usersApi = new UsersApi(apiConfig) + const resolveApi = new ResolveApi(apiConfig) return { oauth, @@ -125,7 +128,7 @@ export const createSdkWithoutServices = (config: SdkConfig) => { // albums playlists: new PlaylistsApi(apiConfig), tips: new TipsApi(apiConfig), - resolve: new ResolveApi(apiConfig), + resolve: resolveApi.resolve.bind(resolveApi), // chats // grants developerApps: new DeveloperAppsApi(apiConfig), @@ -142,7 +145,7 @@ export const createSdkWithoutServices = (config: SdkConfig) => { challenges: new ChallengesApi(apiConfig), prizes: new PrizesApi(apiConfig), uploads: new UploadsApi({ - storageService: + storage: services?.storage ?? new Storage({ storageNodeSelector: diff --git a/packages/sdk/src/sdk/createSdkWithServices.ts b/packages/sdk/src/sdk/createSdkWithServices.ts index 0d60722546b..7752a298558 100644 --- a/packages/sdk/src/sdk/createSdkWithServices.ts +++ b/packages/sdk/src/sdk/createSdkWithServices.ts @@ -24,6 +24,7 @@ import { GrantsApi } from './api/grants/GrantsApi' import { NotificationsApi } from './api/notifications/NotificationsApi' import { PlaylistsApi } from './api/playlists/PlaylistsApi' import { TracksApi } from './api/tracks/TracksApi' +import { UploadsApi } from './api/uploads/UploadsApi' import { UsersApi } from './api/users/UsersApi' import { developmentConfig } from './config/development' import { productionConfig } from './config/production' @@ -89,13 +90,23 @@ import { StorageNodeSelector, getDefaultStorageNodeSelectorConfig } from './services/StorageNodeSelector' -import { SdkConfig, ServicesContainer } from './types' +import { SdkConfig, SdkConfigSchema, ServicesContainer } from './types' import fetch from './utils/fetch' const ensureHex = (str: string): Hex => str.startsWith('0x') ? (str as Hex) : `0x${str}` +/** + * Creates an instance of the SDK that predates the delegated writes support of + * the API server. Handles all the writes locally and relays them. Supports + * wallet actions like purchases, tipping, and DMs/chats but requires passing + * in an AudiusWalletClient. + * + * Not recommended for third party use. + */ export const createSdkWithServices = (config: SdkConfig) => { + SdkConfigSchema.parse(config) + const isBrowser: boolean = typeof window !== 'undefined' && typeof window.document !== 'undefined' @@ -460,7 +471,8 @@ const initializeApis = ({ ? new OAuth({ apiKey, tokenStore, - basePath + basePath, + logger: services.logger }) : undefined @@ -521,6 +533,7 @@ const initializeApis = ({ const events = new EventsApi(apiClientConfig, services) const explore = new ExploreApi(apiClientConfig) const search = new SearchApi(apiClientConfig) + const uploads = new UploadsApi(services) return { oauth, @@ -545,6 +558,9 @@ const initializeApis = ({ coins, wallets, challenges, - prizes + prizes, + uploads } } + +export type AudiusSdkWithServices = ReturnType diff --git a/packages/sdk/src/sdk/index.ts b/packages/sdk/src/sdk/index.ts index a9918f3f016..3f925356ed6 100644 --- a/packages/sdk/src/sdk/index.ts +++ b/packages/sdk/src/sdk/index.ts @@ -1,5 +1,10 @@ /* eslint-disable import/export */ export { sdk } from './sdk' +export { createSdk } from './createSdk' +export { + createSdkWithServices, + type AudiusSdkWithServices +} from './createSdkWithServices' export type { AudiusSdk } from './sdk' export * from './api/generated/default' export { TracksApi } from './api/tracks/TracksApi' diff --git a/packages/sdk/src/sdk/scripts/manageRewardsLookupTable.ts b/packages/sdk/src/sdk/scripts/manageRewardsLookupTable.ts index f2ff2ac52a2..871e118962d 100644 --- a/packages/sdk/src/sdk/scripts/manageRewardsLookupTable.ts +++ b/packages/sdk/src/sdk/scripts/manageRewardsLookupTable.ts @@ -20,9 +20,9 @@ import untildify from 'untildify' import { developmentConfig } from '../config/development' import { productionConfig } from '../config/production' import type { SdkServicesConfig } from '../config/types' -import { sdk as audiusSdk } from '../sdk' import { Logger } from '../services' import type { SdkConfig } from '../types' +import { createSdkWithServices } from '../createSdkWithServices' /** * Derives the sender addresses for Validators and Anti Abuse Oracles @@ -158,7 +158,7 @@ const createLookupTable = async ({ ) ) ) - const sdk = audiusSdk({ + const sdk = createSdkWithServices({ appName: 'generate-rewards-lookup-table', environment, services: { @@ -276,7 +276,7 @@ const updateLookupTable = async ({ ) ) ) - const sdk = audiusSdk({ + const sdk = createSdkWithServices({ appName: 'generate-rewards-lookup-table', environment, services: { diff --git a/packages/sdk/src/sdk/scripts/verifyUser.ts b/packages/sdk/src/sdk/scripts/verifyUser.ts index 91dffb755d8..ef35b79aaa0 100644 --- a/packages/sdk/src/sdk/scripts/verifyUser.ts +++ b/packages/sdk/src/sdk/scripts/verifyUser.ts @@ -1,6 +1,6 @@ import { program } from 'commander' -import { sdk as audiusSdk } from '../sdk' +import { createSdkWithServices } from '../createSdkWithServices' import { EntityManagerAction, EntityType } from '../services' import { HashId } from '../types/HashId' @@ -37,7 +37,7 @@ program process.exit(1) } - const sdk = audiusSdk({ + const sdk = createSdkWithServices({ appName: 'verify-user', apiSecret: args.privateKey, environment: args.environment diff --git a/packages/sdk/src/sdk/sdk.ts b/packages/sdk/src/sdk/sdk.ts index 3248d758450..78976df3231 100644 --- a/packages/sdk/src/sdk/sdk.ts +++ b/packages/sdk/src/sdk/sdk.ts @@ -1,67 +1,8 @@ -import { createSdkWithServices } from './createSdkWithServices' -import { createSdkWithoutServices } from './createSdkWithoutServices' -import { - SdkConfig, - SdkConfigSchema, - type SdkWithApiKeyOnlyConfig, - type SdkWithApiSecretConfig, - type SdkWithBearerTokenConfig, - type SdkWithAppNameOnlyConfig, - DevAppSchemaWithApiSecret, - DevAppSchemaWithApiKeyOnly, - DevAppSchemaWithAppNameOnly, - DevAppSchemaWithBearerToken -} from './types' - -const createSdkWithBearerToken = (config: SdkWithBearerTokenConfig) => { - DevAppSchemaWithBearerToken.parse(config) - return createSdkWithoutServices(config) -} - -const createSdkWithApiName = (config: SdkWithAppNameOnlyConfig) => { - DevAppSchemaWithAppNameOnly.parse(config) - return createSdkWithServices(config) -} - -const createSdkWithApiKey = (config: SdkWithApiKeyOnlyConfig) => { - DevAppSchemaWithApiKeyOnly.parse(config) - return createSdkWithServices(config) -} - -const createSdkWithApiSecret = (config: SdkWithApiSecretConfig) => { - DevAppSchemaWithApiSecret.parse(config) - return createSdkWithServices(config) -} +import { createSdk } from './createSdk' /** * The Audius SDK */ -export function sdk( - config: SdkWithBearerTokenConfig -): ReturnType -export function sdk( - config: SdkWithApiSecretConfig -): ReturnType -export function sdk( - config: SdkWithApiKeyOnlyConfig -): ReturnType -export function sdk( - config: SdkWithAppNameOnlyConfig -): ReturnType -export function sdk(config: SdkConfig) { - SdkConfigSchema.parse(config) - - if ('bearerToken' in config) { - return createSdkWithBearerToken(config) - } - if ('apiSecret' in config) { - return createSdkWithApiSecret(config) - } - if ('apiKey' in config) { - return createSdkWithApiKey(config) - } - - return createSdkWithApiName(config) -} +export const sdk = createSdk export type AudiusSdk = ReturnType diff --git a/packages/sdk/src/sdk/types.ts b/packages/sdk/src/sdk/types.ts index db6235253be..a726ece1424 100644 --- a/packages/sdk/src/sdk/types.ts +++ b/packages/sdk/src/sdk/types.ts @@ -170,7 +170,7 @@ export type ServicesContainer = { /** * SDK configuration schema that requires api key only (for read-only access with higher rate limits) */ -export const DevAppSchemaWithApiKeyOnly = z.object({ +const ConfigWithApiKeySchema = z.object({ /** * Your app name */ @@ -193,7 +193,7 @@ export const DevAppSchemaWithApiKeyOnly = z.object({ /** * SDK configuration schema that requires API secret (read, write using Entity Manager) */ -export const DevAppSchemaWithApiSecret = z.object({ +const ConfigWithApiSecretSchema = z.object({ /** * Your app name */ @@ -220,7 +220,7 @@ export const DevAppSchemaWithApiSecret = z.object({ /** * SDK configuration schema that requires bearer token (read, write using API) */ -export const DevAppSchemaWithBearerToken = z.object({ +const ConfigWithBearerTokenSchema = z.object({ /** * Your app name */ @@ -247,7 +247,7 @@ export const DevAppSchemaWithBearerToken = z.object({ /** * SDK configuration schema that requires app name only (for read-only access) */ -export const DevAppSchemaWithAppNameOnly = z.object({ +const ConfigWithAppNameSchema = z.object({ /** * Your app name */ @@ -264,19 +264,13 @@ export const DevAppSchemaWithAppNameOnly = z.object({ }) export const SdkConfigSchema = z.union([ - DevAppSchemaWithAppNameOnly, - DevAppSchemaWithApiKeyOnly, - DevAppSchemaWithApiSecret, - DevAppSchemaWithBearerToken + ConfigWithApiKeySchema, + ConfigWithBearerTokenSchema, + ConfigWithAppNameSchema, + ConfigWithApiSecretSchema ]) -export type SdkWithBearerTokenConfig = z.input< - typeof DevAppSchemaWithBearerToken -> -export type SdkWithApiSecretConfig = z.input -export type SdkWithApiKeyOnlyConfig = z.input -export type SdkWithAppNameOnlyConfig = z.input< - typeof DevAppSchemaWithAppNameOnly -> - +/** + * Config for SDK initialization. Requires at least an app name or API key for read-only access, and API secret or bearer token for write access. + */ export type SdkConfig = z.infer diff --git a/packages/web/src/services/audius-sdk/audiusSdk.ts b/packages/web/src/services/audius-sdk/audiusSdk.ts index 1683212955c..7cdc53007a0 100644 --- a/packages/web/src/services/audius-sdk/audiusSdk.ts +++ b/packages/web/src/services/audius-sdk/audiusSdk.ts @@ -1,6 +1,6 @@ import { - AudiusSdk, - sdk, + AudiusSdkWithServices, + createSdkWithServices, Configuration, SolanaRelay, ArchiverService @@ -15,7 +15,7 @@ import { getAudiusWalletClient } from './auth' declare global { interface Window { - audiusSdk: AudiusSdk + audiusSdk: AudiusSdkWithServices } } @@ -89,7 +89,7 @@ export const initSdk = async () => { } }) }) - const audiusSdk = sdk({ + const audiusSdk = createSdkWithServices({ appName: env.APP_NAME, apiKey: env.API_KEY, environment: env.ENVIRONMENT, diff --git a/packages/web/src/test/mocks/audiusSdk.ts b/packages/web/src/test/mocks/audiusSdk.ts index 16f462b0be3..9b5b2159342 100644 --- a/packages/web/src/test/mocks/audiusSdk.ts +++ b/packages/web/src/test/mocks/audiusSdk.ts @@ -3,12 +3,12 @@ import { ClaimableTokensClient, PaymentRouterClient, RewardManagerClient, - sdk, + createSdkWithServices, StorageNodeSelectorService } from '@audius/sdk' export const audiusSdk = () => { - return sdk({ + return createSdkWithServices({ appName: 'test', environment: 'development', services: {