@ziplayer/net 0.0.0-stage → 0.0.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (56) hide show
  1. package/README.md +136 -2
  2. package/dist/NetNode.d.ts +124 -0
  3. package/dist/NetNode.js +593 -0
  4. package/dist/NetNode.js.map +1 -0
  5. package/dist/ZiNet.d.ts +165 -0
  6. package/dist/ZiNet.js +599 -0
  7. package/dist/ZiNet.js.map +1 -0
  8. package/dist/crypto/handshake.d.ts +84 -0
  9. package/dist/crypto/handshake.js +204 -0
  10. package/dist/crypto/handshake.js.map +1 -0
  11. package/dist/crypto/identity.d.ts +44 -0
  12. package/dist/crypto/identity.js +92 -0
  13. package/dist/crypto/identity.js.map +1 -0
  14. package/dist/crypto/session.d.ts +56 -0
  15. package/dist/crypto/session.js +148 -0
  16. package/dist/crypto/session.js.map +1 -0
  17. package/dist/debug.d.ts +56 -0
  18. package/dist/debug.js +51 -0
  19. package/dist/debug.js.map +1 -0
  20. package/dist/ext/NetExtension.d.ts +15 -0
  21. package/dist/ext/NetExtension.js +39 -0
  22. package/dist/ext/NetExtension.js.map +1 -0
  23. package/dist/index.d.ts +28 -0
  24. package/dist/index.js +52 -0
  25. package/dist/index.js.map +1 -0
  26. package/dist/protocol/frames.d.ts +22 -0
  27. package/dist/protocol/frames.js +45 -0
  28. package/dist/protocol/frames.js.map +1 -0
  29. package/dist/router.d.ts +38 -0
  30. package/dist/router.js +51 -0
  31. package/dist/router.js.map +1 -0
  32. package/dist/search.d.ts +72 -0
  33. package/dist/search.js +94 -0
  34. package/dist/search.js.map +1 -0
  35. package/dist/stream/StreamImporter.d.ts +37 -0
  36. package/dist/stream/StreamImporter.js +138 -0
  37. package/dist/stream/StreamImporter.js.map +1 -0
  38. package/dist/stream/StreamProvider.d.ts +49 -0
  39. package/dist/stream/StreamProvider.js +157 -0
  40. package/dist/stream/StreamProvider.js.map +1 -0
  41. package/dist/transport/MemoryTransport.d.ts +36 -0
  42. package/dist/transport/MemoryTransport.js +84 -0
  43. package/dist/transport/MemoryTransport.js.map +1 -0
  44. package/dist/transport/MqttTransport.d.ts +26 -0
  45. package/dist/transport/MqttTransport.js +104 -0
  46. package/dist/transport/MqttTransport.js.map +1 -0
  47. package/dist/transport/Transport.d.ts +21 -0
  48. package/dist/transport/Transport.js +18 -0
  49. package/dist/transport/Transport.js.map +1 -0
  50. package/dist/voice/Gateway.d.ts +16 -0
  51. package/dist/voice/Gateway.js +35 -0
  52. package/dist/voice/Gateway.js.map +1 -0
  53. package/dist/voice/RemoteVoice.d.ts +29 -0
  54. package/dist/voice/RemoteVoice.js +80 -0
  55. package/dist/voice/RemoteVoice.js.map +1 -0
  56. package/package.json +53 -5
