jfjoch_broker: Default spot finding settings can be configured via config JSON file
This commit is contained in:
1 parent
66a13eae4e
commit
cd80fd0ed5
15 files changed
+84
-12
No files matched your search
@@ -9,9 +9,11 @@
|
||||
#include "OpenAPIConvert.h"
|
||||
#include "../preview/JFJochTIFF.h"
|
||||
|
||||
JFJochBrokerHttp::JFJochBrokerHttp(const DiffractionExperiment &experiment, std::shared_ptr<Pistache::Rest::Router> &rtr)
|
||||
JFJochBrokerHttp::JFJochBrokerHttp(const DiffractionExperiment &experiment,
|
||||
const SpotFindingSettings& spot_finding_settings,
|
||||
std::shared_ptr<Pistache::Rest::Router> &rtr)
|
||||
: DefaultApi(rtr),
|
||||
state_machine(experiment, services, logger) {
|
||||
state_machine(experiment, services, logger, spot_finding_settings) {
|
||||
Pistache::Rest::Routes::Get(*rtr, "/", Pistache::Rest::Routes::bind(&JFJochBrokerHttp::GetStaticFile, this));
|
||||
Pistache::Rest::Routes::Get(*rtr, "/frontend", Pistache::Rest::Routes::bind(&JFJochBrokerHttp::GetStaticFile, this));
|
||||
Pistache::Rest::Routes::Get(*rtr, "/frontend/*", Pistache::Rest::Routes::bind(&JFJochBrokerHttp::GetStaticFile, this));
|
||||
|
||||
@@ -181,7 +181,10 @@ class JFJochBrokerHttp : public org::openapitools::server::api::DefaultApi {
|
||||
void config_dark_mask_put(const org::openapitools::server::model::Dark_mask_settings &darkMaskSettings,
|
||||
Pistache::Http::ResponseWriter &response) override;
|
||||
public:
|
||||
JFJochBrokerHttp(const DiffractionExperiment& experiment, std::shared_ptr<Pistache::Rest::Router> &rtr);
|
||||
JFJochBrokerHttp(const DiffractionExperiment& experiment,
|
||||
const SpotFindingSettings &spot_finding_settings,
|
||||
std::shared_ptr<Pistache::Rest::Router> &rtr);
|
||||
|
||||
void AddDetectorSetup(const DetectorSetup &setup);
|
||||
JFJochServices& Services();
|
||||
|
||||
|
||||
@@ -235,3 +235,9 @@ void ParseReceiverSettings(const org::openapitools::server::model::Jfjoch_settin
|
||||
service.MetadataSocketSettings(Convert(input.getZeromqMetadata()));
|
||||
}
|
||||
}
|
||||
|
||||
SpotFindingSettings ParseSpotFindingSettings(const org::openapitools::server::model::Jfjoch_settings &input) {
|
||||
if (input.spotFindingIsSet())
|
||||
return Convert(input.getSpotFinding());
|
||||
return SpotFindingSettings();
|
||||
}
|
||||
@@ -21,5 +21,6 @@ std::unique_ptr<ImagePusher> ParseImagePusher(const org::openapitools::server::m
|
||||
|
||||
void ParseAcquisitionDeviceGroup(const org::openapitools::server::model::Jfjoch_settings &input, AcquisitionDeviceGroup &aq_devices);
|
||||
void ParseReceiverSettings(const org::openapitools::server::model::Jfjoch_settings &input, JFJochReceiverService &service);
|
||||
SpotFindingSettings ParseSpotFindingSettings(const org::openapitools::server::model::Jfjoch_settings &input);
|
||||
|
||||
#endif //JUNGFRAUJOCH_JFJOCHBROKERPARSER_H
|
||||
@@ -10,13 +10,14 @@
|
||||
|
||||
JFJochStateMachine::JFJochStateMachine(const DiffractionExperiment& in_experiment,
|
||||
JFJochServices &in_services,
|
||||
Logger &in_logger)
|
||||
Logger &in_logger,
|
||||
const SpotFindingSettings &spot_finding_settings)
|
||||
: logger(in_logger),
|
||||
services(in_services),
|
||||
experiment(in_experiment),
|
||||
pixel_mask(experiment),
|
||||
current_detector_setup(0),
|
||||
data_processing_settings(DiffractionExperiment::DefaultDataProcessingSettings()),
|
||||
data_processing_settings(spot_finding_settings),
|
||||
pixel_mask_statistics({0, 0, 0}),
|
||||
gpu_count(get_gpu_count()) {
|
||||
|
||||
|
||||
@@ -153,7 +153,8 @@ class JFJochStateMachine {
|
||||
public:
|
||||
JFJochStateMachine(const DiffractionExperiment& experiment,
|
||||
JFJochServices &in_services,
|
||||
Logger &logger);
|
||||
Logger &logger,
|
||||
const SpotFindingSettings &spot_finding_settings = SpotFindingSettings());
|
||||
~JFJochStateMachine();
|
||||
|
||||
void Initialize();
|
||||
|
||||
@@ -39,6 +39,7 @@ Jfjoch_settings::Jfjoch_settings()
|
||||
m_Numa_policyIsSet = false;
|
||||
m_Frontend_directory = "";
|
||||
m_SslIsSet = false;
|
||||
m_Spot_findingIsSet = false;
|
||||
m_Zeromq_previewIsSet = false;
|
||||
m_Zeromq_metadataIsSet = false;
|
||||
m_Dark_maskIsSet = false;
|
||||
@@ -139,7 +140,7 @@ bool Jfjoch_settings::validate(std::stringstream& msg, const std::string& pathPr
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
|
||||
return success;
|
||||
}
|
||||
|
||||
@@ -193,6 +194,9 @@ bool Jfjoch_settings::operator==(const Jfjoch_settings& rhs) const
|
||||
|
||||
((!sslIsSet() && !rhs.sslIsSet()) || (sslIsSet() && rhs.sslIsSet() && getSsl() == rhs.getSsl())) &&
|
||||
|
||||
|
||||
((!spotFindingIsSet() && !rhs.spotFindingIsSet()) || (spotFindingIsSet() && rhs.spotFindingIsSet() && getSpotFinding() == rhs.getSpotFinding())) &&
|
||||
|
||||
(getImagePusher() == rhs.getImagePusher())
|
||||
&&
|
||||
|
||||
@@ -244,6 +248,8 @@ void to_json(nlohmann::json& j, const Jfjoch_settings& o)
|
||||
j["frontend_directory"] = o.m_Frontend_directory;
|
||||
if(o.sslIsSet())
|
||||
j["ssl"] = o.m_Ssl;
|
||||
if(o.spotFindingIsSet())
|
||||
j["spot_finding"] = o.m_Spot_finding;
|
||||
j["image_pusher"] = o.m_Image_pusher;
|
||||
if(o.zeromqPreviewIsSet())
|
||||
j["zeromq_preview"] = o.m_Zeromq_preview;
|
||||
@@ -323,6 +329,11 @@ void from_json(const nlohmann::json& j, Jfjoch_settings& o)
|
||||
j.at("ssl").get_to(o.m_Ssl);
|
||||
o.m_SslIsSet = true;
|
||||
}
|
||||
if(j.find("spot_finding") != j.end())
|
||||
{
|
||||
j.at("spot_finding").get_to(o.m_Spot_finding);
|
||||
o.m_Spot_findingIsSet = true;
|
||||
}
|
||||
j.at("image_pusher").get_to(o.m_Image_pusher);
|
||||
if(j.find("zeromq_preview") != j.end())
|
||||
{
|
||||
@@ -579,6 +590,23 @@ void Jfjoch_settings::unsetSsl()
|
||||
{
|
||||
m_SslIsSet = false;
|
||||
}
|
||||
org::openapitools::server::model::Spot_finding_settings Jfjoch_settings::getSpotFinding() const
|
||||
{
|
||||
return m_Spot_finding;
|
||||
}
|
||||
void Jfjoch_settings::setSpotFinding(org::openapitools::server::model::Spot_finding_settings const& value)
|
||||
{
|
||||
m_Spot_finding = value;
|
||||
m_Spot_findingIsSet = true;
|
||||
}
|
||||
bool Jfjoch_settings::spotFindingIsSet() const
|
||||
{
|
||||
return m_Spot_findingIsSet;
|
||||
}
|
||||
void Jfjoch_settings::unsetSpot_finding()
|
||||
{
|
||||
m_Spot_findingIsSet = false;
|
||||
}
|
||||
org::openapitools::server::model::Image_pusher_type Jfjoch_settings::getImagePusher() const
|
||||
{
|
||||
return m_Image_pusher;
|
||||
|
||||
@@ -19,6 +19,7 @@
|
||||
#define Jfjoch_settings_H_
|
||||
|
||||
|
||||
#include "Spot_finding_settings.h"
|
||||
#include "Zeromq_preview_settings.h"
|
||||
#include "Dark_mask_settings.h"
|
||||
#include "Pcie_devices_inner.h"
|
||||
@@ -177,6 +178,13 @@ public:
|
||||
/// <summary>
|
||||
///
|
||||
/// </summary>
|
||||
org::openapitools::server::model::Spot_finding_settings getSpotFinding() const;
|
||||
void setSpotFinding(org::openapitools::server::model::Spot_finding_settings const& value);
|
||||
bool spotFindingIsSet() const;
|
||||
void unsetSpot_finding();
|
||||
/// <summary>
|
||||
///
|
||||
/// </summary>
|
||||
org::openapitools::server::model::Image_pusher_type getImagePusher() const;
|
||||
void setImagePusher(org::openapitools::server::model::Image_pusher_type const& value);
|
||||
/// <summary>
|
||||
@@ -234,6 +242,8 @@ protected:
|
||||
|
||||
org::openapitools::server::model::Jfjoch_settings_ssl m_Ssl;
|
||||
bool m_SslIsSet;
|
||||
org::openapitools::server::model::Spot_finding_settings m_Spot_finding;
|
||||
bool m_Spot_findingIsSet;
|
||||
org::openapitools::server::model::Image_pusher_type m_Image_pusher;
|
||||
|
||||
org::openapitools::server::model::Zeromq_preview_settings m_Zeromq_preview;
|
||||
|
||||
@@ -2142,7 +2142,8 @@ components:
|
||||
type: string
|
||||
minLength: 1
|
||||
example: "server.key"
|
||||
|
||||
spot_finding:
|
||||
$ref: '#/components/schemas/spot_finding_settings'
|
||||
image_pusher:
|
||||
$ref: '#/components/schemas/image_pusher_type'
|
||||
zeromq_preview:
|
||||
|
||||
@@ -96,6 +96,8 @@ int main (int argc, char **argv) {
|
||||
DiffractionExperiment experiment(det_setup[0]);
|
||||
ParseFacilityConfiguration(settings, experiment);
|
||||
|
||||
SpotFindingSettings spot_finding_settings = ParseSpotFindingSettings(settings);
|
||||
|
||||
AcquisitionDeviceGroup aq_devices;
|
||||
ParseAcquisitionDeviceGroup(settings, aq_devices);
|
||||
|
||||
@@ -127,7 +129,7 @@ int main (int argc, char **argv) {
|
||||
std::vector<int> sigs{SIGQUIT, SIGINT, SIGTERM, SIGHUP};
|
||||
setUpUnixSignals(sigs);
|
||||
|
||||
JFJochBrokerHttp broker(experiment, router);
|
||||
JFJochBrokerHttp broker(experiment, spot_finding_settings, router);
|
||||
broker.FrontendDirectory(settings.getFrontendDirectory());
|
||||
|
||||
for (const auto &d: det_setup)
|
||||
|
||||
@@ -1405,7 +1405,7 @@ then image might be replaced in the buffer between calling /images and /image.cb
|
||||
" class="sc-eVqvcJ sc-fszimp kIppRw drqpJr"><p>Test Jungfraujoch system</p>
|
||||
</div><div tabindex="0" role="button"><div class="sc-xKhEK okJpy"><span>http://localhost:5232</span>/version</div></div></div></div></div></div></div></div></div><div class="sc-evkzZa iZqpqg"></div></div></div>
|
||||
<script>
|
||||
const __redoc_state = {"menu":{"activeItemIdx":-1},"spec":{"data":{"openapi":"3.0.3","info":{"title":"Jungfraujoch","description":"API to control Jungfraujoch developed by the Paul Scherrer Institute (Switzerland).\nJungfraujoch is a data acquisition and analysis system for pixel array detectors, primarly PSI JUNGFRAU.\nJungfraujoch uses FPGA boards to acquire data at high data rates.\n\n# License Clarification\n\nWhile this API definition is licensed under GPL-3.0, **the GPL copyleft provisions do not apply**\nwhen this file is used solely to generate OpenAPI clients or when implementing applications that\ninteract with the API. Generated client code and applications using this API definition are not\nsubject to the GPL license requirements and may be distributed under terms of your choosing.\n\nThis exception is similar in spirit to the Linux Kernel's approach to userspace API headers and\nthe GCC Runtime Library Exception. The Linux Kernel developers have explicitly stated that\nuser programs that merely use the kernel interfaces (syscalls, ioctl definitions, etc.) are not\nderivative works of the kernel and are not subject to the terms of the GPL.\n\nThis exception is intended to allow wider use of this API specification without imposing GPL\nrequirements on applications that merely interact with the API, regardless of whether they\ncommunicate through network calls or other mechanisms.\n","version":"1.0.0-rc.115","contact":{"name":"Filip Leonarski (Paul Scherrer Institute)","email":"filip.leonarski@psi.ch"},"license":{"name":"GPL-3.0","url":"https://www.gnu.org/licenses/gpl-3.0.html"}},"servers":[{"url":"http://localhost:5232","description":"Test Jungfraujoch system"}],"components":{"parameters":{"binning":{"in":"query","name":"binning","required":false,"schema":{"type":"integer"},"description":"Binning of frames for the plot (0 = default binning)"},"compression":{"in":"query","name":"compression","required":false,"schema":{"type":"boolean","default":false},"description":"Enable DEFLATE compression of output data."},"experimental_coord":{"in":"query","name":"experimental_coord","required":false,"schema":{"type":"boolean","default":false},"description":"If measurement has goniometer axis defined, plot X-axis will represent rotation angle\nIf measurement has grid scan defined, plot X-axis and Y-axis will represent grid position, Z will be used as the final value\nFor still measurement the number is ignored\n"},"azint_unit":{"in":"query","name":"azint_unit","required":false,"schema":{"type":"string","enum":["Q_recipA","d_A","two_theta_deg"],"default":"Q_recipA"},"description":"Unit used for azim int.\n"},"fill_value":{"in":"query","name":"fill","required":false,"schema":{"type":"number","format":"float"},"description":"Fill value for elements that were missed during data collection\n"},"plot_type":{"in":"query","name":"type","required":true,"description":"Type of requested plot","schema":{"type":"string","enum":["bkg_estimate","azint","azint_1d","spot_count","spot_count_low_res","spot_count_indexed","spot_count_ice","indexing_rate","indexing_time","indexing_unit_cell_length","indexing_unit_cell_angle","profile_radius","b_factor","error_pixels","saturated_pixels","image_collection_efficiency","receiver_delay","receiver_free_send_buf","strong_pixels","roi_sum","roi_mean","roi_max_count","roi_pixels","roi_weighted_x","roi_weighted_y","packets_received","max_pixel_value","resolution_estimate","pixel_sum","processing_time","beam_center_x","beam_center_y"]}},"roi":{"in":"query","name":"roi","required":false,"schema":{"type":"string","minLength":1},"description":"Name of ROI for which plot is requested"},"image_id":{"in":"query","name":"id","required":false,"schema":{"type":"integer","format":"int64","default":-1,"minimum":-2},"description":"Image ID in the image buffer. Special values: -1 - last image in the buffer, -2: last indexed image in the buffer"},"saturation":{"in":"query","name":"saturation","required":false,"schema":{"type":"number","format":"float","minimum":-32767,"maximum":32767},"description":"Saturation value to set contrast in the preview image; if not provided, then autocontrast procedure is used"},"background":{"in":"query","name":"background","required":false,"schema":{"type":"number","format":"float","default":0,"minimum":-32767,"maximum":32767},"description":"Background value to set contrast in the preview image"},"show_spots":{"in":"query","name":"show_spots","schema":{"type":"boolean","default":true},"description":"Show spot finding results on the image"},"show_beam_center":{"in":"query","name":"show_beam_center","schema":{"type":"boolean","default":true},"description":"Show beam center on the image"},"show_roi":{"in":"query","name":"show_roi","schema":{"type":"boolean","default":false},"description":"Show ROI areas on the image"},"jpeg_quality":{"in":"query","name":"jpeg_quality","description":"Quality of JPEG image (100 - highest; 0 - lowest)","schema":{"type":"integer","format":Line truncated
|
||||
const __redoc_state = {"menu":{"activeItemIdx":-1},"spec":{"data":{"openapi":"3.0.3","info":{"title":"Jungfraujoch","description":"API to control Jungfraujoch developed by the Paul Scherrer Institute (Switzerland).\nJungfraujoch is a data acquisition and analysis system for pixel array detectors, primarly PSI JUNGFRAU.\nJungfraujoch uses FPGA boards to acquire data at high data rates.\n\n# License Clarification\n\nWhile this API definition is licensed under GPL-3.0, **the GPL copyleft provisions do not apply**\nwhen this file is used solely to generate OpenAPI clients or when implementing applications that\ninteract with the API. Generated client code and applications using this API definition are not\nsubject to the GPL license requirements and may be distributed under terms of your choosing.\n\nThis exception is similar in spirit to the Linux Kernel's approach to userspace API headers and\nthe GCC Runtime Library Exception. The Linux Kernel developers have explicitly stated that\nuser programs that merely use the kernel interfaces (syscalls, ioctl definitions, etc.) are not\nderivative works of the kernel and are not subject to the terms of the GPL.\n\nThis exception is intended to allow wider use of this API specification without imposing GPL\nrequirements on applications that merely interact with the API, regardless of whether they\ncommunicate through network calls or other mechanisms.\n","version":"1.0.0-rc.115","contact":{"name":"Filip Leonarski (Paul Scherrer Institute)","email":"filip.leonarski@psi.ch"},"license":{"name":"GPL-3.0","url":"https://www.gnu.org/licenses/gpl-3.0.html"}},"servers":[{"url":"http://localhost:5232","description":"Test Jungfraujoch system"}],"components":{"parameters":{"binning":{"in":"query","name":"binning","required":false,"schema":{"type":"integer"},"description":"Binning of frames for the plot (0 = default binning)"},"compression":{"in":"query","name":"compression","required":false,"schema":{"type":"boolean","default":false},"description":"Enable DEFLATE compression of output data."},"experimental_coord":{"in":"query","name":"experimental_coord","required":false,"schema":{"type":"boolean","default":false},"description":"If measurement has goniometer axis defined, plot X-axis will represent rotation angle\nIf measurement has grid scan defined, plot X-axis and Y-axis will represent grid position, Z will be used as the final value\nFor still measurement the number is ignored\n"},"azint_unit":{"in":"query","name":"azint_unit","required":false,"schema":{"type":"string","enum":["Q_recipA","d_A","two_theta_deg"],"default":"Q_recipA"},"description":"Unit used for azim int.\n"},"fill_value":{"in":"query","name":"fill","required":false,"schema":{"type":"number","format":"float"},"description":"Fill value for elements that were missed during data collection\n"},"plot_type":{"in":"query","name":"type","required":true,"description":"Type of requested plot","schema":{"type":"string","enum":["bkg_estimate","azint","azint_1d","spot_count","spot_count_low_res","spot_count_indexed","spot_count_ice","indexing_rate","indexing_time","indexing_unit_cell_length","indexing_unit_cell_angle","profile_radius","b_factor","error_pixels","saturated_pixels","image_collection_efficiency","receiver_delay","receiver_free_send_buf","strong_pixels","roi_sum","roi_mean","roi_max_count","roi_pixels","roi_weighted_x","roi_weighted_y","packets_received","max_pixel_value","resolution_estimate","pixel_sum","processing_time","beam_center_x","beam_center_y"]}},"roi":{"in":"query","name":"roi","required":false,"schema":{"type":"string","minLength":1},"description":"Name of ROI for which plot is requested"},"image_id":{"in":"query","name":"id","required":false,"schema":{"type":"integer","format":"int64","default":-1,"minimum":-2},"description":"Image ID in the image buffer. Special values: -1 - last image in the buffer, -2: last indexed image in the buffer"},"saturation":{"in":"query","name":"saturation","required":false,"schema":{"type":"number","format":"float","minimum":-32767,"maximum":32767},"description":"Saturation value to set contrast in the preview image; if not provided, then autocontrast procedure is used"},"background":{"in":"query","name":"background","required":false,"schema":{"type":"number","format":"float","default":0,"minimum":-32767,"maximum":32767},"description":"Background value to set contrast in the preview image"},"show_spots":{"in":"query","name":"show_spots","schema":{"type":"boolean","default":true},"description":"Show spot finding results on the image"},"show_beam_center":{"in":"query","name":"show_beam_center","schema":{"type":"boolean","default":true},"description":"Show beam center on the image"},"show_roi":{"in":"query","name":"show_roi","schema":{"type":"boolean","default":false},"description":"Show ROI areas on the image"},"jpeg_quality":{"in":"query","name":"jpeg_quality","description":"Quality of JPEG image (100 - highest; 0 - lowest)","schema":{"type":"integer","format":Line truncated
|
||||
|
||||
var container = document.getElementById('redoc');
|
||||
Redoc.hydrate(__redoc_state, container);
|
||||
|
||||
@@ -21,6 +21,7 @@ Name | Type | Description | Notes
|
||||
**numa_policy** | **str** | NUMA policy to bind CPUs | [optional]
|
||||
**frontend_directory** | **str** | Location of built JavaScript web frontend |
|
||||
**ssl** | [**JfjochSettingsSsl**](JfjochSettingsSsl.md) | | [optional]
|
||||
**spot_finding** | [**SpotFindingSettings**](SpotFindingSettings.md) | | [optional]
|
||||
**image_pusher** | [**ImagePusherType**](ImagePusherType.md) | | [default to ImagePusherType.NONE]
|
||||
**zeromq_preview** | [**ZeromqPreviewSettings**](ZeromqPreviewSettings.md) | | [optional]
|
||||
**zeromq_metadata** | [**ZeromqMetadataSettings**](ZeromqMetadataSettings.md) | | [optional]
|
||||
|
||||
@@ -11,6 +11,20 @@
|
||||
"max_frames_with_signal":20,
|
||||
"number_of_frames":500
|
||||
},
|
||||
"spot_finding": {
|
||||
"enable":true,
|
||||
"high_res_gap_Q_recipA":1.5,
|
||||
"high_resolution_limit":2.0,
|
||||
"high_resolution_limit_for_spot_count_low_res":5.0,
|
||||
"ice_ring_width_q_recipA":0.02,
|
||||
"signal_to_noise_threshold":4.0,
|
||||
"photon_count_threshold":10,
|
||||
"low_resolution_limit":50.0,
|
||||
"max_pix_per_spot":50,
|
||||
"min_pix_per_spot":2,
|
||||
"indexing":true,
|
||||
"quick_integration":true
|
||||
},
|
||||
"detector": [
|
||||
{
|
||||
"description": "JUNGFRAU 4M",
|
||||
|
||||
Generated
+2
-2
@@ -1,12 +1,12 @@
|
||||
{
|
||||
"name": "jungfraujoch-frontend",
|
||||
"version": "1.0.0-rc.114",
|
||||
"version": "1.0.0-rc.115",
|
||||
"lockfileVersion": 3,
|
||||
"requires": true,
|
||||
"packages": {
|
||||
"": {
|
||||
"name": "jungfraujoch-frontend",
|
||||
"version": "1.0.0-rc.114",
|
||||
"version": "1.0.0-rc.115",
|
||||
"license": "GPL-3.0",
|
||||
"dependencies": {
|
||||
"@emotion/react": "^11.10.4",
|
||||
|
||||
@@ -13,6 +13,7 @@ import type { image_pusher_type } from './image_pusher_type';
|
||||
import type { indexing_settings } from './indexing_settings';
|
||||
import type { instrument_metadata } from './instrument_metadata';
|
||||
import type { pcie_devices } from './pcie_devices';
|
||||
import type { spot_finding_settings } from './spot_finding_settings';
|
||||
import type { zeromq_metadata_settings } from './zeromq_metadata_settings';
|
||||
import type { zeromq_preview_settings } from './zeromq_preview_settings';
|
||||
import type { zeromq_settings } from './zeromq_settings';
|
||||
@@ -56,6 +57,7 @@ export type jfjoch_settings = {
|
||||
certificate: string;
|
||||
key: string;
|
||||
};
|
||||
spot_finding?: spot_finding_settings;
|
||||
image_pusher: image_pusher_type;
|
||||
zeromq_preview?: zeromq_preview_settings;
|
||||
zeromq_metadata?: zeromq_metadata_settings;
|
||||
|
||||
Reference in new issue
Block a user