@vertesia/workflow 1.5.0-dev.20260717.131047Z → 1.5.0-dev.20260722.120446Z

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 (43) hide show
  1. package/lib/activities/generateDocumentProperties.d.ts +54 -13
  2. package/lib/activities/generateDocumentProperties.d.ts.map +1 -1
  3. package/lib/activities/generateDocumentProperties.js +109 -34
  4. package/lib/activities/generateDocumentProperties.js.map +1 -1
  5. package/lib/activities/generateOrAssignContentType.d.ts +6 -16
  6. package/lib/activities/generateOrAssignContentType.d.ts.map +1 -1
  7. package/lib/activities/generateOrAssignContentType.js +70 -19
  8. package/lib/activities/generateOrAssignContentType.js.map +1 -1
  9. package/lib/activities/media/exec.d.ts +60 -0
  10. package/lib/activities/media/exec.d.ts.map +1 -0
  11. package/lib/activities/media/exec.js +212 -0
  12. package/lib/activities/media/exec.js.map +1 -0
  13. package/lib/activities/media/prepareAudio.d.ts.map +1 -1
  14. package/lib/activities/media/prepareAudio.js +7 -6
  15. package/lib/activities/media/prepareAudio.js.map +1 -1
  16. package/lib/activities/media/prepareVideo.d.ts +5 -0
  17. package/lib/activities/media/prepareVideo.d.ts.map +1 -1
  18. package/lib/activities/media/prepareVideo.js +37 -13
  19. package/lib/activities/media/prepareVideo.js.map +1 -1
  20. package/lib/activities/media/probeMediaStreams.d.ts.map +1 -1
  21. package/lib/activities/media/probeMediaStreams.js +7 -6
  22. package/lib/activities/media/probeMediaStreams.js.map +1 -1
  23. package/lib/activities/renditions/generateVideoRendition.d.ts.map +1 -1
  24. package/lib/activities/renditions/generateVideoRendition.js +7 -5
  25. package/lib/activities/renditions/generateVideoRendition.js.map +1 -1
  26. package/lib/dsl/dsl-workflow.js +3 -0
  27. package/lib/dsl/dsl-workflow.js.map +1 -1
  28. package/lib/workflows-bundle.js +16277 -6846
  29. package/package.json +9 -9
  30. package/src/activities/generateDocumentProperties.test.ts +642 -0
  31. package/src/activities/generateDocumentProperties.ts +187 -43
  32. package/src/activities/generateOrAssignContentType.test.ts +196 -0
  33. package/src/activities/generateOrAssignContentType.ts +115 -30
  34. package/src/activities/media/exec.test.ts +194 -0
  35. package/src/activities/media/exec.ts +265 -0
  36. package/src/activities/media/prepareAudio.ts +12 -7
  37. package/src/activities/media/prepareVideo.test.ts +27 -0
  38. package/src/activities/media/prepareVideo.ts +54 -18
  39. package/src/activities/media/probeMediaStreams.test.ts +7 -8
  40. package/src/activities/media/probeMediaStreams.ts +11 -7
  41. package/src/activities/renditions/generateVideoRendition.ts +12 -6
  42. package/src/dsl/dsl-workflow.test.ts +4 -0
  43. package/src/dsl/dsl-workflow.ts +3 -0
@@ -1,16 +1,18 @@
1
- import { execFile as execFileCallback } from 'node:child_process';
2
1
  import fs from 'node:fs';
3
2
  import os from 'node:os';
4
3
  import path from 'node:path';
5
- import { promisify } from 'node:util';
6
4
  import { log } from '@temporalio/activity';
7
5
  import type { DSLActivityExecutionPayload, DSLActivitySpec } from '@vertesia/common';
8
6
  import { setupActivity } from '../../dsl/setup/ActivityContext.js';
9
7
  import { DocumentNotFoundError, WorkflowParamNotFoundError } from '../../errors.js';
10
8
  import { saveBlobToTempFile } from '../../utils/blobs.js';
11
9
  import { type ImageRenditionParams, uploadRenditionPages } from '../../utils/renditions.js';
12
-
13
- const execFileAsync = promisify(execFileCallback);
10
+ import {
11
+ execActivityFile,
12
+ execActivityFileWithProgress,
13
+ initializeActivityCommandDeadline,
14
+ rethrowIfActivityStopped,
15
+ } from '../media/exec.js';
14
16
 
15
17
  interface GenerateVideoRenditionParams extends ImageRenditionParams {}
16
18
 
