UNPKG

bitmovin-player-react-native

Version:

Official React Native bindings for Bitmovin's mobile Player SDKs.

211 lines (186 loc) 7.04 kB
import { EventSubscription } from 'expo-modules-core'; import NativeInstance from '../nativeInstance'; import { BitmovinNativeOfflineEventData, OfflineContentManagerListener, OfflineEventType, } from './offlineContentManagerListener'; import { OfflineContentConfig } from './offlineContentConfig'; import { OfflineDownloadRequest } from './offlineDownloadRequest'; import { OfflineState } from './offlineState'; import { Drm } from '../drm'; import OfflineModule from './offlineModule'; const handleBitmovinNativeOfflineEvent = ( data: BitmovinNativeOfflineEventData, listeners: Set<OfflineContentManagerListener> ) => { listeners.forEach((listener) => { if (!listener) return; if (data.eventType === OfflineEventType.onCompleted) { listener.onCompleted?.(data); } else if (data.eventType === OfflineEventType.onError) { listener.onError?.(data); } else if (data.eventType === OfflineEventType.onProgress) { listener.onProgress?.(data); } else if (data.eventType === OfflineEventType.onOptionsAvailable) { listener.onOptionsAvailable?.(data); } else if (data.eventType === OfflineEventType.onDrmLicenseUpdated) { listener.onDrmLicenseUpdated?.(data); } else if (data.eventType === OfflineEventType.onDrmLicenseExpired) { listener.onDrmLicenseExpired?.(data); } else if (data.eventType === OfflineEventType.onSuspended) { listener.onSuspended?.(data); } else if (data.eventType === OfflineEventType.onResumed) { listener.onResumed?.(data); } else if (data.eventType === OfflineEventType.onCanceled) { listener.onCanceled?.(data); } }); }; /** * Provides the means to download and store sources locally that can be played back with a Player * without an active network connection. An OfflineContentManager instance can be created via * the constructor and will be idle until initialized. * * @platform Android, iOS */ export class OfflineContentManager extends NativeInstance<OfflineContentConfig> { isInitialized = false; isDestroyed = false; private eventSubscription?: EventSubscription; private listeners: Set<OfflineContentManagerListener> = new Set<OfflineContentManagerListener>(); private drm?: Drm; /** * Allocates the native `OfflineManager` instance and its resources natively. * Registers the `DeviceEventEmitter` listener to receive data from the native `OfflineContentManagerListener` callbacks */ initialize = async (): Promise<void> => { if (!this.isInitialized && this.config) { this.eventSubscription = OfflineModule.addListener( 'onBitmovinOfflineEvent', (event: BitmovinNativeOfflineEventData) => { if (this.nativeId !== event.nativeId) { return; } handleBitmovinNativeOfflineEvent(event, this.listeners); } ); if (this.config.sourceConfig.drmConfig) { this.drm = new Drm(this.config.sourceConfig.drmConfig); await this.drm.initialize(); } await OfflineModule.initializeWithConfig( this.nativeId, { identifier: this.config.identifier, sourceConfig: this.config.sourceConfig, }, this.drm?.nativeId ); } this.isInitialized = true; return Promise.resolve(); }; /** * Adds a listener to the receive data from the native `OfflineContentManagerListener` callbacks * Returns a function that removes this listener from the `OfflineContentManager` that registered it. */ addListener = (listener: OfflineContentManagerListener): (() => void) => { this.listeners.add(listener); return () => { this.listeners.delete(listener); }; }; /** * Destroys the native `OfflineManager` and releases all of its allocated resources. */ destroy = async (): Promise<void> => { if (!this.isDestroyed) { this.isDestroyed = true; this.eventSubscription?.remove?.(); this.listeners.clear(); this.drm?.destroy(); return OfflineModule.release(this.nativeId); } return Promise.resolve(); }; /** * Gets the current state of the `OfflineContentManager` */ state = async (): Promise<OfflineState> => { return OfflineModule.getState(this.nativeId) as Promise<OfflineState>; }; /** * Loads the current `OfflineContentOptions`. * When the options are loaded the data will be passed to the `OfflineContentManagerListener.onOptionsAvailable`. */ getOptions = async (): Promise<void> => { return OfflineModule.getOptions(this.nativeId); }; /** * Enqueues downloads according to the `OfflineDownloadRequest`. * The promise will reject in the event of null or invalid request parameters. * The promise will reject when calling this method when download has already started or is completed. * The promise will resolve when the download has been queued. The download will is not finished when the promise resolves. */ download = async (request: OfflineDownloadRequest): Promise<void> => { return OfflineModule.download(this.nativeId, request); }; /** * Resumes all suspended actions. */ resume = async (): Promise<void> => { return OfflineModule.resume(this.nativeId); }; /** * Suspends all active actions. */ suspend = async (): Promise<void> => { return OfflineModule.suspend(this.nativeId); }; /** * Cancels and deletes the active download. */ cancelDownload = async (): Promise<void> => { return OfflineModule.cancelDownload(this.nativeId); }; /** * Resolves how many bytes of storage are used by the offline content. */ usedStorage = async (): Promise<number> => { return OfflineModule.usedStorage(this.nativeId); }; /** * Deletes everything related to the related content ID. */ deleteAll = async (): Promise<void> => { return OfflineModule.deleteAll(this.nativeId); }; /** * Downloads the offline license. * When finished successfully, data will be passed to the `OfflineContentManagerListener.onDrmLicenseUpdated`. * Errors are transmitted to the `OfflineContentManagerListener.onError`. */ downloadLicense = async (): Promise<void> => { return OfflineModule.downloadLicense(this.nativeId); }; /** * Releases the currently held offline license. * When finished successfully data will be passed to the `OfflineContentManagerListener.onDrmLicenseUpdated`. * Errors are transmitted to the `OfflineContentManagerListener.onError`. * * @platform Android */ releaseLicense = async (): Promise<void> => { return OfflineModule.releaseLicense(this.nativeId); }; /** * Renews the already downloaded DRM license. * When finished successfully data will be passed to the `OfflineContentManagerListener.onDrmLicenseUpdated`. * Errors are transmitted to the `OfflineContentManagerListener.onError`. */ renewOfflineLicense = async (): Promise<void> => { return OfflineModule.renewOfflineLicense(this.nativeId); }; }