diff --git a/io/mqlight/mqlight.html b/io/mqlight/mqlight.html
new file mode 100644
index 00000000..16ff0d0f
--- /dev/null
+++ b/io/mqlight/mqlight.html
@@ -0,0 +1,154 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/io/mqlight/mqlight.js b/io/mqlight/mqlight.js
new file mode 100644
index 00000000..4049a1ed
--- /dev/null
+++ b/io/mqlight/mqlight.js
@@ -0,0 +1,140 @@
+/**
+ * Copyright 2013,2014 IBM Corp.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ **/
+
+module.exports = function(RED) {
+ "use strict";
+ var mqlight = require('mqlight');
+ var util = require("util");
+
+ function MQLightServiceNode(n) {
+ RED.nodes.createNode(this,n);
+
+ var id = "mqlight_" + (n.clientid ? n.clientid : (1+Math.random()*4294967295).toString(16));
+
+ var opts = {
+ service: n.service,
+ id: id
+ };
+
+ if (this.credentials) {
+ opts.user = this.credentials.user;
+ opts.password = this.credentials.password;
+ }
+
+ this.client = mqlight.createClient(opts, function(err) {
+ if (err) {
+ util.log('[mqlight] ['+id+'] not connected to service '+n.service);
+ } else {
+ util.log('[mqlight] ['+id+'] connected to service '+n.service);
+ }
+ });
+ }
+ RED.nodes.registerType("mqlight service",MQLightServiceNode,{
+ credentials: {
+ user: {type:"text"},
+ password: {type: "password"}
+ }
+ });
+
+ function MQLightIn(n) {
+ RED.nodes.createNode(this, n);
+ this.topic = n.topic || "";
+ this.share = n.share || null;
+ this.service = n.service;
+ this.serviceConfig = RED.nodes.getNode(this.service);
+ var node = this;
+
+ if (node.serviceConfig) {
+ if (node.serviceConfig.client) {
+ var recvClient = node.serviceConfig.client;
+ recvClient.on("started", function() {
+ recvClient.on("message", function(data, delivery) {
+ var msg = {
+ topic: delivery.message.topic,
+ payload: data,
+ _session: {
+ type: "mqlight",
+ id: recvClient.id
+ }
+ };
+ if (delivery.destination.share) {
+ msg.share = delivery.destination.share;
+ }
+ node.send(msg);
+ });
+ var subscribeCallback = function(err) {
+ if (err) {
+ node.error("Failed to subscribe: " + err);
+ } else {
+ node.log("Subscribed to "+node.topic+(node.share?" ["+node.share+"]":""));
+ }
+ };
+
+ if (node.share) {
+ recvClient.subscribe(node.topic, node.share, subscribeCallback);
+ } else {
+ recvClient.subscribe(node.topic, subscribeCallback);
+ }
+ });
+ recvClient.start();
+
+ node.on("close", function (done) {
+ recvClient.stop(done);
+ });
+ }
+
+ }
+ }
+ RED.nodes.registerType("mqlight in", MQLightIn);
+
+ function MQLightOut(n) {
+ RED.nodes.createNode(this, n);
+ this.topic = n.topic || "";
+ this.service = n.service;
+ this.serviceConfig = RED.nodes.getNode(this.service);
+ var node = this;
+
+ if (node.serviceConfig) {
+ if (node.serviceConfig.client) {
+ var sendClient = node.serviceConfig.client;
+
+ sendClient.on("started", function () {
+ node.on("input", function(msg) {
+ if (node.topic === "") {
+ if (msg.topic) {
+ node.topic = msg.topic;
+ } else {
+ node.warn("No topic set in MQ Light out node");
+ return;
+ }
+ }
+ sendClient.send(node.topic, msg.payload, function(err) {
+ if (err) {
+ node.error(err);
+ }
+ });
+ });
+ });
+ sendClient.start();
+
+ node.on("close", function (done) {
+ sendClient.stop(done);
+ });
+ }
+ }
+ }
+ RED.nodes.registerType("mqlight out", MQLightOut);
+};