@fedify/vocab-runtime 2.0.0-pr.479.1922 → 2.0.0-pr.490.2

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/deno.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@fedify/vocab-runtime",
3
- "version": "2.0.0-pr.479.1922+564a1890",
3
+ "version": "2.0.0-pr.490.2+99a396d5",
4
4
  "license": "MIT",
5
5
  "exports": {
6
6
  ".": "./src/mod.ts"
@@ -12,7 +12,6 @@
12
12
  "url": "https://hongminhee.org/"
13
13
  },
14
14
  "imports": {
15
- "@multiformats/base-x": "npm:@multiformats/base-x@^4.0.1",
16
15
  "asn1js": "npm:asn1js@^3.0.6",
17
16
  "byte-encodings": "npm:byte-encodings@^1.0.11",
18
17
  "fetch-mock": "npm:fetch-mock@^12.5.4",
package/dist/mod.cjs CHANGED
@@ -22,6 +22,7 @@ var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__ge
22
22
 
23
23
  //#endregion
24
24
  const __logtape_logtape = __toESM(require("@logtape/logtape"));
25
+ const __opentelemetry_api = __toESM(require("@opentelemetry/api"));
25
26
  const node_process = __toESM(require("node:process"));
26
27
  const node_dns_promises = __toESM(require("node:dns/promises"));
27
28
  const node_net = __toESM(require("node:net"));
@@ -4178,6 +4179,42 @@ const preloadedContexts = {
4178
4179
  };
4179
4180
  var contexts_default = preloadedContexts;
4180
4181
 
4182
+ //#endregion
4183
+ //#region deno.json
4184
+ var name = "@fedify/vocab-runtime";
4185
+ var version = "2.0.0-pr.490.2+99a396d5";
4186
+ var license = "MIT";
4187
+ var exports$1 = { ".": "./src/mod.ts" };
4188
+ var description = "Runtime library for @fedify/vocab";
4189
+ var author = {
4190
+ "name": "Hong Minhee",
4191
+ "email": "hong@minhee.org",
4192
+ "url": "https://hongminhee.org/"
4193
+ };
4194
+ var imports = {
4195
+ "asn1js": "npm:asn1js@^3.0.6",
4196
+ "byte-encodings": "npm:byte-encodings@^1.0.11",
4197
+ "fetch-mock": "npm:fetch-mock@^12.5.4",
4198
+ "multicodec": "npm:multicodec@^3.2.1",
4199
+ "pkijs": "npm:pkijs@^3.2.5"
4200
+ };
4201
+ var exclude = ["dist", "node_modules"];
4202
+ var tasks = {
4203
+ "check": "deno fmt --check && deno lint && deno check src/*.ts",
4204
+ "test": "deno test"
4205
+ };
4206
+ var deno_default = {
4207
+ name,
4208
+ version,
4209
+ license,
4210
+ exports: exports$1,
4211
+ description,
4212
+ author,
4213
+ imports,
4214
+ exclude,
4215
+ tasks
4216
+ };
4217
+
4181
4218
  //#endregion
4182
4219
  //#region src/link.ts
4183
4220
  const parametersNeedLowerCase = ["rel", "type"];
@@ -4360,43 +4397,6 @@ var HttpHeaderLink = class HttpHeaderLink {
4360
4397
  }
4361
4398
  };
4362
4399
 
4363
- //#endregion
4364
- //#region deno.json
4365
- var name = "@fedify/vocab-runtime";
4366
- var version = "2.0.0-pr.479.1922+564a1890";
4367
- var license = "MIT";
4368
- var exports$1 = { ".": "./src/mod.ts" };
4369
- var description = "Runtime library for @fedify/vocab";
4370
- var author = {
4371
- "name": "Hong Minhee",
4372
- "email": "hong@minhee.org",
4373
- "url": "https://hongminhee.org/"
4374
- };
4375
- var imports = {
4376
- "@multiformats/base-x": "npm:@multiformats/base-x@^4.0.1",
4377
- "asn1js": "npm:asn1js@^3.0.6",
4378
- "byte-encodings": "npm:byte-encodings@^1.0.11",
4379
- "fetch-mock": "npm:fetch-mock@^12.5.4",
4380
- "multicodec": "npm:multicodec@^3.2.1",
4381
- "pkijs": "npm:pkijs@^3.2.5"
4382
- };
4383
- var exclude = ["dist", "node_modules"];
4384
- var tasks = {
4385
- "check": "deno fmt --check && deno lint && deno check src/*.ts",
4386
- "test": "deno test"
4387
- };
4388
- var deno_default = {
4389
- name,
4390
- version,
4391
- license,
4392
- exports: exports$1,
4393
- description,
4394
- author,
4395
- imports,
4396
- exclude,
4397
- tasks
4398
- };
4399
-
4400
4400
  //#endregion
