1
1
#![ cfg_attr(
2
- all( not( debug_assertions) , target_os = "windows" ) ,
3
- windows_subsystem = "windows"
2
+ all( not( debug_assertions) , target_os = "windows" ) ,
3
+ windows_subsystem = "windows"
4
4
) ]
5
5
6
6
use std:: sync:: Arc ;
7
7
8
8
use async_graphql:: { Response , Request , Schema } ;
9
9
use futures:: { stream:: StreamExt , future:: Either :: { Left , Right } } ;
10
10
use music_player_graphql:: {
11
- schema:: {
12
- Mutation , Query , Subscription ,
13
- objects:: { player_state:: PlayerState , track:: Track } ,
14
- playback:: PositionMilliseconds ,
15
- } ,
16
- simple_broker:: SimpleBroker ,
17
- MusicPlayerSchema ,
11
+ schema:: {
12
+ Mutation , Query , Subscription ,
13
+ objects:: { player_state:: PlayerState , track:: Track } ,
14
+ playback:: PositionMilliseconds ,
15
+ } ,
16
+ simple_broker:: SimpleBroker ,
17
+ MusicPlayerSchema ,
18
18
} ;
19
19
use music_player_playback:: {
20
- audio_backend:: { self , rodio:: RodioSink } ,
21
- config:: AudioFormat ,
22
- player:: { Player , PlayerEvent } ,
20
+ audio_backend:: { self , rodio:: RodioSink } ,
21
+ config:: AudioFormat ,
22
+ player:: { Player , PlayerEvent } ,
23
23
} ;
24
24
use music_player_tracklist:: Tracklist ;
25
25
use music_player_settings:: { read_settings, Settings } ;
@@ -37,103 +37,103 @@ enum ClientSubscriptionEvent { Unsubscribed }
37
37
38
38
#[ tauri:: command]
39
39
fn execute_graphql_subscription (
40
- request : Request ,
41
- schema : tauri:: State < ' _ , MusicPlayerSchema > ,
42
- app_handle : tauri:: AppHandle
40
+ request : Request ,
41
+ schema : tauri:: State < ' _ , MusicPlayerSchema > ,
42
+ app_handle : tauri:: AppHandle
43
43
) -> Result < Uuid , ( ) > {
44
- let token = Uuid :: new_v4 ( ) ;
45
- let ( client_subscription_tx, client_subscription_rx) = futures:: channel:: mpsc:: unbounded ( ) ;
46
- let graphql_stream = schema. execute_stream ( request) ;
47
- let cloned_handle = app_handle. clone ( ) ;
48
- tokio:: spawn ( async move {
49
- let mut combined_stream = futures:: stream:: select (
50
- graphql_stream. map ( Left ) ,
51
- client_subscription_rx. map ( Right )
52
- ) ;
53
- loop {
54
- match combined_stream. next ( ) . await {
55
- None => { break ; }
56
- Some ( Right ( ClientSubscriptionEvent :: Unsubscribed ) ) => { break ; }
57
- Some ( Left ( data) ) => {
58
- cloned_handle. emit_all (
59
- & format ! ( "subscriptions/{}" , token) ,
60
- // Needs to be serialized first since Response doesn't implement Clone
61
- serde_json:: to_value ( & data) . unwrap ( )
62
- ) . ok ( ) ;
44
+ let token = Uuid :: new_v4 ( ) ;
45
+ let ( client_subscription_tx, client_subscription_rx) = futures:: channel:: mpsc:: unbounded ( ) ;
46
+ let graphql_stream = schema. execute_stream ( request) ;
47
+ let cloned_handle = app_handle. clone ( ) ;
48
+ tokio:: spawn ( async move {
49
+ let mut combined_stream = futures:: stream:: select (
50
+ graphql_stream. map ( Left ) ,
51
+ client_subscription_rx. map ( Right )
52
+ ) ;
53
+ loop {
54
+ match combined_stream. next ( ) . await {
55
+ None => { break ; }
56
+ Some ( Right ( ClientSubscriptionEvent :: Unsubscribed ) ) => { break ; }
57
+ Some ( Left ( data) ) => {
58
+ cloned_handle. emit_all (
59
+ & format ! ( "subscriptions/{}" , token) ,
60
+ // Needs to be serialized first since Response doesn't implement Clone
61
+ serde_json:: to_value ( & data) . unwrap ( )
62
+ ) . ok ( ) ;
63
+ }
64
+ }
63
65
}
64
- }
65
- }
66
- } ) ;
67
- app_handle. once_global ( format ! ( "unsubscribe/{}" , token) , move |_| {
68
- client_subscription_tx. unbounded_send ( ClientSubscriptionEvent :: Unsubscribed ) . ok ( ) ;
69
- } ) ;
70
- Ok ( token)
66
+ } ) ;
67
+ app_handle. once_global ( format ! ( "unsubscribe/{}" , token) , move |_| {
68
+ client_subscription_tx. unbounded_send ( ClientSubscriptionEvent :: Unsubscribed ) . ok ( ) ;
69
+ } ) ;
70
+ Ok ( token)
71
71
}
72
72
73
73
#[ tauri:: command]
74
74
async fn execute_graphql ( request : Request , schema : tauri:: State < ' _ , MusicPlayerSchema > ) -> Result < Response , ( ) > {
75
- Ok ( schema. execute ( request) . await )
75
+ Ok ( schema. execute ( request) . await )
76
76
}
77
77
78
78
#[ tokio:: main]
79
79
async fn main ( ) {
80
- let audio_format = AudioFormat :: default ( ) ;
81
- let backend = audio_backend:: find ( Some ( RodioSink :: NAME . to_string ( ) ) ) . unwrap ( ) ;
82
- let tracklist = Arc :: new ( std:: sync:: Mutex :: new ( Tracklist :: new_empty ( ) ) ) ;
83
- let ( cmd_tx, cmd_rx) = mpsc:: unbounded_channel ( ) ;
84
- let cmd_tx = Arc :: new ( std:: sync:: Mutex :: new ( cmd_tx) ) ;
85
- let cmd_rx = Arc :: new ( std:: sync:: Mutex :: new ( cmd_rx) ) ;
80
+ let audio_format = AudioFormat :: default ( ) ;
81
+ let backend = audio_backend:: find ( Some ( RodioSink :: NAME . to_string ( ) ) ) . unwrap ( ) ;
82
+ let tracklist = Arc :: new ( std:: sync:: Mutex :: new ( Tracklist :: new_empty ( ) ) ) ;
83
+ let ( cmd_tx, cmd_rx) = mpsc:: unbounded_channel ( ) ;
84
+ let cmd_tx = Arc :: new ( std:: sync:: Mutex :: new ( cmd_tx) ) ;
85
+ let cmd_rx = Arc :: new ( std:: sync:: Mutex :: new ( cmd_rx) ) ;
86
86
87
- let ( _, _) = Player :: new (
88
- move || backend ( None , audio_format) ,
89
- move |event| {
90
- match event {
91
- PlayerEvent :: CurrentTrack {
92
- track,
93
- position,
94
- position_ms,
95
- is_playing,
96
- } => {
97
- if let Some ( track) = track. clone ( ) {
98
- SimpleBroker :: publish ( Track :: from ( track) ) ;
99
- SimpleBroker :: publish ( PlayerState {
100
- index : position as u32 ,
101
- position_ms,
102
- is_playing,
103
- } ) ;
104
- }
105
- }
106
- PlayerEvent :: TrackTimePosition { position_ms } => {
107
- SimpleBroker :: publish ( PositionMilliseconds { position_ms } ) ;
108
- }
109
- _ => { }
110
- }
111
- } ,
112
- Arc :: clone ( & cmd_tx) ,
113
- Arc :: clone ( & cmd_rx) ,
114
- tracklist. clone ( ) ,
115
- ) ;
116
- let db = Arc :: new ( Mutex :: new ( Database :: new ( ) . await ) ) ;
117
- let schema: MusicPlayerSchema = Schema :: build (
118
- Query :: default ( ) ,
119
- Mutation :: default ( ) ,
120
- Subscription :: default ( ) ,
121
- )
122
- . data ( db)
123
- . data ( cmd_tx)
124
- . data ( tracklist)
125
- . finish ( ) ;
87
+ let ( _, _) = Player :: new (
88
+ move || backend ( None , audio_format) ,
89
+ move |event| {
90
+ match event {
91
+ PlayerEvent :: CurrentTrack {
92
+ track,
93
+ position,
94
+ position_ms,
95
+ is_playing,
96
+ } => {
97
+ if let Some ( track) = track. clone ( ) {
98
+ SimpleBroker :: publish ( Track :: from ( track) ) ;
99
+ SimpleBroker :: publish ( PlayerState {
100
+ index : position as u32 ,
101
+ position_ms,
102
+ is_playing,
103
+ } ) ;
104
+ }
105
+ }
106
+ PlayerEvent :: TrackTimePosition { position_ms } => {
107
+ SimpleBroker :: publish ( PositionMilliseconds { position_ms } ) ;
108
+ }
109
+ _ => { }
110
+ }
111
+ } ,
112
+ Arc :: clone ( & cmd_tx) ,
113
+ Arc :: clone ( & cmd_rx) ,
114
+ tracklist. clone ( ) ,
115
+ ) ;
116
+ let db = Arc :: new ( Mutex :: new ( Database :: new ( ) . await ) ) ;
117
+ let schema: MusicPlayerSchema = Schema :: build (
118
+ Query :: default ( ) ,
119
+ Mutation :: default ( ) ,
120
+ Subscription :: default ( ) ,
121
+ )
122
+ . data ( db)
123
+ . data ( cmd_tx)
124
+ . data ( tracklist)
125
+ . finish ( ) ;
126
126
127
- let config = read_settings ( ) . unwrap ( ) ;
128
- let settings = config. try_deserialize :: < Settings > ( ) . unwrap ( ) ;
129
- if settings. tauri_enable_graphql_server {
130
- tokio:: spawn ( run_graphql_server ( schema. clone ( ) ) ) ;
131
- }
127
+ let config = read_settings ( ) . unwrap ( ) ;
128
+ let settings = config. try_deserialize :: < Settings > ( ) . unwrap ( ) ;
129
+ if settings. tauri_enable_graphql_server {
130
+ tokio:: spawn ( run_graphql_server ( schema. clone ( ) ) ) ;
131
+ }
132
132
133
- tauri:: async_runtime:: set ( tokio:: runtime:: Handle :: current ( ) ) ;
134
- tauri:: Builder :: default ( )
135
- . manage ( schema)
136
- . invoke_handler ( tauri:: generate_handler![ execute_graphql, execute_graphql_subscription] )
137
- . run ( tauri:: generate_context!( ) )
138
- . expect ( "error while running tauri application" ) ;
133
+ tauri:: async_runtime:: set ( tokio:: runtime:: Handle :: current ( ) ) ;
134
+ tauri:: Builder :: default ( )
135
+ . manage ( schema)
136
+ . invoke_handler ( tauri:: generate_handler![ execute_graphql, execute_graphql_subscription] )
137
+ . run ( tauri:: generate_context!( ) )
138
+ . expect ( "error while running tauri application" ) ;
139
139
}
0 commit comments