@fishjam-cloud/react-client 0.14.0 → 0.14.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (115) hide show
  1. package/dist/FishjamProvider.d.ts.map +1 -1
  2. package/dist/FishjamProvider.js +37 -41
  3. package/dist/contexts/camera.d.ts +8 -0
  4. package/dist/contexts/camera.d.ts.map +1 -0
  5. package/dist/contexts/camera.js +2 -0
  6. package/dist/contexts/fishjamClient.d.ts +4 -0
  7. package/dist/contexts/fishjamClient.d.ts.map +1 -0
  8. package/dist/contexts/fishjamClient.js +2 -0
  9. package/dist/contexts/fishjamState.d.ts +3 -0
  10. package/dist/contexts/fishjamState.d.ts.map +1 -0
  11. package/dist/contexts/fishjamState.js +2 -0
  12. package/dist/contexts/initDevices.d.ts +3 -0
  13. package/dist/contexts/initDevices.d.ts.map +1 -0
  14. package/dist/contexts/initDevices.js +2 -0
  15. package/dist/contexts/microphone.d.ts +8 -0
  16. package/dist/contexts/microphone.d.ts.map +1 -0
  17. package/dist/contexts/microphone.js +2 -0
  18. package/dist/contexts/peerStatus.d.ts +3 -0
  19. package/dist/contexts/peerStatus.d.ts.map +1 -0
  20. package/dist/contexts/peerStatus.js +2 -0
  21. package/dist/contexts/screenshare.d.ts +3 -0
  22. package/dist/contexts/screenshare.d.ts.map +1 -0
  23. package/dist/contexts/screenshare.js +2 -0
  24. package/dist/debug.d.ts +2 -0
  25. package/dist/debug.d.ts.map +1 -0
  26. package/dist/debug.js +1 -0
  27. package/dist/devices/constraints.d.ts.map +1 -1
  28. package/dist/devices/mediaInitializer.d.ts +7 -6
  29. package/dist/devices/mediaInitializer.d.ts.map +1 -1
  30. package/dist/devices/mediaInitializer.js +14 -15
  31. package/dist/hooks/devices/useCamera.d.ts +2 -2
  32. package/dist/hooks/devices/useCamera.d.ts.map +1 -1
  33. package/dist/hooks/devices/useCamera.js +18 -10
  34. package/dist/hooks/devices/useInitializeDevices.d.ts +1 -6
  35. package/dist/hooks/devices/useInitializeDevices.d.ts.map +1 -1
  36. package/dist/hooks/devices/useInitializeDevices.js +5 -45
  37. package/dist/hooks/devices/useMicrophone.d.ts +2 -2
  38. package/dist/hooks/devices/useMicrophone.d.ts.map +1 -1
  39. package/dist/hooks/devices/useMicrophone.js +19 -11
  40. package/dist/hooks/internal/devices/useDeviceManager.d.ts +29 -0
  41. package/dist/hooks/internal/devices/useDeviceManager.d.ts.map +1 -0
  42. package/dist/hooks/internal/devices/useDeviceManager.js +95 -0
  43. package/dist/hooks/internal/devices/useHandleStreamEnd.d.ts +9 -0
  44. package/dist/hooks/internal/devices/useHandleStreamEnd.d.ts.map +1 -0
  45. package/dist/hooks/internal/devices/useHandleStreamEnd.js +13 -0
  46. package/dist/hooks/internal/devices/useMediaDevices.d.ts +16 -0
  47. package/dist/hooks/internal/devices/useMediaDevices.d.ts.map +1 -0
  48. package/dist/hooks/internal/devices/useMediaDevices.js +108 -0
  49. package/dist/hooks/internal/usePeerStatus.d.ts +1 -4
  50. package/dist/hooks/internal/usePeerStatus.d.ts.map +1 -1
  51. package/dist/hooks/internal/usePeerStatus.js +3 -9
  52. package/dist/hooks/internal/useReconnection.d.ts.map +1 -1
  53. package/dist/hooks/internal/useReconnection.js +5 -3
  54. package/dist/hooks/internal/useScreenshareManager.d.ts +3 -3
  55. package/dist/hooks/internal/useScreenshareManager.d.ts.map +1 -1
  56. package/dist/hooks/internal/useScreenshareManager.js +25 -9
  57. package/dist/hooks/internal/useTrackManager.d.ts +6 -6
  58. package/dist/hooks/internal/useTrackManager.d.ts.map +1 -1
  59. package/dist/hooks/internal/useTrackManager.js +99 -108
  60. package/dist/hooks/internal/useTrackMiddleware.d.ts +7 -0
  61. package/dist/hooks/internal/useTrackMiddleware.d.ts.map +1 -0
  62. package/dist/hooks/internal/useTrackMiddleware.js +26 -0
  63. package/dist/hooks/useConnection.d.ts +4 -4
  64. package/dist/hooks/useConnection.d.ts.map +1 -1
  65. package/dist/hooks/useConnection.js +10 -6
  66. package/dist/hooks/usePeers.d.ts.map +1 -1
  67. package/dist/hooks/usePeers.js +5 -2
  68. package/dist/hooks/useScreenShare.d.ts.map +1 -1
  69. package/dist/hooks/useScreenShare.js +5 -2
  70. package/dist/hooks/useStatistics.d.ts +4 -0
  71. package/dist/hooks/useStatistics.d.ts.map +1 -0
  72. package/dist/hooks/useStatistics.js +13 -0
  73. package/dist/hooks/useUpdatePeerMetadata.d.ts.map +1 -1
  74. package/dist/hooks/useUpdatePeerMetadata.js +5 -3
  75. package/dist/hooks/useVAD.d.ts.map +1 -1
  76. package/dist/hooks/useVAD.js +7 -7
  77. package/dist/index.d.ts +2 -2
  78. package/dist/index.d.ts.map +1 -1
  79. package/dist/index.js +1 -1
  80. package/dist/types/internal.d.ts +9 -40
  81. package/dist/types/internal.d.ts.map +1 -1
  82. package/dist/types/public.d.ts +11 -13
  83. package/dist/types/public.d.ts.map +1 -1
  84. package/dist/utils/bandwidth.d.ts.map +1 -1
  85. package/dist/utils/errors.d.ts +1 -1
  86. package/dist/utils/errors.d.ts.map +1 -1
  87. package/dist/utils/errors.js +2 -2
  88. package/dist/utils/localStorage.d.ts +3 -2
  89. package/dist/utils/localStorage.d.ts.map +1 -1
  90. package/dist/utils/localStorage.js +3 -14
  91. package/dist/utils/track.d.ts +3 -1
  92. package/dist/utils/track.d.ts.map +1 -1
  93. package/dist/utils/track.js +16 -4
  94. package/package.json +11 -11
  95. package/dist/devices/DeviceManager.d.ts +0 -65
  96. package/dist/devices/DeviceManager.d.ts.map +0 -1
  97. package/dist/devices/DeviceManager.js +0 -188
  98. package/dist/devices/MiddlewareManager.d.ts +0 -9
  99. package/dist/devices/MiddlewareManager.d.ts.map +0 -1
  100. package/dist/devices/MiddlewareManager.js +0 -26
  101. package/dist/hooks/internal/device/useDeviceApi.d.ts +0 -8
  102. package/dist/hooks/internal/device/useDeviceApi.d.ts.map +0 -1
  103. package/dist/hooks/internal/device/useDeviceApi.js +0 -28
  104. package/dist/hooks/internal/device/useDeviceManager.d.ts +0 -4
  105. package/dist/hooks/internal/device/useDeviceManager.d.ts.map +0 -1
  106. package/dist/hooks/internal/device/useDeviceManager.js +0 -41
  107. package/dist/hooks/internal/useFishjamClient_DO_NOT_USE.d.ts +0 -7
  108. package/dist/hooks/internal/useFishjamClient_DO_NOT_USE.d.ts.map +0 -1
  109. package/dist/hooks/internal/useFishjamClient_DO_NOT_USE.js +0 -11
  110. package/dist/hooks/internal/useFishjamContext.d.ts +0 -22
  111. package/dist/hooks/internal/useFishjamContext.d.ts.map +0 -1
  112. package/dist/hooks/internal/useFishjamContext.js +0 -8
  113. package/dist/internal.d.ts +0 -2
  114. package/dist/internal.d.ts.map +0 -1
  115. package/dist/internal.js +0 -1
