Skip to content

Commit

Permalink
node: Use upstream source for "events" module (#1558)
Browse files Browse the repository at this point in the history
This commit replaces "node/events.ts" with "node/events.js" and "node/events.d.ts",
which are files taken from upstream "node" repository. Several test files
were enabled.
  • Loading branch information
bartlomieju committed Nov 13, 2021
1 parent ffaa07f commit 46dbcba
Show file tree
Hide file tree
Showing 32 changed files with 2,228 additions and 1,572 deletions.
13 changes: 13 additions & 0 deletions node/_errors.ts
Expand Up @@ -44,6 +44,19 @@ const kTypes = [

const nodeInternalPrefix = "__node_internal_";

// Node uses an AbortError that isn't exactly the same as the DOMException
// to make usage of the error in userland and readable-stream easier.
// It is a regular error with `.code` and `.name`.
export class AbortError extends Error {
code: string;

constructor() {
super("The operation was aborted");
this.code = "ABORT_ERR";
this.name = "AbortError";
}
}

// deno-lint-ignore no-explicit-any
type GenericFunction = (...args: any[]) => any;

Expand Down
2 changes: 1 addition & 1 deletion node/_fs/_fs_watch.ts
@@ -1,5 +1,5 @@
import { fromFileUrl } from "../path.ts";
import { EventEmitter } from "../events.ts";
import { EventEmitter } from "../events.js";
import { notImplemented } from "../_utils.ts";

export function asyncIterableIteratorToCallback<T>(
Expand Down
6 changes: 3 additions & 3 deletions node/_stream/async_iterator.ts
Expand Up @@ -93,7 +93,7 @@ function finish(self: ReadableStreamAsyncIterator, err?: Error) {
resolve(createIterResult(undefined, true));
}
});
destroyer(stream, err);
destroyer(stream as unknown as Stream, err);
},
);
}
Expand Down Expand Up @@ -205,8 +205,8 @@ const createReadableStreamAsyncIterator = (stream: IterableStreams) => {
// deno-lint-ignore no-explicit-any
if (typeof (stream as any).read !== "function") {
const src = stream;
stream = new Readable({ objectMode: true }).wrap(src);
finished(stream, (err) => destroyer(src, err));
stream = new Readable({ objectMode: true }).wrap(src as unknown as Stream);
finished(stream, (err) => destroyer(src as unknown as Stream, err));
}

const iterator = new ReadableStreamAsyncIterator(stream as Readable);
Expand Down
12 changes: 10 additions & 2 deletions node/_stream/duplex.ts
@@ -1,5 +1,5 @@
// Copyright Node.js contributors. All rights reserved. MIT License.
import { captureRejectionSymbol } from "../events.ts";
import { captureRejectionSymbol } from "../events.js";
import Readable, { ReadableState } from "./readable.ts";
import Stream from "./stream.ts";
import Writable, { WritableState } from "./writable.ts";
Expand Down Expand Up @@ -70,6 +70,7 @@ export interface DuplexOptions {
writev?: writeV;
}

// @ts-ignore `deno_std`'s types are scricter than types from DefinitelyTyped for Node.js thus causing problems
interface Duplex extends Readable, Writable {}

/**
Expand Down Expand Up @@ -463,6 +464,7 @@ class Duplex extends Stream {
return ret;
}

// @ts-ignore `deno_std`'s types are scricter than types from DefinitelyTyped for Node.js thus causing problems
removeAllListeners(
ev:
| "close"
Expand All @@ -484,18 +486,23 @@ class Duplex extends Stream {
return res;
}

// @ts-ignore `deno_std`'s types are scricter than types from DefinitelyTyped for Node.js thus causing problems
removeListener(
event: "close" | "end" | "pause" | "readable" | "resume",
listener: () => void,
): this;
// @ts-ignore `deno_std`'s types are scricter than types from DefinitelyTyped for Node.js thus causing problems
// deno-lint-ignore no-explicit-any
removeListener(event: "data", listener: (chunk: any) => void): this;
// @ts-ignore `deno_std`'s types are scricter than types from DefinitelyTyped for Node.js thus causing problems
removeListener(event: "error", listener: (err: Error) => void): this;
// @ts-ignore `deno_std`'s types are scricter than types from DefinitelyTyped for Node.js thus causing problems
removeListener(
event: string | symbol,
// deno-lint-ignore no-explicit-any
listener: (...args: any[]) => void,
): this;
// @ts-ignore `deno_std`'s types are scricter than types from DefinitelyTyped for Node.js thus causing problems
removeListener(
ev: string | symbol,
fn:
Expand All @@ -505,13 +512,14 @@ class Duplex extends Stream {
| ((err: Error) => void)
// deno-lint-ignore no-explicit-any
| ((...args: any[]) => void),
) {
): this {
const res = super.removeListener.call(this, ev, fn);

if (ev === "readable") {
queueMicrotask(() => updateReadableListening(this));
}

// @ts-ignore `deno_std`'s types are scricter than types from DefinitelyTyped for Node.js thus causing problems
return res;
}

Expand Down
11 changes: 8 additions & 3 deletions node/_stream/duplex_internal.ts
Expand Up @@ -151,7 +151,7 @@ export function finishMaybe(
sync?: boolean,
) {
if (needFinish(state)) {
prefinish(stream as Writable, state);
prefinish(stream as unknown as Writable, state);
if (state.pendingcb === 0 && needFinish(state)) {
state.pendingcb++;
if (sync) {
Expand Down Expand Up @@ -210,15 +210,20 @@ export function onwrite(stream: Duplex, er?: Error | null) {
state.afterWriteTickInfo = {
count: 1,
cb: (cb as (error?: Error) => void),
stream: stream as Writable,
stream: stream as unknown as Writable,
state,
};
queueMicrotask(() =>
afterWriteTick(state.afterWriteTickInfo as AfterWriteTick)
);
}
} else {
afterWrite(stream as Writable, state, 1, cb as (error?: Error) => void);
afterWrite(
stream as unknown as Writable,
state,
1,
cb as (error?: Error) => void,
);
}
}
}
Expand Down
6 changes: 3 additions & 3 deletions node/_stream/pipeline.ts
Expand Up @@ -3,7 +3,7 @@ import { once } from "../_utils.ts";
import { destroyer as implDestroyer } from "./destroy.ts";
import eos from "./end_of_stream.ts";
import createReadableStreamAsyncIterator from "./async_iterator.ts";
import * as events from "../events.ts";
import * as events from "../events.js";
import PassThrough from "./passthrough.ts";
import {
ERR_INVALID_ARG_TYPE,
Expand Down Expand Up @@ -84,7 +84,7 @@ function destroyer(
return (err: NodeErrorAbstraction) => {
if (finished) return;
finished = true;
implDestroyer(stream, err);
implDestroyer(stream as unknown as Stream, err);
callback(err || new ERR_STREAM_DESTROYED("pipe"));
};
}
Expand Down Expand Up @@ -153,7 +153,7 @@ async function pump(
for await (const chunk of iterable) {
if (!writable.write(chunk)) {
if (writable.destroyed) return;
await events.once(writable, "drain");
await events.once(writable as unknown as Stream, "drain");
}
}
writable.end();
Expand Down
18 changes: 13 additions & 5 deletions node/_stream/readable.ts
@@ -1,5 +1,5 @@
// Copyright Node.js contributors. All rights reserved. MIT License.
import { captureRejectionSymbol } from "../events.ts";
import { captureRejectionSymbol } from "../events.js";
import Stream from "./stream.ts";
import type { Buffer } from "../buffer.ts";
import BufferList from "./buffer_list.ts";
Expand Down Expand Up @@ -362,7 +362,7 @@ class Readable extends Stream {
}
}

prependListener(dest, "error", onerror);
prependListener(dest as unknown as Stream, "error", onerror);

function onclose() {
dest.removeListener("finish", onfinish);
Expand Down Expand Up @@ -459,18 +459,23 @@ class Readable extends Stream {
return res;
}

// @ts-ignore `deno_std`'s types are scricter than types from DefinitelyTyped for Node.js thus causing problems
removeListener(
event: "close" | "end" | "pause" | "readable" | "resume",
listener: () => void,
): this;
// @ts-ignore `deno_std`'s types are scricter than types from DefinitelyTyped for Node.js thus causing problems
// deno-lint-ignore no-explicit-any
removeListener(event: "data", listener: (chunk: any) => void): this;
// @ts-ignore `deno_std`'s types are scricter than types from DefinitelyTyped for Node.js thus causing problems
removeListener(event: "error", listener: (err: Error) => void): this;
// @ts-ignore `deno_std`'s types are scricter than types from DefinitelyTyped for Node.js thus causing problems
removeListener(
event: string | symbol,
// deno-lint-ignore no-explicit-any
listener: (...args: any[]) => void,
): this;
// @ts-ignore `deno_std`'s types are scricter than types from DefinitelyTyped for Node.js thus causing problems
removeListener(
ev: string | symbol,
fn:
Expand All @@ -480,13 +485,14 @@ class Readable extends Stream {
| ((err: Error) => void)
// deno-lint-ignore no-explicit-any
| ((...args: any[]) => void),
) {
): this {
const res = super.removeListener.call(this, ev, fn);

if (ev === "readable") {
queueMicrotask(() => updateReadableListening(this));
}

// @ts-ignore `deno_std`'s types are scricter than types from DefinitelyTyped for Node.js thus causing problems
return res;
}

Expand Down Expand Up @@ -595,6 +601,7 @@ class Readable extends Stream {
return this;
}

// @ts-ignore `deno_std`'s types are scricter than types from DefinitelyTyped for Node.js thus causing problems
removeAllListeners(
ev:
| "close"
Expand Down Expand Up @@ -657,7 +664,8 @@ class Readable extends Stream {
this.push(null);
});

stream.on("data", (chunk) => {
// deno-lint-ignore no-explicit-any
stream.on("data", (chunk: any) => {
if (state.decoder) {
chunk = state.decoder.write(chunk);
}
Expand Down Expand Up @@ -697,7 +705,7 @@ class Readable extends Stream {
}
}

stream.on("error", (err) => {
stream.on("error", (err: Error) => {
errorOrDestroy(this, err);
});

Expand Down
2 changes: 1 addition & 1 deletion node/_stream/readable_internal.ts
@@ -1,7 +1,7 @@
// Copyright Node.js contributors. All rights reserved. MIT License.
import { Buffer } from "../buffer.ts";
import type Duplex from "./duplex.ts";
import { EventEmitter } from "../events.ts";
import { EventEmitter } from "../events.js";
import type Readable from "./readable.ts";
import type Writable from "./writable.ts";
import type { ReadableState } from "./readable.ts";
Expand Down
11 changes: 6 additions & 5 deletions node/_stream/readable_test.ts
@@ -1,13 +1,14 @@
// Copyright Node.js contributors. All rights reserved. MIT License.
import { Buffer } from "../buffer.ts";
import Readable from "../_stream/readable.ts";
import { once } from "../events.ts";
import { once } from "../events.js";
import { deferred } from "../../async/mod.ts";
import {
assert,
assertEquals,
assertStrictEquals,
} from "../../testing/asserts.ts";
import type { EventEmitter } from "../events.d.ts";

Deno.test("Readable stream from iterator", async () => {
function* generate() {
Expand Down Expand Up @@ -85,7 +86,7 @@ Deno.test("Readable stream gets destroyed on error", async () => {

stream.read();

const [err] = await once(stream, "error");
const [err] = await once(stream as unknown as EventEmitter, "error");
assertStrictEquals(err.message, "kaboom");
assertStrictEquals(stream.destroyed, true);
});
Expand Down Expand Up @@ -265,7 +266,7 @@ Deno.test("Readable stream: 'on' event", async () => {
assertStrictEquals(chunk, expected.shift());
});

await once(stream, "end");
await once(stream as unknown as EventEmitter, "end");

assertStrictEquals(iterations, 3);
});
Expand All @@ -288,7 +289,7 @@ Deno.test("Readable stream: 'data' event", async () => {
assertStrictEquals(chunk.toString(), expected.shift());
});

await once(stream, "end");
await once(stream as unknown as EventEmitter, "end");

assertStrictEquals(iterations, 3);
});
Expand All @@ -311,7 +312,7 @@ Deno.test("Readable stream: 'data' event on non-object", async () => {
assertStrictEquals(chunk.toString(), expected.shift());
});

await once(stream, "end");
await once(stream as unknown as EventEmitter, "end");

assertStrictEquals(iterations, 3);
});
Expand Down
2 changes: 1 addition & 1 deletion node/_stream/stream.ts
Expand Up @@ -2,7 +2,7 @@
import { Buffer } from "../buffer.ts";
import type Duplex from "./duplex.ts";
import type eos from "./end_of_stream.ts";
import EventEmitter from "../events.ts";
import EventEmitter from "../events.js";
import type PassThrough from "./passthrough.ts";
import type pipeline from "./pipeline.ts";
import type * as promises from "./promises.ts";
Expand Down
2 changes: 1 addition & 1 deletion node/_stream/writable.ts
@@ -1,7 +1,7 @@
// Copyright Node.js contributors. All rights reserved. MIT License.
import { Buffer } from "../buffer.ts";
import Stream from "./stream.ts";
import { captureRejectionSymbol } from "../events.ts";
import { captureRejectionSymbol } from "../events.js";
import {
ERR_INVALID_ARG_TYPE,
ERR_INVALID_OPT_VALUE,
Expand Down
2 changes: 1 addition & 1 deletion node/_stream/writable_internal.ts
Expand Up @@ -177,7 +177,7 @@ export function destroy(this: Writable, err?: Error | null, cb?: () => void) {
w.destroyed = true;

if (!w.constructed) {
this.once(kDestroy, (er) => {
this.once(kDestroy, (er: Error) => {
_destroy(this, err || er, cb);
});
} else {
Expand Down
9 changes: 9 additions & 0 deletions node/_tools/config.json
Expand Up @@ -20,7 +20,9 @@
"test-dns-lookup.js",
"test-dns.js",
"test-event-emitter-errors.js",
"test-event-emitter-max-listeners.js",
"test-event-emitter-no-error-provided-to-error-event.js",
"test-event-emitter-prepend.js",
"test-net-access-byteswritten.js",
"test-net-after-close.js",
"test-net-bytes-stats.js",
Expand All @@ -42,6 +44,8 @@
"test-net-write-arguments.js",
"test-querystring.js",
"test-readline-csi.js",
"test-stream-pipe-event.js",
"test-stream-readable-event.js",
"test-url-format-whatwg.js",
"test-url-urltooptions.js",
"test-util.js"
Expand Down Expand Up @@ -142,6 +146,11 @@
"test-event-emitter-special-event-names.js",
"test-event-emitter-subclass.js",
"test-event-emitter-symbols.js",
"test-events-list.js",
"test-events-on-async-iterator.js",
"test-events-once.js",
"test-events-static-geteventlisteners.js",
"test-events-uncaught-exception-stack.js",
"test-net-access-byteswritten.js",
"test-net-after-close.js",
"test-net-allow-half-open.js",
Expand Down
2 changes: 1 addition & 1 deletion node/_tools/suites/parallel/test-event-emitter-errors.js
Expand Up @@ -13,6 +13,7 @@ const util = require('util');

const EE = new EventEmitter();

/* TODO(uki00a): Uncomment this block when `util.inspect` becomes compatible with Node.js.
assert.throws(
() => EE.emit('error', 'Accepts a string'),
{
Expand All @@ -22,7 +23,6 @@ assert.throws(
}
);
/* TODO(uki00a): Uncomment this block when `util.inspect` becomes compatible with Node.js.
assert.throws(
() => EE.emit('error', { message: 'Error!' }),
{
Expand Down

0 comments on commit 46dbcba

Please sign in to comment.