diff --git a/pods/preview/src/providers/octet.ts b/pods/preview/src/providers/octet.ts index c5e16b621fa..7c3403fa48b 100644 --- a/pods/preview/src/providers/octet.ts +++ b/pods/preview/src/providers/octet.ts @@ -14,16 +14,33 @@ // import { type MeasureContext, type WorkspaceUuid } from '@hcengineering/core' +import { StorageAdapter } from '@hcengineering/server-core' +import { createWriteStream } from 'fs' +import { pipeline } from 'stream/promises' + +import { TemporaryDir } from '../tempdir' import { type PreviewFile, type PreviewMetadata, type PreviewProvider } from '../types' export class OctetStreamProvider implements PreviewProvider { + constructor ( + private readonly storage: StorageAdapter, + private readonly tempDir: TemporaryDir + ) {} + supports (contentType: string): boolean { return contentType === 'application/octet-stream' } async image (ctx: MeasureContext, workspace: WorkspaceUuid, name: string, contentType: string): Promise { - throw new Error('Cannot generate image preview for application/octet-stream') + const path = this.tempDir.tmpFile() + + await ctx.with('blob-read', {}, async (ctx) => { + const stream = await this.storage.get(ctx, { uuid: workspace } as any, name) + await pipeline(stream, createWriteStream(path)) + }) + + return { mimeType: contentType, filePath: path } } async metadata ( diff --git a/pods/preview/src/service.ts b/pods/preview/src/service.ts index 59b6ae4babc..3a1c222e894 100644 --- a/pods/preview/src/service.ts +++ b/pods/preview/src/service.ts @@ -54,7 +54,7 @@ export function createPreviewService ( new DocProvider(storage, tempDir), new PdfProvider(storage, tempDir), new VideoProvider(storage, tempDir), - new OctetStreamProvider(), + new OctetStreamProvider(storage, tempDir), new FallbackProvider(imageProvider) ] return new PreviewServiceImpl(storage, cache, tempDir, providers, concurrency)