@angular-helpers/browser-web-apis 21.11.0 → 21.12.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.es.md CHANGED
@@ -45,6 +45,9 @@ Paquete de servicios Angular para acceder de forma estructurada y segura a Brows
45
45
  - `IdleDetectorService` - Detectar estado idle del usuario y bloqueo de pantalla
46
46
  - `GamepadService` - Polling de entrada de controladores de juego
47
47
  - `WebAudioService` - Contexto de audio, osciladores y analizadores
48
+ - `WebLocksService` - Coordinacion de locks entre pestanas
49
+ - `StorageManagerService` - Cuotas y persistencia de almacenamiento
50
+ - `CompressionService` - Streams de compresion gzip/deflate
48
51
 
49
52
  ### APIs de red
50
53
 
@@ -706,6 +709,88 @@ export class MyComponent {
706
709
  }
707
710
  ```
708
711
 
712
+ ### injectClipboard
713
+
714
+ ```typescript
715
+ import { injectClipboard } from '@angular-helpers/browser-web-apis';
716
+
717
+ @Component({...})
718
+ export class MyComponent {
719
+ readonly cb = injectClipboard();
720
+
721
+ // cb.text() → string | null (ultimo texto copiado)
722
+ // cb.error() → string | null
723
+ // cb.busy() → boolean
724
+ // cb.isSupported() → boolean
725
+
726
+ async copy(text: string) {
727
+ await this.cb.writeText(text);
728
+ }
729
+ }
730
+ ```
731
+
732
+ ### injectGeolocation
733
+
734
+ ```typescript
735
+ import { injectGeolocation } from '@angular-helpers/browser-web-apis';
736
+
737
+ @Component({...})
738
+ export class MyComponent {
739
+ readonly geo = injectGeolocation({ watch: true });
740
+
741
+ // geo.position() → GeolocationPosition | null
742
+ // geo.error() → GeolocationPositionError | null
743
+ // geo.watching() → boolean
744
+ // geo.isSupported() → boolean
745
+
746
+ stopWatching() {
747
+ this.geo.stop();
748
+ }
749
+ }
750
+ ```
751
+
752
+ ### injectBattery
753
+
754
+ ```typescript
755
+ import { injectBattery } from '@angular-helpers/browser-web-apis';
756
+
757
+ @Component({...})
758
+ export class MyComponent {
759
+ readonly battery = injectBattery();
760
+
761
+ // battery.info() → BatteryInfo | null (nivel, carga, tiempos)
762
+ // battery.error() → string | null
763
+ // battery.isSupported() → boolean
764
+
765
+ async refresh() {
766
+ await this.battery.refresh();
767
+ }
768
+ }
769
+ ```
770
+
771
+ ### injectWakeLock
772
+
773
+ ```typescript
774
+ import { injectWakeLock } from '@angular-helpers/browser-web-apis';
775
+
776
+ @Component({...})
777
+ export class MyComponent {
778
+ readonly wakeLock = injectWakeLock();
779
+
780
+ // wakeLock.active() → boolean
781
+ // wakeLock.error() → string | null
782
+ // wakeLock.isSupported() → boolean
783
+
784
+ async toggle() {
785
+ if (this.wakeLock.active()) {
786
+ await this.wakeLock.release();
787
+ } else {
788
+ await this.wakeLock.request();
789
+ }
790
+ }
791
+ }
792
+ ```
793
+
709
794
  ### Tipo ElementInput
710
795
 
711
796
  Tanto `injectResizeObserver` como `injectIntersectionObserver` aceptan el tipo `ElementInput`:
package/README.md CHANGED
@@ -45,6 +45,9 @@ Angular services package for a structured and secure access layer over browser W
45
45
  - `IdleDetectorService` - Detect user idle state and screen lock
46
46
  - `GamepadService` - Game controller input polling
47
47
  - `WebAudioService` - Audio context, oscillators, and analysers
48
+ - `WebLocksService` - Cross-tab resource locking coordination
49
+ - `StorageManagerService` - Storage quotas and persistence
50
+ - `CompressionService` - Gzip/deflate compression streams
48
51
 
49
52
  ### Network APIs
50
53
 
@@ -64,21 +67,9 @@ Angular services package for a structured and secure access layer over browser W
64
67
 
65
68
  - `WebWorkerService` - Web Worker management
66
69
 
67
- ### Device APIs
68
-
69
- - `WebBluetoothService` - Bluetooth Low Energy device communication
70
- - `WebUsbService` - USB device I/O from the browser
71
- - `WebNfcService` - NFC tag reading and writing
72
-
73
70
  ### Detection APIs
74
71
 
75
72
  - `EyeDropperService` - Screen color picker
76
- - `BarcodeDetectorService` - QR code and barcode scanning
77
-
78
- ### Commerce & Identity APIs
79
-
80
- - `PaymentRequestService` - Native payment flows
81
- - `CredentialManagementService` - Passwords, passkeys (WebAuthn)
82
73
 
83
74
  ### Security & Capabilities
84
75
 
@@ -92,7 +83,7 @@ Angular services package for a structured and secure access layer over browser W
92
83
  ## Installation
93
84
 
94
85
  ```bash
