mirror of
https://github.com/n8n-io/n8n.git
synced 2024-12-25 12:44:07 -08:00
dff8456382
Ensure all errors in `core` and `workflow` inherit from `ApplicationError` so that we start normalizing all the errors we report to Sentry Follow-up to: https://github.com/n8n-io/n8n/pull/7757#discussion_r1404338844 ### `core` package `ApplicationError` - `FileSystemError` (abstract) - `FileNotFoundError` - `DisallowedFilepathError` - `BinaryDataError` (abstract) - `InvalidModeError` - `InvalidManagerError` - `InvalidExecutionMetadataError` ### `workflow` package `ApplicationError` - `ExecutionBaseError` (abstract) - `WorkflowActivationError` - `WorkflowDeactivationError` - `WebhookTakenError` - `WorkflowOperationError` - `SubworkflowOperationError` - `CliWorkflowOperationError` - `ExpressionError` - `ExpressionExtensionError` - `NodeError` (abstract) - `NodeOperationError` - `NodeApiError` - `NodeSSLError` Up next: - Reorganize errors in `cli` - Flatten the hierarchy in `workflow` (do we really need `ExecutionBaseError`?) - Remove `ExecutionError` type - Stop throwing plain `Error`s - Replace `severity` with `level` - Add node and credential types as `tags` - Add workflow IDs and execution IDs as `extras`
75 lines
2.2 KiB
TypeScript
75 lines
2.2 KiB
TypeScript
import type { IRunExecutionData } from 'n8n-workflow';
|
|
import { LoggerProxy as Logger } from 'n8n-workflow';
|
|
import { InvalidExecutionMetadataError } from './errors/invalid-execution-metadata.error';
|
|
|
|
export const KV_LIMIT = 10;
|
|
|
|
export function setWorkflowExecutionMetadata(
|
|
executionData: IRunExecutionData,
|
|
key: string,
|
|
value: unknown,
|
|
) {
|
|
if (!executionData.resultData.metadata) {
|
|
executionData.resultData.metadata = {};
|
|
}
|
|
// Currently limited to 10 metadata KVs
|
|
if (
|
|
!(key in executionData.resultData.metadata) &&
|
|
Object.keys(executionData.resultData.metadata).length >= KV_LIMIT
|
|
) {
|
|
return;
|
|
}
|
|
if (typeof key !== 'string') {
|
|
throw new InvalidExecutionMetadataError('key', key);
|
|
}
|
|
if (key.replace(/[A-Za-z0-9_]/g, '').length !== 0) {
|
|
throw new InvalidExecutionMetadataError(
|
|
'key',
|
|
key,
|
|
`Custom date key can only contain characters "A-Za-z0-9_" (key "${key}")`,
|
|
);
|
|
}
|
|
if (typeof value !== 'string' && typeof value !== 'number' && typeof value !== 'bigint') {
|
|
throw new InvalidExecutionMetadataError('value', key);
|
|
}
|
|
const val = String(value);
|
|
if (key.length > 50) {
|
|
Logger.error('Custom data key over 50 characters long. Truncating to 50 characters.');
|
|
}
|
|
if (val.length > 255) {
|
|
Logger.error('Custom data value over 255 characters long. Truncating to 255 characters.');
|
|
}
|
|
executionData.resultData.metadata[key.slice(0, 50)] = val.slice(0, 255);
|
|
}
|
|
|
|
export function setAllWorkflowExecutionMetadata(
|
|
executionData: IRunExecutionData,
|
|
obj: Record<string, string>,
|
|
) {
|
|
const errors: Error[] = [];
|
|
Object.entries(obj).forEach(([key, value]) => {
|
|
try {
|
|
setWorkflowExecutionMetadata(executionData, key, value);
|
|
} catch (e) {
|
|
errors.push(e as Error);
|
|
}
|
|
});
|
|
if (errors.length) {
|
|
throw errors[0];
|
|
}
|
|
}
|
|
|
|
export function getAllWorkflowExecutionMetadata(
|
|
executionData: IRunExecutionData,
|
|
): Record<string, string> {
|
|
// Make a copy so it can't be modified directly
|
|
return executionData.resultData.metadata ? { ...executionData.resultData.metadata } : {};
|
|
}
|
|
|
|
export function getWorkflowExecutionMetadata(
|
|
executionData: IRunExecutionData,
|
|
key: string,
|
|
): string {
|
|
return getAllWorkflowExecutionMetadata(executionData)[String(key).slice(0, 50)];
|
|
}
|