sip-lab 1.2.4
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 +38 -0
- package/a.js +280 -0
- package/binding.gyp +101 -0
- package/devjournal +435 -0
- package/index.js +68 -0
- package/install.sh +32 -0
- package/package.json +30 -0
- package/samples/late_negotiation.js +278 -0
- package/samples/simple.js +280 -0
- package/samples/sip_cancel.js +111 -0
- package/src/Makefile +42 -0
- package/src/README +3 -0
- package/src/addon.cpp +1418 -0
- package/src/event_templates.cpp +55 -0
- package/src/event_templates.hpp +27 -0
- package/src/idmanager.cpp +76 -0
- package/src/idmanager.hpp +26 -0
- package/src/log.cpp +18 -0
- package/src/log.hpp +15 -0
- package/src/packetdumper.cpp +234 -0
- package/src/packetdumper.hpp +67 -0
- package/src/pjmedia/Makefile +37 -0
- package/src/pjmedia/devjournal +26 -0
- package/src/pjmedia/include/chainlink/README +3 -0
- package/src/pjmedia/include/chainlink/chainlink.h +11 -0
- package/src/pjmedia/include/chainlink/chainlink_dtmfdet.h +56 -0
- package/src/pjmedia/include/chainlink/chainlink_tonegen.h +178 -0
- package/src/pjmedia/include/chainlink/chainlink_wav_port.h +231 -0
- package/src/pjmedia/include/chainlink/chainlink_wire_port.h +50 -0
- package/src/pjmedia/include/pjmedia/README +3 -0
- package/src/pjmedia/include/pjmedia/dtmfdet.h +74 -0
- package/src/pjmedia/src/chainlink/chainlink_dtmfdet.c +125 -0
- package/src/pjmedia/src/chainlink/chainlink_tonegen.c +901 -0
- package/src/pjmedia/src/chainlink/chainlink_wav_player.c +688 -0
- package/src/pjmedia/src/chainlink/chainlink_wav_writer.c +442 -0
- package/src/pjmedia/src/chainlink/chainlink_wire_port.c +93 -0
- package/src/pjmedia/src/pjmedia/dtmfdet.c +129 -0
- package/src/pjmedia/src/pjmedia/simpleua_dtmfdet.c +753 -0
- package/src/pjmedia/src/pjmedia/tonegen_dtmfdet.c +263 -0
- package/src/sip.cpp +4891 -0
- package/src/sip.hpp +64 -0
package/README.md
ADDED
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
## sip-lab
|
|
2
|
+
|
|
3
|
+
Node module that helps to write functional tests for SIP systems (including media operations).
|
|
4
|
+
It uses pjproject for SIP and media processing.
|
|
5
|
+
|
|
6
|
+
This will require for you to have some libraries installed. So do:
|
|
7
|
+
```
|
|
8
|
+
apt install build-essential automake autoconf libtool libspeex-dev libopus-dev libsdl2-dev libavdevice-dev libswscale-dev libv4l-dev libopencore-amrnb-dev libopencore-amrwb-dev libvo-amrwbenc-dev libopus-dev libsdl2-dev libopencore-amrnb-dev libopencore-amrwb-dev libvo-amrwbenc-dev libboost-dev libspandsp-dev libpcap-dev libssl-dev uuid-dev
|
|
9
|
+
```
|
|
10
|
+
|
|
11
|
+
Then install sip-lab by doing:
|
|
12
|
+
```
|
|
13
|
+
npm install sip-lab
|
|
14
|
+
```
|
|
15
|
+
|
|
16
|
+
However, since it takes a long time to fetch and build pjproject and the node addon for it, you could install sip-lab globally:
|
|
17
|
+
```
|
|
18
|
+
npm install -g sip-lab
|
|
19
|
+
```
|
|
20
|
+
|
|
21
|
+
But if you do so, you will need to set NODE_PATH for node to find it by doing:
|
|
22
|
+
```
|
|
23
|
+
export NODE_PATH=$(npm root --quiet -g)
|
|
24
|
+
```
|
|
25
|
+
|
|
26
|
+
To test from within this repo just run:
|
|
27
|
+
```
|
|
28
|
+
npm install --unsafe-perm
|
|
29
|
+
|
|
30
|
+
node samples/simple.js
|
|
31
|
+
```
|
|
32
|
+
|
|
33
|
+
|
|
34
|
+
The module is known to work properly in Ubuntu 18.04.4, Debian 8 and Debian 10 (and it is expected to work in Debian 9).
|
|
35
|
+
It was originally developed with node v.10 and tested with v.12 and it is expected to work with latest versions of node.
|
|
36
|
+
(it is known to not work with node v.8)
|
|
37
|
+
|
|
38
|
+
|
package/a.js
ADDED
|
@@ -0,0 +1,280 @@
|
|
|
1
|
+
var sip = require ('sip-lab')
|
|
2
|
+
var z = require('zester')
|
|
3
|
+
var m = require('data-matching')
|
|
4
|
+
var sip_msg = require('sip-matching')
|
|
5
|
+
|
|
6
|
+
//sip.set_log_level(6)
|
|
7
|
+
sip.dtmf_aggregation_on(500)
|
|
8
|
+
|
|
9
|
+
z.trap_events(sip.event_source, 'event', (evt) => {
|
|
10
|
+
var e = evt.args[0]
|
|
11
|
+
return e
|
|
12
|
+
})
|
|
13
|
+
|
|
14
|
+
console.log(sip.start((data) => { console.log(data)} ))
|
|
15
|
+
|
|
16
|
+
t1 = sip.transport.create("127.0.0.1", 5090, 1)
|
|
17
|
+
t2 = sip.transport.create("127.0.0.1", 5092, 1)
|
|
18
|
+
|
|
19
|
+
console.log("t1", t1)
|
|
20
|
+
console.log("t2", t2)
|
|
21
|
+
|
|
22
|
+
flags = 0
|
|
23
|
+
|
|
24
|
+
oc = sip.call.create(t1.id, flags, 'sip:a@t', 'sip:b@127.0.0.1:5092')
|
|
25
|
+
|
|
26
|
+
z.wait([
|
|
27
|
+
{
|
|
28
|
+
event: "incoming_call",
|
|
29
|
+
call_id: m.collect("call_id"),
|
|
30
|
+
},
|
|
31
|
+
{
|
|
32
|
+
event: 'response',
|
|
33
|
+
call_id: oc.id,
|
|
34
|
+
method: 'INVITE',
|
|
35
|
+
msg: sip_msg({
|
|
36
|
+
$rs: '100',
|
|
37
|
+
$rr: 'Trying',
|
|
38
|
+
'$(hdrcnt(via))': 1,
|
|
39
|
+
'$hdr(call-id)': m.collect('sip_call_id'),
|
|
40
|
+
$fU: 'a',
|
|
41
|
+
$fd: 't',
|
|
42
|
+
$tU: 'b',
|
|
43
|
+
'$hdr(l)': '0',
|
|
44
|
+
}),
|
|
45
|
+
},
|
|
46
|
+
], 1000)
|
|
47
|
+
|
|
48
|
+
ic = {
|
|
49
|
+
id: z.store.call_id,
|
|
50
|
+
sip_call_id: z.store.sip_call_id,
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
sip.call.respond(ic.id, 200, 'OK')
|
|
54
|
+
|
|
55
|
+
z.wait([
|
|
56
|
+
{
|
|
57
|
+
event: 'media_status',
|
|
58
|
+
call_id: oc.id,
|
|
59
|
+
status: 'setup_ok',
|
|
60
|
+
local_mode: 'sendrecv',
|
|
61
|
+
remote_mode: 'sendrecv',
|
|
62
|
+
},
|
|
63
|
+
{
|
|
64
|
+
event: 'media_status',
|
|
65
|
+
call_id: ic.id,
|
|
66
|
+
status: 'setup_ok',
|
|
67
|
+
local_mode: 'sendrecv',
|
|
68
|
+
remote_mode: 'sendrecv',
|
|
69
|
+
},
|
|
70
|
+
{
|
|
71
|
+
event: 'response',
|
|
72
|
+
call_id: oc.id,
|
|
73
|
+
method: 'INVITE',
|
|
74
|
+
msg: sip_msg({
|
|
75
|
+
$rs: '200',
|
|
76
|
+
$rr: 'OK',
|
|
77
|
+
'$(hdrcnt(VIA))': 1,
|
|
78
|
+
$fU: 'a',
|
|
79
|
+
$fd: 't',
|
|
80
|
+
$tU: 'b',
|
|
81
|
+
'$hdr(content-type)': 'application/sdp',
|
|
82
|
+
$rb: '!{_}a=sendrecv',
|
|
83
|
+
}),
|
|
84
|
+
},
|
|
85
|
+
], 1000)
|
|
86
|
+
|
|
87
|
+
sip.call.send_dtmf(oc.id, '1234', 0)
|
|
88
|
+
sip.call.send_dtmf(ic.id, '4321', 1)
|
|
89
|
+
|
|
90
|
+
z.wait([
|
|
91
|
+
{
|
|
92
|
+
event: 'dtmf',
|
|
93
|
+
call_id: ic.id,
|
|
94
|
+
digits: '1234',
|
|
95
|
+
mode: 0,
|
|
96
|
+
},
|
|
97
|
+
{
|
|
98
|
+
event: 'dtmf',
|
|
99
|
+
call_id: oc.id,
|
|
100
|
+
digits: '4321',
|
|
101
|
+
mode: 1,
|
|
102
|
+
},
|
|
103
|
+
], 2000)
|
|
104
|
+
|
|
105
|
+
|
|
106
|
+
sip.call.reinvite(oc.id, true, 0)
|
|
107
|
+
|
|
108
|
+
z.wait([
|
|
109
|
+
{
|
|
110
|
+
event: 'response',
|
|
111
|
+
call_id: oc.id,
|
|
112
|
+
method: 'INVITE',
|
|
113
|
+
msg: sip_msg({
|
|
114
|
+
$rs: '200',
|
|
115
|
+
$rr: 'OK',
|
|
116
|
+
$rb: '!{_}a=recvonly',
|
|
117
|
+
}),
|
|
118
|
+
},
|
|
119
|
+
{
|
|
120
|
+
event: 'media_status',
|
|
121
|
+
call_id: oc.id,
|
|
122
|
+
status: 'setup_ok',
|
|
123
|
+
local_mode: 'sendonly',
|
|
124
|
+
remote_mode: 'recvonly',
|
|
125
|
+
},
|
|
126
|
+
{
|
|
127
|
+
event: 'media_status',
|
|
128
|
+
call_id: ic.id,
|
|
129
|
+
status: 'setup_ok',
|
|
130
|
+
local_mode: 'recvonly',
|
|
131
|
+
remote_mode: 'sendonly',
|
|
132
|
+
},
|
|
133
|
+
], 500)
|
|
134
|
+
|
|
135
|
+
sip.call.send_dtmf(oc.id, '1234', 0)
|
|
136
|
+
sip.call.send_dtmf(ic.id, '4321', 1) // this will not generate event 'dtmf' as the call is on hold
|
|
137
|
+
|
|
138
|
+
z.wait([
|
|
139
|
+
{
|
|
140
|
+
event: 'dtmf',
|
|
141
|
+
call_id: ic.id,
|
|
142
|
+
digits: '1234',
|
|
143
|
+
mode: 0,
|
|
144
|
+
},
|
|
145
|
+
], 2000)
|
|
146
|
+
|
|
147
|
+
sip.call.reinvite(ic.id, false, 0)
|
|
148
|
+
|
|
149
|
+
z.wait([
|
|
150
|
+
{
|
|
151
|
+
event: 'response',
|
|
152
|
+
call_id: ic.id,
|
|
153
|
+
method: 'INVITE',
|
|
154
|
+
msg: sip_msg({
|
|
155
|
+
$rs: '200',
|
|
156
|
+
$rr: 'OK',
|
|
157
|
+
$rb: '!{_}a=sendonly',
|
|
158
|
+
}),
|
|
159
|
+
},
|
|
160
|
+
{
|
|
161
|
+
event: 'media_status',
|
|
162
|
+
call_id: oc.id,
|
|
163
|
+
status: 'setup_ok',
|
|
164
|
+
local_mode: 'sendonly',
|
|
165
|
+
remote_mode: 'recvonly',
|
|
166
|
+
},
|
|
167
|
+
{
|
|
168
|
+
event: 'media_status',
|
|
169
|
+
call_id: ic.id,
|
|
170
|
+
status: 'setup_ok',
|
|
171
|
+
local_mode: 'recvonly',
|
|
172
|
+
remote_mode: 'sendonly',
|
|
173
|
+
},
|
|
174
|
+
], 500)
|
|
175
|
+
|
|
176
|
+
sip.call.send_dtmf(oc.id, '1234', 0)
|
|
177
|
+
sip.call.send_dtmf(ic.id, '4321', 1) // this will not generate event 'dtmf' as the call is on hold
|
|
178
|
+
|
|
179
|
+
z.wait([
|
|
180
|
+
{
|
|
181
|
+
event: 'dtmf',
|
|
182
|
+
call_id: ic.id,
|
|
183
|
+
digits: '1234',
|
|
184
|
+
mode: 0,
|
|
185
|
+
},
|
|
186
|
+
], 2000)
|
|
187
|
+
|
|
188
|
+
sip.call.send_request(oc.id, 'INFO')
|
|
189
|
+
|
|
190
|
+
z.wait([
|
|
191
|
+
{
|
|
192
|
+
event: 'request',
|
|
193
|
+
call_id: ic.id,
|
|
194
|
+
msg: sip_msg({
|
|
195
|
+
$rm: 'INFO',
|
|
196
|
+
}),
|
|
197
|
+
},
|
|
198
|
+
{
|
|
199
|
+
event: 'response',
|
|
200
|
+
call_id: oc.id,
|
|
201
|
+
method: 'INFO',
|
|
202
|
+
msg: sip_msg({
|
|
203
|
+
$rs: '200',
|
|
204
|
+
$rr: 'OK',
|
|
205
|
+
}),
|
|
206
|
+
},
|
|
207
|
+
], 500)
|
|
208
|
+
|
|
209
|
+
sip.call.reinvite(oc.id, false, 0)
|
|
210
|
+
|
|
211
|
+
z.wait([
|
|
212
|
+
{
|
|
213
|
+
event: 'response',
|
|
214
|
+
call_id: oc.id,
|
|
215
|
+
method: 'INVITE',
|
|
216
|
+
msg: sip_msg({
|
|
217
|
+
$rs: '200',
|
|
218
|
+
$rr: 'OK',
|
|
219
|
+
$rb: '!{_}a=sendrecv',
|
|
220
|
+
}),
|
|
221
|
+
},
|
|
222
|
+
{
|
|
223
|
+
event: 'media_status',
|
|
224
|
+
call_id: oc.id,
|
|
225
|
+
status: 'setup_ok',
|
|
226
|
+
local_mode: 'sendrecv',
|
|
227
|
+
remote_mode: 'sendrecv',
|
|
228
|
+
},
|
|
229
|
+
{
|
|
230
|
+
event: 'media_status',
|
|
231
|
+
call_id: ic.id,
|
|
232
|
+
status: 'setup_ok',
|
|
233
|
+
local_mode: 'sendrecv',
|
|
234
|
+
remote_mode: 'sendrecv',
|
|
235
|
+
},
|
|
236
|
+
], 500)
|
|
237
|
+
|
|
238
|
+
sip.call.send_dtmf(oc.id, '1234', 0)
|
|
239
|
+
sip.call.send_dtmf(ic.id, '4321', 1)
|
|
240
|
+
|
|
241
|
+
z.wait([
|
|
242
|
+
{
|
|
243
|
+
event: 'dtmf',
|
|
244
|
+
call_id: ic.id,
|
|
245
|
+
digits: '1234',
|
|
246
|
+
mode: 0,
|
|
247
|
+
},
|
|
248
|
+
{
|
|
249
|
+
event: 'dtmf',
|
|
250
|
+
call_id: oc.id,
|
|
251
|
+
digits: '4321',
|
|
252
|
+
mode: 1,
|
|
253
|
+
},
|
|
254
|
+
], 2000)
|
|
255
|
+
|
|
256
|
+
sip.call.terminate(oc.id)
|
|
257
|
+
|
|
258
|
+
z.wait([
|
|
259
|
+
{
|
|
260
|
+
event: 'call_ended',
|
|
261
|
+
call_id: oc.id,
|
|
262
|
+
},
|
|
263
|
+
{
|
|
264
|
+
event: 'call_ended',
|
|
265
|
+
call_id: ic.id,
|
|
266
|
+
},
|
|
267
|
+
{
|
|
268
|
+
event: 'response',
|
|
269
|
+
call_id: oc.id,
|
|
270
|
+
method: 'BYE',
|
|
271
|
+
msg: sip_msg({
|
|
272
|
+
$rs: '200',
|
|
273
|
+
$rr: 'OK',
|
|
274
|
+
}),
|
|
275
|
+
},
|
|
276
|
+
], 1000)
|
|
277
|
+
|
|
278
|
+
z.sleep(1000)
|
|
279
|
+
|
|
280
|
+
sip.stop()
|
package/binding.gyp
ADDED
|
@@ -0,0 +1,101 @@
|
|
|
1
|
+
{
|
|
2
|
+
'targets': [
|
|
3
|
+
{
|
|
4
|
+
'target_name': 'addon',
|
|
5
|
+
'sources': [
|
|
6
|
+
'src/log.cpp',
|
|
7
|
+
'src/event_templates.cpp',
|
|
8
|
+
'src/idmanager.cpp',
|
|
9
|
+
'src/packetdumper.cpp',
|
|
10
|
+
'src/sip.cpp',
|
|
11
|
+
'src/addon.cpp',
|
|
12
|
+
'src/pjmedia/src/chainlink/chainlink_dtmfdet.c',
|
|
13
|
+
'src/pjmedia/src/chainlink/chainlink_tonegen.c',
|
|
14
|
+
'src/pjmedia/src/chainlink/chainlink_wav_player.c',
|
|
15
|
+
'src/pjmedia/src/chainlink/chainlink_wav_writer.c',
|
|
16
|
+
'src/pjmedia/src/chainlink/chainlink_wire_port.c',
|
|
17
|
+
],
|
|
18
|
+
'include_dirs': [
|
|
19
|
+
"pjproject/pjsip/include",
|
|
20
|
+
"pjproject/pjlib/include",
|
|
21
|
+
"pjproject/pjlib-util/include",
|
|
22
|
+
"pjproject/pjnath/include",
|
|
23
|
+
"pjproject/pjmedia/include",
|
|
24
|
+
"src",
|
|
25
|
+
"src/pjmedia/include",
|
|
26
|
+
"src/pjmedia/include/pjmedia",
|
|
27
|
+
"src/pjmedia/include/chainlink",
|
|
28
|
+
"<!@(node -p \"require('node-addon-api').include\")",
|
|
29
|
+
],
|
|
30
|
+
"dependencies": [
|
|
31
|
+
"<!@(node -p \"require('node-addon-api').gyp\")"
|
|
32
|
+
],
|
|
33
|
+
'conditions': [
|
|
34
|
+
[ 'OS!="win"', {
|
|
35
|
+
'cflags_cc': [
|
|
36
|
+
'-g',
|
|
37
|
+
'-fexceptions',
|
|
38
|
+
'-Wno-maybe-uninitialized',
|
|
39
|
+
'-fPIC',
|
|
40
|
+
],
|
|
41
|
+
}
|
|
42
|
+
]
|
|
43
|
+
],
|
|
44
|
+
'link_settings': {
|
|
45
|
+
'libraries': [
|
|
46
|
+
'-L ../pjproject/pjnath/lib',
|
|
47
|
+
'-L ../pjproject/pjlib/lib',
|
|
48
|
+
'-L ../pjproject/pjlib-util/lib',
|
|
49
|
+
'-L ../pjproject/third_party/lib',
|
|
50
|
+
'-L ../pjproject/pjmedia/lib',
|
|
51
|
+
'-L ../pjproject/pjsip/lib',
|
|
52
|
+
'-L ../pjproject/third_party/lib',
|
|
53
|
+
'-l pjnath-x86_64-unknown-linux-gnu',
|
|
54
|
+
'-l ilbccodec-x86_64-unknown-linux-gnu',
|
|
55
|
+
'-l srtp-x86_64-unknown-linux-gnu',
|
|
56
|
+
'-l webrtc-x86_64-unknown-linux-gnu',
|
|
57
|
+
'-l yuv-x86_64-unknown-linux-gnu',
|
|
58
|
+
'-l speex-x86_64-unknown-linux-gnu',
|
|
59
|
+
'-l gsmcodec-x86_64-unknown-linux-gnu',
|
|
60
|
+
'-l g7221codec-x86_64-unknown-linux-gnu',
|
|
61
|
+
'-l resample-x86_64-unknown-linux-gnu',
|
|
62
|
+
'-l pjmedia-audiodev-x86_64-unknown-linux-gnu',
|
|
63
|
+
'-l pjmedia-codec-x86_64-unknown-linux-gnu',
|
|
64
|
+
'-l pjmedia-videodev-x86_64-unknown-linux-gnu',
|
|
65
|
+
'-l pjmedia-x86_64-unknown-linux-gnu',
|
|
66
|
+
'-l pjsdp-x86_64-unknown-linux-gnu',
|
|
67
|
+
'-l pjsip-x86_64-unknown-linux-gnu',
|
|
68
|
+
'-l pjsua2-x86_64-unknown-linux-gnu',
|
|
69
|
+
'-l pjsip-ua-x86_64-unknown-linux-gnu',
|
|
70
|
+
'-l pjsip-simple-x86_64-unknown-linux-gnu',
|
|
71
|
+
'-l pjsua-x86_64-unknown-linux-gnu',
|
|
72
|
+
'-l pj-x86_64-unknown-linux-gnu',
|
|
73
|
+
'-l pjlib-util-x86_64-unknown-linux-gnu',
|
|
74
|
+
'-lstdc++',
|
|
75
|
+
'-lopus',
|
|
76
|
+
'-lssl',
|
|
77
|
+
'-lcrypto',
|
|
78
|
+
'-luuid',
|
|
79
|
+
'-lm',
|
|
80
|
+
'-ldl',
|
|
81
|
+
'-lspandsp',
|
|
82
|
+
'-lpcap',
|
|
83
|
+
'-lrt',
|
|
84
|
+
'-lpthread',
|
|
85
|
+
'-lasound',
|
|
86
|
+
'-lSDL2',
|
|
87
|
+
'-lavdevice',
|
|
88
|
+
'-lavformat',
|
|
89
|
+
'-lavcodec',
|
|
90
|
+
'-lswscale',
|
|
91
|
+
'-lavutil',
|
|
92
|
+
'-lv4l2',
|
|
93
|
+
'-lopencore-amrnb',
|
|
94
|
+
'-lopencore-amrwb',
|
|
95
|
+
'-lvo-amrwbenc',
|
|
96
|
+
'-lspeex',
|
|
97
|
+
],
|
|
98
|
+
},
|
|
99
|
+
},
|
|
100
|
+
]
|
|
101
|
+
}
|