xuxiaobo-bobo e6520392ec '...'
2024-03-18 11:14:05 +08:00

93 lines
3.1 KiB
JavaScript

"use strict";
var __importDefault = (this && this.__importDefault) || function (mod) {
return (mod && mod.__esModule) ? mod : { "default": mod };
};
Object.defineProperty(exports, "__esModule", { value: true });
exports.ftp = void 0;
const basic_ftp_1 = require("basic-ftp");
const stream_1 = require("stream");
const path_1 = require("path");
const debug_1 = __importDefault(require("debug"));
const notfound_1 = __importDefault(require("./notfound"));
const notmodified_1 = __importDefault(require("./notmodified"));
const debug = (0, debug_1.default)('get-uri:ftp');
/**
* Returns a Readable stream from an "ftp:" URI.
*/
const ftp = async (url, opts = {}) => {
const { cache } = opts;
const filepath = decodeURIComponent(url.pathname);
let lastModified;
if (!filepath) {
throw new TypeError('No "pathname"!');
}
const client = new basic_ftp_1.Client();
try {
const host = url.hostname || url.host || 'localhost';
const port = parseInt(url.port || '0', 10) || 21;
const user = url.username
? decodeURIComponent(url.username)
: undefined;
const password = url.password
? decodeURIComponent(url.password)
: undefined;
await client.access({
host,
port,
user,
password,
...opts,
});
// first we have to figure out the Last Modified date.
// try the MDTM command first, which is an optional extension command.
try {
lastModified = await client.lastMod(filepath);
}
catch (err) {
// handle the "file not found" error code
if (err.code === 550) {
throw new notfound_1.default();
}
}
if (!lastModified) {
// Try to get the last modified date via the LIST command (uses
// more bandwidth, but is more compatible with older FTP servers
const list = await client.list((0, path_1.dirname)(filepath));
// attempt to find the "entry" with a matching "name"
const name = (0, path_1.basename)(filepath);
const entry = list.find((e) => e.name === name);
if (entry) {
lastModified = entry.modifiedAt;
}
}
if (lastModified) {
if (isNotModified()) {
throw new notmodified_1.default();
}
}
else {
throw new notfound_1.default();
}
const stream = new stream_1.PassThrough();
const rs = stream;
client.downloadTo(stream, filepath).then((result) => {
debug(result.message);
client.close();
});
rs.lastModified = lastModified;
return rs;
}
catch (err) {
client.close();
throw err;
}
// called when `lastModified` is set, and a "cache" stream was provided
function isNotModified() {
if (cache?.lastModified && lastModified) {
return +cache.lastModified === +lastModified;
}
return false;
}
};
exports.ftp = ftp;
//# sourceMappingURL=ftp.js.map