diff options
Diffstat (limited to 'names/server.js')
| -rw-r--r-- | names/server.js | 17 |
1 files changed, 17 insertions, 0 deletions
diff --git a/names/server.js b/names/server.js index 6cd82a1..463ab8e 100644 --- a/names/server.js +++ b/names/server.js @@ -28,6 +28,7 @@ import { mnemonicToSeedSync } from '@scure/bip39'; import { lnBackend } from '../bridge/ln.js'; import { ArkManager } from '../src/ark/manager.js'; import { fetchPreview } from './preview.js'; +import { translate, languages } from './translate.js'; import { decodeAddress } from '../src/ark/proto.js'; import { decodeNoffer } from '../src/noffer.js'; import { decodeBolt11 } from '../src/ark/lightning.js'; @@ -1036,6 +1037,22 @@ Bun.serve({ }); } + // A post in another language, in the reader's (LibreTranslate behind a + // cache — see translate.js). POST { text, target, source? } → + // { text, source }; GET /translate/languages lists what it can do. + if (url.pathname === '/translate/languages' && req.method === 'GET') { + try { return new Response(JSON.stringify(await languages()), { headers: { 'content-type': 'application/json', 'access-control-allow-origin': '*', 'cache-control': 'public, max-age=3600' } }); } + catch { return json({ error: 'translation unavailable' }, 503); } + } + if (url.pathname === '/translate' && req.method === 'POST') { + if (!rateOk(ip, 60)) return json({ error: 'rate limited' }, 429); + let body = null; + try { body = await req.json(); } catch {} + if (!body || typeof body.text !== 'string' || typeof body.target !== 'string') return json({ error: 'bad request' }, 400); + try { return json(await translate(body.text, body.target, body.source)); } + catch (e) { return json({ error: e.message || 'translation failed' }, e.status || 503); } + } + if (url.pathname === '/health') { return json({ ok: true, domain: DOMAIN, names: Object.keys(state.names).length, |
