mirror of
https://github.com/n8n-io/n8n.git
synced 2025-03-05 20:50:17 -08:00
feat(SSH Node): Stream binary data for uploads and downloads (#5305)
This commit is contained in:
parent
448c295314
commit
6f7421f970
|
@ -1,4 +1,5 @@
|
||||||
import type { IExecuteFunctions } from 'n8n-core';
|
import type { IExecuteFunctions } from 'n8n-core';
|
||||||
|
import { BINARY_ENCODING } from 'n8n-core';
|
||||||
|
|
||||||
import type {
|
import type {
|
||||||
IDataObject,
|
IDataObject,
|
||||||
|
@ -8,11 +9,13 @@ import type {
|
||||||
} from 'n8n-workflow';
|
} from 'n8n-workflow';
|
||||||
import { NodeOperationError } from 'n8n-workflow';
|
import { NodeOperationError } from 'n8n-workflow';
|
||||||
|
|
||||||
import { readFile, rm, writeFile } from 'fs/promises';
|
import { rm, writeFile } from 'fs/promises';
|
||||||
|
|
||||||
import { file } from 'tmp-promise';
|
import { file as tmpFile } from 'tmp-promise';
|
||||||
|
|
||||||
|
import type { Config } from 'node-ssh';
|
||||||
import { NodeSSH } from 'node-ssh';
|
import { NodeSSH } from 'node-ssh';
|
||||||
|
import type { Readable } from 'stream';
|
||||||
|
|
||||||
export class Ssh implements INodeType {
|
export class Ssh implements INodeType {
|
||||||
description: INodeTypeDescription = {
|
description: INodeTypeDescription = {
|
||||||
|
@ -268,16 +271,16 @@ export class Ssh implements INodeType {
|
||||||
} else if (authentication === 'privateKey') {
|
} else if (authentication === 'privateKey') {
|
||||||
const credentials = await this.getCredentials('sshPrivateKey');
|
const credentials = await this.getCredentials('sshPrivateKey');
|
||||||
|
|
||||||
const { path } = await file({ prefix: 'n8n-ssh-' });
|
const { path } = await tmpFile({ prefix: 'n8n-ssh-' });
|
||||||
temporaryFiles.push(path);
|
temporaryFiles.push(path);
|
||||||
await writeFile(path, credentials.privateKey as string);
|
await writeFile(path, credentials.privateKey as string);
|
||||||
|
|
||||||
const options = {
|
const options: Config = {
|
||||||
host: credentials.host as string,
|
host: credentials.host as string,
|
||||||
username: credentials.username as string,
|
username: credentials.username as string,
|
||||||
port: credentials.port as number,
|
port: credentials.port as number,
|
||||||
privateKey: path,
|
privateKey: path,
|
||||||
} as any;
|
};
|
||||||
|
|
||||||
if (credentials.passphrase) {
|
if (credentials.passphrase) {
|
||||||
options.passphrase = credentials.passphrase as string;
|
options.passphrase = credentials.passphrase as string;
|
||||||
|
@ -306,7 +309,7 @@ export class Ssh implements INodeType {
|
||||||
const dataPropertyNameDownload = this.getNodeParameter('binaryPropertyName', i);
|
const dataPropertyNameDownload = this.getNodeParameter('binaryPropertyName', i);
|
||||||
const parameterPath = this.getNodeParameter('path', i) as string;
|
const parameterPath = this.getNodeParameter('path', i) as string;
|
||||||
|
|
||||||
const { path } = await file({ prefix: 'n8n-ssh-' });
|
const { path } = await tmpFile({ prefix: 'n8n-ssh-' });
|
||||||
temporaryFiles.push(path);
|
temporaryFiles.push(path);
|
||||||
|
|
||||||
await ssh.getFile(path, parameterPath);
|
await ssh.getFile(path, parameterPath);
|
||||||
|
@ -328,10 +331,8 @@ export class Ssh implements INodeType {
|
||||||
|
|
||||||
items[i] = newItem;
|
items[i] = newItem;
|
||||||
|
|
||||||
const data = await readFile(path);
|
items[i].binary![dataPropertyNameDownload] = await this.helpers.copyBinaryFile(
|
||||||
|
path,
|
||||||
items[i].binary![dataPropertyNameDownload] = await this.helpers.prepareBinaryData(
|
|
||||||
data,
|
|
||||||
parameterPath,
|
parameterPath,
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
@ -360,11 +361,16 @@ export class Ssh implements INodeType {
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
const dataBuffer = await this.helpers.getBinaryDataBuffer(i, propertyNameUpload);
|
let uploadData: Buffer | Readable;
|
||||||
|
if (binaryData.id) {
|
||||||
|
uploadData = this.helpers.getBinaryStream(binaryData.id);
|
||||||
|
} else {
|
||||||
|
uploadData = Buffer.from(binaryData.data, BINARY_ENCODING);
|
||||||
|
}
|
||||||
|
|
||||||
const { path } = await file({ prefix: 'n8n-ssh-' });
|
const { path } = await tmpFile({ prefix: 'n8n-ssh-' });
|
||||||
temporaryFiles.push(path);
|
temporaryFiles.push(path);
|
||||||
await writeFile(path, dataBuffer);
|
await writeFile(path, uploadData);
|
||||||
|
|
||||||
await ssh.putFile(
|
await ssh.putFile(
|
||||||
path,
|
path,
|
||||||
|
|
Loading…
Reference in a new issue