preact-missing-hooks 3.1.0 → 4.1.0

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 (82) hide show
  1. package/.husky/pre-commit +1 -0
  2. package/.husky/pre-push +1 -0
  3. package/.prettierignore +3 -0
  4. package/.prettierrc +6 -0
  5. package/Readme.md +333 -137
  6. package/dist/entry.cjs +21 -0
  7. package/dist/entry.js +2 -0
  8. package/dist/entry.js.map +1 -0
  9. package/dist/entry.modern.mjs +2 -0
  10. package/dist/entry.modern.mjs.map +1 -0
  11. package/dist/entry.module.js +2 -0
  12. package/dist/entry.module.js.map +1 -0
  13. package/dist/entry.umd.js +2 -0
  14. package/dist/entry.umd.js.map +1 -0
  15. package/dist/index.d.ts +14 -13
  16. package/dist/index.js +1 -1
  17. package/dist/index.js.map +1 -1
  18. package/dist/index.modern.mjs +2 -0
  19. package/dist/index.modern.mjs.map +1 -0
  20. package/dist/index.module.js +1 -1
  21. package/dist/index.module.js.map +1 -1
  22. package/dist/index.umd.js +1 -1
  23. package/dist/index.umd.js.map +1 -1
  24. package/dist/indexedDB/dbController.d.ts +2 -2
  25. package/dist/indexedDB/index.d.ts +6 -6
  26. package/dist/indexedDB/openDB.d.ts +1 -1
  27. package/dist/indexedDB/tableController.d.ts +1 -1
  28. package/dist/indexedDB/types.d.ts +1 -2
  29. package/dist/react.js +1 -0
  30. package/dist/react.modern.mjs +1 -0
  31. package/dist/react.module.js +1 -0
  32. package/dist/react.umd.js +1 -0
  33. package/dist/useEventBus.d.ts +1 -1
  34. package/dist/useIndexedDB.d.ts +3 -3
  35. package/dist/useLLMMetadata.d.ts +71 -0
  36. package/dist/useMutationObserver.d.ts +1 -1
  37. package/dist/useNetworkState.d.ts +3 -3
  38. package/dist/usePreferredTheme.d.ts +1 -1
  39. package/dist/useRageClick.d.ts +1 -1
  40. package/dist/useThreadedWorker.d.ts +1 -1
  41. package/dist/useTransition.d.ts +4 -1
  42. package/dist/useWorkerNotifications.d.ts +1 -1
  43. package/dist/useWrappedChildren.d.ts +3 -3
  44. package/docs/README.md +111 -0
  45. package/docs/index.html +58 -20
  46. package/docs/main.js +49 -0
  47. package/eslint.config.mjs +10 -0
  48. package/package.json +60 -6
  49. package/scripts/generate-entry.cjs +34 -0
  50. package/src/index.ts +14 -13
  51. package/src/indexedDB/dbController.ts +101 -92
  52. package/src/indexedDB/index.ts +16 -11
  53. package/src/indexedDB/openDB.ts +49 -49
  54. package/src/indexedDB/requestToPromise.ts +17 -16
  55. package/src/indexedDB/tableController.ts +331 -257
  56. package/src/indexedDB/types.ts +35 -35
  57. package/src/useClipboard.ts +99 -97
  58. package/src/useEventBus.ts +39 -36
  59. package/src/useIndexedDB.ts +111 -111
  60. package/src/useLLMMetadata.ts +418 -0
  61. package/src/useMutationObserver.ts +26 -26
  62. package/src/useNetworkState.ts +124 -122
  63. package/src/usePreferredTheme.ts +68 -68
  64. package/src/useRageClick.ts +103 -103
  65. package/src/useThreadedWorker.ts +165 -165
  66. package/src/useTransition.ts +22 -19
  67. package/src/useWasmCompute.ts +209 -204
  68. package/src/useWebRTCIP.ts +181 -176
  69. package/src/useWorkerNotifications.ts +28 -20
  70. package/src/useWrappedChildren.ts +72 -58
  71. package/tests/preact-as-react.ts +5 -0
  72. package/tests/react-adapter.tsx +12 -0
  73. package/tests/setup-react.ts +4 -0
  74. package/tests/useClipboard.test.tsx +4 -2
  75. package/tests/useLLMMetadata.test.tsx +149 -0
  76. package/tests/useThreadedWorker.test.tsx +3 -1
  77. package/tests/useWasmCompute.test.tsx +1 -1
  78. package/tests/useWebRTCIP.test.tsx +3 -1
  79. package/vite.config.ts +11 -4
  80. package/vitest.config.preact.ts +21 -0
  81. package/vitest.config.react.ts +36 -0
  82. package/vitest.workspace.ts +6 -0
