sip-lab 1.28.12 → 1.30.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.
Files changed (47) hide show
  1. package/DEV.md +55 -0
  2. package/README.md +8 -2
  3. package/binding.gyp +1 -0
  4. package/build_deps.sh +2 -1
  5. package/index.js +7 -0
  6. package/package.json +1 -1
  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.abi111.node +0 -0
  10. package/prebuilds/linux-x64/node.abi115.node +0 -0
  11. package/prebuilds/linux-x64/node.abi120.node +0 -0
  12. package/prebuilds/linux-x64/node.abi88.node +0 -0
  13. package/prebuilds/linux-x64/node.abi93.node +0 -0
  14. package/samples/100_calls.js +4 -0
  15. package/samples/16_audio_streams.js +2 -0
  16. package/samples/183_session_progress.js +2 -0
  17. package/samples/delayed_media.js +2 -0
  18. package/samples/four_audio_streams_two_refused.js +7 -4
  19. package/samples/mrcp_and_audio.simplified_media.js +2 -0
  20. package/samples/multiple_audio_streams.js +2 -0
  21. package/samples/refuse_telephone_event.js +3 -0
  22. package/samples/reinvite_and_dtmf.js +3 -0
  23. package/samples/reinvite_audio_audio.js +2 -0
  24. package/samples/reinvite_with_hold_unhold.js +2 -0
  25. package/samples/rtp_and_srtp.js +3 -0
  26. package/samples/rtp_and_srtp.rtp_refused.js +3 -0
  27. package/samples/send_and_receive_bfsk.js.future +171 -0
  28. package/samples/srtp.js +3 -0
  29. package/samples/tcp.js +2 -0
  30. package/samples/text_to_speech.js +3 -0
  31. package/samples/two_audio_streams.js +4 -0
  32. package/samples/two_audio_streams.port_zero.js +4 -0
  33. package/samples_extra/ws_speech_server.bfsk.js +154 -0
  34. package/samples_extra/ws_speech_server.dtmf.js +5 -21
  35. package/samples_extra/ws_speech_server.google.js +8 -10
  36. package/samples_extra/ws_speech_server.send_bfsk.js +156 -0
  37. package/samples_extra/ws_speech_server.start_bfsk_detection.js.future +164 -0
  38. package/src/addon.cpp +180 -10
  39. package/src/event_templates.cpp +8 -0
  40. package/src/event_templates.hpp +3 -0
  41. package/src/pjmedia/include/pjmedia/bfsk_det.h +23 -0
  42. package/src/pjmedia/include/pjmedia/ws_speech_port.h +1 -0
  43. package/src/pjmedia/src/pjmedia/bfsk_det.c +289 -0
  44. package/src/pjmedia/src/pjmedia/ws_speech_port.cpp +8 -0
  45. package/src/sip.cpp +552 -35
  46. package/src/sip.cpp.old +9236 -0
  47. package/src/sip.hpp +11 -0
