123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267 |
- SpacedeckWebsockets = {
- data: {
- users_online: {}
- },
- methods: {
- handle_live_updates: function(msg) {
- if (msg.model == "Space" && msg.object) {
- if (msg.object.space_type == "space") {
- if (this.active_space) {
- if (this.active_space._id == msg.object._id) {
- this.active_space = _.merge(this.active_space, msg.object);
- }
- }
- }
- }
- if (msg.model == "Message") {
- if (msg.action == "create" && msg.object) {
- var new_message = msg.object;
- if(this.active_space && this.active_space._id == new_message.space._id) {
- this.active_space_messages.push(new_message);
- this.refresh_space_comments();
- } else console.log("message created in another space.");
- }
- }
- if (msg.model == "Artifact") {
- if (msg.action == "create" && msg.object) {
- var new_artifact = msg.object;
- if (this.active_space && this.active_space._id == new_artifact.space_id) {
- var o = new_artifact;
- if (o._id && !this.find_artifact_by_id(o._id)) {
- this.update_board_artifact_viewmodel(new_artifact);
- this.active_space_artifacts.push(new_artifact)
- } else {
- console.log("warning: got create on existing artifact.");
- msg.action = "update"; // hackety hack!
- }
- } else console.log("artifact created in another space.");
- }
- else if (msg.action == "update" && msg.object) {
- if (this.active_space) {
- var o = msg.object;
- if (o && o._id) {
- var existing_artifact = this.find_artifact_by_id(o._id);
- if (!existing_artifact) {
- existing_artifact = o;
- } else {
- for (key in o) {
- existing_artifact[key] = o[key];
- this.update_board_artifact_viewmodel(existing_artifact);
- }
- }
- }
- }
- }
- else if (msg.action == "delete" && msg.object) {
- if (this.active_space) {
- var o = msg.object;
- if (o._id){
- var existing_artifact = this.find_artifact_by_id(o._id);
- if (existing_artifact) {
- var idx = this.active_space_artifacts.indexOf(existing_artifact);
- this.active_space_artifacts.splice(idx, 1);
- } else console.log("existing artifact to delete not found");
- } else console.error("object without _id");
- }
- }
- }
- },
- subscribe: function(space) {
- if (this.websocket && this.websocket.readyState==1) {
- this.websocket.send(JSON.stringify({action: "subscribe", space_id: space._id}));
- } else {
- console.error("socket not ready yet. (subscribe)");
- }
- },
- is_member_online: function(space, member) {
- if (!member.user) {
- return false;
- }
- if (!this.users_online[space._id]) {
- return false;
- }
- var isOnline = _.find(this.users_online[space._id], function(u) {
- return (u._id == member.user._id);
- });
- return isOnline;
- },
- auth_websocket: function(space){
- if (!this.websocket) {
- this.init_websocket();
- }
- if (this.websocket && this.websocket.readyState==1) {
- var token = "";
- if (this.user) token = this.user.token;
- var auth_params = {
- action: "auth",
- editor_auth: space_auth,
- editor_name: this.guest_nickname,
- auth_token: token,
- space_id: space._id
- };
- console.log("[websocket] auth space");
- this.websocket.send(JSON.stringify(auth_params));
- }
- },
- websocket_send: function(msg) {
- if (!this.websocket) return;
- if (this.websocket.readyState!=1) return;
- try {
- this.websocket.send(JSON.stringify(msg));
- } catch (e) {
- // catch NS problems
- }
- },
- init_websocket: function() {
- if (this.websocket) this.websocket = null;
- if (this.current_timeout) {
- clearTimeout(this.current_timeout);
- this.current_timeout = null;
- }
- try {
- this.websocket = new WebSocket(ENV.websocketsEndpoint + "/socket");
- } catch (e) {
- console.log("[websocket] cannot establish websocket connection: ",e);
- this.current_timeout = setTimeout(function() {
- console.log("[websocket] reconnecting", e);
- this.init_websocket();
- }.bind(this),5000);
- }
- if (!this.websocket) {
- console.log("[websocket] no websocket support?");
- return;
- }
- this.websocket.onopen = function(evt) {
- if (this.current_timeout) {
- clearTimeout(this.current_timeout);
- this.current_timeout = null;
- }
- if (this.active_space_loaded) {
- this.auth_websocket(this.active_space);
- }
- this.online = true;
- }.bind(this);
- this.websocket.onclose = function(evt) {
- if (!window._spacedeck_location_change) {
- this.online = false;
- }
- if (!this.current_timeout) {
- this.current_timeout = setTimeout(function() {
- console.log("[websocket] onclose: reconnecting", evt);
- this.init_websocket();
- }.bind(this),5000);
- }
- }.bind(this);
- this.websocket.onmessage = function(evt) {
- this.online = true;
- try {
- var msg = JSON.parse(evt.data);
- } catch (e) {
- console.log("[websocket] malformed message: ",evt.data);
- return;
- }
- if (msg.channel_id == channel_id) {
- return;
- }
- if (msg.action == "cursor") {
- this.handle_user_cursor_update(msg);
- }
- else if (msg.action == "viewport") {
- this.handle_presenter_viewport_update(msg);
- }
- else if (msg.action == "media") {
- this.handle_presenter_media_update(msg);
- }
- if (msg.action == "update" || msg.action == "create" || msg.action == "delete"){
- this.handle_live_updates(msg);
- }
- if (msg.action == "init") {
- channel_id = msg.channel_id;
- }
- if (msg.action == "auth_valid") {
- if (this.active_space) {
- this.subscribe(this.active_space);
- if (this.unsaved_transactions()) {
- console.log("[websockets-saver] found unsaved transactions, triggering save.");
- this.process_artifact_save_queue();
- }
- }
- }
- if (msg.action == "subscription_valid") {
- console.log("subscription_valid");
- }
- if (msg.action == "status_update") {
- var spaceId = msg.space_id;
- var users = msg.users;
- // filter ourselves
- if (this.user && this.user._id) {
- users = _.filter(users, function(u) {
- return (u && (u._id != this.user._id));
- }.bind(this));
- }
-
- users = _.filter(users, function(u) {
- return (u && (u._id || u.nickname));
- });
-
- this.users_online[spaceId] = users;
-
- if (this.active_space) {
- if (this.active_space._id == spaceId) {
- this.active_space_users = users;
- }
- }
- }
- }.bind(this);
- this.websocket.onerror = function(evt) {
- console.log("websocket.onerror:", evt);
- if (!window._spacedeck_location_change) {
- this.online = false;
- this.was_offline = true;
- }
- if (!this.current_timeout) {
- this.current_timeout = setTimeout(function() {
- console.log("websocket.onerror: reconnecting", evt);
- this.init_websocket();
- }.bind(this),5000);
- }
- }.bind(this);
- }
- }
- }
|