@fedify/vocab-runtime 2.1.0 → 2.1.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.
Files changed (58) hide show
  1. package/deno.json +1 -1
  2. package/dist/{chunk-CUT6urMc.cjs → chunk-CKQMccvm.cjs} +7 -9
  3. package/dist/jsonld.cjs +4 -5
  4. package/dist/jsonld.d.cts +3 -4
  5. package/dist/jsonld.d.ts +2 -2
  6. package/dist/jsonld.js +1 -3
  7. package/dist/mod.cjs +107 -180
  8. package/dist/mod.d.cts +1 -2
  9. package/dist/mod.d.ts +1 -2
  10. package/dist/mod.js +83 -159
  11. package/dist/tests/{chunk-DWy1uDak.cjs → chunk-Do9eywBl.cjs} +13 -17
  12. package/dist/tests/decimal.test.cjs +12 -21
  13. package/dist/tests/{decimal.test.js → decimal.test.mjs} +10 -18
  14. package/dist/tests/{docloader-D3nu2LmR.cjs → docloader-0Yz9aPvU.cjs} +78 -91
  15. package/dist/tests/{docloader-U31begIa.js → docloader-DiLx08rm.mjs} +62 -75
  16. package/dist/tests/docloader.test.cjs +98 -88
  17. package/dist/tests/{docloader.test.js → docloader.test.mjs} +98 -94
  18. package/dist/tests/internal/multicodec.test.cjs +5 -7
  19. package/dist/tests/internal/{multicodec.test.js → multicodec.test.mjs} +3 -4
  20. package/dist/tests/{key-ByCmSI2y.js → key-BeTHFQJK.mjs} +14 -25
  21. package/dist/tests/{key-CCPn6TEY.cjs → key-DTTIntwb.cjs} +60 -71
  22. package/dist/tests/key.test.cjs +23 -45
  23. package/dist/tests/{key.test.js → key.test.mjs} +21 -42
  24. package/dist/tests/{langstr-EPh86hXK.cjs → langstr-CbAxaeEZ.cjs} +6 -8
  25. package/dist/tests/{langstr-BsVE3s9u.js → langstr-Di5AvKpB.mjs} +1 -2
  26. package/dist/tests/langstr.test.cjs +7 -8
  27. package/dist/tests/{langstr.test.js → langstr.test.mjs} +3 -4
  28. package/dist/tests/{link-DYNFAdNu.cjs → link-FguCydMA.cjs} +6 -8
  29. package/dist/tests/{link-C3q2TC2G.js → link-NUUWCdnK.mjs} +1 -2
  30. package/dist/tests/link.test.cjs +5 -7
  31. package/dist/tests/{link.test.js → link.test.mjs} +3 -4
  32. package/dist/tests/multibase/multibase.test.cjs +10 -17
  33. package/dist/tests/multibase/{multibase.test.js → multibase.test.mjs} +10 -18
  34. package/dist/tests/{multibase-B4g8pz6F.js → multibase-BgU9XRf7.mjs} +5 -12
  35. package/dist/tests/{multibase-o_ovPHYJ.cjs → multibase-F7LtMMsK.cjs} +43 -49
  36. package/dist/tests/{multicodec--6hQ74zI.cjs → multicodec-CxGVGa91.cjs} +16 -18
  37. package/dist/tests/{multicodec-Dq3IiOV4.js → multicodec-CyFp54fI.mjs} +1 -2
  38. package/dist/tests/{request-DyrEDYQ-.cjs → request-B4BOehn0.cjs} +38 -72
  39. package/dist/tests/{request-BH_NlxCL.js → request-Nob25QBF.mjs} +4 -45
  40. package/dist/tests/request.test.cjs +23 -24
  41. package/dist/tests/request.test.mjs +42 -0
  42. package/dist/tests/{url-CWEP9Zs9.js → url-BQ_kgmCk.mjs} +3 -7
  43. package/dist/tests/{url-DIjOdK8Q.cjs → url-pFuSds44.cjs} +31 -35
  44. package/dist/tests/url.test.cjs +5 -7
  45. package/dist/tests/{url.test.js → url.test.mjs} +3 -4
  46. package/package.json +3 -3
  47. package/src/docloader.test.ts +67 -0
  48. package/src/docloader.ts +43 -11
  49. package/dist/tests/request.test.js +0 -43
  50. /package/dist/tests/{decimal.test.d.ts → decimal.test.d.mts} +0 -0
  51. /package/dist/tests/{docloader.test.d.ts → docloader.test.d.mts} +0 -0
  52. /package/dist/tests/internal/{multicodec.test.d.ts → multicodec.test.d.mts} +0 -0
  53. /package/dist/tests/{key.test.d.ts → key.test.d.mts} +0 -0
  54. /package/dist/tests/{langstr.test.d.ts → langstr.test.d.mts} +0 -0
  55. /package/dist/tests/{link.test.d.ts → link.test.d.mts} +0 -0
  56. /package/dist/tests/multibase/{multibase.test.d.ts → multibase.test.d.mts} +0 -0
  57. /package/dist/tests/{request.test.d.ts → request.test.d.mts} +0 -0
  58. /package/dist/tests/{url.test.d.ts → url.test.d.mts} +0 -0
