@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.
Files changed (55) hide show
  1. package/README.md +35 -0
  2. package/{account-generation-CVWVhbkh.cjs → account-generation-BiZxPztj.cjs} +1 -1
  3. package/{account-generation-MjW8usme.js → account-generation-DvRuJDa2.js} +1 -1
  4. package/{account-storage-D98wfGuJ.js → account-storage-D8CBG1cv.js} +2 -2
  5. package/{account-storage-a_-uiS1N.cjs → account-storage-DpHBgeX5.cjs} +1 -1
  6. package/account.cjs +1 -1
  7. package/account.js +2 -2
  8. package/{api-C1lxKsM1.js → api-BvJu2X1L.js} +109 -147
  9. package/api-CrUO33y-.cjs +3 -0
  10. package/api.cjs +1 -1
  11. package/api.js +1 -1
  12. package/broker-frame-B31OXcnH.js +52 -0
  13. package/broker-frame-CF4-yXtj.cjs +9 -0
  14. package/broker-frame.cjs +1 -0
  15. package/broker-frame.d.ts +14 -0
  16. package/broker-frame.js +2 -0
  17. package/cloud/fetch.cjs +1 -1
  18. package/cloud/fetch.js +1 -1
  19. package/cloud/fs.cjs +1 -1
  20. package/cloud/fs.js +1 -1
  21. package/cloud-DcgY8Xfp.cjs +1 -0
  22. package/{cloud-CjQfUhhD.js → cloud-FW59_g8F.js} +5 -4
  23. package/cloud.cjs +1 -1
  24. package/cloud.js +2 -2
  25. package/dgram.cjs +1 -1
  26. package/dgram.js +1 -1
  27. package/dns.cjs +1 -1
  28. package/dns.js +1 -1
  29. package/{extension-Ct5qQkQF.js → extension-Chmpunqf.js} +5 -4
  30. package/extension-I2Ziv2pk.cjs +1 -0
  31. package/extension.cjs +1 -1
  32. package/extension.js +1 -1
  33. package/fs/promises.cjs +1 -1
  34. package/fs/promises.js +1 -1
  35. package/{fs-B8V-40ft.cjs → fs-DeyJwJ3w.cjs} +1 -1
  36. package/{fs-nKDF2pOY.js → fs-Djuaj5pQ.js} +2 -2
  37. package/fs.cjs +1 -1
  38. package/fs.js +2 -2
  39. package/index.cjs +1 -1
  40. package/index.js +4 -4
  41. package/net.cjs +1 -1
  42. package/net.js +1 -1
  43. package/package.json +6 -1
  44. package/packages.cjs +1 -1
  45. package/packages.js +1 -1
  46. package/{proxy-BJ1hSZgi.js → proxy-C4sYkxB5.js} +10 -9
  47. package/proxy-jdE5tCwz.cjs +1 -0
  48. package/rooms.cjs +1 -1
  49. package/rooms.js +1 -1
  50. package/storage.cjs +1 -1
  51. package/storage.js +3 -3
  52. package/api-D7Sbm8Oj.cjs +0 -3
  53. package/cloud-B8v_yMtd.cjs +0 -1
  54. package/extension-C1oub0Dw.cjs +0 -1
  55. 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-D7Sbm8Oj.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
+ 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,4 +1,4 @@
1
- import { c as e, l as t, u as n } from "./api-C1lxKsM1.js";
1
+ import { c as e, l as t, u as n } from "./api-BvJu2X1L.js";
2
2
  //#region src/account-generation.ts
