Skip to content

Commit 8a182a6

Browse files
authored
Merge pull request #180 from eclipse-thingweb/discovery-configuration
feat!: move discovery configurations to scripting_api package
2 parents 0191f0d + bcac81f commit 8a182a6

File tree

11 files changed

+111
-90
lines changed

11 files changed

+111
-90
lines changed

example/coap_discovery.dart

Lines changed: 8 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -39,18 +39,19 @@ Future<void> handleThingDescription(
3939
Future<void> main(List<String> args) async {
4040
final servient = Servient.create(
4141
clientFactories: [CoapClientFactory()],
42-
discoveryConfigurations: [
43-
DirectConfiguration(
44-
Uri.parse("coap://plugfest.thingweb.io:5683/testthing"),
45-
),
46-
],
4742
);
4843

4944
final wot = await servient.start();
45+
final discoveryConfigurations = [
46+
DirectConfiguration(
47+
Uri.parse("coap://plugfest.thingweb.io:5683/testthing"),
48+
),
49+
];
5050

5151
// Example using for-await-loop
5252
try {
53-
await for (final thingDescription in wot.discover()) {
53+
await for (final thingDescription
54+
in wot.discover(discoveryConfigurations)) {
5455
await handleThingDescription(wot, thingDescription);
5556
}
5657
print('Discovery with "await for" has finished.');
@@ -62,7 +63,7 @@ Future<void> main(List<String> args) async {
6263
//
6364
// Notice how the "onDone" callback is called before the result is passed
6465
// to the handleThingDescription function.
65-
wot.discover().listen(
66+
wot.discover(discoveryConfigurations).listen(
6667
(thingDescription) async {
6768
await handleThingDescription(wot, thingDescription);
6869
},

example/coap_dns_sd_discovery.dart

Lines changed: 7 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -19,16 +19,18 @@ Future<void> main(List<String> args) async {
1919
CoapClientFactory(),
2020
HttpClientFactory(),
2121
],
22-
discoveryConfigurations: [
23-
const DnsSdDConfiguration(protocolType: ProtocolType.udp),
24-
],
2522
);
2623

2724
final wot = await servient.start();
2825

26+
final discoveryConfigurations = [
27+
const DnsSdDConfiguration(protocolType: ProtocolType.udp),
28+
];
29+
2930
// Example using for-await-loop
3031
try {
31-
await for (final thingDescription in wot.discover()) {
32+
await for (final thingDescription
33+
in wot.discover(discoveryConfigurations)) {
3234
handleThingDescription(thingDescription);
3335
}
3436
print('Discovery with "await for" has finished.');
@@ -40,7 +42,7 @@ Future<void> main(List<String> args) async {
4042
//
4143
// Notice how the "onDone" callback is called before the result is passed
4244
// to the handleThingDescription function.
43-
wot.discover().listen(
45+
wot.discover(discoveryConfigurations).listen(
4446
handleThingDescription,
4547
onError: (error) => print("Encountered an error: $error"),
4648
onDone: () => print('Discovery with "listen" has finished.'),

example/core_link_format_discovery.dart

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -12,16 +12,16 @@ import "package:dart_wot/core.dart";
1212
Future<void> main(List<String> args) async {
1313
final servient = Servient.create(
1414
clientFactories: [CoapClientFactory()],
15-
discoveryConfigurations: [
16-
CoreLinkFormatConfiguration(
17-
Uri.parse("coap://plugfest.thingweb.io"),
18-
),
19-
],
2015
);
2116

2217
final wot = await servient.start();
18+
final discoveryConfigurations = [
19+
CoreLinkFormatConfiguration(
20+
Uri.parse("coap://plugfest.thingweb.io"),
21+
),
22+
];
2323

24-
await for (final thingDescription in wot.discover()) {
24+
await for (final thingDescription in wot.discover(discoveryConfigurations)) {
2525
print(thingDescription.title);
2626

2727
if (thingDescription.title != "Smart-Coffee-Machine") {

lib/src/core/implementation.dart

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,5 +11,4 @@ export "implementation/augmented_form.dart";
1111
export "implementation/codecs/content_codec.dart";
1212
export "implementation/content.dart";
1313
export "implementation/content_serdes.dart";
14-
export "implementation/discovery/discovery_configuration.dart";
1514
export "implementation/servient.dart" show Servient;

lib/src/core/implementation/servient.dart

Lines changed: 5 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,6 @@ import "../scripting_api.dart" as scripting_api;
1515

1616
import "consumed_thing.dart";
1717
import "content_serdes.dart";
18-
import "discovery/discovery_configuration.dart";
1918
import "exposed_thing.dart";
2019
import "thing_discovery.dart";
2120
import "wot.dart";
@@ -28,8 +27,7 @@ import "wot.dart";
2827
abstract class Servient {
2928
/// Creates a new [Servient].
3029
///
31-
/// The [Servient] can be pre-configured with [List]s of
32-
/// [clientFactories] and [discoveryConfigurations].
30+
/// The [Servient] can be pre-configured with a [List] of [clientFactories].
3331
/// However, it is also possible to dynamically [addClientFactory]s and
3432
/// [removeClientFactory]s at runtime.
3533
///
@@ -40,24 +38,14 @@ abstract class Servient {
4038
List<ProtocolClientFactory>? clientFactories,
4139
ServerSecurityCallback? serverSecurityCallback,
4240
ContentSerdes? contentSerdes,
43-
List<DiscoveryConfiguration>? discoveryConfigurations,
4441
}) {
4542
return InternalServient(
4643
clientFactories: clientFactories,
4744
serverSecurityCallback: serverSecurityCallback,
4845
contentSerdes: contentSerdes,
49-
discoveryConfigurations: discoveryConfigurations,
5046
);
5147
}
5248

53-
/// [List] of [DiscoveryConfiguration]s that are used when calling the
54-
/// [scripting_api.WoT.discover] method.
55-
List<DiscoveryConfiguration> get discoveryConfigurations;
56-
57-
set discoveryConfigurations(
58-
List<DiscoveryConfiguration> discoveryConfigurations,
59-
);
60-
6149
/// Starts this [Servient] and returns a [scripting_api.WoT] runtime object.
6250
///
6351
/// The [scripting_api.WoT] runtime can be used for consuming, producing, and
@@ -85,9 +73,7 @@ class InternalServient implements Servient {
8573
List<ProtocolClientFactory>? clientFactories,
8674
ServerSecurityCallback? serverSecurityCallback,
8775
ContentSerdes? contentSerdes,
88-
List<DiscoveryConfiguration>? discoveryConfigurations,
8976
}) : contentSerdes = contentSerdes ?? ContentSerdes(),
90-
discoveryConfigurations = discoveryConfigurations ?? [],
9177
_serverSecurityCallback = serverSecurityCallback {
9278
for (final clientFactory in clientFactories ?? <ProtocolClientFactory>[]) {
9379
addClientFactory(clientFactory);
@@ -100,9 +86,6 @@ class InternalServient implements Servient {
10086

10187
final ServerSecurityCallback? _serverSecurityCallback;
10288

103-
@override
104-
List<DiscoveryConfiguration> discoveryConfigurations;
105-
10689
/// The [ContentSerdes] object that is used for serializing/deserializing.
10790
final ContentSerdes contentSerdes;
10891

@@ -343,15 +326,15 @@ class InternalServient implements Servient {
343326
return thingDescription;
344327
}
345328

346-
/// Perform automatic discovery using this [InternalServient]'s
347-
/// [discoveryConfigurations].
329+
/// Perform discovery using the passed-in [discoveryConfigurations].
348330
///
349331
/// A [thingFilter] can be provided to filter the discovered Thing
350332
/// Descriptions; however, doing so currently does not have any effect yet.
351-
ThingDiscovery discover({
333+
ThingDiscovery discover(
334+
List<scripting_api.DiscoveryConfiguration> discoveryConfigurations, {
352335
scripting_api.ThingFilter? thingFilter,
353336
}) {
354-
return ThingDiscovery(thingFilter, this);
337+
return ThingDiscovery(thingFilter, this, discoveryConfigurations);
355338
}
356339

357340
/// Requests a [ThingDescription] from a [url].

lib/src/core/implementation/thing_discovery.dart

Lines changed: 23 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -17,14 +17,17 @@ import "../protocol_interfaces.dart";
1717
import "../scripting_api.dart" as scripting_api;
1818

1919
import "content.dart";
20-
import "discovery/discovery_configuration.dart";
2120
import "servient.dart";
2221

2322
/// Implementation of the [scripting_api.ThingDiscovery] interface.
2423
class ThingDiscovery extends Stream<ThingDescription>
2524
implements scripting_api.ThingDiscovery {
2625
/// Creates a new [ThingDiscovery] object with a given [thingFilter].
27-
ThingDiscovery(this.thingFilter, this._servient) {
26+
ThingDiscovery(
27+
this.thingFilter,
28+
this._servient,
29+
this._discoveryConfigurations,
30+
) {
2831
_stream = _start();
2932
}
3033

@@ -42,40 +45,45 @@ class ThingDiscovery extends Stream<ThingDescription>
4245
@override
4346
final scripting_api.ThingFilter? thingFilter;
4447

48+
final List<scripting_api.DiscoveryConfiguration> _discoveryConfigurations;
49+
4550
late final Stream<ThingDescription> _stream;
4651

4752
Stream<ThingDescription> _start() async* {
48-
for (final discoveryParameter in _servient.discoveryConfigurations) {
53+
for (final discoveryParameter in _discoveryConfigurations) {
4954
switch (discoveryParameter) {
50-
case DnsSdDConfiguration(
55+
case scripting_api.DnsSdDConfiguration(
5156
:final discoveryType,
5257
domainName: final domain,
5358
:final protocolType,
5459
):
5560
yield* _discoverUsingDnsSd(discoveryType, domain, protocolType);
56-
case CoreLinkFormatConfiguration(
61+
case scripting_api.CoreLinkFormatConfiguration(
5762
:final uri,
5863
:final discoveryType,
5964
):
6065
yield* _discoverWithCoreLinkFormat(uri, discoveryType);
61-
case CoreResourceDirectoryConfiguration(
66+
case scripting_api.CoreResourceDirectoryConfiguration(
6267
:final uri,
6368
:final discoveryType,
6469
):
6570
yield* _discoverFromCoreResourceDirectory(uri, discoveryType);
66-
case DirectConfiguration(:final uri):
71+
case scripting_api.DirectConfiguration(:final uri):
6772
if (!uri.hasMulticastAddress) {
6873
yield* Stream.fromFuture(_servient.requestThingDescription(uri));
6974
} else {
7075
yield* _performMulticastDiscovery(uri);
7176
}
72-
case ExploreDirectoryConfiguration(:final uri, :final thingFilter):
77+
case scripting_api.ExploreDirectoryConfiguration(
78+
:final uri,
79+
:final thingFilter
80+
):
7381
final thingDiscoveryProcess = await _servient.exploreDirectory(
7482
uri,
7583
thingFilter: thingFilter,
7684
);
7785
yield* thingDiscoveryProcess;
78-
case MqttDiscoveryConfiguration(
86+
case scripting_api.MqttDiscoveryConfiguration(
7987
:final brokerUri,
8088
:final discoveryTopic,
8189
:final expectedContentType,
@@ -122,9 +130,9 @@ class ThingDiscovery extends Stream<ThingDescription>
122130
}
123131

124132
Stream<ThingDescription> _discoverUsingDnsSd(
125-
DiscoveryType discoveryType,
133+
scripting_api.DiscoveryType discoveryType,
126134
String domainName,
127-
ProtocolType protocolType,
135+
scripting_api.ProtocolType protocolType,
128136
) async* {
129137
if (domainName != ".local") {
130138
throw UnimplementedError(
@@ -134,7 +142,7 @@ class ThingDiscovery extends Stream<ThingDescription>
134142

135143
final serviceNameSegments = <String>[];
136144

137-
if (discoveryType == DiscoveryType.directory) {
145+
if (discoveryType == scripting_api.DiscoveryType.directory) {
138146
serviceNameSegments.addAll(const ["_directory", "_sub"]);
139147
}
140148

@@ -155,7 +163,7 @@ class ThingDiscovery extends Stream<ThingDescription>
155163
Stream<ThingDescription> _performMdnsDiscovery(
156164
String domainName,
157165
String defaultUriScheme,
158-
DiscoveryType expectedType,
166+
scripting_api.DiscoveryType expectedType,
159167
) async* {
160168
final MDnsClient client = MDnsClient();
161169
await client.start();
@@ -233,7 +241,7 @@ class ThingDiscovery extends Stream<ThingDescription>
233241

234242
Stream<ThingDescription> _discoverWithCoreLinkFormat(
235243
Uri uri,
236-
DiscoveryType discoveryType,
244+
scripting_api.DiscoveryType discoveryType,
237245
) async* {
238246
await for (final coreWebLinks in _performCoreLinkFormatDiscovery(
239247
uri,
@@ -246,7 +254,7 @@ class ThingDiscovery extends Stream<ThingDescription>
246254

247255
Stream<ThingDescription> _discoverFromCoreResourceDirectory(
248256
Uri uri,
249-
DiscoveryType discoveryType,
257+
scripting_api.DiscoveryType discoveryType,
250258
) async* {
251259
yield* _performCoreLinkFormatDiscovery(
252260
uri,

lib/src/core/implementation/wot.dart

Lines changed: 9 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,8 @@
66

77
import "dart:async";
88

9+
import "package:meta/meta.dart";
10+
911
import "../definitions.dart";
1012
import "../scripting_api.dart" as scripting_api;
1113
import "consumed_thing.dart";
@@ -39,10 +41,15 @@ class WoT implements scripting_api.WoT {
3941
_servient.produce(init);
4042

4143
@override
42-
ThingDiscovery discover({
44+
ThingDiscovery discover(
45+
@experimental
46+
List<scripting_api.DiscoveryConfiguration> discoveryConfigurations, {
4347
scripting_api.ThingFilter? thingFilter,
4448
}) =>
45-
_servient.discover(thingFilter: thingFilter);
49+
_servient.discover(
50+
discoveryConfigurations,
51+
thingFilter: thingFilter,
52+
);
4653

4754
@override
4855
Future<ThingDescription> requestThingDescription(Uri url) =>

lib/src/core/scripting_api.dart

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,8 @@ library scripting_api;
1212

1313
export "scripting_api/consumed_thing.dart";
1414
export "scripting_api/data_schema_value.dart";
15+
export "scripting_api/discovery/directory_payload_format.dart";
16+
export "scripting_api/discovery/discovery_configuration.dart";
1517
export "scripting_api/discovery/thing_discovery.dart";
1618
export "scripting_api/discovery/thing_filter.dart";
1719
export "scripting_api/exposed_thing.dart";
Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,34 @@
1+
// Copyright 2024 Contributors to the Eclipse Foundation. All rights reserved.
2+
// Use of this source code is governed by a BSD-style
3+
// license that can be found in the LICENSE file.
4+
//
5+
// SPDX-License-Identifier: BSD-3-Clause
6+
7+
/// Enumeration for specifying the value of the `format` query parameter when
8+
/// using the `exploreDirectory` discovery method.
9+
///
10+
/// See [section 7.3.2.1.5] of the [WoT Discovery] specification for more
11+
/// information.
12+
///
13+
/// [WoT Discovery]: https://www.w3.org/TR/2023/REC-wot-discovery-20231205
14+
/// [section 7.3.2.1.5]: https://www.w3.org/TR/2023/REC-wot-discovery-20231205/#exploration-directory-api-things-listing
15+
enum DirectoryPayloadFormat {
16+
/// Indicates that an array of Thing Descriptions should be returned.
17+
///
18+
/// This is the default value.
19+
array,
20+
21+
/// Indicates that an collection of Thing Descriptions should be returned.
22+
collection,
23+
;
24+
25+
@override
26+
String toString() {
27+
switch (this) {
28+
case array:
29+
return "array";
30+
case collection:
31+
return "collection";
32+
}
33+
}
34+
}

0 commit comments

Comments
 (0)