engage-engine 1.250.90900018 → 1.251.90910020

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/engage.cpp CHANGED
@@ -502,6 +502,10 @@ ENGAGE_CB_ID_PARAM(groupHealthReportFailed);
502
502
  ENGAGE_CB_ID_PLUS_ONE_STRING_PARAM(groupStatsReport);
503
503
  ENGAGE_CB_ID_PARAM(groupStatsReportFailed);
504
504
 
505
+ ENGAGE_CB_ID_PARAM(bridgeCreated)
506
+ ENGAGE_CB_ID_PARAM(bridgeCreateFailed)
507
+ ENGAGE_CB_ID_PARAM(bridgeDeleted)
508
+
505
509
  void on_groupRxVolumeChanged(const char *id, int16_t leftLevelPerc, int16_t rightLevelPerc, const char * eventExtraJson)
506
510
  {
507
511
  CrossThreadCallbackWorker *cbw = getCallback("groupRxVolumeChanged");
@@ -661,6 +665,10 @@ NAN_METHOD(initialize)
661
665
  ENGAGE_CB_TABLE_ENTRY(PFN_ENGAGE_GROUP_RX_VOLUME_CHANGED, groupRxVolumeChanged);
662
666
  ENGAGE_CB_TABLE_ENTRY(PFN_ENGAGE_GROUP_RX_DTMF, groupRxDtmf);
663
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
+
664
672
  engageRegisterEventCallbacks(&g_eventCallbacks);
665
673
 
666
674
  NANRETI(engageInitialize(STRVAL(0), STRVAL(1), STRVAL(2)));
@@ -1214,6 +1222,17 @@ NAN_METHOD(endGroupPcmPowerTracking)
1214
1222
  NANRETI(engageEndGroupPcmPowerTracking(STRVAL(0)));
1215
1223
  }
1216
1224
 
1225
+ //--------------------------------------------------------
1226
+ NAN_METHOD(createBridge)
1227
+ {
1228
+ NANRETI(engageCreateBridge(STRVAL(0)));
1229
+ }
1230
+
1231
+ //--------------------------------------------------------
1232
+ NAN_METHOD(deleteBridge)
1233
+ {
1234
+ NANRETI(engageDeleteBridge(STRVAL(0)));
1235
+ }
1217
1236
 
1218
1237
  //--------------------------------------------------------
1219
1238
  NAN_MODULE_INIT(Init)
@@ -1297,6 +1316,9 @@ NAN_MODULE_INIT(Init)
1297
1316
 
1298
1317
  ENGAGE_BINDING(beginGroupPcmPowerTracking);
1299
1318
  ENGAGE_BINDING(endGroupPcmPowerTracking);
1319
+
1320
+ ENGAGE_BINDING(createBridge);
1321
+ ENGAGE_BINDING(deleteBridge);
1300
1322
  }
1301
1323
 
1302
1324
  NODE_MODULE(engage, Init)
@@ -2800,7 +2800,7 @@ namespace AppConfigurationObjects
2800
2800
  std::vector<std::string> caCertificates;
2801
2801
 
2802
2802
  /**
2803
- * @brief [Optional, Default 5000] Number of milliseconds that a transaction may take before the link is considered broken.
2803
+ * @brief [Optional, Default 10000] Number of milliseconds that a transaction may take before the link is considered broken.
2804
2804
  */
2805
2805
  int transactionTimeoutMs;
2806
2806
 
@@ -2815,6 +2815,14 @@ namespace AppConfigurationObjects
2815
2815
  /** @brief [Optional] Tx options for the TCP link */
2816
2816
  TcpNetworkTxOptions tcpTxOptions;
2817
2817
 
2818
+ /**
2819
+ * @brief [Optional] A user-defined string sent as the Server Name Indication (SNI) field in
2820
+ * the TLS setup. Be aware that this data is sent in the clear in the client hello message.
2821
+ *
2822
+ */
2823
+ std::string sni;
2824
+
2825
+
2818
2826
  Rallypoint()
2819
2827
  {
2820
2828
  clear();
@@ -2827,10 +2835,11 @@ namespace AppConfigurationObjects
2827
2835
  certificateKey.clear();
2828
2836
  caCertificates.clear();
2829
2837
  verifyPeer = false;
2830
- transactionTimeoutMs = 5000;
2838
+ transactionTimeoutMs = 0;
2831
2839
  disableMessageSigning = false;
2832
- connectionTimeoutSecs = 5;
2840
+ connectionTimeoutSecs = 0;
2833
2841
  tcpTxOptions.clear();
2842
+ sni.clear();
2834
2843
  }
2835
2844
 
2836
2845
  bool matches(const Rallypoint& other)
@@ -2893,6 +2902,18 @@ namespace AppConfigurationObjects
2893
2902
  {
2894
2903
  return false;
2895
2904
  }
2905
+ if(connectionTimeoutSecs != other.connectionTimeoutSecs)
2906
+ {
2907
+ return false;
2908
+ }
2909
+ if(tcpTxOptions.priority != other.tcpTxOptions.priority)
2910
+ {
2911
+ return false;
2912
+ }
2913
+ if(sni.compare(other.sni) != 0)
2914
+ {
2915
+ return false;
2916
+ }
2896
2917
 
2897
2918
  return true;