3
3
  var r = 0, i = /* @__PURE__ */ new Set(), a = 2e3, o = null, s = (e) => {
4
4
  let t = e?.switched !== !1;
@@ -1,7 +1,7 @@
1
1
  import { t as e } from "./rolldown-runtime-Dy4uBu1J.js";
2
- import { o as t } from "./api-C1lxKsM1.js";
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-MjW8usme.js";
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-D7Sbm8Oj.cjs"),n=require("./messages.cjs"),r=require("./account-generation-CVWVhbkh.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}});
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-D7Sbm8Oj.cjs"),n=require("./account-generation-CVWVhbkh.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}});
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-C1lxKsM1.js";
3
- import { i as r } from "./account-generation-MjW8usme.js";
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 { checkOsraMessageKey as e, expose as t } from "osra";
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 n = 1e4, r = 16, i = (e) => {
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
- }, a = (e, t = n) => new Promise((n) => {
18
- if (i(e)) return n();
19
- let a = () => {
20
- clearInterval(o), clearTimeout(s), e.removeEventListener("load", a), n();
21
- }, o = setInterval(() => {
22
- i(e) && a();
23
- }, r), s = setTimeout(a, t);
24
- e.addEventListener("load", a);
25
- }), o = 5e3, s = 9e4, c = (e, t, n) => {
26
- let r = 1, a, c = e.ownerDocument.defaultView, l = () => {
27
- clearTimeout(a), c?.removeEventListener("message", f), e.removeEventListener("load", d);
28
- }, u = (n) => {
29
- clearTimeout(a), a = setTimeout(() => {
30
- if (e.isConnected) {
31
- if (r >= 4) return l(), console.error(`FKN @fkn/lib: ${t} did not load in ${r} tries; reload the page`);
32
- r += 1, e.contentWindow?.location.replace(t), u(s);
33
- }
34
- }, n);
35
- }, d = () => u(o), f = (t) => {
36
- t.source === e.contentWindow && t.origin === n && l();
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
- c?.addEventListener("message", f), e.addEventListener("load", d), u(i(e) ? o : s);
39
- }, 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) => {
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", m), t.setProperty("z-index", "2147483647"), e.setAttribute("title", "FKN");
42
- }, g = ({ x: e, y: t, width: n, height: r, radius: i }) => {
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
- }, ee = () => f && p, _ = ({ x: e, y: t, width: n, height: r }) => [
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
- ], te = (e) => {
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
- }, 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) => {
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
- }, ie = (e, t, n) => {
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 ? re(r, n) : p && e.length <= 5 && !e.some((e) => e.radius) ? ne(e) : `path('${e.map(g).join("")}')`;
67
- }, ae = (e) => {
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
- }, 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) => {
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
- }, le = (e, t, n) => {
80
- for (let r = e; r; r = r.parentElement) if (ce(r, t, n)) return r;
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 || !oe(b, e.clientX, e.clientY)) return;
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 = le(t, n, r);
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
- }, ue = (e) => {
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, de = (e) => {
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 (de(r), !f) {
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 = ie(n, t, i), o = a === "none" || CSS.supports("clip-path", a) ? a : "inset(100%)";
113
- e.style.setProperty("clip-path", o, "important"), ue(t || o !== a ? null : ae(n));
114
- }, fe = (e) => {
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), d);
118
- }, pe = (e) => {
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
- }, me = (e, t) => {
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 = pe(e.radius);
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
- }, T = {
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
- }, he = (e) => Array.isArray(e) ? e.slice(0, u).flatMap((e) => {
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 T) || r !== "full" && r !== "liveness" ? [] : [{
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
- }) : [], E = /* @__PURE__ */ new Set(), ge = (e) => {
150
- for (let { kind: t, cause: n, level: r } of e) E.has(t) || (E.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.
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
- }, D = (e, t) => {
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, l) : []).map((e) => me(e, t)).filter((e) => e !== null && e.width > 0 && e.height > 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: he(n.hidden),
159
- inset: fe(n.inset)
160
+ hidden: ge(n.hidden),
161
+ inset: me(n.inset)
160
162
  };
161
- }, _e = () => y !== null, O = null, k = null, ve = () => {
162
- if (!y || O === null) return;
163
- let e = x(y), t = D(O, e);
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
- h(e), w(e, {
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, ye(e);
174
- }, xe = (e) => {
175
+ }, x(e)), y = e, be(e);
176
+ }, Se = (e) => {
175
177
  if (!y) return;
176
- let t = x(y), n = D(e, t);
177
- n && (O = e, w(y, n, t), ge(n.hidden));
178
- }, Se = /* @__PURE__ */ "fkn.app,fkn.dev,sdbx.app,horionsoftware.com,webvpn.dev,fknmail.app,clairv.app,fkn.cloudflareaccess.com,me-62e.workers.dev,62e9d4fbf21d90ebd4342e54b4babbd3.r2.cloudflarestorage.com,62e9d4fbf21d90ebd4342e54b4babbd3.eu.r2.cloudflarestorage.com,62e9d4fbf21d90ebd4342e54b4babbd3.fedramp.r2.cloudflarestorage.com,pub-8a3dc68041874c7e9c9a54bde972605a.r2.dev,pub-3d97d79220b94243812e60b0e742f2c5.r2.dev,pub-f8bd4876cc3c4b4a951715da5958e49c.r2.dev,web-b3z.pages.dev,fkn-console.pages.dev,dev-dms.pages.dev,fkn-www.pages.dev,fkn-homepage.pages.dev,fkn-sandbox.pages.dev,internal-3ar.pages.dev,stub-ben.pages.dev,ripple-3t3.pages.dev,media-player-e3s.pages.dev,youtube-3c4.pages.dev,horionsoftware.pages.dev,container-ckf.pages.dev,stub-plugin.pages.dev,social-3n2.pages.dev,plugins.banou.dev".split(","), A = (e) => e.toLowerCase().replace(/\.+$/, ""), Ce = ["79.127.204.69", "152.233.49.59"], we = (e) => {
179
- let t;
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 === je && r(t.port1);
235
- }, a = setTimeout(() => r(void 0), Me);
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: Ae }, M, [t.port2]);
200
+ e.postMessage({ type: Ce }, j, [t.port2]);
239
201
  } catch {
240
202
  r(void 0);
241
203
  }
