1
- import { delay , get , IEventSubscriber , PromiseCompletionSource , set } from '../core' ;
1
+ import { delay , get , IEventSubscriber , set } from '../core' ;
2
2
import streamDeckClient from './stream-deck-client' ;
3
3
4
4
export type SettingsEventArgs = {
@@ -11,15 +11,21 @@ export type SettingsEventArgs = {
11
11
* Provides a wrapper around loading, managing, and persisting settings within the Stream Deck.
12
12
*/
13
13
export class Settings < TEventArgs extends SettingsEventArgs > {
14
- private _settings = new PromiseCompletionSource < unknown > ( ) ;
14
+ private readonly _initialization ;
15
+ private _settings : unknown ;
15
16
16
17
/**
17
18
* Initializes a new instance of the settings.
18
19
* @param didReceive The event invoked when the settings are received from the Stream Deck.
19
20
* @param save The delegate responsible for persisting the settings in the Stream Deck.
20
21
*/
21
22
constructor ( private didReceive : IEventSubscriber < TEventArgs > , private save : ( settings : unknown ) => Promise < void > ) {
22
- didReceive . subscribe ( async ( data : TEventArgs ) => this . _settings ?. setResult ( data . payload . settings ) ) ;
23
+ this . _initialization = new Promise < void > ( ( resolve ) => {
24
+ didReceive . subscribe ( ( data ) => {
25
+ this . _settings = data . payload . settings ;
26
+ resolve ( ) ;
27
+ } ) ;
28
+ } ) ;
23
29
}
24
30
25
31
/**
@@ -41,7 +47,10 @@ export class Settings<TEventArgs extends SettingsEventArgs> {
41
47
}
42
48
43
49
// Construct getter and setter.
44
- const getter = async ( ) : Promise < T > => get ( key , await this . _settings . promise ) ;
50
+ const getter = async ( ) : Promise < T > => {
51
+ await this . _initialization ;
52
+ return get ( key , await this . _settings ) ;
53
+ } ;
45
54
const setter = timeout ? delay ( ( value ) => this . set ( key , value , save ) , timeout ) : ( value ?: unknown ) => this . set ( key , value , save ) ;
46
55
47
56
return [ getter , setter ] ;
@@ -54,16 +63,16 @@ export class Settings<TEventArgs extends SettingsEventArgs> {
54
63
* @param save Indicates whether the setting should be persisted to the Stream Deck.
55
64
*/
56
65
private async set ( key : string , value ?: unknown , save : boolean | null = true ) : Promise < void > {
57
- const _settings = await this . _settings . promise ;
66
+ await this . _initialization ;
58
67
59
- const oldValue = get ( key , _settings ) ;
68
+ const oldValue = get ( key , this . _settings ) ;
60
69
if ( oldValue === value ) {
61
70
return ;
62
71
}
63
72
64
- set ( key , _settings , value ) ;
73
+ set ( key , this . _settings , value ) ;
65
74
if ( save ) {
66
- await this . save ( _settings ) ;
75
+ await this . save ( this . _settings ) ;
67
76
}
68
77
}
69
78
}
0 commit comments