Skip to content

Commit 1304429

Browse files
committed
Offer maxListingBytes as an option
1 parent 5cb5367 commit 1304429

File tree

1 file changed

+15
-8
lines changed

1 file changed

+15
-8
lines changed

src/Client.ts

Lines changed: 15 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,17 +1,17 @@
1-
import { createReadStream, createWriteStream, mkdir, readdir, stat, open, close, unlink } from "fs"
1+
import { close, createReadStream, createWriteStream, mkdir, open, readdir, stat, unlink } from "fs"
22
import { basename, join } from "path"
33
import { Readable, Writable } from "stream"
44
import { connect as connectTLS, ConnectionOptions as TLSConnectionOptions } from "tls"
55
import { promisify } from "util"
66
import { FileInfo } from "./FileInfo"
77
import { FTPContext, FTPError, FTPResponse } from "./FtpContext"
8+
import { describeAddress, describeTLS, upgradeSocket } from "./netUtils"
9+
import { isMultiline, positiveCompletion } from "./parseControlResponse"
810
import { parseList as parseListAutoDetect } from "./parseList"
11+
import { parseMLSxDate } from "./parseListMLSD"
912
import { ProgressHandler, ProgressTracker } from "./ProgressTracker"
1013
import { StringWriter } from "./StringWriter"
11-
import { parseMLSxDate } from "./parseListMLSD"
12-
import { describeAddress, describeTLS, upgradeSocket } from "./netUtils"
13-
import { uploadFrom, downloadTo, enterPassiveModeIPv6, enterPassiveModeIPv4, UploadCommand, enterPassiveModeIPv4_forceControlHostIP } from "./transfer"
14-
import { isMultiline, positiveCompletion } from "./parseControlResponse"
14+
import { downloadTo, enterPassiveModeIPv4, enterPassiveModeIPv4_forceControlHostIP, enterPassiveModeIPv6, UploadCommand, uploadFrom } from "./transfer"
1515

1616
// Use promisify to keep the library compatible with Node 8.
1717
const fsReadDir = promisify(readdir)
@@ -50,11 +50,15 @@ export interface UploadOptions {
5050
}
5151

5252
export interface ClientOptions {
53+
/** Allow the FTP server to use a different host for transfers. */
5354
allowSeparateTransferHost: boolean
55+
/** The upper bound for directory listings. */
56+
maxListingBytes: number
5457
}
5558

5659
const defaultClientOptions: ClientOptions = {
57-
allowSeparateTransferHost: true
60+
allowSeparateTransferHost: true,
61+
maxListingBytes: 20 * 1024 * 1024
5862
}
5963
const LIST_COMMANDS_DEFAULT = () => ["LIST -a", "LIST"]
6064
const LIST_COMMANDS_MLSD = () => ["MLSD", "LIST -a", "LIST"]
@@ -70,18 +74,21 @@ export class Client {
7074
readonly ftp: FTPContext
7175
/** Tracks progress of data transfers. */
7276
protected _progressTracker: ProgressTracker
77+
protected options: ClientOptions
7378

7479
/**
7580
* Instantiate an FTP client.
7681
*
7782
* @param timeout Timeout in milliseconds, use 0 for no timeout. Optional, default is 30 seconds.
7883
*/
79-
constructor(timeout = 30000, options: ClientOptions = defaultClientOptions) {
84+
constructor(timeout = 30000, userOptions: Partial<ClientOptions> = defaultClientOptions) {
85+
const options: ClientOptions = { ...defaultClientOptions, ...userOptions }
8086
this.ftp = new FTPContext(timeout)
8187
this.prepareTransfer = this._enterFirstCompatibleMode([
8288
enterPassiveModeIPv6,
8389
options.allowSeparateTransferHost ? enterPassiveModeIPv4 : enterPassiveModeIPv4_forceControlHostIP
8490
])
91+
this.options = options
8592
this.parseList = parseListAutoDetect
8693
this._progressTracker = new ProgressTracker()
8794
}
@@ -589,7 +596,7 @@ export class Client {
589596
* @protected
590597
*/
591598
protected async _requestListWithCommand(command: string): Promise<FileInfo[]> {
592-
const buffer = new StringWriter()
599+
const buffer = new StringWriter(this.options.maxListingBytes)
593600
await downloadTo(buffer, {
594601
ftp: this.ftp,
595602
tracker: this._progressTracker,

0 commit comments

Comments
 (0)