sip-lab 1.12.34 → 1.12.36
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 +89 -0
- package/README.md +4 -19
- package/include/siplab_constants.h +6 -0
- package/package.json +5 -2
- package/src/Makefile +39 -0
- package/src/addon.cpp +1094 -0
- package/src/event_templates.cpp +62 -0
- package/src/event_templates.hpp +29 -0
- package/src/idmanager.cpp +76 -0
- package/src/idmanager.hpp +26 -0
- package/src/log.cpp +18 -0
- package/src/log.hpp +15 -0
- package/src/packetdumper.cpp +234 -0
- package/src/packetdumper.hpp +67 -0
- package/src/pjmedia/Makefile +39 -0
- package/src/pjmedia/devjournal +26 -0
- package/src/pjmedia/include/chainlink/README +3 -0
- package/src/pjmedia/include/chainlink/chainlink.h +11 -0
- package/src/pjmedia/include/chainlink/chainlink_dtmfdet.h +56 -0
- package/src/pjmedia/include/chainlink/chainlink_fax.h +25 -0
- package/src/pjmedia/include/chainlink/chainlink_tonegen.h +178 -0
- package/src/pjmedia/include/chainlink/chainlink_wav_port.h +231 -0
- package/src/pjmedia/include/chainlink/chainlink_wire_port.h +50 -0
- package/src/pjmedia/include/pjmedia/README +3 -0
- package/src/pjmedia/include/pjmedia/dtmfdet.h +74 -0
- package/src/pjmedia/src/chainlink/chainlink_dtmfdet.c +125 -0
- package/src/pjmedia/src/chainlink/chainlink_fax.c +280 -0
- package/src/pjmedia/src/chainlink/chainlink_tonegen.c +901 -0
- package/src/pjmedia/src/chainlink/chainlink_wav_player.c +688 -0
- package/src/pjmedia/src/chainlink/chainlink_wav_writer.c +442 -0
- package/src/pjmedia/src/chainlink/chainlink_wire_port.c +93 -0
- package/src/pjmedia/src/pjmedia/dtmfdet.c +129 -0
- package/src/pjmedia/src/pjmedia/simpleua_dtmfdet.c +753 -0
- package/src/pjmedia/src/pjmedia/tonegen_dtmfdet.c +263 -0
- package/src/sip.cpp +5988 -0
- package/src/sip.hpp +107 -0
package/src/addon.cpp
ADDED
|
@@ -0,0 +1,1094 @@
|
|
|
1
|
+
#define NAPI_EXPERIMENTAL /* for napi_threadsafe functions */
|
|
2
|
+
|
|
3
|
+
#include <napi.h>
|
|
4
|
+
#include "sip.hpp"
|
|
5
|
+
#include <string>
|
|
6
|
+
|
|
7
|
+
//#include <boost/thread.hpp>
|
|
8
|
+
//#include <boost/chrono.hpp>
|
|
9
|
+
//#include <iostream>
|
|
10
|
+
|
|
11
|
+
using namespace std;
|
|
12
|
+
|
|
13
|
+
static napi_threadsafe_function tsf;
|
|
14
|
+
|
|
15
|
+
/*
|
|
16
|
+
void wait(int ms)
|
|
17
|
+
{
|
|
18
|
+
boost::this_thread::sleep_for(boost::chrono::milliseconds{ms});
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
static pj_thread_desc poll_thread_descriptor;
|
|
22
|
+
static pj_thread_t *poll_thread = NULL;
|
|
23
|
+
|
|
24
|
+
void poll()
|
|
25
|
+
{
|
|
26
|
+
pj_status_t status = pj_thread_register("main_thread", poll_thread_descriptor, &poll_thread);
|
|
27
|
+
if(status != PJ_SUCCESS)
|
|
28
|
+
{
|
|
29
|
+
printf("pj_thread_register(poll_thread) failed\n");
|
|
30
|
+
exit(1);
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
char buf[4096];
|
|
34
|
+
while(true) {
|
|
35
|
+
wait(50);
|
|
36
|
+
int res = __pjw_poll(buf);
|
|
37
|
+
if(res == 0) {
|
|
38
|
+
if(napi_call_threadsafe_function(tsf, buf, napi_tsfn_blocking) != napi_ok) {
|
|
39
|
+
printf("napi_call_threadsafe_function falied\n");
|
|
40
|
+
}
|
|
41
|
+
//printf("js land called\n");
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
*/
|
|
46
|
+
|
|
47
|
+
|
|
48
|
+
Napi::Value transport_create(const Napi::CallbackInfo& info) {
|
|
49
|
+
Napi::Env env = info.Env();
|
|
50
|
+
|
|
51
|
+
if (info.Length() != 1) {
|
|
52
|
+
Napi::TypeError::New(env, "Wrong number of arguments. Expected params").ThrowAsJavaScriptException();
|
|
53
|
+
return env.Null();
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
if (!info[0].IsString()) {
|
|
57
|
+
Napi::TypeError::New(env, "Wrong argument type: params must be a JSON string.").ThrowAsJavaScriptException();
|
|
58
|
+
return env.Null();
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
const string json = info[0].As<Napi::String>().Utf8Value();
|
|
62
|
+
|
|
63
|
+
int out_t_id;
|
|
64
|
+
char out_t_address[256];
|
|
65
|
+
int out_t_port;
|
|
66
|
+
int res = pjw_transport_create(json.c_str(), &out_t_id, out_t_address, &out_t_port);
|
|
67
|
+
|
|
68
|
+
if(res != 0) {
|
|
69
|
+
Napi::Error::New(env, pjw_get_error()).ThrowAsJavaScriptException();
|
|
70
|
+
return env.Null();
|
|
71
|
+
}
|
|
72
|
+
|
|
73
|
+
Napi::Object obj = Napi::Object::New(env);
|
|
74
|
+
obj.Set(Napi::String::New(env, "id"), Napi::Number::New(env, out_t_id));
|
|
75
|
+
obj.Set(Napi::String::New(env, "address"), Napi::String::New(env, out_t_address));
|
|
76
|
+
obj.Set(Napi::String::New(env, "port"), Napi::Number::New(env, out_t_port));
|
|
77
|
+
|
|
78
|
+
return obj;
|
|
79
|
+
}
|
|
80
|
+
|
|
81
|
+
|
|
82
|
+
Napi::Value account_create(const Napi::CallbackInfo& info) {
|
|
83
|
+
Napi::Env env = info.Env();
|
|
84
|
+
|
|
85
|
+
if (info.Length() != 2) {
|
|
86
|
+
Napi::TypeError::New(env, "Wrong number of arguments. Expected: transport_id, params.").ThrowAsJavaScriptException();
|
|
87
|
+
return env.Null();
|
|
88
|
+
}
|
|
89
|
+
|
|
90
|
+
if (!info[0].IsNumber()) {
|
|
91
|
+
Napi::TypeError::New(env, "Wrong argument type: transport_id must be number.").ThrowAsJavaScriptException();
|
|
92
|
+
return env.Null();
|
|
93
|
+
}
|
|
94
|
+
int transport_id = info[0].As<Napi::Number>().Int32Value();
|
|
95
|
+
|
|
96
|
+
if (!info[1].IsString()) {
|
|
97
|
+
Napi::TypeError::New(env, "Wrong argument type: params must be a JSON string.").ThrowAsJavaScriptException();
|
|
98
|
+
return env.Null();
|
|
99
|
+
}
|
|
100
|
+
const string json = info[1].As<Napi::String>().Utf8Value();
|
|
101
|
+
|
|
102
|
+
int out_a_id;
|
|
103
|
+
int res = pjw_account_create(transport_id, json.c_str(), &out_a_id);
|
|
104
|
+
|
|
105
|
+
if(res != 0) {
|
|
106
|
+
Napi::Error::New(env, pjw_get_error()).ThrowAsJavaScriptException();
|
|
107
|
+
return env.Null();
|
|
108
|
+
}
|
|
109
|
+
|
|
110
|
+
return Napi::Number::New(env, out_a_id);
|
|
111
|
+
}
|
|
112
|
+
|
|
113
|
+
|
|
114
|
+
Napi::Value account_register(const Napi::CallbackInfo& info) {
|
|
115
|
+
Napi::Env env = info.Env();
|
|
116
|
+
|
|
117
|
+
if (info.Length() != 2) {
|
|
118
|
+
Napi::TypeError::New(env, "Wrong number of arguments. Expected: account_id, params.").ThrowAsJavaScriptException();
|
|
119
|
+
return env.Null();
|
|
120
|
+
}
|
|
121
|
+
|
|
122
|
+
if (!info[0].IsNumber()) {
|
|
123
|
+
Napi::TypeError::New(env, "Wrong argument type: account_id must be number.").ThrowAsJavaScriptException();
|
|
124
|
+
return env.Null();
|
|
125
|
+
}
|
|
126
|
+
int account_id = info[0].As<Napi::Number>().Int32Value();
|
|
127
|
+
|
|
128
|
+
if (!info[1].IsString()) {
|
|
129
|
+
Napi::TypeError::New(env, "params must be a JSON string.").ThrowAsJavaScriptException();
|
|
130
|
+
return env.Null();
|
|
131
|
+
}
|
|
132
|
+
const string json = info[1].As<Napi::String>().Utf8Value();
|
|
133
|
+
|
|
134
|
+
int res = pjw_account_register(account_id, json.c_str());
|
|
135
|
+
|
|
136
|
+
if(res != 0) {
|
|
137
|
+
Napi::Error::New(env, pjw_get_error()).ThrowAsJavaScriptException();
|
|
138
|
+
return env.Null();
|
|
139
|
+
}
|
|
140
|
+
|
|
141
|
+
return env.Null();
|
|
142
|
+
}
|
|
143
|
+
|
|
144
|
+
Napi::Value account_unregister(const Napi::CallbackInfo& info) {
|
|
145
|
+
Napi::Env env = info.Env();
|
|
146
|
+
|
|
147
|
+
if (info.Length() != 1) {
|
|
148
|
+
Napi::TypeError::New(env, "Wrong number of arguments. Expected: account_id").ThrowAsJavaScriptException();
|
|
149
|
+
return env.Null();
|
|
150
|
+
}
|
|
151
|
+
|
|
152
|
+
if (!info[0].IsNumber()) {
|
|
153
|
+
Napi::TypeError::New(env, "Wrong argument type: account_id must be number.").ThrowAsJavaScriptException();
|
|
154
|
+
return env.Null();
|
|
155
|
+
}
|
|
156
|
+
int account_id = info[0].As<Napi::Number>().Int32Value();
|
|
157
|
+
|
|
158
|
+
int res = pjw_account_unregister(account_id);
|
|
159
|
+
|
|
160
|
+
if(res != 0) {
|
|
161
|
+
Napi::Error::New(env, pjw_get_error()).ThrowAsJavaScriptException();
|
|
162
|
+
return env.Null();
|
|
163
|
+
}
|
|
164
|
+
|
|
165
|
+
return env.Null();
|
|
166
|
+
}
|
|
167
|
+
|
|
168
|
+
|
|
169
|
+
Napi::Value call_create(const Napi::CallbackInfo& info) {
|
|
170
|
+
Napi::Env env = info.Env();
|
|
171
|
+
|
|
172
|
+
if (info.Length() != 2) {
|
|
173
|
+
Napi::Error::New(env, "Wrong number of arguments. Expected: transport_id, params.").ThrowAsJavaScriptException();
|
|
174
|
+
return env.Null();
|
|
175
|
+
}
|
|
176
|
+
|
|
177
|
+
if (!info[0].IsNumber()) {
|
|
178
|
+
Napi::TypeError::New(env, "transport_id must be number.").ThrowAsJavaScriptException();
|
|
179
|
+
return env.Null();
|
|
180
|
+
}
|
|
181
|
+
int transport_id = info[0].As<Napi::Number>().Int32Value();
|
|
182
|
+
|
|
183
|
+
if (!info[1].IsString()) {
|
|
184
|
+
Napi::TypeError::New(env, "params must be a JSON string.").ThrowAsJavaScriptException();
|
|
185
|
+
return env.Null();
|
|
186
|
+
}
|
|
187
|
+
const string json = info[1].As<Napi::String>().Utf8Value();
|
|
188
|
+
|
|
189
|
+
long int out_call_id;
|
|
190
|
+
char out_sip_call_id[256];
|
|
191
|
+
|
|
192
|
+
int res = pjw_call_create(transport_id, json.c_str(), &out_call_id, out_sip_call_id);
|
|
193
|
+
|
|
194
|
+
if(res != 0) {
|
|
195
|
+
Napi::Error::New(env, pjw_get_error()).ThrowAsJavaScriptException();
|
|
196
|
+
return env.Null();
|
|
197
|
+
}
|
|
198
|
+
|
|
199
|
+
Napi::Object obj = Napi::Object::New(env);
|
|
200
|
+
obj.Set(Napi::String::New(env, "id"), Napi::Number::New(env, out_call_id));
|
|
201
|
+
obj.Set(Napi::String::New(env, "sip_call_id"), out_sip_call_id);
|
|
202
|
+
|
|
203
|
+
return obj;
|
|
204
|
+
}
|
|
205
|
+
|
|
206
|
+
Napi::Value call_respond(const Napi::CallbackInfo& info) {
|
|
207
|
+
Napi::Env env = info.Env();
|
|
208
|
+
|
|
209
|
+
if (info.Length() != 2) {
|
|
210
|
+
Napi::Error::New(env, "Wrong number of arguments. Expected: call_id, params").ThrowAsJavaScriptException();
|
|
211
|
+
return env.Null();
|
|
212
|
+
}
|
|
213
|
+
|
|
214
|
+
if (!info[0].IsNumber()) {
|
|
215
|
+
Napi::TypeError::New(env, "call_id must be number.").ThrowAsJavaScriptException();
|
|
216
|
+
return env.Null();
|
|
217
|
+
}
|
|
218
|
+
int call_id = info[0].As<Napi::Number>().Int32Value();
|
|
219
|
+
|
|
220
|
+
if (!info[1].IsString()) {
|
|
221
|
+
Napi::TypeError::New(env, "params must be a JSON string.").ThrowAsJavaScriptException();
|
|
222
|
+
return env.Null();
|
|
223
|
+
}
|
|
224
|
+
const string json = info[1].As<Napi::String>().Utf8Value();
|
|
225
|
+
|
|
226
|
+
int res = pjw_call_respond(call_id, json.c_str());
|
|
227
|
+
|
|
228
|
+
if(res != 0) {
|
|
229
|
+
Napi::Error::New(env, pjw_get_error()).ThrowAsJavaScriptException();
|
|
230
|
+
return env.Null();
|
|
231
|
+
}
|
|
232
|
+
|
|
233
|
+
return env.Null();
|
|
234
|
+
}
|
|
235
|
+
|
|
236
|
+
Napi::Value call_terminate(const Napi::CallbackInfo& info) {
|
|
237
|
+
Napi::Env env = info.Env();
|
|
238
|
+
|
|
239
|
+
if (info.Length() != 2) {
|
|
240
|
+
Napi::Error::New(env, "Wrong number of arguments. Expected: call_id, params").ThrowAsJavaScriptException();
|
|
241
|
+
return env.Null();
|
|
242
|
+
}
|
|
243
|
+
|
|
244
|
+
if (!info[0].IsNumber()) {
|
|
245
|
+
Napi::TypeError::New(env, "call_id must be number.").ThrowAsJavaScriptException();
|
|
246
|
+
return env.Null();
|
|
247
|
+
}
|
|
248
|
+
int call_id = info[0].As<Napi::Number>().Int32Value();
|
|
249
|
+
|
|
250
|
+
if (!info[1].IsString()) {
|
|
251
|
+
Napi::TypeError::New(env, "params must be a JSON string.").ThrowAsJavaScriptException();
|
|
252
|
+
return env.Null();
|
|
253
|
+
}
|
|
254
|
+
const string json = info[1].As<Napi::String>().Utf8Value();
|
|
255
|
+
|
|
256
|
+
int res = pjw_call_terminate(call_id, json.c_str());
|
|
257
|
+
|
|
258
|
+
if(res != 0) {
|
|
259
|
+
Napi::Error::New(env, pjw_get_error()).ThrowAsJavaScriptException();
|
|
260
|
+
return env.Null();
|
|
261
|
+
}
|
|
262
|
+
|
|
263
|
+
return env.Null();
|
|
264
|
+
}
|
|
265
|
+
|
|
266
|
+
Napi::Value call_send_dtmf(const Napi::CallbackInfo& info) {
|
|
267
|
+
Napi::Env env = info.Env();
|
|
268
|
+
|
|
269
|
+
if (info.Length() != 2) {
|
|
270
|
+
Napi::Error::New(env, "Wrong number of arguments. Expected: call_id, params.").ThrowAsJavaScriptException();
|
|
271
|
+
return env.Null();
|
|
272
|
+
}
|
|
273
|
+
|
|
274
|
+
if (!info[0].IsNumber()) {
|
|
275
|
+
Napi::TypeError::New(env, "call_id must be number.").ThrowAsJavaScriptException();
|
|
276
|
+
return env.Null();
|
|
277
|
+
}
|
|
278
|
+
int call_id = info[0].As<Napi::Number>().Int32Value();
|
|
279
|
+
|
|
280
|
+
if (!info[1].IsString()) {
|
|
281
|
+
Napi::TypeError::New(env, "params must be a JSON string.").ThrowAsJavaScriptException();
|
|
282
|
+
return env.Null();
|
|
283
|
+
}
|
|
284
|
+
const string json = info[1].As<Napi::String>().Utf8Value();
|
|
285
|
+
|
|
286
|
+
int res = pjw_call_send_dtmf(call_id, json.c_str());
|
|
287
|
+
|
|
288
|
+
if(res != 0) {
|
|
289
|
+
Napi::Error::New(env, pjw_get_error()).ThrowAsJavaScriptException();
|
|
290
|
+
return env.Null();
|
|
291
|
+
}
|
|
292
|
+
|
|
293
|
+
return env.Null();
|
|
294
|
+
}
|
|
295
|
+
|
|
296
|
+
Napi::Value call_reinvite(const Napi::CallbackInfo& info) {
|
|
297
|
+
Napi::Env env = info.Env();
|
|
298
|
+
|
|
299
|
+
if (info.Length() != 2) {
|
|
300
|
+
Napi::Error::New(env, "Wrong number of arguments. Expected: call_id, params.").ThrowAsJavaScriptException();
|
|
301
|
+
return env.Null();
|
|
302
|
+
}
|
|
303
|
+
|
|
304
|
+
if (!info[0].IsNumber()) {
|
|
305
|
+
Napi::TypeError::New(env, "call_id must be number.").ThrowAsJavaScriptException();
|
|
306
|
+
return env.Null();
|
|
307
|
+
}
|
|
308
|
+
int call_id = info[0].As<Napi::Number>().Int32Value();
|
|
309
|
+
|
|
310
|
+
if (!info[1].IsString()) {
|
|
311
|
+
Napi::TypeError::New(env, "params must be a JSON string.").ThrowAsJavaScriptException();
|
|
312
|
+
return env.Null();
|
|
313
|
+
}
|
|
314
|
+
const string json = info[1].As<Napi::String>().Utf8Value();
|
|
315
|
+
|
|
316
|
+
int res = pjw_call_reinvite(call_id, json.c_str());
|
|
317
|
+
|
|
318
|
+
if(res != 0) {
|
|
319
|
+
Napi::Error::New(env, pjw_get_error()).ThrowAsJavaScriptException();
|
|
320
|
+
return env.Null();
|
|
321
|
+
}
|
|
322
|
+
|
|
323
|
+
return env.Null();
|
|
324
|
+
}
|
|
325
|
+
|
|
326
|
+
Napi::Value call_send_request(const Napi::CallbackInfo& info) {
|
|
327
|
+
Napi::Env env = info.Env();
|
|
328
|
+
|
|
329
|
+
if (info.Length() != 2) {
|
|
330
|
+
Napi::Error::New(env, "Wrong number of arguments. Expected: call_id, params.").ThrowAsJavaScriptException();
|
|
331
|
+
return env.Null();
|
|
332
|
+
}
|
|
333
|
+
|
|
334
|
+
if (!info[0].IsNumber()) {
|
|
335
|
+
Napi::TypeError::New(env, "call_id must be number.").ThrowAsJavaScriptException();
|
|
336
|
+
return env.Null();
|
|
337
|
+
}
|
|
338
|
+
int call_id = info[0].As<Napi::Number>().Int32Value();
|
|
339
|
+
|
|
340
|
+
if (!info[1].IsString()) {
|
|
341
|
+
Napi::TypeError::New(env, "params must be a JSON string.").ThrowAsJavaScriptException();
|
|
342
|
+
return env.Null();
|
|
343
|
+
}
|
|
344
|
+
const string json = info[1].As<Napi::String>().Utf8Value();
|
|
345
|
+
|
|
346
|
+
int res = pjw_call_send_request(call_id, json.c_str());
|
|
347
|
+
|
|
348
|
+
if(res != 0) {
|
|
349
|
+
Napi::Error::New(env, pjw_get_error()).ThrowAsJavaScriptException();
|
|
350
|
+
return env.Null();
|
|
351
|
+
}
|
|
352
|
+
|
|
353
|
+
return env.Null();
|
|
354
|
+
}
|
|
355
|
+
|
|
356
|
+
Napi::Value call_start_record_wav(const Napi::CallbackInfo& info) {
|
|
357
|
+
Napi::Env env = info.Env();
|
|
358
|
+
|
|
359
|
+
if (info.Length() != 2) {
|
|
360
|
+
Napi::Error::New(env, "Wrong number of arguments. Expected: call_id, params.").ThrowAsJavaScriptException();
|
|
361
|
+
return env.Null();
|
|
362
|
+
}
|
|
363
|
+
|
|
364
|
+
if (!info[0].IsNumber()) {
|
|
365
|
+
Napi::TypeError::New(env, "call_id must be number.").ThrowAsJavaScriptException();
|
|
366
|
+
return env.Null();
|
|
367
|
+
}
|
|
368
|
+
int call_id = info[0].As<Napi::Number>().Int32Value();
|
|
369
|
+
|
|
370
|
+
if (!info[1].IsString()) {
|
|
371
|
+
Napi::TypeError::New(env, "params must be a JSON string.").ThrowAsJavaScriptException();
|
|
372
|
+
return env.Null();
|
|
373
|
+
}
|
|
374
|
+
const string json = info[1].As<Napi::String>().Utf8Value();
|
|
375
|
+
|
|
376
|
+
int res = pjw_call_start_record_wav(call_id, json.c_str());
|
|
377
|
+
|
|
378
|
+
if(res != 0) {
|
|
379
|
+
Napi::Error::New(env, pjw_get_error()).ThrowAsJavaScriptException();
|
|
380
|
+
return env.Null();
|
|
381
|
+
}
|
|
382
|
+
|
|
383
|
+
return env.Null();
|
|
384
|
+
}
|
|
385
|
+
|
|
386
|
+
Napi::Value call_start_play_wav(const Napi::CallbackInfo& info) {
|
|
387
|
+
Napi::Env env = info.Env();
|
|
388
|
+
|
|
389
|
+
if (info.Length() != 2) {
|
|
390
|
+
Napi::Error::New(env, "Wrong number of arguments. Expected: call_id, params.").ThrowAsJavaScriptException();
|
|
391
|
+
return env.Null();
|
|
392
|
+
}
|
|
393
|
+
|
|
394
|
+
if (!info[0].IsNumber()) {
|
|
395
|
+
Napi::TypeError::New(env, "call_id must be number.").ThrowAsJavaScriptException();
|
|
396
|
+
return env.Null();
|
|
397
|
+
}
|
|
398
|
+
int call_id = info[0].As<Napi::Number>().Int32Value();
|
|
399
|
+
|
|
400
|
+
if (!info[1].IsString()) {
|
|
401
|
+
Napi::TypeError::New(env, "params must be a JSON string.").ThrowAsJavaScriptException();
|
|
402
|
+
return env.Null();
|
|
403
|
+
}
|
|
404
|
+
const string json = info[1].As<Napi::String>().Utf8Value();
|
|
405
|
+
|
|
406
|
+
int res = pjw_call_start_play_wav(call_id, json.c_str());
|
|
407
|
+
|
|
408
|
+
if(res != 0) {
|
|
409
|
+
Napi::Error::New(env, pjw_get_error()).ThrowAsJavaScriptException();
|
|
410
|
+
return env.Null();
|
|
411
|
+
}
|
|
412
|
+
|
|
413
|
+
return env.Null();
|
|
414
|
+
}
|
|
415
|
+
|
|
416
|
+
Napi::Value call_start_fax(const Napi::CallbackInfo& info) {
|
|
417
|
+
Napi::Env env = info.Env();
|
|
418
|
+
|
|
419
|
+
if (info.Length() != 2) {
|
|
420
|
+
Napi::Error::New(env, "Wrong number of arguments. Expected: call_id, params.").ThrowAsJavaScriptException();
|
|
421
|
+
return env.Null();
|
|
422
|
+
}
|
|
423
|
+
|
|
424
|
+
if (!info[0].IsNumber()) {
|
|
425
|
+
Napi::TypeError::New(env, "call_id must be number.").ThrowAsJavaScriptException();
|
|
426
|
+
return env.Null();
|
|
427
|
+
}
|
|
428
|
+
int call_id = info[0].As<Napi::Number>().Int32Value();
|
|
429
|
+
|
|
430
|
+
if (!info[1].IsString()) {
|
|
431
|
+
Napi::TypeError::New(env, "params must be a JSON string.").ThrowAsJavaScriptException();
|
|
432
|
+
return env.Null();
|
|
433
|
+
}
|
|
434
|
+
const string json = info[1].As<Napi::String>().Utf8Value();
|
|
435
|
+
|
|
436
|
+
int res = pjw_call_start_fax(call_id, json.c_str());
|
|
437
|
+
|
|
438
|
+
if(res != 0) {
|
|
439
|
+
Napi::Error::New(env, pjw_get_error()).ThrowAsJavaScriptException();
|
|
440
|
+
return env.Null();
|
|
441
|
+
}
|
|
442
|
+
|
|
443
|
+
return env.Null();
|
|
444
|
+
}
|
|
445
|
+
|
|
446
|
+
Napi::Value call_stop_record_wav(const Napi::CallbackInfo& info) {
|
|
447
|
+
Napi::Env env = info.Env();
|
|
448
|
+
|
|
449
|
+
if (info.Length() != 1) {
|
|
450
|
+
Napi::Error::New(env, "Wrong number of arguments. Expected: call_id").ThrowAsJavaScriptException();
|
|
451
|
+
return env.Null();
|
|
452
|
+
}
|
|
453
|
+
|
|
454
|
+
if (!info[0].IsNumber()) {
|
|
455
|
+
Napi::TypeError::New(env, "call_id must be number.").ThrowAsJavaScriptException();
|
|
456
|
+
return env.Null();
|
|
457
|
+
}
|
|
458
|
+
int call_id = info[0].As<Napi::Number>().Int32Value();
|
|
459
|
+
|
|
460
|
+
int res = pjw_call_stop_record_wav(call_id);
|
|
461
|
+
|
|
462
|
+
if(res != 0) {
|
|
463
|
+
Napi::Error::New(env, pjw_get_error()).ThrowAsJavaScriptException();
|
|
464
|
+
return env.Null();
|
|
465
|
+
}
|
|
466
|
+
|
|
467
|
+
return env.Null();
|
|
468
|
+
}
|
|
469
|
+
|
|
470
|
+
Napi::Value call_stop_play_wav(const Napi::CallbackInfo& info) {
|
|
471
|
+
Napi::Env env = info.Env();
|
|
472
|
+
|
|
473
|
+
if (info.Length() != 1) {
|
|
474
|
+
Napi::Error::New(env, "Wrong number of arguments. Expected: call_id").ThrowAsJavaScriptException();
|
|
475
|
+
return env.Null();
|
|
476
|
+
}
|
|
477
|
+
|
|
478
|
+
if (!info[0].IsNumber()) {
|
|
479
|
+
Napi::TypeError::New(env, "call_id must be number.").ThrowAsJavaScriptException();
|
|
480
|
+
return env.Null();
|
|
481
|
+
}
|
|
482
|
+
int call_id = info[0].As<Napi::Number>().Int32Value();
|
|
483
|
+
|
|
484
|
+
int res = pjw_call_stop_play_wav(call_id);
|
|
485
|
+
|
|
486
|
+
if(res != 0) {
|
|
487
|
+
Napi::Error::New(env, pjw_get_error()).ThrowAsJavaScriptException();
|
|
488
|
+
return env.Null();
|
|
489
|
+
}
|
|
490
|
+
|
|
491
|
+
return env.Null();
|
|
492
|
+
}
|
|
493
|
+
|
|
494
|
+
Napi::Value call_stop_fax(const Napi::CallbackInfo& info) {
|
|
495
|
+
Napi::Env env = info.Env();
|
|
496
|
+
|
|
497
|
+
if (info.Length() != 1) {
|
|
498
|
+
Napi::Error::New(env, "Wrong number of arguments. Expected: call_id").ThrowAsJavaScriptException();
|
|
499
|
+
return env.Null();
|
|
500
|
+
}
|
|
501
|
+
|
|
502
|
+
if (!info[0].IsNumber()) {
|
|
503
|
+
Napi::TypeError::New(env, "call_id must be number.").ThrowAsJavaScriptException();
|
|
504
|
+
return env.Null();
|
|
505
|
+
}
|
|
506
|
+
int call_id = info[0].As<Napi::Number>().Int32Value();
|
|
507
|
+
|
|
508
|
+
int res = pjw_call_stop_fax(call_id);
|
|
509
|
+
|
|
510
|
+
if(res != 0) {
|
|
511
|
+
Napi::Error::New(env, pjw_get_error()).ThrowAsJavaScriptException();
|
|
512
|
+
return env.Null();
|
|
513
|
+
}
|
|
514
|
+
|
|
515
|
+
return env.Null();
|
|
516
|
+
}
|
|
517
|
+
|
|
518
|
+
Napi::Value call_get_stream_stat(const Napi::CallbackInfo& info) {
|
|
519
|
+
Napi::Env env = info.Env();
|
|
520
|
+
|
|
521
|
+
if (info.Length() != 1) {
|
|
522
|
+
Napi::Error::New(env, "Wrong number of arguments. Expected: call_id").ThrowAsJavaScriptException();
|
|
523
|
+
return env.Null();
|
|
524
|
+
}
|
|
525
|
+
|
|
526
|
+
if (!info[0].IsNumber()) {
|
|
527
|
+
Napi::TypeError::New(env, "call_id must be number.").ThrowAsJavaScriptException();
|
|
528
|
+
return env.Null();
|
|
529
|
+
}
|
|
530
|
+
int call_id = info[0].As<Napi::Number>().Int32Value();
|
|
531
|
+
|
|
532
|
+
char out_stats[4096];
|
|
533
|
+
int res = pjw_call_get_stream_stat(call_id, out_stats);
|
|
534
|
+
|
|
535
|
+
if(res != 0) {
|
|
536
|
+
Napi::Error::New(env, pjw_get_error()).ThrowAsJavaScriptException();
|
|
537
|
+
return env.Null();
|
|
538
|
+
}
|
|
539
|
+
|
|
540
|
+
return Napi::String::New(env, out_stats);
|
|
541
|
+
}
|
|
542
|
+
|
|
543
|
+
Napi::Value call_refer(const Napi::CallbackInfo& info) {
|
|
544
|
+
Napi::Env env = info.Env();
|
|
545
|
+
|
|
546
|
+
if (info.Length() != 2) {
|
|
547
|
+
Napi::Error::New(env, "Wrong number of arguments. Expected: call_id, params.").ThrowAsJavaScriptException();
|
|
548
|
+
return env.Null();
|
|
549
|
+
}
|
|
550
|
+
|
|
551
|
+
if (!info[0].IsNumber()) {
|
|
552
|
+
Napi::TypeError::New(env, "call_id must be number.").ThrowAsJavaScriptException();
|
|
553
|
+
return env.Null();
|
|
554
|
+
}
|
|
555
|
+
int call_id = info[0].As<Napi::Number>().Int32Value();
|
|
556
|
+
|
|
557
|
+
if (!info[1].IsString()) {
|
|
558
|
+
Napi::TypeError::New(env, "params must be a JSON string.").ThrowAsJavaScriptException();
|
|
559
|
+
return env.Null();
|
|
560
|
+
}
|
|
561
|
+
const string json = info[1].As<Napi::String>().Utf8Value();
|
|
562
|
+
|
|
563
|
+
long out_subscription_id;
|
|
564
|
+
|
|
565
|
+
int res = pjw_call_refer(call_id, json.c_str(), &out_subscription_id);
|
|
566
|
+
|
|
567
|
+
if(res != 0) {
|
|
568
|
+
Napi::Error::New(env, pjw_get_error()).ThrowAsJavaScriptException();
|
|
569
|
+
return env.Null();
|
|
570
|
+
}
|
|
571
|
+
|
|
572
|
+
return Napi::Number::New(env, out_subscription_id);
|
|
573
|
+
}
|
|
574
|
+
|
|
575
|
+
Napi::Value call_get_info(const Napi::CallbackInfo& info) {
|
|
576
|
+
Napi::Env env = info.Env();
|
|
577
|
+
|
|
578
|
+
if (info.Length() != 2) {
|
|
579
|
+
Napi::Error::New(env, "Wrong number of arguments. Expected: call_id, required_info").ThrowAsJavaScriptException();
|
|
580
|
+
return env.Null();
|
|
581
|
+
}
|
|
582
|
+
|
|
583
|
+
if (!info[0].IsNumber()) {
|
|
584
|
+
Napi::TypeError::New(env, "call_id must be number.").ThrowAsJavaScriptException();
|
|
585
|
+
return env.Null();
|
|
586
|
+
}
|
|
587
|
+
int call_id = info[0].As<Napi::Number>().Int32Value();
|
|
588
|
+
|
|
589
|
+
if (!info[1].IsString()) {
|
|
590
|
+
Napi::TypeError::New(env, "required_info must be string.").ThrowAsJavaScriptException();
|
|
591
|
+
return env.Null();
|
|
592
|
+
}
|
|
593
|
+
string required_info = info[1].As<Napi::String>().Utf8Value();
|
|
594
|
+
|
|
595
|
+
if(required_info != "Call-ID" && required_info != "RemoteMediaEndPoint") {
|
|
596
|
+
Napi::TypeError::New(env, "required_info must be 'Call-ID' or 'RemoteMediaEndPoint'.").ThrowAsJavaScriptException();
|
|
597
|
+
return env.Null();
|
|
598
|
+
}
|
|
599
|
+
|
|
600
|
+
char out_info[4096];
|
|
601
|
+
|
|
602
|
+
int res = pjw_call_get_info(call_id, required_info.c_str(), out_info);
|
|
603
|
+
|
|
604
|
+
if(res != 0) {
|
|
605
|
+
Napi::Error::New(env, pjw_get_error()).ThrowAsJavaScriptException();
|
|
606
|
+
return env.Null();
|
|
607
|
+
}
|
|
608
|
+
|
|
609
|
+
return Napi::String::New(env, out_info);
|
|
610
|
+
}
|
|
611
|
+
|
|
612
|
+
Napi::Value call_gen_string_replaces(const Napi::CallbackInfo& info) {
|
|
613
|
+
Napi::Env env = info.Env();
|
|
614
|
+
|
|
615
|
+
if (info.Length() != 1) {
|
|
616
|
+
Napi::Error::New(env, "Wrong number of arguments. Expected: call_id").ThrowAsJavaScriptException();
|
|
617
|
+
return env.Null();
|
|
618
|
+
}
|
|
619
|
+
|
|
620
|
+
if (!info[0].IsNumber()) {
|
|
621
|
+
Napi::TypeError::New(env, "call_id must be number.").ThrowAsJavaScriptException();
|
|
622
|
+
return env.Null();
|
|
623
|
+
}
|
|
624
|
+
int call_id = info[0].As<Napi::Number>().Int32Value();
|
|
625
|
+
|
|
626
|
+
char out_replaces[4096];
|
|
627
|
+
|
|
628
|
+
int res = pjw_call_gen_string_replaces(call_id, out_replaces);
|
|
629
|
+
|
|
630
|
+
if(res != 0) {
|
|
631
|
+
Napi::Error::New(env, pjw_get_error()).ThrowAsJavaScriptException();
|
|
632
|
+
return env.Null();
|
|
633
|
+
}
|
|
634
|
+
|
|
635
|
+
return Napi::String::New(env, out_replaces);
|
|
636
|
+
}
|
|
637
|
+
|
|
638
|
+
|
|
639
|
+
|
|
640
|
+
Napi::Value dtmf_aggregation_on(const Napi::CallbackInfo& info) {
|
|
641
|
+
Napi::Env env = info.Env();
|
|
642
|
+
|
|
643
|
+
if (info.Length() != 1) {
|
|
644
|
+
Napi::Error::New(env, "Wrong number of arguments. Expected: inter_digit_timer").ThrowAsJavaScriptException();
|
|
645
|
+
return env.Null();
|
|
646
|
+
}
|
|
647
|
+
|
|
648
|
+
if (!info[0].IsNumber()) {
|
|
649
|
+
Napi::TypeError::New(env, "inter_digit_timer must be number.").ThrowAsJavaScriptException();
|
|
650
|
+
return env.Null();
|
|
651
|
+
}
|
|
652
|
+
int inter_digit_timer = info[0].As<Napi::Number>().Int32Value();
|
|
653
|
+
|
|
654
|
+
int res = pjw_dtmf_aggregation_on(inter_digit_timer);
|
|
655
|
+
|
|
656
|
+
if(res != 0) {
|
|
657
|
+
Napi::Error::New(env, pjw_get_error()).ThrowAsJavaScriptException();
|
|
658
|
+
return env.Null();
|
|
659
|
+
}
|
|
660
|
+
|
|
661
|
+
return env.Null();
|
|
662
|
+
}
|
|
663
|
+
|
|
664
|
+
|
|
665
|
+
Napi::Value dtmf_aggregation_off(const Napi::CallbackInfo& info) {
|
|
666
|
+
Napi::Env env = info.Env();
|
|
667
|
+
|
|
668
|
+
int res = pjw_dtmf_aggregation_off();
|
|
669
|
+
|
|
670
|
+
if(res != 0) {
|
|
671
|
+
Napi::Error::New(env, pjw_get_error()).ThrowAsJavaScriptException();
|
|
672
|
+
return env.Null();
|
|
673
|
+
}
|
|
674
|
+
|
|
675
|
+
return env.Null();
|
|
676
|
+
}
|
|
677
|
+
|
|
678
|
+
|
|
679
|
+
Napi::Value packetdump_start(const Napi::CallbackInfo& info) {
|
|
680
|
+
Napi::Env env = info.Env();
|
|
681
|
+
|
|
682
|
+
if (info.Length() != 2) {
|
|
683
|
+
Napi::Error::New(env, "Wrong number of arguments. Expected: dev, pcap_file").ThrowAsJavaScriptException();
|
|
684
|
+
return env.Null();
|
|
685
|
+
}
|
|
686
|
+
|
|
687
|
+
if (!info[0].IsString()) {
|
|
688
|
+
Napi::TypeError::New(env, "dev must be string.").ThrowAsJavaScriptException();
|
|
689
|
+
return env.Null();
|
|
690
|
+
}
|
|
691
|
+
string dev = info[0].As<Napi::String>().Utf8Value();
|
|
692
|
+
|
|
693
|
+
if (dev.length() == 0) {
|
|
694
|
+
Napi::Error::New(env, "dev is invalid (blank string)").ThrowAsJavaScriptException();
|
|
695
|
+
return env.Null();
|
|
696
|
+
}
|
|
697
|
+
|
|
698
|
+
if (!info[1].IsString()) {
|
|
699
|
+
Napi::TypeError::New(env, "pcap_file must be string.").ThrowAsJavaScriptException();
|
|
700
|
+
return env.Null();
|
|
701
|
+
}
|
|
702
|
+
string pcap_file = info[1].As<Napi::String>().Utf8Value();
|
|
703
|
+
|
|
704
|
+
if (pcap_file.length() == 0) {
|
|
705
|
+
Napi::Error::New(env, "dev is invalid (blank string)").ThrowAsJavaScriptException();
|
|
706
|
+
return env.Null();
|
|
707
|
+
}
|
|
708
|
+
|
|
709
|
+
int res = pjw_packetdump_start(dev.c_str(), pcap_file.c_str());
|
|
710
|
+
|
|
711
|
+
if(res != 0) {
|
|
712
|
+
Napi::Error::New(env, pjw_get_error()).ThrowAsJavaScriptException();
|
|
713
|
+
return env.Null();
|
|
714
|
+
}
|
|
715
|
+
|
|
716
|
+
return env.Null();
|
|
717
|
+
}
|
|
718
|
+
|
|
719
|
+
Napi::Value packetdump_stop(const Napi::CallbackInfo& info) {
|
|
720
|
+
Napi::Env env = info.Env();
|
|
721
|
+
|
|
722
|
+
int res = pjw_packetdump_stop();
|
|
723
|
+
|
|
724
|
+
if(res != 0) {
|
|
725
|
+
Napi::Error::New(env, pjw_get_error()).ThrowAsJavaScriptException();
|
|
726
|
+
return env.Null();
|
|
727
|
+
}
|
|
728
|
+
|
|
729
|
+
return env.Null();
|
|
730
|
+
}
|
|
731
|
+
|
|
732
|
+
Napi::Value get_codecs(const Napi::CallbackInfo& info) {
|
|
733
|
+
Napi::Env env = info.Env();
|
|
734
|
+
|
|
735
|
+
char out_codecs[4096];
|
|
736
|
+
int res = pjw_get_codecs(out_codecs);
|
|
737
|
+
|
|
738
|
+
if(res != 0) {
|
|
739
|
+
Napi::Error::New(env, pjw_get_error()).ThrowAsJavaScriptException();
|
|
740
|
+
return env.Null();
|
|
741
|
+
}
|
|
742
|
+
|
|
743
|
+
return Napi::String::New(env, out_codecs);
|
|
744
|
+
}
|
|
745
|
+
|
|
746
|
+
Napi::Value set_codecs(const Napi::CallbackInfo& info) {
|
|
747
|
+
Napi::Env env = info.Env();
|
|
748
|
+
|
|
749
|
+
if (info.Length() != 1) {
|
|
750
|
+
Napi::Error::New(env, "Wrong number of arguments. Expected: codec_info").ThrowAsJavaScriptException();
|
|
751
|
+
return env.Null();
|
|
752
|
+
}
|
|
753
|
+
|
|
754
|
+
if (!info[0].IsString()) {
|
|
755
|
+
Napi::TypeError::New(env, "codec_info must be string.").ThrowAsJavaScriptException();
|
|
756
|
+
return env.Null();
|
|
757
|
+
}
|
|
758
|
+
string codec_info = info[0].As<Napi::String>().Utf8Value();
|
|
759
|
+
|
|
760
|
+
int res = pjw_set_codecs(codec_info.c_str());
|
|
761
|
+
|
|
762
|
+
if(res != 0) {
|
|
763
|
+
Napi::Error::New(env, pjw_get_error()).ThrowAsJavaScriptException();
|
|
764
|
+
return env.Null();
|
|
765
|
+
}
|
|
766
|
+
|
|
767
|
+
return env.Null();
|
|
768
|
+
}
|
|
769
|
+
|
|
770
|
+
Napi::Value notify(const Napi::CallbackInfo& info) {
|
|
771
|
+
Napi::Env env = info.Env();
|
|
772
|
+
|
|
773
|
+
if (info.Length() != 2) {
|
|
774
|
+
Napi::Error::New(env, "Wrong number of arguments. Expected: subscriber_id, params.").ThrowAsJavaScriptException();
|
|
775
|
+
return env.Null();
|
|
776
|
+
}
|
|
777
|
+
|
|
778
|
+
if (!info[0].IsNumber()) {
|
|
779
|
+
Napi::TypeError::New(env, "subscriber_id must be number.").ThrowAsJavaScriptException();
|
|
780
|
+
return env.Null();
|
|
781
|
+
}
|
|
782
|
+
int subscriber_id = info[0].As<Napi::Number>().Int32Value();
|
|
783
|
+
|
|
784
|
+
if (!info[1].IsString()) {
|
|
785
|
+
Napi::TypeError::New(env, "Wrong argument type: params must be a JSON string.").ThrowAsJavaScriptException();
|
|
786
|
+
return env.Null();
|
|
787
|
+
}
|
|
788
|
+
const string json = info[1].As<Napi::String>().Utf8Value();
|
|
789
|
+
|
|
790
|
+
int res = pjw_notify(subscriber_id, json.c_str());
|
|
791
|
+
|
|
792
|
+
if(res != 0) {
|
|
793
|
+
Napi::Error::New(env, pjw_get_error()).ThrowAsJavaScriptException();
|
|
794
|
+
return env.Null();
|
|
795
|
+
}
|
|
796
|
+
|
|
797
|
+
return env.Null();
|
|
798
|
+
}
|
|
799
|
+
|
|
800
|
+
Napi::Value notify_xfer(const Napi::CallbackInfo& info) {
|
|
801
|
+
Napi::Env env = info.Env();
|
|
802
|
+
|
|
803
|
+
if (info.Length() != 2) {
|
|
804
|
+
Napi::Error::New(env, "Wrong number of arguments. Expected: subscriber_id, params").ThrowAsJavaScriptException();
|
|
805
|
+
return env.Null();
|
|
806
|
+
}
|
|
807
|
+
|
|
808
|
+
if (!info[0].IsNumber()) {
|
|
809
|
+
Napi::TypeError::New(env, "subscriber_id must be number.").ThrowAsJavaScriptException();
|
|
810
|
+
return env.Null();
|
|
811
|
+
}
|
|
812
|
+
int subscriber_id = info[0].As<Napi::Number>().Int32Value();
|
|
813
|
+
|
|
814
|
+
if (!info[1].IsString()) {
|
|
815
|
+
Napi::TypeError::New(env, "Wrong argument type: params must be a JSON string.").ThrowAsJavaScriptException();
|
|
816
|
+
return env.Null();
|
|
817
|
+
}
|
|
818
|
+
const string json = info[1].As<Napi::String>().Utf8Value();
|
|
819
|
+
|
|
820
|
+
int res = pjw_notify_xfer(subscriber_id, json.c_str());
|
|
821
|
+
|
|
822
|
+
if(res != 0) {
|
|
823
|
+
Napi::Error::New(env, pjw_get_error()).ThrowAsJavaScriptException();
|
|
824
|
+
return env.Null();
|
|
825
|
+
}
|
|
826
|
+
|
|
827
|
+
return env.Null();
|
|
828
|
+
}
|
|
829
|
+
|
|
830
|
+
Napi::Value register_pkg(const Napi::CallbackInfo& info) {
|
|
831
|
+
Napi::Env env = info.Env();
|
|
832
|
+
|
|
833
|
+
if (info.Length() != 2) {
|
|
834
|
+
Napi::Error::New(env, "Wrong number of arguments. Expected: event, accept").ThrowAsJavaScriptException();
|
|
835
|
+
return env.Null();
|
|
836
|
+
}
|
|
837
|
+
|
|
838
|
+
if (!info[0].IsString()) {
|
|
839
|
+
Napi::TypeError::New(env, "event must be string.").ThrowAsJavaScriptException();
|
|
840
|
+
return env.Null();
|
|
841
|
+
}
|
|
842
|
+
string event = info[0].As<Napi::String>().Utf8Value();
|
|
843
|
+
|
|
844
|
+
if (!info[1].IsString()) {
|
|
845
|
+
Napi::TypeError::New(env, "accept must be string.").ThrowAsJavaScriptException();
|
|
846
|
+
return env.Null();
|
|
847
|
+
}
|
|
848
|
+
string accept = info[1].As<Napi::String>().Utf8Value();
|
|
849
|
+
|
|
850
|
+
int res = pjw_register_pkg(event.c_str(), accept.c_str());
|
|
851
|
+
|
|
852
|
+
if(res != 0) {
|
|
853
|
+
Napi::Error::New(env, pjw_get_error()).ThrowAsJavaScriptException();
|
|
854
|
+
return env.Null();
|
|
855
|
+
}
|
|
856
|
+
|
|
857
|
+
return env.Null();
|
|
858
|
+
}
|
|
859
|
+
|
|
860
|
+
Napi::Value subscription_create(const Napi::CallbackInfo& info) {
|
|
861
|
+
Napi::Env env = info.Env();
|
|
862
|
+
|
|
863
|
+
if (info.Length() != 2) {
|
|
864
|
+
Napi::Error::New(env, "Wrong number of arguments. Expected: transport_id, params.").ThrowAsJavaScriptException();
|
|
865
|
+
return env.Null();
|
|
866
|
+
}
|
|
867
|
+
|
|
868
|
+
if (!info[0].IsNumber()) {
|
|
869
|
+
Napi::TypeError::New(env, "transport_id must be number.").ThrowAsJavaScriptException();
|
|
870
|
+
return env.Null();
|
|
871
|
+
}
|
|
872
|
+
int transport_id = info[0].As<Napi::Number>().Int32Value();
|
|
873
|
+
|
|
874
|
+
if (!info[1].IsString()) {
|
|
875
|
+
Napi::TypeError::New(env, "Wrong argument type: params must be a JSON string.").ThrowAsJavaScriptException();
|
|
876
|
+
return env.Null();
|
|
877
|
+
}
|
|
878
|
+
const string json = info[1].As<Napi::String>().Utf8Value();
|
|
879
|
+
|
|
880
|
+
long out_subscription_id;
|
|
881
|
+
|
|
882
|
+
int res = pjw_subscription_create(transport_id, json.c_str(), &out_subscription_id);
|
|
883
|
+
|
|
884
|
+
if(res != 0) {
|
|
885
|
+
Napi::Error::New(env, pjw_get_error()).ThrowAsJavaScriptException();
|
|
886
|
+
return env.Null();
|
|
887
|
+
}
|
|
888
|
+
|
|
889
|
+
return Napi::Number::New(env, out_subscription_id);
|
|
890
|
+
}
|
|
891
|
+
|
|
892
|
+
Napi::Value subscription_subscribe(const Napi::CallbackInfo& info) {
|
|
893
|
+
Napi::Env env = info.Env();
|
|
894
|
+
|
|
895
|
+
if (info.Length() != 2) {
|
|
896
|
+
Napi::Error::New(env, "Wrong number of arguments. Expected: subscription_id, params").ThrowAsJavaScriptException();
|
|
897
|
+
return env.Null();
|
|
898
|
+
}
|
|
899
|
+
|
|
900
|
+
if (!info[0].IsNumber()) {
|
|
901
|
+
Napi::TypeError::New(env, "subscription_id must be number.").ThrowAsJavaScriptException();
|
|
902
|
+
return env.Null();
|
|
903
|
+
}
|
|
904
|
+
int subscription_id = info[0].As<Napi::Number>().Int32Value();
|
|
905
|
+
|
|
906
|
+
if (!info[1].IsString()) {
|
|
907
|
+
Napi::TypeError::New(env, "Wrong argument type: params must be a JSON string.").ThrowAsJavaScriptException();
|
|
908
|
+
return env.Null();
|
|
909
|
+
}
|
|
910
|
+
const string json = info[1].As<Napi::String>().Utf8Value();
|
|
911
|
+
|
|
912
|
+
int res = pjw_subscription_subscribe(subscription_id, json.c_str());
|
|
913
|
+
|
|
914
|
+
if(res != 0) {
|
|
915
|
+
Napi::Error::New(env, pjw_get_error()).ThrowAsJavaScriptException();
|
|
916
|
+
return env.Null();
|
|
917
|
+
}
|
|
918
|
+
|
|
919
|
+
return env.Null();
|
|
920
|
+
}
|
|
921
|
+
|
|
922
|
+
|
|
923
|
+
|
|
924
|
+
Napi::Value set_log_level(const Napi::CallbackInfo& info) {
|
|
925
|
+
Napi::Env env = info.Env();
|
|
926
|
+
|
|
927
|
+
if (info.Length() != 1) {
|
|
928
|
+
Napi::Error::New(env, "Wrong number of arguments. Expected: log_level").ThrowAsJavaScriptException();
|
|
929
|
+
return env.Null();
|
|
930
|
+
}
|
|
931
|
+
|
|
932
|
+
if (!info[0].IsNumber()) {
|
|
933
|
+
Napi::TypeError::New(env, "log_level must be number.").ThrowAsJavaScriptException();
|
|
934
|
+
return env.Null();
|
|
935
|
+
}
|
|
936
|
+
int log_level = info[0].As<Napi::Number>().Int32Value();
|
|
937
|
+
|
|
938
|
+
int res = pjw_log_level(log_level);
|
|
939
|
+
|
|
940
|
+
if(res != 0) {
|
|
941
|
+
Napi::Error::New(env, pjw_get_error()).ThrowAsJavaScriptException();
|
|
942
|
+
return env.Null();
|
|
943
|
+
}
|
|
944
|
+
|
|
945
|
+
return Napi::Number::New(env, 0);
|
|
946
|
+
}
|
|
947
|
+
|
|
948
|
+
|
|
949
|
+
Napi::Value set_flags(const Napi::CallbackInfo& info) {
|
|
950
|
+
Napi::Env env = info.Env();
|
|
951
|
+
|
|
952
|
+
if (info.Length() != 1) {
|
|
953
|
+
Napi::Error::New(env, "Wrong number of arguments. Expected: flags").ThrowAsJavaScriptException();
|
|
954
|
+
return env.Null();
|
|
955
|
+
}
|
|
956
|
+
|
|
957
|
+
if (!info[0].IsNumber()) {
|
|
958
|
+
Napi::TypeError::New(env, "flags must be number.").ThrowAsJavaScriptException();
|
|
959
|
+
return env.Null();
|
|
960
|
+
}
|
|
961
|
+
unsigned flags = info[0].As<Napi::Number>().Uint32Value();
|
|
962
|
+
|
|
963
|
+
pjw_set_flags(flags);
|
|
964
|
+
|
|
965
|
+
return Napi::Number::New(env, 0);
|
|
966
|
+
}
|
|
967
|
+
|
|
968
|
+
|
|
969
|
+
|
|
970
|
+
|
|
971
|
+
static void CallJs(napi_env napiEnv, napi_value napi_js_cb, void* context, void* data) {
|
|
972
|
+
Napi::Env env = Napi::Env(napiEnv);
|
|
973
|
+
|
|
974
|
+
Napi::Function js_cb = Napi::Value(env, napi_js_cb).As<Napi::Function>();
|
|
975
|
+
|
|
976
|
+
Napi::String str = Napi::String::New(env, (char*)data);
|
|
977
|
+
js_cb.Call(env.Global(), { str });
|
|
978
|
+
}
|
|
979
|
+
|
|
980
|
+
Napi::Value start(const Napi::CallbackInfo& info) {
|
|
981
|
+
Napi::Env env = info.Env();
|
|
982
|
+
|
|
983
|
+
if (info.Length() < 1 || !info[0].IsFunction()) {
|
|
984
|
+
Napi::TypeError::New(env, "Function expected as argument[0]").ThrowAsJavaScriptException();
|
|
985
|
+
return env.Undefined();;
|
|
986
|
+
}
|
|
987
|
+
|
|
988
|
+
Napi::Function js_cb = info[0].As<Napi::Function>();
|
|
989
|
+
|
|
990
|
+
Napi::String name = Napi::String::New(env, "bla");
|
|
991
|
+
|
|
992
|
+
napi_status status = napi_create_threadsafe_function(env,
|
|
993
|
+
js_cb,
|
|
994
|
+
NULL,
|
|
995
|
+
name,
|
|
996
|
+
0,
|
|
997
|
+
1,
|
|
998
|
+
NULL,
|
|
999
|
+
NULL,
|
|
1000
|
+
NULL,
|
|
1001
|
+
CallJs,
|
|
1002
|
+
&tsf);
|
|
1003
|
+
if(status != napi_ok) {
|
|
1004
|
+
Napi::TypeError::New(env, "napi_create_threadsafe_function failed").ThrowAsJavaScriptException();
|
|
1005
|
+
return env.Undefined();
|
|
1006
|
+
}
|
|
1007
|
+
|
|
1008
|
+
//boost::thread t{poll};
|
|
1009
|
+
|
|
1010
|
+
return env.Undefined();
|
|
1011
|
+
}
|
|
1012
|
+
|
|
1013
|
+
Napi::Value do_poll(const Napi::CallbackInfo& info) {
|
|
1014
|
+
Napi::Env env = info.Env();
|
|
1015
|
+
|
|
1016
|
+
char buf[4096];
|
|
1017
|
+
int res = __pjw_poll(buf);
|
|
1018
|
+
if(res == 0) {
|
|
1019
|
+
return Napi::String::New(env, buf);
|
|
1020
|
+
} else {
|
|
1021
|
+
return env.Null();
|
|
1022
|
+
}
|
|
1023
|
+
}
|
|
1024
|
+
|
|
1025
|
+
Napi::Value shutdown_(const Napi::CallbackInfo& info) {
|
|
1026
|
+
Napi::Env env = info.Env();
|
|
1027
|
+
|
|
1028
|
+
int res = __pjw_shutdown();
|
|
1029
|
+
|
|
1030
|
+
if(res != 0) {
|
|
1031
|
+
Napi::Error::New(env, pjw_get_error()).ThrowAsJavaScriptException();
|
|
1032
|
+
return env.Null();
|
|
1033
|
+
}
|
|
1034
|
+
|
|
1035
|
+
return env.Null();
|
|
1036
|
+
}
|
|
1037
|
+
|
|
1038
|
+
Napi::Object init(Napi::Env env, Napi::Object exports) {
|
|
1039
|
+
int i = __pjw_init();
|
|
1040
|
+
printf("__pjw_init res=%i\n", i);
|
|
1041
|
+
|
|
1042
|
+
exports.Set("start", Napi::Function::New(env, start));
|
|
1043
|
+
|
|
1044
|
+
exports.Set("transport_create", Napi::Function::New(env, transport_create));
|
|
1045
|
+
|
|
1046
|
+
exports.Set("account_create", Napi::Function::New(env, account_create));
|
|
1047
|
+
exports.Set("account_register", Napi::Function::New(env, account_register));
|
|
1048
|
+
exports.Set("account_unregister", Napi::Function::New(env, account_unregister));
|
|
1049
|
+
|
|
1050
|
+
exports.Set("call_create", Napi::Function::New(env, call_create));
|
|
1051
|
+
exports.Set("call_respond", Napi::Function::New(env, call_respond));
|
|
1052
|
+
exports.Set("call_terminate", Napi::Function::New(env, call_terminate));
|
|
1053
|
+
exports.Set("call_send_dtmf", Napi::Function::New(env, call_send_dtmf));
|
|
1054
|
+
exports.Set("call_reinvite", Napi::Function::New(env, call_reinvite));
|
|
1055
|
+
exports.Set("call_send_request", Napi::Function::New(env, call_send_request));
|
|
1056
|
+
exports.Set("call_start_record_wav", Napi::Function::New(env, call_start_record_wav));
|
|
1057
|
+
exports.Set("call_start_play_wav", Napi::Function::New(env, call_start_play_wav));
|
|
1058
|
+
exports.Set("call_start_fax", Napi::Function::New(env, call_start_fax));
|
|
1059
|
+
exports.Set("call_stop_record_wav", Napi::Function::New(env, call_stop_record_wav));
|
|
1060
|
+
exports.Set("call_stop_play_wav", Napi::Function::New(env, call_stop_play_wav));
|
|
1061
|
+
exports.Set("call_stop_fax", Napi::Function::New(env, call_stop_fax));
|
|
1062
|
+
exports.Set("call_get_stream_stat", Napi::Function::New(env, call_get_stream_stat));
|
|
1063
|
+
exports.Set("call_refer", Napi::Function::New(env, call_refer));
|
|
1064
|
+
exports.Set("call_get_info", Napi::Function::New(env, call_get_info));
|
|
1065
|
+
exports.Set("call_gen_string_replaces", Napi::Function::New(env, call_gen_string_replaces));
|
|
1066
|
+
|
|
1067
|
+
exports.Set("set_log_level", Napi::Function::New(env, set_log_level));
|
|
1068
|
+
|
|
1069
|
+
exports.Set("do_poll", Napi::Function::New(env, do_poll));
|
|
1070
|
+
exports.Set("shutdown", Napi::Function::New(env, shutdown_));
|
|
1071
|
+
|
|
1072
|
+
exports.Set("dtmf_aggregation_on", Napi::Function::New(env, dtmf_aggregation_on));
|
|
1073
|
+
exports.Set("dtmf_aggregation_off", Napi::Function::New(env, dtmf_aggregation_off));
|
|
1074
|
+
|
|
1075
|
+
exports.Set("packetdump_start", Napi::Function::New(env, packetdump_start));
|
|
1076
|
+
exports.Set("packetdump_stop", Napi::Function::New(env, packetdump_stop));
|
|
1077
|
+
|
|
1078
|
+
exports.Set("get_codecs", Napi::Function::New(env, get_codecs));
|
|
1079
|
+
exports.Set("set_codecs", Napi::Function::New(env, set_codecs));
|
|
1080
|
+
|
|
1081
|
+
exports.Set("notify", Napi::Function::New(env, notify));
|
|
1082
|
+
exports.Set("notify_xfer", Napi::Function::New(env, notify_xfer));
|
|
1083
|
+
|
|
1084
|
+
exports.Set("register_pkg", Napi::Function::New(env, register_pkg));
|
|
1085
|
+
|
|
1086
|
+
exports.Set("subscription_create", Napi::Function::New(env, subscription_create));
|
|
1087
|
+
exports.Set("subscription_subscribe", Napi::Function::New(env, subscription_subscribe));
|
|
1088
|
+
|
|
1089
|
+
exports.Set("set_flags", Napi::Function::New(env, set_flags));
|
|
1090
|
+
|
|
1091
|
+
return exports;
|
|
1092
|
+
}
|
|
1093
|
+
|
|
1094
|
+
NODE_API_MODULE(addon, init)
|