chore(xo-server/ag2s): use async-iterator-to-stream instead

This commit is contained in:
Julien Fontanet 2018-03-26 16:26:12 +02:00
parent 4cfe3ec06e
commit 20d5047b55
4 changed files with 134 additions and 196 deletions

View File

@ -38,6 +38,7 @@
"ajv": "^6.1.1",
"app-conf": "^0.5.0",
"archiver": "^2.1.0",
"async-iterator-to-stream": "^1.0.1",
"base64url": "^2.0.0",
"bind-property-descriptor": "^1.0.0",
"blocked": "^1.2.1",

View File

@ -1,68 +0,0 @@
import { Readable } from 'stream'
// return the next value of the iterator but if it is a promise, resolve it and
// reinject it
//
// this enables the use of a simple generator instead of an async generator
// (which are less widely supported)
const next = async (iterator, arg) => {
let cursor = iterator.next(arg)
if (typeof cursor.then === 'function') {
return cursor
}
let value
while (
!cursor.done &&
(value = cursor.value) != null &&
typeof value.then === 'function'
) {
let success = false
try {
value = await value
success = true
} catch (error) {
cursor = iterator.throw(error)
}
if (success) {
cursor = iterator.next(value)
}
}
return cursor
}
// Create a readable stream from a generator
//
// generator can be async or can yield promises to wait for them
export const createReadable = (generator, options) => {
const readable = new Readable(options)
readable._read = size => {
const iterator = generator(size)
readable._destroy = (error, cb) => {
iterator.throw(error)
cb(error)
}
let running = false
const read = (readable._read = async size => {
if (running) {
return
}
running = true
try {
let cursor
do {
cursor = await next(iterator, size)
if (cursor.done) {
return readable.push(null)
}
} while (readable.push(cursor.value))
} catch (error) {
readable.emit('error', error)
} finally {
running = false
}
})
return read(size)
}
return readable
}

View File

@ -1,6 +1,7 @@
// TODO: remove once completely merged in vhd.js
import assert from 'assert'
import asyncIteratorToStream from 'async-iterator-to-stream'
import concurrency from 'limit-concurrency-decorator'
import fu from '@nraynaud/struct-fu'
import isEqual from 'lodash/isEqual'
@ -9,7 +10,6 @@ import { fromEvent } from 'promise-toolbox'
import type RemoteHandler from './remote-handlers/abstract'
import constantStream from './constant-stream'
import { createReadable } from './ag2s'
import { noop, resolveRelativeFromFile, streamToBuffer } from './utils'
const VHD_UTIL_DEBUG = 0
@ -769,8 +769,7 @@ export async function chainVhd (
return false
}
export const createReadStream = (handler, path) =>
createReadable(function * () {
export const createReadStream = asyncIteratorToStream(function * (handler, path) {
const fds = []
try {
@ -806,8 +805,7 @@ export const createReadStream = (handler, path) =>
}
const bat = Buffer.allocUnsafe(
Math.ceil(4 * header.maxTableEntries / VHD_SECTOR_SIZE) *
VHD_SECTOR_SIZE
Math.ceil(4 * header.maxTableEntries / VHD_SECTOR_SIZE) * VHD_SECTOR_SIZE
)
let footer = {
...vhd.footer,
@ -900,7 +898,7 @@ export const createReadStream = (handler, path) =>
})
}
}
})
})
export async function readVhdMetadata (handler: RemoteHandler, path: string) {
const vhd = new Vhd(handler, path)

View File

@ -611,7 +611,7 @@
pirates "^3.0.1"
source-map-support "^0.4.2"
"@babel/runtime@^7.0.0-beta.39":
"@babel/runtime@^7.0.0-beta.39", "@babel/runtime@^7.0.0-beta.42":
version "7.0.0-beta.42"
resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.0.0-beta.42.tgz#352e40c92e0460d3e82f49bd7e79f6cda76f919f"
dependencies:
@ -1252,6 +1252,13 @@ async-foreach@^0.1.3:
version "0.1.3"
resolved "https://registry.yarnpkg.com/async-foreach/-/async-foreach-0.1.3.tgz#36121f845c0578172de419a97dbeb1d16ec34542"
async-iterator-to-stream@^1.0.1:
version "1.0.1"
resolved "https://registry.yarnpkg.com/async-iterator-to-stream/-/async-iterator-to-stream-1.0.1.tgz#e609c9102a17412772b9c94ffb77ddffb9b743b2"
dependencies:
"@babel/runtime" "^7.0.0-beta.42"
readable-stream "^2.3.5"
async-limiter@~1.0.0:
version "1.0.0"
resolved "https://registry.yarnpkg.com/async-limiter/-/async-limiter-1.0.0.tgz#78faed8c3d074ab81f22b4e985d79e8738f720f8"