2898
2919
  }
@@ -2910,7 +2931,8 @@ namespace AppConfigurationObjects
2910
2931
  TOJSON_IMPL(transactionTimeoutMs),
2911
2932
  TOJSON_IMPL(disableMessageSigning),
2912
2933
  TOJSON_IMPL(connectionTimeoutSecs),
2913
- TOJSON_IMPL(tcpTxOptions)
2934
+ TOJSON_IMPL(tcpTxOptions),
2935
+ TOJSON_IMPL(sni)
2914
2936
  };
2915
2937
  }
2916
2938
 
@@ -2923,10 +2945,11 @@ namespace AppConfigurationObjects
2923
2945
  getOptional<bool>("verifyPeer", p.verifyPeer, j, true);
2924
2946
  getOptional<bool>("allowSelfSignedCertificate", p.allowSelfSignedCertificate, j, false);
2925
2947
  getOptional<std::vector<std::string>>("caCertificates", p.caCertificates, j);
2926
- getOptional<int>("transactionTimeoutMs", p.transactionTimeoutMs, j, 5000);
2948
+ getOptional<int>("transactionTimeoutMs", p.transactionTimeoutMs, j, 0);
2927
2949
  getOptional<bool>("disableMessageSigning", p.disableMessageSigning, j, false);
2928
- getOptional<int>("connectionTimeoutSecs", p.connectionTimeoutSecs, j, 5);
2950
+ getOptional<int>("connectionTimeoutSecs", p.connectionTimeoutSecs, j, 0);
2929
2951
  getOptional<TcpNetworkTxOptions>("tcpTxOptions", p.tcpTxOptions, j);
2952
+ getOptional<std::string>("sni", p.sni, j);
2930
2953
  }
2931
2954
 
2932
2955
  //-----------------------------------------------------------
@@ -2970,9 +2993,12 @@ namespace AppConfigurationObjects
2970
2993
  /** @brief Seconds between switching to a new target */
2971
2994
  int rolloverSecs;
2972
2995
 
2973
- /** @brief [Optional, Default: 0] Default connection timeout in seconds to any RP in the cluster */
2996
+ /** @brief [Optional, Default: 5] Default connection timeout in seconds to any RP in the cluster */
2974
2997
  int connectionTimeoutSecs;
2975
2998
 
2999
+ /** @brief [Optional, Default: 10000] Default transaction time in milliseconds to any RP in the cluster */
3000
+ int transactionTimeoutMs;
3001
+
2976
3002
  RallypointCluster()
2977
3003
  {
2978
3004
  clear();
@@ -2984,6 +3010,7 @@ namespace AppConfigurationObjects
2984
3010
  rallypoints.clear();
2985
3011
  rolloverSecs = 10;
2986
3012
  connectionTimeoutSecs = 5;
3013
+ transactionTimeoutMs = 10000;
2987
3014
  }
2988
3015
  };
2989
3016
 
@@ -2993,7 +3020,8 @@ namespace AppConfigurationObjects
2993
3020
  TOJSON_IMPL(connectionStrategy),
2994
3021
  TOJSON_IMPL(rallypoints),
2995
3022
  TOJSON_IMPL(rolloverSecs),
2996
- TOJSON_IMPL(connectionTimeoutSecs)
3023
+ TOJSON_IMPL(connectionTimeoutSecs),
3024
+ TOJSON_IMPL(transactionTimeoutMs)
2997
3025
  };
2998
3026
  }
2999
3027
  static void from_json(const nlohmann::json& j, RallypointCluster& p)
@@ -3003,6 +3031,7 @@ namespace AppConfigurationObjects
3003
3031
  getOptional<std::vector<Rallypoint>>("rallypoints", p.rallypoints, j);
3004
3032
  getOptional<int>("rolloverSecs", p.rolloverSecs, j, 10);
3005
3033
  getOptional<int>("connectionTimeoutSecs", p.connectionTimeoutSecs, j, 5);
3034
+ getOptional<int>("transactionTimeoutMs", p.transactionTimeoutMs, j, 10000);
3006
3035
  }
3007
3036
 
3008
3037
 
@@ -4016,6 +4045,9 @@ namespace AppConfigurationObjects
4016
4045
  /** @brief [Optional, Default: 5] The minimum interval to send at to prevent network flooding */
4017
4046
  int minIntervalSecs;
4018
4047
 
4048
+ /** @brief [Optional, Default: false] Instructs the Engage Engine reduce the immediacy of presence announcements wherever possible */
4049
+ bool reduceImmediacy;
4050
+
4019
4051
  Presence()
4020
4052
  {
4021
4053
  clear();
@@ -4027,6 +4059,7 @@ namespace AppConfigurationObjects
4027
4059
  intervalSecs = 30;
4028
4060
  listenOnly = false;
4029
4061
  minIntervalSecs = 5;
4062
+ reduceImmediacy = false;
4030
4063
  }
4031
4064
  };
4032
4065
 
@@ -4036,7 +4069,8 @@ namespace AppConfigurationObjects
4036
4069
  TOJSON_IMPL(format),
4037
4070
  TOJSON_IMPL(intervalSecs),
4038
4071
  TOJSON_IMPL(listenOnly),
