mirror of
https://github.com/Abdulazizzn/n8n-enterprise-unlocked.git
synced 2025-12-16 17:46:45 +00:00
fix: Improve error handling for community package installation (#19103)
This commit is contained in:
@@ -64,6 +64,39 @@ describe('verifyIntegrity', () => {
|
|||||||
expect(error.cause.message).toContain('Network failure');
|
expect(error.cause.message).toContain('Network failure');
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
|
it('should return generic message for DNS getaddrinfo errors', async () => {
|
||||||
|
const integrity = 'sha512-somerandomhash==';
|
||||||
|
|
||||||
|
nock(registryUrl)
|
||||||
|
.get(`/${encodeURIComponent(packageName)}/${version}`)
|
||||||
|
.replyWithError('getaddrinfo ENOTFOUND internal.registry.local');
|
||||||
|
|
||||||
|
try {
|
||||||
|
await verifyIntegrity(packageName, version, registryUrl, integrity);
|
||||||
|
throw new Error('Expected error was not thrown');
|
||||||
|
} catch (error: any) {
|
||||||
|
expect(error).toBeInstanceOf(UnexpectedError);
|
||||||
|
expect(error.message).toBe(
|
||||||
|
'Checksum verification failed. Please check your network connection and try again.',
|
||||||
|
);
|
||||||
|
expect(error.cause).toBeUndefined();
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
it('should return generic message for DNS ENOTFOUND errors', async () => {
|
||||||
|
const integrity = 'sha512-somerandomhash==';
|
||||||
|
|
||||||
|
nock(registryUrl)
|
||||||
|
.get(`/${encodeURIComponent(packageName)}/${version}`)
|
||||||
|
.replyWithError('ENOTFOUND some.internal.registry');
|
||||||
|
|
||||||
|
await expect(verifyIntegrity(packageName, version, registryUrl, integrity)).rejects.toThrow(
|
||||||
|
new UnexpectedError(
|
||||||
|
'Checksum verification failed. Please check your network connection and try again.',
|
||||||
|
),
|
||||||
|
);
|
||||||
|
});
|
||||||
});
|
});
|
||||||
|
|
||||||
describe('isVersionExists', () => {
|
describe('isVersionExists', () => {
|
||||||
@@ -137,4 +170,38 @@ describe('isVersionExists', () => {
|
|||||||
UnexpectedError,
|
UnexpectedError,
|
||||||
);
|
);
|
||||||
});
|
});
|
||||||
|
|
||||||
|
it('should return generic message for DNS getaddrinfo errors', async () => {
|
||||||
|
nock(registryUrl)
|
||||||
|
.get(`/${encodeURIComponent(packageName)}/${version}`)
|
||||||
|
.replyWithError('getaddrinfo ENOTFOUND internal.registry.local');
|
||||||
|
|
||||||
|
try {
|
||||||
|
await isVersionExists(packageName, version, registryUrl);
|
||||||
|
throw new Error('Expected error was not thrown');
|
||||||
|
} catch (error: any) {
|
||||||
|
expect(error).toBeInstanceOf(UnexpectedError);
|
||||||
|
expect(error.message).toBe(
|
||||||
|
'The community nodes service is temporarily unreachable. Please try again later.',
|
||||||
|
);
|
||||||
|
expect(error.cause).toBeUndefined();
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
it('should return generic message for DNS ENOTFOUND errors', async () => {
|
||||||
|
nock(registryUrl)
|
||||||
|
.get(`/${encodeURIComponent(packageName)}/${version}`)
|
||||||
|
.replyWithError('ENOTFOUND some.internal.registry');
|
||||||
|
|
||||||
|
try {
|
||||||
|
await isVersionExists(packageName, version, registryUrl);
|
||||||
|
throw new Error('Expected error was not thrown');
|
||||||
|
} catch (error: any) {
|
||||||
|
expect(error).toBeInstanceOf(UnexpectedError);
|
||||||
|
expect(error.message).toBe(
|
||||||
|
'The community nodes service is temporarily unreachable. Please try again later.',
|
||||||
|
);
|
||||||
|
expect(error.cause).toBeUndefined();
|
||||||
|
}
|
||||||
|
});
|
||||||
});
|
});
|
||||||
|
|||||||
@@ -1,6 +1,11 @@
|
|||||||
import axios from 'axios';
|
import axios from 'axios';
|
||||||
import { UnexpectedError } from 'n8n-workflow';
|
import { UnexpectedError } from 'n8n-workflow';
|
||||||
|
|
||||||
|
function isDnsError(error: unknown): boolean {
|
||||||
|
const message = error instanceof Error ? error.message : String(error);
|
||||||
|
return message.includes('getaddrinfo') || message.includes('ENOTFOUND');
|
||||||
|
}
|
||||||
|
|
||||||
const REQUEST_TIMEOUT = 30000;
|
const REQUEST_TIMEOUT = 30000;
|
||||||
|
|
||||||
export async function verifyIntegrity(
|
export async function verifyIntegrity(
|
||||||
@@ -22,6 +27,11 @@ export async function verifyIntegrity(
|
|||||||
throw new UnexpectedError('Checksum verification failed. Package integrity does not match.');
|
throw new UnexpectedError('Checksum verification failed. Package integrity does not match.');
|
||||||
}
|
}
|
||||||
} catch (error) {
|
} catch (error) {
|
||||||
|
if (isDnsError(error)) {
|
||||||
|
throw new UnexpectedError(
|
||||||
|
'Checksum verification failed. Please check your network connection and try again.',
|
||||||
|
);
|
||||||
|
}
|
||||||
throw new UnexpectedError('Checksum verification failed', { cause: error });
|
throw new UnexpectedError('Checksum verification failed', { cause: error });
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -43,6 +53,11 @@ export async function isVersionExists(
|
|||||||
cause: error,
|
cause: error,
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
if (isDnsError(error)) {
|
||||||
|
throw new UnexpectedError(
|
||||||
|
'The community nodes service is temporarily unreachable. Please try again later.',
|
||||||
|
);
|
||||||
|
}
|
||||||
throw new UnexpectedError('Failed to check package version existence', { cause: error });
|
throw new UnexpectedError('Failed to check package version existence', { cause: error });
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user