@voicenter-team/opensips-js 1.0.96 → 1.0.98

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/README.md CHANGED
@@ -8,12 +8,22 @@ navigation:
8
8
  # Getting started
9
9
 
10
10
  ## Installation
11
- Using npm:
11
+ ### Using npm:
12
12
  ```shell[Terminal]
13
13
  $ npm i @voicenter-team/opensips-js
14
14
  ```
15
15
 
16
+ ### Using via CDN:
17
+ You can include the OpensipsJS library directly in your HTML file using a CDN like UNPKG or jsDelivr. This is especially useful for quick prototyping or when you don't want to set up a build environment.
18
+
19
+ Add the following script tag to your HTML file:
20
+ ```html [index.html]
21
+ <script src="https://cdn.opensipsjs.org/opensipsjs/v1.0.96/opensips-js.iife.js"></script>
22
+ ```
23
+ This will load the library and attach the OpensipsJS class to the global window object as OpensipsJS.
24
+
16
25
  ## Usage
26
+ ### Using npm (ES Modules):
17
27
  Firstly lets import the library and create the OpenSIPS instance:
18
28
  ```javascript [file.js]
19
29
  import OpenSIPSJS from '@voicenter-team/opensips-js'
@@ -41,15 +51,112 @@ const openSIPSJS = new OpenSIPSJS({
41
51
  },
42
52
  modules: [ 'audio', 'video', 'msrp' ]
43
53
  })
54
+
55
+ // Then you can work with the appropriate modules
56
+ opensipsJS.audio
57
+ opensipsJS.video
58
+ opensipsJS.msrp
44
59
  ```
45
60
 
