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}