sip-lab 1.12.39 → 1.13.1

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 +19 -3
  2. package/README.md +8 -4
  3. package/binding.gyp +97 -86
  4. package/build_deps.sh +3 -2
  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 +6841 -5040
  38. package/src/sip.hpp +26 -34
  39. package/src/packetdumper.cpp +0 -234
  40. package/src/packetdumper.hpp +0 -67
@@ -0,0 +1,320 @@
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: 'audio,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: 'audio,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: 'audio',
80
+ },
81
+ {
82
+ type: 'audio',
83
+ },
84
+ ],
85
+ },
86
+ {
87
+ event: 'media_update',
88
+ call_id: ic.id,
89
+ status: 'ok',
90
+ media: [
91
+ {
92
+ type: 'audio',
93
+ },
94
+ {
95
+ type: 'audio',
96
+ },
97
+ ],
98
+ },
99
+ ], 1000)
100
+
101
+ sip.call.send_dtmf(oc.id, {digits: '1234', mode: 0})
102
+ sip.call.send_dtmf(ic.id, {digits: '4321', mode: 1})
103
+
104
+ await z.wait([
105
+ {
106
+ event: 'dtmf',
107
+ call_id: ic.id,
108
+ digits: '1234',
109
+ mode: 0,
110
+ media_id: 0
111
+ },
112
+ {
113
+ event: 'dtmf',
114
+ call_id: oc.id,
115
+ digits: '4321',
116
+ mode: 1,
117
+ media_id: 0
118
+ },
119
+ {
120
+ event: 'dtmf',
121
+ call_id: ic.id,
122
+ digits: '1234',
123
+ mode: 0,
124
+ media_id: 1
125
+ },
126
+ {
127
+ event: 'dtmf',
128
+ call_id: oc.id,
129
+ digits: '4321',
130
+ mode: 1,
131
+ media_id: 1
132
+ },
133
+ ], 2000)
134
+
135
+ sip.call.reinvite(oc.id, {media: 'audio,audio'})
136
+
137
+ await z.wait([
138
+ {
139
+ event: 'reinvite',
140
+ call_id: ic.id,
141
+ },
142
+ ], 500)
143
+
144
+ sip.call.respond(ic.id, {code: 200, reason: 'OK', media: 'audio,audio'})
145
+
146
+ await z.wait([
147
+ {
148
+ event: 'response',
149
+ call_id: oc.id,
150
+ method: 'INVITE',
151
+ msg: sip_msg({
152
+ $rs: '100',
153
+ }),
154
+ },
155
+ {
156
+ event: 'response',
157
+ call_id: oc.id,
158
+ method: 'INVITE',
159
+ msg: sip_msg({
160
+ $rs: '200',
161
+ $rr: 'OK',
162
+ $rb: '!{_}a=sendrecv',
163
+ }),
164
+ },
165
+
166
+ {
167
+ event: 'media_update',
168
+ call_id: oc.id,
169
+ status: 'ok',
170
+ media: [
171
+ {
172
+ type: 'audio',
173
+ },
174
+ {
175
+ type: 'audio',
176
+ },
177
+ ],
178
+ },
179
+ {
180
+ event: 'media_update',
181
+ call_id: ic.id,
182
+ status: 'ok',
183
+ media: [
184
+ {
185
+ type: 'audio',
186
+ },
187
+ {
188
+ type: 'audio',
189
+ },
190
+ ],
191
+ },
192
+ ], 500)
193
+
194
+ sip.call.send_dtmf(oc.id, {digits: '1234', mode: 0})
195
+ sip.call.send_dtmf(ic.id, {digits: '4321', mode: 1})
196
+
197
+ await z.wait([
198
+ {
199
+ event: 'dtmf',
200
+ call_id: ic.id,
201
+ digits: '1234',
202
+ mode: 0,
203
+ media_id: 0
204
+ },
205
+ {
206
+ event: 'dtmf',
207
+ call_id: oc.id,
208
+ digits: '4321',
209
+ mode: 1,
210
+ media_id: 0
211
+ },
212
+ {
213
+ event: 'dtmf',
214
+ call_id: ic.id,
215
+ digits: '1234',
216
+ mode: 0,
217
+ media_id: 1
218
+ },
219
+ {
220
+ event: 'dtmf',
221
+ call_id: oc.id,
222
+ digits: '4321',
223
+ mode: 1,
224
+ media_id: 1
225
+ },
226
+ ], 1500)
227
+
228
+ sip.call.reinvite(ic.id, {media: 'audio,audio'})
229
+
230
+ await z.wait([
231
+ {
232
+ event: 'reinvite',
233
+ call_id: oc.id,
234
+ },
235
+ ], 500)
236
+
237
+ sip.call.respond(oc.id, {code: 200, reason: 'OK', media: 'audio,audio'})
238
+
239
+ await z.wait([
240
+ {
241
+ event: 'response',
242
+ call_id: ic.id,
243
+ method: 'INVITE',
244
+ msg: sip_msg({
245
+ $rs: '100',
246
+ }),
247
+ },
248
+ {
249
+ event: 'response',
250
+ call_id: ic.id,
251
+ method: 'INVITE',
252
+ msg: sip_msg({
253
+ $rs: '200',
254
+ $rr: 'OK',
255
+ }),
256
+ },
257
+ {
258
+ event: 'media_update',
259
+ call_id: oc.id,
260
+ status: 'ok',
261
+ media: [
262
+ {
263
+ type: 'audio',
264
+ },
265
+ {
266
+ type: 'audio',
267
+ },
268
+ ],
269
+ },
270
+ {
271
+ event: 'media_update',
272
+ call_id: ic.id,
273
+ status: 'ok',
274
+ media: [
275
+ {
276
+ type: 'audio',
277
+ },
278
+ {
279
+ type: 'audio',
280
+ },
281
+ ],
282
+ },
283
+ ], 500)
284
+
285
+ await z.sleep(1000)
286
+
287
+ sip.call.terminate(oc.id)
288
+
289
+ await z.wait([
290
+ {
291
+ event: 'call_ended',
292
+ call_id: oc.id,
293
+ },
294
+ {
295
+ event: 'call_ended',
296
+ call_id: ic.id,
297
+ },
298
+ {
299
+ event: 'response',
300
+ call_id: oc.id,
301
+ method: 'BYE',
302
+ msg: sip_msg({
303
+ $rs: '200',
304
+ $rr: 'OK',
305
+ }),
306
+ },
307
+ ], 1000)
308
+
309
+ console.log("Success")
310
+
311
+ sip.stop()
312
+ }
313
+
314
+
315
+ test()
316
+ .catch(e => {
317
+ console.error(e)
318
+ process.exit(1)
319
+ })
320
+
@@ -0,0 +1,412 @@
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}`})
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'})
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: 'audio',
80
+ local: {
81
+ port: 10000,
82
+ mode: 'sendrecv'
83
+ },
84
+ remote: {
85
+ port: 10002,
86
+ mode: 'sendrecv'
87
+ }
88
+ }
89
+ ],
90
+ },
91
+ {
92
+ event: 'media_update',
93
+ call_id: ic.id,
94
+ status: 'ok',
95
+ media: [
96
+ {
97
+ type: 'audio',
98
+ local: {
99
+ port: 10002,
100
+ mode: 'sendrecv'
101
+ },
102
+ remote: {
103
+ port: 10000,
104
+ mode: 'sendrecv'
105
+ }
106
+ }
107
+ ],
108
+ },
109
+ ], 1000)
110
+
111
+ sip.call.send_dtmf(oc.id, {digits: '1234', mode: 0})
112
+ sip.call.send_dtmf(ic.id, {digits: '4321', mode: 1})
113
+
114
+ await z.wait([
115
+ {
116
+ event: 'dtmf',
117
+ call_id: ic.id,
118
+ digits: '1234',
119
+ mode: 0,
120
+ media_id: 0
121
+ },
122
+ {
123
+ event: 'dtmf',
124
+ call_id: oc.id,
125
+ digits: '4321',
126
+ mode: 1,
127
+ media_id: 0
128
+ },
129
+ ], 1500)
130
+
131
+ sip.call.reinvite(oc.id, {media: [{type: 'audio', fields: ['a=sendonly', 'a=fakeattr1:1234', 'a=fakeattr2: a b c']}]}) // this will put the call on hold
132
+
133
+ await z.wait([
134
+ {
135
+ event: 'reinvite',
136
+ call_id: ic.id,
137
+ msg: sip_msg({
138
+ $rb: '!{_}a=sendonly',
139
+ $rb: '!{_}a=fakeattr1:1234',
140
+ $rb: '!{_}a=fakeattr2: a b c',
141
+ }),
142
+ },
143
+ ], 500)
144
+
145
+ sip.call.respond(ic.id, {code: 200, reason: 'OK'})
146
+
147
+ await z.wait([
148
+ {
149
+ event: 'response',
150
+ call_id: oc.id,
151
+ method: 'INVITE',
152
+ msg: sip_msg({
153
+ $rs: '100',
154
+ }),
155
+ },
156
+ {
157
+ event: 'response',
158
+ call_id: oc.id,
159
+ method: 'INVITE',
160
+ msg: sip_msg({
161
+ $rs: '200',
162
+ $rr: 'OK',
163
+ $rb: '!{_}a=recvonly',
164
+ }),
165
+ },
166
+ {
167
+ event: 'media_update',
168
+ call_id: oc.id,
169
+ status: 'ok',
170
+ },
171
+ {
172
+ event: 'media_update',
173
+ call_id: ic.id,
174
+ status: 'ok',
175
+ },
176
+ ], 500)
177
+
178
+ sip.call.send_dtmf(oc.id, {digits: '1234', mode: 0})
179
+ sip.call.send_dtmf(ic.id, {digits: '4321', mode: 1}) // This will not generate event 'dtmf' because this side of the call is on hold
180
+
181
+ await z.wait([
182
+ {
183
+ event: 'dtmf',
184
+ call_id: ic.id,
185
+ digits: '1234',
186
+ mode: 0,
187
+ media_id: 0
188
+ },
189
+ ], 1500)
190
+
191
+ sip.call.reinvite(oc.id) // defaule mode is 'sendrecv' so this will put the call off hold
192
+
193
+ await z.wait([
194
+ {
195
+ event: 'reinvite',
196
+ call_id: ic.id,
197
+ msg: sip_msg({
198
+ $rb: '!{_}a=sendrecv',
199
+ }),
200
+ },
201
+ ], 500)
202
+
203
+ sip.call.respond(ic.id, {code: 200, reason: 'OK'})
204
+
205
+ await z.wait([
206
+ {
207
+ event: 'response',
208
+ call_id: oc.id,
209
+ method: 'INVITE',
210
+ msg: sip_msg({
211
+ $rs: '100',
212
+ }),
213
+ },
214
+ {
215
+ event: 'response',
216
+ call_id: oc.id,
217
+ method: 'INVITE',
218
+ msg: sip_msg({
219
+ $rs: '200',
220
+ $rr: 'OK',
221
+ $rb: '!{_}a=sendrecv',
222
+ }),
223
+ },
224
+ {
225
+ event: 'media_update',
226
+ call_id: oc.id,
227
+ status: 'ok',
228
+ },
229
+ {
230
+ event: 'media_update',
231
+ call_id: ic.id,
232
+ status: 'ok',
233
+ },
234
+ ], 500)
235
+
236
+ sip.call.send_dtmf(oc.id, {digits: '1234', mode: 0})
237
+ sip.call.send_dtmf(ic.id, {digits: '4321', mode: 1})
238
+
239
+ await z.wait([
240
+ {
241
+ event: 'dtmf',
242
+ call_id: ic.id,
243
+ digits: '1234',
244
+ mode: 0,
245
+ media_id: 0
246
+ },
247
+ {
248
+ event: 'dtmf',
249
+ call_id: oc.id,
250
+ digits: '4321',
251
+ mode: 1,
252
+ media_id: 0
253
+ },
254
+ ], 1500)
255
+
256
+ //await z.sleep(100)
257
+ sip.call.reinvite(ic.id, {media: [{type: 'audio', fields: ['a=sendonly']}]})
258
+
259
+ await z.wait([
260
+ {
261
+ event: 'reinvite',
262
+ call_id: oc.id,
263
+ msg: sip_msg({
264
+ $rb: '!{_}a=sendonly',
265
+ }),
266
+ },
267
+ ], 500)
268
+
269
+ sip.call.respond(oc.id, {code: 200, reason: 'OK'})
270
+
271
+ await z.wait([
272
+ {
273
+ event: 'response',
274
+ call_id: ic.id,
275
+ method: 'INVITE',
276
+ msg: sip_msg({
277
+ $rs: '100',
278
+ }),
279
+ },
280
+ {
281
+ event: 'response',
282
+ call_id: ic.id,
283
+ method: 'INVITE',
284
+ msg: sip_msg({
285
+ $rs: '200',
286
+ $rr: 'OK',
287
+ }),
288
+ },
289
+ {
290
+ event: 'media_update',
291
+ call_id: oc.id,
292
+ status: 'ok',
293
+ },
294
+ {
295
+ event: 'media_update',
296
+ call_id: ic.id,
297
+ status: 'ok',
298
+ },
299
+ ], 500)
300
+
301
+ sip.call.send_dtmf(oc.id, {digits: '1234', mode: 0}) // This will not generate event 'dtmf' because this side of the call is on hold
302
+ sip.call.send_dtmf(ic.id, {digits: '4321', mode: 1})
303
+
304
+ await z.wait([
305
+ {
306
+ event: 'dtmf',
307
+ call_id: oc.id,
308
+ digits: '4321',
309
+ mode: 1,
310
+ media_id: 0
311
+ },
312
+ ], 1500)
313
+
314
+ sip.call.reinvite(ic.id) // defaule mode is 'sendrecv' so this will put the call off hold
315
+
316
+ await z.wait([
317
+ {
318
+ event: 'reinvite',
319
+ call_id: oc.id,
320
+ msg: sip_msg({
321
+ $rb: '!{_}a=sendrecv',
322
+ }),
323
+ },
324
+ ], 500)
325
+
326
+ sip.call.respond(oc.id, {code: 200, reason: 'OK'})
327
+
328
+ await z.wait([
329
+ {
330
+ event: 'response',
331
+ call_id: ic.id,
332
+ method: 'INVITE',
333
+ msg: sip_msg({
334
+ $rs: '100',
335
+ }),
336
+ },
337
+ {
338
+ event: 'response',
339
+ call_id: ic.id,
340
+ method: 'INVITE',
341
+ msg: sip_msg({
342
+ $rs: '200',
343
+ $rr: 'OK',
344
+ $rb: '!{_}a=sendrecv',
345
+ }),
346
+ },
347
+ {
348
+ event: 'media_update',
349
+ call_id: ic.id,
350
+ status: 'ok',
351
+ },
352
+ {
353
+ event: 'media_update',
354
+ call_id: oc.id,
355
+ status: 'ok',
356
+ },
357
+ ], 500)
358
+
359
+ sip.call.send_dtmf(oc.id, {digits: '1234', mode: 0})
360
+ sip.call.send_dtmf(ic.id, {digits: '4321', mode: 1})
361
+
362
+ await z.wait([
363
+ {
364
+ event: 'dtmf',
365
+ call_id: ic.id,
366
+ digits: '1234',
367
+ mode: 0,
368
+ media_id: 0
369
+ },
370
+ {
371
+ event: 'dtmf',
372
+ call_id: oc.id,
373
+ digits: '4321',
374
+ mode: 1,
375
+ media_id: 0
376
+ },
377
+ ], 1500)
378
+
379
+ sip.call.terminate(oc.id)
380
+
381
+ await z.wait([
382
+ {
383
+ event: 'call_ended',
384
+ call_id: oc.id,
385
+ },
386
+ {
387
+ event: 'call_ended',
388
+ call_id: ic.id,
389
+ },
390
+ {
391
+ event: 'response',
392
+ call_id: oc.id,
393
+ method: 'BYE',
394
+ msg: sip_msg({
395
+ $rs: '200',
396
+ $rr: 'OK',
397
+ }),
398
+ },
399
+ ], 1000)
400
+
401
+ console.log("Success")
402
+
403
+ sip.stop()
404
+ }
405
+
406
+
407
+ test()
408
+ .catch(e => {
409
+ console.error(e)
410
+ process.exit(1)
411
+ })
412
+