46
- Then you can work with appropriate modules:
47
- ```javascript [file.js]
48
- openSIPSJS.audio
49
- openSIPSJS.video
50
- openSIPSJS.msrp
61
+ ### Using via CDN:
62
+ After including the script via CDN, you can access the OpensipsJS class directly from the global scope.
63
+ ```html [index.html]
64
+ <!DOCTYPE html>
65
+ <html>
66
+ <head>
67
+ <title>OpensipsJS CDN Usage</title>
68
+ </head>
69
+ <body>
70
+ <!-- Include the library via CDN -->
71
+ <script src="https://cdn.opensipsjs.org/opensipsjs/v1.0.96/opensips-js.iife.js"></script>
72
+
73
+ <script>
74
+ // Create an instance of OpensipsJS
75
+ const opensipsJS = new OpensipsJS({
76
+ configuration: {
77
+ session_timers: false,
78
+ uri: 'sip:extension_user@domain',
79
+ // --- Use password or authorization_jwt to authorize
80
+ password: 'password',
81
+ // or
82
+ authorization_jwt: 'token',
83
+ },
84
+ socketInterfaces: ['wss://domain'],
85
+ pnExtraHeaders: {
86
+ 'pn-provider': 'acme',
87
+ 'pn-param': 'acme-param',
88
+ 'pn-prid': 'ZH11Y4ZDJlMNzODE1NgKi0K>',
89
+ },
90
+ sipDomain: 'domain',
91
+ sipOptions: {
92
+ session_timers: false,
93
+ extraHeaders: ['X-Bar: bar'],
94
+ pcConfig: {},
95
+ },
96
+ modules: ['audio', 'video', 'msrp'],
97
+ });
98
+
99
+ // Now you can use the modules
100
+ opensipsJS.audio;
101
+ opensipsJS.video;
102
+ opensipsJS.msrp;
103
+ </script>
104
+ </body>
105
+ </html>
106
+ ```
107
+ Note: When using the library via CDN, ensure that you replace 'sip:extension_user@domain', 'password', 'token', and other placeholders with your actual configuration values.
108
+
109
+ ### Using ES Modules via CDN:
110
+ If you prefer using ES modules in the browser and your environment supports them, you can import the ES module build directly from the CDN.
111
+ ```html [index.html]
112
+ <!DOCTYPE html>
113
+ <html>
114
+ <head>
115
+ <title>OpensipsJS ES Module CDN Usage</title>
116
+ </head>
117
+ <body>
118
+ <script type="module">
119
+ import OpensipsJS from 'https://cdn.opensipsjs.org/opensipsjs/v1.0.96/opensips-js.es.js';
120
+ // Or using jsDelivr
121
+ // import OpensipsJS from 'https://cdn.jsdelivr.net/npm/@voicenter-team/opensips-js/dist/opensips-js.es.js';
122
+
123
+ const opensipsJS = new OpensipsJS({
124
+ configuration: {
125
+ session_timers: false,
126
+ uri: 'sip:extension_user@domain',
127
+ // --- Use password or authorization_jwt to authorize
128
+ password: 'password',
129
+ // or
130
+ authorization_jwt: 'token',
131
+ },
132
+ socketInterfaces: ['wss://domain'],
133
+ pnExtraHeaders: {
134
+ 'pn-provider': 'acme',
135
+ 'pn-param': 'acme-param',
136
+ 'pn-prid': 'ZH11Y4ZDJlMNzODE1NgKi0K>',
137
+ },
138
+ sipDomain: 'domain',
139
+ sipOptions: {
140
+ session_timers: false,
141
+ extraHeaders: ['X-Bar: bar'],
142
+ pcConfig: {},
143
+ },
144
+ modules: ['audio', 'video', 'msrp'],
145
+ });
146
+
147
+ // Use the modules as before
148
+ opensipsJS.audio;
149
+ opensipsJS.video;
150
+ opensipsJS.msrp;
151
+ </script>
152
+ </body>
153
+ </html>
51
154
  ```
52
155
 
156
+ **Important**: When using ES modules via CDN:
157
+ * Ensure your browser supports ES modules.
158
+ * The `type="module"` attribute is necessary in the `<script>` tag.
159
+
53
160
  ## OpensipsJS
54
161
  ### OpensipsJS instance methods
55
162
  - `begin(): OpensipsInstance` - start opensips
@@ -59,35 +166,35 @@ openSIPSJS.msrp
59
166
 
60
167
  ### OpensipsJS events
61
168
 
62
- | Event | Callback interface | Description |
63
- |----------------|---------|---------------|
64
- | `ready` | `() => {}` | Emitted when opensips is initialized |
65
- | `changeActiveCalls` | `(calls: { [key: string]: ICall }) => {}` | Emitted when active calls are changed |
66
- | `callAddingInProgressChanged` | `(callId: string / undefined) => {}` | Emitted when any call adding state is changed |
67
- | `changeAvailableDeviceList` | `(devices: Array<MediaDeviceInfo>) => {}` | Emitted when the list of available devices is changed |
68
- | `changeActiveInputMediaDevice` | `(deviceId: string) => {}` | Emitted when active input device is changed |
69
- | `changeActiveOutputMediaDevice` | `(deviceId: string) => {}` | Emitted when active output device is changed |
70
- | `changeMuteWhenJoin` | `(value: boolean) => {}` | Emitted when mute on join value is changed |
71
- | `changeIsDND` | `(value: boolean) => {}` | Emitted when is DND value is changed |
72
- | `changeIsMuted` | `(value: boolean) => {}` | Emitted when mute value is changed |
73
- | `changeActiveStream` | `(stream: MediaStream) => {}` | Emitted when active stream was changed |
74
- | `changeCallVolume` | `(callId: string, volume: number) => {}` | Emits the volume meter's value for each participant |
75
- | `currentActiveRoomChanged` | `(number / undefined) => {}` | Emitted when active room is changed |
76
- | `addRoom` | `({room: IRoom, roomList: {[id: number]: IRoom}}) => {}` | Emitted when new room was added |
77
- | `updateRoom` | `({room: IRoom, roomList: {[id: number]: IRoom}}) => {}` | Emitted when room was updated |
78
- | `removeRoom` | `({room: IRoom, roomList: {[p: number]: IRoom}}) => {}` | Emitted when room was deleted |
169
+ | Event | Callback interface | Description |
170
+ |---------------------------------|----------------------------------------------------------|-------------------------------------------------------|
171
+ | `ready` | `() => {}` | Emitted when opensips is initialized |
172
+ | `changeActiveCalls` | `(calls: { [key: string]: ICall }) => {}` | Emitted when active calls are changed |
173
+ | `callAddingInProgressChanged` | `(callId: string / undefined) => {}` | Emitted when any call adding state is changed |
174
+ | `changeAvailableDeviceList` | `(devices: Array<MediaDeviceInfo>) => {}` | Emitted when the list of available devices is changed |
175
+ | `changeActiveInputMediaDevice` | `(deviceId: string) => {}` | Emitted when active input device is changed |
176
+ | `changeActiveOutputMediaDevice` | `(deviceId: string) => {}` | Emitted when active output device is changed |
177
+ | `changeMuteWhenJoin` | `(value: boolean) => {}` | Emitted when mute on join value is changed |
178
+ | `changeIsDND` | `(value: boolean) => {}` | Emitted when is DND value is changed |
179
+ | `changeIsMuted` | `(value: boolean) => {}` | Emitted when mute value is changed |
180
+ | `changeActiveStream` | `(stream: MediaStream) => {}` | Emitted when active stream was changed |
181
+ | `changeCallVolume` | `(callId: string, volume: number) => {}` | Emits the volume meter's value for each participant |
182
+ | `currentActiveRoomChanged` | `(number / undefined) => {}` | Emitted when active room is changed |
183
+ | `addRoom` | `({room: IRoom, roomList: {[id: number]: IRoom}}) => {}` | Emitted when new room was added |
184
+ | `updateRoom` | `({room: IRoom, roomList: {[id: number]: IRoom}}) => {}` | Emitted when room was updated |
185
+ | `removeRoom` | `({room: IRoom, roomList: {[p: number]: IRoom}}) => {}` | Emitted when room was deleted |
79
186
 
80
187
  WebrtcMetricsConfigType
81
188
 
82
- | Parameter | Type | Default |
83
- |----------------|-----------|----------|
84
- | `refreshEvery` | `number` | `undefined` |
85
- | `startAfter` | `number` | `undefined` |
86
- | `startAfter` | `number` | `undefined` |
189
+ | Parameter | Type | Default |
190
+ |----------------|-----------|-------------|
191
+ | `refreshEvery` | `number` | `undefined` |
192
+ | `startAfter` | `number` | `undefined` |
193
+ | `startAfter` | `number` | `undefined` |
87
194
  | `verbose` | `boolean` | `undefined` |
88
- | `pname` | `string` | `undefined` |
89
- | `cid` | `string` | `undefined` |
90
- | `uid` | `string` | `undefined` |
195
+ | `pname` | `string` | `undefined` |
196
+ | `cid` | `string` | `undefined` |
197
+ | `uid` | `string` | `undefined` |
91
198
  | `record` | `boolean` | `undefined` |
92
199
  | `ticket` | `boolean` | `undefined` |
93
200
 
@@ -170,41 +277,41 @@ Also, there are next public fields on OpensipsJS instance:
170
277
 
171
278
  VisualizationConfigType
172
279
 
173
- | Parameter | Type | Default |
174
- |----------------|------------------------|---------|
175
- | `foregroundThreshold` | `number` | `0.5` |
176
- | `maskOpacity` | `number`| `0.5` |
177
- | `maskBlur` | `number`| `0` |
178
- | `pixelCellWidth` | `number`| `10` |
179
- | `backgroundBlur` | `number`| `15` |
180
- | `edgeBlur` | `number`| `3` |
280
+ | Parameter | Type | Default |
281
+ |-----------------------|----------|---------|
282
+ | `foregroundThreshold` | `number` | `0.5` |
283
+ | `maskOpacity` | `number` | `0.5` |
284
+ | `maskBlur` | `number` | `0` |
285
+ | `pixelCellWidth` | `number` | `10` |
286
+ | `backgroundBlur` | `number` | `15` |
287
+ | `edgeBlur` | `number` | `3` |
181
288
 
182
289
  KonvaDrawerOptions
183
290
 
184
- | Parameter | Type |
185
- |----------------|-----------|
291
+ | Parameter | Type |
292
+ |-------------|----------|
186
293
  | `container` | `number` |
187
- | `width` | `number` |
188
- | `height` | `number` |
294
+ | `width` | `number` |
295
+ | `height` | `number` |
189
296
 
190
297
  KonvaScreenShareDrawerOptions
191
298
 
192
- | Parameter | Type |
193
- |----------------|-----------|
299
+ | Parameter | Type |
300
+ |---------------|----------|
194
301
  | `strokeWidth` | `number` |
195
- | `strokeColor` | `string` |
302
+ | `strokeColor` | `string` |
196
303
 
197
304
  ### Video events
198
305
 
199
- | Event | Callback interface | Description |
200
- |----------------|---------|---------------|
201
- | `member:join` | `(data) => {}` | Emitted when new member is joined |
202
- | `member:update` | `(data) => {}` | Emitted when member data is changed |
203
- | `member:hangup` | `(data) => {}` | Emitted when member leaves the conference |
204
- | `hangup` | `() => {}` | Emitted when we leave the conference |
205
- | `screenShare:start` | `() => {}` | Emitted when we share a screen |
206
- | `screenShare:stop` | `() => {}` | Emitted when we stop a screen sharing |
207
- | `reconnect` | `() => {}` | Emitted when reconnecting |
208
- | `mediaConstraintsChange` | `() => {}` | Emitted when media constraints change |
209
- | `metrics:report` | `() => {}` | Emitted on metric report |
210
- | `metrics:stop` | `() => {}` | Emitted when metrics are stopped |
306
+ | Event | Callback interface | Description |
307
+ |--------------------------|--------------------|-------------------------------------------|
308
+ | `member:join` | `(data) => {}` | Emitted when new member is joined |
309
+ | `member:update` | `(data) => {}` | Emitted when member data is changed |
310
+ | `member:hangup` | `(data) => {}` | Emitted when member leaves the conference |
311
+ | `hangup` | `() => {}` | Emitted when we leave the conference |
312
+ | `screenShare:start` | `() => {}` | Emitted when we share a screen |
313
+ | `screenShare:stop` | `() => {}` | Emitted when we stop a screen sharing |
314
+ | `reconnect` | `() => {}` | Emitted when reconnecting |
315
+ | `mediaConstraintsChange` | `() => {}` | Emitted when media constraints change |
316
+ | `metrics:report` | `() => {}` | Emitted on metric report |
317
+ | `metrics:stop` | `() => {}` | Emitted when metrics are stopped |
package/dist/index.d.ts CHANGED
@@ -191,6 +191,62 @@ declare class AudioModule {
191
191
 
192
192
  declare type AudioModuleName = typeof MODULES.AUDIO
193
193
 
194
+ export declare class BaseNewStreamPlugin extends BasePlugin {
195
+ private _candidates;
196
+ private _subscribeSent;
197
+ private _configureSent;
198
+ private _lastTrickleReceived;
199
+ private _publisherSubscribeSent;
200
+ private opaqueId;
201
+ private handleId;
202
+ private readonly type;
203
+ protected _connection: RTCPeerConnection;
204
+ protected jsep_offer: RTCSessionDescription | void;
205
+ protected _request: unknown;
206
+ stream: MediaStream;
207
+ constructor(name: any, type: any);
208
+ connect(options?: ConnectOptions): void;
209
+ getStream(): MediaStream;
210
+ getConnection(): RTCPeerConnection;
211
+ private _createRTCConnection;
212
+ private addTracks;
213
+ private _sendInitialRequest;
214
+ private _receiveInviteResponse;
215
+ private _sendConfigureMessage;
216
+ private _sendDetach;
217
+ protected stopMedia(): Promise<void>;
218
+ stop(): Promise<void>;
219
+ generateStream(): Promise<void>;
220
+ }
221
+
222
+ declare class BasePlugin {
223
+ opensips: any;
224
+ session: any;
225
+ name: string;
226
+ constructor(name: any);
227
+ setOpensips(opensips: any): void;
228
+ setSession(session: any): void;
229
+ kill(): void;
230
+ }
231
+
232
+ export declare class BaseProcessStreamPlugin extends BasePlugin {
233
+ stream: any;
234
+ running: boolean;
235
+ immediate: boolean;
236
+ type: string;
237
+ constructor(name: any, type: any, options?: BaseProcessStreamPluginOptions);
238
+ start(stream: any): any;
239
+ stop(): void;
240
+ process(stream: any): Promise<any>;
241
+ connect(): Promise<void>;
242
+ terminate(): void;
243
+ kill(): Promise<void>;
244
+ }
245
+
246
+ declare interface BaseProcessStreamPluginOptions {
247
+ immediate?: boolean;
248
+ }
249
+
194
250
  declare type CallAddingProgressListener = (callId: string | undefined) => void
195
251
 
196
252
  declare interface CallOptionsExtended extends AnswerOptionsExtended {
@@ -233,8 +289,6 @@ declare type changeIsDNDListener = (value: boolean) => void
233
289
 
234
290
  declare type changeIsMutedListener = (value: boolean) => void
235
291
 
236
- declare type changeMainVideoStreamListener = (event: { name: string, event: MediaStream }) => void
237
-
238
292
  declare type changeMuteWhenJoinListener = (value: boolean) => void
239
293
 
240
294
  declare type changeVideoStateListener = (state: boolean) => void
@@ -250,6 +304,14 @@ declare type conferenceStartListener = () => void
250
304
 
251
305
  declare type connectionListener = (value: boolean) => void
252
306
 
307
+ declare interface ConnectOptions {
308
+ extraHeaders?: Array<string>;
309
+ fromUserName?: string;
310
+ fromDisplayName?: string;
311
+ rtcConstraints?: object;
312
+ pcConfig?: object;
313
+ }
314
+
253
315
  declare interface CustomLoggerType {
254
316
  log: CommonLogMethodType
255
317
  warn: CommonLogMethodType
@@ -301,7 +363,7 @@ declare interface IncomingMSRPSessionEvent {
301
363
 
302
364
  declare type IncomingMSRPSessionListener = (event: IncomingMSRPSessionEvent) => void;
303
365
 
304
- declare type IOpenSIPSConfiguration = Omit<UAConfiguration, 'sockets'>
366
+ declare type IOpenSIPSConfiguration = Omit<UAConfigurationExtended, 'sockets'>
305
367
 
306
368
  declare interface IOpenSIPSJSOptions {
307
369
  configuration: IOpenSIPSConfiguration
@@ -660,7 +722,10 @@ declare interface OpenSIPSEventMap extends UAEventMap {
660
722
  newMSRPSession: MSRPSessionListener
661
723
  // JANUS
662
724
  conferenceStart: conferenceStartListener
663
- changeMainVideoStream: changeMainVideoStreamListener
725
+ startScreenShare: startScreenShareListener
726
+ stopScreenShare: stopScreenShareListener
727
+ startBlur: startBlurListener
728
+ stopBlur: stopBlurListener
664
729
  memberJoin: memberJoinListener
665
730
  memberHangup: memberHangupListener
666
731
  changeAudioState: changeAudioStateListener
@@ -680,6 +745,7 @@ declare class OpenSIPSJS extends UAExtended {
680
745
  private readonly newMSRPSessionEventName;
681
746
  private isMSRPInitializingValue;
682
747
  private isReconnecting;
748
+ private activeConnection;
683
749
  audio: AudioModule;
684
750
  msrp: MSRPModule;
685
751
  video: VideoModule;
@@ -690,7 +756,10 @@ declare class OpenSIPSJS extends UAExtended {
690
756
  off<T extends ListenersKeyType>(type: T, listener: ListenerCallbackFnType<T>): this;
691
757
  emit(type: ListenersKeyType, args: any): boolean;
692
758
  get sipDomain(): string;
759
+ use(plugin: BaseNewStreamPlugin | BaseProcessStreamPlugin): void;
760
+ getPlugin(name: string): BaseNewStreamPlugin | BaseProcessStreamPlugin;
693
761
  begin(): this;
762
+ disconnect(): void;
694
763
  subscribe(type: string, listener: (c: RTCSessionExtended) => void): void;
695
764
  removeIListener(value: string): void;
696
765
  triggerListener({ listenerType, session, event }: TriggerListenerOptions): void;
@@ -767,6 +836,14 @@ declare interface RTCSessionExtended extends RTCSession {
767
836
  init_icncoming(request: IncomingRequest): void
768
837
  }
769
838
 
839
+ declare type startBlurListener = () => void
840
+
841
+ declare type startScreenShareListener = (event: MediaStream) => void
842
+
843
+ declare type stopBlurListener = () => void
844
+
845
+ declare type stopScreenShareListener = () => void
846
+
770
847
  declare interface StreamMediaType extends HTMLAudioElement {
771
848
  className: string
772
849
  setSinkId (id: string): Promise<void>
@@ -780,6 +857,10 @@ declare interface TriggerListenerOptions {
780
857
  event?: ListenerEventType
781
858
  }
782
859
 
860
+ declare type UAConfigurationExtended = UAConfiguration & {
861
+ overrideUserAgent: (userAgent: string) => string
862
+ }
863
+
783
864
  declare const UAConstructor: typeof UA;
784
865
 
785
866
  declare class UAExtended extends UAConstructor implements UAExtendedInterface {
@@ -791,15 +872,21 @@ declare class UAExtended extends UAConstructor implements UAExtendedInterface {
791
872
  ict: {};
792
873
  };
793
874
  _janus_sessions: any[];
875
+ protected newStreamPlugins: Array<BaseNewStreamPlugin>;
876
+ protected processStreamPlugins: Array<BaseProcessStreamPlugin>;
794
877
  constructor(configuration: UAConfiguration);
795
878
  call(target: string, options?: CallOptionsExtended): RTCSession;
796
879
  joinVideoCall(target: any, displayName: any, options: any): any;
880
+ startScreenShare(): void;
881
+ startBlur(): void;
882
+ stopBlur(): void;
797
883
  _loadConfig(configuration: any): void;
798
884
  /**
799
885
  * new MSRPSession
800
886
  */
801
887
  newMSRPSession(session: MSRPSession, data: object): void;
802
888
  newJanusSession(session: any, data: any): void;
889
+ kill(): void;
803
890
  /**
804
891
  * MSRPSession destroyed.
805
892
  */
@@ -863,6 +950,9 @@ declare class VideoModule {
863
950
  stopAudio(): void;
864
951
  startVideo(): void;
865
952
  stopVideo(): void;
953
+ startScreenShare(): void;
954
+ startBlur(): void;
955
+ stopBlur(): void;
866
956
  }
867
957
 
868
958
  declare type VideoModuleName = typeof MODULES.VIDEO