@atproto-labs/handle-resolver 0.0.1 → 0.1.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (62) hide show
  1. package/CHANGELOG.md +18 -6
  2. package/README.md +148 -0
  3. package/dist/{atproto-lexicon-handle-resolver.d.ts → app-view-handle-resolver.d.ts} +11 -14
  4. package/dist/app-view-handle-resolver.d.ts.map +1 -0
  5. package/dist/{atproto-lexicon-handle-resolver.js → app-view-handle-resolver.js} +28 -15
  6. package/dist/app-view-handle-resolver.js.map +1 -0
  7. package/dist/atproto-doh-handle-resolver.d.ts +9 -0
  8. package/dist/atproto-doh-handle-resolver.d.ts.map +1 -0
  9. package/dist/atproto-doh-handle-resolver.js +98 -0
  10. package/dist/atproto-doh-handle-resolver.js.map +1 -0
  11. package/dist/atproto-handle-resolver.d.ts +22 -0
  12. package/dist/atproto-handle-resolver.d.ts.map +1 -0
  13. package/dist/atproto-handle-resolver.js +69 -0
  14. package/dist/atproto-handle-resolver.js.map +1 -0
  15. package/dist/cached-handle-resolver.d.ts +8 -12
  16. package/dist/cached-handle-resolver.d.ts.map +1 -1
  17. package/dist/cached-handle-resolver.js +17 -6
  18. package/dist/cached-handle-resolver.js.map +1 -1
  19. package/dist/index.d.ts +4 -6
  20. package/dist/index.d.ts.map +1 -1
  21. package/dist/index.js +6 -10
  22. package/dist/index.js.map +1 -1
  23. package/dist/internal-resolvers/dns-handle-resolver.d.ts +12 -0
  24. package/dist/internal-resolvers/dns-handle-resolver.d.ts.map +1 -0
  25. package/dist/internal-resolvers/dns-handle-resolver.js +38 -0
  26. package/dist/internal-resolvers/dns-handle-resolver.js.map +1 -0
  27. package/dist/internal-resolvers/well-known-handler-resolver.d.ts +18 -0
  28. package/dist/internal-resolvers/well-known-handler-resolver.d.ts.map +1 -0
  29. package/dist/{well-known-handler-resolver.js → internal-resolvers/well-known-handler-resolver.js} +9 -7
  30. package/dist/internal-resolvers/well-known-handler-resolver.js.map +1 -0
  31. package/dist/{handle-resolver.d.ts → types.d.ts} +13 -6
  32. package/dist/types.d.ts.map +1 -0
  33. package/dist/types.js +12 -0
  34. package/dist/types.js.map +1 -0
  35. package/package.json +6 -7
  36. package/src/{atproto-lexicon-handle-resolver.ts → app-view-handle-resolver.ts} +34 -27
  37. package/src/atproto-doh-handle-resolver.ts +123 -0
  38. package/src/atproto-handle-resolver.ts +79 -0
  39. package/src/cached-handle-resolver.ts +20 -24
  40. package/src/index.ts +6 -8
  41. package/src/internal-resolvers/dns-handle-resolver.ts +38 -0
  42. package/src/{well-known-handler-resolver.ts → internal-resolvers/well-known-handler-resolver.ts} +20 -15
  43. package/src/{handle-resolver.ts → types.ts} +15 -6
  44. package/tsconfig.build.json +1 -1
  45. package/dist/atproto-lexicon-handle-resolver.d.ts.map +0 -1
  46. package/dist/atproto-lexicon-handle-resolver.js.map +0 -1
  47. package/dist/handle-resolver.d.ts.map +0 -1
  48. package/dist/handle-resolver.js +0 -9
  49. package/dist/handle-resolver.js.map +0 -1
  50. package/dist/serial-handle-resolver.d.ts +0 -7
  51. package/dist/serial-handle-resolver.d.ts.map +0 -1
  52. package/dist/serial-handle-resolver.js +0 -29
  53. package/dist/serial-handle-resolver.js.map +0 -1
  54. package/dist/universal-handle-resolver.d.ts +0 -32
  55. package/dist/universal-handle-resolver.d.ts.map +0 -1
  56. package/dist/universal-handle-resolver.js +0 -25
  57. package/dist/universal-handle-resolver.js.map +0 -1
  58. package/dist/well-known-handler-resolver.d.ts +0 -11
  59. package/dist/well-known-handler-resolver.d.ts.map +0 -1
  60. package/dist/well-known-handler-resolver.js.map +0 -1
  61. package/src/serial-handle-resolver.ts +0 -29
  62. package/src/universal-handle-resolver.ts +0 -58
