package jj.engine; import javax.inject.Inject; import javax.inject.Singleton; import jj.http.server.websocket.CurrentWebSocketConnection; import jj.jjmessage.JJMessage; import jj.script.CurrentScriptEnvironment; import org.mozilla.javascript.BaseFunction; import org.mozilla.javascript.Context; import org.mozilla.javascript.Scriptable; @Singleton public class DoInvokeFunction extends BaseFunction implements HostObject { private static final long serialVersionUID = 1L; public static final String PROP_DO_INVOKE = "//doInvoke"; private final CurrentWebSocketConnection connection; private final CurrentScriptEnvironment env; @Inject public DoInvokeFunction(final CurrentWebSocketConnection connection, final CurrentScriptEnvironment env) { this.connection = connection; this.env = env; } @Override public String name() { return PROP_DO_INVOKE; } @Override public boolean constant() { return true; } @Override public boolean readonly() { return true; } @Override public boolean permanent() { return true; } @Override public boolean dontenum() { return true; } @Override public Object call(Context cx, Scriptable scope, Scriptable thisObj, Object[] args) { assert connection.current() != null : "cannot invoke remote functions without a connected client in context"; JJMessage message = JJMessage.makeInvoke(String.valueOf(args[0]), String.valueOf(args[1])); connection.current().send(message); throw env.preparedContinuation(message); } @Override public Scriptable construct(Context cx, Scriptable scope, Object[] args) { throw new UnsupportedOperationException(); } }