@honeybbq/teamspeak 1.0.0-beta.23 → 1.0.0-beta.25
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/api/files.d.ts.map +1 -1
- package/dist/client/api/files.js +15 -1
- package/dist/client/api/files.js.map +1 -1
- package/dist/client/api/voice.d.ts +16 -5
- package/dist/client/api/voice.d.ts.map +1 -1
- package/dist/client/api/voice.js +16 -5
- package/dist/client/api/voice.js.map +1 -1
- package/dist/client/client.d.ts +40 -4
- package/dist/client/client.d.ts.map +1 -1
- package/dist/client/client.js +84 -9
- package/dist/client/client.js.map +1 -1
- package/dist/client/connection-info.d.ts +2 -4
- package/dist/client/connection-info.d.ts.map +1 -1
- package/dist/client/connection-info.js.map +1 -1
- package/dist/client/discovery/resolver.d.ts +28 -0
- package/dist/client/discovery/resolver.d.ts.map +1 -1
- package/dist/client/discovery/resolver.js +19 -5
- package/dist/client/discovery/resolver.js.map +1 -1
- package/dist/client/index.d.ts +2 -2
- package/dist/client/index.d.ts.map +1 -1
- package/dist/client/index.js.map +1 -1
- package/dist/client/transport/handler.d.ts +2 -5
- package/dist/client/transport/handler.d.ts.map +1 -1
- package/dist/client/transport/handler.js +5 -3
- package/dist/client/transport/handler.js.map +1 -1
- package/dist/client/transport/traffic.d.ts +2 -4
- package/dist/client/transport/traffic.d.ts.map +1 -1
- package/dist/client/transport/traffic.js.map +1 -1
- package/dist/client/types.d.ts +24 -0
- package/dist/client/types.d.ts.map +1 -1
- package/dist/client/view.d.ts +3 -2
- package/dist/client/view.d.ts.map +1 -1
- package/dist/client/view.js.map +1 -1
- package/dist/core/api/clients.d.ts +5 -5
- package/dist/core/api/clients.d.ts.map +1 -1
- package/dist/core/api/groups.d.ts +18 -0
- package/dist/core/api/groups.d.ts.map +1 -1
- package/dist/core/api/groups.js +46 -7
- package/dist/core/api/groups.js.map +1 -1
- package/dist/core/channel-tree.d.ts +2 -0
- package/dist/core/channel-tree.d.ts.map +1 -1
- package/dist/core/channel-tree.js +2 -0
- package/dist/core/channel-tree.js.map +1 -1
- package/dist/core/command-name.d.ts +2 -2
- package/dist/core/command-name.d.ts.map +1 -1
- package/dist/core/command-name.js +2 -2
- package/dist/core/command-name.js.map +1 -1
- package/dist/core/events.d.ts +38 -1
- package/dist/core/events.d.ts.map +1 -1
- package/dist/core/notification-name.d.ts +1 -1
- package/dist/core/notification-name.d.ts.map +1 -1
- package/dist/core/notification-name.js +1 -1
- package/dist/core/notification-name.js.map +1 -1
- package/package.json +1 -1
- package/src/client/api/files.ts +16 -1
- package/src/client/api/voice.ts +16 -5
- package/src/client/client.ts +94 -12
- package/src/client/connection-info.ts +2 -1
- package/src/client/discovery/resolver.ts +56 -8
- package/src/client/index.ts +3 -1
- package/src/client/transport/handler.ts +10 -5
- package/src/client/transport/traffic.ts +2 -1
- package/src/client/types.ts +26 -0
- package/src/client/view.ts +3 -2
- package/src/core/api/clients.ts +5 -5
- package/src/core/api/groups.ts +58 -6
- package/src/core/channel-tree.ts +2 -0
- package/src/core/command-name.ts +2 -2
- package/src/core/events.ts +38 -1
- package/src/core/notification-name.ts +1 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"files.d.ts","sourceRoot":"","sources":["../../../src/client/api/files.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAEH,OAAO,EAAE,QAAQ,EAAa,QAAQ,EAAY,MAAM,aAAa,CAAC;AAEtE,OAAO,KAAK,EACV,SAAS,EACT,eAAe,EAEf,mBAAmB,EAEnB,iBAAiB,EAClB,MAAM,qBAAqB,CAAC;AAI7B,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,gBAAgB,CAAC;AAE1D;;;;GAIG;AACH,MAAM,WAAW,iBAAkB,SAAQ,iBAAiB,EAAE,mBAAmB;IAC/E;;;;OAIG;IACH,QAAQ,CAAC,IAAI,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IACnC;;;;;OAKG;IACH,QAAQ,CAAC,IAAI,CAAC,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,CAAC;CAC7C;AAED;;;GAGG;AACH,MAAM,WAAW,mBAAoB,SAAQ,mBAAmB,EAAE,mBAAmB;IACnF,4EAA4E;IAC5E,QAAQ,CAAC,IAAI,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IACnC;;;;OAIG;IACH,QAAQ,CAAC,IAAI,CAAC,EAAE,QAAQ,GAAG,SAAS,CAAC;IACrC;;;;;OAKG;IACH,QAAQ,CAAC,OAAO,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;CACvC;
|
|
1
|
+
{"version":3,"file":"files.d.ts","sourceRoot":"","sources":["../../../src/client/api/files.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAEH,OAAO,EAAE,QAAQ,EAAa,QAAQ,EAAY,MAAM,aAAa,CAAC;AAEtE,OAAO,KAAK,EACV,SAAS,EACT,eAAe,EAEf,mBAAmB,EAEnB,iBAAiB,EAClB,MAAM,qBAAqB,CAAC;AAI7B,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,gBAAgB,CAAC;AAE1D;;;;GAIG;AACH,MAAM,WAAW,iBAAkB,SAAQ,iBAAiB,EAAE,mBAAmB;IAC/E;;;;OAIG;IACH,QAAQ,CAAC,IAAI,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IACnC;;;;;OAKG;IACH,QAAQ,CAAC,IAAI,CAAC,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,CAAC;CAC7C;AAED;;;GAGG;AACH,MAAM,WAAW,mBAAoB,SAAQ,mBAAmB,EAAE,mBAAmB;IACnF,4EAA4E;IAC5E,QAAQ,CAAC,IAAI,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IACnC;;;;OAIG;IACH,QAAQ,CAAC,IAAI,CAAC,EAAE,QAAQ,GAAG,SAAS,CAAC;IACrC;;;;;OAKG;IACH,QAAQ,CAAC,OAAO,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;CACvC;AAqHD;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA6BG;AACH,wBAAsB,UAAU,CAC9B,MAAM,EAAE,eAAe,EACvB,SAAS,EAAE,SAAS,EACpB,IAAI,EAAE,MAAM,EACZ,IAAI,EAAE,UAAU,GAAG,QAAQ,EAC3B,OAAO,GAAE,iBAAsB,GAC9B,OAAO,CAAC,IAAI,CAAC,CAqBf;AAED;;;;;;;;;;;;;;;;;;;GAmBG;AACH,wBAAgB,YAAY,CAC1B,MAAM,EAAE,eAAe,EACvB,SAAS,EAAE,SAAS,EACpB,IAAI,EAAE,MAAM,EACZ,OAAO,EAAE,mBAAmB,GAAG;IAAE,QAAQ,CAAC,IAAI,EAAE,QAAQ,CAAA;CAAE,GACzD,OAAO,CAAC,IAAI,CAAC,CAAC;AACjB,wBAAgB,YAAY,CAC1B,MAAM,EAAE,eAAe,EACvB,SAAS,EAAE,SAAS,EACpB,IAAI,EAAE,MAAM,EACZ,OAAO,CAAC,EAAE,mBAAmB,GAC5B,OAAO,CAAC,UAAU,CAAC,CAAC"}
|
package/dist/client/api/files.js
CHANGED
|
@@ -50,6 +50,20 @@ function transferOptions(options) {
|
|
|
50
50
|
idleTimeoutMs: options.idleTimeoutMs,
|
|
51
51
|
};
|
|
52
52
|
}
|
|
53
|
+
/**
|
|
54
|
+
* How much of a file in memory is handed to the transfer at a time. The
|
|
55
|
+
* `progress` hook counts the bytes as they go out; the whole file as one chunk
|
|
56
|
+
* would be counted, at once, before it was sent.
|
|
57
|
+
*/
|
|
58
|
+
const UPLOAD_CHUNK_BYTES = 64 * 1024;
|
|
59
|
+
/** The file in chunks of UPLOAD_CHUNK_BYTES, one empty chunk for an empty file. */
|
|
60
|
+
function* chunksOf(data) {
|
|
61
|
+
if (data.length === 0)
|
|
62
|
+
yield data;
|
|
63
|
+
for (let at = 0; at < data.length; at += UPLOAD_CHUNK_BYTES) {
|
|
64
|
+
yield data.subarray(at, at + UPLOAD_CHUNK_BYTES);
|
|
65
|
+
}
|
|
66
|
+
}
|
|
53
67
|
function sizeOf(data, declared) {
|
|
54
68
|
const size = declared === undefined ? undefined : BigInt(declared);
|
|
55
69
|
if (size !== undefined && (size < 0n || !Number.isInteger(Number(declared)))) {
|
|
@@ -127,7 +141,7 @@ export async function uploadFile(client, channelID, path, data, options = {}) {
|
|
|
127
141
|
const skip = Number(info.seekPosition);
|
|
128
142
|
let source;
|
|
129
143
|
if (data instanceof Uint8Array)
|
|
130
|
-
source = Readable.from(
|
|
144
|
+
source = Readable.from(chunksOf(data.subarray(skip)));
|
|
131
145
|
else if (skip === 0)
|
|
132
146
|
source = data;
|
|
133
147
|
else
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"files.js","sourceRoot":"","sources":["../../../src/client/api/files.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"files.js","sourceRoot":"","sources":["../../../src/client/api/files.ts"],"names":[],"mappings":"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"}
|
|
@@ -29,15 +29,26 @@ export declare function getChannelDescription(client: Client, cid: ChannelID, op
|
|
|
29
29
|
*/
|
|
30
30
|
export declare function getServerVariables(client: Client, options?: CommandOptions): Promise<Readonly<Record<string, string>>>;
|
|
31
31
|
/**
|
|
32
|
-
* Subscribe to a channel:
|
|
33
|
-
*
|
|
32
|
+
* Subscribe to a channel: see its clients and their changes without joining
|
|
33
|
+
* it. It does not bring the channel's voice, which only reaches the clients
|
|
34
|
+
* in it. The server answers with `channelSubscribed`.
|
|
35
|
+
*
|
|
36
|
+
* The channel this client joins, and every channel it moves into, is
|
|
37
|
+
* subscribed without being asked and without a `channelSubscribed`, and
|
|
38
|
+
* leaving a channel keeps the subscription. Measured on TeamSpeak 3 3.13.8 and
|
|
39
|
+
* TeamSpeak 6 6.0.0-beta13.1.
|
|
34
40
|
*/
|
|
35
41
|
export declare function subscribeChannel(client: Client, cid: ChannelID, options?: CommandOptions): Promise<void>;
|
|
36
|
-
/**
|
|
42
|
+
/**
|
|
43
|
+
* Stop seeing a subscribed channel's clients: the server answers with
|
|
44
|
+
* `channelUnsubscribed`, and sends no `clientLeftView` for them. The channel
|
|
45
|
+
* this client is in cannot be unsubscribed from: the command succeeds and
|
|
46
|
+
* changes nothing.
|
|
47
|
+
*/
|
|
37
48
|
export declare function unsubscribeChannel(client: Client, cid: ChannelID, options?: CommandOptions): Promise<void>;
|
|
38
|
-
/** Subscribe to every channel on the server. */
|
|
49
|
+
/** Subscribe to every channel on the server; the server answers with a `channelSubscribed` per channel it subscribes. */
|
|
39
50
|
export declare function subscribeAllChannels(client: Client, options?: CommandOptions): Promise<void>;
|
|
40
|
-
/** Unsubscribe from every channel
|
|
51
|
+
/** Unsubscribe from every channel but the one this client is in: a `channelUnsubscribed` for each. */
|
|
41
52
|
export declare function unsubscribeAllChannels(client: Client, options?: CommandOptions): Promise<void>;
|
|
42
53
|
/**
|
|
43
54
|
* Whether `password` is the server's password (`verifyserverpassword`),
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"voice.d.ts","sourceRoot":"","sources":["../../../src/client/api/voice.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,cAAc,CAAC;AAE3C,OAAO,KAAK,EAAE,SAAS,EAAE,QAAQ,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAC;AAE/E;;;;;GAKG;AACH,wBAAsB,qBAAqB,CACzC,MAAM,EAAE,MAAM,EACd,GAAG,EAAE,SAAS,EACd,OAAO,CAAC,EAAE,cAAc,GACvB,OAAO,CAAC,MAAM,CAAC,CAYjB;AAED;;;;;;;;;;;GAWG;AACH,wBAAsB,kBAAkB,CACtC,MAAM,EAAE,MAAM,EACd,OAAO,CAAC,EAAE,cAAc,GACvB,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC,CAO3C;AAED
|
|
1
|
+
{"version":3,"file":"voice.d.ts","sourceRoot":"","sources":["../../../src/client/api/voice.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,cAAc,CAAC;AAE3C,OAAO,KAAK,EAAE,SAAS,EAAE,QAAQ,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAC;AAE/E;;;;;GAKG;AACH,wBAAsB,qBAAqB,CACzC,MAAM,EAAE,MAAM,EACd,GAAG,EAAE,SAAS,EACd,OAAO,CAAC,EAAE,cAAc,GACvB,OAAO,CAAC,MAAM,CAAC,CAYjB;AAED;;;;;;;;;;;GAWG;AACH,wBAAsB,kBAAkB,CACtC,MAAM,EAAE,MAAM,EACd,OAAO,CAAC,EAAE,cAAc,GACvB,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC,CAO3C;AAED;;;;;;;;;GASG;AACH,wBAAsB,gBAAgB,CACpC,MAAM,EAAE,MAAM,EACd,GAAG,EAAE,SAAS,EACd,OAAO,CAAC,EAAE,cAAc,GACvB,OAAO,CAAC,IAAI,CAAC,CAEf;AAED;;;;;GAKG;AACH,wBAAsB,kBAAkB,CACtC,MAAM,EAAE,MAAM,EACd,GAAG,EAAE,SAAS,EACd,OAAO,CAAC,EAAE,cAAc,GACvB,OAAO,CAAC,IAAI,CAAC,CAEf;AAED,yHAAyH;AACzH,wBAAsB,oBAAoB,CACxC,MAAM,EAAE,MAAM,EACd,OAAO,CAAC,EAAE,cAAc,GACvB,OAAO,CAAC,IAAI,CAAC,CAEf;AAED,sGAAsG;AACtG,wBAAsB,sBAAsB,CAC1C,MAAM,EAAE,MAAM,EACd,OAAO,CAAC,EAAE,cAAc,GACvB,OAAO,CAAC,IAAI,CAAC,CAEf;AAaD;;;;;;GAMG;AACH,wBAAgB,oBAAoB,CAClC,MAAM,EAAE,MAAM,EACd,QAAQ,EAAE,MAAM,EAChB,OAAO,CAAC,EAAE,cAAc,GACvB,OAAO,CAAC,OAAO,CAAC,CAalB;AAED;;;;;;;GAOG;AACH,wBAAgB,qBAAqB,CACnC,MAAM,EAAE,MAAM,EACd,GAAG,EAAE,SAAS,EACd,QAAQ,EAAE,MAAM,EAChB,OAAO,CAAC,EAAE,cAAc,GACvB,OAAO,CAAC,OAAO,CAAC,CAgBlB;AAaD;;;;;;;GAOG;AACH,wBAAgB,WAAW,CACzB,MAAM,EAAE,MAAM,EACd,SAAS,EAAE,SAAS,QAAQ,EAAE,EAC9B,OAAO,CAAC,EAAE,cAAc,GACvB,OAAO,CAAC,IAAI,CAAC,CAEf;AAED;;;GAGG;AACH,wBAAgB,aAAa,CAC3B,MAAM,EAAE,MAAM,EACd,SAAS,EAAE,SAAS,QAAQ,EAAE,EAC9B,OAAO,CAAC,EAAE,cAAc,GACvB,OAAO,CAAC,IAAI,CAAC,CAEf"}
|
package/dist/client/api/voice.js
CHANGED
|
@@ -44,21 +44,32 @@ export async function getServerVariables(client, options) {
|
|
|
44
44
|
return answer;
|
|
45
45
|
}
|
|
46
46
|
/**
|
|
47
|
-
* Subscribe to a channel:
|
|
48
|
-
*
|
|
47
|
+
* Subscribe to a channel: see its clients and their changes without joining
|
|
48
|
+
* it. It does not bring the channel's voice, which only reaches the clients
|
|
49
|
+
* in it. The server answers with `channelSubscribed`.
|
|
50
|
+
*
|
|
51
|
+
* The channel this client joins, and every channel it moves into, is
|
|
52
|
+
* subscribed without being asked and without a `channelSubscribed`, and
|
|
53
|
+
* leaving a channel keeps the subscription. Measured on TeamSpeak 3 3.13.8 and
|
|
54
|
+
* TeamSpeak 6 6.0.0-beta13.1.
|
|
49
55
|
*/
|
|
50
56
|
export async function subscribeChannel(client, cid, options) {
|
|
51
57
|
await client.send({ command: "channelsubscribe", params: [["cid", cid]] }, options);
|
|
52
58
|
}
|
|
53
|
-
/**
|
|
59
|
+
/**
|
|
60
|
+
* Stop seeing a subscribed channel's clients: the server answers with
|
|
61
|
+
* `channelUnsubscribed`, and sends no `clientLeftView` for them. The channel
|
|
62
|
+
* this client is in cannot be unsubscribed from: the command succeeds and
|
|
63
|
+
* changes nothing.
|
|
64
|
+
*/
|
|
54
65
|
export async function unsubscribeChannel(client, cid, options) {
|
|
55
66
|
await client.send({ command: "channelunsubscribe", params: [["cid", cid]] }, options);
|
|
56
67
|
}
|
|
57
|
-
/** Subscribe to every channel on the server. */
|
|
68
|
+
/** Subscribe to every channel on the server; the server answers with a `channelSubscribed` per channel it subscribes. */
|
|
58
69
|
export async function subscribeAllChannels(client, options) {
|
|
59
70
|
await client.send({ command: "channelsubscribeall" }, options);
|
|
60
71
|
}
|
|
61
|
-
/** Unsubscribe from every channel
|
|
72
|
+
/** Unsubscribe from every channel but the one this client is in: a `channelUnsubscribed` for each. */
|
|
62
73
|
export async function unsubscribeAllChannels(client, options) {
|
|
63
74
|
await client.send({ command: "channelunsubscribeall" }, options);
|
|
64
75
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"voice.js","sourceRoot":"","sources":["../../../src/client/api/voice.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAGH,OAAO,EAAE,SAAS,EAAE,WAAW,EAAE,WAAW,EAAE,MAAM,qBAAqB,CAAC;AAG1E;;;;;GAKG;AACH,MAAM,CAAC,KAAK,UAAU,qBAAqB,CACzC,MAAc,EACd,GAAc,EACd,OAAwB;IAExB,MAAM,IAAI,GAAG,MAAM,MAAM,CAAC,IAAI,CAC5B,EAAE,OAAO,EAAE,uBAAuB,EAAE,MAAM,EAAE,CAAC,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC,EAAE,EAC5D,OAAO,CACR,CAAC;IACF,2EAA2E;IAC3E,yEAAyE;IACzE,4CAA4C;IAC5C,MAAM,MAAM,GAAG,IAAI,CAAC,IAAI,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,MAAM,CAAC,GAAG,CAAC,IAAI,qBAAqB,IAAI,GAAG,CAAC,CAAC;IAC9F,gDAAgD;IAChD,IAAI,MAAM,KAAK,SAAS;QAAE,MAAM,IAAI,WAAW,CAAC,uBAAuB,CAAC,CAAC;IACzE,OAAO,MAAM,CAAC,qBAAqB,CAAC,IAAI,EAAE,CAAC;AAC7C,CAAC;AAED;;;;;;;;;;;GAWG;AACH,MAAM,CAAC,KAAK,UAAU,kBAAkB,CACtC,MAAc,EACd,OAAwB;IAExB,MAAM,IAAI,GAAG,MAAM,MAAM,CAAC,IAAI,CAAC,EAAE,OAAO,EAAE,oBAAoB,EAAE,EAAE,OAAO,CAAC,CAAC;IAC3E,MAAM,MAAM,GAAG,IAAI,CAAC,IAAI,CAAC,CAAC,GAAG,EAAE,EAAE,CAC/B,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,CAAC,UAAU,CAAC,gBAAgB,CAAC,CAAC,CACjE,CAAC;IACF,IAAI,MAAM,KAAK,SAAS;QAAE,MAAM,IAAI,WAAW,CAAC,oBAAoB,CAAC,CAAC;IACtE,OAAO,MAAM,CAAC;AAChB,CAAC;AAED
|
|
1
|
+
{"version":3,"file":"voice.js","sourceRoot":"","sources":["../../../src/client/api/voice.ts"],"names":[],"mappings":"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"}
|
package/dist/client/client.d.ts
CHANGED
|
@@ -5,6 +5,7 @@ import { type FileTransferOptions } from "./transfer.js";
|
|
|
5
5
|
import type { ClientVersion, CommandExecutor, CommandRequest } from "@honeybbq/teamspeak";
|
|
6
6
|
import type { FileUploadInfo, FileDownloadInfo } from "@honeybbq/teamspeak";
|
|
7
7
|
import type { Readable, Writable } from "node:stream";
|
|
8
|
+
import type { EventIterator, RoundTripEstimate } from "./types.js";
|
|
8
9
|
import { type ServerCapabilities } from "./capabilities.js";
|
|
9
10
|
import { type ServerView } from "./view.js";
|
|
10
11
|
/**
|
|
@@ -43,6 +44,22 @@ export declare class Client implements CommandExecutor, AsyncDisposable {
|
|
|
43
44
|
get view(): ServerView;
|
|
44
45
|
/** Where the client is in its connection's life. */
|
|
45
46
|
get status(): ClientStatus;
|
|
47
|
+
/**
|
|
48
|
+
* The keepalive ping/pong round trip of the voice connection: the mean and
|
|
49
|
+
* the standard deviation over the last 10 pongs, or `undefined` when the
|
|
50
|
+
* client is not connected or no pong has arrived yet. A ping goes every 5
|
|
51
|
+
* seconds, so the first value comes about 5 seconds after connecting, and
|
|
52
|
+
* each connection, a reconnect included, starts over.
|
|
53
|
+
*
|
|
54
|
+
* It is the value this client reports as `connection_ping` and
|
|
55
|
+
* `connection_ping_deviation` when the server asks for its connection info,
|
|
56
|
+
* and the server keeps what it was told: the ping other clients see for this
|
|
57
|
+
* one is this value as it was when the server last asked, not as it is now
|
|
58
|
+
* (measured on TeamSpeak 3 and 6). A client cannot read its own
|
|
59
|
+
* `connection_ping` from the server: `getconnectioninfo` about itself has no
|
|
60
|
+
* such field.
|
|
61
|
+
*/
|
|
62
|
+
get roundTrip(): RoundTripEstimate | undefined;
|
|
46
63
|
/**
|
|
47
64
|
* Connect to the server. Resolves once the handshake completes.
|
|
48
65
|
*
|
|
@@ -166,8 +183,10 @@ export declare class Client implements CommandExecutor, AsyncDisposable {
|
|
|
166
183
|
* missed. The buffer is unbounded: an iterator that is not consumed as fast
|
|
167
184
|
* as events arrive holds every one of them in memory until it is read, so
|
|
168
185
|
* stop iterating (or abort `signal`) when you stop reading. Voice is the
|
|
169
|
-
* exception: at most 256 `voiceData` frames are buffered, and
|
|
170
|
-
* dropped
|
|
186
|
+
* exception: at most 256 `voiceData` frames are buffered, and when it is
|
|
187
|
+
* full the OLDEST frame is dropped for each one that arrives, because for
|
|
188
|
+
* live audio the newest is the one still worth playing. The iterator's
|
|
189
|
+
* `dropped` counts them.
|
|
171
190
|
*
|
|
172
191
|
* Iteration ends when the loop exits early (`break`, `return`, a throw), and
|
|
173
192
|
* — for every event but `disconnected` — when the client disconnects. When
|
|
@@ -180,7 +199,14 @@ export declare class Client implements CommandExecutor, AsyncDisposable {
|
|
|
180
199
|
*/
|
|
181
200
|
events<K extends keyof EventMap>(event: K, options?: {
|
|
182
201
|
readonly signal?: AbortSignal | undefined;
|
|
183
|
-
}):
|
|
202
|
+
}): EventIterator<EventMap[K]>;
|
|
203
|
+
/**
|
|
204
|
+
* Numbers the sessions this client has completed, from 1; it is 0 before the
|
|
205
|
+
* first. Every connect, and every reconnect, is a new session, even when the
|
|
206
|
+
* server hands out the client id the last one had. `VoiceDataEvent.session`
|
|
207
|
+
* is this at the time the packet arrived.
|
|
208
|
+
*/
|
|
209
|
+
get session(): number;
|
|
184
210
|
/** This client's id on the server, assigned in the handshake; 0 before it. */
|
|
185
211
|
get clientID(): ClientID;
|
|
186
212
|
/**
|
|
@@ -212,7 +238,9 @@ export declare class Client implements CommandExecutor, AsyncDisposable {
|
|
|
212
238
|
* connected, and a RangeError for no target at all, more than 32 clients,
|
|
213
239
|
* more than 255 channels, or an id the packet cannot hold. Whether a target
|
|
214
240
|
* hears it is the server's decision, from `i_client_whisper_power` against
|
|
215
|
-
* the target's `i_client_needed_whisper_power`.
|
|
241
|
+
* the target's `i_client_needed_whisper_power`. Talk power does not apply to
|
|
242
|
+
* a whisper, but the rest of what decides whether voice is relayed does: see
|
|
243
|
+
* `sendVoice`.
|
|
216
244
|
*/
|
|
217
245
|
sendWhisper(data: Uint8Array, targets: WhisperTargets, codec: Codec): void;
|
|
218
246
|
/**
|
|
@@ -229,6 +257,14 @@ export declare class Client implements CommandExecutor, AsyncDisposable {
|
|
|
229
257
|
* frame marks the end of speech: the server relays it, and listeners get a
|
|
230
258
|
* `voiceData` event with empty `data`. Throws a NotConnectedError unless the
|
|
231
259
|
* client is connected.
|
|
260
|
+
*
|
|
261
|
+
* The server relays it only while this client may talk in the channel, its
|
|
262
|
+
* `isTalker` set or its talk power at least the channel's needed talk power,
|
|
263
|
+
* and is not away, input-muted or without input hardware, as it last told
|
|
264
|
+
* the server with `updateClient`; otherwise the frame is dropped without an
|
|
265
|
+
* error. A listener gets it only while it is not output-muted and has
|
|
266
|
+
* output hardware. Subscribing to a channel does not bring its voice.
|
|
267
|
+
* Measured on TeamSpeak 3 3.13.8 and TeamSpeak 6 6.0.0-beta13.1.
|
|
232
268
|
*/
|
|
233
269
|
sendVoice(data: Uint8Array, codec: Codec, options?: VoiceOptions): void;
|
|
234
270
|
/**
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../../src/client/client.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,KAAK,QAAQ,EACb,KAAK,YAAY,EACjB,KAAK,cAAc,EACnB,KAAK,kBAAkB,EACvB,KAAK,aAAa,EAOnB,MAAM,YAAY,CAAC;AAIpB,OAAO,EACL,KAAK,SAAS,EAEd,KAAK,QAAQ,EACb,KAAK,KAAK,EAGV,KAAK,cAAc,EACnB,KAAK,GAAG,EAGR,KAAK,QAAQ,EAGb,KAAK,WAAW,EAGhB,YAAY,EAKb,MAAM,qBAAqB,CAAC;AAG7B,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,mBAAmB,CAAC;AAiBlD,OAAO,EAAoC,KAAK,mBAAmB,EAAE,MAAM,eAAe,CAAC;AAW3F,OAAO,KAAK,EAAE,aAAa,EAAE,eAAe,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAC;AAa1F,OAAO,KAAK,EAAE,cAAc,EAAE,gBAAgB,EAAE,MAAM,qBAAqB,CAAC;AAG5E,OAAO,KAAK,EAAE,QAAQ,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;
|
|
1
|
+
{"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../../src/client/client.ts"],"names":[],"mappings":"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"}
|
package/dist/client/client.js
CHANGED
|
@@ -253,6 +253,8 @@ export class Client {
|
|
|
253
253
|
/** The group list rows of the command line being handled, by the name of the line. */
|
|
254
254
|
#groupLine;
|
|
255
255
|
#voiceDropped = 0;
|
|
256
|
+
#voiceDropTimer;
|
|
257
|
+
#sessionCount = 0;
|
|
256
258
|
#voiceDropWarnedAt = -Infinity;
|
|
257
259
|
#eventMiddlewares;
|
|
258
260
|
#send;
|
|
@@ -341,6 +343,26 @@ export class Client {
|
|
|
341
343
|
get status() {
|
|
342
344
|
return this.#status;
|
|
343
345
|
}
|
|
346
|
+
/**
|
|
347
|
+
* The keepalive ping/pong round trip of the voice connection: the mean and
|
|
348
|
+
* the standard deviation over the last 10 pongs, or `undefined` when the
|
|
349
|
+
* client is not connected or no pong has arrived yet. A ping goes every 5
|
|
350
|
+
* seconds, so the first value comes about 5 seconds after connecting, and
|
|
351
|
+
* each connection, a reconnect included, starts over.
|
|
352
|
+
*
|
|
353
|
+
* It is the value this client reports as `connection_ping` and
|
|
354
|
+
* `connection_ping_deviation` when the server asks for its connection info,
|
|
355
|
+
* and the server keeps what it was told: the ping other clients see for this
|
|
356
|
+
* one is this value as it was when the server last asked, not as it is now
|
|
357
|
+
* (measured on TeamSpeak 3 and 6). A client cannot read its own
|
|
358
|
+
* `connection_ping` from the server: `getconnectioninfo` about itself has no
|
|
359
|
+
* such field.
|
|
360
|
+
*/
|
|
361
|
+
get roundTrip() {
|
|
362
|
+
if (this.#status !== ClientStatus.Connected)
|
|
363
|
+
return undefined;
|
|
364
|
+
return this.#handler.roundTrip ?? undefined;
|
|
365
|
+
}
|
|
344
366
|
// ---- Connection -----------------------------------------------------------
|
|
345
367
|
/**
|
|
346
368
|
* Connect to the server. Resolves once the handshake completes.
|
|
@@ -777,8 +799,10 @@ export class Client {
|
|
|
777
799
|
* missed. The buffer is unbounded: an iterator that is not consumed as fast
|
|
778
800
|
* as events arrive holds every one of them in memory until it is read, so
|
|
779
801
|
* stop iterating (or abort `signal`) when you stop reading. Voice is the
|
|
780
|
-
* exception: at most 256 `voiceData` frames are buffered, and
|
|
781
|
-
* dropped
|
|
802
|
+
* exception: at most 256 `voiceData` frames are buffered, and when it is
|
|
803
|
+
* full the OLDEST frame is dropped for each one that arrives, because for
|
|
804
|
+
* live audio the newest is the one still worth playing. The iterator's
|
|
805
|
+
* `dropped` counts them.
|
|
782
806
|
*
|
|
783
807
|
* Iteration ends when the loop exits early (`break`, `return`, a throw), and
|
|
784
808
|
* — for every event but `disconnected` — when the client disconnects. When
|
|
@@ -791,6 +815,7 @@ export class Client {
|
|
|
791
815
|
*/
|
|
792
816
|
events(event, options = {}) {
|
|
793
817
|
const { signal } = options;
|
|
818
|
+
let dropped = 0;
|
|
794
819
|
const buffered = [];
|
|
795
820
|
// The next() calls waiting for an event, oldest first.
|
|
796
821
|
const waiting = [];
|
|
@@ -810,8 +835,9 @@ export class Client {
|
|
|
810
835
|
return;
|
|
811
836
|
}
|
|
812
837
|
if (event === "voiceData" && buffered.length >= MAX_PENDING_DELIVERIES) {
|
|
838
|
+
buffered.shift();
|
|
839
|
+
dropped++;
|
|
813
840
|
this.#dropVoice();
|
|
814
|
-
return;
|
|
815
841
|
}
|
|
816
842
|
buffered.push(payload);
|
|
817
843
|
}));
|
|
@@ -841,6 +867,9 @@ export class Client {
|
|
|
841
867
|
else
|
|
842
868
|
signal?.addEventListener("abort", abort, { once: true });
|
|
843
869
|
const iterator = {
|
|
870
|
+
get dropped() {
|
|
871
|
+
return dropped;
|
|
872
|
+
},
|
|
844
873
|
next() {
|
|
845
874
|
if (aborted)
|
|
846
875
|
return Promise.reject(abortReason(signal));
|
|
@@ -865,6 +894,15 @@ export class Client {
|
|
|
865
894
|
return iterator;
|
|
866
895
|
}
|
|
867
896
|
// ---- API shorthand -------------------------------------------------------
|
|
897
|
+
/**
|
|
898
|
+
* Numbers the sessions this client has completed, from 1; it is 0 before the
|
|
899
|
+
* first. Every connect, and every reconnect, is a new session, even when the
|
|
900
|
+
* server hands out the client id the last one had. `VoiceDataEvent.session`
|
|
901
|
+
* is this at the time the packet arrived.
|
|
902
|
+
*/
|
|
903
|
+
get session() {
|
|
904
|
+
return this.#sessionCount;
|
|
905
|
+
}
|
|
868
906
|
/** This client's id on the server, assigned in the handshake; 0 before it. */
|
|
869
907
|
get clientID() {
|
|
870
908
|
return asClientID(this.#clid);
|
|
@@ -906,7 +944,9 @@ export class Client {
|
|
|
906
944
|
* connected, and a RangeError for no target at all, more than 32 clients,
|
|
907
945
|
* more than 255 channels, or an id the packet cannot hold. Whether a target
|
|
908
946
|
* hears it is the server's decision, from `i_client_whisper_power` against
|
|
909
|
-
* the target's `i_client_needed_whisper_power`.
|
|
947
|
+
* the target's `i_client_needed_whisper_power`. Talk power does not apply to
|
|
948
|
+
* a whisper, but the rest of what decides whether voice is relayed does: see
|
|
949
|
+
* `sendVoice`.
|
|
910
950
|
*/
|
|
911
951
|
sendWhisper(data, targets, codec) {
|
|
912
952
|
if (!this.#canSend(false))
|
|
@@ -934,6 +974,14 @@ export class Client {
|
|
|
934
974
|
* frame marks the end of speech: the server relays it, and listeners get a
|
|
935
975
|
* `voiceData` event with empty `data`. Throws a NotConnectedError unless the
|
|
936
976
|
* client is connected.
|
|
977
|
+
*
|
|
978
|
+
* The server relays it only while this client may talk in the channel, its
|
|
979
|
+
* `isTalker` set or its talk power at least the channel's needed talk power,
|
|
980
|
+
* and is not away, input-muted or without input hardware, as it last told
|
|
981
|
+
* the server with `updateClient`; otherwise the frame is dropped without an
|
|
982
|
+
* error. A listener gets it only while it is not output-muted and has
|
|
983
|
+
* output hardware. Subscribing to a channel does not bring its voice.
|
|
984
|
+
* Measured on TeamSpeak 3 3.13.8 and TeamSpeak 6 6.0.0-beta13.1.
|
|
937
985
|
*/
|
|
938
986
|
sendVoice(data, codec, options) {
|
|
939
987
|
// Reserved: VoiceOptions has no fields to read yet.
|
|
@@ -970,6 +1018,7 @@ export class Client {
|
|
|
970
1018
|
if (this.#status !== ClientStatus.Connecting || this.#attempt.settled)
|
|
971
1019
|
return;
|
|
972
1020
|
this.#status = ClientStatus.Connected;
|
|
1021
|
+
this.#sessionCount++;
|
|
973
1022
|
// A privilege key is spent by the join that used it: a reconnection must
|
|
974
1023
|
// not present it again.
|
|
975
1024
|
if (this.#clientInitOptions.privilegeKey !== "") {
|
|
@@ -1075,6 +1124,8 @@ export class Client {
|
|
|
1075
1124
|
/** Report the end of the session in progress, once. */
|
|
1076
1125
|
#endSession(error) {
|
|
1077
1126
|
this.#viewStore.end(error);
|
|
1127
|
+
// Report the voice this session dropped now, not after it ended.
|
|
1128
|
+
this.#reportVoiceDrops(performance.now());
|
|
1078
1129
|
const session = this.#session;
|
|
1079
1130
|
if (session === undefined)
|
|
1080
1131
|
return;
|
|
@@ -1213,7 +1264,7 @@ export class Client {
|
|
|
1213
1264
|
return;
|
|
1214
1265
|
}
|
|
1215
1266
|
if ((pType === 0 /* Voice */ || pType === 1) /* VoiceWhisper */ && p.data.length >= 5) {
|
|
1216
|
-
this.#handleVoicePacket(p.data);
|
|
1267
|
+
this.#handleVoicePacket(p.data, pType === 1, p.receivedAt);
|
|
1217
1268
|
return;
|
|
1218
1269
|
}
|
|
1219
1270
|
if ((pType === 2 /* Command */ || pType === 3) /* CommandLow */ && p.data.length > 0) {
|
|
@@ -1222,7 +1273,8 @@ export class Client {
|
|
|
1222
1273
|
}
|
|
1223
1274
|
/**
|
|
1224
1275
|
* Parse an incoming S2C voice packet.
|
|
1225
|
-
* Format: [VId: u16] [CId: u16] [Codec: u8] [Data: var]
|
|
1276
|
+
* Format: [VId: u16] [CId: u16] [Codec: u8] [Data: var]. The VId is the
|
|
1277
|
+
* sender's own packet counter; Voice and VoiceWhisper have the same layout.
|
|
1226
1278
|
*
|
|
1227
1279
|
* A packet with no data is how a speaker's last frame is followed: the
|
|
1228
1280
|
* server relays the empty frame a client sends when it stops talking, and it
|
|
@@ -1230,7 +1282,7 @@ export class Client {
|
|
|
1230
1282
|
* and TeamSpeak 6 6.0.0: the frames of `sendVoice` arrive as 45-byte packets
|
|
1231
1283
|
* and an empty one as a 5-byte packet.
|
|
1232
1284
|
*/
|
|
1233
|
-
#handleVoicePacket(payload) {
|
|
1285
|
+
#handleVoicePacket(payload, whisper, receivedAt) {
|
|
1234
1286
|
// Audio arrives fifty times a second per speaker; build no event nobody
|
|
1235
1287
|
// will see.
|
|
1236
1288
|
if (!this.#listeners.get("voiceData")?.length && this.#eventMiddlewares.length === 0)
|
|
@@ -1240,6 +1292,7 @@ export class Client {
|
|
|
1240
1292
|
return;
|
|
1241
1293
|
}
|
|
1242
1294
|
const view = new DataView(payload.buffer, payload.byteOffset, payload.byteLength);
|
|
1295
|
+
const seq = view.getUint16(0, false);
|
|
1243
1296
|
const clientId = view.getUint16(2, false);
|
|
1244
1297
|
if (clientId === this.#clid)
|
|
1245
1298
|
return;
|
|
@@ -1248,7 +1301,15 @@ export class Client {
|
|
|
1248
1301
|
const data = payload.slice(5);
|
|
1249
1302
|
this.#emitServerEvent({
|
|
1250
1303
|
name: "voiceData",
|
|
1251
|
-
payload: {
|
|
1304
|
+
payload: {
|
|
1305
|
+
session: this.#sessionCount,
|
|
1306
|
+
clientID: asClientID(clientId),
|
|
1307
|
+
whisper,
|
|
1308
|
+
seq,
|
|
1309
|
+
codec: payload[4],
|
|
1310
|
+
data,
|
|
1311
|
+
receivedAt,
|
|
1312
|
+
},
|
|
1252
1313
|
});
|
|
1253
1314
|
}
|
|
1254
1315
|
#handleCommandLines(s) {
|
|
@@ -1615,7 +1676,21 @@ export class Client {
|
|
|
1615
1676
|
#dropVoice() {
|
|
1616
1677
|
this.#voiceDropped++;
|
|
1617
1678
|
const now = performance.now();
|
|
1618
|
-
|
|
1679
|
+
const wait = VOICE_DROP_WARN_INTERVAL_MS - (now - this.#voiceDropWarnedAt);
|
|
1680
|
+
if (wait <= 0) {
|
|
1681
|
+
this.#reportVoiceDrops(now);
|
|
1682
|
+
return;
|
|
1683
|
+
}
|
|
1684
|
+
// Inside the interval: the drops are not lost, the report is deferred to
|
|
1685
|
+
// its end. Reporting only on a later drop would leave the count of a short
|
|
1686
|
+
// burst, which stops before the interval does, unreported for good.
|
|
1687
|
+
this.#voiceDropTimer ??= setTimeout(() => this.#reportVoiceDrops(performance.now()), wait);
|
|
1688
|
+
this.#voiceDropTimer.unref();
|
|
1689
|
+
}
|
|
1690
|
+
#reportVoiceDrops(now) {
|
|
1691
|
+
clearTimeout(this.#voiceDropTimer);
|
|
1692
|
+
this.#voiceDropTimer = undefined;
|
|
1693
|
+
if (this.#voiceDropped === 0)
|
|
1619
1694
|
return;
|
|
1620
1695
|
this.#voiceDropWarnedAt = now;
|
|
1621
1696
|
// The count since the last warning, so each one says how bad it is now.
|