veffect
Version:
powerful TypeScript validation library built on the robust foundation of Effect combining exceptional type safety, high performance, and developer experience. Taking inspiration from Effect's functional principles, VEffect delivers a balanced approach tha
126 lines (125 loc) • 5.44 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.withRequestCaching = exports.withRequestCache = exports.fromRequest = exports.currentCacheEnabled = exports.currentCache = exports.cacheRequest = void 0;
var _Duration = /*#__PURE__*/require("../Duration.js");
var _Function = /*#__PURE__*/require("../Function.js");
var _GlobalValue = /*#__PURE__*/require("../GlobalValue.js");
var BlockedRequests = /*#__PURE__*/_interopRequireWildcard( /*#__PURE__*/require("./blockedRequests.js"));
var _cache = /*#__PURE__*/require("./cache.js");
var core = /*#__PURE__*/_interopRequireWildcard( /*#__PURE__*/require("./core.js"));
var _fiberRuntime = /*#__PURE__*/require("./fiberRuntime.js");
var _request = /*#__PURE__*/require("./request.js");
function _getRequireWildcardCache(e) {
if ("function" != typeof WeakMap) return null;
var r = new WeakMap(),
t = new WeakMap();
return (_getRequireWildcardCache = function (e) {
return e ? t : r;
})(e);
}
function _interopRequireWildcard(e, r) {
if (!r && e && e.__esModule) return e;
if (null === e || "object" != typeof e && "function" != typeof e) return {
default: e
};
var t = _getRequireWildcardCache(r);
if (t && t.has(e)) return t.get(e);
var n = {
__proto__: null
},
a = Object.defineProperty && Object.getOwnPropertyDescriptor;
for (var u in e) if ("default" !== u && {}.hasOwnProperty.call(e, u)) {
var i = a ? Object.getOwnPropertyDescriptor(e, u) : null;
i && (i.get || i.set) ? Object.defineProperty(n, u, i) : n[u] = e[u];
}
return n.default = e, t && t.set(e, n), n;
}
/** @internal */
const currentCache = exports.currentCache = /*#__PURE__*/(0, _GlobalValue.globalValue)( /*#__PURE__*/Symbol.for("effect/FiberRef/currentCache"), () => core.fiberRefUnsafeMake((0, _cache.unsafeMakeWith)(65536, () => core.map(core.deferredMake(), handle => ({
listeners: new _request.Listeners(),
handle
})), () => (0, _Duration.seconds)(60))));
/** @internal */
const currentCacheEnabled = exports.currentCacheEnabled = /*#__PURE__*/(0, _GlobalValue.globalValue)( /*#__PURE__*/Symbol.for("effect/FiberRef/currentCacheEnabled"), () => core.fiberRefUnsafeMake(false));
/** @internal */
const fromRequest = (request, dataSource) => core.flatMap(core.isEffect(dataSource) ? dataSource : core.succeed(dataSource), ds => core.fiberIdWith(id => {
const proxy = new Proxy(request, {});
return core.fiberRefGetWith(currentCacheEnabled, cacheEnabled => {
if (cacheEnabled) {
const cached = core.fiberRefGetWith(currentCache, cache => core.flatMap(cache.getEither(proxy), orNew => {
switch (orNew._tag) {
case "Left":
{
if (orNew.left.listeners.interrupted) {
return core.flatMap(cache.invalidateWhen(proxy, entry => entry.handle === orNew.left.handle), () => cached);
}
orNew.left.listeners.increment();
return core.uninterruptibleMask(restore => core.flatMap(core.exit(core.blocked(BlockedRequests.empty, restore(core.deferredAwait(orNew.left.handle)))), exit => {
orNew.left.listeners.decrement();
return exit;
}));
}
case "Right":
{
orNew.right.listeners.increment();
return core.uninterruptibleMask(restore => core.flatMap(core.exit(core.blocked(BlockedRequests.single(ds, BlockedRequests.makeEntry({
request: proxy,
result: orNew.right.handle,
listeners: orNew.right.listeners,
ownerId: id,
state: {
completed: false
}
})), restore(core.deferredAwait(orNew.right.handle)))), () => {
orNew.right.listeners.decrement();
return core.deferredAwait(orNew.right.handle);
}));
}
}
}));
return cached;
}
const listeners = new _request.Listeners();
listeners.increment();
return core.flatMap(core.deferredMake(), ref => (0, _fiberRuntime.ensuring)(core.blocked(BlockedRequests.single(ds, BlockedRequests.makeEntry({
request: proxy,
result: ref,
listeners,
ownerId: id,
state: {
completed: false
}
})), core.deferredAwait(ref)), core.sync(() => listeners.decrement())));
});
}));
/** @internal */
exports.fromRequest = fromRequest;
const cacheRequest = (request, result) => {
return core.fiberRefGetWith(currentCacheEnabled, cacheEnabled => {
if (cacheEnabled) {
return core.fiberRefGetWith(currentCache, cache => core.flatMap(cache.getEither(request), orNew => {
switch (orNew._tag) {
case "Left":
{
return core.unit;
}
case "Right":
{
return core.deferredComplete(orNew.right.handle, result);
}
}
}));
}
return core.unit;
});
};
/** @internal */
exports.cacheRequest = cacheRequest;
const withRequestCaching = exports.withRequestCaching = /*#__PURE__*/(0, _Function.dual)(2, (self, strategy) => core.fiberRefLocally(self, currentCacheEnabled, strategy));
/** @internal */
const withRequestCache = exports.withRequestCache = /*#__PURE__*/(0, _Function.dual)(2,
// @ts-expect-error
(self, cache) => core.fiberRefLocally(self, currentCache, cache));
//# sourceMappingURL=query.js.map