raspberryGPIOhtmlserver/node_modules/ws/bin/wscat
node_modules/ws/bin/wscatRaw
1#!/usr/bin/env node
2
3/*!
4 * ws: a node.js websocket client
5 * Copyright(c) 2011 Einar Otto Stangvik <einaros@gmail.com>
6 * MIT Licensed
7 */
8
9/**
10 * Module dependencies.
11 */
12
13var WebSocket = require('../')
14 , fs = require('fs')
15 , program = require('commander')
16 , util = require('util')
17 , events = require('events')
18 , readline = require('readline');
19
20/**
21 * InputReader - processes console input
22 */
23
24function Console() {
25 this.stdin = process.stdin;
26 this.stdout = process.stdout;
27
28 this.readlineInterface = readline.createInterface(this.stdin, this.stdout);
29
30 var self = this;
31 this.readlineInterface.on('line', function(data) {
32 self.emit('line', data);
33 });
34 this.readlineInterface.on('close', function() {
35 self.emit('close');
36 });
37
38 this._resetInput = function() {
39 self.clear();
40 }
41}
42util.inherits(Console, events.EventEmitter);
43
44Console.Colors = {
45 Red: '\033[31m',
46 Green: '\033[32m',
47 Yellow: '\033[33m',
48 Blue: '\033[34m',
49 Default: '\033[39m'
50};
51
52Console.prototype.prompt = function() {
53 this.readlineInterface.prompt();
54}
55
56Console.prototype.print = function(msg, color) {
57 this.clear();
58 color = color || Console.Colors.Default;
59 this.stdout.write(color + msg + Console.Colors.Default + '\n');
60 this.prompt();
61}
62
63Console.prototype.clear = function() {
64 this.stdout.write('\033[2K\033[E');
65}
66
67Console.prototype.pause = function() {
68 this.stdin.on('keypress', this._resetInput);
69}
70
71Console.prototype.resume = function() {
72 this.stdin.removeListener('keypress', this._resetInput);
73}
74
75/**
76 * The actual application
77 */
78
79var version = JSON.parse(fs.readFileSync(__dirname + '/../package.json', 'utf8')).version;
80program
81 .version(version)
82 .usage('[options] <url>')
83 .option('-l, --listen <port>', 'listen on port')
84 .option('-c, --connect <url>', 'connect to a websocket server')
85 .option('-p, --protocol <version>', 'optional protocol version')
86 .option('-o, --origin <origin>', 'optional origin')
87 .option('--host <host>', 'optional host')
88 .option('-s, --subprotocol <protocol>', 'optional subprotocol')
89 .parse(process.argv);
90
91if (program.listen && program.connect) {
92 console.error('\033[33merror: use either --listen or --connect\033[39m');
93 process.exit(-1);
94}
95else if (program.listen) {
96 var wsConsole = new Console();
97 wsConsole.pause();
98 var options = {};
99 if (program.protocol) options.protocolVersion = program.protocol;
100 if (program.origin) options.origin = program.origin;
101 if (program.subprotocol) options.protocol = program.subprotocol;
102 var ws = null;
103 var wss = new WebSocket.Server({port: program.listen}, function() {
104 wsConsole.print('listening on port ' + program.listen + ' (press CTRL+C to quit)', Console.Colors.Green);
105 wsConsole.clear();
106 });
107 wsConsole.on('close', function() {
108 if (ws) {
109 try {
110 ws.close();
111 }
112 catch (e) {}
113 }
114 process.exit(0);
115 });
116 wsConsole.on('line', function(data) {
117 if (ws) {
118 ws.send(data, {mask: false});
119 wsConsole.prompt();
120 }
121 });
122 wss.on('connection', function(newClient) {
123 if (ws) {
124 // limit to one client
125 newClient.terminate();
126 return;
127 };
128 ws = newClient;
129 wsConsole.resume();
130 wsConsole.prompt();
131 wsConsole.print('client connected', Console.Colors.Green);
132 ws.on('close', function() {
133 wsConsole.print('disconnected', Console.Colors.Green);
134 wsConsole.clear();
135 wsConsole.pause();
136 ws = null;
137 });
138 ws.on('error', function(code, description) {
139 wsConsole.print('error: ' + code + (description ? ' ' + description : ''), Console.Colors.Yellow);
140 });
141 ws.on('message', function(data, flags) {
142 wsConsole.print('< ' + data, Console.Colors.Blue);
143 });
144 });
145 wss.on('error', function(error) {
146 wsConsole.print('error: ' + error.toString(), Console.Colors.Yellow);
147 process.exit(-1);
148 });
149}
150else if (program.connect) {
151 var wsConsole = new Console();
152 var options = {};
153 if (program.protocol) options.protocolVersion = program.protocol;
154 if (program.origin) options.origin = program.origin;
155 if (program.subprotocol) options.protocol = program.subprotocol;
156 if (program.host) options.host = program.host;
157 var ws = new WebSocket(program.connect, options);
158 ws.on('open', function() {
159 wsConsole.print('connected (press CTRL+C to quit)', Console.Colors.Green);
160 wsConsole.on('line', function(data) {
161 ws.send(data, {mask: true});
162 wsConsole.prompt();
163 });
164 });
165 ws.on('close', function() {
166 wsConsole.print('disconnected', Console.Colors.Green);
167 wsConsole.clear();
168 process.exit();
169 });
170 ws.on('error', function(code, description) {
171 wsConsole.print('error: ' + code + (description ? ' ' + description : ''), Console.Colors.Yellow);
172 process.exit(-1);
173 });
174 ws.on('message', function(data, flags) {
175 wsConsole.print('< ' + data, Console.Colors.Blue);
176 });
177 wsConsole.on('close', function() {
178 if (ws) {
179 try {
180 ws.close();
181 }
182 catch(e) {}
183 process.exit();
184 }
185 });
186}
187else {
188 console.error('\033[33merror: use either --listen or --connect\033[39m');
189 process.exit(-1);
190}