@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
JavaScript
;
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');