streamby-core 0.37.0 → 0.39.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.
Files changed (50) hide show
  1. package/CHANGELOG.md +75 -0
  2. package/LICENSE +661 -661
  3. package/README.md +573 -512
  4. package/dist/adapters/database/connectionManager.js +124 -124
  5. package/dist/adapters/database/sql.js +1 -1
  6. package/dist/adapters/storage/s3.d.ts +3 -2
  7. package/dist/adapters/storage/s3.js +18 -5
  8. package/dist/mcp/server.js +12 -0
  9. package/dist/mcp/tools.d.ts +2 -0
  10. package/dist/mcp/tools.js +107 -14
  11. package/dist/mcp/workflowNodes.d.ts +24 -0
  12. package/dist/mcp/workflowNodes.js +48 -0
  13. package/dist/middleware/createRouter.js +2 -0
  14. package/dist/middleware/routes/apiConnection.d.ts +3 -0
  15. package/dist/middleware/routes/apiConnection.js +100 -0
  16. package/dist/middleware/routes/credential.d.ts +3 -0
  17. package/dist/middleware/routes/credential.js +80 -0
  18. package/dist/middleware/routes/deliverable.d.ts +3 -0
  19. package/dist/middleware/routes/deliverable.js +131 -0
  20. package/dist/middleware/routes/export.js +18 -0
  21. package/dist/middleware/routes/production.js +60 -67
  22. package/dist/middleware/routes/project.js +39 -11
  23. package/dist/middleware/routes/storage.js +115 -24
  24. package/dist/models/Model.js +9 -9
  25. package/dist/services/apiConnection.d.ts +18 -0
  26. package/dist/services/apiConnection.js +65 -0
  27. package/dist/services/apiTokenPermissions.js +7 -3
  28. package/dist/services/assetVersions.d.ts +48 -0
  29. package/dist/services/assetVersions.js +84 -0
  30. package/dist/services/credential.d.ts +8 -0
  31. package/dist/services/credential.js +70 -0
  32. package/dist/services/deliverables.d.ts +26 -0
  33. package/dist/services/deliverables.js +55 -0
  34. package/dist/services/mediaProcessor.js +3 -1
  35. package/dist/services/pipeline.d.ts +2 -0
  36. package/dist/services/pipeline.js +292 -0
  37. package/dist/services/production.d.ts +2 -0
  38. package/dist/services/production.js +13 -0
  39. package/dist/services/productionFields.d.ts +16 -0
  40. package/dist/services/productionFields.js +80 -0
  41. package/dist/services/signedUrls.d.ts +6 -0
  42. package/dist/services/signedUrls.js +9 -0
  43. package/dist/types/index.d.ts +7 -2
  44. package/dist/utils/crypto.d.ts +3 -0
  45. package/dist/utils/crypto.js +32 -0
  46. package/dist/utils/nosqlDb.d.ts +2 -0
  47. package/dist/utils/nosqlDb.js +11 -0
  48. package/dist/utils/sanitize.d.ts +1 -0
  49. package/dist/utils/sanitize.js +14 -0
  50. package/package.json +1 -1
