2626#include " rtccertificate.h"
2727#include " rtcpeerconnection.h"
2828#include " rtcsessiondescription.h"
29+ #include " rtcdatachannel.h"
2930
3031Nan::Persistent<FunctionTemplate> RTCPeerConnection::constructor;
3132
3233static const char sRTCPeerConnection [] = " RTCPeerConnection" ;
3334
3435static const char kCreateOffer [] = " createOffer" ;
36+ static const char kCreateAnswer [] = " createAnswer" ;
3537static const char kSetLocalDescription [] = " setLocalDescription" ;
38+ static const char kSetRemoteDescription [] = " setRemoteDescription" ;
3639static const char kCreateDataChannel [] = " createDataChannel" ;
3740static const char kGenerateCertificate [] = " generateCertificate" ;
3841
@@ -94,7 +97,9 @@ NAN_MODULE_INIT(RTCPeerConnection::Init) {
9497
9598 Local<ObjectTemplate> prototype = ctor->InstanceTemplate ();
9699 Nan::SetMethod (prototype, kCreateOffer , CreateOffer);
100+ Nan::SetMethod (prototype, kCreateAnswer , CreateAnswer);
97101 Nan::SetMethod (prototype, kSetLocalDescription , SetLocalDescription);
102+ Nan::SetMethod (prototype, kSetRemoteDescription , SetRemoteDescription);
98103 Nan::SetMethod (prototype, kCreateDataChannel , CreateDataChannel);
99104
100105 Local<ObjectTemplate> tpl = ctor->InstanceTemplate ();
@@ -159,7 +164,6 @@ NAN_METHOD(RTCPeerConnection::New) {
159164 ASSERT_PROPERTY_STRING (kIceServerUrls , iceServerUrlVal, iceServerUrl);
160165 server.urls .push_back (*iceServerUrl);
161166 }
162-
163167 _config.servers .push_back (server);
164168 }
165169
@@ -228,6 +232,35 @@ NAN_METHOD(RTCPeerConnection::CreateOffer) {
228232 object->_peerConnection ->CreateOffer (observer, &constraints);
229233}
230234
235+ NAN_METHOD (RTCPeerConnection::CreateAnswer) {
236+ METHOD_HEADER (" RTCPeerConnection" , " createAnswer" );
237+ UNWRAP_OBJECT (RTCPeerConnection, object);
238+
239+ unsigned char start = 0 ;
240+ rtc::scoped_refptr<webrtc::CreateSessionDescriptionObserver> observer;
241+
242+ if (info.Length () < 2 ) {
243+ DECLARE_PROMISE_RESOLVER;
244+
245+ observer = CreateSessionDescriptionObserver::Create (
246+ new Nan::Persistent<Promise::Resolver>(resolver));
247+ } else if (info.Length () > 1 ) {
248+ if (info.Length () > 2 ) {
249+ start = 1 ;
250+ }
251+
252+ ASSERT_FUNCTION_ARGUMENT (start, successCallback);
253+ ASSERT_FUNCTION_ARGUMENT (start + 1 , failureCallback);
254+
255+ observer = CreateSessionDescriptionObserver::Create (
256+ new Nan::Persistent<Function>(successCallback),
257+ new Nan::Persistent<Function>(failureCallback));
258+ }
259+
260+ webrtc::FakeConstraints constraints;
261+ object->_peerConnection ->CreateAnswer (observer, &constraints);
262+ }
263+
231264NAN_METHOD (RTCPeerConnection::SetLocalDescription) {
232265 METHOD_HEADER (" RTCPeerConnection" , " setLocalDescription" );
233266 UNWRAP_OBJECT (RTCPeerConnection, object);
@@ -245,19 +278,41 @@ NAN_METHOD(RTCPeerConnection::SetLocalDescription) {
245278 new Nan::Persistent<Promise::Resolver>(resolver));
246279
247280 object->_peerConnection ->SetLocalDescription (observer, _sessionDescription->_sessionDescription );
281+ }
282+
283+ NAN_METHOD (RTCPeerConnection::SetRemoteDescription) {
284+ METHOD_HEADER (" RTCPeerConnection" , " setRemoteDescription" );
285+ UNWRAP_OBJECT (RTCPeerConnection, object);
286+
287+ rtc::scoped_refptr<webrtc::SetSessionDescriptionObserver> observer;
288+
289+ // FIXME: Promise implementation only
290+ DECLARE_PROMISE_RESOLVER;
291+ ASSERT_REJECT_OBJECT_ARGUMENT (0 , sessionDescription);
292+
293+ // FIXME: validate it's a RTCSessionDescription object
294+ RTCSessionDescription* _sessionDescription = Nan::ObjectWrap::Unwrap<RTCSessionDescription>(sessionDescription);
248295
296+ observer = SetSessionDescriptionObserver::Create (
297+ new Nan::Persistent<Promise::Resolver>(resolver));
298+
299+ object->_peerConnection ->SetRemoteDescription (observer, _sessionDescription->_sessionDescription );
249300}
250301
251302NAN_METHOD (RTCPeerConnection::CreateDataChannel) {
252- METHOD_HEADER (" RTCPeerConnection" , " setLocalDescription " );
303+ METHOD_HEADER (" RTCPeerConnection" , " createDataChannel " );
253304 UNWRAP_OBJECT (RTCPeerConnection, object);
254305
255306 ASSERT_STRING_ARGUMENT (0 , name);
256307
308+ // FIXME: add init options
257309 const webrtc::DataChannelInit init;
258310
259- object->_peerConnection ->CreateDataChannel (*name, &init);
311+ rtc::scoped_refptr<webrtc::DataChannelInterface> _channel = object->_peerConnection ->CreateDataChannel (*name, &init);
312+
313+ Local<Object> datachannel = RTCDataChannel::Create (_channel);
260314
315+ info.GetReturnValue ().Set (datachannel);
261316}
262317
263318NAN_GETTER (RTCPeerConnection::GetConnectionState) {
0 commit comments