sip-lab 1.2.4

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 (41) hide show
  1. package/README.md +38 -0
  2. package/a.js +280 -0
  3. package/binding.gyp +101 -0
  4. package/devjournal +435 -0
  5. package/index.js +68 -0
  6. package/install.sh +32 -0
  7. package/package.json +30 -0
  8. package/samples/late_negotiation.js +278 -0
  9. package/samples/simple.js +280 -0
  10. package/samples/sip_cancel.js +111 -0
  11. package/src/Makefile +42 -0
  12. package/src/README +3 -0
  13. package/src/addon.cpp +1418 -0
  14. package/src/event_templates.cpp +55 -0
  15. package/src/event_templates.hpp +27 -0
  16. package/src/idmanager.cpp +76 -0
  17. package/src/idmanager.hpp +26 -0
  18. package/src/log.cpp +18 -0
  19. package/src/log.hpp +15 -0
  20. package/src/packetdumper.cpp +234 -0
  21. package/src/packetdumper.hpp +67 -0
  22. package/src/pjmedia/Makefile +37 -0
  23. package/src/pjmedia/devjournal +26 -0
  24. package/src/pjmedia/include/chainlink/README +3 -0
  25. package/src/pjmedia/include/chainlink/chainlink.h +11 -0
  26. package/src/pjmedia/include/chainlink/chainlink_dtmfdet.h +56 -0
  27. package/src/pjmedia/include/chainlink/chainlink_tonegen.h +178 -0
  28. package/src/pjmedia/include/chainlink/chainlink_wav_port.h +231 -0
  29. package/src/pjmedia/include/chainlink/chainlink_wire_port.h +50 -0
  30. package/src/pjmedia/include/pjmedia/README +3 -0
  31. package/src/pjmedia/include/pjmedia/dtmfdet.h +74 -0
  32. package/src/pjmedia/src/chainlink/chainlink_dtmfdet.c +125 -0
  33. package/src/pjmedia/src/chainlink/chainlink_tonegen.c +901 -0
  34. package/src/pjmedia/src/chainlink/chainlink_wav_player.c +688 -0
  35. package/src/pjmedia/src/chainlink/chainlink_wav_writer.c +442 -0
  36. package/src/pjmedia/src/chainlink/chainlink_wire_port.c +93 -0
  37. package/src/pjmedia/src/pjmedia/dtmfdet.c +129 -0
  38. package/src/pjmedia/src/pjmedia/simpleua_dtmfdet.c +753 -0
  39. package/src/pjmedia/src/pjmedia/tonegen_dtmfdet.c +263 -0
  40. package/src/sip.cpp +4891 -0
  41. package/src/sip.hpp +64 -0
