sip-lab 1.12.39 → 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.
- package/DEV.md +19 -3
- package/README.md +3 -2
- package/binding.gyp +97 -86
- package/build_deps.sh +2 -1
- package/index.js +14 -7
- package/package.json +7 -2
- package/prebuilds/linux-x64/node.abi102.node +0 -0
- package/prebuilds/linux-x64/node.abi108.node +0 -0
- package/prebuilds/linux-x64/node.abi88.node +0 -0
- package/prebuilds/linux-x64/node.abi93.node +0 -0
- package/samples/16_audio_streams.js +179 -0
- package/samples/delayed_media.js +117 -81
- package/samples/g729.js +50 -28
- package/samples/mrcp_and_audio.js +445 -0
- package/samples/mrcp_and_audio.simplified_media.js +273 -0
- package/samples/mrcp_and_audio.switching_order.js +273 -0
- package/samples/options.js +82 -0
- package/samples/refer.js +247 -0
- package/samples/refuse_telephone_event.js +166 -0
- package/samples/register_no_expires.js +82 -0
- package/samples/register_subscribe.js +36 -4
- package/samples/reinvite_and_dtmf.js +236 -161
- package/samples/reinvite_audio_audio.js +320 -0
- package/samples/reinvite_with_hold_unhold.js +412 -0
- package/samples/send_and_receive_fax.js +4 -8
- package/samples/simple.js +5 -9
- package/samples/sip_cancel.js +4 -6
- package/samples/tcp_and_extra_headers.js +98 -45
- package/samples/two_audio_media.js +497 -0
- package/src/addon.cpp +488 -268
- package/src/event_templates.cpp +84 -35
- package/src/event_templates.hpp +22 -12
- package/src/idmanager.cpp +58 -57
- package/src/idmanager.hpp +10 -10
- package/src/log.cpp +9 -11
- package/src/log.hpp +4 -4
- package/src/sip.cpp +6838 -5041
- package/src/sip.hpp +26 -34
- package/src/packetdumper.cpp +0 -234
- package/src/packetdumper.hpp +0 -67
package/src/event_templates.cpp
CHANGED
|
@@ -1,62 +1,111 @@
|
|
|
1
1
|
#include <stdio.h>
|
|
2
2
|
#include <string.h>
|
|
3
3
|
|
|
4
|
-
int make_evt_incoming_call(char *dest, int size, long transport_id,
|
|
5
|
-
|
|
4
|
+
int make_evt_incoming_call(char *dest, int size, long transport_id,
|
|
5
|
+
long call_id, int sip_msg_len, const char *sip_msg) {
|
|
6
|
+
return snprintf(dest, size,
|
|
7
|
+
"{\"event\": \"incoming_call\", \"transport_id\": %ld, "
|
|
8
|
+
"\"call_id\": %ld}\n%.*s",
|
|
9
|
+
transport_id, call_id, sip_msg_len, sip_msg);
|
|
6
10
|
}
|
|
7
11
|
|
|
8
|
-
int make_evt_request(char *dest, int size, const char *entity_type, long id,
|
|
9
|
-
|
|
12
|
+
int make_evt_request(char *dest, int size, const char *entity_type, long id,
|
|
13
|
+
int sip_msg_len, const char *sip_msg) {
|
|
14
|
+
return snprintf(dest, size, "{\"event\": \"request\", \"%s_id\": %ld}\n%.*s",
|
|
15
|
+
entity_type, id, sip_msg_len, sip_msg);
|
|
10
16
|
}
|
|
11
17
|
|
|
12
|
-
int make_evt_response(char *dest, int size, const char *entity_type, long id,
|
|
13
|
-
|
|
18
|
+
int make_evt_response(char *dest, int size, const char *entity_type, long id,
|
|
19
|
+
int mname_len, const char *mname, int sip_msg_len,
|
|
20
|
+
const char *sip_msg) {
|
|
21
|
+
return snprintf(
|
|
22
|
+
dest, size,
|
|
23
|
+
"{\"event\": \"response\", \"%s_id\": %ld, \"method\": \"%.*s\"}\n%.*s",
|
|
24
|
+
entity_type, id, mname_len, mname, sip_msg_len, sip_msg);
|
|
14
25
|
}
|
|
15
26
|
|
|
16
|
-
int
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
27
|
+
int make_evt_media_update(char *dest, int size, long call_id,
|
|
28
|
+
const char *status, const char *media) {
|
|
29
|
+
if (strcmp(status, "ok") == 0) {
|
|
30
|
+
return snprintf(dest, size,
|
|
31
|
+
"{\"event\": \"media_update\", \"call_id\": %ld, "
|
|
32
|
+
"\"status\": \"%s\", \"media\": %s}",
|
|
33
|
+
call_id, status, media);
|
|
34
|
+
} else {
|
|
35
|
+
return snprintf(
|
|
36
|
+
dest, size,
|
|
37
|
+
"{\"event\": \"media_update\", \"call_id\": %ld, \"status\": \"%s\"}",
|
|
38
|
+
call_id, status);
|
|
39
|
+
}
|
|
22
40
|
}
|
|
23
41
|
|
|
24
|
-
int make_evt_dtmf(char *dest, int size, long call_id, int digits_len,
|
|
25
|
-
|
|
42
|
+
int make_evt_dtmf(char *dest, int size, long call_id, int digits_len,
|
|
43
|
+
const char *digits, int mode, int media_id) {
|
|
44
|
+
return snprintf(dest, size,
|
|
45
|
+
"{\"event\": \"dtmf\", \"call_id\": %ld, \"digits\": "
|
|
46
|
+
"\"%.*s\", \"mode\": %i, \"media_id\": %i}",
|
|
47
|
+
call_id, digits_len, digits, mode, media_id);
|
|
26
48
|
}
|
|
27
49
|
|
|
28
|
-
int make_evt_call_ended(char *dest, int size, long call_id, int sip_msg_len,
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
50
|
+
int make_evt_call_ended(char *dest, int size, long call_id, int sip_msg_len,
|
|
51
|
+
const char *sip_msg) {
|
|
52
|
+
printf("make_evt_call_ended sip_msg_len=%i sip_msg=%x\n", sip_msg_len,
|
|
53
|
+
sip_msg);
|
|
54
|
+
if (!sip_msg || sip_msg == (char *)0xc000000000000) {
|
|
55
|
+
// received invalid pointer to sip_msg so do not add the message to the
|
|
56
|
+
// event
|
|
57
|
+
return snprintf(dest, size, "{\"event\": \"call_ended\", \"call_id\": %ld}",
|
|
58
|
+
call_id);
|
|
59
|
+
} else if (sip_msg_len > 500 && sip_msg_len < 2000 && sip_msg) {
|
|
60
|
+
/* sip_msg_len sometimes show up as a large value like sip_msg_len=11560297
|
|
61
|
+
* which seems to be a bug in pjsip */
|
|
62
|
+
return snprintf(dest, size,
|
|
63
|
+
"{\"event\": \"call_ended\", \"call_id\": %ld}\n%.*s",
|
|
64
|
+
call_id, sip_msg_len, sip_msg);
|
|
65
|
+
} else {
|
|
66
|
+
return snprintf(dest, size, "{\"event\": \"call_ended\", \"call_id\": %ld}",
|
|
67
|
+
call_id);
|
|
68
|
+
}
|
|
39
69
|
}
|
|
40
70
|
|
|
41
|
-
int make_evt_non_dialog_request(char *dest, int size,
|
|
42
|
-
|
|
71
|
+
int make_evt_non_dialog_request(char *dest, int size, long transport_id,
|
|
72
|
+
long request_id, int sip_msg_len,
|
|
73
|
+
const char *sip_msg) {
|
|
74
|
+
return snprintf(dest, size,
|
|
75
|
+
"{\"event\": \"non_dialog_request\", \"request_id\": %i, "
|
|
76
|
+
"\"transport_id\": %i}\n%.*s",
|
|
77
|
+
request_id, transport_id, sip_msg_len, sip_msg);
|
|
43
78
|
}
|
|
44
79
|
|
|
45
80
|
int make_evt_internal_error(char *dest, int size, const char *msg) {
|
|
46
|
-
|
|
81
|
+
return snprintf(dest, size,
|
|
82
|
+
"{\"event\": \"internal_error\", \"error\": \"%s\"}", msg);
|
|
47
83
|
}
|
|
48
84
|
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
85
|
+
int make_evt_reinvite(char *dest, int size, long call_id, int sip_msg_len,
|
|
86
|
+
char *sip_msg) {
|
|
87
|
+
return snprintf(dest, size,
|
|
88
|
+
"{\"event\": \"reinvite\", \"call_id\": %i}\n%.*s", call_id,
|
|
89
|
+
sip_msg_len, sip_msg);
|
|
52
90
|
}
|
|
53
|
-
*/
|
|
54
91
|
|
|
55
|
-
int make_evt_registration_status(char *dest, int size, long account_id,
|
|
56
|
-
|
|
92
|
+
int make_evt_registration_status(char *dest, int size, long account_id,
|
|
93
|
+
int code, const char *reason, int expires) {
|
|
94
|
+
return snprintf(dest, size,
|
|
95
|
+
"{\"event\": \"registration_status\", \"account_id\": %ld, "
|
|
96
|
+
"\"code\": %i, \"reason\": \"%s\", \"expires\": %i}",
|
|
97
|
+
account_id, code, reason, expires);
|
|
57
98
|
}
|
|
58
99
|
|
|
59
100
|
int make_evt_fax_result(char *dest, int size, long call_id, int result) {
|
|
60
|
-
|
|
101
|
+
return snprintf(
|
|
102
|
+
dest, size,
|
|
103
|
+
"{\"event\": \"fax_result\", \"call_id\": %ld, \"result\": %i}", call_id,
|
|
104
|
+
result);
|
|
61
105
|
}
|
|
62
106
|
|
|
107
|
+
int make_evt_tcp_msg(char *dest, int size, long call_id, const char *protocol, char *data, int data_len) {
|
|
108
|
+
return snprintf(
|
|
109
|
+
dest, size,
|
|
110
|
+
"{\"event\": \"%s_msg\", \"call_id\": %ld}\n%.*s", protocol, call_id, data_len, data);
|
|
111
|
+
}
|
package/src/event_templates.hpp
CHANGED
|
@@ -1,29 +1,39 @@
|
|
|
1
1
|
#ifndef __EVENT_TEMPLATES__
|
|
2
2
|
#define __EVENT_TEMPLATES__
|
|
3
3
|
|
|
4
|
+
int make_evt_incoming_call(char *dest, int size, long transport_id,
|
|
5
|
+
long call_id, int sip_msg_len, const char *sip_msg);
|
|
4
6
|
|
|
5
|
-
int
|
|
7
|
+
int make_evt_request(char *dest, int size, const char *entity_type, long id,
|
|
8
|
+
int sip_msg_len, const char *sip_msg);
|
|
6
9
|
|
|
7
|
-
int
|
|
10
|
+
int make_evt_response(char *dest, int size, const char *entity_type, long id,
|
|
11
|
+
int mname_len, const char *mname, int sip_msg_len,
|
|
12
|
+
const char *sip_msg);
|
|
8
13
|
|
|
9
|
-
int
|
|
14
|
+
int make_evt_media_update(char *dest, int size, long call_id,
|
|
15
|
+
const char *status, const char *media);
|
|
10
16
|
|
|
11
|
-
int
|
|
17
|
+
int make_evt_dtmf(char *dest, int size, long call_id, int digits_len,
|
|
18
|
+
const char *digits, int mode, int media_id);
|
|
12
19
|
|
|
13
|
-
int
|
|
20
|
+
int make_evt_call_ended(char *dest, int size, long call_id, int sip_msg_len,
|
|
21
|
+
const char *sip_msg);
|
|
14
22
|
|
|
15
|
-
int
|
|
16
|
-
|
|
17
|
-
|
|
23
|
+
int make_evt_non_dialog_request(char *dest, int size, long transport_id,
|
|
24
|
+
long request_id, int sip_msg_len,
|
|
25
|
+
const char *sip_msg);
|
|
18
26
|
|
|
19
27
|
int make_evt_internal_error(char *dest, int size, const char *msg);
|
|
20
28
|
|
|
21
|
-
|
|
29
|
+
int make_evt_reinvite(char *dest, int size, long call_id, int sip_msg_len,
|
|
30
|
+
char *sip_msg);
|
|
22
31
|
|
|
23
|
-
int make_evt_registration_status(char *dest, int size, long account_id,
|
|
32
|
+
int make_evt_registration_status(char *dest, int size, long account_id,
|
|
33
|
+
int code, const char *reason, int expires);
|
|
24
34
|
|
|
25
35
|
int make_evt_fax_result(char *dest, int size, long call_id, int result);
|
|
26
36
|
|
|
27
|
-
|
|
28
|
-
|
|
37
|
+
int make_evt_tcp_msg(char *dest, int size, long call_id, const char *protocol, char *data, int data_len);
|
|
29
38
|
|
|
39
|
+
#endif
|
package/src/idmanager.cpp
CHANGED
|
@@ -1,76 +1,77 @@
|
|
|
1
1
|
#include "idmanager.hpp"
|
|
2
2
|
|
|
3
|
-
IdManager::IdManager(long max)
|
|
4
|
-
|
|
5
|
-
|
|
3
|
+
IdManager::IdManager(long max) : ids(max) {
|
|
4
|
+
for (long i = 0; i < max; ++i)
|
|
5
|
+
ids.push_back(i);
|
|
6
6
|
};
|
|
7
7
|
|
|
8
|
-
IdManager::~IdManager()
|
|
8
|
+
IdManager::~IdManager(){};
|
|
9
9
|
|
|
10
|
-
bool IdManager::add(long val, long &id){
|
|
11
|
-
|
|
10
|
+
bool IdManager::add(long val, long &id) {
|
|
11
|
+
if (ids.empty())
|
|
12
|
+
return false;
|
|
12
13
|
|
|
13
|
-
|
|
14
|
-
|
|
14
|
+
long new_id = ids[0];
|
|
15
|
+
ids.pop_front();
|
|
15
16
|
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
17
|
+
id_map[new_id] = val;
|
|
18
|
+
id = new_id;
|
|
19
|
+
return true;
|
|
19
20
|
}
|
|
20
21
|
|
|
21
|
-
bool IdManager::remove(long id, long &val){
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
22
|
+
bool IdManager::remove(long id, long &val) {
|
|
23
|
+
map<long, long>::iterator pos = id_map.begin();
|
|
24
|
+
while (pos != id_map.end()) {
|
|
25
|
+
if (pos->first == id) {
|
|
26
|
+
val = pos->second;
|
|
27
|
+
ids.push_back(id);
|
|
28
|
+
id_map.erase(pos);
|
|
29
|
+
return true;
|
|
30
|
+
}
|
|
31
|
+
++pos;
|
|
32
|
+
}
|
|
33
|
+
return false;
|
|
33
34
|
}
|
|
34
35
|
|
|
35
|
-
bool IdManager::remove_by_val(long val, long &id){
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
36
|
+
bool IdManager::remove_by_val(long val, long &id) {
|
|
37
|
+
map<long, long>::iterator pos = id_map.begin();
|
|
38
|
+
while (pos != id_map.end()) {
|
|
39
|
+
if (pos->second == val) {
|
|
40
|
+
id = pos->first;
|
|
41
|
+
ids.push_back(id);
|
|
42
|
+
id_map.erase(pos);
|
|
43
|
+
return true;
|
|
44
|
+
}
|
|
45
|
+
++pos;
|
|
46
|
+
}
|
|
47
|
+
return false;
|
|
47
48
|
}
|
|
48
49
|
|
|
49
|
-
bool IdManager::get(long id, long &val){
|
|
50
|
-
|
|
51
|
-
|
|
50
|
+
bool IdManager::get(long id, long &val) {
|
|
51
|
+
map<long, long>::iterator pos = id_map.find(id);
|
|
52
|
+
if (pos == id_map.end())
|
|
53
|
+
return false;
|
|
52
54
|
|
|
53
|
-
|
|
54
|
-
|
|
55
|
+
val = pos->second;
|
|
56
|
+
return true;
|
|
55
57
|
}
|
|
56
58
|
|
|
57
|
-
bool IdManager::get_id(long val, long &id){
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
59
|
+
bool IdManager::get_id(long val, long &id) {
|
|
60
|
+
map<long, long>::iterator pos = id_map.begin();
|
|
61
|
+
while (pos != id_map.end()) {
|
|
62
|
+
if (pos->second == val) {
|
|
63
|
+
id = pos->first;
|
|
64
|
+
return true;
|
|
65
|
+
}
|
|
66
|
+
++pos;
|
|
67
|
+
}
|
|
68
|
+
return false;
|
|
67
69
|
}
|
|
68
70
|
|
|
69
|
-
void IdManager::iterate(
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
71
|
+
void IdManager::iterate(void (*f)(long id, long val)) {
|
|
72
|
+
map<long, long>::iterator pos = id_map.begin();
|
|
73
|
+
while (pos != id_map.end()) {
|
|
74
|
+
f(pos->first, pos->second);
|
|
75
|
+
++pos;
|
|
76
|
+
}
|
|
75
77
|
}
|
|
76
|
-
|
package/src/idmanager.hpp
CHANGED
|
@@ -9,18 +9,18 @@ using namespace std;
|
|
|
9
9
|
|
|
10
10
|
class IdManager {
|
|
11
11
|
public:
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
12
|
+
IdManager(long max);
|
|
13
|
+
~IdManager();
|
|
14
|
+
bool add(long val, long &id);
|
|
15
|
+
bool remove(long id, long &val);
|
|
16
|
+
bool remove_by_val(long val, long &id);
|
|
17
|
+
bool get(long id, long &val);
|
|
18
|
+
bool get_id(long val, long &id);
|
|
19
|
+
void iterate(void (*f)(long id, long val));
|
|
20
20
|
|
|
21
|
-
|
|
21
|
+
map<long, long> id_map; // hack to test tcpdumper
|
|
22
22
|
private:
|
|
23
|
-
|
|
23
|
+
boost::circular_buffer<long> ids;
|
|
24
24
|
};
|
|
25
25
|
|
|
26
26
|
#endif
|
package/src/log.cpp
CHANGED
|
@@ -2,17 +2,15 @@
|
|
|
2
2
|
#include <stdio.h>
|
|
3
3
|
|
|
4
4
|
void _addon_log(int level, const char *fmt, ...) {
|
|
5
|
-
|
|
5
|
+
va_list args;
|
|
6
6
|
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
7
|
+
/* Check if the message should be logged */
|
|
8
|
+
if (level > _log_level)
|
|
9
|
+
return;
|
|
10
10
|
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
11
|
+
va_start(args, fmt);
|
|
12
|
+
flockfile(stdout);
|
|
13
|
+
vprintf(fmt, args);
|
|
14
|
+
funlockfile(stdout);
|
|
15
|
+
va_end(args);
|
|
16
16
|
}
|
|
17
|
-
|
|
18
|
-
|
package/src/log.hpp
CHANGED
|
@@ -3,13 +3,13 @@
|
|
|
3
3
|
|
|
4
4
|
#include <stdarg.h>
|
|
5
5
|
|
|
6
|
-
#define
|
|
7
|
-
#define
|
|
6
|
+
#define LL_INFO 0
|
|
7
|
+
#define L_DBG 1
|
|
8
8
|
|
|
9
|
-
static int _log_level =
|
|
9
|
+
static int _log_level = L_DBG;
|
|
10
10
|
|
|
11
11
|
void _addon_log(int level, const char *fmt, ...);
|
|
12
12
|
|
|
13
|
-
#define addon_log(level, fmt, ...) _addon_log(level, fmt"\n", ##__VA_ARGS__)
|
|
13
|
+
#define addon_log(level, fmt, ...) _addon_log(level, fmt "\n", ##__VA_ARGS__)
|
|
14
14
|
|
|
15
15
|
#endif
|