feat: request wrapper utility

This commit is contained in:
2026-09-07 12:46:08 +02:00
parent ab08a94d55
commit 8a83326d60
5 changed files with 98 additions and 48 deletions
+37 -44
View File
@@ -8,58 +8,51 @@ import {
import {
musicKitPlayback
} from './playback';
import request from '@/ts/request';
export const useMusicKit: PlayerSourcePluginInitializer = ( storefront: string = 'ch' ): Promise<PlayerSourcePlugin> => {
return new Promise( ( resolve, reject ) => {
const init = async ( storefront: string ): Promise<PlayerSourcePlugin> => {
const res = await fetch( import.meta.env.VITE_BACKEND_URL + '/dev-token', {
'credentials': 'include'
const token = await ( await request.get( '/dev-token' ) ).text();
const instance = await window.MusicKit.configure( {
'developerToken': token,
'app': {
'name': 'MusicPlayer',
'build': '4'
// 'icon': 'https://music.janishutz.com/logo.jpg'
},
'storefrontId': storefront.toUpperCase()
} );
const controls = musicKitPlayback( instance );
if ( res.status === 200 ) {
const token = await res.text();
const instance = await window.MusicKit.configure( {
'developerToken': token,
'app': {
'name': 'MusicPlayer',
'build': '4'
// 'icon': 'https://music.janishutz.com/logo.jpg'
},
'storefrontId': storefront.toUpperCase()
} );
const controls = musicKitPlayback( instance );
const login = async (): Promise<boolean> => {
try {
await instance.authorize();
const login = async (): Promise<boolean> => {
try {
await instance.authorize();
return true;
} catch {
return false;
}
};
return true;
} catch {
return false;
}
};
return {
'authorized': controls.loggedIn,
'play': controls.play,
'pause': controls.pause,
'stop': controls.stop,
'playSong': controls.playSong,
'getDuration': controls.getDuration,
'getPlaybackPos': controls.getPlaybackPos,
'id': 'applemusic',
'name': 'Apple Music',
'seekTo': controls.seekTo,
'login': login,
'addSongsFromThisSource': addFromAppleMusic,
'loading': {
'requiresLocalFiles': false
},
'songUnload': async () => {}
};
} else {
throw new Error( 'ERR_AUTH' );
}
return {
'authorized': controls.loggedIn,
'play': controls.play,
'pause': controls.pause,
'stop': controls.stop,
'playSong': controls.playSong,
'getDuration': controls.getDuration,
'getPlaybackPos': controls.getPlaybackPos,
'id': 'applemusic',
'name': 'Apple Music',
'seekTo': controls.seekTo,
'login': login,
'addSongsFromThisSource': addFromAppleMusic,
'loading': {
'requiresLocalFiles': false
},
'songUnload': async () => {}
};
};
if ( !window.MusicKit ) {
+39
View File
@@ -0,0 +1,39 @@
export class AuthError extends Error {}
export class UnownedError extends Error {}
const get = async ( url: string ): Promise<Response> => {
return await wrapper( url, {
'credentials': 'include'
} );
};
const post = async ( url: string, payload: string, mime: string = 'application/json' ): Promise<Response> => {
return await wrapper( url, {
'credentials': 'include',
'body': payload,
'headers': {
'Content-Type': mime ?? 'application/json'
}
} );
};
const wrapper = async ( url: string, opts: RequestInit ): Promise<Response> => {
const res = await fetch( import.meta.env.VITE_BACKEND_URL + url, opts );
if ( res.ok ) {
return res;
} else if ( res.status === 403 || res.status === 401 ) {
throw new AuthError( 'ERR_USER_UNAUTHORIZED' );
} else if ( res.status === 402 ) {
throw new UnownedError( 'ERR_USER_UNOWNED' );
} else {
throw new Error( 'ERR_' + res.status );
}
};
export default {
get,
post
};