linkdave 0.1.6-dev.974add6 → 0.1.6-dev.ade6ce7

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.
package/dist/client.js CHANGED
@@ -133,9 +133,8 @@ export class LinkDaveClient extends EventEmitter {
133
133
  node.on(EventName.TrackEnd, (data) => this.#handleTrackEnd(node, data));
134
134
  node.on(EventName.TrackError, (data) => this.#forwardPlayerEvent(node, data.guild_id, EventName.TrackError, data));
135
135
  node.on(EventName.QueueError, (data) => this.#forwardPlayerEvent(node, data.guild_id, EventName.QueueError, data));
136
- node.on(EventName.VoiceConnect, (data) => this.#forwardPlayerEvent(node, data.guild_id, EventName.VoiceConnect, data));
136
+ node.on(EventName.VoiceConnect, (data) => this.#handleVoiceConnect(node, data));
137
137
  node.on(EventName.VoiceDisconnect, (data) => this.#handleVoiceDisconnect(node, data));
138
- node.on(EventName.Pong, () => this.emit(EventName.Pong, undefined));
139
138
  node.on(EventName.Stats, (data) => this.emit(EventName.Stats, data));
140
139
  node.on(EventName.NodeDraining, (data) => this.#handleNodeDraining(node, data));
141
140
  node.on(EventName.MigrateReady, (data) => this.#handleMigrateReady(node, data));
@@ -152,7 +151,7 @@ export class LinkDaveClient extends EventEmitter {
152
151
  const player = this.#players.get(data.guild_id);
153
152
  if (player?.node !== node)
154
153
  return;
155
- player._updateState(data);
154
+ player._onPlayerUpdate(data);
156
155
  this.emit(EventName.PlayerUpdate, data);
157
156
  }
158
157
  #handleTrackStart(node, data) {
@@ -169,6 +168,13 @@ export class LinkDaveClient extends EventEmitter {
169
168
  player._onTrackEnd(data);
170
169
  this.emit(EventName.TrackEnd, data);
171
170
  }
171
+ #handleVoiceConnect(node, data) {
172
+ const player = this.#players.get(data.guild_id);
173
+ if (player?.node !== node)
174
+ return;
175
+ player._onVoiceConnect();
176
+ this.emit(EventName.VoiceConnect, data);
177
+ }
172
178
  #handleVoiceDisconnect(node, data) {
173
179
  const player = this.#players.get(data.guild_id);
174
180
  if (player?.node !== node)
package/dist/node.d.ts CHANGED
@@ -1,6 +1,6 @@
1
1
  import { EventEmitter } from "node:events";
2
2
  import { RESTClient } from "./rest.js";
3
- import type { Events, PlayPayload, SeekPayload, VoiceUpdatePayload, VolumePayload } from "./types.js";
3
+ import type { Events, PlayPayload, SeekPayload, VoiceUpdatePayload } from "./types.js";
4
4
  export interface NodeOptions {
5
5
  name: string;
6
6
  url: string;
@@ -23,7 +23,6 @@ export interface Node {
23
23
  }
24
24
  export declare class Node extends EventEmitter {
25
25
  #private;
26
- private static readonly NODE_PING_INTERVAL;
27
26
  readonly name: string;
28
27
  readonly url: string;
29
28
  readonly rest: RESTClient;
@@ -44,6 +43,5 @@ export declare class Node extends EventEmitter {
44
43
  sendResume(guildId: string): Promise<void>;
45
44
  sendStop(guildId: string): Promise<void>;
46
45
  sendSeek(guildId: string, data: SeekPayload): Promise<void>;
47
- sendVolume(guildId: string, data: VolumePayload): Promise<void>;
48
46
  sendDisconnect(guildId: string): Promise<void>;
49
47
  }
package/dist/node.js CHANGED
@@ -11,7 +11,6 @@ export var NodeState;
11
11
  })(NodeState || (NodeState = {}));
12
12
  // eslint-disable-next-line @typescript-eslint/no-unsafe-declaration-merging
13
13
  export class Node extends EventEmitter {
14
- static NODE_PING_INTERVAL = 30_000;
15
14
  name;
16
15
  url;
17
16
  rest;
@@ -20,7 +19,6 @@ export class Node extends EventEmitter {
20
19
  #sessionId = null;
21
20
  #reconnectAttempts = 0;
22
21
  #reconnectTimeout = null;
23
- #pingInterval = null;
24
22
  #state = NodeState.Disconnected;
25
23
  #playerCount = 0;
26
24
  constructor(options) {
@@ -53,7 +51,6 @@ export class Node extends EventEmitter {
53
51
  const onOpen = () => {
54
52
  this.#state = NodeState.Connected;
55
53
  this.#reconnectAttempts = 0;
56
- this.#startPingInterval();
57
54
  resolve(null);
58
55
  };
59
56
  const onError = (event) => {
@@ -70,7 +67,6 @@ export class Node extends EventEmitter {
70
67
  }
71
68
  disconnect() {
72
69
  this.#state = NodeState.Disconnected;
73
- this.#stopPingInterval();
74
70
  this.#stopReconnect();
75
71
  if (this.#ws) {
76
72
  this.#ws.close(1_000, "Client disconnect");
@@ -134,9 +130,6 @@ export class Node extends EventEmitter {
134
130
  case ServerOpCodes.VoiceDisconnect:
135
131
  this.emit(EventName.VoiceDisconnect, message.d);
136
132
  break;
137
- case ServerOpCodes.Pong:
138
- this.emit(EventName.Pong, undefined);
139
- break;
140
133
  case ServerOpCodes.Stats:
141
134
  this.#playerCount = message.d.players;
142
135
  this.#state = message.d.draining ? NodeState.Draining : NodeState.Connected;
@@ -153,7 +146,6 @@ export class Node extends EventEmitter {
153
146
  }
154
147
  #onClose(event) {
155
148
  this.#state = NodeState.Disconnected;
156
- this.#stopPingInterval();
157
149
  this.emit(EventName.Close, { code: event.code, reason: event.reason });
158
150
  if (event.code !== 1_000 && this.#options.autoReconnect && !this.draining && this.#reconnectAttempts < this.#options.maxReconnectAttempts) {
159
151
  this.#scheduleReconnect();
@@ -176,15 +168,6 @@ export class Node extends EventEmitter {
176
168
  }
177
169
  this.#reconnectAttempts = 0;
178
170
  }
179
- #startPingInterval() {
180
- this.#pingInterval = setInterval(() => this.#send(ClientOpCodes.Ping, undefined), Node.NODE_PING_INTERVAL);
181
- }
182
- #stopPingInterval() {
183
- if (!this.#pingInterval)
184
- return;
185
- clearInterval(this.#pingInterval);
186
- this.#pingInterval = null;
187
- }
188
171
  sendVoiceUpdate(data) {
189
172
  this.#send(ClientOpCodes.VoiceUpdate, data);
190
173
  }
@@ -206,9 +189,6 @@ export class Node extends EventEmitter {
206
189
  async sendSeek(guildId, data) {
207
190
  await this.rest.post(Routes.seek(this.#requireSession(), guildId), data);
208
191
  }
209
- async sendVolume(guildId, data) {
210
- await this.rest.patch(Routes.volume(this.#requireSession(), guildId), data);
211
- }
212
192
  async sendDisconnect(guildId) {
213
193
  await this.rest.delete(Routes.disconnect(this.#requireSession(), guildId));
214
194
  }
package/dist/player.d.ts CHANGED
@@ -7,7 +7,6 @@ import type { FiltersPayload, MigrateReadyPayload, PlayerUpdatePayload, TrackEnd
7
7
  import { PlayerState } from "./types.js";
8
8
  export interface PlayOptions {
9
9
  startTime?: number;
10
- volume?: number;
11
10
  requesterId?: string;
12
11
  filters?: FiltersPayload;
13
12
  }
@@ -25,8 +24,6 @@ export declare class Player {
25
24
  get guildId(): string;
26
25
  get voiceChannelId(): string | null;
27
26
  get state(): PlayerState;
28
- get position(): number;
29
- get volume(): number;
30
27
  get current(): TrackInfo | null;
31
28
  get node(): Node;
32
29
  get queue(): Queue;
@@ -43,12 +40,12 @@ export declare class Player {
43
40
  resume(): Promise<void>;
44
41
  stop(): Promise<void>;
45
42
  seek(position: number): Promise<void>;
46
- setVolume(volume: number): Promise<void>;
47
43
  destroy(): Promise<void>;
48
44
  moveNode(targetNode: Node): Promise<unknown>;
49
- _updateState(data: PlayerUpdatePayload): void;
45
+ _onPlayerUpdate(data: PlayerUpdatePayload): void;
50
46
  _onTrackStart(data: TrackStartPayload): void;
51
47
  _onTrackEnd(data: TrackEndPayload): void;
48
+ _onVoiceConnect(): void;
52
49
  _onVoiceDisconnect(): void;
53
50
  _onMigrateReady(data: MigrateReadyPayload): void;
54
51
  }
package/dist/player.js CHANGED
@@ -14,8 +14,6 @@ export class Player {
14
14
  #selfMute;
15
15
  #selfDeaf;
16
16
  #state = PlayerState.Idle;
17
- #position = 0;
18
- #volume = 100;
19
17
  #current = null;
20
18
  #voiceState = null;
21
19
  #pendingVoice = null;
@@ -39,12 +37,6 @@ export class Player {
39
37
  get state() {
40
38
  return this.#state;
41
39
  }
42
- get position() {
43
- return this.#position;
44
- }
45
- get volume() {
46
- return this.#volume;
47
- }
48
40
  get current() {
49
41
  return this.#current;
50
42
  }
@@ -193,7 +185,6 @@ export class Player {
193
185
  await this.#node.sendPlay(this.#guildId, {
194
186
  url,
195
187
  ...(options.startTime !== undefined && { start_time: options.startTime }),
196
- ...(options.volume !== undefined && { volume: options.volume }),
197
188
  ...(options.requesterId !== undefined && { requester_id: options.requesterId }),
198
189
  ...(filters !== undefined && { filters })
199
190
  });
@@ -207,17 +198,12 @@ export class Player {
207
198
  async stop() {
208
199
  this.#queue._deactivate();
209
200
  await this.#node.sendStop(this.#guildId);
210
- this.#current = null;
211
201
  this.#state = PlayerState.Idle;
212
- this.#position = 0;
202
+ this.#current = null;
213
203
  }
214
204
  async seek(position) {
215
205
  await this.#node.sendSeek(this.#guildId, { position });
216
206
  }
217
- async setVolume(volume) {
218
- this.#volume = Math.max(0, Math.min(1_000, volume));
219
- await this.#node.sendVolume(this.#guildId, { volume: this.#volume });
220
- }
221
207
  async destroy() {
222
208
  this.disconnect();
223
209
  if (!this.#node.connected) {
@@ -260,13 +246,12 @@ export class Player {
260
246
  this.#migrationResolve = resolve;
261
247
  });
262
248
  }
263
- _updateState(data) {
249
+ _onPlayerUpdate(data) {
264
250
  this.#state = data.state;
265
- this.#position = data.position;
266
- this.#volume = data.volume;
267
251
  }
268
252
  _onTrackStart(data) {
269
253
  this.#current = data.track;
254
+ this.#state = PlayerState.Playing;
270
255
  }
271
256
  _onTrackEnd(data) {
272
257
  if (!this.#queue.active || this.#queue.size === 0) {
@@ -275,6 +260,11 @@ export class Player {
275
260
  }
276
261
  this.#queue._onTrackEnd(data.reason !== TrackEndReason.Stopped && data.reason !== TrackEndReason.Replaced);
277
262
  }
263
+ _onVoiceConnect() {
264
+ if (this.#state !== PlayerState.Connecting)
265
+ return;
266
+ this.#state = PlayerState.Idle;
267
+ }
278
268
  #cleanup() {
279
269
  this.#voiceChannelId = null;
280
270
  this.#queue._deactivate();
@@ -282,7 +272,6 @@ export class Player {
282
272
  this.#pendingVoice = null;
283
273
  this.#state = PlayerState.Idle;
284
274
  this.#current = null;
285
- this.#position = 0;
286
275
  }
287
276
  _onVoiceDisconnect() {
288
277
  this.#cleanup();
@@ -313,7 +302,6 @@ export class Player {
313
302
  void this.#node.sendPlay(this.#guildId, {
314
303
  url: data.url,
315
304
  start_time: data.position,
316
- volume: data.volume,
317
305
  ...(data.requester_id !== undefined && { requester_id: data.requester_id }),
318
306
  ...(data.filters !== undefined && { filters: data.filters })
319
307
  });
package/dist/types.d.ts CHANGED
@@ -1,21 +1,19 @@
1
1
  import type { Node } from "./node.js";
2
2
  export declare enum ClientOpCodes {
3
- Ping = 0,
4
- VoiceUpdate = 1,
5
- PlayerMigrate = 2
3
+ VoiceUpdate = 0,
4
+ PlayerMigrate = 1
6
5
  }
7
6
  export declare enum ServerOpCodes {
8
- Pong = 0,
9
- Ready = 1,
10
- VoiceConnect = 2,
11
- VoiceDisconnect = 3,
12
- PlayerUpdate = 4,
13
- TrackStart = 5,
14
- TrackEnd = 6,
15
- TrackError = 7,
16
- Stats = 8,
17
- NodeDraining = 9,
18
- MigrateReady = 10
7
+ Ready = 0,
8
+ VoiceConnect = 1,
9
+ VoiceDisconnect = 2,
10
+ PlayerUpdate = 3,
11
+ TrackStart = 4,
12
+ TrackEnd = 5,
13
+ TrackError = 6,
14
+ Stats = 7,
15
+ NodeDraining = 8,
16
+ MigrateReady = 9
19
17
  }
20
18
  export declare enum TrackEndReason {
21
19
  Finished = "finished",
@@ -69,9 +67,6 @@ export type ServerMessage = {
69
67
  } | {
70
68
  op: ServerOpCodes.VoiceDisconnect;
71
69
  d: VoiceDisconnectPayload;
72
- } | {
73
- op: ServerOpCodes.Pong;
74
- d?: undefined;
75
70
  } | {
76
71
  op: ServerOpCodes.Stats;
77
72
  d: StatsPayload;
@@ -85,9 +80,6 @@ export type ServerMessage = {
85
80
  export type ClientMessage = {
86
81
  op: ClientOpCodes.VoiceUpdate;
87
82
  d: VoiceUpdatePayload;
88
- } | {
89
- op: ClientOpCodes.Ping;
90
- d?: undefined;
91
83
  } | {
92
84
  op: ClientOpCodes.PlayerMigrate;
93
85
  d: PlayerMigratePayload;
@@ -107,7 +99,6 @@ export interface VoiceUpdatePayload {
107
99
  export interface PlayPayload {
108
100
  url: string;
109
101
  start_time?: number;
110
- volume?: number;
111
102
  requester_id?: string;
112
103
  filters?: FiltersPayload;
113
104
  }
@@ -117,9 +108,6 @@ export interface GuildPayload {
117
108
  export interface SeekPayload {
118
109
  position: number;
119
110
  }
120
- export interface VolumePayload {
121
- volume: number;
122
- }
123
111
  export interface ReadyPayload {
124
112
  session_id: string;
125
113
  resumed: boolean;
@@ -127,8 +115,6 @@ export interface ReadyPayload {
127
115
  export interface PlayerUpdatePayload {
128
116
  guild_id: string;
129
117
  state: PlayerState;
130
- position: number;
131
- volume: number;
132
118
  }
133
119
  export interface TrackInfo {
134
120
  url: string;
@@ -186,7 +172,6 @@ export interface MigrateReadyPayload {
186
172
  guild_id: string;
187
173
  url: string;
188
174
  position: number;
189
- volume: number;
190
175
  state: PlayerState;
191
176
  requester_id?: string;
192
177
  filters?: FiltersPayload;
@@ -204,7 +189,6 @@ export declare enum EventName {
204
189
  QueueError = "queueError",
205
190
  VoiceConnect = "voiceConnect",
206
191
  VoiceDisconnect = "voiceDisconnect",
207
- Pong = "pong",
208
192
  Stats = "stats",
209
193
  NodeDraining = "nodeDraining",
210
194
  MigrateReady = "migrateReady",
@@ -220,7 +204,6 @@ export interface Events {
220
204
  [EventName.QueueError]: QueueErrorPayload;
221
205
  [EventName.VoiceConnect]: VoiceConnectPayload;
222
206
  [EventName.VoiceDisconnect]: VoiceDisconnectPayload;
223
- [EventName.Pong]: undefined;
224
207
  [EventName.Stats]: StatsPayload;
225
208
  [EventName.NodeDraining]: NodeDrainingPayload;
226
209
  [EventName.MigrateReady]: MigrateReadyPayload;
@@ -254,6 +237,5 @@ export declare const Routes: {
254
237
  readonly resume: (sessionId: string, guildId: string) => `/sessions/${string}/players/${string}/resume`;
255
238
  readonly stop: (sessionId: string, guildId: string) => `/sessions/${string}/players/${string}/stop`;
256
239
  readonly seek: (sessionId: string, guildId: string) => `/sessions/${string}/players/${string}/seek`;
257
- readonly volume: (sessionId: string, guildId: string) => `/sessions/${string}/players/${string}/volume`;
258
240
  readonly disconnect: (sessionId: string, guildId: string) => `/sessions/${string}/players/${string}`;
259
241
  };
package/dist/types.js CHANGED
@@ -1,22 +1,20 @@
1
1
  export var ClientOpCodes;
2
2
  (function (ClientOpCodes) {
3
- ClientOpCodes[ClientOpCodes["Ping"] = 0] = "Ping";
4
- ClientOpCodes[ClientOpCodes["VoiceUpdate"] = 1] = "VoiceUpdate";
5
- ClientOpCodes[ClientOpCodes["PlayerMigrate"] = 2] = "PlayerMigrate";
3
+ ClientOpCodes[ClientOpCodes["VoiceUpdate"] = 0] = "VoiceUpdate";
4
+ ClientOpCodes[ClientOpCodes["PlayerMigrate"] = 1] = "PlayerMigrate";
6
5
  })(ClientOpCodes || (ClientOpCodes = {}));
7
6
  export var ServerOpCodes;
8
7
  (function (ServerOpCodes) {
9
- ServerOpCodes[ServerOpCodes["Pong"] = 0] = "Pong";
10
- ServerOpCodes[ServerOpCodes["Ready"] = 1] = "Ready";
11
- ServerOpCodes[ServerOpCodes["VoiceConnect"] = 2] = "VoiceConnect";
12
- ServerOpCodes[ServerOpCodes["VoiceDisconnect"] = 3] = "VoiceDisconnect";
13
- ServerOpCodes[ServerOpCodes["PlayerUpdate"] = 4] = "PlayerUpdate";
14
- ServerOpCodes[ServerOpCodes["TrackStart"] = 5] = "TrackStart";
15
- ServerOpCodes[ServerOpCodes["TrackEnd"] = 6] = "TrackEnd";
16
- ServerOpCodes[ServerOpCodes["TrackError"] = 7] = "TrackError";
17
- ServerOpCodes[ServerOpCodes["Stats"] = 8] = "Stats";
18
- ServerOpCodes[ServerOpCodes["NodeDraining"] = 9] = "NodeDraining";
19
- ServerOpCodes[ServerOpCodes["MigrateReady"] = 10] = "MigrateReady";
8
+ ServerOpCodes[ServerOpCodes["Ready"] = 0] = "Ready";
9
+ ServerOpCodes[ServerOpCodes["VoiceConnect"] = 1] = "VoiceConnect";
10
+ ServerOpCodes[ServerOpCodes["VoiceDisconnect"] = 2] = "VoiceDisconnect";
11
+ ServerOpCodes[ServerOpCodes["PlayerUpdate"] = 3] = "PlayerUpdate";
12
+ ServerOpCodes[ServerOpCodes["TrackStart"] = 4] = "TrackStart";
13
+ ServerOpCodes[ServerOpCodes["TrackEnd"] = 5] = "TrackEnd";
14
+ ServerOpCodes[ServerOpCodes["TrackError"] = 6] = "TrackError";
15
+ ServerOpCodes[ServerOpCodes["Stats"] = 7] = "Stats";
16
+ ServerOpCodes[ServerOpCodes["NodeDraining"] = 8] = "NodeDraining";
17
+ ServerOpCodes[ServerOpCodes["MigrateReady"] = 9] = "MigrateReady";
20
18
  })(ServerOpCodes || (ServerOpCodes = {}));
21
19
  export var TrackEndReason;
22
20
  (function (TrackEndReason) {
@@ -63,7 +61,6 @@ export var EventName;
63
61
  EventName["QueueError"] = "queueError";
64
62
  EventName["VoiceConnect"] = "voiceConnect";
65
63
  EventName["VoiceDisconnect"] = "voiceDisconnect";
66
- EventName["Pong"] = "pong";
67
64
  EventName["Stats"] = "stats";
68
65
  EventName["NodeDraining"] = "nodeDraining";
69
66
  EventName["MigrateReady"] = "migrateReady";
@@ -82,6 +79,5 @@ export const Routes = {
82
79
  resume: (sessionId, guildId) => `/sessions/${sessionId}/players/${guildId}/resume`,
83
80
  stop: (sessionId, guildId) => `/sessions/${sessionId}/players/${guildId}/stop`,
84
81
  seek: (sessionId, guildId) => `/sessions/${sessionId}/players/${guildId}/seek`,
85
- volume: (sessionId, guildId) => `/sessions/${sessionId}/players/${guildId}/volume`,
86
82
  disconnect: (sessionId, guildId) => `/sessions/${sessionId}/players/${guildId}`
87
83
  };
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "linkdave",
3
- "version": "0.1.6-dev.974add6",
3
+ "version": "0.1.6-dev.ade6ce7",
4
4
  "author": "Luna Seemann <luna@wamellow.com> (http://shi.gg)",
5
5
  "description": "TypeScript client library for linkdave Discord audio streaming server",
6
6
  "repository": {