@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
@@ -0,0 +1 @@
1
+ {"version":3,"file":"MqttTransport.js","sourceRoot":"","sources":["../../src/transport/MqttTransport.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,21 @@
1
+ export interface PublishOptions {
2
+ qos?: 0 | 1 | 2;
3
+ retain?: boolean;
4
+ }
5
+ export type MessageHandler = (topic: string, payload: Uint8Array) => void;
6
+ /**
7
+ * Minimal pub/sub transport used by {@link NetNode}. MQTT is the first implementation; any other
8
+ * carrier (WebSocket, TCP, NATS...) only has to implement this interface, because encryption and
9
+ * authentication live above it.
10
+ */
11
+ export interface Transport {
12
+ /** Registers a last-will message, published by the broker if this client disappears. Call before `connect()`. */
13
+ setLastWill?(topic: string, payload: Uint8Array, options?: PublishOptions): void;
14
+ connect(): Promise<void>;
15
+ close(): Promise<void>;
16
+ publish(topic: string, payload: Uint8Array, options?: PublishOptions): Promise<void>;
17
+ /** Subscribes to a topic filter (`+` and `#` wildcards allowed). Returns an unsubscribe function. */
18
+ subscribe(filter: string, handler: MessageHandler): Promise<() => void>;
19
+ }
20
+ /** MQTT-style topic filter matching (`+` single level, `#` multi level). */
21
+ export declare function topicMatches(filter: string, topic: string): boolean;
@@ -0,0 +1,18 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.topicMatches = topicMatches;
4
+ /** MQTT-style topic filter matching (`+` single level, `#` multi level). */
5
+ function topicMatches(filter, topic) {
6
+ const f = filter.split("/");
7
+ const t = topic.split("/");
8
+ for (let i = 0; i < f.length; i++) {
9
+ if (f[i] === "#")
10
+ return true;
11
+ if (i >= t.length)
12
+ return false;
13
+ if (f[i] !== "+" && f[i] !== t[i])
14
+ return false;
15
+ }
16
+ return f.length === t.length;
17
+ }
18
+ //# sourceMappingURL=Transport.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Transport.js","sourceRoot":"","sources":["../../src/transport/Transport.ts"],"names":[],"mappings":";;AAuBA,oCASC;AAVD,4EAA4E;AAC5E,SAAgB,YAAY,CAAC,MAAc,EAAE,KAAa;IACzD,MAAM,CAAC,GAAG,MAAM,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;IAC5B,MAAM,CAAC,GAAG,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;IAC3B,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;QACnC,IAAI,CAAC,CAAC,CAAC,CAAC,KAAK,GAAG;YAAE,OAAO,IAAI,CAAC;QAC9B,IAAI,CAAC,IAAI,CAAC,CAAC,MAAM;YAAE,OAAO,KAAK,CAAC;QAChC,IAAI,CAAC,CAAC,CAAC,CAAC,KAAK,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;YAAE,OAAO,KAAK,CAAC;IACjD,CAAC;IACD,OAAO,CAAC,CAAC,MAAM,KAAK,CAAC,CAAC,MAAM,CAAC;AAC9B,CAAC"}
@@ -0,0 +1,16 @@
1
+ /**
2
+ * What the node that owns the Discord gateway connection must provide. The owner receives the
3
+ * bot's VOICE_STATE_UPDATE / VOICE_SERVER_UPDATE and relays them to the node that does the audio.
4
+ */
5
+ export interface GatewayLike {
6
+ /** The bot's user id. */
7
+ userId: string;
8
+ /** Subscribes to the bot's voice events. `data` is the inner `d` of the gateway payload. */
9
+ onVoiceUpdate(listener: (guildId: string, kind: "state" | "server", data: any) => void): () => void;
10
+ /** Sends a raw gateway payload (only op 4 is ever relayed) on the right shard. */
11
+ send(guildId: string, payload: unknown): void;
12
+ /** Optional: resolve a channel object so the owner can reconnect locally on reclaim/failure. */
13
+ resolveChannel?(guildId: string, channelId: string): any;
14
+ }
15
+ /** Gateway adapter for a discord.js v14 `Client`. */
16
+ export declare function discordJsGateway(client: any): GatewayLike;
@@ -0,0 +1,35 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.discordJsGateway = discordJsGateway;
4
+ /** Gateway adapter for a discord.js v14 `Client`. */
5
+ function discordJsGateway(client) {
6
+ return {
7
+ get userId() {
8
+ return client.user?.id;
9
+ },
10
+ onVoiceUpdate(listener) {
11
+ const handler = (packet) => {
12
+ if (!packet?.d)
13
+ return;
14
+ if (packet.t === "VOICE_STATE_UPDATE" && packet.d.user_id === client.user?.id) {
15
+ listener(String(packet.d.guild_id), "state", packet.d);
16
+ }
17
+ else if (packet.t === "VOICE_SERVER_UPDATE") {
18
+ listener(String(packet.d.guild_id), "server", packet.d);
19
+ }
20
+ };
21
+ client.on("raw", handler);
22
+ return () => client.off("raw", handler);
23
+ },
24
+ send(guildId, payload) {
25
+ const guild = client.guilds.cache.get(guildId);
26
+ if (!guild)
27
+ throw new Error(`Guild ${guildId} not cached`);
28
+ guild.shard.send(payload);
29
+ },
30
+ resolveChannel(_guildId, channelId) {
31
+ return client.channels.cache.get(channelId);
32
+ },
33
+ };
34
+ }
35
+ //# sourceMappingURL=Gateway.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Gateway.js","sourceRoot":"","sources":["../../src/voice/Gateway.ts"],"names":[],"mappings":";;AAgBA,4CA0BC;AA3BD,qDAAqD;AACrD,SAAgB,gBAAgB,CAAC,MAAW;IAC3C,OAAO;QACN,IAAI,MAAM;YACT,OAAO,MAAM,CAAC,IAAI,EAAE,EAAY,CAAC;QAClC,CAAC;QACD,aAAa,CAAC,QAAQ;YACrB,MAAM,OAAO,GAAG,CAAC,MAAW,EAAE,EAAE;gBAC/B,IAAI,CAAC,MAAM,EAAE,CAAC;oBAAE,OAAO;gBACvB,IAAI,MAAM,CAAC,CAAC,KAAK,oBAAoB,IAAI,MAAM,CAAC,CAAC,CAAC,OAAO,KAAK,MAAM,CAAC,IAAI,EAAE,EAAE,EAAE,CAAC;oBAC/E,QAAQ,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,QAAQ,CAAC,EAAE,OAAO,EAAE,MAAM,CAAC,CAAC,CAAC,CAAC;gBACxD,CAAC;qBAAM,IAAI,MAAM,CAAC,CAAC,KAAK,qBAAqB,EAAE,CAAC;oBAC/C,QAAQ,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,QAAQ,CAAC,EAAE,QAAQ,EAAE,MAAM,CAAC,CAAC,CAAC,CAAC;gBACzD,CAAC;YACF,CAAC,CAAC;YACF,MAAM,CAAC,EAAE,CAAC,KAAK,EAAE,OAAO,CAAC,CAAC;YAC1B,OAAO,GAAG,EAAE,CAAC,MAAM,CAAC,GAAG,CAAC,KAAK,EAAE,OAAO,CAAC,CAAC;QACzC,CAAC;QACD,IAAI,CAAC,OAAO,EAAE,OAAO;YACpB,MAAM,KAAK,GAAG,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;YAC/C,IAAI,CAAC,KAAK;gBAAE,MAAM,IAAI,KAAK,CAAC,SAAS,OAAO,aAAa,CAAC,CAAC;YAC3D,KAAK,CAAC,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;QAC3B,CAAC;QACD,cAAc,CAAC,QAAQ,EAAE,SAAS;YACjC,OAAO,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC;QAC7C,CAAC;KACD,CAAC;AACH,CAAC"}
@@ -0,0 +1,29 @@
1
+ import type { NetNode } from "../NetNode";
2
+ export interface RemoteVoiceChannel {
3
+ id: string;
4
+ guildId: string;
5
+ type: 2;
6
+ guild: {
7
+ id: string;
8
+ voiceAdapterCreator: (methods: any) => any;
9
+ };
10
+ }
11
+ /**
12
+ * Executor side of a voice hand-off. Builds a fake guild voice channel whose gateway adapter talks to the
13
+ * owner over the network, so `player.connect(channel)` runs the normal @discordjs/voice machinery
14
+ * (UDP, encryption, DAVE) on this node while the owner keeps the real Discord gateway.
15
+ */
16
+ export declare class RemoteVoiceHub {
17
+ private readonly node;
18
+ private readonly adapters;
19
+ private readonly early;
20
+ constructor(node: NetNode);
21
+ createChannel(guildId: string, channelId: string, ownerId: string): RemoteVoiceChannel;
22
+ /** Feed a voice event relayed from the owner. Events arriving before the adapter exists are queued. */
23
+ feed(guildId: string, from: string, kind: "state" | "server", data: any): void;
24
+ owns(guildId: string): boolean;
25
+ forget(guildId: string): void;
26
+ private deliver;
27
+ }
28
+ /** JSON-safe copy of a track (drops streams, functions and circular references such as Discord user objects). */
29
+ export declare function serializeTrack(track: any): any;
@@ -0,0 +1,80 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.RemoteVoiceHub = void 0;
4
+ exports.serializeTrack = serializeTrack;
5
+ /**
6
+ * Executor side of a voice hand-off. Builds a fake guild voice channel whose gateway adapter talks to the
7
+ * owner over the network, so `player.connect(channel)` runs the normal @discordjs/voice machinery
8
+ * (UDP, encryption, DAVE) on this node while the owner keeps the real Discord gateway.
9
+ */
10
+ class RemoteVoiceHub {
11
+ node;
12
+ adapters = new Map();
13
+ early = new Map();
14
+ constructor(node) {
15
+ this.node = node;
16
+ }
17
+ createChannel(guildId, channelId, ownerId) {
18
+ const adapterCreator = (methods) => {
19
+ this.adapters.set(guildId, { methods, owner: ownerId });
20
+ for (const e of this.early.get(guildId) ?? [])
21
+ this.deliver(methods, e.kind, e.data);
22
+ this.early.delete(guildId);
23
+ return {
24
+ sendPayload: (payload) => {
25
+ this.node.notify(ownerId, "voice.payload", { guildId, payload }).catch(() => { });
26
+ return true;
27
+ },
28
+ destroy: () => {
29
+ if (this.adapters.get(guildId)?.methods === methods)
30
+ this.adapters.delete(guildId);
31
+ },
32
+ };
33
+ };
34
+ return { id: channelId, guildId, type: 2, guild: { id: guildId, voiceAdapterCreator: adapterCreator } };
35
+ }
36
+ /** Feed a voice event relayed from the owner. Events arriving before the adapter exists are queued. */
37
+ feed(guildId, from, kind, data) {
38
+ const reg = this.adapters.get(guildId);
39
+ if (reg) {
40
+ if (reg.owner !== from)
41
+ return;
42
+ return this.deliver(reg.methods, kind, data);
43
+ }
44
+ const q = this.early.get(guildId) ?? [];
45
+ if (q.length < 8)
46
+ q.push({ kind, data });
47
+ this.early.set(guildId, q);
48
+ }
49
+ owns(guildId) {
50
+ return this.adapters.has(guildId);
51
+ }
52
+ forget(guildId) {
53
+ this.adapters.delete(guildId);
54
+ this.early.delete(guildId);
55
+ }
56
+ deliver(methods, kind, data) {
57
+ if (kind === "state")
58
+ methods.onVoiceStateUpdate(data);
59
+ else
60
+ methods.onVoiceServerUpdate(data);
61
+ }
62
+ }
63
+ exports.RemoteVoiceHub = RemoteVoiceHub;
64
+ /** JSON-safe copy of a track (drops streams, functions and circular references such as Discord user objects). */
65
+ function serializeTrack(track) {
66
+ const seen = new WeakSet();
67
+ return JSON.parse(JSON.stringify(track, (_key, value) => {
68
+ if (typeof value === "function")
69
+ return undefined;
70
+ if (value && typeof value === "object") {
71
+ if (seen.has(value))
72
+ return undefined;
73
+ seen.add(value);
74
+ if (typeof value.pipe === "function")
75
+ return undefined;
76
+ }
77
+ return typeof value === "bigint" ? value.toString() : value;
78
+ }));
79
+ }
80
+ //# sourceMappingURL=RemoteVoice.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"RemoteVoice.js","sourceRoot":"","sources":["../../src/voice/RemoteVoice.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,54 @@
1
1
  {
2
- "name": "@ziplayer/net",
3
- "version": "0.0.0-stage",
4
- "stub": true,
5
- "description": "Temporary package placeholder for staged publishing"
6
- }
2
+ "name": "@ziplayer/net",
3
+ "version": "0.0.1",
4
+ "description": "Connect multiple ZiPlayer nodes over MQTT: stream resources and hand off voice connections",
5
+ "keywords": [
6
+ "ZiPlayer",
7
+ "@ziplayer/net",
8
+ "mqtt",
9
+ "discord",
10
+ "voice",
11
+ "cluster"
12
+ ],
13
+ "homepage": "https://player.ziji.best",
14
+ "bugs": {
15
+ "url": "https://github.com/ZiProject/ZiPlayer/issues"
16
+ },
17
+ "repository": {
18
+ "type": "git",
19
+ "url": "git+https://github.com/ZiProject/ZiPlayer.git"
20
+ },
21
+ "license": "MIT",
22
+ "engines": {
23
+ "node": ">=20.3.0"
24
+ },
25
+ "main": "dist/index.js",
26
+ "types": "dist/index.d.ts",
27
+ "files": [
28
+ "dist",
29
+ "README.md"
30
+ ],
31
+ "scripts": {
32
+ "build": "tsc",
33
+ "dev": "tsc --watch",
34
+ "prepare": "npm run build"
35
+ },
36
+ "peerDependencies": {
37
+ "@discordjs/voice": "^0.19.2",
38
+ "mqtt": "^5.0.0",
39
+ "ziplayer": "^1.0.5-dev.7"
40
+ },
41
+ "peerDependenciesMeta": {
42
+ "mqtt": {
43
+ "optional": true
44
+ }
45
+ },
46
+ "devDependencies": {
47
+ "@discordjs/voice": "^0.19.2",
48
+ "@types/node": "^20.0.0",
49
+ "aedes": "^0.51.3",
50
+ "mqtt": "^5.16.1",
51
+ "typescript": "^5.0.0",
52
+ "ziplayer": "^1.0.5-dev.7"
53
+ }
54
+ }