@@ -0,0 +1,154 @@
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
+
8
+ async function test() {
9
+ //sip.set_log_level(6)
10
+ sip.dtmf_aggregation_on(500)
11
+
12
+ sip.set_codecs("PCMU/8000/1:128")
13
+
14
+ z.trap_events(sip.event_source, 'event', (evt) => {
15
+ var e = evt.args[0]
16
+ return e
17
+ })
18
+
19
+ console.log(sip.start((data) => { console.log(data)} ))
20
+
21
+ t1 = sip.transport.create({address: "127.0.0.1", type: 'tcp'})
22
+ t2 = sip.transport.create({address: "127.0.0.1", type: 'tcp'})
23
+
24
+ console.log("t1", t1)
25
+ console.log("t2", t2)
26
+
27
+ oc = sip.call.create(t1.id, {
28
+ from_uri: '"abc"<sip:alice@test.com>',
29
+ to_uri: `sip:bob@${t2.address}:${t2.port}`,
30
+ })
31
+
32
+ await z.wait([
33
+ {
34
+ event: "incoming_call",
35
+ call_id: m.collect("call_id"),
36
+ msg: sip_msg({
37
+ $rm: 'INVITE',
38
+ $fU: 'alice',
39
+ $fd: 'test.com',
40
+ $tU: 'bob',
41
+ }),
42
+ },
43
+ {
44
+ event: 'response',
45
+ call_id: oc.id,
46
+ method: 'INVITE',
47
+ msg: sip_msg({
48
+ $rs: '100',
49
+ $rr: 'Trying',
50
+ }),
51
+ },
52
+ ], 1000)
53
+
54
+ ic = {
55
+ id: z.store.call_id,
56
+ sip_call_id: z.store.sip_call_id,
57
+ }
58
+
59
+ sip.call.respond(ic.id, {
60
+ code: 200,
61
+ reason:'OK',
62
+ })
63
+
64
+ await z.wait([
65
+ {
66
+ event: 'media_update',
67
+ call_id: oc.id,
68
+ status: 'ok',
69
+ },
70
+ {
71
+ event: 'media_update',
72
+ call_id: ic.id,
73
+ status: 'ok',
74
+ },
75
+ {
76
+ event: 'response',
77
+ call_id: oc.id,
78
+ method: 'INVITE',
79
+ msg: sip_msg({
80
+ $rs: '200',
81
+ $rr: 'OK',
82
+ }),
83
+ },
84
+ ], 1000)
85
+
86
+ sip.call.start_record_wav(oc.id, {file: './oc.wav'})
87
+ sip.call.start_record_wav(ic.id, {file: './ic.wav'})
88
+
89
+ sip.call.start_speech_recog(oc.id, {server_url: 'ws://0.0.0.0:8080', engine: 'bfsk-sr', language: '500:2000'})
90
+ sip.call.start_speech_recog(ic.id, {server_url: 'ws://0.0.0.0:8080', engine: 'bfsk-sr', language: '500:2000'})
91
+
92
+ sip.call.start_speech_synth(oc.id, {server_url: 'ws://0.0.0.0:8080', engine: 'bfsk-ss', voice: '5', language: '500:2000', text: 'abcdefgh', times: 1})
93
+ sip.call.start_speech_synth(ic.id, {server_url: 'ws://0.0.0.0:8080', engine: 'bfsk-ss', voice: '5', language: '500:2000', text: 'hgfedcba', times: 1})
94
+
95
+ await z.wait([
96
+ {
97
+ event: 'speech_synth_complete',
98
+ call_id: ic.id,
99
+ },
100
+ {
101
+ event: 'speech_synth_complete',
102
+ call_id: oc.id,
103
+ },
104
+ {
105
+ event: 'speech',
106
+ call_id: oc.id,
107
+ transcript: 'hgfedcba'
108
+ },
109
+ {
110
+ event: 'speech',
111
+ call_id: ic.id,
112
+ transcript: 'abcdefgh'
113
+ }
114
+ ], 3000)
115
+
116
+ sip.call.stop_record_wav(oc.id)
117
+ sip.call.stop_record_wav(ic.id)
118
+
119
+ sip.call.terminate(oc.id)
120
+
121
+ await z.wait([
122
+ {
123
+ event: 'call_ended',
124
+ call_id: oc.id,
125
+ },
126
+ {
127
+ event: 'call_ended',
128
+ call_id: ic.id,
129
+ },
130
+ {
131
+ event: 'response',
132
+ call_id: oc.id,
133
+ method: 'BYE',
134
+ msg: sip_msg({
135
+ $rs: '200',
136
+ $rr: 'OK',
137
+ }),
138
+ },
139
+ ], 1000)
140
+
141
+ await z.sleep(50)
142
+
143
+ console.log("Success")
144
+
145
+ sip.stop()
146
+ }
147
+
148
+
149
+ test()
150
+ .catch(e => {
151
+ console.error(e)
152
+ process.exit(1)
153
+ })
154
+
@@ -86,11 +86,11 @@ async function test() {
86
86
  sip.call.start_record_wav(oc.id, {file: './oc.wav'})
87
87
  sip.call.start_record_wav(ic.id, {file: './ic.wav'})
88
88
 
89
- sip.call.start_speech_recog(oc.id, {server_url: 'ws://0.0.0.0:8080', engine: 'dtmf-det', language: 'dtmf'})
90
- sip.call.start_speech_recog(ic.id, {server_url: 'ws://0.0.0.0:8080', engine: 'dtmf-det', language: 'dtmf'})
89
+ sip.call.start_speech_recog(oc.id, {server_url: 'ws://0.0.0.0:8080', engine: 'dtmf-sr', language: 'dtmf'})
90
+ sip.call.start_speech_recog(ic.id, {server_url: 'ws://0.0.0.0:8080', engine: 'dtmf-sr', language: 'dtmf'})
91
91
 
92
- sip.call.start_speech_synth(oc.id, {server_url: 'ws://0.0.0.0:8080', engine: 'dtmf-gen', voice: 'dtmf', language: 'dtmf', text: 'abcd', times: 1})
93
- sip.call.start_speech_synth(ic.id, {server_url: 'ws://0.0.0.0:8080', engine: 'dtmf-gen', voice: 'dtmf', language: 'dtmf', text: 'dcba', times: 1})
92
+ sip.call.start_speech_synth(oc.id, {server_url: 'ws://0.0.0.0:8080', engine: 'dtmf-ss', voice: 'dtmf', language: 'dtmf', text: 'abcd', times: 1})
93
+ sip.call.start_speech_synth(ic.id, {server_url: 'ws://0.0.0.0:8080', engine: 'dtmf-ss', voice: 'dtmf', language: 'dtmf', text: 'dcba', times: 1})
94
94
 
95
95
  await z.wait([
96
96
  {
@@ -101,20 +101,6 @@ async function test() {
101
101
  event: 'speech_synth_complete',
102
102
  call_id: oc.id,
103
103
  },
104
- {
105
- event: 'dtmf',
106
- call_id: oc.id,
107
- digits: 'dcba',
108
- mode: 1,
109
- media_id: 0
110
- },
111
- {
112
- event: 'dtmf',
113
- call_id: ic.id,
114
- digits: 'abcd',
115
- mode: 1,
116
- media_id: 0
117
- },
118
104
  {
119
105
  event: 'speech',
120
106
  call_id: oc.id,
@@ -127,8 +113,6 @@ async function test() {
127
113
  },
128
114
  ], 3000)
129
115
 
130
- await z.sleep(1000)
131
-
132
116
  sip.call.stop_record_wav(oc.id)
133
117
  sip.call.stop_record_wav(ic.id)
134
118
 
@@ -154,7 +138,7 @@ async function test() {
154
138
  },
155
139
  ], 1000)
156
140
 
157
- await z.sleep(100)
141
+ await z.sleep(50)
158
142
 
159
143
  console.log("Success")
160
144
 
@@ -83,16 +83,16 @@ async function test() {
83
83
  },
84
84
  ], 1000)
