diff --git a/projects/packages/videopress/src/client/lib/get-media-token/index.native.ts b/projects/packages/videopress/src/client/lib/get-media-token/index.native.ts new file mode 100644 index 0000000000000..bad4a16b38999 --- /dev/null +++ b/projects/packages/videopress/src/client/lib/get-media-token/index.native.ts @@ -0,0 +1,86 @@ +/** + * WordPress dependencies + */ +import apiFetch from '@wordpress/api-fetch'; +/** + * Internal dependencies + */ +import { MEDIA_TOKEN_SCOPES } from './types'; +/** + * Types + */ +import type { + MediaTokenScopeProps, + MediaTokenScopeAdminAjaxResponseBodyProps, + MediaTokenProps, + GetMediaTokenArgsProps, +} from './types'; + +type Response = { + metadata_token: string; + blog_id: string; + +} + +/** + * Request media token data hiting WPCOM API. + * + * @param {MediaTokenScopeProps} scope - The scope of the token to request. + * @param {GetMediaTokenArgsProps} args - function arguments. + * @returns {MediaTokenProps} Media token data. + */ +const requestMediaToken = function ( + scope: MediaTokenScopeProps, + args: GetMediaTokenArgsProps = {} +): Promise< MediaTokenProps > { + const { guid } = args; + return new Promise( function ( resolve, reject ) { + if ( ! MEDIA_TOKEN_SCOPES.includes( scope ) ) { + return reject( 'Invalid scope' ); + } + + const fetchParams: { path: string; body: any } = { path: '', body: {} }; + + switch ( scope ) { + case 'upload': + return reject( '"upload" scope is not supported.' ); + + case 'upload-jwt': + return reject( '"upload-jwt" scope is not supported.' ); + + case 'playback': + fetchParams.path = `/wpcom/v2/media/videopress-playback-jwt/${ guid }`; + fetchParams.body = {}; + break; + } + + apiFetch< Response >( { + path: fetchParams.path, + method: 'POST', + body: fetchParams.body, + } ) + .then( response => { + resolve( { token: response.metadata_token } ); + } ) + .catch( error => { + console.warn( 'Token is not achievable', error ); // eslint-disable-line no-console + resolve( { token: null } ); + } ); + } ); +}; + +/** + * Return media token data from fetch request. + * + * @param {MediaTokenScopeProps} scope - The scope of the token to request. + * @param {GetMediaTokenArgsProps} args - function arguments. + * @returns {MediaTokenProps} Media token data. + */ +async function getMediaToken( + scope: MediaTokenScopeProps, + args: GetMediaTokenArgsProps = {} +): Promise< MediaTokenProps > { + return await requestMediaToken( scope, args ); +} + +export default getMediaToken;