package im.actor.runtime.js.webrtc.js; import com.google.gwt.core.client.JavaScriptObject; import im.actor.runtime.js.entity.JsClosure; import im.actor.runtime.js.entity.JsClosureError; public class JsPeerConnection extends JavaScriptObject { public static native JsPeerConnection create(JsPeerConnectionConfig config)/*-{ var peerConnectionClass = $wnd.RTCPeerConnection || $wnd.mozRTCPeerConnection || $wnd.webkitRTCPeerConnection || $wnd.msRTCPeerConnection; return {peerConnection: new peerConnectionClass(config)}; }-*/; protected JsPeerConnection() { } public final native void addStream(JsMediaStream stream)/*-{ this.peerConnection.addStream(stream); }-*/; public final native void removeStream(JsMediaStream stream)/*-{ this.peerConnection.removeStream(stream); }-*/; public final native void addIceCandidate(int label, String candidate)/*-{ this.peerConnection.addIceCandidate(new RTCIceCandidate({sdpMLineIndex: label, candidate: candidate})); }-*/; public final native void close()/*-{ this.peerConnection.close(); }-*/; public final native void createOffer(JsSessionDescriptionCallback callback)/*-{ var sdpConstraints = { 'mandatory': { 'OfferToReceiveAudio': true, 'OfferToReceiveVideo': true } }; this.peerConnection.createOffer(function(offer) { callback.@im.actor.runtime.js.webrtc.js.JsSessionDescriptionCallback::onOfferCreated(*)(offer); }, function(error) { $wnd.console.warn(error); callback.@im.actor.runtime.js.webrtc.js.JsSessionDescriptionCallback::onOfferFailure(*)(); }, sdpConstraints); }-*/; public final native void createAnswer(JsSessionDescriptionCallback callback)/*-{ var sdpConstraints = { 'mandatory': { 'OfferToReceiveAudio': true, 'OfferToReceiveVideo': true } }; this.peerConnection.createAnswer(function(offer) { callback.@im.actor.runtime.js.webrtc.js.JsSessionDescriptionCallback::onOfferCreated(*)(offer); }, function(error) { $wnd.console.warn(error); callback.@im.actor.runtime.js.webrtc.js.JsSessionDescriptionCallback::onOfferFailure(*)(); }, sdpConstraints); }-*/; public final native void setRemoteDescription(JsSessionDescription description, JsClosure closure, JsClosureError error)/*-{ this.peerConnection.setRemoteDescription(description, function() { closure.@im.actor.runtime.js.entity.JsClosure::callback(*)(); }, function(e) { $wnd.console.warn(e); error.@im.actor.runtime.js.entity.JsClosureError::onError(*)(e); }); }-*/; public final native void setLocalDescription(JsSessionDescription description, JsClosure closure, JsClosureError error)/*-{ this.peerConnection.setLocalDescription(description, function() { closure.@im.actor.runtime.js.entity.JsClosure::callback(*)(); }, function(e) { $wnd.console.warn(e); error.@im.actor.runtime.js.entity.JsClosureError::onError(*)(e); }); }-*/; public final native void setListener(JsPeerConnectionListener listener)/*-{ this.peerConnection.onicecandidate = function(candidate) { if (candidate.candidate != null) { listener.@im.actor.runtime.js.webrtc.js.JsPeerConnectionListener::onIceCandidate(*)(candidate.candidate); } }; this.peerConnection.onaddstream = function(event) { listener.@im.actor.runtime.js.webrtc.js.JsPeerConnectionListener::onStreamAdded(*)(event.stream); } this.peerConnection.onremovestream = function(event) { listener.@im.actor.runtime.js.webrtc.js.JsPeerConnectionListener::onStreamRemoved(*)(event.stream); } this.peerConnection.onnegotiationneeded = function(event) { listener.@im.actor.runtime.js.webrtc.js.JsPeerConnectionListener::onRenegotiationNeeded(*)(); } }-*/; }