Skip to main content

core_api/
external_rpc.rs

1use serde::{Deserialize, Serialize};
2use serde_json::Value;
3
4use crate::{
5    AuthRequest, AuthenticatedSession, ServiceCoreEffect, ServiceCoreInput, ServiceCoreOutput,
6};
7use std::collections::HashMap;
8
9pub const EXTERNAL_CORE_PROTOCOL_VERSION: u32 = 4;
10
11#[derive(Debug, Clone, Serialize, Deserialize)]
12pub struct ExternalCoreRequest {
13    pub id: String,
14    pub method: ExternalCoreMethod,
15    pub payload: Value,
16}
17
18#[derive(Debug, Clone, Serialize, Deserialize)]
19pub struct ExternalCoreResponse {
20    pub id: String,
21    pub ok: bool,
22    #[serde(skip_serializing_if = "Option::is_none")]
23    pub result: Option<Value>,
24    #[serde(skip_serializing_if = "Option::is_none")]
25    pub error: Option<ExternalCoreError>,
26}
27
28#[derive(Debug, Clone, Serialize, Deserialize)]
29pub struct ExternalCoreError {
30    pub code: String,
31    pub message: String,
32}
33
34#[derive(Debug, Clone, Serialize, Deserialize)]
35pub enum ExternalCoreMethod {
36    HandleCoreInput,
37    RegisterLocalAppClient,
38    RegisterNodeConnection,
39    CleanupWsState,
40    UpdateCallbackBase,
41    DeviceIdentity,
42    CommissionFingerprint,
43    CommissionPublicKeyBase64,
44    ListMdnsRecords,
45    PollEvents,
46    CompleteEvents,
47    NodeOnboardingIssuerInfo,
48    CommissionChallengePayload,
49    PairingStartPayload,
50    SetupStartPayload,
51    GeneralWebhookPayload,
52    PlaygroundWebhookPayload,
53    InvokeWasmPayload,
54    Health,
55}
56
57#[derive(Debug, Clone, Serialize, Deserialize)]
58pub struct HandleCoreInputRequest {
59    pub input: ServiceCoreInput,
60}
61
62#[derive(Debug, Clone, Serialize, Deserialize)]
63pub struct HandleCoreInputResponse {
64    pub output: ServiceCoreOutput,
65}
66
67#[derive(Debug, Clone, Serialize, Deserialize)]
68pub struct RegisterLocalAppClientRequest {
69    pub ws_id: String,
70    pub auth_request: AuthRequest,
71    pub session: AuthenticatedSession,
72}
73
74#[derive(Debug, Clone, Serialize, Deserialize)]
75pub struct RegisterNodeConnectionRequest {
76    pub ws_id: String,
77    pub session_id: String,
78    pub node_type: String,
79    pub instance_id: String,
80    #[serde(default, skip_serializing_if = "Option::is_none")]
81    pub host_name: Option<String>,
82    pub tenant_id: String,
83    pub scope_id: String,
84}
85
86#[derive(Debug, Clone, Serialize, Deserialize)]
87pub struct CleanupWsStateRequest {
88    pub ws_id: String,
89}
90
91#[derive(Debug, Clone, Serialize, Deserialize)]
92pub struct UpdateCallbackBaseRequest {
93    pub callback_base: String,
94    pub host: String,
95    pub port: u16,
96}
97
98#[derive(Debug, Clone, Serialize, Deserialize)]
99#[serde(rename_all = "camelCase")]
100pub struct ExternalCoreDeviceIdentity {
101    pub device_id: String,
102    pub device_name: String,
103}
104
105#[derive(Debug, Clone, Serialize, Deserialize)]
106#[serde(rename_all = "camelCase")]
107pub struct ListMdnsRecordsRequest {
108    pub port: u16,
109    pub addresses: Vec<String>,
110    pub host_type: String,
111}
112
113#[derive(Debug, Clone, Serialize, Deserialize)]
114#[serde(rename_all = "camelCase")]
115pub struct ExternalCoreMdnsRecord {
116    pub service_type: String,
117    pub instance_name: String,
118    pub port: u16,
119    pub properties: HashMap<String, String>,
120}
121
122#[derive(Debug, Clone, Serialize, Deserialize)]
123#[serde(rename_all = "camelCase")]
124pub struct PollExternalCoreEventsRequest {
125    pub consumer_id: String,
126    pub max_events: u16,
127    pub timeout_ms: u64,
128}
129
130#[derive(Debug, Clone, Serialize, Deserialize)]
131#[serde(rename_all = "camelCase")]
132pub struct PollExternalCoreEventsResponse {
133    pub events: Vec<ExternalCoreEvent>,
134    pub timed_out: bool,
135}
136
137#[derive(Debug, Clone, Serialize, Deserialize)]
138#[serde(rename_all = "camelCase")]
139pub struct CompleteExternalCoreEventsRequest {
140    pub consumer_id: String,
141    pub completions: Vec<ExternalCoreEventCompletion>,
142}
143
144#[derive(Debug, Clone, Serialize, Deserialize)]
145#[serde(rename_all = "camelCase")]
146pub struct CompleteExternalCoreEventsResponse {
147    pub completed_event_ids: Vec<String>,
148    pub missing_event_ids: Vec<String>,
149}
150
151#[derive(Debug, Clone, Serialize, Deserialize)]
152#[serde(rename_all = "camelCase")]
153pub struct ExternalCoreEvent {
154    pub event_id: String,
155    pub kind: ExternalCoreEventKind,
156    pub payload: Value,
157    pub expects_response: bool,
158}
159
160#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq)]
161#[serde(rename_all = "camelCase")]
162pub enum ExternalCoreEventKind {
163    MdnsRecordsChanged,
164    ServiceEffects,
165}
166
167#[derive(Debug, Clone, Serialize, Deserialize)]
168#[serde(rename_all = "camelCase")]
169pub struct ExternalCoreServiceEffects {
170    pub effects: Vec<ServiceCoreEffect>,
171}
172
173#[derive(Debug, Clone, Serialize, Deserialize)]
174#[serde(rename_all = "camelCase")]
175pub struct ExternalCoreEventCompletion {
176    pub event_id: String,
177    pub ok: bool,
178    #[serde(default, skip_serializing_if = "Option::is_none")]
179    pub response: Option<Value>,
180    #[serde(default, skip_serializing_if = "Option::is_none")]
181    pub error: Option<ExternalCoreError>,
182}
183
184#[derive(Debug, Clone, Serialize, Deserialize)]
185#[serde(rename_all = "camelCase")]
186pub struct NodeOnboardingIssuerInfoRequest {
187    pub tenant_id: String,
188    pub scope_id: String,
189}
190
191#[derive(Debug, Clone, Serialize, Deserialize)]
192pub struct HttpPayloadRequest {
193    pub payload: Value,
194}
195
196#[derive(Debug, Clone, Serialize, Deserialize)]
197pub struct EndpointPayloadRequest {
198    pub endpoint_id: String,
199    pub payload: Value,
200}
201
202#[derive(Debug, Clone, Serialize, Deserialize)]
203pub struct PlaygroundPayloadRequest {
204    pub tenant_id: String,
205    pub scope_id: String,
206    pub device_id: String,
207    pub capability_id: String,
208    pub payload: Value,
209}
210
211#[derive(Debug, Clone, Serialize, Deserialize)]
212#[serde(rename_all = "camelCase")]
213pub struct ExternalCoreRuntimeMetadata {
214    pub backend: String,
215    pub instance_id: String,
216    pub pid: u32,
217    pub state: String,
218    pub started_at: String,
219    pub protocol_version: u32,
220    pub binary_version: String,
221    pub socket_path: String,
222}
223
224#[derive(Debug, Clone, Serialize, Deserialize)]
225#[serde(rename_all = "camelCase")]
226pub struct ExternalCoreHealth {
227    pub ok: bool,
228    pub ready: bool,
229    pub backend: String,
230    pub binary_version: String,
231    pub agent_version: String,
232    pub protocol_version: u32,
233    #[serde(skip_serializing_if = "Option::is_none")]
234    pub instance_id: Option<String>,
235    #[serde(skip_serializing_if = "Option::is_none")]
236    pub pid: Option<u32>,
237    #[serde(skip_serializing_if = "Option::is_none")]
238    pub state: Option<String>,
239    #[serde(skip_serializing_if = "Option::is_none")]
240    pub started_at: Option<String>,
241    #[serde(default)]
242    pub capabilities: Vec<String>,
243}