@fedify/relay 2.2.0-dev.613 → 2.2.0-dev.628
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/litepub.test.d.ts +1 -2
- package/dist/litepub.test.js +22 -41
- package/dist/mastodon.test.d.ts +1 -2
- package/dist/mastodon.test.js +26 -49
- package/dist/mod.cjs +53 -93
- package/dist/mod.d.cts +119 -19
- package/dist/mod.d.ts +119 -19
- package/dist/mod.js +25 -43
- package/dist/{types-B94EmP_a.js → types-C8ez1e8g.js} +1759 -1932
- package/package.json +6 -6
package/dist/litepub.test.d.ts
CHANGED
package/dist/litepub.test.js
CHANGED
|
@@ -1,15 +1,12 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
import { exportSpki, getDocumentLoader, isRelayFollowerData } from "./types-B94EmP_a.js";
|
|
1
|
+
import "@js-temporal/polyfill";
|
|
2
|
+
import "urlpattern-polyfill";
|
|
3
|
+
globalThis.addEventListener = () => {};
|
|
4
|
+
import { n as exportSpki, r as getDocumentLoader, t as isRelayFollowerData } from "./types-C8ez1e8g.js";
|
|
7
5
|
import { MemoryKvStore, signRequest } from "@fedify/fedify";
|
|
8
6
|
import { createRelay } from "@fedify/relay";
|
|
9
7
|
import { Accept, Announce, Create, Delete, Follow, Move, Note, Person, Undo, Update } from "@fedify/vocab";
|
|
10
8
|
import { ok, strictEqual } from "node:assert";
|
|
11
9
|
import test, { describe } from "node:test";
|
|
12
|
-
|
|
13
10
|
//#region src/litepub.test.ts
|
|
14
11
|
const mockDocumentLoader = async (url) => {
|
|
15
12
|
if (url === "https://remote.example.com/users/alice" || url === "https://remote.example.com/users/alice#main-key") return {
|
|
@@ -57,33 +54,28 @@ const rsaPublicKey = {
|
|
|
57
54
|
};
|
|
58
55
|
describe("LitePubRelay", () => {
|
|
59
56
|
test("constructor with required options", () => {
|
|
60
|
-
|
|
57
|
+
ok(createRelay("litepub", {
|
|
61
58
|
kv: new MemoryKvStore(),
|
|
62
59
|
origin: "https://relay.example.com",
|
|
63
60
|
documentLoaderFactory: () => mockDocumentLoader,
|
|
64
61
|
subscriptionHandler: async (_ctx, _actor) => {
|
|
65
62
|
return await Promise.resolve(true);
|
|
66
63
|
}
|
|
67
|
-
};
|
|
68
|
-
const relay = createRelay("litepub", options);
|
|
69
|
-
ok(relay);
|
|
64
|
+
}));
|
|
70
65
|
});
|
|
71
66
|
test("fetch method returns Response", async () => {
|
|
72
|
-
const kv = new MemoryKvStore();
|
|
73
67
|
const relay = createRelay("litepub", {
|
|
74
|
-
kv,
|
|
68
|
+
kv: new MemoryKvStore(),
|
|
75
69
|
origin: "https://relay.example.com",
|
|
76
70
|
documentLoaderFactory: () => mockDocumentLoader,
|
|
77
71
|
subscriptionHandler: () => Promise.resolve(true)
|
|
78
72
|
});
|
|
79
73
|
const request = new Request("https://relay.example.com/users/relay", { headers: { "Accept": "application/activity+json" } });
|
|
80
|
-
|
|
81
|
-
ok(response instanceof Response);
|
|
74
|
+
ok(await relay.fetch(request) instanceof Response);
|
|
82
75
|
});
|
|
83
76
|
test("fetching relay actor returns Application", async () => {
|
|
84
|
-
const kv = new MemoryKvStore();
|
|
85
77
|
const relay = createRelay("litepub", {
|
|
86
|
-
kv,
|
|
78
|
+
kv: new MemoryKvStore(),
|
|
87
79
|
origin: "https://relay.example.com",
|
|
88
80
|
documentLoaderFactory: () => mockDocumentLoader,
|
|
89
81
|
subscriptionHandler: () => Promise.resolve(true)
|
|
@@ -97,21 +89,18 @@ describe("LitePubRelay", () => {
|
|
|
97
89
|
strictEqual(json.name, "ActivityPub Relay");
|
|
98
90
|
});
|
|
99
91
|
test("fetching non-relay actor returns 404", async () => {
|
|
100
|
-
const kv = new MemoryKvStore();
|
|
101
92
|
const relay = createRelay("litepub", {
|
|
102
|
-
kv,
|
|
93
|
+
kv: new MemoryKvStore(),
|
|
103
94
|
origin: "https://relay.example.com",
|
|
104
95
|
documentLoaderFactory: () => mockDocumentLoader,
|
|
105
96
|
subscriptionHandler: () => Promise.resolve(true)
|
|
106
97
|
});
|
|
107
98
|
const request = new Request("https://relay.example.com/users/non-existent", { headers: { "Accept": "application/activity+json" } });
|
|
108
|
-
|
|
109
|
-
strictEqual(response.status, 404);
|
|
99
|
+
strictEqual((await relay.fetch(request)).status, 404);
|
|
110
100
|
});
|
|
111
101
|
test("followers collection returns empty list initially", async () => {
|
|
112
|
-
const kv = new MemoryKvStore();
|
|
113
102
|
const relay = createRelay("litepub", {
|
|
114
|
-
kv,
|
|
103
|
+
kv: new MemoryKvStore(),
|
|
115
104
|
origin: "https://relay.example.com",
|
|
116
105
|
documentLoaderFactory: () => mockDocumentLoader,
|
|
117
106
|
subscriptionHandler: () => Promise.resolve(true)
|
|
@@ -160,9 +149,8 @@ describe("LitePubRelay", () => {
|
|
|
160
149
|
if (json.totalItems !== void 0) strictEqual(json.totalItems, 2);
|
|
161
150
|
});
|
|
162
151
|
test("relay actor has correct properties", async () => {
|
|
163
|
-
const kv = new MemoryKvStore();
|
|
164
152
|
const relay = createRelay("litepub", {
|
|
165
|
-
kv,
|
|
153
|
+
kv: new MemoryKvStore(),
|
|
166
154
|
origin: "https://relay.example.com",
|
|
167
155
|
documentLoaderFactory: () => mockDocumentLoader,
|
|
168
156
|
subscriptionHandler: () => Promise.resolve(true)
|
|
@@ -245,8 +233,7 @@ describe("LitePubRelay", () => {
|
|
|
245
233
|
});
|
|
246
234
|
request = await signRequest(request, rsaKeyPair.privateKey, rsaPublicKey.id);
|
|
247
235
|
await relay.fetch(request);
|
|
248
|
-
|
|
249
|
-
strictEqual(followerData, void 0);
|
|
236
|
+
strictEqual(await kv.get(["follower", "https://remote.example.com/users/alice"]), void 0);
|
|
250
237
|
});
|
|
251
238
|
test("handles public Follow activity", async () => {
|
|
252
239
|
const kv = new MemoryKvStore();
|
|
@@ -298,8 +285,7 @@ describe("LitePubRelay", () => {
|
|
|
298
285
|
});
|
|
299
286
|
request = await signRequest(request, rsaKeyPair.privateKey, rsaPublicKey.id);
|
|
300
287
|
await relay.fetch(request);
|
|
301
|
-
|
|
302
|
-
strictEqual(followerData, void 0);
|
|
288
|
+
strictEqual(await kv.get(["follower", "https://remote.example.com/users/alice"]), void 0);
|
|
303
289
|
});
|
|
304
290
|
test("ignores duplicate Follow activity from pending follower", async () => {
|
|
305
291
|
const kv = new MemoryKvStore();
|
|
@@ -412,8 +398,7 @@ describe("LitePubRelay", () => {
|
|
|
412
398
|
});
|
|
413
399
|
request = await signRequest(request, rsaKeyPair.privateKey, rsaPublicKey.id);
|
|
414
400
|
await relay.fetch(request);
|
|
415
|
-
|
|
416
|
-
strictEqual(followerData, void 0);
|
|
401
|
+
strictEqual(await kv.get(["follower", followerId]), void 0);
|
|
417
402
|
});
|
|
418
403
|
test("handles Create activity with Announce forwarding", async () => {
|
|
419
404
|
const kv = new MemoryKvStore();
|
|
@@ -453,9 +438,8 @@ describe("LitePubRelay", () => {
|
|
|
453
438
|
ok(response.status === 200 || response.status === 202);
|
|
454
439
|
});
|
|
455
440
|
test("handles Update activity with Announce forwarding", async () => {
|
|
456
|
-
const kv = new MemoryKvStore();
|
|
457
441
|
const relay = createRelay("litepub", {
|
|
458
|
-
kv,
|
|
442
|
+
kv: new MemoryKvStore(),
|
|
459
443
|
origin: "https://relay.example.com",
|
|
460
444
|
documentLoaderFactory: () => mockDocumentLoader,
|
|
461
445
|
authenticatedDocumentLoaderFactory: () => mockDocumentLoader,
|
|
@@ -480,9 +464,8 @@ describe("LitePubRelay", () => {
|
|
|
480
464
|
ok(response.status === 200 || response.status === 202);
|
|
481
465
|
});
|
|
482
466
|
test("handles Move activity with Announce forwarding", async () => {
|
|
483
|
-
const kv = new MemoryKvStore();
|
|
484
467
|
const relay = createRelay("litepub", {
|
|
485
|
-
kv,
|
|
468
|
+
kv: new MemoryKvStore(),
|
|
486
469
|
origin: "https://relay.example.com",
|
|
487
470
|
documentLoaderFactory: () => mockDocumentLoader,
|
|
488
471
|
authenticatedDocumentLoaderFactory: () => mockDocumentLoader,
|
|
@@ -504,9 +487,8 @@ describe("LitePubRelay", () => {
|
|
|
504
487
|
ok(response.status === 200 || response.status === 202);
|
|
505
488
|
});
|
|
506
489
|
test("handles Delete activity with Announce forwarding", async () => {
|
|
507
|
-
const kv = new MemoryKvStore();
|
|
508
490
|
const relay = createRelay("litepub", {
|
|
509
|
-
kv,
|
|
491
|
+
kv: new MemoryKvStore(),
|
|
510
492
|
origin: "https://relay.example.com",
|
|
511
493
|
documentLoaderFactory: () => mockDocumentLoader,
|
|
512
494
|
authenticatedDocumentLoaderFactory: () => mockDocumentLoader,
|
|
@@ -527,9 +509,8 @@ describe("LitePubRelay", () => {
|
|
|
527
509
|
ok(response.status === 200 || response.status === 202);
|
|
528
510
|
});
|
|
529
511
|
test("handles Announce activity forwarding", async () => {
|
|
530
|
-
const kv = new MemoryKvStore();
|
|
531
512
|
const relay = createRelay("litepub", {
|
|
532
|
-
kv,
|
|
513
|
+
kv: new MemoryKvStore(),
|
|
533
514
|
origin: "https://relay.example.com",
|
|
534
515
|
documentLoaderFactory: () => mockDocumentLoader,
|
|
535
516
|
authenticatedDocumentLoaderFactory: () => mockDocumentLoader,
|
|
@@ -697,5 +678,5 @@ describe("LitePubRelay", () => {
|
|
|
697
678
|
}
|
|
698
679
|
});
|
|
699
680
|
});
|
|
700
|
-
|
|
701
|
-
|
|
681
|
+
//#endregion
|
|
682
|
+
export {};
|
package/dist/mastodon.test.d.ts
CHANGED
package/dist/mastodon.test.js
CHANGED
|
@@ -1,15 +1,12 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
import { exportSpki, getDocumentLoader, isRelayFollowerData } from "./types-B94EmP_a.js";
|
|
1
|
+
import "@js-temporal/polyfill";
|
|
2
|
+
import "urlpattern-polyfill";
|
|
3
|
+
globalThis.addEventListener = () => {};
|
|
4
|
+
import { n as exportSpki, r as getDocumentLoader, t as isRelayFollowerData } from "./types-C8ez1e8g.js";
|
|
7
5
|
import { MemoryKvStore, signRequest } from "@fedify/fedify";
|
|
8
6
|
import { createRelay } from "@fedify/relay";
|
|
9
7
|
import { Create, Delete, Follow, Move, Note, Person, Undo, Update } from "@fedify/vocab";
|
|
10
8
|
import { ok, strictEqual } from "node:assert";
|
|
11
9
|
import test, { describe } from "node:test";
|
|
12
|
-
|
|
13
10
|
//#region src/mastodon.test.ts
|
|
14
11
|
const mockDocumentLoader = async (url) => {
|
|
15
12
|
if (url === "https://remote.example.com/users/alice" || url === "https://remote.example.com/users/alice#main-key") return {
|
|
@@ -57,33 +54,28 @@ const rsaPublicKey = {
|
|
|
57
54
|
};
|
|
58
55
|
describe("MastodonRelay", () => {
|
|
59
56
|
test("constructor with required options", () => {
|
|
60
|
-
|
|
57
|
+
ok(createRelay("mastodon", {
|
|
61
58
|
kv: new MemoryKvStore(),
|
|
62
59
|
origin: "https://relay.example.com",
|
|
63
60
|
documentLoaderFactory: () => mockDocumentLoader,
|
|
64
61
|
subscriptionHandler: async (_ctx, _actor) => {
|
|
65
62
|
return await Promise.resolve(true);
|
|
66
63
|
}
|
|
67
|
-
};
|
|
68
|
-
const relay = createRelay("mastodon", options);
|
|
69
|
-
ok(relay);
|
|
64
|
+
}));
|
|
70
65
|
});
|
|
71
66
|
test("fetch method returns Response", async () => {
|
|
72
|
-
const kv = new MemoryKvStore();
|
|
73
67
|
const relay = createRelay("mastodon", {
|
|
74
|
-
kv,
|
|
68
|
+
kv: new MemoryKvStore(),
|
|
75
69
|
origin: "https://relay.example.com",
|
|
76
70
|
documentLoaderFactory: () => mockDocumentLoader,
|
|
77
71
|
subscriptionHandler: () => Promise.resolve(true)
|
|
78
72
|
});
|
|
79
73
|
const request = new Request("https://relay.example.com/users/relay", { headers: { "Accept": "application/activity+json" } });
|
|
80
|
-
|
|
81
|
-
ok(response instanceof Response);
|
|
74
|
+
ok(await relay.fetch(request) instanceof Response);
|
|
82
75
|
});
|
|
83
76
|
test("fetching relay actor returns Application", async () => {
|
|
84
|
-
const kv = new MemoryKvStore();
|
|
85
77
|
const relay = createRelay("mastodon", {
|
|
86
|
-
kv,
|
|
78
|
+
kv: new MemoryKvStore(),
|
|
87
79
|
origin: "https://relay.example.com",
|
|
88
80
|
documentLoaderFactory: () => mockDocumentLoader,
|
|
89
81
|
subscriptionHandler: () => Promise.resolve(true)
|
|
@@ -97,21 +89,18 @@ describe("MastodonRelay", () => {
|
|
|
97
89
|
strictEqual(json.name, "ActivityPub Relay");
|
|
98
90
|
});
|
|
99
91
|
test("fetching non-relay actor returns 404", async () => {
|
|
100
|
-
const kv = new MemoryKvStore();
|
|
101
92
|
const relay = createRelay("mastodon", {
|
|
102
|
-
kv,
|
|
93
|
+
kv: new MemoryKvStore(),
|
|
103
94
|
origin: "https://relay.example.com",
|
|
104
95
|
documentLoaderFactory: () => mockDocumentLoader,
|
|
105
96
|
subscriptionHandler: () => Promise.resolve(true)
|
|
106
97
|
});
|
|
107
98
|
const request = new Request("https://relay.example.com/users/non-existent", { headers: { "Accept": "application/activity+json" } });
|
|
108
|
-
|
|
109
|
-
strictEqual(response.status, 404);
|
|
99
|
+
strictEqual((await relay.fetch(request)).status, 404);
|
|
110
100
|
});
|
|
111
101
|
test("followers collection returns empty list initially", async () => {
|
|
112
|
-
const kv = new MemoryKvStore();
|
|
113
102
|
const relay = createRelay("mastodon", {
|
|
114
|
-
kv,
|
|
103
|
+
kv: new MemoryKvStore(),
|
|
115
104
|
origin: "https://relay.example.com",
|
|
116
105
|
documentLoaderFactory: () => mockDocumentLoader,
|
|
117
106
|
subscriptionHandler: () => Promise.resolve(true)
|
|
@@ -171,8 +160,7 @@ describe("MastodonRelay", () => {
|
|
|
171
160
|
actor: await follower.toJsonLd(),
|
|
172
161
|
state: "accepted"
|
|
173
162
|
});
|
|
174
|
-
|
|
175
|
-
ok(storedActor);
|
|
163
|
+
ok(await kv.get(["follower", followerId]));
|
|
176
164
|
});
|
|
177
165
|
test("removes follower from KV when Undo Follow is received", async () => {
|
|
178
166
|
const kv = new MemoryKvStore();
|
|
@@ -187,13 +175,11 @@ describe("MastodonRelay", () => {
|
|
|
187
175
|
state: "accepted"
|
|
188
176
|
});
|
|
189
177
|
await kv.delete(["follower", followerId]);
|
|
190
|
-
|
|
191
|
-
strictEqual(storedActor, void 0);
|
|
178
|
+
strictEqual(await kv.get(["follower", followerId]), void 0);
|
|
192
179
|
});
|
|
193
180
|
test("relay actor has correct properties", async () => {
|
|
194
|
-
const kv = new MemoryKvStore();
|
|
195
181
|
const relay = createRelay("mastodon", {
|
|
196
|
-
kv,
|
|
182
|
+
kv: new MemoryKvStore(),
|
|
197
183
|
origin: "https://relay.example.com",
|
|
198
184
|
documentLoaderFactory: () => mockDocumentLoader,
|
|
199
185
|
subscriptionHandler: () => Promise.resolve(true)
|
|
@@ -267,8 +253,7 @@ describe("MastodonRelay", () => {
|
|
|
267
253
|
await relay.fetch(request);
|
|
268
254
|
strictEqual(handlerCalled, true);
|
|
269
255
|
ok(handlerActor);
|
|
270
|
-
|
|
271
|
-
ok(followerData);
|
|
256
|
+
ok(await kv.get(["follower", "https://remote.example.com/users/alice"]));
|
|
272
257
|
});
|
|
273
258
|
test("handles Follow activity with subscription rejection", async () => {
|
|
274
259
|
const kv = new MemoryKvStore();
|
|
@@ -298,8 +283,7 @@ describe("MastodonRelay", () => {
|
|
|
298
283
|
});
|
|
299
284
|
request = await signRequest(request, rsaKeyPair.privateKey, rsaPublicKey.id);
|
|
300
285
|
await relay.fetch(request);
|
|
301
|
-
|
|
302
|
-
strictEqual(followerData, void 0);
|
|
286
|
+
strictEqual(await kv.get(["follower", "https://remote.example.com/users/alice"]), void 0);
|
|
303
287
|
});
|
|
304
288
|
test("handles Undo Follow activity", async () => {
|
|
305
289
|
const kv = new MemoryKvStore();
|
|
@@ -338,8 +322,7 @@ describe("MastodonRelay", () => {
|
|
|
338
322
|
});
|
|
339
323
|
request = await signRequest(request, rsaKeyPair.privateKey, rsaPublicKey.id);
|
|
340
324
|
await relay.fetch(request);
|
|
341
|
-
|
|
342
|
-
strictEqual(followerData, void 0);
|
|
325
|
+
strictEqual(await kv.get(["follower", followerId]), void 0);
|
|
343
326
|
});
|
|
344
327
|
test("handles Create activity forwarding", async () => {
|
|
345
328
|
const kv = new MemoryKvStore();
|
|
@@ -379,9 +362,8 @@ describe("MastodonRelay", () => {
|
|
|
379
362
|
ok(response.status === 200 || response.status === 202);
|
|
380
363
|
});
|
|
381
364
|
test("handles Delete activity forwarding", async () => {
|
|
382
|
-
const kv = new MemoryKvStore();
|
|
383
365
|
const relay = createRelay("mastodon", {
|
|
384
|
-
kv,
|
|
366
|
+
kv: new MemoryKvStore(),
|
|
385
367
|
origin: "https://relay.example.com",
|
|
386
368
|
documentLoaderFactory: () => mockDocumentLoader,
|
|
387
369
|
authenticatedDocumentLoaderFactory: () => mockDocumentLoader,
|
|
@@ -402,9 +384,8 @@ describe("MastodonRelay", () => {
|
|
|
402
384
|
ok(response.status === 200 || response.status === 202);
|
|
403
385
|
});
|
|
404
386
|
test("handles Update activity forwarding", async () => {
|
|
405
|
-
const kv = new MemoryKvStore();
|
|
406
387
|
const relay = createRelay("mastodon", {
|
|
407
|
-
kv,
|
|
388
|
+
kv: new MemoryKvStore(),
|
|
408
389
|
origin: "https://relay.example.com",
|
|
409
390
|
documentLoaderFactory: () => mockDocumentLoader,
|
|
410
391
|
authenticatedDocumentLoaderFactory: () => mockDocumentLoader,
|
|
@@ -429,9 +410,8 @@ describe("MastodonRelay", () => {
|
|
|
429
410
|
ok(response.status === 200 || response.status === 202);
|
|
430
411
|
});
|
|
431
412
|
test("handles Move activity forwarding", async () => {
|
|
432
|
-
const kv = new MemoryKvStore();
|
|
433
413
|
const relay = createRelay("mastodon", {
|
|
434
|
-
kv,
|
|
414
|
+
kv: new MemoryKvStore(),
|
|
435
415
|
origin: "https://relay.example.com",
|
|
436
416
|
documentLoaderFactory: () => mockDocumentLoader,
|
|
437
417
|
authenticatedDocumentLoaderFactory: () => mockDocumentLoader,
|
|
@@ -472,8 +452,7 @@ describe("MastodonRelay", () => {
|
|
|
472
452
|
});
|
|
473
453
|
request = await signRequest(request, rsaKeyPair.privateKey, rsaPublicKey.id);
|
|
474
454
|
await relay.fetch(request);
|
|
475
|
-
|
|
476
|
-
strictEqual(followerData, void 0);
|
|
455
|
+
strictEqual(await kv.get(["follower", "https://remote.example.com/users/alice"]), void 0);
|
|
477
456
|
});
|
|
478
457
|
test("handles public Follow activity", async () => {
|
|
479
458
|
const kv = new MemoryKvStore();
|
|
@@ -501,8 +480,7 @@ describe("MastodonRelay", () => {
|
|
|
501
480
|
});
|
|
502
481
|
request = await signRequest(request, rsaKeyPair.privateKey, rsaPublicKey.id);
|
|
503
482
|
await relay.fetch(request);
|
|
504
|
-
|
|
505
|
-
ok(followerData);
|
|
483
|
+
ok(await kv.get(["follower", "https://remote.example.com/users/alice"]));
|
|
506
484
|
});
|
|
507
485
|
test("list() returns empty when no followers exist", async () => {
|
|
508
486
|
const kv = new MemoryKvStore();
|
|
@@ -656,9 +634,8 @@ describe("MastodonRelay", () => {
|
|
|
656
634
|
ok(result.actor);
|
|
657
635
|
strictEqual(result.actor.preferredUsername, "alice");
|
|
658
636
|
strictEqual(result.actor.inboxId?.href, "https://remote.example.com/users/alice/inbox");
|
|
659
|
-
|
|
660
|
-
strictEqual(nonExistent, null);
|
|
637
|
+
strictEqual(await relay.getFollower("https://remote.example.com/users/nonexistent"), null);
|
|
661
638
|
});
|
|
662
639
|
});
|
|
663
|
-
|
|
664
|
-
|
|
640
|
+
//#endregion
|
|
641
|
+
export {};
|