chore(xo-server/ag2s): use async-iterator-to-stream instead
This commit is contained in:
parent
4cfe3ec06e
commit
20d5047b55
@ -38,6 +38,7 @@
|
|||||||
"ajv": "^6.1.1",
|
"ajv": "^6.1.1",
|
||||||
"app-conf": "^0.5.0",
|
"app-conf": "^0.5.0",
|
||||||
"archiver": "^2.1.0",
|
"archiver": "^2.1.0",
|
||||||
|
"async-iterator-to-stream": "^1.0.1",
|
||||||
"base64url": "^2.0.0",
|
"base64url": "^2.0.0",
|
||||||
"bind-property-descriptor": "^1.0.0",
|
"bind-property-descriptor": "^1.0.0",
|
||||||
"blocked": "^1.2.1",
|
"blocked": "^1.2.1",
|
||||||
|
@ -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
|
|
||||||
}
|
|
@ -1,6 +1,7 @@
|
|||||||
// TODO: remove once completely merged in vhd.js
|
// TODO: remove once completely merged in vhd.js
|
||||||
|
|
||||||
import assert from 'assert'
|
import assert from 'assert'
|
||||||
|
import asyncIteratorToStream from 'async-iterator-to-stream'
|
||||||
import concurrency from 'limit-concurrency-decorator'
|
import concurrency from 'limit-concurrency-decorator'
|
||||||
import fu from '@nraynaud/struct-fu'
|
import fu from '@nraynaud/struct-fu'
|
||||||
import isEqual from 'lodash/isEqual'
|
import isEqual from 'lodash/isEqual'
|
||||||
@ -9,7 +10,6 @@ import { fromEvent } from 'promise-toolbox'
|
|||||||
|
|
||||||
import type RemoteHandler from './remote-handlers/abstract'
|
import type RemoteHandler from './remote-handlers/abstract'
|
||||||
import constantStream from './constant-stream'
|
import constantStream from './constant-stream'
|
||||||
import { createReadable } from './ag2s'
|
|
||||||
import { noop, resolveRelativeFromFile, streamToBuffer } from './utils'
|
import { noop, resolveRelativeFromFile, streamToBuffer } from './utils'
|
||||||
|
|
||||||
const VHD_UTIL_DEBUG = 0
|
const VHD_UTIL_DEBUG = 0
|
||||||
@ -769,8 +769,7 @@ export async function chainVhd (
|
|||||||
return false
|
return false
|
||||||
}
|
}
|
||||||
|
|
||||||
export const createReadStream = (handler, path) =>
|
export const createReadStream = asyncIteratorToStream(function * (handler, path) {
|
||||||
createReadable(function * () {
|
|
||||||
const fds = []
|
const fds = []
|
||||||
|
|
||||||
try {
|
try {
|
||||||
@ -806,8 +805,7 @@ export const createReadStream = (handler, path) =>
|
|||||||
}
|
}
|
||||||
|
|
||||||
const bat = Buffer.allocUnsafe(
|
const bat = Buffer.allocUnsafe(
|
||||||
Math.ceil(4 * header.maxTableEntries / VHD_SECTOR_SIZE) *
|
Math.ceil(4 * header.maxTableEntries / VHD_SECTOR_SIZE) * VHD_SECTOR_SIZE
|
||||||
VHD_SECTOR_SIZE
|
|
||||||
)
|
)
|
||||||
let footer = {
|
let footer = {
|
||||||
...vhd.footer,
|
...vhd.footer,
|
||||||
@ -900,7 +898,7 @@ export const createReadStream = (handler, path) =>
|
|||||||
})
|
})
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
|
|
||||||
export async function readVhdMetadata (handler: RemoteHandler, path: string) {
|
export async function readVhdMetadata (handler: RemoteHandler, path: string) {
|
||||||
const vhd = new Vhd(handler, path)
|
const vhd = new Vhd(handler, path)
|
||||||
|
@ -611,7 +611,7 @@
|
|||||||
pirates "^3.0.1"
|
pirates "^3.0.1"
|
||||||
source-map-support "^0.4.2"
|
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"
|
version "7.0.0-beta.42"
|
||||||
resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.0.0-beta.42.tgz#352e40c92e0460d3e82f49bd7e79f6cda76f919f"
|
resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.0.0-beta.42.tgz#352e40c92e0460d3e82f49bd7e79f6cda76f919f"
|
||||||
dependencies:
|
dependencies:
|
||||||
@ -1252,6 +1252,13 @@ async-foreach@^0.1.3:
|
|||||||
version "0.1.3"
|
version "0.1.3"
|
||||||
resolved "https://registry.yarnpkg.com/async-foreach/-/async-foreach-0.1.3.tgz#36121f845c0578172de419a97dbeb1d16ec34542"
|
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:
|
async-limiter@~1.0.0:
|
||||||
version "1.0.0"
|
version "1.0.0"
|
||||||
resolved "https://registry.yarnpkg.com/async-limiter/-/async-limiter-1.0.0.tgz#78faed8c3d074ab81f22b4e985d79e8738f720f8"
|
resolved "https://registry.yarnpkg.com/async-limiter/-/async-limiter-1.0.0.tgz#78faed8c3d074ab81f22b4e985d79e8738f720f8"
|
||||||
|
Loading…
Reference in New Issue
Block a user