UNPKG

@dittolive/ditto

Version:

Ditto is a cross-platform SDK that allows apps to sync with and even without internet connectivity.

100 lines (99 loc) 4.42 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); const config_plugins_1 = require("@expo/config-plugins"); const expo_build_properties_1 = require("expo-build-properties"); const BLE_USAGE = 'Uses Bluetooth to connect and sync with nearby devices.'; const LAN_USAGE = 'Uses WiFi to connect and sync with nearby devices.'; const withDittoIOS = (expoConfig, props) => (0, config_plugins_1.withInfoPlist)(expoConfig, (config) => { const infoPlist = config.modResults; infoPlist.NSBluetoothAlwaysUsageDescription = props.bluetoothUsageDescription ?? infoPlist.NSBluetoothAlwaysUsageDescription ?? BLE_USAGE; infoPlist.NSLocalNetworkUsageDescription = props.localNetworkUsageDescription ?? infoPlist.NSLocalNetworkUsageDescription ?? LAN_USAGE; if (!Array.isArray(infoPlist.NSBonjourServices)) { infoPlist.NSBonjourServices = []; } if (!infoPlist.NSBonjourServices.includes('_http-alt._tcp.')) { infoPlist.NSBonjourServices.push('_http-alt._tcp.'); } if (!Array.isArray(infoPlist.UIBackgroundModes)) { infoPlist.UIBackgroundModes = []; } if (!infoPlist.UIBackgroundModes.includes('bluetooth-central')) { infoPlist.UIBackgroundModes.push('bluetooth-central'); } if (!infoPlist.UIBackgroundModes.includes('bluetooth-peripheral')) { infoPlist.UIBackgroundModes.push('bluetooth-peripheral'); } return config; }); const withDittoAndroid = (expoConfig) => { const architectures = ['x86', 'x86_64', 'armeabi-v7a', 'arm64-v8a']; const libraries = [ 'libjsi.so', 'libdittoffi.so', 'libreact_nativemodule_core.so', 'libturbomodulejsijni.so', 'libreactnative.so', ]; expoConfig = (0, expo_build_properties_1.withBuildProperties)(expoConfig, { android: { packagingOptions: { pickFirst: architectures.flatMap((arch) => libraries.map((lib) => `lib/${arch}/${lib}`)), }, }, }); expoConfig = (0, config_plugins_1.withAndroidManifest)(expoConfig, async (config) => { const androidManifest = config.modResults; const permissions = androidManifest.manifest['uses-permission'] || []; const permissionsToAdd = [ { name: 'android.permission.BLUETOOTH' }, { name: 'android.permission.BLUETOOTH_ADMIN' }, { name: 'android.permission.BLUETOOTH_ADVERTISE' }, { name: 'android.permission.BLUETOOTH_CONNECT' }, { name: 'android.permission.BLUETOOTH_SCAN', attributes: { 'android:usesPermissionFlags': 'neverForLocation' }, }, { name: 'android.permission.ACCESS_FINE_LOCATION' }, { name: 'android.permission.ACCESS_COARSE_LOCATION' }, { name: 'android.permission.INTERNET' }, { name: 'android.permission.ACCESS_WIFI_STATE' }, { name: 'android.permission.ACCESS_NETWORK_STATE' }, { name: 'android.permission.CHANGE_NETWORK_STATE' }, { name: 'android.permission.CHANGE_WIFI_MULTICAST_STATE' }, { name: 'android.permission.CHANGE_WIFI_STATE' }, { name: 'android.permission.NEARBY_WIFI_DEVICES', attributes: { 'android:usesPermissionFlags': 'neverForLocation' }, }, ]; permissionsToAdd.forEach((permission) => { function isPermissionAlreadyRequested(permissionName, manifestPermissions) { return manifestPermissions.some((e) => e.$['android:name'] === permissionName); } if (!isPermissionAlreadyRequested(permission.name, permissions)) { const permissionObject = { $: { 'android:name': permission.name, ...permission.attributes, }, }; permissions.push(permissionObject); } }); androidManifest.manifest['uses-permission'] = permissions; return config; }); return expoConfig; }; const withDitto = (config, props = {}) => { config = withDittoIOS(config, props); config = withDittoAndroid(config, props); return config; }; exports.default = (0, config_plugins_1.createRunOncePlugin)(withDitto, 'ditto_expo');