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 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 message is built you can pass them to prebuildify-cross:
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
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "sip-lab",
3
- "version": "1.38.0",
3
+ "version": "1.39.0",
4
4
  "description": "",
5
5
  "main": "index.js",
6
6
  "engines": {
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
- printf("on_data_read\n");
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) return PJ_FALSE;
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
- assert(size + ud->len + 1 < MAX_TCP_DATA);
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
- char *sep = strstr(ud->buf, "\r\n\r\n");
1113
- if(!sep) {
1114
- // msg incomplete
1115
- *remainder = 0;
1116
- return PJ_TRUE;
1117
- }
1114
+ while (true) {
1115
+ char *sep = strstr(ud->buf, "\r\n\r\n");
1116
+ if (!sep) {
1117
+ break;
1118
+ }
1118
1119
 
1119
- int msg_size;
1120
+ int msg_size;
1120
1121
 
1121
- char *hdr_cl = strcasestr(ud->buf, "content-length:");
1122
- if(!hdr_cl) {
1123
- // no body, only headers
1124
- msg_size = sep + 4 - ud->buf;
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
- char num_str[8];
1130
- char *start = hdr_cl+16;
1131
- int len = end_of_line - start;
1132
- strncpy(num_str, start, len);
1133
- num_str[len] = '\0';
1134
- int body_len = atoi(num_str);
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
- assert(body_len > 0 && body_len < 4096);
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
- if(ud->buf+ud->len < sep+4+body_len) {
1139
- //printf("tcp data: msg incomplete %i %i\n", ud->buf+ud->len, sep+4+body_len);
1140
- *remainder = 0;
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
- msg_size = sep+4+body_len - ud->buf;
1163
+ ud->len = remain_len;
1164
+ ud->buf[ud->len] = '\0';
1145
1165
  }
1146
1166
 
1147
- printf("on_data_read msg_size=%d\n", msg_size);
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