@@ -32,7 +34,7 @@ interface VideoMetadata {
32
34
  async function getVideoMetadata(videoPath: string): Promise<VideoMetadata> {
33
35
  try {
34
36
  const args = ['-v', 'quiet', '-print_format', 'json', '-show_format', '-show_streams', videoPath];
35
- const { stdout } = await execFileAsync('ffprobe', args);
37
+ const { stdout } = await execActivityFile('ffprobe', args);
36
38
  const metadata = JSON.parse(stdout.toString()) as {
37
39
  streams?: Array<{ codec_type?: string; width?: number; height?: number }>;
38
40
  format?: { duration?: string };
@@ -45,6 +47,7 @@ async function getVideoMetadata(videoPath: string): Promise<VideoMetadata> {
45
47
 
46
48
  return { duration, width, height };
47
49
  } catch (error) {
50
+ rethrowIfActivityStopped(error);
48
51
  log.error(`Failed to get video metadata: ${error instanceof Error ? error.message : 'Unknown error'}`);
49
52
  throw new Error(`Failed to probe video metadata: ${error instanceof Error ? error.message : 'Unknown error'}`);
50
53
  }
@@ -79,7 +82,7 @@ async function generateThumbnail(
79
82
  ];
80
83
  log.info(`Generating thumbnail at ${timestamp}s`, { command: 'ffmpeg', args: command });
81
84
  try {
82
- const { stderr } = await execFileAsync('ffmpeg', command);
85
+ const { stderr } = await execActivityFileWithProgress('ffmpeg', command);
83
86
  const stderrText = stderr.toString();
84
87
 
85
88
  // Log any warnings from ffmpeg
@@ -96,6 +99,7 @@ async function generateThumbnail(
96
99
  return undefined;
97
100
  }
98
101
  } catch (error) {
102
+ rethrowIfActivityStopped(error);
99
103
  log.error(
100
104
  `Failed to generate thumbnail at ${timestamp}s: ${error instanceof Error ? error.message : 'Unknown error'}`,
101
105
  );
@@ -104,6 +108,7 @@ async function generateThumbnail(
104
108
  }
105
109
 
106
110
  export async function generateVideoRendition(payload: DSLActivityExecutionPayload<GenerateVideoRenditionParams>) {
111
+ initializeActivityCommandDeadline();
107
112
  const { client, objectId, params: originParams } = await setupActivity<GenerateVideoRenditionParams>(payload);
108
113
 
109
114
  // Fix: Use maxHeightWidth if max_hw is not provided
@@ -209,6 +214,7 @@ export async function generateVideoRendition(payload: DSLActivityExecutionPayloa
209
214
  requestedCount: thumbnailCount,
210
215
  });
211
216
  } catch (error) {
217
+ rethrowIfActivityStopped(error);
212
218
  log.error(`Error generating thumbnails for video: ${error instanceof Error ? error.message : 'Unknown error'}`);
213
219
  throw new Error(`Failed to generate thumbnails for video: ${objectId}`);
214
220
  } finally {
@@ -8,6 +8,7 @@ describe('Workflow DSL', () => {
8
8
  {},
9
9
  {
10
10
  startToCloseTimeout: 1000,
11
+ heartbeatTimeout: 600,
11
12
  scheduleToCloseTimeout: 2000,
12
13
  scheduleToStartTimeout: 3000,
13
14
  retry: {
@@ -21,6 +22,7 @@ describe('Workflow DSL', () => {
21
22
  ),
22
23
  ).toEqual({
23
24
  startToCloseTimeout: 1000,
25
+ heartbeatTimeout: 600,
24
26
  scheduleToCloseTimeout: 2000,
25
27
  scheduleToStartTimeout: 3000,
26
28
  retry: {
@@ -38,6 +40,7 @@ describe('Workflow DSL', () => {
38
40
  computeActivityOptions(
39
41
  {
40
42
  startToCloseTimeout: 100,
43
+ heartbeatTimeout: 600,
41
44
  },
42
45
  {
43
46
  startToCloseTimeout: 1000,
@@ -54,6 +57,7 @@ describe('Workflow DSL', () => {
54
57
  ),
55
58
  ).toEqual({
56
59
  startToCloseTimeout: `100ms`, // custom value
60
+ heartbeatTimeout: '600ms',
57
61
  scheduleToCloseTimeout: 2000,
58
62
  scheduleToStartTimeout: 3000,
59
63
  retry: {
@@ -603,6 +603,9 @@ function convertDSLActivityOptions(options?: DSLActivityOptions): ActivityOption
603
603
  if (options.startToCloseTimeout) {
604
604
  result.startToCloseTimeout = ms(options.startToCloseTimeout as StringValue);
605
605
  }
606
+ if (options.heartbeatTimeout) {
607
+ result.heartbeatTimeout = ms(options.heartbeatTimeout as StringValue);
608
+ }
606
609
  if (options.scheduleToCloseTimeout) {
607
610
  result.scheduleToCloseTimeout = ms(options.scheduleToCloseTimeout as StringValue);
608
611
  }