| "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 |