Kyle Tyacke
API Evangelist for Akamai. Web Developer. Beer Geek.
#SpaceCityJS
@geekgonenomad
#SpaceCityJS
@geekgonenomad
#SpaceCityJS
@geekgonenomad
#SpaceCityJS
@geekgonenomad
#SpaceCityJS
@geekgonenomad
#SpaceCityJS
@geekgonenomad
#SpaceCityJS
@geekgonenomad
#SpaceCityJS
@geekgonenomad
#SpaceCityJS
@geekgonenomad
#SpaceCityJS
@geekgonenomad
#SpaceCityJS
@geekgonenomad
#SpaceCityJS
@geekgonenomad
#SpaceCityJS
@geekgonenomad
#SpaceCityJS
@geekgonenomad
#SpaceCityJS
@geekgonenomad
#SpaceCityJS
@geekgonenomad
#SpaceCityJS
@geekgonenomad
#SpaceCityJS
@geekgonenomad
#SpaceCityJS
@geekgonenomad
#SpaceCityJS
@geekgonenomad
#SpaceCityJS
@geekgonenomad
#SpaceCityJS
@geekgonenomad
#SpaceCityJS
@geekgonenomad
#SpaceCityJS
@geekgonenomad
#SpaceCityJS
@geekgonenomad
#SpaceCityJS
@geekgonenomad
#SpaceCityJS
@geekgonenomad
#SpaceCityJS
@geekgonenomad
#SpaceCityJS
@geekgonenomad
#SpaceCityJS
@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
});
});
#SpaceCityJS
@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('');
});
#SpaceCityJS
@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);
}
});
});
#SpaceCityJS
@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("");
}
#SpaceCityJS
@geekgonenomad
<!DOCTYPE html>
<head>
<title>Respoke - Screensharing Example</title>
<!-- Respoke client library -->
<!-- <script src="https://cdn.respoke.io/respoke.min.js"></script> -->
<script src="https://cdn.respoke.io/respoke.min.js"></script>
<!-- jQuery, note that we are loading over HTTPS from google's CDN -->
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.3/jquery.min.js"></script>
<!-- Some simple styles to make things perty -->
<link rel="stylesheet" type="text/css" href="style.css">
<!-- Chrome screensharing extension -->
<link rel="chrome-webstore-item" href="https://chrome.google.com/webstore/detail/lefkijobnhaffcfhfgpkpkpfgcdcfjbc">
</head>
<body>
<h3 id="status">Not Connected</h3>
<h4 id="sharing"></h3>
<div id="login">
<input id="endpoint" placeholder="Username" type="text" />
<button id="doLogin">Connect</button>
</div>
<div>
<input id="remoteId" placeholder="User to Call" type="text" />
<button id="doStartScreenShare">Share Screen</button>
<button id="doStopScreenShare">Stop Sharing</button>
</div>
<!-- Video object to attach the stream to -->
<video id="localVideoElement"></video>
<video id="remoteVideoElement"></video>
<script type="text/javascript">
$(function() {
// 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 activeCall;
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() {
$("#status").html("Connecting...");
endpointId = $("#endpoint").val();
client.connect({
endpointId: endpointId // your username is the endpoint
});
});
// 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) {
var localVideoElement = document.getElementById('localVideoElement');
var remoteVideoElement = document.getElementById('remoteVideoElement');
activeCall.answer({
videoLocalElement: localVideoElement,
videoRemoteElement: remoteVideoElement
});
// The hangup event indicates the call is over
activeCall.listen('hangup', function () {
hangUp();
});
}
});
// 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);
}
// Stop the screen share
$("#doStopScreenShare").click(stopScreenShare);
// Stop the screen share and clean up the DOM
function stopScreenShare() {
activeCall.hangup();
activeCall = null;
// Remove the video elements
$("#localVideoSource").html("");
$("#remoteVideoSource").html("");
}
});
</script>
</body>
</html>
#SpaceCityJS
@geekgonenomad
#SpaceCityJS
@geekgonenomad
#SpaceCityJS
@geekgonenomad
#SpaceCityJS
@geekgonenomad
#SpaceCityJS
@geekgonenomad
#SpaceCityJS
@geekgonenomad
By Kyle Tyacke
A talk on getting started with WebRTC and the Respoke Javascript Library.