BlueSky & more on desktop lazurite.stormlightlabs.org/
tauri rust typescript bluesky appview atproto solid
2
fork

Configure Feed

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

feat: add addl logging for embeds

+62 -18
+57 -18
src-tauri/src/conversations.rs
··· 106 106 AppError::validation(default_message) 107 107 } 108 108 109 + fn truncate_for_log(value: &str, max_chars: usize) -> String { 110 + if value.chars().count() <= max_chars { 111 + return value.to_string(); 112 + } 113 + 114 + let truncated: String = value.chars().take(max_chars).collect(); 115 + format!("{truncated}...") 116 + } 117 + 118 + fn raw_json_preview<R: jacquard::xrpc::XrpcResp>(response: &jacquard::xrpc::Response<R>) -> Option<String> { 119 + response 120 + .parse_raw() 121 + .ok() 122 + .and_then(|raw| serde_json::to_string(&raw).ok()) 123 + .map(|json| truncate_for_log(&json, 4096)) 124 + } 125 + 109 126 pub async fn list_convos(cursor: Option<String>, limit: Option<u32>, state: &AppState) -> Result<Value> { 110 127 ensure_chat_scope(state).await?; 111 128 let session = get_session(state).await?; ··· 114 131 req = req.cursor(Some(c.as_str().into())); 115 132 } 116 133 117 - let output = session 134 + let response = session 118 135 .send_with_opts(req.build(), chat_opts()) 119 136 .await 120 - .map_err(|error| map_chat_error(&error, "Could not load conversations.", "listConvos error"))? 121 - .into_output() 137 + .map_err(|error| map_chat_error(&error, "Could not load conversations.", "listConvos error"))?; 138 + let output = response 139 + .parse_raw() 122 140 .map_err(|error| { 123 141 log::error!("listConvos output error: {error}"); 124 142 AppError::validation("Could not load conversations.") 125 - })?; 143 + })? 144 + .into_static(); 126 145 127 146 serde_json::to_value(&output).map_err(AppError::from) 128 147 } ··· 144 163 .collect(); 145 164 let req = GetConvoForMembers::new().members(dids?).build(); 146 165 147 - let output = session 166 + let response = session 148 167 .send_with_opts(req, chat_opts()) 149 168 .await 150 - .map_err(|error| map_chat_error(&error, "Could not open this conversation.", "getConvoForMembers error"))? 151 - .into_output() 169 + .map_err(|error| map_chat_error(&error, "Could not open this conversation.", "getConvoForMembers error"))?; 170 + let output = response 171 + .parse_raw() 152 172 .map_err(|error| { 153 173 log::error!("getConvoForMembers output error: {error}"); 154 174 AppError::validation("Could not open this conversation.") 155 - })?; 175 + })? 176 + .into_static(); 156 177 157 178 serde_json::to_value(&output).map_err(AppError::from) 158 179 } ··· 173 194 req = req.cursor(Some(c.as_str().into())); 174 195 } 175 196 176 - let output = session 197 + let response = session 177 198 .send_with_opts(req.build(), chat_opts()) 178 199 .await 179 - .map_err(|error| map_chat_error(&error, "Could not load messages.", "getMessages error"))? 200 + .map_err(|error| map_chat_error(&error, "Could not load messages.", "getMessages error"))?; 201 + let raw_json = raw_json_preview(&response); 202 + let output = response 180 203 .into_output() 181 204 .map_err(|error| { 182 - log::error!("getMessages output error: {error}"); 205 + if let Some(raw_json) = raw_json { 206 + log::error!("getMessages output error: {error}; raw_json={raw_json}"); 207 + } else { 208 + log::error!("getMessages output error: {error}; raw_json=unavailable"); 209 + } 183 210 AppError::validation("Could not load messages.") 184 211 })?; 185 212 ··· 199 226 let msg = MessageInput { text: text.into(), facets: None, embed: None, ..Default::default() }; 200 227 let req = SendMessage::new().convo_id(convo_id.as_str()).message(msg).build(); 201 228 202 - let output = session 229 + let response = session 203 230 .send_with_opts(req, chat_opts()) 204 231 .await 205 - .map_err(|error| map_chat_error(&error, "Could not send this message.", "sendMessage error"))? 232 + .map_err(|error| map_chat_error(&error, "Could not send this message.", "sendMessage error"))?; 233 + let raw_json = raw_json_preview(&response); 234 + let output = response 206 235 .into_output() 207 236 .map_err(|error| { 208 - log::error!("sendMessage output error: {error}"); 237 + if let Some(raw_json) = raw_json { 238 + log::error!("sendMessage output error: {error}; raw_json={raw_json}"); 239 + } else { 240 + log::error!("sendMessage output error: {error}; raw_json=unavailable"); 241 + } 209 242 AppError::validation("Could not send this message.") 210 243 })?; 211 244 ··· 225 258 ..Default::default() 226 259 }; 227 260 228 - session 261 + let response = session 229 262 .send_with_opts(req, chat_opts()) 230 263 .await 231 264 .map_err(|error| { ··· 234 267 "Could not update the read status for this conversation.", 235 268 "updateRead error", 236 269 ) 237 - })? 238 - .into_output() 270 + })?; 271 + let raw_json = raw_json_preview(&response); 272 + response 273 + .parse_raw() 239 274 .map_err(|error| { 240 - log::error!("updateRead output error: {error}"); 275 + if let Some(raw_json) = raw_json { 276 + log::error!("updateRead output error: {error}; raw_json={raw_json}"); 277 + } else { 278 + log::error!("updateRead output error: {error}; raw_json=unavailable"); 279 + } 241 280 AppError::validation("Could not update the read status for this conversation.") 242 281 })?; 243 282
+5
src/lib/feeds.ts
··· 497 497 raw: unknown, 498 498 options: Partial<Pick<NormalizationMeta, "cycle" | "depthLimited" | "explicitType" | "inferred">> = {}, 499 499 ): Extract<NormalizedEmbed, { kind: "recognized-unrenderable" }> { 500 + const rawRecord = asRecord(raw); 501 + const topLevelKeys = rawRecord ? Object.keys(rawRecord).toSorted().slice(0, 24).join(",") : "none"; 502 + 500 503 logger.warn("recognized embed shape could not be rendered", { 501 504 keyValues: { 505 + embedShape: shapeSignature(raw), 502 506 explicitType: options.explicitType ?? "none", 503 507 inferred: String(options.inferred ?? false), 504 508 message, 505 509 payloadJson: stringifyUnknown(raw), 506 510 recognizedType, 507 511 source: context.source, 512 + topLevelKeys, 508 513 }, 509 514 }); 510 515 return { kind: "recognized-unrenderable", message, meta: buildMeta(context, options), recognizedType };