mirror of
https://github.com/Abdulazizzn/n8n-enterprise-unlocked.git
synced 2025-12-18 10:31:15 +00:00
feat(core): Lazy-load nodes and credentials to reduce baseline memory usage (#4577)
This commit is contained in:
committed by
GitHub
parent
f63cd3b89e
commit
b6c57e19fc
@@ -1,51 +1,36 @@
|
||||
/* eslint-disable @typescript-eslint/no-unsafe-argument */
|
||||
/* eslint-disable no-underscore-dangle */
|
||||
import { deepCopy, ICredentialDataDecryptedObject } from 'n8n-workflow';
|
||||
import { CredentialTypes } from '@/CredentialTypes';
|
||||
import type { ICredentialDataDecryptedObject, ICredentialTypes } from 'n8n-workflow';
|
||||
import { deepCopy, LoggerProxy as Logger, jsonParse } from 'n8n-workflow';
|
||||
import type { ICredentialsOverwrite } from '@/Interfaces';
|
||||
import * as GenericHelpers from '@/GenericHelpers';
|
||||
|
||||
class CredentialsOverwritesClass {
|
||||
private credentialTypes = CredentialTypes();
|
||||
|
||||
private overwriteData: ICredentialsOverwrite = {};
|
||||
|
||||
private resolvedTypes: string[] = [];
|
||||
|
||||
async init(overwriteData?: ICredentialsOverwrite) {
|
||||
constructor(private credentialTypes: ICredentialTypes) {}
|
||||
|
||||
async init() {
|
||||
const data = (await GenericHelpers.getConfigValue('credentials.overwrite.data')) as string;
|
||||
|
||||
const overwriteData = jsonParse<ICredentialsOverwrite>(data, {
|
||||
errorMessage: 'The credentials-overwrite is not valid JSON.',
|
||||
});
|
||||
|
||||
this.setData(overwriteData);
|
||||
}
|
||||
|
||||
setData(overwriteData: ICredentialsOverwrite) {
|
||||
// If data gets reinitialized reset the resolved types cache
|
||||
this.resolvedTypes.length = 0;
|
||||
|
||||
if (overwriteData !== undefined) {
|
||||
// If data is already given it can directly be set instead of
|
||||
// loaded from environment
|
||||
this.__setData(deepCopy(overwriteData));
|
||||
return;
|
||||
}
|
||||
|
||||
const data = (await GenericHelpers.getConfigValue('credentials.overwrite.data')) as string;
|
||||
|
||||
try {
|
||||
// eslint-disable-next-line @typescript-eslint/no-unsafe-assignment, @typescript-eslint/no-shadow
|
||||
const overwriteData = JSON.parse(data);
|
||||
this.__setData(overwriteData);
|
||||
} catch (error) {
|
||||
throw new Error(`The credentials-overwrite is not valid JSON.`);
|
||||
}
|
||||
}
|
||||
|
||||
__setData(overwriteData: ICredentialsOverwrite) {
|
||||
this.overwriteData = overwriteData;
|
||||
|
||||
// eslint-disable-next-line no-restricted-syntax
|
||||
for (const credentialTypeData of this.credentialTypes.getAll()) {
|
||||
const type = credentialTypeData.name;
|
||||
|
||||
const overwrites = this.__getExtended(type);
|
||||
for (const type in overwriteData) {
|
||||
const overwrites = this.getOverwrites(type);
|
||||
|
||||
if (overwrites && Object.keys(overwrites).length) {
|
||||
this.overwriteData[type] = overwrites;
|
||||
credentialTypeData.__overwrittenProperties = Object.keys(overwrites);
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -70,18 +55,19 @@ class CredentialsOverwritesClass {
|
||||
return returnData;
|
||||
}
|
||||
|
||||
__getExtended(type: string): ICredentialDataDecryptedObject | undefined {
|
||||
private getOverwrites(type: string): ICredentialDataDecryptedObject | undefined {
|
||||
if (this.resolvedTypes.includes(type)) {
|
||||
// Type got already resolved and can so returned directly
|
||||
return this.overwriteData[type];
|
||||
}
|
||||
|
||||
const credentialTypeData = this.credentialTypes.getByName(type);
|
||||
|
||||
if (credentialTypeData === undefined) {
|
||||
throw new Error(`The credentials of type "${type}" are not known.`);
|
||||
if (!this.credentialTypes.recognizes(type)) {
|
||||
Logger.warn(`Unknown credential type ${type} in Credential overwrites`);
|
||||
return;
|
||||
}
|
||||
|
||||
const credentialTypeData = this.credentialTypes.getByName(type);
|
||||
|
||||
if (credentialTypeData.extends === undefined) {
|
||||
this.resolvedTypes.push(type);
|
||||
return this.overwriteData[type];
|
||||
@@ -90,7 +76,7 @@ class CredentialsOverwritesClass {
|
||||
const overwrites: ICredentialDataDecryptedObject = {};
|
||||
// eslint-disable-next-line no-restricted-syntax
|
||||
for (const credentialsTypeName of credentialTypeData.extends) {
|
||||
Object.assign(overwrites, this.__getExtended(credentialsTypeName));
|
||||
Object.assign(overwrites, this.getOverwrites(credentialsTypeName));
|
||||
}
|
||||
|
||||
if (this.overwriteData[type] !== undefined) {
|
||||
@@ -102,7 +88,7 @@ class CredentialsOverwritesClass {
|
||||
return overwrites;
|
||||
}
|
||||
|
||||
get(type: string): ICredentialDataDecryptedObject | undefined {
|
||||
private get(type: string): ICredentialDataDecryptedObject | undefined {
|
||||
return this.overwriteData[type];
|
||||
}
|
||||
|
||||
@@ -114,9 +100,15 @@ class CredentialsOverwritesClass {
|
||||
let credentialsOverwritesInstance: CredentialsOverwritesClass | undefined;
|
||||
|
||||
// eslint-disable-next-line @typescript-eslint/naming-convention
|
||||
export function CredentialsOverwrites(): CredentialsOverwritesClass {
|
||||
if (credentialsOverwritesInstance === undefined) {
|
||||
credentialsOverwritesInstance = new CredentialsOverwritesClass();
|
||||
export function CredentialsOverwrites(
|
||||
credentialTypes?: ICredentialTypes,
|
||||
): CredentialsOverwritesClass {
|
||||
if (!credentialsOverwritesInstance) {
|
||||
if (credentialTypes) {
|
||||
credentialsOverwritesInstance = new CredentialsOverwritesClass(credentialTypes);
|
||||
} else {
|
||||
throw new Error('CredentialsOverwrites not initialized yet');
|
||||
}
|
||||
}
|
||||
|
||||
return credentialsOverwritesInstance;
|
||||
|
||||
Reference in New Issue
Block a user