4039
- TOJSON_IMPL(minIntervalSecs)
4072
+ TOJSON_IMPL(minIntervalSecs),
4073
+ TOJSON_IMPL(reduceImmediacy)
4040
4074
  };
4041
4075
  }
4042
4076
  static void from_json(const nlohmann::json& j, Presence& p)
@@ -4046,6 +4080,7 @@ namespace AppConfigurationObjects
4046
4080
  getOptional<int>("intervalSecs", p.intervalSecs, j, 30);
4047
4081
  getOptional<bool>("listenOnly", p.listenOnly, j, false);
4048
4082
  getOptional<int>("minIntervalSecs", p.minIntervalSecs, j, 5);
4083
+ getOptional<bool>("reduceImmediacy", p.reduceImmediacy, j, false);
4049
4084
  }
4050
4085
 
4051
4086
 
@@ -4700,6 +4735,79 @@ namespace AppConfigurationObjects
4700
4735
  FROMJSON_IMPL_SIMPLE(alias);
4701
4736
  }
4702
4737
 
4738
+ //-----------------------------------------------------------
4739
+ JSON_SERIALIZED_CLASS(GroupBridgeTargetOutputDetail)
4740
+ /**
4741
+ * @brief Options for Source
4742
+ *
4743
+ * Helper C++ class to serialize and de-serialize GroupBridgeTargetOutputDetail JSON
4744
+ *
4745
+ * TODO: Complete this Class
4746
+ *
4747
+ * Example: @include[doc] examples/GroupBridgeTargetOutputDetail.json
4748
+ *
4749
+ * @see Group
4750
+ */
4751
+ class GroupBridgeTargetOutputDetail : public ConfigurationObjectBase
4752
+ {
4753
+ IMPLEMENT_JSON_SERIALIZATION()
4754
+ IMPLEMENT_JSON_DOCUMENTATION(GroupBridgeTargetOutputDetail)
4755
+
4756
+ public:
4757
+ /** @brief Enum describing bridging operation mode types where applicable. */
4758
+ typedef enum
4759
+ {
4760
+ /** @brief Raw mode (default) - packet payloads are not accessed or modified and forwarded as raw packets. The
4761
+ * group must have a type of @ref gtRaw.
4762
+ */
4763
+ bomRaw = 0,
4764
+
4765
+ /** @brief Audio payloads are transformed, headers are preserved, multiple parallel output streams are
4766
+ * possible/expected. The group must be gtAudio (type = 1).*/
4767
+ bomMultistream = 1,
4768
+
4769
+ /** @brief Audio payloads are mixed - output is anonymous (i.e. no metadata) if if the target group(s)
4770
+ * allow header extensions. The group must be gtAudio (type = 1)*/
4771
+ bomMixedStream = 2,
4772
+ } BridgingOpMode_t;
4773
+
4774
+ /** @brief [Optional] The output mode */
4775
+ BridgingOpMode_t mode;
4776
+
4777
+ /** @brief [Optional] Parameters to be applied when output is mixed (bomMixedStream) */
4778
+ AdvancedTxParams mixedStreamTxParams;
4779
+
4780
+ GroupBridgeTargetOutputDetail()
4781
+ {
4782
+ clear();
4783
+ }
4784
+
4785
+ void clear()
4786
+ {
4787
+ mode = BridgingOpMode_t::bomRaw;
4788
+ mixedStreamTxParams.clear();
4789
+ }
4790
+
4791
+ virtual void initForDocumenting()
4792
+ {
4793
+ clear();
4794
+ }
4795
+ };
4796
+
4797
+ static void to_json(nlohmann::json& j, const GroupBridgeTargetOutputDetail& p)
4798
+ {
4799
+ j = nlohmann::json{
4800
+ TOJSON_IMPL(mode),
4801
+ TOJSON_IMPL(mixedStreamTxParams)
4802
+ };
4803
+ }
4804
+ static void from_json(const nlohmann::json& j, GroupBridgeTargetOutputDetail& p)
4805
+ {
4806
+ p.clear();
4807
+ FROMJSON_IMPL_SIMPLE(mode);
4808
+ FROMJSON_IMPL_SIMPLE(mixedStreamTxParams);
4809
+ }
4810
+
4703
4811
  //-----------------------------------------------------------
4704
4812
  JSON_SERIALIZED_CLASS(Group)
4705
4813
  /**
@@ -4734,23 +4842,6 @@ namespace AppConfigurationObjects
4734
4842
  gtRaw = 3
4735
4843
  } Type_t;
4736
4844
 
4737
-
4738
- /** @brief Enum describing bridging operation mode types where applicable. */
4739
- typedef enum
4740
- {
4741
- /** @brief Raw mode (default) - packet payloads are not accessed or modified and forwarded as raw packets */
4742
- bomRaw = 0,
4743
-
4744
- /** @brief Audio payloads are transformed, headers are preserved, multiple parallel output streams are possible/expected */
4745
- bomPayloadTransformation = 1,
4746
-
4747
- /** @brief Audio payloads are mixed - output is anonymous (i.e. no metadata) if if the target group(s) allow header extensions */
4748
- bomAnonymousMixing = 2,
4749
-
4750
- /** @brief The bridge performs language translations between groups */
4751
- bomLanguageTranslation = 3
4752
- } BridgingOpMode_t;
4753
-
4754
4845
  /** @brief Enum describing the alias generation policy. */
