-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathI3sinNeqwZU.json
1 lines (1 loc) · 106 KB
/
I3sinNeqwZU.json
1
[{"text": "foreign", "start": 0.0, "duration": 2.719}, {"text": "hello everyone welcome and thank you for", "start": 3.0, "duration": 3.54}, {"text": "being here today", "start": 5.339, "duration": 3.241}, {"text": "we will be presenting otter a cloud", "start": 6.54, "duration": 3.66}, {"text": "native framework for peer-to-peer video", "start": 8.58, "duration": 5.18}, {"text": "communication within web applications", "start": 10.2, "duration": 3.56}, {"text": "my name is Connor and these are my", "start": 16.379, "duration": 4.501}, {"text": "colleagues Chris Max and Kush we created", "start": 18.0, "duration": 3.9}, {"text": "otter together over the last couple", "start": 20.88, "duration": 2.34}, {"text": "months and we're excited to share our", "start": 21.9, "duration": 4.34}, {"text": "application here with you today", "start": 23.22, "duration": 3.02}, {"text": "so to get us started we'll first get an", "start": 26.82, "duration": 3.779}, {"text": "overview of video calling and the design", "start": 28.619, "duration": 3.601}, {"text": "decisions that a developer might have to", "start": 30.599, "duration": 3.841}, {"text": "consider when implementing video calling", "start": 32.22, "duration": 4.2}, {"text": "next we'll go in depth into the topic of", "start": 34.44, "duration": 4.68}, {"text": "webrtc what it is why a developer would", "start": 36.42, "duration": 4.2}, {"text": "want to use it and for the developer who", "start": 39.12, "duration": 3.0}, {"text": "does want to use it what available", "start": 40.62, "duration": 3.42}, {"text": "Solutions exist", "start": 42.12, "duration": 3.84}, {"text": "next we'll explain how we designed otter", "start": 44.04, "duration": 3.179}, {"text": "with the current available Solutions in", "start": 45.96, "duration": 3.24}, {"text": "mind we'll discuss otters architecture", "start": 47.219, "duration": 4.441}, {"text": "and show a short demo we'll bring up the", "start": 49.2, "duration": 3.66}, {"text": "engineering challenges we face while", "start": 51.66, "duration": 2.879}, {"text": "designing otter discuss what we want to", "start": 52.86, "duration": 3.12}, {"text": "implement in the future and then at the", "start": 54.539, "duration": 2.52}, {"text": "very end we'll open the floor to", "start": 55.98, "duration": 3.38}, {"text": "questions", "start": 57.059, "duration": 2.301}, {"text": "so to begin let's first hone in on the", "start": 60.239, "duration": 4.081}, {"text": "domain in which otter whips and that's", "start": 62.399, "duration": 3.781}, {"text": "video calling and the last few years", "start": 64.32, "duration": 3.24}, {"text": "especially we've seen the relevance of", "start": 66.18, "duration": 3.84}, {"text": "video calling Skyrocket from Telehealth", "start": 67.56, "duration": 4.02}, {"text": "to online classes virtual business", "start": 70.02, "duration": 3.36}, {"text": "meetings video calling is more popular", "start": 71.58, "duration": 3.96}, {"text": "now than ever and so naturally it's not", "start": 73.38, "duration": 3.48}, {"text": "surprising that developers are", "start": 75.54, "duration": 3.119}, {"text": "increasingly interested in implementing", "start": 76.86, "duration": 3.48}, {"text": "video calling functionality into their", "start": 78.659, "duration": 3.0}, {"text": "application", "start": 80.34, "duration": 3.3}, {"text": "so for the developer who wants to add", "start": 81.659, "duration": 3.841}, {"text": "video calling to their application what", "start": 83.64, "duration": 3.54}, {"text": "needs to be considered", "start": 85.5, "duration": 3.479}, {"text": "well different use cases are going to", "start": 87.18, "duration": 3.06}, {"text": "Warrant different design decisions", "start": 88.979, "duration": 2.701}, {"text": "that's how a health video calling", "start": 90.24, "duration": 2.58}, {"text": "application might look very different", "start": 91.68, "duration": 2.88}, {"text": "than a video calling application for", "start": 92.82, "duration": 3.18}, {"text": "online classes", "start": 94.56, "duration": 3.239}, {"text": "however one design decision that should", "start": 96.0, "duration": 3.24}, {"text": "be considered is a trade-offs between", "start": 97.799, "duration": 3.541}, {"text": "two major Network models client server", "start": 99.24, "duration": 5.82}, {"text": "versus peer-to-peer", "start": 101.34, "duration": 5.16}, {"text": "and for people who are not familiar", "start": 105.06, "duration": 2.76}, {"text": "here's just a quick introduction to", "start": 106.5, "duration": 2.52}, {"text": "these models", "start": 107.82, "duration": 3.119}, {"text": "in a peer-to-peer Network shown on the", "start": 109.02, "duration": 3.72}, {"text": "left devices are able to communicate", "start": 110.939, "duration": 3.481}, {"text": "directly with each other without the", "start": 112.74, "duration": 3.54}, {"text": "need for a central server and this is", "start": 114.42, "duration": 3.42}, {"text": "contrasted with a traditional client", "start": 116.28, "duration": 3.479}, {"text": "server model shown on the right in which", "start": 117.84, "duration": 4.319}, {"text": "devices connect to a central server and", "start": 119.759, "duration": 3.72}, {"text": "the server manages the communication", "start": 122.159, "duration": 3.481}, {"text": "between the devices", "start": 123.479, "duration": 5.161}, {"text": "so in the context of excuse me video", "start": 125.64, "duration": 6.72}, {"text": "calling why does any of this matter", "start": 128.64, "duration": 5.52}, {"text": "well a peer-to-peer Network can bring", "start": 132.36, "duration": 3.54}, {"text": "multiple benefits over a client server", "start": 134.16, "duration": 3.5}, {"text": "Network in the context of video calls", "start": 135.9, "duration": 4.08}, {"text": "for example a peer-to-peer Network can", "start": 137.66, "duration": 3.88}, {"text": "yield increased privacy for the end", "start": 139.98, "duration": 3.36}, {"text": "users since in a client server model", "start": 141.54, "duration": 3.48}, {"text": "data will have to pass through a server", "start": 143.34, "duration": 3.24}, {"text": "and the data can be monitored as it's", "start": 145.02, "duration": 3.06}, {"text": "passing through the server since", "start": 146.58, "duration": 3.06}, {"text": "peer-to-peer networks eliminate the need", "start": 148.08, "duration": 3.18}, {"text": "for a server they therefore eliminate", "start": 149.64, "duration": 3.48}, {"text": "this possibility thus increasing the", "start": 151.26, "duration": 3.72}, {"text": "Privacy for the end users", "start": 153.12, "duration": 3.78}, {"text": "a peer-to-peer Network can also lead to", "start": 154.98, "duration": 4.08}, {"text": "decreased latency between peers since", "start": 156.9, "duration": 3.96}, {"text": "with the client server model data has to", "start": 159.06, "duration": 3.539}, {"text": "stop at the server before being sent to", "start": 160.86, "duration": 3.78}, {"text": "its destination if you take out the", "start": 162.599, "duration": 3.481}, {"text": "central server data is able to travel", "start": 164.64, "duration": 3.06}, {"text": "directly from one period to the other", "start": 166.08, "duration": 3.659}, {"text": "and this can reduce latency for the end", "start": 167.7, "duration": 4.5}, {"text": "users and for a video call being low", "start": 169.739, "duration": 3.841}, {"text": "latency is something that's super", "start": 172.2, "duration": 2.88}, {"text": "important to ensuring that the call", "start": 173.58, "duration": 3.72}, {"text": "appears as real time and responsive as", "start": 175.08, "duration": 4.14}, {"text": "possible and we'll discuss latency a", "start": 177.3, "duration": 3.659}, {"text": "little more later", "start": 179.22, "duration": 3.78}, {"text": "a peer-to-peer Network can also bring", "start": 180.959, "duration": 4.201}, {"text": "increased Network resilience since in a", "start": 183.0, "duration": 4.379}, {"text": "client server model a central server", "start": 185.16, "duration": 4.5}, {"text": "represents a single point of failure if", "start": 187.379, "duration": 3.901}, {"text": "the server goes down then peers can no", "start": 189.66, "duration": 3.659}, {"text": "longer video call but a peer-to-peer", "start": 191.28, "duration": 3.48}, {"text": "network doesn't have this problem since", "start": 193.319, "duration": 3.121}, {"text": "each peer is responsible for", "start": 194.76, "duration": 3.24}, {"text": "transporting video data to the other", "start": 196.44, "duration": 3.78}, {"text": "peers there's no Central server that has", "start": 198.0, "duration": 4.62}, {"text": "to shoulder this entire burden", "start": 200.22, "duration": 4.32}, {"text": "finally a peer-to-peer Network can also", "start": 202.62, "duration": 3.42}, {"text": "be more cost effective since cutting out", "start": 204.54, "duration": 3.0}, {"text": "a central server means the developer", "start": 206.04, "duration": 2.94}, {"text": "doesn't have to pay to provision or", "start": 207.54, "duration": 3.74}, {"text": "maintain these servers", "start": 208.98, "duration": 5.16}, {"text": "the main downside of peer-to-peer in the", "start": 211.28, "duration": 5.56}, {"text": "context of video calling is call size so", "start": 214.14, "duration": 3.9}, {"text": "as you can see in our purple", "start": 216.84, "duration": 3.0}, {"text": "peer-to-peer diagram right now we have", "start": 218.04, "duration": 3.3}, {"text": "just one peer connected to one other", "start": 219.84, "duration": 3.539}, {"text": "peer however let's see what happens if", "start": 221.34, "duration": 5.42}, {"text": "we try to add more peers to the call", "start": 223.379, "duration": 3.381}, {"text": "so in its simplest form a peer-to-peer", "start": 227.0, "duration": 4.78}, {"text": "Network requires that every single peer", "start": 229.86, "duration": 3.959}, {"text": "in the network connects to every other", "start": 231.78, "duration": 4.019}, {"text": "peer in the network and so in a", "start": 233.819, "duration": 3.661}, {"text": "peer-to-peer video call with six peers", "start": 235.799, "duration": 4.321}, {"text": "each peer has to send its video data in", "start": 237.48, "duration": 4.2}, {"text": "five different directions and has to", "start": 240.12, "duration": 3.36}, {"text": "process five separate incoming video", "start": 241.68, "duration": 4.139}, {"text": "streams from the other peers", "start": 243.48, "duration": 4.619}, {"text": "since the burden of transporting data to", "start": 245.819, "duration": 3.961}, {"text": "the other peers in a peer-to-peer", "start": 248.099, "duration": 3.601}, {"text": "network is placed on the individual", "start": 249.78, "duration": 4.5}, {"text": "devices this means that call sizes have", "start": 251.7, "duration": 4.86}, {"text": "to remain small otherwise the individual", "start": 254.28, "duration": 3.84}, {"text": "devices will become overwhelmed with", "start": 256.56, "duration": 3.299}, {"text": "having to send and receive so many", "start": 258.12, "duration": 3.6}, {"text": "different video streams", "start": 259.859, "duration": 3.661}, {"text": "this problem doesn't really happen in a", "start": 261.72, "duration": 3.24}, {"text": "client server model as you can see on", "start": 263.52, "duration": 3.66}, {"text": "the right since each device only has to", "start": 264.96, "duration": 4.38}, {"text": "communicate with one other entity the", "start": 267.18, "duration": 3.36}, {"text": "central server", "start": 269.34, "duration": 2.94}, {"text": "what this means is typically a", "start": 270.54, "duration": 3.12}, {"text": "peer-to-peer call might be able to", "start": 272.28, "duration": 5.22}, {"text": "support up to around five or six people", "start": 273.66, "duration": 5.64}, {"text": "and this leads us into the benefits of", "start": 277.5, "duration": 3.96}, {"text": "the client server model greater call", "start": 279.3, "duration": 4.38}, {"text": "size because the server is managing the", "start": 281.46, "duration": 4.739}, {"text": "connections between peers video calls", "start": 283.68, "duration": 3.66}, {"text": "are able to support many more", "start": 286.199, "duration": 2.94}, {"text": "participants under a client server model", "start": 287.34, "duration": 3.78}, {"text": "and this is mainly because the server is", "start": 289.139, "duration": 4.321}, {"text": "under the developer's control and so the", "start": 291.12, "duration": 4.139}, {"text": "developer can scale the hardware of the", "start": 293.46, "duration": 3.48}, {"text": "server or potentially even scale to", "start": 295.259, "duration": 3.66}, {"text": "multiple servers in order to handle", "start": 296.94, "duration": 3.92}, {"text": "increased call sizes", "start": 298.919, "duration": 4.081}, {"text": "another notable benefit that you get", "start": 300.86, "duration": 3.7}, {"text": "from the client server model is", "start": 303.0, "duration": 3.9}, {"text": "real-time processing abilities for", "start": 304.56, "duration": 4.26}, {"text": "example the ability to record a call", "start": 306.9, "duration": 4.32}, {"text": "apply real-time closed captions or", "start": 308.82, "duration": 4.14}, {"text": "facial recognition or even use an AI", "start": 311.22, "duration": 3.6}, {"text": "note taker", "start": 312.96, "duration": 3.959}, {"text": "so both of these Network models have", "start": 314.82, "duration": 3.72}, {"text": "their respective use cases for video", "start": 316.919, "duration": 3.661}, {"text": "calling a client server model would", "start": 318.54, "duration": 3.599}, {"text": "likely be a more effective choice for a", "start": 320.58, "duration": 2.82}, {"text": "developer who needs to support call", "start": 322.139, "duration": 3.361}, {"text": "sizes of more than a few people or who", "start": 323.4, "duration": 3.18}, {"text": "needs additional features like the", "start": 325.5, "duration": 2.759}, {"text": "ability to record calls and so this", "start": 326.58, "duration": 3.179}, {"text": "model could make sense for a developer", "start": 328.259, "duration": 3.241}, {"text": "who wants to implement video calling for", "start": 329.759, "duration": 4.681}, {"text": "online classes to support large business", "start": 331.5, "duration": 4.86}, {"text": "meetings or who needs to record video", "start": 334.44, "duration": 3.42}, {"text": "calls that can be reviewed later for", "start": 336.36, "duration": 4.1}, {"text": "training purposes", "start": 337.86, "duration": 2.6}, {"text": "however for a developer working on an", "start": 340.5, "duration": 3.479}, {"text": "application where privacy is of the", "start": 342.18, "duration": 3.78}, {"text": "utmost importance a peer-to-peer model", "start": 343.979, "duration": 4.021}, {"text": "would be a better fit for example", "start": 345.96, "duration": 4.26}, {"text": "Telehealth calls or virtual legal", "start": 348.0, "duration": 4.68}, {"text": "consultations are situations where calls", "start": 350.22, "duration": 3.78}, {"text": "will often contain sensitive information", "start": 352.68, "duration": 3.54}, {"text": "and so the Privacy that you gain by", "start": 354.0, "duration": 3.96}, {"text": "removing a central server which can", "start": 356.22, "duration": 3.36}, {"text": "process and monitor your Communications", "start": 357.96, "duration": 4.079}, {"text": "is a notable benefit", "start": 359.58, "duration": 4.44}, {"text": "also the private nature of these calls", "start": 362.039, "duration": 3.961}, {"text": "means that call sizes will usually never", "start": 364.02, "duration": 4.26}, {"text": "be larger than a few people and so the", "start": 366.0, "duration": 3.72}, {"text": "fact that peer-to-peer calls can only", "start": 368.28, "duration": 3.06}, {"text": "support a few participants might not be", "start": 369.72, "duration": 4.16}, {"text": "a limiting factor here", "start": 371.34, "duration": 5.16}, {"text": "so for the developer who wants to add", "start": 373.88, "duration": 4.36}, {"text": "peer-to-peer video calling to their", "start": 376.5, "duration": 2.759}, {"text": "application", "start": 378.24, "duration": 3.42}, {"text": "what else needs to be considered what", "start": 379.259, "duration": 3.901}, {"text": "other design decisions can affect the", "start": 381.66, "duration": 3.42}, {"text": "end user experience as we started to", "start": 383.16, "duration": 3.9}, {"text": "mention before an important aspect that", "start": 385.08, "duration": 3.66}, {"text": "makes video calls feel responsive is", "start": 387.06, "duration": 3.96}, {"text": "latency or in other words how long data", "start": 388.74, "duration": 4.5}, {"text": "takes to travel from its origin to its", "start": 391.02, "duration": 4.64}, {"text": "destination", "start": 393.24, "duration": 2.42}, {"text": "in a real-time video call a higher", "start": 396.0, "duration": 4.02}, {"text": "latency will result in a longer delay", "start": 398.16, "duration": 4.08}, {"text": "between when one person speaks or moves", "start": 400.02, "duration": 4.14}, {"text": "and when the other person hears or sees", "start": 402.24, "duration": 2.76}, {"text": "that", "start": 404.16, "duration": 2.7}, {"text": "and so a high latency can make it", "start": 405.0, "duration": 3.18}, {"text": "difficult to feel like you could have a", "start": 406.86, "duration": 3.3}, {"text": "natural conversation and in its worst", "start": 408.18, "duration": 3.72}, {"text": "form it can feel like you're reacting to", "start": 410.16, "duration": 3.0}, {"text": "something that already happened several", "start": 411.9, "duration": 2.76}, {"text": "seconds ago", "start": 413.16, "duration": 3.539}, {"text": "so from the perspective of a developer", "start": 414.66, "duration": 4.02}, {"text": "how do we design our video calling", "start": 416.699, "duration": 3.84}, {"text": "application in a way that minimizes", "start": 418.68, "duration": 3.12}, {"text": "latency", "start": 420.539, "duration": 3.301}, {"text": "well latency can actually be affected by", "start": 421.8, "duration": 3.839}, {"text": "how data is transmitted over the network", "start": 423.84, "duration": 4.079}, {"text": "so next let's go ahead and explore the", "start": 425.639, "duration": 3.9}, {"text": "trade-offs of implementing real-time", "start": 427.919, "duration": 4.741}, {"text": "video using TCP or transmission control", "start": 429.539, "duration": 6.061}, {"text": "protocol versus UDP or user datagram", "start": 432.66, "duration": 4.979}, {"text": "protocol", "start": 435.6, "duration": 4.8}, {"text": "and just as a brief introduction TCP and", "start": 437.639, "duration": 5.941}, {"text": "UDP are both protocols that specify how", "start": 440.4, "duration": 5.519}, {"text": "data should be sent over the network", "start": 443.58, "duration": 4.559}, {"text": "TCP is a protocol that's designed to", "start": 445.919, "duration": 3.661}, {"text": "make data transmission across the", "start": 448.139, "duration": 3.78}, {"text": "network reliable and it does this by", "start": 449.58, "duration": 3.6}, {"text": "ensuring a connection has to be", "start": 451.919, "duration": 3.481}, {"text": "established before sending data provides", "start": 453.18, "duration": 3.6}, {"text": "guarantees the data has been delivered", "start": 455.4, "duration": 4.38}, {"text": "and TCP will retransmit data if any data", "start": 456.78, "duration": 4.319}, {"text": "is lost along the way", "start": 459.78, "duration": 3.72}, {"text": "However the fact that TCP provides these", "start": 461.099, "duration": 3.781}, {"text": "guarantees and re-transmission", "start": 463.5, "duration": 4.56}, {"text": "mechanisms actually increases latency", "start": 464.88, "duration": 6.0}, {"text": "on the other hand UDP is a protocol that", "start": 468.06, "duration": 4.38}, {"text": "doesn't offer this type of reliability", "start": 470.88, "duration": 3.84}, {"text": "but instead offers speed", "start": 472.44, "duration": 4.02}, {"text": "UDP doesn't have to establish a", "start": 474.72, "duration": 3.599}, {"text": "connection in order to send data and it", "start": 476.46, "duration": 3.6}, {"text": "doesn't provide any guarantees or", "start": 478.319, "duration": 3.66}, {"text": "re-transmission mechanisms but this is", "start": 480.06, "duration": 3.359}, {"text": "actually perfect for video data", "start": 481.979, "duration": 3.301}, {"text": "transmission because as we discussed", "start": 483.419, "duration": 4.381}, {"text": "before we want latency to be as low as", "start": 485.28, "duration": 4.08}, {"text": "possible to ensure that a video call", "start": 487.8, "duration": 4.26}, {"text": "feels real time and so it's okay if a", "start": 489.36, "duration": 4.38}, {"text": "little data gets lost and the call lags", "start": 492.06, "duration": 3.359}, {"text": "for a split second as long as in general", "start": 493.74, "duration": 3.959}, {"text": "the call is fast responsive and has the", "start": 495.419, "duration": 5.361}, {"text": "most up-to-date data", "start": 497.699, "duration": 3.081}, {"text": "so we've established the need for a UDP", "start": 500.94, "duration": 5.46}, {"text": "base peer-to-peer video calling solution", "start": 504.12, "duration": 4.019}, {"text": "for example for our developer who wants", "start": 506.4, "duration": 3.0}, {"text": "to implement video calling for", "start": 508.139, "duration": 3.301}, {"text": "Telehealth or some other private call", "start": 509.4, "duration": 3.6}, {"text": "but there are still many more questions", "start": 511.44, "duration": 2.88}, {"text": "that need to be answered in order to", "start": 513.0, "duration": 3.719}, {"text": "implement video calling for example", "start": 514.32, "duration": 5.099}, {"text": "because UDP is an unreliable protocol it", "start": 516.719, "duration": 3.781}, {"text": "doesn't have to establish a connection", "start": 519.419, "duration": 4.201}, {"text": "to send data how do we establish", "start": 520.5, "duration": 5.04}, {"text": "reliable communication channels on top", "start": 523.62, "duration": 5.04}, {"text": "of UDP how do we process our users audio", "start": 525.54, "duration": 5.28}, {"text": "and video media streams and how do we", "start": 528.66, "duration": 4.08}, {"text": "encrypt our application data as we send", "start": 530.82, "duration": 3.3}, {"text": "it over the network", "start": 532.74, "duration": 3.84}, {"text": "finally if we have a user who's behind a", "start": 534.12, "duration": 4.32}, {"text": "restricted Network environment like a", "start": 536.58, "duration": 4.14}, {"text": "firewall how do we set up a video call", "start": 538.44, "duration": 3.899}, {"text": "while they're behind that restrictive", "start": 540.72, "duration": 3.42}, {"text": "Network environment", "start": 542.339, "duration": 4.021}, {"text": "now fortunately there are already", "start": 544.14, "duration": 4.74}, {"text": "existing protocols that specify how a", "start": 546.36, "duration": 6.14}, {"text": "developer can overcome these challenges", "start": 548.88, "duration": 3.62}, {"text": "and it is possible for developers to", "start": 553.08, "duration": 3.9}, {"text": "build peer-to-peer video calling", "start": 555.24, "duration": 3.779}, {"text": "functionality by manually stitching", "start": 556.98, "duration": 3.72}, {"text": "together these protocols", "start": 559.019, "duration": 3.0}, {"text": "and this could provide you with a", "start": 560.7, "duration": 2.88}, {"text": "solution with a high degree of", "start": 562.019, "duration": 3.841}, {"text": "customization but at the expense of time", "start": 563.58, "duration": 3.96}, {"text": "since the developer would have to gain a", "start": 565.86, "duration": 3.78}, {"text": "deep understanding of multiple protocols", "start": 567.54, "duration": 4.04}, {"text": "and how they interact together", "start": 569.64, "duration": 4.319}, {"text": "now fortunately there is already an", "start": 571.58, "duration": 4.48}, {"text": "existing solution that does this it", "start": 573.959, "duration": 4.38}, {"text": "stitches together multiple protocols in", "start": 576.06, "duration": 4.2}, {"text": "order to simplify the complexity of", "start": 578.339, "duration": 4.021}, {"text": "implementing peer-to-peer video calling", "start": 580.26, "duration": 5.66}, {"text": "and it's called webrtc", "start": 582.36, "duration": 3.56}, {"text": "webrtc is free and was developed by", "start": 588.5, "duration": 4.66}, {"text": "Google it works natively within browsers", "start": 591.06, "duration": 3.959}, {"text": "and it's already been adopted in many", "start": 593.16, "duration": 3.66}, {"text": "services and products like Google me", "start": 595.019, "duration": 4.741}, {"text": "Facebook messenger and Discord and next", "start": 596.82, "duration": 5.22}, {"text": "Max will be discussing what a developer", "start": 599.76, "duration": 3.9}, {"text": "would need to know to set up a video", "start": 602.04, "duration": 5.76}, {"text": "call between two peers using webrtc", "start": 603.66, "duration": 6.96}, {"text": "thanks Connor we will now take a deeper", "start": 607.8, "duration": 5.28}, {"text": "dive into webrtc and take a quick look", "start": 610.62, "duration": 4.32}, {"text": "at existing solutions to implement", "start": 613.08, "duration": 4.259}, {"text": "webrtc functionality but let's get", "start": 614.94, "duration": 3.72}, {"text": "started", "start": 617.339, "duration": 3.541}, {"text": "Conor already alluded to this but it's", "start": 618.66, "duration": 4.679}, {"text": "worth mentioning again the key idea", "start": 620.88, "duration": 4.74}, {"text": "behind the success of webrtc is that it", "start": 623.339, "duration": 4.381}, {"text": "orchestrates multiple protocols to do", "start": 625.62, "duration": 3.48}, {"text": "the heavy lifting required for", "start": 627.72, "duration": 3.179}, {"text": "peer-to-peer communication", "start": 629.1, "duration": 4.32}, {"text": "just to name a few webrtc provides", "start": 630.899, "duration": 4.861}, {"text": "end-to-end encryption of audio video and", "start": 633.42, "duration": 4.8}, {"text": "application data techniques to bypass", "start": 635.76, "duration": 5.04}, {"text": "restrictive Network environments and", "start": 638.22, "duration": 4.739}, {"text": "reliable communication channels over UDP", "start": 640.8, "duration": 5.46}, {"text": "and again this is just a short list of", "start": 642.959, "duration": 5.461}, {"text": "all the complex data webrtc abstracts", "start": 646.26, "duration": 4.019}, {"text": "away from the developer", "start": 648.42, "duration": 4.62}, {"text": "we chose webrtc as the underlying", "start": 650.279, "duration": 4.861}, {"text": "technology to power otter for two main", "start": 653.04, "duration": 5.16}, {"text": "reasons first it abstracts away a lot of", "start": 655.14, "duration": 4.98}, {"text": "complexity that requires Niche knowledge", "start": 658.2, "duration": 4.5}, {"text": "like audio and video processing and", "start": 660.12, "duration": 5.219}, {"text": "second it is the most widely used UDP", "start": 662.7, "duration": 4.259}, {"text": "based peer-to-peer video calling", "start": 665.339, "duration": 3.901}, {"text": "solution for web applications", "start": 666.959, "duration": 4.201}, {"text": "to better understand the design", "start": 669.24, "duration": 4.38}, {"text": "decisions behind otter will first go", "start": 671.16, "duration": 4.26}, {"text": "through an example to build webrtc", "start": 673.62, "duration": 3.899}, {"text": "awareness", "start": 675.42, "duration": 4.5}, {"text": "this example follows Alice and Bob who", "start": 677.519, "duration": 4.201}, {"text": "are trying to establish a udp-based", "start": 679.92, "duration": 4.859}, {"text": "peer-to-peer connection as we know a P2P", "start": 681.72, "duration": 4.44}, {"text": "connection involves both peers", "start": 684.779, "duration": 3.06}, {"text": "communicating directly with one another", "start": 686.16, "duration": 3.78}, {"text": "without the need for essential server", "start": 687.839, "duration": 4.801}, {"text": "this means that for this connection to", "start": 689.94, "duration": 4.98}, {"text": "succeed Alice must know the IP address", "start": 692.64, "duration": 4.56}, {"text": "of Bob and Bob must know her IP address", "start": 694.92, "duration": 4.38}, {"text": "as all communication over the Internet", "start": 697.2, "duration": 4.199}, {"text": "requires an IP address", "start": 699.3, "duration": 4.92}, {"text": "the question then becomes how do Alice", "start": 701.399, "duration": 4.5}, {"text": "and Bob figure out what their respective", "start": 704.22, "duration": 3.0}, {"text": "IP address is", "start": 705.899, "duration": 3.661}, {"text": "answering this question largely depends", "start": 707.22, "duration": 4.08}, {"text": "on the network environments of Alice and", "start": 709.56, "duration": 3.48}, {"text": "Bob we'll explore three different", "start": 711.3, "duration": 4.26}, {"text": "scenarios through Alice's perspective", "start": 713.04, "duration": 4.919}, {"text": "interestingly enough Alice will end up", "start": 715.56, "duration": 4.38}, {"text": "with a different IP address in each", "start": 717.959, "duration": 3.901}, {"text": "scenario", "start": 719.94, "duration": 3.839}, {"text": "the first scenario we'll look at occurs", "start": 721.86, "duration": 3.539}, {"text": "when Alice and Bob were within the same", "start": 723.779, "duration": 3.781}, {"text": "local network this is the most", "start": 725.399, "duration": 3.481}, {"text": "straightforward scenario as the", "start": 727.56, "duration": 2.64}, {"text": "communication between Alice and Bob", "start": 728.88, "duration": 3.959}, {"text": "occurs locally in this case their", "start": 730.2, "duration": 4.56}, {"text": "private IP addresses are sufficient for", "start": 732.839, "duration": 3.5}, {"text": "a peer-to-peer connection to take place", "start": 734.76, "duration": 4.199}, {"text": "all Alice needs is the private IP", "start": 736.339, "duration": 4.24}, {"text": "address assigned to her in the local", "start": 738.959, "duration": 2.641}, {"text": "network", "start": 740.579, "duration": 2.88}, {"text": "although this scenario may occur in", "start": 741.6, "duration": 3.9}, {"text": "practice it is the least common one of", "start": 743.459, "duration": 3.361}, {"text": "all three", "start": 745.5, "duration": 3.18}, {"text": "the second scenario is the one which", "start": 746.82, "duration": 4.44}, {"text": "occurs the most in this case Alice and", "start": 748.68, "duration": 4.2}, {"text": "Bob were located in different private", "start": 751.26, "duration": 3.42}, {"text": "networks across the internet", "start": 752.88, "duration": 3.72}, {"text": "this means that the first solution the", "start": 754.68, "duration": 3.839}, {"text": "one where Alice uses her private IP", "start": 756.6, "duration": 4.08}, {"text": "address does not work anymore as the", "start": 758.519, "duration": 4.56}, {"text": "communication is no longer a local one", "start": 760.68, "duration": 4.68}, {"text": "we now have a P2P connection taking", "start": 763.079, "duration": 4.741}, {"text": "place across networks which means that", "start": 765.36, "duration": 4.919}, {"text": "Alice must have a public IP address to", "start": 767.82, "duration": 4.319}, {"text": "be reached over the internet", "start": 770.279, "duration": 3.961}, {"text": "the question we now need to answer is", "start": 772.139, "duration": 4.861}, {"text": "how does Alice figure out what public IP", "start": 774.24, "duration": 5.399}, {"text": "address to use but before we answer this", "start": 777.0, "duration": 3.36}, {"text": "question", "start": 779.639, "duration": 2.401}, {"text": "some of you may have noticed a new", "start": 780.36, "duration": 3.74}, {"text": "component in our diagram a net device", "start": 782.04, "duration": 4.5}, {"text": "will first need to understand the role", "start": 784.1, "duration": 3.94}, {"text": "they play on the network to answer", "start": 786.54, "duration": 4.44}, {"text": "Alice's question", "start": 788.04, "duration": 5.22}, {"text": "not devices are often found at the edge", "start": 790.98, "duration": 3.9}, {"text": "of private networks and can be thought", "start": 793.26, "duration": 3.9}, {"text": "of as gateways to the internet for hosts", "start": 794.88, "duration": 4.139}, {"text": "within the private Network", "start": 797.16, "duration": 4.5}, {"text": "this means that all traffic inbound 2", "start": 799.019, "duration": 4.62}, {"text": "and outbound from the private network", "start": 801.66, "duration": 4.679}, {"text": "will pass through the NAT device", "start": 803.639, "duration": 5.101}, {"text": "let's take host a as an example the one", "start": 806.339, "duration": 4.761}, {"text": "with an IP address of", "start": 808.74, "duration": 5.039}, {"text": "192.168.1.10 sending a message to host B", "start": 811.1, "duration": 4.72}, {"text": "who is in the public network", "start": 813.779, "duration": 3.961}, {"text": "the flow of the communication starts", "start": 815.82, "duration": 4.68}, {"text": "with Jose sending a message to host B", "start": 817.74, "duration": 4.74}, {"text": "the net device will intercept this", "start": 820.5, "duration": 3.54}, {"text": "message as it is leaving the private", "start": 822.48, "duration": 3.96}, {"text": "Network and change the source IP address", "start": 824.04, "duration": 4.56}, {"text": "of the message from a private one to a", "start": 826.44, "duration": 4.56}, {"text": "public one this allows the message to be", "start": 828.6, "duration": 4.32}, {"text": "routed to host B across the network the", "start": 831.0, "duration": 3.18}, {"text": "internet", "start": 832.92, "duration": 4.62}, {"text": "then holsby receives a message and sends", "start": 834.18, "duration": 5.339}, {"text": "back a response with a destination IP", "start": 837.54, "duration": 3.72}, {"text": "address being the one of the NAT device", "start": 839.519, "duration": 4.741}, {"text": "32.8.2.66.", "start": 841.26, "duration": 3.0}, {"text": "as the response reaches the private", "start": 844.8, "duration": 3.779}, {"text": "Network then that device can look in its", "start": 846.6, "duration": 3.9}, {"text": "internal table and see that this message", "start": 848.579, "duration": 4.5}, {"text": "should be routed back to host a it will", "start": 850.5, "duration": 4.98}, {"text": "then once again modify the message by", "start": 853.079, "duration": 4.5}, {"text": "changing the destination IP address from", "start": 855.48, "duration": 4.799}, {"text": "a public one to a private one", "start": 857.579, "duration": 4.681}, {"text": "the last important detail to note here", "start": 860.279, "duration": 4.921}, {"text": "is that some net devices also change the", "start": 862.26, "duration": 5.1}, {"text": "source and destination ports as the", "start": 865.2, "duration": 4.139}, {"text": "messages passed through it", "start": 867.36, "duration": 4.44}, {"text": "in our example the net device mapped", "start": 869.339, "duration": 6.06}, {"text": "host as Port 80 to its own port 3000.", "start": 871.8, "duration": 6.24}, {"text": "this allows the net device to reuse a", "start": 875.399, "duration": 4.74}, {"text": "single public IP address for multiple", "start": 878.04, "duration": 4.44}, {"text": "internal hosts who don't have one but", "start": 880.139, "duration": 4.021}, {"text": "need one to communicate over the", "start": 882.48, "duration": 2.58}, {"text": "internet", "start": 884.16, "duration": 2.7}, {"text": "this is one of the reasons why Nat", "start": 885.06, "duration": 3.899}, {"text": "devices exist in the first place they", "start": 886.86, "duration": 4.14}, {"text": "allow multiple hosts within a private", "start": 888.959, "duration": 4.32}, {"text": "Network to share the same public IP", "start": 891.0, "duration": 3.5}, {"text": "address", "start": 893.279, "duration": 4.081}, {"text": "now if we link this back to our second", "start": 894.5, "duration": 5.32}, {"text": "scenario because Alice is behind on that", "start": 897.36, "duration": 4.44}, {"text": "device she doesn't know what her public", "start": 899.82, "duration": 3.54}, {"text": "IP address is", "start": 901.8, "duration": 3.24}, {"text": "the solution to this problem is a", "start": 903.36, "duration": 4.14}, {"text": "straightforward one Alice needs to ask", "start": 905.04, "duration": 4.68}, {"text": "someone outside her private Network what", "start": 907.5, "duration": 4.38}, {"text": "her public IP address is by sending them", "start": 909.72, "duration": 5.1}, {"text": "a special type of request", "start": 911.88, "duration": 4.62}, {"text": "that someone or more accurately", "start": 914.82, "duration": 4.079}, {"text": "something is a stun server", "start": 916.5, "duration": 4.5}, {"text": "Alice can send a request to a stun", "start": 918.899, "duration": 4.321}, {"text": "server asking it to note down the source", "start": 921.0, "duration": 4.139}, {"text": "IP address of her request", "start": 923.22, "duration": 4.38}, {"text": "if we look back at how net devices work", "start": 925.139, "duration": 4.56}, {"text": "the stun server receives the request", "start": 927.6, "duration": 4.56}, {"text": "from Alice but only after the net device", "start": 929.699, "duration": 4.38}, {"text": "has changed the source IP address of the", "start": 932.16, "duration": 4.2}, {"text": "request from a private one to a public", "start": 934.079, "duration": 3.06}, {"text": "one", "start": 936.36, "duration": 2.82}, {"text": "the stun server includes the source IP", "start": 937.139, "duration": 3.421}, {"text": "address of Alice's request and the", "start": 939.18, "duration": 4.019}, {"text": "response that it then sends back to her", "start": 940.56, "duration": 4.5}, {"text": "once Alice receives the response from", "start": 943.199, "duration": 3.901}, {"text": "the stunt server she now has access to", "start": 945.06, "duration": 3.48}, {"text": "the public IP address that the net", "start": 947.1, "duration": 3.599}, {"text": "device assigned her with this in hand", "start": 948.54, "duration": 4.08}, {"text": "Alice can now communicate over the", "start": 950.699, "duration": 3.121}, {"text": "Internet with Bob", "start": 952.62, "duration": 4.019}, {"text": "we've now solved our second scenario", "start": 953.82, "duration": 5.16}, {"text": "the third and final one once again", "start": 956.639, "duration": 3.901}, {"text": "involves Alice in Bob being in different", "start": 958.98, "duration": 3.78}, {"text": "networks their goal is still the same", "start": 960.54, "duration": 4.08}, {"text": "they want to establish a direct", "start": 962.76, "duration": 3.92}, {"text": "peer-to-peer UDP based connection", "start": 964.62, "duration": 5.519}, {"text": "however this time around Alice's network", "start": 966.68, "duration": 5.98}, {"text": "is very restrictive and blocks all UDP", "start": 970.139, "duration": 4.861}, {"text": "traffic in practice this can be", "start": 972.66, "duration": 3.78}, {"text": "accomplished by having the net device", "start": 975.0, "duration": 3.72}, {"text": "simply drop all UDP traffic", "start": 976.44, "duration": 5.22}, {"text": "in this case a direct connection is", "start": 978.72, "duration": 4.799}, {"text": "simply not possible due to the", "start": 981.66, "duration": 3.66}, {"text": "restrictive nature of Alice's network", "start": 983.519, "duration": 4.981}, {"text": "but we still want Alice and Bob to be", "start": 985.32, "duration": 5.22}, {"text": "able to communicate with one another", "start": 988.5, "duration": 4.8}, {"text": "the question then becomes how does Alice", "start": 990.54, "duration": 5.039}, {"text": "figure out a way to bypass a restrictive", "start": 993.3, "duration": 3.18}, {"text": "Network", "start": 995.579, "duration": 3.361}, {"text": "again the answer to this question is", "start": 996.48, "duration": 5.159}, {"text": "conceptually easy to understand Alice", "start": 998.94, "duration": 4.56}, {"text": "simply needs someone to relay messages", "start": 1001.639, "duration": 4.44}, {"text": "between her and Bob", "start": 1003.5, "duration": 5.639}, {"text": "for this we need a turn server", "start": 1006.079, "duration": 5.161}, {"text": "we know that Alice's network doesn't", "start": 1009.139, "duration": 4.981}, {"text": "allow UDP traffic this tells us that she", "start": 1011.24, "duration": 5.459}, {"text": "needs to use TCP to send her messages to", "start": 1014.12, "duration": 4.86}, {"text": "Bob a turn server allows her to do", "start": 1016.699, "duration": 3.901}, {"text": "exactly that", "start": 1018.98, "duration": 4.26}, {"text": "in our example Alice can send her TCP", "start": 1020.6, "duration": 4.38}, {"text": "messages to the turn server who will", "start": 1023.24, "duration": 4.14}, {"text": "then convert them to UDP messages before", "start": 1024.98, "duration": 4.68}, {"text": "relaying them to Bob this solves the", "start": 1027.38, "duration": 4.919}, {"text": "communication from Alice to Bob", "start": 1029.66, "duration": 5.399}, {"text": "on the other hand if Bob tried to send", "start": 1032.299, "duration": 5.16}, {"text": "his messages directly to Alice her net", "start": 1035.059, "duration": 4.62}, {"text": "device would simply drop them as UDP", "start": 1037.459, "duration": 4.86}, {"text": "traffic is not allowed the turn server", "start": 1039.679, "duration": 4.38}, {"text": "can also handle this side of the", "start": 1042.319, "duration": 3.0}, {"text": "communication", "start": 1044.059, "duration": 3.661}, {"text": "in our example Alice retrieves the", "start": 1045.319, "duration": 4.321}, {"text": "public IP address of the turn server and", "start": 1047.72, "duration": 3.66}, {"text": "then tells Bob to send his UDP messages", "start": 1049.64, "duration": 3.6}, {"text": "to the third server who will then", "start": 1051.38, "duration": 4.56}, {"text": "convert them to TCP messages before", "start": 1053.24, "duration": 5.22}, {"text": "relying them to Alice this solves the", "start": 1055.94, "duration": 5.46}, {"text": "communication from Bob to Alice that's", "start": 1058.46, "duration": 5.04}, {"text": "really all that there is to a turn", "start": 1061.4, "duration": 4.68}, {"text": "server it simply relays the messages", "start": 1063.5, "duration": 5.28}, {"text": "between the peers and nothing more", "start": 1066.08, "duration": 5.82}, {"text": "in fact Bob isn't even aware that he's", "start": 1068.78, "duration": 5.22}, {"text": "now communicating with a turn server and", "start": 1071.9, "duration": 4.56}, {"text": "he doesn't need to be as his side of the", "start": 1074.0, "duration": 5.4}, {"text": "communication can still be UDP based and", "start": 1076.46, "duration": 4.38}, {"text": "benefit from the lower latency", "start": 1079.4, "duration": 3.72}, {"text": "associated with UDP traffic", "start": 1080.84, "duration": 5.82}, {"text": "we've now solved our final scenario", "start": 1083.12, "duration": 6.48}, {"text": "now you've probably been wondering how", "start": 1086.66, "duration": 4.98}, {"text": "does Alice actually tell Bob what are", "start": 1089.6, "duration": 3.66}, {"text": "the different IP addresses she's been", "start": 1091.64, "duration": 2.76}, {"text": "able to gather", "start": 1093.26, "duration": 3.6}, {"text": "without these IP addresses Bob will", "start": 1094.4, "duration": 3.84}, {"text": "never be able to establish a", "start": 1096.86, "duration": 3.66}, {"text": "peer-to-peer connection with her", "start": 1098.24, "duration": 3.9}, {"text": "as with the other problems we've", "start": 1100.52, "duration": 3.48}, {"text": "encountered so far we need a new", "start": 1102.14, "duration": 4.02}, {"text": "component to help them", "start": 1104.0, "duration": 5.4}, {"text": "this new component is a signaling server", "start": 1106.16, "duration": 5.7}, {"text": "This Server allows Alice and Bob to", "start": 1109.4, "duration": 4.44}, {"text": "exchange all the information they need", "start": 1111.86, "duration": 4.38}, {"text": "to establish a peer-to-peer connection", "start": 1113.84, "duration": 5.04}, {"text": "in our example Alice is able to tell Bob", "start": 1116.24, "duration": 4.319}, {"text": "that she wants to share audio and video", "start": 1118.88, "duration": 4.74}, {"text": "media with him through an offer", "start": 1120.559, "duration": 6.781}, {"text": "uh previous slide question", "start": 1123.62, "duration": 5.299}, {"text": "previous previous previous previous", "start": 1127.34, "duration": 4.44}, {"text": "yeah this one okay", "start": 1128.919, "duration": 5.441}, {"text": "so Alice is able to tell Bob that she", "start": 1131.78, "duration": 4.139}, {"text": "wants to share audio and video media", "start": 1134.36, "duration": 3.66}, {"text": "with him to an offer she can also pass", "start": 1135.919, "duration": 3.721}, {"text": "along the different IP addresses she's", "start": 1138.02, "duration": 3.24}, {"text": "obtained so either her private AP", "start": 1139.64, "duration": 4.02}, {"text": "address her public IP address or the", "start": 1141.26, "duration": 4.68}, {"text": "public IP address of a turn server but", "start": 1143.66, "duration": 4.8}, {"text": "this Bob can build an answer and include", "start": 1145.94, "duration": 4.02}, {"text": "all his relevant information for the", "start": 1148.46, "duration": 2.28}, {"text": "call", "start": 1149.96, "duration": 3.48}, {"text": "in webrtc terminology we refer to this", "start": 1150.74, "duration": 4.799}, {"text": "process of establishing a peer-to-peer", "start": 1153.44, "duration": 4.2}, {"text": "session as negotiation", "start": 1155.539, "duration": 4.38}, {"text": "peers negotiate the parameters of the", "start": 1157.64, "duration": 4.62}, {"text": "call to initialize it but also at any", "start": 1159.919, "duration": 4.14}, {"text": "time the parameters of the session need", "start": 1162.26, "duration": 2.76}, {"text": "to change", "start": 1164.059, "duration": 3.12}, {"text": "renegotiation can simply be appear", "start": 1165.02, "duration": 4.019}, {"text": "wanting to share New Media or the", "start": 1167.179, "duration": 3.781}, {"text": "occurrence of network issues that impact", "start": 1169.039, "duration": 3.361}, {"text": "the call", "start": 1170.96, "duration": 3.959}, {"text": "so the key idea to retain from a", "start": 1172.4, "duration": 4.62}, {"text": "signaling server is that whenever Alice", "start": 1174.919, "duration": 4.441}, {"text": "and Bob need to negotiate or renegotiate", "start": 1177.02, "duration": 3.899}, {"text": "the parameters of the peer-to-peer", "start": 1179.36, "duration": 4.02}, {"text": "session they can do so with the help of", "start": 1180.919, "duration": 4.38}, {"text": "the signaling server that's all that", "start": 1183.38, "duration": 4.28}, {"text": "there is", "start": 1185.299, "duration": 2.361}, {"text": "we now have the full picture of the", "start": 1188.12, "duration": 4.08}, {"text": "webrtc communication flow so let's", "start": 1190.28, "duration": 3.779}, {"text": "summarize it one last time", "start": 1192.2, "duration": 4.38}, {"text": "first both Alice and Bob need to gather", "start": 1194.059, "duration": 4.261}, {"text": "different IP addresses for the other", "start": 1196.58, "duration": 3.42}, {"text": "person to be able to communicate with", "start": 1198.32, "duration": 3.54}, {"text": "them depending on the network", "start": 1200.0, "duration": 3.36}, {"text": "environments that they find themselves", "start": 1201.86, "duration": 3.84}, {"text": "in a direct connection can be achieved", "start": 1203.36, "duration": 4.92}, {"text": "by using a stunt server or they might", "start": 1205.7, "duration": 4.32}, {"text": "need a turn server to relay the media", "start": 1208.28, "duration": 2.82}, {"text": "between them", "start": 1210.02, "duration": 3.18}, {"text": "they can exchange these different IP", "start": 1211.1, "duration": 3.66}, {"text": "addresses through the signaling server", "start": 1213.2, "duration": 3.66}, {"text": "as well as any other relevant parameter", "start": 1214.76, "duration": 3.48}, {"text": "for the session", "start": 1216.86, "duration": 3.179}, {"text": "once both peers have all this", "start": 1218.24, "duration": 4.02}, {"text": "information in hand only then can they", "start": 1220.039, "duration": 5.52}, {"text": "establish a peer-to-peer video call", "start": 1222.26, "duration": 6.299}, {"text": "so as we've just seen establishing a", "start": 1225.559, "duration": 4.441}, {"text": "peer-to-peer connection requires", "start": 1228.559, "duration": 3.061}, {"text": "multiple steps and many different", "start": 1230.0, "duration": 4.08}, {"text": "components there are therefore many", "start": 1231.62, "duration": 4.439}, {"text": "options that a developer can choose from", "start": 1234.08, "duration": 4.44}, {"text": "to include webrtc functionality into a", "start": 1236.059, "duration": 3.961}, {"text": "web application", "start": 1238.52, "duration": 4.62}, {"text": "we'll now explore some of these options", "start": 1240.02, "duration": 5.22}, {"text": "the first approach is to do everything", "start": 1243.14, "duration": 4.44}, {"text": "from scratch this involves stitching the", "start": 1245.24, "duration": 3.9}, {"text": "different components together which can", "start": 1247.58, "duration": 3.8}, {"text": "be custom or open source implementations", "start": 1249.14, "duration": 5.1}, {"text": "under this approach the developer needs", "start": 1251.38, "duration": 4.179}, {"text": "to understand the stun and turn", "start": 1254.24, "duration": 3.0}, {"text": "protocols as well as have a deep", "start": 1255.559, "duration": 4.201}, {"text": "understanding of the webrtc API", "start": 1257.24, "duration": 4.92}, {"text": "this approach is the most flexible one", "start": 1259.76, "duration": 4.26}, {"text": "but it's also the one that requires most", "start": 1262.16, "duration": 4.259}, {"text": "knowledge it can also be very time", "start": 1264.02, "duration": 4.14}, {"text": "consuming as the developer needs to", "start": 1266.419, "duration": 4.62}, {"text": "deploy and maintain the infrastructure", "start": 1268.16, "duration": 5.16}, {"text": "the second approach is for the developer", "start": 1271.039, "duration": 4.14}, {"text": "to use a software development kit such", "start": 1273.32, "duration": 3.42}, {"text": "as the one from twilio", "start": 1275.179, "duration": 3.661}, {"text": "the primary benefit of this approach is", "start": 1276.74, "duration": 4.08}, {"text": "that it becomes easier to build a robust", "start": 1278.84, "duration": 4.68}, {"text": "application as commercial sdks include", "start": 1280.82, "duration": 5.04}, {"text": "all the functionality a developer needs", "start": 1283.52, "duration": 5.039}, {"text": "on the other hand this approach tends to", "start": 1285.86, "duration": 5.1}, {"text": "cost more as commercial sdks are not", "start": 1288.559, "duration": 4.86}, {"text": "free and data privacy can become a", "start": 1290.96, "duration": 4.44}, {"text": "concern as the developer now needs to", "start": 1293.419, "duration": 3.781}, {"text": "rely on the infrastructure of a third", "start": 1295.4, "duration": 2.759}, {"text": "party", "start": 1297.2, "duration": 3.839}, {"text": "I'll now pass it to Kush to introduce a", "start": 1298.159, "duration": 4.5}, {"text": "third approach that a developer can use", "start": 1301.039, "duration": 4.681}, {"text": "to include webrtc functionality", "start": 1302.659, "duration": 5.101}, {"text": "thank you Max hi everyone my name is", "start": 1305.72, "duration": 4.079}, {"text": "kashal I'm going to be introducing otter", "start": 1307.76, "duration": 4.02}, {"text": "talking about how we built it and some", "start": 1309.799, "duration": 4.321}, {"text": "of the design decisions we considered", "start": 1311.78, "duration": 4.44}, {"text": "so what is otter", "start": 1314.12, "duration": 3.84}, {"text": "otter is a cloud native framework for", "start": 1316.22, "duration": 3.959}, {"text": "peer-to-peer video communication within", "start": 1317.96, "duration": 3.78}, {"text": "web applications", "start": 1320.179, "duration": 3.24}, {"text": "otters for the developer who wants a", "start": 1321.74, "duration": 4.08}, {"text": "video calling solution where privacy is", "start": 1323.419, "duration": 5.041}, {"text": "of the utmost importance", "start": 1325.82, "duration": 4.68}, {"text": "otter is made up of three things first", "start": 1328.46, "duration": 4.079}, {"text": "it is a react web application for", "start": 1330.5, "duration": 4.08}, {"text": "peer-to-peer calls it offers audio video", "start": 1332.539, "duration": 3.901}, {"text": "instant messaging and file sharing", "start": 1334.58, "duration": 4.68}, {"text": "second it is a developer friendly CLI", "start": 1336.44, "duration": 4.8}, {"text": "with just one command to deploy the", "start": 1339.26, "duration": 3.84}, {"text": "infrastructure and one command to tear", "start": 1341.24, "duration": 5.28}, {"text": "it down third it is an API which allows", "start": 1343.1, "duration": 6.12}, {"text": "developers to integrate Auto into their", "start": 1346.52, "duration": 5.48}, {"text": "web application", "start": 1349.22, "duration": 2.78}, {"text": "otter slots right in the middle of the", "start": 1352.1, "duration": 3.66}, {"text": "DIY and the commercial Solutions Max", "start": 1353.659, "duration": 4.801}, {"text": "disgust the beauty of otter is that", "start": 1355.76, "duration": 5.22}, {"text": "webrtc knowledge is not required and", "start": 1358.46, "duration": 4.62}, {"text": "we've seen how this can be complex or", "start": 1360.98, "duration": 4.62}, {"text": "time consuming", "start": 1363.08, "duration": 4.38}, {"text": "otters deployed on the AWS cloud and", "start": 1365.6, "duration": 4.14}, {"text": "Rise heavily on the serverless Paradigm", "start": 1367.46, "duration": 4.56}, {"text": "the serverless Paradigm abstracts away", "start": 1369.74, "duration": 4.08}, {"text": "the complexity of provisioning and", "start": 1372.02, "duration": 4.26}, {"text": "managing servers for a developer whose", "start": 1373.82, "duration": 4.44}, {"text": "only concern then is core application", "start": 1376.28, "duration": 4.74}, {"text": "logic as a drop-in framework otter", "start": 1378.26, "duration": 4.86}, {"text": "leverages the serverless Paradigm in the", "start": 1381.02, "duration": 4.92}, {"text": "design of its architecture", "start": 1383.12, "duration": 5.76}, {"text": "let's talk about how we built otter", "start": 1385.94, "duration": 4.859}, {"text": "we base the design of otter on three", "start": 1388.88, "duration": 3.12}, {"text": "objectives", "start": 1390.799, "duration": 2.941}, {"text": "the first was to provision the", "start": 1392.0, "duration": 3.24}, {"text": "infrastructure that supports video", "start": 1393.74, "duration": 3.96}, {"text": "calling recall the need for a signaling", "start": 1395.24, "duration": 5.64}, {"text": "stun and turn servers second to abstract", "start": 1397.7, "duration": 5.219}, {"text": "the way the complexity of interacting", "start": 1400.88, "duration": 4.2}, {"text": "with such an infrastructure recall the", "start": 1402.919, "duration": 5.161}, {"text": "complexity of working with webrtc API", "start": 1405.08, "duration": 5.219}, {"text": "the third was to allow developers to", "start": 1408.08, "duration": 3.959}, {"text": "easily integrate otter into their", "start": 1410.299, "duration": 4.321}, {"text": "application and this is what makes otter", "start": 1412.039, "duration": 4.38}, {"text": "a drop-in framework", "start": 1414.62, "duration": 3.84}, {"text": "we segmented the architecture into", "start": 1416.419, "duration": 4.021}, {"text": "groups of components that fulfill these", "start": 1418.46, "duration": 4.38}, {"text": "objectives we call these groups stacks", "start": 1420.44, "duration": 4.859}, {"text": "and we have four the signaling stack the", "start": 1422.84, "duration": 4.92}, {"text": "stun turn stack the front end stack and", "start": 1425.299, "duration": 5.341}, {"text": "the API stack let's peer into these", "start": 1427.76, "duration": 4.5}, {"text": "stacks", "start": 1430.64, "duration": 3.6}, {"text": "we'll start with the signaling stack", "start": 1432.26, "duration": 5.159}, {"text": "recall to establish a web RTC connection", "start": 1434.24, "duration": 6.059}, {"text": "we need some mechanism to pass messages", "start": 1437.419, "duration": 6.721}, {"text": "between peers AKA signaling", "start": 1440.299, "duration": 5.76}, {"text": "what are the characteristics of a", "start": 1444.14, "duration": 3.3}, {"text": "signaling server", "start": 1446.059, "duration": 3.421}, {"text": "well as a real-time application there's", "start": 1447.44, "duration": 4.26}, {"text": "going to be a chat like feel to it we", "start": 1449.48, "duration": 4.439}, {"text": "need a two-way Communication channel for", "start": 1451.7, "duration": 4.56}, {"text": "clients and servers to independently", "start": 1453.919, "duration": 4.62}, {"text": "send data to each other as opposed to a", "start": 1456.26, "duration": 4.919}, {"text": "traditional HTTP request response cycle", "start": 1458.539, "duration": 4.861}, {"text": "we need something low latency for a", "start": 1461.179, "duration": 3.781}, {"text": "real-time effect", "start": 1463.4, "duration": 4.139}, {"text": "the website protocol is built for this", "start": 1464.96, "duration": 4.92}, {"text": "purpose the websocket protocol enables", "start": 1467.539, "duration": 4.981}, {"text": "low latency bi-directional asynchronous", "start": 1469.88, "duration": 5.1}, {"text": "communication between client and server", "start": 1472.52, "duration": 4.56}, {"text": "the client and server can transmit data", "start": 1474.98, "duration": 3.78}, {"text": "independently once a connection is", "start": 1477.08, "duration": 3.54}, {"text": "established", "start": 1478.76, "duration": 4.44}, {"text": "so what does a websocket server consist", "start": 1480.62, "duration": 5.28}, {"text": "of a typical websocket server for a chat", "start": 1483.2, "duration": 4.2}, {"text": "like application will have three event", "start": 1485.9, "duration": 2.639}, {"text": "listeners", "start": 1487.4, "duration": 3.36}, {"text": "one to assign an identifier to each", "start": 1488.539, "duration": 3.841}, {"text": "client that connects", "start": 1490.76, "duration": 4.98}, {"text": "two to send messages between clients and", "start": 1492.38, "duration": 5.22}, {"text": "the third to delete the identifier for", "start": 1495.74, "duration": 3.66}, {"text": "each client that disconnects", "start": 1497.6, "duration": 4.559}, {"text": "since media flows directly between peers", "start": 1499.4, "duration": 5.94}, {"text": "we can observe two insights the first", "start": 1502.159, "duration": 6.0}, {"text": "event listeners can respond to requests", "start": 1505.34, "duration": 5.52}, {"text": "on demand as opposed to continuously", "start": 1508.159, "duration": 4.321}, {"text": "running and listening", "start": 1510.86, "duration": 3.6}, {"text": "the second Insight is that peers need to", "start": 1512.48, "duration": 4.079}, {"text": "maintain a long-lived connection to the", "start": 1514.46, "duration": 4.38}, {"text": "server in case of renegotiation as Max", "start": 1516.559, "duration": 4.381}, {"text": "had previously introduced", "start": 1518.84, "duration": 4.92}, {"text": "so how can we take advantage of this", "start": 1520.94, "duration": 4.38}, {"text": "natural decoupling between being", "start": 1523.76, "duration": 5.1}, {"text": "event-based and long-lived", "start": 1525.32, "duration": 6.479}, {"text": "we can use two AWS Services API", "start": 1528.86, "duration": 5.699}, {"text": "websocket Gateway and lambdas both", "start": 1531.799, "duration": 4.201}, {"text": "Services Leverage The serverless", "start": 1534.559, "duration": 4.321}, {"text": "Paradigm and require minimal maintenance", "start": 1536.0, "duration": 4.799}, {"text": "the websocket Gateway maintains a", "start": 1538.88, "duration": 3.299}, {"text": "long-lived connection with the client", "start": 1540.799, "duration": 4.38}, {"text": "whereas the lambdas being event based", "start": 1542.179, "duration": 5.821}, {"text": "are snoozing and respond only when a", "start": 1545.179, "duration": 4.141}, {"text": "request comes in", "start": 1548.0, "duration": 2.94}, {"text": "since lambdas or functions running", "start": 1549.32, "duration": 4.02}, {"text": "specific logic we will have one Lambda", "start": 1550.94, "duration": 5.46}, {"text": "per event listener behind the gateway", "start": 1553.34, "duration": 4.98}, {"text": "so the connect Lambda assigns", "start": 1556.4, "duration": 3.6}, {"text": "identifiers to each client's connecting", "start": 1558.32, "duration": 4.32}, {"text": "the signaling Lambda passes messages", "start": 1560.0, "duration": 4.74}, {"text": "between clients and the disconnect", "start": 1562.64, "duration": 4.32}, {"text": "Lambda deletes identifiers associated", "start": 1564.74, "duration": 4.26}, {"text": "with the client's disconnecting", "start": 1566.96, "duration": 4.079}, {"text": "since the Gateway is stateless to", "start": 1569.0, "duration": 4.2}, {"text": "persist these identifiers the lambdas", "start": 1571.039, "duration": 4.561}, {"text": "need to consult a dynamodb", "start": 1573.2, "duration": 4.68}, {"text": "you will also see an authorizer Lambda", "start": 1575.6, "duration": 4.5}, {"text": "attached to the Gateway the authorizer", "start": 1577.88, "duration": 4.38}, {"text": "restricts access to the Gateway which", "start": 1580.1, "duration": 4.38}, {"text": "Chris will explain more about later", "start": 1582.26, "duration": 5.82}, {"text": "next we will discuss the stun turn stack", "start": 1584.48, "duration": 5.939}, {"text": "recall the need for a stun turn server", "start": 1588.08, "duration": 4.86}, {"text": "to help with IP traversals in the case", "start": 1590.419, "duration": 5.161}, {"text": "of nat devices or firewalls", "start": 1592.94, "duration": 5.099}, {"text": "we chose to implement coturn an open", "start": 1595.58, "duration": 4.26}, {"text": "source solution it provides", "start": 1598.039, "duration": 4.74}, {"text": "functionality for both stun and turn and", "start": 1599.84, "duration": 5.219}, {"text": "it is the most widely used between open", "start": 1602.779, "duration": 4.26}, {"text": "source managed or third-party", "start": 1605.059, "duration": 3.661}, {"text": "implementations", "start": 1607.039, "duration": 4.26}, {"text": "so how do we implement coturn", "start": 1608.72, "duration": 4.38}, {"text": "our first requirement was to have a", "start": 1611.299, "duration": 4.081}, {"text": "public IP address because the turn", "start": 1613.1, "duration": 4.92}, {"text": "server needs to be accessible", "start": 1615.38, "duration": 4.62}, {"text": "by The Wider internet as we saw with", "start": 1618.02, "duration": 4.38}, {"text": "Alice and Bob in Max's example", "start": 1620.0, "duration": 3.96}, {"text": "to stay aligned with our serverless", "start": 1622.4, "duration": 3.6}, {"text": "Paradigm we also required something low", "start": 1623.96, "duration": 5.04}, {"text": "maintenance and scalable this led to two", "start": 1626.0, "duration": 5.34}, {"text": "insights the coturn software should run", "start": 1629.0, "duration": 4.44}, {"text": "in a container to eliminate any runtime", "start": 1631.34, "duration": 3.42}, {"text": "dependencies", "start": 1633.44, "duration": 4.56}, {"text": "and we could use AWS fargate another AWS", "start": 1634.76, "duration": 4.919}, {"text": "service which allows developers to run", "start": 1638.0, "duration": 3.659}, {"text": "containers without having to manage", "start": 1639.679, "duration": 3.181}, {"text": "servers", "start": 1641.659, "duration": 4.26}, {"text": "so how do we go about scaling co-turn we", "start": 1642.86, "duration": 4.5}, {"text": "needed to be able to add or remove", "start": 1645.919, "duration": 3.961}, {"text": "containers depending on traffic load", "start": 1647.36, "duration": 5.16}, {"text": "AWS elastic container service handled", "start": 1649.88, "duration": 5.1}, {"text": "this need ECS is a fully managed", "start": 1652.52, "duration": 4.56}, {"text": "container orchestration tool we", "start": 1654.98, "duration": 4.559}, {"text": "configured ECS to have at least one", "start": 1657.08, "duration": 5.16}, {"text": "instance running at all times and to", "start": 1659.539, "duration": 4.561}, {"text": "adapt the number of instances depending", "start": 1662.24, "duration": 4.319}, {"text": "on CPU utilization", "start": 1664.1, "duration": 4.92}, {"text": "this means at any given point we could", "start": 1666.559, "duration": 4.321}, {"text": "have multiple instances of coturn", "start": 1669.02, "duration": 2.639}, {"text": "running", "start": 1670.88, "duration": 3.179}, {"text": "this also means we would need to direct", "start": 1671.659, "duration": 5.581}, {"text": "traffic accordingly the AWS Network load", "start": 1674.059, "duration": 5.401}, {"text": "balancer handled this need the network", "start": 1677.24, "duration": 4.02}, {"text": "load balancer is different from", "start": 1679.46, "duration": 3.839}, {"text": "application load balancer because it", "start": 1681.26, "duration": 4.019}, {"text": "handles requests at the transport layer", "start": 1683.299, "duration": 4.561}, {"text": "recall Connor's discussion about UDP", "start": 1685.279, "duration": 4.26}, {"text": "versus TCP", "start": 1687.86, "duration": 3.84}, {"text": "and so this is what the stun turn stack", "start": 1689.539, "duration": 4.201}, {"text": "looks like", "start": 1691.7, "duration": 4.02}, {"text": "with the signaling stack and the stun", "start": 1693.74, "duration": 3.66}, {"text": "turn stack we have met the first", "start": 1695.72, "duration": 4.5}, {"text": "objective to provide the infrastructure", "start": 1697.4, "duration": 4.62}, {"text": "support video calling", "start": 1700.22, "duration": 4.74}, {"text": "but without a way to interact with this", "start": 1702.02, "duration": 5.46}, {"text": "instruct infrastructure a developer", "start": 1704.96, "duration": 4.8}, {"text": "would still need to consume the webrtc", "start": 1707.48, "duration": 5.4}, {"text": "API to develop test and deploy a video", "start": 1709.76, "duration": 5.34}, {"text": "calling application", "start": 1712.88, "duration": 4.08}, {"text": "this is where the front end stack comes", "start": 1715.1, "duration": 4.559}, {"text": "in it serves two purposes", "start": 1716.96, "duration": 4.92}, {"text": "to provide a video calling application", "start": 1719.659, "duration": 4.38}, {"text": "which we lovingly refer to as the otter", "start": 1721.88, "duration": 5.46}, {"text": "web app and to host this otter web app", "start": 1724.039, "duration": 5.64}, {"text": "how does the auto web app work it", "start": 1727.34, "duration": 4.439}, {"text": "consumes two resources from the API", "start": 1729.679, "duration": 4.321}, {"text": "stack to connect and plug into the auto", "start": 1731.779, "duration": 4.801}, {"text": "video calling infrastructure it also", "start": 1734.0, "duration": 5.159}, {"text": "consumes a webrtc API to set up", "start": 1736.58, "duration": 5.099}, {"text": "connections between peers allowing peers", "start": 1739.159, "duration": 4.981}, {"text": "to process video streams share files and", "start": 1741.679, "duration": 4.5}, {"text": "instant messages", "start": 1744.14, "duration": 3.72}, {"text": "this is what the front end stack looks", "start": 1746.179, "duration": 2.641}, {"text": "like", "start": 1747.86, "duration": 3.419}, {"text": "and how is the auto web app hosted we", "start": 1748.82, "duration": 4.859}, {"text": "used AWS cloudfront a cloud content", "start": 1751.279, "duration": 4.861}, {"text": "delivery Network cloudfront distributes", "start": 1753.679, "duration": 4.5}, {"text": "a website hosted in an S3 Bucket from", "start": 1756.14, "duration": 4.8}, {"text": "Edge locations closest to the end user", "start": 1758.179, "duration": 5.461}, {"text": "you'll notice an ec2 component on the", "start": 1760.94, "duration": 4.32}, {"text": "far right and we'll explore this later", "start": 1763.64, "duration": 4.259}, {"text": "with Chris in the challenges section", "start": 1765.26, "duration": 4.98}, {"text": "so now we have achieved the first two", "start": 1767.899, "duration": 3.361}, {"text": "objectives", "start": 1770.24, "duration": 3.059}, {"text": "with the signaling and stun turn Stacks", "start": 1771.26, "duration": 3.539}, {"text": "we have provisioned the infrastructure", "start": 1773.299, "duration": 3.36}, {"text": "to support video calling", "start": 1774.799, "duration": 3.421}, {"text": "and with the front end stack in the auto", "start": 1776.659, "duration": 3.421}, {"text": "web app we have abstracted away the", "start": 1778.22, "duration": 4.02}, {"text": "complexity of interacting with this", "start": 1780.08, "duration": 4.199}, {"text": "video calling infrastructure", "start": 1782.24, "duration": 5.039}, {"text": "but how do we allow developers to", "start": 1784.279, "duration": 5.941}, {"text": "integrate Auto into their applications", "start": 1787.279, "duration": 4.561}, {"text": "we've seen that the auto web app", "start": 1790.22, "duration": 3.54}, {"text": "leverages the auto video calling", "start": 1791.84, "duration": 4.439}, {"text": "infrastructure so how do developers", "start": 1793.76, "duration": 4.98}, {"text": "access the auto web app so they can", "start": 1796.279, "duration": 4.861}, {"text": "leverage the auto ecosystem", "start": 1798.74, "duration": 5.34}, {"text": "the API stack helps with that it serves", "start": 1801.14, "duration": 6.0}, {"text": "two purposes first it provides a route", "start": 1804.08, "duration": 5.04}, {"text": "for developers to access the auto web", "start": 1807.14, "duration": 4.5}, {"text": "app the create room route creates a room", "start": 1809.12, "duration": 4.62}, {"text": "and responds with a URL that", "start": 1811.64, "duration": 3.96}, {"text": "automatically joins an auto web app", "start": 1813.74, "duration": 4.38}, {"text": "peer-to-peer session when clicked upon", "start": 1815.6, "duration": 4.86}, {"text": "second it provides two routes for the", "start": 1818.12, "duration": 4.799}, {"text": "auto web app to consume the room ID", "start": 1820.46, "duration": 4.38}, {"text": "route verifies that the room indeed", "start": 1822.919, "duration": 4.26}, {"text": "exists and the credentials route fetches", "start": 1824.84, "duration": 4.74}, {"text": "the co-train credentials", "start": 1827.179, "duration": 4.921}, {"text": "so how should we implement the API stack", "start": 1829.58, "duration": 4.8}, {"text": "let's consider its traffic pattern", "start": 1832.1, "duration": 5.28}, {"text": "recall that once a webrtc session begins", "start": 1834.38, "duration": 5.82}, {"text": "media flows directly between peers and", "start": 1837.38, "duration": 5.7}, {"text": "their browsers the lifecycle of a webrt", "start": 1840.2, "duration": 6.3}, {"text": "session includes one API call to create", "start": 1843.08, "duration": 4.92}, {"text": "the room resource", "start": 1846.5, "duration": 4.559}, {"text": "two API calls to fetch the room metadata", "start": 1848.0, "duration": 5.1}, {"text": "and two API calls to fetch the code", "start": 1851.059, "duration": 3.901}, {"text": "print credentials", "start": 1853.1, "duration": 4.98}, {"text": "this life cycle lends to two insights", "start": 1854.96, "duration": 5.64}, {"text": "since the life cycle has five API calls", "start": 1858.08, "duration": 5.099}, {"text": "which happens at its beginning we do not", "start": 1860.6, "duration": 5.4}, {"text": "need a server running continuously the", "start": 1863.179, "duration": 4.86}, {"text": "second Insight is that the create room", "start": 1866.0, "duration": 4.679}, {"text": "resource will be called half as many", "start": 1868.039, "duration": 5.101}, {"text": "times as either of the other routes", "start": 1870.679, "duration": 4.681}, {"text": "these insights warn an infrastructure", "start": 1873.14, "duration": 4.68}, {"text": "that can respond to an on-demand nature", "start": 1875.36, "duration": 5.58}, {"text": "and distinct scaling needs per route", "start": 1877.82, "duration": 4.859}, {"text": "as these needs were similar to the", "start": 1880.94, "duration": 4.56}, {"text": "signaling stack we used an HTTP API", "start": 1882.679, "duration": 4.86}, {"text": "Gateway and more lambdas", "start": 1885.5, "duration": 3.96}, {"text": "here's the API stack and the layout of", "start": 1887.539, "duration": 3.181}, {"text": "its component", "start": 1889.46, "duration": 3.42}, {"text": "again the create room", "start": 1890.72, "duration": 4.86}, {"text": "create room root is for the developer it", "start": 1892.88, "duration": 5.039}, {"text": "is how they access and leverage otter", "start": 1895.58, "duration": 4.199}, {"text": "the other two routes are for the auto", "start": 1897.919, "duration": 3.661}, {"text": "web app to access and plug into the", "start": 1899.779, "duration": 5.041}, {"text": "signaling and stun turn Stacks here the", "start": 1901.58, "duration": 6.3}, {"text": "dynamodb stores API Keys room metadata", "start": 1904.82, "duration": 5.7}, {"text": "and cultured credentials similar to the", "start": 1907.88, "duration": 4.679}, {"text": "signaling stack the authorizer Lambda", "start": 1910.52, "duration": 3.84}, {"text": "attached to the Gateway restricts access", "start": 1912.559, "duration": 3.12}, {"text": "to it", "start": 1914.36, "duration": 3.059}, {"text": "Chris will discuss this further in the", "start": 1915.679, "duration": 3.661}, {"text": "engineering challenges", "start": 1917.419, "duration": 4.86}, {"text": "so here are the four Stacks together and", "start": 1919.34, "duration": 5.339}, {"text": "now with an understanding of each we can", "start": 1922.279, "duration": 4.321}, {"text": "walk over the workflow of establishing", "start": 1924.679, "duration": 4.081}, {"text": "an auto video call which happens after", "start": 1926.6, "duration": 5.1}, {"text": "deploying the audit infrastructure", "start": 1928.76, "duration": 5.76}, {"text": "first we create the room resource the", "start": 1931.7, "duration": 4.56}, {"text": "developer adds functionality like a", "start": 1934.52, "duration": 3.899}, {"text": "button in their application which sends", "start": 1936.26, "duration": 3.659}, {"text": "a post request to the create room", "start": 1938.419, "duration": 4.081}, {"text": "resource and a URL is generated as a", "start": 1939.919, "duration": 3.661}, {"text": "response", "start": 1942.5, "duration": 4.2}, {"text": "by visiting the URL the otter web app is", "start": 1943.58, "duration": 5.459}, {"text": "loaded and served from cloudfront", "start": 1946.7, "duration": 5.099}, {"text": "the auto web app validates the room and", "start": 1949.039, "duration": 4.5}, {"text": "fetches the codeword credentials with", "start": 1951.799, "duration": 3.74}, {"text": "two respective get requests", "start": 1953.539, "duration": 4.681}, {"text": "asynchronously the auto web app also", "start": 1955.539, "duration": 4.481}, {"text": "establishes a connection to the API", "start": 1958.22, "duration": 3.6}, {"text": "websocket Gateway", "start": 1960.02, "duration": 3.72}, {"text": "the auto web app starts Gathering", "start": 1961.82, "duration": 4.5}, {"text": "candidate IP addresses to include in its", "start": 1963.74, "duration": 4.679}, {"text": "offers and answers that are sent via the", "start": 1966.32, "duration": 5.04}, {"text": "signaling server at this point the video", "start": 1968.419, "duration": 5.401}, {"text": "call between peers can commence", "start": 1971.36, "duration": 4.86}, {"text": "that wraps up the architecture of Arc", "start": 1973.82, "duration": 4.92}, {"text": "otter I'll now hand it off to Chris who", "start": 1976.22, "duration": 3.9}, {"text": "will give us a demo of otter and", "start": 1978.74, "duration": 2.46}, {"text": "highlight some of the engineering", "start": 1980.12, "duration": 2.7}, {"text": "challenges we've faced while building", "start": 1981.2, "duration": 3.54}, {"text": "otter", "start": 1982.82, "duration": 3.599}, {"text": "thanks Kush", "start": 1984.74, "duration": 4.14}, {"text": "now that we know the workflow of", "start": 1986.419, "duration": 4.921}, {"text": "establishing an auto video call let's", "start": 1988.88, "duration": 4.62}, {"text": "take a quick look at how it works in", "start": 1991.34, "duration": 3.959}, {"text": "practice", "start": 1993.5, "duration": 3.779}, {"text": "everything starts with executing the", "start": 1995.299, "duration": 4.321}, {"text": "auto deploy command it will provision", "start": 1997.279, "duration": 5.28}, {"text": "offer stats create the host Auto web app", "start": 1999.62, "duration": 5.7}, {"text": "and output the API endpoint with an API", "start": 2002.559, "duration": 5.881}, {"text": "key for the developer in addition it", "start": 2005.32, "duration": 4.859}, {"text": "will also create a sample room with a", "start": 2008.44, "duration": 2.4}, {"text": "link", "start": 2010.179, "duration": 2.701}, {"text": "the developer can follow the link and", "start": 2010.84, "duration": 4.079}, {"text": "test the functionality of other right", "start": 2012.88, "duration": 4.62}, {"text": "away without writing any code", "start": 2014.919, "duration": 4.561}, {"text": "to create a new room for a video call", "start": 2017.5, "duration": 5.34}, {"text": "send a request to the get room endpoint", "start": 2019.48, "duration": 5.88}, {"text": "the API will return a unique link to the", "start": 2022.84, "duration": 4.679}, {"text": "room when an end user can access through", "start": 2025.36, "duration": 4.86}, {"text": "the browser this link can then be shared", "start": 2027.519, "duration": 4.741}, {"text": "with users who want to join a video", "start": 2030.22, "duration": 4.339}, {"text": "account", "start": 2032.26, "duration": 2.299}, {"text": "now when the user clicks the link the", "start": 2036.34, "duration": 5.16}, {"text": "browser loads the auto web app that", "start": 2039.22, "duration": 5.16}, {"text": "provides an easy to use interface for", "start": 2041.5, "duration": 5.1}, {"text": "peer-to-peer video call", "start": 2044.38, "duration": 4.86}, {"text": "the web app also provides some essential", "start": 2046.6, "duration": 5.579}, {"text": "video calling features such as mute", "start": 2049.24, "duration": 6.0}, {"text": "unmute audio messaging and file sharing", "start": 2052.179, "duration": 5.761}, {"text": "as you can see a developer only needs to", "start": 2055.24, "duration": 4.679}, {"text": "take care of creating new rooms and", "start": 2057.94, "duration": 5.6}, {"text": "other will handle everything else", "start": 2059.919, "duration": 3.621}, {"text": "now let's dive into some technical", "start": 2063.82, "duration": 5.099}, {"text": "challenges we encountered and talk about", "start": 2066.52, "duration": 5.28}, {"text": "what we did to tackle these challenges", "start": 2068.919, "duration": 5.041}, {"text": "in this section we are going to discuss", "start": 2071.8, "duration": 5.099}, {"text": "how do we generate the auto web app on", "start": 2073.96, "duration": 5.939}, {"text": "the Fly how do we apply authentication", "start": 2076.899, "duration": 6.061}, {"text": "mechanism to others infrastructure and", "start": 2079.899, "duration": 4.861}, {"text": "how do we resolve a risk condition", "start": 2082.96, "duration": 4.8}, {"text": "called glare during the initiation of a", "start": 2084.76, "duration": 4.8}, {"text": "video call", "start": 2087.76, "duration": 6.24}, {"text": "first recall we built our web app to", "start": 2089.56, "duration": 6.059}, {"text": "interact with the underlying", "start": 2094.0, "duration": 3.0}, {"text": "infrastructure", "start": 2095.619, "duration": 3.601}, {"text": "such interaction includes connecting", "start": 2097.0, "duration": 4.2}, {"text": "with the websocket Gateway making", "start": 2099.22, "duration": 4.32}, {"text": "requests to the API and communicating", "start": 2101.2, "duration": 4.5}, {"text": "with the stand turn stack", "start": 2103.54, "duration": 4.86}, {"text": "now a problem arises", "start": 2105.7, "duration": 5.04}, {"text": "in order to interact with these", "start": 2108.4, "duration": 4.92}, {"text": "infrastructure components the other web", "start": 2110.74, "duration": 5.16}, {"text": "app needs to know their endpoints since", "start": 2113.32, "duration": 4.74}, {"text": "they are referencing since the app", "start": 2115.9, "duration": 4.38}, {"text": "referencing them in the code as you can", "start": 2118.06, "duration": 3.66}, {"text": "see here", "start": 2120.28, "duration": 4.5}, {"text": "now we could send us get requests to", "start": 2121.72, "duration": 5.34}, {"text": "fetch these endpoints somewhere but then", "start": 2124.78, "duration": 4.38}, {"text": "it becomes a chicken and egg situation", "start": 2127.06, "duration": 4.799}, {"text": "because the app still needs to know the", "start": 2129.16, "duration": 5.58}, {"text": "endpoints for fetching other endpoints", "start": 2131.859, "duration": 5.461}, {"text": "in another word the problem we have here", "start": 2134.74, "duration": 4.92}, {"text": "means the application can only be built", "start": 2137.32, "duration": 5.46}, {"text": "after other deploy is finished and we", "start": 2139.66, "duration": 5.52}, {"text": "have all the endpoints available", "start": 2142.78, "duration": 5.28}, {"text": "to achieve this our solution is to build", "start": 2145.18, "duration": 4.86}, {"text": "the application on the Fly", "start": 2148.06, "duration": 4.62}, {"text": "here's how it works", "start": 2150.04, "duration": 6.24}, {"text": "after Auto deploy is executed a series", "start": 2152.68, "duration": 6.6}, {"text": "of API calls will be made to AWS cloud", "start": 2156.28, "duration": 5.339}, {"text": "formation which is responsible for", "start": 2159.28, "duration": 4.319}, {"text": "provisioning all the resources other", "start": 2161.619, "duration": 5.281}, {"text": "needs among these resources we also", "start": 2163.599, "duration": 6.301}, {"text": "create an ec2 instance to help us build", "start": 2166.9, "duration": 4.92}, {"text": "the web application", "start": 2169.9, "duration": 4.56}, {"text": "after all resources are provisioned we", "start": 2171.82, "duration": 5.22}, {"text": "will make another series of API calls to", "start": 2174.46, "duration": 5.34}, {"text": "fetch all the endpoints then the other", "start": 2177.04, "duration": 6.059}, {"text": "CLI creates a JavaScript file populate", "start": 2179.8, "duration": 5.64}, {"text": "all endpoints in it so the web app can", "start": 2183.099, "duration": 4.321}, {"text": "reference them in the code", "start": 2185.44, "duration": 4.86}, {"text": "then we push the file to an S3 bucket", "start": 2187.42, "duration": 4.919}, {"text": "for storage", "start": 2190.3, "duration": 3.84}, {"text": "now that we have all the endpoints", "start": 2192.339, "duration": 4.681}, {"text": "available our ec2 instance will execute", "start": 2194.14, "duration": 5.34}, {"text": "a script that pulls the web app source", "start": 2197.02, "duration": 5.339}, {"text": "code from GitHub it then fetches the", "start": 2199.48, "duration": 5.22}, {"text": "Javascript file and builds the web", "start": 2202.359, "duration": 3.72}, {"text": "application", "start": 2204.7, "duration": 4.32}, {"text": "after the web app is built it is pushed", "start": 2206.079, "duration": 5.161}, {"text": "to the S3 bucket and ready for access", "start": 2209.02, "duration": 4.14}, {"text": "from the cloud fronts", "start": 2211.24, "duration": 5.16}, {"text": "at this point the ec2 instance is no", "start": 2213.16, "duration": 6.72}, {"text": "longer needed and will be terminated", "start": 2216.4, "duration": 6.54}, {"text": "however this solution introduced another", "start": 2219.88, "duration": 6.479}, {"text": "problem at this point if someone loads", "start": 2222.94, "duration": 5.76}, {"text": "the web app in the browser opens up the", "start": 2226.359, "duration": 4.98}, {"text": "developer developers console and takes a", "start": 2228.7, "duration": 5.159}, {"text": "look at a source code all the endpoints", "start": 2231.339, "duration": 4.201}, {"text": "are exposed there", "start": 2233.859, "duration": 4.081}, {"text": "this is a serious security issue since", "start": 2235.54, "duration": 4.26}, {"text": "anyone can send requests to these", "start": 2237.94, "duration": 4.56}, {"text": "endpoints and no questions will be asked", "start": 2239.8, "duration": 4.92}, {"text": "the solution will be securing the", "start": 2242.5, "duration": 4.44}, {"text": "endpoints so that they only respond to", "start": 2244.72, "duration": 4.32}, {"text": "authenticated requests", "start": 2246.94, "duration": 4.32}, {"text": "with that even though the endpoints are", "start": 2249.04, "duration": 4.92}, {"text": "still exposed to the public other is", "start": 2251.26, "duration": 4.62}, {"text": "only accessible from authenticated", "start": 2253.96, "duration": 3.96}, {"text": "clients", "start": 2255.88, "duration": 4.02}, {"text": "with the solution in mind let's see how", "start": 2257.92, "duration": 3.84}, {"text": "we implement it", "start": 2259.9, "duration": 4.02}, {"text": "recall from what coach mentioned before", "start": 2261.76, "duration": 4.5}, {"text": "there are two types of accessing", "start": 2263.92, "duration": 3.72}, {"text": "patterns for other", "start": 2266.26, "duration": 3.3}, {"text": "the first type is developers", "start": 2267.64, "duration": 4.199}, {"text": "communicating with the API in order to", "start": 2269.56, "duration": 4.62}, {"text": "create a new room and generate a link", "start": 2271.839, "duration": 4.621}, {"text": "the second type is the other web app", "start": 2274.18, "duration": 5.1}, {"text": "accessing both the API and websocket", "start": 2276.46, "duration": 5.399}, {"text": "Gateway in order to initiate a video", "start": 2279.28, "duration": 4.079}, {"text": "call", "start": 2281.859, "duration": 4.441}, {"text": "for the developers we implemented API", "start": 2283.359, "duration": 5.341}, {"text": "key authentication so that only requests", "start": 2286.3, "duration": 5.4}, {"text": "with a valid API key will be processed", "start": 2288.7, "duration": 5.46}, {"text": "here's how it works", "start": 2291.7, "duration": 5.52}, {"text": "during the order deploy an API key is", "start": 2294.16, "duration": 5.699}, {"text": "generated storing the database and", "start": 2297.22, "duration": 4.5}, {"text": "displayed in the CLI", "start": 2299.859, "duration": 4.681}, {"text": "and authorized Lambda is attached to the", "start": 2301.72, "duration": 3.72}, {"text": "Gateway", "start": 2304.54, "duration": 3.059}, {"text": "when the developer sends a request to", "start": 2305.44, "duration": 4.44}, {"text": "the Gateway the authorizer Lambda", "start": 2307.599, "duration": 5.101}, {"text": "fascist API key in the database and it", "start": 2309.88, "duration": 5.699}, {"text": "checks if the incoming API Keys matches", "start": 2312.7, "duration": 4.62}, {"text": "the key in the database", "start": 2315.579, "duration": 5.161}, {"text": "if it is a match the Lambda sends a", "start": 2317.32, "duration": 5.34}, {"text": "message to the Gateway that allows the", "start": 2320.74, "duration": 4.44}, {"text": "request to go through then the Lambda", "start": 2322.66, "duration": 5.04}, {"text": "will respond with the resource required", "start": 2325.18, "duration": 4.679}, {"text": "by the developer", "start": 2327.7, "duration": 4.139}, {"text": "now that we have the API key", "start": 2329.859, "duration": 4.98}, {"text": "authentication in place our next task is", "start": 2331.839, "duration": 5.401}, {"text": "to secure the traffic from the other web", "start": 2334.839, "duration": 3.301}, {"text": "app", "start": 2337.24, "duration": 3.599}, {"text": "this involves both the API and the", "start": 2338.14, "duration": 5.699}, {"text": "websocket Gateway this time we chose to", "start": 2340.839, "duration": 6.24}, {"text": "implement Json web token a Json web", "start": 2343.839, "duration": 5.821}, {"text": "token is a type of token used to", "start": 2347.079, "duration": 4.621}, {"text": "securely transmit information between", "start": 2349.66, "duration": 3.179}, {"text": "parties", "start": 2351.7, "duration": 3.659}, {"text": "it is ideal for this scenario because", "start": 2352.839, "duration": 5.461}, {"text": "without the key to sign the token it is", "start": 2355.359, "duration": 5.76}, {"text": "almost impossible to fabric the token to", "start": 2358.3, "duration": 5.76}, {"text": "access the resource that requires it", "start": 2361.119, "duration": 6.121}, {"text": "why did we chose it because the other", "start": 2364.06, "duration": 5.94}, {"text": "web app is for public use anyone with", "start": 2367.24, "duration": 5.94}, {"text": "the link can access it so we cannot rely", "start": 2370.0, "duration": 6.06}, {"text": "on API key authentication anymore since", "start": 2373.18, "duration": 5.28}, {"text": "the key could also be exposed in the", "start": 2376.06, "duration": 5.279}, {"text": "application source code as well", "start": 2378.46, "duration": 5.399}, {"text": "first let's see how we create a token", "start": 2381.339, "duration": 6.181}, {"text": "remember that when a request is sent to", "start": 2383.859, "duration": 6.601}, {"text": "the API create room route it responds", "start": 2387.52, "duration": 4.579}, {"text": "with the link to join the video call", "start": 2390.46, "duration": 4.56}, {"text": "except this time the create room Lambda", "start": 2392.099, "duration": 5.621}, {"text": "also generates a Json web token using", "start": 2395.02, "duration": 5.7}, {"text": "their API key fetch in the database and", "start": 2397.72, "duration": 5.7}, {"text": "embed the token in the URL in the form", "start": 2400.72, "duration": 4.859}, {"text": "of query parameter", "start": 2403.42, "duration": 5.04}, {"text": "one additional benefit of using Json web", "start": 2405.579, "duration": 5.581}, {"text": "token is that we can set a time to leave", "start": 2408.46, "duration": 6.119}, {"text": "parameter to it in this case the token", "start": 2411.16, "duration": 6.78}, {"text": "will expire in 48 hours which means the", "start": 2414.579, "duration": 5.941}, {"text": "room will be no longer available there", "start": 2417.94, "duration": 6.0}, {"text": "setting reduces the possibility for", "start": 2420.52, "duration": 6.18}, {"text": "someone abusing the system and using the", "start": 2423.94, "duration": 4.62}, {"text": "same room all the time", "start": 2426.7, "duration": 4.919}, {"text": "okay now we have the link with the token", "start": 2428.56, "duration": 5.76}, {"text": "here's how we authenticate it", "start": 2431.619, "duration": 5.521}, {"text": "when someone visits the link the other", "start": 2434.32, "duration": 5.34}, {"text": "web app extracts the token from the URL", "start": 2437.14, "duration": 5.04}, {"text": "and sends all further requests with the", "start": 2439.66, "duration": 5.4}, {"text": "token within its request body", "start": 2442.18, "duration": 5.64}, {"text": "in this example the Gateway receives the", "start": 2445.06, "duration": 5.16}, {"text": "request pass the token to the authorized", "start": 2447.82, "duration": 4.98}, {"text": "lender the authorizer refreshes the API", "start": 2450.22, "duration": 5.22}, {"text": "key from the database again and uses it", "start": 2452.8, "duration": 4.68}, {"text": "to verify the token", "start": 2455.44, "duration": 4.38}, {"text": "based on the result of the verification", "start": 2457.48, "duration": 5.4}, {"text": "it instructs the gateway to allow or", "start": 2459.82, "duration": 6.18}, {"text": "deny the request accordingly", "start": 2462.88, "duration": 6.479}, {"text": "and that's it now we have our other web", "start": 2466.0, "duration": 6.06}, {"text": "app generated dynamically based on the", "start": 2469.359, "duration": 5.101}, {"text": "infrastructure endpoints we've also", "start": 2472.06, "duration": 5.16}, {"text": "secured these endpoints to only allow", "start": 2474.46, "duration": 5.58}, {"text": "authenticated requests being processed", "start": 2477.22, "duration": 4.28}, {"text": "foreign", "start": 2480.04, "duration": 5.039}, {"text": "to our next challenge now that we have a", "start": 2481.5, "duration": 6.16}, {"text": "secure and perfect working web app two", "start": 2485.079, "duration": 4.561}, {"text": "peers are trying to use the application", "start": 2487.66, "duration": 3.48}, {"text": "to connect", "start": 2489.64, "duration": 5.58}, {"text": "let's first consider a happy path recall", "start": 2491.14, "duration": 5.58}, {"text": "that during the initial connection", "start": 2495.22, "duration": 4.879}, {"text": "process peer a would send an offer", "start": 2496.72, "duration": 6.24}, {"text": "encapsulating session parameters and", "start": 2500.099, "duration": 5.74}, {"text": "appear B will respond with an answer", "start": 2502.96, "duration": 5.52}, {"text": "when pure a receives the answer they", "start": 2505.839, "duration": 4.621}, {"text": "will try to initiate a peer-to-peer", "start": 2508.48, "duration": 3.18}, {"text": "connection", "start": 2510.46, "duration": 4.44}, {"text": "but this process is not without caveats", "start": 2511.66, "duration": 5.76}, {"text": "what if two peers are trying to reach", "start": 2514.9, "duration": 4.74}, {"text": "out to the other side at the same time", "start": 2517.42, "duration": 5.22}, {"text": "to make it worse since the network is", "start": 2519.64, "duration": 5.76}, {"text": "unreliable in nature due to network", "start": 2522.64, "duration": 6.36}, {"text": "latency or network partition appear can", "start": 2525.4, "duration": 5.699}, {"text": "send out its own offer before it", "start": 2529.0, "duration": 3.78}, {"text": "receives the offer from the other side", "start": 2531.099, "duration": 4.441}, {"text": "as we can see from this example on the", "start": 2532.78, "duration": 4.44}, {"text": "right", "start": 2535.54, "duration": 5.4}, {"text": "the default way of negotiating the offer", "start": 2537.22, "duration": 7.44}, {"text": "answer processing webrtc introduces risk", "start": 2540.94, "duration": 6.24}, {"text": "conditions that cannot be resolved on", "start": 2544.66, "duration": 5.88}, {"text": "their own resulting in deadlock errors", "start": 2547.18, "duration": 6.72}, {"text": "and bad user experience this is known as", "start": 2550.54, "duration": 4.44}, {"text": "glare", "start": 2553.9, "duration": 4.5}, {"text": "to resolve this issue our solution is to", "start": 2554.98, "duration": 6.06}, {"text": "assign roles to both peers so they have", "start": 2558.4, "duration": 4.62}, {"text": "different behaviors when receiving an", "start": 2561.04, "duration": 3.24}, {"text": "offer", "start": 2563.02, "duration": 3.96}, {"text": "the two assigned rules are applied and", "start": 2564.28, "duration": 5.28}, {"text": "implied here's an example showcasing", "start": 2566.98, "duration": 4.139}, {"text": "these two rows", "start": 2569.56, "duration": 5.4}, {"text": "first apply peer discards their own", "start": 2571.119, "duration": 6.841}, {"text": "offer upon receiving an incoming offer", "start": 2574.96, "duration": 5.82}, {"text": "in this example appears sent out the", "start": 2577.96, "duration": 6.06}, {"text": "offer waiting for an answer but received", "start": 2580.78, "duration": 4.5}, {"text": "an offer", "start": 2584.02, "duration": 4.319}, {"text": "since this is a pipe here it discards", "start": 2585.28, "duration": 5.7}, {"text": "its own offer creates and response with", "start": 2588.339, "duration": 4.081}, {"text": "an answer", "start": 2590.98, "duration": 4.139}, {"text": "on the other hand an implied peer", "start": 2592.42, "duration": 6.179}, {"text": "ignores all ignorance and incoming offer", "start": 2595.119, "duration": 5.881}, {"text": "if it collides with their own", "start": 2598.599, "duration": 5.881}, {"text": "in this case the implied peer ignores", "start": 2601.0, "duration": 5.94}, {"text": "the incoming offer and continues to wait", "start": 2604.48, "duration": 4.26}, {"text": "for an answer", "start": 2606.94, "duration": 4.379}, {"text": "this pattern is what we call a perfect", "start": 2608.74, "duration": 3.96}, {"text": "negotiation", "start": 2611.319, "duration": 4.26}, {"text": "let's see how it resolves the glare when", "start": 2612.7, "duration": 5.879}, {"text": "we apply it to our previous example", "start": 2615.579, "duration": 6.301}, {"text": "here since the implied peer discards the", "start": 2618.579, "duration": 6.481}, {"text": "incoming offer and the play peer sends", "start": 2621.88, "duration": 5.1}, {"text": "out the answer when receiving an offer", "start": 2625.06, "duration": 4.08}, {"text": "will no longer need to worry about the", "start": 2626.98, "duration": 4.32}, {"text": "risk condition that previously caused", "start": 2629.14, "duration": 5.1}, {"text": "deadlock and poor user experience", "start": 2631.3, "duration": 6.0}, {"text": "okay although we have managed to solve", "start": 2634.24, "duration": 4.92}, {"text": "some technical challenges there are", "start": 2637.3, "duration": 4.26}, {"text": "still some limitations for offer that we", "start": 2639.16, "duration": 4.919}, {"text": "wanted to continue to work on firstly", "start": 2641.56, "duration": 4.92}, {"text": "order only allows two peers in the room", "start": 2644.079, "duration": 4.74}, {"text": "for now we would like to increase the", "start": 2646.48, "duration": 4.44}, {"text": "number of peers that can participate in", "start": 2648.819, "duration": 5.581}, {"text": "a video call to 4 as anything above this", "start": 2650.92, "duration": 5.82}, {"text": "can become difficult to manage under a", "start": 2654.4, "duration": 4.919}, {"text": "pure P2P Network model", "start": 2656.74, "duration": 5.16}, {"text": "secondly right now accessing the API", "start": 2659.319, "duration": 5.641}, {"text": "Gateway requires an API key we would", "start": 2661.9, "duration": 5.64}, {"text": "like to add a route to the API to", "start": 2664.96, "duration": 4.68}, {"text": "invalidate the key and generate a new", "start": 2667.54, "duration": 5.22}, {"text": "one this way a developer who integrates", "start": 2669.64, "duration": 5.88}, {"text": "order within a web application has the", "start": 2672.76, "duration": 5.16}, {"text": "possibility to rotate the API key for", "start": 2675.52, "duration": 4.26}, {"text": "enhanced security", "start": 2677.92, "duration": 5.159}, {"text": "lastly we would like to work on an SDK", "start": 2679.78, "duration": 6.0}, {"text": "that abstracts the way the complexity of", "start": 2683.079, "duration": 5.76}, {"text": "working with the web RTC API so the", "start": 2685.78, "duration": 5.64}, {"text": "developer can use the SDK and build", "start": 2688.839, "duration": 5.341}, {"text": "their own other web app but still retain", "start": 2691.42, "duration": 4.679}, {"text": "the ability to interact with the other", "start": 2694.18, "duration": 4.08}, {"text": "infrastructure", "start": 2696.099, "duration": 5.22}, {"text": "all right that's all for today thank you", "start": 2698.26, "duration": 5.22}, {"text": "very much for joining us now I'm going", "start": 2701.319, "duration": 4.321}, {"text": "to hand it over to Connor feel free to", "start": 2703.48, "duration": 5.0}, {"text": "ask any questions", "start": 2705.64, "duration": 2.84}, {"text": "yes thank you everyone for coming and", "start": 2710.26, "duration": 3.24}, {"text": "now we're just gonna go ahead and wait a", "start": 2712.24, "duration": 2.28}, {"text": "couple minutes to allow some questions", "start": 2713.5, "duration": 3.619}, {"text": "to come in", "start": 2714.52, "duration": 2.599}, {"text": "there doesn't seem to be any questions", "start": 2721.48, "duration": 3.24}, {"text": "so I'm assuming the presentation was", "start": 2722.92, "duration": 4.699}, {"text": "extremely clear", "start": 2724.72, "duration": 2.899}, {"text": "actually we did just get one question", "start": 2728.52, "duration": 4.12}, {"text": "just now uh Team what would you say was", "start": 2730.599, "duration": 4.141}, {"text": "the most challenging part of the project", "start": 2732.64, "duration": 4.88}, {"text": "implementation", "start": 2734.74, "duration": 2.78}, {"text": "I can I can say for myself I think one", "start": 2738.22, "duration": 5.04}, {"text": "of the aspects that was definitely", "start": 2741.16, "duration": 4.919}, {"text": "challenging is working with lower layer", "start": 2743.26, "duration": 5.339}, {"text": "protocols with UDP TCP trying to", "start": 2746.079, "duration": 5.28}, {"text": "understand how they interact with upper", "start": 2748.599, "duration": 5.161}, {"text": "layer protocols", "start": 2751.359, "duration": 4.26}, {"text": "um so that that's one for sure and then", "start": 2753.76, "duration": 3.42}, {"text": "the other one was", "start": 2755.619, "duration": 3.541}, {"text": "figuring out", "start": 2757.18, "duration": 4.679}, {"text": "um which current server to use so we", "start": 2759.16, "duration": 4.56}, {"text": "ended up choosing coturn", "start": 2761.859, "duration": 3.96}, {"text": "and", "start": 2763.72, "duration": 4.139}, {"text": "even though it's widely used the", "start": 2765.819, "duration": 4.201}, {"text": "documentation around it is not", "start": 2767.859, "duration": 4.921}, {"text": "awesome so that was another challenge", "start": 2770.02, "duration": 4.68}, {"text": "of trying to figure out how to you know", "start": 2772.78, "duration": 4.64}, {"text": "make it work", "start": 2774.7, "duration": 2.72}, {"text": "yeah I just want to add another", "start": 2778.3, "duration": 4.62}, {"text": "challenge for us was actually to create", "start": 2780.28, "duration": 4.68}, {"text": "this uh web application", "start": 2782.92, "duration": 4.86}, {"text": "since it requires knowledge for the", "start": 2784.96, "duration": 6.42}, {"text": "webrtc API and work on work with the API", "start": 2787.78, "duration": 6.66}, {"text": "and the webrcc API is actually really", "start": 2791.38, "duration": 6.36}, {"text": "complex although we we we didn't share", "start": 2794.44, "duration": 7.46}, {"text": "it like uh we didn't", "start": 2797.74, "duration": 6.9}, {"text": "demonstrate how complex that would be", "start": 2801.9, "duration": 5.98}, {"text": "but uh that's actually the most", "start": 2804.64, "duration": 5.939}, {"text": "difficult part in my opinion just to", "start": 2807.88, "duration": 6.199}, {"text": "create a web application itself", "start": 2810.579, "duration": 3.5}, {"text": "for someone who might have missed this", "start": 2816.48, "duration": 5.639}, {"text": "part is auto ready to scale", "start": 2818.38, "duration": 3.739}, {"text": "I can enter that one", "start": 2822.819, "duration": 8.101}, {"text": "we tested the websocket Gateway and AWS", "start": 2825.46, "duration": 7.08}, {"text": "has theoretical limits of they can", "start": 2830.92, "duration": 2.82}, {"text": "handle", "start": 2832.54, "duration": 3.36}, {"text": "quite a large number of requests per", "start": 2833.74, "duration": 4.619}, {"text": "second we didn't have the resources to", "start": 2835.9, "duration": 4.98}, {"text": "test the turn server specifically but", "start": 2838.359, "duration": 4.521}, {"text": "our websocket Gateway is able to handle", "start": 2840.88, "duration": 6.199}, {"text": "several thousands of requests per second", "start": 2842.88, "duration": 4.199}, {"text": "all right looks like we have one last", "start": 2850.66, "duration": 3.6}, {"text": "question uh which parts we enjoy", "start": 2852.28, "duration": 3.48}, {"text": "implementing or did you enjoy", "start": 2854.26, "duration": 4.339}, {"text": "implementing the most", "start": 2855.76, "duration": 2.839}, {"text": "uh I think for me was working with the", "start": 2860.079, "duration": 5.461}, {"text": "working with the webrtc API how Chris", "start": 2863.26, "duration": 4.079}, {"text": "just mentioned it but it's uh it's a", "start": 2865.54, "duration": 4.319}, {"text": "fairly involved API and just trying to", "start": 2867.339, "duration": 4.321}, {"text": "figure out how to you know work with", "start": 2869.859, "duration": 4.201}, {"text": "media streams that was very very", "start": 2871.66, "duration": 4.08}, {"text": "interesting", "start": 2874.06, "duration": 4.08}, {"text": "um so that's that's for me", "start": 2875.74, "duration": 4.5}, {"text": "yeah I always say it's a bitter and the", "start": 2878.14, "duration": 4.32}, {"text": "sweet uh at the same time working with", "start": 2880.24, "duration": 5.82}, {"text": "the web access API uh at one point it's", "start": 2882.46, "duration": 6.24}, {"text": "uh pretty complex but on the other hand", "start": 2886.06, "duration": 5.64}, {"text": "seen", "start": 2888.7, "duration": 3.0}, {"text": "um seeing like people could communicate", "start": 2891.76, "duration": 5.339}, {"text": "without each other directly during a", "start": 2894.28, "duration": 5.039}, {"text": "video call and share files and instant", "start": 2897.099, "duration": 6.561}, {"text": "messages uh that was super fun", "start": 2899.319, "duration": 4.341}, {"text": "I was gonna add working with AWS lambdas", "start": 2906.579, "duration": 4.441}, {"text": "was quite fun", "start": 2909.22, "duration": 4.56}, {"text": "um fun and interesting sense but able to", "start": 2911.02, "duration": 5.76}, {"text": "trace the logs and and just see how they", "start": 2913.78, "duration": 5.339}, {"text": "work and interact and how flexible they", "start": 2916.78, "duration": 4.579}, {"text": "can be", "start": 2919.119, "duration": 2.24}, {"text": "all right and then the last question", "start": 2924.22, "duration": 3.359}, {"text": "someone asked how did you come up with", "start": 2925.78, "duration": 4.38}, {"text": "the name otter uh for our team we", "start": 2927.579, "duration": 4.561}, {"text": "actually this was kind of a little play", "start": 2930.16, "duration": 4.86}, {"text": "on words uh because otters are navigate", "start": 2932.14, "duration": 4.86}, {"text": "through streams and we wanted our app to", "start": 2935.02, "duration": 4.079}, {"text": "help developers navigate the process of", "start": 2937.0, "duration": 4.74}, {"text": "managing video streams", "start": 2939.099, "duration": 4.801}, {"text": "uh and with that that's all the time we", "start": 2941.74, "duration": 3.9}, {"text": "have for today so thank you everyone for", "start": 2943.9, "duration": 2.64}, {"text": "coming", "start": 2945.64, "duration": 3.9}, {"text": "foreign", "start": 2946.54, "duration": 3.0}]