Suite of AT Protocol TypeScript libraries built on web standards
21
fork

Configure Feed

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

fix(sync): Catch DID and handle resolution rejections

+67 -3
+1 -1
sync/deno.json
··· 1 1 { 2 2 "name": "@atp/sync", 3 - "version": "0.1.0-alpha.9", 3 + "version": "0.1.0-alpha.10", 4 4 "exports": "./mod.ts", 5 5 "license": "MIT", 6 6 "imports": {
+2 -2
sync/firehose/index.ts
··· 532 532 evt: Identity, 533 533 unauthenticated = false, 534 534 ): Promise<IdentityEvt | null> => { 535 - const res = await idResolver.did.resolve(evt.did); 535 + const res = await idResolver.did.resolve(evt.did).catch(() => null); 536 536 const handle = res && !unauthenticated 537 - ? await verifyHandle(idResolver, evt.did, res) 537 + ? await verifyHandle(idResolver, evt.did, res).catch(() => undefined) 538 538 : undefined; 539 539 540 540 return {
+64
sync/tests/firehose-mock_test.ts
··· 201 201 }); 202 202 203 203 Deno.test({ 204 + name: "parseIdentity - handles DID resolution rejection", 205 + async fn() { 206 + const didCache = new MemoryCache(); 207 + const resolver = new IdResolver({ 208 + plcUrl: "http://localhost:3000", 209 + didCache, 210 + }); 211 + 212 + resolver.did.resolve = () => 213 + Promise.reject(new DOMException("timed out", "AbortError")); 214 + 215 + const identity: Identity = { 216 + $type: "com.atproto.sync.subscribeRepos#identity", 217 + seq: 302, 218 + time: "2024-01-01T14:02:30.000Z", 219 + did: "did:plc:unknown", 220 + }; 221 + 222 + const event = await parseIdentity(resolver, identity); 223 + 224 + assertObjectMatch(event!, { 225 + event: "identity", 226 + seq: 302, 227 + did: "did:plc:unknown", 228 + handle: undefined, 229 + didDocument: undefined, 230 + }); 231 + }, 232 + sanitizeResources: false, 233 + sanitizeOps: false, 234 + }); 235 + 236 + Deno.test({ 204 237 name: "parseIdentity - handles handle resolution failure", 205 238 async fn() { 206 239 const idResolver = createMockIdResolver(); ··· 230 263 sanitizeResources: false, 231 264 sanitizeOps: false, 232 265 }); 266 + 267 + Deno.test({ 268 + name: "parseIdentity - handles handle resolution rejection", 269 + async fn() { 270 + const idResolver = createMockIdResolver(); 271 + 272 + idResolver.handle.resolve = () => 273 + Promise.reject(new DOMException("timed out", "AbortError")); 274 + 275 + const identity: Identity = { 276 + $type: "com.atproto.sync.subscribeRepos#identity", 277 + seq: 304, 278 + time: "2024-01-01T14:04:00.000Z", 279 + did: "did:plc:alice123", 280 + }; 281 + 282 + const event = await parseIdentity(idResolver, identity); 283 + 284 + assertObjectMatch(event!, { 285 + event: "identity", 286 + seq: 304, 287 + did: "did:plc:alice123", 288 + handle: undefined, 289 + didDocument: { 290 + id: "did:plc:alice123", 291 + }, 292 + }); 293 + }, 294 + sanitizeResources: false, 295 + sanitizeOps: false, 296 + });