Skip to content

Commit fc19070

Browse files
author
Robert Winkler
committed
Add WebSocketProtocolClient and Server
1 parent 406b43f commit fc19070

File tree

11 files changed

+602
-77
lines changed

11 files changed

+602
-77
lines changed

kotlin-wot-binding-http/src/test/kotlin/http/HttpProtocolServerTest.kt

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -189,8 +189,6 @@ class HttpProtocolServerTest {
189189

190190
val thingDescriptions = response.body<List<ThingDescription>>()
191191
assertEquals(1, thingDescriptions.size)
192-
193-
194192
}
195193

196194
@Test

kotlin-wot-binding-websocket/build.gradle.kts

Lines changed: 2 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -6,20 +6,16 @@ dependencies {
66
api(project(":kotlin-wot"))
77
//implementation("com.fasterxml.jackson.module:jackson-module-kotlin")
88
implementation("org.slf4j:slf4j-api")
9-
implementation("io.ktor:ktor-server-core")
109
implementation("io.ktor:ktor-server-netty")
1110
implementation("io.ktor:ktor-server-websockets")
12-
implementation("io.ktor:ktor-client-core")
13-
implementation("io.ktor:ktor-server-status-pages")
11+
implementation("io.ktor:ktor-client-websocket:1.1.4")
1412
implementation("io.ktor:ktor-client-cio")
1513
implementation("io.ktor:ktor-client-auth")
1614
implementation("io.ktor:ktor-client-logging")
17-
implementation("io.ktor:ktor-server-content-negotiation")
18-
implementation("io.ktor:ktor-client-content-negotiation")
1915
implementation("io.ktor:ktor-serialization-jackson")
20-
implementation("io.ktor:ktor-server-auto-head-response")
2116
//implementation("io.insert-koin:koin-ktor:4.0.0")
2217
testImplementation("io.ktor:ktor-server-test-host")
2318
testImplementation("ch.qos.logback:logback-classic:1.5.12")
2419
testImplementation("com.marcinziolo:kotlin-wiremock:2.1.1")
20+
testImplementation("io.ktor:ktor-server-test-host-jvm:3.0.0")
2521
}

kotlin-wot-binding-websocket/src/main/kotlin/websocket/HttpClientConfig.kt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
package websocket
1+
package ai.ancf.lmos.wot.binding.websocket
22

33
import ai.ancf.lmos.wot.security.SecurityScheme
44

