@atproto-labs/handle-resolver 0.0.1 → 0.1.0

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 (64) hide show
  1. package/CHANGELOG.md +9 -7
  2. package/README.md +148 -0
  3. package/dist/app-view-handle-resolver.d.ts +33 -0
  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 +75 -0
  39. package/src/cached-handle-resolver.ts +19 -27
  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/types.ts +33 -0
  44. package/tsconfig.build.json +1 -1
  45. package/dist/atproto-lexicon-handle-resolver.d.ts +0 -36
  46. package/dist/atproto-lexicon-handle-resolver.d.ts.map +0 -1
  47. package/dist/atproto-lexicon-handle-resolver.js.map +0 -1
  48. package/dist/handle-resolver.d.ts.map +0 -1
  49. package/dist/handle-resolver.js +0 -9
  50. package/dist/handle-resolver.js.map +0 -1
  51. package/dist/serial-handle-resolver.d.ts +0 -7
  52. package/dist/serial-handle-resolver.d.ts.map +0 -1
  53. package/dist/serial-handle-resolver.js +0 -29
  54. package/dist/serial-handle-resolver.js.map +0 -1
  55. package/dist/universal-handle-resolver.d.ts +0 -32
  56. package/dist/universal-handle-resolver.d.ts.map +0 -1
  57. package/dist/universal-handle-resolver.js +0 -25
  58. package/dist/universal-handle-resolver.js.map +0 -1
  59. package/dist/well-known-handler-resolver.d.ts +0 -11
  60. package/dist/well-known-handler-resolver.d.ts.map +0 -1
  61. package/dist/well-known-handler-resolver.js.map +0 -1
  62. package/src/handle-resolver.ts +0 -27
  63. package/src/serial-handle-resolver.ts +0 -29
  64. package/src/universal-handle-resolver.ts +0 -58
@@ -1,37 +1,44 @@
1
- import { Fetch } from '@atproto-labs/fetch'
2
-
3
1
  import {
4
- HandleResolveOptions,
2
+ ResolveOptions,
5
3
  HandleResolver,
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?: ResolveOptions,
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
  }
package/src/types.ts ADDED
@@ -0,0 +1,33 @@
1
+ import { Did, isAtprotoDidWeb, isDidPlc } from '@atproto/did'
2
+
3
+ export type ResolveOptions = {
4
+ signal?: AbortSignal
5
+ noCache?: boolean
6
+ }
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
+ */
18
+ export function isResolvedHandle<T = unknown>(
19
+ value: T,
20
+ ): value is T & ResolvedHandle {
21
+ return value === null || isDidPlc(value) || isAtprotoDidWeb(value)
22
+ }
23
+
24
+ export interface HandleResolver {
25
+ /**
26
+ * @returns the DID that corresponds to the given handle, or `null` if no DID
27
+ * is found. `null` should only be returned if no unexpected behavior occurred
28
+ * during the resolution process.
29
+ * @throws Error if the resolution method fails due to an unexpected error, or
30
+ * if the resolution is aborted ({@link ResolveOptions}).
31
+ */
32
+ resolve(handle: string, options?: ResolveOptions): Promise<ResolvedHandle>
33
+ }
@@ -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,36 +0,0 @@
1
- import { Fetch } from '@atproto-labs/fetch';
2
- import z from 'zod';
3
- import { HandleResolveOptions, HandleResolver, ResolvedHandle } from './handle-resolver.js';
4
- export declare const xrpcErrorSchema: z.ZodObject<{
5
- error: z.ZodString;
6
- message: z.ZodOptional<z.ZodString>;
7
- }, "strip", z.ZodTypeAny, {
8
- error: string;
9
- message?: string | undefined;
10
- }, {
11
- error: string;
12
- message?: string | undefined;
13
- }>;
14
- export type AtprotoLexiconHandleResolverOptions = {
15
- /**
16
- * Fetch function to use for HTTP requests. Allows customizing the request
17
- * behavior, e.g. adding headers, setting a timeout, mocking, etc.
18
- *
19
- * @default globalThis.fetch
20
- */
21
- fetch?: Fetch;
22
- /**
23
- * URL of the atproto lexicon server. This is the base URL where the
24
- * `com.atproto.identity.resolveHandle` XRPC method is located.
25
- *
26
- * @default 'https://bsky.social'
27
- */
28
- url?: URL | string;
29
- };
30
- export declare class AtprotoLexiconHandleResolver implements HandleResolver {
31
- protected readonly url: URL;
32
- protected readonly fetch: Fetch;
33
- constructor({ url, fetch, }?: AtprotoLexiconHandleResolverOptions);
34
- resolve(handle: string, options?: HandleResolveOptions): Promise<ResolvedHandle>;
35
- }
36
- //# sourceMappingURL=atproto-lexicon-handle-resolver.d.ts.map
@@ -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,27 +0,0 @@
1
- import { Did, isDid } from '@atproto-labs/did'
2
-
3
- export type HandleResolveOptions = {
4
- signal?: AbortSignal
5
- noCache?: boolean
6
- }
7
- export type ResolvedHandle = null | Did
8
-
9
- export function isResolvedHandle<T = unknown>(
10
- value: T,
11
- ): value is T & ResolvedHandle {
12
- return value === null || (typeof value === 'string' && isDid(value))
13
- }
14
-
15
- export interface HandleResolver {
16
- /**
17
- * @returns the DID that corresponds to the given handle, or `null` if no DID
18
- * is found. `null` should only be returned if no unexpected behavior occurred
19
- * during the resolution process.
20
- * @throws Error if the resolution method fails due to an unexpected error, or
21
- * if the resolution is aborted ({@link HandleResolveOptions.signal}).
22
- */
23
- resolve(
24
- handle: string,
25
- options?: HandleResolveOptions,
26
- ): Promise<ResolvedHandle>
27
- }
@@ -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
- }