Skip to content

Commit 4e890e0

Browse files
committed
feat: implement requestThingDescription method
1 parent 6c415fe commit 4e890e0

File tree

7 files changed

+56
-0
lines changed

7 files changed

+56
-0
lines changed

lib/src/binding_coap/coap_client.dart

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -538,4 +538,12 @@ final class CoapClient implements ProtocolClient {
538538
yield content;
539539
}
540540
}
541+
542+
@override
543+
Future<Content> requestThingDescription(Uri url) async => _sendRequest(
544+
url,
545+
coap.RequestMethod.get,
546+
form: null,
547+
accept: coap.CoapMediaType.applicationTdJson,
548+
);
541549
}

lib/src/binding_http/http_client.dart

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -332,4 +332,18 @@ final class HttpClient implements ProtocolClient {
332332

333333
yield encodedLinks;
334334
}
335+
336+
@override
337+
Future<Content> requestThingDescription(Uri url) async {
338+
final request = Request(HttpRequestMethod.get.methodName, url);
339+
const tdContentType = 'application/td+json';
340+
request.headers['Accept'] = tdContentType;
341+
342+
final response = await _client.send(request);
343+
344+
return Content(
345+
response.headers['Content-Type'] ?? tdContentType,
346+
response.stream,
347+
);
348+
}
335349
}

lib/src/binding_mqtt/mqtt_client.dart

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -251,4 +251,10 @@ final class MqttClient implements ProtocolClient {
251251
// TODO: implement discoverWithCoreLinkFormat
252252
throw UnimplementedError();
253253
}
254+
255+
@override
256+
Future<Content> requestThingDescription(Uri url) {
257+
// TODO: implement requestThingDescription
258+
throw UnimplementedError();
259+
}
254260
}

lib/src/core/protocol_interfaces/protocol_client.dart

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -62,4 +62,7 @@ abstract interface class ProtocolClient {
6262
void Function(Exception error)? error,
6363
required void Function() complete,
6464
});
65+
66+
/// Requests a Thing Description as [Content] from a [url].
67+
Future<Content> requestThingDescription(Uri url);
6568
}

lib/src/core/servient.dart

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@ import 'exposed_thing.dart';
1515
import 'protocol_interfaces/protocol_client.dart';
1616
import 'protocol_interfaces/protocol_client_factory.dart';
1717
import 'protocol_interfaces/protocol_server.dart';
18+
import 'thing_discovery.dart';
1819
import 'wot.dart';
1920

2021
/// Exception that is thrown by a [Servient].
@@ -225,4 +226,20 @@ class Servient {
225226

226227
return clientFactory.createClient();
227228
}
229+
230+
/// Requests a [ThingDescription] from a [url].
231+
Future<ThingDescription> requestThingDescription(Uri url) async {
232+
final client = clientFor(url.scheme);
233+
final content = await client.requestThingDescription(url);
234+
235+
final value = await contentSerdes.contentToValue(content, null);
236+
237+
if (value is! Map<String, dynamic>) {
238+
throw DiscoveryException(
239+
'Could not parse Thing Description obtained from $url',
240+
);
241+
}
242+
243+
return ThingDescription.fromJson(value);
244+
}
228245
}

lib/src/core/wot.dart

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -90,4 +90,9 @@ class WoT implements scripting_api.WoT {
9090
}) {
9191
return ThingDiscovery(url, thingFilter, _servient, method: method);
9292
}
93+
94+
@override
95+
Future<ThingDescription> requestThingDescription(Uri url) {
96+
return _servient.requestThingDescription(url);
97+
}
9398
}

lib/src/scripting_api/wot.dart

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,9 @@ abstract interface class WoT {
3131
/// based on the underlying impementation.
3232
Future<ExposedThing> produce(ExposedThingInit exposedThingInit);
3333

34+
/// Requests a [ThingDescription] from the given [url].
35+
Future<ThingDescription> requestThingDescription(Uri url);
36+
3437
/// Discovers [ThingDescription]s from a given [url] using the specified
3538
/// [method].
3639
///

0 commit comments

Comments
 (0)