@fedify/vocab-runtime 2.4.0-pr.936.41 → 2.4.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (138) hide show
  1. package/deno.json +4 -2
  2. package/dist/{tests/docloader-Ck8bcBir.mjs → contexts-BK1CqBR5.cjs} +164 -275
  3. package/dist/{tests/docloader-S_gQZ2tt.cjs → contexts-DPuJ4UYL.js} +160 -294
  4. package/dist/{docloader-C_dir7Xb.d.ts → docloader-CYwqh5Df.d.cts} +66 -2
  5. package/dist/{docloader-D2DTRiyA.d.cts → docloader-CYwqh5Df.d.ts} +66 -2
  6. package/dist/internal/jsonld-cache.cjs +70 -1
  7. package/dist/internal/jsonld-cache.d.cts +35 -2
  8. package/dist/internal/jsonld-cache.d.ts +35 -2
  9. package/dist/internal/jsonld-cache.js +67 -2
  10. package/dist/internal/portable-dereference.cjs +721 -0
  11. package/dist/internal/portable-dereference.d.cts +349 -0
  12. package/dist/internal/portable-dereference.d.ts +349 -0
  13. package/dist/internal/portable-dereference.js +702 -0
  14. package/dist/internal/signed-representation.cjs +378 -0
  15. package/dist/internal/signed-representation.d.cts +144 -0
  16. package/dist/internal/signed-representation.d.ts +144 -0
  17. package/dist/internal/signed-representation.js +371 -0
  18. package/dist/jsonld.cjs +2 -2
  19. package/dist/mod.cjs +711 -4527
  20. package/dist/mod.d.cts +400 -8
  21. package/dist/mod.d.ts +400 -9
  22. package/dist/mod.js +692 -4522
  23. package/dist/portable-DqtfLy_1.d.cts +160 -0
  24. package/dist/portable-DtWsu2yU.d.ts +160 -0
  25. package/dist/tests/body-CYiu9CO-.mjs +130 -0
  26. package/dist/tests/body-CkEwROsn.cjs +153 -0
  27. package/dist/tests/body.test.cjs +89 -0
  28. package/dist/tests/body.test.d.cts +1 -0
  29. package/dist/tests/body.test.d.mts +1 -0
  30. package/dist/tests/body.test.mjs +90 -0
  31. package/dist/tests/contexts-CIKsin4e.mjs +4512 -0
  32. package/dist/tests/contexts-DizzBjz4.cjs +4523 -0
  33. package/dist/tests/decimal.test.cjs +8 -7
  34. package/dist/tests/decimal.test.mjs +8 -6
  35. package/dist/tests/digest-3FeH2Y-Q.cjs +176 -0
  36. package/dist/tests/digest-COC7xDiQ.mjs +141 -0
  37. package/dist/tests/digest.test.cjs +102 -0
  38. package/dist/tests/digest.test.d.cts +1 -0
  39. package/dist/tests/digest.test.d.mts +1 -0
  40. package/dist/tests/digest.test.mjs +103 -0
  41. package/dist/tests/docloader-C3YFl6y4.cjs +396 -0
  42. package/dist/tests/docloader-CvmS4sVq.mjs +373 -0
  43. package/dist/tests/docloader.test.cjs +692 -39
  44. package/dist/tests/docloader.test.mjs +686 -34
  45. package/dist/tests/internal/multicodec.test.cjs +2 -3
  46. package/dist/tests/internal/multicodec.test.mjs +2 -2
  47. package/dist/tests/internal/portable-dereference.test.cjs +172 -0
  48. package/dist/tests/internal/portable-dereference.test.d.cts +1 -0
  49. package/dist/tests/internal/portable-dereference.test.d.mts +1 -0
  50. package/dist/tests/internal/portable-dereference.test.mjs +173 -0
  51. package/dist/tests/jsonld-cache-BPQmOZWD.mjs +342 -0
  52. package/dist/tests/jsonld-cache-C07AyNOY.cjs +397 -0
  53. package/dist/tests/jsonld-cache.test.cjs +101 -298
  54. package/dist/tests/jsonld-cache.test.mjs +94 -289
  55. package/dist/tests/{key-_wXwomh_.cjs → key-C-AYkdJJ.cjs} +11 -4
  56. package/dist/tests/{key-CDGDH_vC.mjs → key-C2Db_TAJ.mjs} +11 -3
  57. package/dist/tests/key.test.cjs +6 -5
  58. package/dist/tests/key.test.mjs +6 -4
  59. package/dist/tests/langstr.test.cjs +4 -4
  60. package/dist/tests/langstr.test.mjs +2 -2
  61. package/dist/tests/link.test.cjs +2 -3
  62. package/dist/tests/link.test.mjs +2 -2
  63. package/dist/tests/multibase/multibase.test.cjs +8 -9
  64. package/dist/tests/multibase/multibase.test.mjs +6 -6
  65. package/dist/tests/{multibase-Bz_UUDtL.cjs → multibase-B5Mea7Ip.cjs} +19 -2
  66. package/dist/tests/{multibase-B4bvakyA.mjs → multibase-BPnF_L4e.mjs} +12 -1
  67. package/dist/tests/portable-dereference-BNXtgg5U.cjs +278 -0
  68. package/dist/tests/portable-dereference-DRE5bz-l.mjs +249 -0
  69. package/dist/tests/portable-media-BLKllU56.cjs +153 -0
  70. package/dist/tests/portable-media-DRSGBORB.mjs +148 -0
  71. package/dist/tests/portable-media.test.cjs +222 -0
  72. package/dist/tests/portable-media.test.d.cts +1 -0
  73. package/dist/tests/portable-media.test.d.mts +1 -0
  74. package/dist/tests/portable-media.test.mjs +223 -0
  75. package/dist/tests/portable-workers.test.cjs +36 -0
  76. package/dist/tests/portable-workers.test.d.cts +2 -0
  77. package/dist/tests/portable-workers.test.d.mts +2 -0
  78. package/dist/tests/portable-workers.test.mjs +35 -0
  79. package/dist/tests/{request-uk51rkhO.cjs → request-8vPWtV1-.cjs} +10 -4
  80. package/dist/tests/{request-C8CaGwtt.mjs → request-DRaOaTqD.mjs} +8 -2
  81. package/dist/tests/request.test.cjs +7 -4
  82. package/dist/tests/request.test.mjs +5 -2
  83. package/dist/tests/signed-representation.test.cjs +588 -0
  84. package/dist/tests/signed-representation.test.d.cts +1 -0
  85. package/dist/tests/signed-representation.test.d.mts +1 -0
  86. package/dist/tests/signed-representation.test.mjs +589 -0
  87. package/dist/tests/temporal.test.cjs +1 -2
  88. package/dist/tests/temporal.test.mjs +1 -1
  89. package/dist/tests/url-BNakuZ8k.cjs +998 -0
  90. package/dist/tests/url-DMxmp7ZG.mjs +859 -0
  91. package/dist/tests/url.test.cjs +489 -6
  92. package/dist/tests/url.test.mjs +489 -5
  93. package/dist/url-DrGTR8yv.cjs +993 -0
  94. package/dist/url-Dzyp-NsC.js +860 -0
  95. package/package.json +27 -4
  96. package/scripts/test-bun.mjs +17 -0
  97. package/src/body.test.ts +125 -0
  98. package/src/body.ts +152 -0
  99. package/src/contexts/cid-v1.json +114 -0
  100. package/src/contexts/fep-22cd.json +21 -0
  101. package/src/contexts/miscellany.json +17 -0
  102. package/src/contexts.ts +39 -1
  103. package/src/digest.test.ts +220 -0
  104. package/src/digest.ts +229 -0
  105. package/src/docloader.test.ts +918 -27
  106. package/src/docloader.ts +320 -105
  107. package/src/internal/jsonld-cache.ts +97 -1
  108. package/src/internal/portable-dereference.test.ts +254 -0
  109. package/src/internal/portable-dereference.ts +1000 -0
  110. package/src/internal/signed-representation.ts +565 -0
  111. package/src/jsonld-cache.test.ts +89 -0
  112. package/src/key.test.ts +9 -0
  113. package/src/key.ts +11 -1
  114. package/src/mod.ts +28 -0
  115. package/src/multibase/multibase.test.ts +5 -5
  116. package/src/portable-media.test.ts +293 -0
  117. package/src/portable-media.ts +264 -0
  118. package/src/portable-workers.test.ts +81 -0
  119. package/src/portable.ts +180 -0
  120. package/src/preprocessor.ts +7 -0
  121. package/src/request.test.ts +10 -1
  122. package/src/request.ts +9 -1
  123. package/src/signed-representation.test.ts +338 -0
  124. package/src/url.test.ts +823 -3
  125. package/src/url.ts +700 -23
  126. package/tsdown.config.ts +2 -0
  127. package/dist/tests/url-CsOV_B_P.cjs +0 -482
  128. package/dist/tests/url-Du7RQQgP.mjs +0 -392
  129. package/dist/url-DD4F0ULf.cjs +0 -483
  130. package/dist/url-DGVbSVVi.js +0 -393
  131. /package/dist/{chunk-M78iaK0I.cjs → rolldown-runtime-B7lfambq.cjs} +0 -0
  132. /package/dist/tests/{langstr-CbAxaeEZ.cjs → langstr-C4Fl80ae.cjs} +0 -0
  133. /package/dist/tests/{langstr-Di5AvKpB.mjs → langstr-CQ26J_L7.mjs} +0 -0
  134. /package/dist/tests/{link-NUUWCdnK.mjs → link-Cevmc87v.mjs} +0 -0
  135. /package/dist/tests/{link-FguCydMA.cjs → link-DlKm8bEr.cjs} +0 -0
  136. /package/dist/tests/{multicodec-CxGVGa91.cjs → multicodec-CLRPeW4N.cjs} +0 -0
  137. /package/dist/tests/{multicodec-CyFp54fI.mjs → multicodec-CRIj_05H.mjs} +0 -0
  138. /package/dist/tests/{chunk-C2EiDwsr.cjs → rolldown-runtime-emK7D4bc.cjs} +0 -0
