1
1
import { getLogger } from "@logtape/logtape" ;
2
+ import {
3
+ SpanKind ,
4
+ SpanStatusCode ,
5
+ type TracerProvider ,
6
+ } from "@opentelemetry/api" ;
7
+ import metadata from "../deno.json" with { type : "json" } ;
2
8
import {
3
9
getUserAgent ,
4
10
type GetUserAgentOptions ,
@@ -19,6 +25,12 @@ export interface LookupWebFingerOptions {
19
25
* the `User-Agent` header value.
20
26
*/
21
27
userAgent ?: GetUserAgentOptions | string ;
28
+
29
+ /**
30
+ * The OpenTelemetry tracer provider.
31
+ * @since 1.3.0
32
+ */
33
+ tracerProvider ?: TracerProvider ;
22
34
}
23
35
24
36
/**
@@ -31,6 +43,48 @@ export interface LookupWebFingerOptions {
31
43
export async function lookupWebFinger (
32
44
resource : URL | string ,
33
45
options : LookupWebFingerOptions = { } ,
46
+ ) : Promise < ResourceDescriptor | null > {
47
+ if ( options . tracerProvider == null ) {
48
+ return await lookupWebFingerInternal ( resource , options ) ;
49
+ }
50
+ const tracer = options . tracerProvider . getTracer (
51
+ metadata . name ,
52
+ metadata . version ,
53
+ ) ;
54
+ return await tracer . startActiveSpan (
55
+ "WebFinger" ,
56
+ {
57
+ kind : SpanKind . CLIENT ,
58
+ attributes : {
59
+ "webfinger.resource" : resource . toString ( ) ,
60
+ "webfinger.resource.scheme" : typeof resource === "string"
61
+ ? resource . replace ( / : .* $ / , "" )
62
+ : resource . protocol . replace ( / : $ / , "" ) ,
63
+ } ,
64
+ } ,
65
+ async ( span ) => {
66
+ try {
67
+ const result = await lookupWebFingerInternal ( resource , options ) ;
68
+ span . setStatus ( {
69
+ code : result === null ? SpanStatusCode . ERROR : SpanStatusCode . OK ,
70
+ } ) ;
71
+ return result ;
72
+ } catch ( error ) {
73
+ span . setStatus ( {
74
+ code : SpanStatusCode . ERROR ,
75
+ message : String ( error ) ,
76
+ } ) ;
77
+ throw error ;
78
+ } finally {
79
+ span . end ( ) ;
80
+ }
81
+ } ,
82
+ ) ;
83
+ }
84
+
85
+ async function lookupWebFingerInternal (
86
+ resource : URL | string ,
87
+ options : LookupWebFingerOptions = { } ,
34
88
) : Promise < ResourceDescriptor | null > {
35
89
if ( typeof resource === "string" ) resource = new URL ( resource ) ;
36
90
let protocol = "https:" ;
0 commit comments