@whereby.com/browser-sdk 2.0.0-alpha23 → 2.0.0-alpha26

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.
Files changed (83) hide show
  1. package/README.md +14 -0
  2. package/dist/LocalMedia.d.ts +53 -0
  3. package/dist/LocalMedia.js +154 -0
  4. package/dist/RoomConnection.d.ts +174 -0
  5. package/dist/RoomConnection.js +617 -0
  6. package/dist/RoomParticipant.d.ts +50 -0
  7. package/dist/RoomParticipant.js +48 -0
  8. package/dist/api/ApiClient.d.ts +26 -0
  9. package/dist/api/ApiClient.js +63 -0
  10. package/dist/api/Credentials.d.ts +17 -0
  11. package/dist/api/Credentials.js +16 -0
  12. package/dist/api/HttpClient.d.ts +16 -0
  13. package/dist/api/HttpClient.js +53 -0
  14. package/dist/api/MultipartHttpClient.d.ts +10 -0
  15. package/dist/api/MultipartHttpClient.js +25 -0
  16. package/dist/api/OrganizationApiClient.d.ts +16 -0
  17. package/dist/api/OrganizationApiClient.js +30 -0
  18. package/dist/api/Response.d.ts +29 -0
  19. package/dist/api/Response.js +9 -0
  20. package/dist/api/credentialsService/index.d.ts +27 -0
  21. package/dist/api/credentialsService/index.js +90 -0
  22. package/dist/api/deviceService/index.d.ts +9 -0
  23. package/dist/api/deviceService/index.js +25 -0
  24. package/dist/api/extractUtils.d.ts +16 -0
  25. package/dist/api/extractUtils.js +51 -0
  26. package/dist/api/index.d.ts +7 -0
  27. package/dist/api/index.js +7 -0
  28. package/dist/api/localStorageWrapper/index.d.ts +2 -0
  29. package/dist/api/localStorageWrapper/index.js +15 -0
  30. package/dist/api/models/Account.d.ts +20 -0
  31. package/dist/api/models/Account.js +24 -0
  32. package/dist/api/models/Meeting.d.ts +12 -0
  33. package/dist/api/models/Meeting.js +29 -0
  34. package/dist/api/models/Organization.d.ts +102 -0
  35. package/dist/api/models/Organization.js +81 -0
  36. package/dist/api/models/Room.d.ts +4 -0
  37. package/dist/api/models/Room.js +38 -0
  38. package/dist/api/models/account/EmbeddedFreeTierStatus.d.ts +13 -0
  39. package/dist/api/models/account/EmbeddedFreeTierStatus.js +17 -0
  40. package/dist/api/modules/AbstractStore.d.ts +5 -0
  41. package/dist/api/modules/AbstractStore.js +1 -0
  42. package/dist/api/modules/ChromeStorageStore.d.ts +10 -0
  43. package/dist/api/modules/ChromeStorageStore.js +21 -0
  44. package/dist/api/modules/LocalStorageStore.d.ts +9 -0
  45. package/dist/api/modules/LocalStorageStore.js +35 -0
  46. package/dist/api/modules/tests/__mocks__/storage.d.ts +10 -0
  47. package/dist/api/modules/tests/__mocks__/storage.js +19 -0
  48. package/dist/api/organizationService/index.d.ts +46 -0
  49. package/dist/api/organizationService/index.js +159 -0
  50. package/dist/api/organizationServiceCache/index.d.ts +13 -0
  51. package/dist/api/organizationServiceCache/index.js +20 -0
  52. package/dist/api/parameterAssertUtils.d.ts +13 -0
  53. package/dist/api/parameterAssertUtils.js +64 -0
  54. package/dist/api/roomService/index.d.ts +54 -0
  55. package/dist/api/roomService/index.js +160 -0
  56. package/dist/api/test/helpers.d.ts +5 -0
  57. package/dist/api/test/helpers.js +32 -0
  58. package/dist/api/types.d.ts +5 -0
  59. package/dist/api/types.js +1 -0
  60. package/dist/embed/index.d.ts +31 -0
  61. package/dist/embed/index.js +123 -0
  62. package/dist/index.d.ts +5 -0
  63. package/dist/index.js +5 -0
  64. package/dist/react/VideoView.d.ts +15 -0
  65. package/dist/react/VideoView.js +37 -0
  66. package/dist/react/index.d.ts +3 -0
  67. package/dist/react/index.js +3 -0
  68. package/dist/react/useLocalMedia.d.ts +28 -0
  69. package/dist/react/useLocalMedia.js +109 -0
  70. package/dist/react/useRoomConnection.d.ts +47 -0
  71. package/dist/react/useRoomConnection.js +283 -0
  72. package/dist/utils/debounce.d.ts +9 -0
  73. package/dist/utils/debounce.js +20 -0
  74. package/dist/utils/fakeAudioStream.d.ts +1 -0
  75. package/dist/utils/fakeAudioStream.js +18 -0
  76. package/dist/utils/fakeWebcamFrame.d.ts +1 -0
  77. package/dist/utils/fakeWebcamFrame.js +49 -0
  78. package/dist/v2-alpha26.js +1993 -0
  79. package/package.json +24 -12
  80. package/dist/lib.cjs +0 -6200
  81. package/dist/lib.esm.js +0 -6182
  82. package/dist/types.d.ts +0 -382
  83. package/dist/v2-alpha23.js +0 -43
