sip-lab 1.12.38 → 1.13.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.
Files changed (40) hide show
  1. package/DEV.md +27 -2
  2. package/README.md +3 -2
  3. package/binding.gyp +97 -86
  4. package/build_deps.sh +2 -1
  5. package/index.js +14 -7
  6. package/package.json +7 -2
  7. package/prebuilds/linux-x64/node.abi102.node +0 -0
  8. package/prebuilds/linux-x64/node.abi108.node +0 -0
  9. package/prebuilds/linux-x64/node.abi88.node +0 -0
  10. package/prebuilds/linux-x64/node.abi93.node +0 -0
  11. package/samples/16_audio_streams.js +179 -0
  12. package/samples/delayed_media.js +117 -81
  13. package/samples/g729.js +50 -28
  14. package/samples/mrcp_and_audio.js +445 -0
  15. package/samples/mrcp_and_audio.simplified_media.js +273 -0
  16. package/samples/mrcp_and_audio.switching_order.js +273 -0
  17. package/samples/options.js +82 -0
  18. package/samples/refer.js +247 -0
  19. package/samples/refuse_telephone_event.js +166 -0
  20. package/samples/register_no_expires.js +82 -0
  21. package/samples/register_subscribe.js +36 -4
  22. package/samples/reinvite_and_dtmf.js +236 -161
  23. package/samples/reinvite_audio_audio.js +320 -0
  24. package/samples/reinvite_with_hold_unhold.js +412 -0
  25. package/samples/send_and_receive_fax.js +4 -8
  26. package/samples/simple.js +5 -9
  27. package/samples/sip_cancel.js +4 -6
  28. package/samples/tcp_and_extra_headers.js +98 -45
  29. package/samples/two_audio_media.js +497 -0
  30. package/src/addon.cpp +488 -268
  31. package/src/event_templates.cpp +84 -35
  32. package/src/event_templates.hpp +22 -12
  33. package/src/idmanager.cpp +58 -57
  34. package/src/idmanager.hpp +10 -10
  35. package/src/log.cpp +9 -11
  36. package/src/log.hpp +4 -4
  37. package/src/sip.cpp +6838 -5041
  38. package/src/sip.hpp +26 -34
  39. package/src/packetdumper.cpp +0 -234
  40. package/src/packetdumper.hpp +0 -67
