@audc/rtpengine-client 0.5.1 → 0.5.3

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
@@ -51,7 +51,9 @@ client.on('listening', () => {
51
51
  ```
52
52
 
53
53
  ## Making requests
54
- The ng request verbs (`ping`, `offer`, `answer`, `delete`, `query`, `start recording`, `stop recording`, `block DTMF`, `unblock DTMF`, `block media`, `unblock media`) are available as methods on the `client` object. The sytax for each is the same:
54
+ The ng request verbs (`ping`, `offer`, `answer`, `delete`, `query`, `start recording`, `stop recording`,
55
+ `pause recording`, `block DTMF`, `unblock DTMF`, `block media`, `unblock media`)
56
+ are available as methods on the `client` object. The sytax for each is the same:
55
57
  + the destination of the request comes first, either as `port, host` or `{port, host}`
56
58
  + following that, if any options are required for the request, those come next in an object.
57
59
 
@@ -68,6 +70,7 @@ Function names are as follows:
68
70
  |query | query |
69
71
  |start recording | startRecording |
70
72
  |stop recording | stopRecording |
73
+ |pause recording | pauseRecording |
71
74
  |block DTMF | blockDTMF |
72
75
  |unblock DTMF | unblockDTMF |
73
76
  |play DTMF | playDTMF |
@@ -105,4 +108,4 @@ client.offer({port: 22222, host: '35.195.250.243}, {
105
108
  'call-id': ..
106
109
  'from-tag': ..
107
110
  }) // ...etc
108
- ```
111
+ ```
package/index.d.ts ADDED
@@ -0,0 +1,382 @@
1
+ import { EventEmitter } from 'events';
2
+ import { Socket as UdpSocket } from 'dgram';
3
+ import { Socket as TcpSocket } from 'net';
4
+ import { WebSocket } from 'ws';
5
+
6
+ interface BaseClientOptions {
7
+ timeout?: number;
8
+ }
9
+
10
+ export interface ClientOptions extends BaseClientOptions {
11
+ type?: 'udp';
12
+ localAddress?: string;
13
+ localPort?: number;
14
+ rejectOnError?: boolean;
15
+ }
16
+
17
+ export interface WsClientOptions extends BaseClientOptions {
18
+ type?: 'websocket';
19
+ url: string;
20
+ }
21
+
22
+ export interface TcpClientOptions extends BaseClientOptions {
23
+ type?: 'tcp';
24
+ hostport: string;
25
+ }
26
+
27
+ export interface InternalMessage {
28
+ id: string;
29
+ data: {
30
+ command: string;
31
+ };
32
+ }
33
+
34
+ export interface HostAndPort {
35
+ host: string;
36
+ port: number;
37
+ }
38
+
39
+ // Basic common types that are reused across messages
40
+ type NgBoolean = 'yes' | 'no' | 'on' | 'off';
41
+ type StringList = string | string[];
42
+
43
+ type MediaFlags = 'initialized' |
44
+ 'asymmetric' |
45
+ 'send' |
46
+ 'recv' |
47
+ 'rtcp-mux' |
48
+ 'DTLS-SRTP' |
49
+ 'DTLS role active' |
50
+ 'DTLS role passive' |
51
+ 'SDES' |
52
+ 'passthrough' |
53
+ 'ICE' |
54
+ 'trickle ICE' |
55
+ 'ICE controlling' |
56
+ 'ICE-lite peer' |
57
+ 'ICE-lite self' |
58
+ 'unidirectional' |
59
+ 'loop check' |
60
+ 'generator/sink' |
61
+ 'ptime-override' |
62
+ 'RTCP feedback' |
63
+ 'RTCP generator' |
64
+ 'echo' |
65
+ 'blackhole' |
66
+ 'SDES reordered' |
67
+ 'audio player' |
68
+ 'legacy OSRTP' |
69
+ 'reverse legacy OSRTP' |
70
+ 'transcoding' |
71
+ 'block egress';
72
+
73
+ interface PingResult {
74
+ result: 'pong'
75
+ }
76
+
77
+ interface BaseArgs {
78
+ flags?: StringList;
79
+ }
80
+
81
+ export interface OfferArgs extends BaseArgs {
82
+ sdp: string;
83
+ 'call-id': string;
84
+ 'from-tag': string;
85
+ all?: 'none' | 'all' | 'offer-answer' | 'except-offer-answer' | 'flows';
86
+ 'address family'?: 'IP4' | 'IP6';
87
+ 'audio player'?: 'default' | 'transcoding' | 'off' | 'always';
88
+ 'delay-buffer'?: number;
89
+ 'direction'?: StringList;
90
+ digit?: 'string';
91
+ 'drop-traffic'?: 'start' | 'stop';
92
+ DTLS?: 'off' | 'no' | 'disable' | 'passive' | 'active';
93
+ 'DTLS-reverse'?: 'passive' | 'active';
94
+ 'DTLS-fingerprint'?: 'SHA-1' | 'SHA-224' | 'SHA-256' | 'SHA-384' | 'SHA-512';
95
+ 'DTMF-security'?: 'drop' | 'silence' | 'tone' | 'random' | 'zero' | 'off';
96
+ 'DTMF-security-trigger'?: string;
97
+ 'DTMF-security-trigger-end'?: string;
98
+ 'DTMF-delay'?: number;
99
+ 'DTMF-log-dest'?: string;
100
+ 'endpoint-learning'?: 'off' | 'immediate' | 'delayed' | 'heuristic';
101
+ 'from-interface'?: string;
102
+ 'frequencies'?: number | number[];
103
+ 'frequency'?: number | number[];
104
+ 'from-tags'?: StringList;
105
+ 'generate RTCP'?: 'on' | 'off';
106
+ 'ICE'?: 'remove' | 'force' | 'default' | 'force-relay' | 'optional';
107
+ 'ICE-lite'?: 'forward' | 'backward' | 'both' | 'off';
108
+ 'interface'?: string;
109
+ 'label'?: string;
110
+ 'from-label'?: string;
111
+ 'media address'?: string;
112
+ 'media echo'?: 'blackhole' | 'sinkhole' | 'forward' | 'backwards' | 'both';
113
+ 'media-echo'?: 'blackhole' | 'sinkhole' | 'forward' | 'backwards' | 'both';
114
+ 'metadata'?: string;
115
+ 'OSRTP'?: 'offer' | 'offer-RFC' | 'offer-legacy' | 'accept-RFC' | 'accept-legacy' | 'accept';
116
+ 'output-destination'?: string;
117
+ 'ptime'?: number;
118
+ 'ptime-reverse'?: number;
119
+ 'received from'?: ['IP4' | 'IP6', string];
120
+ 'record call'?: 'yes' | 'no' | 'on' | 'off';
121
+ 'rtcp-mux'?: ('offer' | 'require' | 'demux' | 'accept' | 'reject')[];
122
+ 'SIP message type'?: 'SIP request' | 'SIP response';
123
+ 'SIP code'?: number;
124
+ 'template'?: string;
125
+ 'via-branch'?: string;
126
+ 'set-label'?: string;
127
+ 'SDES'?: StringList;
128
+ 'supports'?: StringList;
129
+ 'to-interface'?: string;
130
+ 'to-label'?: string;
131
+ 'TOS'?: number;
132
+ 'transport protocol'?: 'RTP/AVP' | 'RTP/AVPF' | 'RTP/SAVP' | 'RTP/SAVPF' | 'accept';
133
+ 'trigger'?: string;
134
+ 'trigger-end'?: string;
135
+ 'end trigger'?: string;
136
+ 'trigger-end-time'?: number;
137
+ 'trigger-end-digits'?: number;
138
+ 'T.38'?: ('decode' | 'force' | 'stop' | 'no-ECM' | 'no-V.17' | 'no-V.27ter' | 'no-V.29' | 'no-V.34' | 'no-IAF' | 'FEC')[];
139
+ volume?: number;
140
+ 'xmlrpc-callback'?: string;
141
+ replace?: ('force-increment-sdp-ver' | 'origin' | 'origin-full' | 'session-name' | 'SDP-version' | 'username' | 'zero-address')[];
142
+ codec?: Record<string, unknown>;
143
+ 'sdp-attr'?: Record<string, unknown>;
144
+ 'sdp-media-remove'?: StringList;
145
+ }
146
+
147
+ // Answer specific parameters
148
+ export interface AnswerArgs extends Omit<OfferArgs, 'direction'> {
149
+ 'to-tag'?: string;
150
+ }
151
+
152
+ interface BaseResponse {
153
+ result: 'ok' | 'error' | 'load limit';
154
+ }
155
+
156
+ export interface OfferResponse extends BaseResponse {
157
+ sdp: string;
158
+ }
159
+
160
+ // Delete parameters (as you provided)
161
+ export interface DeleteArgs extends BaseArgs {
162
+ 'call-id': string;
163
+ 'from-tag': string;
164
+ 'to-tag'?: string;
165
+ 'via-branch'?: string;
166
+ fatal?: boolean;
167
+ 'delete-delay'?: number;
168
+ }
169
+
170
+ // Query parameters
171
+ export interface QueryArgs extends BaseArgs {
172
+ 'call-id': string;
173
+ 'from-tag'?: string;
174
+ 'to-tag'?: string;
175
+ }
176
+
177
+ interface StreamEndpoint {
178
+ family: 'IPv4' | 'IPv6';
179
+ address: string;
180
+ port: number;
181
+ }
182
+
183
+ type StreamFlag = 'RTP' |
184
+ 'RTCP' |
185
+ 'fallback RTCP' |
186
+ 'filled' |
187
+ 'confirmed' |
188
+ 'kernelized' |
189
+ 'no kernel support' |
190
+ 'DTLS fingerprint verified' |
191
+ 'strict source address' |
192
+ 'media handover' |
193
+ 'ICE';
194
+
195
+ interface CallStats {
196
+ created: number;
197
+ tag: string;
198
+ label: string;
199
+ 'in dialogue with': string;
200
+ medias: {
201
+ index: number;
202
+ type: string;
203
+ protocol?: string;
204
+ flags: MediaFlags[];
205
+ streams: {
206
+ 'local port'?: number;
207
+ 'local address'?: string;
208
+ family?: string;
209
+ endpoint?: StreamEndpoint;
210
+ 'advertised endpoint'?: StreamEndpoint;
211
+ 'crypto suite'?: 'string';
212
+ 'last packet': number;
213
+ 'last kernel packet': number;
214
+ 'last user packet': number;
215
+ flags: StreamFlag[];
216
+ stats: {
217
+ bytes: number;
218
+ packets: number;
219
+ errors: number;
220
+ }
221
+ }[]
222
+ }[]
223
+ }
224
+
225
+ export interface QueryResponse extends BaseResponse {
226
+ created: number;
227
+ 'last signal': number;
228
+ tags: Record<string, CallStats>;
229
+ }
230
+
231
+ // List parameters
232
+ export interface ListArgs {
233
+ limit?: number;
234
+ 'call-id'?: string;
235
+ }
236
+
237
+ export interface ListResponse extends BaseResponse {
238
+ calls: string[];
239
+ }
240
+
241
+ export interface StopRecordingArgs extends BaseArgs {
242
+ 'call-id': string;
243
+ 'from-tag'?: string;
244
+ 'to-tag'?: string;
245
+ 'via-branch'?: string;
246
+ }
247
+
248
+ // Start recording parameters
249
+ export interface StartRecordingArgs extends StopRecordingArgs {
250
+ 'recording-file'?: string;
251
+ 'recording-dir'?: string;
252
+ 'recording-pattern'?: string;
253
+ }
254
+
255
+ export interface MediaOpArgs extends BaseArgs {
256
+ 'call-id': string;
257
+ 'from-tag'?: string;
258
+ 'address'?: string;
259
+ 'label'?: string;
260
+ }
261
+
262
+ // Play Media parameters
263
+ export interface PlayMediaArgs extends MediaOpArgs {
264
+ file?: string;
265
+ blob?: string;
266
+ 'db-id'?: number;
267
+ 'repeat-times'?: number;
268
+ 'repeat-duration'?: number;
269
+ 'start-pos'?: number;
270
+ }
271
+
272
+ export interface PlayMediaResponse extends BaseResponse {
273
+ duration?: number;
274
+ }
275
+
276
+ // Stop Media parameters
277
+ export interface StopMediaResponse extends BaseResponse {
278
+ 'last-frame-pos': number;
279
+ }
280
+
281
+ type DTMFDigit = number | '0' | '1' | '2' | '3' | '4' | '5' | '6' | '7' | '8' | '9' |
282
+ '*' | '#' | 'A' | 'B' | 'C' | 'D';
283
+
284
+ export interface PlayDTMFArgs extends MediaOpArgs {
285
+ code?: DTMFDigit;
286
+ digit?: DTMFDigit;
287
+ duration?: number;
288
+ volume?: number;
289
+ pause?: number;
290
+ }
291
+
292
+ export interface StatisticsResponse extends BaseResponse {
293
+ statistics: Record<string, unknown>;
294
+ }
295
+
296
+ type MediaMode = 'sendrecv' | 'sendonly' | 'recvonly' | 'inactive';
297
+
298
+ interface TagLabel {
299
+ tag: string;
300
+ index: number;
301
+ type: string;
302
+ label?: string;
303
+ mode: MediaMode;
304
+ }
305
+
306
+ interface SubscribeRequest {
307
+ sdp: string;
308
+ 'from-tag'?: string;
309
+ 'to-tag': string;
310
+ 'from-tags'?: string[];
311
+ 'tag-medias'?: Record<string, unknown>[];
312
+ 'tag-labels'?: Record<string, TagLabel>;
313
+ }
314
+
315
+ export type SubscribeRequestResponse = SubscribeRequest & BaseResponse;
316
+ export type SubscribeAnswerArgs = SubscribeRequest & BaseArgs;
317
+
318
+ export interface UnsubscribeArgs extends BaseArgs {
319
+ 'call-id': string;
320
+ 'to-tag': string;
321
+ }
322
+
323
+ // Generic base class with a fixed optional `opts` argument
324
+ declare class CommandHandler<Args extends unknown[]> extends EventEmitter {
325
+ answer(...args: [...Args, opts: AnswerArgs]): Promise<OfferResponse>;
326
+ delete(...args: [...Args, opts: DeleteArgs]): Promise<QueryResponse>;
327
+ list(...args: [...Args, opts?: ListArgs]): Promise<ListResponse>;
328
+ offer(...args: [...Args, opts: OfferArgs]): Promise<OfferResponse>;
329
+ ping(...args: [...Args]): Promise<PingResult>;
330
+ query(...args: [...Args, opts: QueryArgs]): Promise<QueryResponse>;
331
+ startRecording(...args: [...Args, opts: StartRecordingArgs]): Promise<BaseResponse>;
332
+ stopRecording(...args: [...Args, opts: StopRecordingArgs]): Promise<BaseResponse>;
333
+ pauseRecording(...args: [...Args, opts: StopRecordingArgs]): Promise<BaseResponse>;
334
+ blockDTMF(...args: [...Args, opts: MediaOpArgs]): Promise<BaseResponse>;
335
+ unblockDTMF(...args: [...Args, opts: MediaOpArgs]): Promise<BaseResponse>;
336
+ blockMedia(...args: [...Args, opts: MediaOpArgs]): Promise<BaseResponse>;
337
+ unblockMedia(...args: [...Args, opts: MediaOpArgs]): Promise<BaseResponse>;
338
+ silenceMedia(...args: [...Args, opts: MediaOpArgs]): Promise<BaseResponse>;
339
+ unsilenceMedia(...args: [...Args, opts: MediaOpArgs]): Promise<BaseResponse>;
340
+ startForwarding(...args: [...Args, opts: MediaOpArgs]): Promise<BaseResponse>;
341
+ stopForwarding(...args: [...Args, opts: MediaOpArgs]): Promise<BaseResponse>;
342
+ playMedia(...args: [...Args, opts: PlayMediaArgs]): Promise<PlayMediaResponse>;
343
+ stopMedia(...args: [...Args, opts: MediaOpArgs]): Promise<StopMediaResponse>;
344
+ playDTMF(...args: [...Args, opts: PlayDTMFArgs]): Promise<BaseResponse>;
345
+ statistics(...args: [...Args]): Promise<StatisticsResponse>;
346
+ publish(...args: [...Args, opts: OfferArgs]): Promise<OfferResponse>;
347
+ subscribeRequest(...args: [...Args, opts: MediaOpArgs]): Promise<SubscribeRequestResponse>;
348
+ subscribeAnswer(...args: [...Args, opts: SubscribeAnswerArgs]): Promise<BaseResponse>;
349
+ unsubscribe(...args: [...Args, opts: UnsubscribeArgs]): Promise<BaseResponse>;
350
+ }
351
+
352
+ declare class BaseClient<Args extends unknown[] = []> extends CommandHandler<Args> {
353
+ messages: Map<string, (err?: any) => void>;
354
+
355
+ constructor(options: BaseClientOptions);
356
+ get connectionBased(): boolean;
357
+ close(): void;
358
+ static decodeMessage(message: string): InternalMessage;
359
+ static encodeMessage(id: string, data: any): string;
360
+ }
361
+
362
+ export class Client extends BaseClient<[remote: HostAndPort] | [port: number, host: string]> {
363
+ constructor(options: ClientOptions);
364
+ constructor(port?: number, host?: string);
365
+ declare socket: UdpSocket;
366
+ }
367
+
368
+ export class WsClient extends BaseClient {
369
+ constructor(options: WsClientOptions);
370
+ constructor(url: string);
371
+ declare socket: WebSocket;
372
+ }
373
+
374
+ export class TcpClient extends BaseClient {
375
+ constructor(options: TcpClientOptions);
376
+ constructor(hostport: string);
377
+ declare socket: TcpSocket;
378
+ }
379
+
380
+ export class RtpEngineError extends Error {
381
+ constructor(message: string);
382
+ }
package/lib/constants.js CHANGED
@@ -7,6 +7,7 @@ const _commands = {
7
7
  'query': 'query',
8
8
  'startRecording': 'start recording',
9
9
  'stopRecording': 'stop recording',
10
+ 'pauseRecording': 'pause recording',
10
11
  'blockDTMF': 'block DTMF',
11
12
  'unblockDTMF': 'unblock DTMF',
12
13
  'playDTMF': 'play DTMF',
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@audc/rtpengine-client",
3
- "version": "0.5.1",
3
+ "version": "0.5.3",
4
4
  "description": "node client for rtpengine daemon",
5
5
  "main": "index.js",
6
6
  "scripts": {
@@ -11,6 +11,7 @@
11
11
  "author": "Dave Horton",
12
12
  "license": "MIT",
13
13
  "files": [
14
+ "index.d.ts",
14
15
  "index.js",
15
16
  "lib/"
16
17
  ],