242
204
  });
243
- }, I, Pe = () => {
244
- if (I || !N) return I;
245
- let e = N.querySelector(`iframe[src="${F}"]`);
246
- if (e) I = e;
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 e = N.createElement("iframe");
249
- e.setAttribute("allow", j(P)), e.src = F, N.body.appendChild(e), I = e;
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 c(I, F, M), be(I), I;
213
+ return u(F, P, j), xe(F), F;
252
214
  }, L = (async () => {
253
- if (!N) return;
254
- let e = await Ne();
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 = Pe();
221
+ let t = I();
260
222
  if (!t) return;
261
- await a(t);
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
- })(), Fe = (e, { boundRetired: t = (e) => e } = {}) => {
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, Ie = () => {
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
- }, Le = typeof window < "u" || typeof self < "u", H = async () => {
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", Re = "fkn-api-window", ze = { async *[Symbol.asyncIterator]() {
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 n = new AbortController();
367
- V(() => n.abort());
368
- for await (let r of t({}, {
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: n.signal
333
+ unregisterSignal: t.signal
372
334
  })) {
373
- if (n.signal.aborted) break;
374
- yield r;
335
+ if (t.signal.aborted) break;
336
+ yield n;
375
337
  }
376
338
  }
377
- yield* t({}, {
378
- key: Re,
339
+ yield* r({}, {
340
+ key: Ae,
379
341
  transport: e
380
342
  });
381
- } }, W = !1, G = H().then((t) => new Promise((n) => {
382
- if (!t) return;
383
- let { receive: r } = t, i = (t) => {
384
- e(t.data, U) && (r.removeEventListener("message", i), W = !0, n());
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 = Fe(ze, { boundRetired: (e) => Promise.race([e, G.then(() => Q(e, () => new Z()))]) });
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, Be = 1e3, Y = !1, X = class extends Error {
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 ? Be : J;
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
- }, Ve = (e) => B() ? Q(K.routable().then(() => K.facade), (t) => W ? new Z() : new X(e, t)) : Q(q, (t) => new X(e, t));
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, He = K.current, Ue = K.lastCall, We = K.inFlight;
371
+ var $ = K.onEpoch, Pe = K.current, Fe = K.lastCall, Ie = K.inFlight;
410
372
  $((e) => {
411
- _e() && e.overlay.setHost(xe, {
412
- exactClips: ee(),
413
- colorScheme: m
373
+ ve() && e.overlay.setHost(Se, {
374
+ exactClips: ne(),
375
+ colorScheme: g
414
376
  }).catch(() => {});
415
377
  });
416
378
  //#endregion
417
- export { Ue as a, He as c, Ie as d, L as f, We as i, Le as l, j as m, X as n, q as o, De as p, Z as r, Ve as s, J as t, $ as u };
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 };
@@ -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-D7Sbm8Oj.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;
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-C1lxKsM1.js";
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 };