sip-lab 1.13.0 → 1.14.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.
@@ -0,0 +1,501 @@
1
+ var sip = require ('../index.js')
2
+ var Zeq = require('@mayama/zeq')
3
+ var z = new Zeq()
4
+ var m = require('data-matching')
5
+ var sip_msg = require('sip-matching')
6
+ var sdp = require('sdp-matching')
7
+
8
+ async function test() {
9
+ sip.set_log_level(9)
10
+
11
+ //sip.set_log_level(6)
12
+ sip.dtmf_aggregation_on(500)
13
+
14
+ // Let's ignore '100 Trying'
15
+ z.add_event_filter({
16
+ event: 'response',
17
+ msg: sip_msg({
18
+ $rs: '100',
19
+ }),
20
+ })
21
+
22
+ z.trap_events(sip.event_source, 'event', (evt) => {
23
+ var e = evt.args[0]
24
+ return e
25
+ })
26
+
27
+ console.log(sip.start((data) => { console.log(data)} ))
28
+
29
+ t1 = sip.transport.create({address: "127.0.0.1", port: 5090, type: 'udp'})
30
+ t2 = sip.transport.create({address: "127.0.0.1", port: 5092, type: 'udp'})
31
+
32
+ console.log("t1", t1)
33
+ console.log("t2", t2)
34
+
35
+ oc = sip.call.create(t1.id, {from_uri: 'sip:alice@test.com', to_uri: `sip:bob@${t2.address}:${t2.port}`, media: "audio,audio"})
36
+
37
+ await z.wait([
38
+ {
39
+ event: "incoming_call",
40
+ call_id: m.collect("call_id"),
41
+ },
42
+ ], 1000)
43
+
44
+ ic = {
45
+ id: z.store.call_id,
46
+ sip_call_id: z.store.sip_call_id,
47
+ }
48
+
49
+ sip.call.respond(ic.id, {code: 200, reason: 'OK', media: "audio,audio"})
50
+
51
+ await z.wait([
52
+ {
53
+ event: 'response',
54
+ call_id: oc.id,
55
+ method: 'INVITE',
56
+ msg: sip_msg({
57
+ $rs: '200',
58
+ $rr: 'OK',
59
+ '$(hdrcnt(VIA))': 1,
60
+ $fU: 'alice',
61
+ $fd: 'test.com',
62
+ $tU: 'bob',
63
+ '$hdr(content-type)': 'application/sdp',
64
+ $rb: sdp.jsonpath_matcher({
65
+ '$.media.length': [2],
66
+ '$.media[*].desc.type': ['audio','audio'],
67
+ '$.media[*].desc.port': [m.nonzero, m.nonzero],
68
+ }),
69
+ }),
70
+ },
71
+ {
72
+ event: 'media_update',
73
+ call_id: oc.id,
74
+ status: 'ok',
75
+ media: m.fm([
76
+ m.pm({
77
+ type: 'audio',
78
+ local: {},
79
+ }),
80
+ m.pm({
81
+ type: 'audio',
82
+ local: {},
83
+ }),
84
+ ]),
85
+ },
86
+ {
87
+ event: 'media_update',
88
+ call_id: ic.id,
89
+ status: 'ok',
90
+ media: m.fm([
91
+ m.pm({
92
+ type: 'audio',
93
+ local: {},
94
+ }),
95
+ m.pm({
96
+ type: 'audio',
97
+ local: {},
98
+ }),
99
+ ]),
100
+ },
101
+ ], 1000)
102
+
103
+ sip.call.send_dtmf(oc.id, {digits: '1234', mode: 0})
104
+ sip.call.send_dtmf(ic.id, {digits: '4321', mode: 1})
105
+
106
+ await z.wait([
107
+ {
108
+ event: 'dtmf',
109
+ call_id: ic.id,
110
+ digits: '1234',
111
+ mode: 0,
112
+ media_id: 0
113
+ },
114
+ {
115
+ event: 'dtmf',
116
+ call_id: oc.id,
117
+ digits: '4321',
118
+ mode: 1,
119
+ media_id: 0
120
+ },
121
+ {
122
+ event: 'dtmf',
123
+ call_id: ic.id,
124
+ digits: '1234',
125
+ mode: 0,
126
+ media_id: 1
127
+ },
128
+ {
129
+ event: 'dtmf',
130
+ call_id: oc.id,
131
+ digits: '4321',
132
+ mode: 1,
133
+ media_id: 1
134
+ },
135
+ ], 2000)
136
+
137
+ sip.call.reinvite(oc.id, {media: "audio,audio"})
138
+
139
+ await z.wait([
140
+ {
141
+ event: 'reinvite',
142
+ call_id: ic.id,
143
+ },
144
+ ], 1000)
145
+
146
+ sip.call.respond(ic.id, {code: 200, reason: 'OK', media: "audio,audio"})
147
+
148
+ await z.wait([
149
+ {
150
+ event: 'response',
151
+ call_id: oc.id,
152
+ method: 'INVITE',
153
+ msg: sip_msg({
154
+ $rs: '200',
155
+ $rb: sdp.jsonpath_matcher({
156
+ '$.media.length': [2],
157
+ '$.media[*].desc.type': ['audio','audio'],
158
+ '$.media[*].desc.port': [m.nonzero, m.nonzero],
159
+ }),
160
+ }),
161
+ },
162
+ {
163
+ event: 'media_update',
164
+ call_id: ic.id,
165
+ status: 'ok',
166
+ media: m.fm([
167
+ m.pm({
168
+ type: 'audio',
169
+ local: {
170
+ mode: 'sendrecv'
171
+ },
172
+ remote: {
173
+ mode: 'sendrecv'
174
+ },
175
+ fmt: [
176
+ '0 PCMU/8000',
177
+ '120 telephone-event/8000'
178
+ ]
179
+ }),
180
+ m.pm({
181
+ type: 'audio',
182
+ local: {
183
+ mode: 'sendrecv'
184
+ },
185
+ remote: {
186
+ mode: 'sendrecv'
187
+ },
188
+ fmt: [
189
+ '0 PCMU/8000',
190
+ '120 telephone-event/8000'
191
+ ]
192
+ }),
193
+ ]),
194
+ },
195
+ {
196
+ event: 'media_update',
197
+ call_id: oc.id,
198
+ status: 'ok',
199
+ media: m.fm([
200
+ m.pm({
201
+ type: 'audio',
202
+ local: {
203
+ mode: 'sendrecv'
204
+ },
205
+ remote: {
206
+ mode: 'sendrecv'
207
+ },
208
+ fmt: [
209
+ '0 PCMU/8000',
210
+ '120 telephone-event/8000'
211
+ ]
212
+ }),
213
+ m.pm({
214
+ type: 'audio',
215
+ local: {
216
+ mode: 'sendrecv'
217
+ },
218
+ remote: {
219
+ mode: 'sendrecv'
220
+ },
221
+ fmt: [
222
+ '0 PCMU/8000',
223
+ '120 telephone-event/8000'
224
+ ]
225
+ }),
226
+ ]),
227
+ },
228
+ ], 1000)
229
+
230
+ await z.sleep(100)
231
+
232
+ // Now change to single media
233
+ sip.call.reinvite(oc.id, {media: [
234
+ "audio",
235
+ {
236
+ type: "audio",
237
+ port: 0,
238
+ },
239
+ ]})
240
+
241
+ await z.wait([
242
+ {
243
+ event: 'reinvite',
244
+ call_id: ic.id,
245
+ },
246
+ ], 1000)
247
+
248
+ sip.call.respond(ic.id, {code: 200, reason: 'OK', media: [
249
+ "audio",
250
+ {
251
+ type: "audio",
252
+ port: 0,
253
+ },
254
+ ]})
255
+
256
+ await z.wait([
257
+ {
258
+ event: 'response',
259
+ call_id: oc.id,
260
+ method: 'INVITE',
261
+ msg: sip_msg({
262
+ $rs: '200',
263
+ $rb: sdp.jsonpath_matcher({
264
+ '$.media.length': [2],
265
+ '$.media[*].desc.type': ['audio','audio'],
266
+ '$.media[*].desc.port': [m.nonzero, '0'],
267
+ }),
268
+ }),
269
+ },
270
+ {
271
+ event: 'media_update',
272
+ call_id: ic.id,
273
+ status: 'ok',
274
+ media: m.fm([
275
+ m.pm({
276
+ type: 'audio',
277
+ local: {
278
+ mode: 'sendrecv'
279
+ },
280
+ remote: {
281
+ mode: 'sendrecv'
282
+ },
283
+ fmt: [
284
+ '0 PCMU/8000',
285
+ '120 telephone-event/8000'
286
+ ]
287
+ }),
288
+ m.pm({
289
+ type: 'audio',
290
+ port: 0,
291
+ }),
292
+ ]),
293
+ },
294
+ {
295
+ event: 'media_update',
296
+ call_id: oc.id,
297
+ status: 'ok',
298
+ media: m.fm([
299
+ m.pm({
300
+ type: 'audio',
301
+ local: {
302
+ mode: 'sendrecv'
303
+ },
304
+ remote: {
305
+ mode: 'sendrecv'
306
+ },
307
+ fmt: [
308
+ '0 PCMU/8000',
309
+ '120 telephone-event/8000'
310
+ ]
311
+ }),
312
+ m.pm({
313
+ type: 'audio',
314
+ port: 0,
315
+ }),
316
+ ]),
317
+ },
318
+ ], 1000)
319
+
320
+ sip.call.send_dtmf(oc.id, {digits: '1234', mode: 0})
321
+ sip.call.send_dtmf(ic.id, {digits: '4321', mode: 1})
322
+
323
+ await z.wait([
324
+ {
325
+ event: 'dtmf',
326
+ call_id: ic.id,
327
+ digits: '1234',
328
+ mode: 0,
329
+ media_id: 0
330
+ },
331
+ {
332
+ event: 'dtmf',
333
+ call_id: oc.id,
334
+ digits: '4321',
335
+ mode: 1,
336
+ media_id: 0
337
+ },
338
+ ], 1500)
339
+
340
+ // now switch back to two media
341
+ sip.call.reinvite(oc.id, {media: "audio,audio"})
342
+
343
+ await z.wait([
344
+ {
345
+ event: 'reinvite',
346
+ call_id: ic.id,
347
+ },
348
+ ], 1000)
349
+
350
+ sip.call.respond(ic.id, {code: 200, reason: 'OK', media: "audio,audio"})
351
+
352
+ await z.wait([
353
+ {
354
+ event: 'response',
355
+ call_id: oc.id,
356
+ method: 'INVITE',
357
+ msg: sip_msg({
358
+ $rs: '200',
359
+ $rb: sdp.jsonpath_matcher({
360
+ '$.media.length': [2],
361
+ '$.media[*].desc.type': ['audio','audio'],
362
+ '$.media[*].desc.port': [m.nonzero, m.nonzero],
363
+ }),
364
+ }),
365
+ },
366
+ {
367
+ event: 'media_update',
368
+ call_id: ic.id,
369
+ status: 'ok',
370
+ media: m.fm([
371
+ m.pm({
372
+ type: 'audio',
373
+ local: {
374
+ mode: 'sendrecv'
375
+ },
376
+ remote: {
377
+ mode: 'sendrecv'
378
+ },
379
+ fmt: [
380
+ '0 PCMU/8000',
381
+ '120 telephone-event/8000'
382
+ ]
383
+ }),
384
+ m.pm({
385
+ type: 'audio',
386
+ local: {
387
+ mode: 'sendrecv'
388
+ },
389
+ remote: {
390
+ mode: 'sendrecv'
391
+ },
392
+ fmt: [
393
+ '0 PCMU/8000',
394
+ '120 telephone-event/8000'
395
+ ]
396
+ }),
397
+ ]),
398
+ },
399
+ {
400
+ event: 'media_update',
401
+ call_id: oc.id,
402
+ status: 'ok',
403
+ media: m.fm([
404
+ m.pm({
405
+ type: 'audio',
406
+ local: {
407
+ mode: 'sendrecv'
408
+ },
409
+ remote: {
410
+ mode: 'sendrecv'
411
+ },
412
+ fmt: [
413
+ '0 PCMU/8000',
414
+ '120 telephone-event/8000'
415
+ ]
416
+ }),
417
+ m.pm({
418
+ type: 'audio',
419
+ local: {
420
+ mode: 'sendrecv'
421
+ },
422
+ remote: {
423
+ mode: 'sendrecv'
424
+ },
425
+ fmt: [
426
+ '0 PCMU/8000',
427
+ '120 telephone-event/8000'
428
+ ]
429
+ })
430
+ ]),
431
+ },
432
+ ], 1000)
433
+
434
+ sip.call.send_dtmf(oc.id, {digits: '1234', mode: 0})
435
+ sip.call.send_dtmf(ic.id, {digits: '4321', mode: 1})
436
+
437
+ await z.wait([
438
+ {
439
+ event: 'dtmf',
440
+ call_id: ic.id,
441
+ digits: '1234',
442
+ mode: 0,
443
+ media_id: 0
444
+ },
445
+ {
446
+ event: 'dtmf',
447
+ call_id: oc.id,
448
+ digits: '4321',
449
+ mode: 1,
450
+ media_id: 0
451
+ },
452
+ {
453
+ event: 'dtmf',
454
+ call_id: ic.id,
455
+ digits: '1234',
456
+ mode: 0,
457
+ media_id: 1
458
+ },
459
+ {
460
+ event: 'dtmf',
461
+ call_id: oc.id,
462
+ digits: '4321',
463
+ mode: 1,
464
+ media_id: 1
465
+ },
466
+ ], 2000)
467
+
468
+ sip.call.terminate(oc.id)
469
+
470
+ await z.wait([
471
+ {
472
+ event: 'call_ended',
473
+ call_id: oc.id,
474
+ },
475
+ {
476
+ event: 'call_ended',
477
+ call_id: ic.id,
478
+ },
479
+ {
480
+ event: 'response',
481
+ call_id: oc.id,
482
+ method: 'BYE',
483
+ msg: sip_msg({
484
+ $rs: '200',
485
+ $rr: 'OK',
486
+ }),
487
+ },
488
+ ], 1000)
489
+
490
+ console.log("Success")
491
+
492
+ sip.stop()
493
+ }
494
+
495
+
496
+ test()
497
+ .catch(e => {
498
+ console.error(e)
499
+ process.exit(1)
500
+ })
501
+