@devbro/neko-storage 0.1.4 → 0.1.6

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/index.ts","../src/Storage.mts","../src/providers/AWSS3StorageProvider.mts","../src/providers/LocalStorageProvider.mts","../src/StorageProviderFactory.mts"],"sourcesContent":["export * from './types.mjs';\nexport * from './Storage.mjs';\nexport * from './providers/AWSS3StorageProvider.mjs';\nexport * from './providers/LocalStorageProvider.mjs';\nexport * from './StorageProviderFactory.mjs';\nexport * from './StorageProviderInterface.mjs';","import { ReadStream } from 'fs';\nimport { Stream } from 'stream';\nimport { Metadata } from './types.mjs';\nimport { StorageConfig } from './types.mjs';\nimport { StorageProviderInterface } from './StorageProviderInterface.mjs';\n\nexport class Storage {\n constructor(protected provider: StorageProviderInterface) {}\n\n exists(path: string): Promise<boolean> {\n return this.provider.exists(path);\n }\n \n put(path: string, content: string | object | Stream | Buffer): Promise<boolean> {\n return this.provider.put(path, content);\n }\n \n getJson(path: string): Promise<object> {\n return this.provider.getJson(path);\n }\n \n getString(path: string): Promise<string> {\n return this.provider.getString(path);\n }\n \n getBuffer(path: string): Promise<Buffer> {\n return this.provider.getBuffer(path);\n }\n \n getStream(path: string): Promise<ReadStream> {\n return this.provider.getStream(path);\n }\n \n delete(path: string): Promise<boolean> {\n return this.provider.delete(path);\n }\n \n metadata(path: string): Promise<Metadata> {\n return this.provider.metadata(path);\n }\n}\n","import { Metadata, StorageConfig } from '../types.mjs';\nimport { Storage } from '../Storage.mjs';\nimport {\n S3Client,\n HeadObjectCommand,\n PutObjectCommand,\n GetObjectCommand,\n DeleteObjectCommand,\n HeadObjectOutput,\n} from '@aws-sdk/client-s3';\nimport { ReadStream } from 'fs';\nimport Stream, { Readable } from 'stream';\nimport { StorageProviderInterface } from '../StorageProviderInterface.mjs';\n\nexport class AWSS3StorageProvider implements StorageProviderInterface {\n private s3: S3Client;\n\n constructor(protected config: StorageConfig) {\n this.s3 = new S3Client(this.config?.s3Config || {});\n }\n\n async exists(path: string): Promise<boolean> {\n try {\n await this.s3.send(new HeadObjectCommand({ Bucket: this.config?.bucket, Key: path }));\n return true;\n } catch (error: any) {\n if (error.name === 'NotFound') {\n return false;\n }\n throw error;\n }\n }\n\n async put(path: string, content: string | object | Stream | Buffer): Promise<boolean> {\n let body: any;\n if (typeof content === 'string' || content instanceof Buffer) {\n body = content;\n } else if (typeof content === 'object' && !(content instanceof Stream)) {\n body = JSON.stringify(content);\n } else if (content instanceof Stream) {\n body = content;\n } else {\n throw new Error('Unsupported content type');\n }\n\n await this.s3.send(\n new PutObjectCommand({\n Bucket: this.config.bucket,\n Key: path,\n Body: body,\n })\n );\n\n return true;\n }\n\n async getJson(path: string): Promise<object> {\n const data = await this.s3.send(\n new GetObjectCommand({ Bucket: this.config.bucket, Key: path })\n );\n const body = await this.streamToString(data.Body as Stream);\n return JSON.parse(body);\n }\n\n async getString(path: string): Promise<string> {\n const data = await this.s3.send(\n new GetObjectCommand({ Bucket: this.config.bucket, Key: path })\n );\n return await this.streamToString(data.Body as Stream);\n }\n\n async delete(path: string): Promise<boolean> {\n await this.s3.send(new DeleteObjectCommand({ Bucket: this.config.bucket, Key: path }));\n return true;\n }\n\n private async streamToString(stream: Stream): Promise<string> {\n return new Promise((resolve, reject) => {\n const chunks: Uint8Array[] = [];\n stream.on('data', (chunk) => chunks.push(chunk));\n stream.on('end', () => resolve(Buffer.concat(chunks).toString('utf-8')));\n stream.on('error', reject);\n });\n }\n\n async getBuffer(path: string): Promise<Buffer> {\n const data = await this.s3.send(\n new GetObjectCommand({ Bucket: this.config.bucket, Key: path })\n );\n const chunks: Uint8Array[] = [];\n const stream = data.Body as Readable;\n\n return new Promise((resolve, reject) => {\n stream.on('data', (chunk) => chunks.push(chunk));\n stream.on('end', () => resolve(Buffer.concat(chunks)));\n stream.on('error', reject);\n });\n }\n\n async getStream(path: string): Promise<ReadStream> {\n const data = await this.s3.send(\n new GetObjectCommand({ Bucket: this.config.bucket, Key: path })\n );\n return data.Body as unknown as ReadStream;\n }\n\n async metadata(path: string): Promise<Metadata> {\n const metadata = await this.s3.send(\n new HeadObjectCommand({ Bucket: this.config.bucket, Key: path })\n );\n return {\n size: metadata.ContentLength || 0,\n mimeType: metadata.ContentType || 'unknown',\n lastModifiedDate: (metadata.LastModified || new Date(0)).toISOString(),\n };\n }\n}\n","import Stream from 'stream';\nimport * as fs from 'fs/promises';\nimport { createWriteStream, createReadStream, ReadStream } from 'fs';\nimport * as path from 'path';\nimport * as mime from 'mime-types';\nimport { Metadata, StorageConfig } from '../types.mjs';\nimport { Storage } from '../Storage.mjs';\nimport { StorageProviderInterface } from '../StorageProviderInterface.mjs';\n\nexport class LocalStorageProvider implements StorageProviderInterface {\n constructor(private config: StorageConfig) {\n // Ensure the base folder exists\n fs.mkdir(this.config.basePath, { recursive: true }).catch((error) => {\n throw error;\n });\n }\n\n async metadata(path: string): Promise<Metadata> {\n const fullPath = this.getFullPath(path);\n const stats = await fs.stat(fullPath);\n return {\n size: stats.size,\n mimeType: mime.lookup(fullPath) || 'unknown',\n lastModifiedDate: stats.mtime.toISOString(),\n };\n }\n\n getFullPath(filePath: string) {\n return path.join(this.config.basePath, filePath);\n }\n\n async exists(path: string): Promise<boolean> {\n try {\n await fs.access(this.getFullPath(path));\n return true;\n } catch {\n return false;\n }\n }\n\n async put(filepath: string, content: string | object | Stream | Buffer): Promise<boolean> {\n const fullPath = this.getFullPath(filepath);\n\n const dir = path.dirname(fullPath);\n await fs.mkdir(dir, { recursive: true });\n\n if (typeof content === 'string' || content instanceof Buffer) {\n await fs.writeFile(fullPath, content);\n } else if (typeof content === 'object' && !(content instanceof Stream)) {\n await fs.writeFile(fullPath, JSON.stringify(content, null, 2));\n } else if (typeof content === 'object' && content instanceof Stream) {\n const writeStream = createWriteStream(fullPath);\n await new Promise((resolve, reject) => {\n (content as Stream).pipe(writeStream);\n (content as Stream).on('end', resolve);\n (content as Stream).on('error', reject);\n });\n } else {\n throw new Error('Unsupported content type');\n }\n\n return true;\n }\n\n async getJson(path: string): Promise<object> {\n const fullPath = this.getFullPath(path);\n const content = await fs.readFile(fullPath, 'utf-8');\n return JSON.parse(content);\n }\n\n async getString(path: string, encoding: BufferEncoding = 'utf-8'): Promise<string> {\n const fullPath = this.getFullPath(path);\n return await fs.readFile(fullPath, encoding);\n }\n\n async getBuffer(path: string): Promise<Buffer> {\n const fullPath = this.getFullPath(path);\n return await fs.readFile(fullPath);\n }\n\n async getStream(path: string): Promise<ReadStream> {\n const fullPath = this.getFullPath(path);\n return createReadStream(fullPath);\n }\n\n async delete(path: string): Promise<boolean> {\n const fullPath = this.getFullPath(path);\n await fs.unlink(fullPath);\n return true;\n }\n}\n","import { Storage } from './Storage.mjs';\nimport { FlexibleFactory } from '@devbro/neko-helper';\nimport { StorageProviderInterface } from './StorageProviderInterface.mjs';\n\nexport class StorageProviderFactory {\n static instance: FlexibleFactory<StorageProviderInterface> = new FlexibleFactory<StorageProviderInterface>();\n\n static register(key: string, factory: (...args: any[]) => StorageProviderInterface): void {\n StorageProviderFactory.instance.register(key, factory);\n }\n\n static create<T>(key: string, ...args: any[]): StorageProviderInterface {\n return StorageProviderFactory.instance.create(key, ...args);\n }\n}\n"],"mappings":"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","names":["path","path","Stream","import_stream","path","Stream"]}
1
+ {"version":3,"sources":["../src/index.ts","../src/Storage.mts","../src/providers/AWSS3StorageProvider.mts","../src/providers/LocalStorageProvider.mts","../src/providers/GCPStorageProvider.mts","../src/providers/AzureBlobStorageProvider.mts","../src/providers/FTPStorageProvider.mts","../src/providers/SFTPStorageProvider.mts","../src/StorageProviderFactory.mts"],"sourcesContent":["export * from './types.mjs';\nexport * from './Storage.mjs';\nexport * from './providers/AWSS3StorageProvider.mjs';\nexport * from './providers/LocalStorageProvider.mjs';\nexport * from './providers/GCPStorageProvider.mjs';\nexport * from './providers/AzureBlobStorageProvider.mjs';\nexport * from './providers/FTPStorageProvider.mjs';\nexport * from './providers/SFTPStorageProvider.mjs';\nexport * from './StorageProviderFactory.mjs';\nexport * from './StorageProviderInterface.mjs';\n","import { ReadStream } from 'fs';\nimport { Stream } from 'stream';\nimport { Metadata } from './types.mjs';\nimport { StorageProviderInterface } from './StorageProviderInterface.mjs';\n\nexport class Storage {\n constructor(protected provider: StorageProviderInterface) {}\n\n exists(path: string): Promise<boolean> {\n return this.provider.exists(path);\n }\n\n put(path: string, content: string | object | Stream | Buffer): Promise<boolean> {\n return this.provider.put(path, content);\n }\n\n getJson(path: string): Promise<object> {\n return this.provider.getJson(path);\n }\n\n getString(path: string): Promise<string> {\n return this.provider.getString(path);\n }\n\n getBuffer(path: string): Promise<Buffer> {\n return this.provider.getBuffer(path);\n }\n\n getStream(path: string): Promise<ReadStream> {\n return this.provider.getStream(path);\n }\n\n delete(path: string): Promise<boolean> {\n return this.provider.delete(path);\n }\n\n metadata(path: string): Promise<Metadata> {\n return this.provider.metadata(path);\n }\n}\n","import { Metadata, S3ClientConfig } from '../types.mjs';\nimport {\n S3Client,\n HeadObjectCommand,\n PutObjectCommand,\n GetObjectCommand,\n DeleteObjectCommand,\n} from '@aws-sdk/client-s3';\nimport { ReadStream } from 'fs';\nimport Stream, { Readable } from 'stream';\nimport { StorageProviderInterface } from '../StorageProviderInterface.mjs';\n\nexport class AWSS3StorageProvider implements StorageProviderInterface {\n private s3: S3Client;\n\n constructor(protected config: S3ClientConfig) {\n this.s3 = new S3Client(this.config);\n }\n\n async exists(path: string): Promise<boolean> {\n try {\n await this.s3.send(new HeadObjectCommand({ Bucket: this.config.bucket, Key: path }));\n return true;\n } catch (error: any) {\n if (error.name === 'NotFound') {\n return false;\n }\n throw error;\n }\n }\n\n async put(path: string, content: string | object | Stream | Buffer): Promise<boolean> {\n let body: any;\n if (typeof content === 'string' || content instanceof Buffer) {\n body = content;\n } else if (typeof content === 'object' && !(content instanceof Stream)) {\n body = JSON.stringify(content);\n } else if (content instanceof Stream) {\n body = content;\n } else {\n throw new Error('Unsupported content type');\n }\n\n await this.s3.send(\n new PutObjectCommand({\n Bucket: this.config.bucket,\n Key: path,\n Body: body,\n })\n );\n\n return true;\n }\n\n async getJson(path: string): Promise<object> {\n const data = await this.s3.send(\n new GetObjectCommand({ Bucket: this.config.bucket, Key: path })\n );\n const body = await this.streamToString(data.Body as Stream);\n return JSON.parse(body);\n }\n\n async getString(path: string): Promise<string> {\n const data = await this.s3.send(\n new GetObjectCommand({ Bucket: this.config.bucket, Key: path })\n );\n return await this.streamToString(data.Body as Stream);\n }\n\n async delete(path: string): Promise<boolean> {\n await this.s3.send(new DeleteObjectCommand({ Bucket: this.config.bucket, Key: path }));\n return true;\n }\n\n private async streamToString(stream: Stream): Promise<string> {\n return new Promise((resolve, reject) => {\n const chunks: Uint8Array[] = [];\n stream.on('data', (chunk) => chunks.push(chunk));\n stream.on('end', () => resolve(Buffer.concat(chunks).toString('utf-8')));\n stream.on('error', reject);\n });\n }\n\n async getBuffer(path: string): Promise<Buffer> {\n const data = await this.s3.send(\n new GetObjectCommand({ Bucket: this.config.bucket, Key: path })\n );\n const chunks: Uint8Array[] = [];\n const stream = data.Body as Readable;\n\n return new Promise((resolve, reject) => {\n stream.on('data', (chunk) => chunks.push(chunk));\n stream.on('end', () => resolve(Buffer.concat(chunks)));\n stream.on('error', reject);\n });\n }\n\n async getStream(path: string): Promise<ReadStream> {\n const data = await this.s3.send(\n new GetObjectCommand({ Bucket: this.config.bucket, Key: path })\n );\n return data.Body as unknown as ReadStream;\n }\n\n async metadata(path: string): Promise<Metadata> {\n const metadata = await this.s3.send(\n new HeadObjectCommand({ Bucket: this.config.bucket, Key: path })\n );\n return {\n size: metadata.ContentLength || 0,\n mimeType: metadata.ContentType || 'unknown',\n lastModifiedDate: (metadata.LastModified || new Date(0)).toISOString(),\n };\n }\n}\n","import Stream from 'stream';\nimport * as fs from 'fs/promises';\nimport { createWriteStream, createReadStream, ReadStream } from 'fs';\nimport * as path from 'path';\nimport * as mime from 'mime-types';\nimport { Metadata, LocalStorageConfig } from '../types.mjs';\nimport { StorageProviderInterface } from '../StorageProviderInterface.mjs';\n\nexport class LocalStorageProvider implements StorageProviderInterface {\n constructor(private config: LocalStorageConfig) {\n // Ensure the base folder exists\n fs.mkdir(this.config.basePath, { recursive: true }).catch((error) => {\n throw error;\n });\n }\n\n async metadata(path: string): Promise<Metadata> {\n const fullPath = this.getFullPath(path);\n const stats = await fs.stat(fullPath);\n return {\n size: stats.size,\n mimeType: mime.lookup(fullPath) || 'unknown',\n lastModifiedDate: stats.mtime.toISOString(),\n };\n }\n\n getFullPath(filePath: string) {\n return path.join(this.config.basePath, filePath);\n }\n\n async exists(path: string): Promise<boolean> {\n try {\n await fs.access(this.getFullPath(path));\n return true;\n } catch {\n return false;\n }\n }\n\n async put(filepath: string, content: string | object | Stream | Buffer): Promise<boolean> {\n const fullPath = this.getFullPath(filepath);\n\n const dir = path.dirname(fullPath);\n await fs.mkdir(dir, { recursive: true });\n\n if (typeof content === 'string' || content instanceof Buffer) {\n await fs.writeFile(fullPath, content);\n } else if (typeof content === 'object' && !(content instanceof Stream)) {\n await fs.writeFile(fullPath, JSON.stringify(content, null, 2));\n } else if (typeof content === 'object' && content instanceof Stream) {\n const writeStream = createWriteStream(fullPath);\n await new Promise((resolve, reject) => {\n (content as Stream).pipe(writeStream);\n (content as Stream).on('end', resolve);\n (content as Stream).on('error', reject);\n });\n } else {\n throw new Error('Unsupported content type');\n }\n\n return true;\n }\n\n async getJson(path: string): Promise<object> {\n const fullPath = this.getFullPath(path);\n const content = await fs.readFile(fullPath, 'utf-8');\n return JSON.parse(content);\n }\n\n async getString(path: string, encoding: BufferEncoding = 'utf-8'): Promise<string> {\n const fullPath = this.getFullPath(path);\n return await fs.readFile(fullPath, encoding);\n }\n\n async getBuffer(path: string): Promise<Buffer> {\n const fullPath = this.getFullPath(path);\n return await fs.readFile(fullPath);\n }\n\n async getStream(path: string): Promise<ReadStream> {\n const fullPath = this.getFullPath(path);\n return createReadStream(fullPath);\n }\n\n async delete(path: string): Promise<boolean> {\n const fullPath = this.getFullPath(path);\n await fs.unlink(fullPath);\n return true;\n }\n}\n","import { Storage as GCPStorage } from '@google-cloud/storage';\nimport { Metadata, GCPStorageConfig } from '../types.mjs';\nimport { StorageProviderInterface } from '../StorageProviderInterface.mjs';\nimport { ReadStream } from 'fs';\nimport Stream from 'stream';\nimport * as mime from 'mime-types';\n\nexport class GCPStorageProvider implements StorageProviderInterface {\n private storage: GCPStorage;\n\n constructor(protected config: GCPStorageConfig) {\n const { bucket, ...gcpOptions } = config;\n this.storage = new GCPStorage(gcpOptions);\n }\n\n async exists(path: string): Promise<boolean> {\n try {\n const file = this.storage.bucket(this.config.bucket).file(path);\n const [exists] = await file.exists();\n return exists;\n } catch (error) {\n return false;\n }\n }\n\n async put(path: string, content: string | object | Stream | Buffer): Promise<boolean> {\n const file = this.storage.bucket(this.config.bucket).file(path);\n\n let data: string | Buffer | Stream;\n if (typeof content === 'string' || content instanceof Buffer) {\n data = content;\n } else if (typeof content === 'object' && !(content instanceof Stream)) {\n data = JSON.stringify(content);\n } else if (content instanceof Stream) {\n data = content;\n } else {\n throw new Error('Unsupported content type');\n }\n\n if (data instanceof Stream) {\n await new Promise<void>((resolve, reject) => {\n data\n .pipe(file.createWriteStream())\n .on('finish', () => resolve())\n .on('error', reject);\n });\n } else {\n await file.save(data);\n }\n\n return true;\n }\n\n async getJson(path: string): Promise<object> {\n const data = await this.getString(path);\n return JSON.parse(data);\n }\n\n async getString(path: string): Promise<string> {\n const file = this.storage.bucket(this.config.bucket).file(path);\n const [content] = await file.download();\n return content.toString('utf-8');\n }\n\n async getBuffer(path: string): Promise<Buffer> {\n const file = this.storage.bucket(this.config.bucket).file(path);\n const [content] = await file.download();\n return content;\n }\n\n async getStream(path: string): Promise<ReadStream> {\n const file = this.storage.bucket(this.config.bucket).file(path);\n return file.createReadStream() as unknown as ReadStream;\n }\n\n async delete(path: string): Promise<boolean> {\n const file = this.storage.bucket(this.config.bucket).file(path);\n await file.delete();\n return true;\n }\n\n async metadata(path: string): Promise<Metadata> {\n const file = this.storage.bucket(this.config.bucket).file(path);\n const [metadata] = await file.getMetadata();\n\n return {\n size: typeof metadata.size === 'number' ? metadata.size : parseInt(metadata.size || '0', 10),\n mimeType: metadata.contentType || mime.lookup(path) || 'unknown',\n lastModifiedDate: metadata.updated || new Date(0).toISOString(),\n };\n }\n}\n","import { BlobServiceClient, StorageSharedKeyCredential } from '@azure/storage-blob';\nimport { Metadata, AzureStorageConfig } from '../types.mjs';\nimport { StorageProviderInterface } from '../StorageProviderInterface.mjs';\nimport { ReadStream } from 'fs';\nimport Stream, { Readable } from 'stream';\nimport * as mime from 'mime-types';\n\nexport class AzureBlobStorageProvider implements StorageProviderInterface {\n private blobServiceClient: BlobServiceClient;\n\n constructor(protected config: AzureStorageConfig) {\n const { accountName, accountKey, sasToken } = config;\n\n if (accountKey) {\n const sharedKeyCredential = new StorageSharedKeyCredential(accountName, accountKey);\n this.blobServiceClient = new BlobServiceClient(\n `https://${accountName}.blob.core.windows.net`,\n sharedKeyCredential\n );\n } else if (sasToken) {\n this.blobServiceClient = new BlobServiceClient(\n `https://${accountName}.blob.core.windows.net?${sasToken}`\n );\n } else {\n throw new Error('Either accountKey or sasToken is required for Azure Blob Storage');\n }\n }\n\n async exists(path: string): Promise<boolean> {\n try {\n const containerClient = this.blobServiceClient.getContainerClient(this.config.containerName);\n const blobClient = containerClient.getBlobClient(path);\n return await blobClient.exists();\n } catch (error) {\n return false;\n }\n }\n\n async put(path: string, content: string | object | Stream | Buffer): Promise<boolean> {\n const containerClient = this.blobServiceClient.getContainerClient(this.config.containerName);\n const blockBlobClient = containerClient.getBlockBlobClient(path);\n\n let data: string | Buffer | Stream;\n if (typeof content === 'string' || content instanceof Buffer) {\n data = content;\n } else if (typeof content === 'object' && !(content instanceof Stream)) {\n data = JSON.stringify(content);\n } else if (content instanceof Stream) {\n data = content;\n } else {\n throw new Error('Unsupported content type');\n }\n\n if (data instanceof Stream) {\n await blockBlobClient.uploadStream(data as Readable);\n } else {\n const buffer = typeof data === 'string' ? Buffer.from(data) : data;\n await blockBlobClient.upload(buffer, buffer.length);\n }\n\n return true;\n }\n\n async getJson(path: string): Promise<object> {\n const data = await this.getString(path);\n return JSON.parse(data);\n }\n\n async getString(path: string): Promise<string> {\n const buffer = await this.getBuffer(path);\n return buffer.toString('utf-8');\n }\n\n async getBuffer(path: string): Promise<Buffer> {\n const containerClient = this.blobServiceClient.getContainerClient(this.config.containerName);\n const blobClient = containerClient.getBlobClient(path);\n const downloadResponse = await blobClient.download();\n\n if (!downloadResponse.readableStreamBody) {\n throw new Error('Failed to download blob');\n }\n\n return await this.streamToBuffer(downloadResponse.readableStreamBody);\n }\n\n async getStream(path: string): Promise<ReadStream> {\n const containerClient = this.blobServiceClient.getContainerClient(this.config.containerName);\n const blobClient = containerClient.getBlobClient(path);\n const downloadResponse = await blobClient.download();\n\n if (!downloadResponse.readableStreamBody) {\n throw new Error('Failed to download blob');\n }\n\n return downloadResponse.readableStreamBody as unknown as ReadStream;\n }\n\n async delete(path: string): Promise<boolean> {\n const containerClient = this.blobServiceClient.getContainerClient(this.config.containerName);\n const blobClient = containerClient.getBlobClient(path);\n await blobClient.delete();\n return true;\n }\n\n async metadata(path: string): Promise<Metadata> {\n const containerClient = this.blobServiceClient.getContainerClient(this.config.containerName);\n const blobClient = containerClient.getBlobClient(path);\n const properties = await blobClient.getProperties();\n\n return {\n size: properties.contentLength || 0,\n mimeType: properties.contentType || mime.lookup(path) || 'unknown',\n lastModifiedDate: properties.lastModified?.toISOString() || new Date(0).toISOString(),\n };\n }\n\n private async streamToBuffer(readableStream: NodeJS.ReadableStream): Promise<Buffer> {\n return new Promise((resolve, reject) => {\n const chunks: Buffer[] = [];\n readableStream.on('data', (chunk) => {\n chunks.push(Buffer.isBuffer(chunk) ? chunk : Buffer.from(chunk));\n });\n readableStream.on('end', () => {\n resolve(Buffer.concat(chunks));\n });\n readableStream.on('error', reject);\n });\n }\n}\n","import { Client as FTPClient } from 'basic-ftp';\nimport { Metadata, FTPConfig } from '../types.mjs';\nimport { StorageProviderInterface } from '../StorageProviderInterface.mjs';\nimport { ReadStream } from 'fs';\nimport Stream, { Readable, PassThrough } from 'stream';\nimport * as mime from 'mime-types';\n\nexport class FTPStorageProvider implements StorageProviderInterface {\n constructor(private config: FTPConfig) {}\n\n private async getClient(): Promise<FTPClient> {\n const client = new FTPClient();\n await client.access({\n host: this.config.host,\n port: this.config.port || 21,\n user: this.config.user || 'anonymous',\n password: this.config.password || '',\n secure: this.config.secure || false,\n });\n return client;\n }\n\n async exists(path: string): Promise<boolean> {\n const client = await this.getClient();\n try {\n await client.size(path);\n return true;\n } catch (error) {\n return false;\n } finally {\n client.close();\n }\n }\n\n async put(path: string, content: string | object | Stream | Buffer): Promise<boolean> {\n const client = await this.getClient();\n try {\n let stream: Stream;\n if (typeof content === 'string' || content instanceof Buffer) {\n const readable = new Readable();\n readable.push(typeof content === 'string' ? Buffer.from(content) : content);\n readable.push(null);\n stream = readable;\n } else if (typeof content === 'object' && !(content instanceof Stream)) {\n const readable = new Readable();\n readable.push(Buffer.from(JSON.stringify(content)));\n readable.push(null);\n stream = readable;\n } else if (content instanceof Stream) {\n stream = content;\n } else {\n throw new Error('Unsupported content type');\n }\n\n await client.uploadFrom(stream as Readable, path);\n return true;\n } finally {\n client.close();\n }\n }\n\n async getJson(path: string): Promise<object> {\n const data = await this.getString(path);\n return JSON.parse(data);\n }\n\n async getString(path: string): Promise<string> {\n const buffer = await this.getBuffer(path);\n return buffer.toString('utf-8');\n }\n\n async getBuffer(path: string): Promise<Buffer> {\n const client = await this.getClient();\n try {\n const chunks: Buffer[] = [];\n const writable = new PassThrough();\n\n writable.on('data', (chunk) => {\n chunks.push(Buffer.isBuffer(chunk) ? chunk : Buffer.from(chunk));\n });\n\n await client.downloadTo(writable, path);\n\n return Buffer.concat(chunks);\n } finally {\n client.close();\n }\n }\n\n async getStream(path: string): Promise<ReadStream> {\n const client = await this.getClient();\n const passThrough = new PassThrough();\n\n // Download to stream and close client when done\n client\n .downloadTo(passThrough, path)\n .then(() => client.close())\n .catch((error) => {\n client.close();\n passThrough.destroy(error);\n });\n\n // Ensure client is closed when stream is destroyed\n passThrough.on('close', () => {\n try {\n client.close();\n } catch {\n // Ignore errors if already closed\n }\n });\n\n return passThrough as unknown as ReadStream;\n }\n\n async delete(path: string): Promise<boolean> {\n const client = await this.getClient();\n try {\n await client.remove(path);\n return true;\n } finally {\n client.close();\n }\n }\n\n async metadata(path: string): Promise<Metadata> {\n const client = await this.getClient();\n try {\n const size = await client.size(path);\n const lastMod = await client.lastMod(path);\n\n return {\n size: size,\n mimeType: mime.lookup(path) || 'unknown',\n lastModifiedDate: lastMod?.toISOString() || new Date(0).toISOString(),\n };\n } finally {\n client.close();\n }\n }\n}\n","import SFTPClient from 'ssh2-sftp-client';\nimport { Metadata, SFTPConfig } from '../types.mjs';\nimport { StorageProviderInterface } from '../StorageProviderInterface.mjs';\nimport { ReadStream } from 'fs';\nimport Stream, { Readable, PassThrough } from 'stream';\nimport * as mime from 'mime-types';\n\nexport class SFTPStorageProvider implements StorageProviderInterface {\n constructor(private config: SFTPConfig) {}\n\n private async getClient(): Promise<SFTPClient> {\n const client = new SFTPClient();\n await client.connect({\n host: this.config.host,\n port: this.config.port || 22,\n username: this.config.username,\n password: this.config.password,\n privateKey: this.config.privateKey,\n passphrase: this.config.passphrase,\n });\n return client;\n }\n\n async exists(path: string): Promise<boolean> {\n const client = await this.getClient();\n try {\n const result = await client.exists(path);\n return result !== false;\n } catch (error) {\n return false;\n } finally {\n await client.end();\n }\n }\n\n async put(path: string, content: string | object | Stream | Buffer): Promise<boolean> {\n const client = await this.getClient();\n try {\n let data: string | Buffer | Readable;\n if (typeof content === 'string') {\n data = content;\n } else if (content instanceof Buffer) {\n data = content;\n } else if (typeof content === 'object' && !(content instanceof Stream)) {\n data = Buffer.from(JSON.stringify(content));\n } else if (content instanceof Stream) {\n data = content as Readable;\n } else {\n throw new Error('Unsupported content type');\n }\n\n await client.put(data, path);\n return true;\n } finally {\n await client.end();\n }\n }\n\n async getJson(path: string): Promise<object> {\n const data = await this.getString(path);\n return JSON.parse(data);\n }\n\n async getString(path: string): Promise<string> {\n const buffer = await this.getBuffer(path);\n return buffer.toString('utf-8');\n }\n\n async getBuffer(path: string): Promise<Buffer> {\n const client = await this.getClient();\n try {\n const buffer = await client.get(path);\n return buffer as Buffer;\n } finally {\n await client.end();\n }\n }\n\n async getStream(path: string): Promise<ReadStream> {\n const client = await this.getClient();\n const passThrough = new PassThrough();\n\n // Get the file as a stream and close client when done\n client\n .get(path)\n .then((data) => {\n if (data instanceof Buffer) {\n const readable = new Readable();\n readable.push(data);\n readable.push(null);\n readable.pipe(passThrough);\n } else if (data instanceof Stream) {\n (data as Stream).pipe(passThrough);\n }\n return client.end();\n })\n .catch((error) => {\n client.end().catch(() => {\n // Ignore errors when closing client during error handling\n });\n passThrough.destroy(error);\n });\n\n // Ensure client is closed when stream is destroyed\n passThrough.on('close', () => {\n client.end().catch(() => {\n // Ignore errors if already closed\n });\n });\n\n return passThrough as unknown as ReadStream;\n }\n\n async delete(path: string): Promise<boolean> {\n const client = await this.getClient();\n try {\n await client.delete(path);\n return true;\n } finally {\n await client.end();\n }\n }\n\n async metadata(path: string): Promise<Metadata> {\n const client = await this.getClient();\n try {\n const stats = await client.stat(path);\n\n return {\n size: stats.size || 0,\n mimeType: mime.lookup(path) || 'unknown',\n lastModifiedDate: new Date((stats.modifyTime || 0) * 1000).toISOString(),\n };\n } finally {\n await client.end();\n }\n }\n}\n","import { FlexibleFactory } from '@devbro/neko-helper';\nimport { StorageProviderInterface } from './StorageProviderInterface.mjs';\n\nexport class StorageProviderFactory {\n static instance: FlexibleFactory<StorageProviderInterface> =\n new FlexibleFactory<StorageProviderInterface>();\n\n static register(key: string, factory: (...args: any[]) => StorageProviderInterface): void {\n StorageProviderFactory.instance.register(key, factory);\n }\n\n static create(key: string, ...args: any[]): StorageProviderInterface {\n return StorageProviderFactory.instance.create(key, ...args);\n }\n}\n"],"mappings":"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","names":["path","path","Stream","import_stream","path","Stream","import_stream","mime","GCPStorage","path","Stream","import_stream","mime","path","Stream","import_stream","mime","FTPClient","path","Stream","import_stream","mime","SFTPClient","path","Stream"]}
package/dist/index.mjs CHANGED
@@ -2,6 +2,10 @@ export * from "./types.mjs";
2
2
  export * from "./Storage.mjs";
3
3
  export * from "./providers/AWSS3StorageProvider.mjs";
4
4
  export * from "./providers/LocalStorageProvider.mjs";
5
+ export * from "./providers/GCPStorageProvider.mjs";
6
+ export * from "./providers/AzureBlobStorageProvider.mjs";
7
+ export * from "./providers/FTPStorageProvider.mjs";
8
+ export * from "./providers/SFTPStorageProvider.mjs";
5
9
  export * from "./StorageProviderFactory.mjs";
6
10
  export * from "./StorageProviderInterface.mjs";
7
11
  //# sourceMappingURL=index.mjs.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/index.ts"],"sourcesContent":["export * from './types.mjs';\nexport * from './Storage.mjs';\nexport * from './providers/AWSS3StorageProvider.mjs';\nexport * from './providers/LocalStorageProvider.mjs';\nexport * from './StorageProviderFactory.mjs';\nexport * from './StorageProviderInterface.mjs';"],"mappings":"AAAA,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;","names":[]}
1
+ {"version":3,"sources":["../src/index.ts"],"sourcesContent":["export * from './types.mjs';\nexport * from './Storage.mjs';\nexport * from './providers/AWSS3StorageProvider.mjs';\nexport * from './providers/LocalStorageProvider.mjs';\nexport * from './providers/GCPStorageProvider.mjs';\nexport * from './providers/AzureBlobStorageProvider.mjs';\nexport * from './providers/FTPStorageProvider.mjs';\nexport * from './providers/SFTPStorageProvider.mjs';\nexport * from './StorageProviderFactory.mjs';\nexport * from './StorageProviderInterface.mjs';\n"],"mappings":"AAAA,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;","names":[]}
@@ -1,13 +1,14 @@
1
- import { StorageConfig, Metadata } from '../types.mjs';
1
+ import { S3ClientConfig, Metadata } from '../types.mjs';
2
2
  import { ReadStream } from 'fs';
3
3
  import Stream from 'stream';
4
4
  import { StorageProviderInterface } from '../StorageProviderInterface.mjs';
5
5
  import '@aws-sdk/client-s3';
6
+ import '@google-cloud/storage';
6
7
 
7
8
  declare class AWSS3StorageProvider implements StorageProviderInterface {
8
- protected config: StorageConfig;
9
+ protected config: S3ClientConfig;
9
10
  private s3;
10
- constructor(config: StorageConfig);
11
+ constructor(config: S3ClientConfig);
11
12
  exists(path: string): Promise<boolean>;
12
13
  put(path: string, content: string | object | Stream | Buffer): Promise<boolean>;
13
14
  getJson(path: string): Promise<object>;
@@ -11,7 +11,7 @@ import Stream from "stream";
11
11
  class AWSS3StorageProvider {
12
12
  constructor(config) {
13
13
  this.config = config;
14
- this.s3 = new S3Client(this.config?.s3Config || {});
14
+ this.s3 = new S3Client(this.config);
15
15
  }
16
16
  static {
17
17
  __name(this, "AWSS3StorageProvider");
@@ -19,7 +19,7 @@ class AWSS3StorageProvider {
19
19
  s3;
20
20
  async exists(path) {
21
21
  try {
22
- await this.s3.send(new HeadObjectCommand({ Bucket: this.config?.bucket, Key: path }));
22
+ await this.s3.send(new HeadObjectCommand({ Bucket: this.config.bucket, Key: path }));
23
23
  return true;
24
24
  } catch (error) {
25
25
  if (error.name === "NotFound") {
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/providers/AWSS3StorageProvider.mts"],"sourcesContent":["import { Metadata, StorageConfig } from '../types.mjs';\nimport { Storage } from '../Storage.mjs';\nimport {\n S3Client,\n HeadObjectCommand,\n PutObjectCommand,\n GetObjectCommand,\n DeleteObjectCommand,\n HeadObjectOutput,\n} from '@aws-sdk/client-s3';\nimport { ReadStream } from 'fs';\nimport Stream, { Readable } from 'stream';\nimport { StorageProviderInterface } from '../StorageProviderInterface.mjs';\n\nexport class AWSS3StorageProvider implements StorageProviderInterface {\n private s3: S3Client;\n\n constructor(protected config: StorageConfig) {\n this.s3 = new S3Client(this.config?.s3Config || {});\n }\n\n async exists(path: string): Promise<boolean> {\n try {\n await this.s3.send(new HeadObjectCommand({ Bucket: this.config?.bucket, Key: path }));\n return true;\n } catch (error: any) {\n if (error.name === 'NotFound') {\n return false;\n }\n throw error;\n }\n }\n\n async put(path: string, content: string | object | Stream | Buffer): Promise<boolean> {\n let body: any;\n if (typeof content === 'string' || content instanceof Buffer) {\n body = content;\n } else if (typeof content === 'object' && !(content instanceof Stream)) {\n body = JSON.stringify(content);\n } else if (content instanceof Stream) {\n body = content;\n } else {\n throw new Error('Unsupported content type');\n }\n\n await this.s3.send(\n new PutObjectCommand({\n Bucket: this.config.bucket,\n Key: path,\n Body: body,\n })\n );\n\n return true;\n }\n\n async getJson(path: string): Promise<object> {\n const data = await this.s3.send(\n new GetObjectCommand({ Bucket: this.config.bucket, Key: path })\n );\n const body = await this.streamToString(data.Body as Stream);\n return JSON.parse(body);\n }\n\n async getString(path: string): Promise<string> {\n const data = await this.s3.send(\n new GetObjectCommand({ Bucket: this.config.bucket, Key: path })\n );\n return await this.streamToString(data.Body as Stream);\n }\n\n async delete(path: string): Promise<boolean> {\n await this.s3.send(new DeleteObjectCommand({ Bucket: this.config.bucket, Key: path }));\n return true;\n }\n\n private async streamToString(stream: Stream): Promise<string> {\n return new Promise((resolve, reject) => {\n const chunks: Uint8Array[] = [];\n stream.on('data', (chunk) => chunks.push(chunk));\n stream.on('end', () => resolve(Buffer.concat(chunks).toString('utf-8')));\n stream.on('error', reject);\n });\n }\n\n async getBuffer(path: string): Promise<Buffer> {\n const data = await this.s3.send(\n new GetObjectCommand({ Bucket: this.config.bucket, Key: path })\n );\n const chunks: Uint8Array[] = [];\n const stream = data.Body as Readable;\n\n return new Promise((resolve, reject) => {\n stream.on('data', (chunk) => chunks.push(chunk));\n stream.on('end', () => resolve(Buffer.concat(chunks)));\n stream.on('error', reject);\n });\n }\n\n async getStream(path: string): Promise<ReadStream> {\n const data = await this.s3.send(\n new GetObjectCommand({ Bucket: this.config.bucket, Key: path })\n );\n return data.Body as unknown as ReadStream;\n }\n\n async metadata(path: string): Promise<Metadata> {\n const metadata = await this.s3.send(\n new HeadObjectCommand({ Bucket: this.config.bucket, Key: path })\n );\n return {\n size: metadata.ContentLength || 0,\n mimeType: metadata.ContentType || 'unknown',\n lastModifiedDate: (metadata.LastModified || new Date(0)).toISOString(),\n };\n }\n}\n"],"mappings":"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","names":[]}
1
+ {"version":3,"sources":["../../src/providers/AWSS3StorageProvider.mts"],"sourcesContent":["import { Metadata, S3ClientConfig } from '../types.mjs';\nimport {\n S3Client,\n HeadObjectCommand,\n PutObjectCommand,\n GetObjectCommand,\n DeleteObjectCommand,\n} from '@aws-sdk/client-s3';\nimport { ReadStream } from 'fs';\nimport Stream, { Readable } from 'stream';\nimport { StorageProviderInterface } from '../StorageProviderInterface.mjs';\n\nexport class AWSS3StorageProvider implements StorageProviderInterface {\n private s3: S3Client;\n\n constructor(protected config: S3ClientConfig) {\n this.s3 = new S3Client(this.config);\n }\n\n async exists(path: string): Promise<boolean> {\n try {\n await this.s3.send(new HeadObjectCommand({ Bucket: this.config.bucket, Key: path }));\n return true;\n } catch (error: any) {\n if (error.name === 'NotFound') {\n return false;\n }\n throw error;\n }\n }\n\n async put(path: string, content: string | object | Stream | Buffer): Promise<boolean> {\n let body: any;\n if (typeof content === 'string' || content instanceof Buffer) {\n body = content;\n } else if (typeof content === 'object' && !(content instanceof Stream)) {\n body = JSON.stringify(content);\n } else if (content instanceof Stream) {\n body = content;\n } else {\n throw new Error('Unsupported content type');\n }\n\n await this.s3.send(\n new PutObjectCommand({\n Bucket: this.config.bucket,\n Key: path,\n Body: body,\n })\n );\n\n return true;\n }\n\n async getJson(path: string): Promise<object> {\n const data = await this.s3.send(\n new GetObjectCommand({ Bucket: this.config.bucket, Key: path })\n );\n const body = await this.streamToString(data.Body as Stream);\n return JSON.parse(body);\n }\n\n async getString(path: string): Promise<string> {\n const data = await this.s3.send(\n new GetObjectCommand({ Bucket: this.config.bucket, Key: path })\n );\n return await this.streamToString(data.Body as Stream);\n }\n\n async delete(path: string): Promise<boolean> {\n await this.s3.send(new DeleteObjectCommand({ Bucket: this.config.bucket, Key: path }));\n return true;\n }\n\n private async streamToString(stream: Stream): Promise<string> {\n return new Promise((resolve, reject) => {\n const chunks: Uint8Array[] = [];\n stream.on('data', (chunk) => chunks.push(chunk));\n stream.on('end', () => resolve(Buffer.concat(chunks).toString('utf-8')));\n stream.on('error', reject);\n });\n }\n\n async getBuffer(path: string): Promise<Buffer> {\n const data = await this.s3.send(\n new GetObjectCommand({ Bucket: this.config.bucket, Key: path })\n );\n const chunks: Uint8Array[] = [];\n const stream = data.Body as Readable;\n\n return new Promise((resolve, reject) => {\n stream.on('data', (chunk) => chunks.push(chunk));\n stream.on('end', () => resolve(Buffer.concat(chunks)));\n stream.on('error', reject);\n });\n }\n\n async getStream(path: string): Promise<ReadStream> {\n const data = await this.s3.send(\n new GetObjectCommand({ Bucket: this.config.bucket, Key: path })\n );\n return data.Body as unknown as ReadStream;\n }\n\n async metadata(path: string): Promise<Metadata> {\n const metadata = await this.s3.send(\n new HeadObjectCommand({ Bucket: this.config.bucket, Key: path })\n );\n return {\n size: metadata.ContentLength || 0,\n mimeType: metadata.ContentType || 'unknown',\n lastModifiedDate: (metadata.LastModified || new Date(0)).toISOString(),\n };\n }\n}\n"],"mappings":"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","names":[]}
@@ -0,0 +1,23 @@
1
+ import { AzureStorageConfig, Metadata } from '../types.mjs';
2
+ import { StorageProviderInterface } from '../StorageProviderInterface.mjs';
3
+ import { ReadStream } from 'fs';
4
+ import Stream from 'stream';
5
+ import '@aws-sdk/client-s3';
6
+ import '@google-cloud/storage';
7
+
8
+ declare class AzureBlobStorageProvider implements StorageProviderInterface {
9
+ protected config: AzureStorageConfig;
10
+ private blobServiceClient;
11
+ constructor(config: AzureStorageConfig);
12
+ exists(path: string): Promise<boolean>;
13
+ put(path: string, content: string | object | Stream | Buffer): Promise<boolean>;
14
+ getJson(path: string): Promise<object>;
15
+ getString(path: string): Promise<string>;
16
+ getBuffer(path: string): Promise<Buffer>;
17
+ getStream(path: string): Promise<ReadStream>;
18
+ delete(path: string): Promise<boolean>;
19
+ metadata(path: string): Promise<Metadata>;
20
+ private streamToBuffer;
21
+ }
22
+
23
+ export { AzureBlobStorageProvider };
@@ -0,0 +1,116 @@
1
+ var __defProp = Object.defineProperty;
2
+ var __name = (target, value) => __defProp(target, "name", { value, configurable: true });
3
+ import { BlobServiceClient, StorageSharedKeyCredential } from "@azure/storage-blob";
4
+ import Stream from "stream";
5
+ import * as mime from "mime-types";
6
+ class AzureBlobStorageProvider {
7
+ constructor(config) {
8
+ this.config = config;
9
+ const { accountName, accountKey, sasToken } = config;
10
+ if (accountKey) {
11
+ const sharedKeyCredential = new StorageSharedKeyCredential(accountName, accountKey);
12
+ this.blobServiceClient = new BlobServiceClient(
13
+ `https://${accountName}.blob.core.windows.net`,
14
+ sharedKeyCredential
15
+ );
16
+ } else if (sasToken) {
17
+ this.blobServiceClient = new BlobServiceClient(
18
+ `https://${accountName}.blob.core.windows.net?${sasToken}`
19
+ );
20
+ } else {
21
+ throw new Error("Either accountKey or sasToken is required for Azure Blob Storage");
22
+ }
23
+ }
24
+ static {
25
+ __name(this, "AzureBlobStorageProvider");
26
+ }
27
+ blobServiceClient;
28
+ async exists(path) {
29
+ try {
30
+ const containerClient = this.blobServiceClient.getContainerClient(this.config.containerName);
31
+ const blobClient = containerClient.getBlobClient(path);
32
+ return await blobClient.exists();
33
+ } catch (error) {
34
+ return false;
35
+ }
36
+ }
37
+ async put(path, content) {
38
+ const containerClient = this.blobServiceClient.getContainerClient(this.config.containerName);
39
+ const blockBlobClient = containerClient.getBlockBlobClient(path);
40
+ let data;
41
+ if (typeof content === "string" || content instanceof Buffer) {
42
+ data = content;
43
+ } else if (typeof content === "object" && !(content instanceof Stream)) {
44
+ data = JSON.stringify(content);
45
+ } else if (content instanceof Stream) {
46
+ data = content;
47
+ } else {
48
+ throw new Error("Unsupported content type");
49
+ }
50
+ if (data instanceof Stream) {
51
+ await blockBlobClient.uploadStream(data);
52
+ } else {
53
+ const buffer = typeof data === "string" ? Buffer.from(data) : data;
54
+ await blockBlobClient.upload(buffer, buffer.length);
55
+ }
56
+ return true;
57
+ }
58
+ async getJson(path) {
59
+ const data = await this.getString(path);
60
+ return JSON.parse(data);
61
+ }
62
+ async getString(path) {
63
+ const buffer = await this.getBuffer(path);
64
+ return buffer.toString("utf-8");
65
+ }
66
+ async getBuffer(path) {
67
+ const containerClient = this.blobServiceClient.getContainerClient(this.config.containerName);
68
+ const blobClient = containerClient.getBlobClient(path);
69
+ const downloadResponse = await blobClient.download();
70
+ if (!downloadResponse.readableStreamBody) {
71
+ throw new Error("Failed to download blob");
72
+ }
73
+ return await this.streamToBuffer(downloadResponse.readableStreamBody);
74
+ }
75
+ async getStream(path) {
76
+ const containerClient = this.blobServiceClient.getContainerClient(this.config.containerName);
77
+ const blobClient = containerClient.getBlobClient(path);
78
+ const downloadResponse = await blobClient.download();
79
+ if (!downloadResponse.readableStreamBody) {
80
+ throw new Error("Failed to download blob");
81
+ }
82
+ return downloadResponse.readableStreamBody;
83
+ }
84
+ async delete(path) {
85
+ const containerClient = this.blobServiceClient.getContainerClient(this.config.containerName);
86
+ const blobClient = containerClient.getBlobClient(path);
87
+ await blobClient.delete();
88
+ return true;
89
+ }
90
+ async metadata(path) {
91
+ const containerClient = this.blobServiceClient.getContainerClient(this.config.containerName);
92
+ const blobClient = containerClient.getBlobClient(path);
93
+ const properties = await blobClient.getProperties();
94
+ return {
95
+ size: properties.contentLength || 0,
96
+ mimeType: properties.contentType || mime.lookup(path) || "unknown",
97
+ lastModifiedDate: properties.lastModified?.toISOString() || (/* @__PURE__ */ new Date(0)).toISOString()
98
+ };
99
+ }
100
+ async streamToBuffer(readableStream) {
101
+ return new Promise((resolve, reject) => {
102
+ const chunks = [];
103
+ readableStream.on("data", (chunk) => {
104
+ chunks.push(Buffer.isBuffer(chunk) ? chunk : Buffer.from(chunk));
105
+ });
106
+ readableStream.on("end", () => {
107
+ resolve(Buffer.concat(chunks));
108
+ });
109
+ readableStream.on("error", reject);
110
+ });
111
+ }
112
+ }
113
+ export {
114
+ AzureBlobStorageProvider
115
+ };
116
+ //# sourceMappingURL=AzureBlobStorageProvider.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/providers/AzureBlobStorageProvider.mts"],"sourcesContent":["import { BlobServiceClient, StorageSharedKeyCredential } from '@azure/storage-blob';\nimport { Metadata, AzureStorageConfig } from '../types.mjs';\nimport { StorageProviderInterface } from '../StorageProviderInterface.mjs';\nimport { ReadStream } from 'fs';\nimport Stream, { Readable } from 'stream';\nimport * as mime from 'mime-types';\n\nexport class AzureBlobStorageProvider implements StorageProviderInterface {\n private blobServiceClient: BlobServiceClient;\n\n constructor(protected config: AzureStorageConfig) {\n const { accountName, accountKey, sasToken } = config;\n\n if (accountKey) {\n const sharedKeyCredential = new StorageSharedKeyCredential(accountName, accountKey);\n this.blobServiceClient = new BlobServiceClient(\n `https://${accountName}.blob.core.windows.net`,\n sharedKeyCredential\n );\n } else if (sasToken) {\n this.blobServiceClient = new BlobServiceClient(\n `https://${accountName}.blob.core.windows.net?${sasToken}`\n );\n } else {\n throw new Error('Either accountKey or sasToken is required for Azure Blob Storage');\n }\n }\n\n async exists(path: string): Promise<boolean> {\n try {\n const containerClient = this.blobServiceClient.getContainerClient(this.config.containerName);\n const blobClient = containerClient.getBlobClient(path);\n return await blobClient.exists();\n } catch (error) {\n return false;\n }\n }\n\n async put(path: string, content: string | object | Stream | Buffer): Promise<boolean> {\n const containerClient = this.blobServiceClient.getContainerClient(this.config.containerName);\n const blockBlobClient = containerClient.getBlockBlobClient(path);\n\n let data: string | Buffer | Stream;\n if (typeof content === 'string' || content instanceof Buffer) {\n data = content;\n } else if (typeof content === 'object' && !(content instanceof Stream)) {\n data = JSON.stringify(content);\n } else if (content instanceof Stream) {\n data = content;\n } else {\n throw new Error('Unsupported content type');\n }\n\n if (data instanceof Stream) {\n await blockBlobClient.uploadStream(data as Readable);\n } else {\n const buffer = typeof data === 'string' ? Buffer.from(data) : data;\n await blockBlobClient.upload(buffer, buffer.length);\n }\n\n return true;\n }\n\n async getJson(path: string): Promise<object> {\n const data = await this.getString(path);\n return JSON.parse(data);\n }\n\n async getString(path: string): Promise<string> {\n const buffer = await this.getBuffer(path);\n return buffer.toString('utf-8');\n }\n\n async getBuffer(path: string): Promise<Buffer> {\n const containerClient = this.blobServiceClient.getContainerClient(this.config.containerName);\n const blobClient = containerClient.getBlobClient(path);\n const downloadResponse = await blobClient.download();\n\n if (!downloadResponse.readableStreamBody) {\n throw new Error('Failed to download blob');\n }\n\n return await this.streamToBuffer(downloadResponse.readableStreamBody);\n }\n\n async getStream(path: string): Promise<ReadStream> {\n const containerClient = this.blobServiceClient.getContainerClient(this.config.containerName);\n const blobClient = containerClient.getBlobClient(path);\n const downloadResponse = await blobClient.download();\n\n if (!downloadResponse.readableStreamBody) {\n throw new Error('Failed to download blob');\n }\n\n return downloadResponse.readableStreamBody as unknown as ReadStream;\n }\n\n async delete(path: string): Promise<boolean> {\n const containerClient = this.blobServiceClient.getContainerClient(this.config.containerName);\n const blobClient = containerClient.getBlobClient(path);\n await blobClient.delete();\n return true;\n }\n\n async metadata(path: string): Promise<Metadata> {\n const containerClient = this.blobServiceClient.getContainerClient(this.config.containerName);\n const blobClient = containerClient.getBlobClient(path);\n const properties = await blobClient.getProperties();\n\n return {\n size: properties.contentLength || 0,\n mimeType: properties.contentType || mime.lookup(path) || 'unknown',\n lastModifiedDate: properties.lastModified?.toISOString() || new Date(0).toISOString(),\n };\n }\n\n private async streamToBuffer(readableStream: NodeJS.ReadableStream): Promise<Buffer> {\n return new Promise((resolve, reject) => {\n const chunks: Buffer[] = [];\n readableStream.on('data', (chunk) => {\n chunks.push(Buffer.isBuffer(chunk) ? chunk : Buffer.from(chunk));\n });\n readableStream.on('end', () => {\n resolve(Buffer.concat(chunks));\n });\n readableStream.on('error', reject);\n });\n }\n}\n"],"mappings":"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","names":[]}
@@ -0,0 +1,22 @@
1
+ import { FTPConfig, Metadata } from '../types.mjs';
2
+ import { StorageProviderInterface } from '../StorageProviderInterface.mjs';
3
+ import { ReadStream } from 'fs';
4
+ import Stream from 'stream';
5
+ import '@aws-sdk/client-s3';
6
+ import '@google-cloud/storage';
7
+
8
+ declare class FTPStorageProvider implements StorageProviderInterface {
9
+ private config;
10
+ constructor(config: FTPConfig);
11
+ private getClient;
12
+ exists(path: string): Promise<boolean>;
13
+ put(path: string, content: string | object | Stream | Buffer): Promise<boolean>;
14
+ getJson(path: string): Promise<object>;
15
+ getString(path: string): Promise<string>;
16
+ getBuffer(path: string): Promise<Buffer>;
17
+ getStream(path: string): Promise<ReadStream>;
18
+ delete(path: string): Promise<boolean>;
19
+ metadata(path: string): Promise<Metadata>;
20
+ }
21
+
22
+ export { FTPStorageProvider };
@@ -0,0 +1,124 @@
1
+ var __defProp = Object.defineProperty;
2
+ var __name = (target, value) => __defProp(target, "name", { value, configurable: true });
3
+ import { Client as FTPClient } from "basic-ftp";
4
+ import Stream, { Readable, PassThrough } from "stream";
5
+ import * as mime from "mime-types";
6
+ class FTPStorageProvider {
7
+ constructor(config) {
8
+ this.config = config;
9
+ }
10
+ static {
11
+ __name(this, "FTPStorageProvider");
12
+ }
13
+ async getClient() {
14
+ const client = new FTPClient();
15
+ await client.access({
16
+ host: this.config.host,
17
+ port: this.config.port || 21,
18
+ user: this.config.user || "anonymous",
19
+ password: this.config.password || "",
20
+ secure: this.config.secure || false
21
+ });
22
+ return client;
23
+ }
24
+ async exists(path) {
25
+ const client = await this.getClient();
26
+ try {
27
+ await client.size(path);
28
+ return true;
29
+ } catch (error) {
30
+ return false;
31
+ } finally {
32
+ client.close();
33
+ }
34
+ }
35
+ async put(path, content) {
36
+ const client = await this.getClient();
37
+ try {
38
+ let stream;
39
+ if (typeof content === "string" || content instanceof Buffer) {
40
+ const readable = new Readable();
41
+ readable.push(typeof content === "string" ? Buffer.from(content) : content);
42
+ readable.push(null);
43
+ stream = readable;
44
+ } else if (typeof content === "object" && !(content instanceof Stream)) {
45
+ const readable = new Readable();
46
+ readable.push(Buffer.from(JSON.stringify(content)));
47
+ readable.push(null);
48
+ stream = readable;
49
+ } else if (content instanceof Stream) {
50
+ stream = content;
51
+ } else {
52
+ throw new Error("Unsupported content type");
53
+ }
54
+ await client.uploadFrom(stream, path);
55
+ return true;
56
+ } finally {
57
+ client.close();
58
+ }
59
+ }
60
+ async getJson(path) {
61
+ const data = await this.getString(path);
62
+ return JSON.parse(data);
63
+ }
64
+ async getString(path) {
65
+ const buffer = await this.getBuffer(path);
66
+ return buffer.toString("utf-8");
67
+ }
68
+ async getBuffer(path) {
69
+ const client = await this.getClient();
70
+ try {
71
+ const chunks = [];
72
+ const writable = new PassThrough();
73
+ writable.on("data", (chunk) => {
74
+ chunks.push(Buffer.isBuffer(chunk) ? chunk : Buffer.from(chunk));
75
+ });
76
+ await client.downloadTo(writable, path);
77
+ return Buffer.concat(chunks);
78
+ } finally {
79
+ client.close();
80
+ }
81
+ }
82
+ async getStream(path) {
83
+ const client = await this.getClient();
84
+ const passThrough = new PassThrough();
85
+ client.downloadTo(passThrough, path).then(() => client.close()).catch((error) => {
86
+ client.close();
87
+ passThrough.destroy(error);
88
+ });
89
+ passThrough.on("close", () => {
90
+ try {
91
+ client.close();
92
+ } catch {
93
+ }
94
+ });
95
+ return passThrough;
96
+ }
97
+ async delete(path) {
98
+ const client = await this.getClient();
99
+ try {
100
+ await client.remove(path);
101
+ return true;
102
+ } finally {
103
+ client.close();
104
+ }
105
+ }
106
+ async metadata(path) {
107
+ const client = await this.getClient();
108
+ try {
109
+ const size = await client.size(path);
110
+ const lastMod = await client.lastMod(path);
111
+ return {
112
+ size,
113
+ mimeType: mime.lookup(path) || "unknown",
114
+ lastModifiedDate: lastMod?.toISOString() || (/* @__PURE__ */ new Date(0)).toISOString()
115
+ };
116
+ } finally {
117
+ client.close();
118
+ }
119
+ }
120
+ }
121
+ export {
122
+ FTPStorageProvider
123
+ };
124
+ //# sourceMappingURL=FTPStorageProvider.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/providers/FTPStorageProvider.mts"],"sourcesContent":["import { Client as FTPClient } from 'basic-ftp';\nimport { Metadata, FTPConfig } from '../types.mjs';\nimport { StorageProviderInterface } from '../StorageProviderInterface.mjs';\nimport { ReadStream } from 'fs';\nimport Stream, { Readable, PassThrough } from 'stream';\nimport * as mime from 'mime-types';\n\nexport class FTPStorageProvider implements StorageProviderInterface {\n constructor(private config: FTPConfig) {}\n\n private async getClient(): Promise<FTPClient> {\n const client = new FTPClient();\n await client.access({\n host: this.config.host,\n port: this.config.port || 21,\n user: this.config.user || 'anonymous',\n password: this.config.password || '',\n secure: this.config.secure || false,\n });\n return client;\n }\n\n async exists(path: string): Promise<boolean> {\n const client = await this.getClient();\n try {\n await client.size(path);\n return true;\n } catch (error) {\n return false;\n } finally {\n client.close();\n }\n }\n\n async put(path: string, content: string | object | Stream | Buffer): Promise<boolean> {\n const client = await this.getClient();\n try {\n let stream: Stream;\n if (typeof content === 'string' || content instanceof Buffer) {\n const readable = new Readable();\n readable.push(typeof content === 'string' ? Buffer.from(content) : content);\n readable.push(null);\n stream = readable;\n } else if (typeof content === 'object' && !(content instanceof Stream)) {\n const readable = new Readable();\n readable.push(Buffer.from(JSON.stringify(content)));\n readable.push(null);\n stream = readable;\n } else if (content instanceof Stream) {\n stream = content;\n } else {\n throw new Error('Unsupported content type');\n }\n\n await client.uploadFrom(stream as Readable, path);\n return true;\n } finally {\n client.close();\n }\n }\n\n async getJson(path: string): Promise<object> {\n const data = await this.getString(path);\n return JSON.parse(data);\n }\n\n async getString(path: string): Promise<string> {\n const buffer = await this.getBuffer(path);\n return buffer.toString('utf-8');\n }\n\n async getBuffer(path: string): Promise<Buffer> {\n const client = await this.getClient();\n try {\n const chunks: Buffer[] = [];\n const writable = new PassThrough();\n\n writable.on('data', (chunk) => {\n chunks.push(Buffer.isBuffer(chunk) ? chunk : Buffer.from(chunk));\n });\n\n await client.downloadTo(writable, path);\n\n return Buffer.concat(chunks);\n } finally {\n client.close();\n }\n }\n\n async getStream(path: string): Promise<ReadStream> {\n const client = await this.getClient();\n const passThrough = new PassThrough();\n\n // Download to stream and close client when done\n client\n .downloadTo(passThrough, path)\n .then(() => client.close())\n .catch((error) => {\n client.close();\n passThrough.destroy(error);\n });\n\n // Ensure client is closed when stream is destroyed\n passThrough.on('close', () => {\n try {\n client.close();\n } catch {\n // Ignore errors if already closed\n }\n });\n\n return passThrough as unknown as ReadStream;\n }\n\n async delete(path: string): Promise<boolean> {\n const client = await this.getClient();\n try {\n await client.remove(path);\n return true;\n } finally {\n client.close();\n }\n }\n\n async metadata(path: string): Promise<Metadata> {\n const client = await this.getClient();\n try {\n const size = await client.size(path);\n const lastMod = await client.lastMod(path);\n\n return {\n size: size,\n mimeType: mime.lookup(path) || 'unknown',\n lastModifiedDate: lastMod?.toISOString() || new Date(0).toISOString(),\n };\n } finally {\n client.close();\n }\n }\n}\n"],"mappings":"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","names":[]}
@@ -0,0 +1,22 @@
1
+ import { GCPStorageConfig, Metadata } from '../types.mjs';
2
+ import { StorageProviderInterface } from '../StorageProviderInterface.mjs';
3
+ import { ReadStream } from 'fs';
4
+ import Stream from 'stream';
5
+ import '@aws-sdk/client-s3';
6
+ import '@google-cloud/storage';
7
+
8
+ declare class GCPStorageProvider implements StorageProviderInterface {
9
+ protected config: GCPStorageConfig;
10
+ private storage;
11
+ constructor(config: GCPStorageConfig);
12
+ exists(path: string): Promise<boolean>;
13
+ put(path: string, content: string | object | Stream | Buffer): Promise<boolean>;
14
+ getJson(path: string): Promise<object>;
15
+ getString(path: string): Promise<string>;
16
+ getBuffer(path: string): Promise<Buffer>;
17
+ getStream(path: string): Promise<ReadStream>;
18
+ delete(path: string): Promise<boolean>;
19
+ metadata(path: string): Promise<Metadata>;
20
+ }
21
+
22
+ export { GCPStorageProvider };