Skip to content

Commit

Permalink
Readded removed websocket code
Browse files Browse the repository at this point in the history
  • Loading branch information
Kirk Eaton committed Aug 20, 2018
1 parent 1ce9793 commit 2002f85
Show file tree
Hide file tree
Showing 6 changed files with 146 additions and 1 deletion.
1 change: 1 addition & 0 deletions Makefile
Original file line number Diff line number Diff line change
Expand Up @@ -30,6 +30,7 @@ foam2_MAVEN_DEPS = \
com.authy:authy-java:1.1.0 \
org.bouncycastle:bcpkix-jdk15on:1.57 \
org.bouncycastle:bcprov-jdk15on:1.57 \
org.java-websocket:Java-WebSocket:1.3.7 \
org.eclipse.jetty:jetty-alpn-conscrypt-server:9.4.8.v20171121 \
org.eclipse.jetty:jetty-alpn-java-server:9.4.8.v20171121 \
org.eclipse.jetty:jetty-alpn-openjdk8-server:9.4.8.v20171121 \
Expand Down
2 changes: 1 addition & 1 deletion src/foam/box/WebSocketBox.js
Original file line number Diff line number Diff line change
Expand Up @@ -76,7 +76,7 @@ foam.CLASS({
}

return protocol + this.window.location.hostname +
( this.window.location.port ? ':' + parseInt(this.window.location.port) : '' ) +
( this.window.location.port ? ':' + ( parseInt(this.window.location.port) + 1 ) : '' ) +
'/' + url;
}

Expand Down
22 changes: 22 additions & 0 deletions src/foam/nanos/ws/NanoWebSocketServer.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,22 @@
package foam.nanos.ws;

import java.io.IOException;
import java.net.InetSocketAddress;

import foam.nanos.*;
import foam.core.*;

public class NanoWebSocketServer
extends ContextAwareSupport
implements NanoService
{
protected int port_ = 8081;
protected WebSocketServer server_;
public void start() {
System.out.println("Starting WebSocket Server on port " + port_);

server_ = new WebSocketServer(new InetSocketAddress(port_));
server_.setX(getX());
server_.start();
}
}
116 changes: 116 additions & 0 deletions src/foam/nanos/ws/WebSocketServer.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,116 @@
/**
* @license
* Copyright 2017 The FOAM Authors. All Rights Reserved.
* http://www.apache.org/licenses/LICENSE-2.0
*/

package foam.nanos.ws;

import foam.core.*;
import foam.nanos.logger.Logger;
import java.net.InetSocketAddress;
import org.java_websocket.*;
import org.java_websocket.handshake.*;
import org.java_websocket.server.*;

