@fedify/vocab-runtime 2.0.7 → 2.0.9
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 +83 -131
- package/dist/mod.d.cts +1 -5
- package/dist/mod.d.ts +1 -5
- package/dist/mod.js +59 -110
- package/dist/tests/{chunk-DWy1uDak.cjs → chunk-Do9eywBl.cjs} +13 -17
- package/dist/tests/docloader.test.cjs +137 -114
- package/dist/tests/{docloader.test.js → docloader.test.mjs} +132 -115
- 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.test.cjs +39 -70
- package/dist/tests/{key.test.js → key.test.mjs} +32 -62
- package/dist/tests/langstr.test.cjs +6 -8
- package/dist/tests/{langstr.test.js → langstr.test.mjs} +2 -4
- package/dist/tests/{link-CdFPEo9O.cjs → link-B6ZWBZhf.cjs} +6 -8
- package/dist/tests/{link-Ck2yj4dH.js → link-B8JGXSS2.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-B2D6B0V4.cjs → multibase-CgYqpk4Z.cjs} +43 -49
- package/dist/tests/{multibase-BdHCGO4H.js → multibase-jcKrOpuU.mjs} +5 -12
- package/dist/tests/{multicodec-mHcRzSGY.cjs → multicodec-DeYop8xg.cjs} +16 -18
- package/dist/tests/{multicodec-DvC5xnX2.js → multicodec-aqbZnrNi.mjs} +1 -2
- package/dist/tests/{request-BZixuWv5.js → request-AitXfW_2.mjs} +4 -45
- package/dist/tests/{request-78UEYyIx.cjs → request-C6iSYeYi.cjs} +38 -72
- package/dist/tests/request.test.cjs +23 -24
- package/dist/tests/request.test.mjs +42 -0
- package/dist/tests/{url-C5Vs9nYh.cjs → url-Cr2K-wzd.cjs} +31 -35
- package/dist/tests/{url-fW_DHbih.js → url-Djghaq0m.mjs} +3 -7
- 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/{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/deno.json
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
//#region
|
|
1
|
+
//#region \0rolldown/runtime.js
|
|
2
2
|
var __create = Object.create;
|
|
3
3
|
var __defProp = Object.defineProperty;
|
|
4
4
|
var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
|
|
@@ -19,12 +19,10 @@ var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__ge
|
|
|
19
19
|
value: mod,
|
|
20
20
|
enumerable: true
|
|
21
21
|
}) : target, mod));
|
|
22
|
-
|
|
23
22
|
//#endregion
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
});
|
|
23
|
+
Object.defineProperty(exports, "__toESM", {
|
|
24
|
+
enumerable: true,
|
|
25
|
+
get: function() {
|
|
26
|
+
return __toESM;
|
|
27
|
+
}
|
|
28
|
+
});
|
package/dist/jsonld.cjs
CHANGED
|
@@ -1,8 +1,7 @@
|
|
|
1
|
-
const require_chunk = require(
|
|
2
|
-
|
|
3
|
-
|
|
1
|
+
const require_chunk = require("./chunk-CKQMccvm.cjs");
|
|
2
|
+
let jsonld_dist_jsonld_esm_js = require("jsonld/dist/jsonld.esm.js");
|
|
3
|
+
jsonld_dist_jsonld_esm_js = require_chunk.__toESM(jsonld_dist_jsonld_esm_js);
|
|
4
4
|
//#region src/jsonld.ts
|
|
5
5
|
var jsonld_default = jsonld_dist_jsonld_esm_js.default;
|
|
6
|
-
|
|
7
6
|
//#endregion
|
|
8
|
-
module.exports = jsonld_default;
|
|
7
|
+
module.exports = jsonld_default;
|
package/dist/jsonld.d.cts
CHANGED
package/dist/jsonld.d.ts
CHANGED
package/dist/jsonld.js
CHANGED
package/dist/mod.cjs
CHANGED
|
@@ -1,16 +1,18 @@
|
|
|
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.ts
|
|
15
17
|
const preloadedContexts = {
|
|
16
18
|
"https://www.w3.org/ns/activitystreams": { "@context": {
|
|
@@ -4258,50 +4260,10 @@ const preloadedContexts = {
|
|
|
4258
4260
|
}
|
|
4259
4261
|
} }
|
|
4260
4262
|
};
|
|
4261
|
-
var contexts_default = preloadedContexts;
|
|
4262
|
-
|
|
4263
4263
|
//#endregion
|
|
4264
4264
|
//#region deno.json
|
|
4265
4265
|
var name = "@fedify/vocab-runtime";
|
|
4266
|
-
var version = "2.0.
|
|
4267
|
-
var license = "MIT";
|
|
4268
|
-
var exports$1 = {
|
|
4269
|
-
".": "./src/mod.ts",
|
|
4270
|
-
"./jsonld": "./src/jsonld.ts"
|
|
4271
|
-
};
|
|
4272
|
-
var description = "Runtime library for @fedify/vocab";
|
|
4273
|
-
var author = {
|
|
4274
|
-
"name": "Hong Minhee",
|
|
4275
|
-
"email": "hong@minhee.org",
|
|
4276
|
-
"url": "https://hongminhee.org/"
|
|
4277
|
-
};
|
|
4278
|
-
var imports = {
|
|
4279
|
-
"@multiformats/base-x": "npm:@multiformats/base-x@^4.0.1",
|
|
4280
|
-
"asn1js": "npm:asn1js@^3.0.6",
|
|
4281
|
-
"byte-encodings": "npm:byte-encodings@^1.0.11",
|
|
4282
|
-
"fetch-mock": "npm:fetch-mock@^12.5.4",
|
|
4283
|
-
"jsonld": "npm:jsonld@^9.0.0",
|
|
4284
|
-
"pkijs": "npm:pkijs@^3.2.5"
|
|
4285
|
-
};
|
|
4286
|
-
var exclude = ["dist", "node_modules"];
|
|
4287
|
-
var publish = { "exclude": ["**/*.test.ts", "tsdown.config.ts"] };
|
|
4288
|
-
var tasks = {
|
|
4289
|
-
"check": "deno fmt --check && deno lint && deno check src/*.ts",
|
|
4290
|
-
"test": "deno test"
|
|
4291
|
-
};
|
|
4292
|
-
var deno_default = {
|
|
4293
|
-
name,
|
|
4294
|
-
version,
|
|
4295
|
-
license,
|
|
4296
|
-
exports: exports$1,
|
|
4297
|
-
description,
|
|
4298
|
-
author,
|
|
4299
|
-
imports,
|
|
4300
|
-
exclude,
|
|
4301
|
-
publish,
|
|
4302
|
-
tasks
|
|
4303
|
-
};
|
|
4304
|
-
|
|
4266
|
+
var version = "2.0.9";
|
|
4305
4267
|
//#endregion
|
|
4306
4268
|
//#region src/link.ts
|
|
4307
4269
|
const parametersNeedLowerCase = ["rel", "type"];
|
|
@@ -4483,7 +4445,6 @@ var HttpHeaderLink = class HttpHeaderLink {
|
|
|
4483
4445
|
return new this(...inputs).toString();
|
|
4484
4446
|
}
|
|
4485
4447
|
};
|
|
4486
|
-
|
|
4487
4448
|
//#endregion
|
|
4488
4449
|
//#region src/request.ts
|
|
4489
4450
|
/**
|
|
@@ -4529,27 +4490,25 @@ function createActivityPubRequest(url, options = {}) {
|
|
|
4529
4490
|
* @since 1.3.0
|
|
4530
4491
|
*/
|
|
4531
4492
|
function getUserAgent({ software, url } = {}) {
|
|
4532
|
-
const fedify = `Fedify/${
|
|
4493
|
+
const fedify = `Fedify/${version}`;
|
|
4533
4494
|
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;
|
|
4534
4495
|
const userAgent = software == null ? [fedify] : [software, fedify];
|
|
4535
4496
|
if (runtime != null) userAgent.push(runtime);
|
|
4536
4497
|
if (url != null) userAgent.push(`+${url.toString()}`);
|
|
4537
|
-
|
|
4538
|
-
return `${first} (${userAgent.join("; ")})`;
|
|
4498
|
+
return `${userAgent.shift()} (${userAgent.join("; ")})`;
|
|
4539
4499
|
}
|
|
4540
4500
|
/**
|
|
4541
4501
|
* Logs the request.
|
|
4542
4502
|
* @param request The request to log.
|
|
4543
4503
|
* @internal
|
|
4544
4504
|
*/
|
|
4545
|
-
function logRequest(logger
|
|
4546
|
-
logger
|
|
4505
|
+
function logRequest(logger, request) {
|
|
4506
|
+
logger.debug("Fetching document: {method} {url} {headers}", {
|
|
4547
4507
|
method: request.method,
|
|
4548
4508
|
url: request.url,
|
|
4549
4509
|
headers: Object.fromEntries(request.headers.entries())
|
|
4550
4510
|
});
|
|
4551
4511
|
}
|
|
4552
|
-
|
|
4553
4512
|
//#endregion
|
|
4554
4513
|
//#region src/url.ts
|
|
4555
4514
|
var UrlError = class extends Error {
|
|
@@ -4568,8 +4527,7 @@ async function validatePublicUrl(url) {
|
|
|
4568
4527
|
if (hostname.startsWith("[") && hostname.endsWith("]")) hostname = hostname.substring(1, hostname.length - 2);
|
|
4569
4528
|
if (hostname === "localhost") throw new UrlError("Localhost is not allowed");
|
|
4570
4529
|
if ("Deno" in globalThis && !(0, node_net.isIP)(hostname)) {
|
|
4571
|
-
|
|
4572
|
-
if (netPermission.state !== "granted") return;
|
|
4530
|
+
if ((await Deno.permissions.query({ name: "net" })).state !== "granted") return;
|
|
4573
4531
|
}
|
|
4574
4532
|
if ("Bun" in globalThis) {
|
|
4575
4533
|
if (hostname === "example.com" || hostname.endsWith(".example.com")) return;
|
|
@@ -4605,17 +4563,16 @@ function expandIPv6Address(address) {
|
|
|
4605
4563
|
if (address.startsWith("::")) address = "0000" + address;
|
|
4606
4564
|
if (address.endsWith("::")) address = address + "0000";
|
|
4607
4565
|
address = address.replace("::", ":0000".repeat(8 - (address.match(/:/g) || []).length) + ":");
|
|
4608
|
-
|
|
4609
|
-
return parts.map((part) => part.padStart(4, "0")).join(":");
|
|
4566
|
+
return address.split(":").map((part) => part.padStart(4, "0")).join(":");
|
|
4610
4567
|
}
|
|
4611
|
-
|
|
4612
4568
|
//#endregion
|
|
4613
4569
|
//#region src/docloader.ts
|
|
4614
|
-
const logger = (0,
|
|
4570
|
+
const logger = (0, _logtape_logtape.getLogger)([
|
|
4615
4571
|
"fedify",
|
|
4616
4572
|
"runtime",
|
|
4617
4573
|
"docloader"
|
|
4618
4574
|
]);
|
|
4575
|
+
const DEFAULT_MAX_REDIRECTION = 20;
|
|
4619
4576
|
/**
|
|
4620
4577
|
* Gets a {@link RemoteDocument} from the given response.
|
|
4621
4578
|
* @param url The URL of the document to load.
|
|
@@ -4625,7 +4582,7 @@ const logger = (0, __logtape_logtape.getLogger)([
|
|
|
4625
4582
|
* @throws {FetchError} If the response is not OK.
|
|
4626
4583
|
* @internal
|
|
4627
4584
|
*/
|
|
4628
|
-
async function getRemoteDocument(url, response, fetch
|
|
4585
|
+
async function getRemoteDocument(url, response, fetch) {
|
|
4629
4586
|
const documentUrl = response.url === "" ? url : response.url;
|
|
4630
4587
|
const docUrl = new URL(documentUrl);
|
|
4631
4588
|
if (!response.ok) {
|
|
@@ -4663,7 +4620,7 @@ async function getRemoteDocument(url, response, fetch$1) {
|
|
|
4663
4620
|
alternateUrl: altUri.href,
|
|
4664
4621
|
url: documentUrl
|
|
4665
4622
|
});
|
|
4666
|
-
return await fetch
|
|
4623
|
+
return await fetch(altUri.href);
|
|
4667
4624
|
}
|
|
4668
4625
|
}
|
|
4669
4626
|
}
|
|
@@ -4689,15 +4646,14 @@ async function getRemoteDocument(url, response, fetch$1) {
|
|
|
4689
4646
|
attrPattern.lastIndex = 0;
|
|
4690
4647
|
while ((attrMatch = attrPattern.exec(tagContent)) !== null) {
|
|
4691
4648
|
const key = attrMatch[1].toLowerCase();
|
|
4692
|
-
|
|
4693
|
-
attribs[key] = value;
|
|
4649
|
+
attribs[key] = attrMatch[2] ?? attrMatch[3] ?? attrMatch[4] ?? "";
|
|
4694
4650
|
}
|
|
4695
4651
|
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) {
|
|
4696
4652
|
logger.debug("Found alternate document: {alternateUrl} from {url}", {
|
|
4697
4653
|
alternateUrl: attribs.href,
|
|
4698
4654
|
url: documentUrl
|
|
4699
4655
|
});
|
|
4700
|
-
return await fetch
|
|
4656
|
+
return await fetch(new URL(attribs.href, docUrl).href);
|
|
4701
4657
|
}
|
|
4702
4658
|
}
|
|
4703
4659
|
document = JSON.parse(html);
|
|
@@ -4732,33 +4688,34 @@ async function getRemoteDocument(url, response, fetch$1) {
|
|
|
4732
4688
|
* @since 1.3.0
|
|
4733
4689
|
*/
|
|
4734
4690
|
function getDocumentLoader({ allowPrivateAddress, skipPreloadedContexts, userAgent } = {}) {
|
|
4735
|
-
const
|
|
4736
|
-
|
|
4737
|
-
async function load(url, options) {
|
|
4691
|
+
const tracer = _opentelemetry_api.trace.getTracerProvider().getTracer(name, version);
|
|
4692
|
+
async function load(url, options, redirected = 0, visited = /* @__PURE__ */ new Set()) {
|
|
4738
4693
|
options?.signal?.throwIfAborted();
|
|
4739
|
-
|
|
4740
|
-
|
|
4694
|
+
const currentUrl = new URL(url).href;
|
|
4695
|
+
if (!skipPreloadedContexts && currentUrl in preloadedContexts) {
|
|
4696
|
+
logger.debug("Using preloaded context: {url}.", { url: currentUrl });
|
|
4741
4697
|
return {
|
|
4742
4698
|
contextUrl: null,
|
|
4743
|
-
document:
|
|
4744
|
-
documentUrl:
|
|
4699
|
+
document: preloadedContexts[currentUrl],
|
|
4700
|
+
documentUrl: currentUrl
|
|
4745
4701
|
};
|
|
4746
4702
|
}
|
|
4747
4703
|
if (!allowPrivateAddress) try {
|
|
4748
|
-
await validatePublicUrl(
|
|
4704
|
+
await validatePublicUrl(currentUrl);
|
|
4749
4705
|
} catch (error) {
|
|
4750
4706
|
if (error instanceof UrlError) logger.error("Disallowed private URL: {url}", {
|
|
4751
|
-
url,
|
|
4707
|
+
url: currentUrl,
|
|
4752
4708
|
error
|
|
4753
4709
|
});
|
|
4754
4710
|
throw error;
|
|
4755
4711
|
}
|
|
4712
|
+
visited.add(currentUrl);
|
|
4756
4713
|
return await tracer.startActiveSpan("activitypub.fetch_document", {
|
|
4757
|
-
kind:
|
|
4758
|
-
attributes: { "url.full":
|
|
4714
|
+
kind: _opentelemetry_api.SpanKind.CLIENT,
|
|
4715
|
+
attributes: { "url.full": currentUrl }
|
|
4759
4716
|
}, async (span) => {
|
|
4760
4717
|
try {
|
|
4761
|
-
const request = createActivityPubRequest(
|
|
4718
|
+
const request = createActivityPubRequest(currentUrl, { userAgent });
|
|
4762
4719
|
logRequest(logger, request);
|
|
4763
4720
|
const response = await fetch(request, {
|
|
4764
4721
|
redirect: "manual",
|
|
@@ -4766,18 +4723,32 @@ function getDocumentLoader({ allowPrivateAddress, skipPreloadedContexts, userAge
|
|
|
4766
4723
|
});
|
|
4767
4724
|
span.setAttribute("http.response.status_code", response.status);
|
|
4768
4725
|
if (response.status >= 300 && response.status < 400 && response.headers.has("Location")) {
|
|
4769
|
-
|
|
4726
|
+
if (redirected >= DEFAULT_MAX_REDIRECTION) {
|
|
4727
|
+
logger.error("Too many redirections ({redirections}) while fetching document.", {
|
|
4728
|
+
redirections: redirected + 1,
|
|
4729
|
+
url: currentUrl
|
|
4730
|
+
});
|
|
4731
|
+
throw new FetchError(currentUrl, `Too many redirections (${redirected + 1})`);
|
|
4732
|
+
}
|
|
4733
|
+
const redirectUrl = new URL(response.headers.get("Location"), response.url === "" ? currentUrl : response.url).href;
|
|
4770
4734
|
span.setAttribute("http.redirect.url", redirectUrl);
|
|
4771
|
-
|
|
4735
|
+
if (visited.has(redirectUrl)) {
|
|
4736
|
+
logger.error("Detected a redirect loop while fetching document: {url} -> {redirectUrl}", {
|
|
4737
|
+
url: currentUrl,
|
|
4738
|
+
redirectUrl
|
|
4739
|
+
});
|
|
4740
|
+
throw new FetchError(currentUrl, `Redirect loop detected: ${redirectUrl}`);
|
|
4741
|
+
}
|
|
4742
|
+
return await load(redirectUrl, options, redirected + 1, visited);
|
|
4772
4743
|
}
|
|
4773
|
-
const result = await getRemoteDocument(
|
|
4744
|
+
const result = await getRemoteDocument(currentUrl, response, load);
|
|
4774
4745
|
span.setAttribute("docloader.document_url", result.documentUrl);
|
|
4775
4746
|
if (result.contextUrl != null) span.setAttribute("docloader.context_url", result.contextUrl);
|
|
4776
4747
|
return result;
|
|
4777
4748
|
} catch (error) {
|
|
4778
4749
|
span.recordException(error);
|
|
4779
4750
|
span.setStatus({
|
|
4780
|
-
code:
|
|
4751
|
+
code: _opentelemetry_api.SpanStatusCode.ERROR,
|
|
4781
4752
|
message: String(error)
|
|
4782
4753
|
});
|
|
4783
4754
|
throw error;
|
|
@@ -4788,7 +4759,6 @@ function getDocumentLoader({ allowPrivateAddress, skipPreloadedContexts, userAge
|
|
|
4788
4759
|
}
|
|
4789
4760
|
return load;
|
|
4790
4761
|
}
|
|
4791
|
-
|
|
4792
4762
|
//#endregion
|
|
4793
4763
|
//#region src/internal/multicodec.ts
|
|
4794
4764
|
const INVALID_MULTICODEC_PREFIX = "Invalid multicodec prefix.";
|
|
@@ -4828,7 +4798,6 @@ function addMulticodecPrefix(code, payload) {
|
|
|
4828
4798
|
prefixed.set(payload, prefix.length);
|
|
4829
4799
|
return prefixed;
|
|
4830
4800
|
}
|
|
4831
|
-
|
|
4832
4801
|
//#endregion
|
|
4833
4802
|
//#region src/jwk.ts
|
|
4834
4803
|
function validateCryptoKey(key, type) {
|
|
@@ -4836,11 +4805,9 @@ function validateCryptoKey(key, type) {
|
|
|
4836
4805
|
if (!key.extractable) throw new TypeError("The key is not extractable.");
|
|
4837
4806
|
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!");
|
|
4838
4807
|
if (key.algorithm.name === "RSASSA-PKCS1-v1_5") {
|
|
4839
|
-
|
|
4840
|
-
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.");
|
|
4808
|
+
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.");
|
|
4841
4809
|
}
|
|
4842
4810
|
}
|
|
4843
|
-
|
|
4844
4811
|
//#endregion
|
|
4845
4812
|
//#region src/multibase/util.ts
|
|
4846
4813
|
const textDecoder = new TextDecoder();
|
|
@@ -4856,7 +4823,6 @@ function concat(arrs, length) {
|
|
|
4856
4823
|
}
|
|
4857
4824
|
return output;
|
|
4858
4825
|
}
|
|
4859
|
-
|
|
4860
4826
|
//#endregion
|
|
4861
4827
|
//#region src/multibase/base.ts
|
|
4862
4828
|
/**
|
|
@@ -4865,8 +4831,8 @@ function concat(arrs, length) {
|
|
|
4865
4831
|
var Base = class {
|
|
4866
4832
|
codeBuf;
|
|
4867
4833
|
codec;
|
|
4868
|
-
constructor(name
|
|
4869
|
-
this.name = name
|
|
4834
|
+
constructor(name, code, factory, alphabet) {
|
|
4835
|
+
this.name = name;
|
|
4870
4836
|
this.code = code;
|
|
4871
4837
|
this.alphabet = alphabet;
|
|
4872
4838
|
this.codeBuf = encodeText(this.code);
|
|
@@ -4881,12 +4847,11 @@ var Base = class {
|
|
|
4881
4847
|
return this.codec.decode(string);
|
|
4882
4848
|
}
|
|
4883
4849
|
};
|
|
4884
|
-
|
|
4885
4850
|
//#endregion
|
|
4886
4851
|
//#region src/multibase/rfc4648.ts
|
|
4887
4852
|
const decode = (string, alphabet, bitsPerChar) => {
|
|
4888
|
-
const codes
|
|
4889
|
-
for (let i = 0; i < alphabet.length; ++i) codes
|
|
4853
|
+
const codes = {};
|
|
4854
|
+
for (let i = 0; i < alphabet.length; ++i) codes[alphabet[i]] = i;
|
|
4890
4855
|
let end = string.length;
|
|
4891
4856
|
while (string[end - 1] === "=") --end;
|
|
4892
4857
|
const out = new Uint8Array(end * bitsPerChar / 8 | 0);
|
|
@@ -4894,7 +4859,7 @@ const decode = (string, alphabet, bitsPerChar) => {
|
|
|
4894
4859
|
let buffer = 0;
|
|
4895
4860
|
let written = 0;
|
|
4896
4861
|
for (let i = 0; i < end; ++i) {
|
|
4897
|
-
const value = codes
|
|
4862
|
+
const value = codes[string[i]];
|
|
4898
4863
|
if (value === void 0) throw new SyntaxError("Invalid character " + string[i]);
|
|
4899
4864
|
buffer = buffer << bitsPerChar | value;
|
|
4900
4865
|
bits += bitsPerChar;
|
|
@@ -4937,7 +4902,6 @@ const rfc4648 = (bitsPerChar) => (alphabet) => {
|
|
|
4937
4902
|
}
|
|
4938
4903
|
};
|
|
4939
4904
|
};
|
|
4940
|
-
|
|
4941
4905
|
//#endregion
|
|
4942
4906
|
//#region src/multibase/constants.ts
|
|
4943
4907
|
const identity = () => {
|
|
@@ -4973,7 +4937,7 @@ const constants = [
|
|
|
4973
4937
|
[
|
|
4974
4938
|
"base10",
|
|
4975
4939
|
"9",
|
|
4976
|
-
|
|
4940
|
+
_multiformats_base_x.default,
|
|
4977
4941
|
"0123456789"
|
|
4978
4942
|
],
|
|
4979
4943
|
[
|
|
@@ -5045,25 +5009,25 @@ const constants = [
|
|
|
5045
5009
|
[
|
|
5046
5010
|
"base36",
|
|
5047
5011
|
"k",
|
|
5048
|
-
|
|
5012
|
+
_multiformats_base_x.default,
|
|
5049
5013
|
"0123456789abcdefghijklmnopqrstuvwxyz"
|
|
5050
5014
|
],
|
|
5051
5015
|
[
|
|
5052
5016
|
"base36upper",
|
|
5053
5017
|
"K",
|
|
5054
|
-
|
|
5018
|
+
_multiformats_base_x.default,
|
|
5055
5019
|
"0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ"
|
|
5056
5020
|
],
|
|
5057
5021
|
[
|
|
5058
5022
|
"base58btc",
|
|
5059
5023
|
"z",
|
|
5060
|
-
|
|
5024
|
+
_multiformats_base_x.default,
|
|
5061
5025
|
"123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz"
|
|
5062
5026
|
],
|
|
5063
5027
|
[
|
|
5064
5028
|
"base58flickr",
|
|
5065
5029
|
"Z",
|
|
5066
|
-
|
|
5030
|
+
_multiformats_base_x.default,
|
|
5067
5031
|
"123456789abcdefghijkmnopqrstuvwxyzABCDEFGHJKLMNPQRSTUVWXYZ"
|
|
5068
5032
|
],
|
|
5069
5033
|
[
|
|
@@ -5099,7 +5063,6 @@ const codes = constants.reduce((prev, tupple) => {
|
|
|
5099
5063
|
prev[tupple[1]] = names[tupple[0]];
|
|
5100
5064
|
return prev;
|
|
5101
5065
|
}, {});
|
|
5102
|
-
|
|
5103
5066
|
//#endregion
|
|
5104
5067
|
//#region src/multibase/mod.ts
|
|
5105
5068
|
/**
|
|
@@ -5136,8 +5099,7 @@ function decodeMultibase(data) {
|
|
|
5136
5099
|
"k",
|
|
5137
5100
|
"K"
|
|
5138
5101
|
].includes(prefix)) data = data.toLowerCase();
|
|
5139
|
-
|
|
5140
|
-
return enc.decode(data.substring(1));
|
|
5102
|
+
return encoding(data[0]).decode(data.substring(1));
|
|
5141
5103
|
}
|
|
5142
5104
|
/**
|
|
5143
5105
|
* Get the encoding by name or code
|
|
@@ -5159,7 +5121,6 @@ function encodingFromBaseData(data) {
|
|
|
5159
5121
|
if (data instanceof Uint8Array) data = decodeText(data);
|
|
5160
5122
|
return encoding(data[0]);
|
|
5161
5123
|
}
|
|
5162
|
-
|
|
5163
5124
|
//#endregion
|
|
5164
5125
|
//#region src/key.ts
|
|
5165
5126
|
const algorithms = {
|
|
@@ -5184,8 +5145,7 @@ async function importSpki(pem) {
|
|
|
5184
5145
|
} catch (_) {
|
|
5185
5146
|
throw new TypeError("Invalid PEM-SPKI format.");
|
|
5186
5147
|
}
|
|
5187
|
-
const
|
|
5188
|
-
const oid = pki.algorithm.algorithmId;
|
|
5148
|
+
const oid = pkijs.PublicKeyInfo.fromBER(spki).algorithm.algorithmId;
|
|
5189
5149
|
const algorithm = algorithms[oid];
|
|
5190
5150
|
if (algorithm == null) throw new TypeError("Unsupported algorithm: " + oid);
|
|
5191
5151
|
return await crypto.subtle.importKey("spki", spki, algorithm, true, ["verify"]);
|
|
@@ -5199,8 +5159,7 @@ async function importSpki(pem) {
|
|
|
5199
5159
|
*/
|
|
5200
5160
|
async function exportSpki(key) {
|
|
5201
5161
|
validateCryptoKey(key);
|
|
5202
|
-
|
|
5203
|
-
let pem = (0, byte_encodings_base64.encodeBase64)(spki);
|
|
5162
|
+
let pem = (0, byte_encodings_base64.encodeBase64)(await crypto.subtle.exportKey("spki", key));
|
|
5204
5163
|
pem = (pem.match(/.{1,64}/g) || []).join("\n");
|
|
5205
5164
|
return `-----BEGIN PUBLIC KEY-----\n${pem}\n-----END PUBLIC KEY-----\n`;
|
|
5206
5165
|
}
|
|
@@ -5212,16 +5171,14 @@ async function exportSpki(key) {
|
|
|
5212
5171
|
* @since 1.5.0
|
|
5213
5172
|
*/
|
|
5214
5173
|
function importPkcs1(pem) {
|
|
5215
|
-
|
|
5174
|
+
return importSpki((0, node_crypto.createPublicKey)({
|
|
5216
5175
|
key: pem,
|
|
5217
5176
|
format: "pem",
|
|
5218
5177
|
type: "pkcs1"
|
|
5219
|
-
})
|
|
5220
|
-
const spki = key.export({
|
|
5178
|
+
}).export({
|
|
5221
5179
|
type: "spki",
|
|
5222
5180
|
format: "pem"
|
|
5223
|
-
});
|
|
5224
|
-
return importSpki(spki);
|
|
5181
|
+
}));
|
|
5225
5182
|
}
|
|
5226
5183
|
const PKCS1_HEADER = /^\s*-----BEGIN\s+RSA\s+PUBLIC\s+KEY-----\s*\n/;
|
|
5227
5184
|
/**
|
|
@@ -5248,12 +5205,11 @@ async function importMultibaseKey(key) {
|
|
|
5248
5205
|
const { code } = getMulticodecPrefix(decoded);
|
|
5249
5206
|
const content = removeMulticodecPrefix(decoded);
|
|
5250
5207
|
if (code === 4613) {
|
|
5251
|
-
const
|
|
5208
|
+
const exported = (0, node_crypto.createPublicKey)({
|
|
5252
5209
|
key: content,
|
|
5253
5210
|
format: "der",
|
|
5254
5211
|
type: "pkcs1"
|
|
5255
|
-
})
|
|
5256
|
-
const exported = keyObject.export({
|
|
5212
|
+
}).export({
|
|
5257
5213
|
type: "spki",
|
|
5258
5214
|
format: "der"
|
|
5259
5215
|
});
|
|
@@ -5285,21 +5241,18 @@ async function exportMultibaseKey(key) {
|
|
|
5285
5241
|
const decodedN = (0, byte_encodings_base64url.decodeBase64Url)(jwk.n);
|
|
5286
5242
|
const n = new Uint8Array(decodedN.length + 1);
|
|
5287
5243
|
n.set(decodedN, 1);
|
|
5288
|
-
|
|
5244
|
+
content = new asn1js.Sequence({ value: [new asn1js.Integer({
|
|
5289
5245
|
isHexOnly: true,
|
|
5290
5246
|
valueHex: n
|
|
5291
5247
|
}), new asn1js.Integer({
|
|
5292
5248
|
isHexOnly: true,
|
|
5293
5249
|
valueHex: (0, byte_encodings_base64url.decodeBase64Url)(jwk.e)
|
|
5294
|
-
})] });
|
|
5295
|
-
content = sequence.toBER(false);
|
|
5250
|
+
})] }).toBER(false);
|
|
5296
5251
|
code = 4613;
|
|
5297
5252
|
} else throw new TypeError("Unsupported key type: " + JSON.stringify(key.algorithm));
|
|
5298
|
-
const
|
|
5299
|
-
const encoded = encodeMultibase("base58btc", prefixed);
|
|
5253
|
+
const encoded = encodeMultibase("base58btc", addMulticodecPrefix(code, new Uint8Array(content)));
|
|
5300
5254
|
return new TextDecoder().decode(encoded);
|
|
5301
5255
|
}
|
|
5302
|
-
|
|
5303
5256
|
//#endregion
|
|
5304
5257
|
//#region src/langstr.ts
|
|
5305
5258
|
/**
|
|
@@ -5328,7 +5281,6 @@ LanguageString.prototype[Symbol.for("Deno.customInspect")] = function(inspect, o
|
|
|
5328
5281
|
LanguageString.prototype[Symbol.for("nodejs.util.inspect.custom")] = function(_depth, options, inspect) {
|
|
5329
5282
|
return `<${this.locale.baseName}> ${inspect(this.toString(), options)}`;
|
|
5330
5283
|
};
|
|
5331
|
-
|
|
5332
5284
|
//#endregion
|
|
5333
5285
|
exports.FetchError = FetchError;
|
|
5334
5286
|
exports.LanguageString = LanguageString;
|
|
@@ -5350,5 +5302,5 @@ exports.importSpki = importSpki;
|
|
|
5350
5302
|
exports.isValidPublicIPv4Address = isValidPublicIPv4Address;
|
|
5351
5303
|
exports.isValidPublicIPv6Address = isValidPublicIPv6Address;
|
|
5352
5304
|
exports.logRequest = logRequest;
|
|
5353
|
-
exports.preloadedContexts =
|
|
5354
|
-
exports.validatePublicUrl = validatePublicUrl;
|
|
5305
|
+
exports.preloadedContexts = preloadedContexts;
|
|
5306
|
+
exports.validatePublicUrl = validatePublicUrl;
|
package/dist/mod.d.cts
CHANGED
|
@@ -1,9 +1,6 @@
|
|
|
1
1
|
import { Logger } from "@logtape/logtape";
|
|
2
2
|
|
|
3
3
|
//#region src/contexts.d.ts
|
|
4
|
-
// Preloaded context documents
|
|
5
|
-
// https://github.com/fedify-dev/fedify/issues/74
|
|
6
|
-
// cSpell: disable
|
|
7
4
|
declare const preloadedContexts: Record<string, unknown>;
|
|
8
5
|
//#endregion
|
|
9
6
|
//#region src/request.d.ts
|
|
@@ -267,7 +264,6 @@ declare class LanguageString extends String {
|
|
|
267
264
|
//#endregion
|
|
268
265
|
//#region src/multibase/types.d.ts
|
|
269
266
|
type BaseCode = "\x00" | "0" | "7" | "9" | "f" | "F" | "v" | "V" | "t" | "T" | "b" | "B" | "c" | "C" | "h" | "k" | "K" | "z" | "Z" | "m" | "M" | "u" | "U";
|
|
270
|
-
|
|
271
267
|
/**
|
|
272
268
|
* - Names of the supported encodings
|
|
273
269
|
*/
|
|
@@ -331,4 +327,4 @@ declare function isValidPublicIPv4Address(address: string): boolean;
|
|
|
331
327
|
declare function isValidPublicIPv6Address(address: string): boolean;
|
|
332
328
|
declare function expandIPv6Address(address: string): string;
|
|
333
329
|
//#endregion
|
|
334
|
-
export { AuthenticatedDocumentLoaderFactory, CreateRequestOptions, DocumentLoader, DocumentLoaderFactory, DocumentLoaderFactoryOptions, DocumentLoaderOptions, FetchError, GetDocumentLoaderOptions, GetUserAgentOptions, LanguageString, RemoteDocument, UrlError, createActivityPubRequest, decodeMultibase, encodeMultibase, encodingFromBaseData, expandIPv6Address, exportMultibaseKey, exportSpki, getDocumentLoader, getRemoteDocument, getUserAgent, importMultibaseKey, importPem, importPkcs1, importSpki, isValidPublicIPv4Address, isValidPublicIPv6Address, logRequest, preloadedContexts, validatePublicUrl };
|
|
330
|
+
export { type AuthenticatedDocumentLoaderFactory, type CreateRequestOptions, type DocumentLoader, type DocumentLoaderFactory, type DocumentLoaderFactoryOptions, type DocumentLoaderOptions, FetchError, type GetDocumentLoaderOptions, type GetUserAgentOptions, LanguageString, type RemoteDocument, UrlError, createActivityPubRequest, decodeMultibase, encodeMultibase, encodingFromBaseData, expandIPv6Address, exportMultibaseKey, exportSpki, getDocumentLoader, getRemoteDocument, getUserAgent, importMultibaseKey, importPem, importPkcs1, importSpki, isValidPublicIPv4Address, isValidPublicIPv6Address, logRequest, preloadedContexts, validatePublicUrl };
|
package/dist/mod.d.ts
CHANGED
|
@@ -1,9 +1,6 @@
|
|
|
1
1
|
import { Logger } from "@logtape/logtape";
|
|
2
2
|
|
|
3
3
|
//#region src/contexts.d.ts
|
|
4
|
-
// Preloaded context documents
|
|
5
|
-
// https://github.com/fedify-dev/fedify/issues/74
|
|
6
|
-
// cSpell: disable
|
|
7
4
|
declare const preloadedContexts: Record<string, unknown>;
|
|
8
5
|
//#endregion
|
|
9
6
|
//#region src/request.d.ts
|
|
@@ -267,7 +264,6 @@ declare class LanguageString extends String {
|
|
|
267
264
|
//#endregion
|
|
268
265
|
//#region src/multibase/types.d.ts
|
|
269
266
|
type BaseCode = "\x00" | "0" | "7" | "9" | "f" | "F" | "v" | "V" | "t" | "T" | "b" | "B" | "c" | "C" | "h" | "k" | "K" | "z" | "Z" | "m" | "M" | "u" | "U";
|
|
270
|
-
|
|
271
267
|
/**
|
|
272
268
|
* - Names of the supported encodings
|
|
273
269
|
*/
|
|
@@ -331,4 +327,4 @@ declare function isValidPublicIPv4Address(address: string): boolean;
|
|
|
331
327
|
declare function isValidPublicIPv6Address(address: string): boolean;
|
|
332
328
|
declare function expandIPv6Address(address: string): string;
|
|
333
329
|
//#endregion
|
|
334
|
-
export { AuthenticatedDocumentLoaderFactory, CreateRequestOptions, DocumentLoader, DocumentLoaderFactory, DocumentLoaderFactoryOptions, DocumentLoaderOptions, FetchError, GetDocumentLoaderOptions, GetUserAgentOptions, LanguageString, RemoteDocument, UrlError, createActivityPubRequest, decodeMultibase, encodeMultibase, encodingFromBaseData, expandIPv6Address, exportMultibaseKey, exportSpki, getDocumentLoader, getRemoteDocument, getUserAgent, importMultibaseKey, importPem, importPkcs1, importSpki, isValidPublicIPv4Address, isValidPublicIPv6Address, logRequest, preloadedContexts, validatePublicUrl };
|
|
330
|
+
export { type AuthenticatedDocumentLoaderFactory, type CreateRequestOptions, type DocumentLoader, type DocumentLoaderFactory, type DocumentLoaderFactoryOptions, type DocumentLoaderOptions, FetchError, type GetDocumentLoaderOptions, type GetUserAgentOptions, LanguageString, type RemoteDocument, UrlError, createActivityPubRequest, decodeMultibase, encodeMultibase, encodingFromBaseData, expandIPv6Address, exportMultibaseKey, exportSpki, getDocumentLoader, getRemoteDocument, getUserAgent, importMultibaseKey, importPem, importPkcs1, importSpki, isValidPublicIPv4Address, isValidPublicIPv6Address, logRequest, preloadedContexts, validatePublicUrl };
|