Annotate

mod_conversejs/mod_conversejs.lua @ 3492:f59334da6df9

mod_conversejs: Show fallback text if converse.js fails to load (thanks MattJ) This can happen if javascript is enabled but 3rd party resources are blocked, or some other error happened.
author Kim Alvefur <zash@zash.se>
date Tue, 19 Mar 2019 19:43:13 +0100
parent 3363:2681f74750b2
child 3494:4feab7e87675
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
2657
6f5c99c9f6cc mod_conversejs: Simple demo module for serving converse.js from internal http server
Kim Alvefur <zash@zash.se>
parents:
diff changeset
1 -- mod_conversejs
6f5c99c9f6cc mod_conversejs: Simple demo module for serving converse.js from internal http server
Kim Alvefur <zash@zash.se>
parents:
diff changeset
2 -- Copyright (C) 2017 Kim Alvefur
6f5c99c9f6cc mod_conversejs: Simple demo module for serving converse.js from internal http server
Kim Alvefur <zash@zash.se>
parents:
diff changeset
3
6f5c99c9f6cc mod_conversejs: Simple demo module for serving converse.js from internal http server
Kim Alvefur <zash@zash.se>
parents:
diff changeset
4 local json_encode = require"util.json".encode;
6f5c99c9f6cc mod_conversejs: Simple demo module for serving converse.js from internal http server
Kim Alvefur <zash@zash.se>
parents:
diff changeset
5
3329
43d0e298ddda mod_conversejs: Explicitly depend on mod_http
Kim Alvefur <zash@zash.se>
parents: 3324
diff changeset
6 module:depends"http";
3363
2681f74750b2 mod_conversejs: Weaken dependency on mod_bosh
Kim Alvefur <zash@zash.se>
parents: 3348
diff changeset
7
2681f74750b2 mod_conversejs: Weaken dependency on mod_bosh
Kim Alvefur <zash@zash.se>
parents: 3348
diff changeset
8 local has_bosh = pcall(function ()
2681f74750b2 mod_conversejs: Weaken dependency on mod_bosh
Kim Alvefur <zash@zash.se>
parents: 3348
diff changeset
9 module:depends"bosh";
2681f74750b2 mod_conversejs: Weaken dependency on mod_bosh
Kim Alvefur <zash@zash.se>
parents: 3348
diff changeset
10 end);
2657
6f5c99c9f6cc mod_conversejs: Simple demo module for serving converse.js from internal http server
Kim Alvefur <zash@zash.se>
parents:
diff changeset
11
6f5c99c9f6cc mod_conversejs: Simple demo module for serving converse.js from internal http server
Kim Alvefur <zash@zash.se>
parents:
diff changeset
12 local has_ws = pcall(function ()
6f5c99c9f6cc mod_conversejs: Simple demo module for serving converse.js from internal http server
Kim Alvefur <zash@zash.se>
parents:
diff changeset
13 module:depends("websocket");
6f5c99c9f6cc mod_conversejs: Simple demo module for serving converse.js from internal http server
Kim Alvefur <zash@zash.se>
parents:
diff changeset
14 end);
6f5c99c9f6cc mod_conversejs: Simple demo module for serving converse.js from internal http server
Kim Alvefur <zash@zash.se>
parents:
diff changeset
15
3331
d98341bca458 mod_conversejs: Allow overriding CDN URL, or script/css URLs independently
Matthew Wild <mwild1@gmail.com>
parents: 3329
diff changeset
16 local cdn_url = module:get_option_string("conversejs_cdn", "https://cdn.conversejs.org");
d98341bca458 mod_conversejs: Allow overriding CDN URL, or script/css URLs independently
Matthew Wild <mwild1@gmail.com>
parents: 3329
diff changeset
17
3348
f753cf4f7224 mod_conversejs: Default to latest version of Converse.js
Kim Alvefur <zash@zash.se>
parents: 3347
diff changeset
18 local version = module:get_option_string("conversejs_version", "");
3347
823156d5885b mod_conversejs: Strip extra slash if version is set to the empty string
Kim Alvefur <zash@zash.se>
parents: 3337
diff changeset
19 if version ~= "" then version = "/" .. version end
823156d5885b mod_conversejs: Strip extra slash if version is set to the empty string
Kim Alvefur <zash@zash.se>
parents: 3337
diff changeset
20 local js_url = module:get_option_string("conversejs_script", cdn_url..version.."/dist/converse.min.js");
823156d5885b mod_conversejs: Strip extra slash if version is set to the empty string
Kim Alvefur <zash@zash.se>
parents: 3337
diff changeset
21 local css_url = module:get_option_string("conversejs_css", cdn_url..version.."/css/converse.min.css");
3331
d98341bca458 mod_conversejs: Allow overriding CDN URL, or script/css URLs independently
Matthew Wild <mwild1@gmail.com>
parents: 3329
diff changeset
22
d98341bca458 mod_conversejs: Allow overriding CDN URL, or script/css URLs independently
Matthew Wild <mwild1@gmail.com>
parents: 3329
diff changeset
23 local html_template = ([[
2657
6f5c99c9f6cc mod_conversejs: Simple demo module for serving converse.js from internal http server
Kim Alvefur <zash@zash.se>
parents:
diff changeset
24 <!DOCTYPE html>
3038
48cbf6a3f112 mod_conversejs: Make HTML more well-formed
Kim Alvefur <zash@zash.se>
parents: 2998
diff changeset
25 <html>
48cbf6a3f112 mod_conversejs: Make HTML more well-formed
Kim Alvefur <zash@zash.se>
parents: 2998
diff changeset
26 <head>
2657
6f5c99c9f6cc mod_conversejs: Simple demo module for serving converse.js from internal http server
Kim Alvefur <zash@zash.se>
parents:
diff changeset
27 <meta charset="utf-8">
3331
d98341bca458 mod_conversejs: Allow overriding CDN URL, or script/css URLs independently
Matthew Wild <mwild1@gmail.com>
parents: 3329
diff changeset
28 <link rel="stylesheet" type="text/css" media="screen" href="$css_url"/>
d98341bca458 mod_conversejs: Allow overriding CDN URL, or script/css URLs independently
Matthew Wild <mwild1@gmail.com>
parents: 3329
diff changeset
29 <script charset="utf-8" src="$js_url"></script>
3324
3114b403362d mod_conversejs: Add a page title
Kim Alvefur <zash@zash.se>
parents: 3323
diff changeset
30 <title>Prosody IM and Converse.js</title>
3038
48cbf6a3f112 mod_conversejs: Make HTML more well-formed
Kim Alvefur <zash@zash.se>
parents: 2998
diff changeset
31 </head>
3039
df77580be2f0 mod_conversejs: Appologise for the JavaScript
Kim Alvefur <zash@zash.se>
parents: 3038
diff changeset
32 <body>
df77580be2f0 mod_conversejs: Appologise for the JavaScript
Kim Alvefur <zash@zash.se>
parents: 3038
diff changeset
33 <noscript>
df77580be2f0 mod_conversejs: Appologise for the JavaScript
Kim Alvefur <zash@zash.se>
parents: 3038
diff changeset
34 <h1>Converse.js</h1>
df77580be2f0 mod_conversejs: Appologise for the JavaScript
Kim Alvefur <zash@zash.se>
parents: 3038
diff changeset
35 <p>I&apos;m sorry, but this XMPP client application won&apos;t work without JavaScript.</p>
3040
81b75086a781 mod_conversejs: Suggest some alternative cliets if JavaScript is disabled
Kim Alvefur <zash@zash.se>
parents: 3039
diff changeset
36 <p>Perhaps you would like to try one of these clients:</p>
81b75086a781 mod_conversejs: Suggest some alternative cliets if JavaScript is disabled
Kim Alvefur <zash@zash.se>
parents: 3039
diff changeset
37 <dl>
81b75086a781 mod_conversejs: Suggest some alternative cliets if JavaScript is disabled
Kim Alvefur <zash@zash.se>
parents: 3039
diff changeset
38 <dt>Desktop</dt>
81b75086a781 mod_conversejs: Suggest some alternative cliets if JavaScript is disabled
Kim Alvefur <zash@zash.se>
parents: 3039
diff changeset
39 <dd><ul>
81b75086a781 mod_conversejs: Suggest some alternative cliets if JavaScript is disabled
Kim Alvefur <zash@zash.se>
parents: 3039
diff changeset
40 <li><a href="https://gajim.org/">Gajim</a></li>
81b75086a781 mod_conversejs: Suggest some alternative cliets if JavaScript is disabled
Kim Alvefur <zash@zash.se>
parents: 3039
diff changeset
41 <li><a href="https://poez.io/">Poezio</a></li>
81b75086a781 mod_conversejs: Suggest some alternative cliets if JavaScript is disabled
Kim Alvefur <zash@zash.se>
parents: 3039
diff changeset
42 <li><a href="https://swift.im/">Swift</a></li>
81b75086a781 mod_conversejs: Suggest some alternative cliets if JavaScript is disabled
Kim Alvefur <zash@zash.se>
parents: 3039
diff changeset
43 </ul></dd>
81b75086a781 mod_conversejs: Suggest some alternative cliets if JavaScript is disabled
Kim Alvefur <zash@zash.se>
parents: 3039
diff changeset
44 <dt>Mobile</dt>
81b75086a781 mod_conversejs: Suggest some alternative cliets if JavaScript is disabled
Kim Alvefur <zash@zash.se>
parents: 3039
diff changeset
45 <dd><ul>
81b75086a781 mod_conversejs: Suggest some alternative cliets if JavaScript is disabled
Kim Alvefur <zash@zash.se>
parents: 3039
diff changeset
46 <li><a href="https://github.com/siacs/Conversations">Conversations</a></li>
81b75086a781 mod_conversejs: Suggest some alternative cliets if JavaScript is disabled
Kim Alvefur <zash@zash.se>
parents: 3039
diff changeset
47 <li><a href="https://yaxim.org/">Yaxim</a></li>
81b75086a781 mod_conversejs: Suggest some alternative cliets if JavaScript is disabled
Kim Alvefur <zash@zash.se>
parents: 3039
diff changeset
48 </ul></dd>
81b75086a781 mod_conversejs: Suggest some alternative cliets if JavaScript is disabled
Kim Alvefur <zash@zash.se>
parents: 3039
diff changeset
49 </dl>
81b75086a781 mod_conversejs: Suggest some alternative cliets if JavaScript is disabled
Kim Alvefur <zash@zash.se>
parents: 3039
diff changeset
50 <p><a href="https://xmpp.org/software/clients.html">More clients...</a></p>
3039
df77580be2f0 mod_conversejs: Appologise for the JavaScript
Kim Alvefur <zash@zash.se>
parents: 3038
diff changeset
51 </noscript>
3312
e714be00aaad mod_conversejs: Factor JavaScript part out of HTML
Kim Alvefur <zash@zash.se>
parents: 3310
diff changeset
52 <script>%s</script>
3039
df77580be2f0 mod_conversejs: Appologise for the JavaScript
Kim Alvefur <zash@zash.se>
parents: 3038
diff changeset
53 </body>
3038
48cbf6a3f112 mod_conversejs: Make HTML more well-formed
Kim Alvefur <zash@zash.se>
parents: 2998
diff changeset
54 </html>
3331
d98341bca458 mod_conversejs: Allow overriding CDN URL, or script/css URLs independently
Matthew Wild <mwild1@gmail.com>
parents: 3329
diff changeset
55 ]]):gsub("$([%w_]+)", { js_url = js_url, css_url = css_url });
2657
6f5c99c9f6cc mod_conversejs: Simple demo module for serving converse.js from internal http server
Kim Alvefur <zash@zash.se>
parents:
diff changeset
56
3492
f59334da6df9 mod_conversejs: Show fallback text if converse.js fails to load (thanks MattJ)
Kim Alvefur <zash@zash.se>
parents: 3363
diff changeset
57 js_template = [[
f59334da6df9 mod_conversejs: Show fallback text if converse.js fails to load (thanks MattJ)
Kim Alvefur <zash@zash.se>
parents: 3363
diff changeset
58 if(typeof converse == 'undefined') {
f59334da6df9 mod_conversejs: Show fallback text if converse.js fails to load (thanks MattJ)
Kim Alvefur <zash@zash.se>
parents: 3363
diff changeset
59 var div = document.createElement("div");
f59334da6df9 mod_conversejs: Show fallback text if converse.js fails to load (thanks MattJ)
Kim Alvefur <zash@zash.se>
parents: 3363
diff changeset
60 var noscript = document.getElementsByTagName("noscript")[0];
f59334da6df9 mod_conversejs: Show fallback text if converse.js fails to load (thanks MattJ)
Kim Alvefur <zash@zash.se>
parents: 3363
diff changeset
61 div.innerHTML = noscript.innerText;
f59334da6df9 mod_conversejs: Show fallback text if converse.js fails to load (thanks MattJ)
Kim Alvefur <zash@zash.se>
parents: 3363
diff changeset
62 document.body.appendChild(div);
f59334da6df9 mod_conversejs: Show fallback text if converse.js fails to load (thanks MattJ)
Kim Alvefur <zash@zash.se>
parents: 3363
diff changeset
63 } else {
f59334da6df9 mod_conversejs: Show fallback text if converse.js fails to load (thanks MattJ)
Kim Alvefur <zash@zash.se>
parents: 3363
diff changeset
64 converse.initialize(%s);
f59334da6df9 mod_conversejs: Show fallback text if converse.js fails to load (thanks MattJ)
Kim Alvefur <zash@zash.se>
parents: 3363
diff changeset
65 }
f59334da6df9 mod_conversejs: Show fallback text if converse.js fails to load (thanks MattJ)
Kim Alvefur <zash@zash.se>
parents: 3363
diff changeset
66 ]];
3312
e714be00aaad mod_conversejs: Factor JavaScript part out of HTML
Kim Alvefur <zash@zash.se>
parents: 3310
diff changeset
67
3332
4fdd8b77da54 mod_conversejs: Variable rename for clarity (user may override options)
Matthew Wild <mwild1@gmail.com>
parents: 3331
diff changeset
68 local user_options = module:get_option("conversejs_options");
2919
0ea93da47db9 mod_conversejs: Allow passing arbitrary options trough to Converse.js
Kim Alvefur <zash@zash.se>
parents: 2694
diff changeset
69
3313
d6b922191aeb mod_conversejs: Factor out option handling into a function for future reuse
Kim Alvefur <zash@zash.se>
parents: 3312
diff changeset
70 local function get_converse_options()
d6b922191aeb mod_conversejs: Factor out option handling into a function for future reuse
Kim Alvefur <zash@zash.se>
parents: 3312
diff changeset
71 local allow_registration = module:get_option_boolean("allow_registration", false);
d6b922191aeb mod_conversejs: Factor out option handling into a function for future reuse
Kim Alvefur <zash@zash.se>
parents: 3312
diff changeset
72 local converse_options = {
3363
2681f74750b2 mod_conversejs: Weaken dependency on mod_bosh
Kim Alvefur <zash@zash.se>
parents: 3348
diff changeset
73 bosh_service_url = has_bosh and module:http_url("bosh","/http-bind") or nil;
3313
d6b922191aeb mod_conversejs: Factor out option handling into a function for future reuse
Kim Alvefur <zash@zash.se>
parents: 3312
diff changeset
74 websocket_url = has_ws and module:http_url("websocket","xmpp-websocket"):gsub("^http", "ws") or nil;
d6b922191aeb mod_conversejs: Factor out option handling into a function for future reuse
Kim Alvefur <zash@zash.se>
parents: 3312
diff changeset
75 authentication = module:get_option_string("authentication") == "anonymous" and "anonymous" or "login";
d6b922191aeb mod_conversejs: Factor out option handling into a function for future reuse
Kim Alvefur <zash@zash.se>
parents: 3312
diff changeset
76 jid = module.host;
d6b922191aeb mod_conversejs: Factor out option handling into a function for future reuse
Kim Alvefur <zash@zash.se>
parents: 3312
diff changeset
77 default_domain = module.host;
d6b922191aeb mod_conversejs: Factor out option handling into a function for future reuse
Kim Alvefur <zash@zash.se>
parents: 3312
diff changeset
78 domain_placeholder = module.host;
d6b922191aeb mod_conversejs: Factor out option handling into a function for future reuse
Kim Alvefur <zash@zash.se>
parents: 3312
diff changeset
79 allow_registration = allow_registration;
d6b922191aeb mod_conversejs: Factor out option handling into a function for future reuse
Kim Alvefur <zash@zash.se>
parents: 3312
diff changeset
80 registration_domain = allow_registration and module.host or nil;
d6b922191aeb mod_conversejs: Factor out option handling into a function for future reuse
Kim Alvefur <zash@zash.se>
parents: 3312
diff changeset
81 };
d6b922191aeb mod_conversejs: Factor out option handling into a function for future reuse
Kim Alvefur <zash@zash.se>
parents: 3312
diff changeset
82
3332
4fdd8b77da54 mod_conversejs: Variable rename for clarity (user may override options)
Matthew Wild <mwild1@gmail.com>
parents: 3331
diff changeset
83 if type(user_options) == "table" then
4fdd8b77da54 mod_conversejs: Variable rename for clarity (user may override options)
Matthew Wild <mwild1@gmail.com>
parents: 3331
diff changeset
84 for k,v in pairs(user_options) do
3313
d6b922191aeb mod_conversejs: Factor out option handling into a function for future reuse
Kim Alvefur <zash@zash.se>
parents: 3312
diff changeset
85 converse_options[k] = v;
d6b922191aeb mod_conversejs: Factor out option handling into a function for future reuse
Kim Alvefur <zash@zash.se>
parents: 3312
diff changeset
86 end
d6b922191aeb mod_conversejs: Factor out option handling into a function for future reuse
Kim Alvefur <zash@zash.se>
parents: 3312
diff changeset
87 end
d6b922191aeb mod_conversejs: Factor out option handling into a function for future reuse
Kim Alvefur <zash@zash.se>
parents: 3312
diff changeset
88
d6b922191aeb mod_conversejs: Factor out option handling into a function for future reuse
Kim Alvefur <zash@zash.se>
parents: 3312
diff changeset
89 return converse_options;
d6b922191aeb mod_conversejs: Factor out option handling into a function for future reuse
Kim Alvefur <zash@zash.se>
parents: 3312
diff changeset
90 end
d6b922191aeb mod_conversejs: Factor out option handling into a function for future reuse
Kim Alvefur <zash@zash.se>
parents: 3312
diff changeset
91
3333
5be90562e14b mod_conversejs: Allow custom tags to be inserted into the generated HTML
Matthew Wild <mwild1@gmail.com>
parents: 3332
diff changeset
92 local add_tags = module:get_option_set("conversejs_tags");
5be90562e14b mod_conversejs: Allow custom tags to be inserted into the generated HTML
Matthew Wild <mwild1@gmail.com>
parents: 3332
diff changeset
93
5be90562e14b mod_conversejs: Allow custom tags to be inserted into the generated HTML
Matthew Wild <mwild1@gmail.com>
parents: 3332
diff changeset
94 if add_tags then
5be90562e14b mod_conversejs: Allow custom tags to be inserted into the generated HTML
Matthew Wild <mwild1@gmail.com>
parents: 3332
diff changeset
95 local tags = {};
5be90562e14b mod_conversejs: Allow custom tags to be inserted into the generated HTML
Matthew Wild <mwild1@gmail.com>
parents: 3332
diff changeset
96 for tag in add_tags do
5be90562e14b mod_conversejs: Allow custom tags to be inserted into the generated HTML
Matthew Wild <mwild1@gmail.com>
parents: 3332
diff changeset
97 table.insert(tags, tag);
5be90562e14b mod_conversejs: Allow custom tags to be inserted into the generated HTML
Matthew Wild <mwild1@gmail.com>
parents: 3332
diff changeset
98 end
5be90562e14b mod_conversejs: Allow custom tags to be inserted into the generated HTML
Matthew Wild <mwild1@gmail.com>
parents: 3332
diff changeset
99 html_template = html_template:gsub("</head>", table.concat(tags, "\n"):gsub("%%", "%%").."\n</head>");
5be90562e14b mod_conversejs: Allow custom tags to be inserted into the generated HTML
Matthew Wild <mwild1@gmail.com>
parents: 3332
diff changeset
100 end
5be90562e14b mod_conversejs: Allow custom tags to be inserted into the generated HTML
Matthew Wild <mwild1@gmail.com>
parents: 3332
diff changeset
101
2657
6f5c99c9f6cc mod_conversejs: Simple demo module for serving converse.js from internal http server
Kim Alvefur <zash@zash.se>
parents:
diff changeset
102 module:provides("http", {
3337
b46bb9392efe mod_conversejs: Set a friendly name for mod_http_index
Kim Alvefur <zash@zash.se>
parents: 3333
diff changeset
103 title = "Converse.js";
2657
6f5c99c9f6cc mod_conversejs: Simple demo module for serving converse.js from internal http server
Kim Alvefur <zash@zash.se>
parents:
diff changeset
104 route = {
6f5c99c9f6cc mod_conversejs: Simple demo module for serving converse.js from internal http server
Kim Alvefur <zash@zash.se>
parents:
diff changeset
105 GET = function (event)
3313
d6b922191aeb mod_conversejs: Factor out option handling into a function for future reuse
Kim Alvefur <zash@zash.se>
parents: 3312
diff changeset
106 local converse_options = get_converse_options();
3310
908b2bc05d26 mod_conversejs: Restore accidentally removed configuration option handling
Kim Alvefur <zash@zash.se>
parents: 3309
diff changeset
107
2919
0ea93da47db9 mod_conversejs: Allow passing arbitrary options trough to Converse.js
Kim Alvefur <zash@zash.se>
parents: 2694
diff changeset
108 event.response.headers.content_type = "text/html";
3312
e714be00aaad mod_conversejs: Factor JavaScript part out of HTML
Kim Alvefur <zash@zash.se>
parents: 3310
diff changeset
109 return html_template:format(js_template:format(json_encode(converse_options)));
2657
6f5c99c9f6cc mod_conversejs: Simple demo module for serving converse.js from internal http server
Kim Alvefur <zash@zash.se>
parents:
diff changeset
110 end;
3314
ab67f222d88b mod_conversejs: Add an endpoint returning only initialization snippet
Kim Alvefur <zash@zash.se>
parents: 3313
diff changeset
111
ab67f222d88b mod_conversejs: Add an endpoint returning only initialization snippet
Kim Alvefur <zash@zash.se>
parents: 3313
diff changeset
112 ["GET /prosody-converse.js"] = function (event)
ab67f222d88b mod_conversejs: Add an endpoint returning only initialization snippet
Kim Alvefur <zash@zash.se>
parents: 3313
diff changeset
113 local converse_options = get_converse_options();
ab67f222d88b mod_conversejs: Add an endpoint returning only initialization snippet
Kim Alvefur <zash@zash.se>
parents: 3313
diff changeset
114
ab67f222d88b mod_conversejs: Add an endpoint returning only initialization snippet
Kim Alvefur <zash@zash.se>
parents: 3313
diff changeset
115 event.response.headers.content_type = "application/javascript";
ab67f222d88b mod_conversejs: Add an endpoint returning only initialization snippet
Kim Alvefur <zash@zash.se>
parents: 3313
diff changeset
116 return js_template:format(json_encode(converse_options));
ab67f222d88b mod_conversejs: Add an endpoint returning only initialization snippet
Kim Alvefur <zash@zash.se>
parents: 3313
diff changeset
117 end;
2657
6f5c99c9f6cc mod_conversejs: Simple demo module for serving converse.js from internal http server
Kim Alvefur <zash@zash.se>
parents:
diff changeset
118 }
6f5c99c9f6cc mod_conversejs: Simple demo module for serving converse.js from internal http server
Kim Alvefur <zash@zash.se>
parents:
diff changeset
119 });
6f5c99c9f6cc mod_conversejs: Simple demo module for serving converse.js from internal http server
Kim Alvefur <zash@zash.se>
parents:
diff changeset
120