4755
4846
  typedef enum
4756
4847
  {
@@ -4764,8 +4855,8 @@ namespace AppConfigurationObjects
4764
4855
  /** @brief Specifies the group type (see @ref Type_t). */
4765
4856
  Type_t type;
4766
4857
 
4767
- /** @brief Specifies the bridging operation mode if applicable (see @ref BridgingOpMode_t). */
4768
- BridgingOpMode_t bom;
4858
+ /** @brief Output details for when the group is a target in a bridge (see @ref GroupBridgeTargetOutputDetail). */
4859
+ GroupBridgeTargetOutputDetail bridgeTargetOutputDetail;
4769
4860
 
4770
4861
  /**
4771
4862
  * @brief Unique identity for the group.
@@ -4931,7 +5022,7 @@ namespace AppConfigurationObjects
4931
5022
  void clear()
4932
5023
  {
4933
5024
  type = gtUnknown;
4934
- bom = bomRaw;
5025
+ bridgeTargetOutputDetail.clear();
4935
5026
  id.clear();
4936
5027
  name.clear();
4937
5028
  spokenName.clear();
@@ -5008,7 +5099,7 @@ namespace AppConfigurationObjects
5008
5099
  {
5009
5100
  j = nlohmann::json{
5010
5101
  TOJSON_IMPL(type),
5011
- TOJSON_IMPL(bom),
5102
+ TOJSON_IMPL(bridgeTargetOutputDetail),
5012
5103
  TOJSON_IMPL(id),
5013
5104
  TOJSON_IMPL(name),
5014
5105
  TOJSON_IMPL(spokenName),
@@ -5100,7 +5191,7 @@ namespace AppConfigurationObjects
5100
5191
  {
5101
5192
  p.clear();
5102
5193
  j.at("type").get_to(p.type);
5103
- getOptional<Group::BridgingOpMode_t>("bom", p.bom, j, Group::BridgingOpMode_t::bomRaw);
5194
+ getOptional<GroupBridgeTargetOutputDetail>("bridgeTargetOutputDetail", p.bridgeTargetOutputDetail, j);
5104
5195
  j.at("id").get_to(p.id);
5105
5196
  getOptional<std::string>("name", p.name, j);
5106
5197
  getOptional<std::string>("spokenName", p.spokenName, j);
@@ -5718,7 +5809,9 @@ namespace AppConfigurationObjects
5718
5809
  /** @brief List of group IDs to be included in the session */
5719
5810
  std::vector<std::string> groups;
5720
5811
 
5721
- /** @brief [Optional, Default: true] Enable the bridge */
5812
+ /** @brief [Optional, Default: true] Enable the bridge
5813
+ * NOTE: this is only used bt EBS and is ignored when calling engageCreateBridge() is called
5814
+ */
5722
5815
  bool enabled;
5723
5816
 
5724
5817
  Bridge()
@@ -6896,6 +6989,9 @@ namespace AppConfigurationObjects
6896
6989
  /** @brief [Optional, Default: 5] Connection timeout in seconds to RP */
6897
6990
  int rpConnectionTimeoutSecs;
6898
6991
 
6992
+ /** @brief [Optional, Default: 5] Transaction timeout with RP */
6993
+ int rpTransactionTimeoutMs;
6994
+
6899
6995
  /** @brief [Optional, Default: 10] The number of seconds after which "sticky" transmission IDs expire. */
6900
6996
  int stickyTidHangSecs;
6901
6997
 
@@ -6921,7 +7017,8 @@ namespace AppConfigurationObjects
6921
7017
  rpClusterStrategy = RallypointCluster::ConnectionStrategy_t::csRoundRobin;
6922
7018
  rpClusterRolloverSecs = 10;
6923
7019
  rtpExpirationCheckIntervalMs = 250;
6924
- rpConnectionTimeoutSecs = 5;
7020
+ rpConnectionTimeoutSecs = 0;
7021
+ rpTransactionTimeoutMs = 0;
6925
7022
  stickyTidHangSecs = 10;
6926
7023
  uriStreamingIntervalMs = 60;
6927
7024
  delayedMicrophoneClosureSecs = 15;
@@ -6942,6 +7039,7 @@ namespace AppConfigurationObjects
6942
7039
  TOJSON_IMPL(rpClusterRolloverSecs),
6943
7040
  TOJSON_IMPL(rtpExpirationCheckIntervalMs),
6944
7041
  TOJSON_IMPL(rpConnectionTimeoutSecs),
7042
+ TOJSON_IMPL(rpTransactionTimeoutMs),
6945
7043
  TOJSON_IMPL(stickyTidHangSecs),
6946
7044
  TOJSON_IMPL(uriStreamingIntervalMs),
6947
7045
  TOJSON_IMPL(delayedMicrophoneClosureSecs),
@@ -6960,7 +7058,8 @@ namespace AppConfigurationObjects
6960
7058
  getOptional<RallypointCluster::ConnectionStrategy_t>("rpClusterStrategy", p.rpClusterStrategy, j, RallypointCluster::ConnectionStrategy_t::csRoundRobin);
6961
7059
  getOptional<int>("rpClusterRolloverSecs", p.rpClusterRolloverSecs, j, 10);
6962
7060
  getOptional<int>("rtpExpirationCheckIntervalMs", p.rtpExpirationCheckIntervalMs, j, 250);
6963
- getOptional<int>("rpConnectionTimeoutSecs", p.rpConnectionTimeoutSecs, j, 5);
7061
+ getOptional<int>("rpConnectionTimeoutSecs", p.rpConnectionTimeoutSecs, j, 0);
7062
+ getOptional<int>("rpTransactionTimeoutMs", p.rpTransactionTimeoutMs, j, 0);
6964
7063
  getOptional<int>("stickyTidHangSecs", p.stickyTidHangSecs, j, 10);
6965
7064
  getOptional<int>("uriStreamingIntervalMs", p.uriStreamingIntervalMs, j, 60);
6966
7065
  getOptional<int>("delayedMicrophoneClosureSecs", p.delayedMicrophoneClosureSecs, j, 15);
@@ -7611,6 +7710,18 @@ namespace AppConfigurationObjects
7611
7710
  IMPLEMENT_JSON_DOCUMENTATION(RallypointPeer)
7612
7711
 
7613
7712
  public:
7713
+ typedef enum
7714
+ {
7715
+ /** @brief Use the RP's configuration */
7716
+ olpUseRpConfiguration = 0,
7717
+
7718
+ /** @brief Mark as a domain leaf */
7719
+ olpIsMeshLeaf = 1,
7720
+
7721
+ /** @brief Do not mark as a domain leaf */
7722
+ olpNotMeshLeaf = 2
7723
+ } OutboundLeafPolicy_t;
7724
+
7614
7725
  /** @brief Internal ID. */
7615
7726
  std::string id;
7616
7727
 
@@ -7629,6 +7740,8 @@ namespace AppConfigurationObjects
7629
7740
  /** @brief Internal enablement setting. */
7630
7741
  bool forceIsMeshLeaf;
7631
7742
 
7743
+ OutboundLeafPolicy_t outboundLeafPolicy;
7744
+
7632
7745
  RallypointPeer()
7633
7746
  {
7634
7747
  clear();
@@ -7642,6 +7755,7 @@ namespace AppConfigurationObjects
7642
7755
  certificate.clear();
7643
7756
  connectionTimeoutSecs = 0;
7644
7757
  forceIsMeshLeaf = false;
7758
+ outboundLeafPolicy = OutboundLeafPolicy_t::olpUseRpConfiguration;
7645
7759
  }
7646
7760
  };
