Seventh plugin out, and the first that was already dead. Soulseek had been switched off since 2026-08-13: hono.ts had the router import and its mount commented out, so createSidecarProxy never ran, registerProxiedPrefix was never called, the slskd:server announcement fired into a void, and officer-slskd was not in the ecosystem at all. The permission entry had been reduced to api: [], which is why assertPermissionTotality was satisfied and the server booted clean. The UI rendered perfectly and every request 404'd. So this is a resurrection as well as a move. The mount is now /api/soulseek, derived via mountPrefix from the appName — all 47 frontend call sites repointed from /slskd/. The credential key in service_connections stays 'slskd': it names the daemon, not the route. Those two strings differ on purpose and conflating them reads the wrong row. The connection stays in core service_connections, as transmission does, so 'slskd' remains in a platform union this plugin cannot extend. Recorded in PLUGIN.md. Unlike transmission this plugin does own a schema: favourites and the two halves of the cached browse tree, which slskd has no concept of. Those three tables had been dropped from the drizzle barrel, so bun db:push would have deleted them on any server holding data. 313 palette classes converted to the semantic tone set, including a shared PHASE_TONE the three transfer views previously each copied.
26 lines
1.3 KiB
TypeScript
26 lines
1.3 KiB
TypeScript
import { createSidecarProxy } from '@@/sidecar/create-proxy';
|
|
import { mountPrefix } from '@@/plugins/manifest';
|
|
import { manifest } from '../manifest';
|
|
|
|
// Auth, then forward to officer-slskd. No routes of its own and no slskd knowledge: this file must never
|
|
// grow app logic.
|
|
//
|
|
// Covers both slskd's own API (`/api/v0/searches`, `/api/v0/transfers`, …) and the sidecar's
|
|
// Officer-owned routes (`/_officer/*` — favourites and the browse tree, features slskd has no concept
|
|
// of). Both are opaque from here; the sidecar injects the slskd API key.
|
|
//
|
|
// The prefix is DERIVED, never written out. `mountPrefix` returns `/soulseek` for a first-party plugin
|
|
// and `/p/<publisher>/soulseek` for anyone else's, so a literal would be right by coincidence today and
|
|
// silently wrong the moment this is published by someone other than officerdev. `createSidecarProxy`
|
|
// also calls `registerProxiedPrefix` with it, which is what stops `bodyParser` consuming the streams
|
|
// this router only forwards.
|
|
const proxy = createSidecarProxy({
|
|
name: 'slskd',
|
|
prefix: `/api${mountPrefix({ appName: 'soulseek', manifest })}`,
|
|
});
|
|
|
|
export const router = proxy.router;
|
|
|
|
/** Base URL of the sidecar's HTTP server, or null if it has not reported in yet. */
|
|
export const getSlskdServerUrl = proxy.getHttpUrl;
|