Browse Source

feat(asset-server-plugin): Allow specifying encoding for AssetStorageStrategy (#3926)

Julian Pufler 1 month ago
parent
commit
842a7df0d8

+ 4 - 4
docs/docs/reference/core-plugins/asset-server-plugin/local-asset-storage-strategy.md

@@ -19,11 +19,11 @@ A persistence strategy which saves files to the local file system.
 class LocalAssetStorageStrategy implements AssetStorageStrategy {
     toAbsoluteUrl: ((reqest: Request, identifier: string) => string) | undefined;
     constructor(uploadPath: string, toAbsoluteUrlFn?: (reqest: Request, identifier: string) => string)
-    writeFileFromStream(fileName: string, data: ReadStream) => Promise<string>;
+    writeFileFromStream(fileName: string, data: ReadStream, encoding? BufferEncoding | null) => Promise<string>;
     writeFileFromBuffer(fileName: string, data: Buffer) => Promise<string>;
     fileExists(fileName: string) => Promise<boolean>;
     readFileToBuffer(identifier: string) => Promise<Buffer>;
-    readFileToStream(identifier: string) => Promise<Stream>;
+    readFileToStream(identifier: string, encoding? BufferEncoding | null) => Promise<Stream>;
     deleteFile(identifier: string) => Promise<void>;
 }
 ```
@@ -45,7 +45,7 @@ class LocalAssetStorageStrategy implements AssetStorageStrategy {
 
 ### writeFileFromStream
 
-<MemberInfo kind="method" type={`(fileName: string, data: ReadStream) => Promise&#60;string&#62;`}   />
+<MemberInfo kind="method" type={`(fileName: string, data: ReadStream, encoding? BufferEncoding | null) => Promise&#60;string&#62;`}   />
 
 
 ### writeFileFromBuffer
@@ -65,7 +65,7 @@ class LocalAssetStorageStrategy implements AssetStorageStrategy {
 
 ### readFileToStream
 
-<MemberInfo kind="method" type={`(identifier: string) => Promise&#60;Stream&#62;`}   />
+<MemberInfo kind="method" type={`(identifier: string, encoding? BufferEncoding | null) => Promise&#60;Stream&#62;`}   />
 
 
 ### deleteFile

+ 8 - 4
docs/docs/reference/typescript-api/assets/asset-storage-strategy.md

@@ -26,9 +26,9 @@ your VendureConfig.
 ```ts title="Signature"
 interface AssetStorageStrategy extends InjectableStrategy {
     writeFileFromBuffer(fileName: string, data: Buffer): Promise<string>;
-    writeFileFromStream(fileName: string, data: Stream): Promise<string>;
+    writeFileFromStream(fileName: string, data: Stream, encoding?: BufferEncoding | null): Promise<string>;
     readFileToBuffer(identifier: string): Promise<Buffer>;
-    readFileToStream(identifier: string): Promise<Stream>;
+    readFileToStream(identifier: string, encoding?: BufferEncoding | null): Promise<Stream>;
     deleteFile(identifier: string): Promise<void>;
     fileExists(fileName: string): Promise<boolean>;
     toAbsoluteUrl?(request: Request, identifier: string): string;
@@ -48,10 +48,12 @@ Writes a buffer to the store and returns a unique identifier for that
 file such as a file path or a URL.
 ### writeFileFromStream
 
-<MemberInfo kind="method" type={`(fileName: string, data: Stream) => Promise&#60;string&#62;`}   />
+<MemberInfo kind="method" type={`(fileName: string, data: Stream, encoding?: BufferEncoding | null) => Promise&#60;string&#62;`}   />
 
 Writes a readable stream to the store and returns a unique identifier for that
 file such as a file path or a URL.
+
+Passing null as the encoding will result in no specific encoding being used.
 ### readFileToBuffer
 
 <MemberInfo kind="method" type={`(identifier: string) => Promise&#60;Buffer&#62;`}   />
@@ -60,10 +62,12 @@ Reads a file based on an identifier which was generated by the writeFile
 method, and returns the as a Buffer.
 ### readFileToStream
 
-<MemberInfo kind="method" type={`(identifier: string) => Promise&#60;Stream&#62;`}   />
+<MemberInfo kind="method" type={`(identifier: string, encoding?: BufferEncoding | null) => Promise&#60;Stream&#62;`}   />
 
 Reads a file based on an identifier which was generated by the writeFile
 method, and returns the file as a Stream.
+
+Passing null as the encoding will result in no specific encoding being used.
 ### deleteFile
 
 <MemberInfo kind="method" type={`(identifier: string) => Promise&#60;void&#62;`}   />

+ 14 - 5
packages/asset-server-plugin/src/config/local-asset-storage-strategy.ts

@@ -1,5 +1,4 @@
 import { AssetStorageStrategy } from '@vendure/core';
-import { createHash } from 'crypto';
 import { Request } from 'express';
 import { ReadStream } from 'fs';
 import fs from 'fs-extra';
@@ -25,10 +24,17 @@ export class LocalAssetStorageStrategy implements AssetStorageStrategy {
         }
     }
 
-    async writeFileFromStream(fileName: string, data: ReadStream): Promise<string> {
+    async writeFileFromStream(
+        fileName: string,
+        data: ReadStream,
+        encoding?: BufferEncoding | null,
+    ): Promise<string> {
         const filePath = path.join(this.uploadPath, fileName);
         await fs.ensureDir(path.dirname(filePath));
-        const writeStream = fs.createWriteStream(filePath, 'binary');
+        const writeStream = fs.createWriteStream(
+            filePath,
+            encoding === undefined ? 'binary' : encoding === null ? undefined : encoding,
+        );
         return new Promise<string>((resolve, reject) => {
             data.pipe(writeStream);
             writeStream.on('close', () => resolve(this.filePathToIdentifier(filePath)));
@@ -55,8 +61,11 @@ export class LocalAssetStorageStrategy implements AssetStorageStrategy {
         return fs.readFile(this.identifierToFilePath(identifier));
     }
 
-    readFileToStream(identifier: string): Promise<Stream> {
-        const readStream = fs.createReadStream(this.identifierToFilePath(identifier), 'binary');
+    readFileToStream(identifier: string, encoding?: BufferEncoding | null): Promise<Stream> {
+        const readStream = fs.createReadStream(
+            this.identifierToFilePath(identifier),
+            encoding === undefined ? 'binary' : encoding === null ? undefined : encoding,
+        );
         return Promise.resolve(readStream);
     }
 

+ 6 - 2
packages/core/src/config/asset-storage-strategy/asset-storage-strategy.ts

@@ -41,8 +41,10 @@ export interface AssetStorageStrategy extends InjectableStrategy {
      * @description
      * Writes a readable stream to the store and returns a unique identifier for that
      * file such as a file path or a URL.
+     *
+     * Passing null as the encoding will result in no specific encoding being used.
      */
-    writeFileFromStream(fileName: string, data: Stream): Promise<string>;
+    writeFileFromStream(fileName: string, data: Stream, encoding?: BufferEncoding | null): Promise<string>;
 
     /**
      * @description
@@ -55,8 +57,10 @@ export interface AssetStorageStrategy extends InjectableStrategy {
      * @description
      * Reads a file based on an identifier which was generated by the writeFile
      * method, and returns the file as a Stream.
+     *
+     * Passing null as the encoding will result in no specific encoding being used.
      */
-    readFileToStream(identifier: string): Promise<Stream>;
+    readFileToStream(identifier: string, encoding?: BufferEncoding | null): Promise<Stream>;
 
     /**
      * @description