package/dist/mod.cjs CHANGED
@@ -1,18 +1,20 @@
1
- const require_chunk = require('./chunk-CUT6urMc.cjs');
2
- const __logtape_logtape = require_chunk.__toESM(require("@logtape/logtape"));
3
- const __opentelemetry_api = require_chunk.__toESM(require("@opentelemetry/api"));
4
- const node_process = require_chunk.__toESM(require("node:process"));
5
- const node_dns_promises = require_chunk.__toESM(require("node:dns/promises"));
6
- const node_net = require_chunk.__toESM(require("node:net"));
7
- const asn1js = require_chunk.__toESM(require("asn1js"));
8
- const byte_encodings_base64 = require_chunk.__toESM(require("byte-encodings/base64"));
9
- const byte_encodings_base64url = require_chunk.__toESM(require("byte-encodings/base64url"));
10
- const node_crypto = require_chunk.__toESM(require("node:crypto"));
11
- const pkijs = require_chunk.__toESM(require("pkijs"));
12
- const __multiformats_base_x = require_chunk.__toESM(require("@multiformats/base-x"));
13
-
1
+ Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
2
+ const require_chunk = require("./chunk-CKQMccvm.cjs");
3
+ let _logtape_logtape = require("@logtape/logtape");
4
+ let _opentelemetry_api = require("@opentelemetry/api");
5
+ let node_process = require("node:process");
6
+ node_process = require_chunk.__toESM(node_process);
7
+ let node_dns_promises = require("node:dns/promises");
8
+ let node_net = require("node:net");
9
+ let asn1js = require("asn1js");
10
+ let byte_encodings_base64 = require("byte-encodings/base64");
11
+ let byte_encodings_base64url = require("byte-encodings/base64url");
12
+ let node_crypto = require("node:crypto");
13
+ let pkijs = require("pkijs");
14
+ let _multiformats_base_x = require("@multiformats/base-x");
15
+ _multiformats_base_x = require_chunk.__toESM(_multiformats_base_x);
14
16
  //#region src/contexts/activitystreams.json
15
- var __context$11 = {
17
+ var activitystreams_default = { "@context": {
16
18
  "@vocab": "_:",
17
19
  "xsd": "http://www.w3.org/2001/XMLSchema#",
18
20
  "as": "https://www.w3.org/ns/activitystreams#",
@@ -388,12 +390,10 @@ var __context$11 = {
388
390
  "@id": "as:alsoKnownAs",
389
391
  "@type": "@id"
390
392
  }
391
- };
392
- var activitystreams_default = { "@context": __context$11 };
393
-
393
+ } };
394
394
  //#endregion
395
395
  //#region src/contexts/did-v1.json
396
- var __context$10 = {
396
+ var did_v1_default = { "@context": {
397
397
  "@protected": true,
398
398
  "id": "@id",
399
399
  "type": "@type",
@@ -447,12 +447,10 @@ var __context$10 = {
447
447
  "@id": "https://w3id.org/security#verificationMethod",
448
448
  "@type": "@id"
449
449
  }
450
- };
451
- var did_v1_default = { "@context": __context$10 };
452
-
450
+ } };
453
451
  //#endregion
454
452
  //#region src/contexts/fep-5711.json
