mqtt-plus 0.9.5 → 0.9.6

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -86,15 +86,6 @@ communication patterns with type safety:
86
86
 
87
87
  ![Resource Transfer](doc/mqtt-plus-4-resource-transfer.svg)
88
88
 
89
- > [!Note]
90
- > **MQTT+** is similar to and derived from
91
- > [MQTT-JSON-RPC](https://github.com/rse/mqtt-json-rpc) of the same
92
- > author, but instead of just JSON, MQTT+ encodes packets as JSON
93
- > or CBOR (default), uses an own packet format (allowing sender and
94
- > receiver information), uses shorter NanoIDs instead of longer UUIDs
95
- > for identification of sender, receiver and requests, and additionally
96
- > provides stream transfer and resource transfer support.
97
-
98
89
  Usage
99
90
  -----
100
91
 
@@ -582,6 +573,18 @@ example/hello success: world:42
582
573
  CLOSE
583
574
  ```
584
575
 
576
+ Notice
577
+ ------
578
+
579
+ > [!Note]
580
+ > **MQTT+** is somewhat similar to and originally derived from
581
+ > [MQTT-JSON-RPC](https://github.com/rse/mqtt-json-rpc) of the same
582
+ > author, but instead of just JSON, MQTT+ encodes packets as JSON
583
+ > or CBOR (default), uses an own packet format (allowing sender and
584
+ > receiver information), uses shorter NanoIDs instead of longer UUIDs
585
+ > for identification of sender, receiver and requests, and additionally
586
+ > provides stream transfer and resource transfer support.
587
+
585
588
  License
586
589
  -------
587
590
 
@@ -7,11 +7,11 @@ server: "Server"
7
7
 
8
8
  broker.class: brown
9
9
 
10
- "subscribe(\"foo/bar\")": {
10
+ subscribe("foo/bar"): {
11
11
  server -> broker: "op: subscribe\ntopic: foo/bar/event-emission/any"
12
12
  }
13
13
 
14
- "emit(\"foo/bar\")": {
14
+ emit("foo/bar"): {
15
15
  client -> broker: "op: publish\ntopic: foo/bar/event-emission/any\ndata: Event-Emission"
16
16
  broker -> server: "op: publish\ntopic: foo/bar/event-emission/any\ndata: Event-Emission"
17
17
  }
@@ -19,7 +19,5 @@ transfer("foo/bar") {
19
19
  client <- broker: "op: publish\ntopic: foo/bar/resource-response/XXX\ndata: Resource-Transfer-Response #1"
20
20
  broker <- server: "op: publish\ntopic: foo/bar/resource-response/XXX\ndata: Resource-Transfer-Response #N"
21
21
  client <- broker: "op: publish\ntopic: foo/bar/resource-response/XXX\ndata: Resource-Transfer-Response #N"
22
- broker <- server: "op: publish\ntopic: foo/bar/resource-response/XXX\ndata: Resource-Transfer-Response EoS"
23
- client <- broker: "op: publish\ntopic: foo/bar/resource-response/XXX\ndata: Resource-Transfer-Response EoS"
24
22
  }
25
23
 
@@ -1,17 +1,17 @@
1
- <?xml version="1.0" encoding="utf-8"?><svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" data-d2-version="v0.7.0-HEAD" preserveAspectRatio="xMinYMin meet" viewBox="0 0 730 1362"><svg class="d2-790283124 d2-svg" width="730" height="1362" viewBox="11 51 730 1362"><rect x="11.000000" y="51.000000" width="730.000000" height="1362.000000" rx="0.000000" fill="#ffffff" class=" fill-N7" stroke-width="0" /><style type="text/css"><![CDATA[
2
- .d2-790283124 .text {
3
- font-family: "d2-790283124-font-regular";
1
+ <?xml version="1.0" encoding="utf-8"?><svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" data-d2-version="v0.7.0-HEAD" preserveAspectRatio="xMinYMin meet" viewBox="0 0 714 1118"><svg class="d2-3961372893 d2-svg" width="714" height="1118" viewBox="11 51 714 1118"><rect x="11.000000" y="51.000000" width="714.000000" height="1118.000000" rx="0.000000" fill="#ffffff" class=" fill-N7" stroke-width="0" /><style type="text/css"><![CDATA[
2
+ .d2-3961372893 .text {
3
+ font-family: "d2-3961372893-font-regular";
4
4
  }
5
5
  @font-face {
6
- font-family: d2-790283124-font-regular;
7
- src: url("data:application/font-woff;base64,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");
6
+ font-family: d2-3961372893-font-regular;
7
+ src: url("data:application/font-woff;base64,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");
8
8
  }
9
- .d2-790283124 .text-italic {
10
- font-family: "d2-790283124-font-italic";
9
+ .d2-3961372893 .text-italic {
10
+ font-family: "d2-3961372893-font-italic";
11
11
  }
12
12
  @font-face {
13
- font-family: d2-790283124-font-italic;
14
- src: url("data:application/font-woff;base64,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");
13
+ font-family: d2-3961372893-font-italic;
14
+ src: url("data:application/font-woff;base64,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");
15
15
  }]]></style><style type="text/css"><![CDATA[.shape {
16
16
  shape-rendering: geometricPrecision;
17
17
  stroke-linejoin: round;
@@ -25,87 +25,85 @@
25
25
  opacity: 0.5;
26
26
  }
27
27
 
28
- .d2-790283124 .fill-N1{fill:#303030;}
29
- .d2-790283124 .fill-N2{fill:#606060;}
30
- .d2-790283124 .fill-N3{fill:#909090;}
31
- .d2-790283124 .fill-N4{fill:#c0c0c0;}
32
- .d2-790283124 .fill-N5{fill:#e0e0e0;}
33
- .d2-790283124 .fill-N6{fill:#f0f0f0;}
34
- .d2-790283124 .fill-N7{fill:#ffffff;}
35
- .d2-790283124 .fill-B1{fill:#336699;}
36
- .d2-790283124 .fill-B2{fill:#6699cc;}
37
- .d2-790283124 .fill-B3{fill:#99ccff;}
38
- .d2-790283124 .fill-B4{fill:#c0d0ff;}
39
- .d2-790283124 .fill-B5{fill:#e0f0ff;}
40
- .d2-790283124 .fill-B6{fill:#f0f8ff;}
41
- .d2-790283124 .fill-AA2{fill:#cfb098;}
42
- .d2-790283124 .fill-AA4{fill:#efd0b8;}
43
- .d2-790283124 .fill-AA5{fill:#ffe0c8;}
44
- .d2-790283124 .fill-AB4{fill:#efd0b8;}
45
- .d2-790283124 .fill-AB5{fill:#ffe0c8;}
46
- .d2-790283124 .stroke-N1{stroke:#303030;}
47
- .d2-790283124 .stroke-N2{stroke:#606060;}
48
- .d2-790283124 .stroke-N3{stroke:#909090;}
49
- .d2-790283124 .stroke-N4{stroke:#c0c0c0;}
50
- .d2-790283124 .stroke-N5{stroke:#e0e0e0;}
51
- .d2-790283124 .stroke-N6{stroke:#f0f0f0;}
52
- .d2-790283124 .stroke-N7{stroke:#ffffff;}
53
- .d2-790283124 .stroke-B1{stroke:#336699;}
54
- .d2-790283124 .stroke-B2{stroke:#6699cc;}
55
- .d2-790283124 .stroke-B3{stroke:#99ccff;}
56
- .d2-790283124 .stroke-B4{stroke:#c0d0ff;}
57
- .d2-790283124 .stroke-B5{stroke:#e0f0ff;}
58
- .d2-790283124 .stroke-B6{stroke:#f0f8ff;}
59
- .d2-790283124 .stroke-AA2{stroke:#cfb098;}
60
- .d2-790283124 .stroke-AA4{stroke:#efd0b8;}
61
- .d2-790283124 .stroke-AA5{stroke:#ffe0c8;}
62
- .d2-790283124 .stroke-AB4{stroke:#efd0b8;}
63
- .d2-790283124 .stroke-AB5{stroke:#ffe0c8;}
64
- .d2-790283124 .background-color-N1{background-color:#303030;}
65
- .d2-790283124 .background-color-N2{background-color:#606060;}
66
- .d2-790283124 .background-color-N3{background-color:#909090;}
67
- .d2-790283124 .background-color-N4{background-color:#c0c0c0;}
68
- .d2-790283124 .background-color-N5{background-color:#e0e0e0;}
69
- .d2-790283124 .background-color-N6{background-color:#f0f0f0;}
70
- .d2-790283124 .background-color-N7{background-color:#ffffff;}
71
- .d2-790283124 .background-color-B1{background-color:#336699;}
72
- .d2-790283124 .background-color-B2{background-color:#6699cc;}
73
- .d2-790283124 .background-color-B3{background-color:#99ccff;}
74
- .d2-790283124 .background-color-B4{background-color:#c0d0ff;}
75
- .d2-790283124 .background-color-B5{background-color:#e0f0ff;}
76
- .d2-790283124 .background-color-B6{background-color:#f0f8ff;}
77
- .d2-790283124 .background-color-AA2{background-color:#cfb098;}
78
- .d2-790283124 .background-color-AA4{background-color:#efd0b8;}
79
- .d2-790283124 .background-color-AA5{background-color:#ffe0c8;}
80
- .d2-790283124 .background-color-AB4{background-color:#efd0b8;}
81
- .d2-790283124 .background-color-AB5{background-color:#ffe0c8;}
82
- .d2-790283124 .color-N1{color:#303030;}
83
- .d2-790283124 .color-N2{color:#606060;}
84
- .d2-790283124 .color-N3{color:#909090;}
85
- .d2-790283124 .color-N4{color:#c0c0c0;}
86
- .d2-790283124 .color-N5{color:#e0e0e0;}
87
- .d2-790283124 .color-N6{color:#f0f0f0;}
88
- .d2-790283124 .color-N7{color:#ffffff;}
89
- .d2-790283124 .color-B1{color:#336699;}
90
- .d2-790283124 .color-B2{color:#6699cc;}
91
- .d2-790283124 .color-B3{color:#99ccff;}
92
- .d2-790283124 .color-B4{color:#c0d0ff;}
93
- .d2-790283124 .color-B5{color:#e0f0ff;}
94
- .d2-790283124 .color-B6{color:#f0f8ff;}
95
- .d2-790283124 .color-AA2{color:#cfb098;}
96
- .d2-790283124 .color-AA4{color:#efd0b8;}
97
- .d2-790283124 .color-AA5{color:#ffe0c8;}
98
- .d2-790283124 .color-AB4{color:#efd0b8;}
99
- .d2-790283124 .color-AB5{color:#ffe0c8;}.appendix text.text{fill:#303030}.md{--color-fg-default:#303030;--color-fg-muted:#606060;--color-fg-subtle:#909090;--color-canvas-default:#ffffff;--color-canvas-subtle:#f0f0f0;--color-border-default:#336699;--color-border-muted:#6699cc;--color-neutral-muted:#f0f0f0;--color-accent-fg:#6699cc;--color-accent-emphasis:#6699cc;--color-attention-subtle:#606060;--color-danger-fg:red;}.sketch-overlay-B1{fill:url(#streaks-dark-d2-790283124);mix-blend-mode:overlay}.sketch-overlay-B2{fill:url(#streaks-normal-d2-790283124);mix-blend-mode:color-burn}.sketch-overlay-B3{fill:url(#streaks-normal-d2-790283124);mix-blend-mode:color-burn}.sketch-overlay-B4{fill:url(#streaks-normal-d2-790283124);mix-blend-mode:color-burn}.sketch-overlay-B5{fill:url(#streaks-bright-d2-790283124);mix-blend-mode:darken}.sketch-overlay-B6{fill:url(#streaks-bright-d2-790283124);mix-blend-mode:darken}.sketch-overlay-AA2{fill:url(#streaks-normal-d2-790283124);mix-blend-mode:color-burn}.sketch-overlay-AA4{fill:url(#streaks-normal-d2-790283124);mix-blend-mode:color-burn}.sketch-overlay-AA5{fill:url(#streaks-bright-d2-790283124);mix-blend-mode:darken}.sketch-overlay-AB4{fill:url(#streaks-normal-d2-790283124);mix-blend-mode:color-burn}.sketch-overlay-AB5{fill:url(#streaks-bright-d2-790283124);mix-blend-mode:darken}.sketch-overlay-N1{fill:url(#streaks-darker-d2-790283124);mix-blend-mode:lighten}.sketch-overlay-N2{fill:url(#streaks-dark-d2-790283124);mix-blend-mode:overlay}.sketch-overlay-N3{fill:url(#streaks-normal-d2-790283124);mix-blend-mode:color-burn}.sketch-overlay-N4{fill:url(#streaks-normal-d2-790283124);mix-blend-mode:color-burn}.sketch-overlay-N5{fill:url(#streaks-normal-d2-790283124);mix-blend-mode:color-burn}.sketch-overlay-N6{fill:url(#streaks-bright-d2-790283124);mix-blend-mode:darken}.sketch-overlay-N7{fill:url(#streaks-bright-d2-790283124);mix-blend-mode:darken}.light-code{display: block}.dark-code{display: none}]]></style><g class="Y2xpZW50"><g class="shape" ><rect x="12.000000" y="52.000000" width="100.000000" height="66.000000" stroke="#336699" fill="#e0f0ff" class=" stroke-B1 fill-B5" style="stroke-width:2;" /></g><text x="62.000000" y="90.500000" fill="#303030" class="text fill-N1" style="text-anchor:middle;font-size:16px">Client</text></g><g class="YnJva2Vy brown"><g class="shape" ><rect x="326.000000" y="52.000000" width="100.000000" height="66.000000" stroke="#cfb098" fill="#ffe0c9" style="stroke-width:2;" /></g><text x="376.000000" y="90.500000" fill="#303030" class="text fill-N1" style="text-anchor:middle;font-size:16px">Broker</text></g><g class="c2VydmVy"><g class="shape" ><rect x="640.000000" y="52.000000" width="100.000000" height="66.000000" stroke="#336699" fill="#e0f0ff" class=" stroke-B1 fill-B5" style="stroke-width:2;" /></g><text x="690.000000" y="90.500000" fill="#303030" class="text fill-N1" style="text-anchor:middle;font-size:16px">Server</text></g><g class="KGNsaWVudCAtLSApWzBd"><path d="M 62.000000 120.000000 L 62.000000 1411.000000" stroke="#6699cc" fill="none" class="connection stroke-B2" style="stroke-width:2;stroke-dasharray:12.000000,11.838767;" mask="url(#d2-790283124)" /></g><g class="KGJyb2tlciAtLSApWzBd"><path d="M 376.000000 120.000000 L 376.000000 1411.000000" stroke="#cfb098" fill="none" class="connection" style="stroke-width:2;stroke-dasharray:12.000000,11.838767;" mask="url(#d2-790283124)" /></g><g class="KHNlcnZlciAtLSApWzBd"><path d="M 690.000000 120.000000 L 690.000000 1411.000000" stroke="#6699cc" fill="none" class="connection stroke-B2" style="stroke-width:2;stroke-dasharray:12.000000,11.838767;" mask="url(#d2-790283124)" /></g><g class="JiMzOTtwcm92aXNpb24oJiMzNDtmb28vYmFyJiMzNDspJiMzOTs="><g class="shape blend" ><rect x="336.000000" y="175.000000" width="394.000000" height="92.000000" stroke="#336699" fill="#e0e0e0" class=" stroke-B1 fill-N5" style="stroke-width:0;" /></g><rect x="341.000000" y="180.000000" width="135.000000" height="21.000000" fill="#e0e0e0" class=" fill-N5" /><text x="408.500000" y="196.000000" fill="#303030" class="text fill-N1" style="text-anchor:middle;font-size:16px">provision(&#34;foo/bar&#34;)</text></g><g class="JiMzOTt0cmFuc2ZlcigmIzM0O2Zvby9iYXImIzM0OykmIzM5Ow=="><g class="shape blend" ><rect x="22.000000" y="312.000000" width="708.000000" height="1068.000000" stroke="#336699" fill="#e0e0e0" class=" stroke-B1 fill-N5" style="stroke-width:0;" /></g><rect x="27.000000" y="317.000000" width="126.000000" height="21.000000" fill="#e0e0e0" class=" fill-N5" /><text x="90.000000" y="333.000000" fill="#303030" class="text fill-N1" style="text-anchor:middle;font-size:16px">transfer(&#34;foo/bar&#34;)</text></g><g class="KHNlcnZlciAtJmd0OyBicm9rZXIpWzBd"><marker id="mk-d2-790283124-3488378134" markerWidth="10.000000" markerHeight="12.000000" refX="7.000000" refY="6.000000" viewBox="0.000000 0.000000 10.000000 12.000000" orient="auto" markerUnits="userSpaceOnUse"> <polygon points="0.000000,0.000000 10.000000,6.000000 0.000000,12.000000" fill="#336699" class="connection fill-B1" stroke-width="2" /> </marker><path d="M 688.000000 237.000000 L 380.000000 237.000000" stroke="#336699" fill="none" class="connection stroke-B1" style="stroke-width:2;" marker-end="url(#mk-d2-790283124-3488378134)" mask="url(#d2-790283124)" /><text x="533.000000" y="235.000000" fill="#606060" class="text-italic fill-N2" style="text-anchor:middle;font-size:16px"><tspan x="533.000000" dy="0.000000">op: subscribe</tspan><tspan x="533.000000" dy="18.500000">topic: foo/bar/resource-transfer/any</tspan></text></g><g class="KGNsaWVudCAtJmd0OyBicm9rZXIpWzBd"><path d="M 64.000000 374.000000 L 372.000000 374.000000" stroke="#336699" fill="none" class="connection stroke-B1" style="stroke-width:2;" marker-end="url(#mk-d2-790283124-3488378134)" mask="url(#d2-790283124)" /><text x="219.000000" y="372.000000" fill="#606060" class="text-italic fill-N2" style="text-anchor:middle;font-size:16px"><tspan x="219.000000" dy="0.000000">op: subscribe</tspan><tspan x="219.000000" dy="18.500000">topic: foo/bar/resource-transfer/XXX</tspan></text></g><g class="KGNsaWVudCAtJmd0OyBicm9rZXIpWzFd"><path d="M 64.000000 488.000000 L 372.000000 488.000000" stroke="#336699" fill="none" class="connection stroke-B1" style="stroke-width:2;" marker-end="url(#mk-d2-790283124-3488378134)" mask="url(#d2-790283124)" /><text x="219.000000" y="478.000000" fill="#606060" class="text-italic fill-N2" style="text-anchor:middle;font-size:16px"><tspan x="219.000000" dy="0.000000">op: publish</tspan><tspan x="219.000000" dy="17.666667">topic: foo/bar/resource-transfer/any</tspan><tspan x="219.000000" dy="17.666667">data: Resource-Transfer-Request</tspan></text></g><g class="KGJyb2tlciAtJmd0OyBzZXJ2ZXIpWzBd"><path d="M 378.000000 610.000000 L 686.000000 610.000000" stroke="#336699" fill="none" class="connection stroke-B1" style="stroke-width:2;" marker-end="url(#mk-d2-790283124-3488378134)" mask="url(#d2-790283124)" /><text x="533.000000" y="600.000000" fill="#606060" class="text-italic fill-N2" style="text-anchor:middle;font-size:16px"><tspan x="533.000000" dy="0.000000">op: publish</tspan><tspan x="533.000000" dy="17.666667">topic: foo/bar/resource-transfer/any</tspan><tspan x="533.000000" dy="17.666667">data: Resource-Transfer-Request</tspan></text></g><g class="KGJyb2tlciAmbHQ7LSBzZXJ2ZXIpWzBd"><marker id="mk-d2-790283124-2451250203" markerWidth="10.000000" markerHeight="12.000000" refX="3.000000" refY="6.000000" viewBox="0.000000 0.000000 10.000000 12.000000" orient="auto" markerUnits="userSpaceOnUse"> <polygon points="10.000000,0.000000 0.000000,6.000000 10.000000,12.000000" fill="#336699" class="connection fill-B1" stroke-width="2" /> </marker><path d="M 380.000000 732.000000 L 688.000000 732.000000" stroke="#336699" fill="none" class="connection stroke-B1" style="stroke-width:2;" marker-start="url(#mk-d2-790283124-2451250203)" mask="url(#d2-790283124)" /><text x="533.500000" y="722.000000" fill="#606060" class="text-italic fill-N2" style="text-anchor:middle;font-size:16px"><tspan x="533.500000" dy="0.000000">op: publish</tspan><tspan x="533.500000" dy="17.666667">topic: foo/bar/resource-response/XXX</tspan><tspan x="533.500000" dy="17.666667">data: Resource-Transfer-Response #1</tspan></text></g><g class="KGNsaWVudCAmbHQ7LSBicm9rZXIpWzBd"><path d="M 66.000000 854.000000 L 374.000000 854.000000" stroke="#336699" fill="none" class="connection stroke-B1" style="stroke-width:2;" marker-start="url(#mk-d2-790283124-2451250203)" mask="url(#d2-790283124)" /><text x="219.500000" y="844.000000" fill="#606060" class="text-italic fill-N2" style="text-anchor:middle;font-size:16px"><tspan x="219.500000" dy="0.000000">op: publish</tspan><tspan x="219.500000" dy="17.666667">topic: foo/bar/resource-response/XXX</tspan><tspan x="219.500000" dy="17.666667">data: Resource-Transfer-Response #1</tspan></text></g><g class="KGJyb2tlciAmbHQ7LSBzZXJ2ZXIpWzFd"><path d="M 380.000000 976.000000 L 688.000000 976.000000" stroke="#336699" fill="none" class="connection stroke-B1" style="stroke-width:2;" marker-start="url(#mk-d2-790283124-2451250203)" mask="url(#d2-790283124)" /><text x="533.000000" y="966.000000" fill="#606060" class="text-italic fill-N2" style="text-anchor:middle;font-size:16px"><tspan x="533.000000" dy="0.000000">op: publish</tspan><tspan x="533.000000" dy="17.666667">topic: foo/bar/resource-response/XXX</tspan><tspan x="533.000000" dy="17.666667">data: Resource-Transfer-Response #N</tspan></text></g><g class="KGNsaWVudCAmbHQ7LSBicm9rZXIpWzFd"><path d="M 66.000000 1098.000000 L 374.000000 1098.000000" stroke="#336699" fill="none" class="connection stroke-B1" style="stroke-width:2;" marker-start="url(#mk-d2-790283124-2451250203)" mask="url(#d2-790283124)" /><text x="219.000000" y="1088.000000" fill="#606060" class="text-italic fill-N2" style="text-anchor:middle;font-size:16px"><tspan x="219.000000" dy="0.000000">op: publish</tspan><tspan x="219.000000" dy="17.666667">topic: foo/bar/resource-response/XXX</tspan><tspan x="219.000000" dy="17.666667">data: Resource-Transfer-Response #N</tspan></text></g><g class="KGJyb2tlciAmbHQ7LSBzZXJ2ZXIpWzJd"><path d="M 380.000000 1220.000000 L 688.000000 1220.000000" stroke="#336699" fill="none" class="connection stroke-B1" style="stroke-width:2;" marker-start="url(#mk-d2-790283124-2451250203)" mask="url(#d2-790283124)" /><text x="533.000000" y="1210.000000" fill="#606060" class="text-italic fill-N2" style="text-anchor:middle;font-size:16px"><tspan x="533.000000" dy="0.000000">op: publish</tspan><tspan x="533.000000" dy="17.666667">topic: foo/bar/resource-response/XXX</tspan><tspan x="533.000000" dy="17.666667">data: Resource-Transfer-Response EoS</tspan></text></g><g class="KGNsaWVudCAmbHQ7LSBicm9rZXIpWzJd"><path d="M 66.000000 1342.000000 L 374.000000 1342.000000" stroke="#336699" fill="none" class="connection stroke-B1" style="stroke-width:2;" marker-start="url(#mk-d2-790283124-2451250203)" mask="url(#d2-790283124)" /><text x="219.000000" y="1332.000000" fill="#606060" class="text-italic fill-N2" style="text-anchor:middle;font-size:16px"><tspan x="219.000000" dy="0.000000">op: publish</tspan><tspan x="219.000000" dy="17.666667">topic: foo/bar/resource-response/XXX</tspan><tspan x="219.000000" dy="17.666667">data: Resource-Transfer-Response EoS</tspan></text></g><mask id="d2-790283124" maskUnits="userSpaceOnUse" x="11" y="51" width="730" height="1362">
100
- <rect x="11" y="51" width="730" height="1362" fill="white"></rect>
101
- <rect x="412.000000" y="219.000000" width="242" height="37" fill="black"></rect>
102
- <rect x="98.000000" y="356.000000" width="242" height="37" fill="black"></rect>
103
- <rect x="98.000000" y="462.000000" width="242" height="53" fill="black"></rect>
104
- <rect x="412.000000" y="584.000000" width="242" height="53" fill="black"></rect>
105
- <rect x="409.000000" y="706.000000" width="249" height="53" fill="black"></rect>
106
- <rect x="95.000000" y="828.000000" width="249" height="53" fill="black"></rect>
107
- <rect x="408.000000" y="950.000000" width="250" height="53" fill="black"></rect>
108
- <rect x="94.000000" y="1072.000000" width="250" height="53" fill="black"></rect>
109
- <rect x="404.000000" y="1194.000000" width="258" height="53" fill="black"></rect>
110
- <rect x="90.000000" y="1316.000000" width="258" height="53" fill="black"></rect>
28
+ .d2-3961372893 .fill-N1{fill:#303030;}
29
+ .d2-3961372893 .fill-N2{fill:#606060;}
30
+ .d2-3961372893 .fill-N3{fill:#909090;}
31
+ .d2-3961372893 .fill-N4{fill:#c0c0c0;}
32
+ .d2-3961372893 .fill-N5{fill:#e0e0e0;}
33
+ .d2-3961372893 .fill-N6{fill:#f0f0f0;}
34
+ .d2-3961372893 .fill-N7{fill:#ffffff;}
35
+ .d2-3961372893 .fill-B1{fill:#336699;}
36
+ .d2-3961372893 .fill-B2{fill:#6699cc;}
37
+ .d2-3961372893 .fill-B3{fill:#99ccff;}
38
+ .d2-3961372893 .fill-B4{fill:#c0d0ff;}
39
+ .d2-3961372893 .fill-B5{fill:#e0f0ff;}
40
+ .d2-3961372893 .fill-B6{fill:#f0f8ff;}
41
+ .d2-3961372893 .fill-AA2{fill:#cfb098;}
42
+ .d2-3961372893 .fill-AA4{fill:#efd0b8;}
43
+ .d2-3961372893 .fill-AA5{fill:#ffe0c8;}
44
+ .d2-3961372893 .fill-AB4{fill:#efd0b8;}
45
+ .d2-3961372893 .fill-AB5{fill:#ffe0c8;}
46
+ .d2-3961372893 .stroke-N1{stroke:#303030;}
47
+ .d2-3961372893 .stroke-N2{stroke:#606060;}
48
+ .d2-3961372893 .stroke-N3{stroke:#909090;}
49
+ .d2-3961372893 .stroke-N4{stroke:#c0c0c0;}
50
+ .d2-3961372893 .stroke-N5{stroke:#e0e0e0;}
51
+ .d2-3961372893 .stroke-N6{stroke:#f0f0f0;}
52
+ .d2-3961372893 .stroke-N7{stroke:#ffffff;}
53
+ .d2-3961372893 .stroke-B1{stroke:#336699;}
54
+ .d2-3961372893 .stroke-B2{stroke:#6699cc;}
55
+ .d2-3961372893 .stroke-B3{stroke:#99ccff;}
56
+ .d2-3961372893 .stroke-B4{stroke:#c0d0ff;}
57
+ .d2-3961372893 .stroke-B5{stroke:#e0f0ff;}
58
+ .d2-3961372893 .stroke-B6{stroke:#f0f8ff;}
59
+ .d2-3961372893 .stroke-AA2{stroke:#cfb098;}
60
+ .d2-3961372893 .stroke-AA4{stroke:#efd0b8;}
61
+ .d2-3961372893 .stroke-AA5{stroke:#ffe0c8;}
62
+ .d2-3961372893 .stroke-AB4{stroke:#efd0b8;}
63
+ .d2-3961372893 .stroke-AB5{stroke:#ffe0c8;}
64
+ .d2-3961372893 .background-color-N1{background-color:#303030;}
65
+ .d2-3961372893 .background-color-N2{background-color:#606060;}
66
+ .d2-3961372893 .background-color-N3{background-color:#909090;}
67
+ .d2-3961372893 .background-color-N4{background-color:#c0c0c0;}
68
+ .d2-3961372893 .background-color-N5{background-color:#e0e0e0;}
69
+ .d2-3961372893 .background-color-N6{background-color:#f0f0f0;}
70
+ .d2-3961372893 .background-color-N7{background-color:#ffffff;}
71
+ .d2-3961372893 .background-color-B1{background-color:#336699;}
72
+ .d2-3961372893 .background-color-B2{background-color:#6699cc;}
73
+ .d2-3961372893 .background-color-B3{background-color:#99ccff;}
74
+ .d2-3961372893 .background-color-B4{background-color:#c0d0ff;}
75
+ .d2-3961372893 .background-color-B5{background-color:#e0f0ff;}
76
+ .d2-3961372893 .background-color-B6{background-color:#f0f8ff;}
77
+ .d2-3961372893 .background-color-AA2{background-color:#cfb098;}
78
+ .d2-3961372893 .background-color-AA4{background-color:#efd0b8;}
79
+ .d2-3961372893 .background-color-AA5{background-color:#ffe0c8;}
80
+ .d2-3961372893 .background-color-AB4{background-color:#efd0b8;}
81
+ .d2-3961372893 .background-color-AB5{background-color:#ffe0c8;}
82
+ .d2-3961372893 .color-N1{color:#303030;}
83
+ .d2-3961372893 .color-N2{color:#606060;}
84
+ .d2-3961372893 .color-N3{color:#909090;}
85
+ .d2-3961372893 .color-N4{color:#c0c0c0;}
86
+ .d2-3961372893 .color-N5{color:#e0e0e0;}
87
+ .d2-3961372893 .color-N6{color:#f0f0f0;}
88
+ .d2-3961372893 .color-N7{color:#ffffff;}
89
+ .d2-3961372893 .color-B1{color:#336699;}
90
+ .d2-3961372893 .color-B2{color:#6699cc;}
91
+ .d2-3961372893 .color-B3{color:#99ccff;}
92
+ .d2-3961372893 .color-B4{color:#c0d0ff;}
93
+ .d2-3961372893 .color-B5{color:#e0f0ff;}
94
+ .d2-3961372893 .color-B6{color:#f0f8ff;}
95
+ .d2-3961372893 .color-AA2{color:#cfb098;}
96
+ .d2-3961372893 .color-AA4{color:#efd0b8;}
97
+ .d2-3961372893 .color-AA5{color:#ffe0c8;}
98
+ .d2-3961372893 .color-AB4{color:#efd0b8;}
99
+ .d2-3961372893 .color-AB5{color:#ffe0c8;}.appendix text.text{fill:#303030}.md{--color-fg-default:#303030;--color-fg-muted:#606060;--color-fg-subtle:#909090;--color-canvas-default:#ffffff;--color-canvas-subtle:#f0f0f0;--color-border-default:#336699;--color-border-muted:#6699cc;--color-neutral-muted:#f0f0f0;--color-accent-fg:#6699cc;--color-accent-emphasis:#6699cc;--color-attention-subtle:#606060;--color-danger-fg:red;}.sketch-overlay-B1{fill:url(#streaks-dark-d2-3961372893);mix-blend-mode:overlay}.sketch-overlay-B2{fill:url(#streaks-normal-d2-3961372893);mix-blend-mode:color-burn}.sketch-overlay-B3{fill:url(#streaks-normal-d2-3961372893);mix-blend-mode:color-burn}.sketch-overlay-B4{fill:url(#streaks-normal-d2-3961372893);mix-blend-mode:color-burn}.sketch-overlay-B5{fill:url(#streaks-bright-d2-3961372893);mix-blend-mode:darken}.sketch-overlay-B6{fill:url(#streaks-bright-d2-3961372893);mix-blend-mode:darken}.sketch-overlay-AA2{fill:url(#streaks-normal-d2-3961372893);mix-blend-mode:color-burn}.sketch-overlay-AA4{fill:url(#streaks-normal-d2-3961372893);mix-blend-mode:color-burn}.sketch-overlay-AA5{fill:url(#streaks-bright-d2-3961372893);mix-blend-mode:darken}.sketch-overlay-AB4{fill:url(#streaks-normal-d2-3961372893);mix-blend-mode:color-burn}.sketch-overlay-AB5{fill:url(#streaks-bright-d2-3961372893);mix-blend-mode:darken}.sketch-overlay-N1{fill:url(#streaks-darker-d2-3961372893);mix-blend-mode:lighten}.sketch-overlay-N2{fill:url(#streaks-dark-d2-3961372893);mix-blend-mode:overlay}.sketch-overlay-N3{fill:url(#streaks-normal-d2-3961372893);mix-blend-mode:color-burn}.sketch-overlay-N4{fill:url(#streaks-normal-d2-3961372893);mix-blend-mode:color-burn}.sketch-overlay-N5{fill:url(#streaks-normal-d2-3961372893);mix-blend-mode:color-burn}.sketch-overlay-N6{fill:url(#streaks-bright-d2-3961372893);mix-blend-mode:darken}.sketch-overlay-N7{fill:url(#streaks-bright-d2-3961372893);mix-blend-mode:darken}.light-code{display: block}.dark-code{display: none}]]></style><g class="Y2xpZW50"><g class="shape" ><rect x="12.000000" y="52.000000" width="100.000000" height="66.000000" stroke="#336699" fill="#e0f0ff" class=" stroke-B1 fill-B5" style="stroke-width:2;" /></g><text x="62.000000" y="90.500000" fill="#303030" class="text fill-N1" style="text-anchor:middle;font-size:16px">Client</text></g><g class="YnJva2Vy brown"><g class="shape" ><rect x="318.000000" y="52.000000" width="100.000000" height="66.000000" stroke="#cfb098" fill="#ffe0c9" style="stroke-width:2;" /></g><text x="368.000000" y="90.500000" fill="#303030" class="text fill-N1" style="text-anchor:middle;font-size:16px">Broker</text></g><g class="c2VydmVy"><g class="shape" ><rect x="624.000000" y="52.000000" width="100.000000" height="66.000000" stroke="#336699" fill="#e0f0ff" class=" stroke-B1 fill-B5" style="stroke-width:2;" /></g><text x="674.000000" y="90.500000" fill="#303030" class="text fill-N1" style="text-anchor:middle;font-size:16px">Server</text></g><g class="KGNsaWVudCAtLSApWzBd"><path d="M 62.000000 120.000000 L 62.000000 1167.000000" stroke="#6699cc" fill="none" class="connection stroke-B2" style="stroke-width:2;stroke-dasharray:12.000000,11.838767;" mask="url(#d2-3961372893)" /></g><g class="KGJyb2tlciAtLSApWzBd"><path d="M 368.000000 120.000000 L 368.000000 1167.000000" stroke="#cfb098" fill="none" class="connection" style="stroke-width:2;stroke-dasharray:12.000000,11.838767;" mask="url(#d2-3961372893)" /></g><g class="KHNlcnZlciAtLSApWzBd"><path d="M 674.000000 120.000000 L 674.000000 1167.000000" stroke="#6699cc" fill="none" class="connection stroke-B2" style="stroke-width:2;stroke-dasharray:12.000000,11.838767;" mask="url(#d2-3961372893)" /></g><g class="JiMzOTtwcm92aXNpb24oJiMzNDtmb28vYmFyJiMzNDspJiMzOTs="><g class="shape blend" ><rect x="328.000000" y="175.000000" width="386.000000" height="92.000000" stroke="#336699" fill="#e0e0e0" class=" stroke-B1 fill-N5" style="stroke-width:0;" /></g><rect x="333.000000" y="180.000000" width="135.000000" height="21.000000" fill="#e0e0e0" class=" fill-N5" /><text x="400.500000" y="196.000000" fill="#303030" class="text fill-N1" style="text-anchor:middle;font-size:16px">provision(&#34;foo/bar&#34;)</text></g><g class="JiMzOTt0cmFuc2ZlcigmIzM0O2Zvby9iYXImIzM0OykmIzM5Ow=="><g class="shape blend" ><rect x="22.000000" y="312.000000" width="692.000000" height="824.000000" stroke="#336699" fill="#e0e0e0" class=" stroke-B1 fill-N5" style="stroke-width:0;" /></g><rect x="27.000000" y="317.000000" width="126.000000" height="21.000000" fill="#e0e0e0" class=" fill-N5" /><text x="90.000000" y="333.000000" fill="#303030" class="text fill-N1" style="text-anchor:middle;font-size:16px">transfer(&#34;foo/bar&#34;)</text></g><g class="KHNlcnZlciAtJmd0OyBicm9rZXIpWzBd"><marker id="mk-d2-3961372893-3488378134" markerWidth="10.000000" markerHeight="12.000000" refX="7.000000" refY="6.000000" viewBox="0.000000 0.000000 10.000000 12.000000" orient="auto" markerUnits="userSpaceOnUse"> <polygon points="0.000000,0.000000 10.000000,6.000000 0.000000,12.000000" fill="#336699" class="connection fill-B1" stroke-width="2" /> </marker><path d="M 672.000000 237.000000 L 372.000000 237.000000" stroke="#336699" fill="none" class="connection stroke-B1" style="stroke-width:2;" marker-end="url(#mk-d2-3961372893-3488378134)" mask="url(#d2-3961372893)" /><text x="521.000000" y="235.000000" fill="#606060" class="text-italic fill-N2" style="text-anchor:middle;font-size:16px"><tspan x="521.000000" dy="0.000000">op: subscribe</tspan><tspan x="521.000000" dy="18.500000">topic: foo/bar/resource-transfer/any</tspan></text></g><g class="KGNsaWVudCAtJmd0OyBicm9rZXIpWzBd"><path d="M 64.000000 374.000000 L 364.000000 374.000000" stroke="#336699" fill="none" class="connection stroke-B1" style="stroke-width:2;" marker-end="url(#mk-d2-3961372893-3488378134)" mask="url(#d2-3961372893)" /><text x="215.000000" y="372.000000" fill="#606060" class="text-italic fill-N2" style="text-anchor:middle;font-size:16px"><tspan x="215.000000" dy="0.000000">op: subscribe</tspan><tspan x="215.000000" dy="18.500000">topic: foo/bar/resource-transfer/XXX</tspan></text></g><g class="KGNsaWVudCAtJmd0OyBicm9rZXIpWzFd"><path d="M 64.000000 488.000000 L 364.000000 488.000000" stroke="#336699" fill="none" class="connection stroke-B1" style="stroke-width:2;" marker-end="url(#mk-d2-3961372893-3488378134)" mask="url(#d2-3961372893)" /><text x="215.000000" y="478.000000" fill="#606060" class="text-italic fill-N2" style="text-anchor:middle;font-size:16px"><tspan x="215.000000" dy="0.000000">op: publish</tspan><tspan x="215.000000" dy="17.666667">topic: foo/bar/resource-transfer/any</tspan><tspan x="215.000000" dy="17.666667">data: Resource-Transfer-Request</tspan></text></g><g class="KGJyb2tlciAtJmd0OyBzZXJ2ZXIpWzBd"><path d="M 370.000000 610.000000 L 670.000000 610.000000" stroke="#336699" fill="none" class="connection stroke-B1" style="stroke-width:2;" marker-end="url(#mk-d2-3961372893-3488378134)" mask="url(#d2-3961372893)" /><text x="521.000000" y="600.000000" fill="#606060" class="text-italic fill-N2" style="text-anchor:middle;font-size:16px"><tspan x="521.000000" dy="0.000000">op: publish</tspan><tspan x="521.000000" dy="17.666667">topic: foo/bar/resource-transfer/any</tspan><tspan x="521.000000" dy="17.666667">data: Resource-Transfer-Request</tspan></text></g><g class="KGJyb2tlciAmbHQ7LSBzZXJ2ZXIpWzBd"><marker id="mk-d2-3961372893-2451250203" markerWidth="10.000000" markerHeight="12.000000" refX="3.000000" refY="6.000000" viewBox="0.000000 0.000000 10.000000 12.000000" orient="auto" markerUnits="userSpaceOnUse"> <polygon points="10.000000,0.000000 0.000000,6.000000 10.000000,12.000000" fill="#336699" class="connection fill-B1" stroke-width="2" /> </marker><path d="M 372.000000 732.000000 L 672.000000 732.000000" stroke="#336699" fill="none" class="connection stroke-B1" style="stroke-width:2;" marker-start="url(#mk-d2-3961372893-2451250203)" mask="url(#d2-3961372893)" /><text x="521.500000" y="722.000000" fill="#606060" class="text-italic fill-N2" style="text-anchor:middle;font-size:16px"><tspan x="521.500000" dy="0.000000">op: publish</tspan><tspan x="521.500000" dy="17.666667">topic: foo/bar/resource-response/XXX</tspan><tspan x="521.500000" dy="17.666667">data: Resource-Transfer-Response #1</tspan></text></g><g class="KGNsaWVudCAmbHQ7LSBicm9rZXIpWzBd"><path d="M 66.000000 854.000000 L 366.000000 854.000000" stroke="#336699" fill="none" class="connection stroke-B1" style="stroke-width:2;" marker-start="url(#mk-d2-3961372893-2451250203)" mask="url(#d2-3961372893)" /><text x="215.500000" y="844.000000" fill="#606060" class="text-italic fill-N2" style="text-anchor:middle;font-size:16px"><tspan x="215.500000" dy="0.000000">op: publish</tspan><tspan x="215.500000" dy="17.666667">topic: foo/bar/resource-response/XXX</tspan><tspan x="215.500000" dy="17.666667">data: Resource-Transfer-Response #1</tspan></text></g><g class="KGJyb2tlciAmbHQ7LSBzZXJ2ZXIpWzFd"><path d="M 372.000000 976.000000 L 672.000000 976.000000" stroke="#336699" fill="none" class="connection stroke-B1" style="stroke-width:2;" marker-start="url(#mk-d2-3961372893-2451250203)" mask="url(#d2-3961372893)" /><text x="521.000000" y="966.000000" fill="#606060" class="text-italic fill-N2" style="text-anchor:middle;font-size:16px"><tspan x="521.000000" dy="0.000000">op: publish</tspan><tspan x="521.000000" dy="17.666667">topic: foo/bar/resource-response/XXX</tspan><tspan x="521.000000" dy="17.666667">data: Resource-Transfer-Response #N</tspan></text></g><g class="KGNsaWVudCAmbHQ7LSBicm9rZXIpWzFd"><path d="M 66.000000 1098.000000 L 366.000000 1098.000000" stroke="#336699" fill="none" class="connection stroke-B1" style="stroke-width:2;" marker-start="url(#mk-d2-3961372893-2451250203)" mask="url(#d2-3961372893)" /><text x="215.000000" y="1088.000000" fill="#606060" class="text-italic fill-N2" style="text-anchor:middle;font-size:16px"><tspan x="215.000000" dy="0.000000">op: publish</tspan><tspan x="215.000000" dy="17.666667">topic: foo/bar/resource-response/XXX</tspan><tspan x="215.000000" dy="17.666667">data: Resource-Transfer-Response #N</tspan></text></g><mask id="d2-3961372893" maskUnits="userSpaceOnUse" x="11" y="51" width="714" height="1118">
100
+ <rect x="11" y="51" width="714" height="1118" fill="white"></rect>
101
+ <rect x="400.000000" y="219.000000" width="242" height="37" fill="black"></rect>
102
+ <rect x="94.000000" y="356.000000" width="242" height="37" fill="black"></rect>
103
+ <rect x="94.000000" y="462.000000" width="242" height="53" fill="black"></rect>
104
+ <rect x="400.000000" y="584.000000" width="242" height="53" fill="black"></rect>
105
+ <rect x="397.000000" y="706.000000" width="249" height="53" fill="black"></rect>
106
+ <rect x="91.000000" y="828.000000" width="249" height="53" fill="black"></rect>
107
+ <rect x="396.000000" y="950.000000" width="250" height="53" fill="black"></rect>
108
+ <rect x="90.000000" y="1072.000000" width="250" height="53" fill="black"></rect>
111
109
  </mask></svg></svg>
@@ -34,9 +34,10 @@ export declare class ResourceTransferRequest extends Base {
34
34
  constructor(id: string, resource: string, params?: any[] | undefined, sender?: string, receiver?: string);
35
35
  }
36
36
  export declare class ResourceTransferResponse extends Base {
37
- chunk: Buffer | null | undefined;
37
+ chunk: Buffer | undefined;
38
38
  error: string | undefined;
39
- constructor(id: string, chunk: Buffer | null | undefined, error: string | undefined, sender?: string, receiver?: string);
39
+ final: boolean | undefined;
40
+ constructor(id: string, chunk: Buffer | undefined, error: string | undefined, final: boolean | undefined, sender?: string, receiver?: string);
40
41
  }
41
42
  export default class Msg {
42
43
  makeEventEmission(id: string, event: string, params?: any[], sender?: string, receiver?: string): EventEmission;
@@ -44,7 +45,7 @@ export default class Msg {
44
45
  makeServiceCallRequest(id: string, service: string, params?: any[], sender?: string, receiver?: string): ServiceCallRequest;
45
46
  makeServiceCallResponse(id: string, result?: any, error?: string, sender?: string, receiver?: string): ServiceCallResponse;
46
47
  makeResourceTransferRequest(id: string, resource: string, params?: any[], sender?: string, receiver?: string): ResourceTransferRequest;
47
- makeResourceTransferResponse(id: string, chunk?: Buffer | null, error?: string, sender?: string, receiver?: string): ResourceTransferResponse;
48
+ makeResourceTransferResponse(id: string, chunk?: Buffer, error?: string, final?: boolean, sender?: string, receiver?: string): ResourceTransferResponse;
48
49
  parse(obj: any): EventEmission | StreamTransfer | ServiceCallRequest | ServiceCallResponse | ResourceTransferRequest | ResourceTransferResponse;
49
50
  }
50
51
  export declare class MsgTrait<T extends APISchema = APISchema> extends CodecTrait<T> {
@@ -74,10 +74,11 @@ export class ResourceTransferRequest extends Base {
74
74
  }
75
75
  /* resource response */
76
76
  export class ResourceTransferResponse extends Base {
77
- constructor(id, chunk, error, sender, receiver) {
77
+ constructor(id, chunk, error, final, sender, receiver) {
78
78
  super("resource-transfer-response", id, sender, receiver);
79
79
  this.chunk = chunk;
80
80
  this.error = error;
81
+ this.final = final;
81
82
  }
82
83
  }
83
84
  /* utility class */
@@ -103,8 +104,8 @@ export default class Msg {
103
104
  return new ResourceTransferRequest(id, resource, params, sender, receiver);
104
105
  }
105
106
  /* factory for resource response */
106
- makeResourceTransferResponse(id, chunk, error, sender, receiver) {
107
- return new ResourceTransferResponse(id, chunk, error, sender, receiver);
107
+ makeResourceTransferResponse(id, chunk, error, final, sender, receiver) {
108
+ return new ResourceTransferResponse(id, chunk, error, final, sender, receiver);
108
109
  }
109
110
  /* parse any object into typed object */
110
111
  parse(obj) {
@@ -115,19 +116,20 @@ export default class Msg {
115
116
  throw new Error("invalid object: missing or invalid \"type\" field");
116
117
  if (!("id" in obj) || typeof obj.id !== "string")
117
118
  throw new Error("invalid object: missing or invalid \"id\" field");
118
- if (!("sender" in obj) || typeof obj.sender !== "string")
119
+ if ("sender" in obj && obj.sender !== undefined && typeof obj.sender !== "string")
119
120
  throw new Error("invalid object: invalid \"sender\" field");
120
121
  if ("receiver" in obj && obj.receiver !== undefined && typeof obj.receiver !== "string")
121
122
  throw new Error("invalid object: invalid \"receiver\" field");
122
123
  /* dispatch according to type indication by field */
123
124
  const anyFieldsExcept = (obj, allowed) => Object.keys(obj).some((key) => !allowed.includes(key));
125
+ const validParams = (obj) => obj.params === undefined || (typeof obj.params === "object" && Array.isArray(obj.params));
124
126
  if (obj.type === "event-emission") {
125
127
  /* detect and parse event emission */
126
128
  if (typeof obj.event !== "string")
127
129
  throw new Error("invalid EventEmission object: \"event\" field must be a string");
128
130
  if (anyFieldsExcept(obj, ["type", "id", "event", "params", "sender", "receiver"]))
129
131
  throw new Error("invalid EventEmission object: contains unknown fields");
130
- if (obj.params !== undefined && (typeof obj.params !== "object" || !Array.isArray(obj.params)))
132
+ if (!validParams(obj))
131
133
  throw new Error("invalid EventEmission object: \"params\" field must be an array");
132
134
  return this.makeEventEmission(obj.id, obj.event, obj.params, obj.sender, obj.receiver);
133
135
  }
@@ -139,7 +141,7 @@ export default class Msg {
139
141
  throw new Error("invalid StreamTransfer object: contains unknown fields");
140
142
  if (obj.chunk !== undefined && typeof obj.chunk !== "object")
141
143
  throw new Error("invalid StreamTransfer object: \"chunk\" field must be an object or null");
142
- if (obj.params !== undefined && (typeof obj.params !== "object" || !Array.isArray(obj.params)))
144
+ if (!validParams(obj))
143
145
  throw new Error("invalid StreamTransfer object: \"params\" field must be an array");
144
146
  return this.makeStreamTransfer(obj.id, obj.stream, obj.chunk, obj.params, obj.sender, obj.receiver);
145
147
  }
@@ -149,7 +151,7 @@ export default class Msg {
149
151
  throw new Error("invalid ServiceCallRequest object: \"service\" field must be a string");
150
152
  if (anyFieldsExcept(obj, ["type", "id", "service", "params", "sender", "receiver"]))
151
153
  throw new Error("invalid ServiceCallRequest object: contains unknown fields");
152
- if (obj.params !== undefined && (typeof obj.params !== "object" || !Array.isArray(obj.params)))
154
+ if (!validParams(obj))
153
155
  throw new Error("invalid ServiceCallRequest object: \"params\" field must be an array");
154
156
  return this.makeServiceCallRequest(obj.id, obj.service, obj.params, obj.sender, obj.receiver);
155
157
  }
@@ -165,18 +167,20 @@ export default class Msg {
165
167
  throw new Error("invalid ResourceTransferRequest object: \"resource\" field must be a string");
166
168
  if (anyFieldsExcept(obj, ["type", "id", "resource", "params", "sender", "receiver"]))
167
169
  throw new Error("invalid ResourceTransferRequest object: contains unknown fields");
168
- if (obj.params !== undefined && (typeof obj.params !== "object" || !Array.isArray(obj.params)))
170
+ if (!validParams(obj))
169
171
  throw new Error("invalid ResourceTransferRequest object: \"params\" field must be an array");
170
172
  return this.makeResourceTransferRequest(obj.id, obj.resource, obj.params, obj.sender, obj.receiver);
171
173
  }
172
174
  else if (obj.type === "resource-transfer-response") {
173
175
  if (obj.chunk !== undefined && typeof obj.chunk !== "object")
174
- throw new Error("invalid ResourceTransferResponse object: \"chunk\" field must be an object or null");
176
+ throw new Error("invalid ResourceTransferResponse object: \"chunk\" field must be an object");
175
177
  if (obj.error !== undefined && typeof obj.error !== "string")
176
178
  throw new Error("invalid ResourceTransferResponse object: \"error\" field must be a string");
177
- if (anyFieldsExcept(obj, ["type", "id", "chunk", "error", "sender", "receiver"]))
179
+ if (obj.final !== undefined && typeof obj.final !== "boolean")
180
+ throw new Error("invalid ResourceTransferResponse object: \"final\" field must be a boolean");
181
+ if (anyFieldsExcept(obj, ["type", "id", "chunk", "error", "final", "sender", "receiver"]))
178
182
  throw new Error("invalid ResourceTransferResponse object: contains unknown fields");
179
- return this.makeResourceTransferResponse(obj.id, obj.chunk, obj.error, obj.sender, obj.receiver);
183
+ return this.makeResourceTransferResponse(obj.id, obj.chunk, obj.error, obj.final, obj.sender, obj.receiver);
180
184
  }
181
185
  else
182
186
  throw new Error("invalid object: not of any known type");
@@ -102,15 +102,15 @@ export class ResourceTrait extends ServiceTrait {
102
102
  const chunks = [];
103
103
  this.fetchCallback.set(requestId, {
104
104
  resource,
105
- callback: (error, chunk) => {
105
+ callback: (error, chunk, final) => {
106
106
  if (error !== undefined) {
107
107
  cleanup();
108
108
  reject(error);
109
109
  }
110
- else if (chunk !== undefined) {
111
- if (chunk !== null)
110
+ else {
111
+ if (chunk !== undefined)
112
112
  chunks.push(chunk);
113
- else {
113
+ if (final) {
114
114
  cleanup();
115
115
  resolve(Buffer.concat(chunks));
116
116
  }
@@ -159,22 +159,19 @@ export class ResourceTrait extends ServiceTrait {
159
159
  for (let i = 0; i < info.resource.byteLength; i += chunkSize) {
160
160
  const size = Math.min(info.resource.byteLength - i, chunkSize);
161
161
  const chunk = info.resource.subarray(i, i + size);
162
+ const final = (i + size >= info.resource.byteLength);
162
163
  /* generate encoded message */
163
- const request = this.msg.makeResourceTransferResponse(requestId, chunk, undefined, this.options.id, sender);
164
+ const request = this.msg.makeResourceTransferResponse(requestId, chunk, undefined, final, this.options.id, sender);
164
165
  const message = this.codec.encode(request);
165
166
  /* publish message to MQTT topic */
166
167
  this.mqtt.publish(topic, message, { qos: 2 });
167
168
  }
168
- /* send "null" chunk to signal end of stream */
169
- const request = this.msg.makeResourceTransferResponse(requestId, null, undefined, this.options.id, sender);
170
- const message = this.codec.encode(request);
171
- this.mqtt.publish(topic, message, { qos: 2 });
172
169
  })
173
170
  .catch((err) => {
174
171
  /* generate corresponding MQTT topic */
175
172
  const topic = this.options.topicMake(resource, "resource-transfer-response", sender);
176
173
  /* send error */
177
- const request = this.msg.makeResourceTransferResponse(requestId, null, err.message, this.options.id, sender);
174
+ const request = this.msg.makeResourceTransferResponse(requestId, undefined, err.message, true, this.options.id, sender);
178
175
  const message = this.codec.encode(request);
179
176
  this.mqtt.publish(topic, message, { qos: 2 });
180
177
  });
@@ -186,11 +183,12 @@ export class ResourceTrait extends ServiceTrait {
186
183
  /* handle resource response */
187
184
  const requestId = parsed.id;
188
185
  const error = parsed.error;
186
+ const final = parsed.final;
189
187
  let chunk = parsed.chunk;
190
- if (chunk !== null && chunk !== undefined && !Buffer.isBuffer(chunk))
188
+ if (chunk !== undefined && !Buffer.isBuffer(chunk))
191
189
  chunk = Buffer.from(chunk);
192
190
  const handler = this.fetchCallback.get(requestId);
193
- handler?.callback(error ? new Error(error) : undefined, chunk);
191
+ handler?.callback(error ? new Error(error) : undefined, chunk, final);
194
192
  }
195
193
  }
196
194
  }