public class WebSocketServer
extends org.java_websocket.server.WebSocketServer
implements foam.core.ContextAware
{
// ContextAware support.
protected X x;

public void setX(X x) {
this.x = x;
}

public X getX() {
return x;
}

protected foam.nanos.box.NanoServiceRouter router_ = null;

protected foam.nanos.box.NanoServiceRouter getRouter() {
if ( router_ == null ) {
router_ = getX().create(foam.nanos.box.NanoServiceRouter.class);
}

return router_;
}

public WebSocketServer(InetSocketAddress address) {
super(address);
}

public void onClose(WebSocket connection, int code, String reason, boolean remote) {
}

public void onError(WebSocket conn, java.lang.Exception ex) {
}

public void onMessage(WebSocket conn, String message) {
Logger log = (Logger)getX().get("logger");

try {
String path = conn.getResourceDescriptor();
String[] urlParts = path.split("/");
String serviceKey = urlParts[2];
Object service = getX().get(serviceKey);
foam.dao.DAO nSpecDAO = (foam.dao.DAO) getX().get("nSpecDAO");
foam.nanos.boot.NSpec spec = (foam.nanos.boot.NSpec) nSpecDAO.find(serviceKey);

if ( spec == null ) {
log.warning("Request for non-existant service", serviceKey);
return;
}

if ( ! spec.getServe() ) {
log.warning("Request for service that is not serving.", serviceKey);
return;
}

foam.box.RawWebSocketBox returnBox = getX().create(foam.box.RawWebSocketBox.class);
final WebSocket capturedConnection = conn;
returnBox.setSocket(new foam.net.WebSocket() {
@Override
public void send(String message) throws java.io.IOException {
try {
capturedConnection.send(message);
} catch (org.java_websocket.exceptions.WebsocketNotConnectedException e) {
e.printStackTrace();
throw new java.io.IOException(e);
}
}
});

X requestContext = getX().put("returnBox", returnBox);

FObject request = requestContext.create(foam.lib.json.JSONParser.class).parseString(message);

if ( request == null ) {
log.warning("Failed to parse request.", message);
return;
}

if ( ! ( request instanceof foam.box.Message ) ) {
log.warning("Request was not a box message.", message);
return;
}

foam.box.Message obj = (foam.box.Message)request;
obj.getLocalAttributes().put("x", requestContext);

getRouter().service(serviceKey, obj);
} catch(java.lang.Exception e) {
log.error("Error handling websocket request", e, message);
}
}

public void onOpen(WebSocket conn, ClientHandshake handshake) {
Logger log = (Logger) getX().get("logger");
log.info("WebSocket client connect.");
}

public void onStart() {
}
}
1 change: 1 addition & 0 deletions src/services
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@ p({"class":"foam.nanos.boot.NSpec", "name":"notificationTemplateDAO", "
p({"class":"foam.nanos.boot.NSpec", "name":"AuthenticatedNSpecDAO", "lazy":true, "serve":true, "serviceClass":"foam.dao.ProxyDAO", "client":"{\"of\":\"foam.nanos.boot.NSpec\",\"cache\":true}"})
p({"class":"foam.nanos.boot.NSpec", "name":"http", "lazy":false, "serve":false, "service":{"class":"foam.nanos.jetty.HttpServer","port":8080,"welcomeFiles":["/src/foam/nanos/controller/index.html"],"servletMappings":[{"class":"foam.nanos.servlet.ServletMapping","className":"foam.nanos.http.NanoRouter","pathSpec":"/service/*"},{"class":"foam.nanos.servlet.ServletMapping","className":"org.eclipse.jetty.servlet.DefaultServlet","pathSpec":"/*","initParameters":{"dirAllowed":"true","redirectWelcome":"true"}}]}})
p({"class":"foam.nanos.boot.NSpec", "name":"httprouter", "lazy":true, "serve":false, "serviceClass":"foam.nanos.http.NanoRouter"})
p({"class":"foam.nanos.boot.NSpec", "name":"websockets", "lazy":false, "serve":false, "serviceClass":"foam.nanos.ws.NanoWebSocketServer"})
p({"class":"foam.nanos.boot.NSpec", "name":"pmLogger", "lazy":true, "serve":false, "serviceClass":"foam.nanos.pm.DAOPMLogger"})
p({"class":"foam.nanos.boot.NSpec", "name":"auth", "lazy":true, "serve":true, "authenticate": false, "boxClass":"foam.nanos.auth.AuthServiceSkeleton", "serviceScript":"return new foam.nanos.auth.PasswordExpiryAuthService.Builder(x).setDelegate(new foam.nanos.auth.UserAndGroupAuthService(x)).build();","client":"{\"class\":\"foam.nanos.auth.ClientAuthService\"}"})
p({"class":"foam.nanos.boot.NSpec", "name":"LogLevelFilterLogger", "lazy":false, "serve":false, "service":{"class":"foam.nanos.logger.LogLevelFilterLogger"}})
Expand Down
5 changes: 5 additions & 0 deletions tools/pom.xml
Original file line number Diff line number Diff line change
Expand Up @@ -87,6 +87,11 @@
<artifactId>postgresql</artifactId>
<version>42.0.0</version>
</dependency>
<dependency>
<groupId>org.java-websocket</groupId>
<artifactId>Java-WebSocket</artifactId>
<version>1.3.4</version>
</dependency>
<dependency>
<groupId>com.authy</groupId>
<artifactId>authy-java</artifactId>
Expand Down

0 comments on commit 2002f85

Please sign in to comment.