Skip to content

Commit dbd39c1

Browse files
Auto merge of #616 - lennart/CLOUD-155, r=TroyKomodo
feat(video-api): scaffolding This PR adds boilerplate code for the video API service. CLOUD-155 Requested-by: TroyKomodo <[email protected]> Reviewed-by: TroyKomodo <[email protected]>
2 parents 81099f6 + c9f5579 commit dbd39c1

File tree

17 files changed

+378
-0
lines changed

17 files changed

+378
-0
lines changed

Cargo.lock

Lines changed: 22 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

Cargo.toml

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,10 @@ members = [
1111
"cloud/geo-ip",
1212
"cloud/id",
1313
"cloud/proto",
14+
"cloud/video/api",
15+
"cloud/video/api/traits",
1416
"cloud/video/ingest",
17+
"cloud/video/ingest/traits",
1518
"crates/aac",
1619
"crates/amf0",
1720
"crates/av1",

Justfile

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -45,6 +45,8 @@ run bin *args:
4545
bazel run //cloud/email:bin -- {{ args }}
4646
elif [ {{ bin }} == "ingest" ]; then
4747
bazel run //cloud/video/ingest:bin -- {{ args }}
48+
elif [ {{ bin }} == "video-api" ]; then
49+
bazel run //cloud/video/api:bin -- {{ args }}
4850
else
4951
echo "Unknown binary: {{ bin }}"
5052
exit 1

cargo_targets.bzl

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,9 @@ _packages = [
99
"//cloud/email/traits",
1010
"//cloud/geo-ip",
1111
"//cloud/video/ingest",
12+
"//cloud/video/ingest/traits",
13+
"//cloud/video/api",
14+
"//cloud/video/api/traits",
1215
"//cloud/id",
1316
"//cloud/proto",
1417
"//crates/aac",

cloud/video/api/BUILD.bazel

Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,35 @@
1+
load("//misc/utils/rust:manifest.bzl", "cargo_toml")
2+
load("//misc/utils/rust:package.bzl", "scuffle_package")
3+
4+
cargo_toml()
5+
6+
deps = [
7+
"//crates/bootstrap",
8+
"//crates/bootstrap-telemetry",
9+
"//crates/context",
10+
"//crates/settings",
11+
"//crates/signal",
12+
"//cloud/video/api/traits",
13+
]
14+
15+
aliases = {
16+
"//cloud/video/api/traits": "video_api_traits",
17+
}
18+
19+
scuffle_package(
20+
aliases = aliases,
21+
crate_name = "scufflecloud-video-api",
22+
deps = deps,
23+
)
24+
25+
scuffle_package(
26+
name = "bin",
27+
srcs = glob([
28+
"bin/standalone/**/*.rs",
29+
]),
30+
aliases = aliases,
31+
crate_name = "scufflecloud-video-api-standalone",
32+
crate_type = "bin",
33+
readme = False,
34+
deps = deps + [":api"],
35+
)

cloud/video/api/Cargo.toml

Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,37 @@
1+
[package]
2+
name = "scufflecloud-video-api"
3+
version = "0.1.0"
4+
authors = ["Scuffle <[email protected]>"]
5+
edition = "2024"
6+
license = "AGPL-3.0"
7+
publish = false
8+
readme = "README.md"
9+
repository = "https://github.com/scufflecloud/scuffle"
10+
description = "Video API server for scuffle.cloud"
11+
12+
[[bin]]
13+
name = "scufflecloud-video-api-standalone"
14+
path = "bin/standalone/main.rs"
15+
16+
[lints.rust]
17+
unexpected_cfgs = { level = "warn", check-cfg = ['cfg(coverage_nightly)'] }
18+
19+
[dependencies]
20+
anyhow = "1.0.98"
21+
scuffle-bootstrap = { path = "../../../crates/bootstrap" }
22+
scuffle-bootstrap-telemetry = { features = ["opentelemetry-logs", "opentelemetry-traces"], path = "../../../crates/bootstrap-telemetry" }
23+
scuffle-context = { path = "../../../crates/context" }
24+
scuffle-settings = { features = ["all-formats", "bootstrap"], path = "../../../crates/settings" }
25+
scuffle-signal = { features = ["bootstrap"], path = "../../../crates/signal" }
26+
serde = "1.0.219"
27+
serde_derive = "1.0.219"
28+
smart-default = "0.7.1"
29+
tracing = "0.1.41"
30+
tracing-subscriber = { version = "0.3.20", features = ["env-filter"] }
31+
video-api-traits = { path = "./traits", package = "scufflecloud-video-api-traits" }
32+
33+
[package.metadata.sync-readme.badges]
34+
docs-rs = false
35+
crates-io = false
36+
license = true
37+
codecov = true

cloud/video/api/LICENSE.AGPL-3.0

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
../../../LICENSE.AGPL-3.0

cloud/video/api/README.md

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
<!-- dprint-ignore-file -->
2+
<!-- sync-readme title [[ -->
3+
# scufflecloud-video-api
4+
<!-- sync-readme ]] -->
5+
6+
<!-- sync-readme badge [[ -->
7+
![License: AGPL-3.0](https://img.shields.io/badge/license-AGPL--3.0-purple.svg?style=flat-square)
8+
[![Codecov](https://img.shields.io/codecov/c/github/scufflecloud/scuffle.svg?label=codecov&logo=codecov&style=flat-square)](https://app.codecov.io/gh/scufflecloud/scuffle)
9+
<!-- sync-readme ]] -->
10+
11+
---
12+
13+
<!-- sync-readme rustdoc [[ -->
14+
Video API server for <https://scuffle.cloud/>.
15+
16+
### License
17+
18+
This project is licensed under the [AGPL-3.0](./LICENSE.AGPL-3.0).
19+
20+
`SPDX-License-Identifier: AGPL-3.0`
21+
<!-- sync-readme ]] -->
Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
use std::net::SocketAddr;
2+
3+
#[derive(serde_derive::Deserialize, smart_default::SmartDefault, Debug, Clone)]
4+
#[serde(default)]
5+
pub(crate) struct Config {
6+
#[default(env!("CARGO_PKG_NAME").to_string())]
7+
pub service_name: String,
8+
#[default = "info"]
9+
pub level: String,
10+
pub telemetry: Option<TelemetryConfig>,
11+
}
12+
13+
scuffle_settings::bootstrap!(Config);
14+
15+
#[derive(serde_derive::Deserialize, smart_default::SmartDefault, Debug, Clone)]
16+
pub(crate) struct TelemetryConfig {
17+
#[default("[::1]:4317".parse().unwrap())]
18+
pub bind: SocketAddr,
19+
}
Lines changed: 73 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,73 @@
1+
#![cfg_attr(coverage_nightly, feature(coverage_attribute))]
2+
#![cfg_attr(docsrs, feature(doc_auto_cfg))]
3+
// #![deny(missing_docs)]
4+
#![deny(unsafe_code)]
5+
#![deny(unreachable_pub)]
6+
#![deny(clippy::mod_module_files)]
7+
8+
use std::sync::Arc;
9+
10+
use scuffle_bootstrap_telemetry::opentelemetry;
11+
use scuffle_bootstrap_telemetry::opentelemetry_sdk::logs::SdkLoggerProvider;
12+
use scuffle_bootstrap_telemetry::opentelemetry_sdk::trace::SdkTracerProvider;
13+
use tracing_subscriber::Layer;
14+
use tracing_subscriber::layer::SubscriberExt;
15+
use tracing_subscriber::util::SubscriberInitExt;
16+
17+
mod config;
18+
19+
struct Global {
20+
config: config::Config,
21+
open_telemetry: opentelemetry::OpenTelemetry,
22+
}
23+
24+
impl video_api_traits::Global for Global {}
25+
26+
impl scuffle_signal::SignalConfig for Global {}
27+
28+
impl scuffle_bootstrap_telemetry::TelemetryConfig for Global {
29+
fn enabled(&self) -> bool {
30+
self.config.telemetry.is_some()
31+
}
32+
33+
fn bind_address(&self) -> Option<std::net::SocketAddr> {
34+
self.config.telemetry.as_ref().map(|telemetry| telemetry.bind)
35+
}
36+
37+
fn http_server_name(&self) -> &str {
38+
"scufflecloud-video-api-telemetry"
39+
}
40+
41+
fn opentelemetry(&self) -> Option<&opentelemetry::OpenTelemetry> {
42+
Some(&self.open_telemetry)
43+
}
44+
}
45+
46+
impl scuffle_bootstrap::Global for Global {
47+
type Config = config::Config;
48+
49+
async fn init(config: Self::Config) -> anyhow::Result<Arc<Self>> {
50+
tracing_subscriber::registry()
51+
.with(
52+
tracing_subscriber::fmt::layer()
53+
.with_filter(tracing_subscriber::EnvFilter::from_default_env().add_directive(config.level.parse()?)),
54+
)
55+
.init();
56+
57+
let tracer = SdkTracerProvider::default();
58+
opentelemetry::global::set_tracer_provider(tracer.clone());
59+
60+
let logger = SdkLoggerProvider::builder().build();
61+
62+
let open_telemetry = opentelemetry::OpenTelemetry::new().with_traces(tracer).with_logs(logger);
63+
64+
Ok(Arc::new(Self { config, open_telemetry }))
65+
}
66+
}
67+
68+
scuffle_bootstrap::main! {
69+
Global {
70+
scuffle_signal::SignalSvc,
71+
scufflecloud_video_api::services::VideoApiSvc::<Global>::default(),
72+
}
73+
}

0 commit comments

Comments
 (0)