expo-camera 16.0.6 → 16.0.7

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/CHANGELOG.md CHANGED
@@ -10,6 +10,12 @@
10
10
 
11
11
  ### 💡 Others
12
12
 
13
+ ## 16.0.7 — 2024-11-22
14
+
15
+ ### 🐛 Bug fixes
16
+
17
+ - [iOS] Fix an issue where devices supporting the `hevc` codec have `jpeg` set in the `photoSettings`. ([#33186](https://github.com/expo/expo/pull/33186) by [@alanjhughes](https://github.com/alanjhughes))
18
+
13
19
  ## 16.0.6 — 2024-11-19
14
20
 
15
21
  ### 🎉 New features
@@ -1,7 +1,7 @@
1
1
  apply plugin: 'com.android.library'
2
2
 
3
3
  group = 'host.exp.exponent'
4
- version = '16.0.6'
4
+ version = '16.0.7'
5
5
 
6
6
  def expoModulesCorePlugin = new File(project(":expo-modules-core").projectDir.absolutePath, "ExpoModulesCorePlugin.gradle")
7
7
  apply from: expoModulesCorePlugin
@@ -14,7 +14,7 @@ android {
14
14
  namespace "expo.modules.camera"
15
15
  defaultConfig {
16
16
  versionCode 32
17
- versionName "16.0.6"
17
+ versionName "16.0.7"
18
18
  }
19
19
  }
20
20
 
@@ -1 +1 @@
1
- {"version":3,"file":"CameraView.js","sourceRoot":"","sources":["../src/CameraView.tsx"],"names":[],"mappings":"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","sourcesContent":["import { Platform, UnavailabilityError, type EventSubscription } from 'expo-modules-core';\nimport { type Ref, Component, createRef } from 'react';\n\nimport {\n CameraCapturedPicture,\n CameraOrientation,\n CameraPictureOptions,\n CameraViewProps,\n CameraRecordingOptions,\n CameraViewRef,\n ScanningOptions,\n ScanningResult,\n VideoCodec,\n} from './Camera.types';\nimport ExpoCamera from './ExpoCamera';\nimport CameraManager from './ExpoCameraManager';\nimport { ConversionTables, ensureNativeProps } from './utils/props';\n\nconst EventThrottleMs = 500;\n\nconst _PICTURE_SAVED_CALLBACKS = {};\n\nlet _GLOBAL_PICTURE_ID = 1;\n\nfunction ensurePictureOptions(options?: CameraPictureOptions): CameraPictureOptions {\n if (!options || typeof options !== 'object') {\n return {};\n }\n\n if (options.quality === undefined) {\n options.quality = 1;\n }\n\n if (options.mirror) {\n console.warn(\n 'The `mirror` option is deprecated. Please use the `mirror` prop on the `CameraView` instead.'\n );\n }\n\n if (options.onPictureSaved) {\n const id = _GLOBAL_PICTURE_ID++;\n _PICTURE_SAVED_CALLBACKS[id] = options.onPictureSaved;\n options.id = id;\n options.fastMode = true;\n }\n\n return options;\n}\n\nfunction ensureRecordingOptions(options: CameraRecordingOptions = {}): CameraRecordingOptions {\n if (!options || typeof options !== 'object') {\n return {};\n }\n\n if (options.mirror) {\n console.warn(\n 'The `mirror` option is deprecated. Please use the `mirror` prop on the `CameraView` instead.'\n );\n }\n\n return options;\n}\n\nfunction _onPictureSaved({\n nativeEvent,\n}: {\n nativeEvent: { data: CameraCapturedPicture; id: number };\n}) {\n const { id, data } = nativeEvent;\n const callback = _PICTURE_SAVED_CALLBACKS[id];\n if (callback) {\n callback(data);\n delete _PICTURE_SAVED_CALLBACKS[id];\n }\n}\n\nexport default class CameraView extends Component<CameraViewProps> {\n /**\n * Property that determines if the current device has the ability to use `DataScannerViewController` (iOS 16+).\n */\n static isModernBarcodeScannerAvailable: boolean = CameraManager.isModernBarcodeScannerAvailable;\n /**\n * Check whether the current device has a camera. This is useful for web and simulators cases.\n * This isn't influenced by the Permissions API (all platforms), or HTTP usage (in the browser).\n * You will still need to check if the native permission has been accepted.\n * @platform web\n */\n static async isAvailableAsync(): Promise<boolean> {\n if (!CameraManager.isAvailableAsync) {\n throw new UnavailabilityError('expo-camera', 'isAvailableAsync');\n }\n\n return await CameraManager.isAvailableAsync();\n }\n\n // @needsAudit\n /**\n * Queries the device for the available video codecs that can be used in video recording.\n * @return A promise that resolves to a list of strings that represents available codecs.\n * @platform ios\n */\n static async getAvailableVideoCodecsAsync(): Promise<VideoCodec[]> {\n if (!CameraManager.getAvailableVideoCodecsAsync) {\n throw new UnavailabilityError('Camera', 'getAvailableVideoCodecsAsync');\n }\n\n return await CameraManager.getAvailableVideoCodecsAsync();\n }\n\n /**\n * Get picture sizes that are supported by the device.\n * @return Returns a Promise that resolves to an array of strings representing picture sizes that can be passed to `pictureSize` prop.\n * The list varies across Android devices but is the same for every iOS.\n */\n async getAvailablePictureSizesAsync(): Promise<string[]> {\n return (await this._cameraRef.current?.getAvailablePictureSizes()) ?? [];\n }\n\n /**\n * Resumes the camera preview.\n */\n async resumePreview(): Promise<void> {\n return this._cameraRef.current?.resumePreview();\n }\n\n /**\n * Pauses the camera preview. It is not recommended to use `takePictureAsync` when preview is paused.\n */\n async pausePreview(): Promise<void> {\n return this._cameraRef.current?.pausePreview();\n }\n\n // Values under keys from this object will be transformed to native options\n static ConversionTables = ConversionTables;\n\n static defaultProps: CameraViewProps = {\n zoom: 0,\n facing: 'back',\n enableTorch: false,\n mode: 'picture',\n flash: 'off',\n };\n\n _cameraHandle?: number | null;\n _cameraRef = createRef<CameraViewRef>();\n _lastEvents: { [eventName: string]: string } = {};\n _lastEventsTimes: { [eventName: string]: Date } = {};\n\n // @needsAudit\n /**\n * Takes a picture and saves it to app's cache directory. Photos are rotated to match device's orientation\n * (if `options.skipProcessing` flag is not enabled) and scaled to match the preview.\n * > **Note**: Make sure to wait for the [`onCameraReady`](#oncameraready) callback before calling this method.\n * @param options An object in form of `CameraPictureOptions` type.\n * @return Returns a Promise that resolves to `CameraCapturedPicture` object, where `uri` is a URI to the local image file on Android,\n * iOS, and a base64 string on web (usable as the source for an `Image` element). The `width` and `height` properties specify\n * the dimensions of the image.\n *\n * `base64` is included if the `base64` option was truthy, and is a string containing the JPEG data\n * of the image in Base64. Prepend it with `'data:image/jpg;base64,'` to get a data URI, which you can use as the source\n * for an `Image` element for example.\n *\n * `exif` is included if the `exif` option was truthy, and is an object containing EXIF\n * data for the image. The names of its properties are EXIF tags and their values are the values for those tags.\n *\n * > On native platforms, the local image URI is temporary. Use [`FileSystem.copyAsync`](filesystem/#filesystemcopyasyncoptions)\n * > to make a permanent copy of the image.\n *\n * > **Note:** Avoid calling this method while the preview is paused. On Android, this will throw an error. On iOS, this will take a picture of the last frame that is currently on screen.\n */\n async takePictureAsync(options?: CameraPictureOptions) {\n const pictureOptions = ensurePictureOptions(options);\n\n return this._cameraRef.current?.takePicture(pictureOptions);\n }\n\n /**\n * Presents a modal view controller that uses the [`DataScannerViewController`](https://developer.apple.com/documentation/visionkit/scanning_data_with_the_camera) available on iOS 16+.\n * @platform ios\n */\n static async launchScanner(options?: ScanningOptions): Promise<void> {\n if (!options) {\n options = { barcodeTypes: [] };\n }\n if (Platform.OS === 'ios' && CameraView.isModernBarcodeScannerAvailable) {\n await CameraManager.launchScanner(options);\n }\n }\n\n /**\n * Dismiss the scanner presented by `launchScanner`.\n * @platform ios\n */\n static async dismissScanner(): Promise<void> {\n if (Platform.OS === 'ios' && CameraView.isModernBarcodeScannerAvailable) {\n await CameraManager.dismissScanner();\n }\n }\n\n /**\n * Invokes the `listener` function when a bar code has been successfully scanned. The callback is provided with\n * an object of the `ScanningResult` shape, where the `type` refers to the bar code type that was scanned and the `data` is the information encoded in the bar code\n * (in this case of QR codes, this is often a URL). See [`BarcodeType`](#barcodetype) for supported values.\n * @param listener Invoked with the [ScanningResult](#scanningresult) when a bar code has been successfully scanned.\n *\n * @platform ios\n */\n static onModernBarcodeScanned(listener: (event: ScanningResult) => void): EventSubscription {\n return CameraManager.addListener('onModernBarcodeScanned', listener);\n }\n\n /**\n * Starts recording a video that will be saved to cache directory. Videos are rotated to match device's orientation.\n * Flipping camera during a recording results in stopping it.\n * @param options A map of `CameraRecordingOptions` type.\n * @return Returns a Promise that resolves to an object containing video file `uri` property and a `codec` property on iOS.\n * The Promise is returned if `stopRecording` was invoked, one of `maxDuration` and `maxFileSize` is reached or camera preview is stopped.\n * @platform android\n * @platform ios\n */\n async recordAsync(options?: CameraRecordingOptions) {\n const recordingOptions = ensureRecordingOptions(options);\n return this._cameraRef.current?.record(recordingOptions);\n }\n\n /**\n * Stops recording if any is in progress.\n */\n stopRecording() {\n this._cameraRef.current?.stopRecording();\n }\n\n _onCameraReady = () => {\n if (this.props.onCameraReady) {\n this.props.onCameraReady();\n }\n };\n\n _onMountError = ({ nativeEvent }: { nativeEvent: { message: string } }) => {\n if (this.props.onMountError) {\n this.props.onMountError(nativeEvent);\n }\n };\n\n _onResponsiveOrientationChanged = ({\n nativeEvent,\n }: {\n nativeEvent: { orientation: CameraOrientation };\n }) => {\n if (this.props.onResponsiveOrientationChanged) {\n this.props.onResponsiveOrientationChanged(nativeEvent);\n }\n };\n\n _onObjectDetected =\n (callback?: Function) =>\n ({ nativeEvent }: { nativeEvent: any }) => {\n const { type } = nativeEvent;\n if (\n this._lastEvents[type] &&\n this._lastEventsTimes[type] &&\n JSON.stringify(nativeEvent) === this._lastEvents[type] &&\n new Date().getTime() - this._lastEventsTimes[type].getTime() < EventThrottleMs\n ) {\n return;\n }\n\n if (callback) {\n callback(nativeEvent);\n this._lastEventsTimes[type] = new Date();\n this._lastEvents[type] = JSON.stringify(nativeEvent);\n }\n };\n\n _setReference = (ref: Ref<CameraViewRef>) => {\n if (ref) {\n // TODO(Bacon): Unify these - perhaps with hooks?\n if (Platform.OS === 'web') {\n this._cameraHandle = ref as any;\n }\n }\n };\n\n render() {\n const nativeProps = ensureNativeProps(this.props);\n const onBarcodeScanned = this.props.onBarcodeScanned\n ? this._onObjectDetected(this.props.onBarcodeScanned)\n : undefined;\n\n return (\n <ExpoCamera\n {...nativeProps}\n ref={this._cameraRef}\n onCameraReady={this._onCameraReady}\n onMountError={this._onMountError}\n onBarcodeScanned={onBarcodeScanned}\n onPictureSaved={_onPictureSaved}\n onResponsiveOrientationChanged={this._onResponsiveOrientationChanged}\n />\n );\n }\n}\n"]}
1
+ {"version":3,"file":"CameraView.js","sourceRoot":"","sources":["../src/CameraView.tsx"],"names":[],"mappings":"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","sourcesContent":["import { Platform, UnavailabilityError, type EventSubscription } from 'expo-modules-core';\nimport { type Ref, Component, createRef } from 'react';\n\nimport {\n CameraCapturedPicture,\n CameraOrientation,\n CameraPictureOptions,\n CameraViewProps,\n CameraRecordingOptions,\n CameraViewRef,\n ScanningOptions,\n ScanningResult,\n VideoCodec,\n} from './Camera.types';\nimport ExpoCamera from './ExpoCamera';\nimport CameraManager from './ExpoCameraManager';\nimport { ConversionTables, ensureNativeProps } from './utils/props';\n\nconst EventThrottleMs = 500;\n\nconst _PICTURE_SAVED_CALLBACKS = {};\n\nlet _GLOBAL_PICTURE_ID = 1;\n\nfunction ensurePictureOptions(options?: CameraPictureOptions): CameraPictureOptions {\n if (!options || typeof options !== 'object') {\n return {};\n }\n\n if (options.quality === undefined) {\n options.quality = 1;\n }\n\n if (options.mirror) {\n console.warn(\n 'The `mirror` option is deprecated. Please use the `mirror` prop on the `CameraView` instead.'\n );\n }\n\n if (options.onPictureSaved) {\n const id = _GLOBAL_PICTURE_ID++;\n _PICTURE_SAVED_CALLBACKS[id] = options.onPictureSaved;\n options.id = id;\n options.fastMode = true;\n }\n\n return options;\n}\n\nfunction ensureRecordingOptions(options: CameraRecordingOptions = {}): CameraRecordingOptions {\n if (!options || typeof options !== 'object') {\n return {};\n }\n\n if (options.mirror) {\n console.warn(\n 'The `mirror` option is deprecated. Please use the `mirror` prop on the `CameraView` instead.'\n );\n }\n\n return options;\n}\n\nfunction _onPictureSaved({\n nativeEvent,\n}: {\n nativeEvent: { data: CameraCapturedPicture; id: number };\n}) {\n const { id, data } = nativeEvent;\n const callback = _PICTURE_SAVED_CALLBACKS[id];\n if (callback) {\n callback(data);\n delete _PICTURE_SAVED_CALLBACKS[id];\n }\n}\n\nexport default class CameraView extends Component<CameraViewProps> {\n /**\n * Property that determines if the current device has the ability to use `DataScannerViewController` (iOS 16+).\n */\n static isModernBarcodeScannerAvailable: boolean = CameraManager.isModernBarcodeScannerAvailable;\n /**\n * Check whether the current device has a camera. This is useful for web and simulators cases.\n * This isn't influenced by the Permissions API (all platforms), or HTTP usage (in the browser).\n * You will still need to check if the native permission has been accepted.\n * @platform web\n */\n static async isAvailableAsync(): Promise<boolean> {\n if (!CameraManager.isAvailableAsync) {\n throw new UnavailabilityError('expo-camera', 'isAvailableAsync');\n }\n\n return await CameraManager.isAvailableAsync();\n }\n\n // @needsAudit\n /**\n * Queries the device for the available video codecs that can be used in video recording.\n * @return A promise that resolves to a list of strings that represents available codecs.\n * @platform ios\n */\n static async getAvailableVideoCodecsAsync(): Promise<VideoCodec[]> {\n if (!CameraManager.getAvailableVideoCodecsAsync) {\n throw new UnavailabilityError('Camera', 'getAvailableVideoCodecsAsync');\n }\n\n return await CameraManager.getAvailableVideoCodecsAsync();\n }\n\n /**\n * Get picture sizes that are supported by the device.\n * @return Returns a Promise that resolves to an array of strings representing picture sizes that can be passed to `pictureSize` prop.\n * The list varies across Android devices but is the same for every iOS.\n */\n async getAvailablePictureSizesAsync(): Promise<string[]> {\n return (await this._cameraRef.current?.getAvailablePictureSizes()) ?? [];\n }\n\n /**\n * Resumes the camera preview.\n */\n async resumePreview(): Promise<void> {\n return this._cameraRef.current?.resumePreview();\n }\n\n /**\n * Pauses the camera preview. It is not recommended to use `takePictureAsync` when preview is paused.\n */\n async pausePreview(): Promise<void> {\n return this._cameraRef.current?.pausePreview();\n }\n\n // Values under keys from this object will be transformed to native options\n static ConversionTables = ConversionTables;\n\n static defaultProps: CameraViewProps = {\n zoom: 0,\n facing: 'back',\n enableTorch: false,\n mode: 'picture',\n flash: 'off',\n };\n\n _cameraHandle?: number | null;\n _cameraRef = createRef<CameraViewRef>();\n _lastEvents: { [eventName: string]: string } = {};\n _lastEventsTimes: { [eventName: string]: Date } = {};\n\n // @needsAudit\n /**\n * Takes a picture and saves it to app's cache directory. Photos are rotated to match device's orientation\n * (if `options.skipProcessing` flag is not enabled) and scaled to match the preview.\n * > **Note**: Make sure to wait for the [`onCameraReady`](#oncameraready) callback before calling this method.\n * @param options An object in form of `CameraPictureOptions` type.\n * @return Returns a Promise that resolves to `CameraCapturedPicture` object, where `uri` is a URI to the local image file on Android,\n * iOS, and a base64 string on web (usable as the source for an `Image` element). The `width` and `height` properties specify\n * the dimensions of the image.\n *\n * `base64` is included if the `base64` option was truthy, and is a string containing the JPEG data\n * of the image in Base64. Prepend it with `'data:image/jpg;base64,'` to get a data URI, which you can use as the source\n * for an `Image` element for example.\n *\n * `exif` is included if the `exif` option was truthy, and is an object containing EXIF\n * data for the image. The names of its properties are EXIF tags and their values are the values for those tags.\n *\n * > On native platforms, the local image URI is temporary. Use [`FileSystem.copyAsync`](filesystem/#filesystemcopyasyncoptions)\n * > to make a permanent copy of the image.\n *\n * > **Note:** Avoid calling this method while the preview is paused. On Android, this will throw an error. On iOS, this will take a picture of the last frame that is currently on screen.\n */\n async takePictureAsync(options?: CameraPictureOptions) {\n const pictureOptions = ensurePictureOptions(options);\n\n return this._cameraRef.current?.takePicture(pictureOptions);\n }\n\n /**\n * Presents a modal view controller that uses the [`DataScannerViewController`](https://developer.apple.com/documentation/visionkit/scanning_data_with_the_camera) available on iOS 16+.\n * @platform ios\n */\n static async launchScanner(options?: ScanningOptions): Promise<void> {\n if (!options) {\n options = { barcodeTypes: [] };\n }\n if (Platform.OS === 'ios' && CameraView.isModernBarcodeScannerAvailable) {\n await CameraManager.launchScanner(options);\n }\n }\n\n /**\n * Dismiss the scanner presented by `launchScanner`.\n * @platform ios\n */\n static async dismissScanner(): Promise<void> {\n if (Platform.OS === 'ios' && CameraView.isModernBarcodeScannerAvailable) {\n await CameraManager.dismissScanner();\n }\n }\n\n /**\n * Invokes the `listener` function when a bar code has been successfully scanned. The callback is provided with\n * an object of the `ScanningResult` shape, where the `type` refers to the bar code type that was scanned and the `data` is the information encoded in the bar code\n * (in this case of QR codes, this is often a URL). See [`BarcodeType`](#barcodetype) for supported values.\n * @param listener Invoked with the [ScanningResult](#scanningresult) when a bar code has been successfully scanned.\n *\n * @platform ios\n */\n static onModernBarcodeScanned(listener: (event: ScanningResult) => void): EventSubscription {\n return CameraManager.addListener('onModernBarcodeScanned', listener);\n }\n\n /**\n * Starts recording a video that will be saved to cache directory. Videos are rotated to match device's orientation.\n * Flipping camera during a recording results in stopping it.\n * @param options A map of `CameraRecordingOptions` type.\n * @return Returns a Promise that resolves to an object containing video file `uri` property and a `codec` property on iOS.\n * The Promise is returned if `stopRecording` was invoked, one of `maxDuration` and `maxFileSize` is reached or camera preview is stopped.\n * @platform android\n * @platform ios\n */\n async recordAsync(options?: CameraRecordingOptions) {\n const recordingOptions = ensureRecordingOptions(options);\n return this._cameraRef.current?.record(recordingOptions);\n }\n\n /**\n * Stops recording if any is in progress.\n */\n stopRecording() {\n this._cameraRef.current?.stopRecording();\n }\n\n _onCameraReady = () => {\n if (this.props.onCameraReady) {\n this.props.onCameraReady();\n }\n };\n\n _onMountError = ({ nativeEvent }: { nativeEvent: { message: string } }) => {\n if (this.props.onMountError) {\n this.props.onMountError(nativeEvent);\n }\n };\n\n _onResponsiveOrientationChanged = ({\n nativeEvent,\n }: {\n nativeEvent: { orientation: CameraOrientation };\n }) => {\n if (this.props.onResponsiveOrientationChanged) {\n this.props.onResponsiveOrientationChanged(nativeEvent);\n }\n };\n\n _onObjectDetected =\n (callback?: Function) =>\n ({ nativeEvent }: { nativeEvent: any }) => {\n const { type } = nativeEvent;\n if (\n this._lastEvents[type] &&\n this._lastEventsTimes[type] &&\n JSON.stringify(nativeEvent) === this._lastEvents[type] &&\n new Date().getTime() - this._lastEventsTimes[type].getTime() < EventThrottleMs\n ) {\n return;\n }\n\n if (callback) {\n callback(nativeEvent);\n this._lastEventsTimes[type] = new Date();\n this._lastEvents[type] = JSON.stringify(nativeEvent);\n }\n };\n\n _setReference = (ref: Ref<CameraViewRef>) => {\n if (ref) {\n // TODO(Bacon): Unify these - perhaps with hooks?\n if (Platform.OS === 'web') {\n this._cameraHandle = ref as any;\n }\n }\n };\n\n render() {\n const nativeProps = ensureNativeProps(this.props);\n const onBarcodeScanned = this.props.onBarcodeScanned\n ? this._onObjectDetected(this.props.onBarcodeScanned)\n : undefined;\n\n return (\n <ExpoCamera\n {...nativeProps}\n ref={this._cameraRef}\n onCameraReady={this._onCameraReady}\n onMountError={this._onMountError}\n onBarcodeScanned={onBarcodeScanned}\n onPictureSaved={_onPictureSaved}\n onResponsiveOrientationChanged={this._onResponsiveOrientationChanged}\n />\n );\n }\n}\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"ExpoCamera.web.js","sourceRoot":"","sources":["../src/ExpoCamera.web.tsx"],"names":[],"mappings":"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","sourcesContent":["import { CodedError } from 'expo-modules-core';\nimport {\n type PropsWithChildren,\n forwardRef,\n useRef,\n useMemo,\n useImperativeHandle,\n type ComponentProps,\n type Ref,\n} from 'react';\nimport { StyleProp, StyleSheet, View, ViewStyle } from 'react-native';\nimport createElement from 'react-native-web/dist/exports/createElement';\n\nimport {\n CameraNativeProps,\n CameraCapturedPicture,\n CameraPictureOptions,\n CameraType,\n} from './Camera.types';\nimport CameraManager from './ExpoCameraManager.web';\nimport { capture } from './web/WebCameraUtils';\nimport { PictureSizes } from './web/WebConstants';\nimport { useWebCameraStream } from './web/useWebCameraStream';\nimport { useWebQRScanner } from './web/useWebQRScanner';\n\nexport interface ExponentCameraRef {\n getAvailablePictureSizes: (ratio: string) => Promise<string[]>;\n takePicture: (options: CameraPictureOptions) => Promise<CameraCapturedPicture>;\n resumePreview: () => Promise<void>;\n pausePreview: () => Promise<void>;\n}\n\nconst ExponentCamera = forwardRef(\n (\n { facing, poster, ...props }: PropsWithChildren<CameraNativeProps>,\n ref: Ref<ExponentCameraRef>\n ) => {\n const video = useRef<HTMLVideoElement | null>(null);\n\n const native = useWebCameraStream(video, facing as CameraType, props, {\n onCameraReady() {\n if (props.onCameraReady) {\n props.onCameraReady();\n }\n },\n onMountError: props.onMountError,\n });\n\n const isQRScannerEnabled = useMemo<boolean>(() => {\n return Boolean(\n props.barcodeScannerSettings?.barcodeTypes?.includes('qr') && !!props.onBarcodeScanned\n );\n }, [props.barcodeScannerSettings?.barcodeTypes, props.onBarcodeScanned]);\n\n useWebQRScanner(video, {\n interval: 300,\n isEnabled: isQRScannerEnabled,\n captureOptions: { scale: 1, isImageMirror: native.type === 'front' },\n onScanned(event) {\n if (props.onBarcodeScanned) {\n props.onBarcodeScanned(event);\n }\n },\n });\n\n useImperativeHandle(\n ref,\n () => ({\n async getAvailablePictureSizes(): Promise<string[]> {\n return PictureSizes;\n },\n async takePicture(options: CameraPictureOptions): Promise<CameraCapturedPicture> {\n if (!video.current || video.current?.readyState !== video.current?.HAVE_ENOUGH_DATA) {\n throw new CodedError(\n 'ERR_CAMERA_NOT_READY',\n 'HTMLVideoElement does not have enough camera data to construct an image yet.'\n );\n }\n const settings = native.mediaTrackSettings;\n if (!settings) {\n throw new CodedError('ERR_CAMERA_NOT_READY', 'MediaStream is not ready yet.');\n }\n\n return capture(video.current, settings, {\n ...options,\n // This will always be defined, the option gets added to a queue in the upper-level. We should replace the original so it isn't called twice.\n onPictureSaved(picture) {\n if (options.onPictureSaved) {\n options.onPictureSaved(picture);\n }\n if (props.onPictureSaved) {\n props.onPictureSaved({ nativeEvent: { data: picture, id: -1 } });\n }\n },\n });\n },\n async resumePreview(): Promise<void> {\n if (video.current) {\n video.current.play();\n }\n },\n async pausePreview(): Promise<void> {\n if (video.current) {\n video.current.pause();\n }\n },\n }),\n [native.mediaTrackSettings, props.onPictureSaved]\n );\n\n // TODO(Bacon): Create a universal prop, on native the microphone is only used when recording videos.\n // Because we don't support recording video in the browser we don't need the user to give microphone permissions.\n const isMuted = true;\n\n const style = useMemo<StyleProp<ViewStyle>>(() => {\n const isFrontFacingCamera = native.type === CameraManager.Type.front;\n return [\n StyleSheet.absoluteFill,\n styles.video,\n {\n // Flip the camera\n transform: isFrontFacingCamera ? [{ scaleX: -1 }] : undefined,\n },\n ];\n }, [native.type]);\n\n return (\n <View pointerEvents=\"box-none\" style={[styles.videoWrapper, props.style]}>\n <Video\n autoPlay\n playsInline\n muted={isMuted}\n poster={poster}\n pointerEvents={props.pointerEvents}\n ref={video}\n style={style}\n />\n {props.children}\n </View>\n );\n }\n);\n\nexport default ExponentCamera;\n\nconst Video = forwardRef(\n (\n props: ComponentProps<typeof View> & {\n autoPlay?: boolean;\n playsInline?: boolean;\n muted?: boolean;\n poster?: string;\n },\n ref: Ref<HTMLVideoElement>\n ) => createElement('video', { ...props, ref })\n);\n\nconst styles = StyleSheet.create({\n videoWrapper: {\n flex: 1,\n alignItems: 'stretch',\n },\n video: {\n width: '100%',\n height: '100%',\n objectFit: 'cover',\n },\n});\n"]}
1
+ {"version":3,"file":"ExpoCamera.web.js","sourceRoot":"","sources":["../src/ExpoCamera.web.tsx"],"names":[],"mappings":"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","sourcesContent":["import { CodedError } from 'expo-modules-core';\nimport {\n type PropsWithChildren,\n forwardRef,\n useRef,\n useMemo,\n useImperativeHandle,\n type ComponentProps,\n type Ref,\n} from 'react';\nimport { StyleProp, StyleSheet, View, ViewStyle } from 'react-native';\nimport createElement from 'react-native-web/dist/exports/createElement';\n\nimport {\n CameraNativeProps,\n CameraCapturedPicture,\n CameraPictureOptions,\n CameraType,\n} from './Camera.types';\nimport CameraManager from './ExpoCameraManager.web';\nimport { capture } from './web/WebCameraUtils';\nimport { PictureSizes } from './web/WebConstants';\nimport { useWebCameraStream } from './web/useWebCameraStream';\nimport { useWebQRScanner } from './web/useWebQRScanner';\n\nexport interface ExponentCameraRef {\n getAvailablePictureSizes: (ratio: string) => Promise<string[]>;\n takePicture: (options: CameraPictureOptions) => Promise<CameraCapturedPicture>;\n resumePreview: () => Promise<void>;\n pausePreview: () => Promise<void>;\n}\n\nconst ExponentCamera = forwardRef(\n (\n { facing, poster, ...props }: PropsWithChildren<CameraNativeProps>,\n ref: Ref<ExponentCameraRef>\n ) => {\n const video = useRef<HTMLVideoElement | null>(null);\n\n const native = useWebCameraStream(video, facing as CameraType, props, {\n onCameraReady() {\n if (props.onCameraReady) {\n props.onCameraReady();\n }\n },\n onMountError: props.onMountError,\n });\n\n const isQRScannerEnabled = useMemo<boolean>(() => {\n return Boolean(\n props.barcodeScannerSettings?.barcodeTypes?.includes('qr') && !!props.onBarcodeScanned\n );\n }, [props.barcodeScannerSettings?.barcodeTypes, props.onBarcodeScanned]);\n\n useWebQRScanner(video, {\n interval: 300,\n isEnabled: isQRScannerEnabled,\n captureOptions: { scale: 1, isImageMirror: native.type === 'front' },\n onScanned(event) {\n if (props.onBarcodeScanned) {\n props.onBarcodeScanned(event);\n }\n },\n });\n\n useImperativeHandle(\n ref,\n () => ({\n async getAvailablePictureSizes(): Promise<string[]> {\n return PictureSizes;\n },\n async takePicture(options: CameraPictureOptions): Promise<CameraCapturedPicture> {\n if (!video.current || video.current?.readyState !== video.current?.HAVE_ENOUGH_DATA) {\n throw new CodedError(\n 'ERR_CAMERA_NOT_READY',\n 'HTMLVideoElement does not have enough camera data to construct an image yet.'\n );\n }\n const settings = native.mediaTrackSettings;\n if (!settings) {\n throw new CodedError('ERR_CAMERA_NOT_READY', 'MediaStream is not ready yet.');\n }\n\n return capture(video.current, settings, {\n ...options,\n // This will always be defined, the option gets added to a queue in the upper-level. We should replace the original so it isn't called twice.\n onPictureSaved(picture) {\n if (options.onPictureSaved) {\n options.onPictureSaved(picture);\n }\n if (props.onPictureSaved) {\n props.onPictureSaved({ nativeEvent: { data: picture, id: -1 } });\n }\n },\n });\n },\n async resumePreview(): Promise<void> {\n if (video.current) {\n video.current.play();\n }\n },\n async pausePreview(): Promise<void> {\n if (video.current) {\n video.current.pause();\n }\n },\n }),\n [native.mediaTrackSettings, props.onPictureSaved]\n );\n\n // TODO(Bacon): Create a universal prop, on native the microphone is only used when recording videos.\n // Because we don't support recording video in the browser we don't need the user to give microphone permissions.\n const isMuted = true;\n\n const style = useMemo<StyleProp<ViewStyle>>(() => {\n const isFrontFacingCamera = native.type === CameraManager.Type.front;\n return [\n StyleSheet.absoluteFill,\n styles.video,\n {\n // Flip the camera\n transform: isFrontFacingCamera ? [{ scaleX: -1 }] : undefined,\n },\n ];\n }, [native.type]);\n\n return (\n <View pointerEvents=\"box-none\" style={[styles.videoWrapper, props.style]}>\n <Video\n autoPlay\n playsInline\n muted={isMuted}\n poster={poster}\n pointerEvents={props.pointerEvents}\n ref={video}\n style={style}\n />\n {props.children}\n </View>\n );\n }\n);\n\nexport default ExponentCamera;\n\nconst Video = forwardRef(\n (\n props: ComponentProps<typeof View> & {\n autoPlay?: boolean;\n playsInline?: boolean;\n muted?: boolean;\n poster?: string;\n },\n ref: Ref<HTMLVideoElement>\n ) => createElement('video', { ...props, ref })\n);\n\nconst styles = StyleSheet.create({\n videoWrapper: {\n flex: 1,\n alignItems: 'stretch',\n },\n video: {\n width: '100%',\n height: '100%',\n objectFit: 'cover',\n },\n});\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"ExpoCameraManager.web.js","sourceRoot":"","sources":["../src/ExpoCameraManager.web.ts"],"names":[],"mappings":"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","sourcesContent":["import { UnavailabilityError } from 'expo-modules-core';\n\nimport {\n CameraCapturedPicture,\n CameraPictureOptions,\n PermissionResponse,\n PermissionStatus,\n} from './Camera.types';\nimport { ExponentCameraRef } from './ExpoCamera.web';\nimport {\n canGetUserMedia,\n isBackCameraAvailableAsync,\n isFrontCameraAvailableAsync,\n} from './web/WebUserMediaManager';\n\nfunction getUserMedia(constraints: MediaStreamConstraints): Promise<MediaStream> {\n if (navigator.mediaDevices && navigator.mediaDevices.getUserMedia) {\n return navigator.mediaDevices.getUserMedia(constraints);\n }\n\n // Some browsers partially implement mediaDevices. We can't just assign an object\n // with getUserMedia as it would overwrite existing properties.\n // Here, we will just add the getUserMedia property if it's missing.\n\n // First get ahold of the legacy getUserMedia, if present\n const getUserMedia =\n // TODO: this method is deprecated, migrate to https://developer.mozilla.org/en-US/docs/Web/API/MediaDevices/getUserMedia\n navigator.getUserMedia ||\n navigator.webkitGetUserMedia ||\n navigator.mozGetUserMedia ||\n function () {\n const error: any = new Error('Permission unimplemented');\n error.code = 0;\n error.name = 'NotAllowedError';\n throw error;\n };\n\n return new Promise((resolve, reject) => {\n getUserMedia.call(navigator, constraints, resolve, reject);\n });\n}\n\nfunction handleGetUserMediaError({ message }: { message: string }): PermissionResponse {\n // name: NotAllowedError\n // code: 0\n if (message === 'Permission dismissed') {\n return {\n status: PermissionStatus.UNDETERMINED,\n expires: 'never',\n canAskAgain: true,\n granted: false,\n };\n } else {\n // TODO: Bacon: [OSX] The system could deny access to chrome.\n // TODO: Bacon: add: { status: 'unimplemented' }\n return {\n status: PermissionStatus.DENIED,\n expires: 'never',\n canAskAgain: true,\n granted: false,\n };\n }\n}\n\nasync function handleRequestPermissionsAsync(): Promise<PermissionResponse> {\n try {\n await getUserMedia({\n video: true,\n });\n return {\n status: PermissionStatus.GRANTED,\n expires: 'never',\n canAskAgain: true,\n granted: true,\n };\n } catch ({ message }) {\n return handleGetUserMediaError({ message });\n }\n}\n\nasync function handlePermissionsQueryAsync(\n query: 'camera' | 'microphone'\n): Promise<PermissionResponse> {\n if (!navigator?.permissions?.query) {\n throw new UnavailabilityError('expo-camera', 'navigator.permissions API is not available');\n }\n\n try {\n const { state } = await navigator.permissions.query({ name: query });\n switch (state) {\n case 'prompt':\n return {\n status: PermissionStatus.UNDETERMINED,\n expires: 'never',\n canAskAgain: true,\n granted: false,\n };\n case 'granted':\n return {\n status: PermissionStatus.GRANTED,\n expires: 'never',\n canAskAgain: true,\n granted: true,\n };\n case 'denied':\n return {\n status: PermissionStatus.DENIED,\n expires: 'never',\n canAskAgain: true,\n granted: false,\n };\n }\n } catch (e) {\n // Firefox doesn't support querying for the camera permission, so return undetermined status\n if (e instanceof TypeError) {\n return {\n status: PermissionStatus.UNDETERMINED,\n expires: 'never',\n canAskAgain: true,\n granted: false,\n };\n }\n throw e;\n }\n}\n\nexport default {\n get Type() {\n return {\n back: 'back',\n front: 'front',\n };\n },\n get FlashMode() {\n return {\n on: 'on',\n off: 'off',\n auto: 'auto',\n torch: 'torch',\n };\n },\n get AutoFocus() {\n return {\n on: 'on',\n off: 'off',\n auto: 'auto',\n singleShot: 'singleShot',\n };\n },\n get WhiteBalance() {\n return {\n auto: 'auto',\n continuous: 'continuous',\n manual: 'manual',\n };\n },\n get VideoQuality() {\n return {};\n },\n get VideoStabilization() {\n return {};\n },\n async isAvailableAsync(): Promise<boolean> {\n return canGetUserMedia();\n },\n async takePicture(\n options: CameraPictureOptions,\n camera: ExponentCameraRef\n ): Promise<CameraCapturedPicture> {\n return await camera.takePicture(options);\n },\n async pausePreview(camera: ExponentCameraRef): Promise<void> {\n await camera.pausePreview();\n },\n async resumePreview(camera: ExponentCameraRef): Promise<void> {\n return await camera.resumePreview();\n },\n async getAvailableCameraTypesAsync(): Promise<string[]> {\n if (!canGetUserMedia() || !navigator.mediaDevices.enumerateDevices) return [];\n\n const devices = await navigator.mediaDevices.enumerateDevices();\n\n const types: (string | null)[] = await Promise.all([\n (await isFrontCameraAvailableAsync(devices)) && 'front',\n (await isBackCameraAvailableAsync()) && 'back',\n ]);\n\n return types.filter(Boolean) as string[];\n },\n async getAvailablePictureSizes(ratio: string, camera: ExponentCameraRef): Promise<string[]> {\n return await camera.getAvailablePictureSizes(ratio);\n },\n /* async getSupportedRatios(camera: ExponentCameraRef): Promise<string[]> {\n // TODO: Support on web\n },\n async record(\n options?: CameraRecordingOptions,\n camera: ExponentCameraRef\n ): Promise<{ uri: string }> {\n // TODO: Support on web\n },\n async stopRecording(camera: ExponentCameraRef): Promise<void> {\n // TODO: Support on web\n }, */\n async getPermissionsAsync(): Promise<PermissionResponse> {\n return handlePermissionsQueryAsync('camera');\n },\n async requestPermissionsAsync(): Promise<PermissionResponse> {\n return handleRequestPermissionsAsync();\n },\n async getCameraPermissionsAsync(): Promise<PermissionResponse> {\n return handlePermissionsQueryAsync('camera');\n },\n async requestCameraPermissionsAsync(): Promise<PermissionResponse> {\n return handleRequestPermissionsAsync();\n },\n async getMicrophonePermissionsAsync(): Promise<PermissionResponse> {\n return handlePermissionsQueryAsync('microphone');\n },\n async requestMicrophonePermissionsAsync(): Promise<PermissionResponse> {\n try {\n await getUserMedia({\n audio: true,\n });\n return {\n status: PermissionStatus.GRANTED,\n expires: 'never',\n canAskAgain: true,\n granted: true,\n };\n } catch ({ message }) {\n return handleGetUserMediaError({ message });\n }\n },\n};\n"]}
1
+ {"version":3,"file":"ExpoCameraManager.web.js","sourceRoot":"","sources":["../src/ExpoCameraManager.web.ts"],"names":[],"mappings":"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","sourcesContent":["import { UnavailabilityError } from 'expo-modules-core';\n\nimport {\n CameraCapturedPicture,\n CameraPictureOptions,\n PermissionResponse,\n PermissionStatus,\n} from './Camera.types';\nimport { ExponentCameraRef } from './ExpoCamera.web';\nimport {\n canGetUserMedia,\n isBackCameraAvailableAsync,\n isFrontCameraAvailableAsync,\n} from './web/WebUserMediaManager';\n\nfunction getUserMedia(constraints: MediaStreamConstraints): Promise<MediaStream> {\n if (navigator.mediaDevices && navigator.mediaDevices.getUserMedia) {\n return navigator.mediaDevices.getUserMedia(constraints);\n }\n\n // Some browsers partially implement mediaDevices. We can't just assign an object\n // with getUserMedia as it would overwrite existing properties.\n // Here, we will just add the getUserMedia property if it's missing.\n\n // First get ahold of the legacy getUserMedia, if present\n const getUserMedia =\n // TODO: this method is deprecated, migrate to https://developer.mozilla.org/en-US/docs/Web/API/MediaDevices/getUserMedia\n navigator.getUserMedia ||\n navigator.webkitGetUserMedia ||\n navigator.mozGetUserMedia ||\n function () {\n const error: any = new Error('Permission unimplemented');\n error.code = 0;\n error.name = 'NotAllowedError';\n throw error;\n };\n\n return new Promise((resolve, reject) => {\n getUserMedia.call(navigator, constraints, resolve, reject);\n });\n}\n\nfunction handleGetUserMediaError({ message }: { message: string }): PermissionResponse {\n // name: NotAllowedError\n // code: 0\n if (message === 'Permission dismissed') {\n return {\n status: PermissionStatus.UNDETERMINED,\n expires: 'never',\n canAskAgain: true,\n granted: false,\n };\n } else {\n // TODO: Bacon: [OSX] The system could deny access to chrome.\n // TODO: Bacon: add: { status: 'unimplemented' }\n return {\n status: PermissionStatus.DENIED,\n expires: 'never',\n canAskAgain: true,\n granted: false,\n };\n }\n}\n\nasync function handleRequestPermissionsAsync(): Promise<PermissionResponse> {\n try {\n await getUserMedia({\n video: true,\n });\n return {\n status: PermissionStatus.GRANTED,\n expires: 'never',\n canAskAgain: true,\n granted: true,\n };\n } catch ({ message }) {\n return handleGetUserMediaError({ message });\n }\n}\n\nasync function handlePermissionsQueryAsync(\n query: 'camera' | 'microphone'\n): Promise<PermissionResponse> {\n if (!navigator?.permissions?.query) {\n throw new UnavailabilityError('expo-camera', 'navigator.permissions API is not available');\n }\n\n try {\n const { state } = await navigator.permissions.query({ name: query });\n switch (state) {\n case 'prompt':\n return {\n status: PermissionStatus.UNDETERMINED,\n expires: 'never',\n canAskAgain: true,\n granted: false,\n };\n case 'granted':\n return {\n status: PermissionStatus.GRANTED,\n expires: 'never',\n canAskAgain: true,\n granted: true,\n };\n case 'denied':\n return {\n status: PermissionStatus.DENIED,\n expires: 'never',\n canAskAgain: true,\n granted: false,\n };\n }\n } catch (e) {\n // Firefox doesn't support querying for the camera permission, so return undetermined status\n if (e instanceof TypeError) {\n return {\n status: PermissionStatus.UNDETERMINED,\n expires: 'never',\n canAskAgain: true,\n granted: false,\n };\n }\n throw e;\n }\n}\n\nexport default {\n get Type() {\n return {\n back: 'back',\n front: 'front',\n };\n },\n get FlashMode() {\n return {\n on: 'on',\n off: 'off',\n auto: 'auto',\n torch: 'torch',\n };\n },\n get AutoFocus() {\n return {\n on: 'on',\n off: 'off',\n auto: 'auto',\n singleShot: 'singleShot',\n };\n },\n get WhiteBalance() {\n return {\n auto: 'auto',\n continuous: 'continuous',\n manual: 'manual',\n };\n },\n get VideoQuality() {\n return {};\n },\n get VideoStabilization() {\n return {};\n },\n async isAvailableAsync(): Promise<boolean> {\n return canGetUserMedia();\n },\n async takePicture(\n options: CameraPictureOptions,\n camera: ExponentCameraRef\n ): Promise<CameraCapturedPicture> {\n return await camera.takePicture(options);\n },\n async pausePreview(camera: ExponentCameraRef): Promise<void> {\n await camera.pausePreview();\n },\n async resumePreview(camera: ExponentCameraRef): Promise<void> {\n return await camera.resumePreview();\n },\n async getAvailableCameraTypesAsync(): Promise<string[]> {\n if (!canGetUserMedia() || !navigator.mediaDevices.enumerateDevices) return [];\n\n const devices = await navigator.mediaDevices.enumerateDevices();\n\n const types: (string | null)[] = await Promise.all([\n (await isFrontCameraAvailableAsync(devices)) && 'front',\n (await isBackCameraAvailableAsync()) && 'back',\n ]);\n\n return types.filter(Boolean) as string[];\n },\n async getAvailablePictureSizes(ratio: string, camera: ExponentCameraRef): Promise<string[]> {\n return await camera.getAvailablePictureSizes(ratio);\n },\n /* async getSupportedRatios(camera: ExponentCameraRef): Promise<string[]> {\n // TODO: Support on web\n },\n async record(\n options?: CameraRecordingOptions,\n camera: ExponentCameraRef\n ): Promise<{ uri: string }> {\n // TODO: Support on web\n },\n async stopRecording(camera: ExponentCameraRef): Promise<void> {\n // TODO: Support on web\n }, */\n async getPermissionsAsync(): Promise<PermissionResponse> {\n return handlePermissionsQueryAsync('camera');\n },\n async requestPermissionsAsync(): Promise<PermissionResponse> {\n return handleRequestPermissionsAsync();\n },\n async getCameraPermissionsAsync(): Promise<PermissionResponse> {\n return handlePermissionsQueryAsync('camera');\n },\n async requestCameraPermissionsAsync(): Promise<PermissionResponse> {\n return handleRequestPermissionsAsync();\n },\n async getMicrophonePermissionsAsync(): Promise<PermissionResponse> {\n return handlePermissionsQueryAsync('microphone');\n },\n async requestMicrophonePermissionsAsync(): Promise<PermissionResponse> {\n try {\n await getUserMedia({\n audio: true,\n });\n return {\n status: PermissionStatus.GRANTED,\n expires: 'never',\n canAskAgain: true,\n granted: true,\n };\n } catch ({ message }) {\n return handleGetUserMediaError({ message });\n }\n },\n};\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"props.js","sourceRoot":"","sources":["../../src/utils/props.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,mBAAmB,CAAC;AAG7C,OAAO,aAAa,MAAM,sBAAsB,CAAC;AAEjD,2EAA2E;AAC3E,MAAM,CAAC,MAAM,gBAAgB,GAGzB;IACF,IAAI,EAAE,aAAa,CAAC,IAAI;IACxB,KAAK,EAAE,aAAa,CAAC,SAAS;CAC/B,CAAC;AAEF,MAAM,UAAU,kBAAkB,CAAC,KAAuB;IACxD,IAAI,CAAC,KAAK,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE;QACvC,OAAO,EAAE,CAAC;KACX;IAED,MAAM,WAAW,GAAsB,EAAE,CAAC;IAE1C,KAAK,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE;QAChD,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,gBAAgB,CAAC,GAAG,CAAC,EAAE;YACtD,WAAW,CAAC,GAAG,CAAC,GAAG,gBAAgB,CAAC,GAAG,CAAC,CAAC,KAAK,CAAC,CAAC;SACjD;aAAM;YACL,WAAW,CAAC,GAAG,CAAC,GAAG,KAAK,CAAC;SAC1B;KACF;IAED,OAAO,WAAW,CAAC;AACrB,CAAC;AAED,MAAM,UAAU,iBAAiB,CAAC,KAAuB;IACvD,MAAM,QAAQ,GAAG,kBAAkB,CAAC,KAAK,CAAC,CAAC;IAE3C,QAAQ,CAAC,qBAAqB,GAAG,CAAC,CAAC,KAAK,EAAE,gBAAgB,CAAC;IAC3D,QAAQ,CAAC,SAAS,GAAG,KAAK,EAAE,KAAK,IAAI,KAAK,CAAC;IAC3C,QAAQ,CAAC,IAAI,GAAG,KAAK,EAAE,IAAI,IAAI,KAAK,CAAC;IACrC,QAAQ,CAAC,SAAS,GAAG,KAAK,EAAE,SAAS,IAAI,KAAK,CAAC;IAE/C,IAAI,QAAQ,CAAC,EAAE,KAAK,KAAK,EAAE;QACzB,OAAO,QAAQ,CAAC,MAAM,CAAC;KACxB;IAED,OAAO,QAAQ,CAAC;AAClB,CAAC","sourcesContent":["import { Platform } from 'expo-modules-core';\n\nimport { CameraNativeProps, CameraType, FlashMode, CameraViewProps } from '../Camera.types';\nimport CameraManager from '../ExpoCameraManager';\n\n// Values under keys from this object will be transformed to native options\nexport const ConversionTables: {\n type: Record<keyof CameraType, CameraNativeProps['facing']>;\n flash: Record<keyof FlashMode, CameraNativeProps['flashMode']>;\n} = {\n type: CameraManager.Type,\n flash: CameraManager.FlashMode,\n};\n\nexport function convertNativeProps(props?: CameraViewProps): CameraNativeProps {\n if (!props || typeof props !== 'object') {\n return {};\n }\n\n const nativeProps: CameraNativeProps = {};\n\n for (const [key, value] of Object.entries(props)) {\n if (typeof value === 'string' && ConversionTables[key]) {\n nativeProps[key] = ConversionTables[key][value];\n } else {\n nativeProps[key] = value;\n }\n }\n\n return nativeProps;\n}\n\nexport function ensureNativeProps(props?: CameraViewProps): CameraNativeProps {\n const newProps = convertNativeProps(props);\n\n newProps.barcodeScannerEnabled = !!props?.onBarcodeScanned;\n newProps.flashMode = props?.flash ?? 'off';\n newProps.mute = props?.mute ?? false;\n newProps.autoFocus = props?.autofocus ?? 'off';\n\n if (Platform.OS !== 'web') {\n delete newProps.poster;\n }\n\n return newProps;\n}\n"]}
1
+ {"version":3,"file":"props.js","sourceRoot":"","sources":["../../src/utils/props.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,mBAAmB,CAAC;AAG7C,OAAO,aAAa,MAAM,sBAAsB,CAAC;AAEjD,2EAA2E;AAC3E,MAAM,CAAC,MAAM,gBAAgB,GAGzB;IACF,IAAI,EAAE,aAAa,CAAC,IAAI;IACxB,KAAK,EAAE,aAAa,CAAC,SAAS;CAC/B,CAAC;AAEF,MAAM,UAAU,kBAAkB,CAAC,KAAuB;IACxD,IAAI,CAAC,KAAK,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE,CAAC;QACxC,OAAO,EAAE,CAAC;IACZ,CAAC;IAED,MAAM,WAAW,GAAsB,EAAE,CAAC;IAE1C,KAAK,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC;QACjD,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,gBAAgB,CAAC,GAAG,CAAC,EAAE,CAAC;YACvD,WAAW,CAAC,GAAG,CAAC,GAAG,gBAAgB,CAAC,GAAG,CAAC,CAAC,KAAK,CAAC,CAAC;QAClD,CAAC;aAAM,CAAC;YACN,WAAW,CAAC,GAAG,CAAC,GAAG,KAAK,CAAC;QAC3B,CAAC;IACH,CAAC;IAED,OAAO,WAAW,CAAC;AACrB,CAAC;AAED,MAAM,UAAU,iBAAiB,CAAC,KAAuB;IACvD,MAAM,QAAQ,GAAG,kBAAkB,CAAC,KAAK,CAAC,CAAC;IAE3C,QAAQ,CAAC,qBAAqB,GAAG,CAAC,CAAC,KAAK,EAAE,gBAAgB,CAAC;IAC3D,QAAQ,CAAC,SAAS,GAAG,KAAK,EAAE,KAAK,IAAI,KAAK,CAAC;IAC3C,QAAQ,CAAC,IAAI,GAAG,KAAK,EAAE,IAAI,IAAI,KAAK,CAAC;IACrC,QAAQ,CAAC,SAAS,GAAG,KAAK,EAAE,SAAS,IAAI,KAAK,CAAC;IAE/C,IAAI,QAAQ,CAAC,EAAE,KAAK,KAAK,EAAE,CAAC;QAC1B,OAAO,QAAQ,CAAC,MAAM,CAAC;IACzB,CAAC;IAED,OAAO,QAAQ,CAAC;AAClB,CAAC","sourcesContent":["import { Platform } from 'expo-modules-core';\n\nimport { CameraNativeProps, CameraType, FlashMode, CameraViewProps } from '../Camera.types';\nimport CameraManager from '../ExpoCameraManager';\n\n// Values under keys from this object will be transformed to native options\nexport const ConversionTables: {\n type: Record<keyof CameraType, CameraNativeProps['facing']>;\n flash: Record<keyof FlashMode, CameraNativeProps['flashMode']>;\n} = {\n type: CameraManager.Type,\n flash: CameraManager.FlashMode,\n};\n\nexport function convertNativeProps(props?: CameraViewProps): CameraNativeProps {\n if (!props || typeof props !== 'object') {\n return {};\n }\n\n const nativeProps: CameraNativeProps = {};\n\n for (const [key, value] of Object.entries(props)) {\n if (typeof value === 'string' && ConversionTables[key]) {\n nativeProps[key] = ConversionTables[key][value];\n } else {\n nativeProps[key] = value;\n }\n }\n\n return nativeProps;\n}\n\nexport function ensureNativeProps(props?: CameraViewProps): CameraNativeProps {\n const newProps = convertNativeProps(props);\n\n newProps.barcodeScannerEnabled = !!props?.onBarcodeScanned;\n newProps.flashMode = props?.flash ?? 'off';\n newProps.mute = props?.mute ?? false;\n newProps.autoFocus = props?.autofocus ?? 'off';\n\n if (Platform.OS !== 'web') {\n delete newProps.poster;\n }\n\n return newProps;\n}\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"WebCameraUtils.js","sourceRoot":"","sources":["../../src/web/WebCameraUtils.ts"],"names":[],"mappings":"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","sourcesContent":["/* eslint-env browser */\nimport invariant from 'invariant';\n\nimport * as CapabilityUtils from './WebCapabilityUtils';\nimport { CameraTypeToFacingMode, ImageTypeFormat, MinimumConstraints } from './WebConstants';\nimport { requestUserMediaAsync } from './WebUserMediaManager';\nimport {\n CameraType,\n CameraCapturedPicture,\n ImageSize,\n ImageType,\n WebCameraSettings,\n CameraPictureOptions,\n} from '../Camera.types';\n\ninterface ConstrainLongRange {\n max?: number;\n min?: number;\n exact?: number;\n ideal?: number;\n}\n\nexport function getImageSize(videoWidth: number, videoHeight: number, scale: number): ImageSize {\n const width = videoWidth * scale;\n const ratio = videoWidth / width;\n const height = videoHeight / ratio;\n\n return {\n width,\n height,\n };\n}\n\nexport function toDataURL(\n canvas: HTMLCanvasElement,\n imageType: ImageType,\n quality: number\n): string {\n const types = ['png', 'jpg'];\n invariant(\n types.includes(imageType),\n `expo-camera: ${imageType} is not a valid ImageType. Expected a string from: ${types.join(', ')}`\n );\n\n const format = ImageTypeFormat[imageType];\n if (imageType === 'jpg') {\n invariant(\n quality <= 1 && quality >= 0,\n `expo-camera: ${quality} is not a valid image quality. Expected a number from 0...1`\n );\n return canvas.toDataURL(format, quality);\n } else {\n return canvas.toDataURL(format);\n }\n}\n\nexport function hasValidConstraints(\n preferredCameraType?: CameraType,\n width?: number | ConstrainLongRange,\n height?: number | ConstrainLongRange\n): boolean {\n return preferredCameraType !== undefined && width !== undefined && height !== undefined;\n}\n\nfunction ensureCameraPictureOptions(config: CameraPictureOptions): CameraPictureOptions {\n const captureOptions = {\n scale: 1,\n imageType: 'png' as ImageType,\n isImageMirror: false,\n };\n\n for (const key in config) {\n if (key in config && config[key] !== undefined && key in captureOptions) {\n captureOptions[key] = config[key];\n }\n }\n return captureOptions;\n}\n\nconst DEFAULT_QUALITY = 0.92;\n\nexport function captureImageData(\n video: HTMLVideoElement | null,\n pictureOptions: Pick<CameraPictureOptions, 'scale' | 'isImageMirror'> = {}\n): ImageData | null {\n if (!video || video.readyState !== video.HAVE_ENOUGH_DATA) {\n return null;\n }\n const canvas = captureImageContext(video, pictureOptions);\n\n const context = canvas.getContext('2d', { alpha: false });\n if (!context || !canvas.width || !canvas.height) {\n return null;\n }\n\n const imageData = context.getImageData(0, 0, canvas.width, canvas.height);\n return imageData;\n}\n\nexport function captureImageContext(\n video: HTMLVideoElement,\n { scale = 1, isImageMirror = false }: Pick<CameraPictureOptions, 'scale' | 'isImageMirror'>\n): HTMLCanvasElement {\n const { videoWidth, videoHeight } = video;\n const { width, height } = getImageSize(videoWidth, videoHeight, scale!);\n\n // Build the canvas size and draw the camera image to the context from video\n const canvas = document.createElement('canvas');\n canvas.width = width;\n canvas.height = height;\n const context = canvas.getContext('2d', { alpha: false });\n\n if (!context) {\n // Should never be called\n throw new Error('Context is not defined');\n }\n // sharp image details\n // context.imageSmoothingEnabled = false;\n\n // Flip horizontally (as css transform: rotateY(180deg))\n if (isImageMirror) {\n context.setTransform(-1, 0, 0, 1, canvas.width, 0);\n }\n\n context.drawImage(video, 0, 0, width, height);\n\n return canvas;\n}\n\nexport function captureImage(\n video: HTMLVideoElement,\n pictureOptions: CameraPictureOptions\n): string {\n const config = ensureCameraPictureOptions(pictureOptions);\n const canvas = captureImageContext(video, config);\n const { imageType, quality = DEFAULT_QUALITY } = config;\n return toDataURL(canvas, imageType!, quality);\n}\n\nfunction getSupportedConstraints(): MediaTrackSupportedConstraints | null {\n if (navigator.mediaDevices && navigator.mediaDevices.getSupportedConstraints) {\n return navigator.mediaDevices.getSupportedConstraints();\n }\n return null;\n}\n\nexport function getIdealConstraints(\n preferredCameraType: CameraType,\n width?: number | ConstrainLongRange,\n height?: number | ConstrainLongRange\n): MediaStreamConstraints {\n const preferredConstraints: MediaStreamConstraints = {\n audio: false,\n video: {},\n };\n\n if (hasValidConstraints(preferredCameraType, width, height)) {\n return MinimumConstraints;\n }\n\n const supports = getSupportedConstraints();\n // TODO(Bacon): Test this\n if (!supports || !supports.facingMode || !supports.width || !supports.height) {\n return MinimumConstraints;\n }\n const types = ['front', 'back'];\n if (preferredCameraType && types.includes(preferredCameraType)) {\n const facingMode = CameraTypeToFacingMode[preferredCameraType];\n if (isWebKit()) {\n const key = facingMode === 'user' ? 'exact' : 'ideal';\n (preferredConstraints.video as MediaTrackConstraints).facingMode = {\n [key]: facingMode,\n };\n } else {\n (preferredConstraints.video as MediaTrackConstraints).facingMode = {\n ideal: CameraTypeToFacingMode[preferredCameraType],\n };\n }\n }\n\n if (isMediaTrackConstraints(preferredConstraints.video)) {\n preferredConstraints.video.width = width;\n preferredConstraints.video.height = height;\n }\n\n return preferredConstraints;\n}\n\nfunction isMediaTrackConstraints(input: any): input is MediaTrackConstraints {\n return input && typeof input.video !== 'boolean';\n}\n\n/**\n * Invoke getStreamDevice a second time with the opposing camera type if the preferred type cannot be retrieved.\n *\n * @param preferredCameraType\n * @param preferredWidth\n * @param preferredHeight\n */\nexport async function getPreferredStreamDevice(\n preferredCameraType: CameraType,\n preferredWidth?: number | ConstrainLongRange,\n preferredHeight?: number | ConstrainLongRange\n): Promise<MediaStream> {\n try {\n return await getStreamDevice(preferredCameraType, preferredWidth, preferredHeight);\n } catch (error) {\n // A hack on desktop browsers to ensure any camera is used.\n // eslint-disable-next-line no-undef\n if (error instanceof OverconstrainedError && error.constraint === 'facingMode') {\n const nextCameraType = preferredCameraType === 'back' ? 'front' : 'back';\n return await getStreamDevice(nextCameraType, preferredWidth, preferredHeight);\n }\n throw error;\n }\n}\n\nexport async function getStreamDevice(\n preferredCameraType: CameraType,\n preferredWidth?: number | ConstrainLongRange,\n preferredHeight?: number | ConstrainLongRange\n): Promise<MediaStream> {\n const constraints: MediaStreamConstraints = getIdealConstraints(\n preferredCameraType,\n preferredWidth,\n preferredHeight\n );\n const stream: MediaStream = await requestUserMediaAsync(constraints);\n return stream;\n}\n\nexport function isWebKit(): boolean {\n return /WebKit/.test(navigator.userAgent) && !/Edg/.test(navigator.userAgent);\n}\n\nexport function compareStreams(a: MediaStream | null, b: MediaStream | null): boolean {\n if (!a || !b) {\n return false;\n }\n const settingsA = a.getTracks()[0].getSettings();\n const settingsB = b.getTracks()[0].getSettings();\n return settingsA.deviceId === settingsB.deviceId;\n}\n\nexport function capture(\n video: HTMLVideoElement,\n settings: MediaTrackSettings,\n config: CameraPictureOptions\n): CameraCapturedPicture {\n const base64 = captureImage(video, config);\n\n const capturedPicture: CameraCapturedPicture = {\n uri: base64,\n base64,\n width: 0,\n height: 0,\n };\n\n if (settings) {\n const { width = 0, height = 0 } = settings;\n capturedPicture.width = width;\n capturedPicture.height = height;\n capturedPicture.exif = settings;\n }\n\n if (config.onPictureSaved) {\n config.onPictureSaved(capturedPicture);\n }\n return capturedPicture;\n}\n\nexport async function syncTrackCapabilities(\n cameraType: CameraType,\n stream: MediaStream | null,\n settings: WebCameraSettings = {}\n): Promise<void> {\n if (stream?.getVideoTracks) {\n await Promise.all(\n stream.getVideoTracks().map((track) => onCapabilitiesReady(cameraType, track, settings))\n );\n }\n}\n\n// https://developer.mozilla.org/en-US/docs/Web/API/MediaTrackConstraints\nasync function onCapabilitiesReady(\n cameraType: CameraType,\n track: MediaStreamTrack,\n settings: WebCameraSettings = {}\n): Promise<void> {\n if (typeof track.getCapabilities !== 'function') {\n return;\n }\n\n const capabilities = track.getCapabilities();\n\n // Create an empty object because if you set a constraint that isn't available an error will be thrown.\n const constraints: MediaTrackConstraintSet = {};\n\n // TODO(Bacon): Add `pointsOfInterest` support\n const clampedValues = [\n 'exposureCompensation',\n 'colorTemperature',\n 'iso',\n 'brightness',\n 'contrast',\n 'saturation',\n 'sharpness',\n 'focusDistance',\n 'zoom',\n ];\n\n for (const property of clampedValues) {\n if (capabilities[property]) {\n constraints[property] = convertNormalizedSetting(capabilities[property], settings[property]);\n }\n }\n\n function validatedInternalConstrainedValue<IConvertedType>(\n constraintKey: string,\n settingsKey: string,\n converter: (settingValue: any) => IConvertedType\n ) {\n const convertedSetting = converter(settings[settingsKey]);\n return validatedConstrainedValue({\n constraintKey,\n settingsKey,\n convertedSetting,\n capabilities,\n settings,\n cameraType,\n });\n }\n\n if (capabilities.focusMode && settings.autoFocus !== undefined) {\n constraints.focusMode = validatedInternalConstrainedValue<MediaTrackConstraintSet['focusMode']>(\n 'focusMode',\n 'autoFocus',\n CapabilityUtils.convertAutoFocusJSONToNative\n );\n }\n\n if (capabilities.torch && settings.flashMode !== undefined) {\n constraints.torch = validatedInternalConstrainedValue<MediaTrackConstraintSet['torch']>(\n 'torch',\n 'flashMode',\n CapabilityUtils.convertFlashModeJSONToNative\n );\n }\n\n if (capabilities.whiteBalanceMode && settings.whiteBalance !== undefined) {\n constraints.whiteBalanceMode = validatedInternalConstrainedValue<\n MediaTrackConstraintSet['whiteBalanceMode']\n >('whiteBalanceMode', 'whiteBalance', CapabilityUtils.convertWhiteBalanceJSONToNative);\n }\n\n try {\n await track.applyConstraints({ advanced: [constraints] });\n } catch (error) {\n if (__DEV__) console.warn('Failed to apply constraints', error);\n }\n}\n\nexport function stopMediaStream(stream: MediaStream | null) {\n if (!stream) {\n return;\n }\n if (stream.getAudioTracks) {\n stream.getAudioTracks().forEach((track) => track.stop());\n }\n if (stream.getVideoTracks) {\n stream.getVideoTracks().forEach((track) => track.stop());\n }\n if (isMediaStreamTrack(stream)) {\n stream.stop();\n }\n}\n\nexport function setVideoSource(\n video: HTMLVideoElement,\n stream: MediaStream | MediaSource | Blob | null\n): void {\n const createObjectURL = window.URL.createObjectURL ?? window.webkitURL.createObjectURL;\n\n if (typeof video.srcObject !== 'undefined') {\n video.srcObject = stream;\n } else if (typeof (video as any).mozSrcObject !== 'undefined') {\n (video as any).mozSrcObject = stream;\n } else if (stream && createObjectURL) {\n video.src = createObjectURL(stream as MediaSource | Blob);\n }\n\n if (!stream) {\n const revokeObjectURL = window.URL.revokeObjectURL ?? window.webkitURL.revokeObjectURL;\n const source = video.src ?? video.srcObject ?? (video as any).mozSrcObject;\n if (revokeObjectURL && typeof source === 'string') {\n revokeObjectURL(source);\n }\n }\n}\n\nexport function isCapabilityAvailable(video: HTMLVideoElement, keyName: string): boolean {\n const stream = video.srcObject;\n\n if (stream instanceof MediaStream) {\n const videoTrack = stream.getVideoTracks()[0];\n return videoTrack.getCapabilities?.()?.[keyName];\n }\n\n return false;\n}\n\nfunction isMediaStreamTrack(input: any): input is MediaStreamTrack {\n return typeof input.stop === 'function';\n}\n\nfunction convertNormalizedSetting(range: MediaSettingsRange, value?: number): number | undefined {\n if (!value) {\n return;\n }\n // convert the normalized incoming setting to the native camera zoom range\n const converted = convertRange(value, [range.min, range.max]);\n // clamp value so we don't get an error\n return Math.min(range.max, Math.max(range.min, converted));\n}\n\nfunction convertRange(value: number, r2: number[], r1: number[] = [0, 1]): number {\n return ((value - r1[0]) * (r2[1] - r2[0])) / (r1[1] - r1[0]) + r2[0];\n}\n\nfunction validatedConstrainedValue<T>(props: {\n constraintKey: string;\n settingsKey: string;\n convertedSetting: T;\n capabilities: MediaTrackCapabilities;\n settings: WebCameraSettings;\n cameraType: string;\n}): T | undefined {\n const { constraintKey, settingsKey, convertedSetting, capabilities, settings, cameraType } =\n props;\n const setting = settings[settingsKey];\n if (\n Array.isArray(capabilities[constraintKey]) &&\n convertedSetting &&\n !capabilities[constraintKey].includes(convertedSetting)\n ) {\n if (__DEV__) {\n // Only warn in dev mode.\n console.warn(\n ` { ${settingsKey}: \"${setting}\" } (converted to \"${convertedSetting}\" in the browser) is not supported for camera type \"${cameraType}\" in your browser. Using the default value instead.`\n );\n }\n return undefined;\n }\n return convertedSetting;\n}\n"]}
1
+ {"version":3,"file":"WebCameraUtils.js","sourceRoot":"","sources":["../../src/web/WebCameraUtils.ts"],"names":[],"mappings":"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","sourcesContent":["/* eslint-env browser */\nimport invariant from 'invariant';\n\nimport * as CapabilityUtils from './WebCapabilityUtils';\nimport { CameraTypeToFacingMode, ImageTypeFormat, MinimumConstraints } from './WebConstants';\nimport { requestUserMediaAsync } from './WebUserMediaManager';\nimport {\n CameraType,\n CameraCapturedPicture,\n ImageSize,\n ImageType,\n WebCameraSettings,\n CameraPictureOptions,\n} from '../Camera.types';\n\ninterface ConstrainLongRange {\n max?: number;\n min?: number;\n exact?: number;\n ideal?: number;\n}\n\nexport function getImageSize(videoWidth: number, videoHeight: number, scale: number): ImageSize {\n const width = videoWidth * scale;\n const ratio = videoWidth / width;\n const height = videoHeight / ratio;\n\n return {\n width,\n height,\n };\n}\n\nexport function toDataURL(\n canvas: HTMLCanvasElement,\n imageType: ImageType,\n quality: number\n): string {\n const types = ['png', 'jpg'];\n invariant(\n types.includes(imageType),\n `expo-camera: ${imageType} is not a valid ImageType. Expected a string from: ${types.join(', ')}`\n );\n\n const format = ImageTypeFormat[imageType];\n if (imageType === 'jpg') {\n invariant(\n quality <= 1 && quality >= 0,\n `expo-camera: ${quality} is not a valid image quality. Expected a number from 0...1`\n );\n return canvas.toDataURL(format, quality);\n } else {\n return canvas.toDataURL(format);\n }\n}\n\nexport function hasValidConstraints(\n preferredCameraType?: CameraType,\n width?: number | ConstrainLongRange,\n height?: number | ConstrainLongRange\n): boolean {\n return preferredCameraType !== undefined && width !== undefined && height !== undefined;\n}\n\nfunction ensureCameraPictureOptions(config: CameraPictureOptions): CameraPictureOptions {\n const captureOptions = {\n scale: 1,\n imageType: 'png' as ImageType,\n isImageMirror: false,\n };\n\n for (const key in config) {\n if (key in config && config[key] !== undefined && key in captureOptions) {\n captureOptions[key] = config[key];\n }\n }\n return captureOptions;\n}\n\nconst DEFAULT_QUALITY = 0.92;\n\nexport function captureImageData(\n video: HTMLVideoElement | null,\n pictureOptions: Pick<CameraPictureOptions, 'scale' | 'isImageMirror'> = {}\n): ImageData | null {\n if (!video || video.readyState !== video.HAVE_ENOUGH_DATA) {\n return null;\n }\n const canvas = captureImageContext(video, pictureOptions);\n\n const context = canvas.getContext('2d', { alpha: false });\n if (!context || !canvas.width || !canvas.height) {\n return null;\n }\n\n const imageData = context.getImageData(0, 0, canvas.width, canvas.height);\n return imageData;\n}\n\nexport function captureImageContext(\n video: HTMLVideoElement,\n { scale = 1, isImageMirror = false }: Pick<CameraPictureOptions, 'scale' | 'isImageMirror'>\n): HTMLCanvasElement {\n const { videoWidth, videoHeight } = video;\n const { width, height } = getImageSize(videoWidth, videoHeight, scale!);\n\n // Build the canvas size and draw the camera image to the context from video\n const canvas = document.createElement('canvas');\n canvas.width = width;\n canvas.height = height;\n const context = canvas.getContext('2d', { alpha: false });\n\n if (!context) {\n // Should never be called\n throw new Error('Context is not defined');\n }\n // sharp image details\n // context.imageSmoothingEnabled = false;\n\n // Flip horizontally (as css transform: rotateY(180deg))\n if (isImageMirror) {\n context.setTransform(-1, 0, 0, 1, canvas.width, 0);\n }\n\n context.drawImage(video, 0, 0, width, height);\n\n return canvas;\n}\n\nexport function captureImage(\n video: HTMLVideoElement,\n pictureOptions: CameraPictureOptions\n): string {\n const config = ensureCameraPictureOptions(pictureOptions);\n const canvas = captureImageContext(video, config);\n const { imageType, quality = DEFAULT_QUALITY } = config;\n return toDataURL(canvas, imageType!, quality);\n}\n\nfunction getSupportedConstraints(): MediaTrackSupportedConstraints | null {\n if (navigator.mediaDevices && navigator.mediaDevices.getSupportedConstraints) {\n return navigator.mediaDevices.getSupportedConstraints();\n }\n return null;\n}\n\nexport function getIdealConstraints(\n preferredCameraType: CameraType,\n width?: number | ConstrainLongRange,\n height?: number | ConstrainLongRange\n): MediaStreamConstraints {\n const preferredConstraints: MediaStreamConstraints = {\n audio: false,\n video: {},\n };\n\n if (hasValidConstraints(preferredCameraType, width, height)) {\n return MinimumConstraints;\n }\n\n const supports = getSupportedConstraints();\n // TODO(Bacon): Test this\n if (!supports || !supports.facingMode || !supports.width || !supports.height) {\n return MinimumConstraints;\n }\n const types = ['front', 'back'];\n if (preferredCameraType && types.includes(preferredCameraType)) {\n const facingMode = CameraTypeToFacingMode[preferredCameraType];\n if (isWebKit()) {\n const key = facingMode === 'user' ? 'exact' : 'ideal';\n (preferredConstraints.video as MediaTrackConstraints).facingMode = {\n [key]: facingMode,\n };\n } else {\n (preferredConstraints.video as MediaTrackConstraints).facingMode = {\n ideal: CameraTypeToFacingMode[preferredCameraType],\n };\n }\n }\n\n if (isMediaTrackConstraints(preferredConstraints.video)) {\n preferredConstraints.video.width = width;\n preferredConstraints.video.height = height;\n }\n\n return preferredConstraints;\n}\n\nfunction isMediaTrackConstraints(input: any): input is MediaTrackConstraints {\n return input && typeof input.video !== 'boolean';\n}\n\n/**\n * Invoke getStreamDevice a second time with the opposing camera type if the preferred type cannot be retrieved.\n *\n * @param preferredCameraType\n * @param preferredWidth\n * @param preferredHeight\n */\nexport async function getPreferredStreamDevice(\n preferredCameraType: CameraType,\n preferredWidth?: number | ConstrainLongRange,\n preferredHeight?: number | ConstrainLongRange\n): Promise<MediaStream> {\n try {\n return await getStreamDevice(preferredCameraType, preferredWidth, preferredHeight);\n } catch (error) {\n // A hack on desktop browsers to ensure any camera is used.\n // eslint-disable-next-line no-undef\n if (error instanceof OverconstrainedError && error.constraint === 'facingMode') {\n const nextCameraType = preferredCameraType === 'back' ? 'front' : 'back';\n return await getStreamDevice(nextCameraType, preferredWidth, preferredHeight);\n }\n throw error;\n }\n}\n\nexport async function getStreamDevice(\n preferredCameraType: CameraType,\n preferredWidth?: number | ConstrainLongRange,\n preferredHeight?: number | ConstrainLongRange\n): Promise<MediaStream> {\n const constraints: MediaStreamConstraints = getIdealConstraints(\n preferredCameraType,\n preferredWidth,\n preferredHeight\n );\n const stream: MediaStream = await requestUserMediaAsync(constraints);\n return stream;\n}\n\nexport function isWebKit(): boolean {\n return /WebKit/.test(navigator.userAgent) && !/Edg/.test(navigator.userAgent);\n}\n\nexport function compareStreams(a: MediaStream | null, b: MediaStream | null): boolean {\n if (!a || !b) {\n return false;\n }\n const settingsA = a.getTracks()[0].getSettings();\n const settingsB = b.getTracks()[0].getSettings();\n return settingsA.deviceId === settingsB.deviceId;\n}\n\nexport function capture(\n video: HTMLVideoElement,\n settings: MediaTrackSettings,\n config: CameraPictureOptions\n): CameraCapturedPicture {\n const base64 = captureImage(video, config);\n\n const capturedPicture: CameraCapturedPicture = {\n uri: base64,\n base64,\n width: 0,\n height: 0,\n };\n\n if (settings) {\n const { width = 0, height = 0 } = settings;\n capturedPicture.width = width;\n capturedPicture.height = height;\n capturedPicture.exif = settings;\n }\n\n if (config.onPictureSaved) {\n config.onPictureSaved(capturedPicture);\n }\n return capturedPicture;\n}\n\nexport async function syncTrackCapabilities(\n cameraType: CameraType,\n stream: MediaStream | null,\n settings: WebCameraSettings = {}\n): Promise<void> {\n if (stream?.getVideoTracks) {\n await Promise.all(\n stream.getVideoTracks().map((track) => onCapabilitiesReady(cameraType, track, settings))\n );\n }\n}\n\n// https://developer.mozilla.org/en-US/docs/Web/API/MediaTrackConstraints\nasync function onCapabilitiesReady(\n cameraType: CameraType,\n track: MediaStreamTrack,\n settings: WebCameraSettings = {}\n): Promise<void> {\n if (typeof track.getCapabilities !== 'function') {\n return;\n }\n\n const capabilities = track.getCapabilities();\n\n // Create an empty object because if you set a constraint that isn't available an error will be thrown.\n const constraints: MediaTrackConstraintSet = {};\n\n // TODO(Bacon): Add `pointsOfInterest` support\n const clampedValues = [\n 'exposureCompensation',\n 'colorTemperature',\n 'iso',\n 'brightness',\n 'contrast',\n 'saturation',\n 'sharpness',\n 'focusDistance',\n 'zoom',\n ];\n\n for (const property of clampedValues) {\n if (capabilities[property]) {\n constraints[property] = convertNormalizedSetting(capabilities[property], settings[property]);\n }\n }\n\n function validatedInternalConstrainedValue<IConvertedType>(\n constraintKey: string,\n settingsKey: string,\n converter: (settingValue: any) => IConvertedType\n ) {\n const convertedSetting = converter(settings[settingsKey]);\n return validatedConstrainedValue({\n constraintKey,\n settingsKey,\n convertedSetting,\n capabilities,\n settings,\n cameraType,\n });\n }\n\n if (capabilities.focusMode && settings.autoFocus !== undefined) {\n constraints.focusMode = validatedInternalConstrainedValue<MediaTrackConstraintSet['focusMode']>(\n 'focusMode',\n 'autoFocus',\n CapabilityUtils.convertAutoFocusJSONToNative\n );\n }\n\n if (capabilities.torch && settings.flashMode !== undefined) {\n constraints.torch = validatedInternalConstrainedValue<MediaTrackConstraintSet['torch']>(\n 'torch',\n 'flashMode',\n CapabilityUtils.convertFlashModeJSONToNative\n );\n }\n\n if (capabilities.whiteBalanceMode && settings.whiteBalance !== undefined) {\n constraints.whiteBalanceMode = validatedInternalConstrainedValue<\n MediaTrackConstraintSet['whiteBalanceMode']\n >('whiteBalanceMode', 'whiteBalance', CapabilityUtils.convertWhiteBalanceJSONToNative);\n }\n\n try {\n await track.applyConstraints({ advanced: [constraints] });\n } catch (error) {\n if (__DEV__) console.warn('Failed to apply constraints', error);\n }\n}\n\nexport function stopMediaStream(stream: MediaStream | null) {\n if (!stream) {\n return;\n }\n if (stream.getAudioTracks) {\n stream.getAudioTracks().forEach((track) => track.stop());\n }\n if (stream.getVideoTracks) {\n stream.getVideoTracks().forEach((track) => track.stop());\n }\n if (isMediaStreamTrack(stream)) {\n stream.stop();\n }\n}\n\nexport function setVideoSource(\n video: HTMLVideoElement,\n stream: MediaStream | MediaSource | Blob | null\n): void {\n const createObjectURL = window.URL.createObjectURL ?? window.webkitURL.createObjectURL;\n\n if (typeof video.srcObject !== 'undefined') {\n video.srcObject = stream;\n } else if (typeof (video as any).mozSrcObject !== 'undefined') {\n (video as any).mozSrcObject = stream;\n } else if (stream && createObjectURL) {\n video.src = createObjectURL(stream as MediaSource | Blob);\n }\n\n if (!stream) {\n const revokeObjectURL = window.URL.revokeObjectURL ?? window.webkitURL.revokeObjectURL;\n const source = video.src ?? video.srcObject ?? (video as any).mozSrcObject;\n if (revokeObjectURL && typeof source === 'string') {\n revokeObjectURL(source);\n }\n }\n}\n\nexport function isCapabilityAvailable(video: HTMLVideoElement, keyName: string): boolean {\n const stream = video.srcObject;\n\n if (stream instanceof MediaStream) {\n const videoTrack = stream.getVideoTracks()[0];\n return videoTrack.getCapabilities?.()?.[keyName];\n }\n\n return false;\n}\n\nfunction isMediaStreamTrack(input: any): input is MediaStreamTrack {\n return typeof input.stop === 'function';\n}\n\nfunction convertNormalizedSetting(range: MediaSettingsRange, value?: number): number | undefined {\n if (!value) {\n return;\n }\n // convert the normalized incoming setting to the native camera zoom range\n const converted = convertRange(value, [range.min, range.max]);\n // clamp value so we don't get an error\n return Math.min(range.max, Math.max(range.min, converted));\n}\n\nfunction convertRange(value: number, r2: number[], r1: number[] = [0, 1]): number {\n return ((value - r1[0]) * (r2[1] - r2[0])) / (r1[1] - r1[0]) + r2[0];\n}\n\nfunction validatedConstrainedValue<T>(props: {\n constraintKey: string;\n settingsKey: string;\n convertedSetting: T;\n capabilities: MediaTrackCapabilities;\n settings: WebCameraSettings;\n cameraType: string;\n}): T | undefined {\n const { constraintKey, settingsKey, convertedSetting, capabilities, settings, cameraType } =\n props;\n const setting = settings[settingsKey];\n if (\n Array.isArray(capabilities[constraintKey]) &&\n convertedSetting &&\n !capabilities[constraintKey].includes(convertedSetting)\n ) {\n if (__DEV__) {\n // Only warn in dev mode.\n console.warn(\n ` { ${settingsKey}: \"${setting}\" } (converted to \"${convertedSetting}\" in the browser) is not supported for camera type \"${cameraType}\" in your browser. Using the default value instead.`\n );\n }\n return undefined;\n }\n return convertedSetting;\n}\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"WebCapabilityUtils.js","sourceRoot":"","sources":["../../src/web/WebCapabilityUtils.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,MAAM,UAAU,4BAA4B,CAAC,KAAa;IACxD,QAAQ,KAAK,EAAE;QACb,KAAK,OAAO;YACV,OAAO,IAAI,CAAC;QACd,KAAK,IAAI,CAAC;QACV,KAAK,KAAK,CAAC;QACX,KAAK,MAAM,CAAC;QACZ;YACE,OAAO,KAAK,CAAC;KAChB;AACH,CAAC;AAED,MAAM,UAAU,+BAA+B,CAAC,KAAa;IAC3D,QAAQ,KAAK,EAAE;QACb,KAAK,IAAI,CAAC;QACV,KAAK,MAAM;YACT,OAAO,YAAY,CAAC;QACtB,KAAK,KAAK;YACR,OAAO,MAAM,CAAC;QAChB,KAAK,YAAY;YACf,OAAO,aAAa,CAAC;QACvB;YACE,OAAO,SAAS,CAAC;KACpB;AACH,CAAC;AAED,MAAM,UAAU,4BAA4B,CAAC,KAAa;IACxD,QAAQ,KAAK,EAAE;QACb,KAAK,IAAI,CAAC;QACV,KAAK,MAAM;YACT,OAAO,YAAY,CAAC;QACtB,KAAK,KAAK;YACR,OAAO,QAAQ,CAAC;QAClB,KAAK,YAAY;YACf,OAAO,aAAa,CAAC;QACvB;YACE,OAAO,SAAS,CAAC;KACpB;AACH,CAAC","sourcesContent":["/*\n * Native web camera (Android) has a torch: boolean\n */\nexport function convertFlashModeJSONToNative(input: string): boolean {\n switch (input) {\n case 'torch':\n return true;\n case 'on':\n case 'off':\n case 'auto':\n default:\n return false;\n }\n}\n\nexport function convertWhiteBalanceJSONToNative(input: string): MeteringMode | undefined {\n switch (input) {\n case 'on':\n case 'auto':\n return 'continuous';\n case 'off':\n return 'none';\n case 'singleShot':\n return 'single-shot';\n default:\n return undefined;\n }\n}\n\nexport function convertAutoFocusJSONToNative(input: string): MeteringMode | undefined {\n switch (input) {\n case 'on':\n case 'auto':\n return 'continuous';\n case 'off':\n return 'manual';\n case 'singleShot':\n return 'single-shot';\n default:\n return undefined;\n }\n}\n"]}
1
+ {"version":3,"file":"WebCapabilityUtils.js","sourceRoot":"","sources":["../../src/web/WebCapabilityUtils.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,MAAM,UAAU,4BAA4B,CAAC,KAAa;IACxD,QAAQ,KAAK,EAAE,CAAC;QACd,KAAK,OAAO;YACV,OAAO,IAAI,CAAC;QACd,KAAK,IAAI,CAAC;QACV,KAAK,KAAK,CAAC;QACX,KAAK,MAAM,CAAC;QACZ;YACE,OAAO,KAAK,CAAC;IACjB,CAAC;AACH,CAAC;AAED,MAAM,UAAU,+BAA+B,CAAC,KAAa;IAC3D,QAAQ,KAAK,EAAE,CAAC;QACd,KAAK,IAAI,CAAC;QACV,KAAK,MAAM;YACT,OAAO,YAAY,CAAC;QACtB,KAAK,KAAK;YACR,OAAO,MAAM,CAAC;QAChB,KAAK,YAAY;YACf,OAAO,aAAa,CAAC;QACvB;YACE,OAAO,SAAS,CAAC;IACrB,CAAC;AACH,CAAC;AAED,MAAM,UAAU,4BAA4B,CAAC,KAAa;IACxD,QAAQ,KAAK,EAAE,CAAC;QACd,KAAK,IAAI,CAAC;QACV,KAAK,MAAM;YACT,OAAO,YAAY,CAAC;QACtB,KAAK,KAAK;YACR,OAAO,QAAQ,CAAC;QAClB,KAAK,YAAY;YACf,OAAO,aAAa,CAAC;QACvB;YACE,OAAO,SAAS,CAAC;IACrB,CAAC;AACH,CAAC","sourcesContent":["/*\n * Native web camera (Android) has a torch: boolean\n */\nexport function convertFlashModeJSONToNative(input: string): boolean {\n switch (input) {\n case 'torch':\n return true;\n case 'on':\n case 'off':\n case 'auto':\n default:\n return false;\n }\n}\n\nexport function convertWhiteBalanceJSONToNative(input: string): MeteringMode | undefined {\n switch (input) {\n case 'on':\n case 'auto':\n return 'continuous';\n case 'off':\n return 'none';\n case 'singleShot':\n return 'single-shot';\n default:\n return undefined;\n }\n}\n\nexport function convertAutoFocusJSONToNative(input: string): MeteringMode | undefined {\n switch (input) {\n case 'on':\n case 'auto':\n return 'continuous';\n case 'off':\n return 'manual';\n case 'singleShot':\n return 'single-shot';\n default:\n return undefined;\n }\n}\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"WebUserMediaManager.js","sourceRoot":"","sources":["../../src/web/WebUserMediaManager.ts"],"names":[],"mappings":"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","sourcesContent":["/* eslint-env browser */\n/**\n * A web-only module for ponyfilling the UserMedia API.\n */\nimport { Platform } from 'expo-modules-core';\n\nexport const userMediaRequested: boolean = false;\n\nexport const mountedInstances: any[] = [];\n\nasync function requestLegacyUserMediaAsync(props): Promise<any[]> {\n const optionalSource = (id) => ({ optional: [{ sourceId: id }] });\n\n const constraintToSourceId = (constraint) => {\n const { deviceId } = constraint;\n\n if (typeof deviceId === 'string') {\n return deviceId;\n }\n\n if (Array.isArray(deviceId) && deviceId.length > 0) {\n return deviceId[0];\n }\n\n if (typeof deviceId === 'object' && deviceId.ideal) {\n return deviceId.ideal;\n }\n\n return null;\n };\n\n const sources: any[] = await new Promise((resolve) =>\n // @ts-ignore: https://caniuse.com/#search=getSources Chrome for Android (78) & Samsung Internet (10.1) use this\n MediaStreamTrack.getSources((sources) => resolve(sources))\n );\n\n let audioSource = null;\n let videoSource = null;\n\n sources.forEach((source) => {\n if (source.kind === 'audio') {\n audioSource = source.id;\n } else if (source.kind === 'video') {\n videoSource = source.id;\n }\n });\n\n const audioSourceId = constraintToSourceId(props.audioConstraints);\n if (audioSourceId) {\n audioSource = audioSourceId;\n }\n\n const videoSourceId = constraintToSourceId(props.videoConstraints);\n if (videoSourceId) {\n videoSource = videoSourceId;\n }\n\n return [optionalSource(audioSource), optionalSource(videoSource)];\n}\n\nasync function sourceSelectedAsync(\n isMuted: boolean,\n audioConstraints?: MediaTrackConstraints | boolean,\n videoConstraints?: MediaTrackConstraints | boolean\n): Promise<MediaStream> {\n const constraints: MediaStreamConstraints = {\n video: typeof videoConstraints !== 'undefined' ? videoConstraints : true,\n };\n\n if (!isMuted) {\n constraints.audio = typeof audioConstraints !== 'undefined' ? audioConstraints : true;\n }\n\n return await getAnyUserMediaAsync(constraints);\n}\n\nexport async function requestUserMediaAsync(\n props: { audio?: any; video?: any },\n isMuted: boolean = true\n): Promise<MediaStream> {\n if (canGetUserMedia()) {\n return await sourceSelectedAsync(isMuted, props.audio, props.video);\n }\n const [audio, video] = await requestLegacyUserMediaAsync(props);\n return await sourceSelectedAsync(isMuted, audio, video);\n}\n\nexport async function getAnyUserMediaAsync(\n constraints: MediaStreamConstraints,\n ignoreConstraints: boolean = false\n): Promise<MediaStream> {\n try {\n return await getUserMediaAsync({\n ...constraints,\n video: ignoreConstraints || constraints.video,\n });\n } catch (error) {\n if (!ignoreConstraints && error.name === 'ConstraintNotSatisfiedError') {\n return await getAnyUserMediaAsync(constraints, true);\n }\n throw error;\n }\n}\n\nexport async function getUserMediaAsync(constraints: MediaStreamConstraints): Promise<MediaStream> {\n if (navigator.mediaDevices && navigator.mediaDevices.getUserMedia) {\n return navigator.mediaDevices.getUserMedia(constraints);\n }\n\n const _getUserMedia =\n navigator['mozGetUserMedia'] || navigator['webkitGetUserMedia'] || navigator['msGetUserMedia'];\n return new Promise((resolve, reject) =>\n _getUserMedia.call(navigator, constraints, resolve, reject)\n );\n}\n\nexport function canGetUserMedia(): boolean {\n return (\n // SSR\n Platform.isDOMAvailable &&\n // Has any form of media API\n !!(\n (navigator.mediaDevices && navigator.mediaDevices.getUserMedia) ||\n navigator['mozGetUserMedia'] ||\n navigator['webkitGetUserMedia'] ||\n navigator['msGetUserMedia']\n )\n );\n}\n\nexport async function isFrontCameraAvailableAsync(\n devices?: MediaDeviceInfo[]\n): Promise<null | string> {\n return await supportsCameraType(['front', 'user', 'facetime'], 'user', devices);\n}\n\nexport async function isBackCameraAvailableAsync(\n devices?: MediaDeviceInfo[]\n): Promise<null | string> {\n return await supportsCameraType(['back', 'rear'], 'environment', devices);\n}\n\nasync function supportsCameraType(\n labels: string[],\n type: string,\n devices?: MediaDeviceInfo[]\n): Promise<null | string> {\n if (!devices) {\n if (!navigator.mediaDevices.enumerateDevices) {\n return null;\n }\n devices = await navigator.mediaDevices.enumerateDevices();\n }\n const cameras = devices.filter((t) => t.kind === 'videoinput');\n const [hasCamera] = cameras.filter((camera) =>\n labels.some((label) => camera.label.toLowerCase().includes(label))\n );\n const [isCapable] = cameras.filter((camera) => {\n if (!('getCapabilities' in camera)) {\n return null;\n }\n\n const capabilities = (camera as any).getCapabilities();\n if (!capabilities.facingMode) {\n return null;\n }\n\n return capabilities.facingMode.find((_: string) => type);\n });\n\n return isCapable?.deviceId || hasCamera?.deviceId || null;\n}\n"]}
1
+ {"version":3,"file":"WebUserMediaManager.js","sourceRoot":"","sources":["../../src/web/WebUserMediaManager.ts"],"names":[],"mappings":"AAAA,wBAAwB;AACxB;;GAEG;AACH,OAAO,EAAE,QAAQ,EAAE,MAAM,mBAAmB,CAAC;AAE7C,MAAM,CAAC,MAAM,kBAAkB,GAAY,KAAK,CAAC;AAEjD,MAAM,CAAC,MAAM,gBAAgB,GAAU,EAAE,CAAC;AAE1C,KAAK,UAAU,2BAA2B,CAAC,KAAK;IAC9C,MAAM,cAAc,GAAG,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC,EAAE,QAAQ,EAAE,CAAC,EAAE,QAAQ,EAAE,EAAE,EAAE,CAAC,EAAE,CAAC,CAAC;IAElE,MAAM,oBAAoB,GAAG,CAAC,UAAU,EAAE,EAAE;QAC1C,MAAM,EAAE,QAAQ,EAAE,GAAG,UAAU,CAAC;QAEhC,IAAI,OAAO,QAAQ,KAAK,QAAQ,EAAE,CAAC;YACjC,OAAO,QAAQ,CAAC;QAClB,CAAC;QAED,IAAI,KAAK,CAAC,OAAO,CAAC,QAAQ,CAAC,IAAI,QAAQ,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YACnD,OAAO,QAAQ,CAAC,CAAC,CAAC,CAAC;QACrB,CAAC;QAED,IAAI,OAAO,QAAQ,KAAK,QAAQ,IAAI,QAAQ,CAAC,KAAK,EAAE,CAAC;YACnD,OAAO,QAAQ,CAAC,KAAK,CAAC;QACxB,CAAC;QAED,OAAO,IAAI,CAAC;IACd,CAAC,CAAC;IAEF,MAAM,OAAO,GAAU,MAAM,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE;IACnD,gHAAgH;IAChH,gBAAgB,CAAC,UAAU,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,CAC3D,CAAC;IAEF,IAAI,WAAW,GAAG,IAAI,CAAC;IACvB,IAAI,WAAW,GAAG,IAAI,CAAC;IAEvB,OAAO,CAAC,OAAO,CAAC,CAAC,MAAM,EAAE,EAAE;QACzB,IAAI,MAAM,CAAC,IAAI,KAAK,OAAO,EAAE,CAAC;YAC5B,WAAW,GAAG,MAAM,CAAC,EAAE,CAAC;QAC1B,CAAC;aAAM,IAAI,MAAM,CAAC,IAAI,KAAK,OAAO,EAAE,CAAC;YACnC,WAAW,GAAG,MAAM,CAAC,EAAE,CAAC;QAC1B,CAAC;IACH,CAAC,CAAC,CAAC;IAEH,MAAM,aAAa,GAAG,oBAAoB,CAAC,KAAK,CAAC,gBAAgB,CAAC,CAAC;IACnE,IAAI,aAAa,EAAE,CAAC;QAClB,WAAW,GAAG,aAAa,CAAC;IAC9B,CAAC;IAED,MAAM,aAAa,GAAG,oBAAoB,CAAC,KAAK,CAAC,gBAAgB,CAAC,CAAC;IACnE,IAAI,aAAa,EAAE,CAAC;QAClB,WAAW,GAAG,aAAa,CAAC;IAC9B,CAAC;IAED,OAAO,CAAC,cAAc,CAAC,WAAW,CAAC,EAAE,cAAc,CAAC,WAAW,CAAC,CAAC,CAAC;AACpE,CAAC;AAED,KAAK,UAAU,mBAAmB,CAChC,OAAgB,EAChB,gBAAkD,EAClD,gBAAkD;IAElD,MAAM,WAAW,GAA2B;QAC1C,KAAK,EAAE,OAAO,gBAAgB,KAAK,WAAW,CAAC,CAAC,CAAC,gBAAgB,CAAC,CAAC,CAAC,IAAI;KACzE,CAAC;IAEF,IAAI,CAAC,OAAO,EAAE,CAAC;QACb,WAAW,CAAC,KAAK,GAAG,OAAO,gBAAgB,KAAK,WAAW,CAAC,CAAC,CAAC,gBAAgB,CAAC,CAAC,CAAC,IAAI,CAAC;IACxF,CAAC;IAED,OAAO,MAAM,oBAAoB,CAAC,WAAW,CAAC,CAAC;AACjD,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,qBAAqB,CACzC,KAAmC,EACnC,UAAmB,IAAI;IAEvB,IAAI,eAAe,EAAE,EAAE,CAAC;QACtB,OAAO,MAAM,mBAAmB,CAAC,OAAO,EAAE,KAAK,CAAC,KAAK,EAAE,KAAK,CAAC,KAAK,CAAC,CAAC;IACtE,CAAC;IACD,MAAM,CAAC,KAAK,EAAE,KAAK,CAAC,GAAG,MAAM,2BAA2B,CAAC,KAAK,CAAC,CAAC;IAChE,OAAO,MAAM,mBAAmB,CAAC,OAAO,EAAE,KAAK,EAAE,KAAK,CAAC,CAAC;AAC1D,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,oBAAoB,CACxC,WAAmC,EACnC,oBAA6B,KAAK;IAElC,IAAI,CAAC;QACH,OAAO,MAAM,iBAAiB,CAAC;YAC7B,GAAG,WAAW;YACd,KAAK,EAAE,iBAAiB,IAAI,WAAW,CAAC,KAAK;SAC9C,CAAC,CAAC;IACL,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,IAAI,CAAC,iBAAiB,IAAI,KAAK,CAAC,IAAI,KAAK,6BAA6B,EAAE,CAAC;YACvE,OAAO,MAAM,oBAAoB,CAAC,WAAW,EAAE,IAAI,CAAC,CAAC;QACvD,CAAC;QACD,MAAM,KAAK,CAAC;IACd,CAAC;AACH,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,iBAAiB,CAAC,WAAmC;IACzE,IAAI,SAAS,CAAC,YAAY,IAAI,SAAS,CAAC,YAAY,CAAC,YAAY,EAAE,CAAC;QAClE,OAAO,SAAS,CAAC,YAAY,CAAC,YAAY,CAAC,WAAW,CAAC,CAAC;IAC1D,CAAC;IAED,MAAM,aAAa,GACjB,SAAS,CAAC,iBAAiB,CAAC,IAAI,SAAS,CAAC,oBAAoB,CAAC,IAAI,SAAS,CAAC,gBAAgB,CAAC,CAAC;IACjG,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE,CACrC,aAAa,CAAC,IAAI,CAAC,SAAS,EAAE,WAAW,EAAE,OAAO,EAAE,MAAM,CAAC,CAC5D,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,eAAe;IAC7B,OAAO;IACL,MAAM;IACN,QAAQ,CAAC,cAAc;QACvB,4BAA4B;QAC5B,CAAC,CAAC,CACA,CAAC,SAAS,CAAC,YAAY,IAAI,SAAS,CAAC,YAAY,CAAC,YAAY,CAAC;YAC/D,SAAS,CAAC,iBAAiB,CAAC;YAC5B,SAAS,CAAC,oBAAoB,CAAC;YAC/B,SAAS,CAAC,gBAAgB,CAAC,CAC5B,CACF,CAAC;AACJ,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,2BAA2B,CAC/C,OAA2B;IAE3B,OAAO,MAAM,kBAAkB,CAAC,CAAC,OAAO,EAAE,MAAM,EAAE,UAAU,CAAC,EAAE,MAAM,EAAE,OAAO,CAAC,CAAC;AAClF,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,0BAA0B,CAC9C,OAA2B;IAE3B,OAAO,MAAM,kBAAkB,CAAC,CAAC,MAAM,EAAE,MAAM,CAAC,EAAE,aAAa,EAAE,OAAO,CAAC,CAAC;AAC5E,CAAC;AAED,KAAK,UAAU,kBAAkB,CAC/B,MAAgB,EAChB,IAAY,EACZ,OAA2B;IAE3B,IAAI,CAAC,OAAO,EAAE,CAAC;QACb,IAAI,CAAC,SAAS,CAAC,YAAY,CAAC,gBAAgB,EAAE,CAAC;YAC7C,OAAO,IAAI,CAAC;QACd,CAAC;QACD,OAAO,GAAG,MAAM,SAAS,CAAC,YAAY,CAAC,gBAAgB,EAAE,CAAC;IAC5D,CAAC;IACD,MAAM,OAAO,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,YAAY,CAAC,CAAC;IAC/D,MAAM,CAAC,SAAS,CAAC,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC,MAAM,EAAE,EAAE,CAC5C,MAAM,CAAC,IAAI,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,MAAM,CAAC,KAAK,CAAC,WAAW,EAAE,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,CACnE,CAAC;IACF,MAAM,CAAC,SAAS,CAAC,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC,MAAM,EAAE,EAAE;QAC5C,IAAI,CAAC,CAAC,iBAAiB,IAAI,MAAM,CAAC,EAAE,CAAC;YACnC,OAAO,IAAI,CAAC;QACd,CAAC;QAED,MAAM,YAAY,GAAI,MAAc,CAAC,eAAe,EAAE,CAAC;QACvD,IAAI,CAAC,YAAY,CAAC,UAAU,EAAE,CAAC;YAC7B,OAAO,IAAI,CAAC;QACd,CAAC;QAED,OAAO,YAAY,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC,CAAS,EAAE,EAAE,CAAC,IAAI,CAAC,CAAC;IAC3D,CAAC,CAAC,CAAC;IAEH,OAAO,SAAS,EAAE,QAAQ,IAAI,SAAS,EAAE,QAAQ,IAAI,IAAI,CAAC;AAC5D,CAAC","sourcesContent":["/* eslint-env browser */\n/**\n * A web-only module for ponyfilling the UserMedia API.\n */\nimport { Platform } from 'expo-modules-core';\n\nexport const userMediaRequested: boolean = false;\n\nexport const mountedInstances: any[] = [];\n\nasync function requestLegacyUserMediaAsync(props): Promise<any[]> {\n const optionalSource = (id) => ({ optional: [{ sourceId: id }] });\n\n const constraintToSourceId = (constraint) => {\n const { deviceId } = constraint;\n\n if (typeof deviceId === 'string') {\n return deviceId;\n }\n\n if (Array.isArray(deviceId) && deviceId.length > 0) {\n return deviceId[0];\n }\n\n if (typeof deviceId === 'object' && deviceId.ideal) {\n return deviceId.ideal;\n }\n\n return null;\n };\n\n const sources: any[] = await new Promise((resolve) =>\n // @ts-ignore: https://caniuse.com/#search=getSources Chrome for Android (78) & Samsung Internet (10.1) use this\n MediaStreamTrack.getSources((sources) => resolve(sources))\n );\n\n let audioSource = null;\n let videoSource = null;\n\n sources.forEach((source) => {\n if (source.kind === 'audio') {\n audioSource = source.id;\n } else if (source.kind === 'video') {\n videoSource = source.id;\n }\n });\n\n const audioSourceId = constraintToSourceId(props.audioConstraints);\n if (audioSourceId) {\n audioSource = audioSourceId;\n }\n\n const videoSourceId = constraintToSourceId(props.videoConstraints);\n if (videoSourceId) {\n videoSource = videoSourceId;\n }\n\n return [optionalSource(audioSource), optionalSource(videoSource)];\n}\n\nasync function sourceSelectedAsync(\n isMuted: boolean,\n audioConstraints?: MediaTrackConstraints | boolean,\n videoConstraints?: MediaTrackConstraints | boolean\n): Promise<MediaStream> {\n const constraints: MediaStreamConstraints = {\n video: typeof videoConstraints !== 'undefined' ? videoConstraints : true,\n };\n\n if (!isMuted) {\n constraints.audio = typeof audioConstraints !== 'undefined' ? audioConstraints : true;\n }\n\n return await getAnyUserMediaAsync(constraints);\n}\n\nexport async function requestUserMediaAsync(\n props: { audio?: any; video?: any },\n isMuted: boolean = true\n): Promise<MediaStream> {\n if (canGetUserMedia()) {\n return await sourceSelectedAsync(isMuted, props.audio, props.video);\n }\n const [audio, video] = await requestLegacyUserMediaAsync(props);\n return await sourceSelectedAsync(isMuted, audio, video);\n}\n\nexport async function getAnyUserMediaAsync(\n constraints: MediaStreamConstraints,\n ignoreConstraints: boolean = false\n): Promise<MediaStream> {\n try {\n return await getUserMediaAsync({\n ...constraints,\n video: ignoreConstraints || constraints.video,\n });\n } catch (error) {\n if (!ignoreConstraints && error.name === 'ConstraintNotSatisfiedError') {\n return await getAnyUserMediaAsync(constraints, true);\n }\n throw error;\n }\n}\n\nexport async function getUserMediaAsync(constraints: MediaStreamConstraints): Promise<MediaStream> {\n if (navigator.mediaDevices && navigator.mediaDevices.getUserMedia) {\n return navigator.mediaDevices.getUserMedia(constraints);\n }\n\n const _getUserMedia =\n navigator['mozGetUserMedia'] || navigator['webkitGetUserMedia'] || navigator['msGetUserMedia'];\n return new Promise((resolve, reject) =>\n _getUserMedia.call(navigator, constraints, resolve, reject)\n );\n}\n\nexport function canGetUserMedia(): boolean {\n return (\n // SSR\n Platform.isDOMAvailable &&\n // Has any form of media API\n !!(\n (navigator.mediaDevices && navigator.mediaDevices.getUserMedia) ||\n navigator['mozGetUserMedia'] ||\n navigator['webkitGetUserMedia'] ||\n navigator['msGetUserMedia']\n )\n );\n}\n\nexport async function isFrontCameraAvailableAsync(\n devices?: MediaDeviceInfo[]\n): Promise<null | string> {\n return await supportsCameraType(['front', 'user', 'facetime'], 'user', devices);\n}\n\nexport async function isBackCameraAvailableAsync(\n devices?: MediaDeviceInfo[]\n): Promise<null | string> {\n return await supportsCameraType(['back', 'rear'], 'environment', devices);\n}\n\nasync function supportsCameraType(\n labels: string[],\n type: string,\n devices?: MediaDeviceInfo[]\n): Promise<null | string> {\n if (!devices) {\n if (!navigator.mediaDevices.enumerateDevices) {\n return null;\n }\n devices = await navigator.mediaDevices.enumerateDevices();\n }\n const cameras = devices.filter((t) => t.kind === 'videoinput');\n const [hasCamera] = cameras.filter((camera) =>\n labels.some((label) => camera.label.toLowerCase().includes(label))\n );\n const [isCapable] = cameras.filter((camera) => {\n if (!('getCapabilities' in camera)) {\n return null;\n }\n\n const capabilities = (camera as any).getCapabilities();\n if (!capabilities.facingMode) {\n return null;\n }\n\n return capabilities.facingMode.find((_: string) => type);\n });\n\n return isCapable?.deviceId || hasCamera?.deviceId || null;\n}\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"useWebCameraStream.js","sourceRoot":"","sources":["../../src/web/useWebCameraStream.ts"],"names":[],"mappings":"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","sourcesContent":["/* eslint-env browser */\nimport * as React from 'react';\n\nimport * as Utils from './WebCameraUtils';\nimport { FacingModeToCameraType } from './WebConstants';\nimport {\n CameraReadyListener,\n CameraType,\n MountErrorListener,\n WebCameraSettings,\n} from '../Camera.types';\n\nconst VALID_SETTINGS_KEYS = [\n 'autoFocus',\n 'flashMode',\n 'exposureCompensation',\n 'colorTemperature',\n 'iso',\n 'brightness',\n 'contrast',\n 'saturation',\n 'sharpness',\n 'focusDistance',\n 'whiteBalance',\n 'zoom',\n];\n\nfunction useLoadedVideo(video: HTMLVideoElement | null, onLoaded: () => void) {\n React.useEffect(() => {\n if (video) {\n video.addEventListener('loadedmetadata', () => {\n // without this async block the constraints aren't properly applied to the camera,\n // this means that if you were to turn on the torch and swap to the front camera,\n // then swap back to the rear camera the torch setting wouldn't be applied.\n requestAnimationFrame(() => {\n onLoaded();\n });\n });\n }\n }, [video]);\n}\n\nexport function useWebCameraStream(\n video: React.MutableRefObject<HTMLVideoElement | null>,\n preferredType: CameraType,\n settings: Record<string, any>,\n {\n onCameraReady,\n onMountError,\n }: { onCameraReady?: CameraReadyListener; onMountError?: MountErrorListener }\n): {\n type: CameraType | null;\n mediaTrackSettings: MediaTrackSettings | null;\n} {\n const isStartingCamera = React.useRef<boolean | null>(false);\n const activeStreams = React.useRef<MediaStream[]>([]);\n const capabilities = React.useRef<WebCameraSettings>({\n autoFocus: 'continuous',\n flashMode: 'off',\n whiteBalance: 'continuous',\n zoom: 1,\n });\n const [stream, setStream] = React.useState<MediaStream | null>(null);\n\n const mediaTrackSettings = React.useMemo(() => {\n return stream ? stream.getTracks()[0].getSettings() : null;\n }, [stream]);\n\n // The actual camera type - this can be different from the incoming camera type.\n const type = React.useMemo(() => {\n if (!mediaTrackSettings) {\n return null;\n }\n // On desktop no value will be returned, in this case we should assume the cameraType is 'front'\n const { facingMode = 'user' } = mediaTrackSettings;\n return FacingModeToCameraType[facingMode];\n }, [mediaTrackSettings]);\n\n const getStreamDeviceAsync = React.useCallback(async (): Promise<MediaStream | null> => {\n try {\n return await Utils.getPreferredStreamDevice(preferredType);\n } catch (nativeEvent) {\n if (__DEV__) {\n console.warn(`Error requesting UserMedia for type \"${preferredType}\":`, nativeEvent);\n }\n if (onMountError) {\n onMountError({ nativeEvent });\n }\n return null;\n }\n }, [preferredType, onMountError]);\n\n const resumeAsync = React.useCallback(async (): Promise<boolean> => {\n const nextStream = await getStreamDeviceAsync();\n if (Utils.compareStreams(nextStream, stream)) {\n // Do nothing if the streams are the same.\n // This happens when the device only supports one camera (i.e. desktop) and the mode was toggled between front/back while already active.\n // Without this check there is a screen flash while the video switches.\n return false;\n }\n\n // Save a history of all active streams (usually 2+) so we can close them later.\n // Keeping them open makes swapping camera types much faster.\n if (!activeStreams.current.some((value) => value.id === nextStream?.id)) {\n activeStreams.current.push(nextStream!);\n }\n\n // Set the new stream -> update the video, settings, and actual camera type.\n setStream(nextStream);\n if (onCameraReady) {\n onCameraReady();\n }\n return false;\n }, [getStreamDeviceAsync, setStream, onCameraReady, stream, activeStreams.current]);\n\n React.useEffect(() => {\n // Restart the camera and guard concurrent actions.\n if (isStartingCamera.current) {\n return;\n }\n isStartingCamera.current = true;\n\n resumeAsync()\n .then((isStarting) => {\n isStartingCamera.current = isStarting;\n })\n .catch(() => {\n // ensure the camera can be started again.\n isStartingCamera.current = false;\n });\n }, [preferredType]);\n\n // Update the native camera with any custom capabilities.\n React.useEffect(() => {\n const changes: WebCameraSettings = {};\n\n for (const key of Object.keys(settings)) {\n if (!VALID_SETTINGS_KEYS.includes(key)) {\n continue;\n }\n const nextValue = settings[key];\n if (nextValue !== capabilities.current[key]) {\n changes[key] = nextValue;\n }\n }\n\n // Only update the native camera if changes were found\n const hasChanges = !!Object.keys(changes).length;\n\n const nextWebCameraSettings = { ...capabilities.current, ...changes };\n if (hasChanges) {\n Utils.syncTrackCapabilities(preferredType, stream, changes);\n }\n\n capabilities.current = nextWebCameraSettings;\n }, [\n settings.autoFocus,\n settings.flashMode,\n settings.exposureCompensation,\n settings.colorTemperature,\n settings.iso,\n settings.brightness,\n settings.contrast,\n settings.saturation,\n settings.sharpness,\n settings.focusDistance,\n settings.whiteBalance,\n settings.zoom,\n ]);\n\n React.useEffect(() => {\n // set or unset the video source.\n if (!video.current) {\n return;\n }\n Utils.setVideoSource(video.current, stream);\n }, [video.current, stream]);\n\n React.useEffect(() => {\n return () => {\n // Clean up on dismount, this is important for making sure the camera light goes off when the component is removed.\n for (const stream of activeStreams.current) {\n // Close all open streams.\n Utils.stopMediaStream(stream);\n }\n if (video.current) {\n // Invalidate the video source.\n Utils.setVideoSource(video.current, stream);\n }\n };\n }, []);\n\n // Update props when the video loads.\n useLoadedVideo(video.current, () => {\n Utils.syncTrackCapabilities(preferredType, stream, capabilities.current);\n });\n\n return {\n type,\n mediaTrackSettings,\n };\n}\n"]}
1
+ {"version":3,"file":"useWebCameraStream.js","sourceRoot":"","sources":["../../src/web/useWebCameraStream.ts"],"names":[],"mappings":"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","sourcesContent":["/* eslint-env browser */\nimport * as React from 'react';\n\nimport * as Utils from './WebCameraUtils';\nimport { FacingModeToCameraType } from './WebConstants';\nimport {\n CameraReadyListener,\n CameraType,\n MountErrorListener,\n WebCameraSettings,\n} from '../Camera.types';\n\nconst VALID_SETTINGS_KEYS = [\n 'autoFocus',\n 'flashMode',\n 'exposureCompensation',\n 'colorTemperature',\n 'iso',\n 'brightness',\n 'contrast',\n 'saturation',\n 'sharpness',\n 'focusDistance',\n 'whiteBalance',\n 'zoom',\n];\n\nfunction useLoadedVideo(video: HTMLVideoElement | null, onLoaded: () => void) {\n React.useEffect(() => {\n if (video) {\n video.addEventListener('loadedmetadata', () => {\n // without this async block the constraints aren't properly applied to the camera,\n // this means that if you were to turn on the torch and swap to the front camera,\n // then swap back to the rear camera the torch setting wouldn't be applied.\n requestAnimationFrame(() => {\n onLoaded();\n });\n });\n }\n }, [video]);\n}\n\nexport function useWebCameraStream(\n video: React.MutableRefObject<HTMLVideoElement | null>,\n preferredType: CameraType,\n settings: Record<string, any>,\n {\n onCameraReady,\n onMountError,\n }: { onCameraReady?: CameraReadyListener; onMountError?: MountErrorListener }\n): {\n type: CameraType | null;\n mediaTrackSettings: MediaTrackSettings | null;\n} {\n const isStartingCamera = React.useRef<boolean | null>(false);\n const activeStreams = React.useRef<MediaStream[]>([]);\n const capabilities = React.useRef<WebCameraSettings>({\n autoFocus: 'continuous',\n flashMode: 'off',\n whiteBalance: 'continuous',\n zoom: 1,\n });\n const [stream, setStream] = React.useState<MediaStream | null>(null);\n\n const mediaTrackSettings = React.useMemo(() => {\n return stream ? stream.getTracks()[0].getSettings() : null;\n }, [stream]);\n\n // The actual camera type - this can be different from the incoming camera type.\n const type = React.useMemo(() => {\n if (!mediaTrackSettings) {\n return null;\n }\n // On desktop no value will be returned, in this case we should assume the cameraType is 'front'\n const { facingMode = 'user' } = mediaTrackSettings;\n return FacingModeToCameraType[facingMode];\n }, [mediaTrackSettings]);\n\n const getStreamDeviceAsync = React.useCallback(async (): Promise<MediaStream | null> => {\n try {\n return await Utils.getPreferredStreamDevice(preferredType);\n } catch (nativeEvent) {\n if (__DEV__) {\n console.warn(`Error requesting UserMedia for type \"${preferredType}\":`, nativeEvent);\n }\n if (onMountError) {\n onMountError({ nativeEvent });\n }\n return null;\n }\n }, [preferredType, onMountError]);\n\n const resumeAsync = React.useCallback(async (): Promise<boolean> => {\n const nextStream = await getStreamDeviceAsync();\n if (Utils.compareStreams(nextStream, stream)) {\n // Do nothing if the streams are the same.\n // This happens when the device only supports one camera (i.e. desktop) and the mode was toggled between front/back while already active.\n // Without this check there is a screen flash while the video switches.\n return false;\n }\n\n // Save a history of all active streams (usually 2+) so we can close them later.\n // Keeping them open makes swapping camera types much faster.\n if (!activeStreams.current.some((value) => value.id === nextStream?.id)) {\n activeStreams.current.push(nextStream!);\n }\n\n // Set the new stream -> update the video, settings, and actual camera type.\n setStream(nextStream);\n if (onCameraReady) {\n onCameraReady();\n }\n return false;\n }, [getStreamDeviceAsync, setStream, onCameraReady, stream, activeStreams.current]);\n\n React.useEffect(() => {\n // Restart the camera and guard concurrent actions.\n if (isStartingCamera.current) {\n return;\n }\n isStartingCamera.current = true;\n\n resumeAsync()\n .then((isStarting) => {\n isStartingCamera.current = isStarting;\n })\n .catch(() => {\n // ensure the camera can be started again.\n isStartingCamera.current = false;\n });\n }, [preferredType]);\n\n // Update the native camera with any custom capabilities.\n React.useEffect(() => {\n const changes: WebCameraSettings = {};\n\n for (const key of Object.keys(settings)) {\n if (!VALID_SETTINGS_KEYS.includes(key)) {\n continue;\n }\n const nextValue = settings[key];\n if (nextValue !== capabilities.current[key]) {\n changes[key] = nextValue;\n }\n }\n\n // Only update the native camera if changes were found\n const hasChanges = !!Object.keys(changes).length;\n\n const nextWebCameraSettings = { ...capabilities.current, ...changes };\n if (hasChanges) {\n Utils.syncTrackCapabilities(preferredType, stream, changes);\n }\n\n capabilities.current = nextWebCameraSettings;\n }, [\n settings.autoFocus,\n settings.flashMode,\n settings.exposureCompensation,\n settings.colorTemperature,\n settings.iso,\n settings.brightness,\n settings.contrast,\n settings.saturation,\n settings.sharpness,\n settings.focusDistance,\n settings.whiteBalance,\n settings.zoom,\n ]);\n\n React.useEffect(() => {\n // set or unset the video source.\n if (!video.current) {\n return;\n }\n Utils.setVideoSource(video.current, stream);\n }, [video.current, stream]);\n\n React.useEffect(() => {\n return () => {\n // Clean up on dismount, this is important for making sure the camera light goes off when the component is removed.\n for (const stream of activeStreams.current) {\n // Close all open streams.\n Utils.stopMediaStream(stream);\n }\n if (video.current) {\n // Invalidate the video source.\n Utils.setVideoSource(video.current, stream);\n }\n };\n }, []);\n\n // Update props when the video loads.\n useLoadedVideo(video.current, () => {\n Utils.syncTrackCapabilities(preferredType, stream, capabilities.current);\n });\n\n return {\n type,\n mediaTrackSettings,\n };\n}\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"useWebQRScanner.js","sourceRoot":"","sources":["../../src/web/useWebQRScanner.ts"],"names":[],"mappings":"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","sourcesContent":["import * as React from 'react';\n\nimport { captureImageData } from './WebCameraUtils';\nimport { BarcodeScanningResult, CameraPictureOptions, MountErrorListener } from '../Camera.types';\n\nconst qrWorkerMethod = ({ data, width, height }: ImageData): any => {\n // eslint-disable-next-line no-undef\n const decoded = (self as any).jsQR(data, width, height, {\n inversionAttempts: 'attemptBoth',\n });\n\n let parsed;\n try {\n parsed = JSON.parse(decoded);\n } catch {\n parsed = decoded;\n }\n\n if (parsed?.data) {\n const nativeEvent: BarcodeScanningResult = {\n type: 'qr',\n data: parsed.data,\n cornerPoints: [],\n bounds: { origin: { x: 0, y: 0 }, size: { width: 0, height: 0 } },\n };\n if (parsed.location) {\n nativeEvent.cornerPoints = [\n parsed.location.topLeftCorner,\n parsed.location.bottomLeftCorner,\n parsed.location.topRightCorner,\n parsed.location.bottomRightCorner,\n ];\n }\n return nativeEvent;\n }\n return parsed;\n};\n\nconst createWorkerAsyncFunction = <T extends (data: any) => any>(fn: T, deps: string[]) => {\n if (typeof window === 'undefined') {\n return async () => {\n throw new Error('Cannot use createWorkerAsyncFunction in a non-browser environment');\n };\n }\n\n const stringifiedFn = [\n `self.func = ${fn.toString()};`,\n 'self.onmessage = (e) => {',\n ' const result = self.func(e.data);',\n ' self.postMessage(result);',\n '};',\n ];\n\n if (deps.length > 0) {\n stringifiedFn.unshift(`importScripts(${deps.map((dep) => `'${dep}'`).join(', ')});`);\n }\n\n const blob = new Blob(stringifiedFn, { type: 'text/javascript' });\n const worker = new Worker(URL.createObjectURL(blob));\n\n // First-In First-Out queue of promises\n const promises: {\n resolve: (value: ReturnType<T>) => void;\n reject: (reason?: any) => void;\n }[] = [];\n\n worker.onmessage = (e) => promises.shift()?.resolve(e.data);\n\n return (data: Parameters<T>[0]) => {\n return new Promise<ReturnType<T>>((resolve, reject) => {\n promises.push({ resolve, reject });\n worker.postMessage(data);\n });\n };\n};\n\nconst decode = createWorkerAsyncFunction(qrWorkerMethod, [\n 'https://cdn.jsdelivr.net/npm/jsqr@1.2.0/dist/jsQR.min.js',\n]);\n\nexport function useWebQRScanner(\n video: React.MutableRefObject<HTMLVideoElement | null>,\n {\n isEnabled,\n captureOptions,\n interval,\n onScanned,\n onError,\n }: {\n isEnabled: boolean;\n captureOptions: Pick<CameraPictureOptions, 'scale' | 'isImageMirror'>;\n interval?: number;\n onScanned?: (scanningResult: { nativeEvent: BarcodeScanningResult }) => void;\n onError?: MountErrorListener;\n }\n) {\n const isRunning = React.useRef<boolean>(false);\n const timeout = React.useRef<number | undefined>(undefined);\n\n async function scanAsync() {\n // If interval is 0 then only scan once.\n if (!isRunning.current || !onScanned) {\n stop();\n return;\n }\n try {\n const data = captureImageData(video.current, captureOptions);\n\n if (data) {\n const nativeEvent: BarcodeScanningResult | any = await decode(data);\n if (nativeEvent?.data) {\n onScanned({\n nativeEvent,\n });\n }\n }\n } catch (error) {\n if (onError) {\n onError({ nativeEvent: error });\n }\n } finally {\n // If interval is 0 then only scan once.\n if (interval === 0) {\n stop();\n return;\n }\n const intervalToUse = !interval || interval < 0 ? 16 : interval;\n // @ts-ignore: Type 'Timeout' is not assignable to type 'number'\n timeout.current = setTimeout(() => {\n scanAsync();\n }, intervalToUse);\n }\n }\n\n function stop() {\n isRunning.current = false;\n clearTimeout(timeout.current);\n }\n\n React.useEffect(() => {\n if (isEnabled) {\n isRunning.current = true;\n scanAsync();\n }\n\n return () => {\n if (isEnabled) {\n stop();\n }\n };\n }, [isEnabled]);\n}\n"]}
1
+ {"version":3,"file":"useWebQRScanner.js","sourceRoot":"","sources":["../../src/web/useWebQRScanner.ts"],"names":[],"mappings":"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","sourcesContent":["import * as React from 'react';\n\nimport { captureImageData } from './WebCameraUtils';\nimport { BarcodeScanningResult, CameraPictureOptions, MountErrorListener } from '../Camera.types';\n\nconst qrWorkerMethod = ({ data, width, height }: ImageData): any => {\n // eslint-disable-next-line no-undef\n const decoded = (self as any).jsQR(data, width, height, {\n inversionAttempts: 'attemptBoth',\n });\n\n let parsed;\n try {\n parsed = JSON.parse(decoded);\n } catch {\n parsed = decoded;\n }\n\n if (parsed?.data) {\n const nativeEvent: BarcodeScanningResult = {\n type: 'qr',\n data: parsed.data,\n cornerPoints: [],\n bounds: { origin: { x: 0, y: 0 }, size: { width: 0, height: 0 } },\n };\n if (parsed.location) {\n nativeEvent.cornerPoints = [\n parsed.location.topLeftCorner,\n parsed.location.bottomLeftCorner,\n parsed.location.topRightCorner,\n parsed.location.bottomRightCorner,\n ];\n }\n return nativeEvent;\n }\n return parsed;\n};\n\nconst createWorkerAsyncFunction = <T extends (data: any) => any>(fn: T, deps: string[]) => {\n if (typeof window === 'undefined') {\n return async () => {\n throw new Error('Cannot use createWorkerAsyncFunction in a non-browser environment');\n };\n }\n\n const stringifiedFn = [\n `self.func = ${fn.toString()};`,\n 'self.onmessage = (e) => {',\n ' const result = self.func(e.data);',\n ' self.postMessage(result);',\n '};',\n ];\n\n if (deps.length > 0) {\n stringifiedFn.unshift(`importScripts(${deps.map((dep) => `'${dep}'`).join(', ')});`);\n }\n\n const blob = new Blob(stringifiedFn, { type: 'text/javascript' });\n const worker = new Worker(URL.createObjectURL(blob));\n\n // First-In First-Out queue of promises\n const promises: {\n resolve: (value: ReturnType<T>) => void;\n reject: (reason?: any) => void;\n }[] = [];\n\n worker.onmessage = (e) => promises.shift()?.resolve(e.data);\n\n return (data: Parameters<T>[0]) => {\n return new Promise<ReturnType<T>>((resolve, reject) => {\n promises.push({ resolve, reject });\n worker.postMessage(data);\n });\n };\n};\n\nconst decode = createWorkerAsyncFunction(qrWorkerMethod, [\n 'https://cdn.jsdelivr.net/npm/jsqr@1.2.0/dist/jsQR.min.js',\n]);\n\nexport function useWebQRScanner(\n video: React.MutableRefObject<HTMLVideoElement | null>,\n {\n isEnabled,\n captureOptions,\n interval,\n onScanned,\n onError,\n }: {\n isEnabled: boolean;\n captureOptions: Pick<CameraPictureOptions, 'scale' | 'isImageMirror'>;\n interval?: number;\n onScanned?: (scanningResult: { nativeEvent: BarcodeScanningResult }) => void;\n onError?: MountErrorListener;\n }\n) {\n const isRunning = React.useRef<boolean>(false);\n const timeout = React.useRef<number | undefined>(undefined);\n\n async function scanAsync() {\n // If interval is 0 then only scan once.\n if (!isRunning.current || !onScanned) {\n stop();\n return;\n }\n try {\n const data = captureImageData(video.current, captureOptions);\n\n if (data) {\n const nativeEvent: BarcodeScanningResult | any = await decode(data);\n if (nativeEvent?.data) {\n onScanned({\n nativeEvent,\n });\n }\n }\n } catch (error) {\n if (onError) {\n onError({ nativeEvent: error });\n }\n } finally {\n // If interval is 0 then only scan once.\n if (interval === 0) {\n stop();\n return;\n }\n const intervalToUse = !interval || interval < 0 ? 16 : interval;\n // @ts-ignore: Type 'Timeout' is not assignable to type 'number'\n timeout.current = setTimeout(() => {\n scanAsync();\n }, intervalToUse);\n }\n }\n\n function stop() {\n isRunning.current = false;\n clearTimeout(timeout.current);\n }\n\n React.useEffect(() => {\n if (isEnabled) {\n isRunning.current = true;\n scanAsync();\n }\n\n return () => {\n if (isEnabled) {\n stop();\n }\n };\n }, [isEnabled]);\n}\n"]}
@@ -360,7 +360,7 @@ public class CameraView: ExpoView, EXAppLifecycleListener,
360
360
  var photoSettings = AVCapturePhotoSettings()
361
361
 
362
362
  if photoOutput.availablePhotoCodecTypes.contains(AVVideoCodecType.hevc) {
363
- photoSettings = AVCapturePhotoSettings(format: [AVVideoCodecKey: AVVideoCodecType.jpeg])
363
+ photoSettings = AVCapturePhotoSettings(format: [AVVideoCodecKey: AVVideoCodecType.hevc])
364
364
  }
365
365
 
366
366
  let requestedFlashMode = flashMode.toDeviceFlashMode()
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "expo-camera",
3
- "version": "16.0.6",
3
+ "version": "16.0.7",
4
4
  "description": "A React component that renders a preview for the device's either front or back camera. Camera's parameters like zoom, auto focus, white balance and flash mode are adjustable. With expo-camera, one can also take photos and record videos that are saved to the app's cache. Morever, the component is also capable of detecting faces and bar codes appearing on the preview.",
5
5
  "main": "build/index.js",
6
6
  "types": "build/index.d.ts",
@@ -50,5 +50,5 @@
50
50
  "optional": true
51
51
  }
52
52
  },
53
- "gitHead": "128718d43bac2eaed764b3551469b95400f2363e"
53
+ "gitHead": "65ae6fda78837f77eea5a2107066fc545a211804"
54
54
  }