diff --git a/packages/jsii-runtime/lib/host.ts b/packages/jsii-runtime/lib/host.ts index 0f64ec06ae..3caebb5246 100644 --- a/packages/jsii-runtime/lib/host.ts +++ b/packages/jsii-runtime/lib/host.ts @@ -14,7 +14,11 @@ export class KernelHost { return; // done } - this.processRequest(req, () => this.run()); + this.processRequest(req, () => { + // Schedule the call to run on the next event loop iteration to + // avoid recursion. + setImmediate(() => this.run()) + }); } private callbackHandler(callback: api.Callback) { diff --git a/packages/jsii-runtime/package.json b/packages/jsii-runtime/package.json index 0fcfb4df55..69d37d6740 100644 --- a/packages/jsii-runtime/package.json +++ b/packages/jsii-runtime/package.json @@ -10,7 +10,7 @@ "scripts": { "build": "tsc --build && chmod +x bin/jsii-runtime && /bin/bash ./bundle.sh", "watch": "tsc --build -w", - "test": "/bin/bash test/playback-test.sh", + "test": "/bin/bash test/playback-test.sh && node test/stress-test.js", "package": "package-js" }, "devDependencies": { diff --git a/packages/jsii-runtime/test/stress-test.ts b/packages/jsii-runtime/test/stress-test.ts new file mode 100755 index 0000000000..3af65107ec --- /dev/null +++ b/packages/jsii-runtime/test/stress-test.ts @@ -0,0 +1,26 @@ +import { InputOutput, Input, Output } from "../lib/in-out"; +import { KernelHost } from "../lib/host"; + +const requestCount = 250000; + +class FakeInputOutput extends InputOutput { + debug = false; + private count: number = 0; + + write(_: Output) { } + + read(): Input | undefined { + if(this.count == requestCount) { + return undefined; + } + + ++this.count; + return { api: 'stats' }; + } +} + +const inout = new FakeInputOutput(); +const host = new KernelHost(inout, { debug: false, noStack: false }); +host.run(); + +console.info("jsii-runtime stress test succeeded");