diff --git a/README.md b/README.md
index 61ed19378..a04481162 100644
--- a/README.md
+++ b/README.md
@@ -140,6 +140,13 @@ A. The message occurs when you use PeerJS with Webpack. It is not critical! It r
### [Documentation / API Reference](https://peerjs.com/docs/)
+
+### How does `peerjs` work?
+
+Check out this interactive walkthrough of the `peerjs` codebase on CodeCanvas [here](https://www.code-canvas.com/?session=unauthenticatedGithub&repo=peerjs&owner=peers&branch=master&OnboardingTutorial=true).
+
+
+
### [PeerServer](https://github.com/peers/peerjs-server)
### [Discuss PeerJS on our Telegram Channel](https://t.me/joinchat/ENhPuhTvhm8WlIxTjQf7Og)
diff --git a/peerjs.CodeCanvas b/peerjs.CodeCanvas
new file mode 100644
index 000000000..0bc2a3a2c
--- /dev/null
+++ b/peerjs.CodeCanvas
@@ -0,0 +1,4167 @@
+{
+ "drawioXML": "\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n\n",
+ "fileName": "",
+ "fileURL": "github",
+ "repoData": {
+ "README.md": {
+ "path": "README.md",
+ "fileName": "README.md",
+ "cellName": "README.md",
+ "cellId": "b2cba3d3-e883-465c-8da6-ad3b01c62556",
+ "visible": true,
+ "children": [
+ "README.md-simstep-a8004b5e-435a-4587-aeaa-dbf02b941b81",
+ "README.md-simstep-d570094d-8b39-4499-9ed6-b2c744ba0f5c"
+ ]
+ },
+ "e2e": {
+ "path": "e2e",
+ "fileName": "e2e",
+ "cellName": "e2e",
+ "cellId": "a5d4968e-4523-4206-a553-b439e7be24a6",
+ "visible": true,
+ "children": [
+ "e2e/mediachannel",
+ "e2e/datachannel"
+ ]
+ },
+ "e2e/datachannel": {
+ "path": "e2e/datachannel",
+ "fileName": "datachannel",
+ "cellName": "datachannel",
+ "cellId": "7c06b1f9-bb23-4bb4-a08c-1e54b9b7a70b",
+ "visible": true,
+ "parentCellId": "a5d4968e-4523-4206-a553-b439e7be24a6",
+ "children": [
+ "e2e/datachannel/serialization.js"
+ ]
+ },
+ "e2e/datachannel/serialization.js": {
+ "path": "e2e/datachannel/serialization.js",
+ "fileName": "serialization.js",
+ "cellName": "serialization.js",
+ "cellId": "80400362-ec89-4a48-a9a7-b5d0f018176a",
+ "visible": true,
+ "parentCellId": "7c06b1f9-bb23-4bb4-a08c-1e54b9b7a70b",
+ "children": [
+ "e2e/datachannel/serialization.js-simstep-fcb183cd-4bf9-4dde-8c95-7391e6836621",
+ "e2e/datachannel/serialization.js-simstep-06375578-5510-4e36-80f8-c87ce62297ae",
+ "e2e/datachannel/serialization.js-simstep-83f72513-88ed-4e5e-bce1-c01d1603d126"
+ ]
+ },
+ "e2e/mediachannel": {
+ "path": "e2e/mediachannel",
+ "fileName": "mediachannel",
+ "cellName": "mediachannel",
+ "cellId": "188ed55a-17a9-440f-91d0-ac769db1b962",
+ "visible": true,
+ "parentCellId": "a5d4968e-4523-4206-a553-b439e7be24a6",
+ "children": [
+ "e2e/mediachannel/close.js"
+ ]
+ },
+ "e2e/mediachannel/close.js": {
+ "path": "e2e/mediachannel/close.js",
+ "fileName": "close.js",
+ "cellName": "close.js",
+ "cellId": "18984d8a-6baf-4849-8656-9cbf51bd3aa9",
+ "visible": true,
+ "parentCellId": "188ed55a-17a9-440f-91d0-ac769db1b962",
+ "children": [
+ "e2e/mediachannel/close.js-simstep-cdacdbb4-b68d-4506-a1cf-3720702545bf",
+ "e2e/mediachannel/close.js-simstep-23a1a037-1f55-435a-b87f-627bed609c7e"
+ ]
+ },
+ "lib": {
+ "path": "lib",
+ "fileName": "lib",
+ "cellName": "lib",
+ "cellId": "40f371e2-c7eb-4d4b-9b06-46758b6ce41d",
+ "visible": true,
+ "children": [
+ "lib/peer.ts",
+ "lib/mediaconnection.ts",
+ "lib/negotiator.ts",
+ "lib/dataconnection",
+ "lib/socket.ts",
+ "lib/api.ts"
+ ]
+ },
+ "lib/api.ts": {
+ "path": "lib/api.ts",
+ "fileName": "api.ts",
+ "cellName": "api.ts",
+ "cellId": "cd27f567-65b0-4ca2-b2d9-6b63840bc2ff",
+ "visible": true,
+ "parentCellId": "40f371e2-c7eb-4d4b-9b06-46758b6ce41d",
+ "children": [
+ "lib/api.ts-simstep-db4a41e5-8ca8-46ae-916d-f4efb534bc25",
+ "lib/api.ts-simstep-504a2bba-0b24-403d-8cb0-fcd0af784d68"
+ ]
+ },
+ "lib/dataconnection": {
+ "path": "lib/dataconnection",
+ "fileName": "dataconnection",
+ "cellName": "dataconnection",
+ "cellId": "268e02b5-a515-43d7-977d-9101b52c9e5b",
+ "visible": true,
+ "parentCellId": "40f371e2-c7eb-4d4b-9b06-46758b6ce41d",
+ "children": [
+ "lib/dataconnection/DataConnection.ts",
+ "lib/dataconnection/BufferedConnection"
+ ]
+ },
+ "lib/dataconnection/BufferedConnection": {
+ "path": "lib/dataconnection/BufferedConnection",
+ "fileName": "BufferedConnection",
+ "cellName": "BufferedConnection",
+ "cellId": "4994666f-426c-4274-b8ae-30fb15007f9f",
+ "visible": true,
+ "parentCellId": "268e02b5-a515-43d7-977d-9101b52c9e5b",
+ "children": [
+ "lib/dataconnection/BufferedConnection/BufferedConnection.ts",
+ "lib/dataconnection/BufferedConnection/BinaryPack.ts",
+ "lib/dataconnection/BufferedConnection/Raw.ts"
+ ]
+ },
+ "lib/dataconnection/BufferedConnection/BinaryPack.ts": {
+ "path": "lib/dataconnection/BufferedConnection/BinaryPack.ts",
+ "fileName": "BinaryPack.ts",
+ "cellName": "BinaryPack.ts",
+ "cellId": "dd0ed623-c1ab-4a65-8d8d-de683ae30b1e",
+ "visible": true,
+ "parentCellId": "4994666f-426c-4274-b8ae-30fb15007f9f",
+ "children": [
+ "lib/dataconnection/BufferedConnection/BinaryPack.ts-simstep-01a86c94-f6fd-4bd3-825e-e71a8f087a4f",
+ "lib/dataconnection/BufferedConnection/BinaryPack.ts-simstep-794e5bce-e3f9-4256-945b-29cf293974d9",
+ "lib/dataconnection/BufferedConnection/BinaryPack.ts-simstep-5fd74bed-45a6-4a9b-831d-8d35aa789894"
+ ]
+ },
+ "lib/dataconnection/BufferedConnection/BufferedConnection.ts": {
+ "path": "lib/dataconnection/BufferedConnection/BufferedConnection.ts",
+ "fileName": "BufferedConnection.ts",
+ "cellName": "BufferedConnection.ts",
+ "cellId": "a3c3c61a-29a8-46fe-b8ba-e68e555ec783",
+ "visible": true,
+ "parentCellId": "4994666f-426c-4274-b8ae-30fb15007f9f"
+ },
+ "lib/dataconnection/BufferedConnection/Raw.ts": {
+ "path": "lib/dataconnection/BufferedConnection/Raw.ts",
+ "fileName": "Raw.ts",
+ "cellName": "Raw.ts",
+ "cellId": "c1dc8119-9517-48a6-91a6-cd926627e6fa",
+ "visible": true,
+ "parentCellId": "4994666f-426c-4274-b8ae-30fb15007f9f"
+ },
+ "lib/dataconnection/DataConnection.ts": {
+ "path": "lib/dataconnection/DataConnection.ts",
+ "fileName": "DataConnection.ts",
+ "cellName": "DataConnection.ts",
+ "cellId": "23fed91f-ca9f-4528-93b9-dc99dbd24696",
+ "visible": true,
+ "parentCellId": "268e02b5-a515-43d7-977d-9101b52c9e5b",
+ "children": [
+ "lib/dataconnection/DataConnection.ts-simstep-75e27aba-0219-4a66-8a2e-a2d06f30d951",
+ "lib/dataconnection/DataConnection.ts-simstep-199f5dba-c084-49d0-91ad-f04c887efdd9"
+ ]
+ },
+ "lib/mediaconnection.ts": {
+ "path": "lib/mediaconnection.ts",
+ "fileName": "mediaconnection.ts",
+ "cellName": "mediaconnection.ts",
+ "cellId": "7951fe72-44e4-4be6-bb55-5a86978ed988",
+ "visible": true,
+ "parentCellId": "40f371e2-c7eb-4d4b-9b06-46758b6ce41d",
+ "children": [
+ "lib/mediaconnection.ts-simstep-4b5be2c5-8bc4-4bc8-8992-4cfb58c3a63e",
+ "lib/mediaconnection.ts-simstep-892c2693-2db2-4241-9197-77922f03eff4"
+ ]
+ },
+ "lib/negotiator.ts": {
+ "path": "lib/negotiator.ts",
+ "fileName": "negotiator.ts",
+ "cellName": "negotiator.ts",
+ "cellId": "b3bb7d9e-aeba-4e38-9f51-15f79bab31e5",
+ "visible": true,
+ "parentCellId": "40f371e2-c7eb-4d4b-9b06-46758b6ce41d",
+ "children": [
+ "lib/negotiator.ts-simstep-d5738a3f-bc47-4ff7-a537-300764973e03",
+ "lib/negotiator.ts-simstep-8670a7e4-eff3-473f-9612-ef328428917e",
+ "lib/negotiator.ts-simstep-9595ab82-b36f-4297-a690-8348396c93ae"
+ ]
+ },
+ "lib/peer.ts": {
+ "path": "lib/peer.ts",
+ "fileName": "peer.ts",
+ "cellName": "peer.ts",
+ "cellId": "5b38b322-b837-4492-aed7-db33427d3e54",
+ "visible": true,
+ "parentCellId": "40f371e2-c7eb-4d4b-9b06-46758b6ce41d",
+ "children": [
+ "lib/peer.ts-simstep-0e274d86-51de-45fb-bd33-57fdd3b27f4c",
+ "lib/peer.ts-simstep-5eb34ba5-69d1-4d5b-9093-d27b1321cf9b",
+ "lib/peer.ts-simstep-c9533991-8150-49b9-9fc6-b1c968170f85",
+ "lib/peer.ts-simstep-ae4beac2-12cc-4a81-8f8b-9d45034225a2",
+ "lib/peer.ts-simstep-1fd658f9-72ff-4031-92f4-aa1b424eb44a",
+ "lib/peer.ts-simstep-084416b5-0ac8-4020-bb42-1fdce415aca7",
+ "lib/peer.ts-simstep-3ada1d79-9b1e-475b-b574-3b56ee29a368",
+ "lib/peer.ts-simstep-d1e1e4ae-236c-459c-95d5-a2bc97983cc9",
+ "lib/peer.ts-simstep-7eb36b5d-391b-4d6c-a8de-8da0097dec8f",
+ "lib/peer.ts-simstep-9cf58b7e-f3d7-4141-89a3-061e1ab52573",
+ "lib/peer.ts-simstep-aebef84f-0a5a-459c-b68b-6be8cd4d78e8",
+ "lib/peer.ts-simstep-3a52047f-7af1-4f85-a758-28dc6300c77e",
+ "lib/peer.ts-simstep-f17a79f6-282e-4690-a4b8-8a1a18cc3c7b",
+ "lib/peer.ts-simstep-7320147a-bbaa-4778-9698-3d2f4ba40791",
+ "lib/peer.ts-simstep-88626ea8-f46c-456c-81d7-69fa943ce099",
+ "lib/peer.ts-simstep-77523bb5-33a0-4cff-8fd2-0657cb0b5493",
+ "lib/peer.ts-simstep-87023e77-ac4b-4fa5-ae8f-a55bb65ca30f",
+ "lib/peer.ts-simstep-092c04f2-b591-4319-96f2-a74b7b9ec3b5",
+ "lib/peer.ts-simstep-41b8107e-528d-4395-8644-3d5baecebc52",
+ "lib/peer.ts-simstep-9a47ab98-7cd0-4331-990d-a75c95a524ca",
+ "lib/peer.ts-simstep-494d5251-244d-472f-a0f4-bbec417fdcaa",
+ "lib/peer.ts-simstep-1894c731-51ed-45d2-b6c5-c7dcb031929a",
+ "lib/peer.ts-simstep-c12f5630-4b94-4332-8ea8-c27485f1ca74",
+ "lib/peer.ts-simstep-6433b525-d8ab-4cf3-9a12-12ea093de979",
+ "lib/peer.ts-simstep-f8ad231f-bb2c-4308-8678-95244528ee3a"
+ ]
+ },
+ "lib/socket.ts": {
+ "path": "lib/socket.ts",
+ "fileName": "socket.ts",
+ "cellName": "socket.ts",
+ "cellId": "9683ebba-b589-442c-832d-970d4a1ad143",
+ "visible": true,
+ "parentCellId": "40f371e2-c7eb-4d4b-9b06-46758b6ce41d",
+ "children": [
+ "lib/socket.ts-simstep-489e003d-1712-4c03-8a30-b588ceec50da",
+ "lib/socket.ts-simstep-3db106d7-06a8-4398-9ccd-6e6de77d8ef6"
+ ]
+ },
+ "40f371e2-c7eb-4d4b-9b06-46758b6ce41d": {
+ "path": "40f371e2-c7eb-4d4b-9b06-46758b6ce41d",
+ "fileName": "40f371e2-c7eb-4d4b-9b06-46758b6ce41d",
+ "cellName": "lib",
+ "cellId": "40f371e2-c7eb-4d4b-9b06-46758b6ce41d",
+ "visible": true
+ },
+ "a5d4968e-4523-4206-a553-b439e7be24a6": {
+ "path": "a5d4968e-4523-4206-a553-b439e7be24a6",
+ "fileName": "a5d4968e-4523-4206-a553-b439e7be24a6",
+ "cellName": "e2e",
+ "cellId": "a5d4968e-4523-4206-a553-b439e7be24a6",
+ "visible": true
+ },
+ "5b38b322-b837-4492-aed7-db33427d3e54": {
+ "path": "5b38b322-b837-4492-aed7-db33427d3e54",
+ "fileName": "5b38b322-b837-4492-aed7-db33427d3e54",
+ "cellName": "peer.ts",
+ "cellId": "5b38b322-b837-4492-aed7-db33427d3e54",
+ "visible": true,
+ "parentCellId": "40f371e2-c7eb-4d4b-9b06-46758b6ce41d"
+ },
+ "7951fe72-44e4-4be6-bb55-5a86978ed988": {
+ "path": "7951fe72-44e4-4be6-bb55-5a86978ed988",
+ "fileName": "7951fe72-44e4-4be6-bb55-5a86978ed988",
+ "cellName": "mediaconnection.ts",
+ "cellId": "7951fe72-44e4-4be6-bb55-5a86978ed988",
+ "visible": true,
+ "parentCellId": "40f371e2-c7eb-4d4b-9b06-46758b6ce41d"
+ },
+ "b3bb7d9e-aeba-4e38-9f51-15f79bab31e5": {
+ "path": "b3bb7d9e-aeba-4e38-9f51-15f79bab31e5",
+ "fileName": "b3bb7d9e-aeba-4e38-9f51-15f79bab31e5",
+ "cellName": "negotiator.ts",
+ "cellId": "b3bb7d9e-aeba-4e38-9f51-15f79bab31e5",
+ "visible": true,
+ "parentCellId": "40f371e2-c7eb-4d4b-9b06-46758b6ce41d"
+ },
+ "188ed55a-17a9-440f-91d0-ac769db1b962": {
+ "path": "188ed55a-17a9-440f-91d0-ac769db1b962",
+ "fileName": "188ed55a-17a9-440f-91d0-ac769db1b962",
+ "cellName": "mediachannel",
+ "cellId": "188ed55a-17a9-440f-91d0-ac769db1b962",
+ "visible": true,
+ "parentCellId": "a5d4968e-4523-4206-a553-b439e7be24a6"
+ },
+ "18984d8a-6baf-4849-8656-9cbf51bd3aa9": {
+ "path": "18984d8a-6baf-4849-8656-9cbf51bd3aa9",
+ "fileName": "18984d8a-6baf-4849-8656-9cbf51bd3aa9",
+ "cellName": "close.js",
+ "cellId": "18984d8a-6baf-4849-8656-9cbf51bd3aa9",
+ "visible": true,
+ "parentCellId": "188ed55a-17a9-440f-91d0-ac769db1b962"
+ },
+ "a96da84f-1e8f-499b-a900-284ac4fbef34": {
+ "path": "a96da84f-1e8f-499b-a900-284ac4fbef34",
+ "fileName": "a96da84f-1e8f-499b-a900-284ac4fbef34",
+ "cellName": "Caller: Initiate Media Call - peer.ts:L547-551",
+ "cellId": "a96da84f-1e8f-499b-a900-284ac4fbef34",
+ "visible": true,
+ "parentCellId": "5b38b322-b837-4492-aed7-db33427d3e54"
+ },
+ "lib/peer.ts-simstep-0e274d86-51de-45fb-bd33-57fdd3b27f4c": {
+ "path": "lib/peer.ts-simstep-0e274d86-51de-45fb-bd33-57fdd3b27f4c",
+ "fileName": "peer.ts",
+ "wiki": "The caller's application invokes `peer.call()`, providing the ID of the peer to call and the local `MediaStream` to be sent. This creates a `MediaConnection` object and starts the connection process.",
+ "cellName": "Caller: Initiate Media Call - peer.ts:L547-551",
+ "cellId": "a96da84f-1e8f-499b-a900-284ac4fbef34",
+ "visible": true,
+ "startLine": 547,
+ "endLine": 551,
+ "parentCellId": "5b38b322-b837-4492-aed7-db33427d3e54",
+ "parentPath": "lib/peer.ts"
+ },
+ "ce531e76-0bff-49ae-bb4b-2edd8b620d00": {
+ "path": "ce531e76-0bff-49ae-bb4b-2edd8b620d00",
+ "fileName": "ce531e76-0bff-49ae-bb4b-2edd8b620d00",
+ "cellName": "Caller: MediaConnection Initialization - mediaconnection.ts:L56-64",
+ "cellId": "ce531e76-0bff-49ae-bb4b-2edd8b620d00",
+ "visible": true,
+ "parentCellId": "7951fe72-44e4-4be6-bb55-5a86978ed988"
+ },
+ "lib/mediaconnection.ts-simstep-4b5be2c5-8bc4-4bc8-8992-4cfb58c3a63e": {
+ "path": "lib/mediaconnection.ts-simstep-4b5be2c5-8bc4-4bc8-8992-4cfb58c3a63e",
+ "fileName": "mediaconnection.ts",
+ "wiki": "The `MediaConnection` constructor runs. It sets up the connection properties, including a unique `connectionId`, and initializes a `Negotiator` instance to handle the underlying WebRTC signaling.",
+ "cellName": "Caller: MediaConnection Initialization - mediaconnection.ts:L56-64",
+ "cellId": "ce531e76-0bff-49ae-bb4b-2edd8b620d00",
+ "visible": true,
+ "startLine": 56,
+ "endLine": 64,
+ "parentCellId": "7951fe72-44e4-4be6-bb55-5a86978ed988",
+ "parentPath": "lib/mediaconnection.ts"
+ },
+ "ae99d4bb-3dd5-4ed1-8336-77ff7adb1e41": {
+ "path": "ae99d4bb-3dd5-4ed1-8336-77ff7adb1e41",
+ "fileName": "ae99d4bb-3dd5-4ed1-8336-77ff7adb1e41",
+ "cellName": "Receiver: Peer Handles Incoming Call - peer.ts:L396-405",
+ "cellId": "ae99d4bb-3dd5-4ed1-8336-77ff7adb1e41",
+ "visible": true,
+ "parentCellId": "5b38b322-b837-4492-aed7-db33427d3e54"
+ },
+ "lib/peer.ts-simstep-5eb34ba5-69d1-4d5b-9093-d27b1321cf9b": {
+ "path": "lib/peer.ts-simstep-5eb34ba5-69d1-4d5b-9093-d27b1321cf9b",
+ "fileName": "peer.ts",
+ "wiki": "The receiver's `Peer` instance receives the `OFFER` message from the signaling server. It creates a new `MediaConnection` object to represent the incoming call and then emits a `call` event to notify the application.",
+ "cellName": "Receiver: Peer Handles Incoming Call - peer.ts:L396-405",
+ "cellId": "ae99d4bb-3dd5-4ed1-8336-77ff7adb1e41",
+ "visible": true,
+ "startLine": 396,
+ "endLine": 405,
+ "parentCellId": "5b38b322-b837-4492-aed7-db33427d3e54",
+ "parentPath": "lib/peer.ts"
+ },
+ "4ff88491-3e0e-4cab-947a-39bbeca56385": {
+ "path": "4ff88491-3e0e-4cab-947a-39bbeca56385",
+ "fileName": "4ff88491-3e0e-4cab-947a-39bbeca56385",
+ "cellName": "Receiver: Application Receives 'call' Event - close.js:L29-46",
+ "cellId": "4ff88491-3e0e-4cab-947a-39bbeca56385",
+ "visible": true,
+ "parentCellId": "18984d8a-6baf-4849-8656-9cbf51bd3aa9"
+ },
+ "e2e/mediachannel/close.js-simstep-cdacdbb4-b68d-4506-a1cf-3720702545bf": {
+ "path": "e2e/mediachannel/close.js-simstep-cdacdbb4-b68d-4506-a1cf-3720702545bf",
+ "fileName": "close.js",
+ "wiki": "The receiver's application code, which has a listener set up with `peer.on('call', ...)`, is executed. The application now has access to the `MediaConnection` object and can decide to answer the call.",
+ "cellName": "Receiver: Application Receives 'call' Event - close.js:L29-46",
+ "cellId": "4ff88491-3e0e-4cab-947a-39bbeca56385",
+ "visible": true,
+ "startLine": 29,
+ "endLine": 46,
+ "parentCellId": "18984d8a-6baf-4849-8656-9cbf51bd3aa9",
+ "parentPath": "e2e/mediachannel/close.js"
+ },
+ "b33fd210-96ef-4739-8779-edcd271f78f5": {
+ "path": "b33fd210-96ef-4739-8779-edcd271f78f5",
+ "fileName": "b33fd210-96ef-4739-8779-edcd271f78f5",
+ "cellName": "Receiver: MediaConnection Processes Answer - mediaconnection.ts:L124-137",
+ "cellId": "b33fd210-96ef-4739-8779-edcd271f78f5",
+ "visible": true,
+ "parentCellId": "7951fe72-44e4-4be6-bb55-5a86978ed988"
+ },
+ "lib/mediaconnection.ts-simstep-892c2693-2db2-4241-9197-77922f03eff4": {
+ "path": "lib/mediaconnection.ts-simstep-892c2693-2db2-4241-9197-77922f03eff4",
+ "fileName": "mediaconnection.ts",
+ "wiki": "The `MediaConnection.answer()` method is executed. It stores the provided local stream and prepares the `Negotiator` to create and send an SDP answer back to the caller.",
+ "cellName": "Receiver: MediaConnection Processes Answer - mediaconnection.ts:L124-137",
+ "cellId": "b33fd210-96ef-4739-8779-edcd271f78f5",
+ "visible": true,
+ "startLine": 124,
+ "endLine": 137,
+ "parentCellId": "7951fe72-44e4-4be6-bb55-5a86978ed988",
+ "parentPath": "lib/mediaconnection.ts"
+ },
+ "eaa767f7-c086-499a-997b-78a80d9c6972": {
+ "path": "eaa767f7-c086-499a-997b-78a80d9c6972",
+ "fileName": "eaa767f7-c086-499a-997b-78a80d9c6972",
+ "cellName": "Both Peers: Remote Stream Received - negotiator.ts:L146-159",
+ "cellId": "eaa767f7-c086-499a-997b-78a80d9c6972",
+ "visible": true,
+ "parentCellId": "b3bb7d9e-aeba-4e38-9f51-15f79bab31e5"
+ },
+ "lib/negotiator.ts-simstep-d5738a3f-bc47-4ff7-a537-300764973e03": {
+ "path": "lib/negotiator.ts-simstep-d5738a3f-bc47-4ff7-a537-300764973e03",
+ "fileName": "negotiator.ts",
+ "wiki": "After the offer/answer exchange is complete, a direct P2P connection is established. When media packets start flowing, the `ontrack` event is fired on the `RTCPeerConnection`. The `Negotiator` listens for this event to capture the remote media stream.",
+ "cellName": "Both Peers: Remote Stream Received - negotiator.ts:L146-159",
+ "cellId": "eaa767f7-c086-499a-997b-78a80d9c6972",
+ "visible": true,
+ "startLine": 146,
+ "endLine": 159,
+ "parentCellId": "b3bb7d9e-aeba-4e38-9f51-15f79bab31e5",
+ "parentPath": "lib/negotiator.ts"
+ },
+ "ed9c7fc6-fdf0-47b3-af2e-d936d08007da": {
+ "path": "ed9c7fc6-fdf0-47b3-af2e-d936d08007da",
+ "fileName": "ed9c7fc6-fdf0-47b3-af2e-d936d08007da",
+ "cellName": "Both Peers: MediaConnection Emits 'stream' Event - negotiator.ts:L360-367",
+ "cellId": "ed9c7fc6-fdf0-47b3-af2e-d936d08007da",
+ "visible": true,
+ "parentCellId": "b3bb7d9e-aeba-4e38-9f51-15f79bab31e5"
+ },
+ "lib/negotiator.ts-simstep-8670a7e4-eff3-473f-9612-ef328428917e": {
+ "path": "lib/negotiator.ts-simstep-8670a7e4-eff3-473f-9612-ef328428917e",
+ "fileName": "negotiator.ts",
+ "wiki": "The `mediaConnection.addStream()` method is called, which sets the remote stream property on the connection object and emits the `stream` event, passing the remote `MediaStream` to the application.",
+ "cellName": "Both Peers: MediaConnection Emits 'stream' Event - negotiator.ts:L360-367",
+ "cellId": "ed9c7fc6-fdf0-47b3-af2e-d936d08007da",
+ "visible": true,
+ "startLine": 360,
+ "endLine": 367,
+ "parentCellId": "b3bb7d9e-aeba-4e38-9f51-15f79bab31e5",
+ "parentPath": "lib/negotiator.ts"
+ },
+ "2970dc45-6bdd-405e-ba6d-d4fd7e160633": {
+ "path": "2970dc45-6bdd-405e-ba6d-d4fd7e160633",
+ "fileName": "2970dc45-6bdd-405e-ba6d-d4fd7e160633",
+ "cellName": "Both Peers: Application Renders Remote Stream - close.js:L56-59",
+ "cellId": "2970dc45-6bdd-405e-ba6d-d4fd7e160633",
+ "visible": true,
+ "parentCellId": "18984d8a-6baf-4849-8656-9cbf51bd3aa9"
+ },
+ "e2e/mediachannel/close.js-simstep-23a1a037-1f55-435a-b87f-627bed609c7e": {
+ "path": "e2e/mediachannel/close.js-simstep-23a1a037-1f55-435a-b87f-627bed609c7e",
+ "fileName": "close.js",
+ "wiki": "The application's `call.on('stream', ...)` listener is executed. The code attaches the received `remoteStream` to an HTML `