455
- var __context$9 = {
453
+ var fep_5711_default = { "@context": {
456
454
  "likesOf": {
457
455
  "@id": "https://w3id.org/fep/5711#likesOf",
458
456
  "@type": "@id"
@@ -485,12 +483,10 @@ var __context$9 = {
485
483
  "@id": "https://w3id.org/fep/5711#likedOf",
486
484
  "@type": "@id"
487
485
  }
488
- };
489
- var fep_5711_default = { "@context": __context$9 };
490
-
486
+ } };
491
487
  //#endregion
492
488
  //#region src/contexts/gotosocial.json
493
- var __context$8 = {
489
+ var gotosocial_default = { "@context": {
494
490
  "xsd": "http://www.w3.org/2001/XMLSchema#",
495
491
  "gts": "https://gotosocial.org/ns#",
496
492
  "LikeRequest": "gts:LikeRequest",
@@ -573,12 +569,10 @@ var __context$8 = {
573
569
  "@id": "gts:approvedBy",
574
570
  "@type": "@id"
575
571
  }
576
- };
577
- var gotosocial_default = { "@context": __context$8 };
578
-
572
+ } };
579
573
  //#endregion
580
574
  //#region src/contexts/identity-v1.json
581
- var __context$7 = {
575
+ var identity_v1_default = { "@context": {
582
576
  "id": "@id",
583
577
  "type": "@type",
584
578
  "cred": "https://w3id.org/credentials#",
@@ -727,12 +721,10 @@ var __context$7 = {
727
721
  "@id": "perm:writePermission",
728
722
  "@type": "@id"
729
723
  }
730
- };
731
- var identity_v1_default = { "@context": __context$7 };
732
-
724
+ } };
733
725
  //#endregion
734
726
  //#region src/contexts/joinmastodon.json
735
- var __context$6 = {
727
+ var joinmastodon_default = { "@context": {
736
728
  "toot": "http://joinmastodon.org/ns#",
737
729
  "Emoji": "toot:Emoji",
738
730
  "featured": {
@@ -757,12 +749,10 @@ var __context$6 = {
757
749
  "@id": "toot:attributionDomains",
758
750
  "@type": "@id"
759
751
  }
760
- };
761
- var joinmastodon_default = { "@context": __context$6 };
762
-
752
+ } };
763
753
  //#endregion
764
754
  //#region src/contexts/schemaorg.json
765
- var __context$5 = {
755
+ var schemaorg_default = { "@context": {
766
756
  "type": "@type",
767
757
  "id": "@id",
768
758
  "HTML": { "@id": "rdf:HTML" },
@@ -4064,12 +4054,10 @@ var __context$5 = {
4064
4054
  "yearlyRevenue": { "@id": "schema:yearlyRevenue" },
4065
4055
  "yearsInOperation": { "@id": "schema:yearsInOperation" },
4066
4056
  "yield": { "@id": "schema:yield" }
4067
- };
4068
- var schemaorg_default = { "@context": __context$5 };
4069
-
4057
+ } };
4070
4058
  //#endregion
4071
4059
  //#region src/contexts/security-data-integrity-v1.json
4072
- var __context$4 = {
4060
+ var security_data_integrity_v1_default = { "@context": {
4073
4061
  "id": "@id",
4074
4062
  "type": "@type",
4075
4063
  "@protected": true,
@@ -4144,12 +4132,10 @@ var __context$4 = {
4144
4132
  }
4145
4133
  }
4146
4134
  }
4147
- };
4148
- var security_data_integrity_v1_default = { "@context": __context$4 };
4149
-
4135
+ } };
4150
4136
  //#endregion
4151
4137
  //#region src/contexts/security-data-integrity-v2.json
4152
- var __context$3 = {
4138
+ var security_data_integrity_v2_default = { "@context": {
4153
4139
  "id": "@id",
4154
4140
  "type": "@type",
4155
4141
  "@protected": true,
@@ -4227,12 +4213,10 @@ var __context$3 = {
4227
4213
  }
4228
4214
  }
4229
4215
  }
4230
- };
4231
- var security_data_integrity_v2_default = { "@context": __context$3 };
4232
-
4216
+ } };
4233
4217
  //#endregion
4234
4218
  //#region src/contexts/security-multikey-v1.json
4235
- var __context$2 = {
4219
+ var security_multikey_v1_default = { "@context": {
4236
4220
  "id": "@id",
4237
4221
  "type": "@type",
4238
4222
  "@protected": true,
@@ -4264,12 +4248,10 @@ var __context$2 = {
4264
4248
  }
4265
4249
  }
4266
4250
  }
4267
- };
4268
- var security_multikey_v1_default = { "@context": __context$2 };
4269
-
4251
+ } };
4270
4252
  //#endregion
4271
4253
  //#region src/contexts/security-v1.json