@@ -1,5 +1,13 @@
1
1
  import type { SimulcastConfig, TrackMetadata, Variant } from "@fishjam-cloud/ts-client";
2
- import type { DeviceManagerStatus } from "./internal";
2
+ export type InitializeDevicesStatus = "initialized" | "failed" | "initialized_with_errors" | "already_initialized";
3
+ export type InitializeDevicesResult = {
4
+ status: InitializeDevicesStatus;
5
+ stream: MediaStream | null;
6
+ errors: {
7
+ audio: DeviceError | null;
8
+ video: DeviceError | null;
9
+ } | null;
10
+ };
3
11
  export type TrackId = Brand<string, "TrackId">;
4
12
  export type PeerId = Brand<string, "PeerId">;
5
13
  export type Track = {
@@ -32,19 +40,9 @@ export type DeviceItem = {
32
40
  deviceId: string;
33
41
  label: string;
34
42
  };
35
- export type Device = {
36
- deviceStatus: DeviceManagerStatus;
37
- mediaStream: MediaStream | null;
38
- mediaStreamTrack: MediaStreamTrack | null;
39
- devices: DeviceItem[];
40
- activeDevice: DeviceItem | null;
41
- currentMiddleware: TrackMiddleware;
42
- deviceError: DeviceError | null;
43
- isMuted: boolean;
44
- };
45
43
  export type PersistLastDeviceHandlers = {
46
- getLastDevice: () => MediaDeviceInfo | null;
47
- saveLastDevice: (info: MediaDeviceInfo) => void;
44
+ getLastDevice: (deviceType: "audio" | "video") => MediaDeviceInfo | null;
45
+ saveLastDevice: (info: MediaDeviceInfo, deviceType: "audio" | "video") => void;
48
46
  };
49
47
  export type SimulcastBandwidthLimits = {
50
48
  [Variant.VARIANT_LOW]: number;
@@ -1 +1 @@
1
- {"version":3,"file":"public.d.ts","sourceRoot":"","sources":["../../src/types/public.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"public.d.ts","sourceRoot":"","sources":["../../src/types/public.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAE,aAAa,EAAE,OAAO,EAAE,MAAM,0BAA0B,CAAC;AAExF,MAAM,MAAM,uBAAuB,GAAG,aAAa,GAAG,QAAQ,GAAG,yBAAyB,GAAG,qBAAqB,CAAC;AAEnH,MAAM,MAAM,uBAAuB,GAAG;IACpC,MAAM,EAAE,uBAAuB,CAAC;IAChC,MAAM,EAAE,WAAW,GAAG,IAAI,CAAC;IAC3B,MAAM,EAAE;QAAE,KAAK,EAAE,WAAW,GAAG,IAAI,CAAC;QAAC,KAAK,EAAE,WAAW,GAAG,IAAI,CAAA;KAAE,GAAG,IAAI,CAAC;CACzE,CAAC;AAEF,MAAM,MAAM,OAAO,GAAG,KAAK,CAAC,MAAM,EAAE,SAAS,CAAC,CAAC;AAC/C,MAAM,MAAM,MAAM,GAAG,KAAK,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAC;AAE7C,MAAM,MAAM,KAAK,GAAG;IAClB,MAAM,EAAE,WAAW,GAAG,IAAI,CAAC;IAC3B,QAAQ,EAAE,OAAO,GAAG,IAAI,CAAC;IACzB,OAAO,EAAE,OAAO,CAAC;IACjB,QAAQ,CAAC,EAAE,aAAa,CAAC;IACzB,eAAe,EAAE,eAAe,GAAG,IAAI,CAAC;IACxC,KAAK,EAAE,gBAAgB,GAAG,IAAI,CAAC;CAChC,CAAC;AAEF,MAAM,MAAM,eAAe,GAAG,CAAC,CAAC,KAAK,EAAE,gBAAgB,KAAK;IAAE,KAAK,EAAE,gBAAgB,CAAC;IAAC,OAAO,CAAC,EAAE,MAAM,IAAI,CAAA;CAAE,CAAC,GAAG,IAAI,CAAC;AAEtH,MAAM,MAAM,gBAAgB,GAAG,CAC7B,UAAU,EAAE,gBAAgB,EAC5B,UAAU,EAAE,gBAAgB,GAAG,IAAI,KAChC;IAAE,UAAU,EAAE,gBAAgB,CAAC;IAAC,UAAU,EAAE,gBAAgB,GAAG,IAAI,CAAC;IAAC,OAAO,EAAE,MAAM,IAAI,CAAA;CAAE,CAAC;AAEhG;;;;;;;GAOG;AACH,MAAM,MAAM,UAAU,GAAG,YAAY,GAAG,WAAW,GAAG,OAAO,GAAG,MAAM,CAAC;AAEvE,MAAM,MAAM,UAAU,GAAG;IAAE,QAAQ,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,CAAC;AAE7D,MAAM,MAAM,yBAAyB,GAAG;IACtC,aAAa,EAAE,CAAC,UAAU,EAAE,OAAO,GAAG,OAAO,KAAK,eAAe,GAAG,IAAI,CAAC;IACzE,cAAc,EAAE,CAAC,IAAI,EAAE,eAAe,EAAE,UAAU,EAAE,OAAO,GAAG,OAAO,KAAK,IAAI,CAAC;CAChF,CAAC;AAEF,MAAM,MAAM,wBAAwB,GAAG;IACrC,CAAC,OAAO,CAAC,WAAW,CAAC,EAAE,MAAM,CAAC;IAC9B,CAAC,OAAO,CAAC,cAAc,CAAC,EAAE,MAAM,CAAC;IACjC,CAAC,OAAO,CAAC,YAAY,CAAC,EAAE,MAAM,CAAC;CAChC,CAAC;AAEF,MAAM,MAAM,YAAY,GAAG;IAAE,SAAS,CAAC,EAAE,OAAO,EAAE,GAAG,KAAK,CAAA;CAAE,CAAC;AAE7D,MAAM,MAAM,eAAe,GAAG;IAAE,YAAY,EAAE,MAAM,CAAC;IAAC,SAAS,EAAE,wBAAwB,CAAA;CAAE,CAAC;AAE5F,MAAM,MAAM,UAAU,GAAG,OAAO,GAAG,OAAO,CAAC;AAE3C,MAAM,MAAM,WAAW,GACnB;IAAE,IAAI,EAAE,sBAAsB,CAAA;CAAE,GAChC;IAAE,IAAI,EAAE,iBAAiB,CAAA;CAAE,GAC3B;IAAE,IAAI,EAAE,eAAe,CAAA;CAAE,GACzB;IAAE,IAAI,EAAE,iBAAiB,CAAA;CAAE,CAAC;AAEhC,OAAO,CAAC,MAAM,KAAK,EAAE,OAAO,MAAM,CAAC;AACnC,MAAM,MAAM,KAAK,CAAC,CAAC,EAAE,MAAM,SAAS,MAAM,IAAI,CAAC,GAAG;IAAE,CAAC,KAAK,CAAC,EAAE,MAAM,CAAA;CAAE,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"bandwidth.d.ts","sourceRoot":"","sources":["../../src/utils/bandwidth.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,0BAA0B,CAAC;AAEnD,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,iBAAiB,CAAC;AAEvD,eAAO,MAAM,sBAAsB,8EAA+E,CAAC;AAEnH,eAAO,MAAM,gCAAgC,YAAa,OAAO,CAAC,eAAe,CAAC,KAAG,eAGnF,CAAC"}
1
+ {"version":3,"file":"bandwidth.d.ts","sourceRoot":"","sources":["../../src/utils/bandwidth.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,0BAA0B,CAAC;AAEnD,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,iBAAiB,CAAC;AAEvD,eAAO,MAAM,sBAAsB,8EAA+E,CAAC;AAEnH,eAAO,MAAM,gCAAgC,GAAI,SAAS,OAAO,CAAC,eAAe,CAAC,KAAG,eAGnF,CAAC"}
@@ -3,5 +3,5 @@ export declare const PERMISSION_DENIED: DeviceError;
3
3
  export declare const OVERCONSTRAINED_ERROR: DeviceError;
4
4
  export declare const NOT_FOUND_ERROR: DeviceError;
5
5
  export declare const UNHANDLED_ERROR: DeviceError;
6
- export declare const parseUserMediaError: (error: unknown) => DeviceError | null;
6
+ export declare const parseUserMediaError: (error: unknown) => DeviceError;
7
7
  //# sourceMappingURL=errors.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"errors.d.ts","sourceRoot":"","sources":["../../src/utils/errors.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,iBAAiB,CAAC;AAEnD,eAAO,MAAM,iBAAiB,EAAE,WAAyC,CAAC;AAC1E,eAAO,MAAM,qBAAqB,EAAE,WAA8C,CAAC;AACnF,eAAO,MAAM,eAAe,EAAE,WAAuC,CAAC;AACtE,eAAO,MAAM,eAAe,EAAE,WAAyC,CAAC;AAIxE,eAAO,MAAM,mBAAmB,UAAW,OAAO,KAAG,WAAW,GAAG,IAelE,CAAC"}
1
+ {"version":3,"file":"errors.d.ts","sourceRoot":"","sources":["../../src/utils/errors.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,iBAAiB,CAAC;AAEnD,eAAO,MAAM,iBAAiB,EAAE,WAAyC,CAAC;AAC1E,eAAO,MAAM,qBAAqB,EAAE,WAA8C,CAAC;AACnF,eAAO,MAAM,eAAe,EAAE,WAAuC,CAAC;AACtE,eAAO,MAAM,eAAe,EAAE,WAAyC,CAAC;AAIxE,eAAO,MAAM,mBAAmB,GAAI,OAAO,OAAO,KAAG,WAepD,CAAC"}
@@ -7,7 +7,7 @@ export const UNHANDLED_ERROR = { name: "UNHANDLED_ERROR" };
7
7
  export const parseUserMediaError = (error) => {
8
8
  if (!(error instanceof DOMException)) {
9
9
  console.warn({ name: "Unhandled getUserMedia error", error });
10
- return null;
10
+ return UNHANDLED_ERROR;
11
11
  }
12
12
  if (error.name === "NotAllowedError") {
13
13
  return PERMISSION_DENIED;
@@ -18,5 +18,5 @@ export const parseUserMediaError = (error) => {
18
18
  else if (error.name === "NotFoundError") {
19
19
  return NOT_FOUND_ERROR;
20
20
  }
21
- return null;
21
+ return UNHANDLED_ERROR;
22
22
  };
@@ -1,3 +1,4 @@
1
- import type { DeviceType, PersistLastDeviceHandlers } from "../types/public";
2
- export declare function createStorageConfig(deviceType: DeviceType, storage?: boolean | PersistLastDeviceHandlers): PersistLastDeviceHandlers | null;
1
+ import type { DeviceType } from "../types/public";
2
+ export declare const getLastDevice: (deviceType: DeviceType) => MediaDeviceInfo | null;
3
+ export declare const saveLastDevice: (info: MediaDeviceInfo, deviceType: DeviceType) => void;
3
4
  //# sourceMappingURL=localStorage.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"localStorage.d.ts","sourceRoot":"","sources":["../../src/utils/localStorage.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,yBAAyB,EAAE,MAAM,iBAAiB,CAAC;AAE7E,wBAAgB,mBAAmB,CACjC,UAAU,EAAE,UAAU,EACtB,OAAO,CAAC,EAAE,OAAO,GAAG,yBAAyB,GAC5C,yBAAyB,GAAG,IAAI,CAIlC"}
1
+ {"version":3,"file":"localStorage.d.ts","sourceRoot":"","sources":["../../src/utils/localStorage.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAIlD,eAAO,MAAM,aAAa,GAAI,YAAY,UAAU,2BACsB,CAAC;AAE3E,eAAO,MAAM,cAAc,GAAI,MAAM,eAAe,EAAE,YAAY,UAAU,SACT,CAAC"}
@@ -1,17 +1,6 @@
1
- export function createStorageConfig(deviceType, storage) {
2
- if (storage === false)
3
- return null;
4
- if (storage === true || storage === undefined)
5
- return getLocalStorageConfig(deviceType);
6
- return storage;
7
- }
8
- const getLocalStorageConfig = (deviceType) => {
9
- const key = `last-selected-${deviceType}-device`;
10
- return {
11
- getLastDevice: () => loadObject(key, null),
12
- saveLastDevice: (info) => saveObject(key, info),
13
- };
14
- };
1
+ const getLocalStorageKey = (deviceType) => `last-selected-${deviceType}-device`;
2
+ export const getLastDevice = (deviceType) => loadObject(getLocalStorageKey(deviceType), null);
3
+ export const saveLastDevice = (info, deviceType) => saveObject(getLocalStorageKey(deviceType), info);
15
4
  const loadObject = (key, defaultValue) => {
16
5
  const stringValue = loadString(key, "");
17
6
  if (stringValue === "") {
@@ -1,7 +1,9 @@
1
1
  import type { FishjamClient, SimulcastConfig } from "@fishjam-cloud/ts-client";
2
2
  import { Variant } from "@fishjam-cloud/ts-client";
3
3
  import type { BandwidthLimits, Track } from "../types/public";
4
- export declare const getRemoteOrLocalTrack: (tsClient: FishjamClient, remoteOrLocalTrackId: string | null) => Track | null;
4
+ export declare const getRemoteOrLocalTrack: (tsClient: FishjamClient, remoteOrLocalTrackId: string) => Track | null;
5
5
  export declare function setupOnEndedCallback(track: MediaStreamTrack, getCurrentTrackId: () => string | undefined, callback: () => Promise<void>): void;
6
6
  export declare const getConfigAndBandwidthFromProps: (encodings: Variant[] | false | undefined, bandwidthLimits: BandwidthLimits) => readonly [number, undefined] | readonly [Map<Variant, number>, SimulcastConfig];
7
+ export declare function getTrackFromStream(stream: MediaStream, type: "audio" | "video"): MediaStreamTrack;
8
+ export declare function stopStream(stream: MediaStream, type: "audio" | "video"): void;
7
9
  //# sourceMappingURL=track.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"track.d.ts","sourceRoot":"","sources":["../../src/utils/track.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,eAAe,EAA+B,MAAM,0BAA0B,CAAC;AAC5G,OAAO,EAAE,OAAO,EAAE,MAAM,0BAA0B,CAAC;AAEnD,OAAO,KAAK,EAAE,eAAe,EAAE,KAAK,EAAW,MAAM,iBAAiB,CAAC;AAmCvE,eAAO,MAAM,qBAAqB,aAAc,aAAa,wBAAwB,MAAM,GAAG,IAAI,iBAIjG,CAAC;AAEF,wBAAgB,oBAAoB,CAClC,KAAK,EAAE,gBAAgB,EACvB,iBAAiB,EAAE,MAAM,MAAM,GAAG,SAAS,EAC3C,QAAQ,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,QAQ9B;AAOD,eAAO,MAAM,8BAA8B,cAC9B,OAAO,EAAE,GAAG,KAAK,GAAG,SAAS,mBACvB,eAAe,oFAcjC,CAAC"}
1
+ {"version":3,"file":"track.d.ts","sourceRoot":"","sources":["../../src/utils/track.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,eAAe,EAA+B,MAAM,0BAA0B,CAAC;AAC5G,OAAO,EAAE,OAAO,EAAE,MAAM,0BAA0B,CAAC;AAEnD,OAAO,KAAK,EAAE,eAAe,EAAE,KAAK,EAAW,MAAM,iBAAiB,CAAC;AAiCvE,eAAO,MAAM,qBAAqB,GAAI,UAAU,aAAa,EAAE,sBAAsB,MAAM,iBAI1F,CAAC;AAEF,wBAAgB,oBAAoB,CAClC,KAAK,EAAE,gBAAgB,EACvB,iBAAiB,EAAE,MAAM,MAAM,GAAG,SAAS,EAC3C,QAAQ,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,QAQ9B;AAOD,eAAO,MAAM,8BAA8B,GACzC,WAAW,OAAO,EAAE,GAAG,KAAK,GAAG,SAAS,EACxC,iBAAiB,eAAe,oFAcjC,CAAC;AAOF,wBAAgB,kBAAkB,CAAC,MAAM,EAAE,WAAW,EAAE,IAAI,EAAE,OAAO,GAAG,OAAO,oBAE9E;AAED,wBAAgB,UAAU,CAAC,MAAM,EAAE,WAAW,EAAE,IAAI,EAAE,OAAO,GAAG,OAAO,QAKtE"}
@@ -8,16 +8,14 @@ import { Variant } from "@fishjam-cloud/ts-client";
8
8
  // However, in that event handler, we don't yet have the remote track ID.
9
9
  // Therefore, for that brief moment, we will use the local track ID from the MediaStreamTrack object to identify the track.
10
10
  const getRemoteOrLocalTrackContext = (tsClient, remoteOrLocalTrackId) => {
11
- if (!remoteOrLocalTrackId)
12
- return null;
13
11
  const tracks = tsClient?.getLocalPeer()?.tracks;
14
12
  if (!tracks)
15
13
  return null;
16
14
  const trackByRemoteId = tracks?.get(remoteOrLocalTrackId);
17
15
  if (trackByRemoteId)
18
16
  return trackByRemoteId;
19
- const trackByLocalId = [...tracks.values()].find((track) => track.track?.id === remoteOrLocalTrackId);
20
- return trackByLocalId ? trackByLocalId : null;
17
+ const trackByLocalId = [...tracks.values()].find(({ track }) => track?.id === remoteOrLocalTrackId);
18
+ return trackByLocalId ?? null;
21
19
  };
22
20
  const getTrackFromContext = (context) => ({
23
21
  metadata: context.metadata,
@@ -57,3 +55,17 @@ export const getConfigAndBandwidthFromProps = (encodings, bandwidthLimits) => {
57
55
  const bandwidth = new Map(variantEntries);
58
56
  return [bandwidth, config];
59
57
  };
58
+ function getCertainTypeTracks(stream, type) {
59
+ if (type === "audio")
60
+ return stream.getAudioTracks();
61
+ return stream.getVideoTracks();
62
+ }
63
+ export function getTrackFromStream(stream, type) {
64
+ return getCertainTypeTracks(stream, type)[0] ?? null;
65
+ }
66
+ export function stopStream(stream, type) {
67
+ getCertainTypeTracks(stream, type).forEach((track) => {
68
+ track.enabled = false;
69
+ track.stop();
70
+ });
71
+ }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@fishjam-cloud/react-client",
3
- "version": "0.14.0",
3
+ "version": "0.14.1",
4
4
  "description": "React client library for Fishjam",
5
5
  "license": "Apache-2.0",
6
6
  "author": "Fishjam Team",
@@ -26,9 +26,9 @@
26
26
  "import": "./dist/index.js",
27
27
  "types": "./dist/index.d.ts"
28
28
  },
29
- "./internal": {
30
- "import": "./dist/internal.js",
31
- "types": "./dist/internal.d.ts"
29
+ "./debug": {
30
+ "import": "./dist/debug.js",
31
+ "types": "./dist/debug.d.ts"
32
32
  }
33
33
  },
34
34
  "scripts": {
@@ -42,19 +42,19 @@
42
42
  "prepack": "yarn workspace @fishjam-cloud/ts-client build && yarn build"
43
43
  },
44
44
  "devDependencies": {
45
- "@playwright/test": "^1.50.1",
45
+ "@playwright/test": "^1.51.1",
46
46
  "@types/events": "^3.0.3",
47
47
  "@types/lodash.isequal": "^4.5.8",
48
- "@types/node": "^22.13.4",
49
- "@types/react": "^19.0.10",
48
+ "@types/node": "^22.13.10",
49
+ "@types/react": "^19.0.11",
50
50
  "react": "^19.0.0",
51
51
  "typed-emitter": "^2.1.0",
52
- "typedoc": "^0.27.7",
53
- "typedoc-plugin-mdn-links": "^4.0.13",
54
- "typescript": "^5.7.3"
52
+ "typedoc": "^0.28.0",
53
+ "typedoc-plugin-mdn-links": "^5.0.1",
54
+ "typescript": "^5.8.2"
55
55
  },
56
56
  "dependencies": {
57
- "@fishjam-cloud/ts-client": "0.14.0",
57
+ "@fishjam-cloud/ts-client": "0.14.1",
58
58
  "events": "3.3.0",
59
59
  "lodash.isequal": "4.5.0"
60
60
  },
@@ -1,65 +0,0 @@
1
- import type TypedEmitter from "typed-emitter";
2
- import type { DeviceManagerStatus, DeviceState, Media, MediaManager } from "../types/internal";
3
- import type { DeviceError, DeviceType, PersistLastDeviceHandlers, TrackMiddleware } from "../types/public";
4
- export type DeviceManagerEvents = {
5
- managerStarted: (event: DeviceState & {
6
- constraints: MediaTrackConstraints | undefined;
7
- }, state: DeviceState) => void;
8
- managerInitialized: (state: DeviceState) => void;
9
- devicesStarted: (event: {
10
- restarting: boolean;
11
- constraints?: MediaTrackConstraints | boolean;
12
- }, state: DeviceState) => void;
13
- deviceReady: (event: {
14
- stream: MediaStream;
15
- }, state: DeviceState) => void;
16
- devicesReady: (event: DeviceState & {
17
- restarted: boolean;
18
- }, state: DeviceState) => void;
19
- deviceStopped: (state: DeviceState) => void;
20
- deviceEnabled: (state: DeviceState) => void;
21
- deviceDisabled: (state: DeviceState) => void;
22
- middlewareSet: (state: DeviceState) => void;
23
- error: (event: any, state: DeviceState) => void;
24
- initializedWithError: (state: DeviceState) => void;
25
- };
26
- export type DeviceManagerConfig = {
27
- deviceType: DeviceType;
28
- defaultConstraints: MediaTrackConstraints;
29
- userConstraints?: boolean | MediaTrackConstraints;
30
- storage?: boolean | PersistLastDeviceHandlers;
31
- };
32
- declare const DeviceManager_base: new () => TypedEmitter<DeviceManagerEvents>;
33
- export declare class DeviceManager extends DeviceManager_base implements MediaManager {
34
- private readonly constraints;
35
- private status;
36
- private readonly deviceType;
37
- private readonly middlewareManager;
38
- readonly getLastDevice: () => MediaDeviceInfo | null;
39
- private readonly saveLastDevice;
40
- private rawMedia;
41
- private processedMediaTrack;
42
- private media;
43
- private mediaStatus;
44
- private devices;
45
- private devicesStatus;
46
- private error;
47
- constructor({ deviceType, storage, userConstraints, defaultConstraints }: DeviceManagerConfig);
48
- getState(): DeviceState;
49
- getStatus(): DeviceManagerStatus;
50
- getConstraints(): MediaTrackConstraints | boolean;
51
- getDeviceType: () => DeviceType;
52
- getMedia: () => Media | null;
53
- initialize: (stream: MediaStream | null, track: MediaStreamTrack | null, devices: MediaDeviceInfo[], requestedMedia: boolean, error?: DeviceError | null) => void;
54
- start(deviceId?: string): Promise<void>;
55
- setTrackMiddleware(middleware: TrackMiddleware | null): Promise<void>;
56
- getMiddleware(): TrackMiddleware | null;
57
- stop(): void;
58
- disable(): void;
59
- enable(): void;
60
- private setEnable;
61
- private updateMedia;
62
- private setCurrentMedia;
63
- }
64
- export {};
65
- //# sourceMappingURL=DeviceManager.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"DeviceManager.d.ts","sourceRoot":"","sources":["../../src/devices/DeviceManager.ts"],"names":[],"mappings":"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"}
@@ -1,188 +0,0 @@
1
- import EventEmitter from "events";
2
- import { parseUserMediaError } from "../utils/errors";
3
- import { createStorageConfig } from "../utils/localStorage";
4
- import { setupOnEndedCallback } from "../utils/track";
5
- import { prepareMediaTrackConstraints } from "./constraints";
6
- import { MiddlewareManager } from "./MiddlewareManager";
7
- const NOOP = () => { };
8
- export class DeviceManager extends EventEmitter {
9
- constraints;
10
- status = "uninitialized";
11
- deviceType;
12
- middlewareManager = new MiddlewareManager();
13
- getLastDevice = () => null;
14
- saveLastDevice = NOOP;
15
- rawMedia = null;
16
- processedMediaTrack = null;
17
- media = null;
18
- mediaStatus = "Not requested";
19
- devices = null;
20
- devicesStatus = "Not requested";
21
- error = null;
22
- constructor({ deviceType, storage, userConstraints, defaultConstraints }) {
23
- super();
24
- const storageConfig = createStorageConfig(deviceType, storage);
25
- if (storageConfig) {
26
- this.getLastDevice = storageConfig.getLastDevice;
27
- this.saveLastDevice = storageConfig.saveLastDevice;
28
- }
29
- this.deviceType = deviceType;
30
- this.constraints = userConstraints ?? defaultConstraints;
31
- }
32
- getState() {
33
- return {
34
- mediaStatus: this.mediaStatus,
35
- devices: this.devices,
36
- devicesStatus: this.devicesStatus,
37
- error: this.error,
38
- media: this.media,
39
- currentMiddleware: this.middlewareManager.getMiddleware(),
40
- };
41
- }
42
- getStatus() {
43
- return this.status;
44
- }
45
- getConstraints() {
46
- return this.constraints;
47
- }
48
- getDeviceType = () => {
49
- return this.deviceType;
50
- };
51
- getMedia = () => {
52
- return this.media;
53
- };
54
- initialize = (stream, track, devices, requestedMedia, error = null) => {
55
- const deviceInfo = getDeviceInfo(track?.getSettings()?.deviceId || null, devices);
56
- const [devicesStatus, newError] = prepareStatus(requestedMedia, track);
57
- this.devices = devices;
58
- this.devicesStatus = devicesStatus;
59
- this.mediaStatus = devicesStatus;
60
- this.error = newError ?? error;
61
- if (this.error) {
62
- this.emit("initializedWithError", this.getState());
63
- }
64
- this.updateMedia({
65
- stream: track ? stream : null,
66
- track,
67
- deviceInfo,
68
- enabled: Boolean(track?.enabled),
69
- });
70
- if (deviceInfo)
71
- this.saveLastDevice?.(deviceInfo);
72
- this.status = "initialized";
73
- if (track) {
74
- setupOnEndedCallback(track, () => this?.rawMedia?.track?.id, async () => this.stop());
75
- }
76
- this.emit("managerInitialized", this.getState());
77
- };
78
- async start(deviceId) {
79
- const newDeviceId = deviceId ?? this.getLastDevice?.()?.deviceId;
80
- const currentDeviceId = this.rawMedia?.deviceInfo?.deviceId;
81
- const shouldReplaceDevice = Boolean(currentDeviceId && currentDeviceId !== newDeviceId);
82
- const isDeviceStopped = currentDeviceId === undefined;
83
- const shouldProceed = isDeviceStopped || shouldReplaceDevice;
84
- const exactConstraints = shouldProceed && prepareMediaTrackConstraints(newDeviceId, this.constraints);
85
- if (!exactConstraints)
86
- return;
87
- this.mediaStatus = "Requesting";
88
- this.emit("devicesStarted", { restarting: shouldReplaceDevice, constraints: exactConstraints }, this.getState());
89
- try {
90
- const stream = await navigator.mediaDevices.getUserMedia({ [this.deviceType]: exactConstraints });
91
- const track = getTrack(stream, this.deviceType);
92
- const trackDeviceId = track?.getSettings()?.deviceId;
93
- const deviceInfo = trackDeviceId ? getDeviceInfo(trackDeviceId, this.devices ?? []) : null;
94
- if (deviceInfo) {
95
- this.saveLastDevice?.(deviceInfo);
96
- }
97
- this.rawMedia?.track?.stop();
98
- this.processedMediaTrack?.stop();
99
- this.updateMedia({
100
- stream,
101
- track,
102
- deviceInfo,
103
- enabled: Boolean(track?.enabled),
104
- });
105
- if (track) {
106
- setupOnEndedCallback(track, () => this?.rawMedia?.track?.id, async () => this.stop());
107
- }
108
- this.mediaStatus = "OK";
109
- this.emit("devicesReady", { ...this.getState(), restarted: shouldReplaceDevice }, this.getState());
110
- }
111
- catch (err) {
112
- const parsedError = parseUserMediaError(err);
113
- const event = {
114
- parsedError,
115
- constraints: exactConstraints,
116
- };
117
- this.error = parsedError;
118
- this.emit("error", event, this.getState());
119
- }
120
- }
121
- async setTrackMiddleware(middleware) {
122
- const rawTrack = this.rawMedia?.track ?? null;
123
- const processedMedia = this.middlewareManager.applyMiddleware(rawTrack, middleware);
124
- this.setCurrentMedia(this.rawMedia, processedMedia);
125
- this.emit("middlewareSet", this.getState());
126
- }
127
- getMiddleware() {
128
- return this.middlewareManager.getMiddleware();
129
- }
130
- stop() {
131
- this.middlewareManager.clearMiddleware();
132
- this.processedMediaTrack?.stop();
133
- this.rawMedia?.track?.stop();
134
- this.media?.track?.stop();
135
- this.updateMedia(null);
136
- this.emit("deviceStopped", this.getState());
137
- }
138
- disable() {
139
- this.setEnable(this.rawMedia?.track ?? null, false);
140
- this.setEnable(this.processedMediaTrack, false);
141
- if (this.media) {
142
- this.media.enabled = false;
143
- }
144
- this.emit("deviceDisabled", this.getState());
145
- }
146
- enable() {
147
- this.setEnable(this.rawMedia?.track ?? null, true);
148
- this.setEnable(this.processedMediaTrack, true);
149
- if (this.media) {
150
- this.media.enabled = true;
151
- }
152
- this.emit("deviceEnabled", this.getState());
153
- }
154
- setEnable = (track, value) => {
155
- if (!track)
156
- return;
157
- track.enabled = value;
158
- };
159
- updateMedia(media) {
160
- this.rawMedia = !media ? null : { ...media };
161
- const processedMedia = this.middlewareManager.applyMiddleware(media?.track ?? null);
162
- this.setCurrentMedia(this.rawMedia, processedMedia);
163
- }
164
- setCurrentMedia(media, processedTrack) {
165
- this.processedMediaTrack = processedTrack;
166
- const streamTrack = processedTrack ? { track: processedTrack, stream: new MediaStream([processedTrack]) } : media;
167
- this.media = streamTrack
168
- ? {
169
- ...streamTrack,
170
- enabled: Boolean(streamTrack.track?.enabled),
171
- deviceInfo: this.rawMedia?.deviceInfo ?? null,
172
- }
173
- : null;
174
- }
175
- }
176
- function getDeviceInfo(trackDeviceId, devices) {
177
- return (trackDeviceId && devices.find(({ deviceId }) => trackDeviceId === deviceId)) || null;
178
- }
179
- function getTrack(stream, deviceType) {
180
- return (deviceType === "audio" ? stream?.getAudioTracks()?.[0] : stream?.getVideoTracks()?.[0]) ?? null;
181
- }
182
- function prepareStatus(requested, track) {
183
- if (!requested)
184
- return ["Not requested", null];
185
- if (track)
186
- return ["OK", null];
187
- return ["Error", null];
188
- }
@@ -1,9 +0,0 @@
1
- import type { TrackMiddleware } from "../types/public";
2
- export declare class MiddlewareManager {
3
- private middleware;
4
- private clearMiddlewareFn;
5
- getMiddleware(): TrackMiddleware | null;
6
- clearMiddleware(): void;
7
- applyMiddleware(rawTrack: MediaStreamTrack | null, middleware?: TrackMiddleware | null): MediaStreamTrack | null;
8
- }
9
- //# sourceMappingURL=MiddlewareManager.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"MiddlewareManager.d.ts","sourceRoot":"","sources":["../../src/devices/MiddlewareManager.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,iBAAiB,CAAC;AAGvD,qBAAa,iBAAiB;IAC5B,OAAO,CAAC,UAAU,CAAgC;IAClD,OAAO,CAAC,iBAAiB,CAA6B;IAE/C,aAAa,IAAI,eAAe,GAAG,IAAI;IAIvC,eAAe;IAKf,eAAe,CACpB,QAAQ,EAAE,gBAAgB,GAAG,IAAI,EACjC,UAAU,GAAE,eAAe,GAAG,IAAsB,GACnD,gBAAgB,GAAG,IAAI;CAmB3B"}
@@ -1,26 +0,0 @@
1
- import { setupOnEndedCallback } from "../utils/track";
2
- export class MiddlewareManager {
3
- middleware = null;
4
- clearMiddlewareFn = null;
5
- getMiddleware() {
6
- return this.middleware;
7
- }
8
- clearMiddleware() {
9
- this.clearMiddlewareFn?.();
10
- this.clearMiddlewareFn = null;
11
- }
12
- applyMiddleware(rawTrack, middleware = this.middleware) {
13
- this.middleware = middleware;
14
- this.clearMiddleware();
15
- if (!rawTrack || !middleware)
16
- return null;
17
- const { onClear, track } = middleware(rawTrack);
18
- if (onClear)
19
- this.clearMiddlewareFn = onClear;
20
- setupOnEndedCallback(track, () => track.id, async () => {
21
- this.clearMiddleware();
22
- track.stop();
23
- });
24
- return track;
25
- }
26
- }
@@ -1,8 +0,0 @@
1
- import type { DeviceManager } from "../../../devices/DeviceManager";
2
- import type { Device } from "../../../types/public";
3
- type DeviceApiDependencies = {
4
- deviceManager: DeviceManager;
5
- };
6
- export declare const useDeviceApi: ({ deviceManager }: DeviceApiDependencies) => Device;
7
- export {};
8
- //# sourceMappingURL=useDeviceApi.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"useDeviceApi.d.ts","sourceRoot":"","sources":["../../../../src/hooks/internal/device/useDeviceApi.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,gCAAgC,CAAC;AACpE,OAAO,KAAK,EAAE,MAAM,EAAc,MAAM,uBAAuB,CAAC;AAGhE,KAAK,qBAAqB,GAAG;IAC3B,aAAa,EAAE,aAAa,CAAC;CAC9B,CAAC;AAEF,eAAO,MAAM,YAAY,sBAAuB,qBAAqB,KAAG,MA+BvE,CAAC"}
@@ -1,28 +0,0 @@
1
- import { useMemo } from "react";
2
- import { useDeviceManager } from "./useDeviceManager";
3
- export const useDeviceApi = ({ deviceManager }) => {
4
- const { deviceState, deviceType, deviceStatus } = useDeviceManager(deviceManager);
5
- const mediaStream = useMemo(() => deviceState.media?.stream ?? null, [deviceState.media?.stream]);
6
- const currentMiddleware = deviceState.currentMiddleware ?? null;
7
- const mediaStreamTrack = useMemo(() => {
8
- if (deviceType === "video")
9
- return mediaStream?.getVideoTracks()[0] ?? null;
10
- return mediaStream?.getAudioTracks()[0] ?? null;
11
- }, [mediaStream, deviceType]);
12
- const devices = useMemo(() => deviceState.devices?.map(({ deviceId, label }) => ({ deviceId, label })) ?? [], [deviceState.devices]);
13
- const activeDevice = deviceState.media?.deviceInfo
14
- ? { deviceId: deviceState.media.deviceInfo.deviceId, label: deviceState.media.deviceInfo.label }
15
- : null;
16
- const isMuted = !deviceState.media?.enabled;
17
- const deviceError = deviceState.error ?? null;
18
- return {
19
- mediaStream,
20
- currentMiddleware,
21
- deviceStatus,
22
- devices,
23
- deviceError,
24
- activeDevice,
25
- isMuted,
26
- mediaStreamTrack,
27
- };
28
- };
@@ -1,4 +0,0 @@
1
- import type { DeviceManager } from "../../../devices/DeviceManager";
2
- import type { DeviceManagerState } from "../../../types/internal";
3
- export declare const useDeviceManager: (deviceManager: DeviceManager) => DeviceManagerState;
4
- //# sourceMappingURL=useDeviceManager.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"useDeviceManager.d.ts","sourceRoot":"","sources":["../../../../src/hooks/internal/device/useDeviceManager.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,aAAa,EAAuB,MAAM,gCAAgC,CAAC;AACzF,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,yBAAyB,CAAC;AAgBlE,eAAO,MAAM,gBAAgB,kBAAmB,aAAa,uBAoC5D,CAAC"}
@@ -1,41 +0,0 @@
1
- import { useCallback, useRef, useSyncExternalStore } from "react";
2
- const eventNames = [
3
- "deviceDisabled",
4
- "deviceEnabled",
5
- "managerStarted",
6
- "deviceStopped",
7
- "deviceReady",
8
- "devicesStarted",
9
- "devicesReady",
10
- "managerInitialized",
11
- "error",
12
- "middlewareSet",
13
- "initializedWithError",
14
- ];
15
- export const useDeviceManager = (deviceManager) => {
16
- const mutationRef = useRef(false);
17
- const subscribe = useCallback((subscribeCallback) => {
18
- const callback = () => {
19
- mutationRef.current = true;
20
- subscribeCallback();
21
- };
22
- eventNames.forEach((eventName) => deviceManager.on(eventName, callback));
23
- return () => {
24
- eventNames.forEach((eventName) => deviceManager.removeListener(eventName, callback));
25
- };
26
- }, [deviceManager]);
27
- const lastSnapshotRef = useRef(null);
28
- const getSnapshot = useCallback(() => {
29
- if (mutationRef.current || lastSnapshotRef.current === null) {
30
- lastSnapshotRef.current = {
31
- deviceState: deviceManager.getState(),
32
- deviceStatus: deviceManager.getStatus(),
33
- deviceType: deviceManager.getDeviceType(),
34
- };
35
- mutationRef.current = false;
36
- }
37
- return lastSnapshotRef.current;
38
- }, [deviceManager]);
39
- const deviceState = useSyncExternalStore(subscribe, getSnapshot);
40
- return deviceState;
41
- };
@@ -1,7 +0,0 @@
1
- /**
2
- *
3
- * @category Connection
4
- * @deprecated
5
- */
6
- export declare function useFishjamClient_DO_NOT_USE(): import("@fishjam-cloud/ts-client").FishjamClient<import("@fishjam-cloud/ts-client").GenericMetadata, import("@fishjam-cloud/ts-client").GenericMetadata>;
7
- //# sourceMappingURL=useFishjamClient_DO_NOT_USE.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"useFishjamClient_DO_NOT_USE.d.ts","sourceRoot":"","sources":["../../../src/hooks/internal/useFishjamClient_DO_NOT_USE.ts"],"names":[],"mappings":"AAIA;;;;GAIG;AACH,wBAAgB,2BAA2B,6JAI1C"}