@webex/media-helpers 3.0.0-next.2 → 3.0.0-next.20

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
@@ -31,20 +31,16 @@ Noise reduction (e.g., background noise removal)
31
31
  The virtual background effect provides a virtual background for video calling. The virtual background may be an image, an mp4 video, or the user's background with blur applied.
32
32
 
33
33
  **Applying the effect**
34
- 1. Create a new camera track instance by using LocalCameraTrack() method.
34
+ 1. Create a new camera stream instance by using createCameraStream() method.
35
35
  2. Create a VirtualBackgroundEffect instance by passing appropriate constraints.
36
- 3. Use addEffect() method on cameraTrack to apply effect on it.
37
- 4. Enable the effect after adding it to cameraTrack using enable() method available on effect. Effect will be enabled on cameraTrack.
36
+ 3. Use addEffect() method on cameraStream to apply effect on it.
37
+ 4. Enable the effect after adding it to cameraStream using enable() method available on effect. Effect will be enabled on cameraStream.
38
38
 
39
39
  ```javascript
40
- import {LocalCameraTrack, VirtualBackgroundEffect} from '@webex/media-helpers';
40
+ import {createCameraStream, VirtualBackgroundEffect} from '@webex/media-helpers';
41
41
 
42
- // Create a new video stream by a getting user's video media.
43
- const stream = await navigator.mediaDevices.getUserMedia({ video: { width, height } });
44
-
45
- const videoTrackFromLocalStream = stream.getVideoTracks()[0];
46
-
47
- const cameraTrack = new LocalCameraTrack(new MediaStream([videoTrackFromLocalStream]));
42
+ // Create a new video stream.
43
+ const cameraStream = createCameraStream(optionalVideoConstraints);
48
44
 
49
45
  // Create the effect.
50
46
  const effect = new VirtualBackgroundEffect({
@@ -54,10 +50,10 @@ const effect = new VirtualBackgroundEffect({
54
50
  quality: `LOW`,
55
51
  });
56
52
 
57
- // add the effect on the input camera track.
58
- await cameraTrack.addEffect("background-blur", effect);
53
+ // add the effect on the input camera stream.
54
+ await cameraStream.addEffect(effect);
59
55
 
60
- //enable the effect once it is added to the track
56
+ //enable the effect once it is added to the stream
61
57
  await effect.enable()
62
58
  ```
63
59
 
@@ -65,20 +61,16 @@ await effect.enable()
65
61
  The noise reduction effect removes background noise from an audio stream to provide clear audio for calling.
66
62
 
67
63
  **Applying the effect**
68
- 1. Create a new microphone track instance by using LocalMicrophoneTrack() method.
64
+ 1. Create a new microphone stream instance by using createMicrophoneStream() method.
69
65
  2. Create a NoiseReductionEffect instance by passing appropriate constraints.
70
- 3. Use addEffect() method on microphoneTrack to apply effect on it.
71
- 4. Enable the effect after adding it to microphoneTrack using enable() method available on effect. Effect will be enabled on microphoneTrack.
66
+ 3. Use addEffect() method on microphoneStream to apply effect on it.
67
+ 4. Enable the effect after adding it to microphoneStream using enable() method available on effect. Effect will be enabled on microphoneStream.
72
68
 
