mediasfu-shared 1.0.4 → 1.0.6

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/dist/index.d.ts CHANGED
@@ -1672,6 +1672,14 @@ export declare interface CoHostResponsibility {
1672
1672
  dedicated: boolean;
1673
1673
  }
1674
1674
 
1675
+ /**
1676
+ * Curated list of the most widely-supported language codes for real-time translation.
1677
+ * This set covers the languages supported by major STT/TTS/translation providers
1678
+ * (Google, Azure, Deepgram, OpenAI, DeepL, etc.) and is the default shown in UI pickers.
1679
+ * Use getSupportedLanguages() if you need the full extended list.
1680
+ */
1681
+ export declare const COMMON_LANGUAGE_CODES: string[];
1682
+
1675
1683
  /**
1676
1684
  * Compares the current active names with the previous active names and triggers an action if there are changes.
1677
1685
  *
@@ -2584,7 +2592,7 @@ export declare interface ControlMediaHostTrackLike {
2584
2592
 
2585
2593
  export declare type ControlMediaHostType<TOnScreenChangesParameters = unknown, TStopShareScreenParameters = unknown, TDisconnectSendTransportVideoParameters = unknown, TDisconnectSendTransportAudioParameters = unknown, TDisconnectSendTransportScreenParameters = unknown, TAllParameters extends TOnScreenChangesParameters & TStopShareScreenParameters & TDisconnectSendTransportVideoParameters & TDisconnectSendTransportAudioParameters & TDisconnectSendTransportScreenParameters = TOnScreenChangesParameters & TStopShareScreenParameters & TDisconnectSendTransportVideoParameters & TDisconnectSendTransportAudioParameters & TDisconnectSendTransportScreenParameters, TMediaStream extends ControlMediaHostMediaStreamLike = MediaStream> = (options: ControlMediaHostOptions<TOnScreenChangesParameters, TStopShareScreenParameters, TDisconnectSendTransportVideoParameters, TDisconnectSendTransportAudioParameters, TDisconnectSendTransportScreenParameters, TAllParameters, TMediaStream>) => Promise<void>;
2586
2594
 
2587
- export declare interface ControlMediaOptions {
2595
+ declare interface ControlMediaOptions {
2588
2596
  data: ControlMediaData;
2589
2597
  showAlert?: ShowAlert;
2590
2598
  clickAudio?: () => void;
@@ -2592,6 +2600,8 @@ export declare interface ControlMediaOptions {
2592
2600
  audioAlreadyOn?: boolean;
2593
2601
  videoAlreadyOn?: boolean;
2594
2602
  }
2603
+ export { ControlMediaOptions }
2604
+ export { ControlMediaOptions as PanelistControlMediaOptions }
2595
2605
 
2596
2606
  declare interface ControlMediaOptions_2 {
2597
2607
  participantId: string;
@@ -2607,7 +2617,9 @@ declare interface ControlMediaOptions_2 {
2607
2617
  roomName: string;
2608
2618
  }
2609
2619
 
2610
- export declare type ControlMediaType = (options: ControlMediaOptions) => Promise<void>;
2620
+ declare type ControlMediaType = (options: ControlMediaOptions) => Promise<void>;
2621
+ export { ControlMediaType }
2622
+ export { ControlMediaType as PanelistControlMediaType }
2611
2623
 
2612
2624
  export declare type ControlsPosition = 'topLeft' | 'topRight' | 'bottomLeft' | 'bottomRight';
2613
2625
 
@@ -3714,6 +3726,12 @@ export declare const getAvailableVoices: (langCode: string, provider?: TTSProvid
3714
3726
  female: VoiceOption[];
3715
3727
  };
3716
3728
 
3729
+ /**
3730
+ * Returns the curated list of commonly-supported languages for translation UI pickers.
3731
+ * Sorted alphabetically by display name.
3732
+ */
3733
+ export declare const getCommonLanguages: (displayLocale?: string) => LanguageOption[];
3734
+
3717
3735
  /**
3718
3736
  * Resolves newly announced consuming domains to connection targets and connects missing ones.
3719
3737
  *
package/dist/index.js CHANGED
@@ -1702,6 +1702,21 @@ const connectSendTransportVideo = async ({
1702
1702
  throw error;
1703
1703
  }
1704
1704
  };
1705
+ const waitForReadyDevice = async (parameters, attempts = 20, delayMs = 100) => {
1706
+ let resolvedDevice = parameters.getUpdatedAllParams().device ?? parameters.device;
1707
+ for (let attempt = 0; !resolvedDevice && attempt < attempts; attempt += 1) {
1708
+ await new Promise((resolve) => setTimeout(resolve, delayMs));
1709
+ resolvedDevice = parameters.getUpdatedAllParams().device ?? parameters.device;
1710
+ }
1711
+ return resolvedDevice;
1712
+ };
1713
+ const notifyDeviceNotReady = (parameters) => {
1714
+ parameters.showAlert?.({
1715
+ message: "Media device is still initializing. Please try screen sharing again in a moment.",
1716
+ type: "danger",
1717
+ duration: 3e3
1718
+ });
1719
+ };
1705
1720
  const createLocalSendTransport = async ({
1706
1721
  option,
1707
1722
  parameters
@@ -1719,6 +1734,10 @@ const createLocalSendTransport = async ({
1719
1734
  updateLocalTransportCreated,
1720
1735
  connectSendTransport: connectSendTransport2
1721
1736
  } = parameters;
1737
+ const updatedParams = parameters.getUpdatedAllParams();
1738
+ device = updatedParams.device ?? device;
1739
+ socket = updatedParams.socket ?? socket;
1740
+ localSocket = updatedParams.localSocket ?? localSocket;
1722
1741
  if (!localSocket || !localSocket.id || socket.id === localSocket.id) {
1723
1742
  return;
1724
1743
  }
@@ -1730,7 +1749,12 @@ const createLocalSendTransport = async ({
1730
1749
  console.error("Error in local createWebRtcTransport:", params.error);
1731
1750
  return;
1732
1751
  }
1733
- localProducerTransport = await device.createSendTransport(params);
1752
+ const resolvedDevice = await waitForReadyDevice(parameters) ?? device;
1753
+ if (!resolvedDevice) {
1754
+ notifyDeviceNotReady(parameters);
1755
+ return;
1756
+ }
1757
+ localProducerTransport = await resolvedDevice.createSendTransport(params);
1734
1758
  if (updateLocalProducerTransport) {
1735
1759
  updateLocalProducerTransport(localProducerTransport);
1736
1760
  }
@@ -1805,6 +1829,13 @@ const createSendTransport = async ({
1805
1829
  const updatedParams = parameters.getUpdatedAllParams();
1806
1830
  device = updatedParams.device;
1807
1831
  socket = updatedParams.socket;
1832
+ if (!device) {
1833
+ device = await waitForReadyDevice(parameters);
1834
+ }
1835
+ if (!device) {
1836
+ notifyDeviceNotReady(parameters);
1837
+ return;
1838
+ }
1808
1839
  try {
1809
1840
  await createLocalSendTransport({ option, parameters });
1810
1841
  } catch (error) {
@@ -1818,7 +1849,12 @@ const createSendTransport = async ({
1818
1849
  console.error("Error in createWebRtcTransport:", params.error);
1819
1850
  return;
1820
1851
  }
1821
- producerTransport = await device.createSendTransport(params);
1852
+ const resolvedDevice = await waitForReadyDevice(parameters) ?? device;
1853
+ if (!resolvedDevice) {
1854
+ notifyDeviceNotReady(parameters);
1855
+ return;
1856
+ }
1857
+ producerTransport = await resolvedDevice.createSendTransport(params);
1822
1858
  updateProducerTransport(producerTransport);
1823
1859
  producerTransport.on(
1824
1860
  "connect",
@@ -6349,6 +6385,7 @@ const updateRoomParametersClient = ({ parameters }) => {
6349
6385
  }
6350
6386
  };
6351
6387
  const DEFAULT_MEDIA_SFU_ROOM_API_URL = "https://mediasfu.com/v1/rooms/";
6388
+ const getDefaultMediaSFURoomApiUrl = () => DEFAULT_MEDIA_SFU_ROOM_API_URL;
6352
6389
  const normalizeManagedRoomApi = (normalizedLink) => {
6353
6390
  if (normalizedLink.includes("/v1/rooms")) {
6354
6391
  return `${normalizedLink.replace(/\/$/, "")}/`;
@@ -6358,7 +6395,7 @@ const normalizeManagedRoomApi = (normalizedLink) => {
6358
6395
  const resolveMediaSFURoomApi = (localLink, action) => {
6359
6396
  const normalizedLink = localLink?.trim();
6360
6397
  if (!normalizedLink) {
6361
- return DEFAULT_MEDIA_SFU_ROOM_API_URL;
6398
+ return getDefaultMediaSFURoomApiUrl();
6362
6399
  }
6363
6400
  if (normalizedLink.includes("mediasfu.com")) {
6364
6401
  return normalizeManagedRoomApi(normalizedLink);
@@ -7898,6 +7935,9 @@ const sendMessage = async ({
7898
7935
  chatSetting
7899
7936
  }) => {
7900
7937
  let chatValue = false;
7938
+ const normalizedReceivers = (receivers ?? []).filter(
7939
+ (receiver) => typeof receiver === "string" && receiver.trim().length > 0
7940
+ );
7901
7941
  if (messagesLength > 100 && roomName.startsWith("d") || messagesLength > 500 && roomName.startsWith("s") || messagesLength > 1e5 && roomName.startsWith("p")) {
7902
7942
  showAlert?.({
7903
7943
  message: "You have reached the maximum number of messages allowed.",
@@ -7914,7 +7954,7 @@ const sendMessage = async ({
7914
7954
  });
7915
7955
  return;
7916
7956
  }
7917
- if (receivers.length < 1 && group === false) {
7957
+ if (normalizedReceivers.length < 1 && group === false && islevel === "2") {
7918
7958
  showAlert?.({
7919
7959
  message: "Please select a message to reply to",
7920
7960
  type: "danger",
@@ -7924,7 +7964,7 @@ const sendMessage = async ({
7924
7964
  }
7925
7965
  const messageObject = {
7926
7966
  sender: sender ? sender : member,
7927
- receivers,
7967
+ receivers: normalizedReceivers,
7928
7968
  message,
7929
7969
  timestamp: (/* @__PURE__ */ new Date()).toLocaleTimeString(),
