@things-factory/integration-base 6.0.104 → 6.0.111

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.
@@ -10,9 +10,18 @@ class MqttConnector {
10
10
  connection_manager_1.ConnectionManager.logger.info('mqtt-connector connections are ready');
11
11
  }
12
12
  async connect(connection) {
13
- const { endpoint: uri } = connection;
13
+ const { endpoint: uri, params: { user, password } } = connection;
14
14
  try {
15
- const client = await async_mqtt_1.default.connectAsync(uri);
15
+ var client = null;
16
+ if (user && password) {
17
+ client = await async_mqtt_1.default.connectAsync(uri, { username: user, password: password });
18
+ }
19
+ else {
20
+ client = await async_mqtt_1.default.connectAsync(uri);
21
+ }
22
+ if (!client) {
23
+ throw new Error(`the initialization of mqtt connector is failed. uri: ${uri}, user: ${user} password: ${password}`);
24
+ }
16
25
  connection_manager_1.ConnectionManager.addConnectionInstance(connection, {
17
26
  client,
18
27
  connection
@@ -28,7 +37,18 @@ class MqttConnector {
28
37
  client && (await client.end());
29
38
  }
30
39
  get parameterSpec() {
31
- return [];
40
+ return [
41
+ {
42
+ type: 'string',
43
+ name: 'user',
44
+ label: 'user'
45
+ },
46
+ {
47
+ type: 'password',
48
+ name: 'password',
49
+ label: 'password'
50
+ }
51
+ ];
32
52
  }
33
53
  get taskPrefixes() {
34
54
  return ['mqtt'];
@@ -1 +1 @@
1
- {"version":3,"file":"mqtt-connector.js","sourceRoot":"","sources":["../../../server/engine/connector/mqtt-connector.ts"],"names":[],"mappings":";;;;AACA,8DAAyD;AAEzD,oEAA6B;AAE7B,MAAa,aAAa;IACxB,KAAK,CAAC,KAAK,CAAC,iBAAiB;QAC3B,MAAM,OAAO,CAAC,GAAG,CAAC,iBAAiB,CAAC,GAAG,CAAC,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,CAAA;QAEjE,sCAAiB,CAAC,MAAM,CAAC,IAAI,CAAC,sCAAsC,CAAC,CAAA;IACvE,CAAC;IAED,KAAK,CAAC,OAAO,CAAC,UAAU;QACtB,MAAM,EAAE,QAAQ,EAAE,GAAG,EAAE,GAAG,UAAU,CAAA;QAEpC,IAAI;YACF,MAAM,MAAM,GAAG,MAAM,oBAAI,CAAC,YAAY,CAAC,GAAG,CAAC,CAAA;YAE3C,sCAAiB,CAAC,qBAAqB,CAAC,UAAU,EAAE;gBAClD,MAAM;gBACN,UAAU;aACX,CAAC,CAAA;YAEF,sCAAiB,CAAC,MAAM,CAAC,IAAI,CAAC,6BAA6B,UAAU,CAAC,IAAI,IAAI,UAAU,CAAC,QAAQ,gBAAgB,CAAC,CAAA;SACnH;QAAC,OAAO,GAAG,EAAE;YACZ,sCAAiB,CAAC,MAAM,CAAC,KAAK,CAC5B,6BAA6B,UAAU,CAAC,IAAI,IAAI,UAAU,CAAC,QAAQ,wBAAwB,GAAG,EAAE,CACjG,CAAA;SACF;IACH,CAAC;IAED,KAAK,CAAC,UAAU,CAAC,UAAU;QACzB,MAAM,EAAE,MAAM,EAAE,GAAG,sCAAiB,CAAC,wBAAwB,CAAC,UAAU,CAAC,CAAA;QAEzE,MAAM,IAAI,CAAC,MAAM,MAAM,CAAC,GAAG,EAAE,CAAC,CAAA;IAChC,CAAC;IAED,IAAI,aAAa;QACf,OAAO,EAAE,CAAA;IACX,CAAC;IAED,IAAI,YAAY;QACd,OAAO,CAAC,MAAM,CAAC,CAAA;IACjB,CAAC;IAED,IAAI,IAAI;QACN,OAAO,sCAAsC,CAAA;IAC/C,CAAC;CACF;AA3CD,sCA2CC;AAED,sCAAiB,CAAC,iBAAiB,CAAC,gBAAgB,EAAE,IAAI,aAAa,EAAE,CAAC,CAAA","sourcesContent":["import { Connector } from '../types'\nimport { ConnectionManager } from '../connection-manager'\n\nimport mqtt from 'async-mqtt'\n\nexport class MqttConnector implements Connector {\n async ready(connectionConfigs) {\n await Promise.all(connectionConfigs.map(this.connect.bind(this)))\n\n ConnectionManager.logger.info('mqtt-connector connections are ready')\n }\n\n async connect(connection) {\n const { endpoint: uri } = connection\n\n try {\n const client = await mqtt.connectAsync(uri)\n\n ConnectionManager.addConnectionInstance(connection, {\n client,\n connection\n })\n\n ConnectionManager.logger.info(`mqtt-connector connection(${connection.name}:${connection.endpoint}) is connected`)\n } catch (err) {\n ConnectionManager.logger.error(\n `mqtt-connector connection(${connection.name}:${connection.endpoint}) is failed.\\ncause: ${err}`\n )\n }\n }\n\n async disconnect(connection) {\n const { client } = ConnectionManager.removeConnectionInstance(connection)\n\n client && (await client.end())\n }\n\n get parameterSpec() {\n return []\n }\n\n get taskPrefixes() {\n return ['mqtt']\n }\n\n get help() {\n return 'integration/connector/mqtt-connector'\n }\n}\n\nConnectionManager.registerConnector('mqtt-connector', new MqttConnector())\n"]}
1
+ {"version":3,"file":"mqtt-connector.js","sourceRoot":"","sources":["../../../server/engine/connector/mqtt-connector.ts"],"names":[],"mappings":";;;;AACA,8DAAyD;AAEzD,oEAA6B;AAE7B,MAAa,aAAa;IACxB,KAAK,CAAC,KAAK,CAAC,iBAAiB;QAC3B,MAAM,OAAO,CAAC,GAAG,CAAC,iBAAiB,CAAC,GAAG,CAAC,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,CAAA;QAEjE,sCAAiB,CAAC,MAAM,CAAC,IAAI,CAAC,sCAAsC,CAAC,CAAA;IACvE,CAAC;IAED,KAAK,CAAC,OAAO,CAAC,UAAU;QACtB,MAAM,EACJ,QAAQ,EAAE,GAAG,EACb,MAAM,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,EAC3B,GAAG,UAAU,CAAA;QAEd,IAAI;YACF,IAAI,MAAM,GAAG,IAAI,CAAA;YACjB,IAAI,IAAI,IAAI,QAAQ,EAAE;gBACpB,MAAM,GAAG,MAAM,oBAAI,CAAC,YAAY,CAAC,GAAG,EAAE,EAAE,QAAQ,EAAE,IAAI,EAAE,QAAQ,EAAE,QAAQ,EAAE,CAAC,CAAA;aAC9E;iBAAM;gBACL,MAAM,GAAG,MAAM,oBAAI,CAAC,YAAY,CAAC,GAAG,CAAC,CAAA;aACtC;YAED,IAAI,CAAC,MAAM,EAAE;gBACX,MAAM,IAAI,KAAK,CACb,wDAAwD,GAAG,WAAW,IAAI,cAAc,QAAQ,EAAE,CACnG,CAAA;aACF;YAED,sCAAiB,CAAC,qBAAqB,CAAC,UAAU,EAAE;gBAClD,MAAM;gBACN,UAAU;aACX,CAAC,CAAA;YAEF,sCAAiB,CAAC,MAAM,CAAC,IAAI,CAAC,6BAA6B,UAAU,CAAC,IAAI,IAAI,UAAU,CAAC,QAAQ,gBAAgB,CAAC,CAAA;SACnH;QAAC,OAAO,GAAG,EAAE;YACZ,sCAAiB,CAAC,MAAM,CAAC,KAAK,CAC5B,6BAA6B,UAAU,CAAC,IAAI,IAAI,UAAU,CAAC,QAAQ,wBAAwB,GAAG,EAAE,CACjG,CAAA;SACF;IACH,CAAC;IAED,KAAK,CAAC,UAAU,CAAC,UAAU;QACzB,MAAM,EAAE,MAAM,EAAE,GAAG,sCAAiB,CAAC,wBAAwB,CAAC,UAAU,CAAC,CAAA;QAEzE,MAAM,IAAI,CAAC,MAAM,MAAM,CAAC,GAAG,EAAE,CAAC,CAAA;IAChC,CAAC;IAED,IAAI,aAAa;QACf,OAAO;YACL;gBACE,IAAI,EAAE,QAAQ;gBACd,IAAI,EAAE,MAAM;gBACZ,KAAK,EAAE,MAAM;aACd;YACD;gBACE,IAAI,EAAE,UAAU;gBAChB,IAAI,EAAE,UAAU;gBAChB,KAAK,EAAE,UAAU;aAClB;SACF,CAAA;IACH,CAAC;IAED,IAAI,YAAY;QACd,OAAO,CAAC,MAAM,CAAC,CAAA;IACjB,CAAC;IAED,IAAI,IAAI;QACN,OAAO,sCAAsC,CAAA;IAC/C,CAAC;CACF;AApED,sCAoEC;AAED,sCAAiB,CAAC,iBAAiB,CAAC,gBAAgB,EAAE,IAAI,aAAa,EAAE,CAAC,CAAA","sourcesContent":["import { Connector } from '../types'\nimport { ConnectionManager } from '../connection-manager'\n\nimport mqtt from 'async-mqtt'\n\nexport class MqttConnector implements Connector {\n async ready(connectionConfigs) {\n await Promise.all(connectionConfigs.map(this.connect.bind(this)))\n\n ConnectionManager.logger.info('mqtt-connector connections are ready')\n }\n\n async connect(connection) {\n const {\n endpoint: uri,\n params: { user, password }\n } = connection\n\n try {\n var client = null\n if (user && password) {\n client = await mqtt.connectAsync(uri, { username: user, password: password })\n } else {\n client = await mqtt.connectAsync(uri)\n }\n\n if (!client) {\n throw new Error(\n `the initialization of mqtt connector is failed. uri: ${uri}, user: ${user} password: ${password}`\n )\n }\n\n ConnectionManager.addConnectionInstance(connection, {\n client,\n connection\n })\n\n ConnectionManager.logger.info(`mqtt-connector connection(${connection.name}:${connection.endpoint}) is connected`)\n } catch (err) {\n ConnectionManager.logger.error(\n `mqtt-connector connection(${connection.name}:${connection.endpoint}) is failed.\\ncause: ${err}`\n )\n }\n }\n\n async disconnect(connection) {\n const { client } = ConnectionManager.removeConnectionInstance(connection)\n\n client && (await client.end())\n }\n\n get parameterSpec() {\n return [\n {\n type: 'string',\n name: 'user',\n label: 'user'\n },\n {\n type: 'password',\n name: 'password',\n label: 'password'\n }\n ]\n }\n\n get taskPrefixes() {\n return ['mqtt']\n }\n\n get help() {\n return 'integration/connector/mqtt-connector'\n }\n}\n\nConnectionManager.registerConnector('mqtt-connector', new MqttConnector())\n"]}
@@ -19,7 +19,7 @@ async function MqttSubscribe(step, context) {
19
19
  if (!__mqtt_subscriber) {
20
20
  context.__mqtt_subscriber = {};
21
21
  }
22
- const { connection: { endpoint: uri } } = connection_manager_1.ConnectionManager.getConnectionInstanceByName(domain, connectionName);
22
+ const { connection: { endpoint: uri, params: { user, password } } } = connection_manager_1.ConnectionManager.getConnectionInstanceByName(domain, connectionName);
23
23
  if (!topic) {
24
24
  throw Error(`topic is not found for ${connectionName}`);
25
25
  }
@@ -32,7 +32,13 @@ async function MqttSubscribe(step, context) {
32
32
  */
33
33
  if (!context.__mqtt_subscriber[name]) {
34
34
  try {
35
- const broker = await async_mqtt_1.default.connectAsync(uri);
35
+ var broker = null;
36
+ if (user && password) {
37
+ broker = await async_mqtt_1.default.connectAsync(uri, { username: user, password: password });
38
+ }
39
+ else {
40
+ broker = await async_mqtt_1.default.connectAsync(uri);
41
+ }
36
42
  logger.info(`mqtt-connector connection(${connectionName}:${uri}) is connected`);
37
43
  await broker.subscribe(topic);
38
44
  logger.info(`success subscribing topic '${topic}'`);
@@ -1 +1 @@
1
- {"version":3,"file":"mqtt-subscribe.js","sourceRoot":"","sources":["../../../server/engine/task/mqtt-subscribe.ts"],"names":[],"mappings":"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","sourcesContent":["import mqtt from 'async-mqtt'\n\nimport { TaskRegistry } from '../task-registry'\nimport { ConnectionManager } from '../connection-manager'\nimport { sleep } from '@things-factory/utils'\n\nfunction convertDataFormat(data, format) {\n if (format == 'json') {\n return JSON.parse(data)\n } else {\n return data.toString()\n }\n}\n\nasync function MqttSubscribe(step, context) {\n const {\n connection: connectionName,\n params: { topic, dataFormat },\n name\n } = step\n\n const { domain, logger, closures, __mqtt_subscriber } = context\n if (!__mqtt_subscriber) {\n context.__mqtt_subscriber = {}\n }\n\n const {\n connection: { endpoint: uri }\n } = ConnectionManager.getConnectionInstanceByName(domain, connectionName)\n\n if (!topic) {\n throw Error(`topic is not found for ${connectionName}`)\n }\n\n /*\n * 1. subscriber list에서 subscriber를 찾는다. 없으면, 생성한다.\n * 2. client.once(...)로 메시지를 취한다.\n *\n * TODO 동일 브로커의 다중 subscribe 태스크에 대해서 완벽한 지원을 해야한다.\n * - 현재는 여러 태스크가 동일 topic을 subscribe 하는 경우에 정상동작하지 않을 것이다.\n */\n if (!context.__mqtt_subscriber[name]) {\n try {\n const broker = await mqtt.connectAsync(uri)\n\n logger.info(`mqtt-connector connection(${connectionName}:${uri}) is connected`)\n\n await broker.subscribe(topic)\n logger.info(`success subscribing topic '${topic}'`)\n\n var TOPIC\n var MESSAGE\n\n context.__mqtt_subscriber[name] = async () => {\n while (!MESSAGE) {\n await sleep(100)\n }\n\n var topic = TOPIC\n var message = MESSAGE\n\n TOPIC = null\n MESSAGE = null\n\n return {\n topic,\n message\n }\n }\n\n broker.on('message', async (messageTopic, message) => {\n if (topic !== messageTopic) {\n return\n }\n\n TOPIC = topic\n MESSAGE = convertDataFormat(message, dataFormat)\n\n // logger.info(`mqtt-subscribe :\\n'${message.toString()}'`)\n })\n\n closures.push(async () => {\n try {\n broker && (await broker.end())\n logger.info(`mqtt-connector connection(${connectionName}:${uri}) is disconnected`)\n } catch (e) {\n logger.error(e)\n }\n })\n } catch (e) {\n logger.error(e)\n }\n }\n\n var { message } = await context.__mqtt_subscriber[name]()\n\n return {\n data: message\n }\n}\n\nMqttSubscribe.parameterSpec = [\n {\n type: 'string',\n name: 'topic',\n label: 'topic'\n },\n {\n type: 'select',\n label: 'data-format',\n name: 'dataFormat',\n property: {\n options: [\n {\n display: 'Plain Text',\n value: 'text'\n },\n {\n display: 'JSON',\n value: 'json'\n }\n ]\n }\n }\n]\n\nMqttSubscribe.help = 'integration/task/mqtt-subscribe'\n\nTaskRegistry.registerTaskHandler('mqtt-subscribe', MqttSubscribe)\n"]}
1
+ {"version":3,"file":"mqtt-subscribe.js","sourceRoot":"","sources":["../../../server/engine/task/mqtt-subscribe.ts"],"names":[],"mappings":"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","sourcesContent":["import mqtt from 'async-mqtt'\n\nimport { TaskRegistry } from '../task-registry'\nimport { ConnectionManager } from '../connection-manager'\nimport { sleep } from '@things-factory/utils'\n\nfunction convertDataFormat(data, format) {\n if (format == 'json') {\n return JSON.parse(data)\n } else {\n return data.toString()\n }\n}\n\nasync function MqttSubscribe(step, context) {\n const {\n connection: connectionName,\n params: { topic, dataFormat },\n name\n } = step\n\n const { domain, logger, closures, __mqtt_subscriber } = context\n if (!__mqtt_subscriber) {\n context.__mqtt_subscriber = {}\n }\n\n const {\n connection: {\n endpoint: uri,\n params: { user, password }\n }\n } = ConnectionManager.getConnectionInstanceByName(domain, connectionName)\n\n if (!topic) {\n throw Error(`topic is not found for ${connectionName}`)\n }\n\n /*\n * 1. subscriber list에서 subscriber를 찾는다. 없으면, 생성한다.\n * 2. client.once(...)로 메시지를 취한다.\n *\n * TODO 동일 브로커의 다중 subscribe 태스크에 대해서 완벽한 지원을 해야한다.\n * - 현재는 여러 태스크가 동일 topic을 subscribe 하는 경우에 정상동작하지 않을 것이다.\n */\n if (!context.__mqtt_subscriber[name]) {\n try {\n var broker = null\n if (user && password) {\n broker = await mqtt.connectAsync(uri, { username: user, password: password })\n } else {\n broker = await mqtt.connectAsync(uri)\n }\n\n logger.info(`mqtt-connector connection(${connectionName}:${uri}) is connected`)\n\n await broker.subscribe(topic)\n logger.info(`success subscribing topic '${topic}'`)\n\n var TOPIC\n var MESSAGE\n\n context.__mqtt_subscriber[name] = async () => {\n while (!MESSAGE) {\n await sleep(100)\n }\n\n var topic = TOPIC\n var message = MESSAGE\n\n TOPIC = null\n MESSAGE = null\n\n return {\n topic,\n message\n }\n }\n\n broker.on('message', async (messageTopic, message) => {\n if (topic !== messageTopic) {\n return\n }\n\n TOPIC = topic\n MESSAGE = convertDataFormat(message, dataFormat)\n\n // logger.info(`mqtt-subscribe :\\n'${message.toString()}'`)\n })\n\n closures.push(async () => {\n try {\n broker && (await broker.end())\n logger.info(`mqtt-connector connection(${connectionName}:${uri}) is disconnected`)\n } catch (e) {\n logger.error(e)\n }\n })\n } catch (e) {\n logger.error(e)\n }\n }\n\n var { message } = await context.__mqtt_subscriber[name]()\n\n return {\n data: message\n }\n}\n\nMqttSubscribe.parameterSpec = [\n {\n type: 'string',\n name: 'topic',\n label: 'topic'\n },\n {\n type: 'select',\n label: 'data-format',\n name: 'dataFormat',\n property: {\n options: [\n {\n display: 'Plain Text',\n value: 'text'\n },\n {\n display: 'JSON',\n value: 'json'\n }\n ]\n }\n }\n]\n\nMqttSubscribe.help = 'integration/task/mqtt-subscribe'\n\nTaskRegistry.registerTaskHandler('mqtt-subscribe', MqttSubscribe)\n"]}