@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.
- package/deno.json +1 -1
- package/dist/{chunk-CUT6urMc.cjs → chunk-CKQMccvm.cjs} +7 -9
- package/dist/jsonld.cjs +4 -5
- package/dist/jsonld.d.cts +3 -4
- package/dist/jsonld.d.ts +2 -2
- package/dist/jsonld.js +1 -3
- package/dist/mod.cjs +107 -180
- package/dist/mod.d.cts +1 -2
- package/dist/mod.d.ts +1 -2
- package/dist/mod.js +83 -159
- package/dist/tests/{chunk-DWy1uDak.cjs → chunk-Do9eywBl.cjs} +13 -17
- package/dist/tests/decimal.test.cjs +12 -21
- package/dist/tests/{decimal.test.js → decimal.test.mjs} +10 -18
- package/dist/tests/{docloader-D3nu2LmR.cjs → docloader-0Yz9aPvU.cjs} +78 -91
- package/dist/tests/{docloader-U31begIa.js → docloader-DiLx08rm.mjs} +62 -75
- package/dist/tests/docloader.test.cjs +98 -88
- package/dist/tests/{docloader.test.js → docloader.test.mjs} +98 -94
- package/dist/tests/internal/multicodec.test.cjs +5 -7
- package/dist/tests/internal/{multicodec.test.js → multicodec.test.mjs} +3 -4
- package/dist/tests/{key-ByCmSI2y.js → key-BeTHFQJK.mjs} +14 -25
- package/dist/tests/{key-CCPn6TEY.cjs → key-DTTIntwb.cjs} +60 -71
- package/dist/tests/key.test.cjs +23 -45
- package/dist/tests/{key.test.js → key.test.mjs} +21 -42
- package/dist/tests/{langstr-EPh86hXK.cjs → langstr-CbAxaeEZ.cjs} +6 -8
- package/dist/tests/{langstr-BsVE3s9u.js → langstr-Di5AvKpB.mjs} +1 -2
- package/dist/tests/langstr.test.cjs +7 -8
- package/dist/tests/{langstr.test.js → langstr.test.mjs} +3 -4
- package/dist/tests/{link-DYNFAdNu.cjs → link-FguCydMA.cjs} +6 -8
- package/dist/tests/{link-C3q2TC2G.js → link-NUUWCdnK.mjs} +1 -2
- package/dist/tests/link.test.cjs +5 -7
- package/dist/tests/{link.test.js → link.test.mjs} +3 -4
- package/dist/tests/multibase/multibase.test.cjs +10 -17
- package/dist/tests/multibase/{multibase.test.js → multibase.test.mjs} +10 -18
- package/dist/tests/{multibase-B4g8pz6F.js → multibase-BgU9XRf7.mjs} +5 -12
- package/dist/tests/{multibase-o_ovPHYJ.cjs → multibase-F7LtMMsK.cjs} +43 -49
- package/dist/tests/{multicodec--6hQ74zI.cjs → multicodec-CxGVGa91.cjs} +16 -18
- package/dist/tests/{multicodec-Dq3IiOV4.js → multicodec-CyFp54fI.mjs} +1 -2
- package/dist/tests/{request-DyrEDYQ-.cjs → request-B4BOehn0.cjs} +38 -72
- package/dist/tests/{request-BH_NlxCL.js → request-Nob25QBF.mjs} +4 -45
- package/dist/tests/request.test.cjs +23 -24
- package/dist/tests/request.test.mjs +42 -0
- package/dist/tests/{url-CWEP9Zs9.js → url-BQ_kgmCk.mjs} +3 -7
- package/dist/tests/{url-DIjOdK8Q.cjs → url-pFuSds44.cjs} +31 -35
- package/dist/tests/url.test.cjs +5 -7
- package/dist/tests/{url.test.js → url.test.mjs} +3 -4
- package/package.json +3 -3
- package/src/docloader.test.ts +67 -0
- package/src/docloader.ts +43 -11
- package/dist/tests/request.test.js +0 -43
- /package/dist/tests/{decimal.test.d.ts → decimal.test.d.mts} +0 -0
- /package/dist/tests/{docloader.test.d.ts → docloader.test.d.mts} +0 -0
- /package/dist/tests/internal/{multicodec.test.d.ts → multicodec.test.d.mts} +0 -0
- /package/dist/tests/{key.test.d.ts → key.test.d.mts} +0 -0
- /package/dist/tests/{langstr.test.d.ts → langstr.test.d.mts} +0 -0
- /package/dist/tests/{link.test.d.ts → link.test.d.mts} +0 -0
- /package/dist/tests/multibase/{multibase.test.d.ts → multibase.test.d.mts} +0 -0
- /package/dist/tests/{request.test.d.ts → request.test.d.mts} +0 -0
- /package/dist/tests/{url.test.d.ts → url.test.d.mts} +0 -0
package/dist/mod.cjs
CHANGED
|
@@ -1,18 +1,20 @@
|
|
|
1
|
-
|
|
2
|
-
const
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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.
|
|
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/${
|
|
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
|
-
|
|
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
|
|
4665
|
-
logger
|
|
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
|
-
|
|
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
|
-
|
|
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,
|
|
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
|
|
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
|
|
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
|
-
|
|
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
|
|
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
|
|
4855
|
-
|
|
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
|
-
|
|
4859
|
-
|
|
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:
|
|
4863
|
-
documentUrl:
|
|
4794
|
+
document: preloadedContexts[currentUrl],
|
|
4795
|
+
documentUrl: currentUrl
|
|
4864
4796
|
};
|
|
4865
4797
|
}
|
|
4866
4798
|
if (!allowPrivateAddress) try {
|
|
4867
|
-
await validatePublicUrl(
|
|
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:
|
|
4877
|
-
attributes: { "url.full":
|
|
4809
|
+
kind: _opentelemetry_api.SpanKind.CLIENT,
|
|
4810
|
+
attributes: { "url.full": currentUrl }
|
|
4878
4811
|
}, async (span) => {
|
|
4879
4812
|
try {
|
|
4880
|
-
const request = createActivityPubRequest(
|
|
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
|
-
|
|
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
|
-
|
|
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(
|
|
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:
|
|
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
|
-
|
|
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
|
|
4988
|
-
this.name = name
|
|
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
|
|
5008
|
-
for (let i = 0; i < alphabet.length; ++i) codes
|
|
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
|
|
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
|
-
|
|
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
|
-
|
|
5107
|
+
_multiformats_base_x.default,
|
|
5168
5108
|
"0123456789abcdefghijklmnopqrstuvwxyz"
|
|
5169
5109
|
],
|
|
5170
5110
|
[
|
|
5171
5111
|
"base36upper",
|
|
5172
5112
|
"K",
|
|
5173
|
-
|
|
5113
|
+
_multiformats_base_x.default,
|
|
5174
5114
|
"0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ"
|
|
5175
5115
|
],
|
|
5176
5116
|
[
|
|
5177
5117
|
"base58btc",
|
|
5178
5118
|
"z",
|
|
5179
|
-
|
|
5119
|
+
_multiformats_base_x.default,
|
|
5180
5120
|
"123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz"
|
|
5181
5121
|
],
|
|
5182
5122
|
[
|
|
5183
5123
|
"base58flickr",
|
|
5184
5124
|
"Z",
|
|
5185
|
-
|
|
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
|
-
|
|
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
|
|
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
|
-
|
|
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
|
-
|
|
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
|
|
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
|
-
|
|
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
|
|
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 =
|
|
5552
|
-
exports.validatePublicUrl = validatePublicUrl;
|
|
5478
|
+
exports.preloadedContexts = preloadedContexts;
|
|
5479
|
+
exports.validatePublicUrl = validatePublicUrl;
|