@fedify/fedify 0.7.0-dev.135 → 0.8.0-dev.139
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.
Potentially problematic release.
This version of @fedify/fedify might be problematic. Click here for more details.
- package/CHANGES.md +38 -2
- package/README.md +3 -3
- package/esm/deps/jsr.io/@std/encoding/0.220.1/hex.js +99 -0
- package/esm/federation/collection.js +43 -1
- package/esm/federation/handler.js +36 -6
- package/esm/federation/middleware.js +77 -9
- package/esm/federation/send.js +10 -8
- package/esm/httpsig/mod.js +1 -1
- package/esm/mod.js +3 -2
- package/package.json +1 -1
- package/types/deps/jsr.io/@std/encoding/0.220.1/hex.d.ts +24 -0
- package/types/deps/jsr.io/@std/encoding/0.220.1/hex.d.ts.map +1 -0
- package/types/federation/callback.d.ts +3 -3
- package/types/federation/callback.d.ts.map +1 -1
- package/types/federation/collection.d.ts +19 -0
- package/types/federation/collection.d.ts.map +1 -1
- package/types/federation/collection.test.d.ts.map +1 -0
- package/types/federation/context.d.ts +27 -3
- package/types/federation/context.d.ts.map +1 -1
- package/types/federation/handler.d.ts +13 -9
- package/types/federation/handler.d.ts.map +1 -1
- package/types/federation/middleware.d.ts +17 -10
- package/types/federation/middleware.d.ts.map +1 -1
- package/types/federation/queue.d.ts +1 -0
- package/types/federation/queue.d.ts.map +1 -1
- package/types/federation/send.d.ts +10 -5
- package/types/federation/send.d.ts.map +1 -1
- package/types/httpsig/mod.d.ts +1 -1
- package/types/mod.d.ts +3 -2
- package/types/mod.d.ts.map +1 -1
- package/types/testing/context.d.ts.map +1 -1
- package/types/vocab/actor.d.ts +24 -0
- package/types/vocab/actor.d.ts.map +1 -1
package/CHANGES.md
CHANGED
@@ -3,11 +3,47 @@
|
|
3
3
|
Fedify changelog
|
4
4
|
================
|
5
5
|
|
6
|
-
Version 0.
|
6
|
+
Version 0.8.0
|
7
7
|
-------------
|
8
8
|
|
9
9
|
To be released.
|
10
10
|
|
11
|
+
- Implemented [followers collection synchronization mechanism][FEP-8fcf].
|
12
|
+
|
13
|
+
- Added `RequestContext.sendActivity()` overload that takes `"followers"`
|
14
|
+
as the second parameter.
|
15
|
+
- Added the second type parameter to `CollectionCallbackSetters`
|
16
|
+
interface.
|
17
|
+
- Added the second type parameter to `CollectionDispatcher` type.
|
18
|
+
- Added the fourth parameter to `CollectionDispatcher` type.
|
19
|
+
- Added the second type parameter to `CollectionCounter` type.
|
20
|
+
- Added the third parameter to `CollectionCounter` type.
|
21
|
+
- Added the second type parameter to `CollectionCursor` type.
|
22
|
+
- Added the third parameter to `CollectionCursor` type.
|
23
|
+
|
24
|
+
- Relaxed the required type for activity recipients.
|
25
|
+
|
26
|
+
- Added `Recipient` interface.
|
27
|
+
- The type of the second parameter of `Context.sendActivity()` method
|
28
|
+
became `Recipient | Recipient[]` (was `Actor | Actor[]`). However,
|
29
|
+
since `Recipient` is a supertype of `Actor`, the existing code should
|
30
|
+
work without any change.
|
31
|
+
|
32
|
+
- Followers collection now has to consist of `Recipient` objects only.
|
33
|
+
(It could consist of `URL`s as well as `Actor`s before.)
|
34
|
+
|
35
|
+
- The type of `Federation.setFollowersDispatcher()` method's second
|
36
|
+
parameter became `CollectionDispatcher<Recipient, TContextData, URL>`
|
37
|
+
(was `CollectionDispatcher<Actor | URL, TContextData>`).
|
38
|
+
|
39
|
+
[FEP-8fcf]: https://codeberg.org/fediverse/fep/src/branch/main/fep/8fcf/fep-8fcf.md
|
40
|
+
|
41
|
+
|
42
|
+
Version 0.7.0
|
43
|
+
-------------
|
44
|
+
|
45
|
+
Released on April 23, 2024.
|
46
|
+
|
11
47
|
- Added `PUBLIC_COLLECTION` constant for [public addressing].
|
12
48
|
|
13
49
|
- `Federation` now supports [authorized fetch] for actor dispatcher and
|
@@ -38,7 +74,7 @@ To be released.
|
|
38
74
|
- Activity Vocabulary classes now have `typeId` static property.
|
39
75
|
|
40
76
|
- Dispatcher setters and inbox listener setters in `Federation` now take
|
41
|
-
a path as
|
77
|
+
a path as `` `${string}{handle}${string}` `` instead of `string`
|
42
78
|
so that it is more type-safe.
|
43
79
|
|
44
80
|
- Added generalized object dispatchers. [[#33]]
|
package/README.md
CHANGED
@@ -38,9 +38,9 @@ The rough roadmap is to implement the following features out of the box:
|
|
38
38
|
If you want to know more about the project, please take a look at the following
|
39
39
|
resources:
|
40
40
|
|
41
|
-
- [Tutorial](https://fedify.dev/tutorial
|
42
|
-
- [Manual](https://fedify.dev/manual
|
43
|
-
([Unstable](https://unstable.fedify.dev/manual
|
41
|
+
- [Tutorial](https://fedify.dev/tutorial)
|
42
|
+
- [Manual](https://fedify.dev/manual)
|
43
|
+
([Unstable](https://unstable.fedify.dev/manual))
|
44
44
|
- [API reference][JSR]
|
45
45
|
- [Examples](https://github.com/dahlia/fedify/tree/main/examples)
|
46
46
|
|
@@ -0,0 +1,99 @@
|
|
1
|
+
// Copyright 2009 The Go Authors. All rights reserved.
|
2
|
+
// https://github.com/golang/go/blob/master/LICENSE
|
3
|
+
// Copyright 2018-2024 the Deno authors. All rights reserved. MIT license.
|
4
|
+
// This module is browser compatible.
|
5
|
+
/**
|
6
|
+
* Port of the Go
|
7
|
+
* {@link https://github.com/golang/go/blob/go1.12.5/src/encoding/hex/hex.go | encoding/hex}
|
8
|
+
* library.
|
9
|
+
*
|
10
|
+
* This module is browser compatible.
|
11
|
+
*
|
12
|
+
* @example
|
13
|
+
* ```ts
|
14
|
+
* import {
|
15
|
+
* decodeHex,
|
16
|
+
* encodeHex,
|
17
|
+
* } from "@std/encoding/hex";
|
18
|
+
*
|
19
|
+
* const binary = new TextEncoder().encode("abc");
|
20
|
+
* const encoded = encodeHex(binary);
|
21
|
+
* console.log(encoded);
|
22
|
+
* // => "616263"
|
23
|
+
*
|
24
|
+
* console.log(decodeHex(encoded));
|
25
|
+
* // => Uint8Array(3) [ 97, 98, 99 ]
|
26
|
+
* ```
|
27
|
+
*
|
28
|
+
* @module
|
29
|
+
*/
|
30
|
+
import { validateBinaryLike } from "./_util.js";
|
31
|
+
const hexTable = new TextEncoder().encode("0123456789abcdef");
|
32
|
+
const textEncoder = new TextEncoder();
|
33
|
+
const textDecoder = new TextDecoder();
|
34
|
+
function errInvalidByte(byte) {
|
35
|
+
return new TypeError(`Invalid byte '${String.fromCharCode(byte)}'`);
|
36
|
+
}
|
37
|
+
function errLength() {
|
38
|
+
return new RangeError("Odd length hex string");
|
39
|
+
}
|
40
|
+
/** Converts a hex character into its value. */
|
41
|
+
function fromHexChar(byte) {
|
42
|
+
// '0' <= byte && byte <= '9'
|
43
|
+
if (48 <= byte && byte <= 57)
|
44
|
+
return byte - 48;
|
45
|
+
// 'a' <= byte && byte <= 'f'
|
46
|
+
if (97 <= byte && byte <= 102)
|
47
|
+
return byte - 97 + 10;
|
48
|
+
// 'A' <= byte && byte <= 'F'
|
49
|
+
if (65 <= byte && byte <= 70)
|
50
|
+
return byte - 65 + 10;
|
51
|
+
throw errInvalidByte(byte);
|
52
|
+
}
|
53
|
+
/**
|
54
|
+
* Converts data into a hex-encoded string.
|
55
|
+
*
|
56
|
+
* @example
|
57
|
+
* ```ts
|
58
|
+
* import { encodeHex } from "@std/encoding/hex";
|
59
|
+
*
|
60
|
+
* encodeHex("abc"); // "616263"
|
61
|
+
* ```
|
62
|
+
*/
|
63
|
+
export function encodeHex(src) {
|
64
|
+
const u8 = validateBinaryLike(src);
|
65
|
+
const dst = new Uint8Array(u8.length * 2);
|
66
|
+
for (let i = 0; i < dst.length; i++) {
|
67
|
+
const v = u8[i];
|
68
|
+
dst[i * 2] = hexTable[v >> 4];
|
69
|
+
dst[i * 2 + 1] = hexTable[v & 0x0f];
|
70
|
+
}
|
71
|
+
return textDecoder.decode(dst);
|
72
|
+
}
|
73
|
+
/**
|
74
|
+
* Decodes the given hex-encoded string. If the input is malformed, an error is
|
75
|
+
* thrown.
|
76
|
+
*
|
77
|
+
* @example
|
78
|
+
* ```ts
|
79
|
+
* import { decodeHex } from "@std/encoding/hex";
|
80
|
+
*
|
81
|
+
* decodeHex("616263"); // Uint8Array(3) [ 97, 98, 99 ]
|
82
|
+
* ```
|
83
|
+
*/
|
84
|
+
export function decodeHex(src) {
|
85
|
+
const u8 = textEncoder.encode(src);
|
86
|
+
const dst = new Uint8Array(u8.length / 2);
|
87
|
+
for (let i = 0; i < dst.length; i++) {
|
88
|
+
const a = fromHexChar(u8[i * 2]);
|
89
|
+
const b = fromHexChar(u8[i * 2 + 1]);
|
90
|
+
dst[i] = (a << 4) | b;
|
91
|
+
}
|
92
|
+
if (u8.length % 2 === 1) {
|
93
|
+
// Check for invalid char before reporting bad length,
|
94
|
+
// since the invalid char (if present) is an earlier problem.
|
95
|
+
fromHexChar(u8[dst.length * 2]);
|
96
|
+
throw errLength();
|
97
|
+
}
|
98
|
+
return dst;
|
99
|
+
}
|
@@ -1 +1,43 @@
|
|
1
|
-
|
1
|
+
import * as dntShim from "../_dnt.shims.js";
|
2
|
+
import { encodeHex } from "../deps/jsr.io/@std/encoding/0.220.1/hex.js";
|
3
|
+
/**
|
4
|
+
* Calculates the [partial follower collection digest][1].
|
5
|
+
*
|
6
|
+
* [1]: https://codeberg.org/fediverse/fep/src/branch/main/fep/8fcf/fep-8fcf.md#partial-follower-collection-digest
|
7
|
+
* @param uris The URIs to calculate the digest. Duplicate URIs are ignored.
|
8
|
+
* @returns The digest.
|
9
|
+
*/
|
10
|
+
export async function digest(uris) {
|
11
|
+
const processed = new Set();
|
12
|
+
const encoder = new TextEncoder();
|
13
|
+
const result = new Uint8Array(32);
|
14
|
+
for (const uri of uris) {
|
15
|
+
const u = uri instanceof URL ? uri.href : uri;
|
16
|
+
if (processed.has(u))
|
17
|
+
continue;
|
18
|
+
processed.add(u);
|
19
|
+
const encoded = encoder.encode(u);
|
20
|
+
const digest = new Uint8Array(await dntShim.crypto.subtle.digest("SHA-256", encoded));
|
21
|
+
for (let i = 0; i < 32; i++) {
|
22
|
+
result[i] ^= digest[i];
|
23
|
+
}
|
24
|
+
}
|
25
|
+
return result;
|
26
|
+
}
|
27
|
+
/**
|
28
|
+
* Builds [`Collection-Synchronization`][1] header content.
|
29
|
+
*
|
30
|
+
* [1]: https://codeberg.org/fediverse/fep/src/branch/main/fep/8fcf/fep-8fcf.md#the-collection-synchronization-http-header
|
31
|
+
*
|
32
|
+
* @param collectionId The sender's followers collection URI.
|
33
|
+
* @param actorIds The actor URIs to digest.
|
34
|
+
* @returns The header content.
|
35
|
+
*/
|
36
|
+
export async function buildCollectionSynchronizationHeader(collectionId, actorIds) {
|
37
|
+
const [anyActorId] = actorIds;
|
38
|
+
const baseUrl = new URL(anyActorId);
|
39
|
+
const url = new URL(collectionId);
|
40
|
+
url.searchParams.set("base-url", `${baseUrl.origin}/`);
|
41
|
+
const hash = encodeHex(await digest(actorIds));
|
42
|
+
return `collectionId="${collectionId}", url="${url}", digest="${hash}"`;
|
43
|
+
}
|
@@ -2,7 +2,7 @@ import { Temporal } from "@js-temporal/polyfill";
|
|
2
2
|
import { getLogger } from "@logtape/logtape";
|
3
3
|
import { accepts } from "../deps/jsr.io/@std/http/0.220.1/negotiation.js";
|
4
4
|
import { doesActorOwnKey, verify } from "../httpsig/mod.js";
|
5
|
-
import { Activity, OrderedCollection, OrderedCollectionPage, } from "../vocab/vocab.js";
|
5
|
+
import { Activity, Link, Object, OrderedCollection, OrderedCollectionPage, } from "../vocab/vocab.js";
|
6
6
|
export function acceptsJsonLd(request) {
|
7
7
|
const types = accepts(request);
|
8
8
|
if (types == null)
|
@@ -61,7 +61,7 @@ export async function handleObject(request, { values, context, objectDispatcher,
|
|
61
61
|
},
|
62
62
|
});
|
63
63
|
}
|
64
|
-
export async function handleCollection(request, { handle, context, collectionCallbacks, onUnauthorized, onNotFound, onNotAcceptable, }) {
|
64
|
+
export async function handleCollection(request, { name, handle, filter, filterPredicate, context, collectionCallbacks, onUnauthorized, onNotFound, onNotAcceptable, }) {
|
65
65
|
if (collectionCallbacks == null)
|
66
66
|
return await onNotFound(request);
|
67
67
|
const url = new URL(request.url);
|
@@ -71,13 +71,13 @@ export async function handleCollection(request, { handle, context, collectionCal
|
|
71
71
|
const firstCursor = await collectionCallbacks.firstCursor?.(context, handle);
|
72
72
|
const totalItems = await collectionCallbacks.counter?.(context, handle);
|
73
73
|
if (firstCursor == null) {
|
74
|
-
const page = await collectionCallbacks.dispatcher(context, handle, null);
|
74
|
+
const page = await collectionCallbacks.dispatcher(context, handle, null, filter);
|
75
75
|
if (page == null)
|
76
76
|
return await onNotFound(request);
|
77
77
|
const { items } = page;
|
78
78
|
collection = new OrderedCollection({
|
79
79
|
totalItems: totalItems == null ? null : Number(totalItems),
|
80
|
-
items,
|
80
|
+
items: filterCollectionItems(items, name, filterPredicate),
|
81
81
|
});
|
82
82
|
}
|
83
83
|
else {
|
@@ -97,7 +97,7 @@ export async function handleCollection(request, { handle, context, collectionCal
|
|
97
97
|
}
|
98
98
|
}
|
99
99
|
else {
|
100
|
-
const page = await collectionCallbacks.dispatcher(context, handle, cursor);
|
100
|
+
const page = await collectionCallbacks.dispatcher(context, handle, cursor, filter);
|
101
101
|
if (page == null)
|
102
102
|
return await onNotFound(request);
|
103
103
|
const { items, prevCursor, nextCursor } = page;
|
@@ -113,7 +113,12 @@ export async function handleCollection(request, { handle, context, collectionCal
|
|
113
113
|
}
|
114
114
|
const partOf = new URL(context.url);
|
115
115
|
partOf.searchParams.delete("cursor");
|
116
|
-
collection = new OrderedCollectionPage({
|
116
|
+
collection = new OrderedCollectionPage({
|
117
|
+
prev,
|
118
|
+
next,
|
119
|
+
items: filterCollectionItems(items, name, filterPredicate),
|
120
|
+
partOf,
|
121
|
+
});
|
117
122
|
}
|
118
123
|
if (!acceptsJsonLd(request))
|
119
124
|
return await onNotAcceptable(request);
|
@@ -132,6 +137,31 @@ export async function handleCollection(request, { handle, context, collectionCal
|
|
132
137
|
},
|
133
138
|
});
|
134
139
|
}
|
140
|
+
function filterCollectionItems(items, collectionName, filterPredicate) {
|
141
|
+
const result = [];
|
142
|
+
let logged = false;
|
143
|
+
for (const item of items) {
|
144
|
+
let mappedItem;
|
145
|
+
if (item instanceof Object || item instanceof Link || item instanceof URL) {
|
146
|
+
mappedItem = item;
|
147
|
+
}
|
148
|
+
else if (item.id == null)
|
149
|
+
continue;
|
150
|
+
else
|
151
|
+
mappedItem = item.id;
|
152
|
+
if (filterPredicate != null && !filterPredicate(item)) {
|
153
|
+
if (!logged) {
|
154
|
+
getLogger(["fedify", "federation", "collection"]).warn(`The ${collectionName} collection apparently does not implement ` +
|
155
|
+
"filtering. This may result in a large response payload. " +
|
156
|
+
"Please consider implementing filtering for the collection.");
|
157
|
+
logged = true;
|
158
|
+
}
|
159
|
+
continue;
|
160
|
+
}
|
161
|
+
result.push(mappedItem);
|
162
|
+
}
|
163
|
+
return result;
|
164
|
+
}
|
135
165
|
export async function handleInbox(request, { handle, context, kv, kvPrefix, actorDispatcher, inboxListeners, inboxErrorHandler, onNotFound, }) {
|
136
166
|
const logger = getLogger(["fedify", "federation", "inbox"]);
|
137
167
|
if (actorDispatcher == null) {
|
@@ -7,6 +7,7 @@ import { handleNodeInfo, handleNodeInfoJrd } from "../nodeinfo/handler.js";
|
|
7
7
|
import { fetchDocumentLoader, getAuthenticatedDocumentLoader, kvCache, } from "../runtime/docloader.js";
|
8
8
|
import { Activity, CryptographicKey } from "../vocab/mod.js";
|
9
9
|
import { handleWebFinger } from "../webfinger/handler.js";
|
10
|
+
import { buildCollectionSynchronizationHeader } from "./collection.js";
|
10
11
|
import { handleActor, handleCollection, handleInbox, handleObject, } from "./handler.js";
|
11
12
|
import { Router, RouterError } from "./router.js";
|
12
13
|
import { extractInboxes, sendActivity } from "./send.js";
|
@@ -89,6 +90,7 @@ export class Federation {
|
|
89
90
|
inbox: message.inbox,
|
90
91
|
activity: message.activity,
|
91
92
|
trial: message.trial,
|
93
|
+
headers: message.headers,
|
92
94
|
};
|
93
95
|
let activity = null;
|
94
96
|
try {
|
@@ -104,6 +106,7 @@ export class Federation {
|
|
104
106
|
activity,
|
105
107
|
inbox: new URL(message.inbox),
|
106
108
|
documentLoader,
|
109
|
+
headers: new Headers(message.headers),
|
107
110
|
});
|
108
111
|
}
|
109
112
|
catch (error) {
|
@@ -181,7 +184,9 @@ export class Federation {
|
|
181
184
|
}
|
182
185
|
return new URL(path, url);
|
183
186
|
},
|
184
|
-
getObjectUri: (
|
187
|
+
getObjectUri: (
|
188
|
+
// deno-lint-ignore no-explicit-any
|
189
|
+
cls, values) => {
|
185
190
|
const callbacks = this.#objectCallbacks[cls.typeId.href];
|
186
191
|
if (callbacks == null) {
|
187
192
|
throw new RouterError("No object dispatcher registered.");
|
@@ -257,7 +262,28 @@ export class Federation {
|
|
257
262
|
const senderPair = "handle" in sender
|
258
263
|
? await getKeyPairFromHandle(sender.handle)
|
259
264
|
: sender;
|
260
|
-
|
265
|
+
const opts = { ...options };
|
266
|
+
let expandedRecipients;
|
267
|
+
if (Array.isArray(recipients)) {
|
268
|
+
expandedRecipients = recipients;
|
269
|
+
}
|
270
|
+
else if (recipients === "followers") {
|
271
|
+
if (!("handle" in sender)) {
|
272
|
+
throw new Error("If recipients is 'followers', sender must be an actor handle.");
|
273
|
+
}
|
274
|
+
expandedRecipients = [];
|
275
|
+
for await (const recipient of this.#getFollowers(reqCtx, sender.handle)) {
|
276
|
+
expandedRecipients.push(recipient);
|
277
|
+
}
|
278
|
+
const collectionId = this.#router.build("followers", sender);
|
279
|
+
opts.collectionSync = collectionId == null
|
280
|
+
? undefined
|
281
|
+
: new URL(collectionId, url).href;
|
282
|
+
}
|
283
|
+
else {
|
284
|
+
expandedRecipients = [recipients];
|
285
|
+
}
|
286
|
+
return await this.sendActivity(senderPair, expandedRecipients, activity, opts);
|
261
287
|
},
|
262
288
|
};
|
263
289
|
if (request == null)
|
@@ -557,6 +583,29 @@ export class Federation {
|
|
557
583
|
};
|
558
584
|
return setters;
|
559
585
|
}
|
586
|
+
async *#getFollowers(context, handle) {
|
587
|
+
if (this.#followersCallbacks == null) {
|
588
|
+
throw new Error("No followers collection dispatcher registered.");
|
589
|
+
}
|
590
|
+
const result = await this.#followersCallbacks.dispatcher(context, handle, null);
|
591
|
+
if (result != null) {
|
592
|
+
for (const recipient of result.items)
|
593
|
+
yield recipient;
|
594
|
+
return;
|
595
|
+
}
|
596
|
+
if (this.#followersCallbacks.firstCursor == null) {
|
597
|
+
throw new Error("No first cursor dispatcher registered for followers collection.");
|
598
|
+
}
|
599
|
+
let cursor = await this.#followersCallbacks.firstCursor(context, handle);
|
600
|
+
while (cursor != null) {
|
601
|
+
const result = await this.#followersCallbacks.dispatcher(context, handle, cursor);
|
602
|
+
if (result == null)
|
603
|
+
break;
|
604
|
+
for (const recipient of result.items)
|
605
|
+
yield recipient;
|
606
|
+
cursor = result.nextCursor ?? null;
|
607
|
+
}
|
608
|
+
}
|
560
609
|
/**
|
561
610
|
* Assigns the URL path for the inbox and starts setting inbox listeners.
|
562
611
|
*
|
@@ -628,7 +677,7 @@ export class Federation {
|
|
628
677
|
* @param options Options for sending the activity.
|
629
678
|
* @throws {TypeError} If the activity to send does not have an actor.
|
630
679
|
*/
|
631
|
-
async sendActivity({ keyId, privateKey }, recipients, activity, { preferSharedInbox, immediate } = {}) {
|
680
|
+
async sendActivity({ keyId, privateKey }, recipients, activity, { preferSharedInbox, immediate, collectionSync } = {}) {
|
632
681
|
const logger = getLogger(["fedify", "federation", "outbox"]);
|
633
682
|
if (activity.actorId == null) {
|
634
683
|
logger.error("Activity {activityId} to send does not have an actor.", { activity, activityId: activity?.id?.href });
|
@@ -646,7 +695,7 @@ export class Federation {
|
|
646
695
|
preferSharedInbox,
|
647
696
|
});
|
648
697
|
logger.debug("Sending activity {activityId} to inboxes:\n{inboxes}", {
|
649
|
-
inboxes:
|
698
|
+
inboxes: globalThis.Object.keys(inboxes),
|
650
699
|
activityId: activity.id?.href,
|
651
700
|
activity,
|
652
701
|
});
|
@@ -660,13 +709,16 @@ export class Federation {
|
|
660
709
|
logger.debug("Sending activity immediately without queue since queue is not set.", { activityId: activity.id?.href, activity });
|
661
710
|
}
|
662
711
|
const promises = [];
|
663
|
-
for (const inbox
|
712
|
+
for (const inbox in inboxes) {
|
664
713
|
promises.push(sendActivity({
|
665
714
|
keyId,
|
666
715
|
privateKey,
|
667
716
|
activity,
|
668
|
-
inbox,
|
717
|
+
inbox: new URL(inbox),
|
669
718
|
documentLoader,
|
719
|
+
headers: collectionSync == null ? undefined : new Headers({
|
720
|
+
"Collection-Synchronization": await buildCollectionSynchronizationHeader(collectionSync, inboxes[inbox]),
|
721
|
+
}),
|
670
722
|
}));
|
671
723
|
}
|
672
724
|
await Promise.all(promises);
|
@@ -675,14 +727,17 @@ export class Federation {
|
|
675
727
|
logger.debug("Enqueuing activity {activityId} to send later.", { activityId: activity.id?.href, activity });
|
676
728
|
const privateKeyJwk = await exportJwk(privateKey);
|
677
729
|
const activityJson = await activity.toJsonLd({ documentLoader });
|
678
|
-
for (const inbox
|
730
|
+
for (const inbox in inboxes) {
|
679
731
|
const message = {
|
680
732
|
type: "outbox",
|
681
733
|
keyId: keyId.href,
|
682
734
|
privateKey: privateKeyJwk,
|
683
735
|
activity: activityJson,
|
684
|
-
inbox
|
736
|
+
inbox,
|
685
737
|
trial: 0,
|
738
|
+
headers: collectionSync == null ? {} : {
|
739
|
+
"Collection-Synchronization": await buildCollectionSynchronizationHeader(collectionSync, inboxes[inbox]),
|
740
|
+
},
|
686
741
|
};
|
687
742
|
this.#queue.enqueue(message);
|
688
743
|
}
|
@@ -765,6 +820,7 @@ export class Federation {
|
|
765
820
|
}
|
766
821
|
case "outbox":
|
767
822
|
return await handleCollection(request, {
|
823
|
+
name: "outbox",
|
768
824
|
handle: route.values.handle,
|
769
825
|
context,
|
770
826
|
collectionCallbacks: this.#outboxCallbacks,
|
@@ -793,6 +849,7 @@ export class Federation {
|
|
793
849
|
});
|
794
850
|
case "following":
|
795
851
|
return await handleCollection(request, {
|
852
|
+
name: "following",
|
796
853
|
handle: route.values.handle,
|
797
854
|
context,
|
798
855
|
collectionCallbacks: this.#followingCallbacks,
|
@@ -800,15 +857,26 @@ export class Federation {
|
|
800
857
|
onNotFound,
|
801
858
|
onNotAcceptable,
|
802
859
|
});
|
803
|
-
case "followers":
|
860
|
+
case "followers": {
|
861
|
+
let baseUrl = url.searchParams.get("base-url");
|
862
|
+
if (baseUrl != null) {
|
863
|
+
const u = new URL(baseUrl);
|
864
|
+
baseUrl = `${u.origin}/`;
|
865
|
+
}
|
804
866
|
return await handleCollection(request, {
|
867
|
+
name: "followers",
|
805
868
|
handle: route.values.handle,
|
806
869
|
context,
|
870
|
+
filter: baseUrl != null ? new URL(baseUrl) : undefined,
|
871
|
+
filterPredicate: baseUrl != null
|
872
|
+
? ((i) => (i instanceof URL ? i.href : i.id?.href ?? "").startsWith(baseUrl))
|
873
|
+
: undefined,
|
807
874
|
collectionCallbacks: this.#followersCallbacks,
|
808
875
|
onUnauthorized,
|
809
876
|
onNotFound,
|
810
877
|
onNotAcceptable,
|
811
878
|
});
|
879
|
+
}
|
812
880
|
default: {
|
813
881
|
const response = onNotFound(request);
|
814
882
|
return response instanceof Promise ? await response : response;
|
package/esm/federation/send.js
CHANGED
@@ -4,7 +4,7 @@ import { sign } from "../httpsig/mod.js";
|
|
4
4
|
* Extracts the inbox URLs from recipients.
|
5
5
|
* @param parameters The parameters to extract the inboxes.
|
6
6
|
* See also {@link ExtractInboxesParameters}.
|
7
|
-
* @returns The inbox
|
7
|
+
* @returns The inboxes as a map of inbox URL to actor URIs.
|
8
8
|
*/
|
9
9
|
export function extractInboxes({ recipients, preferSharedInbox }) {
|
10
10
|
const inboxes = {};
|
@@ -12,10 +12,12 @@ export function extractInboxes({ recipients, preferSharedInbox }) {
|
|
12
12
|
const inbox = preferSharedInbox
|
13
13
|
? recipient.endpoints?.sharedInbox ?? recipient.inboxId
|
14
14
|
: recipient.inboxId;
|
15
|
-
if (inbox != null)
|
16
|
-
inboxes[inbox.href]
|
15
|
+
if (inbox != null && recipient.id != null) {
|
16
|
+
inboxes[inbox.href] ??= new Set();
|
17
|
+
inboxes[inbox.href].add(recipient.id.href);
|
18
|
+
}
|
17
19
|
}
|
18
|
-
return
|
20
|
+
return inboxes;
|
19
21
|
}
|
20
22
|
/**
|
21
23
|
* Sends an {@link Activity} to an inbox.
|
@@ -24,17 +26,17 @@ export function extractInboxes({ recipients, preferSharedInbox }) {
|
|
24
26
|
* See also {@link SendActivityParameters}.
|
25
27
|
* @throws {Error} If the activity fails to send.
|
26
28
|
*/
|
27
|
-
export async function sendActivity({ activity, privateKey, keyId, inbox, documentLoader, }) {
|
29
|
+
export async function sendActivity({ activity, privateKey, keyId, inbox, documentLoader, headers, }) {
|
28
30
|
const logger = getLogger(["fedify", "federation", "outbox"]);
|
29
31
|
if (activity.actorId == null) {
|
30
32
|
throw new TypeError("The activity to send must have at least one actor property.");
|
31
33
|
}
|
32
34
|
const jsonLd = await activity.toJsonLd({ documentLoader });
|
35
|
+
headers = new Headers(headers);
|
36
|
+
headers.set("Content-Type", "application/activity+json");
|
33
37
|
let request = new Request(inbox, {
|
34
38
|
method: "POST",
|
35
|
-
headers
|
36
|
-
"Content-Type": "application/activity+json",
|
37
|
-
},
|
39
|
+
headers,
|
38
40
|
body: JSON.stringify(jsonLd),
|
39
41
|
});
|
40
42
|
request = await sign(request, privateKey, keyId);
|
package/esm/httpsig/mod.js
CHANGED
@@ -197,7 +197,7 @@ export async function doesActorOwnKey(activity, key, documentLoader) {
|
|
197
197
|
* @param keyId The ID of the key to check, or the key itself.
|
198
198
|
* @param documentLoader The document loader to use for fetching the key and its owner.
|
199
199
|
* @returns The actor that owns the key, or `null` if the key has no known owner.
|
200
|
-
* @
|
200
|
+
* @since 0.7.0
|
201
201
|
*/
|
202
202
|
export async function getKeyOwner(keyId, documentLoader) {
|
203
203
|
let object;
|
package/esm/mod.js
CHANGED
@@ -28,8 +28,9 @@
|
|
28
28
|
* following resources:
|
29
29
|
*
|
30
30
|
* - [GitHub](https://github.com/dahlia/fedify)
|
31
|
-
* -
|
32
|
-
*
|
31
|
+
* - [Tutorial](https://fedify.dev/tutorial)
|
32
|
+
* - [Manual](https://fedify.dev/manual)
|
33
|
+
* ([Unstable](https://unstable.fedify.dev/manual))
|
33
34
|
* - [Examples](https://github.com/dahlia/fedify/tree/main/examples)
|
34
35
|
*
|
35
36
|
* [ActivityPub]: https://www.w3.org/TR/activitypub/
|
package/package.json
CHANGED
@@ -0,0 +1,24 @@
|
|
1
|
+
/**
|
2
|
+
* Converts data into a hex-encoded string.
|
3
|
+
*
|
4
|
+
* @example
|
5
|
+
* ```ts
|
6
|
+
* import { encodeHex } from "@std/encoding/hex";
|
7
|
+
*
|
8
|
+
* encodeHex("abc"); // "616263"
|
9
|
+
* ```
|
10
|
+
*/
|
11
|
+
export declare function encodeHex(src: string | Uint8Array | ArrayBuffer): string;
|
12
|
+
/**
|
13
|
+
* Decodes the given hex-encoded string. If the input is malformed, an error is
|
14
|
+
* thrown.
|
15
|
+
*
|
16
|
+
* @example
|
17
|
+
* ```ts
|
18
|
+
* import { decodeHex } from "@std/encoding/hex";
|
19
|
+
*
|
20
|
+
* decodeHex("616263"); // Uint8Array(3) [ 97, 98, 99 ]
|
21
|
+
* ```
|
22
|
+
*/
|
23
|
+
export declare function decodeHex(src: string): Uint8Array;
|
24
|
+
//# sourceMappingURL=hex.d.ts.map
|
@@ -0,0 +1 @@
|
|
1
|
+
{"version":3,"file":"hex.d.ts","sourceRoot":"","sources":["../../../../../../src/deps/jsr.io/@std/encoding/0.220.1/hex.ts"],"names":[],"mappings":"AAyDA;;;;;;;;;GASG;AACH,wBAAgB,SAAS,CAAC,GAAG,EAAE,MAAM,GAAG,UAAU,GAAG,WAAW,GAAG,MAAM,CAUxE;AAED;;;;;;;;;;GAUG;AACH,wBAAgB,SAAS,CAAC,GAAG,EAAE,MAAM,GAAG,UAAU,CAiBjD"}
|
@@ -37,19 +37,19 @@ export type ObjectDispatcher<TContextData, TObject extends Object, TParam extend
|
|
37
37
|
*
|
38
38
|
* @typeParam TContextData The context data to pass to the {@link Context}.
|
39
39
|
*/
|
40
|
-
export type CollectionDispatcher<TItem, TContextData> = (context: RequestContext<TContextData>, handle: string, cursor: string | null) => PageItems<TItem> | null | Promise<PageItems<TItem> | null>;
|
40
|
+
export type CollectionDispatcher<TItem, TContextData, TFilter> = (context: RequestContext<TContextData>, handle: string, cursor: string | null, filter?: TFilter) => PageItems<TItem> | null | Promise<PageItems<TItem> | null>;
|
41
41
|
/**
|
42
42
|
* A callback that counts the number of items in a collection.
|
43
43
|
*
|
44
44
|
* @typeParam TContextData The context data to pass to the {@link Context}.
|
45
45
|
*/
|
46
|
-
export type CollectionCounter<TContextData> = (context: RequestContext<TContextData>, handle: string) => number | bigint | null | Promise<number | bigint | null>;
|
46
|
+
export type CollectionCounter<TContextData, TFilter> = (context: RequestContext<TContextData>, handle: string, filter?: TFilter) => number | bigint | null | Promise<number | bigint | null>;
|
47
47
|
/**
|
48
48
|
* A callback that returns a cursor for a collection.
|
49
49
|
*
|
50
50
|
* @typeParam TContextData The context data to pass to the {@link Context}.
|
51
51
|
*/
|
52
|
-
export type CollectionCursor<TContextData> = (context: RequestContext<TContextData>, handle: string) => string | null | Promise<string | null>;
|
52
|
+
export type CollectionCursor<TContextData, TFilter> = (context: RequestContext<TContextData>, handle: string, filter?: TFilter) => string | null | Promise<string | null>;
|
53
53
|
/**
|
54
54
|
* A callback that listens for activities in an inbox.
|
55
55
|
*
|
@@ -1 +1 @@
|
|
1
|
-
{"version":3,"file":"callback.d.ts","sourceRoot":"","sources":["../../src/federation/callback.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,OAAO,MAAM,kBAAkB,CAAC;AAC5C,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,sBAAsB,CAAC;AACrD,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,mBAAmB,CAAC;AAC/C,OAAO,KAAK,EAAE,QAAQ,EAAE,gBAAgB,EAAE,MAAM,iBAAiB,CAAC;AAClE,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,mBAAmB,CAAC;AAChD,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AACjD,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,cAAc,CAAC;AAEnD;;;;GAIG;AACH,MAAM,MAAM,kBAAkB,CAAC,YAAY,IAAI,CAC7C,OAAO,EAAE,cAAc,CAAC,YAAY,CAAC,KAClC,QAAQ,GAAG,OAAO,CAAC,QAAQ,CAAC,CAAC;AAElC;;;;GAIG;AACH,MAAM,MAAM,eAAe,CAAC,YAAY,IAAI,CAC1C,OAAO,EAAE,cAAc,CAAC,YAAY,CAAC,EACrC,MAAM,EAAE,MAAM,EACd,GAAG,EAAE,gBAAgB,GAAG,IAAI,KACzB,KAAK,GAAG,IAAI,GAAG,OAAO,CAAC,KAAK,GAAG,IAAI,CAAC,CAAC;AAE1C;;;;GAIG;AACH,MAAM,MAAM,sBAAsB,CAAC,YAAY,IAAI,CACjD,WAAW,EAAE,YAAY,EACzB,MAAM,EAAE,MAAM,KACX,OAAO,CAAC,aAAa,GAAG,IAAI,GAAG,OAAO,CAAC,OAAO,CAAC,aAAa,GAAG,IAAI,CAAC,CAAC;AAE1E;;;;;;;GAOG;AACH,MAAM,MAAM,gBAAgB,CAC1B,YAAY,EACZ,OAAO,SAAS,MAAM,EACtB,MAAM,SAAS,MAAM,IACnB,CACF,OAAO,EAAE,cAAc,CAAC,YAAY,CAAC,EACrC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,KAC3B,OAAO,GAAG,IAAI,GAAG,OAAO,CAAC,OAAO,GAAG,IAAI,CAAC,CAAC;AAE9C;;;;GAIG;AACH,MAAM,MAAM,oBAAoB,CAAC,KAAK,EAAE,YAAY,IAAI,
|
1
|
+
{"version":3,"file":"callback.d.ts","sourceRoot":"","sources":["../../src/federation/callback.ts"],"names":[],"mappings":"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"}
|
@@ -1,3 +1,4 @@
|
|
1
|
+
/// <reference types="node" />
|
1
2
|
/**
|
2
3
|
* A page of items.
|
3
4
|
*/
|
@@ -6,4 +7,22 @@ export interface PageItems<TItem> {
|
|
6
7
|
nextCursor?: string | null;
|
7
8
|
items: TItem[];
|
8
9
|
}
|
10
|
+
/**
|
11
|
+
* Calculates the [partial follower collection digest][1].
|
12
|
+
*
|
13
|
+
* [1]: https://codeberg.org/fediverse/fep/src/branch/main/fep/8fcf/fep-8fcf.md#partial-follower-collection-digest
|
14
|
+
* @param uris The URIs to calculate the digest. Duplicate URIs are ignored.
|
15
|
+
* @returns The digest.
|
16
|
+
*/
|
17
|
+
export declare function digest(uris: Iterable<string | URL>): Promise<Uint8Array>;
|
18
|
+
/**
|
19
|
+
* Builds [`Collection-Synchronization`][1] header content.
|
20
|
+
*
|
21
|
+
* [1]: https://codeberg.org/fediverse/fep/src/branch/main/fep/8fcf/fep-8fcf.md#the-collection-synchronization-http-header
|
22
|
+
*
|
23
|
+
* @param collectionId The sender's followers collection URI.
|
24
|
+
* @param actorIds The actor URIs to digest.
|
25
|
+
* @returns The header content.
|
26
|
+
*/
|
27
|
+
export declare function buildCollectionSynchronizationHeader(collectionId: string | URL, actorIds: Iterable<string | URL>): Promise<string>;
|
9
28
|
//# sourceMappingURL=collection.d.ts.map
|
@@ -1 +1 @@
|
|
1
|
-
{"version":3,"file":"collection.d.ts","sourceRoot":"","sources":["../../src/federation/collection.ts"],"names":[],"mappings":"
|
1
|
+
{"version":3,"file":"collection.d.ts","sourceRoot":"","sources":["../../src/federation/collection.ts"],"names":[],"mappings":";AAGA;;GAEG;AACH,MAAM,WAAW,SAAS,CAAC,KAAK;IAC9B,UAAU,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC3B,UAAU,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC3B,KAAK,EAAE,KAAK,EAAE,CAAC;CAChB;AAED;;;;;;GAMG;AACH,wBAAsB,MAAM,CAC1B,IAAI,EAAE,QAAQ,CAAC,MAAM,GAAG,GAAG,CAAC,GAC3B,OAAO,CAAC,UAAU,CAAC,CAiBrB;AAED;;;;;;;;GAQG;AACH,wBAAsB,oCAAoC,CACxD,YAAY,EAAE,MAAM,GAAG,GAAG,EAC1B,QAAQ,EAAE,QAAQ,CAAC,MAAM,GAAG,GAAG,CAAC,GAC/B,OAAO,CAAC,MAAM,CAAC,CAOjB"}
|
@@ -0,0 +1 @@
|
|
1
|
+
{"version":3,"file":"collection.test.d.ts","sourceRoot":"","sources":["../../src/federation/collection.test.ts"],"names":[],"mappings":"AAAA,OAAO,2BAA2B,CAAC"}
|
@@ -2,7 +2,7 @@
|
|
2
2
|
/// <reference types="node" />
|
3
3
|
import * as dntShim from "../_dnt.shims.js";
|
4
4
|
import type { DocumentLoader } from "../runtime/docloader.js";
|
5
|
-
import type { Actor } from "../vocab/actor.js";
|
5
|
+
import type { Actor, Recipient } from "../vocab/actor.js";
|
6
6
|
import type { Activity, CryptographicKey, Object } from "../vocab/mod.js";
|
7
7
|
/**
|
8
8
|
* A context.
|
@@ -122,14 +122,13 @@ export interface Context<TContextData> {
|
|
122
122
|
* @param recipients The recipients of the activity.
|
123
123
|
* @param activity The activity to send.
|
124
124
|
* @param options Options for sending the activity.
|
125
|
-
* @throws {Error} If the sender is not valid.
|
126
125
|
*/
|
127
126
|
sendActivity(sender: {
|
128
127
|
keyId: URL;
|
129
128
|
privateKey: dntShim.CryptoKey;
|
130
129
|
} | {
|
131
130
|
handle: string;
|
132
|
-
}, recipients:
|
131
|
+
}, recipients: Recipient | Recipient[], activity: Activity, options?: SendActivityOptions): Promise<void>;
|
133
132
|
}
|
134
133
|
/**
|
135
134
|
* A context for a request.
|
@@ -191,6 +190,31 @@ export interface RequestContext<TContextData> extends Context<TContextData> {
|
|
191
190
|
* @since 0.7.0
|
192
191
|
*/
|
193
192
|
getSignedKeyOwner(): Promise<Actor | null>;
|
193
|
+
/**
|
194
|
+
* Sends an activity to recipients' inboxes.
|
195
|
+
* @param sender The sender's handle or the sender's key pair.
|
196
|
+
* @param recipients The recipients of the activity.
|
197
|
+
* @param activity The activity to send.
|
198
|
+
* @param options Options for sending the activity.
|
199
|
+
*/
|
200
|
+
sendActivity(sender: {
|
201
|
+
keyId: URL;
|
202
|
+
privateKey: dntShim.CryptoKey;
|
203
|
+
} | {
|
204
|
+
handle: string;
|
205
|
+
}, recipients: Recipient | Recipient[], activity: Activity, options?: SendActivityOptions): Promise<void>;
|
206
|
+
/**
|
207
|
+
* Sends an activity to the outboxes of the sender's followers.
|
208
|
+
* @param sender The sender's handle.
|
209
|
+
* @param recipients In this case, it must be `"followers"`.
|
210
|
+
* @param activity The activity to send.
|
211
|
+
* @param options Options for sending the activity.
|
212
|
+
* @throws {Error} If no followers collection is registered.
|
213
|
+
* @since 0.8.0
|
214
|
+
*/
|
215
|
+
sendActivity(sender: {
|
216
|
+
handle: string;
|
217
|
+
}, recipients: "followers", activity: Activity, options?: SendActivityOptions): Promise<void>;
|
194
218
|
}
|
195
219
|
/**
|
196
220
|
* Options for {@link Context.sendActivity} method and
|
@@ -1 +1 @@
|
|
1
|
-
{"version":3,"file":"context.d.ts","sourceRoot":"","sources":["../../src/federation/context.ts"],"names":[],"mappings":";;AAAA,OAAO,KAAK,OAAO,MAAM,kBAAkB,CAAC;AAC5C,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,yBAAyB,CAAC;AAC9D,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,mBAAmB,CAAC;
|
1
|
+
{"version":3,"file":"context.d.ts","sourceRoot":"","sources":["../../src/federation/context.ts"],"names":[],"mappings":"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"}
|
@@ -1,7 +1,8 @@
|
|
1
1
|
/// <reference types="node" />
|
2
2
|
/// <reference types="node" />
|
3
3
|
import type { DocumentLoader } from "../runtime/docloader.js";
|
4
|
-
import
|
4
|
+
import type { Recipient } from "../vocab/actor.js";
|
5
|
+
import { Activity, Link, Object } from "../vocab/vocab.js";
|
5
6
|
import type { ActorDispatcher, AuthorizePredicate, CollectionCounter, CollectionCursor, CollectionDispatcher, InboxErrorHandler, InboxListener, ObjectAuthorizePredicate, ObjectDispatcher } from "./callback.js";
|
6
7
|
import type { RequestContext } from "./context.js";
|
7
8
|
import type { KvKey, KvStore } from "./kv.js";
|
@@ -29,37 +30,40 @@ export declare function handleObject<TContextData>(request: Request, { values, c
|
|
29
30
|
/**
|
30
31
|
* Callbacks for handling a collection.
|
31
32
|
*/
|
32
|
-
export interface CollectionCallbacks<TItem, TContextData> {
|
33
|
+
export interface CollectionCallbacks<TItem, TContextData, TFilter> {
|
33
34
|
/**
|
34
35
|
* A callback that dispatches a collection.
|
35
36
|
*/
|
36
|
-
dispatcher: CollectionDispatcher<TItem, TContextData>;
|
37
|
+
dispatcher: CollectionDispatcher<TItem, TContextData, TFilter>;
|
37
38
|
/**
|
38
39
|
* A callback that counts the number of items in a collection.
|
39
40
|
*/
|
40
|
-
counter?: CollectionCounter<TContextData>;
|
41
|
+
counter?: CollectionCounter<TContextData, TFilter>;
|
41
42
|
/**
|
42
43
|
* A callback that returns the first cursor for a collection.
|
43
44
|
*/
|
44
|
-
firstCursor?: CollectionCursor<TContextData>;
|
45
|
+
firstCursor?: CollectionCursor<TContextData, TFilter>;
|
45
46
|
/**
|
46
47
|
* A callback that returns the last cursor for a collection.
|
47
48
|
*/
|
48
|
-
lastCursor?: CollectionCursor<TContextData>;
|
49
|
+
lastCursor?: CollectionCursor<TContextData, TFilter>;
|
49
50
|
/**
|
50
51
|
* A callback that determines if a request is authorized to access the collection.
|
51
52
|
*/
|
52
53
|
authorizePredicate?: AuthorizePredicate<TContextData>;
|
53
54
|
}
|
54
|
-
export interface CollectionHandlerParameters<TItem, TContextData> {
|
55
|
+
export interface CollectionHandlerParameters<TItem, TContextData, TFilter> {
|
56
|
+
name: string;
|
55
57
|
handle: string;
|
58
|
+
filter?: TFilter;
|
59
|
+
filterPredicate?: (item: TItem) => boolean;
|
56
60
|
context: RequestContext<TContextData>;
|
57
|
-
collectionCallbacks?: CollectionCallbacks<TItem, TContextData>;
|
61
|
+
collectionCallbacks?: CollectionCallbacks<TItem, TContextData, TFilter>;
|
58
62
|
onUnauthorized(request: Request): Response | Promise<Response>;
|
59
63
|
onNotFound(request: Request): Response | Promise<Response>;
|
60
64
|
onNotAcceptable(request: Request): Response | Promise<Response>;
|
61
65
|
}
|
62
|
-
export declare function handleCollection<TItem extends URL | Object | Link, TContextData>(request: Request, { handle, context, collectionCallbacks, onUnauthorized, onNotFound, onNotAcceptable, }: CollectionHandlerParameters<TItem, TContextData>): Promise<Response>;
|
66
|
+
export declare function handleCollection<TItem extends URL | Object | Link | Recipient, TContextData, TFilter>(request: Request, { name, handle, filter, filterPredicate, context, collectionCallbacks, onUnauthorized, onNotFound, onNotAcceptable, }: CollectionHandlerParameters<TItem, TContextData, TFilter>): Promise<Response>;
|
63
67
|
export interface InboxHandlerParameters<TContextData> {
|
64
68
|
handle: string | null;
|
65
69
|
context: RequestContext<TContextData>;
|
@@ -1 +1 @@
|
|
1
|
-
{"version":3,"file":"handler.d.ts","sourceRoot":"","sources":["../../src/federation/handler.ts"],"names":[],"mappings":";;AAIA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,yBAAyB,CAAC;AAC9D,OAAO,EACL,QAAQ,EACR,
|
1
|
+
{"version":3,"file":"handler.d.ts","sourceRoot":"","sources":["../../src/federation/handler.ts"],"names":[],"mappings":"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"}
|
@@ -3,7 +3,7 @@
|
|
3
3
|
import * as dntShim from "../_dnt.shims.js";
|
4
4
|
import { Temporal } from "@js-temporal/polyfill";
|
5
5
|
import { type AuthenticatedDocumentLoaderFactory, type DocumentLoader } from "../runtime/docloader.js";
|
6
|
-
import type { Actor } from "../vocab/actor.js";
|
6
|
+
import type { Actor, Recipient } from "../vocab/actor.js";
|
7
7
|
import { Activity, type Object } from "../vocab/mod.js";
|
8
8
|
import type { ActorDispatcher, ActorKeyPairDispatcher, AuthorizePredicate, CollectionCounter, CollectionCursor, CollectionDispatcher, InboxErrorHandler, InboxListener, NodeInfoDispatcher, ObjectAuthorizePredicate, ObjectDispatcher, OutboxErrorHandler } from "./callback.js";
|
9
9
|
import type { Context, RequestContext, SendActivityOptions } from "./context.js";
|
@@ -266,7 +266,7 @@ export declare class Federation<TContextData> {
|
|
266
266
|
* @param dispatcher An outbox dispatcher callback to register.
|
267
267
|
* @throws {@link RouterError} Thrown if the path pattern is invalid.
|
268
268
|
*/
|
269
|
-
setOutboxDispatcher(path: `${string}{handle}${string}`, dispatcher: CollectionDispatcher<Activity, TContextData>): CollectionCallbackSetters<TContextData>;
|
269
|
+
setOutboxDispatcher(path: `${string}{handle}${string}`, dispatcher: CollectionDispatcher<Activity, TContextData, void>): CollectionCallbackSetters<TContextData, void>;
|
270
270
|
/**
|
271
271
|
* Registers a following collection dispatcher.
|
272
272
|
* @param path The URI path pattern for the following collection. The syntax
|
@@ -278,7 +278,7 @@ export declare class Federation<TContextData> {
|
|
278
278
|
* callbacks.
|
279
279
|
* @throws {RouterError} Thrown if the path pattern is invalid.
|
280
280
|
*/
|
281
|
-
setFollowingDispatcher(path: `${string}{handle}${string}`, dispatcher: CollectionDispatcher<Actor | URL, TContextData>): CollectionCallbackSetters<TContextData>;
|
281
|
+
setFollowingDispatcher(path: `${string}{handle}${string}`, dispatcher: CollectionDispatcher<Actor | URL, TContextData, void>): CollectionCallbackSetters<TContextData, void>;
|
282
282
|
/**
|
283
283
|
* Registers a followers collection dispatcher.
|
284
284
|
* @param path The URI path pattern for the followers collection. The syntax
|
@@ -290,7 +290,7 @@ export declare class Federation<TContextData> {
|
|
290
290
|
* callbacks.
|
291
291
|
* @throws {@link RouterError} Thrown if the path pattern is invalid.
|
292
292
|
*/
|
293
|
-
setFollowersDispatcher(path: `${string}{handle}${string}`, dispatcher: CollectionDispatcher<
|
293
|
+
setFollowersDispatcher(path: `${string}{handle}${string}`, dispatcher: CollectionDispatcher<Recipient, TContextData, URL>): CollectionCallbackSetters<TContextData, URL>;
|
294
294
|
/**
|
295
295
|
* Assigns the URL path for the inbox and starts setting inbox listeners.
|
296
296
|
*
|
@@ -334,7 +334,7 @@ export declare class Federation<TContextData> {
|
|
334
334
|
sendActivity({ keyId, privateKey }: {
|
335
335
|
keyId: URL;
|
336
336
|
privateKey: dntShim.CryptoKey;
|
337
|
-
}, recipients:
|
337
|
+
}, recipients: Recipient | Recipient[], activity: Activity, { preferSharedInbox, immediate, collectionSync }?: SendActivityInternalOptions): Promise<void>;
|
338
338
|
/**
|
339
339
|
* Handles a request related to federation. If a request is not related to
|
340
340
|
* federation, the `onNotFound` or `onNotAcceptable` callback is called.
|
@@ -438,33 +438,36 @@ export interface ObjectCallbackSetters<TContextData, TObject extends Object, TPa
|
|
438
438
|
}
|
439
439
|
/**
|
440
440
|
* Additional settings for a collection dispatcher.
|
441
|
+
*
|
442
|
+
* @typeParam TContextData The context data to pass to the {@link Context}.
|
443
|
+
* @typeParam TFilter The type of filter for the collection.
|
441
444
|
*/
|
442
|
-
export interface CollectionCallbackSetters<TContextData> {
|
445
|
+
export interface CollectionCallbackSetters<TContextData, TFilter> {
|
443
446
|
/**
|
444
447
|
* Sets the counter for the collection.
|
445
448
|
* @param counter A callback that returns the number of items in the collection.
|
446
449
|
* @returns The setters object so that settings can be chained.
|
447
450
|
*/
|
448
|
-
setCounter(counter: CollectionCounter<TContextData>): CollectionCallbackSetters<TContextData>;
|
451
|
+
setCounter(counter: CollectionCounter<TContextData, TFilter>): CollectionCallbackSetters<TContextData, TFilter>;
|
449
452
|
/**
|
450
453
|
* Sets the first cursor for the collection.
|
451
454
|
* @param cursor The cursor for the first item in the collection.
|
452
455
|
* @returns The setters object so that settings can be chained.
|
453
456
|
*/
|
454
|
-
setFirstCursor(cursor: CollectionCursor<TContextData>): CollectionCallbackSetters<TContextData>;
|
457
|
+
setFirstCursor(cursor: CollectionCursor<TContextData, TFilter>): CollectionCallbackSetters<TContextData, TFilter>;
|
455
458
|
/**
|
456
459
|
* Sets the last cursor for the collection.
|
457
460
|
* @param cursor The cursor for the last item in the collection.
|
458
461
|
* @returns The setters object so that settings can be chained.
|
459
462
|
*/
|
460
|
-
setLastCursor(cursor: CollectionCursor<TContextData>): CollectionCallbackSetters<TContextData>;
|
463
|
+
setLastCursor(cursor: CollectionCursor<TContextData, TFilter>): CollectionCallbackSetters<TContextData, TFilter>;
|
461
464
|
/**
|
462
465
|
* Specifies the conditions under which requests are authorized.
|
463
466
|
* @param predicate A callback that returns whether a request is authorized.
|
464
467
|
* @returns The setters object so that settings can be chained.
|
465
468
|
* @since 0.7.0
|
466
469
|
*/
|
467
|
-
authorize(predicate: AuthorizePredicate<TContextData>): CollectionCallbackSetters<TContextData>;
|
470
|
+
authorize(predicate: AuthorizePredicate<TContextData>): CollectionCallbackSetters<TContextData, TFilter>;
|
468
471
|
}
|
469
472
|
/**
|
470
473
|
* Registry for inbox listeners for different activity types.
|
@@ -487,4 +490,8 @@ export interface InboxListenerSetter<TContextData> {
|
|
487
490
|
*/
|
488
491
|
onError(handler: InboxErrorHandler<TContextData>): InboxListenerSetter<TContextData>;
|
489
492
|
}
|
493
|
+
interface SendActivityInternalOptions extends SendActivityOptions {
|
494
|
+
collectionSync?: string;
|
495
|
+
}
|
496
|
+
export {};
|
490
497
|
//# sourceMappingURL=middleware.d.ts.map
|
@@ -1 +1 @@
|
|
1
|
-
{"version":3,"file":"middleware.d.ts","sourceRoot":"","sources":["../../src/federation/middleware.ts"],"names":[],"mappings":";;AAAA,OAAO,KAAK,OAAO,MAAM,kBAAkB,CAAC;AAC5C,OAAO,EAAE,QAAQ,EAAE,MAAM,uBAAuB,CAAC;AAKjD,OAAO,EACL,KAAK,kCAAkC,EACvC,KAAK,cAAc,EAIpB,MAAM,yBAAyB,CAAC;AACjC,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,mBAAmB,CAAC;
|
1
|
+
{"version":3,"file":"middleware.d.ts","sourceRoot":"","sources":["../../src/federation/middleware.ts"],"names":[],"mappings":"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"}
|
@@ -1 +1 @@
|
|
1
|
-
{"version":3,"file":"queue.d.ts","sourceRoot":"","sources":["../../src/federation/queue.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,OAAO,MAAM,kBAAkB,CAAC;AAC5C,MAAM,WAAW,aAAa;IAC5B,IAAI,EAAE,QAAQ,CAAC;IACf,KAAK,EAAE,MAAM,CAAC;IACd,UAAU,EAAE,OAAO,CAAC,UAAU,CAAC;IAC/B,QAAQ,EAAE,OAAO,CAAC;IAClB,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,MAAM,CAAC;
|
1
|
+
{"version":3,"file":"queue.d.ts","sourceRoot":"","sources":["../../src/federation/queue.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,OAAO,MAAM,kBAAkB,CAAC;AAC5C,MAAM,WAAW,aAAa;IAC5B,IAAI,EAAE,QAAQ,CAAC;IACf,KAAK,EAAE,MAAM,CAAC;IACd,UAAU,EAAE,OAAO,CAAC,UAAU,CAAC;IAC/B,QAAQ,EAAE,OAAO,CAAC;IAClB,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;CACjC"}
|
@@ -1,7 +1,8 @@
|
|
1
1
|
/// <reference types="node" />
|
2
|
+
/// <reference types="node" />
|
2
3
|
import * as dntShim from "../_dnt.shims.js";
|
3
4
|
import type { DocumentLoader } from "../runtime/docloader.js";
|
4
|
-
import type {
|
5
|
+
import type { Recipient } from "../vocab/actor.js";
|
5
6
|
import type { Activity } from "../vocab/mod.js";
|
6
7
|
/**
|
7
8
|
* Parameters for {@link extractInboxes}.
|
@@ -10,7 +11,7 @@ export interface ExtractInboxesParameters {
|
|
10
11
|
/**
|
11
12
|
* Actors to extract the inboxes from.
|
12
13
|
*/
|
13
|
-
recipients:
|
14
|
+
recipients: Recipient[];
|
14
15
|
/**
|
15
16
|
* Whether to prefer the shared inbox over the personal inbox.
|
16
17
|
* Defaults to `false`.
|
@@ -21,9 +22,9 @@ export interface ExtractInboxesParameters {
|
|
21
22
|
* Extracts the inbox URLs from recipients.
|
22
23
|
* @param parameters The parameters to extract the inboxes.
|
23
24
|
* See also {@link ExtractInboxesParameters}.
|
24
|
-
* @returns The inbox
|
25
|
+
* @returns The inboxes as a map of inbox URL to actor URIs.
|
25
26
|
*/
|
26
|
-
export declare function extractInboxes({ recipients, preferSharedInbox }: ExtractInboxesParameters): Set<
|
27
|
+
export declare function extractInboxes({ recipients, preferSharedInbox }: ExtractInboxesParameters): Record<string, Set<string>>;
|
27
28
|
/**
|
28
29
|
* Parameters for {@link sendActivity}.
|
29
30
|
*/
|
@@ -48,6 +49,10 @@ export interface SendActivityParameters {
|
|
48
49
|
* The document loader to use for JSON-LD context retrieval.
|
49
50
|
*/
|
50
51
|
documentLoader?: DocumentLoader;
|
52
|
+
/**
|
53
|
+
* Additional headers to include in the request.
|
54
|
+
*/
|
55
|
+
headers?: Headers;
|
51
56
|
}
|
52
57
|
/**
|
53
58
|
* Sends an {@link Activity} to an inbox.
|
@@ -56,5 +61,5 @@ export interface SendActivityParameters {
|
|
56
61
|
* See also {@link SendActivityParameters}.
|
57
62
|
* @throws {Error} If the activity fails to send.
|
58
63
|
*/
|
59
|
-
export declare function sendActivity({ activity, privateKey, keyId, inbox, documentLoader, }: SendActivityParameters): Promise<void>;
|
64
|
+
export declare function sendActivity({ activity, privateKey, keyId, inbox, documentLoader, headers, }: SendActivityParameters): Promise<void>;
|
60
65
|
//# sourceMappingURL=send.d.ts.map
|
@@ -1 +1 @@
|
|
1
|
-
{"version":3,"file":"send.d.ts","sourceRoot":"","sources":["../../src/federation/send.ts"],"names":[],"mappings":"
|
1
|
+
{"version":3,"file":"send.d.ts","sourceRoot":"","sources":["../../src/federation/send.ts"],"names":[],"mappings":";;AAAA,OAAO,KAAK,OAAO,MAAM,kBAAkB,CAAC;AAG5C,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,yBAAyB,CAAC;AAC9D,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,mBAAmB,CAAC;AACnD,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,iBAAiB,CAAC;AAEhD;;GAEG;AACH,MAAM,WAAW,wBAAwB;IACvC;;OAEG;IACH,UAAU,EAAE,SAAS,EAAE,CAAC;IAExB;;;OAGG;IACH,iBAAiB,CAAC,EAAE,OAAO,CAAC;CAC7B;AAED;;;;;GAKG;AACH,wBAAgB,cAAc,CAC5B,EAAE,UAAU,EAAE,iBAAiB,EAAE,EAAE,wBAAwB,GAC1D,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,MAAM,CAAC,CAAC,CAY7B;AAED;;GAEG;AACH,MAAM,WAAW,sBAAsB;IACrC;;OAEG;IACH,QAAQ,EAAE,QAAQ,CAAC;IAEnB;;OAEG;IACH,UAAU,EAAE,OAAO,CAAC,SAAS,CAAC;IAE9B;;OAEG;IACH,KAAK,EAAE,GAAG,CAAC;IAEX;;OAEG;IACH,KAAK,EAAE,GAAG,CAAC;IAEX;;OAEG;IACH,cAAc,CAAC,EAAE,cAAc,CAAC;IAEhC;;OAEG;IACH,OAAO,CAAC,EAAE,OAAO,CAAC;CACnB;AAED;;;;;;GAMG;AACH,wBAAsB,YAAY,CAChC,EACE,QAAQ,EACR,UAAU,EACV,KAAK,EACL,KAAK,EACL,cAAc,EACd,OAAO,GACR,EAAE,sBAAsB,GACxB,OAAO,CAAC,IAAI,CAAC,CAmCf"}
|
package/types/httpsig/mod.d.ts
CHANGED
@@ -51,7 +51,7 @@ export declare function doesActorOwnKey(activity: Activity, key: CryptographicKe
|
|
51
51
|
* @param keyId The ID of the key to check, or the key itself.
|
52
52
|
* @param documentLoader The document loader to use for fetching the key and its owner.
|
53
53
|
* @returns The actor that owns the key, or `null` if the key has no known owner.
|
54
|
-
* @
|
54
|
+
* @since 0.7.0
|
55
55
|
*/
|
56
56
|
export declare function getKeyOwner(keyId: URL | CryptographicKey, documentLoader: DocumentLoader): Promise<Actor | null>;
|
57
57
|
//# sourceMappingURL=mod.d.ts.map
|
package/types/mod.d.ts
CHANGED
@@ -28,8 +28,9 @@
|
|
28
28
|
* following resources:
|
29
29
|
*
|
30
30
|
* - [GitHub](https://github.com/dahlia/fedify)
|
31
|
-
* -
|
32
|
-
*
|
31
|
+
* - [Tutorial](https://fedify.dev/tutorial)
|
32
|
+
* - [Manual](https://fedify.dev/manual)
|
33
|
+
* ([Unstable](https://unstable.fedify.dev/manual))
|
33
34
|
* - [Examples](https://github.com/dahlia/fedify/tree/main/examples)
|
34
35
|
*
|
35
36
|
* [ActivityPub]: https://www.w3.org/TR/activitypub/
|
package/types/mod.d.ts.map
CHANGED
@@ -1 +1 @@
|
|
1
|
-
{"version":3,"file":"mod.d.ts","sourceRoot":"","sources":["../src/mod.ts"],"names":[],"mappings":"AAAA
|
1
|
+
{"version":3,"file":"mod.d.ts","sourceRoot":"","sources":["../src/mod.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA2CG;AACH,cAAc,qBAAqB,CAAC;AACpC,cAAc,kBAAkB,CAAC;AACjC,cAAc,mBAAmB,CAAC;AAClC,cAAc,kBAAkB,CAAC;AACjC,cAAc,gBAAgB,CAAC;AAC/B,OAAO,EAAE,eAAe,EAAE,KAAK,kBAAkB,EAAE,MAAM,oBAAoB,CAAC"}
|
@@ -1 +1 @@
|
|
1
|
-
{"version":3,"file":"context.d.ts","sourceRoot":"","sources":["../../src/testing/context.ts"],"names":[],"mappings":";AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,cAAc,EAAE,MAAM,0BAA0B,CAAC;AAIxE,wBAAgB,aAAa,CAAC,YAAY,EACxC,EACE,IAAI,EACJ,cAAc,EACd,cAAc,EACd,WAAW,EACX,YAAY,EACZ,YAAY,EACZ,WAAW,EACX,eAAe,EACf,eAAe,EACf,qBAAqB,EACrB,WAAW,EACX,iBAAiB,EACjB,YAAY,GACb,EAAE,OAAO,CAAC,OAAO,CAAC,YAAY,CAAC,CAAC,GAAG;IAAE,IAAI,EAAE,YAAY,CAAA;CAAE,GACzD,OAAO,CAAC,YAAY,CAAC,CA2BvB;AAED,wBAAgB,oBAAoB,CAAC,YAAY,EAC/C,IAAI,EAAE,OAAO,CAAC,cAAc,CAAC,YAAY,CAAC,CAAC,GAAG;IAC5C,GAAG,EAAE,GAAG,CAAC;IACT,IAAI,EAAE,YAAY,CAAC;CACpB,GACA,cAAc,CAAC,YAAY,CAAC,
|
1
|
+
{"version":3,"file":"context.d.ts","sourceRoot":"","sources":["../../src/testing/context.ts"],"names":[],"mappings":";AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,cAAc,EAAE,MAAM,0BAA0B,CAAC;AAIxE,wBAAgB,aAAa,CAAC,YAAY,EACxC,EACE,IAAI,EACJ,cAAc,EACd,cAAc,EACd,WAAW,EACX,YAAY,EACZ,YAAY,EACZ,WAAW,EACX,eAAe,EACf,eAAe,EACf,qBAAqB,EACrB,WAAW,EACX,iBAAiB,EACjB,YAAY,GACb,EAAE,OAAO,CAAC,OAAO,CAAC,YAAY,CAAC,CAAC,GAAG;IAAE,IAAI,EAAE,YAAY,CAAA;CAAE,GACzD,OAAO,CAAC,YAAY,CAAC,CA2BvB;AAED,wBAAgB,oBAAoB,CAAC,YAAY,EAC/C,IAAI,EAAE,OAAO,CAAC,cAAc,CAAC,YAAY,CAAC,CAAC,GAAG;IAC5C,GAAG,EAAE,GAAG,CAAC;IACT,IAAI,EAAE,YAAY,CAAC;CACpB,GACA,cAAc,CAAC,YAAY,CAAC,CAa9B"}
|
package/types/vocab/actor.d.ts
CHANGED
@@ -50,4 +50,28 @@ export declare function getActorClassByTypeName(typeName: ActorTypeName): typeof
|
|
50
50
|
* @since 0.4.0
|
51
51
|
*/
|
52
52
|
export declare function getActorHandle(actor: Actor | URL): Promise<`@${string}@${string}`>;
|
53
|
+
/**
|
54
|
+
* The object that can be a recipient of an activity.
|
55
|
+
*
|
56
|
+
* Note that every {@link Actor} is also a {@link Recipient}.
|
57
|
+
*/
|
58
|
+
export interface Recipient {
|
59
|
+
/**
|
60
|
+
* The URI of the actor.
|
61
|
+
*/
|
62
|
+
readonly id: URL | null;
|
63
|
+
/**
|
64
|
+
* The URI of the actor's inbox.
|
65
|
+
*/
|
66
|
+
readonly inboxId: URL | null;
|
67
|
+
/**
|
68
|
+
* The endpoints of the actor.
|
69
|
+
*/
|
70
|
+
readonly endpoints?: {
|
71
|
+
/**
|
72
|
+
* The URI of the actor's shared inbox.
|
73
|
+
*/
|
74
|
+
sharedInbox: URL | null;
|
75
|
+
} | null;
|
76
|
+
}
|
53
77
|
//# sourceMappingURL=actor.d.ts.map
|
@@ -1 +1 @@
|
|
1
|
-
{"version":3,"file":"actor.d.ts","sourceRoot":"","sources":["../../src/vocab/actor.ts"],"names":[],"mappings":";AACA,OAAO,EAAE,WAAW,EAAE,KAAK,EAAE,YAAY,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,YAAY,CAAC;AAE/E;;;GAGG;AACH,MAAM,MAAM,KAAK,GAAG,WAAW,GAAG,KAAK,GAAG,YAAY,GAAG,MAAM,GAAG,OAAO,CAAC;AAE1E;;;;GAIG;AACH,wBAAgB,OAAO,CAAC,MAAM,EAAE,OAAO,GAAG,MAAM,IAAI,KAAK,CAQxD;AAED;;GAEG;AACH,MAAM,MAAM,aAAa,GACrB,aAAa,GACb,OAAO,GACP,cAAc,GACd,QAAQ,GACR,SAAS,CAAC;AAEd;;;;GAIG;AACH,wBAAgB,gBAAgB,CAC9B,KAAK,EAAE,KAAK,GACX,aAAa,CAOf;AAED;;;;GAIG;AACH,wBAAgB,uBAAuB,CACrC,QAAQ,EAAE,aAAa,GAErB,OAAO,WAAW,GAClB,OAAO,KAAK,GACZ,OAAO,YAAY,GACnB,OAAO,MAAM,GACb,OAAO,OAAO,CAcjB;AAED;;;;;;;;;;;;;;;;;;;;;GAqBG;AACH,wBAAsB,cAAc,CAClC,KAAK,EAAE,KAAK,GAAG,GAAG,GACjB,OAAO,CAAC,IAAI,MAAM,IAAI,MAAM,EAAE,CAAC,CAsBjC"}
|
1
|
+
{"version":3,"file":"actor.d.ts","sourceRoot":"","sources":["../../src/vocab/actor.ts"],"names":[],"mappings":";AACA,OAAO,EAAE,WAAW,EAAE,KAAK,EAAE,YAAY,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,YAAY,CAAC;AAE/E;;;GAGG;AACH,MAAM,MAAM,KAAK,GAAG,WAAW,GAAG,KAAK,GAAG,YAAY,GAAG,MAAM,GAAG,OAAO,CAAC;AAE1E;;;;GAIG;AACH,wBAAgB,OAAO,CAAC,MAAM,EAAE,OAAO,GAAG,MAAM,IAAI,KAAK,CAQxD;AAED;;GAEG;AACH,MAAM,MAAM,aAAa,GACrB,aAAa,GACb,OAAO,GACP,cAAc,GACd,QAAQ,GACR,SAAS,CAAC;AAEd;;;;GAIG;AACH,wBAAgB,gBAAgB,CAC9B,KAAK,EAAE,KAAK,GACX,aAAa,CAOf;AAED;;;;GAIG;AACH,wBAAgB,uBAAuB,CACrC,QAAQ,EAAE,aAAa,GAErB,OAAO,WAAW,GAClB,OAAO,KAAK,GACZ,OAAO,YAAY,GACnB,OAAO,MAAM,GACb,OAAO,OAAO,CAcjB;AAED;;;;;;;;;;;;;;;;;;;;;GAqBG;AACH,wBAAsB,cAAc,CAClC,KAAK,EAAE,KAAK,GAAG,GAAG,GACjB,OAAO,CAAC,IAAI,MAAM,IAAI,MAAM,EAAE,CAAC,CAsBjC;AAED;;;;GAIG;AACH,MAAM,WAAW,SAAS;IACxB;;OAEG;IACH,QAAQ,CAAC,EAAE,EAAE,GAAG,GAAG,IAAI,CAAC;IAExB;;OAEG;IACH,QAAQ,CAAC,OAAO,EAAE,GAAG,GAAG,IAAI,CAAC;IAE7B;;OAEG;IACH,QAAQ,CAAC,SAAS,CAAC,EAAE;QACnB;;WAEG;QACH,WAAW,EAAE,GAAG,GAAG,IAAI,CAAC;KACzB,GAAG,IAAI,CAAC;CACV"}
|