@fkn/lib 0.9.63 → 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-B0cJrpDx.cjs → account-generation-BiZxPztj.cjs} +1 -1
  3. package/{account-generation-u31dhamM.js → account-generation-DvRuJDa2.js} +1 -1
  4. package/{account-storage-ZkzqZp3A.js → account-storage-D8CBG1cv.js} +2 -2
  5. package/{account-storage-BnohkyMJ.cjs → account-storage-DpHBgeX5.cjs} +1 -1
  6. package/account.cjs +1 -1
  7. package/account.js +2 -2
  8. package/{api-Di2Ff3jS.js → api-BvJu2X1L.js} +105 -144
  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-C6rG_aod.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-C3_aJX7C.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-CjQTj3FA.cjs → fs-DeyJwJ3w.cjs} +1 -1
  36. package/{fs-DgdN2HPt.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-tsVhjcl-.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-BSk3dc_X.cjs +0 -3
  53. package/cloud-BoiHKoRZ.cjs +0 -1
  54. package/extension-Crv4aUAm.cjs +0 -1
  55. package/proxy-BA92hkId.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-BSk3dc_X.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-Di2Ff3jS.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-Di2Ff3jS.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-u31dhamM.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-BSk3dc_X.cjs"),n=require("./messages.cjs"),r=require("./account-generation-B0cJrpDx.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-BSk3dc_X.cjs"),n=require("./account-generation-B0cJrpDx.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-Di2Ff3jS.js";
3
- import { i as r } from "./account-generation-u31dhamM.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,58 +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, r) => {
26
- let a = 1, c, l = e.ownerDocument.defaultView, u = () => {
27
- clearTimeout(c), l?.removeEventListener("message", m), e.removeEventListener("load", p);
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);
28
29
  }, d = () => {
29
30
  if (e.isConnected) {
30
- if (a >= 4) return u(), console.error(`FKN @fkn/lib: ${t} did not load in ${a} tries; reload the page`);
31
- a += 1, e.contentWindow?.location.replace(t), f(s);
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);
32
33
  }
