UNPKG

ayanami

Version:
81 lines (80 loc) 3.36 kB
"use strict"; 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;