@jsvfs/adapter-minio-s3
Version:
An adapter for Amazon S3 compatible storage using the MinIO JS library.
60 lines (49 loc) • 1.56 kB
text/typescript
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])
}
}