33
34
  }, f = (e) => {
34
- clearTimeout(c), c = setTimeout(d, e);
35
- }, p = () => f(o), m = (t) => {
36
- t.source === e.contentWindow && t.origin === r && u();
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
- if (l?.addEventListener("message", m), e.addEventListener("load", p), i(e)) return f(o);
39
- c = setTimeout(() => i(e) ? f(8e4) : d(), n);
40
- }, 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) => {
41
42
  let t = e.style;
42
- 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");
43
- }, 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 }) => {
44
45
  if (!i) return `M${e} ${t}h${n}v${r}h${-n}Z`;
45
46
  let a = Math.min(n, r) / 2, [o, s, c, l] = i.map((e) => Math.max(0, Math.min(e, a)));
46
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`;
47
- }, ee = () => f && p, _ = ({ x: e, y: t, width: n, height: r }) => [
48
+ }, ne = () => m && h, _ = ({ x: e, y: t, width: n, height: r }) => [
48
49
  [e, t],
49
50
  [e + n, t],
50
51
  [e + n, t + r],
51
52
  [e, t + r],
52
53
  [e, t]
53
- ], te = (e) => {
54
+ ], re = (e) => {
54
55
  let t = e[0];
55
56
  if (!t) return [];
56
57
  let n = _(t)[0], r = [];
57
58
  return e.forEach((t, i) => {
58
59
  r.push(..._(t)), i > 0 && i < e.length - 1 && r.push(n);
59
60
  }), r;
60
- }, 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) => {
61
62
  let o = `${t}px ${a.width - e - n}px ${a.height - t - r}px ${e}px`;
62
63
  return i ? `inset(${o} round ${i.map((e) => `${e}px`).join(" ")})` : `inset(${o})`;
63
- }, ie = (e, t, n) => {
64
+ }, oe = (e, t, n) => {
64
65
  if (t) return "none";
65
66
  if (e.length === 0) return "inset(100%)";
66
67
  let r = e.length === 1 ? e[0] : void 0;
67
- return r ? re(r, n) : p && e.length <= 5 && !e.some((e) => e.radius) ? ne(e) : `path('${e.map(g).join("")}')`;
68
- }, 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) => {
69
70
  if (e.length < 2) return null;
70
71
  let t = Math.min(...e.map((e) => e.x)), n = Math.min(...e.map((e) => e.y));
71
72
  return {
@@ -74,51 +75,51 @@ var n = 1e4, r = 16, i = (e) => {
74
75
  width: Math.max(...e.map((e) => e.x + e.width)) - t,
75
76
  height: Math.max(...e.map((e) => e.y + e.height)) - n
76
77
  };
77
- }, 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) => {
78
79
  let r = getComputedStyle(e);
79
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;
80
- }, le = (e, t, n) => {
81
- 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;
82
83
  return document.scrollingElement;
83
84
  }, y = null, b = null, x = (e) => ({
84
85
  width: e.offsetWidth || window.innerWidth,
85
86
  height: e.offsetHeight || window.innerHeight
86
87
  }), S = (e) => {
87
- if (!b || !y || !oe(b, e.clientX, e.clientY)) return;
88
+ if (!b || !y || !ce(b, e.clientX, e.clientY)) return;
88
89
  let t = document.elementFromPoint(e.clientX, e.clientY);
89
90
  if (!t || t === y) return;
90
- 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);
91
92
  i && (i.scrollBy({
92
93
  left: n,
93
94
  top: r,
94
95
  behavior: "instant"
95
96
  }), e.cancelable && e.preventDefault());
96
- }, ue = (e) => {
97
+ }, fe = (e) => {
97
98
  let t = b !== null;
98
99
  b = e, t !== (e !== null) && (e ? window.addEventListener("wheel", S, {
99
100
  capture: !0,
100
101
  passive: !1
101
102
  }) : window.removeEventListener("wheel", S, { capture: !0 }));
102
- }, C = 0, de = (e) => {
103
+ }, C = 0, pe = (e) => {
103
104
  if (e === C) return;
104
105
  C = e;
105
106
  let t = document.documentElement.style;
106
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"));
107
108
  }, w = (e, { modal: t, rects: n, inset: r }, i) => {
108
- if (de(r), !f) {
109
+ if (pe(r), !m) {
109
110
  let r = t || n.length > 0;
110
111
  e.style.setProperty("pointer-events", r ? "auto" : "none", "important"), e.style.setProperty("visibility", r ? "visible" : "hidden", "important");
111
112
  return;
112
113
  }
113
- let a = ie(n, t, i), o = a === "none" || CSS.supports("clip-path", a) ? a : "inset(100%)";
114
- e.style.setProperty("clip-path", o, "important"), ue(t || o !== a ? null : ae(n));
115
- }, 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) => {
116
117
  if (typeof e != "object" || !e) return 0;
117
118
  let { top: t } = e;
118
- return typeof t != "number" || !Number.isFinite(t) || t <= 0 ? 0 : Math.min(Math.round(t), d);
119
- }, pe = (e) => {
119
+ return typeof t != "number" || !Number.isFinite(t) || t <= 0 ? 0 : Math.min(Math.round(t), p);
120
+ }, he = (e) => {
120
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;
121
- }, me = (e, t) => {
122
+ }, T = (e, t) => {
122
123
  if (typeof e != "object" || !e) return null;
123
124
  let { x: n, y: r, width: i, height: a } = e;
124
125
  if (![
@@ -127,7 +128,7 @@ var n = 1e4, r = 16, i = (e) => {
127
128
  i,
128
129
  a
129
130
  ].every((e) => typeof e == "number" && Number.isFinite(e))) return null;
130
- 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);
131
132
  return {
132
133
  x: c,
133
134
  y: l,
@@ -135,89 +136,49 @@ var n = 1e4, r = 16, i = (e) => {
135
136
  height: d - l,
136
137
  ...f ? { radius: f } : {}
137
138
  };
138
- }, T = {
139
+ }, E = {
139
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",
140
141
  clipped: "it is clipped away or positioned outside the viewport",
141
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"
142
- }, he = (e) => Array.isArray(e) ? e.slice(0, u).flatMap((e) => {
143
+ }, ge = (e) => Array.isArray(e) ? e.slice(0, f).flatMap((e) => {
143
144
  if (typeof e != "object" || !e) return [];
144
145
  let { kind: t, cause: n, level: r } = e;
145
- 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" ? [] : [{
146
147
  kind: t,
147
148
  cause: n,
148
149
  level: r
149
150
  }];
150
- }) : [], E = /* @__PURE__ */ new Set(), ge = (e) => {
151
- 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.
152
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." : "")));
153
- }, D = (e, t) => {
154
+ }, O = (e, t) => {
154
155
  if (typeof e != "object" || !e) return null;
155
- 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);
156
157
  return {
157
158
  modal: n.modal === !0,
158
159
  rects: r,
159
- hidden: he(n.hidden),
160
- inset: fe(n.inset)
160
+ hidden: ge(n.hidden),
161
+ inset: me(n.inset)
161
162
  };
162
- }, _e = () => y !== null, O = null, k = null, ve = () => {
163
- if (!y || O === null) return;
164
- 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);
165
166
  t && w(y, t, e);
166
- }, ye = (e) => {
167
- typeof ResizeObserver < "u" && (k ??= new ResizeObserver(ve), k.disconnect(), k.observe(e));
168
167
  }, be = (e) => {
169
- 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, {
170
171
  modal: !1,
171
172
  rects: [],
172
173
  hidden: [],
173
174
  inset: 0
174
- }, x(e)), y = e, ye(e);
175
- }, xe = (e) => {
175
+ }, x(e)), y = e, be(e);
176
+ }, Se = (e) => {
176
177
  if (!y) return;
177
- let t = x(y), n = D(e, t);
178
- n && (O = e, w(y, n, t), ge(n.hidden));
179
- }, 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) => {
180
- let t;
181
- try {
182
- t = new URL(`http://${e.includes(":") && !e.startsWith("[") ? `[${e}]` : e}/`).hostname;
183
- } catch {
184
- return;
185
- }
186
- let n = /^\[(?:::ffff:|64:ff9b::)([0-9a-f]{1,4}):([0-9a-f]{1,4})\]$/.exec(t);
187
- if (n) {
188
- let e = parseInt(n[1], 16), t = parseInt(n[2], 16);
189
- return [
190
- e >> 8,
191
- e & 255,
192
- t >> 8,
193
- t & 255
194
- ].join(".");
195
- }
196
- return /^\d+\.\d+\.\d+\.\d+$/.test(t) ? t : void 0;
197
- }, Te = (e) => {
198
- let t = A(e);
199
- return Se.some((e) => t === e || t.endsWith(`.${e}`));
200
- }, Ee = (e) => {
201
- if (Te(e)) return !0;
202
- let t = we(A(e));
203
- return t !== void 0 && Ce.includes(t);
204
- }, De = (e) => {
205
- let t = typeof e == "string" ? e : e instanceof URL ? e.href : e.url, n;
206
- try {
207
- n = new URL(t);
208
- } catch {
209
- return;
210
- }
211
- if (Ee(n.hostname)) throw Error(`fetch refuses FKN platform domains (${n.hostname})`);
212
- }, 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 = () => {
213
- try {
214
- let e = globalThis.document?.featurePolicy?.features?.();
215
- return e === void 0 ? void 0 : new Set(e);
216
- } catch {
217
- return;
218
- }
219
- }, 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 = () => {
220
- 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);
221
182
  let e;
