> For the complete documentation index, see [llms.txt](https://dev.apirtc.com/apirtc-developer-portal/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://dev.apirtc.com/apirtc-developer-portal/apirtc-js-library/video-communication-lifecycle.md).

# Video Communication LifeCycle

Before starting coding... let's walk through the main concepts, methods and classes used during a Conversation lifecycle.&#x20;

* First, each run of a client application instantiates one `UserAgent` representing the local individual,
* A `Session` must be opened with **ApiRTC**'s servers to create a `Conversation` to which individuals can join,
* In a `Conversation`, individuals can **chat**, **watch**, **listen** and/or **share** **real-time audio, video, data, screen...**,
* A `Stream` is audio, and/or video captured from sources available from browser and published on a `Conversation`.

### UserAgent

As the entry point to **ApiRTC**, `UserAgent` is instantiated using the **apiKey** associated to your **enterprise account** on [https://cloud.apirtc.com](https://cloud.apirtc.com/).

![UserAgent](/files/Rfr01QkS47ixFsZkYOiY)

### Stream

When `UserAgent.createStream(options)` is called, a popup opens in the browser to request user acceptance for using media devices. The returned `Promise` resolves with an instance of `Stream`, which carries **media stream** from computer device through the browser.

The method `Stream.attachToElement(domElement)` binds the **media stream** to a DOM `<video>` element in order to display it in the web page.

![createstream](/files/jnT202Y0mcnMD1dtberP)

### Session

To use **ApiRTC**'s connected features, a `userAgent` must register to get a **session**. This can be done with or without authentication.

Simply using `UserAgent.register()` without authentication details registers a `userAgent` with **ApiRTC**'s servers without authentication.

![register](/files/8w1zvQVk4PQAUEyPHEBh)

The `session` grants access to connected features such as **conversations**.

### Conversation

An instance of `Conversation` is obtained from `Session.getOrCreateConversation(name)`.

![getOrCreateConversation](/files/Wsknrj0nLONsnelzIoUp)

### Join

Calling `Conversation.join()` makes the `userAgent` used to create the `Session` used to create this instance of `Conversation` (through it's `Session`) join the **conversation**.

![join](/files/F2C6hk8aGia7IO78v6Cp)

### Publish Streams

Once a **conversation** joined, a `userAgent` can publish a **stream** using `Conversation.publish(stream)` method:

![publish](/files/9CG2ggTsJ0aJhR1coPpi)

### Subscribe to Streams

Subscribing to peer **streams** shall be implemented as followed:

* Listen on `Conversation` `'streamListChanged'` event to get notified of **streams** published to the **conversation**. The data provided by the event is a `StreamInfo`: It gives information on **streams** published in the conversation such as the id (`StreamInfo.streamId`) of the **stream**. `StreamInfo.listEventType` property tells whether the event is triggered for and addition (value `'added'`) or a removal.
* Calling `conversation.subscribeToStream(streamId)` with the `StreamInfo.streamId` of an added remote stream makes this **conversation** subscribe to a **stream**.
* Finally, listening on `Conversation` `'streamAdded'` notifies with a remote `Stream` instance which can be attached to web page for display.

![subscribe](/files/l30ElJik3o6kjSCvQcyT)
