diff --git a/proto/wizard/wizard_structs.proto b/proto/wizard/wizard_structs.proto index e997a1b8..1ed37aff 100644 --- a/proto/wizard/wizard_structs.proto +++ b/proto/wizard/wizard_structs.proto @@ -37,4 +37,8 @@ message ServiceStateResponse { bool watchdog_ok = 6; string http_url = 7; string nprofile = 8; + string source_name = 9; + string relay_url = 10; + bool automate_liquidity = 11; + bool push_backups_to_nostr = 12; } \ No newline at end of file diff --git a/proto/wizard_service/autogenerated/client.md b/proto/wizard_service/autogenerated/client.md index 69596785..9cc712f7 100644 --- a/proto/wizard_service/autogenerated/client.md +++ b/proto/wizard_service/autogenerated/client.md @@ -24,20 +24,6 @@ The nostr server will send back a message response, and inside the body there wi ## HTTP Methods ### These are the http methods the client implements to communicate with the API -- WizardState - - auth type: __Guest__ - - http method: __get__ - - http route: __/wizard/state__ - - This methods has an __empty__ __request__ body - - output: [StateResponse](#StateResponse) - -- WizardConfig - - auth type: __Guest__ - - http method: __post__ - - http route: __/wizard/config__ - - input: [ConfigRequest](#ConfigRequest) - - This methods has an __empty__ __response__ body - - GetAdminConnectInfo - auth type: __Guest__ - http method: __get__ @@ -52,40 +38,58 @@ The nostr server will send back a message response, and inside the body there wi - This methods has an __empty__ __request__ body - output: [ServiceStateResponse](#ServiceStateResponse) +- WizardConfig + - auth type: __Guest__ + - http method: __post__ + - http route: __/wizard/config__ + - input: [ConfigRequest](#ConfigRequest) + - This methods has an __empty__ __response__ body + +- WizardState + - auth type: __Guest__ + - http method: __get__ + - http route: __/wizard/state__ + - This methods has an __empty__ __request__ body + - output: [StateResponse](#StateResponse) + # INPUTS AND OUTPUTS ## Messages ### The content of requests and response from the methods -### StateResponse - - __config_sent__: _boolean_ - - __admin_linked__: _boolean_ +### AdminConnectInfoResponse + - __connect_info__: _[AdminConnectInfoResponse_connect_info](#AdminConnectInfoResponse_connect_info)_ + - __nprofile__: _string_ ### ConfigRequest - - __source_name__: _string_ - - __relay_url__: _string_ - __automate_liquidity__: _boolean_ - __push_backups_to_nostr__: _boolean_ - -### AdminConnectInfoResponse - - __nprofile__: _string_ - - __connect_info__: _AdminConnectInfoResponse_connect_info_ - -### ServiceStateResponse - - __http_url__: _string_ - - __nprofile__: _string_ - - __provider_name__: _string_ - - __relays__: ARRAY of: _string_ - - __admin_npub__: _string_ - - __relay_connected__: _boolean_ - - __lnd_state__: _[LndState](#LndState)_ - - __watchdog_ok__: _boolean_ + - __relay_url__: _string_ + - __source_name__: _string_ ### Empty + +### ServiceStateResponse + - __admin_npub__: _string_ + - __automate_liquidity__: _boolean_ + - __http_url__: _string_ + - __lnd_state__: _[LndState](#LndState)_ + - __nprofile__: _string_ + - __provider_name__: _string_ + - __push_backups_to_nostr__: _boolean_ + - __relay_connected__: _boolean_ + - __relay_url__: _string_ + - __relays__: ARRAY of: _string_ + - __source_name__: _string_ + - __watchdog_ok__: _boolean_ + +### StateResponse + - __admin_linked__: _boolean_ + - __config_sent__: _boolean_ ## Enums ### The enumerators used in the messages ### LndState - __OFFLINE__ - - __SYNCING__ - __ONLINE__ + - __SYNCING__ diff --git a/proto/wizard_service/autogenerated/debug.txt b/proto/wizard_service/autogenerated/debug.txt index fd00e738..8df23fda 100644 --- a/proto/wizard_service/autogenerated/debug.txt +++ b/proto/wizard_service/autogenerated/debug.txt @@ -1,61 +1,5 @@ ([]*main.Method) (len=4 cap=4) { - (*main.Method)(0xc00022a280)({ - in: (main.MethodMessage) { - name: (string) (len=5) "Empty", - hasZeroFields: (bool) true - }, - name: (string) (len=11) "WizardState", - out: (main.MethodMessage) { - name: (string) (len=13) "StateResponse", - hasZeroFields: (bool) false - }, - opts: (*main.methodOptions)(0xc00009a9c0)({ - authType: (*main.supportedAuth)(0xc0003c9aa0)({ - id: (string) (len=5) "guest", - name: (string) (len=5) "Guest", - context: (map[string]string) { - } - }), - method: (string) (len=3) "get", - route: (main.decodedRoute) { - route: (string) (len=13) "/wizard/state", - params: ([]string) - }, - query: ([]string) , - nostr: (bool) false, - batch: (bool) false - }), - serverStream: (bool) false - }), - (*main.Method)(0xc00022a2d0)({ - in: (main.MethodMessage) { - name: (string) (len=13) "ConfigRequest", - hasZeroFields: (bool) false - }, - name: (string) (len=12) "WizardConfig", - out: (main.MethodMessage) { - name: (string) (len=5) "Empty", - hasZeroFields: (bool) true - }, - opts: (*main.methodOptions)(0xc00009ab40)({ - authType: (*main.supportedAuth)(0xc0003c9b60)({ - id: (string) (len=5) "guest", - name: (string) (len=5) "Guest", - context: (map[string]string) { - } - }), - method: (string) (len=4) "post", - route: (main.decodedRoute) { - route: (string) (len=14) "/wizard/config", - params: ([]string) - }, - query: ([]string) , - nostr: (bool) false, - batch: (bool) false - }), - serverStream: (bool) false - }), - (*main.Method)(0xc00022a640)({ + (*main.Method)(0xc0000d80f0)({ in: (main.MethodMessage) { name: (string) (len=5) "Empty", hasZeroFields: (bool) true @@ -65,12 +9,11 @@ name: (string) (len=24) "AdminConnectInfoResponse", hasZeroFields: (bool) false }, - opts: (*main.methodOptions)(0xc00009acc0)({ - authType: (*main.supportedAuth)(0xc0003c9c20)({ + opts: (*main.methodOptions)(0xc0000cc7e0)({ + authType: (*main.supportedAuth)(0xc0003552c0)({ id: (string) (len=5) "guest", name: (string) (len=5) "Guest", - context: (map[string]string) { - } + context: ([]*main.authContext) }), method: (string) (len=3) "get", route: (main.decodedRoute) { @@ -83,7 +26,7 @@ }), serverStream: (bool) false }), - (*main.Method)(0xc00022a690)({ + (*main.Method)(0xc0000d8140)({ in: (main.MethodMessage) { name: (string) (len=5) "Empty", hasZeroFields: (bool) true @@ -93,12 +36,11 @@ name: (string) (len=20) "ServiceStateResponse", hasZeroFields: (bool) false }, - opts: (*main.methodOptions)(0xc00009ae40)({ - authType: (*main.supportedAuth)(0xc0003c9ce0)({ + opts: (*main.methodOptions)(0xc0000cc960)({ + authType: (*main.supportedAuth)(0xc000355380)({ id: (string) (len=5) "guest", name: (string) (len=5) "Guest", - context: (map[string]string) { - } + context: ([]*main.authContext) }), method: (string) (len=3) "get", route: (main.decodedRoute) { @@ -110,53 +52,101 @@ batch: (bool) false }), serverStream: (bool) false + }), + (*main.Method)(0xc0000d80a0)({ + in: (main.MethodMessage) { + name: (string) (len=13) "ConfigRequest", + hasZeroFields: (bool) false + }, + name: (string) (len=12) "WizardConfig", + out: (main.MethodMessage) { + name: (string) (len=5) "Empty", + hasZeroFields: (bool) true + }, + opts: (*main.methodOptions)(0xc0000cc660)({ + authType: (*main.supportedAuth)(0xc000355200)({ + id: (string) (len=5) "guest", + name: (string) (len=5) "Guest", + context: ([]*main.authContext) + }), + method: (string) (len=4) "post", + route: (main.decodedRoute) { + route: (string) (len=14) "/wizard/config", + params: ([]string) + }, + query: ([]string) , + nostr: (bool) false, + batch: (bool) false + }), + serverStream: (bool) false + }), + (*main.Method)(0xc0000d8050)({ + in: (main.MethodMessage) { + name: (string) (len=5) "Empty", + hasZeroFields: (bool) true + }, + name: (string) (len=11) "WizardState", + out: (main.MethodMessage) { + name: (string) (len=13) "StateResponse", + hasZeroFields: (bool) false + }, + opts: (*main.methodOptions)(0xc0000cc4e0)({ + authType: (*main.supportedAuth)(0xc000355140)({ + id: (string) (len=5) "guest", + name: (string) (len=5) "Guest", + context: ([]*main.authContext) + }), + method: (string) (len=3) "get", + route: (main.decodedRoute) { + route: (string) (len=13) "/wizard/state", + params: ([]string) + }, + query: ([]string) , + nostr: (bool) false, + batch: (bool) false + }), + serverStream: (bool) false }) } ([]*main.Enum) (len=1 cap=1) { - (*main.Enum)(0xc0003c9680)({ + (*main.Enum)(0xc000447d40)({ name: (string) (len=8) "LndState", values: ([]main.EnumValue) (len=3 cap=4) { (main.EnumValue) { number: (int64) 0, name: (string) (len=7) "OFFLINE" }, - (main.EnumValue) { - number: (int64) 1, - name: (string) (len=7) "SYNCING" - }, (main.EnumValue) { number: (int64) 2, name: (string) (len=6) "ONLINE" + }, + (main.EnumValue) { + number: (int64) 1, + name: (string) (len=7) "SYNCING" } } }) } -(map[string]*main.Message) (len=5) { - (string) (len=5) "Empty": (*main.Message)(0xc0003c94a0)({ - fullName: (string) (len=5) "Empty", - name: (string) (len=5) "Empty", - fields: (map[string]*main.Field) { - } - }), - (string) (len=13) "StateResponse": (*main.Message)(0xc0003c9500)({ - fullName: (string) (len=13) "StateResponse", - name: (string) (len=13) "StateResponse", - fields: (map[string]*main.Field) (len=2) { - (string) (len=11) "config_sent": (*main.Field)(0xc0003ee440)({ - name: (string) (len=11) "config_sent", - kind: (string) (len=4) "bool", +([]*main.SortableMessage) (len=5 cap=8) { + (*main.SortableMessage)(0xc0003554c0)({ + fullName: (string) (len=24) "AdminConnectInfoResponse", + name: (string) (len=24) "AdminConnectInfoResponse", + fields: ([]*main.Field) (len=2 cap=2) { + (*main.Field)(0xc0003553c0)({ + name: (string) (len=12) "connect_info", + kind: (string) (len=37) "AdminConnectInfoResponse_connect_info", isMap: (bool) false, isArray: (bool) false, isEnum: (bool) false, - isMessage: (bool) false, + isMessage: (bool) true, isOptional: (bool) false, - oneOfName: (string) "" + oneOfName: (string) (len=12) "connect_info" }), - (string) (len=12) "admin_linked": (*main.Field)(0xc0003ee480)({ - name: (string) (len=12) "admin_linked", - kind: (string) (len=4) "bool", + (*main.Field)(0xc000354b80)({ + name: (string) (len=8) "nprofile", + kind: (string) (len=6) "string", isMap: (bool) false, isArray: (bool) false, isEnum: (bool) false, @@ -166,21 +156,11 @@ }) } }), - (string) (len=13) "ConfigRequest": (*main.Message)(0xc0003c9560)({ + (*main.SortableMessage)(0xc000355480)({ fullName: (string) (len=13) "ConfigRequest", name: (string) (len=13) "ConfigRequest", - fields: (map[string]*main.Field) (len=4) { - (string) (len=9) "relay_url": (*main.Field)(0xc0003ee500)({ - name: (string) (len=9) "relay_url", - kind: (string) (len=6) "string", - isMap: (bool) false, - isArray: (bool) false, - isEnum: (bool) false, - isMessage: (bool) false, - isOptional: (bool) false, - oneOfName: (string) "" - }), - (string) (len=18) "automate_liquidity": (*main.Field)(0xc0003ee540)({ + fields: ([]*main.Field) (len=4 cap=4) { + (*main.Field)(0xc000354b00)({ name: (string) (len=18) "automate_liquidity", kind: (string) (len=4) "bool", isMap: (bool) false, @@ -190,7 +170,7 @@ isOptional: (bool) false, oneOfName: (string) "" }), - (string) (len=21) "push_backups_to_nostr": (*main.Field)(0xc0003ee580)({ + (*main.Field)(0xc000354b40)({ name: (string) (len=21) "push_backups_to_nostr", kind: (string) (len=4) "bool", isMap: (bool) false, @@ -200,7 +180,17 @@ isOptional: (bool) false, oneOfName: (string) "" }), - (string) (len=11) "source_name": (*main.Field)(0xc0003ee4c0)({ + (*main.Field)(0xc000354ac0)({ + name: (string) (len=9) "relay_url", + kind: (string) (len=6) "string", + isMap: (bool) false, + isArray: (bool) false, + isEnum: (bool) false, + isMessage: (bool) false, + isOptional: (bool) false, + oneOfName: (string) "" + }), + (*main.Field)(0xc000354a80)({ name: (string) (len=11) "source_name", kind: (string) (len=6) "string", isMap: (bool) false, @@ -212,37 +202,16 @@ }) } }), - (string) (len=24) "AdminConnectInfoResponse": (*main.Message)(0xc0003c95c0)({ - fullName: (string) (len=24) "AdminConnectInfoResponse", - name: (string) (len=24) "AdminConnectInfoResponse", - fields: (map[string]*main.Field) (len=2) { - (string) (len=8) "nprofile": (*main.Field)(0xc0003ee5c0)({ - name: (string) (len=8) "nprofile", - kind: (string) (len=6) "string", - isMap: (bool) false, - isArray: (bool) false, - isEnum: (bool) false, - isMessage: (bool) false, - isOptional: (bool) false, - oneOfName: (string) "" - }), - (string) (len=37) "AdminConnectInfoResponse_connect_info": (*main.Field)(0xc0003eea80)({ - name: (string) (len=12) "connect_info", - kind: (string) (len=37) "AdminConnectInfoResponse_connect_info", - isMap: (bool) false, - isArray: (bool) false, - isEnum: (bool) false, - isMessage: (bool) false, - isOptional: (bool) false, - oneOfName: (string) (len=12) "connect_info" - }) - } + (*main.SortableMessage)(0xc000355400)({ + fullName: (string) (len=5) "Empty", + name: (string) (len=5) "Empty", + fields: ([]*main.Field) }), - (string) (len=20) "ServiceStateResponse": (*main.Message)(0xc0003c9620)({ + (*main.SortableMessage)(0xc000355540)({ fullName: (string) (len=20) "ServiceStateResponse", name: (string) (len=20) "ServiceStateResponse", - fields: (map[string]*main.Field) (len=8) { - (string) (len=10) "admin_npub": (*main.Field)(0xc0003ee700)({ + fields: ([]*main.Field) (len=12 cap=16) { + (*main.Field)(0xc000354cc0)({ name: (string) (len=10) "admin_npub", kind: (string) (len=6) "string", isMap: (bool) false, @@ -252,8 +221,8 @@ isOptional: (bool) false, oneOfName: (string) "" }), - (string) (len=15) "relay_connected": (*main.Field)(0xc0003ee740)({ - name: (string) (len=15) "relay_connected", + (*main.Field)(0xc000354ec0)({ + name: (string) (len=18) "automate_liquidity", kind: (string) (len=4) "bool", isMap: (bool) false, isArray: (bool) false, @@ -262,27 +231,7 @@ isOptional: (bool) false, oneOfName: (string) "" }), - (string) (len=9) "lnd_state": (*main.Field)(0xc0003ee780)({ - name: (string) (len=9) "lnd_state", - kind: (string) (len=8) "LndState", - isMap: (bool) false, - isArray: (bool) false, - isEnum: (bool) true, - isMessage: (bool) false, - isOptional: (bool) false, - oneOfName: (string) "" - }), - (string) (len=11) "watchdog_ok": (*main.Field)(0xc0003ee7c0)({ - name: (string) (len=11) "watchdog_ok", - kind: (string) (len=4) "bool", - isMap: (bool) false, - isArray: (bool) false, - isEnum: (bool) false, - isMessage: (bool) false, - isOptional: (bool) false, - oneOfName: (string) "" - }), - (string) (len=8) "http_url": (*main.Field)(0xc0003ee800)({ + (*main.Field)(0xc000354dc0)({ name: (string) (len=8) "http_url", kind: (string) (len=6) "string", isMap: (bool) false, @@ -292,7 +241,17 @@ isOptional: (bool) false, oneOfName: (string) "" }), - (string) (len=8) "nprofile": (*main.Field)(0xc0003ee840)({ + (*main.Field)(0xc000354d40)({ + name: (string) (len=9) "lnd_state", + kind: (string) (len=8) "LndState", + isMap: (bool) false, + isArray: (bool) false, + isEnum: (bool) true, + isMessage: (bool) false, + isOptional: (bool) false, + oneOfName: (string) "" + }), + (*main.Field)(0xc000354e00)({ name: (string) (len=8) "nprofile", kind: (string) (len=6) "string", isMap: (bool) false, @@ -302,7 +261,7 @@ isOptional: (bool) false, oneOfName: (string) "" }), - (string) (len=13) "provider_name": (*main.Field)(0xc0003ee680)({ + (*main.Field)(0xc000354c40)({ name: (string) (len=13) "provider_name", kind: (string) (len=6) "string", isMap: (bool) false, @@ -312,7 +271,37 @@ isOptional: (bool) false, oneOfName: (string) "" }), - (string) (len=6) "relays": (*main.Field)(0xc0003ee6c0)({ + (*main.Field)(0xc000354f00)({ + name: (string) (len=21) "push_backups_to_nostr", + kind: (string) (len=4) "bool", + isMap: (bool) false, + isArray: (bool) false, + isEnum: (bool) false, + isMessage: (bool) false, + isOptional: (bool) false, + oneOfName: (string) "" + }), + (*main.Field)(0xc000354d00)({ + name: (string) (len=15) "relay_connected", + kind: (string) (len=4) "bool", + isMap: (bool) false, + isArray: (bool) false, + isEnum: (bool) false, + isMessage: (bool) false, + isOptional: (bool) false, + oneOfName: (string) "" + }), + (*main.Field)(0xc000354e80)({ + name: (string) (len=9) "relay_url", + kind: (string) (len=6) "string", + isMap: (bool) false, + isArray: (bool) false, + isEnum: (bool) false, + isMessage: (bool) false, + isOptional: (bool) false, + oneOfName: (string) "" + }), + (*main.Field)(0xc000354c80)({ name: (string) (len=6) "relays", kind: (string) (len=6) "string", isMap: (bool) false, @@ -321,39 +310,88 @@ isMessage: (bool) false, isOptional: (bool) false, oneOfName: (string) "" + }), + (*main.Field)(0xc000354e40)({ + name: (string) (len=11) "source_name", + kind: (string) (len=6) "string", + isMap: (bool) false, + isArray: (bool) false, + isEnum: (bool) false, + isMessage: (bool) false, + isOptional: (bool) false, + oneOfName: (string) "" + }), + (*main.Field)(0xc000354d80)({ + name: (string) (len=11) "watchdog_ok", + kind: (string) (len=4) "bool", + isMap: (bool) false, + isArray: (bool) false, + isEnum: (bool) false, + isMessage: (bool) false, + isOptional: (bool) false, + oneOfName: (string) "" + }) + } + }), + (*main.SortableMessage)(0xc000355440)({ + fullName: (string) (len=13) "StateResponse", + name: (string) (len=13) "StateResponse", + fields: ([]*main.Field) (len=2 cap=2) { + (*main.Field)(0xc000354a40)({ + name: (string) (len=12) "admin_linked", + kind: (string) (len=4) "bool", + isMap: (bool) false, + isArray: (bool) false, + isEnum: (bool) false, + isMessage: (bool) false, + isOptional: (bool) false, + oneOfName: (string) "" + }), + (*main.Field)(0xc000354a00)({ + name: (string) (len=11) "config_sent", + kind: (string) (len=4) "bool", + isMap: (bool) false, + isArray: (bool) false, + isEnum: (bool) false, + isMessage: (bool) false, + isOptional: (bool) false, + oneOfName: (string) "" }) } }) } -(map[string][]*main.Field) (len=1) { - (string) (len=37) "AdminConnectInfoResponse_connect_info": ([]*main.Field) (len=2 cap=2) { - (*main.Field)(0xc0003ee600)({ - name: (string) (len=11) "admin_token", - kind: (string) (len=6) "string", - isMap: (bool) false, - isArray: (bool) false, - isEnum: (bool) false, - isMessage: (bool) false, - isOptional: (bool) false, - oneOfName: (string) (len=12) "connect_info" - }), - (*main.Field)(0xc0003ee640)({ - name: (string) (len=13) "enrolled_npub", - kind: (string) (len=6) "string", - isMap: (bool) false, - isArray: (bool) false, - isEnum: (bool) false, - isMessage: (bool) false, - isOptional: (bool) false, - oneOfName: (string) (len=12) "connect_info" - }) - } +([]*main.OneOf) (len=1 cap=1) { + (*main.OneOf)(0xc00012b1a0)({ + kind: (string) (len=37) "AdminConnectInfoResponse_connect_info", + fields: ([]*main.Field) (len=2 cap=2) { + (*main.Field)(0xc000354bc0)({ + name: (string) (len=11) "admin_token", + kind: (string) (len=6) "string", + isMap: (bool) false, + isArray: (bool) false, + isEnum: (bool) false, + isMessage: (bool) false, + isOptional: (bool) false, + oneOfName: (string) (len=12) "connect_info" + }), + (*main.Field)(0xc000354c00)({ + name: (string) (len=13) "enrolled_npub", + kind: (string) (len=6) "string", + isMap: (bool) false, + isArray: (bool) false, + isEnum: (bool) false, + isMessage: (bool) false, + isOptional: (bool) false, + oneOfName: (string) (len=12) "connect_info" + }) + } + }) } parsing file: wizard_structs 5 parsing file: wizard_methods 2 --> [{guest Guest map[]}] +-> [{guest Guest []}] ([]interface {}) diff --git a/proto/wizard_service/autogenerated/go/http_client.go b/proto/wizard_service/autogenerated/go/http_client.go new file mode 100644 index 00000000..e087af9a --- /dev/null +++ b/proto/wizard_service/autogenerated/go/http_client.go @@ -0,0 +1,151 @@ +// This file was autogenerated from a .proto file, DO NOT EDIT! + +package lightning_pub + +import ( + "net/url" + "bytes" + "encoding/json" + "fmt" + "io" + "net/http" + "strings" +) + +func doPostRequest(url string, body []byte, auth string) ([]byte, error) { + bodyReader := bytes.NewReader(body) + req, err := http.NewRequest(http.MethodPost, url, bodyReader) + if err != nil { + return nil, err + } + req.Header.Set("authorization", auth) + return doRequest(req) +} + +func doGetRequest(url string, auth string) ([]byte, error) { + req, err := http.NewRequest(http.MethodGet, url, nil) + if err != nil { + return nil, err + } + req.Header.Set("authorization", auth) + return doRequest(req) +} + +func doRequest(req *http.Request) ([]byte, error) { + res, err := http.DefaultClient.Do(req) + if err != nil { + return nil, err + } + + resBody, err := io.ReadAll(res.Body) + if err != nil { + return nil, err + } + return resBody, nil +} + +type ClientParams struct { + BaseURL string + RetrieveGuestAuth func() (string, error) +} +type Client struct { + GetAdminConnectInfo func() (*AdminConnectInfoResponse, error) + GetServiceState func() (*ServiceStateResponse, error) + WizardConfig func(req ConfigRequest) error + WizardState func() (*StateResponse, error) +} + +func NewClient(params ClientParams) *Client { + return &Client{ + GetAdminConnectInfo: func() (*AdminConnectInfoResponse, error) { + auth, err := params.RetrieveGuestAuth() + if err != nil { + return nil, err + } + finalRoute := "/wizard/admin_connect_info" + resBody, err := doGetRequest(params.BaseURL+finalRoute, auth) + result := ResultError{} + err = json.Unmarshal(resBody, &result) + if err != nil { + return nil, err + } + if result.Status == "ERROR" { + return nil, fmt.Errorf(result.Reason) + } + res := AdminConnectInfoResponse{} + err = json.Unmarshal(resBody, &res) + if err != nil { + return nil, err + } + return &res, nil + }, + GetServiceState: func() (*ServiceStateResponse, error) { + auth, err := params.RetrieveGuestAuth() + if err != nil { + return nil, err + } + finalRoute := "/wizard/service_state" + resBody, err := doGetRequest(params.BaseURL+finalRoute, auth) + result := ResultError{} + err = json.Unmarshal(resBody, &result) + if err != nil { + return nil, err + } + if result.Status == "ERROR" { + return nil, fmt.Errorf(result.Reason) + } + res := ServiceStateResponse{} + err = json.Unmarshal(resBody, &res) + if err != nil { + return nil, err + } + return &res, nil + }, + WizardConfig: func(req ConfigRequest) error { + auth, err := params.RetrieveGuestAuth() + if err != nil { + return err + } + finalRoute := "/wizard/config" + body, err := json.Marshal(req) + if err != nil { + return err + } + resBody, err := doPostRequest(params.BaseURL+finalRoute, body, auth) + if err != nil { + return err + } + result := ResultError{} + err = json.Unmarshal(resBody, &result) + if err != nil { + return err + } + if result.Status == "ERROR" { + return fmt.Errorf(result.Reason) + } + return nil + }, + WizardState: func() (*StateResponse, error) { + auth, err := params.RetrieveGuestAuth() + if err != nil { + return nil, err + } + finalRoute := "/wizard/state" + resBody, err := doGetRequest(params.BaseURL+finalRoute, auth) + result := ResultError{} + err = json.Unmarshal(resBody, &result) + if err != nil { + return nil, err + } + if result.Status == "ERROR" { + return nil, fmt.Errorf(result.Reason) + } + res := StateResponse{} + err = json.Unmarshal(resBody, &res) + if err != nil { + return nil, err + } + return &res, nil + }, + } +} diff --git a/proto/wizard_service/autogenerated/go/types.go b/proto/wizard_service/autogenerated/go/types.go new file mode 100644 index 00000000..93ecd50e --- /dev/null +++ b/proto/wizard_service/autogenerated/go/types.go @@ -0,0 +1,60 @@ +// This file was autogenerated from a .proto file, DO NOT EDIT! + +package lightning_pub + +type ResultError struct { + Status string `json:"status"` + Reason string `json:"reason"` +} +type GuestContext struct { +} +type LndState string + +const ( + OFFLINE LndState = "OFFLINE" + ONLINE LndState = "ONLINE" + SYNCING LndState = "SYNCING" +) + +type AdminConnectInfoResponse struct { + Connect_info *AdminConnectInfoResponse_connect_info `json:"connect_info"` + Nprofile string `json:"nprofile"` +} +type ConfigRequest struct { + Automate_liquidity bool `json:"automate_liquidity"` + Push_backups_to_nostr bool `json:"push_backups_to_nostr"` + Relay_url string `json:"relay_url"` + Source_name string `json:"source_name"` +} +type Empty struct { +} +type ServiceStateResponse struct { + Admin_npub string `json:"admin_npub"` + Automate_liquidity bool `json:"automate_liquidity"` + Http_url string `json:"http_url"` + Lnd_state LndState `json:"lnd_state"` + Nprofile string `json:"nprofile"` + Provider_name string `json:"provider_name"` + Push_backups_to_nostr bool `json:"push_backups_to_nostr"` + Relay_connected bool `json:"relay_connected"` + Relay_url string `json:"relay_url"` + Relays []string `json:"relays"` + Source_name string `json:"source_name"` + Watchdog_ok bool `json:"watchdog_ok"` +} +type StateResponse struct { + Admin_linked bool `json:"admin_linked"` + Config_sent bool `json:"config_sent"` +} +type AdminConnectInfoResponse_connect_info_type string + +const ( + ADMIN_TOKEN AdminConnectInfoResponse_connect_info_type = "admin_token" + ENROLLED_NPUB AdminConnectInfoResponse_connect_info_type = "enrolled_npub" +) + +type AdminConnectInfoResponse_connect_info struct { + Type AdminConnectInfoResponse_connect_info_type `json:"type"` + Admin_token *string `json:"admin_token"` + Enrolled_npub *string `json:"enrolled_npub"` +} diff --git a/proto/wizard_service/autogenerated/ts/express_server.ts b/proto/wizard_service/autogenerated/ts/express_server.ts index 7dd26057..3fe9fdbd 100644 --- a/proto/wizard_service/autogenerated/ts/express_server.ts +++ b/proto/wizard_service/autogenerated/ts/express_server.ts @@ -29,47 +29,6 @@ export default (methods: Types.ServerMethods, opts: ServerOptions) => { app.use(json()) app.use(urlencoded({ extended: true })) if (opts.logMethod) app.use((req, _, next) => { console.log(req.method, req.path); if (opts.logBody) console.log(req.body); next() }) - if (!opts.allowNotImplementedMethods && !methods.WizardState) throw new Error('method: WizardState is not implemented') - app.get('/wizard/state', async (req, res) => { - const info: Types.RequestInfo = { rpcName: 'WizardState', batch: false, nostr: false, batchSize: 0} - const stats: Types.RequestStats = { startMs:req.startTimeMs || 0, start:req.startTime || 0n, parse: process.hrtime.bigint(), guard: 0n, validate: 0n, handle: 0n } - let authCtx: Types.AuthContext = {} - try { - if (!methods.WizardState) throw new Error('method: WizardState is not implemented') - const authContext = await opts.GuestAuthGuard(req.headers['authorization']) - authCtx = authContext - stats.guard = process.hrtime.bigint() - stats.validate = stats.guard - const query = req.query - const params = req.params - const response = await methods.WizardState({rpcName:'WizardState', ctx:authContext }) - stats.handle = process.hrtime.bigint() - res.json({status: 'OK', ...response}) - opts.metricsCallback([{ ...info, ...stats, ...authContext }]) - } catch (ex) { const e = ex as any; logErrorAndReturnResponse(e, e.message || e, res, logger, { ...info, ...stats, ...authCtx }, opts.metricsCallback); if (opts.throwErrors) throw e } - }) - if (!opts.allowNotImplementedMethods && !methods.WizardConfig) throw new Error('method: WizardConfig is not implemented') - app.post('/wizard/config', async (req, res) => { - const info: Types.RequestInfo = { rpcName: 'WizardConfig', batch: false, nostr: false, batchSize: 0} - const stats: Types.RequestStats = { startMs:req.startTimeMs || 0, start:req.startTime || 0n, parse: process.hrtime.bigint(), guard: 0n, validate: 0n, handle: 0n } - let authCtx: Types.AuthContext = {} - try { - if (!methods.WizardConfig) throw new Error('method: WizardConfig is not implemented') - const authContext = await opts.GuestAuthGuard(req.headers['authorization']) - authCtx = authContext - stats.guard = process.hrtime.bigint() - const request = req.body - const error = Types.ConfigRequestValidate(request) - stats.validate = process.hrtime.bigint() - if (error !== null) return logErrorAndReturnResponse(error, 'invalid request body', res, logger, { ...info, ...stats, ...authContext }, opts.metricsCallback) - const query = req.query - const params = req.params - await methods.WizardConfig({rpcName:'WizardConfig', ctx:authContext , req: request}) - stats.handle = process.hrtime.bigint() - res.json({status: 'OK'}) - opts.metricsCallback([{ ...info, ...stats, ...authContext }]) - } catch (ex) { const e = ex as any; logErrorAndReturnResponse(e, e.message || e, res, logger, { ...info, ...stats, ...authCtx }, opts.metricsCallback); if (opts.throwErrors) throw e } - }) if (!opts.allowNotImplementedMethods && !methods.GetAdminConnectInfo) throw new Error('method: GetAdminConnectInfo is not implemented') app.get('/wizard/admin_connect_info', async (req, res) => { const info: Types.RequestInfo = { rpcName: 'GetAdminConnectInfo', batch: false, nostr: false, batchSize: 0} @@ -108,6 +67,47 @@ export default (methods: Types.ServerMethods, opts: ServerOptions) => { opts.metricsCallback([{ ...info, ...stats, ...authContext }]) } catch (ex) { const e = ex as any; logErrorAndReturnResponse(e, e.message || e, res, logger, { ...info, ...stats, ...authCtx }, opts.metricsCallback); if (opts.throwErrors) throw e } }) + if (!opts.allowNotImplementedMethods && !methods.WizardConfig) throw new Error('method: WizardConfig is not implemented') + app.post('/wizard/config', async (req, res) => { + const info: Types.RequestInfo = { rpcName: 'WizardConfig', batch: false, nostr: false, batchSize: 0} + const stats: Types.RequestStats = { startMs:req.startTimeMs || 0, start:req.startTime || 0n, parse: process.hrtime.bigint(), guard: 0n, validate: 0n, handle: 0n } + let authCtx: Types.AuthContext = {} + try { + if (!methods.WizardConfig) throw new Error('method: WizardConfig is not implemented') + const authContext = await opts.GuestAuthGuard(req.headers['authorization']) + authCtx = authContext + stats.guard = process.hrtime.bigint() + const request = req.body + const error = Types.ConfigRequestValidate(request) + stats.validate = process.hrtime.bigint() + if (error !== null) return logErrorAndReturnResponse(error, 'invalid request body', res, logger, { ...info, ...stats, ...authContext }, opts.metricsCallback) + const query = req.query + const params = req.params + await methods.WizardConfig({rpcName:'WizardConfig', ctx:authContext , req: request}) + stats.handle = process.hrtime.bigint() + res.json({status: 'OK'}) + opts.metricsCallback([{ ...info, ...stats, ...authContext }]) + } catch (ex) { const e = ex as any; logErrorAndReturnResponse(e, e.message || e, res, logger, { ...info, ...stats, ...authCtx }, opts.metricsCallback); if (opts.throwErrors) throw e } + }) + if (!opts.allowNotImplementedMethods && !methods.WizardState) throw new Error('method: WizardState is not implemented') + app.get('/wizard/state', async (req, res) => { + const info: Types.RequestInfo = { rpcName: 'WizardState', batch: false, nostr: false, batchSize: 0} + const stats: Types.RequestStats = { startMs:req.startTimeMs || 0, start:req.startTime || 0n, parse: process.hrtime.bigint(), guard: 0n, validate: 0n, handle: 0n } + let authCtx: Types.AuthContext = {} + try { + if (!methods.WizardState) throw new Error('method: WizardState is not implemented') + const authContext = await opts.GuestAuthGuard(req.headers['authorization']) + authCtx = authContext + stats.guard = process.hrtime.bigint() + stats.validate = stats.guard + const query = req.query + const params = req.params + const response = await methods.WizardState({rpcName:'WizardState', ctx:authContext }) + stats.handle = process.hrtime.bigint() + res.json({status: 'OK', ...response}) + opts.metricsCallback([{ ...info, ...stats, ...authContext }]) + } catch (ex) { const e = ex as any; logErrorAndReturnResponse(e, e.message || e, res, logger, { ...info, ...stats, ...authCtx }, opts.metricsCallback); if (opts.throwErrors) throw e } + }) if (opts.staticFiles) { app.use(express.static(opts.staticFiles)) app.get('*', function (_, res) { res.sendFile('index.html', { root: opts.staticFiles })}) diff --git a/proto/wizard_service/autogenerated/ts/http_client.ts b/proto/wizard_service/autogenerated/ts/http_client.ts index 8d949b84..d3a9ba95 100644 --- a/proto/wizard_service/autogenerated/ts/http_client.ts +++ b/proto/wizard_service/autogenerated/ts/http_client.ts @@ -12,31 +12,6 @@ export type ClientParams = { checkResult?: true } export default (params: ClientParams) => ({ - WizardState: async (): Promise => { - const auth = await params.retrieveGuestAuth() - if (auth === null) throw new Error('retrieveGuestAuth() returned null') - let finalRoute = '/wizard/state' - const { data } = await axios.get(params.baseUrl + finalRoute, { headers: { 'authorization': auth } }) - if (data.status === 'ERROR' && typeof data.reason === 'string') return data - if (data.status === 'OK') { - const result = data - if(!params.checkResult) return { status: 'OK', ...result } - const error = Types.StateResponseValidate(result) - if (error === null) { return { status: 'OK', ...result } } else return { status: 'ERROR', reason: error.message } - } - return { status: 'ERROR', reason: 'invalid response' } - }, - WizardConfig: async (request: Types.ConfigRequest): Promise => { - const auth = await params.retrieveGuestAuth() - if (auth === null) throw new Error('retrieveGuestAuth() returned null') - let finalRoute = '/wizard/config' - const { data } = await axios.post(params.baseUrl + finalRoute, request, { headers: { 'authorization': auth } }) - if (data.status === 'ERROR' && typeof data.reason === 'string') return data - if (data.status === 'OK') { - return data - } - return { status: 'ERROR', reason: 'invalid response' } - }, GetAdminConnectInfo: async (): Promise => { const auth = await params.retrieveGuestAuth() if (auth === null) throw new Error('retrieveGuestAuth() returned null') @@ -65,4 +40,29 @@ export default (params: ClientParams) => ({ } return { status: 'ERROR', reason: 'invalid response' } }, + WizardConfig: async (request: Types.ConfigRequest): Promise => { + const auth = await params.retrieveGuestAuth() + if (auth === null) throw new Error('retrieveGuestAuth() returned null') + let finalRoute = '/wizard/config' + const { data } = await axios.post(params.baseUrl + finalRoute, request, { headers: { 'authorization': auth } }) + if (data.status === 'ERROR' && typeof data.reason === 'string') return data + if (data.status === 'OK') { + return data + } + return { status: 'ERROR', reason: 'invalid response' } + }, + WizardState: async (): Promise => { + const auth = await params.retrieveGuestAuth() + if (auth === null) throw new Error('retrieveGuestAuth() returned null') + let finalRoute = '/wizard/state' + const { data } = await axios.get(params.baseUrl + finalRoute, { headers: { 'authorization': auth } }) + if (data.status === 'ERROR' && typeof data.reason === 'string') return data + if (data.status === 'OK') { + const result = data + if(!params.checkResult) return { status: 'OK', ...result } + const error = Types.StateResponseValidate(result) + if (error === null) { return { status: 'OK', ...result } } else return { status: 'ERROR', reason: error.message } + } + return { status: 'ERROR', reason: 'invalid response' } + }, }) diff --git a/proto/wizard_service/autogenerated/ts/types.ts b/proto/wizard_service/autogenerated/ts/types.ts index 43927811..948b7b9f 100644 --- a/proto/wizard_service/autogenerated/ts/types.ts +++ b/proto/wizard_service/autogenerated/ts/types.ts @@ -6,33 +6,33 @@ export type RequestStats = { startMs:number, start:bigint, parse: bigint, guard: export type RequestMetric = AuthContext & RequestInfo & RequestStats & { error?: string } export type GuestContext = { } -export type GuestMethodInputs = WizardState_Input | WizardConfig_Input | GetAdminConnectInfo_Input | GetServiceState_Input -export type GuestMethodOutputs = WizardState_Output | WizardConfig_Output | GetAdminConnectInfo_Output | GetServiceState_Output +export type GuestMethodInputs = GetAdminConnectInfo_Input | GetServiceState_Input | WizardConfig_Input | WizardState_Input +export type GuestMethodOutputs = GetAdminConnectInfo_Output | GetServiceState_Output | WizardConfig_Output | WizardState_Output export type AuthContext = GuestContext -export type WizardState_Input = {rpcName:'WizardState'} -export type WizardState_Output = ResultError | ({ status: 'OK' } & StateResponse) - -export type WizardConfig_Input = {rpcName:'WizardConfig', req: ConfigRequest} -export type WizardConfig_Output = ResultError | { status: 'OK' } - export type GetAdminConnectInfo_Input = {rpcName:'GetAdminConnectInfo'} export type GetAdminConnectInfo_Output = ResultError | ({ status: 'OK' } & AdminConnectInfoResponse) export type GetServiceState_Input = {rpcName:'GetServiceState'} export type GetServiceState_Output = ResultError | ({ status: 'OK' } & ServiceStateResponse) +export type WizardConfig_Input = {rpcName:'WizardConfig', req: ConfigRequest} +export type WizardConfig_Output = ResultError | { status: 'OK' } + +export type WizardState_Input = {rpcName:'WizardState'} +export type WizardState_Output = ResultError | ({ status: 'OK' } & StateResponse) + export type ServerMethods = { - WizardState?: (req: WizardState_Input & {ctx: GuestContext }) => Promise - WizardConfig?: (req: WizardConfig_Input & {ctx: GuestContext }) => Promise GetAdminConnectInfo?: (req: GetAdminConnectInfo_Input & {ctx: GuestContext }) => Promise GetServiceState?: (req: GetServiceState_Input & {ctx: GuestContext }) => Promise + WizardConfig?: (req: WizardConfig_Input & {ctx: GuestContext }) => Promise + WizardState?: (req: WizardState_Input & {ctx: GuestContext }) => Promise } export enum LndState { OFFLINE = 'OFFLINE', - SYNCING = 'SYNCING', ONLINE = 'ONLINE', + SYNCING = 'SYNCING', } export const enumCheckLndState = (e?: LndState): boolean => { for (const v in LndState) if (e === v) return true @@ -43,6 +43,63 @@ export type OptionsBaseMessage = { allOptionalsAreSet?: true } +export type AdminConnectInfoResponse = { + connect_info: AdminConnectInfoResponse_connect_info + nprofile: string +} +export const AdminConnectInfoResponseOptionalFields: [] = [] +export type AdminConnectInfoResponseOptions = OptionsBaseMessage & { + checkOptionalsAreSet?: [] + connect_info_Options?: AdminConnectInfoResponse_connect_infoOptions + nprofile_CustomCheck?: (v: string) => boolean +} +export const AdminConnectInfoResponseValidate = (o?: AdminConnectInfoResponse, opts: AdminConnectInfoResponseOptions = {}, path: string = 'AdminConnectInfoResponse::root.'): Error | null => { + if (opts.checkOptionalsAreSet && opts.allOptionalsAreSet) return new Error(path + ': only one of checkOptionalsAreSet or allOptionalNonDefault can be set for each message') + if (typeof o !== 'object' || o === null) return new Error(path + ': object is not an instance of an object or is null') + + const connect_infoErr = AdminConnectInfoResponse_connect_infoValidate(o.connect_info, opts.connect_info_Options, `${path}.connect_info`) + if (connect_infoErr !== null) return connect_infoErr + + + if (typeof o.nprofile !== 'string') return new Error(`${path}.nprofile: is not a string`) + if (opts.nprofile_CustomCheck && !opts.nprofile_CustomCheck(o.nprofile)) return new Error(`${path}.nprofile: custom check failed`) + + return null +} + +export type ConfigRequest = { + automate_liquidity: boolean + push_backups_to_nostr: boolean + relay_url: string + source_name: string +} +export const ConfigRequestOptionalFields: [] = [] +export type ConfigRequestOptions = OptionsBaseMessage & { + checkOptionalsAreSet?: [] + automate_liquidity_CustomCheck?: (v: boolean) => boolean + push_backups_to_nostr_CustomCheck?: (v: boolean) => boolean + relay_url_CustomCheck?: (v: string) => boolean + source_name_CustomCheck?: (v: string) => boolean +} +export const ConfigRequestValidate = (o?: ConfigRequest, opts: ConfigRequestOptions = {}, path: string = 'ConfigRequest::root.'): Error | null => { + if (opts.checkOptionalsAreSet && opts.allOptionalsAreSet) return new Error(path + ': only one of checkOptionalsAreSet or allOptionalNonDefault can be set for each message') + if (typeof o !== 'object' || o === null) return new Error(path + ': object is not an instance of an object or is null') + + if (typeof o.automate_liquidity !== 'boolean') return new Error(`${path}.automate_liquidity: is not a boolean`) + if (opts.automate_liquidity_CustomCheck && !opts.automate_liquidity_CustomCheck(o.automate_liquidity)) return new Error(`${path}.automate_liquidity: custom check failed`) + + if (typeof o.push_backups_to_nostr !== 'boolean') return new Error(`${path}.push_backups_to_nostr: is not a boolean`) + if (opts.push_backups_to_nostr_CustomCheck && !opts.push_backups_to_nostr_CustomCheck(o.push_backups_to_nostr)) return new Error(`${path}.push_backups_to_nostr: custom check failed`) + + if (typeof o.relay_url !== 'string') return new Error(`${path}.relay_url: is not a string`) + if (opts.relay_url_CustomCheck && !opts.relay_url_CustomCheck(o.relay_url)) return new Error(`${path}.relay_url: custom check failed`) + + if (typeof o.source_name !== 'string') return new Error(`${path}.source_name: is not a string`) + if (opts.source_name_CustomCheck && !opts.source_name_CustomCheck(o.source_name)) return new Error(`${path}.source_name: custom check failed`) + + return null +} + export type Empty = { } export const EmptyOptionalFields: [] = [] @@ -56,138 +113,101 @@ export const EmptyValidate = (o?: Empty, opts: EmptyOptions = {}, path: string = return null } -export type StateResponse = { - config_sent: boolean - admin_linked: boolean -} -export const StateResponseOptionalFields: [] = [] -export type StateResponseOptions = OptionsBaseMessage & { - checkOptionalsAreSet?: [] - config_sent_CustomCheck?: (v: boolean) => boolean - admin_linked_CustomCheck?: (v: boolean) => boolean -} -export const StateResponseValidate = (o?: StateResponse, opts: StateResponseOptions = {}, path: string = 'StateResponse::root.'): Error | null => { - if (opts.checkOptionalsAreSet && opts.allOptionalsAreSet) return new Error(path + ': only one of checkOptionalsAreSet or allOptionalNonDefault can be set for each message') - if (typeof o !== 'object' || o === null) return new Error(path + ': object is not an instance of an object or is null') - - if (typeof o.config_sent !== 'boolean') return new Error(`${path}.config_sent: is not a boolean`) - if (opts.config_sent_CustomCheck && !opts.config_sent_CustomCheck(o.config_sent)) return new Error(`${path}.config_sent: custom check failed`) - - if (typeof o.admin_linked !== 'boolean') return new Error(`${path}.admin_linked: is not a boolean`) - if (opts.admin_linked_CustomCheck && !opts.admin_linked_CustomCheck(o.admin_linked)) return new Error(`${path}.admin_linked: custom check failed`) - - return null -} - -export type ConfigRequest = { - source_name: string - relay_url: string - automate_liquidity: boolean - push_backups_to_nostr: boolean -} -export const ConfigRequestOptionalFields: [] = [] -export type ConfigRequestOptions = OptionsBaseMessage & { - checkOptionalsAreSet?: [] - push_backups_to_nostr_CustomCheck?: (v: boolean) => boolean - source_name_CustomCheck?: (v: string) => boolean - relay_url_CustomCheck?: (v: string) => boolean - automate_liquidity_CustomCheck?: (v: boolean) => boolean -} -export const ConfigRequestValidate = (o?: ConfigRequest, opts: ConfigRequestOptions = {}, path: string = 'ConfigRequest::root.'): Error | null => { - if (opts.checkOptionalsAreSet && opts.allOptionalsAreSet) return new Error(path + ': only one of checkOptionalsAreSet or allOptionalNonDefault can be set for each message') - if (typeof o !== 'object' || o === null) return new Error(path + ': object is not an instance of an object or is null') - - if (typeof o.source_name !== 'string') return new Error(`${path}.source_name: is not a string`) - if (opts.source_name_CustomCheck && !opts.source_name_CustomCheck(o.source_name)) return new Error(`${path}.source_name: custom check failed`) - - if (typeof o.relay_url !== 'string') return new Error(`${path}.relay_url: is not a string`) - if (opts.relay_url_CustomCheck && !opts.relay_url_CustomCheck(o.relay_url)) return new Error(`${path}.relay_url: custom check failed`) - - if (typeof o.automate_liquidity !== 'boolean') return new Error(`${path}.automate_liquidity: is not a boolean`) - if (opts.automate_liquidity_CustomCheck && !opts.automate_liquidity_CustomCheck(o.automate_liquidity)) return new Error(`${path}.automate_liquidity: custom check failed`) - - if (typeof o.push_backups_to_nostr !== 'boolean') return new Error(`${path}.push_backups_to_nostr: is not a boolean`) - if (opts.push_backups_to_nostr_CustomCheck && !opts.push_backups_to_nostr_CustomCheck(o.push_backups_to_nostr)) return new Error(`${path}.push_backups_to_nostr: custom check failed`) - - return null -} - -export type AdminConnectInfoResponse = { - nprofile: string - connect_info: AdminConnectInfoResponse_connect_info -} -export const AdminConnectInfoResponseOptionalFields: [] = [] -export type AdminConnectInfoResponseOptions = OptionsBaseMessage & { - checkOptionalsAreSet?: [] - nprofile_CustomCheck?: (v: string) => boolean - connect_info_CustomCheck?: (v: AdminConnectInfoResponse_connect_info) => boolean -} -export const AdminConnectInfoResponseValidate = (o?: AdminConnectInfoResponse, opts: AdminConnectInfoResponseOptions = {}, path: string = 'AdminConnectInfoResponse::root.'): Error | null => { - if (opts.checkOptionalsAreSet && opts.allOptionalsAreSet) return new Error(path + ': only one of checkOptionalsAreSet or allOptionalNonDefault can be set for each message') - if (typeof o !== 'object' || o === null) return new Error(path + ': object is not an instance of an object or is null') - - if (typeof o.nprofile !== 'string') return new Error(`${path}.nprofile: is not a string`) - if (opts.nprofile_CustomCheck && !opts.nprofile_CustomCheck(o.nprofile)) return new Error(`${path}.nprofile: custom check failed`) - - const connect_infoErr = AdminConnectInfoResponse_connect_infoValidate(o.connect_info,{}, `${path}.connect_info`) - if (connect_infoErr !== null) return connect_infoErr - - - return null -} - export type ServiceStateResponse = { + admin_npub: string + automate_liquidity: boolean http_url: string + lnd_state: LndState nprofile: string provider_name: string - relays: string[] - admin_npub: string + push_backups_to_nostr: boolean relay_connected: boolean - lnd_state: LndState + relay_url: string + relays: string[] + source_name: string watchdog_ok: boolean } export const ServiceStateResponseOptionalFields: [] = [] export type ServiceStateResponseOptions = OptionsBaseMessage & { checkOptionalsAreSet?: [] + admin_npub_CustomCheck?: (v: string) => boolean + automate_liquidity_CustomCheck?: (v: boolean) => boolean http_url_CustomCheck?: (v: string) => boolean + lnd_state_CustomCheck?: (v: LndState) => boolean nprofile_CustomCheck?: (v: string) => boolean provider_name_CustomCheck?: (v: string) => boolean - relays_CustomCheck?: (v: string[]) => boolean - admin_npub_CustomCheck?: (v: string) => boolean + push_backups_to_nostr_CustomCheck?: (v: boolean) => boolean relay_connected_CustomCheck?: (v: boolean) => boolean - lnd_state_CustomCheck?: (v: LndState) => boolean + relay_url_CustomCheck?: (v: string) => boolean + relays_CustomCheck?: (v: string[]) => boolean + source_name_CustomCheck?: (v: string) => boolean watchdog_ok_CustomCheck?: (v: boolean) => boolean } export const ServiceStateResponseValidate = (o?: ServiceStateResponse, opts: ServiceStateResponseOptions = {}, path: string = 'ServiceStateResponse::root.'): Error | null => { if (opts.checkOptionalsAreSet && opts.allOptionalsAreSet) return new Error(path + ': only one of checkOptionalsAreSet or allOptionalNonDefault can be set for each message') if (typeof o !== 'object' || o === null) return new Error(path + ': object is not an instance of an object or is null') + if (typeof o.admin_npub !== 'string') return new Error(`${path}.admin_npub: is not a string`) + if (opts.admin_npub_CustomCheck && !opts.admin_npub_CustomCheck(o.admin_npub)) return new Error(`${path}.admin_npub: custom check failed`) + + if (typeof o.automate_liquidity !== 'boolean') return new Error(`${path}.automate_liquidity: is not a boolean`) + if (opts.automate_liquidity_CustomCheck && !opts.automate_liquidity_CustomCheck(o.automate_liquidity)) return new Error(`${path}.automate_liquidity: custom check failed`) + + if (typeof o.http_url !== 'string') return new Error(`${path}.http_url: is not a string`) + if (opts.http_url_CustomCheck && !opts.http_url_CustomCheck(o.http_url)) return new Error(`${path}.http_url: custom check failed`) + + if (!enumCheckLndState(o.lnd_state)) return new Error(`${path}.lnd_state: is not a valid LndState`) + if (opts.lnd_state_CustomCheck && !opts.lnd_state_CustomCheck(o.lnd_state)) return new Error(`${path}.lnd_state: custom check failed`) + + if (typeof o.nprofile !== 'string') return new Error(`${path}.nprofile: is not a string`) + if (opts.nprofile_CustomCheck && !opts.nprofile_CustomCheck(o.nprofile)) return new Error(`${path}.nprofile: custom check failed`) + + if (typeof o.provider_name !== 'string') return new Error(`${path}.provider_name: is not a string`) + if (opts.provider_name_CustomCheck && !opts.provider_name_CustomCheck(o.provider_name)) return new Error(`${path}.provider_name: custom check failed`) + + if (typeof o.push_backups_to_nostr !== 'boolean') return new Error(`${path}.push_backups_to_nostr: is not a boolean`) + if (opts.push_backups_to_nostr_CustomCheck && !opts.push_backups_to_nostr_CustomCheck(o.push_backups_to_nostr)) return new Error(`${path}.push_backups_to_nostr: custom check failed`) + + if (typeof o.relay_connected !== 'boolean') return new Error(`${path}.relay_connected: is not a boolean`) + if (opts.relay_connected_CustomCheck && !opts.relay_connected_CustomCheck(o.relay_connected)) return new Error(`${path}.relay_connected: custom check failed`) + + if (typeof o.relay_url !== 'string') return new Error(`${path}.relay_url: is not a string`) + if (opts.relay_url_CustomCheck && !opts.relay_url_CustomCheck(o.relay_url)) return new Error(`${path}.relay_url: custom check failed`) + if (!Array.isArray(o.relays)) return new Error(`${path}.relays: is not an array`) for (let index = 0; index < o.relays.length; index++) { if (typeof o.relays[index] !== 'string') return new Error(`${path}.relays[${index}]: is not a string`) } if (opts.relays_CustomCheck && !opts.relays_CustomCheck(o.relays)) return new Error(`${path}.relays: custom check failed`) - if (typeof o.admin_npub !== 'string') return new Error(`${path}.admin_npub: is not a string`) - if (opts.admin_npub_CustomCheck && !opts.admin_npub_CustomCheck(o.admin_npub)) return new Error(`${path}.admin_npub: custom check failed`) - - if (typeof o.relay_connected !== 'boolean') return new Error(`${path}.relay_connected: is not a boolean`) - if (opts.relay_connected_CustomCheck && !opts.relay_connected_CustomCheck(o.relay_connected)) return new Error(`${path}.relay_connected: custom check failed`) - - if (!enumCheckLndState(o.lnd_state)) return new Error(`${path}.lnd_state: is not a valid LndState`) - if (opts.lnd_state_CustomCheck && !opts.lnd_state_CustomCheck(o.lnd_state)) return new Error(`${path}.lnd_state: custom check failed`) + if (typeof o.source_name !== 'string') return new Error(`${path}.source_name: is not a string`) + if (opts.source_name_CustomCheck && !opts.source_name_CustomCheck(o.source_name)) return new Error(`${path}.source_name: custom check failed`) if (typeof o.watchdog_ok !== 'boolean') return new Error(`${path}.watchdog_ok: is not a boolean`) if (opts.watchdog_ok_CustomCheck && !opts.watchdog_ok_CustomCheck(o.watchdog_ok)) return new Error(`${path}.watchdog_ok: custom check failed`) - if (typeof o.http_url !== 'string') return new Error(`${path}.http_url: is not a string`) - if (opts.http_url_CustomCheck && !opts.http_url_CustomCheck(o.http_url)) return new Error(`${path}.http_url: custom check failed`) + return null +} - if (typeof o.nprofile !== 'string') return new Error(`${path}.nprofile: is not a string`) - if (opts.nprofile_CustomCheck && !opts.nprofile_CustomCheck(o.nprofile)) return new Error(`${path}.nprofile: custom check failed`) +export type StateResponse = { + admin_linked: boolean + config_sent: boolean +} +export const StateResponseOptionalFields: [] = [] +export type StateResponseOptions = OptionsBaseMessage & { + checkOptionalsAreSet?: [] + admin_linked_CustomCheck?: (v: boolean) => boolean + config_sent_CustomCheck?: (v: boolean) => boolean +} +export const StateResponseValidate = (o?: StateResponse, opts: StateResponseOptions = {}, path: string = 'StateResponse::root.'): Error | null => { + if (opts.checkOptionalsAreSet && opts.allOptionalsAreSet) return new Error(path + ': only one of checkOptionalsAreSet or allOptionalNonDefault can be set for each message') + if (typeof o !== 'object' || o === null) return new Error(path + ': object is not an instance of an object or is null') - if (typeof o.provider_name !== 'string') return new Error(`${path}.provider_name: is not a string`) - if (opts.provider_name_CustomCheck && !opts.provider_name_CustomCheck(o.provider_name)) return new Error(`${path}.provider_name: custom check failed`) + if (typeof o.admin_linked !== 'boolean') return new Error(`${path}.admin_linked: is not a boolean`) + if (opts.admin_linked_CustomCheck && !opts.admin_linked_CustomCheck(o.admin_linked)) return new Error(`${path}.admin_linked: custom check failed`) + + if (typeof o.config_sent !== 'boolean') return new Error(`${path}.config_sent: is not a boolean`) + if (opts.config_sent_CustomCheck && !opts.config_sent_CustomCheck(o.config_sent)) return new Error(`${path}.config_sent: custom check failed`) return null } @@ -196,19 +216,34 @@ export enum AdminConnectInfoResponse_connect_info_type { ADMIN_TOKEN = 'admin_token', ENROLLED_NPUB = 'enrolled_npub', } +export const enumCheckAdminConnectInfoResponse_connect_info_type = (e?: AdminConnectInfoResponse_connect_info_type): boolean => { + for (const v in AdminConnectInfoResponse_connect_info_type) if (e === v) return true + return false +} export type AdminConnectInfoResponse_connect_info = {type:AdminConnectInfoResponse_connect_info_type.ADMIN_TOKEN, admin_token:string}| {type:AdminConnectInfoResponse_connect_info_type.ENROLLED_NPUB, enrolled_npub:string} -export const AdminConnectInfoResponse_connect_infoValidate = (o?: AdminConnectInfoResponse_connect_info, opts = {}, path: string = 'AdminConnectInfoResponse_connect_info::root.'): Error | null => { - if (typeof o !== 'object' || o === null) return new Error(path + ': object is not an instance of an object or is null') - switch (o.type) { - case 'admin_token': - if (typeof o.admin_token !== 'string') return new Error(`${path}.admin_token: is not a string`) - break - case 'enrolled_npub': - if (typeof o.enrolled_npub !== 'string') return new Error(`${path}.enrolled_npub: is not a string`) - break - } - return new Error(path + ': unknown type'+ o.type) +export type AdminConnectInfoResponse_connect_infoOptions = { + admin_token_CustomCheck?: (v: string) => boolean + enrolled_npub_CustomCheck?: (v: string) => boolean +} +export const AdminConnectInfoResponse_connect_infoValidate = (o?: AdminConnectInfoResponse_connect_info, opts:AdminConnectInfoResponse_connect_infoOptions = {}, path: string = 'AdminConnectInfoResponse_connect_info::root.'): Error | null => { + if (typeof o !== 'object' || o === null) return new Error(path + ': object is not an instance of an object or is null') + const stringType: string = o.type + switch (o.type) { + case AdminConnectInfoResponse_connect_info_type.ADMIN_TOKEN: + if (typeof o.admin_token !== 'string') return new Error(`${path}.admin_token: is not a string`) + if (opts.admin_token_CustomCheck && !opts.admin_token_CustomCheck(o.admin_token)) return new Error(`${path}.admin_token: custom check failed`) + + break + case AdminConnectInfoResponse_connect_info_type.ENROLLED_NPUB: + if (typeof o.enrolled_npub !== 'string') return new Error(`${path}.enrolled_npub: is not a string`) + if (opts.enrolled_npub_CustomCheck && !opts.enrolled_npub_CustomCheck(o.enrolled_npub)) return new Error(`${path}.enrolled_npub: custom check failed`) + + break + default: + return new Error(path + ': unknown type '+ stringType) + } + return null } diff --git a/src/services/wizard/index.ts b/src/services/wizard/index.ts index 1ae03a92..415c039f 100644 --- a/src/services/wizard/index.ts +++ b/src/services/wizard/index.ts @@ -50,7 +50,11 @@ export class Wizard { provider_name: appNamesList, relay_connected: false, relays: this.relays, - watchdog_ok: false + watchdog_ok: false, + source_name: this.settings.defaultAppName, + relay_url: this.settings.nostrRelaySettings.relays[0] || '', + automate_liquidity: this.settings.liquiditySettings.liquidityProviderPub !== 'null', + push_backups_to_nostr: this.settings.pushBackupsToNostr, } } WizardState = async (): Promise => { diff --git a/static/backup.html b/static/backup.html index 15f141da..e2660998 100644 --- a/static/backup.html +++ b/static/backup.html @@ -94,6 +94,15 @@