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
@@ -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, long call_id, int sip_msg_len, const char *sip_msg) {
5
- return snprintf(dest, size, "{\"event\": \"incoming_call\", \"transport_id\": %ld, \"call_id\": %ld}\n%.*s", transport_id, call_id, sip_msg_len, sip_msg);
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, int sip_msg_len, const char *sip_msg) {
9
- return snprintf(dest, size, "{\"event\": \"request\", \"%s_id\": %ld}\n%.*s", entity_type, id, sip_msg_len, sip_msg);
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, int mname_len, const char *mname, int sip_msg_len, const char *sip_msg) {
13
- return snprintf(dest, size, "{\"event\": \"response\", \"%s_id\": %ld, \"method\": \"%.*s\"}\n%.*s", entity_type, id, mname_len, mname, sip_msg_len, sip_msg);
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 make_evt_media_status(char *dest, int size, long call_id, const char *status, const char *local_mode, const char *remote_mode) {
17
- if(strcmp(status, "setup_ok") == 0) {
18
- return snprintf(dest, size, "{\"event\": \"media_status\", \"call_id\": %ld, \"status\": \"%s\", \"local_mode\": \"%s\", \"remote_mode\": \"%s\"}", call_id, status, local_mode, remote_mode);
19
- } else {
20
- return snprintf(dest, size, "{\"event\": \"media_status\", \"call_id\": %ld, \"status\": \"%s\"}", call_id, status);
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, const char *digits, int mode) {
25
- return snprintf(dest, size, "{\"event\": \"dtmf\", \"call_id\": %ld, \"digits\": \"%.*s\", \"mode\": %i}", call_id, digits_len, digits, mode);
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, const char *sip_msg) {
29
- printf("sip_msg_len=%i sip_msg=%x\n", sip_msg_len, sip_msg);
30
- if(!sip_msg || sip_msg == (char*)0xc000000000000) {
31
- // received invalid pointer to sip_msg so do not add the message to the event
32
- return snprintf(dest, size, "{\"event\": \"call_ended\", \"call_id\": %ld}", call_id);
33
- } else if(sip_msg_len > 500 && sip_msg_len < 2000 && sip_msg) {
34
- /* sip_msg_len sometimes show up as a large value like sip_msg_len=11560297 which seems to be a bug in pjsip */
35
- return snprintf(dest, size, "{\"event\": \"call_ended\", \"call_id\": %ld}\n%.*s", call_id, sip_msg_len, sip_msg);
36
- } else {
37
- return snprintf(dest, size, "{\"event\": \"call_ended\", \"call_id\": %ld}", call_id);
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, int sip_msg_len, const char *sip_msg) {
42
- return snprintf(dest, size, "{\"event\": \"non_dialog_request\"}\n%.*s", sip_msg_len, sip_msg);
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
- return snprintf(dest, size, "{\"event\": \"internal_error\", \"error\": \"%s\"}", msg);
81
+ return snprintf(dest, size,
82
+ "{\"event\": \"internal_error\", \"error\": \"%s\"}", msg);
47
83
  }
48
84
 
49
- /*
50
- int make_evt_reinvite(char *dest, int size, long call_id, const char *type) {
51
- return snprintf(dest, size, "{\"event\": \"reinvite\", \"call_id\": %ld, \"type\": \"%s\"}", call_id, type);
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, int code, const char *reason, int expires) {
56
- return snprintf(dest, size, "{\"event\": \"registration_status\", \"account_id\": %ld, \"code\": %i, \"reason\": \"%s\", \"expires\": %i}", account_id, code, reason, expires);
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
- return snprintf(dest, size, "{\"event\": \"fax_result\", \"call_id\": %ld, \"result\": %i}", call_id, result);
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
+ }
@@ -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 make_evt_incoming_call(char *dest, int size, long transport_id, long call_id, int sip_msg_len, const char *sip_msg);
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 make_evt_request(char *dest, int size, const char *entity_type, long id, int sip_msg_len, const char *sip_msg);
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 make_evt_response(char *dest, int size, const char *entity_type, long id, int mname_len, const char *mname, int sip_msg_len, const char *sip_msg);
14
+ int make_evt_media_update(char *dest, int size, long call_id,
15
+ const char *status, const char *media);
10
16
 
11
- int make_evt_media_status(char *dest, int size, long call_id, const char *status, const char *local_media_mode, const char *remote_media_mode);
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 make_evt_dtmf(char *dest, int size, long call_id, int digits_len, const char *digits, int mode);
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 make_evt_call_ended(char *dest, int size, long call_id, int sip_msg_len, const char *sip_msg);
16
-
17
- int make_evt_non_dialog_request(char *dest, int size, int sip_msg_len, const char *sip_msg);
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
- //int make_evt_reinvite(char *dest, int size, long call_id, const char *type);
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, int code, const char *reason, int expires);
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
- #endif
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
- : ids(max) {
5
- for(long i=0; i<max ;++i) ids.push_back(i);
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
- if(ids.empty()) return false;
10
+ bool IdManager::add(long val, long &id) {
11
+ if (ids.empty())
12
+ return false;
12
13
 
13
- long new_id = ids[0];
14
- ids.pop_front();
14
+ long new_id = ids[0];
15
+ ids.pop_front();
15
16
 
16
- id_map[new_id] = val;
17
- id = new_id;
18
- return true;
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
- map<long,long>::iterator pos = id_map.begin();
23
- while(pos != id_map.end()){
24
- if(pos->first == id){
25
- val = pos->second;
26
- ids.push_back(id);
27
- id_map.erase(pos);
28
- return true;
29
- }
30
- ++pos;
31
- }
32
- return false;
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
- map<long,long>::iterator pos = id_map.begin();
37
- while(pos != id_map.end()){
38
- if(pos->second == val){
39
- id = pos->first;
40
- ids.push_back(id);
41
- id_map.erase(pos);
42
- return true;
43
- }
44
- ++pos;
45
- }
46
- return false;
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
- map<long,long>::iterator pos = id_map.find(id);
51
- if(pos == id_map.end()) return false;
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
- val = pos->second;
54
- return true;
55
+ val = pos->second;
56
+ return true;
55
57
  }
56
58
 
57
- bool IdManager::get_id(long val, long &id){
58
- map<long,long>::iterator pos = id_map.begin();
59
- while(pos != id_map.end()){
60
- if(pos->second == val){
61
- id = pos->first;
62
- return true;
63
- }
64
- ++pos;
65
- }
66
- return false;
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( void (*f)(long id, long val) ){
70
- map<long,long>::iterator pos = id_map.begin();
71
- while(pos != id_map.end()){
72
- f(pos->first, pos->second);
73
- ++pos;
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
- 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) );
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
- map<long, long> id_map; //hack to test tcpdumper
21
+ map<long, long> id_map; // hack to test tcpdumper
22
22
  private:
23
- boost::circular_buffer<long> ids;
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
- va_list args;
5
+ va_list args;
6
6
 
7
- /* Check if the message should be logged */
8
- if (level > _log_level)
9
- return;
7
+ /* Check if the message should be logged */
8
+ if (level > _log_level)
9
+ return;
10
10
 
11
- va_start(args, fmt);
12
- flockfile(stdout);
13
- vprintf(fmt, args);
14
- funlockfile(stdout);
15
- va_end(args);
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 LOG_LEVEL_INFO 0
7
- #define LOG_LEVEL_DEBUG 1
6
+ #define LL_INFO 0
7
+ #define L_DBG 1
8
8
 
9
- static int _log_level = LOG_LEVEL_DEBUG;
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