@@ -0,0 +1,223 @@
1
+ import { n as createHashlink, t as computeDigestMultibase } from "./digest-COC7xDiQ.mjs";
2
+ import { t as fetchPortableMedia } from "./portable-media-DRSGBORB.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-BNXtgg5U.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,2 @@
1
+ import { testDefinitions } from "@fedify/fixture";
2
+ export { testDefinitions };
@@ -0,0 +1,2 @@
1
+ import { testDefinitions } from "@fedify/fixture";
2
+ export { 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-DRE5bz-l.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 require_chunk = require("./chunk-C2EiDwsr.cjs");
1
+ const require_rolldown_runtime = require("./rolldown-runtime-emK7D4bc.cjs");
2
2
  let node_process = require("node:process");
3
- node_process = require_chunk.__toESM(node_process, 1);
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.0-pr.936.41+59c7432c";
6
+ var version = "2.4.0";
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: "application/activity+json, application/ld+json",
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.0-pr.936.41+59c7432c";
4
+ var version = "2.4.0";
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: "application/activity+json, application/ld+json",
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 require_chunk = require("./chunk-C2EiDwsr.cjs");
2
- const require_request = require("./request-uk51rkhO.cjs");
3
- let node_assert = require("node:assert");
1
+ const require_rolldown_runtime = require("./rolldown-runtime-emK7D4bc.cjs");
2
+ const require_request = require("./request-8vPWtV1-.cjs");
4
3
  let node_test = require("node:test");
5
4
  let node_process = require("node:process");
6
- node_process = require_chunk.__toESM(node_process, 1);
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-C8CaGwtt.mjs";
2
- import { deepStrictEqual } from "node:assert";
1
+ import { n as createActivityPubRequest, o as version, r as getUserAgent } from "./request-DRaOaTqD.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 {};