7930
7970
  group: group !== void 0 && group !== null ? group : false
@@ -10081,13 +10121,112 @@ const TTS_SUPPORT_BY_LANGUAGE = {
10081
10121
  ca: "good",
10082
10122
  auto: "n/a"
10083
10123
  };
10124
+ const LANGUAGE_NAMES_EN = {
10125
+ en: "English",
10126
+ es: "Spanish",
10127
+ fr: "French",
10128
+ de: "German",
10129
+ it: "Italian",
10130
+ pt: "Portuguese",
10131
+ nl: "Dutch",
10132
+ ru: "Russian",
10133
+ zh: "Chinese",
10134
+ ja: "Japanese",
10135
+ ko: "Korean",
10136
+ ar: "Arabic",
10137
+ hi: "Hindi",
10138
+ bn: "Bengali",
10139
+ pa: "Punjabi",
10140
+ te: "Telugu",
10141
+ mr: "Marathi",
10142
+ ta: "Tamil",
10143
+ ur: "Urdu",
10144
+ gu: "Gujarati",
10145
+ kn: "Kannada",
10146
+ ml: "Malayalam",
10147
+ ne: "Nepali",
10148
+ si: "Sinhala",
10149
+ tr: "Turkish",
10150
+ pl: "Polish",
10151
+ vi: "Vietnamese",
10152
+ th: "Thai",
10153
+ id: "Indonesian",
10154
+ ms: "Malay",
10155
+ tl: "Filipino",
10156
+ km: "Khmer",
10157
+ lo: "Lao",
10158
+ my: "Burmese",
10159
+ sw: "Swahili",
10160
+ yo: "Yoruba",
10161
+ ha: "Hausa",
10162
+ ig: "Igbo",
10163
+ zu: "Zulu",
10164
+ xh: "Xhosa",
10165
+ af: "Afrikaans",
10166
+ st: "Sesotho",
10167
+ tn: "Tswana",
10168
+ sn: "Shona",
10169
+ am: "Amharic",
10170
+ so: "Somali",
10171
+ rw: "Kinyarwanda",
10172
+ mg: "Malagasy",
10173
+ ny: "Chichewa",
10174
+ ee: "Ewe",
10175
+ tw: "Twi",
10176
+ gaa: "Ga",
10177
+ he: "Hebrew",
10178
+ fa: "Persian",
10179
+ ps: "Pashto",
10180
+ ku: "Kurdish",
10181
+ uk: "Ukrainian",
10182
+ el: "Greek",
10183
+ cs: "Czech",
10184
+ ro: "Romanian",
10185
+ hu: "Hungarian",
10186
+ sv: "Swedish",
10187
+ da: "Danish",
10188
+ no: "Norwegian",
10189
+ fi: "Finnish",
10190
+ sk: "Slovak",
10191
+ bg: "Bulgarian",
10192
+ hr: "Croatian",
10193
+ et: "Estonian",
10194
+ lt: "Lithuanian",
10195
+ lv: "Latvian",
10196
+ sl: "Slovenian",
10197
+ sr: "Serbian",
10198
+ bs: "Bosnian",
10199
+ mk: "Macedonian",
10200
+ is: "Icelandic",
10201
+ ga: "Irish",
10202
+ cy: "Welsh",
10203
+ mt: "Maltese",
10204
+ lb: "Luxembourgish",
10205
+ sq: "Albanian",
10206
+ be: "Belarusian",
10207
+ ka: "Georgian",
10208
+ hy: "Armenian",
10209
+ az: "Azerbaijani",
10210
+ eu: "Basque",
10211
+ gl: "Galician",
10212
+ ca: "Catalan",
10213
+ la: "Latin",
10214
+ eo: "Esperanto",
10215
+ kk: "Kazakh",
10216
+ uz: "Uzbek",
10217
+ tg: "Tajik",
10218
+ ky: "Kyrgyz",
10219
+ tk: "Turkmen",
10220
+ mn: "Mongolian"
10221
+ };
10084
10222
  const getDisplayName = (code, locale, fallback) => {
10085
10223
  try {
10086
10224
  const displayNames = new Intl.DisplayNames([locale], { type: "language" });
10087
- return displayNames.of(code) || fallback;
10225
+ const result = displayNames.of(code);
10226
+ if (result) return result;
10088
10227
  } catch {
10089
- return fallback;
10090
10228
  }
10229
+ return LANGUAGE_NAMES_EN[code] ?? fallback;
10091
10230
  };
