sip-lab 1.38.0 → 1.39.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.
- package/DEV.md +2 -2
- package/package.json +1 -1
- package/prebuilds/linux-x64/node.abi102.node +0 -0
- package/prebuilds/linux-x64/node.abi108.node +0 -0
- package/prebuilds/linux-x64/node.abi111.node +0 -0
- package/prebuilds/linux-x64/node.abi115.node +0 -0
- package/prebuilds/linux-x64/node.abi120.node +0 -0
- package/prebuilds/linux-x64/node.abi88.node +0 -0
- package/prebuilds/linux-x64/node.abi93.node +0 -0
- package/samples/mrcp_and_audio.no_rest_between_msgs.js +254 -0
- package/src/sip.cpp +55 -46
- package/samples/ic.wav +0 -0
- package/samples/oc.wav +0 -0
- package/src/sip.cpp.old +0 -9236
package/DEV.md
CHANGED
|
@@ -6,7 +6,7 @@ Basic tasks for development:
|
|
|
6
6
|
|
|
7
7
|
#### To build
|
|
8
8
|
```
|
|
9
|
-
sudo 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 libvo-amrwbenc-dev libboost-dev libtiff-dev libpcap-dev libssl-dev uuid-dev cmake
|
|
9
|
+
sudo 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 libvo-amrwbenc-dev libboost-dev libtiff-dev libpcap-dev libssl-dev uuid-dev cmake flite-dev
|
|
10
10
|
|
|
11
11
|
npm install
|
|
12
12
|
```
|
|
@@ -73,7 +73,7 @@ If it fails due to proxy problems, check if you have proxy configured in ~/.dock
|
|
|
73
73
|
|
|
74
74
|
```
|
|
75
75
|
|
|
76
|
-
After the
|
|
76
|
+
After the image is built you can pass them to prebuildify-cross:
|
|
77
77
|
```
|
|
78
78
|
nvm use v16.13.1
|
|
79
79
|
npx prebuildify-cross -i mayamatakeshi/sip-lab-debian11:latest -t 15.0.0 -t 16.0.0 -t 17.0.0 -t 18.0.0 -t 19.0.0 -t 20.0.0 -t 21.0.0 --strip
|
package/package.json
CHANGED
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
@@ -0,0 +1,254 @@
|
|
|
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
|
+
var mrcp = require('mrcp')
|
|
8
|
+
var mrcp_msg = require('mrcp-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", type: 'udp'})
|
|
24
|
+
var t2 = sip.transport.create({address: "127.0.0.1", 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
|
+
'$hdr(call-id)': m.collect('sip_call_id'),
|
|
85
|
+
}),
|
|
86
|
+
},
|
|
87
|
+
], 1000)
|
|
88
|
+
|
|
89
|
+
ic = {
|
|
90
|
+
id: z.$call_id,
|
|
91
|
+
sip_call_id: z.$sip_call_id,
|
|
92
|
+
}
|
|
93
|
+
|
|
94
|
+
sip.call.respond(ic.id, {
|
|
95
|
+
code: 200,
|
|
96
|
+
reason: 'OK',
|
|
97
|
+
media: server_media,
|
|
98
|
+
})
|
|
99
|
+
|
|
100
|
+
await z.wait([
|
|
101
|
+
{
|
|
102
|
+
event: 'response',
|
|
103
|
+
call_id: oc.id,
|
|
104
|
+
method: 'INVITE',
|
|
105
|
+
msg: sip_msg({
|
|
106
|
+
$rs: '200',
|
|
107
|
+
$rr: 'OK',
|
|
108
|
+
'$hdr(content-type)': 'application/sdp',
|
|
109
|
+
$rb: sdp.jsonpath_matcher({
|
|
110
|
+
'$.media[?(@.desc.type=="application")].val_attrs.channel': [m.collect('mrcp_channel')],
|
|
111
|
+
}),
|
|
112
|
+
}),
|
|
113
|
+
},
|
|
114
|
+
{
|
|
115
|
+
event: 'media_update',
|
|
116
|
+
call_id: oc.id,
|
|
117
|
+
status: 'ok',
|
|
118
|
+
media: [
|
|
119
|
+
{
|
|
120
|
+
type: 'mrcp',
|
|
121
|
+
local: {
|
|
122
|
+
port: 9
|
|
123
|
+
},
|
|
124
|
+
remote: {
|
|
125
|
+
port: m.collect('mrcp_server_port'),
|
|
126
|
+
},
|
|
127
|
+
},
|
|
128
|
+
{
|
|
129
|
+
type: 'audio',
|
|
130
|
+
local: {
|
|
131
|
+
mode: 'recvonly'
|
|
132
|
+
},
|
|
133
|
+
remote: {
|
|
134
|
+
mode: 'sendonly'
|
|
135
|
+
}
|
|
136
|
+
}
|
|
137
|
+
],
|
|
138
|
+
},
|
|
139
|
+
{
|
|
140
|
+
event: 'media_update',
|
|
141
|
+
call_id: ic.id,
|
|
142
|
+
status: 'ok',
|
|
143
|
+
media: [
|
|
144
|
+
{
|
|
145
|
+
type: 'mrcp',
|
|
146
|
+
local: {
|
|
147
|
+
port: m.collect('mrcp_server_port'),
|
|
148
|
+
},
|
|
149
|
+
remote: {
|
|
150
|
+
port: 9
|
|
151
|
+
}
|
|
152
|
+
},
|
|
153
|
+
{
|
|
154
|
+
type: 'audio',
|
|
155
|
+
local: {
|
|
156
|
+
mode: 'sendonly'
|
|
157
|
+
},
|
|
158
|
+
remote: {
|
|
159
|
+
mode: 'recvonly'
|
|
160
|
+
}
|
|
161
|
+
}
|
|
162
|
+
],
|
|
163
|
+
},
|
|
164
|
+
], 1000)
|
|
165
|
+
|
|
166
|
+
var mrcp_channel = z.$mrcp_channel
|
|
167
|
+
var request_id = 1;
|
|
168
|
+
var msg = mrcp.builder.build_request('SPEAK', request_id, {'channel-identifier': mrcp_channel, 'content-type': 'application/xml'}, "<root>test</root>")
|
|
169
|
+
|
|
170
|
+
sip.call.send_mrcp_msg(oc.id, {msg})
|
|
171
|
+
|
|
172
|
+
await z.wait([
|
|
173
|
+
{
|
|
174
|
+
event: 'mrcp_msg',
|
|
175
|
+
call_id: ic.id,
|
|
176
|
+
msg: mrcp_msg({
|
|
177
|
+
type: 'request',
|
|
178
|
+
version: '2.0',
|
|
179
|
+
method: 'SPEAK',
|
|
180
|
+
request_id: 1,
|
|
181
|
+
headers: {
|
|
182
|
+
'content-type': 'application/xml',
|
|
183
|
+
},
|
|
184
|
+
body: '<root>test</root>',
|
|
185
|
+
}),
|
|
186
|
+
},
|
|
187
|
+
], 1000)
|
|
188
|
+
|
|
189
|
+
msg = mrcp.builder.build_response(request_id, 200, 'IN-PROGRESS', {'channel-identifier': mrcp_channel})
|
|
190
|
+
sip.call.send_mrcp_msg(ic.id, {msg})
|
|
191
|
+
|
|
192
|
+
msg = mrcp.builder.build_event('SPEAK-COMPLETE', request_id, 'COMPLETE', {'channel-identifier': mrcp_channel})
|
|
193
|
+
sip.call.send_mrcp_msg(ic.id, {msg})
|
|
194
|
+
|
|
195
|
+
await z.wait([
|
|
196
|
+
{
|
|
197
|
+
event: 'mrcp_msg',
|
|
198
|
+
call_id: oc.id,
|
|
199
|
+
msg: mrcp_msg({
|
|
200
|
+
type: 'response',
|
|
201
|
+
version: '2.0',
|
|
202
|
+
request_id: 1,
|
|
203
|
+
status_code: 200,
|
|
204
|
+
request_state: 'IN-PROGRESS',
|
|
205
|
+
}),
|
|
206
|
+
},
|
|
207
|
+
{
|
|
208
|
+
event: 'mrcp_msg',
|
|
209
|
+
call_id: oc.id,
|
|
210
|
+
msg: mrcp_msg({
|
|
211
|
+
type: 'event',
|
|
212
|
+
version: '2.0',
|
|
213
|
+
request_id: 1,
|
|
214
|
+
event_name: 'SPEAK-COMPLETE',
|
|
215
|
+
request_state: 'COMPLETE',
|
|
216
|
+
}),
|
|
217
|
+
},
|
|
218
|
+
], 1000)
|
|
219
|
+
|
|
220
|
+
sip.call.terminate(oc.id)
|
|
221
|
+
|
|
222
|
+
await z.wait([
|
|
223
|
+
{
|
|
224
|
+
event: 'call_ended',
|
|
225
|
+
call_id: oc.id,
|
|
226
|
+
},
|
|
227
|
+
{
|
|
228
|
+
event: 'call_ended',
|
|
229
|
+
call_id: ic.id,
|
|
230
|
+
},
|
|
231
|
+
{
|
|
232
|
+
event: 'response',
|
|
233
|
+
call_id: oc.id,
|
|
234
|
+
method: 'BYE',
|
|
235
|
+
msg: sip_msg({
|
|
236
|
+
$rs: '200',
|
|
237
|
+
$rr: 'OK',
|
|
238
|
+
}),
|
|
239
|
+
},
|
|
240
|
+
], 1000)
|
|
241
|
+
|
|
242
|
+
console.log("Success")
|
|
243
|
+
|
|
244
|
+
sip.stop()
|
|
245
|
+
process.exit(0)
|
|
246
|
+
}
|
|
247
|
+
|
|
248
|
+
|
|
249
|
+
test()
|
|
250
|
+
.catch(e => {
|
|
251
|
+
console.error(e)
|
|
252
|
+
process.exit(1)
|
|
253
|
+
})
|
|
254
|
+
|
package/src/sip.cpp
CHANGED
|
@@ -1089,73 +1089,82 @@ static pj_activesock_cb activesock_cb = {&on_data_read, NULL,
|
|
|
1089
1089
|
static pj_bool_t on_data_read(pj_activesock_t *asock, void *data,
|
|
1090
1090
|
pj_size_t size, pj_status_t status,
|
|
1091
1091
|
pj_size_t *remainder) {
|
|
1092
|
-
|
|
1093
|
-
if(status != PJ_SUCCESS) {
|
|
1094
|
-
printf("on_data_read failed\n");
|
|
1092
|
+
if (status != PJ_SUCCESS) {
|
|
1095
1093
|
return PJ_FALSE;
|
|
1096
1094
|
}
|
|
1097
|
-
|
|
1098
|
-
AsockUserData *ud = (AsockUserData*)pj_activesock_get_user_data(asock);
|
|
1099
|
-
if(!ud)
|
|
1095
|
+
|
|
1096
|
+
AsockUserData *ud = (AsockUserData *)pj_activesock_get_user_data(asock);
|
|
1097
|
+
if (!ud)
|
|
1098
|
+
return PJ_FALSE;
|
|
1100
1099
|
|
|
1101
1100
|
if (size == 0) {
|
|
1102
1101
|
// TODO: destroy the activesock.
|
|
1103
1102
|
return PJ_FALSE;
|
|
1104
1103
|
}
|
|
1105
1104
|
|
|
1106
|
-
|
|
1105
|
+
if (size + ud->len + 1 >= MAX_TCP_DATA) {
|
|
1106
|
+
addon_log(L_DBG, "tcp data: buffer overflow");
|
|
1107
|
+
return PJ_FALSE;
|
|
1108
|
+
}
|
|
1107
1109
|
|
|
1108
1110
|
memcpy(&ud->buf[ud->len], data, size);
|
|
1109
1111
|
ud->len = ud->len + size;
|
|
1110
1112
|
ud->buf[ud->len] = '\0';
|
|
1111
1113
|
|
|
1112
|
-
|
|
1113
|
-
|
|
1114
|
-
|
|
1115
|
-
|
|
1116
|
-
|
|
1117
|
-
}
|
|
1114
|
+
while (true) {
|
|
1115
|
+
char *sep = strstr(ud->buf, "\r\n\r\n");
|
|
1116
|
+
if (!sep) {
|
|
1117
|
+
break;
|
|
1118
|
+
}
|
|
1118
1119
|
|
|
1119
|
-
|
|
1120
|
+
int msg_size;
|
|
1120
1121
|
|
|
1121
|
-
|
|
1122
|
-
|
|
1123
|
-
|
|
1124
|
-
|
|
1125
|
-
} else {
|
|
1126
|
-
assert(hdr_cl < sep);
|
|
1127
|
-
char *end_of_line = strstr(hdr_cl, "\r\n");
|
|
1122
|
+
// Search Content-Length only in headers
|
|
1123
|
+
*sep = '\0';
|
|
1124
|
+
char *hdr_cl = strcasestr(ud->buf, "content-length:");
|
|
1125
|
+
*sep = '\r';
|
|
1128
1126
|
|
|
1129
|
-
|
|
1130
|
-
|
|
1131
|
-
|
|
1132
|
-
|
|
1133
|
-
|
|
1134
|
-
|
|
1127
|
+
if (!hdr_cl) {
|
|
1128
|
+
// no body, only headers
|
|
1129
|
+
msg_size = sep + 4 - ud->buf;
|
|
1130
|
+
} else {
|
|
1131
|
+
char *end_of_line = strstr(hdr_cl, "\r\n");
|
|
1132
|
+
if (!end_of_line || end_of_line > sep) {
|
|
1133
|
+
msg_size = sep + 4 - ud->buf;
|
|
1134
|
+
} else {
|
|
1135
|
+
char *start = strchr(hdr_cl, ':');
|
|
1136
|
+
if (start) {
|
|
1137
|
+
start++;
|
|
1138
|
+
while (*start == ' ')
|
|
1139
|
+
start++;
|
|
1140
|
+
int body_len = atoi(start);
|
|
1141
|
+
|
|
1142
|
+
if (ud->len < (pj_size_t)(sep + 4 + body_len - ud->buf)) {
|
|
1143
|
+
// msg incomplete
|
|
1144
|
+
goto done;
|
|
1145
|
+
}
|
|
1146
|
+
msg_size = sep + 4 + body_len - ud->buf;
|
|
1147
|
+
} else {
|
|
1148
|
+
msg_size = sep + 4 - ud->buf;
|
|
1149
|
+
}
|
|
1150
|
+
}
|
|
1151
|
+
}
|
|
1135
1152
|
|
|
1136
|
-
|
|
1153
|
+
char evt[MAX_TCP_DATA + 512];
|
|
1154
|
+
make_evt_tcp_msg(evt, sizeof(evt), ud->call->id,
|
|
1155
|
+
media_type_id_to_media_type_name(ud->media_endpt->type),
|
|
1156
|
+
(char *)ud->buf, msg_size);
|
|
1157
|
+
dispatch_event(evt);
|
|
1137
1158
|
|
|
1138
|
-
|
|
1139
|
-
|
|
1140
|
-
|
|
1141
|
-
return PJ_TRUE;
|
|
1159
|
+
int remain_len = ud->len - msg_size;
|
|
1160
|
+
if (remain_len > 0) {
|
|
1161
|
+
memmove(ud->buf, &ud->buf[msg_size], remain_len);
|
|
1142
1162
|
}
|
|
1143
|
-
|
|
1144
|
-
|
|
1163
|
+
ud->len = remain_len;
|
|
1164
|
+
ud->buf[ud->len] = '\0';
|
|
1145
1165
|
}
|
|
1146
1166
|
|
|
1147
|
-
|
|
1148
|
-
|
|
1149
|
-
char evt[4096];
|
|
1150
|
-
make_evt_tcp_msg(evt, sizeof(evt), ud->call->id, media_type_id_to_media_type_name(ud->media_endpt->type), (char*)ud->buf, msg_size);
|
|
1151
|
-
printf("on_data_read msg=%s\n", evt);
|
|
1152
|
-
dispatch_event(evt);
|
|
1153
|
-
|
|
1154
|
-
int remain_len = ud->len - msg_size;
|
|
1155
|
-
memcpy(ud->buf, &ud->buf[msg_size], remain_len);
|
|
1156
|
-
ud->len = remain_len;
|
|
1157
|
-
ud->buf[ud->len] = '\0';
|
|
1158
|
-
|
|
1167
|
+
done:
|
|
1159
1168
|
*remainder = 0;
|
|
1160
1169
|
return PJ_TRUE;
|
|
1161
1170
|
}
|
package/samples/ic.wav
DELETED
|
Binary file
|
package/samples/oc.wav
DELETED
|
Binary file
|