@@ -0,0 +1,65 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.addApiConnection = addApiConnection;
4
+ exports.updateApiConnection = updateApiConnection;
5
+ exports.deleteApiConnection = deleteApiConnection;
6
+ const mongodb_1 = require("mongodb");
7
+ const manager_1 = require("../models/manager");
8
+ async function addApiConnection(config, projectId, data) {
9
+ const ProjectModel = (0, manager_1.getModel)('projects');
10
+ const project = await ProjectModel.findOne({ _id: projectId });
11
+ if (!project) {
12
+ throw new Error('Project not found.');
13
+ }
14
+ const connection = {
15
+ id: new mongodb_1.ObjectId().toHexString(),
16
+ name: data.name,
17
+ prefix: data.prefix,
18
+ apiUrl: data.apiUrl,
19
+ method: data.method,
20
+ projectId,
21
+ createdAt: new Date(),
22
+ ...(data.description !== undefined && { description: data.description }),
23
+ ...(data.credentialId !== undefined && { credentialId: data.credentialId }),
24
+ };
25
+ const updatedProject = await ProjectModel.update({ _id: projectId }, { $push: { apiConnections: connection } });
26
+ if (!updatedProject) {
27
+ throw new Error('Failed to add API connection to project.');
28
+ }
29
+ return connection;
30
+ }
31
+ async function updateApiConnection(config, projectId, connectionId, data) {
32
+ const ProjectModel = (0, manager_1.getModel)('projects');
33
+ const project = await ProjectModel.findOne({ _id: projectId });
34
+ if (!project)
35
+ throw new Error('Project not found.');
36
+ const connections = project.apiConnections ?? [];
37
+ const index = connections.findIndex((c) => c.id === connectionId);
38
+ if (index === -1)
39
+ throw new Error('API connection not found.');
40
+ const updated = {
41
+ ...connections[index],
42
+ ...(data.name !== undefined && { name: data.name }),
43
+ ...(data.apiUrl !== undefined && { apiUrl: data.apiUrl }),
44
+ ...(data.method !== undefined && { method: data.method }),
45
+ ...(data.prefix !== undefined && { prefix: data.prefix }),
46
+ ...(data.description !== undefined && { description: data.description }),
47
+ ...(data.credentialId !== undefined && { credentialId: data.credentialId }),
48
+ };
49
+ connections[index] = updated;
50
+ const result = await ProjectModel.update({ _id: projectId }, { $set: { apiConnections: connections } });
51
+ if (!result)
52
+ throw new Error('Failed to update API connection.');
53
+ return updated;
54
+ }
55
+ async function deleteApiConnection(config, projectId, connectionId) {
56
+ const ProjectModel = (0, manager_1.getModel)('projects');
57
+ const project = await ProjectModel.findOne({ _id: projectId });
58
+ if (!project) {
59
+ throw new Error('Project not found.');
60
+ }
61
+ const updatedProject = await ProjectModel.update({ _id: projectId }, { $pull: { apiConnections: { id: connectionId } } });
62
+ if (!updatedProject) {
63
+ throw new Error('Failed to delete API connection from project.');
64
+ }
65
+ }
@@ -39,7 +39,7 @@ const RULES = [
39
39
  rule('read', '^/users/search', 'members:manage'),
40
40
  rule('read', '^/jobs/[^/]+', 'jobs:read'),
41
41
  // The project itself and its settings.
42
- rule('read', `${P}(/preview)?`, 'project:read'),
42
+ rule('read', `${P}(/preview|/origins|/integrations)?`, 'project:read'),
43
43
  rule(['PATCH'], P, 'project:update'),
44
44
  rule('delete', P, 'project:delete'),
45
45
  rule(['PATCH'], `${P}/(archive|unarchive)`, 'project:update', { userTokenOnly: true }),
@@ -62,11 +62,15 @@ const RULES = [
62
62
  rule('read', `${P}/connections/storage/[^/]+/(files|folders)(/.+)?`, 'assets:read'),
63
63
  rule(['POST', 'PATCH'], `${P}/connections/storage/[^/]+/(files|folders)(/.+)?`, 'assets:write'),
64
64
  rule('delete', `${P}/connections/storage/[^/]+/(files|folders)/[^/]+`, 'assets:delete'),
65
- rule('read', `${P}/assets/[^/]+/(metadata|versions|qc-report|dependency-graph)`, 'assets:read'),
65
+ rule('read', `${P}/assets/[^/]+/(metadata|versions|qc-report|dependency-graph|download-url)`, 'assets:read'),
66
66
  rule(['PATCH'], `${P}/assets/[^/]+/metadata`, 'assets:write'),
67
67
  rule(['POST'], `${P}/assets/[^/]+/qc-report`, 'assets:write'),
68
68
  rule('read', `${P}/(reviews(/[^/]+)?|assets/[^/]+/versions/[^/]+/annotations)`, 'assets:read'),
69
69
  rule(['POST', 'PATCH'], `${P}/(reviews(/[^/]+/decision)?|assets/[^/]+/versions/[^/]+/annotations(/[^/]+/resolve)?)`, 'assets:write'),
70
+ // Deliverables: an asset (or a version) delivered for a shot or an export.
71
+ rule('read', `${P}/deliverables`, 'assets:read'),
72
+ rule(['POST'], `${P}/deliverables`, 'assets:write'),
73
+ rule('delete', `${P}/deliverables/[^/]+`, 'assets:write'),
70
74
  // Rights.
71
75
  rule('read', `${P}/assets/[^/]+/rights`, 'rights:read'),
72
76
  rule(['PUT'], `${P}/assets/[^/]+/rights`, 'rights:write'),
@@ -84,7 +88,7 @@ const RULES = [
84
88
  rule(['POST'], `${P}/pipelines`, 'workflow:write'),
85
89
  rule(['PATCH', 'DELETE'], `${P}/pipelines/[^/]+`, 'workflow:write'),
86
90
  // Exports.
87
- rule('read', `${P}/exports/[^/]+`, 'exports:read'),
91
+ rule('read', `${P}/exports(/[^/]+)?`, 'exports:read'),
88
92
  rule(['POST'], `${P}/exports`, 'exports:write'),
89
93
  rule(['PATCH', 'DELETE'], `${P}/exports/[^/]+`, 'exports:write'),
90
94
  // Jobs: transcoding, rendering, AI, publishing a deliverable.
@@ -0,0 +1,48 @@
1
+ export interface AssetVersion {
2
+ versionId: string;
3
+ assetId: string;
4
+ projectId: string;
5
+ version: number;
6
+ storageKey: string;
7
+ contentType: string | null;
8
+ fileName: string | null;
9
+ createdBy: string | null;
10
+ createdAt: Date;
11
+ }
12
+ export declare const versionsCollection: () => import("mongodb").Collection<import("bson").Document> | null;
13
+ /** The key an asset's version `n` is archived in, next to the asset's own key. */
14
+ export declare const archivedVersionKey: (assetKey: string, version: number) => string;
15
+ /** Records the first version of an asset just made (or one made before versions were kept). */
16
+ export declare function recordFirstVersion(file: {
17
+ fileId: string;
18
+ projectId: string;
19
+ storageKey: string;
20
+ contentType?: string;
21
+ displayName?: string;
22
+ uploadedBy?: string;
23
+ createdAt?: Date;
24
+ }): Promise<void>;
25
+ /**
26
+ * Makes room for a new version of an asset, to be uploaded to its own key: its current version
27
+ * is copied to an archive key first (`copyFile`) and recorded there. If the copy fails nothing
28
+ * changes, and it throws: the current version is never lost.
29
+ */
30
+ export declare function archiveCurrentVersion(file: {
31
+ fileId: string;
32
+ projectId: string;
33
+ storageKey: string;
34
+ contentType?: string;
35
+ displayName?: string;
36
+ uploadedBy?: string;
37
+ createdAt?: Date;
38
+ }, upload: {
39
+ fileName: string;
40
+ contentType: string;
41
+ userId: string;
42
+ }, copyFile: (from: string, to: string) => Promise<void>): Promise<AssetVersion>;
43
+ /** One of an asset's versions, or null. */
44
+ export declare function findVersion(projectId: string, assetId: string, versionId: string): Promise<AssetVersion | null>;
45
+ /** Every key an asset's versions are stored in (its current one included). */
46
+ export declare function versionStorageKeys(projectId: string, assetId: string, currentKey?: string): Promise<string[]>;
47
+ /** Forgets an asset's versions (once their files are deleted). */
48
+ export declare function deleteVersions(projectId: string, assetId: string): Promise<void>;
@@ -0,0 +1,84 @@
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.archivedVersionKey = exports.versionsCollection = void 0;
7
+ exports.recordFirstVersion = recordFirstVersion;
8
+ exports.archiveCurrentVersion = archiveCurrentVersion;
9
+ exports.findVersion = findVersion;
10
+ exports.versionStorageKeys = versionStorageKeys;
11
+ exports.deleteVersions = deleteVersions;
12
+ const crypto_1 = __importDefault(require("crypto"));
13
+ const mongodb_1 = require("mongodb");
14
+ const nosqlDb_1 = require("../utils/nosqlDb");
15
+ const versionsCollection = () => (0, nosqlDb_1.nosqlDb)()?.collection('asset_versions') ?? null;
16
+ exports.versionsCollection = versionsCollection;
17
+ /** The key an asset's version `n` is archived in, next to the asset's own key. */
18
+ const archivedVersionKey = (assetKey, version) => {
19
+ const extension = /(\.[^./]*)$/.exec(assetKey)?.[1] ?? '';
20
+ return `${assetKey.slice(0, assetKey.length - extension.length)}.v${version}${extension}`;
21
+ };
22
+ exports.archivedVersionKey = archivedVersionKey;
23
+ /** Records the first version of an asset just made (or one made before versions were kept). */
24
+ async function recordFirstVersion(file) {
25
+ const col = (0, exports.versionsCollection)();
26
+ if (!col)
27
+ return;
28
+ if (await col.findOne({ assetId: file.fileId, projectId: file.projectId }))
29
+ return;
30
+ await col.insertOne({
31
+ _id: new mongodb_1.ObjectId(),
32
+ versionId: crypto_1.default.randomUUID(),
33
+ assetId: file.fileId,
34
+ projectId: file.projectId,
35
+ version: 1,
36
+ storageKey: file.storageKey,
37
+ contentType: file.contentType ?? null,
38
+ fileName: file.displayName ?? null,
39
+ createdBy: file.uploadedBy ?? null,
40
+ createdAt: file.createdAt ?? new Date(),
41
+ });
42
+ }
43
+ /**
44
+ * Makes room for a new version of an asset, to be uploaded to its own key: its current version
45
+ * is copied to an archive key first (`copyFile`) and recorded there. If the copy fails nothing
46
+ * changes, and it throws: the current version is never lost.
47
+ */
48
+ async function archiveCurrentVersion(file, upload, copyFile) {
49
+ const col = (0, exports.versionsCollection)();
50
+ if (!col)
51
+ throw new Error('Database not available');
52
+ await recordFirstVersion(file);
53
+ const [current] = await col.find({ assetId: file.fileId, projectId: file.projectId }).sort({ version: -1 }).limit(1).toArray();
54
+ const currentVersion = current?.version ?? 1;
55
+ const archiveKey = (0, exports.archivedVersionKey)(file.storageKey, currentVersion);
56
+ await copyFile(file.storageKey, archiveKey);
57
+ await col.updateOne({ assetId: file.fileId, projectId: file.projectId, version: currentVersion }, { $set: { storageKey: archiveKey } });
58
+ const record = {
59
+ versionId: crypto_1.default.randomUUID(),
60
+ assetId: file.fileId,
61
+ projectId: file.projectId,
62
+ version: currentVersion + 1,
63
+ storageKey: file.storageKey,
64
+ contentType: upload.contentType,
65
+ fileName: upload.fileName,
66
+ createdBy: upload.userId,
67
+ createdAt: new Date(),
68
+ };
69
+ await col.insertOne({ _id: new mongodb_1.ObjectId(), ...record });
70
+ return record;
71
+ }
72
+ /** One of an asset's versions, or null. */
73
+ async function findVersion(projectId, assetId, versionId) {
74
+ return (await (0, exports.versionsCollection)()?.findOne({ projectId, assetId, versionId })) ?? null;
75
+ }
76
+ /** Every key an asset's versions are stored in (its current one included). */
77
+ async function versionStorageKeys(projectId, assetId, currentKey) {
78
+ const versions = ((await (0, exports.versionsCollection)()?.find({ projectId, assetId }).toArray()) ?? []);
79
+ return [...new Set([...(currentKey ? [currentKey] : []), ...versions.map(v => v.storageKey)])];
80
+ }
81
+ /** Forgets an asset's versions (once their files are deleted). */
82
+ async function deleteVersions(projectId, assetId) {
83
+ await (0, exports.versionsCollection)()?.deleteMany({ projectId, assetId });
84
+ }
@@ -0,0 +1,8 @@
1
+ import { StreamByConfig, Credential, ProjectInfo } from '../types';
2
+ export declare function addCredential(config: StreamByConfig, projectId: string, newCredential: Omit<Credential, 'encryptedValue'> & {
3
+ value: string;
4
+ }): Promise<ProjectInfo>;
5
+ export declare function updateCredential(config: StreamByConfig, projectId: string, credentialId: string, updates: Partial<Omit<Credential, 'encryptedValue'> & {
6
+ value: string;
7
+ }>): Promise<ProjectInfo>;
8
+ export declare function deleteCredential(config: StreamByConfig, projectId: string, credentialId: string): Promise<ProjectInfo>;
@@ -0,0 +1,70 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.addCredential = addCredential;
4
+ exports.updateCredential = updateCredential;
5
+ exports.deleteCredential = deleteCredential;
6
+ const manager_1 = require("../models/manager");
7
+ const encryption_1 = require("../utils/encryption");
8
+ const mongodb_1 = require("mongodb");
9
+ async function addCredential(config, projectId, newCredential) {
10
+ if (!(0, encryption_1.isEncryptionKeySet)()) {
11
+ throw new Error('Encryption key is not set. Cannot add credentials.');
12
+ }
13
+ const ProjectModel = (0, manager_1.getModel)('projects');
14
+ const project = await ProjectModel.findOne({ _id: projectId });
15
+ if (!project) {
16
+ throw new Error('Project not found.');
17
+ }
18
+ const encryptedValue = (0, encryption_1.encrypt)(newCredential.value);
19
+ const credentialToSave = {
20
+ id: newCredential.id || new mongodb_1.ObjectId().toHexString(), // Generate ID if not provided
21
+ key: newCredential.key,
22
+ encryptedValue: encryptedValue,
23
+ };
24
+ const updatedProject = await ProjectModel.update({ _id: projectId }, { $push: { credentials: credentialToSave } });
25
+ if (!updatedProject) {
26
+ throw new Error('Failed to add credential to project.');
27
+ }
28
+ return updatedProject;
29
+ }
30
+ async function updateCredential(config, projectId, credentialId, updates) {
31
+ if (!(0, encryption_1.isEncryptionKeySet)()) {
32
+ throw new Error('Encryption key is not set. Cannot update credentials.');
33
+ }
34
+ const ProjectModel = (0, manager_1.getModel)('projects');
35
+ const project = await ProjectModel.findOne({ _id: projectId });
36
+ if (!project) {
37
+ throw new Error('Project not found.');
38
+ }
39
+ const credentialIndex = project.credentials?.findIndex(cred => cred.id === credentialId);
40
+ if (credentialIndex === undefined || credentialIndex === -1) {
41
+ throw new Error(`Credential with ID ${credentialId} not found.`);
42
+ }
43
+ const currentCredential = project.credentials[credentialIndex];
44
+ let encryptedValue = currentCredential.encryptedValue;
45
+ if (updates.value !== undefined) {
46
+ encryptedValue = (0, encryption_1.encrypt)(updates.value);
47
+ }
48
+ const updatedCredential = {
49
+ ...currentCredential,
50
+ key: updates.key || currentCredential.key,
51
+ encryptedValue: encryptedValue,
52
+ };
53
+ const updatedProject = await ProjectModel.update({ _id: projectId, 'credentials.id': credentialId }, { $set: { 'credentials.$': updatedCredential } });
54
+ if (!updatedProject) {
55
+ throw new Error('Failed to update credential in project.');
56
+ }
57
+ return updatedProject;
58
+ }
59
+ async function deleteCredential(config, projectId, credentialId) {
60
+ const ProjectModel = (0, manager_1.getModel)('projects');
61
+ const project = await ProjectModel.findOne({ _id: projectId });
62
+ if (!project) {
63
+ throw new Error('Project not found.');
64
+ }
65
+ const updatedProject = await ProjectModel.update({ _id: projectId }, { $pull: { credentials: { id: credentialId } } });
66
+ if (!updatedProject) {
67
+ throw new Error('Failed to delete credential from project.');
68
+ }
69
+ return updatedProject;
70
+ }
@@ -0,0 +1,26 @@
1
+ export interface Deliverable {
2
+ id: string;
3
+ projectId: string;
4
+ assetId: string;
5
+ versionId: string | null;
6
+ shotId: string | null;
7
+ exportId: string | null;
8
+ note: string | null;
9
+ createdBy: string;
10
+ createdAt: Date;
11
+ }
12
+ export declare const deliverablesCollection: () => import("mongodb").Collection<import("bson").Document> | null;
13
+ export declare function createDeliverable(fields: Omit<Deliverable, 'id' | 'createdAt'>): Promise<Deliverable>;
14
+ /** A project's deliverables, of one shot or export if given, newest first. */
15
+ export declare function listDeliverables(projectId: string, of?: {
16
+ shotId?: string;
17
+ exportId?: string;
18
+ }): Promise<Deliverable[]>;
19
+ /** Removes a deliverable (never its asset). Whether there was one. */
20
+ export declare function deleteDeliverable(projectId: string, id: string): Promise<boolean>;
21
+ /** Forgets the deliverables of what's gone: an asset, shots, or an export. */
22
+ export declare function deleteDeliverablesOf(projectId: string, of: {
23
+ assetId?: string;
24
+ shotIds?: string[];
25
+ exportId?: string;
26
+ }): Promise<void>;
@@ -0,0 +1,55 @@
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.deliverablesCollection = void 0;
7
+ exports.createDeliverable = createDeliverable;
8
+ exports.listDeliverables = listDeliverables;
9
+ exports.deleteDeliverable = deleteDeliverable;
10
+ exports.deleteDeliverablesOf = deleteDeliverablesOf;
11
+ const crypto_1 = __importDefault(require("crypto"));
12
+ const mongodb_1 = require("mongodb");
13
+ const nosqlDb_1 = require("../utils/nosqlDb");
14
+ const deliverablesCollection = () => (0, nosqlDb_1.nosqlDb)()?.collection('deliverables') ?? null;
15
+ exports.deliverablesCollection = deliverablesCollection;
16
+ const strip = ({ _id, ...deliverable }) => deliverable;
17
+ async function createDeliverable(fields) {
18
+ const col = (0, exports.deliverablesCollection)();
19
+ if (!col)
20
+ throw new Error('Database not available');
21
+ const deliverable = { id: crypto_1.default.randomUUID(), ...fields, createdAt: new Date() };
22
+ await col.insertOne({ _id: new mongodb_1.ObjectId(), ...deliverable });
23
+ return deliverable;
24
+ }
25
+ /** A project's deliverables, of one shot or export if given, newest first. */
26
+ async function listDeliverables(projectId, of = {}) {
27
+ const col = (0, exports.deliverablesCollection)();
28
+ if (!col)
29
+ throw new Error('Database not available');
30
+ const filter = { projectId };
31
+ if (of.shotId)
32
+ filter.shotId = of.shotId;
33
+ if (of.exportId)
34
+ filter.exportId = of.exportId;
35
+ return (await col.find(filter).sort({ createdAt: -1 }).toArray()).map(strip);
36
+ }
37
+ /** Removes a deliverable (never its asset). Whether there was one. */
38
+ async function deleteDeliverable(projectId, id) {
39
+ const col = (0, exports.deliverablesCollection)();
40
+ if (!col)
41
+ throw new Error('Database not available');
42
+ return (await col.deleteOne({ projectId, id })).deletedCount > 0;
43
+ }
44
+ /** Forgets the deliverables of what's gone: an asset, shots, or an export. */
45
+ async function deleteDeliverablesOf(projectId, of) {
46
+ const col = (0, exports.deliverablesCollection)();
47
+ if (!col)
48
+ return;
49
+ if (of.assetId)
50
+ await col.deleteMany({ projectId, assetId: of.assetId });
51
+ if (of.shotIds?.length)
52
+ await col.deleteMany({ projectId, shotId: { $in: of.shotIds } });
53
+ if (of.exportId)
54
+ await col.deleteMany({ projectId, exportId: of.exportId });
55
+ }
@@ -69,7 +69,9 @@ async function runIngestJob(jobId, fileId, projectId) {
69
69
  }
70
70
  (0, jobQueue_1.updateJob)(jobId, { stage: 'creating-version', progress: 70 });
71
71
  const versionsCol = getVersionsCollection();
72
- if (versionsCol) {
72
+ // Its upload already recorded the version it's in; only an asset from before versions
73
+ // were kept gets one here.
74
+ if (versionsCol && !(await versionsCol.findOne({ assetId: fileId, projectId, storageKey: fileDoc.storageKey }))) {
73
75
  const existing = await versionsCol.countDocuments({ assetId: fileId, projectId });
74
76
  await versionsCol.insertOne({
75
77
  _id: new mongodb_1.ObjectId(),
@@ -0,0 +1,2 @@
1
+ import { NodeSchema, StreamByConfig } from '../types';
2
+ export declare function executePipeline(nodeSchema: NodeSchema, project: any, config: StreamByConfig): Promise<any>;