10092
10231
  const normalizeLanguageCode = (code) => {
10093
10232
  if (!code || typeof code !== "string") {
@@ -10134,6 +10273,58 @@ const getSupportedLanguages = (displayLocale = "en") => {
10134
10273
  };
10135
10274
  }).sort((left, right) => left.name.localeCompare(right.name));
10136
10275
  };
10276
+ const COMMON_LANGUAGE_CODES = [
10277
+ "en",
10278
+ "es",
10279
+ "fr",
10280
+ "de",
10281
+ "it",
10282
+ "pt",
10283
+ "nl",
10284
+ "ru",
10285
+ "zh",
10286
+ "ja",
10287
+ "ko",
10288
+ "ar",
10289
+ "hi",
10290
+ "bn",
10291
+ "tr",
10292
+ "pl",
10293
+ "vi",
10294
+ "th",
10295
+ "id",
10296
+ "ms",
10297
+ "sw",
10298
+ "yo",
10299
+ "ha",
10300
+ "ig",
10301
+ "zu",
10302
+ "am",
10303
+ "tw",
10304
+ "he",
10305
+ "fa",
10306
+ "uk",
10307
+ "el",
10308
+ "cs",
10309
+ "ro",
10310
+ "hu",
10311
+ "sv",
10312
+ "da",
10313
+ "no",
10314
+ "fi"
10315
+ ];
10316
+ const getCommonLanguages = (displayLocale = "en") => {
10317
+ return COMMON_LANGUAGE_CODES.map((code) => {
10318
+ const metadata = getLanguageMetadata(code);
10319
+ return {
10320
+ code,
10321
+ name: getLanguageName(code, displayLocale),
10322
+ nativeName: metadata.nativeName,
10323
+ region: metadata.region,
10324
+ ttsSupport: metadata.ttsSupport
10325
+ };
10326
+ }).sort((left, right) => left.name.localeCompare(right.name));
10327
+ };
10137
10328
  const TTS_PROVIDERS = {
10138
10329
  deepgram: { name: "Deepgram Aura", supportsSSML: false, isDefault: true },
10139
10330
  openai: { name: "OpenAI TTS", supportsSSML: false, multilingual: true },
@@ -12875,6 +13066,7 @@ const launchConfigureWhiteboard = ({
12875
13066
  updateIsConfigureWhiteboardModalVisible(!isConfigureWhiteboardModalVisible);
12876
13067
  };
12877
13068
  export {
13069
+ COMMON_LANGUAGE_CODES,
12878
13070
  MediaStream$1 as MediaStream,
12879
13071
  MediaStreamTrack,
12880
13072
  QnHDCons,
@@ -12962,6 +13154,7 @@ export {
12962
13154
  generateRandomWaitingRoomList,
12963
13155
  getActiveTranslationConsumers,
12964
13156
  getAvailableVoices,
13157
+ getCommonLanguages,
12965
13158
  getDomains,
12966
13159
  getEstimate,
12967
13160
  getLanguageMetadata,