summaryrefslogtreecommitdiff
path: root/std/io/_iotest.ts
diff options
context:
space:
mode:
authorNayeem Rahman <nayeemrmn99@gmail.com>2020-05-09 13:34:47 +0100
committerGitHub <noreply@github.com>2020-05-09 08:34:47 -0400
commitf184332c09c851faac50f598d29ebe4426e05464 (patch)
tree2659aba63702537fcde1bb64ddeafea1e5863f3e /std/io/_iotest.ts
parent2b02535028f868ea8dfc471c4921a237747ccd4a (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.ts53
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));
+ }
+}