@fedify/fedify 1.7.13 → 1.7.15
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/dist/{actor-CPpvuBKU.d.ts → actor.d.ts} +3 -3
- package/dist/{actor-BVilnhZ3.js → actor.js} +6 -6
- package/dist/{assert-LOEeCUK5.js → assert.js} +2 -2
- package/dist/{assert_equals-B44MxcIj.js → assert_equals.js} +16 -16
- package/dist/{assert_instance_of-XtuFevV_.js → assert_instance_of.js} +2 -2
- package/dist/{assert_is_error-BTlryvT0.js → assert_is_error.js} +2 -2
- package/dist/{assert_not_equals-C685gKx6.js → assert_not_equals.js} +3 -6
- package/dist/{assert_rejects-DWQ4jaf9.js → assert_rejects.js} +3 -3
- package/dist/{assert_throws-YetpVSc-.js → assert_throws.js} +3 -3
- package/dist/{authdocloader-DqCINL6u.js → authdocloader.js} +8 -8
- package/dist/{builder-CKUAOfcL.js → builder.js} +7 -7
- package/dist/{chunk-Cx8LTkjm.js → chunk.js} +22 -15
- package/dist/{client-DvtwXO7t.d.ts → client.d.ts} +2 -2
- package/dist/{client-C5xUY491.js → client.js} +3 -3
- package/dist/{collection-Dfb0TPno.js → collection.js} +2 -3
- package/dist/compat/mod.d.ts +79 -12
- package/dist/compat/mod.js +1 -2
- package/dist/compat/transformers.test.js +34 -38
- package/dist/{context-OBWjptjU.d.ts → context.d.ts} +11 -11
- package/dist/{context-aglzx1Ww.js → context.js} +5 -5
- package/dist/{docloader-Q42SMRIB.d.ts → docloader.d.ts} +2 -2
- package/dist/{docloader-Qfs9nPiy.js → docloader.js} +32 -152
- package/dist/{docloader-09nVWLAZ.js → docloader2.js} +1 -1
- package/dist/{esm-DO9PrujO.js → esm.js} +36 -22
- package/dist/federation/builder.test.js +20 -26
- package/dist/federation/collection.test.js +11 -16
- package/dist/federation/handler.test.js +41 -48
- package/dist/federation/inbox.test.js +11 -11
- package/dist/federation/keycache.test.js +12 -11
- package/dist/federation/kv.test.js +8 -10
- package/dist/federation/middleware.test.js +105 -134
- package/dist/federation/mod.d.ts +4 -13
- package/dist/federation/mod.js +206 -12
- package/dist/federation/mq.test.js +12 -17
- package/dist/federation/retry.test.js +5 -4
- package/dist/federation/router.test.js +9 -10
- package/dist/federation/send.test.js +23 -24
- package/dist/{http-DMTrO3Ye.d.ts → http.d.ts} +3 -3
- package/dist/{http-CjDwMreH.js → http.js} +25 -31
- package/dist/{inbox-ApPO50Ma.js → inbox.js} +5 -5
- package/dist/key.js +16 -0
- package/dist/{key-BPUM0v_S.js → key2.js} +5 -5
- package/dist/{keycache-B7Urghlu.js → keycache.js} +2 -2
- package/dist/{keys-DGJec4-R.js → keys.js} +2 -2
- package/dist/{kv-DRaeSXco.d.ts → kv.d.ts} +1 -1
- package/dist/{kv-BMY6Qf_A.js → kv.js} +1 -1
- package/dist/{langstr-DbWheeIS.js → langstr.js} +1 -1
- package/dist/{ld-DJTavNY3.js → ld.js} +9 -12
- package/dist/{lookup-Bf-K85bV.d.ts → lookup.d.ts} +2 -2
- package/dist/{lookup-CkOdKyYR.js → lookup.js} +4 -4
- package/dist/{lookup-CnkkF4Rf.js → lookup2.js} +6 -6
- package/dist/{middleware-BxHcZC4p.js → middleware.js} +35 -39
- package/dist/middleware2.js +32 -0
- package/dist/mod.d.ts +17 -17
- package/dist/mod.js +17 -17
- package/dist/{mod-CDzlVCUF.d.ts → mod2.d.ts} +3 -3
- package/dist/{mod-CCL2cvnI.d.ts → mod3.d.ts} +4 -4
- package/dist/{mq-DYKDDJmp.d.ts → mq.d.ts} +1 -1
- package/dist/{multibase-CnLHszip.js → multibase.js} +1 -1
- package/dist/nodeinfo/client.test.js +19 -28
- package/dist/nodeinfo/handler.test.js +37 -44
- package/dist/nodeinfo/mod.d.ts +2 -5
- package/dist/nodeinfo/mod.js +2 -3
- package/dist/nodeinfo/semver.test.js +13 -21
- package/dist/nodeinfo/types.test.js +9 -11
- package/dist/{owner-D0cOz8R5.d.ts → owner.d.ts} +4 -4
- package/dist/{owner-qKULzrkx.js → owner.js} +4 -4
- package/dist/{proof-d5P09-xk.js → proof.js} +11 -13
- package/dist/{retry-BiIhZWgD.js → retry.js} +1 -1
- package/dist/{router-D_aVZZUc.js → router.js} +1 -1
- package/dist/runtime/authdocloader.test.js +22 -26
- package/dist/runtime/docloader.test.js +56 -56
- package/dist/runtime/key.test.js +31 -53
- package/dist/runtime/langstr.test.js +8 -10
- package/dist/runtime/mod.d.ts +103 -6
- package/dist/runtime/mod.js +6 -7
- package/dist/runtime/multibase/multibase.test.js +12 -18
- package/dist/runtime/url.test.js +7 -6
- package/dist/{semver-BNrOOAs9.js → semver.js} +7 -17
- package/dist/{send-BnMY3Qxa.js → send.js} +4 -4
- package/dist/sig/http.test.js +104 -168
- package/dist/sig/key.test.js +17 -20
- package/dist/sig/ld.test.js +28 -35
- package/dist/sig/mod.d.ts +3 -7
- package/dist/sig/mod.js +6 -7
- package/dist/sig/owner.test.js +24 -30
- package/dist/sig/proof.test.js +24 -29
- package/dist/{std__assert-o_r9vqm1.js → std__assert.js} +7 -13
- package/dist/testing/docloader.test.js +9 -12
- package/dist/testing/mod.js +2 -1
- package/dist/{testing-DLyvtiiW.js → testing.js} +2 -2
- package/dist/{transformers-ghwJuzGY.js → transformers.js} +1 -1
- package/dist/{type-CFuiGLz9.js → type.js} +1 -1
- package/dist/{types-CJHS5pXl.js → types.js} +2 -2
- package/dist/{url-C2xuoQD1.js → url.js} +1 -1
- package/dist/vocab/actor.test.js +76 -128
- package/dist/vocab/lookup.test.js +19 -23
- package/dist/vocab/mod.d.ts +3 -5
- package/dist/vocab/mod.js +4 -4
- package/dist/vocab/type.test.js +10 -10
- package/dist/vocab/vocab.test.js +90 -109
- package/dist/{vocab-CzEfWQk2.d.ts → vocab.d.ts} +2 -2
- package/dist/{vocab-S7fEn6XO.js → vocab.js} +318 -454
- package/dist/webfinger/handler.test.js +40 -48
- package/dist/webfinger/lookup.test.js +12 -15
- package/dist/webfinger/mod.d.ts +1 -4
- package/dist/webfinger/mod.js +2 -3
- package/dist/x/cfworkers.d.ts +2 -2
- package/dist/x/cfworkers.test.js +7 -9
- package/dist/x/hono.d.ts +2 -11
- package/dist/x/sveltekit.d.ts +2 -11
- package/package.json +1 -1
- package/dist/actor-CsmPeeHG.js +0 -34925
- package/dist/authdocloader-9g6RkEcR.js +0 -53
- package/dist/compat-Bb5myD13.js +0 -4
- package/dist/docloader-CchlnLWb.js +0 -4598
- package/dist/federation-B0aljx0V.js +0 -203
- package/dist/http-CP3h1SLi.js +0 -796
- package/dist/key--l6NVKdl.js +0 -257
- package/dist/key-1Fv7reaM.js +0 -16
- package/dist/key-DD37RpoD.js +0 -10
- package/dist/lookup-CN-LpF5e.js +0 -127
- package/dist/middleware-BQHe0X6Y.js +0 -17
- package/dist/middleware-C3TZ3P-v.js +0 -33
- package/dist/middleware-CEpilAEY.js +0 -3524
- package/dist/mod-1pDWKvUL.d.ts +0 -2
- package/dist/mod-DFncUgcE.d.ts +0 -82
- package/dist/mod-GIh5OYxW.d.ts +0 -2
- package/dist/mod-g0xFzAP9.d.ts +0 -2
- package/dist/mod-qFMzZ3iF.d.ts +0 -104
- package/dist/nodeinfo-CyEbLjHs.js +0 -4
- package/dist/proof-BfeWBNrY.js +0 -582
- package/dist/runtime-BSkOVUWM.js +0 -4
- package/dist/sig-BXJO--F9.js +0 -4
- package/dist/types-BZUzjGS0.js +0 -455
- package/dist/vocab-C_pE4SvE.js +0 -168
- package/dist/webfinger-C3GIyXIg.js +0 -4
- /package/dist/{denokv-CvROlGYX.js → denokv.js} +0 -0
|
@@ -3,16 +3,14 @@
|
|
|
3
3
|
import { URLPattern } from "urlpattern-polyfill";
|
|
4
4
|
globalThis.addEventListener = () => {};
|
|
5
5
|
|
|
6
|
-
import
|
|
7
|
-
import "../
|
|
8
|
-
import "../
|
|
9
|
-
import {
|
|
10
|
-
import
|
|
11
|
-
import "../
|
|
12
|
-
import "../
|
|
13
|
-
import "../
|
|
14
|
-
import "../assert_not_equals-C685gKx6.js";
|
|
15
|
-
import { assertThrows } from "../assert_throws-YetpVSc-.js";
|
|
6
|
+
import "../chunk.js";
|
|
7
|
+
import { t as assertEquals } from "../assert_equals.js";
|
|
8
|
+
import { n as parseSemVer, t as formatSemVer } from "../semver.js";
|
|
9
|
+
import { t as test } from "../testing.js";
|
|
10
|
+
import "../std__assert.js";
|
|
11
|
+
import "../assert_rejects.js";
|
|
12
|
+
import "../assert_is_error.js";
|
|
13
|
+
import { t as assertThrows } from "../assert_throws.js";
|
|
16
14
|
|
|
17
15
|
//#region nodeinfo/semver.test.ts
|
|
18
16
|
test("parseSemVer() handles major", async (t) => {
|
|
@@ -25,8 +23,7 @@ test("parseSemVer() handles major", async (t) => {
|
|
|
25
23
|
[" v8.2.3 ", 8],
|
|
26
24
|
[" 13.2.3", 13]
|
|
27
25
|
]) await t.step(v, () => {
|
|
28
|
-
|
|
29
|
-
assertEquals(version.major, expected);
|
|
26
|
+
assertEquals(parseSemVer(v).major, expected);
|
|
30
27
|
});
|
|
31
28
|
});
|
|
32
29
|
test("parseSemVer() handles minor", async (t) => {
|
|
@@ -39,8 +36,7 @@ test("parseSemVer() handles minor", async (t) => {
|
|
|
39
36
|
[" v1.8.3 ", 8],
|
|
40
37
|
[" 1.13.3", 13]
|
|
41
38
|
]) await t.step(v, () => {
|
|
42
|
-
|
|
43
|
-
assertEquals(version.minor, expected);
|
|
39
|
+
assertEquals(parseSemVer(v).minor, expected);
|
|
44
40
|
});
|
|
45
41
|
});
|
|
46
42
|
test("parseSemVer() handles patch", async (t) => {
|
|
@@ -68,8 +64,7 @@ test("parseSemVer() handles prerelease", async (t) => {
|
|
|
68
64
|
["1.2.0-3.6-pre2", [3, "6-pre2"]],
|
|
69
65
|
["2.0.0", []]
|
|
70
66
|
]) await t.step(`${v} : ${JSON.stringify(expected)}`, () => {
|
|
71
|
-
|
|
72
|
-
assertEquals(semver.prerelease, expected);
|
|
67
|
+
assertEquals(parseSemVer(v).prerelease, expected);
|
|
73
68
|
});
|
|
74
69
|
});
|
|
75
70
|
test({
|
|
@@ -109,8 +104,7 @@ test("parseSemVer() throws on invalid versions", async (t) => {
|
|
|
109
104
|
});
|
|
110
105
|
});
|
|
111
106
|
test("parseSemVer() handles big numeric prerelease", function() {
|
|
112
|
-
|
|
113
|
-
assertEquals(r.prerelease, ["beta", "90071992547409910"]);
|
|
107
|
+
assertEquals(parseSemVer(`1.2.3-beta.${Number.MAX_SAFE_INTEGER}0`).prerelease, ["beta", "90071992547409910"]);
|
|
114
108
|
});
|
|
115
109
|
test("formatSemVer()", async (t) => {
|
|
116
110
|
for (const [version, expected] of [
|
|
@@ -124,9 +118,7 @@ test("formatSemVer()", async (t) => {
|
|
|
124
118
|
]) await t.step({
|
|
125
119
|
name: version,
|
|
126
120
|
fn: () => {
|
|
127
|
-
|
|
128
|
-
const actual = formatSemVer(v);
|
|
129
|
-
assertEquals(actual, expected);
|
|
121
|
+
assertEquals(formatSemVer(parseSemVer(version)), expected);
|
|
130
122
|
}
|
|
131
123
|
});
|
|
132
124
|
});
|
|
@@ -3,17 +3,15 @@
|
|
|
3
3
|
import { URLPattern } from "urlpattern-polyfill";
|
|
4
4
|
globalThis.addEventListener = () => {};
|
|
5
5
|
|
|
6
|
-
import
|
|
7
|
-
import "../
|
|
8
|
-
import "../
|
|
9
|
-
import "../
|
|
10
|
-
import {
|
|
11
|
-
import
|
|
12
|
-
import "../
|
|
13
|
-
import "../
|
|
14
|
-
import "../
|
|
15
|
-
import "../assert_not_equals-C685gKx6.js";
|
|
16
|
-
import { assertThrows } from "../assert_throws-YetpVSc-.js";
|
|
6
|
+
import "../chunk.js";
|
|
7
|
+
import { t as assertEquals } from "../assert_equals.js";
|
|
8
|
+
import "../semver.js";
|
|
9
|
+
import { t as nodeInfoToJson } from "../types.js";
|
|
10
|
+
import { t as test } from "../testing.js";
|
|
11
|
+
import "../std__assert.js";
|
|
12
|
+
import "../assert_rejects.js";
|
|
13
|
+
import "../assert_is_error.js";
|
|
14
|
+
import { t as assertThrows } from "../assert_throws.js";
|
|
17
15
|
|
|
18
16
|
//#region nodeinfo/types.test.ts
|
|
19
17
|
test("nodeInfoToJson()", () => {
|
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
import { Temporal } from "@js-temporal/polyfill";
|
|
2
2
|
import { URLPattern } from "urlpattern-polyfill";
|
|
3
|
-
import { DocumentLoader } from "./docloader
|
|
4
|
-
import {
|
|
5
|
-
import { Actor } from "./actor
|
|
3
|
+
import { n as DocumentLoader } from "./docloader.js";
|
|
4
|
+
import { m as CryptographicKey, n as Activity } from "./vocab.js";
|
|
5
|
+
import { t as Actor } from "./actor.js";
|
|
6
6
|
import { TracerProvider } from "@opentelemetry/api";
|
|
7
7
|
|
|
8
8
|
//#region sig/owner.d.ts
|
|
@@ -66,4 +66,4 @@ interface GetKeyOwnerOptions {
|
|
|
66
66
|
*/
|
|
67
67
|
declare function getKeyOwner(keyId: URL | CryptographicKey, options: GetKeyOwnerOptions): Promise<Actor | null>;
|
|
68
68
|
//#endregion
|
|
69
|
-
export {
|
|
69
|
+
export { getKeyOwner as i, GetKeyOwnerOptions as n, doesActorOwnKey as r, DoesActorOwnKeyOptions as t };
|
|
@@ -3,9 +3,9 @@
|
|
|
3
3
|
import { URLPattern } from "urlpattern-polyfill";
|
|
4
4
|
globalThis.addEventListener = () => {};
|
|
5
5
|
|
|
6
|
-
import { getDocumentLoader } from "./docloader
|
|
7
|
-
import {
|
|
8
|
-
import { isActor } from "./actor
|
|
6
|
+
import { i as getDocumentLoader } from "./docloader.js";
|
|
7
|
+
import { _ as Object$1, o as CryptographicKey } from "./vocab.js";
|
|
8
|
+
import { i as isActor } from "./actor.js";
|
|
9
9
|
import { trace } from "@opentelemetry/api";
|
|
10
10
|
|
|
11
11
|
//#region sig/owner.ts
|
|
@@ -86,4 +86,4 @@ async function getKeyOwner(keyId, options) {
|
|
|
86
86
|
}
|
|
87
87
|
|
|
88
88
|
//#endregion
|
|
89
|
-
export {
|
|
89
|
+
export { getKeyOwner as n, doesActorOwnKey as t };
|
|
@@ -3,10 +3,10 @@
|
|
|
3
3
|
import { URLPattern } from "urlpattern-polyfill";
|
|
4
4
|
globalThis.addEventListener = () => {};
|
|
5
5
|
|
|
6
|
-
import {
|
|
7
|
-
import {
|
|
8
|
-
import { getTypeId } from "./type
|
|
9
|
-
import {
|
|
6
|
+
import { d as version, u as name } from "./docloader.js";
|
|
7
|
+
import { h as Multikey, s as DataIntegrityProof, t as Activity } from "./vocab.js";
|
|
8
|
+
import { t as getTypeId } from "./type.js";
|
|
9
|
+
import { a as validateCryptoKey, n as fetchKey } from "./key2.js";
|
|
10
10
|
import { getLogger } from "@logtape/logtape";
|
|
11
11
|
import { SpanStatusCode, trace } from "@opentelemetry/api";
|
|
12
12
|
import { encodeHex } from "byte-encodings/hex";
|
|
@@ -41,15 +41,14 @@ async function createProof(object, privateKey, keyId, { contextLoader, context:
|
|
|
41
41
|
const msgBytes = encoder.encode(msgCanon);
|
|
42
42
|
const msgDigest = await crypto.subtle.digest("SHA-256", msgBytes);
|
|
43
43
|
created ??= Temporal.Now.instant();
|
|
44
|
-
const
|
|
44
|
+
const proofCanon = serialize({
|
|
45
45
|
"@context": compactMsg["@context"],
|
|
46
46
|
type: "DataIntegrityProof",
|
|
47
47
|
cryptosuite: "eddsa-jcs-2022",
|
|
48
48
|
verificationMethod: keyId.href,
|
|
49
49
|
proofPurpose: "assertionMethod",
|
|
50
50
|
created: created.toString()
|
|
51
|
-
};
|
|
52
|
-
const proofCanon = serialize(proofConfig);
|
|
51
|
+
});
|
|
53
52
|
const proofBytes = encoder.encode(proofCanon);
|
|
54
53
|
const proofDigest = await crypto.subtle.digest("SHA-256", proofBytes);
|
|
55
54
|
const digest = new Uint8Array(proofDigest.byteLength + msgDigest.byteLength);
|
|
@@ -75,7 +74,7 @@ async function createProof(object, privateKey, keyId, { contextLoader, context:
|
|
|
75
74
|
* @since 0.10.0
|
|
76
75
|
*/
|
|
77
76
|
async function signObject(object, privateKey, keyId, options = {}) {
|
|
78
|
-
return await (options.tracerProvider ?? trace.getTracerProvider()).getTracer(
|
|
77
|
+
return await (options.tracerProvider ?? trace.getTracerProvider()).getTracer(name, version).startActiveSpan("object_integrity_proofs.sign", { attributes: { "activitypub.object.type": getTypeId(object).href } }, async (span) => {
|
|
79
78
|
try {
|
|
80
79
|
if (object.id != null) span.setAttribute("activitypub.object.id", object.id.href);
|
|
81
80
|
const existingProofs = [];
|
|
@@ -109,7 +108,7 @@ async function signObject(object, privateKey, keyId, options = {}) {
|
|
|
109
108
|
* @since 0.10.0
|
|
110
109
|
*/
|
|
111
110
|
async function verifyProof(jsonLd, proof, options = {}) {
|
|
112
|
-
return await (options.tracerProvider ?? trace.getTracerProvider()).getTracer(
|
|
111
|
+
return await (options.tracerProvider ?? trace.getTracerProvider()).getTracer(name, version).startActiveSpan("object_integrity_proofs.verify", async (span) => {
|
|
113
112
|
if (span.isRecording()) {
|
|
114
113
|
if (proof.cryptosuite != null) span.setAttribute("object_integrity_proofs.cryptosuite", proof.cryptosuite);
|
|
115
114
|
if (proof.verificationMethodId != null) span.setAttribute("object_integrity_proofs.key_id", proof.verificationMethodId.href);
|
|
@@ -133,15 +132,14 @@ async function verifyProof(jsonLd, proof, options = {}) {
|
|
|
133
132
|
async function verifyProofInternal(jsonLd, proof, options) {
|
|
134
133
|
if (typeof jsonLd !== "object" || proof.cryptosuite !== "eddsa-jcs-2022" || proof.verificationMethodId == null || proof.proofPurpose !== "assertionMethod" || proof.proofValue == null || proof.created == null) return null;
|
|
135
134
|
const publicKeyPromise = fetchKey(proof.verificationMethodId, Multikey, options);
|
|
136
|
-
const
|
|
135
|
+
const proofCanon = serialize({
|
|
137
136
|
"@context": jsonLd["@context"],
|
|
138
137
|
type: "DataIntegrityProof",
|
|
139
138
|
cryptosuite: proof.cryptosuite,
|
|
140
139
|
verificationMethod: proof.verificationMethodId.href,
|
|
141
140
|
proofPurpose: proof.proofPurpose,
|
|
142
141
|
created: proof.created.toString()
|
|
143
|
-
};
|
|
144
|
-
const proofCanon = serialize(proofConfig);
|
|
142
|
+
});
|
|
145
143
|
const encoder = new TextEncoder();
|
|
146
144
|
const proofBytes = encoder.encode(proofCanon);
|
|
147
145
|
const proofDigest = await crypto.subtle.digest("SHA-256", proofBytes);
|
|
@@ -254,4 +252,4 @@ async function verifyObject(cls, jsonLd, options = {}) {
|
|
|
254
252
|
}
|
|
255
253
|
|
|
256
254
|
//#endregion
|
|
257
|
-
export {
|
|
255
|
+
export { verifyProof as i, signObject as n, verifyObject as r, createProof as t };
|
|
@@ -3,29 +3,26 @@
|
|
|
3
3
|
import { URLPattern } from "urlpattern-polyfill";
|
|
4
4
|
globalThis.addEventListener = () => {};
|
|
5
5
|
|
|
6
|
-
import
|
|
7
|
-
import "../
|
|
8
|
-
import "../
|
|
9
|
-
import "../
|
|
10
|
-
import
|
|
11
|
-
import "../
|
|
12
|
-
import "../
|
|
13
|
-
import "../
|
|
14
|
-
import "../
|
|
15
|
-
import "../
|
|
16
|
-
import "../
|
|
17
|
-
import "../
|
|
18
|
-
import {
|
|
19
|
-
import
|
|
20
|
-
import {
|
|
21
|
-
import "../
|
|
22
|
-
import
|
|
23
|
-
import "../
|
|
24
|
-
import "../
|
|
25
|
-
import "../
|
|
26
|
-
import { mockDocumentLoader } from "../docloader-09nVWLAZ.js";
|
|
27
|
-
import { rsaPrivateKey2 } from "../keys-DGJec4-R.js";
|
|
28
|
-
import { esm_default } from "../esm-DO9PrujO.js";
|
|
6
|
+
import "../chunk.js";
|
|
7
|
+
import { t as assertEquals } from "../assert_equals.js";
|
|
8
|
+
import "../docloader.js";
|
|
9
|
+
import { t as UrlError } from "../url.js";
|
|
10
|
+
import "../multibase.js";
|
|
11
|
+
import "../vocab.js";
|
|
12
|
+
import "../langstr.js";
|
|
13
|
+
import "../lookup.js";
|
|
14
|
+
import "../actor.js";
|
|
15
|
+
import "../key2.js";
|
|
16
|
+
import { l as verifyRequest } from "../http.js";
|
|
17
|
+
import { t as getAuthenticatedDocumentLoader } from "../authdocloader.js";
|
|
18
|
+
import { t as test } from "../testing.js";
|
|
19
|
+
import "../std__assert.js";
|
|
20
|
+
import { t as assertRejects } from "../assert_rejects.js";
|
|
21
|
+
import "../assert_is_error.js";
|
|
22
|
+
import "../assert_throws.js";
|
|
23
|
+
import { t as mockDocumentLoader } from "../docloader2.js";
|
|
24
|
+
import { i as rsaPrivateKey2 } from "../keys.js";
|
|
25
|
+
import { t as esm_default } from "../esm.js";
|
|
29
26
|
|
|
30
27
|
//#region runtime/authdocloader.test.ts
|
|
31
28
|
test("getAuthenticatedDocumentLoader()", async (t) => {
|
|
@@ -39,11 +36,10 @@ test("getAuthenticatedDocumentLoader()", async (t) => {
|
|
|
39
36
|
return new Response(JSON.stringify(v != null), { headers: { "Content-Type": "application/json" } });
|
|
40
37
|
});
|
|
41
38
|
await t.step("test", async () => {
|
|
42
|
-
|
|
39
|
+
assertEquals(await (await getAuthenticatedDocumentLoader({
|
|
43
40
|
keyId: new URL("https://example.com/key2"),
|
|
44
41
|
privateKey: rsaPrivateKey2
|
|
45
|
-
})
|
|
46
|
-
assertEquals(await loader("https://example.com/object"), {
|
|
42
|
+
}))("https://example.com/object"), {
|
|
47
43
|
contextUrl: null,
|
|
48
44
|
documentUrl: "https://example.com/object",
|
|
49
45
|
document: true
|
|
@@ -3,20 +3,19 @@
|
|
|
3
3
|
import { URLPattern } from "urlpattern-polyfill";
|
|
4
4
|
globalThis.addEventListener = () => {};
|
|
5
5
|
|
|
6
|
-
import
|
|
7
|
-
import "../
|
|
8
|
-
import "../
|
|
9
|
-
import { MemoryKvStore } from "../kv
|
|
10
|
-
import {
|
|
11
|
-
import { UrlError } from "../url
|
|
12
|
-
import { test } from "../testing
|
|
13
|
-
import "../std__assert
|
|
14
|
-
import { assertRejects } from "../assert_rejects
|
|
15
|
-
import "../assert_is_error
|
|
16
|
-
import "../
|
|
17
|
-
import {
|
|
18
|
-
import {
|
|
19
|
-
import { esm_default } from "../esm-DO9PrujO.js";
|
|
6
|
+
import "../chunk.js";
|
|
7
|
+
import { t as assertEquals } from "../assert_equals.js";
|
|
8
|
+
import { t as assert } from "../assert.js";
|
|
9
|
+
import { t as MemoryKvStore } from "../kv.js";
|
|
10
|
+
import { d as version, i as getDocumentLoader, l as contexts_default, o as getUserAgent, s as kvCache, t as FetchError } from "../docloader.js";
|
|
11
|
+
import { t as UrlError } from "../url.js";
|
|
12
|
+
import { t as test } from "../testing.js";
|
|
13
|
+
import "../std__assert.js";
|
|
14
|
+
import { t as assertRejects } from "../assert_rejects.js";
|
|
15
|
+
import "../assert_is_error.js";
|
|
16
|
+
import { t as assertThrows } from "../assert_throws.js";
|
|
17
|
+
import { t as mockDocumentLoader } from "../docloader2.js";
|
|
18
|
+
import { t as esm_default } from "../esm.js";
|
|
20
19
|
import process from "node:process";
|
|
21
20
|
|
|
22
21
|
//#region runtime/docloader.test.ts
|
|
@@ -287,6 +286,17 @@ test("getDocumentLoader()", async (t) => {
|
|
|
287
286
|
assertEquals(await fetchDocumentLoader2("https://example.com/localhost-redirect"), expected);
|
|
288
287
|
assertEquals(await fetchDocumentLoader2("https://example.com/localhost-link"), expected);
|
|
289
288
|
});
|
|
289
|
+
const maliciousPayload = "<a" + " a=\"b\"".repeat(30) + " ";
|
|
290
|
+
esm_default.get("https://example.com/redos", {
|
|
291
|
+
body: maliciousPayload,
|
|
292
|
+
headers: { "Content-Type": "text/html; charset=utf-8" }
|
|
293
|
+
});
|
|
294
|
+
await t.step("ReDoS resistance (CVE-2025-68475)", async () => {
|
|
295
|
+
const start = performance.now();
|
|
296
|
+
await assertRejects(() => fetchDocumentLoader("https://example.com/redos"), SyntaxError);
|
|
297
|
+
const elapsed = performance.now() - start;
|
|
298
|
+
assert(elapsed < 1e3, `Potential ReDoS vulnerability detected: ${elapsed}ms (expected < 1000ms)`);
|
|
299
|
+
});
|
|
290
300
|
esm_default.hardReset();
|
|
291
301
|
});
|
|
292
302
|
test("kvCache()", async (t) => {
|
|
@@ -313,12 +323,11 @@ test("kvCache()", async (t) => {
|
|
|
313
323
|
type: "Object"
|
|
314
324
|
}
|
|
315
325
|
});
|
|
316
|
-
|
|
326
|
+
assertEquals(await kv.get([
|
|
317
327
|
"_test",
|
|
318
328
|
"cached",
|
|
319
329
|
"https://example.com/object"
|
|
320
|
-
]);
|
|
321
|
-
assertEquals(cache, result);
|
|
330
|
+
]), result);
|
|
322
331
|
await kv.set([
|
|
323
332
|
"_test",
|
|
324
333
|
"cached",
|
|
@@ -328,8 +337,7 @@ test("kvCache()", async (t) => {
|
|
|
328
337
|
documentUrl: "https://example.org/",
|
|
329
338
|
document: { "id": "https://example.org/" }
|
|
330
339
|
});
|
|
331
|
-
|
|
332
|
-
assertEquals(result2, {
|
|
340
|
+
assertEquals(await loader("https://example.org/"), {
|
|
333
341
|
contextUrl: null,
|
|
334
342
|
documentUrl: "https://example.org/",
|
|
335
343
|
document: { "id": "https://example.org/" }
|
|
@@ -343,21 +351,19 @@ test("kvCache()", async (t) => {
|
|
|
343
351
|
documentUrl: "https://example.net/",
|
|
344
352
|
document: { "id": "https://example.net/" }
|
|
345
353
|
});
|
|
346
|
-
|
|
347
|
-
assertEquals(result3, {
|
|
354
|
+
assertEquals(await loader("https://example.net/"), {
|
|
348
355
|
contextUrl: null,
|
|
349
356
|
documentUrl: "https://example.net/",
|
|
350
357
|
document: { "id": "https://example.net/" }
|
|
351
358
|
});
|
|
352
359
|
});
|
|
353
360
|
await t.step("not cached", async () => {
|
|
354
|
-
|
|
361
|
+
assertEquals(await kvCache({
|
|
355
362
|
kv,
|
|
356
363
|
loader: mockDocumentLoader,
|
|
357
364
|
rules: [],
|
|
358
365
|
prefix: ["_test", "not cached"]
|
|
359
|
-
})("https://example.com/object")
|
|
360
|
-
assertEquals(result, {
|
|
366
|
+
})("https://example.com/object"), {
|
|
361
367
|
contextUrl: null,
|
|
362
368
|
documentUrl: "https://example.com/object",
|
|
363
369
|
document: {
|
|
@@ -367,12 +373,11 @@ test("kvCache()", async (t) => {
|
|
|
367
373
|
type: "Object"
|
|
368
374
|
}
|
|
369
375
|
});
|
|
370
|
-
|
|
376
|
+
assertEquals(await kv.get([
|
|
371
377
|
"test2",
|
|
372
378
|
"not cached",
|
|
373
379
|
"https://example.com/object"
|
|
374
|
-
]);
|
|
375
|
-
assertEquals(cache, void 0);
|
|
380
|
+
]), void 0);
|
|
376
381
|
});
|
|
377
382
|
await t.step("maximum cache duration", () => {
|
|
378
383
|
assertThrows(() => kvCache({
|
|
@@ -404,7 +409,7 @@ test("kvCache()", async (t) => {
|
|
|
404
409
|
throw new Error("Failed to delete key");
|
|
405
410
|
}
|
|
406
411
|
}
|
|
407
|
-
|
|
412
|
+
assertEquals(await kvCache({
|
|
408
413
|
kv: new KvStoreThrowsException(),
|
|
409
414
|
loader: mockDocumentLoader,
|
|
410
415
|
rules: [
|
|
@@ -413,8 +418,7 @@ test("kvCache()", async (t) => {
|
|
|
413
418
|
[new URLPattern("https://example.com/*"), Temporal.Duration.from({ days: 30 })]
|
|
414
419
|
],
|
|
415
420
|
prefix: ["_test", "not cached"]
|
|
416
|
-
})("https://example.com/object")
|
|
417
|
-
assertEquals(result, {
|
|
421
|
+
})("https://example.com/object"), {
|
|
418
422
|
contextUrl: null,
|
|
419
423
|
documentUrl: "https://example.com/object",
|
|
420
424
|
document: {
|
|
@@ -443,23 +447,20 @@ test("kvCache()", async (t) => {
|
|
|
443
447
|
});
|
|
444
448
|
const activityStreamsUrl = "https://www.w3.org/ns/activitystreams";
|
|
445
449
|
loaderCalled = false;
|
|
446
|
-
|
|
447
|
-
assertEquals(result, {
|
|
450
|
+
assertEquals(await loader(activityStreamsUrl), {
|
|
448
451
|
contextUrl: null,
|
|
449
452
|
documentUrl: activityStreamsUrl,
|
|
450
453
|
document: contexts_default[activityStreamsUrl]
|
|
451
454
|
});
|
|
452
455
|
assertEquals(loaderCalled, false, "Loader should not be called for preloaded contexts");
|
|
453
|
-
|
|
456
|
+
assertEquals(await kv$1.get([
|
|
454
457
|
"_test",
|
|
455
458
|
"preloaded",
|
|
456
459
|
activityStreamsUrl
|
|
457
|
-
]);
|
|
458
|
-
assertEquals(cachedValue, void 0, "Preloaded contexts should not be cached in KV store");
|
|
460
|
+
]), void 0, "Preloaded contexts should not be cached in KV store");
|
|
459
461
|
const securityUrl = "https://w3id.org/security/v1";
|
|
460
462
|
loaderCalled = false;
|
|
461
|
-
|
|
462
|
-
assertEquals(result2, {
|
|
463
|
+
assertEquals(await loader(securityUrl), {
|
|
463
464
|
contextUrl: null,
|
|
464
465
|
documentUrl: securityUrl,
|
|
465
466
|
document: contexts_default[securityUrl]
|
|
@@ -474,47 +475,46 @@ test("kvCache()", async (t) => {
|
|
|
474
475
|
document: { "mock": "document" }
|
|
475
476
|
});
|
|
476
477
|
assertEquals(loaderCalled, true, "Loader should be called for non-preloaded URLs");
|
|
477
|
-
|
|
478
|
+
assertEquals(await kv$1.get([
|
|
478
479
|
"_test",
|
|
479
480
|
"preloaded",
|
|
480
481
|
nonPreloadedUrl
|
|
481
|
-
]);
|
|
482
|
-
assertEquals(cachedValue2, result3, "Non-preloaded URLs should be cached");
|
|
482
|
+
]), result3, "Non-preloaded URLs should be cached");
|
|
483
483
|
});
|
|
484
484
|
});
|
|
485
485
|
test("getUserAgent()", () => {
|
|
486
486
|
if ("Deno" in globalThis) {
|
|
487
|
-
assertEquals(getUserAgent(), `Fedify/${
|
|
488
|
-
assertEquals(getUserAgent({ software: "MyApp/1.0.0" }), `MyApp/1.0.0 (Fedify/${
|
|
489
|
-
assertEquals(getUserAgent({ url: "https://example.com/" }), `Fedify/${
|
|
487
|
+
assertEquals(getUserAgent(), `Fedify/${version} (Deno/${Deno.version.deno})`);
|
|
488
|
+
assertEquals(getUserAgent({ software: "MyApp/1.0.0" }), `MyApp/1.0.0 (Fedify/${version}; Deno/${Deno.version.deno})`);
|
|
489
|
+
assertEquals(getUserAgent({ url: "https://example.com/" }), `Fedify/${version} (Deno/${Deno.version.deno}; +https://example.com/)`);
|
|
490
490
|
assertEquals(getUserAgent({
|
|
491
491
|
software: "MyApp/1.0.0",
|
|
492
492
|
url: new URL("https://example.com/")
|
|
493
|
-
}), `MyApp/1.0.0 (Fedify/${
|
|
493
|
+
}), `MyApp/1.0.0 (Fedify/${version}; Deno/${Deno.version.deno}; +https://example.com/)`);
|
|
494
494
|
} else if ("Bun" in globalThis) {
|
|
495
|
-
assertEquals(getUserAgent(), `Fedify/${
|
|
496
|
-
assertEquals(getUserAgent({ software: "MyApp/1.0.0" }), `MyApp/1.0.0 (Fedify/${
|
|
497
|
-
assertEquals(getUserAgent({ url: "https://example.com/" }), `Fedify/${
|
|
495
|
+
assertEquals(getUserAgent(), `Fedify/${version} (Bun/${Bun.version})`);
|
|
496
|
+
assertEquals(getUserAgent({ software: "MyApp/1.0.0" }), `MyApp/1.0.0 (Fedify/${version}; Bun/${Bun.version})`);
|
|
497
|
+
assertEquals(getUserAgent({ url: "https://example.com/" }), `Fedify/${version} (Bun/${Bun.version}; +https://example.com/)`);
|
|
498
498
|
assertEquals(getUserAgent({
|
|
499
499
|
software: "MyApp/1.0.0",
|
|
500
500
|
url: new URL("https://example.com/")
|
|
501
|
-
}), `MyApp/1.0.0 (Fedify/${
|
|
501
|
+
}), `MyApp/1.0.0 (Fedify/${version}; Bun/${Bun.version}; +https://example.com/)`);
|
|
502
502
|
} else if (navigator.userAgent === "Cloudflare-Workers") {
|
|
503
|
-
assertEquals(getUserAgent(), `Fedify/${
|
|
504
|
-
assertEquals(getUserAgent({ software: "MyApp/1.0.0" }), `MyApp/1.0.0 (Fedify/${
|
|
505
|
-
assertEquals(getUserAgent({ url: "https://example.com/" }), `Fedify/${
|
|
503
|
+
assertEquals(getUserAgent(), `Fedify/${version} (Cloudflare-Workers)`);
|
|
504
|
+
assertEquals(getUserAgent({ software: "MyApp/1.0.0" }), `MyApp/1.0.0 (Fedify/${version}; Cloudflare-Workers)`);
|
|
505
|
+
assertEquals(getUserAgent({ url: "https://example.com/" }), `Fedify/${version} (Cloudflare-Workers; +https://example.com/)`);
|
|
506
506
|
assertEquals(getUserAgent({
|
|
507
507
|
software: "MyApp/1.0.0",
|
|
508
508
|
url: new URL("https://example.com/")
|
|
509
|
-
}), `MyApp/1.0.0 (Fedify/${
|
|
509
|
+
}), `MyApp/1.0.0 (Fedify/${version}; Cloudflare-Workers; +https://example.com/)`);
|
|
510
510
|
} else {
|
|
511
|
-
assertEquals(getUserAgent(), `Fedify/${
|
|
512
|
-
assertEquals(getUserAgent({ software: "MyApp/1.0.0" }), `MyApp/1.0.0 (Fedify/${
|
|
513
|
-
assertEquals(getUserAgent({ url: "https://example.com/" }), `Fedify/${
|
|
511
|
+
assertEquals(getUserAgent(), `Fedify/${version} (Node.js/${process.versions.node})`);
|
|
512
|
+
assertEquals(getUserAgent({ software: "MyApp/1.0.0" }), `MyApp/1.0.0 (Fedify/${version}; Node.js/${process.versions.node})`);
|
|
513
|
+
assertEquals(getUserAgent({ url: "https://example.com/" }), `Fedify/${version} (Node.js/${process.versions.node}; +https://example.com/)`);
|
|
514
514
|
assertEquals(getUserAgent({
|
|
515
515
|
software: "MyApp/1.0.0",
|
|
516
516
|
url: new URL("https://example.com/")
|
|
517
|
-
}), `MyApp/1.0.0 (Fedify/${
|
|
517
|
+
}), `MyApp/1.0.0 (Fedify/${version}; Node.js/${process.versions.node}; +https://example.com/)`);
|
|
518
518
|
}
|
|
519
519
|
});
|
|
520
520
|
|