mqtt-plus 0.9.7 → 0.9.8

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.
@@ -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 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";
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 826 1987"><svg class="d2-3815173987 d2-svg" width="826" height="1987" viewBox="11 51 826 1987"><rect x="11.000000" y="51.000000" width="826.000000" height="1987.000000" rx="0.000000" fill="#ffffff" class=" fill-N7" stroke-width="0" /><style type="text/css"><![CDATA[
2
+ .d2-3815173987 .text {
3
+ font-family: "d2-3815173987-font-regular";
4
4
  }
5
5
  @font-face {
6
- font-family: d2-3961372893-font-regular;
7
- src: url("data:application/font-woff;base64,d09GRgABAAAAAA7kAAoAAAAAFrwAAguFAAAAAAAAAAAAAAAAAAAAAAAAAABPUy8yAAAA9AAAAGAAAABgXd/Vo2NtYXAAAAFUAAAAsgAAAPYEVgWhZ2x5ZgAAAggAAAgyAAALEFSFZWloZWFkAAAKPAAAADYAAAA2G4Ue32hoZWEAAAp0AAAAJAAAACQKhAXraG10eAAACpgAAACUAAAApEUFCJ5sb2NhAAALLAAAAFQAAABUPvxCHG1heHAAAAuAAAAAIAAAACAAQQD2bmFtZQAAC6AAAAMjAAAIFAbDVU1wb3N0AAAOxAAAAB0AAAAg/9EAMgADAgkBkAAFAAACigJYAAAASwKKAlgAAAFeADIBIwAAAgsFAwMEAwICBGAAAvcAAAADAAAAAAAAAABBREJPAEAAIP//Au7/BgAAA9gBESAAAZ8AAAAAAeYClAAAACAAA3ichM07K4UBAIfx3+u87sf9fn+dcwYGyWpkP4MMZ7WIyKh8HrmMSpl9FWWSjcWgv0hWz/yrB4WaAnWlF7RUSqVKQ9O6DZu2bNvVtq/j0LFT5y4SftXan9rRtqfjwJETZ98qT/lU5CNvec9rnvOYh9znLre5yXWucvnz/7/CipZVDZWmJcu61JS69ejVp9+AQXVDho0YNWbchElTps2YNWfegkW+AAAA//8BAAD//zZPLd0AAHicbFVtTBvnHf8/zxlfwOblYp/PNn69B3zYYF58Ph/GxgZjKCEYG7uEl/CSFxJYskUtmxJF6tJNoU00aRua+FBt3VSplZJKm9IkUujUD5ESLWNb0qralK5Kqap+YNWyNzEmTWo5T3cGAtU+nOwP9/z/z+/1oAzGAbCEl4GCcqiGg8ACiIyXqfcKAqFlUZYJR8kCYuhx9ImyhNChsC4S0bWlnqYuvvwyGruEl7e+2bE4N/eb6QsXlB+uf6GE0PtfAAUTALgOLwEDdiDqTDFksbBmPc1qP3pCiaGIFPYRwuz8mbjfcyra1hI7nHxh4NLx5wcymVMLI9NTRxbwkqevoy1brTMMpbuOBNDFjlC0dWszmeqMAgCCcHET1+LXwQlQxvt8UjgSEUMWjvb5CK/Xs2aLRQxFZE6vR/n89w8PLhbik46gPRVITImho4mWAXezcMI4/NrZM6/l2zwRB999Pp+/mGrgw8GQNl/FEsRLYNJwmDjR55MYkSGUQCwWlpk48vfndBSdPfKP53Q6Gi8ps1dDZ8OosPUC+vmVtvmw8jZgbYYHL0EVcHvZMBGKMM8YeNQzH8ulr03/4sK5TD6fOYeXyHB6cIpRPkes8hSNJ7u6w6DdKVDcRP/Er0NQwyzIGkYp7PMJQjPez4BKAMe5sEo7quk93xgiM2J3v7PNPe3u9EvTsdgsCboONcs93pB9ytdZF5k1Sk0d9cFYK9/gqPJXBlKtoWwwWBdxesNNbr/d0FAT7G4Lj4QAgQMAfYWXgFZREcnLEubzB+izB3igr2/rTumu1QBoAy+BDUA0USJnsXBiJCLLImUigs8nEL2epqvv3pocr+SqdVWscXTs9t3JY5W1Nboqu3EGFVDndUuT09lkua7cVW7etIoul2i9CQBY1R7dRBtghzoAjlfFl8MabFrQSGAZoi4QQhFZ0sxwr3P4xz9jGhsCA04Pf7JjPJemKX7YQhLk4vGQ8VB3boRxtxOPOWrxf+uo8rjDEUjx7ivV8RZ/PWDIFzfRl3gVTOApMU9owogsXdpl1hapWvKa05GfP+Sh6FQee7MNMydiM33xbKzX3UU8SaPXGcKr98acwqsvFs4neucmcid5T9HBlThrLm6iG2hD5ff/e3rH0ge75uPdZxOtvbYA2+Js6hUKPXyHpc6bM8YXcvmFOM9FTNaWkfbCnNMsO70qZy3FTfTxDoYSZ9pwQRJ3yJKl3UX/PXoudlwOJDy6QpqmHIO2rrg76hKSvj7jKxez30647IX3ttqjDn9vj+LgWgrtoycBa/f/PdoAK7j3IVBN790NJOXVqEJc95lEclaeOoWw8m7ZaB+J1Trd2T8gXTIqDhs7F7K5hcRL85W28swky0TMLuQbyGQ1nlwAKIn/VOotIslSeJsnwrOsyBLmWCrVe4gL1BysdaTn5tCbibLMwGg5nTROZ3qUKW1GHgB9hFfBrCVzR0uGMCUdmXyeIplQ5rl8U2t9rB6v3pv1thyfUh4ifzrhq1fegGIRegHgNr6DfVAPAHrwvQS7s9fxKhi12YxoEmkTEWg2P0x9cPTNX0/86CheVVwI7itrfz3zve0zxU34M15Vc6Oqw4jMrtxvN/vzVeU6mjYcsBijEj69tWxiEErodDs40MY2DjVjX8ORpikytAsErfeR/Ti2dfsX2oBqqN2n235vs2YLqo7NJZNzsfjpZPJ0PJnJJBNDQ9ueiy/kcwvx9Fzh+fn55wtzoOVGRF+ijW3PPbud+ingfQLHmvbmRr2pN9s4fSI208738PiCFptknTfxCN9udzRceTF/PuGyj7yF9Ptyo3pbRB/v7CmTZG38jsFFWWSovd5Gr+qchwMlg3d58YHUB7vmfvSrMUeDZnCns3krg/TP3L2j6zTaAGYP19vpLBFt6/c7uRqjudrdY0PrY82Rin6dLpRQVksaO4qb6DLagICm8d7+1ur7a+1dKu8Pw9PE70k3trZ6xVo+FRjPBoccDbaIp7nR1VpL0kF/1ig4ZJs36LbxXEWlV/LHsh4ubLIGHJyTNVR65WYh1aDttxY3US8+p36NNI8RSZZFLTC7Xns61Nk/WNF7+bI3UOky1phbjBP9qDJRdvVqj7IRbCvXJWiDNutwcRO9j9ZV3+3zK7NdJ59l+guNrb4Yr/LCDxqPT6Gw8lE6ITSiccU+2NAKSM0H+i1ah0oAkRJN258Ik0i9d2Nk0sAZdAauYnL4l2hd+VtdPyH9dcis2NVzxRbtXO1eHmV534gqPFHjNNYcMJf7I9WG+yMnDTaDzmCuGM2tMC29H+p13bgsFqxDf1H+7e7nvf0eVLm10ToYVLFlAdAKvqTlV61HKRKR1ZLI/uQ7Td325GIaPZYOcDVbD9IAag90FzfhXfQECyAAoG+AXv0tFiGHbqBxfAt8oPJPQwPc1LjzwxNUjexAAciSyPrXnySTpQ7IoXL8icoHp4VQVYQ1W7jHib6+hNgRjXa8c2ptcfHTWevM2sLC2gwg8BVzsLZ9RoioblL5YM36ce19MdHX987229bZTxcX1wBBRfEYGsYP1P0cElEFMsSV/7xBnf7qp6U8EQD0R/wDqFV7XJSJVHpEWntYoj1EJrRJlMmELTd6cGSSk7hXrJJ1WP1vk6yLNs/iwcWH0eWOlZWVlY7l6MOHD1HZ8m4/wltoXd2v9mM+j9ZVXYu/wwMg4ztgAGC0AJfKwup2W61uNx5w2qwul9XmVGdonMOC+i63593v2gixWQkxklonIc5aFYqqA1zHt6AMwCQIIk2frKHGqBp049rk5LX/AQAA//8BAAD//1ekWfgAAAABAAAAAguF1mIcp18PPPUAAwPoAAAAANhdoKEAAAAA3WYvNv46/tsIbwPIAAAAAwACAAAAAAAAAAEAAAPY/u8AAAiY/jr+OghvAAEAAAAAAAAAAAAAAAAAAAApeJwcyjEKggAUx+Hf/40RtIWDiGAEFugiRDQ1NBUkb8ug6zR1irZOYnMHKRfJycjh2z67caIGO1DZhsKuVLamsikLCwhNTPSlsBRXTWZLcn3INCOyGKdlpzdOj1uCWzQcH94Z151QTmAxe70YDxqOdGz1oNSKVDmunLkujNSQ0OLQP/+HjvIHAAD//wEAAP//5gwe0wAAACwALABiAJIAtADcASABMgFgAZgBzAH6AiwCYAKCAqQCsALKAuYDCAM0A2gDnAO8A/wEIgREBGAEkASoBLQEwATMBOYFAAUQBUAFTAViBXgFiAABAAAAKQCMAAwAZgAHAAEAAAAAAAAAAAAAAAAABAADeJyclN1OG1cUhT8H221UNRcVisgNOpdtlYzdCKIErkwJilWEU4/TH6mqNHjGP2I8M/IMUKo+QK/7Fn2LXPU5+hBVr6uzvA02qhSBELDOnL33WWevtQ+wyb9sUKs/BP5q/mC4xnZzz/ADHjWfGt7guPG34fpKTIO48ZvhJl82+oY/4n39D8Mfs1P/2fBDtupHhj/heX3T8Kcbjn8MP2KH9wtcg5f8brjGFoXhB2zyk+ENHmM1a3Ue0zbc4DO2DTfZBgZMqUiZkjHGMWLKmHPmJJSEJMyZMiIhxtGlQ0qlrxmRkGP8v18jQirmRKo4ocKREpISUTKxir8qK+etThxpNbe9DhUTIk6VcUZEhiNnTE5GwpnqVFQU7NGiRclQfAsqSgJKpqQE5MwZ06LHEccMmDClxHGkSp5ZSM6Iiksine8swndmSEJGaazOyYjF04lfouwuxzh6FIpdrXy8VuEpju+U7bnliv2KQL9uhdn6uUs2ERfqZ6qupNq5lIIT7fpzO3wrXLGHu1d/1pl8uEex/leqfMq59I+lVCYmGc5t0SGUg0L3BMeB1l1CdeR7ugx4Q493DLTu0KdPhxMGdHmt3B59HF/T44RDZXSFF3tHcswJP+L4hq5ifO3E+rNQLOEXCnN3KY5z3WNGoZ575oHumuiGd1fYz1C+5o5SOUPNkY900i/TnEWMzRWFGM7Uy6U3SutfbI6Y6S5e25t9Pw0XNnvLKb4i1wx7ty44eeUWjD6kanDLM5f6CYiIyTlVxJCcGS0qrsT7LRHnpDgO1b03mpKKznWOP+dKLkmYiUGXTHXmFPobmW9C4z5c872ztyRWvmd6dn2r+5zi1Ksbjd6pe8u90LqcrCjQMlXzFTcNxTUz7yeaqVX+oXJLvW45z+iTSPVUN7j9DjwnoM0Ou+wz0TlD7VzYG9HWO9HmFfvqwRmJokZydWIVdgl4wS67vOLFWs0OhxzQY/8OHBdZPQ54fWtnXadlFWd1/hSbtvg6nl2vXt5br8/v4MsvNFE3L2Nf2vhuX1i1G/+fEDHzXNzW6p3cE4L/AAAA//8BAAD//wdbTDAAeJxiYGYAg//nGIwYsAAAAAAA//8BAAD//y8BAgMAAAA=");
6
+ font-family: d2-3815173987-font-regular;
7
+ src: url("data:application/font-woff;base64,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");
8
8
  }
