packages/@visi/web-server/src/frameworks/services/storage/storage-fs-impl.ts
import { createReadStream, createWriteStream } from 'fs';
import { inject, injectable } from 'inversify';
import path from 'path';
import { fromEvent } from 'rxjs';
import { Storage, StorageCreateResponse } from '../../../domain/services';
import { TYPES } from '../../../types';
import { Config } from '../../config';
@injectable()
export class StorageFsImpl implements Storage {
constructor(
@inject(TYPES.Config)
private readonly config: Config,
) {}
create(source: string): Promise<StorageCreateResponse> {
return new Promise((resolve) => {
const stream = createReadStream(source);
// TODO: file extension support
const fileName = Date.now().toString() + '.png';
const pathName = path.join(this.config.static.dir, fileName);
const writer = createWriteStream(pathName);
fromEvent(stream, 'data').subscribe((data) => {
writer.write(data);
});
fromEvent(stream, 'end').subscribe(() => {
const url = `${this.config.getStaticUrl()}/${fileName}`;
resolve({ file: url });
});
});
}
}