Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
11 changes: 9 additions & 2 deletions src/commands/download-file.ts
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,6 @@ import { NetworkFacade } from '../services/network/network-facade.service';
import { AuthService } from '../services/auth.service';
import { CryptoService } from '../services/crypto.service';
import { DownloadService } from '../services/network/download.service';
import { UploadService } from '../services/network/upload.service';
import { SdkManager } from '../services/sdk-manager.service';
import { createWriteStream } from 'node:fs';
import { UserSettings } from '@internxt/sdk/dist/shared/types/userSettings';
Expand All @@ -16,6 +15,8 @@ import { StreamUtils } from '../utils/stream.utils';
import { ErrorUtils } from '../utils/errors.utils';
import { NotValidDirectoryError, NotValidFileUuidError } from '../types/command.types';
import { ValidationService } from '../services/validation.service';
import { Environment } from '@internxt/inxt-js';
import { ConfigService } from '../services/config.service';

export default class DownloadFile extends Command {
static readonly args = {};
Expand Down Expand Up @@ -198,9 +199,15 @@ export default class DownloadFile extends Command {
user: user.bridgeUser,
pass: user.userId,
});
const environment = new Environment({
bridgeUser: user.bridgeUser,
bridgePass: user.userId,
bridgeUrl: ConfigService.instance.get('NETWORK_URL'),
encryptionKey: user.mnemonic,
});
const networkFacade = new NetworkFacade(
networkModule,
UploadService.instance,
environment,
DownloadService.instance,
CryptoService.instance,
);
Expand Down
46 changes: 27 additions & 19 deletions src/commands/upload-file.ts
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,6 @@ import { CLIUtils } from '../utils/cli.utils';
import { ConfigService } from '../services/config.service';
import path from 'node:path';
import { DriveFileService } from '../services/drive/drive-file.service';
import { UploadService } from '../services/network/upload.service';
import { CryptoService } from '../services/crypto.service';
import { DownloadService } from '../services/network/download.service';
import { ErrorUtils } from '../utils/errors.utils';
Expand All @@ -19,6 +18,7 @@ import { ThumbnailService } from '../services/thumbnail.service';
import { BufferStream } from '../utils/stream.utils';
import { isFileThumbnailable } from '../utils/thumbnail.utils';
import { Readable } from 'node:stream';
import { Environment } from '@internxt/inxt-js';

export default class UploadFile extends Command {
static readonly args = {};
Expand Down Expand Up @@ -72,9 +72,15 @@ export default class UploadFile extends Command {
user: user.bridgeUser,
pass: user.userId,
});
const environment = new Environment({
bridgeUser: user.bridgeUser,
bridgePass: user.userId,
bridgeUrl: ConfigService.instance.get('NETWORK_URL'),
encryptionKey: user.mnemonic,
});
const networkFacade = new NetworkFacade(
networkModule,
UploadService.instance,
environment,
DownloadService.instance,
CryptoService.instance,
);
Expand All @@ -99,32 +105,35 @@ export default class UploadFile extends Command {
}

const progressCallback = (progress: number) => {
progressBar.update(progress * 0.99);
progressBar.update(progress * 100 * 0.99);
};

const [uploadPromise, abortable] = await UploadService.instance.uploadFileStream(
fileStream,
user.bucket,
user.mnemonic,
stats.size,
networkFacade,
progressCallback,
);

process.on('SIGINT', () => {
abortable.abort('SIGINT received');
process.exit(1);
const fileId = await new Promise((resolve: (fileId: string) => void, reject) => {
const state = networkFacade.uploadFile(
fileStream,
stats.size,
user.bucket,
(err: Error | null, res: string | null) => {
if (err) {
return reject(err);
}
resolve(res as string);
},
progressCallback,
);
process.on('SIGINT', () => {
state.stop();
process.exit(1);
});
});

const uploadResult = await uploadPromise;

// 3. Create the file in Drive
const createdDriveFile = await DriveFileService.instance.createFile({
plain_name: fileInfo.name,
type: fileType,
size: stats.size,
folder_id: destinationFolderUuid,
id: uploadResult.fileId,
id: fileId,
bucket: user.bucket,
encrypt_version: EncryptionVersion.Aes03,
name: '',
Expand All @@ -139,7 +148,6 @@ export default class UploadFile extends Command {
thumbnailBuffer,
fileType,
user.bucket,
user.mnemonic,
createdDriveFile.id,
networkFacade,
);
Expand Down
20 changes: 0 additions & 20 deletions src/services/crypto.service.ts
Original file line number Diff line number Diff line change
@@ -1,7 +1,6 @@
import { CryptoProvider } from '@internxt/sdk';
import { Keys, Password } from '@internxt/sdk/dist/auth';
import { createCipheriv, createDecipheriv, createHash, Decipher, pbkdf2Sync, randomBytes } from 'node:crypto';
import { Readable, Transform } from 'node:stream';
import { KeysService } from './keys.service';
import { ConfigService } from '../services/config.service';
import { StreamUtils } from '../utils/stream.utils';
Expand Down Expand Up @@ -116,20 +115,6 @@ export class CryptoService {
return Buffer.concat([decipher.update(contentsToDecrypt), decipher.final()]).toString('utf8');
};

public encryptStreamInParts = (
readable: Readable,
cipher: Transform,
size: number,
parts: number,
): Transform => {
// We include a marginChunkSize because if we split the chunk directly, there will always be one more chunk left, this will cause a mismatch with the urls provided
const marginChunkSize = 1024;
const chunkSize = size / parts + marginChunkSize;
const readableChunks = StreamUtils.streamReadableIntoChunks(readable, chunkSize);

return readableChunks.pipe(cipher);
};

public decryptStream = (
inputSlices: ReadableStream<Uint8Array>[],
key: Buffer,
Expand Down Expand Up @@ -180,11 +165,6 @@ export class CryptoService {
return decryptedStream;
};

public getEncryptionTransform = (key: Buffer, iv: Buffer): Transform => {
const cipher = createCipheriv('aes-256-ctr', key, iv);
return cipher;
};

/**
* Generates the key and the iv by transforming a secret and a salt.
* It will generate the same key and iv if the same secret and salt is used.
Expand Down
Loading
Loading