SOURCE / PINNED RELEASE
Made of little things.
Black Site Map Editor
- Release
- 32a57733b7e9…
- Author-recorded commit
- 3f54890f542f…
- License
- LICENSE
- Author’s source reference
- nostr://npub1ye5ptcxfyyxl5vjvdjar2ua3f0hynkjzpx552mu5snj3qmx5pzjscpknpr/wss%3A%2F%2Fgit.shakespeare.diy%2F/black-site-map-editor
Archive hash verified: 7a4b1abbac7db5b0…. The source-to-build association is the author’s claim; it has not been independently rebuilt.
import { intent } from '@napplet/sdk';
import { runtimeHasDomain } from './domain-availability.js';
import { validateMap } from './model';
import type { BlackSiteMap } from './model';
export type MapIntentAction = 'edit' | 'remix' | 'new' | 'open';
export interface MapIntentTarget {
address: string;
author: string;
id: string;
relays: string[];
}
export interface MapIntent {
action: MapIntentAction;
sender: string;
target?: MapIntentTarget;
map?: BlackSiteMap;
}
export const MAP_INTENT_CONVENTIONS = [
'napplet:black-site/map-edit',
'napplet:black-site/map-remix',
'napplet:black-site/map-new',
'napplet:black-site/map-open',
] as const;
const object = (value: unknown): value is Record<string, unknown> =>
Boolean(value) && typeof value === 'object' && !Array.isArray(value);
function boundedJson(value: unknown, maxBytes: number) {
let raw: string | undefined;
try {
raw = JSON.stringify(value);
} catch {
throw new Error('Map intent payload must be plain JSON.');
}
if (raw === undefined || new TextEncoder().encode(raw).length > maxBytes)
throw new Error('Map intent payload exceeds its size limit.');
}
function keysOnly(value: Record<string, unknown>, keys: string[]) {
if (Object.keys(value).some((key) => !keys.includes(key)))
throw new Error('Map intent payload contains unsupported fields.');
}
function relayHint(value: unknown): string {
if (typeof value !== 'string' || value.length > 256)
throw new Error('Map intent relay hints must be public WSS URLs.');
let url: URL;
try {
url = new URL(value);
} catch {
throw new Error('Map intent relay hint is invalid.');
}
if (
url.protocol !== 'wss:' ||
url.username ||
url.password ||
url.hash ||
(url.port && url.port !== '443') ||
url.hostname === 'localhost' ||
url.hostname.endsWith('.localhost') ||
url.hostname.endsWith('.local') ||
url.hostname.startsWith('[') ||
/^\d+(?:\.\d+){3}$/.test(url.hostname)
)
throw new Error('Map intent relay hints must be public WSS URLs on port 443.');
return url.href;
}
/** Validate a runtime delivery; sender labels are attribution, never edit authority. */
export function parseMapIntent(delivery: unknown): MapIntent {
if (!object(delivery)) throw new Error('Map intent delivery is invalid.');
if (
typeof delivery.convention !== 'string' ||
!(MAP_INTENT_CONVENTIONS as readonly string[]).includes(delivery.convention)
)
throw new Error('Unsupported map intent convention.');
const action = delivery.convention.slice('napplet:black-site/map-'.length) as MapIntentAction;
if (delivery.archetype !== 'black-site' || delivery.action !== `map-${action}`)
throw new Error('Map intent routing fields do not match its convention.');
if (
typeof delivery.sender !== 'string' ||
!delivery.sender ||
delivery.sender.length > 1024 ||
/[\u0000-\u001f]/.test(delivery.sender)
)
throw new Error('Map intent source label is invalid.');
const payload = delivery.payload === undefined ? {} : delivery.payload;
if (!object(payload)) throw new Error('Map intent payload must be an object.');
boundedJson(payload, action === 'new' ? 264192 : 4096);
if (action === 'new') {
keysOnly(payload, ['map']);
if (payload.map === undefined) return { action, sender: delivery.sender };
const errors = validateMap(payload.map);
if (errors.length) throw new Error(`Map handoff is invalid:\n${errors.join('\n')}`);
boundedJson(payload.map, 262144);
return {
action,
sender: delivery.sender,
map: JSON.parse(JSON.stringify(payload.map)) as BlackSiteMap,
};
}
keysOnly(payload, ['address', 'relays']);
if (typeof payload.address !== 'string')
throw new Error('Map intent requires a published map address.');
const match = /^35858:([0-9a-f]{64}):([a-z0-9][a-z0-9-]{0,31})$/.exec(payload.address);
if (!match) throw new Error('Map intent address must be 35858:<author hex>:<map ID>.');
if (
payload.relays !== undefined &&
(!Array.isArray(payload.relays) || payload.relays.length > 8)
)
throw new Error('Map intent accepts at most eight relay hints.');
const relays = [...new Set(((payload.relays as unknown[] | undefined) ?? []).map(relayHint))];
return {
action,
sender: delivery.sender,
target: { address: payload.address, author: match[1], id: match[2], relays },
};
}
/** Official receiver API only; the injected runtime buffers pre-registration deliveries. */
export function subscribeMapIntents(
handler: (request: MapIntent) => void | Promise<void>,
onError: (error: unknown) => void,
): { close(): void } {
if (!runtimeHasDomain('intent')) return { close() {} };
let live = true;
let subscription: { close(): void };
try {
subscription = intent.onDelivery((delivery) => {
if (!live) return;
try {
Promise.resolve(handler(parseMapIntent(delivery))).catch((error) => {
if (live) onError(error);
});
} catch (error) {
onError(error);
}
});
} catch (error) {
onError(error);
return { close() {} };
}
return {
close() {
live = false;
subscription.close();
},
};
}
