Able to read and send data to ActionCable

This commit is contained in:
Paoda 2018-08-29 18:20:48 +01:00
parent 1cd1effb98
commit 3757f8b64f
1 changed files with 134 additions and 54 deletions

134
app.js
View File

@ -1,68 +1,148 @@
require('dotenv').config(); "use strict";
const WebSocket = require('ws');
require("dotenv").config();
const WebSocket = require("ws");
/**
* Client responsible for communicating with ActionCable Websocket.
* @param {string} url - URL of Websocket (starts with ws:// or wss://)
* @param {string} channel - Name of ActionCable Channel.
*/
class ActionCable { class ActionCable {
constructor(url, channel) { constructor(url, channel) {
/** @type {string} */
this.url = url; this.url = url;
/** @type {string} */
this.channel = channel; this.channel = channel;
/** @type {boolean} */
this.connected = false; this.connected = false;
this.io = new WebSocket(url, ['actioncable-v1-json', 'actioncable-unsupported']); /** @type {WebSocket} */
this.io = new WebSocket(url, [
"actioncable-v1-json",
"actioncable-unsupported"
]);
/** @type {WebRTC} */
this.rtc = new WebRTC("NodeServer");
this.setUpEventListeners(); this.setUpEventListeners();
} }
/**
* Sets up the Websocket event listeners.
*/
setUpEventListeners() { setUpEventListeners() {
this.io.on('open', (msg) => { this.io.on("open", data => {
console.log('Connected to ' + this.url) console.log("Connected to " + this.url);
this.connected = true; this.connected = true;
this.subscribe(); this.subscribe();
}) });
this.io.on('close', (msg) => { this.io.on("close", data => {
console.log("Disconnected from ActionCable Server"); console.log("Disconnected from ActionCable Server");
this.connected = false; this.connected = false;
}) });
this.io.on('message', (msg) => { this.io.on("message", data => {
console.log(msg); data = JSON.parse(data);
}) console.log(data);
if (data.message && data.message.type) {
switch (data.message.type) {
case "JOIN_ROOM":
this.rtc.handleJoin(data.message);
break;
case "REMOVE_USER":
console.log("User has Left Room");
this.rtc.handleLeave(data.message);
break;
default:
// console.log("Pinged");
}
}
});
} }
/**
* Send Stringified Object to Websocket Server to be processed
* @param {string} command
* @param {Object} identifier
*/
send(command, identifier) { send(command, identifier) {
this.io.send(JSON.stringify({ command, identifier })); this.io.send(JSON.stringify({ command, identifier }));
} }
/**
* Send Stringified Object to Websocket server asking to subscribe to channel
*/
subscribe() { subscribe() {
this.io.send(JSON.stringify( this.io.send(
{ JSON.stringify({
command: "subscribe", identifier: JSON.stringify({channel: this.channel}) command: "subscribe",
})); identifier: JSON.stringify({ channel: this.channel })
})
);
} }
} }
/** /**
* { * The Class Responsible for Handling the data from the WebSocket and Getting the MediaStream.
* "identifier": "{\"channel\":\"VideoSessionChannel\"}","message":{"type":"JOIN_ROOM","from":"9921"}} * @param {string} username - The name of this server when joining the WebRTC Ecosystem.
*/ */
class WebRTC { class WebRTC {
constructor(username) { constructor(username) {
this.username = "NodeServer"; /** @type {Array<User>} Array of Connected Users */
this.users = [];
/** @type {string} */
this.username = username;
} }
/**
* Handles onmessage event when message contains JOIN
* @param {JSON} data - Objectified (???) JSON
*/
handleJoin(data) { handleJoin(data) {
data = { console.log("User " + data.from + " has joined the room");
identifier: "{\"channel\":\"VideoSessionChannel\"}", this.users.push(new User(data.from));
message: {
type: "JOIN_ROOM", //Try and Exchange Data with the person
from: "9921"
} }
/**
* Handles onmessage event when message contains REMOVE
* @param {JSON} data - Stringified JSON
*/
handleLeave(data) {
console.log("User " + data.from + " has left the room.");
this.users
}
}
const ac = new ActionCable(
"ws://0.0.0.0:3000/cable",
process.env.DEFAULT_CHANNEL
);
class User {
constructor(id) {
this.id = id;
} }
} }
(function addDeleteMethodToArrayPrototype() {
Array.prototype.delete = function(toRemove) {
let i = this.indexOf(toRemove);
if (i !== -1) this.splice(i, 1);
//return this;
} }
const ac = new ActionCable('ws://0.0.0.0:3000/cable', process.env.DEFAULT_CHANNEL); })();
const arr = ["Brave", "New", "World"];
console.log(arr.delete("New"));
console.log("Length: " + arr.length);