PageSourceSearch

https://bookrix.com/_next/static/chunks/5434-068ce96780e46db6.js

js bookrix.com collected 2026-10-02 05:58:34 UTC 13,620 bytes, 1 lines download raw bytes

1"use strict";(self.webpackChunk_N_E=self.webpackChunk_N_E||[]).push([[5434],{5434:function(e,n,t){t.d(n,{R:function(){return H}});var r=t(59625),o=t(54661);async function a(e,n,t,r){try{var a;let{data:s}=await (0,o.C)({query:e,variables:{limit:t,nextToken:r}}),c=null!==(a=null==s?void 0:s[n])&&void 0!==a?a:{};return[c.items,c.nextToken]}catch(e){return console.log("GraphQL Error ".concat(n,":"),e),[[],null]}}async function s(e,n){return a("\n  query ListSearchBooks($limit: Int, $nextToken: String) {\n    listBooks(limit: $limit, nextToken: $nextToken) {\n      items {\n        id\n        slug\n        title\n        subtitle\n        image\n        status\n        visibility\n        authors {\n          firstName\n          lastName\n        }\n      }\n      nextToken\n    }\n  }\n","listBooks",e,n)}async function c(e,n){return a("\n  query ListSearchStoryChannels(\n    $limit: Int\n    $nextToken: String\n  ) {\n    listChannelsByType(\n      channelType: STORY\n      limit: $limit\n      nextToken: $nextToken\n    ) {\n      items {\n        id\n        slug\n        title\n        subtitle\n        image\n        bookCoverUrl\n        status\n        visibility\n      }\n      nextToken\n    }\n  }\n","listChannelsByType",e,n)}async function i(e,n){return a("\n  query ListSearchRegularChannels(\n    $limit: Int\n    $nextToken: String\n  ) {\n    listChannelsByType(\n      channelType: REGULAR\n      limit: $limit\n      nextToken: $nextToken\n    ) {\n      items {\n        id\n        slug\n        title\n        subtitle\n        image\n        status\n        visibility\n        postCount\n        commentCount\n        numFollowers\n        createdAt\n      }\n      nextToken\n    }\n  }\n","listChannelsByType",e,n)}async function l(e,n){return a("\n  query ListSearchAuthors($limit: Int, $nextToken: String) {\n    listAuthors(limit: $limit, nextToken: $nextToken) {\n      items {\n        username\n        displayName\n        headline\n        thumb\n      }\n      nextToken\n    }\n  }\n","listAuthors",e,n)}async function h(e,n){return a("\n  query ListSearchPosts($limit: Int, $nextToken: String) {\n    listPosts(limit: $limit, nextToken: $nextToken) {\n      items {\n        id\n        slug\n        title\n        channelId\n        channel {\n          slug\n          title\n          channelType\n        }\n      }\n      nextToken\n    }\n  }\n","listPosts",e,n)}let u=["core","posts"],d=null;function m(e,n){return(d||(d=new Promise((e,n)=>{if("undefined"==typeof indexedDB){n(Error("IndexedDB unavailable"));return}let t=indexedDB.open("bookrix-search-cache",1);t.onupgradeneeded=()=>{let e=t.result;for(let n of u)e.objectStoreNames.contains(n)||e.createObjectStore(n,{keyPath:["locale","schemaVersion"]})},t.onsuccess=()=>e(t.result),t.onerror=()=>n(t.error),t.onblocked=()=>n(Error("IndexedDB open blocked"))}))).then(t=>{let r=t.transaction(e,n);return[r.objectStore(e),r]})}async function p(e,n,t){let[r]=await m(e,"readonly");return new Promise((e,o)=>{let a=r.get([n,t]);a.onsuccess=()=>e(a.result||null),a.onerror=()=>o(a.error)})}async function y(e,n){let[t,r]=await m(e,"readwrite");return new Promise((e,o)=>{t.put(n),r.oncomplete=()=>e(),r.onerror=()=>o(r.error),r.onabort=()=>o(r.error||Error("IDB transaction aborted"))})}async function f(e){let[n,t]=await m(e,"readwrite");return new Promise((e,r)=>{n.clear(),t.oncomplete=()=>e(),t.onerror=()=>r(t.error)})}let w="\n    type\n    id\n    slug\n    title\n    subtitle\n    image\n    status\n    visibility\n    authors { firstName lastName }\n",S="\n    type\n    id\n    slug\n    title\n    subtitle\n    image\n    bookCoverUrl\n    status\n    visibility\n",g="\n    type\n    id\n    slug\n    title\n    subtitle\n    image\n    status\n    visibility\n    postCount\n    commentCount\n    numFollowers\n    createdAt\n",k="\n    type\n    username\n    displayName\n    headline\n    thumb\n",A="\n    type\n    id\n    slug\n    title\n    channelId\n    channel { slug title channelType }\n",b="\n    query SearchChangesCore(\n        $since: AWSDateTime!\n        $locale: String!\n        $schemaVersion: Int!\n    ) {\n        changesSince(\n            scope: CORE\n            since: $since\n            locale: $locale\n            schemaVersion: $schemaVersion\n        ) {\n            created {\n                ... on SearchItemBook    { ".concat(w," }
1\n                ... on SearchItemStory   { ").concat(S," }\n                ... on SearchItemChannel { ").concat(g," }\n                ... on SearchItemAuthor  { ").concat(k," }\n            }\n            updated {\n                ... on SearchItemBook    { ").concat(w," }\n                ... on SearchItemStory   { ").concat(S," }\n                ... on SearchItemChannel { ").concat(g," }\n                ... on SearchItemAuthor  { ").concat(k," }\n            }\n            deleted { id type }\n            appliedAt\n        }\n    }\n"),v="\n    query SearchChangesPosts(\n        $since: AWSDateTime!\n        $locale: String!\n        $schemaVersion: Int!\n    ) {\n        changesSince(\n            scope: POSTS\n            since: $since\n            locale: $locale\n            schemaVersion: $schemaVersion\n        ) {\n            created {\n                ... on SearchItemPost { ".concat(A," }\n            }\n            updated {\n                ... on SearchItemPost { ").concat(A," }\n            }\n            deleted { id type }\n            appliedAt\n        }\n    }\n");class T extends Error{constructor(e,{errorType:n,op:t}={}){super(e),this.name="SearchApiError",this.errorType=n||null,this.op=t||null}}function _(e){var n;return e&&e.length&&(null===(n=e[0])||void 0===n?void 0:n.errorType)||null}async function $(e,n,t){let r,a;try{({data:r,errors:a}=await (0,o.C)({query:e,variables:n}))}catch(r){var s,c;if(r instanceof T)throw r;let e=(s=null==r?void 0:r.errors)&&s.length&&(null===(c=s[0])||void 0===c?void 0:c.message)||(null==r?void 0:r.message)||"".concat(t," failed"),n=new T("".concat(t,": ").concat(e),{errorType:_(null==r?void 0:r.errors),op:t});throw n.cause=r,n}if(a&&a.length)throw new T("".concat(t,": ").concat(a[0].message||"unknown"),{errorType:_(a),op:t});return r}async function C(e,n){let t=await $("\n    query SearchVersion(\n        $scope: SearchScope!\n        $locale: String!\n        $schemaVersion: Int!\n    ) {\n        searchVersion(\n            scope: $scope\n            locale: $locale\n            schemaVersion: $schemaVersion\n        ) {\n            snapshotAt\n            snapshotUrl\n            serverNow\n            deltaHorizonAt\n        }\n    }\n",{scope:e.toUpperCase(),locale:n,schemaVersion:1},"probeVersion");return null==t?void 0:t.searchVersion}async function I(e,n,t){let r=await $("posts"===e?v:b,{since:n,locale:t,schemaVersion:1},"fetchDelta(".concat(e,")"));return null==r?void 0:r.changesSince}async function L(e){let n;try{n=await fetch(e,{credentials:"omit"})}catch(n){if((null==n?void 0:n.name)==="TypeError")try{await fetch(e,{mode:"no-cors",credentials:"omit"});let n=Error("snapshot CORS-blocked for ".concat(e));throw n.errorType="CORS_BLOCKED",n}catch(e){if("CORS_BLOCKED"===e.errorType)throw e}throw n}if(!n.ok)throw Error("snapshot fetch ".concat(n.status," for ").concat(e));return n.json()}let x=["core","posts"];function E(e,n){var t;(null===(t=window.__searchBench)||void 0===t?void 0:t.record)&&window.__searchBench.record({event:e,...n})}function V(e){var n;let t=null!==(n=e.id)&&void 0!==n?n:e.username;return"".concat(e.type||"",":").concat(t)}async function B(e){try{await f(e)}catch(e){}}async function D(e){let n,t,{scope:r,locale:o}=e,a=performance.now(),s=null;try{s=await p(r,o,1)}catch(e){E("idb_read_failed",{scope:r,locale:o,reason:e.message})}try{n=await C(r,o)}catch(e){throw"SCHEMA_VERSION_MISMATCH"===e.errorType&&await B(r),e}if(!n)throw Error("probe returned no data");let c=function(e){let{cached:n,probe:t,currentSchemaVersion:r}=e;return!n||n.schemaVersion!==r||n.corpusAt<t.snapshotAt?{action:"snapshot"}:n.corpusAt<t.serverNow?{action:"delta",since:n.corpusAt}:{action:"noop"}}({cached:s,probe:n,currentSchemaVersion:1});if("noop"===c.action)return E("hydrate_path",{scope:r,locale:o,path:"cache-hit",duration_ms:Math.round(performance.now()-a)}),{items:s.items,corpusAt:s.corpusAt};if("delta"===c.action)try{let e=await I(r,c.since,o);if(!e)throw Error("delta returned no data");let n=function(e,n){let t=new Map(e.map(e=>[V(e),e]));for(let e of n.created||[])t.set(V(e),e);for(let e of n.updated||[])t.set(V(e),e);for(let e of n.deleted||[])t.delete("".concat(e.type||"",":").concat(e.id));return Array.from(t.values())}
1(s.items,e),t={locale:o,schemaVersion:1,corpusAt:e.appliedAt,items:n};try{await y(r,t)}catch(e){E("idb_write_failed",{scope:r,locale:o,reason:e.message})}return E("hydrate_path",{scope:r,locale:o,path:"delta",duration_ms:Math.round(performance.now()-a)}),{items:t.items,corpusAt:t.corpusAt}}catch(e){if("DELTA_HORIZON_EXCEEDED"===e.errorType)E("hydrate_horizon_exceeded",{scope:r,locale:o});else if("SCHEMA_VERSION_MISMATCH"===e.errorType)throw await B(r),e;else throw e}try{t=await L(n.snapshotUrl)}catch(e){throw(null==e?void 0:e.errorType)==="CORS_BLOCKED"&&E("hydrate_cors_blocked",{scope:r,locale:o,url:n.snapshotUrl}),e}if(1!==t.schemaVersion)throw Error("snapshot schema ".concat(t.schemaVersion," ")+"!= client ".concat(1));let i={locale:o,schemaVersion:1,corpusAt:t.snapshotAt,items:t.items};try{await y(r,i)}catch(e){E("idb_write_failed",{scope:r,locale:o,reason:e.message})}return E("hydrate_path",{scope:r,locale:o,path:"snapshot",duration_ms:Math.round(performance.now()-a)}),{items:i.items,corpusAt:i.corpusAt}}async function F(e){let[n,t]=await Promise.all(x.map(n=>D({scope:n,locale:e})));return{core:n.items,posts:t.items}}async function O(e){let n={};for(let t of x){let r;let o=performance.now();try{r=await p(t,e,1)}catch(n){throw E("idb_read_failed",{scope:t,locale:e,reason:n.message}),n}if(!r)throw Error("no cached ".concat(t," corpus for ").concat(e));E("hydrate_path",{scope:t,locale:e,path:"cache-hit",duration_ms:Math.round(performance.now()-o)}),n[t]=r.items}return{core:n.core,posts:n.posts}}function N(){let e=null;return function(n,t){if(e&&e.key===n)return e.promise;let r=(async()=>{try{return await t()}finally{e&&e.promise===r&&(e=null)}})();return e={key:n,promise:r},r}}let P="bookrix-search-cache-meta";function R(e){let{lastFetchedAt:n,cachedLocale:t}=e;if("undefined"!=typeof localStorage)try{localStorage.setItem(P,JSON.stringify({metaSchema:1,searchSchemaVersion:1,lastFetchedAt:n,cachedLocale:t}))}catch(e){}}let M=N(),q=N();async function U(e,n){for(var t=arguments.length,r=Array(t>2?t-2:0),o=2;o<t;o++)r[o-2]=arguments[o];let a=[],s=null,c=0;do{let[t,o]=await e(1e3,s,...r);if(!t)break;if(a=a.concat(t),c+=1,(s=o)&&c>=20){console.warn("[searchStore] ".concat(n," hit MAX_PAGES safety ")+"cap (".concat(20," pages \xd7 ").concat(1e3," ")+"items = ".concat(2e4," max). ")+"Results truncated; consider server-side search.");break}}while(s);return a}let H=(0,r.Ue)((e,n)=>({books:[],stories:[],channels:[],users:[],posts:[],lastFetchedAt:null,cachedLocale:null,isLoading:!1,error:null,hydrate:async t=>{let r=n();if(!(r.lastFetchedAt&&r.cachedLocale===t&&Date.now()-r.lastFetchedAt<3e5))return M(t,async()=>{let r=n();if(r.lastFetchedAt&&r.cachedLocale===t&&Date.now()-r.lastFetchedAt<3e5)return;let o=function(){if("undefined"==typeof localStorage)return null;try{var e,n;let t=localStorage.getItem(P);if(!t)return null;let r=JSON.parse(t);if(1!==r.metaSchema||1!==r.searchSchemaVersion)return null;return{lastFetchedAt:null!==(e=r.lastFetchedAt)&&void 0!==e?e:null,cachedLocale:null!==(n=r.cachedLocale)&&void 0!==n?n:null}}catch(e){return null}}();if((null==o?void 0:o.lastFetchedAt)&&o.cachedLocale===t&&Date.now()-o.lastFetchedAt<3e5)try{let{core:n,posts:r}=await O(t),a={books:[],stories:[],channels:[],users:[]};for(let e of n)switch(e.type){case"book":a.books.push(e);break;case"story":a.stories.push(e);break;case"channel":a.channels.push(e);break;case"author":a.users.push(e)}e({...a,posts:r||[],lastFetchedAt:o.lastFetchedAt,cachedLocale:t,isLoading:!1});return}catch(e){}e({isLoading:!0,error:null});try{let{core:n,posts:r}=await F(t),o={books:[],stories:[],channels:[],users:[]};for(let e of n)switch(e.type){case"book":o.books.push(e);break;case"story":o.stories.push(e);break;case"channel":o.channels.push(e);break;case"author":o.users.push(e)}let a=Date.now();e({...o,posts:r||[],lastFetchedAt:a,cachedLocale:t,isLoading:!1}),R({lastFetchedAt:a,cachedLocale:t})}catch(e){var a;console.warn("[searchStore] hydrate failed, falling back to fetchAll:",(null==e?void 0:e.message)||e),(null===(a=window.__searchBench)||void 0===a?void 0:a.record)&&window.__searchBench.record({event:"hydrate_fallback",reason:(null==e?void 0:e.message)||String(e)}),await n().fetchAll(t)}})},fetchAll:async t=>{let r=n();if(!(r.lastFetchedAt&&r.cachedLocale===t&&Date.now()-r.lastFetchedAt<3e5))return q(t,async()=>{e({isLoading:!0,error:null});
1try{let[n,r,o,a,u]=await Promise.all([U(s,"books"),U(c,"stories"),U(i,"channels"),U(l,"users"),U(h,"posts")]),d=Date.now();e({books:n||[],stories:r||[],channels:o||[],users:a||[],posts:u||[],lastFetchedAt:d,cachedLocale:t,isLoading:!1}),R({lastFetchedAt:d,cachedLocale:t})}catch(n){console.error("Search fetchAll failed:",n),e({isLoading:!1,error:n.message})}})},clearCache:()=>{e({books:[],stories:[],channels:[],users:[],posts:[],lastFetchedAt:null,cachedLocale:null}),function(){if("undefined"!=typeof localStorage)try{localStorage.removeItem(P)}catch(e){}}()}}))}}]);

Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.