mirror of
https://github.com/asciinema/asciinema.git
synced 2025-12-15 19:28:00 +01:00
Pass stream metadata via stream start endpoint instead of via producer websocket query params
This commit is contained in:
11
src/api.rs
11
src/api.rs
@@ -1,3 +1,4 @@
|
|||||||
|
use std::collections::HashMap;
|
||||||
use std::env;
|
use std::env;
|
||||||
use std::fmt::Debug;
|
use std::fmt::Debug;
|
||||||
|
|
||||||
@@ -28,7 +29,15 @@ pub struct StreamChangeset {
|
|||||||
#[serde(skip_serializing_if = "Option::is_none")]
|
#[serde(skip_serializing_if = "Option::is_none")]
|
||||||
pub live: Option<bool>,
|
pub live: Option<bool>,
|
||||||
#[serde(skip_serializing_if = "Option::is_none")]
|
#[serde(skip_serializing_if = "Option::is_none")]
|
||||||
pub title: Option<Option<u8>>,
|
pub title: Option<Option<String>>,
|
||||||
|
#[serde(skip_serializing_if = "Option::is_none")]
|
||||||
|
pub term_type: Option<Option<String>>,
|
||||||
|
#[serde(skip_serializing_if = "Option::is_none")]
|
||||||
|
pub term_version: Option<Option<String>>,
|
||||||
|
#[serde(skip_serializing_if = "Option::is_none")]
|
||||||
|
pub shell: Option<Option<String>>,
|
||||||
|
#[serde(skip_serializing_if = "Option::is_none")]
|
||||||
|
pub env: Option<Option<HashMap<String, String>>>,
|
||||||
}
|
}
|
||||||
|
|
||||||
#[derive(Debug, Deserialize)]
|
#[derive(Debug, Deserialize)]
|
||||||
|
|||||||
@@ -12,7 +12,7 @@ use tokio_util::sync::CancellationToken;
|
|||||||
use tracing::debug;
|
use tracing::debug;
|
||||||
use tracing::level_filters::LevelFilter;
|
use tracing::level_filters::LevelFilter;
|
||||||
use tracing_subscriber::EnvFilter;
|
use tracing_subscriber::EnvFilter;
|
||||||
use url::{form_urlencoded, Url};
|
use url::Url;
|
||||||
|
|
||||||
use crate::api::{self, StreamChangeset, StreamResponse};
|
use crate::api::{self, StreamChangeset, StreamResponse};
|
||||||
use crate::asciicast::{self, Version};
|
use crate::asciicast::{self, Version};
|
||||||
@@ -330,11 +330,10 @@ impl cli::Session {
|
|||||||
|
|
||||||
let relay = match target {
|
let relay = match target {
|
||||||
RelayTarget::StreamId(id) => {
|
RelayTarget::StreamId(id) => {
|
||||||
let stream = self.start_stream(id, config).await?;
|
let stream = self.start_stream(id, metadata, config).await?;
|
||||||
let ws_producer_url = build_producer_url(&stream.ws_producer_url, metadata)?;
|
|
||||||
|
|
||||||
Relay {
|
Relay {
|
||||||
ws_producer_url,
|
ws_producer_url: stream.ws_producer_url.parse()?,
|
||||||
url: Some(stream.url.parse()?),
|
url: Some(stream.url.parse()?),
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -348,10 +347,25 @@ impl cli::Session {
|
|||||||
Ok(Some(relay))
|
Ok(Some(relay))
|
||||||
}
|
}
|
||||||
|
|
||||||
async fn start_stream(&self, id: &str, config: &Config) -> Result<StreamResponse> {
|
async fn start_stream(
|
||||||
|
&self,
|
||||||
|
id: &str,
|
||||||
|
metadata: &Metadata,
|
||||||
|
config: &Config,
|
||||||
|
) -> Result<StreamResponse> {
|
||||||
|
let env = if metadata.env.is_empty() {
|
||||||
|
Some(None)
|
||||||
|
} else {
|
||||||
|
Some(Some(metadata.env.clone()))
|
||||||
|
};
|
||||||
|
|
||||||
let changeset = StreamChangeset {
|
let changeset = StreamChangeset {
|
||||||
live: Some(true),
|
live: Some(true),
|
||||||
..Default::default()
|
title: metadata.title.clone().map(Some),
|
||||||
|
term_type: Some(metadata.term.type_.clone()),
|
||||||
|
term_version: Some(metadata.term.version.clone()),
|
||||||
|
shell: Some(env::var("SHELL").ok()),
|
||||||
|
env,
|
||||||
};
|
};
|
||||||
|
|
||||||
if id.is_empty() {
|
if id.is_empty() {
|
||||||
@@ -434,41 +448,6 @@ impl Relay {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
fn build_producer_url(url: &str, metadata: &Metadata) -> Result<Url> {
|
|
||||||
let mut url: Url = url.parse()?;
|
|
||||||
let mut params = Vec::new();
|
|
||||||
|
|
||||||
if let Some(type_) = &metadata.term.type_ {
|
|
||||||
params.push(("term[type]".to_string(), type_.clone()));
|
|
||||||
}
|
|
||||||
|
|
||||||
if let Some(version) = &metadata.term.version {
|
|
||||||
params.push(("term[version]".to_string(), version.clone()));
|
|
||||||
}
|
|
||||||
|
|
||||||
if let Ok(shell) = env::var("SHELL") {
|
|
||||||
params.push(("shell".to_string(), shell));
|
|
||||||
}
|
|
||||||
|
|
||||||
if let Some(title) = &metadata.title {
|
|
||||||
params.push(("title".to_string(), title.clone()));
|
|
||||||
}
|
|
||||||
|
|
||||||
for (k, v) in &metadata.env {
|
|
||||||
params.push((format!("env[{k}]"), v.to_string()));
|
|
||||||
}
|
|
||||||
|
|
||||||
let params = params.into_iter().filter(|(_k, v)| !v.is_empty());
|
|
||||||
|
|
||||||
let query = form_urlencoded::Serializer::new(String::new())
|
|
||||||
.extend_pairs(params)
|
|
||||||
.finish();
|
|
||||||
|
|
||||||
url.set_query(Some(&query));
|
|
||||||
|
|
||||||
Ok(url)
|
|
||||||
}
|
|
||||||
|
|
||||||
fn get_key_bindings(config: &config::Recording) -> Result<KeyBindings> {
|
fn get_key_bindings(config: &config::Recording) -> Result<KeyBindings> {
|
||||||
let mut keys = KeyBindings::default();
|
let mut keys = KeyBindings::default();
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user