85
85
 
86
- await z.sleep(200)
87
-
88
86
  sip.call.start_record_wav(oc.id, {file: './oc.wav'})
89
87
  sip.call.start_record_wav(ic.id, {file: './ic.wav'})
90
88
 
91
- sip.call.start_speech_recog(oc.id, {server_url: 'ws://0.0.0.0:8080', engine: 'gsr', language: 'en-US'})
92
- sip.call.start_speech_recog(ic.id, {server_url: 'ws://0.0.0.0:8080', engine: 'gsr', language: 'en-US'})
89
+ sip.call.start_speech_recog(oc.id, {server_url: 'ws://0.0.0.0:8080', engine: 'google-sr', language: 'en-US'})
90
+ sip.call.start_speech_recog(ic.id, {server_url: 'ws://0.0.0.0:8080', engine: 'google-sr', language: 'en-US'})
91
+
92
+ await z.sleep(100)
93
93
 
94
- sip.call.start_speech_synth(oc.id, {server_url: 'ws://0.0.0.0:8080', engine: 'gss', voice: 'en-US-Standard-E', language: 'en-US', text: 'hello world', times: 1})
95
- sip.call.start_speech_synth(ic.id, {server_url: 'ws://0.0.0.0:8080', engine: 'gss', voice: 'en-US-Standard-F', language: 'en-US', text: '<speak>Good morning<break time="2s"/>Good Afternoon</speak>', times: 1})
94
+ sip.call.start_speech_synth(oc.id, {server_url: 'ws://0.0.0.0:8080', engine: 'google-ss', voice: 'en-US-Standard-E', language: 'en-US', text: 'hello world', times: 1})
95
+ sip.call.start_speech_synth(ic.id, {server_url: 'ws://0.0.0.0:8080', engine: 'google-ss', voice: 'en-US-Standard-F', language: 'en-US', text: '<speak>Good morning<break time="2s"/>Good Afternoon</speak>', times: 1})
96
96
 
