COMMUNICATE ALL THE THINGS!!!

Follow Along

#JSConf

@geekgonenomad

WebRTC

Respoke

Code Samples

</QA>

#JSConf

@geekgonenomad

Who Is This Guy?

#JSConf

@geekgonenomad

Kyle Tyacke

Flash / Web Dev

Developer Evangelist Respoke

Beer Geek

#JSConf

@geekgonenomad

What the Heck Is WebRTC?

#JSConf

@geekgonenomad

WebRTC

“is a free, open project that enables web browsers with Real-Time Communications (RTC) capabilities via simple JavaScript APIs.”

#JSConf

@geekgonenomad

WebRTC

“is a free, open project that enables web browsers with Real-Time Communications (RTC) capabilities via simple JavaScript APIs.”

#JSConf

@geekgonenomad

WebRTC

“is a free, open project that enables web browsers with Real-Time Communications (RTC) capabilities via simple JavaScript APIs.”

#JSConf

@geekgonenomad

WebRTC

“is a free, open project that enables web browsers with Real-Time Communications (RTC) capabilities via simple JavaScript APIs.”

#JSConf

@geekgonenomad

WebRTC

“is a free, open project that enables web browsers with Real-Time Communications (RTC) capabilities via simple JavaScript APIs.”

#JSConf

@geekgonenomad

Contributors

#JSConf

@geekgonenomad

WebRTC in the Wild

#JSConf

@geekgonenomad

Amazon Mayday

#JSConf

@geekgonenomad

GoogleHangouts

#JSConf

@geekgonenomad

Apollo

#JSConf

@geekgonenomad

PeerCDN

#JSConf

@geekgonenomad

Cubeslam

#JSConf

@geekgonenomad

Speaking Exchange

#JSConf

@geekgonenomad

Be My Eyes

#JSConf

@geekgonenomad

How Does WebRTC Work?

#JSConf

@geekgonenomad

When Bob Met Alice

#JSConf

@geekgonenomad

An Ideal World!

#JSConf

@geekgonenomad

The Real World...

#JSConf

@geekgonenomad

ICE, ICE, Baby

#JSConf

@geekgonenomad

The Complete Connection

#JSConf

@geekgonenomad

Simple Right?

#JSConf

@geekgonenomad

#JSConf

@geekgonenomad

Respoke?

A set of API's that gives developers the ability to easily add real-time communication to their applications.

#JSConf

@geekgonenomad

Like WebRTC?

#JSConf

@geekgonenomad

#JSConf

@geekgonenomad

Remember This?

#JSConf

@geekgonenomad

#JSConf

@geekgonenomad

But Wait! There's More...

#JSConf

@geekgonenomad

Open Source

Cross-browser Support

Endpoint Discovery

Groups

Messaging

Presence

Phone System Support

Mobile SDKs

#JSConf

@geekgonenomad

<CODE/>

Create a Respoke Account

Getting Connected

#JSConf

@geekgonenomad

 // App ID value from the dev portal. You can play
 // around with the supplied ID or replace it with
 // your own.
 var appid = "b4931d40-ff2b-4c46-8487-bf955a75501d";
 var endpointId;

 // Create the client object using the App ID 
 var client = respoke.createClient({
     appId: appid,
     developmentMode: true
 });

 // "connect" event fired after successful connection to Respoke
 client.listen('connect', function() {
     $("#status").html("Connected to Respoke as \"" + endpointId + "\"");
 });

 // Connect to Respoke when the user clicks "connect"
 $("#doLogin").click(function() {
     // Update the status message
     $("#status").html("Connecting...");

     // Grab our username
     endpointId = $("#endpoint").val();

     // Connect to Respoke
     client.connect({
         endpointId: endpointId
     });
 });

Messaging

#JSConf

@geekgonenomad

// Listen for incoming messages
client.listen('message', function(evt) {
    $("#messages").append(
        "<li>" + evt.message.message + "</li>"
    );
});

// Send message
$("#sendMessage").click(function() {
    // Get the recipients name
    var remote = $("#remoteId").val();

    // Make an endpoint for that recipient
    var endpoint = client.getEndpoint({
        id: remote
    });

    // Grab the text to send
    var messageText = $("#textToSend").val();

    // Send it
    endpoint.sendMessage({
        message: messageText
    });

    // Show yourself the message
    $("#messages").append(
        "<li>" + messageText + "</li>"
    );

    // Clear the text you just sent
    $("#textToSend").val('');
});


Group Messaging

#JSConf

@geekgonenomad

