n8n-core 1.8.1 → 1.9.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/BinaryData/BinaryData.service.d.ts +24 -0
- package/dist/BinaryData/BinaryData.service.js +209 -0
- package/dist/BinaryData/BinaryData.service.js.map +1 -0
- package/dist/BinaryData/FileSystem.manager.d.ts +30 -0
- package/dist/BinaryData/FileSystem.manager.js +116 -0
- package/dist/BinaryData/FileSystem.manager.js.map +1 -0
- package/dist/BinaryData/errors.d.ts +6 -0
- package/dist/BinaryData/errors.js +17 -0
- package/dist/BinaryData/errors.js.map +1 -0
- package/dist/BinaryData/types.d.ts +39 -0
- package/dist/BinaryData/types.js +3 -0
- package/dist/BinaryData/types.js.map +1 -0
- package/dist/BinaryData/utils.d.ts +8 -0
- package/dist/BinaryData/utils.js +32 -0
- package/dist/BinaryData/utils.js.map +1 -0
- package/dist/Interfaces.d.ts +1 -26
- package/dist/LoadNodeDetails.d.ts +2 -2
- package/dist/LoadNodeDetails.js.map +1 -1
- package/dist/NodeExecuteFunctions.d.ts +6 -5
- package/dist/NodeExecuteFunctions.js +32 -30
- package/dist/NodeExecuteFunctions.js.map +1 -1
- package/dist/ObjectStore/ObjectStore.service.ee.d.ts +42 -0
- package/dist/ObjectStore/ObjectStore.service.ee.js +153 -0
- package/dist/ObjectStore/ObjectStore.service.ee.js.map +1 -0
- package/dist/ObjectStore/errors.d.ts +4 -0
- package/dist/ObjectStore/errors.js +11 -0
- package/dist/ObjectStore/errors.js.map +1 -0
- package/dist/ObjectStore/types.d.ts +32 -0
- package/dist/ObjectStore/types.js +3 -0
- package/dist/ObjectStore/types.js.map +1 -0
- package/dist/ObjectStore/utils.d.ts +4 -0
- package/dist/ObjectStore/utils.js +20 -0
- package/dist/ObjectStore/utils.js.map +1 -0
- package/dist/WorkflowExecute.d.ts +2 -1
- package/dist/WorkflowExecute.js +1 -0
- package/dist/WorkflowExecute.js.map +1 -1
- package/dist/decorators/LogCatch.decorator.d.ts +1 -0
- package/dist/decorators/LogCatch.decorator.js +27 -0
- package/dist/decorators/LogCatch.decorator.js.map +1 -0
- package/dist/index.d.ts +3 -1
- package/dist/index.js +5 -2
- package/dist/index.js.map +1 -1
- package/package.json +10 -5
- package/dist/BinaryDataManager/FileSystem.d.ts +0 -34
- package/dist/BinaryDataManager/FileSystem.js +0 -157
- package/dist/BinaryDataManager/FileSystem.js.map +0 -1
- package/dist/BinaryDataManager/index.d.ts +0 -28
- package/dist/BinaryDataManager/index.js +0 -180
- package/dist/BinaryDataManager/index.js.map +0 -1
- package/dist/BinaryDataManager/utils.d.ts +0 -2
- package/dist/BinaryDataManager/utils.js +0 -15
- package/dist/BinaryDataManager/utils.js.map +0 -1
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
/// <reference types="node" />
|
|
2
|
+
/// <reference types="node" />
|
|
3
|
+
import { IBinaryData } from 'n8n-workflow';
|
|
4
|
+
import type { Readable } from 'stream';
|
|
5
|
+
import type { BinaryData } from './types';
|
|
6
|
+
import type { INodeExecutionData } from 'n8n-workflow';
|
|
7
|
+
export declare class BinaryDataService {
|
|
8
|
+
private mode;
|
|
9
|
+
private managers;
|
|
10
|
+
init(config: BinaryData.Config): Promise<void>;
|
|
11
|
+
copyBinaryFile(workflowId: string, executionId: string, binaryData: IBinaryData, filePath: string): Promise<IBinaryData>;
|
|
12
|
+
store(workflowId: string, executionId: string, bufferOrStream: Buffer | Readable, binaryData: IBinaryData): Promise<IBinaryData>;
|
|
13
|
+
toBuffer(bufferOrStream: Buffer | Readable): Promise<Buffer>;
|
|
14
|
+
getAsStream(binaryDataId: string, chunkSize?: number): Promise<Readable>;
|
|
15
|
+
getAsBuffer(binaryData: IBinaryData): Promise<Buffer>;
|
|
16
|
+
getPath(binaryDataId: string): string;
|
|
17
|
+
getMetadata(binaryDataId: string): Promise<BinaryData.Metadata>;
|
|
18
|
+
deleteMany(ids: BinaryData.IdsForDeletion): Promise<void>;
|
|
19
|
+
duplicateBinaryData(workflowId: string, executionId: string, inputData: Array<INodeExecutionData[] | null>): Promise<INodeExecutionData[][]>;
|
|
20
|
+
rename(oldFileId: string, newFileId: string): Promise<void>;
|
|
21
|
+
private createBinaryDataId;
|
|
22
|
+
private duplicateBinaryDataInExecData;
|
|
23
|
+
private getManager;
|
|
24
|
+
}
|
|
@@ -0,0 +1,209 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
+
}
|
|
8
|
+
Object.defineProperty(o, k2, desc);
|
|
9
|
+
}) : (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
o[k2] = m[k];
|
|
12
|
+
}));
|
|
13
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
14
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
15
|
+
}) : function(o, v) {
|
|
16
|
+
o["default"] = v;
|
|
17
|
+
});
|
|
18
|
+
var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
|
|
19
|
+
var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
|
|
20
|
+
if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
|
|
21
|
+
else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
|
|
22
|
+
return c > 3 && r && Object.defineProperty(target, key, r), r;
|
|
23
|
+
};
|
|
24
|
+
var __importStar = (this && this.__importStar) || function (mod) {
|
|
25
|
+
if (mod && mod.__esModule) return mod;
|
|
26
|
+
var result = {};
|
|
27
|
+
if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
|
|
28
|
+
__setModuleDefault(result, mod);
|
|
29
|
+
return result;
|
|
30
|
+
};
|
|
31
|
+
var __metadata = (this && this.__metadata) || function (k, v) {
|
|
32
|
+
if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
|
|
33
|
+
};
|
|
34
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
35
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
36
|
+
};
|
|
37
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
38
|
+
exports.BinaryDataService = void 0;
|
|
39
|
+
const promises_1 = require("fs/promises");
|
|
40
|
+
const pretty_bytes_1 = __importDefault(require("pretty-bytes"));
|
|
41
|
+
const typedi_1 = require("typedi");
|
|
42
|
+
const n8n_workflow_1 = require("n8n-workflow");
|
|
43
|
+
const errors_1 = require("./errors");
|
|
44
|
+
const LogCatch_decorator_1 = require("../decorators/LogCatch.decorator");
|
|
45
|
+
const utils_1 = require("./utils");
|
|
46
|
+
let BinaryDataService = class BinaryDataService {
|
|
47
|
+
constructor() {
|
|
48
|
+
this.mode = 'default';
|
|
49
|
+
this.managers = {};
|
|
50
|
+
}
|
|
51
|
+
async init(config) {
|
|
52
|
+
if (!(0, utils_1.areValidModes)(config.availableModes))
|
|
53
|
+
throw new errors_1.InvalidBinaryDataMode();
|
|
54
|
+
this.mode = config.mode;
|
|
55
|
+
if (config.availableModes.includes('filesystem')) {
|
|
56
|
+
const { FileSystemManager } = await Promise.resolve().then(() => __importStar(require('./FileSystem.manager')));
|
|
57
|
+
this.managers.filesystem = new FileSystemManager(config.localStoragePath);
|
|
58
|
+
await this.managers.filesystem.init();
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
async copyBinaryFile(workflowId, executionId, binaryData, filePath) {
|
|
62
|
+
const manager = this.managers[this.mode];
|
|
63
|
+
if (!manager) {
|
|
64
|
+
const { size } = await (0, promises_1.stat)(filePath);
|
|
65
|
+
binaryData.fileSize = (0, pretty_bytes_1.default)(size);
|
|
66
|
+
binaryData.data = await (0, promises_1.readFile)(filePath, { encoding: n8n_workflow_1.BINARY_ENCODING });
|
|
67
|
+
return binaryData;
|
|
68
|
+
}
|
|
69
|
+
const metadata = {
|
|
70
|
+
fileName: binaryData.fileName,
|
|
71
|
+
mimeType: binaryData.mimeType,
|
|
72
|
+
};
|
|
73
|
+
const { fileId, fileSize } = await manager.copyByFilePath(workflowId, executionId, filePath, metadata);
|
|
74
|
+
binaryData.id = this.createBinaryDataId(fileId);
|
|
75
|
+
binaryData.fileSize = (0, pretty_bytes_1.default)(fileSize);
|
|
76
|
+
binaryData.data = this.mode;
|
|
77
|
+
return binaryData;
|
|
78
|
+
}
|
|
79
|
+
async store(workflowId, executionId, bufferOrStream, binaryData) {
|
|
80
|
+
const manager = this.managers[this.mode];
|
|
81
|
+
if (!manager) {
|
|
82
|
+
const buffer = await this.toBuffer(bufferOrStream);
|
|
83
|
+
binaryData.data = buffer.toString(n8n_workflow_1.BINARY_ENCODING);
|
|
84
|
+
binaryData.fileSize = (0, pretty_bytes_1.default)(buffer.length);
|
|
85
|
+
return binaryData;
|
|
86
|
+
}
|
|
87
|
+
const metadata = {
|
|
88
|
+
fileName: binaryData.fileName,
|
|
89
|
+
mimeType: binaryData.mimeType,
|
|
90
|
+
};
|
|
91
|
+
const { fileId, fileSize } = await manager.store(workflowId, executionId, bufferOrStream, metadata);
|
|
92
|
+
binaryData.id = this.createBinaryDataId(fileId);
|
|
93
|
+
binaryData.fileSize = (0, pretty_bytes_1.default)(fileSize);
|
|
94
|
+
binaryData.data = this.mode;
|
|
95
|
+
return binaryData;
|
|
96
|
+
}
|
|
97
|
+
async toBuffer(bufferOrStream) {
|
|
98
|
+
return (0, utils_1.toBuffer)(bufferOrStream);
|
|
99
|
+
}
|
|
100
|
+
async getAsStream(binaryDataId, chunkSize) {
|
|
101
|
+
const [mode, fileId] = binaryDataId.split(':');
|
|
102
|
+
return this.getManager(mode).getAsStream(fileId, chunkSize);
|
|
103
|
+
}
|
|
104
|
+
async getAsBuffer(binaryData) {
|
|
105
|
+
if (binaryData.id) {
|
|
106
|
+
const [mode, fileId] = binaryData.id.split(':');
|
|
107
|
+
return this.getManager(mode).getAsBuffer(fileId);
|
|
108
|
+
}
|
|
109
|
+
return Buffer.from(binaryData.data, n8n_workflow_1.BINARY_ENCODING);
|
|
110
|
+
}
|
|
111
|
+
getPath(binaryDataId) {
|
|
112
|
+
const [mode, fileId] = binaryDataId.split(':');
|
|
113
|
+
return this.getManager(mode).getPath(fileId);
|
|
114
|
+
}
|
|
115
|
+
async getMetadata(binaryDataId) {
|
|
116
|
+
const [mode, fileId] = binaryDataId.split(':');
|
|
117
|
+
return this.getManager(mode).getMetadata(fileId);
|
|
118
|
+
}
|
|
119
|
+
async deleteMany(ids) {
|
|
120
|
+
const manager = this.managers[this.mode];
|
|
121
|
+
if (!manager)
|
|
122
|
+
return;
|
|
123
|
+
await manager.deleteMany(ids);
|
|
124
|
+
}
|
|
125
|
+
async duplicateBinaryData(workflowId, executionId, inputData) {
|
|
126
|
+
if (inputData && this.managers[this.mode]) {
|
|
127
|
+
const returnInputData = inputData.map(async (executionDataArray) => {
|
|
128
|
+
if (executionDataArray) {
|
|
129
|
+
return Promise.all(executionDataArray.map(async (executionData) => {
|
|
130
|
+
if (executionData.binary) {
|
|
131
|
+
return this.duplicateBinaryDataInExecData(workflowId, executionId, executionData);
|
|
132
|
+
}
|
|
133
|
+
return executionData;
|
|
134
|
+
}));
|
|
135
|
+
}
|
|
136
|
+
return executionDataArray;
|
|
137
|
+
});
|
|
138
|
+
return Promise.all(returnInputData);
|
|
139
|
+
}
|
|
140
|
+
return inputData;
|
|
141
|
+
}
|
|
142
|
+
async rename(oldFileId, newFileId) {
|
|
143
|
+
const manager = this.getManager(this.mode);
|
|
144
|
+
if (!manager)
|
|
145
|
+
return;
|
|
146
|
+
await manager.rename(oldFileId, newFileId);
|
|
147
|
+
}
|
|
148
|
+
createBinaryDataId(fileId) {
|
|
149
|
+
return `${this.mode}:${fileId}`;
|
|
150
|
+
}
|
|
151
|
+
async duplicateBinaryDataInExecData(workflowId, executionId, executionData) {
|
|
152
|
+
const manager = this.managers[this.mode];
|
|
153
|
+
if (executionData.binary) {
|
|
154
|
+
const binaryDataKeys = Object.keys(executionData.binary);
|
|
155
|
+
const bdPromises = binaryDataKeys.map(async (key) => {
|
|
156
|
+
if (!executionData.binary) {
|
|
157
|
+
return { key, newId: undefined };
|
|
158
|
+
}
|
|
159
|
+
const binaryDataId = executionData.binary[key].id;
|
|
160
|
+
if (!binaryDataId) {
|
|
161
|
+
return { key, newId: undefined };
|
|
162
|
+
}
|
|
163
|
+
const [_mode, fileId] = binaryDataId.split(':');
|
|
164
|
+
return manager === null || manager === void 0 ? void 0 : manager.copyByFileId(workflowId, executionId, fileId).then((newFileId) => ({
|
|
165
|
+
newId: this.createBinaryDataId(newFileId),
|
|
166
|
+
key,
|
|
167
|
+
}));
|
|
168
|
+
});
|
|
169
|
+
return Promise.all(bdPromises).then((b) => {
|
|
170
|
+
return b.reduce((acc, curr) => {
|
|
171
|
+
if (acc.binary && curr) {
|
|
172
|
+
acc.binary[curr.key].id = curr.newId;
|
|
173
|
+
}
|
|
174
|
+
return acc;
|
|
175
|
+
}, executionData);
|
|
176
|
+
});
|
|
177
|
+
}
|
|
178
|
+
return executionData;
|
|
179
|
+
}
|
|
180
|
+
getManager(mode) {
|
|
181
|
+
const manager = this.managers[mode];
|
|
182
|
+
if (manager)
|
|
183
|
+
return manager;
|
|
184
|
+
throw new errors_1.UnknownBinaryDataManager(mode);
|
|
185
|
+
}
|
|
186
|
+
};
|
|
187
|
+
exports.BinaryDataService = BinaryDataService;
|
|
188
|
+
__decorate([
|
|
189
|
+
(0, LogCatch_decorator_1.LogCatch)((error) => n8n_workflow_1.LoggerProxy.error('Failed to copy binary data file', { error })),
|
|
190
|
+
__metadata("design:type", Function),
|
|
191
|
+
__metadata("design:paramtypes", [String, String, Object, String]),
|
|
192
|
+
__metadata("design:returntype", Promise)
|
|
193
|
+
], BinaryDataService.prototype, "copyBinaryFile", null);
|
|
194
|
+
__decorate([
|
|
195
|
+
(0, LogCatch_decorator_1.LogCatch)((error) => n8n_workflow_1.LoggerProxy.error('Failed to write binary data file', { error })),
|
|
196
|
+
__metadata("design:type", Function),
|
|
197
|
+
__metadata("design:paramtypes", [String, String, Object, Object]),
|
|
198
|
+
__metadata("design:returntype", Promise)
|
|
199
|
+
], BinaryDataService.prototype, "store", null);
|
|
200
|
+
__decorate([
|
|
201
|
+
(0, LogCatch_decorator_1.LogCatch)((error) => n8n_workflow_1.LoggerProxy.error('Failed to copy all binary data files for execution', { error })),
|
|
202
|
+
__metadata("design:type", Function),
|
|
203
|
+
__metadata("design:paramtypes", [String, String, Array]),
|
|
204
|
+
__metadata("design:returntype", Promise)
|
|
205
|
+
], BinaryDataService.prototype, "duplicateBinaryData", null);
|
|
206
|
+
exports.BinaryDataService = BinaryDataService = __decorate([
|
|
207
|
+
(0, typedi_1.Service)()
|
|
208
|
+
], BinaryDataService);
|
|
209
|
+
//# sourceMappingURL=BinaryData.service.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"BinaryData.service.js","sourceRoot":"","sources":["../../src/BinaryData/BinaryData.service.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
/// <reference types="node" />
|
|
2
|
+
/// <reference types="node" />
|
|
3
|
+
/// <reference types="node" />
|
|
4
|
+
import type { Readable } from 'stream';
|
|
5
|
+
import type { BinaryData } from './types';
|
|
6
|
+
export declare class FileSystemManager implements BinaryData.Manager {
|
|
7
|
+
private storagePath;
|
|
8
|
+
constructor(storagePath: string);
|
|
9
|
+
init(): Promise<void>;
|
|
10
|
+
getPath(fileId: string): string;
|
|
11
|
+
getAsStream(fileId: string, chunkSize?: number): Promise<import("fs").ReadStream>;
|
|
12
|
+
getAsBuffer(fileId: string): Promise<Buffer>;
|
|
13
|
+
getMetadata(fileId: string): Promise<BinaryData.Metadata>;
|
|
14
|
+
store(_workflowId: string, executionId: string, bufferOrStream: Buffer | Readable, { mimeType, fileName }: BinaryData.PreWriteMetadata): Promise<{
|
|
15
|
+
fileId: string;
|
|
16
|
+
fileSize: number;
|
|
17
|
+
}>;
|
|
18
|
+
deleteOne(fileId: string): Promise<void>;
|
|
19
|
+
deleteMany(ids: BinaryData.IdsForDeletion): Promise<void>;
|
|
20
|
+
copyByFilePath(_workflowId: string, executionId: string, filePath: string, { mimeType, fileName }: BinaryData.PreWriteMetadata): Promise<{
|
|
21
|
+
fileId: string;
|
|
22
|
+
fileSize: number;
|
|
23
|
+
}>;
|
|
24
|
+
copyByFileId(_workflowId: string, executionId: string, sourceFileId: string): Promise<string>;
|
|
25
|
+
rename(oldFileId: string, newFileId: string): Promise<void>;
|
|
26
|
+
private toFileId;
|
|
27
|
+
private resolvePath;
|
|
28
|
+
private storeMetadata;
|
|
29
|
+
private getSize;
|
|
30
|
+
}
|
|
@@ -0,0 +1,116 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
exports.FileSystemManager = void 0;
|
|
7
|
+
const fs_1 = require("fs");
|
|
8
|
+
const promises_1 = __importDefault(require("fs/promises"));
|
|
9
|
+
const path_1 = __importDefault(require("path"));
|
|
10
|
+
const uuid_1 = require("uuid");
|
|
11
|
+
const n8n_workflow_1 = require("n8n-workflow");
|
|
12
|
+
const promises_2 = require("node:fs/promises");
|
|
13
|
+
const errors_1 = require("../errors");
|
|
14
|
+
const utils_1 = require("./utils");
|
|
15
|
+
const EXECUTION_ID_EXTRACTOR = /^(\w+)(?:[0-9a-fA-F]{8}\b-[0-9a-fA-F]{4}\b-[0-9a-fA-F]{4}\b-[0-9a-fA-F]{4}\b-[0-9a-fA-F]{12})$/;
|
|
16
|
+
class FileSystemManager {
|
|
17
|
+
constructor(storagePath) {
|
|
18
|
+
this.storagePath = storagePath;
|
|
19
|
+
}
|
|
20
|
+
async init() {
|
|
21
|
+
await (0, utils_1.ensureDirExists)(this.storagePath);
|
|
22
|
+
}
|
|
23
|
+
getPath(fileId) {
|
|
24
|
+
return this.resolvePath(fileId);
|
|
25
|
+
}
|
|
26
|
+
async getAsStream(fileId, chunkSize) {
|
|
27
|
+
const filePath = this.getPath(fileId);
|
|
28
|
+
return (0, fs_1.createReadStream)(filePath, { highWaterMark: chunkSize });
|
|
29
|
+
}
|
|
30
|
+
async getAsBuffer(fileId) {
|
|
31
|
+
const filePath = this.getPath(fileId);
|
|
32
|
+
try {
|
|
33
|
+
return await promises_1.default.readFile(filePath);
|
|
34
|
+
}
|
|
35
|
+
catch {
|
|
36
|
+
throw new Error(`Error finding file: ${filePath}`);
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
async getMetadata(fileId) {
|
|
40
|
+
const filePath = this.resolvePath(`${fileId}.metadata`);
|
|
41
|
+
return (0, n8n_workflow_1.jsonParse)(await promises_1.default.readFile(filePath, { encoding: 'utf-8' }));
|
|
42
|
+
}
|
|
43
|
+
async store(_workflowId, executionId, bufferOrStream, { mimeType, fileName }) {
|
|
44
|
+
const fileId = this.toFileId(executionId);
|
|
45
|
+
const filePath = this.getPath(fileId);
|
|
46
|
+
await promises_1.default.writeFile(filePath, bufferOrStream);
|
|
47
|
+
const fileSize = await this.getSize(fileId);
|
|
48
|
+
await this.storeMetadata(fileId, { mimeType, fileName, fileSize });
|
|
49
|
+
return { fileId, fileSize };
|
|
50
|
+
}
|
|
51
|
+
async deleteOne(fileId) {
|
|
52
|
+
const filePath = this.getPath(fileId);
|
|
53
|
+
return promises_1.default.rm(filePath);
|
|
54
|
+
}
|
|
55
|
+
async deleteMany(ids) {
|
|
56
|
+
var _a;
|
|
57
|
+
const executionIds = ids.map((o) => o.executionId);
|
|
58
|
+
const set = new Set(executionIds);
|
|
59
|
+
const fileNames = await promises_1.default.readdir(this.storagePath);
|
|
60
|
+
for (const fileName of fileNames) {
|
|
61
|
+
const executionId = (_a = fileName.match(EXECUTION_ID_EXTRACTOR)) === null || _a === void 0 ? void 0 : _a[1];
|
|
62
|
+
if (executionId && set.has(executionId)) {
|
|
63
|
+
const filePath = this.resolvePath(fileName);
|
|
64
|
+
await Promise.all([promises_1.default.rm(filePath), promises_1.default.rm(`${filePath}.metadata`)]);
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
async copyByFilePath(_workflowId, executionId, filePath, { mimeType, fileName }) {
|
|
69
|
+
const newFileId = this.toFileId(executionId);
|
|
70
|
+
await promises_1.default.cp(filePath, this.getPath(newFileId));
|
|
71
|
+
const fileSize = await this.getSize(newFileId);
|
|
72
|
+
await this.storeMetadata(newFileId, { mimeType, fileName, fileSize });
|
|
73
|
+
return { fileId: newFileId, fileSize };
|
|
74
|
+
}
|
|
75
|
+
async copyByFileId(_workflowId, executionId, sourceFileId) {
|
|
76
|
+
const targetFileId = this.toFileId(executionId);
|
|
77
|
+
const sourcePath = this.resolvePath(sourceFileId);
|
|
78
|
+
const targetPath = this.resolvePath(targetFileId);
|
|
79
|
+
await promises_1.default.copyFile(sourcePath, targetPath);
|
|
80
|
+
return targetFileId;
|
|
81
|
+
}
|
|
82
|
+
async rename(oldFileId, newFileId) {
|
|
83
|
+
const oldPath = this.getPath(oldFileId);
|
|
84
|
+
const newPath = this.getPath(newFileId);
|
|
85
|
+
await Promise.all([
|
|
86
|
+
(0, promises_2.rename)(oldPath, newPath),
|
|
87
|
+
(0, promises_2.rename)(`${oldPath}.metadata`, `${newPath}.metadata`),
|
|
88
|
+
]);
|
|
89
|
+
}
|
|
90
|
+
toFileId(executionId) {
|
|
91
|
+
return [executionId, (0, uuid_1.v4)()].join('');
|
|
92
|
+
}
|
|
93
|
+
resolvePath(...args) {
|
|
94
|
+
const returnPath = path_1.default.join(this.storagePath, ...args);
|
|
95
|
+
if (path_1.default.relative(this.storagePath, returnPath).startsWith('..')) {
|
|
96
|
+
throw new errors_1.FileNotFoundError('Invalid path detected');
|
|
97
|
+
}
|
|
98
|
+
return returnPath;
|
|
99
|
+
}
|
|
100
|
+
async storeMetadata(fileId, metadata) {
|
|
101
|
+
const filePath = this.resolvePath(`${fileId}.metadata`);
|
|
102
|
+
await promises_1.default.writeFile(filePath, JSON.stringify(metadata), { encoding: 'utf-8' });
|
|
103
|
+
}
|
|
104
|
+
async getSize(fileId) {
|
|
105
|
+
const filePath = this.getPath(fileId);
|
|
106
|
+
try {
|
|
107
|
+
const stats = await promises_1.default.stat(filePath);
|
|
108
|
+
return stats.size;
|
|
109
|
+
}
|
|
110
|
+
catch (error) {
|
|
111
|
+
throw new Error('Failed to find binary data file in filesystem', { cause: error });
|
|
112
|
+
}
|
|
113
|
+
}
|
|
114
|
+
}
|
|
115
|
+
exports.FileSystemManager = FileSystemManager;
|
|
116
|
+
//# sourceMappingURL=FileSystem.manager.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"FileSystem.manager.js","sourceRoot":"","sources":["../../src/BinaryData/FileSystem.manager.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.UnknownBinaryDataManager = exports.InvalidBinaryDataMode = void 0;
|
|
4
|
+
const utils_1 = require("./utils");
|
|
5
|
+
class InvalidBinaryDataMode extends Error {
|
|
6
|
+
constructor() {
|
|
7
|
+
super(`Invalid binary data mode. Valid modes: ${utils_1.BINARY_DATA_MODES.join(', ')}`);
|
|
8
|
+
}
|
|
9
|
+
}
|
|
10
|
+
exports.InvalidBinaryDataMode = InvalidBinaryDataMode;
|
|
11
|
+
class UnknownBinaryDataManager extends Error {
|
|
12
|
+
constructor(mode) {
|
|
13
|
+
super(`No binary data manager found for: ${mode}`);
|
|
14
|
+
}
|
|
15
|
+
}
|
|
16
|
+
exports.UnknownBinaryDataManager = UnknownBinaryDataManager;
|
|
17
|
+
//# sourceMappingURL=errors.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"errors.js","sourceRoot":"","sources":["../../src/BinaryData/errors.ts"],"names":[],"mappings":";;;AAAA,mCAA4C;AAE5C,MAAa,qBAAsB,SAAQ,KAAK;IAC/C;QACC,KAAK,CAAC,0CAA0C,yBAAiB,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IACjF,CAAC;CACD;AAJD,sDAIC;AAED,MAAa,wBAAyB,SAAQ,KAAK;IAClD,YAAY,IAAY;QACvB,KAAK,CAAC,qCAAqC,IAAI,EAAE,CAAC,CAAC;IACpD,CAAC;CACD;AAJD,4DAIC"}
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
/// <reference types="node" />
|
|
2
|
+
/// <reference types="node" />
|
|
3
|
+
import type { Readable } from 'stream';
|
|
4
|
+
import type { BINARY_DATA_MODES } from './utils';
|
|
5
|
+
export declare namespace BinaryData {
|
|
6
|
+
type Mode = (typeof BINARY_DATA_MODES)[number];
|
|
7
|
+
type Config = {
|
|
8
|
+
mode: 'default' | 'filesystem';
|
|
9
|
+
availableModes: string[];
|
|
10
|
+
localStoragePath: string;
|
|
11
|
+
};
|
|
12
|
+
type Metadata = {
|
|
13
|
+
fileName?: string;
|
|
14
|
+
mimeType?: string;
|
|
15
|
+
fileSize: number;
|
|
16
|
+
};
|
|
17
|
+
type WriteResult = {
|
|
18
|
+
fileId: string;
|
|
19
|
+
fileSize: number;
|
|
20
|
+
};
|
|
21
|
+
type PreWriteMetadata = Omit<Metadata, 'fileSize'>;
|
|
22
|
+
type IdsForDeletion = Array<{
|
|
23
|
+
workflowId: string;
|
|
24
|
+
executionId: string;
|
|
25
|
+
}>;
|
|
26
|
+
interface Manager {
|
|
27
|
+
init(): Promise<void>;
|
|
28
|
+
store(workflowId: string, executionId: string, bufferOrStream: Buffer | Readable, metadata: PreWriteMetadata): Promise<WriteResult>;
|
|
29
|
+
getPath(fileId: string): string;
|
|
30
|
+
getAsBuffer(fileId: string): Promise<Buffer>;
|
|
31
|
+
getAsStream(fileId: string, chunkSize?: number): Promise<Readable>;
|
|
32
|
+
getMetadata(fileId: string): Promise<Metadata>;
|
|
33
|
+
copyByFileId(workflowId: string, executionId: string, sourceFileId: string): Promise<string>;
|
|
34
|
+
copyByFilePath(workflowId: string, executionId: string, filePath: string, metadata: PreWriteMetadata): Promise<WriteResult>;
|
|
35
|
+
deleteOne(fileId: string): Promise<void>;
|
|
36
|
+
deleteMany(ids: IdsForDeletion): Promise<void>;
|
|
37
|
+
rename(oldFileId: string, newFileId: string): Promise<void>;
|
|
38
|
+
}
|
|
39
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/BinaryData/types.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
/// <reference types="node" />
|
|
2
|
+
/// <reference types="node" />
|
|
3
|
+
import type { Readable } from 'node:stream';
|
|
4
|
+
import type { BinaryData } from './types';
|
|
5
|
+
export declare const BINARY_DATA_MODES: readonly ["default", "filesystem", "s3"];
|
|
6
|
+
export declare function areValidModes(modes: string[]): modes is BinaryData.Mode[];
|
|
7
|
+
export declare function ensureDirExists(dir: string): Promise<void>;
|
|
8
|
+
export declare function toBuffer(body: Buffer | Readable): Promise<Buffer>;
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
exports.toBuffer = exports.ensureDirExists = exports.areValidModes = exports.BINARY_DATA_MODES = void 0;
|
|
7
|
+
const promises_1 = __importDefault(require("node:fs/promises"));
|
|
8
|
+
const concat_stream_1 = __importDefault(require("concat-stream"));
|
|
9
|
+
exports.BINARY_DATA_MODES = ['default', 'filesystem', 's3'];
|
|
10
|
+
function areValidModes(modes) {
|
|
11
|
+
return modes.every((m) => exports.BINARY_DATA_MODES.includes(m));
|
|
12
|
+
}
|
|
13
|
+
exports.areValidModes = areValidModes;
|
|
14
|
+
async function ensureDirExists(dir) {
|
|
15
|
+
try {
|
|
16
|
+
await promises_1.default.access(dir);
|
|
17
|
+
}
|
|
18
|
+
catch {
|
|
19
|
+
await promises_1.default.mkdir(dir, { recursive: true });
|
|
20
|
+
}
|
|
21
|
+
}
|
|
22
|
+
exports.ensureDirExists = ensureDirExists;
|
|
23
|
+
async function toBuffer(body) {
|
|
24
|
+
return new Promise((resolve) => {
|
|
25
|
+
if (Buffer.isBuffer(body))
|
|
26
|
+
resolve(body);
|
|
27
|
+
else
|
|
28
|
+
body.pipe((0, concat_stream_1.default)(resolve));
|
|
29
|
+
});
|
|
30
|
+
}
|
|
31
|
+
exports.toBuffer = toBuffer;
|
|
32
|
+
//# sourceMappingURL=utils.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"utils.js","sourceRoot":"","sources":["../../src/BinaryData/utils.ts"],"names":[],"mappings":";;;;;;AAAA,gEAAkC;AAGlC,kEAAyC;AAQ5B,QAAA,iBAAiB,GAAG,CAAC,SAAS,EAAE,YAAY,EAAE,IAAI,CAAU,CAAC;AAE1E,SAAgB,aAAa,CAAC,KAAe;IAC5C,OAAO,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,yBAAiB,CAAC,QAAQ,CAAC,CAAoB,CAAC,CAAC,CAAC;AAC7E,CAAC;AAFD,sCAEC;AAEM,KAAK,UAAU,eAAe,CAAC,GAAW;IAChD,IAAI;QACH,MAAM,kBAAE,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;KACrB;IAAC,MAAM;QACP,MAAM,kBAAE,CAAC,KAAK,CAAC,GAAG,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;KACzC;AACF,CAAC;AAND,0CAMC;AAEM,KAAK,UAAU,QAAQ,CAAC,IAAuB;IACrD,OAAO,IAAI,OAAO,CAAS,CAAC,OAAO,EAAE,EAAE;QACtC,IAAI,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC;YAAE,OAAO,CAAC,IAAI,CAAC,CAAC;;YACpC,IAAI,CAAC,IAAI,CAAC,IAAA,uBAAY,EAAC,OAAO,CAAC,CAAC,CAAC;IACvC,CAAC,CAAC,CAAC;AACJ,CAAC;AALD,4BAKC"}
|
package/dist/Interfaces.d.ts
CHANGED
|
@@ -1,7 +1,4 @@
|
|
|
1
|
-
|
|
2
|
-
/// <reference types="node" />
|
|
3
|
-
import type { Readable } from 'stream';
|
|
4
|
-
import type { IPollResponse, ITriggerResponse, IWorkflowSettings as IWorkflowSettingsWorkflow, BinaryMetadata, ValidationResult } from 'n8n-workflow';
|
|
1
|
+
import type { IPollResponse, ITriggerResponse, IWorkflowSettings as IWorkflowSettingsWorkflow, ValidationResult } from 'n8n-workflow';
|
|
5
2
|
export interface IProcessMessage {
|
|
6
3
|
data?: any;
|
|
7
4
|
type: string;
|
|
@@ -23,28 +20,6 @@ export interface IWorkflowData {
|
|
|
23
20
|
pollResponses?: IPollResponse[];
|
|
24
21
|
triggerResponses?: ITriggerResponse[];
|
|
25
22
|
}
|
|
26
|
-
export interface IBinaryDataConfig {
|
|
27
|
-
mode: 'default' | 'filesystem';
|
|
28
|
-
availableModes: string;
|
|
29
|
-
localStoragePath: string;
|
|
30
|
-
binaryDataTTL: number;
|
|
31
|
-
}
|
|
32
|
-
export interface IBinaryDataManager {
|
|
33
|
-
init(startPurger: boolean): Promise<void>;
|
|
34
|
-
getFileSize(filePath: string): Promise<number>;
|
|
35
|
-
copyBinaryFile(filePath: string, executionId: string): Promise<string>;
|
|
36
|
-
storeBinaryMetadata(identifier: string, metadata: BinaryMetadata): Promise<void>;
|
|
37
|
-
getBinaryMetadata(identifier: string): Promise<BinaryMetadata>;
|
|
38
|
-
storeBinaryData(binaryData: Buffer | Readable, executionId: string): Promise<string>;
|
|
39
|
-
retrieveBinaryDataByIdentifier(identifier: string): Promise<Buffer>;
|
|
40
|
-
getBinaryPath(identifier: string): string;
|
|
41
|
-
getBinaryStream(identifier: string, chunkSize?: number): Readable;
|
|
42
|
-
markDataForDeletionByExecutionId(executionId: string): Promise<void>;
|
|
43
|
-
deleteMarkedFiles(): Promise<unknown>;
|
|
44
|
-
deleteBinaryDataByIdentifier(identifier: string): Promise<void>;
|
|
45
|
-
duplicateBinaryDataByIdentifier(binaryDataId: string, prefix: string): Promise<string>;
|
|
46
|
-
deleteBinaryDataByExecutionIds(executionIds: string[]): Promise<string[]>;
|
|
47
|
-
}
|
|
48
23
|
export declare namespace n8n {
|
|
49
24
|
interface PackageJson {
|
|
50
25
|
name: string;
|
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import type { INode
|
|
2
|
-
import { Workflow } from 'n8n-workflow';
|
|
1
|
+
import type { INode } from 'n8n-workflow';
|
|
2
|
+
import { Workflow, INodeCredentials, INodeParameters, INodeTypeNameVersion, INodeTypes } from 'n8n-workflow';
|
|
3
3
|
export declare abstract class LoadNodeDetails {
|
|
4
4
|
path: string;
|
|
5
5
|
workflow: Workflow;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"LoadNodeDetails.js","sourceRoot":"","sources":["../src/LoadNodeDetails.ts"],"names":[],"mappings":";;;
|
|
1
|
+
{"version":3,"file":"LoadNodeDetails.js","sourceRoot":"","sources":["../src/LoadNodeDetails.ts"],"names":[],"mappings":";;;AACA,+CAMsB;AAEtB,MAAM,cAAc,GAAG,WAAW,CAAC;AACnC,MAAM,kBAAkB,GAAG,eAAe,CAAC;AAE3C,MAAsB,eAAe;IAKpC,YACC,sBAA4C,EAC5C,SAAqB,EACrB,IAAY,EACZ,qBAAsC,EACtC,WAA8B;QAE9B,MAAM,QAAQ,GAAG,SAAS,CAAC,mBAAmB,CAC7C,sBAAsB,CAAC,IAAI,EAC3B,sBAAsB,CAAC,OAAO,CAC9B,CAAC;QAEF,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC;QAEjB,IAAI,QAAQ,KAAK,SAAS,EAAE;YAC3B,MAAM,IAAI,KAAK,CACd,kBAAkB,sBAAsB,CAAC,IAAI,KAAK,sBAAsB,CAAC,OAAO,kBAAkB,CAClG,CAAC;SACF;QAED,MAAM,QAAQ,GAAU;YACvB,UAAU,EAAE,qBAAqB;YACjC,EAAE,EAAE,WAAW;YACf,IAAI,EAAE,cAAc;YACpB,IAAI,EAAE,sBAAsB,CAAC,IAAI;YACjC,WAAW,EAAE,sBAAsB,CAAC,OAAO;YAC3C,QAAQ,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC;SAChB,CAAC;QAEF,IAAI,WAAW,EAAE;YAChB,QAAQ,CAAC,WAAW,GAAG,WAAW,CAAC;SACnC;QAED,MAAM,YAAY,GAAG;YACpB,KAAK,EAAE,CAAC,QAAQ,CAAC;YACjB,WAAW,EAAE,EAAE;SACf,CAAC;QAEF,IAAI,CAAC,QAAQ,GAAG,IAAI,uBAAQ,CAAC;YAC5B,KAAK,EAAE,YAAY,CAAC,KAAK;YACzB,WAAW,EAAE,YAAY,CAAC,WAAW;YACrC,MAAM,EAAE,KAAK;YACb,SAAS;SACT,CAAC,CAAC;IACJ,CAAC;IAKD,eAAe;QACd,OAAO;YACN,IAAI,EAAE,kBAAkB;YACxB,MAAM,EAAE,KAAK;YACb,WAAW,EAAE,EAAE;YACf,KAAK,EAAE,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC;YACzC,SAAS,EAAE,IAAI,IAAI,EAAE;YACrB,SAAS,EAAE,IAAI,IAAI,EAAE;SACrB,CAAC;IACH,CAAC;IAES,WAAW;QACpB,OAAO,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,cAAc,CAAE,CAAC;IAC/C,CAAC;CACD;AApED,0CAoEC"}
|
|
@@ -1,19 +1,20 @@
|
|
|
1
1
|
/// <reference types="node" />
|
|
2
2
|
/// <reference types="node" />
|
|
3
3
|
import { IncomingMessage } from 'http';
|
|
4
|
-
import type {
|
|
4
|
+
import type { IAdditionalCredentialOptions, IAllExecuteFunctions, IBinaryData, ICredentialDataDecryptedObject, ICredentialTestFunctions, IDataObject, IExecuteData, IExecuteFunctions, IExecuteSingleFunctions, IGetNodeParameterOptions, IHookFunctions, IHttpRequestOptions, ILoadOptionsFunctions, INode, INodeExecutionData, INodeType, IOAuth2Options, IPairedItemData, IPollFunctions, IRunExecutionData, ITaskDataConnections, ITriggerFunctions, IWebhookData, IWebhookDescription, IWebhookFunctions, IWorkflowDataProxyAdditionalKeys, IWorkflowExecuteAdditionalData, NodeExecutionWithMetadata, NodeParameterValueType, Workflow, WorkflowActivateMode, WorkflowExecuteMode } from 'n8n-workflow';
|
|
5
5
|
import type { OptionsWithUri, OptionsWithUrl } from 'request';
|
|
6
6
|
import type { RequestPromiseOptions } from 'request-promise-native';
|
|
7
7
|
import { Readable } from 'stream';
|
|
8
|
+
import type { BinaryData } from './BinaryData/types';
|
|
8
9
|
export declare function parseIncomingMessage(message: IncomingMessage): void;
|
|
9
10
|
export declare function proxyRequestToAxios(workflow: Workflow | undefined, additionalData: IWorkflowExecuteAdditionalData | undefined, node: INode | undefined, uriOrObject: string | object, options?: object): Promise<any>;
|
|
10
11
|
export declare function getBinaryPath(binaryDataId: string): string;
|
|
11
|
-
export declare function getBinaryMetadata(binaryDataId: string): Promise<
|
|
12
|
-
export declare function getBinaryStream(binaryDataId: string, chunkSize?: number): Readable
|
|
12
|
+
export declare function getBinaryMetadata(binaryDataId: string): Promise<BinaryData.Metadata>;
|
|
13
|
+
export declare function getBinaryStream(binaryDataId: string, chunkSize?: number): Promise<Readable>;
|
|
13
14
|
export declare function assertBinaryData(inputData: ITaskDataConnections, node: INode, itemIndex: number, propertyName: string, inputIndex: number): IBinaryData;
|
|
14
15
|
export declare function getBinaryDataBuffer(inputData: ITaskDataConnections, itemIndex: number, propertyName: string, inputIndex: number): Promise<Buffer>;
|
|
15
|
-
export declare function setBinaryDataBuffer(
|
|
16
|
-
export declare function copyBinaryFile(executionId: string, filePath: string, fileName: string, mimeType?: string): Promise<IBinaryData>;
|
|
16
|
+
export declare function setBinaryDataBuffer(binaryData: IBinaryData, bufferOrStream: Buffer | Readable, workflowId: string, executionId: string): Promise<IBinaryData>;
|
|
17
|
+
export declare function copyBinaryFile(workflowId: string, executionId: string, filePath: string, fileName: string, mimeType?: string): Promise<IBinaryData>;
|
|
17
18
|
export declare function requestOAuth2(this: IAllExecuteFunctions, credentialsType: string, requestOptions: OptionsWithUri | RequestPromiseOptions | IHttpRequestOptions, node: INode, additionalData: IWorkflowExecuteAdditionalData, oAuth2Options?: IOAuth2Options, isN8nRequest?: boolean): Promise<any>;
|
|
18
19
|
export declare function requestOAuth1(this: IAllExecuteFunctions, credentialsType: string, requestOptions: OptionsWithUrl | OptionsWithUri | RequestPromiseOptions | IHttpRequestOptions, isN8nRequest?: boolean): Promise<any>;
|
|
19
20
|
export declare function httpRequestWithAuthentication(this: IAllExecuteFunctions, credentialsType: string, requestOptions: IHttpRequestOptions, workflow: Workflow, node: INode, additionalData: IWorkflowExecuteAdditionalData, additionalCredentialOptions?: IAdditionalCredentialOptions): Promise<any>;
|