Files
App/api/client.ts
2025-04-11 23:48:21 +08:00

163 lines
4.2 KiB
TypeScript

import { Api } from '@jellyfin/sdk/lib/api'
import { JellyfinInfo } from './info'
import { JellifyServer } from '../types/JellifyServer'
import { JellifyUser } from '../types/JellifyUser'
import { storage } from '../constants/storage'
import { MMKVStorageKeys } from '../enums/mmkv-storage-keys'
import uuid from 'react-native-uuid'
import { JellifyLibrary } from '../types/JellifyLibrary'
export default class Client {
static #instance: Client
private api: Api | undefined = undefined
private user: JellifyUser | undefined = undefined
private server: JellifyServer | undefined = undefined
private library: JellifyLibrary | undefined = undefined
private sessionId: string = uuid.v4()
private constructor(
api?: Api | undefined,
user?: JellifyUser | undefined,
server?: JellifyServer | undefined,
library?: JellifyLibrary | undefined,
) {
const userJson = storage.getString(MMKVStorageKeys.User)
const serverJson = storage.getString(MMKVStorageKeys.Server)
const libraryJson = storage.getString(MMKVStorageKeys.Library)
if (user) this.setAndPersistUser(user)
else if (userJson) this.user = JSON.parse(userJson)
else this.user = undefined
if (server) this.setAndPersistServer(server)
else if (serverJson) this.server = JSON.parse(serverJson)
else this.server = undefined
if (library) this.setAndPersistLibrary(library)
else if (libraryJson) this.library = JSON.parse(libraryJson)
else this.library = undefined
if (api) this.api = api
else if (this.user && this.server)
this.api = new Api(
this.server.url,
JellyfinInfo.clientInfo,
JellyfinInfo.deviceInfo,
this.user.accessToken,
)
else this.api = undefined
}
public static get instance(): Client {
if (!Client.#instance) {
Client.#instance = new Client()
}
return Client.#instance
}
public static get api(): Api | undefined {
return Client.#instance.api
}
public static get server(): JellifyServer | undefined {
return Client.#instance.server
}
public static get user(): JellifyUser | undefined {
return Client.#instance.user
}
public static get library(): JellifyLibrary | undefined {
return Client.#instance.library
}
public static get sessionId(): string {
return Client.#instance.sessionId
}
public static signOut(): void {
Client.#instance.removeCredentials()
}
public static switchServer(): void {
Client.#instance.removeServer()
}
public static switchUser(): void {
Client.#instance.removeUser()
}
public static setUser(user: JellifyUser): void {
Client.#instance.setAndPersistUser(user)
}
private setAndPersistUser(user: JellifyUser) {
this.user = user
// persist user details
storage.set(MMKVStorageKeys.User, JSON.stringify(user))
}
private setAndPersistServer(server: JellifyServer) {
this.server = server
storage.set(MMKVStorageKeys.Server, JSON.stringify(server))
}
private setAndPersistLibrary(library: JellifyLibrary) {
this.library = library
storage.set(MMKVStorageKeys.Library, JSON.stringify(library))
}
private removeCredentials() {
this.library = undefined
this.server = undefined
this.user = undefined
storage.delete(MMKVStorageKeys.Server)
storage.delete(MMKVStorageKeys.Library)
storage.delete(MMKVStorageKeys.User)
}
private removeServer() {
this.server = undefined
storage.delete(MMKVStorageKeys.Server)
}
private removeUser() {
this.user = undefined
storage.delete(MMKVStorageKeys.User)
}
/**
* Uses the jellifyClient to create a public Jellyfin API instance.
* @param serverUrl The URL of the Jellyfin server
* @returns
*/
public static setPublicApiClient(server: JellifyServer): void {
const api = JellyfinInfo.createApi(server.url)
Client.#instance = new Client(api, undefined, server, undefined)
}
/**
*
* @param serverUrl The URL of the Jellyfin server
* @param accessToken The assigned accessToken for the Jellyfin user
*/
public static setPrivateApiClient(server: JellifyServer, user: JellifyUser): void {
const api = JellyfinInfo.createApi(server.url, user.accessToken)
Client.#instance = new Client(api, user, server, undefined)
}
public static setLibrary(library: JellifyLibrary): void {
Client.#instance = new Client(undefined, undefined, undefined, library)
}
}