// "connect" event fired after successful connection to Respoke
client.listen('connect', function() {
    $("#status").html("Connected to Respoke as \"" + endpointId + "\"");

    // Update group status message
    $('#groupStatus').html('Joining group ' + groupId);

    // Automatically join the group once connected
    client.join({
        id: groupId,
        onSuccess: function(grp) {
            $('#groupStatus').html('Joined group ' + grp.id);

            // Store reference to the Group object
            this.group = grp;
        },
        onMessage: function(evt) {
            $("#messages").append(
                "<li>" + evt.message.message + "</li>"
            );
        }
    });
});

// Send message
$("#sendMessage").click(function() {
    // Grab the message to send
    var groupMsg = $('#groupMsg').val();

    // Send message to the entire group
    group.sendMessage({
        message: groupMsg
    });

    // Show yourself the message
    $("#messages").append(
        "<li>" + groupMsg + "</li>"
    );

    // Clear the message input
    $("#groupMsg").val('');
});

// Leave the group
$("#leaveGroup").click(function() {
    group.leave({
        onSuccess: function(evt) {
            $('#groupStatus').html('Left group ' + groupId);
        }
    });
});

Video Calling

#JSConf

@geekgonenomad

// The options for our video call including constraints and callbacks
var callOptions = {
    constraints: {
        audio: true,
        video: true
    },

    // Your video
    onLocalMedia: function(evt) {
        setVideo('localVideoSource', evt.element)
    },

    // Their video
    onConnect: function(evt) {
        setVideo('remoteVideoSource', evt.element)
    }
};

// Listen for incoming calls
client.listen('call', function(evt) {
    activeCall = evt.call;

    // We only want to answer if we didn't initiate the call
    if (activeCall.caller !== true) {
        activeCall.answer(callOptions);

        // The hangup event indicates the call is over
        activeCall.listen('hangup', function() {
            hangUp();
        });
    }
});

// Call the recipient
$("#doCall").click(function() {
    var recipientId = $("#remoteId").val();
    var recipientEndpoint = client.getEndpoint({
        id: recipientId
    });
    activeCall = recipientEndpoint.startVideoCall(callOptions);
});

// Hangup the call
$("#doHangUp").click(hangUp);

// Adds the supplied video element as a child of the supplied element
function setVideo(elementId, videoElement) {
    var videoParent = document.getElementById(elementId);
    videoParent.innerHTML = "";
    videoParent.appendChild(videoElement);
}

// End the current call and clean up the DOM
function hangUp() {
    activeCall.hangup();
    activeCall = null;

    // Remove the video elements
    $("#localVideoSource").html("");
    $("#remoteVideoSource").html("");
}

Screen Sharing

#JSConf

@geekgonenomad

// Check if the user has the Chrome Screen Sharing Extension installed
$("#doStartScreenShare").click(function() {
    if (respoke.needsChromeExtension && !respoke.hasChromeExtension) {
        // Install the extension then start screen sharing
        chrome.webstore.install(
            "https://chrome.google.com/webstore/detail/lefkijobnhaffcfhfgpkpkpfgcdcfjbc",
            onExtensionInstallSuccess,
            onExtensionInstallFailure
        );
    } else {
        // Extension is already installed, start screen sharing
        startScreenShare();
    }
});

function onExtensionInstallSuccess(evt) {
    startScreenShare();
}

// Start sharing your screen with the specified recipient
function startScreenShare() {
    var recipientId = $("#remoteId").val();
    var recipientEndpoint = client.getEndpoint({
        id: recipientId
    });

    var localVideoElement = document.getElementById('localVideoElement');
    var remoteVideoElement = document.getElementById('remoteVideoElement');

    activeCall = recipientEndpoint.startScreenShare({
        videoLocalElement: localVideoElement,
        videoRemoteElement: remoteVideoElement
    });

    $("#sharing").html("Sharing your screen with \"" + recipientId + "\"");
}

function onExtensionInstallFailure(evt) {
    console.log("There was a problem installing the Chrome Screen Sharing Extension.", evt);
}

Docs and Additional Examples

#JSConf

@geekgonenomad

What's It All Mean?

#JSConf

@geekgonenomad

Faster Development

#JSConf

@geekgonenomad

Better User Experience

#JSConf

@geekgonenomad

Happy Bosses

#JSConf

@geekgonenomad

Happy Bosses Users!

#JSConf

@geekgonenomad

Communication should be a feature, not a product.

ktyacke@respoke.io

Kyle Tyacke

Examples and Source

@geekgonenomad

Communicate All the Things

By Kyle Tyacke

Communicate All the Things

A talk on getting started with WebRTC and the Respoke Javascript Library.

  • 11,022