@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.
- package/CHANGELOG.md +18 -6
- package/README.md +148 -0
- package/dist/{atproto-lexicon-handle-resolver.d.ts → app-view-handle-resolver.d.ts} +11 -14
- package/dist/app-view-handle-resolver.d.ts.map +1 -0
- package/dist/{atproto-lexicon-handle-resolver.js → app-view-handle-resolver.js} +28 -15
- package/dist/app-view-handle-resolver.js.map +1 -0
- package/dist/atproto-doh-handle-resolver.d.ts +9 -0
- package/dist/atproto-doh-handle-resolver.d.ts.map +1 -0
- package/dist/atproto-doh-handle-resolver.js +98 -0
- package/dist/atproto-doh-handle-resolver.js.map +1 -0
- package/dist/atproto-handle-resolver.d.ts +22 -0
- package/dist/atproto-handle-resolver.d.ts.map +1 -0
- package/dist/atproto-handle-resolver.js +69 -0
- package/dist/atproto-handle-resolver.js.map +1 -0
- package/dist/cached-handle-resolver.d.ts +8 -12
- package/dist/cached-handle-resolver.d.ts.map +1 -1
- package/dist/cached-handle-resolver.js +17 -6
- package/dist/cached-handle-resolver.js.map +1 -1
- package/dist/index.d.ts +4 -6
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +6 -10
- package/dist/index.js.map +1 -1
- package/dist/internal-resolvers/dns-handle-resolver.d.ts +12 -0
- package/dist/internal-resolvers/dns-handle-resolver.d.ts.map +1 -0
- package/dist/internal-resolvers/dns-handle-resolver.js +38 -0
- package/dist/internal-resolvers/dns-handle-resolver.js.map +1 -0
- package/dist/internal-resolvers/well-known-handler-resolver.d.ts +18 -0
- package/dist/internal-resolvers/well-known-handler-resolver.d.ts.map +1 -0
- package/dist/{well-known-handler-resolver.js → internal-resolvers/well-known-handler-resolver.js} +9 -7
- package/dist/internal-resolvers/well-known-handler-resolver.js.map +1 -0
- package/dist/{handle-resolver.d.ts → types.d.ts} +13 -6
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +12 -0
- package/dist/types.js.map +1 -0
- package/package.json +6 -7
- package/src/{atproto-lexicon-handle-resolver.ts → app-view-handle-resolver.ts} +34 -27
- package/src/atproto-doh-handle-resolver.ts +123 -0
- package/src/atproto-handle-resolver.ts +79 -0
- package/src/cached-handle-resolver.ts +20 -24
- package/src/index.ts +6 -8
- package/src/internal-resolvers/dns-handle-resolver.ts +38 -0
- package/src/{well-known-handler-resolver.ts → internal-resolvers/well-known-handler-resolver.ts} +20 -15
- package/src/{handle-resolver.ts → types.ts} +15 -6
- package/tsconfig.build.json +1 -1
- package/dist/atproto-lexicon-handle-resolver.d.ts.map +0 -1
- package/dist/atproto-lexicon-handle-resolver.js.map +0 -1
- package/dist/handle-resolver.d.ts.map +0 -1
- package/dist/handle-resolver.js +0 -9
- package/dist/handle-resolver.js.map +0 -1
- package/dist/serial-handle-resolver.d.ts +0 -7
- package/dist/serial-handle-resolver.d.ts.map +0 -1
- package/dist/serial-handle-resolver.js +0 -29
- package/dist/serial-handle-resolver.js.map +0 -1
- package/dist/universal-handle-resolver.d.ts +0 -32
- package/dist/universal-handle-resolver.d.ts.map +0 -1
- package/dist/universal-handle-resolver.js +0 -25
- package/dist/universal-handle-resolver.js.map +0 -1
- package/dist/well-known-handler-resolver.d.ts +0 -11
- package/dist/well-known-handler-resolver.d.ts.map +0 -1
- package/dist/well-known-handler-resolver.js.map +0 -1
- package/src/serial-handle-resolver.ts +0 -29
- 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
|
+
}
|
package/src/{well-known-handler-resolver.ts → internal-resolvers/well-known-handler-resolver.ts}
RENAMED
|
@@ -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 '
|
|
6
|
+
} from '../types.js'
|
|
9
7
|
|
|
10
8
|
export type WellKnownHandleResolverOptions = {
|
|
11
|
-
|
|
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:
|
|
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?:
|
|
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
|
|
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,
|
|
1
|
+
import { Did, isAtprotoDidWeb, isDidPlc } from '@atproto/did'
|
|
2
2
|
|
|
3
|
-
export type
|
|
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 || (
|
|
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
|
|
30
|
+
* if the resolution is aborted ({@link ResolveHandleOptions}).
|
|
22
31
|
*/
|
|
23
32
|
resolve(
|
|
24
33
|
handle: string,
|
|
25
|
-
options?:
|
|
34
|
+
options?: ResolveHandleOptions,
|
|
26
35
|
): Promise<ResolvedHandle>
|
|
27
36
|
}
|
package/tsconfig.build.json
CHANGED
|
@@ -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"}
|
package/dist/handle-resolver.js
DELETED
|
@@ -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
|
-
}
|