@untemps/user-permissions-utils 1.2.5 → 1.3.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.md CHANGED
@@ -54,25 +54,62 @@ controller.abort()
54
54
 
55
55
  `getUserMediaStream`:
56
56
 
57
- Returns a promise resolved when the permission is granted and the stream is retrieved
57
+ Returns a promise resolved when the permission is granted and the stream is retrieved. Accepts an optional `signal` to cancel the entire operation.
58
+
59
+ The `permissionName` and `mediaStreamConstraints` must match the same media device:
60
+
61
+ | `permissionName` | `mediaStreamConstraints` |
62
+ |---|---|
63
+ | `'microphone'` | `{ audio: true }` |
64
+ | `'camera'` | `{ video: true }` |
65
+
66
+ ```javascript
67
+ import { getUserMediaStream } from '@untemps/user-permissions-utils'
68
+
69
+ // Microphone
70
+ const init = async () => {
71
+ try {
72
+ const stream = await getUserMediaStream('microphone', { audio: true })
73
+ const audioContext = new AudioContext()
74
+ const streamNode = audioContext.createMediaStreamSource(stream)
75
+ ...
76
+ } catch (error) {
77
+ console.error(error)
78
+ }
79
+ }
80
+
81
+ // Camera
82
+ const initCamera = async () => {
83
+ try {
84
+ const stream = await getUserMediaStream('camera', { video: true })
85
+ const videoElement = document.querySelector('video')
86
+ videoElement.srcObject = stream
87
+ ...
88
+ } catch (error) {
89
+ console.error(error)
90
+ }
91
+ }
92
+ ```
93
+
94
+ To cancel a pending stream acquisition:
58
95
 
59
96
  ```javascript
60
97
  import { getUserMediaStream } from '@untemps/user-permissions-utils'
61
98
 
99
+ const controller = new AbortController()
100
+
62
101
  const init = async () => {
63
102
  try {
64
- const stream = await getUserMediaStream('microphone', { audio: true })
65
- if(!!stream) {
66
- const audioContext = new AudioContext()
67
- const streamNode = audioContext.createMediaStreamSource(stream)
68
- ...
69
- } else {
70
- console.error('Stream is not available')
71
- }
103
+ const stream = await getUserMediaStream('microphone', { audio: true }, { signal: controller.signal })
104
+ ...
72
105
  } catch (error) {
106
+ if (error.name === 'AbortError') return
73
107
  console.error(error)
74
108
  }
75
109
  }
110
+
111
+ // Cancel the operation at any point (permission wait or stream acquisition)
112
+ controller.abort()
76
113
  ```
77
114
 
78
115
  `isNavigatorPermissionsSupported`:
package/dist/index.d.ts CHANGED
@@ -4,7 +4,8 @@ export declare function getPermission(
4
4
  ): Promise<'granted'>
5
5
  export declare function getUserMediaStream(
6
6
  permissionName: PermissionName,
7
- constraints: MediaStreamConstraints
7
+ constraints: MediaStreamConstraints,
8
+ options?: { signal?: AbortSignal }
8
9
  ): Promise<MediaStream>
9
10
  export declare function isNavigatorPermissionsSupported(): boolean
10
11
  export declare function isNavigatorMediaDevicesSupported(): boolean
package/dist/index.es.js CHANGED
@@ -20,9 +20,10 @@ var e = () => !!navigator.permissions, t = () => !!navigator.mediaDevices, n = a
20
20
  }, r = (e) => {
21
21
  if (e === "denied") throw new DOMException("Permission denied", "NOT_ALLOWED_ERR");
22
22
  return e;
23
- }, i = async (r, i) => {
23
+ }, i = async (n, r, { signal: i } = {}) => {
24
24
  if (!e() || !t()) throw new DOMException("Navigator API: permissions or Navigator API: mediaDevices not supported", "NOT_SUPPORTED_ERR");
25
- return await n(r), navigator.mediaDevices.getUserMedia(i);
25
+ if (i?.throwIfAborted(), (await navigator.permissions.query({ name: n })).state === "denied") throw new DOMException("Permission denied", "NOT_ALLOWED_ERR");
26
+ return i?.throwIfAborted(), navigator.mediaDevices.getUserMedia(r);
26
27
  };
27
28
  //#endregion
28
29
  export { n as getPermission, i as getUserMediaStream, t as isNavigatorMediaDevicesSupported, e as isNavigatorPermissionsSupported };