222
183
  try {
223
184
  e = window.parent;
@@ -232,40 +193,40 @@ var n = 1e4, r = 16, i = (e) => {
232
193
  } catch {}
233
194
  n(e);
234
195
  }, i = (e) => {
235
- e.data?.type === je && r(t.port1);
236
- }, a = setTimeout(() => r(void 0), Me);
196
+ e.data?.type === we && r(t.port1);
197
+ }, a = setTimeout(() => r(void 0), Te);
237
198
  t.port1.addEventListener("message", i), t.port1.start();
238
199
  try {
239
- e.postMessage({ type: Ae }, M, [t.port2]);
200
+ e.postMessage({ type: Ce }, j, [t.port2]);
240
201
  } catch {
241
202
  r(void 0);
242
203
  }
243
204
  });
244
- }, I, Pe = () => {
245
- if (I || !N) return I;
246
- let e = N.querySelector(`iframe[src="${F}"]`);
247
- 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;
248
209
  else {
249
- let e = N.createElement("iframe");
250
- 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;
251
212
  }
252
- return c(I, F, M), be(I), I;
213
+ return u(F, P, j), xe(F), F;
253
214
  }, L = (async () => {
254
- if (!N) return;
255
- let e = await Ne();
215
+ if (!M) return;
216
+ let e = await Ee();
256
217
  if (e) return {
257
218
  receive: e,
258
219
  emit: e
259
220
  };
260
- let t = Pe();
221
+ let t = I();
261
222
  if (!t) return;
262
- await a(t);
223
+ await s(t);
263
224
  let n = t.contentWindow;
264
225
  return n ? {
265
226
  receive: window,
266
227
  emit: n
267
228
  } : void 0;
268
- })(), Fe = (e, { boundRetired: t = (e) => e } = {}) => {
229
+ })(), De = (e, { boundRetired: t = (e) => e } = {}) => {
269
230
  let n, r = 0, i = !1, a = () => {}, o = () => new Promise((e) => {
270
231
  a = e;
271
232
  }), s = o(), c = s, l = /* @__PURE__ */ new Set(), u = /* @__PURE__ */ new Set(), d = 0, f = 0, p = () => {
@@ -341,7 +302,7 @@ var n = 1e4, r = 16, i = (e) => {
341
302
  i = !0, n = void 0, p();
342
303
  }
343
304
  };
344
- }, R = !1, z = /* @__PURE__ */ new Set(), B = () => R, Ie = () => {
305
+ }, R = !1, z = /* @__PURE__ */ new Set(), B = () => R, Oe = () => {
345
306
  if (!R) {
346
307
  R = !0;
347
308
  for (let e of [...z]) try {
@@ -351,43 +312,43 @@ var n = 1e4, r = 16, i = (e) => {
351
312
  }
352
313
  }, V = (e) => {
353
314
  R ? e() : z.add(e);
354
- }, Le = typeof window < "u" || typeof self < "u", H = async () => {
315
+ }, ke = typeof window < "u" || typeof self < "u", H = async () => {
355
316
  if (typeof window < "u") return L;
356
317
  if (typeof self < "u") return {
357
318
  receive: self,
358
319
  emit: self
359
320
  };
360
- }, U = "fkn-api", Re = "fkn-api-window", ze = { async *[Symbol.asyncIterator]() {
321
+ }, U = "fkn-api", Ae = "fkn-api-window", je = { async *[Symbol.asyncIterator]() {
361
322
  let e = await H();
362
323
  if (!e) {
363
324
  await new Promise(() => {});
364
325
  return;
365
326
  }
366
327
  if (!B()) {
367
- let n = new AbortController();
368
- V(() => n.abort());
369
- for await (let r of t({}, {
328
+ let t = new AbortController();
329
+ V(() => t.abort());
330
+ for await (let n of r({}, {
370
331
  key: U,
371
332
  transport: e,
372
- unregisterSignal: n.signal
333
+ unregisterSignal: t.signal
373
334
  })) {
374
- if (n.signal.aborted) break;
375
- yield r;
335
+ if (t.signal.aborted) break;
336
+ yield n;
376
337
  }
377
338
  }
378
- yield* t({}, {
379
- key: Re,
339
+ yield* r({}, {
340
+ key: Ae,
380
341
  transport: e
381
342
  });
382
- } }, W = !1, G = H().then((t) => new Promise((n) => {
383
- if (!t) return;
384
- let { receive: r } = t, i = (t) => {
385
- 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());
386
347
  };
387
348
  r.addEventListener("message", i);
388
- })), 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()))]) });
389
350
  V(() => K.retire());
390
- 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 {
391
352
  constructor(e, t) {
392
353
  super(`@fkn/lib: no broker connection within ${t}ms, so ${e} could not be requested`), this.name = "BrokerUnreachableError";
393
354
  }
@@ -396,23 +357,23 @@ var q = Promise.race([K.first, new Promise((e) => V(e))]).then(() => K.facade),
396
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";
397
358
  }
398
359
  }, Q = (e, t) => {
399
- let n = Y ? Be : J;
360
+ let n = Y ? Me : J;
400
361
  return Promise.race([e, new Promise((e, r) => setTimeout(() => {
401
362
  Y = !0, r(t(n));
402
363
  }, n))]);
403
- }, 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));
404
365
  V(() => {
405
366
  G.then(() => {
406
367
  let e = setTimeout(() => console.error(new Z()), J);
407
368
  K.routable().then(() => clearTimeout(e));
408
369
  });
409
370
  });
410
- 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;
411
372
  $((e) => {
412
- _e() && e.overlay.setHost(xe, {
413
- exactClips: ee(),
414
- colorScheme: m
373
+ ve() && e.overlay.setHost(Se, {
374
+ exactClips: ne(),
375
+ colorScheme: g
415
376
  }).catch(() => {});
416
377
  });
417
378
  //#endregion
418
- 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-BSk3dc_X.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-Di2Ff3jS.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 };