UNPKG

theta-client-react-native

Version:

This library provides a way to control RICOH THETA using.

763 lines (706 loc) 22 kB
import type { AccessPoint, AuthModeEnum } from './access-point'; import type { FileTypeEnum, StorageEnum, ThetaFiles } from './theta-files'; import type { ThetaState } from './theta-state'; import type { ThetaInfo, ThetaModel } from './theta-info'; import type { MetaInfo } from './theta-meta'; import type { PluginInfo } from './theta-plugin'; import ThetaClientReactNative from '../NativeThetaClientReactNative'; import type { OptionNameEnum, Options, CaptureModeEnum, Proxy, BurstCaptureNumEnum, BurstBracketStepEnum, BurstCompensationEnum, BurstMaxExposureTimeEnum, BurstEnableIsoControlEnum, BurstOrderEnum, } from './options'; import { PhotoCaptureBuilder, VideoCaptureBuilder, TimeShiftCaptureBuilder, TimeShiftManualCaptureBuilder, LimitlessIntervalCaptureBuilder, ShotCountSpecifiedIntervalCaptureBuilder, CompositeIntervalCaptureBuilder, BurstCaptureBuilder, ContinuousCaptureBuilder, MultiBracketCaptureBuilder, } from '../capture'; import type { ThetaConfig } from './theta-config'; import type { ThetaTimeout } from './theta-timeout'; import { NotifyController } from './notify-controller'; import { EventWebSocket } from './event-websocket'; import { convertOptions, convertVideoFormatsImpl } from './libs'; export { ThetaWebApiError } from './theta-web-api-error'; const NOTIFY_API_LOG = 'API-LOG'; let apiLogListener: ((message: string) => void) | undefined; async function setNotifyApiLogListener(listener?: (message: string) => void) { if (listener) { NotifyController.instance.addNotify(NOTIFY_API_LOG, (event) => { listener(event.params.message); }); } else { NotifyController.instance.removeNotify(NOTIFY_API_LOG); } await ThetaClientReactNative.setApiLogListener(listener != null); } /** * Set up a log listener for THETA API calls * * @param listener Called when there is a THETA API request and response; if undefined, unregister. */ export async function setApiLogListener(listener?: (message: string) => void) { if (!NotifyController.instance.isInit()) { NotifyController.instance.init(); } apiLogListener = listener; await setNotifyApiLogListener(apiLogListener); } /** * initialize theta client sdk * * @function initialize * @param {string} endPoint optional endpoint of camera * @param {ThetaConfig} config Configuration of initialize. If null, get from THETA. * @param {ThetaTimeout} timeout Timeout of HTTP call. * @return promise of boolean result **/ export async function initialize( endPoint: string = 'http://192.168.1.1', config?: ThetaConfig, timeout?: ThetaTimeout ): Promise<boolean> { NotifyController.instance.init(); if (apiLogListener) { await setNotifyApiLogListener(apiLogListener); } return ThetaClientReactNative.initialize( endPoint, config ?? null, timeout ?? null ); } /** * Returns whether it is initialized or not. * * @function isInitialized * @return promise of boolean result **/ export function isInitialized(): Promise<boolean> { return ThetaClientReactNative.isInitialized(); } /** * Turn off/on (reboot) the camera. * Supported models are THETA A1 only. * * Error when connecting in CL mode for Japan-bound models only * * @function reboot * @return promise */ export function reboot(): Promise<void> { return ThetaClientReactNative.reboot(); } /** * Reset all device settings and capture settings. * After reset, the camera will be restarted. * * @function reset * @return promise of boolean result */ export function reset(): Promise<boolean> { return ThetaClientReactNative.reset(); } /** * Get PhotoCaptureBuilder for take a picture. * * @function getPhotoCaptureBuilder * @return created PhotoCaptureBuilder */ export function getPhotoCaptureBuilder(): PhotoCaptureBuilder { return new PhotoCaptureBuilder(); } /** * Get TimeShiftCaptureBuilder for time-shift. * * @function getTimeShiftCaptureBuilder * @return created TimeShiftCaptureBuilder */ export function getTimeShiftCaptureBuilder(): TimeShiftCaptureBuilder { return new TimeShiftCaptureBuilder(); } /** * Get TimeShiftManualCaptureBuilder for manual time-shift. * * @function getTimeShiftManualCaptureBuilder * @return created TimeShiftManualCaptureBuilder */ export function getTimeShiftManualCaptureBuilder(): TimeShiftManualCaptureBuilder { return new TimeShiftManualCaptureBuilder(); } /** * Get VideoCapture.Builder for capture video. * * @function getVideoCaptureBuilder * @return created VideoCaptureBuilder instance */ export function getVideoCaptureBuilder(): VideoCaptureBuilder { return new VideoCaptureBuilder(); } /** * Get LimitlessIntervalCapture.Builder for take limitless interval shooting. * * @function getLimitlessIntervalCaptureBuilder * @return created LimitlessIntervalCaptureBuilder instance */ export function getLimitlessIntervalCaptureBuilder(): LimitlessIntervalCaptureBuilder { return new LimitlessIntervalCaptureBuilder(); } /** * Get ShotCountSpecifiedIntervalCapture.Builder for take interval shooting with the shot count specified. * * @function getShotCountSpecifiedIntervalCaptureBuilder * @param {shotCount} shot count specified * @return created ShotCountSpecifiedIntervalCaptureBuilder instance */ export function getShotCountSpecifiedIntervalCaptureBuilder( shotCount: number ): ShotCountSpecifiedIntervalCaptureBuilder { return new ShotCountSpecifiedIntervalCaptureBuilder(shotCount); } /** * Get CompositeIntervalCapture.Builder for take interval composite shooting. * * @function getCompositeIntervalCaptureBuilder * @param {shootingTimeSec} Shooting time for interval composite shooting (sec) * @return created CompositeIntervalCaptureBuilder instance */ export function getCompositeIntervalCaptureBuilder( shootingTimeSec: number ): CompositeIntervalCaptureBuilder { return new CompositeIntervalCaptureBuilder(shootingTimeSec); } /** * Get BurstCapture.Builder for take burst shooting. * * @function getBurstCaptureBuilder * @param burstOption Burst shooting setting. * @return created BurstCaptureBuilder instance */ export function getBurstCaptureBuilder( burstCaptureNum: BurstCaptureNumEnum, burstBracketStep: BurstBracketStepEnum, burstCompensation: BurstCompensationEnum, burstMaxExposureTime: BurstMaxExposureTimeEnum, burstEnableIsoControl: BurstEnableIsoControlEnum, burstOrder: BurstOrderEnum ): BurstCaptureBuilder { return new BurstCaptureBuilder( burstCaptureNum, burstBracketStep, burstCompensation, burstMaxExposureTime, burstEnableIsoControl, burstOrder ); } /** * Get MultiBracketCapture.Builder for take multi bracket shooting. * * @function getMultiBracketCaptureBuilder * @return created MultiBracketCaptureBuilder instance */ export function getMultiBracketCaptureBuilder(): MultiBracketCaptureBuilder { return new MultiBracketCaptureBuilder(); } /** * Get ContinuousCapture.Builder for take limitless interval shooting. * * @function getContinuousCaptureBuilder * @return created ContinuousCaptureBuilder instance */ export function getContinuousCaptureBuilder(): ContinuousCaptureBuilder { return new ContinuousCaptureBuilder(); } /** * Start live preview. * preview frame (JPEG DataURL) send THETA_EVENT_NAME event as * { * "data": "DataURL of JPEG Frame" * } * * @function StartLivePreview * @return promise of boolean result */ export function getLivePreview(): Promise<boolean> { return ThetaClientReactNative.getLivePreview(); } /** * Stop live preview. * * @function StopLivePreview * @return promise of boolean result */ export function stopLivePreview(): Promise<boolean> { return ThetaClientReactNative.stopLivePreview(); } /** * Restore setting to THETA * * @function restoreSettings * @return promise of boolean result */ export function restoreSettings(): Promise<boolean> { return ThetaClientReactNative.restoreSettings(); } /** * Stop running self-timer. * * @function stopSelfTimer * @return promise of boolean result */ export function stopSelfTimer(): Promise<boolean> { return ThetaClientReactNative.stopSelfTimer(); } /** * Converts the movie format of a saved movie. * * @function convertVideoFormats * @param {string} fileUrl URL of a saved movie file to convert * @param {boolean} toLowResolution If true generates lower resolution * video, otherwise same resolution. * @param {boolean} applyTopBottomCorrection apply Top/bottom * correction. This parameter is ignored on Theta X. * @param onProgress the block for convertVideoFormats progress * @return promise of URL of a converted movie file. */ export function convertVideoFormats( fileUrl: string, toLowResolution: boolean, applyTopBottomCorrection: boolean, onProgress?: (completion: number) => void ): Promise<string> { return convertVideoFormatsImpl( fileUrl, toLowResolution, applyTopBottomCorrection, onProgress ); } /** * Cancels the movie format conversion. * * @function cancelVideoConvert * @return promise of boolean result */ export function cancelVideoConvert(): Promise<boolean> { return ThetaClientReactNative.cancelVideoConvert(); } /** * Turns the wireless LAN off. * * @function finishWlan * @return promise of boolean result */ export function finishWlan(): Promise<boolean> { return ThetaClientReactNative.finishWlan(); } /** * Registers identification information (UUID) of a BLE device. * * @function setBluetoothDevice * @param {string} uuid UUID of the BLE device to set. * @return promise of String result */ export function setBluetoothDevice(uuid: string): Promise<String> { return ThetaClientReactNative.setBluetoothDevice(uuid); } /** * Returns the connected THETA model. * * @function getThetaModel * @return promise of THETA model **/ export async function getThetaModel(): Promise<ThetaModel | undefined> { const result = await ThetaClientReactNative.getThetaModel(); return result ? (result as ThetaModel) : undefined; } /** * Get basic information about Theta. * * @function getThetaInfo * @return promise of ThetaInfo **/ export function getThetaInfo(): Promise<ThetaInfo> { return ThetaClientReactNative.getThetaInfo() as Promise<ThetaInfo>; } /** * Acquires open source license information related to the camera. * * @function getThetaLicense * @return Promise of string result, HTML string of the license. */ export function getThetaLicense(): Promise<string> { return ThetaClientReactNative.getThetaLicense(); } /** * Get current state of Theta. * * @function getThetaState * @return promise of ThetaState **/ export function getThetaState(): Promise<ThetaState> { return ThetaClientReactNative.getThetaState() as Promise<ThetaState>; } /** * Lists information of images and videos in Theta. * * @function listFiles * @param {FileTypeEnum} fileType Type of the files to be listed. * @param {number} startPosition The position of the first file to be * returned in the list. 0 represents the first file. If * startPosition is larger than the position of the last file, an * empty list is returned. * @param {number} entryCount Desired number of entries to return. If * entryCount is more than the number of remaining files, just * return entries of actual remaining files. * @param {StorageEnum} storage Desired storage. If omitted, return current storage. (RICOH THETA X Version 2.00.0 or later) * @return promise with a list of file information and number of totalEntries. * see [camera.listFiles](https://github.com/ricohapi/theta-api-specs/blob/main/theta-web-api-v2.1/commands/camera.list_files.md). */ export function listFiles( fileTypeEnum: FileTypeEnum, startPosition: number = 0, entryCount: number, storage?: StorageEnum ): Promise<ThetaFiles> { return ThetaClientReactNative.listFiles( fileTypeEnum, startPosition, entryCount, storage ?? null ) as Promise<ThetaFiles>; } /** * Delete files in Theta. * * @function deleteFiles * @param {string[]} fileUrls URLs of the file to be deleted. * @return promise of boolean result */ export function deleteFiles(fileUrls: string[]): Promise<boolean> { return ThetaClientReactNative.deleteFiles(fileUrls); } /** * Delete all files in Theta. * * @function deleteAllFiles * @return promise of boolean result */ export function deleteAllFiles(): Promise<boolean> { return ThetaClientReactNative.deleteAllFiles(); } /** * Delete all image files in Theta. * * @function deleteAllImageFiles * @return promise of boolean result */ export function deleteAllImageFiles(): Promise<boolean> { return ThetaClientReactNative.deleteAllImageFiles(); } /** * Delete all video files in Theta. * * @function deleteAllVideoFiles * @return promise of boolean result */ export function deleteAllVideoFiles(): Promise<boolean> { return ThetaClientReactNative.deleteAllVideoFiles(); } /** * Acquires the properties and property support specifications for * shooting, the camera, etc. * * @function getOptions * @param {OptionNameEnum[]} optionNames List of OptionNameEnum. * @return promise of Options acquired */ export async function getOptions( optionNames: OptionNameEnum[] ): Promise<Options> { const response = (await ThetaClientReactNative.getOptions(optionNames)) as { options: Options; json?: Record<string, string>; }; const { options, json } = response; const result = convertOptions(options, json); return result; } /** * Property settings for shooting, the camera, etc. * * @function setOptions * @param {Options} options Camera setting options. * @return promise of boolean result */ export function setOptions(options: Options): Promise<boolean> { return ThetaClientReactNative.setOptions(options); } /** * Get metadata of a still image * * @function getMetadata * @param {string} fileUrl URL of a still image file to get metadata * @return promise of MetaInfo */ export function getMetadata(fileUrl: string): Promise<MetaInfo> { return ThetaClientReactNative.getMetadata(fileUrl); } /** * Acquires the access point list used in client mode. * * @function listAccessPoints * @return promise of AccessPoint list */ export function listAccessPoints(): Promise<AccessPoint[]> { return ThetaClientReactNative.listAccessPoints() as Promise<AccessPoint[]>; } /** * Set access point. IP address is set dynamically. * * @function setAccessPointDynamically * @param {string} ssid SSID of the access point. * @param {} params - Optional parameters for additional configuration. * @param {boolean} params.ssidStealth true if SSID stealth is enabled. * @param {AuthModeEnum} params.authMode Authentication mode. * @param {string} params.password Password. Not set if authMode is “NONE”. * @param {number} params.connectionPriority Connection priority 1 to 5. * @param {Proxy} params.proxy Proxy information to be used for the access point. * @return promise of boolean result */ export function setAccessPointDynamically( ssid: string, params?: { ssidStealth?: boolean; authMode?: AuthModeEnum; password?: string; connectionPriority?: number; proxy?: Proxy; } ): Promise<boolean> { const { ssidStealth, authMode, password, connectionPriority, proxy } = params ?? {}; return ThetaClientReactNative.setAccessPointDynamically({ ssid, ssidStealth, authMode, password, connectionPriority, proxy, }); } /** * Set access point. IP address is set statically. * * @function setAccessPointStatically * @param {string} ssid SSID of the access point. * @param {string} ipAddress IP address assigns to Theta. * @param {string} subnetMask Subnet mask. * @param {string} defaultGateway Default gateway. * @param {} params - Optional parameters for additional configuration. * @param {boolean} params.ssidStealth True if SSID stealth is enabled. * @param {AuthModeEnum} params.authMode Authentication mode. * @param {string} params.password Password. Not set if authMode is “NONE”. * @param {number} params.connectionPriority Connection priority 1 to 5. * @param {string} params.dns1 Primary DNS server. * @param {string} params.dns2 Secondary DNS server. * @param {Proxy} params.proxy Proxy information to be used for the access point. * @return promise of boolean result */ export function setAccessPointStatically( ssid: string, ipAddress: string, subnetMask: string, defaultGateway: string, params?: { ssidStealth?: boolean; authMode?: AuthModeEnum; password?: string; connectionPriority?: number; dns1?: string; dns2?: string; proxy?: Proxy; } ): Promise<boolean> { const { ssidStealth, authMode, password, connectionPriority, dns1, dns2, proxy, } = params ?? {}; return ThetaClientReactNative.setAccessPointStatically({ ssid, ssidStealth, authMode, password, connectionPriority, ipAddress, subnetMask, defaultGateway, dns1, dns2, proxy, }); } /** * Updates the connection priority of the access point. * * @function setAccessPointConnectionPriority * @param {string} ssid SSID of the access point. * @param {number} connectionPriority Connection priority 1 to 5. * @param {boolean} ssidStealth True if SSID stealth is enabled. * @return promise of boolean result */ export function setAccessPointConnectionPriority( ssid: string, connectionPriority: number, ssidStealth: boolean ): Promise<boolean> { return ThetaClientReactNative.setAccessPointConnectionPriority( ssid, connectionPriority, ssidStealth ); } /** * Deletes access point information used in client mode. * * @function deleteAccessPoint * @param {string} ssid SSID of the access point to delete. * @return promise of boolean result */ export function deleteAccessPoint(ssid: string): Promise<boolean> { return ThetaClientReactNative.deleteAccessPoint(ssid); } /** * Acquires the shooting properties set by the camera._setMySetting command. * Just for Theta V and later. * * @function getMySetting * @param captureMode The target shooting mode * @returns Options of my setting */ export function getMySetting(captureMode: CaptureModeEnum): Promise<Options> { return ThetaClientReactNative.getMySetting(captureMode); } /** * Acquires the shooting properties set by the camera._setMySetting command. * Just for Theta S and SC. * * @function getMySetting * @param optionNames List of option names to acquire * @returns Options of my setting */ export function getMySettingFromOldModel( optionNames: OptionNameEnum[] ): Promise<Options> { return ThetaClientReactNative.getMySettingFromOldModel(optionNames); } /** * Registers shooting conditions in My Settings * @function setMySetting * @param captureMode The target shooting mode. RICOH THETA S and SC do not support My Settings in video capture mode. * @param options registered to My Settings * @returns Promise of boolean result */ export function setMySetting( captureMode: CaptureModeEnum, options: Options ): Promise<boolean> { return ThetaClientReactNative.setMySetting(captureMode, options); } /** * Delete shooting conditions in My Settings. Supported just by Theta X and Z1. * @param captureMode The target shooting mode * @returns Promise of boolean result */ export function deleteMySetting( captureMode: CaptureModeEnum ): Promise<boolean> { return ThetaClientReactNative.deleteMySetting(captureMode); } /** * Acquires a list of installed plugins * @function listPlugins * @return A list of the plugins installed in Theta. */ export function listPlugins(): Promise<PluginInfo[]> { return ThetaClientReactNative.listPlugins() as Promise<PluginInfo[]>; } /** * Sets the installed plugin for boot. Supported just by Theta V. * @function setPlugin * @param packageName Package name of the target plugin. * @return Promise of boolean result */ export function setPlugin(packageName: string): Promise<boolean> { return ThetaClientReactNative.setPlugin(packageName); } /** * Start the plugin specified by the [packageName]. * @function startPlugin * @param packageName Package name of the target plugin. * @return Promise of boolean result */ export function startPlugin(packageName: string): Promise<boolean> { return ThetaClientReactNative.startPlugin(packageName); } /** * Stop the running plugin. * @function stopPlugin * @return Promise of boolean result */ export function stopPlugin(): Promise<boolean> { return ThetaClientReactNative.stopPlugin(); } /** * Acquires the license for the installed plugin. * @function getPluginLicense * @param packageName Package name of the target plugin. * @return Promise of string result, HTML string of the license. */ export function getPluginLicense(packageName: string): Promise<string> { return ThetaClientReactNative.getPluginLicense(packageName); } /** * Return the plugin orders. Supported just by Theta X and Z1. * @function getPluginOrders * @return Promise of string[] result, list of package names of plugins. */ export function getPluginOrders(): Promise<string[]> { return ThetaClientReactNative.getPluginOrders(); } /** * Sets the plugin orders. Supported just by Theta X and Z1. * @function setPluginOrders * @param plugins list of package names of plugins. * For Z1, list size must be three. No restrictions for the size for X. * When not specifying, set an empty string. * If an empty string is placed mid-way, it will be moved to the front. * Specifying zero package name will result in an error * @return Promise of boolean result */ export function setPluginOrders(plugins: string[]): Promise<boolean> { return ThetaClientReactNative.setPluginOrders(plugins); } export async function getEventWebSocket(): Promise<EventWebSocket> { await ThetaClientReactNative.getEventWebSocket(); return new EventWebSocket(NotifyController.instance); }