@honeybbq/teamspeak 0.0.1 → 1.0.0-beta.8
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/LICENSE +21 -0
- package/README.md +726 -2
- package/dist/client/abort.d.ts +5 -0
- package/dist/client/abort.d.ts.map +1 -0
- package/dist/client/abort.js +23 -0
- package/dist/client/abort.js.map +1 -0
- package/dist/client/address.d.ts +17 -0
- package/dist/client/address.d.ts.map +1 -0
- package/dist/client/address.js +66 -0
- package/dist/client/address.js.map +1 -0
- package/dist/client/api/voice.d.ts +24 -0
- package/dist/client/api/voice.d.ts.map +1 -0
- package/dist/client/api/voice.js +33 -0
- package/dist/client/api/voice.js.map +1 -0
- package/dist/client/capabilities.d.ts +68 -0
- package/dist/client/capabilities.d.ts.map +1 -0
- package/dist/client/capabilities.js +59 -0
- package/dist/client/capabilities.js.map +1 -0
- package/dist/client/client.d.ts +196 -0
- package/dist/client/client.d.ts.map +1 -0
- package/dist/client/client.js +1523 -0
- package/dist/client/client.js.map +1 -0
- package/dist/client/commands.d.ts +66 -0
- package/dist/client/commands.d.ts.map +1 -0
- package/dist/client/commands.js +162 -0
- package/dist/client/commands.js.map +1 -0
- package/dist/client/crypto/crypt-ops.d.ts +7 -0
- package/dist/client/crypto/crypt-ops.d.ts.map +1 -0
- package/dist/client/crypto/crypt-ops.js +2 -0
- package/dist/client/crypto/crypt-ops.js.map +1 -0
- package/dist/client/crypto/crypt.d.ts +37 -0
- package/dist/client/crypto/crypt.d.ts.map +1 -0
- package/dist/client/crypto/crypt.js +203 -0
- package/dist/client/crypto/crypt.js.map +1 -0
- package/dist/client/crypto/eax.d.ts +12 -0
- package/dist/client/crypto/eax.d.ts.map +1 -0
- package/dist/client/crypto/eax.js +118 -0
- package/dist/client/crypto/eax.js.map +1 -0
- package/dist/client/crypto/identity.d.ts +97 -0
- package/dist/client/crypto/identity.d.ts.map +1 -0
- package/dist/client/crypto/identity.js +412 -0
- package/dist/client/crypto/identity.js.map +1 -0
- package/dist/client/crypto/index.d.ts +7 -0
- package/dist/client/crypto/index.d.ts.map +1 -0
- package/dist/client/crypto/index.js +5 -0
- package/dist/client/crypto/index.js.map +1 -0
- package/dist/client/crypto/primitives.d.ts +43 -0
- package/dist/client/crypto/primitives.d.ts.map +1 -0
- package/dist/client/crypto/primitives.js +116 -0
- package/dist/client/crypto/primitives.js.map +1 -0
- package/dist/client/diagnostics.d.ts +45 -0
- package/dist/client/diagnostics.d.ts.map +1 -0
- package/dist/client/diagnostics.js +30 -0
- package/dist/client/diagnostics.js.map +1 -0
- package/dist/client/discovery/index.d.ts +2 -0
- package/dist/client/discovery/index.d.ts.map +1 -0
- package/dist/client/discovery/index.js +2 -0
- package/dist/client/discovery/index.js.map +1 -0
- package/dist/client/discovery/resolver.d.ts +26 -0
- package/dist/client/discovery/resolver.d.ts.map +1 -0
- package/dist/client/discovery/resolver.js +275 -0
- package/dist/client/discovery/resolver.js.map +1 -0
- package/dist/client/errors.d.ts +82 -0
- package/dist/client/errors.d.ts.map +1 -0
- package/dist/client/errors.js +201 -0
- package/dist/client/errors.js.map +1 -0
- package/dist/client/events.d.ts +3 -0
- package/dist/client/events.d.ts.map +1 -0
- package/dist/client/events.js +8 -0
- package/dist/client/events.js.map +1 -0
- package/dist/client/handshake/crypt-handshake.d.ts +17 -0
- package/dist/client/handshake/crypt-handshake.d.ts.map +1 -0
- package/dist/client/handshake/crypt-handshake.js +128 -0
- package/dist/client/handshake/crypt-handshake.js.map +1 -0
- package/dist/client/handshake/crypt-init2.d.ts +7 -0
- package/dist/client/handshake/crypt-init2.d.ts.map +1 -0
- package/dist/client/handshake/crypt-init2.js +37 -0
- package/dist/client/handshake/crypt-init2.js.map +1 -0
- package/dist/client/handshake/index.d.ts +4 -0
- package/dist/client/handshake/index.d.ts.map +1 -0
- package/dist/client/handshake/index.js +4 -0
- package/dist/client/handshake/index.js.map +1 -0
- package/dist/client/handshake/license.d.ts +35 -0
- package/dist/client/handshake/license.d.ts.map +1 -0
- package/dist/client/handshake/license.js +169 -0
- package/dist/client/handshake/license.js.map +1 -0
- package/dist/client/handshake.d.ts +27 -0
- package/dist/client/handshake.d.ts.map +1 -0
- package/dist/client/handshake.js +126 -0
- package/dist/client/handshake.js.map +1 -0
- package/dist/client/helpers.d.ts +6 -0
- package/dist/client/helpers.d.ts.map +1 -0
- package/dist/client/helpers.js +13 -0
- package/dist/client/helpers.js.map +1 -0
- package/dist/client/hooks.d.ts +7 -0
- package/dist/client/hooks.d.ts.map +1 -0
- package/dist/client/hooks.js +28 -0
- package/dist/client/hooks.js.map +1 -0
- package/dist/client/index.d.ts +26 -0
- package/dist/client/index.d.ts.map +1 -0
- package/dist/client/index.js +28 -0
- package/dist/client/index.js.map +1 -0
- package/dist/client/reconnect.d.ts +12 -0
- package/dist/client/reconnect.d.ts.map +1 -0
- package/dist/client/reconnect.js +44 -0
- package/dist/client/reconnect.js.map +1 -0
- package/dist/client/throttle.d.ts +20 -0
- package/dist/client/throttle.d.ts.map +1 -0
- package/dist/client/throttle.js +83 -0
- package/dist/client/throttle.js.map +1 -0
- package/dist/client/trace.d.ts +223 -0
- package/dist/client/trace.d.ts.map +1 -0
- package/dist/client/trace.js +13 -0
- package/dist/client/trace.js.map +1 -0
- package/dist/client/transfer.d.ts +111 -0
- package/dist/client/transfer.d.ts.map +1 -0
- package/dist/client/transfer.js +243 -0
- package/dist/client/transfer.js.map +1 -0
- package/dist/client/transport/generation-window.d.ts +30 -0
- package/dist/client/transport/generation-window.d.ts.map +1 -0
- package/dist/client/transport/generation-window.js +97 -0
- package/dist/client/transport/generation-window.js.map +1 -0
- package/dist/client/transport/handler.d.ts +61 -0
- package/dist/client/transport/handler.d.ts.map +1 -0
- package/dist/client/transport/handler.js +793 -0
- package/dist/client/transport/handler.js.map +1 -0
- package/dist/client/transport/index.d.ts +6 -0
- package/dist/client/transport/index.d.ts.map +1 -0
- package/dist/client/transport/index.js +5 -0
- package/dist/client/transport/index.js.map +1 -0
- package/dist/client/transport/packet.d.ts +36 -0
- package/dist/client/transport/packet.d.ts.map +1 -0
- package/dist/client/transport/packet.js +55 -0
- package/dist/client/transport/packet.js.map +1 -0
- package/dist/client/transport/quicklz.d.ts +24 -0
- package/dist/client/transport/quicklz.d.ts.map +1 -0
- package/dist/client/transport/quicklz.js +179 -0
- package/dist/client/transport/quicklz.js.map +1 -0
- package/dist/client/types.d.ts +226 -0
- package/dist/client/types.d.ts.map +1 -0
- package/dist/client/types.js +39 -0
- package/dist/client/types.js.map +1 -0
- package/dist/core/api/channels.d.ts +182 -0
- package/dist/core/api/channels.d.ts.map +1 -0
- package/dist/core/api/channels.js +155 -0
- package/dist/core/api/channels.js.map +1 -0
- package/dist/core/api/clients.d.ts +304 -0
- package/dist/core/api/clients.d.ts.map +1 -0
- package/dist/core/api/clients.js +260 -0
- package/dist/core/api/clients.js.map +1 -0
- package/dist/core/api/command.d.ts +305 -0
- package/dist/core/api/command.d.ts.map +1 -0
- package/dist/core/api/command.js +363 -0
- package/dist/core/api/command.js.map +1 -0
- package/dist/core/api/files.d.ts +153 -0
- package/dist/core/api/files.d.ts.map +1 -0
- package/dist/core/api/files.js +181 -0
- package/dist/core/api/files.js.map +1 -0
- package/dist/core/api/groups.d.ts +248 -0
- package/dist/core/api/groups.d.ts.map +1 -0
- package/dist/core/api/groups.js +271 -0
- package/dist/core/api/groups.js.map +1 -0
- package/dist/core/api/moderation.d.ts +205 -0
- package/dist/core/api/moderation.d.ts.map +1 -0
- package/dist/core/api/moderation.js +209 -0
- package/dist/core/api/moderation.js.map +1 -0
- package/dist/core/api/parse.d.ts +16 -0
- package/dist/core/api/parse.d.ts.map +1 -0
- package/dist/core/api/parse.js +40 -0
- package/dist/core/api/parse.js.map +1 -0
- package/dist/core/api/server.d.ts +310 -0
- package/dist/core/api/server.d.ts.map +1 -0
- package/dist/core/api/server.js +290 -0
- package/dist/core/api/server.js.map +1 -0
- package/dist/core/command/command.d.ts +20 -0
- package/dist/core/command/command.d.ts.map +1 -0
- package/dist/core/command/command.js +112 -0
- package/dist/core/command/command.js.map +1 -0
- package/dist/core/command/ids.d.ts +125 -0
- package/dist/core/command/ids.d.ts.map +1 -0
- package/dist/core/command/ids.js +85 -0
- package/dist/core/command/ids.js.map +1 -0
- package/dist/core/command/parser.d.ts +17 -0
- package/dist/core/command/parser.d.ts.map +1 -0
- package/dist/core/command/parser.js +65 -0
- package/dist/core/command/parser.js.map +1 -0
- package/dist/core/command/request.d.ts +61 -0
- package/dist/core/command/request.d.ts.map +1 -0
- package/dist/core/command/request.js +64 -0
- package/dist/core/command/request.js.map +1 -0
- package/dist/core/command/responses.d.ts +59 -0
- package/dist/core/command/responses.d.ts.map +1 -0
- package/dist/core/command/responses.js +74 -0
- package/dist/core/command/responses.js.map +1 -0
- package/dist/core/command-name.d.ts +333 -0
- package/dist/core/command-name.d.ts.map +1 -0
- package/dist/core/command-name.js +331 -0
- package/dist/core/command-name.js.map +1 -0
- package/dist/core/enums.d.ts +146 -0
- package/dist/core/enums.d.ts.map +1 -0
- package/dist/core/enums.js +132 -0
- package/dist/core/enums.js.map +1 -0
- package/dist/core/errorcode.d.ts +413 -0
- package/dist/core/errorcode.d.ts.map +1 -0
- package/dist/core/errorcode.js +410 -0
- package/dist/core/errorcode.js.map +1 -0
- package/dist/core/errors.d.ts +111 -0
- package/dist/core/errors.d.ts.map +1 -0
- package/dist/core/errors.js +233 -0
- package/dist/core/errors.js.map +1 -0
- package/dist/core/events.d.ts +207 -0
- package/dist/core/events.d.ts.map +1 -0
- package/dist/core/events.js +6 -0
- package/dist/core/events.js.map +1 -0
- package/dist/core/helpers.d.ts +42 -0
- package/dist/core/helpers.d.ts.map +1 -0
- package/dist/core/helpers.js +156 -0
- package/dist/core/helpers.js.map +1 -0
- package/dist/core/index.d.ts +35 -0
- package/dist/core/index.d.ts.map +1 -0
- package/dist/core/index.js +34 -0
- package/dist/core/index.js.map +1 -0
- package/dist/core/internal.d.ts +23 -0
- package/dist/core/internal.d.ts.map +1 -0
- package/dist/core/internal.js +20 -0
- package/dist/core/internal.js.map +1 -0
- package/dist/core/middleware.d.ts +14 -0
- package/dist/core/middleware.d.ts.map +1 -0
- package/dist/core/middleware.js +18 -0
- package/dist/core/middleware.js.map +1 -0
- package/dist/core/notification-name.d.ts +154 -0
- package/dist/core/notification-name.d.ts.map +1 -0
- package/dist/core/notification-name.js +152 -0
- package/dist/core/notification-name.js.map +1 -0
- package/dist/core/notifications.d.ts +43 -0
- package/dist/core/notifications.d.ts.map +1 -0
- package/dist/core/notifications.js +116 -0
- package/dist/core/notifications.js.map +1 -0
- package/dist/core/permission-name.d.ts +533 -0
- package/dist/core/permission-name.d.ts.map +1 -0
- package/dist/core/permission-name.js +531 -0
- package/dist/core/permission-name.js.map +1 -0
- package/dist/core/permission.d.ts +31 -0
- package/dist/core/permission.d.ts.map +1 -0
- package/dist/core/permission.js +20 -0
- package/dist/core/permission.js.map +1 -0
- package/dist/core/property-name.d.ts +403 -0
- package/dist/core/property-name.d.ts.map +1 -0
- package/dist/core/property-name.js +405 -0
- package/dist/core/property-name.js.map +1 -0
- package/dist/core/reason.d.ts +39 -0
- package/dist/core/reason.d.ts.map +1 -0
- package/dist/core/reason.js +36 -0
- package/dist/core/reason.js.map +1 -0
- package/dist/core/reconnect.d.ts +59 -0
- package/dist/core/reconnect.d.ts.map +1 -0
- package/dist/core/reconnect.js +55 -0
- package/dist/core/reconnect.js.map +1 -0
- package/dist/core/types.d.ts +110 -0
- package/dist/core/types.d.ts.map +1 -0
- package/dist/core/types.js +27 -0
- package/dist/core/types.js.map +1 -0
- package/dist/query/client.d.ts +194 -0
- package/dist/query/client.d.ts.map +1 -0
- package/dist/query/client.js +969 -0
- package/dist/query/client.js.map +1 -0
- package/dist/query/errors.d.ts +61 -0
- package/dist/query/errors.d.ts.map +1 -0
- package/dist/query/errors.js +100 -0
- package/dist/query/errors.js.map +1 -0
- package/dist/query/index.d.ts +36 -0
- package/dist/query/index.d.ts.map +1 -0
- package/dist/query/index.js +34 -0
- package/dist/query/index.js.map +1 -0
- package/dist/query/knownhosts.d.ts +61 -0
- package/dist/query/knownhosts.d.ts.map +1 -0
- package/dist/query/knownhosts.js +223 -0
- package/dist/query/knownhosts.js.map +1 -0
- package/dist/query/lines.d.ts +14 -0
- package/dist/query/lines.d.ts.map +1 -0
- package/dist/query/lines.js +29 -0
- package/dist/query/lines.js.map +1 -0
- package/dist/query/options.d.ts +187 -0
- package/dist/query/options.d.ts.map +1 -0
- package/dist/query/options.js +213 -0
- package/dist/query/options.js.map +1 -0
- package/dist/query/reconnect.d.ts +29 -0
- package/dist/query/reconnect.d.ts.map +1 -0
- package/dist/query/reconnect.js +87 -0
- package/dist/query/reconnect.js.map +1 -0
- package/dist/query/ssh.d.ts +345 -0
- package/dist/query/ssh.d.ts.map +1 -0
- package/dist/query/ssh.js +241 -0
- package/dist/query/ssh.js.map +1 -0
- package/dist/query/stream.d.ts +38 -0
- package/dist/query/stream.d.ts.map +1 -0
- package/dist/query/stream.js +70 -0
- package/dist/query/stream.js.map +1 -0
- package/dist/query/tcp.d.ts +38 -0
- package/dist/query/tcp.d.ts.map +1 -0
- package/dist/query/tcp.js +53 -0
- package/dist/query/tcp.js.map +1 -0
- package/dist/query/transport.d.ts +36 -0
- package/dist/query/transport.d.ts.map +1 -0
- package/dist/query/transport.js +2 -0
- package/dist/query/transport.js.map +1 -0
- package/dist/query/web.d.ts +54 -0
- package/dist/query/web.d.ts.map +1 -0
- package/dist/query/web.js +146 -0
- package/dist/query/web.js.map +1 -0
- package/dist/versions/index.d.ts +3094 -0
- package/dist/versions/index.d.ts.map +1 -0
- package/dist/versions/index.js +9237 -0
- package/dist/versions/index.js.map +1 -0
- package/package.json +118 -4
- package/src/client/abort.ts +24 -0
- package/src/client/address.ts +74 -0
- package/src/client/api/voice.ts +61 -0
- package/src/client/capabilities.ts +106 -0
- package/src/client/client.ts +1809 -0
- package/src/client/commands.ts +193 -0
- package/src/client/crypto/crypt-ops.ts +6 -0
- package/src/client/crypto/crypt.ts +275 -0
- package/src/client/crypto/eax.ts +152 -0
- package/src/client/crypto/identity.ts +484 -0
- package/src/client/crypto/index.ts +21 -0
- package/src/client/crypto/primitives.ts +141 -0
- package/src/client/diagnostics.ts +58 -0
- package/src/client/discovery/index.ts +1 -0
- package/src/client/discovery/resolver.ts +325 -0
- package/src/client/errors.ts +217 -0
- package/src/client/events.ts +12 -0
- package/src/client/handshake/crypt-handshake.ts +157 -0
- package/src/client/handshake/crypt-init2.ts +48 -0
- package/src/client/handshake/index.ts +3 -0
- package/src/client/handshake/license.ts +208 -0
- package/src/client/handshake.ts +150 -0
- package/src/client/helpers.ts +10 -0
- package/src/client/hooks.ts +30 -0
- package/src/client/index.ts +93 -0
- package/src/client/reconnect.ts +43 -0
- package/src/client/throttle.ts +92 -0
- package/src/client/trace.ts +237 -0
- package/src/client/transfer.ts +436 -0
- package/src/client/transport/generation-window.ts +108 -0
- package/src/client/transport/handler.ts +926 -0
- package/src/client/transport/index.ts +14 -0
- package/src/client/transport/packet.ts +69 -0
- package/src/client/transport/quicklz.ts +209 -0
- package/src/client/types.ts +268 -0
- package/src/core/api/channels.ts +396 -0
- package/src/core/api/clients.ts +654 -0
- package/src/core/api/command.ts +563 -0
- package/src/core/api/files.ts +405 -0
- package/src/core/api/groups.ts +622 -0
- package/src/core/api/moderation.ts +525 -0
- package/src/core/api/parse.ts +52 -0
- package/src/core/api/server.ts +709 -0
- package/src/core/command/command.ts +125 -0
- package/src/core/command/ids.ts +149 -0
- package/src/core/command/parser.ts +68 -0
- package/src/core/command/request.ts +119 -0
- package/src/core/command/responses.ts +114 -0
- package/src/core/command-name.ts +334 -0
- package/src/core/enums.ts +167 -0
- package/src/core/errorcode.ts +412 -0
- package/src/core/errors.ts +258 -0
- package/src/core/events.ts +219 -0
- package/src/core/helpers.ts +161 -0
- package/src/core/index.ts +126 -0
- package/src/core/internal.ts +23 -0
- package/src/core/middleware.ts +24 -0
- package/src/core/notification-name.ts +155 -0
- package/src/core/notifications.ts +157 -0
- package/src/core/permission-name.ts +538 -0
- package/src/core/permission.ts +34 -0
- package/src/core/property-name.ts +411 -0
- package/src/core/reason.ts +38 -0
- package/src/core/reconnect.ts +98 -0
- package/src/core/types.ts +138 -0
- package/src/query/client.ts +1129 -0
- package/src/query/errors.ts +108 -0
- package/src/query/index.ts +65 -0
- package/src/query/knownhosts.ts +257 -0
- package/src/query/lines.ts +28 -0
- package/src/query/options.ts +388 -0
- package/src/query/reconnect.ts +84 -0
- package/src/query/ssh.ts +614 -0
- package/src/query/stream.ts +91 -0
- package/src/query/tcp.ts +85 -0
- package/src/query/transport.ts +35 -0
- package/src/query/web.ts +195 -0
- package/src/versions/index.ts +10774 -0
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Splits a byte stream into the lines ServerQuery speaks.
|
|
3
|
+
*
|
|
4
|
+
* A line ends at `\n`. The server writes `\n\r`, so the `\r` belongs to the
|
|
5
|
+
* start of the next line rather than the end of this one; both ends are
|
|
6
|
+
* trimmed. Bytes are decoded as UTF-8 only once a whole line is in, so a
|
|
7
|
+
* character split across two chunks arrives whole.
|
|
8
|
+
*/
|
|
9
|
+
export class LineReader {
|
|
10
|
+
#pending = Buffer.alloc(0);
|
|
11
|
+
/** Add a chunk and return the lines it completed, without their terminators. */
|
|
12
|
+
push(chunk) {
|
|
13
|
+
this.#pending = Buffer.concat([this.#pending, chunk]);
|
|
14
|
+
const lines = [];
|
|
15
|
+
for (;;) {
|
|
16
|
+
const end = this.#pending.indexOf(0x0a);
|
|
17
|
+
if (end < 0)
|
|
18
|
+
break;
|
|
19
|
+
const line = this.#pending
|
|
20
|
+
.subarray(0, end)
|
|
21
|
+
.toString("utf8")
|
|
22
|
+
.replace(/^\r+|\r+$/g, "");
|
|
23
|
+
this.#pending = this.#pending.subarray(end + 1);
|
|
24
|
+
lines.push(line);
|
|
25
|
+
}
|
|
26
|
+
return lines;
|
|
27
|
+
}
|
|
28
|
+
}
|
|
29
|
+
//# sourceMappingURL=lines.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"lines.js","sourceRoot":"","sources":["../../src/query/lines.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AACH,MAAM,OAAO,UAAU;IACrB,QAAQ,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;IAE3B,gFAAgF;IAChF,IAAI,CAAC,KAAiB;QACpB,IAAI,CAAC,QAAQ,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,QAAQ,EAAE,KAAK,CAAC,CAAC,CAAC;QACtD,MAAM,KAAK,GAAa,EAAE,CAAC;QAC3B,SAAS,CAAC;YACR,MAAM,GAAG,GAAG,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;YACxC,IAAI,GAAG,GAAG,CAAC;gBAAE,MAAM;YACnB,MAAM,IAAI,GAAG,IAAI,CAAC,QAAQ;iBACvB,QAAQ,CAAC,CAAC,EAAE,GAAG,CAAC;iBAChB,QAAQ,CAAC,MAAM,CAAC;iBAChB,OAAO,CAAC,YAAY,EAAE,EAAE,CAAC,CAAC;YAC7B,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,GAAG,GAAG,CAAC,CAAC,CAAC;YAChD,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACnB,CAAC;QACD,OAAO,KAAK,CAAC;IACf,CAAC;CACF"}
|
|
@@ -0,0 +1,187 @@
|
|
|
1
|
+
import type { CommandMiddleware, Logger, ReconnectOptions, ServerID } from "@honeybbq/teamspeak";
|
|
2
|
+
import type { QueryTransport } from "./transport.js";
|
|
3
|
+
import type { TcpConnector } from "./tcp.js";
|
|
4
|
+
import type { SshConnectOptions } from "./ssh.js";
|
|
5
|
+
/**
|
|
6
|
+
* The connection a `QueryClient` talks over, as a description rather than an
|
|
7
|
+
* open transport: the client builds one from it on every connection, so a
|
|
8
|
+
* reconnect is the same connection as the first one was.
|
|
9
|
+
*
|
|
10
|
+
* `custom` is the escape hatch for anything the three built-in kinds do not
|
|
11
|
+
* cover — a proxy, a tunnel, a test double — and is the only one that cannot
|
|
12
|
+
* be rebuilt from data alone: it is called again for each attempt.
|
|
13
|
+
*/
|
|
14
|
+
export type QueryTransportOptions = {
|
|
15
|
+
/** A raw ServerQuery connection. TeamSpeak 3 only: TS6 dropped it. */
|
|
16
|
+
readonly kind: "tcp";
|
|
17
|
+
/** The server's host. */
|
|
18
|
+
readonly host: string;
|
|
19
|
+
/** The raw query port; 10011 by default. */
|
|
20
|
+
readonly port?: number | undefined;
|
|
21
|
+
/**
|
|
22
|
+
* Opens the connection; `net.createConnection` by default. See
|
|
23
|
+
* {@link TcpOptions.connect}.
|
|
24
|
+
*/
|
|
25
|
+
readonly connect?: TcpConnector | undefined;
|
|
26
|
+
} | ({
|
|
27
|
+
/** A ServerQuery over SSH. */
|
|
28
|
+
readonly kind: "ssh";
|
|
29
|
+
} & SshConnectOptions) | {
|
|
30
|
+
/** TeamSpeak 6's HTTP WebQuery. */
|
|
31
|
+
readonly kind: "web";
|
|
32
|
+
/** The server's base URL, such as `http://127.0.0.1:10080`. */
|
|
33
|
+
readonly url: string;
|
|
34
|
+
/** The api key, sent as `x-api-key`; it replaces `login`. */
|
|
35
|
+
readonly apiKey: string;
|
|
36
|
+
/** The `fetch` to use; a small one over `node:http` by default. */
|
|
37
|
+
readonly fetch?: typeof fetch | undefined;
|
|
38
|
+
} | {
|
|
39
|
+
/** An application-supplied transport. */
|
|
40
|
+
readonly kind: "custom";
|
|
41
|
+
/**
|
|
42
|
+
* Open the transport. Called once per connection attempt, with the
|
|
43
|
+
* signal that abandons that attempt; a transport that ignores it is
|
|
44
|
+
* abandoned all the same.
|
|
45
|
+
*/
|
|
46
|
+
readonly open: (signal?: AbortSignal) => Promise<QueryTransport>;
|
|
47
|
+
};
|
|
48
|
+
/**
|
|
49
|
+
* One category of notifications to register for: the `event` parameter of
|
|
50
|
+
* `servernotifyregister`.
|
|
51
|
+
*
|
|
52
|
+
* `bans` is not registered by default: TeamSpeak 3 refuses it with 1539,
|
|
53
|
+
* which would fail the registration of every category after it.
|
|
54
|
+
*/
|
|
55
|
+
export type QueryEventCategory = "server" | "channel" | "textserver" | "textchannel" | "textprivate" | "bans";
|
|
56
|
+
/**
|
|
57
|
+
* Which notification categories to register for.
|
|
58
|
+
*
|
|
59
|
+
* `true` (the default) registers the ones raw TCP and SSH both accept;
|
|
60
|
+
* `{ categories }` names them; `false` registers nothing. This says nothing
|
|
61
|
+
* about whether the transport can deliver notifications — a transport
|
|
62
|
+
* declares that itself, see {@link QueryTransport.supportsNotifications} — so
|
|
63
|
+
* asking for categories on one that cannot is an error rather than a silent
|
|
64
|
+
* no-op.
|
|
65
|
+
*/
|
|
66
|
+
export type QueryEventsOption = boolean | {
|
|
67
|
+
readonly categories?: readonly QueryEventCategory[];
|
|
68
|
+
};
|
|
69
|
+
/** How a `QueryClient` connects, logs and behaves. */
|
|
70
|
+
export interface QueryClientOptions {
|
|
71
|
+
/** How to reach the server. Required: a client cannot connect without one. */
|
|
72
|
+
readonly transport: QueryTransportOptions;
|
|
73
|
+
/**
|
|
74
|
+
* The query account to log in as, sent as a `login` command after the
|
|
75
|
+
* transport is opened. Raw TCP only: SSH logs in as the session's account,
|
|
76
|
+
* and WebQuery's api key is the login, so giving this with either throws.
|
|
77
|
+
*/
|
|
78
|
+
readonly login?: {
|
|
79
|
+
readonly name: string;
|
|
80
|
+
readonly password: string;
|
|
81
|
+
} | undefined;
|
|
82
|
+
/**
|
|
83
|
+
* The virtual server to select with `use`, by id or by voice port. Over
|
|
84
|
+
* WebQuery the transport answers `use` itself, by addressing that server in
|
|
85
|
+
* its requests. Unset leaves the instance selected on raw TCP, where the
|
|
86
|
+
* server's own default applies.
|
|
87
|
+
*/
|
|
88
|
+
readonly server?: {
|
|
89
|
+
readonly id: ServerID | number;
|
|
90
|
+
} | {
|
|
91
|
+
readonly port: number;
|
|
92
|
+
} | undefined;
|
|
93
|
+
/** The query client's nickname on the server (`client_nickname` of `use`). */
|
|
94
|
+
readonly nickname?: string | undefined;
|
|
95
|
+
/**
|
|
96
|
+
* Register for server notifications: `true` (the default) for the five
|
|
97
|
+
* categories raw TCP and SSH both accept, `{ categories }` to name them, or
|
|
98
|
+
* `false` for none. See {@link QueryEventsOption}.
|
|
99
|
+
*
|
|
100
|
+
* Registering for anything on a transport that cannot deliver notifications
|
|
101
|
+
* throws a `TypeError`, at construction when the `transport` kind says so
|
|
102
|
+
* and when connecting for a `custom` transport.
|
|
103
|
+
*/
|
|
104
|
+
readonly events?: QueryEventsOption | undefined;
|
|
105
|
+
/**
|
|
106
|
+
* Reconnect after a dropped connection. Off by default, as for the voice
|
|
107
|
+
* client, and a deliberate `disconnect()` never reconnects. The retry
|
|
108
|
+
* decision is {@link defaultShouldRetry}.
|
|
109
|
+
*/
|
|
110
|
+
readonly reconnect?: ReconnectOptions | undefined;
|
|
111
|
+
/**
|
|
112
|
+
* Wraps every typed command, outermost first; see `CommandMiddleware`. Raw
|
|
113
|
+
* lines sent with `exec` do not pass through it. Fixed for the client's life.
|
|
114
|
+
*/
|
|
115
|
+
readonly commandMiddleware?: readonly CommandMiddleware[] | undefined;
|
|
116
|
+
/** Where the client logs. Silent unless set. */
|
|
117
|
+
readonly logger?: Logger | undefined;
|
|
118
|
+
}
|
|
119
|
+
/** The five categories both raw TCP on TS3 and SSH on TS6 accept. */
|
|
120
|
+
export declare const DEFAULT_EVENT_CATEGORIES: readonly QueryEventCategory[];
|
|
121
|
+
/** A transport with its defaults filled, and its fields copied. */
|
|
122
|
+
export type ResolvedTransport = {
|
|
123
|
+
readonly kind: "tcp";
|
|
124
|
+
readonly host: string;
|
|
125
|
+
readonly port: number;
|
|
126
|
+
readonly connect: TcpConnector | undefined;
|
|
127
|
+
} | {
|
|
128
|
+
readonly kind: "ssh";
|
|
129
|
+
/** What `connectSsh` is given, with the port filled in; one arm of {@link SshConnectOptions}. */
|
|
130
|
+
readonly connect: SshConnectOptions;
|
|
131
|
+
} | {
|
|
132
|
+
readonly kind: "web";
|
|
133
|
+
readonly url: string;
|
|
134
|
+
readonly apiKey: string;
|
|
135
|
+
readonly fetch: typeof fetch | undefined;
|
|
136
|
+
} | {
|
|
137
|
+
readonly kind: "custom";
|
|
138
|
+
readonly open: (signal?: AbortSignal) => Promise<QueryTransport>;
|
|
139
|
+
};
|
|
140
|
+
/** Options with their defaults filled and their fields copied. */
|
|
141
|
+
export interface ResolvedQueryOptions {
|
|
142
|
+
readonly transport: ResolvedTransport;
|
|
143
|
+
readonly login: {
|
|
144
|
+
readonly name: string;
|
|
145
|
+
readonly password: string;
|
|
146
|
+
} | undefined;
|
|
147
|
+
readonly server: {
|
|
148
|
+
readonly id: ServerID | number;
|
|
149
|
+
} | {
|
|
150
|
+
readonly port: number;
|
|
151
|
+
} | undefined;
|
|
152
|
+
readonly nickname: string | undefined;
|
|
153
|
+
/** The categories the caller asked to register for; `events: false` leaves this empty. */
|
|
154
|
+
readonly eventCategories: readonly QueryEventCategory[];
|
|
155
|
+
/**
|
|
156
|
+
* Whether the transport the options name can deliver notifications. False
|
|
157
|
+
* for `web`; `undefined` for `custom`, whose transport object does not exist
|
|
158
|
+
* until it is opened, and which is checked then.
|
|
159
|
+
*/
|
|
160
|
+
readonly notificationsSupported: boolean | undefined;
|
|
161
|
+
/**
|
|
162
|
+
* Whether the caller named `events` at all, whatever its value. On a
|
|
163
|
+
* transport that cannot deliver notifications, naming it is the mistake to
|
|
164
|
+
* report; leaving it unset is not.
|
|
165
|
+
*/
|
|
166
|
+
readonly eventsRequested: boolean;
|
|
167
|
+
readonly reconnect: ReconnectOptions | undefined;
|
|
168
|
+
readonly commandMiddleware: readonly CommandMiddleware[] | undefined;
|
|
169
|
+
readonly logger: Logger | undefined;
|
|
170
|
+
}
|
|
171
|
+
/**
|
|
172
|
+
* Refuse a request to register on a transport that cannot deliver what it
|
|
173
|
+
* would register for.
|
|
174
|
+
*
|
|
175
|
+
* WebQuery refuses `servernotifyregister` with 5120, and a listener that can
|
|
176
|
+
* never run is worse than an error: the caller would be left believing the
|
|
177
|
+
* server had nothing to say. Naming `events` at all is the mistake, even as
|
|
178
|
+
* `false`, since it says the caller read the option as a capability.
|
|
179
|
+
*/
|
|
180
|
+
export declare function assertEventsSupported(resolved: ResolvedQueryOptions): void;
|
|
181
|
+
/**
|
|
182
|
+
* Check the options and fill in the defaults, once, when the client is made:
|
|
183
|
+
* an option that cannot be one is a bug in the caller's code, and is worth
|
|
184
|
+
* hearing about before a connection is attempted.
|
|
185
|
+
*/
|
|
186
|
+
export declare function normalizeQueryOptions(options: QueryClientOptions): ResolvedQueryOptions;
|
|
187
|
+
//# sourceMappingURL=options.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"options.d.ts","sourceRoot":"","sources":["../../src/query/options.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,213 @@
|
|
|
1
|
+
import { hostKeyDecision } from "./ssh.js";
|
|
2
|
+
/** The five categories both raw TCP on TS3 and SSH on TS6 accept. */
|
|
3
|
+
export const DEFAULT_EVENT_CATEGORIES = Object.freeze([
|
|
4
|
+
"server",
|
|
5
|
+
"channel",
|
|
6
|
+
"textserver",
|
|
7
|
+
"textchannel",
|
|
8
|
+
"textprivate",
|
|
9
|
+
]);
|
|
10
|
+
/** The kinds whose own handshake is the login, so there is no `login` to send. */
|
|
11
|
+
const LOGIN_HANDLED_BY_TRANSPORT = new Set(["ssh", "web"]);
|
|
12
|
+
const CATEGORIES = new Set([
|
|
13
|
+
"server",
|
|
14
|
+
"channel",
|
|
15
|
+
"textserver",
|
|
16
|
+
"textchannel",
|
|
17
|
+
"textprivate",
|
|
18
|
+
"bans",
|
|
19
|
+
]);
|
|
20
|
+
function nonEmpty(value, name) {
|
|
21
|
+
if (typeof value !== "string" || value === "") {
|
|
22
|
+
throw new TypeError(`${name} is a non-empty string`);
|
|
23
|
+
}
|
|
24
|
+
return value;
|
|
25
|
+
}
|
|
26
|
+
function port(value, name) {
|
|
27
|
+
if (value === undefined)
|
|
28
|
+
return -1; // replaced by the caller's default
|
|
29
|
+
if (typeof value !== "number" || !Number.isInteger(value) || value < 1 || value > 65535) {
|
|
30
|
+
throw new RangeError(`${name} is an integer port from 1 to 65535`);
|
|
31
|
+
}
|
|
32
|
+
return value;
|
|
33
|
+
}
|
|
34
|
+
function transportOptions(transport) {
|
|
35
|
+
if (typeof transport !== "object" || transport === null) {
|
|
36
|
+
throw new TypeError("transport is an object");
|
|
37
|
+
}
|
|
38
|
+
const options = transport;
|
|
39
|
+
switch (options["kind"]) {
|
|
40
|
+
case "tcp": {
|
|
41
|
+
const host = nonEmpty(options["host"], "transport.host");
|
|
42
|
+
const raw = port(options["port"], "transport.port");
|
|
43
|
+
const connect = options["connect"];
|
|
44
|
+
if (connect !== undefined && typeof connect !== "function") {
|
|
45
|
+
throw new TypeError("transport.connect is a function");
|
|
46
|
+
}
|
|
47
|
+
return {
|
|
48
|
+
kind: "tcp",
|
|
49
|
+
host,
|
|
50
|
+
port: raw < 0 ? 10011 : raw,
|
|
51
|
+
connect: connect,
|
|
52
|
+
};
|
|
53
|
+
}
|
|
54
|
+
case "ssh": {
|
|
55
|
+
const host = nonEmpty(options["host"], "transport.host");
|
|
56
|
+
const raw = port(options["port"], "transport.port");
|
|
57
|
+
const connection = options["connection"];
|
|
58
|
+
if (connection !== undefined &&
|
|
59
|
+
typeof connection !== "function" &&
|
|
60
|
+
(typeof connection !== "object" || connection === null)) {
|
|
61
|
+
throw new TypeError("transport.connection is an SSH client or a factory for one");
|
|
62
|
+
}
|
|
63
|
+
// Asked here as well as when connecting: a client that could never
|
|
64
|
+
// connect, for want of a decision about the host key, is the caller's
|
|
65
|
+
// mistake and is reported when the client is made.
|
|
66
|
+
const decision = hostKeyDecision(options);
|
|
67
|
+
const address = { host, port: raw < 0 ? 10022 : raw };
|
|
68
|
+
// Built from the decision rather than copied, so each arm is made of
|
|
69
|
+
// exactly what it takes and the union needs no cast.
|
|
70
|
+
if (decision.kind === "connection") {
|
|
71
|
+
return {
|
|
72
|
+
kind: "ssh",
|
|
73
|
+
connect: { ...address, connection: connection },
|
|
74
|
+
};
|
|
75
|
+
}
|
|
76
|
+
const login = {
|
|
77
|
+
...address,
|
|
78
|
+
username: nonEmpty(options["username"], "transport.username"),
|
|
79
|
+
password: nonEmpty(options["password"], "transport.password"),
|
|
80
|
+
};
|
|
81
|
+
switch (decision.kind) {
|
|
82
|
+
case "verifier":
|
|
83
|
+
return { kind: "ssh", connect: { ...login, hostKey: decision.verify } };
|
|
84
|
+
case "knownHosts":
|
|
85
|
+
return { kind: "ssh", connect: { ...login, knownHosts: decision.path } };
|
|
86
|
+
case "insecure":
|
|
87
|
+
return { kind: "ssh", connect: { ...login, insecureIgnoreHostKey: true } };
|
|
88
|
+
}
|
|
89
|
+
}
|
|
90
|
+
case "web": {
|
|
91
|
+
const fetchFn = options["fetch"];
|
|
92
|
+
if (fetchFn !== undefined && typeof fetchFn !== "function") {
|
|
93
|
+
throw new TypeError("transport.fetch is a function");
|
|
94
|
+
}
|
|
95
|
+
return {
|
|
96
|
+
kind: "web",
|
|
97
|
+
url: nonEmpty(options["url"], "transport.url"),
|
|
98
|
+
apiKey: nonEmpty(options["apiKey"], "transport.apiKey"),
|
|
99
|
+
fetch: fetchFn,
|
|
100
|
+
};
|
|
101
|
+
}
|
|
102
|
+
case "custom": {
|
|
103
|
+
const open = options["open"];
|
|
104
|
+
if (typeof open !== "function")
|
|
105
|
+
throw new TypeError("transport.open is a function");
|
|
106
|
+
return {
|
|
107
|
+
kind: "custom",
|
|
108
|
+
open: open,
|
|
109
|
+
};
|
|
110
|
+
}
|
|
111
|
+
default:
|
|
112
|
+
throw new TypeError('transport.kind is one of "tcp", "ssh", "web" or "custom"');
|
|
113
|
+
}
|
|
114
|
+
}
|
|
115
|
+
/**
|
|
116
|
+
* The categories to register for. These are a wish, not a capability: whether
|
|
117
|
+
* the transport can deliver a notification is its own to report, and a request
|
|
118
|
+
* on one that cannot is the caller's mistake, reported by
|
|
119
|
+
* {@link assertEventsSupported}.
|
|
120
|
+
*/
|
|
121
|
+
function eventCategories(events) {
|
|
122
|
+
if (events === false)
|
|
123
|
+
return [];
|
|
124
|
+
if (events === undefined || events === true)
|
|
125
|
+
return DEFAULT_EVENT_CATEGORIES;
|
|
126
|
+
if (typeof events !== "object" || events === null) {
|
|
127
|
+
throw new TypeError("events is a boolean or { categories }");
|
|
128
|
+
}
|
|
129
|
+
const categories = events.categories ?? DEFAULT_EVENT_CATEGORIES;
|
|
130
|
+
if (!Array.isArray(categories))
|
|
131
|
+
throw new TypeError("events.categories is an array");
|
|
132
|
+
for (const category of categories) {
|
|
133
|
+
if (typeof category !== "string" || !CATEGORIES.has(category)) {
|
|
134
|
+
throw new TypeError(`events.categories has an unknown category ${JSON.stringify(category)}`);
|
|
135
|
+
}
|
|
136
|
+
}
|
|
137
|
+
return [...categories];
|
|
138
|
+
}
|
|
139
|
+
/**
|
|
140
|
+
* Refuse a request to register on a transport that cannot deliver what it
|
|
141
|
+
* would register for.
|
|
142
|
+
*
|
|
143
|
+
* WebQuery refuses `servernotifyregister` with 5120, and a listener that can
|
|
144
|
+
* never run is worse than an error: the caller would be left believing the
|
|
145
|
+
* server had nothing to say. Naming `events` at all is the mistake, even as
|
|
146
|
+
* `false`, since it says the caller read the option as a capability.
|
|
147
|
+
*/
|
|
148
|
+
export function assertEventsSupported(resolved) {
|
|
149
|
+
if (resolved.notificationsSupported !== false || !resolved.eventsRequested)
|
|
150
|
+
return;
|
|
151
|
+
throw new TypeError("this transport delivers no notifications, so `events` cannot be set");
|
|
152
|
+
}
|
|
153
|
+
/**
|
|
154
|
+
* Check the options and fill in the defaults, once, when the client is made:
|
|
155
|
+
* an option that cannot be one is a bug in the caller's code, and is worth
|
|
156
|
+
* hearing about before a connection is attempted.
|
|
157
|
+
*/
|
|
158
|
+
export function normalizeQueryOptions(options) {
|
|
159
|
+
const transport = transportOptions(options.transport);
|
|
160
|
+
const login = options.login;
|
|
161
|
+
if (login !== undefined && typeof login !== "object") {
|
|
162
|
+
throw new TypeError("login is { name, password }");
|
|
163
|
+
}
|
|
164
|
+
const server = options.server;
|
|
165
|
+
if (server !== undefined) {
|
|
166
|
+
if (typeof server !== "object" || server === null) {
|
|
167
|
+
throw new TypeError("server is { id } or { port }");
|
|
168
|
+
}
|
|
169
|
+
const byID = "id" in server;
|
|
170
|
+
const raw = byID ? server.id : server.port;
|
|
171
|
+
const value = typeof raw === "bigint" ? Number(raw) : raw;
|
|
172
|
+
if (typeof value !== "number" || !Number.isInteger(value) || value < 0) {
|
|
173
|
+
throw new RangeError(`server.${byID ? "id" : "port"} is a non-negative integer`);
|
|
174
|
+
}
|
|
175
|
+
// A port names a virtual server's voice port, which is 1 to 65535; an id
|
|
176
|
+
// is a server's own number, which starts at 1 and has no ceiling here.
|
|
177
|
+
if (!byID && (value < 1 || value > 65535)) {
|
|
178
|
+
throw new RangeError("server.port is an integer from 1 to 65535");
|
|
179
|
+
}
|
|
180
|
+
}
|
|
181
|
+
const nickname = options.nickname;
|
|
182
|
+
if (nickname !== undefined)
|
|
183
|
+
nonEmpty(nickname, "nickname");
|
|
184
|
+
const commandMiddleware = options.commandMiddleware;
|
|
185
|
+
if (commandMiddleware !== undefined && !Array.isArray(commandMiddleware)) {
|
|
186
|
+
throw new TypeError("commandMiddleware is an array");
|
|
187
|
+
}
|
|
188
|
+
if (login !== undefined && LOGIN_HANDLED_BY_TRANSPORT.has(transport.kind)) {
|
|
189
|
+
// The SSH session is the query account already, and WebQuery's api key is
|
|
190
|
+
// the login; neither leaves a `login` to send, and the server refuses the
|
|
191
|
+
// command on both. A silently dropped option would leave the caller
|
|
192
|
+
// believing they had logged in.
|
|
193
|
+
throw new TypeError(`login is not sent over the ${transport.kind} transport, which logs in by itself`);
|
|
194
|
+
}
|
|
195
|
+
const resolved = {
|
|
196
|
+
transport,
|
|
197
|
+
// Kept for `custom` too: its opener is the caller's, and most of them wrap
|
|
198
|
+
// one of the built-in transports, `tcp` among them.
|
|
199
|
+
login: login === undefined ? undefined : { ...login },
|
|
200
|
+
server: server === undefined ? undefined : { ...server },
|
|
201
|
+
nickname,
|
|
202
|
+
eventCategories: eventCategories(options.events),
|
|
203
|
+
// `web` is the only kind whose capability is known before it is opened.
|
|
204
|
+
notificationsSupported: transport.kind === "custom" ? undefined : transport.kind !== "web",
|
|
205
|
+
eventsRequested: options.events !== undefined,
|
|
206
|
+
reconnect: options.reconnect,
|
|
207
|
+
commandMiddleware,
|
|
208
|
+
logger: options.logger,
|
|
209
|
+
};
|
|
210
|
+
assertEventsSupported(resolved);
|
|
211
|
+
return resolved;
|
|
212
|
+
}
|
|
213
|
+
//# sourceMappingURL=options.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"options.js","sourceRoot":"","sources":["../../src/query/options.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Whether a failed connection attempt is worth another one.
|
|
3
|
+
*
|
|
4
|
+
* The voice client's `defaultShouldRetry` answers the same question for a
|
|
5
|
+
* dropped voice session, where the failure to retry is a kick or a bad
|
|
6
|
+
* password. ServerQuery has neither a session to be kicked from nor a
|
|
7
|
+
* handshake to fail, so the rule is about the commands `connect()` runs: a
|
|
8
|
+
* refused `login` or `use` is not retried, nor is an ssh account the server
|
|
9
|
+
* will not authenticate, nor a host key that was not accepted, nor a missing
|
|
10
|
+
* `ssh2`. Everything else — a refused
|
|
11
|
+
* TCP connection, a dropped one, an HTTP failure, a server that stopped
|
|
12
|
+
* answering — is.
|
|
13
|
+
*
|
|
14
|
+
* A custom `shouldRetry` replaces this; see `ReconnectOptions`.
|
|
15
|
+
*/
|
|
16
|
+
export declare function defaultShouldRetry(error: Error | undefined): boolean;
|
|
17
|
+
/**
|
|
18
|
+
* Whether a command that failed during `connect()` is one to give up on: the
|
|
19
|
+
* commands whose failure is a fact about the account or the target rather than
|
|
20
|
+
* about the connection.
|
|
21
|
+
*
|
|
22
|
+
* `defaultShouldRetry` cannot see which command failed, and does not need to:
|
|
23
|
+
* it is called with the error alone, as `ReconnectOptions` documents, and
|
|
24
|
+
* covers the errors a wrong password arrives as. This covers the rest — a
|
|
25
|
+
* `use` refused with a code that is not in the list above, such as 1542 for a
|
|
26
|
+
* port no virtual server is on.
|
|
27
|
+
*/
|
|
28
|
+
export declare function isPermanentCommandError(command: string, error: unknown): boolean;
|
|
29
|
+
//# sourceMappingURL=reconnect.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"reconnect.d.ts","sourceRoot":"","sources":["../../src/query/reconnect.ts"],"names":[],"mappings":"AAiCA;;;;;;;;;;;;;;GAcG;AACH,wBAAgB,kBAAkB,CAAC,KAAK,EAAE,KAAK,GAAG,SAAS,GAAG,OAAO,CAiBpE;AAED;;;;;;;;;;GAUG;AACH,wBAAgB,uBAAuB,CAAC,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,OAAO,GAAG,OAAO,CAKhF"}
|
|
@@ -0,0 +1,87 @@
|
|
|
1
|
+
import { AlreadyConnectedError, ErrorCode, ServerError } from "@honeybbq/teamspeak";
|
|
2
|
+
import { MissingDependencyError, QueryAuthError, SshHostKeyError } from "./errors.js";
|
|
3
|
+
/**
|
|
4
|
+
* Server errors where retrying cannot help.
|
|
5
|
+
*
|
|
6
|
+
* A refused `login` or `use` is the case this exists for. `login` is the only
|
|
7
|
+
* command that can succeed with the wrong credentials and fail with the right
|
|
8
|
+
* ones, and a wrong password stays wrong, so retrying it costs a bounded few
|
|
9
|
+
* attempts and floods the server for nothing. The server's own flood refusal
|
|
10
|
+
* (524) is deliberately *not* here: it clears by itself, and it is what a
|
|
11
|
+
* reconnect loop is most likely to meet right after a drop.
|
|
12
|
+
*/
|
|
13
|
+
const PERMANENT_SERVER_ERRORS = new Set([
|
|
14
|
+
ErrorCode.ClientInvalidPassword,
|
|
15
|
+
ErrorCode.ClientNotLoggedIn,
|
|
16
|
+
ErrorCode.ClientLoginNotPermitted,
|
|
17
|
+
ErrorCode.ServerInvalidID,
|
|
18
|
+
ErrorCode.ConnectFailedBanned,
|
|
19
|
+
ErrorCode.BanFlooding,
|
|
20
|
+
ErrorCode.PermissionsClientInsufficient,
|
|
21
|
+
]);
|
|
22
|
+
/** Commands whose refusal is the credentials or the target, not the network. */
|
|
23
|
+
const CONNECT_COMMANDS = new Set(["login", "use"]);
|
|
24
|
+
/**
|
|
25
|
+
* Refusals of those commands that do clear by themselves: the query flood
|
|
26
|
+
* limit, which the client meets because reconnecting is exactly what the limit
|
|
27
|
+
* is about.
|
|
28
|
+
*/
|
|
29
|
+
const TRANSIENT_SERVER_ERRORS = new Set([ErrorCode.ClientIsFlooding]);
|
|
30
|
+
/**
|
|
31
|
+
* Whether a failed connection attempt is worth another one.
|
|
32
|
+
*
|
|
33
|
+
* The voice client's `defaultShouldRetry` answers the same question for a
|
|
34
|
+
* dropped voice session, where the failure to retry is a kick or a bad
|
|
35
|
+
* password. ServerQuery has neither a session to be kicked from nor a
|
|
36
|
+
* handshake to fail, so the rule is about the commands `connect()` runs: a
|
|
37
|
+
* refused `login` or `use` is not retried, nor is an ssh account the server
|
|
38
|
+
* will not authenticate, nor a host key that was not accepted, nor a missing
|
|
39
|
+
* `ssh2`. Everything else — a refused
|
|
40
|
+
* TCP connection, a dropped one, an HTTP failure, a server that stopped
|
|
41
|
+
* answering — is.
|
|
42
|
+
*
|
|
43
|
+
* A custom `shouldRetry` replaces this; see `ReconnectOptions`.
|
|
44
|
+
*/
|
|
45
|
+
export function defaultShouldRetry(error) {
|
|
46
|
+
// The client is connected, or connecting, already: nothing is left to retry.
|
|
47
|
+
if (error instanceof AlreadyConnectedError)
|
|
48
|
+
return false;
|
|
49
|
+
// An account the server refused, or a transport that is on the wrong side
|
|
50
|
+
// of a firewall: both stay refused.
|
|
51
|
+
if (error instanceof QueryAuthError)
|
|
52
|
+
return false;
|
|
53
|
+
// A key that was refused stays refused: the file or the caller's check says
|
|
54
|
+
// the same thing next time, and a changed key is not one to keep knocking on.
|
|
55
|
+
if (error instanceof SshHostKeyError)
|
|
56
|
+
return false;
|
|
57
|
+
if (error instanceof MissingDependencyError)
|
|
58
|
+
return false;
|
|
59
|
+
if (error instanceof ServerError) {
|
|
60
|
+
return !PERMANENT_SERVER_ERRORS.has(error.code);
|
|
61
|
+
}
|
|
62
|
+
// A transport's own failure, such as a refused socket or a reset. The
|
|
63
|
+
// offending command is not known from here, so the loop's own history is
|
|
64
|
+
// what decides; see `QueryClient`.
|
|
65
|
+
return true;
|
|
66
|
+
}
|
|
67
|
+
/**
|
|
68
|
+
* Whether a command that failed during `connect()` is one to give up on: the
|
|
69
|
+
* commands whose failure is a fact about the account or the target rather than
|
|
70
|
+
* about the connection.
|
|
71
|
+
*
|
|
72
|
+
* `defaultShouldRetry` cannot see which command failed, and does not need to:
|
|
73
|
+
* it is called with the error alone, as `ReconnectOptions` documents, and
|
|
74
|
+
* covers the errors a wrong password arrives as. This covers the rest — a
|
|
75
|
+
* `use` refused with a code that is not in the list above, such as 1542 for a
|
|
76
|
+
* port no virtual server is on.
|
|
77
|
+
*/
|
|
78
|
+
export function isPermanentCommandError(command, error) {
|
|
79
|
+
if (!CONNECT_COMMANDS.has(command))
|
|
80
|
+
return false;
|
|
81
|
+
if (error instanceof QueryAuthError)
|
|
82
|
+
return true;
|
|
83
|
+
if (error instanceof ServerError)
|
|
84
|
+
return !TRANSIENT_SERVER_ERRORS.has(error.code);
|
|
85
|
+
return false;
|
|
86
|
+
}
|
|
87
|
+
//# sourceMappingURL=reconnect.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"reconnect.js","sourceRoot":"","sources":["../../src/query/reconnect.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,qBAAqB,EAAE,SAAS,EAAE,WAAW,EAAE,MAAM,qBAAqB,CAAC;AACpF,OAAO,EAAE,sBAAsB,EAAE,cAAc,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC;AAEtF;;;;;;;;;GASG;AACH,MAAM,uBAAuB,GAAwB,IAAI,GAAG,CAAC;IAC3D,SAAS,CAAC,qBAAqB;IAC/B,SAAS,CAAC,iBAAiB;IAC3B,SAAS,CAAC,uBAAuB;IACjC,SAAS,CAAC,eAAe;IACzB,SAAS,CAAC,mBAAmB;IAC7B,SAAS,CAAC,WAAW;IACrB,SAAS,CAAC,6BAA6B;CACxC,CAAC,CAAC;AAEH,gFAAgF;AAChF,MAAM,gBAAgB,GAAwB,IAAI,GAAG,CAAC,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC,CAAC;AAExE;;;;GAIG;AACH,MAAM,uBAAuB,GAAwB,IAAI,GAAG,CAAC,CAAC,SAAS,CAAC,gBAAgB,CAAC,CAAC,CAAC;AAE3F;;;;;;;;;;;;;;GAcG;AACH,MAAM,UAAU,kBAAkB,CAAC,KAAwB;IACzD,6EAA6E;IAC7E,IAAI,KAAK,YAAY,qBAAqB;QAAE,OAAO,KAAK,CAAC;IACzD,0EAA0E;IAC1E,oCAAoC;IACpC,IAAI,KAAK,YAAY,cAAc;QAAE,OAAO,KAAK,CAAC;IAClD,4EAA4E;IAC5E,8EAA8E;IAC9E,IAAI,KAAK,YAAY,eAAe;QAAE,OAAO,KAAK,CAAC;IACnD,IAAI,KAAK,YAAY,sBAAsB;QAAE,OAAO,KAAK,CAAC;IAC1D,IAAI,KAAK,YAAY,WAAW,EAAE,CAAC;QACjC,OAAO,CAAC,uBAAuB,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;IAClD,CAAC;IACD,sEAAsE;IACtE,yEAAyE;IACzE,mCAAmC;IACnC,OAAO,IAAI,CAAC;AACd,CAAC;AAED;;;;;;;;;;GAUG;AACH,MAAM,UAAU,uBAAuB,CAAC,OAAe,EAAE,KAAc;IACrE,IAAI,CAAC,gBAAgB,CAAC,GAAG,CAAC,OAAO,CAAC;QAAE,OAAO,KAAK,CAAC;IACjD,IAAI,KAAK,YAAY,cAAc;QAAE,OAAO,IAAI,CAAC;IACjD,IAAI,KAAK,YAAY,WAAW;QAAE,OAAO,CAAC,uBAAuB,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;IAClF,OAAO,KAAK,CAAC;AACf,CAAC"}
|