@@ -0,0 +1,445 @@
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 mrcp = require('mrcp')
7
+ var mrcp_msg = require('mrcp-matching')
8
+ var sdp_msg = require('sdp-matching')
9
+
10
+ async function test() {
11
+ sip.set_log_level(9)
12
+
13
+ //sip.set_log_level(6)
14
+ sip.dtmf_aggregation_on(500)
15
+
16
+ z.trap_events(sip.event_source, 'event', (evt) => {
17
+ var e = evt.args[0]
18
+ return e
19
+ })
20
+
21
+ console.log(sip.start((data) => { console.log(data)} ))
22
+
23
+ var t1 = sip.transport.create({address: "127.0.0.1", port: 5090, type: 'udp'})
24
+ var t2 = sip.transport.create({address: "127.0.0.1", port: 5092, type: 'udp'})
25
+
26
+ console.log("t1", t1)
27
+ console.log("t2", t2)
28
+
29
+ var client_media = [
30
+ {
31
+ type: 'mrcp',
32
+ fields: [
33
+ 'a=setup:active',
34
+ 'a=connection:new',
35
+ 'a=resource:speechsynth',
36
+ 'a=cmid:1',
37
+ ],
38
+ },
39
+ {
40
+ type: 'audio',
41
+ fields: [
42
+ 'a=recvonly',
43
+ 'a=mid:1',
44
+ ],
45
+ },
46
+ ]
47
+
48
+ var server_media = [
49
+ {
50
+ type: 'mrcp',
51
+ fields: [
52
+ 'a=setup:passive',
53
+ 'a=connection:new',
54
+ 'a=channel:32AECB234338@speechsynth',
55
+ 'a=cmid:1',
56
+ ],
57
+ },
58
+ {
59
+ type: 'audio',
60
+ fields: [
61
+ 'a=sendonly',
62
+ ],
63
+ },
64
+ ]
65
+
66
+ oc = sip.call.create(t1.id, {
67
+ from_uri: 'sip:alice@test.com',
68
+ to_uri: `sip:bob@${t2.address}:${t2.port}`,
69
+ media: client_media,
70
+ })
71
+
72
+ await z.wait([
73
+ {
74
+ event: "incoming_call",
75
+ call_id: m.collect("call_id"),
76
+ },
77
+ {
78
+ event: 'response',
79
+ call_id: oc.id,
80
+ method: 'INVITE',
81
+ msg: sip_msg({
82
+ $rs: '100',
83
+ $rr: 'Trying',
84
+ '$(hdrcnt(via))': 1,
85
+ '$hdr(call-id)': m.collect('sip_call_id'),
86
+ $fU: 'alice',
87
+ $fd: 'test.com',
88
+ $tU: 'bob',
89
+ '$hdr(l)': '0',
90
+ }),
91
+ },
92
+ ], 1000)
93
+
94
+ ic = {
95
+ id: z.store.call_id,
96
+ sip_call_id: z.store.sip_call_id,
97
+ }
98
+
99
+ sip.call.respond(ic.id, {
100
+ code: 200,
101
+ reason: 'OK',
102
+ media: server_media,
103
+ })
104
+
105
+ await z.wait([
106
+ {
107
+ event: 'response',
108
+ call_id: oc.id,
109
+ method: 'INVITE',
110
+ msg: sip_msg({
111
+ $rs: '200',
112
+ $rr: 'OK',
113
+ '$(hdrcnt(VIA))': 1,
114
+ $fU: 'alice',
115
+ $fd: 'test.com',
116
+ $tU: 'bob',
117
+ '$hdr(content-type)': 'application/sdp',
118
+ $rb: sdp_msg({
119
+ '$.media[?(@.desc.type=="application")].val_attrs.channel': [m.collect('mrcp_channel')],
120
+ }),
121
+ }),
122
+ },
123
+ {
124
+ event: 'media_update',
125
+ call_id: oc.id,
126
+ status: 'ok',
127
+ media: [
128
+ {
129
+ type: 'mrcp',
130
+ local: {
131
+ port: 9
132
+ },
133
+ remote: {
134
+ port: m.collect('mrcp_server_port'),
135
+ },
136
+ },
137
+ {
138
+ type: 'audio',
139
+ local: {
140
+ port: 10000,
141
+ mode: 'recvonly'
142
+ },
143
+ remote: {
144
+ port: 10002,
145
+ mode: 'sendonly'
146
+ }
147
+ }
148
+ ],
149
+ },
150
+ {
151
+ event: 'media_update',
152
+ call_id: ic.id,
153
+ status: 'ok',
154
+ media: [
155
+ {
156
+ type: 'mrcp',
157
+ local: {
158
+ port: m.collect('mrcp_server_port'),
159
+ },
160
+ remote: {
161
+ port: 9
162
+ }
163
+ },
164
+ {
165
+ type: 'audio',
166
+ local: {
167
+ port: 10002,
168
+ mode: 'sendonly'
169
+ },
170
+ remote: {
171
+ port: 10000,
172
+ mode: 'recvonly'
173
+ }
174
+ }
175
+ ],
176
+ },
177
+ ], 1000)
178
+
179
+ var mrcp_channel = z.store.mrcp_channel
180
+ var request_id = 1;
181
+ var msg = mrcp.builder.build_request('SPEAK', request_id, {'channel-identifier': mrcp_channel, 'content-type': 'application/xml'}, "<root>test</root>")
182
+
183
+ sip.call.send_mrcp_msg(oc.id, {msg})
184
+
185
+ await z.wait([
186
+ {
187
+ event: 'mrcp_msg',
188
+ call_id: ic.id,
189
+ msg: mrcp_msg({
190
+ type: 'request',
191
+ version: '2.0',
192
+ method: 'SPEAK',
193
+ request_id: 1,
194
+ headers: {
195
+ 'content-type': 'application/xml',
196
+ },
197
+ body: '<root>test</root>',
198
+ }),
199
+ },
200
+ ], 1000)
201
+
202
+ msg = mrcp.builder.build_response(request_id, 200, 'IN-PROGRESS', {'channel-identifier': mrcp_channel})
203
+
204
+ sip.call.send_mrcp_msg(ic.id, {msg})
205
+
206
+ await z.wait([
207
+ {
208
+ event: 'mrcp_msg',
209
+ call_id: oc.id,
210
+ msg: mrcp_msg({
211
+ type: 'response',
212
+ version: '2.0',
213
+ request_id: 1,
214
+ status_code: 200,
215
+ request_state: 'IN-PROGRESS',
216
+ }),
217
+ },
218
+ ], 1000)
219
+
220
+ msg = mrcp.builder.build_event('SPEAK-COMPLETE', request_id, 'COMPLETE', {'channel-identifier': mrcp_channel})
221
+
222
+ sip.call.send_mrcp_msg(ic.id, {msg})
223
+
224
+ await z.wait([
225
+ {
226
+ event: 'mrcp_msg',
227
+ call_id: oc.id,
228
+ msg: mrcp_msg({
229
+ type: 'event',
230
+ version: '2.0',
231
+ request_id: 1,
232
+ event_name: 'SPEAK-COMPLETE',
233
+ request_state: 'COMPLETE',
234
+ }),
235
+ },
236
+ ], 1000)
237
+
238
+ sip.call.reinvite(oc.id, {media: client_media})
239
+
240
+ await z.wait([
241
+ {
242
+ event: 'reinvite',
243
+ call_id: ic.id,
244
+ },
245
+ ], 500)
246
+
247
+ sip.call.respond(ic.id, {code: 200, reason: 'OK', media: server_media})
248
+
249
+ await z.wait([
250
+ {
251
+ event: 'response',
252
+ call_id: oc.id,
253
+ method: 'INVITE',
254
+ msg: sip_msg({
255
+ $rs: '100',
256
+ }),
257
+ },
258
+ {
259
+ event: 'response',
260
+ call_id: oc.id,
261
+ method: 'INVITE',
262
+ msg: sip_msg({
263
+ $rs: '200',
264
+ $rr: 'OK',
265
+ $rb: '!{_}a=sendonly',
266
+ }),
267
+ },
268
+ {
269
+ event: 'media_update',
270
+ call_id: oc.id,
271
+ status: 'ok',
272
+ media: [
273
+ {
274
+ type: 'mrcp',
275
+ local: {
276
+ port: 9
277
+ },
278
+ remote: {
279
+ port: m.collect('mrcp_server_port'),
280
+ }
281
+ },
282
+ {
283
+ type: 'audio',
284
+ local: {
285
+ port: 10000,
286
+ mode: 'recvonly'
287
+ },
288
+ remote: {
289
+ port: 10002,
290
+ mode: 'sendonly'
291
+ }
292
+ }
293
+ ],
294
+ },
295
+ {
296
+ event: 'media_update',
297
+ call_id: ic.id,
298
+ status: 'ok',
299
+ media: [
300
+ {
301
+ type: 'mrcp',
302
+ local: {
303
+ port: m.collect('mrcp_server_port'),
304
+ },
305
+ remote: {
306
+ port: 9
307
+ }
308
+ },
309
+ {
310
+ type: 'audio',
311
+ local: {
312
+ port: 10002,
313
+ mode: 'sendonly'
314
+ },
315
+ remote: {
316
+ port: 10000,
317
+ mode: 'recvonly'
318
+ }
319
+ }
320
+ ],
321
+ },
322
+ ], 500)
323
+
324
+ sip.call.reinvite(ic.id, {media: server_media})
325
+
326
+ await z.wait([
327
+ {
328
+ event: 'reinvite',
329
+ call_id: oc.id,
330
+ },
331
+ ], 500)
332
+
333
+ sip.call.respond(oc.id, {code: 200, reason: 'OK', media: client_media})
334
+
335
+ await z.wait([
336
+ {
337
+ event: 'response',
338
+ call_id: ic.id,
339
+ method: 'INVITE',
340
+ msg: sip_msg({
341
+ $rs: '100',
342
+ }),
343
+ },
344
+ {
345
+ event: 'response',
346
+ call_id: ic.id,
347
+ method: 'INVITE',
348
+ msg: sip_msg({
349
+ $rs: '200',
350
+ $rr: 'OK',
351
+ $rb: '!{_}a=recvonly',
352
+ }),
353
+ },
354
+ {
355
+ event: 'media_update',
356
+ call_id: oc.id,
357
+ status: 'ok',
358
+ media: [
359
+ {
360
+ type: 'mrcp',
361
+ local: {
362
+ port: 9
363
+ },
364
+ remote: {
365
+ port: m.collect('mrcp_server_port'),
366
+ }
367
+ },
368
+ {
369
+ type: 'audio',
370
+ local: {
371
+ port: 10000,
372
+ mode: 'recvonly'
373
+ },
374
+ remote: {
375
+ port: 10002,
376
+ mode: 'sendonly'
377
+ }
378
+ }
379
+ ],
380
+ },
381
+ {
382
+ event: 'media_update',
383
+ call_id: ic.id,
384
+ status: 'ok',
385
+ media: [
386
+ {
387
+ type: 'mrcp',
388
+ local: {
389
+ port: m.collect('mrcp_server_port'),
390
+ },
391
+ remote: {
392
+ port: 9
393
+ }
394
+ },
395
+ {
396
+ type: 'audio',
397
+ local: {
398
+ port: 10002,
399
+ mode: 'sendonly'
400
+ },
401
+ remote: {
402
+ port: 10000,
403
+ mode: 'recvonly'
404
+ }
405
+ }
406
+ ],
407
+ },
408
+ ], 500)
409
+
410
+ await z.sleep(1000) // we need this delay otherwise, frequently the app will crash after this point.
411
+
412
+ sip.call.terminate(oc.id)
413
+
414
+ await z.wait([
415
+ {
416
+ event: 'call_ended',
417
+ call_id: oc.id,
418
+ },
419
+ {
420
+ event: 'call_ended',
421
+ call_id: ic.id,
422
+ },
423
+ {
424
+ event: 'response',
425
+ call_id: oc.id,
426
+ method: 'BYE',
427
+ msg: sip_msg({
428
+ $rs: '200',
429
+ $rr: 'OK',
430
+ }),
431
+ },
432
+ ], 1000)
433
+
434
+ console.log("Success")
435
+
436
+ sip.stop()
437
+ }
438
+
439
+
440
+ test()
441
+ .catch(e => {
442
+ console.error(e)
443
+ process.exit(1)
444
+ })
445
+
@@ -0,0 +1,273 @@
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
+
7
+ async function test() {
8
+ sip.set_log_level(9)
9
+
10
+ //sip.set_log_level(6)
11
+ sip.dtmf_aggregation_on(500)
12
+
13
+ z.trap_events(sip.event_source, 'event', (evt) => {
14
+ var e = evt.args[0]
15
+ return e
16
+ })
17
+
18
+ console.log(sip.start((data) => { console.log(data)} ))
19
+
20
+ t1 = sip.transport.create({address: "127.0.0.1", port: 5090, type: 'udp'})
21
+ t2 = sip.transport.create({address: "127.0.0.1", port: 5092, type: 'udp'})
22
+
23
+ console.log("t1", t1)
24
+ console.log("t2", t2)
25
+
26
+ oc = sip.call.create(t1.id, {from_uri: 'sip:alice@test.com', to_uri: `sip:bob@${t2.address}:${t2.port}`, media: ['mrcp', 'audio']})
27
+
28
+ await z.wait([
29
+ {
30
+ event: "incoming_call",
31
+ call_id: m.collect("call_id"),
32
+ },
33
+ {
34
+ event: 'response',
35
+ call_id: oc.id,
36
+ method: 'INVITE',
37
+ msg: sip_msg({
38
+ $rs: '100',
39
+ $rr: 'Trying',
40
+ '$(hdrcnt(via))': 1,
41
+ '$hdr(call-id)': m.collect('sip_call_id'),
42
+ $fU: 'alice',
43
+ $fd: 'test.com',
44
+ $tU: 'bob',
45
+ '$hdr(l)': '0',
46
+ }),
47
+ },
48
+ ], 1000)
49
+
50
+ ic = {
51
+ id: z.store.call_id,
52
+ sip_call_id: z.store.sip_call_id,
53
+ }
54
+
55
+ sip.call.respond(ic.id, {code: 200, reason: 'OK', media: 'mrcp,audio'})
56
+
57
+ await z.wait([
58
+ {
59
+ event: 'response',
60
+ call_id: oc.id,
61
+ method: 'INVITE',
62
+ msg: sip_msg({
63
+ $rs: '200',
64
+ $rr: 'OK',
65
+ '$(hdrcnt(VIA))': 1,
66
+ $fU: 'alice',
67
+ $fd: 'test.com',
68
+ $tU: 'bob',
69
+ '$hdr(content-type)': 'application/sdp',
70
+ $rb: '!{_}a=sendrecv',
71
+ }),
72
+ },
73
+ {
74
+ event: 'media_update',
75
+ call_id: oc.id,
76
+ status: 'ok',
77
+ media: [
78
+ {
79
+ type: 'mrcp',
80
+ local: {
81
+ port: 9
82
+ },
83
+ remote: {
84
+ port: m.collect('mrcp_server_port')
85
+ }
86
+ },
87
+ {
88
+ type: 'audio',
89
+ local: {
90
+ port: 10000,
91
+ mode: 'sendrecv'
92
+ },
93
+ remote: {
94
+ port: 10002,
95
+ mode: 'sendrecv'
96
+ }
97
+ }
98
+ ],
99
+ },
100
+ {
101
+ event: 'media_update',
102
+ call_id: ic.id,
103
+ status: 'ok',
104
+ media: [
105
+ {
106
+ type: 'mrcp',
107
+ local: {
108
+ port: m.collect('mrcp_server_port')
109
+ },
110
+ remote: {
111
+ port: 9
112
+ }
113
+ },
114
+ {
115
+ type: 'audio',
116
+ local: {
117
+ port: 10002,
118
+ mode: 'sendrecv'
119
+ },
120
+ remote: {
121
+ port: 10000,
122
+ mode: 'sendrecv'
123
+ }
124
+ }
125
+ ],
126
+ },
127
+ ], 1000)
128
+
129
+ sip.call.send_dtmf(oc.id, {digits: '1234', mode: 0})
130
+ sip.call.send_dtmf(ic.id, {digits: '4321', mode: 1})
131
+
132
+ await z.wait([
133
+ {
134
+ event: 'dtmf',
135
+ call_id: ic.id,
136
+ digits: '1234',
137
+ mode: 0,
138
+ media_id: 1
139
+ },
140
+ {
141
+ event: 'dtmf',
142
+ call_id: oc.id,
143
+ digits: '4321',
144
+ mode: 1,
145
+ media_id: 1
146
+ },
147
+ ], 1500)
148
+
149
+ for(i=0 ;i< 1; i++) {
150
+ //await z.sleep(100)
151
+ sip.call.reinvite(oc.id, {media: ['mrcp', {type: 'audio'}]})
152
+
153
+ await z.wait([
154
+ {
155
+ event: 'reinvite',
156
+ call_id: ic.id,
157
+ },
158
+ ], 500)
159
+
160
+ sip.call.respond(ic.id, {code: 200, reason: 'OK', media: [{type: 'mrcp'}, 'audio']})
161
+
162
+ await z.wait([
163
+ {
164
+ event: 'response',
165
+ call_id: oc.id,
166
+ method: 'INVITE',
167
+ msg: sip_msg({
168
+ $rs: '100',
169
+ }),
170
+ },
171
+ {
172
+ event: 'response',
173
+ call_id: oc.id,
174
+ method: 'INVITE',
175
+ msg: sip_msg({
176
+ $rs: '200',
177
+ $rr: 'OK',
178
+ $rb: '!{_}a=sendrecv',
179
+ }),
180
+ },
181
+ {
182
+ event: 'media_update',
183
+ call_id: oc.id,
184
+ status: 'ok',
185
+ },
186
+ {
187
+ event: 'media_update',
188
+ call_id: ic.id,
189
+ status: 'ok',
190
+ },
191
+ ], 500)
192
+
193
+ //await z.sleep(100)
194
+ sip.call.reinvite(ic.id, {media: ['mrcp','audio']})
195
+
196
+ await z.wait([
197
+ {
198
+ event: 'reinvite',
199
+ call_id: oc.id,
200
+ },
201
+ ], 500)
202
+
203
+ sip.call.respond(oc.id, {code: 200, reason: 'OK', media: [{type: 'mrcp'}, {type: 'audio'}]})
204
+
205
+ await z.wait([
206
+ {
207
+ event: 'response',
208
+ call_id: ic.id,
209
+ method: 'INVITE',
210
+ msg: sip_msg({
211
+ $rs: '100',
212
+ }),
213
+ },
214
+ {
215
+ event: 'response',
216
+ call_id: ic.id,
217
+ method: 'INVITE',
218
+ msg: sip_msg({
219
+ $rs: '200',
220
+ $rr: 'OK',
221
+ }),
222
+ },
223
+ {
224
+ event: 'media_update',
225
+ call_id: oc.id,
226
+ status: 'ok',
227
+ },
228
+ {
229
+ event: 'media_update',
230
+ call_id: ic.id,
231
+ status: 'ok',
232
+ },
233
+ ], 500)
234
+
235
+ //await z.sleep(100)
236
+ }
237
+
238
+ await z.sleep(1000) // we need this delay otherwise, frequently the app will crash after this point.
239
+
240
+ sip.call.terminate(oc.id)
241
+
242
+ await z.wait([
243
+ {
244
+ event: 'call_ended',
245
+ call_id: oc.id,
246
+ },
247
+ {
248
+ event: 'call_ended',
249
+ call_id: ic.id,
250
+ },
251
+ {
252
+ event: 'response',
253
+ call_id: oc.id,
254
+ method: 'BYE',
255
+ msg: sip_msg({
256
+ $rs: '200',
257
+ $rr: 'OK',
258
+ }),
259
+ },
260
+ ], 1000)
261
+
262
+ console.log("Success")
263
+
264
+ sip.stop()
265
+ }
266
+
267
+
268
+ test()
269
+ .catch(e => {
270
+ console.error(e)
271
+ process.exit(1)
272
+ })
273
+