7647
7761
 
@@ -7653,7 +7767,8 @@ namespace AppConfigurationObjects
7653
7767
  TOJSON_IMPL(host),
7654
7768
  TOJSON_IMPL(certificate),
7655
7769
  TOJSON_IMPL(connectionTimeoutSecs),
7656
- TOJSON_IMPL(forceIsMeshLeaf)
7770
+ TOJSON_IMPL(forceIsMeshLeaf),
7771
+ TOJSON_IMPL(outboundLeafPolicy)
7657
7772
  };
7658
7773
  }
7659
7774
  static void from_json(const nlohmann::json& j, RallypointPeer& p)
@@ -7665,6 +7780,7 @@ namespace AppConfigurationObjects
7665
7780
  getOptional<SecurityCertificate>("certificate", p.certificate, j);
7666
7781
  getOptional<int>("connectionTimeoutSecs", p.connectionTimeoutSecs, j, 0);
7667
7782
  getOptional<bool>("forceIsMeshLeaf", p.forceIsMeshLeaf, j, false);
7783
+ getOptional<RallypointPeer::OutboundLeafPolicy_t>("outboundLeafPolicy", p.outboundLeafPolicy, j, RallypointPeer::OutboundLeafPolicy_t::olpUseRpConfiguration);
7668
7784
  }
7669
7785
 
7670
7786
  //-----------------------------------------------------------
@@ -8077,10 +8193,10 @@ namespace AppConfigurationObjects
8077
8193
 
8078
8194
  public:
8079
8195
 
8080
- /** @brief An identifier useful for organizations that track different mesh configurations by ID */
8196
+ /** @brief An identifier useful for organizations that track different domain configurations by ID */
8081
8197
  std::string id;
8082
8198
 
8083
- /** @brief TODO: A version number for the mesh configuration. Change this whenever you update your configuration */
8199
+ /** @brief TODO: A version number for the domain configuration. Change this whenever you update your configuration */
8084
8200
  int version;
8085
8201
 
8086
8202
  /** @brief Comments */
@@ -8614,6 +8730,54 @@ namespace AppConfigurationObjects
8614
8730
  }
8615
8731
 
8616
8732
 
