# 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)


---

# Agent Instructions: Querying This Documentation

If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter:

```
GET https://dev.apirtc.com/apirtc-developer-portal/apirtc-js-library/video-communication-lifecycle.md?ask=<question>
```

The question should be specific, self-contained, and written in natural language.
The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
