diff options
author | Nayeem Rahman <nayeemrmn99@gmail.com> | 2020-05-09 13:34:47 +0100 |
---|---|---|
committer | GitHub <noreply@github.com> | 2020-05-09 08:34:47 -0400 |
commit | f184332c09c851faac50f598d29ebe4426e05464 (patch) | |
tree | 2659aba63702537fcde1bb64ddeafea1e5863f3e /std/io/_iotest.ts | |
parent | 2b02535028f868ea8dfc471c4921a237747ccd4a (diff) |
BREAKING(std): reorganization (#5087)
* Prepend underscores to private modules
* Remove collectUint8Arrays() It would be a misuse of Deno.iter()'s result.
* Move std/_util/async.ts to std/async
* Move std/util/sha*.ts to std/hash
Diffstat (limited to 'std/io/_iotest.ts')
-rw-r--r-- | std/io/_iotest.ts | 53 |
1 files changed, 53 insertions, 0 deletions
diff --git a/std/io/_iotest.ts b/std/io/_iotest.ts new file mode 100644 index 000000000..a309fb5e1 --- /dev/null +++ b/std/io/_iotest.ts @@ -0,0 +1,53 @@ +// Ported to Deno from +// Copyright 2009 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. +type Reader = Deno.Reader; + +/** OneByteReader returns a Reader that implements + * each non-empty Read by reading one byte from r. + */ +export class OneByteReader implements Reader { + constructor(readonly r: Reader) {} + + read(p: Uint8Array): Promise<number | null> { + if (p.byteLength === 0) { + return Promise.resolve(0); + } + if (!(p instanceof Uint8Array)) { + throw Error("expected Uint8Array"); + } + return Promise.resolve(this.r.read(p.subarray(0, 1))); + } +} + +/** HalfReader returns a Reader that implements Read + * by reading half as many requested bytes from r. + */ +export class HalfReader implements Reader { + constructor(readonly r: Reader) {} + + read(p: Uint8Array): Promise<number | null> { + if (!(p instanceof Uint8Array)) { + throw Error("expected Uint8Array"); + } + const half = Math.floor((p.byteLength + 1) / 2); + return Promise.resolve(this.r.read(p.subarray(0, half))); + } +} + +/** TimeoutReader returns `Deno.errors.TimedOut` on the second read + * with no data. Subsequent calls to read succeed. + */ +export class TimeoutReader implements Reader { + count = 0; + constructor(readonly r: Reader) {} + + read(p: Uint8Array): Promise<number | null> { + this.count++; + if (this.count === 2) { + throw new Deno.errors.TimedOut(); + } + return Promise.resolve(this.r.read(p)); + } +} |