package/dist/react.js ADDED
@@ -0,0 +1 @@
1
+ var e=require("react/hooks"),n=require("react"),r=new Map;function t(e,n){(null==n||n>e.length)&&(n=e.length);for(var r=0,t=Array(n);r<n;r++)t[r]=e[r];return t}function o(e,n){var r="undefined"!=typeof Symbol&&e[Symbol.iterator]||e["@@iterator"];if(r)return(r=r.call(e)).next.bind(r);if(Array.isArray(e)||(r=function(e,n){if(e){if("string"==typeof e)return t(e,n);var r={}.toString.call(e).slice(8,-1);return"Object"===r&&e.constructor&&(r=e.constructor.name),"Map"===r||"Set"===r?Array.from(e):"Arguments"===r||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(r)?t(e,n):void 0}}(e))||n&&e&&"number"==typeof e.length){r&&(e=r);var o=0;return function(){return o>=e.length?{done:!0}:{done:!1,value:e[o++]}}}throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}function u(){return u=Object.assign?Object.assign.bind():function(e){for(var n=1;n<arguments.length;n++){var r=arguments[n];for(var t in r)({}).hasOwnProperty.call(r,t)&&(e[t]=r[t])}return e},u.apply(null,arguments)}function i(){if("undefined"==typeof navigator)return{online:!0};var e={online:navigator.onLine},n=navigator.connection;return n&&(void 0!==n.effectiveType&&(e.effectiveType=n.effectiveType),void 0!==n.downlink&&(e.downlink=n.downlink),void 0!==n.rtt&&(e.rtt=n.rtt),void 0!==n.saveData&&(e.saveData=n.saveData),void 0!==n.type&&(e.connectionType=n.type)),e}function a(e,n){try{var r=e()}catch(e){return n(e)}return r&&r.then?r.then(void 0,n):r}var c=new Map;function s(e){return new Promise(function(n,r){e.onsuccess=function(){return n(e.result)},e.onerror=function(){var n;return r(null!=(n=e.error)?n:new DOMException("Unknown IndexedDB error"))}})}function l(e,n){return n?e.then(function(e){return null==n.onSuccess||n.onSuccess(e),e}).catch(function(e){throw null==n.onError||n.onError(e),e}):e}var f=/\b(?:25[0-5]|2[0-4]\d|1?\d{1,2})(?:\.(?:25[0-5]|2[0-4]\d|1?\d{1,2})){3}\b/g,d=["stun:stun.l.google.com:19302"];function v(e,n){if(null==e)return"";var r=("string"==typeof e?e:String(e)).trim();return r.length>n?r.slice(0,n):r}function p(e){if(!Array.isArray(e))return[];for(var n=[],r=0;r<e.length&&n.length<50;r++){var t=v(e[r],100);t&&n.push(t)}return n}function m(e){var n=v(e,2048);if(!n)return"";try{var r=new URL(n);if("http:"===r.protocol||"https:"===r.protocol)return n}catch(e){}return""}function g(e){try{if("undefined"==typeof window)return!1;var n=window.getComputedStyle(e);return"none"!==n.display&&"hidden"!==n.visibility&&"0"!==n.opacity}catch(e){return!1}}function h(e){var n={};try{for(var r,t=o(Object.keys(e).slice(0,20));!(r=t()).done;){var u=r.value,i=v(u,50);if(i){var a=e[u];"string"==typeof a?n[i]=a.slice(0,500):"number"==typeof a&&Number.isFinite(a)||"boolean"==typeof a?n[i]=a:Array.isArray(a)&&(n[i]=a.map(function(e){return v(e,200)}).filter(Boolean).slice(0,20))}}}catch(e){}return n}function y(){try{if("undefined"==typeof document||!document.querySelectorAll)return;document.querySelectorAll('script[data-llm="true"]').forEach(function(e){return e.remove()})}catch(e){}}exports.useClipboard=function(n){void 0===n&&(n={});var r=n.resetDelay,t=void 0===r?2e3:r,o=e.useState(!1),u=o[0],i=o[1],c=e.useState(null),s=c[0],l=c[1],f=e.useCallback(function(){i(!1),l(null)},[]);return{copy:e.useCallback(function(e){try{if(l(null),"undefined"==typeof navigator||!navigator.clipboard){var n=new Error("Clipboard API is not available");return l(n),Promise.resolve(!1)}return Promise.resolve(a(function(){return Promise.resolve(navigator.clipboard.writeText(e)).then(function(){return i(!0),t>0&&setTimeout(function(){return i(!1)},t),!0})},function(e){var n=e instanceof Error?e:new Error(String(e));return l(n),!1}))}catch(e){return Promise.reject(e)}},[t]),paste:e.useCallback(function(){try{if(l(null),"undefined"==typeof navigator||!navigator.clipboard){var e=new Error("Clipboard API is not available");return l(e),Promise.resolve("")}return Promise.resolve(a(function(){return Promise.resolve(navigator.clipboard.readText())},function(e){var n=e instanceof Error?e:new Error(String(e));return l(n),""}))}catch(e){return Promise.reject(e)}},[]),copied:u,error:s,reset:f}},exports.useEventBus=function(){return{emit:e.useCallback(function(e){var n=arguments,t=r.get(e);t&&t.forEach(function(e){return e.apply(void 0,[].slice.call(n,1))})},[]),on:e.useCallback(function(e,n){var t=r.get(e);return t||(t=new Set,r.set(e,t)),t.add(n),function(){t.delete(n),0===t.size&&r.delete(e)}},[])}},exports.useIndexedDB=function(n){var r=e.useState(null),t=r[0],i=r[1],a=e.useState(null),f=a[0],d=a[1],v=e.useState(!1),p=v[0],m=v[1],g=e.useRef(n);return g.current=n,e.useEffect(function(){var e=!1;d(null),m(!1),i(null);var n=g.current;return function(e){var n=e.name+"_v"+e.version,r=c.get(n);return r||(r=function(e){return new Promise(function(n,r){var t=indexedDB.open(e.name,e.version);t.onerror=function(){var e;return r(null!=(e=t.error)?e:new DOMException("Failed to open database"))},t.onsuccess=function(){return n(t.result)},t.onupgradeneeded=function(n){for(var r=n.target.result,t=e.tables,u=0,i=Object.keys(t);u<i.length;u++){var a=i[u],c=t[a];if(!r.objectStoreNames.contains(a)){var s,l=r.createObjectStore(a,{keyPath:c.keyPath,autoIncrement:null!=(s=c.autoIncrement)&&s});if(c.indexes)for(var f,d=o(c.indexes);!(f=d()).done;){var v=f.value;l.createIndex(v,v,{unique:!1})}}}}})}(e),c.set(n,r),r)}({name:n.name,version:n.version,tables:n.tables}).then(function(n){if(e)n.close();else{var r=function(e){return{get db(){return e},hasTable:function(n){return e.objectStoreNames.contains(n)},table:function(n){return function(e,n){return function(e,n){function r(r){return e.transaction([n],r).objectStore(n)}return{insert:function(e,n){return l(s(r("readwrite").add(e)),n)},update:function(e,n,t){var o=r("readwrite");return l(s(o.get(e)).then(function(e){if(void 0===e)throw new DOMException("Key not found","NotFoundError");var r=u({},e,n);return s(o.put(r))}).then(function(){}),t)},delete:function(e,n){return l(s(r("readwrite").delete(e)).then(function(){}),n)},exists:function(e){return s(r("readonly").getKey(e)).then(function(e){return void 0!==e})},query:function(e,n){var t=r("readonly").openCursor(),o=[];return l(new Promise(function(n,r){t.onsuccess=function(){var r=t.result;r?(e(r.value)&&o.push(r.value),r.continue()):n(o)},t.onerror=function(){var e;return r(null!=(e=t.error)?e:new DOMException("Unknown error"))}}),n)},upsert:function(e,n){return l(s(r("readwrite").put(e)),n)},bulkInsert:function(e,n){var t=r("readwrite"),o=[];if(0===e.length)return l(Promise.resolve(o),n);var u=0;return l(new Promise(function(n,r){e.forEach(function(i,a){var c=t.add(i);c.onsuccess=function(){o[a]=c.result,++u===e.length&&n(o)},c.onerror=function(){var e;return r(null!=(e=c.error)?e:new DOMException("Unknown error"))}})}),n)},clear:function(e){return l(s(r("readwrite").clear()).then(function(){}),e)},count:function(e){return l(s(r("readonly").count()),null!=e?e:{})}}}(e,n)}(e,n)},transaction:function(n,r,t,o){var i=e.transaction(n,r),a={table:function(e){return function(e,n){return function(e,n){function r(){return e.objectStore(n)}return{insert:function(e,n){return l(s(r().add(e)),n)},update:function(e,n,t){var o=r();return l(s(o.get(e)).then(function(e){if(void 0===e)throw new DOMException("Key not found","NotFoundError");var r=u({},e,n);return s(o.put(r))}).then(function(){}),t)},delete:function(e,n){return l(s(r().delete(e)).then(function(){}),n)},exists:function(e){return s(r().getKey(e)).then(function(e){return void 0!==e})},query:function(e,n){var t=r().openCursor(),o=[];return l(new Promise(function(n,r){t.onsuccess=function(){var r=t.result;r?(e(r.value)&&o.push(r.value),r.continue()):n(o)},t.onerror=function(){var e;return r(null!=(e=t.error)?e:new DOMException("Unknown error"))}}),n)},upsert:function(e,n){return l(s(r().put(e)),n)},bulkInsert:function(e,n){var t=r(),o=[];if(0===e.length)return l(Promise.resolve(o),n);var u=0;return l(new Promise(function(n,r){e.forEach(function(i,a){var c=t.add(i);c.onsuccess=function(){o[a]=c.result,++u===e.length&&n(o)},c.onerror=function(){var e;return r(null!=(e=c.error)?e:new DOMException("Unknown error"))}})}),n)},clear:function(e){return l(s(r().clear()).then(function(){}),e)},count:function(e){return l(s(r().count()),null!=e?e:{})}}}(e,n)}(i,e)}},c=new Promise(function(e,n){i.oncomplete=function(){return e()},i.onerror=function(){var e;return n(null!=(e=i.error)?e:new DOMException("Transaction failed"))}}),f=t(a);return function(e,n){return n?e.then(function(){return null==n.onSuccess?void 0:n.onSuccess()}).catch(function(e){throw null==n.onError||n.onError(e),e}):e}(Promise.resolve(f).then(function(){return c}),o)}}}(n);i(r),m(!0)}}).catch(function(n){e||d(n)}),function(){e=!0}},[n.name,n.version]),{db:t,isReady:p,error:f}},exports.useLLMMetadata=function(e){var r=n.useRef(null);n.useEffect(function(){try{if("undefined"==typeof window)return;var n=function(e){return null==e||"object"!=typeof e?{route:"/"}:{route:v(e.route,2048)||"/",mode:"auto-extract"===e.mode?"auto-extract":"manual",title:void 0!==e.title?v(e.title,200):void 0,description:void 0!==e.description?v(e.description,2e3):void 0,tags:void 0!==e.tags?p(e.tags):void 0,canonicalUrl:void 0!==e.canonicalUrl?m(e.canonicalUrl):void 0,language:void 0!==e.language?v(e.language,20):void 0,ogType:void 0!==e.ogType?v(e.ogType,50):void 0,ogImage:void 0!==e.ogImage?m(e.ogImage):void 0,ogImageAlt:void 0!==e.ogImageAlt?v(e.ogImageAlt,200):void 0,siteName:void 0!==e.siteName?v(e.siteName,100):void 0,author:void 0!==e.author?v(e.author,200):void 0,publishedTime:void 0!==e.publishedTime?v(e.publishedTime,50):void 0,modifiedTime:void 0!==e.modifiedTime?v(e.modifiedTime,50):void 0,robots:void 0!==e.robots?v(e.robots,100):void 0,extra:void 0===e.extra||"object"!=typeof e.extra||Array.isArray(e.extra)?void 0:h(e.extra)}}(e),t=function(e){try{var n=(new Date).toISOString(),r={route:e.route,generatedAt:n};if("auto-extract"===e.mode){var t,u,i=function(){var e={title:"",outline:[],description:""};try{if("undefined"==typeof document)return e;var n=v(document.title,200),r=[],t="";try{for(var u,i=document.querySelectorAll("nav, footer, [role='navigation'], [role='contentinfo'], script, style, noscript"),a=function(e){for(var n,r=o(i);!(n=r()).done;)if(n.value.contains(e))return!0;return!1},c=o(document.querySelectorAll("h1, h2"));!(u=c()).done;){var s=u.value;if(r.length>=50)break;if(g(s)&&!a(s)){var l=v(s.textContent,300);l&&r.push(l)}}for(var f,d=document.querySelectorAll("p"),p=[],m=o(d);!(f=m()).done;){var h=f.value;if(p.length>=3)break;if(g(h)&&!a(h)){var y=v(h.textContent,1e3);y&&p.push(y)}}t=p.join(" ").trim().slice(0,2e3)||""}catch(e){}return{title:n,outline:r,description:t}}catch(n){return e}}();r.title=(null!=(t=e.title)?t:i.title)||void 0,r.description=(null!=(u=e.description)?u:i.description)||void 0,i.outline.length>0&&(r.outline=i.outline)}else void 0!==e.title&&""!==e.title&&(r.title=e.title),void 0!==e.description&&""!==e.description&&(r.description=e.description);return e.tags&&e.tags.length>0&&(r.tags=e.tags),e.canonicalUrl&&(r.canonicalUrl=e.canonicalUrl),e.language&&(r.language=e.language),e.ogType&&(r.ogType=e.ogType),e.ogImage&&(r.ogImage=e.ogImage),e.ogImageAlt&&(r.ogImageAlt=e.ogImageAlt),e.siteName&&(r.siteName=e.siteName),e.author&&(r.author=e.author),e.publishedTime&&(r.publishedTime=e.publishedTime),e.modifiedTime&&(r.modifiedTime=e.modifiedTime),e.robots&&(r.robots=e.robots),e.extra&&Object.keys(e.extra).length>0&&(r.extra=e.extra),r}catch(n){var a;return{route:null!=(a=null==e?void 0:e.route)?a:"/",generatedAt:(new Date).toISOString()}}}(n),u=JSON.stringify(t);if(r.current===u)return;return r.current=u,y(),function(e){try{if("undefined"==typeof document||!document.head)return;var n=document.createElement("script");n.type="application/llm+json",n.setAttribute("data-llm","true"),n.textContent=JSON.stringify(e),document.head.appendChild(n)}catch(e){}}(t),function(){y(),r.current=null}}catch(e){}},[null==e?void 0:e.route,null==e?void 0:e.mode,null==e?void 0:e.title,null==e?void 0:e.description,null==e?void 0:e.tags,null==e?void 0:e.canonicalUrl,null==e?void 0:e.language,null==e?void 0:e.ogType,null==e?void 0:e.ogImage,null==e?void 0:e.ogImageAlt,null==e?void 0:e.siteName,null==e?void 0:e.author,null==e?void 0:e.publishedTime,null==e?void 0:e.modifiedTime,null==e?void 0:e.robots])},exports.useMutationObserver=function(n,r,t){e.useEffect(function(){var e=n.current;if(e){var o=new MutationObserver(r);return o.observe(e,t),function(){return o.disconnect()}}},[n,r,t])},exports.useNetworkState=function(){var n=e.useState(i),r=n[0],t=n[1];return e.useEffect(function(){if("undefined"!=typeof window){var e=function(){return t(i())};window.addEventListener("online",e),window.addEventListener("offline",e);var n=navigator.connection;return null!=n&&n.addEventListener&&n.addEventListener("change",e),function(){window.removeEventListener("online",e),window.removeEventListener("offline",e),null!=n&&n.removeEventListener&&n.removeEventListener("change",e)}}},[]),r},exports.usePreferredTheme=function(){var n=e.useState(function(){if("undefined"==typeof window)return"no-preference";var e=window.matchMedia("(prefers-color-scheme: dark)"),n=window.matchMedia("(prefers-color-scheme: light)");return e.matches?"dark":n.matches?"light":"no-preference"}),r=n[0],t=n[1];return e.useEffect(function(){if("undefined"!=typeof window){var e=window.matchMedia("(prefers-color-scheme: dark)"),n=function(e){t(e.matches?"dark":"light")},r=function(){var e=window.matchMedia("(prefers-color-scheme: dark)"),n=window.matchMedia("(prefers-color-scheme: light)");t(e.matches?"dark":n.matches?"light":"no-preference")};e.addEventListener("change",n);var o=window.matchMedia("(prefers-color-scheme: light)");return o.addEventListener("change",r),function(){e.removeEventListener("change",n),o.removeEventListener("change",r)}}},[]),r},exports.useRageClick=function(n,r){var t=r.onRageClick,o=r.threshold,u=void 0===o?5:o,i=r.timeWindow,a=void 0===i?1e3:i,c=r.distanceThreshold,s=void 0===c?30:c,l=e.useRef(t);l.current=t;var f=e.useRef([]);e.useEffect(function(){var e=n.current;if(e){var r=function(e){var n=Date.now(),r={time:n,x:e.clientX,y:e.clientY},t=n-a,o=f.current.filter(function(e){return e.time>=t});if(o.push(r),Infinity!==s){var i=o.filter(function(e){return n=e,t=r,Math.hypot(t.x-n.x,t.y-n.y)<=s;var n,t});if(i.length>=u)return l.current({count:i.length,event:e}),void(f.current=[])}else if(o.length>=u)return l.current({count:o.length,event:e}),void(f.current=[]);f.current=o};return e.addEventListener("click",r),function(){return e.removeEventListener("click",r)}}},[n,u,a,s])},exports.useThreadedWorker=function(n,r){var t=r.concurrency,o="sequential"===r.mode?1:Math.max(1,void 0===t?4:t),u=e.useState(!1),i=u[0],a=u[1],c=e.useState(void 0),s=c[0],l=c[1],f=e.useState(void 0),d=f[0],v=f[1],p=e.useState(0),m=p[0],g=p[1],h=e.useRef([]),y=e.useRef(0),w=e.useRef(0),b=e.useRef(!1),k=e.useRef(n);k.current=n;var S=e.useCallback(function(){g(h.current.length+w.current)},[]),E=e.useCallback(function(){if(!(b.current||w.current>=o)){if(0===h.current.length)return 0===w.current&&a(!1),void S();h.current.sort(function(e,n){return e.priority!==n.priority?e.priority-n.priority:e.sequence-n.sequence});var e=h.current.shift();w.current+=1,a(!0),S(),(0,k.current)(e.data).then(function(n){l(n),v(void 0),e.resolve(n)}).catch(function(n){v(n),e.reject(n)}).finally(function(){w.current-=1,S(),E()}),h.current.length>0&&w.current<o&&E()}},[o,S]),x=e.useCallback(function(e,n){var r;if(b.current)return Promise.reject(new Error("Worker is terminated"));var t=null!=(r=null==n?void 0:n.priority)?r:1,o=++y.current,u=new Promise(function(n,r){h.current.push({data:e,priority:t,sequence:o,resolve:n,reject:r})});return S(),a(!0),queueMicrotask(E),u},[E,S]),T=e.useCallback(function(){var e=h.current;h.current=[],e.forEach(function(e){return e.reject(new Error("Task cleared from queue"))}),S(),0===w.current&&a(!1)},[S]),C=e.useCallback(function(){b.current=!0,T()},[T]);return e.useEffect(function(){return function(){b.current=!0}},[]),{run:x,loading:i,result:s,error:d,queueSize:m,clearQueue:T,terminate:C}},exports.useTransition=function(){var n=e.useState(!1),r=n[0],t=n[1];return[e.useCallback(function(e){t(!0),Promise.resolve().then(function(){e(),t(!1)})},[]),r]},exports.useWasmCompute=function(n){var r=n.wasmUrl,t=n.exportName,o=void 0===t?"compute":t,u=n.workerUrl,i=n.importObject,a=e.useState(void 0),c=a[0],s=a[1],l=e.useState(!0),f=l[0],d=l[1],v=e.useState(null),p=v[0],m=v[1],g=e.useState(!1),h=g[0],y=g[1],w=e.useRef(null),b=e.useRef(null),k=e.useRef(null);return e.useEffect(function(){if("undefined"==typeof window)return m("useWasmCompute is not available during SSR"),void d(!1);if("undefined"==typeof Worker)return m("Worker is not supported in this environment"),void d(!1);if("undefined"==typeof WebAssembly||"function"!=typeof WebAssembly.instantiate)return m("WebAssembly is not supported in this environment"),void d(!1);m(null),y(!1);var e=function(e){if(e)return new Worker(e);var n=new Blob(["\nself.onmessage = async (e) => {\n const d = e.data;\n if (d.type === 'init') {\n try {\n const res = await fetch(d.wasmUrl);\n const buf = await res.arrayBuffer();\n const mod = await WebAssembly.instantiate(buf, d.importObject || {});\n self.wasmInstance = mod.instance;\n self.exportName = d.exportName || 'compute';\n self.postMessage({ type: 'ready' });\n } catch (err) {\n self.postMessage({ type: 'error', error: (err && err.message) || String(err) });\n }\n return;\n }\n if (d.type === 'compute') {\n try {\n const fn = self.wasmInstance.exports[self.exportName];\n if (typeof fn !== 'function') {\n self.postMessage({ type: 'error', error: 'Export \"' + self.exportName + '\" is not a function' });\n return;\n }\n const result = fn(d.input);\n self.postMessage({ type: 'result', result: result });\n } catch (err) {\n self.postMessage({ type: 'error', error: (err && err.message) || String(err) });\n }\n }\n};\n"],{type:"application/javascript"}),r=URL.createObjectURL(n),t=new Worker(r);return URL.revokeObjectURL(r),t}(u);w.current=e;var n=function(e){var n,r=null!=(n=e.data)?n:{},t=r.type,o=r.result,u=r.error;return"ready"===t?(y(!0),void d(!1)):"error"===t?(m(null!=u?u:"Unknown error"),d(!1),void(k.current&&(k.current(new Error(u)),b.current=null,k.current=null))):void("result"===t&&(s(o),d(!1),b.current&&(b.current(o),b.current=null,k.current=null)))};return e.addEventListener("message",n),e.postMessage({type:"init",wasmUrl:r,exportName:o,importObject:null!=i?i:{}}),function(){e.removeEventListener("message",n),e.terminate(),w.current=null,k.current&&(k.current(new Error("Worker terminated")),b.current=null,k.current=null)}},[r,o,u,i]),{compute:e.useCallback(function(e){return new Promise(function(n,r){w.current&&h?p?r(new Error(p)):(b.current=n,k.current=r,d(!0),w.current.postMessage({type:"compute",input:e})):r(new Error("WASM not ready"))})},[h,p]),result:c,loading:f,error:p,ready:h}},exports.useWebRTCIP=function(n){void 0===n&&(n={});var r=n.stunServers,t=void 0===r?d:r,o=n.timeout,u=void 0===o?3e3:o,i=n.onDetect,a=e.useState([]),c=a[0],s=a[1],l=e.useState(!0),v=l[0],p=l[1],m=e.useState(null),g=m[0],h=m[1],y=e.useRef(null),w=e.useRef(null),b=e.useRef(new Set),k=e.useRef(i);return k.current=i,e.useEffect(function(){if("undefined"==typeof window)return p(!1),void h("WebRTC IP detection is not available during SSR");if("undefined"==typeof RTCPeerConnection)return p(!1),void h("RTCPeerConnection is not available");var e=new Set;b.current=e;var n=function(){w.current&&(clearTimeout(w.current),w.current=null),y.current&&(y.current.close(),y.current=null),p(!1)},r=function(n){e.has(n)||(e.add(n),s(function(e){return[].concat(e,[n])}),null==k.current||k.current(n))};try{var o=new RTCPeerConnection({iceServers:[{urls:t}]});y.current=o,o.onicecandidate=function(e){var n,t=e.candidate;t&&t.candidate&&((n=t.candidate.match(f))?[].concat(n):[]).forEach(r)},o.createDataChannel(""),o.createOffer().then(function(e){return o.setLocalDescription(e)}).catch(function(e){h(e instanceof Error?e.message:"Failed to create offer"),n()}),w.current=setTimeout(function(){return n()},u)}catch(e){h(e instanceof Error?e.message:"WebRTC setup failed"),n()}return function(){n()}},[t.join(","),u]),{ips:c,loading:v,error:g}},exports.useWorkerNotifications=function(n,r){void 0===r&&(r={});var t=r.maxHistory,o=void 0===t?100:t,u=r.throughputWindowMs,i=void 0===u?1e3:u,a=e.useState([]),c=a[0],s=a[1],l=e.useState(0),f=l[0],d=l[1],v=e.useState(0),p=v[0],m=v[1],g=e.useState([]),h=g[0],y=g[1],w=e.useState(0),b=w[0],k=w[1],S=e.useRef([]),E=e.useRef(0),x=e.useRef(0);e.useEffect(function(){if(n){var e=function(e){var n=function(e){if(null==e||"object"!=typeof e)return null;var n=e.type;return"task_start"!==n&&"task_end"!==n&&"task_fail"!==n&&"queue_size"!==n?null:{type:n,taskId:"string"==typeof e.taskId?e.taskId:void 0,duration:"number"==typeof e.duration?e.duration:void 0,error:"string"==typeof e.error?e.error:void 0,size:"number"==typeof e.size?e.size:void 0,timestamp:Date.now()}}(e.data);if(n)if(y(function(e){return[].concat(e,[n]).slice(-o)}),"task_start"===n.type&&n.taskId)s(function(e){return e.includes(n.taskId)?e:[].concat(e,[n.taskId])});else if("task_end"===n.type){n.taskId&&s(function(e){return e.filter(function(e){return e!==n.taskId})}),d(function(e){return e+1});var r=Date.now()-i;S.current=[].concat(S.current.filter(function(e){return e>=r}),[n.timestamp]),"number"==typeof n.duration&&(E.current+=n.duration,x.current+=1)}else"task_fail"===n.type?(n.taskId&&s(function(e){return e.filter(function(e){return e!==n.taskId})}),m(function(e){return e+1})):"queue_size"===n.type&&"number"==typeof n.size&&k(n.size)};return n.addEventListener("message",e),function(){return n.removeEventListener("message",e)}}},[n,o]);var T=e.useMemo(function(){var e=x.current;return e>0?E.current/e:0},[h]),C=e.useMemo(function(){var e=Date.now()-i;return S.current.filter(function(n){return n>=e}).length/(i/1e3)},[h,i]),I=e.useMemo(function(){return{runningTasks:c,completedCount:f,failedCount:p,averageDurationMs:T,throughputPerSecond:C,currentQueueSize:b,totalProcessed:f+p,recentEventCount:h.length}},[c,f,p,T,C,b,h.length]);return{runningTasks:c,completedCount:f,failedCount:p,eventHistory:h,averageDurationMs:T,throughputPerSecond:C,currentQueueSize:b,progress:I}},exports.useWrappedChildren=function(r,t,o){return void 0===o&&(o="preserve"),e.useMemo(function(){if(!r)return r;var e=function(e){if(!n.isValidElement(e))return e;var r,i=e.props||{};r="override"===o?u({},i,t):u({},t,i);var a=null==i?void 0:i.style,c=null==t?void 0:t.style;return a&&c&&"object"==typeof a&&"object"==typeof c&&(r.style="override"===o?u({},a,c):u({},c,a)),n.cloneElement(e,r)};return Array.isArray(r)?r.map(e):e(r)},[r,t,o])};
@@ -0,0 +1 @@
1
+ import{useState as e,useCallback as t,useEffect as n,useMemo as r,useRef as o}from"react/hooks";import{isValidElement as i,cloneElement as u,useRef as c,useEffect as s}from"react";function a(){const[n,r]=e(!1);return[t(e=>{r(!0),Promise.resolve().then(()=>{e(),r(!1)})},[]),n]}function l(e,t,r){n(()=>{const n=e.current;if(!n)return;const o=new MutationObserver(t);return o.observe(n,r),()=>o.disconnect()},[e,t,r])}const d=new Map;function f(){return{emit:t((e,...t)=>{const n=d.get(e);n&&n.forEach(e=>e(...t))},[]),on:t((e,t)=>{let n=d.get(e);return n||(n=new Set,d.set(e,n)),n.add(t),()=>{n.delete(t),0===n.size&&d.delete(e)}},[])}}function p(){return p=Object.assign?Object.assign.bind():function(e){for(var t=1;t<arguments.length;t++){var n=arguments[t];for(var r in n)({}).hasOwnProperty.call(n,r)&&(e[r]=n[r])}return e},p.apply(null,arguments)}function m(e,t,n="preserve"){return r(()=>{if(!e)return e;const r=e=>{if(!i(e))return e;const r=e.props||{};let o;o="override"===n?p({},r,t):p({},t,r);const c=null==r?void 0:r.style,s=null==t?void 0:t.style;return c&&s&&"object"==typeof c&&"object"==typeof s&&(o.style="override"===n?p({},c,s):p({},s,c)),u(e,o)};return Array.isArray(e)?e.map(r):r(e)},[e,t,n])}function v(){const[t,r]=e(()=>{if("undefined"==typeof window)return"no-preference";const e=window.matchMedia("(prefers-color-scheme: dark)"),t=window.matchMedia("(prefers-color-scheme: light)");return e.matches?"dark":t.matches?"light":"no-preference"});return n(()=>{if("undefined"==typeof window)return;const e=window.matchMedia("(prefers-color-scheme: dark)"),t=e=>{r(e.matches?"dark":"light")},n=()=>{const e=window.matchMedia("(prefers-color-scheme: dark)"),t=window.matchMedia("(prefers-color-scheme: light)");r(e.matches?"dark":t.matches?"light":"no-preference")};e.addEventListener("change",t);const o=window.matchMedia("(prefers-color-scheme: light)");return o.addEventListener("change",n),()=>{e.removeEventListener("change",t),o.removeEventListener("change",n)}},[]),t}function g(){if("undefined"==typeof navigator)return{online:!0};const e={online:navigator.onLine},t=navigator.connection;return t&&(void 0!==t.effectiveType&&(e.effectiveType=t.effectiveType),void 0!==t.downlink&&(e.downlink=t.downlink),void 0!==t.rtt&&(e.rtt=t.rtt),void 0!==t.saveData&&(e.saveData=t.saveData),void 0!==t.type&&(e.connectionType=t.type)),e}function h(){const[t,r]=e(g);return n(()=>{if("undefined"==typeof window)return;const e=()=>r(g());window.addEventListener("online",e),window.addEventListener("offline",e);const t=navigator.connection;return null!=t&&t.addEventListener&&t.addEventListener("change",e),()=>{window.removeEventListener("online",e),window.removeEventListener("offline",e),null!=t&&t.removeEventListener&&t.removeEventListener("change",e)}},[]),t}function y(n={}){const{resetDelay:r=2e3}=n,[o,i]=e(!1),[u,c]=e(null),s=t(()=>{i(!1),c(null)},[]);return{copy:t(async e=>{if(c(null),"undefined"==typeof navigator||!navigator.clipboard){const e=new Error("Clipboard API is not available");return c(e),!1}try{return await navigator.clipboard.writeText(e),i(!0),r>0&&setTimeout(()=>i(!1),r),!0}catch(e){const t=e instanceof Error?e:new Error(String(e));return c(t),!1}},[r]),paste:t(async()=>{if(c(null),"undefined"==typeof navigator||!navigator.clipboard){const e=new Error("Clipboard API is not available");return c(e),""}try{return await navigator.clipboard.readText()}catch(e){const t=e instanceof Error?e:new Error(String(e));return c(t),""}},[]),copied:o,error:u,reset:s}}function w(e,t){const{onRageClick:r,threshold:i=5,timeWindow:u=1e3,distanceThreshold:c=30}=t,s=o(r);s.current=r;const a=o([]);n(()=>{const t=e.current;if(!t)return;const n=e=>{const t=Date.now(),n={time:t,x:e.clientX,y:e.clientY},r=t-u,o=a.current.filter(e=>e.time>=r);if(o.push(n),Infinity!==c){const t=o.filter(e=>{return t=e,r=n,Math.hypot(r.x-t.x,r.y-t.y)<=c;var t,r});if(t.length>=i)return s.current({count:t.length,event:e}),void(a.current=[])}else if(o.length>=i)return s.current({count:o.length,event:e}),void(a.current=[]);a.current=o};return t.addEventListener("click",n),()=>t.removeEventListener("click",n)},[e,i,u,c])}function b(r,i){const{mode:u,concurrency:c=4}=i,s="sequential"===u?1:Math.max(1,c),[a,l]=e(!1),[d,f]=e(void 0),[p,m]=e(void 0),[v,g]=e(0),h=o([]),y=o(0),w=o(0),b=o(!1),E=o(r);E.current=r;const k=t(()=>{g(h.current.length+w.current)},[]),x=t(()=>{if(b.current)return;if(w.current>=s)return;if(0===h.current.length)return 0===w.current&&l(!1),void k();h.current.sort((e,t)=>e.priority!==t.priority?e.priority-t.priority:e.sequence-t.sequence);const e=h.current.shift();w.current+=1,l(!0),k(),(0,E.current)(e.data).then(t=>{f(t),m(void 0),e.resolve(t)}).catch(t=>{m(t),e.reject(t)}).finally(()=>{w.current-=1,k(),x()}),h.current.length>0&&w.current<s&&x()},[s,k]),S=t((e,t)=>{var n;if(b.current)return Promise.reject(new Error("Worker is terminated"));const r=null!=(n=null==t?void 0:t.priority)?n:1,o=++y.current,i=new Promise((t,n)=>{h.current.push({data:e,priority:r,sequence:o,resolve:t,reject:n})});return k(),l(!0),queueMicrotask(x),i},[x,k]),T=t(()=>{const e=h.current;h.current=[],e.forEach(e=>e.reject(new Error("Task cleared from queue"))),k(),0===w.current&&l(!1)},[k]),I=t(()=>{b.current=!0,T()},[T]);return n(()=>()=>{b.current=!0},[]),{run:S,loading:a,result:d,error:p,queueSize:v,clearQueue:T,terminate:I}}const E=new Map;function k(e){return new Promise((t,n)=>{e.onsuccess=()=>t(e.result),e.onerror=()=>{var t;return n(null!=(t=e.error)?t:new DOMException("Unknown IndexedDB error"))}})}function x(e,t){return t?e.then(e=>(null==t.onSuccess||t.onSuccess(e),e)).catch(e=>{throw null==t.onError||t.onError(e),e}):e}function S(t){const[r,i]=e(null),[u,c]=e(null),[s,a]=e(!1),l=o(t);return l.current=t,n(()=>{let e=!1;c(null),a(!1),i(null);const{name:t,version:n,tables:r}=l.current;return function(e){const t=`${e.name}_v${e.version}`;let n=E.get(t);return n||(n=function(e){return new Promise((t,n)=>{const r=indexedDB.open(e.name,e.version);r.onerror=()=>{var e;return n(null!=(e=r.error)?e:new DOMException("Failed to open database"))},r.onsuccess=()=>t(r.result),r.onupgradeneeded=t=>{const n=t.target.result,r=e.tables;for(const e of Object.keys(r)){const t=r[e];if(!n.objectStoreNames.contains(e)){var o;const r=n.createObjectStore(e,{keyPath:t.keyPath,autoIncrement:null!=(o=t.autoIncrement)&&o});if(t.indexes)for(const e of t.indexes)r.createIndex(e,e,{unique:!1})}}}})}(e),E.set(t,n),n)}({name:t,version:n,tables:r}).then(t=>{if(e)return void t.close();const n=function(e){return{get db(){return e},hasTable:t=>e.objectStoreNames.contains(t),table:t=>function(e,t){return function(e,t){function n(n){return e.transaction([t],n).objectStore(t)}return{insert:(e,t)=>x(k(n("readwrite").add(e)),t),update(e,t,r){const o=n("readwrite");return x(k(o.get(e)).then(e=>{if(void 0===e)throw new DOMException("Key not found","NotFoundError");const n=p({},e,t);return k(o.put(n))}).then(()=>{}),r)},delete:(e,t)=>x(k(n("readwrite").delete(e)).then(()=>{}),t),exists:e=>k(n("readonly").getKey(e)).then(e=>void 0!==e),query(e,t){const r=n("readonly").openCursor(),o=[];return x(new Promise((t,n)=>{r.onsuccess=()=>{const n=r.result;n?(e(n.value)&&o.push(n.value),n.continue()):t(o)},r.onerror=()=>{var e;return n(null!=(e=r.error)?e:new DOMException("Unknown error"))}}),t)},upsert:(e,t)=>x(k(n("readwrite").put(e)),t),bulkInsert(e,t){const r=n("readwrite"),o=[];if(0===e.length)return x(Promise.resolve(o),t);let i=0;return x(new Promise((t,n)=>{e.forEach((u,c)=>{const s=r.add(u);s.onsuccess=()=>{o[c]=s.result,i++,i===e.length&&t(o)},s.onerror=()=>{var e;return n(null!=(e=s.error)?e:new DOMException("Unknown error"))}})}),t)},clear:e=>x(k(n("readwrite").clear()).then(()=>{}),e),count:e=>x(k(n("readonly").count()),null!=e?e:{})}}(e,t)}(e,t),transaction(t,n,r,o){const i=e.transaction(t,n),u={table:e=>function(e,t){return function(e,t){function n(){return e.objectStore(t)}return{insert:(e,t)=>x(k(n().add(e)),t),update(e,t,r){const o=n();return x(k(o.get(e)).then(e=>{if(void 0===e)throw new DOMException("Key not found","NotFoundError");const n=p({},e,t);return k(o.put(n))}).then(()=>{}),r)},delete:(e,t)=>x(k(n().delete(e)).then(()=>{}),t),exists:e=>k(n().getKey(e)).then(e=>void 0!==e),query(e,t){const r=n().openCursor(),o=[];return x(new Promise((t,n)=>{r.onsuccess=()=>{const n=r.result;n?(e(n.value)&&o.push(n.value),n.continue()):t(o)},r.onerror=()=>{var e;return n(null!=(e=r.error)?e:new DOMException("Unknown error"))}}),t)},upsert:(e,t)=>x(k(n().put(e)),t),bulkInsert(e,t){const r=n(),o=[];if(0===e.length)return x(Promise.resolve(o),t);let i=0;return x(new Promise((t,n)=>{e.forEach((u,c)=>{const s=r.add(u);s.onsuccess=()=>{o[c]=s.result,i++,i===e.length&&t(o)},s.onerror=()=>{var e;return n(null!=(e=s.error)?e:new DOMException("Unknown error"))}})}),t)},clear:e=>x(k(n().clear()).then(()=>{}),e),count:e=>x(k(n().count()),null!=e?e:{})}}(e,t)}(i,e)},c=new Promise((e,t)=>{i.oncomplete=()=>e(),i.onerror=()=>{var e;return t(null!=(e=i.error)?e:new DOMException("Transaction failed"))}}),s=r(u);return function(e,t){return t?e.then(()=>null==t.onSuccess?void 0:t.onSuccess()).catch(e=>{throw null==t.onError||t.onError(e),e}):e}(Promise.resolve(s).then(()=>c),o)}}}(t);i(n),a(!0)}).catch(t=>{e||c(t)}),()=>{e=!0}},[t.name,t.version]),{db:r,isReady:s,error:u}}const T=/\b(?:25[0-5]|2[0-4]\d|1?\d{1,2})(?:\.(?:25[0-5]|2[0-4]\d|1?\d{1,2})){3}\b/g,I=["stun:stun.l.google.com:19302"],M=3e3;function A(t={}){const{stunServers:r=I,timeout:i=M,onDetect:u}=t,[c,s]=e([]),[a,l]=e(!0),[d,f]=e(null),p=o(null),m=o(null),v=o(new Set),g=o(u);return g.current=u,n(()=>{if("undefined"==typeof window)return l(!1),void f("WebRTC IP detection is not available during SSR");if("undefined"==typeof RTCPeerConnection)return l(!1),void f("RTCPeerConnection is not available");const e=new Set;v.current=e;const t=()=>{m.current&&(clearTimeout(m.current),m.current=null),p.current&&(p.current.close(),p.current=null),l(!1)},n=t=>{e.has(t)||(e.add(t),s(e=>[...e,t]),null==g.current||g.current(t))};try{const e=new RTCPeerConnection({iceServers:[{urls:r}]});p.current=e,e.onicecandidate=e=>{const t=e.candidate;t&&t.candidate&&function(e){const t=e.match(T);return t?[...t]:[]}(t.candidate).forEach(n)},e.createDataChannel(""),e.createOffer().then(t=>e.setLocalDescription(t)).catch(e=>{f(e instanceof Error?e.message:"Failed to create offer"),t()}),m.current=setTimeout(()=>t(),i)}catch(e){f(e instanceof Error?e.message:"WebRTC setup failed"),t()}return()=>{t()}},[r.join(","),i]),{ips:c,loading:a,error:d}}function j(r){const{wasmUrl:i,exportName:u="compute",workerUrl:c,importObject:s}=r,[a,l]=e(void 0),[d,f]=e(!0),[p,m]=e(null),[v,g]=e(!1),h=o(null),y=o(null),w=o(null);return n(()=>{if("undefined"==typeof window)return m("useWasmCompute is not available during SSR"),void f(!1);if("undefined"==typeof Worker)return m("Worker is not supported in this environment"),void f(!1);if("undefined"==typeof WebAssembly||"function"!=typeof WebAssembly.instantiate)return m("WebAssembly is not supported in this environment"),void f(!1);m(null),g(!1);const e=function(e){if(e)return new Worker(e);const t=new Blob(["\nself.onmessage = async (e) => {\n const d = e.data;\n if (d.type === 'init') {\n try {\n const res = await fetch(d.wasmUrl);\n const buf = await res.arrayBuffer();\n const mod = await WebAssembly.instantiate(buf, d.importObject || {});\n self.wasmInstance = mod.instance;\n self.exportName = d.exportName || 'compute';\n self.postMessage({ type: 'ready' });\n } catch (err) {\n self.postMessage({ type: 'error', error: (err && err.message) || String(err) });\n }\n return;\n }\n if (d.type === 'compute') {\n try {\n const fn = self.wasmInstance.exports[self.exportName];\n if (typeof fn !== 'function') {\n self.postMessage({ type: 'error', error: 'Export \"' + self.exportName + '\" is not a function' });\n return;\n }\n const result = fn(d.input);\n self.postMessage({ type: 'result', result: result });\n } catch (err) {\n self.postMessage({ type: 'error', error: (err && err.message) || String(err) });\n }\n }\n};\n"],{type:"application/javascript"}),n=URL.createObjectURL(t),r=new Worker(n);return URL.revokeObjectURL(n),r}(c);h.current=e;const t=e=>{var t;const{type:n,result:r,error:o}=null!=(t=e.data)?t:{};return"ready"===n?(g(!0),void f(!1)):"error"===n?(m(null!=o?o:"Unknown error"),f(!1),void(w.current&&(w.current(new Error(o)),y.current=null,w.current=null))):void("result"===n&&(l(r),f(!1),y.current&&(y.current(r),y.current=null,w.current=null)))};return e.addEventListener("message",t),e.postMessage({type:"init",wasmUrl:i,exportName:u,importObject:null!=s?s:{}}),()=>{e.removeEventListener("message",t),e.terminate(),h.current=null,w.current&&(w.current(new Error("Worker terminated")),y.current=null,w.current=null)}},[i,u,c,s]),{compute:t(e=>new Promise((t,n)=>{h.current&&v?p?n(new Error(p)):(y.current=t,w.current=n,f(!0),h.current.postMessage({type:"compute",input:e})):n(new Error("WASM not ready"))}),[v,p]),result:a,loading:d,error:p,ready:v}}function O(t,i={}){const{maxHistory:u=100,throughputWindowMs:c=1e3}=i,[s,a]=e([]),[l,d]=e(0),[f,p]=e(0),[m,v]=e([]),[g,h]=e(0),y=o([]),w=o(0),b=o(0);n(()=>{if(!t)return;const e=e=>{const t=function(e){if(null==e||"object"!=typeof e)return null;const t=e.type;return"task_start"!==t&&"task_end"!==t&&"task_fail"!==t&&"queue_size"!==t?null:{type:t,taskId:"string"==typeof e.taskId?e.taskId:void 0,duration:"number"==typeof e.duration?e.duration:void 0,error:"string"==typeof e.error?e.error:void 0,size:"number"==typeof e.size?e.size:void 0,timestamp:Date.now()}}(e.data);if(t)if(v(e=>[...e,t].slice(-u)),"task_start"===t.type&&t.taskId)a(e=>e.includes(t.taskId)?e:[...e,t.taskId]);else if("task_end"===t.type){t.taskId&&a(e=>e.filter(e=>e!==t.taskId)),d(e=>e+1);const e=Date.now()-c;y.current=[...y.current.filter(t=>t>=e),t.timestamp],"number"==typeof t.duration&&(w.current+=t.duration,b.current+=1)}else"task_fail"===t.type?(t.taskId&&a(e=>e.filter(e=>e!==t.taskId)),p(e=>e+1)):"queue_size"===t.type&&"number"==typeof t.size&&h(t.size)};return t.addEventListener("message",e),()=>t.removeEventListener("message",e)},[t,u]);const E=r(()=>{const e=b.current;return e>0?w.current/e:0},[m]),k=r(()=>{const e=Date.now()-c;return y.current.filter(t=>t>=e).length/(c/1e3)},[m,c]),x=r(()=>({runningTasks:s,completedCount:l,failedCount:f,averageDurationMs:E,throughputPerSecond:k,currentQueueSize:g,totalProcessed:l+f,recentEventCount:m.length}),[s,l,f,E,k,g,m.length]);return{runningTasks:s,completedCount:l,failedCount:f,eventHistory:m,averageDurationMs:E,throughputPerSecond:k,currentQueueSize:g,progress:x}}function D(e,t){if(null==e)return"";const n=("string"==typeof e?e:String(e)).trim();return n.length>t?n.slice(0,t):n}function P(e){if(!Array.isArray(e))return[];const t=[];for(let n=0;n<e.length&&t.length<50;n++){const r=D(e[n],100);r&&t.push(r)}return t}function C(e){const t=D(e,2048);if(!t)return"";try{const e=new URL(t);if("http:"===e.protocol||"https:"===e.protocol)return t}catch(e){}return""}function L(e){try{if("undefined"==typeof window)return!1;const t=window.getComputedStyle(e);return"none"!==t.display&&"hidden"!==t.visibility&&"0"!==t.opacity}catch(e){return!1}}function U(e){const t={};try{for(const n of Object.keys(e).slice(0,20)){const r=D(n,50);if(!r)continue;const o=e[n];"string"==typeof o?t[r]=o.slice(0,500):"number"==typeof o&&Number.isFinite(o)||"boolean"==typeof o?t[r]=o:Array.isArray(o)&&(t[r]=o.map(e=>D(e,200)).filter(Boolean).slice(0,20))}}catch(e){}return t}function N(){try{if("undefined"==typeof document||!document.querySelectorAll)return;document.querySelectorAll('script[data-llm="true"]').forEach(e=>e.remove())}catch(e){}}function q(e){const t=c(null);s(()=>{try{if("undefined"==typeof window)return;const n=function(e){return null==e||"object"!=typeof e?{route:"/"}:{route:D(e.route,2048)||"/",mode:"auto-extract"===e.mode?"auto-extract":"manual",title:void 0!==e.title?D(e.title,200):void 0,description:void 0!==e.description?D(e.description,2e3):void 0,tags:void 0!==e.tags?P(e.tags):void 0,canonicalUrl:void 0!==e.canonicalUrl?C(e.canonicalUrl):void 0,language:void 0!==e.language?D(e.language,20):void 0,ogType:void 0!==e.ogType?D(e.ogType,50):void 0,ogImage:void 0!==e.ogImage?C(e.ogImage):void 0,ogImageAlt:void 0!==e.ogImageAlt?D(e.ogImageAlt,200):void 0,siteName:void 0!==e.siteName?D(e.siteName,100):void 0,author:void 0!==e.author?D(e.author,200):void 0,publishedTime:void 0!==e.publishedTime?D(e.publishedTime,50):void 0,modifiedTime:void 0!==e.modifiedTime?D(e.modifiedTime,50):void 0,robots:void 0!==e.robots?D(e.robots,100):void 0,extra:void 0===e.extra||"object"!=typeof e.extra||Array.isArray(e.extra)?void 0:U(e.extra)}}(e),r=function(e){try{const r=(new Date).toISOString(),o={route:e.route,generatedAt:r};if("auto-extract"===e.mode){var t,n;const r=function(){const e={title:"",outline:[],description:""};try{if("undefined"==typeof document)return e;const t=D(document.title,200),n=[];let r="";try{const e=document.querySelectorAll("nav, footer, [role='navigation'], [role='contentinfo'], script, style, noscript"),t=t=>{for(const n of e)if(n.contains(t))return!0;return!1},o=document.querySelectorAll("h1, h2");for(const e of o){if(n.length>=50)break;if(L(e)&&!t(e)){const t=D(e.textContent,300);t&&n.push(t)}}const i=document.querySelectorAll("p"),u=[];for(const e of i){if(u.length>=3)break;if(L(e)&&!t(e)){const t=D(e.textContent,1e3);t&&u.push(t)}}r=u.join(" ").trim().slice(0,2e3)||""}catch(e){}return{title:t,outline:n,description:r}}catch(t){return e}}();o.title=(null!=(t=e.title)?t:r.title)||void 0,o.description=(null!=(n=e.description)?n:r.description)||void 0,r.outline.length>0&&(o.outline=r.outline)}else void 0!==e.title&&""!==e.title&&(o.title=e.title),void 0!==e.description&&""!==e.description&&(o.description=e.description);return e.tags&&e.tags.length>0&&(o.tags=e.tags),e.canonicalUrl&&(o.canonicalUrl=e.canonicalUrl),e.language&&(o.language=e.language),e.ogType&&(o.ogType=e.ogType),e.ogImage&&(o.ogImage=e.ogImage),e.ogImageAlt&&(o.ogImageAlt=e.ogImageAlt),e.siteName&&(o.siteName=e.siteName),e.author&&(o.author=e.author),e.publishedTime&&(o.publishedTime=e.publishedTime),e.modifiedTime&&(o.modifiedTime=e.modifiedTime),e.robots&&(o.robots=e.robots),e.extra&&Object.keys(e.extra).length>0&&(o.extra=e.extra),o}catch(t){var r;return{route:null!=(r=null==e?void 0:e.route)?r:"/",generatedAt:(new Date).toISOString()}}}(n),o=JSON.stringify(r);if(t.current===o)return;return t.current=o,N(),function(e){try{if("undefined"==typeof document||!document.head)return;const t=document.createElement("script");t.type="application/llm+json",t.setAttribute("data-llm","true"),t.textContent=JSON.stringify(e),document.head.appendChild(t)}catch(e){}}(r),()=>{N(),t.current=null}}catch(e){}},[null==e?void 0:e.route,null==e?void 0:e.mode,null==e?void 0:e.title,null==e?void 0:e.description,null==e?void 0:e.tags,null==e?void 0:e.canonicalUrl,null==e?void 0:e.language,null==e?void 0:e.ogType,null==e?void 0:e.ogImage,null==e?void 0:e.ogImageAlt,null==e?void 0:e.siteName,null==e?void 0:e.author,null==e?void 0:e.publishedTime,null==e?void 0:e.modifiedTime,null==e?void 0:e.robots])}export{y as useClipboard,f as useEventBus,S as useIndexedDB,q as useLLMMetadata,l as useMutationObserver,h as useNetworkState,v as usePreferredTheme,w as useRageClick,b as useThreadedWorker,a as useTransition,j as useWasmCompute,A as useWebRTCIP,O as useWorkerNotifications,m as useWrappedChildren};
@@ -0,0 +1 @@
1
+ import{useState as e,useCallback as n,useEffect as r,useMemo as t,useRef as o}from"react/hooks";import{isValidElement as i,cloneElement as u,useRef as a,useEffect as c}from"react";function l(){var r=e(!1),t=r[0],o=r[1];return[n(function(e){o(!0),Promise.resolve().then(function(){e(),o(!1)})},[]),t]}function s(e,n,t){r(function(){var r=e.current;if(r){var o=new MutationObserver(n);return o.observe(r,t),function(){return o.disconnect()}}},[e,n,t])}var f=new Map;function d(){var e=n(function(e){var n=arguments,r=f.get(e);r&&r.forEach(function(e){return e.apply(void 0,[].slice.call(n,1))})},[]);return{emit:e,on:n(function(e,n){var r=f.get(e);return r||(r=new Set,f.set(e,r)),r.add(n),function(){r.delete(n),0===r.size&&f.delete(e)}},[])}}function v(e,n){(null==n||n>e.length)&&(n=e.length);for(var r=0,t=Array(n);r<n;r++)t[r]=e[r];return t}function p(e,n){var r="undefined"!=typeof Symbol&&e[Symbol.iterator]||e["@@iterator"];if(r)return(r=r.call(e)).next.bind(r);if(Array.isArray(e)||(r=function(e,n){if(e){if("string"==typeof e)return v(e,n);var r={}.toString.call(e).slice(8,-1);return"Object"===r&&e.constructor&&(r=e.constructor.name),"Map"===r||"Set"===r?Array.from(e):"Arguments"===r||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(r)?v(e,n):void 0}}(e))||n&&e&&"number"==typeof e.length){r&&(e=r);var t=0;return function(){return t>=e.length?{done:!0}:{done:!1,value:e[t++]}}}throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}function m(){return m=Object.assign?Object.assign.bind():function(e){for(var n=1;n<arguments.length;n++){var r=arguments[n];for(var t in r)({}).hasOwnProperty.call(r,t)&&(e[t]=r[t])}return e},m.apply(null,arguments)}function g(e,n,r){return void 0===r&&(r="preserve"),t(function(){if(!e)return e;var t=function(e){if(!i(e))return e;var t,o=e.props||{};t="override"===r?m({},o,n):m({},n,o);var a=null==o?void 0:o.style,c=null==n?void 0:n.style;return a&&c&&"object"==typeof a&&"object"==typeof c&&(t.style="override"===r?m({},a,c):m({},c,a)),u(e,t)};return Array.isArray(e)?e.map(t):t(e)},[e,n,r])}function h(){var n=e(function(){if("undefined"==typeof window)return"no-preference";var e=window.matchMedia("(prefers-color-scheme: dark)"),n=window.matchMedia("(prefers-color-scheme: light)");return e.matches?"dark":n.matches?"light":"no-preference"}),t=n[0],o=n[1];return r(function(){if("undefined"!=typeof window){var e=window.matchMedia("(prefers-color-scheme: dark)"),n=function(e){o(e.matches?"dark":"light")},r=function(){var e=window.matchMedia("(prefers-color-scheme: dark)"),n=window.matchMedia("(prefers-color-scheme: light)");o(e.matches?"dark":n.matches?"light":"no-preference")};e.addEventListener("change",n);var t=window.matchMedia("(prefers-color-scheme: light)");return t.addEventListener("change",r),function(){e.removeEventListener("change",n),t.removeEventListener("change",r)}}},[]),t}function y(){if("undefined"==typeof navigator)return{online:!0};var e={online:navigator.onLine},n=navigator.connection;return n&&(void 0!==n.effectiveType&&(e.effectiveType=n.effectiveType),void 0!==n.downlink&&(e.downlink=n.downlink),void 0!==n.rtt&&(e.rtt=n.rtt),void 0!==n.saveData&&(e.saveData=n.saveData),void 0!==n.type&&(e.connectionType=n.type)),e}function w(){var n=e(y),t=n[0],o=n[1];return r(function(){if("undefined"!=typeof window){var e=function(){return o(y())};window.addEventListener("online",e),window.addEventListener("offline",e);var n=navigator.connection;return null!=n&&n.addEventListener&&n.addEventListener("change",e),function(){window.removeEventListener("online",e),window.removeEventListener("offline",e),null!=n&&n.removeEventListener&&n.removeEventListener("change",e)}}},[]),t}function b(e,n){try{var r=e()}catch(e){return n(e)}return r&&r.then?r.then(void 0,n):r}function E(r){void 0===r&&(r={});var t=r.resetDelay,o=void 0===t?2e3:t,i=e(!1),u=i[0],a=i[1],c=e(null),l=c[0],s=c[1],f=n(function(){a(!1),s(null)},[]);return{copy:n(function(e){try{if(s(null),"undefined"==typeof navigator||!navigator.clipboard){var n=new Error("Clipboard API is not available");return s(n),Promise.resolve(!1)}return Promise.resolve(b(function(){return Promise.resolve(navigator.clipboard.writeText(e)).then(function(){return a(!0),o>0&&setTimeout(function(){return a(!1)},o),!0})},function(e){var n=e instanceof Error?e:new Error(String(e));return s(n),!1}))}catch(e){return Promise.reject(e)}},[o]),paste:n(function(){try{if(s(null),"undefined"==typeof navigator||!navigator.clipboard){var e=new Error("Clipboard API is not available");return s(e),Promise.resolve("")}return Promise.resolve(b(function(){return Promise.resolve(navigator.clipboard.readText())},function(e){var n=e instanceof Error?e:new Error(String(e));return s(n),""}))}catch(e){return Promise.reject(e)}},[]),copied:u,error:l,reset:f}}function k(e,n){var t=n.onRageClick,i=n.threshold,u=void 0===i?5:i,a=n.timeWindow,c=void 0===a?1e3:a,l=n.distanceThreshold,s=void 0===l?30:l,f=o(t);f.current=t;var d=o([]);r(function(){var n=e.current;if(n){var r=function(e){var n=Date.now(),r={time:n,x:e.clientX,y:e.clientY},t=n-c,o=d.current.filter(function(e){return e.time>=t});if(o.push(r),Infinity!==s){var i=o.filter(function(e){return n=e,t=r,Math.hypot(t.x-n.x,t.y-n.y)<=s;var n,t});if(i.length>=u)return f.current({count:i.length,event:e}),void(d.current=[])}else if(o.length>=u)return f.current({count:o.length,event:e}),void(d.current=[]);d.current=o};return n.addEventListener("click",r),function(){return n.removeEventListener("click",r)}}},[e,u,c,s])}function x(t,i){var u=i.concurrency,a="sequential"===i.mode?1:Math.max(1,void 0===u?4:u),c=e(!1),l=c[0],s=c[1],f=e(void 0),d=f[0],v=f[1],p=e(void 0),m=p[0],g=p[1],h=e(0),y=h[0],w=h[1],b=o([]),E=o(0),k=o(0),x=o(!1),S=o(t);S.current=t;var T=n(function(){w(b.current.length+k.current)},[]),I=n(function(){if(!(x.current||k.current>=a)){if(0===b.current.length)return 0===k.current&&s(!1),void T();b.current.sort(function(e,n){return e.priority!==n.priority?e.priority-n.priority:e.sequence-n.sequence});var e=b.current.shift();k.current+=1,s(!0),T(),(0,S.current)(e.data).then(function(n){v(n),g(void 0),e.resolve(n)}).catch(function(n){g(n),e.reject(n)}).finally(function(){k.current-=1,T(),I()}),b.current.length>0&&k.current<a&&I()}},[a,T]),A=n(function(e,n){var r;if(x.current)return Promise.reject(new Error("Worker is terminated"));var t=null!=(r=null==n?void 0:n.priority)?r:1,o=++E.current,i=new Promise(function(n,r){b.current.push({data:e,priority:t,sequence:o,resolve:n,reject:r})});return T(),s(!0),queueMicrotask(I),i},[I,T]),P=n(function(){var e=b.current;b.current=[],e.forEach(function(e){return e.reject(new Error("Task cleared from queue"))}),T(),0===k.current&&s(!1)},[T]),M=n(function(){x.current=!0,P()},[P]);return r(function(){return function(){x.current=!0}},[]),{run:A,loading:l,result:d,error:m,queueSize:y,clearQueue:P,terminate:M}}var S=new Map;function T(e){return new Promise(function(n,r){e.onsuccess=function(){return n(e.result)},e.onerror=function(){var n;return r(null!=(n=e.error)?n:new DOMException("Unknown IndexedDB error"))}})}function I(e,n){return n?e.then(function(e){return null==n.onSuccess||n.onSuccess(e),e}).catch(function(e){throw null==n.onError||n.onError(e),e}):e}function A(n){var t=e(null),i=t[0],u=t[1],a=e(null),c=a[0],l=a[1],s=e(!1),f=s[0],d=s[1],v=o(n);return v.current=n,r(function(){var e=!1;l(null),d(!1),u(null);var n=v.current;return function(e){var n=e.name+"_v"+e.version,r=S.get(n);return r||(r=function(e){return new Promise(function(n,r){var t=indexedDB.open(e.name,e.version);t.onerror=function(){var e;return r(null!=(e=t.error)?e:new DOMException("Failed to open database"))},t.onsuccess=function(){return n(t.result)},t.onupgradeneeded=function(n){for(var r=n.target.result,t=e.tables,o=0,i=Object.keys(t);o<i.length;o++){var u=i[o],a=t[u];if(!r.objectStoreNames.contains(u)){var c,l=r.createObjectStore(u,{keyPath:a.keyPath,autoIncrement:null!=(c=a.autoIncrement)&&c});if(a.indexes)for(var s,f=p(a.indexes);!(s=f()).done;){var d=s.value;l.createIndex(d,d,{unique:!1})}}}}})}(e),S.set(n,r),r)}({name:n.name,version:n.version,tables:n.tables}).then(function(n){if(e)n.close();else{var r=function(e){return{get db(){return e},hasTable:function(n){return e.objectStoreNames.contains(n)},table:function(n){return function(e,n){return function(e,n){function r(r){return e.transaction([n],r).objectStore(n)}return{insert:function(e,n){return I(T(r("readwrite").add(e)),n)},update:function(e,n,t){var o=r("readwrite");return I(T(o.get(e)).then(function(e){if(void 0===e)throw new DOMException("Key not found","NotFoundError");var r=m({},e,n);return T(o.put(r))}).then(function(){}),t)},delete:function(e,n){return I(T(r("readwrite").delete(e)).then(function(){}),n)},exists:function(e){return T(r("readonly").getKey(e)).then(function(e){return void 0!==e})},query:function(e,n){var t=r("readonly").openCursor(),o=[];return I(new Promise(function(n,r){t.onsuccess=function(){var r=t.result;r?(e(r.value)&&o.push(r.value),r.continue()):n(o)},t.onerror=function(){var e;return r(null!=(e=t.error)?e:new DOMException("Unknown error"))}}),n)},upsert:function(e,n){return I(T(r("readwrite").put(e)),n)},bulkInsert:function(e,n){var t=r("readwrite"),o=[];if(0===e.length)return I(Promise.resolve(o),n);var i=0;return I(new Promise(function(n,r){e.forEach(function(u,a){var c=t.add(u);c.onsuccess=function(){o[a]=c.result,++i===e.length&&n(o)},c.onerror=function(){var e;return r(null!=(e=c.error)?e:new DOMException("Unknown error"))}})}),n)},clear:function(e){return I(T(r("readwrite").clear()).then(function(){}),e)},count:function(e){return I(T(r("readonly").count()),null!=e?e:{})}}}(e,n)}(e,n)},transaction:function(n,r,t,o){var i=e.transaction(n,r),u={table:function(e){return function(e,n){return function(e,n){function r(){return e.objectStore(n)}return{insert:function(e,n){return I(T(r().add(e)),n)},update:function(e,n,t){var o=r();return I(T(o.get(e)).then(function(e){if(void 0===e)throw new DOMException("Key not found","NotFoundError");var r=m({},e,n);return T(o.put(r))}).then(function(){}),t)},delete:function(e,n){return I(T(r().delete(e)).then(function(){}),n)},exists:function(e){return T(r().getKey(e)).then(function(e){return void 0!==e})},query:function(e,n){var t=r().openCursor(),o=[];return I(new Promise(function(n,r){t.onsuccess=function(){var r=t.result;r?(e(r.value)&&o.push(r.value),r.continue()):n(o)},t.onerror=function(){var e;return r(null!=(e=t.error)?e:new DOMException("Unknown error"))}}),n)},upsert:function(e,n){return I(T(r().put(e)),n)},bulkInsert:function(e,n){var t=r(),o=[];if(0===e.length)return I(Promise.resolve(o),n);var i=0;return I(new Promise(function(n,r){e.forEach(function(u,a){var c=t.add(u);c.onsuccess=function(){o[a]=c.result,++i===e.length&&n(o)},c.onerror=function(){var e;return r(null!=(e=c.error)?e:new DOMException("Unknown error"))}})}),n)},clear:function(e){return I(T(r().clear()).then(function(){}),e)},count:function(e){return I(T(r().count()),null!=e?e:{})}}}(e,n)}(i,e)}},a=new Promise(function(e,n){i.oncomplete=function(){return e()},i.onerror=function(){var e;return n(null!=(e=i.error)?e:new DOMException("Transaction failed"))}}),c=t(u);return function(e,n){return n?e.then(function(){return null==n.onSuccess?void 0:n.onSuccess()}).catch(function(e){throw null==n.onError||n.onError(e),e}):e}(Promise.resolve(c).then(function(){return a}),o)}}}(n);u(r),d(!0)}}).catch(function(n){e||l(n)}),function(){e=!0}},[n.name,n.version]),{db:i,isReady:f,error:c}}var P=/\b(?:25[0-5]|2[0-4]\d|1?\d{1,2})(?:\.(?:25[0-5]|2[0-4]\d|1?\d{1,2})){3}\b/g,M=["stun:stun.l.google.com:19302"];function j(n){void 0===n&&(n={});var t=n.stunServers,i=void 0===t?M:t,u=n.timeout,a=void 0===u?3e3:u,c=n.onDetect,l=e([]),s=l[0],f=l[1],d=e(!0),v=d[0],p=d[1],m=e(null),g=m[0],h=m[1],y=o(null),w=o(null),b=o(new Set),E=o(c);return E.current=c,r(function(){if("undefined"==typeof window)return p(!1),void h("WebRTC IP detection is not available during SSR");if("undefined"==typeof RTCPeerConnection)return p(!1),void h("RTCPeerConnection is not available");var e=new Set;b.current=e;var n=function(){w.current&&(clearTimeout(w.current),w.current=null),y.current&&(y.current.close(),y.current=null),p(!1)},r=function(n){e.has(n)||(e.add(n),f(function(e){return[].concat(e,[n])}),null==E.current||E.current(n))};try{var t=new RTCPeerConnection({iceServers:[{urls:i}]});y.current=t,t.onicecandidate=function(e){var n,t=e.candidate;t&&t.candidate&&((n=t.candidate.match(P))?[].concat(n):[]).forEach(r)},t.createDataChannel(""),t.createOffer().then(function(e){return t.setLocalDescription(e)}).catch(function(e){h(e instanceof Error?e.message:"Failed to create offer"),n()}),w.current=setTimeout(function(){return n()},a)}catch(e){h(e instanceof Error?e.message:"WebRTC setup failed"),n()}return function(){n()}},[i.join(","),a]),{ips:s,loading:v,error:g}}function O(t){var i=t.wasmUrl,u=t.exportName,a=void 0===u?"compute":u,c=t.workerUrl,l=t.importObject,s=e(void 0),f=s[0],d=s[1],v=e(!0),p=v[0],m=v[1],g=e(null),h=g[0],y=g[1],w=e(!1),b=w[0],E=w[1],k=o(null),x=o(null),S=o(null);return r(function(){if("undefined"==typeof window)return y("useWasmCompute is not available during SSR"),void m(!1);if("undefined"==typeof Worker)return y("Worker is not supported in this environment"),void m(!1);if("undefined"==typeof WebAssembly||"function"!=typeof WebAssembly.instantiate)return y("WebAssembly is not supported in this environment"),void m(!1);y(null),E(!1);var e=function(e){if(e)return new Worker(e);var n=new Blob(["\nself.onmessage = async (e) => {\n const d = e.data;\n if (d.type === 'init') {\n try {\n const res = await fetch(d.wasmUrl);\n const buf = await res.arrayBuffer();\n const mod = await WebAssembly.instantiate(buf, d.importObject || {});\n self.wasmInstance = mod.instance;\n self.exportName = d.exportName || 'compute';\n self.postMessage({ type: 'ready' });\n } catch (err) {\n self.postMessage({ type: 'error', error: (err && err.message) || String(err) });\n }\n return;\n }\n if (d.type === 'compute') {\n try {\n const fn = self.wasmInstance.exports[self.exportName];\n if (typeof fn !== 'function') {\n self.postMessage({ type: 'error', error: 'Export \"' + self.exportName + '\" is not a function' });\n return;\n }\n const result = fn(d.input);\n self.postMessage({ type: 'result', result: result });\n } catch (err) {\n self.postMessage({ type: 'error', error: (err && err.message) || String(err) });\n }\n }\n};\n"],{type:"application/javascript"}),r=URL.createObjectURL(n),t=new Worker(r);return URL.revokeObjectURL(r),t}(c);k.current=e;var n=function(e){var n,r=null!=(n=e.data)?n:{},t=r.type,o=r.result,i=r.error;return"ready"===t?(E(!0),void m(!1)):"error"===t?(y(null!=i?i:"Unknown error"),m(!1),void(S.current&&(S.current(new Error(i)),x.current=null,S.current=null))):void("result"===t&&(d(o),m(!1),x.current&&(x.current(o),x.current=null,S.current=null)))};return e.addEventListener("message",n),e.postMessage({type:"init",wasmUrl:i,exportName:a,importObject:null!=l?l:{}}),function(){e.removeEventListener("message",n),e.terminate(),k.current=null,S.current&&(S.current(new Error("Worker terminated")),x.current=null,S.current=null)}},[i,a,c,l]),{compute:n(function(e){return new Promise(function(n,r){k.current&&b?h?r(new Error(h)):(x.current=n,S.current=r,m(!0),k.current.postMessage({type:"compute",input:e})):r(new Error("WASM not ready"))})},[b,h]),result:f,loading:p,error:h,ready:b}}function C(n,i){void 0===i&&(i={});var u=i.maxHistory,a=void 0===u?100:u,c=i.throughputWindowMs,l=void 0===c?1e3:c,s=e([]),f=s[0],d=s[1],v=e(0),p=v[0],m=v[1],g=e(0),h=g[0],y=g[1],w=e([]),b=w[0],E=w[1],k=e(0),x=k[0],S=k[1],T=o([]),I=o(0),A=o(0);r(function(){if(n){var e=function(e){var n=function(e){if(null==e||"object"!=typeof e)return null;var n=e.type;return"task_start"!==n&&"task_end"!==n&&"task_fail"!==n&&"queue_size"!==n?null:{type:n,taskId:"string"==typeof e.taskId?e.taskId:void 0,duration:"number"==typeof e.duration?e.duration:void 0,error:"string"==typeof e.error?e.error:void 0,size:"number"==typeof e.size?e.size:void 0,timestamp:Date.now()}}(e.data);if(n)if(E(function(e){return[].concat(e,[n]).slice(-a)}),"task_start"===n.type&&n.taskId)d(function(e){return e.includes(n.taskId)?e:[].concat(e,[n.taskId])});else if("task_end"===n.type){n.taskId&&d(function(e){return e.filter(function(e){return e!==n.taskId})}),m(function(e){return e+1});var r=Date.now()-l;T.current=[].concat(T.current.filter(function(e){return e>=r}),[n.timestamp]),"number"==typeof n.duration&&(I.current+=n.duration,A.current+=1)}else"task_fail"===n.type?(n.taskId&&d(function(e){return e.filter(function(e){return e!==n.taskId})}),y(function(e){return e+1})):"queue_size"===n.type&&"number"==typeof n.size&&S(n.size)};return n.addEventListener("message",e),function(){return n.removeEventListener("message",e)}}},[n,a]);var P=t(function(){var e=A.current;return e>0?I.current/e:0},[b]),M=t(function(){var e=Date.now()-l;return T.current.filter(function(n){return n>=e}).length/(l/1e3)},[b,l]),j=t(function(){return{runningTasks:f,completedCount:p,failedCount:h,averageDurationMs:P,throughputPerSecond:M,currentQueueSize:x,totalProcessed:p+h,recentEventCount:b.length}},[f,p,h,P,M,x,b.length]);return{runningTasks:f,completedCount:p,failedCount:h,eventHistory:b,averageDurationMs:P,throughputPerSecond:M,currentQueueSize:x,progress:j}}function D(e,n){if(null==e)return"";var r=("string"==typeof e?e:String(e)).trim();return r.length>n?r.slice(0,n):r}function L(e){if(!Array.isArray(e))return[];for(var n=[],r=0;r<e.length&&n.length<50;r++){var t=D(e[r],100);t&&n.push(t)}return n}function U(e){var n=D(e,2048);if(!n)return"";try{var r=new URL(n);if("http:"===r.protocol||"https:"===r.protocol)return n}catch(e){}return""}function N(e){try{if("undefined"==typeof window)return!1;var n=window.getComputedStyle(e);return"none"!==n.display&&"hidden"!==n.visibility&&"0"!==n.opacity}catch(e){return!1}}function q(e){var n={};try{for(var r,t=p(Object.keys(e).slice(0,20));!(r=t()).done;){var o=r.value,i=D(o,50);if(i){var u=e[o];"string"==typeof u?n[i]=u.slice(0,500):"number"==typeof u&&Number.isFinite(u)||"boolean"==typeof u?n[i]=u:Array.isArray(u)&&(n[i]=u.map(function(e){return D(e,200)}).filter(Boolean).slice(0,20))}}}catch(e){}return n}function W(){try{if("undefined"==typeof document||!document.querySelectorAll)return;document.querySelectorAll('script[data-llm="true"]').forEach(function(e){return e.remove()})}catch(e){}}function R(e){var n=a(null);c(function(){try{if("undefined"==typeof window)return;var r=function(e){return null==e||"object"!=typeof e?{route:"/"}:{route:D(e.route,2048)||"/",mode:"auto-extract"===e.mode?"auto-extract":"manual",title:void 0!==e.title?D(e.title,200):void 0,description:void 0!==e.description?D(e.description,2e3):void 0,tags:void 0!==e.tags?L(e.tags):void 0,canonicalUrl:void 0!==e.canonicalUrl?U(e.canonicalUrl):void 0,language:void 0!==e.language?D(e.language,20):void 0,ogType:void 0!==e.ogType?D(e.ogType,50):void 0,ogImage:void 0!==e.ogImage?U(e.ogImage):void 0,ogImageAlt:void 0!==e.ogImageAlt?D(e.ogImageAlt,200):void 0,siteName:void 0!==e.siteName?D(e.siteName,100):void 0,author:void 0!==e.author?D(e.author,200):void 0,publishedTime:void 0!==e.publishedTime?D(e.publishedTime,50):void 0,modifiedTime:void 0!==e.modifiedTime?D(e.modifiedTime,50):void 0,robots:void 0!==e.robots?D(e.robots,100):void 0,extra:void 0===e.extra||"object"!=typeof e.extra||Array.isArray(e.extra)?void 0:q(e.extra)}}(e),t=function(e){try{var n=(new Date).toISOString(),r={route:e.route,generatedAt:n};if("auto-extract"===e.mode){var t,o,i=function(){var e={title:"",outline:[],description:""};try{if("undefined"==typeof document)return e;var n=D(document.title,200),r=[],t="";try{for(var o,i=document.querySelectorAll("nav, footer, [role='navigation'], [role='contentinfo'], script, style, noscript"),u=function(e){for(var n,r=p(i);!(n=r()).done;)if(n.value.contains(e))return!0;return!1},a=p(document.querySelectorAll("h1, h2"));!(o=a()).done;){var c=o.value;if(r.length>=50)break;if(N(c)&&!u(c)){var l=D(c.textContent,300);l&&r.push(l)}}for(var s,f=document.querySelectorAll("p"),d=[],v=p(f);!(s=v()).done;){var m=s.value;if(d.length>=3)break;if(N(m)&&!u(m)){var g=D(m.textContent,1e3);g&&d.push(g)}}t=d.join(" ").trim().slice(0,2e3)||""}catch(e){}return{title:n,outline:r,description:t}}catch(n){return e}}();r.title=(null!=(t=e.title)?t:i.title)||void 0,r.description=(null!=(o=e.description)?o:i.description)||void 0,i.outline.length>0&&(r.outline=i.outline)}else void 0!==e.title&&""!==e.title&&(r.title=e.title),void 0!==e.description&&""!==e.description&&(r.description=e.description);return e.tags&&e.tags.length>0&&(r.tags=e.tags),e.canonicalUrl&&(r.canonicalUrl=e.canonicalUrl),e.language&&(r.language=e.language),e.ogType&&(r.ogType=e.ogType),e.ogImage&&(r.ogImage=e.ogImage),e.ogImageAlt&&(r.ogImageAlt=e.ogImageAlt),e.siteName&&(r.siteName=e.siteName),e.author&&(r.author=e.author),e.publishedTime&&(r.publishedTime=e.publishedTime),e.modifiedTime&&(r.modifiedTime=e.modifiedTime),e.robots&&(r.robots=e.robots),e.extra&&Object.keys(e.extra).length>0&&(r.extra=e.extra),r}catch(n){var u;return{route:null!=(u=null==e?void 0:e.route)?u:"/",generatedAt:(new Date).toISOString()}}}(r),o=JSON.stringify(t);if(n.current===o)return;return n.current=o,W(),function(e){try{if("undefined"==typeof document||!document.head)return;var n=document.createElement("script");n.type="application/llm+json",n.setAttribute("data-llm","true"),n.textContent=JSON.stringify(e),document.head.appendChild(n)}catch(e){}}(t),function(){W(),n.current=null}}catch(e){}},[null==e?void 0:e.route,null==e?void 0:e.mode,null==e?void 0:e.title,null==e?void 0:e.description,null==e?void 0:e.tags,null==e?void 0:e.canonicalUrl,null==e?void 0:e.language,null==e?void 0:e.ogType,null==e?void 0:e.ogImage,null==e?void 0:e.ogImageAlt,null==e?void 0:e.siteName,null==e?void 0:e.author,null==e?void 0:e.publishedTime,null==e?void 0:e.modifiedTime,null==e?void 0:e.robots])}export{E as useClipboard,d as useEventBus,A as useIndexedDB,R as useLLMMetadata,s as useMutationObserver,w as useNetworkState,h as usePreferredTheme,k as useRageClick,x as useThreadedWorker,l as useTransition,O as useWasmCompute,j as useWebRTCIP,C as useWorkerNotifications,g as useWrappedChildren};
@@ -0,0 +1 @@
1
+ !function(e,n){"object"==typeof exports&&"undefined"!=typeof module?n(exports,require("react/hooks"),require("react")):"function"==typeof define&&define.amd?define(["exports","react/hooks","react"],n):n((e||self).preactMissingHooks={},e.hooks,e.react)}(this,function(e,n,r){var t=new Map;function o(e,n){(null==n||n>e.length)&&(n=e.length);for(var r=0,t=Array(n);r<n;r++)t[r]=e[r];return t}function u(e,n){var r="undefined"!=typeof Symbol&&e[Symbol.iterator]||e["@@iterator"];if(r)return(r=r.call(e)).next.bind(r);if(Array.isArray(e)||(r=function(e,n){if(e){if("string"==typeof e)return o(e,n);var r={}.toString.call(e).slice(8,-1);return"Object"===r&&e.constructor&&(r=e.constructor.name),"Map"===r||"Set"===r?Array.from(e):"Arguments"===r||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(r)?o(e,n):void 0}}(e))||n&&e&&"number"==typeof e.length){r&&(e=r);var t=0;return function(){return t>=e.length?{done:!0}:{done:!1,value:e[t++]}}}throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}function i(){return i=Object.assign?Object.assign.bind():function(e){for(var n=1;n<arguments.length;n++){var r=arguments[n];for(var t in r)({}).hasOwnProperty.call(r,t)&&(e[t]=r[t])}return e},i.apply(null,arguments)}function a(){if("undefined"==typeof navigator)return{online:!0};var e={online:navigator.onLine},n=navigator.connection;return n&&(void 0!==n.effectiveType&&(e.effectiveType=n.effectiveType),void 0!==n.downlink&&(e.downlink=n.downlink),void 0!==n.rtt&&(e.rtt=n.rtt),void 0!==n.saveData&&(e.saveData=n.saveData),void 0!==n.type&&(e.connectionType=n.type)),e}function c(e,n){try{var r=e()}catch(e){return n(e)}return r&&r.then?r.then(void 0,n):r}var s=new Map;function l(e){return new Promise(function(n,r){e.onsuccess=function(){return n(e.result)},e.onerror=function(){var n;return r(null!=(n=e.error)?n:new DOMException("Unknown IndexedDB error"))}})}function f(e,n){return n?e.then(function(e){return null==n.onSuccess||n.onSuccess(e),e}).catch(function(e){throw null==n.onError||n.onError(e),e}):e}var d=/\b(?:25[0-5]|2[0-4]\d|1?\d{1,2})(?:\.(?:25[0-5]|2[0-4]\d|1?\d{1,2})){3}\b/g,v=["stun:stun.l.google.com:19302"];function p(e,n){if(null==e)return"";var r=("string"==typeof e?e:String(e)).trim();return r.length>n?r.slice(0,n):r}function m(e){if(!Array.isArray(e))return[];for(var n=[],r=0;r<e.length&&n.length<50;r++){var t=p(e[r],100);t&&n.push(t)}return n}function g(e){var n=p(e,2048);if(!n)return"";try{var r=new URL(n);if("http:"===r.protocol||"https:"===r.protocol)return n}catch(e){}return""}function h(e){try{if("undefined"==typeof window)return!1;var n=window.getComputedStyle(e);return"none"!==n.display&&"hidden"!==n.visibility&&"0"!==n.opacity}catch(e){return!1}}function y(e){var n={};try{for(var r,t=u(Object.keys(e).slice(0,20));!(r=t()).done;){var o=r.value,i=p(o,50);if(i){var a=e[o];"string"==typeof a?n[i]=a.slice(0,500):"number"==typeof a&&Number.isFinite(a)||"boolean"==typeof a?n[i]=a:Array.isArray(a)&&(n[i]=a.map(function(e){return p(e,200)}).filter(Boolean).slice(0,20))}}}catch(e){}return n}function w(){try{if("undefined"==typeof document||!document.querySelectorAll)return;document.querySelectorAll('script[data-llm="true"]').forEach(function(e){return e.remove()})}catch(e){}}e.useClipboard=function(e){void 0===e&&(e={});var r=e.resetDelay,t=void 0===r?2e3:r,o=n.useState(!1),u=o[0],i=o[1],a=n.useState(null),s=a[0],l=a[1],f=n.useCallback(function(){i(!1),l(null)},[]);return{copy:n.useCallback(function(e){try{if(l(null),"undefined"==typeof navigator||!navigator.clipboard){var n=new Error("Clipboard API is not available");return l(n),Promise.resolve(!1)}return Promise.resolve(c(function(){return Promise.resolve(navigator.clipboard.writeText(e)).then(function(){return i(!0),t>0&&setTimeout(function(){return i(!1)},t),!0})},function(e){var n=e instanceof Error?e:new Error(String(e));return l(n),!1}))}catch(e){return Promise.reject(e)}},[t]),paste:n.useCallback(function(){try{if(l(null),"undefined"==typeof navigator||!navigator.clipboard){var e=new Error("Clipboard API is not available");return l(e),Promise.resolve("")}return Promise.resolve(c(function(){return Promise.resolve(navigator.clipboard.readText())},function(e){var n=e instanceof Error?e:new Error(String(e));return l(n),""}))}catch(e){return Promise.reject(e)}},[]),copied:u,error:s,reset:f}},e.useEventBus=function(){var e=n.useCallback(function(e){var n=arguments,r=t.get(e);r&&r.forEach(function(e){return e.apply(void 0,[].slice.call(n,1))})},[]);return{emit:e,on:n.useCallback(function(e,n){var r=t.get(e);return r||(r=new Set,t.set(e,r)),r.add(n),function(){r.delete(n),0===r.size&&t.delete(e)}},[])}},e.useIndexedDB=function(e){var r=n.useState(null),t=r[0],o=r[1],a=n.useState(null),c=a[0],d=a[1],v=n.useState(!1),p=v[0],m=v[1],g=n.useRef(e);return g.current=e,n.useEffect(function(){var e=!1;d(null),m(!1),o(null);var n=g.current;return function(e){var n=e.name+"_v"+e.version,r=s.get(n);return r||(r=function(e){return new Promise(function(n,r){var t=indexedDB.open(e.name,e.version);t.onerror=function(){var e;return r(null!=(e=t.error)?e:new DOMException("Failed to open database"))},t.onsuccess=function(){return n(t.result)},t.onupgradeneeded=function(n){for(var r=n.target.result,t=e.tables,o=0,i=Object.keys(t);o<i.length;o++){var a=i[o],c=t[a];if(!r.objectStoreNames.contains(a)){var s,l=r.createObjectStore(a,{keyPath:c.keyPath,autoIncrement:null!=(s=c.autoIncrement)&&s});if(c.indexes)for(var f,d=u(c.indexes);!(f=d()).done;){var v=f.value;l.createIndex(v,v,{unique:!1})}}}}})}(e),s.set(n,r),r)}({name:n.name,version:n.version,tables:n.tables}).then(function(n){if(e)n.close();else{var r=function(e){return{get db(){return e},hasTable:function(n){return e.objectStoreNames.contains(n)},table:function(n){return function(e,n){return function(e,n){function r(r){return e.transaction([n],r).objectStore(n)}return{insert:function(e,n){return f(l(r("readwrite").add(e)),n)},update:function(e,n,t){var o=r("readwrite");return f(l(o.get(e)).then(function(e){if(void 0===e)throw new DOMException("Key not found","NotFoundError");var r=i({},e,n);return l(o.put(r))}).then(function(){}),t)},delete:function(e,n){return f(l(r("readwrite").delete(e)).then(function(){}),n)},exists:function(e){return l(r("readonly").getKey(e)).then(function(e){return void 0!==e})},query:function(e,n){var t=r("readonly").openCursor(),o=[];return f(new Promise(function(n,r){t.onsuccess=function(){var r=t.result;r?(e(r.value)&&o.push(r.value),r.continue()):n(o)},t.onerror=function(){var e;return r(null!=(e=t.error)?e:new DOMException("Unknown error"))}}),n)},upsert:function(e,n){return f(l(r("readwrite").put(e)),n)},bulkInsert:function(e,n){var t=r("readwrite"),o=[];if(0===e.length)return f(Promise.resolve(o),n);var u=0;return f(new Promise(function(n,r){e.forEach(function(i,a){var c=t.add(i);c.onsuccess=function(){o[a]=c.result,++u===e.length&&n(o)},c.onerror=function(){var e;return r(null!=(e=c.error)?e:new DOMException("Unknown error"))}})}),n)},clear:function(e){return f(l(r("readwrite").clear()).then(function(){}),e)},count:function(e){return f(l(r("readonly").count()),null!=e?e:{})}}}(e,n)}(e,n)},transaction:function(n,r,t,o){var u=e.transaction(n,r),a={table:function(e){return function(e,n){return function(e,n){function r(){return e.objectStore(n)}return{insert:function(e,n){return f(l(r().add(e)),n)},update:function(e,n,t){var o=r();return f(l(o.get(e)).then(function(e){if(void 0===e)throw new DOMException("Key not found","NotFoundError");var r=i({},e,n);return l(o.put(r))}).then(function(){}),t)},delete:function(e,n){return f(l(r().delete(e)).then(function(){}),n)},exists:function(e){return l(r().getKey(e)).then(function(e){return void 0!==e})},query:function(e,n){var t=r().openCursor(),o=[];return f(new Promise(function(n,r){t.onsuccess=function(){var r=t.result;r?(e(r.value)&&o.push(r.value),r.continue()):n(o)},t.onerror=function(){var e;return r(null!=(e=t.error)?e:new DOMException("Unknown error"))}}),n)},upsert:function(e,n){return f(l(r().put(e)),n)},bulkInsert:function(e,n){var t=r(),o=[];if(0===e.length)return f(Promise.resolve(o),n);var u=0;return f(new Promise(function(n,r){e.forEach(function(i,a){var c=t.add(i);c.onsuccess=function(){o[a]=c.result,++u===e.length&&n(o)},c.onerror=function(){var e;return r(null!=(e=c.error)?e:new DOMException("Unknown error"))}})}),n)},clear:function(e){return f(l(r().clear()).then(function(){}),e)},count:function(e){return f(l(r().count()),null!=e?e:{})}}}(e,n)}(u,e)}},c=new Promise(function(e,n){u.oncomplete=function(){return e()},u.onerror=function(){var e;return n(null!=(e=u.error)?e:new DOMException("Transaction failed"))}}),s=t(a);return function(e,n){return n?e.then(function(){return null==n.onSuccess?void 0:n.onSuccess()}).catch(function(e){throw null==n.onError||n.onError(e),e}):e}(Promise.resolve(s).then(function(){return c}),o)}}}(n);o(r),m(!0)}}).catch(function(n){e||d(n)}),function(){e=!0}},[e.name,e.version]),{db:t,isReady:p,error:c}},e.useLLMMetadata=function(e){var n=r.useRef(null);r.useEffect(function(){try{if("undefined"==typeof window)return;var r=function(e){return null==e||"object"!=typeof e?{route:"/"}:{route:p(e.route,2048)||"/",mode:"auto-extract"===e.mode?"auto-extract":"manual",title:void 0!==e.title?p(e.title,200):void 0,description:void 0!==e.description?p(e.description,2e3):void 0,tags:void 0!==e.tags?m(e.tags):void 0,canonicalUrl:void 0!==e.canonicalUrl?g(e.canonicalUrl):void 0,language:void 0!==e.language?p(e.language,20):void 0,ogType:void 0!==e.ogType?p(e.ogType,50):void 0,ogImage:void 0!==e.ogImage?g(e.ogImage):void 0,ogImageAlt:void 0!==e.ogImageAlt?p(e.ogImageAlt,200):void 0,siteName:void 0!==e.siteName?p(e.siteName,100):void 0,author:void 0!==e.author?p(e.author,200):void 0,publishedTime:void 0!==e.publishedTime?p(e.publishedTime,50):void 0,modifiedTime:void 0!==e.modifiedTime?p(e.modifiedTime,50):void 0,robots:void 0!==e.robots?p(e.robots,100):void 0,extra:void 0===e.extra||"object"!=typeof e.extra||Array.isArray(e.extra)?void 0:y(e.extra)}}(e),t=function(e){try{var n=(new Date).toISOString(),r={route:e.route,generatedAt:n};if("auto-extract"===e.mode){var t,o,i=function(){var e={title:"",outline:[],description:""};try{if("undefined"==typeof document)return e;var n=p(document.title,200),r=[],t="";try{for(var o,i=document.querySelectorAll("nav, footer, [role='navigation'], [role='contentinfo'], script, style, noscript"),a=function(e){for(var n,r=u(i);!(n=r()).done;)if(n.value.contains(e))return!0;return!1},c=u(document.querySelectorAll("h1, h2"));!(o=c()).done;){var s=o.value;if(r.length>=50)break;if(h(s)&&!a(s)){var l=p(s.textContent,300);l&&r.push(l)}}for(var f,d=document.querySelectorAll("p"),v=[],m=u(d);!(f=m()).done;){var g=f.value;if(v.length>=3)break;if(h(g)&&!a(g)){var y=p(g.textContent,1e3);y&&v.push(y)}}t=v.join(" ").trim().slice(0,2e3)||""}catch(e){}return{title:n,outline:r,description:t}}catch(n){return e}}();r.title=(null!=(t=e.title)?t:i.title)||void 0,r.description=(null!=(o=e.description)?o:i.description)||void 0,i.outline.length>0&&(r.outline=i.outline)}else void 0!==e.title&&""!==e.title&&(r.title=e.title),void 0!==e.description&&""!==e.description&&(r.description=e.description);return e.tags&&e.tags.length>0&&(r.tags=e.tags),e.canonicalUrl&&(r.canonicalUrl=e.canonicalUrl),e.language&&(r.language=e.language),e.ogType&&(r.ogType=e.ogType),e.ogImage&&(r.ogImage=e.ogImage),e.ogImageAlt&&(r.ogImageAlt=e.ogImageAlt),e.siteName&&(r.siteName=e.siteName),e.author&&(r.author=e.author),e.publishedTime&&(r.publishedTime=e.publishedTime),e.modifiedTime&&(r.modifiedTime=e.modifiedTime),e.robots&&(r.robots=e.robots),e.extra&&Object.keys(e.extra).length>0&&(r.extra=e.extra),r}catch(n){var a;return{route:null!=(a=null==e?void 0:e.route)?a:"/",generatedAt:(new Date).toISOString()}}}(r),o=JSON.stringify(t);if(n.current===o)return;return n.current=o,w(),function(e){try{if("undefined"==typeof document||!document.head)return;var n=document.createElement("script");n.type="application/llm+json",n.setAttribute("data-llm","true"),n.textContent=JSON.stringify(e),document.head.appendChild(n)}catch(e){}}(t),function(){w(),n.current=null}}catch(e){}},[null==e?void 0:e.route,null==e?void 0:e.mode,null==e?void 0:e.title,null==e?void 0:e.description,null==e?void 0:e.tags,null==e?void 0:e.canonicalUrl,null==e?void 0:e.language,null==e?void 0:e.ogType,null==e?void 0:e.ogImage,null==e?void 0:e.ogImageAlt,null==e?void 0:e.siteName,null==e?void 0:e.author,null==e?void 0:e.publishedTime,null==e?void 0:e.modifiedTime,null==e?void 0:e.robots])},e.useMutationObserver=function(e,r,t){n.useEffect(function(){var n=e.current;if(n){var o=new MutationObserver(r);return o.observe(n,t),function(){return o.disconnect()}}},[e,r,t])},e.useNetworkState=function(){var e=n.useState(a),r=e[0],t=e[1];return n.useEffect(function(){if("undefined"!=typeof window){var e=function(){return t(a())};window.addEventListener("online",e),window.addEventListener("offline",e);var n=navigator.connection;return null!=n&&n.addEventListener&&n.addEventListener("change",e),function(){window.removeEventListener("online",e),window.removeEventListener("offline",e),null!=n&&n.removeEventListener&&n.removeEventListener("change",e)}}},[]),r},e.usePreferredTheme=function(){var e=n.useState(function(){if("undefined"==typeof window)return"no-preference";var e=window.matchMedia("(prefers-color-scheme: dark)"),n=window.matchMedia("(prefers-color-scheme: light)");return e.matches?"dark":n.matches?"light":"no-preference"}),r=e[0],t=e[1];return n.useEffect(function(){if("undefined"!=typeof window){var e=window.matchMedia("(prefers-color-scheme: dark)"),n=function(e){t(e.matches?"dark":"light")},r=function(){var e=window.matchMedia("(prefers-color-scheme: dark)"),n=window.matchMedia("(prefers-color-scheme: light)");t(e.matches?"dark":n.matches?"light":"no-preference")};e.addEventListener("change",n);var o=window.matchMedia("(prefers-color-scheme: light)");return o.addEventListener("change",r),function(){e.removeEventListener("change",n),o.removeEventListener("change",r)}}},[]),r},e.useRageClick=function(e,r){var t=r.onRageClick,o=r.threshold,u=void 0===o?5:o,i=r.timeWindow,a=void 0===i?1e3:i,c=r.distanceThreshold,s=void 0===c?30:c,l=n.useRef(t);l.current=t;var f=n.useRef([]);n.useEffect(function(){var n=e.current;if(n){var r=function(e){var n=Date.now(),r={time:n,x:e.clientX,y:e.clientY},t=n-a,o=f.current.filter(function(e){return e.time>=t});if(o.push(r),Infinity!==s){var i=o.filter(function(e){return n=e,t=r,Math.hypot(t.x-n.x,t.y-n.y)<=s;var n,t});if(i.length>=u)return l.current({count:i.length,event:e}),void(f.current=[])}else if(o.length>=u)return l.current({count:o.length,event:e}),void(f.current=[]);f.current=o};return n.addEventListener("click",r),function(){return n.removeEventListener("click",r)}}},[e,u,a,s])},e.useThreadedWorker=function(e,r){var t=r.concurrency,o="sequential"===r.mode?1:Math.max(1,void 0===t?4:t),u=n.useState(!1),i=u[0],a=u[1],c=n.useState(void 0),s=c[0],l=c[1],f=n.useState(void 0),d=f[0],v=f[1],p=n.useState(0),m=p[0],g=p[1],h=n.useRef([]),y=n.useRef(0),w=n.useRef(0),b=n.useRef(!1),k=n.useRef(e);k.current=e;var S=n.useCallback(function(){g(h.current.length+w.current)},[]),E=n.useCallback(function(){if(!(b.current||w.current>=o)){if(0===h.current.length)return 0===w.current&&a(!1),void S();h.current.sort(function(e,n){return e.priority!==n.priority?e.priority-n.priority:e.sequence-n.sequence});var e=h.current.shift();w.current+=1,a(!0),S(),(0,k.current)(e.data).then(function(n){l(n),v(void 0),e.resolve(n)}).catch(function(n){v(n),e.reject(n)}).finally(function(){w.current-=1,S(),E()}),h.current.length>0&&w.current<o&&E()}},[o,S]),x=n.useCallback(function(e,n){var r;if(b.current)return Promise.reject(new Error("Worker is terminated"));var t=null!=(r=null==n?void 0:n.priority)?r:1,o=++y.current,u=new Promise(function(n,r){h.current.push({data:e,priority:t,sequence:o,resolve:n,reject:r})});return S(),a(!0),queueMicrotask(E),u},[E,S]),T=n.useCallback(function(){var e=h.current;h.current=[],e.forEach(function(e){return e.reject(new Error("Task cleared from queue"))}),S(),0===w.current&&a(!1)},[S]),C=n.useCallback(function(){b.current=!0,T()},[T]);return n.useEffect(function(){return function(){b.current=!0}},[]),{run:x,loading:i,result:s,error:d,queueSize:m,clearQueue:T,terminate:C}},e.useTransition=function(){var e=n.useState(!1),r=e[0],t=e[1];return[n.useCallback(function(e){t(!0),Promise.resolve().then(function(){e(),t(!1)})},[]),r]},e.useWasmCompute=function(e){var r=e.wasmUrl,t=e.exportName,o=void 0===t?"compute":t,u=e.workerUrl,i=e.importObject,a=n.useState(void 0),c=a[0],s=a[1],l=n.useState(!0),f=l[0],d=l[1],v=n.useState(null),p=v[0],m=v[1],g=n.useState(!1),h=g[0],y=g[1],w=n.useRef(null),b=n.useRef(null),k=n.useRef(null);return n.useEffect(function(){if("undefined"==typeof window)return m("useWasmCompute is not available during SSR"),void d(!1);if("undefined"==typeof Worker)return m("Worker is not supported in this environment"),void d(!1);if("undefined"==typeof WebAssembly||"function"!=typeof WebAssembly.instantiate)return m("WebAssembly is not supported in this environment"),void d(!1);m(null),y(!1);var e=function(e){if(e)return new Worker(e);var n=new Blob(["\nself.onmessage = async (e) => {\n const d = e.data;\n if (d.type === 'init') {\n try {\n const res = await fetch(d.wasmUrl);\n const buf = await res.arrayBuffer();\n const mod = await WebAssembly.instantiate(buf, d.importObject || {});\n self.wasmInstance = mod.instance;\n self.exportName = d.exportName || 'compute';\n self.postMessage({ type: 'ready' });\n } catch (err) {\n self.postMessage({ type: 'error', error: (err && err.message) || String(err) });\n }\n return;\n }\n if (d.type === 'compute') {\n try {\n const fn = self.wasmInstance.exports[self.exportName];\n if (typeof fn !== 'function') {\n self.postMessage({ type: 'error', error: 'Export \"' + self.exportName + '\" is not a function' });\n return;\n }\n const result = fn(d.input);\n self.postMessage({ type: 'result', result: result });\n } catch (err) {\n self.postMessage({ type: 'error', error: (err && err.message) || String(err) });\n }\n }\n};\n"],{type:"application/javascript"}),r=URL.createObjectURL(n),t=new Worker(r);return URL.revokeObjectURL(r),t}(u);w.current=e;var n=function(e){var n,r=null!=(n=e.data)?n:{},t=r.type,o=r.result,u=r.error;return"ready"===t?(y(!0),void d(!1)):"error"===t?(m(null!=u?u:"Unknown error"),d(!1),void(k.current&&(k.current(new Error(u)),b.current=null,k.current=null))):void("result"===t&&(s(o),d(!1),b.current&&(b.current(o),b.current=null,k.current=null)))};return e.addEventListener("message",n),e.postMessage({type:"init",wasmUrl:r,exportName:o,importObject:null!=i?i:{}}),function(){e.removeEventListener("message",n),e.terminate(),w.current=null,k.current&&(k.current(new Error("Worker terminated")),b.current=null,k.current=null)}},[r,o,u,i]),{compute:n.useCallback(function(e){return new Promise(function(n,r){w.current&&h?p?r(new Error(p)):(b.current=n,k.current=r,d(!0),w.current.postMessage({type:"compute",input:e})):r(new Error("WASM not ready"))})},[h,p]),result:c,loading:f,error:p,ready:h}},e.useWebRTCIP=function(e){void 0===e&&(e={});var r=e.stunServers,t=void 0===r?v:r,o=e.timeout,u=void 0===o?3e3:o,i=e.onDetect,a=n.useState([]),c=a[0],s=a[1],l=n.useState(!0),f=l[0],p=l[1],m=n.useState(null),g=m[0],h=m[1],y=n.useRef(null),w=n.useRef(null),b=n.useRef(new Set),k=n.useRef(i);return k.current=i,n.useEffect(function(){if("undefined"==typeof window)return p(!1),void h("WebRTC IP detection is not available during SSR");if("undefined"==typeof RTCPeerConnection)return p(!1),void h("RTCPeerConnection is not available");var e=new Set;b.current=e;var n=function(){w.current&&(clearTimeout(w.current),w.current=null),y.current&&(y.current.close(),y.current=null),p(!1)},r=function(n){e.has(n)||(e.add(n),s(function(e){return[].concat(e,[n])}),null==k.current||k.current(n))};try{var o=new RTCPeerConnection({iceServers:[{urls:t}]});y.current=o,o.onicecandidate=function(e){var n,t=e.candidate;t&&t.candidate&&((n=t.candidate.match(d))?[].concat(n):[]).forEach(r)},o.createDataChannel(""),o.createOffer().then(function(e){return o.setLocalDescription(e)}).catch(function(e){h(e instanceof Error?e.message:"Failed to create offer"),n()}),w.current=setTimeout(function(){return n()},u)}catch(e){h(e instanceof Error?e.message:"WebRTC setup failed"),n()}return function(){n()}},[t.join(","),u]),{ips:c,loading:f,error:g}},e.useWorkerNotifications=function(e,r){void 0===r&&(r={});var t=r.maxHistory,o=void 0===t?100:t,u=r.throughputWindowMs,i=void 0===u?1e3:u,a=n.useState([]),c=a[0],s=a[1],l=n.useState(0),f=l[0],d=l[1],v=n.useState(0),p=v[0],m=v[1],g=n.useState([]),h=g[0],y=g[1],w=n.useState(0),b=w[0],k=w[1],S=n.useRef([]),E=n.useRef(0),x=n.useRef(0);n.useEffect(function(){if(e){var n=function(e){var n=function(e){if(null==e||"object"!=typeof e)return null;var n=e.type;return"task_start"!==n&&"task_end"!==n&&"task_fail"!==n&&"queue_size"!==n?null:{type:n,taskId:"string"==typeof e.taskId?e.taskId:void 0,duration:"number"==typeof e.duration?e.duration:void 0,error:"string"==typeof e.error?e.error:void 0,size:"number"==typeof e.size?e.size:void 0,timestamp:Date.now()}}(e.data);if(n)if(y(function(e){return[].concat(e,[n]).slice(-o)}),"task_start"===n.type&&n.taskId)s(function(e){return e.includes(n.taskId)?e:[].concat(e,[n.taskId])});else if("task_end"===n.type){n.taskId&&s(function(e){return e.filter(function(e){return e!==n.taskId})}),d(function(e){return e+1});var r=Date.now()-i;S.current=[].concat(S.current.filter(function(e){return e>=r}),[n.timestamp]),"number"==typeof n.duration&&(E.current+=n.duration,x.current+=1)}else"task_fail"===n.type?(n.taskId&&s(function(e){return e.filter(function(e){return e!==n.taskId})}),m(function(e){return e+1})):"queue_size"===n.type&&"number"==typeof n.size&&k(n.size)};return e.addEventListener("message",n),function(){return e.removeEventListener("message",n)}}},[e,o]);var T=n.useMemo(function(){var e=x.current;return e>0?E.current/e:0},[h]),C=n.useMemo(function(){var e=Date.now()-i;return S.current.filter(function(n){return n>=e}).length/(i/1e3)},[h,i]),I=n.useMemo(function(){return{runningTasks:c,completedCount:f,failedCount:p,averageDurationMs:T,throughputPerSecond:C,currentQueueSize:b,totalProcessed:f+p,recentEventCount:h.length}},[c,f,p,T,C,b,h.length]);return{runningTasks:c,completedCount:f,failedCount:p,eventHistory:h,averageDurationMs:T,throughputPerSecond:C,currentQueueSize:b,progress:I}},e.useWrappedChildren=function(e,t,o){return void 0===o&&(o="preserve"),n.useMemo(function(){if(!e)return e;var n=function(e){if(!r.isValidElement(e))return e;var n,u=e.props||{};n="override"===o?i({},u,t):i({},t,u);var a=null==u?void 0:u.style,c=null==t?void 0:t.style;return a&&c&&"object"==typeof a&&"object"==typeof c&&(n.style="override"===o?i({},a,c):i({},c,a)),r.cloneElement(e,n)};return Array.isArray(e)?e.map(n):n(e)},[e,t,o])}});
@@ -1,4 +1,4 @@
1
- type EventMap = Record<string, (...args: any[]) => void>;
1
+ type EventMap = Record<string, (...args: unknown[]) => void>;
2
2
  /**
3
3
  * A Preact hook to publish and subscribe to custom events across components.
4
4
  * @returns An object with `emit` and `on` methods.
@@ -3,9 +3,9 @@
3
3
  * Uses a singleton connection per (name, version).
4
4
  * @module useIndexedDB
5
5
  */
