···12 likeTrack,
13 unLikeTrack,
14} from "lovedtracks/lovedtracks.service";
15+import dns from "node:dns";
16import { scrobbleTrack } from "nowplaying/nowplaying.service";
17import { rateLimiter } from "ratelimiter";
18import subscribe from "subscribers";
···38import usersApp from "./users/app";
39import webscrobbler from "./webscrobbler/app";
4041+dns.setDefaultResultOrder("ipv4first");
42+43subscribe(ctx);
4445const app = new Hono();
···50 rateLimiter({
51 limit: 1000,
52 window: 30, // 👈 30 seconds
53+ })
54);
5556app.use("*", async (c, next) => {
···165 ctx.redis.get(`nowplaying:${user.did}:status`),
166 ]);
167 return c.json(
168+ nowPlaying ? { ...JSON.parse(nowPlaying), is_playing: status === "1" } : {}
169 );
170});
171···317 listeners: 1,
318 sha256: item.track.sha256,
319 id: item.scrobble.id,
320+ }))
321 );
322});
323
+3-1
apps/api/src/server.ts
···4import express from "express";
5import { createProxyMiddleware } from "http-proxy-middleware";
6import { createServer } from "lexicon";
07import API from "./xrpc";
089const proxyMiddleware = createProxyMiddleware<Request, Response>({
10 target: "http://localhost:8000",
···2930app.listen(process.env.ROCKSKY_XPRC_PORT || 3004, () => {
31 console.log(
32- `Rocksky XRPC API is running on port ${process.env.ROCKSKY_XRPC_PORT || 3004}`,
33 );
34});
···4import express from "express";
5import { createProxyMiddleware } from "http-proxy-middleware";
6import { createServer } from "lexicon";
7+import dns from "node:dns";
8import API from "./xrpc";
9+dns.setDefaultResultOrder("ipv4first");
1011const proxyMiddleware = createProxyMiddleware<Request, Response>({
12 target: "http://localhost:8000",
···3132app.listen(process.env.ROCKSKY_XPRC_PORT || 3004, () => {
33 console.log(
34+ `Rocksky XRPC API is running on port ${process.env.ROCKSKY_XRPC_PORT || 3004}`
35 );
36});