Mercurial > prosody-modules
comparison 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 |
| parents | mod_conversejs/mod_conversejs.lua@37aa50ed79c1 |
| children | 75b6e5df65f9 |
comparison
equal
deleted
inserted
replaced
| 4824:205b9d06fe6b | 4825:4bdfd83e091f |
|---|---|
| 1 -- mod_jsxc | |
| 2 -- Copyright (C) 2021 Kim Alvefur | |
| 3 | |
| 4 local json_encode = require"util.json".encode; | |
| 5 local xml_escape = require "util.stanza".xml_escape; | |
| 6 local render = require "util.interpolation".new("%b{}", xml_escape, { json = json_encode }); | |
| 7 | |
| 8 module:depends"http"; | |
| 9 module:depends"bosh"; | |
| 10 module:depends"http_libjs"; | |
| 11 | |
| 12 local jquery_url = module:get_option_string("jquery_url", "/share/jquery/jquery.min.js"); | |
| 13 | |
| 14 local cdn_url = module:get_option_string("jsxc_cdn", ""); | |
| 15 | |
| 16 local version = module:get_option_string("jsxc_version", ""); | |
| 17 if version ~= "" then version = "/" .. version end | |
| 18 | |
| 19 local serve_dist = nil; | |
| 20 local resources = module:get_option_path("jsxc_resources"); | |
| 21 if resources then | |
| 22 local serve; | |
| 23 if not pcall(function() | |
| 24 -- Prosody >= trunk / 0.12 | |
| 25 local http_files = require "net.http.files"; | |
| 26 serve = http_files.serve; | |
| 27 end) then | |
| 28 -- Prosody <= 0.11 | |
| 29 serve = module:depends "http_files".serve; | |
| 30 end | |
| 31 local mime_map = module:shared("/*/http_files/mime").types or { css = "text/css", js = "application/javascript" }; | |
| 32 serve_dist = serve({ path = resources, mime_map = mime_map }); | |
| 33 | |
| 34 cdn_url = module:http_url(); | |
| 35 end | |
| 36 | |
| 37 local js_url = module:get_option_string("jsxc_script", cdn_url..version.."/dist/jsxc.bundle.js"); | |
| 38 local css_url = module:get_option_string("jsxc_css", cdn_url..version.."/dist/styles/jsxc.bundle.css"); | |
| 39 | |
| 40 local html_template; | |
| 41 | |
| 42 do | |
| 43 local template_filename = module:get_option_string(module.name .. "_html_template", "templates/template.html"); | |
| 44 local template_file, err = module:load_resource(template_filename); | |
| 45 if template_file then | |
| 46 html_template, err = template_file:read("*a"); | |
| 47 template_file:close(); | |
| 48 end | |
| 49 if not html_template then | |
| 50 module:log("error", "Error loading HTML template: %s", err); | |
| 51 html_template = render("<h1>mod_{module} could not read the template</h1>\ | |
| 52 <p>Tried to open <b>{filename}</b></p>\ | |
| 53 <pre>{error}</pre>", | |
| 54 { module = module.name, filename = template_filename, error = err }); | |
| 55 end | |
| 56 end | |
| 57 | |
| 58 local js_template; | |
| 59 do | |
| 60 local template_filename = module:get_option_string(module.name .. "_js_template", "templates/template.js"); | |
| 61 local template_file, err = module:load_resource(template_filename); | |
| 62 if template_file then | |
| 63 js_template, err = template_file:read("*a"); | |
| 64 template_file:close(); | |
| 65 end | |
| 66 if not js_template then | |
| 67 module:log("error", "Error loading JS template: %s", err); | |
| 68 js_template = render("console.log(\"mod_{module} could not read the JS template: %s\", {error|json})", | |
| 69 { module = module.name, filename = template_filename, error = err }); | |
| 70 end | |
| 71 end | |
| 72 | |
| 73 local function get_jsxc_options() | |
| 74 return { xmpp = { url = module:http_url("bosh", "/http-bind"), domain = module.host } }; | |
| 75 end | |
| 76 | |
| 77 local add_tags = module:get_option_array("jsxc_tags", {}); | |
| 78 | |
| 79 module:provides("http", { | |
| 80 title = "jsxc.js"; | |
| 81 route = { | |
| 82 GET = function (event) | |
| 83 local jsxc_options = get_jsxc_options(); | |
| 84 | |
| 85 event.response.headers.content_type = "text/html"; | |
| 86 return render(html_template, { | |
| 87 service_name = module:get_option_string("name"); | |
| 88 header_scripts = { jquery_url, js_url }; | |
| 89 header_style = { css_url }; | |
| 90 header_tags = add_tags; | |
| 91 jsxcjs = { | |
| 92 options = jsxc_options; | |
| 93 startup = { script = js_template:format(json_encode(jsxc_options)); } | |
| 94 }; | |
| 95 }); | |
| 96 end; | |
| 97 | |
| 98 ["GET /prosody-jsxc.js"] = function (event) | |
| 99 local jsxc_options = get_jsxc_options(); | |
| 100 | |
| 101 event.response.headers.content_type = "application/javascript"; | |
| 102 return js_template:format(json_encode(jsxc_options)); | |
| 103 end; | |
| 104 ["GET /dist/*"] = serve_dist; | |
| 105 } | |
| 106 }); | |
| 107 |
