Index, probe, and announce LNURL mints in the API.
Wire discovery and probing for LNURL mints, add rate-limited POST /api/index for user submissions, and optionally announce confirmed state to relays. Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
@@ -119,4 +119,39 @@ export const config = {
|
||||
userAgent: 'cashumints.space-indexer/1.0',
|
||||
} as const;
|
||||
|
||||
/**
|
||||
* Publishing `kind:38174` announcements, which is **off unless two switches are set**.
|
||||
*
|
||||
* One switch would be enough to make it work and is not enough to make it safe. This
|
||||
* writes signed events to public relays, permanently and under this site's name, so
|
||||
* turning it on has to be a thing somebody did on purpose rather than a thing that
|
||||
* happened because a key was left in an env file from a test run:
|
||||
*
|
||||
* ANNOUNCE_LNURL=true the intent
|
||||
* ANNOUNCE_KEY=nsec1… the identity it will be signed with
|
||||
* ANNOUNCE_RELAYS=wss://… where, explicitly — there is deliberately no default
|
||||
*
|
||||
* The missing default on ANNOUNCE_RELAYS is the important one. Falling back to the
|
||||
* site's read pool would mean the difference between a CI run against a local test relay
|
||||
* and a permanent write to five public ones was a single unset variable.
|
||||
*
|
||||
* Returns null — never throws — when any of the three is missing, because a
|
||||
* misconfigured publisher must not stop an indexer that still has a directory to serve.
|
||||
* See the README section "Publishing LNURL mint announcements".
|
||||
*/
|
||||
export function announceConfig(
|
||||
env: NodeJS.ProcessEnv = process.env,
|
||||
): { secretKey: string; relays: string[] } | null {
|
||||
if (env['ANNOUNCE_LNURL']?.trim().toLowerCase() !== 'true') return null;
|
||||
|
||||
const secretKey = env['ANNOUNCE_KEY']?.trim() ?? '';
|
||||
const relays = (env['ANNOUNCE_RELAYS'] ?? '')
|
||||
.split(',')
|
||||
.map((relay) => relay.trim())
|
||||
.filter((relay) => relay.startsWith('ws://') || relay.startsWith('wss://'));
|
||||
|
||||
if (!secretKey || relays.length === 0) return null;
|
||||
return { secretKey, relays };
|
||||
}
|
||||
|
||||
export const startedAt = Math.floor(Date.now() / 1000);
|
||||
|
||||
Reference in New Issue
Block a user