@brimdata/zealot
Version:
The Javascript Client for Zed Lakes
85 lines (84 loc) • 1.98 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", {
value: true
});
Object.defineProperty(exports, "pipeText", {
enumerable: true,
get: ()=>pipeText
});
function pipeText(stream) {
if (!stream) return noop();
// @ts-ignore
if (stream.getReader) {
return browserPipeText(stream);
} else {
return nodePipeText(stream);
}
}
async function* noop() {}
async function* browserPipeText(stream) {
let reader = stream.getReader();
let text = new TextDecoder();
try {
while(true){
let { done , value } = await reader.read();
if (!done && value) {
yield text.decode(value);
} else {
return;
}
}
} finally{
reader.releaseLock();
}
}
function nodePipeText(stream) {
let resolves = [];
let pending = [];
stream.on("data", (data)=>{
let value = {
done: false,
value: data.toString()
};
if (resolves.length) {
resolves.shift()(value);
} else {
pending.push(value);
}
});
stream.on("end", ()=>{
const value = {
done: true,
value: null
};
if (resolves.length) {
resolves.shift()(value);
} else {
pending.push(value);
}
});
return {
return () {
return Promise.resolve({
done: true,
value: null
});
},
throw (e) {
return Promise.reject(e);
},
next () {
const result = pending.shift();
if (result) {
return Promise.resolve(result);
} else {
return new Promise((res)=>{
resolves.push(res);
});
}
},
[Symbol.asyncIterator]: function() {
return this;
}
};
}