Engage Engine API  1.251.9091
Loading...
Searching...
No Matches
engage.cpp
1//
2// Copyright (c) 2019 Rally Tactical Systems, Inc.
3// All rights reserved.
4//
5
6#include <nan.h>
7#include <node_buffer.h>
8#include <string>
9#include <iostream>
10#include <thread>
11#include <map>
12#include <mutex>
13#include <atomic>
14
15#include "EngageInterface.h"
16#include "EngagePlatformNotifications.h"
17
18using namespace std;
19using namespace Nan;
20using namespace v8;
21
22// Makes a binding
23#define ENGAGE_BINDING(_nm) \
24 Nan::Set(target, \
25 New<String>(#_nm).ToLocalChecked(), \
26 GetFunction(New<FunctionTemplate>(_nm)).ToLocalChecked());
27
28// Gets inbound string parameter @ _infoIndex
29#define STRVAL(_infoIndex) \
30 *Nan::Utf8String(info[_infoIndex]->ToString(Nan::GetCurrentContext()).FromMaybe(v8::Local<v8::String>()))
31
32// Gets inbound integer parameter @ _infoIndex
33#define INTVAL(_index) \
34 info[_index]->Int32Value(Nan::GetCurrentContext()).FromJust()
35
36// Return an integer
37#define NANRETI(_expr) \
38 info.GetReturnValue().Set(_expr);
39
40// Return a string
41#define NANRETS(_expr) \
42 info.GetReturnValue().Set(New(_expr).ToLocalChecked());
43
44// Defines a callback with no parameters
45#define ENGAGE_CB_NO_PARAMS(_ename) \
46 void on_ ## _ename(const char *eventExtraJson) \
47 { \
48 CrossThreadCallbackWorker *cbw = getCallback(#_ename); \
49 if(!cbw) \
50 { \
51 return; \
52 } \
53 cbw->enqueue(eventExtraJson); \
54 cbw->RELEASE_OBJECT_REFERENCE(); \
55 }
56
57// Defines a callback with a string parameter
58#define ENGAGE_CB_STR_PARAM(_ename) \
59 void on_ ## _ename(const char *str, const char *eventExtraJson) \
60 { \
61 CrossThreadCallbackWorker *cbw = getCallback(#_ename); \
62 if(!cbw) \
63 { \
64 return; \
65 } \
66 cbw->enqueue(str, eventExtraJson); \
67 cbw->RELEASE_OBJECT_REFERENCE(); \
68 }
69
70// Defines a callback with an ID (a string parameter)
71#define ENGAGE_CB_ID_PARAM(_ename) \
72 void on_ ## _ename(const char *id, const char *eventExtraJson) \
73 { \
74 CrossThreadCallbackWorker *cbw = getCallback(#_ename); \
75 if(!cbw) \
76 { \
77 return; \
78 } \
79 cbw->enqueue(id, eventExtraJson); \
80 cbw->RELEASE_OBJECT_REFERENCE(); \
81 }
82
83// Defines a callback with an ID (a string parameter) plus 1 strnig
84#define ENGAGE_CB_ID_PLUS_ONE_STRING_PARAM(_ename) \
85 void on_ ## _ename(const char *id, const char *s, const char *eventExtraJson) \
86 { \
87 CrossThreadCallbackWorker *cbw = getCallback(#_ename); \
88 if(!cbw) \
89 { \
90 return; \
91 } \
92 cbw->enqueue(id, s, eventExtraJson); \
93 cbw->RELEASE_OBJECT_REFERENCE(); \
94 }
95
96// A callback table entry
97#define ENGAGE_CB_TABLE_ENTRY(_pfn, _ename) \
98 g_eventCallbacks._pfn = on_ ## _ename;
99
100// This little class wraps callbacks into JS from non-JS threads. It does so by
101// posting the callback/event onto the libuv event loop from which the instance
102// of this worker class was created. So ... be very careful only to create instances
103// of this class from a thread that originated in libuv!!
105{
106public:
108 {
109 public:
110 typedef enum {ptString, ptInt, ptStringVector} Type_t;
111
112 Type_t _type;
113 };
114
116 {
117 public:
118 StringParameter(const char *s)
119 {
120 _type = ptString;
121 if(s != nullptr && s[0] != 0)
122 {
123 _val = s;
124 }
125 }
126
127 std::string _val;
128 };
129
130 class IntParameter : public Parameter
131 {
132 public:
133 IntParameter(int i)
134 {
135 _type = ptInt;
136 _val = i;
137 }
138
139 int _val;
140 };
141
143 {
144 public:
145 StringVectorParameter(const char *array[])
146 {
147 _type = ptStringVector;
148
149 // Our array is either null to begin with or terminated with a nullptr at the end
150 if(array != nullptr)
151 {
152 size_t index = 0;
153 while(array[index] != nullptr)
154 {
155 _val.push_back(array[index] != nullptr ? array[index] : "");
156 index++;
157 }
158 }
159 }
160
161 std::vector<std::string> _val;
162 };
163
164 explicit CrossThreadCallbackWorker(v8::Local<v8::Function> fn)
165 {
166 Nan::HandleScope scope;
167
168 // We're going to post this work on this libuv queue
169 _evLoop = GetCurrentEventLoop();
170
171 // Marshal the V8 function into a NAN callback structure
172 _cb.Reset(fn);
173
174 _workCtx.data = this;
175 _isBusy = false;
176 _refCount = 0;
177
178 // TODO: I'm not convinced we even need this as there's no object here to get
179 // garbage-collected. TBD !!
180 v8::Local<v8::Object> obj = New<v8::Object>();
181 _persistentHandle.Reset(obj);
182 _resource = new AsyncResource("CrossThreadCallbackWorker", obj);
183
184 ADD_OBJECT_REFERENCE();
185 }
186
188 {
189 Nan::HandleScope scope;
190
191 if (!_persistentHandle.IsEmpty())
192 {
193 _persistentHandle.Reset();
194 }
195
196 delete _resource;
197 }
198
199 void ADD_OBJECT_REFERENCE()
200 {
201 assert(_refCount >= 0);
202 _refCount++;
203 }
204
205 void RELEASE_OBJECT_REFERENCE()
206 {
207 assert(_refCount > 0);
208 if(_refCount.fetch_sub(1) == 1)
209 {
210 delete this;
211 }
212 }
213
214 void enqueue(const char *extra)
215 {
216 std::vector<Parameter*> *params = new std::vector<Parameter*>();
217 params->push_back(new StringParameter(extra));
218 enqueue(params);
219 }
220
221 void enqueue(const char *s, const char *extra)
222 {
223 std::vector<Parameter*> *params = new std::vector<Parameter*>();
224 params->push_back(new StringParameter(s));
225 params->push_back(new StringParameter(extra));
226 enqueue(params);
227 }
228
229 void enqueue(const char *s1, const char *s2, const char *extra)
230 {
231 std::vector<Parameter*> *params = new std::vector<Parameter*>();
232 params->push_back(new StringParameter(s1));
233 params->push_back(new StringParameter(s2));
234 params->push_back(new StringParameter(extra));
235 enqueue(params);
236 }
237
238 void enqueue(std::vector<Parameter*> *parameters)
239 {
240 // We need to wait here for the worker to become available (it may already be
241 // queued in JS). The chances of this happening are very slim as callbacks
242 // don't happen that often and, when they do, they'll return in just a few
243 // microseconds. But, let's be paranoid shall we!
244 _lock.lock();
245
246 while(_isBusy)
247 {
248 _lock.unlock();
249 std::this_thread::sleep_for(std::chrono::milliseconds(1));
250 _lock.lock();
251 }
252
253 // Pass over the pending parameters
254 _pendingParameters = parameters;
255
256 _isBusy = true;
257
258 _lock.unlock();
259
260 ADD_OBJECT_REFERENCE();
261 uv_queue_work(_evLoop,
262 &_workCtx,
263 CrossThreadCallbackWorker::onExecuteWork,
264 reinterpret_cast<uv_after_work_cb>(CrossThreadCallbackWorker::onWorkCompleted));
265 }
266
267 static void onExecuteWork(uv_work_t* workCtx)
268 {
269 // libuv wants us to execute something. But we don't have any actual work to do. So
270 // we'll just return.
271 }
272
273 static void onWorkCompleted(uv_work_t* workCtx)
274 {
275 // We'll just bounce this though to the instance's method
276 static_cast<CrossThreadCallbackWorker*>(workCtx->data)->internal_onWorkCompleted();
277 }
278
279private:
280 NAN_DISALLOW_ASSIGN_COPY_MOVE(CrossThreadCallbackWorker)
281
282 void internal_onWorkCompleted()
283 {
284 _lock.lock();
285
286 // The real work here is to make the callback...
287 Nan::HandleScope scope;
288
289 v8::Isolate *isolate = v8::Isolate::GetCurrent();
290 v8::Local<Context> context = v8::Context::New(isolate);
291
292 // ... which we'll do here.
293 if(_pendingParameters == nullptr || _pendingParameters->size() == 0)
294 {
295 _cb.Call(0, nullptr, _resource);
296 }
297 else
298 {
299 // We can only call into V8 here to build up the parameters because only now are we
300 // on a thread that V8 owns.
301 v8::Local<v8::Value> *argv = new v8::Local<v8::Value>[_pendingParameters->size()];
302
303 int index = 0;
304 for(std::vector<Parameter*>::iterator itr = _pendingParameters->begin();
305 itr != _pendingParameters->end();
306 itr++)
307 {
308 if((*itr)->_type == Parameter::ptString)
309 {
310 argv[index] = Nan::New<v8::String>(((StringParameter*)(*itr))->_val).ToLocalChecked();
311 }
312 else if((*itr)->_type == Parameter::ptStringVector)
313 {
314 StringVectorParameter *svp = (StringVectorParameter*)(*itr);
315 v8::Local<v8::Array> jsArray = Nan::New<v8::Array>(svp->_val.size());
316
317 int speakerIndex = 0;
318 for(std::vector<std::string>::iterator itrSpeakers = svp->_val.begin();
319 itrSpeakers != svp->_val.end();
320 itrSpeakers++)
321 {
322 #ifndef WIN32
323 #pragma GCC diagnostic push
324 #pragma GCC diagnostic ignored "-Wunused-result"
325 #endif
326 {
327 jsArray->Set(context, speakerIndex, v8::String::NewFromUtf8(isolate, itrSpeakers->c_str(), NewStringType::kNormal).ToLocalChecked());
328 }
329 #ifndef WIN32
330 #pragma GCC diagnostic pop
331 #endif
332
333 speakerIndex++;
334 }
335
336 argv[index] = jsArray;
337 }
338 else if((*itr)->_type == Parameter::ptInt)
339 {
340 argv[index] = Nan::New<v8::Integer>(((IntParameter*)(*itr))->_val);
341 }
342
343 index++;
344 }
345
346 // Call into JS-land
347 _cb.Call(_pendingParameters->size(), argv, _resource);
348
349 // Get rid of any pending parameters
350 if(_pendingParameters != nullptr)
351 {
352 for(std::vector<Parameter*>::iterator itr = _pendingParameters->begin();
353 itr != _pendingParameters->end();
354 itr++)
355 {
356 delete *itr;
357 }
358
359 _pendingParameters->clear();
360 delete _pendingParameters;
361 _pendingParameters = nullptr;
362 }
363 }
364
365 // ... and only now can we say that this worker is no longer in use - i.e. its out
366 // out the libuv queue and won't cause a bus error in case it gets reused very
367 // quickly (that can happen if this code runs in onExecuteWork).
368 _isBusy = false;
369
370 _lock.unlock();
371
372 // Finally, let go of the reference we added when this was enqueue
373 RELEASE_OBJECT_REFERENCE();
374 }
375
376 std::mutex _lock;
377 uv_loop_t *_evLoop;
378 uv_work_t _workCtx;
379 bool _isBusy;
380 Nan::Callback _cb;
381 Nan::Persistent<v8::Object> _persistentHandle;
382 AsyncResource *_resource;
383 std::atomic<int> _refCount;
384 std::vector<Parameter*> *_pendingParameters;
385};
386
387typedef std::map<std::string, CrossThreadCallbackWorker*> CallbackMap_t;
388
389static EngageEvents_t g_eventCallbacks;
390static bool g_wantCallbacks = true;
391static CallbackMap_t g_cbMap;
392static std::mutex g_cbMapLock;
393static std::string g_loggingHookFn;
394
395//--------------------------------------------------------
396// Returns the callback associated with an event name (if any)
397static CrossThreadCallbackWorker *getCallback(const char *cbName)
398{
399 if(!g_wantCallbacks)
400 {
401 return nullptr;
402 }
403
404 CrossThreadCallbackWorker *rc = nullptr;
405
406 g_cbMapLock.lock();
407
408 CallbackMap_t::iterator itr = g_cbMap.find(cbName);
409 if(itr != g_cbMap.end())
410 {
411 rc = itr->second;
412 rc->ADD_OBJECT_REFERENCE();
413 }
414
415 g_cbMapLock.unlock();
416
417 return rc;
418}
419
420
421// The following convey events from Engage up to JS. They all follow the same
422// basic flow of finding a callback for the event name and, if one is found, calling
423// it. Generally callbacks have no parameters, or a single string parameter. But,
424// some of them are a little unique. So, for those that look the same, we'll use the
425// ENGAGE_CB_xx_PARAMS macros. For the others, we'll actually write all the code for each.
426ENGAGE_CB_NO_PARAMS(engineStarted)
427ENGAGE_CB_NO_PARAMS(engineStopped)
428ENGAGE_CB_NO_PARAMS(engineAudioDevicesRefreshed)
429
430ENGAGE_CB_ID_PARAM(rpPausingConnectionAttempt)
431ENGAGE_CB_ID_PARAM(rpConnecting)
432ENGAGE_CB_ID_PARAM(rpConnected)
433ENGAGE_CB_ID_PARAM(rpDisconnected)
434void on_rpRoundtripReport(const char *id, uint32_t rtMs, uint32_t rtQualityRating, const char * eventExtraJson)
435{
436 CrossThreadCallbackWorker *cbw = getCallback("rpRoundtripReport");
437 if(!cbw)
438 {
439 return;
440 }
441
442 std::vector<CrossThreadCallbackWorker::Parameter*> *params = new std::vector<CrossThreadCallbackWorker::Parameter*>();
443 params->push_back(new CrossThreadCallbackWorker::StringParameter(id));
444 params->push_back(new CrossThreadCallbackWorker::IntParameter((int)rtMs));
445 params->push_back(new CrossThreadCallbackWorker::IntParameter((int)rtQualityRating));
446 params->push_back(new CrossThreadCallbackWorker::StringParameter(eventExtraJson));
447 cbw->enqueue(params);
448
449 cbw->RELEASE_OBJECT_REFERENCE();
450}
451
452ENGAGE_CB_ID_PARAM(groupCreated)
453ENGAGE_CB_ID_PARAM(groupCreateFailed)
454ENGAGE_CB_ID_PARAM(groupDeleted)
455
456ENGAGE_CB_ID_PARAM(groupConnected)
457ENGAGE_CB_ID_PARAM(groupConnectFailed)
458ENGAGE_CB_ID_PARAM(groupDisconnected)
459
460ENGAGE_CB_ID_PARAM(groupJoined)
461ENGAGE_CB_ID_PARAM(groupJoinFailed)
462ENGAGE_CB_ID_PARAM(groupLeft)
463
464ENGAGE_CB_ID_PARAM(groupRxStarted)
465ENGAGE_CB_ID_PARAM(groupRxEnded)
466
467ENGAGE_CB_ID_PARAM(groupRxMuted)
468ENGAGE_CB_ID_PARAM(groupRxUnmuted)
469ENGAGE_CB_ID_PLUS_ONE_STRING_PARAM(groupRxSpeakersChanged)
470
471ENGAGE_CB_ID_PLUS_ONE_STRING_PARAM(groupNodeDiscovered)
472ENGAGE_CB_ID_PLUS_ONE_STRING_PARAM(groupNodeRediscovered)
473ENGAGE_CB_ID_PLUS_ONE_STRING_PARAM(groupNodeUndiscovered)
474
475ENGAGE_CB_ID_PARAM(groupTxStarted);
476ENGAGE_CB_ID_PARAM(groupTxEnded);
477ENGAGE_CB_ID_PARAM(groupTxFailed);
478ENGAGE_CB_ID_PARAM(groupTxUsurpedByPriority);
479ENGAGE_CB_ID_PARAM(groupMaxTxTimeExceeded);
480
481ENGAGE_CB_ID_PARAM(groupTxMuted)
482ENGAGE_CB_ID_PARAM(groupTxUnmuted)
483
484ENGAGE_CB_ID_PLUS_ONE_STRING_PARAM(groupAssetDiscovered);
485ENGAGE_CB_ID_PLUS_ONE_STRING_PARAM(groupAssetRediscovered);
486ENGAGE_CB_ID_PLUS_ONE_STRING_PARAM(groupAssetUndiscovered);
487
488ENGAGE_CB_NO_PARAMS(licenseChanged)
489ENGAGE_CB_NO_PARAMS(licenseExpired)
490ENGAGE_CB_STR_PARAM(licenseExpiring)
491
492ENGAGE_CB_ID_PLUS_ONE_STRING_PARAM(groupTimelineEventStarted);
493ENGAGE_CB_ID_PLUS_ONE_STRING_PARAM(groupTimelineEventUpdated);
494ENGAGE_CB_ID_PLUS_ONE_STRING_PARAM(groupTimelineEventEnded);
495ENGAGE_CB_ID_PLUS_ONE_STRING_PARAM(groupTimelineReport);
496ENGAGE_CB_ID_PARAM(groupTimelineReportFailed);
497ENGAGE_CB_ID_PLUS_ONE_STRING_PARAM(groupTimelineGroomed);
498
499ENGAGE_CB_ID_PLUS_ONE_STRING_PARAM(groupHealthReport);
500ENGAGE_CB_ID_PARAM(groupHealthReportFailed);
501
502ENGAGE_CB_ID_PLUS_ONE_STRING_PARAM(groupStatsReport);
503ENGAGE_CB_ID_PARAM(groupStatsReportFailed);
504
505ENGAGE_CB_ID_PARAM(bridgeCreated)
506ENGAGE_CB_ID_PARAM(bridgeCreateFailed)
507ENGAGE_CB_ID_PARAM(bridgeDeleted)
508
509void on_groupRxVolumeChanged(const char *id, int16_t leftLevelPerc, int16_t rightLevelPerc, const char * eventExtraJson)
510{
511 CrossThreadCallbackWorker *cbw = getCallback("groupRxVolumeChanged");
512 if(!cbw)
513 {
514 return;
515 }
516
517 std::vector<CrossThreadCallbackWorker::Parameter*> *params = new std::vector<CrossThreadCallbackWorker::Parameter*>();
518 params->push_back(new CrossThreadCallbackWorker::StringParameter(id));
519 params->push_back(new CrossThreadCallbackWorker::IntParameter((int)leftLevelPerc));
520 params->push_back(new CrossThreadCallbackWorker::IntParameter((int)rightLevelPerc));
521 params->push_back(new CrossThreadCallbackWorker::StringParameter(eventExtraJson));
522 cbw->enqueue(params);
523
524 cbw->RELEASE_OBJECT_REFERENCE();
525}
526
527ENGAGE_CB_ID_PLUS_ONE_STRING_PARAM(groupRxDtmf)
528
529
530//--------------------------------------------------------
531// Registers an event name and the JS callback function
532NAN_METHOD(on)
533{
534 bool haveAFunction = false;
535 std::string functionName = STRVAL(0);
536
537 if(info.Length() >= 2 && (!info[1]->IsUndefined()) && (!info[1]->IsNull()))
538 {
539 haveAFunction = true;
540 }
541
542 g_cbMapLock.lock();
543
544 // Find our map entry
545 CallbackMap_t::iterator itr = g_cbMap.find(functionName.c_str());
546
547 // We don't yet have an entry in the map
548 if(itr == g_cbMap.end())
549 {
550 // If we don't have a function, then we're done
551 if(!haveAFunction)
552 {
553 g_cbMapLock.unlock();
554 return;
555 }
556
557 // We have a function but not yet an entry, make it and plug it into the map
558 g_cbMap[functionName.c_str()] = new CrossThreadCallbackWorker(Nan::To<v8::Function>(info[1]).ToLocalChecked());
559 }
560 else
561 {
562 // We have an entry ...
563
564 // ... get rid of it (we're either removing or replacing)
565 itr->second->RELEASE_OBJECT_REFERENCE();
566 g_cbMap.erase(itr);
567
568 // ... and maybe put in the new one
569 if(haveAFunction)
570 {
571 g_cbMap[functionName.c_str()] = new CrossThreadCallbackWorker(Nan::To<v8::Function>(info[1]).ToLocalChecked());
572 }
573 }
574
575 g_cbMapLock.unlock();
576}
577
578
579//--------------------------------------------------------
580NAN_METHOD(initialize)
581{
582 /*
583 #if defined(WIN32)
584 engageWin32LibraryInit();
585 #endif
586 */
587
588 memset(&g_eventCallbacks, 0, sizeof(g_eventCallbacks));
589
590 ENGAGE_CB_TABLE_ENTRY(PFN_ENGAGE_ENGINE_STARTED, engineStarted);
591 ENGAGE_CB_TABLE_ENTRY(PFN_ENGAGE_ENGINE_STOPPED, engineStopped);
592 ENGAGE_CB_TABLE_ENTRY(PFN_ENGAGE_ENGINE_AUDIO_DEVICES_REFRESHED, engineAudioDevicesRefreshed);
593
594 ENGAGE_CB_TABLE_ENTRY(PFN_ENGAGE_RP_PAUSING_CONNECTION_ATTEMPT, rpPausingConnectionAttempt);
595 ENGAGE_CB_TABLE_ENTRY(PFN_ENGAGE_RP_CONNECTING, rpConnecting);
596 ENGAGE_CB_TABLE_ENTRY(PFN_ENGAGE_RP_CONNECTED, rpConnected);
597 ENGAGE_CB_TABLE_ENTRY(PFN_ENGAGE_RP_DISCONNECTED, rpDisconnected);
598 ENGAGE_CB_TABLE_ENTRY(PFN_ENGAGE_RP_ROUNDTRIP_REPORT, rpRoundtripReport);
599
600 ENGAGE_CB_TABLE_ENTRY(PFN_ENGAGE_GROUP_CREATED, groupCreated);
601 ENGAGE_CB_TABLE_ENTRY(PFN_ENGAGE_GROUP_CREATE_FAILED, groupCreateFailed);
602 ENGAGE_CB_TABLE_ENTRY(PFN_ENGAGE_GROUP_DELETED, groupDeleted);
603
604 ENGAGE_CB_TABLE_ENTRY(PFN_ENGAGE_GROUP_CONNECTED, groupConnected);
605 ENGAGE_CB_TABLE_ENTRY(PFN_ENGAGE_GROUP_CONNECT_FAILED, groupConnectFailed);
606 ENGAGE_CB_TABLE_ENTRY(PFN_ENGAGE_GROUP_DISCONNECTED, groupDisconnected);
607
608 ENGAGE_CB_TABLE_ENTRY(PFN_ENGAGE_GROUP_JOINED, groupJoined);
609 ENGAGE_CB_TABLE_ENTRY(PFN_ENGAGE_GROUP_JOIN_FAILED, groupJoinFailed);
610 ENGAGE_CB_TABLE_ENTRY(PFN_ENGAGE_GROUP_LEFT, groupLeft);
611 //ENGAGE_CB_TABLE_ENTRY(PFN_ENGAGE_GROUP_MEMBER_COUNT_CHANGED)(const char *pId, size_t newCount);
612
613 ENGAGE_CB_TABLE_ENTRY(PFN_ENGAGE_GROUP_NODE_DISCOVERED, groupNodeDiscovered);
614 ENGAGE_CB_TABLE_ENTRY(PFN_ENGAGE_GROUP_NODE_REDISCOVERED, groupNodeRediscovered);
615 ENGAGE_CB_TABLE_ENTRY(PFN_ENGAGE_GROUP_NODE_UNDISCOVERED, groupNodeUndiscovered);
616
617 ENGAGE_CB_TABLE_ENTRY(PFN_ENGAGE_GROUP_RX_STARTED, groupRxStarted);
618 ENGAGE_CB_TABLE_ENTRY(PFN_ENGAGE_GROUP_RX_ENDED, groupRxEnded);
619 ENGAGE_CB_TABLE_ENTRY(PFN_ENGAGE_GROUP_RX_SPEAKERS_CHANGED, groupRxSpeakersChanged);
620 ENGAGE_CB_TABLE_ENTRY(PFN_ENGAGE_GROUP_RX_MUTED, groupRxMuted);
621 ENGAGE_CB_TABLE_ENTRY(PFN_ENGAGE_GROUP_RX_UNMUTED, groupRxUnmuted);
622
623 ENGAGE_CB_TABLE_ENTRY(PFN_ENGAGE_GROUP_TX_STARTED, groupTxStarted);
624 ENGAGE_CB_TABLE_ENTRY(PFN_ENGAGE_GROUP_TX_ENDED, groupTxEnded);
625 ENGAGE_CB_TABLE_ENTRY(PFN_ENGAGE_GROUP_TX_FAILED, groupTxFailed);
626 ENGAGE_CB_TABLE_ENTRY(PFN_ENGAGE_GROUP_TX_USURPED_BY_PRIORITY, groupTxUsurpedByPriority);
627 ENGAGE_CB_TABLE_ENTRY(PFN_ENGAGE_GROUP_MAX_TX_TIME_EXCEEDED, groupMaxTxTimeExceeded);
628 ENGAGE_CB_TABLE_ENTRY(PFN_ENGAGE_GROUP_TX_MUTED, groupTxMuted);
629 ENGAGE_CB_TABLE_ENTRY(PFN_ENGAGE_GROUP_TX_UNMUTED, groupTxUnmuted);
630
631 ENGAGE_CB_TABLE_ENTRY(PFN_ENGAGE_GROUP_ASSET_DISCOVERED, groupAssetDiscovered);
632 ENGAGE_CB_TABLE_ENTRY(PFN_ENGAGE_GROUP_ASSET_REDISCOVERED, groupAssetRediscovered);
633 ENGAGE_CB_TABLE_ENTRY(PFN_ENGAGE_GROUP_ASSET_UNDISCOVERED, groupAssetUndiscovered);
634
635 ENGAGE_CB_TABLE_ENTRY(PFN_ENGAGE_LICENSE_CHANGED, licenseChanged);
636 ENGAGE_CB_TABLE_ENTRY(PFN_ENGAGE_LICENSE_EXPIRED, licenseExpired);
637 ENGAGE_CB_TABLE_ENTRY(PFN_ENGAGE_LICENSE_EXPIRING, licenseExpiring);
638
639 // TODO PFN_ENGAGE_GROUP_BLOB_SENT
640 // TODO PFN_ENGAGE_GROUP_BLOB_SEND_FAILED
641 // TODO PFN_ENGAGE_GROUP_BLOB_RECEIVED
642
643 // TODO PFN_ENGAGE_GROUP_RTP_SENT
644 // TODO PFN_ENGAGE_GROUP_RTP_SEND_FAILED
645 // TODO PFN_ENGAGE_GROUP_RTP_RECEIVED
646
647 // TODO PFN_ENGAGE_GROUP_RAW_SENT
648 // TODO PFN_ENGAGE_GROUP_RAW_SEND_FAILED
649 // TODO PFN_ENGAGE_GROUP_RAW_RECEIVED
650
651 ENGAGE_CB_TABLE_ENTRY(PFN_ENGAGE_GROUP_TIMELINE_EVENT_STARTED, groupTimelineEventStarted);
652 ENGAGE_CB_TABLE_ENTRY(PFN_ENGAGE_GROUP_TIMELINE_EVENT_UPDATED, groupTimelineEventUpdated);
653 ENGAGE_CB_TABLE_ENTRY(PFN_ENGAGE_GROUP_TIMELINE_EVENT_ENDED, groupTimelineEventEnded);
654
655 ENGAGE_CB_TABLE_ENTRY(PFN_ENGAGE_GROUP_TIMELINE_REPORT, groupTimelineReport);
656 ENGAGE_CB_TABLE_ENTRY(PFN_ENGAGE_GROUP_TIMELINE_REPORT_FAILED, groupTimelineReportFailed);
657 ENGAGE_CB_TABLE_ENTRY(PFN_ENGAGE_GROUP_TIMELINE_GROOMED, groupTimelineGroomed);
658
659 ENGAGE_CB_TABLE_ENTRY(PFN_ENGAGE_GROUP_HEALTH_REPORT, groupHealthReport);
660 ENGAGE_CB_TABLE_ENTRY(PFN_ENGAGE_GROUP_HEALTH_REPORT_FAILED, groupHealthReportFailed);
661
662 ENGAGE_CB_TABLE_ENTRY(PFN_ENGAGE_GROUP_STATS_REPORT, groupStatsReport);
663 ENGAGE_CB_TABLE_ENTRY(PFN_ENGAGE_GROUP_STATS_REPORT_FAILED, groupStatsReportFailed);
664
665 ENGAGE_CB_TABLE_ENTRY(PFN_ENGAGE_GROUP_RX_VOLUME_CHANGED, groupRxVolumeChanged);
666 ENGAGE_CB_TABLE_ENTRY(PFN_ENGAGE_GROUP_RX_DTMF, groupRxDtmf);
667
668 ENGAGE_CB_TABLE_ENTRY(PFN_ENGAGE_BRIDGE_CREATED, bridgeCreated);
669 ENGAGE_CB_TABLE_ENTRY(PFN_ENGAGE_BRIDGE_CREATE_FAILED, bridgeCreateFailed);
670 ENGAGE_CB_TABLE_ENTRY(PFN_ENGAGE_BRIDGE_DELETED, bridgeDeleted);
671
672 engageRegisterEventCallbacks(&g_eventCallbacks);
673
674 NANRETI(engageInitialize(STRVAL(0), STRVAL(1), STRVAL(2)));
675}
676
677//--------------------------------------------------------
678NAN_METHOD(enableCallbacks)
679{
680 g_wantCallbacks = true;
681 NANRETI((int)ENGAGE_RESULT_OK);
682}
683
684//--------------------------------------------------------
685NAN_METHOD(disableCallbacks)
686{
687 g_wantCallbacks = false;
688 NANRETI((int)ENGAGE_RESULT_OK);
689}
690
691//--------------------------------------------------------
692NAN_METHOD(setLogLevel)
693{
694 NANRETI(engageSetLogLevel(INTVAL(0)));
695}
696
697//--------------------------------------------------------
698NAN_METHOD(setLogTagExtension)
699{
700 NANRETI(engageSetLogTagExtension(STRVAL(0)));
701}
702
703//--------------------------------------------------------
704NAN_METHOD(engageEnableSyslog)
705{
707}
708
709//--------------------------------------------------------
710NAN_METHOD(engageEnableWatchdog)
711{
713}
714
715//--------------------------------------------------------
716NAN_METHOD(shutdown)
717{
718 NANRETI(engageShutdown());
719
720 /*
721 #if defined(WIN32)
722 engageWin32LibraryDeinit();
723 #endif
724 */
725}
726
727//--------------------------------------------------------
728NAN_METHOD(start)
729{
730 NANRETI(engageStart());
731}
732
733//--------------------------------------------------------
734NAN_METHOD(stop)
735{
736 NANRETI(engageStop());
737}
738
739//--------------------------------------------------------
740NAN_METHOD(createGroup)
741{
742 NANRETI(engageCreateGroup(STRVAL(0)));
743}
744
745//--------------------------------------------------------
746NAN_METHOD(deleteGroup)
747{
748 NANRETI(engageDeleteGroup(STRVAL(0)));
749}
750
751//--------------------------------------------------------
752NAN_METHOD(joinGroup)
753{
754 NANRETI(engageJoinGroup(STRVAL(0)));
755}
756
757//--------------------------------------------------------
758NAN_METHOD(leaveGroup)
759{
760 NANRETI(engageLeaveGroup(STRVAL(0)));
761}
762
763//--------------------------------------------------------
764NAN_METHOD(setGroupRules)
765{
766 NANRETI(engageSetGroupRules(STRVAL(0), STRVAL(1)));
767}
768
769//--------------------------------------------------------
770NAN_METHOD(beginGroupTx)
771{
772 NANRETI(engageBeginGroupTx(STRVAL(0), INTVAL(1), INTVAL(2)));
773}
774
775//--------------------------------------------------------
776NAN_METHOD(beginGroupTxAdvanced)
777{
778 NANRETI(engageBeginGroupTxAdvanced(STRVAL(0), STRVAL(1)));
779}
780
781//--------------------------------------------------------
782NAN_METHOD(endGroupTx)
783{
784 NANRETI(engageEndGroupTx(STRVAL(0)));
785}
786
787//--------------------------------------------------------
788NAN_METHOD(setGroupRxTag)
789{
790 NANRETI(engageSetGroupRxTag(STRVAL(0), INTVAL(1)));
791}
792
793//--------------------------------------------------------
794NAN_METHOD(muteGroupRx)
795{
796 NANRETI(engageMuteGroupRx(STRVAL(0)));
797}
798
799//--------------------------------------------------------
800NAN_METHOD(unmuteGroupRx)
801{
802 NANRETI(engageUnmuteGroupRx(STRVAL(0)));
803}
804
805//--------------------------------------------------------
806NAN_METHOD(muteGroupTx)
807{
808 NANRETI(engageMuteGroupTx(STRVAL(0)));
809}
810
811//--------------------------------------------------------
812NAN_METHOD(unmuteGroupTx)
813{
814 NANRETI(engageUnmuteGroupTx(STRVAL(0)));
815}
816
817//--------------------------------------------------------
818NAN_METHOD(setGroupRxVolume)
819{
820 NANRETI(engageSetGroupRxVolume(STRVAL(0), INTVAL(1), INTVAL(2)));
821}
822
823//--------------------------------------------------------
824NAN_METHOD(updatePresenceDescriptor)
825{
826 NANRETI(engageUpdatePresenceDescriptor(STRVAL(0), STRVAL(1), INTVAL(0)));
827}
828
829//--------------------------------------------------------
830NAN_METHOD(encrypt)
831{
832 uint8_t* inputBytes = (uint8_t*) node::Buffer::Data(info[0]);
833
834 size_t inputOfs = INTVAL(1);
835 size_t inputLen = INTVAL(2);
836
837 // Our output is going to contain encrypted data padded to 16 bytes + another 16 bytes of IV
838 uint8_t *outputBytes = new uint8_t[inputLen + 16 * 2];
839
840 int bytesInOutput = engageEncrypt(inputBytes + inputOfs, inputLen, outputBytes, STRVAL(3));
841
842 if(bytesInOutput > 0)
843 {
844 info.GetReturnValue().Set(Nan::CopyBuffer((char*)outputBytes, bytesInOutput).ToLocalChecked());
845 }
846
847 delete[] outputBytes;
848}
849
850//--------------------------------------------------------
851NAN_METHOD(decrypt)
852{
853 uint8_t* inputBytes = (uint8_t*) node::Buffer::Data(info[0]);
854
855 size_t inputOfs = INTVAL(1);
856 size_t inputLen = INTVAL(2);
857
858 // Our output is not going to be larger than the input (if anything, it'll be smaller)
859 uint8_t *outputBytes = new uint8_t[inputLen];
860
861 int bytesInOutput = engageDecrypt(inputBytes + inputOfs, inputLen, outputBytes, STRVAL(3));
862
863 if(bytesInOutput > 0)
864 {
865 info.GetReturnValue().Set(Nan::CopyBuffer((char*)outputBytes, bytesInOutput).ToLocalChecked());
866 }
867
868 delete[] outputBytes;
869}
870
871//--------------------------------------------------------
872NAN_METHOD(getVersion)
873{
874 const char *rc = engageGetVersion();
875
876 if(rc == nullptr)
877 {
878 rc = "";
879 }
880
881 NANRETS(rc);
882}
883
884//--------------------------------------------------------
885NAN_METHOD(getHardwareReport)
886{
887 const char *rc = engageGetHardwareReport();
888
889 if(rc == nullptr)
890 {
891 rc = "";
892 }
893
894 NANRETS(rc);
895}
896
897//--------------------------------------------------------
898NAN_METHOD(getActiveLicenseDescriptor)
899{
900 const char *rc = engageGetActiveLicenseDescriptor();
901
902 if(rc == nullptr)
903 {
904 rc = "";
905 }
906
907 NANRETS(rc);
908}
909
910//--------------------------------------------------------
911NAN_METHOD(getLicenseDescriptor)
912{
913 const char *rc = engageGetLicenseDescriptor(STRVAL(0), STRVAL(1), STRVAL(2), STRVAL(3));
914
915 if(rc == nullptr)
916 {
917 rc = "";
918 }
919
920 NANRETS(rc);
921}
922
923//--------------------------------------------------------
924NAN_METHOD(updateLicense)
925{
926 NANRETI(engageUpdateLicense(STRVAL(0), STRVAL(1), STRVAL(2), STRVAL(3)));
927}
928
929// TODO: engageSendGroupRtp
930// TODO: engageRegisterGroupRtpHandler
931// TODO: engageUnregisterGroupRtpHandler
932// TODO: engageSendGroupBlob
933// TODO: engageSendGroupRaw
934// TODO: engagePlatformServiceDiscovered
935// TODO: engagePlatformServiceRediscovered
936// TODO: engagePlatformServiceUndiscovered
937
938//--------------------------------------------------------
939NAN_METHOD(queryGroupTimeline)
940{
941 NANRETI(engageQueryGroupTimeline(STRVAL(0), STRVAL(1)));
942}
943
944//--------------------------------------------------------
945NAN_METHOD(queryGroupHealth)
946{
947 NANRETI(engageQueryGroupHealth(STRVAL(0)));
948}
949
950//--------------------------------------------------------
951NAN_METHOD(queryGroupStats)
952{
953 NANRETI(engageQueryGroupStats(STRVAL(0)));
954}
955
956//--------------------------------------------------------
957NAN_METHOD(getNetworkInterfaceDevices)
958{
959 const char *rc = engageGetNetworkInterfaceDevices();
960
961 if(rc == nullptr)
962 {
963 rc = "";
964 }
965
966 NANRETS(rc);
967}
968
969//--------------------------------------------------------
970NAN_METHOD(getAudioDevices)
971{
972 const char *rc = engageGetAudioDevices();
973
974 if(rc == nullptr)
975 {
976 rc = "";
977 }
978
979 NANRETS(rc);
980}
981
982//--------------------------------------------------------
983NAN_METHOD(generateMission)
984{
985 const char *rc = engageGenerateMission(STRVAL(0), INTVAL(1), STRVAL(2), STRVAL(3));
986
987 if(rc == nullptr)
988 {
989 rc = "";
990 }
991
992 NANRETS(rc);
993}
994
995//--------------------------------------------------------
996NAN_METHOD(generateMissionUsingCertStore)
997{
998 const char *rc = engageGenerateMissionUsingCertStore(STRVAL(0), INTVAL(1), STRVAL(2), STRVAL(3), STRVAL(4), STRVAL(5), STRVAL(6));
999
1000 if(rc == nullptr)
1001 {
1002 rc = "";
1003 }
1004
1005 NANRETS(rc);
1006}
1007
1008//--------------------------------------------------------
1009NAN_METHOD(setMissionId)
1010{
1011 NANRETI(engageSetMissionId(STRVAL(0)));
1012}
1013
1014//--------------------------------------------------------
1015NAN_METHOD(openCertStore)
1016{
1017 NANRETI(engageOpenCertStore(STRVAL(0), STRVAL(1)));
1018}
1019
1020//--------------------------------------------------------
1021NAN_METHOD(closeCertStore)
1022{
1023 NANRETI(engageCloseCertStore());
1024}
1025
1026//--------------------------------------------------------
1027NAN_METHOD(setCertStoreCertificatePem)
1028{
1029 NANRETI(engageSetCertStoreCertificatePem(STRVAL(0), STRVAL(1), STRVAL(2), STRVAL(3)));
1030}
1031
1032//--------------------------------------------------------
1033NAN_METHOD(setCertStoreCertificateP12)
1034{
1035 NANRETI(engageSetCertStoreCertificateP12(STRVAL(0), (uint8_t*) node::Buffer::Data(info[1]), INTVAL(2), STRVAL(3), STRVAL(4)));
1036}
1037
1038//--------------------------------------------------------
1039NAN_METHOD(deleteCertStoreCertificate)
1040{
1041 NANRETI(engageDeleteCertStoreCertificate(STRVAL(0)));
1042}
1043
1044//--------------------------------------------------------
1045NAN_METHOD(getCertStoreCertificatePem)
1046{
1047 const char *rc = engageGetCertStoreCertificatePem(STRVAL(0));
1048
1049 if(rc == nullptr)
1050 {
1051 rc = "";
1052 }
1053
1054 NANRETS(rc);
1055}
1056
1057//--------------------------------------------------------
1058NAN_METHOD(getArrayOfCertificateDescriptorsFromPem)
1059{
1060 const char *rc = engageGetArrayOfCertificateDescriptorsFromPem(STRVAL(0));
1061
1062 if(rc == nullptr)
1063 {
1064 rc = "";
1065 }
1066
1067 NANRETS(rc);
1068}
1069
1070//--------------------------------------------------------
1071NAN_METHOD(getCertificateDescriptorFromPem)
1072{
1073 const char *rc = engageGetCertificateDescriptorFromPem(STRVAL(0));
1074
1075 if(rc == nullptr)
1076 {
1077 rc = "";
1078 }
1079
1080 NANRETS(rc);
1081}
1082
1083//--------------------------------------------------------
1084NAN_METHOD(importCertStoreElementFromCertStore)
1085{
1086 NANRETI(engageImportCertStoreElementFromCertStore(STRVAL(0), STRVAL(1), STRVAL(2), STRVAL(3), STRVAL(4)));
1087}
1088
1089//--------------------------------------------------------
1090NAN_METHOD(queryCertStoreContents)
1091{
1092 const char *rc = engageQueryCertStoreContents(STRVAL(0), STRVAL(1));
1093
1094 if(rc == nullptr)
1095 {
1096 rc = "";
1097 }
1098
1099 NANRETS(rc);
1100}
1101
1102//--------------------------------------------------------
1103NAN_METHOD(setCertStoreCertificateTags)
1104{
1105 NANRETI(engageSetCertStoreCertificateTags(STRVAL(0), STRVAL(1)));
1106}
1107
1108
1109//--------------------------------------------------------
1110NAN_METHOD(logMsg)
1111{
1112 NANRETI(engageLogMsg(INTVAL(0), STRVAL(1), STRVAL(2)));
1113}
1114
1115//--------------------------------------------------------
1116NAN_METHOD(platformNotifyChanges)
1117{
1118 NANRETI(engagePlatformNotifyChanges(STRVAL(0)));
1119}
1120
1121//--------------------------------------------------------
1122static void internalEngageLoggingHook(int level, const char *tag, const char *message)
1123{
1124 if(g_loggingHookFn.empty())
1125 {
1126 return;
1127 }
1128
1129 CrossThreadCallbackWorker *cbw = getCallback(g_loggingHookFn.c_str());
1130 if(!cbw)
1131 {
1132 return;
1133 }
1134
1135 std::vector<CrossThreadCallbackWorker::Parameter*> *params = new std::vector<CrossThreadCallbackWorker::Parameter*>();
1136 params->push_back(new CrossThreadCallbackWorker::IntParameter(level));
1137 params->push_back(new CrossThreadCallbackWorker::StringParameter(tag));
1138 params->push_back(new CrossThreadCallbackWorker::StringParameter(message));
1139 cbw->enqueue(params);
1140
1141 cbw->RELEASE_OBJECT_REFERENCE();
1142}
1143
1144//--------------------------------------------------------
1145NAN_METHOD(hookEngineLogging)
1146{
1147 g_loggingHookFn = STRVAL(0);
1148
1149 if(!g_loggingHookFn.empty())
1150 {
1151 engageSetLoggingOutputOverride(internalEngageLoggingHook);
1152 }
1153 else
1154 {
1156 }
1157}
1158
1159//--------------------------------------------------------
1160NAN_METHOD(setFipsCrypto)
1161{
1162 NANRETI(engageSetFipsCrypto(STRVAL(0)));
1163}
1164
1165//--------------------------------------------------------
1166NAN_METHOD(isCryptoFipsValidated)
1167{
1168 NANRETI(engageIsCryptoFipsValidated());
1169}
1170
1171//--------------------------------------------------------
1172NAN_METHOD(setCertStore)
1173{
1174 NANRETI(engageSetCertStore((uint8_t*) node::Buffer::Data(info[0]), INTVAL(1), STRVAL(2)));
1175}
1176
1177//--------------------------------------------------------
1178NAN_METHOD(getDeviceId)
1179{
1180 const char *rc = engageGetDeviceId();
1181
1182 if(rc == nullptr)
1183 {
1184 rc = "";
1185 }
1186
1187 NANRETS(rc);
1188}
1189
1190
1191//--------------------------------------------------------
1192NAN_METHOD(verifyRiff)
1193{
1194 NANRETI(engageVerifyRiff(STRVAL(0)));
1195}
1196
1197
1198//--------------------------------------------------------
1199NAN_METHOD(getRiffDescriptor)
1200{
1201 const char *rc = engageGetRiffDescriptor(STRVAL(0));
1202
1203 if(rc == nullptr)
1204 {
1205 rc = "";
1206 }
1207
1208 NANRETS(rc);
1209}
1210
1211
1212//--------------------------------------------------------
1213NAN_METHOD(beginGroupPcmPowerTracking)
1214{
1215 NANRETI(engageBeginGroupPcmPowerTracking(STRVAL(0)));
1216}
1217
1218
1219//--------------------------------------------------------
1220NAN_METHOD(endGroupPcmPowerTracking)
1221{
1222 NANRETI(engageEndGroupPcmPowerTracking(STRVAL(0)));
1223}
1224
1225//--------------------------------------------------------
1226NAN_METHOD(createBridge)
1227{
1228 NANRETI(engageCreateBridge(STRVAL(0)));
1229}
1230
1231//--------------------------------------------------------
1232NAN_METHOD(deleteBridge)
1233{
1234 NANRETI(engageDeleteBridge(STRVAL(0)));
1235}
1236
1237//--------------------------------------------------------
1238NAN_MODULE_INIT(Init)
1239{
1240 ENGAGE_BINDING(on);
1241
1242 ENGAGE_BINDING(setLogLevel);
1243
1244 ENGAGE_BINDING(enableCallbacks);
1245 ENGAGE_BINDING(disableCallbacks);
1246
1247 ENGAGE_BINDING(initialize);
1248 ENGAGE_BINDING(shutdown);
1249
1250 ENGAGE_BINDING(start);
1251 ENGAGE_BINDING(stop);
1252
1253 ENGAGE_BINDING(createGroup);
1254 ENGAGE_BINDING(deleteGroup);
1255 ENGAGE_BINDING(joinGroup);
1256 ENGAGE_BINDING(leaveGroup);
1257 ENGAGE_BINDING(setGroupRules);
1258
1259 ENGAGE_BINDING(beginGroupTx);
1260 ENGAGE_BINDING(beginGroupTxAdvanced);
1261 ENGAGE_BINDING(endGroupTx);
1262 ENGAGE_BINDING(setGroupRxTag);
1263
1264 ENGAGE_BINDING(muteGroupRx);
1265 ENGAGE_BINDING(unmuteGroupRx);
1266
1267 ENGAGE_BINDING(muteGroupTx);
1268 ENGAGE_BINDING(unmuteGroupTx);
1269
1270 ENGAGE_BINDING(setGroupRxVolume);
1271
1272 ENGAGE_BINDING(queryGroupTimeline);
1273
1274 ENGAGE_BINDING(updatePresenceDescriptor);
1275
1276 ENGAGE_BINDING(encrypt);
1277 ENGAGE_BINDING(decrypt);
1278
1279 ENGAGE_BINDING(updateLicense);
1280 ENGAGE_BINDING(getVersion);
1281 ENGAGE_BINDING(getHardwareReport);
1282 ENGAGE_BINDING(getNetworkInterfaceDevices);
1283 ENGAGE_BINDING(getAudioDevices);
1284
1285 ENGAGE_BINDING(getActiveLicenseDescriptor);
1286 ENGAGE_BINDING(getLicenseDescriptor);
1287
1288 ENGAGE_BINDING(openCertStore);
1289 ENGAGE_BINDING(closeCertStore);
1290 ENGAGE_BINDING(setCertStore);
1291 ENGAGE_BINDING(setCertStoreCertificatePem);
1292 ENGAGE_BINDING(setCertStoreCertificateP12);
1293 ENGAGE_BINDING(deleteCertStoreCertificate);
1294 ENGAGE_BINDING(getCertStoreCertificatePem);
1295 ENGAGE_BINDING(getCertificateDescriptorFromPem);
1296 ENGAGE_BINDING(importCertStoreElementFromCertStore);
1297 ENGAGE_BINDING(queryCertStoreContents);
1298 ENGAGE_BINDING(setCertStoreCertificateTags);
1299
1300 ENGAGE_BINDING(generateMission);
1301 ENGAGE_BINDING(generateMissionUsingCertStore);
1302
1303 ENGAGE_BINDING(setMissionId);
1304 ENGAGE_BINDING(platformNotifyChanges);
1305
1306 ENGAGE_BINDING(logMsg);
1307 ENGAGE_BINDING(hookEngineLogging);
1308
1309 ENGAGE_BINDING(setFipsCrypto);
1310 ENGAGE_BINDING(isCryptoFipsValidated);
1311
1312 ENGAGE_BINDING(getDeviceId);
1313
1314 ENGAGE_BINDING(verifyRiff);
1315 ENGAGE_BINDING(getRiffDescriptor);
1316
1317 ENGAGE_BINDING(beginGroupPcmPowerTracking);
1318 ENGAGE_BINDING(endGroupPcmPowerTracking);
1319
1320 ENGAGE_BINDING(createBridge);
1321 ENGAGE_BINDING(deleteBridge);
1322}
1323
1324NODE_MODULE(engage, Init)
API functions, codes, and more.
ENGAGE_API int engageMuteGroupRx(const char *_Nonnull id)
[ASYNC] Mutes play-out of received audio
ENGAGE_API int engageShutdown()
[SYNC] Shuts down the Engine
ENGAGE_API const char *_Nonnull engageGetLicenseDescriptor(const char *_Nonnull entitlement, const char *_Nonnull key, const char *_Nullable activationCode, const char *_Nullable manufacturerId)
[SYNC] Returns a license descriptor for the parameters passed in
ENGAGE_API int engageQueryGroupStats(const char *_Nonnull id)
[ASYNC] Requests that the Engine deliver a statistics report for the group
ENGAGE_API int engageSetCertStore(const uint8_t *_Nonnull buffer, size_t size, const char *_Nullable passwordHexByteString)
[SYNC] Set the certstore content via buffer
ENGAGE_API int engageDeleteGroup(const char *_Nonnull id)
[ASYNC] Deletes a previously-created group object
ENGAGE_API int engageIsCryptoFipsValidated(void)
[SYNC] Returns 1 if crypto is FIPS140-2 validated, otherwise 0
ENGAGE_API int engageCreateBridge(const char *_Nonnull jsonConfiguration)
[ASYNC] Creates a bridge object
ENGAGE_API int engageSetFipsCrypto(const char *_Nonnull jsonParams)
[SYNC] Enable FIPS crypto
ENGAGE_API int engageVerifyRiff(const char *_Nonnull fn)
[SYNC] Verifies a recorded RIFF file.
ENGAGE_API int engageEndGroupPcmPowerTracking(const char *_Nonnull id)
[ASYNC] End tracking of input and output PCM power for the group
ENGAGE_API int engageRegisterEventCallbacks(const EngageEvents_t *_Nonnull pEvents)
[SYNC] Registers application event handlers with the Engine
ENGAGE_API int engageQueryGroupTimeline(const char *_Nonnull id, const char *_Nonnull jsonParams)
[ASYNC] Requests that the Engine deliver a timeline report for the group
ENGAGE_API int engageSetGroupRxVolume(const char *_Nonnull id, int left, int right)
[ASYNC] Sets the audio play-out volume of the group
ENGAGE_API int engageEndGroupTx(const char *_Nonnull id)
[ASYNC] Ends transmission on an audio group
ENGAGE_API int engagePlatformNotifyChanges(const char *_Nonnull jsonChangesArray)
[SYNC] Notifies Engage of changes reported by the application or platform
ENGAGE_API int engageStop(void)
[ASYNC] Stops the Engine's internal processing
ENGAGE_API const char *_Nonnull engageGetCertStoreCertificatePem(const char *_Nonnull id)
[SYNC] Returns a certificate in PEM format. The private key (if any) is NOT returned.
ENGAGE_API int engageEnableSyslog(int enable)
[SYNC] Enables or disables logging to syslog.
ENGAGE_API int engageCloseCertStore(void)
[SYNC] Closes the current certificate store (if any)
ENGAGE_API const char *_Nonnull engageGetDeviceId()
[SYNC] Returns the device identifier
ENGAGE_API int engageLogMsg(int level, const char *_Nonnull tag, const char *_Nonnull msg)
[SYNC] Log a message via the Engine's logger
ENGAGE_API int engageJoinGroup(const char *_Nonnull id)
[ASYNC] Joins a group
ENGAGE_API int engageSetGroupRules(const char *_Nonnull id, const char *_Nonnull jsonParams)
[ASYNC] Sets the audio play-out volume of the group
ENGAGE_API const char *_Nonnull engageGetHardwareReport()
[SYNC] Returns a hardware report
ENGAGE_API int engageBeginGroupPcmPowerTracking(const char *_Nonnull id)
[ASYNC] Begins tracking of input and output PCM power for the group
ENGAGE_API const char *_Nonnull engageGetArrayOfCertificateDescriptorsFromPem(const char *_Nonnull pem)
[SYNC] Returns a JSON array, with each element being an object describing the certificate PEM.
ENGAGE_API int engageQueryGroupHealth(const char *_Nonnull id)
[ASYNC] Requests that the Engine deliver a health report for the group
ENGAGE_API int engageImportCertStoreElementFromCertStore(const char *_Nonnull id, const char *_Nonnull srcId, const char *_Nonnull srcFileName, const char *_Nonnull srcPasswordHexByteString, const char *_Nullable tags)
[SYNC] Adds/updates an element (certificate and optionally private key) from another certificate stor...
ENGAGE_API int engageSetCertStoreCertificateP12(const char *_Nonnull id, uint8_t *_Nonnull data, size_t size, const char *_Nullable password, const char *_Nullable tags)
[SYNC] Adds/updates a certificate and (optionally) private key using P12 content
ENGAGE_API int engageMuteGroupTx(const char *_Nonnull id)
[ASYNC] Mutes microphone audio capture
ENGAGE_API int engageSetGroupRxTag(const char *_Nonnull id, uint16_t tag)
[ASYNC] Sets/clear a audio stream subchannel tag
ENGAGE_API int engageEnableWatchdog(int enable)
[SYNC] Enables or disables the Engine watchdog.
ENGAGE_API int engageOpenCertStore(const char *_Nonnull fileName, const char *_Nullable passwordHexByteString)
[SYNC] Opens a certificate store
ENGAGE_API const char *_Nonnull engageGenerateMission(const char *_Nonnull keyPhrase, int audioGroupCount, const char *_Nullable rallypointHost, const char *_Nullable missionName)
[SYNC] Generates a mission based on a key phrase
ENGAGE_API const char *_Nonnull engageGetRiffDescriptor(const char *_Nonnull fn)
[SYNC] Returns a descriptor for a RIFF file
ENGAGE_API int engageBeginGroupTxAdvanced(const char *_Nonnull id, const char *_Nonnull jsonParams)
[ASYNC] Begin audio transmission on a group with additional parameters
ENGAGE_API int engageDecrypt(const uint8_t *_Nonnull src, size_t size, uint8_t *_Nonnull dst, const char *_Nonnull passwordHexByteString)
[SYNC] Decrypt data using the Engine's cryptography module
ENGAGE_API int engageBeginGroupTx(const char *_Nonnull id, int txPriority, uint32_t txFlags)
[ASYNC] Begin audio transmission on a group
ENGAGE_API int engageInitialize(const char *_Nullable enginePolicyConfiguration, const char *_Nullable userIdentity, const char *_Nullable tempStoragePath)
[SYNC] Initializes the Engine.
ENGAGE_API const char *_Nonnull engageGetNetworkInterfaceDevices()
[SYNC] Returns an array of network interface devices in JSON format
ENGAGE_API int engageSetLoggingOutputOverride(const _Nullable PFN_ENGAGE_LOG_HOOK pfnHook)
[SYNC] Sets/clears the output override callback for log messages.
ENGAGE_API const char *_Nonnull engageGetActiveLicenseDescriptor()
[SYNC] Returns the currently-active license descriptor
ENGAGE_API int engageCreateGroup(const char *_Nonnull jsonConfiguration)
[ASYNC] Creates a group object
ENGAGE_API int engageUpdatePresenceDescriptor(const char *_Nonnull id, const char *_Nonnull descriptorJson, int forceBeacon)
[ASYNC] Updates the application-defined elements of a presence descriptor
ENGAGE_API int engageEncrypt(const uint8_t *_Nonnull src, size_t size, uint8_t *_Nonnull dst, const char *_Nonnull passwordHexByteString)
[SYNC] Encrypt data using the Engine's cryptography module
ENGAGE_API int engageUnmuteGroupTx(const char *_Nonnull id)
[ASYNC] Unmutes microphone audio capture
ENGAGE_API const char *_Nonnull engageGetVersion()
[SYNC] Returns the version of the Engine
ENGAGE_API const char *_Nonnull engageGetCertificateDescriptorFromPem(const char *_Nonnull pem)
[SYNC] Returns a JSON object describing the certificate PEM.
ENGAGE_API int engageSetCertStoreCertificateTags(const char *_Nonnull id, const char *_Nullable tags)
[SYNC] Updates a certificate's tags
ENGAGE_API int engageLeaveGroup(const char *_Nonnull id)
[ASYNC] Leaves a group
ENGAGE_API int engageSetLogLevel(int level)
[SYNC] Sets the Engine's logging level.
ENGAGE_API int engageSetCertStoreCertificatePem(const char *_Nonnull id, const char *_Nonnull certificatePem, const char *_Nullable privateKeyPem, const char *_Nullable tags)
[SYNC] Adds/updates a certificate and (optionally) private key using PEM strings
ENGAGE_API int engageSetLogTagExtension(const char *_Nullable tagExtension)
[SYNC] Sets the Engine's log tag extension.
ENGAGE_API const char *_Nonnull engageGenerateMissionUsingCertStore(const char *_Nonnull keyPhrase, int audioGroupCount, const char *_Nullable rallypointHost, const char *_Nullable missionName, const char *_Nonnull certStoreFn, const char *_Nullable certStorePasswordHexByteString, const char *_Nullable certStoreElement)
[SYNC] Generates a mission based on a key phrase and using a specified certificate store
ENGAGE_API int engageUpdateLicense(const char *_Nonnull entitlement, const char *_Nonnull key, const char *_Nullable activationCode, const char *_Nullable manufacturerId)
[ASYNC] Update the active license with new parameters
ENGAGE_API int engageDeleteBridge(const char *_Nonnull id)
[ASYNC] Deletes a bridge object
ENGAGE_API const char *_Nonnull engageQueryCertStoreContents(const char *_Nonnull fileName, const char *_Nullable passwordHexByteString)
[SYNC] Returns an extended descriptor of named certificate store
ENGAGE_API const char *_Nonnull engageGetAudioDevices()
[SYNC] Returns an array of audio device descriptor interface devices in JSON format
ENGAGE_API int engageSetMissionId(const char *_Nullable missionId)
[SYNC] Sets the (optional) mission ID for the Engine
ENGAGE_API int engageStart(void)
[ASYNC] Starts the Engine
ENGAGE_API int engageDeleteCertStoreCertificate(const char *_Nonnull id)
[SYNC] Deletes a certificate and its private key (if any)
ENGAGE_API int engageUnmuteGroupRx(const char *_Nonnull id)
[ASYNC] Unmutes play-out of received audio
static const int ENGAGE_RESULT_OK
The request was succesful.
static const int ENGAGE_SYSLOG_ENABLE
Enables syslog output on supported systems.
static const int ENGAGE_SYSLOG_DISABLE
Disables syslog output.
static const int ENGAGE_WATCHDOG_DISABLE
Disables the watchdog - has no effect if the watchdog is disabled in the policy configuration.
static const int ENGAGE_WATCHDOG_ENABLE
Enables the watchdog - has no effect if the watchdog is disabled in the policy configuration.
Event Handlers Struct.