├── .fake
├── lib
├── src
│ ├── storage
│ │ ├── redis_storage.dart
│ │ └── web_storage.dart
│ ├── responder
│ │ ├── manager
│ │ │ ├── permission_manager.dart
│ │ │ ├── trace.dart
│ │ │ └── storage.dart
│ │ ├── response.dart
│ │ ├── base_impl
│ │ │ ├── def_node.dart
│ │ │ ├── config_setting.dart
│ │ │ └── local_node_impl.dart
│ │ └── response
│ │ │ └── invoke.dart
│ ├── historian
│ │ ├── adapter.dart
│ │ ├── publish.dart
│ │ ├── values.dart
│ │ ├── main.dart
│ │ ├── interval.dart
│ │ ├── manage.dart
│ │ ├── rollup.dart
│ │ └── get_history.dart
│ ├── requester
│ │ ├── request
│ │ │ ├── remove.dart
│ │ │ ├── set.dart
│ │ │ └── invoke.dart
│ │ ├── request.dart
│ │ └── default_defs.dart
│ ├── utils
│ │ ├── promise_timeout.dart
│ │ ├── list.dart
│ │ ├── dslink_json.dart
│ │ ├── uri_component.dart
│ │ ├── stream_controller.dart
│ │ └── codec.dart
│ ├── common
│ │ ├── default_defs.dart
│ │ ├── connection_channel.dart
│ │ ├── table.dart
│ │ ├── permission.dart
│ │ └── connection_handler.dart
│ ├── query
│ │ ├── query_command.dart
│ │ ├── query_manager.dart
│ │ └── query_subscribe_command.dart
│ ├── crypto
│ │ ├── pk.dart
│ │ └── dart
│ │ │ └── isolate.dart
│ ├── browser
│ │ └── browser_user_link.dart
│ └── nodes
│ │ └── json.dart
├── socket_client.dart
├── socket_server.dart
├── query.dart
├── dslink.dart
├── requester.dart
├── historian.dart
├── server.dart
├── responder.dart
├── convert_consts.dart
├── convert_consts.dart1
└── broker_discovery.dart
├── .analysis_options
├── tool
├── experiment
│ ├── certs
│ │ ├── private_key.txt
│ │ ├── key4.db
│ │ ├── cert9.db
│ │ └── pkcs11.txt
│ ├── browser
│ │ ├── styles
│ │ │ └── main.css
│ │ ├── lockerdemo.css
│ │ ├── test_browser_link.dart
│ │ ├── test_browser_link.html
│ │ ├── test_browser_requester.html
│ │ ├── test_browser_requester.dart
│ │ ├── lockerdemo.html
│ │ └── lockerdemo.dart
│ ├── test_scheduler.dart
│ ├── workers
│ │ ├── controller.dart
│ │ └── worker.dart
│ ├── test_client_responder.dart
│ ├── test_qos_requester.dart
│ ├── test_client_requester.dart
│ ├── test_key_generate.dart
│ ├── test_qos_responder.dart
│ ├── test_streamset.dart
│ ├── dslink.json
│ ├── lots_of_links.dart
│ ├── sample_responder.dart
│ ├── test_client_responder_locker.dart
│ ├── test_ds_handshake.dart
│ ├── large.dart
│ ├── test_concurrent.dart
│ ├── test_link_provider.dart
│ └── test_concurrent2.dart
├── id_rsa.enc
├── test.sh
├── analyze.sh
├── docs.sh
├── travis.sh
├── toDart2.sh
└── toDart1.sh
├── example
├── message.png
├── broker_discovery.dart
├── browser
│ ├── worker.dart
│ ├── worker.html
│ ├── image.html
│ ├── video.html
│ ├── camera.html
│ ├── browser.html
│ ├── grid.html
│ ├── image.dart
│ ├── camera.dart
│ ├── video.dart
│ ├── grid.dart
│ └── style.css
├── browser_link.dart
├── simple_requester.dart
├── worker_link.dart
├── simple_link.dart
└── actions_link.dart
├── .gitattributes
├── test
├── utils
│ ├── all.dart
│ ├── logging_test.dart
│ ├── base64_test.dart
│ ├── action_test.dart
│ └── scheduler_test.dart
├── all.dart
├── broker_discovery_test.dart
├── common.dart
├── worker_test.dart
├── simple_nodes_test.dart
└── large_links_test.dart
├── .gitignore
├── .travis.yml
├── LICENSE.md
├── CHANGELOG.md
├── bin
└── beacon.dart
├── pubspec.yaml
└── README.md
/.fake:
--------------------------------------------------------------------------------
1 | Build Bump
2 |
--------------------------------------------------------------------------------
/lib/src/storage/redis_storage.dart:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/.analysis_options:
--------------------------------------------------------------------------------
1 | analyzer:
2 | strong-mode: true
3 |
--------------------------------------------------------------------------------
/tool/experiment/certs/private_key.txt:
--------------------------------------------------------------------------------
1 | M6S41GAL0gH0I97Hhy7A2-icf8dHnxXPmYIRwem03HE
--------------------------------------------------------------------------------
/tool/id_rsa.enc:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/IOT-DSA/sdk-dslink-dart/HEAD/tool/id_rsa.enc
--------------------------------------------------------------------------------
/example/message.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/IOT-DSA/sdk-dslink-dart/HEAD/example/message.png
--------------------------------------------------------------------------------
/lib/socket_client.dart:
--------------------------------------------------------------------------------
1 | /// Placeholder for future socket client support.
2 | library dslink.socket_client;
3 |
--------------------------------------------------------------------------------
/lib/socket_server.dart:
--------------------------------------------------------------------------------
1 | /// Placeholder for future socket server support.
2 | library dslink.socket_server;
3 |
--------------------------------------------------------------------------------
/tool/experiment/certs/key4.db:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/IOT-DSA/sdk-dslink-dart/HEAD/tool/experiment/certs/key4.db
--------------------------------------------------------------------------------
/tool/experiment/certs/cert9.db:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/IOT-DSA/sdk-dslink-dart/HEAD/tool/experiment/certs/cert9.db
--------------------------------------------------------------------------------
/.gitattributes:
--------------------------------------------------------------------------------
1 | *.dart text eol=lf
2 | *.sh text eol=lf
3 | *.md text eol=lf
4 | *.json text eol=lf
5 | *.html text eol=lf
6 |
--------------------------------------------------------------------------------
/tool/test.sh:
--------------------------------------------------------------------------------
1 | #!/usr/bin/env bash
2 |
3 | ARGS="${@}"
4 |
5 | if [ -z "${ARGS}" ]
6 | then
7 | ARGS="test/ -p vm -j 6"
8 | fi
9 |
10 | pub run test ${ARGS}
11 |
12 |
--------------------------------------------------------------------------------
/tool/experiment/browser/styles/main.css:
--------------------------------------------------------------------------------
1 | @import url(https://fonts.googleapis.com/css?family=Roboto);
2 |
3 | html, body {
4 | width: 100%;
5 | height: 100%;
6 | margin: 0;
7 | padding: 0;
8 | font-family: 'Roboto', sans-serif;
9 | }
10 |
--------------------------------------------------------------------------------
/example/broker_discovery.dart:
--------------------------------------------------------------------------------
1 | import "package:dslink/dslink.dart";
2 |
3 | main() async {
4 | var client = new BrokerDiscoveryClient();
5 |
6 | await client.init();
7 |
8 | await for (var url in client.discover()) {
9 | print("Discovered Broker at ${url}");
10 | }
11 | }
12 |
--------------------------------------------------------------------------------
/tool/experiment/test_scheduler.dart:
--------------------------------------------------------------------------------
1 | import "package:dslink/utils.dart";
2 |
3 | main() {
4 | Scheduler.after(new Duration(seconds: 5), () {
5 | print("It's 5 seconds later.");
6 | });
7 |
8 | Scheduler.every(Interval.ONE_SECOND, () {
9 | print("One Second");
10 | });
11 | }
12 |
--------------------------------------------------------------------------------
/tool/experiment/workers/controller.dart:
--------------------------------------------------------------------------------
1 | import "package:dslink/worker.dart";
2 |
3 | main() async {
4 | WorkerSocket worker;
5 | worker = await createWorkerScript("worker.dart").init(methods: {
6 | "stop": (_) => worker.stop()
7 | });
8 | await worker.callMethod("hello");
9 | }
10 |
--------------------------------------------------------------------------------
/test/utils/all.dart:
--------------------------------------------------------------------------------
1 | import "action_test.dart" as ActionTests;
2 | import "base64_test.dart" as Base64Tests;
3 | import "logging_test.dart" as LoggingTests;
4 | import "scheduler_test.dart" as SchedulerTests;
5 |
6 | main() {
7 | ActionTests.main();
8 | Base64Tests.main();
9 | LoggingTests.main();
10 | SchedulerTests.main();
11 | }
12 |
--------------------------------------------------------------------------------
/.gitignore:
--------------------------------------------------------------------------------
1 | .project
2 | .settings
3 | .pub
4 | packages
5 | build
6 | pubspec.lock
7 | .idea
8 | *.iml
9 | /test/experiment/.dslink.key
10 | /dslink.json
11 | /.dslink.key
12 | /broker.json
13 | /conns.json
14 | /nodes.json
15 | /tool/personal
16 | .packages
17 | doc/
18 | /data.json
19 | /usernodes.json
20 | /defs.json
21 | /storage/
22 | /tmp
23 |
--------------------------------------------------------------------------------
/lib/src/responder/manager/permission_manager.dart:
--------------------------------------------------------------------------------
1 | part of dslink.responder;
2 |
3 | abstract class IPermissionManager {
4 | int getPermission(String path, Responder resp);
5 | }
6 |
7 | class DummyPermissionManager implements IPermissionManager {
8 | int getPermission(String path, Responder resp) {
9 | return Permission.CONFIG;
10 | }
11 | }
12 |
--------------------------------------------------------------------------------
/lib/query.dart:
--------------------------------------------------------------------------------
1 | /// DSA Query Implementation
2 | library dslink.query;
3 |
4 | import "dart:async";
5 |
6 | import "responder.dart";
7 | import "common.dart";
8 | import "utils.dart";
9 |
10 | part "src/query/query_manager.dart";
11 | part "src/query/query_command.dart";
12 | part "src/query/query_list_command.dart";
13 | part "src/query/query_subscribe_command.dart";
14 |
--------------------------------------------------------------------------------
/example/browser/worker.dart:
--------------------------------------------------------------------------------
1 | import "package:dslink/worker.dart";
2 |
3 | main() async {
4 | var worker = await createWorker(transformStringWorker).init();
5 | print(await worker.callMethod("transform", "Hello World"));
6 | }
7 |
8 | transformStringWorker(Worker worker) async {
9 | await worker.init(methods: {
10 | "transform": (/*String*/ input) => input.toLowerCase()
11 | });
12 | }
13 |
--------------------------------------------------------------------------------
/tool/experiment/certs/pkcs11.txt:
--------------------------------------------------------------------------------
1 | library=
2 | name=NSS Internal PKCS #11 Module
3 | parameters=configdir='sql:.' certPrefix='' keyPrefix='' secmod='secmod.db' flags= updatedir='' updateCertPrefix='' updateKeyPrefix='' updateid='' updateTokenDescription=''
4 | NSS=Flags=internal,critical trustOrder=75 cipherOrder=100 slotParams=(1={slotFlags=[RSA,DSA,DH,RC2,RC4,DES,RANDOM,SHA1,MD5,MD2,SSL,TLS,AES,Camellia,SEED,SHA256,SHA512] askpw=any timeout=30})
5 |
6 |
--------------------------------------------------------------------------------
/example/browser/worker.html:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 | DSA Browser Workers
5 |
6 |
8 |
9 |
10 |
11 |
14 |
15 |
16 |
17 |
18 |
19 |
--------------------------------------------------------------------------------
/test/utils/logging_test.dart:
--------------------------------------------------------------------------------
1 | library dslink.test.utils.logger;
2 |
3 | import "package:test/test.dart";
4 | import "package:logging/logging.dart";
5 |
6 | import "package:dslink/utils.dart";
7 |
8 | main() => group("Logger", loggingTests);
9 |
10 | loggingTests() {
11 | test("level update works as expected", () {
12 | expect(logger.level, equals(Level.INFO));
13 | updateLogLevel("FINE");
14 | expect(logger.level, equals(Level.FINE));
15 | });
16 | }
17 |
--------------------------------------------------------------------------------
/.travis.yml:
--------------------------------------------------------------------------------
1 | language: dart
2 | script: "./tool/travis.sh"
3 | sudo: true
4 | dart:
5 | - 1.24.3
6 | - 1.17.1
7 | env:
8 | global:
9 | - secure: TzlLtsKoHCPotSBXkQZwobmEwMXzTioS3uG+Z+0ablygm+Ba+f9vja/PkT1odHcK39H/el2T4v6aOyU3hl52nMvKOsUvCtD1RTHPgK/ssQAaKhwb0Prx8qzK/0sv33Bo7k1Zqqu0CiKX6NWGrRxV2wraQehN5YDxpDr76P6wFxA=
10 | - secure: omDxdGHkFzF6nuRTrjJ5I5xymdXlkb4NcRXIQ7wt+OYh3OTKz7pkGlvCOd6liUFYpiRbjApZRs4SMh7UViYyrMNSX9j2jPTiGSpvPw5X1RtdeAHuYKD/N+p11NlhNueaAT8wyr4yMrG5dR0Yby+O0XunFYcb4kp//L8pUEgdvLo=
11 |
--------------------------------------------------------------------------------
/tool/experiment/workers/worker.dart:
--------------------------------------------------------------------------------
1 | import "package:dslink/utils.dart" show Scheduler;
2 | import "package:dslink/worker.dart";
3 |
4 | main(List args, message) async {
5 | Worker worker = buildWorkerForScript(message as Map);
6 | WorkerSocket socket = await worker.init(methods: {
7 | "hello": (_) => print("Hello World")
8 | });
9 |
10 | print("Worker Started");
11 |
12 | Scheduler.after(new Duration(seconds: 2), () {
13 | socket.callMethod("stop");
14 | });
15 | }
16 |
--------------------------------------------------------------------------------
/test/all.dart:
--------------------------------------------------------------------------------
1 | import "simple_links_test.dart" as SimpleLinksTests;
2 | import "simple_nodes_test.dart" as SimpleNodesTests;
3 | import "large_links_test.dart" as LargeLinksTests;
4 |
5 | import "worker_test.dart" as WorkerTests;
6 | import "utils/all.dart" as UtilsTests;
7 | import "broker_discovery_test.dart" as BrokerDiscoveryTests;
8 |
9 | main() {
10 | UtilsTests.main();
11 | SimpleLinksTests.main();
12 | SimpleNodesTests.main();
13 | LargeLinksTests.main();
14 | WorkerTests.main();
15 | BrokerDiscoveryTests.main();
16 | }
17 |
--------------------------------------------------------------------------------
/tool/analyze.sh:
--------------------------------------------------------------------------------
1 | #!/usr/bin/env bash
2 | set -e
3 |
4 | FILES=(
5 | bin/beacon.dart
6 | lib/browser_client.dart
7 | lib/client.dart
8 | lib/common.dart
9 | lib/dslink.dart
10 | lib/nodes.dart
11 | lib/requester.dart
12 | lib/responder.dart
13 | lib/server.dart
14 | lib/socket_client.dart
15 | lib/socket_server.dart
16 | lib/utils.dart
17 | lib/worker.dart
18 | lib/io.dart
19 | lib/historian.dart
20 | )
21 |
22 | for FILE in ${FILES[@]}
23 | do
24 | dartanalyzer ${FILE}
25 | done
26 |
--------------------------------------------------------------------------------
/tool/experiment/test_client_responder.dart:
--------------------------------------------------------------------------------
1 | import 'package:dslink/client.dart';
2 | import 'package:dslink/src/crypto/pk.dart';
3 | import 'sample_responder.dart';
4 |
5 | main() async {
6 | PrivateKey key = new PrivateKey.loadFromString('9zaOwGO2iXimn4RXTNndBEpoo32qFDUw72d8mteZP9I BJSgx1t4pVm8VCs4FHYzRvr14BzgCBEm8wJnMVrrlx1u1dnTsPC0MlzAB1LhH2sb6FXnagIuYfpQUJGT_yYtoJM');
7 |
8 | var link = new HttpClientLink('http://localhost:8080/conn', 'rick-req-', key,
9 | isResponder: true, nodeProvider: new TestNodeProvider());
10 |
11 | link.connect();
12 | }
13 |
--------------------------------------------------------------------------------
/lib/dslink.dart:
--------------------------------------------------------------------------------
1 | /// Entry Point for the DSLink SDK for the Dart VM
2 | library dslink;
3 |
4 | export "package:dslink/common.dart";
5 | export "package:dslink/requester.dart";
6 | export "package:dslink/responder.dart";
7 | export "package:dslink/client.dart";
8 | export "package:dslink/broker_discovery.dart" show BrokerDiscoveryClient, BrokerDiscoverRequest;
9 | export "package:dslink/utils.dart"
10 | show
11 | Scheduler,
12 | Interval,
13 | DSLinkJSON,
14 | updateLogLevel,
15 | buildEnumType,
16 | buildActionIO,
17 | ByteDataUtil;
18 |
--------------------------------------------------------------------------------
/tool/experiment/browser/lockerdemo.css:
--------------------------------------------------------------------------------
1 |
2 | body {
3 | background-color: #F8F8F8;
4 | font-family: 'Open Sans', sans-serif;
5 | font-size: 14px;
6 | font-weight: normal;
7 | line-height: 1.2em;
8 | margin: 15px;
9 | }
10 |
11 | h1, p {
12 | color: #333;
13 | }
14 |
15 | .sample_container {
16 | width: 300px;
17 | height: 300px;
18 | border: 1px solid #ccc;
19 | background-color: #fff;
20 | }
21 |
22 | .sample_text {
23 | font-size: 24pt;
24 | text-align: center;
25 | margin-top: 140px;
26 | -webkit-user-select: none;
27 | user-select: none;
28 | }
29 | input {
30 | margin-left:70px;
31 | }
--------------------------------------------------------------------------------
/tool/docs.sh:
--------------------------------------------------------------------------------
1 | #!/usr/bin/env bash
2 | set -e
3 | if [ -d "build" ]
4 | then
5 | rm -rf build
6 | fi
7 | pub global activate -sgit https://github.com/dart-lang/dartdoc.git > /dev/null
8 | mkdir -p build/docs
9 | pub global run dartdoc --output build/docs --add-crossdart
10 | if [ "$1" == "--upload" ]
11 | then
12 | git clone git@github.com:IOT-DSA/docs.git -b gh-pages --depth 1 build/tmp
13 | rm -rf build/tmp/sdks/dart
14 | mkdir -p build/tmp/sdks/dart
15 | cp -R build/docs/* build/tmp/sdks/dart/
16 | cd build/tmp
17 | set +e
18 | git add -A .
19 | git commit -m "Update Docs for Dart SDK"
20 | git push origin gh-pages
21 | fi
22 |
--------------------------------------------------------------------------------
/example/browser_link.dart:
--------------------------------------------------------------------------------
1 | import "package:dslink/browser.dart";
2 |
3 | LinkProvider link;
4 |
5 | main() async {
6 | link = new LinkProvider(
7 | "http://127.0.0.1:8080/conn", // Broker URL
8 | "BrowserExample-", // Link Prefix
9 | defaultNodes: {
10 | "Message": {
11 | r"$type": "string", // The type of the node is a string.
12 | r"$writable": "write", // This node's value can be set by a requester.
13 | "?value": "Hello World" // The default message value.
14 | }
15 | }
16 | );
17 |
18 | await link.init(); // Initialize the Link
19 |
20 | link.connect(); // Connect to the Broker
21 | }
22 |
--------------------------------------------------------------------------------
/LICENSE.md:
--------------------------------------------------------------------------------
1 | ```
2 | Copyright 2014 DGLogik Inc.
3 |
4 | Licensed under the Apache License, Version 2.0 (the "License");
5 | you may not use this file except in compliance with the License.
6 | You may obtain a copy of the License at
7 |
8 | http://www.apache.org/licenses/LICENSE-2.0
9 |
10 | Unless required by applicable law or agreed to in writing, software
11 | distributed under the License is distributed on an "AS IS" BASIS,
12 | WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 | See the License for the specific language governing permissions and
14 | limitations under the License.
15 | ```
16 |
--------------------------------------------------------------------------------
/lib/requester.dart:
--------------------------------------------------------------------------------
1 | /// DSA Requester API
2 | library dslink.requester;
3 |
4 | import "dart:async";
5 | import "dart:collection";
6 |
7 | import "common.dart";
8 | import "utils.dart";
9 | import 'package:dslink/convert_consts.dart';
10 |
11 | export "package:dslink/utils.dart" show parseEnumType;
12 |
13 | part "src/requester/requester.dart";
14 | part "src/requester/request.dart";
15 | part "src/requester/node_cache.dart";
16 | part "src/requester/request/list.dart";
17 | part "src/requester/request/subscribe.dart";
18 | part "src/requester/request/invoke.dart";
19 | part "src/requester/request/set.dart";
20 | part "src/requester/request/remove.dart";
21 |
22 | part "src/requester/default_defs.dart";
23 |
--------------------------------------------------------------------------------
/example/browser/image.html:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 | DSA Image Display
5 |
6 |
21 |
22 |
23 |
24 |
25 |
26 |
27 |
28 |
29 |
--------------------------------------------------------------------------------
/example/browser/video.html:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 | DSA Video Player
5 |
6 |
21 |
22 |
23 |
24 |
25 |
26 |
27 |
28 |
29 |
--------------------------------------------------------------------------------
/lib/src/historian/adapter.dart:
--------------------------------------------------------------------------------
1 | part of dslink.historian;
2 |
3 | abstract class HistorianAdapter {
4 | Future getDatabase(Map config);
5 |
6 | List