aboutsummaryrefslogtreecommitdiff
path: root/src/bun.js/builtins/js/ConsoleObject.js
diff options
context:
space:
mode:
authorGravatar Jarred Sumner <709451+Jarred-Sumner@users.noreply.github.com> 2022-12-05 11:35:34 -0800
committerGravatar Jarred Sumner <709451+Jarred-Sumner@users.noreply.github.com> 2022-12-05 11:35:34 -0800
commit0ea8de40871052842f2e342b4c452f6746691487 (patch)
treea4e1028f90a801324966172e47b9b20533e4ad7a /src/bun.js/builtins/js/ConsoleObject.js
parent71293033474eea83c47b6c6948f991b1dc37ad22 (diff)
downloadbun-0ea8de40871052842f2e342b4c452f6746691487.tar.gz
bun-0ea8de40871052842f2e342b4c452f6746691487.tar.zst
bun-0ea8de40871052842f2e342b4c452f6746691487.zip
Make `console` an `AsyncIterable`
Diffstat (limited to 'src/bun.js/builtins/js/ConsoleObject.js')
-rw-r--r--src/bun.js/builtins/js/ConsoleObject.js115
1 files changed, 115 insertions, 0 deletions
diff --git a/src/bun.js/builtins/js/ConsoleObject.js b/src/bun.js/builtins/js/ConsoleObject.js
new file mode 100644
index 000000000..8601748c6
--- /dev/null
+++ b/src/bun.js/builtins/js/ConsoleObject.js
@@ -0,0 +1,115 @@
+/*
+ * Copyright 2022 Codeblog Corp. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY APPLE INC. ``AS IS'' AND ANY
+ * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+ * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+ * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+ * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
+ * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+@overriddenName="[Symbol.asyncIterator]"
+function asyncIterator() {
+ "use strict";
+
+ const Iterator = async function* ConsoleAsyncIterator() {
+ "use strict";
+
+ const stream = @Bun.stdin.stream();
+ var reader = stream.getReader();
+
+ // TODO: use builtin
+ var decoder = new globalThis.TextDecoder("utf-8", { fatal: false });
+ var deferredError;
+ var indexOf = @Bun.indexOfLine;
+
+ try {
+ while (true) {
+ var done, value;
+ var pendingChunk;
+ const firstResult = reader.readMany();
+ if (@isPromise(firstResult)) {
+ ({done, value} = await firstResult);
+ } else {
+ ({done, value} = firstResult);
+ }
+
+ if (done) {
+ if (pendingChunk) {
+ yield decoder.decode(pendingChunk);
+ }
+ return;
+ }
+
+ var actualChunk;
+ // we assume it was given line-by-line
+ for (const chunk of value) {
+ actualChunk = chunk;
+ if (pendingChunk) {
+ actualChunk = Buffer.concat([pendingChunk, chunk]);
+ pendingChunk = null;
+ }
+
+ var last = 0;
+ // TODO: "\r", 0x4048, 0x4049, 0x404A, 0x404B, 0x404C, 0x404D, 0x404E, 0x404F
+ var i = indexOf(actualChunk, last);
+ while (i !== -1) {
+ yield decoder.decode(actualChunk.subarray(last, i));
+ last = i + 1;
+ i = indexOf(actualChunk, last);
+ }
+
+ pendingChunk = actualChunk.subarray(last);
+ }
+ }
+ } catch(e) {
+ deferredError = e;
+ } finally {
+ reader.releaseLock();
+
+ if (deferredError) {
+ throw deferredError;
+ }
+ }
+ };
+
+ const symbol = globalThis.Symbol.asyncIterator;
+ this[symbol] = Iterator;
+ return Iterator();
+}
+
+function write(input) {
+ "use strict";
+
+ var writer = @getByIdDirectPrivate(this, "writer");
+ if (!writer) {
+ var length = @toLength(input?.length ?? 0);
+ writer = @Bun.stdout.writer({highWaterMark: length > 65536 ? length : 65536});
+ @putByIdDirectPrivate(this, "writer", writer);
+ }
+
+ var wrote = writer.write(input);
+
+ const count = @argumentCount();
+ for (var i = 1; i < count; i++) {
+ wrote += writer.write(@argument(i));
+ }
+
+ writer.flush(true);
+ return wrote;
+} \ No newline at end of file