import { PermissionExpiration, PermissionMap, PermissionStatus } from './Permissions.types';
export function coalesceStatuses(permissions: PermissionMap): PermissionStatus {
const statuses = Object.keys(permissions).map(type => permissions[type].status);
statuses.sort((status1, status2) => _getStatusWeight(status1) - _getStatusWeight(status2));
// We choose the "heaviest" status with the most implications
return statuses[statuses.length - 1];
}
function _getStatusWeight(status: PermissionStatus): number {
// In terms of weight, we treat UNDETERMINED > DENIED > GRANTED since UNDETERMINED requires the
// most amount of further handling (prompting for permission and then checking that permission)
// and GRANTED requires the least
switch (status) {
case PermissionStatus.GRANTED:
return 0;
case PermissionStatus.DENIED:
return 1;
case PermissionStatus.UNDETERMINED:
return 2;
default:
return 100;
}
}
export function coalesceExpirations(permissions: PermissionMap): PermissionExpiration {
const maxExpiration = 9007199254740991; // Number.MAX_SAFE_INTEGER
const expirations = Object.keys(permissions).map(type => permissions[type].expires);
expirations.sort(
(e1, e2) =>
(e1 == null || e1 === 'never' ? maxExpiration : e1) -
(e2 == null || e2 === 'never' ? maxExpiration : e2)
);
// We choose the earliest expiration
return expirations[0];
}