diff --git a/io/stomp/18-stomp.html b/io/stomp/18-stomp.html new file mode 100644 index 00000000..86ba6337 --- /dev/null +++ b/io/stomp/18-stomp.html @@ -0,0 +1,169 @@ + + + + + + + + + + + + + + + + + diff --git a/io/stomp/18-stomp.js b/io/stomp/18-stomp.js new file mode 100644 index 00000000..61a14bee --- /dev/null +++ b/io/stomp/18-stomp.js @@ -0,0 +1,146 @@ +/** + * Copyright 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 StompClient = require('stomp-client'); + var querystring = require('querystring'); + + function StompServerNode(n) { + RED.nodes.createNode(this,n); + this.server = n.server; + this.port = n.port; + this.name = n.name; + var credentials = RED.nodes.getCredentials(n.id); + if (credentials) { + this.username = credentials.user; + this.password = credentials.password; + } + } + RED.nodes.registerType("stomp-server",StompServerNode); + + RED.httpAdmin.get('/stomp-server/:id',function(req,res) { + var credentials = RED.nodes.getCredentials(req.params.id); + if (credentials) { + res.send(JSON.stringify({user:credentials.user,hasPassword:(credentials.password&&credentials.password!="")})); + } else { + res.send(JSON.stringify({})); + } + }); + + RED.httpAdmin.delete('/stomp-server/:id',function(req,res) { + RED.nodes.deleteCredentials(req.params.id); + res.send(200); + }); + + RED.httpAdmin.post('/stomp-server/:id',function(req,res) { + var body = ""; + req.on('data', function(chunk) { + body+=chunk; + }); + req.on('end', function(){ + var newCreds = querystring.parse(body); + var credentials = RED.nodes.getCredentials(req.params.id)||{}; + if (newCreds.user == null || newCreds.user == "") { + delete credentials.user; + } else { + credentials.user = newCreds.user; + } + if (newCreds.password == "") { + delete credentials.password; + } else { + credentials.password = newCreds.password||credentials.password; + } + RED.nodes.addCredentials(req.params.id,credentials); + res.send(200); + }); + }); + + + function StompInNode(n) { + RED.nodes.createNode(this,n); + this.server = n.server; + this.topic = n.topic; + + this.serverConfig = RED.nodes.getNode(this.server); + this.host = this.serverConfig.server; + this.port = this.serverConfig.port; + this.userid = this.serverConfig.username; + this.password = this.serverConfig.password; + + var node = this; + var msg = {topic:this.topic}; + + node.client = new StompClient(node.host, node.port, node.userid, node.password, '1.0'); + + node.client.connect(function(sessionId) { + node.log('subscribed to: '+node.topic); + node.client.subscribe(node.topic, function(body, headers) { + msg.payload = JSON.parse(body); + node.send(msg); + }); + }, function(error) { node.warn(error); }); + + node.client.on("error", function(error) { + node.log(error); + }); + + node.on("close", function(done) { + if (node.client) { + node.client.on("disconnect", function() { + done(); + }); + //node.client.unsubscribe(node.topic); + node.client.disconnect(); + } else { done(); } + }); + } + RED.nodes.registerType("stomp in",StompInNode); + + + function StompOutNode(n) { + RED.nodes.createNode(this,n); + this.server = n.server; + this.topic = n.topic; + + this.serverConfig = RED.nodes.getNode(this.server); + this.host = this.serverConfig.server; + this.port = this.serverConfig.port; + this.userid = this.serverConfig.username; + this.password = this.serverConfig.password; + + var node = this; + var msg = {topic:this.topic}; + + node.client = new StompClient(node.host, node.port, node.userid, node.password, '1.0'); + + node.client.connect(); + + node.client.on("error", function(error) { + node.log(error); + }); + + node.on("input", function(msg) { + node.client.publish(node.topic || msg.topic, msg.payload); + }); + + node.on("close", function(done) { + if (client) { client.disconnect(); } + }); + } + RED.nodes.registerType("stomp out",StompOutNode); + +}