Packages
drab
0.9.0
0.10.5
0.10.4
0.10.3
0.10.2
0.10.1
0.10.0
0.9.3
0.9.2
0.9.1
0.9.0
0.8.3
0.8.2
0.8.1
0.8.0
0.7.7
0.7.6
0.7.5
0.7.4
0.7.3
0.7.2
0.7.1
0.7.0
0.6.3
0.6.2
0.6.1
0.6.0
0.6.0-pre.1
0.5.6
0.5.5
0.5.4
0.5.3
0.5.2
0.5.1
0.5.0
0.4.1
0.4.0
0.3.5
0.3.4
0.3.3
0.3.2
0.3.1
0.3.0
0.2.6
0.2.5
0.2.4
0.2.3
0.2.2
0.2.1
0.2.0
0.1.1
0.1.0
Remote controlled frontend framework for Phoenix.
Current section
Files
Jump to
Current section
Files
priv/templates/drab/drab.js
(function () {
"use strict";
function did() {
return "d" + window.Drab.counter++;
}
function generateUUID() {
var d = new Date().getTime();
if (typeof performance !== 'undefined' && typeof performance.now === 'function') {
d += performance.now();
}
return 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, function (c) {
var r = (d + Math.random() * 16) % 16 | 0;
d = Math.floor(d / 16);
return (c === 'x' ? r : (r & 0x3 | 0x8)).toString(16);
});
}
function client_id() {
var id = localStorage.getItem("client_id");
if (id) {
return id;
} else {
id = generateUUID();
localStorage.setItem("client_id", id);
return id
}
}
function closest(el, fn) {
return el && (fn(el) ? el : closest(el.parentNode, fn));
}
window.Drab = {
create: function (drab_return_token, drab_session_token, broadcast_topic) {
this.Socket = <%= Drab.Config.get(endpoint, :js_socket_constructor) %>;
this.drab_return_token = drab_return_token;
this.drab_session_token = drab_session_token;
this.self = this;
this.counter = 0;
this.myid = client_id();
this.onload_launched = false;
this.already_connected = false;
this.drab_topic = broadcast_topic;
this.client_lib_version = <%= client_lib_version %>;
},
connect: function (additional_token) {
var drab = this;
for (var i = 0; i < drab.load.length; i++) {
var fx = drab.load[i];
fx(drab);
}
var params = Object.assign({ __drab_return: this.drab_return_token }, additional_token);
params = Object.assign(params, {
__client_lib_version: Drab.client_lib_version,
__client_id: Drab.myid
});
this.socket = new this.Socket("<%= Drab.Config.get(endpoint, :socket) %>", {
params: params
});
// this.socket.onError(function(ev) {console.log("SOCKET ERROR", ev);});
// this.socket.onClose(function(ev) {console.log("SOCKET CLOSE", ev);});
this.socket.connect();
this.channel = this.socket.channel(this.drab_topic, {});
this.channel.join().receive("error", function (resp) {
console.log("Unable to join the Drab Channel", resp);
}).receive("ok", function (resp) {
// launch on_connect
for (var c = 0; c < drab.connected.length; c++) {
var fxc = drab.connected[c];
fxc(resp, drab);
}
drab.already_connected = true;
drab.already_disconnected = false;
// event is sent after Drab finish processing the event
drab.channel.on("event", function (message) {
if (message.finished && drab.event_reply_table[message.finished]) {
drab.event_reply_table[message.finished]();
delete drab.event_reply_table[message.finished];
}
});
});
this.socket.onClose(function (event) {
if (!drab.already_disconnected) {
drab.already_disconnected = true;
for (var di = 0; di < drab.disconnected.length; di++) {
var fxd = drab.disconnected[di];
fxd(drab);
}
}
});
},
//
// event_handler - string - function name in Phoenix Commander
// payload: object - will be passed as the second argument to the Event Handler
// execute_after - callback to function executes after event finish
exec_elixir: function (event_handler, payload, execute_after) {
var reply_to = did();
if (execute_after) {
Drab.event_reply_table[reply_to] = execute_after;
}
var message = {
event_handler_function: event_handler,
payload: payload,
reply_to: reply_to
};
this.channel.push("event", message);
},
error: function (message) {
console.log("[drab] " + message);
if (this.channel) {
Drab.exec_elixir("Drab.Logger.error", {message: message});
}
},
connected: [],
disconnected: [],
load: [],
change: [],
additional_payloads: [],
event_reply_table: {},
on_connect: function (f) {
this.connected.push(f);
},
on_disconnect: function (f) {
this.disconnected.push(f);
},
on_load: function (f) {
this.load.push(f);
},
on_change: function(f) {
this.change.push(f);
},
add_payload: function (f) {
this.additional_payloads.push(f);
},
set_drab_store_token: function(token) {
<%= Drab.Template.render_template(endpoint, "drab.store.#{Drab.Config.get(endpoint, :drab_store_storage)}.set.js", []) %>
},
get_drab_store_token: function() {
<%= Drab.Template.render_template(endpoint, "drab.store.#{Drab.Config.get(endpoint, :drab_store_storage)}.get.js", []) %>
},
get_drab_session_token: function () {
return this.drab_session_token;
}
};
<%=
Enum.map(templates, fn template ->
Drab.Template.render_template(endpoint, template, [endpoint: endpoint])
end)
%>
Drab.create('<%= controller_and_action %>', '<%= drab_session_token %>', '<%= broadcast_topic %>');
<%= if connect do %>
Drab.connect();
<% end %>
})();