@stream-io/video-client 0.0.1-alpha.7
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/LICENSE +219 -0
- package/README.md +14 -0
- package/dist/index.d.ts +23 -0
- package/dist/index.js +14663 -0
- package/dist/index.js.map +1 -0
- package/dist/src/Batcher.d.ts +12 -0
- package/dist/src/CallDropScheduler.d.ts +44 -0
- package/dist/src/StreamSfuClient.d.ts +25 -0
- package/dist/src/StreamVideoClient.d.ts +145 -0
- package/dist/src/__tests__/StreamVideoClient.test.d.ts +1 -0
- package/dist/src/config/defaultConfigs.d.ts +2 -0
- package/dist/src/config/types.d.ts +29 -0
- package/dist/src/coordinator/StreamCoordinatorClient.d.ts +19 -0
- package/dist/src/coordinator/connection/base64.d.ts +2 -0
- package/dist/src/coordinator/connection/client.d.ts +174 -0
- package/dist/src/coordinator/connection/connection.d.ts +139 -0
- package/dist/src/coordinator/connection/connection_fallback.d.ts +38 -0
- package/dist/src/coordinator/connection/errors.d.ts +16 -0
- package/dist/src/coordinator/connection/events.d.ts +7 -0
- package/dist/src/coordinator/connection/insights.d.ts +58 -0
- package/dist/src/coordinator/connection/signing.d.ts +30 -0
- package/dist/src/coordinator/connection/token_manager.d.ts +39 -0
- package/dist/src/coordinator/connection/types.d.ts +96 -0
- package/dist/src/coordinator/connection/utils.d.ts +25 -0
- package/dist/src/devices.d.ts +79 -0
- package/dist/src/events/call.d.ts +26 -0
- package/dist/src/events/internal.d.ts +8 -0
- package/dist/src/events/participant.d.ts +21 -0
- package/dist/src/events/speaker.d.ts +10 -0
- package/dist/src/gen/coordinator/index.d.ts +1664 -0
- package/dist/src/gen/google/protobuf/descriptor.d.ts +1650 -0
- package/dist/src/gen/google/protobuf/duration.d.ts +113 -0
- package/dist/src/gen/google/protobuf/struct.d.ts +184 -0
- package/dist/src/gen/google/protobuf/timestamp.d.ts +158 -0
- package/dist/src/gen/video/coordinator/broadcast_v1/broadcast.d.ts +66 -0
- package/dist/src/gen/video/coordinator/call_v1/call.d.ts +254 -0
- package/dist/src/gen/video/coordinator/client_v1_rpc/client_rpc.client.d.ts +351 -0
- package/dist/src/gen/video/coordinator/client_v1_rpc/client_rpc.d.ts +1488 -0
- package/dist/src/gen/video/coordinator/client_v1_rpc/envelopes.d.ts +143 -0
- package/dist/src/gen/video/coordinator/client_v1_rpc/websocket.d.ts +292 -0
- package/dist/src/gen/video/coordinator/edge_v1/edge.d.ts +183 -0
- package/dist/src/gen/video/coordinator/event_v1/event.d.ts +411 -0
- package/dist/src/gen/video/coordinator/geofence_v1/geofence.d.ts +63 -0
- package/dist/src/gen/video/coordinator/member_v1/member.d.ts +59 -0
- package/dist/src/gen/video/coordinator/participant_v1/participant.d.ts +103 -0
- package/dist/src/gen/video/coordinator/push_v1/push.d.ts +240 -0
- package/dist/src/gen/video/coordinator/stat_v1/stat.d.ts +308 -0
- package/dist/src/gen/video/coordinator/user_v1/user.d.ts +112 -0
- package/dist/src/gen/video/coordinator/utils_v1/utils.d.ts +47 -0
- package/dist/src/gen/video/sfu/event/events.d.ts +736 -0
- package/dist/src/gen/video/sfu/models/models.d.ts +460 -0
- package/dist/src/gen/video/sfu/signal_rpc/signal.client.d.ts +89 -0
- package/dist/src/gen/video/sfu/signal_rpc/signal.d.ts +320 -0
- package/dist/src/helpers/browsers.d.ts +8 -0
- package/dist/src/helpers/sound-detector.d.ts +34 -0
- package/dist/src/rpc/createClient.d.ts +10 -0
- package/dist/src/rpc/index.d.ts +2 -0
- package/dist/src/rpc/latency.d.ts +9 -0
- package/dist/src/rtc/Call.d.ts +180 -0
- package/dist/src/rtc/CallMetadata.d.ts +9 -0
- package/dist/src/rtc/Dispatcher.d.ts +9 -0
- package/dist/src/rtc/IceTrickleBuffer.d.ts +11 -0
- package/dist/src/rtc/callEventHandlers.d.ts +5 -0
- package/dist/src/rtc/codecs.d.ts +2 -0
- package/dist/src/rtc/helpers/iceCandidate.d.ts +2 -0
- package/dist/src/rtc/helpers/tracks.d.ts +3 -0
- package/dist/src/rtc/publisher.d.ts +53 -0
- package/dist/src/rtc/signal.d.ts +5 -0
- package/dist/src/rtc/subscriber.d.ts +7 -0
- package/dist/src/rtc/types.d.ts +84 -0
- package/dist/src/rtc/videoLayers.d.ts +17 -0
- package/dist/src/stats/coordinator-stats-reporter.d.ts +10 -0
- package/dist/src/stats/state-store-stats-reporter.d.ts +57 -0
- package/dist/src/stats/types.d.ts +42 -0
- package/dist/src/store/index.d.ts +2 -0
- package/dist/src/store/rxUtils.d.ts +18 -0
- package/dist/src/store/stateStore.d.ts +182 -0
- package/generate-openapi.sh +32 -0
- package/index.ts +30 -0
- package/openapitools.json +7 -0
- package/package.json +54 -0
- package/rollup.config.mjs +48 -0
- package/src/Batcher.ts +43 -0
- package/src/CallDropScheduler.ts +192 -0
- package/src/StreamSfuClient.ts +185 -0
- package/src/StreamVideoClient.ts +487 -0
- package/src/__tests__/StreamVideoClient.test.ts +83 -0
- package/src/config/defaultConfigs.ts +15 -0
- package/src/config/types.ts +30 -0
- package/src/coordinator/StreamCoordinatorClient.ts +111 -0
- package/src/coordinator/connection/base64.ts +80 -0
- package/src/coordinator/connection/client.ts +815 -0
- package/src/coordinator/connection/connection.ts +750 -0
- package/src/coordinator/connection/connection_fallback.ts +239 -0
- package/src/coordinator/connection/errors.ts +70 -0
- package/src/coordinator/connection/events.ts +10 -0
- package/src/coordinator/connection/insights.ts +88 -0
- package/src/coordinator/connection/signing.ts +104 -0
- package/src/coordinator/connection/token_manager.ts +160 -0
- package/src/coordinator/connection/types.ts +120 -0
- package/src/coordinator/connection/utils.ts +148 -0
- package/src/devices.ts +266 -0
- package/src/events/call.ts +166 -0
- package/src/events/internal.ts +47 -0
- package/src/events/participant.ts +97 -0
- package/src/events/speaker.ts +62 -0
- package/src/gen/coordinator/index.ts +1653 -0
- package/src/gen/google/protobuf/descriptor.ts +3466 -0
- package/src/gen/google/protobuf/duration.ts +232 -0
- package/src/gen/google/protobuf/struct.ts +481 -0
- package/src/gen/google/protobuf/timestamp.ts +291 -0
- package/src/gen/video/coordinator/broadcast_v1/broadcast.ts +154 -0
- package/src/gen/video/coordinator/call_v1/call.ts +651 -0
- package/src/gen/video/coordinator/client_v1_rpc/client_rpc.client.ts +463 -0
- package/src/gen/video/coordinator/client_v1_rpc/client_rpc.ts +3819 -0
- package/src/gen/video/coordinator/client_v1_rpc/envelopes.ts +424 -0
- package/src/gen/video/coordinator/client_v1_rpc/websocket.ts +719 -0
- package/src/gen/video/coordinator/edge_v1/edge.ts +532 -0
- package/src/gen/video/coordinator/event_v1/event.ts +1171 -0
- package/src/gen/video/coordinator/geofence_v1/geofence.ts +128 -0
- package/src/gen/video/coordinator/member_v1/member.ts +138 -0
- package/src/gen/video/coordinator/participant_v1/participant.ts +261 -0
- package/src/gen/video/coordinator/push_v1/push.ts +651 -0
- package/src/gen/video/coordinator/stat_v1/stat.ts +656 -0
- package/src/gen/video/coordinator/user_v1/user.ts +277 -0
- package/src/gen/video/coordinator/utils_v1/utils.ts +98 -0
- package/src/gen/video/sfu/event/events.ts +1962 -0
- package/src/gen/video/sfu/models/models.ts +1062 -0
- package/src/gen/video/sfu/signal_rpc/signal.client.ts +108 -0
- package/src/gen/video/sfu/signal_rpc/signal.ts +906 -0
- package/src/helpers/browsers.ts +13 -0
- package/src/helpers/sound-detector.ts +85 -0
- package/src/rpc/createClient.ts +50 -0
- package/src/rpc/index.ts +2 -0
- package/src/rpc/latency.ts +43 -0
- package/src/rtc/Call.ts +585 -0
- package/src/rtc/CallMetadata.ts +24 -0
- package/src/rtc/Dispatcher.ts +46 -0
- package/src/rtc/IceTrickleBuffer.ts +21 -0
- package/src/rtc/callEventHandlers.ts +37 -0
- package/src/rtc/codecs.ts +61 -0
- package/src/rtc/helpers/iceCandidate.ts +16 -0
- package/src/rtc/helpers/tracks.ts +18 -0
- package/src/rtc/publisher.ts +305 -0
- package/src/rtc/signal.ts +34 -0
- package/src/rtc/subscriber.ts +85 -0
- package/src/rtc/types.ts +105 -0
- package/src/rtc/videoLayers.ts +103 -0
- package/src/stats/coordinator-stats-reporter.ts +167 -0
- package/src/stats/state-store-stats-reporter.ts +364 -0
- package/src/stats/types.ts +46 -0
- package/src/store/index.ts +2 -0
- package/src/store/rxUtils.ts +42 -0
- package/src/store/stateStore.ts +341 -0
- package/tsconfig.json +25 -0
- package/typedoc.json +11 -0
- package/vite.config.ts +11 -0
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Checks whether the current browser is Safari.
|
|
3
|
+
*/
|
|
4
|
+
export const isSafari = () => {
|
|
5
|
+
return /^((?!chrome|android).)*safari/i.test(navigator.userAgent);
|
|
6
|
+
};
|
|
7
|
+
|
|
8
|
+
/**
|
|
9
|
+
* Checks whether the current browser is Firefox.
|
|
10
|
+
*/
|
|
11
|
+
export const isFirefox = () => {
|
|
12
|
+
return navigator.userAgent.includes('Firefox');
|
|
13
|
+
};
|
|
@@ -0,0 +1,85 @@
|
|
|
1
|
+
export type SoundDetectorOptions = {
|
|
2
|
+
/**
|
|
3
|
+
* Defines how often the detector should check whether a sound is present.
|
|
4
|
+
* Defaults to 500ms.
|
|
5
|
+
*/
|
|
6
|
+
detectionFrequencyInMs?: number;
|
|
7
|
+
|
|
8
|
+
/**
|
|
9
|
+
* Defines the audio level threshold before a "change" is emitted.
|
|
10
|
+
* Defaults to 150. This value should be in the range of 0-255.
|
|
11
|
+
*/
|
|
12
|
+
audioLevelThreshold?: number;
|
|
13
|
+
|
|
14
|
+
/**
|
|
15
|
+
* See https://developer.mozilla.org/en-US/docs/web/api/analysernode/fftsize
|
|
16
|
+
*
|
|
17
|
+
* Defaults to 128.
|
|
18
|
+
*/
|
|
19
|
+
fftSize?: number;
|
|
20
|
+
|
|
21
|
+
/**
|
|
22
|
+
* Defines whether the provided audio stream should be stopped (destroyed)
|
|
23
|
+
* when the sound detector is stopped.
|
|
24
|
+
*
|
|
25
|
+
* Defaults to `true`.
|
|
26
|
+
*/
|
|
27
|
+
destroyStreamOnStop?: boolean;
|
|
28
|
+
};
|
|
29
|
+
|
|
30
|
+
const DETECTION_FREQUENCY_IN_MS = 500;
|
|
31
|
+
const AUDIO_LEVEL_THRESHOLD = 150;
|
|
32
|
+
const FFT_SIZE = 128;
|
|
33
|
+
|
|
34
|
+
/**
|
|
35
|
+
* Creates a new sound detector.
|
|
36
|
+
*
|
|
37
|
+
* @param audioStream the audio stream to observe. Depending on the provided configuration, this stream might be destroyed when the sound detector is stopped.
|
|
38
|
+
* @param onSoundDetectedStateChanged a callback which is called when the sound state changes.
|
|
39
|
+
* @param options custom options for the sound detector.
|
|
40
|
+
* @returns a clean-up function which once invoked stops the sound detector.
|
|
41
|
+
*/
|
|
42
|
+
export const createSoundDetector = (
|
|
43
|
+
audioStream: MediaStream,
|
|
44
|
+
onSoundDetectedStateChanged: (isSoundDetected: boolean) => void,
|
|
45
|
+
options: SoundDetectorOptions = {},
|
|
46
|
+
) => {
|
|
47
|
+
const {
|
|
48
|
+
detectionFrequencyInMs = DETECTION_FREQUENCY_IN_MS,
|
|
49
|
+
audioLevelThreshold = AUDIO_LEVEL_THRESHOLD,
|
|
50
|
+
fftSize = FFT_SIZE,
|
|
51
|
+
destroyStreamOnStop = true,
|
|
52
|
+
} = options;
|
|
53
|
+
|
|
54
|
+
const audioContext = new AudioContext();
|
|
55
|
+
const analyser = audioContext.createAnalyser();
|
|
56
|
+
analyser.fftSize = fftSize;
|
|
57
|
+
|
|
58
|
+
const microphone = audioContext.createMediaStreamSource(audioStream);
|
|
59
|
+
microphone.connect(analyser);
|
|
60
|
+
|
|
61
|
+
const intervalId = setInterval(() => {
|
|
62
|
+
const data = new Uint8Array(analyser.frequencyBinCount);
|
|
63
|
+
analyser.getByteFrequencyData(data);
|
|
64
|
+
|
|
65
|
+
const isSoundDetected = data.some((value) => value >= audioLevelThreshold);
|
|
66
|
+
onSoundDetectedStateChanged(isSoundDetected);
|
|
67
|
+
}, detectionFrequencyInMs);
|
|
68
|
+
|
|
69
|
+
return async function stop() {
|
|
70
|
+
clearInterval(intervalId);
|
|
71
|
+
|
|
72
|
+
// clean-up the AudioContext elements
|
|
73
|
+
microphone.disconnect();
|
|
74
|
+
analyser.disconnect();
|
|
75
|
+
await audioContext.close();
|
|
76
|
+
|
|
77
|
+
// stop the stream
|
|
78
|
+
if (destroyStreamOnStop) {
|
|
79
|
+
audioStream.getTracks().forEach((track) => {
|
|
80
|
+
track.stop();
|
|
81
|
+
audioStream.removeTrack(track);
|
|
82
|
+
});
|
|
83
|
+
}
|
|
84
|
+
};
|
|
85
|
+
};
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
import type {
|
|
2
|
+
MethodInfo,
|
|
3
|
+
NextUnaryFn,
|
|
4
|
+
RpcInterceptor,
|
|
5
|
+
RpcOptions,
|
|
6
|
+
UnaryCall,
|
|
7
|
+
} from '@protobuf-ts/runtime-rpc';
|
|
8
|
+
import {
|
|
9
|
+
TwirpFetchTransport,
|
|
10
|
+
TwirpOptions,
|
|
11
|
+
} from '@protobuf-ts/twirp-transport';
|
|
12
|
+
import { SignalServerClient } from '../gen/video/sfu/signal_rpc/signal.client';
|
|
13
|
+
|
|
14
|
+
const defaultOptions: TwirpOptions = {
|
|
15
|
+
baseUrl: '',
|
|
16
|
+
sendJson: false,
|
|
17
|
+
jsonOptions: {
|
|
18
|
+
ignoreUnknownFields: true,
|
|
19
|
+
},
|
|
20
|
+
};
|
|
21
|
+
|
|
22
|
+
export const withHeaders = (
|
|
23
|
+
headers: Record<string, string>,
|
|
24
|
+
): RpcInterceptor => {
|
|
25
|
+
return {
|
|
26
|
+
interceptUnary(
|
|
27
|
+
next: NextUnaryFn,
|
|
28
|
+
method: MethodInfo,
|
|
29
|
+
input: object,
|
|
30
|
+
options: RpcOptions,
|
|
31
|
+
): UnaryCall {
|
|
32
|
+
options.meta = { ...options.meta, ...headers };
|
|
33
|
+
return next(method, input, options);
|
|
34
|
+
},
|
|
35
|
+
};
|
|
36
|
+
};
|
|
37
|
+
|
|
38
|
+
/**
|
|
39
|
+
* Creates new SignalServerClient instance.
|
|
40
|
+
*
|
|
41
|
+
* @param options the twirp options.
|
|
42
|
+
*/
|
|
43
|
+
export const createSignalClient = (options?: TwirpOptions) => {
|
|
44
|
+
const transport = new TwirpFetchTransport({
|
|
45
|
+
...defaultOptions,
|
|
46
|
+
...options,
|
|
47
|
+
});
|
|
48
|
+
|
|
49
|
+
return new SignalServerClient(transport);
|
|
50
|
+
};
|
package/src/rpc/index.ts
ADDED
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
const toSeconds = (ms: number) => ms / 1000;
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* Measures the latency of the current client to the given endpoint.
|
|
5
|
+
* Uses HTML Image tag in order to avoid CORS issues.
|
|
6
|
+
*
|
|
7
|
+
* @param endpoint the endpoint.
|
|
8
|
+
* @param rounds the number of measuring rounds to perform.
|
|
9
|
+
* @param timeoutAfterMs the request cancellation period.
|
|
10
|
+
*/
|
|
11
|
+
export const measureResourceLoadLatencyTo = async (
|
|
12
|
+
endpoint: string,
|
|
13
|
+
rounds: number = 3,
|
|
14
|
+
timeoutAfterMs: number = 1500,
|
|
15
|
+
) => {
|
|
16
|
+
const measurements: number[] = [];
|
|
17
|
+
await Promise.all(
|
|
18
|
+
Array(rounds)
|
|
19
|
+
.fill(undefined)
|
|
20
|
+
.map(async () => {
|
|
21
|
+
const start = Date.now();
|
|
22
|
+
const controller = new AbortController();
|
|
23
|
+
const abortTimeout = setTimeout(() => {
|
|
24
|
+
controller.abort();
|
|
25
|
+
}, timeoutAfterMs);
|
|
26
|
+
try {
|
|
27
|
+
const src = new URL(endpoint);
|
|
28
|
+
src.searchParams.set('r', `js_${Math.random() * 10000000}`);
|
|
29
|
+
await fetch(src.toString(), {
|
|
30
|
+
signal: controller.signal,
|
|
31
|
+
}).then((response) => response.blob());
|
|
32
|
+
const latency = Date.now() - start;
|
|
33
|
+
measurements.push(toSeconds(latency));
|
|
34
|
+
} catch (e) {
|
|
35
|
+
console.debug(`failed to measure latency to ${endpoint}`, e);
|
|
36
|
+
measurements.push(-1); // indicate error in measurement
|
|
37
|
+
}
|
|
38
|
+
// clear timeout in case fetch completes before timeout
|
|
39
|
+
clearTimeout(abortTimeout);
|
|
40
|
+
}),
|
|
41
|
+
);
|
|
42
|
+
return measurements;
|
|
43
|
+
};
|