8733
+
8734
+
8735
+ //-----------------------------------------------------------
8736
+ JSON_SERIALIZED_CLASS(NamedIdentity)
8737
+ /**
8738
+ * @brief Defines settings for a named identity
8739
+ *
8740
+ * Example: @include[doc] examples/NamedIdentity.json
8741
+ *
8742
+ */
8743
+ class NamedIdentity : public ConfigurationObjectBase
8744
+ {
8745
+ IMPLEMENT_JSON_SERIALIZATION()
8746
+ IMPLEMENT_JSON_DOCUMENTATION(NamedIdentity)
8747
+
8748
+ public:
8749
+ /** @brief The identity name */
8750
+ std::string name;
8751
+
8752
+ /** @brief The identity certificate */
8753
+ SecurityCertificate certificate;
8754
+
8755
+ NamedIdentity()
8756
+ {
8757
+ clear();
8758
+ }
8759
+
8760
+ void clear()
8761
+ {
8762
+ name.clear();
8763
+ certificate.clear();
8764
+ }
8765
+ };
8766
+
8767
+ static void to_json(nlohmann::json& j, const NamedIdentity& p)
8768
+ {
8769
+ j = nlohmann::json{
8770
+ TOJSON_IMPL(name),
8771
+ TOJSON_IMPL(certificate)
8772
+ };
8773
+ }
8774
+ static void from_json(const nlohmann::json& j, NamedIdentity& p)
8775
+ {
8776
+ p.clear();
8777
+ getOptional<std::string>("name", p.name, j);
8778
+ getOptional<SecurityCertificate>("certificate", p.certificate, j);
8779
+ }
8780
+
8617
8781
  //-----------------------------------------------------------
8618
8782
  JSON_SERIALIZED_CLASS(RallypointExtendedGroupRestriction)
8619
8783
  /**
@@ -8677,6 +8841,32 @@ namespace AppConfigurationObjects
8677
8841
  IMPLEMENT_JSON_DOCUMENTATION(RallypointServer)
8678
8842
 
8679
8843
  public:
8844
+ typedef enum
8845
+ {
8846
+ sptDefault = 0,
8847
+ sptCertificate = 1,
8848
+ sptCertPublicKey = 2,
8849
+ sptCertSubject = 3,
8850
+ sptCertIssuer = 4,
8851
+ sptCertFingerprint = 5,
8852
+ sptCertSerial = 6,
8853
+ sptSubjectC = 7,
8854
+ sptSubjectST = 8,
8855
+ sptSubjectL = 9,
8856
+ sptSubjectO = 10,
8857
+ sptSubjectOU = 11,
8858
+ sptSubjectCN = 12,
8859
+ sptIssuerC = 13,
8860
+ sptIssuerST = 14,
8861
+ sptIssuerL = 15,
8862
+ sptIssuerO = 16,
8863
+ sptIssuerOU = 17,
8864
+ sptIssuerCN = 18
8865
+ } StreamIdPrivacyType_t;
8866
+
8867
+ /** @brief [Optional, default sptDefault] Modes for stream ID transformation. */
8868
+ StreamIdPrivacyType_t streamIdPrivacyType;
8869
+
8680
8870
  /** @brief [Optional] Settings for the FIPS crypto. */
8681
8871
  FipsCryptoSettings fipsCrypto;
8682
8872
 
@@ -8746,7 +8936,7 @@ namespace AppConfigurationObjects
8746
8936
  /** @brief Internal - not serialized. */
8747
8937
  PeeringConfiguration peeringConfiguration; // NOTE: This is NOT serialized
8748
8938
 
8749
- /** @brief Indicates whether this Rallypoint is part of a core mesh or hangs off the periphery as a leaf node. */
8939
+ /** @brief Indicates whether this Rallypoint is part of a core domain or hangs off the periphery as a leaf node. */
8750
8940
  bool isMeshLeaf;
8751
8941
 
8752
8942
  /** @brief Set to true to forgo DSA signing of messages. Doing so is is a security risk but can be useful on CPU-constrained systems on already-secure environments. */
@@ -8800,7 +8990,7 @@ namespace AppConfigurationObjects
8800
8990
  /** @brief [Optional, Default 0] Sets the queue's normal task bias */
8801
8991
  uint32_t normalTaskQueueBias;
8802
8992
 
8803
- /** @brief If enabled, causes a mesh leaf to reverse-subscribe to a core node upon the core subscribing and a reflector having been setup */
8993
+ /** @brief If enabled, causes a domain leaf to reverse-subscribe to a core node upon the core subscribing and a reflector having been setup */
8804
8994
  bool enableLeafReflectionReverseSubscription;
8805
8995
 
8806
8996
  /** @brief If true, turns off loop detection. */
@@ -8836,15 +9026,24 @@ namespace AppConfigurationObjects
8836
9026
  /** @brief Details for capture of transmitted packets */
8837
9027
  PacketCapturer txCapture;
8838
9028
 
8839
- /** @brief [Optional] This Rallypoint's mesh name */
8840
- std::string meshName;
9029
+ /** @brief [Optional] This Rallypoint's domain name */
9030
+ std::string domainName;
9031
+
9032
+ /** @brief [Optional] List of domains that explicitly MAY connect to this RP */
9033
+ std::vector<std::string> allowedDomains;
8841
9034
 
8842
- /** @brief [Optional] List of additional meshes that can be reached via this RP */
8843
- std::vector<std::string> extraMeshes;
9035
+ /** @brief [Optional] List of domains that explictly MAY NOT connect to this RP */
9036
+ std::vector<std::string> blockedDomains;
9037
+
9038
+ /** @brief [Optional] List of additional domains that can be reached via this RP */
9039
+ std::vector<std::string> extraDomains;
8844
9040
 
8845
9041
  /** @brief [Optional] Low-level tuning */
8846
9042
  TuningSettings tuning;
8847
9043
 
9044
+ /** @brief [Optional] List of additional named identities */
9045
+ std::vector<NamedIdentity> additionalIdentities;
9046
+
8848
9047
  RallypointServer()