package/src/addon.cpp ADDED
@@ -0,0 +1,1418 @@
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").ThrowAsJavaScriptException();
53
+ return env.Null();
54
+ }
55
+
56
+ if (!info[0].IsString()) {
57
+ Napi::TypeError::New(env, "Wrong argument type: sip_ipaddr must be string.").ThrowAsJavaScriptException();
58
+ return env.Null();
59
+ }
60
+
61
+ const string sip_ipaddr = info[0].As<Napi::String>().Utf8Value();
62
+
63
+ int port = 0;
64
+
65
+ if (info.Length() > 1) {
66
+ if(!info[1].IsNumber()) {
67
+ Napi::TypeError::New(env, "Wrong argument type: port must be number").ThrowAsJavaScriptException();
68
+ return env.Null();
69
+ }
70
+ port = info[1].As<Napi::Number>().Int32Value();
71
+ }
72
+
73
+ int type = PJSIP_TRANSPORT_UDP;
74
+
75
+ if (info.Length() > 2) {
76
+ if(!info[2].IsNumber()) {
77
+ Napi::TypeError::New(env, "Wrong argument type: transport type must be number").ThrowAsJavaScriptException();
78
+ return env.Null();
79
+ }
80
+ type = info[2].As<Napi::Number>().Int32Value();
81
+ }
82
+
83
+ int out_t_id;
84
+ int out_t_port;
85
+ int res = pjw_transport_create(sip_ipaddr.c_str(), port, (pjsip_transport_type_e)type, &out_t_id, &out_t_port);
86
+
87
+ if(res != 0) {
88
+ Napi::Error::New(env, pjw_get_error()).ThrowAsJavaScriptException();
89
+ return env.Null();
90
+ }
91
+
92
+ Napi::Object obj = Napi::Object::New(env);
93
+ obj.Set(Napi::String::New(env, "id"), Napi::Number::New(env, out_t_id));
94
+ obj.Set(Napi::String::New(env, "ip"), info[0].ToString());
95
+ obj.Set(Napi::String::New(env, "port"), Napi::Number::New(env, out_t_port));
96
+
97
+ return obj;
98
+ }
99
+
100
+
101
+ Napi::Value account_create(const Napi::CallbackInfo& info) {
102
+ Napi::Env env = info.Env();
103
+
104
+ if (info.Length() < 5) {
105
+ Napi::TypeError::New(env, "Wrong number of arguments. Expected: transport_id, domain, server, user, pass [, additional_headers, c_to_url]").ThrowAsJavaScriptException();
106
+ return env.Null();
107
+ }
108
+
109
+ if (!info[0].IsNumber()) {
110
+ Napi::TypeError::New(env, "Wrong argument type: transport_id must be number.").ThrowAsJavaScriptException();
111
+ return env.Null();
112
+ }
113
+ int transport_id = info[0].As<Napi::Number>().Int32Value();
114
+
115
+ if (!info[1].IsString()) {
116
+ Napi::TypeError::New(env, "Wrong argument type: domain must be string.").ThrowAsJavaScriptException();
117
+ return env.Null();
118
+ }
119
+ const string domain = info[1].As<Napi::String>().Utf8Value();
120
+
121
+ if (!info[2].IsString()) {
122
+ Napi::TypeError::New(env, "Wrong argument type: server must be string.").ThrowAsJavaScriptException();
123
+ return env.Null();
124
+ }
125
+ const string server = info[2].As<Napi::String>().Utf8Value();
126
+
127
+ if (!info[3].IsString()) {
128
+ Napi::TypeError::New(env, "Wrong argument type: user must be string.").ThrowAsJavaScriptException();
129
+ return env.Null();
130
+ }
131
+ const string user = info[3].As<Napi::String>().Utf8Value();
132
+
133
+ if (!info[4].IsString()) {
134
+ Napi::TypeError::New(env, "Wrong argument type: password must be string.").ThrowAsJavaScriptException();
135
+ return env.Null();
136
+ }
137
+ const string pass = info[4].As<Napi::String>().Utf8Value();
138
+
139
+ string additional_headers = string("");
140
+
141
+ if (info.Length() > 5) {
142
+ if (!info[5].IsString()) {
143
+ Napi::TypeError::New(env, "Wrong argument type: additional_headers must be string.").ThrowAsJavaScriptException();
144
+ return env.Null();
145
+ }
146
+ additional_headers = info[5].As<Napi::String>().Utf8Value();
147
+ }
148
+
149
+ string c_to_url = string("");
150
+
151
+ if (info.Length() > 6) {
152
+ if (!info[6].IsString()) {
153
+ Napi::TypeError::New(env, "Wrong argument type: c_to_url must be string.").ThrowAsJavaScriptException();
154
+ return env.Null();
155
+ }
156
+ c_to_url = info[6].As<Napi::String>().Utf8Value().c_str();
157
+ }
158
+
159
+ int expires = 60;
160
+
161
+ if (info.Length() > 7) {
162
+ if (!info[7].IsNumber()) {
163
+ Napi::TypeError::New(env, "Wrong argument type: expires must be number.").ThrowAsJavaScriptException();
164
+ return env.Null();
165
+ }
166
+ expires = info[7].As<Napi::Number>().Int32Value();
167
+ }
168
+
169
+ int out_a_id;
170
+ int res = pjw_account_create(transport_id, domain.c_str(), server.c_str(), user.c_str(), pass.c_str(), additional_headers[0] ? additional_headers.c_str() : NULL, c_to_url[0] ? c_to_url.c_str() : NULL, expires, &out_a_id);
171
+
172
+ if(res != 0) {
173
+ Napi::Error::New(env, pjw_get_error()).ThrowAsJavaScriptException();
174
+ return env.Null();
175
+ }
176
+
177
+ return Napi::Number::New(env, out_a_id);
178
+ }
179
+
180
+
181
+ Napi::Value account_register(const Napi::CallbackInfo& info) {
182
+ Napi::Env env = info.Env();
183
+
184
+ if (info.Length() < 1) {
185
+ Napi::TypeError::New(env, "Wrong number of arguments. Expected: account_id [, auto_register]").ThrowAsJavaScriptException();
186
+ return env.Null();
187
+ }
188
+
189
+ if (!info[0].IsNumber()) {
190
+ Napi::TypeError::New(env, "Wrong argument type: account_id must be number.").ThrowAsJavaScriptException();
191
+ return env.Null();
192
+ }
193
+ int account_id = info[0].As<Napi::Number>().Int32Value();
194
+
195
+ bool auto_register = false;
196
+
197
+ if (info.Length() > 1) {
198
+ if(!info[1].IsBoolean()) {
199
+ Napi::TypeError::New(env, "Wrong argument type: auto_register must be boolean").ThrowAsJavaScriptException();
200
+ return env.Null();
201
+ }
202
+ auto_register = info[1].As<Napi::Boolean>().Value();
203
+ }
204
+
205
+ int res = pjw_account_register(account_id, auto_register);
206
+
207
+ if(res != 0) {
208
+ Napi::Error::New(env, pjw_get_error()).ThrowAsJavaScriptException();
209
+ return env.Null();
210
+ }
211
+
212
+ return env.Null();
213
+ }
214
+
215
+ Napi::Value account_unregister(const Napi::CallbackInfo& info) {
216
+ Napi::Env env = info.Env();
217
+
218
+ if (info.Length() != 1) {
219
+ Napi::TypeError::New(env, "Wrong number of arguments. Expected: account_id").ThrowAsJavaScriptException();
220
+ return env.Null();
221
+ }
222
+
223
+ if (!info[0].IsNumber()) {
224
+ Napi::TypeError::New(env, "Wrong argument type: account_id must be number.").ThrowAsJavaScriptException();
225
+ return env.Null();
226
+ }
227
+ int account_id = info[0].As<Napi::Number>().Int32Value();
228
+
229
+ int res = pjw_account_unregister(account_id);
230
+
231
+ if(res != 0) {
232
+ Napi::Error::New(env, pjw_get_error()).ThrowAsJavaScriptException();
233
+ return env.Null();
234
+ }
235
+
236
+ return env.Null();
237
+ }
238
+
239
+
240
+ Napi::Value call_create(const Napi::CallbackInfo& info) {
241
+ Napi::Env env = info.Env();
242
+
243
+ if (info.Length() < 4) {
244
+ Napi::Error::New(env, "Wrong number of arguments. Expected: transport_id, flags, from_uri, to_uri [, request_uri, proxy_uri, additional_headers, realm, user, pass]").ThrowAsJavaScriptException();
245
+ return env.Null();
246
+ }
247
+
248
+ if (!info[0].IsNumber()) {
249
+ Napi::TypeError::New(env, "transport_id must be number.").ThrowAsJavaScriptException();
250
+ return env.Null();
251
+ }
252
+ int transport_id = info[0].As<Napi::Number>().Int32Value();
253
+
254
+ if (!info[0].IsNumber()) {
255
+ Napi::TypeError::New(env, "flags must be number.").ThrowAsJavaScriptException();
256
+ return env.Null();
257
+ }
258
+ unsigned flags = info[1].As<Napi::Number>().Uint32Value();
259
+
260
+ if (!info[2].IsString()) {
261
+ Napi::TypeError::New(env, "from_uri must be string.").ThrowAsJavaScriptException();
262
+ return env.Null();
263
+ }
264
+ const string from_uri = info[2].As<Napi::String>().Utf8Value();
265
+
266
+ if (!info[3].IsString()) {
267
+ Napi::TypeError::New(env, "to_uri must be string.").ThrowAsJavaScriptException();
268
+ return env.Null();
269
+ }
270
+ const string to_uri = info[3].As<Napi::String>().Utf8Value();
271
+
272
+ string request_uri = string("");
273
+
274
+ if (info.Length() > 4) {
275
+ if (!info[3].IsString()) {
276
+ Napi::TypeError::New(env, "request_uri must be string.").ThrowAsJavaScriptException();
277
+ return env.Null();
278
+ }
279
+ request_uri = info[4].As<Napi::String>().Utf8Value();
280
+ } else {
281
+ request_uri = to_uri; // TODO: remove angle brackets if present
282
+ }
283
+
284
+ string proxy_uri = string("");
285
+
286
+ if (info.Length() > 5) {
287
+ if (!info[5].IsString()) {
288
+ Napi::TypeError::New(env, "proxy_uri must be string.").ThrowAsJavaScriptException();
289
+ return env.Null();
290
+ }
291
+ proxy_uri = info[5].As<Napi::String>().Utf8Value();
292
+ }
293
+
294
+ string additional_headers = string("");
295
+
296
+ if (info.Length() > 6) {
297
+ if (!info[5].IsString()) {
298
+ Napi::TypeError::New(env, "additional_headers must be string.").ThrowAsJavaScriptException();
299
+ return env.Null();
300
+ }
301
+ additional_headers = info[5].As<Napi::String>().Utf8Value();
302
+ }
303
+
304
+ string c_to_url = string("");
305
+
306
+ string realm = string("");
307
+ string user = string("");
308
+ string pass = string("");
309
+
310
+ if (info.Length() > 7) {
311
+ if(info.Length() < 10) {
312
+ Napi::Error::New(env, "incomplete credentials arguments: you must provide realm, user and pass").ThrowAsJavaScriptException();
313
+ return env.Null();
314
+ }
315
+
316
+ if (!info[7].IsString()) {
317
+ Napi::TypeError::New(env, "realm must be string.").ThrowAsJavaScriptException();
318
+ return env.Null();
319
+ }
320
+ realm = info[7].As<Napi::String>().Utf8Value().c_str();
321
+
322
+ if (!info[8].IsString()) {
323
+ Napi::TypeError::New(env, "user must be string.").ThrowAsJavaScriptException();
324
+ return env.Null();
325
+ }
326
+ user = info[8].As<Napi::String>().Utf8Value().c_str();
327
+
328
+ if (!info[9].IsString()) {
329
+ Napi::TypeError::New(env, "pass must be string.").ThrowAsJavaScriptException();
330
+ return env.Null();
331
+ }
332
+ pass = info[9].As<Napi::String>().Utf8Value().c_str();
333
+ }
334
+
335
+ long int out_call_id;
336
+ char out_sip_call_id[256];
337
+
338
+ int res = pjw_call_create(transport_id, flags, from_uri.c_str(), to_uri.c_str(), request_uri.c_str(), proxy_uri[0] ? proxy_uri.c_str() : NULL, additional_headers[0] ? additional_headers.c_str() : NULL, realm[0] ? realm.c_str() : NULL, user[0] ? user.c_str() : NULL, pass[0] ? pass.c_str() : NULL, &out_call_id, out_sip_call_id);
339
+
340
+ if(res != 0) {
341
+ Napi::Error::New(env, pjw_get_error()).ThrowAsJavaScriptException();
342
+ return env.Null();
343
+ }
344
+
345
+ Napi::Object obj = Napi::Object::New(env);
346
+ obj.Set(Napi::String::New(env, "id"), Napi::Number::New(env, out_call_id));
347
+ obj.Set(Napi::String::New(env, "sip_call_id"), out_sip_call_id);
348
+
349
+ return obj;
350
+ }
351
+
352
+ Napi::Value call_respond(const Napi::CallbackInfo& info) {
353
+ Napi::Env env = info.Env();
354
+
355
+ if (info.Length() < 3) {
356
+ Napi::Error::New(env, "Wrong number of arguments. Expected: call_id, code, reason [, additional_headers]").ThrowAsJavaScriptException();
357
+ return env.Null();
358
+ }
359
+
360
+ if (!info[0].IsNumber()) {
361
+ Napi::TypeError::New(env, "call_id must be number.").ThrowAsJavaScriptException();
362
+ return env.Null();
363
+ }
364
+ int call_id = info[0].As<Napi::Number>().Int32Value();
365
+
366
+ if (!info[1].IsNumber()) {
367
+ Napi::TypeError::New(env, "code must be number.").ThrowAsJavaScriptException();
368
+ return env.Null();
369
+ }
370
+ int code = info[1].As<Napi::Number>().Int32Value();
371
+
372
+ if (!info[2].IsString()) {
373
+ Napi::TypeError::New(env, "reason must be string.").ThrowAsJavaScriptException();
374
+ return env.Null();
375
+ }
376
+ const string reason = info[2].As<Napi::String>().Utf8Value();
377
+
378
+ string additional_headers = string("");
379
+
380
+ if (info.Length() > 3) {
381
+ if (!info[3].IsString()) {
382
+ Napi::TypeError::New(env, "additional_headers must be string.").ThrowAsJavaScriptException();
383
+ return env.Null();
384
+ }
385
+ additional_headers = info[3].As<Napi::String>().Utf8Value();
386
+ }
387
+
388
+ int res = pjw_call_respond(call_id, code, reason.c_str(), additional_headers[0] ? additional_headers.c_str() : NULL);
389
+
390
+ if(res != 0) {
391
+ Napi::Error::New(env, pjw_get_error()).ThrowAsJavaScriptException();
392
+ return env.Null();
393
+ }
394
+
395
+ return env.Null();
396
+ }
397
+
398
+ Napi::Value call_terminate(const Napi::CallbackInfo& info) {
399
+ Napi::Env env = info.Env();
400
+
401
+ if (info.Length() < 1) {
402
+ Napi::Error::New(env, "Wrong number of arguments. Expected: call_id [, code, reason, additional_headers]").ThrowAsJavaScriptException();
403
+ return env.Null();
404
+ }
405
+
406
+ if (!info[0].IsNumber()) {
407
+ Napi::TypeError::New(env, "call_id must be number.").ThrowAsJavaScriptException();
408
+ return env.Null();
409
+ }
410
+ int call_id = info[0].As<Napi::Number>().Int32Value();
411
+
412
+ int code = 0;
413
+ if (info.Length() > 1) {
414
+ if (!info[1].IsNumber()) {
415
+ Napi::TypeError::New(env, "code must be number.").ThrowAsJavaScriptException();
416
+ return env.Null();
417
+ }
418
+ code = info[1].As<Napi::Number>().Int32Value();
419
+ }
420
+
421
+ string reason = string("");
422
+
423
+ if (info.Length() > 2) {
424
+ if (!info[2].IsString()) {
425
+ Napi::TypeError::New(env, "reason must be string.").ThrowAsJavaScriptException();
426
+ return env.Null();
427
+ }
428
+ reason = info[2].As<Napi::String>().Utf8Value();
429
+ }
430
+
431
+ string additional_headers = string("");
432
+
433
+ if (info.Length() > 3) {
434
+ if (!info[3].IsString()) {
435
+ Napi::TypeError::New(env, "additional_headers must be string.").ThrowAsJavaScriptException();
436
+ return env.Null();
437
+ }
438
+ additional_headers = info[3].As<Napi::String>().Utf8Value();
439
+ }
440
+
441
+ int res = pjw_call_terminate(call_id, code, reason[0] ? reason.c_str() : NULL, additional_headers[0] ? additional_headers.c_str() : NULL);
442
+
443
+ if(res != 0) {
444
+ Napi::Error::New(env, pjw_get_error()).ThrowAsJavaScriptException();
445
+ return env.Null();
446
+ }
447
+
448
+ return env.Null();
449
+ }
450
+
451
+ Napi::Value call_send_dtmf(const Napi::CallbackInfo& info) {
452
+ Napi::Env env = info.Env();
453
+
454
+ if (info.Length() != 3) {
455
+ Napi::Error::New(env, "Wrong number of arguments. Expected: call_id, digits, mode").ThrowAsJavaScriptException();
456
+ return env.Null();
457
+ }
458
+
459
+ if (!info[0].IsNumber()) {
460
+ Napi::TypeError::New(env, "call_id must be number.").ThrowAsJavaScriptException();
461
+ return env.Null();
462
+ }
463
+ int call_id = info[0].As<Napi::Number>().Int32Value();
464
+
465
+ string digits = string("");
466
+ if (!info[1].IsString()) {
467
+ Napi::TypeError::New(env, "digits must be string.").ThrowAsJavaScriptException();
468
+ return env.Null();
469
+ }
470
+ digits = info[1].As<Napi::String>().Utf8Value();
471
+
472
+ if(digits.length() == 0) {
473
+ Napi::Error::New(env, "digits is empty string").ThrowAsJavaScriptException();
474
+ return env.Null();
475
+ }
476
+
477
+ int mode = 0;
478
+ if (!info[2].IsNumber()) {
479
+ Napi::TypeError::New(env, "mode must be number.").ThrowAsJavaScriptException();
480
+ return env.Null();
481
+ }
482
+ mode = info[2].As<Napi::Number>().Int32Value();
483
+
484
+ if(mode != 0 && mode != 1) {
485
+ Napi::TypeError::New(env, "mode must be 0 (RFC2833) or 1 (in-band)").ThrowAsJavaScriptException();
486
+ return env.Null();
487
+ }
488
+
489
+ int res = pjw_call_send_dtmf(call_id, digits.c_str(), mode);
490
+
491
+ if(res != 0) {
492
+ Napi::Error::New(env, pjw_get_error()).ThrowAsJavaScriptException();
493
+ return env.Null();
494
+ }
495
+
496
+ return env.Null();
497
+ }
498
+
499
+ Napi::Value call_reinvite(const Napi::CallbackInfo& info) {
500
+ Napi::Env env = info.Env();
501
+
502
+ if (info.Length() != 3) {
503
+ Napi::Error::New(env, "Wrong number of arguments. Expected: call_id, hold, flags").ThrowAsJavaScriptException();
504
+ return env.Null();
505
+ }
506
+
507
+ if (!info[0].IsNumber()) {
508
+ Napi::TypeError::New(env, "call_id must be number.").ThrowAsJavaScriptException();
509
+ return env.Null();
510
+ }
511
+ int call_id = info[0].As<Napi::Number>().Int32Value();
512
+
513
+ if(!info[1].IsBoolean()) {
514
+ Napi::TypeError::New(env, "Wrong argument type: hold must be boolean").ThrowAsJavaScriptException();
515
+ return env.Null();
516
+ }
517
+ bool hold = info[1].As<Napi::Boolean>().Value();
518
+
519
+ if (!info[2].IsNumber()) {
520
+ Napi::TypeError::New(env, "flags must be number.").ThrowAsJavaScriptException();
521
+ return env.Null();
522
+ }
523
+ unsigned flags = info[2].As<Napi::Number>().Uint32Value();
524
+
525
+ int res = pjw_call_reinvite(call_id, hold, flags);
526
+
527
+ if(res != 0) {
528
+ Napi::Error::New(env, pjw_get_error()).ThrowAsJavaScriptException();
529
+ return env.Null();
530
+ }
531
+
532
+ return env.Null();
533
+ }
534
+
535
+ Napi::Value call_send_request(const Napi::CallbackInfo& info) {
536
+ Napi::Env env = info.Env();
537
+
538
+ if (info.Length() < 2) {
539
+ Napi::Error::New(env, "Wrong number of arguments. Expected: call_id, method [, additional_headers, body, ct_type, ct_subtype]").ThrowAsJavaScriptException();
540
+ return env.Null();
541
+ }
542
+
543
+ if (!info[0].IsNumber()) {
544
+ Napi::TypeError::New(env, "call_id must be number.").ThrowAsJavaScriptException();
545
+ return env.Null();
546
+ }
547
+ int call_id = info[0].As<Napi::Number>().Int32Value();
548
+
549
+ string method = string("");
550
+ if (!info[1].IsString()) {
551
+ Napi::TypeError::New(env, "method must be string.").ThrowAsJavaScriptException();
552
+ return env.Null();
553
+ }
554
+ method = info[1].As<Napi::String>().Utf8Value();
555
+
556
+ string additional_headers = string("");
557
+ if (info.Length() > 2) {
558
+ if (!info[2].IsString()) {
559
+ Napi::TypeError::New(env, "additional_headers must be string.").ThrowAsJavaScriptException();
560
+ return env.Null();
561
+ }
562
+ additional_headers = info[2].As<Napi::String>().Utf8Value();
563
+ }
564
+
565
+ string body = string("");
566
+ if (info.Length() > 3) {
567
+ if (!info[3].IsString()) {
568
+ Napi::TypeError::New(env, "body must be string.").ThrowAsJavaScriptException();
569
+ return env.Null();
570
+ }
571
+ body = info[3].As<Napi::String>().Utf8Value();
572
+ }
573
+
574
+ string ct_type = string("");
575
+ if (info.Length() > 4) {
576
+ if (!info[4].IsString()) {
577
+ Napi::TypeError::New(env, "ct_type must be string.").ThrowAsJavaScriptException();
578
+ return env.Null();
579
+ }
580
+ ct_type = info[4].As<Napi::String>().Utf8Value();
581
+ }
582
+
583
+ string ct_subtype = string("");
584
+ if (info.Length() > 5) {
585
+ if (!info[5].IsString()) {
586
+ Napi::TypeError::New(env, "ct_subtype must be string.").ThrowAsJavaScriptException();
587
+ return env.Null();
588
+ }
589
+ ct_subtype = info[5].As<Napi::String>().Utf8Value();
590
+ }
591
+
592
+ int res = pjw_call_send_request(call_id, method.c_str(), additional_headers[0] ? additional_headers.c_str() : NULL, body[0] ? body.c_str() : NULL, ct_type[0] ? ct_type.c_str() : NULL, ct_subtype[0] ? ct_subtype.c_str(): NULL);
593
+
594
+ if(res != 0) {
595
+ Napi::Error::New(env, pjw_get_error()).ThrowAsJavaScriptException();
596
+ return env.Null();
597
+ }
598
+
599
+ return env.Null();
600
+ }
601
+
602
+ Napi::Value call_start_record_wav(const Napi::CallbackInfo& info) {
603
+ Napi::Env env = info.Env();
604
+
605
+ if (info.Length() != 2) {
606
+ Napi::Error::New(env, "Wrong number of arguments. Expected: call_id, output_file]").ThrowAsJavaScriptException();
607
+ return env.Null();
608
+ }
609
+
610
+ if (!info[0].IsNumber()) {
611
+ Napi::TypeError::New(env, "call_id must be number.").ThrowAsJavaScriptException();
612
+ return env.Null();
613
+ }
614
+ int call_id = info[0].As<Napi::Number>().Int32Value();
615
+
616
+ if (!info[1].IsString()) {
617
+ Napi::TypeError::New(env, "output_file must be string.").ThrowAsJavaScriptException();
618
+ return env.Null();
619
+ }
620
+ string output_file = info[1].As<Napi::String>().Utf8Value();
621
+
622
+ if (output_file.length() == 0) {
623
+ Napi::Error::New(env, "output_file is invalid (blank string)").ThrowAsJavaScriptException();
624
+ return env.Null();
625
+ }
626
+
627
+ int res = pjw_call_start_record_wav(call_id, output_file.c_str());
628
+
629
+ if(res != 0) {
630
+ Napi::Error::New(env, pjw_get_error()).ThrowAsJavaScriptException();
631
+ return env.Null();
632
+ }
633
+
634
+ return env.Null();
635
+ }
636
+
637
+ Napi::Value call_start_play_wav(const Napi::CallbackInfo& info) {
638
+ Napi::Env env = info.Env();
639
+
640
+ if (info.Length() != 2) {
641
+ Napi::Error::New(env, "Wrong number of arguments. Expected: call_id, input_file]").ThrowAsJavaScriptException();
642
+ return env.Null();
643
+ }
644
+
645
+ if (!info[0].IsNumber()) {
646
+ Napi::TypeError::New(env, "call_id must be number.").ThrowAsJavaScriptException();
647
+ return env.Null();
648
+ }
649
+ int call_id = info[0].As<Napi::Number>().Int32Value();
650
+
651
+ if (!info[1].IsString()) {
652
+ Napi::TypeError::New(env, "input_file must be string.").ThrowAsJavaScriptException();
653
+ return env.Null();
654
+ }
655
+ string input_file = info[1].As<Napi::String>().Utf8Value();
656
+
657
+ if (input_file.length() == 0) {
658
+ Napi::Error::New(env, "input_file is invalid (blank string)").ThrowAsJavaScriptException();
659
+ return env.Null();
660
+ }
661
+
662
+ int res = pjw_call_start_play_wav(call_id, input_file.c_str());
663
+
664
+ if(res != 0) {
665
+ Napi::Error::New(env, pjw_get_error()).ThrowAsJavaScriptException();
666
+ return env.Null();
667
+ }
668
+
669
+ return env.Null();
670
+ }
671
+
672
+ Napi::Value call_stop_record_wav(const Napi::CallbackInfo& info) {
673
+ Napi::Env env = info.Env();
674
+
675
+ if (info.Length() != 1) {
676
+ Napi::Error::New(env, "Wrong number of arguments. Expected: call_id").ThrowAsJavaScriptException();
677
+ return env.Null();
678
+ }
679
+
680
+ if (!info[0].IsNumber()) {
681
+ Napi::TypeError::New(env, "call_id must be number.").ThrowAsJavaScriptException();
682
+ return env.Null();
683
+ }
684
+ int call_id = info[0].As<Napi::Number>().Int32Value();
685
+
686
+ int res = pjw_call_stop_record_wav(call_id);
687
+
688
+ if(res != 0) {
689
+ Napi::Error::New(env, pjw_get_error()).ThrowAsJavaScriptException();
690
+ return env.Null();
691
+ }
692
+
693
+ return env.Null();
694
+ }
695
+
696
+ Napi::Value call_stop_play_wav(const Napi::CallbackInfo& info) {
697
+ Napi::Env env = info.Env();
698
+
699
+ if (info.Length() != 1) {
700
+ Napi::Error::New(env, "Wrong number of arguments. Expected: call_id").ThrowAsJavaScriptException();
701
+ return env.Null();
702
+ }
703
+
704
+ if (!info[0].IsNumber()) {
705
+ Napi::TypeError::New(env, "call_id must be number.").ThrowAsJavaScriptException();
706
+ return env.Null();
707
+ }
708
+ int call_id = info[0].As<Napi::Number>().Int32Value();
709
+
710
+ int res = pjw_call_stop_play_wav(call_id);
711
+
712
+ if(res != 0) {
713
+ Napi::Error::New(env, pjw_get_error()).ThrowAsJavaScriptException();
714
+ return env.Null();
715
+ }
716
+
717
+ return env.Null();
718
+ }
719
+
720
+ Napi::Value call_get_stream_stat(const Napi::CallbackInfo& info) {
721
+ Napi::Env env = info.Env();
722
+
723
+ if (info.Length() != 1) {
724
+ Napi::Error::New(env, "Wrong number of arguments. Expected: call_id").ThrowAsJavaScriptException();
725
+ return env.Null();
726
+ }
727
+
728
+ if (!info[0].IsNumber()) {
729
+ Napi::TypeError::New(env, "call_id must be number.").ThrowAsJavaScriptException();
730
+ return env.Null();
731
+ }
732
+ int call_id = info[0].As<Napi::Number>().Int32Value();
733
+
734
+ char out_stats[4096];
735
+ int res = pjw_call_get_stream_stat(call_id, out_stats);
736
+
737
+ if(res != 0) {
738
+ Napi::Error::New(env, pjw_get_error()).ThrowAsJavaScriptException();
739
+ return env.Null();
740
+ }
741
+
742
+ return Napi::String::New(env, out_stats);
743
+ }
744
+
745
+ Napi::Value call_refer(const Napi::CallbackInfo& info) {
746
+ Napi::Env env = info.Env();
747
+
748
+ if (info.Length() < 2) {
749
+ Napi::Error::New(env, "Wrong number of arguments. Expected: call_id, dest_uri [, additional_headers]").ThrowAsJavaScriptException();
750
+ return env.Null();
751
+ }
752
+
753
+ if (!info[0].IsNumber()) {
754
+ Napi::TypeError::New(env, "call_id must be number.").ThrowAsJavaScriptException();
755
+ return env.Null();
756
+ }
757
+ int call_id = info[0].As<Napi::Number>().Int32Value();
758
+
759
+ if (!info[1].IsString()) {
760
+ Napi::TypeError::New(env, "reason must be string.").ThrowAsJavaScriptException();
761
+ return env.Null();
762
+ }
763
+ const string dest_uri = info[1].As<Napi::String>().Utf8Value();
764
+
765
+ string additional_headers = string("");
766
+ if (info.Length() > 2) {
767
+ if (!info[2].IsString()) {
768
+ Napi::TypeError::New(env, "additional_headers must be string.").ThrowAsJavaScriptException();
769
+ return env.Null();
770
+ }
771
+ additional_headers = info[2].As<Napi::String>().Utf8Value();
772
+ }
773
+
774
+ long out_subscription_id;
775
+
776
+ int res = pjw_call_refer(call_id, dest_uri.c_str(), additional_headers[0] ? additional_headers.c_str() : NULL, &out_subscription_id);
777
+
778
+ if(res != 0) {
779
+ Napi::Error::New(env, pjw_get_error()).ThrowAsJavaScriptException();
780
+ return env.Null();
781
+ }
782
+
783
+ return Napi::Number::New(env, out_subscription_id);
784
+ }
785
+
786
+ Napi::Value call_get_info(const Napi::CallbackInfo& info) {
787
+ Napi::Env env = info.Env();
788
+
789
+ if (info.Length() != 2) {
790
+ Napi::Error::New(env, "Wrong number of arguments. Expected: call_id, required_info").ThrowAsJavaScriptException();
791
+ return env.Null();
792
+ }
793
+
794
+ if (!info[0].IsNumber()) {
795
+ Napi::TypeError::New(env, "call_id must be number.").ThrowAsJavaScriptException();
796
+ return env.Null();
797
+ }
798
+ int call_id = info[0].As<Napi::Number>().Int32Value();
799
+
800
+ if (!info[1].IsString()) {
801
+ Napi::TypeError::New(env, "required_info must be string.").ThrowAsJavaScriptException();
802
+ return env.Null();
803
+ }
804
+ string required_info = info[1].As<Napi::String>().Utf8Value();
805
+
806
+ if(required_info != "Call-ID" && required_info != "RemoteMediaEndPoint") {
807
+ Napi::TypeError::New(env, "required_info must be 'Call-ID' or 'RemoteMediaEndPoint'.").ThrowAsJavaScriptException();
808
+ return env.Null();
809
+ }
810
+
811
+ char out_info[4096];
812
+
813
+ int res = pjw_call_get_info(call_id, required_info.c_str(), out_info);
814
+
815
+ if(res != 0) {
816
+ Napi::Error::New(env, pjw_get_error()).ThrowAsJavaScriptException();
817
+ return env.Null();
818
+ }
819
+
820
+ return Napi::String::New(env, out_info);
821
+ }
822
+
823
+ Napi::Value call_gen_string_replaces(const Napi::CallbackInfo& info) {
824
+ Napi::Env env = info.Env();
825
+
826
+ if (info.Length() != 1) {
827
+ Napi::Error::New(env, "Wrong number of arguments. Expected: call_id").ThrowAsJavaScriptException();
828
+ return env.Null();
829
+ }
830
+
831
+ if (!info[0].IsNumber()) {
832
+ Napi::TypeError::New(env, "call_id must be number.").ThrowAsJavaScriptException();
833
+ return env.Null();
834
+ }
835
+ int call_id = info[0].As<Napi::Number>().Int32Value();
836
+
837
+ char out_replaces[4096];
838
+
839
+ int res = pjw_call_gen_string_replaces(call_id, out_replaces);
840
+
841
+ if(res != 0) {
842
+ Napi::Error::New(env, pjw_get_error()).ThrowAsJavaScriptException();
843
+ return env.Null();
844
+ }
845
+
846
+ return Napi::String::New(env, out_replaces);
847
+ }
848
+
849
+
850
+
851
+ Napi::Value dtmf_aggregation_on(const Napi::CallbackInfo& info) {
852
+ Napi::Env env = info.Env();
853
+
854
+ if (info.Length() != 1) {
855
+ Napi::Error::New(env, "Wrong number of arguments. Expected: inter_digit_timer").ThrowAsJavaScriptException();
856
+ return env.Null();
857
+ }
858
+
859
+ if (!info[0].IsNumber()) {
860
+ Napi::TypeError::New(env, "inter_digit_timer must be number.").ThrowAsJavaScriptException();
861
+ return env.Null();
862
+ }
863
+ int inter_digit_timer = info[0].As<Napi::Number>().Int32Value();
864
+
865
+ int res = pjw_dtmf_aggregation_on(inter_digit_timer);
866
+
867
+ if(res != 0) {
868
+ Napi::Error::New(env, pjw_get_error()).ThrowAsJavaScriptException();
869
+ return env.Null();
870
+ }
871
+
872
+ return env.Null();
873
+ }
874
+
875
+
876
+ Napi::Value dtmf_aggregation_off(const Napi::CallbackInfo& info) {
877
+ Napi::Env env = info.Env();
878
+
879
+ int res = pjw_dtmf_aggregation_off();
880
+
881
+ if(res != 0) {
882
+ Napi::Error::New(env, pjw_get_error()).ThrowAsJavaScriptException();
883
+ return env.Null();
884
+ }
885
+
886
+ return env.Null();
887
+ }
888
+
889
+
890
+ Napi::Value packetdump_start(const Napi::CallbackInfo& info) {
891
+ Napi::Env env = info.Env();
892
+
893
+ if (info.Length() != 2) {
894
+ Napi::Error::New(env, "Wrong number of arguments. Expected: dev, pcap_file").ThrowAsJavaScriptException();
895
+ return env.Null();
896
+ }
897
+
898
+ if (!info[0].IsString()) {
899
+ Napi::TypeError::New(env, "dev must be string.").ThrowAsJavaScriptException();
900
+ return env.Null();
901
+ }
902
+ string dev = info[0].As<Napi::String>().Utf8Value();
903
+
904
+ if (dev.length() == 0) {
905
+ Napi::Error::New(env, "dev is invalid (blank string)").ThrowAsJavaScriptException();
906
+ return env.Null();
907
+ }
908
+
909
+ if (!info[1].IsString()) {
910
+ Napi::TypeError::New(env, "pcap_file must be string.").ThrowAsJavaScriptException();
911
+ return env.Null();
912
+ }
913
+ string pcap_file = info[1].As<Napi::String>().Utf8Value();
914
+
915
+ if (pcap_file.length() == 0) {
916
+ Napi::Error::New(env, "dev is invalid (blank string)").ThrowAsJavaScriptException();
917
+ return env.Null();
918
+ }
919
+
920
+ int res = pjw_packetdump_start(dev.c_str(), pcap_file.c_str());
921
+
922
+ if(res != 0) {
923
+ Napi::Error::New(env, pjw_get_error()).ThrowAsJavaScriptException();
924
+ return env.Null();
925
+ }
926
+
927
+ return env.Null();
928
+ }
929
+
930
+ Napi::Value packetdump_stop(const Napi::CallbackInfo& info) {
931
+ Napi::Env env = info.Env();
932
+
933
+ int res = pjw_packetdump_stop();
934
+
935
+ if(res != 0) {
936
+ Napi::Error::New(env, pjw_get_error()).ThrowAsJavaScriptException();
937
+ return env.Null();
938
+ }
939
+
940
+ return env.Null();
941
+ }
942
+
943
+ Napi::Value get_codecs(const Napi::CallbackInfo& info) {
944
+ Napi::Env env = info.Env();
945
+
946
+ char out_codecs[4096];
947
+ int res = pjw_get_codecs(out_codecs);
948
+
949
+ if(res != 0) {
950
+ Napi::Error::New(env, pjw_get_error()).ThrowAsJavaScriptException();
951
+ return env.Null();
952
+ }
953
+
954
+ return Napi::String::New(env, out_codecs);
955
+ }
956
+
957
+ Napi::Value set_codecs(const Napi::CallbackInfo& info) {
958
+ Napi::Env env = info.Env();
959
+
960
+ if (info.Length() != 1) {
961
+ Napi::Error::New(env, "Wrong number of arguments. Expected: codec_info").ThrowAsJavaScriptException();
962
+ return env.Null();
963
+ }
964
+
965
+ if (!info[0].IsString()) {
966
+ Napi::TypeError::New(env, "codec_info must be string.").ThrowAsJavaScriptException();
967
+ return env.Null();
968
+ }
969
+ string codec_info = info[0].As<Napi::String>().Utf8Value();
970
+
971
+ int res = pjw_set_codecs(codec_info.c_str());
972
+
973
+ if(res != 0) {
974
+ Napi::Error::New(env, pjw_get_error()).ThrowAsJavaScriptException();
975
+ return env.Null();
976
+ }
977
+
978
+ return env.Null();
979
+ }
980
+
981
+ Napi::Value notify(const Napi::CallbackInfo& info) {
982
+ Napi::Env env = info.Env();
983
+
984
+ if (info.Length() < 5) {
985
+ Napi::Error::New(env, "Wrong number of arguments. Expected: subscriber_id, content_type, body, subscription_state, reason [, additional_headers]").ThrowAsJavaScriptException();
986
+ return env.Null();
987
+ }
988
+
989
+ if (!info[0].IsNumber()) {
990
+ Napi::TypeError::New(env, "subscriber_id must be number.").ThrowAsJavaScriptException();
991
+ return env.Null();
992
+ }
993
+ int subscriber_id = info[0].As<Napi::Number>().Int32Value();
994
+
995
+ if (!info[1].IsString()) {
996
+ Napi::TypeError::New(env, "content_type must be string.").ThrowAsJavaScriptException();
997
+ return env.Null();
998
+ }
999
+ string content_type = info[1].As<Napi::String>().Utf8Value();
1000
+
1001
+ if (!info[2].IsString()) {
1002
+ Napi::TypeError::New(env, "body must be string.").ThrowAsJavaScriptException();
1003
+ return env.Null();
1004
+ }
1005
+ string body = info[2].As<Napi::String>().Utf8Value();
1006
+
1007
+ if (!info[3].IsNumber()) {
1008
+ Napi::TypeError::New(env, "subscription_state must be number.").ThrowAsJavaScriptException();
1009
+ return env.Null();
1010
+ }
1011
+ int subscription_state = info[3].As<Napi::Number>().Int32Value();
1012
+
1013
+ if (!info[4].IsString()) {
1014
+ Napi::TypeError::New(env, "reason must be string.").ThrowAsJavaScriptException();
1015
+ return env.Null();
1016
+ }
1017
+ string reason = info[4].As<Napi::String>().Utf8Value();
1018
+
1019
+ string additional_headers = string("");
1020
+ if (info.Length() > 5) {
1021
+ if (!info[5].IsString()) {
1022
+ Napi::TypeError::New(env, "additional_headers must be string.").ThrowAsJavaScriptException();
1023
+ return env.Null();
1024
+ }
1025
+ additional_headers = info[5].As<Napi::String>().Utf8Value();
1026
+ }
1027
+
1028
+ int res = pjw_notify(subscriber_id, content_type.c_str(), body.c_str(), subscription_state, reason.c_str(), additional_headers[0] ? additional_headers.c_str() : NULL);
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::Value notify_xfer(const Napi::CallbackInfo& info) {
1039
+ Napi::Env env = info.Env();
1040
+
1041
+ if (info.Length() != 4) {
1042
+ Napi::Error::New(env, "Wrong number of arguments. Expected: subscriber_id, subscription_state, xfer_status_code, xfer_status_text").ThrowAsJavaScriptException();
1043
+ return env.Null();
1044
+ }
1045
+
1046
+ if (!info[0].IsNumber()) {
1047
+ Napi::TypeError::New(env, "subscriber_id must be number.").ThrowAsJavaScriptException();
1048
+ return env.Null();
1049
+ }
1050
+ int subscriber_id = info[0].As<Napi::Number>().Int32Value();
1051
+
1052
+ if (!info[1].IsNumber()) {
1053
+ Napi::TypeError::New(env, "subscription_state must be number.").ThrowAsJavaScriptException();
1054
+ return env.Null();
1055
+ }
1056
+ int subscription_state = info[1].As<Napi::Number>().Int32Value();
1057
+
1058
+ if (!info[2].IsNumber()) {
1059
+ Napi::TypeError::New(env, "xfer_status_code must be number.").ThrowAsJavaScriptException();
1060
+ return env.Null();
1061
+ }
1062
+ int xfer_status_code = info[2].As<Napi::Number>().Int32Value();
1063
+
1064
+ if (!info[3].IsString()) {
1065
+ Napi::TypeError::New(env, "xfer_status_text must be string.").ThrowAsJavaScriptException();
1066
+ return env.Null();
1067
+ }
1068
+ string xfer_status_text= info[3].As<Napi::String>().Utf8Value();
1069
+
1070
+ int res = pjw_notify_xfer(subscriber_id, subscription_state, xfer_status_code, xfer_status_text.c_str());
1071
+
1072
+ if(res != 0) {
1073
+ Napi::Error::New(env, pjw_get_error()).ThrowAsJavaScriptException();
1074
+ return env.Null();
1075
+ }
1076
+
1077
+ return env.Null();
1078
+ }
1079
+
1080
+ Napi::Value register_pkg(const Napi::CallbackInfo& info) {
1081
+ Napi::Env env = info.Env();
1082
+
1083
+ if (info.Length() != 2) {
1084
+ Napi::Error::New(env, "Wrong number of arguments. Expected: event, accept").ThrowAsJavaScriptException();
1085
+ return env.Null();
1086
+ }
1087
+
1088
+ if (!info[0].IsString()) {
1089
+ Napi::TypeError::New(env, "event must be string.").ThrowAsJavaScriptException();
1090
+ return env.Null();
1091
+ }
1092
+ string event = info[0].As<Napi::String>().Utf8Value();
1093
+
1094
+ if (!info[1].IsString()) {
1095
+ Napi::TypeError::New(env, "accept must be string.").ThrowAsJavaScriptException();
1096
+ return env.Null();
1097
+ }
1098
+ string accept = info[1].As<Napi::String>().Utf8Value();
1099
+
1100
+ int res = pjw_register_pkg(event.c_str(), accept.c_str());
1101
+
1102
+ if(res != 0) {
1103
+ Napi::Error::New(env, pjw_get_error()).ThrowAsJavaScriptException();
1104
+ return env.Null();
1105
+ }
1106
+
1107
+ return env.Null();
1108
+ }
1109
+
1110
+ Napi::Value subscription_create(const Napi::CallbackInfo& info) {
1111
+ Napi::Env env = info.Env();
1112
+
1113
+ if (info.Length() < 6) {
1114
+ Napi::Error::New(env, "Wrong number of arguments. Expected: transport_id, event, accept, from_uri, to_uri, request_uri [, proxy_uri, realm, user, pass]").ThrowAsJavaScriptException();
1115
+ return env.Null();
1116
+ }
1117
+
1118
+ if (!info[0].IsNumber()) {
1119
+ Napi::TypeError::New(env, "transport_id must be number.").ThrowAsJavaScriptException();
1120
+ return env.Null();
1121
+ }
1122
+ int transport_id = info[0].As<Napi::Number>().Int32Value();
1123
+
1124
+ if (!info[1].IsString()) {
1125
+ Napi::TypeError::New(env, "event must be string.").ThrowAsJavaScriptException();
1126
+ return env.Null();
1127
+ }
1128
+ string event = info[1].As<Napi::String>().Utf8Value();
1129
+
1130
+ if (!info[2].IsString()) {
1131
+ Napi::TypeError::New(env, "accept must be string.").ThrowAsJavaScriptException();
1132
+ return env.Null();
1133
+ }
1134
+ string accept = info[2].As<Napi::String>().Utf8Value();
1135
+
1136
+ if (!info[3].IsString()) {
1137
+ Napi::TypeError::New(env, "from_uri must be string.").ThrowAsJavaScriptException();
1138
+ return env.Null();
1139
+ }
1140
+ string from_uri = info[3].As<Napi::String>().Utf8Value();
1141
+
1142
+ if (!info[4].IsString()) {
1143
+ Napi::TypeError::New(env, "to_uri must be string.").ThrowAsJavaScriptException();
1144
+ return env.Null();
1145
+ }
1146
+ string to_uri = info[4].As<Napi::String>().Utf8Value();
1147
+
1148
+ if (!info[5].IsString()) {
1149
+ Napi::TypeError::New(env, "request_uri must be string.").ThrowAsJavaScriptException();
1150
+ return env.Null();
1151
+ }
1152
+ string request_uri = info[5].As<Napi::String>().Utf8Value();
1153
+
1154
+ string proxy_uri = string("");
1155
+ if (info.Length() > 6) {
1156
+ if (!info[6].IsString()) {
1157
+ Napi::TypeError::New(env, "proxy_uri must be string.").ThrowAsJavaScriptException();
1158
+ return env.Null();
1159
+ }
1160
+ proxy_uri = info[6].As<Napi::String>().Utf8Value();
1161
+ }
1162
+
1163
+ string realm = string("");
1164
+ string user = string("");
1165
+ string pass = string("");
1166
+
1167
+ if (info.Length() > 7) {
1168
+ if(info.Length() < 10) {
1169
+ Napi::TypeError::New(env, "missing credentials. you must provide realm, user, pass.").ThrowAsJavaScriptException();
1170
+ return env.Null();
1171
+ }
1172
+
1173
+ if (!info[7].IsString()) {
1174
+ Napi::TypeError::New(env, "realm must be string").ThrowAsJavaScriptException();
1175
+ return env.Null();
1176
+ }
1177
+ realm = info[7].As<Napi::String>().Utf8Value();
1178
+
1179
+ if (!info[8].IsString()) {
1180
+ Napi::TypeError::New(env, "user must be string").ThrowAsJavaScriptException();
1181
+ return env.Null();
1182
+ }
1183
+ user = info[8].As<Napi::String>().Utf8Value();
1184
+
1185
+ if (!info[9].IsString()) {
1186
+ Napi::TypeError::New(env, "pass must be string").ThrowAsJavaScriptException();
1187
+ return env.Null();
1188
+ }
1189
+ pass = info[9].As<Napi::String>().Utf8Value();
1190
+ }
1191
+
1192
+ long out_subscription_id;
1193
+
1194
+ int res = pjw_subscription_create(transport_id, event.c_str(), accept.c_str(), from_uri.c_str(), to_uri.c_str(), request_uri.c_str(),
1195
+ proxy_uri[0] ? proxy_uri.c_str() : NULL,
1196
+ realm[0] ? realm.c_str() : NULL,
1197
+ user[0] ? user.c_str() : NULL,
1198
+ pass[0] ? pass.c_str() : NULL,
1199
+ &out_subscription_id);
1200
+
1201
+ if(res != 0) {
1202
+ Napi::Error::New(env, pjw_get_error()).ThrowAsJavaScriptException();
1203
+ return env.Null();
1204
+ }
1205
+
1206
+ return Napi::Number::New(env, out_subscription_id);
1207
+ }
1208
+
1209
+ Napi::Value subscription_subscribe(const Napi::CallbackInfo& info) {
1210
+ Napi::Env env = info.Env();
1211
+
1212
+ if (info.Length() < 5) {
1213
+ Napi::Error::New(env, "Wrong number of arguments. Expected: subscription_id, expires [, additional_headers]").ThrowAsJavaScriptException();
1214
+ return env.Null();
1215
+ }
1216
+
1217
+ if (!info[0].IsNumber()) {
1218
+ Napi::TypeError::New(env, "subscription_id must be number.").ThrowAsJavaScriptException();
1219
+ return env.Null();
1220
+ }
1221
+ int subscription_id = info[0].As<Napi::Number>().Int32Value();
1222
+
1223
+ if (!info[1].IsNumber()) {
1224
+ Napi::TypeError::New(env, "expires must be number.").ThrowAsJavaScriptException();
1225
+ return env.Null();
1226
+ }
1227
+ int expires = info[1].As<Napi::Number>().Int32Value();
1228
+
1229
+ string additional_headers = string("");
1230
+ if (info.Length() > 2) {
1231
+ if (!info[2].IsString()) {
1232
+ Napi::TypeError::New(env, "additional_headers must be string.").ThrowAsJavaScriptException();
1233
+ return env.Null();
1234
+ }
1235
+ additional_headers = info[2].As<Napi::String>().Utf8Value();
1236
+ }
1237
+
1238
+ int res = pjw_subscription_subscribe(subscription_id, expires, additional_headers[0] ? additional_headers.c_str() : NULL);
1239
+
1240
+ if(res != 0) {
1241
+ Napi::Error::New(env, pjw_get_error()).ThrowAsJavaScriptException();
1242
+ return env.Null();
1243
+ }
1244
+
1245
+ return env.Null();
1246
+ }
1247
+
1248
+
1249
+
1250
+ Napi::Value set_log_level(const Napi::CallbackInfo& info) {
1251
+ Napi::Env env = info.Env();
1252
+
1253
+ if (info.Length() != 1) {
1254
+ Napi::Error::New(env, "Wrong number of arguments. Expected: log_level").ThrowAsJavaScriptException();
1255
+ return env.Null();
1256
+ }
1257
+
1258
+ if (!info[0].IsNumber()) {
1259
+ Napi::TypeError::New(env, "log_level must be number.").ThrowAsJavaScriptException();
1260
+ return env.Null();
1261
+ }
1262
+ int log_level = info[0].As<Napi::Number>().Int32Value();
1263
+
1264
+ int res = pjw_log_level(log_level);
1265
+
1266
+ if(res != 0) {
1267
+ Napi::Error::New(env, pjw_get_error()).ThrowAsJavaScriptException();
1268
+ return env.Null();
1269
+ }
1270
+
1271
+ return Napi::Number::New(env, 0);
1272
+ }
1273
+
1274
+
1275
+ Napi::Value set_flags(const Napi::CallbackInfo& info) {
1276
+ Napi::Env env = info.Env();
1277
+
1278
+ if (info.Length() != 1) {
1279
+ Napi::Error::New(env, "Wrong number of arguments. Expected: flags").ThrowAsJavaScriptException();
1280
+ return env.Null();
1281
+ }
1282
+
1283
+ if (!info[0].IsNumber()) {
1284
+ Napi::TypeError::New(env, "flags must be number.").ThrowAsJavaScriptException();
1285
+ return env.Null();
1286
+ }
1287
+ unsigned flags = info[0].As<Napi::Number>().Uint32Value();
1288
+
1289
+ pjw_set_flags(flags);
1290
+
1291
+ return Napi::Number::New(env, 0);
1292
+ }
1293
+
1294
+
1295
+
1296
+
1297
+ static void CallJs(napi_env napiEnv, napi_value napi_js_cb, void* context, void* data) {
1298
+ Napi::Env env = Napi::Env(napiEnv);
1299
+
1300
+ Napi::Function js_cb = Napi::Value(env, napi_js_cb).As<Napi::Function>();
1301
+
1302
+ Napi::String str = Napi::String::New(env, (char*)data);
1303
+ js_cb.Call(env.Global(), { str });
1304
+ }
1305
+
1306
+ Napi::Value start(const Napi::CallbackInfo& info) {
1307
+ Napi::Env env = info.Env();
1308
+
1309
+ if (info.Length() < 1 || !info[0].IsFunction()) {
1310
+ Napi::TypeError::New(env, "Function expected as argument[0]").ThrowAsJavaScriptException();
1311
+ return env.Undefined();;
1312
+ }
1313
+
1314
+ Napi::Function js_cb = info[0].As<Napi::Function>();
1315
+
1316
+ Napi::String name = Napi::String::New(env, "bla");
1317
+
1318
+ napi_status status = napi_create_threadsafe_function(env,
1319
+ js_cb,
1320
+ NULL,
1321
+ name,
1322
+ 0,
1323
+ 1,
1324
+ NULL,
1325
+ NULL,
1326
+ NULL,
1327
+ CallJs,
1328
+ &tsf);
1329
+ if(status != napi_ok) {
1330
+ Napi::TypeError::New(env, "napi_create_threadsafe_function failed").ThrowAsJavaScriptException();
1331
+ return env.Undefined();
1332
+ }
1333
+
1334
+ //boost::thread t{poll};
1335
+
1336
+ return env.Undefined();
1337
+ }
1338
+
1339
+ Napi::Value do_poll(const Napi::CallbackInfo& info) {
1340
+ Napi::Env env = info.Env();
1341
+
1342
+ char buf[4096];
1343
+ int res = __pjw_poll(buf);
1344
+ if(res == 0) {
1345
+ return Napi::String::New(env, buf);
1346
+ } else {
1347
+ return env.Null();
1348
+ }
1349
+ }
1350
+
1351
+ Napi::Value shutdown_(const Napi::CallbackInfo& info) {
1352
+ Napi::Env env = info.Env();
1353
+
1354
+ int res = __pjw_shutdown();
1355
+
1356
+ if(res != 0) {
1357
+ Napi::Error::New(env, pjw_get_error()).ThrowAsJavaScriptException();
1358
+ return env.Null();
1359
+ }
1360
+
1361
+ return env.Null();
1362
+ }
1363
+
1364
+ Napi::Object init(Napi::Env env, Napi::Object exports) {
1365
+ int i = __pjw_init();
1366
+ //printf("__pjw_init res=%i\n", i);
1367
+
1368
+ exports.Set("start", Napi::Function::New(env, start));
1369
+
1370
+ exports.Set("transport_create", Napi::Function::New(env, transport_create));
1371
+
1372
+ exports.Set("account_create", Napi::Function::New(env, account_create));
1373
+ exports.Set("account_register", Napi::Function::New(env, account_register));
1374
+ exports.Set("account_unregister", Napi::Function::New(env, account_unregister));
1375
+
1376
+ exports.Set("call_create", Napi::Function::New(env, call_create));
1377
+ exports.Set("call_respond", Napi::Function::New(env, call_respond));
1378
+ exports.Set("call_terminate", Napi::Function::New(env, call_terminate));
1379
+ exports.Set("call_send_dtmf", Napi::Function::New(env, call_send_dtmf));
1380
+ exports.Set("call_reinvite", Napi::Function::New(env, call_reinvite));
1381
+ exports.Set("call_send_request", Napi::Function::New(env, call_send_request));
1382
+ exports.Set("call_start_record_wav", Napi::Function::New(env, call_start_record_wav));
1383
+ exports.Set("call_start_play_wav", Napi::Function::New(env, call_start_play_wav));
1384
+ exports.Set("call_stop_record_wav", Napi::Function::New(env, call_stop_record_wav));
1385
+ exports.Set("call_stop_play_wav", Napi::Function::New(env, call_stop_play_wav));
1386
+ exports.Set("call_get_stream_stat", Napi::Function::New(env, call_get_stream_stat));
1387
+ exports.Set("call_refer", Napi::Function::New(env, call_refer));
1388
+ exports.Set("call_get_info", Napi::Function::New(env, call_get_info));
1389
+ exports.Set("call_gen_string_replaces", Napi::Function::New(env, call_gen_string_replaces));
1390
+
1391
+ exports.Set("set_log_level", Napi::Function::New(env, set_log_level));
1392
+
1393
+ exports.Set("do_poll", Napi::Function::New(env, do_poll));
1394
+ exports.Set("shutdown", Napi::Function::New(env, shutdown_));
1395
+
1396
+ exports.Set("dtmf_aggregation_on", Napi::Function::New(env, dtmf_aggregation_on));
1397
+ exports.Set("dtmf_aggregation_off", Napi::Function::New(env, dtmf_aggregation_off));
1398
+
1399
+ exports.Set("packetdump_start", Napi::Function::New(env, packetdump_start));
1400
+ exports.Set("packetdump_stop", Napi::Function::New(env, packetdump_stop));
1401
+
1402
+ exports.Set("get_codecs", Napi::Function::New(env, get_codecs));
1403
+ exports.Set("set_codecs", Napi::Function::New(env, set_codecs));
1404
+
1405
+ exports.Set("notify", Napi::Function::New(env, notify));
1406
+ exports.Set("notify_xfer", Napi::Function::New(env, notify_xfer));
1407
+
1408
+ exports.Set("register_pkg", Napi::Function::New(env, register_pkg));
1409
+
1410
+ exports.Set("subscription_create", Napi::Function::New(env, subscription_create));
1411
+ exports.Set("subscription_subscribe", Napi::Function::New(env, subscription_subscribe));
1412
+
1413
+ exports.Set("set_flags", Napi::Function::New(env, set_flags));
1414
+
1415
+ return exports;
1416
+ }
1417
+
1418
+ NODE_API_MODULE(addon, init)