define(["util", "session", "storage", "require"], function (util, session, storage, require) {
var peers = util.Module("peers");
var assert = util.assert;
var CHECK_ACTIVITY_INTERVAL = 10*1000;
var IDLE_TIME = 3*60*1000;
var TAB_IDLE_TIME = 2*60*1000;
var BYE_TIME = 10*60*1000;
var ui;
require(["ui"], function (uiModule) {
ui = uiModule;
});
var DEFAULT_NICKNAMES = [
"Friendly Fox",
"Brilliant Beaver",
"Observant Owl",
"Gregarious Giraffe",
"Wild Wolf",
"Silent Seal",
"Wacky Whale",
"Curious Cat",
"Intelligent Iguana"
];
var Peer = util.Class({
isSelf: false,
constructor: function (id, attrs) {
attrs = attrs || {};
assert(id);
assert(! Peer.peers[id]);
this.id = id;
this.identityId = attrs.identityId || null;
this.status = attrs.status || "live";
this.idle = attrs.status || "active";
this.name = attrs.name || null;
this.avatar = attrs.avatar || null;
this.color = attrs.color || "#00FF00";
this.view = ui.PeerView(this);
this.lastMessageDate = 0;
this.following = attrs.following || false;
Peer.peers[id] = this;
var joined = attrs.joined || false;
if (attrs.fromHelloMessage) {
this.updateFromHello(attrs.fromHelloMessage);
if (attrs.fromHelloMessage.type == "hello") {
joined = true;
}
}
peers.emit("new-peer", this);
if (joined) {
this.view.notifyJoined();
}
this.view.update();
},
repr: function () {
return "Peer(" + JSON.stringify(this.id) + ")";
},
serialize: function () {
return {
id: this.id,
status: this.status,
idle: this.idle,
url: this.url,
hash: this.hash,
title: this.title,
identityId: this.identityId,
rtcSupported: this.rtcSupported,
name: this.name,
avatar: this.avatar,
color: this.color,
following: this.following
};
},
destroy: function () {
this.view.destroy();
delete Peer.peers[this.id];
},
updateMessageDate: function (msg) {
if (this.idle == "inactive") {
this.update({idle: "active"});
}
if (this.status == "bye") {
this.unbye();
}
this.lastMessageDate = Date.now();
},
updateFromHello: function (msg) {
var urlUpdated = false;
var activeRTC = false;
var identityUpdated = false;
if (msg.url && msg.url != this.url) {
this.url = msg.url;
this.hash = null;
this.title = null;
urlUpdated = true;
}
if (msg.hash != this.hash) {
this.hash = msg.urlHash;
urlUpdated = true;
}
if (msg.title != this.title) {
this.title = msg.title;
urlUpdated = true;
}
if (msg.rtcSupported !== undefined) {
this.rtcSupported = msg.rtcSupported;
}
if (msg.identityId !== undefined) {
this.identityId = msg.identityId;
}
if (msg.name && msg.name != this.name) {
this.name = msg.name;
identityUpdated = true;
}
if (msg.avatar && msg.avatar != this.avatar) {
util.assertValidUrl(msg.avatar);
this.avatar = msg.avatar;
identityUpdated = true;
}
if (msg.color && msg.color != this.color) {
this.color = msg.color;
identityUpdated = true;
}
if (msg.isClient !== undefined) {
this.isCreator = ! msg.isClient;
}
if (this.status != "live") {
this.status = "live";
peers.emit("status-updated", this);
}
if (this.idle != "active") {
this.idle = "active";
peers.emit("idle-updated", this);
}
if (msg.rtcSupported) {
peers.emit("rtc-supported", this);
}
if (urlUpdated) {
peers.emit("url-updated", this);
}
if (identityUpdated) {
peers.emit("identity-updated", this);
}