/* * To change this license header, choose License Headers in Project Properties. * To change this template file, choose Tools | Templates * and open the template in the editor. */ package com.eas.server.websocket; import com.eas.script.AlreadyPublishedException; import com.eas.script.HasPublished; import com.eas.script.NoPublisherException; import com.eas.script.ScriptFunction; import com.eas.script.ScriptObj; import com.eas.script.Scripts; import java.io.IOException; import java.net.URI; import java.util.logging.Level; import java.util.logging.Logger; import javax.websocket.CloseReason; import javax.websocket.ContainerProvider; import javax.websocket.DeploymentException; import javax.websocket.Session; import jdk.nashorn.api.scripting.JSObject; /** * * @author mg */ @ScriptObj(name = "WebSocket") public class WebSocketClientSession implements HasPublished { protected JSObject published; protected Session webSocketSession; // protected JsClientEndPoint endPoint = new JsClientEndPoint(this, Scripts.getContext(), Scripts.getSpace()); @ScriptFunction(params = {"uri"}) public WebSocketClientSession(String aUri) throws Exception { super(); Scripts.getSpace().process(() -> { try { webSocketSession = ContainerProvider.getWebSocketContainer().connectToServer(endPoint, URI.create(aUri)); } catch (DeploymentException | IOException ex) { Logger.getLogger(WebSocketClientSession.class.getName()).log(Level.SEVERE, null, ex); } }); } @ScriptFunction public void close(Double opCode, String aReason) throws Exception { if (opCode == null) { opCode = Double.valueOf(CloseReason.CloseCodes.NO_STATUS_CODE.getCode()); } if (aReason == null) { aReason = ""; } if (webSocketSession.isOpen()) { webSocketSession.close(new CloseReason(CloseReason.CloseCodes.getCloseCode(opCode.intValue()), aReason)); } } @ScriptFunction(params = "data") public void send(String aData) { try { if (webSocketSession.isOpen()) { webSocketSession.getBasicRemote().sendText(aData); } } catch (IOException ex) { Logger.getLogger(WebSocketClientSession.class.getName()).log(Level.SEVERE, null, ex); } } @ScriptFunction public String getId() { return webSocketSession.getId(); } @ScriptFunction public String getProtocolVersion() { return webSocketSession.getProtocolVersion(); } @ScriptFunction public String getQuery() { return webSocketSession.getQueryString(); } @ScriptFunction public String getUri() { return webSocketSession.getRequestURI().toString(); } @ScriptFunction public JSObject getOnopen() { return endPoint.getOnopen(); } @ScriptFunction public void setOnopen(JSObject onopen) { endPoint.setOnopen(onopen); } @ScriptFunction public JSObject getOnclose() { return endPoint.getOnclose(); } @ScriptFunction public void setOnclose(JSObject onclose) { endPoint.setOnclose(onclose); } @ScriptFunction public JSObject getOnerror() { return endPoint.getOnerror(); } @ScriptFunction public void setOnerror(JSObject onerror) { endPoint.setOnerror(onerror); } @ScriptFunction public JSObject getOnmessage() { return endPoint.getOnmessage(); } @ScriptFunction public void setOnmessage(JSObject onmessage) { endPoint.setOnmessage(onmessage); } @Override public void setPublished(JSObject aValue) { if (published != null) { throw new AlreadyPublishedException(); } published = aValue; } @Override public JSObject getPublished() { if (published == null) { JSObject publisher = Scripts.getSpace().getPublisher(this.getClass().getName()); if (publisher == null || !publisher.isFunction()) { throw new NoPublisherException(); } published = (JSObject) publisher.call(null, new Object[]{this}); } return published; } }