@@ -8,6 +8,7 @@ class TauriMIDIAccess extends EventTarget implements MIDIAccess {
88
99 inputs = new Map < string , TauriMIDIInput > ( ) ;
1010 outputs = new Map < string , TauriMIDIOutput > ( ) ;
11+ ready : Promise < void > ;
1112
1213 onstatechange : ( ( this : MIDIAccess , ev : Event ) => any ) | null = null ;
1314
@@ -30,6 +31,13 @@ class TauriMIDIAccess extends EventTarget implements MIDIAccess {
3031 constructor ( ) {
3132 super ( ) ;
3233
34+ // TODO: This could be `Promise.withResolvers` when it's stable
35+ let resolve : ( value : any ) => void ;
36+ this . ready = new Promise ( ( r , reject ) => {
37+ resolve = r ;
38+ setTimeout ( ( ) => reject ( new Error ( "Failed to initialise WebMIDI" ) ) , 10_000 ) ;
39+ } ) ;
40+
3341 events . stateChange . listen ( ( event : any ) => {
3442 const { inputs, outputs } = event . payload ;
3543
@@ -76,6 +84,7 @@ class TauriMIDIAccess extends EventTarget implements MIDIAccess {
7684 }
7785
7886 if ( dirty ) this . dispatchEvent ( new Event ( "statechange" ) ) ;
87+ resolve ( void 0 ) ;
7988 } ) ;
8089 }
8190}
@@ -150,6 +159,9 @@ class TauriMIDIMessageEvent extends Event implements MIDIMessageEvent {
150159class TauriMIDIInput extends TauriMIDIPort implements MIDIInput {
151160 constructor ( name : string ) {
152161 super ( name , "input" ) ;
162+ this . addEventListener ( "midimessage" , ( cb ) => {
163+ if ( this . onmidimessage ) this . onmidimessage ( cb ) ;
164+ } ) ;
153165 }
154166
155167 private stopListening ?: Promise < UnlistenFn > ;
@@ -177,18 +189,14 @@ class TauriMIDIInput extends TauriMIDIPort implements MIDIInput {
177189 return super . close ( ) ;
178190 }
179191
180- // TODO: Cleanup this stuff
181- // private _onmidimessage: ((this: MIDIInput, ev: Event) => any) | null = null;
192+ private _onmidimessage : ( ( this : MIDIInput , ev : Event ) => any ) | null = null ;
182193
183- // get onmidimessage() {
184- // return this._onmidimessage;
185- // }
194+ get onmidimessage ( ) {
195+ return this . _onmidimessage ;
196+ }
186197
187198 set onmidimessage ( cb : ( ( this : MIDIInput , ev : Event ) => any ) | null ) {
188- // this._onmidimessage = cb;
189-
190- this . addEventListener ( "midimessage" , cb as any ) ;
191-
199+ this . _onmidimessage = cb ;
192200 if ( this . connection !== "open" ) this . open ( ) ;
193201 }
194202}
@@ -213,12 +221,4 @@ class TauriMIDIOutput extends TauriMIDIPort implements MIDIOutput {
213221
214222const access = new TauriMIDIAccess ( ) ;
215223
216- // TODO: We could possible just ensure `access` already has data so this can be done while JS is still loading in the webview
217- // TODO: and then it only every await's the first time.
218- navigator . requestMIDIAccess = ( ) => {
219- // We wait for the next update to ensure we have initialised the inputs and outputs.
220- // This event is emitted regularly by the backend
221- return new Promise ( ( resolve ) => access . addEventListener ( "statechange" , ( ) => resolve ( access ) ) ) ;
222- } ;
223-
224- // navigator.requestMIDIAccess = () => Promise.resolve(access);
224+ navigator . requestMIDIAccess = ( ) => access . ready . then ( ( ) => access ) ;
0 commit comments