Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
titaniumnetwork-dev
GitHub Repository: titaniumnetwork-dev/Ludicrous
Path: blob/main/public/webretro/uauth/uauth.js
1224 views
1
var uauth = {};
2
3
uauth.url = "https://binbashbanana.github.io/webretro/uauth/"; // url to use for uauth. must have cross-domain support, a trailing slash, and cannot be cross-origin isolated.
4
uauth.origins = ["http://localhost:8000", "http://localhost:8001", "https://binbashbanana.github.io"]; // valid origins for the response
5
uauth.selfSrc = document.currentScript.src;
6
uauth.bc = new BroadcastChannel("uauth");
7
uauth.log = function(w, ts) {
8
if (w) console.log("uauth:", w.timestamp, w.timestamp == ts, w.message);
9
}
10
11
// uauth modes: frame, popup, coisolated
12
13
if (!uauth.mode) uauth.mode = crossOriginIsolated ? "coisolated" : "frame";
14
15
uauth.open = function(type, exts, callback) {
16
if (uauth.mode == "frame" || !uauth.mode) {
17
// frame picker mode
18
19
let timestamp = Date.now();
20
let pickerFrame = document.createElement("iframe");
21
pickerFrame.style.display = "none";
22
pickerFrame.crossorigin = "anonymous"; // soon...
23
pickerFrame.src = uauth.url + "?timestamp=" + timestamp + "&type=" + type + "&exts=" + exts.join(",");
24
document.body.appendChild(pickerFrame);
25
26
function messageHandler(e) {
27
if (uauth.origins.includes(e.origin)) uauth.log(e.data.webretro, timestamp);
28
if (uauth.origins.includes(e.origin) && e.data.webretro && e.data.webretro.timestamp == timestamp) {
29
window.removeEventListener("message", messageHandler);
30
pickerFrame.removeAttribute("src");
31
document.body.removeChild(pickerFrame);
32
callback(e.data.webretro);
33
}
34
}
35
36
window.addEventListener("message", messageHandler, false);
37
} else if (uauth.mode == "popup") {
38
// popup picker mode
39
40
let timestamp = Date.now();
41
let pickerWindow = window.open(uauth.url + "popuppicker.html?timestamp=" + timestamp + "&type=" + type + "&exts=" + exts.join(","));
42
43
function messageHandler(e) {
44
if (uauth.origins.includes(e.origin)) uauth.log(e.data.webretro, timestamp);
45
if (uauth.origins.includes(e.origin) && e.data.webretro && e.data.webretro.timestamp == timestamp) {
46
window.removeEventListener("message", messageHandler);
47
pickerWindow.close();
48
callback(e.data.webretro);
49
}
50
}
51
52
window.addEventListener("message", messageHandler, false);
53
} else if (uauth.mode == "coisolated") {
54
// cross-origin isolated picker mode
55
56
let timestamp = Date.now();
57
let pickerWindow = window.open(uauth.url + "isolatedpicker.html?returnurl=" + encodeURIComponent(new URL("receiver.html", uauth.selfSrc).href) + "&timestamp=" + timestamp + "&type=" + type + "&exts=" + exts.join(","));
58
59
function messageHandler(e) {
60
if (uauth.origins.includes(e.data.fwOrigin)) uauth.log(e.data.webretro, timestamp);
61
if (uauth.origins.includes(e.data.fwOrigin) && e.data.webretro && e.data.webretro.timestamp == timestamp) {
62
uauth.bc.removeEventListener("message", messageHandler);
63
callback(e.data.webretro);
64
}
65
}
66
67
uauth.bc.addEventListener("message", messageHandler, false);
68
}
69
};
70
71