@fkn/lib 0.9.62 → 0.9.64
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +35 -0
- package/{account-generation-CVWVhbkh.cjs → account-generation-BiZxPztj.cjs} +1 -1
- package/{account-generation-MjW8usme.js → account-generation-DvRuJDa2.js} +1 -1
- package/{account-storage-D98wfGuJ.js → account-storage-D8CBG1cv.js} +2 -2
- package/{account-storage-a_-uiS1N.cjs → account-storage-DpHBgeX5.cjs} +1 -1
- package/account.cjs +1 -1
- package/account.js +2 -2
- package/{api-C1lxKsM1.js → api-BvJu2X1L.js} +109 -147
- package/api-CrUO33y-.cjs +3 -0
- package/api.cjs +1 -1
- package/api.js +1 -1
- package/broker-frame-B31OXcnH.js +52 -0
- package/broker-frame-CF4-yXtj.cjs +9 -0
- package/broker-frame.cjs +1 -0
- package/broker-frame.d.ts +14 -0
- package/broker-frame.js +2 -0
- package/cloud/fetch.cjs +1 -1
- package/cloud/fetch.js +1 -1
- package/cloud/fs.cjs +1 -1
- package/cloud/fs.js +1 -1
- package/cloud-DcgY8Xfp.cjs +1 -0
- package/{cloud-CjQfUhhD.js → cloud-FW59_g8F.js} +5 -4
- package/cloud.cjs +1 -1
- package/cloud.js +2 -2
- package/dgram.cjs +1 -1
- package/dgram.js +1 -1
- package/dns.cjs +1 -1
- package/dns.js +1 -1
- package/{extension-Ct5qQkQF.js → extension-Chmpunqf.js} +5 -4
- package/extension-I2Ziv2pk.cjs +1 -0
- package/extension.cjs +1 -1
- package/extension.js +1 -1
- package/fs/promises.cjs +1 -1
- package/fs/promises.js +1 -1
- package/{fs-B8V-40ft.cjs → fs-DeyJwJ3w.cjs} +1 -1
- package/{fs-nKDF2pOY.js → fs-Djuaj5pQ.js} +2 -2
- package/fs.cjs +1 -1
- package/fs.js +2 -2
- package/index.cjs +1 -1
- package/index.js +4 -4
- package/net.cjs +1 -1
- package/net.js +1 -1
- package/package.json +6 -1
- package/packages.cjs +1 -1
- package/packages.js +1 -1
- package/{proxy-BJ1hSZgi.js → proxy-C4sYkxB5.js} +10 -9
- package/proxy-jdE5tCwz.cjs +1 -0
- package/rooms.cjs +1 -1
- package/rooms.js +1 -1
- package/storage.cjs +1 -1
- package/storage.js +3 -3
- package/api-D7Sbm8Oj.cjs +0 -3
- package/cloud-B8v_yMtd.cjs +0 -1
- package/extension-C1oub0Dw.cjs +0 -1
- package/proxy-CiIj4vA1.cjs +0 -1
package/README.md
ADDED
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
# @fkn/lib
|
|
2
|
+
|
|
3
|
+
FKN for apps: the account, storage, rooms and packages, and Node's `fs`, `net`, `dgram` and `http` in the browser.
|
|
4
|
+
|
|
5
|
+
## Mount the broker frame from your html
|
|
6
|
+
|
|
7
|
+
The lib reaches FKN through a frame of fkn.app's `/api`, which it mounts once your bundle runs. Mount it from
|
|
8
|
+
your html instead and it loads while the bundle downloads and parses: on slow 4G, FKN Social showed Sign in about
|
|
9
|
+
1.2 s sooner. The lib adopts that frame and treats it as its own.
|
|
10
|
+
|
|
11
|
+
With Vite:
|
|
12
|
+
|
|
13
|
+
```ts
|
|
14
|
+
// vite.config.ts
|
|
15
|
+
import { defineConfig } from 'vite'
|
|
16
|
+
import { brokerFrameScript } from '@fkn/lib/broker-frame'
|
|
17
|
+
|
|
18
|
+
export default defineConfig({
|
|
19
|
+
plugins: [
|
|
20
|
+
{
|
|
21
|
+
name: 'fkn-broker-frame',
|
|
22
|
+
transformIndexHtml: () => [{ tag: 'script', children: brokerFrameScript, injectTo: 'body-prepend' }],
|
|
23
|
+
},
|
|
24
|
+
],
|
|
25
|
+
})
|
|
26
|
+
```
|
|
27
|
+
|
|
28
|
+
With anything else, write `<script>${brokerFrameScript}</script>` as the first thing in `<body>` at build time, from
|
|
29
|
+
the installed version.
|
|
30
|
+
|
|
31
|
+
- In a framed page, the script mounts nothing: inside fkn.app the lib uses fkn.app's own broker.
|
|
32
|
+
- Use the script, not a hand-written iframe of fkn.app's `/api`, which loads a second broker inside fkn.app
|
|
33
|
+
and misses the frame's `allow` list.
|
|
34
|
+
- A `Content-Security-Policy` that blocks inline scripts needs the script's hash in `script-src`. Without it, the lib
|
|
35
|
+
mounts the frame itself, as before.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
const e=require("./api-
|
|
1
|
+
const e=require("./api-CrUO33y-.cjs");var t=0,n=new Set,r=2e3,i=null,a=e=>{let r=e?.switched!==!1;r&&(t+=1,i&&=(clearTimeout(i.timer),null));for(let e of[...n])try{e({switched:r})}catch{}},o=!1,s=0,c=()=>{let t=e.c();t&&s!==t.epoch&&(s=t.epoch,Promise.resolve(t.remote.account.onChange(a)).catch(()=>{s===t.epoch&&(s=0)}))},l=()=>{!o&&e.l&&(o=!0,e.u(c))},u=()=>t,d=e=>(n.add(e),l(),()=>{n.delete(e)}),f=e=>{if(e!==t||i?.generation===e)return;let n=setTimeout(()=>{i?.timer===n&&(i=null,t===e&&a({switched:!0}))},r);i={generation:e,timer:n}};Object.defineProperty(exports,"i",{enumerable:!0,get:function(){return d}}),Object.defineProperty(exports,"n",{enumerable:!0,get:function(){return l}}),Object.defineProperty(exports,"r",{enumerable:!0,get:function(){return f}}),Object.defineProperty(exports,"t",{enumerable:!0,get:function(){return u}});
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { t as e } from "./rolldown-runtime-Dy4uBu1J.js";
|
|
2
|
-
import { o as t } from "./api-
|
|
2
|
+
import { o as t } from "./api-BvJu2X1L.js";
|
|
3
3
|
import { STORAGE_ACCOUNT_CHANGED as n, STORAGE_ACCOUNT_PIN_UNSUPPORTED as r, STORAGE_NOT_FOUND as i } from "./messages.js";
|
|
4
|
-
import { n as a, r as o, t as s } from "./account-generation-
|
|
4
|
+
import { n as a, r as o, t as s } from "./account-generation-DvRuJDa2.js";
|
|
5
5
|
//#region src/account-storage.ts
|
|
6
6
|
var c = /* @__PURE__ */ e({
|
|
7
7
|
StorageAccountChangedError: () => f,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
const e=require("./rolldown-runtime-BIInC43l.cjs"),t=require("./api-
|
|
1
|
+
const e=require("./rolldown-runtime-BIInC43l.cjs"),t=require("./api-CrUO33y-.cjs"),n=require("./messages.cjs"),r=require("./account-generation-BiZxPztj.cjs");var i=e.t({StorageAccountChangedError:()=>c,StorageAccountPinUnsupportedError:()=>l,StorageLockedError:()=>a,StorageNotFoundError:()=>o,availability:()=>k,available:()=>w,captureAccount:()=>p,encryption:()=>L,isAccountChanged:()=>u,isInvalidPin:()=>d,isNotFound:()=>s,knownPin:()=>y,list:()=>A,pinFor:()=>b,quota:()=>j,readFile:()=>M,readFileSealed:()=>P,remove:()=>I,unlock:()=>R,writeFile:()=>F}),a=class extends Error{code=`FKN_E2E_LOCKED`;constructor(){super(`storage locked: connect the app again to open encrypted data`)}},o=class extends Error{code=n.STORAGE_NOT_FOUND;constructor(e=`storage: no object at that path`){super(e)}},s=e=>e?.code===n.STORAGE_NOT_FOUND,c=class extends Error{code=n.STORAGE_ACCOUNT_CHANGED;constructor(e=`storage: the signed-in account changed, so this call was not made`){super(e)}},l=class extends Error{code=n.STORAGE_ACCOUNT_PIN_UNSUPPORTED;constructor(e=`storage: the FKN broker cannot pin calls to an account yet, so nothing was sent`){super(e)}},u=e=>e?.code===`FKN_ACCOUNT_CHANGED`||e instanceof Error&&e.message.startsWith(`fkn:account-changed`),d=e=>e instanceof Error&&e.message.startsWith(`fkn:account-pin-invalid`),f=e=>{throw e instanceof Error&&e.message.startsWith(`fkn:e2e-locked`)?new a:s(e)?new o(e.message):u(e)?new c:e instanceof Error&&e.message.startsWith(`fkn:account-pin-unsupported`)?new l:e instanceof Error&&(/^not found$/i.test(e.message)||/\(404\)$/.test(e.message))?new o(e.message):e},p=()=>(r.n(),{generation:r.t()}),m=new Map,h=null,g=e=>typeof e?.accountPin==`function`,_=(e,t)=>{let n=Promise.resolve(t.accountPin()).then(t=>{if(typeof t!=`string`||!t)throw Error(`storage: the broker answered no account pin`);return r.t()===e&&m.set(e,t),t});return h={generation:e,pin:n},n.catch(()=>{h?.pin===n&&(h=null)}),n},v=async(e,t)=>{let n=m.get(e.generation);if(n!==void 0)return n;if(e.generation!==r.t())throw new c;let i=await(h?.generation===e.generation?h.pin:_(e.generation,t)).catch(f);if(e.generation!==r.t())throw new c;return i},y=e=>m.get(e.generation),b=async e=>{let n=(await t.o).cloud.fs;if(!g(n))throw new l;return v(e,n)},x=e=>{for(let[t,n]of m)if(n===e)return t},S=e=>e?.pin??p(),C=async(e,n)=>{let i=(await t.o).cloud.fs;if(!g(i))throw new l;let a=`pin`in e?e.pin:await v(e,i);if(!g(i))throw new l;return n(i,{accountPin:a}).catch(t=>{if(u(t)){let t=`generation`in e?e.generation:x(a);t!==void 0&&r.r(t)}return f(t)})},w=()=>t.o.then(e=>e.cloud.fs.available()).catch(()=>!1),T=8e3,E=1e3,D=!1,O=async()=>{let e=(await t.o).cloud.fs;return typeof e.availability==`function`?e.availability():await e.available()?`connected`:`disconnected`},k=async()=>{let e=D?E:T,t=await new Promise(t=>{let n=setTimeout(()=>t(`timeout`),e);O().then(e=>{clearTimeout(n),t(e)},()=>{clearTimeout(n),t(`unknown`)})});return t===`timeout`?(D=!0,`unknown`):(D=!1,t)},A=e=>C(S(e),(e,t)=>e.list(t)),j=()=>t.o.then(e=>e.cloud.fs.quota()),M=async(e,t)=>{let n=await C(S(t),(t,n)=>t.readFile(e,n));return new Blob([n])},N=e=>{if(e===null||!Number.isFinite(e))return null;let t=new Date(e);return Number.isNaN(t.getTime())?null:t.toISOString()},P=async(e,t)=>C(S(t),async(t,n)=>{let r=t;if(typeof r.readFileSealed!=`function`)return{data:await t.readFile(e,n),sealedAt:null};let i=await r.readFileSealed(e,n);return{data:i.bytes,sealedAt:N(i.sealedAt)}}),F=async(e,t,n)=>{let r=S(n),i=t instanceof Blob?new Uint8Array(await t.arrayBuffer()):t;await C(r,(t,r)=>t.writeFile(e,i,n?.contentType??null,r))},I=async(e,t)=>{await C(S(t),(t,n)=>t.remove(e,n))},L=()=>t.o.then(e=>e.cloud.fs.encryption()),R=()=>t.o.then(e=>e.cloud.fs.unlock());Object.defineProperty(exports,"_",{enumerable:!0,get:function(){return P}}),Object.defineProperty(exports,"a",{enumerable:!0,get:function(){return i}}),Object.defineProperty(exports,"b",{enumerable:!0,get:function(){return F}}),Object.defineProperty(exports,"c",{enumerable:!0,get:function(){return L}}),Object.defineProperty(exports,"d",{enumerable:!0,get:function(){return s}}),Object.defineProperty(exports,"f",{enumerable:!0,get:function(){return y}}),Object.defineProperty(exports,"g",{enumerable:!0,get:function(){return M}}),Object.defineProperty(exports,"h",{enumerable:!0,get:function(){return j}}),Object.defineProperty(exports,"i",{enumerable:!0,get:function(){return o}}),Object.defineProperty(exports,"l",{enumerable:!0,get:function(){return u}}),Object.defineProperty(exports,"m",{enumerable:!0,get:function(){return b}}),Object.defineProperty(exports,"n",{enumerable:!0,get:function(){return l}}),Object.defineProperty(exports,"o",{enumerable:!0,get:function(){return k}}),Object.defineProperty(exports,"p",{enumerable:!0,get:function(){return A}}),Object.defineProperty(exports,"r",{enumerable:!0,get:function(){return a}}),Object.defineProperty(exports,"s",{enumerable:!0,get:function(){return p}}),Object.defineProperty(exports,"t",{enumerable:!0,get:function(){return c}}),Object.defineProperty(exports,"u",{enumerable:!0,get:function(){return d}}),Object.defineProperty(exports,"v",{enumerable:!0,get:function(){return I}}),Object.defineProperty(exports,"y",{enumerable:!0,get:function(){return R}});
|
package/account.cjs
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
Object.defineProperty(exports,Symbol.toStringTag,{value:`Module`});const e=require("./rolldown-runtime-BIInC43l.cjs"),t=require("./api-
|
|
1
|
+
Object.defineProperty(exports,Symbol.toStringTag,{value:`Module`});const e=require("./rolldown-runtime-BIInC43l.cjs"),t=require("./api-CrUO33y-.cjs"),n=require("./account-generation-BiZxPztj.cjs");var r=e.t({info:()=>o,login:()=>i,logout:()=>a,onChange:()=>s}),i=async()=>typeof window>`u`?!1:(await t.o).account.login(location.origin).catch(()=>!1),a=async()=>{typeof window<`u`&&await(await t.o).account.logout().catch(()=>{})},o=async()=>{if(typeof window>`u`)return null;let e=await t.o.then(e=>e.account.info()).catch(()=>null);return e?{name:e.name,image:e.image,premium:e.premium,premiumUntil:e.premiumUntil?Date.parse(e.premiumUntil):null}:null},s=async e=>t.l?n.i(e):()=>{};exports.info=o,exports.login=i,exports.logout=a,exports.onChange=s,Object.defineProperty(exports,"t",{enumerable:!0,get:function(){return r}});
|
package/account.js
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { t as e } from "./rolldown-runtime-Dy4uBu1J.js";
|
|
2
|
-
import { l as t, o as n } from "./api-
|
|
3
|
-
import { i as r } from "./account-generation-
|
|
2
|
+
import { l as t, o as n } from "./api-BvJu2X1L.js";
|
|
3
|
+
import { i as r } from "./account-generation-DvRuJDa2.js";
|
|
4
4
|
//#region src/account.ts
|
|
5
5
|
var i = /* @__PURE__ */ e({
|
|
6
6
|
info: () => s,
|
|
@@ -1,6 +1,7 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { i as e, n as t } from "./broker-frame-B31OXcnH.js";
|
|
2
|
+
import { checkOsraMessageKey as n, expose as r } from "osra";
|
|
2
3
|
//#region src/frame-ready.ts
|
|
3
|
-
var
|
|
4
|
+
var i = 1e4, a = 16, o = (e) => {
|
|
4
5
|
let t;
|
|
5
6
|
try {
|
|
6
7
|
t = e.contentWindow;
|
|
@@ -14,57 +15,58 @@ var n = 1e4, r = 16, i = (e) => {
|
|
|
14
15
|
} catch {
|
|
15
16
|
return !0;
|
|
16
17
|
}
|
|
17
|
-
},
|
|
18
|
-
if (
|
|
19
|
-
let
|
|
20
|
-
clearInterval(
|
|
21
|
-
},
|
|
22
|
-
|
|
23
|
-
},
|
|
24
|
-
e.addEventListener("load",
|
|
25
|
-
}),
|
|
26
|
-
let r = 1, a,
|
|
27
|
-
clearTimeout(a),
|
|
28
|
-
},
|
|
29
|
-
|
|
30
|
-
if (
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
},
|
|
36
|
-
t.source === e.contentWindow && t.origin === n &&
|
|
18
|
+
}, s = (e, t = i) => new Promise((n) => {
|
|
19
|
+
if (o(e)) return n();
|
|
20
|
+
let r = () => {
|
|
21
|
+
clearInterval(i), clearTimeout(s), e.removeEventListener("load", r), n();
|
|
22
|
+
}, i = setInterval(() => {
|
|
23
|
+
o(e) && r();
|
|
24
|
+
}, a), s = setTimeout(r, t);
|
|
25
|
+
e.addEventListener("load", r);
|
|
26
|
+
}), c = 5e3, l = 9e4, u = (e, t, n) => {
|
|
27
|
+
let r = 1, a, s = e.ownerDocument.defaultView, u = () => {
|
|
28
|
+
clearTimeout(a), s?.removeEventListener("message", m), e.removeEventListener("load", p);
|
|
29
|
+
}, d = () => {
|
|
30
|
+
if (e.isConnected) {
|
|
31
|
+
if (r >= 4) return u(), console.error(`FKN @fkn/lib: ${t} did not load in ${r} tries; reload the page`);
|
|
32
|
+
r += 1, e.contentWindow?.location.replace(t), f(l);
|
|
33
|
+
}
|
|
34
|
+
}, f = (e) => {
|
|
35
|
+
clearTimeout(a), a = setTimeout(d, e);
|
|
36
|
+
}, p = () => f(c), m = (t) => {
|
|
37
|
+
t.source === e.contentWindow && t.origin === n && u();
|
|
37
38
|
};
|
|
38
|
-
|
|
39
|
-
|
|
39
|
+
if (s?.addEventListener("message", m), e.addEventListener("load", p), o(e)) return f(c);
|
|
40
|
+
a = setTimeout(() => o(e) ? f(8e4) : d(), i);
|
|
41
|
+
}, d = 32, f = 8, p = 120, m = typeof CSS < "u" && CSS.supports("clip-path", "path('M0 0H1V1H0Z')"), h = typeof CSS < "u" && CSS.supports("clip-path", "polygon(nonzero, 0px 0px, 1px 0px, 1px 1px)"), g = "light dark", ee = (e) => {
|
|
40
42
|
let t = e.style;
|
|
41
|
-
t.setProperty("display", "block", "important"), t.setProperty("position", "fixed", "important"), t.setProperty("top", "0", "important"), t.setProperty("left", "0", "important"), t.setProperty("width", "100%", "important"), t.setProperty("height", "100%", "important"), t.setProperty("border", "none", "important"), t.setProperty("padding", "0", "important"), t.setProperty("box-sizing", "border-box", "important"), t.setProperty("clip-path", "inset(100%)", "important"), t.setProperty("background", "transparent"), t.setProperty("color-scheme",
|
|
42
|
-
},
|
|
43
|
+
t.setProperty("display", "block", "important"), t.setProperty("position", "fixed", "important"), t.setProperty("top", "0", "important"), t.setProperty("left", "0", "important"), t.setProperty("width", "100%", "important"), t.setProperty("height", "100%", "important"), t.setProperty("border", "none", "important"), t.setProperty("padding", "0", "important"), t.setProperty("box-sizing", "border-box", "important"), t.setProperty("clip-path", "inset(100%)", "important"), t.setProperty("background", "transparent"), t.setProperty("color-scheme", g), t.setProperty("z-index", "2147483647"), e.setAttribute("title", "FKN");
|
|
44
|
+
}, te = ({ x: e, y: t, width: n, height: r, radius: i }) => {
|
|
43
45
|
if (!i) return `M${e} ${t}h${n}v${r}h${-n}Z`;
|
|
44
46
|
let a = Math.min(n, r) / 2, [o, s, c, l] = i.map((e) => Math.max(0, Math.min(e, a)));
|
|
45
47
|
return `M${e + o} ${t}h${n - o - s}a${s} ${s} 0 0 1 ${s} ${s}v${r - s - c}a${c} ${c} 0 0 1 ${-c} ${c}h${-(n - c - l)}a${l} ${l} 0 0 1 ${-l} ${-l}v${-(r - l - o)}a${o} ${o} 0 0 1 ${o} ${-o}Z`;
|
|
46
|
-
},
|
|
48
|
+
}, ne = () => m && h, _ = ({ x: e, y: t, width: n, height: r }) => [
|
|
47
49
|
[e, t],
|
|
48
50
|
[e + n, t],
|
|
49
51
|
[e + n, t + r],
|
|
50
52
|
[e, t + r],
|
|
51
53
|
[e, t]
|
|
52
|
-
],
|
|
54
|
+
], re = (e) => {
|
|
53
55
|
let t = e[0];
|
|
54
56
|
if (!t) return [];
|
|
55
57
|
let n = _(t)[0], r = [];
|
|
56
58
|
return e.forEach((t, i) => {
|
|
57
59
|
r.push(..._(t)), i > 0 && i < e.length - 1 && r.push(n);
|
|
58
60
|
}), r;
|
|
59
|
-
},
|
|
61
|
+
}, ie = (e) => `polygon(nonzero, ${re(e).map(([e, t]) => `${e}px ${t}px`).join(", ")})`, ae = ({ x: e, y: t, width: n, height: r, radius: i }, a) => {
|
|
60
62
|
let o = `${t}px ${a.width - e - n}px ${a.height - t - r}px ${e}px`;
|
|
61
63
|
return i ? `inset(${o} round ${i.map((e) => `${e}px`).join(" ")})` : `inset(${o})`;
|
|
62
|
-
},
|
|
64
|
+
}, oe = (e, t, n) => {
|
|
63
65
|
if (t) return "none";
|
|
64
66
|
if (e.length === 0) return "inset(100%)";
|
|
65
67
|
let r = e.length === 1 ? e[0] : void 0;
|
|
66
|
-
return r ?
|
|
67
|
-
},
|
|
68
|
+
return r ? ae(r, n) : h && e.length <= 5 && !e.some((e) => e.radius) ? ie(e) : `path('${e.map(te).join("")}')`;
|
|
69
|
+
}, se = (e) => {
|
|
68
70
|
if (e.length < 2) return null;
|
|
69
71
|
let t = Math.min(...e.map((e) => e.x)), n = Math.min(...e.map((e) => e.y));
|
|
70
72
|
return {
|
|
@@ -73,51 +75,51 @@ var n = 1e4, r = 16, i = (e) => {
|
|
|
73
75
|
width: Math.max(...e.map((e) => e.x + e.width)) - t,
|
|
74
76
|
height: Math.max(...e.map((e) => e.y + e.height)) - n
|
|
75
77
|
};
|
|
76
|
-
},
|
|
78
|
+
}, ce = (e, t, n) => t >= e.x && t < e.x + e.width && n >= e.y && n < e.y + e.height, le = 16, v = (e, t, n) => t === 1 ? e * le : t === 2 ? e * n : e, ue = (e, t, n) => {
|
|
77
79
|
let r = getComputedStyle(e);
|
|
78
80
|
return n !== 0 && /auto|scroll/.test(r.overflowY) && e.scrollHeight > e.clientHeight ? !0 : t !== 0 && /auto|scroll/.test(r.overflowX) && e.scrollWidth > e.clientWidth;
|
|
79
|
-
},
|
|
80
|
-
for (let r = e; r; r = r.parentElement) if (
|
|
81
|
+
}, de = (e, t, n) => {
|
|
82
|
+
for (let r = e; r; r = r.parentElement) if (ue(r, t, n)) return r;
|
|
81
83
|
return document.scrollingElement;
|
|
82
84
|
}, y = null, b = null, x = (e) => ({
|
|
83
85
|
width: e.offsetWidth || window.innerWidth,
|
|
84
86
|
height: e.offsetHeight || window.innerHeight
|
|
85
87
|
}), S = (e) => {
|
|
86
|
-
if (!b || !y || !
|
|
88
|
+
if (!b || !y || !ce(b, e.clientX, e.clientY)) return;
|
|
87
89
|
let t = document.elementFromPoint(e.clientX, e.clientY);
|
|
88
90
|
if (!t || t === y) return;
|
|
89
|
-
let n = v(e.deltaX, e.deltaMode, window.innerWidth), r = v(e.deltaY, e.deltaMode, window.innerHeight), i =
|
|
91
|
+
let n = v(e.deltaX, e.deltaMode, window.innerWidth), r = v(e.deltaY, e.deltaMode, window.innerHeight), i = de(t, n, r);
|
|
90
92
|
i && (i.scrollBy({
|
|
91
93
|
left: n,
|
|
92
94
|
top: r,
|
|
93
95
|
behavior: "instant"
|
|
94
96
|
}), e.cancelable && e.preventDefault());
|
|
95
|
-
},
|
|
97
|
+
}, fe = (e) => {
|
|
96
98
|
let t = b !== null;
|
|
97
99
|
b = e, t !== (e !== null) && (e ? window.addEventListener("wheel", S, {
|
|
98
100
|
capture: !0,
|
|
99
101
|
passive: !1
|
|
100
102
|
}) : window.removeEventListener("wheel", S, { capture: !0 }));
|
|
101
|
-
}, C = 0,
|
|
103
|
+
}, C = 0, pe = (e) => {
|
|
102
104
|
if (e === C) return;
|
|
103
105
|
C = e;
|
|
104
106
|
let t = document.documentElement.style;
|
|
105
107
|
e > 0 ? (t.setProperty("margin-top", `${e}px`, "important"), t.setProperty("--fkn-inset-top", `${e}px`)) : (t.removeProperty("margin-top"), t.removeProperty("--fkn-inset-top"));
|
|
106
108
|
}, w = (e, { modal: t, rects: n, inset: r }, i) => {
|
|
107
|
-
if (
|
|
109
|
+
if (pe(r), !m) {
|
|
108
110
|
let r = t || n.length > 0;
|
|
109
111
|
e.style.setProperty("pointer-events", r ? "auto" : "none", "important"), e.style.setProperty("visibility", r ? "visible" : "hidden", "important");
|
|
110
112
|
return;
|
|
111
113
|
}
|
|
112
|
-
let a =
|
|
113
|
-
e.style.setProperty("clip-path", o, "important"),
|
|
114
|
-
},
|
|
114
|
+
let a = oe(n, t, i), o = a === "none" || CSS.supports("clip-path", a) ? a : "inset(100%)";
|
|
115
|
+
e.style.setProperty("clip-path", o, "important"), fe(t || o !== a ? null : se(n));
|
|
116
|
+
}, me = (e) => {
|
|
115
117
|
if (typeof e != "object" || !e) return 0;
|
|
116
118
|
let { top: t } = e;
|
|
117
|
-
return typeof t != "number" || !Number.isFinite(t) || t <= 0 ? 0 : Math.min(Math.round(t),
|
|
118
|
-
},
|
|
119
|
+
return typeof t != "number" || !Number.isFinite(t) || t <= 0 ? 0 : Math.min(Math.round(t), p);
|
|
120
|
+
}, he = (e) => {
|
|
119
121
|
if (Array.isArray(e) && e.length === 4 && e.every((e) => typeof e == "number" && Number.isFinite(e) && e >= 0)) return e.some((e) => e > 0) ? e : void 0;
|
|
120
|
-
},
|
|
122
|
+
}, T = (e, t) => {
|
|
121
123
|
if (typeof e != "object" || !e) return null;
|
|
122
124
|
let { x: n, y: r, width: i, height: a } = e;
|
|
123
125
|
if (![
|
|
@@ -126,7 +128,7 @@ var n = 1e4, r = 16, i = (e) => {
|
|
|
126
128
|
i,
|
|
127
129
|
a
|
|
128
130
|
].every((e) => typeof e == "number" && Number.isFinite(e))) return null;
|
|
129
|
-
let o = t.width, s = t.height, c = Math.max(0, Math.min(Math.round(n), o)), l = Math.max(0, Math.min(Math.round(r), s)), u = Math.max(c, Math.min(Math.round(n + i), o)), d = Math.max(l, Math.min(Math.round(r + a), s)), f =
|
|
131
|
+
let o = t.width, s = t.height, c = Math.max(0, Math.min(Math.round(n), o)), l = Math.max(0, Math.min(Math.round(r), s)), u = Math.max(c, Math.min(Math.round(n + i), o)), d = Math.max(l, Math.min(Math.round(r + a), s)), f = he(e.radius);
|
|
130
132
|
return {
|
|
131
133
|
x: c,
|
|
132
134
|
y: l,
|
|
@@ -134,89 +136,49 @@ var n = 1e4, r = 16, i = (e) => {
|
|
|
134
136
|
height: d - l,
|
|
135
137
|
...f ? { radius: f } : {}
|
|
136
138
|
};
|
|
137
|
-
},
|
|
139
|
+
}, E = {
|
|
138
140
|
"not-rendered": "this page is not painting it at all, so it or an ancestor is display:none, or the frame was moved out of the layout",
|
|
139
141
|
clipped: "it is clipped away or positioned outside the viewport",
|
|
140
142
|
"not-shown": "it is rendered but would not be seen, so either something is drawn over it, or it or an ancestor has opacity below 1, visibility:hidden, or a filter"
|
|
141
|
-
},
|
|
143
|
+
}, ge = (e) => Array.isArray(e) ? e.slice(0, f).flatMap((e) => {
|
|
142
144
|
if (typeof e != "object" || !e) return [];
|
|
143
145
|
let { kind: t, cause: n, level: r } = e;
|
|
144
|
-
return typeof t != "string" || t.length > 40 || typeof n != "string" || !(n in
|
|
146
|
+
return typeof t != "string" || t.length > 40 || typeof n != "string" || !(n in E) || r !== "full" && r !== "liveness" ? [] : [{
|
|
145
147
|
kind: t,
|
|
146
148
|
cause: n,
|
|
147
149
|
level: r
|
|
148
150
|
}];
|
|
149
|
-
}) : [],
|
|
150
|
-
for (let { kind: t, cause: n, level: r } of e)
|
|
151
|
+
}) : [], D = /* @__PURE__ */ new Set(), _e = (e) => {
|
|
152
|
+
for (let { kind: t, cause: n, level: r } of e) D.has(t) || (D.add(t), console.error(`[FKN] The FKN ${JSON.stringify(t)} is not visible on this page: ${E[n]}. Nobody using this page can see or answer it.
|
|
151
153
|
@fkn/lib draws its UI inside <iframe title="FKN"> and sets display, position, top, left, width, height, border, padding, box-sizing, clip-path and z-index on that element. Leave those as they are, then check for an ancestor with opacity, visibility, display or a clipping transform, and for an element stacked above it.` + (r === "liveness" ? "\nThis browser reports limited detail, so the cause above is a best guess." : "")));
|
|
152
|
-
},
|
|
154
|
+
}, O = (e, t) => {
|
|
153
155
|
if (typeof e != "object" || !e) return null;
|
|
154
|
-
let n = e, r = (Array.isArray(n.rects) ? n.rects.slice(0,
|
|
156
|
+
let n = e, r = (Array.isArray(n.rects) ? n.rects.slice(0, d) : []).map((e) => T(e, t)).filter((e) => e !== null && e.width > 0 && e.height > 0);
|
|
155
157
|
return {
|
|
156
158
|
modal: n.modal === !0,
|
|
157
159
|
rects: r,
|
|
158
|
-
hidden:
|
|
159
|
-
inset:
|
|
160
|
+
hidden: ge(n.hidden),
|
|
161
|
+
inset: me(n.inset)
|
|
160
162
|
};
|
|
161
|
-
},
|
|
162
|
-
if (!y ||
|
|
163
|
-
let e = x(y), t =
|
|
163
|
+
}, ve = () => y !== null, k = null, A = null, ye = () => {
|
|
164
|
+
if (!y || k === null) return;
|
|
165
|
+
let e = x(y), t = O(k, e);
|
|
164
166
|
t && w(y, t, e);
|
|
165
|
-
}, ye = (e) => {
|
|
166
|
-
typeof ResizeObserver < "u" && (k ??= new ResizeObserver(ve), k.disconnect(), k.observe(e));
|
|
167
167
|
}, be = (e) => {
|
|
168
|
-
|
|
168
|
+
typeof ResizeObserver < "u" && (A ??= new ResizeObserver(ye), A.disconnect(), A.observe(e));
|
|
169
|
+
}, xe = (e) => {
|
|
170
|
+
ee(e), w(e, {
|
|
169
171
|
modal: !1,
|
|
170
172
|
rects: [],
|
|
171
173
|
hidden: [],
|
|
172
174
|
inset: 0
|
|
173
|
-
}, x(e)), y = e,
|
|
174
|
-
},
|
|
175
|
+
}, x(e)), y = e, be(e);
|
|
176
|
+
}, Se = (e) => {
|
|
175
177
|
if (!y) return;
|
|
176
|
-
let t = x(y), n =
|
|
177
|
-
n && (
|
|
178
|
-
},
|
|
179
|
-
|
|
180
|
-
try {
|
|
181
|
-
t = new URL(`http://${e.includes(":") && !e.startsWith("[") ? `[${e}]` : e}/`).hostname;
|
|
182
|
-
} catch {
|
|
183
|
-
return;
|
|
184
|
-
}
|
|
185
|
-
let n = /^\[(?:::ffff:|64:ff9b::)([0-9a-f]{1,4}):([0-9a-f]{1,4})\]$/.exec(t);
|
|
186
|
-
if (n) {
|
|
187
|
-
let e = parseInt(n[1], 16), t = parseInt(n[2], 16);
|
|
188
|
-
return [
|
|
189
|
-
e >> 8,
|
|
190
|
-
e & 255,
|
|
191
|
-
t >> 8,
|
|
192
|
-
t & 255
|
|
193
|
-
].join(".");
|
|
194
|
-
}
|
|
195
|
-
return /^\d+\.\d+\.\d+\.\d+$/.test(t) ? t : void 0;
|
|
196
|
-
}, Te = (e) => {
|
|
197
|
-
let t = A(e);
|
|
198
|
-
return Se.some((e) => t === e || t.endsWith(`.${e}`));
|
|
199
|
-
}, Ee = (e) => {
|
|
200
|
-
if (Te(e)) return !0;
|
|
201
|
-
let t = we(A(e));
|
|
202
|
-
return t !== void 0 && Ce.includes(t);
|
|
203
|
-
}, De = (e) => {
|
|
204
|
-
let t = typeof e == "string" ? e : e instanceof URL ? e.href : e.url, n;
|
|
205
|
-
try {
|
|
206
|
-
n = new URL(t);
|
|
207
|
-
} catch {
|
|
208
|
-
return;
|
|
209
|
-
}
|
|
210
|
-
if (Ee(n.hostname)) throw Error(`fetch refuses FKN platform domains (${n.hostname})`);
|
|
211
|
-
}, Oe = /* @__PURE__ */ "autoplay.fullscreen.picture-in-picture.encrypted-media.screen-wake-lock.speaker-selection.captured-surface-control.camera.microphone.display-capture.geolocation.midi.usb.serial.hid.bluetooth.gamepad.keyboard-map.xr-spatial-tracking.accelerometer.gyroscope.magnetometer.ambient-light-sensor.compute-pressure.clipboard-read.clipboard-write.storage-access.window-management.local-fonts.idle-detection.web-share.sync-xhr.unload.payment.publickey-credentials-get.publickey-credentials-create.otp-credentials.identity-credentials-get.digital-credentials-get.local-network.local-network-access.loopback-network".split("."), ke = () => {
|
|
212
|
-
try {
|
|
213
|
-
let e = globalThis.document?.featurePolicy?.features?.();
|
|
214
|
-
return e === void 0 ? void 0 : new Set(e);
|
|
215
|
-
} catch {
|
|
216
|
-
return;
|
|
217
|
-
}
|
|
218
|
-
}, j = (e = !0, t = ke()) => [...Oe, ...e ? ["cross-origin-isolated"] : []].filter((e) => t === void 0 || t.has(e)).join("; "), M = "https://fkn.app", N = typeof globalThis < "u" && globalThis.document ? globalThis.document : void 0, P = typeof globalThis < "u" && globalThis.crossOriginIsolated === !0, F = `${M}/api${P ? "?coi=1" : ""}`, Ae = "fkn-api-port", je = "fkn-api-port-ack", Me = 2e3, Ne = () => {
|
|
219
|
-
if (!N || typeof window > "u" || window.parent === window) return Promise.resolve(void 0);
|
|
178
|
+
let t = x(y), n = O(e, t);
|
|
179
|
+
n && (k = e, w(y, n, t), _e(n.hidden));
|
|
180
|
+
}, j = "https://fkn.app", M = typeof globalThis < "u" && globalThis.document ? globalThis.document : void 0, N = typeof globalThis < "u" && globalThis.crossOriginIsolated === !0, P = t(N), Ce = "fkn-api-port", we = "fkn-api-port-ack", Te = 2e3, Ee = () => {
|
|
181
|
+
if (!M || typeof window > "u" || window.parent === window) return Promise.resolve(void 0);
|
|
220
182
|
let e;
|
|
221
183
|
try {
|
|
222
184
|
e = window.parent;
|
|
@@ -231,40 +193,40 @@ var n = 1e4, r = 16, i = (e) => {
|
|
|
231
193
|
} catch {}
|
|
232
194
|
n(e);
|
|
233
195
|
}, i = (e) => {
|
|
234
|
-
e.data?.type ===
|
|
235
|
-
}, a = setTimeout(() => r(void 0),
|
|
196
|
+
e.data?.type === we && r(t.port1);
|
|
197
|
+
}, a = setTimeout(() => r(void 0), Te);
|
|
236
198
|
t.port1.addEventListener("message", i), t.port1.start();
|
|
237
199
|
try {
|
|
238
|
-
e.postMessage({ type:
|
|
200
|
+
e.postMessage({ type: Ce }, j, [t.port2]);
|
|
239
201
|
} catch {
|
|
240
202
|
r(void 0);
|
|
241
203
|
}
|
|
242
204
|
});
|
|
243
|
-
},
|
|
244
|
-
if (
|
|
245
|
-
let
|
|
246
|
-
if (
|
|
205
|
+
}, F, I = () => {
|
|
206
|
+
if (F || !M) return F;
|
|
207
|
+
let t = M.querySelector(`iframe[src="${P}"]`);
|
|
208
|
+
if (t) F = t;
|
|
247
209
|
else {
|
|
248
|
-
let
|
|
249
|
-
|
|
210
|
+
let t = M.createElement("iframe");
|
|
211
|
+
t.setAttribute("allow", e(N)), t.src = P, M.body.appendChild(t), F = t;
|
|
250
212
|
}
|
|
251
|
-
return
|
|
213
|
+
return u(F, P, j), xe(F), F;
|
|
252
214
|
}, L = (async () => {
|
|
253
|
-
if (!
|
|
254
|
-
let e = await
|
|
215
|
+
if (!M) return;
|
|
216
|
+
let e = await Ee();
|
|
255
217
|
if (e) return {
|
|
256
218
|
receive: e,
|
|
257
219
|
emit: e
|
|
258
220
|
};
|
|
259
|
-
let t =
|
|
221
|
+
let t = I();
|
|
260
222
|
if (!t) return;
|
|
261
|
-
await
|
|
223
|
+
await s(t);
|
|
262
224
|
let n = t.contentWindow;
|
|
263
225
|
return n ? {
|
|
264
226
|
receive: window,
|
|
265
227
|
emit: n
|
|
266
228
|
} : void 0;
|
|
267
|
-
})(),
|
|
229
|
+
})(), De = (e, { boundRetired: t = (e) => e } = {}) => {
|
|
268
230
|
let n, r = 0, i = !1, a = () => {}, o = () => new Promise((e) => {
|
|
269
231
|
a = e;
|
|
270
232
|
}), s = o(), c = s, l = /* @__PURE__ */ new Set(), u = /* @__PURE__ */ new Set(), d = 0, f = 0, p = () => {
|
|
@@ -340,7 +302,7 @@ var n = 1e4, r = 16, i = (e) => {
|
|
|
340
302
|
i = !0, n = void 0, p();
|
|
341
303
|
}
|
|
342
304
|
};
|
|
343
|
-
}, R = !1, z = /* @__PURE__ */ new Set(), B = () => R,
|
|
305
|
+
}, R = !1, z = /* @__PURE__ */ new Set(), B = () => R, Oe = () => {
|
|
344
306
|
if (!R) {
|
|
345
307
|
R = !0;
|
|
346
308
|
for (let e of [...z]) try {
|
|
@@ -350,43 +312,43 @@ var n = 1e4, r = 16, i = (e) => {
|
|
|
350
312
|
}
|
|
351
313
|
}, V = (e) => {
|
|
352
314
|
R ? e() : z.add(e);
|
|
353
|
-
},
|
|
315
|
+
}, ke = typeof window < "u" || typeof self < "u", H = async () => {
|
|
354
316
|
if (typeof window < "u") return L;
|
|
355
317
|
if (typeof self < "u") return {
|
|
356
318
|
receive: self,
|
|
357
319
|
emit: self
|
|
358
320
|
};
|
|
359
|
-
}, U = "fkn-api",
|
|
321
|
+
}, U = "fkn-api", Ae = "fkn-api-window", je = { async *[Symbol.asyncIterator]() {
|
|
360
322
|
let e = await H();
|
|
361
323
|
if (!e) {
|
|
362
324
|
await new Promise(() => {});
|
|
363
325
|
return;
|
|
364
326
|
}
|
|
365
327
|
if (!B()) {
|
|
366
|
-
let
|
|
367
|
-
V(() =>
|
|
368
|
-
for await (let
|
|
328
|
+
let t = new AbortController();
|
|
329
|
+
V(() => t.abort());
|
|
330
|
+
for await (let n of r({}, {
|
|
369
331
|
key: U,
|
|
370
332
|
transport: e,
|
|
371
|
-
unregisterSignal:
|
|
333
|
+
unregisterSignal: t.signal
|
|
372
334
|
})) {
|
|
373
|
-
if (
|
|
374
|
-
yield
|
|
335
|
+
if (t.signal.aborted) break;
|
|
336
|
+
yield n;
|
|
375
337
|
}
|
|
376
338
|
}
|
|
377
|
-
yield*
|
|
378
|
-
key:
|
|
339
|
+
yield* r({}, {
|
|
340
|
+
key: Ae,
|
|
379
341
|
transport: e
|
|
380
342
|
});
|
|
381
|
-
} }, W = !1, G = H().then((
|
|
382
|
-
if (!
|
|
383
|
-
let { receive: r } =
|
|
384
|
-
e
|
|
343
|
+
} }, W = !1, G = H().then((e) => new Promise((t) => {
|
|
344
|
+
if (!e) return;
|
|
345
|
+
let { receive: r } = e, i = (e) => {
|
|
346
|
+
n(e.data, U) && (r.removeEventListener("message", i), W = !0, t());
|
|
385
347
|
};
|
|
386
348
|
r.addEventListener("message", i);
|
|
387
|
-
})), K =
|
|
349
|
+
})), K = De(je, { boundRetired: (e) => Promise.race([e, G.then(() => Q(e, () => new Z()))]) });
|
|
388
350
|
V(() => K.retire());
|
|
389
|
-
var q = Promise.race([K.first, new Promise((e) => V(e))]).then(() => K.facade), J = 8e3,
|
|
351
|
+
var q = Promise.race([K.first, new Promise((e) => V(e))]).then(() => K.facade), J = 8e3, Me = 1e3, Y = !1, X = class extends Error {
|
|
390
352
|
constructor(e, t) {
|
|
391
353
|
super(`@fkn/lib: no broker connection within ${t}ms, so ${e} could not be requested`), this.name = "BrokerUnreachableError";
|
|
392
354
|
}
|
|
@@ -395,23 +357,23 @@ var q = Promise.race([K.first, new Promise((e) => V(e))]).then(() => K.facade),
|
|
|
395
357
|
super("FKN @fkn/lib: this page relays its FKN channel to a worker, and the FKN page it reached predates a channel of the page's own; reload"), this.name = "OwnChannelUnavailableError";
|
|
396
358
|
}
|
|
397
359
|
}, Q = (e, t) => {
|
|
398
|
-
let n = Y ?
|
|
360
|
+
let n = Y ? Me : J;
|
|
399
361
|
return Promise.race([e, new Promise((e, r) => setTimeout(() => {
|
|
400
362
|
Y = !0, r(t(n));
|
|
401
363
|
}, n))]);
|
|
402
|
-
},
|
|
364
|
+
}, Ne = (e) => B() ? Q(K.routable().then(() => K.facade), (t) => W ? new Z() : new X(e, t)) : Q(q, (t) => new X(e, t));
|
|
403
365
|
V(() => {
|
|
404
366
|
G.then(() => {
|
|
405
367
|
let e = setTimeout(() => console.error(new Z()), J);
|
|
406
368
|
K.routable().then(() => clearTimeout(e));
|
|
407
369
|
});
|
|
408
370
|
});
|
|
409
|
-
var $ = K.onEpoch,
|
|
371
|
+
var $ = K.onEpoch, Pe = K.current, Fe = K.lastCall, Ie = K.inFlight;
|
|
410
372
|
$((e) => {
|
|
411
|
-
|
|
412
|
-
exactClips:
|
|
413
|
-
colorScheme:
|
|
373
|
+
ve() && e.overlay.setHost(Se, {
|
|
374
|
+
exactClips: ne(),
|
|
375
|
+
colorScheme: g
|
|
414
376
|
}).catch(() => {});
|
|
415
377
|
});
|
|
416
378
|
//#endregion
|
|
417
|
-
export {
|
|
379
|
+
export { Fe as a, Pe as c, Oe as d, L as f, Ie as i, ke as l, X as n, q as o, Z as r, Ne as s, J as t, $ as u };
|
package/api-CrUO33y-.cjs
ADDED
|
@@ -0,0 +1,3 @@
|
|
|
1
|
+
const e=require("./broker-frame-CF4-yXtj.cjs");let t=require("osra");var n=1e4,r=16,i=e=>{let t;try{t=e.contentWindow}catch{return!0}if(!t)return!0;try{let e=t.location.href;return e!==``&&e!==`about:blank`}catch{return!0}},a=(e,t=n)=>new Promise(n=>{if(i(e))return n();let a=()=>{clearInterval(o),clearTimeout(s),e.removeEventListener(`load`,a),n()},o=setInterval(()=>{i(e)&&a()},r),s=setTimeout(a,t);e.addEventListener(`load`,a)}),o=5e3,s=9e4,c=(e,t,r)=>{let a=1,c,l=e.ownerDocument.defaultView,u=()=>{clearTimeout(c),l?.removeEventListener(`message`,m),e.removeEventListener(`load`,p)},d=()=>{if(e.isConnected){if(a>=4)return u(),console.error(`FKN @fkn/lib: ${t} did not load in ${a} tries; reload the page`);a+=1,e.contentWindow?.location.replace(t),f(s)}},f=e=>{clearTimeout(c),c=setTimeout(d,e)},p=()=>f(o),m=t=>{t.source===e.contentWindow&&t.origin===r&&u()};if(l?.addEventListener(`message`,m),e.addEventListener(`load`,p),i(e))return f(o);c=setTimeout(()=>i(e)?f(8e4):d(),n)},l=32,u=8,d=120,f=typeof CSS<`u`&&CSS.supports(`clip-path`,`path('M0 0H1V1H0Z')`),p=typeof CSS<`u`&&CSS.supports(`clip-path`,`polygon(nonzero, 0px 0px, 1px 0px, 1px 1px)`),m=`light dark`,h=e=>{let t=e.style;t.setProperty(`display`,`block`,`important`),t.setProperty(`position`,`fixed`,`important`),t.setProperty(`top`,`0`,`important`),t.setProperty(`left`,`0`,`important`),t.setProperty(`width`,`100%`,`important`),t.setProperty(`height`,`100%`,`important`),t.setProperty(`border`,`none`,`important`),t.setProperty(`padding`,`0`,`important`),t.setProperty(`box-sizing`,`border-box`,`important`),t.setProperty(`clip-path`,`inset(100%)`,`important`),t.setProperty(`background`,`transparent`),t.setProperty(`color-scheme`,m),t.setProperty(`z-index`,`2147483647`),e.setAttribute(`title`,`FKN`)},g=({x:e,y:t,width:n,height:r,radius:i})=>{if(!i)return`M${e} ${t}h${n}v${r}h${-n}Z`;let a=Math.min(n,r)/2,[o,s,c,l]=i.map(e=>Math.max(0,Math.min(e,a)));return`M${e+o} ${t}h${n-o-s}a${s} ${s} 0 0 1 ${s} ${s}v${r-s-c}a${c} ${c} 0 0 1 ${-c} ${c}h${-(n-c-l)}a${l} ${l} 0 0 1 ${-l} ${-l}v${-(r-l-o)}a${o} ${o} 0 0 1 ${o} ${-o}Z`},ee=()=>f&&p,_=({x:e,y:t,width:n,height:r})=>[[e,t],[e+n,t],[e+n,t+r],[e,t+r],[e,t]],te=e=>{let t=e[0];if(!t)return[];let n=_(t)[0],r=[];return e.forEach((t,i)=>{r.push(..._(t)),i>0&&i<e.length-1&&r.push(n)}),r},ne=e=>`polygon(nonzero, ${te(e).map(([e,t])=>`${e}px ${t}px`).join(`, `)})`,re=({x:e,y:t,width:n,height:r,radius:i},a)=>{let o=`${t}px ${a.width-e-n}px ${a.height-t-r}px ${e}px`;return i?`inset(${o} round ${i.map(e=>`${e}px`).join(` `)})`:`inset(${o})`},ie=(e,t,n)=>{if(t)return`none`;if(e.length===0)return`inset(100%)`;let r=e.length===1?e[0]:void 0;return r?re(r,n):p&&e.length<=5&&!e.some(e=>e.radius)?ne(e):`path('${e.map(g).join(``)}')`},ae=e=>{if(e.length<2)return null;let t=Math.min(...e.map(e=>e.x)),n=Math.min(...e.map(e=>e.y));return{x:t,y:n,width:Math.max(...e.map(e=>e.x+e.width))-t,height:Math.max(...e.map(e=>e.y+e.height))-n}},oe=(e,t,n)=>t>=e.x&&t<e.x+e.width&&n>=e.y&&n<e.y+e.height,se=16,v=(e,t,n)=>t===1?e*se:t===2?e*n:e,ce=(e,t,n)=>{let r=getComputedStyle(e);return n!==0&&/auto|scroll/.test(r.overflowY)&&e.scrollHeight>e.clientHeight?!0:t!==0&&/auto|scroll/.test(r.overflowX)&&e.scrollWidth>e.clientWidth},le=(e,t,n)=>{for(let r=e;r;r=r.parentElement)if(ce(r,t,n))return r;return document.scrollingElement},y=null,b=null,x=e=>({width:e.offsetWidth||window.innerWidth,height:e.offsetHeight||window.innerHeight}),S=e=>{if(!b||!y||!oe(b,e.clientX,e.clientY))return;let t=document.elementFromPoint(e.clientX,e.clientY);if(!t||t===y)return;let n=v(e.deltaX,e.deltaMode,window.innerWidth),r=v(e.deltaY,e.deltaMode,window.innerHeight),i=le(t,n,r);i&&(i.scrollBy({left:n,top:r,behavior:`instant`}),e.cancelable&&e.preventDefault())},ue=e=>{let t=b!==null;b=e,t!==(e!==null)&&(e?window.addEventListener(`wheel`,S,{capture:!0,passive:!1}):window.removeEventListener(`wheel`,S,{capture:!0}))},C=0,de=e=>{if(e===C)return;C=e;let t=document.documentElement.style;e>0?(t.setProperty(`margin-top`,`${e}px`,`important`),t.setProperty(`--fkn-inset-top`,`${e}px`)):(t.removeProperty(`margin-top`),t.removeProperty(`--fkn-inset-top`))},w=(e,{modal:t,rects:n,inset:r},i)=>{if(de(r),!f){let r=t||n.length>0;e.style.setProperty(`pointer-events`,r?`auto`:`none`,`important`),e.style.setProperty(`visibility`,r?`visible`:`hidden`,`important`);return}let a=ie(n,t,i),o=a===`none`||CSS.supports(`clip-path`,a)?a:`inset(100%)`;e.style.setProperty(`clip-path`,o,`important`),ue(t||o!==a?null:ae(n))},fe=e=>{if(typeof e!=`object`||!e)return 0;let{top:t}=e;return typeof t!=`number`||!Number.isFinite(t)||t<=0?0:Math.min(Math.round(t),d)},pe=e=>{if(Array.isArray(e)&&e.length===4&&e.every(e=>typeof e==`number`&&Number.isFinite(e)&&e>=0))return e.some(e=>e>0)?e:void 0},me=(e,t)=>{if(typeof e!=`object`||!e)return null;let{x:n,y:r,width:i,height:a}=e;if(![n,r,i,a].every(e=>typeof e==`number`&&Number.isFinite(e)))return null;let o=t.width,s=t.height,c=Math.max(0,Math.min(Math.round(n),o)),l=Math.max(0,Math.min(Math.round(r),s)),u=Math.max(c,Math.min(Math.round(n+i),o)),d=Math.max(l,Math.min(Math.round(r+a),s)),f=pe(e.radius);return{x:c,y:l,width:u-c,height:d-l,...f?{radius:f}:{}}},T={"not-rendered":`this page is not painting it at all, so it or an ancestor is display:none, or the frame was moved out of the layout`,clipped:`it is clipped away or positioned outside the viewport`,"not-shown":`it is rendered but would not be seen, so either something is drawn over it, or it or an ancestor has opacity below 1, visibility:hidden, or a filter`},E=e=>Array.isArray(e)?e.slice(0,u).flatMap(e=>{if(typeof e!=`object`||!e)return[];let{kind:t,cause:n,level:r}=e;return typeof t!=`string`||t.length>40||typeof n!=`string`||!(n in T)||r!==`full`&&r!==`liveness`?[]:[{kind:t,cause:n,level:r}]}):[],D=new Set,he=e=>{for(let{kind:t,cause:n,level:r}of e)D.has(t)||(D.add(t),console.error(`[FKN] The FKN ${JSON.stringify(t)} is not visible on this page: ${T[n]}. Nobody using this page can see or answer it.
|
|
2
|
+
@fkn/lib draws its UI inside <iframe title="FKN"> and sets display, position, top, left, width, height, border, padding, box-sizing, clip-path and z-index on that element. Leave those as they are, then check for an ancestor with opacity, visibility, display or a clipping transform, and for an element stacked above it.`+(r===`liveness`?`
|
|
3
|
+
This browser reports limited detail, so the cause above is a best guess.`:``)))},O=(e,t)=>{if(typeof e!=`object`||!e)return null;let n=e,r=(Array.isArray(n.rects)?n.rects.slice(0,l):[]).map(e=>me(e,t)).filter(e=>e!==null&&e.width>0&&e.height>0);return{modal:n.modal===!0,rects:r,hidden:E(n.hidden),inset:fe(n.inset)}},ge=()=>y!==null,k=null,A=null,_e=()=>{if(!y||k===null)return;let e=x(y),t=O(k,e);t&&w(y,t,e)},ve=e=>{typeof ResizeObserver<`u`&&(A??=new ResizeObserver(_e),A.disconnect(),A.observe(e))},ye=e=>{h(e),w(e,{modal:!1,rects:[],hidden:[],inset:0},x(e)),y=e,ve(e)},be=e=>{if(!y)return;let t=x(y),n=O(e,t);n&&(k=e,w(y,n,t),he(n.hidden))},j=`https://fkn.app`,M=typeof globalThis<`u`&&globalThis.document?globalThis.document:void 0,N=typeof globalThis<`u`&&globalThis.crossOriginIsolated===!0,P=e.n(N),xe=`fkn-api-port`,Se=`fkn-api-port-ack`,Ce=2e3,F=()=>{if(!M||typeof window>`u`||window.parent===window)return Promise.resolve(void 0);let e;try{e=window.parent}catch{return Promise.resolve(void 0)}let t=new MessageChannel;return new Promise(n=>{let r=e=>{if(clearTimeout(a),t.port1.removeEventListener(`message`,i),!e)try{t.port1.close()}catch{}n(e)},i=e=>{e.data?.type===Se&&r(t.port1)},a=setTimeout(()=>r(void 0),Ce);t.port1.addEventListener(`message`,i),t.port1.start();try{e.postMessage({type:xe},j,[t.port2])}catch{r(void 0)}})},I,we=()=>{if(I||!M)return I;let t=M.querySelector(`iframe[src="${P}"]`);if(t)I=t;else{let t=M.createElement(`iframe`);t.setAttribute(`allow`,e.i(N)),t.src=P,M.body.appendChild(t),I=t}return c(I,P,j),ye(I),I},L=(async()=>{if(!M)return;let e=await F();if(e)return{receive:e,emit:e};let t=we();if(!t)return;await a(t);let n=t.contentWindow;return n?{receive:window,emit:n}:void 0})(),Te=(e,{boundRetired:t=e=>e}={})=>{let n,r=0,i=!1,a=()=>{},o=()=>new Promise(e=>{a=e}),s=o(),c=s,l=new Set,u=new Set,d=0,f=0,p=()=>{let e=[...u];u.clear();let t=Error(`FKN: the broker was replaced while this call was pending; retry it`);for(let n of e)try{n(t)}catch{}};(async()=>{for await(let t of e){let e=++r;n={remote:t,epoch:e};let i=a;s=o(),i(t),p();for(let n of[...l])try{n(t,e)}catch{}}})().catch(()=>{});let m=async(e,r)=>{let a=n?.remote??await(i?t(s):s);for(let t of e.slice(0,-1))a=a[t];let o=a[e[e.length-1]??``];d=Date.now(),f+=1;let c=()=>{},l=new Promise((e,t)=>{c=t});u.add(c);try{return await Promise.race([Promise.resolve(o.apply(a,r)),l])}finally{--f,u.delete(c),d=Date.now()}},h=new Map,g=e=>{let t=e.join(`\0`),r=h.get(t);if(r)return r;let i=new Proxy(function(){},{get:(t,r)=>{if(typeof r!=`string`||r===`then`)return;let i=n;if(i){let t=i.remote;for(let n of e)t=t?.[n];if(t?.[r]===void 0)return}return g([...e,r])},apply:(t,n,r)=>m(e,r)});return h.set(t,i),i};return{facade:g([]),first:c.then(()=>{}),current:()=>n,onEpoch:e=>{if(l.add(e),n)try{e(n.remote,n.epoch)}catch{}return()=>{l.delete(e)}},lastCall:()=>d,inFlight:()=>f,routable:()=>n?Promise.resolve():s.then(()=>{}),retire:()=>{i=!0,n=void 0,p()}}},R=!1,z=new Set,B=()=>R,Ee=()=>{if(!R){R=!0;for(let e of[...z])try{e()}catch{}z.clear()}},V=e=>{R?e():z.add(e)},De=typeof window<`u`||typeof self<`u`,H=async()=>{if(typeof window<`u`)return L;if(typeof self<`u`)return{receive:self,emit:self}},U=`fkn-api`,Oe=`fkn-api-window`,ke={async*[Symbol.asyncIterator](){let e=await H();if(!e){await new Promise(()=>{});return}if(!B()){let n=new AbortController;V(()=>n.abort());for await(let r of(0,t.expose)({},{key:U,transport:e,unregisterSignal:n.signal})){if(n.signal.aborted)break;yield r}}yield*(0,t.expose)({},{key:Oe,transport:e})}},W=!1,G=H().then(e=>new Promise(n=>{if(!e)return;let{receive:r}=e,i=e=>{(0,t.checkOsraMessageKey)(e.data,U)&&(r.removeEventListener(`message`,i),W=!0,n())};r.addEventListener(`message`,i)})),K=Te(ke,{boundRetired:e=>Promise.race([e,G.then(()=>Q(e,()=>new Z))])});V(()=>K.retire());var q=Promise.race([K.first,new Promise(e=>V(e))]).then(()=>K.facade),J=8e3,Ae=1e3,Y=!1,X=class extends Error{constructor(e,t){super(`@fkn/lib: no broker connection within ${t}ms, so ${e} could not be requested`),this.name=`BrokerUnreachableError`}},Z=class extends Error{constructor(){super(`FKN @fkn/lib: this page relays its FKN channel to a worker, and the FKN page it reached predates a channel of the page's own; reload`),this.name=`OwnChannelUnavailableError`}},Q=(e,t)=>{let n=Y?Ae:J;return Promise.race([e,new Promise((e,r)=>setTimeout(()=>{Y=!0,r(t(n))},n))])},je=e=>B()?Q(K.routable().then(()=>K.facade),t=>W?new Z:new X(e,t)):Q(q,t=>new X(e,t));V(()=>{G.then(()=>{let e=setTimeout(()=>console.error(new Z),J);K.routable().then(()=>clearTimeout(e))})});var $=K.onEpoch,Me=K.current,Ne=K.lastCall,Pe=K.inFlight;$(e=>{ge()&&e.overlay.setHost(be,{exactClips:ee(),colorScheme:m}).catch(()=>{})}),Object.defineProperty(exports,"a",{enumerable:!0,get:function(){return Ne}}),Object.defineProperty(exports,"c",{enumerable:!0,get:function(){return Me}}),Object.defineProperty(exports,"d",{enumerable:!0,get:function(){return Ee}}),Object.defineProperty(exports,"f",{enumerable:!0,get:function(){return L}}),Object.defineProperty(exports,"i",{enumerable:!0,get:function(){return Pe}}),Object.defineProperty(exports,"l",{enumerable:!0,get:function(){return De}}),Object.defineProperty(exports,"n",{enumerable:!0,get:function(){return X}}),Object.defineProperty(exports,"o",{enumerable:!0,get:function(){return q}}),Object.defineProperty(exports,"r",{enumerable:!0,get:function(){return Z}}),Object.defineProperty(exports,"s",{enumerable:!0,get:function(){return je}}),Object.defineProperty(exports,"t",{enumerable:!0,get:function(){return J}}),Object.defineProperty(exports,"u",{enumerable:!0,get:function(){return $}});
|
package/api.cjs
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
Object.defineProperty(exports,Symbol.toStringTag,{value:`Module`});const e=require("./api-
|
|
1
|
+
Object.defineProperty(exports,Symbol.toStringTag,{value:`Module`});const e=require("./api-CrUO33y-.cjs");exports.API_DEADLINE_MS=e.t,exports.BrokerUnreachableError=e.n,exports.OwnChannelUnavailableError=e.r,exports.apiInFlight=e.i,exports.apiLastCall=e.a,exports.apiPromise=e.o,exports.apiWithin=e.s,exports.currentApiEpoch=e.c,exports.hasTransport=e.l,exports.onApiEpoch=e.u;
|
package/api.js
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import { a as e, c as t, i as n, l as r, n as i, o as a, r as o, s, t as c, u as l } from "./api-
|
|
1
|
+
import { a as e, c as t, i as n, l as r, n as i, o as a, r as o, s, t as c, u as l } from "./api-BvJu2X1L.js";
|
|
2
2
|
export { c as API_DEADLINE_MS, i as BrokerUnreachableError, o as OwnChannelUnavailableError, n as apiInFlight, e as apiLastCall, a as apiPromise, s as apiWithin, t as currentApiEpoch, r as hasTransport, l as onApiEpoch };
|