your personal website on atproto - mirror blento.app

add some caching

Florian d7578d0d 96324db6

+181 -40
+2 -1
package.json
··· 43 43 "dependencies": { 44 44 "@atcute/client": "^3.1.0", 45 45 "@atcute/oauth-browser-client": "^1.0.13", 46 - "@atproto/api": "^0.15.6", 46 + "@atproto/api": "^0.18.13", 47 47 "@atproto/common-web": "^0.4.2", 48 + "@cloudflare/workers-types": "^4.20260109.0", 48 49 "@foxui/colors": "^0.4.7", 49 50 "@foxui/core": "^0.4.7", 50 51 "@foxui/social": "^0.4.7",
+91 -25
pnpm-lock.yaml
··· 15 15 specifier: ^1.0.13 16 16 version: 1.0.18 17 17 '@atproto/api': 18 - specifier: ^0.15.6 19 - version: 0.15.6 18 + specifier: ^0.18.13 19 + version: 0.18.13 20 20 '@atproto/common-web': 21 21 specifier: ^0.4.2 22 22 version: 0.4.2 23 + '@cloudflare/workers-types': 24 + specifier: ^4.20260109.0 25 + version: 4.20260109.0 23 26 '@foxui/colors': 24 27 specifier: ^0.4.7 25 28 version: 0.4.7(svelte@5.45.8)(tailwindcss@4.1.5) ··· 97 100 version: 7.2.0 98 101 wrangler: 99 102 specifier: ^4.54.0 100 - version: 4.54.0(@cloudflare/workers-types@4.20251225.0) 103 + version: 4.54.0(@cloudflare/workers-types@4.20260109.0) 101 104 devDependencies: 102 105 '@eslint/compat': 103 106 specifier: ^1.2.5 ··· 110 113 version: 4.0.0(@sveltejs/kit@2.20.8(@sveltejs/vite-plugin-svelte@5.0.3(svelte@5.45.8)(vite@6.3.5(jiti@2.4.2)(lightningcss@1.29.2)))(svelte@5.45.8)(vite@6.3.5(jiti@2.4.2)(lightningcss@1.29.2))) 111 114 '@sveltejs/adapter-cloudflare': 112 115 specifier: ^7.2.4 113 - version: 7.2.4(@sveltejs/kit@2.20.8(@sveltejs/vite-plugin-svelte@5.0.3(svelte@5.45.8)(vite@6.3.5(jiti@2.4.2)(lightningcss@1.29.2)))(svelte@5.45.8)(vite@6.3.5(jiti@2.4.2)(lightningcss@1.29.2)))(wrangler@4.54.0(@cloudflare/workers-types@4.20251225.0)) 116 + version: 7.2.4(@sveltejs/kit@2.20.8(@sveltejs/vite-plugin-svelte@5.0.3(svelte@5.45.8)(vite@6.3.5(jiti@2.4.2)(lightningcss@1.29.2)))(svelte@5.45.8)(vite@6.3.5(jiti@2.4.2)(lightningcss@1.29.2)))(wrangler@4.54.0(@cloudflare/workers-types@4.20260109.0)) 114 117 '@sveltejs/adapter-static': 115 118 specifier: ^3.0.8 116 119 version: 3.0.8(@sveltejs/kit@2.20.8(@sveltejs/vite-plugin-svelte@5.0.3(svelte@5.45.8)(vite@6.3.5(jiti@2.4.2)(lightningcss@1.29.2)))(svelte@5.45.8)(vite@6.3.5(jiti@2.4.2)(lightningcss@1.29.2))) ··· 183 186 '@atcute/uint8array@1.0.1': 184 187 resolution: {integrity: sha512-AAnlFKyfDRgb9GNZJbhQ6OuMhbmNPirQyapb8KnmcEhxQZ3+tt+4NcwqekEegY4MpNqSTYeeTdyxq0wGZv1JHg==, tarball: https://registry.npmjs.org/@atcute/uint8array/-/uint8array-1.0.1.tgz} 185 188 186 - '@atproto/api@0.15.6': 187 - resolution: {integrity: sha512-hKwrBf60LcI4BqArWyrhWJWIpjwAWUJpW3PVvNzUB1q2W/ByC0JAuwq/F8tZpCEiiVBzHjHVRx4QNA2TA1cG3g==, tarball: https://registry.npmjs.org/@atproto/api/-/api-0.15.6.tgz} 189 + '@atproto/api@0.15.27': 190 + resolution: {integrity: sha512-ok/WGafh1nz4t8pEQGtAF/32x2E2VDWU4af6BajkO5Gky2jp2q6cv6aB2A5yuvNNcc3XkYMYipsqVHVwLPMF9g==, tarball: https://registry.npmjs.org/@atproto/api/-/api-0.15.27.tgz} 191 + 192 + '@atproto/api@0.18.13': 193 + resolution: {integrity: sha512-CULZ01pSJDltLS/Gc9MMrhFzB6OM3ezyZw7KoeLT/sBfwgA1ddA4mWdTh7DIRosPRigXtA05bnoiCutZbQDo+Q==, tarball: https://registry.npmjs.org/@atproto/api/-/api-0.18.13.tgz} 194 + 195 + '@atproto/common-web@0.4.11': 196 + resolution: {integrity: sha512-VHejNmSABU8/03VrQ3e36AmT5U3UIeio+qSUqCrO1oNgrJcWfGy1rpj0FVtUugWF8Un29+yzkukzWGZfXL70rQ==, tarball: https://registry.npmjs.org/@atproto/common-web/-/common-web-0.4.11.tgz} 188 197 189 198 '@atproto/common-web@0.4.2': 190 199 resolution: {integrity: sha512-vrXwGNoFGogodjQvJDxAeP3QbGtawgZute2ed1XdRO0wMixLk3qewtikZm06H259QDJVu6voKC5mubml+WgQUw==, tarball: https://registry.npmjs.org/@atproto/common-web/-/common-web-0.4.2.tgz} 191 200 192 - '@atproto/lexicon@0.4.11': 193 - resolution: {integrity: sha512-btefdnvNz2Ao2I+qbmj0F06HC8IlrM/IBz6qOBS50r0S6uDf5tOO+Mv2tSVdimFkdzyDdLtBI1sV36ONxz2cOw==, tarball: https://registry.npmjs.org/@atproto/lexicon/-/lexicon-0.4.11.tgz} 201 + '@atproto/lex-data@0.0.7': 202 + resolution: {integrity: sha512-W/Q5o9o7n2Sv3UywckChu01X5lwQUtaiiOkGJLnRsdkQTyC6813nPgY+p2sG7NwwM+82lu+FUV9fE/Ul3VqaJw==, tarball: https://registry.npmjs.org/@atproto/lex-data/-/lex-data-0.0.7.tgz} 203 + 204 + '@atproto/lex-json@0.0.7': 205 + resolution: {integrity: sha512-bjNPD5M/MhLfjNM7tcxuls80UgXpHqxdOxDXEUouAtZQV/nIDhGjmNUvKxOmOgnDsiZRnT2g5y3onrnjH3a44g==, tarball: https://registry.npmjs.org/@atproto/lex-json/-/lex-json-0.0.7.tgz} 206 + 207 + '@atproto/lexicon@0.4.14': 208 + resolution: {integrity: sha512-jiKpmH1QER3Gvc7JVY5brwrfo+etFoe57tKPQX/SmPwjvUsFnJAow5xLIryuBaJgFAhnTZViXKs41t//pahGHQ==, tarball: https://registry.npmjs.org/@atproto/lexicon/-/lexicon-0.4.14.tgz} 209 + 210 + '@atproto/lexicon@0.6.0': 211 + resolution: {integrity: sha512-5veb8aD+J5M0qszLJ+73KSFsFrJBgAY/nM1TSAJvGY7fNc9ZAT+PSUlmIyrdye9YznAZ07yktalls/TwNV7cHQ==, tarball: https://registry.npmjs.org/@atproto/lexicon/-/lexicon-0.6.0.tgz} 194 212 195 213 '@atproto/syntax@0.4.0': 196 214 resolution: {integrity: sha512-b9y5ceHS8YKOfP3mdKmwAx5yVj9294UN7FG2XzP6V5aKUdFazEYRnR9m5n5ZQFKa3GNvz7de9guZCJ/sUTcOAA==, tarball: https://registry.npmjs.org/@atproto/syntax/-/syntax-0.4.0.tgz} 197 215 198 - '@atproto/xrpc@0.7.0': 199 - resolution: {integrity: sha512-SfhP9dGx2qclaScFDb58Jnrmim5nk4geZXCqg6sB0I/KZhZEkr9iIx1hLCp+sxkIfEsmEJjeWO4B0rjUIJW5cw==, tarball: https://registry.npmjs.org/@atproto/xrpc/-/xrpc-0.7.0.tgz} 216 + '@atproto/syntax@0.4.2': 217 + resolution: {integrity: sha512-X9XSRPinBy/0VQ677j8VXlBsYSsUXaiqxWVpGGxJYsAhugdQRb0jqaVKJFtm6RskeNkV6y9xclSUi9UYG/COrA==, tarball: https://registry.npmjs.org/@atproto/syntax/-/syntax-0.4.2.tgz} 218 + 219 + '@atproto/xrpc@0.7.7': 220 + resolution: {integrity: sha512-K1ZyO/BU8JNtXX5dmPp7b5UrkLMMqpsIa/Lrj5D3Su+j1Xwq1m6QJ2XJ1AgjEjkI1v4Muzm7klianLE6XGxtmA==, tarball: https://registry.npmjs.org/@atproto/xrpc/-/xrpc-0.7.7.tgz} 200 221 201 222 '@cloudflare/kv-asset-handler@0.4.1': 202 223 resolution: {integrity: sha512-Nu8ahitGFFJztxUml9oD/DLb7Z28C8cd8F46IVQ7y5Btz575pvMY8AqZsXkX7Gds29eCKdMgIHjIvzskHgPSFg==, tarball: https://registry.npmjs.org/@cloudflare/kv-asset-handler/-/kv-asset-handler-0.4.1.tgz} ··· 241 262 cpu: [x64] 242 263 os: [win32] 243 264 244 - '@cloudflare/workers-types@4.20251225.0': 245 - resolution: {integrity: sha512-ZZl0cNLFcsBRFKtMftKWOsfAybUYSeiTMzpQV1NlTVlByHAs1rGQt45Jw/qz8LrfHoq9PGTieSj9W350Gi4Pvg==, tarball: https://registry.npmjs.org/@cloudflare/workers-types/-/workers-types-4.20251225.0.tgz} 265 + '@cloudflare/workers-types@4.20260109.0': 266 + resolution: {integrity: sha512-90vx2lVm+fhQyE8FKqNhT8JBI8GuY0biAwxTzvzeRIdWVo2ArCpUfYMYq4kzaGTfA6NwCmXmBFSgnqfG6OFxLw==, tarball: https://registry.npmjs.org/@cloudflare/workers-types/-/workers-types-4.20260109.0.tgz} 246 267 247 268 '@cspotcode/source-map-support@0.8.1': 248 269 resolution: {integrity: sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw==, tarball: https://registry.npmjs.org/@cspotcode/source-map-support/-/source-map-support-0.8.1.tgz} ··· 2663 2684 unenv@2.0.0-rc.24: 2664 2685 resolution: {integrity: sha512-i7qRCmY42zmCwnYlh9H2SvLEypEFGye5iRmEMKjcGi7zk9UquigRjFtTLz0TYqr0ZGLZhaMHl/foy1bZR+Cwlw==, tarball: https://registry.npmjs.org/unenv/-/unenv-2.0.0-rc.24.tgz} 2665 2686 2687 + unicode-segmenter@0.14.5: 2688 + resolution: {integrity: sha512-jHGmj2LUuqDcX3hqY12Ql+uhUTn8huuxNZGq7GvtF6bSybzH3aFgedYu/KTzQStEgt1Ra2F3HxadNXsNjb3m3g==, tarball: https://registry.npmjs.org/unicode-segmenter/-/unicode-segmenter-0.14.5.tgz} 2689 + 2666 2690 unpipe@1.0.0: 2667 2691 resolution: {integrity: sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==, tarball: https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz} 2668 2692 engines: {node: '>= 0.8'} ··· 2818 2842 2819 2843 '@atcute/uint8array@1.0.1': {} 2820 2844 2821 - '@atproto/api@0.15.6': 2845 + '@atproto/api@0.15.27': 2822 2846 dependencies: 2823 2847 '@atproto/common-web': 0.4.2 2824 - '@atproto/lexicon': 0.4.11 2848 + '@atproto/lexicon': 0.4.14 2825 2849 '@atproto/syntax': 0.4.0 2826 - '@atproto/xrpc': 0.7.0 2850 + '@atproto/xrpc': 0.7.7 2827 2851 await-lock: 2.2.2 2828 2852 multiformats: 9.9.0 2829 2853 tlds: 1.258.0 2830 2854 zod: 3.24.4 2831 2855 2856 + '@atproto/api@0.18.13': 2857 + dependencies: 2858 + '@atproto/common-web': 0.4.11 2859 + '@atproto/lexicon': 0.6.0 2860 + '@atproto/syntax': 0.4.2 2861 + '@atproto/xrpc': 0.7.7 2862 + await-lock: 2.2.2 2863 + multiformats: 9.9.0 2864 + tlds: 1.258.0 2865 + zod: 3.24.4 2866 + 2867 + '@atproto/common-web@0.4.11': 2868 + dependencies: 2869 + '@atproto/lex-data': 0.0.7 2870 + '@atproto/lex-json': 0.0.7 2871 + zod: 3.24.4 2872 + 2832 2873 '@atproto/common-web@0.4.2': 2833 2874 dependencies: 2834 2875 graphemer: 1.4.0 ··· 2836 2877 uint8arrays: 3.0.0 2837 2878 zod: 3.24.4 2838 2879 2839 - '@atproto/lexicon@0.4.11': 2880 + '@atproto/lex-data@0.0.7': 2881 + dependencies: 2882 + '@atproto/syntax': 0.4.2 2883 + multiformats: 9.9.0 2884 + tslib: 2.8.1 2885 + uint8arrays: 3.0.0 2886 + unicode-segmenter: 0.14.5 2887 + 2888 + '@atproto/lex-json@0.0.7': 2889 + dependencies: 2890 + '@atproto/lex-data': 0.0.7 2891 + tslib: 2.8.1 2892 + 2893 + '@atproto/lexicon@0.4.14': 2840 2894 dependencies: 2841 2895 '@atproto/common-web': 0.4.2 2842 2896 '@atproto/syntax': 0.4.0 ··· 2844 2898 multiformats: 9.9.0 2845 2899 zod: 3.24.4 2846 2900 2901 + '@atproto/lexicon@0.6.0': 2902 + dependencies: 2903 + '@atproto/common-web': 0.4.11 2904 + '@atproto/syntax': 0.4.2 2905 + iso-datestring-validator: 2.2.2 2906 + multiformats: 9.9.0 2907 + zod: 3.24.4 2908 + 2847 2909 '@atproto/syntax@0.4.0': {} 2848 2910 2849 - '@atproto/xrpc@0.7.0': 2911 + '@atproto/syntax@0.4.2': {} 2912 + 2913 + '@atproto/xrpc@0.7.7': 2850 2914 dependencies: 2851 - '@atproto/lexicon': 0.4.11 2915 + '@atproto/lexicon': 0.6.0 2852 2916 zod: 3.24.4 2853 2917 2854 2918 '@cloudflare/kv-asset-handler@0.4.1': ··· 2876 2940 '@cloudflare/workerd-windows-64@1.20251210.0': 2877 2941 optional: true 2878 2942 2879 - '@cloudflare/workers-types@4.20251225.0': {} 2943 + '@cloudflare/workers-types@4.20260109.0': {} 2880 2944 2881 2945 '@cspotcode/source-map-support@0.8.1': 2882 2946 dependencies: ··· 3122 3186 3123 3187 '@foxui/social@0.4.7(svelte@5.45.8)(tailwindcss@4.1.5)': 3124 3188 dependencies: 3125 - '@atproto/api': 0.15.6 3189 + '@atproto/api': 0.15.27 3126 3190 '@foxui/core': 0.4.7(svelte@5.45.8)(tailwindcss@4.1.5) 3127 3191 '@foxui/time': 0.4.7(svelte@5.45.8)(tailwindcss@4.1.5) 3128 3192 '@use-gesture/vanilla': 10.3.1 ··· 3387 3451 '@sveltejs/kit': 2.20.8(@sveltejs/vite-plugin-svelte@5.0.3(svelte@5.45.8)(vite@6.3.5(jiti@2.4.2)(lightningcss@1.29.2)))(svelte@5.45.8)(vite@6.3.5(jiti@2.4.2)(lightningcss@1.29.2)) 3388 3452 import-meta-resolve: 4.1.0 3389 3453 3390 - '@sveltejs/adapter-cloudflare@7.2.4(@sveltejs/kit@2.20.8(@sveltejs/vite-plugin-svelte@5.0.3(svelte@5.45.8)(vite@6.3.5(jiti@2.4.2)(lightningcss@1.29.2)))(svelte@5.45.8)(vite@6.3.5(jiti@2.4.2)(lightningcss@1.29.2)))(wrangler@4.54.0(@cloudflare/workers-types@4.20251225.0))': 3454 + '@sveltejs/adapter-cloudflare@7.2.4(@sveltejs/kit@2.20.8(@sveltejs/vite-plugin-svelte@5.0.3(svelte@5.45.8)(vite@6.3.5(jiti@2.4.2)(lightningcss@1.29.2)))(svelte@5.45.8)(vite@6.3.5(jiti@2.4.2)(lightningcss@1.29.2)))(wrangler@4.54.0(@cloudflare/workers-types@4.20260109.0))': 3391 3455 dependencies: 3392 - '@cloudflare/workers-types': 4.20251225.0 3456 + '@cloudflare/workers-types': 4.20260109.0 3393 3457 '@sveltejs/kit': 2.20.8(@sveltejs/vite-plugin-svelte@5.0.3(svelte@5.45.8)(vite@6.3.5(jiti@2.4.2)(lightningcss@1.29.2)))(svelte@5.45.8)(vite@6.3.5(jiti@2.4.2)(lightningcss@1.29.2)) 3394 3458 worktop: 0.8.0-next.18 3395 - wrangler: 4.54.0(@cloudflare/workers-types@4.20251225.0) 3459 + wrangler: 4.54.0(@cloudflare/workers-types@4.20260109.0) 3396 3460 3397 3461 '@sveltejs/adapter-static@3.0.8(@sveltejs/kit@2.20.8(@sveltejs/vite-plugin-svelte@5.0.3(svelte@5.45.8)(vite@6.3.5(jiti@2.4.2)(lightningcss@1.29.2)))(svelte@5.45.8)(vite@6.3.5(jiti@2.4.2)(lightningcss@1.29.2)))': 3398 3462 dependencies: ··· 5213 5277 dependencies: 5214 5278 pathe: 2.0.3 5215 5279 5280 + unicode-segmenter@0.14.5: {} 5281 + 5216 5282 unpipe@1.0.0: {} 5217 5283 5218 5284 uri-js@4.4.1: ··· 5263 5329 mrmime: 2.0.1 5264 5330 regexparam: 3.0.0 5265 5331 5266 - wrangler@4.54.0(@cloudflare/workers-types@4.20251225.0): 5332 + wrangler@4.54.0(@cloudflare/workers-types@4.20260109.0): 5267 5333 dependencies: 5268 5334 '@cloudflare/kv-asset-handler': 0.4.1 5269 5335 '@cloudflare/unenv-preset': 2.7.13(unenv@2.0.0-rc.24)(workerd@1.20251210.0) ··· 5274 5340 unenv: 2.0.0-rc.24 5275 5341 workerd: 1.20251210.0 5276 5342 optionalDependencies: 5277 - '@cloudflare/workers-types': 4.20251225.0 5343 + '@cloudflare/workers-types': 4.20260109.0 5278 5344 fsevents: 2.3.3 5279 5345 transitivePeerDependencies: 5280 5346 - bufferutil
+7 -1
src/app.d.ts
··· 1 + import { KVNamespace } from '@cloudflare/workers-types'; 2 + 1 3 // See https://svelte.dev/docs/kit/types#app.d.ts 2 4 // for information about these interfaces 3 5 declare global { ··· 6 8 // interface Locals {} 7 9 // interface PageData {} 8 10 // interface PageState {} 9 - // interface Platform {} 11 + interface Platform { 12 + env: { 13 + USER_DATA_CACHE: KVNamespace; 14 + }; 15 + } 10 16 } 11 17 } 12 18
+16
src/lib/helper.ts
··· 150 150 151 151 export const [getAdditionalUserData, setAdditionalUserData] = 152 152 createContext<Record<string, unknown>>(); 153 + 154 + export async function refreshData(data: { updatedAt?: number; handle: string }) { 155 + const FIVE_MINUTES = 5 * 60 * 1000; 156 + const now = Date.now(); 157 + 158 + if (now - (data.updatedAt || 0) > FIVE_MINUTES) { 159 + try { 160 + await fetch('/' + data.handle + '/api/refreshData'); 161 + console.log('successfully refreshed data', data.handle); 162 + } catch (error) { 163 + console.error('error refreshing data', error); 164 + } 165 + } else { 166 + console.log('data still fresh, skipping refreshing', data.handle); 167 + } 168 + }
+26 -5
src/lib/website/load.ts
··· 7 7 import { getRecord, listRecords, resolveHandle } from '$lib/oauth/atproto'; 8 8 import type { Record as ListRecord } from '@atproto/api/dist/client/types/com/atproto/repo/listRecords'; 9 9 import { data } from './data'; 10 - import { AtpBaseClient } from '@atproto/api'; 11 - import { env } from '$env/dynamic/private'; 12 10 import { CardDefinitionsByType } from '$lib/cards'; 13 11 import type { Item } from '$lib/types'; 14 12 15 - export async function loadData(handle: string) { 13 + export async function loadData( 14 + handle: string, 15 + platform?: App.Platform, 16 + forceUpdate: boolean = false 17 + ): Promise<{ 18 + did: string; 19 + data: DownloadedData; 20 + additionalData: Record<string, unknown>; 21 + updatedAt: number; 22 + }> { 23 + if (!forceUpdate) { 24 + const cachedResult = await platform?.env?.USER_DATA_CACHE?.get(handle); 25 + 26 + if (cachedResult) { 27 + console.log('using cached result for handle', handle); 28 + return JSON.parse(cachedResult); 29 + } 30 + } 31 + 16 32 const did = await resolveHandle({ handle }); 17 33 18 34 const downloadedData = {} as DownloadedData; ··· 97 113 } 98 114 } 99 115 100 - return { 116 + const result = { 101 117 did, 102 118 data: JSON.parse(JSON.stringify(downloadedData)) as DownloadedData, 103 - additionalData 119 + additionalData, 120 + updatedAt: Date.now() 104 121 }; 122 + 123 + await platform?.env?.USER_DATA_CACHE?.put(handle, JSON.stringify(result)); 124 + 125 + return result; 105 126 }
+2 -2
src/routes/+page.server.ts
··· 1 1 import { loadData } from '$lib/website/load'; 2 2 import { env } from '$env/dynamic/public'; 3 3 4 - export async function load() { 5 - const data = await loadData(env.PUBLIC_HANDLE); 4 + export async function load({ platform }) { 5 + const data = await loadData(env.PUBLIC_HANDLE, platform); 6 6 return { ...data, handle: env.PUBLIC_HANDLE }; 7 7 }
+6 -1
src/routes/+page.svelte
··· 1 1 <script lang="ts"> 2 - import { setAdditionalUserData } from '$lib/helper.js'; 2 + import { refreshData, setAdditionalUserData } from '$lib/helper.js'; 3 3 import { type Item } from '$lib/types.js'; 4 4 import Website from '$lib/Website.svelte'; 5 + import { onMount } from 'svelte'; 5 6 6 7 let { data } = $props(); 7 8 8 9 // svelte-ignore state_referenced_locally 9 10 setAdditionalUserData(data.additionalData); 11 + 12 + onMount(() => { 13 + refreshData(data); 14 + }); 10 15 </script> 11 16 12 17 <Website
+3 -2
src/routes/[handle]/+layout.server.ts
··· 2 2 import { env } from '$env/dynamic/private'; 3 3 import { error } from '@sveltejs/kit'; 4 4 5 - export async function load({ params }) { 5 + export async function load({ params, platform }) { 6 6 if (env.PUBLIC_IS_SELFHOSTED) error(404); 7 - return await loadData(params.handle); 7 + const data = await loadData(params.handle, platform); 8 + return { ...data, handle: params.handle }; 8 9 }
+6 -1
src/routes/[handle]/+page.svelte
··· 1 1 <script lang="ts"> 2 2 import { page } from '$app/state'; 3 - import { setAdditionalUserData } from '$lib/helper.js'; 3 + import { refreshData, setAdditionalUserData } from '$lib/helper.js'; 4 4 import { type Item } from '$lib/types.js'; 5 5 import Website from '$lib/Website.svelte'; 6 + import { onMount } from 'svelte'; 6 7 7 8 let { data } = $props(); 8 9 9 10 // svelte-ignore state_referenced_locally 10 11 setAdditionalUserData(data.additionalData); 12 + 13 + onMount(() => { 14 + refreshData(data); 15 + }) 11 16 </script> 12 17 13 18 <Website
+11
src/routes/[handle]/api/refreshData/+server.ts
··· 1 + import { loadData } from '$lib/website/load.js'; 2 + import { json } from '@sveltejs/kit'; 3 + 4 + export async function GET({ params, platform }) { 5 + if (!platform?.env?.USER_DATA_CACHE) return json('no cache'); 6 + const handle = params.handle; 7 + 8 + await loadData(handle, platform, true); 9 + 10 + return json('ok'); 11 + }
+11 -2
wrangler.jsonc
··· 7 7 "name": "blento", 8 8 "main": ".svelte-kit/cloudflare/_worker.js", 9 9 "compatibility_date": "2025-12-25", 10 - "compatibility_flags": ["nodejs_als"], 10 + "compatibility_flags": [ 11 + "nodejs_als" 12 + ], 11 13 "assets": { 12 14 "binding": "ASSETS", 13 15 "directory": ".svelte-kit/cloudflare" ··· 36 38 "PUBLIC_HANDLE": "blento.app", 37 39 "PUBLIC_IS_SELFHOSTED": "", 38 40 "PUBLIC_DOMAIN": "https://blento.app" 39 - } 41 + }, 42 + "kv_namespaces": [ 43 + { 44 + "binding": "USER_DATA_CACHE", 45 + "id": "d6ff203259de48538d332b0a5df258a7", 46 + "remote": true 47 + } 48 + ] 40 49 /** 41 50 * Service Bindings (communicate between multiple Workers) 42 51 * https://developers.cloudflare.com/workers/wrangler/configuration/#service-bindings