grain.social is a photo sharing platform built on atproto. grain.social
atproto photography appview
57
fork

Configure Feed

Select the types of activity you want to include in your feed.

fix: handle 401 on blob upload with re-auth redirect

Bump hatk to 0.0.1-alpha.44 which adds the missing 401 redirect
handler to the blob upload client path, preventing raw errors when
session cookies expire during uploads.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>

+98 -5
+92
db/schema.sql
··· 118 118 created_at TEXT 119 119 ); 120 120 121 + CREATE TABLE "app.bsky.feed.post" ( 122 + uri TEXT PRIMARY KEY, 123 + cid TEXT, 124 + did TEXT NOT NULL, 125 + indexed_at TEXT NOT NULL, 126 + tags TEXT, 127 + text TEXT NOT NULL, 128 + embed TEXT, 129 + langs TEXT, 130 + reply TEXT, 131 + facets TEXT, 132 + labels TEXT, 133 + created_at TEXT NOT NULL 134 + ); 135 + 136 + CREATE TABLE "app.bsky.feed.post__embed_external" ( 137 + parent_uri TEXT NOT NULL, 138 + parent_did TEXT NOT NULL, 139 + uri TEXT, 140 + thumb TEXT, 141 + title TEXT, 142 + description TEXT 143 + ); 144 + 145 + CREATE TABLE "app.bsky.feed.post__embed_images" ( 146 + parent_uri TEXT NOT NULL, 147 + parent_did TEXT NOT NULL, 148 + alt TEXT, 149 + image TEXT, 150 + aspect_ratio TEXT 151 + ); 152 + 153 + CREATE TABLE "app.bsky.feed.post__embed_record" ( 154 + parent_uri TEXT NOT NULL, 155 + parent_did TEXT NOT NULL, 156 + uri TEXT, 157 + cid TEXT 158 + ); 159 + 160 + CREATE TABLE "app.bsky.feed.post__embed_recordWithMedia" ( 161 + parent_uri TEXT NOT NULL, 162 + parent_did TEXT NOT NULL, 163 + media TEXT NOT NULL, 164 + record TEXT NOT NULL 165 + ); 166 + 167 + CREATE TABLE "app.bsky.feed.post__embed_video" ( 168 + parent_uri TEXT NOT NULL, 169 + parent_did TEXT NOT NULL, 170 + alt TEXT, 171 + video TEXT NOT NULL, 172 + captions TEXT, 173 + aspect_ratio TEXT, 174 + presentation TEXT 175 + ); 176 + 177 + CREATE TABLE "app.bsky.feed.post__entities" ( 178 + parent_uri TEXT NOT NULL, 179 + parent_did TEXT NOT NULL, 180 + type TEXT NOT NULL, 181 + index TEXT NOT NULL, 182 + value TEXT NOT NULL 183 + ); 184 + 185 + CREATE TABLE "app.bsky.feed.post__labels_self_labels" ( 186 + parent_uri TEXT NOT NULL, 187 + parent_did TEXT NOT NULL, 188 + val TEXT 189 + ); 190 + 191 + CREATE TABLE "app.bsky.feed.postgate" ( 192 + uri TEXT PRIMARY KEY, 193 + cid TEXT, 194 + did TEXT NOT NULL, 195 + indexed_at TEXT NOT NULL, 196 + post TEXT NOT NULL, 197 + created_at TEXT NOT NULL, 198 + embedding_rules TEXT, 199 + detached_embedding_uris TEXT 200 + ); 201 + 202 + CREATE TABLE "app.bsky.feed.threadgate" ( 203 + uri TEXT PRIMARY KEY, 204 + cid TEXT, 205 + did TEXT NOT NULL, 206 + indexed_at TEXT NOT NULL, 207 + post TEXT NOT NULL, 208 + allow TEXT, 209 + created_at TEXT NOT NULL, 210 + hidden_replies TEXT 211 + ); 212 + 121 213 CREATE TABLE "app.bsky.graph.follow" ( 122 214 uri TEXT PRIMARY KEY, 123 215 cid TEXT,
+1
hatk.generated.client.ts
··· 32 32 const blob = arg as Blob | ArrayBuffer 33 33 const ct = blob instanceof Blob ? blob.type : 'application/octet-stream' 34 34 const res = await _fetch(path, { method: 'POST', headers: { 'Content-Type': ct }, body: blob }) 35 + if (typeof window !== 'undefined' && res.status === 401) { const _b = await res.json().catch(() => ({})); const _h = _b.handle ?? getViewer()?.handle; window.location.href = _h ? `/oauth/login?handle=${encodeURIComponent(_h)}` : '/oauth/login'; return new Promise(() => {}) as any } 35 36 if (!res.ok) throw new Error(`XRPC ${nsid} failed: ${res.status}`) 36 37 return res.json() as Promise<OutputOf<K>> 37 38 }
+4 -4
package-lock.json
··· 6 6 "": { 7 7 "name": "grain", 8 8 "dependencies": { 9 - "@hatk/hatk": "^0.0.1-alpha.43", 9 + "@hatk/hatk": "^0.0.1-alpha.44", 10 10 "@sveltejs/adapter-node": "^5.5.4", 11 11 "@sveltejs/kit": "^2.55.0", 12 12 "@tanstack/svelte-query": "^6.1.0", ··· 163 163 } 164 164 }, 165 165 "node_modules/@hatk/hatk": { 166 - "version": "0.0.1-alpha.43", 167 - "resolved": "https://registry.npmjs.org/@hatk/hatk/-/hatk-0.0.1-alpha.43.tgz", 168 - "integrity": "sha512-7TxXbxADLIL3rWJDvCylO4ux9ub4UFSeHDtvV7mtT7OshaqzSw1BQxDXU8UcqDIm3NGs8MUcSTh8SsASeme0/w==", 166 + "version": "0.0.1-alpha.44", 167 + "resolved": "https://registry.npmjs.org/@hatk/hatk/-/hatk-0.0.1-alpha.44.tgz", 168 + "integrity": "sha512-brHkesrJiGTGzt97vlNwSkAr/ueSgx6tq1p0dweYl1gFF4bNNjQb/q8Pa40GiI+Swh4L8hNWSyket9lR3kJHFw==", 169 169 "license": "MIT", 170 170 "dependencies": { 171 171 "@bigmoves/lexicon": "^0.2.2",
+1 -1
package.json
··· 12 12 "test:browser": "npx playwright test" 13 13 }, 14 14 "dependencies": { 15 - "@hatk/hatk": "^0.0.1-alpha.43", 15 + "@hatk/hatk": "^0.0.1-alpha.44", 16 16 "@sveltejs/adapter-node": "^5.5.4", 17 17 "@sveltejs/kit": "^2.55.0", 18 18 "@tanstack/svelte-query": "^6.1.0",