@@ -0,0 +1,38 @@
1
+ import { HandleResolver, ResolvedHandle, isResolvedHandle } from '../types'
2
+
3
+ const SUBDOMAIN = '_atproto'
4
+ const PREFIX = 'did='
5
+
6
+ /**
7
+ * DNS TXT record resolver. Return `null` if the hostname successfully does not
8
+ * resolve to a valid DID. Throw an error if an unexpected error occurs.
9
+ */
10
+ export type ResolveTxt = (hostname: string) => Promise<null | string[]>
11
+
12
+ export class DnsHandleResolver implements HandleResolver {
13
+ constructor(protected resolveTxt: ResolveTxt) {}
14
+
15
+ async resolve(handle: string): Promise<ResolvedHandle> {
16
+ const results = await this.resolveTxt.call(null, `${SUBDOMAIN}.${handle}`)
17
+
18
+ if (!results) return null
19
+
20
+ for (let i = 0; i < results.length; i++) {
21
+ // If the line does not start with "did=", skip it
22
+ if (!results[i].startsWith(PREFIX)) continue
23
+
24
+ // Ensure no other entry starting with "did=" follows
25
+ for (let j = i + 1; j < results.length; j++) {
26
+ if (results[j].startsWith(PREFIX)) return null
27
+ }
28
+
29
+ // Note: No trimming (to be consistent with spec)
30
+ const did = results[i].slice(PREFIX.length)
31
+
32
+ // Invalid DBS record
33
+ return isResolvedHandle(did) ? did : null
34
+ }
35
+
36
+ return null
37
+ }
38
+ }
@@ -1,37 +1,44 @@
1
- import { Fetch } from '@atproto-labs/fetch'
2
-
3
1
  import {
4
- HandleResolveOptions,
5
2
  HandleResolver,
3
+ ResolveHandleOptions,
6
4
  ResolvedHandle,
7
5
  isResolvedHandle,
8
- } from './handle-resolver.js'
6
+ } from '../types.js'
9
7
 
10
8
  export type WellKnownHandleResolverOptions = {
11
- fetch?: Fetch
9
+ /**
10
+ * Fetch function to use for HTTP requests. Allows customizing the request
11
+ * behavior, e.g. adding headers, setting a timeout, mocking, etc. The
12
+ * provided fetch function will be wrapped with a safeFetchWrap function that
13
+ * adds SSRF protection.
14
+ *
15
+ * @default `globalThis.fetch`
16
+ */
17
+ fetch?: typeof globalThis.fetch
12
18
  }
13
19
 
