@honeybbq/teamspeak 1.0.0-beta.20 → 1.0.0-beta.21
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/avatars.d.ts.map +1 -1
- package/dist/client/api/avatars.js +11 -2
- package/dist/client/api/avatars.js.map +1 -1
- package/dist/client/api/files.d.ts +9 -2
- package/dist/client/api/files.d.ts.map +1 -1
- package/dist/client/api/files.js +15 -5
- package/dist/client/api/files.js.map +1 -1
- package/dist/client/api/upload-checks.d.ts +36 -0
- package/dist/client/api/upload-checks.d.ts.map +1 -0
- package/dist/client/api/upload-checks.js +77 -0
- package/dist/client/api/upload-checks.js.map +1 -0
- package/dist/client/client.d.ts.map +1 -1
- package/dist/client/client.js +5 -12
- package/dist/client/client.js.map +1 -1
- package/dist/client/transfer.d.ts +14 -0
- package/dist/client/transfer.d.ts.map +1 -1
- package/dist/client/transfer.js +43 -6
- package/dist/client/transfer.js.map +1 -1
- package/dist/core/api/files.d.ts +5 -1
- package/dist/core/api/files.d.ts.map +1 -1
- package/dist/core/api/files.js +5 -1
- package/dist/core/api/files.js.map +1 -1
- package/dist/core/errors.d.ts +33 -3
- package/dist/core/errors.d.ts.map +1 -1
- package/dist/core/errors.js +41 -5
- package/dist/core/errors.js.map +1 -1
- package/dist/core/internal.d.ts +1 -1
- package/dist/core/internal.d.ts.map +1 -1
- package/dist/core/internal.js +1 -1
- package/dist/core/internal.js.map +1 -1
- package/dist/query/client.d.ts +4 -0
- package/dist/query/client.d.ts.map +1 -1
- package/dist/query/client.js +82 -15
- package/dist/query/client.js.map +1 -1
- package/dist/query/options.d.ts +4 -0
- package/dist/query/options.d.ts.map +1 -1
- package/dist/query/options.js.map +1 -1
- package/package.json +1 -1
- package/src/client/api/avatars.ts +15 -2
- package/src/client/api/files.ts +21 -5
- package/src/client/api/upload-checks.ts +96 -0
- package/src/client/client.ts +6 -12
- package/src/client/transfer.ts +45 -9
- package/src/core/api/files.ts +5 -1
- package/src/core/errors.ts +41 -5
- package/src/core/internal.ts +7 -1
- package/src/query/client.ts +84 -14
- package/src/query/options.ts +4 -0
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"avatars.d.ts","sourceRoot":"","sources":["../../../src/client/api/avatars.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAgBH,OAAO,KAAK,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,qBAAqB,CAAC;AACvD,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,cAAc,CAAC;AAC3C,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,gBAAgB,CAAC;
|
|
1
|
+
{"version":3,"file":"avatars.d.ts","sourceRoot":"","sources":["../../../src/client/api/avatars.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAgBH,OAAO,KAAK,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,qBAAqB,CAAC;AACvD,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,cAAc,CAAC;AAC3C,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,gBAAgB,CAAC;AAG1D,iDAAiD;AACjD,MAAM,MAAM,qBAAqB,GAAG,IAAI,CAAC,mBAAmB,EAAE,QAAQ,GAAG,OAAO,CAAC,CAAC;AAiClF;;;;;;;;;;;;;;;GAeG;AACH,wBAAsB,YAAY,CAChC,MAAM,EAAE,MAAM,EACd,IAAI,EAAE,UAAU,EAChB,OAAO,GAAE,qBAA0B,GAClC,OAAO,CAAC,MAAM,CAAC,CAgBjB;AAED;;;;;;GAMG;AACH,wBAAgB,cAAc,CAC5B,MAAM,EAAE,MAAM,EACd,GAAG,EAAE,GAAG,GAAG,MAAM,EACjB,OAAO,GAAE,qBAA0B,GAClC,OAAO,CAAC,UAAU,GAAG,SAAS,CAAC,CAEjC;AAED;;;;;;;;GAQG;AACH,wBAAsB,YAAY,CAChC,MAAM,EAAE,MAAM,EACd,OAAO,GAAE,qBAA0B,GAClC,OAAO,CAAC,OAAO,CAAC,CAQlB;AAED;;;;;;;;;;;;;GAaG;AACH,wBAAsB,UAAU,CAC9B,MAAM,EAAE,MAAM,EACd,IAAI,EAAE,UAAU,EAChB,OAAO,GAAE,qBAA0B,GAClC,OAAO,CAAC,MAAM,CAAC,CAajB;AAED,iFAAiF;AACjF,wBAAgB,YAAY,CAC1B,MAAM,EAAE,MAAM,EACd,EAAE,EAAE,MAAM,EACV,OAAO,GAAE,qBAA0B,GAClC,OAAO,CAAC,UAAU,GAAG,SAAS,CAAC,CAEjC"}
|
|
@@ -8,6 +8,7 @@
|
|
|
8
8
|
import { createHash } from "node:crypto";
|
|
9
9
|
import { Readable, Writable } from "node:stream";
|
|
10
10
|
import { ErrorCode, ServerError, asChannelID, avatarFileName, deleteFile, iconFileName, iconIDOf, initFileDownload, initFileUpload, updateClient, } from "@honeybbq/teamspeak";
|
|
11
|
+
import { verifyStored, withDialCleanup } from "./upload-checks.js";
|
|
11
12
|
const CHANNEL_ZERO = asChannelID(0n);
|
|
12
13
|
async function download(client, name, options) {
|
|
13
14
|
let info;
|
|
@@ -54,7 +55,12 @@ export async function uploadAvatar(client, data, options = {}) {
|
|
|
54
55
|
overwrite: true,
|
|
55
56
|
...(options.signal ? { signal: options.signal } : {}),
|
|
56
57
|
});
|
|
57
|
-
await client.uploadFileData(client.host, info, Readable.from([data]), options);
|
|
58
|
+
await withDialCleanup(client, info.serverFileTransferID, () => client.uploadFileData(client.host, info, Readable.from([data]), options));
|
|
59
|
+
// Stored under a name the server derives from the uploader's uid, not the
|
|
60
|
+
// one asked for (measured on TeamSpeak 3 3.13.8 and TeamSpeak 6 6.0.0).
|
|
61
|
+
await verifyStored(client, CHANNEL_ZERO, `/${avatarFileName(client.uid)}`, BigInt(data.length), {
|
|
62
|
+
signal: options.signal,
|
|
63
|
+
});
|
|
58
64
|
await updateClient(client, { avatar: md5 });
|
|
59
65
|
return md5;
|
|
60
66
|
}
|
|
@@ -108,7 +114,10 @@ export async function uploadIcon(client, data, options = {}) {
|
|
|
108
114
|
overwrite: true,
|
|
109
115
|
...(options.signal ? { signal: options.signal } : {}),
|
|
110
116
|
});
|
|
111
|
-
await client.uploadFileData(client.host, info, Readable.from([data]), options);
|
|
117
|
+
await withDialCleanup(client, info.serverFileTransferID, () => client.uploadFileData(client.host, info, Readable.from([data]), options));
|
|
118
|
+
await verifyStored(client, CHANNEL_ZERO, iconFileName(id), BigInt(data.length), {
|
|
119
|
+
signal: options.signal,
|
|
120
|
+
});
|
|
112
121
|
return id;
|
|
113
122
|
}
|
|
114
123
|
/** The bytes of an icon, or undefined when the server has no file for the id. */
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"avatars.js","sourceRoot":"","sources":["../../../src/client/api/avatars.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AACzC,OAAO,EAAE,QAAQ,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;AACjD,OAAO,EACL,SAAS,EACT,WAAW,EACX,WAAW,EACX,cAAc,EACd,UAAU,EACV,YAAY,EACZ,QAAQ,EACR,gBAAgB,EAChB,cAAc,EACd,YAAY,GACb,MAAM,qBAAqB,CAAC;
|
|
1
|
+
{"version":3,"file":"avatars.js","sourceRoot":"","sources":["../../../src/client/api/avatars.ts"],"names":[],"mappings":"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"}
|
|
@@ -59,8 +59,15 @@ export interface DownloadFileOptions extends FileDownloadOptions, FileTransferOp
|
|
|
59
59
|
*
|
|
60
60
|
* `data` is the bytes, or a `Readable` with `options.size` the number of bytes
|
|
61
61
|
* it will give. It resolves once the server has closed the transfer
|
|
62
|
-
* connection,
|
|
63
|
-
*
|
|
62
|
+
* connection and, by `ftgetfileinfo` (one more command), holds a file of
|
|
63
|
+
* exactly that size: the server does not say whether it stored a file, so a
|
|
64
|
+
* close alone could be a transfer someone stopped. A size that differs, or a
|
|
65
|
+
* file that is not there, fails the call with a {@link FileTransferError}; a
|
|
66
|
+
* client with no browse power cannot ask (2568) and resolves on the close. A
|
|
67
|
+
* stream that gives fewer or more bytes than `size` fails the call, and the
|
|
68
|
+
* connection is closed. When the connection to the file transfer port is
|
|
69
|
+
* refused or times out, the negotiated transfer is stopped on the server (else
|
|
70
|
+
* it lingers in `ftlist` for about 10 seconds), as it is for `downloadFile`.
|
|
64
71
|
*
|
|
65
72
|
* With `resume`, `data` is still the whole file: the server says how much it
|
|
66
73
|
* already holds from an interrupted upload (a file that is not there is
|
|
@@ -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;
|
|
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;AAsGD;;;;;;;;;;;;;;;;;;;;;;;;;;;;;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
|
@@ -13,6 +13,7 @@ import { Readable, Transform, Writable, pipeline } from "node:stream";
|
|
|
13
13
|
import { initFileDownload, initFileUpload, stopFileTransfer } from "@honeybbq/teamspeak";
|
|
14
14
|
import { FileTransferError } from "../errors.js";
|
|
15
15
|
import { downloadFileData, uploadFileData } from "../transfer.js";
|
|
16
|
+
import { verifyStored, withDialCleanup } from "./upload-checks.js";
|
|
16
17
|
function isTransferCapable(client) {
|
|
17
18
|
const candidate = client;
|
|
18
19
|
return (typeof candidate.host === "string" &&
|
|
@@ -87,8 +88,15 @@ function skipBytes(count) {
|
|
|
87
88
|
*
|
|
88
89
|
* `data` is the bytes, or a `Readable` with `options.size` the number of bytes
|
|
89
90
|
* it will give. It resolves once the server has closed the transfer
|
|
90
|
-
* connection,
|
|
91
|
-
*
|
|
91
|
+
* connection and, by `ftgetfileinfo` (one more command), holds a file of
|
|
92
|
+
* exactly that size: the server does not say whether it stored a file, so a
|
|
93
|
+
* close alone could be a transfer someone stopped. A size that differs, or a
|
|
94
|
+
* file that is not there, fails the call with a {@link FileTransferError}; a
|
|
95
|
+
* client with no browse power cannot ask (2568) and resolves on the close. A
|
|
96
|
+
* stream that gives fewer or more bytes than `size` fails the call, and the
|
|
97
|
+
* connection is closed. When the connection to the file transfer port is
|
|
98
|
+
* refused or times out, the negotiated transfer is stopped on the server (else
|
|
99
|
+
* it lingers in `ftlist` for about 10 seconds), as it is for `downloadFile`.
|
|
92
100
|
*
|
|
93
101
|
* With `resume`, `data` is still the whole file: the server says how much it
|
|
94
102
|
* already holds from an interrupted upload (a file that is not there is
|
|
@@ -124,7 +132,8 @@ export async function uploadFile(client, channelID, path, data, options = {}) {
|
|
|
124
132
|
source = data;
|
|
125
133
|
else
|
|
126
134
|
source = pipeline(data, skipBytes(skip), () => { });
|
|
127
|
-
await route.upload(info, source, transferOptions(options));
|
|
135
|
+
await withDialCleanup(client, info.serverFileTransferID, () => route.upload(info, source, transferOptions(options)));
|
|
136
|
+
await verifyStored(client, channelID, path, size, options);
|
|
128
137
|
}
|
|
129
138
|
export async function downloadFile(client, channelID, path, options = {}) {
|
|
130
139
|
const maxSize = options.maxSize ?? DEFAULT_MAX_SIZE;
|
|
@@ -139,7 +148,8 @@ export async function downloadFile(client, channelID, path, options = {}) {
|
|
|
139
148
|
timeoutMs: options.timeoutMs,
|
|
140
149
|
});
|
|
141
150
|
if (options.dest !== undefined) {
|
|
142
|
-
|
|
151
|
+
const dest = options.dest;
|
|
152
|
+
await withDialCleanup(client, info.serverFileTransferID, () => route.download(info, dest, transferOptions(options)));
|
|
143
153
|
return;
|
|
144
154
|
}
|
|
145
155
|
const wanted = info.size - info.seekPosition;
|
|
@@ -157,7 +167,7 @@ export async function downloadFile(client, channelID, path, options = {}) {
|
|
|
157
167
|
done();
|
|
158
168
|
},
|
|
159
169
|
});
|
|
160
|
-
await route.download(info, sink, transferOptions(options));
|
|
170
|
+
await withDialCleanup(client, info.serverFileTransferID, () => route.download(info, sink, transferOptions(options)));
|
|
161
171
|
return Buffer.concat(chunks);
|
|
162
172
|
}
|
|
163
173
|
const DEFAULT_MAX_SIZE = 256 * 1024 * 1024;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"files.js","sourceRoot":"","sources":["../../../src/client/api/files.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAEH,OAAO,EAAE,QAAQ,EAAE,SAAS,EAAE,QAAQ,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;AACtE,OAAO,EAAE,gBAAgB,EAAE,cAAc,EAAE,gBAAgB,EAAE,MAAM,qBAAqB,CAAC;AASzF,OAAO,EAAE,iBAAiB,EAAE,MAAM,cAAc,CAAC;AACjD,OAAO,EAAE,gBAAgB,EAAE,cAAc,EAAE,MAAM,gBAAgB,CAAC;AA+
|
|
1
|
+
{"version":3,"file":"files.js","sourceRoot":"","sources":["../../../src/client/api/files.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAEH,OAAO,EAAE,QAAQ,EAAE,SAAS,EAAE,QAAQ,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;AACtE,OAAO,EAAE,gBAAgB,EAAE,cAAc,EAAE,gBAAgB,EAAE,MAAM,qBAAqB,CAAC;AASzF,OAAO,EAAE,iBAAiB,EAAE,MAAM,cAAc,CAAC;AACjD,OAAO,EAAE,gBAAgB,EAAE,cAAc,EAAE,MAAM,gBAAgB,CAAC;AAClE,OAAO,EAAE,YAAY,EAAE,eAAe,EAAE,MAAM,oBAAoB,CAAC;AA+DnE,SAAS,iBAAiB,CAAC,MAAuB;IAChD,MAAM,SAAS,GAAG,MAAkC,CAAC;IACrD,OAAO,CACL,OAAO,SAAS,CAAC,IAAI,KAAK,QAAQ;QAClC,OAAO,SAAS,CAAC,cAAc,KAAK,UAAU;QAC9C,OAAO,SAAS,CAAC,gBAAgB,KAAK,UAAU,CACjD,CAAC;AACJ,CAAC;AAED;;;;GAIG;AACH,SAAS,QAAQ,CACf,MAAuB,EACvB,OAA4F;IAK5F,IAAI,iBAAiB,CAAC,MAAM,CAAC,IAAI,OAAO,CAAC,IAAI,KAAK,SAAS,IAAI,CAAC,OAAO,CAAC,aAAa,EAAE,CAAC;QACtF,OAAO;YACL,MAAM,EAAE,CAAC,IAAI,EAAE,IAAI,EAAE,CAAC,EAAE,EAAE,CAAC,MAAM,CAAC,cAAc,CAAC,MAAM,CAAC,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC;YAC5E,QAAQ,EAAE,CAAC,IAAI,EAAE,IAAI,EAAE,CAAC,EAAE,EAAE,CAAC,MAAM,CAAC,gBAAgB,CAAC,MAAM,CAAC,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC;SACjF,CAAC;IACJ,CAAC;IACD,MAAM,IAAI,GAAG,OAAO,CAAC,IAAI,IAAI,CAAC,iBAAiB,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC;IACnF,IAAI,IAAI,KAAK,SAAS,IAAI,IAAI,KAAK,EAAE,EAAE,CAAC;QACtC,MAAM,IAAI,SAAS,CACjB,4FAA4F,CAC7F,CAAC;IACJ,CAAC;IACD,OAAO;QACL,MAAM,EAAE,CAAC,IAAI,EAAE,IAAI,EAAE,CAAC,EAAE,EAAE,CAAC,cAAc,CAAC,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC;QAC9D,QAAQ,EAAE,CAAC,IAAI,EAAE,IAAI,EAAE,CAAC,EAAE,EAAE,CAAC,gBAAgB,CAAC,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC;KACnE,CAAC;AACJ,CAAC;AAED,6DAA6D;AAC7D,SAAS,eAAe,CAAC,OAA4B;IACnD,OAAO;QACL,MAAM,EAAE,OAAO,CAAC,MAAM;QACtB,aAAa,EAAE,OAAO,CAAC,aAAa;QACpC,KAAK,EAAE,OAAO,CAAC,KAAK;QACpB,aAAa,EAAE,OAAO,CAAC,aAAa;KACrC,CAAC;AACJ,CAAC;AAED,SAAS,MAAM,CAAC,IAA2B,EAAE,QAAqC;IAChF,MAAM,IAAI,GAAG,QAAQ,KAAK,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;IACnE,IAAI,IAAI,KAAK,SAAS,IAAI,CAAC,IAAI,GAAG,EAAE,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC,EAAE,CAAC;QAC7E,MAAM,IAAI,UAAU,CAAC,qDAAqD,MAAM,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC;IAChG,CAAC;IACD,IAAI,IAAI,YAAY,UAAU,EAAE,CAAC;QAC/B,IAAI,IAAI,KAAK,SAAS,IAAI,IAAI,KAAK,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC;YACvD,MAAM,IAAI,SAAS,CAAC,aAAa,IAAI,0BAA0B,IAAI,CAAC,MAAM,EAAE,CAAC,CAAC;QAChF,CAAC;QACD,OAAO,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;IAC7B,CAAC;IACD,IAAI,IAAI,KAAK,SAAS,EAAE,CAAC;QACvB,MAAM,IAAI,SAAS,CAAC,2DAA2D,CAAC,CAAC;IACnF,CAAC;IACD,OAAO,IAAI,CAAC;AACd,CAAC;AAED,iDAAiD;AACjD,SAAS,SAAS,CAAC,KAAa;IAC9B,IAAI,IAAI,GAAG,KAAK,CAAC;IACjB,OAAO,IAAI,SAAS,CAAC;QACnB,SAAS,CAAC,KAAa,EAAE,SAAS,EAAE,QAAQ;YAC1C,IAAI,IAAI,IAAI,KAAK,CAAC,MAAM,EAAE,CAAC;gBACzB,IAAI,IAAI,KAAK,CAAC,MAAM,CAAC;gBACrB,QAAQ,EAAE,CAAC;gBACX,OAAO;YACT,CAAC;YACD,MAAM,IAAI,GAAG,KAAK,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC;YAClC,IAAI,GAAG,CAAC,CAAC;YACT,QAAQ,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;QACvB,CAAC;KACF,CAAC,CAAC;AACL,CAAC;AAED;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA6BG;AACH,MAAM,CAAC,KAAK,UAAU,UAAU,CAC9B,MAAuB,EACvB,SAAoB,EACpB,IAAY,EACZ,IAA2B,EAC3B,OAAO,GAAsB,EAAE;IAE/B,MAAM,IAAI,GAAG,MAAM,CAAC,IAAI,EAAE,OAAO,CAAC,IAAI,CAAC,CAAC;IACxC,MAAM,KAAK,GAAG,QAAQ,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACxC,MAAM,IAAI,GAAG,MAAM,cAAc,CAAC,MAAM,EAAE,SAAS,EAAE,IAAI,EAAE,IAAI,EAAE;QAC/D,QAAQ,EAAE,OAAO,CAAC,QAAQ;QAC1B,SAAS,EAAE,OAAO,CAAC,SAAS;QAC5B,MAAM,EAAE,OAAO,CAAC,MAAM;QACtB,MAAM,EAAE,OAAO,CAAC,MAAM;QACtB,SAAS,EAAE,OAAO,CAAC,SAAS;KAC7B,CAAC,CAAC;IACH,0EAA0E;IAC1E,0BAA0B;IAC1B,MAAM,IAAI,GAAG,MAAM,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC;IACvC,IAAI,MAAgB,CAAC;IACrB,IAAI,IAAI,YAAY,UAAU;QAAE,MAAM,GAAG,QAAQ,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;SACzE,IAAI,IAAI,KAAK,CAAC;QAAE,MAAM,GAAG,IAAI,CAAC;;QAC9B,MAAM,GAAG,QAAQ,CAAC,IAAI,EAAE,SAAS,CAAC,IAAI,CAAC,EAAE,GAAG,EAAE,GAAE,CAAC,CAAC,CAAC;IACxD,MAAM,eAAe,CAAC,MAAM,EAAE,IAAI,CAAC,oBAAoB,EAAE,GAAG,EAAE,CAC5D,KAAK,CAAC,MAAM,CAAC,IAAI,EAAE,MAAM,EAAE,eAAe,CAAC,OAAO,CAAC,CAAC,CACrD,CAAC;IACF,MAAM,YAAY,CAAC,MAAM,EAAE,SAAS,EAAE,IAAI,EAAE,IAAI,EAAE,OAAO,CAAC,CAAC;AAC7D,CAAC;AAkCD,MAAM,CAAC,KAAK,UAAU,YAAY,CAChC,MAAuB,EACvB,SAAoB,EACpB,IAAY,EACZ,OAAO,GAAwB,EAAE;IAEjC,MAAM,OAAO,GAAG,OAAO,CAAC,OAAO,IAAI,gBAAgB,CAAC;IACpD,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,OAAO,CAAC,IAAI,OAAO,GAAG,CAAC,EAAE,CAAC;QAC7C,MAAM,IAAI,UAAU,CAAC,kDAAkD,MAAM,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;IAC5F,CAAC;IACD,MAAM,KAAK,GAAG,QAAQ,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACxC,MAAM,IAAI,GAAG,MAAM,gBAAgB,CAAC,MAAM,EAAE,SAAS,EAAE,IAAI,EAAE;QAC3D,QAAQ,EAAE,OAAO,CAAC,QAAQ;QAC1B,YAAY,EAAE,OAAO,CAAC,YAAY;QAClC,MAAM,EAAE,OAAO,CAAC,MAAM;QACtB,SAAS,EAAE,OAAO,CAAC,SAAS;KAC7B,CAAC,CAAC;IACH,IAAI,OAAO,CAAC,IAAI,KAAK,SAAS,EAAE,CAAC;QAC/B,MAAM,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC;QAC1B,MAAM,eAAe,CAAC,MAAM,EAAE,IAAI,CAAC,oBAAoB,EAAE,GAAG,EAAE,CAC5D,KAAK,CAAC,QAAQ,CAAC,IAAI,EAAE,IAAI,EAAE,eAAe,CAAC,OAAO,CAAC,CAAC,CACrD,CAAC;QACF,OAAO;IACT,CAAC;IACD,MAAM,MAAM,GAAG,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC,YAAY,CAAC;IAC7C,IAAI,MAAM,GAAG,MAAM,CAAC,OAAO,CAAC,EAAE,CAAC;QAC7B,0EAA0E;QAC1E,2EAA2E;QAC3E,0CAA0C;QAC1C,MAAM,gBAAgB,CAAC,MAAM,EAAE,IAAI,CAAC,oBAAoB,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE,GAAE,CAAC,CAAC,CAAC;QAC1E,MAAM,IAAI,iBAAiB,CACzB,mBAAmB,MAAM,oBAAoB,OAAO,iCAAiC,CACtF,CAAC;IACJ,CAAC;IACD,MAAM,MAAM,GAAa,EAAE,CAAC;IAC5B,MAAM,IAAI,GAAG,IAAI,QAAQ,CAAC;QACxB,KAAK,CAAC,KAAa,EAAE,SAAS,EAAE,IAAI;YAClC,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;YACnB,IAAI,EAAE,CAAC;QACT,CAAC;KACF,CAAC,CAAC;IACH,MAAM,eAAe,CAAC,MAAM,EAAE,IAAI,CAAC,oBAAoB,EAAE,GAAG,EAAE,CAC5D,KAAK,CAAC,QAAQ,CAAC,IAAI,EAAE,IAAI,EAAE,eAAe,CAAC,OAAO,CAAC,CAAC,CACrD,CAAC;IACF,OAAO,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;AAC/B,CAAC;AAED,MAAM,gBAAgB,GAAG,GAAG,GAAG,IAAI,GAAG,IAAI,CAAC"}
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* What an upload does around its data phase: stop a transfer whose connection
|
|
3
|
+
* was never made, and check what the server stored once it closed the
|
|
4
|
+
* connection. Shared by the file and avatar helpers; not exported from the
|
|
5
|
+
* package.
|
|
6
|
+
*/
|
|
7
|
+
import type { ChannelID, CommandExecutor, FileUploadInfo } from "@honeybbq/teamspeak";
|
|
8
|
+
/**
|
|
9
|
+
* Runs the data phase of a transfer the server has negotiated. When it fails
|
|
10
|
+
* because the connection to the file transfer port was refused or timed out,
|
|
11
|
+
* nothing has reached the server, and the transfer would sit in its list until
|
|
12
|
+
* it expires: stop it, as a refused `maxSize` download does. The stop is best
|
|
13
|
+
* effort and never replaces the dial's error. Not sent once the connection
|
|
14
|
+
* opened (the key may be written and the server may have dropped the transfer),
|
|
15
|
+
* nor after `STOP_WITHIN_MS`.
|
|
16
|
+
*/
|
|
17
|
+
export declare function withDialCleanup(client: CommandExecutor, serverFileTransferID: FileUploadInfo["serverFileTransferID"], move: () => Promise<void>): Promise<void>;
|
|
18
|
+
/**
|
|
19
|
+
* Checks that the server holds the whole file after an upload's connection
|
|
20
|
+
* closed. Measured on TeamSpeak 3 3.13.8 and TeamSpeak 6 6.0.0: a completed
|
|
21
|
+
* upload gets no status from the server, so a close after the last byte looks
|
|
22
|
+
* the same whether the file was stored or the transfer was stopped (the voice
|
|
23
|
+
* protocol reports that, 2066, only after the close), and `ftgetfileinfo`
|
|
24
|
+
* already answers the final size 6 to 45 ms after the close, in every case.
|
|
25
|
+
* Permissions are checked at the negotiation only, so no refusal comes later.
|
|
26
|
+
*
|
|
27
|
+
* A client without browse power gets 2568 for `ftgetfileinfo`: the file cannot
|
|
28
|
+
* be checked, and the upload resolves on the close. Any other failure of the
|
|
29
|
+
* command is thrown as it is.
|
|
30
|
+
*/
|
|
31
|
+
export declare function verifyStored(client: CommandExecutor, channelID: ChannelID, path: string, size: bigint, options: {
|
|
32
|
+
readonly password?: string | undefined;
|
|
33
|
+
readonly signal?: AbortSignal | undefined;
|
|
34
|
+
readonly timeoutMs?: number | undefined;
|
|
35
|
+
}): Promise<void>;
|
|
36
|
+
//# sourceMappingURL=upload-checks.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"upload-checks.d.ts","sourceRoot":"","sources":["../../../src/client/api/upload-checks.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAGH,OAAO,KAAK,EAAE,SAAS,EAAE,eAAe,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAC;AAYtF;;;;;;;;GAQG;AACH,wBAAsB,eAAe,CACnC,MAAM,EAAE,eAAe,EACvB,oBAAoB,EAAE,cAAc,CAAC,sBAAsB,CAAC,EAC5D,IAAI,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,GACxB,OAAO,CAAC,IAAI,CAAC,CAUf;AAED;;;;;;;;;;;;GAYG;AACH,wBAAsB,YAAY,CAChC,MAAM,EAAE,eAAe,EACvB,SAAS,EAAE,SAAS,EACpB,IAAI,EAAE,MAAM,EACZ,IAAI,EAAE,MAAM,EACZ,OAAO,EAAE;IACP,QAAQ,CAAC,QAAQ,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IACvC,QAAQ,CAAC,MAAM,CAAC,EAAE,WAAW,GAAG,SAAS,CAAC;IAC1C,QAAQ,CAAC,SAAS,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;CACzC,GACA,OAAO,CAAC,IAAI,CAAC,CA2Bf"}
|
|
@@ -0,0 +1,77 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* What an upload does around its data phase: stop a transfer whose connection
|
|
3
|
+
* was never made, and check what the server stored once it closed the
|
|
4
|
+
* connection. Shared by the file and avatar helpers; not exported from the
|
|
5
|
+
* package.
|
|
6
|
+
*/
|
|
7
|
+
import { ErrorCode, ServerError, getFileInfo, stopFileTransfer } from "@honeybbq/teamspeak";
|
|
8
|
+
import { FileTransferError } from "../errors.js";
|
|
9
|
+
import { failedToConnect } from "../transfer.js";
|
|
10
|
+
/**
|
|
11
|
+
* The server drops a transfer nobody dialled after about 10 seconds (measured
|
|
12
|
+
* on TeamSpeak 3 3.13.8 and TeamSpeak 6 6.0.0: it is gone from `ftlist` at
|
|
13
|
+
* 10.05 s, and the voice client hears 2059). `ftstop` of a transfer the server
|
|
14
|
+
* no longer has crashes TeamSpeak 6, so a stop is only sent well inside that.
|
|
15
|
+
*/
|
|
16
|
+
const STOP_WITHIN_MS = 5_000;
|
|
17
|
+
/**
|
|
18
|
+
* Runs the data phase of a transfer the server has negotiated. When it fails
|
|
19
|
+
* because the connection to the file transfer port was refused or timed out,
|
|
20
|
+
* nothing has reached the server, and the transfer would sit in its list until
|
|
21
|
+
* it expires: stop it, as a refused `maxSize` download does. The stop is best
|
|
22
|
+
* effort and never replaces the dial's error. Not sent once the connection
|
|
23
|
+
* opened (the key may be written and the server may have dropped the transfer),
|
|
24
|
+
* nor after `STOP_WITHIN_MS`.
|
|
25
|
+
*/
|
|
26
|
+
export async function withDialCleanup(client, serverFileTransferID, move) {
|
|
27
|
+
const negotiatedAt = performance.now();
|
|
28
|
+
try {
|
|
29
|
+
await move();
|
|
30
|
+
}
|
|
31
|
+
catch (error) {
|
|
32
|
+
if (failedToConnect(error) && performance.now() - negotiatedAt < STOP_WITHIN_MS) {
|
|
33
|
+
await stopFileTransfer(client, serverFileTransferID).catch(() => { });
|
|
34
|
+
}
|
|
35
|
+
throw error;
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
/**
|
|
39
|
+
* Checks that the server holds the whole file after an upload's connection
|
|
40
|
+
* closed. Measured on TeamSpeak 3 3.13.8 and TeamSpeak 6 6.0.0: a completed
|
|
41
|
+
* upload gets no status from the server, so a close after the last byte looks
|
|
42
|
+
* the same whether the file was stored or the transfer was stopped (the voice
|
|
43
|
+
* protocol reports that, 2066, only after the close), and `ftgetfileinfo`
|
|
44
|
+
* already answers the final size 6 to 45 ms after the close, in every case.
|
|
45
|
+
* Permissions are checked at the negotiation only, so no refusal comes later.
|
|
46
|
+
*
|
|
47
|
+
* A client without browse power gets 2568 for `ftgetfileinfo`: the file cannot
|
|
48
|
+
* be checked, and the upload resolves on the close. Any other failure of the
|
|
49
|
+
* command is thrown as it is.
|
|
50
|
+
*/
|
|
51
|
+
export async function verifyStored(client, channelID, path, size, options) {
|
|
52
|
+
let stored;
|
|
53
|
+
try {
|
|
54
|
+
stored = (await getFileInfo(client, channelID, path, {
|
|
55
|
+
password: options.password,
|
|
56
|
+
signal: options.signal,
|
|
57
|
+
timeoutMs: options.timeoutMs,
|
|
58
|
+
})).size;
|
|
59
|
+
}
|
|
60
|
+
catch (error) {
|
|
61
|
+
if (error instanceof ServerError) {
|
|
62
|
+
if (error.code === ErrorCode.PermissionsClientInsufficient)
|
|
63
|
+
return;
|
|
64
|
+
// 2051 on TeamSpeak 6, 2052 on TeamSpeak 3 for a file that is not there.
|
|
65
|
+
if (error.code === ErrorCode.FileNotFound || error.code === ErrorCode.FileIOError) {
|
|
66
|
+
throw new FileTransferError(`the server closed the upload but has no file ${path}`, {
|
|
67
|
+
cause: error,
|
|
68
|
+
});
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
throw error;
|
|
72
|
+
}
|
|
73
|
+
if (stored !== size) {
|
|
74
|
+
throw new FileTransferError(`the server closed the upload but holds ${stored} of the ${size} bytes of ${path}`);
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
//# sourceMappingURL=upload-checks.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"upload-checks.js","sourceRoot":"","sources":["../../../src/client/api/upload-checks.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,SAAS,EAAE,WAAW,EAAE,WAAW,EAAE,gBAAgB,EAAE,MAAM,qBAAqB,CAAC;AAE5F,OAAO,EAAE,iBAAiB,EAAE,MAAM,cAAc,CAAC;AACjD,OAAO,EAAE,eAAe,EAAE,MAAM,gBAAgB,CAAC;AAEjD;;;;;GAKG;AACH,MAAM,cAAc,GAAG,KAAK,CAAC;AAE7B;;;;;;;;GAQG;AACH,MAAM,CAAC,KAAK,UAAU,eAAe,CACnC,MAAuB,EACvB,oBAA4D,EAC5D,IAAyB;IAEzB,MAAM,YAAY,GAAG,WAAW,CAAC,GAAG,EAAE,CAAC;IACvC,IAAI,CAAC;QACH,MAAM,IAAI,EAAE,CAAC;IACf,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,IAAI,eAAe,CAAC,KAAK,CAAC,IAAI,WAAW,CAAC,GAAG,EAAE,GAAG,YAAY,GAAG,cAAc,EAAE,CAAC;YAChF,MAAM,gBAAgB,CAAC,MAAM,EAAE,oBAAoB,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE,GAAE,CAAC,CAAC,CAAC;QACvE,CAAC;QACD,MAAM,KAAK,CAAC;IACd,CAAC;AACH,CAAC;AAED;;;;;;;;;;;;GAYG;AACH,MAAM,CAAC,KAAK,UAAU,YAAY,CAChC,MAAuB,EACvB,SAAoB,EACpB,IAAY,EACZ,IAAY,EACZ,OAIC;IAED,IAAI,MAAc,CAAC;IACnB,IAAI,CAAC;QACH,MAAM,GAAG,CACP,MAAM,WAAW,CAAC,MAAM,EAAE,SAAS,EAAE,IAAI,EAAE;YACzC,QAAQ,EAAE,OAAO,CAAC,QAAQ;YAC1B,MAAM,EAAE,OAAO,CAAC,MAAM;YACtB,SAAS,EAAE,OAAO,CAAC,SAAS;SAC7B,CAAC,CACH,CAAC,IAAI,CAAC;IACT,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,IAAI,KAAK,YAAY,WAAW,EAAE,CAAC;YACjC,IAAI,KAAK,CAAC,IAAI,KAAK,SAAS,CAAC,6BAA6B;gBAAE,OAAO;YACnE,yEAAyE;YACzE,IAAI,KAAK,CAAC,IAAI,KAAK,SAAS,CAAC,YAAY,IAAI,KAAK,CAAC,IAAI,KAAK,SAAS,CAAC,WAAW,EAAE,CAAC;gBAClF,MAAM,IAAI,iBAAiB,CAAC,gDAAgD,IAAI,EAAE,EAAE;oBAClF,KAAK,EAAE,KAAK;iBACb,CAAC,CAAC;YACL,CAAC;QACH,CAAC;QACD,MAAM,KAAK,CAAC;IACd,CAAC;IACD,IAAI,MAAM,KAAK,IAAI,EAAE,CAAC;QACpB,MAAM,IAAI,iBAAiB,CACzB,0CAA0C,MAAM,WAAW,IAAI,aAAa,IAAI,EAAE,CACnF,CAAC;IACJ,CAAC;AACH,CAAC"}
|
|
@@ -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;
|
|
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
|
@@ -10,7 +10,7 @@ import { RESOLVE_BUDGET_MS, Resolver } from "./discovery/resolver.js";
|
|
|
10
10
|
import { PacketHandler } from "./transport/handler.js";
|
|
11
11
|
import { PacketType } from "./transport/packet.js";
|
|
12
12
|
import { CommandTracker, appendReturnCode } from "./commands.js";
|
|
13
|
-
import { buildCommand, buildCommandChain, encodeRequest, floodRetryDelayMs, parseServerError, resolveBackoffPolicy, } from "../core/internal.js";
|
|
13
|
+
import { buildCommand, buildCommandChain, encodeRequest, floodHoldMs, FLOOD_RETRIES, floodRetryDelayMs, parseServerError, resolveBackoffPolicy, } from "../core/internal.js";
|
|
14
14
|
import { uploadFileData, downloadFileData } from "./transfer.js";
|
|
15
15
|
import { buildSetConnectionInfo } from "./connection-info.js";
|
|
16
16
|
import { buildEventChain } from "./events.js";
|
|
@@ -73,14 +73,6 @@ export function onSentLine(hook) {
|
|
|
73
73
|
export function clientInternals(client) {
|
|
74
74
|
return internalsOf(client);
|
|
75
75
|
}
|
|
76
|
-
/**
|
|
77
|
-
* How many times a command refused as flooding is sent again after the pause
|
|
78
|
-
* the server asked for. The first resend is usually refused once more with a
|
|
79
|
-
* shorter wait, and the second goes through (measured on TeamSpeak 3 and 6).
|
|
80
|
-
*/
|
|
81
|
-
const FLOOD_RETRIES = 3;
|
|
82
|
-
/** Added to the server's wait, which counts down to the millisecond. */
|
|
83
|
-
const FLOOD_HOLD_MARGIN_MS = 10;
|
|
84
76
|
/** How long a command waits for its answer unless told otherwise. */
|
|
85
77
|
const DEFAULT_COMMAND_TIMEOUT_MS = 10_000;
|
|
86
78
|
/**
|
|
@@ -695,15 +687,16 @@ export class Client {
|
|
|
695
687
|
// afford: nothing is sent until then, and the command, which the
|
|
696
688
|
// server did not run, goes out again.
|
|
697
689
|
const wait = result.err ? floodRetryDelayMs(result.err) : undefined;
|
|
698
|
-
|
|
690
|
+
const hold = wait === undefined ? undefined : floodHoldMs(wait);
|
|
691
|
+
if (hold !== undefined &&
|
|
699
692
|
!goodbye &&
|
|
700
693
|
refused < FLOOD_RETRIES &&
|
|
701
|
-
|
|
694
|
+
hold < deadline - performance.now()) {
|
|
702
695
|
this.#logger.debug("the server asked for a pause", {
|
|
703
696
|
command: parsed?.name,
|
|
704
697
|
waitMs: wait,
|
|
705
698
|
});
|
|
706
|
-
this.#throttle.hold(
|
|
699
|
+
this.#throttle.hold(hold);
|
|
707
700
|
this.#cmdTrack.unregister(rc);
|
|
708
701
|
[rc, answered] = this.#cmdTrack.register(spec, correlation, echo);
|
|
709
702
|
continue;
|