@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.
Files changed (152) hide show
  1. package/deno.json +4 -2
  2. package/dist/{tests/docloader-Ck8bcBir.mjs → contexts-B09jb9Pi.cjs} +173 -274
  3. package/dist/{tests/docloader-S_gQZ2tt.cjs → contexts-DWrj4AGR.js} +169 -293
  4. package/dist/{docloader-C_dir7Xb.d.ts → docloader-BMHljyYb.d.cts} +68 -2
  5. package/dist/{docloader-D2DTRiyA.d.cts → docloader-BMHljyYb.d.ts} +68 -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 +762 -4529
  20. package/dist/mod.d.cts +427 -9
  21. package/dist/mod.d.ts +427 -10
  22. package/dist/mod.js +742 -4524
  23. package/dist/portable-6Aj-7dZJ.d.cts +160 -0
  24. package/dist/portable-nkTiqH0w.d.ts +160 -0
  25. package/dist/tests/body-DpC9p-iG.mjs +130 -0
  26. package/dist/tests/body-cKLBprYm.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-C9Lj11SC.cjs +4533 -0
  32. package/dist/tests/contexts-duRA_dDC.mjs +4522 -0
  33. package/dist/tests/decimal.test.cjs +9 -7
  34. package/dist/tests/decimal.test.mjs +9 -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-DyZ1JGIl.cjs +398 -0
  42. package/dist/tests/docloader-tUmMeXjU.mjs +375 -0
  43. package/dist/tests/docloader.test.cjs +816 -39
  44. package/dist/tests/docloader.test.mjs +810 -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-CmDhHNTx.cjs +12 -0
  52. package/dist/tests/jsonld-DweIJ07b.mjs +5 -0
  53. package/dist/tests/jsonld-cache-BEXiiM-V.cjs +386 -0
  54. package/dist/tests/jsonld-cache-DFnWsLuZ.mjs +339 -0
  55. package/dist/tests/jsonld-cache.test.cjs +102 -298
  56. package/dist/tests/jsonld-cache.test.mjs +95 -289
  57. package/dist/tests/{key-_wXwomh_.cjs → key-C-AYkdJJ.cjs} +11 -4
  58. package/dist/tests/{key-CDGDH_vC.mjs → key-C2Db_TAJ.mjs} +11 -3
  59. package/dist/tests/key.test.cjs +6 -5
  60. package/dist/tests/key.test.mjs +6 -4
  61. package/dist/tests/{langstr-Di5AvKpB.mjs → langstr-DYRmJqFn.mjs} +5 -2
  62. package/dist/tests/{langstr-CbAxaeEZ.cjs → langstr-_PqsL1ae.cjs} +5 -2
  63. package/dist/tests/langstr.test.cjs +11 -4
  64. package/dist/tests/langstr.test.mjs +9 -2
  65. package/dist/tests/langtag-CUppHs_s.mjs +45 -0
  66. package/dist/tests/langtag-Czjvxfzx.cjs +50 -0
  67. package/dist/tests/langtag.test.cjs +45 -0
  68. package/dist/tests/langtag.test.d.cts +1 -0
  69. package/dist/tests/langtag.test.d.mts +1 -0
  70. package/dist/tests/langtag.test.mjs +46 -0
  71. package/dist/tests/link.test.cjs +2 -3
  72. package/dist/tests/link.test.mjs +2 -2
  73. package/dist/tests/multibase/multibase.test.cjs +8 -9
  74. package/dist/tests/multibase/multibase.test.mjs +6 -6
  75. package/dist/tests/{multibase-Bz_UUDtL.cjs → multibase-B5Mea7Ip.cjs} +19 -2
  76. package/dist/tests/{multibase-B4bvakyA.mjs → multibase-BPnF_L4e.mjs} +12 -1
  77. package/dist/tests/portable-dereference-DmTYDy2p.mjs +250 -0
  78. package/dist/tests/portable-dereference-qTLMqe2_.cjs +279 -0
  79. package/dist/tests/portable-media-5p8azal0.cjs +153 -0
  80. package/dist/tests/portable-media-B_lt9MMA.mjs +148 -0
  81. package/dist/tests/portable-media.test.cjs +222 -0
  82. package/dist/tests/portable-media.test.d.cts +1 -0
  83. package/dist/tests/portable-media.test.d.mts +1 -0
  84. package/dist/tests/portable-media.test.mjs +223 -0
  85. package/dist/tests/portable-workers.test.cjs +36 -0
  86. package/dist/tests/portable-workers.test.d.cts +2 -0
  87. package/dist/tests/portable-workers.test.d.mts +2 -0
  88. package/dist/tests/portable-workers.test.mjs +35 -0
  89. package/dist/tests/{request-uk51rkhO.cjs → request-BgjA9wyl.cjs} +10 -4
  90. package/dist/tests/{request-C8CaGwtt.mjs → request-DodZNukP.mjs} +8 -2
  91. package/dist/tests/request.test.cjs +7 -4
  92. package/dist/tests/request.test.mjs +5 -2
  93. package/dist/tests/signed-representation.test.cjs +588 -0
  94. package/dist/tests/signed-representation.test.d.cts +1 -0
  95. package/dist/tests/signed-representation.test.d.mts +1 -0
  96. package/dist/tests/signed-representation.test.mjs +589 -0
  97. package/dist/tests/temporal.test.cjs +1 -2
  98. package/dist/tests/temporal.test.mjs +1 -1
  99. package/dist/tests/url-BNakuZ8k.cjs +998 -0
  100. package/dist/tests/url-DMxmp7ZG.mjs +859 -0
  101. package/dist/tests/url.test.cjs +489 -6
  102. package/dist/tests/url.test.mjs +489 -5
  103. package/dist/url-DrGTR8yv.cjs +993 -0
  104. package/dist/url-Dzyp-NsC.js +860 -0
  105. package/package.json +27 -4
  106. package/scripts/test-bun.mjs +17 -0
  107. package/src/body.test.ts +125 -0
  108. package/src/body.ts +152 -0
  109. package/src/contexts/cid-v1.json +114 -0
  110. package/src/contexts/fep-22cd.json +21 -0
  111. package/src/contexts/fep-6757.json +12 -0
  112. package/src/contexts/joinmastodon.json +1 -1
  113. package/src/contexts/miscellany.json +17 -0
  114. package/src/contexts.ts +47 -1
  115. package/src/digest.test.ts +220 -0
  116. package/src/digest.ts +229 -0
  117. package/src/docloader.test.ts +1066 -27
  118. package/src/docloader.ts +322 -105
  119. package/src/internal/jsonld-cache.ts +97 -1
  120. package/src/internal/portable-dereference.test.ts +254 -0
  121. package/src/internal/portable-dereference.ts +1000 -0
  122. package/src/internal/signed-representation.ts +565 -0
  123. package/src/jsonld-cache.test.ts +89 -0
  124. package/src/key.test.ts +9 -0
  125. package/src/key.ts +11 -1
  126. package/src/langstr.test.ts +18 -1
  127. package/src/langstr.ts +6 -2
  128. package/src/langtag.test.ts +53 -0
  129. package/src/langtag.ts +76 -0
  130. package/src/mod.ts +29 -0
  131. package/src/multibase/multibase.test.ts +5 -5
  132. package/src/portable-media.test.ts +293 -0
  133. package/src/portable-media.ts +264 -0
  134. package/src/portable-workers.test.ts +81 -0
  135. package/src/portable.ts +180 -0
  136. package/src/preprocessor.ts +7 -0
  137. package/src/request.test.ts +10 -1
  138. package/src/request.ts +9 -1
  139. package/src/signed-representation.test.ts +338 -0
  140. package/src/url.test.ts +823 -3
  141. package/src/url.ts +700 -23
  142. package/tsdown.config.ts +2 -0
  143. package/dist/tests/url-CsOV_B_P.cjs +0 -482
  144. package/dist/tests/url-Du7RQQgP.mjs +0 -392
  145. package/dist/url-DD4F0ULf.cjs +0 -483
  146. package/dist/url-DGVbSVVi.js +0 -393
  147. /package/dist/{chunk-M78iaK0I.cjs → rolldown-runtime-B7lfambq.cjs} +0 -0
  148. /package/dist/tests/{link-NUUWCdnK.mjs → link-Cevmc87v.mjs} +0 -0
  149. /package/dist/tests/{link-FguCydMA.cjs → link-DlKm8bEr.cjs} +0 -0
  150. /package/dist/tests/{multicodec-CxGVGa91.cjs → multicodec-CLRPeW4N.cjs} +0 -0
  151. /package/dist/tests/{multicodec-CyFp54fI.mjs → multicodec-CRIj_05H.mjs} +0 -0
  152. /package/dist/tests/{chunk-C2EiDwsr.cjs → rolldown-runtime-emK7D4bc.cjs} +0 -0