14
20
  export class WellKnownHandleResolver implements HandleResolver {
15
- protected readonly fetch: Fetch
21
+ protected readonly fetch: typeof globalThis.fetch
16
22
 
17
- constructor({
18
- fetch = globalThis.fetch,
19
- }: WellKnownHandleResolverOptions = {}) {
20
- this.fetch = fetch
23
+ constructor(options?: WellKnownHandleResolverOptions) {
24
+ this.fetch = options?.fetch ?? globalThis.fetch
21
25
  }
22
26
 
23
27
  public async resolve(
24
28
  handle: string,
25
- options?: HandleResolveOptions,
29
+ options?: ResolveHandleOptions,
26
30
  ): Promise<ResolvedHandle> {
27
31
  const url = new URL('/.well-known/atproto-did', `https://${handle}`)
28
32
 
29
33
  const headers = new Headers()
30
34
  if (options?.noCache) headers.set('cache-control', 'no-cache')
31
- const request = new Request(url, { headers, signal: options?.signal })
32
35
 
33
36
  try {
34
- const response = await (0, this.fetch)(request)
37
+ const response = await this.fetch.call(null, url, {
38
+ headers,
39
+ signal: options?.signal,
40
+ redirect: 'error',
41
+ })
35
42
  const text = await response.text()
36
43
  const firstLine = text.split('\n')[0]!.trim()
37
44
 
@@ -43,8 +50,6 @@ export class WellKnownHandleResolver implements HandleResolver {
43
50
  // unless the failure was due to the signal being aborted.
44
51
  options?.signal?.throwIfAborted()
45
52
 
46
- // TODO: propagate some errors as-is (?)
47
-
48
53
  return null
49
54
  }
50
55
  }
@@ -1,15 +1,24 @@
1
- import { Did, isDid } from '@atproto-labs/did'
1
+ import { Did, isAtprotoDidWeb, isDidPlc } from '@atproto/did'
2
2
 
3
- export type HandleResolveOptions = {
3
+ export type ResolveHandleOptions = {
4
4
  signal?: AbortSignal
5
5
  noCache?: boolean
6
6
  }
7
- export type ResolvedHandle = null | Did
8
7
 
8
+ /**
9
+ * @see {@link https://atproto.com/specs/did#blessed-did-methods}
10
+ */
11
+ export type ResolvedHandle = null | Did<'plc' | 'web'>
12
+
13
+ export { type Did }
14
+
15
+ /**
16
+ * @see {@link https://atproto.com/specs/did#blessed-did-methods}
17
+ */
9
18
  export function isResolvedHandle<T = unknown>(
10
19
  value: T,
11
20
  ): value is T & ResolvedHandle {
12
- return value === null || (typeof value === 'string' && isDid(value))
21
+ return value === null || isDidPlc(value) || isAtprotoDidWeb(value)
13
22
  }
14
23
 
15
24
  export interface HandleResolver {
@@ -18,10 +27,10 @@ export interface HandleResolver {
18
27
  * is found. `null` should only be returned if no unexpected behavior occurred
19
28
  * during the resolution process.
20
29
  * @throws Error if the resolution method fails due to an unexpected error, or
21
- * if the resolution is aborted ({@link HandleResolveOptions.signal}).
30
+ * if the resolution is aborted ({@link ResolveHandleOptions}).
22
31
  */
23
32
  resolve(
24
33
  handle: string,
25
- options?: HandleResolveOptions,
34
+ options?: ResolveHandleOptions,
26
35
  ): Promise<ResolvedHandle>
27
36
  }
@@ -1,5 +1,5 @@
1
1
  {
2
- "extends": "../../tsconfig/isomorphic.json",
2
+ "extends": "../../../tsconfig/isomorphic.json",
3
3
  "compilerOptions": {
4
4
  "rootDir": "./src",
5
5
  "outDir": "./dist"
@@ -1 +0,0 @@
1
- {"version":3,"file":"atproto-lexicon-handle-resolver.d.ts","sourceRoot":"","sources":["../src/atproto-lexicon-handle-resolver.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,MAAM,qBAAqB,CAAA;AAC3C,OAAO,CAAC,MAAM,KAAK,CAAA;AAEnB,OAAO,EACL,oBAAoB,EACpB,cAAc,EACd,cAAc,EAEf,MAAM,sBAAsB,CAAA;AAE7B,eAAO,MAAM,eAAe;;;;;;;;;EAG1B,CAAA;AAEF,MAAM,MAAM,mCAAmC,GAAG;IAChD;;;;;OAKG;IACH,KAAK,CAAC,EAAE,KAAK,CAAA;IAEb;;;;;OAKG;IACH,GAAG,CAAC,EAAE,GAAG,GAAG,MAAM,CAAA;CACnB,CAAA;AAED,qBAAa,4BAA6B,YAAW,cAAc;IACjE,SAAS,CAAC,QAAQ,CAAC,GAAG,EAAE,GAAG,CAAA;IAC3B,SAAS,CAAC,QAAQ,CAAC,KAAK,EAAE,KAAK,CAAA;gBAEnB,EACV,GAA4B,EAC5B,KAAwB,GACzB,GAAE,mCAAwC;IAK9B,OAAO,CAClB,MAAM,EAAE,MAAM,EACd,OAAO,CAAC,EAAE,oBAAoB,GAC7B,OAAO,CAAC,cAAc,CAAC;CAuC3B"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"atproto-lexicon-handle-resolver.js","sourceRoot":"","sources":["../src/atproto-lexicon-handle-resolver.ts"],"names":[],"mappings":";;;;;;AACA,8CAAmB;AAEnB,6DAK6B;AAEhB,QAAA,eAAe,GAAG,aAAC,CAAC,MAAM,CAAC;IACtC,KAAK,EAAE,aAAC,CAAC,MAAM,EAAE;IACjB,OAAO,EAAE,aAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;CAC/B,CAAC,CAAA;AAoBF,MAAa,4BAA4B;IAIvC,YAAY,EACV,GAAG,GAAG,sBAAsB,EAC5B,KAAK,GAAG,UAAU,CAAC,KAAK,MACe,EAAE;QANxB;;;;;WAAQ;QACR;;;;;WAAY;QAM7B,IAAI,CAAC,GAAG,GAAG,IAAI,GAAG,CAAC,GAAG,CAAC,CAAA;QACvB,IAAI,CAAC,KAAK,GAAG,KAAK,CAAA;IACpB,CAAC;IAEM,KAAK,CAAC,OAAO,CAClB,MAAc,EACd,OAA8B;QAE9B,MAAM,GAAG,GAAG,IAAI,GAAG,CAAC,0CAA0C,EAAE,IAAI,CAAC,GAAG,CAAC,CAAA;QACzE,GAAG,CAAC,YAAY,CAAC,GAAG,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAA;QAEtC,MAAM,OAAO,GAAG,IAAI,OAAO,EAAE,CAAA;QAC7B,IAAI,OAAO,EAAE,OAAO;YAAE,OAAO,CAAC,GAAG,CAAC,eAAe,EAAE,UAAU,CAAC,CAAA;QAE9D,MAAM,OAAO,GAAG,IAAI,OAAO,CAAC,GAAG,EAAE,EAAE,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,CAAC,CAAA;QAEtE,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,EAAE,OAAO,CAAC,CAAA;QACrD,MAAM,OAAO,GAAG,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAA;QAErC,gCAAgC;QAChC,0FAA0F;QAC1F,qDAAqD;QACrD,iFAAiF;QAEjF,IAAI,QAAQ,CAAC,MAAM,KAAK,GAAG,EAAE,CAAC;YAC5B,MAAM,IAAI,GAAG,uBAAe,CAAC,KAAK,CAAC,OAAO,CAAC,CAAA;YAC3C,IACE,IAAI,CAAC,KAAK,KAAK,gBAAgB;gBAC/B,IAAI,CAAC,OAAO,KAAK,0BAA0B,EAC3C,CAAC;gBACD,OAAO,IAAI,CAAA;YACb,CAAC;QACH,CAAC;QAED,IAAI,CAAC,QAAQ,CAAC,EAAE,EAAE,CAAC;YACjB,MAAM,IAAI,KAAK,CAAC,4CAA4C,CAAC,CAAA;QAC/D,CAAC;QAED,MAAM,KAAK,GAAY,OAAO,EAAE,GAAG,CAAA;QAEnC,IAAI,CAAC,KAAK,IAAI,CAAC,IAAA,qCAAgB,EAAC,KAAK,CAAC,EAAE,CAAC;YACvC,MAAM,IAAI,KAAK,CAAC,gDAAgD,CAAC,CAAA;QACnE,CAAC;QAED,OAAO,KAAK,CAAA;IACd,CAAC;CACF;AAtDD,oEAsDC"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"handle-resolver.d.ts","sourceRoot":"","sources":["../src/handle-resolver.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,GAAG,EAAS,MAAM,mBAAmB,CAAA;AAE9C,MAAM,MAAM,oBAAoB,GAAG;IACjC,MAAM,CAAC,EAAE,WAAW,CAAA;IACpB,OAAO,CAAC,EAAE,OAAO,CAAA;CAClB,CAAA;AACD,MAAM,MAAM,cAAc,GAAG,IAAI,GAAG,GAAG,CAAA;AAEvC,wBAAgB,gBAAgB,CAAC,CAAC,GAAG,OAAO,EAC1C,KAAK,EAAE,CAAC,GACP,KAAK,IAAI,CAAC,GAAG,cAAc,CAE7B;AAED,MAAM,WAAW,cAAc;IAC7B;;;;;;OAMG;IACH,OAAO,CACL,MAAM,EAAE,MAAM,EACd,OAAO,CAAC,EAAE,oBAAoB,GAC7B,OAAO,CAAC,cAAc,CAAC,CAAA;CAC3B"}
@@ -1,9 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.isResolvedHandle = void 0;
4
- const did_1 = require("@atproto-labs/did");
5
- function isResolvedHandle(value) {
6
- return value === null || (typeof value === 'string' && (0, did_1.isDid)(value));
7
- }
8
- exports.isResolvedHandle = isResolvedHandle;
9
- //# sourceMappingURL=handle-resolver.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"handle-resolver.js","sourceRoot":"","sources":["../src/handle-resolver.ts"],"names":[],"mappings":";;;AAAA,2CAA8C;AAQ9C,SAAgB,gBAAgB,CAC9B,KAAQ;IAER,OAAO,KAAK,KAAK,IAAI,IAAI,CAAC,OAAO,KAAK,KAAK,QAAQ,IAAI,IAAA,WAAK,EAAC,KAAK,CAAC,CAAC,CAAA;AACtE,CAAC;AAJD,4CAIC"}
@@ -1,7 +0,0 @@
1
- import { HandleResolveOptions, HandleResolver, ResolvedHandle } from './handle-resolver.js';
2
- export declare class SerialHandleResolver implements HandleResolver {
3
- protected readonly resolvers: readonly HandleResolver[];
4
- constructor(resolvers: readonly HandleResolver[]);
5
- resolve(handle: string, options?: HandleResolveOptions): Promise<ResolvedHandle>;
6
- }
7
- //# sourceMappingURL=serial-handle-resolver.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"serial-handle-resolver.d.ts","sourceRoot":"","sources":["../src/serial-handle-resolver.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,oBAAoB,EACpB,cAAc,EACd,cAAc,EACf,MAAM,sBAAsB,CAAA;AAE7B,qBAAa,oBAAqB,YAAW,cAAc;IAC7C,SAAS,CAAC,QAAQ,CAAC,SAAS,EAAE,SAAS,cAAc,EAAE;gBAApC,SAAS,EAAE,SAAS,cAAc,EAAE;IAMtD,OAAO,CAClB,MAAM,EAAE,MAAM,EACd,OAAO,CAAC,EAAE,oBAAoB,GAC7B,OAAO,CAAC,cAAc,CAAC;CAY3B"}
@@ -1,29 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.SerialHandleResolver = void 0;
4
- class SerialHandleResolver {
5
- constructor(resolvers) {
6
- Object.defineProperty(this, "resolvers", {
7
- enumerable: true,
8
- configurable: true,
9
- writable: true,
10
- value: resolvers
11
- });
12
- if (!resolvers.length) {
13
- throw new TypeError('At least one resolver is required');
14
- }
15
- }
16
- async resolve(handle, options) {
17
- for (const resolver of this.resolvers) {
18
- options?.signal?.throwIfAborted();
19
- const value = await resolver.resolve(handle, options);
20
- if (value)
21
- return value;
22
- }
23
- // If no resolver was able to resolve the handle, assume there is no DID
24
- // corresponding to the handle.
25
- return null;
26
- }
27
- }
28
- exports.SerialHandleResolver = SerialHandleResolver;
29
- //# sourceMappingURL=serial-handle-resolver.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"serial-handle-resolver.js","sourceRoot":"","sources":["../src/serial-handle-resolver.ts"],"names":[],"mappings":";;;AAMA,MAAa,oBAAoB;IAC/B,YAA+B,SAAoC;QAAvD;;;;mBAAmB,SAAS;WAA2B;QACjE,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,CAAC;YACtB,MAAM,IAAI,SAAS,CAAC,mCAAmC,CAAC,CAAA;QAC1D,CAAC;IACH,CAAC;IAEM,KAAK,CAAC,OAAO,CAClB,MAAc,EACd,OAA8B;QAE9B,KAAK,MAAM,QAAQ,IAAI,IAAI,CAAC,SAAS,EAAE,CAAC;YACtC,OAAO,EAAE,MAAM,EAAE,cAAc,EAAE,CAAA;YAEjC,MAAM,KAAK,GAAG,MAAM,QAAQ,CAAC,OAAO,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;YACrD,IAAI,KAAK;gBAAE,OAAO,KAAK,CAAA;QACzB,CAAC;QAED,wEAAwE;QACxE,+BAA+B;QAC/B,OAAO,IAAI,CAAA;IACb,CAAC;CACF;AAtBD,oDAsBC"}
@@ -1,32 +0,0 @@
1
- import { GenericStore } from '@atproto-labs/caching';
2
- import { Fetch } from '@atproto-labs/fetch';
3
- import { CachedHandleResolver } from './cached-handle-resolver.js';
4
- import { HandleResolver, ResolvedHandle } from './handle-resolver.js';
5
- import { AtprotoLexiconHandleResolverOptions } from './atproto-lexicon-handle-resolver.js';
6
- export type HandleResolverCache = GenericStore<string, ResolvedHandle>;
7
- export type UniversalHandleResolverOptions = {
8
- cache?: HandleResolverCache;
9
- /**
10
- * Fetch function to use for HTTP requests. Allows customizing the request
11
- * behavior, e.g. adding headers, setting a timeout, mocking, etc.
12
- *
13
- * When using this library from a Node.js environment, you may want to use
14
- * `safeFetchWrap()` from `@atproto-labs/fetch-node` to add SSRF protection.
15
- *
16
- * @default `globalThis.fetch`
17
- */
18
- fetch?: Fetch;
19
- /**
20
- * @see {@link AtprotoLexiconHandleResolverOptions.url}
21
- */
22
- atprotoLexiconUrl?: AtprotoLexiconHandleResolverOptions['url'];
23
- };
24
- /**
25
- * A handle resolver that works in any environment that supports `fetch()`. This
26
- * relies on the a public XRPC implementing "com.atproto.identity.resolveHandle"
27
- * to resolve handles.
28
- */
29
- export declare class UniversalHandleResolver extends CachedHandleResolver implements HandleResolver {
30
- constructor({ fetch, cache, atprotoLexiconUrl, }?: UniversalHandleResolverOptions);
31
- }
32
- //# sourceMappingURL=universal-handle-resolver.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"universal-handle-resolver.d.ts","sourceRoot":"","sources":["../src/universal-handle-resolver.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,uBAAuB,CAAA;AACpD,OAAO,EAAE,KAAK,EAAE,MAAM,qBAAqB,CAAA;AAE3C,OAAO,EAAE,oBAAoB,EAAE,MAAM,6BAA6B,CAAA;AAClE,OAAO,EAAE,cAAc,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAA;AACrE,OAAO,EAEL,mCAAmC,EACpC,MAAM,sCAAsC,CAAA;AAI7C,MAAM,MAAM,mBAAmB,GAAG,YAAY,CAAC,MAAM,EAAE,cAAc,CAAC,CAAA;AAEtE,MAAM,MAAM,8BAA8B,GAAG;IAC3C,KAAK,CAAC,EAAE,mBAAmB,CAAA;IAE3B;;;;;;;;OAQG;IACH,KAAK,CAAC,EAAE,KAAK,CAAA;IAEb;;OAEG;IACH,iBAAiB,CAAC,EAAE,mCAAmC,CAAC,KAAK,CAAC,CAAA;CAC/D,CAAA;AAED;;;;GAIG;AACH,qBAAa,uBACX,SAAQ,oBACR,YAAW,cAAc;gBAEb,EACV,KAAwB,EACxB,KAAK,EACL,iBAAiB,GAClB,GAAE,8BAAmC;CAUvC"}
@@ -1,25 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.UniversalHandleResolver = void 0;
4
- const cached_handle_resolver_js_1 = require("./cached-handle-resolver.js");
5
- const atproto_lexicon_handle_resolver_js_1 = require("./atproto-lexicon-handle-resolver.js");
6
- const serial_handle_resolver_js_1 = require("./serial-handle-resolver.js");
7
- const well_known_handler_resolver_js_1 = require("./well-known-handler-resolver.js");
8
- /**
9
- * A handle resolver that works in any environment that supports `fetch()`. This
10
- * relies on the a public XRPC implementing "com.atproto.identity.resolveHandle"
11
- * to resolve handles.
12
- */
13
- class UniversalHandleResolver extends cached_handle_resolver_js_1.CachedHandleResolver {
14
- constructor({ fetch = globalThis.fetch, cache, atprotoLexiconUrl, } = {}) {
15
- const resolver = new serial_handle_resolver_js_1.SerialHandleResolver([
16
- // Try the well-known method first, allowing to reduce the load on the
17
- // XRPC.
18
- new well_known_handler_resolver_js_1.WellKnownHandleResolver({ fetch }),
19
- new atproto_lexicon_handle_resolver_js_1.AtprotoLexiconHandleResolver({ fetch, url: atprotoLexiconUrl }),
20
- ]);
21
- super({ resolver, cache });
22
- }
23
- }
24
- exports.UniversalHandleResolver = UniversalHandleResolver;
25
- //# sourceMappingURL=universal-handle-resolver.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"universal-handle-resolver.js","sourceRoot":"","sources":["../src/universal-handle-resolver.ts"],"names":[],"mappings":";;;AAGA,2EAAkE;AAElE,6FAG6C;AAC7C,2EAAkE;AAClE,qFAA0E;AAwB1E;;;;GAIG;AACH,MAAa,uBACX,SAAQ,gDAAoB;IAG5B,YAAY,EACV,KAAK,GAAG,UAAU,CAAC,KAAK,EACxB,KAAK,EACL,iBAAiB,MACiB,EAAE;QACpC,MAAM,QAAQ,GAAG,IAAI,gDAAoB,CAAC;YACxC,sEAAsE;YACtE,QAAQ;YACR,IAAI,wDAAuB,CAAC,EAAE,KAAK,EAAE,CAAC;YACtC,IAAI,iEAA4B,CAAC,EAAE,KAAK,EAAE,GAAG,EAAE,iBAAiB,EAAE,CAAC;SACpE,CAAC,CAAA;QAEF,KAAK,CAAC,EAAE,QAAQ,EAAE,KAAK,EAAE,CAAC,CAAA;IAC5B,CAAC;CACF;AAlBD,0DAkBC"}
@@ -1,11 +0,0 @@
1
- import { Fetch } from '@atproto-labs/fetch';
2
- import { HandleResolveOptions, HandleResolver, ResolvedHandle } from './handle-resolver.js';
3
- export type WellKnownHandleResolverOptions = {
4
- fetch?: Fetch;
5
- };
6
- export declare class WellKnownHandleResolver implements HandleResolver {
7
- protected readonly fetch: Fetch;
8
- constructor({ fetch, }?: WellKnownHandleResolverOptions);
9
- resolve(handle: string, options?: HandleResolveOptions): Promise<ResolvedHandle>;
10
- }
11
- //# sourceMappingURL=well-known-handler-resolver.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"well-known-handler-resolver.d.ts","sourceRoot":"","sources":["../src/well-known-handler-resolver.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,MAAM,qBAAqB,CAAA;AAE3C,OAAO,EACL,oBAAoB,EACpB,cAAc,EACd,cAAc,EAEf,MAAM,sBAAsB,CAAA;AAE7B,MAAM,MAAM,8BAA8B,GAAG;IAC3C,KAAK,CAAC,EAAE,KAAK,CAAA;CACd,CAAA;AAED,qBAAa,uBAAwB,YAAW,cAAc;IAC5D,SAAS,CAAC,QAAQ,CAAC,KAAK,EAAE,KAAK,CAAA;gBAEnB,EACV,KAAwB,GACzB,GAAE,8BAAmC;IAIzB,OAAO,CAClB,MAAM,EAAE,MAAM,EACd,OAAO,CAAC,EAAE,oBAAoB,GAC7B,OAAO,CAAC,cAAc,CAAC;CAyB3B"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"well-known-handler-resolver.js","sourceRoot":"","sources":["../src/well-known-handler-resolver.ts"],"names":[],"mappings":";;;AAEA,6DAK6B;AAM7B,MAAa,uBAAuB;IAGlC,YAAY,EACV,KAAK,GAAG,UAAU,CAAC,KAAK,MACU,EAAE;QAJnB;;;;;WAAY;QAK7B,IAAI,CAAC,KAAK,GAAG,KAAK,CAAA;IACpB,CAAC;IAEM,KAAK,CAAC,OAAO,CAClB,MAAc,EACd,OAA8B;QAE9B,MAAM,GAAG,GAAG,IAAI,GAAG,CAAC,0BAA0B,EAAE,WAAW,MAAM,EAAE,CAAC,CAAA;QAEpE,MAAM,OAAO,GAAG,IAAI,OAAO,EAAE,CAAA;QAC7B,IAAI,OAAO,EAAE,OAAO;YAAE,OAAO,CAAC,GAAG,CAAC,eAAe,EAAE,UAAU,CAAC,CAAA;QAC9D,MAAM,OAAO,GAAG,IAAI,OAAO,CAAC,GAAG,EAAE,EAAE,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,CAAC,CAAA;QAEtE,IAAI,CAAC;YACH,MAAM,QAAQ,GAAG,MAAM,CAAC,CAAC,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC,OAAO,CAAC,CAAA;YAC/C,MAAM,IAAI,GAAG,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAA;YAClC,MAAM,SAAS,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,CAAE,CAAC,IAAI,EAAE,CAAA;YAE7C,IAAI,IAAA,qCAAgB,EAAC,SAAS,CAAC;gBAAE,OAAO,SAAS,CAAA;YAEjD,OAAO,IAAI,CAAA;QACb,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,uEAAuE;YACvE,0DAA0D;YAC1D,OAAO,EAAE,MAAM,EAAE,cAAc,EAAE,CAAA;YAEjC,wCAAwC;YAExC,OAAO,IAAI,CAAA;QACb,CAAC;IACH,CAAC;CACF;AArCD,0DAqCC"}
@@ -1,29 +0,0 @@
1
- import {
2
- HandleResolveOptions,
3
- HandleResolver,
4
- ResolvedHandle,
5
- } from './handle-resolver.js'
6
-
7
- export class SerialHandleResolver implements HandleResolver {
8
- constructor(protected readonly resolvers: readonly HandleResolver[]) {
9
- if (!resolvers.length) {
10
- throw new TypeError('At least one resolver is required')
11
- }
12
- }
13
-
14
- public async resolve(
15
- handle: string,
16
- options?: HandleResolveOptions,
17
- ): Promise<ResolvedHandle> {
18
- for (const resolver of this.resolvers) {
19
- options?.signal?.throwIfAborted()
20
-
21
- const value = await resolver.resolve(handle, options)
22
- if (value) return value
23
- }
24
-
25
- // If no resolver was able to resolve the handle, assume there is no DID
26
- // corresponding to the handle.
27
- return null
28
- }
29
- }
@@ -1,58 +0,0 @@
1
- import { GenericStore } from '@atproto-labs/caching'
2
- import { Fetch } from '@atproto-labs/fetch'
3
-
4
- import { CachedHandleResolver } from './cached-handle-resolver.js'
5
- import { HandleResolver, ResolvedHandle } from './handle-resolver.js'
6
- import {
7
- AtprotoLexiconHandleResolver,
8
- AtprotoLexiconHandleResolverOptions,
9
- } from './atproto-lexicon-handle-resolver.js'
10
- import { SerialHandleResolver } from './serial-handle-resolver.js'
11
- import { WellKnownHandleResolver } from './well-known-handler-resolver.js'
12
-
13
- export type HandleResolverCache = GenericStore<string, ResolvedHandle>
14
-
15
- export type UniversalHandleResolverOptions = {
16
- cache?: HandleResolverCache
17
-
18
- /**
19
- * Fetch function to use for HTTP requests. Allows customizing the request
20
- * behavior, e.g. adding headers, setting a timeout, mocking, etc.
21
- *
22
- * When using this library from a Node.js environment, you may want to use
23
- * `safeFetchWrap()` from `@atproto-labs/fetch-node` to add SSRF protection.
24
- *
25
- * @default `globalThis.fetch`
26
- */
27
- fetch?: Fetch
28
-
29
- /**
30
- * @see {@link AtprotoLexiconHandleResolverOptions.url}
31
- */
32
- atprotoLexiconUrl?: AtprotoLexiconHandleResolverOptions['url']
33
- }
34
-
35
- /**
36
- * A handle resolver that works in any environment that supports `fetch()`. This
37
- * relies on the a public XRPC implementing "com.atproto.identity.resolveHandle"
38
- * to resolve handles.
39
- */
40
- export class UniversalHandleResolver
41
- extends CachedHandleResolver
42
- implements HandleResolver
43
- {
44
- constructor({
45
- fetch = globalThis.fetch,
46
- cache,
47
- atprotoLexiconUrl,
48
- }: UniversalHandleResolverOptions = {}) {
49
- const resolver = new SerialHandleResolver([
50
- // Try the well-known method first, allowing to reduce the load on the
51
- // XRPC.
52
- new WellKnownHandleResolver({ fetch }),
53
- new AtprotoLexiconHandleResolver({ fetch, url: atprotoLexiconUrl }),
54
- ])
55
-
56
- super({ resolver, cache })
57
- }
58
- }