6
- import type { IndexedDBConfig } from './indexedDB/types';
7
- import type { IDBController } from './indexedDB/dbController';
8
- export type { IndexedDBConfig, IDBController } from './indexedDB';
6
+ import type { IndexedDBConfig } from "./indexedDB/types";
7
+ import type { IDBController } from "./indexedDB/dbController";
8
+ export type { IndexedDBConfig, IDBController } from "./indexedDB";
9
9
  export interface UseIndexedDBReturn {
10
10
  /** Database controller (table, transaction). Null until the database is open. */
11
11
  db: IDBController | null;
@@ -0,0 +1,71 @@
1
+ /** Open Graph / content type for og:type. */
2
+ export type OGType = "website" | "article" | "profile" | "video.other" | "product" | "music.song" | "book";
3
+ /** Config for the useLLMMetadata hook. All fields optional except route. */
4
+ export interface LLMConfig {
5
+ /** Current route path (e.g. "/blog/ai-hooks"). Changes trigger metadata update. */
6
+ route: string;
7
+ /** "manual" = use title/description/tags from config. "auto-extract" = derive from DOM. */
8
+ mode?: "manual" | "auto-extract";
9
+ /** Page title (manual mode). */
10
+ title?: string;
11
+ /** Page description (manual mode). */
12
+ description?: string;
13
+ /** Tags/keywords (manual mode). */
14
+ tags?: string[];
15
+ /** Canonical URL (absolute). */
16
+ canonicalUrl?: string;
17
+ /** Content language (e.g. "en", "en-US"). */
18
+ language?: string;
19
+ /** Open Graph type (website, article, etc.). */
20
+ ogType?: OGType;
21
+ /** OG image URL (absolute). */
22
+ ogImage?: string;
23
+ /** OG image alt text. */
24
+ ogImageAlt?: string;
25
+ /** Site name (e.g. for social previews). */
26
+ siteName?: string;
27
+ /** Author name (for articles). */
28
+ author?: string;
29
+ /** ISO date string (article publish). */
30
+ publishedTime?: string;
31
+ /** ISO date string (article last modified). */
32
+ modifiedTime?: string;
33
+ /** Robots hint (e.g. "index, follow"). */
34
+ robots?: string;
35
+ /** Extra key-value pairs (e.g. section, category). Keys/values are sanitized. */
36
+ extra?: Record<string, string | number | boolean | string[]>;
37
+ }
38
+ /** Payload injected as JSON in the LLM script tag. Only includes defined, safe values. */
39
+ export interface LLMPayload {
40
+ route: string;
41
+ title?: string;
42
+ description?: string;
43
+ tags?: string[];
44
+ outline?: string[];
45
+ canonicalUrl?: string;
46
+ language?: string;
47
+ ogType?: string;
48
+ ogImage?: string;
49
+ ogImageAlt?: string;
50
+ siteName?: string;
51
+ author?: string;
52
+ publishedTime?: string;
53
+ modifiedTime?: string;
54
+ robots?: string;
55
+ generatedAt: string;
56
+ extra?: Record<string, string | number | boolean | string[]>;
57
+ }
58
+ /**
59
+ * Production-ready hook: injects an AI-readable metadata block into the document head
60
+ * when the route changes. Framework-agnostic (React 18+ and Preact 10+ via aliasing).
61
+ *
62
+ * - Rich structure: route, title, description, tags, outline (auto), canonicalUrl, language,
63
+ * ogType, ogImage, ogImageAlt, siteName, author, publishedTime, modifiedTime, robots, extra.
64
+ * - Safe usage: never throws; invalid/missing config is normalized; DOM and JSON are guarded.
65
+ * - Cacheable: if the generated payload is unchanged, the script is not replaced.
66
+ * - SSR-safe: no-op when window/document is undefined.
67
+ * - Cleans up on unmount (removes the script).
68
+ *
69
+ * @param config - Route (required), mode, and optional metadata fields. Can be partial; defaults applied.
70
+ */
71
+ export declare function useLLMMetadata(config: LLMConfig | null | undefined): void;
@@ -1,4 +1,4 @@
1
- import { RefObject } from 'preact';
1
+ import { RefObject } from "preact";
2
2
  export type UseMutationObserverOptions = MutationObserverInit;
3
3
  /**
4
4
  * A Preact hook to observe DOM mutations using MutationObserver.
@@ -1,7 +1,7 @@
1
1
  /** Effective connection type from Network Information API */
2
- export type EffectiveConnectionType = 'slow-2g' | '2g' | '3g' | '4g';
2
+ export type EffectiveConnectionType = "slow-2g" | "2g" | "3g" | "4g";
3
3
  /** Network connection type (e.g., wifi, cellular) */
4
- export type ConnectionType = 'bluetooth' | 'cellular' | 'ethernet' | 'mixed' | 'none' | 'other' | 'unknown' | 'wifi';
4
+ export type ConnectionType = "bluetooth" | "cellular" | "ethernet" | "mixed" | "none" | "other" | "unknown" | "wifi";
5
5
  export interface NetworkState {
6
6
  /** Whether the browser is online */
7
7
  online: boolean;
@@ -33,7 +33,7 @@ export interface NetworkState {
33
33
  * {effectiveType && ` (${effectiveType})`}
34
34
  * {saveData && ' - Reduced data mode'}
35
35
  * </div>
36
- * );
36
+ * );
37
37
  * }
