ayanami
Version:
A better way to react with state
81 lines (80 loc) • 3.36 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
exports.createScopeWithRequest = exports.createOrGetInstanceInScope = exports.ayanamiInstances = void 0;
var tslib_1 = require("tslib");
var di_1 = require("@asuka/di");
var same_scope_decorator_1 = require("./same-scope-decorator");
var constants_1 = require("../../ssr/constants");
var flag_1 = require("../../ssr/flag");
var express_1 = require("../../ssr/express");
var map = new Map();
exports.ayanamiInstances = new Map();
function createOrGetInstanceInScope(constructor, scope) {
var instanceAtScope = getInstanceFrom(constructor, scope);
return instanceAtScope ? instanceAtScope : createInstanceInScope(constructor, scope);
}
exports.createOrGetInstanceInScope = createOrGetInstanceInScope;
function createInstanceInScope(constructor, scope) {
var paramTypes = Reflect.getMetadata('design:paramtypes', constructor) || [];
// parameters decorated by @Inject
var paramAnnotations = Reflect.getMetadata('parameters', constructor) || [];
var sameScopeParams = Reflect.getMetadata(same_scope_decorator_1.SameScopeMetadataKey, constructor) || [];
var deps = paramTypes.map(function (type, index) {
if (sameScopeParams[index]) {
return createOrGetInstanceInScope(type, scope);
}
if (paramAnnotations[index] !== null) {
var metadata = paramAnnotations[index];
metadata = Array.isArray(metadata) ? metadata : [metadata];
var inject = metadata.find(function (factory) { return factory instanceof di_1.Inject; });
if (inject && inject.token) {
return di_1.InjectableFactory.getInstanceByToken(inject.token);
}
}
return di_1.InjectableFactory.getInstance(type);
});
var newInstance = new (constructor.bind.apply(constructor, tslib_1.__spreadArray([void 0], deps)))();
setInstanceInScope(constructor, scope, newInstance);
return newInstance;
}
function setInstanceInScope(constructor, scope, newInstance) {
var scopeMap = map.get(constructor) || new Map();
scopeMap.set(scope, newInstance);
map.set(constructor, scopeMap);
newInstance[constants_1.CleanupSymbol] = function () {
newInstance.destroy();
scopeMap.delete(scope);
};
if (flag_1.isSSREnabled()) {
exports.ayanamiInstances.set(scope, (exports.ayanamiInstances.get(scope) || []).concat(newInstance));
}
}
function getInstanceFrom(constructor, scope) {
var scopeMap = map.get(constructor);
return scopeMap && scopeMap.get(scope);
}
// eslint-disable-next-line @typescript-eslint/explicit-module-boundary-types
function createScopeWithRequest(req, scope) {
if (!scope) {
return req;
}
if (express_1.reqMap.has(req)) {
var scopes = express_1.reqMap.get(req);
if (scopes.has(scope)) {
return scopes.get(scope);
}
else {
var reqScope = { req: req, scope: scope };
scopes.set(scope, reqScope);
return reqScope;
}
}
else {
var reqScopeMap = new Map();
var reqScope = { req: req, scope: scope };
reqScopeMap.set(scope, reqScope);
express_1.reqMap.set(req, reqScopeMap);
return reqScope;
}
}
exports.createScopeWithRequest = createScopeWithRequest;