73
69
  ```javascript
74
- import {LocalMicrophoneTrack, NoiseReductionEffect} from '@webex/media-helpers';
75
-
76
- // Create a new audio stream by getting a user's audio media.
77
- const stream = await navigator.mediaDevices.getUserMedia({ audio: true });
78
-
79
- const audioTrackFromLocalStream = stream.getAudioTracks()[0];
70
+ import {createMicrophoneStream, NoiseReductionEffect} from '@webex/media-helpers';
80
71
 
81
- const microphoneTrack = new LocalMicrophoneTrack(new MediaStream([audioTrackFromLocalStream]));
72
+ // Create a new audio stream.
73
+ const microphoneStream = createMicrophoneStream(optionalAudioConstraints);
82
74
 
83
75
  // Create the effect.
84
76
  const effect = new NoiseReductionEffect({
@@ -86,8 +78,8 @@ const effect = new NoiseReductionEffect({
86
78
  mode: 'WORKLET', // or 'LEGACY'
87
79
  });
88
80
 
89
- // add the effect on microphone track.
90
- await microphoneTrack.addEffect("background-noise-removal", effect);
81
+ // add the effect on microphone stream.
82
+ await microphoneStream.addEffect(effect);
91
83
 
92
84
  //enable the effect once it is added to the track
93
85
  await effect.enable()
@@ -0,0 +1,55 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.PresetCameraConstraints = exports.FacingMode = exports.DisplaySurface = void 0;
7
+ let FacingMode = exports.FacingMode = /*#__PURE__*/function (FacingMode) {
8
+ FacingMode["user"] = "user";
9
+ FacingMode["environment"] = "environment";
10
+ return FacingMode;
11
+ }({}); // can be used later on when we add constraints in create display track
12
+ let DisplaySurface = exports.DisplaySurface = /*#__PURE__*/function (DisplaySurface) {
13
+ DisplaySurface["browser"] = "browser";
14
+ DisplaySurface["monitor"] = "monitor";
15
+ DisplaySurface["window"] = "window";
16
+ return DisplaySurface;
17
+ }({});
18
+ const PresetCameraConstraints = exports.PresetCameraConstraints = {
19
+ '1080p': {
20
+ frameRate: 30,
21
+ width: 1920,
22
+ height: 1080
23
+ },
24
+ '720p': {
25
+ frameRate: 30,
26
+ width: 1280,
27
+ height: 720
28
+ },
29
+ '480p': {
30
+ frameRate: 30,
31
+ width: 640,
32
+ height: 480
33
+ },
34
+ '360p': {
35
+ frameRate: 30,
36
+ width: 640,
37
+ height: 360
38
+ },
39
+ '240p': {
40
+ frameRate: 30,
41
+ width: 320,
42
+ height: 240
43
+ },
44
+ '180p': {
45
+ frameRate: 30,
46
+ width: 320,
47
+ height: 180
48
+ },
49
+ '120p': {
50
+ frameRate: 30,
51
+ width: 160,
52
+ height: 120
53
+ }
54
+ };
55
+ //# sourceMappingURL=constants.js.map
@@ -0,0 +1 @@
1
+ null
package/dist/index.d.ts CHANGED
@@ -1,4 +1,4 @@
1
- export { getDevices, LocalStream, LocalDisplayStream, LocalSystemAudioStream, LocalStreamEventNames, StreamEventNames, type ServerMuteReason, LocalMicrophoneStreamEventNames, LocalCameraStreamEventNames, LocalMicrophoneStream, LocalCameraStream, createMicrophoneStream, createCameraStream, createDisplayStream, createDisplayStreamWithAudio, } from './webrtc-core';
1
+ export { getDevices, LocalStream, LocalDisplayStream, LocalSystemAudioStream, LocalStreamEventNames, StreamEventNames, RemoteStream, type ServerMuteReason, LocalMicrophoneStreamEventNames, LocalCameraStreamEventNames, LocalMicrophoneStream, LocalCameraStream, createMicrophoneStream, createCameraStream, createDisplayStream, createDisplayStreamWithAudio, type VideoContentHint, } from './webrtc-core';
2
2
  export { NoiseReductionEffect, VirtualBackgroundEffect } from '@webex/web-media-effects';
3
3
  export type { NoiseReductionEffectOptions, VirtualBackgroundEffectOptions, } from '@webex/web-media-effects';
4
4
  export { FacingMode, DisplaySurface, PresetCameraConstraints } from './constants';
package/dist/index.js ADDED
@@ -0,0 +1,129 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ Object.defineProperty(exports, "DisplaySurface", {
7
+ enumerable: true,
8
+ get: function () {
9
+ return _constants.DisplaySurface;
10
+ }
11
+ });
12
+ Object.defineProperty(exports, "FacingMode", {
13
+ enumerable: true,
14
+ get: function () {
15
+ return _constants.FacingMode;
16
+ }
17
+ });
18
+ Object.defineProperty(exports, "LocalCameraStream", {
19
+ enumerable: true,
20
+ get: function () {
21
+ return _webrtcCore.LocalCameraStream;
22
+ }
23
+ });
24
+ Object.defineProperty(exports, "LocalCameraStreamEventNames", {
25
+ enumerable: true,
26
+ get: function () {
27
+ return _webrtcCore.LocalCameraStreamEventNames;
28
+ }
29
+ });
30
+ Object.defineProperty(exports, "LocalDisplayStream", {
31
+ enumerable: true,
32
+ get: function () {
33
+ return _webrtcCore.LocalDisplayStream;
34
+ }
35
+ });
36
+ Object.defineProperty(exports, "LocalMicrophoneStream", {
37
+ enumerable: true,
38
+ get: function () {
39
+ return _webrtcCore.LocalMicrophoneStream;
40
+ }
41
+ });
42
+ Object.defineProperty(exports, "LocalMicrophoneStreamEventNames", {
43
+ enumerable: true,
44
+ get: function () {
45
+ return _webrtcCore.LocalMicrophoneStreamEventNames;
46
+ }
47
+ });
48
+ Object.defineProperty(exports, "LocalStream", {
49
+ enumerable: true,
50
+ get: function () {
51
+ return _webrtcCore.LocalStream;
52
+ }
53
+ });
54
+ Object.defineProperty(exports, "LocalStreamEventNames", {
55
+ enumerable: true,
56
+ get: function () {
57
+ return _webrtcCore.LocalStreamEventNames;
58
+ }
59
+ });
60
+ Object.defineProperty(exports, "LocalSystemAudioStream", {
61
+ enumerable: true,
62
+ get: function () {
63
+ return _webrtcCore.LocalSystemAudioStream;
64
+ }
65
+ });
66
+ Object.defineProperty(exports, "NoiseReductionEffect", {
67
+ enumerable: true,
68
+ get: function () {
69
+ return _webMediaEffects.NoiseReductionEffect;
70
+ }
71
+ });
72
+ Object.defineProperty(exports, "PresetCameraConstraints", {
73
+ enumerable: true,
74
+ get: function () {
75
+ return _constants.PresetCameraConstraints;
76
+ }
77
+ });
78
+ Object.defineProperty(exports, "RemoteStream", {
79
+ enumerable: true,
80
+ get: function () {
81
+ return _webrtcCore.RemoteStream;
82
+ }
83
+ });
84
+ Object.defineProperty(exports, "StreamEventNames", {
85
+ enumerable: true,
86
+ get: function () {
87
+ return _webrtcCore.StreamEventNames;
88
+ }
89
+ });
90
+ Object.defineProperty(exports, "VirtualBackgroundEffect", {
91
+ enumerable: true,
92
+ get: function () {
93
+ return _webMediaEffects.VirtualBackgroundEffect;
94
+ }
95
+ });
96
+ Object.defineProperty(exports, "createCameraStream", {
97
+ enumerable: true,
98
+ get: function () {
99
+ return _webrtcCore.createCameraStream;
100
+ }
101
+ });
102
+ Object.defineProperty(exports, "createDisplayStream", {
103
+ enumerable: true,
104
+ get: function () {
105
+ return _webrtcCore.createDisplayStream;
106
+ }
107
+ });
108
+ Object.defineProperty(exports, "createDisplayStreamWithAudio", {
109
+ enumerable: true,
110
+ get: function () {
111
+ return _webrtcCore.createDisplayStreamWithAudio;
112
+ }
113
+ });
114
+ Object.defineProperty(exports, "createMicrophoneStream", {
115
+ enumerable: true,
116
+ get: function () {
117
+ return _webrtcCore.createMicrophoneStream;
118
+ }
119
+ });
120
+ Object.defineProperty(exports, "getDevices", {
121
+ enumerable: true,
122
+ get: function () {
123
+ return _webrtcCore.getDevices;
124
+ }
125
+ });
126
+ var _webrtcCore = require("./webrtc-core");
127
+ var _webMediaEffects = require("@webex/web-media-effects");
128
+ var _constants = require("./constants");
129
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ null
@@ -1,6 +1,6 @@
1
1
  import { AudioDeviceConstraints, LocalDisplayStream, LocalSystemAudioStream, LocalMicrophoneStream as WcmeLocalMicrophoneStream, LocalCameraStream as WcmeLocalCameraStream, VideoDeviceConstraints } from '@webex/internal-media-core';
2
- import { TypedEvent } from '@webex/ts-events';
3
- export { getDevices, LocalStream, LocalDisplayStream, LocalSystemAudioStream, LocalStreamEventNames, StreamEventNames, RemoteStream, } from '@webex/internal-media-core';
2
+ import { TypedEvent, WithEventsDummyType } from '@webex/ts-events';
3
+ export { getDevices, LocalStream, LocalDisplayStream, LocalSystemAudioStream, LocalStreamEventNames, StreamEventNames, RemoteStream, type VideoContentHint, } from '@webex/internal-media-core';
4
4
  export type ServerMuteReason = 'remotelyMuted' | 'clientRequestFailed' | 'localUnmuteRequired';
5
5
  export declare enum LocalMicrophoneStreamEventNames {
6
6
  ServerMuted = "muted:byServer"
@@ -8,41 +8,51 @@ export declare enum LocalMicrophoneStreamEventNames {
8
8
  export declare enum LocalCameraStreamEventNames {
9
9
  ServerMuted = "muted:byServer"
10
10
  }
11
- export declare class LocalMicrophoneStream extends WcmeLocalMicrophoneStream {
11
+ interface LocalMicrophoneStreamEvents {
12
+ [LocalMicrophoneStreamEventNames.ServerMuted]: TypedEvent<(muted: boolean, reason: ServerMuteReason) => void>;
13
+ }
14
+ interface LocalCameraStreamEvents {
15
+ [LocalMicrophoneStreamEventNames.ServerMuted]: TypedEvent<(muted: boolean, reason: ServerMuteReason) => void>;
16
+ }
17
+ declare class _LocalMicrophoneStream extends WcmeLocalMicrophoneStream {
12
18
  private unmuteAllowed;
13
19
  [LocalMicrophoneStreamEventNames.ServerMuted]: TypedEvent<(muted: boolean, reason: ServerMuteReason) => void>;
14
20
  /**
15
- * @internal
16
- */
17
- setUnmuteAllowed(allowed: any): void;
18
- /**
19
- * @returns true if user is allowed to unmute the Stream, false otherwise
21
+ * @returns true if user is allowed to unmute the track, false otherwise
20
22
  */
21
23
  isUnmuteAllowed(): boolean;
22
24
  setMuted(muted: boolean): void;
23
- /**
24
- * @internal
25
- */
26
- setServerMuted(muted: boolean, reason: ServerMuteReason): void;
27
25
  }
28
- export declare class LocalCameraStream extends WcmeLocalCameraStream {
26
+ declare class _LocalCameraStream extends WcmeLocalCameraStream {
29
27
  private unmuteAllowed;
30
28
  [LocalCameraStreamEventNames.ServerMuted]: TypedEvent<(muted: boolean, reason: ServerMuteReason) => void>;
31
29
  /**
32
- * @internal
33
- */
34
- setUnmuteAllowed(allowed: any): void;
35
- /**
36
- * @returns true if user is allowed to unmute the Stream, false otherwise
30
+ * @returns true if user is allowed to unmute the track, false otherwise
37
31
  */
38
32
  isUnmuteAllowed(): boolean;
39
33
  setMuted(muted: boolean): void;
40
- /**
41
- * @internal
42
- */
43
- setServerMuted(muted: boolean, reason: ServerMuteReason): void;
44
34
  }
45
- export declare const createMicrophoneStream: (constraints?: AudioDeviceConstraints) => Promise<LocalMicrophoneStream>;
46
- export declare const createCameraStream: (constraints?: VideoDeviceConstraints) => Promise<LocalCameraStream>;
35
+ export declare const createMicrophoneStream: (constraints?: AudioDeviceConstraints) => Promise<{
36
+ on<K extends LocalMicrophoneStreamEventNames.ServerMuted, E extends LocalMicrophoneStreamEvents[K] extends infer T ? T extends LocalMicrophoneStreamEvents[K] ? T extends TypedEvent<infer X extends (...args: any[]) => void> ? X : never : never : never>(eventName: K, handler: E): void;
37
+ once<K_1 extends LocalMicrophoneStreamEventNames.ServerMuted, E_1 extends LocalMicrophoneStreamEvents[K_1] extends infer T_1 ? T_1 extends LocalMicrophoneStreamEvents[K_1] ? T_1 extends TypedEvent<infer X extends (...args: any[]) => void> ? X : never : never : never>(eventName: K_1, handler: E_1): void;
38
+ off<K_2 extends LocalMicrophoneStreamEventNames.ServerMuted, E_2 extends LocalMicrophoneStreamEvents[K_2] extends infer T_2 ? T_2 extends LocalMicrophoneStreamEvents[K_2] ? T_2 extends TypedEvent<infer X extends (...args: any[]) => void> ? X : never : never : never>(eventName: K_2, handler: E_2): void;
39
+ } & _LocalMicrophoneStream>;
40
+ export declare const createCameraStream: (constraints?: VideoDeviceConstraints) => Promise<{
41
+ on<K extends LocalMicrophoneStreamEventNames.ServerMuted, E extends LocalCameraStreamEvents[K] extends infer T ? T extends LocalCameraStreamEvents[K] ? T extends TypedEvent<infer X extends (...args: any[]) => void> ? X : never : never : never>(eventName: K, handler: E): void;
42
+ once<K_1 extends LocalMicrophoneStreamEventNames.ServerMuted, E_1 extends LocalCameraStreamEvents[K_1] extends infer T_1 ? T_1 extends LocalCameraStreamEvents[K_1] ? T_1 extends TypedEvent<infer X extends (...args: any[]) => void> ? X : never : never : never>(eventName: K_1, handler: E_1): void;
43
+ off<K_2 extends LocalMicrophoneStreamEventNames.ServerMuted, E_2 extends LocalCameraStreamEvents[K_2] extends infer T_2 ? T_2 extends LocalCameraStreamEvents[K_2] ? T_2 extends TypedEvent<infer X extends (...args: any[]) => void> ? X : never : never : never>(eventName: K_2, handler: E_2): void;
44
+ } & _LocalCameraStream>;
47
45
  export declare const createDisplayStream: () => Promise<LocalDisplayStream>;
48
46
  export declare const createDisplayStreamWithAudio: () => Promise<[LocalDisplayStream, LocalSystemAudioStream]>;
47
+ export declare const LocalMicrophoneStream: (new (...args: any[]) => {
48
+ on<K extends LocalMicrophoneStreamEventNames.ServerMuted, E extends LocalMicrophoneStreamEvents[K] extends infer T ? T extends LocalMicrophoneStreamEvents[K] ? T extends TypedEvent<infer X extends (...args: any[]) => void> ? X : never : never : never>(eventName: K, handler: E): void;
49
+ once<K_1 extends LocalMicrophoneStreamEventNames.ServerMuted, E_1 extends LocalMicrophoneStreamEvents[K_1] extends infer T_1 ? T_1 extends LocalMicrophoneStreamEvents[K_1] ? T_1 extends TypedEvent<infer X extends (...args: any[]) => void> ? X : never : never : never>(eventName: K_1, handler: E_1): void;
50
+ off<K_2 extends LocalMicrophoneStreamEventNames.ServerMuted, E_2 extends LocalMicrophoneStreamEvents[K_2] extends infer T_2 ? T_2 extends LocalMicrophoneStreamEvents[K_2] ? T_2 extends TypedEvent<infer X extends (...args: any[]) => void> ? X : never : never : never>(eventName: K_2, handler: E_2): void;
51
+ }) & typeof _LocalMicrophoneStream;
52
+ export type LocalMicrophoneStream = _LocalMicrophoneStream & WithEventsDummyType<LocalMicrophoneStreamEvents>;
53
+ export declare const LocalCameraStream: (new (...args: any[]) => {
54
+ on<K extends LocalMicrophoneStreamEventNames.ServerMuted, E extends LocalCameraStreamEvents[K] extends infer T ? T extends LocalCameraStreamEvents[K] ? T extends TypedEvent<infer X extends (...args: any[]) => void> ? X : never : never : never>(eventName: K, handler: E): void;
55
+ once<K_1 extends LocalMicrophoneStreamEventNames.ServerMuted, E_1 extends LocalCameraStreamEvents[K_1] extends infer T_1 ? T_1 extends LocalCameraStreamEvents[K_1] ? T_1 extends TypedEvent<infer X extends (...args: any[]) => void> ? X : never : never : never>(eventName: K_1, handler: E_1): void;
56
+ off<K_2 extends LocalMicrophoneStreamEventNames.ServerMuted, E_2 extends LocalCameraStreamEvents[K_2] extends infer T_2 ? T_2 extends LocalCameraStreamEvents[K_2] ? T_2 extends TypedEvent<infer X extends (...args: any[]) => void> ? X : never : never : never>(eventName: K_2, handler: E_2): void;
57
+ }) & typeof _LocalCameraStream;
58
+ export type LocalCameraStream = _LocalCameraStream & WithEventsDummyType<LocalCameraStreamEvents>;
@@ -0,0 +1,148 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.LocalCameraStreamEventNames = exports.LocalCameraStream = void 0;
7
+ Object.defineProperty(exports, "LocalDisplayStream", {
8
+ enumerable: true,
9
+ get: function () {
10
+ return _internalMediaCore.LocalDisplayStream;
11
+ }
12
+ });
13
+ exports.LocalMicrophoneStreamEventNames = exports.LocalMicrophoneStream = void 0;
14
+ Object.defineProperty(exports, "LocalStream", {
15
+ enumerable: true,
16
+ get: function () {
17
+ return _internalMediaCore.LocalStream;
18
+ }
19
+ });
20
+ Object.defineProperty(exports, "LocalStreamEventNames", {
21
+ enumerable: true,
22
+ get: function () {
23
+ return _internalMediaCore.LocalStreamEventNames;
24
+ }
25
+ });
26
+ Object.defineProperty(exports, "LocalSystemAudioStream", {
27
+ enumerable: true,
28
+ get: function () {
29
+ return _internalMediaCore.LocalSystemAudioStream;
30
+ }
31
+ });
32
+ Object.defineProperty(exports, "RemoteStream", {
33
+ enumerable: true,
34
+ get: function () {
35
+ return _internalMediaCore.RemoteStream;
36
+ }
37
+ });
38
+ Object.defineProperty(exports, "StreamEventNames", {
39
+ enumerable: true,
40
+ get: function () {
41
+ return _internalMediaCore.StreamEventNames;
42
+ }
43
+ });
44
+ exports.createMicrophoneStream = exports.createDisplayStreamWithAudio = exports.createDisplayStream = exports.createCameraStream = void 0;
45
+ Object.defineProperty(exports, "getDevices", {
46
+ enumerable: true,
47
+ get: function () {
48
+ return _internalMediaCore.getDevices;
49
+ }
50
+ });
51
+ var _internalMediaCore = require("@webex/internal-media-core");
52
+ var _tsEvents = require("@webex/ts-events");
53
+ /* eslint-disable @typescript-eslint/no-misused-new */
54
+ /* eslint-disable valid-jsdoc */
55
+ /* eslint-disable require-jsdoc */
56
+ // server forced the client to be unmuted
57
+ // these events are in addition to WCME events. This will be properly typed once webrtc-core event types inheritance is fixed
58
+ let LocalMicrophoneStreamEventNames = exports.LocalMicrophoneStreamEventNames = /*#__PURE__*/function (LocalMicrophoneStreamEventNames) {
59
+ LocalMicrophoneStreamEventNames["ServerMuted"] = "muted:byServer";
60
+ return LocalMicrophoneStreamEventNames;
61
+ }({}); // these events are in addition to WCME events. This will be properly typed once webrtc-core event types inheritance is fixed
62
+ let LocalCameraStreamEventNames = exports.LocalCameraStreamEventNames = /*#__PURE__*/function (LocalCameraStreamEventNames) {
63
+ LocalCameraStreamEventNames["ServerMuted"] = "muted:byServer";
64
+ return LocalCameraStreamEventNames;
65
+ }({});
66
+ class _LocalMicrophoneStream extends _internalMediaCore.LocalMicrophoneStream {
67
+ unmuteAllowed = true;
68
+ [LocalMicrophoneStreamEventNames.ServerMuted] = new _tsEvents.TypedEvent();
69
+
70
+ /**
71
+ * @internal
72
+ */
73
+ setUnmuteAllowed(allowed) {
74
+ this.unmuteAllowed = allowed;
75
+ }
76
+
77
+ /**
78
+ * @returns true if user is allowed to unmute the track, false otherwise
79
+ */
80
+ isUnmuteAllowed() {
81
+ return this.unmuteAllowed;
82
+ }
83
+ setMuted(muted) {
84
+ if (!muted) {
85
+ if (!this.isUnmuteAllowed()) {
86
+ throw new Error('Unmute is not allowed');
87
+ }
88
+ }
89
+ return super.setMuted(muted);
90
+ }
91
+
92
+ /**
93
+ * @internal
94
+ */
95
+ setServerMuted(muted, reason) {
96
+ if (muted !== this.muted) {
97
+ this.setMuted(muted);
98
+ this[LocalMicrophoneStreamEventNames.ServerMuted].emit(muted, reason);
99
+ }
100
+ }
101
+ }
102
+ class _LocalCameraStream extends _internalMediaCore.LocalCameraStream {
103
+ unmuteAllowed = true;
104
+ [LocalCameraStreamEventNames.ServerMuted] = new _tsEvents.TypedEvent();
105
+
106
+ /**
107
+ * @internal
108
+ */
109
+ setUnmuteAllowed(allowed) {
110
+ this.unmuteAllowed = allowed;
111
+ }
112
+
113
+ /**
114
+ * @returns true if user is allowed to unmute the track, false otherwise
115
+ */
116
+ isUnmuteAllowed() {
117
+ return this.unmuteAllowed;
118
+ }
119
+ setMuted(muted) {
120
+ if (!muted) {
121
+ if (!this.isUnmuteAllowed()) {
122
+ throw new Error('Unmute is not allowed');
123
+ }
124
+ }
125
+ return super.setMuted(muted);
126
+ }
127
+
128
+ /**
129
+ * @internal
130
+ */
131
+ setServerMuted(muted, reason) {
132
+ if (muted !== this.muted) {
133
+ this.setMuted(muted);
134
+ this[LocalCameraStreamEventNames.ServerMuted].emit(muted, reason);
135
+ }
136
+ }
137
+ }
138
+ const createMicrophoneStream = constraints => (0, _internalMediaCore.createMicrophoneStream)(LocalMicrophoneStream, constraints);
139
+ exports.createMicrophoneStream = createMicrophoneStream;
140
+ const createCameraStream = constraints => (0, _internalMediaCore.createCameraStream)(LocalCameraStream, constraints);
141
+ exports.createCameraStream = createCameraStream;
142
+ const createDisplayStream = () => (0, _internalMediaCore.createDisplayStream)(_internalMediaCore.LocalDisplayStream);
143
+ exports.createDisplayStream = createDisplayStream;
144
+ const createDisplayStreamWithAudio = () => (0, _internalMediaCore.createDisplayStreamWithAudio)(_internalMediaCore.LocalDisplayStream, _internalMediaCore.LocalSystemAudioStream);
145
+ exports.createDisplayStreamWithAudio = createDisplayStreamWithAudio;
146
+ const LocalMicrophoneStream = exports.LocalMicrophoneStream = (0, _tsEvents.AddEvents)(_LocalMicrophoneStream);
147
+ const LocalCameraStream = exports.LocalCameraStream = (0, _tsEvents.AddEvents)(_LocalCameraStream);
148
+ //# sourceMappingURL=webrtc-core.js.map
@@ -0,0 +1 @@
1
+ null
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@webex/media-helpers",
3
- "description": "",
3
+ "description": "Package that provides helper functions for media related activities.",
4
4
  "license": "Cisco EULA (https://www.cisco.com/c/en/us/products/end-user-license-agreement.html)",
5
5
  "main": "dist/index.js",
6
6
  "devMain": "src/index.ts",
@@ -13,22 +13,19 @@
13
13
  "node": ">=16"
14
14
  },
15
15
  "scripts": {
16
- "build:src": "yarn run -T tsc --declaration true --declarationDir ./dist",
16
+ "build": "yarn run -T tsc --declaration true --declarationDir ./dist",
17
+ "build:src": "webex-legacy-tools build -dest \"./dist\" -src \"./src\" -js -ts -maps && yarn run -T tsc --declaration true --declarationDir ./dist",
17
18
  "test:broken": "yarn test:style && yarn test:unit && yarn test:integration && yarn test:browser",
18
19
  "test:browser:broken": "webex-legacy-tools test --integration --unit --runner karma",
19
20
  "test:integration:broken": "webex-legacy-tools test --integration --runner mocha",
20
21
  "test:style": "eslint 'src/**/*.ts' --fix",
21
22
  "test:unit:broken": "webex-legacy-tools test --unit --runner mocha",
22
- "deploy:npm": "npm publish"
23
+ "deploy:npm": "yarn npm publish"
23
24
  },
24
25
  "dependencies": {
25
- "@webex/babel-config-legacy": "workspace:^",
26
- "@webex/eslint-config-legacy": "workspace:^",
27
- "@webex/internal-media-core": "^2.0.0",
28
- "@webex/jest-config-legacy": "workspace:^",
29
- "@webex/legacy-tools": "workspace:^",
26
+ "@webex/internal-media-core": "2.2.6",
30
27
  "@webex/ts-events": "^1.1.0",
31
- "@webex/web-media-effects": "^2.12.0"
28
+ "@webex/web-media-effects": "^2.15.6"
32
29
  },
33
30
  "browserify": {
34
31
  "transform": [
@@ -38,10 +35,14 @@
38
35
  },
39
36
  "devDependencies": {
40
37
  "@babel/preset-typescript": "7.22.11",
41
- "@webex/test-helper-chai": "workspace:^",
42
- "@webex/test-helper-mock-webex": "workspace:^",
38
+ "@webex/babel-config-legacy": "0.0.0",
39
+ "@webex/eslint-config-legacy": "0.0.0",
40
+ "@webex/jest-config-legacy": "0.0.0",
41
+ "@webex/legacy-tools": "0.0.0",
42
+ "@webex/test-helper-chai": "2.60.1-next.1",
43
+ "@webex/test-helper-mock-webex": "2.60.1-next.1",
43
44
  "eslint": "^8.24.0",
44
45
  "sinon": "^9.2.4"
45
46
  },
46
- "version": "3.0.0-next.2"
47
- }
47
+ "version": "3.0.0-next.20"
48
+ }
package/src/index.ts CHANGED
@@ -5,6 +5,7 @@ export {
5
5
  LocalSystemAudioStream,
6
6
  LocalStreamEventNames,
7
7
  StreamEventNames,
8
+ RemoteStream,
8
9
  type ServerMuteReason,
9
10
  LocalMicrophoneStreamEventNames,
10
11
  LocalCameraStreamEventNames,
@@ -14,6 +15,7 @@ export {
14
15
  createCameraStream,
15
16
  createDisplayStream,
16
17
  createDisplayStreamWithAudio,
18
+ type VideoContentHint,
17
19
  } from './webrtc-core';
18
20
 
19
21
  export {NoiseReductionEffect, VirtualBackgroundEffect} from '@webex/web-media-effects';
@@ -13,7 +13,7 @@ import {
13
13
  LocalCameraStream as WcmeLocalCameraStream,
14
14
  VideoDeviceConstraints,
15
15
  } from '@webex/internal-media-core';
16
- import {TypedEvent} from '@webex/ts-events';
16
+ import {AddEvents, TypedEvent, WithEventsDummyType} from '@webex/ts-events';
17
17
 
18
18
  export {
19
19
  getDevices,
@@ -23,6 +23,7 @@ export {
23
23
  LocalStreamEventNames,
24
24
  StreamEventNames,
25
25
  RemoteStream,
26
+ type VideoContentHint,
26
27
  } from '@webex/internal-media-core';
27
28
 
28
29
  export type ServerMuteReason =
@@ -40,7 +41,19 @@ export enum LocalCameraStreamEventNames {
40
41
  ServerMuted = 'muted:byServer',
41
42
  }
42
43
 
43
- export class LocalMicrophoneStream extends WcmeLocalMicrophoneStream {
44
+ interface LocalMicrophoneStreamEvents {
45
+ [LocalMicrophoneStreamEventNames.ServerMuted]: TypedEvent<
46
+ (muted: boolean, reason: ServerMuteReason) => void
47
+ >;
48
+ }
49
+
50
+ interface LocalCameraStreamEvents {
51
+ [LocalMicrophoneStreamEventNames.ServerMuted]: TypedEvent<
52
+ (muted: boolean, reason: ServerMuteReason) => void
53
+ >;
54
+ }
55
+
56
+ class _LocalMicrophoneStream extends WcmeLocalMicrophoneStream {
44
57
  private unmuteAllowed = true;
45
58
 
46
59
  [LocalMicrophoneStreamEventNames.ServerMuted] = new TypedEvent<
@@ -50,12 +63,12 @@ export class LocalMicrophoneStream extends WcmeLocalMicrophoneStream {
50
63
  /**
51
64
  * @internal
52
65
  */
53
- setUnmuteAllowed(allowed) {
66
+ setUnmuteAllowed(allowed: boolean) {
54
67
  this.unmuteAllowed = allowed;
55
68
  }
56
69
 
57
70
  /**
58
- * @returns true if user is allowed to unmute the Stream, false otherwise
71
+ * @returns true if user is allowed to unmute the track, false otherwise
59
72
  */
60
73
  isUnmuteAllowed() {
61
74
  return this.unmuteAllowed;
@@ -82,7 +95,7 @@ export class LocalMicrophoneStream extends WcmeLocalMicrophoneStream {
82
95
  }
83
96
  }
84
97
 
85
- export class LocalCameraStream extends WcmeLocalCameraStream {
98
+ class _LocalCameraStream extends WcmeLocalCameraStream {
86
99
  private unmuteAllowed = true;
87
100
 
88
101
  [LocalCameraStreamEventNames.ServerMuted] = new TypedEvent<
@@ -92,12 +105,12 @@ export class LocalCameraStream extends WcmeLocalCameraStream {
92
105
  /**
93
106
  * @internal
94
107
  */
95
- setUnmuteAllowed(allowed) {
108
+ setUnmuteAllowed(allowed: boolean) {
96
109
  this.unmuteAllowed = allowed;
97
110
  }
98
111
 
99
112
  /**
100
- * @returns true if user is allowed to unmute the Stream, false otherwise
113
+ * @returns true if user is allowed to unmute the track, false otherwise
101
114
  */
102
115
  isUnmuteAllowed() {
103
116
  return this.unmuteAllowed;
@@ -134,3 +147,17 @@ export const createDisplayStream = () => wcmeCreateDisplayStream(LocalDisplayStr
134
147
 
135
148
  export const createDisplayStreamWithAudio = () =>
136
149
  wcmeCreateDisplayStreamWithAudio(LocalDisplayStream, LocalSystemAudioStream);
150
+
151
+ export const LocalMicrophoneStream = AddEvents<
152
+ typeof _LocalMicrophoneStream,
153
+ LocalMicrophoneStreamEvents
154
+ >(_LocalMicrophoneStream);
155
+
156
+ export type LocalMicrophoneStream = _LocalMicrophoneStream &
157
+ WithEventsDummyType<LocalMicrophoneStreamEvents>;
158
+
159
+ export const LocalCameraStream = AddEvents<typeof _LocalCameraStream, LocalCameraStreamEvents>(
160
+ _LocalCameraStream
161
+ );
162
+
163
+ export type LocalCameraStream = _LocalCameraStream & WithEventsDummyType<LocalCameraStreamEvents>;
@@ -11,8 +11,8 @@ import {
11
11
  createMicrophoneStream,
12
12
  createDisplayStream,
13
13
  createDisplayStreamWithAudio,
14
- } from '../../../src/webrtc-core';
15
- import * as wcmeStreams from '@webex/internal-media-core';
14
+ } from '@webex/media-helpers';
15
+ import * as wcmestreams from '@webex/internal-media-core';
16
16
 
17
17
  describe('media-helpers', () => {
18
18
  describe('webrtc-core', () => {
@@ -36,11 +36,13 @@ describe('media-helpers', () => {
36
36
  classesToTest.forEach(({className, title, event, createFn, spyFn}) =>
37
37
  describe(title, () => {
38
38
  const fakeStream = {
39
- getStreams: sinon.stub().returns([
39
+ getTracks: sinon.stub().returns([
40
40
  {
41
- label: 'fake Stream',
42
- id: 'fake Stream id',
41
+ label: 'fake track',
42
+ id: 'fake track id',
43
43
  enabled: true,
44
+ muted: false,
45
+ addEventListener: sinon.stub(),
44
46
  },
45
47
  ]),
46
48
  };
@@ -70,51 +72,55 @@ describe('media-helpers', () => {
70
72
  await stream.setMuted(false);
71
73
  });
72
74
 
75
+ it('returns a reasonable length string from JSON.stringify()', () => {
76
+ assert.isBelow(JSON.stringify(stream).length, 200);
77
+ });
78
+
73
79
  describe('#setServerMuted', () => {
74
80
  afterEach(() => {
75
81
  sinon.restore();
76
82
  });
77
83
 
78
- const checkSetServerMuted = async (startMute, setMute, expectedCalled) => {
79
- await stream.setMuted(startMute);
84
+ const checkSetServerMuted = (startMute, setMute, expectedCalled) => {
85
+ stream.setMuted(startMute);
80
86
 
81
87
  assert.equal(stream.muted, startMute);
82
88
 
83
89
  const handler = sinon.fake();
84
90
  stream.on(event.ServerMuted, handler);
85
91
 
86
- await stream.setServerMuted(setMute, 'remotelyMuted');
92
+ stream.setServerMuted(setMute, 'remotelyMuted');
87
93
 
88
94
  assert.equal(stream.muted, setMute);
89
95
  if (expectedCalled) {
90
- assert.calledOnceWithExactly(handler, {muted: setMute, reason: 'remotelyMuted'});
96
+ assert.calledOnceWithExactly(handler, setMute, 'remotelyMuted');
91
97
  } else {
92
98
  assert.notCalled(handler);
93
99
  }
94
100
  };
95
101
 
96
102
  it('tests true to false', async () => {
97
- await checkSetServerMuted(true, false, true);
103
+ checkSetServerMuted(true, false, true);
98
104
  });
99
105
 
100
106
  it('tests false to true', async () => {
101
- await checkSetServerMuted(false, true, true);
107
+ checkSetServerMuted(false, true, true);
102
108
  });
103
109
 
104
110
  it('tests true to true', async () => {
105
- await checkSetServerMuted(true, true, false);
111
+ checkSetServerMuted(true, true, false);
106
112
  });
107
113
 
108
114
  it('tests false to false', async () => {
109
- await checkSetServerMuted(false, false, false);
115
+ checkSetServerMuted(false, false, false);
110
116
  });
111
117
  });
112
118
 
113
119
  describe('#wcmeCreateMicrophoneStream, #wcmeCreateCameraStream', () => {
114
- it('checks creating Streams', async () => {
115
- const constraints = {devideId: 'abc'};
120
+ it('checks creating tracks', async () => {
121
+ const constraints = {deviceId: 'abc'};
116
122
 
117
- const spy = sinon.stub(wcmeStreams, spyFn).returns('something');
123
+ const spy = sinon.stub(wcmestreams, spyFn).returns('something');
118
124
  const result = createFn(constraints);
119
125
 
120
126
  assert.equal(result, 'something');
@@ -126,7 +132,7 @@ describe('media-helpers', () => {
126
132
 
127
133
  describe('createDisplayStream', () => {
128
134
  it('checks createDisplayStream', async () => {
129
- const spy = sinon.stub(wcmeStreams, 'createDisplayStream').returns('something');
135
+ const spy = sinon.stub(wcmestreams, 'createDisplayStream').returns('something');
130
136
  const result = createDisplayStream();
131
137
  assert.equal(result, 'something');
132
138
  assert.calledOnceWithExactly(spy, LocalDisplayStream);
@@ -135,7 +141,7 @@ describe('media-helpers', () => {
135
141
 
136
142
  describe('createDisplayStreamWithAudio', () => {
137
143
  it('checks createDisplayStreamWithAudio', async () => {
138
- const spy = sinon.stub(wcmeStreams, 'createDisplayStreamWithAudio').returns('something');
144
+ const spy = sinon.stub(wcmestreams, 'createDisplayStreamWithAudio').returns('something');
139
145
  const result = createDisplayStreamWithAudio();
140
146
  assert.equal(result, 'something');
141
147
  assert.calledOnceWithExactly(spy, LocalDisplayStream, LocalSystemAudioStream);