package/README.md CHANGED
@@ -99,6 +99,20 @@ function MyCallUX( { roomUrl, localStream }) {
99
99
 
100
100
  ```
101
101
 
102
+ ### Usage with Vite development environment
103
+
104
+ There is a [known Vite issue](https://github.com/vitejs/vite/issues/1973) where modules trying to access `process.env` throw `Uncaught ReferenceError: process is not defined`.
105
+ This can be solved in `vite.config.js` with the following line:
106
+
107
+ ``` javascript
108
+ export default defineConfig({
109
+ ...rest,
110
+ define: {
111
+ 'process.env': {}
112
+ },
113
+ });
114
+ ```
115
+
102
116
  #### Usage with Next.js
103
117
 
104
118
  If you are integrating these React hooks with Next.js, you need to ensure your
@@ -0,0 +1,53 @@
1
+ import RtcManager from "@whereby/jslib-media/src/webrtc/RtcManager";
2
+ type CameraEnabledEvent = {
3
+ enabled: boolean;
4
+ };
5
+ type MicrophoneEnabledEvent = {
6
+ enabled: boolean;
7
+ };
8
+ type DeviceListUpdatedEvent = {
9
+ cameraDevices: MediaDeviceInfo[];
10
+ microphoneDevices: MediaDeviceInfo[];
11
+ speakerDevices: MediaDeviceInfo[];
12
+ };
13
+ type DeviceListUpdateErrorEvent = {
14
+ error: unknown;
15
+ };
16
+ type StreamUpdatedEvent = {
17
+ stream: MediaStream;
18
+ };
19
+ interface LocalMediaEventsMap {
20
+ camera_enabled: CustomEvent<CameraEnabledEvent>;
21
+ device_list_updated: CustomEvent<DeviceListUpdatedEvent>;
22
+ device_list_update_error: CustomEvent<DeviceListUpdateErrorEvent>;
23
+ microphone_enabled: CustomEvent<MicrophoneEnabledEvent>;
24
+ stream_updated: CustomEvent<StreamUpdatedEvent>;
25
+ }
26
+ interface LocalMediaEventTarget extends EventTarget {
27
+ addEventListener<K extends keyof LocalMediaEventsMap>(type: K, listener: (ev: LocalMediaEventsMap[K]) => void, options?: boolean | AddEventListenerOptions): void;
28
+ addEventListener(type: string, callback: EventListenerOrEventListenerObject | null, options?: EventListenerOptions | boolean): void;
29
+ }
30
+ declare const TypedLocalMediaEventTarget: new () => LocalMediaEventTarget;
31
+ export default class LocalMedia extends TypedLocalMediaEventTarget {
32
+ private _constraints;
33
+ _rtcManagers: RtcManager[];
34
+ stream: MediaStream;
35
+ screenshareStream?: MediaStream;
36
+ constructor(constraintsOrStream: MediaStreamConstraints | MediaStream);
37
+ addRtcManager(rtcManager: RtcManager): void;
38
+ removeRtcManager(rtcManager: RtcManager): void;
39
+ getCameraDeviceId(): string | undefined;
40
+ getMicrophoneDeviceId(): string | undefined;
41
+ isCameraEnabled(): boolean;
42
+ isMicrophoneEnabled(): boolean;
43
+ toggleCameraEnabled(enabled?: boolean): void;
44
+ toggleMichrophoneEnabled(enabled?: boolean): void;
45
+ startScreenshare(): Promise<MediaStream>;
46
+ stopScreenshare(): void;
47
+ setCameraDevice(deviceId: string): Promise<void>;
48
+ setMicrophoneDevice(deviceId: string): Promise<void>;
49
+ private _updateDeviceList;
50
+ start(): Promise<MediaStream>;
51
+ stop(): void;
52
+ }
53
+ export {};
@@ -0,0 +1,154 @@
1
+ import { __awaiter } from "tslib";
2
+ const TypedLocalMediaEventTarget = EventTarget;
3
+ export default class LocalMedia extends TypedLocalMediaEventTarget {
4
+ constructor(constraintsOrStream) {
5
+ super();
6
+ this._constraints = null;
7
+ if (constraintsOrStream instanceof MediaStream) {
8
+ this.stream = constraintsOrStream;
9
+ }
10
+ else {
11
+ this._constraints = constraintsOrStream;
12
+ this.stream = new MediaStream();
13
+ }
14
+ this._rtcManagers = [];
15
+ this.screenshareStream = undefined;
16
+ navigator.mediaDevices.addEventListener("devicechange", this._updateDeviceList.bind(this));
17
+ }
18
+ addRtcManager(rtcManager) {
19
+ this._rtcManagers.push(rtcManager);
20
+ }
21
+ removeRtcManager(rtcManager) {
22
+ this._rtcManagers = this._rtcManagers.filter((r) => r !== rtcManager);
23
+ }
24
+ getCameraDeviceId() {
25
+ var _a;
26
+ return (_a = this.stream.getVideoTracks()[0]) === null || _a === void 0 ? void 0 : _a.getSettings().deviceId;
27
+ }
28
+ getMicrophoneDeviceId() {
29
+ var _a;
30
+ return (_a = this.stream.getAudioTracks()[0]) === null || _a === void 0 ? void 0 : _a.getSettings().deviceId;
31
+ }
32
+ isCameraEnabled() {
33
+ var _a;
34
+ return !!((_a = this.stream.getVideoTracks()[0]) === null || _a === void 0 ? void 0 : _a.enabled);
35
+ }
36
+ isMicrophoneEnabled() {
37
+ var _a;
38
+ return !!((_a = this.stream.getAudioTracks()[0]) === null || _a === void 0 ? void 0 : _a.enabled);
39
+ }
40
+ toggleCameraEnabled(enabled) {
41
+ const videoTrack = this.stream.getVideoTracks()[0];
42
+ if (!videoTrack) {
43
+ return;
44
+ }
45
+ const newValue = enabled !== null && enabled !== void 0 ? enabled : !videoTrack.enabled;
46
+ videoTrack.enabled = newValue;
47
+ this.dispatchEvent(new CustomEvent("camera_enabled", { detail: { enabled: newValue } }));
48
+ }
49
+ toggleMichrophoneEnabled(enabled) {
50
+ const audioTrack = this.stream.getAudioTracks()[0];
51
+ if (!audioTrack) {
52
+ return;
53
+ }
54
+ const newValue = enabled !== null && enabled !== void 0 ? enabled : !audioTrack.enabled;
55
+ audioTrack.enabled = newValue;
56
+ this.dispatchEvent(new CustomEvent("microphone_enabled", { detail: { enabled: newValue } }));
57
+ }
58
+ startScreenshare() {
59
+ return __awaiter(this, void 0, void 0, function* () {
60
+ if (this.screenshareStream) {
61
+ return this.screenshareStream;
62
+ }
63
+ const screenshareStream = yield navigator.mediaDevices.getDisplayMedia();
64
+ this.screenshareStream = screenshareStream;
65
+ return this.screenshareStream;
66
+ });
67
+ }
68
+ stopScreenshare() {
69
+ var _a;
70
+ (_a = this.screenshareStream) === null || _a === void 0 ? void 0 : _a.getTracks().forEach((track) => track.stop());
71
+ this.screenshareStream = undefined;
72
+ }
73
+ setCameraDevice(deviceId) {
74
+ return __awaiter(this, void 0, void 0, function* () {
75
+ const newStream = yield navigator.mediaDevices.getUserMedia({ video: { deviceId } });
76
+ const newVideoTrack = newStream.getVideoTracks()[0];
77
+ if (newVideoTrack) {
78
+ const oldVideoTrack = this.stream.getVideoTracks()[0];
79
+ newVideoTrack.enabled = oldVideoTrack.enabled;
80
+ oldVideoTrack === null || oldVideoTrack === void 0 ? void 0 : oldVideoTrack.stop();
81
+ this._rtcManagers.forEach((rtcManager) => {
82
+ rtcManager.replaceTrack(oldVideoTrack, newVideoTrack);
83
+ });
84
+ this.stream.removeTrack(oldVideoTrack);
85
+ this.stream.addTrack(newVideoTrack);
86
+ }
87
+ this.dispatchEvent(new CustomEvent("stream_updated", {
88
+ detail: { stream: this.stream },
89
+ }));
90
+ });
91
+ }
92
+ setMicrophoneDevice(deviceId) {
93
+ return __awaiter(this, void 0, void 0, function* () {
94
+ const newStream = yield navigator.mediaDevices.getUserMedia({ audio: { deviceId } });
95
+ const newAudioTrack = newStream.getAudioTracks()[0];
96
+ const oldAudioTrack = this.stream.getAudioTracks()[0];
97
+ if (oldAudioTrack) {
98
+ newAudioTrack.enabled = oldAudioTrack.enabled;
99
+ oldAudioTrack.stop();
100
+ this.stream.removeTrack(oldAudioTrack);
101
+ }
102
+ this._rtcManagers.forEach((rtcManager) => {
103
+ rtcManager.replaceTrack(oldAudioTrack, newAudioTrack);
104
+ });
105
+ this.stream.addTrack(newAudioTrack);
106
+ this.dispatchEvent(new CustomEvent("stream_updated", {
107
+ detail: { stream: this.stream },
108
+ }));
109
+ });
110
+ }
111
+ _updateDeviceList() {
112
+ return __awaiter(this, void 0, void 0, function* () {
113
+ try {
114
+ const devices = yield navigator.mediaDevices.enumerateDevices();
115
+ this.dispatchEvent(new CustomEvent("device_list_updated", {
116
+ detail: {
117
+ cameraDevices: devices.filter((d) => d.kind === "videoinput"),
118
+ microphoneDevices: devices.filter((d) => d.kind === "audioinput"),
119
+ speakerDevices: devices.filter((d) => d.kind === "audiooutput"),
120
+ },
121
+ }));
122
+ }
123
+ catch (error) {
124
+ this.dispatchEvent(new CustomEvent("device_list_update_error", {
125
+ detail: {
126
+ error,
127
+ },
128
+ }));
129
+ throw error;
130
+ }
131
+ });
132
+ }
133
+ start() {
134
+ return __awaiter(this, void 0, void 0, function* () {
135
+ if (this._constraints) {
136
+ const newStream = yield navigator.mediaDevices.getUserMedia(this._constraints);
137
+ newStream.getTracks().forEach((t) => this.stream.addTrack(t));
138
+ }
139
+ this._updateDeviceList();
140
+ this.dispatchEvent(new CustomEvent("stream_updated", {
141
+ detail: { stream: this.stream },
142
+ }));
143
+ return this.stream;
144
+ });
145
+ }
146
+ stop() {
147
+ var _a;
148
+ if (this._constraints) {
149
+ (_a = this.stream) === null || _a === void 0 ? void 0 : _a.getTracks().forEach((t) => {
150
+ t.stop();
151
+ });
152
+ }
153
+ }
154
+ }
@@ -0,0 +1,174 @@
1
+ import { RtcStreamAddedPayload } from "@whereby/jslib-media/src/webrtc/RtcManagerDispatcher";
2
+ import { LocalParticipant, RemoteParticipant, Screenshare, WaitingParticipant } from "./RoomParticipant";
3
+ import { ChatMessage as SignalChatMessage } from "@whereby/jslib-media/src/utils/ServerSocket";
4
+ import LocalMedia from "./LocalMedia";
5
+ type Logger = Pick<Console, "debug" | "error" | "log" | "warn">;
6
+ export interface RoomConnectionOptions {
7
+ displayName?: string;
8
+ localMediaConstraints?: MediaStreamConstraints;
9
+ roomKey?: string;
10
+ logger?: Logger;
11
+ localMedia?: LocalMedia;
12
+ }
13
+ export type ChatMessage = Pick<SignalChatMessage, "senderId" | "timestamp" | "text">;
14
+ export type RoomConnectionStatus = "" | "connecting" | "connected" | "room_locked" | "knocking" | "disconnecting" | "disconnected" | "accepted" | "rejected";
15
+ export type CloudRecordingState = {
16
+ status: "" | "recording";
17
+ startedAt: number | null;
18
+ };
19
+ export type StreamingState = {
20
+ status: "" | "streaming";
21
+ startedAt: number | null;
22
+ };
23
+ export type RoomJoinedEvent = {
24
+ localParticipant: LocalParticipant;
25
+ remoteParticipants: RemoteParticipant[];
26
+ waitingParticipants: WaitingParticipant[];
27
+ };
28
+ export type RoomConnectionStatusChangedEvent = {
29
+ roomConnectionStatus: RoomConnectionStatus;
30
+ };
31
+ export type ParticipantJoinedEvent = {
32
+ remoteParticipant: RemoteParticipant;
33
+ };
34
+ export type ParticipantLeftEvent = {
35
+ participantId: string;
36
+ };
37
+ export type ParticipantStreamAddedEvent = {
38
+ participantId: string;
39
+ stream: MediaStream;
40
+ };
41
+ export type ParticipantAudioEnabledEvent = {
42
+ participantId: string;
43
+ isAudioEnabled: boolean;
44
+ };
45
+ export type ParticipantVideoEnabledEvent = {
46
+ participantId: string;
47
+ isVideoEnabled: boolean;
48
+ };
49
+ export type ParticipantMetadataChangedEvent = {
50
+ participantId: string;
51
+ displayName: string;
52
+ };
53
+ export type ScreenshareStartedEvent = {
54
+ participantId: string;
55
+ id: string;
56
+ hasAudioTrack: boolean;
57
+ stream: MediaStream;
58
+ isLocal: boolean;
59
+ };
60
+ export type ScreenshareStoppedEvent = {
61
+ participantId: string;
62
+ id: string;
63
+ };
64
+ export type WaitingParticipantJoinedEvent = {
65
+ participantId: string;
66
+ displayName: string | null;
67
+ };
68
+ export type WaitingParticipantLeftEvent = {
69
+ participantId: string;
70
+ };
71
+ export interface RoomEventsMap {
72
+ chat_message: (e: CustomEvent<ChatMessage>) => void;
73
+ cloud_recording_started: (e: CustomEvent<CloudRecordingState>) => void;
74
+ cloud_recording_stopped: (e: CustomEvent<CloudRecordingState>) => void;
75
+ participant_audio_enabled: (e: CustomEvent<ParticipantAudioEnabledEvent>) => void;
76
+ participant_joined: (e: CustomEvent<ParticipantJoinedEvent>) => void;
77
+ participant_left: (e: CustomEvent<ParticipantLeftEvent>) => void;
78
+ participant_metadata_changed: (e: CustomEvent<ParticipantMetadataChangedEvent>) => void;
79
+ participant_stream_added: (e: CustomEvent<ParticipantStreamAddedEvent>) => void;
80
+ participant_video_enabled: (e: CustomEvent<ParticipantVideoEnabledEvent>) => void;
81
+ room_connection_status_changed: (e: CustomEvent<RoomConnectionStatusChangedEvent>) => void;
82
+ room_joined: (e: CustomEvent<RoomJoinedEvent>) => void;
83
+ screenshare_started: (e: CustomEvent<ScreenshareStartedEvent>) => void;
84
+ screenshare_stopped: (e: CustomEvent<ScreenshareStoppedEvent>) => void;
85
+ streaming_started: (e: CustomEvent<StreamingState>) => void;
86
+ streaming_stopped: (e: CustomEvent<StreamingState>) => void;
87
+ waiting_participant_joined: (e: CustomEvent<WaitingParticipantJoinedEvent>) => void;
88
+ waiting_participant_left: (e: CustomEvent<WaitingParticipantLeftEvent>) => void;
89
+ }
90
+ export declare function handleStreamAdded(remoteParticipants: RemoteParticipant[], { clientId, stream, streamId, streamType }: RtcStreamAddedPayload): CustomEvent<{
91
+ participantId: string;
92
+ stream: MediaStream;
93
+ streamId: string;
94
+ }> | CustomEvent<{
95
+ participantId: string;
96
+ stream: MediaStream;
97
+ id: string;
98
+ isLocal: boolean;
99
+ }> | undefined;
100
+ interface RoomEventTarget extends EventTarget {
101
+ addEventListener<K extends keyof RoomEventsMap>(type: K, listener: RoomEventsMap[K], options?: boolean | AddEventListenerOptions): void;
102
+ addEventListener(type: string, callback: EventListenerOrEventListenerObject | null, options?: EventListenerOptions | boolean): void;
103
+ removeEventListener<K extends keyof RoomEventsMap>(type: K, listener: RoomEventsMap[K], options?: boolean | EventListenerOptions): void;
104
+ removeEventListener(type: string, callback: EventListenerOrEventListenerObject | null, options?: EventListenerOptions | boolean): void;
105
+ }
106
+ declare const TypedEventTarget: new () => RoomEventTarget;
107
+ export default class RoomConnection extends TypedEventTarget {
108
+ localMedia: LocalMedia;
109
+ localParticipant: LocalParticipant | null;
110
+ roomUrl: URL;
111
+ remoteParticipants: RemoteParticipant[];
112
+ screenshares: Screenshare[];
113
+ readonly localMediaConstraints?: MediaStreamConstraints;
114
+ readonly roomName: string;
115
+ private organizationId;
116
+ private credentialsService;
117
+ private apiClient;
118
+ private organizationService;
119
+ private organizationServiceCache;
120
+ private organizationApiClient;
121
+ private roomService;
122
+ private _deviceCredentials;
123
+ private signalSocket;
124
+ private signalSocketManager;
125
+ private rtcManagerDispatcher?;
126
+ private rtcManager?;
127
+ private roomConnectionStatus;
128
+ private selfId;
129
+ private logger;
130
+ private _ownsLocalMedia;
131
+ private displayName?;
132
+ private _roomKey;
133
+ constructor(roomUrl: string, { displayName, localMedia, localMediaConstraints, logger, roomKey }: RoomConnectionOptions);
134
+ get roomKey(): string | null;
135
+ private _handleNewChatMessage;
136
+ private _handleCloudRecordingStarted;
137
+ private _handleStreamingStarted;
138
+ private _handleNewClient;
139
+ private _handleClientLeft;
140
+ private _handleClientAudioEnabled;
141
+ private _handleClientVideoEnabled;
142
+ private _handleClientMetadataReceived;
143
+ private _handleKnockHandled;
144
+ private _handleKnockerLeft;
145
+ private _handleRoomJoined;
146
+ private _handleRoomKnocked;
147
+ private _handleReconnect;
148
+ private _handleDisconnect;
149
+ private _handleCloudRecordingStopped;
150
+ private _handleStreamingStopped;
151
+ private _handleScreenshareStarted;
152
+ private _handleScreenshareStopped;
153
+ private _handleRtcEvent;
154
+ private _handleRtcManagerCreated;
155
+ private _handleRtcManagerDestroyed;
156
+ private _handleAcceptStreams;
157
+ private _handleStreamAdded;
158
+ private _joinRoom;
159
+ join(): Promise<void>;
160
+ knock(): void;
161
+ leave(): void;
162
+ sendChatMessage(text: string): void;
163
+ setDisplayName(displayName: string): void;
164
+ acceptWaitingParticipant(participantId: string): void;
165
+ rejectWaitingParticipant(participantId: string): void;
166
+ updateStreamResolution({ streamId, width, height }: {
167
+ streamId?: string;
168
+ width: number;
169
+ height: number;
170
+ }): void;
171
+ startScreenshare(): Promise<void>;
172
+ stopScreenshare(): void;
173
+ }
174
+ export {};