Skip to content

Commit 7d60059

Browse files
committed
temp commit
1 parent 78382ac commit 7d60059

46 files changed

Lines changed: 1546 additions & 1171 deletions

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

Cargo.toml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -51,7 +51,7 @@ hound = "3.5.1"
5151
ort = { version = "2.0.0-rc.10", features = ["ndarray"], optional = true }
5252
ort-sys = { version = "2.0.0-rc.10", optional = true }
5353
chrono = "0.4.41"
54-
rsipstack = "0.2.29"
54+
rsipstack = "0.2.31"
5555
#rsipstack = { path = "../rsipstack" }
5656
rsip = "0.4.0"
5757
reqwest = { version = "0.12.15", features = [

src/addons/README.md

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
# rustpbx addons
2+
3+
# builtin addons
4+
- voicemail
5+
- playbook
6+
-

src/addons/mod.rs

Whitespace-only changes.

src/app.rs

Lines changed: 41 additions & 54 deletions
Original file line numberDiff line numberDiff line change
@@ -41,9 +41,8 @@ pub struct AppStateInner {
4141
pub token: CancellationToken,
4242
pub active_calls: Arc<Mutex<HashMap<String, ActiveCallRef>>>,
4343
pub stream_engine: Arc<StreamEngine>,
44-
pub callrecord_sender: tokio::sync::Mutex<Option<CallRecordSender>>,
44+
pub callrecord_sender: Option<CallRecordSender>,
4545
pub routing_state: Arc<RoutingState>,
46-
pub sip_server: Option<SipServer>,
4746
pub total_calls: AtomicU64,
4847
pub total_failed_calls: AtomicU64,
4948
pub uptime: DateTime<Utc>,
@@ -133,7 +132,7 @@ impl AppStateBuilder {
133132
self
134133
}
135134

136-
pub async fn build(self) -> Result<AppState> {
135+
pub async fn build(self) -> Result<(AppState, Option<SipServer>)> {
137136
let config: Arc<Config> = Arc::new(self.config.unwrap_or_default());
138137
let token = self
139138
.cancel_token
@@ -157,57 +156,61 @@ impl AppStateBuilder {
157156
};
158157
let stream_engine = self.stream_engine.unwrap_or_default();
159158

160-
let proxy_builder = match self.proxy_builder {
161-
Some(builder) => Some(builder),
159+
let callrecord_sender = if let Some(sender) = self.callrecord_sender {
160+
Some(sender)
161+
} else {
162+
if let Some(ref callrecord) = config.callrecord {
163+
let mut callrecord_manager = CallRecordManagerBuilder::new()
164+
.with_cancel_token(token.child_token())
165+
.with_config(callrecord.clone())
166+
.build();
167+
let sender = callrecord_manager.sender.clone();
168+
tokio::spawn(async move {
169+
callrecord_manager.serve().await;
170+
});
171+
Some(sender)
172+
} else {
173+
None
174+
}
175+
};
176+
let app_state = Arc::new(AppStateInner {
177+
config: config.clone(),
178+
useragent,
179+
token: token.clone(),
180+
active_calls: Arc::new(Mutex::new(HashMap::new())),
181+
stream_engine,
182+
callrecord_sender: callrecord_sender.clone(),
183+
routing_state: Arc::new(RoutingState::new()),
184+
total_calls: AtomicU64::new(0),
185+
total_failed_calls: AtomicU64::new(0),
186+
uptime: chrono::Utc::now(),
187+
});
188+
189+
let sip_server = match self.proxy_builder {
190+
Some(builder) => builder.build(app_state.clone()).await.ok(),
162191
None => {
163192
if let Some(proxy_config) = config.proxy.clone() {
164193
let proxy_config = Arc::new(proxy_config);
165194
let builder = SipServerBuilder::new(proxy_config)
166195
.with_cancel_token(token.child_token())
167-
.with_callrecord_sender(self.callrecord_sender.clone())
196+
.with_callrecord_sender(callrecord_sender.clone())
168197
.register_module("acl", AclModule::create)
169198
.register_module("auth", AuthModule::create)
170199
.register_module("registrar", RegistrarModule::create)
171200
.register_module("call", CallModule::create);
172-
Some(builder)
201+
builder.build(app_state.clone()).await.ok()
173202
} else {
174203
None
175204
}
176205
}
177206
};
178207

179-
let sip_server = if let Some(proxy_builder) = proxy_builder {
180-
match proxy_builder.build().await {
181-
Ok(server) => Some(server),
182-
Err(e) => {
183-
warn!("Failed to build proxy server: {}", e);
184-
return Err(anyhow::anyhow!("{}", e));
185-
}
186-
}
187-
} else {
188-
None
189-
};
190-
191-
Ok(Arc::new(AppStateInner {
192-
config,
193-
useragent,
194-
token,
195-
active_calls: Arc::new(Mutex::new(HashMap::new())),
196-
stream_engine,
197-
callrecord_sender: Mutex::new(self.callrecord_sender),
198-
routing_state: Arc::new(RoutingState::new()),
199-
sip_server,
200-
total_calls: AtomicU64::new(0),
201-
total_failed_calls: AtomicU64::new(0),
202-
uptime: chrono::Utc::now(),
203-
}))
208+
Ok((app_state, sip_server))
204209
}
205210
}
206211

207-
pub async fn run(state: AppState) -> Result<()> {
208-
let ua = state.useragent.clone();
212+
pub async fn run(state: AppState, sip_server: Option<SipServer>) -> Result<()> {
209213
let token = state.token.clone();
210-
211214
let mut router = create_router(state.clone());
212215
let addr: SocketAddr = state.config.http_addr.parse()?;
213216
let listener = match TcpListener::bind(addr).await {
@@ -218,29 +221,14 @@ pub async fn run(state: AppState) -> Result<()> {
218221
}
219222
};
220223

221-
if let Some(ref callrecord) = state.config.callrecord {
222-
let mut callrecord_sender = state.callrecord_sender.lock().await;
223-
if callrecord_sender.is_none() {
224-
let mut callrecord_manager = CallRecordManagerBuilder::new()
225-
.with_cancel_token(token.child_token())
226-
.with_config(callrecord.clone())
227-
.build();
228-
callrecord_sender.replace(callrecord_manager.sender.clone());
229-
230-
tokio::spawn(async move {
231-
callrecord_manager.serve().await;
232-
});
233-
}
234-
}
235-
236-
if let Some(sip_server) = state.sip_server.clone() {
224+
if let Some(sip_server) = sip_server {
237225
if let Some(ref ws_handler) = sip_server.inner.config.ws_handler {
238226
info!(
239227
"Registering WebSocket handler to sip server: {}",
240228
ws_handler
241229
);
242230
let endpoint_ref = sip_server.inner.endpoint.inner.clone();
243-
let token = sip_server.inner.cancel_token.clone();
231+
let token = token.clone();
244232
router = router.route(
245233
ws_handler,
246234
axum::routing::get(
@@ -278,7 +266,7 @@ pub async fn run(state: AppState) -> Result<()> {
278266
}
279267
}
280268
}
281-
ua_result = ua.serve() => {
269+
ua_result = state.useragent.serve() => {
282270
if let Err(e) = ua_result {
283271
tracing::error!("User agent server error: {}", e);
284272
return Err(anyhow::anyhow!("User agent server error: {}", e));
@@ -288,7 +276,6 @@ pub async fn run(state: AppState) -> Result<()> {
288276
info!("Application shutting down due to cancellation");
289277
}
290278
}
291-
token.cancel();
292279
state.useragent.stop();
293280
Ok(())
294281
}

src/bin/rustpbx.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -81,11 +81,11 @@ async fn main() -> Result<()> {
8181
}
8282

8383
let state_builder = AppStateBuilder::new().config(config);
84-
let state = state_builder.build().await.expect("Failed to build app");
84+
let (state, sip_server) = state_builder.build().await.expect("Failed to build app");
8585

8686
info!("starting rustpbx on {}", state.config.http_addr);
8787
select! {
88-
_ = rustpbx::app::run(state) => {}
88+
_ = rustpbx::app::run(state, sip_server) => {}
8989
_ = tokio::signal::ctrl_c() => {
9090
info!("received CTRL+C, shutting down");
9191
}

0 commit comments

Comments
 (0)