95
- npm install @angular-helpers/browser-web-apis
86
+ pnpm add @angular-helpers/browser-web-apis
96
87
  ```
97
88
 
98
89
  ## Quick Setup
@@ -101,13 +92,21 @@ npm install @angular-helpers/browser-web-apis
101
92
 
102
93
  ```typescript
103
94
  import { provideBrowserWebApis } from '@angular-helpers/browser-web-apis';
95
+ import {
96
+ CameraService,
97
+ GeolocationService,
98
+ NotificationService,
99
+ } from '@angular-helpers/browser-web-apis';
104
100
 
105
101
  bootstrapApplication(AppComponent, {
106
102
  providers: [
107
103
  provideBrowserWebApis({
108
- enableCamera: true,
109
- enableGeolocation: true,
110
- enableNotifications: true,
104
+ services: [
105
+ CameraService,
106
+ GeolocationService,
107
+ NotificationService,
108
+ // Add more services as needed
109
+ ],
111
110
  }),
112
111
  ],
113
112
  });
@@ -146,25 +145,49 @@ Every service has a matching `provideX()` function:
146
145
  | `provideWebSocket()` | `WebSocketService` |
147
146
  | `provideWebWorker()` | `WebWorkerService` |
148
147
  | `provideBattery()` | `BatteryService` |
148
+ | `provideWebShare()` | `WebShareService` |
149
149
  | `provideIntersectionObserver()` | `IntersectionObserverService` |
150
150
  | `provideResizeObserver()` | `ResizeObserverService` |
151
151
  | `provideMutationObserver()` | `MutationObserverService` |
152
152
  | `providePerformanceObserver()` | `PerformanceObserverService` |
153
153
  | `providePageVisibility()` | `PageVisibilityService` |
154
154
  | `provideNetworkInformation()` | `NetworkInformationService` |
155
- | …and 22 more | See `src/providers/` |
155
+ | `provideScreenWakeLock()` | `ScreenWakeLockService` |
156
+ | `provideScreenOrientation()` | `ScreenOrientationService` |
157
+ | `provideFullscreen()` | `FullscreenService` |
158
+ | `provideFileSystemAccess()` | `FileSystemAccessService` |
159
+ | `provideMediaRecorder()` | `MediaRecorderService` |
160
+ | `provideBroadcastChannel()` | `BroadcastChannelService` |
161
+ | `provideServerSentEvents()` | `ServerSentEventsService` |
162
+ | `provideVibration()` | `VibrationService` |
163
+ | `provideSpeechSynthesis()` | `SpeechSynthesisService` |
164
+ | `provideWebAudio()` | `WebAudioService` |
165
+ | `provideGamepad()` | `GamepadService` |
166
+ | `provideWebLocks()` | `WebLocksService` |
167
+ | `provideStorageManager()` | `StorageManagerService` |
168
+ | `provideCompression()` | `CompressionService` |
169
+ | `provideEyeDropper()` | `EyeDropperService` |
170
+ | `provideIdleDetector()` | `IdleDetectorService` |
171
+ | `providePermissions()` | `PermissionsService` |
156
172
 