@@ -1,7 +1,6 @@
1
- require("../chunk-C2EiDwsr.cjs");
2
- const require_multicodec = require("../multicodec-CxGVGa91.cjs");
3
- let node_assert = require("node:assert");
1
+ const require_multicodec = require("../multicodec-CLRPeW4N.cjs");
4
2
  let node_test = require("node:test");
3
+ let node_assert = require("node:assert");
5
4
  //#region src/internal/multicodec.test.ts
6
5
  (0, node_test.test)("getMulticodecPrefix() decodes supported multicodec prefixes", () => {
7
6
  (0, node_assert.deepStrictEqual)(require_multicodec.getMulticodecPrefix(Uint8Array.from([
@@ -1,6 +1,6 @@
1
- import { n as getMulticodecPrefix, r as removeMulticodecPrefix, t as addMulticodecPrefix } from "../multicodec-CyFp54fI.mjs";
2
- import { deepStrictEqual, throws } from "node:assert";
1
+ import { n as getMulticodecPrefix, r as removeMulticodecPrefix, t as addMulticodecPrefix } from "../multicodec-CRIj_05H.mjs";
3
2
  import { test } from "node:test";
3
+ import { deepStrictEqual, throws } from "node:assert";
4
4
  //#region src/internal/multicodec.test.ts
5
5
  test("getMulticodecPrefix() decodes supported multicodec prefixes", () => {
6
6
  deepStrictEqual(getMulticodecPrefix(Uint8Array.from([
@@ -0,0 +1,172 @@
1
+ const require_url = require("../url-BNakuZ8k.cjs");
2
+ const require_jsonld_cache = require("../jsonld-cache-BEXiiM-V.cjs");
3
+ const require_portable_dereference = require("../portable-dereference-qTLMqe2_.cjs");
4
+ let node_assert_strict = require("node:assert/strict");
5
+ let node_test = require("node:test");
6
+ //#region src/internal/portable-dereference.test.ts
7
+ const hrefs = (urls) => urls.map((url) => url.href);
8
+ (0, node_test.test)("isPortableIri()", () => {
9
+ (0, node_assert_strict.ok)(require_portable_dereference.isPortableIri(require_url.parseIri("ap://did:key:z6Mkabc/actor")));
10
+ (0, node_assert_strict.ok)(require_portable_dereference.isPortableIri(require_url.parseIri("ap+ef61://did:key:z6Mkabc/actor")));
11
+ (0, node_assert_strict.ok)(require_portable_dereference.isPortableIri(new URL("ap://did%3Akey%3Az6Mkabc/actor")));
12
+ (0, node_assert_strict.ok)(!require_portable_dereference.isPortableIri(new URL("https://example.com/actor")));
13
+ (0, node_assert_strict.ok)(!require_portable_dereference.isPortableIri(new URL("did:key:z6Mkabc")));
14
+ });
15
+ (0, node_test.test)("getPortableGatewayCandidates() uses explicit gateways", () => {
16
+ const url = require_url.parseIri("ap://did:key:z6Mkabc/actor?@gateway=https%3A%2F%2Fhint.example");
17
+ (0, node_assert_strict.deepStrictEqual)(hrefs(require_portable_dereference.getPortableGatewayCandidates(url, [
18
+ "https://b.example",
19
+ new URL("https://a.example/"),
20
+ "https://b.example/",
21
+ "http://c.example:8080"
22
+ ])), [
23
+ "https://b.example/",
24
+ "https://a.example/",
25
+ "http://c.example:8080/"
26
+ ]);
27
+ (0, node_assert_strict.deepStrictEqual)(require_portable_dereference.getPortableGatewayCandidates(url, []), []);
28
+ for (const gateway of [
29
+ "https://a.example/path",
30
+ "https://a.example/?",
31
+ "https://a.example/#",
32
+ "https://user:pass@a.example",
33
+ "ftp://a.example",
34
+ "a.example"
35
+ ]) (0, node_assert_strict.throws)(() => require_portable_dereference.getPortableGatewayCandidates(url, [gateway]), TypeError);
36
+ });
37
+ (0, node_test.test)("getPortableGatewayCandidates() reads @gateway hints", () => {
38
+ (0, node_assert_strict.deepStrictEqual)(hrefs(require_portable_dereference.getPortableGatewayCandidates(require_url.parseIri("ap://did:key:z6Mkabc/actor?page=1&@gateway=https%3A%2F%2Fa.example&gateways=https%3A%2F%2Flegacy.example&@gateway=not%20a%20URL&@gateway=https%3A%2F%2Fb.example%2Fpath&@gateway=https%3A%2F%2Fquery.example%2F%3F&@gateway=https%3A%2F%2Ffragment.example%2F%23&%40gateway=https%3A%2F%2Fb.example&@gateway=https%3A%2F%2Fa.example%2F"))), ["https://a.example/", "https://b.example/"]);
39
+ (0, node_assert_strict.deepStrictEqual)(require_portable_dereference.getPortableGatewayCandidates(require_url.parseIri("ap://did:key:z6Mkabc/actor")), []);
40
+ const hints = Array.from({ length: 7 }, (_, i) => `@gateway=https%3A%2F%2Fg${i}.example`);
41
+ (0, node_assert_strict.deepStrictEqual)(hrefs(require_portable_dereference.getPortableGatewayCandidates(require_url.parseIri(`ap://did:key:z6Mkabc/actor?${hints.join("&")}`))), [
42
+ 0,
43
+ 1,
44
+ 2,
45
+ 3,
46
+ 4
47
+ ].map((i) => `https://g${i}.example/`));
48
+ });
49
+ (0, node_test.test)("getPortableGatewayCandidates() reads hints from withGatewayHints()", () => {
50
+ const gateways = Array.from({ length: 7 }, (_, i) => `https://g${i}.example`);
51
+ (0, node_assert_strict.deepStrictEqual)(hrefs(require_portable_dereference.getPortableGatewayCandidates(require_url.withGatewayHints("ap://did:key:z6Mkabc/actor?page=1", gateways))), [
52
+ 0,
53
+ 1,
54
+ 2,
55
+ 3,
56
+ 4
57
+ ].map((i) => `https://g${i}.example/`));
58
+ });
59
+ (0, node_test.test)("getReferrerGateways() takes gateways from the owner", () => {
60
+ const actor = {
61
+ id: require_url.parseIri("ap://did:key:z6Mkabc/actor"),
62
+ gateways: [
63
+ new URL("https://a.example"),
64
+ new URL("https://a.example/"),
65
+ new URL("https://b.example/path"),
66
+ new URL("https://c.example")
67
+ ]
68
+ };
69
+ const outbox = { id: require_url.parseIri("ap://did:key:z6Mkabc/actor/outbox") };
70
+ require_portable_dereference.recordPortableReferrer(actor, outbox, "outbox");
71
+ const page = require_url.parseIri("ap://did:key:z6Mkabc/actor/outbox?cursor=1");
72
+ (0, node_assert_strict.deepStrictEqual)(hrefs(require_portable_dereference.getReferrerGateways(actor, outbox.id) ?? []), ["https://a.example/", "https://c.example/"]);
73
+ (0, node_assert_strict.deepStrictEqual)(hrefs(require_portable_dereference.getReferrerGateways(outbox, page) ?? []), ["https://a.example/", "https://c.example/"]);
74
+ (0, node_assert_strict.deepStrictEqual)(require_portable_dereference.getReferrerGateways(outbox, require_url.withGatewayHints(page, [new URL("https://hint.example")])), void 0);
75
+ (0, node_assert_strict.deepStrictEqual)(require_portable_dereference.getReferrerGateways(outbox, require_url.parseIri("ap://did:key:z6Mkdef/notes/1")), void 0);
76
+ const compatible = {
77
+ id: new URL("https://a.example/.well-known/apgateway/did:key:z6Mkabc/actor"),
78
+ gateways: [new URL("https://a.example")]
79
+ };
80
+ (0, node_assert_strict.deepStrictEqual)(hrefs(require_portable_dereference.getReferrerGateways(compatible, outbox.id) ?? []), ["https://a.example/"]);
81
+ (0, node_assert_strict.deepStrictEqual)(require_portable_dereference.getReferrerGateways({}, page), void 0);
82
+ (0, node_assert_strict.deepStrictEqual)(require_portable_dereference.getReferrerGateways({
83
+ id: actor.id,
84
+ gateways: []
85
+ }, page), void 0);
86
+ });
87
+ (0, node_test.test)("createSnapshotContextLoader() does not nest released snapshots", async () => {
88
+ const calls = [];
89
+ const base = (url) => {
90
+ calls.push(url);
91
+ return Promise.resolve({
92
+ contextUrl: null,
93
+ documentUrl: url,
94
+ document: { "@context": {} }
95
+ });
96
+ };
97
+ let loader = base;
98
+ for (let i = 0; i < 1e4; i++) {
99
+ const snapshot = require_portable_dereference.createSnapshotContextLoader(loader);
100
+ snapshot.release();
101
+ loader = snapshot.loader;
102
+ }
103
+ await loader("https://example.com/context");
104
+ (0, node_assert_strict.deepStrictEqual)(calls, ["https://example.com/context"]);
105
+ const outer = require_portable_dereference.createSnapshotContextLoader(base);
106
+ await outer.loader("https://example.com/context");
107
+ const inner = require_portable_dereference.createSnapshotContextLoader(outer.loader);
108
+ await inner.loader("https://example.com/context");
109
+ (0, node_assert_strict.deepStrictEqual)(calls.length, 2);
110
+ inner.release();
111
+ outer.release();
112
+ });
113
+ (0, node_test.test)("context loaders unwrap mixed released wrappers", async () => {
114
+ const calls = [];
115
+ const base = (url) => {
116
+ calls.push(url);
117
+ return Promise.resolve({
118
+ contextUrl: null,
119
+ documentUrl: url,
120
+ document: { "@context": {} }
121
+ });
122
+ };
123
+ for (const snapshotFirst of [false, true]) {
124
+ let loader = base;
125
+ for (let i = 0; i < 1e4; i++) {
126
+ const wrapper = i % 2 === 0 === snapshotFirst ? require_portable_dereference.createSnapshotContextLoader(loader, true) : require_jsonld_cache.createScopedContextLoader(loader, true);
127
+ wrapper.release();
128
+ loader = wrapper.loader;
129
+ }
130
+ const unwrapped = require_jsonld_cache.createScopedContextLoader(loader, false).loader;
131
+ (0, node_assert_strict.deepStrictEqual)(unwrapped, base);
132
+ await unwrapped("https://example.com/context");
133
+ }
134
+ (0, node_assert_strict.deepStrictEqual)(calls, ["https://example.com/context", "https://example.com/context"]);
135
+ });
136
+ (0, node_test.test)("mixed context wrappers preserve active suppression and snapshots", async () => {
137
+ for (const activeSnapshot of [false, true]) {
138
+ const calls = [];
139
+ const base = (url, options) => {
140
+ calls.push(options);
141
+ return Promise.resolve({
142
+ contextUrl: null,
143
+ documentUrl: url,
144
+ document: { "@context": {} }
145
+ });
146
+ };
147
+ const active = activeSnapshot ? require_portable_dereference.createSnapshotContextLoader(base, true) : require_jsonld_cache.createScopedContextLoader(base, true);
148
+ let loader = active.loader;
149
+ for (let i = 0; i < 4; i++) {
150
+ const wrapper = i % 2 === 0 ? require_jsonld_cache.createScopedContextLoader(loader, true) : require_portable_dereference.createSnapshotContextLoader(loader, true);
151
+ wrapper.release();
152
+ loader = wrapper.loader;
153
+ }
154
+ const unwrapped = require_jsonld_cache.createScopedContextLoader(loader, false).loader;
155
+ (0, node_assert_strict.deepStrictEqual)(unwrapped, active.loader);
156
+ const options = { signal: new AbortController().signal };
157
+ const first = await unwrapped("https://example.com/context", options);
158
+ (0, node_assert_strict.ok)(first.document != null && typeof first.document === "object");
159
+ Reflect.set(first.document, "changed", true);
160
+ (0, node_assert_strict.deepStrictEqual)((await unwrapped("https://example.com/context", options)).document, { "@context": {} });
161
+ (0, node_assert_strict.deepStrictEqual)(calls.length, activeSnapshot ? 1 : 2);
162
+ for (const call of calls) (0, node_assert_strict.deepStrictEqual)(call, {
163
+ ...options,
164
+ suppressError: true
165
+ });
166
+ active.release();
167
+ (0, node_assert_strict.deepStrictEqual)(require_jsonld_cache.createScopedContextLoader(loader, false).loader, base);
168
+ await unwrapped("https://example.com/context", options);
169
+ (0, node_assert_strict.deepStrictEqual)(calls.at(-1), options);
170
+ }
171
+ });
172
+ //#endregion
@@ -0,0 +1 @@
1
+ export { };
@@ -0,0 +1 @@
1
+ export { };
@@ -0,0 +1,173 @@
1
+ import { S as withGatewayHints, _ as parseIri } from "../url-DMxmp7ZG.mjs";
2
+ import { n as createScopedContextLoader } from "../jsonld-cache-DFnWsLuZ.mjs";
3
+ import { a as recordPortableReferrer, i as isPortableIri, n as getPortableGatewayCandidates, r as getReferrerGateways, t as createSnapshotContextLoader } from "../portable-dereference-DmTYDy2p.mjs";
4
+ import { deepStrictEqual, ok, throws } from "node:assert/strict";
5
+ import { test } from "node:test";
6
+ //#region src/internal/portable-dereference.test.ts
7
+ const hrefs = (urls) => urls.map((url) => url.href);
8
+ test("isPortableIri()", () => {
9
+ ok(isPortableIri(parseIri("ap://did:key:z6Mkabc/actor")));
10
+ ok(isPortableIri(parseIri("ap+ef61://did:key:z6Mkabc/actor")));
11
+ ok(isPortableIri(new URL("ap://did%3Akey%3Az6Mkabc/actor")));
12
+ ok(!isPortableIri(new URL("https://example.com/actor")));
13
+ ok(!isPortableIri(new URL("did:key:z6Mkabc")));
14
+ });
15
+ test("getPortableGatewayCandidates() uses explicit gateways", () => {
16
+ const url = parseIri("ap://did:key:z6Mkabc/actor?@gateway=https%3A%2F%2Fhint.example");
17
+ deepStrictEqual(hrefs(getPortableGatewayCandidates(url, [
18
+ "https://b.example",
19
+ new URL("https://a.example/"),
20
+ "https://b.example/",
21
+ "http://c.example:8080"
22
+ ])), [
23
+ "https://b.example/",
24
+ "https://a.example/",
25
+ "http://c.example:8080/"
26
+ ]);
27
+ deepStrictEqual(getPortableGatewayCandidates(url, []), []);
28
+ for (const gateway of [
29
+ "https://a.example/path",
30
+ "https://a.example/?",
31
+ "https://a.example/#",
32
+ "https://user:pass@a.example",
33
+ "ftp://a.example",
34
+ "a.example"
35
+ ]) throws(() => getPortableGatewayCandidates(url, [gateway]), TypeError);
36
+ });
37
+ test("getPortableGatewayCandidates() reads @gateway hints", () => {
38
+ deepStrictEqual(hrefs(getPortableGatewayCandidates(parseIri("ap://did:key:z6Mkabc/actor?page=1&@gateway=https%3A%2F%2Fa.example&gateways=https%3A%2F%2Flegacy.example&@gateway=not%20a%20URL&@gateway=https%3A%2F%2Fb.example%2Fpath&@gateway=https%3A%2F%2Fquery.example%2F%3F&@gateway=https%3A%2F%2Ffragment.example%2F%23&%40gateway=https%3A%2F%2Fb.example&@gateway=https%3A%2F%2Fa.example%2F"))), ["https://a.example/", "https://b.example/"]);
39
+ deepStrictEqual(getPortableGatewayCandidates(parseIri("ap://did:key:z6Mkabc/actor")), []);
40
+ const hints = Array.from({ length: 7 }, (_, i) => `@gateway=https%3A%2F%2Fg${i}.example`);
41
+ deepStrictEqual(hrefs(getPortableGatewayCandidates(parseIri(`ap://did:key:z6Mkabc/actor?${hints.join("&")}`))), [
42
+ 0,
43
+ 1,
44
+ 2,
45
+ 3,
46
+ 4
47
+ ].map((i) => `https://g${i}.example/`));
48
+ });
49
+ test("getPortableGatewayCandidates() reads hints from withGatewayHints()", () => {
50
+ const gateways = Array.from({ length: 7 }, (_, i) => `https://g${i}.example`);
51
+ deepStrictEqual(hrefs(getPortableGatewayCandidates(withGatewayHints("ap://did:key:z6Mkabc/actor?page=1", gateways))), [
52
+ 0,
53
+ 1,
54
+ 2,
55
+ 3,
56
+ 4
57
+ ].map((i) => `https://g${i}.example/`));
58
+ });
59
+ test("getReferrerGateways() takes gateways from the owner", () => {
60
+ const actor = {
61
+ id: parseIri("ap://did:key:z6Mkabc/actor"),
62
+ gateways: [
63
+ new URL("https://a.example"),
64
+ new URL("https://a.example/"),
65
+ new URL("https://b.example/path"),
66
+ new URL("https://c.example")
67
+ ]
68
+ };
69
+ const outbox = { id: parseIri("ap://did:key:z6Mkabc/actor/outbox") };
70
+ recordPortableReferrer(actor, outbox, "outbox");
71
+ const page = parseIri("ap://did:key:z6Mkabc/actor/outbox?cursor=1");
72
+ deepStrictEqual(hrefs(getReferrerGateways(actor, outbox.id) ?? []), ["https://a.example/", "https://c.example/"]);
73
+ deepStrictEqual(hrefs(getReferrerGateways(outbox, page) ?? []), ["https://a.example/", "https://c.example/"]);
74
+ deepStrictEqual(getReferrerGateways(outbox, withGatewayHints(page, [new URL("https://hint.example")])), void 0);
75
+ deepStrictEqual(getReferrerGateways(outbox, parseIri("ap://did:key:z6Mkdef/notes/1")), void 0);
76
+ const compatible = {
77
+ id: new URL("https://a.example/.well-known/apgateway/did:key:z6Mkabc/actor"),
78
+ gateways: [new URL("https://a.example")]
79
+ };
80
+ deepStrictEqual(hrefs(getReferrerGateways(compatible, outbox.id) ?? []), ["https://a.example/"]);
81
+ deepStrictEqual(getReferrerGateways({}, page), void 0);
82
+ deepStrictEqual(getReferrerGateways({
83
+ id: actor.id,
84
+ gateways: []
85
+ }, page), void 0);
86
+ });
87
+ test("createSnapshotContextLoader() does not nest released snapshots", async () => {
88
+ const calls = [];
89
+ const base = (url) => {
90
+ calls.push(url);
91
+ return Promise.resolve({
92
+ contextUrl: null,
93
+ documentUrl: url,
94
+ document: { "@context": {} }
95
+ });
96
+ };
97
+ let loader = base;
98
+ for (let i = 0; i < 1e4; i++) {
99
+ const snapshot = createSnapshotContextLoader(loader);
100
+ snapshot.release();
101
+ loader = snapshot.loader;
102
+ }
103
+ await loader("https://example.com/context");
104
+ deepStrictEqual(calls, ["https://example.com/context"]);
105
+ const outer = createSnapshotContextLoader(base);
106
+ await outer.loader("https://example.com/context");
107
+ const inner = createSnapshotContextLoader(outer.loader);
108
+ await inner.loader("https://example.com/context");
109
+ deepStrictEqual(calls.length, 2);
110
+ inner.release();
111
+ outer.release();
112
+ });
113
+ test("context loaders unwrap mixed released wrappers", async () => {
114
+ const calls = [];
115
+ const base = (url) => {
116
+ calls.push(url);
117
+ return Promise.resolve({
118
+ contextUrl: null,
119
+ documentUrl: url,
120
+ document: { "@context": {} }
121
+ });
122
+ };
123
+ for (const snapshotFirst of [false, true]) {
124
+ let loader = base;
125
+ for (let i = 0; i < 1e4; i++) {
126
+ const wrapper = i % 2 === 0 === snapshotFirst ? createSnapshotContextLoader(loader, true) : createScopedContextLoader(loader, true);
127
+ wrapper.release();
128
+ loader = wrapper.loader;
129
+ }
130
+ const unwrapped = createScopedContextLoader(loader, false).loader;
131
+ deepStrictEqual(unwrapped, base);
132
+ await unwrapped("https://example.com/context");
133
+ }
134
+ deepStrictEqual(calls, ["https://example.com/context", "https://example.com/context"]);
135
+ });
136
+ test("mixed context wrappers preserve active suppression and snapshots", async () => {
137
+ for (const activeSnapshot of [false, true]) {
138
+ const calls = [];
139
+ const base = (url, options) => {
140
+ calls.push(options);
141
+ return Promise.resolve({
142
+ contextUrl: null,
143
+ documentUrl: url,
144
+ document: { "@context": {} }
145
+ });
146
+ };
147
+ const active = activeSnapshot ? createSnapshotContextLoader(base, true) : createScopedContextLoader(base, true);
148
+ let loader = active.loader;
149
+ for (let i = 0; i < 4; i++) {
150
+ const wrapper = i % 2 === 0 ? createScopedContextLoader(loader, true) : createSnapshotContextLoader(loader, true);
151
+ wrapper.release();
152
+ loader = wrapper.loader;
153
+ }
154
+ const unwrapped = createScopedContextLoader(loader, false).loader;
155
+ deepStrictEqual(unwrapped, active.loader);
156
+ const options = { signal: new AbortController().signal };
157
+ const first = await unwrapped("https://example.com/context", options);
158
+ ok(first.document != null && typeof first.document === "object");
159
+ Reflect.set(first.document, "changed", true);
160
+ deepStrictEqual((await unwrapped("https://example.com/context", options)).document, { "@context": {} });
161
+ deepStrictEqual(calls.length, activeSnapshot ? 1 : 2);
162
+ for (const call of calls) deepStrictEqual(call, {
163
+ ...options,
164
+ suppressError: true
165
+ });
166
+ active.release();
167
+ deepStrictEqual(createScopedContextLoader(loader, false).loader, base);
168
+ await unwrapped("https://example.com/context", options);
169
+ deepStrictEqual(calls.at(-1), options);
170
+ }
171
+ });
172
+ //#endregion
173
+ export {};
@@ -0,0 +1,12 @@
1
+ const require_rolldown_runtime = require("./rolldown-runtime-emK7D4bc.cjs");
2
+ let jsonld_dist_jsonld_esm_js = require("jsonld/dist/jsonld.esm.js");
3
+ jsonld_dist_jsonld_esm_js = require_rolldown_runtime.__toESM(jsonld_dist_jsonld_esm_js, 1);
4
+ //#region src/jsonld.ts
5
+ var jsonld_default = jsonld_dist_jsonld_esm_js.default;
6
+ //#endregion
7
+ Object.defineProperty(exports, "jsonld_default", {
8
+ enumerable: true,
9
+ get: function() {
10
+ return jsonld_default;
11
+ }
12
+ });
@@ -0,0 +1,5 @@
1
+ import jsonld from "jsonld/dist/jsonld.esm.js";
2
+ //#region src/jsonld.ts
3
+ var jsonld_default = jsonld;
4
+ //#endregion
5
+ export { jsonld_default as t };