97
97
  await z.wait([
98
98
  {
@@ -113,7 +113,7 @@ async function test() {
113
113
  call_id: ic.id,
114
114
  transcript: 'hello world',
115
115
  },
116
- ], 4000)
116
+ ], 8000)
117
117
 
118
118
  await z.wait([
119
119
  {
@@ -123,8 +123,6 @@ async function test() {
123
123
  },
124
124
  ], 4000)
125
125
 
126
- await z.sleep(1000)
127
-
128
126
  sip.call.stop_record_wav(oc.id)
129
127
  sip.call.stop_record_wav(ic.id)
130
128
 
@@ -150,7 +148,7 @@ async function test() {
150
148
  },
151
149
  ], 1000)
152
150
 
153
- await z.sleep(100)
151
+ await z.sleep(50)
154
152
 
155
153
  console.log("Success")
156
154
 
@@ -0,0 +1,156 @@
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
+
8
+ function stringToBinary(str) {
9
+ return str.split('').map(char => {
10
+ return char.charCodeAt(0).toString(2).padStart(8, '0');
11
+ }).join('');
12
+ }
13
+
14
+ async function test() {
15
+ //sip.set_log_level(6)
16
+ sip.dtmf_aggregation_on(500)
17
+
18
+ sip.set_codecs("PCMU/8000/1:128")
19
+
20
+ z.trap_events(sip.event_source, 'event', (evt) => {
21
+ var e = evt.args[0]
22
+ return e
23
+ })
24
+
25
+ console.log(sip.start((data) => { console.log(data)} ))
26
+
27
+ t1 = sip.transport.create({address: "127.0.0.1", type: 'tcp'})
28
+ t2 = sip.transport.create({address: "127.0.0.1", type: 'tcp'})
29
+
30
+ console.log("t1", t1)
31
+ console.log("t2", t2)
32
+
33
+ oc = sip.call.create(t1.id, {
34
+ from_uri: '"abc"<sip:alice@test.com>',
35
+ to_uri: `sip:bob@${t2.address}:${t2.port}`,
36
+ })
37
+
38
+ await z.wait([
39
+ {
40
+ event: "incoming_call",
41
+ call_id: m.collect("call_id"),
42
+ msg: sip_msg({
43
+ $rm: 'INVITE',
44
+ $fU: 'alice',
45
+ $fd: 'test.com',
46
+ $tU: 'bob',
47
+ }),
48
+ },
49
+ {
50
+ event: 'response',
51
+ call_id: oc.id,
52
+ method: 'INVITE',
53
+ msg: sip_msg({
54
+ $rs: '100',
55
+ $rr: 'Trying',
56
+ }),
57
+ },
58
+ ], 1000)
59
+
60
+ ic = {
61
+ id: z.store.call_id,
62
+ sip_call_id: z.store.sip_call_id,
63
+ }
64
+
65
+ sip.call.respond(ic.id, {
66
+ code: 200,
67
+ reason:'OK',
68
+ })
69
+
70
+ await z.wait([
71
+ {
72
+ event: 'media_update',
73
+ call_id: oc.id,
74
+ status: 'ok',
75
+ },
76
+ {
77
+ event: 'media_update',
78
+ call_id: ic.id,
79
+ status: 'ok',
80
+ },
81
+ {
82
+ event: 'response',
83
+ call_id: oc.id,
84
+ method: 'INVITE',
85
+ msg: sip_msg({
86
+ $rs: '200',
87
+ $rr: 'OK',
88
+ }),
89
+ },
90
+ ], 1000)
91
+
92
+ sip.call.start_record_wav(oc.id, {file: './oc.wav'})
93
+ sip.call.start_record_wav(ic.id, {file: './ic.wav'})
94
+
95
+ sip.call.start_speech_recog(oc.id, {server_url: 'ws://0.0.0.0:8080', engine: 'bfsk-sr', language: '500:2000'})
96
+ sip.call.start_speech_recog(ic.id, {server_url: 'ws://0.0.0.0:8080', engine: 'bfsk-sr', language: '500:2000'})
97
+
98
+ await z.sleep(100)
99
+
100
+ sip.call.send_bfsk(oc.id, {bits: stringToBinary('abcd'), freq_zero: 500, freq_one: 2000})
101
+ sip.call.send_bfsk(ic.id, {bits: stringToBinary('dcba'), freq_zero: 500, freq_one: 2000})
102
+
103
+ await z.wait([
104
+ {
105
+ event: 'speech',
106
+ call_id: oc.id,
107
+ transcript: 'dcba'
108
+ },
109
+ {
110
+ event: 'speech',
111
+ call_id: ic.id,
112
+ transcript: 'abcd'
113
+ },
114
+ ], 2000)
115
+
116
+ await z.sleep(1000)
117
+
118
+ sip.call.stop_record_wav(oc.id)
119
+ sip.call.stop_record_wav(ic.id)
120
+
121
+ sip.call.terminate(oc.id)
122
+
123
+ await z.wait([
124
+ {
125
+ event: 'call_ended',
126
+ call_id: oc.id,
127
+ },
128
+ {
129
+ event: 'call_ended',
130
+ call_id: ic.id,
131
+ },
132
+ {
133
+ event: 'response',
134
+ call_id: oc.id,
135
+ method: 'BYE',
136
+ msg: sip_msg({
137
+ $rs: '200',
138
+ $rr: 'OK',
139
+ }),
140
+ },
141
+ ], 1000)
142
+
143
+ await z.sleep(100)
144
+
145
+ console.log("Success")
146
+
147
+ sip.stop()
148
+ }
149
+
150
+
151
+ test()
152
+ .catch(e => {
153
+ console.error(e)
154
+ process.exit(1)
155
+ })
156
+
@@ -0,0 +1,164 @@
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
+
8
+ function stringToBinary(str) {
9
+ return str.split('').map(char => {
10
+ return char.charCodeAt(0).toString(2).padStart(8, '0');
11
+ }).join('');
12
+ }
13
+
14
+ async function test() {
15
+ //sip.set_log_level(6)
16
+ sip.dtmf_aggregation_on(500)
17
+
18
+ sip.set_codecs("PCMU/8000/1:128")
19
+
20
+ z.trap_events(sip.event_source, 'event', (evt) => {
21
+ var e = evt.args[0]
22
+ return e
23
+ })
24
+
25
+ console.log(sip.start((data) => { console.log(data)} ))
26
+
27
+ t1 = sip.transport.create({address: "127.0.0.1", type: 'tcp'})
28
+ t2 = sip.transport.create({address: "127.0.0.1", type: 'tcp'})
29
+
30
+ console.log("t1", t1)
31
+ console.log("t2", t2)
32
+
33
+ oc = sip.call.create(t1.id, {
34
+ from_uri: '"abc"<sip:alice@test.com>',
35
+ to_uri: `sip:bob@${t2.address}:${t2.port}`,
36
+ })
37
+
38
+ await z.wait([
39
+ {
40
+ event: "incoming_call",
41
+ call_id: m.collect("call_id"),
42
+ msg: sip_msg({
43
+ $rm: 'INVITE',
44
+ $fU: 'alice',
45
+ $fd: 'test.com',
46
+ $tU: 'bob',
47
+ }),
48
+ },
49
+ {
50
+ event: 'response',
51
+ call_id: oc.id,
52
+ method: 'INVITE',
53
+ msg: sip_msg({
54
+ $rs: '100',
55
+ $rr: 'Trying',
56
+ }),
57
+ },
58
+ ], 1000)
59
+
60
+ ic = {
61
+ id: z.store.call_id,
62
+ sip_call_id: z.store.sip_call_id,
63
+ }
64
+
65
+ sip.call.respond(ic.id, {
66
+ code: 200,
67
+ reason:'OK',
68
+ })
69
+
70
+ await z.wait([
71
+ {
72
+ event: 'media_update',
73
+ call_id: oc.id,
74
+ status: 'ok',
75
+ },
76
+ {
77
+ event: 'media_update',
78
+ call_id: ic.id,
79
+ status: 'ok',
80
+ },
81
+ {
82
+ event: 'response',
83
+ call_id: oc.id,
84
+ method: 'INVITE',
85
+ msg: sip_msg({
86
+ $rs: '200',
87
+ $rr: 'OK',
88
+ }),
89
+ },
90
+ ], 1000)
91
+
92
+ sip.call.start_record_wav(oc.id, {file: './oc.wav'})
93
+ sip.call.start_record_wav(ic.id, {file: './ic.wav'})
94
+
95
+ sip.call.start_bfsk_detection(oc.id, {freq_zero: 500, freq_one: 2000})
96
+ sip.call.start_bfsk_detection(ic.id, {freq_zero: 500, freq_one: 2000})
97
+
98
+ await z.sleep(100)
99
+
100
+ sip.call.start_speech_synth(oc.id, {server_url: 'ws://0.0.0.0:8080', engine: 'bfsk-ss', voice: '5', language: '500:2000', text: 'a', times: 1})
101
+ sip.call.start_speech_synth(ic.id, {server_url: 'ws://0.0.0.0:8080', engine: 'bfsk-ss', voice: '5', language: '500:2000', text: 'b', times: 1})
102
+
103
+ await z.wait([
104
+ {
105
+ event: 'speech_synth_complete',
106
+ call_id: ic.id,
107
+ },
108
+ {
109
+ event: 'speech_synth_complete',
110
+ call_id: oc.id,
111
+ },
112
+ {
113
+ event: 'bfsk',
114
+ call_id: oc.id,
115
+ bits: stringToBinary('b'),
116
+ },
117
+ {
118
+ event: 'bfsk',
119
+ call_id: ic.id,
120
+ bits: stringToBinary('a'),
121
+ }
122
+ ], 3000)
123
+
124
+ await z.sleep(1000)
125
+
126
+ sip.call.stop_record_wav(oc.id)
127
+ sip.call.stop_record_wav(ic.id)
128
+
129
+ sip.call.terminate(oc.id)
130
+
131
+ await z.wait([
132
+ {
133
+ event: 'call_ended',
134
+ call_id: oc.id,
135
+ },
136
+ {
137
+ event: 'call_ended',
138
+ call_id: ic.id,
139
+ },
140
+ {
141
+ event: 'response',
142
+ call_id: oc.id,
143
+ method: 'BYE',
144
+ msg: sip_msg({
145
+ $rs: '200',
146
+ $rr: 'OK',
147
+ }),
148
+ },
149
+ ], 1000)
150
+
151
+ await z.sleep(100)
152
+
153
+ console.log("Success")
154
+
155
+ sip.stop()
156
+ }
157
+
158
+
159
+ test()
160
+ .catch(e => {
161
+ console.error(e)
162
+ process.exit(1)
163
+ })
164
+