Diff

mod_jsxc/mod_jsxc.lua @ 4825:4bdfd83e091f

mod_jsxc: Demo module serving JSXC relatively easily from Prosody Copy of mod_conversejs adjusted for JSXC. README TODO
author Kim Alvefur <zash@zash.se>
date Wed, 15 Dec 2021 18:28:40 +0100
parent 4209:37aa50ed79c1
child 4976:75b6e5df65f9
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/mod_jsxc/mod_jsxc.lua	Wed Dec 15 18:28:40 2021 +0100
@@ -0,0 +1,107 @@
+-- mod_jsxc
+-- Copyright (C) 2021 Kim Alvefur
+
+local json_encode = require"util.json".encode;
+local xml_escape = require "util.stanza".xml_escape;
+local render = require "util.interpolation".new("%b{}", xml_escape, { json = json_encode });
+
+module:depends"http";
+module:depends"bosh";
+module:depends"http_libjs";
+
+local jquery_url = module:get_option_string("jquery_url", "/share/jquery/jquery.min.js");
+
+local cdn_url = module:get_option_string("jsxc_cdn", "");
+
+local version = module:get_option_string("jsxc_version", "");
+if version ~= "" then version = "/" .. version end
+
+local serve_dist = nil;
+local resources = module:get_option_path("jsxc_resources");
+if resources then
+	local serve;
+	if not pcall(function()
+		-- Prosody >= trunk / 0.12
+		local http_files = require "net.http.files";
+		serve = http_files.serve;
+	end) then
+		-- Prosody <= 0.11
+		serve = module:depends "http_files".serve;
+	end
+	local mime_map = module:shared("/*/http_files/mime").types or { css = "text/css", js = "application/javascript" };
+	serve_dist = serve({ path = resources, mime_map = mime_map });
+
+	cdn_url = module:http_url();
+end
+
+local js_url = module:get_option_string("jsxc_script", cdn_url..version.."/dist/jsxc.bundle.js");
+local css_url = module:get_option_string("jsxc_css", cdn_url..version.."/dist/styles/jsxc.bundle.css");
+
+local html_template;
+
+do
+	local template_filename = module:get_option_string(module.name .. "_html_template", "templates/template.html");
+	local template_file, err = module:load_resource(template_filename);
+	if template_file then
+		html_template, err = template_file:read("*a");
+		template_file:close();
+	end
+	if not html_template then
+		module:log("error", "Error loading HTML template: %s", err);
+		html_template = render("<h1>mod_{module} could not read the template</h1>\
+		<p>Tried to open <b>{filename}</b></p>\
+		<pre>{error}</pre>",
+			{ module = module.name, filename = template_filename, error = err });
+	end
+end
+
+local js_template;
+do
+	local template_filename = module:get_option_string(module.name .. "_js_template", "templates/template.js");
+	local template_file, err = module:load_resource(template_filename);
+	if template_file then
+		js_template, err = template_file:read("*a");
+		template_file:close();
+	end
+	if not js_template then
+		module:log("error", "Error loading JS template: %s", err);
+		js_template = render("console.log(\"mod_{module} could not read the JS template: %s\", {error|json})",
+			{ module = module.name, filename = template_filename, error = err });
+	end
+end
+
+local function get_jsxc_options()
+	return { xmpp = { url = module:http_url("bosh", "/http-bind"), domain = module.host } };
+end
+
+local add_tags = module:get_option_array("jsxc_tags", {});
+
+module:provides("http", {
+	title = "jsxc.js";
+	route = {
+		GET = function (event)
+			local jsxc_options = get_jsxc_options();
+
+			event.response.headers.content_type = "text/html";
+			return render(html_template, {
+					service_name = module:get_option_string("name");
+					header_scripts = { jquery_url, js_url };
+					header_style = { css_url };
+					header_tags = add_tags;
+					jsxcjs = {
+						options = jsxc_options;
+						startup = { script = js_template:format(json_encode(jsxc_options)); }
+					};
+				});
+		end;
+
+		["GET /prosody-jsxc.js"] = function (event)
+			local jsxc_options = get_jsxc_options();
+
+			event.response.headers.content_type = "application/javascript";
+			return js_template:format(json_encode(jsxc_options));
+		end;
+		["GET /dist/*"] = serve_dist;
+	}
+});
+