8849
9048
  {
8850
9049
  clear();
@@ -8902,12 +9101,16 @@ namespace AppConfigurationObjects
8902
9101
  advertising.clear();
8903
9102
  extendedGroupRestrictions.clear();
8904
9103
  groupRestrictionAccessPolicyType = GroupRestrictionAccessPolicyType_t::graptPermissive;
8905
- ipFamily = IpFamilyType_t::ifIpUnspec;
9104
+ ipFamily = IpFamilyType_t::ifIp4;
8906
9105
  rxCapture.clear();
8907
9106
  txCapture.clear();
8908
- meshName.clear();
8909
- extraMeshes.clear();
9107
+ domainName.clear();
9108
+ allowedDomains.clear();
9109
+ blockedDomains.clear();
9110
+ extraDomains.clear();
8910
9111
  tuning.clear();
9112
+ additionalIdentities.clear();
9113
+ streamIdPrivacyType = StreamIdPrivacyType_t::sptDefault;
8911
9114
  }
8912
9115
  };
8913
9116
 
@@ -8967,9 +9170,13 @@ namespace AppConfigurationObjects
8967
9170
  TOJSON_IMPL(ipFamily),
8968
9171
  TOJSON_IMPL(rxCapture),
8969
9172
  TOJSON_IMPL(txCapture),
8970
- TOJSON_IMPL(meshName),
8971
- TOJSON_IMPL(extraMeshes),
8972
- TOJSON_IMPL(tuning)
9173
+ TOJSON_IMPL(domainName),
9174
+ TOJSON_IMPL(allowedDomains),
9175
+ TOJSON_IMPL(blockedDomains),
9176
+ TOJSON_IMPL(extraDomains),
9177
+ TOJSON_IMPL(tuning),
9178
+ TOJSON_IMPL(additionalIdentities),
9179
+ TOJSON_IMPL(streamIdPrivacyType)
8973
9180
  };
8974
9181
  }
8975
9182
  static void from_json(const nlohmann::json& j, RallypointServer& p)
@@ -9025,12 +9232,16 @@ namespace AppConfigurationObjects
9025
9232
  getOptional<RallypointAdvertisingSettings>("advertising", p.advertising, j);
9026
9233
  getOptional<std::vector<RallypointExtendedGroupRestriction>>("extendedGroupRestrictions", p.extendedGroupRestrictions, j);
9027
9234
  getOptional<GroupRestrictionAccessPolicyType_t>("groupRestrictionAccessPolicyType", p.groupRestrictionAccessPolicyType, j, GroupRestrictionAccessPolicyType_t::graptPermissive);
9028
- getOptional<IpFamilyType_t>("ipFamily", p.ipFamily, j, IpFamilyType_t::ifIpUnspec);
9235
+ getOptional<IpFamilyType_t>("ipFamily", p.ipFamily, j, IpFamilyType_t::ifIp4);
9029
9236
  getOptional<PacketCapturer>("rxCapture", p.rxCapture, j);
9030
9237
  getOptional<PacketCapturer>("txCapture", p.txCapture, j);
9031
- getOptional<std::string>("meshName", p.meshName, j);
9032
- getOptional<std::vector<std::string>>("extraMeshes", p.extraMeshes, j);
9238
+ getOptional<std::string>("domainName", p.domainName, j);
9239
+ getOptional<std::vector<std::string>>("allowedDomains", p.allowedDomains, j);
9240
+ getOptional<std::vector<std::string>>("blockedDomains", p.blockedDomains, j);
9241
+ getOptional<std::vector<std::string>>("extraDomains", p.extraDomains, j);
9033
9242
  getOptional<TuningSettings>("tuning", p.tuning, j);
9243
+ getOptional<std::vector<NamedIdentity>>("additionalIdentities", p.additionalIdentities, j);
9244
+ getOptional<RallypointServer::StreamIdPrivacyType_t>("streamIdPrivacyType", p.streamIdPrivacyType, j, RallypointServer::StreamIdPrivacyType_t::sptDefault);
9034
9245
  }
9035
9246
 
9036
9247
  //-----------------------------------------------------------
@@ -9568,6 +9779,9 @@ namespace AppConfigurationObjects
9568
9779
  /** @brief Array of subject elements */
9569
9780
  std::vector<CertificateSubjectElement> subjectElements;
9570
9781
 
9782
+ /** @brief Array of issuer elements */
9783
+ std::vector<CertificateSubjectElement> issuerElements;
9784
+
9571
9785
  /** @brief PEM version of the certificate */
9572
9786
  std::string certificatePem;
9573
9787
 
@@ -9590,6 +9804,7 @@ namespace AppConfigurationObjects
9590
9804
  serial.clear();
9591
9805
  fingerprint.clear();
9592
9806
  subjectElements.clear();
9807
+ issuerElements.clear();
9593
9808
  certificatePem.clear();
9594
9809
  publicKeyPem.clear();
9595
9810
  }
@@ -9607,6 +9822,7 @@ namespace AppConfigurationObjects
9607
9822
  TOJSON_IMPL(serial),
9608
9823
  TOJSON_IMPL(fingerprint),
9609
9824
  TOJSON_IMPL(subjectElements),
