Skip to content
Snippets Groups Projects
Commit ff7d9f00 authored by Marin Karamihalev's avatar Marin Karamihalev
Browse files

index & protocol: fixed error throwing so that all errors can be caught

parent 8927d1db
No related branches found
Tags 0.0.10
No related merge requests found
Pipeline #10985 failed
{ {
"name": "usp-js", "name": "usp-js",
"version": "0.0.9", "version": "0.0.10",
"description": "Helper library for easy usp communication using mqtt over tcp or ws.", "description": "Helper library for easy usp communication using mqtt over tcp or ws.",
"main": "build/index.js", "main": "build/index.js",
"scripts": { "scripts": {
......
...@@ -68,7 +68,10 @@ ...@@ -68,7 +68,10 @@
<h1>usp-js</h1> <h1>usp-js</h1>
</a> </a>
<p>Helper library for easy usp communication using mqtt over tcp or ws.</p> <p>Helper library for easy usp communication using mqtt over tcp or ws.</p>
<p><a href="https://usp-data-models.broadband-forum.org/tr-181-2-13-0-usp.html">USP Reference</a></p> <ul>
<li><a href="https://iopsys.se/usp-js/index.html">API documentation for usp-js</a></li>
<li><a href="https://usp-data-models.broadband-forum.org/tr-181-2-13-0-usp.html">BBF&#39;s USP reference documentation</a></li>
</ul>
<a href="#installation" id="installation" style="color: inherit; text-decoration: none;"> <a href="#installation" id="installation" style="color: inherit; text-decoration: none;">
<h1>Installation</h1> <h1>Installation</h1>
</a> </a>
...@@ -76,14 +79,19 @@ ...@@ -76,14 +79,19 @@
<a href="#usage" id="usage" style="color: inherit; text-decoration: none;"> <a href="#usage" id="usage" style="color: inherit; text-decoration: none;">
<h1>Usage</h1> <h1>Usage</h1>
</a> </a>
<pre><code class="language-javascript"><span class="hljs-keyword">const</span> connect = <span class="hljs-built_in">require</span>(<span class="hljs-string">&quot;usp-js&quot;</span>).default <p>To connect provide necessary info to the default export. (Values will differ depending on setup)</p>
<pre><code class="language-javascript"><span class="hljs-keyword">const</span> connect = <span class="hljs-built_in">require</span>(<span class="hljs-string">&quot;usp-js&quot;</span>).default;
<span class="hljs-keyword">const</span> run = <span class="hljs-keyword">async</span> () =&gt; { <span class="hljs-keyword">const</span> run = <span class="hljs-keyword">async</span> () =&gt; {
<span class="hljs-comment">// Connect</span> <span class="hljs-comment">// Connect</span>
<span class="hljs-keyword">const</span> usp = <span class="hljs-keyword">await</span> connect({ <span class="hljs-keyword">const</span> usp = <span class="hljs-keyword">await</span> connect({
<span class="hljs-attr">host</span>: <span class="hljs-string">&quot;192.168.1.1&quot;</span>, <span class="hljs-attr">host</span>: <span class="hljs-string">&quot;my.ip.here&quot;</span>,
<span class="hljs-attr">username</span>: <span class="hljs-string">&quot;admin&quot;</span>, <span class="hljs-attr">username</span>: <span class="hljs-string">&quot;username&quot;</span>,
<span class="hljs-attr">password</span>: <span class="hljs-string">&quot;admin&quot;</span> <span class="hljs-attr">password</span>: <span class="hljs-string">&quot;password&quot;</span>,
<span class="hljs-attr">port</span>: <span class="hljs-number">90001</span>,
<span class="hljs-attr">protocol</span>: <span class="hljs-string">&quot;ws&quot;</span>,
<span class="hljs-attr">fromId</span>: <span class="hljs-string">&quot;from::id&quot;</span>,
<span class="hljs-attr">toId</span>: <span class="hljs-string">&quot;to::id&quot;</span>,
}); });
<span class="hljs-comment">// Get property</span> <span class="hljs-comment">// Get property</span>
...@@ -98,89 +106,91 @@ run();</code></pre> ...@@ -98,89 +106,91 @@ run();</code></pre>
<h1>API</h1> <h1>API</h1>
</a> </a>
<ul> <ul>
<li><p>Connect</p> <li>Connect</li>
<pre><code class="language-javascript"><span class="hljs-comment">// options are based on https://github.com/mqttjs/MQTT.js#mqttconnecturl-options</span> </ul>
<pre><code class="language-javascript"><span class="hljs-comment">// options are based on https://github.com/mqttjs/MQTT.js#mqttconnecturl-options</span>
<span class="hljs-comment">// they additionaly require fromId and toId, more info: url.here</span> <span class="hljs-comment">// they additionaly require fromId and toId, more info: url.here</span>
<span class="hljs-keyword">const</span> usp = <span class="hljs-keyword">await</span> connect(options);</code></pre> <span class="hljs-keyword">const</span> usp = <span class="hljs-keyword">await</span> connect(options);</code></pre>
</li> <ul>
<li><p>Get</p> <li><p>Get</p>
<ul> <ul>
<li><p>get object - all object end with a dot</p> <li>get object - all object end with a dot</li>
<pre><code class="language-javascript"><span class="hljs-keyword">await</span> usp.get(<span class="hljs-string">&quot;Device.Time.&quot;</span>); </ul>
<pre><code class="language-javascript"><span class="hljs-keyword">await</span> usp.get(<span class="hljs-string">&quot;Device.Time.&quot;</span>);
<span class="hljs-comment">// =&gt; {</span> <span class="hljs-comment">// =&gt; {</span>
<span class="hljs-comment">// &quot;CurrentLocalTime&quot;: &quot;2020-12-15T12:33:19Z&quot;,</span> <span class="hljs-comment">// &quot;CurrentLocalTime&quot;: &quot;2020-12-15T12:33:19Z&quot;,</span>
<span class="hljs-comment">// &quot;Enable&quot;: true,</span> <span class="hljs-comment">// &quot;Enable&quot;: true,</span>
<span class="hljs-comment">// ...</span> <span class="hljs-comment">// ...</span>
<span class="hljs-comment">// }</span></code></pre> <span class="hljs-comment">// }</span></code></pre>
</li> <ul>
<li><p>get property</p> <li>get property</li>
<pre><code class="language-javascript"><span class="hljs-keyword">await</span> usp.get(<span class="hljs-string">&quot;Device.Time.CurrentLocalTime&quot;</span>); <span class="hljs-comment">// =&gt; &quot;2020-12-15T12:33:19Z&quot;</span></code></pre> </ul>
</li> <pre><code class="language-javascript"><span class="hljs-keyword">await</span> usp.get(<span class="hljs-string">&quot;Device.Time.CurrentLocalTime&quot;</span>); <span class="hljs-comment">// =&gt; &quot;2020-12-15T12:33:19Z&quot;</span></code></pre>
<li><p>get multiple paths</p> <ul>
<pre><code class="language-javascript"><span class="hljs-keyword">await</span> usp.get([<span class="hljs-string">&quot;Device.WiFi.Radio.1.&quot;</span>, <span class="hljs-string">&quot;Device.WiFi.Radio.2.&quot;</span>]); <li>get multiple paths</li>
</ul>
<pre><code class="language-javascript"><span class="hljs-keyword">await</span> usp.get([<span class="hljs-string">&quot;Device.WiFi.Radio.1.&quot;</span>, <span class="hljs-string">&quot;Device.WiFi.Radio.2.&quot;</span>]);
<span class="hljs-comment">// =&gt; [</span> <span class="hljs-comment">// =&gt; [</span>
<span class="hljs-comment">// { ... },</span> <span class="hljs-comment">// { ... },</span>
<span class="hljs-comment">// { ... }</span> <span class="hljs-comment">// { ... }</span>
<span class="hljs-comment">// ]</span></code></pre> <span class="hljs-comment">// ]</span></code></pre>
</li> <ul>
<li><p>get using pattern</p> <li>get using pattern</li>
<pre><code class="language-javascript"><span class="hljs-keyword">await</span> usp.get(<span class="hljs-string">&#x27;Device.Ethernet.Interface.[Alias==&quot;WAN&quot;].CurrentBitRate&#x27;</span>); <span class="hljs-comment">// =&gt; 0</span></code></pre> </ul>
</li> <pre><code class="language-javascript"><span class="hljs-keyword">await</span> usp.get(<span class="hljs-string">&#x27;Device.Ethernet.Interface.[Alias==&quot;WAN&quot;].CurrentBitRate&#x27;</span>); <span class="hljs-comment">// =&gt; 0</span></code></pre>
<li><p>resolve references in get</p> <ul>
<pre><code class="language-javascript"><span class="hljs-keyword">await</span> usp.get(<span class="hljs-string">&quot;Device.WiFi.Radio.1.&quot;</span>).then(usp.resolve); <span class="hljs-comment">// =&gt; { ... }</span> <li>resolve references in get</li>
<span class="hljs-comment">// or if deeper resolution is needed (be careful when using level, going above 3 often causes an infinite reference loop)</span>
<span class="hljs-keyword">await</span> usp.get(<span class="hljs-string">&quot;Device.WiFi.Radio.1.&quot;</span>).then(<span class="hljs-function"><span class="hljs-params">msg</span> =&gt;</span> usp.resolve(msg, <span class="hljs-number">3</span> <span class="hljs-comment">/* level - defaults to 1 */</span>)); <span class="hljs-comment">// =&gt; { ... } </span></code></pre>
</li>
</ul> </ul>
<pre><code class="language-javascript"><span class="hljs-keyword">await</span> usp.get(<span class="hljs-string">&quot;Device.WiFi.Radio.1.&quot;</span>).then(usp.resolve); <span class="hljs-comment">// =&gt; { ... }</span>
<span class="hljs-comment">// or if deeper resolution is needed (be careful when using level, going above 3 often causes an infinite reference loop)</span>
<span class="hljs-keyword">await</span> usp
.get(<span class="hljs-string">&quot;Device.WiFi.Radio.1.&quot;</span>)
.then(<span class="hljs-function">(<span class="hljs-params">msg</span>) =&gt;</span> usp.resolve(msg, <span class="hljs-number">3</span> <span class="hljs-comment">/* level - defaults to 1 */</span>)); <span class="hljs-comment">// =&gt; { ... }</span></code></pre>
</li> </li>
</ul>
<ul>
<li><p>Set</p> <li><p>Set</p>
<ul> <ul>
<li><p>set object - does not need to have all attributes, but some may be required (check USP Reference)</p> <li>set object - does not need to have all attributes, but some may be required (check USP Reference)</li>
<pre><code class="language-javascript"><span class="hljs-keyword">await</span> usp.set(<span class="hljs-string">&quot;Device.WiFi.Radio.1.&quot;</span>, { <span class="hljs-attr">Name</span>: <span class="hljs-string">&quot;radio-1&quot;</span> }); <span class="hljs-comment">// =&gt; void</span></code></pre>
</li>
<li><p>set property</p>
<pre><code class="language-javascript"><span class="hljs-keyword">await</span> usp.set(<span class="hljs-string">&quot;Device.WiFi.Radio.1.Name&quot;</span>, <span class="hljs-string">&quot;radio-1&quot;</span>); <span class="hljs-comment">// =&gt; void</span></code></pre>
</li>
</ul> </ul>
<pre><code class="language-javascript"><span class="hljs-keyword">await</span> usp.set(<span class="hljs-string">&quot;Device.WiFi.Radio.1.&quot;</span>, { <span class="hljs-attr">Name</span>: <span class="hljs-string">&quot;radio-1&quot;</span> }); <span class="hljs-comment">// =&gt; void</span></code></pre>
<ul>
<li>set property</li>
</ul>
<pre><code class="language-javascript"><span class="hljs-keyword">await</span> usp.set(<span class="hljs-string">&quot;Device.WiFi.Radio.1.Name&quot;</span>, <span class="hljs-string">&quot;radio-1&quot;</span>); <span class="hljs-comment">// =&gt; void</span></code></pre>
</li> </li>
<li><p>Operate - WIP (response message not working yet)</p> <li><p>Operate - WIP (response message not working yet)</p>
<ul> <ul>
<li><p>operate without no arguments</p> <li>operate without no arguments</li>
<pre><code class="language-javascript"><span class="hljs-keyword">await</span> usp.operate(<span class="hljs-string">&quot;Device.SelfTestDiagnostics()&quot;</span>);</code></pre> </ul>
</li> <pre><code class="language-javascript"><span class="hljs-keyword">await</span> usp.operate(<span class="hljs-string">&quot;Device.SelfTestDiagnostics()&quot;</span>);</code></pre>
<li><p>operate with arguments (for required args check USP Reference)</p> <ul>
<pre><code class="language-javascript"><span class="hljs-keyword">const</span> [ping, cleanPing] = <span class="hljs-keyword">await</span> usp.operate(<span class="hljs-string">&quot;Device.IP.Diagnostics.IPPing()&quot;</span>); <li>operate with arguments (for required args check USP Reference)</li>
<span class="hljs-keyword">const</span> results = <span class="hljs-keyword">await</span> ping({ <span class="hljs-attr">Host</span>: <span class="hljs-string">&quot;iopsys.eu&quot;</span> })
<span class="hljs-keyword">await</span> cleanPing() <span class="hljs-comment">// clears ping subscription (optional)</span></code></pre>
</li>
</ul> </ul>
<pre><code class="language-javascript"><span class="hljs-keyword">const</span> [ping, cleanPing] = <span class="hljs-keyword">await</span> usp.operate(<span class="hljs-string">&quot;Device.IP.Diagnostics.IPPing()&quot;</span>);
<span class="hljs-keyword">const</span> results = <span class="hljs-keyword">await</span> ping({ <span class="hljs-attr">Host</span>: <span class="hljs-string">&quot;iopsys.eu&quot;</span> });
<span class="hljs-keyword">await</span> cleanPing(); <span class="hljs-comment">// clears ping subscription (optional)</span></code></pre>
</li> </li>
</ul>
<ul>
<li><p>Add</p> <li><p>Add</p>
<ul> <ul>
<li><p>add with no arguments - adds a new default object</p> <li>add with no arguments - adds a new default object</li>
<pre><code class="language-javascript"><span class="hljs-keyword">await</span> usp.add(<span class="hljs-string">&quot;Device.NAT.PortMapping.&quot;</span>); <span class="hljs-comment">// =&gt; &quot;Device.NAT.PortMapping.3.&quot;</span></code></pre>
</li>
<li><p>add with arguments - adds a new object with provided values</p>
<pre><code class="language-javascript"><span class="hljs-keyword">await</span> usp.add(<span class="hljs-string">&quot;Device.NAT.PortMapping.&quot;</span>, {
<span class="hljs-attr">Description</span>: <span class="hljs-string">&quot;webserver1-set&quot;</span>,
<span class="hljs-attr">ExternalPort</span>: <span class="hljs-string">&quot;80&quot;</span>,
<span class="hljs-attr">Protocol</span>: <span class="hljs-string">&quot;TCP&quot;</span>,
<span class="hljs-attr">Interface</span>: <span class="hljs-string">&quot;Device.IP.Interface.1&quot;</span>,
<span class="hljs-attr">Enable</span>: <span class="hljs-string">&quot;true&quot;</span>,
<span class="hljs-attr">InternalClient</span>: <span class="hljs-string">&quot;192.168.1.125&quot;</span>,
<span class="hljs-attr">InternalPort</span>: <span class="hljs-string">&quot;5000&quot;</span>,
}); <span class="hljs-comment">// =&gt; &quot;Device.NAT.PortMapping.4.&quot;</span></code></pre>
</li>
</ul> </ul>
<pre><code class="language-javascript"><span class="hljs-keyword">await</span> usp.add(<span class="hljs-string">&quot;Device.NAT.PortMapping.&quot;</span>); <span class="hljs-comment">// =&gt; &quot;Device.NAT.PortMapping.3.&quot;</span></code></pre>
<ul>
<li>add with arguments - adds a new object with provided values</li>
</ul>
<pre><code class="language-javascript"><span class="hljs-keyword">await</span> usp.add(<span class="hljs-string">&quot;Device.NAT.PortMapping.&quot;</span>, {
<span class="hljs-attr">Description</span>: <span class="hljs-string">&quot;webserver1-set&quot;</span>,
<span class="hljs-attr">ExternalPort</span>: <span class="hljs-string">&quot;80&quot;</span>,
<span class="hljs-attr">Protocol</span>: <span class="hljs-string">&quot;TCP&quot;</span>,
<span class="hljs-attr">Interface</span>: <span class="hljs-string">&quot;Device.IP.Interface.1&quot;</span>,
<span class="hljs-attr">Enable</span>: <span class="hljs-string">&quot;true&quot;</span>,
<span class="hljs-attr">InternalClient</span>: <span class="hljs-string">&quot;192.168.1.125&quot;</span>,
<span class="hljs-attr">InternalPort</span>: <span class="hljs-string">&quot;5000&quot;</span>,
}); <span class="hljs-comment">// =&gt; &quot;Device.NAT.PortMapping.4.&quot;</span></code></pre>
</li> </li>
<li><p>Delete</p> <li><p>Delete</p>
<pre><code class="language-javascript"><span class="hljs-keyword">await</span> usp.del(<span class="hljs-string">&quot;Device.NAT.PortMapping.4.&quot;</span>); <span class="hljs-comment">// =&gt; void</span></code></pre>
</li> </li>
</ul> </ul>
<pre><code class="language-javascript"><span class="hljs-keyword">await</span> usp.del(<span class="hljs-string">&quot;Device.NAT.PortMapping.4.&quot;</span>); <span class="hljs-comment">// =&gt; void</span></code></pre>
</div> </div>
</div> </div>
<div class="col-4 col-menu menu-sticky-wrap menu-highlight"> <div class="col-4 col-menu menu-sticky-wrap menu-highlight">
......
import use from "./protocol"; import use from "./protocol";
import config from "./config.json"; import config from "./config.json";
import mqttAsync from "async-mqtt";
import { makeRouter, timer, loopTimer } from "./lib"; import { makeRouter, timer, loopTimer } from "./lib";
/** /**
...@@ -44,24 +43,14 @@ const resolveReferences = async ( ...@@ -44,24 +43,14 @@ const resolveReferences = async (
/** /**
* Shorthand for throwing message-related error * Shorthand for throwing message-related error
*/ */
const throwMsgError = (path: string | string[]) => ({ const throwMsgError = (path: string | string[], reject: (err: any) => void) => (
data: { reason }, err: any
}: ErrorMessage) => { ) => {
throw { reject({
type: "error", type: "error",
path: Array.isArray(path) ? path.join(",") : path, path: Array.isArray(path) ? path.join(",") : path,
reason, reason: err,
} as DeviceError; });
};
/**
* Shorthand for throwing generic error
*/
const throwError = (reason: any): void => {
throw {
type: "error",
reason,
} as DeviceError;
}; };
/** /**
...@@ -96,43 +85,60 @@ const decode = (msg: USPMessage): JSType | void => { ...@@ -96,43 +85,60 @@ const decode = (msg: USPMessage): JSType | void => {
/** /**
* Wrapper function for sending message (decode message and catch errors) * Wrapper function for sending message (decode message and catch errors)
*/ */
const handleSend = (msg: Promise<USPMessage>, path: string | string[]) => const handleSend = (
msg.then(decode).catch(throwMsgError(path)); msg: Promise<USPMessage>,
path: string | string[],
reject: RejectFn
) => {
try {
return msg.then(decode);
} catch (reason) {
throwMsgError(path, reject)(reason);
}
};
/** /**
* Make get function * Make get function
*/ */
const makeGet = (send: SendFn) => (path: string | string[]) => const makeGet = (send: SendFn, reject: RejectFn) => (path: string | string[]) =>
handleSend( handleSend(
send("get", Array.isArray(path) ? { paths: path } : { path }), send("get", Array.isArray(path) ? { paths: path } : { path }),
path path,
reject
) as Promise<JSType>; ) as Promise<JSType>;
/** /**
* Make set function * Make set function
*/ */
const makeSet = (send: SendFn) => (path: string, value: JSType) => const makeSet = (send: SendFn, reject: RejectFn) => (
path: string,
value: JSType
) =>
handleSend( handleSend(
send("set", { send("set", {
path, path,
value, value,
}), }),
path path,
reject
) as Promise<void>; ) as Promise<void>;
/** /**
* Make add function * Make add function
*/ */
const makeAdd = (send: SendFn) => (path: string, input?: JSObject) => const makeAdd = (send: SendFn, reject: RejectFn) => (
handleSend(send("add", { path, input }), path) as Promise<string>; path: string,
input?: JSObject
) => handleSend(send("add", { path, input }), path, reject) as Promise<string>;
/** /**
* Make del function * Make del function
*/ */
const makeDel = (send: SendFn) => (path: string | string[]) => const makeDel = (send: SendFn, reject: RejectFn) => (path: string | string[]) =>
handleSend( handleSend(
send("delete", Array.isArray(path) ? { paths: path } : { path }), send("delete", Array.isArray(path) ? { paths: path } : { path }),
path path,
reject
) as Promise<void>; ) as Promise<void>;
const operateSubscriptionPath = "Device.LocalAgent.Subscription."; const operateSubscriptionPath = "Device.LocalAgent.Subscription.";
...@@ -142,7 +148,12 @@ type DelFn = (path: string | string[]) => Promise<void>; ...@@ -142,7 +148,12 @@ type DelFn = (path: string | string[]) => Promise<void>;
/** /**
* Make operate function * Make operate function
*/ */
const makeOperate = (send: SendFn, add: AddFn, del: DelFn) => async ( const makeOperate = (
send: SendFn,
add: AddFn,
del: DelFn,
reject: RejectFn
) => async (
path: string, path: string,
opts?: OperateOptions opts?: OperateOptions
): Promise<[OperateFunction, OperateCleanupFunction]> => { ): Promise<[OperateFunction, OperateCleanupFunction]> => {
...@@ -165,7 +176,8 @@ const makeOperate = (send: SendFn, add: AddFn, del: DelFn) => async ( ...@@ -165,7 +176,8 @@ const makeOperate = (send: SendFn, add: AddFn, del: DelFn) => async (
input, input,
operateID: ID, operateID: ID,
}), }),
path path,
reject
) as Promise<JSType>; ) as Promise<JSType>;
const cleanup = () => del(newSubPath); const cleanup = () => del(newSubPath);
...@@ -181,70 +193,76 @@ const makeOperate = (send: SendFn, add: AddFn, del: DelFn) => async ( ...@@ -181,70 +193,76 @@ const makeOperate = (send: SendFn, add: AddFn, del: DelFn) => async (
const connect = async ( const connect = async (
opts: ConnectOptions, opts: ConnectOptions,
events: ConnectEvents = {} events: ConnectEvents = {}
): Promise<Device> => { ): Promise<Device> =>
// Init values new Promise(async (resolve, reject) => {
const router = makeRouter(); // Init values
const router = makeRouter();
let restartTimeout: () => void = () => null;
let sessionID: string = ""; let restartTimeout: () => void = () => null;
let roles: Role[] = ["none"]; let sessionID: string = "";
let roles: Role[] = ["none"];
// Setup protocol
const protocol = use(opts, {
onMessage: (resp: USPMessage) => {
// Handle message
const handle = router.get(resp.id);
if (isPromiseResult(handle)) {
if (isError(resp)) handle.reject(resp);
else handle.resolve(resp);
}
},
});
/** // Setup protocol
* Send message to device const protocol = use(opts, {
*/ onMessage: (resp: USPMessage) => {
const send: SendFn = (command, args) => // Handle message
new Promise((resolve, reject) => { const handle = router.get(resp.id);
const msg = protocol.encode(command, args); if (isPromiseResult(handle)) {
router.add(msg.id, { resolve, reject }); if (isError(resp)) handle.reject(resp.data.reason);
protocol.send(msg); else handle.resolve(resp);
restartTimeout(); }
},
}); });
// Connection timeout timer /**
const stopTimer = timer(config.connectionTimeout, () => * Send message to device
throwError("Connection timed out") */
); const send: SendFn = (command, args) =>
new Promise((resolve, reject) => {
// Initialize connection try {
await protocol const msg = protocol.encode(command, args);
.init() router.add(msg.id, { resolve, reject });
.then(({ timeout }) => { protocol.send(msg);
stopTimer(); restartTimeout();
if (events && events.onTimeout) } catch (err) {
restartTimeout = loopTimer(timeout, () => { reject(err);
protocol.close(); }
(events as any).onTimeout(); });
});
}) // Connection timeout timer
.catch(throwError); const stopTimer = timer(config.connectionTimeout, () =>
reject("Connection timed out")
const get = makeGet(send); );
const add = makeAdd(send);
const del = makeDel(send); // Initialize connection
return { await protocol
id: () => sessionID, .init()
roles: () => roles, .then(({ timeout }) => {
get, stopTimer();
set: makeSet(send), if (events && events.onTimeout)
add, restartTimeout = loopTimer(timeout, () => {
del, protocol.close();
operate: makeOperate(send, add, del), (events as any).onTimeout();
disconnect: protocol.close, });
resolve: async (data: JSType, level = 1) => })
await resolveReferences(data, get, level), .catch(reject);
};
}; const get = makeGet(send, reject);
const add = makeAdd(send, reject);
const del = makeDel(send, reject);
resolve({
id: () => sessionID,
roles: () => roles,
get,
set: makeSet(send, reject),
add,
del,
operate: makeOperate(send, add, del, reject),
disconnect: protocol.close,
resolve: async (data: JSType, level = 1) =>
await resolveReferences(data, get, level),
});
});
export default connect; export default connect;
import mqttAsync from "async-mqtt"; import mqttAsync from "async-mqtt";
import { parse } from "protobufjs";
import * as messages from "./js-usp-protobuf/protoMessage"; import * as messages from "./js-usp-protobuf/protoMessage";
import { search, searchAll, unflatten, unwrapArray, unwrapObject } from "./lib"; import { search, searchAll, unflatten, unwrapArray, unwrapObject } from "./lib";
......
...@@ -248,3 +248,5 @@ interface MQTTRequest { ...@@ -248,3 +248,5 @@ interface MQTTRequest {
/** Message data */ /** Message data */
data: any; data: any;
} }
type RejectFn = (reason?: any) => void
\ No newline at end of file
...@@ -3,8 +3,8 @@ ...@@ -3,8 +3,8 @@
"host": "192.168.1.1", "host": "192.168.1.1",
"username": "admin", "username": "admin",
"password": "admin", "password": "admin",
"fromId": "self::usp-controller", "fromId": "proto::interop-usp-controller",
"toId": "proto::rx_usp_agent_mqtt" "toId": "os::002207-E40A24H17A022443"
}, },
"ws": { "ws": {
"host": "192.168.1.1", "host": "192.168.1.1",
...@@ -12,7 +12,7 @@ ...@@ -12,7 +12,7 @@
"password": "admin", "password": "admin",
"port": 9001, "port": 9001,
"protocol": "ws", "protocol": "ws",
"fromId": "self::usp-controller", "fromId": "proto::interop-usp-controller",
"toId": "proto::rx_usp_agent_mqtt" "toId": "os::002207-E40A24H17A022443"
} }
} }
const assert = require("assert"); const assert = require("assert");
const connect = require("../../build").default; const connect = require("../../build/src").default;
const config = require("./config.json"); const config = require("./config.json");
describe("Test general API", () => { describe("Test general API", () => {
...@@ -27,7 +27,7 @@ describe("Test general API", () => { ...@@ -27,7 +27,7 @@ describe("Test general API", () => {
it("get incorrect path throws an error", async () => { it("get incorrect path throws an error", async () => {
await device await device
.get("Device.Not.A.Thing") .get("Device.Not.A.Thing")
.catch((err) => assert.strictEqual(err.type, "error")); .catch((err) => assert.strictEqual(typeof err, "string"));
}); });
// SET // SET
...@@ -45,7 +45,7 @@ describe("Test general API", () => { ...@@ -45,7 +45,7 @@ describe("Test general API", () => {
it("set throws an error on incorrect path", async () => { it("set throws an error on incorrect path", async () => {
await device await device
.set("Device.Not.A.Path", { Cat: "cute" }) .set("Device.Not.A.Path", { Cat: "cute" })
.catch((err) => assert.strictEqual(err.type, "error")); .catch((err) => assert.strictEqual(typeof err, "string"));
}); });
// OPERATE // OPERATE
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment