tangled
alpha
login
or
join now
flo-bit.dev
/
blento
your personal website on atproto - mirror
blento.app
20
fork
atom
overview
issues
pulls
pipelines
add some caching
Florian
1 month ago
d7578d0d
96324db6
+181
-40
11 changed files
expand all
collapse all
unified
split
package.json
pnpm-lock.yaml
src
app.d.ts
lib
helper.ts
website
load.ts
routes
+page.server.ts
+page.svelte
[handle]
+layout.server.ts
+page.svelte
api
refreshData
+server.ts
wrangler.jsonc
+2
-1
package.json
···
43
43
"dependencies": {
44
44
"@atcute/client": "^3.1.0",
45
45
"@atcute/oauth-browser-client": "^1.0.13",
46
46
-
"@atproto/api": "^0.15.6",
46
46
+
"@atproto/api": "^0.18.13",
47
47
"@atproto/common-web": "^0.4.2",
48
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
18
-
specifier: ^0.15.6
19
19
-
version: 0.15.6
18
18
+
specifier: ^0.18.13
19
19
+
version: 0.18.13
20
20
'@atproto/common-web':
21
21
specifier: ^0.4.2
22
22
version: 0.4.2
23
23
+
'@cloudflare/workers-types':
24
24
+
specifier: ^4.20260109.0
25
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
100
-
version: 4.54.0(@cloudflare/workers-types@4.20251225.0)
103
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
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
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
186
-
'@atproto/api@0.15.6':
187
187
-
resolution: {integrity: sha512-hKwrBf60LcI4BqArWyrhWJWIpjwAWUJpW3PVvNzUB1q2W/ByC0JAuwq/F8tZpCEiiVBzHjHVRx4QNA2TA1cG3g==, tarball: https://registry.npmjs.org/@atproto/api/-/api-0.15.6.tgz}
189
189
+
'@atproto/api@0.15.27':
190
190
+
resolution: {integrity: sha512-ok/WGafh1nz4t8pEQGtAF/32x2E2VDWU4af6BajkO5Gky2jp2q6cv6aB2A5yuvNNcc3XkYMYipsqVHVwLPMF9g==, tarball: https://registry.npmjs.org/@atproto/api/-/api-0.15.27.tgz}
191
191
+
192
192
+
'@atproto/api@0.18.13':
193
193
+
resolution: {integrity: sha512-CULZ01pSJDltLS/Gc9MMrhFzB6OM3ezyZw7KoeLT/sBfwgA1ddA4mWdTh7DIRosPRigXtA05bnoiCutZbQDo+Q==, tarball: https://registry.npmjs.org/@atproto/api/-/api-0.18.13.tgz}
194
194
+
195
195
+
'@atproto/common-web@0.4.11':
196
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
192
-
'@atproto/lexicon@0.4.11':
193
193
-
resolution: {integrity: sha512-btefdnvNz2Ao2I+qbmj0F06HC8IlrM/IBz6qOBS50r0S6uDf5tOO+Mv2tSVdimFkdzyDdLtBI1sV36ONxz2cOw==, tarball: https://registry.npmjs.org/@atproto/lexicon/-/lexicon-0.4.11.tgz}
201
201
+
'@atproto/lex-data@0.0.7':
202
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
203
+
204
204
+
'@atproto/lex-json@0.0.7':
205
205
+
resolution: {integrity: sha512-bjNPD5M/MhLfjNM7tcxuls80UgXpHqxdOxDXEUouAtZQV/nIDhGjmNUvKxOmOgnDsiZRnT2g5y3onrnjH3a44g==, tarball: https://registry.npmjs.org/@atproto/lex-json/-/lex-json-0.0.7.tgz}
206
206
+
207
207
+
'@atproto/lexicon@0.4.14':
208
208
+
resolution: {integrity: sha512-jiKpmH1QER3Gvc7JVY5brwrfo+etFoe57tKPQX/SmPwjvUsFnJAow5xLIryuBaJgFAhnTZViXKs41t//pahGHQ==, tarball: https://registry.npmjs.org/@atproto/lexicon/-/lexicon-0.4.14.tgz}
209
209
+
210
210
+
'@atproto/lexicon@0.6.0':
211
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
198
-
'@atproto/xrpc@0.7.0':
199
199
-
resolution: {integrity: sha512-SfhP9dGx2qclaScFDb58Jnrmim5nk4geZXCqg6sB0I/KZhZEkr9iIx1hLCp+sxkIfEsmEJjeWO4B0rjUIJW5cw==, tarball: https://registry.npmjs.org/@atproto/xrpc/-/xrpc-0.7.0.tgz}
216
216
+
'@atproto/syntax@0.4.2':
217
217
+
resolution: {integrity: sha512-X9XSRPinBy/0VQ677j8VXlBsYSsUXaiqxWVpGGxJYsAhugdQRb0jqaVKJFtm6RskeNkV6y9xclSUi9UYG/COrA==, tarball: https://registry.npmjs.org/@atproto/syntax/-/syntax-0.4.2.tgz}
218
218
+
219
219
+
'@atproto/xrpc@0.7.7':
220
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
244
-
'@cloudflare/workers-types@4.20251225.0':
245
245
-
resolution: {integrity: sha512-ZZl0cNLFcsBRFKtMftKWOsfAybUYSeiTMzpQV1NlTVlByHAs1rGQt45Jw/qz8LrfHoq9PGTieSj9W350Gi4Pvg==, tarball: https://registry.npmjs.org/@cloudflare/workers-types/-/workers-types-4.20251225.0.tgz}
265
265
+
'@cloudflare/workers-types@4.20260109.0':
266
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
2687
+
unicode-segmenter@0.14.5:
2688
2688
+
resolution: {integrity: sha512-jHGmj2LUuqDcX3hqY12Ql+uhUTn8huuxNZGq7GvtF6bSybzH3aFgedYu/KTzQStEgt1Ra2F3HxadNXsNjb3m3g==, tarball: https://registry.npmjs.org/unicode-segmenter/-/unicode-segmenter-0.14.5.tgz}
2689
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
2821
-
'@atproto/api@0.15.6':
2845
2845
+
'@atproto/api@0.15.27':
2822
2846
dependencies:
2823
2847
'@atproto/common-web': 0.4.2
2824
2824
-
'@atproto/lexicon': 0.4.11
2848
2848
+
'@atproto/lexicon': 0.4.14
2825
2849
'@atproto/syntax': 0.4.0
2826
2826
-
'@atproto/xrpc': 0.7.0
2850
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
2856
+
'@atproto/api@0.18.13':
2857
2857
+
dependencies:
2858
2858
+
'@atproto/common-web': 0.4.11
2859
2859
+
'@atproto/lexicon': 0.6.0
2860
2860
+
'@atproto/syntax': 0.4.2
2861
2861
+
'@atproto/xrpc': 0.7.7
2862
2862
+
await-lock: 2.2.2
2863
2863
+
multiformats: 9.9.0
2864
2864
+
tlds: 1.258.0
2865
2865
+
zod: 3.24.4
2866
2866
+
2867
2867
+
'@atproto/common-web@0.4.11':
2868
2868
+
dependencies:
2869
2869
+
'@atproto/lex-data': 0.0.7
2870
2870
+
'@atproto/lex-json': 0.0.7
2871
2871
+
zod: 3.24.4
2872
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
2839
-
'@atproto/lexicon@0.4.11':
2880
2880
+
'@atproto/lex-data@0.0.7':
2881
2881
+
dependencies:
2882
2882
+
'@atproto/syntax': 0.4.2
2883
2883
+
multiformats: 9.9.0
2884
2884
+
tslib: 2.8.1
2885
2885
+
uint8arrays: 3.0.0
2886
2886
+
unicode-segmenter: 0.14.5
2887
2887
+
2888
2888
+
'@atproto/lex-json@0.0.7':
2889
2889
+
dependencies:
2890
2890
+
'@atproto/lex-data': 0.0.7
2891
2891
+
tslib: 2.8.1
2892
2892
+
2893
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
2901
+
'@atproto/lexicon@0.6.0':
2902
2902
+
dependencies:
2903
2903
+
'@atproto/common-web': 0.4.11
2904
2904
+
'@atproto/syntax': 0.4.2
2905
2905
+
iso-datestring-validator: 2.2.2
2906
2906
+
multiformats: 9.9.0
2907
2907
+
zod: 3.24.4
2908
2908
+
2847
2909
'@atproto/syntax@0.4.0': {}
2848
2910
2849
2849
-
'@atproto/xrpc@0.7.0':
2911
2911
+
'@atproto/syntax@0.4.2': {}
2912
2912
+
2913
2913
+
'@atproto/xrpc@0.7.7':
2850
2914
dependencies:
2851
2851
-
'@atproto/lexicon': 0.4.11
2915
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
2879
-
'@cloudflare/workers-types@4.20251225.0': {}
2943
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
3125
-
'@atproto/api': 0.15.6
3189
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
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
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
3392
-
'@cloudflare/workers-types': 4.20251225.0
3456
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
3395
-
wrangler: 4.54.0(@cloudflare/workers-types@4.20251225.0)
3459
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
5280
+
unicode-segmenter@0.14.5: {}
5281
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
5266
-
wrangler@4.54.0(@cloudflare/workers-types@4.20251225.0):
5332
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
5277
-
'@cloudflare/workers-types': 4.20251225.0
5343
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
1
+
import { KVNamespace } from '@cloudflare/workers-types';
2
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
9
-
// interface Platform {}
11
11
+
interface Platform {
12
12
+
env: {
13
13
+
USER_DATA_CACHE: KVNamespace;
14
14
+
};
15
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
153
+
154
154
+
export async function refreshData(data: { updatedAt?: number; handle: string }) {
155
155
+
const FIVE_MINUTES = 5 * 60 * 1000;
156
156
+
const now = Date.now();
157
157
+
158
158
+
if (now - (data.updatedAt || 0) > FIVE_MINUTES) {
159
159
+
try {
160
160
+
await fetch('/' + data.handle + '/api/refreshData');
161
161
+
console.log('successfully refreshed data', data.handle);
162
162
+
} catch (error) {
163
163
+
console.error('error refreshing data', error);
164
164
+
}
165
165
+
} else {
166
166
+
console.log('data still fresh, skipping refreshing', data.handle);
167
167
+
}
168
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
10
-
import { AtpBaseClient } from '@atproto/api';
11
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
15
-
export async function loadData(handle: string) {
13
13
+
export async function loadData(
14
14
+
handle: string,
15
15
+
platform?: App.Platform,
16
16
+
forceUpdate: boolean = false
17
17
+
): Promise<{
18
18
+
did: string;
19
19
+
data: DownloadedData;
20
20
+
additionalData: Record<string, unknown>;
21
21
+
updatedAt: number;
22
22
+
}> {
23
23
+
if (!forceUpdate) {
24
24
+
const cachedResult = await platform?.env?.USER_DATA_CACHE?.get(handle);
25
25
+
26
26
+
if (cachedResult) {
27
27
+
console.log('using cached result for handle', handle);
28
28
+
return JSON.parse(cachedResult);
29
29
+
}
30
30
+
}
31
31
+
16
32
const did = await resolveHandle({ handle });
17
33
18
34
const downloadedData = {} as DownloadedData;
···
97
113
}
98
114
}
99
115
100
100
-
return {
116
116
+
const result = {
101
117
did,
102
118
data: JSON.parse(JSON.stringify(downloadedData)) as DownloadedData,
103
103
-
additionalData
119
119
+
additionalData,
120
120
+
updatedAt: Date.now()
104
121
};
122
122
+
123
123
+
await platform?.env?.USER_DATA_CACHE?.put(handle, JSON.stringify(result));
124
124
+
125
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
4
-
export async function load() {
5
5
-
const data = await loadData(env.PUBLIC_HANDLE);
4
4
+
export async function load({ platform }) {
5
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
2
-
import { setAdditionalUserData } from '$lib/helper.js';
2
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
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
11
+
12
12
+
onMount(() => {
13
13
+
refreshData(data);
14
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
5
-
export async function load({ params }) {
5
5
+
export async function load({ params, platform }) {
6
6
if (env.PUBLIC_IS_SELFHOSTED) error(404);
7
7
-
return await loadData(params.handle);
7
7
+
const data = await loadData(params.handle, platform);
8
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
3
-
import { setAdditionalUserData } from '$lib/helper.js';
3
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
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
12
+
13
13
+
onMount(() => {
14
14
+
refreshData(data);
15
15
+
})
11
16
</script>
12
17
13
18
<Website
+11
src/routes/[handle]/api/refreshData/+server.ts
···
1
1
+
import { loadData } from '$lib/website/load.js';
2
2
+
import { json } from '@sveltejs/kit';
3
3
+
4
4
+
export async function GET({ params, platform }) {
5
5
+
if (!platform?.env?.USER_DATA_CACHE) return json('no cache');
6
6
+
const handle = params.handle;
7
7
+
8
8
+
await loadData(handle, platform, true);
9
9
+
10
10
+
return json('ok');
11
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
10
-
"compatibility_flags": ["nodejs_als"],
10
10
+
"compatibility_flags": [
11
11
+
"nodejs_als"
12
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
39
-
}
41
41
+
},
42
42
+
"kv_namespaces": [
43
43
+
{
44
44
+
"binding": "USER_DATA_CACHE",
45
45
+
"id": "d6ff203259de48538d332b0a5df258a7",
46
46
+
"remote": true
47
47
+
}
48
48
+
]
40
49
/**
41
50
* Service Bindings (communicate between multiple Workers)
42
51
* https://developers.cloudflare.com/workers/wrangler/configuration/#service-bindings