9825
+ TOJSON_IMPL(issuerElements),
9610
9826
  TOJSON_IMPL(certificatePem),
9611
9827
  TOJSON_IMPL(publicKeyPem)
9612
9828
  };
@@ -9625,6 +9841,7 @@ namespace AppConfigurationObjects
9625
9841
  getOptional<std::string>("certificatePem", p.certificatePem, j, EMPTY_STRING);
9626
9842
  getOptional<std::string>("publicKeyPem", p.publicKeyPem, j, EMPTY_STRING);
9627
9843
  getOptional<std::vector<CertificateSubjectElement>>("subjectElements", p.subjectElements, j);
9844
+ getOptional<std::vector<CertificateSubjectElement>>("issuerElements", p.issuerElements, j);
9628
9845
  }
9629
9846
 
9630
9847
 
@@ -9934,6 +10151,12 @@ namespace AppConfigurationObjects
9934
10151
 
9935
10152
  /** @brief TX has ended with a failure */
9936
10153
  txsTxEndedWithFailure = -10,
10154
+
10155
+ /** @brief Attempt to transmit on a bridged group that is not bomMultistream */
10156
+ txsBridgedButNotMultistream = -11,
10157
+
10158
+ /** @brief Transmission was automatically ended because the group became bridged on a non-multistream configuration */
10159
+ txsAutoEndedDueToNonMultistreamBridge = -12
9937
10160
  } TxStatus_t;
9938
10161
 
9939
10162
  /** @brief ID of the group */
@@ -11209,26 +11432,33 @@ namespace AppConfigurationObjects
11209
11432
  IMPLEMENT_JSON_DOCUMENTATION(BridgingServerConfiguration)
11210
11433
 
11211
11434
  public:
11212
- /** @brief Enum describing the modes the briging service runs in. */
11435
+ /** @brief Enum describing the default mode the bridging service runs in. Values of omRaw,
11436
+ * omMultistream, omAnonymousMixedStream all cause the service to force the
11437
+ * groups in a bridge to the appropriate type. A value of omADictatedByGroup prevents
11438
+ * the service from forcing the individual groups' "type" and "bom" values and
11439
+ * instead relies on the individual groups to be correctly defined in the configuration.
11440
+ */
11213
11441
  typedef enum
11214
11442
  {
11215
- /** @brief Raw mode (default) - packet payloads are not accessed or modified and forwarded as raw packets */
11443
+ /** @brief Raw mode (default) - packet payloads are not accessed or modified and forwarded as raw packets. */
11216
11444
  omRaw = 0,
11217
11445
 
11218
- /** @brief Audio payloads are transformed, headers are preserved, multiple parallel output streams are possible/expected */
11219
- omPayloadTransformation = 1,
11446
+ /** @brief Audio payloads are transformed, headers are preserved, multiple parallel output streams are
11447
+ * possible/expected. In this mode all groups must be gtAudio (type = 1).*/
11448
+ omMultistream = 1,
11220
11449
 
11221
- /** @brief Audio payloads are mixed - output is anonymous (i.e. no metadata) if if the target group(s) allow header extensions */
11222
- omAnonymousMixing = 2,
11450
+ /** @brief Audio payloads are mixed - output is anonymous (i.e. no metadata) even if the target group(s)
11451
+ * allow header extensions. In this mode all groups must be gtAudio (type = 1). */
11452
+ omMixedStream = 2,
11223
11453
 
11224
- /** @brief Audio payloads are translated between group-specific languages */
11225
- omLanguageTranslation = 3
11454
+ /** @brief Operation is dictated by the individual groups in the bridge */
11455
+ omADictatedByGroup = 3,
11226
11456
  } OpMode_t;
11227
11457
 
11228
11458
  /** @brief A unqiue identifier for the bridge server */
11229
11459
  std::string id;
11230
11460
 
11231
- /** @brief Specifies the operation mode (see @ref OpMode_t). */
11461
+ /** @brief Specifies the default operation mode (see @ref OpMode_t). */
11232
11462
  OpMode_t mode;
11233
11463
 
11234
11464
  /** @brief Number of seconds between checks to see if the service configuration has been updated. Default is 60.*/
@@ -27,7 +27,7 @@ static const size_t ENGAGE_MAX_CRYPTO_PASSWORD_BYTES = 256;
27
27
 
28
28
  static const int ENGAGE_INVALID_IP_ADDRESS_FAMILY = -1;
29
29
 
30
- static const size_t ENGAGE_MAX_RTP_OUTPUT_QUEUE_PACKETS = 100;
30
+ static const size_t ENGAGE_MAX_OUTPUT_QUEUED_UDP_PACKETS = 1024;
31
31
 
32
32
  static const size_t ENGAGE_MAX_IP_ADDR_SIZE = sizeof(struct sockaddr_in6);
33
33
  static const size_t ENGAGE_MAX_ALIAS_SIZE = 16;
Binary file
Binary file
Binary file
Binary file
Binary file
Binary file
Binary file
Binary file
Binary file
Binary file
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "engage-engine",
3
- "version": "1.250.90900018",
3
+ "version": "1.251.90910020",
4
4
  "description": "Use Engage to communicate with everyone, everywhere, from any device",
5
5
  "scripts": {
6
6
  "test": "echo \"Error: no test specified\" && exit 1"