4272
- var __context$1 = {
4254
+ var security_v1_default = { "@context": {
4273
4255
  "id": "@id",
4274
4256
  "type": "@type",
4275
4257
  "dc": "http://purl.org/dc/terms/",
@@ -4340,21 +4322,17 @@ var __context$1 = {
4340
4322
  "signature": "sec:signature",
4341
4323
  "signatureAlgorithm": "sec:signingAlgorithm",
4342
4324
  "signatureValue": "sec:signatureValue"
4343
- };
4344
- var security_v1_default = { "@context": __context$1 };
4345
-
4325
+ } };
4346
4326
  //#endregion
4347
4327
  //#region src/contexts/webfinger.json
4348
- var __context = {
4328
+ var webfinger_default = { "@context": {
4349
4329
  "wf": "https://purl.archive.org/socialweb/webfinger#",
4350
4330
  "xsd": "http://www.w3.org/2001/XMLSchema#",
4351
4331
  "webfinger": {
4352
4332
  "@id": "wf:webfinger",
4353
4333
  "@type": "xsd:string"
4354
4334
  }
4355
- };
4356
- var webfinger_default = { "@context": __context };
4357
-
4335
+ } };
4358
4336
  //#endregion
4359
4337
  //#region src/contexts.ts
4360
4338
  const preloadedContexts = {
@@ -4371,50 +4349,10 @@ const preloadedContexts = {
4371
4349
  "https://w3id.org/fep/5711": fep_5711_default,
4372
4350
  "http://joinmastodon.org/ns": joinmastodon_default
4373
4351
  };
4374
- var contexts_default = preloadedContexts;
4375
-
4376
4352
  //#endregion
4377
4353
  //#region deno.json
4378
4354
  var name = "@fedify/vocab-runtime";
4379
- var version = "2.1.0";
4380
- var license = "MIT";
4381
- var exports$1 = {
4382
- ".": "./src/mod.ts",
4383
- "./jsonld": "./src/jsonld.ts"
4384
- };
4385
- var description = "Runtime library for @fedify/vocab";
4386
- var author = {
4387
- "name": "Hong Minhee",
4388
- "email": "hong@minhee.org",
4389
- "url": "https://hongminhee.org/"
4390
- };
4391
- var imports = {
4392
- "@multiformats/base-x": "npm:@multiformats/base-x@^4.0.1",
4393
- "asn1js": "npm:asn1js@^3.0.6",
4394
- "byte-encodings": "npm:byte-encodings@^1.0.11",
4395
- "fetch-mock": "npm:fetch-mock@^12.5.4",
4396
- "jsonld": "npm:jsonld@^9.0.0",
4397
- "pkijs": "npm:pkijs@^3.2.5"
4398
- };
4399
- var exclude = ["dist", "node_modules"];
4400
- var publish = { "exclude": ["**/*.test.ts", "tsdown.config.ts"] };
4401
- var tasks = {
4402
- "check": "deno fmt --check && deno lint && deno check src/*.ts",
4403
- "test": "deno test"
4404
- };
4405
- var deno_default = {
4406
- name,
4407
- version,
4408
- license,
4409
- exports: exports$1,
4410
- description,
4411
- author,
4412
- imports,
4413
- exclude,
4414
- publish,
4415
- tasks
4416
- };
4417
-
4355
+ var version = "2.1.2";
4418
4356
  //#endregion
4419
4357
  //#region src/link.ts
4420
4358
  const parametersNeedLowerCase = ["rel", "type"];
@@ -4596,7 +4534,6 @@ var HttpHeaderLink = class HttpHeaderLink {
4596
4534
  return new this(...inputs).toString();
4597
4535
  }
4598
4536
  };
4599
-
4600
4537
  //#endregion
4601
4538
  //#region src/request.ts
4602
4539
  /**
@@ -4648,27 +4585,25 @@ function createActivityPubRequest(url, options = {}) {
4648
4585
  * @since 1.3.0
4649
4586
  */
4650
4587
  function getUserAgent({ software, url } = {}) {
4651
- const fedify = `Fedify/${deno_default.version}`;
4588
+ const fedify = `Fedify/${version}`;
4652
4589
  const runtime = globalThis.Deno?.version?.deno != null ? `Deno/${Deno.version.deno}` : globalThis.process?.versions?.bun != null ? `Bun/${node_process.default.versions.bun}` : "navigator" in globalThis && navigator.userAgent === "Cloudflare-Workers" ? navigator.userAgent : globalThis.process?.versions?.node != null ? `Node.js/${node_process.default.versions.node}` : null;
4653
4590
  const userAgent = software == null ? [fedify] : [software, fedify];
4654
4591
  if (runtime != null) userAgent.push(runtime);
4655
4592
  if (url != null) userAgent.push(`+${url.toString()}`);
4656
- const first = userAgent.shift();
4657
- return `${first} (${userAgent.join("; ")})`;
4593
+ return `${userAgent.shift()} (${userAgent.join("; ")})`;
4658
4594
  }
4659
4595
  /**
4660
4596
  * Logs the request.
4661
4597
  * @param request The request to log.
4662
4598
  * @internal
4663
4599
  */
4664
- function logRequest(logger$1, request) {
4665
- logger$1.debug("Fetching document: {method} {url} {headers}", {
4600
+ function logRequest(logger, request) {
4601
+ logger.debug("Fetching document: {method} {url} {headers}", {
4666
4602
  method: request.method,
4667
4603
  url: request.url,
4668
4604
  headers: Object.fromEntries(request.headers.entries())
4669
4605
  });
4670
4606
  }
4671
-
4672
4607
  //#endregion
4673
4608
  //#region src/url.ts
4674
4609
  var UrlError = class extends Error {
@@ -4687,8 +4622,7 @@ async function validatePublicUrl(url) {
4687
4622
  if (hostname.startsWith("[") && hostname.endsWith("]")) hostname = hostname.substring(1, hostname.length - 2);
4688
4623
  if (hostname === "localhost") throw new UrlError("Localhost is not allowed");
4689
4624
  if ("Deno" in globalThis && !(0, node_net.isIP)(hostname)) {
4690
- const netPermission = await Deno.permissions.query({ name: "net" });
4691
- if (netPermission.state !== "granted") return;
4625
+ if ((await Deno.permissions.query({ name: "net" })).state !== "granted") return;
4692
4626
  }
4693
4627
  if ("Bun" in globalThis) {
4694
4628
  if (hostname === "example.com" || hostname.endsWith(".example.com")) return;
@@ -4724,17 +4658,16 @@ function expandIPv6Address(address) {
4724
4658
  if (address.startsWith("::")) address = "0000" + address;
4725
4659
  if (address.endsWith("::")) address = address + "0000";
4726
4660
  address = address.replace("::", ":0000".repeat(8 - (address.match(/:/g) || []).length) + ":");
4727
- const parts = address.split(":");
4728
- return parts.map((part) => part.padStart(4, "0")).join(":");
4661
+ return address.split(":").map((part) => part.padStart(4, "0")).join(":");
4729
4662
  }
4730
-
4731
4663
  //#endregion
4732
4664
  //#region src/docloader.ts
4733
- const logger = (0, __logtape_logtape.getLogger)([
4665
+ const logger = (0, _logtape_logtape.getLogger)([
4734
4666
  "fedify",
4735
4667
  "runtime",
4736
4668
  "docloader"
4737
4669
  ]);
4670
+ const DEFAULT_MAX_REDIRECTION = 20;
4738
4671
  /**
4739
4672
  * Gets a {@link RemoteDocument} from the given response.
4740
4673
  * @param url The URL of the document to load.
@@ -4744,7 +4677,7 @@ const logger = (0, __logtape_logtape.getLogger)([
4744
4677
  * @throws {FetchError} If the response is not OK.
4745
4678
  * @internal
4746
4679
  */
4747
- async function getRemoteDocument(url, response, fetch$1) {
4680
+ async function getRemoteDocument(url, response, fetch) {
4748
4681
  const documentUrl = response.url === "" ? url : response.url;
4749
4682
  const docUrl = new URL(documentUrl);
4750
4683
  if (!response.ok) {
@@ -4782,7 +4715,7 @@ async function getRemoteDocument(url, response, fetch$1) {
4782
4715
  alternateUrl: altUri.href,
4783
4716
  url: documentUrl
4784
4717
  });
4785
- return await fetch$1(altUri.href);
4718
+ return await fetch(altUri.href);
4786
4719
  }
4787
4720
  }
4788
4721
  }
@@ -4808,15 +4741,14 @@ async function getRemoteDocument(url, response, fetch$1) {
4808
4741
  attrPattern.lastIndex = 0;
4809
4742
  while ((attrMatch = attrPattern.exec(tagContent)) !== null) {
4810
4743
  const key = attrMatch[1].toLowerCase();
4811
- const value = attrMatch[2] ?? attrMatch[3] ?? attrMatch[4] ?? "";
4812
- attribs[key] = value;
4744
+ attribs[key] = attrMatch[2] ?? attrMatch[3] ?? attrMatch[4] ?? "";
4813
4745
  }
4814
4746
  if (attribs.rel === "alternate" && "type" in attribs && (attribs.type === "application/activity+json" || attribs.type === "application/ld+json" || attribs.type.startsWith("application/ld+json;")) && "href" in attribs && new URL(attribs.href, docUrl).href !== docUrl.href) {
4815
4747
  logger.debug("Found alternate document: {alternateUrl} from {url}", {
4816
4748
  alternateUrl: attribs.href,
4817
4749
  url: documentUrl
4818
4750
  });
4819
- return await fetch$1(new URL(attribs.href, docUrl).href);
4751
+ return await fetch(new URL(attribs.href, docUrl).href);
4820
4752
  }
4821
4753
  }
4822
4754
  document = JSON.parse(html);
@@ -4851,33 +4783,34 @@ async function getRemoteDocument(url, response, fetch$1) {
4851
4783
  * @since 1.3.0
4852
4784
  */
4853
4785
  function getDocumentLoader({ allowPrivateAddress, skipPreloadedContexts, userAgent } = {}) {
4854
- const tracerProvider = __opentelemetry_api.trace.getTracerProvider();
4855
- const tracer = tracerProvider.getTracer(deno_default.name, deno_default.version);
4856
- async function load(url, options) {
4786
+ const tracer = _opentelemetry_api.trace.getTracerProvider().getTracer(name, version);
4787
+ async function load(url, options, redirected = 0, visited = /* @__PURE__ */ new Set()) {
4857
4788
  options?.signal?.throwIfAborted();
4858
- if (!skipPreloadedContexts && url in contexts_default) {
4859
- logger.debug("Using preloaded context: {url}.", { url });
4789
+ const currentUrl = new URL(url).href;
4790
+ if (!skipPreloadedContexts && currentUrl in preloadedContexts) {
4791
+ logger.debug("Using preloaded context: {url}.", { url: currentUrl });
4860
4792
  return {
4861
4793
  contextUrl: null,
4862
- document: contexts_default[url],
4863
- documentUrl: url
4794
+ document: preloadedContexts[currentUrl],
4795
+ documentUrl: currentUrl
4864
4796
  };
4865
4797
  }
4866
4798
  if (!allowPrivateAddress) try {
4867
- await validatePublicUrl(url);
4799
+ await validatePublicUrl(currentUrl);
4868
4800
  } catch (error) {
4869
4801
  if (error instanceof UrlError) logger.error("Disallowed private URL: {url}", {
4870
- url,
4802
+ url: currentUrl,
4871
4803
  error
4872
4804
  });
4873
4805
  throw error;
4874
4806
  }
4807
+ visited.add(currentUrl);
4875
4808
  return await tracer.startActiveSpan("activitypub.fetch_document", {
4876
- kind: __opentelemetry_api.SpanKind.CLIENT,
4877
- attributes: { "url.full": url }
4809
+ kind: _opentelemetry_api.SpanKind.CLIENT,
4810
+ attributes: { "url.full": currentUrl }
4878
4811
  }, async (span) => {
4879
4812
  try {
4880
- const request = createActivityPubRequest(url, { userAgent });
4813
+ const request = createActivityPubRequest(currentUrl, { userAgent });
4881
4814
  logRequest(logger, request);
4882
4815
  const response = await fetch(request, {
4883
4816
  redirect: "manual",
@@ -4885,18 +4818,32 @@ function getDocumentLoader({ allowPrivateAddress, skipPreloadedContexts, userAge
4885
4818
  });
4886
4819
  span.setAttribute("http.response.status_code", response.status);
4887
4820
  if (response.status >= 300 && response.status < 400 && response.headers.has("Location")) {
4888
- const redirectUrl = response.headers.get("Location");
4821
+ if (redirected >= DEFAULT_MAX_REDIRECTION) {
4822
+ logger.error("Too many redirections ({redirections}) while fetching document.", {
4823
+ redirections: redirected + 1,
4824
+ url: currentUrl
4825
+ });
4826
+ throw new FetchError(currentUrl, `Too many redirections (${redirected + 1})`);
4827
+ }
4828
+ const redirectUrl = new URL(response.headers.get("Location"), response.url === "" ? currentUrl : response.url).href;
4889
4829
  span.setAttribute("http.redirect.url", redirectUrl);
4890
- return await load(redirectUrl, options);
4830
+ if (visited.has(redirectUrl)) {
4831
+ logger.error("Detected a redirect loop while fetching document: {url} -> {redirectUrl}", {
4832
+ url: currentUrl,
4833
+ redirectUrl
4834
+ });
4835
+ throw new FetchError(currentUrl, `Redirect loop detected: ${redirectUrl}`);
4836
+ }
4837
+ return await load(redirectUrl, options, redirected + 1, visited);
4891
4838
  }
4892
- const result = await getRemoteDocument(url, response, load);
4839
+ const result = await getRemoteDocument(currentUrl, response, load);
4893
4840
  span.setAttribute("docloader.document_url", result.documentUrl);
4894
4841
  if (result.contextUrl != null) span.setAttribute("docloader.context_url", result.contextUrl);
4895
4842
  return result;
4896
4843
  } catch (error) {
4897
4844
  span.recordException(error);
4898
4845
  span.setStatus({
4899
- code: __opentelemetry_api.SpanStatusCode.ERROR,
4846
+ code: _opentelemetry_api.SpanStatusCode.ERROR,
4900
4847
  message: String(error)
4901
4848
  });
4902
4849
  throw error;
@@ -4907,7 +4854,6 @@ function getDocumentLoader({ allowPrivateAddress, skipPreloadedContexts, userAge
4907
4854
  }
4908
4855
  return load;
4909
4856
  }
4910
-
4911
4857
  //#endregion
4912
4858
  //#region src/internal/multicodec.ts
4913
4859
  const INVALID_MULTICODEC_PREFIX = "Invalid multicodec prefix.";
@@ -4947,7 +4893,6 @@ function addMulticodecPrefix(code, payload) {
4947
4893
  prefixed.set(payload, prefix.length);
4948
4894
  return prefixed;
4949
4895
  }
4950
-
4951
4896
  //#endregion
4952
4897
  //#region src/jwk.ts
4953
4898
  function validateCryptoKey(key, type) {
@@ -4955,11 +4900,9 @@ function validateCryptoKey(key, type) {
4955
4900
  if (!key.extractable) throw new TypeError("The key is not extractable.");
4956
4901
  if (key.algorithm.name !== "RSASSA-PKCS1-v1_5" && key.algorithm.name !== "Ed25519") throw new TypeError("Currently only RSASSA-PKCS1-v1_5 and Ed25519 keys are supported. More algorithms will be added in the future!");
4957
4902
  if (key.algorithm.name === "RSASSA-PKCS1-v1_5") {
4958
- const algorithm = key.algorithm;
4959
- if (algorithm.hash.name !== "SHA-256") throw new TypeError("For compatibility with the existing Fediverse software (e.g., Mastodon), hash algorithm for RSASSA-PKCS1-v1_5 keys must be SHA-256.");
4903
+ if (key.algorithm.hash.name !== "SHA-256") throw new TypeError("For compatibility with the existing Fediverse software (e.g., Mastodon), hash algorithm for RSASSA-PKCS1-v1_5 keys must be SHA-256.");
4960
4904
  }
4961
4905
  }
4962
-
4963
4906
  //#endregion
4964
4907
  //#region src/multibase/util.ts
4965
4908
  const textDecoder = new TextDecoder();
@@ -4975,7 +4918,6 @@ function concat(arrs, length) {
4975
4918
  }
4976
4919
  return output;
4977
4920
  }
4978
-
4979
4921
  //#endregion
4980
4922
  //#region src/multibase/base.ts
4981
4923
  /**
@@ -4984,8 +4926,8 @@ function concat(arrs, length) {
4984
4926
  var Base = class {
4985
4927
  codeBuf;
4986
4928
  codec;
4987
- constructor(name$1, code, factory, alphabet) {
4988
- this.name = name$1;
4929
+ constructor(name, code, factory, alphabet) {
4930
+ this.name = name;
4989
4931
  this.code = code;
4990
4932
  this.alphabet = alphabet;
4991
4933
  this.codeBuf = encodeText(this.code);
@@ -5000,12 +4942,11 @@ var Base = class {
5000
4942
  return this.codec.decode(string);
5001
4943
  }
5002
4944
  };
5003
-
5004
4945
  //#endregion
5005
4946
  //#region src/multibase/rfc4648.ts
5006
4947
  const decode = (string, alphabet, bitsPerChar) => {
5007
- const codes$1 = {};
5008
- for (let i = 0; i < alphabet.length; ++i) codes$1[alphabet[i]] = i;
4948
+ const codes = {};
4949
+ for (let i = 0; i < alphabet.length; ++i) codes[alphabet[i]] = i;
5009
4950
  let end = string.length;
5010
4951
  while (string[end - 1] === "=") --end;
5011
4952
  const out = new Uint8Array(end * bitsPerChar / 8 | 0);
@@ -5013,7 +4954,7 @@ const decode = (string, alphabet, bitsPerChar) => {
5013
4954
  let buffer = 0;
5014
4955
  let written = 0;
5015
4956
  for (let i = 0; i < end; ++i) {
5016
- const value = codes$1[string[i]];
4957
+ const value = codes[string[i]];
5017
4958
  if (value === void 0) throw new SyntaxError("Invalid character " + string[i]);
5018
4959
  buffer = buffer << bitsPerChar | value;
5019
4960
  bits += bitsPerChar;
@@ -5056,7 +4997,6 @@ const rfc4648 = (bitsPerChar) => (alphabet) => {
5056
4997
  }
5057
4998
  };
5058
4999
  };
5059
-
5060
5000
  //#endregion
5061
5001
  //#region src/multibase/constants.ts
5062
5002
  const identity = () => {
@@ -5092,7 +5032,7 @@ const constants = [
5092
5032
  [
5093
5033
  "base10",
5094
5034
  "9",
5095
- __multiformats_base_x.default,
5035
+ _multiformats_base_x.default,
5096
5036
  "0123456789"
5097
5037
  ],
5098
5038
  [
@@ -5164,25 +5104,25 @@ const constants = [
5164
5104
  [
5165
5105
  "base36",
5166
5106
  "k",
5167
- __multiformats_base_x.default,
5107
+ _multiformats_base_x.default,
5168
5108
  "0123456789abcdefghijklmnopqrstuvwxyz"
5169
5109
  ],
5170
5110
  [
5171
5111
  "base36upper",
5172
5112
  "K",
5173
- __multiformats_base_x.default,
5113
+ _multiformats_base_x.default,
5174
5114
  "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ"
5175
5115
  ],
5176
5116
  [
5177
5117
  "base58btc",
5178
5118
  "z",
5179
- __multiformats_base_x.default,
5119
+ _multiformats_base_x.default,
5180
5120
  "123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz"
5181
5121
  ],
5182
5122
  [
5183
5123
  "base58flickr",
5184
5124
  "Z",
5185
- __multiformats_base_x.default,
5125
+ _multiformats_base_x.default,
5186
5126
  "123456789abcdefghijkmnopqrstuvwxyzABCDEFGHJKLMNPQRSTUVWXYZ"
5187
5127
  ],
5188
5128
  [
@@ -5218,7 +5158,6 @@ const codes = constants.reduce((prev, tupple) => {
5218
5158
  prev[tupple[1]] = names[tupple[0]];
5219
5159
  return prev;
5220
5160
  }, {});
5221
-
5222
5161
  //#endregion
5223
5162
  //#region src/multibase/mod.ts
5224
5163
  /**
@@ -5255,8 +5194,7 @@ function decodeMultibase(data) {
5255
5194
  "k",
5256
5195
  "K"
5257
5196
  ].includes(prefix)) data = data.toLowerCase();
5258
- const enc = encoding(data[0]);
5259
- return enc.decode(data.substring(1));
5197
+ return encoding(data[0]).decode(data.substring(1));
5260
5198
  }
5261
5199
  /**
5262
5200
  * Get the encoding by name or code
@@ -5278,7 +5216,6 @@ function encodingFromBaseData(data) {
5278
5216
  if (data instanceof Uint8Array) data = decodeText(data);
5279
5217
  return encoding(data[0]);
5280
5218
  }
5281
-
5282
5219
  //#endregion
5283
5220
  //#region src/key.ts
5284
5221
  const algorithms = {
@@ -5303,8 +5240,7 @@ async function importSpki(pem) {
5303
5240
  } catch (_) {
5304
5241
  throw new TypeError("Invalid PEM-SPKI format.");
5305
5242
  }
5306
- const pki = pkijs.PublicKeyInfo.fromBER(spki);
5307
- const oid = pki.algorithm.algorithmId;
5243
+ const oid = pkijs.PublicKeyInfo.fromBER(spki).algorithm.algorithmId;
5308
5244
  const algorithm = algorithms[oid];
5309
5245
  if (algorithm == null) throw new TypeError("Unsupported algorithm: " + oid);
5310
5246
  return await crypto.subtle.importKey("spki", spki, algorithm, true, ["verify"]);
@@ -5318,8 +5254,7 @@ async function importSpki(pem) {
5318
5254
  */
5319
5255
  async function exportSpki(key) {
5320
5256
  validateCryptoKey(key);
5321
- const spki = await crypto.subtle.exportKey("spki", key);
5322
- let pem = (0, byte_encodings_base64.encodeBase64)(spki);
5257
+ let pem = (0, byte_encodings_base64.encodeBase64)(await crypto.subtle.exportKey("spki", key));
5323
5258
  pem = (pem.match(/.{1,64}/g) || []).join("\n");
5324
5259
  return `-----BEGIN PUBLIC KEY-----\n${pem}\n-----END PUBLIC KEY-----\n`;
5325
5260
  }
@@ -5331,16 +5266,14 @@ async function exportSpki(key) {
5331
5266
  * @since 1.5.0
5332
5267
  */
5333
5268
  function importPkcs1(pem) {
5334
- const key = (0, node_crypto.createPublicKey)({
5269
+ return importSpki((0, node_crypto.createPublicKey)({
5335
5270
  key: pem,
5336
5271
  format: "pem",
5337
5272
  type: "pkcs1"
5338
- });
5339
- const spki = key.export({
5273
+ }).export({
5340
5274
  type: "spki",
5341
5275
  format: "pem"
5342
- });
5343
- return importSpki(spki);
5276
+ }));
5344
5277
  }
5345
5278
  const PKCS1_HEADER = /^\s*-----BEGIN\s+RSA\s+PUBLIC\s+KEY-----\s*\n/;
5346
5279
  /**
@@ -5367,12 +5300,11 @@ async function importMultibaseKey(key) {
5367
5300
  const { code } = getMulticodecPrefix(decoded);
5368
5301
  const content = removeMulticodecPrefix(decoded);
5369
5302
  if (code === 4613) {
5370
- const keyObject = (0, node_crypto.createPublicKey)({
5303
+ const exported = (0, node_crypto.createPublicKey)({
5371
5304
  key: content,
5372
5305
  format: "der",
5373
5306
  type: "pkcs1"
5374
- });
5375
- const exported = keyObject.export({
5307
+ }).export({
5376
5308
  type: "spki",
5377
5309
  format: "der"
5378
5310
  });
@@ -5404,21 +5336,18 @@ async function exportMultibaseKey(key) {
5404
5336
  const decodedN = (0, byte_encodings_base64url.decodeBase64Url)(jwk.n);
5405
5337
  const n = new Uint8Array(decodedN.length + 1);
5406
5338
  n.set(decodedN, 1);
5407
- const sequence = new asn1js.Sequence({ value: [new asn1js.Integer({
5339
+ content = new asn1js.Sequence({ value: [new asn1js.Integer({
5408
5340
  isHexOnly: true,
5409
5341
  valueHex: n
5410
5342
  }), new asn1js.Integer({
5411
5343
  isHexOnly: true,
5412
5344
  valueHex: (0, byte_encodings_base64url.decodeBase64Url)(jwk.e)
5413
- })] });
5414
- content = sequence.toBER(false);
5345
+ })] }).toBER(false);
5415
5346
  code = 4613;
5416
5347
  } else throw new TypeError("Unsupported key type: " + JSON.stringify(key.algorithm));
5417
- const prefixed = addMulticodecPrefix(code, new Uint8Array(content));
5418
- const encoded = encodeMultibase("base58btc", prefixed);
5348
+ const encoded = encodeMultibase("base58btc", addMulticodecPrefix(code, new Uint8Array(content)));
5419
5349
  return new TextDecoder().decode(encoded);
5420
5350
  }
5421
-
5422
5351
  //#endregion
5423
5352
  //#region src/decimal.ts
5424
5353
  const DECIMAL_PATTERN = /^(\+|-)?([0-9]+(\.[0-9]*)?|\.[0-9]+)$/;
@@ -5494,7 +5423,6 @@ function parseDecimal(value) {
5494
5423
  if (!isDecimal(normalized)) throw new TypeError(`${JSON.stringify(value)} is not a valid xsd:decimal lexical form.`);
5495
5424
  return normalized;
5496
5425
  }
5497
-
5498
5426
  //#endregion
5499
5427
  //#region src/langstr.ts
5500
5428
  /**
@@ -5523,7 +5451,6 @@ LanguageString.prototype[Symbol.for("Deno.customInspect")] = function(inspect, o
5523
5451
  LanguageString.prototype[Symbol.for("nodejs.util.inspect.custom")] = function(_depth, options, inspect) {
5524
5452
  return `<${this.locale.baseName}> ${inspect(this.toString(), options)}`;
5525
5453
  };
5526
-
5527
5454
  //#endregion
5528
5455
  exports.FetchError = FetchError;
5529
5456
  exports.LanguageString = LanguageString;
@@ -5548,5 +5475,5 @@ exports.isValidPublicIPv4Address = isValidPublicIPv4Address;
5548
5475
  exports.isValidPublicIPv6Address = isValidPublicIPv6Address;
5549
5476
  exports.logRequest = logRequest;
5550
5477
  exports.parseDecimal = parseDecimal;
5551
- exports.preloadedContexts = contexts_default;
5552
- exports.validatePublicUrl = validatePublicUrl;
5478
+ exports.preloadedContexts = preloadedContexts;
5479
+ exports.validatePublicUrl = validatePublicUrl;