@fedify/fedify 2.0.0-dev.1690 → 2.0.0-dev.170
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/LICENSE +1 -1
- package/README.md +70 -34
- package/dist/{assert_rejects-DiIiJbZn.js → assert_rejects-Ce45JcFg.js} +1 -1
- package/dist/{assert_is_error-BPGph1Jx.js → assert_throws-BNXdRGWP.js} +31 -1
- package/dist/{builder-CYOcDUkj.js → builder-_MVsWtsS.js} +9 -8
- package/dist/{client-bgSdkFa2.d.ts → client-CUTUGgvJ.d.ts} +19 -19
- package/dist/{client-CnOdwLLN.js → client-Dg7OfUDA.js} +28 -23
- package/dist/{client-CegPX0Rn.d.cts → client-by-PEGAJ.d.cts} +19 -19
- package/dist/compat/mod.cjs +1 -1
- package/dist/compat/mod.d.cts +6 -12
- package/dist/compat/mod.d.ts +6 -12
- package/dist/compat/mod.js +1 -1
- package/dist/compat/transformers.test.js +19 -18
- package/dist/context-Bns6uTJq.js +109 -0
- package/dist/{context-ByZprN0S.d.ts → context-C7vzWilY.d.ts} +314 -182
- package/dist/{context-C5BsZkDr.d.cts → context-CrB9RFy5.d.cts} +314 -182
- package/dist/deno-DhWON59o.js +117 -0
- package/dist/{testing-BWNCAbL-.js → dist-B5f6a8Tt.js} +90 -111
- package/dist/{authdocloader-Brax1A32.js → docloader-Cni79dmb.js} +17 -8
- package/dist/{esm-DnIzfEj0.js → esm-DGl7uK1r.js} +32 -17
- package/dist/federation/builder.test.js +11 -11
- package/dist/federation/collection.test.js +5 -8
- package/dist/federation/handler.test.js +111 -24
- package/dist/federation/idempotency.test.js +24 -24
- package/dist/federation/inbox.test.js +5 -6
- package/dist/federation/keycache.test.js +4 -5
- package/dist/federation/kv.test.js +60 -9
- package/dist/federation/middleware.test.js +102 -101
- package/dist/federation/mod.cjs +8 -12
- package/dist/federation/mod.d.cts +7 -13
- package/dist/federation/mod.d.ts +7 -13
- package/dist/federation/mod.js +8 -13
- package/dist/federation/mq.test.js +9 -10
- package/dist/federation/negotiation.test.js +5 -8
- package/dist/federation/retry.test.js +2 -4
- package/dist/federation/router.test.js +6 -8
- package/dist/federation/send.test.js +55 -15
- package/dist/{webfinger/handler.test.js → federation/webfinger.test.js} +25 -24
- package/dist/{federation-H2_En3j5.cjs → federation-B431K2gm.cjs} +22 -0
- package/dist/{federation-D1U8YY9t.js → federation-BbZwNNWj.js} +28 -6
- package/dist/{http-C7vbQwbz.cjs → http-7RQPvAkX.cjs} +410 -14
- package/dist/{http-BxbM8sEy.js → http-CZXlv4xU.js} +371 -11
- package/dist/{http-D-e6AFwR.d.cts → http-ClB3pLcL.d.cts} +2 -2
- package/dist/{http-BNOYnVsU.js → http-CwsBL5_A.js} +3 -2
- package/dist/{http-D6Uj2x2y.d.ts → http-DLBDPal9.d.ts} +2 -2
- package/dist/{inbox-BRru9pX3.js → inbox-CukSCwad.js} +2 -1
- package/dist/{key-1KXru8Ug.js → key-DKkHKzvg.js} +3 -2
- package/dist/{keycache-CN61iGVj.js → keycache-DRxpZ5r9.js} +1 -1
- package/dist/{keys-BPdFKgiy.js → keys-ZbcByPg9.js} +2 -1
- package/dist/{kv-63Cil1MD.d.cts → kv-B4vFhIYL.d.cts} +30 -1
- package/dist/{kv-C7sopW2E.d.ts → kv-CYySNrsn.d.ts} +30 -1
- package/dist/{kv-CRZrzyXm.js → kv-QzKcOQgP.js} +22 -0
- package/dist/kv-cache-BEeqyGER.js +107 -0
- package/dist/kv-cache-BVA7CrnS.cjs +134 -0
- package/dist/kv-cache-HDuc4ZaJ.js +122 -0
- package/dist/{ld-Dv8DNNAT.js → ld-CM6OO5ar.js} +4 -2
- package/dist/middleware--i9t8nKh.js +26 -0
- package/dist/middleware-C567nJlD.cjs +12 -0
- package/dist/middleware-D9oWuacw.js +12 -0
- package/dist/{middleware-DY9B2lL8.js → middleware-DXRcwk_y.js} +185 -192
- package/dist/{middleware-BmoOlgc1.cjs → middleware-TufpQUzj.cjs} +251 -241
- package/dist/{middleware-Bz_A2jeJ.js → middleware-eDeNdyRA.js} +195 -191
- package/dist/mod-0p9zUdzg.d.cts +107 -0
- package/dist/mod-0qnPv4EC.d.cts +62 -0
- package/dist/{mod-Djzcw2ry.d.cts → mod-BrS8tiad.d.cts} +3 -3
- package/dist/mod-C3SOvTD1.d.ts +64 -0
- package/dist/{mod-8DMWKtQE.d.cts → mod-D6pS5_xJ.d.cts} +4 -4
- package/dist/{mod-BhUKmBJD.d.ts → mod-jOa7W503.d.ts} +3 -3
- package/dist/{mod-D6hQoxC5.d.ts → mod-waqu-BL_.d.ts} +4 -4
- package/dist/mod-xc20HhMD.d.ts +109 -0
- package/dist/mod.cjs +17 -112
- package/dist/mod.d.cts +11 -17
- package/dist/mod.d.ts +11 -17
- package/dist/mod.js +11 -17
- package/dist/nodeinfo/client.test.js +7 -10
- package/dist/nodeinfo/handler.test.js +23 -23
- package/dist/nodeinfo/mod.cjs +2 -3
- package/dist/nodeinfo/mod.d.cts +2 -4
- package/dist/nodeinfo/mod.d.ts +2 -4
- package/dist/nodeinfo/mod.js +2 -3
- package/dist/nodeinfo/types.test.js +6 -9
- package/dist/otel/exporter.test.js +893 -0
- package/dist/otel/mod.cjs +256 -0
- package/dist/otel/mod.d.cts +230 -0
- package/dist/otel/mod.d.ts +232 -0
- package/dist/otel/mod.js +255 -0
- package/dist/{owner-e3FYDhsk.js → owner-BOEfZQv2.js} +45 -8
- package/dist/{owner-hd9lvQcP.d.ts → owner-BgI8C-VY.d.ts} +2 -3
- package/dist/{owner-BN_tO3cY.d.cts → owner-C-zfmVAD.d.cts} +2 -3
- package/dist/{proof-B-eqv0Ug.cjs → proof-CaDQpGJD.cjs} +69 -33
- package/dist/{proof-DfgvA3al.js → proof-iYIDiv8I.js} +47 -11
- package/dist/{proof-6gFMwMNJ.js → proof-iw6KtIyj.js} +3 -2
- package/dist/router-D9eI0s4b.js +118 -0
- package/dist/{send-Tl9NOnmO.js → send-Bn8o0mjW.js} +9 -4
- package/dist/sig/http.test.js +11 -13
- package/dist/sig/key.test.js +9 -11
- package/dist/sig/ld.test.js +8 -10
- package/dist/sig/mod.cjs +7 -11
- package/dist/sig/mod.d.cts +3 -7
- package/dist/sig/mod.d.ts +3 -7
- package/dist/sig/mod.js +3 -7
- package/dist/sig/owner.test.js +33 -12
- package/dist/sig/proof.test.js +13 -14
- package/dist/testing/mod.d.ts +183 -7194
- package/dist/testing/mod.js +4 -4
- package/dist/{transformers-CoBS-oFG.cjs → transformers-BjBg6Lag.cjs} +2 -2
- package/dist/{transformers-BFT6d7J5.js → transformers-N_ip_y4P.js} +2 -2
- package/dist/{types-DqxyTxOf.js → types-8l28uC8o.js} +31 -26
- package/dist/{types-zqdWZh4O.cjs → types-B6z6CqIz.cjs} +33 -28
- package/dist/{types-BSuWJsOm.js → types-CPz01LGH.js} +3 -3
- package/dist/{runtime/authdocloader.test.js → utils/docloader.test.js} +13 -15
- package/dist/utils/kv-cache.test.js +211 -0
- package/dist/utils/mod.cjs +10 -0
- package/dist/utils/mod.d.cts +4 -0
- package/dist/utils/mod.d.ts +6 -0
- package/dist/utils/mod.js +9 -0
- package/package.json +34 -75
- package/dist/actor-Be0ThtXy.cjs +0 -42609
- package/dist/actor-ChbPLm6n.js +0 -42135
- package/dist/actor-D6K058Tb.d.cts +0 -128
- package/dist/actor-DuCeRiNh.js +0 -146
- package/dist/actor-T6RyhRgk.d.ts +0 -130
- package/dist/assert_throws-BOO88avQ.js +0 -39
- package/dist/authdocloader-CrxhFL8e.js +0 -52
- package/dist/authdocloader-OSn_teLV.cjs +0 -58
- package/dist/denokv-Bv33Xxea.js +0 -57
- package/dist/docloader-CCqXeagZ.cjs +0 -4861
- package/dist/docloader-CxWcuWqQ.d.ts +0 -221
- package/dist/docloader-D-MrRyHl.d.cts +0 -219
- package/dist/docloader-XK3y2jn5.js +0 -4795
- package/dist/fixtures/activitypub.academy/users/brauca_darradiul.json +0 -83
- package/dist/fixtures/example.com/announce.json +0 -6
- package/dist/fixtures/example.com/collection.json +0 -19
- package/dist/fixtures/example.com/create.json +0 -6
- package/dist/fixtures/example.com/cross-origin-actor.json +0 -6
- package/dist/fixtures/example.com/hong-gildong.json +0 -11
- package/dist/fixtures/example.com/invite.json +0 -7
- package/dist/fixtures/example.com/key.json +0 -7
- package/dist/fixtures/example.com/key2.json +0 -6
- package/dist/fixtures/example.com/object.json +0 -6
- package/dist/fixtures/example.com/orderedcollectionpage.json +0 -24
- package/dist/fixtures/example.com/paged/a.json +0 -13
- package/dist/fixtures/example.com/paged/b.json +0 -16
- package/dist/fixtures/example.com/paged-collection.json +0 -6
- package/dist/fixtures/example.com/person.json +0 -22
- package/dist/fixtures/example.com/person2.json +0 -40
- package/dist/fixtures/example.com/test.json +0 -5
- package/dist/fixtures/example.com/users/handle.json +0 -16
- package/dist/fixtures/example.com/wrong-type.json +0 -3
- package/dist/fixtures/media.example.com/avatars/test-avatar.jpg.json +0 -6
- package/dist/fixtures/oeee.cafe/ap/users/3609fd4e-d51d-4db8-9f04-4189815864dd.json +0 -24
- package/dist/fixtures/remote.domain/users/bob.json +0 -20
- package/dist/fixtures/server.example/users/alice.json +0 -20
- package/dist/fixtures/w3id.org/identity/v1.json +0 -152
- package/dist/fixtures/w3id.org/security/data-integrity/v1.json +0 -74
- package/dist/fixtures/w3id.org/security/multikey/v1.json +0 -35
- package/dist/fixtures/w3id.org/security/v1.json +0 -50
- package/dist/fixtures/wizard.casa/users/hongminhee.json +0 -69
- package/dist/fixtures/www.w3.org/ns/activitystreams.json +0 -379
- package/dist/fixtures/www.w3.org/ns/did/v1.json +0 -58
- package/dist/key-B3uag-rz.js +0 -10
- package/dist/key-BiBmb1Yy.cjs +0 -10
- package/dist/key-DK_nfU4I.js +0 -10
- package/dist/key-Z6ceKnZC.cjs +0 -290
- package/dist/key-jyNTxCvK.js +0 -260
- package/dist/lookup-BPviO8ij.js +0 -131
- package/dist/lookup-hnMAAU5r.cjs +0 -137
- package/dist/lookup-pV0JOsuV.js +0 -331
- package/dist/middleware-CI0-zw4U.js +0 -26
- package/dist/middleware-QNK-W-jE.cjs +0 -17
- package/dist/middleware-_vjt6FWU.js +0 -17
- package/dist/mod-CerN_Sza.d.ts +0 -104
- package/dist/mod-Cj1tHXBR.d.cts +0 -102
- package/dist/mod-CxkWO3Mg.d.cts +0 -307
- package/dist/mod-DBzN0aCM.d.ts +0 -115
- package/dist/mod-DlU8ISoa.d.ts +0 -309
- package/dist/mod-FZd39qVq.d.cts +0 -1
- package/dist/mod-g0xFzAP9.d.ts +0 -2
- package/dist/mod-jQ4OODsl.d.cts +0 -113
- package/dist/mq-B7R1Q-M5.d.cts +0 -140
- package/dist/mq-CRGm1e_F.d.ts +0 -143
- package/dist/runtime/docloader.test.js +0 -522
- package/dist/runtime/key.test.js +0 -103
- package/dist/runtime/langstr.test.d.ts +0 -3
- package/dist/runtime/langstr.test.js +0 -39
- package/dist/runtime/link.test.d.ts +0 -3
- package/dist/runtime/link.test.js +0 -61
- package/dist/runtime/mod.cjs +0 -25
- package/dist/runtime/mod.d.cts +0 -6
- package/dist/runtime/mod.d.ts +0 -8
- package/dist/runtime/mod.js +0 -13
- package/dist/runtime/multibase/multibase.test.d.ts +0 -3
- package/dist/runtime/multibase/multibase.test.js +0 -358
- package/dist/runtime/url.test.d.ts +0 -3
- package/dist/runtime/url.test.js +0 -45
- package/dist/src/vocab/accept.yaml +0 -15
- package/dist/src/vocab/activity.yaml +0 -98
- package/dist/src/vocab/add.yaml +0 -16
- package/dist/src/vocab/announce.yaml +0 -30
- package/dist/src/vocab/application.yaml +0 -324
- package/dist/src/vocab/arrive.yaml +0 -15
- package/dist/src/vocab/article.yaml +0 -46
- package/dist/src/vocab/audio.yaml +0 -11
- package/dist/src/vocab/block.yaml +0 -16
- package/dist/src/vocab/chatmessage.yaml +0 -50
- package/dist/src/vocab/collection.yaml +0 -154
- package/dist/src/vocab/collectionpage.yaml +0 -55
- package/dist/src/vocab/create.yaml +0 -28
- package/dist/src/vocab/dataintegrityproof.yaml +0 -56
- package/dist/src/vocab/delete.yaml +0 -27
- package/dist/src/vocab/didservice.yaml +0 -22
- package/dist/src/vocab/dislike.yaml +0 -14
- package/dist/src/vocab/document.yaml +0 -31
- package/dist/src/vocab/emoji.yaml +0 -12
- package/dist/src/vocab/emojireact.yaml +0 -17
- package/dist/src/vocab/endpoints.yaml +0 -85
- package/dist/src/vocab/event.yaml +0 -11
- package/dist/src/vocab/export.yaml +0 -9
- package/dist/src/vocab/flag.yaml +0 -15
- package/dist/src/vocab/follow.yaml +0 -19
- package/dist/src/vocab/group.yaml +0 -324
- package/dist/src/vocab/hashtag.yaml +0 -14
- package/dist/src/vocab/ignore.yaml +0 -14
- package/dist/src/vocab/image.yaml +0 -9
- package/dist/src/vocab/intransitiveactivity.yaml +0 -15
- package/dist/src/vocab/invite.yaml +0 -14
- package/dist/src/vocab/join.yaml +0 -14
- package/dist/src/vocab/key.yaml +0 -28
- package/dist/src/vocab/leave.yaml +0 -14
- package/dist/src/vocab/like.yaml +0 -16
- package/dist/src/vocab/link.yaml +0 -101
- package/dist/src/vocab/listen.yaml +0 -12
- package/dist/src/vocab/mention.yaml +0 -9
- package/dist/src/vocab/move.yaml +0 -15
- package/dist/src/vocab/multikey.yaml +0 -36
- package/dist/src/vocab/note.yaml +0 -48
- package/dist/src/vocab/object.yaml +0 -404
- package/dist/src/vocab/offer.yaml +0 -15
- package/dist/src/vocab/orderedcollection.yaml +0 -39
- package/dist/src/vocab/orderedcollectionpage.yaml +0 -50
- package/dist/src/vocab/organization.yaml +0 -324
- package/dist/src/vocab/page.yaml +0 -11
- package/dist/src/vocab/person.yaml +0 -324
- package/dist/src/vocab/place.yaml +0 -75
- package/dist/src/vocab/profile.yaml +0 -26
- package/dist/src/vocab/propertyvalue.yaml +0 -32
- package/dist/src/vocab/question.yaml +0 -103
- package/dist/src/vocab/read.yaml +0 -13
- package/dist/src/vocab/reject.yaml +0 -14
- package/dist/src/vocab/relationship.yaml +0 -52
- package/dist/src/vocab/remove.yaml +0 -14
- package/dist/src/vocab/service.yaml +0 -324
- package/dist/src/vocab/source.yaml +0 -26
- package/dist/src/vocab/tentativeaccept.yaml +0 -14
- package/dist/src/vocab/tentativereject.yaml +0 -14
- package/dist/src/vocab/tombstone.yaml +0 -24
- package/dist/src/vocab/travel.yaml +0 -16
- package/dist/src/vocab/undo.yaml +0 -26
- package/dist/src/vocab/update.yaml +0 -58
- package/dist/src/vocab/video.yaml +0 -11
- package/dist/src/vocab/view.yaml +0 -13
- package/dist/testing/docloader.test.js +0 -24
- package/dist/type-C69ZBu7f.js +0 -47010
- package/dist/vocab/actor.test.d.ts +0 -3
- package/dist/vocab/actor.test.js +0 -5965
- package/dist/vocab/lookup.test.d.ts +0 -3
- package/dist/vocab/lookup.test.js +0 -456
- package/dist/vocab/mod.cjs +0 -87
- package/dist/vocab/mod.d.cts +0 -6
- package/dist/vocab/mod.d.ts +0 -8
- package/dist/vocab/mod.js +0 -10
- package/dist/vocab/schema.yaml +0 -247
- package/dist/vocab/type.test.d.ts +0 -3
- package/dist/vocab/type.test.js +0 -25
- package/dist/vocab/vocab.test.d.ts +0 -3
- package/dist/vocab/vocab.test.js +0 -3787
- package/dist/vocab-B39-pFl9.cjs +0 -291
- package/dist/vocab-BI0Ak5lL.d.ts +0 -14924
- package/dist/vocab-BWoeZsME.js +0 -255
- package/dist/vocab-Dw1-yVGg.d.cts +0 -14922
- package/dist/webfinger/handler.test.d.ts +0 -3
- package/dist/webfinger/lookup.test.d.ts +0 -3
- package/dist/webfinger/lookup.test.js +0 -195
- package/dist/webfinger/mod.cjs +0 -9
- package/dist/webfinger/mod.d.cts +0 -4
- package/dist/webfinger/mod.d.ts +0 -6
- package/dist/webfinger/mod.js +0 -9
- package/dist/webfinger-BjOEdFPs.cjs +0 -4
- package/dist/webfinger-De_bU0iE.js +0 -4
- package/dist/x/cfworkers.cjs +0 -100
- package/dist/x/cfworkers.d.cts +0 -59
- package/dist/x/cfworkers.d.ts +0 -61
- package/dist/x/cfworkers.js +0 -98
- package/dist/x/cfworkers.test.d.ts +0 -3
- package/dist/x/cfworkers.test.js +0 -179
- package/dist/x/hono.cjs +0 -61
- package/dist/x/hono.d.cts +0 -54
- package/dist/x/hono.d.ts +0 -56
- package/dist/x/hono.js +0 -60
- package/dist/x/sveltekit.cjs +0 -69
- package/dist/x/sveltekit.d.cts +0 -46
- package/dist/x/sveltekit.d.ts +0 -48
- package/dist/x/sveltekit.js +0 -68
- /package/dist/{assert_not_equals-f3m3epl3.js → assert_not_equals-C80BG-_5.js} +0 -0
- /package/dist/{runtime/authdocloader.test.d.ts → federation/webfinger.test.d.ts} +0 -0
- /package/dist/{mod-1pDWKvUL.d.ts → mod-1E3W847c.d.ts} +0 -0
- /package/dist/{mod-C2tOeRkN.d.cts → mod-C81L6_lQ.d.cts} +0 -0
- /package/dist/{nodeinfo-DfycQ8Wf.js → nodeinfo-BlLsRSiT.js} +0 -0
- /package/dist/{nodeinfo-Co9lJrWl.cjs → nodeinfo-DuMYTpbZ.cjs} +0 -0
- /package/dist/{runtime/docloader.test.d.ts → otel/exporter.test.d.ts} +0 -0
- /package/dist/{runtime-DPYEDf-o.js → sig-CwuONEzF.js} +0 -0
- /package/dist/{runtime-C58AJWSv.cjs → sig-DeXX2xnj.cjs} +0 -0
- /package/dist/{std__assert-X-_kMxKM.js → std__assert-DWivtrGR.js} +0 -0
- /package/dist/{testing → utils}/docloader.test.d.ts +0 -0
- /package/dist/{runtime/key.test.d.ts → utils/kv-cache.test.d.ts} +0 -0
- /package/dist/{sig-ByHXzqUi.cjs → utils-Db0ZmjcD.cjs} +0 -0
- /package/dist/{sig-Cj3tk-ig.js → utils-Wranxuoe.js} +0 -0
package/dist/mq-CRGm1e_F.d.ts
DELETED
|
@@ -1,143 +0,0 @@
|
|
|
1
|
-
import { Temporal } from "@js-temporal/polyfill";
|
|
2
|
-
import { URLPattern } from "urlpattern-polyfill";
|
|
3
|
-
|
|
4
|
-
//#region src/federation/mq.d.ts
|
|
5
|
-
/**
|
|
6
|
-
* Additional options for enqueuing a message in a queue.
|
|
7
|
-
*
|
|
8
|
-
* @since 0.5.0
|
|
9
|
-
*/
|
|
10
|
-
interface MessageQueueEnqueueOptions {
|
|
11
|
-
/**
|
|
12
|
-
* The delay before the message is enqueued. No delay by default.
|
|
13
|
-
*
|
|
14
|
-
* It must not be negative.
|
|
15
|
-
*/
|
|
16
|
-
delay?: Temporal.Duration;
|
|
17
|
-
}
|
|
18
|
-
/**
|
|
19
|
-
* Additional options for listening to a message queue.
|
|
20
|
-
*
|
|
21
|
-
* @since 1.0.0
|
|
22
|
-
*/
|
|
23
|
-
interface MessageQueueListenOptions {
|
|
24
|
-
/**
|
|
25
|
-
* The signal to abort listening to the message queue.
|
|
26
|
-
*/
|
|
27
|
-
signal?: AbortSignal;
|
|
28
|
-
}
|
|
29
|
-
/**
|
|
30
|
-
* An abstract interface for a message queue.
|
|
31
|
-
*
|
|
32
|
-
* @since 0.5.0
|
|
33
|
-
*/
|
|
34
|
-
interface MessageQueue {
|
|
35
|
-
/**
|
|
36
|
-
* Whether the message queue backend provides native retry mechanisms.
|
|
37
|
-
* When `true`, Fedify will skip its own retry logic and rely on the backend
|
|
38
|
-
* to handle retries. When `false` or omitted, Fedify will handle retries
|
|
39
|
-
* using its own retry policies.
|
|
40
|
-
*
|
|
41
|
-
* @default `false`
|
|
42
|
-
* @since 1.7.0
|
|
43
|
-
*/
|
|
44
|
-
readonly nativeRetrial?: boolean;
|
|
45
|
-
/**
|
|
46
|
-
* Enqueues a message in the queue.
|
|
47
|
-
* @param message The message to enqueue.
|
|
48
|
-
* @param options Additional options for enqueuing the message.
|
|
49
|
-
*/
|
|
50
|
-
enqueue(message: any, options?: MessageQueueEnqueueOptions): Promise<void>;
|
|
51
|
-
/**
|
|
52
|
-
* Enqueues multiple messages in the queue. This operation is optional,
|
|
53
|
-
* and may not be supported by all implementations. If not supported,
|
|
54
|
-
* Fedify will invoke {@link enqueue} for each message.
|
|
55
|
-
*
|
|
56
|
-
* @param messages The messages to enqueue.
|
|
57
|
-
* @param options Additional options for enqueuing the messages.
|
|
58
|
-
*/
|
|
59
|
-
enqueueMany?: (messages: any[], options?: MessageQueueEnqueueOptions) => Promise<void>;
|
|
60
|
-
/**
|
|
61
|
-
* Listens for messages in the queue.
|
|
62
|
-
* @param handler The handler for messages in the queue.
|
|
63
|
-
* @param options Additional options for listening to the message queue.
|
|
64
|
-
* @returns A promise that resolves when the listening is done. It never
|
|
65
|
-
* rejects, and is resolved when the signal is aborted. If no
|
|
66
|
-
* signal is provided, it never resolves.
|
|
67
|
-
*/
|
|
68
|
-
listen(handler: (message: any) => Promise<void> | void, options?: MessageQueueListenOptions): Promise<void>;
|
|
69
|
-
}
|
|
70
|
-
/**
|
|
71
|
-
* Additional options for {@link InProcessMessageQueue}.
|
|
72
|
-
* @since 1.0.0
|
|
73
|
-
*/
|
|
74
|
-
interface InProcessMessageQueueOptions {
|
|
75
|
-
/**
|
|
76
|
-
* The interval to poll for messages in the queue. 5 seconds by default.
|
|
77
|
-
* @default `{ seconds: 5 }`
|
|
78
|
-
*/
|
|
79
|
-
pollInterval?: Temporal.Duration | Temporal.DurationLike;
|
|
80
|
-
}
|
|
81
|
-
/**
|
|
82
|
-
* A message queue that processes messages in the same process.
|
|
83
|
-
* Do not use this in production as it does neither persist messages nor
|
|
84
|
-
* distribute them across multiple processes.
|
|
85
|
-
*
|
|
86
|
-
* @since 0.5.0
|
|
87
|
-
*/
|
|
88
|
-
declare class InProcessMessageQueue implements MessageQueue {
|
|
89
|
-
#private;
|
|
90
|
-
/**
|
|
91
|
-
* In-process message queue does not provide native retry mechanisms.
|
|
92
|
-
* @since 1.7.0
|
|
93
|
-
*/
|
|
94
|
-
readonly nativeRetrial = false;
|
|
95
|
-
/**
|
|
96
|
-
* Constructs a new {@link InProcessMessageQueue} with the given options.
|
|
97
|
-
* @param options Additional options for the in-process message queue.
|
|
98
|
-
*/
|
|
99
|
-
constructor(options?: InProcessMessageQueueOptions);
|
|
100
|
-
enqueue(message: any, options?: MessageQueueEnqueueOptions): Promise<void>;
|
|
101
|
-
enqueueMany(messages: any[], options?: MessageQueueEnqueueOptions): Promise<void>;
|
|
102
|
-
listen(handler: (message: any) => Promise<void> | void, options?: MessageQueueListenOptions): Promise<void>;
|
|
103
|
-
}
|
|
104
|
-
/**
|
|
105
|
-
* A message queue that processes messages in parallel. It takes another
|
|
106
|
-
* {@link MessageQueue}, and processes messages in parallel up to a certain
|
|
107
|
-
* number of workers.
|
|
108
|
-
*
|
|
109
|
-
* Actually, it's rather a decorator than a queue itself.
|
|
110
|
-
*
|
|
111
|
-
* Note that the workers do not run in truly parallel, in the sense that they
|
|
112
|
-
* are not running in separate threads or processes. They are running in the
|
|
113
|
-
* same process, but are scheduled to run in parallel. Hence, this is useful
|
|
114
|
-
* for I/O-bound tasks, but not for CPU-bound tasks, which is okay for Fedify's
|
|
115
|
-
* workloads.
|
|
116
|
-
*
|
|
117
|
-
* @since 1.0.0
|
|
118
|
-
*/
|
|
119
|
-
declare class ParallelMessageQueue implements MessageQueue {
|
|
120
|
-
#private;
|
|
121
|
-
readonly queue: MessageQueue;
|
|
122
|
-
readonly workers: number;
|
|
123
|
-
/**
|
|
124
|
-
* Inherits the native retry capability from the wrapped queue.
|
|
125
|
-
* @since 1.7.0
|
|
126
|
-
*/
|
|
127
|
-
readonly nativeRetrial?: boolean;
|
|
128
|
-
/**
|
|
129
|
-
* Constructs a new {@link ParallelMessageQueue} with the given queue and
|
|
130
|
-
* number of workers.
|
|
131
|
-
* @param queue The message queue to use under the hood. Note that
|
|
132
|
-
* {@link ParallelMessageQueue} cannot be nested.
|
|
133
|
-
* @param workers The number of workers to process messages in parallel.
|
|
134
|
-
* @throws {TypeError} If the given queue is an instance of
|
|
135
|
-
* {@link ParallelMessageQueue}.
|
|
136
|
-
*/
|
|
137
|
-
constructor(queue: MessageQueue, workers: number);
|
|
138
|
-
enqueue(message: any, options?: MessageQueueEnqueueOptions): Promise<void>;
|
|
139
|
-
enqueueMany(messages: any[], options?: MessageQueueEnqueueOptions): Promise<void>;
|
|
140
|
-
listen(handler: (message: any) => Promise<void> | void, options?: MessageQueueListenOptions): Promise<void>;
|
|
141
|
-
}
|
|
142
|
-
//#endregion
|
|
143
|
-
export { InProcessMessageQueue, InProcessMessageQueueOptions, MessageQueue, MessageQueueEnqueueOptions, MessageQueueListenOptions, ParallelMessageQueue };
|
|
@@ -1,522 +0,0 @@
|
|
|
1
|
-
|
|
2
|
-
import { Temporal } from "@js-temporal/polyfill";
|
|
3
|
-
import { URLPattern } from "urlpattern-polyfill";
|
|
4
|
-
globalThis.addEventListener = () => {};
|
|
5
|
-
|
|
6
|
-
import { FetchError, UrlError, contexts_default, deno_default, getDocumentLoader, getUserAgent, kvCache } from "../type-C69ZBu7f.js";
|
|
7
|
-
import { assertEquals } from "../assert_equals-DSbWqCm3.js";
|
|
8
|
-
import "../assert-MZs1qjMx.js";
|
|
9
|
-
import "../assert_instance_of-DHz7EHNU.js";
|
|
10
|
-
import { MemoryKvStore } from "../kv-CRZrzyXm.js";
|
|
11
|
-
import "../lookup-pV0JOsuV.js";
|
|
12
|
-
import { mockDocumentLoader, test } from "../testing-BWNCAbL-.js";
|
|
13
|
-
import "../std__assert-X-_kMxKM.js";
|
|
14
|
-
import { assertRejects } from "../assert_rejects-DiIiJbZn.js";
|
|
15
|
-
import "../assert_is_error-BPGph1Jx.js";
|
|
16
|
-
import "../assert_not_equals-f3m3epl3.js";
|
|
17
|
-
import { assertThrows } from "../assert_throws-BOO88avQ.js";
|
|
18
|
-
import { esm_default } from "../esm-DnIzfEj0.js";
|
|
19
|
-
import process from "node:process";
|
|
20
|
-
|
|
21
|
-
//#region src/runtime/docloader.test.ts
|
|
22
|
-
test("new FetchError()", () => {
|
|
23
|
-
const e = new FetchError("https://example.com/", "An error message.");
|
|
24
|
-
assertEquals(e.name, "FetchError");
|
|
25
|
-
assertEquals(e.url, new URL("https://example.com/"));
|
|
26
|
-
assertEquals(e.message, "https://example.com/: An error message.");
|
|
27
|
-
const e2 = new FetchError(new URL("https://example.org/"));
|
|
28
|
-
assertEquals(e2.url, new URL("https://example.org/"));
|
|
29
|
-
assertEquals(e2.message, "https://example.org/");
|
|
30
|
-
});
|
|
31
|
-
test("getDocumentLoader()", async (t) => {
|
|
32
|
-
const fetchDocumentLoader = getDocumentLoader();
|
|
33
|
-
esm_default.spyGlobal();
|
|
34
|
-
esm_default.get("https://example.com/object", { body: {
|
|
35
|
-
"@context": "https://www.w3.org/ns/activitystreams",
|
|
36
|
-
id: "https://example.com/object",
|
|
37
|
-
name: "Fetched object",
|
|
38
|
-
type: "Object"
|
|
39
|
-
} });
|
|
40
|
-
await t.step("ok", async () => {
|
|
41
|
-
assertEquals(await fetchDocumentLoader("https://example.com/object"), {
|
|
42
|
-
contextUrl: null,
|
|
43
|
-
documentUrl: "https://example.com/object",
|
|
44
|
-
document: {
|
|
45
|
-
"@context": "https://www.w3.org/ns/activitystreams",
|
|
46
|
-
id: "https://example.com/object",
|
|
47
|
-
name: "Fetched object",
|
|
48
|
-
type: "Object"
|
|
49
|
-
}
|
|
50
|
-
});
|
|
51
|
-
});
|
|
52
|
-
esm_default.get("https://example.com/link-ctx", {
|
|
53
|
-
body: {
|
|
54
|
-
id: "https://example.com/link-ctx",
|
|
55
|
-
name: "Fetched object",
|
|
56
|
-
type: "Object"
|
|
57
|
-
},
|
|
58
|
-
headers: {
|
|
59
|
-
"Content-Type": "application/activity+json",
|
|
60
|
-
Link: "<https://www.w3.org/ns/activitystreams>; rel=\"http://www.w3.org/ns/json-ld#context\"; type=\"application/ld+json\""
|
|
61
|
-
}
|
|
62
|
-
});
|
|
63
|
-
esm_default.get("https://example.com/link-obj", { headers: {
|
|
64
|
-
"Content-Type": "text/html; charset=utf-8",
|
|
65
|
-
Link: "<https://example.com/object>; rel=\"alternate\"; type=\"application/activity+json\""
|
|
66
|
-
} });
|
|
67
|
-
esm_default.get("https://example.com/link-obj-relative", { headers: {
|
|
68
|
-
"Content-Type": "text/html; charset=utf-8",
|
|
69
|
-
Link: "</object>; rel=\"alternate\"; type=\"application/activity+json\""
|
|
70
|
-
} });
|
|
71
|
-
esm_default.get("https://example.com/obj-w-wrong-link", {
|
|
72
|
-
body: {
|
|
73
|
-
"@context": "https://www.w3.org/ns/activitystreams",
|
|
74
|
-
id: "https://example.com/obj-w-wrong-link",
|
|
75
|
-
name: "Fetched object",
|
|
76
|
-
type: "Object"
|
|
77
|
-
},
|
|
78
|
-
headers: {
|
|
79
|
-
"Content-Type": "text/html; charset=utf-8",
|
|
80
|
-
Link: "<https://example.com/object>; rel=\"alternate\"; type=\"application/ld+json; profile=\"https://www.w3.org/ns/activitystreams\"\""
|
|
81
|
-
}
|
|
82
|
-
});
|
|
83
|
-
await t.step("Link header", async () => {
|
|
84
|
-
assertEquals(await fetchDocumentLoader("https://example.com/link-ctx"), {
|
|
85
|
-
contextUrl: "https://www.w3.org/ns/activitystreams",
|
|
86
|
-
documentUrl: "https://example.com/link-ctx",
|
|
87
|
-
document: {
|
|
88
|
-
id: "https://example.com/link-ctx",
|
|
89
|
-
name: "Fetched object",
|
|
90
|
-
type: "Object"
|
|
91
|
-
}
|
|
92
|
-
});
|
|
93
|
-
assertEquals(await fetchDocumentLoader("https://example.com/link-obj"), {
|
|
94
|
-
contextUrl: null,
|
|
95
|
-
documentUrl: "https://example.com/object",
|
|
96
|
-
document: {
|
|
97
|
-
"@context": "https://www.w3.org/ns/activitystreams",
|
|
98
|
-
id: "https://example.com/object",
|
|
99
|
-
name: "Fetched object",
|
|
100
|
-
type: "Object"
|
|
101
|
-
}
|
|
102
|
-
});
|
|
103
|
-
});
|
|
104
|
-
await t.step("Link header relative url", async () => {
|
|
105
|
-
assertEquals(await fetchDocumentLoader("https://example.com/link-ctx"), {
|
|
106
|
-
contextUrl: "https://www.w3.org/ns/activitystreams",
|
|
107
|
-
documentUrl: "https://example.com/link-ctx",
|
|
108
|
-
document: {
|
|
109
|
-
id: "https://example.com/link-ctx",
|
|
110
|
-
name: "Fetched object",
|
|
111
|
-
type: "Object"
|
|
112
|
-
}
|
|
113
|
-
});
|
|
114
|
-
assertEquals(await fetchDocumentLoader("https://example.com/link-obj-relative"), {
|
|
115
|
-
contextUrl: null,
|
|
116
|
-
documentUrl: "https://example.com/object",
|
|
117
|
-
document: {
|
|
118
|
-
"@context": "https://www.w3.org/ns/activitystreams",
|
|
119
|
-
id: "https://example.com/object",
|
|
120
|
-
name: "Fetched object",
|
|
121
|
-
type: "Object"
|
|
122
|
-
}
|
|
123
|
-
});
|
|
124
|
-
});
|
|
125
|
-
await t.step("wrong Link header syntax", async () => {
|
|
126
|
-
assertEquals(await fetchDocumentLoader("https://example.com/obj-w-wrong-link"), {
|
|
127
|
-
contextUrl: null,
|
|
128
|
-
documentUrl: "https://example.com/obj-w-wrong-link",
|
|
129
|
-
document: {
|
|
130
|
-
"@context": "https://www.w3.org/ns/activitystreams",
|
|
131
|
-
id: "https://example.com/obj-w-wrong-link",
|
|
132
|
-
name: "Fetched object",
|
|
133
|
-
type: "Object"
|
|
134
|
-
}
|
|
135
|
-
});
|
|
136
|
-
});
|
|
137
|
-
esm_default.get("https://example.com/html-link", {
|
|
138
|
-
body: `<html>
|
|
139
|
-
<head>
|
|
140
|
-
<meta charset=utf-8>
|
|
141
|
-
<link
|
|
142
|
-
rel=alternate
|
|
143
|
-
type='application/activity+json'
|
|
144
|
-
href="https://example.com/object">
|
|
145
|
-
</head>
|
|
146
|
-
</html>`,
|
|
147
|
-
headers: { "Content-Type": "text/html; charset=utf-8" }
|
|
148
|
-
});
|
|
149
|
-
await t.step("HTML <link>", async () => {
|
|
150
|
-
assertEquals(await fetchDocumentLoader("https://example.com/html-link"), {
|
|
151
|
-
contextUrl: null,
|
|
152
|
-
documentUrl: "https://example.com/object",
|
|
153
|
-
document: {
|
|
154
|
-
"@context": "https://www.w3.org/ns/activitystreams",
|
|
155
|
-
id: "https://example.com/object",
|
|
156
|
-
name: "Fetched object",
|
|
157
|
-
type: "Object"
|
|
158
|
-
}
|
|
159
|
-
});
|
|
160
|
-
});
|
|
161
|
-
esm_default.get("https://example.com/xhtml-link", {
|
|
162
|
-
body: `<html>
|
|
163
|
-
<head>
|
|
164
|
-
<meta charset="utf-8" />
|
|
165
|
-
<link
|
|
166
|
-
rel=alternate
|
|
167
|
-
type="application/activity+json"
|
|
168
|
-
href="https://example.com/object" />
|
|
169
|
-
</head>
|
|
170
|
-
</html>`,
|
|
171
|
-
headers: { "Content-Type": "application/xhtml+xml; charset=utf-8" }
|
|
172
|
-
});
|
|
173
|
-
await t.step("XHTML <link>", async () => {
|
|
174
|
-
assertEquals(await fetchDocumentLoader("https://example.com/xhtml-link"), {
|
|
175
|
-
contextUrl: null,
|
|
176
|
-
documentUrl: "https://example.com/object",
|
|
177
|
-
document: {
|
|
178
|
-
"@context": "https://www.w3.org/ns/activitystreams",
|
|
179
|
-
id: "https://example.com/object",
|
|
180
|
-
name: "Fetched object",
|
|
181
|
-
type: "Object"
|
|
182
|
-
}
|
|
183
|
-
});
|
|
184
|
-
});
|
|
185
|
-
esm_default.get("https://example.com/html-a", {
|
|
186
|
-
body: `<html>
|
|
187
|
-
<head>
|
|
188
|
-
<meta charset=utf-8>
|
|
189
|
-
</head>
|
|
190
|
-
<body>
|
|
191
|
-
<a
|
|
192
|
-
rel=alternate
|
|
193
|
-
type=application/activity+json
|
|
194
|
-
href=https://example.com/object>test</a>
|
|
195
|
-
</body>
|
|
196
|
-
</html>`,
|
|
197
|
-
headers: { "Content-Type": "text/html; charset=utf-8" }
|
|
198
|
-
});
|
|
199
|
-
await t.step("HTML <a>", async () => {
|
|
200
|
-
assertEquals(await fetchDocumentLoader("https://example.com/html-a"), {
|
|
201
|
-
contextUrl: null,
|
|
202
|
-
documentUrl: "https://example.com/object",
|
|
203
|
-
document: {
|
|
204
|
-
"@context": "https://www.w3.org/ns/activitystreams",
|
|
205
|
-
id: "https://example.com/object",
|
|
206
|
-
name: "Fetched object",
|
|
207
|
-
type: "Object"
|
|
208
|
-
}
|
|
209
|
-
});
|
|
210
|
-
});
|
|
211
|
-
esm_default.get("https://example.com/wrong-content-type", {
|
|
212
|
-
body: {
|
|
213
|
-
"@context": "https://www.w3.org/ns/activitystreams",
|
|
214
|
-
id: "https://example.com/wrong-content-type",
|
|
215
|
-
name: "Fetched object",
|
|
216
|
-
type: "Object"
|
|
217
|
-
},
|
|
218
|
-
headers: { "Content-Type": "text/html; charset=utf-8" }
|
|
219
|
-
});
|
|
220
|
-
await t.step("Wrong Content-Type", async () => {
|
|
221
|
-
assertEquals(await fetchDocumentLoader("https://example.com/wrong-content-type"), {
|
|
222
|
-
contextUrl: null,
|
|
223
|
-
documentUrl: "https://example.com/wrong-content-type",
|
|
224
|
-
document: {
|
|
225
|
-
"@context": "https://www.w3.org/ns/activitystreams",
|
|
226
|
-
id: "https://example.com/wrong-content-type",
|
|
227
|
-
name: "Fetched object",
|
|
228
|
-
type: "Object"
|
|
229
|
-
}
|
|
230
|
-
});
|
|
231
|
-
});
|
|
232
|
-
esm_default.get("https://example.com/404", { status: 404 });
|
|
233
|
-
await t.step("not ok", async () => {
|
|
234
|
-
await assertRejects(() => fetchDocumentLoader("https://example.com/404"), FetchError, "HTTP 404: https://example.com/404");
|
|
235
|
-
});
|
|
236
|
-
await t.step("preloaded contexts", async () => {
|
|
237
|
-
for (const [url, document] of Object.entries(contexts_default)) assertEquals(await fetchDocumentLoader(url), {
|
|
238
|
-
contextUrl: null,
|
|
239
|
-
documentUrl: url,
|
|
240
|
-
document
|
|
241
|
-
});
|
|
242
|
-
});
|
|
243
|
-
await t.step("deny non-HTTP/HTTPS", async () => {
|
|
244
|
-
await assertRejects(() => fetchDocumentLoader("ftp://localhost"), UrlError);
|
|
245
|
-
});
|
|
246
|
-
esm_default.get("https://example.com/localhost-redirect", {
|
|
247
|
-
status: 302,
|
|
248
|
-
headers: { Location: "https://localhost/object" }
|
|
249
|
-
});
|
|
250
|
-
esm_default.get("https://example.com/localhost-link", {
|
|
251
|
-
body: `<html>
|
|
252
|
-
<head>
|
|
253
|
-
<meta charset=utf-8>
|
|
254
|
-
<link
|
|
255
|
-
rel=alternate
|
|
256
|
-
type='application/activity+json'
|
|
257
|
-
href="https://localhost/object">
|
|
258
|
-
</head>
|
|
259
|
-
</html>`,
|
|
260
|
-
headers: { "Content-Type": "text/html; charset=utf-8" }
|
|
261
|
-
});
|
|
262
|
-
esm_default.get("https://localhost/object", { body: {
|
|
263
|
-
"@context": "https://www.w3.org/ns/activitystreams",
|
|
264
|
-
id: "https://localhost/object",
|
|
265
|
-
name: "Fetched object",
|
|
266
|
-
type: "Object"
|
|
267
|
-
} });
|
|
268
|
-
await t.step("allowPrivateAddress: false", async () => {
|
|
269
|
-
await assertRejects(() => fetchDocumentLoader("https://localhost/object"), UrlError);
|
|
270
|
-
await assertRejects(() => fetchDocumentLoader("https://example.com/localhost-redirect"), UrlError);
|
|
271
|
-
await assertRejects(() => fetchDocumentLoader("https://example.com/localhost-link"), UrlError);
|
|
272
|
-
});
|
|
273
|
-
const fetchDocumentLoader2 = getDocumentLoader({ allowPrivateAddress: true });
|
|
274
|
-
await t.step("allowPrivateAddress: true", async () => {
|
|
275
|
-
const expected = {
|
|
276
|
-
contextUrl: null,
|
|
277
|
-
documentUrl: "https://localhost/object",
|
|
278
|
-
document: {
|
|
279
|
-
"@context": "https://www.w3.org/ns/activitystreams",
|
|
280
|
-
id: "https://localhost/object",
|
|
281
|
-
name: "Fetched object",
|
|
282
|
-
type: "Object"
|
|
283
|
-
}
|
|
284
|
-
};
|
|
285
|
-
assertEquals(await fetchDocumentLoader2("https://localhost/object"), expected);
|
|
286
|
-
assertEquals(await fetchDocumentLoader2("https://example.com/localhost-redirect"), expected);
|
|
287
|
-
assertEquals(await fetchDocumentLoader2("https://example.com/localhost-link"), expected);
|
|
288
|
-
});
|
|
289
|
-
esm_default.hardReset();
|
|
290
|
-
});
|
|
291
|
-
test("kvCache()", async (t) => {
|
|
292
|
-
const kv = new MemoryKvStore();
|
|
293
|
-
await t.step("cached", async () => {
|
|
294
|
-
const loader = kvCache({
|
|
295
|
-
kv,
|
|
296
|
-
loader: mockDocumentLoader,
|
|
297
|
-
rules: [
|
|
298
|
-
["https://example.org/", Temporal.Duration.from({ days: 1 })],
|
|
299
|
-
[new URL("https://example.net/"), Temporal.Duration.from({ days: 1 })],
|
|
300
|
-
[new URLPattern("https://example.com/*"), Temporal.Duration.from({ days: 30 })]
|
|
301
|
-
],
|
|
302
|
-
prefix: ["_test", "cached"]
|
|
303
|
-
});
|
|
304
|
-
const result = await loader("https://example.com/object");
|
|
305
|
-
assertEquals(result, {
|
|
306
|
-
contextUrl: null,
|
|
307
|
-
documentUrl: "https://example.com/object",
|
|
308
|
-
document: {
|
|
309
|
-
"@context": "https://www.w3.org/ns/activitystreams",
|
|
310
|
-
id: "https://example.com/object",
|
|
311
|
-
name: "Fetched object",
|
|
312
|
-
type: "Object"
|
|
313
|
-
}
|
|
314
|
-
});
|
|
315
|
-
const cache = await kv.get([
|
|
316
|
-
"_test",
|
|
317
|
-
"cached",
|
|
318
|
-
"https://example.com/object"
|
|
319
|
-
]);
|
|
320
|
-
assertEquals(cache, result);
|
|
321
|
-
await kv.set([
|
|
322
|
-
"_test",
|
|
323
|
-
"cached",
|
|
324
|
-
"https://example.org/"
|
|
325
|
-
], {
|
|
326
|
-
contextUrl: null,
|
|
327
|
-
documentUrl: "https://example.org/",
|
|
328
|
-
document: { "id": "https://example.org/" }
|
|
329
|
-
});
|
|
330
|
-
const result2 = await loader("https://example.org/");
|
|
331
|
-
assertEquals(result2, {
|
|
332
|
-
contextUrl: null,
|
|
333
|
-
documentUrl: "https://example.org/",
|
|
334
|
-
document: { "id": "https://example.org/" }
|
|
335
|
-
});
|
|
336
|
-
await kv.set([
|
|
337
|
-
"_test",
|
|
338
|
-
"cached",
|
|
339
|
-
"https://example.net/"
|
|
340
|
-
], {
|
|
341
|
-
contextUrl: null,
|
|
342
|
-
documentUrl: "https://example.net/",
|
|
343
|
-
document: { "id": "https://example.net/" }
|
|
344
|
-
});
|
|
345
|
-
const result3 = await loader("https://example.net/");
|
|
346
|
-
assertEquals(result3, {
|
|
347
|
-
contextUrl: null,
|
|
348
|
-
documentUrl: "https://example.net/",
|
|
349
|
-
document: { "id": "https://example.net/" }
|
|
350
|
-
});
|
|
351
|
-
});
|
|
352
|
-
await t.step("not cached", async () => {
|
|
353
|
-
const loader = kvCache({
|
|
354
|
-
kv,
|
|
355
|
-
loader: mockDocumentLoader,
|
|
356
|
-
rules: [],
|
|
357
|
-
prefix: ["_test", "not cached"]
|
|
358
|
-
});
|
|
359
|
-
const result = await loader("https://example.com/object");
|
|
360
|
-
assertEquals(result, {
|
|
361
|
-
contextUrl: null,
|
|
362
|
-
documentUrl: "https://example.com/object",
|
|
363
|
-
document: {
|
|
364
|
-
"@context": "https://www.w3.org/ns/activitystreams",
|
|
365
|
-
id: "https://example.com/object",
|
|
366
|
-
name: "Fetched object",
|
|
367
|
-
type: "Object"
|
|
368
|
-
}
|
|
369
|
-
});
|
|
370
|
-
const cache = await kv.get([
|
|
371
|
-
"test2",
|
|
372
|
-
"not cached",
|
|
373
|
-
"https://example.com/object"
|
|
374
|
-
]);
|
|
375
|
-
assertEquals(cache, void 0);
|
|
376
|
-
});
|
|
377
|
-
await t.step("maximum cache duration", () => {
|
|
378
|
-
assertThrows(() => kvCache({
|
|
379
|
-
kv,
|
|
380
|
-
loader: mockDocumentLoader,
|
|
381
|
-
rules: [["https://example.com/", Temporal.Duration.from({
|
|
382
|
-
days: 30,
|
|
383
|
-
seconds: 1
|
|
384
|
-
})]]
|
|
385
|
-
}), TypeError, "The maximum cache duration is 30 days");
|
|
386
|
-
assertThrows(() => kvCache({
|
|
387
|
-
kv,
|
|
388
|
-
loader: mockDocumentLoader,
|
|
389
|
-
rules: [[new URLPattern("https://example.com/*"), Temporal.Duration.from({
|
|
390
|
-
days: 30,
|
|
391
|
-
seconds: 1
|
|
392
|
-
})]]
|
|
393
|
-
}), TypeError, "The maximum cache duration is 30 days");
|
|
394
|
-
});
|
|
395
|
-
await t.step("on kv store exception", async () => {
|
|
396
|
-
class KvStoreThrowsException {
|
|
397
|
-
get(_key) {
|
|
398
|
-
throw new Error("Failed to get key");
|
|
399
|
-
}
|
|
400
|
-
set(_key, _value, _options) {
|
|
401
|
-
throw new Error("Failed to set key");
|
|
402
|
-
}
|
|
403
|
-
delete(_key) {
|
|
404
|
-
throw new Error("Failed to delete key");
|
|
405
|
-
}
|
|
406
|
-
}
|
|
407
|
-
const loader = kvCache({
|
|
408
|
-
kv: new KvStoreThrowsException(),
|
|
409
|
-
loader: mockDocumentLoader,
|
|
410
|
-
rules: [
|
|
411
|
-
["https://example.org/", Temporal.Duration.from({ days: 1 })],
|
|
412
|
-
[new URL("https://example.net/"), Temporal.Duration.from({ days: 1 })],
|
|
413
|
-
[new URLPattern("https://example.com/*"), Temporal.Duration.from({ days: 30 })]
|
|
414
|
-
],
|
|
415
|
-
prefix: ["_test", "not cached"]
|
|
416
|
-
});
|
|
417
|
-
const result = await loader("https://example.com/object");
|
|
418
|
-
assertEquals(result, {
|
|
419
|
-
contextUrl: null,
|
|
420
|
-
documentUrl: "https://example.com/object",
|
|
421
|
-
document: {
|
|
422
|
-
"@context": "https://www.w3.org/ns/activitystreams",
|
|
423
|
-
id: "https://example.com/object",
|
|
424
|
-
name: "Fetched object",
|
|
425
|
-
type: "Object"
|
|
426
|
-
}
|
|
427
|
-
});
|
|
428
|
-
});
|
|
429
|
-
await t.step("preloaded contexts bypass cache", async () => {
|
|
430
|
-
const kv$1 = new MemoryKvStore();
|
|
431
|
-
let loaderCalled = false;
|
|
432
|
-
const mockLoader = (url) => {
|
|
433
|
-
loaderCalled = true;
|
|
434
|
-
return Promise.resolve({
|
|
435
|
-
contextUrl: null,
|
|
436
|
-
documentUrl: url,
|
|
437
|
-
document: { "mock": "document" }
|
|
438
|
-
});
|
|
439
|
-
};
|
|
440
|
-
const loader = kvCache({
|
|
441
|
-
kv: kv$1,
|
|
442
|
-
loader: mockLoader,
|
|
443
|
-
prefix: ["_test", "preloaded"]
|
|
444
|
-
});
|
|
445
|
-
const activityStreamsUrl = "https://www.w3.org/ns/activitystreams";
|
|
446
|
-
loaderCalled = false;
|
|
447
|
-
const result = await loader(activityStreamsUrl);
|
|
448
|
-
assertEquals(result, {
|
|
449
|
-
contextUrl: null,
|
|
450
|
-
documentUrl: activityStreamsUrl,
|
|
451
|
-
document: contexts_default[activityStreamsUrl]
|
|
452
|
-
});
|
|
453
|
-
assertEquals(loaderCalled, false, "Loader should not be called for preloaded contexts");
|
|
454
|
-
const cachedValue = await kv$1.get([
|
|
455
|
-
"_test",
|
|
456
|
-
"preloaded",
|
|
457
|
-
activityStreamsUrl
|
|
458
|
-
]);
|
|
459
|
-
assertEquals(cachedValue, void 0, "Preloaded contexts should not be cached in KV store");
|
|
460
|
-
const securityUrl = "https://w3id.org/security/v1";
|
|
461
|
-
loaderCalled = false;
|
|
462
|
-
const result2 = await loader(securityUrl);
|
|
463
|
-
assertEquals(result2, {
|
|
464
|
-
contextUrl: null,
|
|
465
|
-
documentUrl: securityUrl,
|
|
466
|
-
document: contexts_default[securityUrl]
|
|
467
|
-
});
|
|
468
|
-
assertEquals(loaderCalled, false, "Loader should not be called for preloaded contexts");
|
|
469
|
-
const nonPreloadedUrl = "https://example.com/not-preloaded";
|
|
470
|
-
loaderCalled = false;
|
|
471
|
-
const result3 = await loader(nonPreloadedUrl);
|
|
472
|
-
assertEquals(result3, {
|
|
473
|
-
contextUrl: null,
|
|
474
|
-
documentUrl: nonPreloadedUrl,
|
|
475
|
-
document: { "mock": "document" }
|
|
476
|
-
});
|
|
477
|
-
assertEquals(loaderCalled, true, "Loader should be called for non-preloaded URLs");
|
|
478
|
-
const cachedValue2 = await kv$1.get([
|
|
479
|
-
"_test",
|
|
480
|
-
"preloaded",
|
|
481
|
-
nonPreloadedUrl
|
|
482
|
-
]);
|
|
483
|
-
assertEquals(cachedValue2, result3, "Non-preloaded URLs should be cached");
|
|
484
|
-
});
|
|
485
|
-
});
|
|
486
|
-
test("getUserAgent()", () => {
|
|
487
|
-
if ("Deno" in globalThis) {
|
|
488
|
-
assertEquals(getUserAgent(), `Fedify/${deno_default.version} (Deno/${Deno.version.deno})`);
|
|
489
|
-
assertEquals(getUserAgent({ software: "MyApp/1.0.0" }), `MyApp/1.0.0 (Fedify/${deno_default.version}; Deno/${Deno.version.deno})`);
|
|
490
|
-
assertEquals(getUserAgent({ url: "https://example.com/" }), `Fedify/${deno_default.version} (Deno/${Deno.version.deno}; +https://example.com/)`);
|
|
491
|
-
assertEquals(getUserAgent({
|
|
492
|
-
software: "MyApp/1.0.0",
|
|
493
|
-
url: new URL("https://example.com/")
|
|
494
|
-
}), `MyApp/1.0.0 (Fedify/${deno_default.version}; Deno/${Deno.version.deno}; +https://example.com/)`);
|
|
495
|
-
} else if ("Bun" in globalThis) {
|
|
496
|
-
assertEquals(getUserAgent(), `Fedify/${deno_default.version} (Bun/${Bun.version})`);
|
|
497
|
-
assertEquals(getUserAgent({ software: "MyApp/1.0.0" }), `MyApp/1.0.0 (Fedify/${deno_default.version}; Bun/${Bun.version})`);
|
|
498
|
-
assertEquals(getUserAgent({ url: "https://example.com/" }), `Fedify/${deno_default.version} (Bun/${Bun.version}; +https://example.com/)`);
|
|
499
|
-
assertEquals(getUserAgent({
|
|
500
|
-
software: "MyApp/1.0.0",
|
|
501
|
-
url: new URL("https://example.com/")
|
|
502
|
-
}), `MyApp/1.0.0 (Fedify/${deno_default.version}; Bun/${Bun.version}; +https://example.com/)`);
|
|
503
|
-
} else if (navigator.userAgent === "Cloudflare-Workers") {
|
|
504
|
-
assertEquals(getUserAgent(), `Fedify/${deno_default.version} (Cloudflare-Workers)`);
|
|
505
|
-
assertEquals(getUserAgent({ software: "MyApp/1.0.0" }), `MyApp/1.0.0 (Fedify/${deno_default.version}; Cloudflare-Workers)`);
|
|
506
|
-
assertEquals(getUserAgent({ url: "https://example.com/" }), `Fedify/${deno_default.version} (Cloudflare-Workers; +https://example.com/)`);
|
|
507
|
-
assertEquals(getUserAgent({
|
|
508
|
-
software: "MyApp/1.0.0",
|
|
509
|
-
url: new URL("https://example.com/")
|
|
510
|
-
}), `MyApp/1.0.0 (Fedify/${deno_default.version}; Cloudflare-Workers; +https://example.com/)`);
|
|
511
|
-
} else {
|
|
512
|
-
assertEquals(getUserAgent(), `Fedify/${deno_default.version} (Node.js/${process.versions.node})`);
|
|
513
|
-
assertEquals(getUserAgent({ software: "MyApp/1.0.0" }), `MyApp/1.0.0 (Fedify/${deno_default.version}; Node.js/${process.versions.node})`);
|
|
514
|
-
assertEquals(getUserAgent({ url: "https://example.com/" }), `Fedify/${deno_default.version} (Node.js/${process.versions.node}; +https://example.com/)`);
|
|
515
|
-
assertEquals(getUserAgent({
|
|
516
|
-
software: "MyApp/1.0.0",
|
|
517
|
-
url: new URL("https://example.com/")
|
|
518
|
-
}), `MyApp/1.0.0 (Fedify/${deno_default.version}; Node.js/${process.versions.node}; +https://example.com/)`);
|
|
519
|
-
}
|
|
520
|
-
});
|
|
521
|
-
|
|
522
|
-
//#endregion
|