@geekity/cms 0.6.0 → 0.8.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +207 -28
- package/admin/layouts/shell.njk +13 -6
- package/admin/pages/documents/editor.njk +13 -1
- package/admin/pages/error.njk +11 -0
- package/admin/static/admin.css +69 -15
- package/dist/admin/comments.d.ts.map +1 -1
- package/dist/admin/comments.js +2 -1
- package/dist/admin/comments.js.map +1 -1
- package/dist/admin/documents.d.ts +3 -0
- package/dist/admin/documents.d.ts.map +1 -1
- package/dist/admin/documents.js +109 -42
- package/dist/admin/documents.js.map +1 -1
- package/dist/admin/federation.d.ts.map +1 -1
- package/dist/admin/federation.js +3 -2
- package/dist/admin/federation.js.map +1 -1
- package/dist/admin/preview.js +3 -0
- package/dist/admin/preview.js.map +1 -1
- package/dist/admin/routes.d.ts.map +1 -1
- package/dist/admin/routes.js +7 -3
- package/dist/admin/routes.js.map +1 -1
- package/dist/admin/templates.d.ts +1 -0
- package/dist/admin/templates.d.ts.map +1 -1
- package/dist/admin/templates.js +1 -0
- package/dist/admin/templates.js.map +1 -1
- package/dist/cli.d.ts +1 -1
- package/dist/cli.d.ts.map +1 -1
- package/dist/cli.js +128 -3
- package/dist/cli.js.map +1 -1
- package/dist/comments/submission.d.ts.map +1 -1
- package/dist/comments/submission.js +2 -1
- package/dist/comments/submission.js.map +1 -1
- package/dist/config.d.ts +23 -0
- package/dist/config.d.ts.map +1 -1
- package/dist/config.js +3 -0
- package/dist/config.js.map +1 -1
- package/dist/content/document.d.ts +26 -7
- package/dist/content/document.d.ts.map +1 -1
- package/dist/content/document.js +2 -0
- package/dist/content/document.js.map +1 -1
- package/dist/content/index.d.ts +2 -0
- package/dist/content/index.d.ts.map +1 -1
- package/dist/content/index.js +1 -0
- package/dist/content/index.js.map +1 -1
- package/dist/content/parser.d.ts.map +1 -1
- package/dist/content/parser.js +32 -1
- package/dist/content/parser.js.map +1 -1
- package/dist/content/post-type.d.ts +48 -0
- package/dist/content/post-type.d.ts.map +1 -0
- package/dist/content/post-type.js +79 -0
- package/dist/content/post-type.js.map +1 -0
- package/dist/content/store.d.ts +13 -2
- package/dist/content/store.d.ts.map +1 -1
- package/dist/content/store.js +62 -3
- package/dist/content/store.js.map +1 -1
- package/dist/content/sync.d.ts.map +1 -1
- package/dist/content/sync.js +6 -0
- package/dist/content/sync.js.map +1 -1
- package/dist/content/writer.d.ts +1 -1
- package/dist/content/writer.d.ts.map +1 -1
- package/dist/content/writer.js +13 -2
- package/dist/content/writer.js.map +1 -1
- package/dist/env.d.ts +12 -0
- package/dist/env.d.ts.map +1 -1
- package/dist/federation/article.d.ts +27 -9
- package/dist/federation/article.d.ts.map +1 -1
- package/dist/federation/article.js +110 -18
- package/dist/federation/article.js.map +1 -1
- package/dist/federation/federation.d.ts.map +1 -1
- package/dist/federation/federation.js +24 -6
- package/dist/federation/federation.js.map +1 -1
- package/dist/federation/inbox.d.ts +17 -3
- package/dist/federation/inbox.d.ts.map +1 -1
- package/dist/federation/inbox.js +72 -6
- package/dist/federation/inbox.js.map +1 -1
- package/dist/federation/index.d.ts +1 -1
- package/dist/federation/index.d.ts.map +1 -1
- package/dist/federation/index.js +1 -1
- package/dist/federation/index.js.map +1 -1
- package/dist/federation/mount.d.ts.map +1 -1
- package/dist/federation/mount.js +11 -6
- package/dist/federation/mount.js.map +1 -1
- package/dist/federation/paths.d.ts +5 -0
- package/dist/federation/paths.d.ts.map +1 -1
- package/dist/federation/paths.js +5 -0
- package/dist/federation/paths.js.map +1 -1
- package/dist/federation/quotes.d.ts +56 -0
- package/dist/federation/quotes.d.ts.map +1 -0
- package/dist/federation/quotes.js +85 -0
- package/dist/federation/quotes.js.map +1 -0
- package/dist/federation/wordpress.d.ts.map +1 -1
- package/dist/federation/wordpress.js +5 -4
- package/dist/federation/wordpress.js.map +1 -1
- package/dist/index.d.ts +12 -5
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +46 -4
- package/dist/index.js.map +1 -1
- package/dist/maintenance.d.ts +47 -0
- package/dist/maintenance.d.ts.map +1 -0
- package/dist/maintenance.js +78 -0
- package/dist/maintenance.js.map +1 -0
- package/dist/notifications/comments.d.ts.map +1 -1
- package/dist/notifications/comments.js +2 -1
- package/dist/notifications/comments.js.map +1 -1
- package/dist/notifications/digest.d.ts.map +1 -1
- package/dist/notifications/digest.js +2 -1
- package/dist/notifications/digest.js.map +1 -1
- package/dist/web/archive.d.ts +1 -1
- package/dist/web/archive.d.ts.map +1 -1
- package/dist/web/archive.js +2 -1
- package/dist/web/archive.js.map +1 -1
- package/dist/web/context.d.ts +22 -2
- package/dist/web/context.d.ts.map +1 -1
- package/dist/web/context.js +5 -0
- package/dist/web/context.js.map +1 -1
- package/dist/web/conversation.d.ts.map +1 -1
- package/dist/web/conversation.js +3 -33
- package/dist/web/conversation.js.map +1 -1
- package/dist/web/documents.d.ts +9 -0
- package/dist/web/documents.d.ts.map +1 -1
- package/dist/web/documents.js +31 -0
- package/dist/web/documents.js.map +1 -1
- package/dist/web/errors.d.ts +19 -0
- package/dist/web/errors.d.ts.map +1 -0
- package/dist/web/errors.js +93 -0
- package/dist/web/errors.js.map +1 -0
- package/dist/web/feed-atom.d.ts.map +1 -1
- package/dist/web/feed-atom.js +14 -2
- package/dist/web/feed-atom.js.map +1 -1
- package/dist/web/feed-item.d.ts +21 -7
- package/dist/web/feed-item.d.ts.map +1 -1
- package/dist/web/feed-item.js +13 -6
- package/dist/web/feed-item.js.map +1 -1
- package/dist/web/feed-json.d.ts +13 -2
- package/dist/web/feed-json.d.ts.map +1 -1
- package/dist/web/feed-json.js +3 -1
- package/dist/web/feed-json.js.map +1 -1
- package/dist/web/feed-rss.d.ts.map +1 -1
- package/dist/web/feed-rss.js +2 -2
- package/dist/web/feed-rss.js.map +1 -1
- package/dist/web/feed-xml.d.ts +2 -0
- package/dist/web/feed-xml.d.ts.map +1 -1
- package/dist/web/feed-xml.js +2 -0
- package/dist/web/feed-xml.js.map +1 -1
- package/dist/web/feeds.d.ts +1 -1
- package/dist/web/feeds.d.ts.map +1 -1
- package/dist/web/feeds.js.map +1 -1
- package/dist/web/health.d.ts +6 -0
- package/dist/web/health.d.ts.map +1 -1
- package/dist/web/health.js +5 -1
- package/dist/web/health.js.map +1 -1
- package/dist/web/index.d.ts +5 -1
- package/dist/web/index.d.ts.map +1 -1
- package/dist/web/index.js +3 -0
- package/dist/web/index.js.map +1 -1
- package/dist/web/maintenance.d.ts +18 -0
- package/dist/web/maintenance.d.ts.map +1 -0
- package/dist/web/maintenance.js +108 -0
- package/dist/web/maintenance.js.map +1 -0
- package/dist/web/redirects.d.ts +75 -0
- package/dist/web/redirects.d.ts.map +1 -0
- package/dist/web/redirects.js +200 -0
- package/dist/web/redirects.js.map +1 -0
- package/dist/web/render.d.ts +18 -0
- package/dist/web/render.d.ts.map +1 -1
- package/dist/web/render.js +38 -1
- package/dist/web/render.js.map +1 -1
- package/dist/web/routes.d.ts.map +1 -1
- package/dist/web/routes.js +55 -1
- package/dist/web/routes.js.map +1 -1
- package/dist/webmention/index.d.ts +6 -0
- package/dist/webmention/index.d.ts.map +1 -1
- package/dist/webmention/index.js +3 -0
- package/dist/webmention/index.js.map +1 -1
- package/dist/webmention/links.d.ts +5 -0
- package/dist/webmention/links.d.ts.map +1 -1
- package/dist/webmention/links.js +14 -7
- package/dist/webmention/links.js.map +1 -1
- package/dist/webmention/microformats.d.ts +21 -0
- package/dist/webmention/microformats.d.ts.map +1 -1
- package/dist/webmention/microformats.js +35 -5
- package/dist/webmention/microformats.js.map +1 -1
- package/dist/webmention/public-address.d.ts +30 -0
- package/dist/webmention/public-address.d.ts.map +1 -0
- package/dist/webmention/public-address.js +71 -0
- package/dist/webmention/public-address.js.map +1 -0
- package/dist/webmention/receive.d.ts.map +1 -1
- package/dist/webmention/receive.js +1 -23
- package/dist/webmention/receive.js.map +1 -1
- package/dist/webmention/reply-context.d.ts +67 -0
- package/dist/webmention/reply-context.d.ts.map +1 -0
- package/dist/webmention/reply-context.js +189 -0
- package/dist/webmention/reply-context.js.map +1 -0
- package/dist/webmention/reply-contexts.d.ts +50 -0
- package/dist/webmention/reply-contexts.d.ts.map +1 -0
- package/dist/webmention/reply-contexts.js +163 -0
- package/dist/webmention/reply-contexts.js.map +1 -0
- package/dist/webmention/service.d.ts.map +1 -1
- package/dist/webmention/service.js +9 -2
- package/dist/webmention/service.js.map +1 -1
- package/package.json +10 -10
- package/themes/default/README.md +20 -0
- package/themes/default/layouts/500.njk +8 -0
- package/themes/default/layouts/503.njk +8 -0
- package/themes/default/layouts/base.njk +5 -3
- package/themes/default/layouts/post.njk +8 -0
- package/themes/default/layouts/search.njk +4 -2
- package/themes/default/partials/post-list.njk +17 -5
- package/themes/default/partials/reply-context.njk +29 -0
|
@@ -1,9 +1,12 @@
|
|
|
1
|
-
import { Article, Create, Delete, Hashtag, PUBLIC_COLLECTION, Source, Tombstone, Update, } from '@fedify/vocab';
|
|
1
|
+
import { Article, Create, Delete, Hashtag, InteractionPolicy, InteractionRule, Note, PUBLIC_COLLECTION, Source, Tombstone, Update, } from '@fedify/vocab';
|
|
2
2
|
import { Temporal as TemporalPolyfill } from '@js-temporal/polyfill';
|
|
3
3
|
import { listUsers, primaryUser } from '../admin/accounts.js';
|
|
4
4
|
import { readSiteSettings, taxonomyBasesFromSettings } from '../admin/settings.js';
|
|
5
|
+
import { postTypeOf, replyTarget } from '../content/post-type.js';
|
|
6
|
+
import { htmlToText } from '../content/search.js';
|
|
5
7
|
import { userForAuthor } from '../web/authors.js';
|
|
6
|
-
import { isPublicDocument, postObjectId } from '../web/documents.js';
|
|
8
|
+
import { isPublicDocument, permalinkOfObjectId, postObjectId } from '../web/documents.js';
|
|
9
|
+
import { feedExcerpt } from '../web/feed-item.js';
|
|
7
10
|
import { absoluteUrl } from '../web/negotiate.js';
|
|
8
11
|
import { categoryHref, tagHref } from '../web/taxonomy.js';
|
|
9
12
|
import { actorId } from './actor.js';
|
|
@@ -58,7 +61,55 @@ export function isFederatedDocument(document, now = new Date()) {
|
|
|
58
61
|
return document.type === 'post' && isPublicDocument(document, now);
|
|
59
62
|
}
|
|
60
63
|
/**
|
|
61
|
-
*
|
|
64
|
+
* The post an ActivityStreams object id names, federated or not.
|
|
65
|
+
*
|
|
66
|
+
* Either the post whose file stores that id, or the one at the permalink the
|
|
67
|
+
* id spells — and then only when that post's id really is this URL, so a
|
|
68
|
+
* migrated post is not found a second time under its permalink.
|
|
69
|
+
*/
|
|
70
|
+
export function postByObjectId(store, objectId, baseUrl) {
|
|
71
|
+
const permalink = permalinkOfObjectId(objectId, baseUrl);
|
|
72
|
+
const document = store.getByStoredObjectId(objectId) ??
|
|
73
|
+
(permalink === undefined ? undefined : store.getByPermalink(permalink));
|
|
74
|
+
if (document?.type !== 'post' || postObjectId(document, baseUrl) !== objectId)
|
|
75
|
+
return undefined;
|
|
76
|
+
return document;
|
|
77
|
+
}
|
|
78
|
+
/** The ActivityStreams object types a post can federate as, by name. */
|
|
79
|
+
const OBJECT_TYPES = { Note, Article };
|
|
80
|
+
/**
|
|
81
|
+
* The object type each discovered post type federates as: the rows of Post
|
|
82
|
+
* Type Discovery's own AS2 mapping (section 6) that this site has post types
|
|
83
|
+
* for. A reply is a `Note` even with a title of its own (decision-18).
|
|
84
|
+
*/
|
|
85
|
+
const OBJECT_TYPE_OF = {
|
|
86
|
+
reply: 'Note',
|
|
87
|
+
note: 'Note',
|
|
88
|
+
article: 'Article',
|
|
89
|
+
};
|
|
90
|
+
function isPostObjectType(value) {
|
|
91
|
+
return Object.hasOwn(OBJECT_TYPES, value);
|
|
92
|
+
}
|
|
93
|
+
/**
|
|
94
|
+
* The ActivityStreams type a post federates as: the one its front matter
|
|
95
|
+
* names in `activitypub.type`, else the one its discovered post type maps to.
|
|
96
|
+
*
|
|
97
|
+
* A name this site cannot send is logged and ignored rather than refused, as
|
|
98
|
+
* an unusable theme choice is: a typo in one file should not stop the post
|
|
99
|
+
* reaching anybody.
|
|
100
|
+
*/
|
|
101
|
+
function postObjectType(document) {
|
|
102
|
+
const derived = OBJECT_TYPE_OF[postTypeOf(document)];
|
|
103
|
+
const chosen = document.activitypub?.type;
|
|
104
|
+
if (chosen === undefined || isPostObjectType(chosen))
|
|
105
|
+
return chosen ?? derived;
|
|
106
|
+
console.warn(`${document.path} names activitypub.type "${chosen}", which is not one of ` +
|
|
107
|
+
`${Object.keys(OBJECT_TYPES).join(', ')}. It is federated as ${derived} instead.`);
|
|
108
|
+
return derived;
|
|
109
|
+
}
|
|
110
|
+
/**
|
|
111
|
+
* One post as the `Note` or `Article` doc-4 describes, whichever
|
|
112
|
+
* {@link postObjectType} says it is.
|
|
62
113
|
*
|
|
63
114
|
* Its `id` and its `url` are the same URL — the permalink — because
|
|
64
115
|
* decision-13 gives a post one name for both audiences: a browser asking for
|
|
@@ -66,6 +117,14 @@ export function isFederatedDocument(document, now = new Date()) {
|
|
|
66
117
|
* exception is a post whose file already names an `activitypub.id`, which
|
|
67
118
|
* keeps it; see {@link articleObjectId}.
|
|
68
119
|
*
|
|
120
|
+
* The two types are not one object with two labels, because Mastodon reads
|
|
121
|
+
* them differently. An `Article`'s status is built from `name`, `summary` and
|
|
122
|
+
* `url`, and `content` is dropped, so it carries the excerpt the feeds print
|
|
123
|
+
* ({@link feedExcerpt}) as its `summary`. A `Note`'s status is its `content`,
|
|
124
|
+
* `name` is never read and `summary` is shown as a content warning, so a note
|
|
125
|
+
* sends neither and carries its title, when its text does not already start
|
|
126
|
+
* with it, at the top of its `content`.
|
|
127
|
+
*
|
|
69
128
|
* `source` carries the Markdown the file holds, so a peer that wants to quote
|
|
70
129
|
* or re-render the post has the text rather than only the rendering of it.
|
|
71
130
|
*
|
|
@@ -73,17 +132,18 @@ export function isFederatedDocument(document, now = new Date()) {
|
|
|
73
132
|
* (decision-14), and `cc` is that user's followers: a post belongs to a person
|
|
74
133
|
* on this site, not to the site.
|
|
75
134
|
*/
|
|
76
|
-
export function
|
|
135
|
+
export function postObject(context, document) {
|
|
77
136
|
const { baseUrl } = context.data.config;
|
|
78
137
|
const { actor, followers } = attribution(context, document);
|
|
79
138
|
// The archives an activity points at are wherever the site currently serves
|
|
80
139
|
// them, which is a setting rather than a constant (TASK-36).
|
|
81
140
|
const bases = taxonomyBasesFromSettings(readSiteSettings(context.data.config.contentDir));
|
|
82
|
-
|
|
141
|
+
const inReplyTo = replyTarget(document);
|
|
142
|
+
const common = {
|
|
83
143
|
id: articleObjectId(context, document),
|
|
144
|
+
// On either type, so an activitypub.type override never breaks a thread.
|
|
145
|
+
replyTarget: inReplyTo === undefined ? null : new URL(inReplyTo),
|
|
84
146
|
url: new URL(absoluteUrl(document.permalink, baseUrl)),
|
|
85
|
-
name: document.title,
|
|
86
|
-
content: document.html,
|
|
87
147
|
source: new Source({ content: document.body, mediaType: SOURCE_MEDIA_TYPE }),
|
|
88
148
|
published: toInstant(document.date) ?? null,
|
|
89
149
|
updated: toInstant(document.updated) ?? null,
|
|
@@ -92,6 +152,10 @@ export function postArticle(context, document) {
|
|
|
92
152
|
// follower of its author is told about it.
|
|
93
153
|
to: PUBLIC_COLLECTION,
|
|
94
154
|
cc: followers,
|
|
155
|
+
// FEP-044f: a post with no policy is one Mastodon lets nobody quote. Every
|
|
156
|
+
// post that federates is addressed to Public, so anybody may quote it, and
|
|
157
|
+
// the inbox approves each QuoteRequest on the same rule (TASK-125).
|
|
158
|
+
interactionPolicy: QUOTABLE_BY_ANYONE,
|
|
95
159
|
// Both taxonomies become hashtags: a relay or a search that keys on a
|
|
96
160
|
// hashtag has no reason to care which of the two a term came from, and
|
|
97
161
|
// each one points at the archive the site serves for it.
|
|
@@ -99,8 +163,36 @@ export function postArticle(context, document) {
|
|
|
99
163
|
...document.tags.map((tag) => hashtag(tag, tagHref(tag, 0, bases), baseUrl)),
|
|
100
164
|
...document.categories.map((category) => hashtag(category, categoryHref(category, 0, bases), baseUrl)),
|
|
101
165
|
],
|
|
166
|
+
};
|
|
167
|
+
if (postObjectType(document) === 'Note') {
|
|
168
|
+
return new Note({ ...common, content: noteContent(document) });
|
|
169
|
+
}
|
|
170
|
+
const summary = feedExcerpt(document);
|
|
171
|
+
return new Article({
|
|
172
|
+
...common,
|
|
173
|
+
name: document.title === '' ? null : document.title,
|
|
174
|
+
summary: summary === '' ? null : summary,
|
|
175
|
+
content: document.html,
|
|
102
176
|
});
|
|
103
177
|
}
|
|
178
|
+
const QUOTABLE_BY_ANYONE = new InteractionPolicy({
|
|
179
|
+
canQuote: new InteractionRule({ automaticApproval: PUBLIC_COLLECTION }),
|
|
180
|
+
});
|
|
181
|
+
/** A note's HTML: its title first when its text does not already open with it. */
|
|
182
|
+
function noteContent(document) {
|
|
183
|
+
const title = document.title.trim();
|
|
184
|
+
if (title === '' || collapse(htmlToText(document.html)).startsWith(collapse(title))) {
|
|
185
|
+
return document.html;
|
|
186
|
+
}
|
|
187
|
+
const heading = `<p>${escapeHtml(title)}</p>`;
|
|
188
|
+
return document.html === '' ? heading : `${heading}\n${document.html}`;
|
|
189
|
+
}
|
|
190
|
+
function collapse(value) {
|
|
191
|
+
return value.trim().replace(/\s+/g, ' ');
|
|
192
|
+
}
|
|
193
|
+
function escapeHtml(value) {
|
|
194
|
+
return value.replaceAll('&', '&').replaceAll('<', '<').replaceAll('>', '>');
|
|
195
|
+
}
|
|
104
196
|
/** One taxonomy term as a `Hashtag` pointing at its archive. */
|
|
105
197
|
function hashtag(term, href, baseUrl) {
|
|
106
198
|
return new Hashtag({ name: `#${term}`, href: new URL(absoluteUrl(href, baseUrl)) });
|
|
@@ -109,17 +201,17 @@ function hashtag(term, href, baseUrl) {
|
|
|
109
201
|
* The `Create` that announces a post: what the outbox lists, and what delivery
|
|
110
202
|
* sends.
|
|
111
203
|
*
|
|
112
|
-
* Its addressing is the
|
|
204
|
+
* Its addressing is the object's, because an activity a follower cannot see
|
|
113
205
|
* is an object it will never learn about. The id is a fragment of the
|
|
114
|
-
*
|
|
206
|
+
* object's, so the same post always produces the same activity id.
|
|
115
207
|
*/
|
|
116
208
|
export function postCreateActivity(context, document) {
|
|
117
|
-
const
|
|
209
|
+
const object = postObject(context, document);
|
|
118
210
|
const { actor, followers } = attribution(context, document);
|
|
119
211
|
return new Create({
|
|
120
212
|
id: createActivityId(articleObjectId(context, document)),
|
|
121
213
|
actor,
|
|
122
|
-
object
|
|
214
|
+
object,
|
|
123
215
|
published: toInstant(document.date) ?? null,
|
|
124
216
|
to: PUBLIC_COLLECTION,
|
|
125
217
|
cc: followers,
|
|
@@ -128,7 +220,7 @@ export function postCreateActivity(context, document) {
|
|
|
128
220
|
/**
|
|
129
221
|
* The `Update` that announces an edit to a post followers already hold.
|
|
130
222
|
*
|
|
131
|
-
* The whole
|
|
223
|
+
* The whole object goes with it rather than a diff, because that is all
|
|
132
224
|
* ActivityPub offers and all a peer can apply. Its id carries the document's
|
|
133
225
|
* hash, so two edits are two activities and the same edit delivered twice is
|
|
134
226
|
* one; see {@link updateActivityId}.
|
|
@@ -140,25 +232,25 @@ export function postCreateActivity(context, document) {
|
|
|
140
232
|
* which is what makes a resent `Update` and a saved one the same shape.
|
|
141
233
|
*/
|
|
142
234
|
export function postUpdateActivity(context, document, revision = revisionOf(document)) {
|
|
143
|
-
const
|
|
235
|
+
const object = postObject(context, document);
|
|
144
236
|
const { actor, followers } = attribution(context, document);
|
|
145
237
|
return new Update({
|
|
146
238
|
id: updateActivityId(articleObjectId(context, document), revision),
|
|
147
239
|
actor,
|
|
148
|
-
object
|
|
240
|
+
object,
|
|
149
241
|
published: toInstant(document.updated ?? document.date) ?? null,
|
|
150
242
|
to: PUBLIC_COLLECTION,
|
|
151
243
|
cc: followers,
|
|
152
244
|
});
|
|
153
245
|
}
|
|
154
246
|
/**
|
|
155
|
-
* The `Delete` that withdraws a post: a `Tombstone` where
|
|
247
|
+
* The `Delete` that withdraws a post: a `Tombstone` where its object was.
|
|
156
248
|
*
|
|
157
249
|
* doc-4 sends this when a post becomes a draft, is trashed or is deleted, and
|
|
158
250
|
* all three look the same from outside — the object is gone and the copy every
|
|
159
251
|
* follower holds should go with it. The `Tombstone` keeps the object's id and
|
|
160
252
|
* says what it used to be, which is what lets a peer that never held the
|
|
161
|
-
*
|
|
253
|
+
* object recognise what it is being told about.
|
|
162
254
|
*
|
|
163
255
|
* The document is the one as it was before it went, because after a delete
|
|
164
256
|
* there is no other.
|
|
@@ -171,7 +263,7 @@ export function postDeleteActivity(context, document, deleted) {
|
|
|
171
263
|
actor,
|
|
172
264
|
object: new Tombstone({
|
|
173
265
|
id: objectId,
|
|
174
|
-
formerType:
|
|
266
|
+
formerType: OBJECT_TYPES[postObjectType(document)],
|
|
175
267
|
deleted: toInstant(deleted) ?? null,
|
|
176
268
|
}),
|
|
177
269
|
to: PUBLIC_COLLECTION,
|
|
@@ -183,7 +275,7 @@ export function postDeleteActivity(context, document, deleted) {
|
|
|
183
275
|
* or the id its file already names (decision-13).
|
|
184
276
|
*
|
|
185
277
|
* A thin wrapper over {@link postObjectId} so everything in this module reads
|
|
186
|
-
* the id the same way and off the same base URL the
|
|
278
|
+
* the id the same way and off the same base URL the object's `url` is built
|
|
187
279
|
* on. The rule itself lives in `web/documents.ts`, because the page, the feed
|
|
188
280
|
* item and the object are one identity now rather than three.
|
|
189
281
|
*/
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"article.js","sourceRoot":"","sources":["../../src/federation/article.ts"],"names":[],"mappings":"AACA,OAAO,EACL,OAAO,EACP,MAAM,EACN,MAAM,EACN,OAAO,EACP,iBAAiB,EACjB,MAAM,EACN,SAAS,EACT,MAAM,GACP,MAAM,eAAe,CAAC;AACvB,OAAO,EAAE,QAAQ,IAAI,gBAAgB,EAAE,MAAM,uBAAuB,CAAC;AAErE,OAAO,EAAE,SAAS,EAAE,WAAW,EAAE,MAAM,sBAAsB,CAAC;AAE9D,OAAO,EAAE,gBAAgB,EAAE,yBAAyB,EAAE,MAAM,sBAAsB,CAAC;
|
|
1
|
+
{"version":3,"file":"article.js","sourceRoot":"","sources":["../../src/federation/article.ts"],"names":[],"mappings":"AACA,OAAO,EACL,OAAO,EACP,MAAM,EACN,MAAM,EACN,OAAO,EACP,iBAAiB,EACjB,eAAe,EACf,IAAI,EACJ,iBAAiB,EACjB,MAAM,EACN,SAAS,EACT,MAAM,GACP,MAAM,eAAe,CAAC;AACvB,OAAO,EAAE,QAAQ,IAAI,gBAAgB,EAAE,MAAM,uBAAuB,CAAC;AAErE,OAAO,EAAE,SAAS,EAAE,WAAW,EAAE,MAAM,sBAAsB,CAAC;AAE9D,OAAO,EAAE,gBAAgB,EAAE,yBAAyB,EAAE,MAAM,sBAAsB,CAAC;AAGnF,OAAO,EAAE,UAAU,EAAE,WAAW,EAAE,MAAM,yBAAyB,CAAC;AAElE,OAAO,EAAE,UAAU,EAAE,MAAM,sBAAsB,CAAC;AAClD,OAAO,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAC;AAClD,OAAO,EAAE,gBAAgB,EAAE,mBAAmB,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AAC1F,OAAO,EAAE,WAAW,EAAE,MAAM,qBAAqB,CAAC;AAClD,OAAO,EAAE,WAAW,EAAE,MAAM,qBAAqB,CAAC;AAClD,OAAO,EAAE,YAAY,EAAE,OAAO,EAAE,MAAM,oBAAoB,CAAC;AAC3D,OAAO,EAAE,OAAO,EAAE,MAAM,YAAY,CAAC;AAErC,OAAO,EAAE,gBAAgB,EAAE,gBAAgB,EAAE,gBAAgB,EAAE,MAAM,YAAY,CAAC;AAElF;;;;;;;;;;;;;;GAcG;AACH,MAAM,UAAU,cAAc,CAC5B,OAAuC,EACvC,QAAkB;IAElB,MAAM,EAAE,OAAO,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC;IACxC,OAAO,aAAa,CAAC,SAAS,CAAC,OAAO,CAAC,EAAE,QAAQ,CAAC,MAAM,CAAC,IAAI,WAAW,CAAC,OAAO,CAAC,CAAC;AACpF,CAAC;AAED;;;;;;;GAOG;AACH,SAAS,WAAW,CAClB,OAAuC,EACvC,QAAkB;IAElB,MAAM,IAAI,GAAG,cAAc,CAAC,OAAO,EAAE,QAAQ,CAAC,CAAC;IAC/C,IAAI,IAAI,KAAK,SAAS,EAAE,CAAC;QACvB,MAAM,IAAI,KAAK,CACb,aAAa,QAAQ,CAAC,IAAI,mDAAmD;YAC3E,gEAAgE,CACnE,CAAC;IACJ,CAAC;IACD,OAAO,EAAE,KAAK,EAAE,OAAO,CAAC,OAAO,EAAE,IAAI,CAAC,EAAE,SAAS,EAAE,OAAO,CAAC,eAAe,CAAC,IAAI,CAAC,QAAQ,CAAC,EAAE,CAAC;AAC9F,CAAC;AAED,+DAA+D;AAC/D,MAAM,CAAC,MAAM,iBAAiB,GAAG,eAAe,CAAC;AAEjD;;;;;;;;GAQG;AACH,MAAM,UAAU,mBAAmB,CAAC,QAAkB,EAAE,GAAG,GAAS,IAAI,IAAI,EAAE;IAC5E,OAAO,QAAQ,CAAC,IAAI,KAAK,MAAM,IAAI,gBAAgB,CAAC,QAAQ,EAAE,GAAG,CAAC,CAAC;AACrE,CAAC;AAED;;;;;;GAMG;AACH,MAAM,UAAU,cAAc,CAC5B,KAAmB,EACnB,QAAgB,EAChB,OAAe;IAEf,MAAM,SAAS,GAAG,mBAAmB,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;IACzD,MAAM,QAAQ,GACZ,KAAK,CAAC,mBAAmB,CAAC,QAAQ,CAAC;QACnC,CAAC,SAAS,KAAK,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,KAAK,CAAC,cAAc,CAAC,SAAS,CAAC,CAAC,CAAC;IAC1E,IAAI,QAAQ,EAAE,IAAI,KAAK,MAAM,IAAI,YAAY,CAAC,QAAQ,EAAE,OAAO,CAAC,KAAK,QAAQ;QAAE,OAAO,SAAS,CAAC;IAChG,OAAO,QAAQ,CAAC;AAClB,CAAC;AAED,wEAAwE;AACxE,MAAM,YAAY,GAAG,EAAE,IAAI,EAAE,OAAO,EAAW,CAAC;AAKhD;;;;GAIG;AACH,MAAM,cAAc,GAAqC;IACvD,KAAK,EAAE,MAAM;IACb,IAAI,EAAE,MAAM;IACZ,OAAO,EAAE,SAAS;CACnB,CAAC;AAEF,SAAS,gBAAgB,CAAC,KAAa;IACrC,OAAO,MAAM,CAAC,MAAM,CAAC,YAAY,EAAE,KAAK,CAAC,CAAC;AAC5C,CAAC;AAED;;;;;;;GAOG;AACH,SAAS,cAAc,CAAC,QAAkB;IACxC,MAAM,OAAO,GAAG,cAAc,CAAC,UAAU,CAAC,QAAQ,CAAC,CAAC,CAAC;IACrD,MAAM,MAAM,GAAG,QAAQ,CAAC,WAAW,EAAE,IAAI,CAAC;IAC1C,IAAI,MAAM,KAAK,SAAS,IAAI,gBAAgB,CAAC,MAAM,CAAC;QAAE,OAAO,MAAM,IAAI,OAAO,CAAC;IAE/E,OAAO,CAAC,IAAI,CACV,GAAG,QAAQ,CAAC,IAAI,4BAA4B,MAAM,yBAAyB;QACzE,GAAG,MAAM,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,wBAAwB,OAAO,WAAW,CACpF,CAAC;IACF,OAAO,OAAO,CAAC;AACjB,CAAC;AAED;;;;;;;;;;;;;;;;;;;;;;;;GAwBG;AACH,MAAM,UAAU,UAAU,CACxB,OAAuC,EACvC,QAAkB;IAElB,MAAM,EAAE,OAAO,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC;IACxC,MAAM,EAAE,KAAK,EAAE,SAAS,EAAE,GAAG,WAAW,CAAC,OAAO,EAAE,QAAQ,CAAC,CAAC;IAC5D,4EAA4E;IAC5E,6DAA6D;IAC7D,MAAM,KAAK,GAAG,yBAAyB,CAAC,gBAAgB,CAAC,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC,CAAC;IAE1F,MAAM,SAAS,GAAG,WAAW,CAAC,QAAQ,CAAC,CAAC;IACxC,MAAM,MAAM,GAAG;QACb,EAAE,EAAE,eAAe,CAAC,OAAO,EAAE,QAAQ,CAAC;QACtC,yEAAyE;QACzE,WAAW,EAAE,SAAS,KAAK,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,GAAG,CAAC,SAAS,CAAC;QAChE,GAAG,EAAE,IAAI,GAAG,CAAC,WAAW,CAAC,QAAQ,CAAC,SAAS,EAAE,OAAO,CAAC,CAAC;QACtD,MAAM,EAAE,IAAI,MAAM,CAAC,EAAE,OAAO,EAAE,QAAQ,CAAC,IAAI,EAAE,SAAS,EAAE,iBAAiB,EAAE,CAAC;QAC5E,SAAS,EAAE,SAAS,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,IAAI;QAC3C,OAAO,EAAE,SAAS,CAAC,QAAQ,CAAC,OAAO,CAAC,IAAI,IAAI;QAC5C,WAAW,EAAE,KAAK;QAClB,wEAAwE;QACxE,2CAA2C;QAC3C,EAAE,EAAE,iBAAiB;QACrB,EAAE,EAAE,SAAS;QACb,2EAA2E;QAC3E,2EAA2E;QAC3E,oEAAoE;QACpE,iBAAiB,EAAE,kBAAkB;QACrC,sEAAsE;QACtE,uEAAuE;QACvE,yDAAyD;QACzD,IAAI,EAAE;YACJ,GAAG,QAAQ,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,OAAO,CAAC,GAAG,EAAE,OAAO,CAAC,GAAG,EAAE,CAAC,EAAE,KAAK,CAAC,EAAE,OAAO,CAAC,CAAC;YAC5E,GAAG,QAAQ,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,QAAQ,EAAE,EAAE,CACtC,OAAO,CAAC,QAAQ,EAAE,YAAY,CAAC,QAAQ,EAAE,CAAC,EAAE,KAAK,CAAC,EAAE,OAAO,CAAC,CAC7D;SACF;KACF,CAAC;IAEF,IAAI,cAAc,CAAC,QAAQ,CAAC,KAAK,MAAM,EAAE,CAAC;QACxC,OAAO,IAAI,IAAI,CAAC,EAAE,GAAG,MAAM,EAAE,OAAO,EAAE,WAAW,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC;IACjE,CAAC;IAED,MAAM,OAAO,GAAG,WAAW,CAAC,QAAQ,CAAC,CAAC;IACtC,OAAO,IAAI,OAAO,CAAC;QACjB,GAAG,MAAM;QACT,IAAI,EAAE,QAAQ,CAAC,KAAK,KAAK,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,QAAQ,CAAC,KAAK;QACnD,OAAO,EAAE,OAAO,KAAK,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,OAAO;QACxC,OAAO,EAAE,QAAQ,CAAC,IAAI;KACvB,CAAC,CAAC;AACL,CAAC;AAED,MAAM,kBAAkB,GAAG,IAAI,iBAAiB,CAAC;IAC/C,QAAQ,EAAE,IAAI,eAAe,CAAC,EAAE,iBAAiB,EAAE,iBAAiB,EAAE,CAAC;CACxE,CAAC,CAAC;AAEH,kFAAkF;AAClF,SAAS,WAAW,CAAC,QAAkB;IACrC,MAAM,KAAK,GAAG,QAAQ,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC;IACpC,IAAI,KAAK,KAAK,EAAE,IAAI,QAAQ,CAAC,UAAU,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,UAAU,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC;QACpF,OAAO,QAAQ,CAAC,IAAI,CAAC;IACvB,CAAC;IACD,MAAM,OAAO,GAAG,MAAM,UAAU,CAAC,KAAK,CAAC,MAAM,CAAC;IAC9C,OAAO,QAAQ,CAAC,IAAI,KAAK,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG,OAAO,KAAK,QAAQ,CAAC,IAAI,EAAE,CAAC;AACzE,CAAC;AAED,SAAS,QAAQ,CAAC,KAAa;IAC7B,OAAO,KAAK,CAAC,IAAI,EAAE,CAAC,OAAO,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;AAC3C,CAAC;AAED,SAAS,UAAU,CAAC,KAAa;IAC/B,OAAO,KAAK,CAAC,UAAU,CAAC,GAAG,EAAE,OAAO,CAAC,CAAC,UAAU,CAAC,GAAG,EAAE,MAAM,CAAC,CAAC,UAAU,CAAC,GAAG,EAAE,MAAM,CAAC,CAAC;AACxF,CAAC;AAED,gEAAgE;AAChE,SAAS,OAAO,CAAC,IAAY,EAAE,IAAY,EAAE,OAAe;IAC1D,OAAO,IAAI,OAAO,CAAC,EAAE,IAAI,EAAE,IAAI,IAAI,EAAE,EAAE,IAAI,EAAE,IAAI,GAAG,CAAC,WAAW,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC,EAAE,CAAC,CAAC;AACtF,CAAC;AAED;;;;;;;GAOG;AACH,MAAM,UAAU,kBAAkB,CAChC,OAAuC,EACvC,QAAkB;IAElB,MAAM,MAAM,GAAG,UAAU,CAAC,OAAO,EAAE,QAAQ,CAAC,CAAC;IAC7C,MAAM,EAAE,KAAK,EAAE,SAAS,EAAE,GAAG,WAAW,CAAC,OAAO,EAAE,QAAQ,CAAC,CAAC;IAE5D,OAAO,IAAI,MAAM,CAAC;QAChB,EAAE,EAAE,gBAAgB,CAAC,eAAe,CAAC,OAAO,EAAE,QAAQ,CAAC,CAAC;QACxD,KAAK;QACL,MAAM;QACN,SAAS,EAAE,SAAS,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,IAAI;QAC3C,EAAE,EAAE,iBAAiB;QACrB,EAAE,EAAE,SAAS;KACd,CAAC,CAAC;AACL,CAAC;AAED;;;;;;;;;;;;;GAaG;AACH,MAAM,UAAU,kBAAkB,CAChC,OAAuC,EACvC,QAAkB,EAClB,QAAQ,GAAW,UAAU,CAAC,QAAQ,CAAC;IAEvC,MAAM,MAAM,GAAG,UAAU,CAAC,OAAO,EAAE,QAAQ,CAAC,CAAC;IAC7C,MAAM,EAAE,KAAK,EAAE,SAAS,EAAE,GAAG,WAAW,CAAC,OAAO,EAAE,QAAQ,CAAC,CAAC;IAE5D,OAAO,IAAI,MAAM,CAAC;QAChB,EAAE,EAAE,gBAAgB,CAAC,eAAe,CAAC,OAAO,EAAE,QAAQ,CAAC,EAAE,QAAQ,CAAC;QAClE,KAAK;QACL,MAAM;QACN,SAAS,EAAE,SAAS,CAAC,QAAQ,CAAC,OAAO,IAAI,QAAQ,CAAC,IAAI,CAAC,IAAI,IAAI;QAC/D,EAAE,EAAE,iBAAiB;QACrB,EAAE,EAAE,SAAS;KACd,CAAC,CAAC;AACL,CAAC;AAED;;;;;;;;;;;GAWG;AACH,MAAM,UAAU,kBAAkB,CAChC,OAAuC,EACvC,QAAkB,EAClB,OAAe;IAEf,MAAM,QAAQ,GAAG,eAAe,CAAC,OAAO,EAAE,QAAQ,CAAC,CAAC;IACpD,MAAM,EAAE,KAAK,EAAE,SAAS,EAAE,GAAG,WAAW,CAAC,OAAO,EAAE,QAAQ,CAAC,CAAC;IAE5D,OAAO,IAAI,MAAM,CAAC;QAChB,EAAE,EAAE,gBAAgB,CAAC,QAAQ,EAAE,OAAO,CAAC;QACvC,KAAK;QACL,MAAM,EAAE,IAAI,SAAS,CAAC;YACpB,EAAE,EAAE,QAAQ;YACZ,UAAU,EAAE,YAAY,CAAC,cAAc,CAAC,QAAQ,CAAC,CAAC;YAClD,OAAO,EAAE,SAAS,CAAC,OAAO,CAAC,IAAI,IAAI;SACpC,CAAC;QACF,EAAE,EAAE,iBAAiB;QACrB,EAAE,EAAE,SAAS;KACd,CAAC,CAAC;AACL,CAAC;AAED;;;;;;;;GAQG;AACH,MAAM,UAAU,eAAe,CAAC,OAAuC,EAAE,QAAkB;IACzF,OAAO,IAAI,GAAG,CAAC,YAAY,CAAC,QAAQ,EAAE,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC;AACtE,CAAC;AAED;;;;;GAKG;AACH,SAAS,UAAU,CAAC,QAAkB;IACpC,OAAO,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;AACpC,CAAC;AAED;;;;;;;;;;GAUG;AACH,MAAM,UAAU,SAAS,CAAC,KAAyB;IACjD,IAAI,KAAK,KAAK,SAAS;QAAE,OAAO,SAAS,CAAC;IAC1C,MAAM,IAAI,GAAG,IAAI,IAAI,CAAC,KAAK,CAAC,CAAC;IAC7B,IAAI,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,OAAO,EAAE,CAAC;QAAE,OAAO,SAAS,CAAC;IACnD,OAAO,gBAAgB,CAAC,OAAO,CAAC,qBAAqB,CACnD,IAAI,CAAC,OAAO,EAAE,CACgB,CAAC;AACnC,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"federation.d.ts","sourceRoot":"","sources":["../../src/federation/federation.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,OAAO,EAAE,UAAU,EAAE,iBAAiB,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AACxF,OAAO,
|
|
1
|
+
{"version":3,"file":"federation.d.ts","sourceRoot":"","sources":["../../src/federation/federation.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,OAAO,EAAE,UAAU,EAAE,iBAAiB,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AACxF,OAAO,EAGL,MAAM,EAQP,MAAM,eAAe,CAAC;AAIvB,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AACpD,OAAO,KAAK,EAAE,mBAAmB,EAAE,cAAc,EAAE,MAAM,cAAc,CAAC;AACxE,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,wBAAwB,CAAC;AACvD,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AA4BxD,2FAA2F;AAC3F,eAAO,MAAM,aAAa,gBAAgB,CAAC;AAE3C;;;;;;GAMG;AACH,eAAO,MAAM,gBAAgB,KAAK,CAAC;AAEnC,yDAAyD;AACzD,MAAM,WAAW,qBAAqB;IACpC,0DAA0D;IAC1D,QAAQ,CAAC,KAAK,EAAE,UAAU,CAAC;IAC3B,gFAAgF;IAChF,QAAQ,CAAC,KAAK,EAAE,YAAY,CAAC;IAC7B,uDAAuD;IACvD,QAAQ,CAAC,MAAM,EAAE,cAAc,CAAC;CACjC;AAED,6EAA6E;AAC7E,MAAM,MAAM,cAAc,GAAG,UAAU,CAAC,qBAAqB,CAAC,CAAC;AAE/D;;;GAGG;AACH,MAAM,WAAW,2BAA4B,SAAQ,mBAAmB;IACtE;;;;;;OAMG;IACH,OAAO,EAAE,MAAM,CAAC;IAChB,oFAAoF;IACpF,iBAAiB,CAAC,EAAE,OAAO,CAAC,iBAAiB,CAAC,qBAAqB,CAAC,CAAC,GAAG,SAAS,CAAC;CACnF;AAED;;;;;;;;;;;;;GAaG;AACH,wBAAgB,oBAAoB,CAAC,OAAO,EAAE,2BAA2B,GAAG,cAAc,CAsKzF;AAED;;;;;;GAMG;AACH,wBAAgB,aAAa,CAAC,KAAK,EAAE,YAAY,EAAE,IAAI,EAAE,MAAM,GAAG,QAAQ,GAAG,SAAS,CAKrF;AAED;;;;;;;;;;;GAWG;AACH,wBAAgB,UAAU,CACxB,OAAO,EAAE,OAAO,CAAC,qBAAqB,CAAC,EACvC,KAAK,EAAE,SAAS,MAAM,EAAE,EACxB,MAAM,EAAE,MAAM,GAAG,IAAI,GACpB,SAAS,CAAC,MAAM,CAAC,CAYnB"}
|
|
@@ -1,14 +1,15 @@
|
|
|
1
1
|
import { createRequire } from 'node:module';
|
|
2
2
|
import { createFederation, InProcessMessageQueue, MemoryKvStore } from '@fedify/fedify';
|
|
3
|
-
import { Accept, Announce, Create, Delete, Follow, Like, Reject, Undo } from '@fedify/vocab';
|
|
3
|
+
import { Accept, Announce, Create, Delete, Follow, Like, QuoteAuthorization, QuoteRequest, Reject, Undo, } from '@fedify/vocab';
|
|
4
4
|
import { countUsers, listUsers } from '../admin/accounts.js';
|
|
5
5
|
import { authorNames } from '../web/authors.js';
|
|
6
6
|
import { userActor, userByUsername } from './actor.js';
|
|
7
|
-
import { isFederatedDocument, postCreateActivity } from './article.js';
|
|
7
|
+
import { isFederatedDocument, postByObjectId, postCreateActivity } from './article.js';
|
|
8
8
|
import { followersPage, lastFollowersCursor } from './followers.js';
|
|
9
|
-
import { handleAccept, handleDelete, handleFollow, handleLoggedActivity, handleReject, handleUndo, } from './inbox.js';
|
|
9
|
+
import { handleAccept, handleDelete, handleFollow, handleLoggedActivity, handleQuoteRequest, handleReject, handleUndo, } from './inbox.js';
|
|
10
10
|
import { loadActorKeyPairs } from './keys.js';
|
|
11
|
-
import { ACTOR_PATH, federationOrigin, FOLLOWERS_PATH, FOLLOWING_PATH, INBOX_PATH, NODEINFO_PATH, OUTBOX_PATH, SHARED_INBOX_PATH, } from './paths.js';
|
|
11
|
+
import { ACTOR_PATH, federationOrigin, FOLLOWERS_PATH, FOLLOWING_PATH, INBOX_PATH, NODEINFO_PATH, OUTBOX_PATH, QUOTE_AUTHORIZATION_PATH, SHARED_INBOX_PATH, } from './paths.js';
|
|
12
|
+
import { quoteAuthorization, readQuoteAuthorizations } from './quotes.js';
|
|
12
13
|
/** The `software.name` this CMS reports in NodeInfo. Lower case, as the schema demands. */
|
|
13
14
|
export const SOFTWARE_NAME = 'geekity-cms';
|
|
14
15
|
/**
|
|
@@ -72,6 +73,22 @@ export function createSiteFederation(options) {
|
|
|
72
73
|
// middleware in `mount.ts` answers an ActivityStreams request there, and
|
|
73
74
|
// `isFederatedDocument` is the one rule it and the outbox both read, so they
|
|
74
75
|
// cannot disagree about what exists.
|
|
76
|
+
// A quote approval, for anybody who asks, as long as the quote still stands
|
|
77
|
+
// and the post it quotes is still one this site federates: a stamp on a post
|
|
78
|
+
// nobody can see any more approves nothing (FEP-044f).
|
|
79
|
+
federation.setObjectDispatcher(QuoteAuthorization, QUOTE_AUTHORIZATION_PATH, (context, { identifier, id }) => {
|
|
80
|
+
const user = actorFor(context, identifier);
|
|
81
|
+
if (user === undefined)
|
|
82
|
+
return null;
|
|
83
|
+
const { config, store } = context.data;
|
|
84
|
+
const record = readQuoteAuthorizations(config.contentDir, user.username).find((entry) => entry.id === id);
|
|
85
|
+
if (record === undefined)
|
|
86
|
+
return null;
|
|
87
|
+
const post = postByObjectId(store, record.post, config.baseUrl);
|
|
88
|
+
if (post === undefined || !isFederatedDocument(post, store.now()))
|
|
89
|
+
return null;
|
|
90
|
+
return quoteAuthorization(context, user, record);
|
|
91
|
+
});
|
|
75
92
|
/** Every stored `author` string that reads as this user (TASK-67). */
|
|
76
93
|
function namesOf(context, user) {
|
|
77
94
|
return authorNames(listUsers(context.data.config.dataDir), user);
|
|
@@ -126,7 +143,7 @@ export function createSiteFederation(options) {
|
|
|
126
143
|
// by the time a listener runs — an unsigned or badly signed delivery never
|
|
127
144
|
// reaches one — so a handler may trust that the activity's actor really sent
|
|
128
145
|
// it. An activity of a type not listed here is answered 202 and dropped,
|
|
129
|
-
// which is what doc-4 asks for everything past these
|
|
146
|
+
// which is what doc-4 asks for everything past these.
|
|
130
147
|
federation
|
|
131
148
|
.setInboxListeners(INBOX_PATH, SHARED_INBOX_PATH)
|
|
132
149
|
// `per-origin` rather than Fedify's default `per-inbox`, which folds the
|
|
@@ -142,7 +159,8 @@ export function createSiteFederation(options) {
|
|
|
142
159
|
.on(Delete, handleDelete)
|
|
143
160
|
.on(Like, handleLoggedActivity)
|
|
144
161
|
.on(Announce, handleLoggedActivity)
|
|
145
|
-
.on(Create, handleLoggedActivity)
|
|
162
|
+
.on(Create, handleLoggedActivity)
|
|
163
|
+
.on(QuoteRequest, handleQuoteRequest);
|
|
146
164
|
federation.setNodeInfoDispatcher(NODEINFO_PATH, (context) => {
|
|
147
165
|
const counts = context.data.store.counts();
|
|
148
166
|
return {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"federation.js","sourceRoot":"","sources":["../../src/federation/federation.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAE5C,OAAO,EAAE,gBAAgB,EAAE,qBAAqB,EAAE,aAAa,EAAE,MAAM,gBAAgB,CAAC;AAExF,OAAO,
|
|
1
|
+
{"version":3,"file":"federation.js","sourceRoot":"","sources":["../../src/federation/federation.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import type { InboxContext } from '@fedify/fedify';
|
|
2
|
-
import { Accept, Follow } from '@fedify/vocab';
|
|
3
|
-
import type { Activity, Actor, Announce, Create, Delete, Like,
|
|
2
|
+
import { Accept, Follow, Reject } from '@fedify/vocab';
|
|
3
|
+
import type { Activity, Actor, Announce, Create, Delete, Like, QuoteRequest, Undo } from '@fedify/vocab';
|
|
4
4
|
import type { NewFollower } from '../admin/store.ts';
|
|
5
5
|
import type { FederationContextData } from './federation.ts';
|
|
6
6
|
/** What an inbox handler is handed: a Fedify context over the CMS's stores. */
|
|
@@ -23,7 +23,8 @@ export type SiteInboxContext = InboxContext<FederationContextData>;
|
|
|
23
23
|
*/
|
|
24
24
|
export declare function handleFollow(context: SiteInboxContext, follow: Follow): Promise<void>;
|
|
25
25
|
/**
|
|
26
|
-
* Handle an `Undo`: an undone `Follow` removes the follower
|
|
26
|
+
* Handle an `Undo`: an undone `Follow` removes the follower, and an undone
|
|
27
|
+
* `QuoteRequest` withdraws the quote approval it was given.
|
|
27
28
|
*
|
|
28
29
|
* Only the actor that sent the `Follow` may undo it. Without that check any
|
|
29
30
|
* signed actor could unfollow the site on somebody else's behalf, since the
|
|
@@ -40,6 +41,19 @@ export declare function handleUndo(context: SiteInboxContext, undo: Undo): Promi
|
|
|
40
41
|
* object to remove.
|
|
41
42
|
*/
|
|
42
43
|
export declare function handleDelete(context: SiteInboxContext, activity: Delete): Promise<void>;
|
|
44
|
+
/**
|
|
45
|
+
* Handle a `QuoteRequest` (FEP-044f): approve a quote of a post this site
|
|
46
|
+
* federates, and refuse anything else.
|
|
47
|
+
*
|
|
48
|
+
* Every federated post is public and advertises `canQuote` for anybody (see
|
|
49
|
+
* `postObject`), so approval is automatic and the one rule is whether the
|
|
50
|
+
* quoted object is such a post. The quote has to live on the requester's own
|
|
51
|
+
* server too, as Mastodon insists of any activity: otherwise anybody could
|
|
52
|
+
* obtain a stamp for somebody else's post. An approval is stored, then sent
|
|
53
|
+
* as the `result` of an `Accept`; a refusal is a `Reject` and stores nothing.
|
|
54
|
+
* Either way the answer comes from the post's author, to the requester.
|
|
55
|
+
*/
|
|
56
|
+
export declare function handleQuoteRequest(context: SiteInboxContext, request: QuoteRequest): Promise<void>;
|
|
43
57
|
/**
|
|
44
58
|
* Handle an `Accept`: a relay agreeing to the subscription the site asked for.
|
|
45
59
|
*
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"inbox.d.ts","sourceRoot":"","sources":["../../src/federation/inbox.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AACnD,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,eAAe,CAAC;
|
|
1
|
+
{"version":3,"file":"inbox.d.ts","sourceRoot":"","sources":["../../src/federation/inbox.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AACnD,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,eAAe,CAAC;AACvD,OAAO,KAAK,EACV,QAAQ,EACR,KAAK,EACL,QAAQ,EACR,MAAM,EACN,MAAM,EACN,IAAI,EAEJ,YAAY,EACZ,IAAI,EACL,MAAM,eAAe,CAAC;AAIvB,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAIrD,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,iBAAiB,CAAC;AAM7D,+EAA+E;AAC/E,MAAM,MAAM,gBAAgB,GAAG,YAAY,CAAC,qBAAqB,CAAC,CAAC;AAEnE;;;;;;;;;;;;;;;GAeG;AACH,wBAAsB,YAAY,CAAC,OAAO,EAAE,gBAAgB,EAAE,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CA6B3F;AA4BD;;;;;;;;GAQG;AACH,wBAAsB,UAAU,CAAC,OAAO,EAAE,gBAAgB,EAAE,IAAI,EAAE,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CA0BrF;AAED;;;;;;;GAOG;AACH,wBAAsB,YAAY,CAAC,OAAO,EAAE,gBAAgB,EAAE,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAmB7F;AA8BD;;;;;;;;;;;GAWG;AACH,wBAAsB,kBAAkB,CACtC,OAAO,EAAE,gBAAgB,EACzB,OAAO,EAAE,YAAY,GACpB,OAAO,CAAC,IAAI,CAAC,CAmDf;AAED;;;;;;;GAOG;AACH,wBAAsB,YAAY,CAAC,OAAO,EAAE,gBAAgB,EAAE,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAG3F;AAED;;;GAGG;AACH,wBAAsB,YAAY,CAAC,OAAO,EAAE,gBAAgB,EAAE,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAG3F;AAED;;;;;;;GAOG;AACH,wBAAsB,oBAAoB,CACxC,OAAO,EAAE,gBAAgB,EACzB,QAAQ,EAAE,IAAI,GAAG,QAAQ,GAAG,MAAM,GACjC,OAAO,CAAC,IAAI,CAAC,CAEf;AAED;;;;;;;;;;;;;;GAcG;AACH,wBAAsB,WAAW,CAC/B,OAAO,EAAE,gBAAgB,EACzB,QAAQ,EAAE,QAAQ,EAClB,SAAS,GAAE,MAAM,GAAG,SAA0C,GAC7D,OAAO,CAAC,IAAI,CAAC,CAUf;AAOD;;;;;;;GAOG;AACH,wBAAsB,YAAY,CAChC,OAAO,EAAE,gBAAgB,EACzB,KAAK,EAAE,KAAK,GACX,OAAO,CAAC,IAAI,CAAC,WAAW,EAAE,UAAU,CAAC,GAAG,SAAS,CAAC,CAcpD"}
|
package/dist/federation/inbox.js
CHANGED
|
@@ -1,7 +1,10 @@
|
|
|
1
1
|
import { randomUUID } from 'node:crypto';
|
|
2
|
-
import { Accept, Follow } from '@fedify/vocab';
|
|
3
|
-
import { listUsers } from '../admin/accounts.js';
|
|
2
|
+
import { Accept, Follow, Reject } from '@fedify/vocab';
|
|
3
|
+
import { listUsers, primaryUser } from '../admin/accounts.js';
|
|
4
4
|
import { actorId, senderKeyPairs, userByUsername } from './actor.js';
|
|
5
|
+
import { documentAuthor, isFederatedDocument, postByObjectId } from './article.js';
|
|
6
|
+
import { postObjectId } from '../web/documents.js';
|
|
7
|
+
import { authorizeQuote, quoteAuthorization, revokeQuotes } from './quotes.js';
|
|
5
8
|
import { addFollower, appendInboxActivity, removeFollower } from './records.js';
|
|
6
9
|
import { acceptRelay, rejectRelay } from './relays.js';
|
|
7
10
|
/**
|
|
@@ -71,7 +74,8 @@ function followedUser(context, follow) {
|
|
|
71
74
|
return listUsers(context.data.config.dataDir).find((user) => user.actorId === wanted);
|
|
72
75
|
}
|
|
73
76
|
/**
|
|
74
|
-
* Handle an `Undo`: an undone `Follow` removes the follower
|
|
77
|
+
* Handle an `Undo`: an undone `Follow` removes the follower, and an undone
|
|
78
|
+
* `QuoteRequest` withdraws the quote approval it was given.
|
|
75
79
|
*
|
|
76
80
|
* Only the actor that sent the `Follow` may undo it. Without that check any
|
|
77
81
|
* signed actor could unfollow the site on somebody else's behalf, since the
|
|
@@ -79,14 +83,20 @@ function followedUser(context, follow) {
|
|
|
79
83
|
* about who the follow belonged to.
|
|
80
84
|
*/
|
|
81
85
|
export async function handleUndo(context, undo) {
|
|
86
|
+
// A withdrawn QuoteRequest takes its approval with it. Matched on the ids
|
|
87
|
+
// alone, so an Undo naming the request by a URL nobody can fetch still counts.
|
|
88
|
+
const undoer = undo.actorId?.href;
|
|
89
|
+
const undone = undo.objectId?.href;
|
|
90
|
+
if (undoer !== undefined && undone !== undefined) {
|
|
91
|
+
await revokeQuotes(context.data.config.contentDir, (record) => record.request === undone && record.actor === undoer);
|
|
92
|
+
}
|
|
82
93
|
const object = await undo.getObject(dereference(context));
|
|
83
94
|
const followed = object instanceof Follow ? followedUser(context, object) : undefined;
|
|
84
95
|
await logActivity(context, undo, followed?.username);
|
|
85
96
|
if (!(object instanceof Follow))
|
|
86
97
|
return;
|
|
87
|
-
const undoer = undo.actorId;
|
|
88
98
|
const follower = object.actorId;
|
|
89
|
-
if (undoer ===
|
|
99
|
+
if (undoer === undefined || follower === null || undoer !== follower.href)
|
|
90
100
|
return;
|
|
91
101
|
// An `Undo` that names which actor was followed unfollows exactly that one;
|
|
92
102
|
// one that does not — the object arrived as a bare id nothing could
|
|
@@ -106,8 +116,13 @@ export async function handleDelete(context, activity) {
|
|
|
106
116
|
await logActivity(context, activity, context.recipient ?? undefined);
|
|
107
117
|
const actor = activity.actorId;
|
|
108
118
|
const object = activity.objectId;
|
|
109
|
-
if (actor === null || object === null
|
|
119
|
+
if (actor === null || object === null)
|
|
120
|
+
return;
|
|
121
|
+
if (actor.href !== object.href) {
|
|
122
|
+
// A quote its author deleted is no longer one this site vouches for.
|
|
123
|
+
await revokeQuotes(context.data.config.contentDir, (record) => record.quote === object.href && record.actor === actor.href);
|
|
110
124
|
return;
|
|
125
|
+
}
|
|
111
126
|
// An account that is gone is gone from everybody's followers, whichever
|
|
112
127
|
// inbox the announcement happened to reach.
|
|
113
128
|
await forget(context, object.href);
|
|
@@ -133,6 +148,57 @@ async function forget(context, actorHref, username) {
|
|
|
133
148
|
for (const name of usernames)
|
|
134
149
|
await removeFollower(records, name, actorHref);
|
|
135
150
|
}
|
|
151
|
+
/**
|
|
152
|
+
* Handle a `QuoteRequest` (FEP-044f): approve a quote of a post this site
|
|
153
|
+
* federates, and refuse anything else.
|
|
154
|
+
*
|
|
155
|
+
* Every federated post is public and advertises `canQuote` for anybody (see
|
|
156
|
+
* `postObject`), so approval is automatic and the one rule is whether the
|
|
157
|
+
* quoted object is such a post. The quote has to live on the requester's own
|
|
158
|
+
* server too, as Mastodon insists of any activity: otherwise anybody could
|
|
159
|
+
* obtain a stamp for somebody else's post. An approval is stored, then sent
|
|
160
|
+
* as the `result` of an `Accept`; a refusal is a `Reject` and stores nothing.
|
|
161
|
+
* Either way the answer comes from the post's author, to the requester.
|
|
162
|
+
*/
|
|
163
|
+
export async function handleQuoteRequest(context, request) {
|
|
164
|
+
const { config, store } = context.data;
|
|
165
|
+
const post = request.objectId === null
|
|
166
|
+
? undefined
|
|
167
|
+
: postByObjectId(store, request.objectId.href, config.baseUrl);
|
|
168
|
+
const author = post === undefined
|
|
169
|
+
? (userByUsername(config.dataDir, context.recipient ?? '') ?? primaryUser(config.dataDir))
|
|
170
|
+
: documentAuthor(context, post);
|
|
171
|
+
await logActivity(context, request, author?.username);
|
|
172
|
+
if (request.id === null || author === undefined)
|
|
173
|
+
return;
|
|
174
|
+
const requester = await request.getActor(dereference(context));
|
|
175
|
+
if (requester === null || requester.id === null)
|
|
176
|
+
return;
|
|
177
|
+
const quote = request.instrumentId;
|
|
178
|
+
const quotable = post !== undefined &&
|
|
179
|
+
isFederatedDocument(post, store.now()) &&
|
|
180
|
+
quote !== null &&
|
|
181
|
+
quote.origin === requester.id.origin;
|
|
182
|
+
const sender = await senderKeyPairs(context, author);
|
|
183
|
+
const from = actorId(context, author);
|
|
184
|
+
if (!quotable) {
|
|
185
|
+
await context.sendActivity(sender, requester, new Reject({ id: new URL(`#reject/${randomUUID()}`, from), actor: from, object: request }));
|
|
186
|
+
return;
|
|
187
|
+
}
|
|
188
|
+
const record = await authorizeQuote(config.contentDir, author.username, {
|
|
189
|
+
quote: quote.href,
|
|
190
|
+
post: postObjectId(post, config.baseUrl),
|
|
191
|
+
request: request.id.href,
|
|
192
|
+
actor: requester.id.href,
|
|
193
|
+
});
|
|
194
|
+
const stamp = quoteAuthorization(context, author, record);
|
|
195
|
+
await context.sendActivity(sender, requester, new Accept({
|
|
196
|
+
id: new URL(`#accept/${randomUUID()}`, from),
|
|
197
|
+
actor: from,
|
|
198
|
+
object: request,
|
|
199
|
+
result: stamp,
|
|
200
|
+
}));
|
|
201
|
+
}
|
|
136
202
|
/**
|
|
137
203
|
* Handle an `Accept`: a relay agreeing to the subscription the site asked for.
|
|
138
204
|
*
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"inbox.js","sourceRoot":"","sources":["../../src/federation/inbox.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAGzC,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,eAAe,CAAC;
|
|
1
|
+
{"version":3,"file":"inbox.js","sourceRoot":"","sources":["../../src/federation/inbox.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
export { actorAliases, actorId, avatarUrl, keyIdFor, mainKeyId, multikeyId, senderKeyPairs, userActor, userByUsername, } from './actor.ts';
|
|
2
2
|
export type { UserActorOptions } from './actor.ts';
|
|
3
|
-
export { articleObjectId, documentAuthor, isFederatedDocument,
|
|
3
|
+
export { articleObjectId, documentAuthor, isFederatedDocument, postCreateActivity, postDeleteActivity, postObject, postUpdateActivity, SOURCE_MEDIA_TYPE, toInstant, } from './article.ts';
|
|
4
4
|
export { createDeliveryService, deliveryTargets, groupByInbox } from './delivery.ts';
|
|
5
5
|
export type { CreateDeliveryServiceOptions, DeliveryLogger, DeliveryReport, DeliveryService, DeliveryTarget, } from './delivery.ts';
|
|
6
6
|
export { createSiteFederation, federatedPost, outboxPage, OUTBOX_PAGE_SIZE, SOFTWARE_NAME, } from './federation.ts';
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/federation/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,YAAY,EACZ,OAAO,EACP,SAAS,EACT,QAAQ,EACR,SAAS,EACT,UAAU,EACV,cAAc,EACd,SAAS,EACT,cAAc,GACf,MAAM,YAAY,CAAC;AACpB,YAAY,EAAE,gBAAgB,EAAE,MAAM,YAAY,CAAC;AACnD,OAAO,EACL,eAAe,EACf,cAAc,EACd,mBAAmB,EACnB,
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/federation/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,YAAY,EACZ,OAAO,EACP,SAAS,EACT,QAAQ,EACR,SAAS,EACT,UAAU,EACV,cAAc,EACd,SAAS,EACT,cAAc,GACf,MAAM,YAAY,CAAC;AACpB,YAAY,EAAE,gBAAgB,EAAE,MAAM,YAAY,CAAC;AACnD,OAAO,EACL,eAAe,EACf,cAAc,EACd,mBAAmB,EACnB,kBAAkB,EAClB,kBAAkB,EAClB,UAAU,EACV,kBAAkB,EAClB,iBAAiB,EACjB,SAAS,GACV,MAAM,cAAc,CAAC;AACtB,OAAO,EAAE,qBAAqB,EAAE,eAAe,EAAE,YAAY,EAAE,MAAM,eAAe,CAAC;AACrF,YAAY,EACV,4BAA4B,EAC5B,cAAc,EACd,cAAc,EACd,eAAe,EACf,cAAc,GACf,MAAM,eAAe,CAAC;AACvB,OAAO,EACL,oBAAoB,EACpB,aAAa,EACb,UAAU,EACV,gBAAgB,EAChB,aAAa,GACd,MAAM,iBAAiB,CAAC;AACzB,YAAY,EACV,2BAA2B,EAC3B,qBAAqB,EACrB,cAAc,GACf,MAAM,iBAAiB,CAAC;AACzB,OAAO,EACL,oBAAoB,EACpB,oBAAoB,EACpB,mBAAmB,GACpB,MAAM,uBAAuB,CAAC;AAC/B,YAAY,EACV,qBAAqB,EACrB,WAAW,EACX,2BAA2B,EAC3B,0BAA0B,EAC1B,mBAAmB,GACpB,MAAM,uBAAuB,CAAC;AAC/B,OAAO,EACL,iBAAiB,EACjB,aAAa,EACb,mBAAmB,EACnB,mBAAmB,GACpB,MAAM,gBAAgB,CAAC;AACxB,OAAO,EACL,YAAY,EACZ,YAAY,EACZ,YAAY,EACZ,YAAY,EACZ,oBAAoB,EACpB,YAAY,EACZ,UAAU,EACV,WAAW,GACZ,MAAM,YAAY,CAAC;AACpB,YAAY,EAAE,gBAAgB,EAAE,MAAM,YAAY,CAAC;AACnD,OAAO,EACL,oBAAoB,EACpB,YAAY,EACZ,YAAY,EACZ,qBAAqB,EACrB,iBAAiB,EACjB,uBAAuB,EACvB,iBAAiB,GAClB,MAAM,WAAW,CAAC;AACnB,YAAY,EAAE,iBAAiB,EAAE,MAAM,WAAW,CAAC;AACnD,OAAO,EACL,WAAW,EACX,mBAAmB,EACnB,yBAAyB,EACzB,kBAAkB,EAClB,aAAa,EACb,cAAc,EACd,cAAc,EACd,SAAS,EACT,UAAU,EACV,eAAe,EACf,YAAY,EACZ,wBAAwB,EACxB,aAAa,EACb,YAAY,EACZ,wBAAwB,EACxB,cAAc,EACd,aAAa,GACd,MAAM,cAAc,CAAC;AACtB,YAAY,EAAE,qBAAqB,EAAE,iBAAiB,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AACxF,OAAO,EAAE,MAAM,EAAE,eAAe,EAAE,gBAAgB,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AACvF,YAAY,EAAE,sBAAsB,EAAE,MAAM,YAAY,CAAC;AACzD,OAAO,EACL,UAAU,EACV,gBAAgB,EAChB,gBAAgB,EAChB,gBAAgB,EAChB,cAAc,EACd,cAAc,EACd,UAAU,EACV,UAAU,EACV,aAAa,EACb,WAAW,EACX,iBAAiB,EACjB,gBAAgB,GACjB,MAAM,YAAY,CAAC;AACpB,OAAO,EACL,cAAc,EACd,WAAW,EACX,kBAAkB,EAClB,WAAW,EACX,cAAc,EACd,cAAc,GACf,MAAM,aAAa,CAAC;AACrB,YAAY,EACV,yBAAyB,EACzB,WAAW,EACX,YAAY,EACZ,eAAe,GAChB,MAAM,aAAa,CAAC;AACrB,OAAO,EAAE,WAAW,EAAE,SAAS,EAAE,aAAa,EAAE,mBAAmB,EAAE,MAAM,cAAc,CAAC;AAC1F,YAAY,EAAE,KAAK,EAAE,MAAM,cAAc,CAAC;AAC1C,OAAO,EACL,yBAAyB,EACzB,qBAAqB,EACrB,sBAAsB,EACtB,sBAAsB,EACtB,0BAA0B,EAC1B,oBAAoB,EACpB,wBAAwB,EACxB,wBAAwB,EACxB,oBAAoB,EACpB,qBAAqB,EACrB,uBAAuB,EACvB,2BAA2B,EAC3B,qBAAqB,EACrB,sBAAsB,GACvB,MAAM,gBAAgB,CAAC;AACxB,YAAY,EACV,gCAAgC,EAChC,iBAAiB,EACjB,sBAAsB,EACtB,cAAc,GACf,MAAM,gBAAgB,CAAC"}
|
package/dist/federation/index.js
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
export { actorAliases, actorId, avatarUrl, keyIdFor, mainKeyId, multikeyId, senderKeyPairs, userActor, userByUsername, } from './actor.js';
|
|
2
|
-
export { articleObjectId, documentAuthor, isFederatedDocument,
|
|
2
|
+
export { articleObjectId, documentAuthor, isFederatedDocument, postCreateActivity, postDeleteActivity, postObject, postUpdateActivity, SOURCE_MEDIA_TYPE, toInstant, } from './article.js';
|
|
3
3
|
export { createDeliveryService, deliveryTargets, groupByInbox } from './delivery.js';
|
|
4
4
|
export { createSiteFederation, federatedPost, outboxPage, OUTBOX_PAGE_SIZE, SOFTWARE_NAME, } from './federation.js';
|
|
5
5
|
export { ExistingKeyPairError, importWordPressActor, UnusableKeyPemError, } from './import-wordpress.js';
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/federation/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,YAAY,EACZ,OAAO,EACP,SAAS,EACT,QAAQ,EACR,SAAS,EACT,UAAU,EACV,cAAc,EACd,SAAS,EACT,cAAc,GACf,MAAM,YAAY,CAAC;AAEpB,OAAO,EACL,eAAe,EACf,cAAc,EACd,mBAAmB,EACnB,
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/federation/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,YAAY,EACZ,OAAO,EACP,SAAS,EACT,QAAQ,EACR,SAAS,EACT,UAAU,EACV,cAAc,EACd,SAAS,EACT,cAAc,GACf,MAAM,YAAY,CAAC;AAEpB,OAAO,EACL,eAAe,EACf,cAAc,EACd,mBAAmB,EACnB,kBAAkB,EAClB,kBAAkB,EAClB,UAAU,EACV,kBAAkB,EAClB,iBAAiB,EACjB,SAAS,GACV,MAAM,cAAc,CAAC;AACtB,OAAO,EAAE,qBAAqB,EAAE,eAAe,EAAE,YAAY,EAAE,MAAM,eAAe,CAAC;AAQrF,OAAO,EACL,oBAAoB,EACpB,aAAa,EACb,UAAU,EACV,gBAAgB,EAChB,aAAa,GACd,MAAM,iBAAiB,CAAC;AAMzB,OAAO,EACL,oBAAoB,EACpB,oBAAoB,EACpB,mBAAmB,GACpB,MAAM,uBAAuB,CAAC;AAQ/B,OAAO,EACL,iBAAiB,EACjB,aAAa,EACb,mBAAmB,EACnB,mBAAmB,GACpB,MAAM,gBAAgB,CAAC;AACxB,OAAO,EACL,YAAY,EACZ,YAAY,EACZ,YAAY,EACZ,YAAY,EACZ,oBAAoB,EACpB,YAAY,EACZ,UAAU,EACV,WAAW,GACZ,MAAM,YAAY,CAAC;AAEpB,OAAO,EACL,oBAAoB,EACpB,YAAY,EACZ,YAAY,EACZ,qBAAqB,EACrB,iBAAiB,EACjB,uBAAuB,EACvB,iBAAiB,GAClB,MAAM,WAAW,CAAC;AAEnB,OAAO,EACL,WAAW,EACX,mBAAmB,EACnB,yBAAyB,EACzB,kBAAkB,EAClB,aAAa,EACb,cAAc,EACd,cAAc,EACd,SAAS,EACT,UAAU,EACV,eAAe,EACf,YAAY,EACZ,wBAAwB,EACxB,aAAa,EACb,YAAY,EACZ,wBAAwB,EACxB,cAAc,EACd,aAAa,GACd,MAAM,cAAc,CAAC;AAEtB,OAAO,EAAE,MAAM,EAAE,eAAe,EAAE,gBAAgB,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AAEvF,OAAO,EACL,UAAU,EACV,gBAAgB,EAChB,gBAAgB,EAChB,gBAAgB,EAChB,cAAc,EACd,cAAc,EACd,UAAU,EACV,UAAU,EACV,aAAa,EACb,WAAW,EACX,iBAAiB,EACjB,gBAAgB,GACjB,MAAM,YAAY,CAAC;AACpB,OAAO,EACL,cAAc,EACd,WAAW,EACX,kBAAkB,EAClB,WAAW,EACX,cAAc,EACd,cAAc,GACf,MAAM,aAAa,CAAC;AAOrB,OAAO,EAAE,WAAW,EAAE,SAAS,EAAE,aAAa,EAAE,mBAAmB,EAAE,MAAM,cAAc,CAAC;AAE1F,OAAO,EACL,yBAAyB,EACzB,qBAAqB,EACrB,sBAAsB,EACtB,sBAAsB,EACtB,0BAA0B,EAC1B,oBAAoB,EACpB,wBAAwB,EACxB,wBAAwB,EACxB,oBAAoB,EACpB,qBAAqB,EACrB,uBAAuB,EACvB,2BAA2B,EAC3B,qBAAqB,EACrB,sBAAsB,GACvB,MAAM,gBAAgB,CAAC"}
|