157
173
  ### Combo providers
158
174
 
159
175
  Convenience functions that bundle related services:
160
176
 
161
177
  ```typescript
162
- import { provideMediaApis, provideStorageApis } from '@angular-helpers/browser-web-apis';
178
+ import {
179
+ provideMediaApis,
180
+ provideLocationApis,
181
+ provideStorageApis,
182
+ provideCommunicationApis,
183
+ } from '@angular-helpers/browser-web-apis';
163
184
 
164
185
  bootstrapApplication(AppComponent, {
165
186
  providers: [
166
187
  provideMediaApis(), // Camera + MediaDevices + Permissions
188
+ provideLocationApis(), // Geolocation + Permissions
167
189
  provideStorageApis(), // Clipboard + WebStorage + Permissions
190
+ provideCommunicationApis(), // Notification + WebShare + WebSocket + Permissions
168
191
  ],
169
192
  });
170
193
  ```
@@ -755,6 +778,111 @@ export class MyComponent {
755
778
  }
756
779
  ```
757
780
 
781
+ ### injectClipboard
782
+
783
+ ```typescript
784
+ import { injectClipboard } from '@angular-helpers/browser-web-apis';
785
+
786
+ @Component({...})
787
+ export class MyComponent {
788
+ readonly cb = injectClipboard();
789
+
790
+ // cb.text() → string | null (last copied text)
791
+ // cb.error() → string | null
792
+ // cb.busy() → boolean
793
+ // cb.isSupported() → boolean
794
+
795
+ async copy(text: string) {
796
+ await this.cb.writeText(text);
797
+ }
798
+ }
799
+ ```
800
+
801
+ ### injectGeolocation
802
+
803
+ ```typescript
804
+ import { injectGeolocation } from '@angular-helpers/browser-web-apis';
805
+
806
+ @Component({...})
807
+ export class MyComponent {
808
+ readonly geo = injectGeolocation({ watch: true });
809
+
810
+ // geo.position() → GeolocationPosition | null
811
+ // geo.error() → GeolocationPositionError | null
812
+ // geo.watching() → boolean
813
+ // geo.isSupported() → boolean
814
+
815
+ stopWatching() {
816
+ this.geo.stop();
817
+ }
818
+ }
819
+ ```
820
+
821
+ ### injectBattery
822
+
823
+ ```typescript
824
+ import { injectBattery } from '@angular-helpers/browser-web-apis';
825
+
826
+ @Component({...})
827
+ export class MyComponent {
828
+ readonly battery = injectBattery();
829
+
830
+ // battery.info() → BatteryInfo | null (level, charging, times)
831
+ // battery.error() → string | null
832
+ // battery.isSupported() → boolean
833
+
834
+ async refresh() {
835
+ await this.battery.refresh();
836
+ }
837
+ }
838
+ ```
839
+
840
+ ### injectWakeLock
841
+
842
+ ```typescript
843
+ import { injectWakeLock } from '@angular-helpers/browser-web-apis';
844
+
845
+ @Component({...})
846
+ export class MyComponent {
847
+ readonly wakeLock = injectWakeLock();
848
+
849
+ // wakeLock.active() → boolean
850
+ // wakeLock.error() → string | null
851
+ // wakeLock.isSupported() → boolean
852
+
853
+ async toggle() {
854
+ if (this.wakeLock.active()) {
855
+ await this.wakeLock.release();
856
+ } else {
857
+ await this.wakeLock.request();
858
+ }
859
+ }
860
+ }
861
+ ```
862
+
863
+ ### injectEyeDropper
864
+
865
+ ```typescript
866
+ import { injectEyeDropper } from '@angular-helpers/browser-web-apis';
867
+
868
+ @Component({...})
869
+ export class MyComponent {
870
+ readonly dropper = injectEyeDropper();
871
+
872
+ // dropper.color() → Signal<string | null> (sRGBHex)
873
+ // dropper.isOpening() → Signal<boolean>
874
+ // dropper.error() → Signal<Error | null>
875
+ // dropper.isSupported() → Signal<boolean>
876
+
877
+ async pickColor() {
878
+ const result = await this.dropper.open();
879
+ if (result) {
880
+ console.log('Selected color:', result.sRGBHex);
881
+ }
882
+ }
883
+ }
884
+ ```
885
+
758
886
  ### ElementInput type
759
887
 
760
888
  Both `injectResizeObserver` and `injectIntersectionObserver` accept the `ElementInput` type:
@@ -42,10 +42,10 @@ class IdleDetectorService extends BrowserApiBaseService {
42
42
  return () => abortController.abort();
43
43
  });
44
44
  }
45
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.4", ngImport: i0, type: IdleDetectorService, deps: null, target: i0.ɵɵFactoryTarget.Injectable });
46
- static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "21.2.4", ngImport: i0, type: IdleDetectorService });
45
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.13", ngImport: i0, type: IdleDetectorService, deps: null, target: i0.ɵɵFactoryTarget.Injectable });
46
+ static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "21.2.13", ngImport: i0, type: IdleDetectorService });
47
47
  }
48
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.4", ngImport: i0, type: IdleDetectorService, decorators: [{
48
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.13", ngImport: i0, type: IdleDetectorService, decorators: [{
49
49
  type: Injectable
50
50
  }] });
51
51
 
@@ -66,10 +66,10 @@ class EyeDropperService extends BrowserApiBaseService {
66
66
  const eyeDropper = new (getEyeDropperClass())();
67
67
  return eyeDropper.open();
68
68
  }
69
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.4", ngImport: i0, type: EyeDropperService, deps: null, target: i0.ɵɵFactoryTarget.Injectable });
70
- static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "21.2.4", ngImport: i0, type: EyeDropperService });
69
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.13", ngImport: i0, type: EyeDropperService, deps: null, target: i0.ɵɵFactoryTarget.Injectable });
70
+ static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "21.2.13", ngImport: i0, type: EyeDropperService });
71
71
  }
72
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.4", ngImport: i0, type: EyeDropperService, decorators: [{
72
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.13", ngImport: i0, type: EyeDropperService, decorators: [{
73
73
  type: Injectable
74
74
  }] });
75
75
 
@@ -128,10 +128,10 @@ class BarcodeDetectorService extends BrowserApiBaseService {
128
128
  };
129
129
  });
130
130
  }
131
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.4", ngImport: i0, type: BarcodeDetectorService, deps: null, target: i0.ɵɵFactoryTarget.Injectable });
132
- static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "21.2.4", ngImport: i0, type: BarcodeDetectorService });
131
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.13", ngImport: i0, type: BarcodeDetectorService, deps: null, target: i0.ɵɵFactoryTarget.Injectable });
132
+ static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "21.2.13", ngImport: i0, type: BarcodeDetectorService });
133
133
  }
134
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.4", ngImport: i0, type: BarcodeDetectorService, decorators: [{
134
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.13", ngImport: i0, type: BarcodeDetectorService, decorators: [{
135
135
  type: Injectable
136
136
  }] });
137
137
 
@@ -164,10 +164,10 @@ class WebBluetoothService extends BrowserApiBaseService {
164
164
  subscriber.complete();
165
165
  });
166
166
  }
167
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.4", ngImport: i0, type: WebBluetoothService, deps: null, target: i0.ɵɵFactoryTarget.Injectable });
168
- static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "21.2.4", ngImport: i0, type: WebBluetoothService });
167
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.13", ngImport: i0, type: WebBluetoothService, deps: null, target: i0.ɵɵFactoryTarget.Injectable });
168
+ static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "21.2.13", ngImport: i0, type: WebBluetoothService });
169
169
  }
170
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.4", ngImport: i0, type: WebBluetoothService, decorators: [{
170
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.13", ngImport: i0, type: WebBluetoothService, decorators: [{
171
171
  type: Injectable
172
172
  }] });
173
173
 
@@ -220,10 +220,10 @@ class WebUsbService extends BrowserApiBaseService {
220
220
  opened: device.opened,
221
221
  };
222
222
  }
223
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.4", ngImport: i0, type: WebUsbService, deps: null, target: i0.ɵɵFactoryTarget.Injectable });
224
- static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "21.2.4", ngImport: i0, type: WebUsbService });
223
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.13", ngImport: i0, type: WebUsbService, deps: null, target: i0.ɵɵFactoryTarget.Injectable });
224
+ static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "21.2.13", ngImport: i0, type: WebUsbService });
225
225
  }
226
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.4", ngImport: i0, type: WebUsbService, decorators: [{
226
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.13", ngImport: i0, type: WebUsbService, decorators: [{
227
227
  type: Injectable
228
228
  }] });
229
229
 
@@ -269,10 +269,10 @@ class WebNfcService extends BrowserApiBaseService {
269
269
  const reader = new (getNdefReaderClass())();
270
270
  await reader.write(message, options);
271
271
  }
272
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.4", ngImport: i0, type: WebNfcService, deps: null, target: i0.ɵɵFactoryTarget.Injectable });
273
- static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "21.2.4", ngImport: i0, type: WebNfcService });
272
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.13", ngImport: i0, type: WebNfcService, deps: null, target: i0.ɵɵFactoryTarget.Injectable });
273
+ static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "21.2.13", ngImport: i0, type: WebNfcService });
274
274
  }
275
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.4", ngImport: i0, type: WebNfcService, decorators: [{
275
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.13", ngImport: i0, type: WebNfcService, decorators: [{
276
276
  type: Injectable
277
277
  }] });
278
278
 
@@ -311,10 +311,10 @@ class PaymentRequestService extends BrowserApiBaseService {
311
311
  const request = new PaymentRequest(methods, details);
312
312
  await request.abort();
313
313
  }
314
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.4", ngImport: i0, type: PaymentRequestService, deps: null, target: i0.ɵɵFactoryTarget.Injectable });
315
- static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "21.2.4", ngImport: i0, type: PaymentRequestService });
314
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.13", ngImport: i0, type: PaymentRequestService, deps: null, target: i0.ɵɵFactoryTarget.Injectable });
315
+ static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "21.2.13", ngImport: i0, type: PaymentRequestService });
316
316
  }
317
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.4", ngImport: i0, type: PaymentRequestService, decorators: [{
317
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.13", ngImport: i0, type: PaymentRequestService, decorators: [{
318
318
  type: Injectable
319
319
  }] });
320
320
 
@@ -369,10 +369,10 @@ class CredentialManagementService extends BrowserApiBaseService {
369
369
  }
370
370
  return false;
371
371
  }
372
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.4", ngImport: i0, type: CredentialManagementService, deps: null, target: i0.ɵɵFactoryTarget.Injectable });
373
- static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "21.2.4", ngImport: i0, type: CredentialManagementService });
372
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.13", ngImport: i0, type: CredentialManagementService, deps: null, target: i0.ɵɵFactoryTarget.Injectable });
373
+ static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "21.2.13", ngImport: i0, type: CredentialManagementService });
374
374
  }
375
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.4", ngImport: i0, type: CredentialManagementService, decorators: [{
375
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.13", ngImport: i0, type: CredentialManagementService, decorators: [{
376
376
  type: Injectable
377
377
  }] });
378
378