Files
crank/apps/ui/js/streaming-form.js
T
2026-04-06 12:04:49 +03:00

128 lines
4.5 KiB
JavaScript

(function() {
function text(id) {
var element = document.getElementById(id);
return element ? String(element.value || '').trim() : '';
}
function number(id) {
var value = text(id);
if (!value) return null;
var parsed = Number(value);
return Number.isFinite(parsed) ? parsed : null;
}
function lines(id) {
var value = text(id);
return value
? value.split('\n').map(function(item) { return item.trim(); }).filter(Boolean)
: [];
}
function checked(id) {
var element = document.getElementById(id);
return !!(element && element.checked);
}
function selectedMode() {
return text('streaming-mode') || 'unary';
}
function serializeStreamingConfig() {
if (selectedMode() === 'unary') {
return null;
}
var config = {
mode: selectedMode(),
transport_behavior: text('streaming-transport-behavior') || 'request_response',
aggregation_mode: text('streaming-aggregation-mode') || 'summary_plus_samples',
window_duration_ms: number('streaming-window-duration-ms'),
poll_interval_ms: number('streaming-poll-interval-ms'),
upstream_timeout_ms: number('streaming-upstream-timeout-ms'),
idle_timeout_ms: number('streaming-idle-timeout-ms'),
max_session_lifetime_ms: number('streaming-session-lifetime-ms'),
max_items: number('streaming-max-items'),
max_bytes: number('streaming-max-bytes'),
max_field_length: number('streaming-max-field-length'),
sampling_rate: number('streaming-sampling-rate'),
items_path: text('streaming-items-path') || null,
summary_path: text('streaming-summary-path') || null,
done_path: text('streaming-done-path') || null,
cursor_path: text('streaming-cursor-path') || null,
status_path: text('streaming-status-path') || null,
redacted_paths: lines('streaming-redacted-paths'),
truncate_item_fields: checked('streaming-truncate-item-fields'),
drop_duplicates: checked('streaming-drop-duplicates'),
tool_family: {},
};
if (config.mode === 'session') {
config.tool_family.start_tool_name = text('streaming-start-tool-name') || null;
config.tool_family.poll_tool_name = text('streaming-poll-tool-name') || null;
config.tool_family.stop_tool_name = text('streaming-stop-tool-name') || null;
} else if (config.mode === 'async_job') {
config.tool_family.start_tool_name = text('streaming-start-tool-name') || null;
config.tool_family.status_tool_name = text('streaming-status-tool-name') || null;
config.tool_family.result_tool_name = text('streaming-result-tool-name') || null;
config.tool_family.cancel_tool_name = text('streaming-cancel-tool-name') || null;
}
return config;
}
function validateStreamingConfig(capabilities) {
var config = serializeStreamingConfig();
if (!config) {
return { valid: true, errors: [] };
}
var errors = [];
var capability = (capabilities || []).find(function(item) {
return item.protocol === window.wizardProtocol;
});
if (capability && Array.isArray(capability.supports_execution_modes)) {
var supported = capability.supports_execution_modes.map(String);
if (supported.indexOf(config.mode) === -1) {
errors.push('Selected execution mode is not supported by the current protocol.');
}
}
if (!config.max_items || config.max_items <= 0) {
errors.push('Max items must be a positive integer.');
}
if (!config.max_bytes || config.max_bytes <= 0) {
errors.push('Max bytes must be a positive integer.');
}
if (config.mode === 'window' && (!config.window_duration_ms || config.window_duration_ms <= 0)) {
errors.push('Window duration must be set for window mode.');
}
if (config.mode === 'session' && (!config.poll_interval_ms || config.poll_interval_ms <= 0)) {
errors.push('Poll interval must be set for session mode.');
}
if (config.mode === 'async_job' && (!config.max_session_lifetime_ms || config.max_session_lifetime_ms <= 0)) {
errors.push('Session lifetime must be set for async job mode.');
}
return {
valid: errors.length === 0,
errors: errors,
config: config,
};
}
window.CrankStreamingForm = {
serializeStreamingConfig: serializeStreamingConfig,
deserializeStreamingConfig: function(streaming) {
if (typeof window.applyStreamingConfig === 'function') {
window.applyStreamingConfig(streaming);
}
},
validateStreamingConfig: validateStreamingConfig,
};
}());