vision-camera-simple-scanner
Version:
High performance barcode scanner for React Native using VisionCamera, forked from vision-camera-barcode-scanner
1 lines • 30.9 kB
Source Map (JSON)
{"version":3,"sources":["../src/index.ts","../src/constants/android.ts","../src/constants/templates.ts","../src/hooks/useBarcodeScanner.ts","../src/module.ts","../src/utils/convert.ts","../src/utils/types.ts","../src/utils/geometry.ts","../src/utils/highlights.ts","../src/hooks/useLatestSharedValue.ts"],"sourcesContent":["export * from './constants';\nexport * from './hooks';\nexport * from './module';\nexport type * from './types';\nexport * from './utils';\n","/**\n * @see https://developers.google.com/android/reference/com/google/mlkit/vision/barcode/Barcode.BarcodeFormat\n */\nexport const enum AndroidBarcodeFormat {\n UNKNOWN = -1,\n ALL_FORMATS = 0,\n CODE_128 = 1,\n CODE_39 = 2,\n CODE_93 = 4,\n CODABAR = 8,\n DATA_MATRIX = 16,\n EAN_13 = 32,\n EAN_8 = 64,\n ITF = 128,\n QR_CODE = 256,\n UPC_A = 512,\n UPC_E = 1024,\n PDF417 = 2048,\n AZTEC = 4096,\n}\n\n/**\n * @see https://developers.google.com/android/reference/com/google/mlkit/vision/barcode/Barcode.BarcodeValueType\n */\nexport const enum AndroidBarcodeValueType {\n UNKNOWN = 0,\n CONTACT_INFO = 1,\n EMAIL = 2,\n ISBN = 3,\n PHONE = 4,\n PRODUCT = 5,\n SMS = 6,\n TEXT = 7,\n URL = 8,\n WIFI = 9,\n GEO = 10,\n CALENDAR_EVENT = 11,\n DRIVER_LICENSE = 12,\n}\n\n/**\n * @see https://developers.google.com/android/reference/com/google/mlkit/vision/barcode/Barcode.Address.AddressType\n */\nexport const enum AndroidAddressType {\n UNKNOWN = 0,\n WORK = 1,\n HOME = 2,\n}\n\n/**\n * @see https://developers.google.com/android/reference/com/google/mlkit/vision/barcode/Barcode.WiFi.EncryptionType\n */\nexport const enum AndroidEncryptionType {\n OPEN = 1,\n WPA = 2,\n WEP = 3,\n}\n\n/**\n * @see https://developers.google.com/android/reference/com/google/mlkit/vision/barcode/Barcode.Email.FormatType\n */\nexport const enum AndroidEmailType {\n UNKNOWN = 0,\n WORK = 1,\n HOME = 2,\n}\n\n/**\n * @see https://developers.google.com/android/reference/com/google/mlkit/vision/barcode/Barcode.Phone.FormatType\n */\nexport const enum AndroidPhoneType {\n UNKNOWN = 0,\n WORK = 1,\n HOME = 2,\n FAX = 3,\n MOBILE = 4,\n}\n","import { type FormatFilter } from 'react-native-vision-camera';\n\nexport const Templates = {\n /**\n * HD-quality for faster Frame Processing in YUV pixelFormat (e.g. 720p)\n */\n FrameProcessingYUV: [{ videoResolution: { width: 1080, height: 720 } }],\n /**\n * XGA-quality for faster Frame Processing in YUV pixelFormat\n */\n FrameProcessingBarcodeXGA: [\n { videoResolution: { width: 1024, height: 768 } },\n ],\n} as const satisfies Record<string, FormatFilter[]>;\n","import { useState } from 'react';\nimport { type ViewProps } from 'react-native';\nimport {\n runAtTargetFps,\n useFrameProcessor,\n type CameraProps,\n type Frame,\n} from 'react-native-vision-camera';\nimport { Worklets, useSharedValue } from 'react-native-worklets-core';\nimport { ScanBarcodesOptions, scanCodes } from 'src/module';\nimport type {\n Barcode,\n BarcodeType,\n Highlight,\n PointMapperFn,\n Rect,\n Size,\n} from 'src/types';\nimport { computeHighlights } from '..';\nimport { useLatestSharedValue } from './useLatestSharedValue';\n\ntype ResizeMode = NonNullable<CameraProps['resizeMode']>;\n\nexport type UseBarcodeScannerOptions = {\n barcodeTypes?: BarcodeType[];\n regionOfInterest?: Rect;\n fps?: number;\n onBarcodeScanned?: (barcodes: Barcode[], frame: Frame) => void;\n pointMapper?: PointMapperFn;\n disableHighlighting?: boolean;\n resizeMode?: ResizeMode;\n scanMode?: 'continuous' | 'once';\n isMountedRef?: { value: boolean };\n};\n\nexport const useBarcodeScanner = ({\n barcodeTypes,\n regionOfInterest,\n onBarcodeScanned,\n pointMapper,\n disableHighlighting,\n resizeMode = 'cover',\n scanMode = 'continuous',\n isMountedRef,\n fps = 30,\n}: UseBarcodeScannerOptions) => {\n // Layout of the <Camera /> component\n const layoutRef = useSharedValue<Size>({ width: 0, height: 0 });\n const onLayout: ViewProps['onLayout'] = (event) => {\n const { width, height } = event.nativeEvent.layout;\n layoutRef.value = { width, height };\n };\n\n const resizeModeRef = useLatestSharedValue<ResizeMode>(resizeMode);\n\n // Barcode highlights related state\n const barcodesRef = useSharedValue<Barcode[]>([]);\n\n // Barcode highlights related state\n const [highlights, setHighlights] = useState<Highlight[]>([]);\n const lastHighlightsCount = useSharedValue<number>(0);\n const setHighlightsJS = Worklets.createRunOnJS(setHighlights);\n\n const pixelFormat: CameraProps['pixelFormat'] = 'yuv';\n\n const frameProcessor = useFrameProcessor(\n (frame) => {\n 'worklet';\n if (isMountedRef && isMountedRef.value === false) {\n return;\n }\n runAtTargetFps(fps, () => {\n 'worklet';\n const { value: layout } = layoutRef;\n const { value: prevBarcodes } = barcodesRef;\n const { value: resizeMode } = resizeModeRef;\n const { width, height, orientation } = frame;\n\n // Call the native barcode scanner\n const options: ScanBarcodesOptions = {};\n if (barcodeTypes !== undefined) {\n options.barcodeTypes = barcodeTypes;\n }\n if (regionOfInterest !== undefined) {\n const { x, y, width, height } = regionOfInterest;\n options.regionOfInterest = [x, y, width, height];\n }\n const barcodes = scanCodes(frame, options);\n\n if (barcodes.length > 0) {\n // If the scanMode is \"continuous\", we stream all the barcodes responses\n if (scanMode === 'continuous') {\n onBarcodeScanned && onBarcodeScanned(barcodes, frame);\n // If the scanMode is \"once\", we only call the callback if the barcodes have actually changed\n } else if (scanMode === 'once') {\n const hasChanged =\n prevBarcodes.length !== barcodes.length ||\n JSON.stringify(prevBarcodes.map(({ value }) => value)) !==\n JSON.stringify(barcodes.map(({ value }) => value));\n if (hasChanged) {\n onBarcodeScanned && onBarcodeScanned(barcodes, frame);\n }\n }\n barcodesRef.value = barcodes;\n }\n\n if (disableHighlighting !== true && resizeMode !== undefined) {\n const highlights = computeHighlights(\n barcodes,\n { width, height, orientation }, // \"serialized\" frame\n layout,\n resizeMode,\n pointMapper,\n );\n\n // Spare a re-render if the highlights are both empty\n if (lastHighlightsCount.value === 0 && highlights.length === 0) {\n return;\n }\n lastHighlightsCount.value = highlights.length;\n setHighlightsJS(highlights);\n }\n });\n },\n [layoutRef, resizeModeRef, disableHighlighting],\n );\n\n return {\n props: {\n pixelFormat,\n frameProcessor,\n onLayout,\n },\n highlights,\n };\n};\n","import { NativeEventEmitter, NativeModules, Platform } from 'react-native';\nimport { VisionCameraProxy, type Frame } from 'react-native-vision-camera';\nimport type {\n AndroidBarcode,\n Barcode,\n BarcodeType,\n FrameProcessorPlugin,\n VisionCameraConstants,\n iOSBarcode,\n} from './types';\nimport { normalizeNativeBarcode } from './utils';\n\nconst LINKING_ERROR =\n `The package 'vision-camera-code-scanner' doesn't seem to be linked. Make sure: \\n\\n` +\n Platform.select({ ios: \"- You have run 'pod install'\\n\", default: '' }) +\n '- You rebuilt the app after installing the package\\n' +\n '- You are not using Expo Go\\n';\n\nexport const VisionCameraSimpleScanner = NativeModules.VisionCameraSimpleScanner\n ? NativeModules.VisionCameraSimpleScanner\n : new Proxy(\n {},\n {\n get() {\n throw new Error(LINKING_ERROR);\n },\n },\n );\n\nconst { MODULE_NAME, BARCODE_TYPES, BARCODE_FORMATS } =\n VisionCameraSimpleScanner.getConstants() as VisionCameraConstants;\n\nexport { BARCODE_FORMATS, BARCODE_TYPES };\n\nconst visionCameraEventEmitter = new NativeEventEmitter(\n VisionCameraSimpleScanner,\n);\n\nexport const onBarcodeDetected = (\n callback: (barcode: iOSBarcode | AndroidBarcode) => unknown,\n) => {\n visionCameraEventEmitter.addListener('onBarcodeDetected', (nativeBarcode) => {\n callback(nativeBarcode);\n });\n};\n\nconst visionCameraProcessorPlugin = VisionCameraProxy.initFrameProcessorPlugin(\n MODULE_NAME,\n) as FrameProcessorPlugin | null;\n\nexport type ScanBarcodesOptions = {\n barcodeTypes?: BarcodeType[];\n regionOfInterest?: [number, number, number, number];\n};\n\nexport const scanCodes = (\n frame: Frame,\n options?: ScanBarcodesOptions,\n): Barcode[] => {\n 'worklet';\n if (visionCameraProcessorPlugin == null) {\n throw new Error(`Failed to load Frame Processor Plugin \"${MODULE_NAME}\"!`);\n }\n\n // console.log(`frame.width=${frame.width}, frame.height=${frame.height}`);\n // @ts-expect-error - incrementRefCount() is not exposed in the typings\n frame.incrementRefCount && frame.incrementRefCount();\n const nativeCodes = visionCameraProcessorPlugin.call(\n frame,\n options,\n ) as unknown as (AndroidBarcode | iOSBarcode)[];\n // @ts-expect-error - decrementRefCount() is not exposed in the typings\n frame.decrementRefCount && frame.decrementRefCount();\n\n if (!Array.isArray(nativeCodes)) {\n console.log(\n `Native frame processor ${MODULE_NAME} failed to return a proper array!`,\n nativeCodes,\n );\n return [];\n }\n return nativeCodes\n .slice()\n .map((nativeBarcode) => normalizeNativeBarcode(nativeBarcode, frame));\n};\n","import { Platform } from 'react-native';\nimport type { Code, Frame } from 'react-native-vision-camera';\nimport type {\n AndroidBarcode,\n Barcode,\n BoundingBox,\n Point,\n iOSBarcode,\n} from 'src/types';\nimport { normalizeAndroidCodeType, normalizeiOSCodeType } from './types';\n\nexport const isIOSBarcode = (\n barcode: iOSBarcode | AndroidBarcode,\n): barcode is iOSBarcode => {\n 'worklet';\n return Platform.OS === 'ios';\n};\n\nexport const isAndroidBarcode = (\n barcode: iOSBarcode | AndroidBarcode,\n): barcode is AndroidBarcode => {\n 'worklet';\n return Platform.OS === 'android';\n};\n\nexport const computeBoundingBoxFromCornerPoints = (\n cornerPoints: Point[],\n): BoundingBox => {\n 'worklet';\n const xArray = cornerPoints.map((corner) => corner.x);\n const yArray = cornerPoints.map((corner) => corner.y);\n // @NOTE we can't use destructuring here because babel would wrap it in non-worklet functions\n const x = Math.min.apply(null, xArray);\n const y = Math.min.apply(null, yArray);\n const width = Math.max.apply(null, xArray) - x;\n const height = Math.max.apply(null, yArray) - y;\n return {\n origin: { x, y },\n size: {\n width,\n height,\n },\n };\n};\n\nexport const normalizePrecision = (number: number): number => {\n 'worklet';\n return Math.round(number);\n};\n\nexport const normalizeNativeBarcode = (\n barcode: iOSBarcode | AndroidBarcode,\n frame: Frame,\n): Barcode => {\n 'worklet';\n if (isIOSBarcode(barcode)) {\n const { payload, symbology, boundingBox, corners } = barcode;\n return {\n value: payload,\n type: normalizeiOSCodeType(symbology),\n boundingBox: {\n origin: {\n x: normalizePrecision(boundingBox.origin.x * frame.width),\n y: normalizePrecision(boundingBox.origin.y * frame.height),\n },\n size: {\n width: normalizePrecision(boundingBox.size.width * frame.width),\n height: normalizePrecision(boundingBox.size.height * frame.height),\n },\n },\n // This explicitly defined to match android's implementation which is to start top left and go clockwise.\n // https://developers.google.com/android/reference/com/google/mlkit/vision/barcode/common/Barcode#public-point[]-getcornerpoints\n cornerPoints: [\n corners.topLeft,\n corners.topRight,\n corners.bottomRight,\n corners.bottomLeft,\n ].map(({ x, y }) => ({\n x: normalizePrecision(x * frame.width),\n y: normalizePrecision(y * frame.height),\n })),\n native: barcode,\n };\n } else if (isAndroidBarcode(barcode)) {\n const { rawValue, format, cornerPoints } = barcode;\n return {\n value: rawValue,\n type: normalizeAndroidCodeType(format),\n boundingBox: computeBoundingBoxFromCornerPoints(cornerPoints),\n cornerPoints,\n native: barcode,\n };\n } else {\n throw new Error(`Unsupported platform: ${Platform.OS}`);\n }\n};\n\nexport const convertVisionCameraCodeToBarcode = (\n code: Code,\n): Omit<Barcode, 'native'> => {\n return {\n value: code.value ?? null,\n type: code.type,\n boundingBox: {\n origin: {\n x: code.frame?.x ?? 0,\n y: code.frame?.y ?? 0,\n },\n size: {\n width: code.frame?.width ?? 0,\n height: code.frame?.height ?? 0,\n },\n },\n cornerPoints: code.corners ?? [],\n };\n};\n","import type { BarcodeType, iOSSymbology } from 'src/types';\nimport { AndroidBarcodeFormat } from '..';\n\nexport const normalizeiOSCodeType = (symbology: iOSSymbology): BarcodeType => {\n 'worklet';\n switch (symbology) {\n case 'VNBarcodeSymbologyAztec':\n return 'aztec';\n case 'VNBarcodeSymbologyCode39':\n case 'VNBarcodeSymbologyCode39Checksum':\n case 'VNBarcodeSymbologyCode39FullASCII':\n case 'VNBarcodeSymbologyCode39FullASCIIChecksum':\n return 'code-39';\n case 'VNBarcodeSymbologyCode93':\n case 'VNBarcodeSymbologyCode93i':\n return 'code-93';\n case 'VNBarcodeSymbologyCode128':\n return 'code-128';\n case 'VNBarcodeSymbologyDataMatrix':\n return 'data-matrix';\n case 'VNBarcodeSymbologyEAN8':\n return 'ean-8';\n case 'VNBarcodeSymbologyEAN13':\n return 'ean-13';\n case 'VNBarcodeSymbologyGS1DataBar':\n case 'VNBarcodeSymbologyGS1DataBarExpanded':\n case 'VNBarcodeSymbologyGS1DataBarLimited':\n return 'gs1-databar';\n case 'VNBarcodeSymbologyI2of5':\n case 'VNBarcodeSymbologyI2of5Checksum':\n case 'VNBarcodeSymbologyITF14':\n return 'itf';\n case 'VNBarcodeSymbologyMicroPDF417':\n case 'VNBarcodeSymbologyPDF417':\n return 'pdf-417';\n case 'VNBarcodeSymbologyMicroQR':\n case 'VNBarcodeSymbologyQR':\n return 'qr';\n case 'VNBarcodeSymbologyMSIPlessey':\n return 'msi-plessey';\n case 'VNBarcodeSymbologyUPCE':\n return 'upc-e';\n default:\n return 'unknown';\n }\n};\n\nexport const normalizeAndroidCodeType = (\n format: AndroidBarcodeFormat,\n): BarcodeType => {\n 'worklet';\n switch (format) {\n case AndroidBarcodeFormat.AZTEC:\n return 'aztec';\n case AndroidBarcodeFormat.CODABAR:\n return 'codabar';\n case AndroidBarcodeFormat.CODE_39:\n return 'code-39';\n case AndroidBarcodeFormat.CODE_93:\n return 'code-93';\n case AndroidBarcodeFormat.CODE_128:\n return 'code-128';\n case AndroidBarcodeFormat.DATA_MATRIX:\n return 'data-matrix';\n case AndroidBarcodeFormat.EAN_8:\n return 'ean-8';\n case AndroidBarcodeFormat.EAN_13:\n return 'ean-13';\n case AndroidBarcodeFormat.ITF:\n return 'itf';\n case AndroidBarcodeFormat.PDF417:\n return 'pdf-417';\n case AndroidBarcodeFormat.QR_CODE:\n return 'qr';\n case AndroidBarcodeFormat.UPC_A:\n return 'upc-a';\n case AndroidBarcodeFormat.UPC_E:\n return 'upc-e';\n case AndroidBarcodeFormat.UNKNOWN:\n default:\n return 'unknown';\n }\n};\n","import { Platform } from 'react-native';\nimport type { CameraProps, Orientation } from 'react-native-vision-camera';\nimport type { Point, Size } from 'src/types';\nimport { normalizePrecision } from './convert';\n\nexport const applyScaleFactor = (\n { x, y }: Point,\n source: Size,\n target: Size,\n resizeMode: CameraProps['resizeMode'] = 'cover',\n): Point => {\n 'worklet';\n\n const ratio = {\n width: target.width / source.width,\n height: target.height / source.height,\n };\n\n let scaleFactor;\n if (resizeMode === 'contain') {\n scaleFactor = Math.min(ratio.width, ratio.height);\n } else if (resizeMode === 'cover') {\n scaleFactor = Math.max(ratio.width, ratio.height);\n } else {\n throw new Error(`Invalid resize mode: ${resizeMode}`);\n }\n\n let newX = x * scaleFactor;\n let newY = y * scaleFactor;\n\n // Center the image if it's contain mode\n if (\n (ratio.width < ratio.height && resizeMode === 'contain') ||\n (ratio.width > ratio.height && resizeMode === 'cover')\n ) {\n newY += (target.height - source.height * scaleFactor) / 2;\n } else {\n newX += (target.width - source.width * scaleFactor) / 2;\n }\n\n return { x: normalizePrecision(newX), y: normalizePrecision(newY) };\n};\n\nexport const applyTransformation = (\n { x, y }: Point,\n { width, height }: Size,\n orientation: Orientation,\n): Point => {\n 'worklet';\n\n if (Platform.OS === 'android') {\n switch (orientation) {\n case 'portrait':\n return { x, y };\n default:\n console.warn(`Unsupported orientation: ${orientation}`);\n return { x, y };\n }\n } else if (Platform.OS === 'ios') {\n switch (orientation) {\n case 'portrait':\n return { x: height - y, y: width - x };\n case 'landscape-left':\n return { x: width - x, y };\n case 'landscape-right':\n return { x: x, y: height - y };\n case 'portrait-upside-down':\n return { x: y, y: x };\n default:\n console.warn(`Unsupported orientation: ${orientation}`);\n return { x, y };\n }\n } else {\n throw new Error(`Unsupported platform: ${Platform.OS}`);\n }\n};\n","import { Platform } from 'react-native';\nimport type { CameraProps, Frame } from 'react-native-vision-camera';\nimport type { Barcode, Highlight, PointMapperFn, Size } from 'src/types';\nimport { computeBoundingBoxFromCornerPoints } from './convert';\nimport { applyScaleFactor, applyTransformation } from './geometry';\n\nexport const computeHighlights = (\n barcodes: Barcode[],\n frame: Pick<Frame, 'width' | 'height' | 'orientation'>,\n layout: Size,\n resizeMode: CameraProps['resizeMode'] = 'cover',\n pointMapper?: PointMapperFn,\n): Highlight[] => {\n 'worklet';\n\n // If the layout is not yet known, we can't compute the highlights\n if (layout.width === 0 || layout.height === 0) {\n return [];\n }\n\n let adjustedLayout = {\n width: layout.height,\n height: layout.width,\n };\n if (Platform.OS === 'ios') {\n /* iOS:\n * \"portrait\" -> \"landscape-right\"\n * \"portrait-upside-down\" -> \"landscape-left\"\n * \"landscape-left\" -> \"portrait\"\n * \"landscape-right\" -> \"portrait-upside-down\"\n */\n // @NOTE destructure the object to make sure we don't hold a reference to the original layout\n adjustedLayout = ['portrait', 'portrait-upside-down'].includes(\n frame.orientation,\n )\n ? {\n width: layout.height,\n height: layout.width,\n }\n : {\n width: layout.width,\n height: layout.height,\n };\n }\n\n const highlights = barcodes.map<Highlight>((barcode, index) => {\n const { value, cornerPoints } = barcode;\n let translatedCornerPoints = cornerPoints;\n\n translatedCornerPoints = translatedCornerPoints?.map((point) =>\n applyScaleFactor(point, frame, adjustedLayout, resizeMode),\n );\n\n if (pointMapper) {\n translatedCornerPoints = translatedCornerPoints?.map((point) =>\n pointMapper(point, layout, frame.orientation),\n );\n } else {\n translatedCornerPoints = translatedCornerPoints?.map((point) =>\n applyTransformation(point, adjustedLayout, frame.orientation),\n );\n }\n\n const valueFromCornerPoints = computeBoundingBoxFromCornerPoints(\n translatedCornerPoints!,\n );\n\n return {\n ...barcode,\n key: `${value}.${index}`,\n cornerPoints: translatedCornerPoints,\n boundingBox: valueFromCornerPoints,\n };\n });\n // console.log(JSON.stringify(highlights, null, 2));\n\n return highlights;\n};\n","import { useEffect } from 'react';\nimport { useSharedValue } from 'react-native-worklets-core';\n\nexport function useLatestSharedValue<T>(\n value: T,\n dependencies: unknown[] = [value],\n) {\n const sharedValue = useSharedValue<T>(value);\n useEffect(() => {\n sharedValue.value = value;\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, dependencies);\n\n return sharedValue;\n}\n"],"mappings":"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","names":["AndroidBarcodeFormat","AndroidBarcodeValueType","AndroidAddressType","AndroidEncryptionType","AndroidEmailType","AndroidPhoneType","import_react","import_react_native_vision_camera","import_react_native_worklets_core","import_react_native","import_react_native","import_react_native","resizeMode","width","height","highlights"]}