summaryrefslogtreecommitdiff
path: root/examples/webchannel
diff options
context:
space:
mode:
authorSumedha Widyadharma <sumedha.widyadharma@basyskom.com>2014-08-08 11:07:46 +0200
committerMilian Wolff <milian.wolff@kdab.com>2014-09-19 16:38:45 +0200
commit46fc950424f9dedf014176153249d2f29bee8659 (patch)
tree0b2ff0076d640e68fdfb82b13a19ea57918d0b93 /examples/webchannel
parentbcbaa596815caf53c80f4a5220fb008000b3d897 (diff)
downloadqtwebchannel-46fc950424f9dedf014176153249d2f29bee8659.tar.gz
Added a generic node.js debug client as an example
qwclient can connect to any qwebchannel server using a websocket transport. The service can then be used through a REPL. It can, for instance, be used with the standalone example server. Change-Id: Ie73d19b0376caf2fcf6ae02ec19a56e27bddfd33 Reviewed-by: Milian Wolff <milian.wolff@kdab.com>
Diffstat (limited to 'examples/webchannel')
-rw-r--r--examples/webchannel/qwclient/README18
-rw-r--r--examples/webchannel/qwclient/package.json14
-rwxr-xr-xexamples/webchannel/qwclient/qwclient.js134
-rw-r--r--examples/webchannel/qwclient/qwclient.pro9
-rw-r--r--examples/webchannel/webchannel.pro2
5 files changed, 176 insertions, 1 deletions
diff --git a/examples/webchannel/qwclient/README b/examples/webchannel/qwclient/README
new file mode 100644
index 0000000..2b90427
--- /dev/null
+++ b/examples/webchannel/qwclient/README
@@ -0,0 +1,18 @@
+A REPL client for any qwebchannel service using a websocket transport.
+
+A nice tool for testing qwebchannel endpoints.
+
+Install:
+ - qmake && make from the qwebchannel sources or examples.
+ - npm install
+
+Usage:
+ - qwclient.js <autoconnect server>
+ - openChannel(url) in the REPL to open a new connection, multiple channels are OK
+ - channel object lists are aliased to c<channelnumber> i.e. c0, c1, ...
+
+ Example using the standalone example server:
+ - Launch standalone example server
+ - qwclient localhost:12345
+ - c0.receiveText('test')
+ - 'test' should be displayed in the standalone server UI
diff --git a/examples/webchannel/qwclient/package.json b/examples/webchannel/qwclient/package.json
new file mode 100644
index 0000000..f5b9db0
--- /dev/null
+++ b/examples/webchannel/qwclient/package.json
@@ -0,0 +1,14 @@
+{
+ "name": "qwclient",
+ "description": "A generic REPL client for qwebchannel services using a websocket transport.",
+ "author": "Sumedha Widyadharma <sumedha.widyadharma@basyskom.com>",
+ "version": "0.0.1",
+ "dependencies": {
+ "faye-websocket": "0.7.x"
+ },
+ "engine": "node 0.10.x",
+ "repository": {
+ "type": "git",
+ "url": "git://gitorious.org/qt/qtwebchannel.git"
+ }
+}
diff --git a/examples/webchannel/qwclient/qwclient.js b/examples/webchannel/qwclient/qwclient.js
new file mode 100755
index 0000000..c2922b3
--- /dev/null
+++ b/examples/webchannel/qwclient/qwclient.js
@@ -0,0 +1,134 @@
+#!/usr/bin/env node
+/****************************************************************************
+**
+** Copyright (C) 2014 basysKom GmbH, author Sumedha Widyadharma <sumedha.widyadharma@basyskom.com>
+** Copyright (C) 2014 basysKom GmbH, author Lutz Schönemann <lutz.schoenemann@basyskom.com>
+** Contact: http://www.qt-project.org/legal
+**
+** This file is part of the QtWebChannel module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and Digia. For licensing terms and
+** conditions see http://qt.digia.com/licensing. For further information
+** use the contact form at http://qt.digia.com/contact-us.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Digia gives you certain additional
+** rights. These rights are described in the Digia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3.0 as published by the Free Software
+** Foundation and appearing in the file LICENSE.GPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU General Public License version 3.0 requirements will be
+** met: http://www.gnu.org/copyleft/gpl.html.
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+'use strict';
+var repl = require('repl');
+var WebSocket = require('faye-websocket').Client;
+var QWebChannel = new require('./qwebchannel.js').QWebChannel;
+
+var serverAddress = 'ws://localhost:12345';
+var channels = [];
+
+var autoConnect = process.argv.pop();
+if (autoConnect === __filename) {
+ autoConnect = false;
+}
+
+var openChannel = function (address) {
+ // this should be bound to the repl
+ var self = this;
+ address = address ? address : serverAddress;
+ if (address.indexOf('://') === -1) {
+ address = 'ws://' + address;
+ }
+
+ var ws = new WebSocket(address);
+
+ ws.on('open', function (event) {
+ var transport = {
+ onmessage: function (data) {},
+ send: function (data) {
+ ws.send(data, {binary: false});
+ }
+ };
+ ws.on('message', function (event) {
+ transport.onmessage(event);
+ }); // onmessage
+
+ var webChannel = new QWebChannel(transport, function (channel) {
+ channels.push(channel);
+ var channelIdx = (channels.length - 1);
+ console.log('channel opened', channelIdx);
+ // Create a nice alias to access this channels objects
+ self.context['c' + channelIdx] = channel.objects;
+
+ ws.on('close', function () {
+ for (var i = 0; i < channels.length; ++i) {
+ if (channels[i] === channel) {
+ console.log('channel closed', i);
+ channels[i] = null;
+ return;
+ }
+ }
+ }); // onclose
+ }); // new QWebChannel
+ }); // onopen
+
+ ws.on('error', function (error) {
+ console.log('websocket error', error.message);
+ });
+}; // openChannel
+
+var setupRepl = function() {
+ var r = repl.start({
+ prompt: "webchannel> ",
+ input: process.stdin,
+ output: process.stdout
+ });
+
+ r.context.serverAddress = serverAddress;
+ r.context.openChannel = openChannel.bind(r);
+ r.context.channels = channels;
+
+ r.context.lsObjects = function() {
+ channels.forEach(function(channel){
+ console.log('Channel ' + channel);
+ Object.keys(channel.objects);
+ });
+ }
+ return r;
+}
+
+var welcome = function() {
+ console.log('Welcome to the qwebchannel/websocket REPL.');
+ console.log('Use openChannel(url) to connect to a service.');
+ console.log('For the standalone example, just openChannel() should suffice.');
+ console.log('Opened channels have their objects aliased to c<channel number>, i.e. c0');
+ console.log('So for the standalone example try: c0.dialog.receiveText(\'hello world\')');
+}
+
+welcome();
+var repl = setupRepl();
+
+if (autoConnect) {
+ repl.context.openChannel(autoConnect);
+}
diff --git a/examples/webchannel/qwclient/qwclient.pro b/examples/webchannel/qwclient/qwclient.pro
new file mode 100644
index 0000000..587571a
--- /dev/null
+++ b/examples/webchannel/qwclient/qwclient.pro
@@ -0,0 +1,9 @@
+TEMPLATE = aux
+
+exampleassets.files += \
+ qwclient.js \
+ package.json \
+ README
+
+exampleassets.path = $$[QT_INSTALL_EXAMPLES]/qwebchannel/qwclient
+include(../exampleassets.pri)
diff --git a/examples/webchannel/webchannel.pro b/examples/webchannel/webchannel.pro
index de6b4b8..ed1e21b 100644
--- a/examples/webchannel/webchannel.pro
+++ b/examples/webchannel/webchannel.pro
@@ -4,4 +4,4 @@ qtHaveModule(widgets):qtHaveModule(websockets) {
SUBDIRS += standalone
}
-SUBDIRS += nodejs
+SUBDIRS += nodejs qwclient