4401
4401
  //#region src/request.ts
4402
4402
  /**
@@ -4636,6 +4636,8 @@ async function getRemoteDocument(url, response, fetch$1) {
4636
4636
  * @since 1.3.0
4637
4637
  */
4638
4638
  function getDocumentLoader({ allowPrivateAddress, skipPreloadedContexts, userAgent } = {}) {
4639
+ const tracerProvider = __opentelemetry_api.trace.getTracerProvider();
4640
+ const tracer = tracerProvider.getTracer(deno_default.name, deno_default.version);
4639
4641
  async function load(url, options) {
4640
4642
  options?.signal?.throwIfAborted();
4641
4643
  if (!skipPreloadedContexts && url in contexts_default) {
@@ -4655,14 +4657,38 @@ function getDocumentLoader({ allowPrivateAddress, skipPreloadedContexts, userAge
4655
4657
  });
4656
4658
  throw error;
4657
4659
  }
4658
- const request = createActivityPubRequest(url, { userAgent });
4659
- logRequest(logger, request);
4660
- const response = await fetch(request, {
4661
- redirect: "manual",
4662
- signal: options?.signal
4660
+ return await tracer.startActiveSpan("activitypub.fetch_document", {
4661
+ kind: __opentelemetry_api.SpanKind.CLIENT,
4662
+ attributes: { "url.full": url }
4663
+ }, async (span) => {
4664
+ try {
4665
+ const request = createActivityPubRequest(url, { userAgent });
4666
+ logRequest(logger, request);
4667
+ const response = await fetch(request, {
4668
+ redirect: "manual",
4669
+ signal: options?.signal
4670
+ });
4671
+ span.setAttribute("http.response.status_code", response.status);
4672
+ if (response.status >= 300 && response.status < 400 && response.headers.has("Location")) {
4673
+ const redirectUrl = response.headers.get("Location");
4674
+ span.setAttribute("http.redirect.url", redirectUrl);
4675
+ return await load(redirectUrl, options);
4676
+ }
4677
+ const result = await getRemoteDocument(url, response, load);
4678
+ span.setAttribute("docloader.document_url", result.documentUrl);
4679
+ if (result.contextUrl != null) span.setAttribute("docloader.context_url", result.contextUrl);
4680
+ return result;
4681
+ } catch (error) {
4682
+ span.recordException(error);
4683
+ span.setStatus({
4684
+ code: __opentelemetry_api.SpanStatusCode.ERROR,
4685
+ message: String(error)
4686
+ });
4687
+ throw error;
4688
+ } finally {
4689
+ span.end();
4690
+ }
4663
4691
  });
4664
- if (response.status >= 300 && response.status < 400 && response.headers.has("Location")) return load(response.headers.get("Location"), options);
4665
- return getRemoteDocument(url, response, load);
4666
4692
  }
4667
4693
  return load;
4668
4694
  }
package/dist/mod.js CHANGED
@@ -1,4 +1,5 @@
1
1
  import { getLogger } from "@logtape/logtape";
2
+ import { SpanKind, SpanStatusCode, trace } from "@opentelemetry/api";
2
3
  import process from "node:process";
3
4
  import { lookup } from "node:dns/promises";
4
5
  import { isIP } from "node:net";
@@ -4155,6 +4156,42 @@ const preloadedContexts = {
4155
4156
  };
4156
4157
  var contexts_default = preloadedContexts;
4157
4158
 
4159
+ //#endregion
4160
+ //#region deno.json
4161
+ var name = "@fedify/vocab-runtime";
4162
+ var version = "2.0.0-pr.490.2+99a396d5";
4163
+ var license = "MIT";
4164
+ var exports = { ".": "./src/mod.ts" };
4165
+ var description = "Runtime library for @fedify/vocab";
4166
+ var author = {
4167
+ "name": "Hong Minhee",
4168
+ "email": "hong@minhee.org",
4169
+ "url": "https://hongminhee.org/"
4170
+ };
4171
+ var imports = {
4172
+ "asn1js": "npm:asn1js@^3.0.6",
4173
+ "byte-encodings": "npm:byte-encodings@^1.0.11",
4174
+ "fetch-mock": "npm:fetch-mock@^12.5.4",
4175
+ "multicodec": "npm:multicodec@^3.2.1",
4176
+ "pkijs": "npm:pkijs@^3.2.5"
4177
+ };
4178
+ var exclude = ["dist", "node_modules"];
4179
+ var tasks = {
4180
+ "check": "deno fmt --check && deno lint && deno check src/*.ts",
4181
+ "test": "deno test"
4182
+ };
4183
+ var deno_default = {
4184
+ name,
4185
+ version,
4186
+ license,
4187
+ exports,
4188
+ description,
4189
+ author,
4190
+ imports,
4191
+ exclude,
4192
+ tasks
4193
+ };
4194
+
4158
4195
  //#endregion
4159
4196
  //#region src/link.ts
4160
4197
  const parametersNeedLowerCase = ["rel", "type"];
@@ -4337,43 +4374,6 @@ var HttpHeaderLink = class HttpHeaderLink {
4337
4374
  }
4338
4375
  };
4339
4376
 
4340
- //#endregion
4341
- //#region deno.json
4342
- var name = "@fedify/vocab-runtime";
4343
- var version = "2.0.0-pr.479.1922+564a1890";
4344
- var license = "MIT";
4345
- var exports = { ".": "./src/mod.ts" };
4346
- var description = "Runtime library for @fedify/vocab";
4347
- var author = {
4348
- "name": "Hong Minhee",
4349
- "email": "hong@minhee.org",
4350
- "url": "https://hongminhee.org/"
4351
- };
4352
- var imports = {
4353
- "@multiformats/base-x": "npm:@multiformats/base-x@^4.0.1",
4354
- "asn1js": "npm:asn1js@^3.0.6",
4355
- "byte-encodings": "npm:byte-encodings@^1.0.11",
4356
- "fetch-mock": "npm:fetch-mock@^12.5.4",
4357
- "multicodec": "npm:multicodec@^3.2.1",
4358
- "pkijs": "npm:pkijs@^3.2.5"
4359
- };
4360
- var exclude = ["dist", "node_modules"];
4361
- var tasks = {
4362
- "check": "deno fmt --check && deno lint && deno check src/*.ts",
4363
- "test": "deno test"
4364
- };
4365
- var deno_default = {
4366
- name,
4367
- version,
4368
- license,
4369
- exports,
4370
- description,
4371
- author,
4372
- imports,
4373
- exclude,
4374
- tasks
4375
- };
4376
-
4377
4377
  //#endregion
4378
4378
  //#region src/request.ts
4379
4379
  /**
@@ -4613,6 +4613,8 @@ async function getRemoteDocument(url, response, fetch$1) {
4613
4613
  * @since 1.3.0
4614
4614
  */
4615
4615
  function getDocumentLoader({ allowPrivateAddress, skipPreloadedContexts, userAgent } = {}) {
4616
+ const tracerProvider = trace.getTracerProvider();
4617
+ const tracer = tracerProvider.getTracer(deno_default.name, deno_default.version);
4616
4618
  async function load(url, options) {
4617
4619
  options?.signal?.throwIfAborted();
4618
4620
  if (!skipPreloadedContexts && url in contexts_default) {
@@ -4632,14 +4634,38 @@ function getDocumentLoader({ allowPrivateAddress, skipPreloadedContexts, userAge
4632
4634
  });
4633
4635
  throw error;
4634
4636
  }
4635
- const request = createActivityPubRequest(url, { userAgent });
4636
- logRequest(logger, request);
4637
- const response = await fetch(request, {
4638
- redirect: "manual",
4639
- signal: options?.signal
4637
+ return await tracer.startActiveSpan("activitypub.fetch_document", {
4638
+ kind: SpanKind.CLIENT,
4639
+ attributes: { "url.full": url }
4640
+ }, async (span) => {
4641
+ try {
4642
+ const request = createActivityPubRequest(url, { userAgent });
4643
+ logRequest(logger, request);
4644
+ const response = await fetch(request, {
4645
+ redirect: "manual",
4646
+ signal: options?.signal
4647
+ });
4648
+ span.setAttribute("http.response.status_code", response.status);
4649
+ if (response.status >= 300 && response.status < 400 && response.headers.has("Location")) {
4650
+ const redirectUrl = response.headers.get("Location");
4651
+ span.setAttribute("http.redirect.url", redirectUrl);
4652
+ return await load(redirectUrl, options);
4653
+ }
4654
+ const result = await getRemoteDocument(url, response, load);
4655
+ span.setAttribute("docloader.document_url", result.documentUrl);
4656
+ if (result.contextUrl != null) span.setAttribute("docloader.context_url", result.contextUrl);
4657
+ return result;
4658
+ } catch (error) {
4659
+ span.recordException(error);
4660
+ span.setStatus({
4661
+ code: SpanStatusCode.ERROR,
4662
+ message: String(error)
4663
+ });
4664
+ throw error;
4665
+ } finally {
4666
+ span.end();
4667
+ }
4640
4668
  });
4641
- if (response.status >= 300 && response.status < 400 && response.headers.has("Location")) return load(response.headers.get("Location"), options);
4642
- return getRemoteDocument(url, response, load);
4643
4669
  }
4644
4670
  return load;
4645
4671
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@fedify/vocab-runtime",
3
- "version": "2.0.0-pr.479.1922+564a1890",
3
+ "version": "2.0.0-pr.490.2+99a396d5",
4
4
  "homepage": "https://fedify.dev/",
5
5
  "repository": {
6
6
  "type": "git",
@@ -55,8 +55,9 @@
55
55
  "typescript": "^5.9.3"
56
56
  },
57
57
  "dependencies": {
58
- "@logtape/logtape": "^1.1.1",
58
+ "@logtape/logtape": "^1.2.2",
59
59
  "@multiformats/base-x": "^4.0.1",
60
+ "@opentelemetry/api": "^1.9.0",
60
61
  "asn1js": "^3.0.6",
61
62
  "byte-encodings": "^1.0.11",
62
63
  "multicodec": "^3.2.1",
package/src/docloader.ts CHANGED
@@ -1,4 +1,6 @@
1
1
  import { getLogger } from "@logtape/logtape";
2
+ import { SpanKind, SpanStatusCode, trace } from "@opentelemetry/api";
3
+ import metadata from "../deno.json" with { type: "json" };
2
4
  import preloadedContexts from "./contexts.ts";
3
5
  import { HttpHeaderLink } from "./link.ts";
4
6
  import {
@@ -266,6 +268,9 @@ export function getDocumentLoader(
266
268
  { allowPrivateAddress, skipPreloadedContexts, userAgent }:
267
269
  GetDocumentLoaderOptions = {},
268
270
  ): DocumentLoader {
271
+ const tracerProvider = trace.getTracerProvider();
272
+ const tracer = tracerProvider.getTracer(metadata.name, metadata.version);
273
+
269
274
  async function load(
270
275
  url: string,
271
276
  options?: DocumentLoaderOptions,
@@ -289,23 +294,56 @@ export function getDocumentLoader(
289
294
  throw error;
290
295
  }
291
296
  }
292
- const request = createActivityPubRequest(url, { userAgent });
293
- logRequest(logger, request);
294
- const response = await fetch(request, {
295
- // Since Bun has a bug that ignores the `Request.redirect` option,
296
- // to work around it we specify `redirect: "manual"` here too:
297
- // https://github.com/oven-sh/bun/issues/10754
298
- redirect: "manual",
299
- signal: options?.signal,
300
- });
301
- // Follow redirects manually to get the final URL:
302
- if (
303
- response.status >= 300 && response.status < 400 &&
304
- response.headers.has("Location")
305
- ) {
306
- return load(response.headers.get("Location")!, options);
307
- }
308
- return getRemoteDocument(url, response, load);
297
+
298
+ return await tracer.startActiveSpan(
299
+ "activitypub.fetch_document",
300
+ {
301
+ kind: SpanKind.CLIENT,
302
+ attributes: {
303
+ "url.full": url,
304
+ },
305
+ },
306
+ async (span) => {
307
+ try {
308
+ const request = createActivityPubRequest(url, { userAgent });
309
+ logRequest(logger, request);
310
+ const response = await fetch(request, {
311
+ // Since Bun has a bug that ignores the `Request.redirect` option,
312
+ // to work around it we specify `redirect: "manual"` here too:
313
+ // https://github.com/oven-sh/bun/issues/10754
314
+ redirect: "manual",
315
+ signal: options?.signal,
316
+ });
317
+ span.setAttribute("http.response.status_code", response.status);
318
+
319
+ // Follow redirects manually to get the final URL:
320
+ if (
321
+ response.status >= 300 && response.status < 400 &&
322
+ response.headers.has("Location")
323
+ ) {
324
+ const redirectUrl = response.headers.get("Location")!;
325
+ span.setAttribute("http.redirect.url", redirectUrl);
326
+ return await load(redirectUrl, options);
327
+ }
328
+
329
+ const result = await getRemoteDocument(url, response, load);
330
+ span.setAttribute("docloader.document_url", result.documentUrl);
331
+ if (result.contextUrl != null) {
332
+ span.setAttribute("docloader.context_url", result.contextUrl);
333
+ }
334
+ return result;
335
+ } catch (error) {
336
+ span.recordException(error as Error);
337
+ span.setStatus({
338
+ code: SpanStatusCode.ERROR,
339
+ message: String(error),
340
+ });
341
+ throw error;
342
+ } finally {
343
+ span.end();
344
+ }
345
+ },
346
+ );
309
347
  }
310
348
  return load;
311
349
  }