@arkade-os/sdk
Version:
Bitcoin wallet SDK with Taproot and Ark integration
61 lines (60 loc) • 1.94 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
exports.eventSourceIterator = eventSourceIterator;
async function* eventSourceIterator(eventSource) {
const messageQueue = [];
const errorQueue = [];
let messageResolve = null;
let errorResolve = null;
const messageHandler = (event) => {
if (messageResolve) {
messageResolve(event);
messageResolve = null;
}
else {
messageQueue.push(event);
}
};
const errorHandler = () => {
const error = new Error("EventSource error");
if (errorResolve) {
errorResolve(error);
errorResolve = null;
}
else {
errorQueue.push(error);
}
};
eventSource.addEventListener("message", messageHandler);
eventSource.addEventListener("error", errorHandler);
try {
while (true) {
// if we have queued messages, yield the first one, remove it from the queue
if (messageQueue.length > 0) {
yield messageQueue.shift();
continue;
}
// if we have queued errors, throw the first one, remove it from the queue
if (errorQueue.length > 0) {
const error = errorQueue.shift();
throw error;
}
// wait for the next message or error
const result = await new Promise((resolve, reject) => {
messageResolve = resolve;
errorResolve = reject;
}).finally(() => {
messageResolve = null;
errorResolve = null;
});
if (result) {
yield result;
}
}
}
finally {
// clean up
eventSource.removeEventListener("message", messageHandler);
eventSource.removeEventListener("error", errorHandler);
}
}