UNPKG

@jsvfs/adapter-minio-s3

Version:

An adapter for Amazon S3 compatible storage using the MinIO JS library.

60 lines (49 loc) 1.56 kB
import { Readable } from 'stream' import { PathParseResult } from './types' /** Parses a given path into a bucket and object name. */ export function parse (path: string, root: string): PathParseResult { if (root === '/') { const parts = path.split('/') if (parts[0] === '') { return { bucketName: parts[1], objectName: parts.slice(2).join('/') } } return { bucketName: parts[0], objectName: parts.slice(1).join('/') } } return { bucketName: root, objectName: path[0] === '/' ? path.substring(1) : path } } /** Convert a Readable stream to an Async Generator. Based on https://www.derpturkey.com/nodejs-async-generators-for-streaming */ export async function * streamToAsyncGenerator<T = any> (reader: Readable, chunkSize?: number): AsyncGenerator<T> { let readableEnded = false const signalEnd = new Promise<void>(resolve => { reader.once('end', () => { // Manage readableEnded, because not all implementors of Readable set this to true on end. readableEnded = true resolve() }) }) while (!readableEnded) { while (reader.readable) { const val: T = typeof chunkSize === 'number' ? reader.read(chunkSize) ?? reader.read() : reader.read() if (typeof val !== 'undefined' && val !== null) { yield val } else { break } } const signalReadable = new Promise<void>(resolve => { reader.once('readable', resolve) }) await Promise.race([signalEnd, signalReadable]) } }