Lines changed: 196 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,196 @@
1+
package ai.ancf.lmos.wot.binding.websocket
2+
3+
import ai.ancf.lmos.wot.thing.schema.DataSchemaValue
4+
import com.fasterxml.jackson.annotation.JsonIgnoreProperties
5+
import com.fasterxml.jackson.annotation.JsonSubTypes
6+
import com.fasterxml.jackson.annotation.JsonTypeInfo
7+
import com.fasterxml.jackson.databind.JsonNode
8+
import java.time.Instant
9+
10+
// Base class for all message types
11+
@JsonIgnoreProperties(ignoreUnknown = true)
12+
@JsonTypeInfo(
13+
use = JsonTypeInfo.Id.NAME,
14+
include = JsonTypeInfo.As.PROPERTY,
15+
property = "messageType"
16+
)
17+
@JsonSubTypes(
18+
JsonSubTypes.Type(value = ReadPropertyMessage::class, name = "readProperty"),
19+
JsonSubTypes.Type(value = WritePropertyMessage::class, name = "writeProperty"),
20+
JsonSubTypes.Type(value = ObservePropertyMessage::class, name = "observeProperty"),
21+
JsonSubTypes.Type(value = UnobservePropertyMessage::class, name = "unobserveProperty"),
22+
JsonSubTypes.Type(value = ReadAllPropertiesMessage::class, name = "readAllProperties"),
23+
JsonSubTypes.Type(value = WriteAllPropertiesMessage::class, name = "writeAllProperties"),
24+
JsonSubTypes.Type(value = ReadMultiplePropertiesMessage::class, name = "readMultipleProperties"),
25+
JsonSubTypes.Type(value = WriteMultiplePropertiesMessage::class, name = "writeMultipleProperties"),
26+
JsonSubTypes.Type(value = PropertyReadingMessage::class, name = "propertyReading"),
27+
JsonSubTypes.Type(value = PropertyReadingsMessage::class, name = "propertyReadings"),
28+
JsonSubTypes.Type(value = InvokeActionMessage::class, name = "invokeAction"),
29+
JsonSubTypes.Type(value = ActionStatusMessage::class, name = "actionStatus"),
30+
JsonSubTypes.Type(value = ActionStatusesMessage::class, name = "actionStatuses"),
31+
JsonSubTypes.Type(value = SubscribeEventMessage::class, name = "subscribeevent"),
32+
JsonSubTypes.Type(value = UnsubscribeEventMessage::class, name = "unsubscribeEvent"),
33+
JsonSubTypes.Type(value = EventMessage::class, name = "event"),
34+
JsonSubTypes.Type(value = ErrorMessage::class, name = "error")
35+
)
36+
sealed interface WoTMessage {
37+
var thingId: String
38+
var messageType: String
39+
}
40+
41+
data class InvokeActionMessage(
42+
override var thingId: String,
43+
var action: String,
44+
var input: DataSchemaValue? = null
45+
) : WoTMessage {
46+
override var messageType: String = "invokeAction"
47+
}
48+
49+
// Subclass for subscribeEvent message
50+
data class SubscribeEventMessage(
51+
override var thingId: String,
52+
var event: String,
53+
var lastEvent: Instant
54+
) : WoTMessage {
55+
override var messageType: String = "subscribeevent"
56+
}
57+
58+
// Subclass for unsubscribeEvent message
59+
data class UnsubscribeEventMessage(
60+
override var thingId: String,
61+
var event: String
62+
) : WoTMessage {
63+
override var messageType: String = "unsubscribeEvent"
64+
}
65+
66+
// Subclass for event message
67+
data class EventMessage(
68+
override var thingId: String,
69+
var event: String,
70+
var href: String,
71+
var data: DataSchemaValue,
72+
var timestamp: Instant = Instant.now()
73+
) : WoTMessage {
74+
override var messageType: String = "event"
75+
}
76+
77+
// Subclass for readProperty message
78+
data class ReadPropertyMessage(
79+
override var thingId: String,
80+
var property: String
81+
) : WoTMessage {
82+
override var messageType: String = "readProperty"
83+
}
84+
85+
// Subclass for writeProperty message
86+
data class WritePropertyMessage(
87+
override var thingId: String,
88+
var property: String,
89+
var data: DataSchemaValue
90+
) : WoTMessage {
91+
override var messageType: String = "writeProperty"
92+
}
93+
94+
// Subclass for observeAllProperties message
95+
data class ObserveAllPropertiesMessage(
96+
override var thingId: String,
97+
var lastPropertyReading: Instant
98+
) : WoTMessage {
99+
override var messageType: String = "observeAllProperties"
100+
}
101+
102+
// Subclass for observeProperty message
103+
data class ObservePropertyMessage(
104+
override var thingId: String,
105+
var property: String,
106+
var lastPropertyReading: Instant
107+
) : WoTMessage {
108+
override var messageType: String = "observeProperty"
109+
}
110+
111+
// Subclass for unobserveProperty message
112+
data class UnobservePropertyMessage(
113+
override var thingId: String,
114+
var property: String
115+
) : WoTMessage {
116+
override var messageType: String = "unobserveProperty"
117+
}
118+
119+
// Subclass for readAllProperties message
120+
data class ReadAllPropertiesMessage(
121+
override var thingId: String
122+
) : WoTMessage {
123+
override var messageType: String = "readAllProperties"
124+
}
125+
126+
// Subclass for writeAllProperties message
127+
data class WriteAllPropertiesMessage(
128+
override var thingId: String,
129+
var data: Map<String, DataSchemaValue>
130+
) : WoTMessage {
131+
override var messageType: String = "writeAllProperties"
132+
}
133+
134+
// Subclass for readMultipleProperties message
135+
data class ReadMultiplePropertiesMessage(
136+
override var thingId: String,
137+
var properties: List<String>
138+
) : WoTMessage {
139+
override var messageType: String = "readMultipleProperties"
140+
}
141+
142+
// Subclass for writeMultipleProperties message
143+
data class WriteMultiplePropertiesMessage(
144+
override var thingId: String,
145+
var data: Map<String, DataSchemaValue>
146+
) : WoTMessage {
147+
override var messageType: String = "writeMultipleProperties"
148+
}
149+
150+
// Subclass for propertyReading message
151+
data class PropertyReadingMessage(
152+
override var thingId: String,
153+
var property: String,
154+
var data: JsonNode,
155+
var timestamp: Instant = Instant.now()
156+
) : WoTMessage {
157+
override var messageType: String = "propertyReading"
158+
}
159+
160+
// Subclass for propertyReadings message
161+
data class PropertyReadingsMessage(
162+
override var thingId: String,
163+
var data: Map<String, DataSchemaValue>,
164+
var timestamp: Instant = Instant.now()
165+
) : WoTMessage {
166+
override var messageType: String = "propertyReadings"
167+
}
168+
169+
// Subclass for error message
170+
data class ErrorMessage(
171+
override var thingId: String,
172+
var type: String, // URI reference to the type of error
173+
var title: String, // Short, human-readable summary of the problem
174+
var status: String, // HTTP status code as a string
175+
var detail: String, // Detailed explanation of the error
176+
var instance: String // URI reference to the specific occurrence of the problem
177+
) : WoTMessage {
178+
override var messageType: String = "error"
179+
}
180+
181+
// Subclass for actionStatus message
182+
data class ActionStatusMessage(
183+
override var thingId: String,
184+
var action: String,
185+
var status: String // Example: "pending", "completed", "failed", etc.
186+
) : WoTMessage {
187+
override var messageType: String = "actionStatus"
188+
}
189+
190+
// Subclass for actionStatuses message
191+
data class ActionStatusesMessage(
192+
override var thingId: String,
193+
var statuses: Map<String, String> // Map of action names to their statuses
194+
) : WoTMessage {
195+
override var messageType: String = "actionStatuses"
196+
}

kotlin-wot-binding-websocket/src/main/kotlin/websocket/SecureWebSocketProtocolClientFactory.kt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
package websocket
1+
package ai.ancf.lmos.wot.binding.websocket
22

33
/**
44
* Creates new [HttpProtocolClient] instances that allow consuming Things via HTTPS.

kotlin-wot-binding-websocket/src/main/kotlin/websocket/WebSocketProtocolClient.kt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
package websocket
1+
package ai.ancf.lmos.wot.binding.websocket
22

33
import ai.anfc.lmos.wot.binding.ProtocolClient
44
import io.ktor.client.*

kotlin-wot-binding-websocket/src/main/kotlin/websocket/WebSocketProtocolClientFactory.kt

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,6 @@
1-
package websocket
1+
package ai.ancf.lmos.wot.binding.websocket
22

33
import ai.anfc.lmos.wot.binding.ProtocolClientFactory
4-
import io.ktor.client.*
54

65
/**
76
* Creates new [WebSocketProtocolClient] instances.

0 commit comments

Comments
 (0)