opensips-js 0.1.0

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/package.json ADDED
@@ -0,0 +1,77 @@
1
+ {
2
+ "name": "opensips-js",
3
+ "version": "0.1.0",
4
+ "description": "The JS package for opensips",
5
+ "default": "src/index.ts",
6
+ "jsdelivr": "dist/opensips-js.iife.js",
7
+ "main": "dist/opensips-js.cjs.js",
8
+ "module": "dist/opensips-js.es.js",
9
+ "unpkg": "dist/opensips-js.iife.js",
10
+ "types": "dist/index.d.ts",
11
+ "scripts": {
12
+ "dev": "vite",
13
+ "postpublish": "yarn upload-cdn",
14
+ "upload-cdn": "yarn build && node scripts/upload-cdn.js",
15
+ "build": "cross-env TARGET=lib vite build",
16
+ "demo-build": "cross-env TARGET=demo vite build",
17
+ "docs-dev": "cd docs && yarn && yarn run dev",
18
+ "docs-build": "cd docs && yarn && yarn run build",
19
+ "docs-publish": "yarn docs-genereate && node scripts/upload-doc.js",
20
+ "docs-genereate": "yarn build && yarn demo-build && cd docs && yarn && yarn run generate && cd ..",
21
+ "test": "echo \"Error: no test specified\" && exit 1",
22
+ "ts-check": "tsc --noEmit",
23
+ "lint": "eslint . --ext .js,.jsx,.cjs,.mjs,.ts --fix --ignore-path .gitignore"
24
+ },
25
+ "engines": {
26
+ "node": ">= 16",
27
+ "npm": "please-use-yarn",
28
+ "yarn": ">= 1.22.4"
29
+ },
30
+ "precommit": "ts-check, lint",
31
+ "repository": {
32
+ "type": "git",
33
+ "url": "git+ssh://git@github.com/VoicenterTeam/opensips-js.git"
34
+ },
35
+ "author": "Bohdan Konechnyi",
36
+ "license": "ISC",
37
+ "bugs": {
38
+ "url": "https://github.com/VoicenterTeam/opensips-js/issues"
39
+ },
40
+ "homepage": "https://github.com/VoicenterTeam/opensips-js#readme",
41
+ "devDependencies": {
42
+ "@types/node": "^18.14.2",
43
+ "@typescript-eslint/eslint-plugin": "^5.53.0",
44
+ "@typescript-eslint/parser": "^5.53.0",
45
+ "@vitejs/plugin-vue": "^4.2.3",
46
+ "@voicenter-team/aws-uploader": "^1.0.10",
47
+ "@voicenter-team/eslint-config-ts": "^1.0.21",
48
+ "cross-env": "^7.0.3",
49
+ "dotenv": "^16.0.3",
50
+ "eslint": "^8.35.0",
51
+ "pre-commit": "^1.2.2",
52
+ "process": "^0.11.10",
53
+ "regenerator-runtime": "^0.13.11",
54
+ "tsc-alias": "^1.8.6",
55
+ "typescript": "^4.9.5",
56
+ "vite": "4.4.11",
57
+ "vite-plugin-dts": "3.5.3",
58
+ "vite-plugin-singlefile": "^0.13.5",
59
+ "vue": "3.2.25"
60
+ },
61
+ "dependencies": {
62
+ "@types/mime": "^3.0.1",
63
+ "generate-unique-id": "^2.0.1",
64
+ "jssip": "3.10.0",
65
+ "konva": "^9.3.16",
66
+ "loglevel": "^1.8.1",
67
+ "mime": "^3.0.0",
68
+ "p-iteration": "^1.1.8",
69
+ "sdp-transform": "2.14.1",
70
+ "uuid": "^10.0.0"
71
+ },
72
+ "files": [
73
+ "dist",
74
+ "src/types"
75
+ ],
76
+ "packageManager": "yarn@1.22.22+sha1.ac34549e6aa8e7ead463a7407e1c7390f61a6610"
77
+ }
@@ -0,0 +1,7 @@
1
+ declare module 'jssip/lib/Dialog' {
2
+ export namespace Dialog {
3
+ interface Dialog {
4
+ receiveRequest(arg1: string, arg2: number): void
5
+ }
6
+ }
7
+ }
@@ -0,0 +1,8 @@
1
+ declare module 'jssip/lib/Socket' {
2
+ export class Socket {
3
+
4
+ }
5
+ export class WeightedSocket {
6
+
7
+ }
8
+ }
@@ -0,0 +1,9 @@
1
+ declare module 'jssip/lib/Transactions' {
2
+ export const checkTransaction
3
+ export class InviteServerTransaction {
4
+ constructor(ua, transport, request)
5
+ }
6
+ export class NonInviteServerTransaction {
7
+ constructor(ua, transport, request)
8
+ }
9
+ }
@@ -0,0 +1,82 @@
1
+ import { Transport } from 'jssip/lib/Transport'
2
+ import { MSRPSession, MSRPSessionEventMap, DialogType } from '@/lib/msrp/session'
3
+ import { Socket, WeightedSocket } from 'jssip/lib/Socket'
4
+ import { IncomingRequest } from 'jssip/lib/SIPMessage'
5
+ import { AnswerOptions, RTCSession } from 'jssip/lib/RTCSession'
6
+ import { CallOptionsExtended } from '@/types/rtc'
7
+
8
+ declare module 'jssip' {
9
+ export class UA {
10
+ protected _transport: Transport
11
+ protected _sessions: any[]
12
+ protected _msrp_sessions: any[]
13
+ protected _registrator: any
14
+ protected _applicants: any[]
15
+ protected _dynConfiguration: object
16
+ protected _status: number
17
+ protected _closeTimer: any
18
+ protected _configuration: any
19
+ protected _contact: any
20
+
21
+ _findDialog(call_id: string, from: string, to: string): DialogType
22
+ receiveRequest(request): void
23
+ _findSession(request): MSRPSession
24
+ call(target: string, options: CallOptionsExtended): RTCSession
25
+ }
26
+
27
+ export class Message {
28
+ constructor(ua: UA)
29
+ init_incoming(request: IncomingRequest): void
30
+ }
31
+
32
+ export class Options {
33
+ constructor(ua: UA)
34
+ init_incoming(request: IncomingRequest): void
35
+ }
36
+
37
+ export interface MSRPOptions extends AnswerOptions {
38
+ eventHandlers?: Partial<MSRPSessionEventMap>;
39
+ anonymous?: boolean;
40
+ fromUserName?: string;
41
+ fromDisplayName?: string;
42
+ }
43
+ export interface UAConfiguration {
44
+ // mandatory parameters
45
+ sockets: Socket | Socket[] | WeightedSocket[] ;
46
+ uri: string;
47
+ // optional parameters
48
+ authorization_jwt?: string;
49
+ authorization_user?: string;
50
+ connection_recovery_max_interval?: number;
51
+ connection_recovery_min_interval?: number;
52
+ contact_uri?: string;
53
+ display_name?: string;
54
+ instance_id?: string;
55
+ no_answer_timeout?: number;
56
+ session_timers?: boolean;
57
+ session_timers_refresh_method?: string;
58
+ session_timers_force_refresher?: boolean;
59
+ password?: string;
60
+ realm?: string;
61
+ ha1?: string;
62
+ register?: boolean;
63
+ register_expires?: number;
64
+ registrar_server?: string;
65
+ use_preloaded_route?: boolean;
66
+ user_agent?: string;
67
+ extra_headers?: string[];
68
+ }
69
+
70
+ /*export class Dialog {
71
+
72
+ }*/
73
+ }
74
+
75
+ declare module 'jssip/lib/URI' {
76
+
77
+ }
78
+
79
+ /*declare module 'jssip/lib/Dialog' {
80
+ export class owner: object
81
+ receiveRequest (request: any): void
82
+ }*/
@@ -0,0 +1,6 @@
1
+ // export {}
2
+ // declare global {
3
+ // interface Window {
4
+ // webkitAudioContext: typeof AudioContext
5
+ // }
6
+ // }
@@ -0,0 +1 @@
1
+ export type Writeable<T> = { -readonly [P in keyof T]: T[P] }
@@ -0,0 +1,104 @@
1
+ import { UAEventMap } from 'jssip/lib/UA'
2
+
3
+ import { IMessage, MSRPSessionExtended } from '@/types/msrp'
4
+ import { ICall, RoomChangeEmitType, ICallStatus } from '@/types/rtc'
5
+ import MSRPMessage from '@/lib/msrp/message'
6
+ import { ITimeData } from '@/types/timer'
7
+ import { IncomingMSRPSessionEvent, OutgoingMSRPSessionEvent } from '@/helpers/UA'
8
+
9
+ export type MSRPMessageEventType = {
10
+ message: MSRPMessage,
11
+ session: MSRPSessionExtended
12
+ }
13
+
14
+ export type ChangeVolumeEventType = {
15
+ callId: string
16
+ volume: number
17
+ }
18
+
19
+ export type readyListener = (value: boolean) => void
20
+ export type connectionListener = (value: boolean) => void
21
+ export type reconnectionListener = (value: boolean) => void
22
+ export type changeActiveCallsListener = (event: { [key: string]: ICall }) => void
23
+ export type changeActiveMessagesListener = (event: { [key: string]: IMessage }) => void
24
+ export type TestEventListener = (event: { test: string }) => void
25
+ export type ActiveRoomListener = (event: number | undefined) => void
26
+ export type CallAddingProgressListener = (callId: string | undefined) => void
27
+ export type MSRPInitializingListener = (sessionId: string | undefined) => void
28
+ export type RoomDeletedListener = (roomId: number) => void
29
+ export type changeActiveInputMediaDeviceListener = (event: string) => void
30
+ export type changeActiveOutputMediaDeviceListener = (event: string) => void
31
+ export type changeAvailableDeviceListListener = (event: Array<MediaDeviceInfo>) => void
32
+ export type changeMuteWhenJoinListener = (value: boolean) => void
33
+ export type changeIsDNDListener = (value: boolean) => void
34
+ export type changeIsCallWaitingListener = (value: boolean) => void
35
+ export type changeIsMutedListener = (value: boolean) => void
36
+ export type changeActiveStreamListener = (value: MediaStream) => void
37
+ export type addRoomListener = (value: RoomChangeEmitType) => void
38
+ export type updateRoomListener = (value: RoomChangeEmitType) => void
39
+ export type removeRoomListener = (value: RoomChangeEmitType) => void
40
+ export type IncomingMSRPSessionListener = (event: IncomingMSRPSessionEvent) => void;
41
+ export type OutgoingMSRPSessionListener = (event: OutgoingMSRPSessionEvent) => void;
42
+ export type MSRPSessionListener = IncomingMSRPSessionListener | OutgoingMSRPSessionListener;
43
+ export type MSRPMessageListener = (event: MSRPMessageEventType) => void;
44
+ export type changeCallStatusListener = (event: { [key: string]: ICallStatus }) => void
45
+ export type changeCallTimeListener = (event: { [key: string]: ITimeData }) => void
46
+ export type changeCallMetricsListener = (event: { [key: string]: any }) => void
47
+ export type changeCallVolumeListener = (event: ChangeVolumeEventType) => void
48
+ export type conferenceStartListener = () => void
49
+ export type conferenceEndListener = (sessionId) => void
50
+ export type changeMainVideoStreamListener = (event: { name: string, event: MediaStream }) => void
51
+ export type startScreenShareListener = (event: MediaStream) => void
52
+ export type stopScreenShareListener = () => void
53
+ export type startBlurListener = () => void
54
+ export type stopBlurListener = () => void
55
+ export type memberJoinListener = (event: object) => void
56
+ export type memberHangupListener = (event: object) => void
57
+ export type changeAudioStateListener = (state: boolean) => void
58
+ export type changeVideoStateListener = (state: boolean) => void
59
+
60
+ export interface OpenSIPSEventMap extends UAEventMap {
61
+ ready: readyListener
62
+ connection: connectionListener
63
+ reconnecting: reconnectionListener
64
+ // JSSIP
65
+ changeActiveCalls: changeActiveCallsListener
66
+ changeActiveMessages: changeActiveMessagesListener
67
+ callConfirmed: TestEventListener
68
+ currentActiveRoomChanged: ActiveRoomListener
69
+ callAddingInProgressChanged: CallAddingProgressListener
70
+ isMSRPInitializingChanged: MSRPInitializingListener
71
+ roomDeleted: RoomDeletedListener
72
+ changeActiveInputMediaDevice: changeActiveInputMediaDeviceListener
73
+ changeActiveOutputMediaDevice: changeActiveOutputMediaDeviceListener
74
+ changeAvailableDeviceList: changeAvailableDeviceListListener
75
+ changeMuteWhenJoin: changeMuteWhenJoinListener
76
+ changeIsDND: changeIsDNDListener
77
+ changeIsCallWaiting: changeIsCallWaitingListener
78
+ changeIsMuted: changeIsMutedListener
79
+ changeActiveStream: changeActiveStreamListener
80
+ addRoom: addRoomListener
81
+ updateRoom: updateRoomListener
82
+ removeRoom: removeRoomListener
83
+ changeCallStatus: changeCallStatusListener
84
+ changeCallTime: changeCallTimeListener
85
+ changeCallMetrics: changeCallMetricsListener
86
+ changeCallVolume: changeCallVolumeListener
87
+ newMSRPMessage: MSRPMessageListener
88
+ newMSRPSession: MSRPSessionListener
89
+ // JANUS
90
+ conferenceStart: conferenceStartListener
91
+ conferenceEnd: conferenceEndListener
92
+ startScreenShare: startScreenShareListener
93
+ stopScreenShare: stopScreenShareListener
94
+ startBlur: startBlurListener
95
+ stopBlur: stopBlurListener
96
+ memberJoin: memberJoinListener
97
+ memberHangup: memberHangupListener
98
+ changeAudioState: changeAudioStateListener
99
+ changeVideoState: changeVideoStateListener
100
+ }
101
+
102
+ export type ListenersKeyType = keyof OpenSIPSEventMap
103
+ export type ListenersCallbackFnType = OpenSIPSEventMap[ListenersKeyType]
104
+ export type ListenerCallbackFnType<T extends ListenersKeyType> = OpenSIPSEventMap[T]
@@ -0,0 +1,55 @@
1
+ import {
2
+ MSRPSession,
3
+ MSRPSessionEventMap
4
+ } from '@/lib/msrp/session'
5
+ import { EndEvent,
6
+ IncomingAckEvent,
7
+ IncomingEvent,
8
+ OutgoingAckEvent,
9
+ OutgoingEvent,
10
+ SessionDirection } from 'jssip/lib/RTCSession'
11
+
12
+ import { StreamMediaType } from '@/types/rtc'
13
+ import MSRPMessage from '@/lib/msrp/message'
14
+
15
+ export { MSRPMessage }
16
+
17
+ export type ListenerEventType = EndEvent | IncomingEvent | OutgoingEvent | IncomingAckEvent | OutgoingAckEvent
18
+
19
+ export interface IMessage extends MSRPSessionExtended {
20
+ roomId?: number
21
+ localMuted?: boolean
22
+ localHold?: boolean
23
+ audioTag?: StreamMediaType
24
+ terminate(): void
25
+ }
26
+
27
+
28
+ export interface MSRPSessionExtended extends MSRPSession {
29
+ id: string
30
+ status: string
31
+ start_time: Date
32
+ direction: SessionDirection
33
+ _id: string
34
+ _cancel_reason: string
35
+ _contact: string
36
+ _end_time: Date
37
+ _eventsCount: number
38
+ _from_tag: string
39
+ _is_canceled: boolean
40
+ _is_confirmed: boolean
41
+ _late_sdp: string
42
+ _status: number
43
+ _remote_identity: string
44
+ target_addr: Array<string>
45
+ answer(options?: any): void
46
+ _init_incomeing(): void
47
+ sendMSRP(body: string): void
48
+ on<T extends keyof MSRPSessionEventMap>(type: T, listener: MSRPSessionEventMap[T]): this;
49
+ }
50
+
51
+ export interface TriggerMSRPListenerOptions {
52
+ listenerType: string
53
+ session: MSRPSessionExtended
54
+ event?: ListenerEventType
55
+ }
@@ -0,0 +1,179 @@
1
+ import {
2
+ AnswerOptions,
3
+ EndEvent,
4
+ IncomingAckEvent,
5
+ IncomingEvent,
6
+ OutgoingAckEvent,
7
+ OutgoingEvent,
8
+ RTCSession,
9
+ RTCSessionEventMap,
10
+ MediaConstraints
11
+ } from 'jssip/lib/RTCSession'
12
+ import {
13
+ IncomingRequest
14
+ } from 'jssip/lib/SIPMessage'
15
+ import { UAConfiguration } from 'jssip/lib/UA'
16
+
17
+ import { MODULES } from '@/enum/modules'
18
+
19
+ import { ExtraContactParams } from 'jssip/lib/Registrator'
20
+
21
+ export type IntervalType = ReturnType<typeof setInterval>
22
+
23
+ export type ListenerEventType = EndEvent | IncomingEvent | OutgoingEvent | IncomingAckEvent | OutgoingAckEvent
24
+
25
+ export type RTCBundlePolicy = 'balanced' | 'max-bundle' | 'max-compat'
26
+ export type RTCIceTransportPolicy = 'all' | 'relay'
27
+ export type RTCRtcpMuxPolicy = 'require'
28
+
29
+ export interface RTCIceServer {
30
+ credential?: string;
31
+ urls: string | string[];
32
+ username?: string;
33
+ }
34
+
35
+ export interface RTCConfiguration {
36
+ bundlePolicy?: RTCBundlePolicy;
37
+ certificates?: RTCCertificate[];
38
+ iceCandidatePoolSize?: number;
39
+ iceServers?: RTCIceServer[];
40
+ iceTransportPolicy?: RTCIceTransportPolicy;
41
+ rtcpMuxPolicy?: RTCRtcpMuxPolicy;
42
+ }
43
+
44
+ export interface StreamMediaType extends HTMLAudioElement {
45
+ className: string
46
+ setSinkId (id: string): Promise<void>
47
+ }
48
+
49
+ type ExactConstraints = {
50
+ audio?: {
51
+ deviceId: {exact: string}
52
+ }
53
+ video?: boolean;
54
+ }
55
+
56
+ export interface AnswerOptionsExtended extends AnswerOptions {
57
+ mediaConstraints?: MediaConstraints | ExactConstraints
58
+ }
59
+
60
+ export interface RemoteIdentityCallType {
61
+ _display_name: string
62
+ _uri: {
63
+ _user: string
64
+ }
65
+ }
66
+
67
+ export interface RTCSessionExtended extends RTCSession {
68
+ id: string
69
+ _automaticHold: boolean
70
+ _id: string
71
+ _localHold: boolean
72
+ _audioMuted: boolean
73
+ _cancel_reason: string
74
+ _contact: string
75
+ _end_time: Date
76
+ _eventsCount: number
77
+ _from_tag: string
78
+ _is_canceled: boolean
79
+ _is_confirmed: boolean
80
+ _late_sdp: string
81
+ _videoMuted: boolean
82
+ _status: number
83
+ _remote_identity: RemoteIdentityCallType
84
+ answer(options?: AnswerOptionsExtended): void
85
+ init_icncoming(request: IncomingRequest): void
86
+ }
87
+
88
+ export interface ICall extends RTCSessionExtended {
89
+ roomId?: number
90
+ localMuted?: boolean
91
+ localHold?: boolean
92
+ audioTag?: StreamMediaType
93
+ autoAnswer?: boolean
94
+ putOnHoldTimestamp?: number
95
+ }
96
+
97
+ export type RoomChangeEmitType = {
98
+ room: IRoom
99
+ roomList: { [key: number]: IRoom }
100
+ }
101
+
102
+ export interface MediaEvent extends Event {
103
+ stream: MediaStream
104
+ }
105
+
106
+ export interface IRoom {
107
+ started: Date
108
+ incomingInProgress: boolean
109
+ roomId: number
110
+ }
111
+
112
+ export interface ICallStatus {
113
+ isMoving: boolean
114
+ isTransferring: boolean
115
+ isMerging: boolean
116
+ isTransferred: boolean
117
+ }
118
+
119
+ export interface ICallStatusUpdate {
120
+ callId: string
121
+ isMoving?: boolean
122
+ isTransferring?: boolean
123
+ isMerging?: boolean
124
+ isTransferred?: boolean
125
+ }
126
+
127
+ export type IRoomUpdate = Omit<IRoom, 'started'> & {
128
+ started?: Date
129
+ }
130
+
131
+ export type AudioModuleName = typeof MODULES.AUDIO
132
+ export type VideoModuleName = typeof MODULES.VIDEO
133
+ export type MSRPModuleName = typeof MODULES.MSRP
134
+
135
+ export type Modules = AudioModuleName | VideoModuleName | MSRPModuleName
136
+
137
+ export type OnTransportCallback = (parsed: object, message: string) => void
138
+
139
+ type UAConfigurationExtended = UAConfiguration & {
140
+ overrideUserAgent?: (userAgent: string) => string
141
+ onTransportCallback?: OnTransportCallback
142
+ }
143
+
144
+ export type IOpenSIPSConfiguration = Omit<UAConfigurationExtended, 'sockets'>
145
+
146
+ export interface IOpenSIPSJSOptions {
147
+ configuration: IOpenSIPSConfiguration
148
+ socketInterfaces: [ string ]
149
+ sipDomain: string
150
+ sipOptions: {
151
+ session_timers: boolean
152
+ extraHeaders: [ string ]
153
+ pcConfig: RTCConfiguration
154
+ },
155
+ modules: Array<Modules>
156
+ pnExtraHeaders?: ExtraContactParams
157
+ }
158
+
159
+ export interface TriggerListenerOptions {
160
+ listenerType: string
161
+ session: RTCSessionExtended
162
+ event?: ListenerEventType
163
+ }
164
+ type CommonLogMethodType = (...args: unknown[]) => void
165
+
166
+ export interface CustomLoggerType {
167
+ log: CommonLogMethodType
168
+ warn: CommonLogMethodType
169
+ error: CommonLogMethodType
170
+ debug: CommonLogMethodType
171
+ }
172
+
173
+ /* UA */
174
+ export interface CallOptionsExtended extends AnswerOptionsExtended {
175
+ eventHandlers?: Partial<RTCSessionEventMap>;
176
+ anonymous?: boolean;
177
+ fromUserName?: string;
178
+ fromDisplayName?: string;
179
+ }
@@ -0,0 +1,13 @@
1
+ export interface ITimeData {
2
+ callId: string
3
+ hours: number
4
+ minutes: number
5
+ seconds: number
6
+ formatted: string
7
+ }
8
+
9
+ export type TempTimeData = Omit<ITimeData, 'callId'> & {
10
+ callId: string | undefined
11
+ }
12
+
13
+ export type CallTime = Record<string, TempTimeData>
@@ -0,0 +1,64 @@
1
+ export interface WebrtcMetricsConfigType {
2
+ refreshEvery?: number
3
+ startAfter?: number
4
+ stopAfter?: number
5
+ verbose?: boolean
6
+ pname?: string
7
+ cid?: string
8
+ uid?: string
9
+ record?: boolean
10
+ ticket?: boolean
11
+ }
12
+
13
+ export type ProbeDirectionType = 'inbound' | 'outbound'
14
+
15
+ export interface ProbeMetricInType {
16
+ level_in: number
17
+ codec_id_in: string
18
+ codec_in: { mime_type: null | number, clock_rate: null | number, sdp_fmtp_line: null | number }
19
+ delta_jitter_ms_in: number
20
+ percent_packets_lost_in: number
21
+ delta_packets_in: number
22
+ delta_packets_lost_in: number
23
+ total_packets_in: number
24
+ total_packets_lost_in: number
25
+ total_KBytes_in: number
26
+ delta_KBytes_in: number
27
+ delta_kbs_in: number,
28
+ mos_in: number
29
+ mos_emodel_in: number
30
+ ssrc: string
31
+ direction: ProbeDirectionType
32
+ }
33
+ export interface ProbeMetricOutType {
34
+ level_out: number
35
+ codec_id_out: string
36
+ codec_out: { mime_type: null | number, clock_rate: null | number, sdp_fmtp_line: null | number }
37
+ delta_jitter_ms_out: number
38
+ delta_rtt_ms_out: null | number
39
+ total_rtt_ms_out: number
40
+ total_rtt_measure_out: number
41
+ percent_packets_lost_out: number
42
+ delta_packets_out: number
43
+ delta_packets_lost_out: number
44
+ total_packets_out: number
45
+ total_packets_lost_out: number
46
+ total_KBytes_out: number
47
+ delta_KBytes_out: number
48
+ delta_kbs_out: number
49
+ timestamp_out: null | number
50
+ mos_out: number
51
+ mos_emodel_out: number
52
+ ssrc: string
53
+ direction: ProbeDirectionType
54
+ }
55
+
56
+ export interface Probe {
57
+ audio: { [key: string]: ProbeMetricInType | ProbeMetricOutType }
58
+ }
59
+
60
+ interface MetricAudioData extends ProbeMetricInType {
61
+ callId?: string
62
+ }
63
+
64
+ export type MediaDeviceType = 'input' | 'output'