ngx-device-permission
Version:
Angular library for handling device permissions
172 lines (165 loc) • 7 kB
JavaScript
import * as i0 from '@angular/core';
import { Injectable } from '@angular/core';
import { of, from, Observable, throwError } from 'rxjs';
import { map } from 'rxjs/operators';
class DevicePermissionService {
/**
* Returns the current state of a given permission.
* @param name Name of the permission (e.g., 'camera', 'microphone', 'geolocation', etc.)
*/
getPermissionStatus(name) {
if (!this.isSupported()) {
return of('prompt');
}
return from(navigator.permissions.query({ name })).pipe(map((status) => status.state));
}
/**
* Observes changes to the state of a given permission.
* @param name Name of the permission to observe
*/
observePermissionChange(name) {
if (!this.isSupported()) {
return of('prompt');
}
return new Observable((observer) => {
navigator.permissions.query({ name }).then((status) => {
const emit = () => observer.next(status.state);
emit();
status.onchange = emit;
});
});
}
/**
* Checks if the Permissions API is available in the current environment.
*/
isSupported() {
return typeof window !== 'undefined' && 'permissions' in navigator;
}
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.2.12", ngImport: i0, type: DevicePermissionService, deps: [], target: i0.ɵɵFactoryTarget.Injectable });
static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "19.2.12", ngImport: i0, type: DevicePermissionService, providedIn: 'root' });
}
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.12", ngImport: i0, type: DevicePermissionService, decorators: [{
type: Injectable,
args: [{
providedIn: 'root',
}]
}] });
/**
* A service for accessing media devices such as microphone and camera
* using the MediaDevices API in a reactive (RxJS) way.
*/
class MediaDeviceService {
/**
* Requests access to media devices (camera and/or microphone).
* @param constraints MediaStreamConstraints (e.g., { audio: true, video: true })
* @returns Observable that emits the MediaStream or error.
*/
requestAccess(constraints) {
if (!this.isSupported()) {
return throwError(() => new Error('MediaDevices API is not supported in this environment.'));
}
return from(navigator.mediaDevices.getUserMedia(constraints));
}
/**
* Retrieves a list of all connected media input and output devices.
* @returns Observable that emits the array of MediaDeviceInfo.
*/
enumerateDevices() {
if (!this.isSupported()) {
return of([]);
}
return from(navigator.mediaDevices.enumerateDevices());
}
/**
* Checks whether the MediaDevices API is available.
*/
isSupported() {
return (typeof navigator !== 'undefined' &&
!!navigator.mediaDevices &&
typeof navigator.mediaDevices.getUserMedia === 'function');
}
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.2.12", ngImport: i0, type: MediaDeviceService, deps: [], target: i0.ɵɵFactoryTarget.Injectable });
static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "19.2.12", ngImport: i0, type: MediaDeviceService, providedIn: 'root' });
}
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.12", ngImport: i0, type: MediaDeviceService, decorators: [{
type: Injectable,
args: [{
providedIn: 'root',
}]
}] });
class GeolocationService {
/**
* Requests the current location of the user.
* Emits coordinates if successful, or an error if denied or unavailable.
*/
requestLocation() {
return new Observable((observer) => {
if (!navigator.geolocation) {
observer.error(new Error('Geolocation API is not supported in this browser.'));
return;
}
navigator.geolocation.getCurrentPosition((position) => {
observer.next(position);
observer.complete();
}, (error) => observer.error(error));
});
}
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.2.12", ngImport: i0, type: GeolocationService, deps: [], target: i0.ɵɵFactoryTarget.Injectable });
static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "19.2.12", ngImport: i0, type: GeolocationService, providedIn: 'root' });
}
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.12", ngImport: i0, type: GeolocationService, decorators: [{
type: Injectable,
args: [{ providedIn: 'root' }]
}] });
class ClipboardService {
/**
* Try to request access to clipboard-read permission
* by invoking navigator.clipboard.readText()
*/
requestClipboardReadAccess() {
return new Observable((observer) => {
if (!navigator.clipboard?.readText) {
observer.error(new Error('Clipboard API not supported in this browser.'));
return;
}
navigator.clipboard
.readText()
.then((text) => {
observer.next(text);
observer.complete();
})
.catch((error) => observer.error(error));
});
}
/**
* Try to write text to clipboard to trigger clipboard-write permission
*/
requestClipboardWriteAccess(text) {
return new Observable((observer) => {
if (!navigator.clipboard?.writeText) {
observer.error(new Error('Clipboard API not supported in this browser.'));
return;
}
navigator.clipboard
.writeText(text)
.then(() => {
observer.next();
observer.complete();
})
.catch((error) => observer.error(error));
});
}
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.2.12", ngImport: i0, type: ClipboardService, deps: [], target: i0.ɵɵFactoryTarget.Injectable });
static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "19.2.12", ngImport: i0, type: ClipboardService, providedIn: 'root' });
}
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.12", ngImport: i0, type: ClipboardService, decorators: [{
type: Injectable,
args: [{
providedIn: 'root',
}]
}] });
/**
* Generated bundle index. Do not edit.
*/
export { ClipboardService, DevicePermissionService, GeolocationService, MediaDeviceService };
//# sourceMappingURL=ngx-device-permission.mjs.map