UNPKG

ngx-device-permission

Version:
172 lines (165 loc) 7 kB
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