diff --git a/packages/common/src/adapters/activity.ts b/packages/common/src/adapters/activity.ts index f39a5930dac..31e7641c556 100644 --- a/packages/common/src/adapters/activity.ts +++ b/packages/common/src/adapters/activity.ts @@ -3,6 +3,36 @@ import { full } from '@audius/sdk' import { userCollectionMetadataFromSDK } from './collection' import { userTrackMetadataFromSDK } from './track' +export const activityFromSDK = (input: full.ActivityFull) => { + const { timestamp, itemType: item_type, item } = input + if (item_type === full.ActivityFullItemTypeEnum.Track) { + return { + timestamp, + item_type, + item: userTrackMetadataFromSDK(item as full.TrackFull) + } + } else if (item_type === full.ActivityFullItemTypeEnum.Playlist) { + return { + timestamp, + item_type, + item: userCollectionMetadataFromSDK(item as full.PlaylistFull) + } + } + return undefined +} + +export const trackActivityFromSDK = (input: full.ActivityFull) => { + const { timestamp, itemType: item_type, item } = input + if (item_type === full.ActivityFullItemTypeEnum.Track) { + return { + timestamp, + item_type, + item: userTrackMetadataFromSDK(item as full.TrackFull) + } + } + return undefined +} + export const repostActivityFromSDK = (input: full.ActivityFull) => { const { timestamp, itemType: item_type, item } = input if (item_type === full.ActivityFullItemTypeEnum.Track) { diff --git a/packages/common/src/audius-query/AudiusQueryContext.ts b/packages/common/src/audius-query/AudiusQueryContext.ts index 81f720bd512..8d859b52ed3 100644 --- a/packages/common/src/audius-query/AudiusQueryContext.ts +++ b/packages/common/src/audius-query/AudiusQueryContext.ts @@ -4,7 +4,6 @@ import type { AudiusSdk } from '@audius/sdk' import type { Dispatch } from 'redux' import { getContext } from 'typed-redux-saga' -import type { AudiusAPIClient } from '~/services/audius-api-client' import type { AuthService, IdentityService } from '~/services/auth' import { AudiusBackend, @@ -21,7 +20,6 @@ import { } from '../models' export type AudiusQueryContextType = { - apiClient: AudiusAPIClient audiusSdk: () => Promise audiusBackend: AudiusBackend authService: AuthService @@ -77,9 +75,6 @@ export function* getAudiusQueryContext(): Generator< > { // We can't use common typed `getContext` here because of circular dependency return { - apiClient: yield* getContext( - 'apiClient' - ), audiusBackend: yield* getContext( 'audiusBackendInstance' ), diff --git a/packages/common/src/services/audius-api-client/AudiusAPIClient.ts b/packages/common/src/services/audius-api-client/AudiusAPIClient.ts deleted file mode 100644 index 9494f9061e6..00000000000 --- a/packages/common/src/services/audius-api-client/AudiusAPIClient.ts +++ /dev/null @@ -1,172 +0,0 @@ -import type { AudiusBackend } from '../audius-backend' -import { getEagerDiscprov } from '../audius-backend/eagerLoadUtils' -import { Env } from '../env' -import { LocalStorage } from '../local-storage' -import { RemoteConfigInstance } from '../remote-config' - -enum PathType { - RootPath = '', - VersionPath = '/v1', - VersionFullPath = '/v1/full' -} - -export type QueryParams = { - [key: string]: string | number | undefined | boolean | string[] | null -} - -type InitializationState = - | { state: 'uninitialized' } - | { - state: 'initialized' - endpoint: string - // Requests are dispatched via APIClient rather than libs - type: 'manual' - } - | { - state: 'initialized' - endpoint: string - // Requests are dispatched and handled via libs - type: 'libs' - } - -type AudiusAPIClientConfig = { - audiusBackendInstance: AudiusBackend - overrideEndpoint?: string - remoteConfigInstance: RemoteConfigInstance - localStorage: LocalStorage - env: Env - appName: string - apiKey: string -} - -export class AudiusAPIClient { - initializationState: InitializationState = { - state: 'uninitialized' - } - - audiusBackendInstance: AudiusBackend - overrideEndpoint?: string - remoteConfigInstance: RemoteConfigInstance - localStorage: LocalStorage - env: Env - isReachable?: boolean = true - appName: string - apiKey: string - - constructor({ - audiusBackendInstance, - overrideEndpoint, - remoteConfigInstance, - localStorage, - env, - appName, - apiKey - }: AudiusAPIClientConfig) { - this.audiusBackendInstance = audiusBackendInstance - this.overrideEndpoint = overrideEndpoint - this.remoteConfigInstance = remoteConfigInstance - this.localStorage = localStorage - this.env = env - this.appName = appName - this.apiKey = apiKey - } - - setIsReachable(isReachable: boolean) { - this.isReachable = isReachable - } - - async init() { - if (this.initializationState.state === 'initialized') return - - // If override passed, use that and return - if (this.overrideEndpoint) { - console.debug( - `APIClient: Using override endpoint: ${this.overrideEndpoint}` - ) - this.initializationState = { - state: 'initialized', - endpoint: this.overrideEndpoint, - type: 'manual' - } - return - } - - // Set the state to the eager discprov - const eagerDiscprov = await getEagerDiscprov(this.localStorage, this.env) - if (eagerDiscprov) { - console.debug(`APIClient: setting to eager discprov: ${eagerDiscprov}`) - this.initializationState = { - state: 'initialized', - endpoint: eagerDiscprov, - type: 'manual' - } - } - - // Listen for libs on chain selection - this.audiusBackendInstance.addDiscoveryProviderSelectionListener( - (endpoint: string | null) => { - if (endpoint) { - console.debug(`APIClient: Setting to libs discprov: ${endpoint}`) - this.initializationState = { - state: 'initialized', - endpoint, - type: 'libs' - } - } else { - console.warn('APIClient: No libs discprov endpoint') - } - } - ) - - console.debug('APIClient: Initialized') - } - - makeUrl = ( - path: string, - queryParams: QueryParams = {}, - pathType: PathType = PathType.VersionPath - ) => { - const formattedPath = this._formatPath(pathType, path) - return this._constructUrl(formattedPath, queryParams) - } - - // Helpers - _formatPath(pathType: PathType, path: string) { - return `${pathType}${path}` - } - - _constructUrl( - path: string, - queryParams: QueryParams = {}, - splitArrayParams = false - ) { - if (this.initializationState.state !== 'initialized') - throw new Error('_constructURL called uninitialized') - const params = Object.entries({ - ...queryParams, - app_name: this.appName, - api_key: this.apiKey - }) - .filter((p) => p[1] !== undefined && p[1] !== null) - .map((p) => { - if (Array.isArray(p[1])) { - if (splitArrayParams) { - // If we split, join in the form of - // ?key=val1,val2,val3... - return `${p[0]}=${p[1] - .map((val) => encodeURIComponent(val)) - .join(',')}` - } else { - // Otherwise, join in the form of - // ?key=val1&key=val2&key=val3... - return p[1] - .map((val) => `${p[0]}=${encodeURIComponent(val)}`) - .join('&') - } - } - return `${p[0]}=${encodeURIComponent(p[1]!)}` - }) - .join('&') - return `${this.initializationState.endpoint}${path}?${params}` - } -} diff --git a/packages/common/src/services/audius-api-client/ResponseAdapter.ts b/packages/common/src/services/audius-api-client/ResponseAdapter.ts deleted file mode 100644 index fa108ce4c8f..00000000000 --- a/packages/common/src/services/audius-api-client/ResponseAdapter.ts +++ /dev/null @@ -1,526 +0,0 @@ -import dayjs from '~/utils/dayjs' - -import { - ID, - UserCollectionMetadata, - Variant, - Favorite, - Repost, - Remix, - StemTrackMetadata, - TrackMetadata, - UserTrackMetadata, - UserMetadata, - StringWei -} from '../../models' -import { decodeHashId } from '../../utils/hashIds' -import { removeNullable } from '../../utils/typeUtils' - -import { - APIFavorite, - APIRemix, - APIRepost, - APITrack, - APIPlaylist, - APISearchUser, - APIUser, - APIStem, - APIResponse, - APISearch, - APISearchTrack, - APISearchAutocomplete, - APISearchPlaylist -} from './types' - -export const makeUser = ( - user: APISearchUser | APIUser -): UserMetadata | undefined => { - const decodedUserId = decodeHashId(user.id) - if (!decodedUserId) { - return undefined - } - - const decoded_artist_pick_track_id = user.artist_pick_track_id - ? decodeHashId(user.artist_pick_track_id) - : null - const balance = user.balance as StringWei - const associated_wallets_balance = - user.associated_wallets_balance as StringWei - const album_count = 'album_count' in user ? user.album_count : 0 - const followee_count = 'followee_count' in user ? user.followee_count : 0 - const follower_count = 'follower_count' in user ? user.follower_count : 0 - const playlist_count = 'playlist_count' in user ? user.playlist_count : 0 - const repost_count = 'repost_count' in user ? user.repost_count : 0 - const track_count = 'track_count' in user ? user.track_count : 0 - const current_user_followee_follow_count = - 'current_user_followee_follow_count' in user - ? user.current_user_followee_follow_count - : 0 - const does_current_user_follow = - 'does_current_user_follow' in user ? user.does_current_user_follow : false - const supporter_count = user.supporter_count ?? 0 - const supporting_count = user.supporting_count ?? 0 - - const newUser = { - ...user, - artist_pick_track_id: decoded_artist_pick_track_id, - balance, - associated_wallets_balance, - album_count, - followee_count, - follower_count, - playlist_count, - repost_count, - track_count, - current_user_followee_follow_count, - does_current_user_follow, - user_id: decodedUserId, - cover_photo: user.cover_photo ?? user.cover_photo_legacy, - profile_picture: user.profile_picture ?? user.profile_picture_legacy, - metadata_multihash: user.metadata_multihash || null, - supporter_count, - supporting_count, - - // Fields to prune - id: undefined, - cover_photo_legacy: undefined, - profile_picture_legacy: undefined - } - - delete newUser.id - delete newUser.cover_photo_legacy - delete newUser.profile_picture_legacy - - return newUser -} - -export const makeFavorite = (favorite: APIFavorite): Favorite | undefined => { - const { favorite_item_id, user_id, created_at } = favorite - const decodedSaveItemId = decodeHashId(favorite_item_id) - const decodedUserId = decodeHashId(user_id) - if (!decodedSaveItemId || !decodedUserId) { - return undefined - } - return { - save_item_id: decodedSaveItemId, - user_id: decodedUserId, - save_type: favorite.favorite_type, - created_at - } -} - -const makeRepost = (repost: APIRepost): Repost | undefined => { - const decodedRepostItemId = decodeHashId(repost.repost_item_id) - const decodedUserId = decodeHashId(repost.user_id) - if (!decodedRepostItemId || !decodedUserId) { - return undefined - } - - return { - repost_item_id: decodedRepostItemId, - user_id: decodedUserId, - repost_type: repost.repost_type - } -} - -const makeRemix = (remix: APIRemix): Remix | undefined => { - const decodedTrackId = decodeHashId(remix.parent_track_id) - const user = makeUser(remix.user) - if (!decodedTrackId || !user) { - return undefined - } - - return { - ...remix, - parent_track_id: decodedTrackId, - user - } -} - -export const makeUserlessTrack = ( - track: APITrack | APISearchTrack -): TrackMetadata | undefined => { - const decodedTrackId = decodeHashId(track.id) - const decodedOwnerId = decodeHashId(track.user_id) - if (!decodedTrackId || !decodedOwnerId) return undefined - - const saves = - 'followee_favorites' in track - ? track.followee_favorites?.map(makeFavorite).filter(removeNullable) ?? [] - : [] - - const reposts = - 'followee_reposts' in track - ? track.followee_reposts?.map(makeRepost).filter(removeNullable) ?? [] - : [] - - const remixes = - track.remix_of.tracks?.map(makeRemix).filter(removeNullable) ?? [] - const play_count = - 'play_count' in track - ? typeof track.play_count === 'string' - ? parseInt(track.play_count, 10) - : track.play_count - : 0 - const save_count = 'favorite_count' in track ? track.favorite_count : 0 - const repost_count = 'repost_count' in track ? track.repost_count : 0 - const comment_count = 'comment_count' in track ? track.comment_count : 0 - const has_current_user_reposted = - 'has_current_user_reposted' in track - ? track.has_current_user_reposted - : false - const has_current_user_saved = - 'has_current_user_saved' in track ? track.has_current_user_saved : false - const marshalled = { - ...track, - track_id: decodedTrackId, - owner_id: decodedOwnerId, - followee_saves: saves, - followee_reposts: reposts, - play_count, - save_count, - repost_count, - comment_count, - has_current_user_reposted, - has_current_user_saved, - remix_of: - remixes.length > 0 - ? { - tracks: remixes - } - : null, - - stem_of: track.stem_of.parent_track_id === null ? null : track.stem_of, - - // Fields to prune - id: undefined, - user_id: undefined, - followee_favorites: undefined, - favorite_count: undefined - } - - delete marshalled.id - delete marshalled.user_id - delete marshalled.followee_favorites - delete marshalled.favorite_count - - return marshalled -} - -export const makeTrack = ( - track: APITrack | APISearchTrack -): UserTrackMetadata | undefined => { - const decodedTrackId = decodeHashId(track.id) - const decodedOwnerId = decodeHashId(track.user_id) - const user = makeUser(track.user) - if (!decodedTrackId || !decodedOwnerId || !user) { - return undefined - } - - const saves = - 'followee_favorites' in track - ? track.followee_favorites?.map(makeFavorite).filter(removeNullable) ?? [] - : [] - - const reposts = - 'followee_reposts' in track - ? track.followee_reposts?.map(makeRepost).filter(removeNullable) ?? [] - : [] - - const remixes = - track.remix_of.tracks?.map(makeRemix).filter(removeNullable) ?? [] - const play_count = - 'play_count' in track - ? typeof track.play_count === 'string' - ? parseInt(track.play_count, 10) - : track.play_count - : 0 - - const save_count = 'favorite_count' in track ? track.favorite_count : 0 - const repost_count = 'repost_count' in track ? track.repost_count : 0 - const has_current_user_reposted = - 'has_current_user_reposted' in track - ? track.has_current_user_reposted - : false - const has_current_user_saved = - 'has_current_user_saved' in track ? track.has_current_user_saved : false - const marshalled = { - ...track, - user, - track_id: decodedTrackId, - owner_id: decodedOwnerId, - followee_saves: saves, - followee_reposts: reposts, - play_count, - save_count, - repost_count, - has_current_user_reposted, - has_current_user_saved, - remix_of: - remixes.length > 0 - ? { - tracks: remixes - } - : null, - - stem_of: track.stem_of.parent_track_id === null ? null : track.stem_of, - // TODO: Remove this when api is fixed to return UTC dates - release_date: dayjs - .utc(track.release_date) - .local() - .format('ddd MMM DD YYYY HH:mm:ss [GMT]ZZ'), // utc -> local - - // Fields to prune - id: undefined, - user_id: undefined, - followee_favorites: undefined, - favorite_count: undefined, - is_streamable: undefined - } - - delete marshalled.id - delete marshalled.user_id - delete marshalled.followee_favorites - delete marshalled.favorite_count - delete marshalled.is_streamable - return marshalled -} - -export const makeTrackId = (track: { id: string }): ID | undefined => { - const decodedTrackId = decodeHashId(track.id) - if (!decodedTrackId) { - return undefined - } - return decodedTrackId -} - -export const makePlaylist = ( - playlist: APIPlaylist | APISearchPlaylist -): UserCollectionMetadata | undefined => { - const decodedPlaylistId = decodeHashId(playlist.id) - const decodedOwnerId = decodeHashId(playlist.user_id) - const user = makeUser(playlist.user) - if (!decodedPlaylistId || !decodedOwnerId || !user) { - return undefined - } - - const saves = - 'followee_favorites' in playlist - ? playlist.followee_favorites?.map(makeFavorite).filter(removeNullable) ?? - [] - : [] - - const reposts = - 'followee_reposts' in playlist - ? playlist.followee_reposts?.map(makeRepost).filter(removeNullable) ?? [] - : [] - const has_current_user_reposted = - 'has_current_user_reposted' in playlist - ? playlist.has_current_user_reposted - : false - const has_current_user_saved = - 'has_current_user_saved' in playlist - ? playlist.has_current_user_saved - : false - const save_count = 'favorite_count' in playlist ? playlist.favorite_count : 0 - const repost_count = 'repost_count' in playlist ? playlist.repost_count : 0 - const total_play_count = - 'total_play_count' in playlist ? playlist.total_play_count : 0 - const track_count = 'track_count' in playlist ? playlist.track_count : 0 - const is_stream_gated = - 'is_stream_gated' in playlist ? playlist.is_stream_gated : false - const stream_conditions = - 'stream_conditions' in playlist ? playlist.stream_conditions : null - const access = 'access' in playlist ? playlist.access : null - - const playlistContents = { - track_ids: playlist.added_timestamps - .map((ts) => { - const decoded = decodeHashId(ts.track_id) - if (decoded) { - return { - track: decoded, - time: ts.timestamp, - metadata_time: ts.metadata_timestamp - } - } - return null - }) - .filter(removeNullable) - } - - const tracks = - 'tracks' in playlist - ? playlist.tracks - ?.map((track) => makeTrack(track)) - .filter(removeNullable) ?? [] - : [] - - const marshalled = { - ...playlist, - variant: Variant.USER_GENERATED, - user, - tracks, - playlist_id: decodedPlaylistId, - playlist_owner_id: decodedOwnerId, - followee_saves: saves, - followee_reposts: reposts, - has_current_user_reposted, - has_current_user_saved, - save_count, - repost_count, - track_count, - total_play_count, - playlist_contents: playlistContents, - is_stream_gated, - stream_conditions, - access, - // TODO: Remove this when api is fixed to return UTC dates - release_date: playlist.release_date - ? dayjs.utc(playlist.release_date).local().toString() - : undefined, // utc -> local - - // Fields to prune - id: undefined, - user_id: undefined, - followee_favorites: undefined, - favorite_count: undefined, - added_timestamps: undefined - } - - delete marshalled.id - delete marshalled.user_id - delete marshalled.followee_favorites - delete marshalled.favorite_count - delete marshalled.added_timestamps - - return marshalled as unknown as UserCollectionMetadata -} - -export const makeStemTrack = (stem: APIStem): StemTrackMetadata | undefined => { - const [id, parentId, ownerId] = [stem.id, stem.parent_id, stem.user_id].map( - decodeHashId - ) - if (!(id && parentId && ownerId)) return undefined - - return { - blocknumber: stem.blocknumber, - is_delete: false, - track_id: id, - created_at: '', - isrc: null, - iswc: null, - credits_splits: null, - create_date: null, - description: null, - followee_reposts: [], - followee_saves: [], - genre: '', - has_current_user_reposted: false, - has_current_user_saved: false, - license: null, - mood: null, - play_count: 0, - owner_id: ownerId, - release_date: null, - repost_count: 0, - save_count: 0, - comment_count: 0, - tags: null, - title: '', - track_segments: [], - cover_art: null, - cover_art_sizes: null, - cover_art_cids: null, - is_scheduled_release: false, - is_unlisted: false, - stem_of: { - parent_track_id: parentId, - category: stem.category - }, - artwork: {}, - remix_of: null, - duration: 0, - updated_at: '', - permalink: '', - is_available: true, - is_stream_gated: false, - stream_conditions: null, - is_download_gated: false, - download_conditions: null, - access: { stream: true, download: true }, - track_cid: stem.cid, - orig_file_cid: '', - orig_filename: stem.orig_filename, - is_downloadable: true, - is_original_available: false, - is_playlist_upload: false, - is_owned_by_user: false - } -} - -export const adaptSearchResponse = (searchResponse: APIResponse) => { - return { - tracks: - searchResponse.data.tracks?.map(makeTrack).filter(removeNullable) ?? - undefined, - saved_tracks: - searchResponse.data.saved_tracks?.map(makeTrack).filter(removeNullable) ?? - undefined, - users: - searchResponse.data.users?.map(makeUser).filter(removeNullable) ?? - undefined, - followed_users: - searchResponse.data.followed_users - ?.map(makeUser) - .filter(removeNullable) ?? undefined, - playlists: - searchResponse.data.playlists?.map(makePlaylist).filter(removeNullable) ?? - undefined, - saved_playlists: - searchResponse.data.saved_playlists - ?.map(makePlaylist) - .filter(removeNullable) ?? undefined, - albums: - searchResponse.data.albums?.map(makePlaylist).filter(removeNullable) ?? - undefined, - saved_albums: - searchResponse.data.saved_albums - ?.map(makePlaylist) - .filter(removeNullable) ?? undefined - } -} - -export const adaptSearchAutocompleteResponse = ( - searchResponse: APIResponse -) => { - return { - tracks: - searchResponse.data.tracks?.map(makeTrack).filter(removeNullable) ?? - undefined, - saved_tracks: - searchResponse.data.saved_tracks?.map(makeTrack).filter(removeNullable) ?? - undefined, - users: - searchResponse.data.users?.map(makeUser).filter(removeNullable) ?? - undefined, - followed_users: - searchResponse.data.followed_users - ?.map(makeUser) - .filter(removeNullable) ?? undefined, - playlists: - searchResponse.data.playlists?.map(makePlaylist).filter(removeNullable) ?? - undefined, - saved_playlists: - searchResponse.data.saved_playlists - ?.map(makePlaylist) - .filter(removeNullable) ?? undefined, - albums: - searchResponse.data.albums?.map(makePlaylist).filter(removeNullable) ?? - undefined, - saved_albums: - searchResponse.data.saved_albums - ?.map(makePlaylist) - .filter(removeNullable) ?? undefined - } -} diff --git a/packages/common/src/services/audius-api-client/helper.ts b/packages/common/src/services/audius-api-client/helper.ts deleted file mode 100644 index e655449c541..00000000000 --- a/packages/common/src/services/audius-api-client/helper.ts +++ /dev/null @@ -1,80 +0,0 @@ -import { - UserCollectionMetadata, - UserTrackMetadata, - UserMetadata -} from '~/models' -import { removeNullable } from '~/utils' - -import * as adapter from './ResponseAdapter' -import { APIResponse, APISearch } from './types' - -const SEARCH_MAX_TOTAL_RESULTS = 50 - -const AUTOCOMPLETE_TOTAL_RESULTS = 3 - -type ProcessSearchResultsArgs = { - tracks?: UserTrackMetadata[] - albums?: UserCollectionMetadata[] - playlists?: UserCollectionMetadata[] - users?: UserMetadata[] - saved_tracks?: UserTrackMetadata[] - saved_albums?: UserCollectionMetadata[] - saved_playlists?: UserCollectionMetadata[] - followed_users?: UserMetadata[] - searchText?: string | null - isAutocomplete?: boolean -} - -export const adaptSearchResponse = (searchResponse: APIResponse) => { - return { - tracks: - searchResponse.data.tracks - ?.map(adapter.makeTrack) - .filter(removeNullable) ?? undefined, - saved_tracks: - searchResponse.data.saved_tracks - ?.map(adapter.makeTrack) - .filter(removeNullable) ?? undefined, - users: - searchResponse.data.users?.map(adapter.makeUser).filter(removeNullable) ?? - undefined, - followed_users: - searchResponse.data.followed_users - ?.map(adapter.makeUser) - .filter(removeNullable) ?? undefined, - playlists: - searchResponse.data.playlists - ?.map(adapter.makePlaylist) - .filter(removeNullable) ?? undefined, - saved_playlists: - searchResponse.data.saved_playlists - ?.map(adapter.makePlaylist) - .filter(removeNullable) ?? undefined, - albums: - searchResponse.data.albums - ?.map(adapter.makePlaylist) - .filter(removeNullable) ?? undefined, - saved_albums: - searchResponse.data.saved_albums - ?.map(adapter.makePlaylist) - .filter(removeNullable) ?? undefined - } -} -export const processSearchResults = async ({ - tracks = [], - albums = [], - playlists = [], - users = [], - isAutocomplete = false -}: ProcessSearchResultsArgs) => { - const maxTotal = isAutocomplete - ? AUTOCOMPLETE_TOTAL_RESULTS - : SEARCH_MAX_TOTAL_RESULTS - - return { - tracks: tracks.slice(0, Math.min(maxTotal, tracks.length)), - albums: albums.slice(0, Math.min(maxTotal, albums.length)), - playlists: playlists.slice(0, Math.min(maxTotal, playlists.length)), - users: users.slice(0, Math.min(maxTotal, users.length)) - } -} diff --git a/packages/common/src/services/audius-api-client/index.ts b/packages/common/src/services/audius-api-client/index.ts deleted file mode 100644 index b2b6a28cf4e..00000000000 --- a/packages/common/src/services/audius-api-client/index.ts +++ /dev/null @@ -1,4 +0,0 @@ -export * from './AudiusAPIClient' -export * as responseAdapter from './ResponseAdapter' -export { makeActivity } from './makeActivity' -export * from './types' diff --git a/packages/common/src/services/audius-api-client/makeActivity.ts b/packages/common/src/services/audius-api-client/makeActivity.ts deleted file mode 100644 index 8d18877ab3c..00000000000 --- a/packages/common/src/services/audius-api-client/makeActivity.ts +++ /dev/null @@ -1,30 +0,0 @@ -import { full } from '@audius/sdk' - -import { UserTrackMetadata, UserCollectionMetadata } from '~/models' - -import { makePlaylist, makeTrack } from './ResponseAdapter' -import { APIActivity, APIActivityV2, isApiActivityV2 } from './types' - -export const makeActivity = ( - activity: APIActivity | APIActivityV2 -): UserTrackMetadata | UserCollectionMetadata | undefined => { - if (isApiActivityV2(activity)) { - if (!activity.item) { - return undefined - } - if (activity.itemType === 'track') { - return makeTrack(full.TrackFullToJSON(activity.item as full.TrackFull)) - } else if (activity.itemType === 'playlist') { - return makePlaylist( - full.PlaylistFullWithoutTracksToJSON( - activity.item as full.PlaylistFullWithoutTracks - ) - ) - } - return undefined - } else { - return activity.item_type === 'track' - ? makeTrack(activity.item) - : makePlaylist(activity.item) - } -} diff --git a/packages/common/src/services/audius-api-client/types.ts b/packages/common/src/services/audius-api-client/types.ts deleted file mode 100644 index 9b0b092b55b..00000000000 --- a/packages/common/src/services/audius-api-client/types.ts +++ /dev/null @@ -1,300 +0,0 @@ -import type { full } from '@audius/sdk' - -import { - CID, - FavoriteType, - CoverArtSizes, - CoverPhotoSizes, - ProfilePictureSizes, - StemCategory, - FieldVisibility, - TrackSegment, - SolanaWalletAddress, - WalletAddress, - Supporter, - Supporting, - UserTip, - AccessConditions, - AccessPermissions -} from '../../models' -import { License, Nullable } from '../../utils' - -export type OpaqueID = string - -export type APIUser = { - album_count: number - artist_pick_track_id: Nullable - blocknumber: number - balance: string - associated_wallets_balance: string - bio: Nullable - cover_photo: CoverPhotoSizes - followee_count: number - follower_count: number - handle: string - id: OpaqueID - is_verified: boolean - twitter_handle: Nullable - instagram_handle: Nullable - tiktok_handle: Nullable - verified_with_twitter: boolean - verified_with_instagram: boolean - verified_with_tiktok: boolean - website: Nullable - donation: Nullable - is_deactivated: boolean - location: Nullable - name: string - playlist_count: number - profile_picture: ProfilePictureSizes - repost_count: number - track_count: number - created_at: string - creator_node_endpoint: Nullable - current_user_followee_follow_count: number - does_current_user_follow: boolean - does_current_user_subscribe?: boolean - handle_lc: string - updated_at: string - cover_photo_sizes: Nullable - cover_photo_cids: Nullable - cover_photo_legacy: Nullable - profile_picture_sizes: Nullable - profile_picture_cids: Nullable - profile_picture_legacy: Nullable - metadata_multihash: Nullable - erc_wallet: WalletAddress - spl_wallet: SolanaWalletAddress - has_collectibles: boolean - supporter_count: number - supporting_count: number -} - -export type APISearchUser = Omit< - APIUser, - | 'album_count' - | 'followee_count' - | 'follower_count' - | 'playlist_count' - | 'repost_count' - | 'track_count' - | 'current_user_followee_follow_count' - | 'does_current_user_follow' - | 'does_current_user_subscribe' -> - -export type APIRepost = { - repost_item_id: string - repost_type: string - user_id: string -} - -export type APIFavorite = { - favorite_item_id: string - favorite_type: FavoriteType - user_id: string - created_at: string -} - -export type APIRemix = { - parent_track_id: OpaqueID - user: APIUser - has_remix_author_reposted: boolean - has_remix_author_saved: boolean -} - -export type APITrack = { - blocknumber: number - artwork: CoverArtSizes - description: Nullable - genre: string - id: OpaqueID - mood: Nullable - release_date: Nullable - remix_of: { - tracks: null | APIRemix[] - } - repost_count: number - favorite_count: number - comment_count: number - tags: Nullable - title: string - user: APIUser - duration: number - create_date: Nullable - created_at: string - credits_splits: Nullable - cover_art_sizes: string - cover_art_cids: Nullable - isrc: Nullable - license: Nullable - iswc: Nullable - field_visibility: FieldVisibility - followee_reposts: APIRepost[] - has_current_user_reposted: boolean - is_scheduled_release: boolean - is_unlisted: boolean - has_current_user_saved: boolean - followee_favorites: APIFavorite[] - route_id: string - stem_of: any - track_segments: TrackSegment[] - updated_at: string - user_id: OpaqueID - is_delete: boolean - cover_art: Nullable - play_count: number - permalink: string - is_available: boolean - is_stream_gated: boolean - stream_conditions: Nullable - is_download_gated: boolean - download_conditions: Nullable - access: AccessPermissions - preview_cid: Nullable - track_cid: Nullable - orig_file_cid: Nullable - orig_filename: Nullable - is_downloadable: boolean - is_original_available: boolean - ddex_app: Nullable - is_owned_by_user: boolean - cover_original_song_title: Nullable - cover_original_artist: Nullable -} - -export type APISearchTrack = Omit< - APITrack, - | 'repost_count' - | 'favorite_count' - | 'has_current_user_reposted' - | 'has_current_user_saved' - | 'followee_reposts' - | 'followee_favorites' - | 'play_count' -> - -export type APIStem = { - id: OpaqueID - parent_id: OpaqueID - user_id: OpaqueID - category: StemCategory - cid: CID - blocknumber: number - orig_filename: string -} - -export type APIPlaylistAddedTimestamp = { - metadata_timestamp: number - timestamp: number - track_id: OpaqueID -} - -export type APIPlaylist = { - blocknumber: number - artwork: CoverArtSizes - description: Nullable - id: OpaqueID - is_album: boolean - playlist_name: string - repost_count: number - favorite_count: number - total_play_count: number - user_id: OpaqueID - user: APIUser - created_at: string - updated_at: string - followee_reposts: APIRepost[] - followee_favorites: APIFavorite[] - has_current_user_reposted: boolean - has_current_user_saved: boolean - is_delete: boolean - is_private: boolean - added_timestamps: APIPlaylistAddedTimestamp[] - tracks: APITrack[] - track_count: number - cover_art: Nullable - cover_art_sizes: Nullable - cover_art_cids: Nullable - is_stream_gated: boolean - stream_conditions: Nullable - release_date?: string -} - -export type APISearchPlaylist = Omit< - APIPlaylist, - | 'repost_count' - | 'favorite_count' - | 'total_play_count' - | 'followee_reposts' - | 'followee_favorites' - | 'has_current_user_reposted' - | 'has_current_user_saved' - | 'tracks' -> - -export type APIItemType = 'track' | 'playlist' - -export type APIActivity = { timestamp: string } & ( - | { item_type: 'track'; item: APITrack } - | { item_type: 'playlist'; item: APIPlaylist } -) - -export type APIActivityV2 = full.TrackActivityFull | full.CollectionActivityFull - -export const isApiActivityV2 = ( - activity: APIActivity | APIActivityV2 -): activity is APIActivityV2 => { - return (activity as APIActivityV2).itemType !== undefined -} - -export const isApiActivityV1 = ( - activity: APIActivity | APIActivityV2 -): activity is APIActivity => { - return (activity as APIActivity).item_type !== undefined -} - -export type APISearch = { - users?: APIUser[] - followed_users?: APIUser[] - tracks?: APITrack[] - saved_tracks?: APITrack[] - playlists?: APIPlaylist[] - saved_playlists?: APIPlaylist[] - albums?: APIPlaylist[] - saved_albums?: APIPlaylist[] -} - -export type APISearchAutocomplete = { - users?: APISearchUser[] - followed_users?: APISearchUser[] - tracks?: APISearchTrack[] - saved_tracks?: APISearchTrack[] - playlists?: APISearchPlaylist[] - saved_playlists?: APISearchPlaylist[] - albums?: APISearchPlaylist[] - saved_albums?: APISearchPlaylist[] -} - -export type APIBlockConfirmation = { - block_found: boolean - block_passed: boolean -} - -export type APIResponse = { - data: T -} - -export type SupportingResponse = Omit & { - receiver: APIUser -} -export type SupporterResponse = Omit & { - sender: APIUser -} - -type UserTipOmitIds = 'sender_id' | 'receiver_id' | 'followee_supporter_ids' -export type GetTipsResponse = Omit & { - sender: APIUser - receiver: APIUser - followee_supporters: { user_id: string }[] -} diff --git a/packages/common/src/services/audius-backend/AudiusBackend.ts b/packages/common/src/services/audius-backend/AudiusBackend.ts index 1bb6a58eb94..4b10362b43e 100644 --- a/packages/common/src/services/audius-backend/AudiusBackend.ts +++ b/packages/common/src/services/audius-backend/AudiusBackend.ts @@ -392,7 +392,7 @@ export const audiusBackend = ({ const initialSelectedNode: string | undefined = // TODO: Need a synchronous method to check if a discovery node is already selected? - // Alternatively, remove all this AudiusBackend/Libs init/APIClient init stuff in favor of SDK + // Alternatively, remove all this AudiusBackend/Libs init stuff in favor of SDK // @ts-ignore config is private discoveryNodeSelector.config.initialSelectedNode if (initialSelectedNode) { @@ -1172,6 +1172,11 @@ export const audiusBackend = ({ return { data, signature } } + async function signGatedContentRequest({ sdk }: { sdk: AudiusSdk }) { + const data = `Gated content user signature at ${Date.now()}` + return await signData({ sdk, data }) + } + async function signIdentityServiceRequest({ sdk }: { sdk: AudiusSdk }) { const unixTs = Math.round(new Date().getTime() / 1000) // current unix timestamp (sec) const data = `Click sign to authenticate with identity service: ${unixTs}` @@ -2071,6 +2076,7 @@ export const audiusBackend = ({ setup, setUserHandleForRelay, signData, + signGatedContentRequest, signDiscoveryNodeRequest, signIdentityServiceRequest, signUp, diff --git a/packages/common/src/services/explore/Explore.ts b/packages/common/src/services/explore/Explore.ts index f51a31fe096..990b9ebf9c6 100644 --- a/packages/common/src/services/explore/Explore.ts +++ b/packages/common/src/services/explore/Explore.ts @@ -1,4 +1,4 @@ -import { AudiusSdk } from '@audius/sdk' +import { AudiusSdk, full } from '@audius/sdk' import { FullPlaylistWithScoreResponse, GetBestNewReleasesWindowEnum, @@ -6,6 +6,7 @@ import { } from '@audius/sdk/src/sdk/api/generated/full' import { + trackActivityFromSDK, transformAndCleanList, userCollectionMetadataFromSDK, userFeedItemFromSDK, @@ -20,8 +21,7 @@ import { UserTrack, UserTrackMetadata } from '../../models' -import { encodeHashId, removeNullable } from '../../utils' -import { APIActivityV2, makeActivity } from '../audius-api-client' +import { encodeHashId } from '../../utils' import { AudiusBackend } from '../audius-backend' const scoreComparator = (a: T, b: T) => @@ -90,10 +90,10 @@ export class Explore { id: encodeHashId(currentUserId), limit: 100 }) - const activityData = history.data as APIActivityV2[] - const listenedToTracks = activityData - .map(makeActivity) - .filter(removeNullable) as UserTrackMetadata[] + const listenedToTracks = transformAndCleanList( + history.data, + (activity: full.ActivityFull) => trackActivityFromSDK(activity)?.item + ) // Imperfect solution. Ideally we use an endpoint that gives us true/false // if a user has listened to a passed in array of tracks. diff --git a/packages/common/src/services/index.ts b/packages/common/src/services/index.ts index 54663e7aabf..981820dfa7a 100644 --- a/packages/common/src/services/index.ts +++ b/packages/common/src/services/index.ts @@ -1,7 +1,6 @@ export * from './auth' export * from './remote-config' export * from './RandomImage' -export * from './audius-api-client' export * from './audius-backend' export * from './fingerprint' export * from './local-storage' diff --git a/packages/common/src/services/wallet-client/WalletClient.ts b/packages/common/src/services/wallet-client/WalletClient.ts index 7d368a1b629..0186b245c59 100644 --- a/packages/common/src/services/wallet-client/WalletClient.ts +++ b/packages/common/src/services/wallet-client/WalletClient.ts @@ -12,7 +12,6 @@ import { import { isNullOrUndefined } from '~/utils/typeUtils' import { stringWeiToBN } from '~/utils/wallet' -import { AudiusAPIClient } from '../audius-api-client' import { AudiusBackend, getUserbankAccountInfo, @@ -26,18 +25,15 @@ export const MIN_TRANSFERRABLE_WEI = stringWeiToBN( type WalletClientConfig = { audiusBackendInstance: AudiusBackend - apiClient: AudiusAPIClient audiusSdk: () => Promise } export class WalletClient { audiusBackendInstance: AudiusBackend - apiClient: AudiusAPIClient audiusSdk: () => Promise constructor(config: WalletClientConfig) { this.audiusBackendInstance = config.audiusBackendInstance - this.apiClient = config.apiClient this.audiusSdk = config.audiusSdk } diff --git a/packages/common/src/store/reachability/sagas.ts b/packages/common/src/store/reachability/sagas.ts index cacc4e1ceed..ef9dcbf8476 100644 --- a/packages/common/src/store/reachability/sagas.ts +++ b/packages/common/src/store/reachability/sagas.ts @@ -1,24 +1,8 @@ -import { takeEvery, select, all, take } from 'typed-redux-saga' - -import { getContext } from '~/store/effects' +import { select, all, take } from 'typed-redux-saga' import * as reachabilityActions from './actions' import * as reachabilitySelectors from './selectors' -function* watchSetReachable() { - const apiClient = yield* getContext('apiClient') - yield* takeEvery(reachabilityActions.SET_REACHABLE, () => { - apiClient.setIsReachable(true) - }) -} - -function* watchSetUnreachable() { - const apiClient = yield* getContext('apiClient') - yield* takeEvery(reachabilityActions.SET_UNREACHABLE, () => { - apiClient.setIsReachable(false) - }) -} - // Wait until reachability is either true or 'unconfirmed' export function* waitForReachability() { const isReachable = yield* select(reachabilitySelectors.getIsReachable) @@ -27,5 +11,5 @@ export function* waitForReachability() { } export function sagas() { - return [watchSetReachable, watchSetUnreachable, waitForReachability] + return [waitForReachability] } diff --git a/packages/common/src/store/storeContext.ts b/packages/common/src/store/storeContext.ts index 10aaa486f48..344d764f6a2 100644 --- a/packages/common/src/store/storeContext.ts +++ b/packages/common/src/store/storeContext.ts @@ -16,7 +16,6 @@ import { Track } from '../models' import { AudioPlayer } from '../services/audio-player' -import { AudiusAPIClient } from '../services/audius-api-client' import { AudiusBackend } from '../services/audius-backend' import { Env } from '../services/env' import { Explore } from '../services/explore' @@ -55,7 +54,6 @@ export type CommonStoreContext = { getHostUrl: () => string remoteConfigInstance: RemoteConfigInstance audiusBackendInstance: AudiusBackend - apiClient: AudiusAPIClient fingerprintClient: FingerprintClient walletClient: WalletClient localStorage: LocalStorage diff --git a/packages/common/src/utils/index.ts b/packages/common/src/utils/index.ts index 241573ec627..18083125523 100644 --- a/packages/common/src/utils/index.ts +++ b/packages/common/src/utils/index.ts @@ -27,7 +27,7 @@ export type { License } from './creativeCommons' export * from './array' export * from './chatUtils' export * from './twitter' -export * from './streaming' +export * from './preview' export * from './uploadConstants' export * from './updatePlaylistArtwork' export * from './linking' diff --git a/packages/common/src/utils/preview.ts b/packages/common/src/utils/preview.ts new file mode 100644 index 00000000000..488a967451a --- /dev/null +++ b/packages/common/src/utils/preview.ts @@ -0,0 +1,8 @@ +import { Track } from '~/models' + +const PREVIEW_LENGTH_SECONDS = 30 + +export function getTrackPreviewDuration(track: Track) { + const previewStartSeconds = track.preview_start_seconds || 0 + return Math.min(track.duration - previewStartSeconds, PREVIEW_LENGTH_SECONDS) +} diff --git a/packages/common/src/utils/streaming.ts b/packages/common/src/utils/streaming.ts deleted file mode 100644 index e597edae235..00000000000 --- a/packages/common/src/utils/streaming.ts +++ /dev/null @@ -1,48 +0,0 @@ -import { AudiusSdk } from '@audius/sdk' - -import { AccessSignature, ID, OptionalId, Track } from '~/models' -import { AudiusBackend, QueryParams } from '~/services/index' - -import { Nullable } from './typeUtils' - -const PREVIEW_LENGTH_SECONDS = 30 - -export async function generateUserSignature( - audiusBackendInstance: AudiusBackend, - sdk: AudiusSdk -) { - const data = `Gated content user signature at ${Date.now()}` - return await audiusBackendInstance.getSignature({ data, sdk }) -} - -export async function getQueryParams({ - audiusBackendInstance, - sdk, - nftAccessSignature, - userId -}: { - audiusBackendInstance: AudiusBackend - nftAccessSignature?: Nullable - userId?: Nullable - sdk: AudiusSdk -}) { - const { data, signature } = await generateUserSignature( - audiusBackendInstance, - sdk - ) - const queryParams: QueryParams = {} - if (userId) { - queryParams.user_id = OptionalId.parse(userId) - } - queryParams.user_data = data - queryParams.user_signature = signature - if (nftAccessSignature) { - queryParams.nft_access_signature = JSON.stringify(nftAccessSignature) - } - return queryParams -} - -export function getTrackPreviewDuration(track: Track) { - const previewStartSeconds = track.preview_start_seconds || 0 - return Math.min(track.duration - previewStartSeconds, PREVIEW_LENGTH_SECONDS) -} diff --git a/packages/mobile/src/app/AudiusQueryProvider.tsx b/packages/mobile/src/app/AudiusQueryProvider.tsx index f6fabb4aeed..9b48b941291 100644 --- a/packages/mobile/src/app/AudiusQueryProvider.tsx +++ b/packages/mobile/src/app/AudiusQueryProvider.tsx @@ -4,7 +4,6 @@ import { AudiusQueryContext } from '@audius/common/audius-query' import { env } from 'app/env' import * as analytics from 'app/services/analytics' -import { apiClient } from 'app/services/audius-api-client' import { audiusBackendInstance } from 'app/services/audius-backend-instance' import { getFeatureEnabled, @@ -21,7 +20,6 @@ type AudiusQueryProviderProps = { } export const audiusQueryContext = { - apiClient, audiusBackend: audiusBackendInstance, audiusSdk, authService, diff --git a/packages/mobile/src/components/audio/AudioPlayer.tsx b/packages/mobile/src/components/audio/AudioPlayer.tsx index e9c56de4690..49e16090ba4 100644 --- a/packages/mobile/src/components/audio/AudioPlayer.tsx +++ b/packages/mobile/src/components/audio/AudioPlayer.tsx @@ -1,6 +1,6 @@ import { useRef, useEffect, useCallback, useState } from 'react' -import { Name, SquareSizes } from '@audius/common/models' +import { Id, Name, OptionalId, SquareSizes } from '@audius/common/models' import type { Track } from '@audius/common/models' import { accountSelectors, @@ -24,10 +24,8 @@ import { import type { Queueable, CommonState } from '@audius/common/store' import { Genre, - encodeHashId, shallowCompare, removeNullable, - getQueryParams, getTrackPreviewDuration } from '@audius/common/utils' import type { Nullable } from '@audius/common/utils' @@ -47,7 +45,6 @@ import { useDispatch, useSelector } from 'react-redux' import { useAsync, usePrevious } from 'react-use' import { make, track as analyticsTrack } from 'app/services/analytics' -import { apiClient } from 'app/services/audius-api-client' import { audiusBackendInstance } from 'app/services/audius-backend-instance' import { getLocalAudioPath, @@ -346,25 +343,20 @@ export const AudioPlayer = () => { url = contentNodeStreamUrl } else { const sdk = await audiusSdk() - let queryParams = trackQueryParams.current[trackId] - - if (!queryParams) { - const nftAccessSignature = nftAccessSignatureMap[trackId]?.mp3 ?? null - queryParams = await getQueryParams({ - audiusBackendInstance, - sdk, - nftAccessSignature, - userId: currentUserId + const nftAccessSignature = nftAccessSignatureMap[trackId]?.mp3 ?? null + const { data, signature } = + await audiusBackendInstance.signGatedContentRequest({ + sdk }) - trackQueryParams.current[trackId] = queryParams - } - - queryParams = { ...queryParams, preview: shouldPreview } - - url = apiClient.makeUrl( - `/tracks/${encodeHashId(track.track_id)}/stream`, - queryParams - ) + url = await sdk.tracks.getTrackStreamUrl({ + trackId: Id.parse(track.track_id), + userId: OptionalId.parse(currentUserId), + userSignature: signature, + userData: data, + nftAccessSignature: nftAccessSignature + ? JSON.stringify(nftAccessSignature) + : undefined + }) } const localTrackImageSource = @@ -640,8 +632,6 @@ export const AudioPlayer = () => { const enqueueTracksJobRef = useRef>() // A way to abort the enqeue tracks job if a new lineup is played const abortEnqueueControllerRef = useRef(new AbortController()) - // The ref of trackQueryParams to avoid re-generating query params for the same track - const trackQueryParams = useRef({}) const handleQueueChange = useCallback(async () => { const refUids = queueListRef.current diff --git a/packages/mobile/src/components/share-drawer/useShareToStory.tsx b/packages/mobile/src/components/share-drawer/useShareToStory.tsx index f2f2f363d0e..f19b68beb61 100644 --- a/packages/mobile/src/components/share-drawer/useShareToStory.tsx +++ b/packages/mobile/src/components/share-drawer/useShareToStory.tsx @@ -3,11 +3,12 @@ import { useCallback, useMemo, useRef, useState } from 'react' import EventEmitter from 'events' import path from 'path' -import { ErrorLevel, SquareSizes } from '@audius/common/models' +import { useGetCurrentUserId } from '@audius/common/api' +import { ErrorLevel, OptionalId, Id, SquareSizes } from '@audius/common/models' import type { Color } from '@audius/common/models' import { modalsActions } from '@audius/common/store' import type { ShareContent } from '@audius/common/store' -import { encodeHashId, uuid } from '@audius/common/utils' +import { uuid } from '@audius/common/utils' import type { Nullable } from '@audius/common/utils' import { activateKeepAwake, @@ -33,7 +34,8 @@ import { LinearProgress, Text } from 'app/components/core' import { env } from 'app/env' import { useToast } from 'app/hooks/useToast' import { make, track } from 'app/services/analytics' -import { apiClient } from 'app/services/audius-api-client' +import { audiusBackendInstance } from 'app/services/audius-backend-instance' +import { audiusSdk } from 'app/services/sdk/audius-sdk' import { setVisibility } from 'app/store/drawers/slice' import { getCancel, @@ -127,6 +129,7 @@ export const useShareToStory = ({ const { toast } = useToast() const dispatch = useDispatch() const cancelRef = useRef(false) + const { data: userId } = useGetCurrentUserId({}) const [selectedPlatform, setSelectedPlatform] = useState(null) const trackTitle = @@ -280,6 +283,8 @@ export const useShareToStory = ({ const generateStory = useCallback( async (platform: ShareToStoryPlatform) => { + const sdk = await audiusSdk() + if (content?.type === 'track') { track( make({ @@ -356,10 +361,16 @@ export const useShareToStory = ({ // For simplicity, assume that calculating dominant colors and generating the sticker takes 20% of the total loading time: dispatch(setProgress(20)) - const encodedTrackId = encodeHashId(content.track.track_id) - const streamMp3Url = apiClient.makeUrl( - `/tracks/${encodedTrackId}/stream` - ) + const { data, signature } = + await audiusBackendInstance.signGatedContentRequest({ + sdk + }) + const streamMp3Url = await sdk.tracks.getTrackStreamUrl({ + trackId: Id.parse(content.track.track_id), + userId: OptionalId.parse(userId), + userSignature: signature, + userData: data + }) const storyVideoPath = path.join( RNFS.TemporaryDirectoryPath, `storyVideo-${uuid()}.mp4` @@ -458,6 +469,7 @@ export const useShareToStory = ({ cleanup, dispatch, cancelStory, + userId, pasteToTikTokApp ] ) diff --git a/packages/mobile/src/screens/sign-on-screen/screens/SelectArtistScreen/selectArtistPreviewContext.tsx b/packages/mobile/src/screens/sign-on-screen/screens/SelectArtistScreen/selectArtistPreviewContext.tsx index 35129981fb4..b5f73be18c9 100644 --- a/packages/mobile/src/screens/sign-on-screen/screens/SelectArtistScreen/selectArtistPreviewContext.tsx +++ b/packages/mobile/src/screens/sign-on-screen/screens/SelectArtistScreen/selectArtistPreviewContext.tsx @@ -1,13 +1,18 @@ import { createContext, useCallback, useEffect, useMemo, useState } from 'react' -import { useGetUserTracksByHandle, useGetUserById } from '@audius/common/api' -import type { ID } from '@audius/common/models' -import { encodeHashId } from '@audius/common/utils' +import { + useGetUserTracksByHandle, + useGetUserById, + Id, + useGetCurrentUserId +} from '@audius/common/api' +import { OptionalId, type ID } from '@audius/common/models' import { Formik } from 'formik' import TrackPlayer, { RepeatMode, State } from 'react-native-track-player' import { useAsync, useEffectOnce } from 'react-use' -import { apiClient } from 'app/services/audius-api-client' +import { audiusBackendInstance } from 'app/services/audius-backend-instance' +import { audiusSdk } from 'app/services/sdk/audius-sdk' type PreviewContextProps = { hasPlayed: boolean @@ -25,13 +30,25 @@ export const SelectArtistsPreviewContext = createContext({ togglePreview: () => {} }) -const useGetTrackUrl = (artistId: ID) => { +export const SelectArtistsPreviewContextProvider = (props: { + children: JSX.Element +}) => { + const [hasPlayed, setHasPlayed] = useState(false) + const [isPlaying, setIsPlaying] = useState(false) + const [nowPlayingArtistId, setNowPlayingArtistId] = useState(-1) + const [trackUrl, setTrackUrl] = useState(null) + const { data: currentUserId } = useGetCurrentUserId({}) + + useEffectOnce(() => { + TrackPlayer.setRepeatMode(RepeatMode.Track) + }) + const { data: artist } = useGetUserById( { - id: artistId, + id: nowPlayingArtistId, currentUserId: null }, - { disabled: artistId === -1 } + { disabled: nowPlayingArtistId === -1 } ) const { data: artistTracks } = useGetUserTracksByHandle( @@ -41,25 +58,32 @@ const useGetTrackUrl = (artistId: ID) => { }, { disabled: !artist?.handle } ) - - const trackId = artistTracks?.find((track) => track.is_available)?.track_id - if (!trackId) return null - - return apiClient.makeUrl(`/tracks/${encodeHashId(trackId)}/stream`) -} - -export const SelectArtistsPreviewContextProvider = (props: { - children: JSX.Element -}) => { - const [hasPlayed, setHasPlayed] = useState(false) - const [isPlaying, setIsPlaying] = useState(false) - const [nowPlayingArtistId, setNowPlayingArtistId] = useState(-1) - - useEffectOnce(() => { - TrackPlayer.setRepeatMode(RepeatMode.Track) - }) - - const trackUrl = useGetTrackUrl(nowPlayingArtistId) + useEffect(() => { + if (!nowPlayingArtistId || !currentUserId || !artistTracks) return + + const fn = async () => { + const sdk = await audiusSdk() + const trackId = artistTracks?.find( + (track) => track.is_available + )?.track_id + if (!trackId) return + + const { data, signature } = + await audiusBackendInstance.signGatedContentRequest({ + sdk + }) + + const url = await sdk.tracks.getTrackStreamUrl({ + trackId: Id.parse(trackId), + userId: OptionalId.parse(currentUserId), + userSignature: signature, + userData: data + }) + + setTrackUrl(url) + } + fn() + }, [nowPlayingArtistId, currentUserId, artistTracks]) // Request preview playback const playPreview = useCallback(async (artistId: ID) => { diff --git a/packages/mobile/src/services/audius-api-client/apiClient.ts b/packages/mobile/src/services/audius-api-client/apiClient.ts deleted file mode 100644 index 9bd2d4eab0f..00000000000 --- a/packages/mobile/src/services/audius-api-client/apiClient.ts +++ /dev/null @@ -1,15 +0,0 @@ -import { AudiusAPIClient } from '@audius/common/services' - -import { env } from 'app/env' -import { audiusBackendInstance } from 'app/services/audius-backend-instance' -import { localStorage } from 'app/services/local-storage' -import { remoteConfigInstance } from 'app/services/remote-config' - -export const apiClient = new AudiusAPIClient({ - audiusBackendInstance, - remoteConfigInstance, - localStorage, - env, - appName: env.APP_NAME, - apiKey: env.API_KEY -}) diff --git a/packages/mobile/src/services/audius-api-client/index.ts b/packages/mobile/src/services/audius-api-client/index.ts deleted file mode 100644 index d19cf7a94a6..00000000000 --- a/packages/mobile/src/services/audius-api-client/index.ts +++ /dev/null @@ -1 +0,0 @@ -export * from './apiClient' diff --git a/packages/mobile/src/services/wallet-client.ts b/packages/mobile/src/services/wallet-client.ts index 3aeaef425fd..9c3ed872ca1 100644 --- a/packages/mobile/src/services/wallet-client.ts +++ b/packages/mobile/src/services/wallet-client.ts @@ -1,11 +1,9 @@ import { WalletClient } from '@audius/common/services' -import { apiClient } from './audius-api-client' import { audiusBackendInstance } from './audius-backend-instance' import { audiusSdk } from './sdk/audius-sdk' export const walletClient = new WalletClient({ audiusBackendInstance, - apiClient, audiusSdk }) diff --git a/packages/mobile/src/store/offline-downloads/sagas/offlineQueueSagas/workers/downloadTrackWorker.ts b/packages/mobile/src/store/offline-downloads/sagas/offlineQueueSagas/workers/downloadTrackWorker.ts index 7f96833c049..32e8eb36696 100644 --- a/packages/mobile/src/store/offline-downloads/sagas/offlineQueueSagas/workers/downloadTrackWorker.ts +++ b/packages/mobile/src/store/offline-downloads/sagas/offlineQueueSagas/workers/downloadTrackWorker.ts @@ -5,14 +5,12 @@ import type { UserTrackMetadata } from '@audius/common/models' import { Id, OptionalId, SquareSizes } from '@audius/common/models' -import type { QueryParams } from '@audius/common/services' import { accountSelectors, getContext, gatedContentSelectors, getSDK } from '@audius/common/store' -import { encodeHashId, getQueryParams } from '@audius/common/utils' import ReactNativeBlobUtil from 'react-native-blob-util' import { select, call, put, all, take, race } from 'typed-redux-saga' @@ -152,30 +150,30 @@ function* downloadTrackAsync( } function* downloadTrackAudio(track: UserTrackMetadata, userId: ID) { - const { track_id, title } = track + const { track_id } = track const trackFilePath = getLocalAudioPath(track_id) - const encodedTrackId = encodeHashId(track_id) - const audiusBackendInstance = yield* getContext('audiusBackendInstance') - const apiClient = yield* getContext('apiClient') const audiusSdk = yield* getContext('audiusSdk') const sdk = yield* call(audiusSdk) + const audiusBackendInstance = yield* getContext('audiusBackendInstance') const nftAccessSignatureMap = yield* select(getNftAccessSignatureMap) const nftAccessSignature = nftAccessSignatureMap[track_id]?.mp3 ?? null - let queryParams: QueryParams = {} - queryParams = yield* call(getQueryParams, { - audiusBackendInstance, - nftAccessSignature, - userId, - sdk - }) - // todo: pass in correct filename and whether to download original or mp3 - queryParams.filename = `${title}.mp3` - - const trackAudioUri = apiClient.makeUrl( - `/tracks/${encodedTrackId}/stream`, - queryParams + const { data, signature } = yield* call( + audiusBackendInstance.signGatedContentRequest, + { sdk } + ) + const trackAudioUri = yield* call( + [sdk.tracks, sdk.tracks.getTrackStreamUrl], + { + trackId: Id.parse(track_id), + userId: OptionalId.parse(userId), + userSignature: signature, + userData: data, + nftAccessSignature: nftAccessSignature + ? JSON.stringify(nftAccessSignature) + : undefined + } ) const response = yield* call(downloadFile, trackAudioUri, trackFilePath) const { status } = response.info() diff --git a/packages/mobile/src/store/storeContext.ts b/packages/mobile/src/store/storeContext.ts index cd2c176a749..f663c01d18f 100644 --- a/packages/mobile/src/store/storeContext.ts +++ b/packages/mobile/src/store/storeContext.ts @@ -6,7 +6,6 @@ import { setTag, getCurrentScope } from '@sentry/react-native' import { env } from 'app/env' import * as analytics from 'app/services/analytics' import { audioPlayer } from 'app/services/audio-player' -import { apiClient } from 'app/services/audius-api-client' import { audiusBackendInstance } from 'app/services/audius-backend-instance' import { explore } from 'app/services/explore' import { fingerprintClient } from 'app/services/fingerprint' @@ -39,7 +38,6 @@ export const storeContext: CommonStoreContext = { analytics, remoteConfigInstance, audiusBackendInstance, - apiClient, fingerprintClient, walletClient, localStorage, diff --git a/packages/sdk/src/sdk/api/tracks/TracksApi.ts b/packages/sdk/src/sdk/api/tracks/TracksApi.ts index b9a099075e5..9c4647a5d59 100644 --- a/packages/sdk/src/sdk/api/tracks/TracksApi.ts +++ b/packages/sdk/src/sdk/api/tracks/TracksApi.ts @@ -25,6 +25,7 @@ import { retry3 } from '../../utils/retry' import { Configuration, StreamTrackRequest, + DownloadTrackRequest, TracksApi as GeneratedTracksApi, ExtendedPaymentSplit, instanceOfExtendedPurchaseGate @@ -88,6 +89,23 @@ export class TracksApi extends GeneratedTracksApi { ) } + const queryParams = new URLSearchParams() + if (params.userId) queryParams.append('user_id', params.userId) + if (params.preview !== undefined) + queryParams.append('preview', String(params.preview)) + if (params.userSignature) + queryParams.append('user_signature', params.userSignature) + if (params.userData) queryParams.append('user_data', params.userData) + if (params.nftAccessSignature) + queryParams.append('nft_access_signature', params.nftAccessSignature) + if (params.skipPlayCount !== undefined) + queryParams.append('skip_play_count', String(params.skipPlayCount)) + if (params.apiKey) queryParams.append('api_key', params.apiKey) + if (params.skipCheck !== undefined) + queryParams.append('skip_check', String(params.skipCheck)) + if (params.noRedirect !== undefined) + queryParams.append('no_redirect', String(params.noRedirect)) + const path = `/tracks/{track_id}/stream`.replace( `{${'track_id'}}`, encodeURIComponent(String(params.trackId)) @@ -96,6 +114,37 @@ export class TracksApi extends GeneratedTracksApi { return `${host}${BASE_PATH}${path}` } + /** + * Get the url of the track's downloadable file + */ + async getTrackDownloadUrl(params: DownloadTrackRequest): Promise { + if (params.trackId === null || params.trackId === undefined) { + throw new RequiredError( + 'trackId', + 'Required parameter params.trackId was null or undefined when calling getTrack.' + ) + } + + const queryParams = new URLSearchParams() + if (params.userId) queryParams.append('user_id', params.userId) + if (params.userSignature) + queryParams.append('user_signature', params.userSignature) + if (params.userData) queryParams.append('user_data', params.userData) + if (params.nftAccessSignature) + queryParams.append('nft_access_signature', params.nftAccessSignature) + if (params.original !== undefined) + queryParams.append('original', String(params.original)) + if (params.filename) queryParams.append('filename', params.filename) + + const path = `/tracks/{track_id}/download`.replace( + `{${'track_id'}}`, + encodeURIComponent(String(params.trackId)) + ) + const host = await this.discoveryNodeSelectorService.getSelectedEndpoint() + const queryString = queryParams.toString() + return `${host}${BASE_PATH}${path}${queryString ? '?' + queryString : ''}` + } + /** @hidden * Upload track files, does not write to chain */ diff --git a/packages/web/src/app/AudiusQueryProvider.tsx b/packages/web/src/app/AudiusQueryProvider.tsx index 01bfa82ee90..9ae660475f5 100644 --- a/packages/web/src/app/AudiusQueryProvider.tsx +++ b/packages/web/src/app/AudiusQueryProvider.tsx @@ -4,7 +4,6 @@ import { AudiusQueryContext } from '@audius/common/audius-query' import { useDispatch } from 'react-redux' import * as analytics from 'services/analytics' -import { apiClient } from 'services/audius-api-client' import { audiusBackendInstance } from 'services/audius-backend/audius-backend-instance' import { audiusSdk, @@ -27,7 +26,6 @@ export const AudiusQueryProvider = (props: AudiusQueryProviderProps) => { return ( trackActivityFromSDK(activity)?.item + ) const processedTracks = yield* call(processAndCacheTracks, tracks) const processedTracksMap = keyBy(processedTracks, 'track_id') diff --git a/packages/web/src/common/store/pages/saved/sagas.ts b/packages/web/src/common/store/pages/saved/sagas.ts index d2427965286..7be51a3ca47 100644 --- a/packages/web/src/common/store/pages/saved/sagas.ts +++ b/packages/web/src/common/store/pages/saved/sagas.ts @@ -1,10 +1,8 @@ import { - FavoriteType, - Favorite, - UserTrackMetadata, - User -} from '@audius/common/models' -import { makeActivity, APIActivityV2 } from '@audius/common/services' + trackActivityFromSDK, + transformAndCleanList +} from '@audius/common/adapters' +import { FavoriteType, Favorite, User } from '@audius/common/models' import { accountSelectors, savedPageTracksLineupActions as tracksActions, @@ -16,10 +14,10 @@ import { import { decodeHashId, encodeHashId, - removeNullable, waitForValue, Nullable } from '@audius/common/utils' +import { full } from '@audius/sdk' import { call, fork, put, select, takeLatest } from 'typed-redux-saga' import { processAndCacheTracks } from 'common/store/cache/tracks/utils' @@ -64,23 +62,27 @@ function* sendLibraryRequest({ const audiusSdk = yield* getContext('audiusSdk') const sdk = yield* call(audiusSdk) - const savedTracksResponse = (yield* call( - [sdk.full.users, sdk.full.users.getUserLibraryTracks as any], + const savedTracksResponse = yield* call( + [sdk.full.users, sdk.full.users.getUserLibraryTracks], { id: encodeHashId(userId), userId: encodeHashId(userId), offset, limit, query, - sortMethod, - sortDirection, + sortMethod: sortMethod as full.GetUserLibraryTracksSortMethodEnum, + sortDirection: + sortDirection as full.GetUserLibraryTracksSortDirectionEnum, type: category } - )) as any - const savedTracksResponseData = savedTracksResponse.data as APIActivityV2[] - const tracks = savedTracksResponse.data - ?.map(makeActivity) - .filter(removeNullable) as UserTrackMetadata[] + ) + + const savedTracksResponseData = savedTracksResponse.data ?? [] + const tracks = transformAndCleanList( + savedTracksResponse.data, + (activity: full.ActivityFull) => trackActivityFromSDK(activity)?.item + ) + if (!tracks) { throw new Error('Something went wrong with library tracks request.') } diff --git a/packages/web/src/common/store/player/sagas.ts b/packages/web/src/common/store/player/sagas.ts index 7964b04edc3..799d1ecf68d 100644 --- a/packages/web/src/common/store/player/sagas.ts +++ b/packages/web/src/common/store/player/sagas.ts @@ -1,5 +1,4 @@ -import { Kind, type Track } from '@audius/common/models' -import { QueryParams } from '@audius/common/services' +import { Id, Kind, OptionalId, type Track } from '@audius/common/models' import { accountSelectors, cacheTracksSelectors, @@ -19,10 +18,8 @@ import { import { Genre, actionChannelDispatcher, - getQueryParams, getTrackPreviewDuration, - Nullable, - encodeHashId + Nullable } from '@audius/common/utils' import { eventChannel } from 'redux-saga' import { @@ -102,6 +99,7 @@ export function* watchPlay() { const audioPlayer = yield* getContext('audioPlayer') const isNativeMobile = yield getContext('isNativeMobile') + const audiusBackendInstance = yield* getContext('audiusBackendInstance') if (trackId) { // Load and set end action. @@ -119,24 +117,13 @@ export function* watchPlay() { } yield* call(waitForWrite) - const audiusBackendInstance = yield* getContext('audiusBackendInstance') - const apiClient = yield* getContext('apiClient') const currentUserId = yield* select(getUserId) const audiusSdk = yield* getContext('audiusSdk') const sdk = yield* call(audiusSdk) - const encodedTrackId = encodeHashId(trackId) - - let queryParams: QueryParams = {} const nftAccessSignatureMap = yield* select(getNftAccessSignatureMap) const nftAccessSignature = nftAccessSignatureMap[track.track_id]?.mp3 ?? null - queryParams = (yield* call(getQueryParams, { - audiusBackendInstance, - nftAccessSignature, - userId: currentUserId, - sdk - })) as unknown as QueryParams let trackDuration = track.duration @@ -151,8 +138,6 @@ export function* watchPlay() { } if (shouldPreview) { - // Add preview query string and calculate preview duration for use later - queryParams.preview = true trackDuration = getTrackPreviewDuration(track) } @@ -161,10 +146,23 @@ export function* watchPlay() { shouldPreview, retries ?? 0 ) + const { data, signature } = yield* call( + audiusBackendInstance.signGatedContentRequest, + { sdk } + ) - const discoveryNodeStreamUrl = apiClient.makeUrl( - `/tracks/${encodedTrackId}/stream`, - queryParams + const discoveryNodeStreamUrl = yield* call( + [sdk.tracks, sdk.tracks.getTrackStreamUrl], + { + trackId: Id.parse(trackId), + userId: OptionalId.parse(currentUserId), + nftAccessSignature: nftAccessSignature + ? JSON.stringify(nftAccessSignature) + : undefined, + userSignature: signature, + userData: data, + preview: shouldPreview ? true : undefined + } ) // If we have a stream URL from Discovery already for content node, use that. diff --git a/packages/web/src/common/store/player/store.test.ts b/packages/web/src/common/store/player/store.test.ts index f58cb642d10..21b354ccf50 100644 --- a/packages/web/src/common/store/player/store.test.ts +++ b/packages/web/src/common/store/player/store.test.ts @@ -4,7 +4,6 @@ import { reachabilitySelectors, gatedContentSelectors } from '@audius/common/store' -import { getQueryParams } from '@audius/common/utils' import { combineReducers } from 'redux' import { expectSaga } from 'redux-saga-test-plan' import { call, getContext, select } from 'redux-saga-test-plan/matchers' @@ -12,7 +11,7 @@ import * as matchers from 'redux-saga-test-plan/matchers' import { StaticProvider } from 'redux-saga-test-plan/providers' import { describe, it, expect, vitest } from 'vitest' -import { apiClient } from 'services/audius-api-client' +import { audiusBackendInstance } from 'services/audius-backend/audius-backend-instance' import { noopReducer } from 'store/testHelper' import { waitForWrite } from 'utils/sagaHelpers' @@ -46,17 +45,23 @@ const makeInitialPlayer = (playing: boolean) => ({ playing }) -vitest.mock('services/audius-api-client') - -const mockAudiusSdk = {} +const mockAudiusSdk = { + services: { + audiusWalletClient: { + sign: () => [[], []] + } + }, + tracks: { + getTrackStreamUrl: () => 'https://example.com/stream' + } +} const defaultProviders: StaticProvider[] = [ [call.fn(waitForWrite), undefined], [select(reachabilitySelectors.getIsReachable), true], [select(gatedContentSelectors.getNftAccessSignatureMap), {}], - [call.fn(getQueryParams), {}], - [getContext('apiClient'), apiClient], [getContext('getFeatureEnabled'), () => false], - [matchers.getContext('audiusSdk'), async () => mockAudiusSdk] + [matchers.getContext('audiusSdk'), async () => mockAudiusSdk], + [matchers.getContext('audiusBackendInstance'), audiusBackendInstance] ] describe('watchPlay', () => { diff --git a/packages/web/src/common/store/smart-collection/sagas.ts b/packages/web/src/common/store/smart-collection/sagas.ts index 3574d7f0786..1709452b34a 100644 --- a/packages/web/src/common/store/smart-collection/sagas.ts +++ b/packages/web/src/common/store/smart-collection/sagas.ts @@ -1,10 +1,13 @@ +import { + trackActivityFromSDK, + transformAndCleanList +} from '@audius/common/adapters' import { SmartCollectionVariant, Track, UserTrackMetadata, UserTrack } from '@audius/common/models' -import { makeActivity } from '@audius/common/services' import { accountSelectors, smartCollectionPageActions, @@ -12,7 +15,8 @@ import { collectionPageActions, getContext } from '@audius/common/store' -import { encodeHashId, removeNullable, route } from '@audius/common/utils' +import { encodeHashId, route } from '@audius/common/utils' +import { full } from '@audius/sdk' import { GetBestNewReleasesWindowEnum } from '@audius/sdk/src/sdk/api/generated/full' import { takeEvery, put, call, select } from 'typed-redux-saga' @@ -58,8 +62,9 @@ function* fetchHeavyRotation() { const activityData = activity.data if (!activityData) return { ...HEAVY_ROTATION } - const mostListenedTracks = ( - activityData.map(makeActivity).filter(removeNullable) as UserTrackMetadata[] + const mostListenedTracks = transformAndCleanList( + activityData, + (activity: full.ActivityFull) => trackActivityFromSDK(activity)?.item ).filter((track) => !track.is_unlisted) const users = yield* call( diff --git a/packages/web/src/common/store/social/tracks/sagas.ts b/packages/web/src/common/store/social/tracks/sagas.ts index 4c261e5a3ae..989591e0a26 100644 --- a/packages/web/src/common/store/social/tracks/sagas.ts +++ b/packages/web/src/common/store/social/tracks/sagas.ts @@ -1,5 +1,12 @@ -import { Name, Kind, ID, Track, User, Id } from '@audius/common/models' -import { QueryParams } from '@audius/common/services' +import { + Name, + Kind, + ID, + Track, + User, + Id, + OptionalId +} from '@audius/common/models' import { accountSelectors, cacheTracksSelectors, @@ -17,7 +24,6 @@ import { encodeHashId, makeKindId, waitForValue, - getQueryParams, removeNullable, getFilename } from '@audius/common/utils' @@ -622,43 +628,47 @@ function* downloadTracks({ }) { const { trackId: parentTrackId } = tracks[0] try { - const audiusBackendInstance = yield* getContext('audiusBackendInstance') - const apiClient = yield* getContext('apiClient') const audiusSdk = yield* getContext('audiusSdk') const sdk = yield* call(audiusSdk) + const audiusBackend = yield* getContext('audiusBackendInstance') const trackDownload = yield* getContext('trackDownload') - let queryParams: QueryParams = {} const nftAccessSignatureMap = yield* select(getNftAccessSignatureMap) const userId = yield* select(getUserId) + const { data, signature } = yield* call( + audiusBackend.signGatedContentRequest, + { sdk } + ) const nftAccessSignature = original ? nftAccessSignatureMap[parentTrackId]?.original ?? null : nftAccessSignatureMap[parentTrackId]?.mp3 ?? null - queryParams = (yield* call(getQueryParams, { - audiusBackendInstance, - sdk, - nftAccessSignature, - userId - })) as unknown as QueryParams - - queryParams.original = original - - const files = tracks.map(({ trackId, filename }) => { - queryParams.filename = filename - return { - url: apiClient.makeUrl( - `/tracks/${encodeHashId(trackId)}/download`, - queryParams - ), - filename - } - }) - yield* call(trackDownload.downloadTracks, { - files, - rootDirectoryName, - abortSignal + yield* call(async () => { + const files = await Promise.all( + tracks.map(async ({ trackId, filename }) => { + const url = await sdk.tracks.getTrackDownloadUrl({ + trackId: Id.parse(trackId), + userId: OptionalId.parse(userId), + userSignature: signature, + userData: data, + nftAccessSignature: nftAccessSignature + ? JSON.stringify(nftAccessSignature) + : undefined, + original + }) + return { + url, + filename + } + }) + ) + await trackDownload.downloadTracks({ + files, + rootDirectoryName, + abortSignal + }) }) + yield* call(async () => { await Promise.all( tracks.map(async ({ trackId }) => { diff --git a/packages/web/src/services/audius-api-client/apiClient.ts b/packages/web/src/services/audius-api-client/apiClient.ts deleted file mode 100644 index b96b4ac5757..00000000000 --- a/packages/web/src/services/audius-api-client/apiClient.ts +++ /dev/null @@ -1,15 +0,0 @@ -import { AudiusAPIClient } from '@audius/common/services' - -import { audiusBackendInstance } from 'services/audius-backend/audius-backend-instance' -import { env } from 'services/env' -import { localStorage } from 'services/local-storage' -import { remoteConfigInstance } from 'services/remote-config/remote-config-instance' - -export const apiClient = new AudiusAPIClient({ - audiusBackendInstance, - remoteConfigInstance, - localStorage, - env, - appName: env.APP_NAME, - apiKey: env.API_KEY -}) diff --git a/packages/web/src/services/audius-api-client/index.ts b/packages/web/src/services/audius-api-client/index.ts deleted file mode 100644 index d19cf7a94a6..00000000000 --- a/packages/web/src/services/audius-api-client/index.ts +++ /dev/null @@ -1 +0,0 @@ -export * from './apiClient' diff --git a/packages/web/src/services/wallet-client.ts b/packages/web/src/services/wallet-client.ts index 7a21d9eaf9a..7515a9bddda 100644 --- a/packages/web/src/services/wallet-client.ts +++ b/packages/web/src/services/wallet-client.ts @@ -1,11 +1,9 @@ import { WalletClient } from '@audius/common/services' -import { apiClient } from './audius-api-client' import { audiusBackendInstance } from './audius-backend/audius-backend-instance' import { audiusSdk } from './audius-sdk' export const walletClient = new WalletClient({ audiusBackendInstance, - apiClient, audiusSdk }) diff --git a/packages/web/src/ssr/collection/+onBeforeRender.ts b/packages/web/src/ssr/collection/+onBeforeRender.ts index 785b093a0e9..0796fb4e2c8 100644 --- a/packages/web/src/ssr/collection/+onBeforeRender.ts +++ b/packages/web/src/ssr/collection/+onBeforeRender.ts @@ -1,9 +1,9 @@ -import { APITrack } from '@audius/common/src/services' import { - makePlaylist, - makeTrack, - makeUser -} from '@audius/common/src/services/audius-api-client/ResponseAdapter' + userCollectionMetadataFromSDK, + userMetadataFromSDK, + userTrackMetadataFromSDK +} from '@audius/common/adapters' +import type { full } from '@audius/sdk' import { developmentConfig } from '@audius/sdk/src/sdk/config/development' import { productionConfig } from '@audius/sdk/src/sdk/config/production' import { stagingConfig } from '@audius/sdk/src/sdk/config/staging' @@ -41,20 +41,20 @@ export async function onBeforeRender(pageContext: PageContextServer) { const { data } = await res.json() const [apiCollection] = data const collection = { - ...makePlaylist(apiCollection), - cover_art: apiCollection.artwork?.['1000x1000'] + ...userCollectionMetadataFromSDK(apiCollection), + cover_art: apiCollection.artwork?._1000x1000 } const { user: apiUser } = apiCollection const user = { - ...makeUser(apiUser), - cover_photo: apiUser.cover_photo?.['2000x'], - profile_picture: apiUser.profile_picture?.['1000x1000'] + ...userMetadataFromSDK(apiUser), + cover_photo: apiUser.cover_photo?._2000x, + profile_picture: apiUser.profile_picture?._1000x1000 } - const tracks = apiCollection.tracks.map((apiTrack: APITrack) => ({ - ...makeTrack(apiTrack), - cover_art: apiTrack.artwork?.['150x150'] + const tracks = apiCollection.tracks.map((apiTrack: full.TrackFull) => ({ + ...userTrackMetadataFromSDK(apiTrack), + cover_art: apiTrack.artwork?._150x150 })) try { diff --git a/packages/web/src/ssr/profile/+onBeforeRender.tsx b/packages/web/src/ssr/profile/+onBeforeRender.tsx index 2f576b68f78..75915eefe25 100644 --- a/packages/web/src/ssr/profile/+onBeforeRender.tsx +++ b/packages/web/src/ssr/profile/+onBeforeRender.tsx @@ -1,4 +1,4 @@ -import { makeUser } from '@audius/common/src/services/audius-api-client/ResponseAdapter' +import { userMetadataFromSDK } from '@audius/common/adapters' import { developmentConfig } from '@audius/sdk/src/sdk/config/development' import { productionConfig } from '@audius/sdk/src/sdk/config/production' import { stagingConfig } from '@audius/sdk/src/sdk/config/staging' @@ -37,9 +37,9 @@ export async function onBeforeRender(pageContext: PageContextServer) { // Include api user images. const user = { - ...makeUser(apiUser), - cover_photo: apiUser.cover_photo?.['2000x'], - profile_picture: apiUser.profile_picture?.['1000x1000'] + ...userMetadataFromSDK(apiUser), + cover_photo: apiUser.cover_photo?._2000x, + profile_picture: apiUser.profile_picture?._1000x1000 } return { diff --git a/packages/web/src/ssr/track/+onBeforeRender.tsx b/packages/web/src/ssr/track/+onBeforeRender.tsx index e0fc7270e42..2e1612b04a0 100644 --- a/packages/web/src/ssr/track/+onBeforeRender.tsx +++ b/packages/web/src/ssr/track/+onBeforeRender.tsx @@ -1,7 +1,7 @@ import { - makeTrack, - makeUser -} from '@audius/common/src/services/audius-api-client/ResponseAdapter' + userMetadataFromSDK, + userTrackMetadataFromSDK +} from '@audius/common/adapters' import { developmentConfig } from '@audius/sdk/src/sdk/config/development' import { productionConfig } from '@audius/sdk/src/sdk/config/production' import { stagingConfig } from '@audius/sdk/src/sdk/config/staging' @@ -39,16 +39,16 @@ export async function onBeforeRender(pageContext: PageContextServer) { const [apiTrack] = data // Include artwork in the track object const track = { - ...makeTrack(apiTrack), + ...userTrackMetadataFromSDK(apiTrack), cover_art: apiTrack.artwork?.['1000x1000'] } const { user: apiUser } = apiTrack // Include api user images. const user = { - ...makeUser(apiUser), - cover_photo: apiUser.cover_photo?.['2000x'], - profile_picture: apiUser.profile_picture?.['1000x1000'] + ...userMetadataFromSDK(apiUser), + cover_photo: apiUser.cover_photo?._2000x, + profile_picture: apiUser.profile_picture?._1000x1000 } return { diff --git a/packages/web/src/store/storeContext.ts b/packages/web/src/store/storeContext.ts index 03433907441..9800eac0e38 100644 --- a/packages/web/src/store/storeContext.ts +++ b/packages/web/src/store/storeContext.ts @@ -5,7 +5,6 @@ import { setTag, getCurrentScope } from '@sentry/browser' import * as analytics from 'services/analytics' import { audioPlayer } from 'services/audio-player' -import { apiClient } from 'services/audius-api-client' import { audiusBackendInstance } from 'services/audius-backend/audius-backend-instance' import { audiusSdk, @@ -48,7 +47,6 @@ export const buildStoreContext = ({ analytics, remoteConfigInstance, audiusBackendInstance, - apiClient, fingerprintClient, walletClient, localStorage,