Permissions.js 4.39 KiB
'use strict';
import { NativeModules, PermissionsAndroid, Platform } from 'react-native';
const { WebRTCModule } = NativeModules;
/**
 * Type declaration for a permissions descriptor.
 */
type PermissionDescriptor = {
    name: string;
/**
 * Class implementing a subset of W3C's Permissions API as defined by:
 * https://www.w3.org/TR/permissions/
class Permissions {
    /**
     * Possible result values for {@link query}, in accordance with:
     * https://www.w3.org/TR/permissions/#status-of-a-permission
    RESULT = {
        DENIED: 'denied',
        GRANTED: 'granted',
        PROMPT: 'prompt'
    /**
     * This implementation only supports requesting these permissions, a subset
     * of: https://www.w3.org/TR/permissions/#permission-registry
    VALID_PERMISSIONS = [ 'camera', 'microphone' ];
    _lastReq = Promise.resolve();
    /**
     * Helper for requesting Android permissions. On Android only one permission
     * can be requested at a time (unless the multi-permission API is used,
     * but we are not using that for symmetry with the W3C API for querying)
     * so we'll queue them up.
     * @param {string} perm - The requested permission from
     * {@link PermissionsAndroid.PERMISSIONS}
     * https://facebook.github.io/react-native/docs/permissionsandroid#permissions-that-require-prompting-the-user
    _requestPermissionAndroid(perm) {
        return new Promise((resolve, reject) => {
            PermissionsAndroid.request(perm).then(
                granted => resolve(granted === true || granted === PermissionsAndroid.RESULTS.GRANTED),
                () => resolve(false));
        });
    /**
     * Validates the given permission descriptor.
    _validatePermissionDescriptior(permissionDesc) {
        if (typeof permissionDesc !== "object") {
            throw new TypeError("Argument 1 of Permissions.query is not an object.");
        if (typeof permissionDesc.name === "undefined") {
            throw new TypeError("Missing required 'name' member of PermissionDescriptor.");
        if (this.VALID_PERMISSIONS.indexOf(permissionDesc.name) === -1) {
            throw new TypeError("'name' member of PermissionDescriptor is not a valid value for enumeration PermissionName.");
    /**
7172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124
* Method for querying the status of a permission, according to: * https://www.w3.org/TR/permissions/#permissions-interface */ query(permissionDesc: PermissionDescriptor) { try { this._validatePermissionDescriptior(permissionDesc); } catch (e) { return Promise.reject(e); } if (Platform.OS === 'android') { const perm = permissionDesc.name === 'camera' ? PermissionsAndroid.PERMISSIONS.CAMERA : PermissionsAndroid.PERMISSIONS.RECORD_AUDIO; return new Promise((resolve, reject) => { PermissionsAndroid.check(perm).then( granted => resolve(granted ? this.RESULT.GRANTED : this.RESULT.PROMPT), () => resolve(this.RESULT.PROMPT)); }); } else if (Platform.OS === 'ios' || Platform.OS === 'macos') { return WebRTCModule.checkPermission(permissionDesc.name); } else { return Promise.reject(new TypeError("Unsupported platform.")); } } /** * Custom method NOT defined by W3C's permissions API, which allows the * caller to request a permission. */ request(permissionDesc: PermissionDescriptor) { try { this._validatePermissionDescriptior(permissionDesc); } catch (e) { return Promise.reject(e); } if (Platform.OS === 'android') { const perm = permissionDesc.name === 'camera' ? PermissionsAndroid.PERMISSIONS.CAMERA : PermissionsAndroid.PERMISSIONS.RECORD_AUDIO; const requestPermission = () => this._requestPermissionAndroid(perm); this._lastReq = this._lastReq.then(requestPermission, requestPermission); return this._lastReq; } else if (Platform.OS === 'ios' || Platform.OS === 'macos') { return WebRTCModule.requestPermission(permissionDesc.name); } else { return Promise.reject(new TypeError("Unsupported platform.")); } } } export default new Permissions();