package/dist/index.js CHANGED
@@ -1 +1 @@
1
- Object.defineProperty(exports,Symbol.toStringTag,{value:`Module`});var e=()=>!!navigator.permissions,t=()=>!!navigator.mediaDevices,n=async(t,{signal:n}={})=>{if(!e())throw new DOMException(`Navigator API: permissions not supported`,`NOT_SUPPORTED_ERR`);n?.throwIfAborted();let i=await navigator.permissions.query({name:t});return i.state===`prompt`?new Promise((e,t)=>{n?.throwIfAborted();let a=s=>{i.removeEventListener(`change`,a),n?.removeEventListener(`abort`,o);try{e(r(s.target.state))}catch(e){t(e)}},o=()=>{i.removeEventListener(`change`,a),t(n.reason)};i.addEventListener(`change`,a),n?.addEventListener(`abort`,o,{once:!0})}):r(i.state)},r=e=>{if(e===`denied`)throw new DOMException(`Permission denied`,`NOT_ALLOWED_ERR`);return e},i=async(r,i)=>{if(!e()||!t())throw new DOMException(`Navigator API: permissions or Navigator API: mediaDevices not supported`,`NOT_SUPPORTED_ERR`);return await n(r),navigator.mediaDevices.getUserMedia(i)};exports.getPermission=n,exports.getUserMediaStream=i,exports.isNavigatorMediaDevicesSupported=t,exports.isNavigatorPermissionsSupported=e;
1
+ Object.defineProperty(exports,Symbol.toStringTag,{value:`Module`});var e=()=>!!navigator.permissions,t=()=>!!navigator.mediaDevices,n=async(t,{signal:n}={})=>{if(!e())throw new DOMException(`Navigator API: permissions not supported`,`NOT_SUPPORTED_ERR`);n?.throwIfAborted();let i=await navigator.permissions.query({name:t});return i.state===`prompt`?new Promise((e,t)=>{n?.throwIfAborted();let a=s=>{i.removeEventListener(`change`,a),n?.removeEventListener(`abort`,o);try{e(r(s.target.state))}catch(e){t(e)}},o=()=>{i.removeEventListener(`change`,a),t(n.reason)};i.addEventListener(`change`,a),n?.addEventListener(`abort`,o,{once:!0})}):r(i.state)},r=e=>{if(e===`denied`)throw new DOMException(`Permission denied`,`NOT_ALLOWED_ERR`);return e},i=async(n,r,{signal:i}={})=>{if(!e()||!t())throw new DOMException(`Navigator API: permissions or Navigator API: mediaDevices not supported`,`NOT_SUPPORTED_ERR`);if(i?.throwIfAborted(),(await navigator.permissions.query({name:n})).state===`denied`)throw new DOMException(`Permission denied`,`NOT_ALLOWED_ERR`);return i?.throwIfAborted(),navigator.mediaDevices.getUserMedia(r)};exports.getPermission=n,exports.getUserMediaStream=i,exports.isNavigatorMediaDevicesSupported=t,exports.isNavigatorPermissionsSupported=e;
package/dist/index.umd.js CHANGED
@@ -1 +1 @@
1
- (function(e,t){typeof exports==`object`&&typeof module<`u`?t(exports):typeof define==`function`&&define.amd?define([`exports`],t):(e=typeof globalThis<`u`?globalThis:e||self,t(e.UserPermissionsUtils={}))})(this,function(e){Object.defineProperty(e,Symbol.toStringTag,{value:`Module`});var t=()=>!!navigator.permissions,n=()=>!!navigator.mediaDevices,r=async(e,{signal:n}={})=>{if(!t())throw new DOMException(`Navigator API: permissions not supported`,`NOT_SUPPORTED_ERR`);n?.throwIfAborted();let r=await navigator.permissions.query({name:e});return r.state===`prompt`?new Promise((e,t)=>{n?.throwIfAborted();let a=s=>{r.removeEventListener(`change`,a),n?.removeEventListener(`abort`,o);try{e(i(s.target.state))}catch(e){t(e)}},o=()=>{r.removeEventListener(`change`,a),t(n.reason)};r.addEventListener(`change`,a),n?.addEventListener(`abort`,o,{once:!0})}):i(r.state)},i=e=>{if(e===`denied`)throw new DOMException(`Permission denied`,`NOT_ALLOWED_ERR`);return e};e.getPermission=r,e.getUserMediaStream=async(e,i)=>{if(!t()||!n())throw new DOMException(`Navigator API: permissions or Navigator API: mediaDevices not supported`,`NOT_SUPPORTED_ERR`);return await r(e),navigator.mediaDevices.getUserMedia(i)},e.isNavigatorMediaDevicesSupported=n,e.isNavigatorPermissionsSupported=t});
1
+ (function(e,t){typeof exports==`object`&&typeof module<`u`?t(exports):typeof define==`function`&&define.amd?define([`exports`],t):(e=typeof globalThis<`u`?globalThis:e||self,t(e.UserPermissionsUtils={}))})(this,function(e){Object.defineProperty(e,Symbol.toStringTag,{value:`Module`});var t=()=>!!navigator.permissions,n=()=>!!navigator.mediaDevices,r=async(e,{signal:n}={})=>{if(!t())throw new DOMException(`Navigator API: permissions not supported`,`NOT_SUPPORTED_ERR`);n?.throwIfAborted();let r=await navigator.permissions.query({name:e});return r.state===`prompt`?new Promise((e,t)=>{n?.throwIfAborted();let a=s=>{r.removeEventListener(`change`,a),n?.removeEventListener(`abort`,o);try{e(i(s.target.state))}catch(e){t(e)}},o=()=>{r.removeEventListener(`change`,a),t(n.reason)};r.addEventListener(`change`,a),n?.addEventListener(`abort`,o,{once:!0})}):i(r.state)},i=e=>{if(e===`denied`)throw new DOMException(`Permission denied`,`NOT_ALLOWED_ERR`);return e};e.getPermission=r,e.getUserMediaStream=async(e,r,{signal:i}={})=>{if(!t()||!n())throw new DOMException(`Navigator API: permissions or Navigator API: mediaDevices not supported`,`NOT_SUPPORTED_ERR`);if(i?.throwIfAborted(),(await navigator.permissions.query({name:e})).state===`denied`)throw new DOMException(`Permission denied`,`NOT_ALLOWED_ERR`);return i?.throwIfAborted(),navigator.mediaDevices.getUserMedia(r)},e.isNavigatorMediaDevicesSupported=n,e.isNavigatorPermissionsSupported=t});
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@untemps/user-permissions-utils",
3
- "version": "1.2.5",
3
+ "version": "1.3.1",
4
4
  "description": "Collection of utility functions to manage user permissions",
5
5
  "repository": "git@github.com:untemps/user-permissions-utils.git",
6
6
  "keywords": [