38
38
  * ```
39
39
  */
@@ -1,4 +1,4 @@
1
- export type PreferredTheme = 'light' | 'dark' | 'no-preference';
1
+ export type PreferredTheme = "light" | "dark" | "no-preference";
2
2
  /**
3
3
  * A Preact hook that returns the user's preferred color scheme based on the
4
4
  * `prefers-color-scheme` media query. Updates reactively when the user changes
@@ -1,4 +1,4 @@
1
- import type { RefObject } from 'preact';
1
+ import type { RefObject } from "preact";
2
2
  export interface RageClickPayload {
3
3
  /** Number of clicks that triggered the rage click */
4
4
  count: number;
@@ -1,4 +1,4 @@
1
- export type ThreadedWorkerMode = 'sequential' | 'parallel';
1
+ export type ThreadedWorkerMode = "sequential" | "parallel";
2
2
  export interface UseThreadedWorkerOptions {
3
3
  /** Sequential: single worker, priority-ordered. Parallel: worker pool. */
4
4
  mode: ThreadedWorkerMode;
@@ -2,4 +2,7 @@
2
2
  * Mimics React's useTransition hook in Preact.
3
3
  * @returns [startTransition, isPending]
4
4
  */
5
- export declare function useTransition(): [startTransition: (callback: () => void) => void, isPending: boolean];
5
+ export declare function useTransition(): [
6
+ startTransition: (callback: () => void) => void,
7
+ isPending: boolean
8
+ ];
@@ -3,7 +3,7 @@
3
3
  * @module useWorkerNotifications
4
4
  */
5
5
  /** Supported worker event types for tracking. Worker should postMessage with these shapes. */
6
- export type WorkerEventType = 'task_start' | 'task_end' | 'task_fail' | 'queue_size';
6
+ export type WorkerEventType = "task_start" | "task_end" | "task_fail" | "queue_size";
7
7
  export interface WorkerNotificationEvent {
8
8
  type: WorkerEventType;
9
9
  taskId?: string;
@@ -1,5 +1,5 @@
1
- import { ComponentChildren } from 'preact';
2
- export type InjectableProps = Record<string, any>;
1
+ import { ComponentChildren } from "preact";
2
+ export type InjectableProps = Record<string, unknown>;
3
3
  /**
4
4
  * A Preact hook to wrap children components and inject additional props into them.
5
5
  * @param children - The children to wrap and enhance with props.
@@ -7,4 +7,4 @@ export type InjectableProps = Record<string, any>;
7
7
  * @param mergeStrategy - How to handle prop conflicts ('override' | 'preserve'). Defaults to 'preserve'.
8
8
  * @returns Enhanced children with injected props.
9
9
  */
10
- export declare function useWrappedChildren(children: ComponentChildren, injectProps: InjectableProps, mergeStrategy?: 'override' | 'preserve'): ComponentChildren;
10
+ export declare function useWrappedChildren(children: ComponentChildren, injectProps: InjectableProps, mergeStrategy?: "override" | "preserve"): ComponentChildren;
package/docs/README.md ADDED
@@ -0,0 +1,111 @@
1
+ # Preact Missing Hooks — Demo & Usage
2
+
3
+ This folder contains a **live demo** of all hooks from `preact-missing-hooks`. Each hook is shown with a short flow description, example code, and an interactive “Live” panel.
4
+
5
+ ## Running the demo
6
+
7
+ ### Option 1: Local build + static server (recommended)
8
+
9
+ From the project root:
10
+
11
+ ```bash
12
+ npm run build
13
+ npx serve -l 5000
14
+ ```
15
+
16
+ Then open **http://localhost:5000/docs/** in your browser. The demo will load the built package from `../dist/index.module.js`.
17
+
18
+ ### Option 2: Demo script
19
+
20
+ From the project root you can use the existing demo script:
21
+
22
+ ```bash
23
+ npm run demo
24
+ ```
25
+
26
+ Then open **http://localhost:5000/docs/** (or the port shown).
27
+
28
+ ### Option 3: Unpkg (no build)
29
+
30
+ Open `docs/index.html` in a browser that supports ES modules and import maps. The demo will load Preact and `preact-missing-hooks` from unpkg. Some features (e.g. `useWasmCompute` with a local WASM file) may be limited when opened as a file.
31
+
32
+ ---
33
+
34
+ ## What the demo includes
35
+
36
+ | Hook | What you can try |
37
+ | -------------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
38
+ | **useTransition** | Deferred state update; button shows “Pending…” then count. |
39
+ | **useMutationObserver** | Add a node in the observed area; see mutation count. |
40
+ | **useEventBus** | Emit “greet” and see the message in another part of the UI. |
41
+ | **useWrappedChildren** | Children buttons get injected styles. |
42
+ | **usePreferredTheme** | Shows light / dark / no-preference from system. |
43
+ | **useNetworkState** | Online/offline and connection type. |
44
+ | **useClipboard** | Copy and paste; see “Copied!” and pasted text. |
45
+ | **useRageClick** | Click the area 3+ times quickly; rage click count. |
46
+ | **useThreadedWorker** | Run a task; see loading and result. |
47
+ | **useIndexedDB** | Insert, bulk insert, query, update, delete, clear. |
48
+ | **useWebRTCIP** | Detect IP via WebRTC (may take a few seconds). |
49
+ | **useWasmCompute** | Run WASM in a worker (needs `add.wasm` in docs). |
50
+ | **useWorkerNotifications** | Run/fail tasks and queue updates; toasts show events. |
51
+ | **useLLMMetadata** | Change “route” with buttons; see injected script info in the Live panel and `<script data-llm="true">` in the document head. Safe with `null`/`undefined` config (minimal payload with `route: "/"`). |
52
+
53
+ ---
54
+
55
+ ## Demo usage patterns
56
+
57
+ ### Minimal Preact example
58
+
59
+ ```js
60
+ import { h, render } from "preact";
61
+ import { useState } from "preact/hooks";
62
+ import { useClipboard, usePreferredTheme } from "preact-missing-hooks";
63
+
64
+ function App() {
65
+ const { copy, copied } = useClipboard();
66
+ const theme = usePreferredTheme();
67
+ return h(
68
+ "div",
69
+ {},
70
+ h("button", { onClick: () => copy("Hi") }, copied ? "Copied!" : "Copy"),
71
+ h("span", {}, " Theme: " + theme)
72
+ );
73
+ }
74
+ render(h(App), document.getElementById("root"));
75
+ ```
76
+
77
+ ### With React
78
+
79
+ ```jsx
80
+ import { useTransition, useLLMMetadata } from "preact-missing-hooks/react";
81
+ import { useLocation } from "react-router-dom";
82
+
83
+ function App() {
84
+ const { pathname } = useLocation();
85
+ useLLMMetadata({ route: pathname, mode: "auto-extract", tags: ["my-app"] });
86
+ const [startTransition, isPending] = useTransition();
87
+ // ...
88
+ }
89
+ ```
90
+
91
+ ### useLLMMetadata in the demo
92
+
93
+ The **useLLMMetadata** Live panel simulates route changes. Click “Route: /”, “Route: /blog”, or “Route: /docs”. Each change:
94
+
95
+ 1. Removes any existing `<script data-llm="true">`.
96
+ 2. Injects a new script with `type="application/llm+json"` containing `route`, `title`, `description`, `tags`, and `generatedAt`.
97
+
98
+ Inspect the page’s `<head>` in DevTools to see the script. The Live panel shows a short summary of the injected payload. The hook never throws: passing `null` or `undefined` as config is safe and yields a minimal payload with `route: "/"` and `generatedAt`.
99
+
100
+ ---
101
+
102
+ ## File layout
103
+
104
+ - **index.html** — Page shell, styles, and import map; mounts the app into `#root`.
105
+ - **main.js** — Imports the package and Preact, defines demo components and the `HOOKS` list, renders the app.
106
+
107
+ To add a new hook to the demo:
108
+
109
+ 1. Import it in `main.js` from the package.
110
+ 2. Implement a `DemoXxx` component that uses the hook.
111
+ 3. Add an entry to the `HOOKS` array with `name`, `flow`, `summary`, `code`, and `Live: DemoXxx`.