@deno/kv
Version:
A Deno KV client library optimized for Node.js.
75 lines (74 loc) • 2.15 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
exports.subscribeFnToAsyncGenerator = exports.createSubscribeFn = exports.defer = void 0;
const array_js_1 = require("../array.js");
function defer() {
const transit = {};
const result = new Promise((resolve, reject) => Object.assign(transit, { resolve, reject }));
return Object.assign(result, transit);
}
exports.defer = defer;
function createSubscribeFn(next, wait = Promise.resolve()) {
const observers = [];
(async () => {
try {
await wait;
while (observers.length) {
const [value, done] = await next();
for (const observer of observers)
observer.next(value);
if (done)
break;
}
}
catch (err) {
for (const observer of observers)
observer.error(err);
}
finally {
for (const observer of observers)
observer.complete();
}
})();
return (observer) => {
observers.push(observer);
return () => {
observer.complete();
(0, array_js_1.removeItem)(observers, observer);
};
};
}
exports.createSubscribeFn = createSubscribeFn;
async function* subscribeFnToAsyncGenerator(subscribe) {
let finished = false;
let deferred = defer();
const observer = {
next(value) {
const result = deferred;
deferred = defer();
result.resolve(value);
},
error(exception) {
const result = deferred;
deferred = defer();
result.reject(exception);
},
complete() {
finished = true;
deferred.resolve(null);
},
};
const unsubscribe = subscribe(observer);
try {
while (true) {
const value = await deferred;
if (finished)
break;
yield value;
}
}
finally {
unsubscribe();
}
}
exports.subscribeFnToAsyncGenerator = subscribeFnToAsyncGenerator;