@geekity/cms 0.9.0 → 0.11.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 +86 -24
- package/admin/components/admin-bar.njk +26 -0
- package/admin/components/fields.njk +55 -12
- package/admin/components/public-admin-bar.njk +41 -0
- package/admin/layouts/base.njk +6 -1
- package/admin/layouts/settings-page.njk +7 -2
- package/admin/layouts/shell.njk +9 -20
- package/admin/pages/account/forgot.njk +1 -1
- package/admin/pages/account/login.njk +1 -1
- package/admin/pages/account/reset.njk +4 -2
- package/admin/pages/account/setup.njk +1 -1
- package/admin/pages/dashboard/home.njk +1 -0
- package/admin/pages/documents/list.njk +1 -0
- package/admin/pages/documents/taxonomy.njk +1 -0
- package/admin/pages/federation/followers.njk +3 -0
- package/admin/pages/federation/settings.njk +5 -0
- package/admin/pages/media/library.njk +39 -0
- package/admin/pages/navigation/menus.njk +6 -1
- package/admin/pages/settings/discussion.njk +7 -0
- package/admin/pages/settings/email.njk +10 -0
- package/admin/pages/settings/general.njk +7 -0
- package/admin/pages/settings/permalinks.njk +6 -0
- package/admin/pages/settings/reading.njk +7 -0
- package/admin/pages/tools/content-index.njk +1 -0
- package/admin/pages/tools/personal-data.njk +5 -0
- package/admin/pages/users/edit.njk +7 -5
- package/admin/pages/users/list.njk +1 -0
- package/admin/pages/users/new.njk +5 -1
- package/admin/static/admin-bar.css +153 -0
- package/admin/static/admin.css +95 -96
- package/dist/admin/comments.js +2 -1
- package/dist/admin/comments.js.map +1 -1
- package/dist/admin/documents.d.ts.map +1 -1
- package/dist/admin/documents.js +18 -0
- package/dist/admin/documents.js.map +1 -1
- package/dist/admin/index.d.ts +1 -1
- package/dist/admin/index.d.ts.map +1 -1
- package/dist/admin/index.js.map +1 -1
- package/dist/admin/media.d.ts +13 -2
- package/dist/admin/media.d.ts.map +1 -1
- package/dist/admin/media.js +58 -3
- package/dist/admin/media.js.map +1 -1
- package/dist/admin/personal-data.d.ts.map +1 -1
- package/dist/admin/personal-data.js +5 -1
- package/dist/admin/personal-data.js.map +1 -1
- package/dist/admin/preview.d.ts.map +1 -1
- package/dist/admin/preview.js +1 -1
- package/dist/admin/preview.js.map +1 -1
- package/dist/admin/routes.d.ts.map +1 -1
- package/dist/admin/routes.js +2 -1
- package/dist/admin/routes.js.map +1 -1
- package/dist/admin/store.d.ts +36 -1
- package/dist/admin/store.d.ts.map +1 -1
- package/dist/admin/store.js +63 -1
- package/dist/admin/store.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/admin/tools.d.ts +2 -0
- package/dist/admin/tools.d.ts.map +1 -1
- package/dist/admin/tools.js +3 -2
- package/dist/admin/tools.js.map +1 -1
- package/dist/admin/uploads.d.ts +5 -2
- package/dist/admin/uploads.d.ts.map +1 -1
- package/dist/admin/uploads.js +6 -2
- package/dist/admin/uploads.js.map +1 -1
- package/dist/comments/index.d.ts +2 -2
- package/dist/comments/index.d.ts.map +1 -1
- package/dist/comments/index.js +1 -1
- package/dist/comments/index.js.map +1 -1
- package/dist/comments/records.d.ts +43 -2
- package/dist/comments/records.d.ts.map +1 -1
- package/dist/comments/records.js +201 -54
- package/dist/comments/records.js.map +1 -1
- package/dist/comments/routes.js +1 -1
- package/dist/comments/routes.js.map +1 -1
- package/dist/comments/viewer.d.ts +13 -0
- package/dist/comments/viewer.d.ts.map +1 -1
- package/dist/comments/viewer.js +13 -1
- package/dist/comments/viewer.js.map +1 -1
- package/dist/config.d.ts +21 -0
- package/dist/config.d.ts.map +1 -1
- package/dist/config.js +2 -0
- package/dist/config.js.map +1 -1
- package/dist/env.d.ts +19 -0
- package/dist/env.d.ts.map +1 -1
- package/dist/federation/article.d.ts.map +1 -1
- package/dist/federation/article.js +37 -1
- package/dist/federation/article.js.map +1 -1
- package/dist/federation/delivery.d.ts +3 -1
- package/dist/federation/delivery.d.ts.map +1 -1
- package/dist/federation/delivery.js +6 -1
- package/dist/federation/delivery.js.map +1 -1
- package/dist/federation/federation.d.ts +3 -0
- package/dist/federation/federation.d.ts.map +1 -1
- package/dist/federation/federation.js.map +1 -1
- package/dist/federation/inbox.d.ts +7 -5
- package/dist/federation/inbox.d.ts.map +1 -1
- package/dist/federation/inbox.js +15 -32
- package/dist/federation/inbox.js.map +1 -1
- package/dist/federation/index.d.ts +2 -0
- package/dist/federation/index.d.ts.map +1 -1
- package/dist/federation/index.js +1 -0
- package/dist/federation/index.js.map +1 -1
- package/dist/federation/mount.js +6 -1
- package/dist/federation/mount.js.map +1 -1
- package/dist/federation/profiles.d.ts +95 -0
- package/dist/federation/profiles.d.ts.map +1 -0
- package/dist/federation/profiles.js +171 -0
- package/dist/federation/profiles.js.map +1 -0
- package/dist/federation/relays.d.ts +3 -1
- package/dist/federation/relays.d.ts.map +1 -1
- package/dist/federation/relays.js +6 -1
- package/dist/federation/relays.js.map +1 -1
- package/dist/federation/replies.d.ts +13 -4
- package/dist/federation/replies.d.ts.map +1 -1
- package/dist/federation/replies.js +25 -6
- package/dist/federation/replies.js.map +1 -1
- package/dist/images/alt-text.d.ts +51 -0
- package/dist/images/alt-text.d.ts.map +1 -0
- package/dist/images/alt-text.js +113 -0
- package/dist/images/alt-text.js.map +1 -0
- package/dist/images/icons.d.ts.map +1 -1
- package/dist/images/icons.js +3 -2
- package/dist/images/icons.js.map +1 -1
- package/dist/images/index.d.ts +2 -2
- package/dist/images/index.d.ts.map +1 -1
- package/dist/images/markup.d.ts +26 -4
- package/dist/images/markup.d.ts.map +1 -1
- package/dist/images/markup.js +36 -15
- package/dist/images/markup.js.map +1 -1
- package/dist/images/paths.d.ts +11 -0
- package/dist/images/paths.d.ts.map +1 -1
- package/dist/images/paths.js +17 -1
- package/dist/images/paths.js.map +1 -1
- package/dist/images/variants.d.ts +13 -3
- package/dist/images/variants.d.ts.map +1 -1
- package/dist/images/variants.js +13 -11
- package/dist/images/variants.js.map +1 -1
- package/dist/index.d.ts +11 -5
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +50 -11
- package/dist/index.js.map +1 -1
- package/dist/notifications/routes.js +1 -1
- package/dist/notifications/routes.js.map +1 -1
- package/dist/privacy/erase.d.ts.map +1 -1
- package/dist/privacy/erase.js +2 -3
- package/dist/privacy/erase.js.map +1 -1
- package/dist/privacy/retention.js +1 -1
- package/dist/privacy/retention.js.map +1 -1
- package/dist/web/admin-bar.d.ts +21 -0
- package/dist/web/admin-bar.d.ts.map +1 -0
- package/dist/web/admin-bar.js +145 -0
- package/dist/web/admin-bar.js.map +1 -0
- package/dist/web/assets.d.ts +29 -1
- package/dist/web/assets.d.ts.map +1 -1
- package/dist/web/assets.js +48 -3
- package/dist/web/assets.js.map +1 -1
- package/dist/web/compression.d.ts +19 -0
- package/dist/web/compression.d.ts.map +1 -0
- package/dist/web/compression.js +160 -0
- package/dist/web/compression.js.map +1 -0
- package/dist/web/context.d.ts +5 -1
- package/dist/web/context.d.ts.map +1 -1
- package/dist/web/context.js +5 -2
- package/dist/web/context.js.map +1 -1
- package/dist/web/conversation.d.ts.map +1 -1
- package/dist/web/conversation.js +13 -12
- package/dist/web/conversation.js.map +1 -1
- package/dist/web/render.d.ts +27 -0
- package/dist/web/render.d.ts.map +1 -1
- package/dist/web/render.js +77 -38
- package/dist/web/render.js.map +1 -1
- package/dist/web/routes.d.ts.map +1 -1
- package/dist/web/routes.js +63 -28
- package/dist/web/routes.js.map +1 -1
- package/dist/web/templates.d.ts.map +1 -1
- package/dist/web/templates.js +9 -2
- package/dist/web/templates.js.map +1 -1
- package/dist/webmention/service.d.ts.map +1 -1
- package/dist/webmention/service.js +5 -1
- package/dist/webmention/service.js.map +1 -1
- package/package.json +8 -8
- package/themes/default/README.md +176 -19
- package/themes/default/layouts/base.njk +51 -10
- package/themes/default/layouts/post.njk +10 -1
- package/themes/default/partials/comment-form.njk +33 -14
- package/themes/default/partials/contact-form.njk +32 -14
- package/themes/default/static/style.css +109 -24
|
@@ -0,0 +1,171 @@
|
|
|
1
|
+
import { isActor } from '@fedify/vocab';
|
|
2
|
+
import { primaryUser } from '../admin/accounts.js';
|
|
3
|
+
import { systemNotificationTimers } from '../notifications/digest.js';
|
|
4
|
+
import { senderKeyPairs } from './actor.js';
|
|
5
|
+
/**
|
|
6
|
+
* The names and faces of the fediverse actors who are not followers
|
|
7
|
+
* (TASK-184).
|
|
8
|
+
*
|
|
9
|
+
* A follower is named from the profile it published when it followed. Anybody
|
|
10
|
+
* else who liked, boosted, answered or quoted a post used to be named by a
|
|
11
|
+
* guess at their handle from the last segment of their actor URL, and a
|
|
12
|
+
* current Mastodon mints ids like `/ap/users/117132440785278319`, which hold
|
|
13
|
+
* no name at all. So the actor document is read when one of their activities
|
|
14
|
+
* arrives, and what it says is kept in the `actor_profiles` cache.
|
|
15
|
+
*
|
|
16
|
+
* Nothing here runs while a page is served. {@link ActorProfileService.capture}
|
|
17
|
+
* is how the inbox asks for a profile, and it hands back nothing to wait on;
|
|
18
|
+
* the sweep fetches every inbox actor with no profile or a stale one, which is
|
|
19
|
+
* the backfill of a log written before this existed, the refresh of profiles
|
|
20
|
+
* that have changed, and the rebuild after the database has been deleted
|
|
21
|
+
* (decision-9) all at once.
|
|
22
|
+
*/
|
|
23
|
+
/** How old a stored profile gets before the sweep fetches it again. */
|
|
24
|
+
export const PROFILE_MAX_AGE_MS = 7 * 24 * 60 * 60 * 1000;
|
|
25
|
+
/** How long an actor whose document could not be read is left alone. */
|
|
26
|
+
export const PROFILE_RETRY_MS = 60 * 60 * 1000;
|
|
27
|
+
/** How often the sweep runs. */
|
|
28
|
+
export const PROFILE_SWEEP_MS = 6 * 60 * 60 * 1000;
|
|
29
|
+
/**
|
|
30
|
+
* The site's {@link ActorProfileLoader}: a GET of the actor document, signed
|
|
31
|
+
* as the site's first account.
|
|
32
|
+
*
|
|
33
|
+
* Signed because mastodon.social, like any server in authorized fetch mode,
|
|
34
|
+
* answers an unsigned request for an actor with a 401. The inbox verifies a
|
|
35
|
+
* delivery's signature with a fetch signed as the recipient, which is why the
|
|
36
|
+
* activity got in at all; the sweep has no recipient, and the first account is
|
|
37
|
+
* the one that can be chosen without asking, as it is for a relay.
|
|
38
|
+
*/
|
|
39
|
+
export function signedProfileLoader(contextOf) {
|
|
40
|
+
return async (actorId) => {
|
|
41
|
+
const context = contextOf();
|
|
42
|
+
const signer = primaryUser(context.data.config.dataDir);
|
|
43
|
+
const [key] = signer === undefined ? [] : await senderKeyPairs(context, signer);
|
|
44
|
+
const loaders = {
|
|
45
|
+
documentLoader: key === undefined ? context.documentLoader : context.getDocumentLoader(key),
|
|
46
|
+
contextLoader: context.contextLoader,
|
|
47
|
+
};
|
|
48
|
+
const found = await context.lookupObject(actorId, loaders);
|
|
49
|
+
return isActor(found) ? await profileFrom(found, loaders) : undefined;
|
|
50
|
+
};
|
|
51
|
+
}
|
|
52
|
+
/** Build the profile service for one site. */
|
|
53
|
+
export function createActorProfileService(options) {
|
|
54
|
+
const { admin, config, load } = options;
|
|
55
|
+
const timers = options.timers ?? systemNotificationTimers;
|
|
56
|
+
const logger = options.logger ?? console;
|
|
57
|
+
const inFlight = new Map();
|
|
58
|
+
/** When each actor last failed to load, in milliseconds. Lost on restart, which only means one more try. */
|
|
59
|
+
const failedAt = new Map();
|
|
60
|
+
let sweeping = Promise.resolve();
|
|
61
|
+
let handle;
|
|
62
|
+
const now = () => config.now().getTime();
|
|
63
|
+
function failedRecently(actorId) {
|
|
64
|
+
const at = failedAt.get(actorId);
|
|
65
|
+
return at !== undefined && now() - at < PROFILE_RETRY_MS;
|
|
66
|
+
}
|
|
67
|
+
/** Fetch one profile into the cache, once at a time per actor. */
|
|
68
|
+
function refresh(actorId) {
|
|
69
|
+
const running = inFlight.get(actorId);
|
|
70
|
+
if (running !== undefined)
|
|
71
|
+
return running;
|
|
72
|
+
const started = fetchInto(actorId).finally(() => inFlight.delete(actorId));
|
|
73
|
+
inFlight.set(actorId, started);
|
|
74
|
+
return started;
|
|
75
|
+
}
|
|
76
|
+
async function fetchInto(actorId) {
|
|
77
|
+
let profile;
|
|
78
|
+
try {
|
|
79
|
+
profile = await load(actorId);
|
|
80
|
+
}
|
|
81
|
+
catch (thrown) {
|
|
82
|
+
logger.warn(`Could not read the actor ${actorId}: ${messageOf(thrown)}`);
|
|
83
|
+
}
|
|
84
|
+
if (profile === undefined) {
|
|
85
|
+
failedAt.set(actorId, now());
|
|
86
|
+
return;
|
|
87
|
+
}
|
|
88
|
+
failedAt.delete(actorId);
|
|
89
|
+
// Keyed by the id the activity named, which is the one a conversation
|
|
90
|
+
// looks up, whatever the document calls itself.
|
|
91
|
+
admin.putActorProfile({
|
|
92
|
+
...profile,
|
|
93
|
+
actorId,
|
|
94
|
+
fetchedAt: config.now().toISOString(),
|
|
95
|
+
});
|
|
96
|
+
}
|
|
97
|
+
async function sweepOnce() {
|
|
98
|
+
const due = admin.listActorsToProfile(new Date(now() - PROFILE_MAX_AGE_MS).toISOString());
|
|
99
|
+
for (const actorId of due) {
|
|
100
|
+
if (failedRecently(actorId))
|
|
101
|
+
continue;
|
|
102
|
+
await refresh(actorId);
|
|
103
|
+
}
|
|
104
|
+
}
|
|
105
|
+
return {
|
|
106
|
+
capture(actorId) {
|
|
107
|
+
if (inFlight.has(actorId) || failedRecently(actorId))
|
|
108
|
+
return;
|
|
109
|
+
if (admin.getActorProfile(actorId) !== undefined)
|
|
110
|
+
return;
|
|
111
|
+
if (admin.listFollowers().some((follower) => follower.actorId === actorId))
|
|
112
|
+
return;
|
|
113
|
+
void refresh(actorId);
|
|
114
|
+
},
|
|
115
|
+
sweep() {
|
|
116
|
+
const next = sweeping.then(sweepOnce).catch((thrown) => {
|
|
117
|
+
logger.warn(`The actor profile sweep failed: ${messageOf(thrown)}`);
|
|
118
|
+
});
|
|
119
|
+
sweeping = next;
|
|
120
|
+
return next;
|
|
121
|
+
},
|
|
122
|
+
start() {
|
|
123
|
+
if (handle !== undefined)
|
|
124
|
+
return;
|
|
125
|
+
void this.sweep();
|
|
126
|
+
handle = timers.set(() => void this.sweep(), PROFILE_SWEEP_MS);
|
|
127
|
+
},
|
|
128
|
+
stop() {
|
|
129
|
+
if (handle !== undefined)
|
|
130
|
+
timers.clear(handle);
|
|
131
|
+
handle = undefined;
|
|
132
|
+
},
|
|
133
|
+
async settled() {
|
|
134
|
+
await sweeping;
|
|
135
|
+
await Promise.all([...inFlight.values()]);
|
|
136
|
+
},
|
|
137
|
+
};
|
|
138
|
+
}
|
|
139
|
+
/**
|
|
140
|
+
* What an actor document says about how to show its actor. The one reading of
|
|
141
|
+
* a profile, shared by a follow and by the profile cache, so a follower and a
|
|
142
|
+
* stranger are named by the same rule.
|
|
143
|
+
*
|
|
144
|
+
* The handle is built from the document rather than from WebFinger: a
|
|
145
|
+
* canonical one would take a round trip per actor to confirm the host, and
|
|
146
|
+
* this is display data. The id is what identifies the actor, and the id is
|
|
147
|
+
* what every other part of the system keys on.
|
|
148
|
+
*/
|
|
149
|
+
export async function profileFrom(actor, loaders) {
|
|
150
|
+
if (actor.id === null)
|
|
151
|
+
return undefined;
|
|
152
|
+
const icon = await actor.getIcon({ ...loaders, suppressError: true });
|
|
153
|
+
const username = actor.preferredUsername;
|
|
154
|
+
return {
|
|
155
|
+
actorId: actor.id.href,
|
|
156
|
+
handle: username === null ? null : `@${username.toString()}@${actor.id.host}`,
|
|
157
|
+
name: actor.name === null ? null : actor.name.toString(),
|
|
158
|
+
iconUrl: linkHref(icon?.url ?? null) ?? actor.iconId?.href ?? null,
|
|
159
|
+
url: linkHref(actor.url) ?? null,
|
|
160
|
+
};
|
|
161
|
+
}
|
|
162
|
+
/** A `URL` or a `Link` as a plain href, or `null`. */
|
|
163
|
+
function linkHref(value) {
|
|
164
|
+
if (value === null)
|
|
165
|
+
return null;
|
|
166
|
+
return value instanceof URL ? value.href : (value.href?.href ?? null);
|
|
167
|
+
}
|
|
168
|
+
function messageOf(thrown) {
|
|
169
|
+
return thrown instanceof Error ? thrown.message : String(thrown);
|
|
170
|
+
}
|
|
171
|
+
//# sourceMappingURL=profiles.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"profiles.js","sourceRoot":"","sources":["../../src/federation/profiles.ts"],"names":[],"mappings":"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"}
|
|
@@ -3,7 +3,7 @@ import type { Recipient } from '@fedify/vocab';
|
|
|
3
3
|
import type { AdminStore, Relay } from '../admin/store.ts';
|
|
4
4
|
import type { ResolvedConfig } from '../config.ts';
|
|
5
5
|
import type { ContentStore } from '../content/store.ts';
|
|
6
|
-
import type { SiteFederation } from './federation.ts';
|
|
6
|
+
import type { FederationContextData, SiteFederation } from './federation.ts';
|
|
7
7
|
/** Where a relay reports what it could not do. `console` will do. */
|
|
8
8
|
export interface RelayLogger {
|
|
9
9
|
warn(message: string): void;
|
|
@@ -18,6 +18,8 @@ export interface CreateRelayServiceOptions {
|
|
|
18
18
|
store: ContentStore;
|
|
19
19
|
/** Config after defaults and environment overrides. */
|
|
20
20
|
config: ResolvedConfig;
|
|
21
|
+
/** What the federation context carries for the inbox; nothing here calls it. */
|
|
22
|
+
actorProfiles: FederationContextData['actorProfiles'];
|
|
21
23
|
/** Where failures are reported. Defaults to `console`. */
|
|
22
24
|
logger?: RelayLogger | undefined;
|
|
23
25
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"relays.d.ts","sourceRoot":"","sources":["../../src/federation/relays.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,MAAM,EAA6B,MAAM,EAAQ,MAAM,eAAe,CAAC;AAChF,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,eAAe,CAAC;AAK/C,OAAO,KAAK,EAAE,UAAU,EAAE,KAAK,EAAE,MAAM,mBAAmB,CAAC;AAC3D,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,cAAc,CAAC;AACnD,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AAExD,OAAO,KAAK,
|
|
1
|
+
{"version":3,"file":"relays.d.ts","sourceRoot":"","sources":["../../src/federation/relays.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,MAAM,EAA6B,MAAM,EAAQ,MAAM,eAAe,CAAC;AAChF,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,eAAe,CAAC;AAK/C,OAAO,KAAK,EAAE,UAAU,EAAE,KAAK,EAAE,MAAM,mBAAmB,CAAC;AAC3D,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,cAAc,CAAC;AACnD,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AAExD,OAAO,KAAK,EAAE,qBAAqB,EAAE,cAAc,EAAE,MAAM,iBAAiB,CAAC;AAE7E,qEAAqE;AACrE,MAAM,WAAW,WAAW;IAC1B,IAAI,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;CAC7B;AAED,6CAA6C;AAC7C,MAAM,WAAW,yBAAyB;IACxC,gFAAgF;IAChF,UAAU,EAAE,cAAc,CAAC;IAC3B,6EAA6E;IAC7E,KAAK,EAAE,UAAU,CAAC;IAClB,yEAAyE;IACzE,KAAK,EAAE,YAAY,CAAC;IACpB,uDAAuD;IACvD,MAAM,EAAE,cAAc,CAAC;IACvB,gFAAgF;IAChF,aAAa,EAAE,qBAAqB,CAAC,eAAe,CAAC,CAAC;IACtD,0DAA0D;IAC1D,MAAM,CAAC,EAAE,WAAW,GAAG,SAAS,CAAC;CAClC;AAED,sDAAsD;AACtD,MAAM,WAAW,eAAe;IAC9B,oFAAoF;IACpF,QAAQ,CAAC,QAAQ,EAAE,SAAS,MAAM,EAAE,CAAC;IACrC,mEAAmE;IACnE,QAAQ,CAAC,UAAU,EAAE,SAAS,MAAM,EAAE,CAAC;CACxC;AAED;;;;;;;;GAQG;AACH,MAAM,WAAW,YAAY;IAC3B;;;;;;;;OAQG;IACH,IAAI,IAAI,eAAe,CAAC;IACxB;;;;OAIG;IACH,KAAK,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,KAAK,GAAG,SAAS,CAAC,CAAC;IACnD,uFAAuF;IACvF,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;CAC1B;AAED;;;;;;;;;GASG;AACH,wBAAgB,cAAc,CAAC,KAAK,EAAE,KAAK,GAAG,SAAS,CAKtD;AAED;;;;;;;GAOG;AACH,wBAAgB,cAAc,CAAC,KAAK,EAAE,UAAU,GAAG,KAAK,EAAE,CAEzD;AAED;;;;;;;;GAQG;AACH,wBAAgB,kBAAkB,CAAC,OAAO,EAAE,yBAAyB,GAAG,YAAY,CA8MnF;AAED;;;;;;;;GAQG;AACH,wBAAgB,WAAW,CAAC,KAAK,EAAE,UAAU,EAAE,QAAQ,EAAE,MAAM,GAAG,KAAK,GAAG,SAAS,CASlF;AAED,+EAA+E;AAC/E,wBAAgB,WAAW,CAAC,KAAK,EAAE,UAAU,EAAE,QAAQ,EAAE,MAAM,GAAG,KAAK,GAAG,SAAS,CASlF;AAED;;;;;;;;;;GAUG;AACH,wBAAgB,cAAc,CAAC,KAAK,EAAE,UAAU,EAAE,QAAQ,EAAE,MAAM,GAAG,MAAM,GAAG,KAAK,GAAG,SAAS,CAoB9F"}
|
|
@@ -53,7 +53,12 @@ export function createRelayService(options) {
|
|
|
53
53
|
}
|
|
54
54
|
/** A context outside any request, which is where a follow is sent from. */
|
|
55
55
|
function relayContext() {
|
|
56
|
-
return federation.createContext(new URL(config.baseUrl), {
|
|
56
|
+
return federation.createContext(new URL(config.baseUrl), {
|
|
57
|
+
admin,
|
|
58
|
+
store,
|
|
59
|
+
config,
|
|
60
|
+
actorProfiles: options.actorProfiles,
|
|
61
|
+
});
|
|
57
62
|
}
|
|
58
63
|
/**
|
|
59
64
|
* Who subscribes to a relay: the site's first account (decision-14).
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"relays.js","sourceRoot":"","sources":["../../src/federation/relays.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAGzC,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,iBAAiB,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,eAAe,CAAC;AAGhF,OAAO,EAAE,WAAW,EAAE,MAAM,sBAAsB,CAAC;AAEnD,OAAO,EAAE,gBAAgB,EAAE,MAAM,sBAAsB,CAAC;AAIxD,OAAO,EAAE,OAAO,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;
|
|
1
|
+
{"version":3,"file":"relays.js","sourceRoot":"","sources":["../../src/federation/relays.ts"],"names":[],"mappings":"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"}
|
|
@@ -69,12 +69,21 @@ export declare function quoteFrom(activity: InboxActivity): Quote | undefined;
|
|
|
69
69
|
/**
|
|
70
70
|
* `@user@host` for an actor URL, or `undefined` when the URL implies none.
|
|
71
71
|
*
|
|
72
|
-
* A guess, and
|
|
73
|
-
*
|
|
74
|
-
*
|
|
75
|
-
*
|
|
72
|
+
* A guess, and the last resort: a follower is named from the profile it
|
|
73
|
+
* published when it followed, and anybody else from the profile the site
|
|
74
|
+
* fetched when they were first heard from (TASK-184). This is for an actor
|
|
75
|
+
* neither of those knows yet.
|
|
76
|
+
*
|
|
77
|
+
* An id whose last segment is a number implies nothing. A current Mastodon
|
|
78
|
+
* mints `/ap/users/117132440785278319`, and a number is nobody's handle.
|
|
76
79
|
*/
|
|
77
80
|
export declare function actorHandle(actorId: string): string | undefined;
|
|
81
|
+
/**
|
|
82
|
+
* The best name an actor URL alone gives: the handle it implies, else the
|
|
83
|
+
* server it is on, else the id itself. What a conversation shows for an actor
|
|
84
|
+
* the site has no profile of.
|
|
85
|
+
*/
|
|
86
|
+
export declare function guessedName(actorId: string): string;
|
|
78
87
|
/**
|
|
79
88
|
* What a stored activity replies to, or `null` when it replies to nothing.
|
|
80
89
|
*
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"replies.d.ts","sourceRoot":"","sources":["../../src/federation/replies.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAC;AAEvD,kFAAkF;AAClF,eAAO,MAAM,mBAAmB,WAAW,CAAC;AAE5C,qEAAqE;AACrE,MAAM,WAAW,KAAK;IACpB,gFAAgF;IAChF,EAAE,EAAE,MAAM,CAAC;IACX,2DAA2D;IAC3D,GAAG,EAAE,MAAM,CAAC;IACZ,uCAAuC;IACvC,MAAM,EAAE,MAAM,CAAC;IACf,8BAA8B;IAC9B,OAAO,EAAE,MAAM,CAAC;IAChB;;;;;OAKG;IACH,IAAI,EAAE,MAAM,CAAC;IACb,6EAA6E;IAC7E,SAAS,EAAE,IAAI,CAAC;IAChB,0DAA0D;IAC1D,SAAS,EAAE,MAAM,CAAC;CACnB;AAED;;;;;;;;;GASG;AACH,wBAAgB,SAAS,CACvB,QAAQ,EAAE,aAAa,EACvB,OAAO,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,MAAM,GAAG,SAAS,GAChD,KAAK,GAAG,SAAS,CAYnB;AAED,mFAAmF;AACnF,MAAM,WAAW,KAAK;IACpB,uDAAuD;IACvD,EAAE,EAAE,MAAM,CAAC;IACX,0DAA0D;IAC1D,GAAG,EAAE,MAAM,CAAC;IACZ,8BAA8B;IAC9B,OAAO,EAAE,MAAM,CAAC;IAChB,0EAA0E;IAC1E,IAAI,EAAE,MAAM,CAAC;IACb,6EAA6E;IAC7E,SAAS,EAAE,IAAI,CAAC;IAChB,4BAA4B;IAC5B,MAAM,EAAE,MAAM,CAAC;CAChB;AASD;;;;;;GAMG;AACH,wBAAgB,SAAS,CAAC,QAAQ,EAAE,aAAa,GAAG,KAAK,GAAG,SAAS,CASpE;AA8BD
|
|
1
|
+
{"version":3,"file":"replies.d.ts","sourceRoot":"","sources":["../../src/federation/replies.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAC;AAEvD,kFAAkF;AAClF,eAAO,MAAM,mBAAmB,WAAW,CAAC;AAE5C,qEAAqE;AACrE,MAAM,WAAW,KAAK;IACpB,gFAAgF;IAChF,EAAE,EAAE,MAAM,CAAC;IACX,2DAA2D;IAC3D,GAAG,EAAE,MAAM,CAAC;IACZ,uCAAuC;IACvC,MAAM,EAAE,MAAM,CAAC;IACf,8BAA8B;IAC9B,OAAO,EAAE,MAAM,CAAC;IAChB;;;;;OAKG;IACH,IAAI,EAAE,MAAM,CAAC;IACb,6EAA6E;IAC7E,SAAS,EAAE,IAAI,CAAC;IAChB,0DAA0D;IAC1D,SAAS,EAAE,MAAM,CAAC;CACnB;AAED;;;;;;;;;GASG;AACH,wBAAgB,SAAS,CACvB,QAAQ,EAAE,aAAa,EACvB,OAAO,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,MAAM,GAAG,SAAS,GAChD,KAAK,GAAG,SAAS,CAYnB;AAED,mFAAmF;AACnF,MAAM,WAAW,KAAK;IACpB,uDAAuD;IACvD,EAAE,EAAE,MAAM,CAAC;IACX,0DAA0D;IAC1D,GAAG,EAAE,MAAM,CAAC;IACZ,8BAA8B;IAC9B,OAAO,EAAE,MAAM,CAAC;IAChB,0EAA0E;IAC1E,IAAI,EAAE,MAAM,CAAC;IACb,6EAA6E;IAC7E,SAAS,EAAE,IAAI,CAAC;IAChB,4BAA4B;IAC5B,MAAM,EAAE,MAAM,CAAC;CAChB;AASD;;;;;;GAMG;AACH,wBAAgB,SAAS,CAAC,QAAQ,EAAE,aAAa,GAAG,KAAK,GAAG,SAAS,CASpE;AA8BD;;;;;;;;;;GAUG;AACH,wBAAgB,WAAW,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,CAc/D;AAED;;;;GAIG;AACH,wBAAgB,WAAW,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,CAQnD;AAED;;;;;;;;;;GAUG;AACH,wBAAgB,aAAa,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAIzD;AAiBD;;;;;;;;;;;GAWG;AACH,wBAAgB,KAAK,CAAC,KAAK,EAAE,OAAO,GAAG,MAAM,GAAG,IAAI,CAkBnD"}
|
|
@@ -28,7 +28,7 @@ export function replyFrom(activity, nameFor) {
|
|
|
28
28
|
return undefined;
|
|
29
29
|
return {
|
|
30
30
|
...note.said,
|
|
31
|
-
author: nameFor?.(note.said.actorId) ??
|
|
31
|
+
author: nameFor?.(note.said.actorId) ?? guessedName(note.said.actorId),
|
|
32
32
|
inReplyTo,
|
|
33
33
|
};
|
|
34
34
|
}
|
|
@@ -81,10 +81,13 @@ function noteFrom(activity) {
|
|
|
81
81
|
/**
|
|
82
82
|
* `@user@host` for an actor URL, or `undefined` when the URL implies none.
|
|
83
83
|
*
|
|
84
|
-
* A guess, and
|
|
85
|
-
*
|
|
86
|
-
*
|
|
87
|
-
*
|
|
84
|
+
* A guess, and the last resort: a follower is named from the profile it
|
|
85
|
+
* published when it followed, and anybody else from the profile the site
|
|
86
|
+
* fetched when they were first heard from (TASK-184). This is for an actor
|
|
87
|
+
* neither of those knows yet.
|
|
88
|
+
*
|
|
89
|
+
* An id whose last segment is a number implies nothing. A current Mastodon
|
|
90
|
+
* mints `/ap/users/117132440785278319`, and a number is nobody's handle.
|
|
88
91
|
*/
|
|
89
92
|
export function actorHandle(actorId) {
|
|
90
93
|
let url;
|
|
@@ -98,10 +101,26 @@ export function actorHandle(actorId) {
|
|
|
98
101
|
.split('/')
|
|
99
102
|
.filter((segment) => segment !== '')
|
|
100
103
|
.pop();
|
|
101
|
-
if (last === undefined || last === '')
|
|
104
|
+
if (last === undefined || last === '' || /^\d+$/.test(last))
|
|
102
105
|
return undefined;
|
|
103
106
|
return `@${last.replace(/^@/, '')}@${url.host}`;
|
|
104
107
|
}
|
|
108
|
+
/**
|
|
109
|
+
* The best name an actor URL alone gives: the handle it implies, else the
|
|
110
|
+
* server it is on, else the id itself. What a conversation shows for an actor
|
|
111
|
+
* the site has no profile of.
|
|
112
|
+
*/
|
|
113
|
+
export function guessedName(actorId) {
|
|
114
|
+
const handle = actorHandle(actorId);
|
|
115
|
+
if (handle !== undefined)
|
|
116
|
+
return handle;
|
|
117
|
+
try {
|
|
118
|
+
return new URL(actorId).host;
|
|
119
|
+
}
|
|
120
|
+
catch {
|
|
121
|
+
return actorId;
|
|
122
|
+
}
|
|
123
|
+
}
|
|
105
124
|
/**
|
|
106
125
|
* What a stored activity replies to, or `null` when it replies to nothing.
|
|
107
126
|
*
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"replies.js","sourceRoot":"","sources":["../../src/federation/replies.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAIH,kFAAkF;AAClF,MAAM,CAAC,MAAM,mBAAmB,GAAG,QAAQ,CAAC;AAyB5C;;;;;;;;;GASG;AACH,MAAM,UAAU,SAAS,CACvB,QAAuB,EACvB,OAAiD;IAEjD,MAAM,IAAI,GAAG,QAAQ,CAAC,QAAQ,CAAC,CAAC;IAChC,IAAI,IAAI,KAAK,SAAS;QAAE,OAAO,SAAS,CAAC;IAEzC,MAAM,SAAS,GAAG,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,WAAW,CAAC,CAAC,CAAC;IAClD,IAAI,SAAS,KAAK,IAAI;QAAE,OAAO,SAAS,CAAC;IAEzC,OAAO;QACL,GAAG,IAAI,CAAC,IAAI;QACZ,MAAM,EAAE,OAAO,EAAE,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,IAAI,WAAW,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC
|
|
1
|
+
{"version":3,"file":"replies.js","sourceRoot":"","sources":["../../src/federation/replies.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAIH,kFAAkF;AAClF,MAAM,CAAC,MAAM,mBAAmB,GAAG,QAAQ,CAAC;AAyB5C;;;;;;;;;GASG;AACH,MAAM,UAAU,SAAS,CACvB,QAAuB,EACvB,OAAiD;IAEjD,MAAM,IAAI,GAAG,QAAQ,CAAC,QAAQ,CAAC,CAAC;IAChC,IAAI,IAAI,KAAK,SAAS;QAAE,OAAO,SAAS,CAAC;IAEzC,MAAM,SAAS,GAAG,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,WAAW,CAAC,CAAC,CAAC;IAClD,IAAI,SAAS,KAAK,IAAI;QAAE,OAAO,SAAS,CAAC;IAEzC,OAAO;QACL,GAAG,IAAI,CAAC,IAAI;QACZ,MAAM,EAAE,OAAO,EAAE,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,IAAI,WAAW,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC;QACtE,SAAS;KACV,CAAC;AACJ,CAAC;AAkBD;;;;GAIG;AACH,MAAM,gBAAgB,GAAG,CAAC,OAAO,EAAE,UAAU,EAAE,UAAU,EAAE,gBAAgB,CAAU,CAAC;AAEtF;;;;;;GAMG;AACH,MAAM,UAAU,SAAS,CAAC,QAAuB;IAC/C,MAAM,IAAI,GAAG,QAAQ,CAAC,QAAQ,CAAC,CAAC;IAChC,IAAI,IAAI,KAAK,SAAS,IAAI,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,WAAW,CAAC,CAAC,KAAK,IAAI;QAAE,OAAO,SAAS,CAAC;IAErF,KAAK,MAAM,QAAQ,IAAI,gBAAgB,EAAE,CAAC;QACxC,MAAM,MAAM,GAAG,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC;QAC5C,IAAI,MAAM,KAAK,IAAI;YAAE,OAAO,EAAE,GAAG,IAAI,CAAC,IAAI,EAAE,MAAM,EAAE,CAAC;IACvD,CAAC;IACD,OAAO,SAAS,CAAC;AACnB,CAAC;AAED,kEAAkE;AAClE,SAAS,QAAQ,CAAC,QAAuB;IAMvC,IAAI,QAAQ,CAAC,YAAY,KAAK,mBAAmB;QAAE,OAAO,SAAS,CAAC;IAEpE,MAAM,MAAM,GAAG,cAAc,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC;IAC7C,IAAI,MAAM,KAAK,SAAS;QAAE,OAAO,SAAS,CAAC;IAE3C,MAAM,EAAE,GAAG,KAAK,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,IAAI,QAAQ,CAAC,QAAQ,CAAC;IACpD,IAAI,EAAE,KAAK,IAAI;QAAE,OAAO,SAAS,CAAC;IAElC,MAAM,SAAS,GAAG,IAAI,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,WAAW,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC;IAC9D,OAAO;QACL,MAAM;QACN,IAAI,EAAE;YACJ,EAAE;YACF,GAAG,EAAE,KAAK,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,IAAI,EAAE;YAC/B,OAAO,EAAE,QAAQ,CAAC,OAAO;YACzB,IAAI,EAAE,MAAM,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC,IAAI,YAAY,CAAC,MAAM,CAAC,YAAY,CAAC,CAAC,IAAI,EAAE;YAC3E,SAAS,EAAE,MAAM,CAAC,KAAK,CAAC,SAAS,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC,CAAC,IAAI,IAAI,CAAC,QAAQ,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,SAAS;SACzF;KACF,CAAC;AACJ,CAAC;AAED;;;;;;;;;;GAUG;AACH,MAAM,UAAU,WAAW,CAAC,OAAe;IACzC,IAAI,GAAQ,CAAC;IACb,IAAI,CAAC;QACH,GAAG,GAAG,IAAI,GAAG,CAAC,OAAO,CAAC,CAAC;IACzB,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,SAAS,CAAC;IACnB,CAAC;IAED,MAAM,IAAI,GAAG,GAAG,CAAC,QAAQ;SACtB,KAAK,CAAC,GAAG,CAAC;SACV,MAAM,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,OAAO,KAAK,EAAE,CAAC;SACnC,GAAG,EAAE,CAAC;IACT,IAAI,IAAI,KAAK,SAAS,IAAI,IAAI,KAAK,EAAE,IAAI,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC;QAAE,OAAO,SAAS,CAAC;IAC9E,OAAO,IAAI,IAAI,CAAC,OAAO,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,GAAG,CAAC,IAAI,EAAE,CAAC;AAClD,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,WAAW,CAAC,OAAe;IACzC,MAAM,MAAM,GAAG,WAAW,CAAC,OAAO,CAAC,CAAC;IACpC,IAAI,MAAM,KAAK,SAAS;QAAE,OAAO,MAAM,CAAC;IACxC,IAAI,CAAC;QACH,OAAO,IAAI,GAAG,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC;IAC/B,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,OAAO,CAAC;IACjB,CAAC;AACH,CAAC;AAED;;;;;;;;;;GAUG;AACH,MAAM,UAAU,aAAa,CAAC,IAAY;IACxC,MAAM,MAAM,GAAG,cAAc,CAAC,IAAI,CAAC,CAAC;IACpC,IAAI,MAAM,KAAK,SAAS;QAAE,OAAO,IAAI,CAAC;IACtC,OAAO,KAAK,CAAC,MAAM,CAAC,WAAW,CAAC,CAAC,CAAC;AACpC,CAAC;AAED,kFAAkF;AAClF,SAAS,cAAc,CAAC,IAAY;IAClC,IAAI,MAAe,CAAC;IACpB,IAAI,CAAC;QACH,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;IAC5B,CAAC;IAAC,MAAM,CAAC;QACP,sEAAsE;QACtE,OAAO,SAAS,CAAC;IACnB,CAAC;IACD,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC;QAAE,OAAO,SAAS,CAAC;IAExC,MAAM,MAAM,GAAG,MAAM,CAAC,QAAQ,CAAC,CAAC;IAChC,OAAO,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,SAAS,CAAC;AAC/C,CAAC;AAED;;;;;;;;;;;GAWG;AACH,MAAM,UAAU,KAAK,CAAC,KAAc;IAClC,IAAI,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC;QACzB,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;YACzB,MAAM,KAAK,GAAG,KAAK,CAAC,IAAI,CAAC,CAAC;YAC1B,IAAI,KAAK,KAAK,IAAI;gBAAE,OAAO,KAAK,CAAC;QACnC,CAAC;QACD,OAAO,IAAI,CAAC;IACd,CAAC;IACD,4EAA4E;IAC5E,yDAAyD;IACzD,IAAI,QAAQ,CAAC,KAAK,CAAC;QAAE,OAAO,KAAK,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,KAAK,CAAC,KAAK,CAAC,IAAI,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC;IAChF,IAAI,OAAO,KAAK,KAAK,QAAQ;QAAE,OAAO,IAAI,CAAC;IAE3C,IAAI,CAAC;QACH,OAAO,IAAI,GAAG,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC;IAC7B,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,IAAI,CAAC;IACd,CAAC;AACH,CAAC;AAED,kEAAkE;AAClE,SAAS,MAAM,CAAC,KAAc;IAC5B,IAAI,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC;QACzB,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;YACzB,MAAM,KAAK,GAAG,MAAM,CAAC,IAAI,CAAC,CAAC;YAC3B,IAAI,KAAK,KAAK,SAAS;gBAAE,OAAO,KAAK,CAAC;QACxC,CAAC;QACD,OAAO,SAAS,CAAC;IACnB,CAAC;IACD,IAAI,QAAQ,CAAC,KAAK,CAAC;QAAE,OAAO,MAAM,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC,CAAC;IACpD,OAAO,OAAO,KAAK,KAAK,QAAQ,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,SAAS,CAAC;AACvD,CAAC;AAED;;;;GAIG;AACH,SAAS,YAAY,CAAC,KAAc;IAClC,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC;QAAE,OAAO,SAAS,CAAC;IACvC,KAAK,MAAM,KAAK,IAAI,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC;QACzC,MAAM,KAAK,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC;QAC5B,IAAI,KAAK,KAAK,SAAS;YAAE,OAAO,KAAK,CAAC;IACxC,CAAC;IACD,OAAO,SAAS,CAAC;AACnB,CAAC;AAED,SAAS,QAAQ,CAAC,KAAc;IAC9B,OAAO,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,KAAK,IAAI,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;AAC9E,CAAC"}
|
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Alt text for the media library.
|
|
3
|
+
*
|
|
4
|
+
* It is kept in one JSON object keyed by the upload's path under
|
|
5
|
+
* `content/uploads/`, beside `site.json` in `content/_data/`: it is public,
|
|
6
|
+
* it cannot be derived from anything, and so it is a file (decision-9). An
|
|
7
|
+
* entry is `{"alt": "A dog asleep on a rug"}` or `{"decorative": true}`; an
|
|
8
|
+
* upload with no entry has no alt text yet, which is the case to fix.
|
|
9
|
+
*
|
|
10
|
+
* The library's text is what an image is offered with when it is inserted.
|
|
11
|
+
* Once inserted, the post's own `` is the alt text for that use, since
|
|
12
|
+
* the same picture can need describing differently in two posts.
|
|
13
|
+
*/
|
|
14
|
+
/** Where the library's alt text is kept, relative to the content directory. */
|
|
15
|
+
export declare const MEDIA_FILE = "_data/media.json";
|
|
16
|
+
/** What the library says about how an image is read to somebody who cannot see it. */
|
|
17
|
+
export type AltText = {
|
|
18
|
+
kind: 'described';
|
|
19
|
+
text: string;
|
|
20
|
+
} | {
|
|
21
|
+
kind: 'decorative';
|
|
22
|
+
};
|
|
23
|
+
/** Every upload's alt text, by its path under `content/uploads/`. */
|
|
24
|
+
export type AltTextLibrary = ReadonlyMap<string, AltText>;
|
|
25
|
+
/** The library, parsed only when the file's bytes changed since the last read. */
|
|
26
|
+
export declare function readAltTexts(contentDir: string): AltTextLibrary;
|
|
27
|
+
/**
|
|
28
|
+
* Set one upload's alt text, or forget it when `alt` is `undefined`.
|
|
29
|
+
*
|
|
30
|
+
* Keys the form does not manage are kept, so a hand-edited entry for another
|
|
31
|
+
* file survives an edit to this one.
|
|
32
|
+
*/
|
|
33
|
+
export declare function writeAltText(contentDir: string, source: string, alt: AltText | undefined): Promise<void>;
|
|
34
|
+
/** An image in a document that tells a reader who cannot see it nothing. */
|
|
35
|
+
export interface UndescribedImage {
|
|
36
|
+
/** The `src` as the document wrote it. */
|
|
37
|
+
src: string;
|
|
38
|
+
/** The last segment of its path, which is how a warning names it. */
|
|
39
|
+
name: string;
|
|
40
|
+
}
|
|
41
|
+
/**
|
|
42
|
+
* Every image in a document's HTML whose alt text is missing.
|
|
43
|
+
*
|
|
44
|
+
* An image is described when its own `alt` says something. An empty `alt` is
|
|
45
|
+
* a deliberate silence only when the library marks that upload decorative;
|
|
46
|
+
* anywhere else it is the silence of somebody who never got round to it. A tag
|
|
47
|
+
* with no `alt` at all is always missing, because a screen reader then reads
|
|
48
|
+
* out the file name.
|
|
49
|
+
*/
|
|
50
|
+
export declare function undescribedImages(html: string, library: AltTextLibrary): UndescribedImage[];
|
|
51
|
+
//# sourceMappingURL=alt-text.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"alt-text.d.ts","sourceRoot":"","sources":["../../src/images/alt-text.ts"],"names":[],"mappings":"AAMA;;;;;;;;;;;;GAYG;AAEH,+EAA+E;AAC/E,eAAO,MAAM,UAAU,qBAAqB,CAAC;AAE7C,sFAAsF;AACtF,MAAM,MAAM,OAAO,GAAG;IAAE,IAAI,EAAE,WAAW,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,GAAG;IAAE,IAAI,EAAE,YAAY,CAAA;CAAE,CAAC;AAEnF,qEAAqE;AACrE,MAAM,MAAM,cAAc,GAAG,WAAW,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;AAI1D,kFAAkF;AAClF,wBAAgB,YAAY,CAAC,UAAU,EAAE,MAAM,GAAG,cAAc,CAW/D;AAED;;;;;GAKG;AACH,wBAAsB,YAAY,CAChC,UAAU,EAAE,MAAM,EAClB,MAAM,EAAE,MAAM,EACd,GAAG,EAAE,OAAO,GAAG,SAAS,GACvB,OAAO,CAAC,IAAI,CAAC,CAOf;AAED,4EAA4E;AAC5E,MAAM,WAAW,gBAAgB;IAC/B,0CAA0C;IAC1C,GAAG,EAAE,MAAM,CAAC;IACZ,qEAAqE;IACrE,IAAI,EAAE,MAAM,CAAC;CACd;AAED;;;;;;;;GAQG;AACH,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,cAAc,GAAG,gBAAgB,EAAE,CAI3F"}
|
|
@@ -0,0 +1,113 @@
|
|
|
1
|
+
import path from 'node:path';
|
|
2
|
+
import { readFileIfPresentSync, updateFileAtomically } from '../files/atomic.js';
|
|
3
|
+
import { imagesIn } from './markup.js';
|
|
4
|
+
/**
|
|
5
|
+
* Alt text for the media library.
|
|
6
|
+
*
|
|
7
|
+
* It is kept in one JSON object keyed by the upload's path under
|
|
8
|
+
* `content/uploads/`, beside `site.json` in `content/_data/`: it is public,
|
|
9
|
+
* it cannot be derived from anything, and so it is a file (decision-9). An
|
|
10
|
+
* entry is `{"alt": "A dog asleep on a rug"}` or `{"decorative": true}`; an
|
|
11
|
+
* upload with no entry has no alt text yet, which is the case to fix.
|
|
12
|
+
*
|
|
13
|
+
* The library's text is what an image is offered with when it is inserted.
|
|
14
|
+
* Once inserted, the post's own `` is the alt text for that use, since
|
|
15
|
+
* the same picture can need describing differently in two posts.
|
|
16
|
+
*/
|
|
17
|
+
/** Where the library's alt text is kept, relative to the content directory. */
|
|
18
|
+
export const MEDIA_FILE = '_data/media.json';
|
|
19
|
+
const cache = new Map();
|
|
20
|
+
/** The library, parsed only when the file's bytes changed since the last read. */
|
|
21
|
+
export function readAltTexts(contentDir) {
|
|
22
|
+
const file = mediaFile(contentDir);
|
|
23
|
+
const text = readFileIfPresentSync(file);
|
|
24
|
+
if (text === undefined)
|
|
25
|
+
return new Map();
|
|
26
|
+
const cached = cache.get(file);
|
|
27
|
+
if (cached?.text === text)
|
|
28
|
+
return cached.library;
|
|
29
|
+
const library = parseLibrary(text);
|
|
30
|
+
cache.set(file, { text, library });
|
|
31
|
+
return library;
|
|
32
|
+
}
|
|
33
|
+
/**
|
|
34
|
+
* Set one upload's alt text, or forget it when `alt` is `undefined`.
|
|
35
|
+
*
|
|
36
|
+
* Keys the form does not manage are kept, so a hand-edited entry for another
|
|
37
|
+
* file survives an edit to this one.
|
|
38
|
+
*/
|
|
39
|
+
export async function writeAltText(contentDir, source, alt) {
|
|
40
|
+
await updateFileAtomically(mediaFile(contentDir), (current) => {
|
|
41
|
+
const all = current === undefined ? {} : parseObject(current);
|
|
42
|
+
if (alt === undefined)
|
|
43
|
+
delete all[source];
|
|
44
|
+
else
|
|
45
|
+
all[source] = alt.kind === 'decorative' ? { decorative: true } : { alt: alt.text };
|
|
46
|
+
return `${JSON.stringify(all, null, 2)}\n`;
|
|
47
|
+
});
|
|
48
|
+
}
|
|
49
|
+
/**
|
|
50
|
+
* Every image in a document's HTML whose alt text is missing.
|
|
51
|
+
*
|
|
52
|
+
* An image is described when its own `alt` says something. An empty `alt` is
|
|
53
|
+
* a deliberate silence only when the library marks that upload decorative;
|
|
54
|
+
* anywhere else it is the silence of somebody who never got round to it. A tag
|
|
55
|
+
* with no `alt` at all is always missing, because a screen reader then reads
|
|
56
|
+
* out the file name.
|
|
57
|
+
*/
|
|
58
|
+
export function undescribedImages(html, library) {
|
|
59
|
+
return imagesIn(html)
|
|
60
|
+
.filter((image) => !described(image, library))
|
|
61
|
+
.map((image) => ({ src: image.src, name: imageName(image.src) }));
|
|
62
|
+
}
|
|
63
|
+
function described(image, library) {
|
|
64
|
+
if (image.alt === undefined)
|
|
65
|
+
return false;
|
|
66
|
+
if (image.alt.trim() !== '')
|
|
67
|
+
return true;
|
|
68
|
+
return image.source !== undefined && library.get(image.source)?.kind === 'decorative';
|
|
69
|
+
}
|
|
70
|
+
function imageName(src) {
|
|
71
|
+
const pathname = src.split(/[?#]/)[0] ?? src;
|
|
72
|
+
const name = pathname.slice(pathname.lastIndexOf('/') + 1);
|
|
73
|
+
try {
|
|
74
|
+
return decodeURIComponent(name) || src;
|
|
75
|
+
}
|
|
76
|
+
catch {
|
|
77
|
+
return name || src;
|
|
78
|
+
}
|
|
79
|
+
}
|
|
80
|
+
function mediaFile(contentDir) {
|
|
81
|
+
return path.join(contentDir, ...MEDIA_FILE.split('/'));
|
|
82
|
+
}
|
|
83
|
+
/**
|
|
84
|
+
* The file's entries, each checked, since a person may edit it by hand. An
|
|
85
|
+
* entry that is neither shape is ignored rather than failing a page.
|
|
86
|
+
*/
|
|
87
|
+
function parseLibrary(text) {
|
|
88
|
+
const library = new Map();
|
|
89
|
+
for (const [source, value] of Object.entries(parseObject(text))) {
|
|
90
|
+
if (!isRecord(value))
|
|
91
|
+
continue;
|
|
92
|
+
if (value['decorative'] === true) {
|
|
93
|
+
library.set(source, { kind: 'decorative' });
|
|
94
|
+
}
|
|
95
|
+
else if (typeof value['alt'] === 'string' && value['alt'].trim() !== '') {
|
|
96
|
+
library.set(source, { kind: 'described', text: value['alt'].trim() });
|
|
97
|
+
}
|
|
98
|
+
}
|
|
99
|
+
return library;
|
|
100
|
+
}
|
|
101
|
+
function parseObject(text) {
|
|
102
|
+
try {
|
|
103
|
+
const parsed = JSON.parse(text);
|
|
104
|
+
return isRecord(parsed) ? parsed : {};
|
|
105
|
+
}
|
|
106
|
+
catch {
|
|
107
|
+
return {};
|
|
108
|
+
}
|
|
109
|
+
}
|
|
110
|
+
function isRecord(value) {
|
|
111
|
+
return typeof value === 'object' && value !== null && !Array.isArray(value);
|
|
112
|
+
}
|
|
113
|
+
//# sourceMappingURL=alt-text.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"alt-text.js","sourceRoot":"","sources":["../../src/images/alt-text.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"icons.d.ts","sourceRoot":"","sources":["../../src/images/icons.ts"],"names":[],"mappings":"AAQA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAE9C;;;;;;;;;;;;;;;;;;;GAmBG;AAEH,qCAAqC;AACrC,MAAM,WAAW,QAAQ;IACvB,oCAAoC;IACpC,GAAG,EAAE,MAAM,CAAC;IACZ,sCAAsC;IACtC,KAAK,EAAE,MAAM,CAAC;IACd,6DAA6D;IAC7D,IAAI,EAAE,MAAM,CAAC;CACd;AAwCD,0CAA0C;AAC1C,wBAAgB,YAAY,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAEjD;AAED;;;;;;GAMG;AACH,wBAAgB,QAAQ,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,CAGzD;AAED;;;;;;;GAOG;AACH,wBAAgB,SAAS,CAAC,MAAM,EAAE,WAAW,EAAE,MAAM,EAAE,MAAM,GAAG,SAAS,GAAG,QAAQ,EAAE,
|
|
1
|
+
{"version":3,"file":"icons.d.ts","sourceRoot":"","sources":["../../src/images/icons.ts"],"names":[],"mappings":"AAQA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAE9C;;;;;;;;;;;;;;;;;;;GAmBG;AAEH,qCAAqC;AACrC,MAAM,WAAW,QAAQ;IACvB,oCAAoC;IACpC,GAAG,EAAE,MAAM,CAAC;IACZ,sCAAsC;IACtC,KAAK,EAAE,MAAM,CAAC;IACd,6DAA6D;IAC7D,IAAI,EAAE,MAAM,CAAC;CACd;AAwCD,0CAA0C;AAC1C,wBAAgB,YAAY,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAEjD;AAED;;;;;;GAMG;AACH,wBAAgB,QAAQ,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,CAGzD;AAED;;;;;;;GAOG;AACH,wBAAgB,SAAS,CAAC,MAAM,EAAE,WAAW,EAAE,MAAM,EAAE,MAAM,GAAG,SAAS,GAAG,QAAQ,EAAE,CAYrF;AAED;;;;;;;GAOG;AACH,wBAAsB,cAAc,CAClC,MAAM,EAAE,WAAW,EACnB,MAAM,EAAE,MAAM,EACd,IAAI,EAAE,MAAM,GACX,OAAO,CAAC,OAAO,CAAC,CAuBlB"}
|
package/dist/images/icons.js
CHANGED
|
@@ -3,7 +3,7 @@ import path from 'node:path';
|
|
|
3
3
|
import sharp from 'sharp';
|
|
4
4
|
import { writeFileAtomically } from '../files/atomic.js';
|
|
5
5
|
import { UPLOAD_ASSET_PREFIX } from '../web/assets.js';
|
|
6
|
-
import { derivedDir, sourceFile, VARIANT_ASSET_PREFIX } from './paths.js';
|
|
6
|
+
import { derivedDir, sourceFile, sourceVersion, versioned, VARIANT_ASSET_PREFIX } from './paths.js';
|
|
7
7
|
/**
|
|
8
8
|
* The icons a site offers, in the order the head lists them: the 32 and 16
|
|
9
9
|
* pixel favicons and the 180 pixel touch icon Apple asks for.
|
|
@@ -68,10 +68,11 @@ export function siteIcons(config, avatar) {
|
|
|
68
68
|
const source = iconSource(avatar);
|
|
69
69
|
if (source === undefined)
|
|
70
70
|
return [];
|
|
71
|
+
const version = sourceVersion(config, source);
|
|
71
72
|
return ICONS.map(({ rel, size }) => ({
|
|
72
73
|
rel,
|
|
73
74
|
sizes: `${String(size)}x${String(size)}`,
|
|
74
|
-
href: iconHref(source, size),
|
|
75
|
+
href: versioned(iconHref(source, size), version),
|
|
75
76
|
}));
|
|
76
77
|
}
|
|
77
78
|
/**
|
package/dist/images/icons.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"icons.js","sourceRoot":"","sources":["../../src/images/icons.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,MAAM,kBAAkB,CAAC;AACzC,OAAO,IAAI,MAAM,WAAW,CAAC;AAE7B,OAAO,KAAK,MAAM,OAAO,CAAC;AAE1B,OAAO,EAAE,mBAAmB,EAAE,MAAM,oBAAoB,CAAC;AACzD,OAAO,EAAE,mBAAmB,EAAE,MAAM,kBAAkB,CAAC;AACvD,OAAO,EAAE,UAAU,EAAE,UAAU,EAAE,oBAAoB,EAAE,MAAM,YAAY,CAAC;
|
|
1
|
+
{"version":3,"file":"icons.js","sourceRoot":"","sources":["../../src/images/icons.ts"],"names":[],"mappings":"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"}
|
package/dist/images/index.d.ts
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
export { IMAGE_SIZES, responsiveImages, siteImageMarkup } from './markup.ts';
|
|
2
|
-
export type { DescribeImage } from './markup.ts';
|
|
2
|
+
export type { DescribeImage, ImageLoading } from './markup.ts';
|
|
3
3
|
export { siteIcons } from './icons.ts';
|
|
4
4
|
export type { SiteIcon } from './icons.ts';
|
|
5
5
|
export { describeImage, findImageVariant, generateImageVariants, imageMediaType, removeImageVariants, variantUrl, IMAGE_DIRECTORY, IMAGE_RECORD_NAME, VARIANT_ASSET_PREFIX, } from './variants.ts';
|
|
6
|
-
export type { ImageConfig, ImageRecord, ImageVariant } from './variants.ts';
|
|
6
|
+
export type { DescribedImage, ImageConfig, ImageRecord, ImageVariant } from './variants.ts';
|
|
7
7
|
//# sourceMappingURL=index.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/images/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,gBAAgB,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC;AAC7E,YAAY,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/images/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,gBAAgB,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC;AAC7E,YAAY,EAAE,aAAa,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAC/D,OAAO,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC;AACvC,YAAY,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AAC3C,OAAO,EACL,aAAa,EACb,gBAAgB,EAChB,qBAAqB,EACrB,cAAc,EACd,mBAAmB,EACnB,UAAU,EACV,eAAe,EACf,iBAAiB,EACjB,oBAAoB,GACrB,MAAM,eAAe,CAAC;AACvB,YAAY,EAAE,cAAc,EAAE,WAAW,EAAE,WAAW,EAAE,YAAY,EAAE,MAAM,eAAe,CAAC"}
|