2018-07-22 22:13:45 +02:00
|
|
|
/*
|
2020-02-04 11:25:54 +01:00
|
|
|
* (C) Copyright 2017-2020 OpenVidu (https://openvidu.io)
|
2018-07-22 22:13:45 +02:00
|
|
|
*
|
|
|
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
|
|
|
* you may not use this file except in compliance with the License.
|
|
|
|
* You may obtain a copy of the License at
|
|
|
|
*
|
|
|
|
* http://www.apache.org/licenses/LICENSE-2.0
|
|
|
|
*
|
|
|
|
* Unless required by applicable law or agreed to in writing, software
|
|
|
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
|
|
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
|
|
* See the License for the specific language governing permissions and
|
|
|
|
* limitations under the License.
|
|
|
|
*
|
|
|
|
*/
|
|
|
|
|
|
|
|
import { Publisher } from './Publisher';
|
2020-10-13 12:28:06 +02:00
|
|
|
import { ConnectionOptions } from './ConnectionOptions';
|
2020-10-20 22:22:09 +02:00
|
|
|
import { OpenViduRole } from './OpenViduRole';
|
2018-07-22 22:13:45 +02:00
|
|
|
|
|
|
|
/**
|
2020-10-15 13:16:29 +02:00
|
|
|
* See [[Session.connections]]
|
2018-07-22 22:13:45 +02:00
|
|
|
*/
|
|
|
|
export class Connection {
|
|
|
|
|
|
|
|
/**
|
2020-10-20 22:09:06 +02:00
|
|
|
* Identifier of the Connection. You can call methods [[Session.forceDisconnect]]
|
2020-10-08 19:31:47 +02:00
|
|
|
* or [[Session.updateConnection]] passing this property as parameter
|
2018-07-22 22:13:45 +02:00
|
|
|
*/
|
|
|
|
connectionId: string;
|
|
|
|
|
2020-10-14 14:02:19 +02:00
|
|
|
/**
|
2020-10-20 22:09:06 +02:00
|
|
|
* Returns the status of the Connection. Can be:
|
2020-10-14 14:02:19 +02:00
|
|
|
* - `pending`: if the Connection is waiting for any user to use
|
|
|
|
* its internal token to connect to the session, calling method
|
|
|
|
* [Session.connect](https://docs.openvidu.io/en/stable/api/openvidu-browser/classes/session.html#connect)
|
|
|
|
* in OpenVidu Browser.
|
|
|
|
* - `active`: if the internal token of the Connection has already
|
|
|
|
* been used by some user to connect to the session, and it cannot be used
|
|
|
|
* again.
|
|
|
|
*/
|
|
|
|
status: string;
|
|
|
|
|
2018-09-06 12:02:07 +02:00
|
|
|
/**
|
2020-10-20 22:09:06 +02:00
|
|
|
* Timestamp when the Connection was created, in UTC milliseconds (ms since Jan 1, 1970, 00:00:00 UTC)
|
2018-09-06 12:02:07 +02:00
|
|
|
*/
|
|
|
|
createdAt: number;
|
|
|
|
|
2020-10-17 19:51:26 +02:00
|
|
|
/**
|
2020-10-20 22:09:06 +02:00
|
|
|
* Timestamp when the Connection was taken by a user (passing from status "pending" to "active")
|
2020-10-17 19:51:26 +02:00
|
|
|
* in UTC milliseconds (ms since Jan 1, 1970, 00:00:00 UTC)
|
|
|
|
*/
|
|
|
|
activeAt: number;
|
|
|
|
|
2018-09-05 17:03:03 +02:00
|
|
|
/**
|
2020-03-21 23:54:18 +01:00
|
|
|
* <a href="https://docs.openvidu.io/en/stable/openvidu-pro/" target="_blank" style="display: inline-block; background-color: rgb(0, 136, 170); color: white; font-weight: bold; padding: 0px 5px; margin-right: 5px; border-radius: 3px; font-size: 13px; line-height:21px; font-family: Montserrat, sans-serif">PRO</a>
|
2020-10-20 22:09:06 +02:00
|
|
|
* Geo location of the Connection, with the following format: `"CITY, COUNTRY"` (`"unknown"` if it wasn't possible to locate it)
|
2018-09-05 17:03:03 +02:00
|
|
|
*/
|
|
|
|
location: string;
|
|
|
|
|
|
|
|
/**
|
|
|
|
* A complete description of the platform used by the participant to connect to the session
|
|
|
|
*/
|
|
|
|
platform: string;
|
|
|
|
|
2018-07-22 22:13:45 +02:00
|
|
|
/**
|
2020-10-20 22:09:06 +02:00
|
|
|
* Data associated to the Connection on the client-side. This value is set with second parameter of method
|
2020-04-05 20:03:46 +02:00
|
|
|
* [Session.connect](/en/stable/api/openvidu-browser/classes/session.html#connect) in OpenVidu Browser
|
2018-07-22 22:13:45 +02:00
|
|
|
*/
|
|
|
|
clientData: string;
|
|
|
|
|
2020-10-20 22:09:06 +02:00
|
|
|
/**
|
|
|
|
* The [[ConnectionOptions]] assigned to the Connection
|
|
|
|
*/
|
|
|
|
connectionOptions: ConnectionOptions;
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Token associated to the Connection
|
|
|
|
*/
|
|
|
|
token: string;
|
|
|
|
|
2018-07-22 22:13:45 +02:00
|
|
|
/**
|
|
|
|
* Array of Publisher objects this particular Connection is publishing to the Session (each Publisher object has one Stream, uniquely
|
|
|
|
* identified by its `streamId`). You can call [[Session.forceUnpublish]] passing any of this values as parameter
|
|
|
|
*/
|
|
|
|
publishers: Publisher[] = [];
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Array of streams (their `streamId` properties) this particular Connection is subscribed to. Each one always corresponds to one
|
|
|
|
* Publisher of some other Connection: each string of this array must be equal to one [[Publisher.streamId]] of other Connection
|
|
|
|
*/
|
|
|
|
subscribers: string[] = [];
|
|
|
|
|
2020-10-20 22:09:06 +02:00
|
|
|
/**
|
|
|
|
* @hidden deprecated. Inside ConnectionOptions
|
|
|
|
*/
|
|
|
|
role?: OpenViduRole;
|
|
|
|
/**
|
|
|
|
* @hidden deprecated. Inside ConnectionOptions
|
|
|
|
*/
|
|
|
|
serverData?: string;
|
|
|
|
|
2018-07-22 22:13:45 +02:00
|
|
|
/**
|
|
|
|
* @hidden
|
|
|
|
*/
|
2020-10-08 19:31:47 +02:00
|
|
|
constructor(json) {
|
2020-10-16 13:45:15 +02:00
|
|
|
this.resetWithJson(json);
|
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
* @hidden
|
|
|
|
*/
|
|
|
|
resetWithJson(json): Connection {
|
|
|
|
|
|
|
|
this.connectionId = json.connectionId;
|
|
|
|
this.status = json.status;
|
2020-10-20 22:09:06 +02:00
|
|
|
this.createdAt = json.createdAt;
|
|
|
|
this.activeAt = json.activeAt;
|
|
|
|
this.location = json.location;
|
|
|
|
this.platform = json.platform;
|
|
|
|
this.clientData = json.clientData;
|
2020-10-16 13:45:15 +02:00
|
|
|
this.token = json.token;
|
2020-10-20 22:09:06 +02:00
|
|
|
if (this.connectionOptions != null) {
|
|
|
|
this.connectionOptions.type = json.type;
|
|
|
|
this.connectionOptions.data = json.data;
|
|
|
|
this.connectionOptions.record = json.record;
|
|
|
|
this.connectionOptions.role = json.role;
|
|
|
|
this.connectionOptions.kurentoOptions = json.kurentoOptions;
|
|
|
|
this.connectionOptions.rtspUri = json.rtspUri;
|
|
|
|
this.connectionOptions.adaptativeBitrate = json.adaptativeBitrate;
|
|
|
|
this.connectionOptions.onlyPlayWithSubscribers = json.onlyPlayWithSubscribers;
|
|
|
|
this.connectionOptions.networkCache = json.networkCache;
|
|
|
|
} else {
|
|
|
|
this.connectionOptions = {
|
|
|
|
type: json.type,
|
|
|
|
data: json.data,
|
|
|
|
record: json.record,
|
|
|
|
role: json.role,
|
|
|
|
kurentoOptions: json.kurentoOptions,
|
|
|
|
rtspUri: json.rtspUri,
|
|
|
|
adaptativeBitrate: json.adaptativeBitrate,
|
|
|
|
onlyPlayWithSubscribers: json.onlyPlayWithSubscribers,
|
|
|
|
networkCache: json.networkCache
|
|
|
|
}
|
|
|
|
}
|
2020-10-16 13:45:15 +02:00
|
|
|
this.role = json.role;
|
2020-10-20 22:09:06 +02:00
|
|
|
this.serverData = json.data;
|
2020-10-16 13:45:15 +02:00
|
|
|
|
2020-10-20 22:09:06 +02:00
|
|
|
// publishers may be null
|
2020-10-08 19:31:47 +02:00
|
|
|
if (json.publishers != null) {
|
2020-10-16 13:45:15 +02:00
|
|
|
|
|
|
|
// 1. Array to store fetched Publishers and later remove closed ones
|
|
|
|
const fetchedPublisherIds: string[] = [];
|
|
|
|
json.publishers.forEach(jsonPublisher => {
|
|
|
|
|
|
|
|
const publisherObj: Publisher = new Publisher(jsonPublisher);
|
|
|
|
fetchedPublisherIds.push(publisherObj.streamId);
|
|
|
|
let storedPublisher = this.publishers.find(c => c.streamId === publisherObj.streamId);
|
|
|
|
|
|
|
|
if (!!storedPublisher) {
|
|
|
|
// 2. Update existing Publisher
|
|
|
|
storedPublisher.resetWithJson(jsonPublisher);
|
|
|
|
} else {
|
|
|
|
// 3. Add new Publisher
|
|
|
|
this.publishers.push(publisherObj);
|
|
|
|
}
|
2020-10-08 19:31:47 +02:00
|
|
|
});
|
2020-10-16 13:45:15 +02:00
|
|
|
|
|
|
|
// 4. Remove closed Publishers from local collection
|
|
|
|
for (var i = this.publishers.length - 1; i >= 0; --i) {
|
|
|
|
if (!fetchedPublisherIds.includes(this.publishers[i].streamId)) {
|
|
|
|
this.publishers.splice(i, 1);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2020-10-08 19:31:47 +02:00
|
|
|
}
|
2020-10-16 13:45:15 +02:00
|
|
|
|
2020-10-20 22:09:06 +02:00
|
|
|
// subscribers may be null
|
2020-10-08 19:31:47 +02:00
|
|
|
if (json.subscribers != null) {
|
2020-10-16 13:45:15 +02:00
|
|
|
|
|
|
|
// 1. Array to store fetched Subscribers and later remove closed ones
|
|
|
|
const fetchedSubscriberIds: string[] = [];
|
|
|
|
json.subscribers.forEach(jsonSubscriber => {
|
|
|
|
fetchedSubscriberIds.push(jsonSubscriber.streamId)
|
|
|
|
if (this.subscribers.indexOf(jsonSubscriber.streamId) === -1) {
|
|
|
|
// 2. Add new Subscriber
|
|
|
|
this.subscribers.push(jsonSubscriber.streamId);
|
|
|
|
}
|
2020-10-08 19:31:47 +02:00
|
|
|
});
|
2020-10-16 13:45:15 +02:00
|
|
|
|
|
|
|
// 3. Remove closed Subscribers from local collection
|
|
|
|
for (var i = this.subscribers.length - 1; i >= 0; --i) {
|
|
|
|
if (!fetchedSubscriberIds.includes(this.subscribers[i])) {
|
|
|
|
this.subscribers.splice(i, 1);
|
|
|
|
}
|
|
|
|
}
|
2020-10-08 19:31:47 +02:00
|
|
|
}
|
2020-10-16 13:45:15 +02:00
|
|
|
|
|
|
|
return this;
|
2018-07-22 22:13:45 +02:00
|
|
|
}
|
2018-09-19 15:36:26 +02:00
|
|
|
|
|
|
|
/**
|
|
|
|
* @hidden
|
|
|
|
*/
|
|
|
|
equalTo(other: Connection): boolean {
|
|
|
|
let equals: boolean = (
|
|
|
|
this.connectionId === other.connectionId &&
|
2020-10-14 14:02:19 +02:00
|
|
|
this.status === other.status &&
|
2018-09-19 15:36:26 +02:00
|
|
|
this.createdAt === other.createdAt &&
|
2020-10-17 19:51:26 +02:00
|
|
|
this.activeAt === other.activeAt &&
|
2020-10-20 22:09:06 +02:00
|
|
|
this.connectionOptions.type === other.connectionOptions.type &&
|
|
|
|
this.connectionOptions.data === other.connectionOptions.data &&
|
|
|
|
this.connectionOptions.record === other.connectionOptions.record &&
|
|
|
|
this.connectionOptions.role === other.connectionOptions.role &&
|
|
|
|
this.connectionOptions.rtspUri === other.connectionOptions.rtspUri &&
|
|
|
|
this.connectionOptions.adaptativeBitrate === other.connectionOptions.adaptativeBitrate &&
|
|
|
|
this.connectionOptions.onlyPlayWithSubscribers === other.connectionOptions.onlyPlayWithSubscribers &&
|
|
|
|
this.connectionOptions.networkCache === other.connectionOptions.networkCache &&
|
2018-09-19 15:36:26 +02:00
|
|
|
this.token === other.token &&
|
|
|
|
this.location === other.location &&
|
|
|
|
this.platform === other.platform &&
|
|
|
|
this.clientData === other.clientData &&
|
|
|
|
this.subscribers.length === other.subscribers.length &&
|
|
|
|
this.publishers.length === other.publishers.length);
|
2020-10-20 22:41:47 +02:00
|
|
|
if (equals) {
|
|
|
|
if (this.connectionOptions.kurentoOptions != null) {
|
|
|
|
equals = JSON.stringify(this.connectionOptions.kurentoOptions) === JSON.stringify(other.connectionOptions.kurentoOptions);
|
|
|
|
} else {
|
|
|
|
equals = (this.connectionOptions.kurentoOptions === other.connectionOptions.kurentoOptions);
|
|
|
|
}
|
|
|
|
}
|
2018-09-19 15:36:26 +02:00
|
|
|
if (equals) {
|
2020-10-20 22:54:54 +02:00
|
|
|
equals = JSON.stringify(this.subscribers.sort()) === JSON.stringify(other.subscribers.sort());
|
2018-09-19 15:36:26 +02:00
|
|
|
if (equals) {
|
|
|
|
let i = 0;
|
|
|
|
while (equals && i < this.publishers.length) {
|
|
|
|
equals = this.publishers[i].equalTo(other.publishers[i]);
|
|
|
|
i++;
|
|
|
|
}
|
|
|
|
return equals;
|
|
|
|
} else {
|
|
|
|
return false;
|
|
|
|
}
|
|
|
|
} else {
|
|
|
|
return false;
|
|
|
|
}
|
|
|
|
}
|
2020-10-08 19:31:47 +02:00
|
|
|
|
|
|
|
/**
|
|
|
|
* @hidden
|
|
|
|
*/
|
2020-10-20 22:09:06 +02:00
|
|
|
overrideConnectionOptions(newConnectionOptions: ConnectionOptions): void {
|
|
|
|
// For now only properties record and role
|
|
|
|
if (newConnectionOptions.record != null) {
|
|
|
|
this.connectionOptions.record = newConnectionOptions.record;
|
2020-10-08 19:31:47 +02:00
|
|
|
}
|
2020-10-20 22:09:06 +02:00
|
|
|
if (newConnectionOptions.role != null) {
|
|
|
|
this.connectionOptions.role = newConnectionOptions.role;
|
2020-10-08 19:31:47 +02:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2018-07-22 22:13:45 +02:00
|
|
|
}
|