janus
Version:
the two-faced application library-framework
162 lines (140 loc) • 4.58 kB
JavaScript
// Generated by CoffeeScript 1.12.2
(function() {
var MemoryCacheResolver, Request, Resolver, Varying, identity, isFunction, isNumber, ref, types,
slice = [].slice;
Varying = require('../core/varying').Varying;
ref = require('../util/util'), identity = ref.identity, isFunction = ref.isFunction, isNumber = ref.isNumber;
types = require('../core/types');
Request = (function() {
function Request(options) {
this.options = options;
}
Request.prototype.type = types.operation.read();
Request.prototype.signature = void 0;
Request.prototype.cacheable = true;
Request.prototype.expires = void 0;
return Request;
})();
Resolver = {
oneOf: function() {
var resolvers;
resolvers = 1 <= arguments.length ? slice.call(arguments, 0) : [];
return function(request) {
var i, len, resolver, result;
for (i = 0, len = resolvers.length; i < len; i++) {
resolver = resolvers[i];
result = resolver(request);
if (result != null) {
return result;
}
}
return null;
};
},
caching: function(cache, resolver) {
return function(request) {
var hit, result;
if ((hit = cache.resolve(request)) != null) {
return hit;
} else {
result = resolver(request);
if (result != null) {
cache.cache(request, result);
}
return result;
}
};
},
fromLibrary: function(library) {
return function(request) {
var base;
return typeof (base = library.get(request)) === "function" ? base(request) : void 0;
};
},
fromDom: function(dom, deserialize) {
if (deserialize == null) {
deserialize = identity;
}
return function(request) {
var cacheNode, signature;
signature = typeof request.signature === "function" ? request.signature() : void 0;
if (signature == null) {
return;
}
cacheNode = dom.children("#" + signature);
if (cacheNode.length === 0) {
return;
}
cacheNode.remove();
if (types.operation.read.match(request.type)) {
return new Varying(types.result.success(deserialize(cacheNode.text(), cacheNode)));
} else {
return null;
}
};
}
};
MemoryCacheResolver = (function() {
function MemoryCacheResolver() {
this._cache = {};
this._expires = {};
}
MemoryCacheResolver.prototype.resolve = function(request) {
var expires, signature;
if (!types.operation.read.match(request.type)) {
return;
}
signature = typeof request.signature === "function" ? request.signature() : void 0;
if (signature == null) {
return;
}
if (((expires = this._expires[signature]) != null) && (expires < (new Date()).getTime())) {
return;
}
return this._cache[signature];
};
MemoryCacheResolver.prototype.cache = function(request, result) {
var self, signature;
signature = typeof request.signature === "function" ? request.signature() : void 0;
if (signature == null) {
return;
}
if (types.operation.read.match(request.type) && this._cache[signature] !== result) {
this._set(signature, result, request.expires);
} else if (types.operation.mutate.match(request.type)) {
this._cache[signature] = null;
if (types.operation["delete"].match(request.type)) {
} else if (request.cacheable === true) {
self = this;
result.react(function(inner) {
types.result.success.match(inner, function() {
return self._set(signature, result, request.expires);
});
if (types.result.complete.match(inner)) {
return this.stop();
}
});
}
}
return null;
};
MemoryCacheResolver.prototype._set = function(signature, value, expires) {
var after;
this._cache[signature] = value;
if (expires != null) {
after = isFunction(expires) ? expires() : expires;
if (isNumber(after)) {
this._expires[signature] = (new Date()).getTime() + (after * 1000);
}
}
return null;
};
return MemoryCacheResolver;
})();
Resolver.MemoryCache = MemoryCacheResolver;
module.exports = {
Request: Request,
Resolver: Resolver,
MemoryCacheResolver: MemoryCacheResolver
};
}).call(this);