9
- .d2-3961372893 .text-italic {
10
- font-family: "d2-3961372893-font-italic";
9
+ .d2-3815173987 .text-italic {
10
+ font-family: "d2-3815173987-font-italic";
11
11
  }
12
12
  @font-face {
13
- font-family: d2-3961372893-font-italic;
14
- src: url("data:application/font-woff;base64,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");
13
+ font-family: d2-3815173987-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,85 +25,92 @@
25
25
  opacity: 0.5;
26
26
  }
27
27
 
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>
28
+ .d2-3815173987 .fill-N1{fill:#303030;}
29
+ .d2-3815173987 .fill-N2{fill:#606060;}
30
+ .d2-3815173987 .fill-N3{fill:#909090;}
31
+ .d2-3815173987 .fill-N4{fill:#c0c0c0;}
32
+ .d2-3815173987 .fill-N5{fill:#e0e0e0;}
33
+ .d2-3815173987 .fill-N6{fill:#f0f0f0;}
34
+ .d2-3815173987 .fill-N7{fill:#ffffff;}
35
+ .d2-3815173987 .fill-B1{fill:#336699;}
36
+ .d2-3815173987 .fill-B2{fill:#6699cc;}
37
+ .d2-3815173987 .fill-B3{fill:#99ccff;}
38
+ .d2-3815173987 .fill-B4{fill:#c0d0ff;}
39
+ .d2-3815173987 .fill-B5{fill:#e0f0ff;}
40
+ .d2-3815173987 .fill-B6{fill:#f0f8ff;}
41
+ .d2-3815173987 .fill-AA2{fill:#cfb098;}
42
+ .d2-3815173987 .fill-AA4{fill:#efd0b8;}
43
+ .d2-3815173987 .fill-AA5{fill:#ffe0c8;}
44
+ .d2-3815173987 .fill-AB4{fill:#efd0b8;}
45
+ .d2-3815173987 .fill-AB5{fill:#ffe0c8;}
46
+ .d2-3815173987 .stroke-N1{stroke:#303030;}
47
+ .d2-3815173987 .stroke-N2{stroke:#606060;}
48
+ .d2-3815173987 .stroke-N3{stroke:#909090;}
49
+ .d2-3815173987 .stroke-N4{stroke:#c0c0c0;}
50
+ .d2-3815173987 .stroke-N5{stroke:#e0e0e0;}
51
+ .d2-3815173987 .stroke-N6{stroke:#f0f0f0;}
52
+ .d2-3815173987 .stroke-N7{stroke:#ffffff;}
53
+ .d2-3815173987 .stroke-B1{stroke:#336699;}
54
+ .d2-3815173987 .stroke-B2{stroke:#6699cc;}
55
+ .d2-3815173987 .stroke-B3{stroke:#99ccff;}
56
+ .d2-3815173987 .stroke-B4{stroke:#c0d0ff;}
57
+ .d2-3815173987 .stroke-B5{stroke:#e0f0ff;}
58
+ .d2-3815173987 .stroke-B6{stroke:#f0f8ff;}
59
+ .d2-3815173987 .stroke-AA2{stroke:#cfb098;}
60
+ .d2-3815173987 .stroke-AA4{stroke:#efd0b8;}
61
+ .d2-3815173987 .stroke-AA5{stroke:#ffe0c8;}
62
+ .d2-3815173987 .stroke-AB4{stroke:#efd0b8;}
63
+ .d2-3815173987 .stroke-AB5{stroke:#ffe0c8;}
64
+ .d2-3815173987 .background-color-N1{background-color:#303030;}
65
+ .d2-3815173987 .background-color-N2{background-color:#606060;}
66
+ .d2-3815173987 .background-color-N3{background-color:#909090;}
67
+ .d2-3815173987 .background-color-N4{background-color:#c0c0c0;}
68
+ .d2-3815173987 .background-color-N5{background-color:#e0e0e0;}
69
+ .d2-3815173987 .background-color-N6{background-color:#f0f0f0;}
70
+ .d2-3815173987 .background-color-N7{background-color:#ffffff;}
71
+ .d2-3815173987 .background-color-B1{background-color:#336699;}
72
+ .d2-3815173987 .background-color-B2{background-color:#6699cc;}
73
+ .d2-3815173987 .background-color-B3{background-color:#99ccff;}
74
+ .d2-3815173987 .background-color-B4{background-color:#c0d0ff;}
75
+ .d2-3815173987 .background-color-B5{background-color:#e0f0ff;}
76
+ .d2-3815173987 .background-color-B6{background-color:#f0f8ff;}
77
+ .d2-3815173987 .background-color-AA2{background-color:#cfb098;}
78
+ .d2-3815173987 .background-color-AA4{background-color:#efd0b8;}
79
+ .d2-3815173987 .background-color-AA5{background-color:#ffe0c8;}
80
+ .d2-3815173987 .background-color-AB4{background-color:#efd0b8;}
81
+ .d2-3815173987 .background-color-AB5{background-color:#ffe0c8;}
82
+ .d2-3815173987 .color-N1{color:#303030;}
83
+ .d2-3815173987 .color-N2{color:#606060;}
84
+ .d2-3815173987 .color-N3{color:#909090;}
85
+ .d2-3815173987 .color-N4{color:#c0c0c0;}
86
+ .d2-3815173987 .color-N5{color:#e0e0e0;}
87
+ .d2-3815173987 .color-N6{color:#f0f0f0;}
88
+ .d2-3815173987 .color-N7{color:#ffffff;}
89
+ .d2-3815173987 .color-B1{color:#336699;}
90
+ .d2-3815173987 .color-B2{color:#6699cc;}
91
+ .d2-3815173987 .color-B3{color:#99ccff;}
92
+ .d2-3815173987 .color-B4{color:#c0d0ff;}
93
+ .d2-3815173987 .color-B5{color:#e0f0ff;}
94
+ .d2-3815173987 .color-B6{color:#f0f8ff;}
95
+ .d2-3815173987 .color-AA2{color:#cfb098;}
96
+ .d2-3815173987 .color-AA4{color:#efd0b8;}
97
+ .d2-3815173987 .color-AA5{color:#ffe0c8;}
98
+ .d2-3815173987 .color-AB4{color:#efd0b8;}
99
+ .d2-3815173987 .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-3815173987);mix-blend-mode:overlay}.sketch-overlay-B2{fill:url(#streaks-normal-d2-3815173987);mix-blend-mode:color-burn}.sketch-overlay-B3{fill:url(#streaks-normal-d2-3815173987);mix-blend-mode:color-burn}.sketch-overlay-B4{fill:url(#streaks-normal-d2-3815173987);mix-blend-mode:color-burn}.sketch-overlay-B5{fill:url(#streaks-bright-d2-3815173987);mix-blend-mode:darken}.sketch-overlay-B6{fill:url(#streaks-bright-d2-3815173987);mix-blend-mode:darken}.sketch-overlay-AA2{fill:url(#streaks-normal-d2-3815173987);mix-blend-mode:color-burn}.sketch-overlay-AA4{fill:url(#streaks-normal-d2-3815173987);mix-blend-mode:color-burn}.sketch-overlay-AA5{fill:url(#streaks-bright-d2-3815173987);mix-blend-mode:darken}.sketch-overlay-AB4{fill:url(#streaks-normal-d2-3815173987);mix-blend-mode:color-burn}.sketch-overlay-AB5{fill:url(#streaks-bright-d2-3815173987);mix-blend-mode:darken}.sketch-overlay-N1{fill:url(#streaks-darker-d2-3815173987);mix-blend-mode:lighten}.sketch-overlay-N2{fill:url(#streaks-dark-d2-3815173987);mix-blend-mode:overlay}.sketch-overlay-N3{fill:url(#streaks-normal-d2-3815173987);mix-blend-mode:color-burn}.sketch-overlay-N4{fill:url(#streaks-normal-d2-3815173987);mix-blend-mode:color-burn}.sketch-overlay-N5{fill:url(#streaks-normal-d2-3815173987);mix-blend-mode:color-burn}.sketch-overlay-N6{fill:url(#streaks-bright-d2-3815173987);mix-blend-mode:darken}.sketch-overlay-N7{fill:url(#streaks-bright-d2-3815173987);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="374.000000" y="52.000000" width="100.000000" height="66.000000" stroke="#cfb098" fill="#ffe0c9" style="stroke-width:2;" /></g><text x="424.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="736.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="786.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 2036.000000" stroke="#6699cc" fill="none" class="connection stroke-B2" style="stroke-width:2;stroke-dasharray:12.000000,11.838767;" mask="url(#d2-3815173987)" /></g><g class="KGJyb2tlciAtLSApWzBd"><path d="M 424.000000 120.000000 L 424.000000 2036.000000" stroke="#cfb098" fill="none" class="connection" style="stroke-width:2;stroke-dasharray:12.000000,11.838767;" mask="url(#d2-3815173987)" /></g><g class="KHNlcnZlciAtLSApWzBd"><path d="M 786.000000 120.000000 L 786.000000 2036.000000" stroke="#6699cc" fill="none" class="connection stroke-B2" style="stroke-width:2;stroke-dasharray:12.000000,11.838767;" mask="url(#d2-3815173987)" /></g><g class="JiMzOTtwcm92aXNpb24oJiMzNDtmb28vYmFyJiMzNDspJiMzOTs="><g class="shape blend" ><rect x="384.000000" y="175.000000" width="442.000000" height="198.000000" stroke="#336699" fill="#e0e0e0" class=" stroke-B1 fill-N5" style="stroke-width:0;" /></g><rect x="389.000000" y="180.000000" width="135.000000" height="21.000000" fill="#e0e0e0" class=" fill-N5" /><text x="456.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="JiMzOTtwdXNoKCYjMzQ7Zm9vL2JhciYjMzQ7KSYjMzk7"><g class="shape blend" ><rect x="22.000000" y="418.000000" width="804.000000" height="718.000000" stroke="#336699" fill="#e0e0e0" class=" stroke-B1 fill-N5" style="stroke-width:0;" /></g><rect x="27.000000" y="423.000000" width="105.000000" height="21.000000" fill="#e0e0e0" class=" fill-N5" /><text x="79.500000" y="439.000000" fill="#303030" class="text fill-N1" style="text-anchor:middle;font-size:16px">push(&#34;foo/bar&#34;)</text></g><g class="JiMzOTtmZXRjaCgmIzM0O2Zvby9iYXImIzM0OykmIzM5Ow=="><g class="shape blend" ><rect x="22.000000" y="1181.000000" width="804.000000" height="824.000000" stroke="#336699" fill="#e0e0e0" class=" stroke-B1 fill-N5" style="stroke-width:0;" /></g><rect x="27.000000" y="1186.000000" width="107.000000" height="21.000000" fill="#e0e0e0" class=" fill-N5" /><text x="80.500000" y="1202.000000" fill="#303030" class="text fill-N1" style="text-anchor:middle;font-size:16px">fetch(&#34;foo/bar&#34;)</text></g><g class="KHNlcnZlciAtJmd0OyBicm9rZXIpWzBd"><marker id="mk-d2-3815173987-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 784.000000 237.000000 L 428.000000 237.000000" stroke="#336699" fill="none" class="connection stroke-B1" style="stroke-width:2;" marker-end="url(#mk-d2-3815173987-3488378134)" mask="url(#d2-3815173987)" /><text x="605.500000" y="235.000000" fill="#606060" class="text-italic fill-N2" style="text-anchor:middle;font-size:16px"><tspan x="605.500000" dy="0.000000">op: subscribe</tspan><tspan x="605.500000" dy="18.500000">topic: foo/bar/resource-transfer-request/any</tspan></text></g><g class="KHNlcnZlciAtJmd0OyBicm9rZXIpWzFd"><path d="M 784.000000 343.000000 L 428.000000 343.000000" stroke="#336699" fill="none" class="connection stroke-B1" style="stroke-width:2;" marker-end="url(#mk-d2-3815173987-3488378134)" mask="url(#d2-3815173987)" /><text x="605.000000" y="341.000000" fill="#606060" class="text-italic fill-N2" style="text-anchor:middle;font-size:16px"><tspan x="605.000000" dy="0.000000">op: subscribe</tspan><tspan x="605.000000" dy="18.500000">topic: foo/bar/resource-transfer-response/any</tspan></text></g><g class="KGNsaWVudCAtJmd0OyBicm9rZXIpWzBd"><path d="M 64.000000 488.000000 L 420.000000 488.000000" stroke="#336699" fill="none" class="connection stroke-B1" style="stroke-width:2;" marker-end="url(#mk-d2-3815173987-3488378134)" mask="url(#d2-3815173987)" /><text x="243.000000" y="478.000000" fill="#606060" class="text-italic fill-N2" style="text-anchor:middle;font-size:16px"><tspan x="243.000000" dy="0.000000">op: publish</tspan><tspan x="243.000000" dy="17.666667">topic: foo/bar/resource-transfer-response/any</tspan><tspan x="243.000000" dy="17.666667">data: Resource-Transfer-Response #1</tspan></text></g><g class="KGJyb2tlciAtJmd0OyBzZXJ2ZXIpWzBd"><path d="M 426.000000 610.000000 L 782.000000 610.000000" stroke="#336699" fill="none" class="connection stroke-B1" style="stroke-width:2;" marker-end="url(#mk-d2-3815173987-3488378134)" mask="url(#d2-3815173987)" /><text x="605.000000" y="600.000000" fill="#606060" class="text-italic fill-N2" style="text-anchor:middle;font-size:16px"><tspan x="605.000000" dy="0.000000">op: publish</tspan><tspan x="605.000000" dy="17.666667">topic: foo/bar/resource-transfer-response/any</tspan><tspan x="605.000000" dy="17.666667">data: Resource-Transfer-Response #1</tspan></text></g><g class="KGNsaWVudCAtJmd0OyBicm9rZXIpWzFd"><path d="M 64.000000 732.000000 L 420.000000 732.000000" stroke="#336699" fill="none" class="connection stroke-B1" style="stroke-width:2;" marker-end="url(#mk-d2-3815173987-3488378134)" mask="url(#d2-3815173987)" /><text x="243.000000" y="722.000000" fill="#606060" class="text-italic fill-N2" style="text-anchor:middle;font-size:16px"><tspan x="243.000000" dy="0.000000">op: publish</tspan><tspan x="243.000000" dy="17.666667">topic: foo/bar/resource-transfer-response/any</tspan><tspan x="243.000000" dy="17.666667">data: Resource-Transfer-Response #N</tspan></text></g><g class="KGJyb2tlciAtJmd0OyBzZXJ2ZXIpWzFd"><path d="M 426.000000 854.000000 L 782.000000 854.000000" stroke="#336699" fill="none" class="connection stroke-B1" style="stroke-width:2;" marker-end="url(#mk-d2-3815173987-3488378134)" mask="url(#d2-3815173987)" /><text x="605.000000" y="844.000000" fill="#606060" class="text-italic fill-N2" style="text-anchor:middle;font-size:16px"><tspan x="605.000000" dy="0.000000">op: publish</tspan><tspan x="605.000000" dy="17.666667">topic: foo/bar/resource-transfer-response/any</tspan><tspan x="605.000000" dy="17.666667">data: Resource-Transfer-Response #N</tspan></text></g><g class="KGNsaWVudCAtJmd0OyBicm9rZXIpWzJd"><path d="M 64.000000 976.000000 L 420.000000 976.000000" stroke="#336699" fill="none" class="connection stroke-B1" style="stroke-width:2;" marker-end="url(#mk-d2-3815173987-3488378134)" mask="url(#d2-3815173987)" /><text x="243.000000" y="966.000000" fill="#606060" class="text-italic fill-N2" style="text-anchor:middle;font-size:16px"><tspan x="243.000000" dy="0.000000">op: publish</tspan><tspan x="243.000000" dy="17.666667">topic: foo/bar/resource-transfer-response/any</tspan><tspan x="243.000000" dy="17.666667">data: Resource-Transfer-Response EoS</tspan></text></g><g class="KGJyb2tlciAtJmd0OyBzZXJ2ZXIpWzJd"><path d="M 426.000000 1098.000000 L 782.000000 1098.000000" stroke="#336699" fill="none" class="connection stroke-B1" style="stroke-width:2;" marker-end="url(#mk-d2-3815173987-3488378134)" mask="url(#d2-3815173987)" /><text x="605.000000" y="1088.000000" fill="#606060" class="text-italic fill-N2" style="text-anchor:middle;font-size:16px"><tspan x="605.000000" dy="0.000000">op: publish</tspan><tspan x="605.000000" dy="17.666667">topic: foo/bar/resource-transfer-response/any</tspan><tspan x="605.000000" dy="17.666667">data: Resource-Transfer-Response EoS</tspan></text></g><g class="KGNsaWVudCAtJmd0OyBicm9rZXIpWzNd"><path d="M 64.000000 1243.000000 L 420.000000 1243.000000" stroke="#336699" fill="none" class="connection stroke-B1" style="stroke-width:2;" marker-end="url(#mk-d2-3815173987-3488378134)" mask="url(#d2-3815173987)" /><text x="243.000000" y="1241.000000" fill="#606060" class="text-italic fill-N2" style="text-anchor:middle;font-size:16px"><tspan x="243.000000" dy="0.000000">op: subscribe</tspan><tspan x="243.000000" dy="18.500000">topic: foo/bar/resource-transfer-response/XXX</tspan></text></g><g class="KGNsaWVudCAtJmd0OyBicm9rZXIpWzRd"><path d="M 64.000000 1357.000000 L 420.000000 1357.000000" stroke="#336699" fill="none" class="connection stroke-B1" style="stroke-width:2;" marker-end="url(#mk-d2-3815173987-3488378134)" mask="url(#d2-3815173987)" /><text x="243.500000" y="1347.000000" fill="#606060" class="text-italic fill-N2" style="text-anchor:middle;font-size:16px"><tspan x="243.500000" dy="0.000000">op: publish</tspan><tspan x="243.500000" dy="17.666667">topic: foo/bar/resource-transfer-request/any</tspan><tspan x="243.500000" dy="17.666667">data: Resource-Transfer-Request</tspan></text></g><g class="KGJyb2tlciAtJmd0OyBzZXJ2ZXIpWzNd"><path d="M 426.000000 1479.000000 L 782.000000 1479.000000" stroke="#336699" fill="none" class="connection stroke-B1" style="stroke-width:2;" marker-end="url(#mk-d2-3815173987-3488378134)" mask="url(#d2-3815173987)" /><text x="605.500000" y="1469.000000" fill="#606060" class="text-italic fill-N2" style="text-anchor:middle;font-size:16px"><tspan x="605.500000" dy="0.000000">op: publish</tspan><tspan x="605.500000" dy="17.666667">topic: foo/bar/resource-transfer-request/any</tspan><tspan x="605.500000" dy="17.666667">data: Resource-Transfer-Request</tspan></text></g><g class="KGJyb2tlciAmbHQ7LSBzZXJ2ZXIpWzBd"><marker id="mk-d2-3815173987-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 428.000000 1601.000000 L 784.000000 1601.000000" stroke="#336699" fill="none" class="connection stroke-B1" style="stroke-width:2;" marker-start="url(#mk-d2-3815173987-2451250203)" mask="url(#d2-3815173987)" /><text x="605.000000" y="1591.000000" fill="#606060" class="text-italic fill-N2" style="text-anchor:middle;font-size:16px"><tspan x="605.000000" dy="0.000000">op: publish</tspan><tspan x="605.000000" dy="17.666667">topic: foo/bar/resource-transfer-response/XXX</tspan><tspan x="605.000000" dy="17.666667">data: Resource-Transfer-Response #1</tspan></text></g><g class="KGNsaWVudCAmbHQ7LSBicm9rZXIpWzBd"><path d="M 66.000000 1723.000000 L 422.000000 1723.000000" stroke="#336699" fill="none" class="connection stroke-B1" style="stroke-width:2;" marker-start="url(#mk-d2-3815173987-2451250203)" mask="url(#d2-3815173987)" /><text x="243.000000" y="1713.000000" fill="#606060" class="text-italic fill-N2" style="text-anchor:middle;font-size:16px"><tspan x="243.000000" dy="0.000000">op: publish</tspan><tspan x="243.000000" dy="17.666667">topic: foo/bar/resource-transfer-response/XXX</tspan><tspan x="243.000000" dy="17.666667">data: Resource-Transfer-Response #1</tspan></text></g><g class="KGJyb2tlciAmbHQ7LSBzZXJ2ZXIpWzFd"><path d="M 428.000000 1845.000000 L 784.000000 1845.000000" stroke="#336699" fill="none" class="connection stroke-B1" style="stroke-width:2;" marker-start="url(#mk-d2-3815173987-2451250203)" mask="url(#d2-3815173987)" /><text x="605.000000" y="1835.000000" fill="#606060" class="text-italic fill-N2" style="text-anchor:middle;font-size:16px"><tspan x="605.000000" dy="0.000000">op: publish</tspan><tspan x="605.000000" dy="17.666667">topic: foo/bar/resource-transfer-response/XXX</tspan><tspan x="605.000000" dy="17.666667">data: Resource-Transfer-Response #N</tspan></text></g><g class="KGNsaWVudCAmbHQ7LSBicm9rZXIpWzFd"><path d="M 66.000000 1967.000000 L 422.000000 1967.000000" stroke="#336699" fill="none" class="connection stroke-B1" style="stroke-width:2;" marker-start="url(#mk-d2-3815173987-2451250203)" mask="url(#d2-3815173987)" /><text x="243.000000" y="1957.000000" fill="#606060" class="text-italic fill-N2" style="text-anchor:middle;font-size:16px"><tspan x="243.000000" dy="0.000000">op: publish</tspan><tspan x="243.000000" dy="17.666667">topic: foo/bar/resource-transfer-response/XXX</tspan><tspan x="243.000000" dy="17.666667">data: Resource-Transfer-Response #N</tspan></text></g><mask id="d2-3815173987" maskUnits="userSpaceOnUse" x="11" y="51" width="826" height="1987">
100
+ <rect x="11" y="51" width="826" height="1987" fill="white"></rect>
101
+ <rect x="457.000000" y="219.000000" width="297" height="37" fill="black"></rect>
102
+ <rect x="452.000000" y="325.000000" width="306" height="37" fill="black"></rect>
103
+ <rect x="90.000000" y="462.000000" width="306" height="53" fill="black"></rect>
104
+ <rect x="452.000000" y="584.000000" width="306" height="53" fill="black"></rect>
105
+ <rect x="90.000000" y="706.000000" width="306" height="53" fill="black"></rect>
106
+ <rect x="452.000000" y="828.000000" width="306" height="53" fill="black"></rect>
107
+ <rect x="90.000000" y="950.000000" width="306" height="53" fill="black"></rect>
108
+ <rect x="452.000000" y="1072.000000" width="306" height="53" fill="black"></rect>
109
+ <rect x="90.000000" y="1225.000000" width="306" height="37" fill="black"></rect>
110
+ <rect x="95.000000" y="1331.000000" width="297" height="53" fill="black"></rect>
111
+ <rect x="457.000000" y="1453.000000" width="297" height="53" fill="black"></rect>
112
+ <rect x="452.000000" y="1575.000000" width="306" height="53" fill="black"></rect>
113
+ <rect x="90.000000" y="1697.000000" width="306" height="53" fill="black"></rect>
114
+ <rect x="452.000000" y="1819.000000" width="306" height="53" fill="black"></rect>
115
+ <rect x="90.000000" y="1941.000000" width="306" height="53" fill="black"></rect>
109
116
  </mask></svg></svg>
@@ -15,6 +15,8 @@ export declare class ResourceTrait<T extends APISchema = APISchema> extends Serv
15
15
  provision<K extends ResourceKeys<T> & string>(resource: K, options: Partial<IClientSubscribeOptions>, callback: WithInfo<T[K], InfoResource>): Promise<Provisioning>;
16
16
  private _collectStreamToBuffer;
17
17
  private _chunkToBuffer;
18
+ private _sendBufferAsChunks;
19
+ private _sendStreamAsChunks;
18
20
  push<K extends ResourceKeys<T> & string>(resource: K, stream: Readable, ...params: Parameters<T[K]>): Promise<void>;
19
21
  push<K extends ResourceKeys<T> & string>(resource: K, stream: Readable, receiver: Receiver, ...params: Parameters<T[K]>): Promise<void>;
20
22
  push<K extends ResourceKeys<T> & string>(resource: K, stream: Readable, options: IClientPublishOptions, ...params: Parameters<T[K]>): Promise<void>;
@@ -113,6 +113,51 @@ export class ResourceTrait extends ServiceTrait {
113
113
  buffer = Buffer.from(String(chunk));
114
114
  return buffer;
115
115
  }
116
+ /* utility function for sending a Buffer as chunks */
117
+ _sendBufferAsChunks(buffer, requestId, resource, params, receiver, topic, options) {
118
+ const chunkSize = this.options.chunkSize;
119
+ if (buffer.byteLength === 0) {
120
+ /* handle empty buffer by sending final chunk */
121
+ const request = this.msg.makeResourceTransferResponse(requestId, resource, params, undefined, undefined, true, this.options.id, receiver);
122
+ const message = this.codec.encode(request);
123
+ this.mqtt.publish(topic, message, { qos: 2, ...options });
124
+ }
125
+ else {
126
+ for (let i = 0; i < buffer.byteLength; i += chunkSize) {
127
+ const size = Math.min(buffer.byteLength - i, chunkSize);
128
+ const chunk = buffer.subarray(i, i + size);
129
+ const final = (i + size >= buffer.byteLength);
130
+ const request = this.msg.makeResourceTransferResponse(requestId, resource, params, chunk, undefined, final, this.options.id, receiver);
131
+ const message = this.codec.encode(request);
132
+ this.mqtt.publish(topic, message, { qos: 2, ...options });
133
+ }
134
+ }
135
+ }
136
+ /* utility function for sending a Readable stream as chunks */
137
+ _sendStreamAsChunks(readable, requestId, resource, params, receiver, topic, options, onEnd, onError) {
138
+ const chunkSize = this.options.chunkSize;
139
+ readable.on("readable", () => {
140
+ let chunk;
141
+ while ((chunk = readable.read(chunkSize)) !== null) {
142
+ const buffer = this._chunkToBuffer(chunk);
143
+ const request = this.msg.makeResourceTransferResponse(requestId, resource, params, buffer, undefined, false, this.options.id, receiver);
144
+ const message = this.codec.encode(request);
145
+ this.mqtt.publish(topic, message, { qos: 2, ...options });
146
+ }
147
+ });
148
+ readable.on("end", () => {
149
+ const request = this.msg.makeResourceTransferResponse(requestId, resource, params, undefined, undefined, true, this.options.id, receiver);
150
+ const message = this.codec.encode(request);
151
+ this.mqtt.publish(topic, message, { qos: 2, ...options });
152
+ onEnd();
153
+ });
154
+ readable.on("error", (err) => {
155
+ const request = this.msg.makeResourceTransferResponse(requestId, resource, params, undefined, err.message, true, this.options.id, receiver);
156
+ const message = this.codec.encode(request);
157
+ this.mqtt.publish(topic, message, { qos: 2, ...options });
158
+ onError(err);
159
+ });
160
+ }
116
161
  push(resource, streamOrBuffer, ...args) {
117
162
  /* determine actual parameters */
118
163
  const { receiver, options, params } = this._parseCallArgs(args);
@@ -122,57 +167,13 @@ export class ResourceTrait extends ServiceTrait {
122
167
  const topic = this.options.topicMake(resource, "resource-transfer-response", receiver);
123
168
  /* iterate over all chunks of the buffer */
124
169
  return new Promise((resolve, reject) => {
125
- const chunkSize = this.options.chunkSize;
126
170
  if (streamOrBuffer instanceof Readable) {
127
171
  /* attach to the readable */
128
- const readable = streamOrBuffer;
129
- readable.on("readable", () => {
130
- let chunk;
131
- while ((chunk = readable.read(chunkSize)) !== null) {
132
- /* ensure data is a Buffer */
133
- const buffer = this._chunkToBuffer(chunk);
134
- /* generate encoded message */
135
- const request = this.msg.makeResourceTransferResponse(rid, resource, params, buffer, undefined, false, this.options.id, receiver);
136
- const message = this.codec.encode(request);
137
- /* publish message to MQTT topic */
138
- this.mqtt.publish(topic, message, { qos: 2, ...options });
139
- }
140
- });
141
- readable.on("end", () => {
142
- /* send final chunk to signal end of stream */
143
- const request = this.msg.makeResourceTransferResponse(rid, resource, params, undefined, undefined, true, this.options.id, receiver);
144
- const message = this.codec.encode(request);
145
- this.mqtt.publish(topic, message, { qos: 2, ...options });
146
- resolve();
147
- });
148
- readable.on("error", (err) => {
149
- const request = this.msg.makeResourceTransferResponse(rid, resource, params, undefined, err.message, true, this.options.id, receiver);
150
- const message = this.codec.encode(request);
151
- this.mqtt.publish(topic, message, { qos: 2, ...options });
152
- reject(err);
153
- });
172
+ this._sendStreamAsChunks(streamOrBuffer, rid, resource, params, receiver, topic, options, () => resolve(), (err) => reject(err));
154
173
  }
155
174
  else if (streamOrBuffer instanceof Buffer) {
156
175
  /* split buffer into chunks and send them */
157
- const buffer = streamOrBuffer;
158
- if (buffer.byteLength === 0) {
159
- /* handle empty buffer by sending final chunk */
160
- const request = this.msg.makeResourceTransferResponse(rid, resource, params, undefined, undefined, true, this.options.id, receiver);
161
- const message = this.codec.encode(request);
162
- this.mqtt.publish(topic, message, { qos: 2, ...options });
163
- }
164
- else {
165
- for (let i = 0; i < buffer.byteLength; i += chunkSize) {
166
- const size = Math.min(buffer.byteLength - i, chunkSize);
167
- const chunk = buffer.subarray(i, i + size);
168
- const final = (i + size >= buffer.byteLength);
169
- /* generate encoded message */
170
- const request = this.msg.makeResourceTransferResponse(rid, resource, params, chunk, undefined, final, this.options.id, receiver);
171
- const message = this.codec.encode(request);
172
- /* publish message to MQTT topic */
173
- this.mqtt.publish(topic, message, { qos: 2, ...options });
174
- }
175
- }
176
+ this._sendBufferAsChunks(streamOrBuffer, rid, resource, params, receiver, topic, options);
176
177
  resolve();
177
178
  }
178
179
  });
@@ -252,8 +253,7 @@ export class ResourceTrait extends ServiceTrait {
252
253
  const receiver = parsed.receiver;
253
254
  const info = { sender, receiver, resource: null };
254
255
  /* generate corresponding MQTT topic */
255
- const topic = this.options.topicMake(resource, "resource-transfer-response", sender);
256
- const chunkSize = this.options.chunkSize;
256
+ const responseTopic = this.options.topicMake(resource, "resource-transfer-response", sender);
257
257
  /* call the handler callback */
258
258
  Promise.resolve()
259
259
  .then(() => handler(...params, info))
@@ -263,54 +263,17 @@ export class ResourceTrait extends ServiceTrait {
263
263
  throw new Error("received no data in info \"resource\" field");
264
264
  /* handle Readable stream result */
265
265
  if (info.resource instanceof Readable) {
266
- const readable = info.resource;
267
- readable.on("readable", () => {
268
- let chunk;
269
- while ((chunk = readable.read(chunkSize)) !== null) {
270
- const buffer = this._chunkToBuffer(chunk);
271
- const request = this.msg.makeResourceTransferResponse(requestId, resource, undefined, buffer, undefined, false, this.options.id, sender);
272
- const message = this.codec.encode(request);
273
- this.mqtt.publish(topic, message, { qos: 2 });
274
- }
275
- });
276
- readable.on("end", () => {
277
- const request = this.msg.makeResourceTransferResponse(requestId, resource, undefined, undefined, undefined, true, this.options.id, sender);
278
- const message = this.codec.encode(request);
279
- this.mqtt.publish(topic, message, { qos: 2 });
280
- });
281
- readable.on("error", (err) => {
282
- const request = this.msg.makeResourceTransferResponse(requestId, resource, undefined, undefined, err.message, true, this.options.id, sender);
283
- const message = this.codec.encode(request);
284
- this.mqtt.publish(topic, message, { qos: 2 });
285
- });
266
+ this._sendStreamAsChunks(info.resource, requestId, resource, undefined, sender, responseTopic, {}, () => { }, () => { });
286
267
  }
287
268
  /* handle Buffer result */
288
- else if (info.resource instanceof Buffer) {
289
- const buffer = info.resource;
290
- /* split Buffer into chunks and send them back */
291
- if (buffer.byteLength === 0) {
292
- /* handle empty buffer by sending final chunk */
293
- const request = this.msg.makeResourceTransferResponse(requestId, resource, undefined, undefined, undefined, true, this.options.id, sender);
294
- const message = this.codec.encode(request);
295
- this.mqtt.publish(topic, message, { qos: 2 });
296
- }
297
- else {
298
- for (let i = 0; i < buffer.byteLength; i += chunkSize) {
299
- const size = Math.min(buffer.byteLength - i, chunkSize);
300
- const chunk = buffer.subarray(i, i + size);
301
- const final = (i + size >= buffer.byteLength);
302
- const request = this.msg.makeResourceTransferResponse(requestId, resource, undefined, chunk, undefined, final, this.options.id, sender);
303
- const message = this.codec.encode(request);
304
- this.mqtt.publish(topic, message, { qos: 2 });
305
- }
306
- }
307
- }
269
+ else if (info.resource instanceof Buffer)
270
+ this._sendBufferAsChunks(info.resource, requestId, resource, undefined, sender, responseTopic, {});
308
271
  })
309
272
  .catch((err) => {
310
273
  /* send error */
311
274
  const request = this.msg.makeResourceTransferResponse(requestId, resource, undefined, undefined, err.message, true, this.options.id, sender);
312
275
  const message = this.codec.encode(request);
313
- this.mqtt.publish(topic, message, { qos: 2 });
276
+ this.mqtt.publish(responseTopic, message, { qos: 2 });
314
277
  });
315
278
  }
316
279
  }