package/dist/ZiNet.js ADDED
@@ -0,0 +1,599 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.ZiNet = void 0;
4
+ exports.markTrack = markTrack;
5
+ const node_stream_1 = require("node:stream");
6
+ const NetNode_1 = require("./NetNode");
7
+ const NetExtension_1 = require("./ext/NetExtension");
8
+ const StreamImporter_1 = require("./stream/StreamImporter");
9
+ const StreamProvider_1 = require("./stream/StreamProvider");
10
+ const RemoteVoice_1 = require("./voice/RemoteVoice");
11
+ const router_1 = require("./router");
12
+ const search_1 = require("./search");
13
+ function markTrack(track, ownerNodeId) {
14
+ track.metadata = { ...(track.metadata ?? {}), net: { ...(track.metadata?.net ?? {}), owner: ownerNodeId } };
15
+ return track;
16
+ }
17
+ /**
18
+ * High level entry point: wires a {@link NetNode} to a PlayerManager.
19
+ *
20
+ * - Owner streamInfo: `provideStreams()`; consumers just play tracks marked with `markTrack(track, nodeId)`.
21
+ * - Owner connection: `player.connect()` as usual; `delegateVoice()` hands the voice session to another node.
22
+ */
23
+ class ZiNet {
24
+ options;
25
+ node;
26
+ importer;
27
+ hub;
28
+ provider;
29
+ delegations = new Map();
30
+ executions = new Map();
31
+ manager;
32
+ gateway;
33
+ voiceAccepting = false;
34
+ searchProvider;
35
+ aliases;
36
+ allowVoice;
37
+ constructor(options) {
38
+ this.options = options;
39
+ this.node = new NetNode_1.NetNode(options);
40
+ this.aliases = { ...search_1.DEFAULT_SEARCH_ALIASES, ...(options.searchAliases ?? {}) };
41
+ this.manager = options.manager;
42
+ this.gateway = options.gateway;
43
+ this.importer = new StreamImporter_1.StreamImporter(this.node, options.importer);
44
+ this.hub = new RemoteVoice_1.RemoteVoiceHub(this.node);
45
+ this.node.onAudio((peerId, frame) => this.importer.onFrame(peerId, frame));
46
+ this.node.on("peerOffline", (peerId) => this.onPeerGone(peerId));
47
+ // Owner side: relayed gateway payloads from the executor.
48
+ this.node.handle("voice.payload", (body, ctx) => {
49
+ const guildId = String(body?.guildId);
50
+ const delegation = this.delegations.get(guildId);
51
+ if (!delegation || delegation.executor !== ctx.from)
52
+ throw new NetNode_1.NetError("No delegation for this guild", "FORBIDDEN");
53
+ const p = body?.payload;
54
+ // Only a voice-state update for this very guild may reach the gateway.
55
+ if (!p || p.op !== 4 || String(p.d?.guild_id) !== guildId)
56
+ throw new NetNode_1.NetError("Payload not allowed", "FORBIDDEN");
57
+ this.gateway?.send(guildId, { op: 4, d: p.d });
58
+ }, { role: "accept-voice" });
59
+ this.node.handle("player.event", (body, ctx) => this.onExecutorEvent(body, ctx.from), { role: "accept-voice" });
60
+ this.node.handle("net.capabilities", () => ({
61
+ sources: this.localSources(),
62
+ players: this.manager?.getStats?.().players ?? 0,
63
+ search: Boolean(this.searchProvider),
64
+ }));
65
+ this.node.handle("net.search", (body, ctx) => this.onSearch(body, ctx.from), { role: "provide-search" });
66
+ }
67
+ // ── capabilities & routing ───────────────────────────────────────────────
68
+ capsCache = new Map();
69
+ localSources() {
70
+ if (this.options.sources)
71
+ return this.options.sources;
72
+ const plugins = this.manager?.controllers?.plugin?.getPlugins?.() ?? [];
73
+ return plugins.map((p) => String(p.name));
74
+ }
75
+ async peerCapabilities(peerId, maxAgeMs = 30_000) {
76
+ const hit = this.capsCache.get(peerId);
77
+ if (hit && Date.now() - hit.at < maxAgeMs)
78
+ return hit;
79
+ const caps = await this.node.request(peerId, "net.capabilities", undefined, { timeoutMs: 5000 });
80
+ const entry = { at: Date.now(), sources: caps.sources ?? [], players: caps.players ?? 0, search: caps.search };
81
+ this.capsCache.set(peerId, entry);
82
+ return entry;
83
+ }
84
+ /**
85
+ * Plans where each track should be resolved and, with `apply` (default), marks tracks with their owner node
86
+ * and moves or reclaims the voice when the plan calls for it.
87
+ *
88
+ * - `relay`: voice stays here; foreign tracks are pulled from the node that can resolve them.
89
+ * - `handoff`: voice moves to the node that can play most tracks; others are pulled from their owners.
90
+ */
91
+ async routeTracks(player, tracks, options = {}) {
92
+ const candidates = (options.peers ?? this.node.onlinePeers()).filter((id) => this.node.isOnline(id) || options.peers);
93
+ const peers = (await Promise.all(candidates.map((id) => this.peerCapabilities(id)
94
+ .then((c) => ({ id, sources: c.sources, load: c.players }))
95
+ .catch(() => null)))).filter((p) => p !== null);
96
+ const plan = (0, router_1.planRoute)({
97
+ selfId: this.nodeId,
98
+ selfSources: this.localSources(),
99
+ peers,
100
+ tracks,
101
+ handoffThreshold: options.handoffThreshold,
102
+ });
103
+ if (options.apply === false)
104
+ return { ...plan, applied: false };
105
+ const resolvesItself = plan.mode === "handoff" ? plan.executor : this.nodeId;
106
+ tracks.forEach((track, i) => {
107
+ const owner = plan.owners[i];
108
+ if (owner !== resolvesItself)
109
+ markTrack(track, owner);
110
+ });
111
+ try {
112
+ const delegated = Boolean(this.delegations.get(player.guildId));
113
+ if (plan.mode === "handoff" && !delegated)
114
+ await this.delegateVoice(player, plan.executor, options.delegate);
115
+ else if (plan.mode !== "handoff" && delegated)
116
+ await this.reclaimVoice(player);
117
+ return { ...plan, applied: true };
118
+ }
119
+ catch (error) {
120
+ return { ...plan, applied: false, error: error };
121
+ }
122
+ }
123
+ get nodeId() {
124
+ return this.node.nodeId;
125
+ }
126
+ start() {
127
+ return this.node.start();
128
+ }
129
+ async stop() {
130
+ this.provider?.closeAll();
131
+ this.importer.closeAll();
132
+ for (const g of [...this.delegations.keys()])
133
+ this.dropDelegation(g);
134
+ for (const e of this.executions.values())
135
+ e.cleanup();
136
+ this.executions.clear();
137
+ await this.node.stop();
138
+ }
139
+ /** Extension class to pass in `manager.create(guild, { extensions: [net.extensionClass()] })`. */
140
+ extensionClass() {
141
+ const net = this;
142
+ return class extends NetExtension_1.NetExtension {
143
+ constructor(player) {
144
+ super(net, player ?? null);
145
+ }
146
+ };
147
+ }
148
+ // ── search ───────────────────────────────────────────────────────────────
149
+ /**
150
+ * Serve search results from this node's plugins to trusted peers that hold the `provide-search` role
151
+ * (the default `*` role includes it). Opt-in, like `provideStreams()`.
152
+ */
153
+ provideSearch(options = {}) {
154
+ if (!this.manager?.search)
155
+ throw new Error("provideSearch() needs a PlayerManager with search()");
156
+ this.searchProvider = {
157
+ allow: options.allow,
158
+ maxResults: Math.min(Math.max(Math.floor(options.maxResults ?? 25), 1), 100),
159
+ maxResponseBytes: Math.max(Math.floor(options.maxResponseBytes ?? 200_000), 1_000),
160
+ };
161
+ }
162
+ /**
163
+ * Searches across the cluster. Tracks found by another node come back already marked with that node as owner
164
+ * (`track.metadata.net.owner`), so `player.play(track)` pulls the audio from it.
165
+ *
166
+ * `yt:lofi`, `sc:…`, `sp:…`, `tts:…` target the node that has that plugin; anything else (a plain query or a URL)
167
+ * is tried on this node first and, if nothing is found, on every node that serves search.
168
+ */
169
+ async search(text, options = {}) {
170
+ const raw = typeof text === "string" ? text.trim() : "";
171
+ if (!raw)
172
+ throw new NetNode_1.NetError("Empty search query", "BAD_REQUEST");
173
+ const { source, query } = (0, search_1.parseSearchQuery)(raw, this.aliases, options.source);
174
+ const limit = Math.min(Math.max(Math.floor(options.limit ?? 10) || 10, 1), 100);
175
+ const mode = options.local ?? "first";
176
+ const canLocal = mode !== "never" && Boolean(this.manager?.search) && (!source || this.localSources().includes(source));
177
+ const errors = [];
178
+ const fail = () => {
179
+ const detail = [...new Set(errors.map((e) => e.message))].join("; ");
180
+ return new NetNode_1.NetError(`No results found for: ${raw}${detail ? ` (${detail})` : ""}`, "NO_RESULTS");
181
+ };
182
+ const local = async () => {
183
+ const r = await this.searchLocal(query, source, options.requestedBy);
184
+ if (!r?.tracks?.length)
185
+ throw new NetNode_1.NetError(`No results found locally for: ${query}`, "NO_RESULTS");
186
+ this.node.traceNote(`search "${query}": ${r.tracks.length} result(s) from local plugins`);
187
+ return {
188
+ tracks: r.tracks.slice(0, limit),
189
+ playlist: r.playlist ?? null,
190
+ query: r.query,
191
+ source: r.source,
192
+ node: this.nodeId,
193
+ nodes: [this.nodeId],
194
+ };
195
+ };
196
+ const peerIds = async () => (mode === "only" ? [] : await this.searchCandidates(source, options.peers));
197
+ if (options.merge) {
198
+ const ids = await peerIds();
199
+ const jobs = [...(canLocal ? [local()] : []), ...ids.map((id) => this.searchOn(id, raw, options))];
200
+ const settled = await Promise.allSettled(jobs);
201
+ const ok = [];
202
+ for (const r of settled)
203
+ r.status === "fulfilled" ? ok.push(r.value) : errors.push(r.reason);
204
+ if (!ok.length)
205
+ throw fail();
206
+ const withPlaylist = ok.find((r) => r.playlist);
207
+ if (withPlaylist)
208
+ return withPlaylist;
209
+ return {
210
+ tracks: (0, search_1.dedupeNetTracks)(ok.flatMap((r) => r.tracks)).slice(0, limit),
211
+ playlist: null,
212
+ query: ok[0].query,
213
+ source: ok[0].source,
214
+ node: ok[0].node,
215
+ nodes: [...new Set(ok.flatMap((r) => r.nodes))],
216
+ };
217
+ }
218
+ const tryLocal = async () => {
219
+ if (!canLocal)
220
+ return null;
221
+ try {
222
+ return await local();
223
+ }
224
+ catch (error) {
225
+ errors.push(error);
226
+ this.node.traceNote(`search "${query}": nothing from local plugins (${error.message})`);
227
+ return null;
228
+ }
229
+ };
230
+ const tryPeers = async () => {
231
+ const ids = await peerIds();
232
+ if (!ids.length)
233
+ return null;
234
+ const stop = new AbortController();
235
+ const onAbort = () => stop.abort();
236
+ if (options.signal?.aborted)
237
+ stop.abort();
238
+ options.signal?.addEventListener("abort", onAbort, { once: true });
239
+ try {
240
+ return await Promise.any(ids.map((id) => this.searchOn(id, raw, { ...options, signal: stop.signal })));
241
+ }
242
+ catch (error) {
243
+ errors.push(...(error instanceof AggregateError ? error.errors : [error]));
244
+ return null;
245
+ }
246
+ finally {
247
+ stop.abort(); // cancel the requests that lost the race
248
+ options.signal?.removeEventListener("abort", onAbort);
249
+ }
250
+ };
251
+ for (const step of mode === "last" ? [tryPeers, tryLocal] : [tryLocal, tryPeers]) {
252
+ const result = await step();
253
+ if (result)
254
+ return result;
255
+ }
256
+ throw fail();
257
+ }
258
+ /** Searches on one specific node (it must run `provideSearch()` and trust this node). */
259
+ async searchOn(peerId, text, options = {}) {
260
+ const { source, query } = (0, search_1.parseSearchQuery)(String(text ?? ""), this.aliases, options.source);
261
+ if (!query)
262
+ throw new NetNode_1.NetError("Empty search query", "BAD_REQUEST");
263
+ const limit = Math.min(Math.max(Math.floor(options.limit ?? 10) || 10, 1), 100);
264
+ this.node.traceNote(`search "${query}" → ${peerId}${source ? ` (plugin ${source})` : ""}`, { peer: peerId });
265
+ const raw = await this.node.request(peerId, "net.search", { query, limit, plugins: source ? [source] : undefined }, { timeoutMs: options.timeoutMs, signal: options.signal });
266
+ const result = (0, search_1.importWireResult)(raw, peerId, options.requestedBy, limit);
267
+ if (!result.tracks.length)
268
+ throw new NetNode_1.NetError(`No results found on ${peerId} for: ${query}`, "NO_RESULTS");
269
+ this.node.traceNote(`search "${query}": ${result.tracks.length} result(s) from ${peerId}`, { peer: peerId });
270
+ return { ...result, node: peerId, nodes: [peerId] };
271
+ }
272
+ async searchCandidates(source, explicit) {
273
+ const ids = (explicit ?? this.node.onlinePeers()).filter((id) => id !== this.nodeId && (explicit || this.node.isOnline(id)));
274
+ const caps = await Promise.all(ids.map((id) => this.peerCapabilities(id)
275
+ .then((c) => ({ id, ...c }))
276
+ .catch(() => null)));
277
+ return caps
278
+ .filter((c) => c !== null)
279
+ .filter((c) => c.search !== false && (!source || c.sources.includes(source)))
280
+ .sort((a, b) => a.players - b.players)
281
+ .map((c) => c.id);
282
+ }
283
+ /** Runs the query on this node's plugins. With a `plugins` filter it goes straight to the shared plugin manager. */
284
+ async searchLocal(query, source, requestedBy) {
285
+ const who = typeof requestedBy === "string" ? requestedBy : (requestedBy?.id ?? "net");
286
+ const pluginManager = source ? this.manager?.controllers?.plugin?.getSharedManager?.() : undefined;
287
+ if (pluginManager?.search) {
288
+ const result = await pluginManager.search(query, { requestedBy: String(who), plugins: [source] });
289
+ if (!result?.tracks?.length)
290
+ throw new NetNode_1.NetError(`No results found for: ${query}`, "NO_RESULTS");
291
+ return result;
292
+ }
293
+ return this.manager.search(query, requestedBy ?? "net");
294
+ }
295
+ async onSearch(body, from) {
296
+ const provider = this.searchProvider;
297
+ if (!provider)
298
+ throw new NetNode_1.NetError("This node does not serve search", "NOT_PROVIDED");
299
+ const query = typeof body?.query === "string" ? body.query.trim() : "";
300
+ if (!query || query.length > search_1.MAX_QUERY_CHARS)
301
+ throw new NetNode_1.NetError("Invalid search query", "BAD_REQUEST");
302
+ const plugins = Array.isArray(body?.plugins) ?
303
+ body.plugins.filter((p) => typeof p === "string" && p.length > 0 && p.length <= 64).slice(0, 8)
304
+ : undefined;
305
+ const limit = Math.min(Math.max(Math.floor(Number(body?.limit)) || 10, 1), provider.maxResults);
306
+ if (provider.allow && !(await provider.allow(query, from)))
307
+ throw new NetNode_1.NetError("Search refused", "FORBIDDEN");
308
+ const source = plugins?.length === 1 ? plugins[0] : undefined;
309
+ const result = await this.searchLocal(query, source, `net:${from}`);
310
+ const wire = (0, search_1.toWireResult)(result, limit, provider.maxResponseBytes);
311
+ this.node.traceNote(`search "${query}" from ${from}: answering ${wire.tracks.length} track(s)`, { peer: from });
312
+ return wire;
313
+ }
314
+ // ── owner streamInfo ─────────────────────────────────────────────────────
315
+ /** Serve streams resolved by this node's plugins to trusted peers that hold the `provide-stream` role. */
316
+ provideStreams(options) {
317
+ if (!this.manager?.resolveStream)
318
+ throw new Error("provideStreams() needs a PlayerManager with resolveStream()");
319
+ this.provider = new StreamProvider_1.StreamProvider(this.node, {
320
+ resolveStream: (track, opts) => this.manager.resolveStream(track, opts),
321
+ allow: options?.allow,
322
+ chunkBytes: options?.chunkBytes,
323
+ debug: this.options.debug,
324
+ });
325
+ return this.provider;
326
+ }
327
+ /** Open a remote stream as a ziplayer `StreamInfo`. */
328
+ async openRemoteStream(ownerId, track, position = 0, signal) {
329
+ const remote = await this.importer.open(ownerId, (0, RemoteVoice_1.serializeTrack)(track), { position, signal });
330
+ return {
331
+ stream: remote.stream,
332
+ track,
333
+ streamType: remote.streamType,
334
+ type: remote.streamType,
335
+ recreate: remote.recreate,
336
+ // A network stream is single-use: never let the extension manager replay a consumed Readable.
337
+ cacheable: false,
338
+ metadata: { net: { owner: ownerId } },
339
+ };
340
+ }
341
+ // ── owner connection → executor ──────────────────────────────────────────
342
+ delegationFor(guildId) {
343
+ return this.delegations.get(guildId);
344
+ }
345
+ /**
346
+ * Hands the player's Discord voice session to `executorId`. This node keeps the gateway and the queue; the
347
+ * executor joins voice (through a relay adapter) and plays. Call it while nothing is playing.
348
+ */
349
+ async delegateVoice(player, executorId, options = {}) {
350
+ const gateway = this.gateway;
351
+ if (!gateway)
352
+ throw new NetNode_1.NetError("delegateVoice() needs a gateway (see discordJsGateway)", "NO_GATEWAY");
353
+ const guildId = player.guildId;
354
+ if (this.delegations.has(guildId))
355
+ throw new NetNode_1.NetError("Voice already delegated for this guild", "ALREADY_DELEGATED");
356
+ const connection = player.connection;
357
+ if (!connection)
358
+ throw new NetNode_1.NetError("Player is not connected; call player.connect() first", "NOT_CONNECTED");
359
+ if (player.isPlaying)
360
+ throw new NetNode_1.NetError("Stop playback before delegating voice", "BUSY");
361
+ const channelId = connection.joinConfig.channelId;
362
+ const channel = options.channel ?? gateway.resolveChannel?.(guildId, channelId);
363
+ await this.node.ensureSession(executorId);
364
+ const stopRelay = gateway.onVoiceUpdate((gid, kind, data) => {
365
+ if (gid !== guildId)
366
+ return;
367
+ this.node.notify(executorId, "voice.event", { guildId, kind, data }).catch(() => { });
368
+ });
369
+ // Registered BEFORE the request: the executor's first gateway payload (join) arrives while it is still connecting.
370
+ this.delegations.set(guildId, {
371
+ executor: executorId,
372
+ channelId,
373
+ channel,
374
+ streamFrom: options.streamFrom ?? "executor",
375
+ stopRelay,
376
+ });
377
+ // Release our UDP connection WITHOUT leaving the Discord channel so the executor can take over.
378
+ await player.disconnect({ silent: true });
379
+ try {
380
+ await this.node.request(executorId, "voice.delegate", {
381
+ guildId,
382
+ channelId,
383
+ selfDeaf: connection.joinConfig.selfDeaf,
384
+ selfMute: connection.joinConfig.selfMute,
385
+ volume: player.volume,
386
+ }, { timeoutMs: 30_000 });
387
+ }
388
+ catch (error) {
389
+ this.dropDelegation(guildId);
390
+ if (channel)
391
+ await player.connect(channel).catch(() => { });
392
+ throw error;
393
+ }
394
+ }
395
+ /** Takes the voice session back and reconnects locally. */
396
+ async reclaimVoice(player, options = {}) {
397
+ const guildId = player.guildId;
398
+ const d = this.delegations.get(guildId);
399
+ if (!d)
400
+ return;
401
+ await this.node.request(d.executor, "voice.release", { guildId }, { timeoutMs: 10_000 }).catch(() => { });
402
+ this.dropDelegation(guildId);
403
+ try {
404
+ player.exitRemoteMode?.();
405
+ }
406
+ catch { }
407
+ const channel = options.channel ?? d.channel;
408
+ if (channel)
409
+ await player.connect(channel);
410
+ }
411
+ dropDelegation(guildId) {
412
+ const d = this.delegations.get(guildId);
413
+ if (!d)
414
+ return;
415
+ d.stopRelay();
416
+ this.delegations.delete(guildId);
417
+ }
418
+ /** Remote playback handle for a delegated player (same contract Lavalink uses). */
419
+ buildRemoteStream(player, track) {
420
+ const guildId = player.guildId;
421
+ const d = this.delegations.get(guildId);
422
+ if (!d)
423
+ return null;
424
+ const wire = (0, RemoteVoice_1.serializeTrack)(track);
425
+ if (!wire.metadata?.net?.owner && d.streamFrom === "owner")
426
+ markTrack(wire, this.nodeId);
427
+ const cmd = (name, value) => this.node.request(d.executor, "player.cmd", { guildId, cmd: name, value }, { timeoutMs: 30_000 });
428
+ const handle = {
429
+ play: async () => void (await cmd("play", { track: wire, position: 0 })),
430
+ pause: async () => void (await cmd("pause")),
431
+ resume: async () => void (await cmd("resume")),
432
+ stop: async () => {
433
+ await cmd("stop");
434
+ // Core only forwards stop() to the handle; leave REMOTE mode afterwards so the player is not left "playing".
435
+ setImmediate(() => {
436
+ try {
437
+ if (this.delegations.has(guildId))
438
+ player.exitRemoteMode?.();
439
+ }
440
+ catch { }
441
+ });
442
+ },
443
+ seek: async (position) => void (await cmd("seek", position)),
444
+ setVolume: async (volume) => void (await cmd("volume", volume)),
445
+ destroy: async () => void (await cmd("stop").catch(() => { })),
446
+ };
447
+ const dummy = new node_stream_1.PassThrough();
448
+ dummy.end();
449
+ return { stream: dummy, track, streamType: "arbitrary", type: "arbitrary", remote: true, handle };
450
+ }
451
+ onExecutorEvent(body, from) {
452
+ const guildId = String(body?.guildId);
453
+ const d = this.delegations.get(guildId);
454
+ if (!d || d.executor !== from)
455
+ return;
456
+ const player = this.manager?.get?.(guildId);
457
+ if (!player || player.destroyed)
458
+ return;
459
+ switch (body.type) {
460
+ case "trackEnd": {
461
+ const track = player.currentTrack;
462
+ if (track)
463
+ player.emit("trackEnd", track);
464
+ if (body.reason === "finished" || body.reason === "error")
465
+ void player.playNext?.().catch(() => { });
466
+ break;
467
+ }
468
+ case "error":
469
+ player.emit("playerError", new Error(String(body.message ?? "Remote playback error")), player.currentTrack);
470
+ break;
471
+ }
472
+ }
473
+ onPeerGone(peerId) {
474
+ // Executor vanished: take voice back so the guild is not left silent.
475
+ for (const [guildId, d] of [...this.delegations]) {
476
+ if (d.executor !== peerId)
477
+ continue;
478
+ const player = this.manager?.get?.(guildId);
479
+ this.dropDelegation(guildId);
480
+ try {
481
+ player?.exitRemoteMode?.();
482
+ }
483
+ catch { }
484
+ if (player && !player.destroyed && d.channel)
485
+ void player.connect(d.channel).catch(() => { });
486
+ player?.emit?.("debug", `[net] executor ${peerId} went offline; reclaimed voice for ${guildId}`);
487
+ }
488
+ for (const [guildId, e] of [...this.executions]) {
489
+ if (e.owner !== peerId)
490
+ continue;
491
+ e.cleanup();
492
+ this.executions.delete(guildId);
493
+ }
494
+ }
495
+ // ── executor ─────────────────────────────────────────────────────────────
496
+ /** Accept voice hand-offs from trusted owners that hold the `delegate-voice` role. */
497
+ acceptVoice(options) {
498
+ if (!this.manager)
499
+ throw new Error("acceptVoice() needs a PlayerManager");
500
+ if (this.voiceAccepting)
501
+ return;
502
+ this.voiceAccepting = true;
503
+ this.allowVoice = options?.allow;
504
+ this.node.handle("voice.event", (body, ctx) => {
505
+ if (body?.kind !== "state" && body?.kind !== "server")
506
+ return;
507
+ this.hub.feed(String(body.guildId), ctx.from, body.kind, body.data);
508
+ }, { role: "delegate-voice" });
509
+ this.node.handle("voice.delegate", (body, ctx) => this.onDelegate(body, ctx.from), { role: "delegate-voice" });
510
+ this.node.handle("voice.release", async (body, ctx) => {
511
+ const guildId = String(body?.guildId);
512
+ const e = this.executions.get(guildId);
513
+ if (!e || e.owner !== ctx.from)
514
+ return;
515
+ await this.endExecution(guildId, true);
516
+ }, { role: "delegate-voice" });
517
+ this.node.handle("player.cmd", async (body, ctx) => {
518
+ const guildId = String(body?.guildId);
519
+ const e = this.executions.get(guildId);
520
+ if (!e || e.owner !== ctx.from)
521
+ throw new NetNode_1.NetError("No execution for this guild", "FORBIDDEN");
522
+ const player = this.manager.get(guildId);
523
+ if (!player)
524
+ throw new NetNode_1.NetError("Player missing", "NO_PLAYER");
525
+ switch (body.cmd) {
526
+ case "play": {
527
+ const track = body.value?.track;
528
+ if (!track)
529
+ throw new Error("Missing track");
530
+ if (!(await player.play(track, { requestedBy: track.requestedBy ?? "net" })))
531
+ throw new Error("Playback failed to start");
532
+ return;
533
+ }
534
+ case "pause":
535
+ return void (await player.pause());
536
+ case "resume":
537
+ return void (await player.resume());
538
+ case "stop":
539
+ return void (await player.stop());
540
+ case "seek":
541
+ return void (await player.seek(Number(body.value) || 0));
542
+ case "volume":
543
+ return void player.setVolume(Number(body.value));
544
+ default:
545
+ throw new Error(`Unknown command "${body.cmd}"`);
546
+ }
547
+ }, { role: "delegate-voice" });
548
+ }
549
+ async onDelegate(body, owner) {
550
+ const guildId = String(body?.guildId);
551
+ const channelId = String(body?.channelId);
552
+ if (!guildId || !channelId)
553
+ throw new Error("Missing guildId/channelId");
554
+ if (this.allowVoice && !(await this.allowVoice(guildId, owner)))
555
+ throw new NetNode_1.NetError("Delegation refused", "FORBIDDEN");
556
+ if (this.executions.has(guildId))
557
+ await this.endExecution(guildId, true);
558
+ const player = await this.manager.create(guildId, {
559
+ extensions: [this.extensionClass()],
560
+ selfDeaf: body.selfDeaf,
561
+ selfMute: body.selfMute,
562
+ });
563
+ const channel = this.hub.createChannel(guildId, channelId, owner);
564
+ await player.connect(channel);
565
+ if (typeof body.volume === "number")
566
+ player.setVolume(body.volume);
567
+ const report = (payload) => this.node.notify(owner, "player.event", { guildId, ...payload }).catch(() => { });
568
+ const onEnd = () => void report({ type: "trackEnd", reason: "finished" });
569
+ const onError = (error) => void report({ type: "error", message: error?.message });
570
+ player.on("queueEnd", onEnd);
571
+ player.on("trackEnd", onEnd);
572
+ player.on("playerError", onError);
573
+ this.executions.set(guildId, {
574
+ owner,
575
+ cleanup: () => {
576
+ player.off("queueEnd", onEnd);
577
+ player.off("trackEnd", onEnd);
578
+ player.off("playerError", onError);
579
+ },
580
+ });
581
+ return { ok: true };
582
+ }
583
+ async endExecution(guildId, silent) {
584
+ const e = this.executions.get(guildId);
585
+ if (!e)
586
+ return;
587
+ e.cleanup();
588
+ this.executions.delete(guildId);
589
+ const player = this.manager.get(guildId);
590
+ if (player) {
591
+ // Do not leave the Discord channel: the owner is about to take the session back.
592
+ await player.disconnect({ silent }).catch(() => { });
593
+ await this.manager.destroy(guildId).catch(() => { });
594
+ }
595
+ this.hub.forget(guildId);
596
+ }
597
+ }
598
+ exports.ZiNet = ZiNet;
599
+ //# sourceMappingURL=ZiNet.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ZiNet.js","sourceRoot":"","sources":["../src/ZiNet.ts"],"names":[],"mappings":"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"}