@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
@@ -0,0 +1,20 @@
1
+ import { assertInstanceOf, assertString } from "../parameterAssertUtils";
2
+ import OrganizationService from "../organizationService/index";
3
+ export default class OrganizationServiceCache {
4
+ constructor({ organizationService, subdomain }) {
5
+ assertInstanceOf(organizationService, OrganizationService);
6
+ assertString(subdomain, "subdomain");
7
+ this._organizationService = organizationService;
8
+ this._subdomain = subdomain;
9
+ this._organizationPromise = null;
10
+ }
11
+ initOrganization() {
12
+ return this.fetchOrganization().then(() => undefined);
13
+ }
14
+ fetchOrganization() {
15
+ if (!this._organizationPromise) {
16
+ this._organizationPromise = this._organizationService.getOrganizationBySubdomain(this._subdomain);
17
+ }
18
+ return this._organizationPromise;
19
+ }
20
+ }
@@ -0,0 +1,13 @@
1
+ export declare function assertTruthy(value: unknown, parameterName: string): unknown;
2
+ export declare function assertBoolean(value: unknown, parameterName: string): boolean;
3
+ export declare function assertNumber(value: unknown, parameterName: string): number;
4
+ export declare function assertString(value: unknown, parameterName: string): string;
5
+ export declare function assertInstanceOf<T>(value: unknown, type: new (any: any) => T, parameterName?: string): T;
6
+ export declare function assertRoomName(roomName: unknown, parameterName?: string): string;
7
+ export declare function assertArray(array: unknown, parameterName: string): Array<unknown>;
8
+ export declare function assertOneOf<T>(value: T, allowedValues: Array<unknown>, parameterName: string): T;
9
+ export declare function assertType(ref: unknown, type: string, name: string, message?: string): void;
10
+ export declare function assertRecord(ref: unknown, name: string): Record<string, unknown>;
11
+ export declare function assertNullOrType(ref: unknown, type: string, name: string, message?: string): void;
12
+ export declare function assertNullOrBoolean(ref: unknown, name: string, message?: string): void;
13
+ export declare function assertNullOrString(ref: unknown, name: string, message?: string): void;
@@ -0,0 +1,64 @@
1
+ import assert from "assert";
2
+ export function assertTruthy(value, parameterName) {
3
+ assert.ok(value, `${parameterName} is required`);
4
+ return value;
5
+ }
6
+ export function assertBoolean(value, parameterName) {
7
+ assert.ok(typeof value === "boolean", `${parameterName}<boolean> is required`);
8
+ return value;
9
+ }
10
+ export function assertNumber(value, parameterName) {
11
+ assert.ok(typeof value === "number", `${parameterName}<number> is required`);
12
+ return value;
13
+ }
14
+ export function assertString(value, parameterName) {
15
+ assert.ok(typeof value === "string", `${parameterName}<string> is required`);
16
+ return value;
17
+ }
18
+ export function assertInstanceOf(value, type, parameterName) {
19
+ const resolvedParameterName = parameterName || type.name[0].toLowerCase() + type.name.substring(1);
20
+ assert.ok(value instanceof type, `${resolvedParameterName}<${type.name}> is required`);
21
+ return value;
22
+ }
23
+ export function assertRoomName(roomName, parameterName = "roomName") {
24
+ assertString(roomName, parameterName);
25
+ assert.equal(typeof roomName === "string" && roomName[0], "/", `${parameterName} must begin with a '/'`);
26
+ return roomName;
27
+ }
28
+ export function assertArray(array, parameterName) {
29
+ assert.ok(Array.isArray(array), `${parameterName}<array> is required`);
30
+ return array;
31
+ }
32
+ export function assertOneOf(value, allowedValues, parameterName) {
33
+ assertTruthy(value, "value");
34
+ assertArray(allowedValues, "allowedValues");
35
+ const isAllowed = allowedValues.includes(value);
36
+ if (!isAllowed) {
37
+ throw new Error(`${parameterName}<string> must be one of the following: ${allowedValues.join(", ")}`);
38
+ }
39
+ return value;
40
+ }
41
+ export function assertType(ref, type, name, message) {
42
+ assert.ok(typeof name === "string", "name must be of type string");
43
+ const errorMessage = message || `${name} must be of type ${type}`;
44
+ assert.ok(ref !== null && typeof ref === type, errorMessage);
45
+ }
46
+ export function assertRecord(ref, name) {
47
+ if (ref === null || ref === undefined || typeof ref !== "object" || Array.isArray(ref)) {
48
+ throw new Error(`${name} must be a record. ${JSON.stringify(ref)}`);
49
+ }
50
+ return ref;
51
+ }
52
+ export function assertNullOrType(ref, type, name, message) {
53
+ assertString(name, "name");
54
+ const errorMessage = message || `${name} must be null or of type ${type}`;
55
+ assert.ok(ref === null || typeof ref === type, errorMessage);
56
+ }
57
+ export function assertNullOrBoolean(ref, name, message) {
58
+ assertString(name, "name");
59
+ assertNullOrType(ref, "boolean", name, message);
60
+ }
61
+ export function assertNullOrString(ref, name, message) {
62
+ assertString(name, "name");
63
+ assertNullOrType(ref, "string", name, message);
64
+ }
@@ -0,0 +1,54 @@
1
+ import Room from "../models/Room";
2
+ export default class RoomService {
3
+ constructor({ organizationApiClient }: {
4
+ organizationApiClient: any;
5
+ });
6
+ getRooms({ types, fields }?: {
7
+ types: any;
8
+ fields?: never[] | undefined;
9
+ }): any;
10
+ getRoom({ roomName, fields }: {
11
+ roomName: string;
12
+ fields?: Array<string>;
13
+ }): Promise<Room>;
14
+ claimRoom({ roomName, type, mode, isLocked }: {
15
+ roomName: any;
16
+ type: any;
17
+ mode: any;
18
+ isLocked: any;
19
+ }): any;
20
+ unclaimRoom(roomName: any): any;
21
+ renameRoom({ roomName, newRoomName }: {
22
+ roomName: any;
23
+ newRoomName: any;
24
+ }): any;
25
+ changeMode({ roomName, mode }: {
26
+ roomName: any;
27
+ mode: any;
28
+ }): any;
29
+ updatePreferences({ roomName, preferences }: {
30
+ roomName: any;
31
+ preferences: any;
32
+ }): any;
33
+ updateProtectedPreferences({ roomName, preferences }: {
34
+ roomName: any;
35
+ preferences: any;
36
+ }): any;
37
+ getRoomPermissions(roomName: any, { roomKey }?: {
38
+ roomKey: any;
39
+ }): any;
40
+ getRoomMetrics({ roomName, metrics, from, to }: {
41
+ roomName: any;
42
+ metrics: any;
43
+ from: any;
44
+ to: any;
45
+ }): any;
46
+ changeType({ roomName, type }: {
47
+ roomName: any;
48
+ type: any;
49
+ }): any;
50
+ getForestSocialImage({ roomName, count }: {
51
+ roomName: any;
52
+ count: any;
53
+ }): any;
54
+ }
@@ -0,0 +1,160 @@
1
+ import Room from "../models/Room";
2
+ import { assertInstanceOf, assertRoomName, assertString, assertArray, assertOneOf, assertNumber, } from "../parameterAssertUtils";
3
+ import OrganizationApiClient from "../OrganizationApiClient";
4
+ import Meeting from "../models/Meeting";
5
+ function createRoomUrl(roomName, path = "") {
6
+ const encodedDisplayName = encodeURIComponent(roomName.substring(1));
7
+ return `/room/${encodedDisplayName}${path}`;
8
+ }
9
+ export default class RoomService {
10
+ constructor({ organizationApiClient }) {
11
+ this._organizationApiClient = assertInstanceOf(organizationApiClient, OrganizationApiClient);
12
+ }
13
+ getRooms({ types, fields = [] } = {}) {
14
+ assertArray(types, "types");
15
+ assertArray(fields, "fields");
16
+ return this._organizationApiClient
17
+ .request("/room", {
18
+ method: "GET",
19
+ params: { types: types.join(","), fields: fields.join(","), includeOnlyLegacyRoomType: "false" },
20
+ })
21
+ .then(({ data }) => data.rooms.map((room) => new Room(room)));
22
+ }
23
+ getRoom({ roomName, fields }) {
24
+ assertRoomName(roomName);
25
+ const encodedDisplayName = encodeURIComponent(roomName.substring(1));
26
+ return this._organizationApiClient
27
+ .request(`/rooms/${encodedDisplayName}`, {
28
+ method: "GET",
29
+ params: Object.assign({ includeOnlyLegacyRoomType: "false" }, (fields && { fields: fields.join(",") })),
30
+ })
31
+ .then(({ data }) => new Room(Object.assign({}, data, Object.assign({ roomName }, (data.meeting && { meeting: Meeting.fromJson(data.meeting) })))))
32
+ .catch((response) => {
33
+ if (response.status === 404) {
34
+ return new Room({
35
+ roomName,
36
+ isClaimed: false,
37
+ mode: "normal",
38
+ product: {
39
+ categoryName: "personal_free",
40
+ },
41
+ type: "personal",
42
+ legacyRoomType: "free",
43
+ });
44
+ }
45
+ if (response.status === 400 && response.data.error === "Banned room") {
46
+ return new Room({ roomName, isBanned: true });
47
+ }
48
+ throw new Error(response.data ? response.data.error : "Could not fetch room information");
49
+ });
50
+ }
51
+ claimRoom({ roomName, type, mode, isLocked }) {
52
+ assertRoomName(roomName);
53
+ assertString(type, "type");
54
+ return this._organizationApiClient
55
+ .request("/room/claim", {
56
+ method: "POST",
57
+ data: Object.assign(Object.assign({ roomName,
58
+ type }, (typeof mode === "string" && { mode })), (typeof isLocked === "boolean" && { isLocked })),
59
+ })
60
+ .then(() => undefined)
61
+ .catch((response) => {
62
+ throw new Error(response.data.error || "Failed to claim room");
63
+ });
64
+ }
65
+ unclaimRoom(roomName) {
66
+ assertRoomName(roomName);
67
+ const encodedDisplayName = encodeURIComponent(roomName.substring(1));
68
+ return this._organizationApiClient
69
+ .request(`/room/${encodedDisplayName}`, {
70
+ method: "DELETE",
71
+ })
72
+ .then(() => undefined);
73
+ }
74
+ renameRoom({ roomName, newRoomName }) {
75
+ assertRoomName(roomName);
76
+ assertString(newRoomName, "newRoomName");
77
+ const encodedRoomName = encodeURIComponent(roomName.substring(1));
78
+ return this._organizationApiClient
79
+ .request(`/room/${encodedRoomName}/roomName`, {
80
+ method: "PUT",
81
+ data: { newRoomName },
82
+ })
83
+ .then(() => undefined);
84
+ }
85
+ changeMode({ roomName, mode }) {
86
+ assertRoomName(roomName);
87
+ assertString(mode, "mode");
88
+ const encodedDisplayName = encodeURIComponent(roomName.substring(1));
89
+ return this._organizationApiClient
90
+ .request(`/room/${encodedDisplayName}/mode`, {
91
+ method: "PUT",
92
+ data: { mode },
93
+ })
94
+ .then(() => undefined);
95
+ }
96
+ updatePreferences({ roomName, preferences }) {
97
+ assertRoomName(roomName);
98
+ assertInstanceOf(preferences, Object, "preferences");
99
+ const encodedDisplayName = encodeURIComponent(roomName.substring(1));
100
+ return this._organizationApiClient
101
+ .request(`/room/${encodedDisplayName}/preferences`, {
102
+ method: "PATCH",
103
+ data: preferences,
104
+ })
105
+ .then(() => undefined);
106
+ }
107
+ updateProtectedPreferences({ roomName, preferences }) {
108
+ assertRoomName(roomName);
109
+ assertInstanceOf(preferences, Object, "preferences");
110
+ const encodedDisplayName = encodeURIComponent(roomName.substring(1));
111
+ return this._organizationApiClient
112
+ .request(`/room/${encodedDisplayName}/protected-preferences`, {
113
+ method: "PATCH",
114
+ data: preferences,
115
+ })
116
+ .then(() => undefined);
117
+ }
118
+ getRoomPermissions(roomName, { roomKey } = {}) {
119
+ assertRoomName(roomName);
120
+ return this._organizationApiClient
121
+ .request(createRoomUrl(roomName, "/permissions"), Object.assign({ method: "GET" }, (roomKey && { headers: { "X-Whereby-Room-Key": roomKey } })))
122
+ .then((response) => {
123
+ const { permissions, limits } = response.data;
124
+ return {
125
+ permissions,
126
+ limits,
127
+ };
128
+ });
129
+ }
130
+ getRoomMetrics({ roomName, metrics, from, to }) {
131
+ assertRoomName(roomName);
132
+ assertString(metrics, "metrics");
133
+ return this._organizationApiClient
134
+ .request(createRoomUrl(roomName, "/metrics"), {
135
+ method: "GET",
136
+ params: { metrics, from, to },
137
+ })
138
+ .then((response) => response.data);
139
+ }
140
+ changeType({ roomName, type }) {
141
+ assertRoomName(roomName);
142
+ assertOneOf(type, ["personal", "personal_xl"], "type");
143
+ const encodedDisplayName = encodeURIComponent(roomName.substring(1));
144
+ return this._organizationApiClient
145
+ .request(`/room/${encodedDisplayName}/type`, {
146
+ method: "PUT",
147
+ data: { type },
148
+ })
149
+ .then(() => undefined);
150
+ }
151
+ getForestSocialImage({ roomName, count }) {
152
+ assertRoomName(roomName);
153
+ assertNumber(count, "count");
154
+ return this._organizationApiClient
155
+ .request(createRoomUrl(roomName, `/forest-social-image/${count}`), {
156
+ method: "GET",
157
+ })
158
+ .then((response) => response.data.imageUrl);
159
+ }
160
+ }
@@ -0,0 +1,5 @@
1
+ import { Json } from "../Response";
2
+ export declare const itShouldThrowIfInvalid: (missingPropertyName: string, func: () => void, regexMatcher?: RegExp) => void;
3
+ export declare const itShouldRejectIfApiClientRejects: (getApiClient: any, func: () => void) => void;
4
+ export declare const itShouldRejectIfMultipartRequestRejects: (getApiClient: any, func: () => void) => void;
5
+ export declare function toJson(value: unknown): Json;
@@ -0,0 +1,32 @@
1
+ import { __awaiter } from "tslib";
2
+ export const itShouldThrowIfInvalid = (missingPropertyName, func, regexMatcher) => {
3
+ const testingNoArguments = !missingPropertyName;
4
+ const isOrAre = missingPropertyName[missingPropertyName.length - 1] === "s" ? "are" : "is";
5
+ const scenario = testingNoArguments ? "arguments are missing" : `${missingPropertyName} ${isOrAre} invalid`;
6
+ const expectedException = testingNoArguments
7
+ ? undefined
8
+ : regexMatcher || new RegExp(`${missingPropertyName}(<[\\w|]+>)? (is|are) required`);
9
+ it(`should throw if ${scenario}`, () => {
10
+ expect(() => {
11
+ func();
12
+ }).toThrowError(expectedException);
13
+ });
14
+ };
15
+ export const itShouldRejectIfApiClientRejects = (getApiClient, func) => {
16
+ it("should fail if the request failed", () => __awaiter(void 0, void 0, void 0, function* () {
17
+ const error = new Error("some error");
18
+ getApiClient().request.mockRejectedValue(error);
19
+ yield expect(func()).rejects.toThrow(error);
20
+ }));
21
+ };
22
+ export const itShouldRejectIfMultipartRequestRejects = (getApiClient, func) => {
23
+ it("should fail if the requestMultipart failed", () => {
24
+ const error = new Error("some error");
25
+ getApiClient().requestMultipart.rejects(error);
26
+ const promise = func();
27
+ return expect(promise).to.eventually.be.rejected().toBe(error);
28
+ });
29
+ };
30
+ export function toJson(value) {
31
+ return JSON.parse(JSON.stringify(value));
32
+ }
@@ -0,0 +1,5 @@
1
+ export type UserConsentAction = "accepted" | "rejected" | null;
2
+ export type ConsentGrantRequest = {
3
+ readonly consentRevisionId: string;
4
+ readonly action: UserConsentAction;
5
+ };
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,31 @@
1
+ interface WherebyEmbedAttributes {
2
+ audio: string;
3
+ avatarUrl: string;
4
+ background: string;
5
+ cameraAccess: string;
6
+ chat: string;
7
+ displayName: string;
8
+ emptyRoomInvitation: string;
9
+ floatSelf: string;
10
+ help: string;
11
+ leaveButton: string;
12
+ logo: string;
13
+ people: string;
14
+ precallReview: string;
15
+ recording: string;
16
+ screenshare: string;
17
+ video: string;
18
+ virtualBackgroundUrl: string;
19
+ room: string;
20
+ style: {
21
+ [key: string]: string;
22
+ };
23
+ }
24
+ declare global {
25
+ namespace JSX {
26
+ interface IntrinsicElements {
27
+ ["whereby-embed"]: Partial<WherebyEmbedAttributes>;
28
+ }
29
+ }
30
+ }
31
+ export {};
@@ -0,0 +1,123 @@
1
+ import { define, ref } from "heresy";
2
+ const boolAttrs = [
3
+ "audio",
4
+ "background",
5
+ "cameraaccess",
6
+ "chat",
7
+ "people",
8
+ "embed",
9
+ "emptyRoomInvitation",
10
+ "help",
11
+ "leaveButton",
12
+ "precallReview",
13
+ "screenshare",
14
+ "video",
15
+ "floatSelf",
16
+ "recording",
17
+ "logo",
18
+ "locking",
19
+ "participantCount",
20
+ "settingsButton",
21
+ "pipButton",
22
+ "moreButton",
23
+ "personality",
24
+ "subgridLabels",
25
+ "lowData",
26
+ "breakout",
27
+ ];
28
+ define("WherebyEmbed", {
29
+ oninit() {
30
+ this.iframe = ref();
31
+ },
32
+ onconnected() {
33
+ window.addEventListener("message", this.onmessage);
34
+ },
35
+ ondisconnected() {
36
+ window.removeEventListener("message", this.onmessage);
37
+ },
38
+ observedAttributes: [
39
+ "displayName",
40
+ "minimal",
41
+ "room",
42
+ "subdomain",
43
+ "lang",
44
+ "metadata",
45
+ "groups",
46
+ "virtualBackgroundUrl",
47
+ "avatarUrl",
48
+ ...boolAttrs,
49
+ ].map((a) => a.toLowerCase()),
50
+ onattributechanged({ attributeName, oldValue }) {
51
+ if (["room", "subdomain"].includes(attributeName) && oldValue == null)
52
+ return;
53
+ this.render();
54
+ },
55
+ style(self) {
56
+ return `
57
+ ${self} {
58
+ display: block;
59
+ }
60
+ ${self} iframe {
61
+ border: none;
62
+ height: 100%;
63
+ width: 100%;
64
+ }
65
+ `;
66
+ },
67
+ _postCommand(command, args = []) {
68
+ if (this.iframe.current) {
69
+ this.iframe.current.contentWindow.postMessage({ command, args }, this.url.origin);
70
+ }
71
+ },
72
+ startRecording() {
73
+ this._postCommand("start_recording");
74
+ },
75
+ stopRecording() {
76
+ this._postCommand("stop_recording");
77
+ },
78
+ toggleCamera(enabled) {
79
+ this._postCommand("toggle_camera", [enabled]);
80
+ },
81
+ toggleMicrophone(enabled) {
82
+ this._postCommand("toggle_microphone", [enabled]);
83
+ },
84
+ toggleScreenshare(enabled) {
85
+ this._postCommand("toggle_screenshare", [enabled]);
86
+ },
87
+ onmessage({ origin, data }) {
88
+ var _a;
89
+ if (origin !== ((_a = this.url) === null || _a === void 0 ? void 0 : _a.origin))
90
+ return;
91
+ const { type, payload: detail } = data;
92
+ this.dispatchEvent(new CustomEvent(type, { detail }));
93
+ },
94
+ render() {
95
+ const { avatarurl: avatarUrl, displayname: displayName, lang, metadata, minimal, room, groups, virtualbackgroundurl: virtualBackgroundUrl, } = this;
96
+ if (!room)
97
+ return this.html `Whereby: Missing room attribute.`;
98
+ const m = /https:\/\/([^.]+)(\.whereby.com|-ip-\d+-\d+-\d+-\d+.hereby.dev:4443)\/.+/.exec(room);
99
+ const subdomain = (m && m[1]) || this.subdomain;
100
+ if (!subdomain)
101
+ return this.html `Whereby: Missing subdomain attr.`;
102
+ if (!m) {
103
+ return this.html `could not parse URL.`;
104
+ }
105
+ const baseURL = m[2] || `.whereby.com`;
106
+ this.url = new URL(room, `https://${subdomain}${baseURL}`);
107
+ const roomUrl = new URL(room);
108
+ if (roomUrl.searchParams.get("roomKey")) {
109
+ this.url.searchParams.append("roomKey", roomUrl.searchParams.get("roomKey"));
110
+ }
111
+ Object.entries(Object.assign(Object.assign(Object.assign(Object.assign(Object.assign(Object.assign(Object.assign(Object.assign({ jsApi: true, we: "__SDK_VERSION__", iframeSource: subdomain }, (displayName && { displayName })), (lang && { lang })), (metadata && { metadata })), (groups && { groups })), (virtualBackgroundUrl && { virtualBackgroundUrl })), (avatarUrl && { avatarUrl })), (minimal != null && { embed: minimal })), boolAttrs.reduce((o, v) => (this[v.toLowerCase()] != null ? Object.assign(Object.assign({}, o), { [v]: this[v.toLowerCase()] }) : o), {}))).forEach(([k, v]) => {
112
+ if (!this.url.searchParams.has(k) && typeof v === "string") {
113
+ this.url.searchParams.set(k, v);
114
+ }
115
+ });
116
+ return this.html `
117
+ <iframe
118
+ ref=${this.iframe}
119
+ src=${this.url}
120
+ allow="autoplay; camera; microphone; fullscreen; speaker; display-capture" />
121
+ `;
122
+ },
123
+ });
@@ -0,0 +1,5 @@
1
+ import "./embed";
2
+ export { useLocalMedia, useRoomConnection, VideoView } from "./react";
3
+ export { default as fakeWebcamFrame } from "./utils/fakeWebcamFrame";
4
+ export { default as fakeAudioStream } from "./utils/fakeAudioStream";
5
+ export declare const sdkVersion = "__SDK_VERSION__";
package/dist/index.js ADDED
@@ -0,0 +1,5 @@
1
+ import "./embed";
2
+ export { useLocalMedia, useRoomConnection, VideoView } from "./react";
3
+ export { default as fakeWebcamFrame } from "./utils/fakeWebcamFrame";
4
+ export { default as fakeAudioStream } from "./utils/fakeAudioStream";
5
+ export const sdkVersion = "__SDK_VERSION__";
@@ -0,0 +1,15 @@
1
+ import React from "react";
2
+ interface VideoViewSelfProps {
3
+ stream: MediaStream;
4
+ muted?: boolean;
5
+ mirror?: boolean;
6
+ style?: React.CSSProperties;
7
+ onResize?: ({ width, height, stream }: {
8
+ width: number;
9
+ height: number;
10
+ stream: MediaStream;
11
+ }) => void;
12
+ }
13
+ type VideoViewProps = VideoViewSelfProps & React.DetailedHTMLProps<React.VideoHTMLAttributes<HTMLVideoElement>, HTMLVideoElement>;
14
+ declare const _default: ({ muted, mirror, stream, onResize, ...rest }: VideoViewProps) => JSX.Element;
15
+ export default _default;
@@ -0,0 +1,37 @@
1
+ import { __rest } from "tslib";
2
+ import React, { useEffect, useRef } from "react";
3
+ import debounce from "../utils/debounce";
4
+ export default (_a) => {
5
+ var { muted, mirror = false, stream, onResize } = _a, rest = __rest(_a, ["muted", "mirror", "stream", "onResize"]);
6
+ const videoEl = useRef(null);
7
+ useEffect(() => {
8
+ if (!videoEl.current || !onResize) {
9
+ return;
10
+ }
11
+ const resizeObserver = new ResizeObserver(debounce(() => {
12
+ if (videoEl.current && (stream === null || stream === void 0 ? void 0 : stream.id)) {
13
+ onResize({
14
+ width: videoEl.current.clientWidth,
15
+ height: videoEl.current.clientHeight,
16
+ stream,
17
+ });
18
+ }
19
+ }, { delay: 1000, edges: true }));
20
+ resizeObserver.observe(videoEl.current);
21
+ return () => {
22
+ resizeObserver.disconnect();
23
+ };
24
+ }, [stream]);
25
+ useEffect(() => {
26
+ if (!videoEl.current) {
27
+ return;
28
+ }
29
+ if (videoEl.current.srcObject !== stream) {
30
+ videoEl.current.srcObject = stream;
31
+ }
32
+ if (videoEl.current.muted !== muted) {
33
+ videoEl.current.muted = Boolean(muted);
34
+ }
35
+ }, [muted, stream, videoEl]);
36
+ return (React.createElement("video", Object.assign({ ref: videoEl, autoPlay: true, playsInline: true }, rest, { style: Object.assign({ transform: mirror ? "scaleX(-1)" : "none" }, rest.style) })));
37
+ };
@@ -0,0 +1,3 @@
1
+ export { default as VideoView } from "./VideoView";
2
+ export { default as useLocalMedia } from "./useLocalMedia";
3
+ export { useRoomConnection } from "./useRoomConnection";
@@ -0,0 +1,3 @@
1
+ export { default as VideoView } from "./VideoView";
2
+ export { default as useLocalMedia } from "./useLocalMedia";
3
+ export { useRoomConnection } from "./useRoomConnection";
@@ -0,0 +1,28 @@
1
+ import LocalMedia from "../LocalMedia";
2
+ interface LocalMediaState {
3
+ currentCameraDeviceId?: string;
4
+ currentMicrophoneDeviceId?: string;
5
+ cameraDeviceError: unknown;
6
+ cameraDevices: MediaDeviceInfo[];
7
+ isSettingCameraDevice: boolean;
8
+ isSettingMicrophoneDevice: boolean;
9
+ isStarting: boolean;
10
+ localStream?: MediaStream;
11
+ microphoneDeviceError: unknown;
12
+ microphoneDevices: MediaDeviceInfo[];
13
+ speakerDevices: MediaDeviceInfo[];
14
+ startError: unknown;
15
+ }
16
+ interface LocalMediaActions {
17
+ setCameraDevice: InstanceType<typeof LocalMedia>["setCameraDevice"];
18
+ setMicrophoneDevice: InstanceType<typeof LocalMedia>["setMicrophoneDevice"];
19
+ toggleCameraEnabled: InstanceType<typeof LocalMedia>["toggleCameraEnabled"];
20
+ toggleMicrophoneEnabled: InstanceType<typeof LocalMedia>["toggleMichrophoneEnabled"];
21
+ }
22
+ export type LocalMediaRef = {
23
+ state: LocalMediaState;
24
+ actions: LocalMediaActions;
25
+ _ref: LocalMedia;
26
+ };
27
+ export default function useLocalMedia(constraintsOrStream?: MediaStreamConstraints | MediaStream): LocalMediaRef;
28
+ export {};