I don't quite get the mapping of "pull" and "push" and "synchronous" and "callbacks".
foo.asyncPush(callback);
foo.asyncPull(callback);
and const result = await pull();
await push(data);
Both feel similar in terms of idioms, capabilities, etc... I know that async/await was not a thing in 2013 JavaScript, but as a pattern (promises, futures, etc...) it's been around for some time.