@fedify/vocab-runtime 2.4.0-pr.936.41 → 2.4.1
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 +4 -2
- package/dist/{tests/docloader-Ck8bcBir.mjs → contexts-B09jb9Pi.cjs} +173 -274
- package/dist/{tests/docloader-S_gQZ2tt.cjs → contexts-DWrj4AGR.js} +169 -293
- package/dist/{docloader-C_dir7Xb.d.ts → docloader-BMHljyYb.d.cts} +68 -2
- package/dist/{docloader-D2DTRiyA.d.cts → docloader-BMHljyYb.d.ts} +68 -2
- package/dist/internal/jsonld-cache.cjs +70 -1
- package/dist/internal/jsonld-cache.d.cts +35 -2
- package/dist/internal/jsonld-cache.d.ts +35 -2
- package/dist/internal/jsonld-cache.js +67 -2
- package/dist/internal/portable-dereference.cjs +721 -0
- package/dist/internal/portable-dereference.d.cts +349 -0
- package/dist/internal/portable-dereference.d.ts +349 -0
- package/dist/internal/portable-dereference.js +702 -0
- package/dist/internal/signed-representation.cjs +378 -0
- package/dist/internal/signed-representation.d.cts +144 -0
- package/dist/internal/signed-representation.d.ts +144 -0
- package/dist/internal/signed-representation.js +371 -0
- package/dist/jsonld.cjs +2 -2
- package/dist/mod.cjs +762 -4529
- package/dist/mod.d.cts +427 -9
- package/dist/mod.d.ts +427 -10
- package/dist/mod.js +742 -4524
- package/dist/portable-6Aj-7dZJ.d.cts +160 -0
- package/dist/portable-nkTiqH0w.d.ts +160 -0
- package/dist/tests/body-DpC9p-iG.mjs +130 -0
- package/dist/tests/body-cKLBprYm.cjs +153 -0
- package/dist/tests/body.test.cjs +89 -0
- package/dist/tests/body.test.d.cts +1 -0
- package/dist/tests/body.test.d.mts +1 -0
- package/dist/tests/body.test.mjs +90 -0
- package/dist/tests/contexts-C9Lj11SC.cjs +4533 -0
- package/dist/tests/contexts-duRA_dDC.mjs +4522 -0
- package/dist/tests/decimal.test.cjs +9 -7
- package/dist/tests/decimal.test.mjs +9 -6
- package/dist/tests/digest-3FeH2Y-Q.cjs +176 -0
- package/dist/tests/digest-COC7xDiQ.mjs +141 -0
- package/dist/tests/digest.test.cjs +102 -0
- package/dist/tests/digest.test.d.cts +1 -0
- package/dist/tests/digest.test.d.mts +1 -0
- package/dist/tests/digest.test.mjs +103 -0
- package/dist/tests/docloader-DyZ1JGIl.cjs +398 -0
- package/dist/tests/docloader-tUmMeXjU.mjs +375 -0
- package/dist/tests/docloader.test.cjs +816 -39
- package/dist/tests/docloader.test.mjs +810 -34
- package/dist/tests/internal/multicodec.test.cjs +2 -3
- package/dist/tests/internal/multicodec.test.mjs +2 -2
- package/dist/tests/internal/portable-dereference.test.cjs +172 -0
- package/dist/tests/internal/portable-dereference.test.d.cts +1 -0
- package/dist/tests/internal/portable-dereference.test.d.mts +1 -0
- package/dist/tests/internal/portable-dereference.test.mjs +173 -0
- package/dist/tests/jsonld-CmDhHNTx.cjs +12 -0
- package/dist/tests/jsonld-DweIJ07b.mjs +5 -0
- package/dist/tests/jsonld-cache-BEXiiM-V.cjs +386 -0
- package/dist/tests/jsonld-cache-DFnWsLuZ.mjs +339 -0
- package/dist/tests/jsonld-cache.test.cjs +102 -298
- package/dist/tests/jsonld-cache.test.mjs +95 -289
- package/dist/tests/{key-_wXwomh_.cjs → key-C-AYkdJJ.cjs} +11 -4
- package/dist/tests/{key-CDGDH_vC.mjs → key-C2Db_TAJ.mjs} +11 -3
- package/dist/tests/key.test.cjs +6 -5
- package/dist/tests/key.test.mjs +6 -4
- package/dist/tests/{langstr-Di5AvKpB.mjs → langstr-DYRmJqFn.mjs} +5 -2
- package/dist/tests/{langstr-CbAxaeEZ.cjs → langstr-_PqsL1ae.cjs} +5 -2
- package/dist/tests/langstr.test.cjs +11 -4
- package/dist/tests/langstr.test.mjs +9 -2
- package/dist/tests/langtag-CUppHs_s.mjs +45 -0
- package/dist/tests/langtag-Czjvxfzx.cjs +50 -0
- package/dist/tests/langtag.test.cjs +45 -0
- package/dist/tests/langtag.test.d.cts +1 -0
- package/dist/tests/langtag.test.d.mts +1 -0
- package/dist/tests/langtag.test.mjs +46 -0
- package/dist/tests/link.test.cjs +2 -3
- package/dist/tests/link.test.mjs +2 -2
- package/dist/tests/multibase/multibase.test.cjs +8 -9
- package/dist/tests/multibase/multibase.test.mjs +6 -6
- package/dist/tests/{multibase-Bz_UUDtL.cjs → multibase-B5Mea7Ip.cjs} +19 -2
- package/dist/tests/{multibase-B4bvakyA.mjs → multibase-BPnF_L4e.mjs} +12 -1
- package/dist/tests/portable-dereference-DmTYDy2p.mjs +250 -0
- package/dist/tests/portable-dereference-qTLMqe2_.cjs +279 -0
- package/dist/tests/portable-media-5p8azal0.cjs +153 -0
- package/dist/tests/portable-media-B_lt9MMA.mjs +148 -0
- package/dist/tests/portable-media.test.cjs +222 -0
- package/dist/tests/portable-media.test.d.cts +1 -0
- package/dist/tests/portable-media.test.d.mts +1 -0
- package/dist/tests/portable-media.test.mjs +223 -0
- package/dist/tests/portable-workers.test.cjs +36 -0
- package/dist/tests/portable-workers.test.d.cts +2 -0
- package/dist/tests/portable-workers.test.d.mts +2 -0
- package/dist/tests/portable-workers.test.mjs +35 -0
- package/dist/tests/{request-uk51rkhO.cjs → request-BgjA9wyl.cjs} +10 -4
- package/dist/tests/{request-C8CaGwtt.mjs → request-DodZNukP.mjs} +8 -2
- package/dist/tests/request.test.cjs +7 -4
- package/dist/tests/request.test.mjs +5 -2
- package/dist/tests/signed-representation.test.cjs +588 -0
- package/dist/tests/signed-representation.test.d.cts +1 -0
- package/dist/tests/signed-representation.test.d.mts +1 -0
- package/dist/tests/signed-representation.test.mjs +589 -0
- package/dist/tests/temporal.test.cjs +1 -2
- package/dist/tests/temporal.test.mjs +1 -1
- package/dist/tests/url-BNakuZ8k.cjs +998 -0
- package/dist/tests/url-DMxmp7ZG.mjs +859 -0
- package/dist/tests/url.test.cjs +489 -6
- package/dist/tests/url.test.mjs +489 -5
- package/dist/url-DrGTR8yv.cjs +993 -0
- package/dist/url-Dzyp-NsC.js +860 -0
- package/package.json +27 -4
- package/scripts/test-bun.mjs +17 -0
- package/src/body.test.ts +125 -0
- package/src/body.ts +152 -0
- package/src/contexts/cid-v1.json +114 -0
- package/src/contexts/fep-22cd.json +21 -0
- package/src/contexts/fep-6757.json +12 -0
- package/src/contexts/joinmastodon.json +1 -1
- package/src/contexts/miscellany.json +17 -0
- package/src/contexts.ts +47 -1
- package/src/digest.test.ts +220 -0
- package/src/digest.ts +229 -0
- package/src/docloader.test.ts +1066 -27
- package/src/docloader.ts +322 -105
- package/src/internal/jsonld-cache.ts +97 -1
- package/src/internal/portable-dereference.test.ts +254 -0
- package/src/internal/portable-dereference.ts +1000 -0
- package/src/internal/signed-representation.ts +565 -0
- package/src/jsonld-cache.test.ts +89 -0
- package/src/key.test.ts +9 -0
- package/src/key.ts +11 -1
- package/src/langstr.test.ts +18 -1
- package/src/langstr.ts +6 -2
- package/src/langtag.test.ts +53 -0
- package/src/langtag.ts +76 -0
- package/src/mod.ts +29 -0
- package/src/multibase/multibase.test.ts +5 -5
- package/src/portable-media.test.ts +293 -0
- package/src/portable-media.ts +264 -0
- package/src/portable-workers.test.ts +81 -0
- package/src/portable.ts +180 -0
- package/src/preprocessor.ts +7 -0
- package/src/request.test.ts +10 -1
- package/src/request.ts +9 -1
- package/src/signed-representation.test.ts +338 -0
- package/src/url.test.ts +823 -3
- package/src/url.ts +700 -23
- package/tsdown.config.ts +2 -0
- package/dist/tests/url-CsOV_B_P.cjs +0 -482
- package/dist/tests/url-Du7RQQgP.mjs +0 -392
- package/dist/url-DD4F0ULf.cjs +0 -483
- package/dist/url-DGVbSVVi.js +0 -393
- /package/dist/{chunk-M78iaK0I.cjs → rolldown-runtime-B7lfambq.cjs} +0 -0
- /package/dist/tests/{link-NUUWCdnK.mjs → link-Cevmc87v.mjs} +0 -0
- /package/dist/tests/{link-FguCydMA.cjs → link-DlKm8bEr.cjs} +0 -0
- /package/dist/tests/{multicodec-CxGVGa91.cjs → multicodec-CLRPeW4N.cjs} +0 -0
- /package/dist/tests/{multicodec-CyFp54fI.mjs → multicodec-CRIj_05H.mjs} +0 -0
- /package/dist/tests/{chunk-C2EiDwsr.cjs → rolldown-runtime-emK7D4bc.cjs} +0 -0
|
@@ -0,0 +1,222 @@
|
|
|
1
|
+
const require_digest = require("./digest-3FeH2Y-Q.cjs");
|
|
2
|
+
const require_portable_media = require("./portable-media-5p8azal0.cjs");
|
|
3
|
+
let node_assert_strict = require("node:assert/strict");
|
|
4
|
+
let node_test = require("node:test");
|
|
5
|
+
let node_http = require("node:http");
|
|
6
|
+
//#region src/portable-media.test.ts
|
|
7
|
+
const bytes = new TextEncoder().encode("portable image");
|
|
8
|
+
const digest = "zQmU2Jds4B2J83K7CrYC34CEJdB6vCLyqkM2cgBxYeaNWTA";
|
|
9
|
+
const hashlink = require_digest.createHashlink(digest);
|
|
10
|
+
const networkTest = (name, run) => (0, node_test.test)(name, async (t) => {
|
|
11
|
+
if ("Deno" in globalThis && (await Deno.permissions.query({ name: "net" })).state !== "granted") {
|
|
12
|
+
t.skip("Requires network permission for a local test server.");
|
|
13
|
+
return;
|
|
14
|
+
}
|
|
15
|
+
await run();
|
|
16
|
+
});
|
|
17
|
+
async function withServers(handlers, run) {
|
|
18
|
+
const servers = handlers.map((handler) => (0, node_http.createServer)(async (request, reply) => {
|
|
19
|
+
const result = handler(request.url ?? "/");
|
|
20
|
+
if (result == null) return;
|
|
21
|
+
reply.writeHead(result.status, Object.fromEntries(result.headers));
|
|
22
|
+
reply.end(new Uint8Array(await result.arrayBuffer()));
|
|
23
|
+
}));
|
|
24
|
+
try {
|
|
25
|
+
const origins = [];
|
|
26
|
+
for (const server of servers) {
|
|
27
|
+
await new Promise((resolve, reject) => {
|
|
28
|
+
server.once("error", reject);
|
|
29
|
+
server.listen(0, "127.0.0.1", resolve);
|
|
30
|
+
});
|
|
31
|
+
const address = server.address();
|
|
32
|
+
if (address == null || typeof address === "string") throw new Error("Server did not bind a TCP port.");
|
|
33
|
+
origins.push(`http://127.0.0.1:${address.port}`);
|
|
34
|
+
}
|
|
35
|
+
await run(origins);
|
|
36
|
+
} finally {
|
|
37
|
+
await Promise.all(servers.map(async (server) => {
|
|
38
|
+
server.closeAllConnections();
|
|
39
|
+
await new Promise((resolve) => server.close(() => resolve()));
|
|
40
|
+
}));
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
networkTest("fetchPortableMedia() accepts Link, Image, and Document", async () => {
|
|
44
|
+
const link = {
|
|
45
|
+
href: new URL(hashlink),
|
|
46
|
+
digestMultibase: digest
|
|
47
|
+
};
|
|
48
|
+
const image = {
|
|
49
|
+
url: new URL(hashlink),
|
|
50
|
+
digestMultibase: digest
|
|
51
|
+
};
|
|
52
|
+
const document = { url: {
|
|
53
|
+
href: new URL(hashlink),
|
|
54
|
+
digestMultibase: digest
|
|
55
|
+
} };
|
|
56
|
+
const requested = [];
|
|
57
|
+
await withServers([(path) => {
|
|
58
|
+
requested.push(path);
|
|
59
|
+
return new Response(bytes);
|
|
60
|
+
}], async ([gateway]) => {
|
|
61
|
+
for (const media of [
|
|
62
|
+
link,
|
|
63
|
+
image,
|
|
64
|
+
document
|
|
65
|
+
]) (0, node_assert_strict.equal)(await (await require_portable_media.fetchPortableMedia(media, {
|
|
66
|
+
gateways: [gateway],
|
|
67
|
+
allowPrivateAddress: true
|
|
68
|
+
})).text(), "portable image");
|
|
69
|
+
});
|
|
70
|
+
(0, node_assert_strict.deepStrictEqual)(requested, Array(3).fill(`/.well-known/apgateway/${hashlink}`));
|
|
71
|
+
});
|
|
72
|
+
networkTest("fetchPortableMedia() falls back on status and digest mismatch", async () => {
|
|
73
|
+
const requested = [];
|
|
74
|
+
await withServers([
|
|
75
|
+
(path) => {
|
|
76
|
+
requested.push(`first:${path}`);
|
|
77
|
+
return new Response(null, { status: 503 });
|
|
78
|
+
},
|
|
79
|
+
(path) => {
|
|
80
|
+
requested.push(`second:${path}`);
|
|
81
|
+
return new Response("wrong bytes");
|
|
82
|
+
},
|
|
83
|
+
(path) => {
|
|
84
|
+
requested.push(`third:${path}`);
|
|
85
|
+
return new Response(bytes, { headers: {
|
|
86
|
+
"Content-Type": "image/png",
|
|
87
|
+
"Set-Cookie": "secret=1"
|
|
88
|
+
} });
|
|
89
|
+
}
|
|
90
|
+
], async (gateways) => {
|
|
91
|
+
const result = await require_portable_media.fetchPortableMedia({
|
|
92
|
+
url: new URL(hashlink),
|
|
93
|
+
digestMultibase: digest
|
|
94
|
+
}, {
|
|
95
|
+
gateways,
|
|
96
|
+
allowPrivateAddress: true
|
|
97
|
+
});
|
|
98
|
+
(0, node_assert_strict.equal)(await result.text(), "portable image");
|
|
99
|
+
(0, node_assert_strict.equal)(result.headers.get("Content-Type"), "image/png");
|
|
100
|
+
(0, node_assert_strict.equal)(result.headers.get("Set-Cookie"), null);
|
|
101
|
+
});
|
|
102
|
+
(0, node_assert_strict.deepStrictEqual)(requested.map((r) => r.split(":")[0]), [
|
|
103
|
+
"first",
|
|
104
|
+
"second",
|
|
105
|
+
"third"
|
|
106
|
+
]);
|
|
107
|
+
});
|
|
108
|
+
networkTest("fetchPortableMedia() verifies direct HTTP media", async () => {
|
|
109
|
+
const wrongDigest = await require_digest.computeDigestMultibase(/* @__PURE__ */ new Uint8Array());
|
|
110
|
+
await withServers([() => new Response(bytes)], async ([origin]) => {
|
|
111
|
+
(0, node_assert_strict.equal)(await (await require_portable_media.fetchPortableMedia(`${origin}/a`, {
|
|
112
|
+
digestMultibase: digest,
|
|
113
|
+
allowPrivateAddress: true
|
|
114
|
+
})).text(), "portable image");
|
|
115
|
+
await (0, node_assert_strict.rejects)(() => require_portable_media.fetchPortableMedia(`${origin}/a`, {
|
|
116
|
+
digestMultibase: wrongDigest,
|
|
117
|
+
allowPrivateAddress: true
|
|
118
|
+
}), /digest does not match/);
|
|
119
|
+
});
|
|
120
|
+
});
|
|
121
|
+
(0, node_test.test)("fetchPortableMedia() rejects invalid references before fetching", async () => {
|
|
122
|
+
const wrongDigest = await require_digest.computeDigestMultibase(/* @__PURE__ */ new Uint8Array());
|
|
123
|
+
await (0, node_assert_strict.rejects)(() => require_portable_media.fetchPortableMedia({ url: new URL(hashlink) }), /requires digestMultibase/);
|
|
124
|
+
await (0, node_assert_strict.rejects)(() => require_portable_media.fetchPortableMedia({
|
|
125
|
+
url: new URL(hashlink),
|
|
126
|
+
digestMultibase: digest
|
|
127
|
+
}), /requires at least one gateway/);
|
|
128
|
+
await (0, node_assert_strict.rejects)(() => require_portable_media.fetchPortableMedia({
|
|
129
|
+
url: new URL(hashlink),
|
|
130
|
+
digestMultibase: wrongDigest
|
|
131
|
+
}, { gateways: ["https://example.com"] }), /disagree/);
|
|
132
|
+
await (0, node_assert_strict.rejects)(() => require_portable_media.fetchPortableMedia({
|
|
133
|
+
url: new URL("hl:invalid"),
|
|
134
|
+
digestMultibase: digest
|
|
135
|
+
}, { gateways: ["https://example.com"] }), TypeError);
|
|
136
|
+
await (0, node_assert_strict.rejects)(() => require_portable_media.fetchPortableMedia({
|
|
137
|
+
url: {
|
|
138
|
+
href: new URL(hashlink),
|
|
139
|
+
digestMultibase: wrongDigest
|
|
140
|
+
},
|
|
141
|
+
digestMultibase: digest
|
|
142
|
+
}, { gateways: ["https://example.com"] }), /digests disagree/);
|
|
143
|
+
await (0, node_assert_strict.rejects)(() => require_portable_media.fetchPortableMedia("file:///tmp/media", { digestMultibase: digest }), TypeError);
|
|
144
|
+
});
|
|
145
|
+
networkTest("fetchPortableMedia() bounds response bytes", async () => {
|
|
146
|
+
await withServers([() => new Response(bytes)], async ([origin]) => {
|
|
147
|
+
await (0, node_assert_strict.rejects)(() => require_portable_media.fetchPortableMedia(`${origin}/media`, {
|
|
148
|
+
digestMultibase: digest,
|
|
149
|
+
maxBytes: bytes.length - 1,
|
|
150
|
+
allowPrivateAddress: true
|
|
151
|
+
}), /exceeds the limit/);
|
|
152
|
+
});
|
|
153
|
+
await (0, node_assert_strict.rejects)(() => require_portable_media.fetchPortableMedia("https://example.com/media", {
|
|
154
|
+
digestMultibase: digest,
|
|
155
|
+
maxBytes: 0
|
|
156
|
+
}), RangeError);
|
|
157
|
+
});
|
|
158
|
+
(0, node_test.test)("fetchPortableMedia() rejects private media and gateways", async () => {
|
|
159
|
+
await (0, node_assert_strict.rejects)(() => require_portable_media.fetchPortableMedia("http://127.0.0.1/media", { digestMultibase: digest }), /private address/);
|
|
160
|
+
await (0, node_assert_strict.rejects)(() => require_portable_media.fetchPortableMedia({
|
|
161
|
+
url: new URL(hashlink),
|
|
162
|
+
digestMultibase: digest
|
|
163
|
+
}, { gateways: ["http://127.0.0.1"] }), /No gateway returned verified portable media/);
|
|
164
|
+
});
|
|
165
|
+
(0, node_test.test)("fetchPortableMedia() propagates cancellation", async () => {
|
|
166
|
+
const controller = new AbortController();
|
|
167
|
+
const reason = /* @__PURE__ */ new Error("cancelled");
|
|
168
|
+
controller.abort(reason);
|
|
169
|
+
await (0, node_assert_strict.rejects)(() => require_portable_media.fetchPortableMedia({
|
|
170
|
+
url: new URL(hashlink),
|
|
171
|
+
digestMultibase: digest
|
|
172
|
+
}, {
|
|
173
|
+
gateways: ["https://example.com"],
|
|
174
|
+
signal: controller.signal
|
|
175
|
+
}), (error) => error === reason);
|
|
176
|
+
});
|
|
177
|
+
networkTest("fetchPortableMedia() falls back after a gateway timeout", async () => {
|
|
178
|
+
await withServers([() => void 0, () => new Response(bytes)], async (gateways) => {
|
|
179
|
+
(0, node_assert_strict.equal)(await (await require_portable_media.fetchPortableMedia({
|
|
180
|
+
url: new URL(hashlink),
|
|
181
|
+
digestMultibase: digest
|
|
182
|
+
}, {
|
|
183
|
+
gateways,
|
|
184
|
+
allowPrivateAddress: true,
|
|
185
|
+
gatewayTimeout: 500,
|
|
186
|
+
timeout: 5e3
|
|
187
|
+
})).text(), "portable image");
|
|
188
|
+
});
|
|
189
|
+
});
|
|
190
|
+
networkTest("fetchPortableMedia() applies one overall timeout", async () => {
|
|
191
|
+
await withServers([() => void 0, () => new Response(bytes)], async (gateways) => {
|
|
192
|
+
await (0, node_assert_strict.rejects)(() => require_portable_media.fetchPortableMedia({
|
|
193
|
+
url: new URL(hashlink),
|
|
194
|
+
digestMultibase: digest
|
|
195
|
+
}, {
|
|
196
|
+
gateways,
|
|
197
|
+
allowPrivateAddress: true,
|
|
198
|
+
gatewayTimeout: 100,
|
|
199
|
+
timeout: 20
|
|
200
|
+
}), (error) => error instanceof DOMException && error.name === "TimeoutError");
|
|
201
|
+
});
|
|
202
|
+
});
|
|
203
|
+
networkTest("fetchPortableMedia() follows a safe redirect", async () => {
|
|
204
|
+
const requested = [];
|
|
205
|
+
await withServers([(path) => {
|
|
206
|
+
requested.push(path);
|
|
207
|
+
return path === "/media" ? new Response(bytes) : new Response(null, {
|
|
208
|
+
status: 302,
|
|
209
|
+
headers: { Location: "/media" }
|
|
210
|
+
});
|
|
211
|
+
}], async ([gateway]) => {
|
|
212
|
+
(0, node_assert_strict.equal)(await (await require_portable_media.fetchPortableMedia({
|
|
213
|
+
url: new URL(hashlink),
|
|
214
|
+
digestMultibase: digest
|
|
215
|
+
}, {
|
|
216
|
+
gateways: [gateway],
|
|
217
|
+
allowPrivateAddress: true
|
|
218
|
+
})).text(), "portable image");
|
|
219
|
+
});
|
|
220
|
+
(0, node_assert_strict.deepStrictEqual)(requested, [`/.well-known/apgateway/${hashlink}`, "/media"]);
|
|
221
|
+
});
|
|
222
|
+
//#endregion
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export { };
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export { };
|
|
@@ -0,0 +1,223 @@
|
|
|
1
|
+
import { n as createHashlink, t as computeDigestMultibase } from "./digest-COC7xDiQ.mjs";
|
|
2
|
+
import { t as fetchPortableMedia } from "./portable-media-B_lt9MMA.mjs";
|
|
3
|
+
import { deepStrictEqual, equal, rejects } from "node:assert/strict";
|
|
4
|
+
import { test } from "node:test";
|
|
5
|
+
import { createServer } from "node:http";
|
|
6
|
+
//#region src/portable-media.test.ts
|
|
7
|
+
const bytes = new TextEncoder().encode("portable image");
|
|
8
|
+
const digest = "zQmU2Jds4B2J83K7CrYC34CEJdB6vCLyqkM2cgBxYeaNWTA";
|
|
9
|
+
const hashlink = createHashlink(digest);
|
|
10
|
+
const networkTest = (name, run) => test(name, async (t) => {
|
|
11
|
+
if ("Deno" in globalThis && (await Deno.permissions.query({ name: "net" })).state !== "granted") {
|
|
12
|
+
t.skip("Requires network permission for a local test server.");
|
|
13
|
+
return;
|
|
14
|
+
}
|
|
15
|
+
await run();
|
|
16
|
+
});
|
|
17
|
+
async function withServers(handlers, run) {
|
|
18
|
+
const servers = handlers.map((handler) => createServer(async (request, reply) => {
|
|
19
|
+
const result = handler(request.url ?? "/");
|
|
20
|
+
if (result == null) return;
|
|
21
|
+
reply.writeHead(result.status, Object.fromEntries(result.headers));
|
|
22
|
+
reply.end(new Uint8Array(await result.arrayBuffer()));
|
|
23
|
+
}));
|
|
24
|
+
try {
|
|
25
|
+
const origins = [];
|
|
26
|
+
for (const server of servers) {
|
|
27
|
+
await new Promise((resolve, reject) => {
|
|
28
|
+
server.once("error", reject);
|
|
29
|
+
server.listen(0, "127.0.0.1", resolve);
|
|
30
|
+
});
|
|
31
|
+
const address = server.address();
|
|
32
|
+
if (address == null || typeof address === "string") throw new Error("Server did not bind a TCP port.");
|
|
33
|
+
origins.push(`http://127.0.0.1:${address.port}`);
|
|
34
|
+
}
|
|
35
|
+
await run(origins);
|
|
36
|
+
} finally {
|
|
37
|
+
await Promise.all(servers.map(async (server) => {
|
|
38
|
+
server.closeAllConnections();
|
|
39
|
+
await new Promise((resolve) => server.close(() => resolve()));
|
|
40
|
+
}));
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
networkTest("fetchPortableMedia() accepts Link, Image, and Document", async () => {
|
|
44
|
+
const link = {
|
|
45
|
+
href: new URL(hashlink),
|
|
46
|
+
digestMultibase: digest
|
|
47
|
+
};
|
|
48
|
+
const image = {
|
|
49
|
+
url: new URL(hashlink),
|
|
50
|
+
digestMultibase: digest
|
|
51
|
+
};
|
|
52
|
+
const document = { url: {
|
|
53
|
+
href: new URL(hashlink),
|
|
54
|
+
digestMultibase: digest
|
|
55
|
+
} };
|
|
56
|
+
const requested = [];
|
|
57
|
+
await withServers([(path) => {
|
|
58
|
+
requested.push(path);
|
|
59
|
+
return new Response(bytes);
|
|
60
|
+
}], async ([gateway]) => {
|
|
61
|
+
for (const media of [
|
|
62
|
+
link,
|
|
63
|
+
image,
|
|
64
|
+
document
|
|
65
|
+
]) equal(await (await fetchPortableMedia(media, {
|
|
66
|
+
gateways: [gateway],
|
|
67
|
+
allowPrivateAddress: true
|
|
68
|
+
})).text(), "portable image");
|
|
69
|
+
});
|
|
70
|
+
deepStrictEqual(requested, Array(3).fill(`/.well-known/apgateway/${hashlink}`));
|
|
71
|
+
});
|
|
72
|
+
networkTest("fetchPortableMedia() falls back on status and digest mismatch", async () => {
|
|
73
|
+
const requested = [];
|
|
74
|
+
await withServers([
|
|
75
|
+
(path) => {
|
|
76
|
+
requested.push(`first:${path}`);
|
|
77
|
+
return new Response(null, { status: 503 });
|
|
78
|
+
},
|
|
79
|
+
(path) => {
|
|
80
|
+
requested.push(`second:${path}`);
|
|
81
|
+
return new Response("wrong bytes");
|
|
82
|
+
},
|
|
83
|
+
(path) => {
|
|
84
|
+
requested.push(`third:${path}`);
|
|
85
|
+
return new Response(bytes, { headers: {
|
|
86
|
+
"Content-Type": "image/png",
|
|
87
|
+
"Set-Cookie": "secret=1"
|
|
88
|
+
} });
|
|
89
|
+
}
|
|
90
|
+
], async (gateways) => {
|
|
91
|
+
const result = await fetchPortableMedia({
|
|
92
|
+
url: new URL(hashlink),
|
|
93
|
+
digestMultibase: digest
|
|
94
|
+
}, {
|
|
95
|
+
gateways,
|
|
96
|
+
allowPrivateAddress: true
|
|
97
|
+
});
|
|
98
|
+
equal(await result.text(), "portable image");
|
|
99
|
+
equal(result.headers.get("Content-Type"), "image/png");
|
|
100
|
+
equal(result.headers.get("Set-Cookie"), null);
|
|
101
|
+
});
|
|
102
|
+
deepStrictEqual(requested.map((r) => r.split(":")[0]), [
|
|
103
|
+
"first",
|
|
104
|
+
"second",
|
|
105
|
+
"third"
|
|
106
|
+
]);
|
|
107
|
+
});
|
|
108
|
+
networkTest("fetchPortableMedia() verifies direct HTTP media", async () => {
|
|
109
|
+
const wrongDigest = await computeDigestMultibase(/* @__PURE__ */ new Uint8Array());
|
|
110
|
+
await withServers([() => new Response(bytes)], async ([origin]) => {
|
|
111
|
+
equal(await (await fetchPortableMedia(`${origin}/a`, {
|
|
112
|
+
digestMultibase: digest,
|
|
113
|
+
allowPrivateAddress: true
|
|
114
|
+
})).text(), "portable image");
|
|
115
|
+
await rejects(() => fetchPortableMedia(`${origin}/a`, {
|
|
116
|
+
digestMultibase: wrongDigest,
|
|
117
|
+
allowPrivateAddress: true
|
|
118
|
+
}), /digest does not match/);
|
|
119
|
+
});
|
|
120
|
+
});
|
|
121
|
+
test("fetchPortableMedia() rejects invalid references before fetching", async () => {
|
|
122
|
+
const wrongDigest = await computeDigestMultibase(/* @__PURE__ */ new Uint8Array());
|
|
123
|
+
await rejects(() => fetchPortableMedia({ url: new URL(hashlink) }), /requires digestMultibase/);
|
|
124
|
+
await rejects(() => fetchPortableMedia({
|
|
125
|
+
url: new URL(hashlink),
|
|
126
|
+
digestMultibase: digest
|
|
127
|
+
}), /requires at least one gateway/);
|
|
128
|
+
await rejects(() => fetchPortableMedia({
|
|
129
|
+
url: new URL(hashlink),
|
|
130
|
+
digestMultibase: wrongDigest
|
|
131
|
+
}, { gateways: ["https://example.com"] }), /disagree/);
|
|
132
|
+
await rejects(() => fetchPortableMedia({
|
|
133
|
+
url: new URL("hl:invalid"),
|
|
134
|
+
digestMultibase: digest
|
|
135
|
+
}, { gateways: ["https://example.com"] }), TypeError);
|
|
136
|
+
await rejects(() => fetchPortableMedia({
|
|
137
|
+
url: {
|
|
138
|
+
href: new URL(hashlink),
|
|
139
|
+
digestMultibase: wrongDigest
|
|
140
|
+
},
|
|
141
|
+
digestMultibase: digest
|
|
142
|
+
}, { gateways: ["https://example.com"] }), /digests disagree/);
|
|
143
|
+
await rejects(() => fetchPortableMedia("file:///tmp/media", { digestMultibase: digest }), TypeError);
|
|
144
|
+
});
|
|
145
|
+
networkTest("fetchPortableMedia() bounds response bytes", async () => {
|
|
146
|
+
await withServers([() => new Response(bytes)], async ([origin]) => {
|
|
147
|
+
await rejects(() => fetchPortableMedia(`${origin}/media`, {
|
|
148
|
+
digestMultibase: digest,
|
|
149
|
+
maxBytes: bytes.length - 1,
|
|
150
|
+
allowPrivateAddress: true
|
|
151
|
+
}), /exceeds the limit/);
|
|
152
|
+
});
|
|
153
|
+
await rejects(() => fetchPortableMedia("https://example.com/media", {
|
|
154
|
+
digestMultibase: digest,
|
|
155
|
+
maxBytes: 0
|
|
156
|
+
}), RangeError);
|
|
157
|
+
});
|
|
158
|
+
test("fetchPortableMedia() rejects private media and gateways", async () => {
|
|
159
|
+
await rejects(() => fetchPortableMedia("http://127.0.0.1/media", { digestMultibase: digest }), /private address/);
|
|
160
|
+
await rejects(() => fetchPortableMedia({
|
|
161
|
+
url: new URL(hashlink),
|
|
162
|
+
digestMultibase: digest
|
|
163
|
+
}, { gateways: ["http://127.0.0.1"] }), /No gateway returned verified portable media/);
|
|
164
|
+
});
|
|
165
|
+
test("fetchPortableMedia() propagates cancellation", async () => {
|
|
166
|
+
const controller = new AbortController();
|
|
167
|
+
const reason = /* @__PURE__ */ new Error("cancelled");
|
|
168
|
+
controller.abort(reason);
|
|
169
|
+
await rejects(() => fetchPortableMedia({
|
|
170
|
+
url: new URL(hashlink),
|
|
171
|
+
digestMultibase: digest
|
|
172
|
+
}, {
|
|
173
|
+
gateways: ["https://example.com"],
|
|
174
|
+
signal: controller.signal
|
|
175
|
+
}), (error) => error === reason);
|
|
176
|
+
});
|
|
177
|
+
networkTest("fetchPortableMedia() falls back after a gateway timeout", async () => {
|
|
178
|
+
await withServers([() => void 0, () => new Response(bytes)], async (gateways) => {
|
|
179
|
+
equal(await (await fetchPortableMedia({
|
|
180
|
+
url: new URL(hashlink),
|
|
181
|
+
digestMultibase: digest
|
|
182
|
+
}, {
|
|
183
|
+
gateways,
|
|
184
|
+
allowPrivateAddress: true,
|
|
185
|
+
gatewayTimeout: 500,
|
|
186
|
+
timeout: 5e3
|
|
187
|
+
})).text(), "portable image");
|
|
188
|
+
});
|
|
189
|
+
});
|
|
190
|
+
networkTest("fetchPortableMedia() applies one overall timeout", async () => {
|
|
191
|
+
await withServers([() => void 0, () => new Response(bytes)], async (gateways) => {
|
|
192
|
+
await rejects(() => fetchPortableMedia({
|
|
193
|
+
url: new URL(hashlink),
|
|
194
|
+
digestMultibase: digest
|
|
195
|
+
}, {
|
|
196
|
+
gateways,
|
|
197
|
+
allowPrivateAddress: true,
|
|
198
|
+
gatewayTimeout: 100,
|
|
199
|
+
timeout: 20
|
|
200
|
+
}), (error) => error instanceof DOMException && error.name === "TimeoutError");
|
|
201
|
+
});
|
|
202
|
+
});
|
|
203
|
+
networkTest("fetchPortableMedia() follows a safe redirect", async () => {
|
|
204
|
+
const requested = [];
|
|
205
|
+
await withServers([(path) => {
|
|
206
|
+
requested.push(path);
|
|
207
|
+
return path === "/media" ? new Response(bytes) : new Response(null, {
|
|
208
|
+
status: 302,
|
|
209
|
+
headers: { Location: "/media" }
|
|
210
|
+
});
|
|
211
|
+
}], async ([gateway]) => {
|
|
212
|
+
equal(await (await fetchPortableMedia({
|
|
213
|
+
url: new URL(hashlink),
|
|
214
|
+
digestMultibase: digest
|
|
215
|
+
}, {
|
|
216
|
+
gateways: [gateway],
|
|
217
|
+
allowPrivateAddress: true
|
|
218
|
+
})).text(), "portable image");
|
|
219
|
+
});
|
|
220
|
+
deepStrictEqual(requested, [`/.well-known/apgateway/${hashlink}`, "/media"]);
|
|
221
|
+
});
|
|
222
|
+
//#endregion
|
|
223
|
+
export {};
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
|
|
2
|
+
const require_url = require("./url-BNakuZ8k.cjs");
|
|
3
|
+
const require_key = require("./key-C-AYkdJJ.cjs");
|
|
4
|
+
const require_digest = require("./digest-3FeH2Y-Q.cjs");
|
|
5
|
+
const require_portable_dereference = require("./portable-dereference-qTLMqe2_.cjs");
|
|
6
|
+
let node_assert_strict = require("node:assert/strict");
|
|
7
|
+
let _fedify_fixture = require("@fedify/fixture");
|
|
8
|
+
//#region src/portable-workers.test.ts
|
|
9
|
+
const portableId = "ap://did:key:z6Mkabc/actor";
|
|
10
|
+
(0, _fedify_fixture.test)("vocab-runtime portable URI formats on Workers", () => {
|
|
11
|
+
(0, node_assert_strict.equal)(require_url.formatIri(require_url.parseIri(portableId)), "ap+ef61://did:key:z6Mkabc/actor");
|
|
12
|
+
(0, node_assert_strict.equal)(require_url.canonicalizePortableUri(`${portableId}?@gateway=https%3A%2F%2Fa.example`), "ap+ef61://did:key:z6Mkabc/actor");
|
|
13
|
+
});
|
|
14
|
+
(0, _fedify_fixture.test)("vocab-runtime compatible IDs on Workers", () => {
|
|
15
|
+
const compatible = require_url.toCompatibleEf61Id(portableId, "https://gw.example");
|
|
16
|
+
(0, node_assert_strict.equal)(compatible.href, "https://gw.example/.well-known/apgateway/did:key:z6Mkabc/actor");
|
|
17
|
+
(0, node_assert_strict.equal)(require_url.formatIri(require_url.fromCompatibleEf61Id(compatible)), "ap+ef61://did:key:z6Mkabc/actor");
|
|
18
|
+
});
|
|
19
|
+
(0, _fedify_fixture.test)("vocab-runtime did:key on Workers", async () => {
|
|
20
|
+
const keys = await crypto.subtle.generateKey("Ed25519", true, ["sign", "verify"]);
|
|
21
|
+
const imported = await require_key.importDidKey(await require_key.exportDidKey(keys.publicKey));
|
|
22
|
+
(0, node_assert_strict.deepStrictEqual)(new Uint8Array(await crypto.subtle.exportKey("raw", imported)), new Uint8Array(await crypto.subtle.exportKey("raw", keys.publicKey)));
|
|
23
|
+
});
|
|
24
|
+
(0, _fedify_fixture.test)("vocab-runtime hashlink on Workers", async () => {
|
|
25
|
+
const bytes = new TextEncoder().encode("portable media");
|
|
26
|
+
const digest = await require_digest.computeDigestMultibase(bytes);
|
|
27
|
+
(0, node_assert_strict.equal)(await require_digest.verifyHashlink(bytes, require_digest.createHashlink(digest)), true);
|
|
28
|
+
(0, node_assert_strict.equal)(await require_digest.verifyHashlink(new TextEncoder().encode("tampered"), require_digest.createHashlink(digest)), false);
|
|
29
|
+
});
|
|
30
|
+
(0, _fedify_fixture.test)("vocab-runtime gateway candidates on Workers", () => {
|
|
31
|
+
const hinted = require_url.parseIri(`${portableId}?@gateway=https%3A%2F%2Fhint.example`);
|
|
32
|
+
(0, node_assert_strict.deepStrictEqual)(require_portable_dereference.getPortableGatewayCandidates(hinted, ["https://first.example"]).map((url) => url.href), ["https://first.example/"]);
|
|
33
|
+
(0, node_assert_strict.deepStrictEqual)(require_portable_dereference.getPortableGatewayCandidates(hinted).map((url) => url.href), ["https://hint.example/"]);
|
|
34
|
+
});
|
|
35
|
+
//#endregion
|
|
36
|
+
exports.testDefinitions = _fedify_fixture.testDefinitions;
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
import { _ as parseIri, i as canonicalizePortableUri, o as formatIri, s as fromCompatibleEf61Id, y as toCompatibleEf61Id } from "./url-DMxmp7ZG.mjs";
|
|
2
|
+
import { i as importDidKey, t as exportDidKey } from "./key-C2Db_TAJ.mjs";
|
|
3
|
+
import { n as createHashlink, o as verifyHashlink, t as computeDigestMultibase } from "./digest-COC7xDiQ.mjs";
|
|
4
|
+
import { n as getPortableGatewayCandidates } from "./portable-dereference-DmTYDy2p.mjs";
|
|
5
|
+
import { deepStrictEqual, equal } from "node:assert/strict";
|
|
6
|
+
import { test, testDefinitions } from "@fedify/fixture";
|
|
7
|
+
//#region src/portable-workers.test.ts
|
|
8
|
+
const portableId = "ap://did:key:z6Mkabc/actor";
|
|
9
|
+
test("vocab-runtime portable URI formats on Workers", () => {
|
|
10
|
+
equal(formatIri(parseIri(portableId)), "ap+ef61://did:key:z6Mkabc/actor");
|
|
11
|
+
equal(canonicalizePortableUri(`${portableId}?@gateway=https%3A%2F%2Fa.example`), "ap+ef61://did:key:z6Mkabc/actor");
|
|
12
|
+
});
|
|
13
|
+
test("vocab-runtime compatible IDs on Workers", () => {
|
|
14
|
+
const compatible = toCompatibleEf61Id(portableId, "https://gw.example");
|
|
15
|
+
equal(compatible.href, "https://gw.example/.well-known/apgateway/did:key:z6Mkabc/actor");
|
|
16
|
+
equal(formatIri(fromCompatibleEf61Id(compatible)), "ap+ef61://did:key:z6Mkabc/actor");
|
|
17
|
+
});
|
|
18
|
+
test("vocab-runtime did:key on Workers", async () => {
|
|
19
|
+
const keys = await crypto.subtle.generateKey("Ed25519", true, ["sign", "verify"]);
|
|
20
|
+
const imported = await importDidKey(await exportDidKey(keys.publicKey));
|
|
21
|
+
deepStrictEqual(new Uint8Array(await crypto.subtle.exportKey("raw", imported)), new Uint8Array(await crypto.subtle.exportKey("raw", keys.publicKey)));
|
|
22
|
+
});
|
|
23
|
+
test("vocab-runtime hashlink on Workers", async () => {
|
|
24
|
+
const bytes = new TextEncoder().encode("portable media");
|
|
25
|
+
const digest = await computeDigestMultibase(bytes);
|
|
26
|
+
equal(await verifyHashlink(bytes, createHashlink(digest)), true);
|
|
27
|
+
equal(await verifyHashlink(new TextEncoder().encode("tampered"), createHashlink(digest)), false);
|
|
28
|
+
});
|
|
29
|
+
test("vocab-runtime gateway candidates on Workers", () => {
|
|
30
|
+
const hinted = parseIri(`${portableId}?@gateway=https%3A%2F%2Fhint.example`);
|
|
31
|
+
deepStrictEqual(getPortableGatewayCandidates(hinted, ["https://first.example"]).map((url) => url.href), ["https://first.example/"]);
|
|
32
|
+
deepStrictEqual(getPortableGatewayCandidates(hinted).map((url) => url.href), ["https://hint.example/"]);
|
|
33
|
+
});
|
|
34
|
+
//#endregion
|
|
35
|
+
export { testDefinitions };
|
|
@@ -1,9 +1,9 @@
|
|
|
1
|
-
const
|
|
1
|
+
const require_rolldown_runtime = require("./rolldown-runtime-emK7D4bc.cjs");
|
|
2
2
|
let node_process = require("node:process");
|
|
3
|
-
node_process =
|
|
3
|
+
node_process = require_rolldown_runtime.__toESM(node_process, 1);
|
|
4
4
|
//#region deno.json
|
|
5
5
|
var name = "@fedify/vocab-runtime";
|
|
6
|
-
var version = "2.4.
|
|
6
|
+
var version = "2.4.1";
|
|
7
7
|
//#endregion
|
|
8
8
|
//#region src/request.ts
|
|
9
9
|
/**
|
|
@@ -33,6 +33,12 @@ var FetchError = class extends Error {
|
|
|
33
33
|
}
|
|
34
34
|
};
|
|
35
35
|
/**
|
|
36
|
+
* The `Accept` header value for fetching ActivityPub objects. ActivityPub
|
|
37
|
+
* and FEP-ef61 gateways require the ActivityStreams profile on the JSON-LD
|
|
38
|
+
* media type.
|
|
39
|
+
*/
|
|
40
|
+
const ACTIVITYPUB_ACCEPT = "application/activity+json, application/ld+json; profile=\"https://www.w3.org/ns/activitystreams\"";
|
|
41
|
+
/**
|
|
36
42
|
* Creates a request for the given URL.
|
|
37
43
|
* @param url The URL to create the request for.
|
|
38
44
|
* @param options The options for the request.
|
|
@@ -42,7 +48,7 @@ var FetchError = class extends Error {
|
|
|
42
48
|
function createActivityPubRequest(url, options = {}) {
|
|
43
49
|
return new Request(url, {
|
|
44
50
|
headers: {
|
|
45
|
-
Accept:
|
|
51
|
+
Accept: ACTIVITYPUB_ACCEPT,
|
|
46
52
|
"User-Agent": typeof options.userAgent === "string" ? options.userAgent : getUserAgent(options.userAgent)
|
|
47
53
|
},
|
|
48
54
|
redirect: "manual"
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import process from "node:process";
|
|
2
2
|
//#region deno.json
|
|
3
3
|
var name = "@fedify/vocab-runtime";
|
|
4
|
-
var version = "2.4.
|
|
4
|
+
var version = "2.4.1";
|
|
5
5
|
//#endregion
|
|
6
6
|
//#region src/request.ts
|
|
7
7
|
/**
|
|
@@ -31,6 +31,12 @@ var FetchError = class extends Error {
|
|
|
31
31
|
}
|
|
32
32
|
};
|
|
33
33
|
/**
|
|
34
|
+
* The `Accept` header value for fetching ActivityPub objects. ActivityPub
|
|
35
|
+
* and FEP-ef61 gateways require the ActivityStreams profile on the JSON-LD
|
|
36
|
+
* media type.
|
|
37
|
+
*/
|
|
38
|
+
const ACTIVITYPUB_ACCEPT = "application/activity+json, application/ld+json; profile=\"https://www.w3.org/ns/activitystreams\"";
|
|
39
|
+
/**
|
|
34
40
|
* Creates a request for the given URL.
|
|
35
41
|
* @param url The URL to create the request for.
|
|
36
42
|
* @param options The options for the request.
|
|
@@ -40,7 +46,7 @@ var FetchError = class extends Error {
|
|
|
40
46
|
function createActivityPubRequest(url, options = {}) {
|
|
41
47
|
return new Request(url, {
|
|
42
48
|
headers: {
|
|
43
|
-
Accept:
|
|
49
|
+
Accept: ACTIVITYPUB_ACCEPT,
|
|
44
50
|
"User-Agent": typeof options.userAgent === "string" ? options.userAgent : getUserAgent(options.userAgent)
|
|
45
51
|
},
|
|
46
52
|
redirect: "manual"
|
|
@@ -1,9 +1,9 @@
|
|
|
1
|
-
const
|
|
2
|
-
const require_request = require("./request-
|
|
3
|
-
let node_assert = require("node:assert");
|
|
1
|
+
const require_rolldown_runtime = require("./rolldown-runtime-emK7D4bc.cjs");
|
|
2
|
+
const require_request = require("./request-BgjA9wyl.cjs");
|
|
4
3
|
let node_test = require("node:test");
|
|
5
4
|
let node_process = require("node:process");
|
|
6
|
-
node_process =
|
|
5
|
+
node_process = require_rolldown_runtime.__toESM(node_process, 1);
|
|
6
|
+
let node_assert = require("node:assert");
|
|
7
7
|
//#region src/request.test.ts
|
|
8
8
|
(0, node_test.test)("getUserAgent()", () => {
|
|
9
9
|
if ("Deno" in globalThis) {
|
|
@@ -40,4 +40,7 @@ node_process = require_chunk.__toESM(node_process, 1);
|
|
|
40
40
|
}), `MyApp/1.0.0 (Fedify/${require_request.version}; Node.js/${node_process.default.versions.node}; +https://example.com/)`);
|
|
41
41
|
}
|
|
42
42
|
});
|
|
43
|
+
(0, node_test.test)("createActivityPubRequest() asks for the ActivityStreams profile", () => {
|
|
44
|
+
(0, node_assert.deepStrictEqual)(require_request.createActivityPubRequest("https://example.com/object").headers.get("Accept"), "application/activity+json, application/ld+json; profile=\"https://www.w3.org/ns/activitystreams\"");
|
|
45
|
+
});
|
|
43
46
|
//#endregion
|
|
@@ -1,7 +1,7 @@
|
|
|
1
|
-
import { o as version, r as getUserAgent } from "./request-
|
|
2
|
-
import { deepStrictEqual } from "node:assert";
|
|
1
|
+
import { n as createActivityPubRequest, o as version, r as getUserAgent } from "./request-DodZNukP.mjs";
|
|
3
2
|
import { test } from "node:test";
|
|
4
3
|
import process from "node:process";
|
|
4
|
+
import { deepStrictEqual } from "node:assert";
|
|
5
5
|
//#region src/request.test.ts
|
|
6
6
|
test("getUserAgent()", () => {
|
|
7
7
|
if ("Deno" in globalThis) {
|
|
@@ -38,5 +38,8 @@ test("getUserAgent()", () => {
|
|
|
38
38
|
}), `MyApp/1.0.0 (Fedify/${version}; Node.js/${process.versions.node}; +https://example.com/)`);
|
|
39
39
|
}
|
|
40
40
|
});
|
|
41
|
+
test("createActivityPubRequest() asks for the ActivityStreams profile", () => {
|
|
42
|
+
deepStrictEqual(createActivityPubRequest("https://example.com/object").headers.get("Accept"), "application/activity+json, application/ld+json; profile=\"https://www.w3.org/ns/activitystreams\"");
|
|
43
|
+
});
|
|
41
44
|
//#endregion
|
|
42
45
|
export {};
|