public/manifest.json declares share_target (POST multipart to /share-target: title/text/url + image/video/audio/pdf/text files). The service worker answers that POST itself: it stashes the form in a Cache API bucket and 303s to the in-app /share page, which lists what arrived, offers a room search, and on pick writes the files into that room's upload-board atom (encrypting first for E2EE rooms via the composer's shared filesToUploadItems) and the title/text/url into its draft, then opens the room — the user still presses Send. The stash is cleared once placed; reopening /share afterwards says so. nginx/caddy examples and the prod image config gain a 303 for /share-target so a POST that reaches the origin before the worker controls the page lands on /share instead of a 405. iOS has no share target support and ignores the manifest entry. Verified headless against the built preview: SW-controlled page → POST /share-target (two PNGs + title + text) → /share lists both files and the text → pick the DM → composer shows both files on the upload board and the text in the draft → /share reports nothing pending. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01PPmy3tPq869XDW4njjVaKA
28 lines
885 B
TypeScript
28 lines
885 B
TypeScript
import { test } from 'node:test';
|
|
import assert from 'node:assert/strict';
|
|
import { shareDraftText } from './swShare';
|
|
|
|
const base = { files: [], receivedAt: 0 };
|
|
|
|
test('shareDraftText joins title, text and url', () => {
|
|
assert.equal(
|
|
shareDraftText({ ...base, title: 'A page', text: 'look at this', url: 'https://x.test/p' }),
|
|
'A page\nlook at this\nhttps://x.test/p',
|
|
);
|
|
});
|
|
|
|
test('shareDraftText drops a title/url the text already contains', () => {
|
|
assert.equal(
|
|
shareDraftText({
|
|
...base,
|
|
title: 'A page',
|
|
text: 'A page https://x.test/p',
|
|
url: 'https://x.test/p',
|
|
}),
|
|
'A page https://x.test/p',
|
|
);
|
|
assert.equal(shareDraftText({ ...base, text: 'from the share sheet' }), 'from the share sheet');
|
|
assert.equal(shareDraftText({ ...base, url: 'https://x.test' }), 'https://x.test');
|
|
assert.equal(shareDraftText(base), '');
|
|
});
|